summaryrefslogtreecommitdiff
path: root/Master/xemtex/gslib
diff options
context:
space:
mode:
Diffstat (limited to 'Master/xemtex/gslib')
-rw-r--r--Master/xemtex/gslib/CIDFnmap157
-rw-r--r--Master/xemtex/gslib/CIDFnmap.ARP34
-rw-r--r--Master/xemtex/gslib/CIDFnmap.Bae31
-rw-r--r--Master/xemtex/gslib/CIDFnmap.CJK289
-rw-r--r--Master/xemtex/gslib/CIDFnmap.Koc50
-rw-r--r--Master/xemtex/gslib/CIDFnmap.Ore53
-rw-r--r--Master/xemtex/gslib/CIDFnmap.Sol54
-rw-r--r--Master/xemtex/gslib/CIDFnmap.Win79
-rw-r--r--Master/xemtex/gslib/CIDFnmap.b526
-rw-r--r--Master/xemtex/gslib/CIDFnmap.gb24
-rw-r--r--Master/xemtex/gslib/CIDFnmap.ksx31
-rw-r--r--Master/xemtex/gslib/CIDFnmap.sj81
-rw-r--r--Master/xemtex/gslib/Fontmap3
-rw-r--r--Master/xemtex/gslib/Fontmap.ATB169
-rw-r--r--Master/xemtex/gslib/Fontmap.ATM186
-rw-r--r--Master/xemtex/gslib/Fontmap.GS404
-rw-r--r--Master/xemtex/gslib/Fontmap.OS2215
-rw-r--r--Master/xemtex/gslib/Fontmap.OSF163
-rw-r--r--Master/xemtex/gslib/Fontmap.SGI406
-rw-r--r--Master/xemtex/gslib/Fontmap.Sol487
-rw-r--r--Master/xemtex/gslib/Fontmap.Ult147
-rw-r--r--Master/xemtex/gslib/Fontmap.VMS424
-rw-r--r--Master/xemtex/gslib/Info-macos.plist14
-rw-r--r--Master/xemtex/gslib/acctest.ps100
-rw-r--r--Master/xemtex/gslib/addxchar.ps358
-rw-r--r--Master/xemtex/gslib/afmdiff.awk150
-rw-r--r--Master/xemtex/gslib/align.ps74
-rw-r--r--Master/xemtex/gslib/bdftops3
-rw-r--r--Master/xemtex/gslib/bdftops.bat5
-rwxr-xr-xMaster/xemtex/gslib/bdftops.cmd7
-rw-r--r--Master/xemtex/gslib/bdftops.ps796
-rw-r--r--Master/xemtex/gslib/bj8.rpd17
-rw-r--r--Master/xemtex/gslib/bj8gc12f.upp44
-rw-r--r--Master/xemtex/gslib/bj8hg12f.upp44
-rw-r--r--Master/xemtex/gslib/bj8oh06n.upp44
-rw-r--r--Master/xemtex/gslib/bj8pa06n.upp44
-rw-r--r--Master/xemtex/gslib/bj8pp12f.upp44
-rw-r--r--Master/xemtex/gslib/bj8ts06n.upp44
-rw-r--r--Master/xemtex/gslib/bjc610a0.upp44
-rw-r--r--Master/xemtex/gslib/bjc610a1.upp44
-rw-r--r--Master/xemtex/gslib/bjc610a2.upp44
-rw-r--r--Master/xemtex/gslib/bjc610a3.upp44
-rw-r--r--Master/xemtex/gslib/bjc610a4.upp45
-rw-r--r--Master/xemtex/gslib/bjc610a5.upp44
-rw-r--r--Master/xemtex/gslib/bjc610a6.upp44
-rw-r--r--Master/xemtex/gslib/bjc610a7.upp44
-rw-r--r--Master/xemtex/gslib/bjc610a8.upp44
-rw-r--r--Master/xemtex/gslib/bjc610b1.upp44
-rw-r--r--Master/xemtex/gslib/bjc610b2.upp44
-rw-r--r--Master/xemtex/gslib/bjc610b3.upp44
-rw-r--r--Master/xemtex/gslib/bjc610b4.upp45
-rw-r--r--Master/xemtex/gslib/bjc610b6.upp44
-rw-r--r--Master/xemtex/gslib/bjc610b7.upp44
-rw-r--r--Master/xemtex/gslib/bjc610b8.upp44
-rw-r--r--Master/xemtex/gslib/caption.ps57
-rw-r--r--Master/xemtex/gslib/cbjc600.ppd404
-rw-r--r--Master/xemtex/gslib/cbjc800.ppd389
-rw-r--r--Master/xemtex/gslib/cdj550.upp48
-rw-r--r--Master/xemtex/gslib/cdj690.upp52
-rw-r--r--Master/xemtex/gslib/cdj690ec.upp54
-rw-r--r--Master/xemtex/gslib/cid2code.ps161
-rw-r--r--Master/xemtex/gslib/decrypt.ps14
-rw-r--r--Master/xemtex/gslib/dnj750c.upp47
-rw-r--r--Master/xemtex/gslib/dnj750m.upp59
-rw-r--r--Master/xemtex/gslib/docie.ps219
-rw-r--r--Master/xemtex/gslib/dvipdf40
-rw-r--r--Master/xemtex/gslib/eps2eps20
-rw-r--r--Master/xemtex/gslib/eps2eps.bat26
-rwxr-xr-xMaster/xemtex/gslib/eps2eps.cmd36
-rw-r--r--Master/xemtex/gslib/errpage.ps363
-rw-r--r--Master/xemtex/gslib/fixmswrd.pl208
-rw-r--r--Master/xemtex/gslib/font2c3
-rw-r--r--Master/xemtex/gslib/font2c.bat5
-rwxr-xr-xMaster/xemtex/gslib/font2c.cmd7
-rw-r--r--Master/xemtex/gslib/font2c.ps676
-rw-r--r--Master/xemtex/gslib/font2pcl.ps604
-rw-r--r--Master/xemtex/gslib/gs_agl.ps1070
-rw-r--r--Master/xemtex/gslib/gs_btokn.ps321
-rw-r--r--Master/xemtex/gslib/gs_ccfnt.ps76
-rw-r--r--Master/xemtex/gslib/gs_ce_e.ps48
-rw-r--r--Master/xemtex/gslib/gs_cff.ps758
-rw-r--r--Master/xemtex/gslib/gs_cidcm.ps511
-rw-r--r--Master/xemtex/gslib/gs_cidfn.ps702
-rw-r--r--Master/xemtex/gslib/gs_cmap.ps524
-rw-r--r--Master/xemtex/gslib/gs_cmdl.ps181
-rw-r--r--Master/xemtex/gslib/gs_css_e.ps115
-rw-r--r--Master/xemtex/gslib/gs_dbt_e.ps60
-rw-r--r--Master/xemtex/gslib/gs_diskf.ps225
-rw-r--r--Master/xemtex/gslib/gs_dpnxt.ps113
-rw-r--r--Master/xemtex/gslib/gs_dps.ps203
-rw-r--r--Master/xemtex/gslib/gs_dps1.ps142
-rw-r--r--Master/xemtex/gslib/gs_dps2.ps217
-rw-r--r--Master/xemtex/gslib/gs_dscp.ps119
-rw-r--r--Master/xemtex/gslib/gs_epsf.ps243
-rw-r--r--Master/xemtex/gslib/gs_fform.ps93
-rw-r--r--Master/xemtex/gslib/gs_fonts.ps1041
-rw-r--r--Master/xemtex/gslib/gs_frsd.ps83
-rw-r--r--Master/xemtex/gslib/gs_icc.ps115
-rw-r--r--Master/xemtex/gslib/gs_il1_e.ps67
-rw-r--r--Master/xemtex/gslib/gs_il2_e.ps64
-rw-r--r--Master/xemtex/gslib/gs_init.ps1885
-rw-r--r--Master/xemtex/gslib/gs_kanji.ps159
-rw-r--r--Master/xemtex/gslib/gs_ksb_e.ps65
-rw-r--r--Master/xemtex/gslib/gs_l.xbm29
-rw-r--r--Master/xemtex/gslib/gs_l.xpm58
-rw-r--r--Master/xemtex/gslib/gs_l2img.ps185
-rw-r--r--Master/xemtex/gslib/gs_l_m.xbm29
-rw-r--r--Master/xemtex/gslib/gs_lev2.ps935
-rw-r--r--Master/xemtex/gslib/gs_lgo_e.ps92
-rw-r--r--Master/xemtex/gslib/gs_lgx_e.ps61
-rw-r--r--Master/xemtex/gslib/gs_ll3.ps469
-rw-r--r--Master/xemtex/gslib/gs_m.xbm16
-rw-r--r--Master/xemtex/gslib/gs_m.xpm44
-rw-r--r--Master/xemtex/gslib/gs_m_m.xbm16
-rw-r--r--Master/xemtex/gslib/gs_mex_e.ps67
-rw-r--r--Master/xemtex/gslib/gs_mgl_e.ps65
-rw-r--r--Master/xemtex/gslib/gs_mro_e.ps62
-rw-r--r--Master/xemtex/gslib/gs_pdf_e.ps45
-rw-r--r--Master/xemtex/gslib/gs_pdfwr.ps495
-rw-r--r--Master/xemtex/gslib/gs_pfile.ps128
-rw-r--r--Master/xemtex/gslib/gs_rdlin.ps21
-rw-r--r--Master/xemtex/gslib/gs_res.ps928
-rw-r--r--Master/xemtex/gslib/gs_s.xbm11
-rw-r--r--Master/xemtex/gslib/gs_s.xpm36
-rw-r--r--Master/xemtex/gslib/gs_s_m.xbm11
-rw-r--r--Master/xemtex/gslib/gs_setpd.ps777
-rw-r--r--Master/xemtex/gslib/gs_statd.ps366
-rw-r--r--Master/xemtex/gslib/gs_std_e.ps74
-rw-r--r--Master/xemtex/gslib/gs_sym_e.ps84
-rw-r--r--Master/xemtex/gslib/gs_t.xbm8
-rw-r--r--Master/xemtex/gslib/gs_t.xpm28
-rw-r--r--Master/xemtex/gslib/gs_t_m.xbm8
-rw-r--r--Master/xemtex/gslib/gs_trap.ps104
-rw-r--r--Master/xemtex/gslib/gs_ttf.ps1789
-rw-r--r--Master/xemtex/gslib/gs_typ32.ps128
-rw-r--r--Master/xemtex/gslib/gs_typ42.ps45
-rw-r--r--Master/xemtex/gslib/gs_type1.ps183
-rw-r--r--Master/xemtex/gslib/gs_wan_e.ps47
-rw-r--r--Master/xemtex/gslib/gs_wl1_e.ps67
-rw-r--r--Master/xemtex/gslib/gs_wl2_e.ps67
-rw-r--r--Master/xemtex/gslib/gs_wl5_e.ps67
-rw-r--r--Master/xemtex/gslib/gsbj3
-rw-r--r--Master/xemtex/gslib/gsbj.bat5
-rw-r--r--Master/xemtex/gslib/gsdj3
-rw-r--r--Master/xemtex/gslib/gsdj.bat5
-rw-r--r--Master/xemtex/gslib/gsdj5003
-rw-r--r--Master/xemtex/gslib/gsdj500.bat5
-rw-r--r--Master/xemtex/gslib/gslj3
-rw-r--r--Master/xemtex/gslib/gslj.bat5
-rw-r--r--Master/xemtex/gslib/gslp3
-rw-r--r--Master/xemtex/gslib/gslp.bat5
-rw-r--r--Master/xemtex/gslib/gslp.ps695
-rw-r--r--Master/xemtex/gslib/gsnd3
-rw-r--r--Master/xemtex/gslib/gsnd.bat5
-rw-r--r--Master/xemtex/gslib/gsndt.bat5
-rw-r--r--Master/xemtex/gslib/gsnup.ps89
-rw-r--r--Master/xemtex/gslib/gssetgs.bat8
-rw-r--r--Master/xemtex/gslib/gst.bat5
-rw-r--r--Master/xemtex/gslib/gstt.bat5
-rw-r--r--Master/xemtex/gslib/ht_ccsto.ps3171
-rw-r--r--Master/xemtex/gslib/image-qa.ps1827
-rw-r--r--Master/xemtex/gslib/impath.ps180
-rw-r--r--Master/xemtex/gslib/jispaper.ps28
-rw-r--r--Master/xemtex/gslib/landscap.ps31
-rw-r--r--Master/xemtex/gslib/level1.ps3
-rw-r--r--Master/xemtex/gslib/lines.ps166
-rw-r--r--Master/xemtex/gslib/lp386.bat2
-rw-r--r--Master/xemtex/gslib/lp386r2.bat2
-rw-r--r--Master/xemtex/gslib/lpgs.bat5
-rw-r--r--Master/xemtex/gslib/lpr2.bat5
-rw-r--r--Master/xemtex/gslib/lprsetup.sh189
-rw-r--r--Master/xemtex/gslib/markhint.ps131
-rw-r--r--Master/xemtex/gslib/markpath.ps60
-rw-r--r--Master/xemtex/gslib/necp2x.upp35
-rw-r--r--Master/xemtex/gslib/necp2x6.upp35
-rw-r--r--Master/xemtex/gslib/packfile.ps334
-rw-r--r--Master/xemtex/gslib/pcharstr.ps127
-rw-r--r--Master/xemtex/gslib/pdf2dsc26
-rw-r--r--Master/xemtex/gslib/pdf2dsc.bat18
-rw-r--r--Master/xemtex/gslib/pdf2dsc.ps166
-rw-r--r--Master/xemtex/gslib/pdf2ps29
-rw-r--r--Master/xemtex/gslib/pdf2ps.bat24
-rwxr-xr-xMaster/xemtex/gslib/pdf2ps.cmd41
-rw-r--r--Master/xemtex/gslib/pdf_base.ps640
-rw-r--r--Master/xemtex/gslib/pdf_draw.ps1151
-rw-r--r--Master/xemtex/gslib/pdf_font.ps1224
-rw-r--r--Master/xemtex/gslib/pdf_main.ps813
-rw-r--r--Master/xemtex/gslib/pdf_ops.ps521
-rw-r--r--Master/xemtex/gslib/pdf_sec.ps361
-rw-r--r--Master/xemtex/gslib/pdfopt20
-rw-r--r--Master/xemtex/gslib/pdfopt.bat22
-rw-r--r--Master/xemtex/gslib/pdfopt.ps1126
-rw-r--r--Master/xemtex/gslib/pdfwrite.ps284
-rw-r--r--Master/xemtex/gslib/pf2afm8
-rw-r--r--Master/xemtex/gslib/pf2afm.bat17
-rwxr-xr-xMaster/xemtex/gslib/pf2afm.cmd7
-rw-r--r--Master/xemtex/gslib/pf2afm.ps497
-rw-r--r--Master/xemtex/gslib/pfbtopfa16
-rw-r--r--Master/xemtex/gslib/pfbtopfa.ps35
-rw-r--r--Master/xemtex/gslib/pftogsf.bat20
-rw-r--r--Master/xemtex/gslib/pj-gs.sh289
-rw-r--r--Master/xemtex/gslib/ppath.ps55
-rw-r--r--Master/xemtex/gslib/pphs7
-rw-r--r--Master/xemtex/gslib/pphs.ps222
-rw-r--r--Master/xemtex/gslib/prfont.ps242
-rw-r--r--Master/xemtex/gslib/printafm7
-rw-r--r--Master/xemtex/gslib/printafm.ps149
-rw-r--r--Master/xemtex/gslib/ps2ai.ps552
-rw-r--r--Master/xemtex/gslib/ps2ascii18
-rw-r--r--Master/xemtex/gslib/ps2ascii.bat15
-rwxr-xr-xMaster/xemtex/gslib/ps2ascii.cmd18
-rw-r--r--Master/xemtex/gslib/ps2ascii.ps1509
-rw-r--r--Master/xemtex/gslib/ps2epsi78
-rw-r--r--Master/xemtex/gslib/ps2epsi.bat28
-rwxr-xr-xMaster/xemtex/gslib/ps2epsi.cmd31
-rw-r--r--Master/xemtex/gslib/ps2epsi.ps248
-rw-r--r--Master/xemtex/gslib/ps2pdf7
-rw-r--r--Master/xemtex/gslib/ps2pdf.bat18
-rwxr-xr-xMaster/xemtex/gslib/ps2pdf.cmd43
-rw-r--r--Master/xemtex/gslib/ps2pdf125
-rw-r--r--Master/xemtex/gslib/ps2pdf12.bat15
-rwxr-xr-xMaster/xemtex/gslib/ps2pdf12.cmd11
-rw-r--r--Master/xemtex/gslib/ps2pdf135
-rw-r--r--Master/xemtex/gslib/ps2pdf13.bat15
-rwxr-xr-xMaster/xemtex/gslib/ps2pdf13.cmd11
-rw-r--r--Master/xemtex/gslib/ps2pdf145
-rw-r--r--Master/xemtex/gslib/ps2pdf14.bat15
-rwxr-xr-xMaster/xemtex/gslib/ps2pdf14.cmd11
-rw-r--r--Master/xemtex/gslib/ps2pdfwr36
-rw-r--r--Master/xemtex/gslib/ps2pdfxx.bat56
-rw-r--r--Master/xemtex/gslib/ps2ps20
-rw-r--r--Master/xemtex/gslib/ps2ps.bat23
-rwxr-xr-xMaster/xemtex/gslib/ps2ps.cmd36
-rw-r--r--Master/xemtex/gslib/pv.sh37
-rw-r--r--Master/xemtex/gslib/quit.ps1
-rw-r--r--Master/xemtex/gslib/ras1.upp8
-rw-r--r--Master/xemtex/gslib/ras24.upp8
-rw-r--r--Master/xemtex/gslib/ras3.upp8
-rw-r--r--Master/xemtex/gslib/ras32.upp8
-rw-r--r--Master/xemtex/gslib/ras4.upp8
-rw-r--r--Master/xemtex/gslib/ras8m.upp8
-rw-r--r--Master/xemtex/gslib/rollconv.ps385
-rw-r--r--Master/xemtex/gslib/showchar.ps94
-rw-r--r--Master/xemtex/gslib/showpage.ps1
-rw-r--r--Master/xemtex/gslib/st640ih.upp57
-rw-r--r--Master/xemtex/gslib/st640ihg.upp42
-rw-r--r--Master/xemtex/gslib/st640p.upp49
-rw-r--r--Master/xemtex/gslib/st640pg.upp34
-rw-r--r--Master/xemtex/gslib/st640pl.upp49
-rw-r--r--Master/xemtex/gslib/st640plg.upp34
-rw-r--r--Master/xemtex/gslib/stc.upp53
-rw-r--r--Master/xemtex/gslib/stc1520h.upp58
-rw-r--r--Master/xemtex/gslib/stc2.upp53
-rw-r--r--Master/xemtex/gslib/stc200_h.upp51
-rw-r--r--Master/xemtex/gslib/stc2_h.upp53
-rw-r--r--Master/xemtex/gslib/stc2s_h.upp57
-rw-r--r--Master/xemtex/gslib/stc300.upp60
-rw-r--r--Master/xemtex/gslib/stc300bl.upp40
-rw-r--r--Master/xemtex/gslib/stc300bm.upp43
-rw-r--r--Master/xemtex/gslib/stc500p.upp48
-rw-r--r--Master/xemtex/gslib/stc500ph.upp48
-rw-r--r--Master/xemtex/gslib/stc600ih.upp58
-rw-r--r--Master/xemtex/gslib/stc600p.upp34
-rw-r--r--Master/xemtex/gslib/stc600pl.upp34
-rw-r--r--Master/xemtex/gslib/stc640p.upp33
-rw-r--r--Master/xemtex/gslib/stc800ih.upp58
-rw-r--r--Master/xemtex/gslib/stc800p.upp34
-rw-r--r--Master/xemtex/gslib/stc800pl.upp34
-rw-r--r--Master/xemtex/gslib/stc_h.upp53
-rw-r--r--Master/xemtex/gslib/stc_l.upp26
-rw-r--r--Master/xemtex/gslib/stcany.upp24
-rw-r--r--Master/xemtex/gslib/stcany_h.upp24
-rw-r--r--Master/xemtex/gslib/stcinfo.ps800
-rw-r--r--Master/xemtex/gslib/stcolor.ps172
-rw-r--r--Master/xemtex/gslib/stocht.ps63
-rw-r--r--Master/xemtex/gslib/sysvlp.sh46
-rw-r--r--Master/xemtex/gslib/traceimg.ps43
-rw-r--r--Master/xemtex/gslib/traceop.ps84
-rw-r--r--Master/xemtex/gslib/type1enc.ps66
-rw-r--r--Master/xemtex/gslib/type1ops.ps238
-rw-r--r--Master/xemtex/gslib/uninfo.ps221
-rw-r--r--Master/xemtex/gslib/unix-lpr.sh161
-rw-r--r--Master/xemtex/gslib/unprot.ps68
-rw-r--r--Master/xemtex/gslib/viewcmyk.ps64
-rw-r--r--Master/xemtex/gslib/viewgif.ps161
-rw-r--r--Master/xemtex/gslib/viewjpeg.ps153
-rw-r--r--Master/xemtex/gslib/viewmiff.ps125
-rw-r--r--Master/xemtex/gslib/viewpbm.ps185
-rw-r--r--Master/xemtex/gslib/viewpcx.ps151
-rw-r--r--Master/xemtex/gslib/viewps2a.ps33
-rw-r--r--Master/xemtex/gslib/wftopfa3
-rw-r--r--Master/xemtex/gslib/wftopfa.ps304
-rw-r--r--Master/xemtex/gslib/winmaps.ps107
-rw-r--r--Master/xemtex/gslib/wmakebat.bat4
-rw-r--r--Master/xemtex/gslib/wrfont.ps663
-rw-r--r--Master/xemtex/gslib/zeroline.ps101
296 files changed, 50219 insertions, 0 deletions
diff --git a/Master/xemtex/gslib/CIDFnmap b/Master/xemtex/gslib/CIDFnmap
new file mode 100644
index 00000000000..7fe74aba3bb
--- /dev/null
+++ b/Master/xemtex/gslib/CIDFnmap
@@ -0,0 +1,157 @@
+%!
+% Copyright (C) 2001 Masatake YAMATO, Taiji Yamada and gs-cjk project
+%
+% This file is part of GNU Ghostscript.
+%
+% GNU Ghostscript is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
+% to anyone for the consequences of using it or for whether it serves any
+% particular purpose or works at all, unless he says so in writing. Refer
+% to the GNU General Public License for full details.
+%
+% Everyone is granted permission to copy, modify and redistribute GNU
+% Ghostscript, but only under the conditions described in the GNU General
+% Public License. A copy of this license is supposed to have been given
+% to you along with GNU Ghostscript so you can know your rights and
+% responsibilities. It should be in a file named COPYING. Among other
+% things, the copyright notice and this notice must be preserved on all
+% copies.
+
+% $Id: CIDFnmap,v 1.1.4.1 2002/04/02 14:47:42 mpsuzuki Exp $
+% CIDFnmap - sample CID-keyed font catalog for Ghostscript.
+
+% ----------------------------------------------------------------
+
+% This file is a catalog of CID-keyed fonts, TrueType fonts (TTF), and also
+% TrueType Collection fonts (TTC) known to Ghostscript.
+%
+% There are two ways to make a CID-keyed font loaded automatically when named:
+% C1. Put the CID-keyed font as a resource file to /Resource/CIDFont(*1).
+% (*1) A path concatenated with GenericResourceDir defined in
+% gs_res.ps and "CIDFont". The default value of GenericResourceDir
+% is "/Resource/".
+% C2. Put the CID-keyed font file to Ghostscript's font path(*2)
+% and write an entry for the CID-keyed font to this catalog.
+% (*2) Somewhere in Ghostscript font search path, which is generally
+% /usr/local/share/ghostscript/fonts. See output of `gs -h` or Use.htm,
+% Ghostscript's document.
+%
+% There are two ways to make a TrueType font loaded automatically when named:
+% T1. Write a wrapper script file for the TrueType font and put the
+% wrapper file to /Resource/CIDFont. The wrapper has to translate a
+% TrueType font file to Type 2 CID-keyed on demand. Some examples of the
+% wrapper file named "CIDFontName" as follows:
+%
+% (e1) TTF translated to Type 2 CID-keyed font
+% %!PS-Adobe-3.0 Resource-CIDFont
+% %%BeginResource: CIDFont (CIDFontName)
+% /CIDFontName (filename.ttf) .openttcidfont
+% dup length dict begin {def} forall currentdict end
+% /CIDFont defineresource pop
+% %%EndResource
+% %%EOF
+%
+% (e2) TTC with an index translated to Type 2 CID-keyed font
+% %!PS-Adobe-3.0 Resource-CIDFont
+% %%BeginResource: CIDFont (CIDFontName)
+% /CIDFontName (filename.ttc) 2 .openttcidfont
+% dup length dict begin {def} forall currentdict end
+% /CIDFont defineresource pop
+% %%EndResource
+% %%EOF
+%
+% (e3) TTC with an index and a name of RO(Registry-Ordering)-Code
+% %!PS-Adobe-3.0 Resource-CIDFont
+% %%BeginResource: CIDFont (CIDFontName)
+% /CIDFontName (filename.ttc) 2 /Adobe-GB1-Unicode .openttcidfont
+% dup length dict begin {def} forall currentdict end
+% /CIDFont defineresource pop
+% %%EndResource
+% %%EOF
+%
+% for details about the names of RO-Code written in (e3), see below.
+%
+% T2. Put the CID-keyed font file to Ghostscript's font path(*2)
+% and write an entry for the TrueType font to this catalog.
+
+% The Syntax of CIDFnmap is very similar to Fontmap.
+% Each CID-keyed font has an entry consisting of three items:
+%
+% i1. The name by which the CID-keyed 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.
+%
+% i2. Information depending on whether this is a real CID-keyed font or a
+% CID-keyed font alias:
+%
+% - For real CID-keyed fonts, the name of the CID-keyed font
+% file (a Ghostscript string, enclosed in parentheses).
+% The filename should include the extension if the CID-keyed font
+% name has.
+%
+% - For CID-keyed font aliases, the name of the CID font
+% which should be used when this one is requested,
+% preceded by a `/'. Note that an alias name cannot be enclosed
+% in parentheses.
+%
+% i3. At least one space or tab, and a terminating semicolon.
+%
+% Each CID-keyed font has an entry consisting of three essential items and
+% two optional items. The three essential items are the same to the items of
+% CID-keyed Font. Two optional items are put between i2 and i3.
+% Two optional items are:
+%
+% i4. the number that specifies TTC font index
+%
+% i5. the name of CIDs mapping to Codes
+% ``The kind of CIDs mapping to Codes'' is listed as follows:
+%
+% <RO-Code> <Comment>
+% /Adobe-CNS1-Big5 Traditional Chinese, for Big5 TrueType fonts
+% /Adobe-CNS1-Unicode Traditional Chinese, for Unicode TrueType fonts
+% /Adobe-CNS1 Traditional Chinese, for TrueType fonts (*3)
+% /Adobe-GB1-PRC Simplified Chinese, for PRC TrueType fonts
+% /Adobe-GB1-Unicode Simplified Chinese, for Unicode TrueType fonts
+% /Adobe-GB1 Simplified Chinese, for TrueType fonts (*3)
+% /Adobe-Japan1-ShiftJIS Japanese, for ShiftJIS TrueType fonts
+% /Adobe-Japan1-Unicode Japanese, for Unicode TrueType fonts
+% /Adobe-Japan1 Japanese, for TrueType fonts (*3)
+% /Adobe-Japan2-Unicode JIS Supplement, for Unicode TrueType fonts
+% /Adobe-Japan2 JIS Supplement, for TrueType fonts (*3)
+% /Adobe-Korea1-Johab Korean, for Johab TrueType fonts
+% /Adobe-Korea1-Unicode Korean, for Unicode TrueType fonts
+% /Adobe-Korea1-Wansung Korean, for Wansung TrueType fonts
+% /Adobe-Korea1 Korean, for TrueType fonts (*3)
+% (*3) Code is automatically detected by cmap table of a TrueType file.
+% If an optional item for the kind of mapping is omitted, then
+% Code of TTF and RO(Registry-Ordering) of CIDFont are automatically
+% detected by OS/2 table and cmap table of TTF, respectively.
+
+% Like Fontmap, .runlibfile is used in CIDFnmap to include other CIDFnmaps.
+
+% 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.
+
+%(CIDFnmap.Ore) .runlibfile
+%(CIDFnmap.ARP) .runlibfile
+%(CIDFnmap.Bae) .runlibfile
+%(CIDFnmap.Koc) .runlibfile
+%(CIDFnmap.Sol) .runlibfile
+%(CIDFnmap.Win) .runlibfile
+
+%(CIDFnmap.CJK) .runlibfile
+
+% native CIDFontName (BIG5) in traditional Chinese
+%(CIDFnmap.b5) .runlibfile
+
+% native CIDFontName (GB2312) in simplified Chinese
+%(CIDFnmap.gb) .runlibfile
+
+% native CIDFontName (Shift_JIS) in Japanese
+%(CIDFnmap.sj) .runlibfile
+
+% native CIDFontName (euc-kr) in Korean
+%(CIDFnmap.ksx) .runlibfile
diff --git a/Master/xemtex/gslib/CIDFnmap.ARP b/Master/xemtex/gslib/CIDFnmap.ARP
new file mode 100644
index 00000000000..adf8664a97f
--- /dev/null
+++ b/Master/xemtex/gslib/CIDFnmap.ARP
@@ -0,0 +1,34 @@
+%!
+% Copyright (C) 2001 Taiji Yamada and gs-cjk project
+%
+% This file is part of GNU Ghostscript.
+%
+% GNU Ghostscript is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
+% to anyone for the consequences of using it or for whether it serves any
+% particular purpose or works at all, unless he says so in writing. Refer
+% to the GNU General Public License for full details.
+%
+% Everyone is granted permission to copy, modify and redistribute GNU
+% Ghostscript, but only under the conditions described in the GNU General
+% Public License. A copy of this license is supposed to have been given
+% to you along with GNU Ghostscript so you can know your rights and
+% responsibilities. It should be in a file named COPYING. Among other
+% things, the copyright notice and this notice must be preserved on all
+% copies.
+
+% $Id: CIDFnmap.ARP,v 1.1.4.1 2002/04/02 14:47:42 mpsuzuki Exp $
+% CID fontmap for the Arphic trutype fonts
+
+% See ftp://ftp.gnu.org/pub/non-gnu/chinese-fonts-truetype/LICENSE
+% for license information regarding these fonts.
+
+% Adobe-CNS1
+
+/ZenKai-Medium (bkai00mp.ttf) ;
+/ShanHeiSun-Light (bsmi00lp.ttf) ;
+
+% Adobe-GB1
+
+/BousungEG-Light-GB (gbsn00lp.ttf) ;
+/GBZenKai-Medium (gkai00mp.ttf) ;
diff --git a/Master/xemtex/gslib/CIDFnmap.Bae b/Master/xemtex/gslib/CIDFnmap.Bae
new file mode 100644
index 00000000000..54a64b45bd5
--- /dev/null
+++ b/Master/xemtex/gslib/CIDFnmap.Bae
@@ -0,0 +1,31 @@
+%!
+% Copyright (C) 2001 Taiji Yamada and gs-cjk project
+%
+% This file is part of GNU Ghostscript.
+%
+% GNU Ghostscript is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
+% to anyone for the consequences of using it or for whether it serves any
+% particular purpose or works at all, unless he says so in writing. Refer
+% to the GNU General Public License for full details.
+%
+% Everyone is granted permission to copy, modify and redistribute GNU
+% Ghostscript, but only under the conditions described in the GNU General
+% Public License. A copy of this license is supposed to have been given
+% to you along with GNU Ghostscript so you can know your rights and
+% responsibilities. It should be in a file named COPYING. Among other
+% things, the copyright notice and this notice must be preserved on all
+% copies.
+
+% $Id: CIDFnmap.Bae,v 1.1.4.1 2002/04/02 14:47:42 mpsuzuki Exp $
+% CID fontmap for the Baekmuk truetype fonts
+
+% See ftp://ftp.mizi.com/pub/baekmuk/COPYRIGHT
+% for license information regarding these fonts.
+
+% Adobe-Korea1
+
+/Baekmuk-Batang (batang.ttf) ;
+/Baekmuk-Dotum (dotum.ttf) ;
+/Baekmuk-Gulim (gulim.ttf) ;
+/Baekmuk-Headline (hline.ttf) ;
diff --git a/Master/xemtex/gslib/CIDFnmap.CJK b/Master/xemtex/gslib/CIDFnmap.CJK
new file mode 100644
index 00000000000..0ce91d45f5a
--- /dev/null
+++ b/Master/xemtex/gslib/CIDFnmap.CJK
@@ -0,0 +1,289 @@
+%!
+% Copyright (C) 2001 Taiji Yamada and gs-cjk project
+%
+% This file is part of GNU Ghostscript.
+%
+% GNU Ghostscript is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
+% to anyone for the consequences of using it or for whether it serves any
+% particular purpose or works at all, unless he says so in writing. Refer
+% to the GNU General Public License for full details.
+%
+% Everyone is granted permission to copy, modify and redistribute GNU
+% Ghostscript, but only under the conditions described in the GNU General
+% Public License. A copy of this license is supposed to have been given
+% to you along with GNU Ghostscript so you can know your rights and
+% responsibilities. It should be in a file named COPYING. Among other
+% things, the copyright notice and this notice must be preserved on all
+% copies.
+
+% $Id: CIDFnmap.CJK,v 1.1.4.1 2002/04/02 14:47:42 mpsuzuki Exp $
+% CIDFontName aliases for CJK PDF/PS files
+
+%
+% Fallback aliases for CJK PDF files
+%
+%/Adobe-CNS1 /MOESung-Regular ; % CIDFnmap.Ore
+%/Adobe-CNS1 /ShanHeiSun-Light ; % CIDFnmap.ARP
+%/Adobe-CNS1 /ming ; % CIDFnmap.Sol
+%/Adobe-CNS1 /MingLiU ; % CIDFnmap.Win
+%/Adobe-CNS1 /SimSun-18030-Adobe-CNS1 ; % CIDFnmap.Win
+
+%/Adobe-GB1 /BousungEG-Light-GB ; % CIDFnmap.ARP
+%/Adobe-GB1 /zycjksun ; % CIDFnmap.Sol
+%/Adobe-GB1 /SimSun ; % CIDFnmap.Win
+
+%/Adobe-Japan1 /WadaMin-Regular ; % CIDFnmap.Ore
+%/Adobe-Japan1 /HG-MinchoL ; % CIDFnmap.Sol
+%/Adobe-Japan1 /Kochi-Mincho ; % CIDFnmap.Koc
+%/Adobe-Japan1 /MS-Mincho ; % CIDFnmap.Win
+
+%/Adobe-Japan2 /WadaMin-RegularH ; % CIDFnmap.Ore
+%/Adobe-Japan2 /HeiseiMin-W3H ; % CIDFnmap.Sol
+%/Adobe-Japan2 /MS-Mincho-Adobe-Japan2 ; % CIDFnmap.Win
+
+%/Adobe-Korea1 /Munhwa-Regular ; % CIDFnmap.Ore
+%/Adobe-Korea1 /Baekmuk-Batang ; % CIDFnmap.Bae
+%/Adobe-Korea1 /Myeongjo ; % CIDFnmap.Sol
+%/Adobe-Korea1 /Batang ; % CIDFnmap.Win
+
+%
+% Convenient aliases for PS files on Traditional Chinese PostScript printer
+%
+%/MSung-Light /MOESung-Regular ; % CIDFnmap.Ore
+%/MSung-Light /SimSun-18030-Adobe-CNS1 ; % CIDFnmap.Win
+%/MSung-Medium /ShanHeiSun-Light ; % CIDFnmap.ARP
+%/MHei-Medium /ShanHeiSun-Light ; % CIDFnmap.ARP
+%/MHei-Medium /hei ; % CIDFnmap.Sol
+%/MKai-Medium /ZenKai-Medium ; % CIDFnmap.ARP
+%/MKai-Medium /kai ; % CIDFnmap.Sol
+
+%
+% Convenient aliases for PS files on Simplified Chinese PostScript printer
+%
+%/STSong-Light /BousungEG-Light-GB ; % CIDFnmap.ARP
+%/STSong-Light /zycjksun ; % CIDFnmap.Sol
+%/STSong-Light /SimSun ; % CIDFnmap.Win
+%/STFangsong-Light /zycjkfangs ; % CIDFnmap.Sol
+%/STFangsong-Light /SimSun ; % CIDFnmap.Win
+%/STHeiti-Regular /zycjkhei ; % CIDFnmap.Sol
+%/STHeiti-Regular /SimHei ; % CIDFnmap.Win
+%/STKaiti-Regular /GBZenKai-Medium ; % CIDFnmap.ARP
+%/STKaiti-Regular /zycjkkai ; % CIDFnmap.Sol
+
+%
+% Convenient aliases for PS files on Japanese PostScript printer
+%
+%/Ryumin-Light /WadaMin-Regular ; % CIDFnmap.Ore
+%/Ryumin-Light /HG-MinchoL ; % CIDFnmap.Sol
+%/Ryumin-Light /Kochi-Mincho ; % CIDFnmap.Koc
+%/Ryumin-Light /MS-Mincho ; % CIDFnmap.Win
+%/GothicBBB-Medium /WadaGo-Bold ; % CIDFnmap.Ore
+%/GothicBBB-Medium /HG-GothicB ; % CIDFnmap.Sol
+%/GothicBBB-Medium /Kochi-Gothic ; % CIDFnmap.Koc
+%/GothicBBB-Medium /MS-Gothic ; % CIDFnmap.Win
+%/HeiseiMin-W3 /MS-Mincho ; % CIDFnmap.Win
+%/HeiseiKakuGo-W5 /MS-Gothic ; % CIDFnmap.Win
+
+%/HeiseiMin-W3H /WadaMin-RegularH ; % CIDFnmap.Ore
+%/HeiseiMin-W3H /MS-Mincho-Adobe-Japan2 ; % CIDFnmap.Win
+%/HeiseiKakuGo-W5H /WadaMaruGo-RegularH ; % CIDFnmap.Ore
+%/HeiseiKakuGo-W5H /MS-Gothic-Adobe-Japan2 ; % CIDFnmap.Win
+
+%/KozMin-Regular /MS-Mincho ; % CIDFnmap.Win
+%/KozMinPro-Regular /MS-PMincho ; % CIDFnmap.Win
+
+%
+% Convenient aliases for PS files on Korean PostScript printer
+%
+%/HYGoThic-Medium /MunhwaGothic-Regular ; % CIDFnmap.Ore
+%/HYGoThic-Medium /Baekmuk-Dotum ; % CIDFnmap.Bae
+%/HYGoThic-Medium /Gothic ; % CIDFnmap.Sol
+%/HYGoThic-Medium /Dotum ; % CIDFnmap.Win
+%/HYGungSo-Bold /Gungsuh ; % CIDFnmap.Win
+%/HYKHeadLine-Bold /Baekmuk-Headline ; % CIDFnmap.Bae
+%/HYKHeadLine-Medium /Baekmuk-Headline ; % CIDFnmap.Bae
+%/HYSMyeongJo-Medium /Munhwa-Regular ; % CIDFnmap.Ore
+%/HYSMyeongJo-Medium /Baekmuk-Batang ; % CIDFnmap.Bae
+%/HYSMyeongJo-Medium /Myeongjo ; % CIDFnmap.Sol
+%/HYSMyeongJo-Medium /Batang ; % CIDFnmap.Win
+%/HYRGoThic-Medium /Baekmuk-Gulim ; % CIDFnmap.Bae
+%/HYRGoThic-Medium /RoundedGothic ; % CIDFnmap.Sol
+%/HYRGoThic-Medium /Gulim ; % CIDFnmap.Win
+
+%
+% Convenient aliases for PS files on Traditional Chinese Acrobat Distiller
+%
+%/DFKaiShu-SB-Estd-BF /MKai-Medium ;
+%/LiGothicMed /MKai-Medium ;
+%/LiSungLight /MSung-Light ;
+%/Taipei /Adobe-CNS1 ;
+
+%
+% Convenient aliases for PS files on Simplified Chinese Acrobat Distiller
+%
+%/Beijing /Adobe-GB1 ;
+%/SIL-FangSong- /STFangsong-Light ;
+%/SIL-FangSong-Reg-Jian /STFangsong-Light ;
+%/SIL-Hei-Med-Jian /STHeiti-Regular ;
+%/SIL-Kai- /STKaiti-Regular ;
+%/SIL-Kai-Reg-Jian /STKaiti-Regular ;
+%/SIL-Song-Reg-Jian /STSong-Light ;
+
+%
+% Convenient aliases for PS files on Japanese Acrobat Distiller
+%
+%/ChuGothicBBB-Medium /GothicBBB-Medium ;
+%/ChuGothicBBB-Medium-Mono /MS-Gothic ; % CIDFnmap.Win
+%/FutoGoB101-Bold /GothicBBB-Medium ;
+%/FutoMinA101-Bold /Ryumin-Light ;
+%/GothicMB101-Bold /GothicBBB-Medium ;
+%/GothicMB101-hea /GothicBBB-Medium ;
+%/GothicMB101-Ult /GothicBBB-Medium ;
+%/HeiseiKakuGo-W3 /HeiseiKakuGo-W5 ;
+%/HeiseiKakuGo-W7 /HeiseiKakuGo-W5 ;
+%/HeiseiKakuGo-W9 /HeiseiKakuGo-W5 ;
+%/HeiseiKakuGothic-W5 /HeiseiKakuGo-W5 ;
+%/HeiseiMaruGo-W4 /HeiseiKakuGo-W5 ;
+%/HeiseiMin-W5 /HeiseiMin-W3 ;
+%/HeiseiMin-W7 /HeiseiMin-W3 ;
+%/HeiseiMin-W9 /HeiseiMin-W3 ;
+%/HeiseiMincho-W3 /HeiseiMin-W3 ;
+%/HonMincho-M /Ryumin-Light ;
+%/Jun34-Medium /Ryumin-Light ;
+%/Jun101-Light /Ryumin-Light ;
+%/Jun501-Bold /Ryumin-Light ;
+%/KozMin-Bold /GothicBBB-Medium ;
+%/KozMin-ExtraLight /Ryumin-Light ;
+%/KozMin-Heavy /GothicBBB-Medium ;
+%/KozMin-Light /Ryumin-Light ;
+%/KozMin-Medium /Ryumin-Light ;
+%/KyokaICA-Light /Adobe-Japan1 ;
+%/KyokaICA-Medium /Adobe-Japan1 ;
+%/KyokaICA-regular /Adobe-Japan1 ;
+%/LogoArl-Bold /Adobe-Japan1 ;
+%/LogoArl-Light /Adobe-Japan1 ;
+%/LogoArl-Medium /Adobe-Japan1 ;
+%/LogoArl-Ultra /Adobe-Japan1 ;
+%/LogoCut-Bold /Adobe-Japan1 ;
+%/LogoCut-Light /Adobe-Japan1 ;
+%/LogoCut-Medium /Adobe-Japan1 ;
+%/LogoCut-Ultra /Adobe-Japan1 ;
+%/LogoLine-Bold /Adobe-Japan1 ;
+%/LogoLine-Light /Adobe-Japan1 ;
+%/LogoLine-Medium /Adobe-Japan1 ;
+%/LogoLine-Ultra /Adobe-Japan1 ;
+%/MaruGothic-M /GothicBBB-Medium ;
+%/MidashiGo-MB31 /GothicBBB-Medium ;
+%/MidashiMin-MA31 /Ryumin-Light ;
+%/Osaka /Ryumin-Light ;
+%/Osaka-Mono /MS-Mincho ; % CIDFnmap.Win
+%/Ryumin-Bold /Ryumin-Light ;
+%/Ryumin-heavy /Ryumin-Light ;
+%/Ryumin-Light-KL /Ryumin-Light ;
+%/Ryumin-Light-KL-Mono /MS-Mincho ; % CIDFnmap.Win
+%/Ryumin-Medium /Ryumin-Light ;
+%/Ryumin-regular /Ryumin-Light ;
+%/Ryumin-Ultra /Ryumin-Light ;
+%/ShinGo-Bold /GothicBBB-Medium ;
+%/ShinGo-Light /GothicBBB-Medium ;
+%/ShinGo-Medium /GothicBBB-Medium ;
+%/ShinGo-regular /GothicBBB-Medium ;
+%/ShinGo-Ultra /GothicBBB-Medium ;
+%/ShinseiKai-CBSK1 /Ryumin-Light ;
+%/TBKomachiG-B /Adobe-Japan1 ;
+%/TBKomachiG-DB /Adobe-Japan1 ;
+%/TBKomachiG-E /Adobe-Japan1 ;
+%/TBKomachiG-hv /Adobe-Japan1 ;
+%/TBKomachiG-M /Adobe-Japan1 ;
+%/TBKomachiG-R /Adobe-Japan1 ;
+%/TBKomachiM-DE /Adobe-Japan1 ;
+%/TBKomachiM-E /Adobe-Japan1 ;
+%/TBKomachiM-hv /Adobe-Japan1 ;
+%/TBKomachiM-M /Adobe-Japan1 ;
+%/TBKoudoukenG-B /Adobe-Japan1 ;
+%/TBKoudoukenG-DB /Adobe-Japan1 ;
+%/TBKoudoukenG-E /Adobe-Japan1 ;
+%/TBKoudoukenG-hv /Adobe-Japan1 ;
+%/TBKoudoukenG-M /Adobe-Japan1 ;
+%/TBKoudoukenG-R /Adobe-Japan1 ;
+%/TBKoudoukenM-DE /Adobe-Japan1 ;
+%/TBKoudoukenM-E /Adobe-Japan1 ;
+%/TBKoudoukenM-hv /Adobe-Japan1 ;
+%/TBKoudoukenM-M /Adobe-Japan1 ;
+%/TBRyokanG-B /Adobe-Japan1 ;
+%/TBRyokanG-DB /Adobe-Japan1 ;
+%/TBRyokanG-E /Adobe-Japan1 ;
+%/TBRyokanG-hv /Adobe-Japan1 ;
+%/TBRyokanG-M /Adobe-Japan1 ;
+%/TBRyokanG-R /Adobe-Japan1 ;
+%/TBRyokanM-DE /Adobe-Japan1 ;
+%/TBRyokanM-E /Adobe-Japan1 ;
+%/TBRyokanM-hv /Adobe-Japan1 ;
+%/TBRyokanM-M /Adobe-Japan1 ;
+%/TBTsukijiG-B /Adobe-Japan1 ;
+%/TBTsukijiG-DB /Adobe-Japan1 ;
+%/TBTsukijiG-E /Adobe-Japan1 ;
+%/TBTsukijiG-hv /Adobe-Japan1 ;
+%/TBTsukijiG-M /Adobe-Japan1 ;
+%/TBTsukijiG-R /Adobe-Japan1 ;
+%/TBTsukijiM-DE /Adobe-Japan1 ;
+%/TBTsukijiM-E /Adobe-Japan1 ;
+%/TBTsukijiM-hv /Adobe-Japan1 ;
+%/TBTsukijiM-M /Adobe-Japan1 ;
+%/TBYukinariG-B /Adobe-Japan1 ;
+%/TBYukinariG-DB /Adobe-Japan1 ;
+%/TBYukinariG-E /Adobe-Japan1 ;
+%/TBYukinariG-hv /Adobe-Japan1 ;
+%/TBYukinariG-M /Adobe-Japan1 ;
+%/TBYukinariG-R /Adobe-Japan1 ;
+%/TBYukinariM-DE /Adobe-Japan1 ;
+%/TBYukinariM-E /Adobe-Japan1 ;
+%/TBYukinariM-hv /Adobe-Japan1 ;
+%/TBYukinariM-M /Adobe-Japan1 ;
+%/TypeBankG-B /Adobe-Japan1 ;
+%/TypeBankG-DB /Adobe-Japan1 ;
+%/TypeBankG-E /Adobe-Japan1 ;
+%/TypeBankG-hv /Adobe-Japan1 ;
+%/TypeBankG-M /Adobe-Japan1 ;
+%/TypeBankG-R /Adobe-Japan1 ;
+%/TypeBankM-DE /Adobe-Japan1 ;
+%/TypeBankM-E /Adobe-Japan1 ;
+%/TypeBankM-hv /Adobe-Japan1 ;
+%/TypeBankM-M /Adobe-Japan1 ;
+
+%
+% Convenient aliases for PS files on Korean Acrobat Distiller
+%
+%/AppleGothic /HYGoThic-Medium ;
+%/AppleMyungjo /HYSMyeongJo-Medium ;
+%/HYSinMyeongJo-Medium /HYSMyeongJo-Medium ;
+%/JCfg /Adobe-Korea1 ;
+%/JCkg /Adobe-Korea1 ;
+%/Munhwa-Regular /HYSMyeongJo-Medium ;
+%/MunhwaGothic-Regular /HYGoThic-Medium ;
+%/SMAgoJ /HYGoThic-Medium ;
+%/SMAgoK /HYGoThic-Medium ;
+%/SMAgoSE /HYGoThic-Medium ;
+%/SMAgoT /HYGoThic-Medium ;
+%/SMAmu /HYSMyeongJo-Medium ;
+%/SMAmuK /HYSMyeongJo-Medium ;
+%/SMAmuSE /HYSMyeongJo-Medium ;
+%/SMAmuT /HYSMyeongJo-Medium ;
+%/SMGothic-Bold /HYGoThic-Medium ;
+%/SMGothic-DemiBold /HYGoThic-Medium ;
+%/SMGothic-Light /HYGoThic-Medium ;
+%/SMGothic-Medium /HYGoThic-Medium ;
+%/SMMyungjo-Bold /HYSMyeongJo-Medium ;
+%/SMMyungjo-DemiBold /HYSMyeongJo-Medium ;
+%/SMMyungjo-Light /HYSMyeongJo-Medium ;
+%/SMMyungjo-Medium /HYSMyeongJo-Medium ;
+%/SMgoJ /HYGoThic-Medium ;
+%/SMgoK /HYGoThic-Medium ;
+%/SMgoSE /HYGoThic-Medium ;
+%/SMgoT /HYGoThic-Medium ;
+%/SMmu /HYSMyeongJo-Medium ;
+%/SMmuK /HYSMyeongJo-Medium ;
+%/SMmuSE /HYSMyeongJo-Medium ;
+%/SMmuT /HYSMyeongJo-Medium ;
+%/Seoul /Adobe-Korea1 ;
diff --git a/Master/xemtex/gslib/CIDFnmap.Koc b/Master/xemtex/gslib/CIDFnmap.Koc
new file mode 100644
index 00000000000..8c1e5b95044
--- /dev/null
+++ b/Master/xemtex/gslib/CIDFnmap.Koc
@@ -0,0 +1,50 @@
+%!
+% Copyright (C) 2001 Taiji Yamada and gs-cjk project
+%
+% This file is part of GNU Ghostscript.
+%
+% GNU Ghostscript is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
+% to anyone for the consequences of using it or for whether it serves any
+% particular purpose or works at all, unless he says so in writing. Refer
+% to the GNU General Public License for full details.
+%
+% Everyone is granted permission to copy, modify and redistribute GNU
+% Ghostscript, but only under the conditions described in the GNU General
+% Public License. A copy of this license is supposed to have been given
+% to you along with GNU Ghostscript so you can know your rights and
+% responsibilities. It should be in a file named COPYING. Among other
+% things, the copyright notice and this notice must be preserved on all
+% copies.
+
+% $Id: CIDFnmap.Koc,v 1.1.4.1 2002/04/02 14:47:42 mpsuzuki Exp $
+% CID fontmap for Kochi truetype fonts
+
+% Kochi Mincho (aka Watanabe-Light) font series and
+% Kochi Gothic (aka Kochi-WadaLabGothic) font series for Adobe-Japan1
+
+% Kochi Mincho and Gothic - TrueType
+% Editor: Yasuyuki Furukawa <Furukawa.Yasuyuki@fujixerox.co.jp>
+% URL: http://www.on.cs.keio.ac.jp/~yasu/linux/fonts/
+%
+% Kochi-Mincho: Public domain, except for NAGA10 bitmap data
+% Kochi-Gothic: Wada Lab's font license, except for NAGA10 bitmap data
+%
+%/Kochi-Mincho (kochi-mincho.ttf) ;
+%/Kochi-Gothic (kochi-gothic.ttf) ;
+%
+% Notice: In CID-keyed space of Kochi-Mincho, although you may find that
+% CIDs 7611,7613-7625,7629,7630,11847,12041-12043 are incorrectly
+% assigned from glyph IDs, it is because that these are for WORKING AREA
+% to develop "kochi-mincho.ttf" font for the time being.
+
+% Kochi Mincho and Gothic - CIDFontType 0
+% Author: KANOU Hiroki <kanou@mil.allnet.ne.jp>
+% URL: http://kappa.allnet.ne.jp/Kochi-CID/index-e.html
+%
+% Kochi-Mincho: Public domain. Designed by Yasuyuki Furukawa.
+% Kochi-Gothic: Wada Lab's font license.
+%
+/Kochi-Mincho (Kochi-Mincho) ;
+/Kochi-Gothic (Kochi-Gothic) ;
+
diff --git a/Master/xemtex/gslib/CIDFnmap.Ore b/Master/xemtex/gslib/CIDFnmap.Ore
new file mode 100644
index 00000000000..b81f1a709cd
--- /dev/null
+++ b/Master/xemtex/gslib/CIDFnmap.Ore
@@ -0,0 +1,53 @@
+%!
+% Copyright (C) 2001 Taiji Yamada and gs-cjk project
+%
+% This file is part of GNU Ghostscript.
+%
+% GNU Ghostscript is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
+% to anyone for the consequences of using it or for whether it serves any
+% particular purpose or works at all, unless he says so in writing. Refer
+% to the GNU General Public License for full details.
+%
+% Everyone is granted permission to copy, modify and redistribute GNU
+% Ghostscript, but only under the conditions described in the GNU General
+% Public License. A copy of this license is supposed to have been given
+% to you along with GNU Ghostscript so you can know your rights and
+% responsibilities. It should be in a file named COPYING. Among other
+% things, the copyright notice and this notice must be preserved on all
+% copies.
+
+% $Id: CIDFnmap.Ore,v 1.1.4.1 2002/04/02 14:47:42 mpsuzuki Exp $
+% CID fontmap for O'Reilly cjkv font samples
+
+% See ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/samples/
+
+% Adobe-CNS1
+
+/MOEKai-Regular (MOEKai-Regular) ;
+/MOESung-Regular (MOESung-Regular) ;
+
+% Adobe-GB1
+
+% Adobe-Japan1
+
+/WadaGo-Bold (WadaGo-Bold) ;
+/WadaMaruGo-Regular (WadaMaruGo-Regular) ;
+/WadaMin-Bold (WadaMin-Bold) ;
+/WadaMin-Regular (WadaMin-Regular) ;
+
+% Adobe-Japan2
+
+/WadaMaruGo-RegularH (WadaMaruGo-RegularH) ;
+/WadaMin-RegularH (WadaMin-RegularH) ;
+
+% Adobe-Korea1
+
+/Munhwa-Regular (Munhwa-Regular) ;
+/MunhwaGothic-Bold (MunhwaGothic-Bold) ;
+/MunhwaGothic-Regular (MunhwaGothic-Regular) ;
+/MunhwaGungSeo-Bold (MunhwaGungSeo-Bold) ;
+/MunhwaGungSeo-Light (MunhwaGungSeo-Light) ;
+/MunhwaGungSeoHeulim-Bold (MunhwaGungSeoHeulim-Bold) ;
+/MunhwaGungSeoHeulim-Light (MunhwaGungSeoHeulim-Light) ;
+/MunhwaHoonMin-Regular (MunhwaHoonMin-Regular) ;
diff --git a/Master/xemtex/gslib/CIDFnmap.Sol b/Master/xemtex/gslib/CIDFnmap.Sol
new file mode 100644
index 00000000000..c14db768a3f
--- /dev/null
+++ b/Master/xemtex/gslib/CIDFnmap.Sol
@@ -0,0 +1,54 @@
+%!
+% Copyright (C) 2001 Taiji Yamada and gs-cjk project
+%
+% This file is part of GNU Ghostscript.
+%
+% GNU Ghostscript is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
+% to anyone for the consequences of using it or for whether it serves any
+% particular purpose or works at all, unless he says so in writing. Refer
+% to the GNU General Public License for full details.
+%
+% Everyone is granted permission to copy, modify and redistribute GNU
+% Ghostscript, but only under the conditions described in the GNU General
+% Public License. A copy of this license is supposed to have been given
+% to you along with GNU Ghostscript so you can know your rights and
+% responsibilities. It should be in a file named COPYING. Among other
+% things, the copyright notice and this notice must be preserved on all
+% copies.
+
+% $Id: CIDFnmap.Sol,v 1.1.4.1 2002/04/02 14:47:42 mpsuzuki Exp $
+% CID fontmap for Solaris
+
+% Adobe-CNS1
+
+/hei (/usr/openwin/lib/locale/zh_TW.BIG5/X11/fonts/TT/hei.ttf) /Adobe-CNS1-Unicode ;
+/kai (/usr/openwin/lib/locale/zh_TW.BIG5/X11/fonts/TT/kai.ttf) /Adobe-CNS1-Unicode ;
+/ming (/usr/openwin/lib/locale/zh_TW.BIG5/X11/fonts/TT/ming.ttf) /Adobe-CNS1-Unicode ;
+
+% Adobe-GB1
+
+/zycjkfangs (/usr/openwin/lib/locale/zh.GBK/X11/fonts/TrueType/fangsongti.ttf) ;
+/zycjkhei (/usr/openwin/lib/locale/zh.GBK/X11/fonts/TrueType/heiti.ttf) ;
+/zycjkkai (/usr/openwin/lib/locale/zh.GBK/X11/fonts/TrueType/kaiti.ttf) ;
+/zycjksun (/usr/openwin/lib/locale/zh.GBK/X11/fonts/TrueType/songti.ttf) ;
+/CFangSongGB-Light (/usr/openwin/lib/locale/zh/X11/fonts/TrueType/cfsgbl.ttf) /Adobe-GB1-PRC ;
+/MHeiGB-Bold (/usr/openwin/lib/locale/zh/X11/fonts/TrueType/mhgbb.ttf) /Adobe-GB1-PRC ;
+/MKaiGB-Medium (/usr/openwin/lib/locale/zh/X11/fonts/TrueType/mkgbm.ttf) /Adobe-GB1-PRC ;
+/MSungGB-Light (/usr/openwin/lib/locale/zh/X11/fonts/TrueType/msgbl.ttf) /Adobe-GB1-PRC ;
+
+% Adobe-Japan1
+
+/HG-GothicB (/usr/openwin/lib/locale/ja/X11/fonts/TT/HG-GothicB.ttf) ;
+/HG-MinchoL (/usr/openwin/lib/locale/ja/X11/fonts/TT/HG-MinchoL.ttf) ;
+
+% Adobe-Japan2
+
+/HeiseiMin-W3H (/usr/openwin/lib/locale/ja/X11/fonts/TT/HeiseiMin-W3H.ttf) /Adobe-Japan2-Unicode ;
+
+% Adobe-Korea1
+
+/Gothic (/usr/openwin/lib/locale/ko/X11/fonts/TrueType/h2gtrm.ttf) ;
+/RoundedGothic (/usr/openwin/lib/locale/ko/X11/fonts/TrueType/h2drrm.ttf) ;
+/Haeseo (/usr/openwin/lib/locale/ko/X11/fonts/TrueType/h2hsrm.ttf) ;
+/Myeongjo (/usr/openwin/lib/locale/ko/X11/fonts/TrueType/h2mjsm.ttf) ;
diff --git a/Master/xemtex/gslib/CIDFnmap.Win b/Master/xemtex/gslib/CIDFnmap.Win
new file mode 100644
index 00000000000..2b263a7d152
--- /dev/null
+++ b/Master/xemtex/gslib/CIDFnmap.Win
@@ -0,0 +1,79 @@
+%!
+% Copyright (C) 2001 Taiji Yamada and gs-cjk project
+%
+% This file is part of GNU Ghostscript.
+%
+% GNU Ghostscript is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
+% to anyone for the consequences of using it or for whether it serves any
+% particular purpose or works at all, unless he says so in writing. Refer
+% to the GNU General Public License for full details.
+%
+% Everyone is granted permission to copy, modify and redistribute GNU
+% Ghostscript, but only under the conditions described in the GNU General
+% Public License. A copy of this license is supposed to have been given
+% to you along with GNU Ghostscript so you can know your rights and
+% responsibilities. It should be in a file named COPYING. Among other
+% things, the copyright notice and this notice must be preserved on all
+% copies.
+
+% $Id: CIDFnmap.Win,v 1.1.2.1 2002/04/02 14:47:42 mpsuzuki Exp $
+% CID fontmap for MS Windows
+
+% Adobe-CNS1
+
+/MingLiU (mingliu.ttc) ;
+/PMingLiU (mingliu.ttc) 2 ;
+
+/SimSun-18030-Adobe-CNS1 (SimSun18030.ttc) /Adobe-CNS1 ;
+/NSimSun-18030-Adobe-CNS1 (SimSun18030.ttc) 2 /Adobe-CNS1 ;
+
+% Adobe-GB1
+
+/SimHei (simhei.ttf) ;
+
+/SimSun (simsun.ttc) ;
+/NSimSun (simsun.ttc) 2 ;
+
+/SimSun-18030 (SimSun18030.ttc) /Adobe-GB1 ;
+/NSimSun-18030 (SimSun18030.ttc) 2 /Adobe-GB1 ;
+
+% Adobe-Japan1
+
+/MS-Gothic (msgothic.ttc) ;
+/MS-PGothic (msgothic.ttc) 2 ;
+/MS-UI-Gothic (msgothic.ttc) 3 ;
+(MS Gothic) (msgothic.ttc) ;
+(MS PGothic) (msgothic.ttc) 2 ;
+(MS UI Gothic) (msgothic.ttc) 3 ;
+/MSGothic (msgothic.ttc) ;
+/MSPGothic (msgothic.ttc) 2 ;
+/MSUIGothic (msgothic.ttc) 3 ;
+
+/MS-Mincho (msmincho.ttc) ;
+/MS-PMincho (msmincho.ttc) 2 ;
+(MS Mincho) (msmincho.ttc) ;
+(MS PMincho) (msmincho.ttc) 2 ;
+/MSMincho (msmincho.ttc) ;
+/MSPMincho (msmincho.ttc) 2 ;
+
+% Adobe-Japan2
+
+/MS-Gothic-Adobe-Japan2 (msgothic.ttc) /Adobe-Japan2 ;
+/MS-PGothic-Adobe-Japan2 (msgothic.ttc) 2 /Adobe-Japan2 ;
+/MS-UI-Gothic-Adobe-Japan2 (msgothic.ttc) 3 /Adobe-Japan2 ;
+
+/MS-Mincho-Adobe-Japan2 (msmincho.ttc) /Adobe-Japan2 ;
+/MS-PMincho-Adobe-Japan2 (msmincho.ttc) 2 /Adobe-Japan2 ;
+
+% Adobe-Korea1
+
+/Batang (batang.ttc) ;
+/BatangChe (batang.ttc) 2 ;
+/Gungsuh (batang.ttc) 3 ;
+/GungsuhChe (batang.ttc) 4 ;
+
+/Gulim (gulim.ttc) ;
+/GulimChe (gulim.ttc) 2 ;
+/Dotum (gulim.ttc) 3 ;
+/DotumChe (gulim.ttc) 4 ;
diff --git a/Master/xemtex/gslib/CIDFnmap.b5 b/Master/xemtex/gslib/CIDFnmap.b5
new file mode 100644
index 00000000000..5ce66a9c632
--- /dev/null
+++ b/Master/xemtex/gslib/CIDFnmap.b5
@@ -0,0 +1,26 @@
+%!
+% Copyright (C) 2001 Taiji Yamada and gs-cjk project
+%
+% This file is part of GNU Ghostscript.
+%
+% GNU Ghostscript is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
+% to anyone for the consequences of using it or for whether it serves any
+% particular purpose or works at all, unless he says so in writing. Refer
+% to the GNU General Public License for full details.
+%
+% Everyone is granted permission to copy, modify and redistribute GNU
+% Ghostscript, but only under the conditions described in the GNU General
+% Public License. A copy of this license is supposed to have been given
+% to you along with GNU Ghostscript so you can know your rights and
+% responsibilities. It should be in a file named COPYING. Among other
+% things, the copyright notice and this notice must be preserved on all
+% copies.
+
+% $Id: CIDFnmap.b5,v 1.1.2.2 2002/02/11 20:36:45 giles Exp $
+% CID fontmap for chinese-big5 encoding CIDFontName
+
+(§ºÅé Light) /MSung-Light ;
+(§ºÅé) /MSung-Light ;
+(¤¤¶ÂÅé Medium) /MHei-Medium ;
+(¤¤¶ÂÅé) /MHei-Medium ;
diff --git a/Master/xemtex/gslib/CIDFnmap.gb b/Master/xemtex/gslib/CIDFnmap.gb
new file mode 100644
index 00000000000..0db66013d4e
--- /dev/null
+++ b/Master/xemtex/gslib/CIDFnmap.gb
@@ -0,0 +1,24 @@
+%!
+% Copyright (C) 2001 Taiji Yamada and gs-cjk project
+%
+% This file is part of GNU Ghostscript.
+%
+% GNU Ghostscript is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
+% to anyone for the consequences of using it or for whether it serves any
+% particular purpose or works at all, unless he says so in writing. Refer
+% to the GNU General Public License for full details.
+%
+% Everyone is granted permission to copy, modify and redistribute GNU
+% Ghostscript, but only under the conditions described in the GNU General
+% Public License. A copy of this license is supposed to have been given
+% to you along with GNU Ghostscript so you can know your rights and
+% responsibilities. It should be in a file named COPYING. Among other
+% things, the copyright notice and this notice must be preserved on all
+% copies.
+
+% $Id: CIDFnmap.gb,v 1.1.2.2 2002/02/11 20:36:45 giles Exp $
+% CID fontmap for chinese-gb2312 encoding CIDFontName
+
+(»ªÎÄËÎÌå Light) /STSong-Light ;
+(»ªÎÄËÎÌå) /STSong-Light ;
diff --git a/Master/xemtex/gslib/CIDFnmap.ksx b/Master/xemtex/gslib/CIDFnmap.ksx
new file mode 100644
index 00000000000..198d68501ca
--- /dev/null
+++ b/Master/xemtex/gslib/CIDFnmap.ksx
@@ -0,0 +1,31 @@
+%!
+% Copyright (C) 2001 Taiji Yamada and gs-cjk project
+%
+% This file is part of GNU Ghostscript.
+%
+% GNU Ghostscript is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
+% to anyone for the consequences of using it or for whether it serves any
+% particular purpose or works at all, unless he says so in writing. Refer
+% to the GNU General Public License for full details.
+%
+% Everyone is granted permission to copy, modify and redistribute GNU
+% Ghostscript, but only under the conditions described in the GNU General
+% Public License. A copy of this license is supposed to have been given
+% to you along with GNU Ghostscript so you can know your rights and
+% responsibilities. It should be in a file named COPYING. Among other
+% things, the copyright notice and this notice must be preserved on all
+% copies.
+
+% $Id: CIDFnmap.ksx,v 1.1.2.2 2002/02/11 20:36:45 giles Exp $
+% CID fontmap for euc-korea encoding CIDFontName
+
+(HY½Å¸íÁ¶ Medium) /HYSMyeongJo-Medium ;
+(HY½Å¸íÁ¶) /HYSMyeongJo-Medium ;
+(HYÁß°íµñ Medium) /HYGoThic-Medium ;
+(HYÁß°íµñ) /HYGoThic-Medium ;
+(HY±Ã¼­B) /HYGungSo-Bold ;
+(HY°¢Çìµå¶óÀÎ) /HYKHeadLine-Bold ;
+(HY°¢Çìµå¶óÀÎ Medium) /HYKHeadLine-Medium ;
+(HYµÕ±Ù°íµñ Medium) /HYRGoThic-Medium ;
+(HYµÕ±Ù°íµñ) /HYRGoThic-Medium ;
diff --git a/Master/xemtex/gslib/CIDFnmap.sj b/Master/xemtex/gslib/CIDFnmap.sj
new file mode 100644
index 00000000000..70a8732a648
--- /dev/null
+++ b/Master/xemtex/gslib/CIDFnmap.sj
@@ -0,0 +1,81 @@
+%!
+% Copyright (C) 2001 Taiji Yamada and gs-cjk project
+%
+% This file is part of GNU Ghostscript.
+%
+% GNU Ghostscript is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
+% to anyone for the consequences of using it or for whether it serves any
+% particular purpose or works at all, unless he says so in writing. Refer
+% to the GNU General Public License for full details.
+%
+% Everyone is granted permission to copy, modify and redistribute GNU
+% Ghostscript, but only under the conditions described in the GNU General
+% Public License. A copy of this license is supposed to have been given
+% to you along with GNU Ghostscript so you can know your rights and
+% responsibilities. It should be in a file named COPYING. Among other
+% things, the copyright notice and this notice must be preserved on all
+% copies.
+
+% $Id: CIDFnmap.sj,v 1.1.2.2 2002/02/11 20:36:45 giles Exp $
+% CID fontmap for japanese-shift-jis encoding CIDFontName
+
+(‚l‚r–¾’©) /MS-Mincho ;
+/#82l#82r#96#BE#92#A9 /MS-Mincho ;
+(‚l‚r‚o–¾’©) /MS-PMincho ;
+/#82l#82r#82o#96#BE#92#A9 /MS-PMincho ;
+(‚l‚r –¾’©) /MS-Mincho ;
+/#82l#82r#20#96#BE#92#A9 /MS-Mincho ;
+(‚l‚r ‚o–¾’©) /MS-PMincho ;
+/#82l#82r#20#82o#96#BE#92#A9 /MS-PMincho ;
+
+(@‚l‚r–¾’©) /MS-Mincho ;
+/@#82l#82r#96#BE#92#A9 /MS-Mincho ;
+(@‚l‚r‚o–¾’©) /MS-PMincho ;
+/@#82l#82r#82o#96#BE#92#A9 /MS-PMincho ;
+(@‚l‚r –¾’©) /MS-Mincho ;
+/@#82l#82r#20#96#BE#92#A9 /MS-Mincho ;
+(@‚l‚r ‚o–¾’©) /MS-PMincho ;
+/@#82l#82r#20#82o#96#BE#92#A9 /MS-PMincho ;
+
+(‚l‚rƒSƒVƒbƒN) /MS-Gothic ;
+/#82l#82r#83S#83V#83b#83N /MS-Gothic ;
+(‚l‚r‚oƒSƒVƒbƒN) /MS-PGothic ;
+/#82l#82r#82o#83S#83V#83b#83N /MS-PGothic ;
+(‚l‚r ƒSƒVƒbƒN) /MS-Gothic ;
+/#82l#82r#20#83S#83V#83b#83N /MS-Gothic ;
+(‚l‚r ‚oƒSƒVƒbƒN) /MS-PGothic ;
+/#82l#82r#20#82o#83S#83V#83b#83N /MS-PGothic ;
+
+(@‚l‚rƒSƒVƒbƒN) /MS-Gothic ;
+/@#82l#82r#83S#83V#83b#83N /MS-Gothic ;
+(@‚l‚r‚oƒSƒVƒbƒN) /MS-PGothic ;
+/@#82l#82r#82o#83S#83V#83b#83N /MS-PGothic ;
+(@‚l‚r ƒSƒVƒbƒN) /MS-Gothic ;
+/@#82l#82r#20#83S#83V#83b#83N /MS-Gothic ;
+(@‚l‚r ‚oƒSƒVƒbƒN) /MS-PGothic ;
+/@#82l#82r#20#82o#83S#83V#83b#83N /MS-PGothic ;
+
+(•½¬–¾’© W3) /HeiseiMin-W3 ;
+(•½¬–¾’©W3) /HeiseiMin-W3 ;
+(•½¬ŠpƒSƒVƒbƒN W5) /HeiseiKakuGo-W5 ;
+(•½¬ŠpƒSƒVƒbƒNW5) /HeiseiKakuGo-W5 ;
+(¬’Ë–¾’© R) /KozMin-Regular ;
+(¬’Ë–¾’©R) /KozMin-Regular ;
+
+%
+% If you found an error at substituting /Adobe-Identity for a fontname
+% in reading a PDF file, and if you are the owner of the actual font
+% named as the fontname then you can use such locale-specific fonts by
+% adding entry as follows:
+%
+% But, recent PDF files do not require /Adobe-Identity, locale-specific
+% fonts. Thus, you may get worse for adding such entry.
+%
+%(HGŠÛºÞ¼¯¸M-PRO) (hgrsmp.ttf) /Identity ;
+%(HG³ž²‘‘Ì-PRO) (hgrskp.ttf) /Identity ;
+%
+% As another choise, following one line acts "a fallback font" for such
+% as locale-specific fonts:
+%
+%/Adobe-Identity (hgrskp.ttf) /Identity ;
diff --git a/Master/xemtex/gslib/Fontmap b/Master/xemtex/gslib/Fontmap
new file mode 100644
index 00000000000..a12c08fa81b
--- /dev/null
+++ b/Master/xemtex/gslib/Fontmap
@@ -0,0 +1,3 @@
+%!
+% See Fontmap.GS for the syntax of real Fontmap files.
+(Fontmap.GS) .runlibfile
diff --git a/Master/xemtex/gslib/Fontmap.ATB b/Master/xemtex/gslib/Fontmap.ATB
new file mode 100644
index 00000000000..517f45240a1
--- /dev/null
+++ b/Master/xemtex/gslib/Fontmap.ATB
@@ -0,0 +1,169 @@
+% Copyright (C) 1994 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: Fontmap.ATB,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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 Aladdin Enterprises
+% 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/Master/xemtex/gslib/Fontmap.ATM b/Master/xemtex/gslib/Fontmap.ATM
new file mode 100644
index 00000000000..5ddf9973040
--- /dev/null
+++ b/Master/xemtex/gslib/Fontmap.ATM
@@ -0,0 +1,186 @@
+% Copyright (C) 1990, 1992, 1994, 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: Fontmap.ATM,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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 Aladdin Enterprises
+% 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/Master/xemtex/gslib/Fontmap.GS b/Master/xemtex/gslib/Fontmap.GS
new file mode 100644
index 00000000000..eaebd9adc83
--- /dev/null
+++ b/Master/xemtex/gslib/Fontmap.GS
@@ -0,0 +1,404 @@
+% Copyright (C) 1996, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: Fontmap.GS,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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.
+
+% 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 ;
+
+/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) ;
+
+% 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
diff --git a/Master/xemtex/gslib/Fontmap.OS2 b/Master/xemtex/gslib/Fontmap.OS2
new file mode 100644
index 00000000000..bab846c7408
--- /dev/null
+++ b/Master/xemtex/gslib/Fontmap.OS2
@@ -0,0 +1,215 @@
+% Copyright (C) 1990, 1992, 1993, 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: Fontmap.OS2,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/Fontmap.OSF b/Master/xemtex/gslib/Fontmap.OSF
new file mode 100644
index 00000000000..563f14a995f
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/Fontmap.SGI b/Master/xemtex/gslib/Fontmap.SGI
new file mode 100644
index 00000000000..22fa0b2073b
--- /dev/null
+++ b/Master/xemtex/gslib/Fontmap.SGI
@@ -0,0 +1,406 @@
+% Copyright (C) 1996, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: Fontmap.SGI,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+%
+% 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/Master/xemtex/gslib/Fontmap.Sol b/Master/xemtex/gslib/Fontmap.Sol
new file mode 100644
index 00000000000..a8c6fe25765
--- /dev/null
+++ b/Master/xemtex/gslib/Fontmap.Sol
@@ -0,0 +1,487 @@
+% Copyright (C) 1996, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: Fontmap.Sol,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/Fontmap.Ult b/Master/xemtex/gslib/Fontmap.Ult
new file mode 100644
index 00000000000..d68d95a7c79
--- /dev/null
+++ b/Master/xemtex/gslib/Fontmap.Ult
@@ -0,0 +1,147 @@
+% Copyright (C) 1990, 1995, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: Fontmap.Ult,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/Fontmap.VMS b/Master/xemtex/gslib/Fontmap.VMS
new file mode 100644
index 00000000000..e58ce48c61d
--- /dev/null
+++ b/Master/xemtex/gslib/Fontmap.VMS
@@ -0,0 +1,424 @@
+% 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/Master/xemtex/gslib/Info-macos.plist b/Master/xemtex/gslib/Info-macos.plist
new file mode 100644
index 00000000000..9ece6edc4fa
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/acctest.ps b/Master/xemtex/gslib/acctest.ps
new file mode 100644
index 00000000000..f32c25a7887
--- /dev/null
+++ b/Master/xemtex/gslib/acctest.ps
@@ -0,0 +1,100 @@
+%!
+% Check that operators do their access tests correctly.
+% $Id: acctest.ps,v 1.1.6.1 2002/04/10 09:22:58 giles Exp $
+
+% 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/Master/xemtex/gslib/addxchar.ps b/Master/xemtex/gslib/addxchar.ps
new file mode 100644
index 00000000000..e85ddb659f3
--- /dev/null
+++ b/Master/xemtex/gslib/addxchar.ps
@@ -0,0 +1,358 @@
+% Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: addxchar.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Add the Central European and other Adobe extended Latin characters to a
+% Type 1 font.
+% Requires -dWRITESYSTEMDICT to disable access protection.
+
+(type1ops.ps) runlibfile
+
+% ---------------- Utilities ---------------- %
+
+/addce_dict 50 dict def
+addce_dict begin
+
+% Define the added copyright notice.
+/addednotice (. Portions Copyright (C) 1999 Aladdin Enterprises.) def
+
+% Open a font for modification by removing the FID and changing the
+% FontName. Removing UniqueID and XUID is not necessary, since we
+% will only be adding characters.
+/openfont { % <name> <font> openfont <name> <font'>
+ dup length dict copy
+ dup /FID undef
+ dup /FontName 3 index put
+} def
+
+% Do the equivalent of false charpath for a glyph.
+% This should really be an operator!
+/glyphpath { % <glyph> glyphpath -
+ currentfont /Encoding get 0 3 -1 roll put
+ <00> false charpath
+} def
+
+% Do the equivalent of charpath + pathbbox for a glyph.
+/glyphbbox { % <glyph> glyphbbox <llx> <lly> <urx> <ury>
+ % We cache this value, because it's expensive to compute.
+ BBoxes 1 index .knownget {
+ exch pop
+ } {
+ gsave newpath 0 0 moveto dup glyphpath [pathbbox] grestore
+ BBoxes 3 -1 roll 2 index put
+ } ifelse aload pop
+} def
+
+% Get the side bearing and width for a glyph.
+/glyphsbw { % <glyph> glyphsbw <lsbx> <wx>
+ % We cache this value, because it's expensive to compute.
+ SBW 1 index .knownget {
+ exch pop
+ } {
+ dup glyphcs { dup /hsbw eq { pop exit } if } forall
+ 2 array astore
+ SBW 3 -1 roll 2 index put
+ } ifelse aload pop
+} def
+
+% Get the CharString for a glyph, as an array.
+/glyphcs { % <glyph> glyphcs <array>
+ CharStrings exch get
+ 4330 exch dup length string .type1decrypt exch pop
+ dup length lenIV sub lenIV exch getinterval
+ 0 () /SubFileDecode filter [ exch charstack_read ]
+} def
+
+% Find an occurrence of a value in an array.
+/asearch { % <array> <value> asearch <index> true
+ % <array> <value> asearch false
+ false 0 4 2 roll exch {
+ % Stack: false index value element
+ 2 copy eq { pop pop exch not exch dup exit } if
+ exch 1 add exch
+ } forall pop pop
+} def
+
+% Convert an array back to a CharString.
+/csdef { % <glyph> <array> csdef -
+ charproc_string
+ 4330 exch dup .type1encrypt exch pop readonly
+ CharStrings 3 1 roll put
+} def
+
+% Split an accented character name.
+/splitaccented { % <Baccent> splitaccented <Baccent> <B> <accent>
+ dup =string cvs
+ dup 0 1 getinterval cvn
+ exch dup length 1 sub 1 exch getinterval cvn
+} def
+
+% Begin the definition of a 'seac' character.
+% Defines accent, base, abox, bbox.
+% The initial dx lines up the origins of the base and the accent.
+/beginseac { % <bchar> <achar> beginseac
+ % -mark- <lsbx> <wx> /hsbw <asb> <dx>
+ /accent exch def /base exch def
+ /abox [accent glyphbbox] def
+ /bbox [base glyphbbox] def
+ [ base glyphsbw /hsbw accent glyphsbw pop
+ dup 4 index sub
+} def
+
+% Center the accent over the base of a 'seac' character.
+/centeraccent { % <dx> centeraccent <adx>
+ bbox 2 get bbox 0 get add 2 div
+ abox 2 get abox 0 get add 2 div
+ sub add
+} def
+
+% Finish the definition of a 'seac' character.
+/finishseac { % <charname> -mark- ... <adx> <ady> finishseac -
+ exch cvi exch cvi
+ charindex base get charindex accent get /seac ] csdef
+} def
+
+% ---------------- Main program ---------------- %
+
+% Define accented characters that can be made with seac,
+% with the accent centered over the character.
+/seacchars [
+ /Abreve /Amacron
+ /Cacute /Ccaron /Dcaron
+ /Ecaron /Edotaccent /Emacron
+ /Gbreve
+ /Idotaccent /Imacron
+ /Lacute
+ /Nacute /Ncaron
+ /Ohungarumlaut /Omacron
+ /Racute /Rcaron
+ /Sacute /Scedilla
+ /Tcaron
+ /Uhungarumlaut /Umacron /Uogonek /Uring
+ /Zacute /Zdotaccent
+ /abreve /amacron
+ /cacute /ccaron
+ /ecaron /edotaccent /emacron
+ /gbreve
+ /lacute
+ /nacute /ncaron
+ /ohungarumlaut /omacron
+ /racute /rcaron
+ /sacute /scedilla
+ /uhungarumlaut /umacron /uring
+ /zacute /zdotaccent
+] def
+
+% Define seac characters where the accent lines up with the right
+% edge of the character.
+/seacrightchars [
+ /Aogonek /Eogonek /Iogonek /aogonek /eogonek /iogonek /uogonek
+] def
+
+% Define seac characters where the caron becomes an appended quoteright.
+/seaccaronchars [
+ /dcaron /lcaron /tcaron
+] def
+
+% Define seac characters using commaaccent.
+/seaccommachars [
+ /Gcommaaccent /Kcommaaccent /Lcommaaccent /Ncommaaccent /Rcommaaccent
+ /Scommaaccent /Tcommaaccent
+ /gcommaaccent /kcommaaccent /lcommaaccent /ncommaaccent /rcommaaccent
+ /scommaaccent /tcommaaccent
+] def
+
+% Define the characters copied from the Symbol font.
+/symbolchars [
+ /Delta /greaterequal /lessequal /lozenge /notequal /partialdiff
+ /summation
+] def
+
+% Define the procedures for editing the commaaccent character.
+% Delete all the hints, since it's too hard to adjust them.
+/caedit mark
+ /rmoveto { exch commatop sub cvi exch }
+ /hstem { pop pop pop }
+ /vstem 1 index
+ /callothersubr {
+ dup 3 eq { 4 { pop } repeat /skip true def } if
+ }
+ /pop { skip { pop /skip false def } if }
+.dicttomark def
+
+/addce { % <name> <font> addce <font'>
+ 20 dict begin
+ /origfont 1 index def
+ openfont
+ dup /CharStrings 2 copy get dup length dict copy put
+ dup /Encoding 2 copy get dup length array copy put
+ dup /FontInfo 2 copy get dup length dict copy put
+ definefont /font exch def
+ currentdict font end begin begin
+ font 1000 scalefont setfont
+ /symbolfont /Symbol findfont def
+ /BBoxes CharStrings length dict def
+ /SBW CharStrings length dict def
+
+ /italfactor FontInfo /ItalicAngle .knownget {
+ neg dup sin exch cos div
+ } {
+ 0
+ } ifelse def
+
+ % Invert the Encoding (needed for seac).
+
+ /charindex 256 dict def
+ 0 1 255 {
+ charindex exch Encoding 1 index get exch put
+ } for
+
+ % Add the commaaccent character, by moving the comma downward.
+
+ /comma glyphbbox /commatop exch def pop pop pop
+ /comma glyphcs
+ /skip false def
+ [ exch { caedit 1 index .knownget { exec } if } forall ]
+ /commaaccent exch csdef
+
+ % Add the accented characters that can be made with seac.
+
+ seacchars {
+ splitaccented beginseac
+ centeraccent
+ % If the accent would collide with the base character,
+ % raise it a little.
+ abox 1 get bbox 3 get sub dup 0 le {
+ % ... but not if the accent is in the low position.
+ abox 1 get 0 gt {
+ neg 60 add
+ % Adjust the X position if italic.
+ dup italfactor mul 3 -1 roll add exch
+ } {
+ pop 0
+ } ifelse
+ } {
+ pop 0
+ } ifelse
+ finishseac
+ } forall
+
+ seacrightchars {
+ splitaccented beginseac
+ bbox 2 get abox 2 get sub add % line up right edges
+ 0 finishseac
+ } forall
+
+ /dcroat /d /hyphen beginseac
+ bbox 2 get abox 2 get sub add % line up right edges
+ 0 finishseac
+
+ /imacron /dotlessi /macron beginseac
+ centeraccent
+ 0 finishseac
+
+ /Lcaron /L /quoteright beginseac
+ bbox 2 get abox 2 get sub add % line up right edges
+ 0 finishseac
+
+ seaccaronchars {
+ dup =string cvs 0 1 getinterval cvn /quoteright beginseac
+ % Move the quote to the right of the character.
+ bbox 2 get abox 0 get sub 50 add add
+ % Adjust the character width as well.
+ 4 -1 roll abox 2 get abox 0 get sub 50 add add cvi 4 1 roll
+ 0 finishseac
+ } forall
+
+ seaccommachars {
+ dup =string cvs 0 1 getinterval cvn /comma beginseac
+ centeraccent
+ commatop neg
+ % Lower the accent if the character extends below
+ % the baseline
+ bbox 1 get 0 .min add
+ finishseac
+ } forall
+
+ % Add the characters from the Symbol font.
+ % We should scale them to match the FontBBox, but we don't.
+
+ symbolchars {
+ symbolfont /CharStrings get 1 index get
+ CharStrings 3 1 roll put
+ } forall
+
+ % Add the one remaining character.
+
+ CharStrings /Dcroat CharStrings /Eth get put
+
+ % Recompute the FontBBox, since some of the accented characters
+ % may have enlarged it.
+
+ /llx 1000 def /lly 1000 def /urx 0 def /ury 0 def
+ CharStrings {
+ pop glyphbbox
+ ury .max /ury exch def urx .max /urx exch def
+ lly .min /lly exch def llx .min /llx exch def
+ } forall
+ /FontBBox llx cvi lly cvi urx ceiling cvi ury ceiling cvi 4 packedarray def
+
+ % Restore the Encoding and wrap up.
+
+ [/Copyright /Notice] {
+ FontInfo 1 index .knownget {
+ addednotice concatstrings FontInfo 3 1 roll put
+ } {
+ pop
+ } ifelse
+ } forall
+ FontName font openfont
+ dup /Encoding origfont /Encoding get put
+ definefont
+
+ end end
+} def
+
+currentdict end readonly pop % addce_dict
+
+/addce { addce_dict begin addce end } def
+
+% ---------------- Integration ---------------- %
+
+% We would like to patch the font loader so that it adds the extended
+% Latin characters automatically. We haven't done this yet.
+
+% ---------------- Test program ---------------- %
+
+/TEST where { pop TEST } { false } ifelse {
+ /FONT where { pop } { /FONT /Palatino-Italic def } ifelse
+ (unprot.ps) runlibfile
+ unprot
+ (wrfont.ps) runlibfile
+ wrfont_dict begin
+ /eexec_encrypt true def
+ /binary_CharStrings true def
+ end
+ save
+ FONT findfont
+ /Latin-CE exch addce setfont
+ (t.ce.pfb) (w) file dup writefont closefile
+ restore
+ (prfont.ps) runlibfile
+ (t.ce.pfb) (r) file .loadfont
+ /Latin-CE DoFont
+ quit
+} if
diff --git a/Master/xemtex/gslib/afmdiff.awk b/Master/xemtex/gslib/afmdiff.awk
new file mode 100644
index 00000000000..7e5339ceb75
--- /dev/null
+++ b/Master/xemtex/gslib/afmdiff.awk
@@ -0,0 +1,150 @@
+###=====================================================================
+### 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 -c3 -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/Master/xemtex/gslib/align.ps b/Master/xemtex/gslib/align.ps
new file mode 100644
index 00000000000..ee1ba89fa3f
--- /dev/null
+++ b/Master/xemtex/gslib/align.ps
@@ -0,0 +1,74 @@
+% Copyright (C) 1989, 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: align.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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 /.MarginsHWResolution 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/Master/xemtex/gslib/bdftops b/Master/xemtex/gslib/bdftops
new file mode 100644
index 00000000000..2726410c1a5
--- /dev/null
+++ b/Master/xemtex/gslib/bdftops
@@ -0,0 +1,3 @@
+#!/bin/sh
+# $Id: bdftops,v 1.2 2001/03/27 21:15:55 alexcher Exp $
+exec gs -q -dBATCH -dNODISPLAY -- bdftops.ps "$@"
diff --git a/Master/xemtex/gslib/bdftops.bat b/Master/xemtex/gslib/bdftops.bat
new file mode 100644
index 00000000000..43686b714bb
--- /dev/null
+++ b/Master/xemtex/gslib/bdftops.bat
@@ -0,0 +1,5 @@
+@echo off
+@rem $Id: bdftops.bat,v 1.3 2001/03/27 21:15:55 alexcher Exp $
+
+call gssetgs.bat
+%GSC% -q -dBATCH -dNODISPLAY -- bdftops.ps %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/xemtex/gslib/bdftops.cmd b/Master/xemtex/gslib/bdftops.cmd
new file mode 100755
index 00000000000..a6292b9cd45
--- /dev/null
+++ b/Master/xemtex/gslib/bdftops.cmd
@@ -0,0 +1,7 @@
+/* $Id: bdftops.cmd,v 1.2 2001/03/27 21:15:55 alexcher Exp $ */
+/*
+ * This file is maintained by a user: if you have any questions about it,
+ * please contact Mark Hale (mark.hale@physics.org).
+ */
+
+@gsos2 -q -dBATCH -dNODISPLAY -- bdftops.ps %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/xemtex/gslib/bdftops.ps b/Master/xemtex/gslib/bdftops.ps
new file mode 100644
index 00000000000..af7b183487c
--- /dev/null
+++ b/Master/xemtex/gslib/bdftops.ps
@@ -0,0 +1,796 @@
+% Copyright (C) 1990, 1995, 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: bdftops.ps,v 1.3.2.2.2.1 2003/04/12 14:02:38 giles Exp $
+% bdftops.ps
+% Convert a BDF file (possibly with (an) associated AFM file(s))
+% to a PostScript Type 1 font (without eexec encryption).
+% The resulting font will work with any PostScript language interpreter,
+% but not with ATM or other font rasterizers lacking a complete interpreter.
+
+/envBDF 120 dict def
+envBDF begin
+
+% "Import" the image-to-path package.
+% This also brings in the Type 1 opcodes (type1ops.ps).
+ (impath.ps) runlibfile
+
+% "Import" the font-writing package.
+ (wrfont.ps) runlibfile
+ wrfont_dict begin
+ /binary_CharStrings false def
+ /binary_tokens false def
+ /encrypt_CharStrings true def
+ /standard_only true def
+ end
+ /lenIV 0 def
+
+% Invert the StandardEncoding vector.
+ 256 dict dup begin
+ 0 1 255 { dup StandardEncoding exch get exch def } for
+ end /StandardDecoding exch def
+
+% Define the properties copied to FontInfo.
+ mark
+ (COPYRIGHT) /Notice
+ (FAMILY_NAME) /FamilyName
+ (FULL_NAME) /FullName
+ (WEIGHT_NAME) /Weight
+ .dicttomark /properties exch def
+
+% Define the character sequences for synthesizing missing composite
+% characters in the standard encoding.
+ mark
+ /AE [/A /E]
+ /OE [/O /E]
+ /ae [/a /e]
+ /ellipsis [/period /period /period]
+ /emdash [/hyphen /hyphen /hyphen]
+ /endash [/hyphen /hyphen]
+ /fi [/f /i]
+ /fl [/f /l]
+ /germandbls [/s /s]
+ /guillemotleft [/less /less]
+ /guillemotright [/greater /greater]
+ /oe [/o /e]
+ /quotedblbase [/comma /comma]
+ .dicttomark /composites exch def
+
+% Define the procedure for synthesizing composites.
+% This must not be bound.
+ /compose
+ { exch pop
+ FontMatrix Private /composematrix get invertmatrix concat
+ 0 0 moveto
+ dup gsave false charpath pathbbox currentpoint grestore
+ 6 2 roll setcachedevice show
+ } def
+% Define the CharString procedure that calls compose, with the string
+% on the stack. This too must remain unbound.
+ /compose_proc
+ { Private /compose get exec
+ } def
+
+% Define aliases for missing characters similarly.
+ mark
+ /acute /quoteright
+ /bullet /asterisk
+ /cedilla /comma
+ /circumflex /asciicircum
+ /dieresis /quotedbl
+ /dotlessi /i
+ /exclamdown /exclam
+ /florin /f
+ /fraction /slash
+ /grave /quoteleft
+ /guilsinglleft /less
+ /guilsinglright /greater
+ /hungarumlaut /quotedbl
+ /periodcentered /asterisk
+ /questiondown /question
+ /quotedblleft /quotedbl
+ /quotedblright /quotedbl
+ /quotesinglbase /comma
+ /quotesingle /quoteright
+ /tilde /asciitilde
+ .dicttomark /aliases exch def
+
+% Define overstruck characters that can be synthesized with seac.
+ mark
+ [ /Aacute /Acircumflex /Adieresis /Agrave /Aring /Atilde
+ /Ccedilla
+ /Eacute /Ecircumflex /Edieresis /Egrave
+ /Iacute /Icircumflex /Idieresis /Igrave
+ /Lslash
+ /Ntilde
+ /Oacute /Ocircumflex /Odieresis /Ograve /Otilde
+ /Scaron
+ /Uacute /Ucircumflex /Udieresis /Ugrave
+ /Yacute /Ydieresis
+ /Zcaron
+ /aacute /acircumflex /adieresis /agrave /aring /atilde
+ /ccedilla
+ /eacute /ecircumflex /edieresis /egrave
+ /iacute /icircumflex /idieresis /igrave
+ /lslash
+ /ntilde
+ /oacute /ocircumflex /odieresis /ograve /otilde
+ /scaron
+ /uacute /ucircumflex /udieresis /ugrave
+ /yacute /ydieresis
+ /zcaron
+ ]
+ { dup =string cvs
+ [ exch dup 0 1 getinterval cvn
+ exch dup length 1 sub 1 exch getinterval cvn
+ ]
+ } forall
+ /cent [/c /slash]
+ /daggerdbl [/bar /equal]
+ /divide [/colon /hyphen]
+ /sterling [/L /hyphen]
+ /yen [/Y /equal]
+ .dicttomark /accentedchars exch def
+
+% ------ Output utilities ------ %
+
+ /ws {psfile exch writestring} bind def
+ /wl {ws (\n) ws} bind def
+ /wt {=string cvs ws ( ) ws} bind def
+
+% ------ BDF file parsing utilities ------ %
+
+% Define a buffer for reading the BDF file.
+ /buffer 400 string def
+
+% Read a line from the BDF file into the buffer.
+% Ignore empty (zero-length) lines.
+% Define /keyword as the first word on the line.
+% Define /args as the remainder of the line.
+% If the keyword is equal to commentword, skip the line.
+% (If commentword is equal to a space, never skip.)
+ /nextline
+ { { bdfile buffer readline not
+ { (Premature EOF\n) print stop } if
+ dup length 0 ne { exit } if pop
+ }
+ loop
+ ( ) search
+ { /keyword exch def pop }
+ { /keyword exch def () }
+ ifelse
+ /args exch def
+ keyword commentword eq { nextline } if
+ } bind def
+
+% Get a word argument from args. We do *not* copy the string.
+ /warg % warg -> string
+ { args ( ) search
+ { exch pop exch }
+ { () }
+ ifelse /args exch def
+ } bind def
+
+% Get an integer argument from args.
+ /iarg % iarg -> int
+ { warg cvi
+ } bind def
+
+% Get a numeric argument from args.
+ /narg % narg -> int|real
+ { warg cvr
+ dup dup cvi eq { cvi } if
+ } bind def
+
+% Convert the remainder of args into a string.
+ /remarg % remarg -> string
+ { args copystring
+ } bind def
+
+% Get a string argument that occupies the remainder of args.
+ /sarg % sarg -> string
+ { args (") anchorsearch
+ { pop /args exch def } { pop } ifelse
+ args args length 1 sub get (") 0 get eq
+ { args 0 args length 1 sub getinterval /args exch def } if
+ args copystring
+ } bind def
+
+% Check that the keyword is the expected one.
+ /checkline % (EXPECTED-KEYWORD) checkline ->
+ { dup keyword ne
+ { (Expected ) print =
+ (Line=) print keyword print ( ) print args print (\n) print stop
+ } if
+ pop
+ } bind def
+
+% Read a line and check its keyword.
+ /getline % (EXPECTED-KEYWORD) getline ->
+ { nextline checkline
+ } bind def
+
+% Find the first/last non-zero bit of a non-zero byte.
+ /fnzb
+ { 0 { exch dup 128 ge { pop exit } { dup add exch 1 add } ifelse }
+ loop
+ } bind def
+ /lnzb
+ { 7 { exch dup 1 and 0 ne { pop exit } { -1 bitshift exch 1 sub } ifelse }
+ loop
+ } bind def
+
+% ------ Type 1 encoding utilities ------ %
+
+% Parse the side bearing and width information that begins a CharString.
+% Arguments: charstring. Result: sbx sby wx wy substring.
+ /parsesbw
+ { mark exch lenIV
+ { % stack: mark ... string dropcount
+ dup 2 index length exch sub getinterval
+ dup 0 get dup 32 lt { pop exit } if
+ dup 246 le
+ { 139 sub exch 1 }
+ { dup 250 le
+ { 247 sub 8 bitshift 108 add 1 index 1 get add exch 2 }
+ { dup 254 le
+ { 251 sub 8 bitshift 108 add 1 index 1 get add neg exch 2 }
+ { pop dup 1 get 128 xor 128 sub
+ 8 bitshift 1 index 2 get add
+ 8 bitshift 1 index 3 get add
+ 8 bitshift 1 index 4 get add exch 5
+ } ifelse
+ } ifelse
+ } ifelse
+ } loop
+ counttomark 3 eq { 0 3 1 roll 0 exch } if
+ 6 -1 roll pop
+ } bind def
+
+% Find the side bearing and width information that begins a CharString.
+% Arguments: charstring. Result: charstring sizethroughsbw.
+ /findsbw
+ { dup parsesbw 4 { exch pop } repeat skipsbw
+ } bind def
+ /skipsbw % charstring sbwprefix -> sizethroughsbw
+ { length 1 index length exch sub
+ 2 copy get 12 eq { 2 } { 1 } ifelse add
+ } bind def
+
+% Encode a number, and append it to a string.
+% Arguments: str num. Result: newstr.
+ /concatnum
+ { dup dup -107 ge exch 107 le and
+ { 139 add 1 string dup 0 3 index put }
+ { dup dup -1131 ge exch 1131 le and
+ { dup 0 ge { 16#f694 } { neg 16#fa94 } ifelse add
+ 2 string dup 0 3 index -8 bitshift put
+ dup 1 3 index 255 and put
+ }
+ { 5 string dup 0 255 put exch
+ 2 copy 1 exch -24 bitshift 255 and put
+ 2 copy 2 exch -16 bitshift 255 and put
+ 2 copy 3 exch -8 bitshift 255 and put
+ 2 copy 4 exch 255 and put
+ exch
+ }
+ ifelse
+ }
+ ifelse exch pop concatstrings
+ } bind def
+
+% ------ Point arithmetic utilities ------ %
+
+ /ptadd { exch 4 -1 roll add 3 1 roll add } bind def
+ /ptexch { 4 2 roll } bind def
+ /ptneg { neg exch neg exch } bind def
+ /ptpop { pop pop } bind def
+ /ptsub { ptneg ptadd } bind def
+
+% ------ The main program ------ %
+
+ /readBDF % <infilename> <outfilename> <fontname>
+ % <encodingname> <uniqueID> <xuid> readBDF -> <font>
+ { /xuid exch def % may be null
+ /uniqueID exch def % may be -1
+ /encodingname exch def
+ /encoding encodingname cvx exec def
+ /fontname exch def
+ /psname exch def
+ /bdfname exch def
+ gsave % so we can set the CTM to the font matrix
+
+% Open the input files. We don't open the output file until
+% we've done a minimal validity check on the input.
+ bdfname (r) file /bdfile exch def
+ /commentword ( ) def
+
+% Check for the STARTFONT.
+ (STARTFONT) getline
+ args (2.1) ne { (Not version 2.1\n) print stop } if
+
+% Initialize the font.
+ /Font 20 dict def
+ Font begin
+ /FontName fontname def
+ /PaintType 0 def
+ /FontType 1 def
+ uniqueID 0 gt { /UniqueID uniqueID def } if
+ xuid null ne { /XUID xuid def } if
+ /Encoding encoding def
+ /FontInfo 20 dict def
+ /Private 20 dict def
+ currentdict end currentdict end
+ exch begin begin % insert font above environment
+
+% Initialize the Private dictionary in the font.
+ Private begin
+ /-! {string currentfile exch readhexstring pop} readonly def
+ /-| {string currentfile exch readstring pop} readonly def
+ /|- {readonly def} readonly def
+ /| {readonly put} readonly def
+ /BlueValues [] def
+ /lenIV lenIV def
+ /MinFeature {16 16} def
+ /password 5839 def
+ /UniqueID uniqueID def
+ end % Private
+
+% Invert the Encoding, for synthesizing composite characters.
+ /decoding encoding length dict def
+ 0 1 encoding length 1 sub
+ { dup encoding exch get exch decoding 3 1 roll put }
+ for
+
+% Now open the output file.
+ psname (w) file /psfile exch def
+
+% Put out a header compatible with the Adobe "standard".
+ (%!FontType1-1.0: ) ws fontname wt (000.000) wl
+ (% This is a font description converted from ) ws
+ bdfname wl
+ (% by bdftops running on ) ws
+ statusdict /product get ws ( revision ) ws
+ revision =string cvs ws (.) wl
+
+% Copy the initial comments, up to FONT.
+ true
+ { nextline
+ keyword (COMMENT) ne {exit} if
+ { (% Here are the initial comments from the BDF file:\n%) wl
+ } if false
+ (%) ws remarg wl
+ } loop pop
+ () wl
+ /commentword (COMMENT) def % do skip comments from now on
+
+% Read and process the FONT, SIZE, and FONTBOUNDINGBOX.
+ % If we cared about FONT, we'd use it here. If the BDF files
+ % from MIT had PostScript names rather than X names, we would
+ % care; but what's there is unusable, so we discard FONT.
+ % The FONTBOUNDINGBOX may not be reliable, so we discard it too.
+ (FONT) checkline
+ (SIZE) getline
+ /pointsize iarg def /xres iarg def /yres iarg def
+ (FONTBOUNDINGBOX) getline
+ nextline
+
+% Initialize the font bounding box bookeeping.
+ /fbbxo 1000 def
+ /fbbyo 1000 def
+ /fbbxe -1000 def
+ /fbbye -1000 def
+
+% Read and process the properties. We only care about a few of them.
+ keyword (STARTPROPERTIES) eq
+ { iarg
+ { nextline
+ properties keyword known
+ { FontInfo properties keyword get sarg readonly put
+ } if
+ } repeat
+ (ENDPROPERTIES) getline
+ nextline
+ } if
+
+% Compute and set the FontMatrix.
+ Font /FontMatrix
+ [ 0.001 0 0 0.001 xres mul yres div 0 0 ] readonly
+ dup setmatrix put
+
+% Read and process the header for the bitmaps.
+ (CHARS) checkline
+ /ccount iarg def
+
+% Initialize the CharStrings dictionary.
+ /charstrings ccount
+ composites length add
+ aliases length add
+ accentedchars length add
+ 1 add dict def % 1 add for .notdef
+ /isfixedwidth true def
+ /fixedwidth null def
+ /subrcount 0 def
+ /subrs [] def
+
+% Read the bitmap data. This reads the remainder of the file.
+% We do this before processing the bitmaps so that we can compute
+% the correct FontBBox first.
+ /chardata ccount dict def
+ ccount -1 1
+ { (STARTCHAR) getline
+ /charname remarg def
+ (ENCODING) getline
+ /eindex iarg def
+ eindex dup 0 ge exch 255 le and
+ { charname /charname StandardEncoding eindex get def
+ charname /.notdef eq eindex 0 gt and
+ { /charname (A) eindex =string cvs concatstrings cvn def
+ }
+ if
+ (/) print charname =string cvs print (,) print print
+ }
+ { (/) print charname print
+ }
+ ifelse
+ 10 mod 1 eq { (\n) print flush } if
+ (SWIDTH) getline
+ /swx iarg pointsize mul 1000 div xres mul 72 div def
+ /swy iarg pointsize mul 1000 div xres mul 72 div def
+ (DWIDTH) getline % Ignore, use SWIDTH instead
+ (BBX) getline
+ /bbw iarg def /bbh iarg def /bbox iarg def /bboy iarg def
+ nextline
+ keyword (ATTRIBUTES) eq
+ { nextline
+ } if
+ (BITMAP) checkline
+
+% Update the font bounding box.
+ /fbbxo fbbxo bbox .min def
+ /fbbyo fbbyo bboy .min def
+ /fbbxe fbbxe bbox bbw add .max def
+ /fbbye fbbye bboy bbh add .max def
+
+% Read the bits for this character.
+ /raster bbw 7 add 8 idiv def
+ /cbits raster bbh mul string def
+ cbits length 0 gt
+ { 0 raster cbits length raster sub
+ { cbits exch raster getinterval
+ bdfile buffer readline not
+ { (EOF in bitmap\n) print stop } if
+ % stack has <cbits.interval> <buffer.interval>
+ 0 () /SubFileDecode filter
+ exch 2 copy readhexstring pop pop pop closefile
+ } for
+ } if
+
+ (ENDCHAR) getline
+
+% Save the character data.
+ chardata charname [swx swy bbw bbh bbox bboy cbits] put
+ } for
+
+ (ENDFONT) getline
+
+% Allocate the buffers for the bitmap and the outline,
+% according to the font bounding box.
+ /fbbw fbbxe fbbxo sub def
+ /fbbh fbbye fbbyo sub def
+ /fraster fbbw 7 add 8 idiv def
+ /bits fraster fbbh mul 200 .max 65535 .min string def
+ /outline bits length 6 mul 65535 .min string def
+
+% Process the characters.
+ chardata
+ { exch /charname exch def aload pop
+ /cbits exch def
+ /bboy exch def /bbox exch def
+ /bbh exch def /bbw exch def
+ /swy exch def /swx exch def
+
+% The bitmap handed to type1imagepath must have the correct height,
+% because type1imagepath uses this to compute the scale factor,
+% so we have to clear the unused parts of it.
+ /raster bbw 7 add 8 idiv def
+ bits dup 0 1 raster fbbh mul 1 sub
+ { 0 put dup } for
+ pop pop
+ bits raster fbbh bbh sub mul cbits putinterval
+
+% Compute the font entry, converting the bitmap to an outline.
+ bits 0 raster fbbh mul getinterval % the bitmap image
+ bbw fbbh % bitmap width & height
+ swx swy % width x & y
+ bbox neg bboy neg % origin x & y
+ % Account for lenIV when converting the outline.
+ outline lenIV outline length lenIV sub getinterval
+ type1imagepath
+ length lenIV add
+ outline exch 0 exch getinterval
+
+% Check for a fixed width font.
+ isfixedwidth
+ { fixedwidth null eq
+ { /fixedwidth swx def }
+ { fixedwidth swx ne { /isfixedwidth false def } if }
+ ifelse
+ } if
+
+% Finish up the character.
+ copystring
+ charname exch charstrings 3 1 roll put
+ } forall
+
+% Add CharStrings entries for aliases.
+ aliases
+ { charstrings 2 index known not charstrings 2 index known and
+ { charstrings exch get charstrings 3 1 roll put
+ }
+ { pop pop
+ }
+ ifelse
+ }
+ forall
+
+% If this is not a fixed-width font, synthesize missing characters
+% out of available ones.
+ isfixedwidth not
+ { false composites
+ { 1 index charstrings exch known not
+ 1 index { decoding exch known and } forall
+ { ( /) print 1 index bits cvs print
+ /combine exch def
+ 0 1 combine length 1 sub
+ { dup combine exch get decoding exch get
+ bits 3 1 roll put
+ } for
+ bits 0 combine length getinterval copystring
+ [ exch /compose_proc load aload pop ] cvx
+ charstrings 3 1 roll put
+ pop true
+ }
+ { pop pop }
+ ifelse
+ }
+ forall flush
+ { Private /composematrix matrix put
+ Private /compose /compose load put
+ }
+ if
+ }
+ if
+
+% Synthesize accented characters with seac if needed and possible.
+ accentedchars
+ { aload pop /accent exch def /base exch def
+ buffer cvs /accented exch def
+ charstrings accented known not
+ charstrings base known and
+ charstrings accent known and
+ StandardDecoding base known and
+ StandardDecoding accent known and
+ encoding StandardDecoding base get get base eq and
+ encoding StandardDecoding accent get get accent eq and
+ { ( /) print accented print
+ charstrings base get findsbw 0 exch getinterval
+ /acstring exch def % start with sbw of base
+ charstrings accent get parsesbw
+ 4 { pop } repeat % just leave sbx
+ acstring exch concatnum
+ 0 concatnum 0 concatnum % adx ady
+ decoding base get concatnum % bchar
+ decoding accent get concatnum % achar
+ s_seac concatstrings
+ charstrings exch accented copystring exch put
+ } if
+ } forall
+
+% Make a CharStrings entry for .notdef.
+ outline lenIV <8b8b0d0e> putinterval % 0 0 hsbw endchar
+ charstrings /.notdef outline 0 lenIV 4 add getinterval copystring put
+
+% Encrypt the CharStrings and Subrs (in place).
+ charstrings
+ { % Be careful not to encrypt aliased characters twice,
+ % since they share their CharString.
+ aliases 2 index known
+ { charstrings aliases 3 index get .knownget
+ { 1 index ne }
+ { true }
+ ifelse
+ }
+ { true
+ }
+ ifelse
+ 1 index type /stringtype eq and
+ { 4330 exch dup .type1encrypt exch pop
+ readonly charstrings 3 1 roll put
+ }
+ { pop pop
+ }
+ ifelse
+ }
+ forall
+ 0 1 subrcount 1 sub
+ { dup subrs exch get
+ 4330 exch dup .type1encrypt exch pop
+ subrs 3 1 roll put
+ }
+ for
+
+% Make most of the remaining entries in the font dictionaries.
+
+% The Type 1 font machinery really only works with a 1000 unit
+% character coordinate system. Set this up here, by computing the factor
+% to make the X entry in the FontMatrix come out at exactly 0.001.
+ /fontscale 1000 fbbh div yres mul xres div def
+ Font /FontBBox
+ [ fbbxo fontscale mul
+ fbbyo fontscale mul
+ fbbxe fontscale mul
+ fbbye fontscale mul
+ ] cvx readonly put
+ Font /CharStrings charstrings readonly put
+ FontInfo /FullName known not
+ { % Some programs insist on FullName being present.
+ FontInfo /FullName FontName dup length string cvs put
+ }
+ if
+ FontInfo /isFixedPitch isfixedwidth put
+ subrcount 0 gt
+ { Private /Subrs subrs 0 subrcount getinterval readonly put
+ } if
+
+% Determine the italic angle and underline position
+% by actually installing the font.
+ save
+ /_temp_ Font definefont setfont
+ [1000 0 0 1000 0 0] setmatrix % mitigate rounding problems
+% The italic angle is the multiple of -5 degrees
+% that minimizes the width of the 'I'.
+ 0 9999 0 5 85
+ { dup rotate
+ newpath 0 0 moveto (I) false charpath
+ dup neg rotate
+ pathbbox pop exch pop exch sub
+ dup 3 index lt { 4 -2 roll } if
+ pop pop
+ }
+ for pop
+% The underline position is halfway between the bottom of the 'A'
+% and the bottom of the FontBBox.
+ newpath 0 0 moveto (A) false charpath
+ FontMatrix concat
+ pathbbox pop pop exch pop
+% Put the values in FontInfo.
+ 3 -1 roll
+ restore
+ Font /FontBBox get 1 get add 2 div cvi
+ dup FontInfo /UnderlinePosition 3 -1 roll put
+ 2 div abs FontInfo /UnderlineThickness 3 -1 roll put
+ FontInfo /ItalicAngle 3 -1 roll put
+
+% Clean up and finish.
+ grestore
+ bdfile closefile
+ Font currentdict end end begin % remove font from dict stack
+ (\n) print flush
+
+ } bind def
+
+% ------ Reader for AFM files ------ %
+
+% Dictionary for looking up character keywords
+ /cmdict 6 dict dup begin
+ /C { /c iarg def } def
+ /N { /n warg copystring def } def
+ /WX { /w narg def } def
+ /W0X /WX load def
+ /W /WX load def
+ /W0 /WX load def
+ end def
+
+ /readAFM % fontdict afmfilename readAFM -> fontdict
+ { (r) file /bdfile exch def
+ /Font exch def
+ /commentword (Comment) def
+
+% Check for the StartFontMetrics.
+ (StartFontMetrics) getline
+ args cvr 2.0 lt { (Not version 2.0 or greater\n) print stop } if
+
+% Look for StartCharMetrics, then parse the character metrics.
+% The only information we care about is the X width.
+ /metrics 0 dict def
+ { nextline
+ keyword (EndFontMetrics) eq { exit } if
+ keyword (StartCharMetrics) eq
+ { iarg dup dict /metrics exch def
+ { /c -1 def /n null def /w null def
+ nextline buffer
+ { token not { exit } if
+ dup cmdict exch known
+ { exch /args exch def cmdict exch get exec args }
+ { pop }
+ ifelse
+ } loop
+ c 0 ge n null ne or w null ne and
+ { n null eq { /n Font /Encoding get c get def } if
+ metrics n w put
+ }
+ if
+ }
+ repeat
+ (EndCharMetrics) getline
+ } if
+ } loop
+
+% Insert the metrics in the font.
+ metrics length 0 ne
+ { Font /Metrics metrics readonly put
+ } if
+ Font
+ } bind def
+
+end % envBDF
+
+% Enter the main program in the current dictionary.
+/bdfafmtops % infilename afmfilename* outfilename fontname
+ % encodingname uniqueID xuid
+ { envBDF begin
+ 7 -2 roll exch 7 2 roll % afm* in out fontname encodingname uniqueID xuid
+ readBDF % afm* font
+ exch { readAFM } forall
+ save exch
+ dup /FontName get exch definefont
+ setfont
+ psfile writefont
+ restore
+ psfile closefile
+ end
+ } bind def
+
+% If the program was invoked from the command line, run it now.
+[ shellarguments
+ { counttomark 4 ge
+ { dup 0 get
+ dup 48 ge exch 57 le and % last arg starts with a digit?
+ { /StandardEncoding } % no encodingname
+ { cvn } % have encodingname
+ ifelse
+ exch (.) search % next-to-last arg has . in it?
+ { mark 4 1 roll % have xuid
+ { cvi exch pop exch (.) search not { exit } if }
+ loop cvi ]
+ 3 -1 roll cvi exch
+ }
+ { cvi null % no xuid
+ }
+ ifelse
+ counttomark 5 roll
+ counttomark 6 sub array astore
+ 7 -2 roll cvn 7 -3 roll % make sure fontname is a name
+ bdfafmtops
+ }
+ { cleartomark
+ (Usage:\n bdftops xx.bdf [yy1.afm ...] zz.gsf fontname uniqueID [xuid] [encodingname]\n) print flush
+ mark
+ }
+ ifelse
+ }
+if pop
diff --git a/Master/xemtex/gslib/bj8.rpd b/Master/xemtex/gslib/bj8.rpd
new file mode 100644
index 00000000000..fce6c2d4b7d
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/bj8gc12f.upp b/Master/xemtex/gslib/bj8gc12f.upp
new file mode 100644
index 00000000000..fc65a23f9f2
--- /dev/null
+++ b/Master/xemtex/gslib/bj8gc12f.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 8200, (1200DpI)^2, glossy photo card, high quality"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bj8hg12f.upp b/Master/xemtex/gslib/bj8hg12f.upp
new file mode 100644
index 00000000000..94f72352ee0
--- /dev/null
+++ b/Master/xemtex/gslib/bj8hg12f.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 8200, (1200DpI)^2, high gloss photo, high quality"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bj8oh06n.upp b/Master/xemtex/gslib/bj8oh06n.upp
new file mode 100644
index 00000000000..1ce812d24fa
--- /dev/null
+++ b/Master/xemtex/gslib/bj8oh06n.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 8200, (600DpI)^2, OHP, normal quality"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bj8pa06n.upp b/Master/xemtex/gslib/bj8pa06n.upp
new file mode 100644
index 00000000000..295cc065fe6
--- /dev/null
+++ b/Master/xemtex/gslib/bj8pa06n.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 8200, (600DpI)^2, plain paper, normal quality"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bj8pp12f.upp b/Master/xemtex/gslib/bj8pp12f.upp
new file mode 100644
index 00000000000..46ee43d5867
--- /dev/null
+++ b/Master/xemtex/gslib/bj8pp12f.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 8200, (1200DpI)^2, professional photo paper, highest quality"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bj8ts06n.upp b/Master/xemtex/gslib/bj8ts06n.upp
new file mode 100644
index 00000000000..01135066ec6
--- /dev/null
+++ b/Master/xemtex/gslib/bj8ts06n.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 8200, (600DpI)^2, t-shirt transfer, normal quality"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610a0.upp b/Master/xemtex/gslib/bjc610a0.upp
new file mode 100644
index 00000000000..05f389dc6bd
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610a0.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, plain paper high speed, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610a1.upp b/Master/xemtex/gslib/bjc610a1.upp
new file mode 100644
index 00000000000..fcd0afe8b11
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610a1.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, plain paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610a2.upp b/Master/xemtex/gslib/bjc610a2.upp
new file mode 100644
index 00000000000..6c1fb6ad3fd
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610a2.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, coated paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610a3.upp b/Master/xemtex/gslib/bjc610a3.upp
new file mode 100644
index 00000000000..8345ed68731
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610a3.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, transparency film, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610a4.upp b/Master/xemtex/gslib/bjc610a4.upp
new file mode 100644
index 00000000000..d53b879865b
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610a4.upp
@@ -0,0 +1,45 @@
+-supModel="Canon BJC 610, 360x360DpI, back print film, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610a5.upp b/Master/xemtex/gslib/bjc610a5.upp
new file mode 100644
index 00000000000..fb6b5b668fd
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610a5.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, fabric sheet, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610a6.upp b/Master/xemtex/gslib/bjc610a6.upp
new file mode 100644
index 00000000000..438e08453b0
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610a6.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, glossy paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610a7.upp b/Master/xemtex/gslib/bjc610a7.upp
new file mode 100644
index 00000000000..d8333f42c06
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610a7.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, high gloss film, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610a8.upp b/Master/xemtex/gslib/bjc610a8.upp
new file mode 100644
index 00000000000..6ec6804e7b6
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610a8.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, high resolution paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610b1.upp b/Master/xemtex/gslib/bjc610b1.upp
new file mode 100644
index 00000000000..06d1a296b96
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610b1.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 720x720DpI, plain paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610b2.upp b/Master/xemtex/gslib/bjc610b2.upp
new file mode 100644
index 00000000000..d8364600153
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610b2.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 720x720DpI, coated paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610b3.upp b/Master/xemtex/gslib/bjc610b3.upp
new file mode 100644
index 00000000000..79c948ca6fb
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610b3.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 720x720DpI, transparency film, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610b4.upp b/Master/xemtex/gslib/bjc610b4.upp
new file mode 100644
index 00000000000..68b2460b615
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610b4.upp
@@ -0,0 +1,45 @@
+-supModel="Canon BJC 610, 720x720DpI, back print film, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610b6.upp b/Master/xemtex/gslib/bjc610b6.upp
new file mode 100644
index 00000000000..ef46be5e81d
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610b6.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 720x720DpI, glossy paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610b7.upp b/Master/xemtex/gslib/bjc610b7.upp
new file mode 100644
index 00000000000..a12bd827911
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610b7.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 720x720DpI, high gloss paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/bjc610b8.upp b/Master/xemtex/gslib/bjc610b8.upp
new file mode 100644
index 00000000000..c0f036602eb
--- /dev/null
+++ b/Master/xemtex/gslib/bjc610b8.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 720x720DpI, high resolution paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/caption.ps b/Master/xemtex/gslib/caption.ps
new file mode 100644
index 00000000000..81a11c01a01
--- /dev/null
+++ b/Master/xemtex/gslib/caption.ps
@@ -0,0 +1,57 @@
+%!
+% Copyright (C) 1995 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: caption.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Add a "caption" to the bottom of each page.
+/captionsize 20 def
+/caption
+ { /Helvetica //captionsize selectfont
+ (Printed by Aladdin'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 [
+ /showcaption load /exec load
+ currentpagedevice /EndPage get /exec load
+ ] cvx
+>> setpagedevice
+end
diff --git a/Master/xemtex/gslib/cbjc600.ppd b/Master/xemtex/gslib/cbjc600.ppd
new file mode 100644
index 00000000000..fcd0a4d3469
--- /dev/null
+++ b/Master/xemtex/gslib/cbjc600.ppd
@@ -0,0 +1,404 @@
+*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"
+*LanguageVersion: English
+*PCFileName: "CBJC600.PPD"
+*Product: "(Canon Bubble Jet Color 600)"
+*PSVersion: "(2010.351) 0"
+*ModelName: "Canon Bubble Jet Color 600"
+*NickName: "BJC-600"
+
+*% 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
+
+*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
+*Default ThickMedia: 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/Master/xemtex/gslib/cbjc800.ppd b/Master/xemtex/gslib/cbjc800.ppd
new file mode 100644
index 00000000000..d919bd9ed37
--- /dev/null
+++ b/Master/xemtex/gslib/cbjc800.ppd
@@ -0,0 +1,389 @@
+*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"
+*LanguageVersion: English
+*PCFileName: "CBJC800.PPD"
+*Product: "(Canon Bubble Jet Color 800)"
+*PSVersion: "(2010.351) 0"
+*ModelName: "Canon Bubble Jet Color 800"
+*NickName: "BJC-800"
+
+*% 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
+
+*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
+*Default ThickMedia: 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/Master/xemtex/gslib/cdj550.upp b/Master/xemtex/gslib/cdj550.upp
new file mode 100644
index 00000000000..51aa264f65e
--- /dev/null
+++ b/Master/xemtex/gslib/cdj550.upp
@@ -0,0 +1,48 @@
+-supModel="HP Deskjet 550c, 300x300DpI, Gamma=2"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/cdj690.upp b/Master/xemtex/gslib/cdj690.upp
new file mode 100644
index 00000000000..0ec8ea70893
--- /dev/null
+++ b/Master/xemtex/gslib/cdj690.upp
@@ -0,0 +1,52 @@
+-supModel="HP Deskjet 690 Normal Gamma 2.0"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/cdj690ec.upp b/Master/xemtex/gslib/cdj690ec.upp
new file mode 100644
index 00000000000..13e03964956
--- /dev/null
+++ b/Master/xemtex/gslib/cdj690ec.upp
@@ -0,0 +1,54 @@
+-supModel="HP Deskjet 690 Econo-Fast Gamma 2.0"
+-sDEVICE=uniprint
+-sPAPERSIZE=a4
+-dNOPAUSE
+-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/Master/xemtex/gslib/cid2code.ps b/Master/xemtex/gslib/cid2code.ps
new file mode 100644
index 00000000000..48a4c28bef4
--- /dev/null
+++ b/Master/xemtex/gslib/cid2code.ps
@@ -0,0 +1,161 @@
+% Copyright (C) 1998, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: cid2code.ps,v 1.3.4.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/decrypt.ps b/Master/xemtex/gslib/decrypt.ps
new file mode 100644
index 00000000000..51343a422e8
--- /dev/null
+++ b/Master/xemtex/gslib/decrypt.ps
@@ -0,0 +1,14 @@
+% Decrypt an eexec-encoded file.
+% $Id: decrypt.ps,v 1.1.6.1 2002/04/10 09:22:58 giles Exp $
+
+(t.in) (r) file /in exch def
+(t.out) (w) file /out exch def
+256 string /buf exch def
+55665 % eexec encryption seed
+ { in buf readhexstring /more exch def
+ dup .type1decrypt out exch writestring
+ more not { exit } if
+ } loop
+in closefile
+out closefile
+quit
diff --git a/Master/xemtex/gslib/dnj750c.upp b/Master/xemtex/gslib/dnj750c.upp
new file mode 100644
index 00000000000..d97bb89cd82
--- /dev/null
+++ b/Master/xemtex/gslib/dnj750c.upp
@@ -0,0 +1,47 @@
+-supModel="HP Designjet 750c, 300x300DpI, Gamma=2.5, CMY"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/dnj750m.upp b/Master/xemtex/gslib/dnj750m.upp
new file mode 100644
index 00000000000..2f55525cac7
--- /dev/null
+++ b/Master/xemtex/gslib/dnj750m.upp
@@ -0,0 +1,59 @@
+-supModel="HP Designjet 750m, 600x600DpI, Gamma=2.5, CMY"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/docie.ps b/Master/xemtex/gslib/docie.ps
new file mode 100644
index 00000000000..010f48d8cd6
--- /dev/null
+++ b/Master/xemtex/gslib/docie.ps
@@ -0,0 +1,219 @@
+% Copyright (C) 1995 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: docie.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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
+DEBUG { (After RangeLMN Decode: ) print3 } if
+ 3 index /DecodeLMN .knownget { apply3 } if
+DEBUG { (After DecodeLMN Decode: ) print3 } if
+ 3 index /MatrixLMN .knownget { mmult3 } if
+DEBUG { (After MatrixLMN Decode: ) print3 } if
+ } bind def
+
+/csciea % <csdict> <a> csciea <csdict> <x> <y> <z>
+ { 1 index /RangeA .knownget not { r1default } if restrict
+DEBUG { (After RangeA Decode: ) print1 } if
+ 1 index /DecodeA .knownget { exec } if
+DEBUG { (After DecodeA Decode: ) print1 } if
+ 1 index /MatrixA .knownget
+ { { 1 index mul exch } forall pop }
+ { dup dup }
+ ifelse
+DEBUG { (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
+DEBUG { (After RangeABC Decode: ) print3 } if
+ 3 index /DecodeABC .knownget { apply3 } if
+DEBUG { (After DecodeABC Decode: ) print3 } if
+ 3 index /MatrixABC .knownget { mmult3 } if
+DEBUG { (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
+DEBUG { (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
+DEBUG { (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> ...
+ {
+DEBUG { (CIE XYZ = ) print3 } if
+ 3 index /MatrixPQR .knownget { mmult3 } if
+DEBUG { (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
+DEBUG { (After TransformPQR: ) print3 } if
+ 3 index /MatrixPQR .knownget { minvert3 mmult3 } if
+DEBUG { (After MatrixPQR': ) print3 } if
+ 3 index /MatrixLMN .knownget { mmult3 } if
+DEBUG { (After MatrixLMN Encode: ) print3 } if
+ 3 index /EncodeLMN .knownget { apply3 } if
+DEBUG { (After EncodeLMN Encode: ) print3 } if
+ 3 index /RangeLMN .knownget not { r3default } if restrict3
+DEBUG { (After RangeLMN Encode: ) print3 } if
+ 3 index /MatrixABC .knownget { mmult3 } if
+DEBUG { (After MatrixABC Encode: ) print3 } if
+ 3 index /EncodeABC .knownget { apply3 } if
+DEBUG { (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
+DEBUG { (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
+DEBUG { (After RenderTableT: ) print ] dup == aload pop } if
+ }
+ { restrict3
+DEBUG { (After RangeABC Encode: ) print3 } if
+ }
+ ifelse
+ } bind def
+
+% ---------------- Top level control ---------------- %
+
+/mapdict mark
+ /CIEBasedA { 1 get exch csciea currentcolorrendering 4 1 roll crmap } bind
+ /CIEBasedABC { 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/Master/xemtex/gslib/dvipdf b/Master/xemtex/gslib/dvipdf
new file mode 100644
index 00000000000..6f73174abaa
--- /dev/null
+++ b/Master/xemtex/gslib/dvipdf
@@ -0,0 +1,40 @@
+#!/bin/sh
+# $Id: dvipdf,v 1.2 2001/06/22 16:09:22 lpd Exp $
+# Convert DVI to PDF.
+#
+# Please contact Andrew Ford <A.Ford@ford-mason.co.uk> with any questions
+# about this file.
+#
+# Based on ps2pdf
+
+OPTIONS=""
+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.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 -q -f "$infile" | gs $OPTIONS -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile="$outfile" $OPTIONS -c .setpdfwrite -
diff --git a/Master/xemtex/gslib/eps2eps b/Master/xemtex/gslib/eps2eps
new file mode 100644
index 00000000000..14f5d679b44
--- /dev/null
+++ b/Master/xemtex/gslib/eps2eps
@@ -0,0 +1,20 @@
+#!/bin/sh
+# $Id: eps2eps,v 1.3 2001/06/22 16:09:22 lpd Exp $
+# "Distill" Encapsulated PostScript.
+
+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 -q -sDEVICE=epswrite "-sOutputFile=$2" -dNOPAUSE -dBATCH -dSAFER $OPTIONS "$1"
diff --git a/Master/xemtex/gslib/eps2eps.bat b/Master/xemtex/gslib/eps2eps.bat
new file mode 100644
index 00000000000..6be9375698c
--- /dev/null
+++ b/Master/xemtex/gslib/eps2eps.bat
@@ -0,0 +1,26 @@
+@echo off
+@rem $Id: eps2eps.bat,v 1.5 2001/06/22 16:09:22 lpd Exp $
+@rem "Distill" Encapsulated PostScript.
+
+if %1/==/ goto usage
+if %2/==/ goto usage
+call gssetgs.bat
+echo -dNOPAUSE -dBATCH -dSAFER >_.at
+rem Watcom C deletes = signs, so use # instead.
+echo -dDEVICEWIDTH#250000 -dDEVICEHEIGHT#250000 >>_.at
+:cp
+if %3/==/ goto doit
+echo %1 >>_.at
+shift
+goto cp
+
+:doit
+rem Watcom C deletes = signs, so use # instead.
+%GSC% -q -sDEVICE#epswrite -sOutputFile#%2 @_.at %1
+if exist _.at erase _.at
+goto end
+
+:usage
+echo "Usage: eps2eps ...switches... input.eps output.eps"
+
+:end
diff --git a/Master/xemtex/gslib/eps2eps.cmd b/Master/xemtex/gslib/eps2eps.cmd
new file mode 100755
index 00000000000..0fedb254beb
--- /dev/null
+++ b/Master/xemtex/gslib/eps2eps.cmd
@@ -0,0 +1,36 @@
+/* $Id: eps2eps.cmd,v 1.2 2000/12/30 18:45:37 alexcher Exp $ */
+/*
+ * 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 -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=epswrite -sOutputFile='outfile options infile
+exit
+
+usage:
+say 'Usage: eps2eps ...switches... input.eps output.eps'
+exit
diff --git a/Master/xemtex/gslib/errpage.ps b/Master/xemtex/gslib/errpage.ps
new file mode 100644
index 00000000000..7619205168c
--- /dev/null
+++ b/Master/xemtex/gslib/errpage.ps
@@ -0,0 +1,363 @@
+%!
+% Copyright (C) 1992, 1996, 1998 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: errpage.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Print an informative error page if an error occurs.
+% Inspired by Adobe's `ehandler.ps' and David Holzgang's PinPoint.
+
+/EPdict 80 dict def
+EPdict begin
+
+/escale 12 def
+/efont /Helvetica findfont escale scalefont def
+/eheight escale 1.2 mul def
+
+% Miscellaneous utilities
+/xdef
+ { exch def
+ } bind def
+
+% Define `show' equivalents of = and ==
+
+/show=
+ { =string { cvs } stopped { pop pop (==unprintable==) } if show
+ } bind def
+
+/.dict 18 dict def
+.dict begin
+ /.buf =string def
+ /.cvp {.buf cvs show} bind def
+ /.nop {(-) .p type .cvp (-) .p} bind def
+ /.p {show} bind def
+ /.p1 {( ) dup 0 4 -1 roll put show} bind def
+ /.print
+ {dup type .dict exch known
+ {dup type exec} {.nop} ifelse
+ } bind def
+ /integertype /.cvp load def
+ /nulltype { pop (null) .p } bind def
+ /realtype /.cvp load def
+ /booleantype /.cvp load def
+ /nametype
+ {dup xcheck not {(/) .p} if
+ dup length .buf length gt
+ {dup length string}
+ {.buf}
+ ifelse cvs .p} bind def
+ /arraytype
+ {dup rcheck
+ {dup xcheck {(})({)} {(])([)} ifelse .p
+ exch () exch
+ {exch .p .print ( )} forall pop .p}
+ {.nop}
+ ifelse} bind def
+ /operatortype
+ {(--) .p .cvp (--) .p} bind def
+ /packedarraytype /arraytype load def
+ /stringtype
+ {dup rcheck
+ {(\() .p
+ {/.ch exch def
+ .ch 32 lt .ch 127 ge or
+ {(\\) .p .ch 8#1000 add 8 .buf cvrs 1 3 getinterval .p}
+ {.ch 40 eq .ch 41 eq or .ch 92 eq or
+ {(\\) .p} if
+ .ch .p1}
+ ifelse}
+ forall (\)) .p}
+ {.nop}
+ ifelse} bind def
+end
+/show==
+ { .dict begin .print end
+ } bind def
+
+% Printing utilities
+
+/eol
+ { /ey ey eheight sub def
+ ex ey moveto
+ } bind def
+/setx
+ { /ex xdef ex ey moveto
+ } bind def
+/setxy
+ { /ey xdef /ex xdef
+ ex ey moveto
+ } bind def
+/indent
+ { /lx ex def
+ ( ) show currentpoint setxy
+ } bind def
+/unindent
+ { lx setx
+ } bind def
+
+% Get the name of the n'th dictionary on the (saved) dictionary stack.
+/nthdictname % n -> name true | false
+ { dup dstack exch get
+ exch -1 0
+ { dstack exch get
+ { 2 index eq { exch pop exit } { pop } ifelse
+ }
+ forall
+ dup type /nametype eq { exit } if
+ }
+ for
+ dup type /nametype eq { true } { pop false } ifelse
+ } bind def
+
+% Find the name of a currently executing procedure.
+/findprocname % <proctail> findprocname <dstackindex> <procname> true
+ % <proctail> findprocname false
+ { dup length /proclength xdef
+ dup type cvlit /proctype xdef
+ dstack length 1 sub -1 0
+ { dup dstack exch get
+ { dup type proctype eq
+ { dup rcheck { dup length } { -1 } ifelse proclength gt
+ { dup length proclength sub proclength getinterval 3 index eq
+ { 3 -1 roll pop exit }
+ { pop }
+ ifelse
+ }
+ { pop pop
+ }
+ ifelse
+ }
+ { pop pop
+ }
+ ifelse
+ }
+ forall
+ dup type /nametype eq { exit } if
+ pop
+ }
+ for
+ dup type /nametype eq { true } { pop false } ifelse
+ } bind def
+
+% Error printing routine.
+% The top 2 elements of the o-stack are systemdict and EPdict.
+% For the moment, we ignore the possibility of stack overflow or VMerror.
+/showerror % <command> <countexecstack> <errorname> showerror -
+ {
+ % Restore the error handlers.
+
+ saveerrordict { errordict 3 1 roll put } forall
+ $error /recordstacks false put
+
+ % Save information from the stacks.
+
+ /saveerror xdef
+ countexecstack array execstack
+ 0 3 -1 roll 1 sub getinterval
+ /estack xdef
+ /savecommand xdef
+
+ countdictstack array dictstack
+ dup length 2 sub 0 exch getinterval
+ /dstack xdef
+
+ % Save state variables that will be reset.
+ % (We could save and print a lot more of the graphics state.)
+
+ /savefont currentfont def
+ mark { savefont /FontName get =string cvs cvn } stopped
+ { cleartomark null }
+ { exch pop dup length 0 eq { pop null } if }
+ ifelse /savefontname xdef
+ efont setfont
+
+ { currentpoint } stopped { null null } if
+ /savey xdef /savex xdef
+ 0 0
+ { pop pop }
+ { pop pop 1 add }
+ { pop pop pop pop pop pop exch 1 add exch }
+ { }
+ pathforall
+ /savelines xdef /savecurves xdef
+ /savepathbbox { [ pathbbox ] } stopped { pop null } if def
+
+ initmatrix
+
+ clippath pathbbox
+ /savecliptop xdef /saveclipright xdef
+ /saveclipbottom xdef /saveclipleft xdef
+ initclip
+
+ initgraphics
+
+ % Eject the current page.
+
+ showpage
+
+ % Print the page heading.
+
+ 18 clippath pathbbox newpath
+ 4 1 roll pop pop pop eheight sub 12 sub setxy
+ product (Product: )
+ statusdict /printername known
+ { 100 string statusdict begin printername end
+ dup length 0 gt
+ { exch pop exch pop (Printer name: ) }
+ { pop }
+ ifelse
+ }
+ if show show eol
+ (Interpreter version ) show version show eol
+ (Error: ) show saveerror show= eol
+ (Command being executed: ) show /savecommand load show= eol
+ currentfile { fileposition } stopped
+ { pop }
+ { (Position in input file: ) show show= eol }
+ ifelse eol
+
+ % Print the current graphics state.
+
+ (Page parameters:) show eol indent
+ (page size: ) show
+ gsave clippath pathbbox grestore
+ exch 3 index sub show= (pt x ) show
+ exch sub show= (pt) show pop eol
+ (current position: ) show
+ savex null eq
+ { (none) show }
+ { (x = ) show savex show= (, y = ) show savey show= }
+ ifelse eol
+ savelines savecurves add 0 eq
+ { (current path is empty) show
+ }
+ { (current path: ) show savelines show= ( line(s), ) show
+ savecurves show= ( curve(s)) show eol
+ (path bounding box: ) show savepathbbox show==
+ }
+ ifelse eol
+ (current font: ) show
+ savefontname dup null eq
+ { pop (--no name--) show }
+ { show= ( ) show
+ gsave
+ savefontname findfont /FontMatrix get matrix invertmatrix
+ grestore
+ savefont /FontMatrix get matrix concatmatrix
+ dup 1 get 0 eq 1 index 2 get 0 eq and
+ 1 index 4 get 0 eq and 1 index 5 get 0 eq and
+ 1 index 0 get 2 index 3 get eq and
+ { 0 get show= (pt) show }
+ { (scaled by ) show show= }
+ ifelse
+ }
+ ifelse eol
+ eol unindent
+
+ % Print the operand stack.
+
+ /stky ey def
+ (Operand stack:) show eol indent
+ count { show== eol } repeat
+ eol unindent
+
+ % Print the dictionary stack.
+
+ (Dictionary stack:) show eol indent
+ dstack length 1 sub -1 0
+ { nthdictname { show= } { (<unknown>) show } ifelse eol
+ } for
+ eol unindent
+
+ % Print the execution stack.
+
+ 280 stky setxy
+ (Execution stack:) show eol indent
+ estack length 1 sub -1 1
+ { estack exch get
+ dup type /operatortype eq
+ { show= eol
+ }
+ { dup type dup /arraytype eq exch /packedarraytype eq or
+ { dup xcheck
+ { dup rcheck
+ { findprocname
+ { show= nthdictname { ( in ) show show= } if eol
+ }
+ if
+ }
+ { pop
+ }
+ ifelse
+ }
+ { pop
+ }
+ ifelse
+ }
+ { pop
+ }
+ ifelse
+ }
+ ifelse
+ } for eol unindent
+
+ % Print the next few lines of input.
+ % Unfortunately, this crashes on an Adobe printer.
+
+(
+ (Next few lines of input:) show eol indent
+ /input currentfile def
+ mark { 4
+ { input ( ) readstring not { pop exit } if
+ dup 0 get dup 10 eq
+ { pop pop eol 1 sub dup 0 eq { pop exit } if }
+ { dup 13 eq { pop pop } { pop show } ifelse }
+ ifelse
+ }
+ loop } stopped cleartomark eol unindent
+) pop
+
+ % Wrap up.
+
+ showpage
+ quit
+
+ } def
+
+% Define the common procedure for handling errors.
+/doerror
+ { systemdict begin EPdict begin showerror
+ } bind def
+
+end
+
+% Install our own error handlers.
+
+/EPinstall
+ { EPdict begin
+ /saveerrordict errordict length dict def
+ errordict saveerrordict copy pop
+ errordict
+ { pop [ /countexecstack load 2 index cvlit /doerror load /exec load ] cvx
+ errordict 3 1 roll put
+ } forall
+ errordict /handleerror
+ [ /countexecstack load /handleerror /doerror load /exec load
+ ] cvx
+ put
+ end
+ } bind def
+
+EPinstall
diff --git a/Master/xemtex/gslib/fixmswrd.pl b/Master/xemtex/gslib/fixmswrd.pl
new file mode 100644
index 00000000000..be35465790b
--- /dev/null
+++ b/Master/xemtex/gslib/fixmswrd.pl
@@ -0,0 +1,208 @@
+#!/usr/bin/perl
+# $Id: fixmswrd.pl,v 1.1 2000/03/09 08:40:39 lpd Exp $
+
+# $Id: fixmswrd.pl,v 1.1 2000/03/09 08:40:39 lpd Exp $
+
+# (C) 1997 Anthony Shipman
+#
+# This software is provided 'as-is', without any express or implied
+# warranty. In no event will the authors be held liable for any damages
+# arising from the use of this software.
+#
+# Permission is granted to anyone to use this software for any purpose,
+# including commercial applications, and to alter it and redistribute it
+# freely, subject to the following restrictions:
+#
+# 1. The origin of this software must not be misrepresented; you must not
+# claim that you wrote the original software. If you use this software
+# in a product, an acknowledgment in the product documentation would be
+# appreciated but is not required.
+# 2. Altered source versions must be plainly marked as such, and must not be
+# misrepresented as being the original software.
+# 3. This notice may not be removed or altered from any source distribution.
+#
+# Anthony Shipman shipmana@acm.org
+
+# This program patches the postscript generated by MS Word printer drivers
+# so that they work with ghostview 1.5. The problem is that the document
+# structuring conventions are not followed by Word. The pages are supposed
+# to be independent but they depend on a dictionary being opened outside
+# of the pages. The erroneous structure is
+#
+# %%EndSetup
+# NTPSOct95 begin
+# %%Page: 1 1
+# <text>
+# showpage
+# %%Page: 2 2
+# <text>
+# showpage
+# ......
+# %%Trailer
+# ...
+# end
+# %%EOF
+#
+# This only works if the all of the structure around the pages is preserved.
+# The opening of NTPSOct95 happens outside of any structured section so
+# it is never seen by ghostview. We change the structure to
+#
+# %%EndSetup
+# %%Page: 1 1
+# NTPSOct95 begin
+# <text>
+# showpage
+# end
+# %%Page: 2 2
+# NTPSOct95 begin
+# <text>
+# showpage
+# end
+# ......
+# %%Trailer
+# ...
+# %%EOF
+#
+# That is the dictionary opening is repeated inside each page.
+#
+# We add a comment to the document to mark that it has been converted.
+# This has the form
+# %LOCALGhostviewPatched
+#
+# Usage:
+# fixmswrd [-v] [file [output-file]]
+
+require 'getopts.pl';
+
+#=================================================================
+
+$program = "fixmswrd";
+
+sub usage {
+ die "Usage: $program [-v] [file [output-file]]\n";
+}
+
+#=================================================================
+
+&Getopts("v") || &usage;
+
+$verbose = $opt_v;
+
+
+$infile = shift(@ARGV);
+if ($infile)
+{
+ open(INFILE, $infile) || die "$program: Cannot read from $infile\n";
+ $handle = "INFILE";
+}
+else
+{
+ $handle = "STDIN";
+}
+
+
+$outfile = shift(@ARGV);
+if ($outfile)
+{
+ open(OUTFILE, ">$outfile") || die "$program: Cannot write to $outfile\n";
+ select(OUTFILE);
+}
+
+# This reads the header comments and detects the presence of the marker.
+$have_marker = 0;
+
+undef $dict_name;
+undef $dict_line;
+
+&read_comments;
+&put_comments;
+
+if ($have_marker)
+{
+ $verbose && print STDERR "$program: Warning - already converted\n";
+
+ while(<$handle>) # pass the file through unchanged.
+ {
+ print;
+ }
+}
+else
+{
+ $seen_trailer = 0;
+
+ while(<$handle>) # massage the file
+ {
+ if ($dict_line)
+ {
+ next if (/$dict_line/o); # drop the old begin line
+ $seen_trailer = 1 if (/^%%Trailer/);
+ next if ($seen_trailer and /^end/); # drop the old end line
+ }
+
+ print;
+
+ if (/^%%Page:/)
+ {
+ print "$dict_name begin\n"; # add at the start of the page
+ }
+ elsif (/^showpage/)
+ {
+ print "end\n"; # add at the end of the page
+ }
+ elsif (/^%%BeginResource: procset (\S+)/)
+ {
+ $dict_name = $1;
+ $dict_line = "^$dict_name begin";
+ }
+ elsif (/^%%BeginProcSet: (\S+)/) # for older document versions
+ {
+ $dict_name = $1;
+ $dict_line = "^$dict_name begin";
+ }
+ elsif (/^%%EndProlog:/)
+ {
+ unless ($dict_line)
+ {
+ $verbose &&
+ print STDERR "$program: Warning - unrecognised document structure\n";
+ }
+ }
+ }
+}
+
+exit 0;
+
+#=================================================================
+
+
+# This reads all of the header comments into an array which we can write
+# out again later. In addition we detect the presence of the marker comment.
+
+sub read_comments
+{
+ @headers = ();
+
+ while (<$handle>)
+ { # without chopping
+ push(@headers, $_);
+ if (/^%LOCALGhostviewPatched/)
+ {
+ $have_marker = 1;
+ }
+ last if /^%%EndComments/;
+ }
+}
+
+
+
+sub put_comments
+{
+ foreach $h (@headers)
+ {
+ if (!$have_marker and ($h =~ /^%%EndComments/))
+ {
+ print "%LOCALGhostviewPatched\n";
+ }
+ print $h; # contains the newline
+ }
+}
diff --git a/Master/xemtex/gslib/font2c b/Master/xemtex/gslib/font2c
new file mode 100644
index 00000000000..5404ba5bb1d
--- /dev/null
+++ b/Master/xemtex/gslib/font2c
@@ -0,0 +1,3 @@
+#!/bin/sh
+# $Id: font2c,v 1.1 2000/03/09 08:40:39 lpd Exp $
+exec gs -q -dNODISPLAY -dWRITESYSTEMDICT -- font2c.ps "$@"
diff --git a/Master/xemtex/gslib/font2c.bat b/Master/xemtex/gslib/font2c.bat
new file mode 100644
index 00000000000..f3fd69a7d8c
--- /dev/null
+++ b/Master/xemtex/gslib/font2c.bat
@@ -0,0 +1,5 @@
+@echo off
+@rem $Id: font2c.bat,v 1.2 2000/05/20 20:53:05 lpd Exp $
+
+call gssetgs.bat
+%GSC% -q -dNODISPLAY -dWRITESYSTEMDICT -- font2c.ps %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/xemtex/gslib/font2c.cmd b/Master/xemtex/gslib/font2c.cmd
new file mode 100755
index 00000000000..a1b7894eff7
--- /dev/null
+++ b/Master/xemtex/gslib/font2c.cmd
@@ -0,0 +1,7 @@
+/* $Id: font2c.cmd,v 1.1 2000/07/05 16:21:13 lpd Exp $ */
+/*
+ * 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 -dWRITESYSTEMDICT -- font2c.ps %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/xemtex/gslib/font2c.ps b/Master/xemtex/gslib/font2c.ps
new file mode 100644
index 00000000000..fecd5713e29
--- /dev/null
+++ b/Master/xemtex/gslib/font2c.ps
@@ -0,0 +1,676 @@
+% Copyright (C) 1992, 1993, 1994, 1995, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: font2c.ps,v 1.3.2.1.2.1 2003/04/12 14:02:38 giles Exp $
+% font2c.ps
+% Write out a PostScript Type 0 or Type 1 font as C code
+% that can be linked with the interpreter.
+% This even works on protected fonts, if you use the -dWRITESYSTEMDICT
+% switch in the command line. The code is reentrant and location-
+% independent and has no external references, so it can be put into
+% a sharable library even on VMS.
+
+/font2cdict 100 dict dup begin
+
+% Define the maximum string length that all compilers will accept.
+% This must be approximately
+% min(max line length, max string literal length) / 4 - 5.
+
+/max_wcs 50 def
+
+% Define a temporary file for writing out procedures.
+/wtempname (_.tmp) def
+
+% ------ Protection utilities ------ %
+
+% Protection values are represented by a mask:
+/a_noaccess 0 def
+/a_executeonly 1 def
+/a_readonly 3 def
+/a_all 7 def
+/prot_names
+ [ (0) (a_execute) null (a_readonly) null null null (a_all)
+ ] def
+/prot_opers
+ [ {noaccess} {executeonly} {} {readonly} {} {} {} {}
+ ] def
+
+% Get the protection of an object.
+ /getpa
+ { dup wcheck
+ { pop a_all }
+ { % Check for executeonly or noaccess objects in protected.
+ dup protected exch known
+ { protected exch get }
+ { pop a_readonly }
+ ifelse
+ }
+ ifelse
+ } bind def
+
+% Get the protection appropriate for (all the) values in a dictionary.
+ /getva
+ { a_noaccess exch
+ { exch pop
+ dup type dup /stringtype eq 1 index /arraytype eq or
+ exch /packedarraytype eq or
+ { getpa a_readonly and or }
+ { pop pop a_all exit }
+ ifelse
+ }
+ forall
+ } bind def
+
+% Keep track of executeonly and noaccess objects,
+% but don't let the protection actually take effect.
+.currentglobal
+false .setglobal % so protected can reference local objs
+/protected % do first so // will work
+ systemdict wcheck { 1500 dict } { 1 dict } ifelse
+def
+systemdict wcheck not
+ { (Warning: you will not be able to convert protected fonts.\n) print
+ (If you need to convert a protected font, please\n) print
+ (restart the program and specify the -dWRITESYSTEMDICT switch.\n) print
+ flush
+ (%end) .skipeof
+ }
+if
+userdict begin
+ /executeonly
+ { dup //protected exch //a_executeonly put readonly
+ } bind def
+ /noaccess
+ { dup //protected exch //a_noaccess put readonly
+ } bind def
+end
+true .setglobal
+systemdict begin
+ /executeonly
+ { userdict /executeonly get exec
+ } bind odef
+ /noaccess
+ { userdict /noaccess get exec
+ } bind odef
+end
+%end
+.setglobal
+
+% ------ Output utilities ------ %
+
+% By convention, the output file is named cfile.
+
+% Define some utilities for writing the output file.
+ /wtstring 100 string def
+ /wb {cfile exch write} bind def
+ /ws {cfile exch writestring} bind def
+ /wl {ws (\n) ws} bind def
+ /wt {wtstring cvs ws} bind def
+
+% Write a C string. Some compilers have unreasonably small limits on
+% the length of a string literal or the length of a line, so every place
+% that uses wcs must either know that the string is short,
+% or be prepared to use wcca instead.
+ /wbx
+ { 8#1000 add 8 (0000) cvrs dup 0 (\\) 0 get put ws
+ } bind def
+ /wcst
+ [
+ 32 { /wbx load } repeat
+ 95 { /wb load } repeat
+ 129 { /wbx load } repeat
+ ] def
+ ("\\) { wcst exch { (\\) ws wb } put } forall
+ /wcs
+ { (") ws { dup wcst exch get exec } forall (") ws
+ } bind def
+ /can_wcs % Test if can use wcs
+ { length max_wcs le
+ } bind def
+ /wncs % name -> C string
+ { wtstring cvs wcs
+ } bind def
+% Write a C string as an array of character values.
+% We only need this because of line and literal length limitations.
+ /wca % <string> <prefix> <suffix> wca -
+ { 0 4 -2 roll exch
+ { % Stack: suffix n prefix char
+ exch ws
+ exch dup 19 ge { () wl pop 0 } if 1 add
+ exch dup 32 ge 1 index 126 le and
+ { 39 wb dup 39 eq 1 index 92 eq or { 92 wb } if wb 39 wb }
+ { wt }
+ ifelse (,)
+ } forall
+ pop pop ws
+ } bind def
+ /wcca % <string> wcca -
+ { ({\n) (}) wca
+ } bind def
+
+% Write object protection attributes. Note that dictionaries and arrays are
+% the only objects that can be writable.
+ /wpa
+ { dup xcheck { (a_executable|) ws } if
+ dup type dup /dicttype eq exch /arraytype eq or
+ { getpa }
+ { getpa a_readonly and }
+ ifelse prot_names exch get ws
+ } bind def
+ /wva
+ { getva prot_names exch get ws
+ } bind def
+
+% ------ Object writing ------ %
+
+ /wnstring 128 string def
+
+% Convert an object to a string to be scanned at a later time.
+ /cvos % <obj> cvos <string>
+ { % We'd like to use == and write directly to a string,
+ % but we can't do the former because of operators,
+ % and we can't do the latter because we can't predict
+ % how long the string would have to be....
+ wtempname (w) file dup 3 -1 roll wproc closefile
+ wtempname status pop pop pop exch pop string
+ wtempname (r) file dup 3 -1 roll readstring pop exch closefile
+ } bind def
+
+% Write a string/name or null as an element of a string/name/null array.
+% Convert any other kind of value to a token to be read back in.
+ /wsn
+ { dup null eq
+ { pop (\t255,255,) wl
+ }
+ { dup type /nametype eq { wnstring cvs } if
+ dup type /stringtype ne { cvos (255,) ws } if
+ dup length 256 idiv wt (,) ws
+ dup length 256 mod wt
+ (,) (,\n) wca
+ }
+ ifelse
+ } bind def
+% Write a packed string/name/null array.
+ /wsna % <name> <(string|name|null)*> wsna -
+ { (\tstatic const char ) ws exch wt ([] = {) wl
+ { wsn } forall
+ (\t0\n};) wl
+ } bind def
+
+% Write a number or an array of numbers, as refs.
+/isnumber
+ { type dup /integertype eq exch /realtype eq or
+ } bind def
+/wnums
+ { dup isnumber
+ { (real_v\() ws wt (\),) ws }
+ { { wnums } forall }
+ ifelse
+ } bind def
+
+% Test whether a procedure or unusual array can be written (printed).
+/iswx 4 dict dup begin
+ /arraytype { { iswproc } isall } def
+ /nametype { pop true } def
+ /operatortype { pop true } def % assume it has been bound in
+ /packedarraytype /arraytype load def
+end def
+/iswnx 6 dict dup begin
+ /arraytype { { iswproc } isall } def
+ /integertype { pop true } def
+ /nametype { pop true } def
+ /realtype { pop true } def
+ /stringtype { pop true } def
+ /packedarraytype /arraytype load def
+end def
+/iswproc % <obj> iswproc <bool>
+ { dup xcheck { iswx } { iswnx } ifelse
+ 1 index type .knownget { exec } { pop false } ifelse
+ } bind def
+
+% Write a printable procedure (one for which iswproc returns true).
+/wproca 3 dict dup begin
+ /arraytype
+ { 1 index ({) writestring
+ { 1 index ( ) writestring 1 index exch wproc } forall
+ (}) writestring
+ } bind def
+ /packedarraytype /arraytype load def
+ /operatortype { .writecvs } bind def % assume binding would work
+end def
+/wproc % <file> <proc> wproc -
+ { dup type wproca exch .knownget { exec } { write==only } ifelse
+ } bind def
+
+% Write a named object. Return true if this was possible.
+% Legal types are: boolean, integer, name, real, string,
+% array of (integer, integer+real, name, null+string),
+% and certain procedures and other arrays (see iswproc above).
+% All other objects are either handled specially or ignored.
+ /isall % <array> <proc> isall <bool>
+ { true 3 -1 roll
+ { 2 index exec not { pop false exit } if }
+ forall exch pop
+ } bind def
+ /wott 8 dict dup begin
+ /arraytype
+ { woatt
+ { aload pop 2 index 2 index exec
+ { exch pop exec exit }
+ { pop pop }
+ ifelse
+ }
+ forall
+ } bind def
+ /booleantype
+ { { (\tmake_true\(&) } { (\tmake_false\(&) } ifelse ws
+ wt (\);) wl true
+ } bind def
+ /integertype
+ { (\tmake_int\(&) ws exch wt (, ) ws
+ wt (\);) wl true
+ } bind def
+ /nametype
+ { (\tcode = (*pprocs->name_create)\(i_ctx_p, &) ws exch wt
+ (, ) ws wnstring cvs wcs % OK, names are short
+ (\);) wl
+ (\tif ( code < 0 ) return code;) wl
+ true
+ } bind def
+ /packedarraytype
+ /arraytype load def
+ /realtype
+ { (\tmake_real\(&) ws exch wt (, ) ws
+ wt (\);) wl true
+ } bind def
+ /stringtype
+ { ({\tstatic const char s_[] = ) ws
+ dup dup can_wcs { wcs } { wcca } ifelse
+ (;) wl
+ (\tmake_const_string\(&) ws exch wt
+ (, a_readonly, ) ws length wt (, (const byte *)s_\);) wl
+ (}) wl true
+ } bind def
+ end def
+% Write some other kind of object, if known.
+ /wother
+ { dup otherobjs exch known
+ { otherobjs exch get (\t) ws exch wt ( = ) ws wt (;) wl true }
+ { pop pop false }
+ ifelse
+ } bind def
+% Top-level procedure.
+ /wo % name obj -> OK
+ { dup type wott exch .knownget { exec } { wother } ifelse
+ } bind def
+
+% Write an array (called by wo).
+ /wap % <name> <array> wap -
+ { dup xcheck not 1 index wcheck not and 1 index rcheck and
+ { pop pop }
+ { (\tr_set_attrs\(&) ws exch wt (, ) ws wpa (\);) wl }
+ ifelse
+ } bind def
+ /wnuma { % <name> <array> <element_C_type> <<type>_v> wnuma -
+ ({\tstatic const ref_\() ws exch ws (\) a_[] = {) wl exch
+ % Stack: name type_v array
+ dup length 0 eq {
+ (\t) ws 1 index ws (\(0\)) wl
+ } {
+ dup {
+ (\t) ws 2 index ws (\() ws wt (\),) wl
+ } forall
+ } ifelse exch pop
+ % Stack: name array
+ (\t};) wl
+ dup wcheck {
+ (\tcode = (*pprocs->scalar_array_create)\(i_ctx_p, &) ws exch wt
+ (, (const ref *)a_, ) ws dup length wt
+ (, ) ws wpa (\);) wl
+ (\tif ( code < 0 ) return code;) wl
+ } {
+ (\tmake_const_array\(&) ws exch wt
+ (, avm_foreign|) ws dup wpa (, ) ws length wt
+ (, (const ref *)a_\);) wl
+ } ifelse
+ (}) wl
+ } bind def
+ /woatt [
+ % Integers
+ { { { type /integertype eq } isall }
+ { (long) (integer_v) wnuma true }
+ }
+ % Integers + reals
+ { { { type dup /integertype eq exch /realtype eq or } isall }
+ { (float) (real_v) wnuma true }
+ }
+ % Strings + nulls
+ { { { type dup /nulltype eq exch /stringtype eq or } isall }
+ { ({) ws dup (sa_) exch wsna
+ (\tcode = (*pprocs->string_array_create)\(i_ctx_p, &) ws exch wt
+ (, sa_, ) ws dup length wt (, ) ws wpa (\);) wl
+ (\tif ( code < 0 ) return code;) wl
+ (}) wl true
+ }
+ }
+ % Names
+ { { { type /nametype eq } isall }
+ { ({) ws dup (na_) exch wsna
+ (\tcode = (*pprocs->name_array_create)\(i_ctx_p, &) ws 1 index wt
+ (, na_, ) ws dup length wt (\);) wl
+ (\tif ( code < 0 ) return code;) wl
+ wap (}) wl true
+ }
+ }
+ % Procedure
+ { { iswproc }
+ { dup cvos
+ % Stack: name proc string
+ ({\tstatic const char s_[] = ) ws
+ dup dup can_wcs { wcs } { wcca } ifelse
+ (;) wl
+ (\tcode = (*pprocs->ref_from_string)\(i_ctx_p, &) ws 2 index wt
+ (, s_, ) ws length wt (\);) wl
+ (\tif ( code < 0 ) return code;) wl
+ wap (}) wl true
+ wtempname deletefile
+ }
+ }
+ % Default
+ { { pop true }
+ { wother }
+ }
+ ] def
+
+% Write a named dictionary. We assume the ref is already declared.
+ /wd % <name> <dict> <extra> wd -
+ { 3 1 roll
+ ({) ws
+ (\tref v_[) ws dup length wt (];) wl
+ dup [ exch
+ { counttomark 2 sub wtstring cvs
+ (v_[) exch concatstrings (]) concatstrings exch wo not
+ { (Skipping ) print ==only (....\n) print }
+ if
+ } forall
+ ]
+ % Stack: array of keys (names)
+ ({) ws dup (str_keys_) exch wsna
+ (\tstatic const cfont_dict_keys keys_ =) wl
+ (\t { 0, 0, ) ws length wt (, ) ws 3 -1 roll wt (, ) ws
+ dup wpa (, ) ws dup wva ( };) wl pop
+ (\tcode = \(*pprocs->ref_dict_create\)\(i_ctx_p, &) ws wt
+ (, &keys_, str_keys_, v_\);) wl
+ (\tif ( code < 0 ) return code;) wl
+ (}) wl
+ (}) wl
+ } bind def
+
+% Write character dictionary keys.
+% We save a lot of space by abbreviating keys which appear in
+% StandardEncoding or ISOLatin1Encoding.
+% Writes code to declare and initialize enc_keys_, str_keys, and keys_.
+/wcdkeys % <dict> wcdkeys -
+ { % Write keys present in StandardEncoding or ISOLatin1Encoding,
+ % pushing other keys on the o-stack.
+ (static const charindex enc_keys_[] = {) wl
+ dup [ exch 0 exch
+ { pop decoding 1 index known
+ { decoding exch get ({) ws dup -8 bitshift wt
+ (,) ws 255 and wt (}, ) ws
+ 1 add dup 5 mod 0 eq { (\n) ws } if
+ }
+ { exch }
+ ifelse
+ }
+ forall pop
+ ]
+ ({0,0}\n};) wl
+ % Write other keys.
+ (str_keys_) exch wsna
+ % Write the declaration for keys_.
+ (static const cfont_dict_keys keys_ = {) wl
+ (\tenc_keys_, countof\(enc_keys_\) - 1,) wl
+ (\t) ws dup length wt ( - \(countof\(enc_keys_\) - 1\), 0, ) ws
+ dup wpa (, ) ws wva () wl
+ (};) wl
+ } bind def
+
+% Enumerate character dictionary values in the same order that
+% the keys appear in enc_keys_ and str_keys_.
+% <proc> is called with each value in turn.
+/cdforall % <dict> <proc> cdforall -
+ { 2 copy
+ { decoding 3 index known
+ { 3 -1 roll pop exec }
+ { pop pop pop }
+ ifelse
+ }
+ /exec cvx 3 packedarray cvx
+ /forall cvx
+ 5 -2 roll
+ { decoding 3 index known
+ { pop pop pop }
+ { 3 -1 roll pop exec }
+ ifelse
+ }
+ /exec cvx 3 packedarray cvx
+ /forall cvx
+ 6 packedarray cvx exec
+ } bind def
+
+% ------ Writers for special objects ------ %
+
+/writespecial 10 dict dup begin
+
+ /FontInfo { 0 wd } def
+
+ /Private { 0 wd } def
+
+ /CharStrings
+ { ({) wl
+ dup wcdkeys
+ (static const char values_[] = {) wl
+ { wsn } cdforall
+ (\t0\n};) wl
+ (\tcode = \(*pprocs->string_dict_create\)\(i_ctx_p, &) ws wt
+ (, &keys_, str_keys_, values_\);) wl
+ (\tif ( code < 0 ) return code;) wl
+ (}) wl
+ } bind def
+
+ /Metrics
+ { ({) wl
+ dup wcdkeys
+ (static const ref_(float) values_[] = {) wl
+ dup { (\t) ws wnums () wl } cdforall
+ (\t0\n};) wl
+ (static const char lengths_[] = {) wl
+ { (\t) ws dup isnumber
+ { pop 0 }
+ { length 1 add }
+ ifelse wt (,) wl
+ } cdforall
+ (\t0\n};) wl
+ (\tcode = \(*pprocs->num_dict_create\)\(i_ctx_p, &) ws wt
+ (, &keys_, str_keys_, (const ref *)values_, lengths_\);) wl
+ (\tif ( code < 0 ) return code;) wl
+ (}) wl
+ } bind def
+
+ /Metrics2 /Metrics load def
+
+ /FDepVector pop % (converted to a list of font names)
+
+end def
+
+% ------ The main program ------ %
+
+% Construct an inverse dictionary of encodings.
+[ /StandardEncoding /ISOLatin1Encoding
+ /SymbolEncoding /DingbatsEncoding
+ /KanjiSubEncoding
+]
+dup length dict begin
+ { mark exch dup { .findencoding exch def } stopped cleartomark
+ } forall
+currentdict end /encodingnames exch def
+
+% Invert the StandardEncoding and ISOLatin1Encoding vectors.
+512 dict begin
+ 0 1 255 { dup ISOLatin1Encoding exch get exch 256 add def } for
+ 0 1 255 { dup StandardEncoding exch get exch def } for
+currentdict end /decoding exch def
+
+/writefont % cfilename procname -> [writes the current font]
+ { (gsf_) exch concatstrings
+ /fontprocname exch def
+ /cfname exch def
+ /cfile cfname (w) file def
+
+% Remove unwanted keys from the font.
+ currentfont dup length dict begin { def } forall
+ { /FID /MIDVector /CurMID } { currentdict exch undef } forall
+ /Font currentdict end def
+
+% Replace the FDepVector with a list of font names.
+ Font /FDepVector .knownget
+ { [ exch { /FontName get } forall ]
+ Font /FDepVector 3 -1 roll put
+ }
+ if
+
+% Find all the special objects we know about.
+% wo uses this to write out references to otherwise intractable objects.
+ /otherobjs writespecial length dict dup begin
+ writespecial
+ { pop Font 1 index .knownget { exch def } { pop } ifelse
+ }
+ forall
+ end def
+
+% Define a dummy FontInfo, in case the font doesn't have one.
+ /FontInfo 0 dict def
+
+% Write out the boilerplate.
+ Font begin
+ (/****************************************************************) wl
+ ( Portions of this file are subject to the following notice(s):) wl
+ systemdict /copyright get wl
+ FontInfo /Notice .knownget
+ { (----------------------------------------------------------------) wl wl
+ } if
+ (****************************************************************/) wl
+ () wl
+ (/* ) ws cfname ws ( */) wl
+ (/* This file was created by the ) ws product ws ( font2c utility. */) wl
+ () wl
+ (#undef DEBUG) wl
+ (#include "ccfont.h") wl
+ () wl
+
+% Write the procedure prologue.
+ (#ifdef __PROTOTYPES__) wl
+ (ccfont_proc\() ws fontprocname ws (\);) wl
+ (int) wl
+ fontprocname ws ((i_ctx_t *i_ctx_p, const cfont_procs *pprocs, ref *pfont)) wl
+ (#else) wl
+ (int) wl
+ fontprocname ws ((i_ctx_p, pprocs, pfont) i_ctx_t *i_ctx_p; const cfont_procs *pprocs; ref *pfont;) wl
+ (#endif) wl
+ ({\tint code;) wl
+ (\tref Font;) wl
+ otherobjs
+ { exch pop (\tref ) ws wt (;) wl }
+ forall
+
+% Write out the special objects.
+ otherobjs
+ { exch writespecial 2 index get exec
+ }
+ forall
+
+% Write out the main font dictionary.
+% If possible, substitute the encoding name for the encoding;
+% PostScript code will fix this up.
+ { /Encoding /PrefEnc }
+ { Font 1 index .knownget
+ { encodingnames exch .knownget { def } { pop } ifelse }
+ { pop }
+ ifelse
+ }
+ forall
+ (Font) Font FontType 0 eq { 5 } { 1 } ifelse wd
+
+% Finish the procedural initialization code.
+ (\t*pfont = Font;) wl
+ (\treturn 0;) wl
+ (}) wl
+ end % Font
+
+ cfile closefile
+
+ } bind def
+
+end def % font2cdict
+
+% Compute the procedure name from the font name.
+% Replace all non-alphanumeric characters with '_'.
+/makefontprocnamemap 256 string
+ 0 1 255 { 2 copy 95 put pop } for
+ (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz)
+ { 2 copy dup put pop } forall
+readonly def
+/makefontprocname % <fontname> makefontprocname <procnamestring>
+ { dup length string cvs
+ dup length 1 sub -1 0
+ { % Stack: string index
+ 2 copy 2 copy get //makefontprocnamemap exch get put pop
+ }
+ for
+ } def
+
+/writefont { font2cdict begin writefont end } def
+
+% If the program was invoked from the command line, run it now.
+[ shellarguments
+ { counttomark dup 2 eq exch 3 eq or
+ { counttomark -1 roll cvn
+ (Converting ) print dup =only ( font.\n) print flush
+ % Ensure that we get a clean copy of the font from the
+ % file system.
+ 2 { % do both local and global
+ currentglobal not setglobal
+ dup undefinefont
+ } repeat
+ findfont setfont
+ (FontName is ) print currentfont /FontName get ==only (.\n) print flush
+ counttomark 1 eq
+ { % Construct the procedure name from the file name.
+ currentfont /FontName get makefontprocname
+ }
+ if
+ writefont
+ (Done.\n) print flush
+ }
+ { cleartomark
+ (Usage: font2c fontname cfilename.c [shortname]\n) print
+ ( e.g.: font2c Courier cour.c\n) print flush
+ mark
+ }
+ ifelse
+ }
+if pop
diff --git a/Master/xemtex/gslib/font2pcl.ps b/Master/xemtex/gslib/font2pcl.ps
new file mode 100644
index 00000000000..1c777b1bdac
--- /dev/null
+++ b/Master/xemtex/gslib/font2pcl.ps
@@ -0,0 +1,604 @@
+% Copyright (C) 1993, 1994, 1995, 1997 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: font2pcl.ps,v 1.2.6.2.2.1 2003/04/12 14:02:38 giles Exp $
+% 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 ==
+ currentdevice .devicename ==
+ 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/Master/xemtex/gslib/gs_agl.ps b/Master/xemtex/gslib/gs_agl.ps
new file mode 100644
index 00000000000..40ac08e1e76
--- /dev/null
+++ b/Master/xemtex/gslib/gs_agl.ps
@@ -0,0 +1,1070 @@
+% Copyright (C) 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_agl.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+
+% This file was derived from the Adobe Glyph List, version 1.2, dated
+% 22 Oct 1998, at
+% http://partners.adobe.com/asn/developer/typeforum/glyphlist.txt
+% That file does not contain any copyright notice.
+
+% The AdobeGlyphList dictionary maps glyph names to Unicode values.
+% Nearly all names map to a single value; however, a few names map to
+% multiple values. See the above file, and also
+% http://partners.adobe.com/asn/developer/typeforum/unicodegn.html
+% for more details.
+
+/AdobeGlyphList 1500 dict
+dup /A 16#0041 put
+dup /AE 16#00C6 put
+dup /AEacute 16#01FC put
+dup /AEsmall 16#F7E6 put
+dup /Aacute 16#00C1 put
+dup /Aacutesmall 16#F7E1 put
+dup /Abreve 16#0102 put
+dup /Acircumflex 16#00C2 put
+dup /Acircumflexsmall 16#F7E2 put
+dup /Acute 16#F6C9 put
+dup /Acutesmall 16#F7B4 put
+dup /Adieresis 16#00C4 put
+dup /Adieresissmall 16#F7E4 put
+dup /Agrave 16#00C0 put
+dup /Agravesmall 16#F7E0 put
+dup /Alpha 16#0391 put
+dup /Alphatonos 16#0386 put
+dup /Amacron 16#0100 put
+dup /Aogonek 16#0104 put
+dup /Aring 16#00C5 put
+dup /Aringacute 16#01FA put
+dup /Aringsmall 16#F7E5 put
+dup /Asmall 16#F761 put
+dup /Atilde 16#00C3 put
+dup /Atildesmall 16#F7E3 put
+dup /B 16#0042 put
+dup /Beta 16#0392 put
+dup /Brevesmall 16#F6F4 put
+dup /Bsmall 16#F762 put
+dup /C 16#0043 put
+dup /Cacute 16#0106 put
+dup /Caron 16#F6CA put
+dup /Caronsmall 16#F6F5 put
+dup /Ccaron 16#010C put
+dup /Ccedilla 16#00C7 put
+dup /Ccedillasmall 16#F7E7 put
+dup /Ccircumflex 16#0108 put
+dup /Cdotaccent 16#010A put
+dup /Cedillasmall 16#F7B8 put
+dup /Chi 16#03A7 put
+dup /Circumflexsmall 16#F6F6 put
+dup /Csmall 16#F763 put
+dup /D 16#0044 put
+dup /Dcaron 16#010E put
+dup /Dcroat 16#0110 put
+dup /Delta [16#2206 16#0394] put
+dup /Dieresis 16#F6CB put
+dup /DieresisAcute 16#F6CC put
+dup /DieresisGrave 16#F6CD put
+dup /Dieresissmall 16#F7A8 put
+dup /Dotaccentsmall 16#F6F7 put
+dup /Dsmall 16#F764 put
+dup /E 16#0045 put
+dup /Eacute 16#00C9 put
+dup /Eacutesmall 16#F7E9 put
+dup /Ebreve 16#0114 put
+dup /Ecaron 16#011A put
+dup /Ecircumflex 16#00CA put
+dup /Ecircumflexsmall 16#F7EA put
+dup /Edieresis 16#00CB put
+dup /Edieresissmall 16#F7EB put
+dup /Edotaccent 16#0116 put
+dup /Egrave 16#00C8 put
+dup /Egravesmall 16#F7E8 put
+dup /Emacron 16#0112 put
+dup /Eng 16#014A put
+dup /Eogonek 16#0118 put
+dup /Epsilon 16#0395 put
+dup /Epsilontonos 16#0388 put
+dup /Esmall 16#F765 put
+dup /Eta 16#0397 put
+dup /Etatonos 16#0389 put
+dup /Eth 16#00D0 put
+dup /Ethsmall 16#F7F0 put
+dup /Euro 16#20AC put
+dup /F 16#0046 put
+dup /Fsmall 16#F766 put
+dup /G 16#0047 put
+dup /Gamma 16#0393 put
+dup /Gbreve 16#011E put
+dup /Gcaron 16#01E6 put
+dup /Gcircumflex 16#011C put
+dup /Gcommaaccent 16#0122 put
+dup /Gdotaccent 16#0120 put
+dup /Grave 16#F6CE put
+dup /Gravesmall 16#F760 put
+dup /Gsmall 16#F767 put
+dup /H 16#0048 put
+dup /H18533 16#25CF put
+dup /H18543 16#25AA put
+dup /H18551 16#25AB put
+dup /H22073 16#25A1 put
+dup /Hbar 16#0126 put
+dup /Hcircumflex 16#0124 put
+dup /Hsmall 16#F768 put
+dup /Hungarumlaut 16#F6CF put
+dup /Hungarumlautsmall 16#F6F8 put
+dup /I 16#0049 put
+dup /IJ 16#0132 put
+dup /Iacute 16#00CD put
+dup /Iacutesmall 16#F7ED put
+dup /Ibreve 16#012C put
+dup /Icircumflex 16#00CE put
+dup /Icircumflexsmall 16#F7EE put
+dup /Idieresis 16#00CF put
+dup /Idieresissmall 16#F7EF put
+dup /Idotaccent 16#0130 put
+dup /Ifraktur 16#2111 put
+dup /Igrave 16#00CC put
+dup /Igravesmall 16#F7EC put
+dup /Imacron 16#012A put
+dup /Iogonek 16#012E put
+dup /Iota 16#0399 put
+dup /Iotadieresis 16#03AA put
+dup /Iotatonos 16#038A put
+dup /Ismall 16#F769 put
+dup /Itilde 16#0128 put
+dup /J 16#004A put
+dup /Jcircumflex 16#0134 put
+dup /Jsmall 16#F76A put
+dup /K 16#004B put
+dup /Kappa 16#039A put
+dup /Kcommaaccent 16#0136 put
+dup /Ksmall 16#F76B put
+dup /L 16#004C put
+dup /LL 16#F6BF put
+dup /Lacute 16#0139 put
+dup /Lambda 16#039B put
+dup /Lcaron 16#013D put
+dup /Lcommaaccent 16#013B put
+dup /Ldot 16#013F put
+dup /Lslash 16#0141 put
+dup /Lslashsmall 16#F6F9 put
+dup /Lsmall 16#F76C put
+dup /M 16#004D put
+dup /Macron 16#F6D0 put
+dup /Macronsmall 16#F7AF put
+dup /Msmall 16#F76D put
+dup /Mu 16#039C put
+dup /N 16#004E put
+dup /Nacute 16#0143 put
+dup /Ncaron 16#0147 put
+dup /Ncommaaccent 16#0145 put
+dup /Nsmall 16#F76E put
+dup /Ntilde 16#00D1 put
+dup /Ntildesmall 16#F7F1 put
+dup /Nu 16#039D put
+dup /O 16#004F put
+dup /OE 16#0152 put
+dup /OEsmall 16#F6FA put
+dup /Oacute 16#00D3 put
+dup /Oacutesmall 16#F7F3 put
+dup /Obreve 16#014E put
+dup /Ocircumflex 16#00D4 put
+dup /Ocircumflexsmall 16#F7F4 put
+dup /Odieresis 16#00D6 put
+dup /Odieresissmall 16#F7F6 put
+dup /Ogoneksmall 16#F6FB put
+dup /Ograve 16#00D2 put
+dup /Ogravesmall 16#F7F2 put
+dup /Ohorn 16#01A0 put
+dup /Ohungarumlaut 16#0150 put
+dup /Omacron 16#014C put
+dup /Omega [16#2126 16#03A9] put
+dup /Omegatonos 16#038F put
+dup /Omicron 16#039F put
+dup /Omicrontonos 16#038C put
+dup /Oslash 16#00D8 put
+dup /Oslashacute 16#01FE put
+dup /Oslashsmall 16#F7F8 put
+dup /Osmall 16#F76F put
+dup /Otilde 16#00D5 put
+dup /Otildesmall 16#F7F5 put
+dup /P 16#0050 put
+dup /Phi 16#03A6 put
+dup /Pi 16#03A0 put
+dup /Psi 16#03A8 put
+dup /Psmall 16#F770 put
+dup /Q 16#0051 put
+dup /Qsmall 16#F771 put
+dup /R 16#0052 put
+dup /Racute 16#0154 put
+dup /Rcaron 16#0158 put
+dup /Rcommaaccent 16#0156 put
+dup /Rfraktur 16#211C put
+dup /Rho 16#03A1 put
+dup /Ringsmall 16#F6FC put
+dup /Rsmall 16#F772 put
+dup /S 16#0053 put
+dup /SF010000 16#250C put
+dup /SF020000 16#2514 put
+dup /SF030000 16#2510 put
+dup /SF040000 16#2518 put
+dup /SF050000 16#253C put
+dup /SF060000 16#252C put
+dup /SF070000 16#2534 put
+dup /SF080000 16#251C put
+dup /SF090000 16#2524 put
+dup /SF100000 16#2500 put
+dup /SF110000 16#2502 put
+dup /SF190000 16#2561 put
+dup /SF200000 16#2562 put
+dup /SF210000 16#2556 put
+dup /SF220000 16#2555 put
+dup /SF230000 16#2563 put
+dup /SF240000 16#2551 put
+dup /SF250000 16#2557 put
+dup /SF260000 16#255D put
+dup /SF270000 16#255C put
+dup /SF280000 16#255B put
+dup /SF360000 16#255E put
+dup /SF370000 16#255F put
+dup /SF380000 16#255A put
+dup /SF390000 16#2554 put
+dup /SF400000 16#2569 put
+dup /SF410000 16#2566 put
+dup /SF420000 16#2560 put
+dup /SF430000 16#2550 put
+dup /SF440000 16#256C put
+dup /SF450000 16#2567 put
+dup /SF460000 16#2568 put
+dup /SF470000 16#2564 put
+dup /SF480000 16#2565 put
+dup /SF490000 16#2559 put
+dup /SF500000 16#2558 put
+dup /SF510000 16#2552 put
+dup /SF520000 16#2553 put
+dup /SF530000 16#256B put
+dup /SF540000 16#256A put
+dup /Sacute 16#015A put
+dup /Scaron 16#0160 put
+dup /Scaronsmall 16#F6FD put
+dup /Scedilla [16#015E 16#F6C1] put
+dup /Scircumflex 16#015C put
+dup /Scommaaccent 16#0218 put
+dup /Sigma 16#03A3 put
+dup /Ssmall 16#F773 put
+dup /T 16#0054 put
+dup /Tau 16#03A4 put
+dup /Tbar 16#0166 put
+dup /Tcaron 16#0164 put
+dup /Tcommaaccent [16#0162 16#021A] put
+dup /Theta 16#0398 put
+dup /Thorn 16#00DE put
+dup /Thornsmall 16#F7FE put
+dup /Tildesmall 16#F6FE put
+dup /Tsmall 16#F774 put
+dup /U 16#0055 put
+dup /Uacute 16#00DA put
+dup /Uacutesmall 16#F7FA put
+dup /Ubreve 16#016C put
+dup /Ucircumflex 16#00DB put
+dup /Ucircumflexsmall 16#F7FB put
+dup /Udieresis 16#00DC put
+dup /Udieresissmall 16#F7FC put
+dup /Ugrave 16#00D9 put
+dup /Ugravesmall 16#F7F9 put
+dup /Uhorn 16#01AF put
+dup /Uhungarumlaut 16#0170 put
+dup /Umacron 16#016A put
+dup /Uogonek 16#0172 put
+dup /Upsilon 16#03A5 put
+dup /Upsilon1 16#03D2 put
+dup /Upsilondieresis 16#03AB put
+dup /Upsilontonos 16#038E put
+dup /Uring 16#016E put
+dup /Usmall 16#F775 put
+dup /Utilde 16#0168 put
+dup /V 16#0056 put
+dup /Vsmall 16#F776 put
+dup /W 16#0057 put
+dup /Wacute 16#1E82 put
+dup /Wcircumflex 16#0174 put
+dup /Wdieresis 16#1E84 put
+dup /Wgrave 16#1E80 put
+dup /Wsmall 16#F777 put
+dup /X 16#0058 put
+dup /Xi 16#039E put
+dup /Xsmall 16#F778 put
+dup /Y 16#0059 put
+dup /Yacute 16#00DD put
+dup /Yacutesmall 16#F7FD put
+dup /Ycircumflex 16#0176 put
+dup /Ydieresis 16#0178 put
+dup /Ydieresissmall 16#F7FF put
+dup /Ygrave 16#1EF2 put
+dup /Ysmall 16#F779 put
+dup /Z 16#005A put
+dup /Zacute 16#0179 put
+dup /Zcaron 16#017D put
+dup /Zcaronsmall 16#F6FF put
+dup /Zdotaccent 16#017B put
+dup /Zeta 16#0396 put
+dup /Zsmall 16#F77A put
+dup /a 16#0061 put
+dup /aacute 16#00E1 put
+dup /abreve 16#0103 put
+dup /acircumflex 16#00E2 put
+dup /acute 16#00B4 put
+dup /acutecomb 16#0301 put
+dup /adieresis 16#00E4 put
+dup /ae 16#00E6 put
+dup /aeacute 16#01FD put
+dup /afii00208 16#2015 put
+dup /afii10017 16#0410 put
+dup /afii10018 16#0411 put
+dup /afii10019 16#0412 put
+dup /afii10020 16#0413 put
+dup /afii10021 16#0414 put
+dup /afii10022 16#0415 put
+dup /afii10023 16#0401 put
+dup /afii10024 16#0416 put
+dup /afii10025 16#0417 put
+dup /afii10026 16#0418 put
+dup /afii10027 16#0419 put
+dup /afii10028 16#041A put
+dup /afii10029 16#041B put
+dup /afii10030 16#041C put
+dup /afii10031 16#041D put
+dup /afii10032 16#041E put
+dup /afii10033 16#041F put
+dup /afii10034 16#0420 put
+dup /afii10035 16#0421 put
+dup /afii10036 16#0422 put
+dup /afii10037 16#0423 put
+dup /afii10038 16#0424 put
+dup /afii10039 16#0425 put
+dup /afii10040 16#0426 put
+dup /afii10041 16#0427 put
+dup /afii10042 16#0428 put
+dup /afii10043 16#0429 put
+dup /afii10044 16#042A put
+dup /afii10045 16#042B put
+dup /afii10046 16#042C put
+dup /afii10047 16#042D put
+dup /afii10048 16#042E put
+dup /afii10049 16#042F put
+dup /afii10050 16#0490 put
+dup /afii10051 16#0402 put
+dup /afii10052 16#0403 put
+dup /afii10053 16#0404 put
+dup /afii10054 16#0405 put
+dup /afii10055 16#0406 put
+dup /afii10056 16#0407 put
+dup /afii10057 16#0408 put
+dup /afii10058 16#0409 put
+dup /afii10059 16#040A put
+dup /afii10060 16#040B put
+dup /afii10061 16#040C put
+dup /afii10062 16#040E put
+dup /afii10063 16#F6C4 put
+dup /afii10064 16#F6C5 put
+dup /afii10065 16#0430 put
+dup /afii10066 16#0431 put
+dup /afii10067 16#0432 put
+dup /afii10068 16#0433 put
+dup /afii10069 16#0434 put
+dup /afii10070 16#0435 put
+dup /afii10071 16#0451 put
+dup /afii10072 16#0436 put
+dup /afii10073 16#0437 put
+dup /afii10074 16#0438 put
+dup /afii10075 16#0439 put
+dup /afii10076 16#043A put
+dup /afii10077 16#043B put
+dup /afii10078 16#043C put
+dup /afii10079 16#043D put
+dup /afii10080 16#043E put
+dup /afii10081 16#043F put
+dup /afii10082 16#0440 put
+dup /afii10083 16#0441 put
+dup /afii10084 16#0442 put
+dup /afii10085 16#0443 put
+dup /afii10086 16#0444 put
+dup /afii10087 16#0445 put
+dup /afii10088 16#0446 put
+dup /afii10089 16#0447 put
+dup /afii10090 16#0448 put
+dup /afii10091 16#0449 put
+dup /afii10092 16#044A put
+dup /afii10093 16#044B put
+dup /afii10094 16#044C put
+dup /afii10095 16#044D put
+dup /afii10096 16#044E put
+dup /afii10097 16#044F put
+dup /afii10098 16#0491 put
+dup /afii10099 16#0452 put
+dup /afii10100 16#0453 put
+dup /afii10101 16#0454 put
+dup /afii10102 16#0455 put
+dup /afii10103 16#0456 put
+dup /afii10104 16#0457 put
+dup /afii10105 16#0458 put
+dup /afii10106 16#0459 put
+dup /afii10107 16#045A put
+dup /afii10108 16#045B put
+dup /afii10109 16#045C put
+dup /afii10110 16#045E put
+dup /afii10145 16#040F put
+dup /afii10146 16#0462 put
+dup /afii10147 16#0472 put
+dup /afii10148 16#0474 put
+dup /afii10192 16#F6C6 put
+dup /afii10193 16#045F put
+dup /afii10194 16#0463 put
+dup /afii10195 16#0473 put
+dup /afii10196 16#0475 put
+dup /afii10831 16#F6C7 put
+dup /afii10832 16#F6C8 put
+dup /afii10846 16#04D9 put
+dup /afii299 16#200E put
+dup /afii300 16#200F put
+dup /afii301 16#200D put
+dup /afii57381 16#066A put
+dup /afii57388 16#060C put
+dup /afii57392 16#0660 put
+dup /afii57393 16#0661 put
+dup /afii57394 16#0662 put
+dup /afii57395 16#0663 put
+dup /afii57396 16#0664 put
+dup /afii57397 16#0665 put
+dup /afii57398 16#0666 put
+dup /afii57399 16#0667 put
+dup /afii57400 16#0668 put
+dup /afii57401 16#0669 put
+dup /afii57403 16#061B put
+dup /afii57407 16#061F put
+dup /afii57409 16#0621 put
+dup /afii57410 16#0622 put
+dup /afii57411 16#0623 put
+dup /afii57412 16#0624 put
+dup /afii57413 16#0625 put
+dup /afii57414 16#0626 put
+dup /afii57415 16#0627 put
+dup /afii57416 16#0628 put
+dup /afii57417 16#0629 put
+dup /afii57418 16#062A put
+dup /afii57419 16#062B put
+dup /afii57420 16#062C put
+dup /afii57421 16#062D put
+dup /afii57422 16#062E put
+dup /afii57423 16#062F put
+dup /afii57424 16#0630 put
+dup /afii57425 16#0631 put
+dup /afii57426 16#0632 put
+dup /afii57427 16#0633 put
+dup /afii57428 16#0634 put
+dup /afii57429 16#0635 put
+dup /afii57430 16#0636 put
+dup /afii57431 16#0637 put
+dup /afii57432 16#0638 put
+dup /afii57433 16#0639 put
+dup /afii57434 16#063A put
+dup /afii57440 16#0640 put
+dup /afii57441 16#0641 put
+dup /afii57442 16#0642 put
+dup /afii57443 16#0643 put
+dup /afii57444 16#0644 put
+dup /afii57445 16#0645 put
+dup /afii57446 16#0646 put
+dup /afii57448 16#0648 put
+dup /afii57449 16#0649 put
+dup /afii57450 16#064A put
+dup /afii57451 16#064B put
+dup /afii57452 16#064C put
+dup /afii57453 16#064D put
+dup /afii57454 16#064E put
+dup /afii57455 16#064F put
+dup /afii57456 16#0650 put
+dup /afii57457 16#0651 put
+dup /afii57458 16#0652 put
+dup /afii57470 16#0647 put
+dup /afii57505 16#06A4 put
+dup /afii57506 16#067E put
+dup /afii57507 16#0686 put
+dup /afii57508 16#0698 put
+dup /afii57509 16#06AF put
+dup /afii57511 16#0679 put
+dup /afii57512 16#0688 put
+dup /afii57513 16#0691 put
+dup /afii57514 16#06BA put
+dup /afii57519 16#06D2 put
+dup /afii57534 16#06D5 put
+dup /afii57636 16#20AA put
+dup /afii57645 16#05BE put
+dup /afii57658 16#05C3 put
+dup /afii57664 16#05D0 put
+dup /afii57665 16#05D1 put
+dup /afii57666 16#05D2 put
+dup /afii57667 16#05D3 put
+dup /afii57668 16#05D4 put
+dup /afii57669 16#05D5 put
+dup /afii57670 16#05D6 put
+dup /afii57671 16#05D7 put
+dup /afii57672 16#05D8 put
+dup /afii57673 16#05D9 put
+dup /afii57674 16#05DA put
+dup /afii57675 16#05DB put
+dup /afii57676 16#05DC put
+dup /afii57677 16#05DD put
+dup /afii57678 16#05DE put
+dup /afii57679 16#05DF put
+dup /afii57680 16#05E0 put
+dup /afii57681 16#05E1 put
+dup /afii57682 16#05E2 put
+dup /afii57683 16#05E3 put
+dup /afii57684 16#05E4 put
+dup /afii57685 16#05E5 put
+dup /afii57686 16#05E6 put
+dup /afii57687 16#05E7 put
+dup /afii57688 16#05E8 put
+dup /afii57689 16#05E9 put
+dup /afii57690 16#05EA put
+dup /afii57694 16#FB2A put
+dup /afii57695 16#FB2B put
+dup /afii57700 16#FB4B put
+dup /afii57705 16#FB1F put
+dup /afii57716 16#05F0 put
+dup /afii57717 16#05F1 put
+dup /afii57718 16#05F2 put
+dup /afii57723 16#FB35 put
+dup /afii57793 16#05B4 put
+dup /afii57794 16#05B5 put
+dup /afii57795 16#05B6 put
+dup /afii57796 16#05BB put
+dup /afii57797 16#05B8 put
+dup /afii57798 16#05B7 put
+dup /afii57799 16#05B0 put
+dup /afii57800 16#05B2 put
+dup /afii57801 16#05B1 put
+dup /afii57802 16#05B3 put
+dup /afii57803 16#05C2 put
+dup /afii57804 16#05C1 put
+dup /afii57806 16#05B9 put
+dup /afii57807 16#05BC put
+dup /afii57839 16#05BD put
+dup /afii57841 16#05BF put
+dup /afii57842 16#05C0 put
+dup /afii57929 16#02BC put
+dup /afii61248 16#2105 put
+dup /afii61289 16#2113 put
+dup /afii61352 16#2116 put
+dup /afii61573 16#202C put
+dup /afii61574 16#202D put
+dup /afii61575 16#202E put
+dup /afii61664 16#200C put
+dup /afii63167 16#066D put
+dup /afii64937 16#02BD put
+dup /agrave 16#00E0 put
+dup /aleph 16#2135 put
+dup /alpha 16#03B1 put
+dup /alphatonos 16#03AC put
+dup /amacron 16#0101 put
+dup /ampersand 16#0026 put
+dup /ampersandsmall 16#F726 put
+dup /angle 16#2220 put
+dup /angleleft 16#2329 put
+dup /angleright 16#232A put
+dup /anoteleia 16#0387 put
+dup /aogonek 16#0105 put
+dup /approxequal 16#2248 put
+dup /aring 16#00E5 put
+dup /aringacute 16#01FB put
+dup /arrowboth 16#2194 put
+dup /arrowdblboth 16#21D4 put
+dup /arrowdbldown 16#21D3 put
+dup /arrowdblleft 16#21D0 put
+dup /arrowdblright 16#21D2 put
+dup /arrowdblup 16#21D1 put
+dup /arrowdown 16#2193 put
+dup /arrowhorizex 16#F8E7 put
+dup /arrowleft 16#2190 put
+dup /arrowright 16#2192 put
+dup /arrowup 16#2191 put
+dup /arrowupdn 16#2195 put
+dup /arrowupdnbse 16#21A8 put
+dup /arrowvertex 16#F8E6 put
+dup /asciicircum 16#005E put
+dup /asciitilde 16#007E put
+dup /asterisk 16#002A put
+dup /asteriskmath 16#2217 put
+dup /asuperior 16#F6E9 put
+dup /at 16#0040 put
+dup /atilde 16#00E3 put
+dup /b 16#0062 put
+dup /backslash 16#005C put
+dup /bar 16#007C put
+dup /beta 16#03B2 put
+dup /block 16#2588 put
+dup /braceex 16#F8F4 put
+dup /braceleft 16#007B put
+dup /braceleftbt 16#F8F3 put
+dup /braceleftmid 16#F8F2 put
+dup /bracelefttp 16#F8F1 put
+dup /braceright 16#007D put
+dup /bracerightbt 16#F8FE put
+dup /bracerightmid 16#F8FD put
+dup /bracerighttp 16#F8FC put
+dup /bracketleft 16#005B put
+dup /bracketleftbt 16#F8F0 put
+dup /bracketleftex 16#F8EF put
+dup /bracketlefttp 16#F8EE put
+dup /bracketright 16#005D put
+dup /bracketrightbt 16#F8FB put
+dup /bracketrightex 16#F8FA put
+dup /bracketrighttp 16#F8F9 put
+dup /breve 16#02D8 put
+dup /brokenbar 16#00A6 put
+dup /bsuperior 16#F6EA put
+dup /bullet 16#2022 put
+dup /c 16#0063 put
+dup /cacute 16#0107 put
+dup /caron 16#02C7 put
+dup /carriagereturn 16#21B5 put
+dup /ccaron 16#010D put
+dup /ccedilla 16#00E7 put
+dup /ccircumflex 16#0109 put
+dup /cdotaccent 16#010B put
+dup /cedilla 16#00B8 put
+dup /cent 16#00A2 put
+dup /centinferior 16#F6DF put
+dup /centoldstyle 16#F7A2 put
+dup /centsuperior 16#F6E0 put
+dup /chi 16#03C7 put
+dup /circle 16#25CB put
+dup /circlemultiply 16#2297 put
+dup /circleplus 16#2295 put
+dup /circumflex 16#02C6 put
+dup /club 16#2663 put
+dup /colon 16#003A put
+dup /colonmonetary 16#20A1 put
+dup /comma 16#002C put
+dup /commaaccent 16#F6C3 put
+dup /commainferior 16#F6E1 put
+dup /commasuperior 16#F6E2 put
+dup /congruent 16#2245 put
+dup /copyright 16#00A9 put
+dup /copyrightsans 16#F8E9 put
+dup /copyrightserif 16#F6D9 put
+dup /currency 16#00A4 put
+dup /cyrBreve 16#F6D1 put
+dup /cyrFlex 16#F6D2 put
+dup /cyrbreve 16#F6D4 put
+dup /cyrflex 16#F6D5 put
+dup /d 16#0064 put
+dup /dagger 16#2020 put
+dup /daggerdbl 16#2021 put
+dup /dblGrave 16#F6D3 put
+dup /dblgrave 16#F6D6 put
+dup /dcaron 16#010F put
+dup /dcroat 16#0111 put
+dup /degree 16#00B0 put
+dup /delta 16#03B4 put
+dup /diamond 16#2666 put
+dup /dieresis 16#00A8 put
+dup /dieresisacute 16#F6D7 put
+dup /dieresisgrave 16#F6D8 put
+dup /dieresistonos 16#0385 put
+dup /divide 16#00F7 put
+dup /dkshade 16#2593 put
+dup /dnblock 16#2584 put
+dup /dollar 16#0024 put
+dup /dollarinferior 16#F6E3 put
+dup /dollaroldstyle 16#F724 put
+dup /dollarsuperior 16#F6E4 put
+dup /dong 16#20AB put
+dup /dotaccent 16#02D9 put
+dup /dotbelowcomb 16#0323 put
+dup /dotlessi 16#0131 put
+dup /dotlessj 16#F6BE put
+dup /dotmath 16#22C5 put
+dup /dsuperior 16#F6EB put
+dup /e 16#0065 put
+dup /eacute 16#00E9 put
+dup /ebreve 16#0115 put
+dup /ecaron 16#011B put
+dup /ecircumflex 16#00EA put
+dup /edieresis 16#00EB put
+dup /edotaccent 16#0117 put
+dup /egrave 16#00E8 put
+dup /eight 16#0038 put
+dup /eightinferior 16#2088 put
+dup /eightoldstyle 16#F738 put
+dup /eightsuperior 16#2078 put
+dup /element 16#2208 put
+dup /ellipsis 16#2026 put
+dup /emacron 16#0113 put
+dup /emdash 16#2014 put
+dup /emptyset 16#2205 put
+dup /endash 16#2013 put
+dup /eng 16#014B put
+dup /eogonek 16#0119 put
+dup /epsilon 16#03B5 put
+dup /epsilontonos 16#03AD put
+dup /equal 16#003D put
+dup /equivalence 16#2261 put
+dup /estimated 16#212E put
+dup /esuperior 16#F6EC put
+dup /eta 16#03B7 put
+dup /etatonos 16#03AE put
+dup /eth 16#00F0 put
+dup /exclam 16#0021 put
+dup /exclamdbl 16#203C put
+dup /exclamdown 16#00A1 put
+dup /exclamdownsmall 16#F7A1 put
+dup /exclamsmall 16#F721 put
+dup /existential 16#2203 put
+dup /f 16#0066 put
+dup /female 16#2640 put
+dup /ff 16#FB00 put
+dup /ffi 16#FB03 put
+dup /ffl 16#FB04 put
+dup /fi 16#FB01 put
+dup /figuredash 16#2012 put
+dup /filledbox 16#25A0 put
+dup /filledrect 16#25AC put
+dup /five 16#0035 put
+dup /fiveeighths 16#215D put
+dup /fiveinferior 16#2085 put
+dup /fiveoldstyle 16#F735 put
+dup /fivesuperior 16#2075 put
+dup /fl 16#FB02 put
+dup /florin 16#0192 put
+dup /four 16#0034 put
+dup /fourinferior 16#2084 put
+dup /fouroldstyle 16#F734 put
+dup /foursuperior 16#2074 put
+dup /fraction [16#2044 16#2215] put
+dup /franc 16#20A3 put
+dup /g 16#0067 put
+dup /gamma 16#03B3 put
+dup /gbreve 16#011F put
+dup /gcaron 16#01E7 put
+dup /gcircumflex 16#011D put
+dup /gcommaaccent 16#0123 put
+dup /gdotaccent 16#0121 put
+dup /germandbls 16#00DF put
+dup /gradient 16#2207 put
+dup /grave 16#0060 put
+dup /gravecomb 16#0300 put
+dup /greater 16#003E put
+dup /greaterequal 16#2265 put
+dup /guillemotleft 16#00AB put
+dup /guillemotright 16#00BB put
+dup /guilsinglleft 16#2039 put
+dup /guilsinglright 16#203A put
+dup /h 16#0068 put
+dup /hbar 16#0127 put
+dup /hcircumflex 16#0125 put
+dup /heart 16#2665 put
+dup /hookabovecomb 16#0309 put
+dup /house 16#2302 put
+dup /hungarumlaut 16#02DD put
+dup /hyphen [16#002D 16#00AD] put
+dup /hypheninferior 16#F6E5 put
+dup /hyphensuperior 16#F6E6 put
+dup /i 16#0069 put
+dup /iacute 16#00ED put
+dup /ibreve 16#012D put
+dup /icircumflex 16#00EE put
+dup /idieresis 16#00EF put
+dup /igrave 16#00EC put
+dup /ij 16#0133 put
+dup /imacron 16#012B put
+dup /infinity 16#221E put
+dup /integral 16#222B put
+dup /integralbt 16#2321 put
+dup /integralex 16#F8F5 put
+dup /integraltp 16#2320 put
+dup /intersection 16#2229 put
+dup /invbullet 16#25D8 put
+dup /invcircle 16#25D9 put
+dup /invsmileface 16#263B put
+dup /iogonek 16#012F put
+dup /iota 16#03B9 put
+dup /iotadieresis 16#03CA put
+dup /iotadieresistonos 16#0390 put
+dup /iotatonos 16#03AF put
+dup /isuperior 16#F6ED put
+dup /itilde 16#0129 put
+dup /j 16#006A put
+dup /jcircumflex 16#0135 put
+dup /k 16#006B put
+dup /kappa 16#03BA put
+dup /kcommaaccent 16#0137 put
+dup /kgreenlandic 16#0138 put
+dup /l 16#006C put
+dup /lacute 16#013A put
+dup /lambda 16#03BB put
+dup /lcaron 16#013E put
+dup /lcommaaccent 16#013C put
+dup /ldot 16#0140 put
+dup /less 16#003C put
+dup /lessequal 16#2264 put
+dup /lfblock 16#258C put
+dup /lira 16#20A4 put
+dup /ll 16#F6C0 put
+dup /logicaland 16#2227 put
+dup /logicalnot 16#00AC put
+dup /logicalor 16#2228 put
+dup /longs 16#017F put
+dup /lozenge 16#25CA put
+dup /lslash 16#0142 put
+dup /lsuperior 16#F6EE put
+dup /ltshade 16#2591 put
+dup /m 16#006D put
+dup /macron [16#00AF 16#02C9] put
+dup /male 16#2642 put
+dup /minus 16#2212 put
+dup /minute 16#2032 put
+dup /msuperior 16#F6EF put
+dup /mu [16#00B5 16#03BC] put
+dup /multiply 16#00D7 put
+dup /musicalnote 16#266A put
+dup /musicalnotedbl 16#266B put
+dup /n 16#006E put
+dup /nacute 16#0144 put
+dup /napostrophe 16#0149 put
+dup /ncaron 16#0148 put
+dup /ncommaaccent 16#0146 put
+dup /nine 16#0039 put
+dup /nineinferior 16#2089 put
+dup /nineoldstyle 16#F739 put
+dup /ninesuperior 16#2079 put
+dup /notelement 16#2209 put
+dup /notequal 16#2260 put
+dup /notsubset 16#2284 put
+dup /nsuperior 16#207F put
+dup /ntilde 16#00F1 put
+dup /nu 16#03BD put
+dup /numbersign 16#0023 put
+dup /o 16#006F put
+dup /oacute 16#00F3 put
+dup /obreve 16#014F put
+dup /ocircumflex 16#00F4 put
+dup /odieresis 16#00F6 put
+dup /oe 16#0153 put
+dup /ogonek 16#02DB put
+dup /ograve 16#00F2 put
+dup /ohorn 16#01A1 put
+dup /ohungarumlaut 16#0151 put
+dup /omacron 16#014D put
+dup /omega 16#03C9 put
+dup /omega1 16#03D6 put
+dup /omegatonos 16#03CE put
+dup /omicron 16#03BF put
+dup /omicrontonos 16#03CC put
+dup /one 16#0031 put
+dup /onedotenleader 16#2024 put
+dup /oneeighth 16#215B put
+dup /onefitted 16#F6DC put
+dup /onehalf 16#00BD put
+dup /oneinferior 16#2081 put
+dup /oneoldstyle 16#F731 put
+dup /onequarter 16#00BC put
+dup /onesuperior 16#00B9 put
+dup /onethird 16#2153 put
+dup /openbullet 16#25E6 put
+dup /ordfeminine 16#00AA put
+dup /ordmasculine 16#00BA put
+dup /orthogonal 16#221F put
+dup /oslash 16#00F8 put
+dup /oslashacute 16#01FF put
+dup /osuperior 16#F6F0 put
+dup /otilde 16#00F5 put
+dup /p 16#0070 put
+dup /paragraph 16#00B6 put
+dup /parenleft 16#0028 put
+dup /parenleftbt 16#F8ED put
+dup /parenleftex 16#F8EC put
+dup /parenleftinferior 16#208D put
+dup /parenleftsuperior 16#207D put
+dup /parenlefttp 16#F8EB put
+dup /parenright 16#0029 put
+dup /parenrightbt 16#F8F8 put
+dup /parenrightex 16#F8F7 put
+dup /parenrightinferior 16#208E put
+dup /parenrightsuperior 16#207E put
+dup /parenrighttp 16#F8F6 put
+dup /partialdiff 16#2202 put
+dup /percent 16#0025 put
+dup /period 16#002E put
+dup /periodcentered [16#00B7 16#2219] put
+dup /periodinferior 16#F6E7 put
+dup /periodsuperior 16#F6E8 put
+dup /perpendicular 16#22A5 put
+dup /perthousand 16#2030 put
+dup /peseta 16#20A7 put
+dup /phi 16#03C6 put
+dup /phi1 16#03D5 put
+dup /pi 16#03C0 put
+dup /plus 16#002B put
+dup /plusminus 16#00B1 put
+dup /prescription 16#211E put
+dup /product 16#220F put
+dup /propersubset 16#2282 put
+dup /propersuperset 16#2283 put
+dup /proportional 16#221D put
+dup /psi 16#03C8 put
+dup /q 16#0071 put
+dup /question 16#003F put
+dup /questiondown 16#00BF put
+dup /questiondownsmall 16#F7BF put
+dup /questionsmall 16#F73F put
+dup /quotedbl 16#0022 put
+dup /quotedblbase 16#201E put
+dup /quotedblleft 16#201C put
+dup /quotedblright 16#201D put
+dup /quoteleft 16#2018 put
+dup /quotereversed 16#201B put
+dup /quoteright 16#2019 put
+dup /quotesinglbase 16#201A put
+dup /quotesingle 16#0027 put
+dup /r 16#0072 put
+dup /racute 16#0155 put
+dup /radical 16#221A put
+dup /radicalex 16#F8E5 put
+dup /rcaron 16#0159 put
+dup /rcommaaccent 16#0157 put
+dup /reflexsubset 16#2286 put
+dup /reflexsuperset 16#2287 put
+dup /registered 16#00AE put
+dup /registersans 16#F8E8 put
+dup /registerserif 16#F6DA put
+dup /revlogicalnot 16#2310 put
+dup /rho 16#03C1 put
+dup /ring 16#02DA put
+dup /rsuperior 16#F6F1 put
+dup /rtblock 16#2590 put
+dup /rupiah 16#F6DD put
+dup /s 16#0073 put
+dup /sacute 16#015B put
+dup /scaron 16#0161 put
+dup /scedilla [16#015F 16#F6C2] put
+dup /scircumflex 16#015D put
+dup /scommaaccent 16#0219 put
+dup /second 16#2033 put
+dup /section 16#00A7 put
+dup /semicolon 16#003B put
+dup /seven 16#0037 put
+dup /seveneighths 16#215E put
+dup /seveninferior 16#2087 put
+dup /sevenoldstyle 16#F737 put
+dup /sevensuperior 16#2077 put
+dup /shade 16#2592 put
+dup /sigma 16#03C3 put
+dup /sigma1 16#03C2 put
+dup /similar 16#223C put
+dup /six 16#0036 put
+dup /sixinferior 16#2086 put
+dup /sixoldstyle 16#F736 put
+dup /sixsuperior 16#2076 put
+dup /slash 16#002F put
+dup /smileface 16#263A put
+dup /space [16#0020 16#00A0] put
+dup /spade 16#2660 put
+dup /ssuperior 16#F6F2 put
+dup /sterling 16#00A3 put
+dup /suchthat 16#220B put
+dup /summation 16#2211 put
+dup /sun 16#263C put
+dup /t 16#0074 put
+dup /tau 16#03C4 put
+dup /tbar 16#0167 put
+dup /tcaron 16#0165 put
+dup /tcommaaccent [16#0163 16#021B] put
+dup /therefore 16#2234 put
+dup /theta 16#03B8 put
+dup /theta1 16#03D1 put
+dup /thorn 16#00FE put
+dup /three 16#0033 put
+dup /threeeighths 16#215C put
+dup /threeinferior 16#2083 put
+dup /threeoldstyle 16#F733 put
+dup /threequarters 16#00BE put
+dup /threequartersemdash 16#F6DE put
+dup /threesuperior 16#00B3 put
+dup /tilde 16#02DC put
+dup /tildecomb 16#0303 put
+dup /tonos 16#0384 put
+dup /trademark 16#2122 put
+dup /trademarksans 16#F8EA put
+dup /trademarkserif 16#F6DB put
+dup /triagdn 16#25BC put
+dup /triaglf 16#25C4 put
+dup /triagrt 16#25BA put
+dup /triagup 16#25B2 put
+dup /tsuperior 16#F6F3 put
+dup /two 16#0032 put
+dup /twodotenleader 16#2025 put
+dup /twoinferior 16#2082 put
+dup /twooldstyle 16#F732 put
+dup /twosuperior 16#00B2 put
+dup /twothirds 16#2154 put
+dup /u 16#0075 put
+dup /uacute 16#00FA put
+dup /ubreve 16#016D put
+dup /ucircumflex 16#00FB put
+dup /udieresis 16#00FC put
+dup /ugrave 16#00F9 put
+dup /uhorn 16#01B0 put
+dup /uhungarumlaut 16#0171 put
+dup /umacron 16#016B put
+dup /underscore 16#005F put
+dup /underscoredbl 16#2017 put
+dup /union 16#222A put
+dup /universal 16#2200 put
+dup /uogonek 16#0173 put
+dup /upblock 16#2580 put
+dup /upsilon 16#03C5 put
+dup /upsilondieresis 16#03CB put
+dup /upsilondieresistonos 16#03B0 put
+dup /upsilontonos 16#03CD put
+dup /uring 16#016F put
+dup /utilde 16#0169 put
+dup /v 16#0076 put
+dup /w 16#0077 put
+dup /wacute 16#1E83 put
+dup /wcircumflex 16#0175 put
+dup /wdieresis 16#1E85 put
+dup /weierstrass 16#2118 put
+dup /wgrave 16#1E81 put
+dup /x 16#0078 put
+dup /xi 16#03BE put
+dup /y 16#0079 put
+dup /yacute 16#00FD put
+dup /ycircumflex 16#0177 put
+dup /ydieresis 16#00FF put
+dup /yen 16#00A5 put
+dup /ygrave 16#1EF3 put
+dup /z 16#007A put
+dup /zacute 16#017A put
+dup /zcaron 16#017E put
+dup /zdotaccent 16#017C put
+dup /zero 16#0030 put
+dup /zeroinferior 16#2080 put
+dup /zerooldstyle 16#F730 put
+dup /zerosuperior 16#2070 put
+dup /zeta 16#03B6 put
+def
diff --git a/Master/xemtex/gslib/gs_btokn.ps b/Master/xemtex/gslib/gs_btokn.ps
new file mode 100644
index 00000000000..21ef12bb286
--- /dev/null
+++ b/Master/xemtex/gslib/gs_btokn.ps
@@ -0,0 +1,321 @@
+% Copyright (C) 1994, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_btokn.ps,v 1.5.2.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Initialization file for binary tokens.
+% When this is run, systemdict is still writable,
+% but everything defined here goes into level2dict.
+
+% Define whether or not to allow writing dictionaries.
+% This is a non-standard feature!
+/WRITEDICTS false def
+
+languagelevel 1 .setlanguagelevel
+level2dict begin
+
+% Initialization for the system name table.
+
+mark
+% 0
+ /abs /add /aload /anchorsearch /and
+ /arc /arcn /arct /arcto /array
+ /ashow /astore /awidthshow /begin /bind
+ /bitshift /ceiling /charpath /clear /cleartomark
+% 20
+ /clip /clippath /closepath /concat /concatmatrix
+ /copy /count /counttomark /currentcmykcolor /currentdash
+ /currentdict /currentfile /currentfont /currentgray /currentgstate
+ /currenthsbcolor /currentlinecap /currentlinejoin /currentlinewidth /currentmatrix
+% 40
+ /currentpoint /currentrgbcolor /currentshared /curveto /cvi
+ /cvlit /cvn /cvr /cvrs /cvs
+ /cvx /def /defineusername /dict /div
+ /dtransform /dup /end /eoclip /eofill
+% 60
+ /eoviewclip /eq /exch /exec /exit
+ /file /fill /findfont /flattenpath /floor
+ /flush /flushfile /for /forall /ge
+ /get /getinterval /grestore /gsave /gstate
+% 80
+ /gt /identmatrix /idiv /idtransform /if
+ /ifelse /image /imagemask /index /ineofill
+ /infill /initviewclip /inueofill /inufill /invertmatrix
+ /itransform /known /le /length /lineto
+% 100
+ /load /loop /lt /makefont /matrix
+ /maxlength /mod /moveto /mul /ne
+ /neg /newpath /not /null /or
+ /pathbbox /pathforall /pop /print /printobject
+% 120
+ /put /putinterval /rcurveto /read /readhexstring
+ /readline /readstring /rectclip /rectfill /rectstroke
+ /rectviewclip /repeat /restore /rlineto /rmoveto
+ /roll /rotate /round /save /scale
+% 140
+ /scalefont /search /selectfont /setbbox /setcachedevice
+ /setcachedevice2 /setcharwidth /setcmykcolor /setdash /setfont
+ /setgray /setgstate /sethsbcolor /setlinecap /setlinejoin
+ /setlinewidth /setmatrix /setrgbcolor /setshared /shareddict
+% 160
+ /show /showpage /stop /stopped /store
+ /string /stringwidth /stroke /strokepath /sub
+ /systemdict /token /transform /translate /truncate
+ /type /uappend /ucache /ueofill /ufill
+% 180
+ /undef /upath /userdict /ustroke /viewclip
+ /viewclippath /where /widthshow /write /writehexstring
+ /writeobject /writestring /wtranslation /xor /xshow
+ /xyshow /yshow /FontDirectory /SharedFontDirectory /Courier
+% 200
+ /Courier-Bold /Courier-BoldOblique /Courier-Oblique /Helvetica /Helvetica-Bold
+ /Helvetica-BoldOblique /Helvetica-Oblique /Symbol /Times-Bold /Times-BoldItalic
+ /Times-Italic /Times-Roman /execuserobject /currentcolor /currentcolorspace
+ /currentglobal /execform /filter /findresource /globaldict
+% 220
+ /makepattern /setcolor /setcolorspace /setglobal /setpagedevice
+ /setpattern
+% pad to 256
+ counttomark 256 exch sub { 0 } repeat
+% 256
+ /= /== /ISOLatin1Encoding /StandardEncoding
+% 260
+ ([) cvn (]) cvn /atan /banddevice /bytesavailable
+ /cachestatus /closefile /colorimage /condition /copypage
+ /cos /countdictstack /countexecstack /cshow /currentblackgeneration
+ /currentcacheparams /currentcolorscreen /currentcolortransfer /currentcontext /currentflat
+% 280
+ /currenthalftone /currenthalftonephase /currentmiterlimit /currentobjectformat /currentpacking
+ /currentscreen /currentstrokeadjust /currenttransfer /currentundercolorremoval /defaultmatrix
+ /definefont /deletefile /detach /deviceinfo /dictstack
+ /echo /erasepage /errordict /execstack /executeonly
+% 300
+ /exp /false /filenameforall /fileposition /fork
+ /framedevice /grestoreall /handleerror /initclip /initgraphics
+ /initmatrix /instroke /inustroke /join /kshow
+ /ln /lock /log /mark /monitor
+% 320
+ /noaccess /notify /nulldevice /packedarray /quit
+ /rand /rcheck /readonly /realtime /renamefile
+ /renderbands /resetfile /reversepath /rootfont /rrand
+ /run /scheck /setblackgeneration /setcachelimit /setcacheparams
+% 340
+ /setcolorscreen /setcolortransfer /setfileposition /setflat /sethalftone
+ /sethalftonephase /setmiterlimit /setobjectformat /setpacking /setscreen
+ /setstrokeadjust /settransfer /setucacheparams /setundercolorremoval /sin
+ /sqrt /srand /stack /status /statusdict
+% 360
+ /true /ucachestatus /undefinefont /usertime /ustrokepath
+ /version /vmreclaim /vmstatus /wait /wcheck
+ /xcheck /yield /defineuserobject /undefineuserobject /UserObjects
+ /cleardictstack
+% 376
+ /A /B /C /D /E /F /G /H /I /J /K /L /M
+ /N /O /P /Q /R /S /T /U /V /W /X /Y /Z
+ /a /b /c /d /e /f /g /h /i /j /k /l /m
+ /n /o /p /q /r /s /t /u /v /w /x /y /z
+% 428
+ /setvmthreshold (<<) cvn
+ (>>) cvn /currentcolorrendering /currentdevparams /currentoverprint /currentpagedevice
+ /currentsystemparams /currentuserparams /defineresource /findencoding /gcheck
+% 440
+ /glyphshow /languagelevel /product /pstack /resourceforall
+ /resourcestatus /revision /serialnumber /setcolorrendering /setdevparams
+ /setoverprint /setsystemparams /setuserparams /startjob /undefineresource
+ /GlobalFontDirectory /ASCII85Decode /ASCII85Encode /ASCIIHexDecode /ASCIIHexEncode
+% 460
+ /CCITTFaxDecode /CCITTFaxEncode /DCTDecode /DCTEncode /LZWDecode
+ /LZWEncode /NullEncode /RunLengthDecode /RunLengthEncode /SubFileDecode
+ /CIEBasedA /CIEBasedABC /DeviceCMYK /DeviceGray /DeviceRGB
+ /Indexed /Pattern /Separation /CIEBasedDEF /CIEBasedDEFG
+% 480
+ /DeviceN
+% 481 -- end
+.packtomark
+dup /SystemNames exch def .installsystemnames
+
+% Define printobject and writeobject.
+% These are mostly implemented in PostScript, so that we don't have to
+% worry about interrupts or callbacks when writing to the output file.
+
+% Define procedures for accumulating the space required to represent
+% an object in binary form.
+/cntdict mark % <#refs> <#chars> <obj> -proc- <#refs> <#chars>
+ /integertype /pop load
+ /realtype 1 index
+ /marktype 1 index
+ /nulltype 1 index
+ /booleantype 1 index
+ /nametype { length add } bind
+ /stringtype 1 index
+ /arraytype null
+ /dicttype null
+.dicttomark def
+cntdict /arraytype {
+ dup length 4 -1 roll add 3 1 roll {
+ dup type //cntdict exch get exec
+ } forall
+} bind put
+cntdict /dicttype {
+ WRITEDICTS {
+ dup dup length 2 mul 5 -1 roll add 4 2 roll {
+ 4 1 roll dup type //cntdict exch get exec
+ 3 -1 roll dup type //cntdict exch get exec
+ } forall
+ } {
+ /writeobject load /typecheck signalerror
+ } ifelse
+} bind put
+
+/w2dict mark
+ /nametype { 2 copy .writecvs pop } bind
+ /stringtype 1 index
+.dicttomark def
+
+/.bosheader { % <top_length> <total_length> <string8> .bosheader
+ % <string4|8>
+ dup 0 currentobjectformat 127 add put % object format => BOS tag
+ 2 index 255 le 2 index 65531 le and {
+ % Use the short header format: tag toplen(1) totlen(2)
+ exch 4 add exch
+ 0 4 getinterval
+ dup 1 5 -1 roll put
+ } {
+ % Use the long header format: tag 0(1) toplen(2) totlen(4)
+ exch 8 add exch
+ 0 0 4 2 roll .bosobject exch pop exch pop % store with byte swapping
+ } ifelse % Stack: shortlen str
+ exch dup -8 bitshift exch 255 and % str hibyte lobyte
+ currentobjectformat 1 and 0 eq { % lsb first
+ exch
+ } if
+ 2 index 3 3 -1 roll put
+ 1 index 2 3 -1 roll put
+} .bind def
+
+/.writeobjects { % <file> <tag> <array> .writeobjects -
+ mark exch
+
+ % Count the space required for refs and strings.
+
+ dup length 0 3 -1 roll
+ % Stack: file tag -mark- #refs #chars array
+ dup 4 1 roll {
+ dup type /arraytype eq {
+ % Nested array. An element of the array is also
+ % an array(sub array). Push the sub array to the stack.
+ dup 4 1 roll
+ } if
+ dup type //cntdict exch get exec
+ } forall
+
+ % Write the header.
+
+ % Stack: file tag -mark- array1 ... array|dictN #refs #chars
+ counttomark 3 add -2 roll 4 1 roll
+ % Stack: -mark- array1 ... array|dictN tag #refs #chars file
+ dup counttomark 1 sub index length
+ 4 index 3 bitshift 4 index add
+ (xxxxxxxx) .bosheader writestring
+
+ % Write the objects per se.
+
+ 3 1 roll pop
+ counttomark 1 sub index length 3 bitshift exch
+ 3 bitshift
+ % Stack: -mark- array1 ... array|dictN tag file ref# char#
+ counttomark 4 sub {
+ counttomark -1 roll dup 6 1 roll
+ dup type /dicttype eq { % can't be first object
+ { 5 1 roll (xxxxxxxx) .bosobject
+ 3 index exch writestring
+ 4 -1 roll (xxxxxxxx) .bosobject
+ 3 index exch writestring
+ } forall
+ } {
+ { (xxxxxxxx) .bosobject
+ dup 1 6 index put
+ 3 index exch writestring
+ 4 -1 roll pop 0 4 1 roll % clear tag
+ } forall
+ } ifelse
+ } repeat
+
+ % Write the strings and names.
+
+ pop pop exch pop
+ % Stack: -mark- array1 ... array|dictN file
+ counttomark 1 sub {
+ counttomark -1 roll {
+ % The counting pass ensured that the keys and values
+ % of any dictionary must be writable objects.
+ % Hence, we are processing a dictionary iff
+ % the next-to-top stack element is not a file.
+ 1 index type /filetype ne {
+ exch 2 index exch dup type //w2dict exch .knownget
+ { exec } { pop } ifelse pop
+ } if
+ dup type //w2dict exch .knownget { exec } { pop } ifelse
+ } forall
+ } repeat
+
+ % Clean up.
+
+ % Stack: -mark- file
+ pop pop
+
+} odef
+
+/printobject { % <obj> <tag> printobject -
+ (%stdout) (w) file 2 index 2 index writeobject pop pop
+} odef
+/writeobject { % <file> <obj> <tag> writeobject -
+ 3 copy exch
+ % We must allocate the array in local VM
+ % to avoid a possible invalidaccess.
+ .currentglobal false .setglobal exch 1 array astore exch .setglobal
+ .writeobjects pop pop pop
+} odef
+
+% Implement binary error message output.
+/.objectprinttest { % <obj> .objectprinttest -
+ % This is a pseudo-operator so it will restore the stack
+ % if it gets an error.
+ 0 0 2 index roll dup type //cntdict exch get exec pop pop pop
+} bind odef
+/.printerror {
+ $error /binary get .languagelevel 2 ge and {
+ currentobjectformat 0 ne {
+ [ /Error $error /errorname get $error /command get
+ % Convert the object with cvs if it isn't printable.
+ dup { .objectprinttest } .internalstopped {
+ pop 100 string cvs
+ } if
+ false ] 250 printobject
+ }
+ //.printerror % known to be a procedure
+ ifelse
+ }
+ //.printerror % known to be a procedure
+ ifelse
+} bind def
+
+currentdict /cntdict .undef
+currentdict /w2dict .undef
+
+% End of level2dict
+
+end
+.setlanguagelevel
diff --git a/Master/xemtex/gslib/gs_ccfnt.ps b/Master/xemtex/gslib/gs_ccfnt.ps
new file mode 100644
index 00000000000..ad92b3c7033
--- /dev/null
+++ b/Master/xemtex/gslib/gs_ccfnt.ps
@@ -0,0 +1,76 @@
+% Copyright (C) 1994, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_ccfnt.ps,v 1.5.2.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Find and register all the precompiled font operators in systemdict.
+
+/registerfont % <fontname> <fontdict> registerfont <font>
+ { DEBUG { (Registering ) print 1 index = } if
+ dup begin
+ Encoding type /nametype eq
+ { Encoding .findencoding /Encoding exch def
+ }
+ if
+ dup /PrefEnc known
+ { PrefEnc type /nametype eq
+ { PrefEnc .findencoding /PrefEnc exch def
+ }
+ if
+ }
+ if
+ dup /FDepVector known
+ { /FDepVector [ FDepVector
+ { .FontDirectory 1 index .knownget
+ { exch pop }
+ { ccfonts 1 index .knownget
+ { registerfont
+ }
+ { Fontmap 1 index known
+ { findfont }
+ { pop NullFont }
+ ifelse
+ }
+ ifelse
+ }
+ ifelse
+ }
+ forall ] readonly def
+ }
+ if
+ end
+ % Use the value of definefont appropriate at run-time, not bind-time
+ /definefont load exec
+ } bind odef
+% Bind recursive call (bind descends into oparrays: feature!)
+/registerfont dup load bind def
+
+/.loadinitialfonts {
+ //.loadinitialfonts exec
+ NOCCFONTS not {
+ /ccfonts mark
+ 0 1 null .getccfont 1 sub { .getccfont dup /FontName get exch } for
+ .dicttomark def
+ % Make sure these fonts are registered as "resources".
+ currentfile {
+ pop ccfonts {
+ .FontDirectory 2 index known { pop pop } { registerfont pop } ifelse
+ } forall
+ } .execasresource
+ currentdict /ccfonts .undef
+ } if
+} bind def
+
+currentdict /registerfont .undef
diff --git a/Master/xemtex/gslib/gs_ce_e.ps b/Master/xemtex/gslib/gs_ce_e.ps
new file mode 100644
index 00000000000..0708f1e68e2
--- /dev/null
+++ b/Master/xemtex/gslib/gs_ce_e.ps
@@ -0,0 +1,48 @@
+% Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_ce_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/gs_cff.ps b/Master/xemtex/gslib/gs_cff.ps
new file mode 100644
index 00000000000..2b9b510e7c7
--- /dev/null
+++ b/Master/xemtex/gslib/gs_cff.ps
@@ -0,0 +1,758 @@
+% Copyright (C) 1997, 1998, 1999, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_cff.ps,v 1.10.2.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Loader for CFF (compressed) fonts, including OpenType CFFs.
+% The following are not implemented yet:
+% Deleted entries in the Name Index
+% Embedded PostScript
+% Multiple Master fonts
+% Chameleon fonts
+% Synthetic fonts
+
+% ---------------- Font loading machinery ---------------- %
+
+% Augment the FONTPATH machinery so it recognizes OpenType CFF font sets.
+
+/.scanfontheaders where {
+ pop /.scanfontheaders [
+ .scanfontheaders aload pop (OTTO*)
+ ] def
+} if
+
+% Load a font file that might be an OpenType CFF font set.
+
+% <file> .loadfontfile -
+/.loadnonottofontfile /.loadfontfile load def
+/.loadfontfile {
+ dup 4 string .peekstring pop (OTTO) eq {
+ % If this is a font at all, it's an OpenType CFF font set.
+ .loadottofontfile
+ } {
+ % Not a TrueType font.
+ .loadnonottofontfile
+ } ifelse
+} bind def
+
+% <file> .loadottofontfile -
+/.loadottofontfile {
+ /FontSetInit /ProcSet findresource begin
+ 2 dict begin
+ /f exch def /cff null def
+ card32 pop card16 6 { next pop } repeat dup {
+ % Stack: numtables tablesleft
+ dup 0 eq {
+ pop pop /.loadottofontfile cvx /invalidfont signalerror
+ } if
+ f 4 string readstring pop (CFF ) eq { sub exit } if
+ 1 sub
+ } loop
+ % Stack: tablesread
+ card32 pop card32 card32
+ % Stack: tablesread start length
+ exch 3 -1 roll 1 add 16 mul 12 add sub
+ f exch subfilefilter flushfile % skip to start
+ f exch subfilefilter end
+ % Use a random FontSet resource name. ****** WRONG ******
+ realtime rand xor =string cvs exch false
+ ReadData
+} bind def
+
+30 dict begin
+
+% ---------------- Standard strings (actually names) ---------------- %
+
+/StandardStrings mark
+ % The initial StandardStrings that that denote characters are
+ % defined as a pseudo-Encoding.
+% 0
+ /CFFStandardStrings .findencoding aload pop
+% 379
+ (001.000)
+% 380
+ (001.001) (001.002) (001.003) /Black /Bold
+ /Book /Light /Medium /Regular /Roman
+ /Semibold
+.packtomark def
+
+% ---------------- Standard encodings ---------------- %
+
+/StandardEncodings [
+
+% StandardEncoding
+mark
+ 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
+ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
+ 17 18 19 20 21 22 23 24 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 57 58 59 60 61 62 63 64
+ 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
+ 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 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 0
+ 0 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
+ 0 111 112 113 114 0 115 116 117 118 119 120 121 122 0 123
+ 0 124 125 126 127 128 129 130 131 0 132 133 0 134 135 136
+ 137 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 138 0 139 0 0 0 0 140 141 142 143 0 0 0 0
+ 0 144 0 0 0 145 0 0 146 147 148 149 0 0 0 0
+.packtomark
+
+% ExpertEncoding
+mark
+ 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
+ 1 229 230 0 231 232 233 234 235 236 237 238 13 14 15 99
+ 239 240 241 242 243 244 245 246 247 248 27 28 249 250 251 252
+ 0 253 254 255 256 257 0 0 0 258 0 0 259 260 261 262
+ 0 0 263 264 265 0 266 109 110 267 268 269 0 270 271 272
+ 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
+ 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 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 0
+ 0 304 305 306 0 0 307 308 309 310 311 0 312 0 0 313
+ 0 0 314 315 0 0 316 317 318 0 0 0 158 155 163 319
+ 320 321 322 323 324 325 0 0 326 150 164 169 327 328 329 330
+ 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
+ 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362
+ 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378
+.packtomark
+
+] readonly def
+
+% ---------------- Standard Charsets ---------------- %
+
+% We include an explicit 0 at the beginning of each charset.
+
+/StandardCharsets [
+
+% ISOAdobe
+mark
+ 0
+ 1 1 228 { } for
+.packtomark
+
+% Expert
+mark
+ 0
+ 1 229 230 231 232 233 234 235 236 237 238 13 14 15 99 239
+ 240 241 242 243 244 245 246 247 248 27 28 249 250 251 252 253
+ 254 255 256 257 258 259 260 261 262 263 264 265 266 109 110 267
+ 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
+ 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
+ 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
+ 316 317 318 158 155 163 319 320 321 322 323 324 325 326 150 164
+ 169 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341
+ 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
+ 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373
+ 374 375 376 377 378
+.packtomark
+
+% ExpertSubset
+mark
+ 0
+ 1 231 232 235 236 237 238 13 14 15 99 239 240 241 242 243
+ 244 245 246 247 248 27 28 249 250 251 253 254 255 256 257 258
+ 259 260 261 262 263 264 265 266 109 110 267 268 269 270 272 300
+ 301 302 305 314 315 158 155 163 320 321 322 323 324 325 326 150
+ 164 169 327 328 329 330 331 332 333 334 335 336 337 338 339 340
+ 341 342 343 344 345 346
+.packtomark
+
+] readonly def
+
+% ---------------- Font loading ---------------- %
+
+% ------ Utilities ------ %
+
+/advance { % <n> advance -
+ f cff eq { pos add /pos exch store } { pop } ifelse
+} bind def
+/next { % - next <byte>
+ f read {
+ 1 advance
+ DEBUG { ( ) print dup = } if
+ } if
+} bind def
+/next2 { % - next2 <byte1> <byte2>
+ f read {
+ f read {
+ 2 advance
+ DEBUG { ( ) print 1 index =only (,) print dup = } if
+ } {
+ 1 advance
+ DEBUG { ( ) print dup = } if
+ } ifelse
+ } if
+} bind def
+/nextstring { % <length> nextstring <string>
+ dup 0 eq {
+ pop ()
+ } {
+ string f exch readstring pop dup length advance
+ DEBUG { ( ) print dup == } if
+ } ifelse
+} bind def
+/card8 % - card8 <card8>
+ /next load
+def
+/card16 { % - card16 <card16>
+ next2 exch 8 bitshift add
+} bind def
+/card32 { % - card32 <card32>
+ card16 16 bitshift card16 add
+} bind def
+/offsetprocs [
+ /card8 load
+ /card16 load
+ { card8 16 bitshift card16 add } bind
+ /card32 load
+] readonly def
+/offsetproc { % <offsize> offsetproc <proc>
+ 1 sub //offsetprocs exch get
+} bind def
+/offset { % <offsize> offset <offset>
+ offsetproc exec
+} bind def
+/sid % - <sid> sid
+ /card16 load
+def
+/Index { % - Index <array>
+ mark card16 dup 0 ne {
+ 1 exch next offsetproc dup exec pop exch {
+ dup exec dup 4 -1 roll sub 3 1 roll exch
+ } repeat pop
+ } if pop .packtomark
+ [ exch { nextstring } forall ] readonly
+} bind def
+/tokens { % - tokens <num1> ... <op#> (op# = 12 means EOF)
+ {
+ f read not { 12 exit } if
+ DEBUG { (..) print dup = } if
+ 1 advance
+ dup 12 eq { pop next 32 add exit } if
+ dup 28 lt { exit } if
+ dup 32 lt {
+ 28 sub {
+ { card16 32768 xor 32768 sub }
+ { 4 offset dup 16#7fffffff gt { -1 32 bitshift add } if }
+ { tokenreal }
+ { 31 exit }
+ } exch get exec
+ } {
+ dup 247 lt {
+ 139 sub
+ } {
+ 247 sub {
+ { next 108 add }
+ { next 364 add }
+ { next 620 add }
+ { next 876 add }
+ { next 108 add neg }
+ { next 364 add neg }
+ { next 620 add neg }
+ { next 876 add neg }
+ % 255 is deliberately omitted and will cause a rangecheck
+ } exch get exec
+ } ifelse
+ } ifelse
+ } loop
+} bind def
+/tokenbuf 100 string def
+/tokenput { % <index> <char> tokenput <index+1>
+ tokenbuf 2 index 3 -1 roll put 1 add
+} bind def
+/tokenrealarray [
+ (0123456789.E) { } forall
+ [(E) 0 get /tokenput cvx (-) 0 get] cvx
+ null % will give an error
+ (-) 0 get
+ { exit }
+] readonly def
+/tokenreal { % - tokenreal <float>
+ 0 {
+ next exch 1 index -4 bitshift tokenrealarray exch get exec tokenput
+ % We must leave the byte on the stack temporarily so that
+ % the exit will see a consistent stack state.
+ 1 index 15 and tokenrealarray exch get exec tokenput exch pop
+ } loop
+ tokenbuf 0 3 -1 roll getinterval cvr exch pop
+} bind def
+/Dict { % <opsdict> Dict -
+ /opdict exch store {
+ mark tokens
+ DEBUG { (tokens: ) print ] dup === mark exch aload pop } if
+ opdict exch .knownget { exec } if cleartomark
+ } loop cleartomark
+} bind def
+/idstring { % <sid> idstring <string|name>
+ dup 391 lt { //StandardStrings } { 391 sub strings } ifelse exch get
+} bind def
+/idname { % <sid> idname <name>
+ idstring dup type /nametype ne { cvn } if
+} bind def
+/subfilefilter { % <file> <length> subfilefilter <filter>
+ % SubFileDecode interprets a length of 0 as infinite.
+ dup 0 le { pop pop () 0 } if () /SubFileDecode filter
+} bind def
+
+% ------ Top dictionary ------ %
+
+/offput { % <offset> <proc> offput -
+ DEBUG { (queued: ) print 1 index =only ( ) print dup === } if
+ currentdict exch aload length 1 add packedarray cvx
+ offsets 3 1 roll put
+} bind def
+/queueput { % <font> <proc> queueput -
+ 16#7fffffff offsets { pop .min } forall
+ pos sub nextstring
+ 3 1 roll aload length 2 add packedarray cvx
+ [ queued aload pop counttomark 2 add -1 roll ]
+ /queued exch store
+} bind def
+/xxput { % <value> <key> <dict> xxput -
+ 3 1 roll exch put
+} bind def
+/putfi { % <value> <key> putfi -
+ FontInfo xxput
+} bind def
+/xdef { % <value> <key> xdef -
+ exch def
+} bind def
+/topdictops mark
+ 12 { exit }
+ 0 { idstring /version putfi }
+ 1 { idstring /Notice putfi }
+ 32 { idstring /Copyright putfi }
+ 2 { idstring /FullName putfi }
+ 3 { idstring /FamilyName putfi }
+ 4 { idstring /Weight putfi }
+ 33 { 0 ne /isFixedPitch putfi }
+ 34 { /ItalicAngle putfi }
+ 35 { /UnderlinePosition putfi }
+ 36 { /UnderlineThickness putfi }
+ 37 { /PaintType xdef }
+ 38 { /FontType xdef } % actually CharstringType
+ 39 { counttomark array astore /FontMatrix xdef }
+ 13 { /UniqueID xdef }
+ 5 { counttomark array astore /FontBBox xdef }
+ 40 { /StrokeWidth xdef }
+ 14 { counttomark array astore /XUID xdef }
+ 15 {
+ dup StandardCharsets length lt {
+ StandardCharsets exch get /charset xdef
+ } {
+ { queuecharset } offput
+ } ifelse
+ }
+ 16 {
+ dup StandardEncodings length lt {
+ /Encoding xdef
+ } {
+ { queueEncoding } offput
+ } ifelse
+ }
+ 17 { { readCharStrings } offput }
+ 18 { exch /readPrivate cvx 2 packedarray offput }
+ % CIDFont operators
+ 62 { % ROS, must be first in a CIDFont
+ currentdict /FontType undef
+ currentdict /Encoding undef
+ currentdict /FontMatrix undef
+ /CIDFontVersion 0 def
+ /CIDFontRevision 0 def
+ /CIDFontType 0 def
+ /CIDCount 8720 def % Default value defined in CFF spec.
+ 3 dict begin
+ /Supplement xdef
+ idstring /Ordering xdef
+ idstring /Registry xdef
+ /CIDSystemInfo currentdict end def
+ }
+ 63 { /CIDFontVersion xdef }
+ 64 { /CIDFontRevision xdef }
+ 65 { /CIDFontType xdef }
+ 66 { /CIDCount xdef }
+ 67 { /UIDBase xdef }
+ 68 { { readFDArray } offput }
+ 69 { { readFDSelect } offput }
+ % This operator only appears in a FDArray element.
+ 70 { idstring /FontName exch def }
+.dicttomark readonly def
+
+% readcharset and readFDSelect may require the length of CharStringArray,
+% but these structures may occur in the file before the CharStrings.
+% If that happens, use a hack: assume that all the data up to the next
+% queued read should be read.
+
+/charstringcount { % <font> charstringcount <count> true
+ % <font> charstringcount <length> false
+ /CharStringArray .knownget {
+ length true
+ } {
+ % Hack: look for the next queued read.
+ 16#7fffffff offsets { pop .min } forall
+ pos sub false
+ } ifelse
+} bind def
+
+/readCharStrings { % <font> readCharStrings -
+ /CharStringArray Index put
+} bind def
+
+% ------ Charsets and encodings ------ %
+
+% Note: formats 1 and 2 can overflow the operand stack.
+% We'll fix this if it ever becomes necessary.
+/charsetcount {
+ charstringcount { 1 sub } { 2 idiv } ifelse
+} bind def
+/charsetformats [
+{ [ 0 3 -1 roll charsetcount { sid } repeat ]
+} bind
+{ [ 0 3 -1 roll charsetcount {
+ dup 0 eq { pop exit } if
+ sid card8 1 add 2 index .min { exch 1 sub 1 index 1 add } repeat pop
+ } loop ]
+} bind
+{ [ 0 3 -1 roll charsetcount {
+ dup 0 eq { pop exit } if
+ sid card16 1 add 2 index .min { exch 1 sub 1 index 1 add } repeat pop
+ } loop ]
+} bind
+] readonly def
+/queuecharset { % <font> queuecharset -
+ { readcharset } queueput
+} bind def
+/readcharset { % <data> <font> readcharset -
+ begin 0 () /SubFileDecode filter /f exch store
+ charsetformats next get currentdict exch exec /charset exch def end
+} bind def
+
+/encodingformats [
+{ 1 1 next { next exch Encoding 3 1 roll put } for
+} bind
+{ 1 next {
+ next next 1 add {
+ % Stack: gid code
+ Encoding 1 index 3 index put
+ exch 1 add exch 1 add
+ } repeat pop
+ } repeat pop
+} bind
+] readonly def
+/queueEncoding { % <font> queueEncoding -
+ { readEncoding } queueput
+} bind def
+/readEncoding { % <data> <font> readEncoding -
+ begin 0 () /SubFileDecode filter /f exch store
+ /Encoding [ 256 { /.notdef } repeat ] def
+ next encodingformats 1 index 127 and get exec
+ 128 ge {
+ % Read supplementary encodings.
+ next {
+ Encoding next sid idname put
+ } repeat
+ } if end
+} bind def
+
+% ------ FDArray and FDSelect ------ %
+
+/readFDArray { % <font> readFDArray -
+ Index exch
+ 2 dict begin /f null def begin
+ [ exch {
+ dup length subfilefilter /f exch store
+ 10 dict begin
+ /FontType 2 def
+ /PaintType 0 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Private 20 dict def
+ //topdictops Dict currentdict end
+ } forall ] /FDArray xdef end end
+} bind def
+
+% Note: this implementation can overflow the operand stack.
+% We'll fix this if it ever becomes necessary.
+/fdselectformats [
+{ [ exch charstringcount pop { card8 } repeat ] } bind
+{ /FDSelect cvx /invalidfont signalerror } bind
+dup
+{ pop [ card16 card16 exch {
+ % Stack: previndex
+ card8 card16 dup 4 1 roll 3 -1 roll sub 1 sub {
+ exch 1 index
+ } repeat exch
+ } repeat pop ]
+} bind
+] readonly def
+
+/readFDSelect { % <font> readFDSelect -
+ begin fdselectformats next get currentdict exch exec /FDSelect exch def end
+} bind def
+
+
+% ------ Private dictionary ------ %
+
+/deltarray { % -mark- <num1> ... deltarray <num1'> ...
+ 0 counttomark 1 sub { counttomark -1 roll add dup } repeat pop
+ counttomark array astore
+} bind def
+
+/privatedictops mark
+ 12 { exit }
+ 6 { deltarray /BlueValues xdef }
+ 7 { deltarray /OtherBlues xdef }
+ 8 { deltarray /FamilyBlues xdef }
+ 9 { deltarray /FamilyOtherBlues xdef }
+ 41 { /BlueScale xdef }
+ 42 { /BlueShift xdef }
+ 43 { /BlueFuzz xdef }
+ 10 { 1 array astore /StdHW xdef }
+ 11 { 1 array astore /StdVW xdef }
+ 44 { deltarray /StemSnapH xdef }
+ 45 { deltarray /StemSnapV xdef }
+ 46 { 0 ne /ForceBold xdef }
+ 47 { /ForceBoldThreshold xdef }
+ 48 { /lenIV xdef }
+ 49 { /LanguageGroup xdef }
+ 50 { /ExpansionFactor xdef }
+ 51 { /initialRandomSeed xdef }
+ 19 { PrivateStart add { readSubrs } offput }
+ 20 { /defaultWidthX xdef }
+ 21 { /nominalWidthX xdef }
+ % Multiple Master fonts only
+ 59 { /NDV xdef }
+ 60 { /CDV xdef }
+ 61 { /lenBuildCharArray xdef }
+.dicttomark readonly def
+
+/readPrivate { % <font> <size> readPrivate -
+ 2 dict begin
+ /PrivateStart pos def
+ f 3 1 roll exch 1 index f exch subfilefilter /f exch store
+ dup /FontType get exch
+ /Private get begin
+ % Default lenIV to -1 even for Type 1 CharStrings.
+ 2 ne { /lenIV -1 def } if
+ //privatedictops Dict end
+ exch /f exch store advance
+ end
+} bind def
+
+/readSubrs { % <font> readSubrs -
+ /Subrs Index put
+} bind def
+
+% ------ Main program ------ %
+
+% Clean up after finishing a font.
+/cleanupFont { % (currentdict) cleanupFont -
+ % Remove unwanted entries.
+ currentdict /charset undef
+ currentdict /CharStringArray undef
+} bind def
+
+% Update the Encoding and CharStrings for a real font.
+/finishFont { % (currentdict) finishFont -
+ % Construct the real Encoding.
+ % The value of Encoding is either a number, for predefined
+ % encodings, or an array of mixed GIDs and names.
+ /Encoding mark Encoding
+ DEBUG { (Encoding: ) print dup === flush } if
+ dup type /integertype eq {
+ StandardEncodings exch get { idname } forall
+ } {
+ {
+ dup type /integertype eq { charset exch get idname } if
+ } forall
+ } ifelse .packtomark def
+ % Construct the CharStrings.
+ % Note that they may only correspond to an initial
+ % subset of the charset.
+ /CharStrings charset length CharStringArray length .min dict def
+ DEBUG {
+ charset length =only ( charset ) print
+ CharStringArray length =only ( CharStringArray) =
+ charset == flush
+ } if
+ 0 1 CharStrings maxlength 1 sub {
+ dup CharStringArray exch get
+ exch charset exch get idstring CharStrings xxput
+ } for
+ cleanupFont
+} bind def
+
+% Replace CharStrings with GlyphDirectory for a CIDFont;
+% Move GlobalSubrs to descendent fonts.
+/finishCIDFont { % (currentdict) finishCIDFont -
+ % Construct the GlyphDirectory, similar to CharStrings.
+ /FDBytes FDArray length 1 gt { 1 } { 0 } ifelse def
+ /GlyphDirectory charset length CharStringArray length .min dict def
+ DEBUG {
+ charset length =only ( charset ) print
+ CharStringArray length =only ( CharStringArray) =
+ charset == flush
+ } if
+ 0 1 GlyphDirectory maxlength 1 sub {
+ dup CharStringArray exch get
+ % If there is more than one FDArray entry, add the font
+ % index to the beginning of each charstring.
+ FDBytes 1 eq {
+ FDSelect 2 index get
+ 1 string dup 0 4 -1 roll put exch concatstrings
+ } if
+ exch charset exch get GlyphDirectory xxput
+ } for
+
+ Private /GlobalSubrs .knownget {
+ FDArray {
+ /Private get /GlobalSubrs 2 index put
+ } forall
+ pop
+ Private /GlobalSubrs undef
+ } if
+
+ % Clean up.
+ currentdict /FDSelect undef
+ cleanupFont
+} bind def
+% We need to pass the file as a parameter for the sake of the PDF
+% interpreter. Also for the sake of PDF, a flag forces the font
+% to be defined as <resname> instead of the name embedded in the data.
+% This is needed for subsetted fonts; it is valid if the CFF
+% contains only a single font.
+/StartData { % <resname> <nbytes> StartData -
+ currentfile exch subfilefilter false ReadData
+} bind def
+/ReadData { % <resname> <file> <forceresname> ReadData -
+
+ % Initialize.
+
+ 30 dict begin
+ /forceresname exch def
+ /cff exch def
+ /pos 0 def
+ /resname exch cvlit def
+ /DEBUG DEBUG def % bring the binding closer
+
+ % Read the header.
+
+ /f cff def
+ /vmajor next def
+ /vminor next def
+ /hdrsize next def
+ /aoffsize next def
+
+ % Read the Indexes.
+
+ /names Index def
+ /topdicts Index def
+ /strings Index def
+ /gsubrs Index def
+
+ % Read the top Dicts.
+
+ /offsets 50 dict def
+ /queued [] def
+ /opdict null def % reserve a slot
+ /fonts [ topdicts {
+ 0 () /SubFileDecode filter /f exch def
+ 40 dict begin
+ % Preload defaults that differ from PostScript defaults,
+ % or that are required.
+ /FontType 2 def
+ /PaintType 0 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /charset StandardCharsets 0 get def
+ /Encoding 0 def
+ /FontInfo 10 dict
+ dup /UnderlinePosition -100 put
+ dup /UnderlineThickness 50 put
+ def
+ /Private 20 dict
+ gsubrs length 0 ne { dup /GlobalSubrs gsubrs put } if
+ def
+ //topdictops Dict
+ currentdict end
+ } forall ] def
+
+ % Read other tables with queued offsets.
+
+ DEBUG { (offsets: ) print [ offsets { pop } forall ] == } if
+ { /f cff def
+ DEBUG { (pos=) print pos = } if
+ offsets pos 2 copy .knownget not { pop pop exit } if
+ 3 1 roll undef
+ DEBUG { (exec queued: ) print dup == } if
+ exec
+ } loop
+ offsets length 0 ne {
+ (Error: missing tables at ) print [ offsets { pop } forall ] ==
+ (Current position is ) print pos ==
+ flush stop
+ } if
+
+ % Process out-of-order tables.
+
+ DEBUG { queued length =only ( queued) = flush } if
+ queued { exec } forall
+
+ % Update Encoding and CharStrings.
+
+ fonts {
+ begin
+ currentdict /CIDFontType known { finishCIDFont } { finishFont } ifelse
+ end
+ } forall
+
+ % Wrap up.
+
+ resname mark 0 1 fonts length 1 sub {
+ DEBUG { dup =only ( ) print flush } if
+ dup names exch get
+ forceresname { pop resname } if
+ DEBUG { dup == flush } if
+ exch fonts exch get
+ dup /CIDFontType known {
+ % This is a CIDFont.
+ dup /CIDFontName 3 index put
+ 1 index exch /CIDFont defineresource
+ } {
+ % This is a font.
+ dup /FontName 3 index put
+ 1 index exch definefont
+ } ifelse
+ } for .dicttomark
+ end % temporary dict
+ end % FontSetInit ProcSet
+ /FontSet defineresource pop
+
+} bind def
+
+% ---------------- Resource category definition ---------------- %
+
+currentdict end readonly
+
+languagelevel exch 2 .setlanguagelevel
+
+/FontSet /Generic /Category findresource dup length dict .copydict
+/Category defineresource pop
+
+/FontSetInit exch /ProcSet defineresource pop
+
+.setlanguagelevel
diff --git a/Master/xemtex/gslib/gs_cidcm.ps b/Master/xemtex/gslib/gs_cidcm.ps
new file mode 100644
index 00000000000..b965e5cbe33
--- /dev/null
+++ b/Master/xemtex/gslib/gs_cidcm.ps
@@ -0,0 +1,511 @@
+% Copyright (C) 2000 artofcode LLC. All rights reserved.
+%
+% 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.
+
+% $Id: gs_cidcm.ps,v 1.5.2.2.2.1 2003/04/12 14:02:38 giles Exp $
+% Extending Font resource category with CIDFont-CMap fonts.
+
+languagelevel 2 .setlanguagelevel currentglobal true setglobal
+
+
+% In the comments below, 'CSI' is an abbreviation/acronym for CIDSystemInfo.
+% We pre-scan resource files to retrieve the CSI from them.
+% First we define a hidden procset .prs_dict containing
+% necessary variables and procedures.
+% Then we redefine the old /Font category using this procset.
+
+% We maintain internal caches for the CSI values retrieved from
+% resource files. This supposes that document doesn't uninstall
+% resource files. To disable caching, set enable_cache to false.
+
+% We suppose that names starting with '.prs' do not appear in resource files.
+% If this causes any problem, this prefix should be systematically changed
+% in this file. ('prs' is an abbreviation for 'prescan'.)
+
+25 dict begin
+
+% Define local variables :
+
+/.prs_dict currentdict def % self-reference (constant)
+/.prs_empty 0 dict readonly def
+/path_buffer 255 string def
+/name_buffer 255 string def
+/minus (-) 0 get def % character code constant for '-'
+/period (.) 0 get def % character code constant for '.'
+/CMap 10 dict def % CSI cache for CMaps
+/CIDFont 10 dict def % CSI cache for CIDFonts
+/enable_cache true def % set false to disable cache
+
+% The folloving variables are just placeholders for ones to be set
+% dynamically :
+/.prsFile 0 def % file to prescan
+/.prsResult 0 def % result of prescan
+/.prsDictCount 0 def % save the dictionary stack depth
+
+% Define a dummy CIDInit procset to use while pre-scanning :
+
+/DummyCIDInit 15 dict
+begin
+
+ /begincmap {} def
+ /usecmap {pop} bind def
+
+ {stop} bind
+ [ /begincodespacerange /endcodespacerange /beginnotdefchar /endnotdefchar
+ /beginnotdefrange /endnotdefrange /begincidchar /endcidchar /begincidrange
+ /endcidrange /endcmap /usefont /StartData
+ ] {
+ 1 index def
+ } bind forall
+ pop
+
+currentdict end def
+
+% Define a local 'findresource' for pre-scanning :
+% (it returns the dummy CIDInit instead of the regular CIDInit ProcSet)
+
+/findresource { % <InstName> <CatName> findresource <inst>
+ 2 copy /ProcSet eq exch % /InstName /CatName bool /InstName
+ /CIDInit eq and {
+ pop pop //DummyCIDInit
+ } {
+ //findresource exec
+ } ifelse
+} bind def
+
+% Define procedures for pre-scanning :
+
+/StopIfCSIDefined { % - StopIfCSIDefined -
+
+ % Check if the dictionary stack contains a dictionary containing /CIDSystemInfo.
+ % The search is limited to the top .prsDictCount dictionaries in the stack.
+ % If so, retrieve the CSI, and execute stop to terminate the pre-scanning of the file.
+ % Otherwise, do nothing, so the pre-scanning continues.
+
+ countdictstack //.prs_dict /.prsDictCount get sub dup {
+ currentdict /CIDSystemInfo .knownget {
+ //.prs_dict exch /.prsResult exch put
+ stop
+ } if
+ currentdict exch end
+ } repeat {
+ begin
+ } repeat
+} bind def
+
+/PrescanFile { % - PrescanFile -
+ { //.prs_dict /.prsFile get token {
+ dup type % token type
+ dup /nametype eq exch /operatortype eq or {
+ dup xcheck {
+ exec
+ //StopIfCSIDefined exec
+ } if
+ } if
+ } {
+ stop
+ } ifelse
+ } loop
+} bind odef
+
+/GetCIDSystemInfoFromFile { % <file> GetCIDSystemInfoFromFile <CSI>
+
+ % This procedure reads resource files with 'token',
+ % executing the tokens untill /CIDSystemInfo appears to be defined.
+ % Normally the resource file creates a new dictionary on
+ % dictionary stack and defines /CIDSystemInfo in it.
+ %
+ % Returns an empty dictionary if no CIDSystemInfo is found.
+
+ //.prs_dict begin
+ /.prsFile exch def
+ /.prsResult //.prs_empty def
+ /.prsDictCount countdictstack def
+ { //PrescanFile } stopped pop
+ //.prs_dict /.prsResult get
+ end
+} bind def
+
+/GetCIDSystemInfo { % <InstName> <CatName> GetCIDSystemInfo <CSI>
+
+ % Retrieve CSI, using caches.
+
+ 2 copy resourcestatus {
+ pop 2 lt {
+ findresource /CIDSystemInfo .knownget not {
+ //.prs_empty
+ } if
+ } {
+ dup //.prs_dict exch get % /InstName /CatName CSIs
+ dup 3 index known
+ //enable_cache and {
+ exch pop exch get % CSI
+ } {
+ 3 1 roll % CSIs /InstName /CatName
+ /Category findresource begin % CSIs /InstName
+ dup //path_buffer ResourceFileName % CSIs /InstName (path)
+ end
+ currentglobal exch true setglobal % CSIs /InstName g
+ mark exch % CSIs /InstName g [ (path)
+ { (r) file % CSIs /InstName g [ file
+ //GetCIDSystemInfoFromFile exec % CSIs /InstName g [ CSI
+ } stopped {
+ % Cannot find file from Resource directory
+ cleartomark
+ % Try to find file from CIDFontmap
+ % Stack: CSIs /InstName g
+ 1 index dup .CIDFontmapKnownget {
+ % Stack: CSIs /InstName g /InstName ValueInCIDFontmap
+ % We do look at CIDFontmap in global space.
+ % (When stopped, the space is set to local.)
+ true setglobal
+ 1 index 3 1 roll
+ .CIDFontmapRunHandler
+ /CIDFont findresource /CIDSystemInfo get
+ } {
+ pop //.prs_empty
+ } ifelse
+ } {
+ exch pop
+ } ifelse % CSIs /InstName g CSI
+ exch setglobal % CSIs /InstName CSI
+ dup 4 1 roll % CSI CSIs /InstName CSI
+ put % CSI
+ } ifelse
+ } ifelse
+ } {
+ pop pop //.prs_empty
+ } ifelse
+} bind def
+
+/IsCompatibleCSI { % <CSI-M> <CSI-F> IsCompatibleCSI <bool>
+
+ % The CSI in a CIDFont may be an array, a dict, or null.
+ % If it is an array, it must be of 1 element, which is a dict.
+ % In this case the dict is used for testing the compatibility.
+ % Two dicts are compatible iff they contain same /Ordering and /Registry.
+
+ exch % CSI-F CSI-M
+ { dup type /arraytype eq {
+ dup length 1 ne {
+ pop pop false exit
+ } if
+ 0 get
+ } if % CSI-F CSI-M
+ dup type /dicttype ne {
+ pop pop false exit
+ } if % CSI-F <<CSI-M>>
+ exch % <<CSI-M>> CSI-F
+ dup type /dicttype ne {
+ pop pop false exit
+ } if % <<CSI-M>> <<CSI-F>>
+ true % <<CSI-M>> <<CSI-F>> bEQ
+ [/Registry /Ordering] {
+ 2 index 1 index .knownget not {
+ 1234567
+ } if % <<CSI-M>> <<CSI-F>> bEQ /key vF
+ exch % <<CSI-M>> <<CSI-F>> bEQ vF /key
+ 4 index exch .knownget not {
+ 7654321
+ } if % <<CSI-M>> <<CSI-F>> bEQ vF vM
+ eq and % <<CSI-M>> <<CSI-F>> bEQ
+ } forall
+ exch pop exch pop % bEQ
+ exit
+ } loop
+} bind def
+
+/IsComposedOK { % <CIDFontName> <CMapName> IsComposedOK <bool>
+
+ % Check if the given CIDFont and CMap have compatible CSIs.
+
+ exch % /CMapName /CIDFontName
+ /CIDFont //GetCIDSystemInfo exec % /CMapName CSI-F
+ dup type /dicttype eq {
+ dup length 0 ne {
+ exch % CSI-F /CMapName
+ /CMap //GetCIDSystemInfo exec % CSI-F CSI-M
+ //IsCompatibleCSI exec % bool
+ } {
+ pop pop false
+ } ifelse
+ } {
+ pop pop false
+ } ifelse
+} bind def
+
+/IsComposedFont { % <FontName> IsComposedFont <CIDFontName> <CMapName> true
+ % <FontName> IsComposedFont false
+
+ % Check if the given font name may be decomposed into CIDFont.CMap, CIDFont-CMap
+ % or into CIDFont--CMap, such that CIDFont and CMap have compatible CSIs.
+ % FontName
+ dup type /stringtype ne {
+ //name_buffer cvs
+ } if % (FontName)
+ { dup length 2 sub -1 1 {
+ % (FontName) i
+ 2 copy get dup //minus eq exch //period eq or {
+ 2 copy 2 copy % (FontName) i (FontName) i (FontName) i
+ 2 copy get //minus eq {
+ 2 copy 1 sub get //minus eq {
+ 1 sub
+ } if
+ } if % (FontName) i (FontName) i (FontName) i0
+ 0 exch getinterval cvn % (FontName) i (FontName) i /CIDFontName
+ 3 1 roll % (FontName) i /CIDFontName (FontName) i
+ 1 add dup % (FontName) i /CIDFontName (FontName) i1 i1
+ 5 index length % (FontName) i /CIDFontName (FontName) i1 i1 l
+ exch sub getinterval cvn % (FontName) i /CIDFontName /CMapName
+ 2 copy //IsComposedOK exec { % (FontName) i /CIDFontName /CMapName
+ 4 2 roll pop pop % /CIDFontName /CMapName
+ stop
+ } if
+ pop pop pop
+ } {
+ pop
+ } ifelse % (FontName)
+ } for
+ pop
+ } stopped
+} bind def
+
+/ComposeName { % <CIDFont> <CMap> <scr> ComposeName <CIDFont-CMap>
+ dup dup 5 2 roll % (scr) (scr) /CIDFont /CMap (scr)
+ 3 2 roll exch cvs length dup % (scr) (scr) /CMap l0 l0
+ 4 -1 roll exch //minus put % (scr) /CMap l0
+ 1 add dup % (scr) /CMap l1 l1
+ 3 index dup length % (scr) /CMap l1 l1 (scr) L
+ 2 index sub % (scr) /CMap l1 l1 (scr) LT
+ 3 2 roll % (scr) /CMap l1 (scr) LT l1
+ exch getinterval % (scr) /CMap l1 (scrT)
+ 3 2 roll exch cvs length % (scr) l1 l2
+ add 0 exch getinterval % (CIDFont-CMap)
+} bind def
+
+
+% Define a few procedure templates to be modified dynamically :
+
+currentpacking false setpacking
+
+/BindAux { % <proc> BindAux <proc>
+ 0 exec
+} bind def
+
+/EnumerateFontNames { % - EnumerateFontNames ...
+
+ % This is a pattern for enumeration procedure to be built dynamically,
+ % using Bind with a temporary dictionary.
+ % The following names will be replaced with specific objects
+ % during Bind : en_local_dict, scr, proc, Fonts, Category .
+
+ end % Category
+ {
+ 0 1 2 {
+ en_local_dict exch /status exch put
+ Fonts {
+ en_local_dict /status get eq {
+ scr cvs % ... (Font)
+ proc exec %
+ } {
+ pop
+ } ifelse % ...
+ } forall
+ } for % ...
+ } stopped
+ Category begin
+ { stop } if
+} bind def
+
+setpacking
+
+/Bind { % <proc> Bind <proc>
+
+ % Make a copy of the given procedure, binding in the values of all names
+ % defined in currentdict.
+ % Caution : this code cannot handle procedures that were already
+ % bound recursively.
+
+ dup length array copy
+ dup length 1 sub -1 0 {
+ 2 copy get % {precopy} i {elem}
+ dup dup type /arraytype eq exch xcheck and {
+ % {precopy} i {elem}
+ //BindAux exec % {precopy} i {elem_copy}
+ 2 index 3 1 roll put % {precopy}
+ } {
+ dup dup type /nametype eq exch xcheck and {
+ % {precopy} i {elem}
+ currentdict exch .knownget {
+ 2 index 3 1 roll put % {precopy}
+ } {
+ pop
+ } ifelse
+ } {
+ pop pop
+ } ifelse
+ } ifelse % {precopy}
+ } for % {copy}
+ cvx
+} bind def
+
+//BindAux 0 //Bind put % bind the recursive call in 'Bind'.
+
+
+
+% Redefine the /Font category with CIDFont-CMap construction :
+
+% The following code supposes that the following names are not
+% defined in the old /Font category dictionary :
+% /IsComposedFont, /Bind, /IsComposedOK, /EnumerateFontNames .
+
+
+/Font /Category findresource dup length dict copy begin
+
+/FindResource { % <InstName> FindResource <inst>
+ dup //ResourceStatus exec {
+ pop pop //FindResource exec
+ } {
+ dup //IsComposedFont exec { % /FontName /CIDFontName /CMapName
+ exch [ exch ] composefont % inst
+ } {
+ //FindResource exec
+ } ifelse
+ } ifelse
+} bind def
+
+/ResourceStatus { % <InstName> ResourceStatus <nStatus> <nSize> true
+ % <InstName> ResourceStatus false
+ dup //ResourceStatus exec {
+ 3 2 roll pop true % nStatus nSize true
+ } {
+ //IsComposedFont exec { % /CIDFontName /CMapName
+ /CMap resourcestatus { % /CIDFontName nStatusM nSizeM
+ exch pop exch % nSizeM /CIDFontName
+ /CIDFont resourcestatus { % nSizeM nStatusF nSizeF
+ exch pop % nSizeF nSizeM
+ dup 0 ge {
+ exch dup 0 ge {
+ add
+ } {
+ exch pop
+ } ifelse
+ } {
+ pop
+ } ifelse % nSize
+ 2 exch true % nStatus nSize true
+ } {
+ pop pop pop false % work around buggy resource file
+ } ifelse
+ } {
+ pop pop pop false % work around buggy resource file
+ } ifelse
+ } {
+ false
+ } ifelse
+ } ifelse
+} bind def
+
+/ResourceForAll { % <template> <proc> <scratch> ResourceForAll -
+
+ % We suppose that the resourceforall procedure does not
+ % define or install new fonts, CMaps, and/or CIDFonts.
+
+ % First we create 3 temporary dictionaries to store temporary data
+ % about fonts, CMaps and CIDFonts.
+ % These dictionaries must be created dynamically, to allow for a possible
+ % recursive call to resourceforall from the resourceforall procedure.
+
+ currentglobal false setglobal
+ 20 dict 20 dict 20 dict
+ 4 -1 roll setglobal % (templ) proc (scr) <<CIDFont>> <<CMap>> <<Fonts>>
+
+ % Store resource names into local dictionaries :
+
+ 5 index [ 2 index {exch cvn dup put} aload pop ] cvx 5 index //ResourceForAll exec
+ (*) [ 3 index {exch cvn dup put} aload pop ] cvx 5 index /CMap resourceforall
+ (*) [ 4 index {exch cvn dup put} aload pop ] cvx 5 index /CIDFont resourceforall
+
+ %% Make the list of fonts in the form (/Name status) :
+
+ % (templ) proc (scr) <<CIDFont>> <<CMap>> <<Fonts>>
+ dup {
+ //ResourceStatus exec {
+ pop 2 index % (templ) proc (scr) <<CIDFont>> <<CMap>> <<Fonts>> /Name nStatus <<Font>>
+ 3 1 roll put % (templ) proc (scr) <<CIDFont>> <<CMap>> <<Fonts>>
+ } {
+ pop
+ } ifelse
+ } forall % (templ) proc (scr) <<CIDFont>> <<CMap>> <<Fonts>>
+
+ %% Add CIDFont-CMap to it (filtering duplicates) :
+
+ 3 2 roll {
+ 3 index {
+ 3 1 roll % (templ) proc (scr) <<CMap>> <<Font>> /CIDFont /CMap /CIDFont /CMap
+ 6 index //ComposeName exec % (templ) proc (scr) <<CMap>> <<Font>> /CIDFont /CMap (Font)
+ dup 8 index .stringmatch {
+ cvn % (templ) proc (scr) <<CMap>> <<Font>> /CIDFont /CMap /Font
+ dup 4 index exch known {
+ pop pop
+ } {
+ 2 index % (templ) proc (scr) <<CMap>> <<Font>> /CIDFont /CMap /Font /CIDFont
+ 4 2 roll % (templ) proc (scr) <<CMap>> <<Font>> /Font /CIDFont /CIDFont /CMap
+ //IsComposedOK exec {
+ exch 2 index exch 2 put % (templ) proc (scr) <<CMap>> <<Font>> /CIDFont
+ } {
+ exch pop
+ } ifelse
+ } ifelse
+ } {
+ pop pop
+ } ifelse
+ dup % (templ) proc (scr) <<CMap>> <<Font>> /CIDFont /CIDFont
+ } forall
+ pop pop % (templ) proc (scr) <<CMap>> <<Font>>
+ } forall % (templ) proc (scr) <<CMap>> <<Font>>
+ exch pop % (templ) proc (scr) <<Font>>
+
+ % Build the enumeration procedure :
+
+ % Since the resourceforall procedure may leave values on the operand stack,
+ % we cannot simply store the enumerator's local data on the stack.
+ % We also cannot use a static dictionary to store local variables,
+ % because of possible recursion in the resourceforall procedure.
+ % To work around this, we create a copy of the enumeration procedure and
+ % bind it dynamically with a temporary dictionary, which contains
+ % local variables for the currently executing instance of resourceforall.
+
+ currentdict
+ 6 dict begin % the temporary dictionary
+ /Category exch def
+ /Fonts exch def
+ /scr exch def
+ /proc exch def
+ /en_local_dict currentdict def
+ //EnumerateFontNames //Bind exec % (templ) Enumerator
+ /status 0 def % variable for the current status to enumerate - do not Bind with it !
+ end
+ exch pop % Enumerator
+
+ % Do the enumeration :
+
+ exec
+} bind def
+
+
+currentdict end /Font exch /Category defineresource pop
+end
+setglobal .setlanguagelevel
diff --git a/Master/xemtex/gslib/gs_cidfn.ps b/Master/xemtex/gslib/gs_cidfn.ps
new file mode 100644
index 00000000000..e4b0ed2dc16
--- /dev/null
+++ b/Master/xemtex/gslib/gs_cidfn.ps
@@ -0,0 +1,702 @@
+% Copyright (C) 1995, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_cidfn.ps,v 1.18.4.5.2.1 2003/04/12 14:02:38 giles Exp $
+% ProcSet for implementing CIDFont and CIDMap resources.
+% When this is run, systemdict is still writable.
+
+% ---------------- Defining CIDFont resources ---------------- %
+
+% Define a CIDFont resource. This is the defineresource implementation for
+% the CIDFont resource category.
+
+/.checkfonttype { % <cidfont> <fonttype> .checkfonttype <cidfont> <new?>
+ 1 index /FID known {
+ 1 index /FontType get ne {
+ /definefont cvx /invalidfont signalerror
+ } if false
+ } {
+ 1 index /FontType 3 -1 roll put true
+ } ifelse
+} bind def
+
+/.cidfonttypes where { pop } { /.cidfonttypes 6 dict def } ifelse
+.cidfonttypes
+
+30 dict begin
+
+% The key in .cidfonttypes is the CIDFontType value;
+% the value is a procedure that takes a font name and the CIDFont dictionary
+% and replaces the latter with a real font.
+
+% ------ CIDFontType 0 (FontType 9) ------ %
+
+% We add the following entries to the CIDFont dictionary, in addition to
+% the ones documented by Adobe:
+% SubrCache - dictionary for caching Subr arrays
+% For CIDFonts where we read the data from disk incrementally:
+% GlyphData is 0 (arbitrary)
+% DataSource - a ReusableStreamDecode filter for the data
+% We also add a FID entry, and possibly a Subrs entry, to each element of
+% FDArray.
+
+dup 0 {
+ 9 .checkfonttype {
+ /CIDInit /ProcSet findresource begin
+ .completefont9
+ end
+ } if
+ 1 index exch .buildfont9 exch pop
+} bind put
+
+% Add entries to a new CIDFontType 0 font per documentation (FontMatrix)
+% or for .buildfont9 (FDArray.Private.Subrs).
+/.completefont9 { % <cidfont0> .completefont9 <cidfont0>
+ currentglobal 3 1 roll dup gcheck setglobal
+ dup /FontMatrix known not {
+ dup /FontMatrix [0.001 0 0 0.001 0 0] put
+ dup /FDArray get {
+ /FontMatrix get [1000 0 0 1000 0 0] 1 index concatmatrix pop
+ } forall
+ } if
+ dup /FDArray get {
+ % Read the Subrs if necessary.
+ dup /Private get dup /Subrs known not {
+ dup /SubrCount .knownget {
+ % Stack: font Private SubrCount
+ currentglobal 3 1 roll 1 index gcheck setglobal
+ array 1 index /Subrs 3 -1 roll put
+ % Stack: font global Private
+ 2 index begin begin .loadsubrs end end
+ setglobal
+ } {
+ pop
+ } ifelse readonly pop
+ } {
+ pop pop
+ } ifelse
+ } forall
+ 3 -1 roll setglobal
+} bind def
+
+% Read some Subrs for the current Type 1 subfont.
+% The subfont's Private dict is currentdict; the CIDFont itself is the
+% next dictionary on the stack.
+/.readsubrs { % <Subrs> <start> .readsubrs <Subrs>
+ 1 SubrCount 1 sub {
+ dup SDBytes mul SubrMapOffset add
+ dup SDBytes .readint exch SDBytes add SDBytes .readint
+ 1 index sub string ReadString 2 index 3 1 roll put
+ } for
+} bind def
+
+% Ensure that all the Subrs for the current Type 1 subfont are loaded.
+% The subfont's Private dict is currentdict; the CIDFont itself is the
+% next dictionary on the stack.
+/.loadsubrs {
+ Subrs length 0 ne {
+ SubrCache SubrMapOffset .knownget {
+ % We've already loaded some Subrs at this offset.
+ % Make sure we've got as many as we need.
+ dup length SubrCount lt {
+ % We need to load more.
+ SubrCount array exch 1 index copy length .readsubrs
+ SubrCache SubrMapOffset 2 index put
+ } if
+ } {
+ % We haven't loaded any Subrs at this offset yet.
+ SubrCount array 0 .readsubrs
+ SubrCache SubrMapOffset 2 index put
+ } ifelse
+ Subrs copy pop
+ } if
+} bind def
+
+% ------ CIDFontType 1 (FontType 10) ------ %
+
+dup 1 {
+ 10 .checkfonttype pop
+ 1 index exch .buildfont10 exch pop
+} bind put
+
+% ------ CIDFontType 2 (FontType 11) ------ %
+
+dup 2 {
+ 11 .checkfonttype pop
+ 1 index exch .buildfont11 exch pop
+} bind put
+
+pop % .cidfonttypes
+
+% ---------------- Reading CIDFontType 0 files ---------------- %
+
+/StartData { % <(Binary)|(Hex)> <datalength> StartData -
+ % (currentdict is CID font dict)
+ % If we're loading a resource file and the data format is
+ % binary, we can just save a pointer to the data and load it
+ % incrementally.
+ mark {
+ % Previous versions of this code made provisions for
+ % reading hex-encoded data incrementally. Since hex data
+ % doesn't seem to be used in practice, we no longer bother.
+ 2 index (Binary) ne { stop } if
+ currentfile .currentresourcefile ne { stop } if
+ % Hack: the pdfwrite driver relies on finalization to write
+ % out fonts. However, the font may be finalized after the
+ % resource file, in which case the resource file will be
+ % closed. So if the current output device is pdfwrite,
+ % don't use incremental loading.
+ currentdevice .devicename /pdfwrite eq { stop } if
+ currentfile fileposition
+ } .internalstopped {
+ % File is not positionable, or uses hex data.
+ % Load the data now.
+ cleartomark exch (Hex) eq
+ { { currentfile exch readhexstring pop } }
+ { { currentfile exch readstring pop } }
+ ifelse exch
+ % Stack: readproc length
+ dup 65400 le {
+ % readstring with a 0-length string causes a rangecheck,
+ % but a data length of 0 is allowed.
+ string dup () ne { 1 index exec } if
+ } {
+ mark 3 1 roll {
+ % Stack: mark str ... readproc length
+ dup 0 eq { pop exit } if
+ dup 65400 .min dup string 3 index exec
+ % Stack: mark str ... readproc length newstrlen newstr
+ 4 1 roll sub
+ } loop
+ counttomark 1 add 1 roll ]
+ } ifelse
+ /GlyphData exch def
+ % If we were reading hex data, skip past the >.
+ 2 get { readhexstring } 0 get eq {
+ currentfile 0 (>) .subfiledecode dup flushfile closefile
+ } if
+ } {
+ % File is positionable and binary, just save a pointer.
+ % Stack: (Binary) length -mark- pos
+ /GlyphData 0 def
+ exch pop 3 -1 roll pop exch
+ % Stack: pos length
+ /DataSource currentfile 2 index () .subfiledecode true .reusablestream def
+ currentfile 3 1 roll add setfileposition
+ } ifelse
+ /SubrCache 10 dict def
+ CIDFontName currentdict /CIDFont defineresource pop
+ end % CID font dict
+ end % resource category dict
+} bind def
+
+% Some Adobe fonts include the line
+% /Setup /cid_Setup load def
+% This is apparently included only to prevent proper, conforming PostScript
+% interpreters (as opposed to ATM or a special Adobe font loader) from
+% loading the font, since Setup is not referenced anywhere else in the file.
+/cid_Setup { } def
+
+currentdict end
+
+% ---------------- Rendering ---------------- %
+
+% ------ Generic ------ %
+
+% Read a string at a given offset in a "file" (binary file or
+% GlyphData in RAM).
+/ReadString { % <pos> <string> ReadString <string>
+ GlyphData 0 eq {
+ % Read from the file.
+ DataSource 3 -1 roll setfileposition
+ DataSource exch readstring pop
+ } {
+ % Read from a string or an array of strings.
+ GlyphData .stringsreadstring
+ } ifelse
+} bind def
+/.stringsreadstring % <pos> <string> <strings> .stringsreadstring
+ % <vmstring>
+{ dup type /stringtype eq
+ { 3 1 roll length getinterval
+ }
+ { { % Stack: pos string glyphdata
+ dup 0 get length dup 4 index gt { exit } if
+ 4 -1 roll exch sub 3 1 roll
+ dup length 1 sub 1 exch getinterval
+ }
+ loop
+ % Stack: pos string glyphdata glyphdata[0]length
+ % We know no request can span more than 2 strings.
+ 3 index 3 index length add 1 index le
+ { % Request fits in a single string: just return a substring.
+ pop 0 get 3 1 roll length getinterval
+ }
+ { % Request spans 2 strings. Copy the first part.
+ 1 index 0 get 4 index 3 -1 roll 1 index sub getinterval
+ 2 index copy
+ % Copy the second part.
+ % Stack: pos str glyphdata str1
+ length exch 1 get 0 3 index length
+ 3 index sub getinterval 2 index 3 1 roll putinterval
+ exch pop
+ }
+ ifelse
+ }
+ ifelse
+} bind def
+
+% Interpret a byte string as a (big-endian) integer.
+/.cvbsi % <bytes> .cvbsi <int>
+{ 0 exch { exch 8 bitshift add } forall
+} bind def
+
+% Read an integer from binary data.
+/.readint % <pos> <nbytes> .readint <int>
+{ string ReadString .cvbsi
+} bind def
+
+% ------ CIDFontType 0 ------ %
+
+/.readglyphdata {
+ currentfont exch .type9mapcid
+ FDArray exch get exch
+} bind def
+
+% BuildGlyph procedure for CIDFontType 0.
+% The name %Type9BuildGlyph is known to the interpreter.
+/.cid0buildstring 10 string def
+(%Type9BuildGlyph) cvn { % <cidfont> <cid> %Type9BuildGlyph -
+ .currentglobal 3 1 roll 1 index gcheck .setglobal
+ 1 index begin
+ dup .readglyphdata dup null eq {
+ % Substitute CID 0. **** WRONG ****
+ pop pop 0 .readglyphdata
+ } if
+ % Stack: cidfont cid subfont charstring
+ dup null eq { pop pop pop pop } { %**** WRONG ****
+ 4 -1 roll pop
+ 3 1 roll exch dup 4 -1 roll 0 0 moveto
+ 3 index /FontType get 2 eq { .type2execchar } { .type1execchar } ifelse
+ } ifelse %**** WRONG ****
+ end
+ .setglobal
+} bind def
+
+% ------ CIDFontType 2 ------ %
+
+% BuildGlyph procedure for CIDFontType 2.
+% The name %Type11BuildGlyph is known to the interpreter.
+(%Type11BuildGlyph) cvn { % <cidfont> <cid> %Type11BuildGlyph -
+ % We must be prepared for out-of-range CIDs.
+ 2 copy { .type11mapcid } .internalstopped {
+ pop /CharStrings get /.notdef get
+ } if
+ % Stack: cidfont cid glyphindex
+ 1 index exch .type42execchar
+} bind def
+
+% ---------------- Define resources ---------------- %
+
+languagelevel exch 2 .setlanguagelevel
+
+% Define the CIDInit ProcSet resource.
+% The ProcSet dictionary is still on the stack.
+
+% We might have loaded CMap support already. However, Adobe's
+% protected font downloader defines a CIDInit ProcSet that will be
+% loaded from the filesystem later, so we must check specifically
+% for the ProcSet being defined in VM.
+/CIDInit /ProcSet 2 copy resourcestatus { pop 0 eq } { false } ifelse {
+ pop pop findresource dup length 4 index length add dict .copydict
+ 4 -1 roll exch .copydict
+} {
+ 3 -1 roll
+} ifelse exch defineresource pop
+
+% Define the CIDFont resource category.
+% We break out .buildcidfont because it appears that at least for
+% Type 32 (CIDFontType 4) fonts, the font can be registered in the Font
+% category with only a CIDFontType and no FontType.
+/.buildcidfont { % <name> <fontdict> .buildcidfont
+ % <name> <cidfont>
+ dup /CIDFontType get //.cidfonttypes exch get exec
+} odef
+
+/.loadcidfontwithoutpop {
+ dup 4 string .peekstring pop dup (ttcf) eq exch (\000\001\000\000) eq or {
+ .loadcjkvttcidfont
+ } {
+ /CIDFont /Category findresource /.Instances get
+ dup length 2 div cvi dict .copydict exch
+ .loadfont
+ % Stack: <<original-.Instances>>
+ /CIDFont /Category findresource /.Instances get {% forall
+ % <<original-.Instances>> key value
+ 2 index 2 index known {
+ pop pop
+ } {
+ pop exch pop /CIDFont findresource exit
+ } ifelse
+ } forall
+ dup /CIDFontName known not {
+ {Internal Error in .loadcidfontwithoutpop} stop
+ } if
+ } ifelse
+} bind def
+
+/.loadcidfont {
+ .loadcidfontwithoutpop pop
+} bind def
+
+% Define the name of the CID font map file.
+/defaultcidfontmap (CIDFnmap) def
+userdict /CIDFontmap 10 dict put
+
+% <dict> <file> .readCIDFontmap <dict>
+% Code from gs_fonts.ps::.readFontmap
+/.readCIDFontmap {
+ { dup token not { closefile exit } if
+ % This is a hack to get around the absurd habit of MS-DOS editors
+ % of adding an EOF character at the end of the file.
+ dup (\032) eq { pop closefile exit } if
+ 1 index token not
+ { (CIDFontmap entry for ) print dup =only
+ ( has no associated file or alias name! Giving up.) = flush
+ {.readCIDFontmap} 0 get 1 .quit
+ } if
+ dup type dup /stringtype eq exch /nametype eq or not
+ { (CIDFontmap entry for ) print 1 index =only
+ ( has an invalid file or alias name! Giving up.) = flush
+ {.readCIDFontmap} 0 get 1 .quit
+ } if
+ % stack: dict file cidfontname filename|aliasname
+ 1 index type /stringtype eq
+ 1 index type /nametype eq and 1 index xcheck and
+ 1 index /run eq 2 index /.runlibfile eq or and {
+ % This is an inclusion entry.
+ pop findlibfile { exch pop } { file } ifelse
+ 2 index exch .readCIDFontmap pop
+ } {
+ % This is a real entry.
+ % stack: dict file cidfontname filename|aliasname
+
+ % Before staring a game, we need a hack.
+ % Some CJK pdf file contains a cidfontname that cannot
+ % be represented as a nametype literal. Instead, the
+ % cidfontname is represented as a string literal.
+ % If a cidfontname is represented as a stringtype object,
+ % it must be converted to a nametype object.
+ % We handle such a case here.
+ exch dup type /stringtype eq {cvn} if exch
+
+ % stack: dict file cidfontname filename|aliasname
+ % Read and pop tokens until a semicolon.
+ { 2 index token not
+ { (CIDFontmap entry for ) print 1 index =only
+ ( ends prematurely! Giving up.) = flush
+ {.readCIDFontmap} 0 get 1 .quit
+ } if
+ dup /; eq { pop 3 index 3 1 roll .growput exit } if
+ % Format:
+ % /CIDFontname (file) ttc-index ;
+ % /CIDFontname (file) /Code->CID-dict ;
+ % /CIDFontname (file) ttc-index /Code->CID-dict ;
+ %
+ % e.g.
+ % /HG-MinchoL (hgminchol.ttc) 1 /Adobe-Japan1-Unicode ;
+ % /HG-PMinchoL (hgminchol.ttc) 2 /Adobe-Japan1-Unicode ;
+ % /HG-MinchoL-J2 (hgminchol.ttc) 1 /Adobe-Japan2-Unicode ;
+ % /HG-PGothicB (hggothicb.ttc) 2 ;
+ % /HG-GothicB-J2 (hggothicb.ttc) /Adobe-Japan2-Unicode ;
+ %
+ % CID Fontmap entry is stored into CIDFontmap dict as an array.
+ % Array format:
+ % [filename ttc-index]
+ % [filename /Code->CID-dict]
+ % [filename ttc-index /Code->CID-dict]
+ %
+ % Type:
+ % filename: string
+ % ttc-index: integer
+ % /Code->CID-dict: name
+ %
+ % stack: dict file cidfontname filename something
+ 1 index type /nametype eq {
+ (CIDFontmap entry for ) print 2 index =only
+ (defines an alias! Giving up.) = flush
+ {.readCIDFontmap} 0 get 1 .quit
+ } if
+ % stack: dict file cidfontname filename something
+ exch [ exch 3 -1 roll
+ % stack: dict file cidfontname [ filename something
+ dup type /integertype eq {
+ % stack: dict file cidfontname [ filename int
+ % Read next token
+ 4 index token not
+ { (CIDFontmap entry for ) print 3 index =only
+ ( ends prematurely! Giving up.) = flush
+ {.readCIDFontmap} 0 get 1 .quit
+ } if
+ } if
+ % stack: dict file cidfontname [ filename int something
+ % or dict file cidfontname [ filename something
+ dup /; eq not 1 index type /nametype eq and {
+ % stack: dict file cidfontname [ filename /Code->CID
+ % or dict file cidfontname [ filename int /Code->CID
+ % Read next token
+ counttomark 2 eq {4} {5} ifelse index token not
+ { (CIDFontmap entry for ) print
+ counttomark 2 eq {3} {4} ifelse index =only
+ ( ends prematurely! Giving up.) = flush
+ {.readCIDFontmap} 0 get 1 .quit
+ } if
+ } if
+ % stack: dict file cidfontname [ filename int /Code->CID something
+ % or dict file cidfontname [ filename /Code->CID something
+ dup /; eq {
+ pop ]
+ 3 index 3 1 roll .growput exit
+ } if
+ pop
+ } loop
+ } ifelse
+ } loop
+} bind def
+
+% <file> .loadCIDFontmap -
+/.loadCIDFontmap {
+ userdict /CIDFontmap get exch
+ .readCIDFontmap pop
+} bind def
+
+% Code from .loadinitialfonts
+/.loadinitialcidfonts
+ { NOCIDFONTMAP not
+ { /CIDFONTMAP where
+ { pop [ CIDFONTMAP .pathlist ]
+ {
+ dup VMDEBUG findlibfile
+ { exch pop .loadCIDFontmap }
+ { /undefinedfilename signalerror }
+ ifelse
+ }
+ }
+ { LIBPATH
+ {
+ defaultcidfontmap 1 index .filenamedirseparator
+ exch concatstrings concatstrings dup VMDEBUG
+ (r) { file } .internalstopped
+ { pop pop } { .loadCIDFontmap } ifelse
+ }
+ }
+ ifelse forall
+ }
+ if
+ %%% Do nothing
+ } bind def
+
+.loadinitialcidfonts
+
+/CIDFontmapHandler <<
+ /nametype {
+ /CIDFont findresource
+ /CIDFont defineresource pop
+ } bind
+ /stringtype {
+ findlibfile {
+ exch pop
+ % Define CIDFont with a name defined in the font file
+ .loadcidfontwithoutpop
+ % Define CIDFont with a name define in CIDFontmap
+ dup length 0 ne {
+ dup /CIDFontName get 2 index eq {
+ % Avoid duplicated defineresource for the same CIDFont
+ pop pop
+ } {
+ % Give a name different from the name defined in the file
+ /CIDFont defineresource pop
+ } ifelse
+ } {
+ pop pop
+ } ifelse
+ } {
+ /undefinedresource signalerror
+ } ifelse
+ } bind
+ /arraytype {
+ % Replace filename in the array with file
+ dup 0 get
+ findlibfile {
+ 3 1 roll pop
+ copyarray dup 3 1 roll 0
+ 3 -1 roll put
+ % Expand array
+ aload pop .loadcjkvttcidfont
+ /CIDFont defineresource pop
+ } {
+ /undefinedresource signalerror
+ } ifelse
+ } bind
+>> def
+
+%%% CIDFontmap Public Interface
+% /CIDFontName .CIDFontmapKnown true|false
+/.CIDFontmapKnown {
+ userdict /CIDFontmap get exch known
+} bind def
+
+% /CIDFontName .CIDFontmapKnownget value true
+% /CIDFontName .CIDFontmapKnownget false
+/.CIDFontmapKnownget {
+ userdict /CIDFontmap get exch .knownget
+} bind def
+
+% /CIDFontName value .CIDFontmapRunHandler -
+/.CIDFontmapRunHandler {
+ dup CIDFontmapHandler exch type get .execasresource
+} bind def
+
+% proc .CIDFontmapForAll -
+/.CIDFontmapForAll {
+ CIDFontmap exch forall
+} bind def
+
+% proc .CIDFontmapForAllKey -
+/.CIDFontmapForAllKey {
+ [ /pop cvx 3 -1 roll /exec cvx ] cvx .CIDFontmapForAll
+} bind def
+
+/CIDFont /Generic /Category findresource dup length dict .copydict
+dup /InstanceType /dicttype put
+dup /DefineResource {
+ .buildcidfont
+ /Generic /Category findresource /DefineResource get exec
+} put
+/.originalresourceforall 1 index /ResourceForAll get def
+dup /ResourceForAll {
+ currentglobal false setglobal
+ % (template) (proc) (scratch) g
+ [ % (template) (proc) (scratch) g [
+ %
+ % 1. Gather CIDFont name in /Resource/CIDFont
+ %
+ 4 index % (template) (proc) (scratch) g [ (template)
+ {cvn} % (template) (proc) (scratch) g [ (template) {cvn}
+ 4 index % (template) (proc) (scratch) g [ (template) {cvn} (scratch)
+ .originalresourceforall
+ % (template) (proc) (scratch) g [ ...
+ %
+ % 2. Gather CIDFont name in CIDFontmap
+ %
+ {
+ dup length string cvs
+ dup % (template) (proc) (scratch) g [ ... (Key) (Key)
+ counttomark 4 add index
+ % (template) (proc) (scratch) g [ ... (Key) (Key) (template)
+ .stringmatch {
+ cvn
+ % (template) (proc) (scratch) g [ ... /Key
+ % 3. Remove duplicated /Key
+ counttomark -1 1 {
+ index 1 index eq {
+ pop exit % Duplicated
+ } if
+ } for
+ } {
+ pop
+ } ifelse
+ } .CIDFontmapForAllKey
+ ]
+ exch setglobal
+ %
+ % 4. Build extended procedure
+ %
+ % (template) (proc) (scratch) [CIDFontmapKeys]
+ 4 -1 roll pop
+ % (proc) (scratch) [CIDFontmapKeys]
+ 3 1 roll
+ % [CIDFontmapKeys] (proc) (scratch)
+ [ exch {cvs} aload pop
+ % [CIDFontmapKeys] (proc) [ (scratch) -cvs-
+ 4 -1 roll aload pop ] cvx
+ % [CIDFontmapKeys] proc++
+ %
+ % 5. Exec
+ %
+ forall
+} put
+
+% CIDFonts may be defined in CFF OpenType files.
+% Check for this here.
+/.loadcidfontresource {
+ dup .ResourceFile {
+ {.loadcidfont} .execasresource
+ } {
+ pop dup
+ .CIDFontmapKnownget {
+ .CIDFontmapRunHandler
+ } {
+ dup /undefinedresource signalerror
+ } ifelse
+ } ifelse
+} bind def
+dup /.LoadResource {
+ currentglobal {
+ .loadcidfontresource
+ } {
+ true setglobal {.loadcidfontresource} stopped false setglobal {stop} if
+ } ifelse
+} bind put
+dup /.ResourceFileStatus {
+ dup .CIDFontmapKnown {
+ pop 2 -1 true
+ } {
+ .ResourceFile { closefile 2 -1 true } { pop false } ifelse
+ } ifelse
+} bind put
+
+/Category defineresource pop
+
+% Add the new FontType resources.
+
+9 1 11 { dup /FontType defineresource pop } for
+
+% Add the new FMapType resource.
+
+9 dup /FMapType defineresource pop
+
+% Define the CIDMap resource category.
+% These aren't documented, but it's clear what they are for:
+% to give names to CIDMaps for CIDFontType 2 fonts.
+
+/CIDMap /Generic /Category findresource dup length dict .copydict
+dup /.CheckResource {
+ % Allow a string, an array of strings, or (as of Adobe release 3011)
+ % a dictionary.
+ dup type dup dup /stringtype eq exch /dicttype eq or {
+ pop true
+ } {
+ dup /arraytype eq exch /packedarraytype eq or {
+ true exch { type /stringtype eq and } forall
+ } {
+ false
+ } ifelse
+ } ifelse
+} bind put
+/Category defineresource pop
+
+.setlanguagelevel
diff --git a/Master/xemtex/gslib/gs_cmap.ps b/Master/xemtex/gslib/gs_cmap.ps
new file mode 100644
index 00000000000..5830a6a7c4f
--- /dev/null
+++ b/Master/xemtex/gslib/gs_cmap.ps
@@ -0,0 +1,524 @@
+% Copyright (C) 1995, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_cmap.ps,v 1.11.2.4.2.1 2003/04/12 14:02:38 giles Exp $
+% ProcSet for implementing CMap resources.
+% When this is run, systemdict is still writable.
+
+% NOTE: Rearranged fonts are not implemented yet.
+
+[
+ /CMERGE_DEBUG
+ /USE_CIDCHAR_AS_RANGE
+] {dup where {pop pop} { currentdict exch false def pop } ifelse} forall
+
+% ---------------- Public operators ---------------- %
+
+/.rewriteTempMapsNotDef {
+ %
+ % Before building .CodeMapData from .TempMaps,
+ % we need to replace dst type codes in the notdef map with the value 3,
+ % which corresponds to CODE_VALUE_NOTDEF, see gxfcmap.h .
+ %
+ DEBUG { (rewriting TempMapsNotDef\n) print flush } if
+ .TempMaps 2 get
+ dup length 0 gt {
+ 0 get
+ DEBUG { (...original...\n) print flush } if
+ 1 5 2 index length 1 sub {
+ { 1 index exch get 2 3 put } stopped
+ { DEBUG { (cannot rewrite\n) print flush } if }
+ { DEBUG { (rewrite\n) print flush } if } ifelse
+ } for
+ } if
+ pop
+ DEBUG { (...FINISHED...\n) print } if
+} bind def
+
+% composefont doesn't appear in CMap files -- it's documented in
+% the "PostScript Language Reference Manual Supplement".
+/composefont { % <name> <cmap|cmapname> <fonts> composefont <font>
+ 10 dict begin
+ /CMap 2 index dup type /dicttype ne { /CMap findresource } if def
+ /FDepVector 1 index cvlit def % temporarily
+ /Encoding [ 0 1 FDepVector length 1 sub { } for ] def
+ /FDepVector [ 0 1 FDepVector length 1 sub {
+ % Stack: name cmap[name] fonts /FDepVector [ fonts... i
+ FDepVector 1 index get
+ dup type /dicttype ne {
+ dup /CIDFont resourcestatus {
+ pop pop /CIDFont
+ } {
+ /Font
+ } ifelse findresource
+ } if
+ exch CMap /FontMatrices get dup length 2 index gt {
+ exch get dup null eq { pop } { makefont } ifelse
+ } {
+ pop pop
+ } ifelse
+ } for ] readonly def
+ /FMapType 9 def
+ /FontMatrix matrix def
+ /FontName 3 index def
+ CMap /WMode .knownget { /WMode exch def } if
+ /FontType 0 def
+ pop pop currentdict end /Font defineresource
+} bind odef
+
+% ---------------- CMap operators ---------------- %
+
+40 dict begin
+
+% Our internal .CodeMapData structure closely mirrors the structures
+% defined in gxfcmap.h (q.v.). () indicate a string, [] indicate an array,
+% ? indicates a Boolean, # indicates an integer, {} for grouping.
+% [[(first) (last) ...] % code space ranges
+% [(prefix) (key_size,?is_range,value_type,value_size) (keys...)
+% {(values...) | [value ...]} #font_index % code mappings
+% ...]
+% <<same>> % notdef mappings
+% ]
+% FontMatrices is the array of matrices defined by begin/endusematrix.
+% All of the arrays and strings are read-only after they have been built.
+%
+% Note that the code in zfcmap.c that constructs the C structures from
+% the PostScript structures has intimate knowledge of the above format.
+
+% ****** NOTE: The code currently only handles "well-behaved" CMaps:
+% - CID values only (no bfchars), 16-bit
+% - Entries (both code space and map) must be sorted
+% - Only the last byte must vary in each map range, except for
+% the identity mapping
+
+% ------ Font-level operators ------ %
+
+/begincmap { % - begincmap -
+ /.CodeMapData [[] [] []] def
+ /FontMatrices [] def
+ /.FontIndex 0 def
+ /.TempMaps [20 dict 50 dict 50 dict] def
+ /CodeMap null def % for .buildcmap
+} bind def
+/endcmap { % - endcmap -
+ .rewriteTempMapsNotDef
+ DEBUG {
+ (*** defined charmap ***\n) print
+ .TempMaps 1 get {exch == (\t) print ==} forall
+ (*** undefined charmap ***\n) print
+ .TempMaps 2 get {exch == (\t) print ==} forall
+ } if
+ 10 dict begin 0 1 2 {
+ /i exch def
+ % Append data from .TempMaps to .CodeMapData.
+ /t .TempMaps i get def
+ .CodeMapData i get length t { exch pop length add } forall
+ DEBUG { (requested array size ) print dup == } if
+ array /a exch def
+ a 0 .CodeMapData i get .putmore
+ 0 1 t length 1 sub {
+ t exch get .putmore
+ } for pop pop
+ .CodeMapData i a put
+ } for end
+ currentdict /.TempMaps undef
+ /.CodeMapData .CodeMapData .endmap def
+ /FontMatrices FontMatrices .endmap def
+} bind def
+
+/.putmore { % <array> <i> <array2> .putmore <array> <i+len(array2)>
+ 3 copy putinterval length add
+} bind def
+
+/.endmap { % <map> .endmap <map>
+ dup type /arraytype eq {
+ % This might be a shared read-only array inherited via usecmap.
+ % Don't try to update its elements if this is the case.
+ dup wcheck {
+ 0 1 2 index length 1 sub {
+ 2 copy 2 copy get .endmap put pop
+ } for readonly
+ } if
+ } {
+ dup type /stringtype eq { readonly } if
+ } ifelse
+} bind def
+
+/.appendmap { % -mark- <elt> ... <array#> .appendmap -
+ .TempMaps exch get counttomark 1 add 1 roll
+ ] 1 index length exch put
+} bind def
+
+/begincodespacerange { % <count> begincodespacerange -
+ pop mark
+} bind def
+/endcodespacerange { % <code_lo> <code_hi> ... endcodespacerange -
+ 0 .appendmap
+} bind def
+
+/usecmap { % <CMap_name> usecmap -
+ /CMap findresource dup
+ % Copy the top level of .CodeMapData
+ /.CodeMapData exch /.CodeMapData get copyarray def
+ /FontMatrices exch /FontMatrices get copyarray def
+} bind def
+
+/usefont { % <fontID> usefont -
+ /.FontIndex exch def
+} bind def
+
+/beginusematrix { % <fontID> beginusematrix -
+ FontMatrices wcheck not FontMatrices length 2 index le or {
+ FontMatrices length 1 index 1 add .max array
+ dup 0 FontMatrices putinterval
+ /FontMatrices exch def
+ } if
+} bind def
+/endusematrix { % <matrix> endusematrix -
+ FontMatrices 3 1 roll put
+} bind def
+
+% ------ Rearranged font operators ------ %
+
+/beginrearrangedfont { % <font_name> <font*> beginrearrangedfont -
+ 10 dict begin
+ /.FontNames exch def
+ /.FontName exch def
+ begincmap
+} bind def
+/endrearrangedfont { % - endrearrangedfont -
+ (REARRANGED FONTS NOT IMPLEMENTED YET.) = flush
+ FontName .FontNames 0 get findfont end definefont pop
+} bind def
+
+% ------ Character name/code selector operators ------ %
+
+/beginbfchar { % <count> beginbfchar -
+ pop mark
+} bind def
+/endbfchar { % <code> <to_code|charname> ... endbfchar
+ counttomark 2 idiv {
+ counttomark -2 roll % process in correct order
+ .addbfchar
+ } repeat 1 .appendmap
+} bind def
+
+/beginbfrange { % <count> beginbfrange -
+ pop mark
+} bind def
+/endbfrange { % <code_lo> <code_hi> <to_code|(charname*)> ...
+ % endbfrange -
+ counttomark 3 idiv {
+ counttomark -3 roll % process in correct order
+ dup type dup /arraytype eq exch /packedarraytype eq or {
+ % Array value, split up.
+ exch pop {
+ % Stack: code to_code|charname
+ 1 index exch .addbfchar
+ % Increment the code. As noted above, we require
+ % that only the last byte vary, but we still must
+ % mask it after incrementing, in case the last
+ % value was 0xff.
+ % Stack: code prefix params key value fontindex
+ 6 -1 roll dup length string copy
+ dup dup length 1 sub 2 copy get 1 add 255 and put
+ } forall pop
+ } {
+ % Single value, handle directly.
+ .addbfrange
+ } ifelse
+ } repeat 1 .appendmap
+} bind def
+
+/.addbfchar { % <code> <to_code|charname> .addbfchar
+ % <prefix> <params> <key> <value> <font_index>
+ 1 index exch .addbfrange
+} bind def
+/.addbfrange { % <code_lo> <code_hi> <to_code|charname>
+ % .addbfrange <<same as .addbfchar>>
+ 4 string dup 3
+ 3 index type /nametype eq {
+ 2 index 2 1 put % dst = CODE_VALUE_GLYPH, see gxfcmap.h .
+ 4 -1 roll 1 array astore 4 1 roll 4
+ } {
+ 2 index 2 2 put % dst = CODE_VALUE_CHARS, see gxfcmap.h .
+ 3 index length
+ } ifelse put
+ % Stack: code_lo code_hi value params
+ 3 index 3 index eq {
+ % Single value.
+ 3 -1 roll pop exch () exch
+ } {
+ % Range.
+ dup 0 1 put dup 1 1 put
+ 4 2 roll
+ dup dup length 1 sub 0 exch getinterval 5 1 roll % prefix
+ % Stack: prefix value params code_lo code_hi
+ 2 { exch dup length 1 sub 1 getinterval } repeat concatstrings
+ 3 -1 roll
+ } ifelse
+ .FontIndex
+} bind def
+
+% ------ CID selector operators ------ %
+
+/begincidchar { % <count> begincidchar -
+ pop mark
+} bind def
+/endcidchar { % <code> <cid> ... endcidchar -
+ 1 .endmapchars
+} bind def
+
+/begincidrange { % <count> begincidrange -
+ pop mark
+} bind def
+/endcidrange { % <code_lo> <code_hi> <cid_base> ... endcidrange -
+ 1 .endmapranges
+} bind def
+
+/.endmapchars { % -mark- <code> <cid> ... <map#> .endmapchars -
+ counttomark 1 add 1 roll
+ counttomark 2 idiv {
+ counttomark -2 roll % process in correct order
+ exch % <cid> <code>
+ % Construct prefix, params, key, value, font_index
+ dup length 1 eq { % 1-byte
+ <00 00 00 02> () % <prefix> <param> <null_key>
+ } { % N-byte
+ dup 0 1 getinterval exch % make 1-byte prefix
+ 4 string dup 0
+ USE_CIDCHAR_AS_RANGE {
+ <00 01 00 02> % skelton for param
+ } {
+ <00 00 00 02> % skelton for param
+ } ifelse
+ putinterval
+ exch % <prefix> <param> <code>
+ dup length % <prefix> <param> <code> N
+ 1 sub % <prefix> <param> <code> N-1
+ dup % <prefix> <param> <code> N-1 N-1
+ 3 index % <prefix> <param> <code> N-1 N-1 <param>
+ exch % <prefix> <param> <code> N-1 <param> N-1
+ 0 exch % <prefix> <param> <code> N-1 <param> 0 N-1
+ put % <prefix> <param'> <code> N-1
+ 1 exch % <prefix> <param'> <code> 1 N-1
+ getinterval % <prefix> <param'> <key>
+
+ USE_CIDCHAR_AS_RANGE {
+ dup length 2 mul string % <key> <dkey>
+ dup % <key> <dkey> <dkey>
+ 2 index % <key> <dkey> <dkey> <key>
+ 0 exch putinterval % <key> <dkey'>
+ dup % <key> <dkey'> <dkey'>
+ 3 -1 roll % <dkey'> <dkey'> <key>
+ dup length % <dkey'> <dkey'> <key> N-1
+ exch putinterval % <dkey''>
+ } if
+
+ } ifelse
+
+ 4 -1 roll % <prefix> <param'> <key> <cid>
+ .endmapvalue % <prefix> <param'> <key> <hex_cid> <font_idx>
+ % prefix params keys value fontindex
+ counttomark 5 gt { % 2 (or more) ranges (1 range = 5 item)
+ 4 index 10 index eq % compare prefix
+ 4 index 10 index eq and % compare params
+ 1 index 7 index eq and % compare fontindex
+ {
+ DEBUG { (merge! char\n) print } if
+ pop 4 2 roll pop pop
+ % prefix params keys value fontindex keys2 value2
+ 5 -1 roll 3 -1 roll concatstrings
+ % prefix params value fontindex value2 keys'
+ 4 -1 roll 3 -1 roll concatstrings
+ % prefix params fontindex keys' values'
+ 3 -1 roll
+ } if
+ } if % end of 2 (or more) ranges
+ CMERGE_DEBUG {
+ ( prefix:) print 4 index =only
+ ( param:) print 3 index =only
+ ( key:) print 2 index =only
+ ( hex_cid:) print 1 index =only
+ ( font_idx:) print 0 index == flush
+ } if
+ } repeat
+ counttomark 2 add -1 roll .appendmap
+} bind def
+
+/.endmapranges { % -mark- <code_lo> <code_hi> <cid_base> ... <map#>
+ % .endmapranges -
+ counttomark 1 add 1 roll
+ counttomark 3 idiv {
+ counttomark -3 roll % process in correct order
+ % Construct prefix, params, key_lo, key_hi, value, font_index
+ 3 1 roll % <cid_base> <code_lo> <code_hi>
+ % prefix key
+ % 1-byte code: () .
+ % 1-byte range: () .
+ % N-byte code: . (*)
+ % N-byte range: (*) (*)
+ dup 2 index eq { % <code_lo> == <code_hi>
+ % 0: prefix_len for 1-byte code
+ % 1: prefix_len for N-byte code
+ dup length 1 eq { 0 } { 1 } ifelse
+ } { % <code_lo> != <code_hi>
+ % calculate prefix_len for *-byte range
+ dup length 1 sub % <cid_base> <code_lo> <code_hi> <code_len-1>
+ 0 % initial value for N
+ { % <cid_base> <code_lo> <code_hi> (code_len-1) N
+ dup 2 index ge { exit } if % if (N >= len - 1) exit
+ 3 index 1 index get % N-th byte of code_lo
+ 3 index 2 index get % N-th byte of code_hi
+ eq { 1 add } { exit } ifelse
+ } loop
+ exch pop % discard <code_len-1>
+ } ifelse
+ % cid_base code_lo code_hi prefix_len
+
+ % Althogh Adobe CPSI with native CID/CMap support accept
+ % multi-dimensional range specification in notdef & cidrange
+ % (and CID is calculated as relative position in multi-dimensional
+ % range), but older CPSI & ATM cannot handle it.
+ %
+ % GS accepts such specification, but it's recommended to keep
+ % from using this feature for notdef & cidrange.
+ % Following is a disabler of this feature.
+ % -------------------------------------------------------------
+ % counttomark 1 add index % get map#
+ % 0 ne { % if not codespacerange
+ % 1 index length % get code length
+ % 1 index % get prefix length
+ % sub % calculate key length
+ % 1 gt { % if (key_len > 1),
+ % (.endmapranges error) = flush
+ % (multi-dimensional range specification is used out of codespacerange)
+ % = flush
+ % (/) =only
+ % CMapName CMapName length string cvs =only
+ % (: <) =only
+ % 2 index (%stdout) (w) file exch writehexstring
+ % (> <) =only
+ % 1 index (%stdout) (w) file exch writehexstring
+ % (>\n) =only flush
+ % quit
+ % } if
+ % } if
+ % -------------------------------------------------------------
+
+ 1 index exch 0 exch getinterval
+ % cid_base code_lo code_hi prefix
+ dup length 3 index length exch sub
+ % cid_base code_lo code_hi prefix range_len
+ dup 255 gt {
+ (too long coderange specification for current GS\n) print
+ signalerror
+ } if
+ <00 01 00 02> 4 string copy % create initialized param
+ dup 0 4 -1 roll put % put range_len into param
+
+ % get key_hi
+ 3 -1 roll dup length 3 index length dup 3 1 roll sub getinterval
+
+ % get key_lo
+ 4 -1 roll dup length 4 index length dup 3 1 roll sub getinterval
+
+ % make "keys" (concatenated key_lo + key_hi)
+ exch concatstrings
+
+ %
+ 4 -1 roll
+ .endmapvalue
+
+ % See if we can merge with the previous value.
+ % The prefix, params, and font index must match.
+ % prefix params keys value fontindex
+ counttomark 5 gt { % 2 (or more) ranges (1 range = 5 item)
+ 4 index 10 index eq % compare prefix
+ 4 index 10 index eq and % compare params
+ 1 index 7 index eq and % compare fontindex
+ {
+ DEBUG { (merge!\n) print } if
+ pop 4 2 roll pop pop
+ % prefix params keys value fontindex keys2 value2
+ 5 -1 roll 3 -1 roll concatstrings
+ % prefix params value fontindex value2 keys'
+ 4 -1 roll 3 -1 roll concatstrings
+ % prefix params fontindex keys' values'
+ 3 -1 roll
+ } if
+ } if % end of 2 (or more) ranges
+ } repeat
+ counttomark 2 add -1 roll .appendmap
+} bind def
+
+/.endmapvalue { % <cid> .endmapvalue (hi,lo) .FontIndex
+ 2 string dup 0 3 index -8 bitshift put % value
+ dup 1 4 -1 roll 255 and put
+ .FontIndex % font_index
+} bind def
+
+% ------ notdef operators ------ %
+
+/beginnotdefchar { % <count> beginnotdefchar -
+ pop mark
+} bind def
+/endnotdefchar { % <code> <cid> ... endnotdefchar -
+ 2 .endmapchars
+} bind def
+
+/beginnotdefrange { % <count> beginnotdefrange -
+ pop mark
+} bind def
+/endnotdefrange { % <code_lo> <code_hi> <cid> ... endnotdefrange -
+ 2 .endmapranges
+} bind def
+
+% ---------------- Resource category definition ---------------- %
+
+currentdict end
+
+languagelevel exch 2 .setlanguagelevel
+
+/CMap /Generic /Category findresource dup length dict .copydict
+dup /InstanceType /dicttype put
+dup /DefineResource {
+ % The AdobePS5 Windows driver emits code that attempts to
+ % create CMaps without the required CMapName entry.
+ % Work around this here.
+ dup /CMapName known not {
+ dup wcheck not {
+ .currentglobal exch dup wcheck .setglobal
+ dup length dict .copydict exch .setglobal
+ } if
+ dup gcheck 2 index gcheck not and {
+ exch .currentglobal exch true .setglobal
+ dup length string copy exch .setglobal exch
+ } if dup /CMapName 3 index put
+ } if
+ dup /CodeMap get null eq { .buildcmap } if
+ /Generic /Category findresource /DefineResource get exec
+} put
+/Category defineresource pop
+ % We might have loaded CID font support already.
+/CIDInit /ProcSet 2 copy { findresource } .internalstopped
+ % An interior `stopped' might have reset VM allocation to local.
+true .setglobal
+ { pop pop 3 -1 roll }
+ { dup length 4 index length add dict .copydict 4 -1 roll exch .copydict }
+ifelse exch defineresource pop
+
+.setlanguagelevel
diff --git a/Master/xemtex/gslib/gs_cmdl.ps b/Master/xemtex/gslib/gs_cmdl.ps
new file mode 100644
index 00000000000..e893bafb49d
--- /dev/null
+++ b/Master/xemtex/gslib/gs_cmdl.ps
@@ -0,0 +1,181 @@
+% Copyright (C) 1994, 1996, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_cmdl.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Parse and execute the command line.
+% C code handles the following switches: -h/-? -I -M -v
+
+/cmddict 50 dict def
+cmddict begin
+
+% ---------------- Utility procedures ---------------- %
+
+% Get the next argument from the parsed argument list.
+/nextarg % - nextarg <arg> true
+ % - nextarg false
+ { argv length 0 eq
+ { false }
+ { argv dup 0 get exch dup length 1 sub 1 exch getinterval /argv exch def }
+ ifelse
+ } bind def
+
+% Run a file, under job control if implemented.
+/runjob % <file> runjob -
+ { end % cmddict
+ /startjob where { pop false () startjob pop }
+ run
+ //cmddict begin
+ } bind def
+/runfilejob % <filename> runfilejob -
+ { findlibfile { exch pop } { (r) file } runjob
+ } bind def
+
+% Expand arguments. Free variables: expand@.
+/expandarg % <string> expandarg <args...>
+ { dup () eq
+ { pop
+ }
+ { dup dup (--) eq exch (-+) eq or
+ { pop /expand@ false def
+ }
+ { expand@ { (@) anchorsearch } { false } ifelse
+ { pop findlibfile
+ { exch pop }
+ { (r) file } % let the error happen
+ expandargfile
+ }
+ if
+ }
+ ifelse
+ }
+ } bind def
+/expandargfile % <file> expandargfile <args...>
+ { [ exch cvlit
+ { token not { exit } if
+ dup type /stringtype ne { =string cvs dup length string copy } if
+ expandarg
+ }
+ /exec cvx
+ ] cvx loop
+ } bind def
+
+% ---------------- Recognized switches ---------------- %
+
+% Switches with arguments are defined as <x>;
+% switches without arguments are defined as -<x>.
+
+% Switches without arguments
+/--
+ { nextarg not
+ { (-- and -+ require a file name.) = flush }
+ { //systemdict /ARGUMENTS argv put /argv [] def runjob }
+ ifelse
+ } bind def
+/-+ /-- load def
+/-@ /-- load def
+/-A { (@) Z } bind def
+/-c
+ { { argv length 0 eq { exit } if
+ argv 0 get (-) anchorsearch { pop pop exit } if
+ pop nextarg token
+ { exch pop % Probably should check for empty.
+ end exec //cmddict begin
+ }
+ if
+ }
+ loop
+ } bind def
+/-e { (#) Z } bind def
+/-E /-e load def
+/-f { } def
+/-q { //systemdict /QUIET true put } bind def
+
+% Switches with arguments
+/d
+ { (=) search not { (#) search not { () exch dup } if } if
+ exch pop cvn dup where
+ { pop (Redefining ) print print ( is not allowed.) = flush pop }
+ { exch token
+ { exch pop } % Probably should check for empty.
+ { true }
+ ifelse
+ //systemdict 3 1 roll put
+ }
+ ifelse
+ } bind def
+/D /d load def
+/f { dup length 0 ne { runfilejob } if } bind def
+/g
+ { (x) search { cvi pop exch cvi } { cvi dup } ifelse
+ //systemdict begin /DEVICEHEIGHT exch def /DEVICEWIDTH exch def end
+ } bind def
+/r
+ { (x) search { cvr pop exch cvr } { cvr dup } ifelse
+ //systemdict begin /DEVICEYRESOLUTION exch def /DEVICEXRESOLUTION exch def end
+ } bind def
+/s
+ { (=) search not { (#) search not { () exch dup } if } if
+ exch pop cvn dup where { pop dup load } { () } ifelse
+ type /stringtype ne
+ { (Redefining ) print print ( is not allowed.) = flush pop }
+ { exch //systemdict 3 1 roll put }
+ ifelse
+ } bind def
+/S /s load def
+/Z { true .setdebug } bind def
+
+% ---------------- Main program ---------------- %
+
+% We process the command line in two passes. In the first pass,
+% we read and expand any @-files as necessary. The second pass
+% does the real work.
+
+/cmdstart
+ { //cmddict begin
+ /expand@ true def
+ [
+ % Process the GS_OPTIONS environment variable.
+ (GS_OPTIONS) getenv { 0 () /SubFileDecode filter expandargfile } if
+ % Process the actual command line.
+ .getargv { expandarg } forall
+ ] readonly /argv exch def
+ % Now interpret the commands.
+ { nextarg not { exit } if
+ dup 0 get (-) 0 get eq
+ { dup length 1 eq
+ { pop (%stdin) (r) file runjob
+ }
+ { dup length 2 gt
+ { dup dup length 2 sub 2 exch getinterval exch 1 1 getinterval }
+ if currentdict .knownget
+ { exec
+ }
+ { (Ignoring unknown switch ) print
+ dup length 1 eq { (-) print print } if print
+ () = flush
+ }
+ ifelse
+ }
+ ifelse
+ }
+ { runfilejob
+ }
+ ifelse
+ }
+ loop end
+ } bind def
+
+end % cmddict
diff --git a/Master/xemtex/gslib/gs_css_e.ps b/Master/xemtex/gslib/gs_css_e.ps
new file mode 100644
index 00000000000..78daaeb9ab8
--- /dev/null
+++ b/Master/xemtex/gslib/gs_css_e.ps
@@ -0,0 +1,115 @@
+% Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_css_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Define the CFF StandardStrings that represent characters.
+% This is a pseudo-encoding.
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/CFFStandardStrings mark
+
+% 0
+ /.notdef /space /exclam /quotedbl /numbersign
+ /dollar /percent /ampersand /quoteright /parenleft
+ /parenright /asterisk /plus /comma /hyphen
+ /period /slash /zero /one /two
+ /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less
+ /equal /greater /question /at /A
+ /B /C /D /E /F
+ /G /H /I /J /K
+ /L /M /N /O /P
+% 50
+ /Q /R /S /T /U
+ /V /W /X /Y /Z
+ /bracketleft /backslash /bracketright /asciicircum /underscore
+ /quoteleft /a /b /c /d
+ /e /f /g /h /i
+ /j /k /l /m /n
+ /o /p /q /r /s
+ /t /u /v /w /x
+ /y /z /braceleft /bar /braceright
+ /asciitilde /exclamdown /cent /sterling /fraction
+% 100
+ /yen /florin /section /currency /quotesingle
+ /quotedblleft /guillemotleft /guilsinglleft /guilsinglright /fi
+ /fl /endash /dagger /daggerdbl /periodcentered
+ /paragraph /bullet /quotesinglbase /quotedblbase /quotedblright
+ /guillemotright /ellipsis /perthousand /questiondown /grave
+ /acute /circumflex /tilde /macron /breve
+ /dotaccent /dieresis /ring /cedilla /hungarumlaut
+ /ogonek /caron /emdash /AE /ordfeminine
+ /Lslash /Oslash /OE /ordmasculine /ae
+ /dotlessi /lslash /oslash /oe /germandbls
+% 150
+ /onesuperior /logicalnot /mu /trademark /Eth
+ /onehalf /plusminus /Thorn /onequarter /divide
+ /brokenbar /degree /thorn /threequarters /twosuperior
+ /registered /minus /eth /multiply /threesuperior
+ /copyright /Aacute /Acircumflex /Adieresis /Agrave
+ /Aring /Atilde /Ccedilla /Eacute /Ecircumflex
+ /Edieresis /Egrave /Iacute /Icircumflex /Idieresis
+ /Igrave /Ntilde /Oacute /Ocircumflex /Odieresis
+ /Ograve /Otilde /Scaron /Uacute /Ucircumflex
+ /Udieresis /Ugrave /Yacute /Ydieresis /Zcaron
+% 200
+ /aacute /acircumflex /adieresis /agrave /aring
+ /atilde /ccedilla /eacute /ecircumflex /edieresis
+ /egrave /iacute /icircumflex /idieresis /igrave
+ /ntilde /oacute /ocircumflex /odieresis /ograve
+ /otilde /scaron /uacute /ucircumflex /udieresis
+ /ugrave /yacute /ydieresis /zcaron /exclamsmall
+ /Hungarumlautsmall /dollaroldstyle /dollarsuperior /ampersandsmall /Acutesmall
+ /parenleftsuperior /parenrightsuperior /twodotenleader /onedotenleader /zerooldstyle
+ /oneoldstyle /twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle
+ /sixoldstyle /sevenoldstyle /eightoldstyle /nineoldstyle /commasuperior
+% 250
+ /threequartersemdash /periodsuperior /questionsmall /asuperior /bsuperior
+ /centsuperior /dsuperior /esuperior /isuperior /lsuperior
+ /msuperior /nsuperior /osuperior /rsuperior /ssuperior
+ /tsuperior /ff /ffi /ffl /parenleftinferior
+ /parenrightinferior /Circumflexsmall /hyphensuperior /Gravesmall /Asmall
+ /Bsmall /Csmall /Dsmall /Esmall /Fsmall
+ /Gsmall /Hsmall /Ismall /Jsmall /Ksmall
+ /Lsmall /Msmall /Nsmall /Osmall /Psmall
+ /Qsmall /Rsmall /Ssmall /Tsmall /Usmall
+ /Vsmall /Wsmall /Xsmall /Ysmall /Zsmall
+% 300
+ /colonmonetary /onefitted /rupiah /Tildesmall /exclamdownsmall
+ /centoldstyle /Lslashsmall /Scaronsmall /Zcaronsmall /Dieresissmall
+ /Brevesmall /Caronsmall /Dotaccentsmall /Macronsmall /figuredash
+ /hypheninferior /Ogoneksmall /Ringsmall /Cedillasmall /questiondownsmall
+ /oneeighth /threeeighths /fiveeighths /seveneighths /onethird
+ /twothirds /zerosuperior /foursuperior /fivesuperior /sixsuperior
+ /sevensuperior /eightsuperior /ninesuperior /zeroinferior /oneinferior
+ /twoinferior /threeinferior /fourinferior /fiveinferior /sixinferior
+ /seveninferior /eightinferior /nineinferior /centinferior /dollarinferior
+ /periodinferior /commainferior /Agravesmall /Aacutesmall /Acircumflexsmall
+% 350
+ /Atildesmall /Adieresissmall /Aringsmall /AEsmall /Ccedillasmall
+ /Egravesmall /Eacutesmall /Ecircumflexsmall /Edieresissmall /Igravesmall
+ /Iacutesmall /Icircumflexsmall /Idieresissmall /Ethsmall /Ntildesmall
+ /Ogravesmall /Oacutesmall /Ocircumflexsmall /Otildesmall /Odieresissmall
+ /OEsmall /Oslashsmall /Ugravesmall /Uacutesmall /Ucircumflexsmall
+ /Udieresissmall /Yacutesmall /Thornsmall /Ydieresissmall
+% 379 = end
+
+counttomark packedarray exch pop
+10 1 index .registerencoding
+.defineencoding
+exec
diff --git a/Master/xemtex/gslib/gs_dbt_e.ps b/Master/xemtex/gslib/gs_dbt_e.ps
new file mode 100644
index 00000000000..1057f6d96df
--- /dev/null
+++ b/Master/xemtex/gslib/gs_dbt_e.ps
@@ -0,0 +1,60 @@
+% Copyright (C) 1993, 1994 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_dbt_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Define the Dingbats encoding vector.
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/DingbatsEncoding
+% \000
+ StandardEncoding 0 32 getinterval aload pop % /.notdef
+% \040
+ /space /a1 /a2 /a202 /a3 /a4 /a5 /a119
+ /a118 /a117 /a11 /a12 /a13 /a14 /a15 /a16
+ /a105 /a17 /a18 /a19 /a20 /a21 /a22 /a23
+ /a24 /a25 /a26 /a27 /a28 /a6 /a7 /a8
+% \100
+ /a9 /a10 /a29 /a30 /a31 /a32 /a33 /a34
+ /a35 /a36 /a37 /a38 /a39 /a40 /a41 /a42
+ /a43 /a44 /a45 /a46 /a47 /a48 /a49 /a50
+ /a51 /a52 /a53 /a54 /a55 /a56 /a57 /a58
+% \140
+ /a59 /a60 /a61 /a62 /a63 /a64 /a65 /a66
+ /a67 /a68 /a69 /a70 /a71 /a72 /a73 /a74
+ /a203 /a75 /a204 /a76 /a77 /a78 /a79 /a81
+ /a82 /a83 /a84 /a97 /a98 /a99 /a100 /.notdef
+% \200
+ StandardEncoding 0 32 getinterval aload pop % /.notdef
+% \240
+ /.notdef /a101 /a102 /a103 /a104 /a106 /a107 /a108
+ /a112 /a111 /a110 /a109 /a120 /a121 /a122 /a123
+ /a124 /a125 /a126 /a127 /a128 /a129 /a130 /a131
+ /a132 /a133 /a134 /a135 /a136 /a137 /a138 /a139
+% \300
+ /a140 /a141 /a142 /a143 /a144 /a145 /a146 /a147
+ /a148 /a149 /a150 /a151 /a152 /a153 /a154 /a155
+ /a156 /a157 /a158 /a159 /a160 /a161 /a163 /a164
+ /a196 /a165 /a192 /a166 /a167 /a168 /a169 /a170
+% \340
+ /a171 /a172 /a173 /a162 /a174 /a175 /a176 /a177
+ /a178 /a179 /a193 /a180 /a199 /a181 /a200 /a182
+ /.notdef /a201 /a183 /a184 /a197 /a185 /a194 /a198
+ /a186 /a195 /a187 /a188 /a189 /a190 /a191 /.notdef
+256 packedarray .defineencoding
+3 DingbatsEncoding .registerencoding
+exec
diff --git a/Master/xemtex/gslib/gs_diskf.ps b/Master/xemtex/gslib/gs_diskf.ps
new file mode 100644
index 00000000000..5d1b4e84d3a
--- /dev/null
+++ b/Master/xemtex/gslib/gs_diskf.ps
@@ -0,0 +1,225 @@
+% Copyright (C) 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_diskf.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Support for converting Type 1 fonts without eexec encryption to
+% Type 4 fonts that load individual character outlines on demand.
+
+% If DISKFONTS is true, we load individual CharStrings as they are needed.
+% (This is intended primarily for machines with very small memories.)
+% Initially, the character definition is the file position of the definition;
+% this gets replaced with the actual CharString.
+% Note that if we are loading characters lazily, CharStrings is writable.
+
+% _Cstring must be long enough to hold the longest CharString for
+% a character defined using seac. This is lenIV + 4 * 5 (for the operands
+% of sbw, assuming div is not used) + 2 (for sbw) + 3 * 5 (for the operands
+% of seac other than the character codes) + 2 * 2 (for the character codes)
+% + 2 (for seac), i.e., lenIV + 43.
+
+/_Cstring 60 string def
+
+% When we initially load the font, we call
+% <index|charname> <length> <readproc> cskip_C
+% to skip over each character definition and return the file position instead.
+% This substitutes for the procedure
+% <index|charname> <length> string currentfile exch read[hex]string pop
+% [encrypt]
+% What we actually store in the CharString is fileposition * 1000 + length,
+% negated if the string is stored in binary form.
+
+/cskip_C
+ { exch dup 1000 ge 3 index type /nametype ne or
+ { % This is a Subrs string, or the string is so long we can't represent
+ % its length. Load it now.
+ exch exec
+ }
+ { % Record the position and length, and skip the string.
+ dup currentfile fileposition 1000 mul add
+ 2 index 3 get /readstring cvx eq { neg } if
+ 3 1 roll
+ dup _Cstring length idiv
+ { currentfile _Cstring 3 index 3 get exec pop pop
+ } repeat
+ _Cstring length mod _Cstring exch 0 exch getinterval
+ currentfile exch 3 -1 roll 3 get exec pop pop
+ }
+ ifelse
+ } bind def
+
+% Load a CharString from the file. The font is the top entry
+% on the dictionary stack.
+/load_C % <charname> <fileposandlength> load_C -
+ { dup abs 1000 idiv FontFile exch setfileposition
+ CharStrings 3 1 roll
+ .currentglobal CharStrings .gcheck .setglobal exch
+ dup 0 lt
+ { neg 1000 mod string FontFile exch readstring }
+ { 1000 mod string FontFile exch readhexstring }
+ ifelse pop
+ exch .setglobal
+% If the CharStrings aren't encrypted on the file, encrypt now.
+ Private /-| get 0 get
+ dup type /nametype ne
+ { dup length 5 sub 5 exch getinterval exec }
+ { pop }
+ ifelse dup 4 1 roll put
+% If the character is defined with seac, load its components now.
+ mark exch seac_C
+ counttomark
+ { StandardEncoding exch get dup CharStrings exch get
+ dup type /integertype eq { load_C } { pop pop } ifelse
+ } repeat
+ pop % the mark
+ } bind def
+
+/seac_C % <charstring> seac_C <achar> <bchar> ..or nothing..
+ { dup length _Cstring length le
+ { 4330 exch _Cstring .type1decrypt exch pop
+ dup dup length 2 sub 2 getinterval <0c06> eq % seac
+ { dup length
+ Private /lenIV known { Private /lenIV get } { 4 } ifelse
+ exch 1 index sub getinterval
+% Parse the string just enough to extract the seac information.
+% We assume that the only possible operators are hsbw, sbw, and seac,
+% and that there are no 5-byte numbers.
+ mark 0 3 -1 roll
+ { exch
+ { { dup 32 lt
+ { pop 0 }
+ { dup 247 lt
+ { 139 sub 0 }
+ { dup 251 lt
+ { 247 sub 256 mul 108 add 1 1 }
+ { 251 sub -256 mul -108 add -1 1 }
+ ifelse
+ }
+ ifelse
+ }
+ ifelse
+ } % 0
+ { mul add 0 } % 1
+ }
+ exch get exec
+ }
+ forall pop
+ counttomark 1 add 2 roll cleartomark % pop all but achar bchar
+ }
+ { pop % not seac
+ }
+ ifelse
+ }
+ { pop % punt
+ }
+ ifelse
+ } bind def
+
+% Define replacement procedures for loading fonts.
+% If DISKFONTS is true and the body of the font is not encrypted with eexec:
+% - Prevent the CharStrings from being made read-only.
+% - Substitute a different CharString-reading procedure.
+% (eexec disables this because the implicit 'systemdict begin' hides
+% the redefinitions that make the scheme work.)
+% We assume that:
+% - The magic procedures (-|, -!, |-, and |) are defined with
+% executeonly or readonly;
+% - The contents of the reading procedures are as defined in bdftops.ps;
+% - The font includes the code
+% <font> /CharStrings <CharStrings> readonly put
+/.loadfontdict 6 dict def mark
+ /begin % push this dict after systemdict
+ { dup begin
+ //systemdict eq { //.loadfontdict begin } if
+ } bind
+ /end % match begin
+ { currentdict end
+ //.loadfontdict eq currentdict //systemdict eq and { end } if
+ } bind
+ /dict % leave room for FontFile, BuildChar, BuildGlyph
+ { 3 add dict
+ } bind
+ /executeonly % for reading procedures
+ { readonly
+ }
+ /noaccess % for Subrs strings and Private dictionary
+ { readonly
+ }
+ /readonly % for procedures and CharStrings dictionary
+ { % We want to take the following non-standard actions here:
+ % - If the operand is the CharStrings dictionary, do nothing;
+ % - If the operand is a number (a file position replacing the
+ % actual CharString), do nothing;
+ % - If the operand is either of the reading procedures (-| or -!),
+ % substitute a different one.
+ dup type /dicttype eq % CharStrings or Private
+ count 2 gt and
+ { 1 index /CharStrings ne { readonly } if }
+ { dup type /arraytype eq % procedure or data array
+ { dup length 5 ge 1 index xcheck and
+ { dup 0 get /string eq
+ 1 index 1 get /currentfile eq and
+ 1 index 2 get /exch eq and
+ 1 index 3 get dup /readstring eq exch /readhexstring eq or and
+ 1 index 4 get /pop eq and
+ { /cskip_C cvx 2 packedarray cvx
+ }
+ { readonly
+ }
+ ifelse
+ }
+ { readonly
+ }
+ ifelse
+ }
+ { dup type /stringtype eq % must be a Subr string
+ { readonly }
+ if
+ }
+ ifelse
+ }
+ ifelse
+ } bind
+ /definefont % to insert BuildChar/Glyph and change FontType
+ { dup /FontType get 1 eq
+ { dup /FontType 4 put
+ dup /BuildChar /build_C load put
+ dup /BuildGlyph /build_C load put
+ }
+ if definefont
+ } bind
+counttomark 2 idiv { .loadfontdict 3 1 roll put } repeat pop
+.loadfontdict readonly pop
+
+% Define the BuildChar and BuildGlyph procedures for modified fonts.
+% A single procedure serves for both.
+/build_C % <font> <code|name> build_C -
+ { 1 index begin
+ dup dup type /integertype eq { Encoding exch get } if
+ % Stack: font code|name name
+ dup CharStrings exch .knownget not
+ { 2 copy eq { exch pop /.notdef exch } if
+ QUIET not
+ { (Substituting .notdef for ) print = flush }
+ { pop }
+ ifelse
+ /.notdef CharStrings /.notdef get
+ } if
+ % Stack: font code|name name charstring
+ dup type /integertype eq
+ { load_C end build_C }
+ { end .type1execchar }
+ ifelse
+ } bind def
diff --git a/Master/xemtex/gslib/gs_dpnxt.ps b/Master/xemtex/gslib/gs_dpnxt.ps
new file mode 100644
index 00000000000..e38e6965074
--- /dev/null
+++ b/Master/xemtex/gslib/gs_dpnxt.ps
@@ -0,0 +1,113 @@
+% Copyright (C) 1997, 1998 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_dpnxt.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% gs_dpnxt.ps
+% NeXT Display PostScript extensions
+
+% Define the operation values for compositing. These must match the values
+% in gsdpnext.h, which also are the ones from the NeXT documentation.
+% We put them in systemdict, which seems like as good a place as any.
+mark
+ /Clear /Copy /Sover /Sin /Sout /Satop /Dover /Din /Dout /Datop /Xor
+ /PlusD /PlusL /Highlight % not sure about Highlight
+counttomark { counttomark 1 sub def } repeat pop
+
+% We implement readimage and sizeimage using the following 3 otherwise
+% undocumented lower-level operators:
+%
+% <x> <y> <width> <height> <matrix> .sizeimagebox
+% <dev_x> <dev_y> <dev_width> <dev_height> <matrix>
+%
+% - .sizeimageparams <bits/sample> <multiproc> <ncolors>
+%
+% <device> <x> <y> <width> <max_height> <alpha?> <std_depth|null>
+% <string> .getbitsrect <height> <substring>
+%
+% NOTE: These operators are subject to change without notice!
+
+% Implement readimage using .getbitsrect. Experimentation on a NeXT system
+% shows that the data is always returned in order of increasing device Y,
+% regardless of the CTM.
+%
+% Note that we can't make stack protection work for this operator,
+% because it must remove its operands from the stack before calling
+% the supplied procedure(s).
+
+/readimage { % <x> <y> <width> <height> <proc> [... <procN-1>]
+ % <string> <alpha?> readimage -
+ .sizeimageparams exch {
+ % multiproc = true. If N > 1, store the procedures in an array.
+ exch pop 1 index { 1 add } if
+ % Stack: ... string alpha? nprocs
+ dup 1 eq {
+ pop false % only 1 procedure, multiproc is irrelevant
+ } {
+ dup array 4 1 roll 3 add 2 roll astore 3 1 roll true
+ } ifelse
+ } {
+ % multiproc = false.
+ pop pop false
+ } ifelse
+ % Map the rectangle to device coordinates.
+ % Stack: x y w h proc(s) str alpha? multi?
+ 8 -4 roll matrix .sizeimagebox pop 8 4 roll
+ % Make sure we allocate the operand array in local VM
+ % to avoid a possible invalidaccess.
+ .currentglobal false .setglobal 9 1 roll
+ exch { 1 } { 0 } ifelse exch % alpha is last, if present
+ exch 4 1 roll 8 array astore exch .setglobal
+ { % Read out a block of scan lines and pass them to the procedure.
+ % Stack: [x y w h alpha? proc(s) str multi?] -- we must consume this.
+ dup 3 get 0 eq { pop exit } if
+ aload 9 1 roll pop exch pop currentdevice 7 1 roll
+ % Always read out the data as standard (not native) pixels.
+ .sizeimageparams pop pop exch .getbitsrect
+ % Stack: [x y w h alpha? proc(s) str multi?] hread substr
+ 3 -1 roll
+ % Stack: hread substr [x y w h alpha? proc(s) str multi?]
+ dup 1 2 copy get 5 index add put
+ % Stack: hread substr [x y' w h alpha? proc(s) str multi?]
+ dup 3 2 copy get 6 -1 roll sub put
+ % Stack: substr [x y' w h' alpha? proc(s) str multi?]
+ dup 5 get exch 7 get {
+ % multiproc = true, pass each plane to a different procedure.
+ % Stack: substr procs
+ 0 1 2 index length 1 sub {
+ % Push 1 plane and its procedure under the top 2 elements.
+ % Stack: ... substr procs plane#
+ 2 index length 2 index length idiv % bytes per plane
+ dup 2 index mul exch
+ % Stack: ... substr procs plane# start length
+ 4 index 3 1 roll getinterval 4 1 roll
+ 2 copy get 4 1 roll pop
+ } for
+ exch pop length 2 mul .execn
+ } {
+ % multiproc = false, just call the procedure.
+ exec
+ } ifelse
+ } //systemdict /exec get 3 packedarray cvx loop
+} bind odef
+
+% Implement sizeimage using lower-level operators.
+
+/sizeimage { % <x> <y> <width> <height> <matrix> sizeimage
+ % <devwidth> <devheight> <bits/sample> <matrix>
+ % <multiproc> <ncolors>
+ .sizeimagebox 5 -2 roll pop pop
+ .sizeimageparams 3 -1 roll 4 1 roll
+} bind odef
diff --git a/Master/xemtex/gslib/gs_dps.ps b/Master/xemtex/gslib/gs_dps.ps
new file mode 100644
index 00000000000..10c7577e1cd
--- /dev/null
+++ b/Master/xemtex/gslib/gs_dps.ps
@@ -0,0 +1,203 @@
+% Copyright (C) 1997, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_dps.ps,v 1.4.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Initialization file for Display PostScript functions.
+
+% ------ Contexts ------ %
+
+% To create a context with private local VM, we use the .localfork
+% operator to actually create the context, the new VM, and an empty
+% userdict, and then we call the .initlocaldicts procedure to make
+% local copies of the initial contents of the dictionaries in local VM.
+% savedlocaldicts in systemdict is a global read-only dictionary whose
+% elements are global read-only copies of these initial contents;
+% we just copy its elements into local VM and install them in systemdict.
+% userdict and internaldict require special handling.
+
+% Switching between contexts with different local VMs requires
+% changing the bindings in systemdict that reference local objects.
+% For this purpose, each userdict has an entry called localdicts
+% which holds the local copies of the elements of savedlocaldicts,
+% plus internaldict. The context switching code in the interpreter
+% effectively copies this dictionary into systemdict.
+% NOTE: the name localdicts is known to the interpreter.
+
+% Switching between contexts also requires resetting the user parameters.
+% The interpreter records the value of userparams (a local dictionary
+% referenced from systemdict) for each context, and uses it for this.
+% See gs_lev2.ps for more details.
+% NOTE: the name userparams is known to the interpreter.
+
+% Save copies of local dictionaries at the end of system initialization.
+% Also save the initial gstate.
+/.savelocalstate {
+ .currentglobal true .setglobal
+ //systemdict /savedlocaldicts mark //systemdict {
+ dup gcheck {
+ pop pop
+ } {
+ dup type /dicttype eq {
+ % Save a copy of this dictionary in global VM.
+ dup maxlength dict .copydict readonly
+ } {
+ pop pop
+ } ifelse
+ } ifelse
+ } forall .dicttomark readonly put
+ % Create localdicts for the current context.
+ false .setglobal
+ userdict /localdicts mark savedlocaldicts {
+ pop dup load
+ } forall /internaldict dup load
+ .dicttomark readonly put
+ % Save a copy of the initial gstate.
+ true .setglobal
+ //systemdict /savedinitialgstate gstate readonly put
+ .setglobal
+} .bind def
+
+% Initialize local dictionaries and gstate when creating a new context.
+% Note that until this completes, we are in the anomalous situation of
+% having systemdict point to dictionaries that are in a non-current
+% local VM. Because of this, we turn off garbage collection temporarily.
+/.copylocal { % <name> <dict> .copylocal <name> <dict'>
+ % Copy a dictionary to the current (local) VM,
+ % and make it read-only if its current definition is.
+ dup maxlength dict .copydict
+ 1 index load wcheck not { readonly } if
+} .bind def
+% When this is called, the dictionary stack is in its initial state,
+% and there is (anomalously) only one gstate on the gstate stack.
+/.initlocaldicts { % - .initlocaldicts -
+ -2 vmreclaim
+ .currentglobal //systemdict begin
+ false .setglobal
+ % Since localdicts doesn't exist yet, references from
+ % systemdict to local objects won't get restored if
+ % a context switch happens in this code. Therefore,
+ % until localdicts is defined, we have to keep all our
+ % state on the operand stack.
+
+ % Acquire userdict.
+ %****** WRONG IF NON-STANDARD INITIAL DSTACK ******
+ countdictstack array dictstack
+ { dup gcheck not { exit } if pop } forall
+ % Create localdicts with a local copy of each dictionary,
+ % except for userdict and userparams, which just need
+ % to be filled in.
+ mark savedlocaldicts {
+ 1 index /userdict eq {
+ % Stack: userdict mark ... /userdict inituserdict
+ counttomark 1 add index .copydict
+ } {
+ 1 index /userparams eq {
+ % Stack: userdict mark ... /userparams inituserparams
+ userparams .copydict
+ } {
+ .copylocal
+ } ifelse
+ } ifelse
+ } forall /internaldict dup .makeinternaldict .makeoperator
+ .dicttomark readonly /localdicts exch put
+ % localdicts is now defined in userdict.
+ % Copy the definitions into systemdict.
+ localdicts { .forcedef } forall
+ % Set the user parameters.
+ userparams readonly .setuserparams
+ % Establish the initial gstate(s).
+ /savedinitialgstate .systemvar setgstate gsave
+ % Wrap up.
+ end .setglobal
+} odef
+
+% Check whether an object is a procedure.
+/.proccheck { % <obj> .proccheck <bool>
+ dup xcheck
+ exch type dup /arraytype eq exch /packedarraytype eq or and
+} bind def
+
+% Create a context with private local VM.
+% The .localfork operator does all the work, but we must ensure that
+% .initlocaldicts gets called when the new context starts up.
+/localfork { % <mark> <obj1> ... <objN> <proc>
+ % <stdin|null> <stdout|null>
+ % localfork <context>
+ .currentglobal true .setglobal 3 index
+ dup .proccheck not {
+ pop .setglobal /localfork cvx /typecheck signalerror
+ } if
+ {exec .initlocaldicts} aload pop
+ 3 1 roll 3 packedarray cvx
+ 4 1 roll 5 -1 roll pop .setglobal .localfork
+} odef
+
+% Fork a context that shares VM. The .fork operator creates an empty
+% userparams dictionary for the context, but we still need to initialize
+% this dictionary when the new context starts up.
+/.postfork { % - .postfork -
+ % Initialize the user parameters.
+ savedlocaldicts /userparams get userparams .copydict readonly pop
+} odef
+/fork { % <mark> <obj1> ... <objN> <proc> fork <context>
+ .currentglobal false .setglobal 1 index
+ dup .proccheck not {
+ pop .setglobal /fork cvx /typecheck signalerror
+ } if
+ {exec .postfork} aload pop
+ 3 1 roll 3 packedarray cvx
+ 3 1 roll exch pop .setglobal .fork
+} odef
+
+% ------ Halftone phase ------ %
+
+/sethalftonephase { % <x> <y> sethalftonephase -
+ -1 2 index 2 index .setscreenphase pop pop
+} odef
+/currenthalftonephase { % - currenthalftonephase <x> <y>
+ 0 .currentscreenphase
+} odef
+
+% ------ Device-source images ------ */
+
+.imagetypes 2 /.image2 load put
+
+% ------ Device information ------ %
+
+/.deviceinfodict mark
+ /Colors null /GrayValues null /RedValues null /GreenValues null
+ /BlueValues null /ColorValues null
+.dicttomark readonly def
+/deviceinfo { % - deviceinfo <dict>
+ currentdevice //.deviceinfodict .getdeviceparams .dicttomark readonly
+} odef
+
+% The current implementation allocates a 2-element array each time.
+% Perhaps we should change this to 2 separate parameters for X and Y?
+/.wtdict mark
+ /wtranslation null
+.dicttomark readonly def
+/wtranslation { % - wtranslation <x> <y>
+ currentdevice //.wtdict .getdeviceparams exch pop exch pop aload pop
+} odef
+currentdict /.wtdict .undef
+
+% ------ View clipping ------ %
+
+/rectviewclip { % <x> <y> <width> <height> rectviewclip -
+ % <numarray|numstring> rectviewclip -
+ newpath .rectappend viewclip
+} odef
diff --git a/Master/xemtex/gslib/gs_dps1.ps b/Master/xemtex/gslib/gs_dps1.ps
new file mode 100644
index 00000000000..177fb68ba11
--- /dev/null
+++ b/Master/xemtex/gslib/gs_dps1.ps
@@ -0,0 +1,142 @@
+% Copyright (C) 1997, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_dps1.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Initialization file for most of the Display PostScript functions
+% that are also included in Level 2.
+
+level2dict begin
+
+% ------ Virtual memory ------ %
+
+/currentshared /.currentglobal load def
+/scheck /.gcheck load def
+%****** FOLLOWING IS WRONG ******
+/shareddict currentdict /globaldict .knownget not { 20 dict } if def
+
+% Global and LocalFontDirectory must remain in systemdict
+% even if we temporarily exit Level 2 mode.
+
+end % level2dict
+systemdict begin
+
+/SharedFontDirectory .FontDirectory .gcheck
+ { .currentglobal false .setglobal
+ /LocalFontDirectory .FontDirectory dup maxlength dict copy
+ .forcedef % LocalFontDirectory is local, systemdict is global
+ .setglobal .FontDirectory
+ }
+ { /LocalFontDirectory .FontDirectory
+ .forcedef % LocalFontDirectory is local, systemdict is global
+ 50 dict
+ }
+ifelse def
+
+end % systemdict
+level2dict begin
+
+% setshared must rebind FontDirectory to the appropriate one of
+% Local or SharedFontDirectory.
+
+/.setglobal % <bool> .setglobal -
+ { dup .setglobal
+ //systemdict /FontDirectory .currentglobal
+ { //SharedFontDirectory }
+ { /LocalFontDirectory .systemvar } % can't embed ref to local VM
+ ifelse .forceput pop % LocalFontDirectory is local, systemdict is global
+ } .bind odef % must bind .forceput and .setglobal
+ % even if NOBIND in effect
+% Don't just copy (load) the definition of .setglobal:
+% it gets redefined for LL3.
+/setshared { /.setglobal .systemvar exec } odef
+.currentglobal setshared
+
+% See below for changes in save and restore.
+
+% ------ Fonts ------ %
+
+/selectfont % <fontname> <size> selectfont -
+ { 1 index findfont
+ 1 index dup type /arraytype eq { makefont } { scalefont } ifelse
+ setfont pop pop
+ } odef
+% undefinefont has to take local/global VM into account.
+/undefinefont % <fontname> undefinefont -
+ { .FontDirectory 1 index .undef
+ .currentglobal
+ { % Current mode is global; delete from local directory too.
+ //systemdict /LocalFontDirectory .knownget
+ { 1 index .undef }
+ if
+ }
+ { % Current mode is local; if there was a shadowed global
+ % definition, copy it into the local directory.
+ //systemdict /SharedFontDirectory .knownget
+ { 1 index .knownget
+ { .FontDirectory 2 index 3 -1 roll put }
+ if
+ }
+ if
+ }
+ ifelse pop
+ } odef
+
+% If we load a font into global VM within an inner save, the restore
+% will delete it from FontDirectory but not from SharedFontDirectory.
+% We have to handle this by making restore copy missing entries from
+% SharedFontDirectory to FontDirectory. Since this could slow down restore
+% considerably, we define a new operator .dictcopynew for this purpose.
+% Furthermore, if FAKEFONTS is in effect, we want global real fonts to
+% override fake local ones. We handle this by brute force.
+/restore % <save> restore -
+ { dup //restore % bind even if NOBIND
+ /LocalFontDirectory .systemvar
+ FAKEFONTS
+ { mark
+ % We want to delete a fake font from the local directory
+ % iff the global directory now has no definition for it,
+ % or a non-fake definition.
+ 1 index dup
+ { % Stack: lfd mark lfd key ... lfd key value
+ length 1 gt
+ { % This is a real local definition; don't do anything.
+ pop
+ }
+ { % This is a fake local definition, check for global.
+ //SharedFontDirectory 1 index .knownget
+ { % A global definition exists, check for fake.
+ length 1 eq { pop } { 1 index } ifelse
+ }
+ { % No global definition, delete the local one.
+ 1 index
+ }
+ ifelse
+ }
+ ifelse
+ } forall
+ pop counttomark 2 idiv { .undef } repeat pop
+ }
+ if
+ //SharedFontDirectory exch .dictcopynew pop
+ .currentglobal .setglobal % Rebind FontDirectory according to current VM.
+ pop
+ } bind odef
+
+% ------ Miscellaneous ------ %
+
+/undef /.undef load def
+
+end % level2dict
diff --git a/Master/xemtex/gslib/gs_dps2.ps b/Master/xemtex/gslib/gs_dps2.ps
new file mode 100644
index 00000000000..c84b5be9b65
--- /dev/null
+++ b/Master/xemtex/gslib/gs_dps2.ps
@@ -0,0 +1,217 @@
+% Copyright (C) 1990, 1996, 1997, 1998, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_dps2.ps,v 1.3.4.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Initialization file for basic Display PostScript functions
+% that are also included in Level 2.
+
+level2dict begin
+
+% ------ Halftones ------ %
+
+/.makestackdict
+ { { counttomark -1 roll } forall .dicttomark
+ } bind def
+/currenthalftone % - currenthalftone <dict>
+ { mark .currenthalftone
+ { { exch pop } % halftone
+ { /HalftoneType 1 % screen
+ { /Frequency /Angle /SpotFunction }
+ .makestackdict
+ }
+ { /HalftoneType 2 % colorscreen
+ { /RedFrequency /RedAngle /RedSpotFunction
+ /GreenFrequency /GreenAngle /GreenSpotFunction
+ /BlueFrequency /BlueAngle /BlueSpotFunction
+ /GrayFrequency /GrayAngle /GraySpotFunction
+ }
+ .makestackdict
+ }
+ }
+ exch get exec
+ } odef
+% Define sethalftone so it converts types 1-4 to type 5.
+/.makehalftoneRGBV { % <dict> <type> <keys> <keysRGBV>
+ 4 -1 roll exch { 1 index exch get exch } forall 15 1 roll
+ 14 -2 roll mark 15 1 roll { /Gray /Blue /Green /Red } {
+ % stack: v0 v1 v2 type keys comp
+ mark
+ 2 index 0 get 8 -1 roll
+ 4 index 1 get 9 -1 roll
+ 6 index 2 get 10 -1 roll
+ % stack: type keys comp mark k0 v0 k1 v1 k2 v2
+ /HalftoneType 10 index .dicttomark
+ counttomark 2 roll
+ } forall pop pop
+ /Default 1 index .dicttomark exch pop { .sethalftone5 }
+} bind def
+
+% The value of each entry in .halftonetypes is a procedure:
+% <setdict> <htdict> <<proc>> <setdict'> <htdict'> <sethalftoneproc>
+% This allows us to use these procedures both for actually implementing
+% sethalftone and for converting subsidiary dictionaries of HalftoneType 5
+% halftones.
+systemdict begin
+15 dict /.halftonetypes 1 index def begin
+ 1 {
+ mark exch /Default exch .dicttomark { .sethalftone5 }
+ } bind def
+ 2 {
+ 1 { /Frequency /Angle /SpotFunction } {
+ /RedFrequency /RedAngle /RedSpotFunction
+ /GreenFrequency /GreenAngle /GreenSpotFunction
+ /BlueFrequency /BlueAngle /BlueSpotFunction
+ /GrayFrequency /GrayAngle /GraySpotFunction
+ } .makehalftoneRGBV
+ } bind def
+ 3 {
+ mark exch /Default exch .dicttomark { .sethalftone5 }
+ } bind def
+ 4 {
+ 3 { /Width /Height /Thresholds } {
+ /RedWidth /RedHeight /RedThresholds
+ /GreenWidth /GreenHeight /GreenThresholds
+ /BlueWidth /BlueHeight /BlueThresholds
+ /GrayWidth /GrayHeight /GrayThresholds
+ } .makehalftoneRGBV
+ } bind def
+ 5 {
+ pop dup length dict copy
+ mark 1 index {
+ % Even HalftoneType 5 dictionaries have entries other than
+ % subsidiary halftone dictionaries.
+ dup type /dicttype ne {
+ 0
+ } {
+ dup /HalftoneType .knownget not { 0 } if
+ } ifelse dup 5 gt {
+ % Stack: dict mark ... keyN dictN httypeN
+ % Assume that all HalftoneTypes > 5 convert to 5.
+ 1 index 3 1 roll
+ //.halftonetypes exch get exec pop /Default get
+ % Stack: dict mark ... keyN setdict'N htdict'N
+ counttomark 1 add index 3 index 4 -1 roll put
+ } {
+ pop
+ } ifelse
+ } forall .dicttomark { .sethalftone5 }
+ } bind def
+end
+end
+/sethalftone { % <dict> sethalftone -
+ % We must create the new dictionary in the same VM as the
+ % operand; otherwise, invalidaccess errors may occur.
+ .currentglobal 1 index dup gcheck .setglobal
+ dup //.halftonetypes 1 index /HalftoneType get get exec exec
+ .setglobal pop
+} odef
+% Redefine setscreen and setcolorscreen to recognize halftone dictionaries,
+% and to insert the Frequency and Angle into Type 1 halftones, per
+% Adobe TN 5085.
+/.fixsethalftonescreen % <freq> <angle> <dict> .fix...screen
+ % <freq> <angle> <dict> <dict'>
+ { dup dup /HalftoneType get 1 eq
+ { dup wcheck not { dup length .copydict } if
+ dup /Frequency 5 index put
+ dup /Angle 4 index put
+ }
+ if
+ } bind def
+/setscreen % <ignore*2> <dict> setscreen -
+ { dup type /dicttype eq
+ { .fixsethalftonescreen sethalftone pop pop pop }
+ { //setscreen }
+ ifelse
+ } odef
+/setcolorscreen % <ignore*11> <dict> setcolorscreen -
+ { dup type /dicttype eq
+ { .fixsethalftonescreen sethalftone 12 { pop } repeat }
+ { //setcolorscreen }
+ ifelse
+ } odef
+% Redefine currentscreen and currentcolorscreen to extract the Frequency
+% and Angle from Type 1 halftones, per Adobe TN 5085.
+/.fixcurrenthalftonescreen % <dict> .fix... <freq> <angle> <proc>
+ { dup /HalftoneType get 1 eq
+ { dup /Frequency get 1 index /Angle get }
+ { 60 0 }
+ ifelse 3 2 roll
+ } bind def
+/currentscreen % - currentscreen 60 0 <dict>
+ { .currenthalftone
+ { { .fixcurrenthalftonescreen } % halftone
+ { } % screen
+ { 12 3 roll 9 { pop } repeat % colorscreen
+ dup type /dicttype eq { .fixcurrenthalftonescreen } if
+ }
+ }
+ exch get exec
+ } odef
+/currentcolorscreen % - currentcolorscreen (60 0 <dict>)*4
+ { .currenthalftone
+ { { .fixcurrenthalftonescreen 3 copy 6 copy } % halftone
+ { 3 copy 6 copy } % screen
+ { } % colorscreen
+ }
+ exch get exec
+ } odef
+
+% ------ User objects ------ %
+
+/.UserObjects {
+ .userdict /UserObjects
+} odef
+% In order to get proper error recovery behavior, we need to be careful
+% not to pop any operands from the stack until we're done.
+% The code below faithfully duplicates the apparent array-growing
+% behavior of Adobe interpreters.
+/defineuserobject { % <index> <value> defineuserobject -
+ .UserObjects .knownget {
+ length dup 3 index le {
+ % Stack: index value len
+ 2 index eq { 1 index 2 mul } { 1 index 1 add } ifelse
+ .localvmarray .UserObjects get
+ 1 index copy pop
+ .UserObjects 3 -1 roll put
+ } {
+ pop
+ } ifelse
+ } {
+ .UserObjects 3 index 1 add 10 .max .localvmarray put
+ } ifelse
+ .UserObjects get 2 index 2 index put pop pop
+} odef
+/execuserobject { % <index> execuserobject -
+ .UserObjects get 1 index get exch pop exec
+} odef
+/undefineuserobject { % <index> undefineuserobject -
+ .UserObjects get 1 index null put pop
+} odef
+
+% ------ Cache control ------ %
+
+% Dummy definitions for cache control operators
+
+/ucachestatus { % - ucachestatus -mark- ? ? ? ? <size>
+ mark 0 0 0 0 .userdict /.ucachesize .knownget not { 0 } if
+} odef
+/setucacheparams { % -mark- ... <size> setucacheparams -
+ % Provoke an appropriate error if needed.
+ counttomark 1 lt { () 0 get } if
+ 0 or .userdict /.ucachesize 2 index 0 .max put cleartomark
+} odef
+
+end % level2dict
diff --git a/Master/xemtex/gslib/gs_dscp.ps b/Master/xemtex/gslib/gs_dscp.ps
new file mode 100644
index 00000000000..355e9d9e0f5
--- /dev/null
+++ b/Master/xemtex/gslib/gs_dscp.ps
@@ -0,0 +1,119 @@
+% Copyright (C) 2000 Artifex Software Inc. All rights reserved.
+%
+% 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.
+
+% $Id: gs_dscp.ps,v 1.4.2.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Postscript interface routines to DSC parser
+
+/send_orientation { % <orientation> send_orientation -
+ % .parse_dsc_comments returns -1 for an Orientation key with an
+ % unrecognized value.
+ dup 0 ge {
+ << /Orientation 2 index >> setpagedevice
+ } if pop
+} bind def
+
+% This dictionary contains local handlers for DSC comments.
+% See header in zdscpars.c for more information.
+% <dsc_dict> handler <dsc_dict>
+/DSCparseprocs mark
+ /Orientation { dup /Orientation get send_orientation } bind
+ /PageOrientation { dup /PageOrientation .knownget { send_orientation }
+ { dup /Orientation .knownget { send_orientation } if }
+ ifelse } bind
+ /Page { dup /Orientation .knownget { send_orientation } if } bind
+ /NOP { } bind
+.dicttomark readonly def
+
+% This procedure is called whenever a DSC comment is found by the interpreter
+/do_parse_dsc false def
+/parse_dsc { % <file> <DSC string> [<prev proc>]
+ % parse_dsc -
+ % Run any previously installed parser.
+ 0 get dup null eq { pop } { 3 copy exec pop } ifelse
+
+ do_parse_dsc { % Check if this parser is enabled
+ currentglobal true setglobal % Go to global VM, save old state
+ 3 1 roll % Put old VM state under <file> <string>
+ dsc_dict exch % <VM state> <file> <dict> <string>
+ .parse_dsc_comments % <VM state> <file> <dict> <DSC name>
+ 4 -1 roll % Get old VM state from under <file> <dict> <DSC name>
+ setglobal % restore previous VM state
+ //DSCparseprocs exch .knownget { % Check DSC name against local handler list
+ exec % execute any local handler
+ } if
+ } if
+ pop pop % remove file, dict
+} bind def
+
+
+% Check whether the currently installed parser is the one defined in this file.
+/.using_parse_dsc { % - .using_parse_dsc <proc> <using?>
+ currentuserparams /ProcessDSCComment get
+ dup null eq { pop {{//null} //parse_dsc exec} } if
+ dup length 3 eq {
+ dup dup length 1 sub get /parse_dsc load eq
+ } {
+ false
+ } ifelse
+} bind def
+
+% Establish a binding for dsc_dict.
+userdict /dsc_dict null put
+
+% - dsc_init -
+/dsc_init { % Initialize DSC parser
+ currentglobal true setglobal
+ /dsc_dict 50 dict store % Size must be large enough for all DSC values
+ dsc_dict .initialize_dsc_parser
+ .using_parse_dsc {
+ % Already using this parser.
+ pop
+ } {
+ % Encapsulate the previous parser. We know it is in global VM:
+ % allocate the new one in global VM as well.
+ 1 array astore
+ /parse_dsc load /exec load 3 array astore cvx readonly
+ << /ProcessDSCComment 3 -1 roll >>
+ setuserparams
+ } ifelse
+ setglobal
+ /do_parse_dsc true def
+} bind def
+
+
+% Enable the DSC parser defined in this file.
+% - enable_dsc -
+/enable_dsc {
+ dsc_init
+} bind def
+
+% Disable the DSC parser defined in this file.
+% - disable_dsc -
+/disable_dsc {
+ % There might be another parser installed: if so, restore it.
+ % (If it has encapsulated our parser, we can't.)
+ .using_parse_dsc {
+ % Restore the parser we encapsulated.
+ 0 get 0 get
+ currentglobal true setglobal exch
+ << /ProcessDSCComment 3 -1 roll >>
+ exch setglobal setuserparams
+ } {
+ pop
+ } ifelse
+ % If we couldn't restore the old parser, at least disable ours.
+ /do_parse_dsc false def
+} bind def
diff --git a/Master/xemtex/gslib/gs_epsf.ps b/Master/xemtex/gslib/gs_epsf.ps
new file mode 100644
index 00000000000..97d93b58622
--- /dev/null
+++ b/Master/xemtex/gslib/gs_epsf.ps
@@ -0,0 +1,243 @@
+% Copyright (C) 1989, 1996, 2002 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_epsf.ps,v 1.2.6.11.2.3 2003/04/12 14:02:38 giles Exp $
+% Allow the interpreter to encapsulate EPS files, to recognize MS-DOS
+% EPSF file headers, and skip to the PostScript section of the file.
+
+% Encapsulate EPS files and optionally resize page or rescale image.
+% To display an EPS file cropped to the bounding box:
+% gs -dEPSCrop file.eps
+% To display an EPS file scaled to fit the page:
+% gs -dEPSFitPage file.eps
+% To display a file without EPS encapsulation:
+% gs -dNOEPS file.ps
+
+% When starting to process an EPS file, state is 0.
+% After %%BoundingBox processed, state is 1.
+% After %%HiResBoundingBox processed, state is 2.
+% After %%EndComments processed, state is 3.
+/EPSBoundingBoxState 3 def
+/EPSBoundingBoxSetState {
+ //systemdict /EPSBoundingBoxState 3 -1 roll .forceput
+} .bind odef % .forceput must be bound and hidden
+
+% Parse 4 numbers for a bounding box
+/EPSBoundingBoxParse { % (llx lly urx ury) -- llx lly urx ury true OR false
+ mark exch
+ token {exch token {exch token {exch token {exch pop} if} if} if} if
+ counttomark
+ 4 eq {
+ 5 -1 roll pop % remove mark
+ true
+ } {
+ cleartomark false
+ } ifelse
+} bind def
+
+% Rescale and translate to fit the BoundingBox on the page
+/EPSBoundingBoxFitPage { % llx lly urx ury --
+ DEBUG { (gs_epsf.ps: Rescaling EPS to fit page\n) print flush } if
+ clippath pathbbox newpath
+ % translate to new origin at lower left of clippath
+ 3 index 3 index translate
+ % calculate scale to fit smaller of width or height
+ exch 4 -1 roll sub 3 1 roll exch sub
+ 4 2 roll 5 index 5 index 4 2 roll
+ exch 4 -1 roll sub 3 1 roll exch sub
+ 4 2 roll
+ exch 4 -1 roll div 3 1 roll exch div
+ 1 index 1 index lt {pop}{exch pop} ifelse
+ dup scale
+ % translate to EPS -llx,-lly
+ exch neg exch neg translate
+} bind def
+
+% Crop the page to the BoundingBox
+/EPSBoundingBoxCrop { % llx lly urx ury --
+ DEBUG {
+ (gs_epsf.ps: Setting pagesize from EPS bounding box\n) print flush
+ } if
+ exch 3 index sub exch 2 index sub % stack: llx lly urx-llx ury-lly
+ << /PageSize [ 5 -2 roll ] >> setpagedevice
+ neg exch neg exch translate
+} bind def
+
+
+/EPSBoundingBoxProcess { % (llx lly urx ury) state --
+ //systemdict /EPSBoundingBoxState get 1 index lt {
+ exch EPSBoundingBoxParse
+ {
+ //systemdict /EPSCrop known {
+ EPSBoundingBoxCrop
+ } {
+ //systemdict /EPSFitPage known {
+ EPSBoundingBoxFitPage
+ } {
+ % Warn if some of the EPS file will be clipped
+ clippath pathbbox newpath
+ { % context for exit
+ 5 -1 roll lt { 6 { pop } repeat true exit } if
+ 4 -1 roll lt { 4 { pop } repeat true exit } if
+ 3 -1 roll gt { 2 { pop } repeat true exit } if
+ exch gt { true exit } if
+ false exit
+ } loop
+ QUIET not and {
+ (\n **** Warning: Some of the BoundingBox for the EPS file will be clipped.) =
+ ( Use -dEPSCrop or -dEPSFitPage to avoid clipping.\n) =
+ flush
+ } if
+ } ifelse
+ } ifelse
+ EPSBoundingBoxSetState
+ } {
+ pop % state
+ } ifelse
+ } {
+ pop pop
+ } ifelse
+} bind def
+
+/ProcessEPSComment { % file comment -- file comment
+ //systemdict /EPSBoundingBoxState get 3 lt {
+ dup
+ (%%EndComments) anchorsearch {
+ pop pop
+ % ignore any following bounding boxes
+ 3 EPSBoundingBoxSetState
+ } {
+ (%%BoundingBox:) anchorsearch {
+ pop
+ DEBUG { (gs_epsf.ps: found %%BoundingBox\n) print flush } if
+ 1 EPSBoundingBoxProcess
+ } {
+ (%%HiResBoundingBox:) anchorsearch {
+ pop
+ DEBUG { (gs_epsf.ps: found %%HiResBoundingBox\n) print flush } if
+ 2 EPSBoundingBoxProcess
+ } {
+ pop % Not interested in this DSC comment
+ } ifelse
+ } ifelse
+ } ifelse
+ } if
+} bind def
+
+% Install EPS handler for DSC comments, which we do later
+/EPSBoundingBoxInit {
+ systemdict /NOEPS known not {
+ % Merge ProcessEPSComment with existing handler
+ /ProcessEPSComment load /exec load
+ currentuserparams /ProcessDSCComment get
+ dup null eq {pop {pop pop}} if /exec load
+ 4 array astore cvx readonly
+ << /ProcessDSCComment 3 -1 roll >> setuserparams
+ } if
+} bind def
+
+/.runNoEPS /run load def
+
+/.runEPS { % file OR string --
+ /runEPS_save save def
+ /runEPS_dict_count countdictstack def
+ /runEPS_op_count count 2 sub def
+ /runEPS_page_count currentpagedevice /PageCount get def
+ 0 EPSBoundingBoxSetState
+ .runNoEPS
+ currentpagedevice /PageCount get runEPS_page_count sub 0 eq
+ { /showpage load exec } if
+ count runEPS_op_count sub {pop} repeat
+ countdictstack runEPS_dict_count sub {end} repeat
+ runEPS_save restore
+} bind def
+
+/run { % file OR string --
+ dup type /filetype ne { (r) file } if
+ dup (%!PS-Adobe-) .peekstring {
+ (%!PS-Adobe-) eq {
+ dup (%!PS-Adobe-X.X EPSF-X.X) .peekstring {
+ (EPSF) search {
+ pop pop pop
+ DEBUG {(runEPS: Found EPS\n) print flush} if
+ systemdict /NOEPS known {
+ cvx .runNoEPS
+ } {
+ cvx .runEPS
+ } ifelse
+ } {
+ DEBUG {(runEPS: Normal DSC\n) print flush} if
+ pop
+ cvx .runNoEPS
+
+ } ifelse
+ } {
+ DEBUG {(runEPS: Short DSC\n) print flush} if
+ pop
+ cvx .runNoEPS
+ } ifelse
+ } {
+ DEBUG {(runEPS: Not DSC\n) print flush} if
+ cvx .runNoEPS
+ } ifelse
+ } {
+ DEBUG {(runEPS: Short non-DSC\n) print flush} if
+ pop
+ cvx .runNoEPS
+ } ifelse
+} bind odef
+
+
+% Handle DOS EPS files.
+
+/.runnoepsf /run load def
+/.epsfheader <C5D0D3C6> def
+/run
+ { dup type /filetype ne { (r) file } if
+ % Check for MS-DOS EPSF file (see Red Book p. 729).
+ dup ( ) .peekstring
+ { .epsfheader eq { dup ( ) readstring exch pop } { false } ifelse }
+ { pop false }
+ ifelse
+ % Stack: file true/false
+ { % This block is executed if the file is MS-DOS EPSF.
+ % Build up the little-endian byte offset and length.
+ 2
+ { 1 0 4
+ { 2 index read not { pop exit } if % if EOF, let error happen
+ 2 index mul add exch 256 mul exch
+ }
+ repeat exch pop exch
+ }
+ repeat
+ % Stack: offset length file
+ % Use flushfile to skip quickly to the start of the
+ % PostScript section.
+ dup 4 -1 roll 12 sub () /SubFileDecode filter flushfile
+ % Now interpret the PostScript.
+ exch () /SubFileDecode filter cvx run
+ }
+ { .runnoepsf
+ }
+ ifelse
+ } odef
+
+% rebind .runstdin to use redefined run
+userdict begin
+/.runstdin {
+ { (%stdin) run } execute0
+} bind def
+end
diff --git a/Master/xemtex/gslib/gs_fform.ps b/Master/xemtex/gslib/gs_fform.ps
new file mode 100644
index 00000000000..1042b014514
--- /dev/null
+++ b/Master/xemtex/gslib/gs_fform.ps
@@ -0,0 +1,93 @@
+% Copyright (C) 1995, 1996, 1998, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_fform.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Form caching implemented in PostScript.
+
+% This implementation doesn't do the right thing about halftone or
+% Pattern phase, but the Pattern cache doesn't either....
+
+% The Form cache key is the Form dictionary; the value is an array
+% of 2 elements [CTM pattern_instance].
+%
+% In order to prevent restore from clearing the cache, we explicitly
+% push the cache entries on the stack before a restore and reinstall them.
+currentglobal false setglobal
+/.formcachedict 20 dict def % must be local
+true setglobal
+/restore {
+ mark .formcachedict { } forall
+ counttomark 1 add index { //restore } .internalstopped
+ { cleartomark //restore }
+ { counttomark 2 idiv { .formcachedict 3 1 roll put } repeat pop pop }
+ ifelse
+} bind odef
+
+/.execform1 {
+ dup /Implementation known not {
+ dup /FormType get 1 ne { /rangecheck signalerror } if
+ % The Implementation is a Pattern that will draw the form.
+ currentglobal 1 index gcheck setglobal
+ % Stack: form global
+ 10 dict begin
+ /PatternType 1 def
+ /PaintType 1 def % colored
+ /TilingType 1 def % irrelevant
+ % Copy the BBox to the correct VM.
+ /BBox 2 index /BBox get 4 array copy exch 1 index def
+ % Set XStep and YStep to very large numbers,
+ % so we won't get multiple copies of the form.
+ /XStep 1 index dup 2 get exch 0 get sub 100 mul def
+ /YStep exch dup 3 get exch 1 get sub 100 mul def
+ /PaintProc 2 index /PaintProc get def
+ currentdict end readonly
+ % Stack: form global impl
+ exch setglobal
+ 1 index /Implementation 3 -1 roll .forceput
+ } if
+ .formcachedict 1 index .knownget {
+ % Check whether we can use the cached value.
+ % Stack: form cachevalue
+ matrix currentmatrix true 0 1 3 {
+ % Stack: form cachevalue curmat true index
+ 3 index 0 get 1 index get exch 3 index exch get ne {
+ pop pop false exit
+ } if
+ } for exch pop
+ } {
+ false
+ } ifelse not
+ { % Make a new cache entry.
+ gsave
+ matrix currentmatrix dup 4 0 put dup 5 0 put dup setmatrix
+ % Stack: form mat
+ 1 index /Implementation get
+ 2 index /Matrix get
+ makepattern 2 array astore
+ .formcachedict 2 index 2 index put
+ grestore
+ } if
+ % Stack: form cachevalue
+ -1 0 0 transform
+ 2 { exch round cvi } repeat .setscreenphase
+ 1 get setpattern
+ /BBox get aload pop
+ exch 3 index sub exch 2 index sub rectfill
+} .bind odef % must bind .forceput
+
+.formtypes 1 /.execform1 load put
+
+setglobal
diff --git a/Master/xemtex/gslib/gs_fonts.ps b/Master/xemtex/gslib/gs_fonts.ps
new file mode 100644
index 00000000000..3b0e3d08735
--- /dev/null
+++ b/Master/xemtex/gslib/gs_fonts.ps
@@ -0,0 +1,1041 @@
+% Copyright (C) 1990, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_fonts.ps,v 1.13.2.3.2.1 2003/04/12 14:02:38 giles Exp $
+% Font initialization and management code.
+
+% Define the default font.
+/defaultfontname /Courier def
+
+% Define the name of the font map file.
+/defaultfontmap (Fontmap) def
+
+% ------ End of editable parameters ------ %
+
+% Define the UniqueIDs and organization XUID assigned to Aladdin.
+% UniqueIDs 5,066,501 - 5,066,580 are assigned as follows:
+% 01 and 02 for shareware Cyrillic
+% 33 through 67 for Type 1 versions of the Hershey fonts
+% UniqueIDs 5,115,501 - 5,115,600 are currently unassigned.
+/AladdinEnterprisesXUID 107 def
+
+% If SUBSTFONT is defined, make it the default font.
+/SUBSTFONT where { pop /defaultfontname /SUBSTFONT load def } if
+
+% Define a reliable way of accessing FontDirectory in systemdict.
+/.FontDirectory
+{ /FontDirectory .systemvar
+} .bind odef
+
+% If DISKFONTS is true, we load individual CharStrings as they are needed.
+% (This is intended primarily for machines with very small memories.)
+% In this case, we define another dictionary, parallel to FontDirectory,
+% that retains an open file for every font loaded.
+/FontFileDirectory 10 dict def
+
+% Define a temporary string for local use, since using =string
+% interferes with some PostScript programs.
+/.fonttempstring 128 string def
+
+% Split up a search path into individual directories or files.
+/.pathlist % <path> .pathlist <dir1|file1> ...
+ { { dup length 0 eq { pop exit } if
+ .filenamelistseparator search not { exit } if
+ exch pop exch
+ }
+ loop
+ } bind def
+
+% Load a font name -> font file name map.
+userdict /Fontmap .FontDirectory maxlength dict put
+/.loadFontmap { % <file> .loadFontmap -
+ % We would like to simply execute .definefontmap as we read,
+ % but we have to maintain backward compatibility with an older
+ % specification that makes later entries override earlier
+ % ones within the same file.
+ 50 dict exch .readFontmap
+ { .definefontmap } forall
+} bind def
+/.readFontmap { % <dict> <file> .readFontmap <dict>
+ { dup token not { closefile exit } if
+ % stack: dict file fontname
+ % This is a hack to get around the absurd habit of MS-DOS editors
+ % of adding an EOF character at the end of the file.
+ dup (\032) eq { pop closefile exit } if
+ 1 index token not
+ { (Fontmap entry for ) print dup =only
+ ( has no associated file or alias name! Giving up.) = flush
+ {.readFontmap} 0 get 1 .quit
+ } if
+ dup type dup /stringtype eq exch /nametype eq or not
+ { (Fontmap entry for ) print 1 index =only
+ ( has an invalid file or alias name! Giving up.) = flush
+ {.readFontmap} 0 get 1 .quit
+ } if
+ % stack: dict file fontname filename|aliasname
+ 1 index type /stringtype eq
+ 1 index type /nametype eq and 1 index xcheck and
+ 1 index /run eq 2 index /.runlibfile eq or and {
+ % This is an inclusion entry.
+ pop findlibfile { exch pop } { file } ifelse
+ 2 index exch .readFontmap pop
+ } {
+ % This is a real entry.
+ % Read and pop tokens until a semicolon.
+ { 2 index token not
+ { (Fontmap entry for ) print 1 index =only
+ ( ends prematurely! Giving up.) = flush
+ {.loadFontmap} 0 get 1 .quit
+ } if
+ dup /; eq { pop 3 index 3 1 roll .growput exit } if
+ pop
+ } loop
+ } ifelse
+ } loop
+} bind def
+% Add an entry in Fontmap. We redefine this if the Level 2
+% resource machinery is loaded.
+/.definefontmap % <fontname> <file|alias> .definefontmap -
+ { % Since Fontmap is global, make sure the values are storable.
+ .currentglobal 3 1 roll true .setglobal
+ dup type /stringtype eq
+ { dup .gcheck not { dup length string copy } if
+ }
+ if
+ Fontmap 3 -1 roll 2 copy .knownget
+ { % Add an element to the end of the existing value,
+ % unless it's the same as the current last element.
+ mark exch aload pop counttomark 4 add -1 roll
+ 2 copy eq { cleartomark pop pop } { ] readonly .growput } ifelse
+ }
+ { % Make a new entry.
+ mark 4 -1 roll ] readonly .growput
+ }
+ ifelse .setglobal
+ } bind def
+
+% Parse a font file just enough to find the FontName or FontType.
+/.findfontvalue { % <file> <key> .findfontvalue <value> true
+ % <file> <key> .findfontvalue false
+ % Closes the file in either case.
+ exch dup read not { -1 } if
+ 2 copy unread 16#80 eq {
+ dup (xxxxxx) readstring pop pop % skip .PFB header
+ } if
+ { % Stack: key file
+ % Protect ourselves against syntax errors here.
+ dup { token } stopped { pop false exit } if
+ not { false exit } if % end of file
+ dup /eexec eq { pop false exit } if % reached eexec section
+ dup /Subrs eq { pop false exit } if % Subrs without eexec
+ dup /CharStrings eq { pop false exit } if % CharStrings without eexec
+ dup 3 index eq
+ { xcheck not { dup token exit } if } % found key
+ { pop }
+ ifelse
+ } loop
+ % Stack: key file value true (or)
+ % Stack: key file false
+ dup { 4 } { 3 } ifelse -2 roll closefile pop
+} bind def
+/.findfontname
+ { /FontName .findfontvalue
+ } bind def
+
+% If there is no FONTPATH, try to get one from the environment.
+NOFONTPATH { /FONTPATH () def } if
+/FONTPATH where
+ { pop }
+ { /FONTPATH (GS_FONTPATH) getenv not { () } if def }
+ifelse
+FONTPATH length 0 eq { (%END FONTPATH) .skipeof } if
+/FONTPATH [ FONTPATH .pathlist ] def
+
+% Scan directories looking for plausible fonts. "Plausible" means that
+% the file begins with %!PS-AdobeFont or %!FontType1, or with \200\001
+% followed by four arbitrary bytes and then either of these strings.
+% To speed up the search, we skip any file whose name appears in
+% the Fontmap (with any extension and upper/lower case variation) already,
+% and any file whose extension definitely indicates it is not a font.
+%
+% NOTE: The current implementation of this procedure is somewhat Unix/DOS-
+% specific. It assumes that '/' and '\' are directory separators, and that
+% the part of a file name following the last '.' is the extension.
+%
+/.lowerstring % <string> .lowerstring <lowerstring>
+ { 0 1 2 index length 1 sub
+ { 2 copy get dup 65 ge exch 90 le and
+ { 2 copy 2 copy get 32 add put }
+ if pop
+ }
+ for
+ } bind def
+/.splitfilename { % <dir.../base.extn> .basename <base> <extn>
+ % Make the file name read-only to detect aliasing bugs.
+ % We really don't like doing this, but we've had one
+ % such bug already.
+ readonly {
+ (/) search { true } { (\\) search } ifelse { pop pop } { exit } ifelse
+ } loop
+ dup { (.) search { pop pop } { exit } ifelse } loop
+ 2 copy eq {
+ pop ()
+ } {
+ exch dup length 2 index length 1 add sub 0 exch getinterval exch
+ } ifelse
+} bind def
+/.scanfontdict 1 dict def % establish a binding
+/.scanfontbegin
+ { % Construct the table of all file names already in Fontmap.
+ currentglobal true setglobal
+ .scanfontdict dup maxlength Fontmap length 2 add .max .setmaxlength
+ Fontmap
+ { exch pop
+ { dup type /stringtype eq
+ { .splitfilename pop .fonttempstring copy .lowerstring cvn
+ .scanfontdict exch true put
+ }
+ { pop
+ }
+ ifelse
+ }
+ forall
+ }
+ forall
+ setglobal
+ } bind def
+/.scanfontskip mark
+ % Strings are converted to names anyway, so....
+ /afm true
+ /bat true
+ /c true
+ /cmd true
+ /com true
+ /dir true
+ /dll true
+ /doc true
+ /drv true
+ /exe true
+ /fon true
+ /fot true
+ /h true
+ /o true
+ /obj true
+ /pfm true
+ /pss true % Adobe Multiple Master font instances
+ /txt true
+.dicttomark def
+/.scan1fontstring 128 string def
+% %%BeginFont: is not per Adobe documentation, but a few fonts have it.
+/.scanfontheaders [(%!PS-Adobe*) (%!FontType*) (%%BeginFont:*)] def
+0 .scanfontheaders { length .max } forall 6 add % extra for PFB header
+/.scan1fontfirst exch string def
+/.scanfontdir % <dirname> .scanfontdir -
+ { currentglobal exch true setglobal
+ QUIET not { (Scanning ) print dup print ( for fonts...) print flush } if
+ (*) 1 index .filenamedirseparator
+ dup (\\) eq { pop (\\\\) } if % double \ for pattern match
+ exch concatstrings concatstrings
+ 0 0 0 4 -1 roll % found scanned files
+ { % stack: <fontcount> <scancount> <filecount> <filename>
+ exch 1 add exch % increment filecount
+ dup .splitfilename .fonttempstring copy .lowerstring
+ % stack: <fontcount> <scancount> <filecount+1> <filename>
+ % <BASE> <ext>
+ .scanfontskip exch known exch .scanfontdict exch known or
+ { pop
+ % stack: <fontcount> <scancount> <filecount+1>
+ }
+ { 3 -1 roll 1 add 3 1 roll
+ % stack: <fontcount> <scancount+1> <filecount+1> <filename>
+ dup (r) { file } .internalstopped
+ { pop pop null ()
+ % stack: <fontcount> <scancount+1> <filecount+1> <filename>
+ % null ()
+ }
+ {
+ % On some platforms, the file operator will open directories,
+ % but an error will occur if we try to read from one.
+ % Handle this possibility here.
+ dup .scan1fontfirst { readstring } .internalstopped
+ { pop pop () }
+ { pop }
+ ifelse
+ % stack: <fontcount> <scancount+1> <filecount+1>
+ % <filename> <file> <header>
+ }
+ ifelse
+ % Check for PFB file header.
+ dup (\200\001????*) .stringmatch
+ { dup length 6 sub 6 exch getinterval }
+ if
+ % Check for font file headers.
+ false .scanfontheaders
+ { 2 index exch .stringmatch or
+ }
+ forall exch pop
+ { % stack: <fontcount> <scancount+1> <filecount+1> <filename>
+ % <file>
+ dup 0 setfileposition .findfontname
+ { dup Fontmap exch known
+ { pop pop
+ }
+ { exch copystring exch
+ DEBUG { ( ) print dup =only flush } if
+ 1 index .definefontmap
+ .splitfilename pop true .scanfontdict 3 1 roll .growput
+ % Increment fontcount.
+ 3 -1 roll 1 add 3 1 roll
+ }
+ ifelse
+ }
+ { pop
+ }
+ ifelse
+ }
+ % .findfontname will have done a closefile in the above case.
+ { dup null eq { pop } { closefile } ifelse pop
+ }
+ ifelse
+ }
+ ifelse
+ }
+ .scan1fontstring filenameforall
+ QUIET
+ { pop pop pop }
+ { ( ) print =only ( files, ) print =only ( scanned, ) print
+ =only ( new fonts.) = flush
+ }
+ ifelse
+ setglobal
+ } bind def
+
+%END FONTPATH
+
+% Create the dictionary that registers the .buildfont procedure (called by
+% definefont) for each FontType.
+/buildfontdict 20 dict def
+
+% Register Type 3 fonts, which are always supported, for definefont.
+buildfontdict 3 /.buildfont3 cvx put
+
+% Register Type 0 fonts if they are supported. Strictly speaking,
+% we should do this in its own file (gs_type0.ps), but since this is
+% the only thing that would be in that file, it's simpler to put it here.
+/.buildfont0 where { pop buildfontdict 0 /.buildfont0 cvx put } if
+
+% Define definefont. This is a procedure built on a set of operators
+% that do all the error checking and key insertion.
+/.growfontdict
+ { % Grow the font dictionary, if necessary, to ensure room for an
+ % added entry, making sure there is at least one slot left for FID.
+ dup maxlength 1 index length sub 2 lt
+ { dup dup wcheck
+ { .growdict }
+ { .growdictlength dict .copydict }
+ ifelse
+ }
+ { dup wcheck not { dup maxlength dict .copydict } if
+ }
+ ifelse
+ } bind def
+/.completefont {
+ { % Check for disabled platform fonts.
+ NOPLATFONTS
+ { % Make sure we leave room for FID.
+ .growfontdict dup /ExactSize 0 put
+ }
+ { % Hack: if the Encoding looks like it might be the
+ % Symbol or Dingbats encoding, load those now (for the
+ % benefit of platform font matching) just in case
+ % the font didn't actually reference them.
+ % Note that some types of font don't have an Encoding.
+ dup /Encoding .knownget {
+ dup length 65 ge {
+ 64 get
+ dup /congruent eq { SymbolEncoding pop } if
+ /a9 eq { DingbatsEncoding pop } if
+ } {
+ pop
+ } ifelse
+ } if
+ }
+ ifelse
+ true exch
+ % If this is a CIDFont, CIDFontType takes precedence
+ % over FontType.
+ dup /CIDFontType known {
+ /.buildcidfont where {
+ pop exch not exch % true => false
+ } if
+ } if
+ exch {
+ dup /FontType get //buildfontdict exch get exec
+ } {
+ .buildcidfont
+ } ifelse
+
+ DISKFONTS
+ { FontFileDirectory 2 index known
+ { dup /FontFile FontFileDirectory 4 index get .growput
+ }
+ if
+ }
+ if
+ readonly % stack: name fontdict
+ } stopped { /invalidfont signalerror } if
+} bind odef
+/definefont
+ { .completefont
+ % If the current allocation mode is global, also enter
+ % the font in LocalFontDirectory.
+ .currentglobal
+ { //systemdict /LocalFontDirectory .knownget
+ { 2 index 2 index .growput }
+ if
+ }
+ if
+ dup .FontDirectory 4 -2 roll .growput
+ % If the font originated as a resource, register it.
+ currentfile .currentresourcefile eq { dup .registerfont } if
+ } odef
+
+% Define a procedure for defining aliased fonts.
+% We use this only for explicitly aliased fonts, not substituted fonts:
+% we think this matches the observed behavior of Adobe interpreters.
+/.aliasfont % <name> <font> .aliasfont <newFont>
+ { .currentglobal 3 1 roll dup .gcheck .setglobal
+ dup length 2 add dict
+ dup 3 -1 roll { 1 index /FID eq { pop pop } { put dup } ifelse } forall
+ % Stack: global fontname newfont newfont.
+ % We might be defining a global font whose FontName
+ % is a local string. This is weird, but legal,
+ % and doesn't cause problems anywhere else:
+ % to avoid any possible problems in this case, do a cvn.
+ % We might also be defining (as an alias) a global font
+ % whose FontName is a local non-string, if someone passed a
+ % garbage value to findfont. In this case, just don't
+ % call definefont at all.
+ 2 index dup type /stringtype eq exch .gcheck or 1 index .gcheck not or
+ { /FontName 3 index dup type /stringtype eq { cvn } if put
+ % Don't bind in definefont, since Level 2 redefines it.
+ /definefont .systemvar exec
+ }
+ { .completefont pop exch pop
+ }
+ ifelse exch .setglobal
+ } odef % so findfont will bind it
+
+% Define .loadfontfile for loading a font. If we recognize Type 1 and/or
+% TrueType fonts, gs_type1.ps and/or gs_ttf.ps will redefine this.
+/.loadfontfile {
+ % According to Ed Taft, Adobe interpreters push userdict
+ % before loading a font, and pop it afterwards.
+ userdict begin
+ cvx exec
+ end
+} bind def
+/.loadfont
+ { % Some buggy fonts leave extra junk on the stack,
+ % so we have to make a closure that records the stack depth
+ % in a fail-safe way.
+ {{.loadfontfile} .execasresource} count 1 sub 2 .execn
+ count exch sub { pop } repeat
+ } bind def
+
+% Find an alternate font to substitute for an unknown one.
+% We go to some trouble to parse the font name and extract
+% properties from it. Later entries take priority over earlier.
+/.substitutefaces [
+ % Guess at suitable substitutions for random unknown fonts.
+ [(Book) /NewCenturySchlbk 0]
+ [(Grot) /Helvetica 0]
+ [(Roman) /Times 0]
+ [(Chancery) /ZapfChancery-MediumItalic 0]
+ % If the family name appears in the font name,
+ % use a font from that family.
+ [(Arial) /Helvetica 0]
+ [(Avant) /AvantGarde 0]
+ [(Bookman) /Bookman 0]
+ [(Century) /NewCenturySchlbk 0]
+ [(Cour) /Courier 0]
+ [(Frut) /Helvetica 0]
+ [(Garamond) /Palatino 0]
+ [(Geneva) /Helvetica 0]
+ [(Helv) /Helvetica 0]
+ [(NewYork) /Bookman 0]
+ [(Pala) /Palatino 0]
+ [(Schlbk) /NewCenturySchlbk 0]
+ [(Swiss) /Helvetica 0]
+ [(Symbol) /Symbol 0]
+ [(Times) /Times 0]
+ % Substitute for Adobe Multiple Master fonts.
+ [(Minion) /Times 0]
+ [(Myriad) /Helvetica 0]
+ % If the font wants to be monospace, use Courier.
+ [(Monospace) /Courier 0]
+ [(Typewriter) /Courier 0]
+ % Define substitutes for the other Adobe PostScript 3 fonts.
+ % For some of them, the substitution is pretty bad!
+ [(Albertus) /Palatino 0]
+ [(AntiqueOlive) /Helvetica 0]
+ [(Bodoni) /NewCenturySchlbk 0]
+ [(Chicago) /Helvetica 2]
+ [(Clarendon) /Bookman 0]
+ [(Cooper) /NewCenturySchlbk 0]
+ [(Copperplate) /AvantGarde 0] % inappropriate, small-cap font
+ [(Coronet) /ZapfChancery-MediumItalic 0]
+ [(Eurostile) /Helvetica 0]
+ [(Geneva) /Courier 2] % should be fixed-pitch sans demi
+ [(GillSans) /Helvetica 2]
+ [(GillSans-Light) /Helvetica 0]
+ [(Goudy) /Palatino 0]
+ [(Hoefler) /NewCenturySchlbk 0]
+ [(Joanna) /Times 0]
+ [(LetterGothic) /Courier 0] % should be fixed-pitch sans
+ [(LubalinGraph-Book) /Bookman 2]
+ [(LubalinGraph-Demi) /Bookman 0]
+ [(Marigold) /ZapfChancery-MediumItalic 0]
+ [(MonaLisa-Recut) /Palatino 0] % inappropriate
+ [(Monaco) /Courier 2] % should be fixed-pitch sans demi
+ [(Optima) /Helvetica 0]
+ [(Oxford) /ZapfChancery-MediumItalic 0]
+ [(Tekton) /Helvetica 0]
+ [(Univers) /Helvetica 0]
+] readonly def
+/.substituteproperties [
+ [(It) 9] [(Oblique) 1]
+ [(Black) 2] [(Bd) 2] [(Bold) 2] [(bold) 2] [(Demi) 2] [(Heavy) 2] [(Sb) 2]
+ [(Cn) 4] [(Cond) 4] [(Narrow) 4] [(Pkg) 4] [(Compr) 4]
+ [(Serif) 8] [(Sans) -8]
+] readonly def
+/.fontnameproperties { % <int> <string|name> .fontnameproperties
+ % <int'>
+ .fontnamestring
+ .substituteproperties {
+ 2 copy 0 get search {
+ pop pop pop dup length 1 sub 1 exch getinterval 3 -1 roll exch {
+ dup 0 ge { or } { neg not and } ifelse
+ } forall exch
+ } {
+ pop pop
+ } ifelse
+ } forall pop
+} bind def
+/.substitutefamilies mark
+ /AvantGarde
+ {/AvantGarde-Book /AvantGarde-BookOblique
+ /AvantGarde-Demi /AvantGarde-DemiOblique}
+ /Bookman
+ {/Bookman-Demi /Bookman-DemiItalic /Bookman-Light /Bookman-LightItalic}
+ /Courier
+ {/Courier /Courier-Oblique /Courier-Bold /Courier-BoldOblique}
+ /Helvetica
+ {/Helvetica /Helvetica-Oblique /Helvetica-Bold /Helvetica-BoldOblique
+ /Helvetica-Narrow /Helvetica-Narrow-Oblique
+ /Helvetica-Narrow-Bold /Helvetica-Narrow-BoldOblique}
+ /NewCenturySchlbk
+ {/NewCenturySchlbk-Roman /NewCenturySchlbk-Italic
+ /NewCenturySchlbk-Bold /NewCenturySchlbk-BoldItalic}
+ /Palatino
+ {/Palatino-Roman /Palatino-Italic /Palatino-Bold /Palatino-BoldItalic}
+ /Symbol
+ {/Symbol /Symbol /Symbol /Symbol}
+ /Times
+ {/Times-Roman /Times-Italic /Times-Bold /Times-BoldItalic}
+ /ZapfChancery-MediumItalic
+ {/ZapfChancery-MediumItalic}
+.dicttomark readonly def
+/.nametostring { % <name> .nametostring <string>
+ % <other> .nametostring <other>
+ dup type /nametype eq { .namestring } if
+} bind def
+/.fontnamestring { % <fontname> .fontnamestring <string|name>
+ dup type dup /nametype eq {
+ pop .namestring
+ } {
+ /stringtype ne { pop () } if
+ } ifelse
+} bind def
+/.substitutefontname { % <fontname> <properties> .substitutefontname
+ % <altname|null>
+ % Look for properties and/or a face name in the font name.
+ % If we find any, use Times (serif) or Helvetica (sans) as the
+ % base font; otherwise, use the default font.
+ % Note that the "substituted" font name may be the same as
+ % the requested one; the caller must check this.
+ exch .fontnamestring {
+ defaultfontname /Helvetica-Oblique /Helvetica-Bold /Helvetica-BoldOblique
+ /Helvetica-Narrow /Helvetica-Narrow-Oblique
+ /Helvetica-Narrow-Bold /Helvetica-Narrow-BoldOblique
+ /Times-Roman /Times-Italic /Times-Bold /Times-BoldItalic
+ /Helvetica-Narrow /Helvetica-Narrow-Oblique
+ /Helvetica-Narrow-Bold /Helvetica-Narrow-BoldOblique
+ } 3 1 roll
+ % Stack: facelist properties fontname
+ % Look for a face name.
+ .substitutefaces {
+ 2 copy 0 get search {
+ pop pop pop
+ % Stack: facelist properties fontname [(pattern) family properties]
+ dup 2 get 4 -1 roll or 3 1 roll
+ 1 get .substitutefamilies exch get
+ 4 -1 roll pop 3 1 roll
+ } {
+ pop pop
+ } ifelse
+ } forall pop
+ 1 index length mod get exec
+} bind def
+/.substitutefont { % <fontname> .substitutefont <altname>
+ dup 0 exch .fontnameproperties .substitutefontname
+ % Only accept fonts known in the Fontmap.
+ Fontmap 1 index known not { pop defaultfontname } if
+} bind def
+
+% If requested, make (and recognize) fake entries in FontDirectory for fonts
+% present in Fontmap but not actually loaded. Thanks to Ray Johnston for
+% the idea behind this code.
+FAKEFONTS not { (%END FAKEFONTS) .skipeof } if
+
+% We use the presence or absence of the FontMatrix key to indicate whether
+% a font is real or fake. We must pop the arguments at the very end,
+% so that stack protection will be effective.
+
+/definefont { % <name> <font> definefont <font>
+ dup /FontMatrix known {
+ //definefont
+ } {
+ 2 copy /FontName get findfont //definefont exch pop exch pop
+ } ifelse
+} bind odef
+
+/scalefont { % <font> <scale> scalefont <font>
+ 1 index /FontMatrix known {
+ //scalefont
+ } {
+ 1 index /FontName get findfont 1 index //scalefont
+ exch pop exch pop
+ } ifelse
+} bind odef
+
+/makefont { % <font> <matrix> makefont <font>
+ 1 index /FontMatrix known {
+ //makefont
+ } {
+ 1 index /FontName get findfont 1 index //makefont
+ exch pop exch pop
+ } ifelse
+} bind odef
+
+/setfont { % <font> setfont -
+ dup /FontMatrix known {
+ //setfont
+ } {
+ dup /FontName get findfont //setfont pop
+ } ifelse
+} bind odef
+
+%END FAKEFONTS
+
+% Define findfont so it tries to load a font if it's not found.
+% The Red Book requires that findfont be a procedure, not an operator,
+% but it still needs to restore the stacks reliably if it fails,
+% so we do all the work in an operator.
+/.findfont {
+ mark 1 index
+ //systemdict begin .dofindfont
+ % Define any needed aliases.
+ counttomark 1 sub { .aliasfont } repeat end
+ exch pop exch pop
+} odef
+/findfont {
+ .findfont
+} bind def
+% Check whether the font name we are about to look for is already on the list
+% of aliases we're accumulating; if so, cause an error.
+/.checkalias % -mark- <alias1> ... <name> .checkalias <<same>>
+ { counttomark 1 sub -1 1
+ { index 1 index eq
+ { pop QUIET not
+ { (Unable to substitute for font.) = flush
+ } if
+ /findfont cvx /invalidfont signalerror
+ }
+ if
+ }
+ for
+ } bind def
+% Get a (non-fake) font if present in a FontDirectory.
+/.fontknownget % <fontdir> <fontname> .fontknownget <font> true
+ % <fontdir> <fontname> .fontknownget false
+ { .knownget
+ { FAKEFONTS
+ { dup /FontMatrix known { true } { pop false } ifelse }
+ { true }
+ ifelse
+ }
+ { false
+ }
+ ifelse
+ } bind def
+% This is the standard procedure for handling font substitution.
+% Its location is per an Adobe newsgroup posting.
+% It is called with the font name on the stack, standing in for findfont.
+/.stdsubstfont { % mark <alias1> ... <fontname> .stdsubstfont <font>
+ /SUBSTFONT where {
+ pop QUIET not {
+ (Substituting for font ) print dup =only
+ (.) = flush
+ } if
+ % No aliasing.
+ cleartomark mark defaultfontname
+ } {
+ dup .substitutefont
+ 2 copy eq { pop defaultfontname } if
+ .checkalias
+ QUIET not {
+ SHORTERRORS {
+ (%%[) print 1 index =only
+ ( not found, substituting ) print dup =only (]%%)
+ } {
+ (Substituting font ) print dup =only
+ ( for ) print 1 index =only (.)
+ } ifelse = flush
+ } if
+ % Remove all the accumulated aliases.
+ counttomark 1 add 1 roll cleartomark mark exch
+ } ifelse
+ .dofindfont
+} bind def
+$error /SubstituteFont { .stdsubstfont } put
+% Scan the next directory on FONTPATH.
+/.scannextfontdir { % - .scannextfontdir <bool>
+ % If we haven't scanned all the directories in
+ % FONTPATH, scan the next one.
+ null 0 1 FONTPATH length 1 sub {
+ FONTPATH 1 index get null ne { exch pop exit } if pop
+ } for dup null ne {
+ dup 0 eq { .scanfontbegin } if
+ FONTPATH 1 index get .scanfontdir
+ FONTPATH exch null put true
+ } {
+ pop false
+ } ifelse
+} bind def
+% Do the work of findfont, including substitution, defaulting, and
+% scanning of FONTPATH.
+/.dofindfont { % <fontname> .dofindfont <font>
+ .tryfindfont not {
+ % We didn't find the font. If we haven't scanned
+ % all the directories in FONTPATH, scan the next one
+ % now and look for the font again.
+ .scannextfontdir {
+ % Start over with an empty alias list.
+ counttomark 1 sub { pop } repeat
+ .dofindfont
+ } {
+ % No luck. Make sure we're not already
+ % looking for the default font.
+ dup defaultfontname eq {
+ QUIET not {
+ (Unable to load default font ) print
+ dup =only (! Giving up.) = flush
+ } if
+ /findfont cvx /invalidfont signalerror
+ } if
+ % Substitute for the font. Don't alias.
+ $error /SubstituteFont get exec
+ } ifelse
+ } if
+} bind def
+% Try to find a font using only the present contents of Fontmap.
+/.tryfindfont { % <fontname> .tryfindfont <font> true
+ % <fontname> .tryfindfont false
+ .FontDirectory 1 index .fontknownget
+ { % Already loaded
+ exch pop true
+ }
+ { dup Fontmap exch .knownget not
+ { % Unknown font name. Look for a file with the
+ % same name as the requested font.
+ .tryloadfont
+ }
+ { % Try each element of the Fontmap in turn.
+ false exch % (in case we exhaust the list)
+ % Stack: fontname false fontmaplist
+ { exch pop
+ dup type /nametype eq
+ { % Font alias
+ .checkalias .tryfindfont exit
+ }
+ { dup dup type dup /arraytype eq exch /packedarraytype eq or exch xcheck and
+ { % Font with a procedural definition
+ exec % The procedure will load the font.
+ % Check to make sure this really happened.
+ .FontDirectory 1 index .knownget
+ { exch pop true exit }
+ if
+ }
+ { % Font file name
+ .loadfontloop { true exit } if
+ }
+ ifelse
+ }
+ ifelse false
+ }
+ forall
+ % Stack: font true -or- fontname false
+ { true
+ }
+ { % None of the Fontmap entries worked.
+ % Try loading a file with the same name
+ % as the requested font.
+ .tryloadfont
+ }
+ ifelse
+ }
+ ifelse
+ }
+ ifelse
+ } bind def
+
+% Attempt to load a font from a file.
+/.tryloadfont { % <fontname> .tryloadfont <font> true
+ % <fontname> .tryloadfont false
+ dup .nametostring
+ % Hack: check for the presence of the resource machinery.
+ /.genericrfn where {
+ pop
+ 2 copy .fonttempstring /FontResourceDir getsystemparam .genericrfn
+ .loadfontloop {
+ exch pop exch pop true
+ } {
+ dup .nametostring .loadfontloop
+ } ifelse
+ } {
+ .loadfontloop
+ } ifelse
+} bind def
+/.loadfontloop { % <fontname> <filename> .loadfontloop
+ % <font> true
+ % -or-
+ % <fontname> false
+ % See above regarding the use of 'loop'.
+ { % Is the font name a string?
+ dup type /stringtype ne
+ { QUIET not
+ { (Can't find font with non-string name: ) print dup =only (.) = flush
+ }
+ if pop false exit
+ }
+ if
+ % Can we open the file?
+ findlibfile not
+ { QUIET not
+ { (Can't find \(or can't open\) font file ) print dup print
+ (.) = flush
+ }
+ if pop false exit
+ }
+ if
+
+ % Stack: fontname fontfilename fontfile
+ DISKFONTS
+ { .currentglobal true .setglobal
+ 2 index (r) file
+ FontFileDirectory exch 5 index exch .growput
+ .setglobal
+ }
+ if
+ QUIET not
+ { (Loading ) print 2 index =only
+ ( font from ) print 1 index print (... ) print flush
+ }
+ if
+ % If LOCALFONTS isn't set, load the font into local or global
+ % VM according to FontType; if LOCALFONTS is set, load the font
+ % into the current VM, which is what Adobe printers (but not
+ % DPS or CPSI) do.
+ LOCALFONTS { false } { /setglobal where } ifelse
+ { pop /FontType .findfontvalue { 1 eq } { false } ifelse
+ % .setglobal, like setglobal, aliases FontDirectory to
+ % GlobalFontDirectory if appropriate. However, we mustn't
+ % allow the current version of .setglobal to be bound in,
+ % because it's different depending on language level.
+ .currentglobal exch /.setglobal .systemvar exec
+ % Remove the fake definition, if any.
+ .FontDirectory 3 index .undef
+ 1 index (r) file .loadfont .FontDirectory exch
+ /.setglobal .systemvar exec
+ }
+ { .loadfont .FontDirectory
+ }
+ ifelse
+ % Stack: fontname fontfilename fontdirectory
+ QUIET not
+ { //systemdict /level2dict known
+ { .currentglobal false .setglobal vmstatus
+ true .setglobal vmstatus 3 -1 roll pop
+ 6 -1 roll .setglobal 5
+ }
+ { vmstatus 3
+ }
+ ifelse { =only ( ) print } repeat
+ (done.) = flush
+ } if
+
+ % Check to make sure the font was actually loaded.
+ dup 3 index .fontknownget
+ { 4 1 roll pop pop pop true exit } if
+
+ % Maybe the file had a different FontName.
+ % See if we can get a FontName from the file, and if so,
+ % whether a font by that name exists now.
+ exch (r) file .findfontname
+ { 2 copy .fontknownget
+ { % Yes. Stack: origfontname fontdirectory filefontname fontdict
+ 3 -1 roll pop exch
+ QUIET
+ { pop
+ }
+ { (Using ) print =only
+ ( font for ) print 1 index =only
+ (.) = flush
+ }
+ ifelse true exit
+ }
+ if pop
+ }
+ if pop
+
+ % The font definitely did not load correctly.
+ QUIET not
+ { (Loading ) print dup =only
+ ( font failed.) = flush
+ } if
+ false exit
+
+ } loop % end of loop
+
+ } bind def
+
+% Define a procedure to load all known fonts.
+% This isn't likely to be very useful.
+/loadallfonts
+ { Fontmap { pop findfont pop } forall
+ } bind def
+
+% If requested, load all the fonts defined in the Fontmap into FontDirectory
+% as "fake" fonts i.e., font dicts with only FontName and FontType defined.
+% (We define FontType only for the sake of some questionable code in the
+% Apple Printer Utility 2.0 font inquiry code.)
+%
+% Note that this procedure only creates fake fonts in the FontDirectory
+% associated with the current VM. This is because in multi-context systems,
+% creating the fake fonts in local VM leads to undesirable complications.
+/.definefakefonts
+ {
+ }
+ {
+ (gs_fonts FAKEFONTS) VMDEBUG
+ Fontmap {
+ pop dup type /stringtype eq { cvn } if
+ .FontDirectory 1 index known not {
+ 2 dict dup /FontName 3 index put
+ dup /FontType 1 put
+ .FontDirectory 3 1 roll put
+ } {
+ pop
+ } ifelse
+ } forall
+ }
+FAKEFONTS { exch } if pop def % don't bind, .current/setglobal get redefined
+
+% Install initial fonts from Fontmap.
+/.loadinitialfonts
+ { NOFONTMAP not
+ { /FONTMAP where
+ { pop [ FONTMAP .pathlist ]
+ { dup VMDEBUG findlibfile
+ { exch pop .loadFontmap }
+ { /undefinedfilename signalerror }
+ ifelse
+ }
+ }
+ { LIBPATH
+ { defaultfontmap 1 index .filenamedirseparator
+ exch concatstrings concatstrings dup VMDEBUG
+ (r) { file } .internalstopped
+ { pop pop } { .loadFontmap } ifelse
+ }
+ }
+ ifelse forall
+ }
+ if
+ .definefakefonts % current VM is global
+ } def % don't bind, .current/setglobal get redefined
+
+% ---------------- Synthetic font support ---------------- %
+
+% Create a new font by modifying an existing one. paramdict contains
+% entries with the same keys as the ones found in a Type 1 font;
+% it should also contain enough empty entries to allow adding the
+% corresponding non-overridden entries from the original font dictionary,
+% including FID. If paramdict includes a FontInfo entry, this will
+% also override the original font's FontInfo, entry by entry;
+% again, it must contain enough empty entries.
+
+% Note that this procedure does not perform a definefont.
+
+/.makemodifiedfont % <fontdict> <paramdict> .makemodifiedfont <fontdict'>
+ { exch
+ { % Stack: destdict key value
+ 1 index /FID ne
+ { 2 index 2 index known
+ { % Skip fontdict entry supplied in paramdict, but
+ % handle FontInfo specially.
+ 1 index /FontInfo eq
+ { 2 index 2 index get % new FontInfo
+ 1 index % old FontInfo
+ { % Stack: destdict key value destinfo key value
+ 2 index 2 index known
+ { pop pop }
+ { 2 index 3 1 roll put }
+ ifelse
+ }
+ forall pop
+ }
+ if
+ }
+ { % No override, copy the fontdict entry.
+ 2 index 3 1 roll put
+ dup dup % to match pop pop below
+ }
+ ifelse
+ }
+ if
+ pop pop
+ } forall
+ } bind def
+
+% Make a modified font and define it. Note that unlike definefont,
+% this does not leave the font on the operand stack.
+
+/.definemodifiedfont % <fontdict> <paramdict> .definemodifiedfont -
+ { .makemodifiedfont
+ dup /FontName get exch definefont pop
+ } bind def
diff --git a/Master/xemtex/gslib/gs_frsd.ps b/Master/xemtex/gslib/gs_frsd.ps
new file mode 100644
index 00000000000..10593579bf3
--- /dev/null
+++ b/Master/xemtex/gslib/gs_frsd.ps
@@ -0,0 +1,83 @@
+% Copyright (C) 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_frsd.ps,v 1.4.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Implementation of ReusableStreamDecode filter.
+% This file must be loaded after gs_lev2.ps and gs_res.ps.
+
+level2dict begin
+
+% ------ ReusableStreamDecode filter ------ %
+
+/.reusablestreamdecode { % <source> <dict> .reusablestreamdecode <file>
+ % <source> .reusablestreamdecode <file>
+ % Collect the filter parameters.
+ dup type /dicttype eq { 2 copy } { dup 0 dict } ifelse
+ dup .rsdparams
+ % Construct the filter pipeline.
+ % The very first filter should use the value of CloseSource
+ % from the RSD dictionary; all the others should have
+ % CloseSource = true.
+ % Stack: source dict filters parms
+ 2 index /CloseSource .knownget not { false } if 5 -1 roll
+ % Stack: dict filters parms CloseSource source
+ 0 1 5 index length 1 sub {
+ 4 index 1 index get
+ % Stack: dict filters parms CloseSource source index filtname
+ 4 index null eq {
+ 0 dict
+ } {
+ 4 index 2 index get dup null eq { pop } if
+ } ifelse
+ 3 -1 roll pop exch filter
+ exch pop true exch % set CloseSource for further filters
+ } for
+ % If AsyncRead is true, try to create the filter directly.
+ % Stack: dict filters parms CloseSource source
+ 4 index /AsyncRead .knownget not { false } if {
+ 1 index { .reusablestream } .internalstopped
+ } {
+ null true
+ } ifelse {
+ pop
+ % No luck. Read the entire contents of the stream now.
+ dup type /filetype ne {
+ % Make a stream from a procedure or string data source.
+ 0 () .subfiledecode
+ } if
+ 10 dict exch {
+ % Stack: dict filters parms CloseSource contdict file
+ dup 1000 string readstring
+ 3 index dup length 4 -1 roll put not { exit } if
+ } loop pop
+ % Concatenate the contents into one big string.
+ % Stack: dict filters parms CloseSource contdict
+ 0 1 index { length exch pop add } forall
+ .bigstring exch {
+ % Stack: dict filters parms CloseSource string index substring
+ exch 1000 mul exch 2 index 3 1 roll putinterval
+ } forall
+ % Now create the stream on the string.
+ 1 index .reusablestream
+ } if
+ % We created the stream successfully: clean up.
+ 4 { exch pop } repeat
+ 1 index type /dicttype eq { exch pop } if exch pop
+} odef
+
+filterdict /ReusableStreamDecode /.reusablestreamdecode load put
+
+end % level2dict
diff --git a/Master/xemtex/gslib/gs_icc.ps b/Master/xemtex/gslib/gs_icc.ps
new file mode 100644
index 00000000000..323462342f1
--- /dev/null
+++ b/Master/xemtex/gslib/gs_icc.ps
@@ -0,0 +1,115 @@
+% Copyright (C) 2001 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_icc.ps,v 1.2.2.1.2.1 2003/04/12 14:02:38 giles Exp $
+% PostScript portion of ICCBased color space support
+
+//userdict /.icc_comp_map_dict
+ << 1 /DeviceGray 3 /DeviceRGB 4 /DeviceCMYK >>
+put
+
+colorspacedict /ICCBased
+ {
+ % Verify that the source object is an array, that it is at least of length
+ % two, and that the second entry is a readable dictionary. If we got this
+ % far, we know the top-level object exists and is readable, but it might
+ % be a dictionary.
+ dup type dup /arraytype ne exch /packedarraytype ne and
+ { /setcolorspace /typecheck signalerror }
+ if
+ dup length 2 lt
+ { /setcolorspace /rangecheck signalerror }
+ if
+ dup 1 get type /dicttype ne
+ { /setcolorspace /typecheck signalerror }
+ if
+ dup 1 get rcheck not
+ { /setcolorspace /invalidaccess signalerror }
+ if
+
+ % Verify that the dictionary defines the key N (number of components) and
+ % entry is provided and has a legitimate value
+ dup 1 get /N .knownget
+ {
+ //.icc_comp_map_dict exch known not
+ {
+ % generate the appropriate error
+ /setcolorspace
+ 1 index 1 get /N type type /integertype ne
+ { /typecheck }
+ { /rangecheck }
+ ifelse
+ signalerror
+ }
+ if
+ }
+ { /setcolorspace /undefined signalerror }
+ ifelse
+
+ % Verify DataSrouce and, if it is a string, convert it to a file
+ dup 1 get /DataSource .knownget
+ {
+ dup rcheck not
+ { pop /setcolorspace /invalidaccess signalerror }
+ if
+ type dup /stringtype eq
+ {
+ pop
+ 2 array copy
+ dup 1
+ 2 copy get dup length dict copy
+ dup /DataSource
+ 2 copy get /ReusableStreamDecode filter
+ put
+ put
+ }
+ {
+ /filetype ne
+ { /setcolorspace /typecheck signalerror }
+ if
+ }
+ ifelse
+ }
+ { /setcolorspace /undefined signalerror }
+ ifelse
+
+ % set the alternate color space to be the current color space
+ dup 1 get /Alternate .knownget not
+ { dup 1 get /N get //.icc_comp_map_dict exch get }
+ if
+ setcolorspace
+
+ % if CIE spaces are not use, just take the alternate space
+ NOCIE
+ { pop //null }
+ { % check for native support
+ /.seticcspace where
+ { pop dup 1 get
+ % Acrobat Reader silently ignores errors with ICC profiles
+ % and uses the alternate color space -- do the same.
+ mark exch { .seticcspace } stopped
+ { cleartomark pop //null }
+ { pop }
+ ifelse
+ }
+ { pop //null }
+ ifelse
+ }
+ ifelse
+ }
+bind put
+
+//userdict /.icc_comp_map_dict undef
diff --git a/Master/xemtex/gslib/gs_il1_e.ps b/Master/xemtex/gslib/gs_il1_e.ps
new file mode 100644
index 00000000000..5557cc5bdef
--- /dev/null
+++ b/Master/xemtex/gslib/gs_il1_e.ps
@@ -0,0 +1,67 @@
+% Copyright (C) 1993, 1994, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_il1_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Define the ISO Latin-1 encoding vector.
+% The first half is the same as the standard encoding,
+% except for minus instead of hyphen at code 055.
+/ISOLatin1Encoding
+StandardEncoding 0 45 getinterval aload pop
+ /minus
+StandardEncoding 46 82 getinterval aload pop
+% NOTE: the following are missing in the Adobe documentation,
+% but appear in the displayed table:
+% macron at 0225, dieresis at 0230, cedilla at 0233, space at 0240.
+% This is an error in the Red Book, corrected in Adobe TN 5085.
+% \20x
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent
+ /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron
+% \24x
+ /space /exclamdown /cent /sterling
+ /currency /yen /brokenbar /section
+ /dieresis /copyright /ordfeminine /guillemotleft
+ /logicalnot /hyphen /registered /macron
+ /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
+% \34x
+ /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
+% Make an array on large systems, a packed array on small ones.
+256
+vmstatus exch pop exch pop
+100000 ge { array astore readonly } { packedarray } ifelse
+def
+1 ISOLatin1Encoding .registerencoding
+/ISOLatin1Encoding ISOLatin1Encoding .defineencoding
diff --git a/Master/xemtex/gslib/gs_il2_e.ps b/Master/xemtex/gslib/gs_il2_e.ps
new file mode 100644
index 00000000000..bbfcfbb1496
--- /dev/null
+++ b/Master/xemtex/gslib/gs_il2_e.ps
@@ -0,0 +1,64 @@
+% Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_il2_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/gs_init.ps b/Master/xemtex/gslib/gs_init.ps
new file mode 100644
index 00000000000..b8938dd0750
--- /dev/null
+++ b/Master/xemtex/gslib/gs_init.ps
@@ -0,0 +1,1885 @@
+% (C) 1989, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_init.ps,v 1.40.2.12.2.3 2003/04/12 14:02:38 giles Exp $
+% Initialization file for the interpreter.
+% When this is run, systemdict is still writable.
+
+% Comment lines of the form
+% %% Replace <n> <file(s)>
+% indicate places where the next <n> lines should be replaced by
+% the contents of <file(s)>, when creating a single merged init file.
+
+% The interpreter can call out to PostScript code. All procedures
+% called in this way, and no other procedures defined in these
+% initialization files, have names that begin with %, e.g.,
+% (%Type1BuildChar) cvn.
+
+% Check the interpreter revision. NOTE: the interpreter code requires
+% that the first non-comment token in this file be an integer.
+707
+dup revision ne
+ { (gs: Interpreter revision \() print revision 10 string cvs print
+ (\) does not match gs_init.ps revision \() print 10 string cvs print
+ (\).\n) print flush null 1 .quit
+ }
+if pop
+
+% Acquire userdict, and set its length if necessary.
+/userdict where
+ { pop userdict maxlength 0 eq }
+ { true }
+ifelse
+systemdict exch
+ { % userdict wasn't already set up by iinit.c.
+ dup /userdict
+ currentdict dup 200 .setmaxlength % userdict
+ .forceput % userdict is local, systemdict is global
+ }
+if begin
+
+% Define dummy local/global operators if needed.
+systemdict /.setglobal known
+ { true .setglobal
+ }
+ { /.setglobal { pop } bind def
+ /.currentglobal { false } bind def
+ /.gcheck { pop false } bind def
+ }
+ifelse
+
+% Define .languagelevel if needed.
+systemdict /.languagelevel known not { /.languagelevel 1 def } if
+
+% Optionally choose a default paper size other than U.S. letter.
+% (a4) /PAPERSIZE where { pop pop } { /PAPERSIZE exch def } ifelse
+
+% Turn on array packing for the rest of initialization.
+true setpacking
+
+% Define the old MS-DOS EOF character as a no-op.
+% This is a hack to get around the absurd habit of MS-DOS editors
+% of adding an EOF character at the end of the file.
+<1a> cvn { } def
+
+% Acquire the debugging flags.
+currentdict /DEBUG known /DEBUG exch def
+ /VMDEBUG
+ DEBUG {{print mark
+ systemdict /level2dict known
+ { .currentglobal dup false .setglobal vmstatus
+ true .setglobal vmstatus 3 -1 roll pop
+ 6 -2 roll pop .setglobal
+ }
+ { vmstatus 3 -1 roll pop
+ }
+ ifelse usertime 16#fffff and counttomark
+ { ( ) print ( ) cvs print }
+ repeat pop
+ ( ) print systemdict length ( ) cvs print
+ ( ) print countdictstack ( ) cvs print
+ ( <) print count ( ) cvs print (>\n) print flush
+ }}
+ {{pop
+ }}
+ ifelse
+ def
+
+currentdict /BATCH known /BATCH exch def
+currentdict /DELAYBIND known /DELAYBIND exch def
+currentdict /DISKFONTS known /DISKFONTS exch def
+currentdict /DOINTERPOLATE .knownget { /INTERPOLATE exch def } if
+currentdict /ESTACKPRINT known /ESTACKPRINT exch def
+currentdict /FAKEFONTS known /FAKEFONTS exch def
+currentdict /FIXEDMEDIA known /FIXEDMEDIA exch def
+currentdict /FIXEDRESOLUTION known /FIXEDRESOLUTION exch def
+currentdict /LOCALFONTS known /LOCALFONTS exch def
+currentdict /NOBIND known /NOBIND exch def
+/.bind /bind load def
+NOBIND { /bind { } def } if
+currentdict /NOCACHE known /NOCACHE exch def
+currentdict /NOCCFONTS known /NOCCFONTS exch def
+currentdict /NOCIE known /NOCIE exch def
+currentdict /NODISPLAY known not /DISPLAYING exch def
+currentdict /NOFONTMAP known /NOFONTMAP exch def
+currentdict /NOCIDFONTMAP known /NOCIDFONTMAP exch def
+currentdict /NOFONTPATH known /NOFONTPATH exch def
+currentdict /NOGC known /NOGC exch def
+currentdict /NOINTERPOLATE .knownget { /INTERPOLATE exch not def } if
+currentdict /NOPAGEPROMPT known /NOPAGEPROMPT exch def
+currentdict /NOPAUSE known /NOPAUSE exch def
+currentdict /NOPLATFONTS known /NOPLATFONTS exch def
+currentdict /NOPROMPT known /NOPROMPT exch def
+% The default value of ORIENT1 is true, not false.
+currentdict /ORIENT1 known not { /ORIENT1 true def } if
+currentdict /OSTACKPRINT known /OSTACKPRINT exch def
+currentdict /OUTPUTFILE known % obsolete
+ { /OutputFile /OUTPUTFILE load def
+ currentdict /OUTPUTFILE .undef
+ } if
+currentdict /QUIET known /QUIET exch def
+% DELAYSAFER is effectively the same as newer NOSAFER
+currentdict /DELAYSAFER known { /DELAYSAFER true def /NOSAFER true def } if
+currentdict /PARANOIDSAFER known /PARANOIDSAFER exch def
+/SAFER currentdict /NOSAFER known {
+ false
+} {
+ currentdict /SAFER known PARANOIDSAFER or
+}
+ifelse def
+currentdict /SHORTERRORS known /SHORTERRORS exch def
+currentdict /STRICT known /STRICT exch def
+currentdict /TTYPAUSE known /TTYPAUSE exch def
+currentdict /WRITESYSTEMDICT known /WRITESYSTEMDICT exch def
+
+% Acquire environment variables.
+currentdict /DEVICE known not
+ { (GS_DEVICE) getenv { /DEVICE exch def } if } if
+
+(START) VMDEBUG
+
+% Open the standard files, so they will be open at the outermost save level.
+(%stdin) (r) file pop
+(%stdout) (w) file pop
+(%stderr) (w) file pop
+
+/.currentuserparams where {
+ pop mark
+ % The Adobe implementations appear to have very large maximum
+ % stack sizes. This turns out to actually make a difference,
+ % since some badly-behaved files include extremely long procedures,
+ % or construct huge arrays on the operand stack.
+ % We reset the stack sizes now so that we don't have to worry
+ % about overflowing the (rather small) built-in stack sizes
+ % during initialization.
+ /MaxDictStack 500
+ /MaxExecStack 5000
+ /MaxOpStack 50000
+ .dicttomark .setuserparams
+} if
+
+% Define a procedure for skipping over an unneeded section of code.
+% This avoids allocating space for the skipped procedures.
+% We can't use readline, because that imposes a line length limit.
+/.skipeof % <string> .skipeof -
+ { currentfile exch 1 exch .subfiledecode flushfile
+ } .bind def
+
+% Define procedures to assist users who don't read the documentation.
+userdict begin
+/help
+ { (Enter PostScript commands. '(filename) run' runs a file, 'quit' exits.\n)
+ print flush
+ } .bind def
+end
+
+% Define =string, which is used by some PostScript programs even though
+% it isn't documented anywhere.
+% Put it in userdict so that each context can have its own copy.
+userdict /=string 256 string put
+
+% Print the greeting.
+
+/printgreeting
+ { mark
+ product (Ghostscript) search
+ { pop pop pop
+ (This software comes with NO WARRANTY: see the file PUBLIC for details.\n)
+ }
+ { pop
+ }
+ ifelse
+ (\n) copyright
+ (\)\n) revisiondate 10 mod revisiondate 10 idiv 10 mod (-)
+ revisiondate 100 idiv 10 mod revisiondate 1000 idiv 10 mod (-)
+ revisiondate 10000 idiv ( \()
+ revision 10 mod
+ revision 100 mod 10 idiv (.)
+ revision 100 idiv ( )
+ product
+ counttomark
+ { (%stdout) (w) file exch 0 .writecvp
+ } repeat pop
+ } .bind def
+
+QUIET not { printgreeting flush } if
+
+% Define a special version of def for making operator procedures.
+/obind { % <name> <proc> obind <name> <oper>
+ 1 index exch .makeoperator
+} .bind def
+/odef { % <name> <proc> odef -
+ 1 index exch .makeoperator def
+} .bind def
+
+% Define a special version of def for storing local objects into global
+% dictionaries. Like .forceput, this exists only during initialization.
+/.forcedef { % <key> <value> .forcedef -
+ currentdict 3 1 roll .forceput
+} .bind odef
+
+% Define procedures for accessing variables in systemdict and userdict
+% regardless of the contents of the dictionary stack.
+/.systemvar { % <name> .systemvar <value>
+ //systemdict exch get
+} .bind odef
+/.userdict { % - .userdict <dict>
+ /userdict .systemvar
+} .bind odef
+/.uservar { % <name> .uservar <value>
+ .userdict exch get
+} .bind odef
+
+% If we're delaying binding, remember everything that needs to be bound later.
+DELAYBIND NOBIND not and
+ { .currentglobal false .setglobal
+ systemdict /.delaybind 1500 array .forceput
+ .setglobal
+ userdict /.delaycount 0 put
+ % When we've done the delayed bind, we want to stop saving.
+ % Detect this by the disappearance of .delaybind.
+ /bind
+ { /.delaybind .systemvar dup length 0 ne
+ { .delaycount 2 index put
+ .userdict /.delaycount .delaycount 1 add put
+ }
+ { pop .bind
+ }
+ ifelse
+ } .bind def
+ } if
+
+%**************** BACKWARD COMPATIBILITY ****************
+/hwsizedict mark /HWSize null .dicttomark readonly def
+/copyscanlines { % <device> <y> <string> copyscanlines <substr>
+ 0 3 1 roll 3 index //hwsizedict .getdeviceparams
+ exch pop exch pop aload pop 3 2 roll
+ 0 exch null exch .getbitsrect exch pop
+} bind odef
+currentdict /hwsizedict .undef
+/getdeviceprops
+ { null .getdeviceparams
+ } bind odef
+/.putdeviceprops
+ { null true counttomark 1 add 3 roll .putdeviceparams
+ dup type /booleantype ne
+ { dup mark eq { /unknown /rangecheck } if
+ counttomark 4 add 1 roll cleartomark pop pop pop
+ /.putdeviceprops load exch signalerror
+ }
+ if
+ } bind odef
+/.currentfilladjust { .currentfilladjust2 pop } bind odef
+/.setfilladjust { dup .setfilladjust2 } bind odef
+/.writecvs { 0 .writecvp } bind odef
+%**************** DEPRECATED PROCEDURES ****************
+%**************** DO NOT USE THESE IN NEW CODE ****************
+/max { .max } bind def % use .max instead
+/min { .min } bind def % use .min instead
+/unread /.unread load def % use .peekstring instead
+%**************** END OF BACKWARD COMPATIBILITY SECTION ****************
+
+% Define predefined procedures substituting for operators,
+% in alphabetical order.
+
+userdict /#copies 1 put
+% Adobe implementations don't accept /[ or /], so we don't either.
+([) cvn
+ /mark load def
+(]) cvn
+ {counttomark array astore exch pop} odef
+% .beginpage is redefined if setpagedevice is present.
+/.beginpage { } odef
+% In LanguageLevel 3, copypage erases the page.
+/copypage {
+ .languagelevel 3 ge
+ dup { 0 } { 1 } ifelse .endpage {
+ .currentnumcopies 1 index .outputpage
+ (>>copypage, press <return> to continue<<\n) .confirm
+ dup { erasepage } if
+ } if pop .beginpage
+} odef
+/currentmatrix {
+ .currentmatrix 6 index astore pop
+} odef
+% .currentnumcopies is redefined in Level 2.
+/.currentnumcopies { #copies } odef
+/setcolorscreen where { pop % not in all Level 1 configurations
+ /currentcolorscreen
+ { .currenthalftone
+ { { 60 exch 0 exch 3 copy 6 copy } % halftone - not possible
+ { 3 copy 6 copy } % screen
+ { } % colorscreen
+ }
+ exch get exec
+ } odef
+} if
+/currentscreen
+ { .currenthalftone
+ { { 60 exch 0 exch } % halftone - not possible
+ { } % screen
+ { 12 3 roll 9 { pop } repeat } % colorscreen
+ }
+ exch get exec
+ } odef
+/.echo /echo load def
+userdict /.echo.mode true put
+/echo {dup /.echo.mode exch store .echo} odef
+/eexec {
+ % Rebind .currentresourcefile if it is the source for the eexec.
+ dup 55665 //filterdict /eexecDecode get exec
+ cvx exch .currentresourcefile eq
+ //systemdict begin { {exec} .execasresource } { exec } ifelse
+ % Only pop systemdict if it is still the top element,
+ % because this is apparently what Adobe interpreters do.
+ currentdict //systemdict eq { end } if
+} odef
+% .endpage is redefined if setpagedevice is present.
+/.endpage { 2 ne } odef
+% erasepage mustn't use gsave/grestore, because we call it before
+% the graphics state stack has been fully initialized.
+/erasepage
+ { /currentcolor where
+ { pop currentcolor currentcolorspace { setcolorspace setcolor } }
+ { /currentcmykcolor where
+ { pop currentcmykcolor { setcmykcolor } }
+ { currentrgbcolor { setrgbcolor } }
+ ifelse
+ }
+ ifelse 1 setgray .fillpage exec
+ } odef
+% To satisfy the Genoa FTS, executive must be a procedure, not an operator.
+/executive
+ { { prompt
+ { (%statementedit) (r) file } stopped
+ { pop pop $error /errorname get /undefinedfilename eq
+ { .clearerror exit } if % EOF
+ handleerror null % ioerror??
+ }
+ if
+ cvx { .runexec } execute
+ } loop
+ } bind def
+/filter
+ { //filterdict 1 index .knownget
+ { exch pop exec }
+ { /filter load /undefined signalerror }
+ ifelse
+ } odef
+/handleerror
+ { /errordict .systemvar /handleerror get exec } bind def
+/identmatrix [1.0 0.0 0.0 1.0 0.0 0.0] readonly def
+/identmatrix
+ { dup 0 //identmatrix putinterval } odef
+/languagelevel 1 def % gs_lev2.ps may change this
+/makeimagedevice { false makewordimagedevice } odef
+/matrix { 6 array identmatrix } odef
+/pathbbox
+ { false .pathbbox
+ } odef
+% .promptmsg is redefined if the interpreter includes readline support.
+/.promptmsg {
+ (GS) print
+ count 0 ne { (<) print count =only } if
+ (>) print flush
+} bind def
+/prompt { flush flushpage NOPROMPT not { .promptmsg } if } bind def
+/pstack { 0 1 count 3 sub { index == } for } bind def
+/putdeviceprops
+ { .putdeviceprops { erasepage } if } odef
+/quit { /quit load 0 .quit } odef
+/run { dup type /filetype ne { (r) file } if
+ % We must close the file when execution terminates,
+ % regardless of the state of the stack,
+ % and then propagate an error, if any.
+ cvx .runexec
+ } odef
+% Execute a file.
+% Level 2 uses 2 .stop to clear the e-stack for a successful startjob:
+% we detect that here, since we need to handle this even if we start out
+% without job control in effect.
+%
+% What we push on the e-stack is the following to be executed in this order:
+% <lit-file|fileproc> .runexec1 <lit-file|fileproc> .runexec2
+/.runexec1 { % <file|fileproc> .runexec1 -
+ dup type /filetype ne { cvx exec } if
+ cvx null 2 .stopped
+ % If we got back here from a startjob, just keep going.
+ % startjob replaces the null on the o-stack with a procedure
+ % to be executed when we get back here.
+ dup null ne { exec true } { pop false } ifelse
+} bind def
+/.runexec2 { % <continue> <file|fileproc> .runexec2 -
+ exch {
+ .runexec
+ } {
+ dup type /filetype ne { cvx exec } if
+ closefile
+ } ifelse
+} bind def
+/.runexec { % <file|fileproc> .runexec -
+ cvlit /.runexec1 cvx 1 index /.runexec2 cvx 4 .execn
+} bind def
+% The following is only for compatibility with Adobe interpreters.
+/setdash {
+ 1 index length 11 gt { /setdash load /limitcheck signalerror } if
+ //setdash
+} odef
+/setdevice
+ { .setdevice { erasepage } if } odef
+/setlinecap {
+ dup 2 gt { /setlinecap load /rangecheck signalerror } if
+ .setlinecap
+} odef
+/setlinejoin {
+ dup 2 gt { /setlinejoin load /rangecheck signalerror } if
+ .setlinejoin
+} odef
+/setmatrix {
+ dup aload pop .setmatrix pop
+} odef
+/showpage {
+ 0 .endpage .doneshowpage {
+ .currentnumcopies true .outputpage
+ (>>showpage, press <return> to continue<<\n) .confirm
+ erasepage
+ } if initgraphics .beginpage
+} odef
+% Code output by Adobe Illustrator relies on the fact that
+% `stack' is a procedure, not an operator!!!
+/stack { 0 1 count 3 sub { index = } for } bind def
+/start { BATCH { null 0 .quit } { executive } ifelse } def
+% Internal uses of stopped that aren't going to do a stop if an error occurs
+% should use .internalstopped to avoid setting newerror et al.
+/.internalstopped { null 1 .stopped null ne } bind def
+/store { % Don't alter operands before completing.
+ 1 index where { 2 index 2 index put pop pop } { def } ifelse
+} odef
+/.typenames mark .typenames counttomark packedarray exch pop def
+/type {
+ //.typenames .type
+} odef
+currentdict /.typenames .undef
+% When running in Level 1 mode, this interpreter is supposed to be
+% compatible with PostScript "version" 54.0 (I think).
+/version (54.0) readonly def
+/.wheredict 10 dict def
+/.where /where load def
+/where {
+ //.wheredict 1 index .knownget { exec } { .where } ifelse
+} odef
+
+% internaldict is defined in systemdict, but the dictionary is allocated
+% in local VM. However, the procedure must be global, since it is an
+% "operator" and must be bind-able into global procedures.
+% We make a procedure for creating it, since we must create a new one
+% for each context with private local VM.
+/.makeinternaldict {
+ .currentglobal true .setglobal
+ [ /dup .systemvar 1183615869 /eq .systemvar
+ [ /pop .systemvar null ] cvx
+ false .setglobal
+ dup 1 10 dict .forceput % proc is global, dict is local
+ true .setglobal
+ [ /internaldict /cvx .systemvar /invalidaccess /signalerror cvx ] cvx
+ /ifelse .systemvar
+ ] cvx executeonly
+ exch .setglobal
+} odef
+systemdict /internaldict dup .makeinternaldict .makeoperator
+.forceput % proc is local, systemdict is global
+% Move superexec to internaldict if superexec is defined.
+currentdict /superexec .knownget {
+ 1183615869 internaldict /superexec 3 -1 roll put
+ currentdict /superexec .undef
+} if
+
+% Define some additional built-in procedures (beyond the ones defined by
+% the PostScript Language Reference Manual).
+% Warning: these are not guaranteed to stay the same from one release
+% to the next!
+/concatstrings % (str1) (str2) concatstrings (str1str2)
+ { exch dup length 2 index length add string % str2 str1 new
+ dup dup 4 2 roll copy % str2 new new new1
+ length 4 -1 roll putinterval
+ } bind def
+/copyarray
+ { dup length array copy } bind def
+% Copy a dictionary per the Level 2 spec even in Level 1.
+/.copydict % <fromdict> <todict> .copydict <todict>
+ { dup 3 -1 roll { put dup } forall pop } bind def
+/copystring
+ { dup length string copy } bind def
+/findlibfile {
+ .libfile { dup .filename pop exch true } { false } ifelse
+} odef
+/.growdictlength % get size for growing a dictionary
+ { length 3 mul 2 idiv 1 add
+ } bind def
+/.growdict % grow a dictionary
+ { dup .growdictlength .setmaxlength
+ } bind def
+/.growput % put, grow the dictionary if needed
+ { 2 index length 3 index maxlength eq
+ { 3 copy pop known not { 2 index .growdict } if
+ } if
+ put
+ } bind def
+% .localvmarray may be an operator: see zsysvm.c.
+/.localvmarray where {
+ pop
+} {
+ /.localvmarray {
+ .currentglobal false .setglobal
+ exch array exch .setglobal
+ } bind def
+} ifelse
+/.localvmdict where {
+ pop
+} {
+ /.localvmdict {
+ .currentglobal false .setglobal
+ exch dict exch .setglobal
+ } bind def
+} ifelse
+/.packtomark
+ { counttomark packedarray exch pop } bind def
+/ppstack
+ { 0 1 count 3 sub { index === } for } bind def
+/runlibfile
+ { % We don't want to bind 'run' into this procedure,
+ % since run may get redefined.
+ findlibfile
+ { exch pop /run .systemvar exec }
+ { /undefinedfilename signalerror }
+ ifelse
+ } bind def
+/selectdevice
+ { finddevice setdevice .setdefaultscreen } bind def
+/signalerror % <object> <errorname> signalerror -
+ { /errordict .systemvar exch get exec } bind def
+
+% Define the =[only] procedures. Also define =print,
+% which is used by some PostScript programs even though
+% it isn't documented anywhere.
+/write=only {
+ .writecvs
+} bind def
+/write= {
+ 1 index exch write=only (\n) writestring
+} bind def
+/=only { (%stdout) (w) file exch write=only } bind def
+/= { =only (\n) print } bind def
+/=print /=only load def
+% Temporarily define == as = for the sake of runlibfile0.
+/== /= load def
+
+% The following procedures are documented.
+/copydevice { % <device> copydevice <newdevice>
+ false .copydevice2
+} odef
+/finddevice { % <devicename> finddevice <device>
+ /devicedict .systemvar exch get
+ dup 1 get null eq {
+ % This is the first request for this type of device.
+ % Create a default instance now.
+ % Stack: [proto null]
+ .currentglobal true .setglobal exch
+ dup dup 0 get copydevice 1 exch put
+ exch .setglobal
+ } if 1 get
+} bind def
+/findprotodevice { % <devicename> findprotodevice <protodevice>
+ /devicedict .systemvar exch get 0 get
+} bind def
+
+% Run a resource file. This allows us to distinguish resource objects
+% from objects coming from input files.
+userdict /.currentresourcefile null put
+/.execasresource { % <file> <proc|runfile> .execasresource -
+ /stopped .systemvar
+ /.currentresourcefile .uservar
+ % Stack: file proc -stopped- currfile
+ .userdict /.currentresourcefile 5 index cvlit put
+ 2 .execn % stopped <file>
+ .userdict /.currentresourcefile 3 -1 roll put
+ { stop } if
+} bind def
+/.runresource { % <file> .runresource -
+ { /run .systemvar exec } .execasresource
+} bind def
+
+% Define procedures for getting and setting the current device resolution.
+
+/gsgetdeviceprop % <device> <propname> gsgetdeviceprop <value>
+ { 2 copy mark exch null .dicttomark .getdeviceparams
+ dup mark eq % if true, not found
+ { pop dup /undefined signalerror }
+ { 5 1 roll pop pop pop pop }
+ ifelse
+ } bind def
+/gscurrentresolution % - gscurrentresolution <[xres yres]>
+ { currentdevice /HWResolution gsgetdeviceprop
+ } bind def
+/gssetresolution % <[xres yres]> gssetresolution -
+ { 2 array astore mark exch /HWResolution exch
+ currentdevice copydevice putdeviceprops setdevice
+ } bind def
+
+% Define auxiliary procedures needed for the above.
+/shellarguments % -> shell_arguments true (or) false
+ { /ARGUMENTS where
+ { /ARGUMENTS get dup type /arraytype eq
+ { aload pop /ARGUMENTS null store true }
+ { pop false }
+ ifelse }
+ { false } ifelse
+ } bind def
+/.confirm {
+ DISPLAYING NOPAUSE not TTYPAUSE or and {
+ % Print a message (unless NOPAGEPROMPT or NOPROMPT is true)
+ % and wait for the user to type something.
+ % If the user just types a newline, flush it.
+ NOPAGEPROMPT NOPROMPT or { pop } { print flush } ifelse
+ .confirmread
+ } {
+ pop
+ } ifelse
+} bind def
+/.confirmread {
+ TTYPAUSE {
+ (/dev/tty) (r) file dup read pop pop closefile
+ } {
+ .echo.mode false echo
+ (%stdin) (r) file dup read {
+ dup (\n) 0 get eq { pop pop } { unread } ifelse
+ } {
+ pop
+ } ifelse echo
+ } ifelse
+} bind def
+
+% Define the procedure used by .runfile, .runstdin and .runstring
+% for executing user input.
+% This is called with a procedure or executable file on the operand stack.
+/.execute { % <obj> .execute <stopped>
+ stopped $error /newerror get and
+ { handleerror flush true } { false } ifelse
+} bind def
+/execute { % <obj> execute -
+ .execute pop
+} odef
+% Define an execute analogue of runlibfile0.
+/execute0 { % <obj> execute0 -
+ .execute { /execute0 cvx 1 .quit } if
+} bind def
+% Define the procedure that the C code uses for running files
+% named on the command line.
+/.runfile {
+ { runlibfile } execute0
+} def
+% Define the procedure that the C code uses for running piped input.
+% We don't use the obvious { (%stdin) run }, because we want the file to be
+% reopened if a startjob does a restore.
+/.runstdin {
+ { { (%stdin) (r) file cvx } .runexec } execute0
+} bind def
+% Define the procedure that the C code uses for running commands
+% given on the command line with -c. We turn the string into a file so that
+% .runexec can do the right thing with a startjob.
+/.runstring {
+ .currentglobal exch true .setglobal
+ 0 () .subfiledecode
+ exch .setglobal cvx { .runexec } execute0
+} bind def
+% Define the procedure that the C code uses to set up for executing
+% a string that may be received in pieces.
+/.runstringbegin {
+ .currentglobal true .setglobal
+ { .needinput } bind 0 () .subfiledecode
+ exch .setglobal cvx .runexec
+} bind def
+
+% Define a special version of runlibfile that aborts on errors.
+/runlibfile0
+ { cvlit dup /.currentfilename exch def
+ { findlibfile not { stop } if }
+ stopped
+ { (Can't find \(or open\) initialization file ) print
+ .currentfilename == flush /runlibfile0 cvx 1 .quit
+ } if
+ exch pop cvx stopped
+ { (While reading ) print .currentfilename print (:\n) print flush
+ handleerror /runlibfile0 1 .quit
+ } if
+ } bind def
+% Temporarily substitute it for the real runlibfile.
+/.runlibfile /runlibfile load def
+/runlibfile /runlibfile0 load def
+
+% Create the error handling machinery.
+% Define the standard error handlers.
+% The interpreter has created the ErrorNames array.
+/.unstoppederrorhandler % <command> <errorname> .unstoppederrorhandler -
+ { % This is the handler that gets used for recursive errors,
+ % or errors outside the scope of a 'stopped'.
+ 2 copy SHORTERRORS
+ { (%%[ Error: ) print =only flush
+ (; OffendingCommand: ) print =only ( ]%%) =
+ }
+ { (Unrecoverable error: ) print =only flush
+ ( in ) print = flush
+ count 2 gt
+ { (Operand stack:\n ) print
+ count 1 sub -1 2 { ( ) print index =only flush } for
+ () = flush
+ } if
+ }
+ ifelse
+ -1 0 1 //ErrorNames length 1 sub
+ { dup //ErrorNames exch get 3 index eq
+ { not exch pop exit } { pop } ifelse
+ }
+ for exch pop .quit
+ } bind def
+/.errorhandler % <command> <errorname> .errorhandler -
+ { % Detect an internal 'stopped'.
+ 1 .instopped { null eq { pop pop stop } if } if
+ $error /.inerror get 1 .instopped { pop } { pop true } ifelse
+ { .unstoppederrorhandler
+ } if % detect error recursion
+ $error /globalmode .currentglobal false .setglobal put
+ $error /.inerror true put
+ $error /newerror true put
+ $error exch /errorname exch put
+ $error exch /command exch put
+ $error /recordstacks get $error /errorname get /VMerror ne and
+ { % Attempt to store the stack contents atomically.
+ count array astore dup $error /ostack 4 -1 roll
+ countexecstack array execstack $error /estack 3 -1 roll
+ countdictstack array dictstack $error /dstack 3 -1 roll
+ put put put aload pop
+ }
+ { $error /dstack .undef
+ $error /estack .undef
+ $error /ostack .undef
+ }
+ ifelse
+ $error /position currentfile status
+ { currentfile { fileposition } .internalstopped { pop null } if
+ }
+ { % If this was a scanner error, the file is no longer current,
+ % but the command holds the file, which may still be open.
+ $error /command get dup type /filetype eq
+ { { fileposition } .internalstopped { pop null } if }
+ { pop null }
+ ifelse
+ }
+ ifelse put
+ % During initialization, we don't reset the allocation
+ % mode on errors.
+ $error /globalmode get $error /.nosetlocal get and .setglobal
+ $error /.inerror false put
+ stop
+ } bind def
+% Define the standard handleerror. We break out the printing procedure
+% (.printerror) so that it can be extended for binary output
+% if the Level 2 facilities are present.
+ /.printerror
+ { $error begin
+ /command load errorname SHORTERRORS
+ { (%%[ Error: ) print =only flush
+ (; OffendingCommand: ) print =only
+ errorinfo dup null eq {
+ pop
+ } {
+ (;\nErrorInfo:) print
+ dup type /arraytype eq
+ { { ( ) print =only } forall }
+ { ( ) print =only }
+ ifelse
+ } ifelse
+ ( ]%%) = flush
+ }
+ { (Error: ) print ==only flush
+ ( in ) print ==only flush
+ errorinfo dup null eq {
+ pop
+ } {
+ (\nAdditional information: ) print ==only flush
+ } ifelse
+ .printerror_long
+ }
+ ifelse
+ .clearerror
+ end
+ flush
+ } bind def
+ /.printerror_long % long error printout,
+ % $error is on the dict stack
+ { % Push the (anonymous) stack printing procedure.
+ % <heading> <==flag> <override-name> <stackname> proc
+ {
+ currentdict exch .knownget % stackname defined in $error?
+ {
+ 4 1 roll % stack: <stack> <head> <==flag> <over>
+ errordict exch .knownget % overridename defined?
+ {
+ exch pop exch pop exec % call override with <stack>
+ }
+ {
+ exch print exch % print heading. stack <==flag> <stack>
+ 1 index not { () = } if
+ { 1 index { (\n ) } { ( ) } ifelse print
+ dup type /dicttype eq
+ {
+ (--dict:) print
+ dup rcheck {
+ dup length =only (/) print dup maxlength =only
+ dup wcheck not { ((ro)) print } if
+ } if
+ /gcheck where {
+ pop gcheck { ((G)) } { ((L)) } ifelse print
+ } {
+ pop
+ } ifelse (--) print
+ }
+ {
+ dup type /stringtype eq 2 index or
+ { ==only } { =only } ifelse
+ } ifelse
+ } forall
+ pop
+ }
+ ifelse % overridden
+ }
+ { pop pop pop
+ }
+ ifelse % stack known
+ }
+
+ (\nOperand stack:) OSTACKPRINT /.printostack /ostack 4 index exec
+ (\nExecution stack:) ESTACKPRINT /.printestack /estack 4 index exec
+ (\nBacktrace:) true /.printbacktrace /backtrace 4 index exec
+ (\nDictionary stack:) false /.printdstack /dstack 4 index exec
+ () =
+ pop % printing procedure
+
+ errorname /VMerror eq
+ { (VM status:) print mark vmstatus
+ counttomark { ( ) print counttomark -1 roll dup =only } repeat
+ cleartomark () =
+ } if
+
+ .languagelevel 2 ge
+ { (Current allocation mode is ) print
+ globalmode { (global\n) } { (local\n) } ifelse print
+ } if
+
+ .oserrno dup 0 ne
+ { (Last OS error: ) print
+ errorname /VMerror ne
+ { dup .oserrorstring { = pop } { = } ifelse }
+ { = }
+ ifelse
+ }
+ { pop
+ }
+ ifelse
+
+ position null ne
+ { (Current file position is ) print position = }
+ if
+
+ } bind def
+% Define a procedure for clearing the error indication.
+/.clearerror
+ { $error /newerror false put
+ $error /errorname null put
+ $error /errorinfo null put
+ 0 .setoserrno
+ } bind def
+
+% Define $error. This must be in local VM.
+.currentglobal false .setglobal
+/$error 40 dict .forcedef % $error is local, systemdict is global
+ % newerror, errorname, command, errorinfo,
+ % ostack, estack, dstack, recordstacks,
+ % binary, globalmode,
+ % .inerror, .nosetlocal, position,
+ % plus extra space for badly designed error handers.
+$error begin
+ /newerror false def
+ /recordstacks true def
+ /binary false def
+ /globalmode .currentglobal def
+ /.inerror false def
+ /.nosetlocal true def
+ /position null def
+end
+% Define errordict similarly. It has one entry per error name,
+% plus handleerror. However, some astonishingly badly written PostScript
+% files require it to have at least one empty slot.
+/errordict ErrorNames length 2 add dict
+.forcedef % errordict is local, systemdict is global
+.setglobal % contents of errordict are global
+errordict begin
+ ErrorNames
+ { mark 1 index systemdict /.errorhandler get /exec load .packtomark cvx def
+ } forall
+% The handlers for interrupt and timeout are special; there is no
+% 'current object', so they push their own name.
+ { /interrupt /timeout }
+ { mark 1 index dup systemdict /.errorhandler get /exec load .packtomark cvx def
+ } forall
+/handleerror
+ { /.printerror .systemvar exec
+ } bind def
+end
+
+% Define the [write]==[only] procedures.
+/.dict 8 dict dup
+begin def
+ /.cvp {1 index exch 1 .writecvp} bind def
+ /.p {1 index exch writestring} bind def
+ /.p1 {2 index exch writestring} bind def
+ /.p2 {3 index exch writestring} bind def
+ /.print
+ { dup type .dict exch .knownget { exec } { .cvp } ifelse
+ } bind def
+ /arraytype
+ {dup rcheck
+ {() exch dup xcheck
+ {({) .p2
+ {exch .p1
+ 1 index exch .print pop ( )} forall
+ (})}
+ {([) .p2
+ {exch .p1
+ 1 index exch .print pop ( )} forall
+ (])}
+ ifelse exch pop .p}
+ {.cvp}
+ ifelse} bind def
+ /packedarraytype /arraytype load def
+{//.dict begin .print pop end}
+ bind
+end
+
+/write==only exch def
+/write== {1 index exch write==only (\n) writestring} bind def
+/==only { (%stdout) (w) file exch write==only } bind def
+/== {==only (\n) print} bind def
+
+% Define [write]===[only], an extension that prints dictionaries
+% in readable form and doesn't truncate strings.
+/.dict /write==only load 0 get dup length 2 add dict .copydict dup
+begin def
+ /dicttype
+ { dup rcheck
+ { (<< ) .p1
+ { 2 index 3 -1 roll .print pop ( ) .p1
+ 1 index exch .print pop ( ) .p
+ }
+ forall (>>) .p
+ }
+ { .cvp
+ }
+ ifelse
+ } bind def
+ /stringtype
+ { 1 index exch 2 .writecvp
+ } bind def
+
+{//.dict begin .print pop end}
+ bind
+end
+
+/write===only exch def
+/write=== {1 index exch write===only (\n) writestring} bind def
+/===only { (%stdout) (w) file exch write===only } bind def
+/=== { ===only (\n) print } bind def
+
+(END PROCS) VMDEBUG
+
+% Define the font directory.
+/FontDirectory false .setglobal 100 dict true .setglobal
+.forcedef % FontDirectory is local, systemdict is global
+
+% Define the encoding dictionary.
+/EncodingDirectory 16 dict def % enough for Level 2 + PDF standard encodings
+
+% Define .findencoding. (This is redefined in Level 2.)
+/.findencoding
+ { //EncodingDirectory exch get exec
+ } bind def
+/.defineencoding
+ { //EncodingDirectory 3 1 roll put
+ } bind def
+% If we've got the composite font extensions, define findencoding.
+% To satisfy the Genoa FTS, findencoding must be a procedure, not an operator.
+/rootfont where { pop /findencoding { .findencoding } def } if
+
+% Define .registerencoding.
+% NOTE: the name registeredencodings is known to (initialized by and shared
+% with) the interpreter.
+/.registerencoding { % <index> <array> .registerencoding -
+ % Check that the array is indexable.
+ % (It might still be a string, but then the .namestring will fail.)
+ dup 0 0 getinterval pop
+ % Check that all the elements of the array are names.
+ dup { .namestring pop } forall
+ % Do the store.
+ //registeredencodings 2 index 2 index readonly put pop pop
+} bind odef
+systemdict /registeredencodings .undef
+
+% Load StandardEncoding.
+%% Replace 1 (gs_std_e.ps)
+(gs_std_e.ps) dup runlibfile VMDEBUG
+
+% Load ISOLatin1Encoding.
+%% Replace 1 (gs_il1_e.ps)
+(gs_il1_e.ps) dup runlibfile VMDEBUG
+
+% Define stubs for the Symbol and Dingbats encodings.
+% Note that the first element of the procedure must be the file name,
+% since gs_lev2.ps extracts it to set up the Encoding resource category.
+
+ /SymbolEncoding { /SymbolEncoding .findencoding } bind def
+%% Replace 3 (gs_sym_e.ps)
+ EncodingDirectory /SymbolEncoding
+ { (gs_sym_e.ps) //systemdict begin runlibfile SymbolEncoding end }
+ bind put
+
+ /DingbatsEncoding { /DingbatsEncoding .findencoding } bind def
+%% Replace 3 (gs_dbt_e.ps)
+ EncodingDirectory /DingbatsEncoding
+ { (gs_dbt_e.ps) //systemdict begin runlibfile DingbatsEncoding end }
+ bind put
+
+(END FONTDIR/ENCS) VMDEBUG
+
+% Construct a dictionary of all available devices.
+% These are (read-only) device prototypes that can't be
+% installed or have their parameters changed. For this reason,
+% the value in the dictionary is actually a 2-element writable array,
+% to allow us to create a default instance of the prototype on demand.
+
+ % Loop until the .getdevice gets a rangecheck.
+errordict /rangecheck 2 copy get
+errordict /rangecheck { pop stop } put % pop the command
+ 0 { {dup .getdevice exch 1 add} loop} .internalstopped pop
+ 1 add dict /devicedict 1 index def
+ begin % 2nd copy of count is on stack
+ { dup .devicename exch
+ dup wcheck { dup } { null } ifelse 2 array astore def
+ } repeat
+ end
+put % errordict /rangecheck
+.clearerror
+/devicenames devicedict { pop } forall devicedict length packedarray def
+
+% Determine the default device.
+/defaultdevice DISPLAYING
+ { systemdict /DEVICE .knownget
+ { devicedict 1 index known not
+ { (Unknown device: ) print =
+ flush /defaultdevice cvx 1 .quit
+ }
+ if
+ }
+ { 0 .getdevice .devicename
+ }
+ ifelse
+ }
+ { /nullpage
+ }
+ifelse
+/.defaultdevicename 1 index def
+finddevice % make a copy
+def
+devicedict /Default devicedict .defaultdevicename get put
+
+(END DEVS) VMDEBUG
+
+% Define statusdict, for the benefit of programs
+% that think they are running on a LaserWriter or similar printer.
+%% Replace 1 (gs_statd.ps)
+(gs_statd.ps) runlibfile
+
+(END STATD) VMDEBUG
+
+% Load the standard font environment.
+%% Replace 1 (gs_fonts.ps)
+(gs_fonts.ps) runlibfile
+
+(END GS_FONTS) VMDEBUG
+
+% Define the default halftone screen and BG/UCR functions now, so that
+% it will bind in the original definitions of set[color]screen.
+% We make this a procedure so we can call it again when switching devices.
+
+% Use an ordered dither for low-resolution devices.
+/.setloreshalftone { % <dpi> .setloreshalftone -
+ % The following 'ordered dither' spot function was contributed by
+ % Gregg Townsend. Thanks, Gregg!
+ 16.001 div 0 % not 16: avoids rounding problems
+ { 1 add 7.9999 mul cvi exch 1 add 7.9999 mul cvi 16 mul add <
+ 0E 8E 2E AE 06 86 26 A6 0C 8C 2C AC 04 84 24 A4
+ CE 4E EE 6E C6 46 E6 66 CC 4C EC 6C C4 44 E4 64
+ 3E BE 1E 9E 36 B6 16 96 3C BC 1C 9C 34 B4 14 94
+ FE 7E DE 5E F6 76 D6 56 FC 7C DC 5C F4 74 D4 54
+ 01 81 21 A1 09 89 29 A9 03 83 23 A3 0B 8B 2B AB
+ C1 41 E1 61 C9 49 E9 69 C3 43 E3 63 CB 4B EB 6B
+ 31 B1 11 91 39 B9 19 99 33 B3 13 93 3B BB 1B 9B
+ F1 71 D1 51 F9 79 D9 59 F3 73 D3 53 FB 7B DB 5B
+ 0D 8D 2D AD 05 85 25 A5 0F 8F 2F AF 07 87 27 A7
+ CD 4D ED 6D C5 45 E5 65 CF 4F EF 6F C7 47 E7 67
+ 3D BD 1D 9D 35 B5 15 95 3F BF 1F 9F 37 B7 17 97
+ FD 7D DD 5D F5 75 D5 55 FF 7F DF 5F F7 77 D7 57
+ 02 82 22 A2 0A 8A 2A AA 00 80 20 A0 08 88 28 A8
+ C2 42 E2 62 CA 4A EA 6A C0 40 E0 60 C8 48 E8 68
+ 32 B2 12 92 3A BA 1A 9A 30 B0 10 90 38 B8 18 98
+ F2 72 D2 52 FA 7A DA 5A F0 70 D0 50 F8 78 D8 58
+ > exch get 256 div
+ }
+ bind
+ % Use correct, per-plane screens for CMYK devices only.
+ //systemdict /setcolorscreen known processcolors 4 eq and
+ { 3 copy 6 copy //setcolorscreen }
+ { //setscreen }
+ ifelse
+} bind def
+/.setloresscreen { % <dpi> .setloresscreen -
+ .setloreshalftone
+ 0 array cvx settransfer % Genoa CET won't accept a packed array!
+ /setstrokeadjust where { pop true setstrokeadjust } if
+} bind def
+% Use a 45-degree spot screen for high-resolution devices.
+/.sethireshalftone { % <dpi> .sethireshalftone <doscreen>
+ % According to information published by Hewlett-Packard,
+ % they use a 60 line screen on 300 DPI printers and
+ % an 85 line screen on 600 DPI printers.
+ % However, we use a 106 line screen, which produces smoother-
+ % looking shades but fewer of them (32 vs. 50).
+ % 46 was suggested as a good frequency value for printers
+ % between 200 and 400 DPI, so we use it for lower resolutions.
+ % Imagesetters need even higher frequency screens.
+ //systemdict /DITHERPPI known
+ { DITHERPPI
+ }
+ { dup cvi 100 idiv 15 .min
+ {null 46 46 60 60 60 106 106 106 106 133 133 133 133 133 150}
+ exch get
+ }
+ ifelse
+ 1 index 4.01 div .min % at least a 4x4 cell
+ 45
+ % The following screen algorithm is used by permission of the author.
+ { 1 add 180 mul cos 1 0.08 add mul exch 2 add 180 mul cos
+ 1 0.08 sub mul add 2 div % (C) 1989 Berthold K.P. Horn
+ }
+ bind
+ % Determine whether we have lots of process colors.
+ % If so, don't bother with color screening or gamma correction.
+ % Also don't do gamma correction on very high-resolution devices.
+ % (This should depend on dot gain, not resolution, but we don't
+ % currently have a way to determine this.)
+ currentdevice mark
+ /RedValues 0 /GreenValues 0 /BlueValues 0 /GrayValues 0
+ .dicttomark .getdeviceparams
+ counttomark 2 idiv 1 sub { exch pop .min } repeat
+ exch pop exch pop 32 lt 4 index 800 lt and 5 1 roll
+ % Stack: doscreen dpi freq angle proc
+ % Ghostscript currently doesn't use correct, per-plane halftones
+ % unless setcolorscreen has been executed. Since these are
+ % computationally much more expensive than binary halftones,
+ % we check to make sure they are really warranted, i.e., we have
+ % a high-resolution CMYK device (i.e., not a display) with
+ % fewer than 5 bits per plane (i.e., not a true-color device).
+ 4 -1 roll 150 ge
+ { /setcolorscreen where
+ { pop //systemdict /COLORSCREEN known
+ { COLORSCREEN }
+ { 3 index }
+ ifelse
+ dup false ne
+ { 4 1 roll 3 copy 6 copy 13 -1 roll
+ % For really high-quality screening on printers, we need to
+ % give each plane its own screen angle. Unfortunately,
+ % this currently has very large space and time costs.
+ true eq % true => different angles,
+ % 0 => same angles
+ { { 45 90 15 75 } { 3 1 roll exch pop 12 3 roll } forall
+ }
+ if //setcolorscreen
+ }
+ { pop //setscreen % false => single binary screen
+ }
+ ifelse
+ }
+ { //setscreen % setcolorscreen not known
+ }
+ ifelse
+ }
+ { //setscreen % not high resolution
+ }
+ ifelse
+} bind def
+/.sethiresscreen { % <dpi> .sethiresscreen -
+ .sethireshalftone
+ % Stack: doscreen
+ { % Set the transfer function to lighten up the grays.
+ % We correct at the high end so that very light grays
+ % don't disappear completely if they darken <1 screen pixel.
+ % Parameter values closer to 1 are better for devices with
+ % less dot spreading; lower values are better with more spreading.
+ % The value 0.8 is a compromise that will probably please no one!
+ %
+ % Because of a bug in FrameMaker, we have to accept operands
+ % outside the valid range of [0..1].
+ { dup dup 0.0 gt exch 1.0 lt and
+ { 0.8 exp dup dup 0.9375 gt exch 0.999 lt and % > 15/16
+ { .currentscreenlevels 1 sub % tweak to avoid boundary
+ 1 exch div 1 exch sub .min
+ }
+ if
+ }
+ if
+ }
+ }
+ { % Set the transfer function to the identity.
+ 0 array cvx % Genoa CET won't accept a packed array!
+ }
+ ifelse settransfer
+ /setstrokeadjust where { pop false setstrokeadjust } if
+ % Increase fill adjustment so that we effectively use Adobe's
+ % any-part-of-pixel rule.
+ 0.5 .setfilladjust
+} bind def
+% Set the default screen and BG/UCR.
+/.setdefaultbgucr {
+ systemdict /setblackgeneration known {
+ { pop 0 } dup setblackgeneration setundercolorremoval
+ } if
+} bind def
+/.useloresscreen { % - .useloresscreen <bool>
+ % Compute min(|dpi x|,|dpi y|) as the definition of the resolution.
+ 72 72 matrix defaultmatrix dtransform abs exch abs .min
+ dup 150 lt //systemdict /DITHERPPI known not and
+} bind def
+
+% The following implementation uses LL2 extensions, but only in stopped
+% contexts so that with LL1, the .set??reshalftone will be used.
+%
+% - .getdefaulthalftone <halftonedict> true if default found
+% false
+/.getdefaulthalftone {
+ % try the device to see if it has a default halftone
+ { currentdevice /HalftoneDefault gsgetdeviceprop } stopped
+ { pop pop false } % no device property
+ { dup type /dicttype eq { true } { pop false } ifelse }
+ ifelse
+ % stack: <halftonedict> true if default found
+ % false not found
+ dup not
+ { % device did not provide a default, try Resource
+ pop { /Default /Halftone /findresource .systemvar exec } stopped
+ { pop pop false } { true } ifelse
+ }
+ if
+} bind def
+
+/.setdefaulthalftone {
+ .getdefaulthalftone
+ { sethalftone }
+ { % default not found
+ .useloresscreen { .setloreshalftone } { .sethireshalftone pop } ifelse
+ }
+ ifelse
+} bind def
+
+/.setdefaultscreen {
+ .useloresscreen { .setloresscreen } { .sethiresscreen } ifelse
+ .setdefaultbgucr
+} bind def
+
+% Load the initialization files for optional features.
+%% Replace 4 INITFILES
+systemdict /INITFILES known
+ { INITFILES { dup runlibfile VMDEBUG } forall
+ }
+if
+
+% If Level 2 (or higher) functionality is implemented, enable it now.
+/.setlanguagelevel where {
+ pop 2 .setlanguagelevel
+ % If the resource machinery is loaded, fix up some things now.
+ /.fixresources where { pop .fixresources } if
+} if
+/ll3dict where {
+ pop 3 .setlanguagelevel
+} if
+
+(END INITFILES) VMDEBUG
+
+% Create a null font. This is the initial font.
+8 dict dup begin
+ /FontMatrix [ 1 0 0 1 0 0 ] readonly def
+ /FontType 3 def
+ /FontName () def
+ /Encoding StandardEncoding def
+ /FontBBox { 0 0 0 0 } readonly def % executable is bogus, but customary ...
+ /BuildChar { pop pop 0 0 setcharwidth } bind def
+ /PaintType 0 def % shouldn't be needed!
+end
+/NullFont exch definefont setfont
+
+% Define NullFont as the font.
+/NullFont currentfont def
+
+% Load initial fonts from FONTPATH directories, Fontmap file,
+% and/or .getccfont as appropriate.
+.loadinitialfonts
+
+% Remove NullFont from FontDirectory, so it can't be accessed by mistake.
+/undefinefont where {
+ pop /NullFont undefinefont
+} {
+ FontDirectory /NullFont .undef
+} ifelse
+
+(END FONTS) VMDEBUG
+
+% Restore the real definition of runlibfile.
+/runlibfile /.runlibfile load def
+currentdict /.runlibfile .undef
+
+% Bind all the operators defined as procedures.
+/.bindoperators % binds operators in currentdict
+ { % Temporarily disable the typecheck error.
+ errordict /typecheck 2 copy get
+ errordict /typecheck { pop } put % pop the command
+ currentdict
+ { dup type /operatortype eq
+ { % This might be a real operator, so bind might cause a typecheck,
+ % but we've made the error a no-op temporarily.
+ .bind % do a real bind even if NOBIND is set
+ }
+ if pop pop
+ } forall
+ put
+ } def
+NOBIND DELAYBIND or not { .bindoperators } if
+
+% Establish a default environment.
+
+defaultdevice
+% The following line used to skip setting of page size and resolution if
+% NODISPLAY was selected. We think this was only to save time and memory,
+% and it is a bad idea because it prevents setting the resolution in this
+% situation, which pstoedit (among other programs) relies on.
+%DISPLAYING not { setdevice (%END DISPLAYING) .skipeof } if
+systemdict /DEVICEWIDTH known
+systemdict /DEVICEHEIGHT known or
+systemdict /DEVICEWIDTHPOINTS known or
+systemdict /DEVICEHEIGHTPOINTS known or
+systemdict /DEVICEXRESOLUTION known or
+systemdict /DEVICEYRESOLUTION known or
+systemdict /PAPERSIZE known or
+not { (%END DEVICE) .skipeof } if
+% Let DEVICE{WIDTH,HEIGHT}[POINTS] override PAPERSIZE.
+systemdict /PAPERSIZE known
+systemdict /DEVICEWIDTH known not and
+systemdict /DEVICEHEIGHT known not and
+systemdict /DEVICEWIDTHPOINTS known not and
+systemdict /DEVICEHEIGHTPOINTS known not and
+ { % Convert the paper size to device dimensions.
+ true statusdict /.pagetypenames get
+ { PAPERSIZE eq
+ { PAPERSIZE load
+ dup 0 get /DEVICEWIDTHPOINTS exch def
+ 1 get /DEVICEHEIGHTPOINTS exch def
+ pop false exit
+ }
+ if
+ }
+ forall
+ { (Unknown paper size: ) print PAPERSIZE ==only (.) =
+ }
+ if
+ }
+if
+% Adjust the device parameters per the command line.
+% It is possible to specify resolution, pixel size, and page size;
+% since any two of these determine the third, conflicts are possible.
+% We simply pass them to .setdeviceparams and let it sort things out.
+ mark /HWResolution null /HWSize null /PageSize null .dicttomark
+ .getdeviceparams .dicttomark begin
+ mark
+ % Check for resolution.
+ /DEVICEXRESOLUTION where dup
+ { exch pop HWResolution 0 DEVICEXRESOLUTION put }
+ if
+ /DEVICEYRESOLUTION where dup
+ { exch pop HWResolution 1 DEVICEYRESOLUTION put }
+ if
+ or { /HWResolution HWResolution } if
+ % Check for device sizes specified in pixels.
+ /DEVICEWIDTH where dup
+ { exch pop HWSize 0 DEVICEWIDTH put }
+ if
+ /DEVICEHEIGHT where dup
+ { exch pop HWSize 1 DEVICEHEIGHT put }
+ if
+ or { /HWSize HWSize } if
+ % Check for device sizes specified in points.
+ /DEVICEWIDTHPOINTS where dup
+ { exch pop PageSize 0 DEVICEWIDTHPOINTS put }
+ if
+ /DEVICEHEIGHTPOINTS where dup
+ { exch pop PageSize 1 DEVICEHEIGHTPOINTS put }
+ if
+ or { /PageSize PageSize } if
+ % Check whether any parameters were set.
+ dup mark eq { pop } { defaultdevice putdeviceprops } ifelse
+ end
+%END DEVICE
+% Set any device properties defined on the command line.
+% If BufferSpace is defined but not MaxBitmap, set MaxBitmap to BufferSpace.
+systemdict /BufferSpace known
+systemdict /MaxBitmap known not and
+ { systemdict /MaxBitmap BufferSpace put
+ } if
+dup getdeviceprops
+counttomark 2 idiv
+ { systemdict 2 index known
+ { pop dup load counttomark 2 roll }
+ { pop pop }
+ ifelse
+ } repeat
+counttomark dup 0 ne
+ { 2 add -1 roll putdeviceprops }
+ { pop pop }
+ifelse
+% If the initial device parameters are invalid, the setdevice may fail.
+% Trap this and produce a reasonable error message.
+{ setdevice } % does an erasepage
+DEBUG { exec false } { .internalstopped } ifelse {
+ (**** Unable to open the initial device, quitting.) = flush 1 .quit
+} if
+
+% If the media size is fixed, update the current page device dictionary.
+FIXEDMEDIA
+dup { pop systemdict /.currentpagedevice known } if
+dup { pop .currentpagedevice exch pop } if
+not { (%END MEDIA) .skipeof } if
+currentpagedevice dup length dict .copydict
+dup /Policies
+ % Stack: <pagedevice> <pagedevice> /Policies
+1 index /InputAttributes
+2 copy get dup length dict .copydict
+ % Stack: <pagedevice> <pagedevice> /Policies <pagedevice>
+ % /InputAttributes <inputattrs'>
+dup 0 2 copy get dup length dict .copydict
+ % Stack: <pagedevice> <pagedevice> /Policies <pagedevice>
+ % /InputAttributes <inputattrs'> <inputattrs'> 0 <attrs0'>
+dup /PageSize 7 index /PageSize get
+put % PageSize in 0
+put % 0 in InputAttributes
+put % InputAttributes in pagedevice
+% Also change the page size policy so we don't get an error.
+ % Stack: <pagedevice> <pagedevice> /Policies
+2 copy get dup length dict .copydict
+ % Stack: <pagedevice> <pagedevice> /Policies <policies'>
+dup /PageSize 7 put % PageSize in Policies
+put % Policies in pagedevice
+.setpagedevice
+%END MEDIA
+%END DISPLAYING
+
+(END DEVICE) VMDEBUG
+
+% Establish a default upper limit in the character cache,
+% namely, enough room for a 18-point character at the resolution
+% of the default device, or for a character consuming 1% of the
+% maximum cache size, whichever is larger.
+mark
+ % Compute limit based on character size.
+ 18 dup dtransform
+ exch abs cvi 31 add 32 idiv 4 mul % X raster
+ exch abs cvi mul % Y
+ % Compute limit based on allocated space.
+ cachestatus pop pop pop pop pop exch pop 0.01 mul cvi
+ .max dup 10 idiv exch
+setcacheparams
+% Conditionally disable the character cache.
+NOCACHE { 0 setcachelimit } if
+
+(END CONFIG) VMDEBUG
+
+% Initialize graphics.
+
+.setdefaultscreen
+initgraphics
+
+% The interpreter relies on there being at least 2 entries
+% on the graphics stack. Establish the second one now.
+gsave
+
+% Define some control sequences as no-ops.
+% This is a hack to get around problems
+% in some common PostScript-generating applications.
+<04> cvn { } def % Apple job separator
+<0404> cvn { } def % two of the same
+<1b> cvn { } def % MS Windows LaserJet 4 prologue
+ % (UEL = ESC %-12345X)
+<1b45> cvn { } def % PJL reset prologue (ESC E)
+<1b451b> cvn { } def % PJL reset epilogue (ESC E + UEL)
+<041b> cvn { } def % MS Windows LaserJet 4 epilogue (^D + UEL)
+(\001M) cvn % TBCP initiator
+ { currentfile /TBCPDecode filter cvx exec
+ } bind def
+/@PJL % H-P job control
+ { currentfile //=string readline { pop } if
+ } bind def
+
+% Install the EPS handler if needed
+systemdict /EPSBoundingBoxInit known { EPSBoundingBoxInit } if
+
+% If we want a "safer" system, disable some obvious ways to cause havoc.
+.currentglobal true .setglobal
+/SAFETY 2 dict
+ dup /safe false put
+ dup /tempfiles 10 dict readonly put
+readonly def
+.setglobal
+
+% Convert a path name into a string suitable for filenameforall
+% For example: (a\\b*?c) to (a\\\\b\\*\\?c)
+/.makepathtemplate { % str1 -- str2
+ dup length dup add string 0 % result string up to twice the size
+ 0 1 4 index length 1 sub {
+ 3 index exch get
+ dup 92 eq { % \ -> \\
+ 2 index 2 index 92
+ put
+ exch 1 add exch
+ }
+ if
+ dup 42 eq { % * -> \*
+ 2 index 2 index 92
+ put
+ exch 1 add exch
+ }
+ if
+ dup 63 eq { % ? -> \?
+ 2 index 2 index 92
+ put
+ exch 1 add exch
+ }
+ if
+ 2 index 2 index 3 -1 roll put 1 add
+ } for
+ 0 exch getinterval exch pop
+} bind def
+
+/.locksafe {
+ SAFETY /safe get not {
+ <<
+ /PermitFileReading [
+ currentuserparams /PermitFileReading get aload pop
+ { .makepathtemplate
+ dup .filenamedirseparator concatstrings (*) concatstrings
+ exch % put string below this procedure
+ }
+ /LIBPATH .systemvar { 1 index exec } forall
+ /FONTPATH .systemvar { 1 index exec } forall
+ currentsystemparams /GenericResourceDir get 1 index exec
+ currentsystemparams /FontResourceDir get exch exec
+ ]
+ /LockFilePermissions true
+ >> setuserparams
+ }
+ if
+ % setpagedevice has the side effect of clearing the page, but
+ % we will just document that. Using setpagedevice keeps the device
+ % properties and pagedevice .LockSafetyParams in agreement even
+ % after a restore that changes the value to false.
+ currentglobal currentpagedevice gcheck setglobal % use correct VM space
+ << /.LockSafetyParams true >> setpagedevice
+ setglobal
+ //SAFETY /safe //true .forceput % overrides readonly
+} .bind executeonly odef
+
+/.setsafe
+{
+ SAFETY /safe get not {
+ <<
+ PARANOIDSAFER { % only PARANOIDSAFER locks down reading files
+ /PermitFileReading [ ]
+ } if
+ /PermitFileWriting [ ]
+ /PermitFileControl [ ]
+ >> setuserparams
+ }
+ if
+ .locksafe
+} .bind executeonly odef
+
+/deletefile {
+ count 1 lt {
+ //deletefile /stackunderflow signalerror
+ }
+ if
+ dup { deletefile } stopped {
+ pop //deletefile $error /errorname get signalerror
+ } {
+ % deletefile succeeded. Remove from tempfile list if present
+ //SAFETY /tempfiles get exch cvn 2 copy known {
+ .forceundef
+ } {
+ pop pop
+ }
+ ifelse
+ }
+ ifelse
+} .bind executeonly odef
+
+% If a file is opened with .tempfile with SAFER not (yet) set,
+% the file can be deleted later, even if SAFER is set.
+/.tempfile {
+ .tempfile % filename file
+ //SAFETY /tempfiles get 2 index true .forceput
+} .bind executeonly odef
+
+% If we are running in SAFER mode, lock things down
+SAFER { .setsafe } if
+
+% If we delayed binding, make it possible to do it later.
+/.bindnow {
+ //systemdict begin .bindoperators end
+ % Temporarily disable the typecheck error.
+ errordict /typecheck 2 copy get
+ errordict /typecheck { pop } put % pop the command
+ 0 1 .delaycount 1 sub { .delaybind exch get .bind pop } for
+ //systemdict /.delaybind {} .forceput % reclaim the space
+ //systemdict /.bindnow .forceundef % ditto
+ put
+ //systemdict /.forcedef .forceundef % remove temptation
+ //systemdict /.forceput .forceundef % ditto
+ //systemdict /.forceundef .forceundef % ditto
+} .bind odef
+
+% Turn off array packing, since some PostScript code assumes that
+% procedures are writable.
+false setpacking
+
+(END INIT) VMDEBUG
+
+/.currentuserparams where {
+ pop
+ % Remove real user params from psuserparams.
+ mark .currentuserparams counttomark 2 idiv {
+ pop psuserparams exch undef
+ } repeat pop
+ % Update the copy of the user parameters.
+ mark .currentuserparams counttomark 2 idiv {
+ userparams 3 1 roll .forceput % userparams is read-only
+ } repeat pop
+ % Turn on idiom recognition, if available.
+ currentuserparams /IdiomRecognition known {
+ /IdiomRecognition true .definepsuserparam
+ } if
+ psuserparams readonly pop
+ systemdict /.definepsuserparam undef
+ % Save a copy of userparams for use with save/restore
+ % (and, if implemented, context switching).
+ .currentglobal false .setglobal
+ mark userparams { } forall .dicttomark readonly
+ /userparams exch .forcedef % systemdict is read-only
+ .setglobal
+} if
+/.currentsystemparams where {
+ pop
+ % Remove real system params from pssystemparams.
+ mark .currentsystemparams counttomark 2 idiv {
+ pop pssystemparams exch .forceundef
+ } repeat pop
+} if
+
+% Conditionally turn image interpolation on or off.
+currentdict /INTERPOLATE known not { (%END INTERPOLATE) .skipeof } if
+
+/.interpolate {
+ dup /Interpolate .knownget not { //false } if
+ /INTERPOLATE .systemvar ne {
+ dup gcheck .currentglobal exch .setglobal
+ exch dup length dict copy
+ dup /Interpolate /INTERPOLATE .systemvar put
+ exch .setglobal
+ } if
+} bind odef
+
+/colorimage
+ { /INTERPOLATE .systemvar
+ { .currentglobal % w h bit [] {}...{} multi ncomp glob
+ //false .setglobal
+ 9 dict begin % w h bit [] {}...{} multi ncomp glob
+ 2 index { 1 index 7 add } { 8 } ifelse
+ copy gsave pop % preserve the arguments
+ { 0 /DeviceGray 0 /DeviceRGB /DeviceCMYK }
+ 1 index get setcolorspace % ... glob w h bit [] {}...{} multi ncomp
+ {0 1 0 1 0 1 0 1}
+ 1 index 2 mul 0 exch % ... glob w h bit [] {}...{} multi ncomp {0 1 ...} 0 2*ncomp
+ getinterval /Decode exch def % ... glob w h bit [] {}...{} multi ncomp
+ exch dup % ... glob w h bit [] {}...{} ncomp multi multi
+ /MultipleDataSources exch def % ... glob w h bit [] {}...{} ncomp multi
+ { array astore} { pop } ifelse % ... glob w h bit [] [{}...{}]
+ /DataSource exch def % ... glob w h bit []
+ /ImageMatrix exch def % ... glob w h bit
+ /BitsPerComponent exch def % ... glob w h
+ /Height exch def % ... glob w
+ /Width exch def % ... glob
+ /ImageType 1 def
+ /Interpolate //true def
+ .setglobal currentdict end % ... <<>>
+ image grestore
+ exch { 4 add } { 6 } ifelse
+ { pop } repeat % -
+ }
+ { colorimage
+ }
+ ifelse
+ } bind odef
+
+/image
+ { dup type /dicttype eq
+ { dup /ImageType get 3 eq
+ { .currentglobal //false .setglobal exch
+ dup length dict copy begin .setglobal
+ /DataDict DataDict .interpolate def
+ /MaskDict MaskDict .interpolate def
+ currentdict end
+ }
+ { .interpolate
+ }
+ ifelse
+ image
+ }
+ { /INTERPOLATE .systemvar
+ { .currentglobal //false .setglobal
+ 8 dict begin .setglobal
+ /ImageType 1 def
+ /DataSource 1 index def
+ /ImageMatrix 2 index def
+ /BitsPerComponent 3 index def
+ /Decode {0 1} def
+ /Height 4 index def
+ /Width 5 index def
+ /Interpolate //true def
+ currentdict end
+ gsave /DeviceGray setcolorspace image grestore
+ 5 { pop } repeat
+ }
+ { image
+ }
+ ifelse
+ }
+ ifelse
+ } bind odef
+
+/imagemask {
+ dup type /dicttype eq {
+ .interpolate imagemask
+ } {
+ /INTERPOLATE .systemvar {
+ .currentglobal //false .setglobal
+ 8 dict begin .setglobal
+ /ImageType 1 def
+ /DataSource 1 index def
+ /ImageMatrix 2 index def
+ /BitsPerComponent 1 def
+ 2 index { {1 0} } { {0 1} } ifelse /Decode exch def
+ /Height 4 index def
+ /Width 5 index def
+ /Interpolate //true def
+ currentdict end imagemask 5 { pop } repeat
+ } {
+ imagemask
+ } ifelse
+ } ifelse
+} bind odef
+
+currentdict /.interpolate undef
+
+%END INTERPOLATE
+
+% Establish local VM as the default.
+false /setglobal where { pop setglobal } { .setglobal } ifelse
+$error /.nosetlocal false put
+
+(END GLOBAL) VMDEBUG
+
+/.savelocalstate where {
+ % If we might create new contexts, save away copies of all dictionaries
+ % referenced from systemdict that are stored in local VM,
+ % and also save a copy of the initial gstate.
+ pop .savelocalstate
+} {
+ % If we're *not* running in a multi-context system and FAKEFONTS is
+ % defined, add the fake fonts to LocalFontDirectory.
+ .definefakefonts % current VM is local
+} ifelse
+
+% Remove systemdict entries for things that have been bound in where used
+% and that shouldn't be accessible by name, and close up systemdict.
+currentdict /filterdict .undef
+currentdict /.cidfonttypes .undef
+currentdict /.colorrenderingtypes .undef
+currentdict /.formtypes .undef
+currentdict /.halftonetypes .undef
+currentdict /.imagetypes .undef
+currentdict /.imagemasktypes .undef
+currentdict /.patterntypes .undef
+currentdict /.shadingtypes .undef
+currentdict /.wheredict .undef
+end
+
+% Clean up VM, and enable GC.
+/vmreclaim where
+ { pop NOGC not { 2 vmreclaim 0 vmreclaim } if
+ } if
+DELAYBIND not {
+ systemdict /.forcedef .undef % remove temptation
+ systemdict /.forceput .undef % ditto
+ systemdict /.forceundef .undef % ditto
+} if
+WRITESYSTEMDICT not { systemdict readonly pop } if
+
+(END GC) VMDEBUG
+
+% The Adobe AGM_Core used by Illustrator 9 has some code that breaks
+% if the 'product' is not (Adobe PostScript Parser). A bug has been
+% submitted to Adobe since this also fails with Acrobat Distiller.
+% As a temporary work around, the following HACK will work for
+% devices without spot color support. Once Ghostscript can
+% support DeviceN and spot color separations this will need to
+% be 'true' in some cases.
+userdict /AGM_preserve_spots false put
+
+% The interpreter will run the initial procedure (start).
diff --git a/Master/xemtex/gslib/gs_kanji.ps b/Master/xemtex/gslib/gs_kanji.ps
new file mode 100644
index 00000000000..73514205904
--- /dev/null
+++ b/Master/xemtex/gslib/gs_kanji.ps
@@ -0,0 +1,159 @@
+% Copyright (C) 1994, 1995, 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_kanji.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/gs_ksb_e.ps b/Master/xemtex/gslib/gs_ksb_e.ps
new file mode 100644
index 00000000000..58993feaf12
--- /dev/null
+++ b/Master/xemtex/gslib/gs_ksb_e.ps
@@ -0,0 +1,65 @@
+% Copyright (C) 1994 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_ksb_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/gs_l.xbm b/Master/xemtex/gslib/gs_l.xbm
new file mode 100644
index 00000000000..4f9de445487
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/gs_l.xpm b/Master/xemtex/gslib/gs_l.xpm
new file mode 100644
index 00000000000..ef898c29c8c
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/gs_l2img.ps b/Master/xemtex/gslib/gs_l2img.ps
new file mode 100644
index 00000000000..39188c68ade
--- /dev/null
+++ b/Master/xemtex/gslib/gs_l2img.ps
@@ -0,0 +1,185 @@
+% Copyright (C) 1995, 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_l2img.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Emulate the Level 2 dictionary-based image operator in Level 1,
+% except for Interpolate (ignored) and MultipleDataSources = true;
+% also, we require that the data source be either a procedure of a
+% particular form or a stream, not a string or a general procedure.
+
+% pdf2ps copies the portion of this file from %BEGIN to %END if Level 1
+% compatible output is requested.
+
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+
+/packedarray where
+ { pop }
+ { /packedarray { array astore readonly } bind def }
+ifelse
+
+%BEGIN
+
+11 dict /.csncompdict 1 index def begin
+ /DeviceGray { 1 /setgray load } bind def
+ /DeviceRGB { 3 /setrgbcolor load } bind def
+ /DeviceCMYK { 4 /setcmykcolor load } bind def
+ /Indexed
+ { dup 1 index 1 get //.csncompdict exch get exec
+ % Stack: [/Indexed base hival map] ncomp basesetcolor
+ 3 -1 roll 3 get mark 3 1 roll
+ % Stack: ncomp -mark- basesetcolor map
+ dup type /stringtype eq
+ { { -
+ { exch round cvi get 255 div
+ }
+ -
+ { exch round cvi 3 mul 2 copy 2 copy get 255 div
+ 3 1 roll 1 add get 255 div
+ 4 2 roll 2 add get 255 div
+ }
+ { exch round cvi 4 mul 2 copy 2 copy 2 copy get 255 div
+ 3 1 roll 1 add get 255 div
+ 4 2 roll 2 add get 255 div
+ 5 3 roll 3 add get 255 div
+ }
+ }
+ 4 index get aload pop counttomark -1 roll
+ }
+ { /exec load 3 -1 roll
+ % Stack: -mark- mapproc --exec-- basesetcolor
+ }
+ ifelse .packtomark cvx
+ exch pop 1 exch
+ } bind def
+ /Separation
+ { dup 2 index //.csncompdict exch get exec
+ % Stack: [/Separation name alt xform] ncomp altsetcolor
+ 3 -1 roll 3 get /exec load 3 -1 roll 3 array astore readonly cvx
+ exch pop 1 exch
+ } bind def
+ % Substitute device spaces for CIE spaces.
+ /CIEBasedA /DeviceGray load def
+ /CIEBasedABC /DeviceRGB load def
+ /CIEBasedDEF /DeviceRGB load def
+ /CIEBasedDEFG /DeviceCMYK load def
+end
+
+/.packtomark { counttomark packedarray exch pop } bind def
+
+/.csinextbits % - .csinextbits <bits>
+ % Uses b, nnb, i, row, mask, BitsPerComponent;
+ % sets b, nnb, i.
+ { /nnb nnb BitsPerComponent add
+ { dup 0 le { exit } if
+ /b b 8 bitshift row i get add def
+ /i i 1 add def 8 sub
+ }
+ loop def
+ b nnb bitshift mask and
+ } bind def
+
+% Note that the ColorSpace key must be present in the image dictionary.
+/.colorspaceimage % <imagedict> .colorspaceimage -
+ { save exch
+ dup length 15 add dict begin { cvlit def } forall
+ ColorSpace dup dup type /nametype ne { 0 get } if
+ .csncompdict exch get exec
+ /setpixelcolor exch def /ncomp exch def pop
+ /row ncomp BitsPerComponent mul Width mul 7 add 8 idiv string def
+ /mask 1 BitsPerComponent bitshift 1 sub def
+ /nextbits BitsPerComponent 8 eq
+ { { row i get /i i 1 add def } }
+ { /.csinextbits load }
+ ifelse def
+ /nextpixel mark 0 2 ncomp 1 sub 2 mul
+ { /nextbits cvx exch
+ Decode exch 2 getinterval
+ dup aload pop exch sub
+ dup mask eq { pop } { mask div /mul load 3 -1 roll } ifelse
+ 0 get dup 0 eq { pop } { /sub load 3 -1 roll } ifelse
+ }
+ for
+ /setpixelcolor load dup type /operatortype ne { /exec load } if
+ .packtomark cvx def
+ /readrow
+ /DataSource load dup type
+ dup /arraytype eq exch /packedarraytype eq or
+ { % Must be { <file> <string> ... }
+ aload length 1 add array /pop load exch astore
+ dup 1 row put cvx
+ }
+ { pop
+ % Adobe requires readstring to signal an error if given
+ % an empty string. Work around this nonsense here.
+ row length 0 eq
+ { { } }
+ { { DataSource row readstring pop pop } }
+ ifelse
+ }
+ ifelse def
+ ImageMatrix matrix invertmatrix concat
+ /imat matrix def
+ 0 1 Height 1 sub
+ { imat 5 3 -1 roll neg put
+ readrow
+ /b 0 def /nnb 0 def /i 0 def
+ 0 1 Width 1 sub
+ { imat 4 3 -1 roll neg put nextpixel
+ 1 1 true imat {<80>} imagemask
+ }
+ for
+ }
+ for
+ end restore
+ } bind def
+
+%END
+exec
+currentfile closefile
+
+% Patch for testing.
+/.cincompdict 3 dict begin
+ 1 { {0 1} {/DeviceGray} } def
+ 3 { {0 1 0 1 0 1} {/DeviceRGB} } def
+ 4 { {0 1 0 1 0 1 0 1} {/DeviceCMYK} } def
+currentdict end def
+/.imagekeys [
+ /Decode /DataSource /ImageMatrix /BitsPerComponent /Height /Width
+] def
+/colorimage % <width> <height> <bits/comp> <matrix>
+ % <datasrc> false <ncomp> colorimage -
+ { 1 index { /colorimage load /rangecheck signalerror } if exch pop
+ //.cincompdict exch get exec
+ 7 dict begin /ColorSpace exch cvlit def
+ .imagekeys { exch cvlit def } forall
+ currentdict end .colorspaceimage
+ } bind odef
+/image
+ { dup type /dicttype ne
+ { 7 dict begin /ColorSpace /DeviceGray def [0 1]
+ .imagekeys { exch cvlit def } forall
+ currentdict end
+ }
+ { dup length 1 add dict .copydict dup /ColorSpace currentcolorspace put
+ }
+ ifelse
+ .colorspaceimage
+ } bind odef
+
+exec
diff --git a/Master/xemtex/gslib/gs_l_m.xbm b/Master/xemtex/gslib/gs_l_m.xbm
new file mode 100644
index 00000000000..0253814e7b0
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/gs_lev2.ps b/Master/xemtex/gslib/gs_lev2.ps
new file mode 100644
index 00000000000..70b62018752
--- /dev/null
+++ b/Master/xemtex/gslib/gs_lev2.ps
@@ -0,0 +1,935 @@
+% Copyright (C) 1990, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_lev2.ps,v 1.7.2.4.2.3 2003/04/12 14:02:38 giles Exp $
+% Initialization file for Level 2 functions.
+% When this is run, systemdict is still writable,
+% but (almost) everything defined here goes into level2dict.
+
+level2dict begin
+
+% ------ System and user parameters ------ %
+
+% User parameters must obey save/restore, and must also be maintained
+% per-context. We implement the former, and some of the latter, here
+% with PostScript code. NOTE: our implementation assumes that user
+% parameters change only as a result of setuserparams -- that there are
+% no user parameters that are ever changed dynamically by the interpreter
+% (although the interpreter may adjust the value presented to setuserparams)
+%
+% There are two types of user parameters: those which are actually
+% maintained in the interpreter, and those which exist only at the
+% PostScript level. We maintain the current state of both types in
+% a read-only local dictionary named userparams, defined in systemdict.
+% In a multi-context system, each context has its own copy of this
+% dictionary. In addition, there is a constant dictionary named
+% psuserparams where each key is the name of a user parameter that exists
+% only in PostScript and the value is a procedure to check that the value
+% is legal: setuserparams uses this for checking the values.
+% setuserparams updates userparams explicitly, in addition to setting
+% any user parameters in the interpreter; thus we can use userparams
+% to reset those parameters after a restore or a context switch.
+% NOTE: the name userparams is known to the interpreter, and in fact
+% the interpreter creates the userparams dictionary.
+
+% Check parameters that are managed at the PostScript level.
+/.checkparamtype { % <newvalue> <type> .checkparamtype <bool>
+ exch type eq
+} .bind def
+/.checksetparams { % <newdict> <opname> <checkdict>
+ % .checksetparams <newdict>
+ 2 index {
+ % Stack: newdict opname checkdict key newvalue
+ 3 copy 3 1 roll .knownget {
+ exec not {
+ pop pop pop load /typecheck signalerror
+ } if
+ dup type /stringtype eq {
+ dup rcheck not {
+ pop pop pop load /invalidaccess signalerror
+ } if
+ } if
+ } {
+ pop
+ } ifelse pop pop
+ } forall pop pop
+} .bind def % not odef, shouldn't reset stacks
+
+% currentuser/systemparams creates and returns a dictionary in the
+% current VM. The easiest way to make this work is to copy any composite
+% PostScript-level parameters to global VM. Currently we have strings
+% as well as arrays. For arrays, we also need to copy any contents that
+% are in VM. Also copying string parameters insures the contents won't
+% be changed. Also be careful to preserve 'executable' state.
+/.copyparam { % <value> .copyparam <value'>
+ dup type /arraytype eq {
+ .currentglobal true .setglobal exch
+ dup xcheck exch % original executable state
+ [ exch {
+ dup type dup /arraytype eq exch /stringtype eq or {
+ .copyparam % recurse to handle composite array elements
+ } if
+ } forall ]
+ exch { cvx } if % set executable state
+ exch .setglobal
+ } if
+ dup type /stringtype eq {
+ .currentglobal true .setglobal
+ 1 index length string exch .setglobal
+ copy readonly
+ } if
+} .bind def
+
+% Some user parameters are managed entirely at the PostScript level.
+% We take care of that here.
+systemdict begin
+/psuserparams 48 dict def
+/getuserparam { % <name> getuserparam <value>
+ /userparams .systemvar 1 index get exch pop
+} odef
+% Fill in userparams (created by the interpreter) with current values.
+mark .currentuserparams
+counttomark 2 idiv {
+ userparams 3 1 roll put
+} repeat pop
+/.definepsuserparam { % <name> <value> .definepsuserparam -
+ psuserparams 3 copy pop
+ type cvlit /.checkparamtype cvx 2 packedarray cvx put
+ userparams 3 1 roll put
+} .bind def
+end
+/currentuserparams { % - currentuserparams <dict>
+ /userparams .systemvar dup length dict .copydict
+} odef
+/setuserparams { % <dict> setuserparams -
+ % Check that we will be able to set the PostScript-level
+ % user parameters.
+ /setuserparams /psuserparams .systemvar .checksetparams
+ % Set the C-level user params. If this succeeds, we know that
+ % the password check succeeded.
+ dup .setuserparams
+ % Now set the PostScript-level params.
+ % The interpreter may have adjusted the values of some of the
+ % parameters, so we have to read them back.
+ dup {
+ /userparams .systemvar 2 index known {
+ psuserparams 2 index known not {
+ pop dup .getuserparam
+ } if
+ .copyparam
+ /userparams .systemvar 3 1 roll .forceput % userparams is read-only
+ } {
+ pop pop
+ } ifelse
+ } forall
+ % A context switch might have occurred during the above loop,
+ % causing the interpreter-level parameters to be reset.
+ % Set them again to the new values. From here on, we are safe,
+ % since a context switch will consult userparams.
+ .setuserparams
+} .bind odef
+% Initialize user parameters managed here.
+/JobName () .definepsuserparam
+
+% Restore must restore the user parameters.
+% (Since userparams is in local VM, save takes care of saving them.)
+/restore { % <save> restore -
+ //restore /userparams .systemvar .setuserparams
+} .bind odef
+
+% The pssystemparams dictionary holds some system parameters that
+% are managed entirely at the PostScript level.
+systemdict begin
+currentdict /pssystemparams known not {
+ /pssystemparams 40 dict readonly def
+} if
+/getsystemparam { % <name> getsystemparam <value>
+ //pssystemparams 1 index .knownget { exch pop } { .getsystemparam } ifelse
+} odef
+end
+/currentsystemparams { % - currentsystemparams <dict>
+ mark .currentsystemparams //pssystemparams { } forall .dicttomark
+} odef
+/setsystemparams { % <dict> setsystemparams -
+ % Check that we will be able to set the PostScript-level
+ % system parameters.
+ /SAFETY .systemvar /safe get {
+ % SAFER mode disallows some changes
+ [ /GenericResourceDir /FontResourceDir /GenericResourcePathSep ] {
+ 2 copy .knownget {
+ exch //pssystemparams exch .knownget {
+ ne { /setsystemparams /invalidaccess signalerror } if
+ } {
+ pop
+ } ifelse
+ } {
+ pop
+ } ifelse
+ } forall
+ } if
+ /setsystemparams //pssystemparams mark exch {
+ type cvlit /.checkparamtype cvx 2 packedarray cvx
+ } forall .dicttomark .checksetparams
+ % Set the C-level system params. If this succeeds, we know that
+ % the password check succeeded.
+ dup .setsystemparams
+ % Now set the PostScript-level params. We must copy local strings
+ % into global VM.
+ dup
+ { //pssystemparams 2 index known
+ { % Stack: key newvalue
+ .copyparam
+ //pssystemparams 3 1 roll .forceput % pssystemparams is read-only
+ }
+ { pop pop
+ }
+ ifelse
+ }
+ forall pop
+} .bind odef
+
+% Initialize the passwords.
+% NOTE: the names StartJobPassword and SystemParamsPassword are known to
+% the interpreter, and must be bound to noaccess strings.
+% The length of these strings must be max_password (iutil2.h) + 1.
+/StartJobPassword 65 string noaccess def
+/SystemParamsPassword 65 string noaccess def
+
+% Redefine cache parameter setting to interact properly with userparams.
+/setcachelimit {
+ mark /MaxFontItem 2 index .dicttomark setuserparams pop
+} .bind odef
+/setcacheparams {
+ % The MaxFontCache parameter is a system parameter, which we might
+ % not be able to set. Fortunately, this doesn't matter, because
+ % system parameters don't have to be synchronized between this code
+ % and the VM.
+ counttomark 1 add copy setcacheparams
+ currentcacheparams % mark size lower upper
+ 3 -1 roll pop
+ /MinFontCompress 3 1 roll
+ /MaxFontItem exch
+ .dicttomark setuserparams
+ cleartomark
+} .bind odef
+
+% Add bogus user and system parameters to satisfy badly written PostScript
+% programs that incorrectly assume the existence of all the parameters
+% listed in Appendix C of the Red Book. Note that some of these may become
+% real parameters later: code near the end of gs_init.ps takes care of
+% removing any such parameters from ps{user,system}params.
+
+% psuserparams
+ /MaxFormItem 100000 .definepsuserparam
+ /MaxPatternItem 20000 .definepsuserparam
+ /MaxScreenItem 48000 .definepsuserparam
+ /MaxUPathItem 5000 .definepsuserparam
+
+% File Access Permission parameters
+ .currentglobal true .setglobal
+ /.checkFilePermitparams {
+ type /arraytype eq {
+ currentuserparams /LockFilePermissions get {
+ 5 { pop } repeat /setuserparams /invalidaccess signalerror
+ }
+ if
+ } {
+ 5 { pop } repeat /setuserparams /typecheck signalerror
+ }
+ ifelse
+ true
+ } .bind def
+% Initialize the File Permission access control to wide open
+% These will only be accessed via current/set userparams.
+% Values are a string containing multiple nul terminated path strings
+ /PermitFileReading dup [ (*) ] .definepsuserparam
+ psuserparams exch /.checkFilePermitparams load put
+ /PermitFileWriting dup [ (*) ] .definepsuserparam
+ psuserparams exch /.checkFilePermitparams load put
+ /PermitFileControl dup [ (*) ] .definepsuserparam
+ psuserparams exch /.checkFilePermitparams load put
+ .setglobal
+
+pssystemparams begin
+ /CurDisplayList 0 .forcedef
+ /CurFormCache 0 .forcedef
+ /CurOutlineCache 0 .forcedef
+ /CurPatternCache 0 .forcedef
+ /CurUPathCache 0 .forcedef
+ /CurScreenStorage 0 .forcedef
+ /CurSourceList 0 .forcedef
+ /DoPrintErrors false .forcedef
+ /MaxDisplayList 140000 .forcedef
+ /MaxFormCache 100000 .forcedef
+ /MaxOutlineCache 65000 .forcedef
+ /MaxPatternCache 100000 .forcedef
+ /MaxUPathCache 300000 .forcedef
+ /MaxScreenStorage 84000 .forcedef
+ /MaxSourceList 25000 .forcedef
+ /RamSize 4194304 .forcedef
+end
+
+% Define the procedures for handling comment scanning. The names
+% %ProcessComment and %ProcessDSCComment are known to the interpreter.
+% These procedures take the file and comment string and file as operands.
+/.checkprocesscomment {
+ dup null eq {
+ pop true
+ } {
+ dup xcheck {
+ type dup /arraytype eq exch /packedarraytype eq or
+ } {
+ pop false
+ } ifelse
+ } ifelse
+} .bind def
+/ProcessComment null .definepsuserparam
+psuserparams /ProcessComment {.checkprocesscomment} put
+(%ProcessComment) cvn {
+ /ProcessComment getuserparam
+ dup null eq { pop pop pop } { exec } ifelse
+} bind def
+/ProcessDSCComment null .definepsuserparam
+psuserparams /ProcessDSCComment {.checkprocesscomment} put
+(%ProcessDSCComment) cvn {
+ /ProcessDSCComment getuserparam
+ dup null eq { pop pop pop } { exec } ifelse
+} bind def
+
+% ------ Miscellaneous ------ %
+
+(<<) cvn % - << -mark-
+ /mark load def
+(>>) cvn % -mark- <key1> <value1> ... >> <dict>
+ /.dicttomark load def
+/languagelevel 2 def
+% When running in Level 2 mode, this interpreter is supposed to be
+% compatible with Adobe version 2017.
+/version (2017) readonly def
+
+% If binary tokens are supported by this interpreter,
+% set an appropriate default binary object format.
+/setobjectformat where
+ { pop
+ /RealFormat getsystemparam (IEEE) eq { 1 } { 3 } ifelse
+ /ByteOrder getsystemparam { 1 add } if
+ setobjectformat
+ } if
+
+% Aldus Freehand versions 2.x check for the presence of the
+% setcolor operator, and if it is missing, substitute a procedure.
+% Unfortunately, the procedure takes different parameters from
+% the operator. As a result, files produced by this application
+% cause an error if the setcolor operator is actually defined
+% and 'bind' is ever used. Aldus fixed this bug in Freehand 3.0,
+% but there are a lot of files created by the older versions
+% still floating around. Therefore, at Adobe's suggestion,
+% we implement the following dreadful hack in the 'where' operator:
+% If the key is /setcolor, and
+% there is a dictionary named FreeHandDict, and
+% currentdict is that dictionary,
+% then "where" consults only that dictionary and not any other
+% dictionaries on the dictionary stack.
+.wheredict /setcolor {
+ /FreeHandDict .where {
+ /FreeHandDict get currentdict eq {
+ pop currentdict /setcolor known { currentdict true } { false } ifelse
+ } {
+ .where
+ } ifelse
+ } {
+ .where
+ } ifelse
+} bind put
+
+% ------ Virtual memory ------ %
+
+/currentglobal % - currentglobal <bool>
+ /currentshared load def
+/gcheck % <obj> gcheck <bool>
+ /scheck load def
+/setglobal % <bool> setglobal -
+ /setshared load def
+% We can make the global dictionaries very small, because they auto-expand.
+/globaldict currentdict /shareddict .knownget not { 4 dict } if def
+/GlobalFontDirectory SharedFontDirectory def
+
+% VMReclaim and VMThreshold are user parameters.
+/setvmthreshold { % <int> setvmthreshold -
+ mark /VMThreshold 2 index .dicttomark setuserparams pop
+} odef
+/vmreclaim { % <int> vmreclaim -
+ dup 0 gt {
+ .vmreclaim
+ } {
+ mark /VMReclaim 2 index .dicttomark setuserparams pop
+ } ifelse
+} odef
+-1 setvmthreshold
+
+% ------ IODevices ------ %
+
+/.getdevparams where {
+ pop /currentdevparams { % <iodevice> currentdevparams <dict>
+ .getdevparams .dicttomark
+ } odef
+} if
+/.putdevparams where {
+ pop /setdevparams { % <iodevice> <dict> setdevparams -
+ mark 1 index { } forall counttomark 2 add index
+ .putdevparams pop pop
+ } odef
+} if
+
+% ------ Job control ------ %
+
+serverdict begin
+
+% We could protect the job information better, but we aren't attempting
+% (currently) to protect ourselves against maliciousness.
+
+/.jobsave null def % top-level save object
+/.jobsavelevel 0 def % save depth of job (0 if .jobsave is null,
+ % 1 otherwise)
+/.adminjob true def % status of current unencapsulated job
+
+end % serverdict
+
+% Because there may be objects on the e-stack created since the job save,
+% we have to clear the e-stack before doing the end-of-job restore.
+% We do this by executing a 2 .stop, which is caught by the 2 .stopped
+% in .runexec; we leave on the o-stack a procedure to execute aftewards.
+%
+%**************** The definition of startjob is not complete yet, since
+% it doesn't reset stdin/stdout.
+/.startnewjob { % <exit_bool> <password_level>
+ % .startnewjob -
+ serverdict /.jobsave get dup null eq { pop } { restore } ifelse
+ exch {
+ % Unencapsulated job
+ serverdict /.jobsave null put
+ serverdict /.jobsavelevel 0 put
+ serverdict /.adminjob 3 -1 roll 1 gt put
+ % The Adobe documentation doesn't say what happens to the
+ % graphics state stack in this case, but an experiment
+ % produced results suggesting that a grestoreall occurs.
+ grestoreall
+ } {
+ % Encapsulated job
+ pop
+ serverdict /.jobsave save put
+ serverdict /.jobsavelevel 1 put
+ } ifelse
+ % Reset the interpreter state.
+ clear cleardictstack
+ initgraphics
+ false setglobal
+} bind def
+/.startjob { % <exit_bool> <password> <finish_proc>
+ % .startjob <ok_bool>
+ vmstatus pop pop serverdict /.jobsavelevel get eq
+ 2 index .checkpassword 0 gt and {
+ exch .checkpassword exch count 3 roll count 3 sub { pop } repeat
+ cleardictstack
+ % Reset the e-stack back to the 2 .stopped in .runexec,
+ % passing the finish_proc to be executed afterwards.
+ 2 .stop
+ } { % Password check failed
+ pop pop pop false
+ } ifelse
+} odef
+/startjob { % <exit_bool> <password> startjob <ok_bool>
+ % This is a hack. We really need some way to indicate explicitly
+ % to the interpreter that we are under control of a job server.
+ .userdict /quit /stop load put
+ { .startnewjob true } .startjob
+} odef
+
+systemdict begin
+/quit { % - quit -
+ //systemdict begin serverdict /.jobsave get null eq
+ { end //quit }
+ { /quit load /invalidaccess /signalerror load end exec }
+ ifelse
+} bind odef
+end
+
+% We would like to define exitserver as a procedure, using the code
+% that the Red Book says is equivalent to it. However, since startjob
+% resets the exec stack, we can't do this, because control would never
+% proceed past the call on startjob if the exitserver is successful.
+% Instead, we need to construct exitserver out of pieces of startjob.
+
+serverdict begin
+
+/exitserver { % <password> exitserver -
+ true exch { .startnewjob } .startjob not {
+ /exitserver /invalidaccess signalerror
+ } if
+} bind def
+
+end % serverdict
+
+% ------ Compatibility ------ %
+
+% In Level 2 mode, the following replace the definitions that gs_statd.ps
+% installs in statusdict and serverdict.
+% Note that statusdict must be allocated in local VM.
+% We don't bother with many of these yet.
+
+/.dict1 { exch mark 3 1 roll .dicttomark } bind def
+
+currentglobal false setglobal 25 dict exch setglobal begin
+currentsystemparams
+
+% The following do not depend on the presence of setpagedevice.
+/buildtime 1 index /BuildTime get def
+/byteorder 1 index /ByteOrder get def
+/checkpassword { .checkpassword 0 gt } bind def
+dup /DoStartPage known
+ { /dostartpage { /DoStartPage getsystemparam } bind def
+ /setdostartpage { /DoStartPage .dict1 setsystemparams } bind def
+ } if
+dup /StartupMode known
+ { /dosysstart { /StartupMode getsystemparam 0 ne } bind def
+ /setdosysstart { { 1 } { 0 } ifelse /StartupMode .dict1 setsystemparams } bind def
+ } if
+%****** Setting jobname is supposed to set userparams.JobName, too.
+/jobname { /JobName getuserparam } bind def
+/jobtimeout { /JobTimeout getuserparam } bind def
+/ramsize { /RamSize getsystemparam } bind def
+/realformat 1 index /RealFormat get def
+dup /PrinterName known
+ { /setprintername { /PrinterName .dict1 setsystemparams } bind def
+ } if
+/printername
+ { currentsystemparams /PrinterName .knownget not { () } if exch copy
+ } bind def
+currentuserparams /WaitTimeout known
+ { /waittimeout { /WaitTimeout getuserparam } bind def
+ } if
+
+% The following do require setpagedevice.
+/.setpagedevice where { pop } { (%END PAGEDEVICE) .skipeof } ifelse
+/defaulttimeouts
+ { currentsystemparams dup
+ /JobTimeout .knownget not { 0 } if
+ exch /WaitTimeout .knownget not { 0 } if
+ currentpagedevice /ManualFeedTimeout .knownget not { 0 } if
+ } bind def
+/margins
+ { currentpagedevice /Margins .knownget { exch } { [0 0] } ifelse
+ } bind def
+/pagemargin
+ { currentpagedevice /PageOffset .knownget { 0 get } { 0 } ifelse
+ } bind def
+/pageparams
+ { currentpagedevice
+ dup /Orientation .knownget { 1 and ORIENT1 { 1 xor } if } { 0 } ifelse exch
+ dup /PageSize get aload pop 3 index 0 ne { exch } if 3 2 roll
+ /PageOffset .knownget { 0 get } { 0 } ifelse 4 -1 roll
+ } bind def
+/setdefaulttimeouts
+ { exch mark /ManualFeedTimeout 3 -1 roll
+ /Policies mark /ManualFeedTimeout 1 .dicttomark
+ .dicttomark setpagedevice
+ /WaitTimeout exch mark /JobTimeout 5 2 roll .dicttomark setsystemparams
+ } bind def
+/.setpagesize { 2 array astore /PageSize .dict1 setpagedevice } bind def
+/setduplexmode { /Duplex .dict1 setpagedevice } bind def
+/setmargins
+ { exch 2 array astore /Margins .dict1 setpagedevice
+ } bind def
+/setpagemargin { 0 2 array astore /PageOffset .dict1 setpagedevice } bind def
+/setpageparams
+ { mark /PageSize 6 -2 roll
+ 4 index 1 and ORIENT1 { 1 } { 0 } ifelse ne { exch } if 2 array astore
+ /Orientation 5 -1 roll ORIENT1 { 1 xor } if
+ /PageOffset counttomark 2 add -1 roll 0 2 array astore
+ .dicttomark setpagedevice
+ } bind def
+/setresolution
+ { dup 2 array astore /HWResolution .dict1 setpagedevice
+ } bind def
+%END PAGEDEVICE
+
+% The following are not implemented yet.
+%manualfeed
+%manualfeedtimeout
+%pagecount
+%pagestackorder
+%setpagestackorder
+
+pop % currentsystemparams
+
+% Flag the current dictionary so it will be swapped when we
+% change language levels. (See zmisc2.c for more information.)
+/statusdict currentdict def
+
+currentdict end
+/statusdict exch .forcedef % statusdict is local, systemdict is global
+
+% The following compatibility operators are in systemdict. They are
+% defined here, rather than in gs_init.ps, because they require the
+% resource machinery.
+
+/devforall { % <pattern> <proc> <scratch> devforall -
+ exch {
+ 1 index currentdevparams
+ /Type .knownget { /FileSystem eq } { false } ifelse
+ { exec } { pop pop } ifelse
+ } /exec load 3 packedarray cvx exch
+ (*) 3 1 roll ppstack flush /IODevice resourceforall
+} odef
+/devstatus { % <(%disk*%)> devstatus <searchable> <writable>
+ % <hasNames> <mounted> <removable> <searchOrder>
+ % <freePages> <size> true
+ % <string> devstatus false
+ dup length 5 ge {
+ dup 0 5 getinterval (%disk) eq {
+ dup /IODevice resourcestatus {
+ pop pop dup currentdevparams
+ dup /Searchable get
+ exch dup /Writable get
+ exch dup /HasNames get
+ exch dup /Mounted get
+ exch dup /Removable get
+ exch dup /SearchOrder get
+ exch dup /Free get
+ exch /LogicalSize get
+ 9 -1 roll pop true
+ } {
+ pop false
+ } ifelse
+ } {
+ pop false
+ } ifelse
+ } {
+ pop false
+ } ifelse
+} odef
+
+% ------ Color spaces ------ %
+
+% Attempt to convert a tint transformation procedure to a type 4 Function.
+% The value <m> is the number of function inputs
+% The current color space defines the number of function output values.
+% The current color space will be the alternate color space for the function.
+% If the conversion fails then build a color cube function.
+
+/.converttinttransform { % [.. .. .. proc ] <m>
+ % .converttinttransform [.. .. .. proc']
+ .currentglobal % Save current global memory state
+ 2 index gcheck .setglobal % Set gobal mode to match the array's mode
+ 4 dict % Build a dictionary for our type 4 function
+ dup /FunctionType 4 put % Set FunctionType
+ dup /Function 5 index 3 get put % Set function expression
+ % Stack: orig m global func
+ dup /Domain
+ [ 5 index {0 1} repeat ] put % set Domain values
+ dup /Range
+ [ mark currentcolor counttomark
+ dup 2 add 1 roll cleartomark % # of components in alternate space
+ {0 1} repeat ] put % Set Range values
+ { .buildfunction } .internalstopped % Try to build a type 4 function
+ dup
+ { % type 4 function failed - Collect data for a color cube
+ pop % Remove duplicate copy of stopped status
+ pop % Remove invalid type 4 function
+ 1 index % Get number of inputs
+ mark currentcolor counttomark % Count number of output colors
+ dup 2 add 1 roll cleartomark % # of components in alternate space
+ 4 index 3 get % Get tint transform function
+ { .buildcolorcube } .internalstopped
+ } if
+ { % Color cube build failed
+ pop pop pop exch pop exch pop % Remove unused parameters
+ .setglobal % Restore global state
+ } { % Function build succeeded - install function
+ % Stack: orig m global func
+ 3 -1 roll pop % Stack: orig global func
+ 2 index 4 array copy dup 3 4 -1 roll put
+ exch .setglobal exch pop
+ } ifelse
+} bind def
+
+% Define the setcolorspace procedures:
+% <colorspace> proc <colorspace'|null>
+% We have to define the dictionary first, so it can be bound into the
+% implementation procedure, but we can't populate it until the procedure
+% has been defined, so that the procedure can get bound into recursive calls.
+/colorspacedict 20 dict def
+
+/.devcs [
+ /DeviceGray /DeviceRGB /DeviceCMYK /DevicePixel
+] readonly def
+/currentcolorspace { % - currentcolorspace <array>
+ .currentcolorspace dup type /integertype eq {
+ //.devcs exch 1 getinterval
+ } if
+} odef
+currentdict /.devcs .undef
+
+/setcolorspace { % <name|array> setcolorspace -
+ dup dup dup type /nametype ne { 0 get } if
+ //colorspacedict exch get exec
+ dup null eq { pop } { .setcolorspace } ifelse pop
+} odef
+
+colorspacedict
+ dup /DeviceGray { pop 0 setgray null } bind put
+ dup /DeviceRGB { pop 0 0 0 setrgbcolor null } bind put
+ /setcmykcolor where
+ { pop dup /DeviceCMYK { pop 0 0 0 1 setcmykcolor null } bind put
+ } if
+ /.setcieaspace where
+ { pop dup /CIEBasedA { NOCIE { pop 0 setgray null } { dup 1 get .setcieaspace } ifelse } bind put
+ } if
+ /.setcieabcspace where
+ { pop dup /CIEBasedABC { NOCIE { pop 0 0 0 setrgbcolor null } { dup 1 get .setcieabcspace } ifelse } bind put
+ } if
+ /.setciedefspace where
+ { pop dup /CIEBasedDEF { NOCIE { pop 0 0 0 setrgbcolor null } { dup 1 get .setciedefspace } ifelse } bind put
+ } if
+ /.setciedefgspace where
+ { pop dup /CIEBasedDEFG { NOCIE { pop 0 0 0 1 setcmykcolor null } { dup 1 get .setciedefgspace } ifelse } bind put
+ } if
+ /.setseparationspace where
+ { pop dup /Separation { dup 2 get setcolorspace dup 1 .converttinttransform .setseparationspace } bind put
+ } if
+ /.setindexedspace where
+ { pop dup /Indexed { dup 1 get setcolorspace dup .setindexedspace } bind put
+ } if
+ /.nullpatternspace [/Pattern] readonly def
+ /.setpatternspace where
+ { pop dup /Pattern
+ { dup type /nametype eq { pop //.nullpatternspace } if
+ dup length 1 gt { dup 1 get setcolorspace } if
+ dup .setpatternspace
+ } bind put
+ } if
+ % If DeviceN space is included, gs_ll3.ps registers it.
+ /.setdevicepixelspace where
+ { pop dup /DevicePixel { dup .setdevicepixelspace } bind put
+ } if
+ currentdict /.nullpatternspace .undef
+pop
+
+% ------ CIE color rendering ------ %
+
+% Define findcolorrendering and a default ColorRendering ProcSet.
+
+/findcolorrendering { % <intentname> findcolorrendering
+ % <crdname> <found>
+ /ColorRendering /ProcSet findresource
+ 1 index .namestring (.) concatstrings
+ 1 index /GetPageDeviceName get exec .namestring (.) concatstrings
+ 2 index /GetHalftoneName get exec .namestring
+ concatstrings concatstrings
+ dup /ColorRendering resourcestatus {
+ pop pop exch pop exch pop true
+ } {
+ pop /GetSubstituteCRD get exec false
+ } ifelse
+} odef
+
+5 dict dup begin
+
+/GetPageDeviceName { % - GetPageDeviceName <name>
+ currentpagedevice dup /PageDeviceName .knownget {
+ exch pop dup null eq { pop /none } if
+ } {
+ pop /none
+ } ifelse
+} bind def
+
+/GetHalftoneName { % - GetHalftoneName <name>
+ currenthalftone /HalftoneName .knownget not { /none } if
+} bind def
+
+/GetSubstituteCRD { % <intentname> GetSubstituteCRD <crdname>
+ pop /DefaultColorRendering
+} bind def
+
+end
+% The resource machinery hasn't been activated, so just save the ProcSet
+% and let .fixresources finish the installation process.
+/ColorRendering exch def
+
+% Define setcolorrendering.
+
+/.colorrenderingtypes 5 dict def
+
+/setcolorrendering { % <crd> setcolorrendering -
+ dup /ColorRenderingType get //.colorrenderingtypes exch get exec
+} odef
+
+/.setcolorrendering1 where { pop } { (%END CRD) .skipeof } ifelse
+
+.colorrenderingtypes 1 {
+ dup .buildcolorrendering1 .setcolorrendering1
+} .bind put
+
+% Note: the value 101 in the next line must be the same as the value of
+% GX_DEVICE_CRD1_TYPE in gscrdp.h.
+.colorrenderingtypes 101 {
+ dup .builddevicecolorrendering1 .setdevicecolorrendering1
+} .bind put
+
+% Initialize the default CIE rendering dictionary.
+% The most common CIE files seem to assume the "calibrated RGB color space"
+% described on p. 189 of the PostScript Language Reference Manual,
+% 2nd Edition; we simply invert this transformation back to RGB.
+mark
+ /ColorRenderingType 1
+% We must make RangePQR and RangeLMN large enough so that values computed by
+% the assumed encoding MatrixLMN don't get clamped.
+ /RangePQR [0 0.9505 0 1 0 1.0890] readonly
+% This TransformPQR implements a relative colorimetric intent by scaling
+% the XYZ values relative to the white and black points.
+ /TransformPQR
+ [ { 5 1 roll % p Ws Bs Wd Bd
+ 4 {3 get 5 1 roll} repeat % ws bs wd bd p
+ 3 index sub % ws bs wd bd p-bs
+ 1 index % ws bs wd bd p-bs bd
+ 6 2 roll % p-bs bd ws bs wd bd
+ sub % p-bs bd ws bs wd-bd
+ 5 1 roll % wd-bd p-bs bd ws bs
+ sub % wd-bd p-bs bd ws-bs
+ 4 2 roll % bd ws-bs wd-bd p-bs
+ mul % bd ws-bs (wd-bd)*(p-bs)
+ exch div add % bd + (wd-bd)*(p-bs)/(ws-bs)
+ } bind
+ { 5 1 roll
+ 4 {4 get 5 1 roll} repeat
+ 3 index sub 1 index 6 2 roll sub 5 1 roll
+ sub 4 2 roll mul exch div add
+ } bind
+ { 5 1 roll
+ 4 {5 get 5 1 roll} repeat
+ 3 index sub 1 index 6 2 roll sub 5 1 roll
+ sub 4 2 roll mul exch div add
+ } bind
+ ] readonly
+ /RangeLMN [0 0.9505 0 1 0 1.0890] readonly
+ /MatrixABC
+ [ 3.24063 -0.96893 0.05571
+ -1.53721 1.87576 -0.20402
+ -0.49863 0.04152 1.05700
+ ] readonly
+ /EncodeABC [ {0 .max 0.45 exp} bind dup dup] readonly
+ /WhitePoint [0.9505 1 1.0890] readonly
+ % Some Genoa tests seem to require the presence of BlackPoint.
+ /BlackPoint [0 0 0] readonly
+.dicttomark setcolorrendering
+
+%END CRD
+
+% Initialize a CIEBased color space for sRGB.
+/CIEsRGB [ /CIEBasedABC
+ mark
+ /DecodeLMN [ {
+ dup 0.03928 le { 12.92321 div } { 0.055 add 1.055 div 2.4 exp } ifelse
+ } bind dup dup ] readonly
+ /MatrixLMN [
+ 0.412457 0.212673 0.019334
+ 0.357576 0.715152 0.119192
+ 0.180437 0.072175 0.950301
+ ] readonly
+ /WhitePoint [0.9505 1.0 1.0890] readonly
+ .dicttomark readonly
+] readonly def
+
+% ------ Painting ------ %
+
+% A straightforward definition of execform that doesn't actually
+% do any caching.
+/.execform1 {
+ % This is a separate operator so that the stacks will be restored
+ % properly if an error occurs.
+ dup /Matrix get concat
+ dup /BBox get aload pop
+ exch 3 index sub exch 2 index sub rectclip
+ dup /PaintProc get
+ 1 index /Implementation known not {
+ 1 index dup /Implementation null .forceput readonly pop
+ } if
+ exec
+} .bind odef % must bind .forceput
+
+/.formtypes 5 dict
+ dup 1 /.execform1 load put
+def
+
+/execform { % <form> execform -
+ gsave {
+ dup /FormType get //.formtypes exch get exec
+ } stopped grestore { stop } if
+} odef
+
+/.patterntypes 5 dict
+ dup 1 /.buildpattern1 load put
+def
+
+/makepattern { % <proto_dict> <matrix> makepattern <pattern>
+ //.patterntypes 2 index /PatternType get get
+ .currentglobal false .setglobal exch
+ % Stack: proto matrix global buildproc
+ 3 index dup length 1 add dict .copydict
+ 3 index 3 -1 roll exec 3 -1 roll .setglobal
+ 1 index /Implementation 3 -1 roll put
+ readonly exch pop exch pop
+} odef
+
+/setpattern { % [<comp1> ...] <pattern> setpattern -
+ currentcolorspace 0 get /Pattern ne {
+ [ /Pattern currentcolorspace ] setcolorspace
+ } if setcolor
+} odef
+
+% Extend image and imagemask to accept dictionaries.
+% We must create .imagetypes and .imagemasktypes outside level2dict,
+% and leave some extra space because we're still in Level 1 mode.
+systemdict begin
+/.imagetypes 5 dict
+ dup 1 /.image1 load put
+def
+/.imagemasktypes 5 dict
+ dup 1 /.imagemask1 load put
+def
+end
+
+/.image /image load def
+/image {
+ dup type /dicttype eq {
+ dup /ImageType get //.imagetypes exch get exec
+ } {
+ //.image
+ } ifelse
+} odef
+currentdict /.image undef
+
+/.imagemask /imagemask load def
+/imagemask {
+ dup type /dicttype eq {
+ dup /ImageType get //.imagemasktypes exch get exec
+ } {
+ //.imagemask
+ } ifelse
+} odef
+currentdict /.imagemask undef
+
+end % level2dict
diff --git a/Master/xemtex/gslib/gs_lgo_e.ps b/Master/xemtex/gslib/gs_lgo_e.ps
new file mode 100644
index 00000000000..3b692eaa468
--- /dev/null
+++ b/Master/xemtex/gslib/gs_lgo_e.ps
@@ -0,0 +1,92 @@
+% Copyright (C) 1999, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_lgo_e.ps,v 1.3.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/gs_lgx_e.ps b/Master/xemtex/gslib/gs_lgx_e.ps
new file mode 100644
index 00000000000..45ec80400f9
--- /dev/null
+++ b/Master/xemtex/gslib/gs_lgx_e.ps
@@ -0,0 +1,61 @@
+% Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_lgx_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/gs_ll3.ps b/Master/xemtex/gslib/gs_ll3.ps
new file mode 100644
index 00000000000..dfcd3a09445
--- /dev/null
+++ b/Master/xemtex/gslib/gs_ll3.ps
@@ -0,0 +1,469 @@
+% Copyright (C) 1997, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_ll3.ps,v 1.10.2.2.2.1 2003/04/12 14:02:38 giles Exp $
+% Initialization file for PostScript LanguageLevel 3 functions.
+% This file must be loaded after gs_lev2.ps and gs_res.ps.
+% These definitions go into ll3dict or various ProcSets.
+% NOTE: the interpreter creates ll3dict.
+
+ll3dict begin
+
+% We need LanguageLevel 2 or higher in order to have setuserparams and
+% defineresource.
+languagelevel dup 2 .max .setlanguagelevel
+
+% ------ Idiom recognition ------ %
+
+/IdiomRecognition false .definepsuserparam
+
+% Modify `bind' to apply idiom recognition afterwards.
+/.bindscratch 128 string def
+% Do the right thing if NOBIND or DELAYBIND is in effect.
+% Note also that since this definition of `bind' may get bound in,
+% it has to function properly even at lower language levels,
+% where IdiomRecognition may not be defined.
+/bind load /.bind load ne
+/bind { % <proc> bind <proc'>
+ //.bind currentuserparams /IdiomRecognition
+ .knownget not { false } if {
+ (*) {
+ /IdiomSet findresource
+ false exch {
+ % Stack: proc false dummykey [template substitute]
+ exch pop dup 1 get exch 0 get
+ % Stack: proc false substitute template
+ 3 index .eqproc {
+ 2 index gcheck 1 index gcheck not and {
+ pop
+ } {
+ 3 -1 roll pop exch not exit
+ } ifelse
+ } {
+ pop
+ } ifelse
+ } forall { exit } if
+ } //.bindscratch /IdiomSet resourceforall
+ } if
+} odef
+{ /.bind /bind load def
+ /bind { } def
+} if
+currentdict /.bindscratch .undef
+
+% ------ HalftoneTypes 6, 10, 16 and HalftoneMode ------ %
+
+% This code depends on an internal HalftoneType 7 with the following keys:
+% Width, Height, Width2, Height2, TransferFunction:
+% as for HalftoneType 16.
+% Thresholds: a string or bytestring holding the thresholds,
+% (Width x Height + Width2 x Height2) x BitsPerSample / 8 bytes,
+% as for HalftoneType 16 except that the samples may be either
+% 8 or 16 bits wide.
+% BitsPerSample: 8 or 16.
+
+% Note that this HalftoneType never appears in halftone dictionaries given
+% to sethalftone, only as a component in those given to .sethalftone5,
+% so its numeric value can be chosen ad lib as long as it differs from the
+% other values that are legal in component dictionaries for .sethalftone5
+% (currently only 1 and 3).
+
+/.makehalftone7 { % <dict> <dict> <source> <Width> <Height>
+ % (<Width2> <Height2> | null) <BPS> .makehalftone7
+ % <setdict> <dict5> { .sethalftone5 }
+ 8 dict begin
+ /HalftoneType 7 def
+ /BitsPerSample exch def
+ dup null eq {
+ pop 0
+ } {
+ /Height2 1 index def /Width2 2 index def mul
+ } ifelse 3 1 roll
+ /Height 1 index def
+ /Width 2 index def
+ mul add BitsPerSample 8 idiv mul .bigstring
+ % Stack: dict dict source str
+ dup type /stringtype eq { readstring } { .readbytestring } ifelse
+ not { /sethalftone load /rangecheck signalerror exit } if
+ readonly /Thresholds exch def
+ /TransferFunction .knownget { /TransferFunction exch def } if
+ % If the original Thresholds was a file, replace it with
+ % a new one.
+ dup /Thresholds get type /filetype eq {
+ dup /Thresholds [ Thresholds ] cvx 0 () .subfiledecode put
+ } if
+ mark /HalftoneType 5 /Default currentdict end .dicttomark
+ { .sethalftone5 }
+} bind def
+
+/.bigstring { % <size> .bigstring <string|bytestring>
+ dup 65400 gt { .bytestring } { string } ifelse
+} bind def
+
+/.readbytestring { % <source> <bytestring> .readbytestring
+ % <bytestring> <filled>
+ % Note that since bytestrings don't implement getinterval,
+ % if filled is false, there is no way to tell how much
+ % was read.
+ true exch 0 1 2 index length 1 sub {
+ % Stack: source true str index
+ 3 index read not { pop exch not exch exit } if
+ 3 copy put pop pop
+ } for 3 -1 roll pop exch
+} bind def
+
+/.sethalftone6 { % <dict> <dict> .sethalftone6 <setdict> <dict5>
+ % { .sethalftone5 }
+ % Keys: Width, Height, Thresholds, T'Function
+ dup /Thresholds get
+ 1 index /Width get 2 index /Height get
+ null 8 .makehalftone7
+} bind def
+
+/.sethalftone10 { % <dict> <dict> .sethalftone10 <setdict> <dict5>
+ % { .sethalftone5 }
+ % Keys: Xsquare, Ysquare, Thresholds, T'Function
+ % Note that this is the only one of these three HalftoneTypes
+ % that allows either a file or a string for Thresholds.
+ dup /Thresholds get dup type /stringtype eq { 0 () .subfiledecode } if
+ 1 index /Xsquare get dup 3 index /Ysquare get dup
+ 8 .makehalftone7
+} bind def
+
+/.sethalftone16 { % <dict> <dict> .sethalftone16 <setdict> <dict5>
+ % { .sethalftone5 }
+ % Keys: Width, Height, Width2, Height2,
+ % Thresholds, T'Function
+ dup /Thresholds get
+ 1 index /Width get 2 index /Height get
+ 3 index /Width2 .knownget { % 2-rectangle case
+ 4 index /Height2 get
+ } { % 1-rectangle case
+ null
+ } ifelse 16 .makehalftone7
+} bind def
+
+.halftonetypes begin
+ 6 /.sethalftone6 load def
+ 10 /.sethalftone10 load def
+ 16 /.sethalftone16 load def
+end
+
+% Redefine the halftone-setting operators to honor HalftoneMode.
+/setcolorscreen {
+ /HalftoneMode getuserparam 0 eq {
+ //setcolorscreen
+ } {
+ 12 { pop } repeat .getdefaulthalftone
+ { //sethalftone }
+ { .setdefaulthalftone }
+ ifelse
+ } ifelse
+} odef
+/setscreen {
+ /HalftoneMode getuserparam 0 eq {
+ //setscreen
+ } {
+ pop pop pop .getdefaulthalftone
+ { //sethalftone }
+ { .setdefaulthalftone }
+ ifelse
+ } ifelse
+} odef
+/sethalftone {
+ /HalftoneMode getuserparam 0 eq {
+ //sethalftone
+ } {
+ pop .getdefaulthalftone
+ { //sethalftone }
+ { .setdefaulthalftone }
+ ifelse
+ } ifelse
+} odef
+
+% ------ ImageTypes 3 and 4 (masked images) ------ %
+
+.imagetypes
+ dup 3 /.image3 load put
+ dup 4 /.image4 load put
+% We also detect ImageType 103 here: it isn't worth making a separate file
+% just for this.
+ /.image3x where { pop dup 103 /.image3x load put } if
+pop
+
+% ------ Functions ------ %
+
+% Define the FunctionType resource category.
+/Generic /Category findresource dup maxlength 3 add dict .copydict begin
+ /InstanceType /integertype def
+/FunctionType currentdict end /Category defineresource pop
+
+{0 2 3} { dup /FunctionType defineresource pop } forall
+
+% ------ Smooth shading ------ %
+
+% Define the ShadingType resource category.
+/Generic /Category findresource dup maxlength 3 add dict .copydict begin
+ /InstanceType /integertype def
+/ShadingType currentdict end /Category defineresource pop
+
+systemdict /.shadingtypes mark % not ll3dict
+ 1 /.buildshading1 load
+ 2 /.buildshading2 load
+ 3 /.buildshading3 load
+ 4 /.buildshading4 load
+ 5 /.buildshading5 load
+ 6 /.buildshading6 load
+ 7 /.buildshading7 load
+.dicttomark put
+
+systemdict /.reuseparamdict mark
+ /Intent 2
+ /AsyncRead false
+ /CloseSource true
+.dicttomark readonly put
+/.buildshading { % <shadingdict> .buildshading <shading>
+ % Unfortunately, we always need to make the DataSource reusable,
+ % because if clipping is involved, even shfill may need to read
+ % the source data multiple times. If it weren't for this,
+ % we would only need to create a reusable stream if the ultimate
+ % source of the data is a procedure (since the library can't
+ % suspend shading to do a procedure callout).
+ dup /DataSource .knownget {
+ dup type /filetype eq {
+ //.reuseparamdict /ReusableStreamDecode filter
+ .currentglobal 1 index gcheck .setglobal
+ % Stack: shdict rsdfile saveglobal
+ 2 index dup length dict copy exch .setglobal
+ dup /DataSource 4 -1 roll put exch pop
+ } {
+ pop
+ } ifelse
+ } if
+ % The .buildshading operators use the current color space
+ % for ColorSpace.
+ dup /ShadingType get //.shadingtypes exch get
+ 1 index /ColorSpace get setcolorspace exec
+} bind def
+systemdict /.reuseparamdict undef
+
+/.buildpattern2 { % <template> <matrix> .buildpattern2
+ % <template> <pattern>
+ % We want to build the pattern without doing gsave/grestore,
+ % since we want it to load the CIE caches.
+ 1 index /Shading get
+ mark currentcolor currentcolorspace
+ counttomark 4 add -3 roll mark 4 1 roll
+ % Stack: -mark- ..color.. cspace -mark- template matrix shadingdict
+ { .buildshading } stopped {
+ cleartomark setcolorspace setcolor pop stop
+ } if
+ .buildshadingpattern
+ 3 -1 roll pop counttomark 1 add 2 roll setcolorspace setcolor pop
+} bind def
+
+.patterntypes
+ 2 /.buildpattern2 load put
+
+/shfill { % <shadingdict> shfill -
+ % Currently, .shfill requires that the color space
+ % in the pattern be the current color space.
+ dup gsave { .buildshading .shfill } stopped grestore { stop } if
+ pop
+} odef
+
+% Establish an initial smoothness value that matches Adobe RIPs.
+0.02 setsmoothness
+
+% ------ UseCIEColor ------ %
+
+% The library maintains and detects the UseCIEColor device parameter,
+% but it doesn't have access to the resource dictionaries. We also
+% want color space substitution to work in systems without a PostScript
+% interpreter. Therefore, we eagerly inform the library of changes in
+% the (effective) ColorSpace category that might affect the operation of
+% UseCIEColor. We must notice the following events:
+% 1) defineresource and undefineresource of the Default ColorSpaces.
+% 2) restore.
+% 3) Changes in current VM, which cause a different set of resources
+% to become visible.
+% #1 is rare. #2 is handled in C code. If checking the ColorSpace
+% category on #3 turns out to be expensive, we can cache more information
+% about whether these operations actually affect UseCIEColor.
+
+% This operator implements color space substitution in the library:
+% <index> <bool> .setsubstitutecolorspace -
+% <bool> = true means substitute the current color space for the one given
+% by <index>; <bool> = false means stop substituting. Substitution is not
+% affected by grestore/setgstate, but it is affected by restore.
+
+% ColorSpace defineresource and undefineresource for the Default keys
+% call .definedefaultcs and .undefinedefaultcs. See gs_res.ps.
+
+/.useciecolorkeydict mark
+ /UseCIEColor null
+.dicttomark readonly def
+/.definedefaultcs { % <index> <value> .definedefaultcs -
+ currentcolorspace
+ % Temporarily disable color substitution, in case the substitute
+ % color space is or mentions a color space that is currently
+ % being substituted.
+ currentdevice //.useciecolorkeydict .getdeviceparams exch pop exch pop
+ mark 5 -2 roll
+ % Stack: cspace UseCIEColor mark index value
+ { setcolorspace true .setsubstitutecolorspace }
+ stopped counttomark 1 add 1 roll cleartomark
+ % Stack: cspace UseCIEColor stopped?
+ 3 1 roll
+ currentdevice null true mark /UseCIEColor 6 -1 roll .putdeviceparams pop pop
+ setcolorspace { stop } if
+} bind def
+currentdict /.useciecolorkeydict undef
+
+/.undefinedefaultcs { % <index> .undefinedefaultcs -
+ false .setsubstitutecolorspace
+} bind def
+
+/.setdefaultcs { % <index> <value|null> .setdefaultcs -
+ dup null eq { pop .undefinedefaultcs } { .definedefaultcs } ifelse
+} bind def
+
+/.getdefaultcs { % <key> .getdefaultcs <value|null>
+ .GetInstance { 0 get } { null } ifelse
+} bind def
+
+/.setglobal { % <bool> .setglobal -
+ dup .currentglobal ne {
+ % If there are no local definitions of the Default keys,
+ % changing VM can't affect the definition of any resource.
+ /.localcsdefaults .uservar {
+ % We only want to change substitutions for color spaces
+ % whose definitions are actually changing.
+ /ColorSpace /Category findresource begin
+ /DefaultGray .getdefaultcs
+ /DefaultRGB .getdefaultcs
+ /DefaultCMYK .getdefaultcs
+ end
+ 3 index .setglobal
+ /ColorSpace /Category findresource begin
+ /DefaultGray .getdefaultcs
+ /DefaultRGB .getdefaultcs
+ /DefaultCMYK .getdefaultcs
+ end
+ % Stack: bool oldgray oldrgb oldcmyk
+ % newgray newrgb newcmyk
+ dup 4 index ne { 2 exch .setdefaultcs } { pop } ifelse
+ dup 4 index ne { 1 exch .setdefaultcs } { pop } ifelse
+ dup 4 index ne { 0 exch .setdefaultcs } { pop } ifelse
+ pop pop pop pop
+ } {
+ .setglobal
+ } ifelse
+ } {
+ .setglobal
+ } ifelse
+} .bind odef % bind in .setglobal
+
+
+% Define default device color spaces to allow substitution
+% on UseCIEColor == true :
+
+/DefaultGray
+[ /CIEBasedA
+ 3 dict begin
+ /WhitePoint [ 0.9505 1.0 1.089 ] def
+ /DecodeLMN [ { 1.8 exp } { 1.8 exp } { 1.8 exp } ] def
+ /MatrixLMN [ 0.4439 0.2522 0.0436 0.3341 0.6371 0.1387 0.1725 0.1107 0.9067 ] def
+ currentdict end
+]
+/ColorSpace defineresource pop
+
+/DefaultRGB
+[ /CIEBasedABC
+ 3 dict begin
+ /WhitePoint [ 0.9505 1.0 1.089 ] def
+ /DecodeLMN [ { 1.8 exp } { 1.8 exp } { 1.8 exp } ] def
+ /MatrixLMN [ 0.4439 0.2522 0.0436 0.3341 0.6371 0.1387 0.1725 0.1107 0.9067 ] def
+ currentdict end
+]
+/ColorSpace defineresource pop
+
+/DefaultCMYK
+[ /CIEBasedDEFG
+ 4 dict begin
+ /WhitePoint [ 0.9505 1.0 1.089 ] def
+ /Table [ 2 2 2 2
+ % Trivial table :
+ % [
+ % [ < FFFFFF 000000 FFFF00 000000>
+ % < FF00FF 000000 FF0000 000000> ]
+ % [ < 00FFFF 000000 00FF00 000000>
+ % < 0000FF 000000 000000 000000> ]
+ % ]
+
+ % AcrobatReader-compatible table :
+ [
+ [ < FFFFFF 000000 FFFF00 000000>
+ < EA007F 000000 FC000F 000000> ]
+
+ [ < 00A0C8 000000 008436 000000>
+ < 00007C 000000 000000 000000> ]
+ ]
+ ] def
+ /DecodeLMN [ { 1.8 exp } { 1.8 exp } { 1.8 exp } ] def
+ /MatrixLMN [ 0.4439 0.2522 0.0436 0.3341 0.6371 0.1387 0.1725 0.1107 0.9067 ] def
+ currentdict end
+]
+/ColorSpace defineresource pop
+
+
+% ------ DeviceN color space ------ %
+
+% This isn't quite right, because the ColorSpaceFamily resource will exist
+% even with languagelevel < 3, but it's close enough.
+
+/.setdevicenspace where {
+ pop colorspacedict /DeviceN {
+ dup 2 get setcolorspace dup
+ dup 1 get length % # of components
+ .converttinttransform .setdevicenspace
+ } bind put
+} if
+
+% ------ Miscellaneous ------ %
+
+% Define additional user and system parameters.
+/HalftoneMode 0 .definepsuserparam
+/MaxSuperScreen 1016 .definepsuserparam
+pssystemparams begin % read-only, so use .forcedef
+ /MaxDisplayAndSourceList 160000 .forcedef
+end
+
+% Define the IdiomSet resource category.
+{ /IdiomSet } {
+ /Generic /Category findresource dup maxlength 3 add dict .copydict begin
+ /InstanceType /dicttype def
+ currentdict end /Category defineresource pop
+} forall
+
+/languagelevel 3 def
+% When running in LanguageLevel 3 mode, this interpreter is supposed to be
+% compatible with Adobe version 3010.
+/version (3010) readonly def
+
+.setlanguagelevel
+
+end % ll3dict
diff --git a/Master/xemtex/gslib/gs_m.xbm b/Master/xemtex/gslib/gs_m.xbm
new file mode 100644
index 00000000000..a94e079e257
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/gs_m.xpm b/Master/xemtex/gslib/gs_m.xpm
new file mode 100644
index 00000000000..d99770097a9
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/gs_m_m.xbm b/Master/xemtex/gslib/gs_m_m.xbm
new file mode 100644
index 00000000000..c792a4f5239
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/gs_mex_e.ps b/Master/xemtex/gslib/gs_mex_e.ps
new file mode 100644
index 00000000000..227329a1e2a
--- /dev/null
+++ b/Master/xemtex/gslib/gs_mex_e.ps
@@ -0,0 +1,67 @@
+% Copyright (C) 1994, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_mex_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Define the MacExpert encoding vector.
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/MacExpertEncoding
+% \00x
+ /.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
+% \04x
+ /space /exclamsmall /Hungarumlautsmall /centoldstyle /dollaroldstyle /dollarsuperior /ampersandsmall /Acutesmall
+ /parenleftsuperior /parenrightsuperior /twodotenleader /onedotenleader /comma /hyphen /period /fraction
+ /zerooldstyle /oneoldstyle /twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle /sixoldstyle /sevenoldstyle
+ /eightoldstyle /nineoldstyle /colon /semicolon /.notdef /threequartersemdash /.notdef /questionsmall
+% \10x
+ /.notdef /.notdef /.notdef /.notdef /Ethsmall /.notdef /.notdef /onequarter
+ /onehalf /threequarters /oneeighth /threeeighths /fiveeighths /seveneighths /onethird /twothirds
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /ff /fi
+ /fl /ffi /ffl /parenleftinferior /.notdef /parenrightinferior /Circumflexsmall /hypheninferior
+% \14x
+ /Gravesmall /Asmall /Bsmall /Csmall /Dsmall /Esmall /Fsmall /Gsmall
+ /Hsmall /Ismall /Jsmall /Ksmall /Lsmall /Msmall /Nsmall /Osmall
+ /Psmall /Qsmall /Rsmall /Ssmall /Tsmall /Usmall /Vsmall /Wsmall
+ /Xsmall /Ysmall /Zsmall /colonmonetary /onefitted /rupiah /Tildesmall /.notdef
+% \20x
+ /.notdef /asuperior /centsuperior /.notdef /.notdef /.notdef /.notdef /Aacutesmall
+ /Agravesmall /Acircumflexsmall /Adieresissmall /Atildesmall /Aringsmall /Ccedillasmall /Eacutesmall /Egravesmall
+ /Ecircumflexsmall /Edieresissmall /Iacutesmall /Igravesmall /Icircumflexsmall /Idieresissmall /Ntildesmall /Oacutesmall
+ /Ogravesmall /Ocircumflexsmall /Odieresissmall /Otildesmall /Uacutesmall /Ugravesmall /Ucircumflexsmall /Udieresissmall
+% \24x
+ /.notdef /eightsuperior /fourinferior /threeinferior /sixinferior /eightinferior /seveninferior /Scaronsmall
+ /.notdef /centinferior /twoinferior /.notdef /Dieresissmall /.notdef /Caronsmall /osuperior
+ /fiveinferior /.notdef /commainferior /periodinferior /Yacutesmall /.notdef /dollarinferior /.notdef
+ /.notdef /Thornsmall /.notdef /nineinferior /zeroinferior /Zcaronsmall /AEsmall /Oslashsmall
+% \30x
+ /questiondownsmall /oneinferior /Lslashsmall /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /Cedillasmall /.notdef /.notdef /.notdef /.notdef /.notdef /OEsmall
+ /figuredash /hyphensuperior /.notdef /.notdef /.notdef /.notdef /exclamdownsmall /.notdef
+ /Ydieresissmall /.notdef /onesuperior /twosuperior /threesuperior /foursuperior /fivesuperior /sixsuperior
+% \34x
+ /sevensuperior /ninesuperior /zerosuperior /.notdef /esuperior /rsuperior /tsuperior /.notdef
+ /.notdef /isuperior /ssuperior /dsuperior /.notdef /.notdef /.notdef /.notdef
+ /.notdef /lsuperior /Ogoneksmall /Brevesmall /Macronsmall /bsuperior /nsuperior /msuperior
+ /commasuperior /periodsuperior /Dotaccentsmall /Ringsmall /.notdef /.notdef /.notdef /.notdef
+256 packedarray
+6 1 index .registerencoding
+.defineencoding
+exec
diff --git a/Master/xemtex/gslib/gs_mgl_e.ps b/Master/xemtex/gslib/gs_mgl_e.ps
new file mode 100644
index 00000000000..b3560b844ad
--- /dev/null
+++ b/Master/xemtex/gslib/gs_mgl_e.ps
@@ -0,0 +1,65 @@
+% Copyright (C) 1999, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_mgl_e.ps,v 1.3.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Define the Macintosh standard glyph encoding vector.
+% This is not an Encoding strictly speaking, but we treat it like one.
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/MacRomanEncoding .findencoding
+/MacGlyphEncoding
+ /.notdef /.null /CR
+% 3
+4 index 32 95 getinterval aload pop
+% 98
+99 index 128 45 getinterval aload pop
+% 143
+ /notequal /AE
+ /Oslash /infinity /plusminus /lessequal /greaterequal
+ /yen /mu1 /partialdiff /summation /product
+ /pi /integral /ordfeminine /ordmasculine /Ohm
+ /ae /oslash /questiondown /exclamdown /logicalnot
+ /radical /florin /approxequal /increment /guillemotleft
+ /guillemotright /ellipsis /nbspace
+% 173
+174 index 203 12 getinterval aload pop
+ /lozenge
+% 186
+187 index 216 24 getinterval aload pop
+ /applelogo
+% 211
+212 index 241 7 getinterval aload pop
+ /overscore
+% 219
+220 index 249 7 getinterval aload pop
+% 226
+ /Lslash /lslash /Scaron /scaron
+ /Zcaron /zcaron /brokenbar /Eth /eth
+ /Yacute /yacute /Thorn /thorn /minus
+ /multiply /onesuperior /twosuperior /threesuperior /onehalf
+ /onequarter /threequarters /franc /Gbreve /gbreve
+ % The TrueType documentation says the next glyph is named
+ % Idot, but the Adobe standard name for this glyph is
+ % Idotaccent.
+ /Idotaccent /Scedilla /scedilla /Cacute /cacute
+ /Ccaron /ccaron /dmacron
+260 -1 roll pop % delete MacRomanEncoding
+258 packedarray
+7 1 index .registerencoding
+.defineencoding
+exec
diff --git a/Master/xemtex/gslib/gs_mro_e.ps b/Master/xemtex/gslib/gs_mro_e.ps
new file mode 100644
index 00000000000..b9a06a45517
--- /dev/null
+++ b/Master/xemtex/gslib/gs_mro_e.ps
@@ -0,0 +1,62 @@
+% Copyright (C) 1994, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_mro_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Define the MacRoman encoding vector.
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/MacRomanEncoding
+StandardEncoding 0 39 getinterval aload pop
+ /quotesingle
+StandardEncoding 40 56 getinterval aload pop
+ /grave
+StandardEncoding 97 31 getinterval aload pop
+% \20x
+ /Adieresis /Aring /Ccedilla /Eacute /Ntilde /Odieresis /Udieresis /aacute
+ /agrave /acircumflex /adieresis /atilde /aring /ccedilla /eacute /egrave
+ /ecircumflex /edieresis /iacute /igrave
+ /icircumflex /idieresis /ntilde /oacute
+ /ograve /ocircumflex /odieresis /otilde
+ /uacute /ugrave /ucircumflex /udieresis
+% \24x
+ /dagger /degree /cent /sterling /section /bullet /paragraph /germandbls
+ /registered /copyright /trademark /acute /dieresis /.notdef /AE /Oslash
+ /.notdef /plusminus /.notdef /.notdef /yen /mu /.notdef /.notdef
+ /.notdef /.notdef /.notdef /ordfeminine /ordmasculine /.notdef /ae /oslash
+% \30x
+ /questiondown /exclamdown /logicalnot /.notdef
+ /florin /.notdef /.notdef /guillemotleft
+ /guillemotright /ellipsis /space /Agrave /Atilde /Otilde /OE /oe
+ /endash /emdash /quotedblleft /quotedblright
+ /quoteleft /quoteright /divide /.notdef
+ % NOTE: Euro should replace currency, but the PDF 1.3 documentation
+ % explicitly says it does not.
+ /ydieresis /Ydieresis /fraction /currency
+ /guilsinglleft /guilsinglright /fi /fl
+% \34x
+ /daggerdbl /periodcentered /quotesinglbase /quotedblbase
+ /perthousand /Acircumflex /Ecircumflex /Aacute
+ /Edieresis /Egrave /Iacute /Icircumflex
+ /Idieresis /Igrave /Oacute /Ocircumflex
+ /.notdef /Ograve /Uacute /Ucircumflex
+ /Ugrave /dotlessi /circumflex /tilde
+ /macron /breve /dotaccent /ring /cedilla /hungarumlaut /ogonek /caron
+256 packedarray
+5 1 index .registerencoding
+.defineencoding
+exec
diff --git a/Master/xemtex/gslib/gs_pdf_e.ps b/Master/xemtex/gslib/gs_pdf_e.ps
new file mode 100644
index 00000000000..dc36d89c72d
--- /dev/null
+++ b/Master/xemtex/gslib/gs_pdf_e.ps
@@ -0,0 +1,45 @@
+% Copyright (C) 1994, 1997, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_pdf_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Define the PDFDoc encoding vector.
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/PDFDocEncoding
+ISOLatin1Encoding 0 24 getinterval aload pop
+ /breve /caron /circumflex /dotaccent /hungarumlaut /ogonek /ring /tilde
+ISOLatin1Encoding 32 7 getinterval aload pop
+ /quotesingle
+ISOLatin1Encoding 40 5 getinterval aload pop
+ /hyphen
+ISOLatin1Encoding 46 50 getinterval aload pop
+ /grave
+ISOLatin1Encoding 97 31 getinterval aload pop
+% \20x
+ /bullet /dagger /daggerdbl /ellipsis /emdash /endash /florin /fraction
+ /guilsinglleft /guilsinglright /minus /perthousand
+ /quotedblbase /quotedblleft /quotedblright /quoteleft
+ /quoteright /quotesinglbase /trademark /fi /fl /Lslash /OE /Scaron
+ /Ydieresis /Zcaron /dotlessi /lslash /oe /scaron /zcaron /.notdef
+% \24x
+ /Euro
+ISOLatin1Encoding 161 12 getinterval aload pop
+ /.notdef
+ISOLatin1Encoding 174 82 getinterval aload pop
+256 packedarray .defineencoding
+exec
diff --git a/Master/xemtex/gslib/gs_pdfwr.ps b/Master/xemtex/gslib/gs_pdfwr.ps
new file mode 100644
index 00000000000..7d960cdd135
--- /dev/null
+++ b/Master/xemtex/gslib/gs_pdfwr.ps
@@ -0,0 +1,495 @@
+% Copyright (C) 1996, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_pdfwr.ps,v 1.11.2.1.2.1 2003/04/12 14:02:38 giles Exp $
+% PDF writer additions to systemdict.
+
+% This file should be included iff the pdfwrite "device" is included
+% in the executable.
+
+% ---------------- Predefined configurations ---------------- %
+
+% These correspond to the 3 predefined settings in Acrobat Distiller 4,
+% plus a "default" setting.
+
+% Parameters common to all configurations.
+% Note that we don't set AlwaysEmbed or NeverEmbed, since the default values
+% depend on the CompatibilityLevel and are initialized internally.
+/.defaultImageDict mark
+ /QFactor 0.9 /Blend 1
+ /HSamples [2 1 1 2] /VSamples [2 1 1 2]
+.dicttomark readonly def
+/.distillercommon mark
+ /ASCII85EncodePages false
+ /AntiAliasColorImages false
+ /AntiAliasGrayImages false
+ /AntiAliasMonoImages false
+ /AutoFilterColorImages true
+ /AutoFilterGrayImages true
+ /AutoFilterMonoImages true
+ /AutoPositionEPSFiles true
+ /Binding /Left
+ % What to do about the CalxxxProfiles?
+ /ColorACSImageDict .defaultImageDict
+ /ColorImageDepth -1
+ /ColorImageDict .defaultImageDict
+ /ColorImageDownsampleThreshold 1.5
+ /ColorImageFilter /DCTEncode
+ /CompressPages true
+ /ConvertImagesToIndexed true
+ /DefaultRenderingIntent /Default
+ /DetectBlends true
+ /DownsampleColorImages true
+ /DownsampleGrayImages true
+ /DownsampleMonoImages true
+ /EmitDSCWarnings false
+ /EncodeColorImages true
+ /EncodeGrayImages true
+ /EncodeMonoImages true
+ /EndPage -1
+ /GrayACSImageDict .defaultImageDict
+ /GrayImageDepth -1
+ /GrayImageDict .defaultImageDict
+ /GrayImageDownsampleThreshold 1.5
+ /GrayImageFilter /DCTEncode
+ /ImageMemory 500000
+ /LockDistillerParams false
+ /MaxSubsetPct 100
+ /MonoImageDepth -1
+ /MonoImageDict mark
+ /K -1
+ .dicttomark readonly
+ /MonoImageDownsampleThreshold 1.5
+ /MonoImageFilter /CCITTFaxEncode
+ /OPM 1
+ /Optimize true
+ /ParseDSCComments true
+ /ParseDSCCommentsForDocInfo true
+ /PreserveCopyPage true
+ /PreserveEPSInfo true
+ /PreserveHalftoneInfo false
+ /StartPage 1
+ /SubsetFonts true
+ /TransferFunctionInfo /Preserve
+ /UseFlateCompression true
+ /UsePrologue false
+.dicttomark readonly def
+
+/.distillersettings mark
+
+/default mark
+ /AutoRotatePages /PageByPage
+ /CannotEmbedFontPolicy /Warning
+ /DownsampleColorImages false
+ /DownsampleGrayImages false
+ /DownsampleMonoImages false
+ /Optimize false
+.dicttomark readonly
+
+/screen mark
+ /AutoRotatePages /PageByPage
+ /CannotEmbedFontPolicy /Warning
+ /ColorConversionStrategy /sRGB
+ /ColorImageDownsampleType /Average
+ /ColorImageResolution 72
+ /CompatibilityLevel 1.2
+ /CreateJobTicket false
+ /DoThumbnails false
+ /DownsampleColorImages true
+ /DownsampleGrayImages true
+ /DownsampleMonoImages true
+ /EmbedAllFonts false
+ /GrayImageDownsampleType /Average
+ /GrayImageResolution 72
+ /MonoImageDownsampleType /Average
+ /MonoImageResolution 300
+ /ParseDSCCommentsForDocInfo false
+ /PreserveOPIComments false
+ /PreserveOverprintSettings false
+ /UCRandBGInfo /Remove
+.dicttomark readonly
+
+/.printerACSImageDict mark
+ /QFactor 0.55 /Blend 1
+ /HSamples [2 1 1 2] /VSamples [2 1 1 2]
+.dicttomark readonly def
+/printer mark
+ /AutoRotatePages /None
+ /CannotEmbedFontPolicy /Warning
+ /ColorACSImageDict .printerACSImageDict
+ /ColorConversionStrategy /UseDeviceIndependentColor
+ /ColorImageDownsampleType /Bicubic
+ /ColorImageResolution 300
+ /CompatibilityLevel 1.3
+ /CreateJobTicket true
+ /DoThumbnails false
+ /EmbedAllFonts true
+ /GrayACSImageDict .printerACSImageDict
+ /GrayImageDownsampleType /Bicubic
+ /GrayImageResolution 300
+ /MonoImageDownsampleType /Bicubic
+ /MonoImageResolution 1200
+ /ParseDSCCommentsForDocInfo true
+ /PreserveOPIComments true
+ /PreserveOverprintSettings true
+ /UCRandBGInfo /Preserve
+.dicttomark readonly
+
+/.prepressACSImageDict mark
+ /QFactor 0.25
+ /HSamples [1 1 1 1] /VSamples [1 1 1 1]
+.dicttomark readonly def
+/prepress mark
+ /AutoRotatePages /None
+ /CannotEmbedFontPolicy /Error
+ /ColorACSImageDict .prepressACSImageDict
+ /ColorConversionStrategy /LeaveColorUnchanged
+ /ColorImageDownsampleType /Bicubic
+ /ColorImageResolution 300
+ /CompatibilityLevel 1.3
+ /CreateJobTicket true
+ /DoThumbnails true
+ /EmbedAllFonts true
+ /GrayACSImageDict .prepressACSImageDict
+ /GrayImageDownsampleType /Bicubic
+ /GrayImageResolution 300
+ /MonoImageDownsampleType /Bicubic
+ /MonoImageResolution 1200
+ /ParseDSCCommentsForDocInfo true
+ /PreserveOPIComments true
+ /PreserveOverprintSettings true
+ /UCRandBGInfo /Preserve
+.dicttomark readonly
+
+.dicttomark readonly def
+
+% ---------------- End of predefined configurations ---------------- %
+
+% Set optimizations for converting PostScript to PDF.
+% The ps2pdf* scripts invoke this.
+/.setpdfwrite { % - .setpdfwrite -
+ % Set a large VM threshold to reduce garbage collection.
+ currentuserparams /VMThreshold get 3000000 .max setvmthreshold
+ % Install a level of 'save' to reduce font loading.
+ save pop
+} bind def
+
+% ---------------- pdfmark and DSC processing ---------------- %
+
+% Encode values to pass for the /pdfmark or /DSC pseudo-parameter.
+/.pdf===dict mark
+ /arraytype
+ { dup xcheck { ({) (}) } { ([) (]) } ifelse
+ % Stack: file obj left right
+ 4 1 roll 2 index exch writestring () exch
+ { exch 2 index exch writestring
+ 1 index exch pdf===only ( )
+ }
+ forall pop exch writestring
+ } bind
+ /packedarraytype 1 index
+ /dicttype
+ { 1 index (<<\n) writestring
+ { 2 index 3 -1 roll pdf===only 1 index ( ) writestring
+ 1 index exch pdf===only dup (\n) writestring
+ }
+ forall (>>) writestring
+ } bind
+.dicttomark readonly def
+/pdf===only { % <file> <obj> pdf===only -
+ .pdf===dict 1 index type .knownget { exec } { write===only } ifelse
+} bind def
+/.pdfcvbuf 10 string def % enough for most arguments
+userdict /.pdfcvstring () put
+/.pdfcvs { % <obj> .pdfcvs <string>
+ currentglobal exch false .setglobal
+ /.pdfcvstring () store
+ % We can't handle long values yet.
+ { pop dup length 0 eq { pop } {
+ /.pdfcvstring .pdfcvstring 3 -1 roll concatstrings store
+ } ifelse //.pdfcvbuf
+ } /NullEncode filter dup 3 -1 roll pdf===only
+ closefile
+ .setglobal .pdfcvstring
+} bind def
+
+% Redefine pdfmark to pass the data to the driver.
+% We use a pseudo-parameter named /pdfmark whose value is an array:
+% /key1 (value1) ... (CTM) /type
+/.pdfputparams { % -mark- <key1> <value1> ... .pdfputparams <result...>
+ currentdevice null false counttomark 1 add 3 roll
+ % Don't allow the page device to get cleared....
+ {.putdeviceparams} .currentpagedevice pop {.setpagedevice} 3 .execn
+} bind def
+% Convert relevant operands to strings in an array.
+/.pdfcvsloop { % -mark- values ... markname start step .pdfcvsloop
+ % [values ... ctm markname]
+ matrix currentmatrix .pdfcvs 4 1 roll
+ counttomark 1 add 2 roll
+ counttomark .localvmarray astore exch pop
+ 3 1 roll
+ % Stack: values start step
+ 2 index length 3 sub { 2 copy 2 copy get .pdfcvs put pop } for
+} bind def
+/.pdfcvsall { % -mark- values ... markname .pdfcvsall <<same>>
+ 0 1 .pdfcvsloop
+} bind def
+/.pdfcvseven { % -mark- key value ... markname .pdfcvseven <<same>>
+ 1 2 .pdfcvsloop
+} bind def
+/.pdfcvsnone { % -mark- values ... markname .pdfcvsnone <<same>>
+ 100000 1 .pdfcvsloop
+} bind def
+/.pdfcvsfirst { % -mark- first values ... markname .pdfcvsfirst<<same>>
+ .pdfcvsnone
+ dup 0 2 copy get .pdfcvs put
+} bind def
+% The procedures in the following dictionary are called with the entire
+% pdfmark operand list (including the pdfmark name) on the stack;
+% they may modify this ad lib. They must call .pdfcvsxxx.
+/.pdfmarkparams mark
+ % Unpack a dictionary for PUT, and don't convert stream data.
+ /PUT {
+ counttomark 3 eq {
+ 1 index type /dicttype eq {
+ pop { } forall /.PUTDICT .pdfcvsall
+ } {
+ pop dup type /filetype eq {
+ % Read the file into a sequence of strings.
+ % This isn't great, but it's simple.
+ {
+ dup 1000 string readstring not { exch exit } if
+ exch
+ } loop closefile
+ } if
+ /.PUTSTREAM .pdfcvsfirst
+ } ifelse
+ } {
+ .pdfcvsall
+ } ifelse
+ } bind
+ % Unpack the array for PUTINTERVAL.
+ /PUTINTERVAL {
+ pop aload pop /.PUTINTERVAL .pdfcvsall
+ } bind
+.dicttomark readonly def
+/.pdfparamerror { % ? ? ? -mark- ... <errname> <opname> .pdfparamerror -
+ counttomark 4 add 2 roll cleartomark pop pop pop
+ .systemvar exch signalerror
+} bind def
+/pdfmark { % -mark- <key> <value> ... <markname> pdfmark -
+ counttomark 1 add copy
+ //.pdfmarkparams 1 index .knownget { exec } { .pdfcvsall } ifelse
+ mark /pdfmark 3 -1 roll .pdfputparams
+ dup type /booleantype ne {
+ /pdfmark .pdfparamerror
+ } if cleartomark
+} odef
+userdict /pdfmark .undef
+currentdict /.pdfmarkparams .undef
+
+% Use the DSC processing hook to pass DSC comments to the driver.
+% We use a pseudo-parameter named DSC whose value is an array:
+% /key1 (value1) ... /type
+/.pdfdsc_dict 2 dict def
+/.pdfdsc { % <file> <DSC string> <dsc dict> [<prev proc>] .pdfdsc -
+ 0 get dup null ne { 4 copy exch pop exec } { pop } ifelse 3 -1 roll pop
+ % Stack: <dsc string> <dsc dict>
+ 20 .localvmdict 1 index { 3 copy put pop pop } forall
+ 3 -1 roll .parse_dsc_comments % <dsc dict> <dict> <type>
+ dup /NOP ne 2 index length 1 gt or { % Skip unparsed comments
+ DEBUG { (**** DSC comment: ) print dup == 1 index === flush } if
+ exch mark 4 1 roll {
+ % mark <key1> <value1> ... <dsc dict> <type> <key> <value>
+ 3 index 2 index known { % Skip the DSC_struct entry
+ pop pop
+ } {
+ .pdfcvs 4 -2 roll
+ } ifelse
+ } forall exch pop counttomark .localvmarray astore
+ mark /DSC 3 -1 roll .pdfputparams
+ dup type /booleantype ne {
+ /DSC .pdfparamerror
+ } {
+ cleartomark
+ } ifelse
+ } {
+ pop pop pop
+ } ifelse
+} bind def
+/.initialize_dsc_parser where {
+ pop 2 dict dup .initialize_dsc_parser readonly
+ currentuserparams /ProcessDSCComment get
+ 1 array astore % in case the value is executable
+ //.pdfdsc /exec load 4 array astore cvx readonly
+ << /ProcessDSCComment 3 -1 roll >> setuserparams
+} if
+
+% ---------------- {set,current}distillerparams ---------------- %
+
+% Define setdistillerparams / currentdistillerparams.
+% Distiller parameters are currently treated as device parameters.
+/.distillerparamkeys mark
+ % General parameters -- all distillers
+ /ASCII85EncodePages { }
+ /AutoRotatePages { }
+ /Binding { }
+ /CompressPages { }
+ /DefaultRenderingIntent { }
+ /DetectBlends { }
+ /DoThumbnails { }
+ /ImageMemory { }
+ /LockDistillerParams { }
+ /LZWEncodePages { }
+ /OPM { }
+ /PreserveHalftoneInfo { }
+ /PreserveOPIComments { }
+ /PreserveOverprintSettings { }
+ /TransferFunctionInfo { }
+ /UCRandBGInfo { }
+ /UseFlateCompression { }
+ % General parameters -- PDF writer
+ % StartPage and EndPage are renamed because EndPage
+ % clashes with a page device parameter.
+ /CoreDistVersion { }
+ /CompatibilityLevel { }
+ % ****** NOTE: StartPage and EndPage are disabled because
+ % ****** EndPage clashes with a page device parameter.
+% /EndPage { exch pop /PDFEndPage exch }
+ /PDFEndPage { pop pop }
+% /StartPage { exch pop /PDFStartPage exch }
+ /PDFStartPage { pop pop }
+ /Optimize { }
+ /ParseDSCCommentsForDocInfo { }
+ /ParseDSCComments { }
+ /EmitDSCWarnings { }
+ /CreateJobTicket { }
+ /PreserveEPSInfo { }
+ /AutoPositionEPSFiles { }
+ /PreserveCopyPage { }
+ /UsePrologue { }
+ % Color sampled image parameters
+ /ColorACSImageDict { }
+ /AntiAliasColorImages { }
+ /AutoFilterColorImages { }
+ /ColorImageDepth { }
+ /ColorImageDict { }
+ /DownsampleColorImages { }
+ /ColorImageDownsampleThreshold { }
+ /ColorImageDownsampleType { }
+ /EncodeColorImages { }
+ /ColorImageFilter { }
+ /ColorImageResolution { }
+ % Color processing parameters
+ /CalCMYKProfile { }
+ /CalGrayProfile { }
+ /CalRGBProfile { }
+ /sRGBProfile { }
+ /ColorConversionStrategy { }
+ /ConvertCMYKImagesToRGB { }
+ /ConvertImagesToIndexed { }
+ % Grayscale sampled image parameters
+ /GrayACSImageDict { }
+ /AntiAliasGrayImages { }
+ /AutoFilterGrayImages { }
+ /GrayImageDepth { }
+ /GrayImageDict { }
+ /DownsampleGrayImages { }
+ /GrayImageDownsampleThreshold { }
+ /GrayImageDownsampleType { }
+ /EncodeGrayImages { }
+ /GrayImageFilter { }
+ /GrayImageResolution { }
+ % Monochrome sampled image parameters
+ /AntiAliasMonoImages { }
+ /MonoImageDepth { }
+ /MonoImageDict { }
+ /DownsampleMonoImages { }
+ /MonoImageDownsampleThreshold { }
+ /MonoImageDownsampleType { }
+ /EncodeMonoImages { }
+ /MonoImageFilter { }
+ /MonoImageResolution { }
+ % Font embedding parameters
+ /AlwaysEmbed
+ { dup length 0 gt
+ { dup 0 get false eq
+ { dup length 1 sub 1 exch getinterval exch pop /~AlwaysEmbed exch
+ } if
+ } if
+ }
+ /NeverEmbed
+ { dup length 0 gt
+ { dup 0 get false eq
+ { dup length 1 sub 1 exch getinterval exch pop /~NeverEmbed exch
+ } if
+ } if
+ }
+ /CannotEmbedFontPolicy { }
+ /EmbedAllFonts { }
+ /MaxSubsetPct { }
+ /SubsetFonts { }
+.dicttomark readonly def
+/.distillerdevice
+ { currentdevice .devicename /pdfwrite eq
+ { currentdevice }
+ { /pdfwrite finddevice }
+ ifelse
+ } bind def
+/setdistillerparams { % <dict> setdistillerparams -
+ .distillerdevice null false mark 4 index {
+ //.distillerparamkeys 2 index .knownget { exec } { pop pop } ifelse
+ } forall .putdeviceparams
+ dup type /booleantype ne {
+ /setdistillerparams .pdfparamerror
+ } {
+ pop pop pop
+ } ifelse
+} odef
+/currentdistillerparams { % - currentdistillerparams <dict>
+ .distillerdevice //.distillerparamkeys .getdeviceparams .dicttomark
+ % Patch StartPage and EndPage
+ % ****** NOTE: StartPage and EndPage are disabled because
+ % ****** EndPage clashes with a page device parameter.
+% begin /StartPage PDFStartPage /EndPage PDFEndPage
+% currentdict dup /PDFStartPage undef /PDFEndPage undef
+% def def currentdict end
+} odef
+
+% Patch 'where' so that the distillerparams operators are only visible
+% if the pdfwrite device is the current one, for the benefit of badly
+% designed PostScript files that "know" they have to do something different
+% if a distiller is processing them.
+.wheredict /currentdistillerparams {
+ currentdevice .devicename /pdfwrite eq {
+ .where
+ } {
+ .where pop dup //systemdict eq { pop false } { true } ifelse
+ } ifelse
+} bind put
+.wheredict /setdistillerparams .wheredict /currentdistillerparams get put
+
+% Set a predefined configuration if PDFSETTINGS is defined.
+/PDFSETTINGS where { pop /PDFSETTINGS load } { /default } ifelse
+.distillersettings exch get
+% Don't override parameters defined on the command line.
+dup length .distillercommon length add dict begin
+.distillercommon 2 {
+ {
+ systemdict 2 index known { pop pop } { def } ifelse
+ } forall
+} repeat
+currentdict end setdistillerparams
diff --git a/Master/xemtex/gslib/gs_pfile.ps b/Master/xemtex/gslib/gs_pfile.ps
new file mode 100644
index 00000000000..34a8e48b0ce
--- /dev/null
+++ b/Master/xemtex/gslib/gs_pfile.ps
@@ -0,0 +1,128 @@
+% Copyright (C) 1994, 1995 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_pfile.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Runtime support for minimum-space fonts and packed files.
+
+% ****** NOTE: This file must be kept consistent with
+% ****** packfile.ps and wrfont.ps.
+
+% ---------------- Packed file support ---------------- %
+
+% A packed file is the concatenation of several file groups, each of which
+% is the result of compressing several files concatenated together.
+% The packed file begins with a procedure that creates an appropriate
+% decoding filter for each file group, as follows:
+% <group-subfile-filter> -proc- <group-decode-filter>
+% Thus, accessing an individual file requires 4 parameters:
+% the starting address and length of the outer compressed file,
+% and the starting address and length of the inner file.
+/.packedfilefilter % <file> <ostart> <olength> <istart> <ilength>
+ % .packedfilefilter <filter>
+ { 4 index systemdict begin token pop end 6 1 roll
+ % Stack: fproc file ostart olength istart ilength
+ 4 index 5 -1 roll setfileposition
+ % Stack: fproc file olength istart ilength
+ 4 -2 roll () /SubFileDecode filter
+ % Stack: fproc istart ilength ofilter
+ 4 -1 roll exec
+ % Filters don't support setfileposition, so we must skip data
+ % by reading it into a buffer. We rely on the fact that
+ % save/restore don't affect file positions.
+ % Stack: istart ilength dfilter
+ save exch 1000 string
+ % Stack: istart ilength save dfilter scratch
+ 4 index 1 index length idiv { 2 copy readstring pop pop } repeat
+ 2 copy 0 8 -1 roll 2 index length mod getinterval readstring pop pop pop
+ % Stack: ilength save dfilter
+ exch restore exch () /SubFileDecode filter
+ } bind def
+
+% Run a packed library file.
+/.runpackedlibfile % <filename> <ostart> <olength> <istart> <ilength>
+ % .runpackedlibfile
+ { 5 -1 roll findlibfile
+ { exch pop dup 6 2 roll .packedfilefilter
+ currentobjectformat exch 1 setobjectformat run
+ setobjectformat closefile
+ }
+ { 5 1 roll /findlibfile load /undefinedfilename signalerror
+ }
+ ifelse
+ } bind def
+
+% ---------------- Compacted font support ---------------- %
+
+% Compacted fonts written by wrfont.ps depend on the existence and
+% specifications of the procedures and data in this section.
+
+/.compactfontdefault mark
+ /PaintType 0
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly
+ /FontType 1
+ /Encoding StandardEncoding
+.dicttomark readonly def
+
+/.checkexistingfont % <fontname> <uid> <privatesize> <fontsize>
+ % .checkexistingfont
+ % {} (<font> on d-stack)
+ % <fontname> <uid> <privatesize> <fontsize>
+ % .checkexistingfont
+ % -save- --restore-- (<font> on d-stack)
+ { FontDirectory 4 index .knownget
+ { dup /UniqueID .knownget
+ { 4 index eq exch /FontType get 1 eq and }
+ { pop false }
+ ifelse
+ }
+ { false
+ }
+ ifelse
+ { save /restore load 6 2 roll }
+ { {} 5 1 roll }
+ ifelse
+ dict //.compactfontdefault exch .copydict begin
+ dict /Private exch def
+ Private begin
+ /MinFeature {16 16} def
+ /Password 5839 def
+ /UniqueID 1 index def
+ end
+ /UniqueID exch def
+ /FontName exch def
+ } bind def
+
+/.knownEncodings [
+ ISOLatin1Encoding
+ StandardEncoding
+ SymbolEncoding
+] readonly def
+
+/.readCharStrings % <count> <encrypt> .readCharStrings <dict>
+ { exch dup dict dup 3 -1 roll
+ { currentfile token pop dup type /integertype eq
+ { dup -8 bitshift //.knownEncodings exch get exch 255 and get } if
+ currentfile token pop dup type /nametype eq
+ { 2 index exch get
+ }
+ { % Stack: encrypt dict dict key value
+ 4 index { 4330 exch dup .type1encrypt exch pop } if
+ readonly
+ }
+ ifelse put dup
+ }
+ repeat pop exch pop
+ } bind def
diff --git a/Master/xemtex/gslib/gs_rdlin.ps b/Master/xemtex/gslib/gs_rdlin.ps
new file mode 100644
index 00000000000..026e3edf6c4
--- /dev/null
+++ b/Master/xemtex/gslib/gs_rdlin.ps
@@ -0,0 +1,21 @@
+% Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_rdlin.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Patch for systems with readline support in the interpreter.
+
+% Disable the prompt message, since readline will generate it.
+/.promptmsg { } def
diff --git a/Master/xemtex/gslib/gs_res.ps b/Master/xemtex/gslib/gs_res.ps
new file mode 100644
index 00000000000..67099d29102
--- /dev/null
+++ b/Master/xemtex/gslib/gs_res.ps
@@ -0,0 +1,928 @@
+% Copyright (C) 1994, 1996, 1997, 1998, 1999, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_res.ps,v 1.16.2.2.2.1 2003/04/12 14:02:38 giles Exp $
+% Initialization file for Level 2 resource machinery.
+% When this is run, systemdict is still writable,
+% but (almost) everything defined here goes into level2dict.
+
+level2dict begin
+
+(BEGIN RESOURCES) VMDEBUG
+
+% We keep track of (global) instances with another entry in the resource
+% dictionary, an .Instances dictionary. For categories with implicit
+% instances, the values in .Instances are the same as the keys;
+% for other categories, the values are [instance status size].
+
+% Note that the dictionary that defines a resource category is stored
+% in global VM. The PostScript manual says that each category must
+% manage global and local instances separately. However, objects in
+% global VM other than systemdict can't reference objects in local VM.
+% This means that the resource category dictionary, which would otherwise be
+% the obvious place to keep track of the instances, can't be used to keep
+% track of local instances. Instead, we define a dictionary in local VM
+% called localinstancedict, in which the key is the category name and
+% the value is the analogue of .Instances for local instances.
+
+% We don't currently implement automatic resource unloading.
+% When and if we do, it should be hooked to the garbage collector.
+% However, Ed Taft of Adobe says their interpreters don't implement this
+% either, so we aren't going to worry about it for a while.
+
+currentglobal false setglobal systemdict begin
+ /localinstancedict 5 dict
+ .forcedef % localinstancedict is local, systemdict is global
+end true setglobal
+/.emptydict 0 dict readonly def
+setglobal
+
+% Resource category dictionaries have the following keys (those marked with
+% * are optional):
+% Standard, defined in the Red Book:
+% Category (name)
+% *InstanceType (name)
+% DefineResource
+% <key> <instance> DefineResource <instance>
+% UndefineResource
+% <key> UndefineResource -
+% FindResource
+% <key> FindResource <instance>
+% ResourceStatus
+% <key> ResourceStatus <status> <size> true
+% <key> ResourceStatus false
+% ResourceForAll
+% <template> <proc> <scratch> ResourceForAll -
+% *ResourceFileName
+% <key> <scratch> ResourceFileName <filename>
+% Additional, specific to our implementation:
+% .Instances (dictionary)
+% .LocalInstances
+% - .LocalInstances <dict>
+% .GetInstance
+% <key> .GetInstance <instance> -true-
+% <key> .GetInstance -false-
+% .CheckResource
+% <key> <value> .CheckResource <key> <value> <ok>
+% (or may give an error if not OK)
+% .DoLoadResource
+% <key> .DoLoadResource <key> (may give an error)
+% .LoadResource
+% <key> .LoadResource - (may give an error)
+% .ResourceFile
+% <key> .ResourceFile <file> -true-
+% <key> .ResourceFile <key> -false-
+% .ResourceFileStatus
+% <key> .ResourceFileStatus 2 <vmusage> -true-
+% <key> .ResourceFileStatus -false-
+% All the above procedures expect that the top dictionary on the d-stack
+% is the resource dictionary.
+
+% Define enough of the Category category so we can define other categories.
+% The dictionary we're about to create will become the Category
+% category definition dictionary.
+
+% .findcategory and .resourceexec are only called from within the
+% implementation of the resource 'operators', so they doesn't have to worry
+% about cleaning up the stack if they fail (the interpreter's stack
+% protection machinery for pseudo-operators takes care of this).
+/.findcategory { % <name> .findcategory -
+ % (pushes the category on the dstack)
+ /Category findresource begin
+} bind def
+
+/.resourceexec { % <key> /xxxResource .resourceexec -
+ % (also pops the category from the dstack)
+ load exec end
+} bind def
+
+% .getvminstance treats instances on disk as undefined.
+/.getvminstance { % <key> .getvminstance <instance> -true-
+ % <key> .getvminstance -false-
+ .GetInstance {
+ dup 1 get 2 ne { true } { pop false } ifelse
+ } {
+ false
+ } ifelse
+} bind def
+
+20 dict begin
+
+ % Standard entries
+
+/Category /Category def
+/InstanceType /dicttype def
+
+/DefineResource {
+ .CheckResource {
+ dup /Category 3 index cvlit .growput
+ dup [ exch 0 -1 ] exch
+ .Instances 4 2 roll put
+ % Make the Category dictionary read-only. We will have to
+ % use .forceput / .forcedef later to replace the dummy,
+ % empty .Instances dictionary with the real one later.
+ readonly
+ } {
+ /defineresource load /typecheck signalerror
+ } ifelse
+} bind def
+/FindResource % (redefined below)
+ { .Instances exch get 0 get
+ } bind def
+
+ % Additional entries
+
+/.Instances 30 dict def
+.Instances /Category [currentdict 0 -1] put
+
+/.LocalInstances 0 dict def
+/.GetInstance
+ { .Instances exch .knownget
+ } bind def
+/.CheckResource
+ { dup gcheck currentglobal and
+ { /DefineResource /FindResource /ResourceForAll /ResourceStatus
+ /UndefineResource }
+ { 2 index exch known and }
+ forall
+ not { /defineresource load /invalidaccess signalerror } if
+ true
+ } bind def
+
+.Instances end begin % for the base case of findresource
+
+(END CATEGORY) VMDEBUG
+
+% Define the resource operators. We use the "stack protection" feature of
+% odef to make sure the stacks are restored properly on an error.
+% This requires that the operators not pop anything from the stack until
+% they have executed their logic successfully. We can't make this
+% work for resourceforall, because the procedure it executes mustn't see
+% the operands of resourceforall on the stack, but we can make it work for
+% the others.
+
+% findresource is the only operator that needs to bind //Category.
+/findresource { % <key> <category> findresource <instance>
+ 2 copy dup /Category eq
+ { pop //Category 0 get begin } { .findcategory } ifelse
+ /FindResource .resourceexec exch pop exch pop
+} bind
+end % .Instances of Category
+odef
+
+/defineresource { % <key> <instance> <category> defineresource <instance>
+ 3 copy .findcategory
+ currentdict /InstanceType known {
+ dup type InstanceType ne {
+ dup type /packedarraytype eq InstanceType /arraytype eq and
+ not { /defineresource load /typecheck signalerror } if
+ } if
+ } if
+ /DefineResource .resourceexec
+ 4 1 roll pop pop pop
+} bind odef
+% We must prevent resourceforall from automatically restoring the stacks,
+% because we don't want the stacks restored if proc causes an error.
+% On the other hand, resourceforall is defined in the PLRM as an operator,
+% so it must have type /operatortype. We hack this by taking advantage of
+% the fact that the interpreter optimizes tail calls, so stack protection
+% doesn't apply to the very last token of an operator procedure.
+/resourceforall1 { % <template> <proc> <scratch> <category> resourceforall1 -
+ dup /Category findresource begin
+ /ResourceForAll load
+ % Make sure we can recover the original operands.
+ % We must create the array in local VM, in case any of the
+ % operands are local.
+ % Stack: ...operands... proc
+ 5 copy pop .currentglobal false .setglobal 5 1 roll
+ 4 packedarray exch .setglobal count
+ % Stack: ...operands... proc saved count
+ 4 -1 roll pop % pop the category
+ /stopped load 3 1 roll
+ 3 .execn
+ % Stack: ... stopped saved count
+ 3 -1 roll {
+ .currentstackprotect {
+ % The count is the original stack depth + 2.
+ count exch 4 sub sub { exch pop } repeat
+ aload pop end
+ } {
+ % Don't restore the stacks.
+ pop pop
+ } ifelse stop
+ } {
+ pop pop end
+ } ifelse
+} bind def
+/resourceforall { % <template> <proc> <scratch> <category> resourceforall1 -
+ //resourceforall1 exec % see above
+} bind odef
+/resourcestatus { % <key> <category> resourcestatus <status> <size> true
+ % <key> <category> resourcestatus false
+ 2 copy .findcategory /ResourceStatus .resourceexec
+ { 4 2 roll pop pop true } { pop pop false } ifelse
+} bind odef
+/undefineresource { % <key> <category> undefineresource -
+ 2 copy .findcategory /UndefineResource .resourceexec pop pop
+} bind odef
+
+% Define the system parameters used for the Generic implementation of
+% ResourceFileName.
+systemdict begin
+currentdict /pssystemparams known not {
+ /pssystemparams 10 dict readonly def
+} if
+pssystemparams begin
+ /FontResourceDir (/Resource/Font/) readonly .forcedef % pssys'params is r-o
+ /GenericResourceDir (/Resource/) readonly .forcedef % pssys'params is r-o
+ /GenericResourcePathSep (/) readonly .forcedef % pssys'params is r-o
+end
+end
+
+% Define the generic algorithm for computing resource file names.
+/.rfnstring 100 string def
+/.genericrfn % <key> <scratch> <prefix> .genericrfn <filename>
+ { 3 -1 roll //.rfnstring cvs concatstrings exch copy
+ } bind def
+
+% Define a procedure for making a packed array in local VM.
+/.localpackedarray { % <obj1> ... <objn> <n> .localpackedarray <packedarray>
+ .currentglobal false .setglobal 1 index 2 add 1 roll
+ packedarray exch .setglobal
+} bind def
+
+% Define the Generic category.
+
+/Generic mark
+
+ % Standard entries
+
+% We're still running in Level 1 mode, so dictionaries won't expand.
+% Leave room for the /Category entry.
+/Category null
+
+% Implement the body of Generic resourceforall for local, global, and
+% external cases. 'args' is [template proc scratch resdict].
+/.enumerateresource { % <key> [- <proc> <scratch>] .enumerateresource -
+ 1 index type dup /stringtype eq exch /nametype eq or {
+ exch 1 index 2 get cvs exch
+ } if
+ % Use .setstackprotect to prevent the stacks from being restored if
+ % an error occurs during execution of proc.
+ 1 get false .setstackprotect exec true .setstackprotect
+} bind def
+/.localresourceforall { % <key> <value> <args> .localr'forall -
+ exch pop
+ 2 copy 0 get .stringmatch { .enumerateresource } { pop pop } ifelse
+} bind def
+/.globalresourceforall { % <key> <value> <args> .globalr'forall -
+ exch pop
+ 2 copy 0 get .stringmatch {
+ dup 3 get begin .LocalInstances end 2 index known not {
+ .enumerateresource
+ } if
+ } {
+ pop pop
+ } ifelse
+} bind def
+/.externalresourceforall { % <filename> <len> <args> .externalr'forall -
+ 3 1 roll 1 index length 1 index sub getinterval exch
+ dup 3 get begin .Instances .LocalInstances end
+ % Stack: key args insts localinsts
+ 3 index known {
+ pop pop pop
+ } {
+ 2 index known { pop pop } { .enumerateresource } ifelse
+ } ifelse
+} bind def
+
+/DefineResource {
+ .CheckResource
+ { dup [ exch 0 -1 ]
+ % Stack: key value instance
+ currentglobal
+ { false setglobal 2 index UndefineResource % remove local def if any
+ true setglobal
+ .Instances dup //.emptydict eq {
+ pop 3 dict
+ % As noted above, Category dictionaries are read-only,
+ % so we have to use .forcedef here.
+ /.Instances 1 index .forcedef % Category dict is read-only
+ } if
+ }
+ { .LocalInstances dup //.emptydict eq
+ { pop 3 dict localinstancedict Category 2 index put
+ }
+ if
+ }
+ ifelse
+ % Stack: key value instance instancedict
+ 3 index 2 index .growput
+ % Now make the resource value read-only.
+ 0 2 copy get { readonly } .internalstopped pop
+ dup 4 1 roll put exch pop exch pop
+ }
+ { /defineresource load /typecheck signalerror
+ }
+ ifelse
+} .bind executeonly % executeonly to prevent access to .forcedef
+/UndefineResource
+ { { dup 2 index .knownget
+ { dup 1 get 1 ge
+ { dup 0 null put 1 2 put pop pop }
+ { pop exch .undef }
+ ifelse
+ }
+ { pop pop
+ }
+ ifelse
+ }
+ currentglobal
+ { 2 copy .Instances exch exec
+ }
+ if .LocalInstances exch exec
+ } bind
+% Because of some badly designed code in Adobe's CID font downloader that
+% makes findresource and resourcestatus deliberately inconsistent with each
+% other, the default FindResource must not call ResourceStatus if there is
+% an instance of the desired name already defined in VM.
+/FindResource {
+ dup .getvminstance {
+ exch pop 0 get
+ } {
+ dup ResourceStatus {
+ pop 1 gt {
+ .DoLoadResource .getvminstance not {
+ /findresource load /undefinedresource signalerror
+ } if 0 get
+ } {
+ .GetInstance pop 0 get
+ } ifelse
+ } {
+ /findresource load /undefinedresource signalerror
+ } ifelse
+ } ifelse
+} bind
+% Because of some badly designed code in Adobe's CID font downloader, the
+% definition of ResourceStatus for Generic and Font must be the same (!).
+% We patch around this by using an intermediate .ResourceFileStatus procedure.
+/ResourceStatus {
+ dup .GetInstance {
+ exch pop dup 1 get exch 2 get true
+ } {
+ .ResourceFileStatus
+ } ifelse
+} bind
+/.ResourceFileStatus {
+ .ResourceFile { closefile 2 -1 true } { pop false } ifelse
+} bind
+/ResourceForAll {
+ % **************** Doesn't present instance groups in
+ % **************** the correct order yet.
+ % Construct a new procedure to hold the arguments.
+ % All objects constructed here must be in local VM to avoid
+ % a possible invalidaccess.
+ currentdict 4 .localpackedarray % [template proc scratch resdict]
+ % We must pop the resource dictionary off the dict stack
+ % when doing the actual iteration, and restore it afterwards.
+ .currentglobal not {
+ .LocalInstances length 0 ne {
+ % We must do local instances, and do them first.
+ //.localresourceforall {exec} 0 get 3 .localpackedarray cvx
+ .LocalInstances exch {forall} 0 get 1 index 0 get
+ currentdict end 3 .execn begin
+ } if
+ } if
+ % Do global instances next.
+ //.globalresourceforall {exec} 0 get 3 .localpackedarray cvx
+ .Instances exch cvx {forall} 0 get 1 index 0 get
+ currentdict end 3 .execn begin
+ currentdict /ResourceFileName known {
+ % Finally, do instances stored on files.
+ dup 0 get 100 string ResourceFileName
+ dup length 2 index 0 get length sub 3 -1 roll
+ //.externalresourceforall {exec} 0 get 4 .localpackedarray cvx
+ 100 string {filenameforall} 0 get
+ currentdict end 2 .execn begin null % for pop
+ } if pop
+} bind
+/ResourceFileName
+ { /GenericResourceDir getsystemparam
+ Category .namestring concatstrings
+ /GenericResourcePathSep getsystemparam concatstrings
+ .genericrfn
+ } bind
+
+ % Additional entries
+
+% Unfortunately, we can't create the real .Instances dictionary now,
+% because if someone copies the Generic category (which pp. 95-96 of the
+% 2nd Edition Red Book says is legitimate), they'll wind up sharing
+% the .Instances. Instead, we have to create .Instances on demand,
+% just like the entry in localinstancedict.
+% We also have to prevent anyone from creating instances of Generic itself.
+/.Instances //.emptydict
+
+/.LocalInstances
+ { localinstancedict Category .knownget not { //.emptydict } if
+ } bind
+/.GetInstance
+ { currentglobal
+ { .Instances exch .knownget }
+ { .LocalInstances 1 index .knownget
+ { exch pop true }
+ { .Instances exch .knownget }
+ ifelse
+ }
+ ifelse
+ } bind
+/.CheckResource
+ { true
+ } bind
+/.vmused {
+ % - .vmused <usedvalue>
+ % usedvalue = vmstatus in global + vmstatus in local.
+ 0 2 {
+ .currentglobal not .setglobal
+ vmstatus pop exch pop add
+ } repeat
+} bind def
+/.DoLoadResource {
+ % .LoadResource may push entries on the operand stack.
+ % It is an undocumented feature of Adobe implementations,
+ % which we must match for the sake of some badly written
+ % font downloading code, that such entries are popped
+ % automatically.
+ count 1 index cvlit .vmused
+ % Stack: key count litkey memused
+ {.LoadResource} 4 1 roll 4 .execn
+ % Stack: ... count key memused
+ .vmused exch sub
+ 1 index .getvminstance not {
+ pop dup /undefinedresource signalerror % didn't load
+ } if
+ dup 1 1 put
+ 2 3 -1 roll put
+ % Stack: ... count key
+ exch count 1 sub exch sub {exch pop} repeat
+} bind
+/.LoadResource
+ { dup .ResourceFile
+ { exch pop currentglobal
+ { .runresource }
+ { true setglobal { .runresource } stopped false setglobal { stop } if }
+ ifelse
+ }
+ { dup /undefinedresource signalerror
+ }
+ ifelse
+ } bind
+/.ResourceFile
+ { currentdict /ResourceFileName known
+ { mark 1 index 100 string { ResourceFileName }
+ .internalstopped
+ { cleartomark false }
+ { exch pop findlibfile
+ { exch pop exch pop true }
+ { pop false }
+ ifelse
+ }
+ ifelse
+ }
+ { false }
+ ifelse
+ } bind
+
+.dicttomark
+/Category defineresource pop
+
+% Fill in the rest of the Category category.
+/Category /Category findresource dup
+/Generic /Category findresource begin {
+ /FindResource /ResourceForAll /ResourceStatus /.ResourceFileStatus
+ /UndefineResource /ResourceFileName
+ /.ResourceFile /.LoadResource /.DoLoadResource
+} { dup load put dup } forall
+pop readonly pop end
+
+(END GENERIC) VMDEBUG
+
+% Define the fixed categories.
+
+mark
+ % Non-Type categories with existing entries.
+ /ColorSpaceFamily
+ { } % These must be deferred, because optional features may add some.
+ /Emulator
+ mark EMULATORS { cvn } forall .packtomark
+ /Filter
+ { } % These must be deferred, because optional features may add some.
+ /IODevice
+ % Loop until the .getiodevice gets a rangecheck.
+ errordict /rangecheck 2 copy get
+ errordict /rangecheck { pop stop } put % pop the command
+ mark 0 { {
+ dup .getiodevice dup null eq { pop } { exch } ifelse 1 add
+ } loop} .internalstopped
+ pop pop pop .packtomark
+ 4 1 roll put
+ .clearerror
+ % Type categories listed in the Red Book.
+ /ColorRenderingType
+ { } % These must be deferred, because optional features may add some.
+ /FMapType
+ { } % These must be deferred, because optional features may add some.
+ /FontType
+ { } % These must be deferred, because optional features may add some.
+ /FormType
+ { } % These must be deferred, because optional features may add some.
+ /HalftoneType
+ { } % These must be deferred, because optional features may add some.
+ /ImageType
+ { } % Deferred, optional features may add some.
+ /PatternType
+ { } % Deferred, optional features may add some.
+ % Type categories added since the Red Book.
+ /setsmoothness where {
+ pop /ShadingType { } % Deferred, optional features may add some.
+ } if
+counttomark 2 idiv
+ { mark
+
+ % Standard entries
+
+ % We'd like to prohibit defineresource,
+ % but because optional features may add entries, we can't.
+ % We can at least require that the key and value match.
+ /DefineResource
+ { currentglobal not
+ { /defineresource load /invalidaccess signalerror }
+ { 2 copy ne
+ { /defineresource load /rangecheck signalerror }
+ { dup .Instances 4 -2 roll .growput }
+ ifelse
+ }
+ ifelse
+ } bind
+ /UndefineResource
+ { /undefineresource load /invalidaccess signalerror } bind
+ /FindResource
+ { .Instances 1 index .knownget
+ { exch pop }
+ { /findresource load /undefinedresource signalerror }
+ ifelse
+ } bind
+ /ResourceStatus
+ { .Instances exch known { 0 0 true } { false } ifelse } bind
+ /ResourceForAll
+ /Generic /Category findresource /ResourceForAll get
+
+ % Additional entries
+
+ counttomark 2 add -1 roll
+ dup length dict dup begin exch { dup def } forall end
+ % We'd like to make the .Instances readonly here,
+ % but because optional features may add entries, we can't.
+ /.Instances exch
+ /.LocalInstances % used by ResourceForAll
+ 0 dict def
+
+ .dicttomark /Category defineresource pop
+ } repeat pop
+
+(END FIXED) VMDEBUG
+
+% Define the other built-in categories.
+
+/.definecategory % <name> -mark- <key1> ... <valuen> .definecategory -
+ { counttomark 2 idiv 2 add % .Instances, Category
+ /Generic /Category findresource dup maxlength 3 -1 roll add
+ dict .copydict begin
+ counttomark 2 idiv { def } repeat pop % pop the mark
+ currentdict end /Category defineresource pop
+ } bind def
+
+/ColorRendering mark /InstanceType /dicttype .definecategory
+% ColorSpace is defined below
+% Encoding is defined below
+% Font is defined below
+/Form mark /InstanceType /dicttype .definecategory
+/Halftone mark /InstanceType /dicttype .definecategory
+/Pattern mark /InstanceType /dicttype .definecategory
+/ProcSet mark /InstanceType /dicttype .definecategory
+% Added since the Red Book:
+/ControlLanguage mark /InstanceType /dicttype .definecategory
+/HWOptions mark /InstanceType /dicttype .definecategory
+/Localization mark /InstanceType /dicttype .definecategory
+/OutputDevice mark /InstanceType /dicttype .definecategory
+/PDL mark /InstanceType /dicttype .definecategory
+% CIDFont, CIDMap, and CMap are defined in gs_cidfn.ps
+% FontSet is defined in gs_cff.ps
+% IdiomSet is defined in gs_ll3.ps
+% InkParams and TrapParams are defined in gs_trap.ps
+
+(END MISC) VMDEBUG
+
+% Define the ColorSpace category.
+
+/.defaultcsnames mark
+ /DefaultGray 0
+ /DefaultRGB 1
+ /DefaultCMYK 2
+.dicttomark readonly def
+
+% The "hooks" are no-ops here, redefined in LL3.
+/.definedefaultcs { % <index> <value> .definedefaultcs -
+ pop pop
+} bind def
+/.undefinedefaultcs { % <index> .undefinedefaultcs -
+ pop
+} bind def
+
+/ColorSpace mark
+
+/InstanceType /arraytype
+
+% We keep track of whether there are any local definitions for any of
+% the Default keys. This information must get saved and restored in
+% parallel with the local instance dictionary, so it must be stored in
+% local VM.
+userdict /.localcsdefaults false put
+
+/DefineResource {
+ 2 copy /Generic /Category findresource /DefineResource get exec
+ exch pop
+ exch //.defaultcsnames exch .knownget {
+ 1 index .definedefaultcs
+ currentglobal not { .userdict /.localcsdefaults true put } if
+ } if
+} bind
+
+/UndefineResource {
+ dup /Generic /Category findresource /UndefineResource get exec
+ //.defaultcsnames 1 index .knownget {
+ % Stack: resname index
+ currentglobal {
+ .undefinedefaultcs pop
+ } {
+ % We removed the local definition, but there might be a global one.
+ exch .GetInstance {
+ 0 get .definedefaultcs
+ } {
+ .undefinedefaultcs
+ } ifelse
+ % Recompute .localcsdefaults by scanning. This is rarely needed.
+ .userdict /.localcsdefaults false //.defaultcsnames {
+ pop .LocalInstances exch known { pop true exit } if
+ } forall put
+ } ifelse
+ } {
+ pop
+ } ifelse
+} bind
+
+.definecategory % ColorSpace
+
+% Define the Encoding category.
+
+/Encoding mark
+
+/InstanceType /arraytype
+
+% Handle already-registered encodings, including lazily loaded encodings
+% that aren't loaded yet.
+
+/.Instances mark
+ EncodingDirectory
+ { dup length 256 eq { [ exch readonly 0 -1 ] } { pop [null 2 -1] } ifelse
+ } forall
+.dicttomark
+
+/.ResourceFileDict mark
+ EncodingDirectory
+ { dup length 256 eq { pop pop } { 0 get } ifelse
+ } forall
+.dicttomark
+
+/ResourceFileName
+ { .ResourceFileDict 2 index .knownget
+ { exch copy exch pop }
+ { /Generic /Category findresource /ResourceFileName get exec }
+ ifelse
+ } bind
+
+.definecategory % Encoding
+
+% Make placeholders in level2dict for the redefined Encoding operators,
+% so that they will be swapped properly when we switch language levels.
+
+/.findencoding /.findencoding load def
+/findencoding /findencoding load def
+/.defineencoding /.defineencoding load def
+
+(END ENCODING) VMDEBUG
+
+% Define the Font category.
+
+/.fontstatus { % <fontname> .fontstatus <fontname> <found>
+ { % Create a loop context just so we can exit it early.
+ % Check Fontmap.
+ Fontmap 1 index .knownget {
+ {
+ dup type /nametype eq {
+ .fontstatus { pop null exit } if
+ } {
+ dup type /stringtype eq {
+ findlibfile { closefile pop null exit } if pop
+ } {
+ % Procedure, assume success.
+ pop null exit
+ } ifelse
+ } ifelse
+ } forall dup null eq { pop true exit } if
+ } if
+ % Convert names to strings; give up on other types.
+ dup type /nametype eq { .namestring } if
+ dup type /stringtype ne { false exit } if
+ % Check the resource directory.
+ dup .fonttempstring /FontResourceDir getsystemparam .genericrfn
+ status {
+ pop pop pop pop true exit
+ } if
+ % Check for a file on the search path with the same name
+ % as the font.
+ findlibfile { closefile true exit } if
+ % Scan a FONTPATH directory and try again.
+ .scannextfontdir not { false exit } if
+ } loop
+} bind def
+
+/Font mark
+
+/InstanceType /dicttype
+
+/DefineResource
+ { 2 copy //definefont exch pop
+ /Generic /Category findresource /DefineResource get exec
+ } bind
+/UndefineResource
+ { dup //undefinefont
+ /Generic /Category findresource /UndefineResource get exec
+ } bind
+/FindResource {
+ dup .getvminstance {
+ exch pop 0 get
+ } {
+ dup ResourceStatus {
+ pop 1 gt { .loadfontresource } { .GetInstance pop 0 get } ifelse
+ } {
+ .loadfontresource
+ } ifelse
+ } ifelse
+} bind
+/ResourceForAll {
+ { .scannextfontdir not { exit } if } loop
+ /Generic /Category findresource /ResourceForAll get exec
+} bind
+/.ResourceFileStatus {
+ .fontstatus { pop 2 -1 true } { pop false } ifelse
+} bind
+
+/.loadfontresource {
+ dup vmstatus pop exch pop exch
+ % Hack: rebind .currentresourcefile so that all calls of
+ % definefont will know these are built-in fonts.
+ currentfile {pop //findfont exec} .execasresource % (findfont is a procedure)
+ exch vmstatus pop exch pop exch sub
+ % stack: name font vmused
+ % findfont has the prerogative of not calling definefont
+ % in certain obscure cases of font substitution.
+ 2 index .getvminstance {
+ dup 1 1 put
+ 2 3 -1 roll put
+ } {
+ pop
+ } ifelse exch pop
+} bind
+
+/.Instances FontDirectory length 2 mul dict
+
+.definecategory % Font
+
+% Redefine font "operators".
+/.definefontmap
+ { /Font /Category findresource /.Instances get
+ dup 3 index known
+ { pop
+ }
+ { 2 index
+ % Make sure we create the array in global VM.
+ .currentglobal true .setglobal
+ [null 2 -1] exch .setglobal
+ .growput
+ }
+ ifelse
+ //.definefontmap exec
+ } bind def
+
+% Make sure the old definitions are still in systemdict so that
+% they will get bound properly.
+systemdict begin
+ /.origdefinefont /definefont load def
+ /.origundefinefont /undefinefont load def
+ /.origfindfont /findfont load def
+end
+/definefont {
+ /Font defineresource
+} bind odef
+/undefinefont {
+ /Font undefineresource
+} bind odef
+% The Red Book requires that findfont be a procedure, not an operator,
+% but it still needs to restore the stacks reliably if it fails.
+/.findfontop {
+ /Font findresource
+} bind odef
+/findfont {
+ .findfontop
+} bind def % Must be a procedure, not an operator
+
+% Remove initialization utilities.
+currentdict /.definecategory .undef
+currentdict /.emptydict .undef
+
+end % level2dict
+
+% Convert deferred resources after we finally switch to Level 2.
+
+/.fixresources {
+ % Encoding resources
+ EncodingDirectory
+ { dup length 256 eq
+ { /Encoding defineresource pop }
+ { pop pop }
+ ifelse
+ } forall
+ /.findencoding { /Encoding findresource } bind def
+ /findencoding /.findencoding load def % must be a procedure
+ /.defineencoding { /Encoding defineresource pop } bind def
+ % ColorRendering resources and ProcSet
+ systemdict /ColorRendering .knownget {
+ /ColorRendering exch /ProcSet defineresource pop
+ systemdict /ColorRendering undef
+ /Default currentcolorrendering /ColorRendering defineresource pop
+ } if
+ % ColorSpace resources
+ systemdict /CIEsRGB .knownget {
+ /sRGB exch /ColorSpace defineresource pop
+ systemdict /CIEsRGB undef
+ } if
+ % ColorSpaceFamily resources
+ colorspacedict { pop dup /ColorSpaceFamily defineresource pop } forall
+ % Filter resources
+ filterdict { pop dup /Filter defineresource pop } forall
+ % FontType and FMapType resources
+ buildfontdict { pop dup /FontType defineresource pop } forall
+ mark
+ buildfontdict 0 known { 2 3 4 5 6 7 8 } if
+ buildfontdict 9 known { 9 } if
+ counttomark { dup /FMapType defineresource pop } repeat pop
+ % FormType resources
+ .formtypes { pop dup /FormType defineresource pop } forall
+ % HalftoneType resources
+ .halftonetypes { pop dup /HalftoneType defineresource pop } forall
+ % ColorRenderingType resources
+ .colorrenderingtypes {pop dup /ColorRenderingType defineresource pop} forall
+ % ImageType resources
+ .imagetypes { pop dup /ImageType defineresource pop } forall
+ % PatternType resources
+ .patterntypes { pop dup /PatternType defineresource pop } forall
+ % Make the fixed resource categories immutable.
+ /.shadingtypes where {
+ pop .shadingtypes { pop dup /ShadingType defineresource pop } forall
+ } if
+ [ /ColorSpaceFamily /Emulator /Filter /IODevice /ColorRenderingType
+ /FMapType /FontType /FormType /HalftoneType /ImageType /PatternType
+ /.shadingtypes where { pop /ShadingType } if
+ ] {
+ /Category findresource
+ dup /.Instances get readonly pop
+ .LocalInstances readonly pop
+ readonly pop
+ } forall
+ % clean up
+ systemdict /.fixresources undef
+} bind def
diff --git a/Master/xemtex/gslib/gs_s.xbm b/Master/xemtex/gslib/gs_s.xbm
new file mode 100644
index 00000000000..4d5234f63e1
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/gs_s.xpm b/Master/xemtex/gslib/gs_s.xpm
new file mode 100644
index 00000000000..765d9d79dd5
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/gs_s_m.xbm b/Master/xemtex/gslib/gs_s_m.xbm
new file mode 100644
index 00000000000..941e9c48475
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/gs_setpd.ps b/Master/xemtex/gslib/gs_setpd.ps
new file mode 100644
index 00000000000..edfa072c85d
--- /dev/null
+++ b/Master/xemtex/gslib/gs_setpd.ps
@@ -0,0 +1,777 @@
+% Copyright (C) 1994, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_setpd.ps,v 1.8.2.2.2.2 2003/04/12 14:02:38 giles Exp $
+% The current implementation of setpagedevice has the following limitations:
+% - It doesn't attempt to "interact with the user" for Policy = 2.
+
+languagelevel 1 .setlanguagelevel
+level2dict begin
+
+% ---------------- Redefinitions ---------------- %
+
+% Redefine .beginpage and .endpage so that they call BeginPage and
+% EndPage respectively if appropriate.
+
+% We have to guard against the BeginPage procedure not popping its operand.
+% This is really stupid, but the Genoa CET does it.
+/.beginpage { % - .beginpage -
+ .currentshowpagecount {
+ .currentpagedevice pop
+ dup null ne { /BeginPage .knownget } { pop false } ifelse {
+ % Stack: ... pagecount proc
+ count 2 .execn
+ % Stack: ... ..???.. oldcount
+ count 1 add exch sub { pop } repeat
+ } {
+ pop
+ } ifelse
+ } if
+} bind odef
+
+% Guard similarly against EndPage not popping its operand.
+/.endpage { % <reason> .endpage <print_bool>
+ .currentshowpagecount {
+ 1 index .currentpagedevice pop
+ dup null ne { /EndPage .knownget } { pop false } ifelse {
+ % Stack: ... reason pagecount reason proc
+ count 2 .execn
+ % Stack: ... ..???.. print oldcount
+ count 2 add exch sub { exch pop } repeat
+ } {
+ pop pop 2 ne
+ } ifelse
+ } {
+ 2 ne
+ } ifelse
+} bind odef
+
+% Define interpreter callouts for handling gstate-saving operators,
+% to make sure that they create a page device dictionary for use by
+% the corresponding gstate-restoring operator.
+% We'd really like to avoid the cost of doing this, but we don't see how.
+% The names %gsavepagedevice, %savepagedevice, %gstatepagedevice,
+% %copygstatepagedevice, and %currentgstatepagedevice are known to the
+% interpreter.
+
+(%gsavepagedevice) cvn
+ { currentpagedevice pop gsave
+ } bind def
+
+(%savepagedevice) cvn
+ { currentpagedevice pop save
+ } bind def
+
+(%gstatepagedevice) cvn
+ { currentpagedevice pop gstate
+ } bind def
+
+(%copygstatepagedevice) cvn
+ { currentpagedevice pop copy
+ } bind def
+
+(%currentgstatepagedevice) cvn
+ { currentpagedevice pop currentgstate
+ } bind def
+
+% Define interpreter callouts for handling gstate-restoring operators
+% when the current page device needs to be changed.
+% The names %grestorepagedevice, %grestoreallpagedevice,
+% %restorepagedevice, %restore1pagedevice, and %setgstatepagedevice
+% are known to the interpreter.
+
+/.installpagedevice
+ { % Since setpagedevice doesn't create new device objects,
+ % we must (carefully) reinstall the old parameters in
+ % the same device.
+ .currentpagedevice pop null currentdevice null .trysetparams
+ dup type /booleantype eq
+ { pop pop }
+ { % This should never happen!
+ DEBUG { (Error in .trysetparams!) = pstack flush } if
+ cleartomark pop pop pop
+ /.installpagedevice cvx /rangecheck signalerror
+ }
+ ifelse pop pop
+ % A careful reading of the Red Book reveals that an erasepage
+ % should occur, but *not* an initgraphics.
+ erasepage .beginpage
+ } bind def
+
+/.uninstallpagedevice
+ { 2 .endpage { .currentnumcopies false .outputpage } if
+ nulldevice
+ } bind def
+
+(%grestorepagedevice) cvn
+ { .uninstallpagedevice grestore .installpagedevice
+ } bind def
+
+(%grestoreallpagedevice) cvn
+ { .uninstallpagedevice grestore .installpagedevice grestoreall
+ } bind def
+
+(%restore1pagedevice) cvn
+ { .uninstallpagedevice grestore .installpagedevice restore
+ } bind def
+
+(%restorepagedevice) cvn
+ { .uninstallpagedevice restore .installpagedevice
+ } bind def
+
+(%setgstatepagedevice) cvn
+ { .uninstallpagedevice setgstate .installpagedevice
+ } bind def
+
+% Redefine .currentnumcopies so it consults the NumCopies device parameter.
+/.numcopiesdict mark
+ /NumCopies dup
+.dicttomark readonly def
+
+/.currentnumcopies
+ { currentdevice //.numcopiesdict .getdeviceparams
+ dup type /integertype eq
+ { exch pop exch pop }
+ { cleartomark #copies }
+ ifelse
+ } bind odef
+
+% Redefine .currentpagedevice and .setpagedevice so they convert between
+% null and a fixed empty directionary.
+/.nullpagedevice 0 dict readonly def
+/.currentpagedevice {
+ //.currentpagedevice exch dup null eq { pop //.nullpagedevice } if exch
+} bind odef
+/.setpagedevice {
+ dup //.nullpagedevice eq { pop null } if //.setpagedevice
+} bind odef
+
+% ---------------- Auxiliary definitions ---------------- %
+
+% Define the required attributes of all page devices, and their default values.
+% We don't include attributes such as .MediaSize, which all devices
+% are guaranteed to supply on their own.
+/.defaultpolicies mark
+ /PolicyNotFound 1
+ /PageSize 0
+ /PolicyReport {
+ dup /.LockSafetyParams known {
+ % Only possible error is invalidaccess
+ /setpagedevice .systemvar /invalidaccess signalerror
+ }
+ if
+ pop
+ } bind
+.dicttomark readonly def
+% Note that the values of .requiredattrs are executed, not just fetched.
+/.requiredattrs mark
+ /PageDeviceName null
+ /PageOffset [0 0] readonly
+% We define InputAttributes and OutputAttributes with a single
+% dummy media type that handles pages of any size.
+% Devices that care will override this.
+ /InputAttributes {
+ mark 0
+ % Since sizes match within 5 user units, we need to set the smallest
+ % PageSize to 6 units so that [0 0] will fail.
+ mark /PageSize [6 dup 16#7ffff dup] .dicttomark
+ .dicttomark
+ }
+ (%MediaSource) 0
+ /OutputAttributes {
+ mark 0 mark .dicttomark readonly .dicttomark
+ }
+ (%MediaDestination) 0
+ /Install {{.callinstall}} bind
+ /BeginPage {{.callbeginpage}} bind
+ /EndPage {{.callendpage}} bind
+ /Policies .defaultpolicies
+.dicttomark readonly def
+
+% Define currentpagedevice so it creates the dictionary on demand if needed,
+% adding all the required entries defined just above.
+% We have to deal specially with entries that the driver may change
+% on its own.
+/.dynamicppkeys mark
+ /.MediaSize dup % because it changes when PageSize is set
+ /PageCount dup
+.dicttomark readonly def
+/.makecurrentpagedevice { % - .makecurrentpagedevice <dict>
+ currentdevice null .getdeviceparams
+ % Make the dictionary large enough to add defaulted entries.
+ counttomark 2 idiv .requiredattrs length add dict
+ counttomark 2 idiv { dup 4 2 roll put } repeat exch pop
+ % Add any missing required attributes.
+ % Make a writable and (if possible) local copy of any default
+ % dictionaries, to work around a bug in the output of WordPerfect,
+ % which assumes that these dictionaries are writable and local.
+ .currentglobal exch dup gcheck .setglobal
+ .requiredattrs {
+ 2 index 2 index known {
+ pop pop
+ } {
+ exec 2 index 3 1 roll put
+ } ifelse
+ } forall exch .setglobal
+ dup .setpagedevice
+} bind def
+/currentpagedevice {
+ .currentpagedevice {
+ dup length 0 eq {
+ pop .makecurrentpagedevice
+ } {
+ % If any of the dynamic keys have changed,
+ % we must update the page device dictionary.
+ currentdevice //.dynamicppkeys .getdeviceparams .dicttomark {
+ % Stack: current key value
+ 2 index 2 index .knownget { 1 index ne } { true } ifelse
+ { 2 index wcheck not
+ { % This is the first entry being updated.
+ % Copy the dictionary to make it writable.
+ 3 -1 roll
+ currentglobal 1 index dup gcheck currentglobal and setglobal
+ length dict exch setglobal .copydict
+ 3 1 roll
+ }
+ if
+ 2 index 3 1 roll put
+ }
+ { pop pop
+ }
+ ifelse
+ } forall
+ % If the dictionary was global and is now local, copy
+ % any global subsidiary dictionaries to local VM. This
+ % too is to work around the Word Perfect bug (see above).
+ dup gcheck not {
+ dup {
+ dup type /dicttype eq { dup gcheck } { false } ifelse {
+ % Copy-on-write, see above.
+ 2 index wcheck not {
+ 3 -1 roll dup length dict .copydict
+ 3 1 roll
+ } if
+ .copytree 2 index 3 1 roll put
+ } {
+ pop pop
+ } ifelse
+ } forall
+ } if
+ % We would like to do a .setpagedevice so we don't keep
+ % re-creating the dictionary. Unfortunately, the effect
+ % of this is that if any dynamic key changes (PageCount
+ % in particular), we will do the equivalent of a
+ % setpagedevice at the next restore or grestore.
+ % Therefore, we make the dictionary read-only, but
+ % we don't store it away. I.e., NOT:
+ % dup wcheck { .setpagedevice .currentpagedevice pop } if
+ readonly
+ } ifelse
+ } if
+} bind odef
+
+% Copy a dictionary recursively.
+/.copytree { % <dict> .copytree <dict'>
+ dup length dict exch {
+ dup type /dicttype eq { .copytree } if 2 index 3 1 roll put
+ } forall
+} bind def
+
+% The implementation of setpagedevice is quite complex. Currently,
+% everything but the media matching algorithm is implemented here.
+
+% By default, we only present the requested changes to the device,
+% but there are some parameters that require special merging action.
+% Define those parameters here, with the procedures that do the merging.
+% The procedures are called as follows:
+% <merged> <key> <new_value> -proc- <merged> <key> <new_value'>
+/.mergespecial mark
+ /InputAttributes
+ { dup null eq
+ { pop null
+ }
+ { 3 copy pop .knownget
+ { dup null eq
+ { pop dup length dict }
+ { dup length 2 index length add dict .copydict }
+ ifelse
+ }
+ { dup length dict
+ }
+ ifelse .copydict readonly
+ }
+ ifelse
+ } bind
+ /OutputAttributes 1 index
+ /Policies
+ { 3 copy pop .knownget
+ { dup length 2 index length add dict .copydict }
+ { dup length dict }
+ ifelse copy readonly
+ } bind
+.dicttomark readonly def
+
+% Define the keys used in input attribute matching.
+/.inputattrkeys [
+ /PageSize /MediaColor /MediaWeight /MediaType /InsertSheet
+ % The following are documented in Adobe's supplement for v2017.
+ /LeadingEdge /MediaClass
+] readonly def
+% Define other keys used in media selection.
+/.inputselectionkeys [
+ /MediaPosition /Orientation
+] readonly def
+
+% Define the keys used in output attribute matching.
+/.outputattrkeys [
+ /OutputType
+] readonly def
+
+% Define all the parameters that should always be copied to the merged
+% dictionary.
+/.copiedkeys [
+ /OutputDevice
+ .mergespecial { pop } forall
+ .inputattrkeys aload pop
+ .inputselectionkeys aload pop
+ .outputattrkeys aload pop
+] readonly def
+
+% Define the parameters that should not be presented to the device.
+% The procedures are called as follows:
+% <merged> <key> <value> -proc-
+% The procedure leaves all its operands on the stack and returns
+% true iff the key/value pair should be presented to .putdeviceparams.
+/.presentspecial mark
+ .dynamicppkeys { pop false } forall
+ % We must ignore an explicit request for .MediaSize,
+ % because media matching always handles this.
+ /.MediaSize false
+ /Name false
+ /OutputDevice false
+ /PageDeviceName false
+ /PageOffset false
+ /PageSize false % obsolete alias for .MediaSize
+ /InputAttributes false
+ .inputattrkeys
+ { dup /PageSize eq
+ { pop }
+ { { 2 index /InputAttributes .knownget { null eq } { true } ifelse } }
+ ifelse
+ }
+ forall
+ .inputselectionkeys { false } forall
+ /OutputAttributes false
+ .outputattrkeys
+ { { 2 index /OutputAttributes .knownget { null eq } { true } ifelse } }
+ forall
+ /Install false
+ /BeginPage false
+ /EndPage false
+ /Policies false
+ % Our extensions:
+ /HWColorMap
+ { % HACK: don't transmit the color map, because
+ % window systems can change the color map on their own
+ % incrementally. Someday we'll have a better
+ % solution for this....
+ false
+ }
+ /ViewerPreProcess false
+.dicttomark readonly def
+
+% Define access to device defaults.
+/.defaultdeviceparams
+ { finddevice null .getdeviceparams
+ } bind def
+
+% Select media (input or output). The hard work is done in an operator:
+% <pagedict> <attrdict> <policydict> <keys> .matchmedia <key> true
+% <pagedict> <attrdict> <policydict> <keys> .matchmedia false
+% <pagedict> null <policydict> <keys> .matchmedia null true
+/.selectmedia % <orig> <request> <merged> <failed> <-- retained
+ % <attrdict> <policydict> <attrkeys> <mediakey>
+ % .selectmedia
+ { 5 index 5 -2 roll 4 index .matchmedia
+ % Stack: orig request merged failed attrkeys mediakey
+ % (key true | false)
+ { 4 index 3 1 roll put pop
+ }
+ { % Adobe's implementations have a "big hairy heuristic"
+ % to choose the set of keys to report as having failed the match.
+ % For the moment, we report any keys that are in the request
+ % and don't have the same value as in the original dictionary.
+ 5 index 1 index .knownget
+ { 4 index 3 1 roll put }
+ { 3 index exch .undef }
+ ifelse
+ { % Stack: <orig> <request> <merged> <failed> <attrkey>
+ 3 index 1 index .knownget
+ { 5 index 2 index .knownget { ne } { pop true } ifelse }
+ { true }
+ ifelse % Stack: ... <failed> <attrkey> <report>
+ { 2 copy /rangecheck put }
+ if pop
+ }
+ forall
+ }
+ ifelse
+ } bind def
+
+% Apply Policies to any unprocessed failed requests.
+% As we process each request entry, we replace the error name
+% in the <failed> dictionary with the policy value,
+% and we replace the key in the <merged> dictionary with its prior value
+% (or remove it if it had no prior value).
+/.policyprocs mark
+% These procedures are called with the following on the stack:
+% <orig> <merged> <failed> <Policies> <key> <policy>
+% They are expected to consume the top 2 operands.
+% NOTE: we currently treat all values other than 0, 1, or 7 (for PageSize)
+% the same as 0, i.e., we signal an error.
+ 0 { % Set errorinfo and signal a configurationerror.
+ pop dup 4 index exch get 2 array astore
+ $error /errorinfo 3 -1 roll put
+ cleartomark
+ /setpagedevice load /configurationerror signalerror
+ } bind
+ 1 { % Roll back the failed request to its previous status.
+DEBUG { (Rolling back.) = pstack flush } if
+ 3 index 2 index 3 -1 roll put
+ 4 index 1 index .knownget
+ { 4 index 3 1 roll put }
+ { 3 index exch .undef }
+ ifelse
+ } bind
+ 7 { % For PageSize only, just impose the request.
+ 1 index /PageSize eq
+ { pop pop 1 index /PageSize 7 put }
+ { .policyprocs 0 get exec }
+ ifelse
+ } bind
+.dicttomark readonly def
+/.applypolicies % <orig> <merged> <failed> .applypolicies
+ % <orig> <merged'> <failed'>
+ { 1 index /Policies get 1 index
+ { type /integertype eq
+ { pop % already processed
+ }
+ { 2 copy .knownget not { 1 index /PolicyNotFound get } if
+ % Stack: <orig> <merged> <failed> <Policies> <key>
+ % <policy>
+ .policyprocs 1 index .knownget not { .policyprocs 0 get } if exec
+ }
+ ifelse
+ }
+ forall pop
+ } bind def
+
+% Prepare to present parameters to the device, by spreading them onto the
+% operand stack and removing any that shouldn't be presented.
+/.prepareparams % <params> .prepareparams -mark- <key1> <value1> ...
+ { mark exch dup
+ { % Stack: -mark- key1 value1 ... merged key value
+ .presentspecial 2 index .knownget
+ { exec { 3 -1 roll } { pop pop } ifelse }
+ { 3 -1 roll }
+ ifelse
+ }
+ forall pop
+ } bind def
+
+% Put device parameters without resetting currentpagedevice.
+% (.putdeviceparams clears the current page device.)
+/.putdeviceparamsonly % <device> <Policies|null> <require_all> -mark-
+ % <key1> <value1> ... .putdeviceparamsonly
+ % On success: <device> <eraseflag>
+ % On failure: <device> <Policies|null> <req_all> -mark-
+ % <key1> <error1> ...
+ { .currentpagedevice
+ { counttomark 4 add 1 roll .putdeviceparams
+ dup type /booleantype eq { 3 } { counttomark 5 add } ifelse -1 roll
+ .setpagedevice
+ }
+ { pop .putdeviceparams
+ }
+ ifelse
+ } bind def
+
+% Try setting the device parameters from the merged request.
+/.trysetparams % <merged> <(ignored)> <device> <Policies>
+ % .trysetparams
+ { true 4 index .prepareparams
+ % Add the computed .MediaSize.
+ % Stack: merged (ignored) device Policies -true-
+ % -mark- key1 value1 ...
+ counttomark 5 add index .computemediasize
+ exch pop exch pop /.MediaSize exch
+DEBUG { (Putting.) = pstack flush } if
+ .putdeviceparamsonly
+DEBUG { (Result of putting.) = pstack flush } if
+ } bind def
+
+% Compute the media size and initial matrix from a merged request (after
+% media selection).
+/.computemediasize % <request> .computemediasize
+ % <request> <matrix> <[width height]>
+ { dup /PageSize get % requested page size
+ 1 index /InputAttributes get
+ 2 index (%MediaSource) get get /PageSize get % media size
+ % (may be a range)
+ 2 index /Policies get
+ dup /PageSize .knownget
+ { exch pop } { /PolicyNotFound get } ifelse % PageSize policy,
+ % affects scaling
+ 3 index /Orientation .knownget not { null } if
+ 4 index /RollFedMedia .knownget not { false } if
+ matrix .matchpagesize not {
+ % This is a "can't happen" condition!
+ /setpagedevice load /rangecheck signalerror
+ } if
+ 2 array astore
+ } bind def
+
+% ---------------- setpagedevice itself ---------------- %
+
+/setpagedevice
+ { % We mustn't pop the argument until the very end,
+ % so that the pseudo-operator machinery can restore the stack
+ % if an error occurs.
+ mark 1 index currentpagedevice
+
+ % Check whether we are changing OutputDevice;
+ % also handle the case where the current device
+ % is not a page device.
+ % Stack: mark <request> <current>
+DEBUG { (Checking.) = pstack flush } if
+
+ dup /OutputDevice .knownget
+ { % Current device is a page device.
+ 2 index /OutputDevice .knownget
+ { % A specific OutputDevice was requested.
+ 2 copy eq
+ { pop pop null }
+ { exch pop }
+ ifelse
+ }
+ { pop null
+ }
+ ifelse
+ }
+ { % Current device is not a page device.
+ % Use the default device.
+ 1 index /OutputDevice .knownget not { .defaultdevicename } if
+ }
+ ifelse
+ dup null eq
+ { pop
+ }
+ { exch pop .defaultdeviceparams
+ % In case of duplicate keys, .dicttomark takes the entry
+ % lower on the stack, so we can just append the defaults here.
+ .requiredattrs { exec } forall .dicttomark
+ }
+ ifelse
+
+ % Check whether a viewer wants to intervene.
+ % We must check both the request (which takes precedence)
+ % and the current dictionary.
+ % Stack: mark <request> <orig>
+ exch dup /ViewerPreProcess .knownget
+ { exec }
+ { 1 index /ViewerPreProcess .knownget { exec } if }
+ ifelse exch
+
+ % Construct a merged request from the actual request plus
+ % any keys that should always be propagated.
+ % Stack: mark <request> <orig>
+DEBUG { (Merging.) = pstack flush } if
+
+ exch 1 index length 1 index length add dict
+ .copiedkeys
+ { % Stack: <orig> <request> <merged> <key>
+ 3 index 1 index .knownget { 3 copy put pop } if pop
+ }
+ forall
+ % Stack: <orig> <request> <merged>
+ dup 2 index
+ { % stack: <orig> <request> <merged> <merged> <rkey> <rvalue>
+ .mergespecial 2 index .knownget { exec } if
+ put dup
+ }
+ forall pop
+ % Hack: if FIXEDRESOLUTION is true, discard any attempt to
+ % change HWResolution.
+ FIXEDRESOLUTION { dup /HWResolution .undef } if
+ % Hack: if FIXEDMEDIA is true, discard any attempt to change
+ % PageSize or HWSize.
+ FIXEDMEDIA
+ { dup /PageSize 4 index /PageSize get put
+ dup /HWSize 4 index /HWSize get put
+ } if
+ % Hack: to work around some files that take a PageSize
+ % from InputAttributes and impose it, discard any attempt
+ % to set PageSize to a 4-element value.
+ % Stack: mark <orig> <request> <merged>
+ dup /PageSize .knownget {
+ length 2 ne {
+ dup /PageSize 4 index /PageSize get put
+ } if
+ } if
+
+ % Select input and output media.
+ % Stack: mark <orig> <request> <merged>
+DEBUG { (Selecting.) = pstack flush } if
+
+ 0 dict % <failed>
+ 1 index /InputAttributes .knownget
+ { 2 index /Policies get
+ .inputattrkeys (%MediaSource) cvn .selectmedia
+ } if
+ 1 index /OutputAttributes .knownget
+ { 2 index /Policies get
+ .outputattrkeys (%MediaDestination) cvn .selectmedia
+ } if
+ 3 -1 roll 4 1 roll % temporarily swap orig & request
+ .applypolicies
+ 3 -1 roll 4 1 roll % swap back
+
+ % Construct the new device, and attempt to set its attributes.
+ % Stack: mark <orig> <request> <merged> <failed>
+DEBUG { (Constructing.) = pstack flush } if
+
+ currentdevice .devicename 2 index /OutputDevice get eq
+ { currentdevice }
+ { 1 index /OutputDevice get finddevice }
+ ifelse
+ %**************** We should copy the device here,
+ %**************** but since we can't close the old device,
+ %**************** we don't. This is WRONG.
+ %****************copydevice
+ 2 index /Policies get
+ .trysetparams
+ dup type /booleantype ne
+ { % The request failed.
+ % Stack: ... <orig> <request> <merged> <failed> <device>
+ % <Policies> true mark <name> <errorname> ...
+DEBUG { (Recovering.) = pstack flush } if
+ counttomark 4 add index
+ counttomark 2 idiv { dup 4 -2 roll put } repeat
+ pop pop pop
+ % Stack: mark ... <orig> <request> <merged> <failed> <device>
+ % <Policies>
+ 6 2 roll 3 -1 roll 4 1 roll
+ .applypolicies
+ 3 -1 roll 4 1 roll 6 -2 roll
+ .trysetparams % shouldn't fail!
+ dup type /booleantype ne
+ { 2 { counttomark 1 add 1 roll cleartomark } repeat
+ /setpagedevice load exch signalerror
+ }
+ if
+ }
+ if
+
+ % The attempt succeeded. Install the new device.
+ % Stack: mark ... <merged> <failed> <device> <eraseflag>
+DEBUG { (Installing.) = pstack flush } if
+
+ pop 2 .endpage
+ { 1 true .outputpage
+ (>>setpagedevice, press <return> to continue<<\n) .confirm
+ }
+ if
+ % .setdevice clears the current page device!
+ .currentpagedevice pop exch
+ .setdevice pop
+ .setpagedevice
+
+ % Merge the request into the current page device,
+ % unless we're changing the OutputDevice.
+ % Stack: mark ... <merged> <failed>
+ exch currentpagedevice dup length 2 index length add dict
+ % Stack: mark ... <failed> <merged> <current> <newdict>
+ 2 index /OutputDevice .knownget {
+ 2 index /OutputDevice .knownget not { null } if eq
+ } {
+ true
+ } ifelse {
+ % Same OutputDevice, merge the dictionaries.
+ .copydict
+ } {
+ % Different OutputDevice, discard the old dictionary.
+ exch pop
+ } ifelse .copydict
+ % Initialize the default matrix, taking media matching
+ % into account.
+ .computemediasize pop initmatrix concat
+ dup /PageOffset .knownget
+ { % Translate by the given number of 1/72" units in device X/Y.
+ dup 0 get exch 1 get
+ 2 index /HWResolution get dup 1 get exch 0 get
+ 4 -1 roll mul 72 div 3 1 roll mul 72 div
+ idtransform translate
+ }
+ if
+ % We must install the new page device dictionary
+ % before calling the Install procedure.
+ dup .setpagedevice
+ .setdefaultscreen % Set the default screen before calling Install.
+ dup /Install .knownget {
+ { .execinstall } stopped { .postinstall stop } { .postinstall } ifelse
+ } {
+ .postinstall
+ } ifelse
+} odef
+
+% We break out the code after calling the Install procedure into a
+% separate procedure, since it is executed even if Install causes an error.
+% By making .execinstall a separate operator procedure, we get the stacks
+% restored if it fails.
+
+/.execinstall { % <proc> .execinstall -
+ % Because the interpreter optimizes tail calls, we can't just let
+ % the body of this procedure be 'exec', because that would lose
+ % the stack protection that is the whole reason for having the
+ % procedure in the first place. We hack this by adding a couple
+ % of extra tokens to ensure that the operator procedure is still
+ % on the stack during the exec.
+ exec
+ 0 pop % See above.
+} odef
+/.postinstall { % mark ... <failed> <merged> .postinstall -
+ matrix currentmatrix .setdefaultmatrix
+ % Erase and initialize the page.
+ erasepage initgraphics
+ .beginpage
+
+ % Clean up, calling PolicyReport if needed.
+ % Stack: mark ... <failed> <merged>
+DEBUG { (Finishing.) = pstack flush } if
+
+ exch dup length 0 ne
+ { 1 index /Policies get /PolicyReport get
+ counttomark 1 add 2 roll cleartomark
+ exec
+ }
+ { cleartomark
+ }
+ ifelse pop
+
+} odef
+
+end % level2dict
+.setlanguagelevel
diff --git a/Master/xemtex/gslib/gs_statd.ps b/Master/xemtex/gslib/gs_statd.ps
new file mode 100644
index 00000000000..824f480d239
--- /dev/null
+++ b/Master/xemtex/gslib/gs_statd.ps
@@ -0,0 +1,366 @@
+% Copyright (C) 1989, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_statd.ps,v 1.5.2.2.2.1 2003/04/12 14:02:38 giles Exp $
+% This file provides statusdict, serverdict, and assorted LaserWriter
+% operators, mostly for the benefit of poorly designed PostScript programs
+% that 'know' they are running on a LaserWriter.
+
+systemdict begin
+ % We make statusdict a little larger for Level 2 stuff.
+ % Note that it must be allocated in local VM.
+ .currentglobal false .setglobal
+ /statusdict 89 dict .forcedef % statusdict is local, sys'dict global
+ % To support the Level 2 job control features,
+ % serverdict must also be in local VM.
+ /serverdict 10 dict .forcedef % serverdict is local, sys'dict global
+ .setglobal
+end
+
+% Define various paper formats. The Adobe documentation defines only these:
+% 11x17, a3, a4, a4small, b5, ledger, legal, letter, lettersmall, note.
+% These procedures are also accessed as data structures during initialization,
+% so the page dimensions must be the first two elements of the procedure.
+
+/.setpagesize { /statusdict .systemvar begin .setpagesize end } bind def
+userdict begin
+ % Page sizes defined by Adobe documentation
+ /11x17 {792 1224 //.setpagesize exec} bind def % 11x17 portrait
+ /a3 {842 1191 //.setpagesize exec} bind def
+ /a4 {595 842 //.setpagesize exec} bind def
+% a4small should be a4 with an ImagingBBox of [25 25 570 817].
+ /a4small /a4 load def
+% b5 see below.
+ /ledger {1224 792 //.setpagesize exec} bind def % 11x17 landscape
+ /legal {612 1008 //.setpagesize exec} bind def
+ /letter {612 792 //.setpagesize exec} bind def
+% lettersmall should be letter with an ImagingBBox of [25 25 587 767].
+ /lettersmall /letter load def
+% note should be letter (or some other size) with the ImagingBBox
+% shrunk by 25 units on all 4 sides.
+ /note /letter load def
+ % End of Adobe-defined page sizes
+STRICT { (%END SIZES) .skipeof } if
+ % Other page sizes
+ % ISO standard paper sizes
+ /a0 {2384 3370 //.setpagesize exec} bind def
+ /a1 {1684 2384 //.setpagesize exec} bind def
+ /a2 {1191 1684 //.setpagesize exec} bind def
+% /a3 {842 1191 //.setpagesize exec} bind def % defined by Adobe
+% /a4 {595 842 //.setpagesize exec} bind def % defined by Adobe
+ /a5 {420 595 //.setpagesize exec} bind def
+ /a6 {297 420 //.setpagesize exec} bind def
+ /a7 {210 297 //.setpagesize exec} bind def
+ /a8 {148 210 //.setpagesize exec} bind def
+ /a9 {105 148 //.setpagesize exec} bind def
+ /a10 {73 105 //.setpagesize exec} bind def
+% ISO and JIS B sizes are different....
+ /isob0 {2835 4008 //.setpagesize exec} bind def
+ /b0 /isob0 load def
+ /isob1 {2004 2835 //.setpagesize exec} bind def
+ /b1 /isob1 load def
+ /isob2 {1417 2004 //.setpagesize exec} bind def
+ /b2 /isob2 load def
+ /isob3 {1001 1417 //.setpagesize exec} bind def
+ /b3 /isob3 load def
+ /isob4 {709 1001 //.setpagesize exec} bind def
+ /b4 /isob4 load def
+ /isob5 {499 709 //.setpagesize exec} bind def
+ /b5 /isob5 load def
+ /isob6 {354 499 //.setpagesize exec} bind def
+ /b6 /isob6 load def
+ /jisb0 {2920 4127 //.setpagesize exec} bind def
+ /jisb1 {2064 2920 //.setpagesize exec} bind def
+ /jisb2 {1460 2064 //.setpagesize exec} bind def
+ /jisb3 {1032 1460 //.setpagesize exec} bind def
+ /jisb4 {729 1032 //.setpagesize exec} bind def
+ /jisb5 {516 729 //.setpagesize exec} bind def
+ /jisb6 {363 516 //.setpagesize exec} bind def
+ /c0 {2599 3677 //.setpagesize exec} bind def
+ /c1 {1837 2599 //.setpagesize exec} bind def
+ /c2 {1298 1837 //.setpagesize exec} bind def
+ /c3 {918 1298 //.setpagesize exec} bind def
+ /c4 {649 918 //.setpagesize exec} bind def
+ /c5 {459 649 //.setpagesize exec} bind def
+ /c6 {323 459 //.setpagesize exec} bind def
+ % U.S. CAD standard paper sizes
+ /archE {2592 3456 //.setpagesize exec} bind def
+ /archD {1728 2592 //.setpagesize exec} bind def
+ /archC {1296 1728 //.setpagesize exec} bind def
+ /archB {864 1296 //.setpagesize exec} bind def
+ /archA {648 864 //.setpagesize exec} bind def
+ % Other paper sizes
+ /flsa {612 936 //.setpagesize exec} bind def % U.S. foolscap
+ /flse {612 936 //.setpagesize exec} bind def % European foolscap
+ /halfletter {396 612 //.setpagesize exec} bind def
+% /tabloid {792 1224 //.setpagesize exec} bind def % 11x17 portrait
+% /csheet {1224 1584 //.setpagesize exec} bind def % ANSI C 17x22
+% /dsheet {1584 2448 //.setpagesize exec} bind def % ANSI D 22x34
+% /esheet {2448 3168 //.setpagesize exec} bind def % ANSI E 34x44
+%END SIZES
+end
+currentdict /.setpagesize .undef
+
+statusdict begin
+
+% Define the pagetype values for the known page formats.
+% The values for all but letter and note are arbitrary.
+/.pagetypenames
+ { /letter /note %do not change this line, needed by 'setpagetype'
+ /legal /lettersmall
+ /11x17 /ledger
+ /a4small /a3 /a4
+STRICT { (%END SIZES) .skipeof } if
+ /a0 /a1 /a2 /a5 /a6 /a7 /a8 /a9 /a10
+ /archA /archB /archC /archD /archE
+ /b0 /b1 /b2 /b3 /b4 /b5 /b6
+ /c0 /c1 /c2 /c3 /c4 /c5 /c6
+ /flsa /flse /halfletter
+ /isob0 /isob1 /isob2 /isob3 /isob4 /isob5 /isob6
+ /jisb0 /jisb1 /jisb2 /jisb3 /jisb4 /jisb5 /jisb6
+%END SIZES
+ } cvlit readonly def
+
+%%%%%% The following items were suggested by a user as useful.
+
+% Permanent definitions
+
+/ramsize 4194304 def
+/hardwareiomode 0 def
+ /sethardwareiomode {pop} bind def
+/softwareiomode 0 def
+ /setsoftwareiomode {pop} bind def
+/dosysstart false def
+ /setdosysstart {pop} bind def
+/allowjobreset true def
+ /setallowjobreset {pop} bind def
+/defaultpaperfamily 0 def
+ /setdefaultpaperfamily {pop} bind def
+/defaultpapertray 0 def
+ /setdefaultpapertray {pop} bind def
+/defaulttrayswitch false def
+ /setdefaulttrayswitch {pop} bind def
+
+% Tray and format selection
+
+ /11x17tray {/11x17 .uservar exec} bind def
+ /a3tray {/a3 .uservar exec} bind def
+ /a4tray {/a4 .uservar exec} bind def
+ /a5tray {/a5 .uservar exec} bind def
+ /a6tray {/a6 .uservar exec} bind def
+ /b4tray {/b4 .uservar exec} bind def
+ /b5tray {/b5 .uservar exec} bind def
+ /flsatray {/flsa .uservar exec} bind def
+ /flsetray {/flse .uservar exec} bind def
+ /halflettertray {/halfletter .uservar exec} bind def
+ /ledgertray {/ledger .uservar exec} bind def
+ /legaltray {/legal .uservar exec} bind def
+ /lettertray {/letter .uservar exec} bind def
+
+% Per-job parameters
+
+/paperfamily 0 def % 0 is US, 1 is European
+/papertray 1 def
+ /setpapertray {statusdict exch /papertray exch put} bind def
+/trayswitch false def % paperout feeds from another tray
+% We don't implement the (undocumented by Adobe) papersize 'operator',
+% because it's very awkward to make it interact properly with all the
+% different ways of setting the paper size.
+%/papersize {/letter true} bind def % <name of paper size>, <short-edge-first-p>
+/appletalktype (LaserWriter) def
+
+%%%%%% The following items are defined in the PostScript Language
+%%%%%% Reference Manual, First Edition, and subsequent 'compatibility'
+%%%%%% documentation from Adobe.
+
+ /checkpassword {statusdict begin .password eq end} bind def
+ /defaulttimeouts {statusdict begin .timeouts aload pop end} bind def
+ /diskonline {
+ false (%disk*%) { pop not exit } 100 string /IODevice resourceforall
+ } bind def
+%/dostartpage
+ /eescratch {pop 0} bind def
+ /idlefonts {statusdict begin mark .idlefonts aload pop end} bind def
+ /jobname () def
+%/jobtimeout
+ /manualfeed false def
+ /manualfeedtimeout 60 def
+ /margins {statusdict begin .topmargin .leftmargin end} bind def
+ /pagecount {4711} bind def
+ /pagestackorder {false} bind def
+ /pagetype 0 def
+ /prefeed false def
+ /printererror {pop pop} bind def
+ /printername {statusdict /.printername get exch copy} bind def
+ /processcolors /processcolors load def % defined in systemdict
+ /product product def % product is defined in systemdict
+ /revision revision def % revision is defined in systemdict
+ /sccbatch {pop 9600 0} bind def
+ /sccinteractive {pop 9600 0} bind def
+ /setdefaulttimeouts {statusdict begin .timeouts astore pop end} bind def
+ /setdostartpage {statusdict exch /dostartpage exch put} bind def
+ /setduplexmode {mark /Duplex 3 -1 roll currentdevice putdeviceprops} bind def
+ /seteescratch {pop pop} bind def
+ /setidlefonts {] statusdict exch /.idlefonts exch put} bind def
+ /setjobtimeout {statusdict exch /jobtimeout exch put} bind def
+ /setmargins
+ { statusdict begin
+ /.leftmargin exch def /.topmargin exch def
+ end
+ } bind def
+
+% The following compatibility operators are only documented by Adobe in a
+% supplement to the Red Book.
+%
+% - pagemargin <offset>
+% - pageparams <width> <height> <offset> <orientation>
+% <width> <height> <orientation> setpage -
+% <offset> setpagemargin -
+% <width> <height> <offset> <orientation> setpageparams -
+%
+% width and height are in default units (and if orientation is odd, are
+% exchanged!). offset is the x margin, also in default units.
+% Unfortunately, because orientation is relative to the device paper feed,
+% it does not have a consistent meaning in terms of image orientation.
+% We follow the convention that ORIENT1 determines the orientation value
+% that means portait: false means 0, true means 1.
+
+ /pagemargin { 0 } bind def
+ /pageparams
+ { currentdevice 1 dict dup /.MediaSize dup put .getdeviceparams
+ exch pop exch pop aload pop 0 ORIENT1 { 1 } { 0 } ifelse
+ } bind def
+ /setpage
+ { ORIENT1 { 1 } { 0 } ifelse ne {exch} if
+ statusdict /.setpagesize get exec
+ } bind def
+ /setpagemargin {pop} bind def % can't do better without setpagedevice
+ /setpageparams
+ { exch pop ORIENT1 { 1 } { 0 } ifelse ne {exch} if
+ statusdict /.setpagesize get exec
+ } bind def
+ /setpagetype
+ { statusdict begin
+ % The Adobe documentation only defines setpagetype
+ % (a Level 1 operator) as accepting the values 0 and 1,
+ % so we do too.
+ dup .pagetypenames 0 2 getinterval exch get //systemdict exch get exec
+ /pagetype exch def
+ end
+ } bind def
+ /setpassword
+ {exch checkpassword
+ {statusdict exch /.password exch put true}
+ {pop false}
+ ifelse} bind def
+ /setprintername
+ {dup length string copy statusdict exch /.printername exch put} bind def
+
+% setresolution is not documented by Adobe, but some applications
+% use it anyway, without testing whether or not it is present.
+%
+% <pixels_per_inch> setresolution -
+%
+% sets the resolution of the device.
+
+ /setresolution
+ { mark /HWResolution [ 4 -1 roll dup ] currentdevice putdeviceprops pop
+ initmatrix erasepage
+ } bind def
+ /setsccbatch {pop pop pop} bind def
+ /setsccinteractive {pop pop pop} bind def
+ /settumble {pop} bind def
+ /waittimeout 300 def
+
+%%%%%% End of documented items.
+
+/.setpagesize
+ { mark /HWSize [
+ 4 index 4 index matrix defaultmatrix dtransform
+ abs ceiling cvi exch abs ceiling cvi exch
+ ] currentdevice putdeviceprops pop pop pop
+ initmatrix initclip erasepage
+ } bind def
+/.password 0 def
+/.timeouts [0 60 30] def
+true setdostartpage
+mark setidlefonts
+0 setjobtimeout
+0 0 setmargins
+product setprintername
+
+end % statusdict
+
+%%%%%% The following documented compatibility "operators" are in systemdict,
+%%%%%% not in statusdict.
+
+systemdict begin
+.currentglobal true .setglobal
+
+/devforall { % <pattern> <proc> <scratch> devforall -
+ exch {
+ 1 index currentdevparams
+ /Type .knownget { /FileSystem eq } { false } ifelse
+ { exec } { pop pop } ifelse
+ } /exec load 3 packedarray cvx exch
+ (*) 3 1 roll /IODevice resourceforall
+} odef
+
+/devstatus { % <(%disk*%)> devstatus <searchable> <writable>
+ % <hasNames> <mounted> <removable> <searchOrder>
+ % <freePages> <size> true
+ % <string> devstatus false
+ dup length 5 ge {
+ dup 0 5 getinterval (%disk) eq {
+ dup /IODevice resourcestatus {
+ pop pop dup currentdevparams
+ dup /Searchable get
+ exch dup /Writeable get
+ exch dup /HasNames get
+ exch dup /Mounted get
+ exch dup /Removable get
+ exch dup /SearchOrder get
+ exch dup /Free get
+ exch /LogicalSize get
+ 9 -1 roll pop true
+ } {
+ pop false
+ } ifelse
+ } {
+ pop false
+ } ifelse
+ } {
+ pop false
+ } ifelse
+} odef
+
+.setglobal end % systemdict
+
+% The following contents of serverdict are a complete guess,
+% based on some observed LaserWriter boilerplate.
+
+serverdict begin
+
+ /execjob { } bind def
+% The Red Book implies that something like the following is
+% an appropriate definition of exitserver.
+ /exitserver { clear stop } bind def
+% However, this interacts badly with our standard error handler,
+% so we override it with the following less appropriate definition.
+ /exitserver { 0 ne { clear cleardictstack } if } bind def
+ /setrealdevice { } bind def
+
+end % serverdict
diff --git a/Master/xemtex/gslib/gs_std_e.ps b/Master/xemtex/gslib/gs_std_e.ps
new file mode 100644
index 00000000000..6dec0db3a65
--- /dev/null
+++ b/Master/xemtex/gslib/gs_std_e.ps
@@ -0,0 +1,74 @@
+% Copyright (C) 1993, 1994 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_std_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Define the standard encoding vector.
+/StandardEncoding
+% \00x
+ /.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
+% \04x
+ /space /exclam /quotedbl /numbersign
+ /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus
+ /comma /hyphen /period /slash
+ /zero /one /two /three
+ /four /five /six /seven
+ /eight /nine /colon /semicolon
+ /less /equal /greater /question
+% \10x
+ /at /A /B /C /D /E /F /G
+ /H /I /J /K /L /M /N /O
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+% \14x
+ /quoteleft /a /b /c /d /e /f /g
+ /h /i /j /k /l /m /n /o
+ /p /q /r /s /t /u /v /w
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef
+% \20x
+ /.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
+% \24x
+ /.notdef /exclamdown /cent /sterling
+ /fraction /yen /florin /section
+ /currency /quotesingle /quotedblleft /guillemotleft
+ /guilsinglleft /guilsinglright /fi /fl
+ /.notdef /endash /dagger /daggerdbl
+ /periodcentered /.notdef /paragraph /bullet
+ /quotesinglbase /quotedblbase /quotedblright /guillemotright
+ /ellipsis /perthousand /.notdef /questiondown
+% \30x
+ /.notdef /grave /acute /circumflex /tilde /macron /breve /dotaccent
+ /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron
+ /emdash /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% \34x
+ /.notdef /AE /.notdef /ordfeminine /.notdef /.notdef /.notdef /.notdef
+ /Lslash /Oslash /OE /ordmasculine /.notdef /.notdef /.notdef /.notdef
+ /.notdef /ae /.notdef /.notdef /.notdef /dotlessi /.notdef /.notdef
+ /lslash /oslash /oe /germandbls /.notdef /.notdef /.notdef /.notdef
+% Make an array on large systems, a packed array on small ones.
+256
+vmstatus exch pop exch pop
+100000 ge { array astore readonly } { packedarray } ifelse
+def
+0 StandardEncoding .registerencoding
+/StandardEncoding StandardEncoding .defineencoding
diff --git a/Master/xemtex/gslib/gs_sym_e.ps b/Master/xemtex/gslib/gs_sym_e.ps
new file mode 100644
index 00000000000..75581831f5a
--- /dev/null
+++ b/Master/xemtex/gslib/gs_sym_e.ps
@@ -0,0 +1,84 @@
+% Copyright (C) 1991, 1994, 1998, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_sym_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Define the Symbol encoding vector.
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/SymbolEncoding
+% \000
+ StandardEncoding 0 32 getinterval aload pop % /.notdef
+% \040
+ /space /exclam /universal /numbersign
+ /existential /percent /ampersand /suchthat
+ /parenleft /parenright /asteriskmath /plus
+ /comma /minus /period /slash
+ /zero /one /two /three
+ /four /five /six /seven
+ /eight /nine /colon /semicolon
+ /less /equal /greater /question
+% \100
+ /congruent /Alpha /Beta /Chi
+ /Delta /Epsilon /Phi /Gamma
+ /Eta /Iota /theta1 /Kappa
+ /Lambda /Mu /Nu /Omicron
+ /Pi /Theta /Rho /Sigma
+ /Tau /Upsilon /sigma1 /Omega
+ /Xi /Psi /Zeta /bracketleft
+ /therefore /bracketright /perpendicular /underscore
+% \140
+ /radicalex /alpha /beta /chi
+ /delta /epsilon /phi /gamma
+ /eta /iota /phi1 /kappa
+ /lambda /mu /nu /omicron
+ /pi /theta /rho /sigma
+ /tau /upsilon /omega1 /omega
+ /xi /psi /zeta /braceleft
+ /bar /braceright /similar /.notdef
+% \200
+ StandardEncoding 0 32 getinterval aload pop % /.notdef
+% \240
+ /Euro /Upsilon1 /minute /lessequal
+ /fraction /infinity /florin /club
+ /diamond /heart /spade /arrowboth
+ /arrowleft /arrowup /arrowright /arrowdown
+ /degree /plusminus /second /greaterequal
+ /multiply /proportional /partialdiff /bullet
+ /divide /notequal /equivalence /approxequal
+ /ellipsis /arrowvertex /arrowhorizex /carriagereturn
+% \300
+ /aleph /Ifraktur /Rfraktur /weierstrass
+ /circlemultiply /circleplus /emptyset /intersection
+ /union /propersuperset /reflexsuperset /notsubset
+ /propersubset /reflexsubset /element /notelement
+ /angle /gradient /registerserif /copyrightserif
+ /trademarkserif /product /radical /dotmath
+ /logicalnot /logicaland /logicalor /arrowdblboth
+ /arrowdblleft /arrowdblup /arrowdblright /arrowdbldown
+% \340
+ /lozenge /angleleft /registersans /copyrightsans
+ /trademarksans /summation /parenlefttp /parenleftex
+ /parenleftbt /bracketlefttp /bracketleftex /bracketleftbt
+ /bracelefttp /braceleftmid /braceleftbt /braceex
+ /.notdef /angleright /integral /integraltp
+ /integralex /integralbt /parenrighttp /parenrightex
+ /parenrightbt /bracketrighttp /bracketrightex /bracketrightbt
+ /bracerighttp /bracerightmid /bracerightbt /.notdef
+256 packedarray .defineencoding
+2 SymbolEncoding .registerencoding
+exec
diff --git a/Master/xemtex/gslib/gs_t.xbm b/Master/xemtex/gslib/gs_t.xbm
new file mode 100644
index 00000000000..e35c2b7acb8
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/gs_t.xpm b/Master/xemtex/gslib/gs_t.xpm
new file mode 100644
index 00000000000..8b587ecd69d
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/gs_t_m.xbm b/Master/xemtex/gslib/gs_t_m.xbm
new file mode 100644
index 00000000000..3cfe6237bc5
--- /dev/null
+++ b/Master/xemtex/gslib/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/Master/xemtex/gslib/gs_trap.ps b/Master/xemtex/gslib/gs_trap.ps
new file mode 100644
index 00000000000..a3d37d3bd3f
--- /dev/null
+++ b/Master/xemtex/gslib/gs_trap.ps
@@ -0,0 +1,104 @@
+% Copyright (C) 1999, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_trap.ps,v 1.3.6.2.2.1 2003/04/12 14:02:38 giles Exp $
+% PostScript LanguageLevel 3 in-RIP trapping support.
+
+ll3dict begin
+
+% We need LanguageLevel 2 or higher in order to have setuserparams and
+% defineresource.
+languagelevel dup 2 .max .setlanguagelevel
+
+% ------ Trapping ------ %
+
+% The PostScript-level trapping parameters are maintained in userdict,
+% and explicitly reinstalled upon restore.
+
+/Trapping mark
+
+/settrapparams dup { % <paramdict> settrapparams -
+ /.trapparams .uservar dup length dict .copydict
+ dup 2 index {
+ % Stack: paramdict olddict olddict key value
+ 2 index 2 index known { put dup } { pop pop } ifelse
+ } forall pop
+ dup .settrapparams % Let the operator check parameter validity.
+ .userdict /.trapparams 3 -1 roll put pop
+} bind .makeoperator
+
+/.copyparams { % <obj> .copyparams <obj'>
+ dup type /dicttype eq {
+ dup length dict .copydict
+ dup {
+ .copyparams 3 copy put pop pop
+ } forall
+ } {
+ dup type /arraytype eq {
+ [ exch { .copyparams } forall ]
+ } if
+ } ifelse
+} odef
+
+/currenttrapparams dup { % - currenttrapparams <paramdict>
+ /.trapparams .uservar .copyparams
+} bind .makeoperator
+
+/settrapzone dup { % - settrapzone -
+ % ****** DUMMY ******
+ newpath
+} bind .makeoperator
+
+% Define initial (dummy) trapping parameters.
+% These values are mostly complete guesses.
+userdict /.trapparams mark
+ /BlackColorLimit 1.0
+ /BlackDensityLimit 1.0
+ /BlackWidth 1.0
+ /ColorantZoneDetails 0 dict
+ /Enabled true
+ /HalftoneName null
+ /ImageInternalTrapping false
+ /ImagemaskTrapping true
+ /ImageResolution 1
+ /ImageToObjectTrapping true
+ /ImageTrapPlacement /Center
+ /SlidingTrapLimit 1.0
+ /StepLimit 1.0
+ /TrapColorScaling 0.0
+ /TrapSetName null
+ /TrapWidth 1.0
+.dicttomark readonly put
+
+.dicttomark /ProcSet defineresource pop
+
+% Define the InkParams and TrapParams resource categories.
+{ /InkParams /TrapParams } {
+ /Generic /Category findresource dup maxlength 3 add dict .copydict begin
+ /InstanceType /dicttype def
+ currentdict end /Category defineresource pop
+} forall
+
+% Define the TrappingType resource category.
+/Generic /Category findresource dup maxlength 3 add dict .copydict begin
+ /InstanceType /integertype def
+/TrappingType currentdict end /Category defineresource pop
+
+{1001} { dup /TrappingType defineresource pop } forall
+
+.setlanguagelevel
+
+end % ll3dict
diff --git a/Master/xemtex/gslib/gs_ttf.ps b/Master/xemtex/gslib/gs_ttf.ps
new file mode 100644
index 00000000000..3d3a6ba1f1b
--- /dev/null
+++ b/Master/xemtex/gslib/gs_ttf.ps
@@ -0,0 +1,1789 @@
+% Copyright (C) 1996, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_ttf.ps,v 1.9.2.4.2.1 2003/04/12 14:02:38 giles Exp $
+% Support code for direct use of TrueType fonts.
+% (Not needed for Type 42 fonts.)
+
+% Note that if you want to use this file without including the ttfont.dev
+% option when you built Ghostscript, you will need to load the following
+% files before this one:
+% lib/gs_mgl_e.ps
+% lib/gs_mro_e.ps
+% lib/gs_wan_e.ps
+
+% Thanks to B. Jackowski and GUST (the Polish TeX Users' Group) for
+% the glyf-splitting code.
+
+[
+ /TTCMAP_DEBUG
+ /TTCMAP2_DEBUG
+] {dup where {pop pop} { currentdict exch false def pop } ifelse} forall
+
+
+% ---------------- Font loading machinery ---------------- %
+
+% Augment the FONTPATH machinery so it recognizes TrueType fonts.
+
+/.scanfontheaders where {
+ pop /.scanfontheaders [
+ .scanfontheaders aload pop (\000\001\000\000*) (true*)
+ ] def
+} if
+
+% <file> <key> .findfontvalue <value> true
+% <file> <key> .findfontvalue false
+% Closes the file in either case.
+/.findnonttfontvalue /.findfontvalue load def
+/.findfontvalue {
+ 1 index read pop 2 index 1 index unread
+ dup 0 eq exch (t) 0 get eq or {
+ % If this is a font at all, it's a TrueType font.
+ dup /FontType eq {
+ pop closefile 42 true
+ } {
+ dup /FontName eq { pop .findttfontname } { pop closefile false } ifelse
+ } ifelse
+ } {
+ % Not a TrueType font.
+ .findnonttfontvalue
+ } ifelse
+} bind def
+
+% <file> .findttfontname <fname> true
+% <file> .findttfontname false
+% Closes the file in either case.
+/.findttfontname {
+ .loadttfonttables
+ tabdict /name .knownget {
+ dup 8 getu32 f exch setfileposition
+ 12 getu32 string f exch readstring pop
+ 6 findname
+ } {
+ false
+ } ifelse
+ f closefile end end
+} bind def
+
+% Load a font file that might be a TrueType font.
+
+% <file> .loadfontfile -
+/.loadnonttfontfile /.loadfontfile load def
+/.loadfontfile {
+ dup read pop 2 copy unread 0 eq {
+ % If this is a font at all, it's a TrueType font.
+ .loadttfont pop
+ } {
+ % Not a TrueType font.
+ .loadnonttfontfile
+ } ifelse
+} bind def
+
+% ---------------- Automatic Type 42 generation ---------------- %
+
+% Load a TrueType font from a file as a Type 42 PostScript font.
+% The thing that makes this really messy is the handling of encodings.
+% There are 2 interacting tables that affect the encoding:
+% 'cmap' provides multiple maps from character codes to glyph indices
+% 'post' maps glyph indices to glyph names (if present)
+% What we need to get out of this is:
+% Encoding mapping character codes to glyph names
+% (the composition of cmap and post)
+% CharStrings mapping glyph names to glyph indices
+% (the inverse of post)
+% If the post table is missing, we have to take a guess based on the cmap
+% table.
+
+/.loadttfontdict 50 dict dup begin
+
+/orgXUID AladdinEnterprisesXUID def
+/maxstring 32000 def % half the maximum length of a PostScript string,
+ % must be a multiple of 4 (for hmtx / loca / vmtx)
+
+% Define the Macintosh standard mapping from characters to glyph indices.
+/MacRomanEncoding dup .findencoding def
+/MacGlyphEncoding dup .findencoding def
+
+% Invert the MacRomanEncoding.
+/.romanmacdict 300 dict
+0 1 MacRomanEncoding length 1 sub {
+ MacRomanEncoding 1 index get
+ % Stack: dict index charname
+ dup /.notdef ne {
+ exch 2 index 2 index .knownget {
+ dup type /arraytype eq {
+ [ exch aload pop counttomark 2 add -1 roll ]
+ } {
+ exch 2 array astore
+ } ifelse
+ } if 2 index 3 1 roll put
+ } {
+ pop pop
+ } ifelse
+} for def
+
+% Define remapping for misnamed glyphs in TrueType 'post' tables.
+% There are probably a lot more than this!
+/postremap mark
+ /Cdot /Cdotaccent
+ /Edot /Edotaccent
+ /Eoverdot /Edotaccent
+ /Gdot /Gdotaccent
+ /Ldot /Ldotaccent
+ /Zdot /Zdotaccent
+ /cdot /cdotaccent
+ /edot /edotaccent
+ /eoverdot /edotaccent
+ /gdot /gdotaccent
+ /ldot /ldotaccent
+ /zdot /zdotaccent
+.dicttomark readonly def
+
+% ---- Utilities ---- %
+
+% Define a serial number for creating unique XUIDs for TrueType fonts.
+% We used to use the checkSumAdjustment value from the font, but this is
+% not reliable, since some fonts don't set it correctly.
+% Note that we must do this in a string to make it immune to save/restore.
+/xuidstring <80000000> def
+/curxuid { % - curxuid <int>
+ 0 xuidstring { exch 8 bitshift exch add } forall
+} bind def
+/nextxuid { % - nextxuid -
+ 3 -1 0 {
+ xuidstring 1 index 2 copy get dup 255 ne {
+ 1 add put pop exit
+ } if pop 0 put pop
+ } for
+} bind def
+
+% <string> <index> getu16 <integer>
+/getu16 {
+ 2 copy get 8 bitshift 3 1 roll 1 add get add
+} bind def
+
+% <string> <index> gets16 <integer>
+/gets16 {
+ getu16 16#8000 xor 16#8000 sub
+} bind def
+
+% <string> <index> getu32 <integer>
+/getu32 {
+ 2 copy getu16 16 bitshift 3 1 roll 2 add getu16 add
+} bind def
+
+% <string> <index> gets32 <integer>
+/gets32 {
+ 2 copy gets16 16 bitshift 3 1 roll 2 add getu16 add
+} bind def
+
+% <string> <index> <integer> putu16 -
+/putu16 {
+ 3 copy -8 bitshift put
+ exch 1 add exch 16#ff and put
+} bind def
+
+% <string> <index> <integer> putu32 -
+/putu32 {
+ 3 copy -16 bitshift putu16
+ exch 2 add exch 16#ffff and putu16
+} bind def
+
+% <string> .strtoint <integer>
+/.strtoint {
+ 0 exch { exch 8 bitshift add } forall
+} bind def
+
+% <nametable> <nameid> findname <string> true
+% <nametable> <nameid> findname false
+/findname {
+ DEBUG { (findname: ) print dup =only } if
+ false 3 1 roll 0 1 3 index 2 getu16 1 sub {
+ % Stack: false table id index
+ 12 mul 6 add 2 index exch 12 getinterval
+ dup 6 getu16 2 index eq {
+ % We found the name we want.
+ exch pop
+ % Stack: false table record
+ dup 10 getu16 2 index 4 getu16 add
+ 1 index 8 getu16 4 -1 roll 3 1 roll getinterval exch
+ % Stack: false string record
+ % Check for 8- vs. 16-bit characters.
+ is2byte { string2to1 } if true null 4 -1 roll exit
+ } if pop
+ } for pop pop
+ DEBUG {
+ dup { ( = ) print 1 index == } { ( not found) = } ifelse
+ } if
+} bind def
+
+% <namerecord> is2byte <bool>
+/is2byte {
+ dup 0 getu16 {
+ { pop true } % Apple Unicode
+ { pop false } % Macintosh Script manager
+ { 1 getu16 1 eq } % ISO
+ { 1 getu16 1 eq } % Microsoft
+ } exch get exec
+} bind def
+
+% <string2> string2to1 <string>
+/string2to1 {
+ dup length 2 idiv string dup
+ 0 1 3 index length 1 sub {
+ 3 index 1 index 2 mul 1 add get put dup
+ } for pop exch pop
+} bind def
+
+% <array> <lt-proc> sort <array>
+/sort {
+ 1 index length 1 sub -1 1 {
+ 2 index exch 2 copy get 3 copy % arr proc arr i arr[i] arr i arr[i]
+ 0 1 3 index 1 sub {
+ 3 index 1 index get % arr proc arr i arr[i] arr imax amax j arr[j]
+ 2 index 1 index 10 index exec { % ... amax < arr[j]
+ 4 2 roll
+ } if pop pop
+ } for % arr proc arr i arr[i] arr imax amax
+ 4 -1 roll exch 4 1 roll put put
+ } for pop
+} def
+
+% <array|string> <index> <count> .safegetinterval <subarray|substring>
+/.safegetinterval {
+ exch 2 index length .min exch
+ 2 index length 2 index sub .min
+ getinterval
+} bind def
+
+% <array> <index> <obj> .safeput -
+/.safeput {
+ 2 index length 2 index gt { put } { pop pop pop } ifelse
+} bind def
+
+% Each procedure in this dictionary is called as follows:
+% <encodingtable> proc <glypharray>
+/cmapformats mark
+ 0 { % Apple standard 1-to-1 mapping.
+ 6 256 getinterval { } forall 256 packedarray
+ } bind
+ 2 { % Apple 16bit CJK (ShiftJIS etc)
+
+ % /sHK_sz subHeaderKey_size % 1 * uint16
+ % /sH_sz subHeader_size % 4 * uint16
+ % /sH_len subHeader_length
+ % /cmapf2_tblen total table length
+ % /cmapf2_lang language code (not used)
+ % /sHKs subHeaderKeys
+
+ /sHK_sz 2 def
+ /sH_sz 8 def
+ dup 2 getu16 /cmapf2_tblen exch def
+
+ TTCMAP2_DEBUG {
+ (format2 table length: 0x) print
+ cmapf2_tblen 16 10 string cvrs print
+ (=) print
+ cmapf2_tblen == flush
+ } if
+ dup 4 getu16 /cmapf2_lang exch def
+
+ TTCMAP2_DEBUG {
+ (format2 lang code: 0x) print
+ cmapf2_lang 16 10 string cvrs == flush
+ } if
+ dup 6 256 sHK_sz mul getinterval /sHKs exch def
+ TTCMAP2_DEBUG {
+ (format2 subHeaderKeys: ) print
+ sHKs == flush
+ (scan subHeaderKeys\n) print flush
+ } if
+
+ 0 % initialization value for /sH_len
+ 0 1 255 {
+ TTCMAP2_DEBUG {
+ (hi byte ) =only
+ dup 16 10 string cvrs =only
+ (-> subHeader #) print
+ flush
+ } if
+ sHKs exch
+ 2 mul getu16
+ TTCMAP2_DEBUG {
+ dup 16 10 string cvrs =only
+ ( ) print dup == flush
+ } if
+ 1 index % get current max
+ 1 index % get current subHeaderKey
+ lt {exch} if pop
+ } for
+ /sH_len exch def
+
+ TTCMAP2_DEBUG {
+ (format2 subHeader length: ) print
+ sH_len ==
+ flush
+ } if
+ dup 6 256 sHK_sz mul add
+ cmapf2_tblen 1 index sub getinterval
+ /sH_gIA exch def
+ TTCMAP2_DEBUG {
+ (format2 subHeaders + GID array: ) print
+ sH_gIA ==
+ } if
+
+ /cmapf2_glyph_array 65535 array def
+
+ /.cmapf2_putGID {
+ /cmapf2_ch cmapf2_ch_hi 8 bitshift cmapf2_ch_lo add def
+ TTCMAP2_DEBUG {
+ (code: ) =only cmapf2_ch 16 4 string cvrs =only
+ ( -> ) =only
+ } if
+ firstCode cmapf2_ch_lo le
+ cmapf2_ch_lo firstCode entryCount add lt
+ and { % true: j is inside
+ sH_offset idRangeOffset add % offset to gI
+ cmapf2_ch_lo firstCode sub 2 mul % rel. pos. in range
+ add 6 add % offset in sH_gIA
+ sH_gIA exch getu16
+ dup 0 gt { %
+ TTCMAP2_DEBUG {
+ dup 16 8 string cvrs =only
+ (+) =only idDelta 16 8 string cvrs =only
+ } if
+ idDelta add
+ TTCMAP2_DEBUG {
+ (=) =only dup 16 8 string cvrs == flush
+ } if
+ cmapf2_glyph_array exch cmapf2_ch exch put
+ } {
+ TTCMAP2_DEBUG {(specified 0: 0\n) print flush} if
+ pop
+ % cmapf2_glyph_array cmapf2_ch 0 put
+ } ifelse
+ } { % false: j is outside
+ TTCMAP2_DEBUG {(outside of range: 0\n) print flush} if
+ % cmapf2_glyph_array cmapf2_ch 0 put
+ } ifelse
+ } def
+
+ 16#00 1 16#ff { % hi_byte scan
+ /cmapf2_ch_hi exch def
+ sHKs cmapf2_ch_hi sHK_sz mul getu16
+ TTCMAP2_DEBUG {
+ (subHeader_offset = idx * 8 = ) print
+ dup ==
+ } if
+ /sH_offset exch def
+ sH_gIA sH_offset sH_sz getinterval
+ dup 0 getu16 /firstCode exch def
+ dup 2 getu16 /entryCount exch def
+ dup 4 gets16 /idDelta exch def
+ dup 6 getu16 /idRangeOffset exch def
+ pop
+ TTCMAP2_DEBUG {
+ (idRangeOffset: ) print idRangeOffset 16 8 string cvrs ==
+ } if
+ sH_offset 0 eq {
+ /cmapf2_ch_lo cmapf2_ch_hi def
+ /cmapf2_ch_hi 0 def
+ .cmapf2_putGID
+ } {
+ 16#00 1 16#ff { % lo_byte scan
+ /cmapf2_ch_lo exch def
+ .cmapf2_putGID
+ } for
+ } ifelse
+ } for
+ pop
+ 0 1 cmapf2_glyph_array length 1 sub { % rewrite null -> 0.
+ % TTCMAP2_DEBUG { (rewriting null: ) print dup == flush } if
+ dup cmapf2_glyph_array exch get
+ null eq { cmapf2_glyph_array exch 0 put } {pop} ifelse
+ } for
+ TTCMAP2_DEBUG { (rewriting finished\n) print flush } if
+ cmapf2_glyph_array
+ TTCMAP2_DEBUG {
+ 16#0000 16#0010 16#fff0 {
+ 16#0000 16#0001 16#000f {
+ 1 index add dup 16#ffff lt {
+ 2 index exch get =only
+ ( ) =only
+ } { pop } ifelse
+ } for
+ pop
+ (\n) print flush
+ } for
+ } if
+ } bind
+ 4 { % Microsoft/Adobe segmented mapping.
+ /etab exch def
+ /nseg2 etab 6 getu16 def
+ 14 /endc etab 2 index nseg2 getinterval def
+ % The Apple TrueType documentation omits the 2-byte
+ % 'reserved pad' that follows the endCount vector!
+ 2 add
+ nseg2 add /startc etab 2 index nseg2 getinterval def
+ nseg2 add /iddelta etab 2 index nseg2 getinterval def
+ nseg2 add /idroff etab 2 index nseg2 getinterval def
+ % The following hack allows us to properly handle
+ % idiosyncratic fonts that start at 0xf000:
+ pop
+ /firstcode startc 0 getu16 16#ff00 and dup 16#f000 ne { pop 0 } if def
+ /putglyph {
+ glyphs code 3 -1 roll put /code code 1 add def
+ } bind def
+ % Do a first pass to compute the size of the glyphs array.
+ /numcodes 0 def /glyphs 0 0 2 nseg2 3 sub {
+ % Stack: /glyphs numglyphs i2
+ /i2 exch def
+ /scode startc i2 getu16 def
+ /ecode endc i2 getu16 def
+ numcodes scode firstcode sub
+ % Hack for fonts that have only 0x0000 and 0xf000 ranges
+ %dup 16#e000 ge { 255 and } if
+ % the previous line is obstructive to CJK fonts, so it was removed
+ exch sub 0 .max ecode scode sub 1 add add
+ exch 1 index add exch
+ numcodes add /numcodes exch def
+ } for array def
+ % Now fill in the array.
+ /numcodes 0 def /code 0 def
+ 0 2 nseg2 3 sub {
+ /i2 exch def
+ /scode startc i2 getu16 def
+ /ecode endc i2 getu16 def
+ numcodes scode firstcode sub
+ % Hack for fonts that have only 0x0000 and 0xf000 ranges
+ %dup 16#e000 ge { 255 and } if
+ % the previous line is obstructive to CJK fonts, so it was removed
+ exch sub 0 .max dup { 0 putglyph } repeat
+ ecode scode sub 1 add add numcodes add /numcodes exch def
+ /delta iddelta i2 gets16 def
+ DEBUG {
+ (scode=) print scode =only
+ ( ecode=) print ecode =only
+ ( delta=) print delta =only
+ ( droff=) print idroff i2 getu16 =
+ } if
+ idroff i2 getu16 dup 0 eq {
+ pop scode delta add 65535 and 1 ecode delta add 65535 and
+ { putglyph } for
+ } { % The +2 is for the 'reserved pad'.
+ /gloff exch 14 nseg2 3 mul add 2 add i2 add add def
+ 0 1 ecode scode sub {
+ 2 mul gloff add etab exch getu16
+ dup 0 ne { delta add 65535 and } if putglyph
+ } for
+ } ifelse
+ } for glyphs /glyphs null def % for GC
+ } bind
+ 6 { % Single interval lookup.
+ dup 6 getu16 /firstcode exch def dup 8 getu16 /ng exch def
+ firstcode ng add array
+ % Stack: tab array
+ % Fill elements 0 .. firstcode-1 with 0
+ 0 1 firstcode 1 sub { 2 copy 0 put pop } for
+ dup firstcode ng getinterval
+ % Stack: tab array subarray
+ % Fill elements firstcode .. firstcode+nvalue-1 with glyph values
+ 0 1 ng 1 sub {
+ dup 2 mul 10 add 4 index exch getu16 3 copy put pop pop
+ } for pop exch pop
+ } bind
+.dicttomark readonly def % cmapformats
+
+% <cmaptab> cmaparray <glypharray>
+/cmaparray {
+ dup 0 getu16
+
+ cmapformats exch .knownget {
+ DEBUG {
+ (cmap: format ) print 1 index 0 getu16 = flush
+ } if exec
+ } {
+ (Can't handle format ) print 0 getu16 = flush
+ 0 1 255 { } for 256 packedarray
+ } ifelse
+ DEBUG {
+ (cmap: length=) print dup length = dup ==
+ } if
+} bind def
+
+% Each procedure in this dictionary is called as follows:
+% posttable <<proc>> glyphencoding
+/postformats mark
+ 16#00010000 { % 258 standard Macintosh glyphs.
+ pop MacGlyphEncoding
+ }
+ 16#00020000 { % Detailed map, required by Microsoft fonts.
+ /postglyphs exch def
+ postglyphs 32 getu16 /numglyphs exch def
+ /glyphnames numglyphs 2 mul 34 add def
+ [ 0 1 numglyphs 1 sub {
+ 2 mul 34 add postglyphs exch getu16
+ dup 258 lt {
+ MacGlyphEncoding exch get
+ } {
+ dup 32768 ge {
+ % According to the published TrueType spec, such values are
+ % "reserved for future use", but at least some PDF files
+ % produced by the Adobe PDF library contain entries with a
+ % value of 16#ffff.
+ pop /.notdef
+ } {
+ 258 sub glyphnames exch {
+ postglyphs 1 index get 1 add add
+ } repeat
+ 1 add postglyphs exch 2 copy 1 sub get getinterval cvn
+ % At least some of Microsoft's TrueType fonts use incorrect
+ % (Adobe-incompatible) names for some glyphs.
+ % Correct for this here.
+ postremap 1 index .knownget { exch pop } if
+ } ifelse
+ } ifelse
+ } for ]
+ } bind
+ 16#00030000 { % No map.
+ pop [ ]
+ } bind
+.dicttomark readonly def % postformats
+
+% Each procedure in this dictionary is called as follows:
+% <file> <length> -proc- <string|array_of_strings>
+% Note that each table must have an even length, because of a strange
+% Adobe requirement that each sfnts entry have even length.
+/readtables mark
+ % Ordinary tables
+ (cmap) { .readtable }
+ (head) 1 index
+ (hhea) 1 index
+ (maxp) 1 index
+ (name) 1 index
+ (OS/2) 1 index
+ (post) 1 index
+ (vhea) 1 index
+ % Big tables
+ (glyf) { .readbigtable }
+ (loca) 1 index
+ (hmtx) 1 index
+ (vmtx) 1 index
+ % Tables only needed for embedding in PDF files
+ (cvt ) { .readtable }
+ (fpgm) 1 index
+ (prep) 1 index
+ (GSUB) 1 index
+.dicttomark
+% Normally there would be a 'readonly' here, but the ttf2pf utility wants
+% to include the 'kern' table as well, so we leave the readtables dictionary
+% writable.
+def % readtables
+
+% Read a table as a single string.
+% <file> <length> .readtable <string>
+/.readtable {
+ dup dup 1 and add string
+ % Stack: f len str
+ dup 0 4 -1 roll getinterval
+ % Stack: f str str1
+ % Because of the absurd PostScript specification that gives an
+ % error for reading into an empty string, we have to check for
+ % this explicitly here.
+ 3 -1 roll exch
+ dup () ne { readstring } if pop pop
+} bind def
+
+% Read a big table (one that may exceed 64K).
+% <file> <length> .readbigtable <string[s]>
+/.readbigtable {
+ dup 65400 lt {
+ .readtable
+ } {
+ currentuserparams /VMReclaim get -2 vmreclaim
+ [ 4 2 roll {
+ % Stack: mark ... f left
+ dup maxstring le { exit } if
+ 1 index maxstring string readstring pop 3 1 roll maxstring sub
+ } loop .readtable ]
+ exch vmreclaim
+ } ifelse
+} bind def
+
+end readonly def % .loadttfontdict
+
+% <tab> .printtab -
+/.printtab {
+ dup 0 4 getinterval print ( ) print
+ dup 8 getu32 =only ( ) print
+ 12 getu32 =
+} bind def
+
+% <file> .loadttfonttables -
+% <file> <fontindex> .loadttfonttables - % extention by hideyuki
+% Pushes .loadttfontdict & scratch dict on d-stack.
+% Defines f, offsets, tables, tabdict, tabs.
+/.loadttfonttables {
+ .loadttfontdict begin
+ 40 dict begin
+ dup type /integertype eq % extention by hideyuki
+ { 1 sub } { 0 } ifelse /findex exch def
+ /f exch def
+ /offsets f 12 string readstring pop def
+
+ % TrueType Collection File support
+ % Jan 11 2000: Hideyuki Suzuki <hideyuki@sat.t.u-tokyo.ac.jp>
+ % Feb 10 2001: suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+ offsets 0 4 getinterval (ttcf) eq {
+ [ 1 1 offsets 8 getu32 { pop f 4 string readstring pop 0 getu32} for ]
+ dup findex get dup /ttcheader exch def exch length 4 mul 12 add sub
+ %dup 0 gt { string f exch readstring pop } if pop
+ f fileposition add f exch setfileposition
+ % the previous line is for very large ttcf, hacked by suzuki toshiya
+ /offsets f 12 string readstring pop def
+ } { /ttcheader 0 def } ifelse
+
+ /tables f offsets 4 getu16 16 mul string readstring pop def
+ /tabdict tables length 16 idiv dict def
+ % tabs = tables we want to keep, sorted by file position.
+ /tabs [ 0 16 tables length 1 sub {
+ tables exch 16 getinterval
+ DEBUG { dup .printtab } if
+ dup 0 4 getinterval readtables 1 index known {
+ tabdict exch 2 index put
+ } {
+ pop pop
+ } ifelse
+ } for ] {
+ exch 8 getu32 exch 8 getu32 lt
+ } sort def
+ % In certain malformed TrueType fonts, tables overlap.
+ % Truncate tables if necessary.
+ 0 1 tabs length 2 sub {
+ dup tabs exch get exch 1 add tabs exch get
+ 1 index 8 getu32 2 index 12 getu32 add
+ 1 index 8 getu32 gt {
+ (**** Warning: ) print 1 index 0 4 getinterval print
+ ( overlaps ) print dup 0 4 getinterval print
+ (, truncating.) = flush
+ dup 8 getu32 2 index 8 getu32 sub
+ 2 index 12 3 -1 roll putu32
+ } if pop pop
+ } for
+} bind def
+
+% - .readttdata -
+% Read data. Updates offsets, tabs; stores data in tabdict.
+/.readttdata {
+
+ % TrueType Collection File support
+ % Jan 11 2000: Hideyuki Suzuki <hideyuki@sat.t.u-tokyo.ac.jp>
+ % /fpos offsets length tables length add def
+ /fpos ttcheader offsets length tables length add add def
+ /sfpos offsets length tabs length 16 mul add def
+ offsets 4 tabs length putu16
+ tabs {
+ dup 0 4 getinterval /tname exch def
+ dup 8 getu32 /tpos exch def
+ dup 12 getu32 /tlen exch def
+ 8 sfpos putu32
+ % Skip data between the end of the previous table and
+ % the beginning of this one, if any.
+ tpos fpos gt {
+ f tpos fpos sub () /SubFileDecode filter dup flushfile closefile
+ /fpos tpos def
+ } if
+ f tlen readtables tname get exec
+ tabdict tname 3 -1 roll put
+ /fpos fpos tlen add def
+ % Round up the table length to an even value.
+ /sfpos sfpos tlen dup 1 and add add def
+ } forall
+} bind def
+
+% Find the string in a list of strings that includes a given index.
+% <strings> <index> .findseg <string> <index'>
+/.findseg {
+ exch {
+ dup length 2 index gt { exch exit } if
+ length sub
+ } forall
+} bind def
+
+% - .makesfnts -
+% Defines checksum, getloca, head, locatable, numloca, post, sfnts, upem
+/.makesfnts {
+ .readttdata
+ /head tabdict /head get def
+ /locatable tabdict /loca get def
+ /post tabdict /post .knownget not { null } if def
+ /numloca
+ locatable dup type /stringtype eq
+ { length }
+ { 0 exch { length add } forall }
+ ifelse % no def yet
+ locatable type /stringtype eq {
+ /.indexloca {} def
+ } {
+ /.indexloca /.findseg load def
+ } ifelse
+ head 50 getu16 0 ne {
+ /getloca {
+ 2 bitshift locatable exch .indexloca getu32
+ } def
+ 4 idiv 1 sub
+ } {
+ /getloca {
+ dup add locatable exch .indexloca getu16 dup add
+ } def
+ 2 idiv 1 sub
+ } ifelse def % numloca
+ % If necessary, re-partition the glyfs.
+ tabdict /glyf get dup type /stringtype ne {
+ .dividesfnts tabdict /glyf 3 -1 roll put
+ } {
+ pop
+ } ifelse
+ /sfnts [
+ offsets tabs { concatstrings } forall
+ tabs {
+ 0 4 getinterval tabdict exch get
+ dup type /stringtype ne { aload pop } if
+ } forall
+ ] def
+} bind def
+
+% <glyfs> .dividesfnts <glyfs'>
+/.dividesfnts {
+ /glyfs exch def
+ /len1 0 glyfs { length add } forall def
+ % Determine where to split the glyfs by scanning loca.
+ % The very last entry in loca may be bogus.
+ % Note that some loca entries may be odd, but we can only
+ % split at even positions.
+ %
+ % Construct splitarray, the array of final lengths of
+ % the sfnts entries covering the glyfs (i.e., all but
+ % the first and last sfnts entries).
+ /prevsplit 0 def
+ /prevboundary 0 def
+ /prevoddboundary 0 def % see TYPE42_NO_ODDSIZE_STR in zfont42.c
+ /splitarray [
+ 0 1 numloca 1 sub {
+ getloca dup prevsplit maxstring add gt {
+ prevboundary prevsplit eq { % see TYPE42_NO_ODDSIZE_STR in zfont42.c
+ /ferr (%stderr) (w) file def
+ ferr (glyf table ) writestring
+ ferr prevsplit 10 string cvs writestring
+ ferr ( - ) writestring
+ dup 10 string cvs ferr exch writestring
+ ferr ( too long segment without suitable boundary.\n)
+ writestring
+ ferr closefile
+ /prevboundary prevoddboundary def
+ } if
+ DEBUG {
+ dup 10 string cvs print
+ ( segment is longer than maxstring, split now ) print
+ prevboundary 10 string cvs print
+ ( - ) print
+ prevsplit 10 string cvs print
+ (\n) print
+ } if
+ prevboundary prevsplit sub exch
+ /prevsplit prevboundary def
+ % /prevoddboundary 0 def
+ } if
+ dup 1 and 0 eq { % see TYPE42_NO_ODDSIZE_STR in zfont42.c
+ DEBUG {
+ dup 10 string cvs print
+ ( \() print
+ dup prevsplit sub 10 string cvs print
+ (\) ) print
+ ( even length OK\n) print
+ } if
+ /prevboundary exch def
+ % /prevoddboundary 0 def
+ } {
+ DEBUG {
+ dup 10 string cvs print
+ ( \() print
+ dup prevsplit sub 10 string cvs print
+ (\) ) print
+ ( odd length!\n) print
+ } if
+ % prevoddboundary 0 eq {
+ /prevoddboundary exch def
+ % } { pop } ifelse
+ } ifelse
+ % dup 0 eq { (why ZERO?\n) print } if
+ % dup ==
+ } for
+ len1 prevsplit sub
+ ] def
+ currentuserparams /VMReclaim get -2 vmreclaim
+ [
+ % Re-split the sfnts glyfs strings according to splitarray.
+ % We do this by iterating over the final segments defined
+ % by splitarray, and constructing them from pieces of the
+ % current glyfs strings. We recycle the current strings
+ % when possible, to avoid stressing the allocator.
+ /sfnt_idx 0 def
+ /strpos 0 def
+ /avail () def
+ splitarray {
+ /seglen exch def
+ /segpos 0 def
+ avail length seglen ge
+ { avail 0 seglen getinterval /avail () def } { seglen string }
+ ifelse
+ {
+ /str glyfs sfnt_idx get def
+ /strlen str length def
+ /strleft strlen strpos sub def
+ seglen segpos sub strleft lt { exit } if
+ % Copy the (rest of the) string into the new segment.
+ % We know strleft <= segleft.
+ dup segpos str strpos strleft getinterval putinterval
+ /segpos segpos strleft add def
+ /avail str def
+ /sfnt_idx sfnt_idx 1 add def
+ /strpos 0 def
+ segpos seglen eq { exit } if
+ } loop
+ % Fill up the segment with an initial piece of the next
+ % existing glyfs string. We know strleft > segleft.
+ /segleft seglen segpos sub def
+ dup segpos str strpos segleft getinterval putinterval
+ /strpos strpos segleft add def
+ } forall
+ ]
+ exch vmreclaim
+} bind def
+
+% - .getpost -
+% Uses post, defines glyphencoding
+/.getpost {
+ /glyphencoding post null eq {
+ DEBUG { (post missing) = flush } if [ ]
+ } {
+ postformats post 0 getu32 .knownget {
+ DEBUG {
+ (post: format ) print
+ post 0 getu16 =only (,) print post 2 getu16 = flush
+ } if
+ post exch exec
+ } {
+ DEBUG { (post: unknown format ) print post 0 getu32 = flush } if [ ]
+ } ifelse
+ } ifelse def
+} bind def
+
+% - .ttkeys <key> <value> ...
+/.ttkeys {
+ count /ttkeycount exch def
+ /upem head 18 getu16 def
+ /FontMatrix matrix
+ /FontBBox [ 36 2 42 { head exch gets16 upem div } for ]
+ nextxuid
+ tabdict /name .knownget {
+ % Find the names from the 'name' table.
+ /names exch def
+ /FontName names 6 findname not { curxuid 16 8 string cvrs } if
+ /fontname 1 index def
+ /FontInfo mark
+ names 0 findname { /Notice exch } if
+ names 1 findname { /FamilyName exch } if
+ names 4 findname { /FullName exch } if
+ names 5 findname { /Version exch } if
+ } {
+ % No name table, fabricate a FontName.
+ /FontName curxuid 16 8 string cvrs
+ /fontname 1 index def
+ /FontInfo mark
+ } ifelse
+ DEBUG { (fontname ) print fontname = } if
+ % Stack: ... /FontInfo mark key1 value1 ...
+ post null ne {
+ /ItalicAngle post 4 gets32 65536.0 div
+ /isFixedPitch post 12 getu32 0 ne
+ /UnderlinePosition post 8 gets16 upem div
+ /UnderlineThickness post 10 gets16 upem div
+ } if
+ counttomark 0 ne { .dicttomark } { pop pop } ifelse
+ /XUID [orgXUID 42 curxuid]
+ DEBUG {
+ tabs { .printtab } forall
+ [ sfnts { length } forall ] ==
+ count ttkeycount sub array astore dup { == } forall aload pop
+ } if
+ /sfnts sfnts
+} bind def
+
+% ---------------- Standard TrueType font loading ---------------- %
+
+% - .pickcmap -
+% Defines cmapsub, cmaptab
+/.pickcmap {
+ tabdict /cmap get
+ % The Apple cmap format is no help in determining the encoding.
+ % Look for a Microsoft table. If we can't find one,
+ % just use the first table, whatever it is.
+ dup 4 8 getinterval exch % the default
+ 0 1 2 index 2 getu16 1 sub {
+ 8 mul 4 add 1 index exch 8 getinterval
+ dup 0 getu16 /cmap_platform exch def
+ dup 2 getu16 /cmap_encoding exch def
+ DEBUG {
+ (cmap: platform ) print cmap_platform =only
+ ( encoding ) print cmap_encoding = flush
+ } if
+ cmap_platform 3 eq { exch 3 -1 roll pop exit } if pop
+ } for
+ % Stack: subentry table
+ /cmapsub 2 index def
+ exch 4 getu32 1 index length 1 index sub getinterval
+ /cmaptab exch def
+} bind def
+
+% <glyph> .nname <_name>
+/.nname {
+ =string cvs (_) exch concatstrings cvn
+} bind def
+
+% - .charkeys /CharStrings <charstrings> /Encoding <encoding>
+% Resets glyphencoding
+/.charkeys {
+ DEBUG {
+ (glyphencoding: length=) print glyphencoding dup length = === flush
+ } if
+ % Hack: if there is no usable post table but the cmap uses
+ % the Microsoft Unicode encoding, use ISOLatin1Encoding.
+ glyphencoding length 0 eq cmapsub 0 4 getinterval <00030001> eq and {
+ /glyphencoding ISOLatin1Encoding dup length array copy def
+ } if
+ % If necessary, fabricate additional glyphencoding entries
+ % to cover all of loca, or truncate glyphencoding.
+ glyphencoding length numloca lt {
+ /glyphencoding [ glyphencoding aload pop
+ counttomark 1 numloca 1 sub { .nname } for ] def
+ } {
+ /glyphencoding glyphencoding 0 numloca getinterval def
+ } ifelse
+ % Some badly designed Chinese fonts have a post table
+ % in which all glyphs other than 0 are named .null.
+ % Use CharStrings to keep track of the reverse map from
+ % names to glyphs, and don't let any name be used for
+ % more than one glyph.
+ /CharStrings glyphencoding dup length 1 add dict % +1 for .notdef
+ 0 1 3 index length 1 sub {
+ % Stack: glyphencoding dict index
+ 2 index 1 index get 2 index 1 index known {
+ % The same name maps to more than one glyph.
+ % Change the name.
+ pop dup .nname 3 index 2 index 2 index put
+ } if
+ 2 index exch 3 -1 roll put
+ } for exch pop
+ % If there is no .notdef entry, map it to glyph 0.
+ dup /.notdef known not { dup /.notdef 0 put } if
+ readonly
+ /Encoding
+ [ cmaptab cmaparray dup length 256 gt { 0 256 getinterval } if
+ { glyphencoding exch get } forall
+ counttomark 256 exch sub { /.notdef } repeat ]
+ DEBUG { (Encoding: ) print dup === flush } if
+} bind def
+
+% -mark- <key> <value> ... .definettfont <font>
+/.definettfont {
+ /FontType 42
+ /PaintType 0
+ DEBUG {
+ (numloca=) print numloca =
+ } if
+ .dicttomark
+ end end dup /FontName get exch definefont
+} bind def
+
+% <file> .loadttfont <type42font>
+/.loadttfont {
+ .loadttfonttables
+ .makesfnts
+ .getpost
+ .pickcmap
+ mark
+ .charkeys
+ .ttkeys
+ .definettfont
+} bind def
+
+% ---------------- CIDFontType 2 font loading ---------------- %
+
+% Create a string with array of CIDs
+% [ <cid1> ... <cidN> ] .makecidmapstring <string>
+/.makecidmapstring {
+ mark exch cvx exec counttomark % mark 1..N len
+ dup 2 mul string % mark 1..N len s
+ dup 3 -1 roll 1 sub 2 mul -2 0 { % mark 1..N s s
+ 2 copy 5 index -8 bitshift put % mark 1..N s s j2
+ 1 add 4 -1 roll 16#ff and put dup % mark 1..N-1 s s
+ } for pop % mark s
+ exch pop % s
+} bind def
+
+% Create a string or an array of strings with array of CIDs
+% [ <cid1> ... <cidN> ] .makecidmap <string>|[<string> ...]
+% written by Taiji Yamada <taiji@aihara.co.jp>
+/.makecidmap {
+ dup length maxstring le {
+ .makecidmapstring
+ } {
+ dup length dup maxstring idiv exch
+ maxstring mod 0 ne { 1 add } if array exch
+ 0 1 3 index length 1 sub {
+ dup maxstring mul 1 index 1 add maxstring mul
+ 3 index length .min 1 index sub
+ 3 index 3 1 roll getinterval
+ .makecidmapstring
+ 3 index 3 1 roll put
+ } for pop
+ } ifelse
+} bind def
+
+% <file> .loadttcidfont <cidtype2font>
+/.loadttcidfont {
+ .loadttfonttables
+ .makesfnts
+ % CIDFontType2 fonts don't have a cmap: they are indexed by CID.
+ /.ttencmapproc false def
+ mark
+ .ttkeys
+ .definettcidfont
+} bind def
+
+% - .getgsub -
+% Defines gsubh, gsubv, gsubh2v and also defines gsubver, gsubfmt
+% in the case that GSUB table has 'Single Substitution Format 2'
+% which is formally used for vertically oriented glyphs such as CJK fonts.
+% Written by Hideyuki Suzuki <hideyuki@sat.t.u-tokyo.ac.jp>
+% Modified by Taiji Yamada <taiji@aihara.co.jp>
+%
+% [GSUB - The Glyph Substitution Table]
+% Index Size Type Name of Entry
+% -----------------------------------
+% 0 4 Fixed Version
+% 4 2 Offset ScriptList
+% 6 2 Offset FeatureList
+% 8 2 Offset LookupList
+%
+% [Single Substitution Format 2, Subtable at LookupList]
+% Index Size Type Name of Entry
+% -----------------------------------
+% 0 2 uint16 SubstFormat
+% 4 2 Offset Coverage(--)
+% 6 2 uint16 GlyphCount
+% 8 2 GlyphID Substitute(vertically oriented glyphs)
+% -- 2 uint16 SubstFormat
+% +2 2 uint16 GlyphCount(same as above GlyphCount)
+% +4 2 GlyphID GlyphArray(horizontally oriented glyphs)
+% -----------------------------------
+% References
+% 1. http://www.microsoft.com/typography/OTSPEC/gsub.htm
+%
+/.getgsub {
+ /gsubhog null def
+ /gsubvog null def
+ /gsubh2v null def
+ tabdict /GSUB .knownget { % if
+ dup /gsubver exch 0 getu32 def
+ %dup /gsubosl exch 4 getu16 12 add def
+ %dup /gsubofl exch 6 getu16 12 add def
+ dup /gsuboll exch 8 getu16 12 add def
+ DEBUG {
+ (gsubver: ) print gsubver =
+ %(gsubosl: ) print gsubosl =
+ %(gsubofl: ) print gsubofl =
+ (gsuboll: ) print gsuboll =
+ } if
+ dup /gsubfmt exch gsuboll 0 add getu16 def
+ DEBUG {
+ (gsubfmt: ) print gsubfmt =
+ } if
+% gsubver 16#00010000 eq { % ifelse
+ gsubfmt 2 eq { % ifelse
+ dup /gsubocv exch gsuboll 2 add getu16 def
+ dup /gsubglc exch gsuboll 4 add getu16 def
+ % hacked by suzuki toshiya at 2001/3/6
+ %dup /gsubvog exch gsuboll 6 add gsubglc getinterval def
+ %dup /gsubhog exch gsuboll gsubocv add 4 add gsubglc getinterval def
+ dup /gsubvog exch gsuboll 6 add gsubglc 2 mul getinterval def
+ dup /gsubhog exch gsuboll gsubocv add 4 add gsubglc 2 mul getinterval def
+ DEBUG {
+ (gsubocv: ) print gsubocv =
+ (gsubglc: ) print gsubglc =
+
+ (gsubhog->gsubvog ) =
+ 0 2 gsubhog length 2 sub { % for
+ dup
+ gsubhog exch getu16 =only
+ (->) =only
+ gsubvog exch getu16 =
+ } for
+ } if
+ /gsubh2v << 0 2 gsubhog length 2 sub {
+ dup gsubhog exch getu16
+ exch gsubvog exch getu16
+ } for >> def
+ } {
+ %(UNKNOWN GSUB FORMAT.) = flush
+ } ifelse
+% } {
+% (ILLEGAL GSUB VERSION.) = flush
+% } ifelse
+ pop
+ } if
+} bind def
+
+% glyphid .gsublookup glyphid
+% Lookup substitute table. return the origin if not found.
+% modified by Taiji Yamada <taiji@aihara.co.jp> and Hideyuki Suzuki
+/.gsublookup {
+ dup gsubh2v exch .knownget { exch pop } if
+} bind def
+
+% - .getos2 -
+% Defines os2ver, os2cp1, os2cp2
+% to detect the kind of CID with the OS/2 table of a TrueType font.
+% Written by Taiji Yamada <taiji@aihara.co.jp>
+%
+% [OS/2 - OS/2 and Windows Metrics]
+% Index Size Type Name of Entry
+% -----------------------------------
+% 0 2 USHORT version
+% 2 2 SHORT xAvgCharWidth
+% 4 2 USHORT usWeightClass
+% 6 2 USHORT usWidthClass
+% 8 2 SHORT fsType
+% 10 2 SHORT ySubscriptXSize
+% 12 2 SHORT ySubscriptYSize
+% 14 2 SHORT ySubscriptXOffset
+% 16 2 SHORT ySubscriptYOffset
+% 18 2 SHORT ySuperscriptXSize
+% 20 2 SHORT ySuperscriptYSize
+% 22 2 SHORT ySuperscriptXOffset
+% 24 2 SHORT ySuperscriptYOffset
+% 26 2 SHORT yStrikeoutSize
+% 28 2 SHORT yStrikeoutPosition
+% 30 2 SHORT sFamilyClass
+% 32 10 BYTE panose[10]
+% 42 4 ULONG ulUnicodeRange1
+% 46 4 ULONG ulUnicodeRange2
+% 50 4 ULONG ulUnicodeRange3
+% 54 4 ULONG ulUnicodeRange4
+% 58 4 CHAR achVendID[4]
+% 62 2 USHORT fsSelection
+% 64 2 USHORT usFirstCharIndex
+% 66 2 USHORT usLastCharIndex
+% 68 2 SHORT sTypoAscender
+% 70 2 SHORT sTypoDescender
+% 72 2 SHORT sTypoLineGap
+% 74 2 USHORT usWinAscent
+% 76 2 USHORT usWinDescent
+% 78 4 ULONG ulCodePageRange1
+% 82 4 ULONG ulCodePageRange2
+% 86 2 SHORT sxHeight
+% 88 2 SHORT sCapHeight
+% 90 2 USHORT usDefaultChar
+% 92 2 USHORT usBreakChar
+% 94 2 USHORT usMaxContext
+% -----------------------------------
+% References
+% 1. http://www.microsoft.com/typography/OTSPEC/os2.htm
+%
+/.getos2 {
+ /os2ver 0 def
+ tabdict (OS/2) cvn .knownget { % if
+ dup /os2ver exch 0 getu16 def
+ os2ver 0 gt { % if
+ %dup /os2typ exch 8 gets16 def
+ %dup /os2fam exch 30 gets16 def
+ dup /os2ur1 exch 42 getu32 def
+ dup /os2ur2 exch 46 getu32 def
+ dup /os2ur3 exch 50 getu32 def
+ dup /os2ur4 exch 54 getu32 def
+ %dup /os2sel exch 62 getu16 def
+ %dup /os2fci exch 64 getu16 def
+ %dup /os2lci exch 64 getu16 def
+ dup /os2cp1 exch 78 getu32 def
+ dup /os2cp2 exch 82 getu32 def
+ DEBUG {
+ /tmp 64 string def
+ (os2ver: ) print os2ver 2 tmp cvrs =
+ %(os2typ: ) print os2typ 2 tmp cvrs =
+ %(os2fam: ) print os2fam 2 tmp cvrs =
+ (os2ur1: ) print os2ur1 2 tmp cvrs =
+ (os2ur2: ) print os2ur2 2 tmp cvrs =
+ (os2ur3: ) print os2ur3 2 tmp cvrs =
+ (os2ur4: ) print os2ur4 2 tmp cvrs =
+ %(os2sel: ) print os2sel 2 tmp cvrs =
+ %(os2fci: ) print os2fci 2 tmp cvrs =
+ %(os2lci: ) print os2lci 2 tmp cvrs =
+ (os2cp1: ) print os2cp1 2 tmp cvrs =
+ (os2cp2: ) print os2cp2 2 tmp cvrs =
+ [
+ [ 1 0 bitshift (Latin 1) ]
+ [ 1 1 bitshift (Latin 2) ]
+ [ 1 2 bitshift (Cyrillic) ]
+ [ 1 3 bitshift (Greek) ]
+ [ 1 4 bitshift (Turkish) ]
+ [ 1 5 bitshift (Hebrew) ]
+ [ 1 6 bitshift (Arabic) ]
+ [ 1 7 bitshift (Baltic) ]
+ [ 1 8 bitshift (Vietnamese) ]
+ [ 1 16 bitshift (Thai) ]
+ [ 1 17 bitshift (Japanese) ]
+ [ 1 18 bitshift (Simplified Chinese) ]
+ [ 1 19 bitshift (Korean Wansung) ]
+ [ 1 20 bitshift (Traditional Chinese) ]
+ [ 1 21 bitshift (Korean Johab) ]
+ [ 1 31 bitshift (Symbol) ]
+ ] { % forall
+ dup 0 get os2cp1 and 0 gt { % if
+ (CodePage: ) print 1 get =
+ } {
+ pop
+ } ifelse
+ } forall
+ } if
+ } if
+ pop
+ } if
+} bind def
+
+% ---------------- PDF TrueType font loading ---------------- %
+
+% Strictly speaking, this code should be loaded only if we have a PDF
+% interpreter, but it's so closely tied to the rest of the code in this
+% file that we always include it.
+
+% <plat+enc> .findcmap <subtable> true
+% <plat+enc> .findcmap false
+/.findcmap {
+ false exch tabdict /cmap get
+ % Some fonts have multiple cmaps with the same platform and
+ % encoding. Use the first one we find.
+ 0 1 2 index 2 getu16 1 sub {
+ % Stack: false plat+enc cmap index
+ 8 mul 4 add 1 index exch 8 getinterval
+ dup 0 4 getinterval 3 index eq {
+ 4 getu32 1 index exch 1 index length 1 index sub getinterval
+ 4 -1 roll not 4 2 roll exit
+ } if pop
+ } for
+ % Stack: false plat+enc cmap || subtable true plat+enc cmap
+ pop pop
+} bind def
+
+% <subcmap> <chartoglyphmap> .pdfmapchars
+% /CharStrings <charstrings> /Encoding <encoding>
+% Uses encoding
+/.pdfmapchars {
+ exch cmaparray /cmapencoding exch def
+ % Invert glyphencoding (post).
+ /inversepost glyphencoding length dict def
+ 0 1 glyphencoding length 1 sub {
+ glyphencoding 1 index get exch inversepost 3 1 roll put
+ } for
+ /CharStrings mark 3 -1 roll {
+ dup type /arraytype eq {
+ exch /ch exch def { ch exch .pdfaddchar } forall
+ } {
+ .pdfaddchar
+ } ifelse
+ } forall
+ % Add a .notdef => 0 entry if needed. Per Adobe's spec,
+ % .dicttomark (>>) adds pairs in top-to-bottom order.
+ /.notdef 0
+ .dicttomark
+ /Encoding encoding
+} bind def
+% <charname> <charcode> .pdfaddchar <charname> <glyph#>
+% <charname> <charcode> .pdfaddchar -
+/.pdfaddchar {
+ dup cmapencoding length lt {
+ cmapencoding exch get dup 0 eq {
+ pop .pdfaddpost
+ } if
+ } {
+ pop .pdfaddpost
+ } ifelse
+} bind def
+% <charname> .pdfaddpost <charname> <glyph#>
+% <charname> .pdfaddpost -
+/.pdfaddpost {
+ inversepost 1 index .knownget not { pop } if
+} bind def
+
+% - .pdfcharkeys /CharStrings <charstrings> /Encoding <encoding>
+/.pdfcharkeys {
+ % The following algorithms are per the PDF Reference, Second Edition
+ % (PDF 1.3 reference manual).
+ encoding null eq {
+ .charkeys % use default algorithm
+ } {
+ <00030001> .findcmap {
+ AdobeGlyphList .pdfmapchars
+ } {
+ <00010000> .findcmap {
+ .romanmacdict .pdfmapchars
+ } {
+ .charkeys % use default algorithm
+ } ifelse
+ } ifelse
+ } ifelse
+} bind def
+
+% <file> <encoding|null> .loadpdfttfont <type42font>
+/.loadpdfttfont {
+ exch .loadttfonttables
+ /encoding exch def
+ .makesfnts
+ .getpost
+ .pickcmap
+ mark
+ .pdfcharkeys
+ .ttkeys
+ .definettfont
+} bind def
+
+% ---------------- CJK TrueType font loading ---------------- %
+
+% Written by the gs-cjk project
+
+% .parsecmap
+% push an array as a result of reading a CMap file.
+% the array is of the following form.
+% [ [ [ dst src num ] [ dst src num ] ... [ dst src num ] ]
+% [ [ dst src num ] [ dst src num ] ... [ dst src num ] ]
+% ...
+% [ [ dst src num ] [ dst src num ] ... [ dst src num ] ] ]
+% each array [dst src num] corresponds to each line within
+% /begin{bf,cid}{char,range}/end{bf,cid}{char,range} pairs.
+
+/.parsecmapdict mark
+
+ % override system operators
+ /findresource { pop } bind
+ /defineresource { pop pop } bind
+ /dict {}
+ /def { pop pop } bind
+ /dup null
+ /begin { pop } bind
+ /end {}
+ /currentdict null
+
+ % override CMap operators
+ /usecmap { pop } bind
+ /CMapName null
+ /begincmap { [ } bind
+ /endcmap { ] } bind
+ /begincodespacerange { pop mark } bind
+ /endcodespacerange { cleartomark } bind
+ /beginnotdefrange { pop mark } bind
+ /endnotdefrange { cleartomark } bind
+ /beginbfchar { /parsecmapcounter exch def } bind % for FromCID CMaps
+ /endbfchar {
+ parsecmapcounter dup array exch 1 sub -1 0 {
+ [ 5 3 roll exch .strtoint 1 ]
+ 2 index 3 1 roll put
+ } for
+ } bind
+ /beginbfrange { begincidrange } % for FromCID CMaps
+ /endbfrange { endcidrange }
+ /begincidchar { beginbfchar } % for ToCID CMaps
+ /endcidchar { endbfchar }
+ /begincidrange { /parsecmapcounter exch def } bind % for ToCID CMaps
+ /endcidrange {
+ parsecmapcounter dup array exch 1 sub -1 0 {
+ [ 6 3 roll 3 1 roll .strtoint exch .strtoint exch 1 index sub 1 add ]
+ 2 index 3 1 roll put
+ } for
+ } bind
+
+ % misc
+ /parsecmapcounter 0
+
+.dicttomark def % .parsecmapdict
+
+
+/.parsecmapfname 100 string def
+
+% <CMapName> .parsecmap <array>
+% Return the contents of the CMap. If the CMap is not found, empty array
+% is returned. Note that usecmap is ignored because of efficiency.
+/.parsecmap {
+ /CMap /Category findresource begin
+ //.parsecmapfname ResourceFileName end % filename
+ dup status {
+ pop pop pop pop
+ .parsecmapdict begin run end
+ } {
+ pop []
+ } ifelse
+} bind def
+
+% .buildcmaptab
+% construct a cmap table using information obtained from horizontal/vertical
+% CMaps, ToUnicode CMap, and substition data.
+
+% cmap /CMap proc .applyCMap cmap
+/.applyCMap {
+ exch .parsecmap % {} [[[].].]
+ dup length 1 sub -1 0 { % {} [[[].].] len-1 -1 0 {} for
+ 1 index exch get % {} [[[].].] [[].]
+ dup length 1 sub -1 0 { % {} [[[].].] [[].] len-1 -1 0 for {}
+ 1 index exch get % {} [[[].].] [[].] [ cid gid num ]
+ cvx exec cmapglyphs % {} [[[].].] [[].] cid gid num gmap
+ 3 1 roll .safegetinterval { % {} [[[].].] [[].] cid [gid'..]
+ 4 index exec dup cmapglyphs 0 get eq {
+ % found no glyph
+ pop
+ } {
+ % found a glyph
+ 5 index exch 2 index exch .safeput
+ } ifelse
+ 1 add % {} [[[].].] [[].] cid++
+ } forall pop
+ } for % {} [[[].].] [[].]
+ pop % {} [[[].].]
+ } for % {} [[[].].]
+ pop pop %
+} bind def
+
+% cmap /CMap-V .applyvCMap cmap
+/.applyvCMap {
+ gsubh2v null ne {
+ { .gsublookup } .applyCMap
+ } {
+ { } .applyCMap
+ } ifelse
+} bind def
+
+% cmap /CMap-H .applyhCMap cmap
+/.applyhCMap {
+ { } .applyCMap
+} bind def
+
+% cmap /CMap-V .applyvCMapUnicode cmap
+/.applyvCMapUnicode {
+ gsubh2v null ne {
+ {
+ dup 16#f900 ge
+ 1 index 16#ff00 ge 2 index 16#ff9f le and not
+ and not {
+ .gsublookup
+ } if
+ } bind .applyCMap
+ } {
+ { } .applyCMap
+ } ifelse
+} bind def
+
+% cmap /Adobe-*-* .applyCIDToCode cmap
+/.applyCIDToCode {
+ .parsecmap
+ {
+ { % cmap [ dist cid num ]
+ dup 0 get length 2 gt { % multi-byte dist is not supported yet.
+ pop
+ } {
+ cvx exec exch % cmap dist num cid
+ cmapglyphs 4 2 roll % cmap cid cmapglyphs dist num
+ exch .strtoint exch
+ .safegetinterval % cmap cid subcmapglyphs
+ { % cmap cid gid
+ 2 index 2 index % cmap cid gid cmap cid
+ 3 2 roll % cmap cid cmap cid gid
+ .safeput % cmap cid
+ 1 add % cmap nextcid
+ } forall pop
+ } ifelse
+ } forall
+ } forall
+} bind def
+
+% cmap /Adobe-*-UCS2 .applyCIDToUnicode cmap
+/.applyCIDToUnicode {
+ .parsecmap
+ {
+ { % cmap [ distuni cid num ]
+ dup 0 get length 2 gt % multi-byte dist is not supported yet.
+ 1 index 0 get <fffd> eq % the value <fffd> is regard as undefined code.
+ or {
+ pop
+ } {
+ cvx exec exch % cmap distuni num cid
+ cmapglyphs 4 2 roll % cmap cid cmapglyphs distuni num
+ exch .strtoint exch % cmap cid cmapglyphs distuni num
+ .safegetinterval % cmap cid subcmapglyphs
+ { % cmap cid gid
+ 2 index 2 index % cmap cid gid cmap cid
+ 3 2 roll % cmap cid cmap cid gid
+ .safeput % cmap cid
+ 1 add % cmap nextcid
+ } forall pop
+ } ifelse
+ } forall
+ } forall
+} bind def
+
+/.buildcmapdict mark
+ /Adobe-CNS1 <<
+ /Registry (Adobe)
+ /Ordering (CNS1)
+ /CIDCounts [ 14099 17408 17601 18846 18962 ]
+ /Big5 { 0 {
+ /Adobe-CNS1-ETen-B5 .applyCIDToCode
+ /ETen-B5-V .applyvCMap
+ /ETen-B5-H .applyhCMap
+ } }
+ /Unicode { 3 {
+ /Adobe-CNS1-UCS2 .applyCIDToUnicode
+ /UniCNS-UCS2-V .applyvCMapUnicode
+ /UniCNS-UCS2-H .applyhCMap
+ } }
+ >>
+ /Adobe-GB1 <<
+ /Registry (Adobe)
+ /Ordering (GB1)
+ /CIDCounts [ 7717 9897 22127 22353 29064 ]
+ /PRC { 2 {
+ /Adobe-GB1-GBK-EUC .applyCIDToCode
+ /GBK-EUC-V .applyvCMap
+ /GBK-EUC-H .applyhCMap
+ } }
+ /Unicode { 4 {
+ /Adobe-GB1-UCS2 .applyCIDToUnicode
+ /UniGB-UCS2-V .applyvCMapUnicode
+ /UniGB-UCS2-H .applyhCMap
+ } }
+ >>
+ /Adobe-Japan1 <<
+ /Registry (Adobe)
+ /Ordering (Japan1)
+ /CIDCounts [ 8284 8359 8720 9354 15444 ]
+ /ShiftJIS { 2 {
+ /Adobe-Japan1-90ms-RKSJ .applyCIDToCode
+ /90ms-RKSJ-V .applyvCMap
+ /90ms-RKSJ-H .applyhCMap
+ } }
+ /Unicode { 4 {
+ /Adobe-Japan1-UCS2 .applyCIDToUnicode
+ /UniJIS-UCS2-V .applyvCMapUnicode
+ /UniJIS-UCS2-H .applyhCMap
+ } }
+ >>
+ /Adobe-Japan2 <<
+ /Registry (Adobe)
+ /Ordering (Japan2)
+ /CIDCounts [ 6068 ]
+ /Unicode { 0 {
+ /UniHojo-UCS2-V .applyvCMapUnicode
+ /UniHojo-UCS2-H .applyhCMap
+ } }
+ >>
+ /Adobe-Korea1 <<
+ /Registry (Adobe)
+ /Ordering (Korea1)
+ /CIDCounts [ 9333 18155 18352 ]
+ /Johab { 1 {
+ /KSC-Johab-V .applyvCMap
+ /KSC-Johab-H .applyhCMap
+ } }
+ /Unicode { 2 {
+ /Adobe-Korea1-UCS2 .applyCIDToUnicode
+ /UniKS-UCS2-V .applyvCMapUnicode
+ /UniKS-UCS2-H .applyhCMap
+ } }
+ /Wansung { 1 {
+ /Adobe-Korea1-KSCms-UHC .applyCIDToCode
+ /KSCms-UHC-V .applyvCMap
+ /KSCms-UHC-H .applyhCMap
+ } }
+ >>
+ /Identity << % ttcmap ordering CIDMap only for specific and rare CJK TTF
+ /Registry (Unregistered) % Thus Registry value is unpredictable. This
+ /Ordering (Identity) % CIDFont can be used with Identity-H|V CMap
+ /CIDCounts [ 65535 ]
+ /H { 0 {
+ /Identity-H .applyhCMap % for ttcmap-order CIDMap
+ } }
+ /V { 0 {
+ /Identity-H .applyvCMap % for ttcmap-order and vertically-used CIDMap
+ } }
+ >>
+.dicttomark def
+
+/.ttencmap <<
+ /Identity false
+ /Auto { .ttencoding {
+ dup .ttcharset exch get exec exch true
+ } { false } ifelse
+ } bind
+ /Adobe-CNS1 { /Adobe-CNS1 .ttencoding }
+ /Adobe-GB1 { /Adobe-GB1 .ttencoding }
+ /Adobe-Japan1 { /Adobe-Japan1 .ttencoding }
+ /Adobe-Japan2 { /Adobe-Japan2 .ttencoding }
+ /Adobe-Korea1 { /Adobe-Korea1 .ttencoding }
+ /Adobe-CNS1-Big5 { /Adobe-CNS1 /Big5 true }
+ /Adobe-CNS1-Unicode { /Adobe-CNS1 /Unicode true }
+ /Adobe-GB1-PRC { /Adobe-GB1 /PRC true }
+ /Adobe-GB1-Unicode { /Adobe-GB1 /Unicode true }
+ /Adobe-Japan1-ShiftJIS { /Adobe-Japan1 /ShiftJIS true }
+ /Adobe-Japan1-Unicode { /Adobe-Japan1 /Unicode true }
+ /Adobe-Japan2-Unicode { /Adobe-Japan2 /Unicode true }
+ /Adobe-Korea1-Johab { /Adobe-Korea1 /Johab true }
+ /Adobe-Korea1-Unicode { /Adobe-Korea1 /Unicode true }
+ /Adobe-Korea1-Wansung { /Adobe-Korea1 /Wansung true }
+ /Identity-H { /Identity /H true }
+ /Identity-V { /Identity /V true }
+>> def
+
+/.ttcharset <<
+ /Unicode { .detectos2 }
+ /ShiftJIS /Adobe-Japan1
+ /Big5 /Adobe-CNS1
+ /PRC /Adobe-GB1
+ /Wansung /Adobe-Korea1
+ /Johab /Adobe-Korea1
+>> def
+
+/.ttencdict <<
+ <00030001> /Unicode
+ <00030002> /ShiftJIS
+ <00030003> /Big5
+ <00030004> /PRC
+ <00030005> /Wansung
+ <00030006> /Johab
+>> def
+
+/.ttencoding {
+ .ttencdict cmapsub 0 4 getinterval .knownget
+} bind def
+
+/.ttos2tab [
+ [ 1 20 bitshift /Adobe-CNS1 ]
+ [ 1 18 bitshift /Adobe-GB1 ]
+ [ 1 17 bitshift /Adobe-Japan1 ]
+ [ 1 19 bitshift /Adobe-Korea1 ]
+ [ 1 21 bitshift /Adobe-Korea1 ]
+] def
+
+/.detectos2 {
+ /Identity % default linear ordering to GID, Adobe Identity CIDs
+ os2ver 0 gt {
+ .ttos2tab {
+ dup 0 get os2cp1 and 0 ne {
+ 1 get exch
+ } if pop
+ } forall
+ } if
+} bind def
+
+% /Charset /TTEncoding .buildcmaptab cmap
+/.buildcmaptab {
+ .buildcmapdict 3 2 roll get begin
+ cvx exec exch CIDCounts end exch get array
+ dup length 1 sub 0 1 3 -1 roll { 1 index exch cmapglyphs 0 get put } for
+ exch exec
+} bind def
+
+% -mark- <key> <value> ... .definettcidfont <font>
+% rapid version of .definecjkvttcidfont
+% Proposed by Hideyuki Suzuki <hideyuki@sat.t.u-tokyo.ac.jp>
+% Modified by Taiji Yamada <taiji@aihara.co.jp>
+/.definettcidfont {
+ /CIDFontName fontname
+ /CIDFontType 2
+ /CIDSystemInfo
+ mark .ttencmapproc {
+ .buildcmapdict 3 2 roll get begin
+ cvx exec pop
+ /Supplement exch
+ /Registry Registry
+ /Ordering Ordering
+ end
+ } {
+ /Registry (Adobe)
+ /Ordering (Identity) % pursuant to makeIdentityCMap in pdf_font.ps
+ /Supplement 0
+ } ifelse
+ .dicttomark
+ /CharStrings mark /.notdef 0 .dicttomark
+ .ttencmapproc {
+ /cmapglyphs cmaptab cmaparray def
+ exec .buildcmaptab
+ dup length /CIDCount exch
+ 3 -1 roll .makecidmap % it has not supported a dictionary yet
+ /CIDMap exch % it should be a string or an array of strings
+ } {
+ /CIDCount numloca
+ /CIDMap 0 % an integer interpreted as an offset from GI (see #5012 p.16)
+ } ifelse
+ /GDBytes 2
+ .dicttomark
+ end end dup /CIDFontName get exch /CIDFont defineresource
+} bind def
+
+% Load a TrueType font from a file as a CIDFontType 2 font.
+% rapid version of .loadcjkvttcidfont
+% Proposed by Hideyuki Suzuki <hideyuki@sat.t.u-tokyo.ac.jp>
+% Modified by Taiji Yamada <taiji@aihara.co.jp>
+%
+% <file> .loadttcidfont <cidtype2font>
+% <file> <fontindex> .loadttcidfont <cidtype2font>
+% detect a kind of CID and encode a TrueType font to a CID-Keyed font.
+%
+% <file> <ttcidcode> .loadttcidfont <cidtype2font>
+% <file> <fontindex> <ttcidcode> .loadttcidfont <cidtype2font>
+% load a TrueType font and encode it with the kind of CID described
+% in <ttcidcode> which is one of entry in .ttencmap.
+/.loadcjkvttcidfont {
+ dup type /nametype ne { /Auto } if
+ 1 index type /integertype eq { 3 1 roll } { exch } ifelse
+ .loadttfonttables
+ .makesfnts
+ .pickcmap % when we can't pick a Microsoft cmap table, do what to do
+ .getgsub
+ .getos2 % we need an OS/2 table for CJKV TrueType fonts (by taiji)
+ .ttencmap exch get /.ttencmapproc exch def
+ mark
+ .ttkeys
+ .definettcidfont
+} bind def
+
+% Open and load a TrueType font from a file as a CIDFontType 2 font.
+% <filename> .openttcidfont <cidtype2font>
+% <filename> <fontindex> .openttcidfont <cidtype2font>
+% <filename> <ttcidcode> .openttcidfont <cidtype2font>
+% <filename> <fontindex> <ttcidcode> .openttcidfont <cidtype2font>
+/.openttcidfont {
+ 1 dup index type /nametype eq { 1 add } if
+ dup index type /integertype eq { 1 add } if
+ dup 1 add -1 roll (r) file exch 1 roll
+ .loadcjkvttcidfont % rapid version, since 20010316
+} bind def
diff --git a/Master/xemtex/gslib/gs_typ32.ps b/Master/xemtex/gslib/gs_typ32.ps
new file mode 100644
index 00000000000..b6cba9f5583
--- /dev/null
+++ b/Master/xemtex/gslib/gs_typ32.ps
@@ -0,0 +1,128 @@
+% Copyright (C) 1997 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_typ32.ps,v 1.3.2.2.2.1 2003/04/12 14:02:38 giles Exp $
+% Initialization file for Type 32 fonts.
+
+% ------ Type 32 fonts ------ %
+
+% We need LanguageLevel 2 or higher in order to have defineresource.
+languagelevel dup 2 .max .setlanguagelevel
+
+/BitmapFontInit mark
+
+/.makeglyph32 systemdict /.makeglyph32 get
+systemdict /.makeglyph32 .undef
+
+/addglyph { % ([wx wy llx lly urx ury] |
+ % [w0x w0y llx lly urx ury w1x w1y vx vy])
+ % <bitmap> <cid> <type32font> addglyph -
+ 1 index dup 2 index .removeglyphs
+ 22 string .makeglyph32
+ % Stack: metrics bitmap cid font metstr
+ 3 index () ne {
+ % Use G4 encoding to compress the bitmap.
+ % Define a string large enough to hold the metrics,
+ % an uncompressed bitmap (worst case = 5x expansion),
+ % and the 2 RTC codes (3 bytes).
+ dup length 4 index length 5 mul add 10 add string
+ % Stack: metrics bitmap cid font metstr buffer
+ dup 0 3 index putinterval
+ dup 2 index length 1 index length 1 index sub getinterval
+ % Stack: metrics bitmap cid font metstr buffer bitbuf
+ mark /Columns 8 index dup 4 get exch 2 get sub
+ /Rows 10 index dup 5 get exch 3 get sub
+ /K -1 /EndOfBlock true /BlackIs1 true
+ .dicttomark /CCITTFaxEncode filter
+ % Stack: metrics bitmap cid font metstr buffer filter
+ dup 6 index writestring closefile
+ % Find the end of the data by scanning backwards for the RTC.
+ % There are 2 RTCs x 12 bits = 3 bytes to remove.
+ {
+ dup dup length 1 sub get 0 ne { exit } if
+ 0 1 index length 1 sub getinterval
+ } loop
+ 0 1 index length 3 sub getinterval
+ exch pop % metstr
+ } if
+ 1 index /CharStrings get 3 index 3 -1 roll put
+ pop pop pop pop
+} obind
+
+/removeall { % <type32font> removeall -
+ 0 65535 2 index removeglyphs pop
+} obind
+
+/.removeglyphs systemdict /.removeglyphs get
+systemdict /.removeglyphs .undef
+
+/removeglyphs { % <cid_min> <cid_max> <type32font> .removeglyphs -
+ 3 copy .removeglyphs
+ dup /CharStrings get dup {
+ % Stack: cidmin cidmax font CharStrings cid bitmap
+ pop dup 5 index ge { dup 4 index le { 2 copy undef } if } if pop
+ } forall pop pop pop pop
+} obind
+
+.dicttomark /ProcSet defineresource pop
+
+/.cidfonttypes where { pop } { /.cidfonttypes 6 dict def } ifelse
+.cidfonttypes begin
+
+4 % CIDFontType 4 = FontType 32
+{ dup /FontType 32 put
+ dup /CharStrings 20 dict put
+ 1 index exch .buildfont32 exch pop
+} bind def
+
+end % .cidfonttypes
+
+% Define the BuildGlyph procedure.
+% Since Type 32 fonts are indexed by CID, there is no BuildChar procedure.
+% The name %Type32BuildGlyph is known to the interpreter.
+(%Type32BuildGlyph) cvn { % <font> <cid> %Type32BuildGlyph -
+ 1 index /CharStrings get
+ % Stack: font cid CharStrings
+ dup 2 index .knownget
+ { exch pop } { 0 get } ifelse
+ % Stack: font cid cstr
+ dup //.getmetrics32 % use // because of .undef below
+ dup 14 gt {
+ 8 index 8 index 13 3 roll setcachedevice2
+ } {
+ 4 index 4 index 9 3 roll setcachedevice
+ } ifelse
+ % Stack: font cid cstr w h nmetrics llx lly
+ 6 -1 roll 4 -1 roll 1 index length 1 index sub getinterval
+ % Stack: font cid w h llx lly bitstr
+ dup () eq {
+ pop pop pop
+ } {
+ mark /Columns 6 index /Rows 7 index /K -1 /EndOfBlock false /BlackIs1 true
+ .dicttomark /CCITTFaxDecode filter 4 index 4 index true
+ % Stack: font cid w h llx lly filter w h true
+ [ 1 0 0 1 11 -2 roll exch neg exch neg ] 5 -1 roll imagemask
+ } ifelse
+ pop pop pop pop
+} bind def
+
+systemdict /.getmetrics32 .undef
+
+buildfontdict 32 /.buildfont32 cvx put
+
+32 dup /FontType defineresource pop
+
+.setlanguagelevel
diff --git a/Master/xemtex/gslib/gs_typ42.ps b/Master/xemtex/gslib/gs_typ42.ps
new file mode 100644
index 00000000000..4f48b1e58cf
--- /dev/null
+++ b/Master/xemtex/gslib/gs_typ42.ps
@@ -0,0 +1,45 @@
+% Copyright (C) 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_typ42.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Type 42 font support code.
+
+% Here are the BuildChar and BuildGlyph implementation for Type 42 fonts.
+% The names %Type42BuildChar and %Type42BuildGlyph are known to the
+% interpreter. The real work is done in an operator:
+% <font> <code|name> <name> <glyphindex> .type42execchar -
+
+(%Type42BuildChar) cvn % <font> <code> %Type42BuildChar -
+ { 1 index /Encoding get 1 index get .type42build
+ } bind def
+(%Type42BuildGlyph) cvn % <font> <name> %Type42BuildGlyph -
+ { dup .type42build
+ } bind def
+/.type42build % <font> <code|name> <name> .type42build -
+ { 2 index begin
+ dup CharStrings exch .knownget not
+ { 2 copy eq { exch pop /.notdef exch } if
+ QUIET not
+ { (Substituting .notdef for ) print = flush }
+ { pop }
+ ifelse
+ /.notdef CharStrings /.notdef get
+ } if
+ end .type42execchar
+ } bind def
+
+% Register the font type for definefont.
+buildfontdict 42 /.buildfont42 cvx put
diff --git a/Master/xemtex/gslib/gs_type1.ps b/Master/xemtex/gslib/gs_type1.ps
new file mode 100644
index 00000000000..ab355e111f0
--- /dev/null
+++ b/Master/xemtex/gslib/gs_type1.ps
@@ -0,0 +1,183 @@
+% Copyright (C) 1994, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_type1.ps,v 1.5.2.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Type 1 font support code.
+
+% The standard representation for PostScript compatible fonts is described
+% in the book "Adobe Type 1 Font Format", published by Adobe Systems Inc.
+
+% Define an augmented version of .buildfont1 that inserts UnderlinePosition
+% and UnderlineThickness entries in FontInfo if they aren't there already,
+% and FontBBox isn't degenerate.
+% (This works around the incorrect assumption, made by many word processors,
+% that these entries are present in the built-in fonts.)
+/.buildfont1
+ {
+ false 1 index /FontBBox .knownget {
+ { 0 ne { not exit } if } forall
+ } if
+ { dup /FontInfo known not
+ { .growfontdict dup /FontInfo 2 dict put }
+ if
+ dup dup /FontInfo get dup dup
+ /UnderlinePosition known exch /UnderlineThickness known and
+ { pop pop % entries already present
+ }
+ { dup length 2 add dict .copydict
+ dup /UnderlinePosition known not
+ { dup /UnderlinePosition 3 index /FontBBox .knownget
+ { 1 get 2 div } % 1/2 the font descent
+ { -100 } ifelse put
+ }
+ if
+ dup /UnderlineThickness known not
+ { dup /UnderlineThickness 3 index /FontBBox .knownget
+ { dup 3 get exch 1 get sub 20 div } % 1/20 the font height
+ { 50 } ifelse put
+ }
+ if
+ 1 index /FontInfo get wcheck not { readonly } if
+ /FontInfo exch put
+ }
+ ifelse
+ } if
+ //.buildfont1
+ } bind def
+% If the diskfont feature isn't included, define a dummy .loadfontdict.
+/.loadfontdict where
+ { pop }
+ { /.loadfontdict 0 dict readonly def }
+ifelse
+/.loadfontfile % <file> .loadfontfile -
+ { mark exch
+ DISKFONTS { .loadfontdict begin } if
+ % In order to load fonts reliably, we should push systemdict
+ % here. However, Ed Taft says that Adobe implementations
+ % push userdict and nothing else!
+ % We really would just like systemdict on the stack,
+ % but fonts produced by Fontographer require a writable dictionary.
+ % However, we can't use any of the other well-known dictionaries
+ % (such as userdict), since the whole point of pushing systemdict
+ % is to make sure that nothing important has been redefined.
+ userdict begin
+ % We can't just use `run', because we want to check for .PFB files.
+ currentpacking
+ { false setpacking .loadfont1 true setpacking }
+ { .loadfont1 }
+ ifelse end
+ { stop } if
+ DISKFONTS { end } if
+ cleartomark
+ } bind def
+/.loadfont1 { % <file> .loadfont1 <errorflag>
+ { % We would like to use `false /PFBDecode filter',
+ % but this occasionally produces a whitespace character as
+ % the first of an eexec section, so we can't do it.
+ % Also, since the real input file never reaches EOF if we are using
+ % a PFBDecode filter (the filter stops just after reading the last
+ % character), we must explicitly close the real file in this case.
+ % Since the file might leave garbage on the operand stack,
+ % we have to create a procedure to close the file reliably.
+ dup read not { -1 } if
+ 2 copy unread 16#80 eq {
+ dup true /PFBDecode filter cvx
+ exch .currentresourcefile eq {
+ dup /.execasresource .systemvar
+ } {
+ {exec}
+ } ifelse
+ 2 index cvlit
+ /closefile .systemvar 3 .execn
+ } {
+ cvx exec
+ } ifelse
+ } stopped
+} bind def
+
+% Here are the BuildChar and BuildGlyph implementation for Type 1 fonts.
+% The names %Type1BuildChar and %Type1BuildGlyph are known to the interpreter.
+% The real work is done in an operator:
+% <font> <code|name> <name> <charstring> .type1execchar -
+
+(%Type1BuildChar) cvn { % <font> <code> %Type1BuildChar -
+ 1 index /Encoding get 1 index get .type1build .type1execchar
+} bind def
+(%Type1BuildGlyph) cvn { % <font> <name> %Type1BuildGlyph -
+ dup .type1build .type1execchar
+} bind def
+% Note: this procedure is used for both Type 1 and Type 2 fonts.
+/.type1build { % <font> <code|name> <name> .type1build
+ % <font> <code|name> <name> <charstring>
+ 2 index begin
+ dup CharStrings exch .knownget not {
+ 2 copy eq { exch pop /.notdef exch } if
+ QUIET not
+ { (Substituting .notdef for ) print = flush }
+ { pop }
+ ifelse
+ /.notdef CharStrings /.notdef get
+ } if
+ end
+} bind def
+% CCRun is an undocumented procedure provided for Type 4 and Type 0 fonts.
+1183615869 internaldict begin
+% Apparently there are two different argument lists for CCRun.
+% Handling the one with the extra Private dictionary requires fabricating
+% a Type 1 font on the fly, since we aren't currently prepared to parse the
+% dictionary any other way.
+/CCRun { % <font> <code|name> <charstring> CCRun -
+ % <font> <code|name> <charstring> <Private> CCRun -
+ dup type /dicttype eq {
+ dup 4 index /Private .knownget { ne } { pop true } ifelse {
+ % The Private dictionary was supplied, and is different
+ % from the Private dictionary of the font. Fabricate a
+ % Type 1 font with this Private dictionary. Most of the
+ % font entries are arbitrary or not needed.
+ .currentglobal false .setglobal 10 dict exch .setglobal begin
+ /Private exch def
+ /FontType 1 def
+ /FontMatrix 3 index /FontMatrix get def
+ /Encoding 3 index /Encoding .knownget not { StandardEncoding } if def
+ /FontBBox 3 index /FontBBox .knownget not { {0 0 0 0} } if def
+ /PaintType 0 def
+ /CharStrings 1 dict dup /.notdef () put def
+ 3 -1 roll pop () currentdict end .buildfont1 exch pop 3 1 roll
+ } {
+ pop
+ } ifelse
+ } if
+ 1 index dup type /integertype eq {
+ 3 index /Encoding get exch get
+ } if exch .type1execchar
+} bind def
+end
+
+% Register the font types for definefont.
+buildfontdict 1 /.buildfont1 cvx put
+buildfontdict 4 /.buildfont4 cvx put
+
+% Add Type 2 support if applicable.
+/.buildfont2 where not { (%END2) .skipeof } if
+pop
+(%Type2BuildChar) cvn { % <font> <code> %Type2BuildChar -
+ 1 index /Encoding get 1 index get .type1build .type2execchar
+} bind def
+(%Type2BuildGlyph) cvn { % <font> <name> %Type2BuildGlyph -
+ dup .type1build .type2execchar
+} bind def
+buildfontdict 2 /.buildfont2 cvx put
+%END2
diff --git a/Master/xemtex/gslib/gs_wan_e.ps b/Master/xemtex/gslib/gs_wan_e.ps
new file mode 100644
index 00000000000..9fe2ff2227b
--- /dev/null
+++ b/Master/xemtex/gslib/gs_wan_e.ps
@@ -0,0 +1,47 @@
+% Copyright (C) 1994, 1996, 1997, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_wan_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% Define the WinAnsi encoding vector.
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/WinAnsiEncoding
+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
+ /bullet
+% \20x
+ % NOTE: /Euro, /Zcaron, and /zcaron are new for PDF 1.3.
+ % We may have to take them out for backward compatibility.
+ /Euro /bullet /quotesinglbase /florin
+ /quotedblbase /ellipsis /dagger /daggerdbl
+ /circumflex /perthousand /Scaron /guilsinglleft
+ /OE /bullet /Zcaron /bullet
+ /bullet /quoteleft /quoteright /quotedblleft
+ /quotedblright /bullet /endash /emdash
+ /tilde /trademark /scaron /guilsinglright
+ /oe /bullet /zcaron /Ydieresis
+ISOLatin1Encoding 160 96 getinterval aload pop
+256 packedarray
+4 1 index .registerencoding
+.defineencoding
+exec
diff --git a/Master/xemtex/gslib/gs_wl1_e.ps b/Master/xemtex/gslib/gs_wl1_e.ps
new file mode 100644
index 00000000000..10f95141ee9
--- /dev/null
+++ b/Master/xemtex/gslib/gs_wl1_e.ps
@@ -0,0 +1,67 @@
+% Copyright (C) 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_wl1_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/gs_wl2_e.ps b/Master/xemtex/gslib/gs_wl2_e.ps
new file mode 100644
index 00000000000..0d168e8422d
--- /dev/null
+++ b/Master/xemtex/gslib/gs_wl2_e.ps
@@ -0,0 +1,67 @@
+% Copyright (C) 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_wl2_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/gs_wl5_e.ps b/Master/xemtex/gslib/gs_wl5_e.ps
new file mode 100644
index 00000000000..98bdd470238
--- /dev/null
+++ b/Master/xemtex/gslib/gs_wl5_e.ps
@@ -0,0 +1,67 @@
+% Copyright (C) 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gs_wl5_e.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/gsbj b/Master/xemtex/gslib/gsbj
new file mode 100644
index 00000000000..3146b555dff
--- /dev/null
+++ b/Master/xemtex/gslib/gsbj
@@ -0,0 +1,3 @@
+#!/bin/sh
+# $Id: gsbj,v 1.1 2000/03/09 08:40:40 lpd Exp $
+exec gs -q -sDEVICE=bj10e -r180 -dNOPAUSE -sPROGNAME=$0 -- gslp.ps --heading-center "`date`" "$@"
diff --git a/Master/xemtex/gslib/gsbj.bat b/Master/xemtex/gslib/gsbj.bat
new file mode 100644
index 00000000000..6769ea304d8
--- /dev/null
+++ b/Master/xemtex/gslib/gsbj.bat
@@ -0,0 +1,5 @@
+@echo off
+@rem $Id: gsbj.bat,v 1.2 2000/05/20 20:53:05 lpd Exp $
+
+call gssetgs.bat
+%GSC% -q -sDEVICE=bj10e -r180 -dNOPAUSE -sPROGNAME=gsbj -- gslp.ps %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/xemtex/gslib/gsdj b/Master/xemtex/gslib/gsdj
new file mode 100644
index 00000000000..9f3e200f622
--- /dev/null
+++ b/Master/xemtex/gslib/gsdj
@@ -0,0 +1,3 @@
+#!/bin/sh
+# $Id: gsdj,v 1.1 2000/03/09 08:40:40 lpd Exp $
+exec gs -q -sDEVICE=deskjet -r300 -dNOPAUSE -sPROGNAME=$0 -- gslp.ps --heading-center "`date`" "$@"
diff --git a/Master/xemtex/gslib/gsdj.bat b/Master/xemtex/gslib/gsdj.bat
new file mode 100644
index 00000000000..c281323246b
--- /dev/null
+++ b/Master/xemtex/gslib/gsdj.bat
@@ -0,0 +1,5 @@
+@echo off
+@rem $Id: gsdj.bat,v 1.2 2000/05/20 20:53:05 lpd Exp $
+
+call gssetgs.bat
+%GSC% -q -sDEVICE=deskjet -r300 -dNOPAUSE -sPROGNAME=gsdj -- gslp.ps %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/xemtex/gslib/gsdj500 b/Master/xemtex/gslib/gsdj500
new file mode 100644
index 00000000000..01f546a1139
--- /dev/null
+++ b/Master/xemtex/gslib/gsdj500
@@ -0,0 +1,3 @@
+#!/bin/sh
+# $Id: gsdj500,v 1.1 2000/03/09 08:40:40 lpd Exp $
+exec gs -q -sDEVICE=djet500 -r300 -dNOPAUSE -sPROGNAME=$0 -- gslp.ps --heading-center "`date`" "$@"
diff --git a/Master/xemtex/gslib/gsdj500.bat b/Master/xemtex/gslib/gsdj500.bat
new file mode 100644
index 00000000000..830717b090c
--- /dev/null
+++ b/Master/xemtex/gslib/gsdj500.bat
@@ -0,0 +1,5 @@
+@echo off
+@rem $Id: gsdj500.bat,v 1.2 2000/05/20 20:53:05 lpd Exp $
+
+call gssetgs.bat
+%GSC% -q -sDEVICE#djet500 -r300 -dNOPAUSE -sPROGNAME=gsdj500 -- gslp.ps %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/xemtex/gslib/gslj b/Master/xemtex/gslib/gslj
new file mode 100644
index 00000000000..21a9f22f63a
--- /dev/null
+++ b/Master/xemtex/gslib/gslj
@@ -0,0 +1,3 @@
+#!/bin/sh
+# $Id: gslj,v 1.1 2000/03/09 08:40:40 lpd Exp $
+exec gs -q -sDEVICE=laserjet -r300 -dNOPAUSE -sPROGNAME=$0 -- gslp.ps --heading-center "`date`" "$@"
diff --git a/Master/xemtex/gslib/gslj.bat b/Master/xemtex/gslib/gslj.bat
new file mode 100644
index 00000000000..1009da8f9d2
--- /dev/null
+++ b/Master/xemtex/gslib/gslj.bat
@@ -0,0 +1,5 @@
+@echo off
+@rem $Id: gslj.bat,v 1.2 2000/05/20 20:53:05 lpd Exp $
+
+call gssetgs.bat
+%GSC% -q -sDEVICE=laserjet -r300 -dNOPAUSE -sPROGNAME=gslj -- gslp.ps %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/xemtex/gslib/gslp b/Master/xemtex/gslib/gslp
new file mode 100644
index 00000000000..cb01cbf5054
--- /dev/null
+++ b/Master/xemtex/gslib/gslp
@@ -0,0 +1,3 @@
+#!/bin/sh
+# $Id: gslp,v 1.1 2000/03/09 08:40:40 lpd Exp $
+exec gs -q -sDEVICE=epson -r180 -dNOPAUSE -sPROGNAME=$0 -- gslp.ps --heading-center "`date`" "$@"
diff --git a/Master/xemtex/gslib/gslp.bat b/Master/xemtex/gslib/gslp.bat
new file mode 100644
index 00000000000..3a9a415020b
--- /dev/null
+++ b/Master/xemtex/gslib/gslp.bat
@@ -0,0 +1,5 @@
+@echo off
+@rem $Id: gslp.bat,v 1.2 2000/05/20 20:53:05 lpd Exp $
+
+call gssetgs.bat
+%GSC% -q -sDEVICE=epson -r180 -dNOPAUSE -sPROGNAME=gslp -- gslp.ps %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/xemtex/gslib/gslp.ps b/Master/xemtex/gslib/gslp.ps
new file mode 100644
index 00000000000..64147ab6828
--- /dev/null
+++ b/Master/xemtex/gslib/gslp.ps
@@ -0,0 +1,695 @@
+% Copyright (C) 1991, 1995, 1996, 1997, 1998, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gslp.ps,v 1.2.6.2.2.1 2003/04/12 14:02:38 giles Exp $
+% 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>
+% 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
+/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
+ /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
+
+% 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 1000 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
+ } 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 % (FontNNN) -> <font>
+ { dup /arg exch def length
+ { dup 0 le { exit } if
+ dup 1 sub arg exch get dup 48 ge exch 59 le and 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
+/--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 100 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/Master/xemtex/gslib/gsnd b/Master/xemtex/gslib/gsnd
new file mode 100644
index 00000000000..32257d07d96
--- /dev/null
+++ b/Master/xemtex/gslib/gsnd
@@ -0,0 +1,3 @@
+#!/bin/sh
+# $Id: gsnd,v 1.1 2000/03/09 08:40:40 lpd Exp $
+exec gs -DNODISPLAY "$@"
diff --git a/Master/xemtex/gslib/gsnd.bat b/Master/xemtex/gslib/gsnd.bat
new file mode 100644
index 00000000000..fc536e046b5
--- /dev/null
+++ b/Master/xemtex/gslib/gsnd.bat
@@ -0,0 +1,5 @@
+@echo off
+@rem $Id: gsnd.bat,v 1.2 2000/05/20 20:53:05 lpd Exp $
+
+call gssetgs.bat
+%GSC% -DNODISPLAY %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/xemtex/gslib/gsndt.bat b/Master/xemtex/gslib/gsndt.bat
new file mode 100644
index 00000000000..1fefbee8512
--- /dev/null
+++ b/Master/xemtex/gslib/gsndt.bat
@@ -0,0 +1,5 @@
+@echo off
+@rem $Id: gsndt.bat,v 1.2 2000/05/20 20:53:05 lpd Exp $
+
+call gssetgs.bat
+%GSC% -DNODISPLAY %1 %2 %3 %4 %5 %6 %7 %8 %9 >t
diff --git a/Master/xemtex/gslib/gsnup.ps b/Master/xemtex/gslib/gsnup.ps
new file mode 100644
index 00000000000..bec6f72539e
--- /dev/null
+++ b/Master/xemtex/gslib/gsnup.ps
@@ -0,0 +1,89 @@
+%!
+% Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: gsnup.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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 {
+ .BP .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
+ }
+ /EndPage {
+ .ELevel 0 vmstatus pop pop put
+ .Ps 0 .Pn 1 add .Nx .Ny mul mod put
+ .Pn 0 eq {
+ .EP
+ } {
+ pop pop false
+ } ifelse
+ }
+>> setpagedevice
+/.EOJ {
+ { .Pn 0 eq { exit } if showpage } loop
+} def
+
+{ currentfile cvx exec .EOJ } exec
diff --git a/Master/xemtex/gslib/gssetgs.bat b/Master/xemtex/gslib/gssetgs.bat
new file mode 100644
index 00000000000..2de966321cb
--- /dev/null
+++ b/Master/xemtex/gslib/gssetgs.bat
@@ -0,0 +1,8 @@
+@echo off
+@rem $Id: gssetgs.bat,v 1.3 2001/06/22 16:09:22 lpd Exp $
+
+rem Set default values for GS (gs with graphics window) and GSC
+rem (console mode gs) if the user hasn't set them.
+
+if %GS%/==/ set GS=gswin32
+if %GSC%/==/ set GSC=gswin32c
diff --git a/Master/xemtex/gslib/gst.bat b/Master/xemtex/gslib/gst.bat
new file mode 100644
index 00000000000..80381f7fb13
--- /dev/null
+++ b/Master/xemtex/gslib/gst.bat
@@ -0,0 +1,5 @@
+@echo off
+@rem $Id: gst.bat,v 1.2 2000/05/20 20:53:05 lpd Exp $
+
+call gssetgs.bat
+%GS% %1 %2 %3 %4 %5 %6 %7 %8 %9 >t
diff --git a/Master/xemtex/gslib/gstt.bat b/Master/xemtex/gslib/gstt.bat
new file mode 100644
index 00000000000..fdb5d7d4e14
--- /dev/null
+++ b/Master/xemtex/gslib/gstt.bat
@@ -0,0 +1,5 @@
+@echo off
+@rem $Id: gstt.bat,v 1.2 2000/05/20 20:53:05 lpd Exp $
+
+call gssetgs.bat
+%GS% %1 %2 %3 %4 %5 %6 %7 %8 %9 >>t
diff --git a/Master/xemtex/gslib/ht_ccsto.ps b/Master/xemtex/gslib/ht_ccsto.ps
new file mode 100644
index 00000000000..f0825d74dcc
--- /dev/null
+++ b/Master/xemtex/gslib/ht_ccsto.ps
@@ -0,0 +1,3171 @@
+%!
+% This file is a reformatting of data placed in the public domain by its
+% author, CalComp Technology, Inc. The original file bore this comment:
+%
+% convert 167.pat 167a360h.dat 167a360h.lin
+%
+% Aladdin Enterprises, Menlo Park, CA reformatted the original data as
+% PostScript halftone dictionaries, and hereby places this file in the
+% public domain as well.
+
+% $Id: ht_ccsto.ps,v 1.1 2000/03/09 08:40:40 lpd Exp $
+% 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 <
+ff51ef01d993ec6bd87ae0b102f24fff9f52da29e9bbff389add8cd834f3a5cf26f879fb
+6afe32d2f8adfe79f7c760d0ea6ad87ae561f804ff53ed2dd95ec5ea52c1ff25f787ff94
+c7b3ff6cf7a7cb86f24388fecc5ce1be6bf356ffaef137cb4fd8b966c1ff43f9cb2fe4bc
+0bee36f554d969e91fed4ebffb79ff37b4f88affa501ed94e5bf0ac6fc8ef57cface63de
+7abfee7bb8fe4694ff2eed86f1a5ff70eeafd694c0f61a9cd883b6ff52affe8ef62bfec4
+93e578edc193f28609d9aee556f179ffc112fe87b9d618c89cf1b8875ac0dd49a8ff36b6
+f60affc1a1b9eda7cc93f679ff1ea7fb08a3ec5dd005e035e44ad9c00bed32d0afdd963d
+f6b215e085dcc5019ffe8dfb7ad9fa2b9fec9459ee79f8cf80d886ffa5cc95fe84ffa561
+ea89f2ca27da4fcbfb5ad83093f79a53d824dda53ef0adff29a7e0169ef2cf77d8b64ac7
+32b7db933bfb0de086cef223fdc932e0c20edd56d465ef33afd80bfe41afffcd7afa6dfe
+07c7b565e595ed39ffa5e64fd909ffe21d99f2d880e086c3dd8946fe24c84cfb0fbfe086
+edd165e5cb89db83f2b8fb87f2a15aff9af561ff0ff0acd875ffa9f92693fabe54e510f1
+45a5e6cc03d8fbacdc4cafff62e0b329f95cc0da2de0c015d453a4fe86f270aae289fec5
+48bee483ff56c4ff9013d893f868ffd834bafa19f6a5fe87f703fbc59ef176fe5b7ae4a7
+5aed79fb9ebff296e282c0ff59f296c5e12fa5ec22becfa2ed2dfaaf44d8bf64f286ff7a
+afc56bd0fe8c05f964fe52a5f9d17ae091e488d9aa38f84993ffb94ffa30fea5467bd213
+fab0d868afd990e083fc2dedc2449be7c249edd793db84d0ff875efeb98612c5fd25c0ed
+11c6eb7be00db0f35afa86ffafdd07d83cc6ff13d676eaacff1aeebf9ae669bde46eed42
+cbb57ce75ba4e081d85be09fd961e845acd833d9ff45bffa95d12ae57b3cff17b5f97bd8
+ad61fb79d3fc67b4f43bff79d98acbff79f7b025e03dcef62ffba53fe5c3aaed1abfed2a
+adf260ff2ef357ffc395bfde289fed7dd868e5b6fe93db77e22ac9fe1df347c858d0b669
+fed879ffb28628ff61f8af1ac2f0933eddff9a6ae05f9ffe934affa2fb6dcb9bd8b633ed
+64fb9df6b67aed58fb25d963d8a635fb08d7f83afd9dbefb02f48efec24bff0eedbd41b7
+ff7ec1fe67f598c7a4df14d963ffa5f9d886c9e946dc24e7bf1aed9944c2df83d893e252
+fb1da5e303ddc297fbb58ade81edbe72ff4fce9bd97cffc913daafcf84e56cdd01fe6df4
+d516feadef0ed82eec55ff8ffbaa51e078b6fa94ff1ae0a50bef3ad3fbc0a5ca35ed9ce0
+2fd5f6b64ebef388facf52f1d7af37c3ee3eff1cf7ce92e4ae48d01ef993cfa1f18cf57c
+fec293f2b250afcd1eea79e04fd91fed93ccb378fe87f21db1e417ecaf0870f486fe89ec
+b60bc361eea56bf49cfc83ffb66ef7acff15f952ef0bd26bf2bf56fd78ff6cd80de951d6
+15fab22df27afe5ee24395fb9e42fab91afe9ef1adcc4dafe29342c4ff97f679cb20d85c
+eac582ffd509e45ff27af7c766e09818ed5afeb669fa77febe6193f2d836e206a5dd8b18
+f4db7cb6d793e0874dfe24c9ff86de6bd932e04cca07da44e061ce7afed979ff57d398fe
+aad067fb2cf3d323e197c4fa7ada86cffbe026d851cc36f592feb325ffd208cb51d931cb
+e403da62ed93cba6fe87eb82de9bcab82fee5ffa7cff9fda5adfc0a0e533f4a5beea6ff0
+c667e0a5cd4bc631fb9bff5bc6f975bb45b5dd9fef94f701a5ed299feec2a5bfdc41aeff
+80f5b873d904e5cc3dd9af09fbd81d97ff7ac3fb34ffc8965afe02f550abedc681dc79ba
+f250fda6ff80fa9dff86fa96f32ae6bf0af1c2a5f22bc75ef99cc0e56193faac5eed55d4
+33ff4bbdafff80f194df5dd839e0c055affe89f793f05ea0fe86d8af2bfb46afdc37ff23
+f447f8a9cc9cc6b636ed84fe73f817c7afcc0dff52dd05a5ff28f779fb8eed86e50bb7ec
+1cc0ed93fb07ff60d981c7fa61ccfb874efe3189fbce21d94bceff90f7a279ff87f2a4c5
+85fec14ab8e66cedb64ff9d98fe479bfff0ca1fb60ee1094e8c40bc1dd22d85bd2b814b6
+ff5c9edf9337d988ff86ee0ddd40a6ffcb3cddbe06fe8bf09dea633ab8e510ff6dfb9bf2
+7efba4ed79df20d87afbc74ae038ffc09bc3f37bcda0d889d980ec1ffe45f4d493cc02d8
+87eb67fe81f193d686fecb7cd993e012d85bd877cffa6aaffe33e36fd086e638fd4bb4df
+9b3fc0dd7bd3ed9e5ff193faa02edf55c5eb15d849e058e575dda5f826afd07be09f21ce
+45fbd866cdf136e5a5fed83d9af35aaff06be539eda5dd85cbf94affaffa11acdc76b6ff
+88d808afea82ffcd6cdbad1fcafaed78d09fbfdc03d54fcd14d931d060ffa6e511b7f699
+ec79dd60e41bfe61f766fb14ff5ad890d9a51bff62f352ffa6d23ce04dd922edb65af240
+d160ffb6f526ffac39c1df81d9a5f94af4bfadd094ff0ff2afff1df6b905fec586d80ced
+c686fe3ba8f691fb7dff39f518ed80d8ff0bfa41ffaff288b424fabb7ad8b64abf6aedbe
+79fe86bdff98f679fe52ee1ab6e980d75ac1ed43f8d859b9f481fc50f227a5f442ffbf6c
+b2c3fe30fa4bb0f779ff93f687ff96edb13ec0ff5ad120aff707fd80d194ea0db6c99ec1
+e479f16afbbc7adc93e0bf22fb9fc2ff7dfabf32e7affe84eda94498dd86f19eff4cf217
+cc64d8a413fe2deb6cd879d886e59752e0a52af357ff62b3e871f2ca61de29cfacc79dcd
+62fb4688dfadcc79e85bfec6e59848f81bff93f7cc29ffd019e047cb02afd82ed876fc8f
+c622f69efe6acbaf1cfbc837e29fd96ac7e787d87fd8fb1554a5e491ed7cc5e027dc5be4
+4ad806c9fa6295ef86febf53d6a5ed32dd56d3f14ae838affe07e03fcaf22afc4086ee89
+d811afe4639cfb9308c0db24f7b8fe62d81de07bd18fff94fb27f1c97ce09cf63cfe26f9
+61d8ff79fad170e3c0a5fb10daaf24ffb99fe60ef05cfeb8a0c1f3982cedbe11dc9e3b82
+efd388de6fe004b1d958aaedb6fb6dd9fe65f286e5af3ffebe8ce42fb9ff7bed9962ffb4
+25b8fe9a3dfe0cf8459ce0ffcb66d81cfe43adefbfa2c2fb86f56da2eacc31d865f294ff
+3bbffa86ffa579ff8efa82bbd0a0fe6eb0d89dc2e5af5af897fc39c2e05dd3f29e69e47c
+d507e8b1fd5fd903eb57e07ddb6cbdfb53d686ca8ee19fc513b6ca3aafff9430dd51d87a
+ed99d154fa88ff93dc38e501e052cbfe67fdaf78f7c1ff09affe32c8a1fe79fb96f98739
+93efad43c7a5ff0fc1e07dec52cda5ed01df50d0f186db93f612e4b879e08bbaf374a90b
+f386e5c19cff883efe1eb5e037d2fb1aa8fe92e20ccf60e570b4cb2ce5c101d950e028ec
+59b7db13ff57f50affbd2bde68b5f518ffa943fbcc38ff92f39c46c2ed87f6a8c73cf4ac
+ff39b1ed08ff5deeaf45f5d96af29aec16ccfe80f498ff46fb08edc130d863bff77bff92
+f782b9dd3dd4ec1e8cd99dec52b7f35ed8b840e312d3ffbf1de597f926cba1fb5ed406ff
+6bfb84d88ffea50de546ed70d886fbcb4ceed02cd8f7bf50ffb161df09d0f480e679c5ff
+885bc0e450f577b5eda1c3f510feaf6dfb9db9f4a6ff94f631fa88bdd093dd75d2f286cd
+ed55d87bcbe578b3eb72d859c9ff9330fbbc70fe9fc50bcf9ae07bd9a4d819ffbe72b0ff
+4fdc83f8a545e0ad27c9b683e2af68f7a5fe21afd04ed92ae016a5f25fb7ffc55afb79d0
+ff85e822f1cb83f4a44ed8fb73d656ed64dc35f394f1aedc20e54ef532c0fa7bc6afff51
+f12e9fffa56afe865cec9ecf2ffb93f861abd959f20e96eeadff78d925c1ff4cfb289bd9
+80d0ed50de62c71bcd74bfd697ed4cfb33abfe41a4ff0ca0fe93f721baff0ec2fb29f8a6
+13e2afcc4ae527ee66fc5ff321fe62fa87e879d1fb03c2e923d861c6ef6ad8fa6ef3cc59
+ff94d351c4ea6beda6bffb6fffc986fb9538e0b12be4a913cb4cff64afdd6dc9f78835bf
+ff92b8fe93e579d9874dc4f87bcebc9ae03ad8fc219fde7bbedb19c6e901ddd13cfb78f1
+b949b5eacb2dffa5bfde44d801f2c499e085d87ccaff5fe51ebdf836ff7afb5af30dfe49
+aed97df1ca65e6c77ae0bc3bdc61ed519bf25ba5dd81edcf75f268ff95dd81d8a1d992d5
+a5c72ecf53fd31a3e05ea6fb92ff09b6fe1ebdd915acdd33e006f286b8ff0cf93d93eda1
+47e305beef86f4be67fa97e5abc59dfc30fe06bce7abed08e23ed114bfff2afae09544b1
+ff16f279ffaa67bff906ccfe6bf859b5fa98ff8ec2e022d997ff148aedc36af87afdb5e9
+8652fb3ef819f3af45ef87ff6ca5d894e493da85e068c1fd06e0af1cf9b726ef5ffbcb81
+fe88c4d981e1bf4eff3bb8fe1cdbaf06c1ff1ef541ff59f788ee9edd82baf286fec042ed
+76e589d0af64ff93fb79f5a4fe79e32d9fd987e5c71dd6f37dd0fe4cd817ffcc3cf251fb
+0fec53d87ee09661fe79cd9ffe7ff8a958ceb90affc1ea6dd85addc44ff4d286e4af43ed
+88e47dcb28b7e50ea4ff5eed81d8fc9f46e225d89f3b94feafd6a5bfe169dd93d0b841c4
+ed10f245d72dffc3a3e677f35aff96d078fe9ed817ade504b1fa2ff71bfc97c4e062a4ea
+7dd6f7ad5acb86ed7ae011db51ff09f7cb40d818e19ebfd951f235f7c24cea42d0ba6ac2
+da5ffcc976fe61aaff5ab8fc64a5e180ed76afd881dd92d881f9b6f258ffd01fb6f569c3
+ea44ef9efb71afd9882dfe97f6b00febb527ff60f295c9b733fe64ee4d7bfbcc79ddb636
+c552befa84fe63f1b8da29e510fe489eff31fb05f39ffd87cd7efeb6ee8742f927cea6c7
+86e952deaf4af595ff67f3d070e0a5d386ee098cf5d04ffe3487ec9bfab92ecaaffe7fd2
+93e0a969ff97f661f32eabfe83de77e19ec7a5ff0dee3a95f3ae4cf115cdf480da952ee8
+c421faa1d902fdb625ff60dea61b9cd839a1f9d849de27b4d162e01ed8f55ffbd5b73dc8
+89febd82e095d938fb11ffd693d9a2b3f2ad43f403fea5f186e007dba6cc14ff72f481ce
+93eed979cba5e077d82ce04ddca8049be1afd893ff3bed20acfb0fedc188d843c7b735fe
+c060ff48afd8ff30bee48dc9fb46dd12e5a5fb43bff023fb4bb7ed27d77bcd8fffc110cb
+a1ff02fb29ed5bd885ffcb19e9d18bddaf42e508edbf52ff95cb39feb96bebc67aef31ff
+b8fb85f3c25186ffadfa6fff93c1ff9731cba918ed86fa64d92efe5af779d0acdf844af6
+15ffd828e98ad8bf88d71fff9af6b84aecbf8fdf4eb6fc5fc007b8f566bfff5af7afff68
+fab8f64ffe15ed61d893fed781d86dff2cf9a5fd7aed9f11f195c1fb619eed930ff164b7
+d377ff6ad885e66aa5d87febc886f993fe07dc4be598f940afd990de7afa9be54ba9fb93
+28ff57fb99c2ff77f9b062ed7ae069c9f2439fe391cf6de444dc14e0afed9411bee603f3
+3a87dfb1f14fffafdf03edafd074ed0abeff569cecc1a5e586fe83bcff52f73afba8c73e
+cf79ff6afb37aefac930d8ff87e64bfe1396eac1189eed28d585dd79ca9fbdf269c037f2
+50e4aecb86e01dd852deafce38eb22e3c043fec3a5ff22ed99bdf24afe01c1ff3bfaa014
+d947df5bed6dfb79d865edca5cf23cbece11c1f8d550e0c0a5ec84d933add825dfc10dfb
+a5f62593ffd20af34ef795cd78ff61fa2fc4f280caa0cfaef954fe7de5c05f93ff9b52fb
+a5c79fe130caf31ffb51c639c1e212c99adab26ee580fe92de21d893cbed1a8ff69d42f2
+a2d485e5c54888f2cf79d95dff21b6fa46ff04b3e59fc3fa9b01ed57bff293ff87f76cfe
+86d97bf2af79e052d8b459fa19c796d0abf28ee362baf379ffc09bb8d0a5ee36ffa81cfe
+86b5ff7bf1a03187ff7bf649c511f388e469fe7af79ecf45d7aedd5ab6fe83d8af05fba8
+c890d1a3fe60e135fe5be576d80cdb9f24f8c545c0e21ddd42fe87f9b688dd7ab6ed954a
+a5fd76f11cccef47d815eb5ff27be45ba4ffd469e0afc720edb632fbafffa53afe94e888
+bfec7adf8bd1f74cff1890d3fe7affa23dd907d547e0a5ca51fe02cefb28f477fccd86e0
+66ec32de51d80dcaff30e5a81bf739ff24b6d987c5e56dd1ec18d964feb1e4b904b4d8fe
+9fbcff45efb2d93feb86ff60f114e579c1ed2cffbf5aed31e30de94cd7aff279db17eeb0
+fc78c9ed6cdda7f285ff93f1af1ad55dfe6cceff06fad1ed5add93ff65b9ff6bf5bf9dc3
+fe04f7c12fafed0efe5bfa73ffcd7ad809dfbd54f20fcbfc5bd830ef5797dd7abbef3eb8
+e026d0fb6af47efcbf17edb89de85bb6d395ed069fff3cf8a4fb81fe79f7b083d987d0ed
+6fddc38afd0ef5499ffa2da5fb91e525d851eda0fd8627f05acea0c80793feaf1ad9bd93
+fca7f73eafd97ce09ec3f86dffbf93fb1c9bd88dffc23f96e72eadfb13fe34ce60d86ecb
+ee78d90ce73ba0d96aaf30f9be3fafe60a9ae0ae35ff42a5d86ee687fb55d095e086d952
+a0e562ee70fac780ddaf36f1affe82c7ff2acffb75d9a465f787b6c6a5ea3098ff61f635
+beff86f83cc7afe56db6d60dbccb25e6c240ef65fd519ffeab58e495d67dedcd7be0c041
+cb5ef782ff6bd83bc0dd93e51cfe60f3d178dfc38cfa4bc72ed0a0fe5df21ffe4a93daaf
+42f062c0ff2dec5086fad467ffcf79d895d97df706fb4ca5ff93f481bbed7ce4ff95cb6a
+fed37dfad829fb86d1b1ed87ff4fd89fbef22bb0f414baf822fb99cb1da4ff6af99ec60a
+a1e51eb7eba542e413f3cd4ce50fff4dccb2dd83d893df70d913abe588ff4dc6f387ff79
+f493b75afb9ecc28e7c505bff93df25effaa04ff51f396ffa9c0df13affa94f578fb69d8
+81dda52efa4dff33afed86ff64e00cce95dd7abded22fb86d8a5e473f6a5bfdda408f09d
+3af286e453eca5d083eac324e04cd0ff5af72387e90de0ad2cf24ebb7fc3ee11fa53de24
+b7f409ff86cbfe63c9ed80daae45ffafed2bd84be06dffd066fb9461fec188ff82bffe79
+d893f186fb0bf341ff1ffaa0c1fe6cd81df7a124d950dd39d8ff88d80affb660fa88e07b
+cf85d82cddbd86db6bd808eb468cf2cc5ce00cd03feda7f639ffbf98ed6cbfe104d89af0
+85f962fb3bd0ff6dd39fcb08f33adac405f149ffc87ae0bf59ff0efdbf2bffb53bfa97bf
+fcae16c7a9cf60c1ff79f697caa6d9ff569fdd8bd67afbc779d958dd3993e4ab3dff4fc1
+e179d984e596fe86f32fafd943f4cd0af0b44adb25afed44de25d864e1afcd7be8c451dd
+2fee5be07ad2fe7df089feae18edabec79dbc198f030ff16fb9ff66dfbc822feb5f76dd4
+febe2bfe9dbcff8ec601b6d971e111cda9f779fe5bdd25cba5d888e5a501b4f437ffb681
+feaf5dfe97e066b7fb1df7a0ccb68d5df371e5bf85d93586ea9bfb43f0fb3db0d81feb53
+fe0293f2cf48ff1deda542fe99ee6beabc02fb9fd093fe07f73af351cf05dcc09aed6de2
+be87dd79cbf88afb7cbcfea5f97bff9f5bfdbe4696fe81f59cc7a7f154b5cb0fcfb868f9
+be3695f71cfe47afd893dfaf59b9e83e9ae3a54993dda23986edc478ec59b3fb86fe5bf8
+86f152e01fd989ed81ff54f419ff51f7c6e55bd969eccb51e993d833aef428d0af61ed3d
+d8fac59edb16f252ffc5f65ddc70e0a3d893ed67fc82dd87e3c12eafe595cb86e0afcf27
+c0f97effcb61f22ded66d8b79dc2ff7cf1a547fa11ffa525ff51fa31a8ed5ce51bcb62c0
+e831caed1ad9aced09b6d042ea04bffa2cff9ef23be1c581e5bf6bde86d0fb60ed43cff2
+0bcaafff79f2b8ff20f0b6deae4df91ac2e128eaafd420c79eff6cfba5ce34c6b2df72e3
+c086bd4493fe86fa15aadd1afb61ffcd7ce083ffd993fe8022ed45affe8ad8ac02b3d220
+ffb0065dfe15cdabc632f563faa4fe6ff25efe0af66cff9f17d149addd81e0bf90f160fb
+17afd85afeca91d87ecaed84d895e7b907d898ff8cf30d9adc51a8f886ff65d8f97bff92
+fb5cd8af6ee563fcaf23ff56fbcb3be9a611c97afe83befe61ed34d70fe088cf79fb05ff
+93d9a4fe7dd89644f2a5fe32d1aec54fffa2fa0f9efb932dd9feaded21b7c997ff79efc1
+87ba12f957ed38c101b2e2c094fbd465e02ced9dfe89f27dc7f5e2bf9ff943ff9eceb94b
+e008d832d876da93e550d9affc96f722feb00fff40bed093eb36e3b879e560f243aff619
+fe79c9ff68dc3bd95ad0fb79ffc660e02bcbaf48e027cf76e485edc242bcd18eee7bd807
+acff53f492ffb61ee54aa5dd86f966feac5afbbe51ce67f130d44aed60ffcb79e077e959
+ee0af367e56bf2d846c7f19810e080d6f643e557d8af40f7d993d3a7c98ffba5f550ff69
+c40ff7a4ff61d83bd950e5309a8427e071dc7aed1affb37cf797ff88f9bf3baff183e832
+e063d9c177eac5a5e427fe77f9a21bff33fbc29ee06ccf5ae03ca4f284faadfeb139edb6
+05f476b6f26fffc29dedb534ff12f5a5fe02e548b6f696ef77d7afe04ed8f79cc3ed21d0
+9ed981cbf41ce49be8a5c88dffba9df516bdfa04c599fb7fde92dc25ccb77dffab53facb
+6bff5a9ed984f224fe9cc632fb4dff0de060d884dd17b7ed87ca41b7dd7bee77ff86d6fb
+c4ffb7f108d393d985e4c241cd51ed229affc30ffe5dc97cf2a44cfb995afc7def95d95e
+cbee8fd8ae01ff32fb9cf293fdbb14e5c11e86e49fc77cdf93cefe12eaba1efb4cfec993
+d886db79d886ffce61e033b9fc2487ef7fbf32fb65ff54f115e642b8d886ff22fa54f30d
+e538d0af66d8a4ff2acbb638ffbfa5fe3bea07d0e67cb5ee39c1fb0afea5e06add7aeda2
+e56df1b6ff2def6bcefd34aff193f80afeafc80ef4bc45e58c4ca5fe5afb3df924f48efb
+bea5c5e04bdd87cfa5edb605ffd81fd3f331dc4dd409ffbd40da51eb88d2b579dd0cd667
+ebcc5396f7cf4aff29f951fb349bdca560e588da9f67f35efb37f860f2a51dfec19fdd67
+ccfeab04ffd88ad47fe195ff6dfd8eed5bc0d971e0afce79fe86d9fc43f36ce57bd8f487
+57f179d89bf78840ff1bd4a4eb78bace37bdf903ffb81bb2d9933e9fdd8dfaac52c1ff59
+d87ee0a334e697d967af16f8b6d979e0a8c96cd0acde16ea63fe78f4a2fb3af629fec76a
+baed86b6cc9cff84e0a86afb85febbf75ceec14eff85f72ea5ffd861bee992d8a5d887ed
+be50fdd279f20ac1e31cddb1c99adf32c6ed884cf213f9be43e5ce9351f309f9b629c6af
+c501b4fe39aafc9334ecb64fed1fb7e793da52fe169cd3e413c5fa5bb1e0a8c3f261fe27
+afe467ed80ccaf63e788fe49fbc7f554d01de59bdc80e524ff4bd0fb86fe2bccfedd6bec
+2ef2c012ef9ffe5a86ff93dc01d8b720b4d87fdd5994e59e52ff62f814aff12df6c30fe0
+a52495d912faa5bfe35fb7f08924fea208fb55f310ff45d7f39329ffbfa8fa83fea44bff
+0faffe5a94cbff83e09f71f59762ecafc0df6adaa5ef4afaa1f37ccfed15c6ff86f9c96d
+ff88c70fb6ed86c1fb42acfe932ac0fe1efb5495df84c8ff4cf696ff2ef4c241f2bd81bf
+13afe07bff64f605fb61c6abf289c143b5ef7a9c52c893feb24fff61e537f2b6c644b1f1
+57ff88f272ff90ccf81afbc20ade92e7ca6dd888e5b371f3b7ff72e658dd2893fbd04be0
+c16deed379e084ca9ae58601c4e69751e033d852cfed7abfee80d6fb08b7d83affc427d9
+ff19fb3e9ffe35fa86e06fdc2de54e93f6a54ddd06a1e2c03efba5ff3bb0e062c9ec70d9
+a9ed60da7ae2bf04f8b66ed910d05bd875de99d12cf9d895fe39edafd293b9cda0eb69d5
+10eaa6e058d5fab3ff21cf74dd87d994bed80ded9dfb79e89ee03fd709ed44afdb82f2b3
+79fe51a5fb5aff40facd39e14acc9ffe81efc4039cfe7af5b334b7fa3bbaec5eb0ffabf7
+41c0f08eff99f7bb30facd53e02ab5f26aedaf79eab359b7d893c2e473cd58d618ff97cb
+85ffd862caef7bd7ff2f9bf27ee564bffa22f19e02f54dff8bceaff536ffa0d834ed87fe
+93f29ffa14ff6deda54ee46ed89847fb29f342fe1ef596ff5ff71cffbe05d87ae8a8f702
+fbc41dff79fb60e32ccfbb1cc3fe6bfac0a4fe61d83de3c434bfed19d094dd679ffe7fb4
+fb1bafd96affafdf41d914d8fe7ccba4ff20f9c72ed966b4fe16d65ae00593e7a022ff95
+f77bd0a725fbd10dfbc887f64cff11f583ff93edae3febbf0eaffe27b7fb4487edd260d9
+27cfed6bda79ffd086e0c10af2439ad881e868fb9ee04ed824e579cbade10bceff90f807
+ffc0a5e17adc86b6cb51d9b684d99f67f33ff9be469ae556a0ed4eafd495c9a5ff70f95a
+addf9350e528f09dff6ef5a5ff7ad961f01fc1df06d4ee7dcaf243d837ea86f4afff964e
+ed18e07fd9a563f17bfbcb55dd81f47ac2fe47b8e085d861e53effc15e99e06ded28acdb
+7dd8a5e022d961c9f769fb9df155e56cccadf7be16fab6fe9508ffa5c73eaffe30a4fb82
+befe0ff746becb18aff77bff51b9fe5a89fb84be26afdd84eb68c5fe50d7ff75fa27cefe
+48f2ca94abd065ffd87ad2fa6ec2f632fe17f34be5c594ec2bceff7bd3be1eafdd0cd849
+e593fbbe9dff85f7a530e55299fe8bf9bf21cb5486e5bfa9ff5bef44cefd93de0e8cedaf
+ff25b4f26ccbfe69f303fdacd877edaafa41ff96c3fe68f2bb47b0f8befe0ab6d426e074
+d987ff09dd5393e9a74386e0afcc2cf797ed66bbdd52d2ed6ab4caa5ff7df2d23fb6c893
+df20ecc3d946eec7f35ad830fb119eeda507e0aded6eafe28726fde011edaf2ef2af27b4
+ea7bdd8bec7dd7ac06ff86f5b711aff779fcd061fe86fab603c64bf236eb53c7ff79dbc0
+0fe04ea8ff8efad106f267d09ec1fe861eeb58d0fec23f95d0eb3bd99e18d1afde952ff4
+c614dc81d9bf54e707d12cfe86eb8c44a2f27cff93bbfb1ec5b1f17dfdd051ffc4f65afb
+73ea7bd915cbf97bffaf27c2e950e029d95aa4fedc09fb64f5b4369ffe93499ffe7af186
+d9bf35c6f2933dc5fb0bc2ffd86082fec179fcb969ffd814ff53d041befe67dbbf41d861
+edc83cdd5193ed98ce2feea7fe8fd8b67ada8abaf424fbb476f1d061dc39b6fb93d92cf7
+0c95e0afc0ffa0317ef9d962a5ff86f6b0fb578dffbe5dafff52ef1aa5f387dd80e59bd9
+05ffb5e461dd37ed4bd0a0f94197e023a5e08e0ea1d834e0aefc59ffa548e41bf096fe7a
+fa8cf695ffc63286f0c0a5cf7affd102dcb7e716cda8e04dff90fa5fbfff6a9ceb9037a5
+edcbb638e6c609edbf81de86b6fa9ef224b0f079fa9afeb686ff95f3c514da5ae179d862
+e427cafb14fe43aae05fceff960df79eed7fc843fe87ddafed4dfa3a82e5b6eda614fbc7
+0be24fdd31c5e81cd8f986ccb688fec133ff4cfbb438b9f16dd82efcafcc96ff7aed64ce
+ff69c8fe38f4c6f267fec01a95d882f1c789d871db3fd816d055eb0188edd89644ff1aee
+56bef77dff6bb2f73ac1f477e824afe117ddbf45f7bafb1bf56efb5793db9f4afe3af7cb
+07e184d9fb33afd418cb4ce103d836a9ff80f7a5ff3df3b3ff5aaae569f1c686ed9e2ac7
+ea74d71cff64edafc560ff77d4a7f3d908ff5ccbe7945af07ad588ffa979ee9e42e505f7
+d449e093ceb76defa4fe4ad086ed9e4fe802c0db14e0af2ceeb884d9ab4a93dcaf52c6ed
+44e50baffe37faadf486ff94dc7cccfba75cfdd681d98de09a4bec33c1e486ff9405d298
+c2fb7bf688fea7cf5dd8984fdda0c3ff2ffac1a5e65b93ffc148b888c1ed68ff94f27cfb
+84f9cb52e0b118c3de9d0d88edd081d89f02ff3dd8fa81bafe52e092d89c16f8d831c6fb
+178ab7cc9bdb2887ffc0aafc1fed62cffb4dc7fe79d99d6bfa79ed0ff2c71ed866de93fb
+12c7ff81f8a75bfe86fba3d610f85efbb7ff21f39fff6cfbc19cf35ce7a006becd4be524
+feb52be1bf11aff463fa25fdafcba2fb20d94de6b8fd4bdd39d864d253ef03ff79e7ffb8
+0cf17ce460f20eccafed639bfed812ff4ae6a926d8b546ecbc74fb2cd2fe6188fbb8f5a2
+21fa48fed06ae8b85be534a5f371fa35ffbf5793e7b15ac2e545f867febef245d92db6de
+93f509a5e081b6f138ffc221d8affe61a5ff85f619ea59dc77bedf3ed3f273cb46f388e6
+76d706ec6bd87ae201d0b52edf85d87bc5ff65eeb66ff2c167ef74ff99ed2ccaa5db73e5
+0def60d079f2c55fa5ef7effa5ed29db94e086c72dce7ae067d897d092e073ff20d5f435
+a4e493d883cef772ffdb9f20e59af15895e5c13ae04dd9bf9bedb77bf6a715ff93ddc204
+cba8de79e2acfe03f49ffe74ee93d83b7fd19af986ff41d858c9f835ff13d0af5ae5a1fb
+5999d1eb4be0afcb7dff99f625a5fe9429bde69cc735affe8ade94d03efec293f679ff52
+f920fd42d9ae31fcd89b43faa2de41d95cb5ff50c0ff5ad882ff93faa52effd61de3be0c
+c2fe6bf53bb3eda320f6afff1ffa47fe32f394dab950c3ef52f704fe59b6c70e8bcffe65
+d988c9f905ffaf7af980fe37c912de4dd9c279ef55fc9fee4cc1f529f081dc86d724d9b0
+1cfbaeef02e553ce9ff27dffbb68dc94ed76f6bf89f23ebfe42b93fb9c39feb72ed95eed
+c66cefafff07f75dffdb26f056ff83f1af31ec5bdd87cfade08bd185ecc18d10ffafd00b
+c2fb82f7d479eb1794f3b8e240d808dec06293fb9e67f25bacd880cbfb56feddc040a5ec
+88dd86d8ae58fb79afff87d17cde9ff038fdacf43bbeee0cff43a8db72efcb1cdd5ef28f
+ff93fb83feb024d86de17bff0fafd86bcf3aff53f36bffc761e087ffa5bcec12c0e02a92
+f0b249b8de30ff09cba9ff7ef7bf03c4da79edc986feab0de14dd863de91d8bb79cda5c8
+1ce163da9bbeff13baf23ca0ef58ff1bf8b8e679df61ec932fccb704fb9fc5df8728afed
+80fe76eeace052cbfe8ccff818ffbc0ed88e5f95fdc352cb14f165e9c005c5e51ad92ffb
+bf71c4e06cd962e07cb3d878bfeb86d82dbbff95d784e063cc2ce040d0f888fe1db4cf99
+fb50ffb7ed79e0a2cd3f94f5af4dc925fb6afe78a3fad31bfea5fd68d297e06fed17d952
+e5a9ff51f80cafe039cdfb86ff93f9ac43fb15b1ff6df79fbff912fb4dcca5fa68c0fe0d
+d87ddd9646c4f534fa7bffaaf255ddac47f936fe9efa5bc79fcd3cff10f4b62ddf3d96ed
+9f61f27de9f9d206ef93ffa9bfff26f69afe66f281e0a541ff19b1f729ff9bfa4efea0f6
+1dfe56f3a34ae909fe3cbaf3a4c0f06db6ec4dbff761ed86df9f1a93fac00bfbaeec0ed0
+fc8df081d848cbed5dbee681d90cec7bf255fb94d088fe73d883ddc07bff54f176b9dc35
+d01fedc198c4e546d932ed49a8d888e079ed34afd974e5affb5cceff69acd887da4fe088
+fe7aedc16dd3b0e814b7f125f8b96db2d87bed88ffbf48c4e293ff266bafe079d835e24b
+9ed978df3dd0a4ff5cedc896ed7fd1a3cb18beed2ac762d0afe579fbc86ef7c3a6e55aff
+0e97ff08c8a5e085d922d73df2c3d933afdd7ad882fe9c2fe160db96e8ab06ff933cf95c
+c6a0fb22daaf3cf9b628ed44ec22a5e792d89ff71a9fed7ed970ff66f378faa5fd93c3ff
+61f425fe95c4ff1df5c1369cf123b5ed03fec617eec01cafe522ff93f55c85d8fe71dd55
+ecc7fb4afe01d969e5a8fb32d94fc99fff5afb99f483fdc951fbc187ec23cbb20dfa61c1
+fe51f17ae66dcca9e492ff3997d90fabdb9350ed1ad886d2e467dc7afb2eff5afa76feb9
+6cff87f755ff2be44ad9bfa5f711ff37f4b870e0c498ddff4aaed861fec67ae0c1a3fd97
+fad242fc1fe55fc8fb4cfeb7e53ad81ddfc004d058e80ce59bd2bf56e786deaa52ffc67f
+e26dd2bf63afff7799fbd061d852e00bcbff973ed0a9ff961c87e097cfa5fa1fd875ed87
+bee5f237d9b828b6d90b93edaf15ff93f372fcbf92e62aafe403fb94f459ff0bf153c2ed
+67ceff27f2bf9dfb79f7af43fa99f252d8a5cb93e0a510ea4bd3a9ed96c6b4fa79ff52c8
+b785dd7bccfb4df31fb987c1ea86e39c14f24fff0cc85aba87f36acf94ff7cbfde8a089f
+f186fcaf80ef8dfe7ab6ca4aff87f204d86cfa93d108f9a1fe51f79ee539cef34c94fe86
+f99cd9b629e5aff6058ae4b6f3af37f251bfef92ff09b0fe1a86cd7feda5fe77f9ce2ee0
+a0d843abd835e04bc6fb79d8b75fdd37d87adfbfa5fa18fdb186df5cfe32ceb630eda1cb
+28bfe689f301ee42d1f9c49ee505c94feb199ee51eee74fdd04ffe27a5eb7affd833f101
+ff37f5ce86d879e092d8ff08afe084ed06d92eacf5b4ff48b6ca31ff51dd27c6fb84edb3
+3bb7fe5ced29d978e0b138b9dc25d85bfaa526e7c406edaa3bf167fb53d886c1fb45d95d
+ffc87cfe9c35dd5db9eb69dcf74dfe01d857e0a55ef26cfa7abefe69f5a1ff68b5f24fff
+c285fe93f89e31d96addc42feb78d286e069ffc862fc82ffa916fe5fda79ffb8862eff61
+fb86fe7cf4cc69d888e028a3e592d9bf15ceaf6bfc9ecb79d8ba45ffa5f933f149a3edc0
+36ff5abefa87ec5ad86bcfed7ae093d89cf4ab3fdd15f8a5e388cd9dffb7f34cfc94f373
+ff85ed89d9bf7af2b56ed9ff91cebea0ff2feb77d782e522a8e113c2f484cdfa51d6ad9b
+df86e56df21dc4ffafdc31d0ea02ddc420c0e80bcfa925e2b015ea49c1f288ff9c5af7b8
+ff04fab3ed12a5e506dd5fe4cc7fd89fec961ef5bf92d0a6e039d9af44fba5f959b8f102
+f669ff87f244e6c362f9a5fe65afdc1eb2d882fbca6efe9ad6a9e83fcd96fd28f7a110fe
+56f519ed61ceff73d560d920fb43e07d169fe568cc12d5a3c90afe52ffac58fbc51cbc4d
+fa13ee61d0a5fe10f893d0fc61b4ff78e6a12bbffe0eff38d198ffb993e9860fc2ff9356
+f9b486ed799cfe84d9f769ffd771b6fe01e63fbde29345a5d99f4194d8f96fd0aff146bc
+f634fd4ac2e16ddd45f218bff865ff89d808bfdaff61d5ade040dd99fab60ee047ed28c0
+fb6dc7f268e6a926d951f017fb64b8ff0cc1df79e9c689d9a5cb88fb0abcea96fe80ed79
+d893f6befe2db5ff8cef3fe5bb79dd11e0c033e59ff2d578e091bff25ac2dc6aed3986e9
+d850cd1effaaf179c564bef124c649fb3bc0fb9a5eedacca49ff3bf9d15de030b6cb4096
+facd5bd880ccf612feb5f16df5baff8647b7ff3793fe9d69e086b6f15afea5fc9bec77b2
+d011edaffe823d87c6fe5793fbc12acf80ff88b5ca96e105ed994efe11bfff80e5c293cb
+a4e47af2ae4bffb75cf938ff4ada78e0a24df22ccba8ff09eb52dd85c4de47e0b6fb6af8
+94c4f472ffb062fe3793ffb33dfe20e79744ffa2bff7a508ed95d95be045afecacf979b3
+e68bd8a5ed4be4ba1bfe80e595daa619f1adff77f5a9ef1fa5ed8ffd5fa5d87dda25d650
+e323d9c1f27ceabf1ec4fa0fceff26b0ca0ad35ec3fe33ed9fc85194eecbf5972cc1ed12
+a7fe6eef3ad3f769ff86d87bffafcd94e35ff5a131f84cff20d861dd9bcc1fe196d07eed
+b8ff33f9c391bbe54bc7b673feae39f28bfa831ea5d927e944afd82aebd187cae609dc9c
+cbb66dfeb0cb18dd59c8ff6cfb88f781d0fb21e43ecffb5ff306ff72d982f3ce61d810f2
+7bc2fe9343c4dc0fe487c1ff47dd26c6ff39f460fc8df979affb8f19dc52fba5da80e4a3
+62dbf872ed86e525b6d86cff7ffbd832b117ebaff871b9dd5bd894e4a415d836ec4ce525
+d940fb89d003bfe088d87fecaffe31f687fe61f205fba41c93d86de010ff6cf486fad61b
+cffba805cbaffed060ffc09dfe86f99a16ed79baf765f379f9d803e079fa8dfe2ab5df40
+d304edb269bf86fe9e14bfd296b7cb29ff42afee91ffb129e54dbeeb935bfbb939df6bd2
+9ffa86b6e795cfafdf09cbee33c7fe95d66be62aff48f4c7934ad898fa52ff7cf6af3be0
+15a5f7c4ff62d946cfff7af608ff52c6fe86f4afd09ffa80eeb233f1acff50fb0ff3c255
+93e0bb45b6d886d96adfb1f644fca5f095d921e041a4ed934ed8ed6bdd5498f18f4fed02
+d84cc7fb5aff40a5d82fe44794edadf140d261ec7ac2f479fec134ffd8ed5cddaeff7af6
+54faa5c7a0fb25de72cbfd86d2f809feafce7afe98f207e76df251c90eff4286febd82e0
+aa4ded08f47bcd93d8af05fbbeff19c0de99d904ccf078bcea85539fe287fc9c26eda5c7
+90f1b76ddaa81cff61c1e058c6fd6beb7bda95d4a53cfbd001f0a8fa17ffaff452eb7add
+c15bd03cc2fe7dcbff62bbff7bbeff24f4c714dfc5aff679f0a96bdd88ccfb7dfec1afff
+8634c79ff3bb93fb1b9adda75ae6a01074f62de54cdb1de562de0be269d755f838a3f05e
+9cdd7fed2ae5c255b1fc93d91ee078ed9bc2f29f56ff62f5cf83ddaffe5df275ff88d932
+ade49339f362fe5abffdd23efec7fa38d20be0adcb4ee540d623fa48feca8bed0ba5ff1b
+9fdd42c92cee79ffbd78b8ff72db82e99f38bed22bfeb60dff80f7a661ee9630d8f30fe5
+3d99e47aaaff6dfb2f87e034ffbf0af5b624e09e07dd57d4fb6fff0ce447d8afff3bc7fa
+86debbc993d86cfbafd086fe94f28cfe9ded85bbdc12c9ff3ad854ffa518f9d633ce62ff
+9ffbba61e01dcde513d8a222ff9c2fc0e012d83cedc284f15efbc782d894e090229ae493
+05b5e979f288fe66fbaff381e292ed9b5bf67abdd979f3ce86fea5f959df19d8f72996ec
+3ad367c5fb79ff9bca51ed9fe02edabf01c3fbaf58cda7fdd85dfbd24be295bffe9dd380
+e2a5d86af15ec9fb87f6b81de093cfa5ff68f081e5960dee4afc19ff88f19e3bfeb635d8
+4fcd30d805c7ff68fa79b8ed88d973cbed79a3ff87edaf47d62efa93feb67bf889febf5c
+c4eb54b4fb9ff5b555fe9bd228b0ff16f445fab2ff4bd8f37ac0ff4ad72fe0c10f98fb62
+cc02bfdf3acefe2ee5bc47e10dd88ecb9efa5cabe4c765fe93f726d8b313e582faad67c0
+fb5aff9cf272e58ef12886b6ca0b93f8c11fd955dc1cee4bfa37ff86d9ab51ea2999eec1
+52f228cab612d960fecd79d9a5b857d90acbed80c6f577ff84f77afbaf44eca5e431affc
+02fa9642bfe058d90ecbf17de9c151d337ed4edd3befa8fa86ff8ac965d024e0af0ceea5
+dc6ae09fcf68dd7aedb961fe2baed96cf9b67cffc535b9ffa5f785ffaf54f26197ff7ff5
+6bff24e881cbed42a5f20fd85ee051edbf60f226c4fe0893eb86e04bd314feb9d9f742ff
+afed35a5ea88f27bffc193d09ac0e517ffcf7cbeff45a4fe8ae57cfcbfa3f330b4ff38f2
+cef76bffbc5ce003aadd18e5b1dd5ae096ce22c1f362c4e566f1affe1ff694fb79b5ff02
+9df682ffa5c77ae588d803d63ded1df996ff62f7cd7dff3df8af2dedb60cf7a41fe0c59a
+e580edc01ddd50eda7e55ad944d819e09dc7afea22caa9e051d861fe0987ffd07ae5b0fc
+95ff6dfaa5cf88e456f2d8b21db8ff88dda24880bfec6fde65cdff4efb06ccb15df70ffe
+51a5f29036fad867cbe907d95af535eb4dc6ace085d87d2298eda72ff978ffca88f1a53e
+bffe1af579fe8eb6ff46add814d986debf46c3e537c8aedd2bd9af07fbb61fff59f280e5
+79b6d841c0dd9347e96ed888cafb79ffc96ed0ff864cfa10ff419ffe93f786d917ee78fb
+95f265fa07fc79b7ed3bbffb86f2afbfdd9822fe9f46c81dafd902dd43ff97ccb746eda5
+d930ed64fab3ff039ed82efeb979ddbfa5e53ceda2e07eedc64abfe0ac13fdb56cfa83d0
+9edb93ff6dfb1ff652fee1bf42c3de8cd8a044fb53d1ff9361d9a4d856ef0cd09efb7aff
+6cf35c9dffa666fe8cf366fe71f2d561edcb73e0b5fe50cbff7ae8a513fec1a7fb01e556
+b8d73ea7e854bff2aad493cbb0f277d826d262fe9ed0be28afdc88d851cffe83f79c06d9
+a132fd4af1c268d9f978f4d081fe8ff0af1ff984ff7af76cfc9fcb20ed87c3fb79f2a411
+ed9739ff61fec46cd7b822fb96fe72f492dc2cd8afef1cff49cb02ed9cd991c8a04dff94
+f360fe21eebe7ceb9a0fc2f286ff2de07cdb86e524dfa4cb32c1e409d0ed20d840e1a1ca
+4e93ff9a4afba52795dba909f15afbce82e02cbdf279ff1df387fb2cfe9416e669ed5eda
+06e55eff7ee0af37f458fecd38ff79f8a617dd5dccfe6ae5c591e66efbb50bbee2ab4ced
+35d85ac9e969d813d03de0c251e5a5cf39e952d18ae0c366f8d583d99c28f946ffaf6de2
+0bd83fedc386ff4ba5d879e586df7bd05ef007fbd478d813e3aec967fdd62afab0e738cb
+6dea8afa3aff5bf6c03ff9a9fe87f581b9f883ffaf1afabfdb16c0da7bf0b9fa34f5c693
+deb938f05bff68c79fd9b45fe1afd976e0afc2ff22f8a5fd97c7b0f20afbc986e0a462ed
+b5de30e6c593ff2dbaef4dfa13add834ccff912cff9cc1f67bffa341fe8cf386feaf0af6
+88ff6dd999ff19f641ffb026b6f217e5b988e77bf1c153f89effb659f296c1fe3bf5aff9
+51fd28ffa5e88828f9b6ff8743eab80daedf79db85ff9ff705d0abc59cceb583e36fd823
+d560dd51a5dd6dd0ec873af7a7f237e610d383e08c4cfa239fff93d986e026f64cd0fe96
+09c3f73afe4788dcbf38ce4efa2a9edd934cff08c1fa94118ff39f56ed7adb71b4d59ac0
+ff85ed9450efce6adf0ab5e41adfc09add53e2c55dde7ad82ab5fb5daee069d97dccfb5f
+c3fb7affcd01d830dda6d079c724e4af04ec85e0bf1293d895dc83cb62ddef933ba3d1fa
+6fff93f74cfe3dd01fda5bb6fe4bf217fd48f210ff95f079ff2afbcb0efa4596fdb979d8
+65fec188ff4aafffd86bcbea4dd107eea5fe7ae69334bfed6ca4dd80cff59559ff7bde85
+ecd067f0c0d97ae841bdfed868fed201faaff61cff3df25ae163fbd8af3ff786fe78c3fb
+61f60eadff2798fbb6fe56f4c811f2cb86fe97f10893e89e4cd834a5fa85fe60ff11f35a
+f977fcd06afa5e9dd9ff34f255f719fe9e51dab9ed04bfd934e063caa5ed77fb93f1c678
+d992e079dd87d8b947b6d988e45c9bedc0ade00dcdff2cdea544f398c3ed0da1fe86bcf7
+7cfbb641bbd814f2c6f943ffcb24f0b501e1c1a0ed10feb63cffb520a5f38cd0f15eb6c9
+3cb0e29333c4e57cdd94cf26c7b716ff99beec4fd93aaad87dedcf6dbeea8636a5e6bd64
+e0af3ee829d455d8ff3cc0ed87e2bf4eecabc994e086d888dd39a5db26cdfe44b6c6a2ce
+abe279d0ff6afb7af55aaaf1c198f209afe04fd8149ff92fff51caaffe38f6a5fe03f3a5
+bfff8a61ff7bf3a05aed7bfbafcb20fb5db8db40f218a4d86add98ed80ffa55090d89d5c
+fbbe78ff61fb2cd7a8c77ae5c15ffacf4aff1d9de427ffa3f277cfff8a5bfbaf06fea5f2
+79ea61e421cba5ff8af225ffb93bd9f902c3f2d71693fa7fffa0bff76ffdbb79b1f60efe
+62f29ecc16f646afed1fff9fc0ff7bf6b087ee68fb0aff3cbff40f86e01eb3ce9bfe861a
+ff5bd8ff7bf386ffdd65eda2beed079ee57ceb67b0c83fe016d0e52fd84de9c793d702e3
+6ddf84d0fc77e562c4ff30f454ff1fe061d9b7fe1cedadd051eaafd393f279fb56f71394
+ed9c75e586c6fb79da6ed818fd48a5e0bf43c2e484dd4cfaa0d091fb79ee05cf93d7af5a
+fba779afff4a95ffd031d84ded0593dcae17c6e06adb97d01eff79e585befb64b6cb4aed
+16e052d91bc0e088d87ced5bafd8f79fc3ff47dd2ce0afcd87be42cc26c7b83bb3cc21fb
+61f7c74cd91ccdfa7efe86f553b7f795feb51cff60f299ff53edad30f3be9bd96fe0a5c9
+94ccaffb05f185e567ff10f69e1ee447bfe021d986d5ff32cafe04ddaf42f3b0ed53e698
+bfee0ef7a0ff5cf52eb6d70afe43adda62b6f54bfc86eebf2dedd868caed60b6fc9df378
+c3fe44f49efa2cfeac42fbbc93db3affd02bd8fe79f495c980fe93f2a92ef347fac296fe
+33be57e670ee93fb60f738d9fd93f8a5fc5ad8ff79e493d6b574fb99ffb64fda25d893ed
+74c605c072e08ed8b628b8d911ffa1ca04fe43f9c00efd3af64a93e4b343b9d891d97cc8
+fe80f9a560ffaff34ab0dd51a5ef6bff9fcb0e93fec360fa7bd886d923d86dcbff7af193
+c1f830ffc87ae0c10bdb6bfec01bfbaf23d986df0ec9a8e26bd987e55bd87ec9e579ed5a
+aeed6ba0f89607e2ae33fbb60ae64dffcb91dfa61ee980e58efb27d8b60cb8d87eebb104
+e04dd586e7920cf2bd40ff19eec230d683e59bef6cfe1fb0ff92d9fb3cf549fea7fa8acd
+79e07fe686edb07ded86df7ad9c468ff9ffa31f353fd32b6ed0dc4ec9335cca1fc6bf9c5
+87d82ce761fbd934a5dc22eb43fe60f387fba551e5c55fe077edaf1bfa399fffaad34a98
+dd75f4a1fe44bff859ff25f9bf1cc1ff92f106b5f82dc4fd03c0de4becc756ffd665ead0
+83db9f61fe6dc8ffb643c801aef281fe9ff349fec46af2c19fed16aff3a7d069ec83dfae
+5cf965f40bff49d09fc2e440ed5aafcf85ea78dd39f156f636ff50d3b82aff4cd0a8fe17
+f4b02bdf88cd84e096dd58cf9bfe43c0fe72ee0ae2a81dfe5af694d6b676bef886ff82c9
+a9cf9ee502edbf20acff12b4d088de82d2ed8724f9b0f288e538ce8ff16296d889de5eab
+ed953bdd54ff70d09fdf68b0fe87f373a5db7ebaf026aafb2bc5ed05d94b87efa5fee5cd
+60de36e06dd7a424ff972dfb77ffca4bfe2dfa99cf55fe93d8a4cabc93c0f837fb86cb9a
+f928febe0dcf96e57fd888dbc094ed6ce2c58bfb2fc1e35bd5f9c213ffb507f579ff8bdc
+6db2e31bd993d884cbed7dd8af12f248ffd108e450b6f413fb3bafdb71fe95f252bdfd3f
+f462feb84df3c778e00cff57b6ea05c1dcfd29ed79d0ff4efbce83ec9dd847ff1af4cc3c
+d820b9fb0ff7408bffcb79e051adf593fbd013d965a13dffafd093ff15f6ba78e2c558e5
+bf66df7edbac11f4be2fed05ff3fe15ceb7aafd60fe961d8b56beea5ff23affe15fbaf26
+f71bfeaf0be79ff2659bff9248a5e679edc0a5cb22ea3afad167f17bfb5bff2fb7f743ff
+c97de3ae67f498c2de6ae093c1ff85d038d976e5ca6bd99de32695dda55dff95d87cc6f7
+7fffa53cb6cba3fa1393dca50af5ae24fbbf93edb66ffa81ffd05ce4a1c3e09959f886ff
+ce7ae030a5ff86f7c2ed9518f94ea9d883edcf50feb68825f898ed46c8ff6be5a5ceb88c
+f2a8fb13bff168ffa2f518ffcb3ad861edc866de70eb9bd8a5ce69fabd57d6afdd03edb3
+fe61d93cff4afbbc62f2b704ff9cc727eb88e579c1e0893afabe25ddb03dfd26ffaf4ee9
+2bf261f7a2fb2c99f60ffe58bfff01fbcd31ee43faab2ad95bd0f67aff51c6aff235caff
+68d9b87ae45bce32e599eb4488febf63fe1ef4bf16edb710fe5ebae44ddc2bfc52beeb7b
+c1ed63fb31adf30bd8feacd201b0fb73b9dc43ff70fb61d82acb9ffe32ddb244bde0799c
+fa86f7ba4cf29fd051fb3fff4bf2c480ff1dfb50f56ad025ed93d686d86fdda5c887e6ac
+3ff8bca1d54dfe02afeaa6cf79fe85f9cd7ad988c7fb79d88fe0c006ccafed81d886cbf0
+6de7ba8ad984e367ccfe87ed1d99e10adb6dfe85e479bce646f3c90bfe81fbae12c8afee
+a52edc86d86cdd9fd168e897c2f16ffabe936bcfff44b2fe08ddc093dc7be9943af160ff
+cb86e2279fed92d81be697ff79dc62d879ee93fc4eb8de06e43c94ffaf02ffbd93ca89d8
+af2cdd79e086b8c796e2b77efb19f39ef70fff2efc79cced59dd13fbaad897f25cff19f1
+53e805abf242ed0da5f01afe46afff7fd954ff39faaf2bd8a246f710fea6d8159fe06fff
+c768f1aeea23d854fc2da4fb9361edb5dd4cd3ff78e006cbf951f2a7ff4cfa36feaf41fb
+1ab0cc23e1f30e86e3d56ef4ad5aff1efa51bfd986e0a438f059fec108fa58f6c44ac1ed
+21f7b7ff03e586c6f265fea5c0d927e0c286f12ff408e560ffabef41cffa29ff52fac65a
+dfbf32afed84d956e01eb7fe95ee67c63dfc31d984e09fd8b987ff5ed07dfeda59bacb97
+e75cef18e3a3ceb979f886fecb7aecc053ffb8ef3dd8af30fbbe3994f89cef86c1e01ad1
+ff982591f59f5ef28bfd6a9ae2c502beeb93da72c8e579d8f67affaad8aff8992ae5c237
+edc69dd0a5ff69fb2abffe93d57bebb581e0a67af286afe38a419ed9ad2fff20b0ce6ffb
+88f86cfd41d8a5b9fe95edc5118ffeb169d87ae90a9bffab63fecc6bd89ef986ff61d02d
+cba5ff91cfb56efbc04cfb36d9c09ce5b647c289ff67fa2fd787febf60f208e950df17af
+dd389cf29249c3fe7bf3a4cd7cffd14bdd02b6ff68f0af3dc2f9d838e9c62bd946d8ff38
+8dfb80cb24b5f806a0ff9351df9d3b75de4acafd8f61ffb463e445ed11e6c29ad962e017
+d851fecb34ffba09fe3bc5fbb5f451fbc39ac0ea4bdd1ae147cc9fed79e45bcc45b786f9
+bed915ed9fdb92caf236d0ee934ce418ed40c6a6f192fa5af20bde62f8c30f96ecc493ef
+2efb1afa86f6d636dfb6ed79ddaf3efb7dda8affc296ff67fbcf22d7fb9407e04cd910e3
+61bffe80c8f442d879fea5eb70bbfe7ab7ffa0f7b577baedae43fe9fe063edd432c6ef0b
+c8fbf193ffb61cf2b9d804fb8afe81ccaf5ef20ff9acff88f324a1d96aecd06bde9911e0
+85d387ed68f681fe99f383b6e913bfff23f87bd9fe35d24d9cf45aff23f84aa5e08b01c1
+fb98ff7fb6e507d947afda7ee59fed26ddacff801ffe66b7d493d8be0dacec93089fff25
+f79bc2ed5ad6ac37f24ae5b77be9a664ecc0a5fa81ff8af51dafe15c9feb93cf10dd51ff
+08a8e01ad052c610f4d31fddc088f046ffb786eaaf65ffb758af02d879ecc6439eed79da
+20b8f732ff84ecc5439dde79bef186fb51a5fa80ffbc6efe1ddd3cd90cd731d853c7ff77
+fa5fabdc93ed17a6f288ffc972e086cc6bbfff79fbaff22ada52cafd66f795c2ff19fbbf
+44affe7bee5ab8e2c6a5f658ff3bf39ffe4cfbc8e552d062e521a7fe1aee84d8a5c904ff
+5ff7c933ff5abded41b9d486fa36ffcd19fe5df788d893cbf35bfb84ee93e4a552ff65f2
+11c6a9cd1efc5af798d92ce5ccfb87f65e97ffd252f5c1a1e373dd52d0af69bffb34ceff
+5de617c8e527d84fedca56f27dfb89ffa6f87afea52ed993e0c23bfb64c0e654dd05b6fb
+39b9fca5ef1ed93ee571d191eaaf33d7be6ded86d86994ffd250d938cbf48d46ed11df77
+cb64e079d9bf6db2f384dc8affc968e0b1ff27fa6ee086da19b0df75dd16cb9fe555edab
+db69b9e586da78ed37e64e9fdd93d929ff61f9ca84e09bff7cfa79da80e014cf88fe649a
+49e434ddc11591e0a62eff4bfb99bef628ffd87fe4ad0dc79fd9b35af0acf71ca5e7afc6
+60ecbf47c5e007d3f257f60eff86cda2ff7ed896ec82d8a5e40fd85fe7b1ca94ff57f90b
+f397ff22fa37e14aecc40c86f5b6fc8705ffc093feba9bedb02bf5951aff3ac4fe03ec51
+9ef6944dbed093ed51fec493fb86f59afe6df924ffc60693f3a54cfb32c8afff7cfabf2f
+fe6cd482dc31affb27d056d838f24bffa4bffa40acedffc0a5fe70fbadf841fec594bcd3
+09e06ee59504f161f796fe48f98fffbf6188d2fe8e07ffd82b96f286b0ed6bb1cb77d69c
+ea08d93ef525fe4bf72dfe7cf488fe974cfe12bfe080d865e07ab5d898c0ff79f7afe99f
+1c95e5d171e05ccf43f801ffd06ae5c2a4f078add87bf9d10dd8f474fb11b5d8ad3bed4d
+d625cf4fe0b7d99661c1fc29ecc397bef91fa2d903e186c2f00dfbc1a4e079d993ed86e6
+9ad2ba2add61edca1978d920cfb92fe06cd787ed18f379ffa7fa48ccfcb4d930e088edba
+32d001dafa9e42dfc15aa4e5c313fe5dc1ff1dfbbef14abffe7ce3abcb6de0aec561ce46
+de26ceed7cdda041fea6fb3ec3f15cfe14acd82ad95cfeb8f346a5f228fbaed983dd7bbe
+fe25f959dab831fbbf42aefd8d35e4c499ff29f59fbfff7cf28efba73e88edafe07bd988
+ff0cdf6fe8ca65ffa8f741afe4954bff04f64cfd15feaf08fb61f593ffb582e0f393fa7f
+ef93c4f20ed961dd50b0d8388dd9b8864fa0ffaf21cb5df586fdaf2fc0f181fdaff76bfb
+b677e5349fda94378ffba561f3bf58eda4c71ff099ffba9ff26db5fa37f6b2c720ce9ffe
+06afd187f455fb92e32fd861c9fe7fd8a114ffb632fb4aa5de86d810ffce6ae093ed62c0
+ffa548f179e069da0eaae061d803ecb4fe13fa33ff56d56af2a2fe3e94edc11fd5a5ff5a
+bded7be59ec7b3db6acbe484dec24ed00afb5d3add57e009ff4bafff7df888fece67eec4
+fe26e4c4ed6bd4fb7be79cd86ded96ff6fd021ed32dc4cd2f092cef748ffb6e41cddc42b
+94ff12fa51ff79dd0de55bc2ff07c1d986ed79f285e873bbe43ced9fe07ad06df983ffaf
+34e564efc961f2c793eacc5cff98ed7eaff308ff2eb4db1fde86d3bb40fe80f7ce33fea5
+f96dd884dd79cdaded16dcb94ab6d8fb4c90f279de7ccef936b6cf5ff22da5ed3eb6ff20
+aded7be8a3d1b889fea8cb9ae567bee835cab520fca50f7dafff8c07f445a6d80eff3ce5
+4cd80ee152d995cc92fea526ff7ebae065d87aee51ffafdb86d580e99ed052f593fb3aa3
+e09353ff17d951ff2ccbf669fec524bfff03ebb5dc10e099beff3e94e69c53f50ab8ed28
+d950fa38cbbb9ec5e95bf0affe05f9a4c2e04b93edc558bfe539f24dbde75f98fb7cff89
+f608aae0bc55fc33ee1699d9ff1dfa93c0ff88fb79c99ff836fec127ffec11c351f939b3
+fb24d093fb79eb84e0b6f2d842bddf83c6ff79ef85ccaefe79f5affb7cff75f20addbe55
+ed03a5f315feaed070e55ced41d9af01fba9c970d5afee61feaec3e588d493dfae46d8b4
+79fb50a8f29343a4f66afa1eccaffe23d1ff8dd978aaf78cd285e668fe6ff57eff9a55c1
+e76bed2196fbb80990f126a4ffc19dff21f8cb45e226b1d07ff12affcd88d893fec75289
+eaaf63dd55d819f24be567d9b078de62be9eefd278d8f173d9a8ed02dc55f73ffe5393cf
+fb5ffe9f1fe249b8f31b9eddc235a3e016d859e87afbd06bfbcb84d9992ff9b707fcaaf8
+6afec086ee2fff1af886d921ed449cf402fc5ff887ff0eed9ac2de61cdffc34cd088ed79
+df81dba538e34cffc95fe014feafd71ce045d815d6fa9249d97dffca5bd8ffbb68fad981
+0de063d878b5f59ec2ed37feb5da9911f263e56baef5d844cbfe0bf775e286d888ffc404
+fb93f44afb2790ff9f0cbffe5c86ffa1bcc998d1adf81ba5eb37d1f686d9fe68c1fb2793
+edbe69f787fe9fc9399bdfaf3fff4df5c979edd09a25c2de33e347afdc8ae0bf42c5fb7e
+b9ff6edca9ca1de5be9fcf5cf32ffea520f086feb948fb06f361fbc37ef2a61efd93f2a1
+4bf995c2fc93e1b929c5ffb4e43ba8f38840ead29646c6fbaff393fd07d058fe86dda248
+85ebc1acff2cbfe00da4fb9369ed96ceaafe12ee4395e1b632c787d8b0e531f3aeed3bb8
+e2c34af116ff30dd62edc779dcaf50cbb40aace081cff858ffd040b7c629f9afff21f593
+c3ec68b5ff4689d8ff79b2f693ffd379f35c9affa565e2d014ebc16aed99d54dfb39ff93
+d586e8c095e218e7a7c79ecebc0fedb830c0eb66d93acbe374ed29b661fe78acf386139d
+fad819cffb9f1bffafee864bc435bfed92e019d56df2befe3efa59c9a5fa50ffc537e5d4
+af2dff41b8cfa4bff151f7a7ffea5bfe7ade65d886c8fe1d93fa88d978e97bff9f4dfe13
+fa98ff65c2f140ff60b6e5028bd9f270e062d888d670e50aa6e01eceadf32ebeed17cb53
+b909fe35cbec0dd8f13093fa9f30ff4bfa82f18ad873e00cd952fb3aaed87cff5bf740ff
+b06cfa9ffe7ad387ffae0cffbe9ff7c402c6e543d0efc05092e8af7ac1e06fd82bdea9d8
+fea05bff7af75aff0be591d878df01ec81dc965ef8b71decc39de760fa28fe83d86fd91e
+9dd005cb95ff21f94f9cf2d832e55afbafcc07c0e585ed88e023d8fa74d296ed38c9a8fe
+b01bffa5ef10e451fe9fc1fa7afe61dc75fb599ffe81d8fa99c3e57ab6f955afffc84ee0
+bb85ddb429b7db18eeaffe79f281befe61f227dd92d885e5d51cd950dd08ed52e589d03b
+e050db96f068ffaf31feaff664fe32f752f494fe62fa0186eac51fceafe886d8b322b8f3
+96fe61d626f2aecd86ff7efb6dbdf396dc62e50cfe93f267f8abfb43afda6ee6cf6cb6ff
+a5d68626f28bfa2bd7b93eb6ed932ebdfe12afff83dd52e398cb4abffc7ef2af36ed56d9
+87ee11e797c4e166f2a626ed4a96ff28cf8ce761a5f379fdce0cfea0f665ffc2449fdd1d
+c7ed01d988d172ed16f94ba5ff92f385fbc398bafb5af480ff79fa2fb8d884e578dd10cc
+9bd887ddbf15b0ec87e4bf42fba5f23b9dde52fba5ff30cf87f19fff77e907df51d83be0
+03cc4fc0ed87d2b53dc5bc38ed5ac1f583fea507ec4dc80cedbfffade05bda6dffa4f84d
+ffadeb5ae1c763eb1ef66dfb87ed79b6d122c0da90ff26c6a1feb83cff04d83fdfc091fb
+d869f0a8fe04bedf19d845a6ee6dd83ae0ad70facf7effa760e4b8ff3bfbafca79edc055
+d035e0a546fa2dd7a5c8b410e9c29ffb0af25ad894ff58f104ff42a0fcce3bd85dffb271
+dd83c7ff26ed82dd6ce652d919cb4cdabefe6df5a5f286ff91fca91cff53f8a5ffe092d6
+a3e518d137c0ff81fb7af69552cd399afeafe805d86acf7bdc86f79f48fb93d1a5d936dd
+07ff45f68eff6be174b6f74fcc86da7deda4fb79ff61be0eb8db4386d8fb7bfe8af7c65a
+dd86fec004eab726e250ccf4934ba5e09643feb32afb86f6b66bffbe7aed86fe23f2d193
+50dd80cba5fe23eb86d77ee4a5c2f26093ff9df125d0f50ffe4eafd262f815ccaffe7dfb
+8bf7a73d94d8b916b4d94dd82df6c993e07fdc156afe26fb62b6ed97e147d0a5df3eb8fb
+76d8f38646c2fb80f218e537d809cff0ae2fff5dc0fe7bd886e09fcd4ced01d7ed79e41a
+fb51f4be6cc3eb1bd1f59fff75bff2af3bcd5ae62497ff19f2b07cfbc659f085fa9a2efe
+b5f20acef17edcc499de03eccb1ff1cc14dc6dd99949fbbcff3eed69c6b661f42efbb34c
+df23e6c70bd96ce552b7cb95ed77fac09dbbed3a98e05fd822edb3fd2efa9ffe7aef87e5
+bc4af225d85bf1c7afe080c8ff50f787bbf323c2ffd219e1a50ec5ef9655dfb2fe9ff96b
+feb975ddc19af10faff343faaf13fbbc9dfeaf36ff95d3a6e09116fe35a5dc9357eb39d1
+fd1ee493eda5c9afed79b7d143e73395ffafd811c0ec7cd96afdbf64e50efe49b9ff5a9f
+df935effaef737ffafd71e87d8aff937fbcd9fdc78cbff93f979a9fa90fe82da89fb31d8
+b604ee4bff79f9c70af0a1ff67d086ed5be03dd00efe599ed97bfbaaff98eb419ff20e93
+dcaf15ff5fe5934b9ff580ffaffb30bbff933ac650b6e9983fff1bfa64cca2e688dd79c7
+ec60de2dcf65bbca61fa2bc1ffd886cef84effc986e0ad5cc767ff07fa4dff38ccfb69f9
+a3c4e0883cfda5f75dd521e99f2cffadcb93e778ceabfe3df8afd854a1e082ed69f7c2f1
+1693e09907ff51f1147fd939bdee49d72ec6f91cabe061ffc689d893e060a5feb649bae1
+0fdd76cd93eba5dd91c6ff09e6c039cc017dffd179fbcc42fdc497db74fab5ea31d861d9
+7bcfeb1dd9afed90db14cbf37fd891e033ff51cf25ff3da7fe86f292d9fb0de5afed8046
+b3e85f99e3ae31f711fb88ed9ed8b67ee090da9e0fedbe74ff08f5ca62d837dd87ff79bd
+df934cf230c1fa20ef71d980eb0bc1ed61cd06dda54b8fffd053edba7ad992c5f389fecb
+67e087eda560c2ff7af09e44fe2ef40ebed939dd93f679ffa5fb19ff75f966f235b7f45d
+a0ee8afadab521e752a6ed78e52ec1ed03d86dfe87f121e45aa0f67afa09ff6efb86bee3
+59ee7af4c293fbb583f1cb1cd953ff3aa5f2934ac5fba5f223fec105fc84d8be9fd625fe
+48f7c51ef461feafca28de5cd9bb85ed7bfeafed45d0fa5bf5d885ffa561e093d617ff62
+b6fe29f693ff7afdb6df39befe80c7f728feac44e41d9eff0ff551ffbae640d816cfe57b
+d985caff73fa7eed31d7b446b8d95ac926d89ce07ac8affe62de47bf60f49cbfff07d985
+fb4fb0fe57e0afcb50fa86ffc043cd5ce5a3d048ed23b1fd03d2b219ed61e4c04a94ea9d
+d27be7c55cd8ff8906dd6dd67bdd93b9ee4bff3cf6b780dd6ba5ec82d830e078f393fbad
+4aff1ae09f0cc1fb9704c9b716eb51d0f2af43fbbe9dc4e586d875e442cb24ed61faa20b
+e843a5e069d5fb6db7de79d9c094d8089af386fbb959f1a5fc479ae228cba3fe63f396f2
+84f488fe52fb1aff4ce415d87bf193fec334e068d059ee9fd979c6f49613eca2c6b601ed
+93feabc62de7a6c2ff51cba1ff6cf99edb06feaff567fe09f6a020feac27e0afc0ff51f4
+34fa62d0b181de78edcc14ffd05affa6f893fe52d21fe498d6be6af3cb8e5fe5a8ff71f8
+9bda8a06ffc387ed33dd3ef24efbc09ff9b384d97ae5cd6dfed186ef0fa0cfff4bf7af2e
+fd6df7c95ddbae3affbf1fd0aff367b7e806c2df1fd839d502deabed83d093d886f7b0fe
+2de50fadfb86f397feaf11ffbf2388d0fb62ff35f2d078d91be086fe7ef76094de7dec3c
+bed834c3ed5dd727dc84e06dc7ed66cbf371fd3194e1afcd9ce51ef3c102fe4d9af3bd30
+e5b60ac641b7da8bf16cfa32feb247ffb8f232dc4ce0af28febbd96de55aaafa7afe99d1
+b002e05dd5ff12f14db8f2af1dff5abfe93390edc561eca5d345afff27f4a1cb7aec5bdf
+15c7ff79f96dafff81fa9affb93ab6dc60fa32ed993fcbaa80ceed4dd81ed83be5bb6ae0
+aaed47bedf89d8994bffa8f861f042dd0ecef42bfa5bafe586fe75a5fa80ff52c8b3fc3c
+a9f79350e59dd9f9860eff4abfff58e4a5caafe08952f179d998e8aaef02ff4eceabdf75
+d0e68616c5fb7bd887fcc78342f6b223fdcf08b4c91eef86ff93ed2cafca9dff8b30e096
+caa5f97cfbc10193feb71dfb93e080d075e409f894ff87fbaa40d3afed52c0e061cb79ec
+a3f60be8afc779ffd96dfade599fff90f984f062caf841fc6bffa528f67afaafd82fc89a
+d2b99fff74b6d895c5ff1ff148b9d90fe0bfa5f91896e4d010d8ffc215ba50c2ec89ef76
+a1d87aff41f82dfcc3a3fe3af75dff85e47ab6f61293ed239ff8d869b3eb1cee3ea6fad8
+79eacb6794f6e060ffb752c534c1f563fa3ed8bffb5cf749df29d863daade53add84c3eb
+13ef61fe86d954d72cdc61ed93e5249efb10a5f01cfc58d37eff9f27feb706b4ea2089f7
+c503dd5ccb94ff1eafd093da0ae5b859dc11e864fd54f307fe66bfed47fb12ed88d96acc
+ff7bf3963ae585cfff498afba33f86ddf57ffe43de13d4f926f292d894d879dd10c0e077
+d025d844caea7bc8fb5fffc138adfe39c2ff7ccde7129dff2ea1ffd951a4d87de496d9fe
+6fb7d893e78118da86c1ed71ffb5f244ff5cf39dff497bfeb7d923eaaffe71f5afcf03fa
+5bffd87acdfe4dd894e024d950cbf36ad6ef61c0ffd93ba7f297fe2bdc6fe079ec30c2f4
+7dfecb6fffc493bfe080d88ee024d5af84e0b84cb4fb9b29e058caff6af25ba2edbf61ed
+b5fbae37d8a4cbadfeaf5fcb6de60bef5bff96fa55a9fb91f395fea42cff4aafd881de94
+ed79d955abe05c93f3b860d4f08718c1fb31f314fb499eee0dff27acfbc2a5ff04afd894
+119ee0c0a5cc0cd8afdc9351a6fb9a36c3e89b4bffa1c8b98842f5b668e57df96cfe88e5
+86bee24696fba54d7afdd672d07aedb9f64dffb6fa9e55d738aee09c45f218a5ff38f65a
+fa79ffc339fea2f20be8c0a9fb13b0d822e0b902ffd82adb62e997ff23f15185ed9afebe
+4ffb73c920e486d9bf18e166d861edbcd89de509f24eff07bff189f703febd4bd8f9bf3d
+e4b6ed6bdd90d0a7bfe07bd886c8ed5fe142d09ffe35f6b8fe8421fa69f686fd29fac8f1
+43beff8e19bfed6de43bd9f1add02ceda4c736cba9f23cfe12a1ffc728d8f3cab612ff36
+daa70a9cd8931686dfafff87fa20eeb97ffbc366eda9cb97e505f0af6bd886dd7afe62d6
+a0f57dfe88f9cd79aff794fe08c66de588fbc83ad91bddabc79eebb563f535ff86c2ff0e
+f8c1841bfd5af9af88d2a5fa28d09add69d2ff880e85fec55893ffaf4cfe24f73cfe4cf7
+a538ff93f86ae07cd488e346cfed88e0bf4cc3e2a30285d6e563e0cbfb31d893fe8215fb
+6effc007feafee0cc2dc79b9f25290e69418f96deda2e552feb6fa32f2c8fe40ef05ea96
+d26dffc852e69ad111fe44acd963ccf92bff52ce39f087ea40d050dd359cee1dc54aca84
+f6d358db06b7ff86f67afd26ff48f3ce7be0a5ed3eb0dc943fc7ecb5dc71cbed3be560b4
+ff45affb2699edb1f29e23fad601e0c195ec88ceafe479ddb2cf0bafed26f356d96ffbaf
+5bff38aeed9257f4b6ff9410f7b04886b6fd0eb1eaa7c1e05194f279dd7fff9354fbd080
+d8fa3ffeac45e0c264aff287d679e4b06cb7d393bdcb52e5ac0ae1b227fe60e493bfff7b
+f31cb5e698bbfa91c419b6fb94ed7ac8fe6cb7ff92f2b73ba5fb93f579d4af5ae093d786
+d8a502fec024d0a0f156fbaef38932a3ff17b7fb96c0dd6cebc685f0cb37da4ed0e57db9
+f564fa38ca53f2049cff1bf262fbcb88dc85ff17f2c308bbd299f811ffcc72df46edacce
+79ffc5f15ec9f84cdc349bf8d549d828ec47bfe0a533ed09b2ce61dfff9b28fbcf1bdd46
+fec259f623ff5ff779fe3bf3c179f8be82f2c24fec27d79dfb77c144ee05dcfe9fd965e0
+0bffb554e5d65fdd22d8ffc21bd04ee72bedba08f252f73bffc45e95f879fe88d424e05b
+feb9f253e47ac951ff0ef8a51ee077b6ff70fbbc62ff42a1d97ee6acff9fc1d957d68ae0
+bb50ff60cda5e9b486d9fb2bde6dd8af30fe97c75cfe35edb50593e09e76f28affc81bac
+ff86fac49ff718ff88beff72f6b78308bef1935bff80eda507e07bdb9fe218ddb7d96afb
+af4dedd834a5fb88dc5be940d8ff92d0b47f4af229ffc189d42ff5a50cf8affb8052ea86
+febba0ff6df9cf6be0afdd69ecb7d94de50ada63ff96cd04da80d893fe2aee87d883cdfe
+5dfa15c1ec930af095c3ed1effbe11d35efb87f574fd2d98e41bb6fc40c652fe6496ef7d
+fd47f3a5d020e784d599d957fed82effcf1fe15687eecc6ad9a561e66ed9afe95cd8ae2e
+edd2f3d850c9ea94d830cbff88fbbf4bc3fc8f2fa0ec26cfff0594ffce1ff46eff86c9af
+13f257fdd8adc1e0aa38fa9ee774caed86439ae0bf9ef134e360c4dc369fffc5189bfa8f
+13ffc680fb72eb86d977ed60ff27f46bd89edf62ed36abd98de2a03fc4e0af2efe5bd8a5
+50f993e526dd3aeda5c3fe6df6c87eee8ef423e6bf3dcb9ee168dd79fba7f317fb6df2c0
+62e752a4fbafd8faa03de501ffb823fe953bc1f922fec35a9e388dfeaf0dfb61f79d50ed
+2a93f3a562edb1ff7dd85ba7ddc15186e3afd201beed73dd93e09e1cff5287f780d85bbb
+fb3e99ffb8f312fc45afd87efd1795fbbf4893fec132f1bfa53eddadcb45f616feb1d1a4
+c6b0e14cf514fe9fbff128ff56f3afff6dfbd07ce086f1cb6dd87aff68b6cc06e74bd3af
+38de0ed89fd783f9a8ff1bb6ff07edc041d887cbbb2a9afa86beed7e48bc0dc0fe86f158
+d2f279c5fb669ce27cefaaffb9e52bdd86c3e077d9bfa9c5e703fed047d910b6fe92f572
+faaff29c3ffca2f837fe50f732beed84eecd04ebafff1ad0ace028d861ddc593ff03f3a5
+c1f074e5afed74e4b45adafb87f529fea5bfe09938fb49f10a9aff7cb7c752ff80cc97d6
+6bd820dc48a5f608fb36aafe17f19fc0f879ff94bcf07bff9afa72ff5ee404d85ef1c782
+d99460ff9ff844ffaced1ed0ff0ac4dbff84e95ed095dd9342b4e305f1cd43d80edc67d3
+55f999ff3ca4fe15fa43ff6dd886bcfa77f6cc3be41ae03fd80cffbe5ae081d98dd77dca
+fb61d83abcfe9443c4ef6bfe7cf290fea765ed79b6cd5be04bd80efe2dd952f4d0841ed8
+9fc889ed3086f9c193e57dfbcc39d7ed6ddc01e54ef70cfd86f881beed78cd9dc0ed87e0
+af43eb20d8ac42fb14e05acf88ec26c8a3fe7addaf4df63efbb7c60ab5e07dd874e4af68
+b3f6923fd59df436fe17fac5ff69d979afff86f791fb84e8c160abf2bf53ed7ad597e33f
+f1209ee0935ff2c096c5fe86e97ad0efb017b6f024fea50ee599ff915ad8fa7ab3dd14d8
+4fcb09e0bc2ff9d93dfa93ff85cb8cd897ff059fffaff050e60eafffcf56ed1bafdd5ca9
+f29321fba5f688d379e0b6de3acbff19b5ff5adf20d360ffc493fe5af3c392d0a8fa30db
+51b7f244b0ed27fb93d0a7cb26eb93dc5ef011fec440f9d32ae0aafb22afd97ee0be871d
+f3abfd29bbeb4ac81df59502eed724de8fcaa5ea1caffa82cbff33c7fea56bff51a9d860
+f92693fa86ff5de270deb766f11ed0f5bf23e04bc0f994ff83f75afecf9f6aedb125b7f2
+42f564e87abfed45e36cff7ffad9499ddb84ffd032fec774ffb1d05fc0ed31fea74695eb
+ac5dc2e53bf386fe7bdb06e051bfdc84e529fe62bff279fed06cffc688d86ee812fe88f3
+79fc37ffa3cd5593edbd6bfe88f164bfff6df6ae46ceec9644c6ed76d09effaf3ecfffbc
+78fb65ff0df559feca5dddaf53edb602e6d824baee15dd82cae54edbc695c2f443ffc687
+e0a5479cff88f3a558e024d69eec931be5bf11fe9fea7adaa5fc1dcafa68ce95c634d3b6
+68bff208e54e95ea9e15dd4be687fa1a9dd87ef1b9ff05f493fb6bd999cf4bf29ff783fb
+af0fff6fd99be00294e7a40be59c1ff74dffa5e068d85ae29dd2bd70e6affb17a1e24dd8
+03cbe54ad80fed9efe63b8e58f50fe12e556d9fab5874bed94cca8e06ed9ba79ff0df29f
+d286f04c9df3ce79fba3ff33bffea53bfb06a8d89c2ffd79f9b6e764d801fec88af172da
+3ac7fa79ffcc5fdd3fff0ad05fe0af28b8fe0cf9a1f321fcde79fea2c0fb65bdf089f7aa
+37d8afff4ee513d964d854dd2eedad0ffba5c837b0d82df29cc1ee53f67fffd840bdfc7d
+cdec7fd9b936b6f031ffaf19f54cfa07f286c3ff88f47afbb179ee99fe86dd25c9ff08f7
+c1a5dd86f079dc10fed8af18f84ac4fe9226edaacd79fb27ff68cafc8954e2b646b3ed93
+0df2c46cbfff78f8d05cd90bd736f27ee4af2cfb54e686ff69b2d84396f6aad56ee586f1
+7dffa5ee79d862e079ccac3ab1cb5eed28d8f942ce05c2fe7bf269caa2fe88f683fe9ed1
+75ffc462ed6ad9ff77e65dde36b5d519c94faff8ca57df37b8fb0df496fb86cf80ddc193
+e082d9bf50e03bd91eb7dd34febb2ec54fb5f8569fd978e035b7fb23bf6aadc537f5d284
+e49538c1fc9a4fe1be57e380daa52fc0f809ff97f463b9e079d99fed52e516aaf4b6ff71
+fb9fce4aed9bd3b80af4a4e320edacdf8728fbbf9dfe31cf53d83ae59bfe42b6ff6cd8f7
+1eff93cbb371afff86e057dd26b6fb36c7b52de0af0dfabc40e9b728fe941bc7a5fe93f5
+61ff8efba0ed1f93edadff76afd06ae057da01fa4bfe26b0ff349ffe97ef7ecbff67add0
+69fad993e279edd55fff93fa5ecda0ffd8f27de09d56ff21f1afde6bd4f818ff95c2f713
+ffafdf5cd97ee01fd3ff59f721fb33db86cbea893f94daae15ffbc86fb60ffa8d036c1fb
+5ef307ffc45aee15afdd91f785fdc417c0f2d704efbe81e0a846f60efeda5fee94fba5c0
+ed7be379facf61edca86e0b179f9d27cf2adfb49cc0bd886beed27e060d3ff8614c3ee3c
+febe2bff9fedb1e376d0ef6acaf321d260fba543c1f212e0a53eff06fbaf28e7c01bc4ed
+81e04fb527ff62fbc2a5d888fb04ed3cb5eb62d835afdd7ded79fe9fd067fcaf3cc8ace1
+80d56afea253fec9ed2ee5c18df31dd9bf39e56dfe7fb6cb93d16ce6b893c6fb4bea01dd
+4aaeec8a4c93dda734fe62d1ea7ae0bf27b6cf18c84bff09d951ed19a3ff9350f125fec1
+02a9e542d888ef6cffb6f847ceaf79faa748d8fa9c65d988f2a5cc79c63895f8a453dd86
+b8e883d906dfafeb86ff7bf5c29ebed051fe6aa4f29432fe03f778e599d009ed40fe4aca
+b682ff86c8a1fe93f24ad81ccb41e419edc07cd9fb884cffb8ed27f3c10385befe62f73b
+cbb175ec93c5f24fe010fe48f8af32fe4df386d5a3ffbe94f862ffc6f660ff94c3ed09b6
+ff508bd8fe7df999f087d298ff86c0dd3cc6fe80d969e498ff64b8eb15b1e0902ca4e57b
+ffc409c0edba50d7fe05e551dd16f95bffd80ec7fe13fb4aa8ff6df75cfc24d35ad828e9
+60f282db92cbfc47e4b1d19dc7fec051ebb893cf9fe569f2d051dd2bed09d260fe85fa9b
+f590ffa52dec9805c2f29510a5d871deaefa479fd87de055d9ff51f817a5d886edaddc79
+edbe7bd9ac26fe66cb5ce122d99e2cb9e315d9529ffa86c9adeda53ce352d82bde5bec38
+b5fc7af5b010ce97f34dd932ccf979ffd03ff4c7fc12d83bf297fe3193f27bb2ca7cff86
+eb88d8a266eeac7ae593edc21ce086ce93dc9fed92fe84cd16ff40f60bb6d786ff58f43b
+a51cfd81fa60f216bfff2facf97bfeba8ce5bda2e038d867d97accf950ffafe638dab6fa
+86ff5af193c3e410ffb6fa9606ce9cc0ff32f99f29c3ff1ecef205e5c197ed1bf5b6fe70
+d1fb79affa80f4d04be52dfc13f5c275ff86f6b0fd93bfe021d857eaa5fa34aeff8dedaf
+22c65295dea65486eda0e371da81d1fb1be341edbd30cdabfe23f6bb41facc5bd93af69f
+bff232ff51fa06ca4eb7fb9abaed6de17aed26afe98ddeefcb68d927dda4fa79d789e513
+b1cf65fb45f70ec2ff86f103fb5abadd74d37afe5fed45e018bacc2cff60f1a52786eeaf
+fe61ed7adf60d0fb945ce066a5ff7ef938afdb933da5ee0ebfed3fc1e023b5ff79d896d6
+83dfb301eaa549cc11fa6df395ff7edb62e6c81dd851fc9ef5affe03fab2ffbb4db7fe20
+ee53b7cc98ff6bfb9ff448c1e06de8d18927ff85d775ff45a6d88ae07cbeffa5dd35e15c
+d2a7c1ff54fbc609d84c72acf492ffb945b4e054fe9bc3ed35e1abcd95ec6db5d64fc7af
+e813a3f625f19cce7ffec39efb51e58fcf83dcbee258d879dc26d793efbf4eb7f687fbb9
+33dd62d2ff79fabbd986ff9966ffa36bfe87c0f13ff75bff31f2bf5dc3ff7bedaece4ee1
+03d046febe6cfb86e57adb39e286d968e032d993f665cba5ff86f65bd4b00ce175d97eb5
+ff09aafec0afed04e593c5fe0ff539b4e623f16df482fe20f83a98dba565f985ffc5e510
+d85be987fe07eeb929f65bff941dff5abffb21f39fff6292fdcb6ad855e008d9a62aed84
+d879fc0bf94dff8efb37f3a3ff5bfb0291ffd80ed845e9c992eaae4eca12ed53e63ac5d9
+09f2cd47e803a6e092cc95d87afb9de51dd9a429ff9cc1fb86f0af16f2a5ca09ff93d66b
+f22acb81f26de807b3e546d90fabeb2af7c493ff19fa3bc999f252e26096fbaf57ec80d9
+9bccf261d994cf0cc7afdf76eccb14f1d08bdb29a34dfe96f71eb0d497ca70df86d86ec8
+f083e53ad0af60de33d8f2bf42ff87fa83ff6bf5bc63ff1ff0a5dd74d7b21cc5afc70fb6
+e583c4e13ca5f18bff9e51fe0df49efeb586fc7aaff578e55bafdc7cfbc875fe19f04de5
+22d48af860fec96bec38afd869de9bd643eab65aee0ffec39effbe1dfb9fc1ff6dfb97c5
+fe79df58db43bfed93e586de6cd815f3ce2fddc21df968ff5493fbae4bffa6fa53a1fe95
+5effaf36fe59f5ecc96add7abef15df73cffa5fb06e6a444d8adff72d9fe8df7b62086ec
+aee433c6afdd3ee5cd94d9b53db8e92fed9ff549fe95f730affe79f4bc5ae417c0f288d0
+5ed831e0c527c1e41cfebf98ff29f3be32dd5ad8a5fe85b7ff40afd89345f6bd90ff25f8
+3dff87fd78f6d073e0b55ee43fdda5cd45f029d8ad33f24acf9ffe81f9a263d85dfe2df8
+9effb67aff6df0a3bbd62ce5c413c0e374da39edc405bfde7ce393c1d97a01a8fb36cfff
+2ee07ed9bb4bb6f17bfeaffb0297ed2fbe10ca5ec5fe950acba5ed1e9afb9307f74cfe9c
+f77bfe85e066d879e06abedd4bd520ccfe7cb3d92ede73fb84f26af8a0ff80d89337f786
+d7b168ff8bfa80dc35c6ed6acaf409edacd010e079d293ebb31fbfdd2b9afbc14bf193f8
+73fe83d993dd7eeac291bee622b9ec06c1ff27f2a5cfba4eca37ed9ad340fe5df4af7afe
+9ff729fe84d88eff86f330fb4af81cafffb9ee86e6af61c7a5fb12ed93dd5fd035dc62c6
+f77accf493ffa5e046d7f979ff67f8d04bedc888d86de013ca52d009ffa5f021cdff7df2
+9dfb943ec2fa66ffafed15db98d202dd44ed51c4e0ad4fed17e8a4cf08ec6df3a00ffab6
+7adb84ff6ff99ff158d973ccf2a253ffc41693ffae1ab8d20af362ff59f802ff61fa79f3
+68cba7e07dd9af02fc77ef87ddac0dfab779e005cbed3ddd63d09ded1bdd46b6d89ec6ac
+d299e06dcd5ad80cf29bfe51ccb163fa25ff83f98af2a553e09f4dd83aed88f26cbadf3a
+dab279ffb461ff31f3c096ffa6fab7c63ab3fc9343e519d86ae0afdc25e09f4bc0feaa47
+ffb779fab8a5ff0cf1c29efeba48f6b788ff54e0aad93bfe4fe629ddc03ac4fb0bfe4988
+fac679edabe039d0fe66ed9fc0e523b6c993d9b717dd94ff31fb4ff73aedc194e51efa51
+fec269ebc796fd74b6fa90bce95aaffb6bf7cc61ff0cf252ff42fb2df979ff89de1aec85
+ffc19fd4afe016d82dd0fc0cffaefa86c517b2fe1d9bf2c110e6c22ae07edba957ee26e5
+4691ec86de5edac0a5fe84f708ff5af279d1f48739e1be64ed99cd1edf87d96cfb3bcc68
+da7ae5c922d887ff64bfd79cbbfb5d93fea57add9be1c007e5af35fa6ded86bede4fff3b
+88d1fc6aed3fd0feaf46b6d88ed894d086ff42afd891d880f2af1aff3aace01ece50ff02
+f5c980e4a52bed93e085da88eda2e093ddbf47c2f978da09e03ff5519aeeb6ff61bcd981
+e424b8ff9ee552d5fb4b8ffd9453f1acf903fed189d97fd6f41cffa0f804f15fb9cf52ec
+93c7a3fd0694d8f76dfbca2bfe58f373fb30d093e085fa11ff40affb60ed30aff206ff66
+cdaee51eedbc30f755ffaf68fed885d55af7219bebc5affaa735d8aff75a85ed9ee469f0
+16fe58dc76c9f561ff2be548dabf64c3f65aff93ef81d6ae42ff10c1fe7ed85bfe33ca17
+bf51fe21abf09e37d893f288ea7dc7fe874899eb933df26bd0ed5ad97aefbf7bceec61d8
+fa9e5dcbb78437ff61f6be5ab5d03fc1e97bff2deda6ca67e636cbb0ff24b6ce12acd980
+e2abcb4ee779ff1fef97e4be9ded8ad37ff9ce70e093ef15f352d861ffce92d87ceeb925
+beff01dd78cdfb8710e260f196ff0c9de0c22af907ff83e5a9f21dfba512e098cca6fe79
+f79dee86d76edf27b8fe6dd9be97dd5ae61ff4c09be6aaf3d97acbfe70d1ff63fb4ac91f
+fbb804e5c8fb1cdfc1a5fe4694f601fbaf28ffaf06feb623d0ff44d9f0abc3df1293fed9
+6bfb964ccc9fd886fb14ffaff986ee5ae579f196ff3ff7c00affa0c1f45dd8b652c82ffe
+51d904e7b525fbab43d8b99bff85e7a245f017e041cef559a3f08cffb045c1fe7dd81cdf
+86c6fb3aff89cebf52cbba6dc4e064d4ffbf4cfb08bee02ed812dd35fac19ae537b4f260
+fb32f7a3ceb278f166ff8404f7a542e911b6e49bbdff9fd86af7b470bef264fb0fc9afe0
+79b7cb64de77e198c96be575beed931bfa4c99fcc53195ed0ed9bbf510fa4bb6e09647d8
+1ad0a5c3fb42e588ebb46cdd60ed14a9d981fea5f98fc4f26ffec279df86cafe61fa34cb
+b602fbc67efa99fe6f96eaca4ad828e5a5dc31edb9feab48e860d9b3ed5dfda5f520ff3f
+9eeb8d52a1ed88ec5ca5fb7bffa5e9870cff79f8cd18e08dd8bc69ff3afb12dd47d1db81
+e0c097f35dcb1ced53e538aed943ff31a5d88bdb86fa20ffd839fea8f538f24ff69ffe0e
+87fbc4a3bfe778efaefa79b0ff8761e4c2a2f161c1ed91ff6ef83186dcbf55d025fe9ef9
+93befe3cf202e64ad918ace09f38ff4cf71bbee98ae279f2d76fb5db50d22bd9fb14abfe
+93f381ff79f99d4a7bf5c493f38618a0d832d978e386beef04fdc2f826d96dffce44edbf
+51caf2aac5dc4e93ffad47fe04ed93bdd89ebffc884dff28fb52afff81fc7adb86fed079
+ed95c4e64dff2ded61cdab73edc1119cd88bd9ae36d8afe03bda54ff06d94ae021bee033
+d3fe9341ff23affe2edb4ddf9bbeffa40cfe91eec147d22edd65e0a5d093bff184ff45bf
+ea83d19bed8640d414fe4b97ed1dff87f491b85ec3e073dd5bc709cd63e5b1d905ed29af
+ffb7fb62f297fe47cffa68d0b038d884c4e52091d9af79fc932afb429ff2c062ecc59cb8
+d150e57aec2faceee1b0d093f1d931e6a7c60bf3b624fac015fe7ff393e07cb6f351fbb2
+6fd9fa4dff1afbc386f85dff7af286cd66ff82cffe5bf3a41fc6dd7ed0e579d886f2c403
+e15ad3ed79d960a8f380ff7af7c350ff2cfb54b8d293fa11b5f35bc3ffa7fb9ec7affd68
+d8a5ca0dc1f186ff43f61bb5fb9cf4b621ff88fba0c0e451de7bd9b908b6de952bb8ff79
+f496ff44aff1bff501e53fc1e07ebffe0ae4b023f558fb7ff709ff60f6c76da013ed3dc2
+87b9d045eda4cb6ceb59a5df71d906cd58fed50ee1c42bff87b8cb7bed88e514bfd399ea
+21b8fb9db9f2409ed872e8b6fb66f7b850fa0afeb36afb94f62bb2f920ffcc04e0afd61a
+95ed7cb2d787fe1ff062ccfe2adbaf09e563ed5add2cb7f33bfba6ff36e59fd591bfe062
+d93cd8eec156d038fe65cf0ced3fff8af76ffeaedd3ee0c10ddba5fb804d86ffc6a0fe61
+b2eb6fd97dfdd079d92cdd9ecb89d8a521ffd8fa7cb6fe06fa70ff84f72fff85ccff48f9
+bf9eedb54095fba466e65aed21e4b03edd61ff8df129cba5e439ed17c9aced01ffc33c90
+ed0b9aeabfa5cd3cecc176c6e962c0e0a576fb9843f0bcfe38c0e50dec98de7ad9a457e4
+79ed93cdb725ff84f7c881da78e37bd9af06fa57ff2ff87eff934ca5f27edd79f294ff83
+d0adeb4ed512ea7df2ab57fb66d416c2fed89749f214d0fa1fd795ed51a1ff87f26cff5a
+f23efecc5e934ccdf479d893dd23d860e0afd90e95e59133ff66f6c2dd27bff593da82fe
+66f3bf7febaa47affb7af470db93fe68f886d95995febf54c4ff8734ef60ffa123fe499c
+ff8c4df5d85bc7ff8f60d9a3f259fdac3ec3f82fffc095fa4cff3cf8d86be0a908ff57ee
+28d051edbf93eaa6cb97ed12b8fbc517ffabe723d84ac6f91c9be085f260cb18fe93cdac
+f288e09d25edba80e2a24cf05dff27bee70cc7a7ce17e095de79a5f2c7fe9d28e447ee5a
+f388fb9c3ffebdd862f4c6ade01588ff7fd844ff04c69fd20cffcf2afdc7e352d90cffbe
+48afdd2ee579fad017dea8e05ed4fb8de080d0e585d9be0fc4ed9616e4ad2aecc207fb70
+dd81d0ff6bb1e58aed0fd0bb9de075afcf41ed87d3b79ffe88f76bfe3bd21cf24bafd2e5
+72dd98cc42befe86e5af5abffc3bffc49efbb886ec1fe44cff3cf7c168fed85fffcb86d9
+88cefb69b2f938feb664fa1dc1e40bb638eabfa9ff9fc6aacc14edc55d87f8b31ae14ba0
+fad74db6ee9ec9abf941fbbc59abf2940284ffc19fce63fbd77dffb1c944aff574fe37f3
+af12cb47f216b8fa39f3a5fc39cafe7ef9cf79fe93b8d819f85fbbed03d64aaafc77f521
+c4fe0df395c3fb4af514c0e021d8aeda79fe6cc2fe8745ff31f96df6a256f10ffe9fef77
+d9b222da46e061baff9fc894da75e9b30babf328affb05f5ad42c2e27bed86e5c38fbaff
+69f97bdd88fb63cf1cf83bffba70fbabdd27cffb86fec35a93f2cb19fd5ce67add6eec99
+e04adab6eb9343ed28e0a212f0961ffd9dee2fd891d87ddd9ffeba99fd71afdf79d86add
+af52ed1e9edd3ae54eff9fc1e826a1fb7ffecb34d986df66b6e887ff1eafe27edd6ea8ff
+955bfba5c89de403f3bfa8d093e004d9c398df65d82fe6c06afa79ffa5f033d05ded05af
+fe31d3fb52c5e56cc1e067dd97fe12d850d324ff51ed40afd8
+ >
+ >>
+ /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 <
+7bb6c793d8a0e14ddb04d951e02dcdb901eca3c572efa5fe78b5d86adcfa3ef584d3b938
+f308ff45f9ca7ad989de80e593bfda7debc76ae0bc679dea874abeecb83af378ff9accaf
+f175d8f36bfcc2a1e5018ebef786ff51ef28d44de122ceb819c974ed86e4ac64ff9bf786
+f29f6bf95fdd20ceff4ff5cb82e0ab3fd8b352dd16e5c484e25dd8fb6087ffafd14ac1fe
+d8b34db7ffd15cf7a9ff54c3ed3aafe070c7ff7af29cffdd38fe4cfa13b0ff81f77afe93
+f95aeea8c94de5accb1cc0e527f2ad10b5cf95e855e58dd8be9be06db6fd3bf759ce0ffe
+60b5ff41affe9238f8d05bd8fb9e1189dd93d9c049fb0293deaf0ecf52ed3dcdaefb579f
+e06ada93f978ffbf98f757ff93f65cfe3ef9be38df4dcd37ffafd295c0f67ab8dd6eb6fe
+11d0f97affc86bf88cff27bffe933dc1e99530eda5e28328f27be58e3cecbf0bcba5fe78
+b8ff26f4a445e423d85188ea9dcd7cedd028e0a5cb21dd79d886fb6afe10f468fd5199ff
+7dc5fe87ff02c1f92bfe50f128c2ed12d6a7c59fedadc3f421d19fe026d6edab05feb027
+efc3fe57fa20a5e487d8ff4af886ffbe95ff60f227e6c31efbb93bb6d89442ed6bd988d8
+2ddd9ecf79f1d186fe7fd95ae006fd40afe00ca0fb38c1ed65bee82193ecb64cb7e09f15
+edb0ff0dcbf95afd12bce9adfb0ec2fb9e50f366e430d0e580d886dfbfa7fd83effbbf28
+f4b63d93fbc042feabbfff0ce636dd96d892d981ebd062e037d84bbcee6099ddafc993fb
+64a2ff72f203ff4dfb349ce779f280fba35afbcb7ae590d251a8e07fcffe34f679b6ca99
+e344eb18afde81d870ffb37aeda3ff13f3c3a7ff0af16ce5ae14fbb32498e501edb8fb79
+efc3a5ff67f1c357e679afff46a8cffe2ed9a5f171f9cd67d879e06abedd76c9ff8a43cc
+a4e078cfff86d891fa9f10f151fe14fa5ac9b60163a9e479fec2f15297e970f04789f2af
+cf7af75bff27fab809fb9df5afed78d7abff860dea5bcfafe536d097dd90d886e0bf52fb
+0ec862e5c14395de31ff78f9cb09efb970dd5eec1cfd2ad5b27bf9d036feb6ee47cef504
+d187e360de2fbccb9efb4cffbf5fe6c6ff6dd8a52899d89352ec1fd87cff93c6fc2ed89a
+f774b2f279fe08dc43abfc1ff6adfe3f93f19a52d8f479ff22f12fb1e51ced4bbfff94cc
+89d995ed32ffd9cfff47d80687d9aff311d19ec2de9b61ffbe1ee9b9dd6093edc256d218
+94fb24f23cc3fb94ff1bf252da7afe5cf91ef368ffa6cc93ffb618f5afff65f39fd8399a
+ff932ffbc197c6f28fe56efec14e93e09f0c93dd9b5abffa43aefe8cf95ced3bafdb7ad2
+f38b49b9f257feb6f435ffcb88fa97e42fdb09b9f27ae502dd4fc0e05ad37affc682eb97
+2cd3afff1cdaf7bf03dd5ed9b9fb61c1fe7cb0dc6ddf36ec63d179e052931c9fee93fab9
+31ff5db6ff37f91afec72ef1b08745a4f2cf40a5ff84f8cc65debfa4e061d880dd87fea7
+ed2bcb84d897d007ed42dc50edd183da21d8ae0cf1b3e54bc4e0ad15ff43b961c2f408ed
+a9ff6df3b8fb2cfeaad96feac921d878e080fed01df69606d8fb931de077d983e2a914dd
+47d060fa9fed69afd256fb87ff12a8fb93ed9e32dd53caf27de665ccb23a88feb6ed9749
+93df9c43c5f703fb5df5b6ff2afbc2afecf8c65add70d0e681cbe463d878ec51a5e05dd4
+feb4fa169ffed821e44aa8ff8f53fe77f730ed46d6b60ab9dc94f03bfe59d978fdaff797
+37fe6ef986edbf73fb67aff26cf891d29ed8ff37addd63d815d749d860e086f134ffb867
+eea0ff03c6b686e554b7ffa53be9c4a5f90bfd4bbff186fe92f2c14abfff27faa0c4d961
+efc93dd91acef587fea64efa0ab9ef6efbd7a53681ffb5f809ffade079d59bd8920ba5e5
+9e0efe6b3baaf323ff45a7fc1c9bfb93da85ccfb7ef79707e079bfe54a88f195c4e00dca
+ed15d99dcba5fe79fa9cf66fff62e5afee85e5c41587e1c0a5e64fc83bfed924beff0ed7
+41e052ed04b4ed5ac0fb83f6a4fe7ef7af1ac1e0930dfdbe44caaaf535fe62facb72edc0
+86ff5ece93c99eff65d832e00ea5fe81d8b46eed1d94e59f6cf985ffb963e302d9bbd89a
+ff47e5a81ff1c5d814ea61d088ef27ff4ff239fec3f97bbfdd8ed8ffcc88d884edc67aed
+bd4af209ffb112d93ccaee54d7ff69cafbaf38fe6ef5a57afabf50ff07c2e432d84de01e
+cabb119ffb2e97ffbb47ff07cf9cfeb85ca8d0e87dd987fea6f579fb63c6ff9331edba24
+c4eb38cdff9863f7aed67cfb88dd77d894dea529d94bfb0faff22eed51d926e9aef373cc
+e63ade14eac24effbe37fed024e4b34bfac193ff7f29e06bd880c7ff8652fc8acbabf43e
+bfdc93cd7ee0b361d83cf256f67aba14fb60f7a40bdb53ffc988e0c163edbbff70b9fe89
+2ff2b604dec192d959ead543a9ed88e059b0f293ff79aff86affd94fc1db5ff3d081ec6c
+f21de286ed9335f861edc52ec1da8ae49d1edcadcf78ff6ab1d9875bf2ca4cdf2aeb53f1
+18ff4ff20bc7ff82e49ac2dc6ce0affb78f6c05894ffaf5bf786ff7bf6af79d8f25aacf4
+c27ce0a42ef256c3fbaef515fe3e9ae0be9fed2dd980fea25bf614fbc025ee86ff96d42b
+e070ed9ce02fcbf386e59f1fea3f9ffa934ba5df299be5acd082ed6bfc26bafe1c97ffc5
+2afb7bf66cc816b6ecd041e0bf79b0ed74e523a5fb4db6d893c3ff02fbca88dd1894ffa1
+20fe45d0fa7bf350e297f204fdbed809a5fe79fa9ad1a5e584cd8ce2a042f3ba5eff31fa
+a015c1df9a05fbda20ed93cbb653dd32d4fb0db686de8e41f708feafcf9fee8635bfeb92
+cff607fa46c3ff59e61ec2e487d9a455ffa5c917e265feb1fbc53fafff6cb6fe38d8fb7d
+f5d425ddb6fb86f6c313f951ff3cd49aed79caafe36de793bfdb23b7fe86fa3093fcaa23
+c6fe03fa93c2df7ac8ff32fa4aa1dc79b5fe50f3bc4be3b881eda551e90bfec52dc1e093
+42ffafed3ddbb00fff3eb1f730fe69fbafce1bed93d07ad8ff873dfec579b9d563ff07fa
+d08bfe9560edc6ff16fbcd97d86fe548dd11d1ff9d5fde79b8db84e26aa5f279b5fb4aff
+31edafd26be9b582efc402ab5dfed985eb24d0ae6ab8c751afff5ff106d85bedb17bdd86
+b5f84faaff5dfa3fd803f34b9fffd340df9ec2da6bed88f457d8b54bff3ef60ca5e588f1
+bc55eb20ceb079d3fb73f7cc11ffbf94d8b658fb9f4df8cc7be077d085e7c293bfdd7ad8
+9dd725ee61feac56eabe4393ecd066e5af50f49bc1e19e41ec17c9e39d4493eabe51ff32
+f295ff8bfab142c3f221ff4aa6fe25f8bf0ec5e086d896d079fe08f446f9c03393f2dd87
+bd0ecc59fa79d9f704fe9ae083d07be66eff35cffe2bc8eb18e1cd0ddd82f186fea5c3e2
+5f93efaf55f40aff47d096e06dea9fd2b895edd65ad916c9f784fc67d8ff0999dd32afe6
+69d93afe88e577edd5a526f34ffb1fff38f261fe5afb05ed55de91d880caf902feabf323
+a4f21affc335fe4884f2be7df3a52cfbb1dc63a5ed88d85ecb1dd653eda5fe7bd86aeccc
+63d87ade96ff37f506ed60df89cb9cdc7bffafe54f27f8d895ffa5c0ed43b4e587ee16f9
+35fea4c894e165baeda162ffbe79f2afcb20bcd062fc18f7bd05ffd77de5a5befb13affe
+31f519fb52bf86fb78ff983fe0a5ee38a7e0be52ff5ec2fb86f1ac25bfff1686fcc786d8
+93da9fcb86d91ae0afc785f872ff10e549b4dd69d872cbff81d987efa4d8b8d924fed74b
+ffcf79f101fec522f976fe86ed7ade87d804e493fbbf14f19ffd44ee88d26dc9b1ff20f7
+51fc24d859d878ffcfb362e548df1595ff70c848b6d88adcaf44f01dabfb8c09fed89557
+fb9f53ff9efa47ed8fdd79cbea8738feb828df62eccb87d880e176cdff26afe930d1feb6
+0fc48dfa6ef6d084f29a2ae060d2f866caafe75ab8ff14f15bf76dffa4f59644ffbb38cb
+b1f295ff86c4f535fcb25ce02fd152e41288fbb067ace570bbe857d878e09abfda0ae0a5
+fb24ff6ef75bcb378fffb83bb5d8ad5bfba2fa3ea6d893d983e7adf20bed9ffb1af491f9
+71fec431befb99ff2df262fbd883ffcd45e5d29335c2e327d2ed33e077d9b12fb7fe5296
+faaecb59f689ffa250f161ffa5d839adf2cc7bddad53f27dfed948e528afec0fd9bfa4ff
+0198df4bf392d83bdd9fc6b605ea2dd879ceec68dca3fd297bda3bed20a1e0bf0deda5fb
+7cf793ffc133f0db06c5f91c9effb7f44bff3b93f6af42c7b74fe6c1a4edaedf72da94e9
+01ffc01aea62c0e57af031ffbf6196fec15286e1c633bfd97fe6a5f21ceb61d0a5c602ad
+e55a95f7bd60f2aff780ff86b6c793f610ffa0d93be5d220e06fdc7ad835c6fa21d9af0e
+f39ae08b07ff62f893d8af26b8cc95ff69c5f962fe38cbb0ed7efea70cffb365f978fed0
+8ae056fe22a5fa12f086e5c2a6f979c0ff4b92fac841bfde04d84aedaf79bfff945ac3e0
+8820a2ddc3afe56ccffe79f4d8872fff1afa4ef429fe86f278e4a8cc95ff11fb5ecbb61a
+fbc54193dafe4badff9e06f34dd864df93bcfc53f797ff3abfec0ea2fe4add13da68f002
+fe5fccb67dec6af3ac6dee9cff11fa99f2b686e47bfbc586fe5bfac09fed1bcf42ffe486
+fc04d8bf43ace093f086fb46db2dd0f279cced2fd94babfa7cef8ec1e479c95ed24dfe19
+d19ce868c6e66196ff719ffe83e668d4fa4186ecadfe3ff2b4fb870ff150ff2799d9099f
+fbafd48fc9b681e5af52c4d950fe31ef5ab7c7a0e46eed79e1aff229c3a0e066edcd93ff
+8bfbc13dd90ce07aed72d0fb6dc2e085d87dffa5ca4ce6a5f23bfed826fbc10affb945c4
+e8af4bd001ff5acf30ef46afda2be54dc7a5fbbd8cc44fb4f17ffb9dff17d559e273c8ac
+fa69bde421a2ff92f2c53adb0cb6f331b8ff9cf8be93f15dfe0bb5fb2ac1ed19c4f059ce
+a9ff189ad8f52bdf6bd772d83acffe83d99fc0ee58ffbe55ed69f630fcce10d6fb9925f5
+92d886d1f64afe03f799d32fff86e95afa15f6b558e02ddb0fa5f281ff9fcc2fd9af21b5
+ff38fa1cedaf2ffc9dd86bc0e4925bcfaf79e1c87ff29364d8ff78edc0a0ebbb96c2e86d
+d785fe79eb5fdf07eda0d961e434de88d87bfe27b9ff1199ec4093fbbe51e0179cff86d0
+ff62afed3add09eb43ade084cff279affe7fb1e038b6f72694cbfe61b7ce93fa09ff7ff6
+a55de8af17f96bdd86f2d00ee09dd85f93fea53ee0c177e265fe2099e086daac44fca5cd
+09bb93d788c240fe7ced86c9fe6be4ae4df4befe60f3d686d89bcb79dfc089f324ff961a
+f5a7ff4df8b252fb18bffd2fa8d99343f61dff55fb05ffb9ed13dc37fe83f46bff30f7ad
+ce79f351ebc19fdc6bf4cf83ffd661edca79fdce5be59e46c4fc88d87ffe93c4ff30d9a9
+4fd8e451d1f76cfdc772d8f24cb6ed11ff50c0ed90dd29edc932fcd17eea39cb2b95feaf
+42ffc0ee48bff885ffb50cf2bfafec38d862ffc267ec7ad9fff24dffdd95d5b661faaf46
+d024fad893108dde9f4ff167f541fe5cf854ceba51c5e072dd05edbe27e6c3a5e054c8f8
+1bfecd7ad993df80d8a43e88faafd19fc645d4afe0960dffbe24feb508ed43e5be55df19
+b5f707afdd48b5f624fbade502d954edaf5bdc77b6f725ffb703f1a329d9ac0effb57ce1
+86c8af7be5a444cc59feb67ce09649ffbc93feb0e05bc7f28707d99ee119d84cedcf9453
+f779ffafed15dfb422faae38cbb67f27fb0ef3cd20e094edb8863affcaf733ffc703d990
+e49fd909e279eea9fe3ffac194d882fe9a66ff80f39a61e0ab5cfaaf3ab2f26af8b6e098
+50f61fffa6fb2188fec75df1a1cb81fa92ffa52ffeaeee74c79efe87f283c0df7ad866fa
+73ff2acefb0ff5cb69e2c25ffb7acbff62f48bdb46fb03ff3cf7d328feaff894c705f263
+f7adcb02e463f486fa20a2e6b879ff69f37cfba160ffd607ddc02b93f983f4be6de59a19
+eed8bfa4e151abff79f65affc5eda55eb6d862affb7aff19d07effb6fb15d886d8af51ff
+34f260d1ed38d807d2f086c6e509edc6fe18cf4ded23ffcb86e279d87bcbed489fe686d9
+34e058d870ceed935cc2fb4ce538d810e33fa4ff14f196cba5e57ab9e4a940ffb085dd94
+e6189be03bcf9fec84d895dd79bef061db1ae56affa4d922dd61fbabc914d973edd44bf5
+cb31ddafca28c3e53ba5fd609bfbcb52d83bcffe56ddfd9e44f566c4fb73d8b701d99e17
+88e0c520f292e85acca5ed67e09746a3dd60e90cf286cea5c2e411a9f68efeb942fe2da3
+ff90509fe57bff93d865b4d949ef0ee75dbaf9d917fb6affa6f61bfbb805d8f93099d97c
+f6b9ff6ff9cb6cd9af42ed18c2fe3987ef96d715fe37f46dbefa7cbefe20bcf936f351fc
+1e9dd882fb9ebad84cc1fe81f29f3dedba52ffb685fe66a5fb9345ff9bf570bfed80e4c3
+46a6ef93ffa207f18c5cc9ff93e62bb2ed39cbfb7ae5b2f246fe86bffd13baf92dc0fc1f
+f4b3ff82f97aff9ce31ffb4f93fecb5ae0669fdd7ee7d06edbb6f937dcad2efac20afeb8
+85ff9cf5328fb3c851ecba7ac4e6618cffa465d6ff1ceba54795d8a932f386febf79f955
+98dfc11ffa71ea93d859cced4eb3ee65e574cba9c593d0afff3df2c252ed1ffb77b0e02d
+d0ff80f8a0cd32e513bfe005d0ef5fd910b4fa32d11bf3affe0be279edc779d8e6ab04da
+5aff6fc1fe64afef52fe6cd795ec42cba3dd50ec7cafd363ed33ca26d0be3faff488ecbf
+4497fa24bfff0ef7a648fb14e96bd886ebbd74f1ac68f3cc3cd886d0ff5ae5a5d009f24a
+97d8f23fcaf483b6cd67feb6f023fec15cde1fe0a3d6b1f26bffa5cdb649f87affa92afe
+d80cd99afb52ff14ed61dd6ee3b30aff86d399ea0fbfed934fda22e57afbc596ff77f3b8
+87e580fecb86dd94fe7bdc87d252d92db5ff347af9c682ed87d911a8de28bfd51dbaf90a
+aeff6af674ff98d93cffb993bfe593ef5afcd26edc27fface579d5ed74ce60c2ed86cb98
+fe09f75afed240e0c11baee56dfd01bff027fa6bfe86c1ff2aa8e1bc0be54ffab003d979
+d587e49dbff658ff33fc07d247ed5bfec19edf0be4c7a078ff88f12ce080da98fe0cf5c4
+79de62b6f35ac5ff9066fec1aefb62d8af48ea5ad89f41ff1ed0af2cff56ea61cd37eb6b
+fb8afa65c1f3dd419ffe21b8fa9cf577ff7bfb9bdf79cbe487d825d3af05fbc859e00dfe
+4efab0e0a201ff5bd77bd905ffaf47b6f494ff23bef33fb9cf9fe11296ff81fb9efe4ced
+afda61acd880de3bafed79cbfb5c93ff9bda7ec8f388ff60f509ff4694d987ce93e79fdd
+8fd801f231bff19262f6bf43c958d2b1f75ace86d8a534fe92f8cc31fca540f1d807e145
+99ee09ff88c1f72cfdc46cbded6de5a5d30df7a0ff82f21dcbafe512a56efbd266e4cb4d
+d838e1afce4bf23affa533fa55f17ae6c288acf779f2a5db861781f8be86e99df363f0c3
+84fbd82bde51b1e37fff75f048c7afed60cf27dd79d8962ffa88f74fff99c5e321dc9f13
+ebc049ef25fe3fa5e42add81d0a6c3fb0eed62d96dfa26fd80e688d9a553ffd01deba8f9
+95fe18a5e12ffa49ffbf51e7149cdc7de4be60b7f779ffcb70dfa5f218afe087eda5f850
+fbc179f1b666d823debfa5ff4495fecfecbc0cf3b07bff8bf29806ec8fc1da67edc683e0
+9cfe38f24ce121d9c43bc6ffb6d937edc940fb1cccaf39e01295fa7dcbfd59d81bddaefb
+63ff38b6f893c2f50effc09ed21cedbc11fb8af762febf7af8d06cd886e0bf5cfb51b9ed
+66e579cbafff1ef286c65fcc3fff6afac239affe86db05e561c3ff79eeb6e57aeda5caaf
+ff4def27d0fb9d3ad9af1dfabd3acf9eff4dcd10d836de9d01ff4ac9fb89f49b56e379d8
+ed87269959ffbf3eed1ad94fc9fe61fd10b2f81eafff08ce5fda95ff80fb9f6cfb955df0
+8dfe73afd877b5f96bfeb8edc55beca103ee91fac12f93eb83c9e558ed35afe16ff142fe
+a5ca6ee0b541b7d832f1af379ffe93f516ff9bcba5f820fe37b5f1479fe051b6ffa5f6bd
+9cdd18ed97e556d872ffc188de3dd8a70393d919fb6df184d495fe9317c2f384eda4c754
+fe79ed68dc7ef294ff62b9d98ee89e14d947cafd03f7bf39b9f8e0abcf7fdd88fbaef66b
+b6d894e679d09add6bd97fedb610b8d533edbf06c2e224d750dd13ffc1e62bd8a24c88ff
+af3cffd27ae0649affd11edda802ffbea3fb52d081df8ee756fe85f49eff79dd68d6fbc2
+1fed53d08aed0edd83d88cc8ff7dd6fb78c9e739d812e25ac4fd67d979f32defaf3afb9d
+f362fec6fb61d05ad82de009d977ebafff51e52bff80f294d928faa8fe45e47ac7f450fa
+38c1ff80f8b878ddb064ffd6794af22aeb61e5c3369fe523fa53c2ff4bfb3ef5a6fe45fa
+a5ed6adb52ffa8f470fe7df793f2924498ff86f2b4d91fe5be6cb2f433ccf15da5f652fe
+8bd069e07cd921fdc107aff21dd351d903eeb2ff0f86e4b074b7e561c0fa6dff40f3ae02
+e92ebaed0e95f47dfe93f72fb1ce0ffba3bbcb7ae0b80db3e48f4bbef094ff88f6a8ff5e
+f936d87ccf96d86add0fe85dd5b804b6d793fb1ba6e082afe45aeca92fffc225f2a518fb
+da94fdaaff1486d8fe75d09ef12ab4ed93e5bc2ac3e086d827fe86e578d843dea5ca32e0
+57d0eebb52dd0bfb6af186d8f919c2ffa20fc0d96de3b0d940f716ff95edaf5affc67ddd
+87fbade59344a2e9cb40ffc6f72fffad45d0afe166dd9dc1fa619bffcf60dab545b8eb86
+ffabc84aff1cf94df588ff27d8f29d1fdd40e5c36abdcba2e35af105fe4bf9afcb88ff85
+f69bee2dda5acdff28bbfe79d81fccee6c97e086e6c86ab602c7478dbff8af0ebeff5dac
+e061c807cd63ed9e18ff71f3a2cb16f89cffb70efbbe9efdb405face7ae89bcc48fe349e
+ed9351e6affe36fb981bf2b787d875cc32f7a4d860fb3cedc32f86fcbdf5619aed920595
+d87be096ec1aa1fe2bf65193e0c242affc25f1a5ff78df27db6ee995dd80d9a2ed5acab6
+36ffc167fab30ffb40ee1bb8fea5dc86e09e36fcbf21dd4fe187ff85f37494ecd007f190
+fe9c5fd8fb3dff4f9cfeeb84e3aff1d35de087ed44cbf97eff88f794ff84fbba5adec153
+eaaad02fc666e561ed1cd87fdc9139fec029ffb975c3db61fbcf88f37bdd87cbff70c6fe
+59f292dc6be52bec89d9689affc64ee018d8f95ad9c0fe4df30dfd87faca71d982d3fe1d
+f286df8dd66dd904d25cf293f709d75efebf21d0aafb7aeb85df9fcd71e085da8fff79ca
+47c0f36dc6f15becb679feaf42c3e00dbff659a0e06ad945c6fa0db5ce7ad9f13293ff52
+fb2999ff3bfb93d9b703db31d84cd91fd851ccf1ae03fe89f45cfd87f199d884ffad4afe
+c4f062a9e07bd9a5ed06e4b525dd43d807ed4aa5e0299fe80afe4cfbc396bfff0cf6c020
+f2b879ffb528affb72b5e9a0cdb93abf4ef2afff37b6cd9ffe09f950f59ffa86febf50c3
+fe84f2379bfa81e514da53f706fe39f3a5fe51d833e591fa9a2fff0aafd87afaca15d8f9
+a368fed631b7fe3ffba5f4b67ce98af6af09b8d243c1d97acbea7adac41bf084fea9f36d
+feb5f079e52c93fa85c93fb6d979e01eff3aee52c1f29f1987d6fb58f30ffa5dfec083ff
+79fa86ff79bfef62f9c97adda5d2b613f247a6d781eab065de9ccb6bfecf3ce01cc75aff
+79f7db93d507a5ed7be556bdcb79e3ba41b3e0329deda63ce08fc9ed48d869fe8ac7a5d4
+7fe1b724bbebaefb60d811edafd0a1fe30df469fed9327e6c14997fadb6ecabc1bd436ff
+51de2fc5ff87f8ed9f0cf4a521f254a3faab37d157c0e09c3da5fc8fffc347beed94ff0b
+f9a5d091bccd87e029d9b6eaa013ca96e080d7af4af13dc7afe045b6fc10d8af39fbbe26
+f077fe86c5f831fe4bcefe06fa3aeebe85f58eff93ed2cd8a716ff61fbc74ef813ff82ee
+af23ff94ed69cefb1ae5ba63ff12b7fe9ff143baff30eeb44aff95f78801c2f27eff6dd9
+66e582ef8bffbd61ffce77fdaeed8813b0f27aff93ed9fd681fb6be25aad28ceff70e4b8
+86ffbf4cc3ff89ee9613f7b8dd0bcf60e49ffe2eda71d7b647f55afe04f7aaff65fb40f5
+b0ff3abfff27f594cba7ec139ff6d17ee488ff9bd055ff92e55db0e07ad899dd6fa5e486
+d8a50dea49d860d77bde65f2c09aedb67add89d862e033fbd986d812ffb679d85af3cc93
+de7bd002c6aaf479e57dfbcc72d95cd2ff9e43caa5e243fb1ec757d104f2d83ba6f306d9
+4cbdffd82adc62cc84da15eda5d01dc0fee063bedb39fbcd06e799df61d926ffca7be974
+f983f110d862e5aefb36e79cbfd894eb8038c1e094d07dd86ae5a552dc67ea1cfe60fbcd
+8e22f251d621df6bed7ece34c1ed07fe53f31afbc03cf761ffcf78feb6f202fba5fe37da
+4acb1fe53bfea2f5aac78fc147f9a5c830f786ffa42cfb4df66aff86e024db52ca1b9fe6
+12eeb532e0afed25bef494b7ff97f7b36993edc75ae07dfbd0579dfc93f302fe5afabe3f
+fe99dd79a2fb4893ed9d66d978fc12f67fe5a652fe2fd74ddca5ff7df7c1159ff264ff23
+fa43afd8fa890bed50fe22f285f9c884fe9dd986debc4cffc0affe70f5affb03baf79fff
+6bd3a5c783e188d994baed2396dda72899e3af44c1e67bfb73ff88efbf22cf4dfe19f2b7
+6fe562edafd20ec0e083d9a7e83ded5ffbc099f2affe58fac179fb6cf684ff87cd61eb2a
+dd4ce5c0fe2086ffaff13393f5c240e052d873dfb272e58cf249f712d7affe17b9ff4aef
+c593bed646fad085edb2ffbe27b6e03b8dffce7ed888e07ac4ff5b9ed4ff7add88e05bcf
+18b3e009d253f22d9ded6bda369fe5933fcba5e048da1db1f22effb647f827ff4cc8afe5
+39fab8ff6dcbf38810f0a5e059d8a85cff83ed95dc7cffd006fca143e497f040fec215b8
+d89eceb40ffe43d981dda54edd9ccf19d851dd0afea5cf7aff9f37d7ace9961ccaabdd0a
+e586bfff87f8c02dffc305d8a8c7f07ddd68c9f282e0ae31fe5af491b709e09f1c8ee286
+fa55cbf3bc4ae401f34bb3ef1abbe72fb5c835f9b9a2ff96fc6df67bff92cffe01e190ed
+c10ac3ff84f365ff94fbcb57d977e9cc6ce0aff266fe7ff18ad953df2098ffd3b927b5f2
+03fac49cdd08d652ea37afdd82cbfa67ff6dd0b079ff5bfa2aff76e08bd86aef28bfff0c
+f25afe95fa79f0c142fbbb18c3f281fb52d0f965fe75ffafee22a6eb17a0f24faaf980ff
+6096ff2ef8ac40cf21fa95d9b51cecc6ff66f5c5fb58ee96d9b11d86edaffea5c0dd6bd0
+fb74f554fe9ccd02ed49e43cc7a0e73ad965afd774ff56faa6ec4dd915d8b637be77f693
+fa139ffdc2029fde15d856cd11ed84fbc34a83fa95fe80d686eb2faff46bfbbf93f15fff
+2899dc08b6f824ef93e581c796f14ef937ffc493e385d693e079e731cbb488e475ef90fa
+50d80fde78b7e641d2bd5a89fbd267c7e57aceed64e036d01fb1e586ed9efebe79ed6bd0
+ff863aa5d849af37d8af06ff75d9fb9b2cc858f914feac3ecaa5e56cee79ffbf8ad0a9ed
+20c5a5fbbb36edb626d97ae068f599fe7ae48ff1d60ee05fbfed4186ffd070fb88f679ff
+add05dedafe034db50e53dff54c0fe7be6a51efe46e4a9bff27ac8ec88d855dd34baea0d
+d0a8bfeaaf03fb5ff767fd3cc9b9a8f84aff13d93ed39be46dedaffe26c7a4f22bf8d89f
+3cfeaf33fe9b1afe86b6eafdc979d901d85be0b00efb3fa0deb3f079fec7f379fece51ec
+bf60d3fb8ae094d87ce099ed0cd6b71dafd861fb10f766fe5cf20dcaff79f7c687fe1eb5
+c92faeee1cfb4a9cffc2abff79d8f1bd51ebafdb36e0a130fcb80dff8cf5a9cb79ed8ab4
+e05dcd2adac49dbccc16e652fba54dfe6dfcc2a5fe74f761ff2186df9cd0b72eebbba4ff
+07ed8adb82f3a4b8fe01aeffc14a9eef7aff86de9711c2e081ccf45ed9bf52c3f66a9d44
+fa59ff72f333ffd996c1f85efc21e0950fa3dc619cf89339ffb854f124ff4ff228ff86f8
+5fffc5f72aeda3d893cbacd893e56195e44fa1ee61ceff79f9d051dda5bfea863bdc23e4
+a52f93fb9b26c0ff7fcaf377dba1d84cc609ffb61dc9fb12f293ff80fa69f67ffe89d82e
+e0bf1de19f04f352d79edc8ecbf441fe4bf0a5cc14f268d85cfb25bfcd65e07aedcb2c88
+f5d85fe00ccd68fcafff4df10da5e27ceda5dd0ad8eeafd095c3e8a4d387bb4ce904da93
+cd6af7b6ff26edc017c5e5a80ae672d683cb90d8b843afdd924a94dbb53fff50f327ff4a
+affad31accfe11dcad46edb770ffc461fe08cdfb93f85bb9f4ca3fd8f79450e604bee540
+fe6bfa93f17ad8f9659fd875d848e40fe034d85ff3a5ff85f7b47beecb71e01ced39fa54
+afd97ae089ff53e584dc98e57caffe4cf726ff5786f9d89517fbbca0edb539e47dd993ff
+be43ff2af989ff7a2ff517fe3cb61ffe61f5cc7bf1c043ffbe30e55bd77affa5f26dd0f4
+86da9ef709fe61f39afb22f2cafe62fb86c2e571e089c5ed2ba6fb86b8e775f389d007e5
+af2bf37cd9a264ed7bccfe0889ffa51bedd386fe9b62f286cb23de5ae84196d0f53cffaf
+f4a3ce86fd9fda01cb5ad961cfff4ca8fa92ff7fb6d186ff14f5c124d896c1fa3bff1bbc
+ed79e587d0a2bfe0a543ffadcb3bfe55f5c263fa22d652ea95c9add146c1e5d874debf90
+fbc693e4109fff5fa5e57dddaf83fb93df32d84ffe36a4ff3aec5ae0a7dd12e080d8b784
+08e9aedd159dfdaf06fb80c1e051da3c97fb2ed89afc5cdb94bfe33effc017d94595e5d8
+4bcefe6cb8ed43d9c418bcea9fb9fba5c0ff24b5ed8805c762ffb64aec79ee93fa22ed99
+0fc1de35d864c8fb06e596d8b36dfe61f71eadd98ccbfe44d80fb6fb3df21dfdc767e581
+dc93d818e09cbfed86dd6ffb13f27afea16191fea854ed66dd41c2fad82db9fe19f24bfe
+c402ef60f986e07fc1e369c793febc65c5fcbf52ff3bf6c69737f5bad931c0dda546ff91
+f47dffc459beff25aaed86ff58abf57ee6a6feb7ed60aff269afe22ab0f96fffa4f74dff
+38ce13dd62e055c2d9fb93db26f1c296ff42e076d786fbaff579ff9ced4393f2bf4efe34
+eea2becf86fe5af362a5de93ffc66ad993d87ab7f304fe61f77bff5dfb32b6fe05f09eda
+60e024b9f8d837e0c40bf77effa24b86edcf84d89dd579e191bfd09fed10b6fb20b2fa1b
+cf2fed93459eeac2a5d36dffd87f50f994ff6df2b3d816beed04e19fed79c2f841d512ed
+cb25d854f23586c5ff2cc4fa0bc5ff7dc0e030d87cd193f082fe93f7affe8432be4af8b0
+5ae11eb8d1a5fe3ddf50d829e2bf16affed967a9ed7cb7d308e94ae4b1d00dc0f925f14d
+a5f407ff52ed35d0b188ed21cba9d393e75acba5c642afff91c8ed047df35eff9ab8d023
+f1b6fba652f76afb20f43cff4efb29adfecb5eedd879e59ff979ffaff1861bfb58e523a4
+fec286e151d623e886fe6ca4d866fe17b2de6ad980faa46dfe96dd88d2f911abdd80bde7
+8b4ced0ea5f46afb07d95be0c147cd0c9bf1adffd872cafe6df586f910b9f29fff6bf0ac
+57f8c5872cd0ff18cbfa79fb92ff9f39fb9ae87bd886ccea7ed587de9ffe70fac451bae5
+43f208aff27cff67facf2ee44ca7ffddafd487ea50e5af61e014caec08e094ccbca5d8b7
+94c3dc4893f3ac43ffbf6ad9b603d834fed093db88f1cb43ec0eaff47bfe5fce35c3fb3f
+f281cbf633feafe951c7e04bec05ff4dbe8fef79ff579ffbd086fdc954ddb6ee86ff2ca7
+e97deed25ee41998ed0aa5ddbf2ec4ea6cc31ab7cf81fe93d860ddf79e5be0a43be055d8
+29c7ed79dc31ff64fbb230fc47f7af11c0e02fd99bff78fb9ec0fe40d928e0b984f388fb
+cc539f12fb34bffa79fec196ff6793ffaf3efe5af10ef65cff79f8d107df96cc11ed3dcd
+f37ee3bb4ef506fb51adde89ffcd34ddc199f8a5eb79dfa6d85393e3c0019eff1faef782
+b6c99cd9fe41e01dd6f22fa8df3a94ff9841a5e068bdfb6effa528fb93c0fa86d3fc4592
+ff9e4bffd993ed3adc03e731ffaf0cc1ef7fffba84f3a5f97cb6ff51ca9fe10bdd98bfe0
+6ccef160a5f781f20eb3cc69db84d193f7a51ae557d90f93edfecb8defa50ad82eed47af
+e6c75adcc27ce48bd887e01eedaf6cff87f65ffeb1fa5ba5fd60a0e779b7c885fe13ef4a
+9cfa9305e34edc1bffc026fab9ff4786fbd079f0c52dd8fb72f415b1cf86fbaf65c1fe7a
+f6cc1fedbbfe26c7f201d83ddcb0c739de52e55e9bf2d061e5d38733fa79ff86f4b1c677
+ed95fe44d920ecca10d851df05c6a8ed5baff383ff17a5fe3895ffd31be15bc2eb38e424
+ed60e079cdfe6cffaabff62dba47e060cdfe86db91d8f936a3f225fab317ff45fb66cebe
+32e6c428aadd9f2593e0c117c4ff2bd4ff3aedafd476bfe562b9fcaeff93d16191ed9909
+d3afeea952dd9961fea539e05aed69fab850dd9be317d94aafe080d87af69f79e588f86a
+ff82f399ff25c3ec18a6fb05a9f7afc0e053d79f5afbd44de086cea5f95e9aff87fb93f4
+60f81afdcd41d861edca86ebc14886fcbfa5fb72ff7cf7a9ff12fb4b9eddc338e079d999
+f280ff3cb3f24dff1a86cbfd79e066d9c09ee9b9a5f27bfeb85afbd53feab7ff4bf095dc
+6dedaf86d99a5ff9a1ff1ed0ee8431c957f5befb4ac3fe79dc2fc9f50dffce7ce4b986ff
+9fd829c7f503ff5bf4c493fb61ff14e64cd9ff56caafe016d862d97cb6fe77bfe086c9ed
+55dd0ba2f324fec217a7faaf1efd63c7b0e545ed34ce76e086d9be7bff93f6b851d922fb
+afee974edd29d892d5b844b6d88ec6f10195f886ff5efd16d0a1ec6ac4df6ed0eeb006d1
+9fff2ef251c933ff05d94d93eebf6eff7af285d874fb36f9ba5af61bfecb26d858f3b14b
+d8f786eb9f0ed896e535f38aff7093e5ba46f40ffccc23db7aff966aed92d5b068e405d9
+a5f293d0b41db8fb2d9ff494fe04f6d833b2f839fe4f96ff7afbcd6bd974e58af33ac0eb
+93f12eff86d7be9bfeb62bffac46e81fdf359dfe7be361d809c4ff81f859f307fe98f55b
+ed31adfebf49ed1ec571b8e523c1fb039bf8a55aff94f44bafde88fe92dd7ee5acf3c615
+9de50ada42cb0ee5bf9fcf08e07addbe6df27ae4c181ffbe11e039ffb869ff7acb5ce01a
+d5fb5b9fde88d8a56bf892e952e2d0b348f92bffb3f1b750c634fe5ff3d779edcf45e05a
+ccaf6cedd065d97cebc62bd8ae3fffb0ee45b7d982ff58de7bd9ab01f350dc12f2cb65ed
+96c4fa70bee802f2c09eff8ce03beda6c99ce862dd26d886fbcc6dde93d1a7eaaffa85fe
+7694e1be31c3e524d887c0ed73d00dea62f9c12686fbaffe86d0a5f58cfeaf48ff6bf293
+fdab4fe692ffa502de3c9ffbadd175dbf028b6ec9abff8af3ac2f226fe5fefbf4aca0afa
+b725fea5c2df9f4385fe90f9bf96e1873effb668fa90bff03bff9f11ffaff419b4e482ec
+94c71c93f8cc08e5a0d00efb66f7c493fda5ea6fafd809fe51a0d9ff5bceaf43ed30f562
+b8cf13ff46b1d886ff77e59b4df428ff65fb52df39d949c6f65aff86fb79b6f739fe15fb
+5ef4aed23897fed54bdd31f15ffc64d82ded93c5e052d726c7fb0bd841cafe78f6d6885c
+fdbf43a8cff90dff4286eea3ff6dce97e71effa5f29bc67eed61e61388fab9e51cd843ed
+09affba7c90cddb222fd78e07fc8ed8944cc9efa4afe0ef561fbd8679bffb631fe8ccbb4
+41e629d260baff48f9b681ddc11386b6fb79fe93bed0a4fe75e293c2fd1df1accf0bffaf
+d59fb9e508c179f3be9ce92bd3a4dc42f1ce6de1aadb84d89e4effafed66a3ea91cf7de0
+1de897d974fe18aff786ff9e73ef94f8af4dedb725edc71ef286fe8c55d8a5c5d961e007
+b5ed4cb1d979e036ff5afb93d979ffcd31d867ed9dff6cc3d92ce86ef77aff9ad2bc15fb
+51afd8fb69e579d99cd0afe0ae3bfedb5ced7ec2ed55fec097ff79e51ec2e07bd0f52ffe
+abf8d328e0c30fe44fea1cf2af30ed5fe09e39fab75be216ed4fcba3ffd8a50fff62b2ed
+0cbfe59612fbbe4798f231feca79db1bcbff01f753ffafca7aff52e4c19bdd3bd848ebc9
+5bd82de09acc80fe9e67e4afd804e7aff165fb21fe93c1fa7cfeca3efb8bd0abdf19d63c
+edb584f391ffad5ccba4f776fe54d0a4ed4be43eeaa5d894fe08a5d81effbf2ffc4d87ef
+7fbe28cba6f93fafdd16f051bff288fb9d27ff429cee6ce53c95f452a5f18dfe7ddb68cc
+fb87d97bffc16aecc693fe7dfa89ec256afcc48cc0f979fe5588ffacca64ffd26ae0b512
+fa93f55cbedd85d8a528fabf05f4b432fa69ffa5f3b520ff79fc89f314dd48d8ff933bfb
+be61ff30e27eedae53d937dd1294e5af01ee63bff386ffc007e053d910d0fb24dd3ae094
+bfff1fb9d893fe85f732ee82bff988ee52a5e18dc9ff02d1f287e714d995ff81d68ee0a8
+0ada4cedcf92eac75bd888c7ed77d8ff64c934d6afff4abcf603d14cdfaf1cf942add830
+db5df7dd39ed4de020d991d0eb3fd92bedb702f8c586edbb3db6e1944afd3aeeb868ed9f
+d05af18fecc402ce63e496ddc352bdff6bf7b607edcd7bdfa5c893d0b944c3ff86f6a0bf
+ff71f2c193fe329ed84aa5f596fd7cf651bef080feaf16f286e061f305c753c4b1cb3dda
+59e074c8f760f025a5e59a45ff94fb62d025f45aff33fac19ffeb576fb04a7e01dffaf06
+fcb422b7fb87f70695e570a8eb8ff281fec075c4ef68fe83d087afca96f5a5ff60ee25b4
+f780fe9979dda027fc53d9a5fe22f8aec4e579fece45ff84dabf13b75efe7bf586fa10a3
+f130d0a5c57efaa55afe19f34efa14ff9ce517edb241e057d12afb4cccaff76ffbcb79dd
+32c89eea78b5cf47c2e6aa4cc5fe7ab5fa9fff17f587ffb828fdb711db81fbbc53f9d9c0
+5ac7a5ebb47ae099d883e367c934e45cbff17af74de59fcd59edd346ecadc1dd27fec757
+ff17d933edbbff0ee5a5f205ff52fe16d876cca8c1fe6cc0e258cdfa44ffc17ae686ee70
+d962ec179bd80c95e3af1efba5ffd995c0e035d955c0fe79e55aec1ee04dc9e68ad879e0
+9feb6ef488d979c7fe80f991da98e46bed0fddbc22ff58b6fe1eafff01f588ff69d4fa9a
+2bc0e938e262eb97c661f1a3d085ff96d86aecce862daaf00bff3bf2c205f752fe1cf393
+ff85d8fa54d2a1c66dff86fa9977dd9b5aff81ee9f3ce094cca5e3934597d8b646b8e094
+ed7ee45bfb04f3479edd0aabf31eb8ed80e4af3aff0ed19eff8ac0fe62f9c66cf0d8873e
+c64df824a5ffbfa9e03ad9b6ff82f490ffaf24f745fdbb30c1dc02d451f220a6d80bea52
+ff18d884ffa562ea8bcfed80e4d361e195dc22ed9310e5aeff79d287d9af2cfed502e54f
+dd37e848fe129fffb6fc7ae286d96cfe93bbcfa4dd5ed812edaf2cb5fe24f3b63ce019bd
+ff12facb1ed866c5f47dfb64f96ffbb5f62efe7bfb35c71ef9adc798e080d2f960ffcb73
+dfa551d81cf5c599bffb2cc64cf242e0a134ff509ff5dd80e579d0ed8618fb77f7980aa6
+d861da38ed97c6a6ce85ff6aa9fc93ff85cefb65f3afca7fed9ed92ec8f23adc9b0df947
+93fbc159bff85ecbff80d94af20bfc46f8c157adf692fe7bf4abcb78c0f241de1fd54ff6
+9ecb47e730ed4bb1fb86f5c26effcb7dd987d6f866c7f26ae5b986f5a1fc0bacdb27d84a
+d007dd79ec93d287e4b39ecf2aff43afff2e93eda04efb87ffc493fe78d966ed79b9f693
+d7b679f3d37fe6c829adfb0afea03ec2e191d05de8c6f830fe9ecc79ff5aee0cdd4bedca
+5fdf2ce89f3ee09733fdb640f956fc87b7fa6dfec4a5bff22ca0ff38a5dab041ed6cd788
+e09ccf71ed93e069d927ccb806eda3e07dd893ed88ddb018feb8a0fa7affc937dba542e5
+9e0ff050ff0da4ec964ad8a52eed41d95fcfff6cf1a4f486ff9fcb55db13f24affdd79ec
+8ff0d67addbe14c1e730d90ce037bfe509ff3fafe360dd04ffcc21b6fa0e89fecb72da88
+f1b0ff66f325ffaa4193e0af0ffbb719dd6dfeb4fa991df8aecb73fec37affd766e5c686
+e079e604d1b243ec60e079d7ed7bcefd06f29fc0f92ffead26ffb912fb40ffbfa5fb70ff
+5dfa2aff58f562ff31fbd169e022cdbf0f9af879febc63f2cf89dd79bcfb32d0fe85fbca
+7aff92f39a39bdc913bfe660ef20ff77faa1d96c3afec260bc1af765fea9f479d06cf1ad
+f7985bf2a3c1fa15ffa7ef6cacfc68d9afeda545eb63d456dc0ed895d885efb7fe78caed
+69d1f286d8a02982d5e58746f6bb06f1b522bef707a6ff1eccacff67e3c093ff21fba810
+de4e97e577fe1db6e066cbed7adda7c1dd8715eb4de093bed392bbc909cfa9c557aff385
+ff53eeafdf60d802d1fc3bb8fe39f4cb81deab01e643afe059d521e0b1fb7cfead38d994
+d88fe2b05ac0f7e59307d9fe95c3e03cd95dff93fbc24f86ffafcd6be080d99434bed83a
+debf49ff30bff686ff24fb94f861fe44e402da52f328bef943b0fe3af6b7f14dbeffd869
+e4af5cd8fa6d95d9f161b7ed3f9cf11bfe35afd956c7fe85fac75ed893dd7cc1fb4ea5f6
+5bfe2a99f2ce7af3c43ce61bf068f8a5fb79e88dde03d895e080fe32f286e58eafe168ae
+d89325fe51f2c16abffe11f7a5fe7bed53e02dd0fd81f75cfb2ad8ff0ba74eb8fba338ed
+50a5f281d81fe03b9eedd729dc47fe23f452c3fe81f7b179f29dcf86e016d996e0ae3fc1
+eda4ca7aff8bd293de74a3e77cc0e065db8afb9f0eb4fe3cd1fe9837edc24792d0fe59f8
+c77bd972ccf386f77ab6ec2ab0ff26f750ff0fafe5c708d86ecffa44afff1f98f981feb2
+dc35e04dee1cff95fd61f72ad65ac6a5ff48ee23c5f918ffb7e679d88effa5f07fdb88c7
+62d908d69ceb944bc701eaaac9689aedcbffd870f2c07cffd002feb6ef85ccfe17b1f37c
+e887b5d09fed62e01ecbfe08db56f999fe77cd5bf3c784bc2ceab64ef11ffb5cffc433fb
+04adff18d839cfed79c5ed8714c0e186ffaffa2d95ddbc27fb93eea14ad513e53cd09ef2
+7ed286edc598f34090ff94ef80b6e66bd8b9dd5cd9a54994ff81c79ed8be2face57bb5fb
+94ed1dceb67bff81beed885ac2f70de33bd823d251ee2efaa4ff86f66cffb4faa5c551fe
+aff532869f19dd59e5b22c93e6a55297fa68bae868befb03c0ff4bfa09d1a8ff5ea2e584
+edc138b1ed04fe89ec1bd8ff7bf6ce6ce4add908e095c6ea70c2ee73ff5c9afb249ff4ac
+ff4ad819da5acbee13a1eb5bd80afcb0ff94c1ff67dd0ae062d9a735fb81d6f152e43aff
+0ec3fc3387ffc60cfdb8ed13b6fe42f95df4d83ed0f208cb88fe61f6d856e536abd8fb40
+b0ca62fa7ffb93ff9ecf87d85dca3cd80fdf61ed82e01dd961d0f2c1f881fd0dd7fbbf4a
+f9c8e411da48a4ff32c8a6f179e586b6ea4693edc04eff1b93fbd160dab932b5fd9d4ac8
+12abfa984abbf588ff59b7fa44afe093f3c250bfe055d879ec69fb7ef2a567fbd588ff84
+e26bdd32ed5fb5f093fbaffe17e5b962e223b7c6a4d388e0629ef1c14aa0ec68de76d0f1
+79e586afc677ffa76ab7ff4cc1e09607fbbf95ec0a9eef83ffbaa0eb4be009dd53e819ee
+8efe79f29bcc29ff78f390ffaf43e85fd0acec8754f1d98f2fbeff7af6cf8bdd75e03fd8
+2dc9ff7af6cb28fb95d0afe549a4ff80f2a3dc5ae5affb93df32d6ff85ca3caff026cf9f
+fe0cd52fdea8ff7afb2af7c494bfe50bffc6aa4de52fcba8f951ca9cfa20c04cc9379eee
+5affcc92fa6dfe15f7b547f9cb01eaaefb7bd230f6af38d905ccff14edc125edd883f29f
+33efaccb6bf779ffcc65d930f314c8b7a9f782fd79ffafe126d8af3ffb9fd5b647e00fdd
+8826bbff3e98feb88418c4fe9d40e5b708fa5afe92f796fcad50e00eb3d865ea32dd7df1
+c627d853ff71f909d85fed75febe1aed62fdd885e27edd79d986fe61f203d092d9af0cff
+449fde913dd8fe79b7ed1dc5a5fe75cfa5d9ff86f4d078d9a502ed48da86d869caeda579
+ff86d822f297ffbf5aff9df7b652dcaa5efbaf3ae013ddb977ff3bde1cdbb628fd87e579
+d986ed69cbba31d1be459ff986ffc087ee09fac883f096fea1ed6bc3de1fd2ffacf251ed
+afc988ec80d819cc5bd613ed8bbffe71f9bd9efe5cfb0ab0f493e417cbaff281ff23d0b2
+6ae07bd8a511fa50ff1df252e8a5cd93eb6de35ce986d2afed62cffc9702c1f77dfe87ef
+04e54af37a08e058befb44f7bf9bfea8f436ff9628fed837e361da55e00989e5c26bd488
+ef81fa99d179ff9ff967fcd753e986fec160e751d0a8ff47f927ff40f2a3fb72f5c561e5
+1ddd4ec2e49458fcac3dccfb03b1f87af09345e06fd98afb22ff6ddca5f095ff83f5a5d8
+27daaf42f015c7a9cc9ae16bfe7ab7ed884edec19fe647f39ffe37f7c09acca7c781fbc0
+20ff43b5f92ffe9ff550fe26f8b531f2afe043d85ad86bdd86ff8ce8c1a4fe2895d885df
+5bca1cafec86e1c065baf59cfeaffb6fcbf2a121fa49fe1ad941e00deac471becc24aff4
+a6d04798fac59fed1bc0df93d797d886e003b0d913d897f67bfea55fffd02dd8f65c7fd6
+e52fd962fabf9ffe04d360d854f335fe4dd831dfc23cfeb65fffce89dd74f239ff4cd82a
+c9fb3bd2ff9438f886ffcb0cafdd5dec2ef460edbe3a95f0c3a4dc83d8b81cb6d97bddc3
+6ed95cea89ffaff62cffafc61dd041fa62cdaff219ff3af68bffd04cd805fbaf45ce14c6
+3c94eda93efbd879e0c1a5bfff6dfbb327f543fe87e09211fbaff08805fe6ff79b5bfe7b
+f618fe5ec2ff6ab6ff52b9d331bff21ab6ed75b2e1fe4a8affa4cc11ea38c2e77fed87e0
+a0c685e57af2b375e37dcfee8605f74bff93d77cf59eee5196e5a507edadd816b88ec1ed
+87d57cfe93e401feaee2864cf610ff61f395fc38eeac0ffb84ffa63ac91294e79f42fb9d
+f1bd94ed38dc65e0afce7aed619fe57bed6ddcff86f27af9d017ffbf59afed9333f35496
+edc859d997e5abef4effc960d830e0bfabdd39b8ed07cd61e1c0a6e94ff2ca79e005ed89
+dc7ae069c2ff15becbaaedc057feb583ff79b5f930ffaa0fedb722fbbf01ff52f91894e0
+c2aae6b121edb714df87ffc060fabf79fe69c5f25ffb45ff21d9b54bb8d961d818fed06a
+e0afc946e587cb5aff96c0e019cffa7df2d661cbf379e45efe11b5ff88fa9d54febd0bc1
+fa25ff99c71ea5d84fe0b688d97ee499fe0fceff87e7c32887b7ff62ce047fd8b67aed93
+ff7bf958c3ffd06ddc8ff39e42fb23dc9a3afaa5fe9efb41f7a5fe44a9e06b34fc0f95e4
+2af3d14cdf25ceaf64d9fa6affd49d5dea86d899c8fb57fe3787d0fb6dc7fe62d80eddb4
+28f1d939b3fb32e597d079e96af2a5ff88f27ce7b988fa9934fea5d105f4b880ec4c9ff1
+79bee348b6fb0eb0da27b6d88fde79d807c7f22ed9a5e080d9af4ef2b2f979ffc128fe52
+f72bd161f2b74cdd07feacf6d819ec93ffbff71efe43df16cf3de48a24a5fb4bff2ebfed
+92d883ecafd12ac55fceaec70bd89bf985f3d977d0fa79db5b9bf786fb70f2bf3bb6ca40
+8ae5c3a5f62bf04ba5dd7bd8fa5fa5dc529fed83f86cffd08955c2eb7bdca804fabd9ffd
+0ae03bd127ffa748ed1ebee57ff271ff8de21fc4fbd853fe25aeff76d993ed6effc968f3
+30f851fcaf61e579ff58ee40cdfe68d833e00ca3ed73e5bf93eba5c76dfb80d168db4c93
+fbaf51d8329ce583cfaffb85f295fdb6ee79e5c1abd976ff61f816ff70f386f121ff66ef
+79e726dc5686f5bb4cedafc3ed1bcaabe006d7fe7af4aff81dff49b0de87ffc026f2af1a
+c0f601ffbf36cda5eb459af7abff1cd84cffc95bdf2cbfce96fb72dd5bc7fb79ccff64d8
+28e0c046c6fe9336b9e885dd67d1be34fe53d8a33cfe9fe6a6cf79ea97bcf31bc6b2fb94
+11e682f192c8fd44d8a903fb4bff1eefb4e52cf27dffc23ec0f38afbc34abef2599fd85e
+d60ed936d89810fe51e509c6a5cc94e357d893d980e03affc293c5ffdf219dff9309ff86
+befe4393ff9c4fdb09d860d97bccfd5bd209edb669ff9ded88e580f1abfe1ec6afdd03e0
+7cee87e071b7f593ff64f143afed92f79e06dfaf3eefa1fb5c93eda566efd98705f9b0f4
+08f8a5c3e618f2b0d256c517feb722ff47ce9ffd3389e3bfa9fb49d85a97ec83ffc49ce0
+85d8a4389bfebbd811e49fdf09d465eda5fe0bb9f62cff7df587ff65f9cb83f289b6ef45
+fe30c0ff0cfa4bf598d3b249fa01ae66c4e03ccde5a740e961d8ef66bbe684ed93fea4ed
+1193ec98d97bfbca4ed831d34ecc28d95de085fb69fe5ccd3efcaff816d84cade57efeca
+16d840cef381fe94c914aecffe11f6b72ec0ffabcd3d98e486dc6098fd77e201ed93dd83
+edca7fe186dd6bf1d05fff26caa3ffbafa22dd51da39aff666feb9d98647a5f573fe6af9
+7fff21dd61cae86dddaaed49c5a8ed40a1de35d0fe6ae080dda562eda0ceb818fb86edbe
+9ff1b6fe75f8b763fbd48afab915cdfb29ffac45c929aefabf38ff51e336a2e57efe79f7
+97ff8dfa77f026d2bd93e7a6c7289beb85f2cb0edcb379f985ffbc61db23e661ffd943ba
+df58d4fb9c5ef27afdc250ff22fabf48cf93fa7aff5df73ba9f50dfe42ebac03f580d96e
+ed0887d2a5c0f879fecb19de4af105ebb0e083cd35dab6e154d086edaf3efbbd04cd9fe5
+1ccaafff77f7af1ed8adf451fbb3c62eff73edc028d754fe37e80dafd825ed9e14e2349b
+f3ae5ddd6fd0f66bffce6de0b586ed79c7fe13f1a7e00cd656e215b6cb99ff4bf312fa83
+feda51ff3093fec42aed4be5b00ffba5d19cf2b683f89b77ff931ae5d042d926deb682eb
+7beea5ff33afdb2dcc9cbfe06bd8a5c97bffbfa1e551fec0aff342e77b0cedb77dea93d0
+6dff8cf822ff58faa52995f19ef934ff9ac886ff7bfa6dfe5cd902e1c264bdfa2798d810
+e886df90d95aa5ff93e58dcb87f3cf6bff5ac7fe79cbff52e593c0f910bdec9c4ef321fc
+c019fab588d9b946b6fd6bf3a0c1ff37ed88d8b89dd842bb8ad0a5c1e74999fbc0a5d56c
+edc338ff53c732dd01edcb3bd8fab67ded88ff6af4c943d80ee08ac4f671bafe06fb51ff
+8ef92cda50e031c2f09a36e06afc92ffafc92eff59fb86d8b544bed993d686efc6ff15d9
+66d779e322db51e02dd186f290fb9e4cffd96ec9ff7ada71fe55f704feca61db10fb4fff
+9541e084ddaf4bf2b685d81efe3a9fe09038c1e195d87adda3cf2df664ff95de86d8af3f
+ec70dab10ef960ff79f6d906f261fa78b9de8655ff1cfab87ee38df593fb7bffb064f3be
+8647fe0dc7afe013a9fe86f7bf5be51cb4ef6ad986d824cb59ee95fb88f89317d6ff84cf
+1fd854e086d999dc12ed2ee4a2fe61ed18e04aaf6de681fe0ff2a5fe6bf3c0a5ecb53cde
+29c7ea9315f3b646edaff23bc5a2e5b635f884f17ad81ec3eda9f72cfd97d702e761eda5
+c4f179ffaffb03ff57f53cff61e083d805eb3af820ffc493fb4ef285bfd42eeab26dffaf
+e020ceff03f6d092d99f30f24cd90aea4abed02be09f0df6c2daa5fb4e93fbcf60d9a043
+fb7cffd54de5a1f261e89edf79d40fd84ccbfba95aed94e59ff139fe5ef677c79efc61f2
+0ac9aeff6ffac5fd42cbace0b849b5d89641fb18ffbe7aeda542fbaccc83fb9924caa8eb
+79cc69edafd045d9b9affb8708c8b768ed6ffba2ffbc7afb58d225d886d07eeab0c693ed
+affe54f4accb81dc6de00abcd09efe3df0a1cb23e5c34393efab5aecb635f350fec0a6ff
+78b8cca5fe6af579feacd68959f079e9c13b9ef323ffc2afdd3d9afac532affe81fa19ff
+a5f37fffa464e8be06ff5ff776cdabed25beff4fafdd7cb6f73f97dca1018eb8f45a88ff
+93f708ffcb91d97bcefa5bffd079dd59e208d1ff61f615ff3dfa9c1affa5fa66e24ad3ff
+81f3d81db5c645ce30dd0bd993f869f046dba510fe50ca0d9edd935dffbe48fbaff062e5
+23c5e487ff67fd5a87fbd671fe9fcb6be085dd7aeb1ec9aaed5cde25e595d94cec36ffba
+1ad82bffafe587d85ce40694f2c01391fdbf09cb5cd8bd3cc2ec20e4b83ffad97cc81ab9
+fb0dc6a5df81e8cc37ffd469ebcb2df3b4edd81cfbcf20dd6deba95ee564f1119bd80dba
+f533ffafed54b9de91d887d977e0c287e62bc17ef5b757da3ba5ffdb7ef092f79bfe73eb
+3ddeaffe62face80f186fad12efbc219eda5d02e95ff7dfa58b618d994cfaaedbe17d93d
+df1fffa5fb08d366fd5ff728ff86f9c21abffb93df67cbfe8ff285db02fb6df584fecf5a
+ffade64add87edabf778fb55afd87affcd872ebffb9fdc86e16cfe3ef80296ed9326fbbf
+85e57cfe5b86e4be79f0a2d446c0f725fea0c1e585ee6aa4e09468c1fa9f29fb49f2affe
+2ff05ecc9fffdd149fee78fbca8750fa17d855e149ccb3ff9b16bee63497d925e0bc75ed
+6be5b578f67cfec342b9d693edc151f608fa339dff80f893f1be46c3ed87d993e08cd998
+d859a4ff6dc808b6fa9746e061d071eda5cb2edda526e185d86ef198ff42e429b8d093fe
+61f20c96ecacde4ced35ff4def94d3a7c0ff4bbbe09d0eff4ecf39c0ff9b51fbb639fe8c
+df82d8b131f84bff3ac2fe06d3f73088e6cf7de0a409bed593fe03ec436ec0fe28e3a60d
+f4d299e07cffc088f21f87d6f26cc8aef369feb140ffadd93bffcd08e05beda1f501ff6b
+fba4e0b47addc462ebaf5ecc7afa9852ff3af214d250ed10daf03ab2e59fed2fe7afc0f7
+38febf51ffb64cf2c763ed34fbc222d0a5c796ff01e031ddaec1fd5af58afe7ed093d8af
+29f25bdb7ad0fb74f1afd893edaad922e8ce05de86bef213ff51e487d5a9cb95da79f251
+a5d8ff0eacff58c5fb61f63eb9d894f9a8e088d07bffc1912bfe41eeaf07faa2bffd43a5
+fb1dff4de4c179e9c40f99f35a9dfb86d81ed964e0afdd31d860c9fe3ee5b60bd8ff14ed
+2dbae5aecba1fe85fa7effb878c4f352ff79d75cff06a2d99520e57ad7fa79b7fb94ccb5
+68fe7af265ec72f0bbf69b4bdf28d8b408b7d91ff963ffbd73fe14eda01ed955fe62f615
+fc71faa567ffaeed2bccaf6bedb9ff50fb19f35fe386c4fe6393f0c739e585d893b6dd86
+fb59cbff21f751d936f1b8d96fceb968e5c653dd78eaca86d88dd99802f9b762fbcf86df
+c036f1a5ff7efac14c90f37dff1e99f286fec154aedc86d7fb890ce34bafe638afce31ad
+fe84d025dd87ef7fccfb76f2acc5f10aa0ea16d850ff0bd99fe50ffe3adba84587ccff79
+f76bff9fe570edacde07e6cb86e064f9c587e527caa5c693e054c8f1934dc4fe5cfad8a0
+047be093e9aefc2db8ea21bfdc5c9df575fe1df24eff12acee2f95d86bedafe5865efb96
+f525feaf79ff2bf6b609e551ed32ffa9d228eda54bfe20edaacb50bee63895fed014e4b7
+efd14ed829eda1f76dfea55ad0ff74f9d768cbf36afbd803dc62f7affe18d9af2ce552ff
+5f93fed061ffafef91bef946b0d893d382fab6fe1fb7e9a1cf48f13affc14391f79c46fb
+afce41b1ff6cb7ef4dff34aff38d30d9f9789de0943bfdb4f6c028d14cc99fff6baff738
+fecd18ddc197d8be9ac5dc79e45baefebf069fffc314ea59bed835edc49ad05aff7afcaf
+cc64e57cfe6ac8f27bd387fe6df911accaec24a7fb965286b0fb75f661e037d923c8f43b
+beed951cfebb08e0bf7bec8ae59b3ebfe354ed99cabd12e0c14391e4993fce2ce278c8fc
+5ef767e917d861e15cc610edb686d86698fbd85dc7f3a32cff97f109ccfb7bdd86ecce0d
+ffd4a41aecbc0cf5c086d849a5ff8bf176d90cedd07be5b862eda54aff36f36afd4cf8bc
+fbda3b93fad543e0abcaa3ff85faab16fb73ee93db9e22f9b842f294d9379fdb60e017d8
+93d3ff5388f7bf49d9c5ff02c0e493cd82ff99f2b480e09f29c2e06f9eff9342f951ff21
+c2fb60a3ff81f66bfdb477f8adfb21bef76affabf41d95e026c59fff86f296f989fe7aca
+fc1df3c415bbff3588d6ee69e07dddad44d706f9b679e5ba4afec259ffd078dd27fec5ec
+57dd15fe87f9a64eff01a0fb80f8b87ae288e025afcf0ba579d2ea5791f673fe4af001d5
+6de093c1e00fd639f5c679ebd8ad1bffb0f706ffaff17ae55e9ff2ce3ce09efe3493e09f
+42ff06edaf49d110ff50f7b6fc45f5c52eedaed19ec9a7ed7df2ce39d80fd93fd0ed30da
+79cbec86df9c4cd0afff51d8fb38afd905d038d956e031afdf78e5b179dbafe610b8c823
+fd53f787ffa1c94ffe389ded7de1b38e3ffb93f09f1184fbafcd61e53dbfd992e0c146d8
+26e6c306fa5fc0ff80eec8fe1ca6ffbf1bdd93d88cdd5aed39ff4bb5fe6be2af52ff1588
+fbc777d883e0c4439fff26fbc104affe7bee6fc1ed5df9cb7add69d7fb93e979dbc46193
+d87ee9b462fd0df668fe5ada08b9fa86fe9df488afff62eea54ffe0ac1ed81d96dedb379
+bef46afb7effa5f593ff80c0fa46ffcd26fe76f884fea5d093beed2fe26ded86d0f560d8
+28fbc6ed69e55abcf3d99942f4aac793fb2af752f388ffaf6cfba5cf9fed62d8369d6cf2
+cb2fe0b55bf328ff78f786d0aef15ec3f286fe95d0b1ef49a5e62dfb5193ebc068dd87d9
+9ce44cd80db7f52cd5b324fda5f71ebc50c2fa9602fee115ff5bdbc08dd894e01ad68ae9
+79afcb58e362de1bc8b605ffd978b5f635fe02fabf13ffd252dfa4ed4acb19d851ef04a5
+d96da5f08ad75ed938e051e916d29bc0ff1fd9af16ff96ea8601a7d81cceff8833c2e580
+ff1ded6fe082cb98df0bd0ed34dd52fe11e086f5e4c24b97f862fbc781e5b0cd21befe1a
+93e49e2ad903de3fe06cccfe5df2afbffe20f8b63af557ff79f786ffd863afff84edb64b
+c287ffdd9f2ff0c678b9d69af01fff35f44db1eeacff50f82bf0bf26fe82fa7af5cf8a3a
+c3e47bd88fdda560e59b2bebb11cb8da88ed9cdd8dd0fd32f7c856de06fbabf48effa7fa
+60f23e88b7fc66bdcb44affeb6f681fea045e4adff08da5ad6a1ff16b9fe2cadfa7bb6ff
+8bf193c6b3ff5403feafed7ed99c09ffa545fb9bde66b8f83fffcb68faa6f490ff0b93de
+9c0fdc5ad879cced74d61bdda5c82793faca12d961df8ff1d83e80fbb868e5ac29fa55af
+dea5e474beff8437c2df86d86dff95b8d239e04b93f2aafb1aff5af043cff282cafe7af6
+93ff78fb61f427fe5893ed9f1cff94ecb74ac60ec443b6d97efbc7e743d8fa79f2d45bd9
+39dd60c8ef69d877ed95b8f347c9a5dd67edcc41e04fc818d74aeb29a5d9f387d212ff3c
+f4cd79dcc187eb4fedd273ddbe81e0b254c72cb6d8f536c1ff84f3acff06a5fd8af2b238
+edace73e9df17afa39ff16afedcb0ad8ff43f3c592c1fe8648c4fbd027d8f29617fea2e7
+01dd4ded9fc1fcd725d861dfa3c9afff8826fa51b6dd44d833e00aceabc67ae8c349bfe1
+83d06bff93f2a1f686fe27e5a50f93f3a404e0a520f871ffa5f307b2fe25f9bf2efc7de3
+86f23dfdbe79ff9ff996f4afff7bf9cc69bf45e5b893d8b663f931fe10c5ff9f0afea51d
+f232ff86fca4f88661b5ee6fe5c34294e7c32de062cfff5ffb81d8ff4de5a2bed093f969
+a5f284afd086ff49e705d3f1991193faa54affafcb46bafba5f387ff0b86afff7df6c041
+e91f97e4c4aded0dc1fc6df9a2bcff3ffbb60cffa8f963f13ed821dc67d85ae095cf64ff
+b6da6cffc577fec786e1bf2ed193d97adfb052e864d005fb5fd4af11e8af21d95adb37a2
+e05c95e9a8ff72fb4cee21e59ded7de2af3bc0f383cdfb6dd9bbed12e547beffd553d929
+92fbbc4bfe98bbfb0b93e1c218bf8bb8cd0bfe53e037c6fe5ae531ef13b4d96bf9bb79ff
+b5ed6ec9e567dd7af78acd5dc724aadbee5ab9ed0e9afe69f9cc56fe679fff5ba5e0c34d
+ea73dd84cae561d812daaffe7af3affe34fbaf08edbf3bed52e52a99e9329ef11198fa78
+fe3ff7c162ffc4a5febe95b7ec78dc5bf2ce8ffe7cc3fb0dc0fe1fd031ddc5a5c1ffb14a
+b9d860fa88e562d9459fe8934da0d87bceed8e19f69bfed014f0d36de450cbaff842a5da
+fb30f26de880ed99fbb623d878fec09de47deda440e029d851e004b7fb38ec10d931ff78
+f9d36bbffb3bcfaddd8cd884b7f208c0e080d0f01091f296d515ed4a9bf488fb9b31c2e2
+9f52c0e073ccff6bfab086fe7bcbfb59d1ff52cded4ddfafeb9e0ded9521e14cef38ff1e
+f79efe8845e402b6ee6db0da84ed93f99817f25688d97bfe1cf1a7d123ff93f0c107f6b7
+e33bffaf27fbc97fe062a8e07baff61bff88ed6ad0ff865ce0affe43c7ba07cd61eb94dd
+af50fa3bff21c2fe69f5adfe86ff7bcf9cc0fe84ee95e0b04afe2da7d96dff53f313ff46
+d893fb2ef73c95ffbb2cfe60f8b3ffd225e04dbeec9301ffc61aaeea2ca5da22e0c116d8
+b67feeae6ce0a96cffc31a86cffb7acbfa80d886e0c58cc13bc6b4fb79f5d73ecbf32dff
+4ee06dccff7ed0fb05f5abdf9635fcb659dd29ffb365fe71f2c479e0a04fff02bffa5aff
+38c8b660dc26e09f04c1f7961dd1a5f77aff9ff486ff10f692d8a8ca96e080da9f3bc4da
+5fe922f253a6e343d80cf298c0ed79f9be27e286d07aedb2eb5adaa6c2d96ce5cb80d9a5
+3b87bffe79ccff5bf6d06ced95fc7bf7c779f162fb9cf438de0ac5fb1ff7bf338cd9ff45
+a5e039a1ed17f4b15ad9ff82e524d8bf5093ff9b5ae0a5bf04f642abdd38a0edc44886ff
+d86ac9f87ed86de5cb20da9709fa60edafd894f230cf9ade7efccd85f37cfeafed49caff
+86e028d951dc2ed758cc64e819f35bfb4bf70ebfed9319f7a6d792ffd867fa7cff88dd1b
+d8af02ea98c5fe3df7a51d86ffbf61fe21f44ba8ed20e3b7f25695eda513dd79b5fb44d8
+59d9973eff9ec942d387ff92f34fa5d979e1affabd60d7f669fed976ffbe2bfb9d09ef98
+fa66ffabe01cd8fac061fbd9a2bee779fec02993e8c60cafed9302eaadfb46a5ee81fec0
+a7d31ff840e779db88fa0eee40a5ff56d435d871dfa55aef69fe92f178fb7ef19bfeafcf
+88d8b893ceaaff4dfbb0c964fb49b815ccabc657e575fb68ffc386fb5dafe06cd9b8e09c
+01ee7de086c7ff79fb88fe04e7c434faba87ff2ec1e582ff15edafd002ecace457bfdc67
+ffce89fe04ed4b93f1ae25c9b902afcc67e479ecafd348bbcd0ced87f7b68615ea79c356
+fe23f265e4aff360fb9df73fd9ffc23397d9ff53d131ed48ff93cabda4fe51ec72d88ec6
+e917d988f694ff29f9bf0fd5acc514cbb3e404d8327afb40ff09ed33e07cd686df33ec94
+c3ef9ffe2af7b638f4afca4af236b6de0ac2fc30ff4bf2c396cb41fab609d843cd5cd886
+ffaf68f2cf52df9c0bf1a5cb66fe86f570fe13f1a525e5a234ed5bd886c7fc14dd93f26b
+fdd83cfaa9d052fe88f87af1a1c64dce33ffd489ff98f186d894cf51ff86d93ae05ad0b7
+6191f2c50f86b7fb93bad886ed57fc0bd0b726ff9ff452b4f26fe3b811b5d87ce9a0fb44
+f37fff4ca5ff87f7c19feabb90c5fe61f225f575ffc007fe3de087d97feacea123ed95d7
+a5fe7af6519fed88d372fb30ffa4d673eb93e09ded6cde1dd9c03cadf985f3afc748f9bb
+30e04dd993c579fecc6bfac681dd9aff2ea7e55aff43ebb681f29713ffb732de1bd836fb
+81fe92edaf53f237df0fe54aff0cdeb718b3ffc285fe17fabe4afeabf6cc1bf250fa14ad
+df7de56cf2c85ed723fe86c3fb46fe9ef263fb33cf6de489d993dfc242dd52e01bd268f1
+58a5d88ecf9add5aa5e07bd86fed5bff058ffed960ff16e656d888e5cb64dd14e5afd862
+ed1bfe52f67dff29faaaf574fea0e020d85cfe89e47bdda4c1ffa92afad83bb7f20fb2ff
+25f064d0f779b6d29fc625dd51e5cb85f3c86fffb6e560dc24e464dda4cab465feafc683
+ed7bfba0ed892aedafdd79e6cf79eb5b98e37bd79cc3ff37cd9cff44a3e483e664d908af
+cf84e044dac190ffb71dfe39f923f2a0bff46fff96fa26bff903fb4ffe16bdfa4cf3afff
+1dd0a5c1f14486b6d093bdf42affa520faa2fe8e58f3bb93cfaeddbe16b7d99352c1e50d
+ef8bfd7be737d81bff52fb0a8bedc05b9bea7dd89edf54cb85e0a03ec1fe0ae37aff92fb
+ab4ce85ea1e0934aa5ee79c9aefb07fe27f8d89f5af9d03fd962d85dcef99e4694f3229f
+df2ad4ff41b2fe65ee76b8ec1fc6b0fe04f9bf96fbbb5bed21c0ffad01ed4bde9ecbbd79
+e660fc1594d8af46d9a4e56deca7e06dcbed81d9a430c799f63cdc62bfdffc31fa64c8b5
+6dcfedb348b9f1cd0fff4efb3985fe9ff378d1ff36afd858d142c5a0fa71f0afd282f2ce
+60feb1f707ff46fb72f4a5f90cfeafed83f391ef60d80fc5ff22d8fe04f7bffe10baff48
+9dd886da8a2fefbf1cadffb9f232fdbf07e4b6ff68b9fe58f7b06bedca05d93caffb7ff7
+88ed7ad8a83def2bd2ff88faa55ce593c5f779ff67eea9c793ceb0fe2beec681ff39d8b4
+3eb7f99f41ff10cdfb68e17ab6fd96f80e9dd87fe011fbd93987ff80d928a7e57bd8a8f2
+c42de54ce008c69cfb7dff85d9ff06addb9627edbe43afda1ee088d0abc793e319d862ce
+5dd92cd84ecf31de81ec9d64f1b879b1cc6ad894f286d0f63cf24fffe677fc9beb8a0897
+d9a552ff69d831cbec81dbc40cfbbd7ce588fed00dd94dd827dd5effcb7dde9938e069cc
+f33afe61afd90fe049fa0bff3bec62de86fb0dc1f284fe88d924e5b98ae37cbef10affcb
+29d859c9f34dffaff25d99e9c303bff786fd3dbeed058bdeb568fcb1f97ff15cdd1becae
+65bef43ffec26afe9af57afba840e653f12dc0ff88fb95f27cffaff76dffa6f953fcafcb
+40fbd929ed3de850de1eb6c670cba5c0d93be04ef7b6fe78f5cb83f08efba706f94393e1
+9f30ff51f2be6af4b9ff6efbaff11b9efd6df8aebff60c9dddb7ec2ec0f587d790d99dd8
+87faa94bafe09d4ddd13ed96ff55d4f561ff39aedb51a3ed89ffa878eda03ecbaeff52fb
+9eec42b6d899ff6bcbfa47ffcc9438a1e223ce96f8c131eecd86d87ae9b40fd836e254c3
+ff7cfa98d98651e53bdd1fe0bf0595e4b81bb6d830dd83e39658ffbe9ac4fd6bf97affaa
+fb016ab2ff85d56fde47e320bae516d84fe0c1a2bfff75f4cd86dda52be09636a5e8934d
+c7b6e147d811ed4c86d8ff841da5fd9451ed2efe6cf15de401d8c4f363ffbd79faaf61c6
+ed861dbfd194ea6dc6fa79de25e2c305bfe886e019d179d86fffca5de424ddaf83e08c12
+f3b9fe6db5ff46b88dfcb64bff16fa50caf781ffbf95f21bb5cb10febdf7a5d07afe9e5a
+fbcd44fb9cf27efe6df412f9aad079f30ba6d993ed13e25aedfa22c4f212fe95cf86ff6d
+a9fe94f77dff63ed19d948abeb16ccff57fbb6e012d0f682ff68f3afff92c3fdaf49c3fb
+d36dd8ffa5c682e525ffbf86fe3593d821e7cd33e0c106abfaaffe4bf823feaf13d05ef9
+6bfe93f729fe69f68af22edeaf0bfb7af454fe1eb6efd573dc51d2ed69c4e610d86fe594
+d08ce0a546e8a004df61d4ee6be0ad44c601ffbd4ac3eda878dc85d858e006c9a4d387ed
+19fe5ac1ff32cf58d689d89479da9e60eaae2bfabe3fc4f258d03ad927d893fa7ec1fe88
+f9799fda86f068fea73ed907dda530cc57e229dc7beb9345f708ba60f9da52d0b242eaa0
+bffd78f85fadff7bfc93db36e180dd9cd885f293ffabbfd944dc6fd497d941e0a4fe65ed
+93d2aac798d0a5fb3fa3ff25f7bf03acf579ff9bf224dc55f629ffbe68d8f884fea439ff
+80ed93e5b46ded93f831c8ff14f339ff96bcf74eff39b6e086afdd80e0a1fb76fe30e5ff
+46fbcb7dddb868ef9ee01ddc86edaff25de53bb5e023d85bc6ed01cf31d888cbfb94ed79
+d0fe72f4a3fa93fe13e0afc99ae6c21c89b7f571fbc55bed07b5cb98ed56d929f369ff5c
+c802ef54e435dc4eed1c87f4aefd55f17dffc311b9cd35f84bff14f160d96ae5c985d89e
+63fed834dfaf43c1fe7ceb95d97dcbfb34b6c827ebc15ad621fe5bf4d322da6de39061e0
+c2a1d061e788d8bf93fb47bdf022fa4cf125eac593bfa5e0b818f23effd004eb64fb76ff
+c102a5fe86c9ff6df6a2ff38b1fa80ff5af326b760c0fb2097dfb602c851b7ef80ff5df3
+40ffabfbcb0fdda51fff92d0f545fb16d588eca5b9cd9ff4b686fc79caa5fb95c1e59e17
+bbd808ccb066ed79ffa5c1e26ddf8fff27f8bb0aed5be5afc687fa61d0fa67b5cc01ff5a
+f2189eed6effaf78fb9ef6b786d9379ffbafff0dd1faaf51f91ffeab35fb1def6dcbff6b
+d89dca8cd9ac48f70af06186feabe079b0fd8dd4a5c94294fccf2dde9909e8bb66d895e3
+4bddafe279ebc6ff41a7e7c746ff85f1a6d961d027db86d87ae03195fe83f2ce7ae0589e
+e27cdc6affc34ce519eb42ffc12dbcff0ace3bff5bfac679ff93fb26f897dd4eea1f95fb
+c54fc0e99479fe89fa39ff17da7bec0ba2ef2bfb88c6a4d2afe087d94ce4ba0ad943c9fa
+69ffcb8642bfe9a32fed86d8b679edbf73e5add90298e55bff07f563ffbe9ac633baec93
+57c1f438c252ff12f5afe577baf86cf2aad141ee0ef876fec1199dfc930a9fd8f3845ced
+94d643fb23fe75f4aefb16f061d8ed4ec73baff719fec226ffb9f20c97fb86fe93d868e0
+a4e668f583dd92d82ce0b13ce85fb6d539bffb88d9bf2fafed9d44c4dd52d9a5ce77ee4f
+ff93c2de74e1a7ed32fe3ff74efe10f667cefe84e59715ecb608d8f0934cfec494ff49f5
+cd08ffd69743feaff639d286da7cd81ae453fcd0ff1fcdfb0d96d8f8a1bfe061d81eef4e
+9ed852fe89faacc7a4d02693f5d237dcb5f88717d5feac10e5be9aea86e4a13ab9cf9eff
+b677afff9de85ad586edb1894aa2dfbe32da5dcf79f01afb46d9aeec54f17efe6af6c09e
+c3f283ffa506f255fe87f602feaff411ffbf26f399c0e0aa2ffb41ffbf5cd886dcb67bd8
+93d096ed37a5f257ffaacb81f3a562fbd760f211adde699fe29256f9c765d879edb8fa44
+fea6ee83d88e5d9fe4ac66dbff8426ed4c98ff91fa87caff15e2c027cc7afe53efb0e04c
+bdff5ee044cbfb9935cef763ff36afd909cbff59e544c604fad226de86ff6ddd37d0f6b6
+fe6ff9c878f710feafd193f3b8249dff06c9acdb0eed4cfb17d961e5cc7bdc9de079d886
+d872e0ac7ae74cfb1c88f2cc82d99911fd96f009c8ff24f25bff80bde024d879dd51fe3a
+e4c01cafe180befa27c3fe3eb8ed26a5f22efea51496e0c235bfff24f5edc84cf2d4a544
+c4d988fbcc2bd851dd37b6f360afff5be513dd6aff82fa70a3f07dffbb6dd9ed79b0e08e
+c3fe54f87abff17bfe89eec062ed52d80bf2a2fe7f08d83ee81fafed88dda53dff61c97a
+fbd870b5e54297fe87d87ae59cfe3cb1ff1cd334f04cf92affc058f2c494d0affe55b7f7
+5cedafd644c0fb9351e59fd82eccf96afeafef1ae9afda73ff9bf235cae66fb4ea7fd1fe
+64cbff86d852ddb6f36193fb9a56dd7c0594ff8816fbafe56dec08a6e580feaced7ace96
+ed85d993fb86ca34d907e6cd11d8ac2af257b5ff48cb19e871d794ec1fa5d92ed84b9df8
+82fbb3e5be48b5f1aafb94caa2ff37d851ebc298ed0be4bf47d0f879fbd062e234ffb928
+c4ed5dc1ee80ffa9c79aebb033fbb506fe61e57add04d4b52cf481ffa564dfb979fa75f4
+af03dd9c40c1fb935dc4f62dd879fea003ffd144f81493dca10fe576ee85ff2acef208e6
+c4a5faafda3ce0c280f120ff5cbefe48f2c20d9aff2ffb04d73aed4ab8f39fbff2af55fe
+74ed9ac0fe05c586fbbf9bf52cff5bd0fc85f493ffbb15dda52291fe85da2ae04ced65d9
+7ce693ff70f925b5fe5b93ff9f2dedbc1ef2bfa5cd88f96ca2f7934be2bf6bfb16d162e5
+c56eed86d822edacfb79ffca63d91acff520fecb14dec263ff7ac6f78761d8fe05a5ec8d
+db5bcff39362efa9bfe535fbc1affc1acb5ce67ab2d769ff3ecefe75f79dfe4dbf91cea5
+e079daaf69fad36dddafe575f6c2a8e821fe5086fb93c4e41efa62d893f1b631ed4bafdc
+87dfaf47ca0ee079edcc6cffb8d83eeb99ffbc90c1ff03fa4ecb08bbd891dd81ceed1adf
+c45a93ff9e4efa01e746d7e00fd0faa50add5aed87fe9f1cd9aaf952ffc1479feb50a5fa
+8dee7ab4ec5aadff9941e7b8ed32d9baff3397f1bf50ff17e5ae3ac1e09e58ff79f35ee0
+3f8fb6f99ebffe50f8bd90f06331e9c125d886f5d944fb2ef7bf1aebb740f0c25793ff9f
+1cff83d297e0c317ed40afd086e72ee05efdd86dffcf61fb15f39affbe60f93aafe630f3
+78fac111cd55f21fa8e1bf9ff3a8fe38f54cfb32b6f468fdaedb79ccec85d87bffb87efe
+9a37d8f588ff79ca37f2bcff3b9ce0936df9c517c0db25e056ff36c389e16dd1f2881ba2
+fb9312cdaee049dd86c2ee76f987ff1efbce2ad994d47dfec6e94adf0ad9af3ae413adde
+d3b368ed97ff01afed7bd89d64ffc779fea31decc545bfe06dd960ef3bffa1bdf968ffbe
+52ff9ec90e93e4a103edaac767e273d9a5c798fe52cf96df59acf288fc79d5f7862fdd5b
+e07ae99fd3aee56fccb003ed3ae516abfe30f1af22ed51c0ff6ab6cc40bae693d54d91f1
+d90bf5d336df94ff73fd9abed19fd9fb0bed2cbdfeb2e54dd3f97cf466ffa4fa3fb0d854
+df97d871b9fa87f106ecbe2280ff93f179cdfd6ed8ff7afb0bfeba49c6e579bfff12eec3
+3a96e05dbbf980fea6f286f706fb7ed988e26bd3b30aeda4cf76f8b1fe3bc8fa9340ffb7
+28fa39fe0ae07dd987fe01c9ff63d833dea541c2fe93fb1ab7c65eff1299fa3cfec06bff
+85f6c960ddc16dfbc6a5e586f124fba5f709ff78face67b6cb5cb0fe87f35ae5af4bf702
+fe4684cea5f98149d96dffa757e028b7c808d496fc0cfeb131f5af0ae04daeff528cf6d7
+af37c2ff1e9ded9329bf52abd880f2a03ffc51a5dd86f6acfd05f4d668d90fd832ce5cdf
+a5cb1ef44dfe2af6c47efb1ff24cea82d9b95be5d379e8cb7eddb6f05ffb19f161eca52c
+e593ee7cffaff06cd984d0ff2bf278c8eb81d887dea0d0be4694ffa653e2964af217d95e
+e07dd865dcb3e013befb29ff85e89e28b8d80dcbec7ddc93eebeff4ed8bffb93f10dc9ed
+83d0fb7af067e778db7df1cb5fd9ff95c4dc6bcde49e5afad9a557eabe42f8a7eec5f35f
+e214fec193cae935d75ae074cbaf2cff9bf58aff93fcaf43ffb77ad888e092db48afe18a
+dca715f188ff24aff906a3ed9349a1d88bcb9fd681fabf6bfe16ce5ae40dd429ee52a0d9
+8be0af44ff20f34bf82bfbafe011d0f80bfebf90ffabc99efe2ff39c3d91eea053e597d8
+14faafe282efa233ffb749c72690e49513c73eb6e08f38ffaf1de09dff2ec99fe54fa9fb
+88c144f820fba52ffec11188f2d379fbcb68e07be528ffa2d061e02af287fa6eff1eb6ed
+7ae554cc39e051dc24ebc167ddfb03f1aa3fffbcd856ff34c1fbad42d89eed6dc2fe31f6
+baff22f74cff26dc50e0aec799f9bd95fb82ff93c6f746fd06ee88d0b973ec96d864ed86
+f3799ed872e036cf51fb07c1e479cbfebf61ffd8af3efeb75bed40ff60fbc16be79ff3af
+f86efeaff59fff60fbc1d961f7bf3acfaded24c0ff18d52deab17be584edb96aedacff2b
+98e002b5ff16b86cafcb4cfab27efbaa0cc1df93cefa3dfec493f2b47cfa9fd386f2ad34
+b1cb64fbd5840dfa87c89be06ed0f57afb52afdf63d779e167eda7da77f296ff0df552d9
+36ed4bc1dc61e410b5d86acba5fe5cfba5c707feb61fd85ac7ff3ff4acfa7cea87ddaf47
+f9b620f2d02f86f6d071f1c780d893d020e4b216fe5add07d839e054dd2dd8a50193eda0
+59f279fb6cf85fafedb7fe6dffce4ed801ffcb43dc86c7fe4ff47cd89efec1fb86f01feb
+bf42c5ff9a27ef5090dd9f13fb61e6be06ed5aff12d0fe79e5bf229de9c0a0ee1bf851ff
+2cb6cd10c0ff1ff3b4ff0fd0b33dbee9ae5ec5a4d889ffb67bffa431f9a5f477ff9af92e
+bfe40fdb56e279cbff88f924b6ed9213d8be29f657ff94d86de75aa5ebc105a9dd259ffe
+08fa79d986f7cd7ad884ff98ed7bd08def84f5b2fe3dccff86d813ddc593df863d97d816
+bcf58fdf7baff876ee5eaad98ee734f246e005d95dd76ffe9fdc79e5b881ffbc63f7c0ae
+d923ffca92d87be069bbee4affaff45efe3dccacd594c0ed68fea5e081d89646a5dd86fd
+94fe07cdf837fb44ea1dcfe504e0afca52d3ba38e251dc63a1f77effaef44a9fdd77e459
+c3dcfd67ff99b8d486ed03fe97c2fe77fb8aff55f8cd76dea5f24dff3aa8f130ebc047af
+ff1dfa6bdd50e280d8b60ee495fea745ff03fac8f65af29a32fe50ed1cd8b60df9d01ffe
+5bbacf9467f588ff95d90af24ef837fed602e9d029e34b94f1a54efe28f5a5fa2e99d86d
+d936d086e56aff49f207a4e54df061fa39f2b8fb76ed2ed86ddf86b7e593cbaffa5f9ef6
+79fb84ff1fed8dc5f286fec340bad63395edc039fcaff2862cb5cb45ee1dfb34ade0b044
+dc10d745e496ecb93ceec02ec5e694c1e086fb68a5fbd264e5acce17ffc022fa8dfd53d9
+34f2c09bed6489b0dd79e0c0a5d099fb59ffdd9c67edc2a4fa77ffddadce27ed7de4c093
+cdb46daef55a9dfe74ffcf6dddb784e9c23ed9c5fe0ff67efe95f101d986d879fec77dd8
+1ccb9ad584d919cd5bfab9f551ff1dd469fe6393f2c74cd927e065ddaefb02a7d81ee08b
+f065fbc916ffa5d00496ffd86ce9a4c1e06fc7f179cbff6af882d9b61cc76dffac62ff5f
+b805f44dd911c5e12993f69b52fdb76994edc55dbfec7dce85e252afd9fe0fc4ff3afa0d
+f162c8b98840c0fb934be019d82e9742fbbe51fdb062ff18f2d942c9afed84daa60cf435
+fbcd609eff934f86edaee017dd58ffa5fa28ddaf36f994fc79ff02f45aff93e09f16a5d8
+7eecafed0bddc02db3fd93d09bf2c04380beff6cf499ff26eab680e07bdb6aecc14baffa
+07fe5293ff9f40fa18a2ed93e55df387fbb210e093d6a5fdd277ffbf9efe7af3b905dcc1
+34edc4fb459ef32ba5f760ff1dfbd02ebdeb4faad87be586ff37f4d8a6e52cccff81f6b6
+edfec269e7a1d023ecade060beff80fb1bd839fac782e19a16f2be06e2b5dd9e46befa93
+d2b861c4ec7feecb6ce058ecb9de88c975eb3dfeb4f23bfbc32d96f755ffa5db15ed56ff
+1188fecbeb4cddbf59cbaad00afe52f626fa85fea5ef83d98af2cf0cf3d28dddbf39d022
+ffafe04ad8f452fb1def4b98e89035ed50dc42cdfb80ffaf870fd4afdb71ffd006d893dd
+a574fe82b5f467fcc646dbb4e28108ff61f3b30ed8a54a8612e2b20cff79f5c5478dfb97
+10e46bdd8eed53affe5cbaff82d0fb79f825fece87c542f223e69f47ff0ca9fe24d3a33a
+abfe26f9a5d07ad986e06d9dffce75d888ed6afe86d87cc6f09f2493fa9f16f879fb83e6
+93d9b0cd5ee03bd81cd05ae528a5e4bb61fe59f786fca8c83797fe7bb6cb9ee37eddc224
+fac6a5d786fea061e559f1caf765fe16e5b583fb6ef142c7ed5ae027d2bf21afed93259f
+fcafcb93d378ed5bfec7f1d87bf9c787d9589cfed832ddc1a5f746ffc4a1df20d2ed40db
+51afed56c963ec1dffb479fe6ef7bf93c2f288d97ef6b6ed52d866dd0eef4dff03bde741
+aae219fb3ecbafe638faa946e0b5da36d1ed86e02bdb4df21b87fe9dbff579ff9ef57cca
+ff4793ec2ac8a5e961e17cf2cf01ed2dfe67beff39fbaf5ff207ffb61eebc624d89341a4
+e08af2bf3bea4ccbaffe9f0af795ff86f99fff70f6b8d950ea3cfa23febde08732a550ed
+38a7f22cfbb804bcf75afe2bccb68605fe76f8a76df692fe28d59fffb896f369e3c595d9
+18e054dc3ce550ff0bdc83fb9cf291fe87d891ccf360b8fe86f279b6e4089af279cdff63
+f872fe68b7ff51c59fffa9c0ee44d912afe549db35fcb668d8fb7ab5ff08d8b413fe51a5
+d988df8cf20ca5d87be1bf93e075cbf569abff7ef8b7ff2cd85285fac3a5ee1a87e1be79
+d960e406de51d812fe6af282ddace187419ff7b7ffd386fece6cdd7fd1ed69a3e67eed61
+d8f3bf95ec3ac1e10bcb6ae75fd908e544abd905fb3bafffa5fb79fe86cb9fe860d01ae0
+35c659e52dfc4f96facf12d84bc9ff84fbd24bda1eb7ed06c8afe810ceaded61cb2ee068
+b6ff93f986cb93ebbf12f0af1bc2df6ced50ffc29cbffa69ff3dcf5bc2ed64f617ff3dad
+fa5196d5f24be00add61edacffd99724ff78d5f930ffd038f2afcc7bf186e49ac727ffbe
+5e97f2b7d903db7024e5b617ff9ef75093ffce1fd893ff9e30de5ecb98ff7ab6fca4c0ff
+78f78fc6fd79f166c1e98833d0b912bef327affa93ff7ab7ff9ebcf6a9c0dc28a4ee88e5
+9f20de61baff80fc86d4a0e54197fe7af505fe91f388fbc634d851df02ff4da3d981ff9a
+f440fb95cd78f435ef1fe5bf96f8acfe29d288dd6ac5ed27d9ff1089d0a3fe7bd89d02c5
+35bfe093d95db6ca56acfb9543febe2efbb83de7a5cd06edc41dff61fb93eeffc364e05a
+cb09e5bd3ab2f45be00cc6fb7cff14db54edd747f21b93e0c150ed29afcd9cf95cbeed80
+f2a1e26afec732d84cc8f409d94ac91ced62febf43ff67f8adc2f52aa4e05aea32ff79fb
+c25ee093d96ddf47d80aa2f295fd7bed6dc6f360e53bdd79d388d91ee684dd92d8a848ed
+18d86bdb53febf9cfb6eceb65feac1fb34afee3bfeb3f686fc4cf40cfe88f39cdf11c9ed
+6bdb9fcb79fe87f46cfe55fab17ee8c53baf518ffa95f289ff7ad8fb78c0fe85f2ac4ae3
+aff1a5fb2686e494c4fa35a5fe76bbff43e222d8ff09d852ff46d6b779ed86e4af5de67b
+f293ff87e583f195c4d936ed4e93ddbf14f7afc693d81af1ba30fb4bc8a6fa7cffce55dc
+28d09cfbac30fe96c7a7fe04f75bffa1cd5dff75fbc49fff80f594efa745eb0baffe84f7
+a64386e6c877d989d25deaaed081e76cdd1fec84ffb788f819ff4ce00cd842db8bd47ae4
+c1459efbd6edba1dde3ed860ec9e12f19b33da52d2f89336d065c6afffb132ed5eb7dd12
+d0eb86d87cfeae72b2fa90c796ef06ff99f715fea0c0fb25e053d20cd851e104b0fe7bd0
+ff61facf9865ef51f6b06fe4a5d087ff1ec2ed3cabf783ff5ed91fe0b4cd0dfa5ac1ed81
+e0aa2bfab909ed32e261bccb3be003cff790c2e248d91ce0b5fe970eff50f220dc9b16ff
+bb3bce7afbc14ad633e459c6a5ee8bf87fffadf033da17feacf10d9440ffc179fea5f62f
+bfdd66e6ca88ff991cc1fe8bf909e958d1fe81cdfb86e59e4af70eefc32ef6ce3fe628fb
+61b4d93fb0d862ee39aad87ff8b5fe6ff7b6fb78c1e80ab5ed4088d9ff0bdf7accfa4dff
+13efb6e9965bbfe219cba5f091f685ff79ee86e634b2d045f1bf51ebb087d993f20efbb3
+86ff5dba37ff87f29fff58ef2bd9f486e57dff70fbc75aeda0ffb651a5f693fe7db5e96a
+d0ba45d8bf1f9dff86ec67d876e0c0af69e4a5cc21c7acfc47ffaa17ed42e0afd959db85
+d88df49d03e0a023f056ffc891dcaa5aedb761fe94d8a5c0ea6dcbfe7bde8accff5bdca5
+3d93d9a73293de27a3fb82caacfe2cb7c89dff23bedc86d9a54380feaff479fe62e807c8
+52d838d94adea0ff69fbaf79fed669febe4fff7dd856edc779d8fba5d826ca67bed57acc
+67bcd630c7b0e043a9f77cd906edc6e515d964cbfa01fe2cf39cfb6ccaea4bcfaff533fe
+86f6d8f90bf25eff6dee88d184f3bfa2fb6dff7af529ff4cde3bc7f74fffbf79d9af1dfb
+67ff9ed283dfac18f34dff20faaa2df147fa0198f115ffc5f21effc7f462ffd15de019ed
+64e558fb3baae1932bf765fec8e533d80fd09edd88fba0fe7df2a5fcbb10d8bf21ecc50e
+addc1ae5c926e98efea32de7981bed60fd94f305fa9cfeaf45fb9af506a3f0cf23e46afa
+953986ffa2ee2898dd86d874e015b2fa63bdfb0898d95bce1a
+ >
+ >>
+
+ /Magenta <<
+ /HalftoneType 3
+ /Width 167
+ /Height 167
+ /Thresholds <
+d8af40ed51ff24d350d812fe97dd67e0c16ce5c552fbd331feaf05ed5dd033f0a5ff79fa
+6ac0e62fd865df98c3d904e093d0a8bff303e49dc8a5fb5b95ffa86edd7ee2af1eff87e8
+b666df86d934cbfe7ffba126e8c19fff4ee53add9e1eed52afdd6ad879dfaf71fd99bafe
+9fdd7dd891d82fee9dfd1f96f012a2e028ed4393ebb6da4ae099ec6edd7ae65cfd19cbf2
+935ac3fe86fbcf27ddabfb70baff3bf81ccf63fb88dd7bf969ffba8fc3e586ed7be2c242
+adf505fbaf28f3ab0bb3e975da94c89fffba61e046da22b2d977ef9ffe0ff156a2f66df9
+31ff4587fec26cfe79daaed821e0c014f54afbc395f30dfec421f577fcaa4ad603edbb5f
+f819d8b893fe79cff97efeca39fca5f339fab816f247cb12aff337fe74f5af44c9b1ff7d
+d7fb63ce9fc1ff840294f2ab59bcfb41f9abc99eeeb64dd7faa04be11ab3f8875dc5ed14
+ccaac69fffa9bfea38b60be4c11dfa64b6fe38f9b269fbce88d986cbff5fd8fe68c1f73c
+ff4ce41fec86b8fb9ec4ff3bfcbf5aafe586febe42cc98dd72e5d2af4bf21cd23bfe6bf7
+88fe9fb7d387ed41cfaf75e09dbbd00fed8ae5b16bffd081dd70fb07c2ec2aade41696ed
+c40fbed985e5d080e08dfbd45ee0a8de17d0fa79e52eddaf48beff0cd952e3c7fd2acfff
+0cd29fc604ff44d87fff8815e0adc6f462d8bdfe3f9cfb88f35aee47e4289dfec7f2a579
+de95e017cea7c70ce7be27ff5df04ca2e280baed259de088f2accd93fe18cb60f285e09b
+1cf9c64ad823e7abff17c5fbb812ed97cba6ea93bfed51d028ee57ff08a9e06bd8f83cff
+4cfa95c0ff2ff8c33eacfd59f2a3d9608fffc75bd8f54d8cff9c49fe23a1ff60ef3487ff
+c454bffe9559d986f868fe93db70f47afbaf47aaeb7fbff366fe82da93f5bf27ddc2f666
+ff3391e5950ed9afe060d823dd93d879f4cd4c935eccfe3ef25aff6cf287ffa151ed95d7
+1ffad014f24997d8fec216d466fb57abf27dea12d54eebadd083ff94f279dd7ef2a54c93
+ff7ef82fff57fa06afd97be378da81c8f784ff25b7cd93ed79e457a4d97ade98ec0de5c0
+38febcf04398fb76a5e0c062e9c676c1ec3ccda5bfea9a0bed903cc3ff01edacc917ed39
+e4a5cb29f18dff61dd3eb0e421ed5ae666a4fb9540b5ed9ebff948ffcc85ff2ff784ff70
+fa06feb67cfad8ff21a5d889cb9edd2cd979d0fd7dd96febb261fea0c6ff864d80fba5db
+0dc1e03eddaefe6ff78aff3fed0ccf65fe38d056c1eed83cd962e0bf91d59fe536ffa6fb
+3bf3b72cdd5aed63e509afdb2afecc62f01ffe87d7b27ced951ad6afe004ccff20f9b22b
+f694fb6ab3fe0afa50b8f766fbb6e872d89e40f2b99dfbb821ea99d3bf14e588ed7bcbb8
+87ff2bc4e10ed5fe58cd06d971dfa559eb6ccba4ed45d0b987c23ded13a06dc7f660ff09
+f77ffb58f523b0e40afebf7ee0c13fe501f5bff1af44ff96f479ffb82b95deb608b9d97b
+de51e4c0a0fb88ff21b6f49cfbb51bf643ff86f1c10dcaa5d868fdafc79efba7ffc35bf3
+b511fa93d2b854fb2cff50c3f77aff80f3a860d979edd35ae103c4f286d879e5d07eddc6
+1fa4f35bfecf82ff66cd86f27aff5df886c3fb1aff4dfad96fb2fb51f3b67ce093f37ffe
+15c0fa24b6f30bc6a7e631d9f193d0b0e1eeac2fec7ae550d1b89cc5ec62c0f29f42fb2a
+93fc79afd99120e5c484d838b0d068facf47fe97f262fbb7ffaf29ed05d9b1e563cd09c7
+5bdd73e0c35eb891f487ff1ded974bfe14d44086ed9bd183eabf45ff84f1bf93d0a5e065
+dd2ed247c1ee91fe0ca4ffbe9bdf4ddb2efeaf23ff4193fed333e0be21e04ad906ff54da
+3be0afd836aed98bd89c11c1ed73abcd61ed2dff4de6c495ed79d0fe86db7afc81ffaf52
+fb28ff4d88fcbf9ed8bd93ed04fe47adff934edcc5aaf2ca51bfed44ceff6dd926f8c2fd
+04efbe86e378d932d8a01886f393c4f57b4a9df979ff81f393feab14fbd92bd250dbb56f
+d7f279e28ae9be1bf74cff389fe0ac18d94ae602f23cfebe93f99efe25d055bfdc8631f8
+6eff91edc161f1a2c2e46187ffb079faaeef78e7bfa3c4fb870efe9ff64ff238f5a8fe39
+d8ff20fa86db8bd8a531ff43d9ae38e553ed1ccb5df397c0e081dbd147dd12fb3aff69bc
+d88de018cdf879ff0c87e9a5ff7bfba55cec88eda1528deb9e3fff20f5a5fd5dedb3d960
+e848abfeb9ed31dca5e528d84acaea966ffe99fa7ec6fb02b6cb34fa61feca86df79c2fe
+6ff2c48ff9a5fe81d9a914ed60dd6cb4eb88e542fbc3a5d01ad84796e0b64bfa10f5bbd9
+0eed9531c5fc994cfa1b93edbe75e56bc998e177de64cbb779e0afc90ffb64f2be70b4f7
+6ad89fffbd9be4b611e942a5f70484ff66f178b2cea3f732fb60f2b437e59ac1fa35dd12
+d82ee0be08fb4cbfffd464e0c46dbacb52bfce89ff3afbc686df1cd87dfec145b0ff8cf0
+a359f5ce41e017f045a2e785ff9bb9d843abfb25b5e704d951fe2fc852b6d85df4c1a0ff
+0ac0f73fff96f179e55aee86f9afff14fb86d89fcc4c96fb6bd9fe9312dfc3abf0d944ff
+d023b6fe06afff28affb01f69446fea5c1df1cfbc8e504b8fb1fc94afb63ffd170fecb7a
+d9f3aae69bc0f41fe65add97bed96dfeb827df6ed786ee9df779fea6cc98e012a5fb1df2
+a9e583ff07f92ac2e09d0cff96f160e21087fbcd78dd01ffbe25b9ee7cd892ceff61d852
+f315ef93e070cef97fd38aed9dbee497ef1fff79e74ecbabe280d9ac12ceb624ffb0cb36
+e667caa6ed2dff7be9c13fd0b55abef661ff3784b7cb5d9efad861ecce7bbfef7ad95aed
+d06bf23d93eb994887fec77dea88f293d8379ef0ab21fe51bf17ca33fe5bd87efec110ff
+42aed681ef93ff5af6c364bfda48e52bff61f5c976dc58fe16f069e49eed855af7afd835
+a7faafc5eb9b21f75ad585d8fe68afff55f730bced1ee5aecd66ff06f2af30ed60fbaf40
+ff11fa85e093d030fb73f358fe2bcafb6df7d89406fda3c793ec52cfb95ff104f8a0ff1c
+f4d67fd989d1fe03f9acf15394fd8f4bfbd552e59effb824e481d9bc61ffb6ee9a51f53f
+e009da78f9c247bfdd93e0a2ed88da85e093ed2ba5e480c9f502ff50ce1ee0ac3aff1aaf
+f280d891d8af42ff86d094d88ed8b646affed03fed6afcd1883bff4fdebe86ed6dfa35af
+e507c0e19bdd7aa5fe935dfbbb9cd7bf64ff87d822c9e57ada68cc3bfb6cd987df1ecd99
+ed64bee13987f4d179f25aff08f784fea5c0da5ede86ec9146e526ee57a9db7ee02ac2e6
+10c1f29b1dfeb217c586faaeff0cfcd02dd816e0afd49fc1ff85ec1ade89ff79f92dfb42
+ff52f20cff61ccf76bfbaf5ae9bc90fab674fd96c7eb69c2fe51fa1ee594c1ed3af74ffb
+31ff94dd17b7d993c9b623e5c09fed66fed039e0abed79c6fa8849fe0bfbc43ac0dd29e6
+4ffe3bd9aae054ff88b7f648bafe9ec2f10cffa5b8fa79b7ff47aafec04b9fe025dcafe0
+6ad819e54393fcb33ac6b7faa6ff96c0f331ff61b4ff79b2da3adfba6cf288ed3ad84d9f
+e053a5f28af983ff25fa63b1cc51fe9bf20cd85acd6de099d2acc69ed8b646dd1bed9dd0
+63dd3dedcb05e079b7fa0dacdd87ef77fc02afd97de0a7cb68f379fa61ff02f859ff62f3
+0ad2b81aaeff9316c4ff53a2f2cc73d958f19ff96fff84db7ab6fa0fa0f36dec08cfa4e8
+17ed4fade0c451ed44dd02d298db15edafff66fac23e94fb9df27dffcd21f0a5ff09d052
+ca13e06dd888c8ed4bd0f867ff79f9d746e0a5ff93f4cc7af7c662dc35d05fdd93ed12fb
+a5c761afe686eeb9ffaf1cf84afb30f386ff8ed884fe29f79ffe7aaff45dfe40d39aed37
+ca4ebacfa5f227ffc106ecb922e6be91c2ea7edd93d983fe73f893f14bc1fb9a2bddbf1f
+b3eb93d279e010d0aced09f4ca6aedc635dc80fa8bff68b1d786f73793d880ffa0f86af2
+84fb73de2ed9b37cfecc20d54bddbe6ae079d866e085fe7bf79cfe4cf70793fb9a1eeda5
+cb0a95fec55eca10be2fed9702fbaffe7bf1b64bbbd97ee02effcf36fba8017ad9c193e3
+7cdebf05c4ed39da74e3c013c4e52cd6bba3f06dff7ab6ff9ef82dfe5dd863a2f981fe9f
+cf4af233add829f045cda5dd3fe45eb5e073d0f678fd87ff3df825ff90bdf64593d8af40
+ffb785fea5d85add32bef329ff98bffe1ce4c127c5e031d85ed088f2c017e45abcf479fe
+af30f795fe49f59fed2fe9b83db5d994cde53eddafc633e4aeec8620b6f78dfed972ffad
+d844a4e606fba5ff3cf75df1be7add6ac9ecf559fe36afff5e95fea153faa6ff4baefb93
+54ff68f91dc2dd2fcef315d86cde86e593edbf43db58df79fec597fb6dffc19ffb1dbeff
+9ec3fe0fee5ab6ea43d69bde69d8af38ec6bc9fe60f88ad422e54df019fe75c8fb7cdcaf
+5be578f5af7afc86b5fe9ef40dfe519eff8bf1a53ce1c483e5b60fc7afc51cb2d774dda5
+f01fff63bcf56bff83fa87ff42bff2d833de60afd03ae583f0c86ed886df70ca97d4b01e
+f796fe4da329db8bd0f114cbec76dfafc70ccf94d961f2cc9bd980ec57affb9660e252f2
+99c93bfa19ff93c4f72aebab0fd946e5b307e86df281cb2af26bd693ff09caa5f216aff0
+86fbc19cff29a4d91de59dfb7ad895cc92e0a603e847cdf209d9c53ae653ed12ca4eaeea
+92c9e945d80ed8ff9102fb5bffa3f337fb8eff4df90bfc79d884ed2aa6d908e055d86acb
+fd9262ff9ff321fbbf5aff1d94ff5bf629b9ee07fe87e95bd810e5c5ff85f965a5db983a
+f820fe82f46df123e6b439f50ffec593e504edafc0feaa09ffb57ed975e10cb0d45bf686
+ffa5cb65f693d932e068d986e239db7ae586fb6cbefe46d003e14eceaeed7bffc35dbff2
+31ff5bf73ff1c087fe6ba3ff6699ff86d9bbfa79ffd262dd33b9fb87f6b74ebfef93d726
+dc79d858e2bedc83cf8fe551fb9ec3fe7fce9cf125f6a313e8afc74fd6b56dec95cdabe1
+35edc39bfe54e0b445b9ff92f4ac724cd809c6fb54ffc1a7d25ce135dda5ffbe7ce08ad8
+a645ff75d785ff2789d1e86de0c148f49ffb6bff98ccb753ee20feb74dbbffb2fa03feaf
+f59efc51d81dc8e662db7eff95f36dfa11cc49a5ea01b3df83d696d879ffb523e0c13fed
+bf0eeea53d93dbaf38f97effa566e05c94fbd060df7aed61feafee8627a5f160ff2cccba
+18e045ed5ffe7ad374ddba5afb03f186ffc20ef745fb65cfb113e589d779faa4dd27d968
+cbefde8de9af26ed7ae16dedba9afbb74eca06fa51ff32f2bf9ff63ad95bccfa41bbf623
+feabcd30bded41e31bfbd181da71e3a0ed8654a6de9552c622afed8dffae34faa5ea57d8
+21e0bf93fdb0f686ff75c2f513fc2de54bd0f480faaf79fbd170feb6f51bed97c1e505f2
+ce1effc3299ff932ffc09cce0696fab6ff10e4c393f15aff86fab6da38e6afff50f9cc7a
+d967d838e0a2bde58cbafe7bf9ac2fffbf16f260fa81fd1ca53bf458ff86d7b60bf640ff
+16cd84fe92ed9fdc93ce86e01cc2ed93e57aacee66a2d888eb86ff7ccab27bf29331fe97
+f23bd812fcc7f43fd0ff79f9cc32d94df397ce10b0f57afcb538ec5bde2bd852e33ca5ed
+adc986fa9f52d915e3b92c9ed922e15ccb66fe26acd97bbeed79dcaded86d8a517f851ff
+d955e07dd89f47faaede71d8a51095f2c20598ec2da5ff90f59bfa85fe60d209ed2bdd51
+d0f269e59fcf93b8eb51c0fec79dd1b1e447fccb92db82f260e928d85ad324fc5cf76dff
+a84afb13fec70ed8ff5bf916dd51e505fed750baedc009c4ff7be5a42c90e0b115ebb864
+ff98e469d980fec63cddc086ff98d287f099f97dfed88b50ffb609edc394ff60f6c6ff62
+f894beffa3d586f34dfe32aff848fe10e04ff2c593ec75b1cb3bf762febe8503c1f327ed
+b8ff4c88fbd97cc0ed19e441cb1cd84af293fea1c886ff82b6ca4afe40ed09d099e578f7
+03fe3294f2a46afe51d0be9ec2f57bff86ebafdf06d983e8b886dd53a4f89538c679cca5
+f288d9659cfad848a7fa79afce47f8b6ff6cef88d842e5a902c1fe25f15093ffa319ed51
+d909ff4bc818cfb627bfe07aead162fe34a7dd934c8aecae4add01ea4bfbc693b8e66cd1
+93cbb67ffe6de539bfd91df38dc1e52eedc9fe53a2fe6ad580e1acc83caffc67d09ffe79
+ed7dddaf35d862ebb53ced04fb88d8a5c2fb62ff27b54fe081edc41bc0e728affb06ff3e
+a5e012f2c143a5fb60d221f3ca6aefd076e3b1ed9fff2bbefe3ceec31486ffd360e027ed
+be86d80bcc49fbadf27cd2f979b1e086caed61cffa79e37bedc0a5fb94ee5fdafe0ef646
+a8e081beef04d7f2c017c4fd85f791ddaf15ee5ac4ff07f35efbc136d0a8ff60fb86bcff
+15aeda943f89eacb86db33fb21f759ffd31fe07ed95cdfafff13f7c295ff18f8d46bdeaf
+f121ff569de07df2d8ffa0cd5efa93ff5fd5ed79e293d9fa69d0ad67ffcb7eef97fe9f34
+ffb026fe4bfa01da57e06ad0af76ffaded931feda0fb8eff61f593fea5c71b94fe28b7e9
+40bcfa0dafe02db5c736fbb626dd57e086ffaf71b3cb93ff1ef7d86cffb642fe9be53ad8
+53cf31fe9dbffb2887dfaced20e3a4f40ab8d39bed4ace9ffb71ffb6f4aa16e552ed9fd9
+79e0b963f497ff09f8c02fa5da80e357bee14f9afcc13895e484d2f537c5ad6abf23fbb7
+35e078d99f56f8b54fc52ebbfe34ddb71ed93be050bfd982e093c1dd80cf86fb96f40dfb
+b837df57caf8af4fc919d5b536de5de677ffd96aed62c4ff75d19efe83f688fea2ca69f2
+7bfec205ce42f9d828ed5ecbb13aaccc79e062d879eea5ff7df186e56ed5aaf69643d8b2
+69ff86e654fb2cafe47ef236d70bd95cd0f878ffbf6cc4f20d93edb346b6e25489fcca68
+ff27fb79cdaaed2692fec44af818afd8fe10dc79f086dda5c1f708ffc925dd86fe99ee79
+b1fb7af488ffc386f207fa4cf519afff31f0b636b9d97feccd7dfcbd40d8ff7ff653eec1
+9cf22dd8b037c8a5fb0faded2edd54d864d913e54effafd837aaf789f0bd65fbc0a2fe79
+defc21f3a1f90cfeb828afe05fd00aff3fdd5fccff79fac73ada72f18ac8fe01d864e7b6
+f979fd2f9cd8a806fb3ba5febf33ffa3fb79cef39d4cf086d29ff20dff79bad96ee0a8cc
+94ed4b87b5fad956e512fe508fe5b863fe9eed0fd84ae5cb03d84de2a117fbafe670bdd2
+9de25ad868e0a5ff4df71f9ce50ba4e79402e09bd96fff0faffb83f79ff24bcf99d96bfb
+93f405ffb9f17ed89d1afa87e64bdd159eea954ee508f2bf68b6d334c695ce68faca1dfc
+a5da7aea9ffe11bfe51b93ec9ed624e058a5f388ff9c47a5e087c6ff43f4c295c6db4ee5
+ca82dd15eeba24d8e602b6ed53afdd5dcafe59f50dff65fb78bcffcf3eafff9ed076edc6
+4496ecce46aef66dffbf64f188fe6bbded9355cda3ff37fc79f388fe12e86ed888c6ff6c
+d0fe79f2bf62fe29e584dcbf51e006db7bfe86f33be5c25daceb9546a7fe31edc05fd0b1
+ff74c7fe32d0ff84db9d49d9fa7fff6ce345edbf7ae864f542f2b725b1ed6a9fcffe5af7
+83ff94f9c04be023bff5d01ef166b7de70e25dff86fa9326f960d8a951ff6ba5fec733ff
+cb82faaf1ceaa5ca8fde24d7ee0295f51dc84aebbb29fdabf31d87bee07ed9af22fbaae0
+2ad3f940c4fe11f05edc93eb26cba7d093fb27edb044f2b751db30faa8d092c3f35afe93
+c4ff60d320df5affb519ffcb3adeb6e079d388f6a5fb2193f2a95cddaf1bed56cfffaf0e
+e650f0afff9f05ff97d88ccb85ff93fa3dd9f92fbce009cb4fd814ddb37afad85a91ff99
+e50ea5fe24f0b617b0efd07ae986fec596c0f25f93e09e20f13fe397d57aed53bff2ab60
+c1e884fb91f786ffaf79d969ffc5fa17fe36f49dd53f92f6b368afe474d87de0b50ac6b7
+fb3ef64dafdd7afea3c826ec88cf5ae014fb42acd820eb43afe087edc09dcd78edbe81f8
+86fd0cf74ee501dc6dedd739ccfb7de593c1f98630ed89c89fd81e84d0f452d92dfe0ed8
+4be05bcdb679ed65a7fe90f27cfe6befc44394febc3ad861fbca7dd78dd981e05abeff0c
+d83fe01ae43bccf677fabc86d86dff43fa15fea43cff99f955d367dc0ed843cdf105e3b4
+4293dd95d05ee984ffdbc40affd01eedacff44f89fff6094d982c7f15ed804e45eff72fa
+9aff7bf0bc94ff79f8c09ff117feaa36fb08f6a548dc20d86bd697cc80ff52c7b77cff9a
+0af149fb3899e0bfa5fe29f587fbda5ab4e474edafe574f0c1a5f303ff93c5dd61d828e0
+acd01affafeb04cdee84edbe32f750fe37f8a2fc3f9cf2affa72f592feb610d947d0fe03
+e7c5a9bfd977e0c386dd2be5b9ffaaef7ce29c66fbc579f2d258f186fec00dbc487eedbe
+86fa9a2abbcb87d841c0ed07ffb61bffa8f983d79fd80ede38afd34be706ccb668ff7ad8
+6dcbf186e07cd0fb6dffaff356ff28f1bf9ffe14f54ce1b0c6a4d1b1fe16f645cbaddd3e
+a5bff132c1fe9348bffb9517fd7ed8af45fc12f3b8ff993efbbb5bd880f78752ff1c9ee0
+93dd73edbe01d2afe38651c1dda75bd87dffb1ed62a5f3932aed509df761fb0daffe8d38
+9e5ac3fe22f9c13b95fe23b8ff01e53da0fad8affba452e762c0f26dfb17f3a7fb79dd68
+e19ecb3dbfe623f48eee7ec8f66dfec3a5ed3add26e593f950a5d85bfe2eafe0c43fa0e2
+8dd9ab36ed62df9ed86bf427ff60ed77d986eb72fb80c6ff138ffa9b18c5ff9f36dcc460
+e334f19ebfe09a4386edca74e79efa38aae0c1add8fd57f213afc986ff6ef41fceff9405
+ffcf26eca02f8ffcc34bbffb88ffcb30d894eac950d8f3d2ed2eaed85ce9afd96ee661a5
+d96accee8756e11fcfff2ed8fe57d999d584e720d0a5f347fd7def9664fe52c640fcb61b
+e4982dfd74f587fb5ed311beff1eedc395f00a93ecc115fa5dfecd83d887ee2afe93d880
+da04cd96ff63da0ae54dd9b7ec69ddafe06bcff96dffa0bbfe86ea5280fbaff80ca5f52f
+d489c1ff29f24a7fb4d092ffd840e95bdc88fba534d8ed4daffb6ad9b7dd18e29fdb7be0
+07a5ed80ff5b93f1be0883b7f672ffbe88ff18f79fc4fa86ffac1bc8ff8af2769ee09305
+b5ed35fe5cc797fe30afd86dde2bfbd986b4e9a5cd60ff50bbe08ad657d9c19ffface67e
+d9a142ff62bcfb70ffb677e01ea5f80eff51c97ae453f2b9fe5be024d488fe79f8955ec4
+ff3bf752f208baed2be74ed01bc2ffd822dd5fd6e554b5ff0be065d99ffedc05ee44c177
+fb9dd727ec4fc2f282bef879c1f33bfe79f75fff23f659c2fe46dd1bcffb289bffdf61ce
+b209ed33a5e0bf47ec28d849d5f89b34dc4cf8c95ef1c5ff79ceaced46df72ccff11f899
+d2bb08c3f217ff85dc88cbfb62f21bff9c04f253ca38fa64f5b97de5d04eda37cbf085c6
+eb6cddc096fbb717ffa33289f3aefb56f1a0d024c0fe02a5d886d793e05aafd479f593fb
+a53bb7f292ffb76cfec87aed94fbb619c491fabb98e6b51cf37bffbf93e460fe27b2e10a
+ace552cbbd93d3b76cb0e479d687f2af64c2e045acfe3ffad880d0fb5493ff7fdd79f294
+51e0c1a7eab10efdb68648b0f71094ffb6f45792edae38ff5baffb6fd956f326edaf0bcf
+b2dd79e4afce88ec95c1e001d6fa239ef2b1ed9926fbaf45ffb460e53bedcb71dcb5ecc7
+3f94dcb03eeda5e07bcef348ff26fd7af686ffb706db58d3f684ca4ac51dee9c35dd50d0
+40ea87f039ce52ff2bf9cc63d9ac44fe11d19ae652c8ff6dd296ea05ef40fec8f232fab6
+fe52e5a2ed6df91894e69052f2b979dcc20ceeaffe07c0ff6efb1582fe93d831fbcbe063
+e5d68502a3e2c34cbfe088edcf46e388d47ce06af893ff38a5f74cfe3cf724fe4cafff93
+58c5fe850e88ffd269dd9ad028faa5d288aff95afd1b84c1f80effc286ff35f563b5eb9e
+c7abdd1bd93ac8fb88e56dc608fe94f7af79cdf988fe7df5a0d662fe7add86d86baff005
+e597cba9ed66c3fb7fb9ee20fa87ffafdf861693d89c0aa7da36ff12b6caf3d828c7ffa1
+12fe3cf2a9cb36c7a4ed2cd0adf1d93be46dedbf198effbe43f1c8fa29fd86f669fa2184
+feb8f635fe9fd042e15fedc886d87be0bfa7d090dd6bedb6e43dbff9d84bbdfe03f789f1
+bf07ff4ef209e59dd8bced61d866e118bfd986e420c973fb4fbefe9aed8551f123ff97e9
+62db2ad8ff02b9e022d8b013fba9c0e80bf2a2fe39c3ff79fa5af638ffa518f2459ce0ae
+38d7559efab6ff4df6b9ed7ad072d6fd7a4da5fb9646e2be86e588fe6cf97de568b6f542
+88b9c8a1ff4b9be8c3369afba65193dcafd80ccca5c0e09e1194d8af04ffa5c2fbac27ff
+0dee9e49fb14f331fbc11887f0d460b8f3935ce0ab55d979ed94de81d8af4aff2ca4fe95
+f391fba955fa96ff5bef0be66dcb5faffeadcba4d837aefbb5ed61bfeda25bf26affca58
+e0299bfbb44cb8e084afd524e08ed880e0bf93c4ff6fcbfe7df4c230ec79e06fdc2bfe97
+f2a73bd9ffc061efd66af3cb50d924e094d84dfecd7ad8ff5bfa03cfaff571feafea23d9
+b7fe7b49ff9df35cff44f2b5ff71edc186da1881e793d8b76ffed996e47dd8a451d9ffa1
+2eff9d12e7cd7cffc239fead38c1ff5ffbc87beaca44d825d077e0c010dd79d894d892f2
+26f9d413de43fe7ff5dd863fa3fb8a49ffcf85e53a96f37bffcc6ad988ed12fb47edbf66
+fe07f354fd64e811dc59b8e50ada93d0af1eff94cb5cdd03c5f78920eab406b7fe279fff
+7ed358fc1cf0a510fb9e24e593ed61dc2cd754d986fe61ef13ebc384dd3ae5adda63d829
+df49f75cfbbfd83efa63f5c134c552b7ff60e0f69467cbea79d8faa63eee1cebb369d8f8
+9f23ed9312f6b67ae485ff5df73afea3c3fc2df841ff7ad8a176ef89ecc250ba15c2ffd8
+10d0e49618f9a5bfe00fd9b948f11fffc595d8b674ff9fb9d29ac82fd8affa7af628a5ff
+6bfc41f8ca62f084f990ff9f59defa6dd9ff79c7afe80bf6a3ec79cb61e0c052edafd340
+aafb87ff94f809e475d080e093fb1db7fe9301c1fb7cf9a5ca96e0308bff9dcaaf2ced93
+ff86ef1ec9b408cffd23b2f64283c7fc87d87bfbc51686e6d075dfabce4eff02efaae898
+d979f15289e0afcaa5e458ffbf4aff0e86f9d99de55093f7a93cfcb3c852ff80faa575fe
+86e5af5bfa2bf4ce0edd42f061f8a8ff4b99d889dfbe47edaae06abbe53bd81ed84dedce
+80aacb3f99ed32fa60dcb63ab9ff9afa81ffaf6df979ffc715df5bec7acba1f427ffaf45
+d3a5ec61c5ed9033e9bf5aff1daff2b84df112ffd55de002b0d199fe7afaaa5ae56dd9bb
+fe28afe04cdc32f2b8ff47b2fe32fa6cf18bdab741c60ab6e530bdf39a4dfe02c1f31ee5
+9ccdafe19431fd71f3cb66edc76de084dc27d75dedc334d8be3cec7dde9460f77efe86e0
+1bd978d0f235ff62fbd08823bfff11affe97f386fbad0fe52dfeb0f786d893d083edabde
+02d539d81fdfc206e8b767f3afd01fbfff3aaedb5dc9f76dfd2eaff74bffcfa00fef86d1
+fe6dcde57ad984b3f99fc0fb4ef23edd33ed87c3ff068ada9bf871ffa8e55f8ecbf36abe
+d698e41fd252fe93f8a6ff5ad0ff14cced78de81b1d062fa34f451ffc0afe027acfe20a0
+f609fe67f5affe06db9ef96cffa1cb51ffc2a6e72dc6abfe93ed01b6c6a2ec1396f4c679
+d99fee59d068e034c3fe93f17bd815e44cff1afb52fe88f484f296f363fea3cb28e29a47
+fca5f159b9fb86f39a08d894c0d979deb76dfbd569e0a543e80ba2fa61ed24cb42e475d8
+86e5c49dbefb43aff2d051eb16b7c90497fbc10c9fe01aff4aadfb93f378e030d882eca5
+6bdd80b7f63cff4beeb993dd7bd66ddd0689ffd85cc5e77bd29dea944ac0e461ed19b2d2
+03fdb123ed48d0a3e55ccd43c0ff86fa50cbafe057feb04ffb85d907ffbf9cf460bf47de
+62feafc87ae09cd826c95ad9b846b4d731ed7efa73ffca85d97be5cf16d840e6baff51f5
+0fff9e1de444acfe28f7c780febe39dfb6fd7aff93f629feb662ff17d693e061a5ff85d8
+f55bfad045edaffe7bed85bbd95cde28caaffe61f41ec5f748fe25d69fbed884fc05c1fe
+23f2a5fbc54a93f2a53aff53d91ccbf183b5fb93c2f47aee59e3be86fb6eff09fa7af6a0
+5ae421f187fe6dd803edc12ee578eda652e721b5dafa8aeea05df4b735f266f975ff19fb
+a5ff79f693dd39d9be0ef42efe449ef07affc260a5ed87e067cbfe89f3c592d97abaed53
+d0ff8f4ba5dd06cd61edc10beb80d971ef20fac130f24c93dfbd79ff87dd37d862caf508
+ff74beed0f9eda90e07eb6d89eed88fb11f731aee3995fe8b34680edafe50dfbd992f286
+fea73dff25cf51ff33e091d87ff3cb14db90edafd91debcf7bd961d831eab5fa74db97c4
+fd42ccfb79d1ff7d01cc39c0e609ffc691dda5eb93cd76dd0fe1ba49b6fea560e093d889
+c6ff61e0ab1cf9c62ed749eebd39d97f14f151ff0799e09316f1c2f769ed82e0a154d8af
+f83dfeabce78e793cbadff2c9fe921d55df7a5fd3c88e0c4a3f969fbcc38ff4dfa07ff67
+c75cade086c9ff4ef8ce86d8ffc12bfa61cabb65cf2dde60ecc779dd88e6a2cc64fa1bff
+3f98e9b650c63a93ffbb30fbafff80f59f4b93e55fff15afdc930ef29f41eb98ffaafb7b
+d99e59fe0ed03de05bed86d067ffa1f00ac7f979ff4bee04b6d831fb89da82fe90faa979
+f993ffcb78dc9fcdfb37f9afd8871ed7afff37f7aeff5e93df9f5affb949fe0ee564bffd
+6ad97cecc011d8afff9533e743d1b779edafc9a5ed93e41efdd139eb5793dca535fe1691
+e0a6d395ff36affe9dbcfb13affa43f3af0ff19ac1dd75b9fe6bf99ffeb2df5596efc50e
+a5e119d2ffc223f3bb87f750ffc880e0afc7f15bd825f24abce587ef7afe9ffa2efdb3ed
+22d85fe0983aedbb9dc0fa77ed95cbb752e56cd90bc7e623df4cb3fb2ef461b6c669ed3e
+ffbcfb4999d96ddc14ccf11fcbec03de99c4dc7ef1ce0af2b5fe2e9afa85f059c6fb7cb0
+f219ff9724e65acd3baff2bf75ff9ff5d11bebc36cbef451fb1ae479edd701ed4ccd9fe0
+86d87bfec05dff2faef0cf09d837e518f280fbc24686f3d876fbb83edfa5d047e197edb6
+62fb26fe6a15dc7fe093c9f62dd84dd9b416b9d8943da7f78bfb7dfeafcc15f862d2af4e
+fe0ff5d025f19dff9360f2c2a5e47ed786eb23fea5cb80dd5093d1f223fe86ed7abeff6b
+b6f686fb2ab3fe4396e0a54b93f4cc50e226b7ea04c0fe86dd5ac6f78afe7bfbd88643db
+b80ebe61ff79fba4ed7dda86cc4ff7b674e16bff8ef645ff07dd36d9a5d193fb489ff786
+dc7bcf6ad805e8affe9a39cd5295f67afb81ffc037d118e5a3d692e0ffa5f853ff1ca9fc
+91ff86f2a5f56dfebeda4ccb19d952e66cdd82ed26ffc783dd71b2ff5dd83bcefca042ff
+04f158ff94d85af20afb9fc2e910b4c8a5d72dfa46a5e035d055c0ed79caaffb3bffb8e4
+60a7ff7ecffa70ade03ad86deea645d819dfbe04fea8f069d8fb91c0df3fd804ff3cb8fe
+a1c626ff90dac022d1b679ed87fb6df61eeb63c7e15aebadff4df8a4ff6dda5be0adffbf
+ed0cc84dec07a5fe83f5c15aed38bcc53db5d287edc04fcc03e03bd851df07e977ff9ff1
+87cf30ffa5fb52de9d3bf2a5fb42bfe487ecb015bfdd87d89bcc10dd78e584d8b82ffa79
+ff80f45afbba98c3fb85f392ffa54bf916ed72d188d901edc71ddd9f44c2ff65f6a0fe0c
+cefd79f3a561e78ccf28ff964aed26a6f266e1c497e711ee87d956ed36aff27efcbf4acb
+98e352dd83ffaf12febd2e93edb63eb9d72bfa8bf22686d6a5ffb66ccfe66edaaf43fbab
+f867f293fe0ce562dc96f3bd6dfb7eff86cdaef226d661fe96f3b822b3d886e8afce1fc5
+ea8601fa62fe94f452f732fe64f6affe31afff68f096db50e03bd089e552ed08dd50d91c
+d5e585d892dd27f261febe81f279feafee18dbb729b4dd85bbe04ec8ffaf55f9b67ae5c3
+99fad881fe9f59fb75dc61fe7afac19ffe51e410efa5ff1bb0fea8c938ed96d274fad823
+e088ed85e5c007ccaffb5ae532d8f29c4ff921ff95cb05d09d1ed96fd883fe28fa60e79d
+c3ec1db7f85e96dc81ec01df78d891e50bff5af77aff5ba0fed8a9de2bd86fe0c17aafe8
+9250c0efd043e5c602c4f79fbeff0caeff87d37afe9ffa6cb0ff40f75bff7cd8ae3afb52
+d90ce073d88af182fa4bff309ffa9330f1d80deccb35fe09b953cb17edbe2ef3adce1ee0
+a60ae570d688d862e070f2d98b02e5b660ff40f1c265ff98fa13fe4d9fff7be978d988fa
+931dfec886d865de7afe5beaffa7f751f1bfa4cfb841ff2dafd4e537c5ff50faa5c959fa
+3efebef26dd519e092edbf35c44b86eeafff1b9ffbcf19d8fa9d1386f3ac78fe61b629ed
+74e3cb3ad966ebc030b8ed0fbcce9ec7a7e718e295c0e886d593ff39fb4dd599ed6ac1eb
+14d0e265a5ff9a5cf379d3ff93f6b279ffd88946ffb568ecc393f521ffaff929c6b740d0
+ff58f8cf81e0ac0ab4cb50afdc79c7ed62dd30ff16f14ac3e2b83bedaef331e5b0d887c7
+32b6e19543ee12feaace96ed6993fba40de0bf2cffacc1eb8548a2dd86fe58d007fd93f3
+affbc64696d2ea4088f3a83be4b4ffc529b9e193fcc295f94ba1f293fd1ea6f27ec3fb61
+f306fb48b9fe86f020a5fe2ff35ccf9fbee51dcaa9dc6effb97efbc542bfe08adcaf47e3
+33dec2259ad0ed79c9f54dff3fafdf9b39c99ffe87f769beed9327fbc168fed986f6d137
+eba51bf8add198c9bca1ff865cfebf0c9fff9027fb4af493fb04c4ff88d886e275f70bfe
+cb44d8f5ae6be563f21199dab5fe37edc29ef5b578d863e00d81d9fa68bbffd85bcaff7d
+d94992fad615d845e01cd7affe14e05fc9ff4ce338a5db81df79ed88d04cc3ffcd61dec2
+9aed0eff87f85ffc02f49c44ed21d986f81aff2fee86c0fe6af8aafc07b7f92f99d984cb
+fb6bd0fb7ae859d816e0a335c2dd9e1bf3b849e21f9ffe5ffbcf9353fe3ff755dc02eda8
+d973f1d878d2ef9ebe62de78b0d967e54bf219d855dd63afea8952c7fe93d888cdff2af1
+7fd0b126e245cbf821ff9dc1ffa426f19009b8fb9621ed6be7c1559aff7ef56ffe68e685
+d28cf7aa78d98dffd123feafcc1efa6af6a44393f2a850fb79b4d846aedf93d488e5c3ae
+fe61eeafd570c9a9fb01afd941ed5ce570d0aefe15f3a503ed55bedd0af275ff7cfbaff5
+79feaecc85ef79ffc683dfbd42d8f2b6e084eb79fb93d024fbb339f951c311ecff27c1fe
+36f89fc979fb88ffc093fa1dffd99916ee33fc55bce0aa08f689ff7cfb985fe7bd4df239
+e5bf58c5ed934be0c2a4f905feaff05be9c59ebbcb38fa50d928edb80af5539ce6943eff
+be99e010dcb5eb03ffbf24c5fe69f6cb2cff51d917ff5393e0a33afb93f552d09ee980d5
+86dbafff51ee7ad865e0ba7eff26a5fe92cc95d952e10ed84ce53cff0ed8a645f4078cff
+af7d0fa5fc20b5ca35e8be67e59acba8fe89b8d1a3e87bedad20ffb63eeda52df25fcfb6
+36f9ce7cde79f2904cfbd8b64ab9dc16edadcd79dd84d86df9a5fe33cef780fe40bbd386
+de1fdbb42eff08f3af7eed98ff5cccea93c7f261c9ef64e534afff83f96dd07ae09fed3c
+e4bb73e885f279ed86d9c107ffc25be50ddd79ff51fa12ff942bc4dd1ce4b6ff48f7ce92
+f0d24cdc32ed21d06fff96ed6dd89ce77bfbd46bedc4e426fec4ee67cefe88f87dffaf4b
+ff09e057dd3a5dfb0ad04ec2de84e4cb6adbb3c79ee57bedbd5affa5d51fc1ed943efea2
+f26ad556ff33fa13feb4ec03d861e0aa0eda69e079f148a5ffc062ed93e06aceff10d886
+dea54afb32b6ff14a1d87ffec961d82fe392fb55f487d1af06fe9fce20c7b2f637fab56d
+f29fbaff99f01fc7a4ed58bff361a5fb8f3794da9f34e577b6fb6bf7affd81f1c02faffd
+86f55dcb21afffa04f86b8d98d38d8b050dd61d90ef2c493ef7ffa93f3e082b5ff93f561
+fb08affe15fd4cf604ff4b95e4af41f7a8ff65cae86fdf0cff88d97be0afed883ea7fb8e
+f27cffbf9ff529ff99c4e4358dfdae42bffb31b8da59f925febe7bdd83d9aefb28f2a546
+f3b8fe5cd92ad8ac14fe5cf1c33efba6fe41a0dd7cedce26de46ce61c5aee06dcbabe37c
+febf4af1befb1dffc15dfe13c3e5a45ac1df429efada01d032baed88e030d9b4fccc48fa
+a7ff79f318ed87d76ce02fb9cf20d97819caed61dd2abad29ae686ed93d979e0a4c1fb0d
+f0c286e103d9a21ff9be97c3ec29fcc16196d9b7e04fcf25d64ded3badd8b511fb74f4d8
+0dd1f97bd8ad78f0a4c2e56ad0ff01f843cf5ce071d1e5951c9fe9aff779ffc098d8b57a
+e065d880e0bf12fe4c97fe88f47cfe2df74bfe25f53ed908ea9cd677cbb16bedb086f296
+2bd8ff078efed28861bfff8ff948fe96f761f10495e56ee009d3bc94c5fe41f8adfb70fe
+a5c0ffedac40fabfa4ff4bf238d856d027fbaf31dc82d46cfe2fbffa7cffafc832fb4ca5
+f39306c6ff24f96dfe9af586fb93c4fe51ed93d0be4d94f69e51ec03fec43aff1a95f52b
+b0ed9bbafe93c0ff0587fcb6f5860cc4ec4ae137fa22ff97f30bf957ff94cab1e75fd80f
+e4a5d882ec96d87effa2cd86ff0ef657f2d307e0c547bfec60c6afe7a51cf7acf05ab3d9
+9fc70dade47fd8ff28f6be99fb4bff2ea6e09115c1dd34e4499a64fe88cf14e080da79fa
+7cff9be084caf961ff29d993dd9f4ee637ed78da86e5b969dbabed55e59fcb16dd75dfb0
+19da86e06efa27ffb1e068c9ff8adc84f3b26dbfd979e064cb77df11ed468df4cb38d950
+d2ff9469d886ed6dbed733afea91d171e53ed91eefa5fcb939fbb605dd54e6c064fb3bc2
+e093d92ea5fe7af8a6ff89fb7df256caed4fd827e5c817e65dffce34fbbf69afd052dd73
+e3a1c1f552d2ff975ef687fbcce52cd998f75afc1ecda9c611f265ff52a5e493ee84fb5b
+f3cb93d888f75dfe19cdff36fa86d4b941edbd5aff33c9f75fff04c9a5d884ee1afea721
+e562d052e5c8fb4cfe9ff33bff58f6a5c6e2b85aee7bfeaf44bffb19ffc295f766fdca52
+da2af2affb79ffbf6bcc86e072c9ff88f2a617ed93dcab5ffa77ffc753d831d70cd93cdd
+1dfe6ebcff80faa551fb86f1be79de9d43c5ec84ff32f7b820da79ed9e43c6ec79d802af
+58b7ff65afea86b7ff46f088c0dd1fd3f410c652d01ae0a808ff51dd10cf93eb9f5ce1af
+1df58aff81faa5c0ec64a6e97bb7e54af237acd65aedc29bf725ff9f0893ecac0dbed893
+d4b766fe1f80ffacdd26ed9fe57edaaf47d907e5b67fff98fbc1018be0a54af823ff5af4
+9c4dd235fed97bf823ffbf13e9b683f399fe81f668ed87d385e01199de6bd0ec6ad9a124
+f388ffacf90ff25eafcc81fe8afb04d8b9f21cb6ff93f1fbc80befc632d4ed63e09ffe43
+aeedba77b5f7a0ffb77afebb70eba5fe79d842f4c880febf61e310d94ce00794fbd722cf
+fb67ff96c2ff8ada7dfb3eafdd79edb6df36d6f686fa1afb2eef93c4ec960fc3f862de0b
+f25afa92f1a6c640ed18e44c93eed036f2ca92db9fed15d9bef986b745cc5be479ed9fcc
+47e11add4beac09ac3fb51f4b5fbc53bfe09baff34cbfe51d817e062d99ac2e611ed45e4
+63b4ff618ffdca4ade753b9ddf5193ffa006f8b524cb80fb8d38ffd846d92bc6e938d8f9
+c23daff068ffb602dd4bd1ff7ccda4f37bfec34992f29c38ddaf17df50e908f260bffe87
+d72ffa67ff89c247b6e59cc0d936fb4cc0fb6eb5cf91ffa5cb2dd061ff86f99ed86bccfe
+63abff9b0ae97ad869b1fe8f11c5ed95feb9a5d841fd6cf888fb6fceb020ff2fadd99e41
+8ae3af86f27aa6e081b5eb7bd593febf2afb69ffa5d09dc6ed37c2e52a99f8afd8aaff7a
+f6d879e5c872da93ebbe02c5e29a6afd8bf25e9ff5912598ffd11ae0c186ef9cf89439be
+fb30afd83defb8ff53c0ec7acbfe86f879b9cea3e318ef5ce797cbba59dafe7dd05eff87
+b9d89fe084d931fc3dc667ee95feb71ee056d984edaf32bfdf5ac6fa52ff29facf41efab
+ff60e508f42ff186c2e027d9c0a5fe65f2c686e503ffb7f721edc14ac4f658fa08c1fe59
+f038a4e086d9bf51fa1eff5aadf46ed5e3860ef3e123ccb01afb41affe36fa4cffa7f251
+f9cb06e078ffd34cddb5ed6193fba42dfc54d823eaaef168c7ff6fe09f15d8a6fe10f746
+a2d82baffa39ff54d97fffaf46fe1af0a50ded42f2ab05e853f119ff5cf297d8aafb13dd
+59edcc79fc2eff0ff79ef319fb7eb7e296c7b886e079dd2cafd889ca93bdff02afff943c
+e406deb84efc93ee79d862dc79ff97e61bd892ed9f27e286cbff60f13a94e97bdc93c0dd
+08feb244ffcf6b93befa6ff1c297e868d19fdd6cd886dc2ea5eeafc812aefb81fe0bc9f3
+46e6bc79e485fe6ddb0ae1991ded87fecc67e384d98abae76df0cb86d881edafcc06c0e0
+8fd879fbc788d97acdf985fe79cfa6eaaf02fe4dd5a1bcf83face687c8a5dd6fd886d693
+ed25d06af550fb1dff80c4f24bff3ffb51d09ff24cbaf786fa9c79e0bd44b2dd32fe9fcb
+2ad861fb70ff43dcb973fbb001d2acfed80bf3ad31fb63edc17bebbe52fc2bdc4de4ba5e
+fe10b7ed16bff41efe63bffe8844eb99e532ce5be47ab8d968ffca35f2afc651ff7af6d0
+5bd92aabfa43ee31cdfb01ffbf58fe0ff6992cfba2f761f22be94eafff26fd3db0dd25be
+fa3a89e0c179e588eb27c79cff04b7f262bcfb4aff3cd961feb3ed03ddafd657bdfa69ce
+a5d89beb70de66c8ed61d83acbff18f5a2ff68f1bf13fba8f28cb8cea5e56bffc846ed98
+f82588b6fe50cfed83d8a94ef91895edc2f786ffa530e07aceff86f85999e0c3a1e45cd0
+ff81fa6fb6ed93bffb24aef50aa5dc9313faa3cbb63ca5ff7ff7c67cd895ff5da5dd9526
+e39dd96bcae576d938d085ffc193e06adec298f467aee37dc9ff43f7b72fff5bfb7bf167
+d1fa3aea22cba5c0ed79e6a54892ff9b65f29fe70baffe1bf726affb15feaf23ffa5ee6b
+b5d861e90fd6af7aeb5ce13fff05ed2fbef411acdb7edf66bfe558c5e278baf615ff93d0
+afff3da165d913d0fb93f5ad51e079cbff8b40f70ffbb920d83cccf41aff47d89dec83ce
+fb4effd079ed29fddcc105eab657ff0ce078c7f34db8fe62f43ffdbd52f295fe71dbaf3b
+fb13f4b650e408d1ff48f212afd87dedcb84d893d91be3b26ddc8bff79f507b5ff13c2f9
+d55be3c12ffb8bc5e26ced94c0db88d87fe596cf0dbefe28f99acb86fb37f8c093bccaa4
+d893fe55cf99fa2dfe4bcaff77fb2d97ff24a4d76de036de60cde5fea5ef874bd905edc5
+2bfbaa26f0ba7edba573f387feb068df9fd070ff54dd3b95edab5ede89d89662f18fce38
+e588f2b0f92487edd282de88d0b412ffac20bfed02e59ecfa9c982ff86f8be76b6d694f6
+5afe1da8e20aee72fec043fe9bcf58dd96e084cd88df2bb0f417fea8d04cff2ab8d350ff
+36f656f139dd78ea85cfaf5aed40e4c29fd049ff0bf465f95caedf83ec69d0a7f3af16ed
+9fc1f26ac4fe49f39ffe81f2ae01c843b6ffc86dfe619fdb83d0ea65d6ff56c7ec4bdec0
+03fdc42df8b506f192ffc11cbff925ff59f8bf44fea1f475dd984ad3aaff9f39fa1bafed
+77e05fc5e551a5fb87f360fe43eb22dca534d9fb61e72cd887c5f96bfca1cc3593ecc40d
+edb632fd53f331fa9fff68c4d97adf86ed7db0ed86e67fe079cd8afaa7fe49f53cfbd992
+ffb01ffe6cef9be583d630c2ee19ff40bdf20c92e786d54de004b1eb7ed8b80cb6d827fb
+8ee580e91ea6df91cbff4de60ab6fb33aee20796f8a06bedae5aed79e5c97ed85be587d9
+6be2a8c90edf86d923affb1bc0fe6bdb0bc1e07ac8ff30f8c193f17affcb6dd823d986d8
+7bfa60c3fe930ecb9fff6befa551ddb04af3afff60a5f980fec87cd991d8b943b3e4934a
+f63afd0ec0f943fe04caa1ff11d9b828b6d88ee072c005c674ed93d825da4fb6ff99fb74
+b5d693e479ffd85afca5f893fdd938f760fb93ee70e657be33fe96c2fa47f32ea9f293fe
+80c995f479fed82bd0ff3adb93bcfb42acfe2cfa9ef444fec378f39dfcb660edca68d8ed
+2dbfee86fc4bf5b662daad43fe0ad7b62ef55cffa0f70eeebf98e653edb0f342afdd04fe
+ca32ffd586d921e0bf47e41e9ef610ff67e585f105fbafcc94c9a5e06fd99bbef330aded
+53ff99f260ff1cb5fe95f7b753f586fe7efacd1cd94cc7f761fb21ccb33bb8c726cc42be
+87cdafe02cdd47ffc39ff7d8af5bed7cd888e0c01bd952e016ed4acbb664fbbe85e579ff
+1ed097db6ae0c617aedc9305ed4dd831d0ff954affaf79a7fb5aafd793cf05ee79fb91d0
+a0fa4cdd84e4c243bfe0a548fd18d86eda79fbc686e5759ced9413f756fb79f293d3afea
+51d0aded1cfeb7d961e01fff54f430ffc462e577fcd084df6de302d793c7e94dd82fe5d0
+16e03fc8b067eb7ce59e07edbea2ed65ddff86f37bffd85bff1a86fe9bceb31ee0860ff4
+bf3cff0afb68ee87b0f67bffc09fff1fedaf46f616cc9ef262fe0ef6b179bbfd6ff7bfa0
+ff7ffa9316d7f2c302f9d93bb9ff25f28affa5cb21e461ea79f2a5fe06affb5b8affcf77
+f2a3ff27e49d1dff4acffa5fc1e57ac7a8d72cfb61ff78befb5c9dd89050a5ff80ed98dd
+6ad8a418f240dbb85dfb20cbaffb7bed5aa0f37bff618affbfa5f303fea5f638feafca51
+ff2ff99f14d84fe0af09f298c1f1aa5af57afb6affd079e2abcea2c6b644fecd26dba539
+dd88d886e094c9abec4ebfe287edc03cffd855d429e83eafe064bde6a53686eabe6dcfed
+7dd8aa3ad94fecbe99ff16b7c726cf94dd7ce5c43393e2b03cc9b65ef1d08cf3a520b5ff
+3cb6fe10eda0c1e101b5f024cbff43f9c6f214d8bb41b6fb7cf7bc86fea10dedc398f344
+a5de2cffcd0de0adc0ed9b5ce488d9b647b9d887dd79e092d978c6f193fb77eda5ca63e0
+34d9bf04edb9da519efe19f755f234ffd99d5efa6ad0fc77f95af311ff60fe85faa534d8
+4c9ee89308f197fe86cbf211c8f456feb6fb9827ffad0ef661fbc378fe86f73fafd8fb63
+e15af23dff1cf6affa01d2fe68d8febd41e87ad9c0f067d0ec85de7bff5995f5cf80dda4
+6cedbf3493e67afea5ee07d14deacb6bd8ffaf4aff88c1fe65d879b9fd9645fa0ecbfb2a
+ff79f095ff10f248fd17f24bfeb65bda1fd03dfe4cf793ff6ffad1a33b93efdd62cb83dc
+95d89312bfe085ec04afe424c779d0a6dd30d801cdff7afbc35ffbcc7dd969e0ae5dfbb5
+2ad87ade5dc5e253dd9ac0df1ae4b50adf6aceef5094ed85ffc09ad5b471db7aed569ff3
+8f1194fac108ff4c93dd9e2afa4ece38bfdc8847fe3af7c30996fed04cf626e086d993ff
+9f23fa4c8ce083d310e637f2a7f73a87ecd06ddda551dd60d523d86fe383b5ce9cc5abd0
+05f79fff85db79dfae0db8ea4387ffb6f92888e8a5ff28fd51f9aff53bfec196f259b6ff
+9ef853c1f17be788b9e517f2b626b0ff41f619ff99d96dff88f60aaffe86f38cfe41a3ff
+7bf6c19cff2c91ffcc34d8ad13fa4defba2dff93c5e630deb5ed62a4e086c9fb0af2b0c7
+97fda5f822ffc2afe076d9afe15fb4d99fc768ff5bf038b9de93c6f534fab9f07bdac016
+dbbffa1aafff83f8b981f587fea9f93fc0f65bff3afa8aea6dcb38e7b0fa2ad6fd67c9ae
+e313d878d4fb07f05ed07bdf86e579d8a54bff86c3ed3fd80be26dafff46f9289cd983d5
+f866c3e08ad152e939cfa5e551c2e03dd013d869e9c95ad835ed4cabe2be0bb5fb6ee691
+c5e56afecc5ddd17a6f879ff38cdfe58f437afe07eff5ee506da5eed69e61694fe2cfb87
+f31dff79f2bd2ce082cefb5af109a9db9527a5fb4a9aff934ecaa1e140d820edd009e4c1
+32cba4df24e586db7ce02dff86f2c20f9aeb7cbeee21fe60f394ff4da0c891d99ced02cb
+49ff1cefafd82cdc92f472fe96fb22b8d76cc4fe61ff3997ed11a4f279fbc387ed20cb9f
+fc6cf77aff84f91faff08ffe81d0f478f9d968c2f14afd32a1d9069cf783fecf51d888dc
+af28bed09efe62d226d877f2b0cb93d4aaf2bf54e8a73ed7b856e501fba7c1fe13a5e87a
+ffcb50feb5e073cbed61d5f271fe66f38cfe66a6ff9d5cf36cff7afb9ed00cef56d8a4d9
+6193ffd153fb44a0d88cdec342bfe1fe52f61ffb6dff93db9ed083fa6cb5fd13ace0bf4a
+c6ed7ee0a2ed3ce5a5bfdd79b9fe2ed89e03ffb3fa64ed30d9a5ed46b7cc97ff43dd02d9
+af1dc8469ffe2298ddbfaff286fbbf3bedb779fc07fa65f295fb78ee17d986f793fe9f41
+ff10fa4c86ffd06ec9ff79fbca88d86ee94793ddc041d8b679e580f259ff1fb6fb07afd9
+2bddaec837e5c346bfde86d914d8ad46ffb68efe79f51afebf3ea5f188caff78f92fa7ed
+98227dd885e0acc64deb35f55ad907e9cb67d8fa3690f2a551fe0ff75db1cc06fb4effcd
+65de6fecbf8048a2dd88ffb81db2d8f256e488cfa5fa6dff95fcb0e57ad0ff8709fe61d8
+51e0a9ca22eaafc79de019d844d95ae5a7ed50dd1dc0ed80e59ac5e01fa4f70cb6ed2daf
+f83dff7dcdf762ff96f91ded3dd603d888e57ac7a5ff82f69d02ffb579fb94f61ffeaff1
+66e5c462f3c122ce96e05addb1e518ddaa03e05cbcff6bf7cef238ffb430f3a3bffc7ce5
+8afea445ffbe7ccfff17e5c09ad093c1ff7bf288eaa535edafff42f7d9b9fe14d34be086
+eb9308fec426f260bfed51e05ed80ff2a542edcb81e824ff6bf57fff9761f254afff85f7
+a5ffb935c5ff7cb6f96cd9ae2bfe61b9ed7add68cf9fe06adca5ee0cafe024d065c98aff
+86faa8ef3bdd4eed37d351c1e97df1cb0ed958e0bf4296fa02fcaf31e4a5ec44affb7af7
+84ff77f5c680edcb0ad957b8a5d979cdfe60d912b6ca28f252c1ee9929ea51abd986ff37
+fa4bee1cdc55d91fc1f8930bcab68628f18ee572f29cff5afbc067adfa82e513b3d826f7
+93fe65c7e4ab5cfa9ecb8ed80de147bce52efece3adfbf02cc62fb980fc1e02fd74affc0
+7af3d84bffb2fa45f416ffb028d29bfe55b5f59ffbb454ebc45cbffe89f87bb6fe93fa2e
+d647afed87ffa379edcb73d988edb879fa68ffc705d830cd4fd835b6fe3b9ef188ff19fc
+4aee0d96e581f068ffa5cf93e01db8f687fbc95ef16ad8a5e280d39dfebf95e24bd2fb5d
+d8fda7cd58affbc301bfda2ee09fed51ca9bff79fbc567d33aec9629f7d819df59f9a5fe
+86cef379d9bd7af65b9bed92e281f3affb66fe88f279e9b50593e49a2290e094d882c7fb
+5ef184c2ed3cd812e0c02f9cff22a2d813e5cd1de061bafb9fff62ce33d6f918a5ff54d8
+3affc912dcbb85ed9dfe8cf294fe86d0affb6cd893c9bbde86fac73bffafd847e40cff6f
+fbd457dd079ee024b6f50abfff34e0872ffb6dffaa7ae4993de50ff3d83096ee61a6f780
+ff0db6fe2bd2be389fe982db72ffb878bdff79ee2cc942dd9f1bffa50bed8bcafe48fa23
+d640e54ecbade00bd238fac7fe3ed2fdbf5afe62f33993e4ad32d988ff75f25dfeafdd83
+cff562ff569ff2c29bed78e01ed993fcb155c2e52aed7fdd9c5ef0a338f855d769e20bde
+62e51ddb4ce52df67410a0e65aa7dd9a1bfb93bbf39fc73486ffafc1fe7dfbcc88dd6ba9
+f079f6afc5df14c7f424ffbe7bffbb62ffcb7dfec23cd05bc1dd7aeb52f4afff17faa8f0
+01d0fb3ca5d495da7beb6bfdc658e0c161ff1ca8da6db7f190c7a5ed269cfc87e29f5385
+eabc78f0cc04d999dec019ffbefb05afd893cd7bf408ed4daae082bdfe8642ff0ec951f2
+6de707f298fe7aceaffe09f8d286fdcb72de25fba0c7a5fa54f67affaedd5cedd8ff34c1
+fe79f4c27aec61d240f1aded9447e42fd8a540ff5afbc74cd802ed4f8ff19854dd6bedd8
+4e93eda441e021d995f0a5fc44f6b1df6ad986d8b645bbe09355c2f30ffb50ffacf133b2
+ee80fa9fd0aff486fec652ff08f67affcf46d962ffc4f7a515e03baff67cff52fa98d84a
+93c7f448ff2ae66bd695fec733eecb09dfafcf95e7b686fa9fd26bdf39b9fb5b93ebbe4d
+e529b1ff91eeaf42ff29cbb796d2bf149efe86bf69b2ed04d340dfb52afe8dfa79e003d8
+f979f365f7ba79ed169af986fe9dc0ff60d0feafcb05a8fbcf1bd6fa86f46cff10e06dd8
+931ca4fb05f261fe87f631feafec7fd888e0bf03d089fb40d925e54cec36d815a4e494d8
+5bddb971f8afeb17b132d8fb7fff6cd8b625e586ed72f8db62a3e480daa5fb52dc198ffb
+af79f98dfc60f439ffc626dd47ffc187e40fdcc44393fec27bf210d861cef382d972ff06
+f35ffbcf3ee421fbd081f788fb6cffc859dd18cbb0fe6db6cb9cdc09e6ca87d1eb2ad8af
+44e927d9a51e83fa8bf239aefe73b6c74be5bb91c3f933ffb8ed7ed096e11fcc9bdd61d8
+20ff4cf831a1f55fe394cdafff7bd886ff69f7d33aef6efea712edc12c97f5cbee9451c8
+9fed33fec35ed30acab026ffce0ffac41ebfea7cf2c1d923e350d625da7dd8a55ffd8fed
+a51fefa9f577ffadf119a6da95e580fe1bbae44beda5d88be6b379f9acecaf45e05bd995
+ed08a5f7bfa2ff4497e720fe3db3ff9337fe62b0ff72f4c494f86afbb6e047dec485dd52
+eb09ffa8cb2cf24da2e078da4aff38f95cb7ff4baef27ae4a4cb93c2e580ffbf11fe4e99
+ed05e196cab588ff80cf2ac1fb9357fec6873d82feafed11d0b277ec9bfca5fe5af1b686
+e0699dfe9337ffb74786ffbaf56df1b5fe12f6cc80d85bcdfa9640cbb630e05dd1f93bff
+49caaced5e9afbc03bfb49c624f1be64c579f1aaff1ecd50d8e98639ed6adcc25af2bf91
+e078d5f29fe533c0e011dd79bbe53fef8cffb52dfebef693d879ed80fe96eabc0afb88cb
+a5d989c6e979dfc10cffb864fb17f051d926a9e668f2c76dfbc028ed47e00eb6fa99dd40
+e0add561ffdabf08d889ff65f8bf18f245dd6de1c24afd34f6bc46f1afd06ff9d894419f
+d9a54593e2bd3fe601feb671d7ff69f7d984fe9c79ed86b4f95693ffc20f86e993b9ff98
+d138ff0efebf2ba1e678ffb461fcd093f810fea5d061ee13fa4dbc1cc5fb58acff52fe0a
+c9a3d512cc68e59f167de043fb20d960d573ffce61ed19f556fe10a1f728fd96cd3fe8a9
+d69afe6ecafb82d8b21edcaf65fea5f962c3e644f287ff69f602f1b859f9a5fb44afd939
+e0a6d092bff51e96ec9fd87fcce45fdd06e5a512edb3fa04ffb8f75a9cff88f2c149ea15
+b0e225a9cf0be8c020c4dd02ead031dcafffc41df26de586df9badd651facd84f4c213e1
+a822e582d777eb2fffa0bece91ffd96eb5f27abfd989ed85ff73f394fc4cf3b7ff9dcd88
+e3a5f815dd3fabf49cd893e07aedcf6bd85aec87fabe5aff36c0eda349f133f9a5ff45ba
+d879cb9efc6bafce15bfd992e5a328e088d869ccf47cfe86fb61ff2e86b8ff79da5ffe16
+a9ff82fc62c8ff69e086d278eb2fc4dd6ad9319ef893fe85c2ff4ff2b568ffa1f569febe
+7afa6cf25ea5e057d801fe4df7dc69ebb95ddd359cfe7cc8ff5dd945fbc186d853fb67f1
+3baaed06c4e726a5fa5bd825dcb938b1e078d929ed5cfeb73bb3ed84fbc627dd51ff31ca
+b648ffb4f5ac2ed906ed84e0af08ffd892e079d886cef537ff01f133d8ff7aeba527fe4f
+d0fd74ee1ee59e19eb4fc905e59ec4f9d142ee01f389e6bf28cba1ed30b6ce32fe5cdf86
+b1fd18faa5bfdf7ad837dd5fb7d879fbc64be035d8ab43d8a0e02ecef977fea5ed7fcd86
+1afeb009ff92efbf51f237aff3b6e48a05f6afe529b6d99cf986fe944cf3ce39e59ef751
+fea1f908d193fa6cd804f287ff4acab67afe8def80affc86f19f088adebf7cff94cf6af3
+87ba5ac80cff4ff2149ce386eac187b91ff34dfbcc7bdd85b7c852ff79fab4c696eda9d3
+4bea10a5e093cba5d852f299fa43aff779fb9dbff227ffce67edc253f10bff59f494fb03
+e4af2ae692bffc72f393ff15afed930bd9b628b8d937f2e5be87ed75d81ffaa5cf97e087
+1c96ffa9d03e97ffcb0be052d861d0fb9977ffaf63bfd26de27fc6ff52aade86e756bfd2
+9be50ce858d004c0df1dd83ae5b7fe4cfbc85fe51ffc42d2fa97fda3c1e07ac6fe61d8ae
+4affdd98c4e070b8f437ff11f7a5bfd94ae42bff55f787ff6cb9fe76fa5aff2efb7adc67
+e4d286d81aed5093dbab0fd99739ff92e4a9cc6de67af151fec161fa0db2cb23ec87c1fb
+51c9fd83f499fb5aff9fc94fd932fba8e569d901fe4afbc7ec55dd71fed8855cf593ff22
+e5af1cc0ee17c6fe03edb523f19c36c1f51dffc495fe25f461ffc393fda5fa78f366ff70
+d97eed9f1af79fd892e7a522ec44ed28b6f93cafda22fba0c65cf93c93ff06abe896db60
+e12f9cfe82d87addaf33d9c3f23dd722d985e0a5c808ff970eff5ae5a6c3f76ec8fb79e5
+afd062c72aedbe18cba3d17fed96c8ed5cffa4d03ddf78d99e4be235d879e0af6b26ff93
+e2c448bfff88ed7bd8b26db9f825f1b714e8b0d36dc1ed7afe88e04fda87d8ac69ffce5c
+fbafe574d9af34ed79e088d8a849ed32d946e5c498c1ed1fd035dcb976f154ff7bc0dd83
+d873fe88d094fb55f27bec0cd981e6be5dedcb48d881f08dfcd00eecaefb0bc0fa931a9f
+df86ed61f7bf4decb66df0c0a4f3ba3cfe09e94aa3f356fe1df6a0fe4efa9bff29f7b119
+ff41a5e081f266fe9af626ffbfa9ff93ef06d2f9e97df2619fed963ddf2db6f410ff3ccd
+9fc75bfa9efe36f947acdd55f2aaff7bfa34f5c44696dd7dd80dfec068faa5cc4dfb12f9
+bf9ff76dffb115fb43acf993ff86fbcd39e0af0cf851ffa9e552d917ed6fe097d268fda5
+fe1bd3faa378fe6afb25c94daff5943fcda2e079edb7ff50fb99cfb41dfe88f8d040e02c
+cc63e084d795ffbb2dd886ebbf78d8b37ce062d96ce0c471bffb2fd91ae5c505c0e965f1
+14cb52c3fd955f8ed80ebcff18f8cf8cfecb52e0acee76fe80edaf2887dfc59ffb04b7cc
+2f93ec61df79e6b8f81bff58efa03cf2ba13ffbe9bda63e11cc8a5cd79bbd891de63d84d
+e10dabfe86c9ed79dac403bff77effa9cb09ff30deb849b2f0922ae0c012ecbca5ff87e0
+61c7ff6bf353ff3acf6bd8af0fff7be16dd824b0fe83fb93ff8ff25edd1ccbef72dba843
+ff0ceebe3bf4acfd38f09fde7cd187ffaf79fb58aed886dd88eca540c0ddfe56fbcb80d8
+ac5bf2679efb9362c0de08d840e2b8f39417eb79d4f782fbc20bd0afff108dc1ec85d18b
+e0adcf87dd5bec31aff183ff56f026dbff5df707ffafef6cc6ed5ed92eb7fe399cfb932b
+e4bf3ef289bff676ed94dc68bbff7df29fce53e502efaefb1cb0d924d786dc81f029f5c1
+4cee9ffc55ef79c2d94dde12c937fe80f97aafff05f9c988d965fecf8b0ec7b659fe04f7
+52efc350b9da94f332fe47fa1fffaff620a3edb33bf56bfec20cbee31dd6ff2ea5fa93ff
+82d85affc050ffb55cd941dea2fa439bd8fc31aed942fd20f952ff79f693c2fe3ed094de
+8afeaf35c79ce6bd2994fea525f699ff7dcbafe04bebd19959fba1e55aafd013ff35f8c9
+58d841ff86f99ad17f3bd893ee74fe9ff403feace279dea8cb04c2dd93ff15a7f67bb7ed
+9bbfd94de03ac1e59558f19ae5209fdbff72f7ce83d893e4a435f4d520ff73e092d097d8
+67e07ace2dc786e094db29eda5ff7eefa55fc5f279d060ef0de573dba5ca2ced99ff74ef
+67c1f26fb6ee65ffc57bd885df2eb5d001e27ad86bec06d776e688f346cb73f2d33edfbe
+77dc59ea19f685ffa561feafd821c2ff38f1b681e0a509f593deb62dd945f2befe67f845
+e5c25ab1e79357bfff35fa71f3a534e55bb8e86ad0fe48fa21a2f5b8fb8861fed22cfb74
+bcec46b5d826a9e64aff12d8fe9b63edafcc0ef260e47cf10cb8ffe779ff03ef53d264d8
+39dd4bfdb8e64dd920fba2cbaffd25fa63f4af11bfe12bb5fe24e54bcdbe06a0e75cf39c
+c1fb6cff9ff321ffb7fb5ef810d6a3fb86fe5ba7f881ffc712fb93de66d81ec7f20fed79
+fa6b9dd979fec74dfbcf62ed1ffcaac0ff8728db9bccb78a17fbc631d8f8169cd892e052
+feba81fad83dff029fd881d0ed880d9ddec318b1e052cbf984fb7cf294ff68edc188b848
+c1ff935be6a5c1fa2fffc3a0dd4f98d85dcfa7fe88f67bfbc298d20594ff86e4c133ec4b
+9ae08dd981d6fd5ca7fbcc7cdc94ff86f4adfa37feaf0be544edc652afdc934aabd984b8
+ee2cafe014dbc002e84f9eed86d04afea4ef6db7ce93e049d4f705e5429eee79a9ff88d5
+7af05a94e7cb5cff08d9f3a7d477ff60c5afed64ff1cd774eac72a9eed86c6f169e5aa5a
+ffb3f33dffa5f780ffa936d803e14ccb18d4af33fbd984e107cbf73afe4a9fdb9357fb6e
+f51bfbbaf745bfdd17e1af24e877f4c13af7b26bff7df7be56ee1aff4496d8ed8801eb55
+d016d83fdb71d889c7f182d8951ac0fe67f2c6f438fec869ffce64ed7aff96ccaffc2ed8
+6df1b938b4fb4cff33c1fe88b6cc86f9d81ce8c531dd4fe20bc7fb14a6edb6e5823afa4d
+edafdd87fe43c87fed9ef70d96ffce5fe0aa43fe14fbca27e462d879e15ada14c5f395ff
+86b6fe9afa79f0b024f29efab686de81bfed09c6e638b6cbeda53790eb9c6affbf5ffa90
+ff4de0a8cd16e7b7dc02d1ff7acfa5c0f08632c6ff95f68cfa7afe96f01be448a5ff59fc
+aee034d8a10e8ee0a523e09741f9a0d04bed37dd61e4b5ff05d99be580dd87f3a51aef52
+ffaf5dbeff8d57fbb0f686ffa562d9f97e31a0ffc0afe0950cf72cd993fbb639dc61d0f1
+76b4fb24f4ba8ada7ab6d88ffea7ee2fce98ed9351dd3cc8ed61d841bfdb67febe41d053
+ff14d8ff69b9fc79c1fe8260d8ffc20bfbc53d93f2c635bfd986f17afe9f4993fe9f36b4
+f564fb09dcfea45ad929e050e9c227afff7bf9cb15d97bea73fb5af6c4ff51d0fd7df1b1
+c51efbbb93ff7cf2a2448ceb86fe2cd107e754bfd981dc14c6f42f95deafd1189ed93beb
+d0953fc2fed058eb1e86fec19ed067f206d1fa8effa84ee00fc0db79ffc753eb36f24bc6
+03b6fa86fe61d0fc79f7af11b7f586ff06acd77dec8bdd7beab427aff22eafed11e0fd26
+87e2af6eedade007a5ed9e11fb30d85af3c7ee46d9c3ec20df93c8b63fd2f27dffa5cab4
+6aedd252ddbb66ed97f72cccafe08643a7e99353dd09ff87d974e026d4b60afebef8b047
+bbf268fec396ff41faaaed77d8acfd03f369fecb6cf2b425ffafed8c0ede93fdce44ef5b
+ffa9bfe58654cb21bff98bfe9952e530a5f785ff9dbefb93e549d80cddaf1ebed37bffce
+2bec94c5e54bf317fe32f6c26efad27ad8ff65d0ab94caf248fece27fa75ffd750fec568
+eb84ddaf26be84fb895afeb951ff7bf7af18cbbe46f70ffebe82fba430feaf3ec7a5ff08
+95feb6fa16bef7adcc6ce555f19dfb69f7c961d922e0a5d87ddbac28ed6de0995ec1ff3e
+e561d885e0b847fec27af481dd55cbfb7bf163a5d97fe018ed4e96ffaff486ea37d843f2
+ca7deed406dfc11ff061d97affa5f56eff9df028e55093dfad5af970ffa5c995d4af4eed
+a056e59a46bef93ff3679fd984b6d951cbb686dc7ae1a5c0ff07f890ffce0be1adcb79e5
+24d84ee09efb68e881d89a43f20ac1e086d0ff79da6bedcf27d960d2ed8744fbb727feaf
+0ebfeb3faeed93ff83f511ff4cf687c8fb0dd1fb25a7d07bf795ff22a0e79305e05ad616
+feb466d92ec7f920ffa4cb7cfed814d941dfafff6ad9af1bfbb47ffe9f67dd94d019edbf
+34c4e33dd861fea4c0fa6bfec31cbbcf2ce360fb79ff1dc4fb02f7a8e87ad805beff1cf7
+5fff96f51efe42f329fb4798d86ee44ea5ed6dff14fa9ff293fe87ed34d8a0ff36f5afce
+8bff4df5029ef122fabf64e57ef29b2fffd77befca62d8ff85cb97ff18d658cd73e4c293
+d8b759b3ea79afed6af2b52ae053cdfa30bbf799ff8ef0c041f7abffb05eecba3bfab734
+b3f57afe9c03c4ef81fe9fcc4ae139cdfa40ff5afba551fe79b3f282dbaf44ed09d73fe0
+9ee879fb9ded0dd8be94d987dd74cf21ffb3fad558e0a6ea10d569eba0cdb993d2afed39
+fe95d8f92cd199de75d85bd010d96eb6f804bfe27ada60eda9d970ecc962e0b03bffa5fb
+3ec0e2a106dd4da5f6934ee52ddc6fe086fa35fe9f3efb19ffd927c4ff3ad8b708fbd680
+eebf7aedcf52d833e05197e6c40186e59aca84e079d3ee6dc1e04bd0fb9328dd58e672ff
+b7f371b3e588d86dcae792de0ac2fb1af8cc90ff72f288ff57f1b144c6b6f237e561ff4f
+b2fe93c8529c7aefb543c189f2abc661fb05f664ff7be0af13bf81bdf241c2f42eff96f6
+4cffc884df9554fb1efec02a93feac42fbc186edb60fc788ff6dc9f986ffc615edcf7cf3
+a1fa4aefa5da6adfc0afec6297f5719fe083ffcb945afeaf0fff4ba4fe83faa8bfff2993
+f3d745ff10f355fb08a2fe2489f0b75fe3bfa5fa12d99524a5e00fc3f62df1af14f862ff
+529ee59459dd7fd8b420b7d801dc93ff865afe9fef12c0f22eec6bddfecc2bfe86fbd04b
+ff24e580dc9be51dd054f5c7fb49fe88e763afcc80ed67e4af27fe61f2c3a8e0b15bfac5
+13e4d39c16fe52da93e7b71fed4fb6ec3493fcaa39feb401c5afc629b6f909f35193cee5
+43bef913f24c88edc632df9ac9b1dd1ce3c10af279d2fd50beed87d8a5d892e9be61d8ff
+a52ef785ff4ec1ee5cf7bbfe85fb6aa8e084ff9cccb686edba6ac7fe29f63afba2f478fe
+63ea16deacd06cc9a8e079d9b6f816af67d997e634a3e07ed859ffc152acfa8ddd9f3e93
+d9b21bb8ff03f9bd37ceba78eba4d41bff4088f79bd879f15787f4d87be56cf343fcd986
+fe79ceafe071d9c05bed8efd6dff95e17fd48ad8ff04abfecc67dd9fc1fe1da5f260f837
+fb5ef3679fda88e560a5dc9b34fb51f929ff4acff79653cceb67d60cdd79b5d288eb51da
+40bdff09d44ddc31f3d31fd8ff05b6eda5cf87dd4be0c5a5befb8ef424f93dfb5afea54c
+8ce545bcf40ec8affe0af893f1af34fdce6bef2dffb6f16de5a2ed7add6ae0a5fe0afbc1
+39eeb57ce6d007ea3bfea5bfff38b6cb2affa4d866afd038e50df354fa22ff86d8b842e6
+15f154ff65fb32bf7fef8724fcb933e061ceff86d879db86d893c9fe4cfb1ebaea12fece
+93df7cc79fe4861ec1e514bbfd93f29cfb32ff01aed88feecb5ed995ef7dfc5a99fb4ca4
+f27cc95dfe0fc3ff9a22ed51cd41c2e485d993d308f1b7ffc4fbd686ff77ee7bddb741ca
+87edb717dd84d860e00dff4dfb32c69cfe24f284d99e5aff6bcbfa53abff7db7cc25dc92
+de7ffb99c504fabd16f59dbaff8dc8a5e89be41cf4cb81d99ed021edc39cf7d84ee0afd7
+77ef96f6b648e502fea5f512ff34b5ed9dc2ff6ff2b676f405b6ed39b1feadfa84f2a43c
+e05acf6ce09ec2fb33ff1ba2f977fe27e4a5c5ea77c1d963e032e883f1af3bbff988ff97
+f77cb3ff1aed7adc71e027849a30e550d93bd861ffa4f70fc469ff50f5a5fb8fc9a7d393
+d9f740afd857e543f6d680e01098f1c746d8f26be567f30aee59e977e079cbff60ed4ad4
+30f167ce51befb5aacfe66f986dda54ae51eb6ff92f453ffac07d87bee8ed1bc42c2ed85
+e476cf27e048afcb2be060c6ff79fbd05ad93bdc68ffc979fe19f6af43f260e579b8e336
+eb93d0be40ff0fb0fe22f796fcafd950e593da76d832d808e04bb9ce9eff43f99fbfe2f5
+c77df289fe9ded2ce065d4fb94c0e2b201c138ed57f912ba87c1ef79ff97c9b721edadfe
+d92d93fb9e0ffaa2ff4fc5aed132fea5f24496d87dfea4d993ff05fb79cf88e00fd734ed
+61febe83fe7ac911a6e93bcbfb56ff23affc63e56eafd85cfb92ff7bf9d865ff86f8a851
+dc9a0df38cff98d807b9e795d884edca7ed891cafe5ad8af17fb60f190bfe081ddad49d1
+179fff6cf60afe5ef26ffea4fa63f532c6abcd15fe5d06b0ff20d2b302acd88afeaf45ed
+2280fe93d9ff83e07ccdff61fb1addaa15fa86fe9344bd86c0e372dfb2c634cea5fb6cff
+9ec720d4afea28e1c21af94daedeb6f020ffb8f279ffafca0bf2cf43ed60fbd086de6bbf
+e581c5e13bf29eff2cfabf04ea42d0b609edacd91aedca31e8c062cb1be55ceda831fa51
+ff25a5ff11fa47a5f17cffc29db7d866ed2df261cbff7ef9c027cfafe086cb95e5af2ec1
+e387dd82fc67ed93d8a3e070dc5df6c5ff52f216db9ec5fad83ded61afd028f4ae33d893
+e951cbec69d95be5c6f751ff19f454ff81ed89d91fe052f186f85bfe86fbb359ec78c4ed
+8639a2dd9349a5e39a3ee8b959afdf93d8af47fe1cf79536bef968b8cf0fcbb554f1a7c7
+9cf581fe9646befd5b9fff7bf9a5febc7cfb8af8cb79dd87bee26ded9ac0dc05cf51f33a
+f707fe93d09ffb02bcea6bee99fe42a5ed1dff48cff29302fe53eb1fd8b03dfbf043fb9b
+ea8635d985bfe571f35d8db6cca0f71dfbb766e097fe5daffe81b6ff37f4b401a5e588d8
+a5cb25dd5bfe79f7a9cd11e171d9b601c68effbc9dfe2bbefed46df7b5fe22c8fb6df69f
+fb16ff30f098c1db79ecabed18aefe89f07dfed27ae05bee2fdd51c4e87bcdafe164d825
+de44edaf25db4ab4f00acdf443d9af2ff386fe96e584d979e1c14fff3dabe49339dd58d9
+79c7fb7ad68bdd9f56ffd9a6ca97f679ffc160cfa9c716aefcbf97fa3bb5ff2bbffd0eff
+59bfe07ac8ff49f105c4da3af308cb9fd36dffd03bfb62f985f09ad804e1bf6ced98bfff
+39f6a7ed3fd00ce05cccf28c46eb08d86bdb86bddd2cd885cf7be088fa60b6ff0ad888ff
+d839dd50d924a1f71dd86cfec1a0fa1fff41f30bfb86f193d879febf82ff88c1fe6194fb
+66d0ff6de04bd82bedafff45aeda80edc963fecb86ff09f4b724de53fa11eec37fbb4ef2
+2cade00de98723f75affd04ce024c3ea83d0a5ec53e486f23a9df008a4ddbfa5f673e4a5
+d886fb22edbd7add95ce0ce064ff86edaf33ff4dfa2ea5dd81d869fb78f594faaf13dfc0
+a9ff96f351ff04aaff5ef23df9bf05c5e728cc9efb5ab793f479ff87f3c64dff88e5ab13
+d970df93d883ddb2cc4dff0fe54ccdf313e442a5ebb71ee5a10ac69ef96affa41dcb99fb
+22f8ba14f4b02bf2be9fd84fff87edb1d186fb29d8fa7dd3fe6acb95ffe47cedbb81f493
+ffa54cfb06f77dd995d879cfff67d4fa8650ec2dffc062f042afda934afe1ff25dfea0d0
+2ec74bfa8cc3df78d1f360fe1ce593ddc03bd86bff82f75ecb41c0e07bcded7dd695e458
+abfe9f51fd65ef40c2e625cbbc0dd6b66de5afc73cf886ffbe35f661ff9830eaa5c6b687
+f765a4d975fbcf2affc782feaff136afdd80c7fa70ee62e5a052d986e095d055fb87e66e
+d8a542ff35aee09a0ae6af3fbef930af6ad9a03be70cd978eecb6ed860ce34fe13fbad2e
+e7963fc2ff8dd89b1cfb93bfff6df8c39ee07cd9af3ef7a7fc93bdd91aaffe9307c8a0ce
+5af02786fda0ed51d825e591fba52dfa9f49f50efd8ac3dd6fedd087d983b0f779fe81fb
+a4f83cff9f06ed95d3b65be89db8ed17bffc7ef46afbd026e0b83eefbb7add9757ef30d8
+5bfccb0ff254bddf09d87acdff73fa5bfe0eedaf2fc1f704fec39dbff56bffb965ff93dd
+5aedd1fa06ffce6cfe5dd51aaff193ff85f2a7dd6cedc978fcb0ee17db79f2afd74ce90d
+e331ed5abfff2cedc179e514f160ff86eb3fd9b2ef45ffbc9ffed8b404b9e4b1fe64d918
+ecd16de5c587d9b624ff39f71ba8e530ffca0dd851de32ec66e086cdfc77f428fbce02fe
+51caa5e047d507d93da2ff7afed39018ff4cf7d18bdf7aecbf88e894fe3aa5ffaffb32b6
+ed20c7afe069d4ffa45be47bf25feb15d847efcc1cf176fda54a95edb67add88b6f987fe
+42dd1de2c045c5f8249fdb0cd876e55bfe35e160fea3d190c8a8fb05afd883feb65addae
+d745cf9ef77afe69e488f311c549f67bff8731a0f17bffb586fe1ca8ff36eea5d0b89bc0
+ff79f3ba62e38ef2abd096c719fa59b4d852e079aff27bd986fe6cf787ff93f2bf57ed01
+9bfac39fe5b304ff46fab621ff5dd979cff28848c5e585d4a2f2429df68f1aedcb93d821
+de92fe80e56eb2da9ac912e2c139c651fb1ff3ca30e19fc7a5fb529bff935fc0e57dfe54
+f9aecfa0ca80f2c42ffa61ff78cd95f74ef30ad2ff9325f6a5fb0dc1df25d8ad33d984ec
+a5c0e050d5f8c111cebe3cf25ccaed65d879fb6ded5bdf47d914a0fa3bffc101fe4af2bd
+99ed22ffa5c3fe43c0e322eb38ceafde52d81de086cbaee450f237c069f2bd9fca79dd85
+d528ed9e18c1ea9613fe4be687ffd830c9faae37fb6aff79cf3ec7a8fb3af752ffbc83fe
+86e5a5c1ec9c56ffbe0aed74d0afed03dfafff4ff1b1df873af303e6be1194edafe014dc
+44e46dcf91e39f43f2c969e07aed62b0f977ffc299fb57ff2893fba94be59bfa7ade90d9
+af40f998e54bdc07fe93f986c8eb7fd8a56ae685d86aff77d3b764f10f93ed9e61fbc195
+f1119fed7afda5f92cff6dd881d7fe93d861ed15fe4ff6b8fa68ffaff75affbf66f5b807
+c05ffcb64edf8fbfec4ab8f69aff1fd788bfd88ae928d8ff15f64a84dfacd079f75afe2e
+d964fa86ed18a9cb3197ffc193ff6ffaadff8651c2f385fbb8ff31ef7ac6eb6bb9fe39cb
+95ff52bfed08e542afdd8bd1e919cbff85d85bed29fb02ffa1cb10c1ff8fcd7bd727edb7
+4bfb23f0bf43fba5e512dd46fbc98de4be30ffd8af48ff60c0fe35b7c743d888c1ed0ffb
+ac20ed3bff93d8afe19b04a8dc4de02cd877e0a5cb79d9ee93ce81f472ff14cca6db07e0
+86f1a5fe03f443adf2b3a2d993d6ff11fb38d995e082bdfe89c83db7d5fb5ff5d81ee062
+d1b427de49d8f9a139d89c1ba6de60ff25b6fd02d9a1fa21c4e82e95da80f4cd15f14cae
+f3953aee0dffa5c79ee177de83feab2ef361f697ff69a9e093d27ffeafca2eb9fa9bec87
+34fe4fd0f58c09ee86d3a5e070d0f367ff95f54aafde52e986c7a6ce27f94287eeb6fe7e
+cd87fd9ff305fb31ff9e48fe10e529dab8f163fe84fabe52c536b6dd79ccfb7b4dee64fe
+33b7c995f260ff27b5eb0fb0f697fe2d88d9af71fb9eef44eac369f5b61fd0ff58f2b6f9
+81d892dd81d8af76ed80e1a564fcb85affaa61fe76c9fc5fdac26abad042ea4cc2f735f2
+51d9bf9ee118d840cbf709ff51db11e07aed86cb5aadf7d67deaa462e0c497fc1bf72ffa
+b104e5ad17d89efe78d096ff5af377e6a3c3ff2dd745f210edc441b8d093dd69e1bfa5d6
+affe943b9fd825e2469ffcd881ed5effa40ee5b728cb7de488ed43afe486d2f44fc4dd5a
+d86deac1ff0ab9ce58a9f87ffe9fcd79fe6196e07ed853ec0ffb51f23cccff17d84cfed0
+7df3d61dc7e587d99f2de379fea4f579fb93ff64afd089e576ed42c0fe86f2ba82dd9eee
+88f759ff41f51effc106afdb1cfeb83bff4ebfe181d9c488fe81cbfb5fef26b7f91cafe0
+06fdc168e085da93e494d8a56cff87ef45aff319f83efb5286e9b5fd7af86ac3ed8a14ff
+97d922e0c28eff98fab559f86bfecc06f9bf67aaff79f216ffb14495e0fa2affbf14d13e
+e208edabe7bc06fe30fc9dc5abe597fa67bef486efbe05e347a1ed933df90cffb886f206
+e033ddac15d9bd1efeb609ff92fba65ee0a331fd53cf2ec7a5d592d9a1d881dd95ff68f2
+75cfed81dda55bf29b51ed61dc3bbce07ac7e665caf17dd9ae49fe0df35afb7aff36f8bd
+1ee55fffca7cd885e099c4f201d844debfa5ff2dcbeab549b9f178fb3cd1dd01e9c619db
+be7bde9f21fcd83ae09abcce7bf8c44d87d979e593feb892ffbf3588f7c96dddaf64ff4c
+cb13a9e42bb1e03895fb86c9ff6ffbbfa6ed6beac451d394ff59ccf36efad86aefc661d8
+23e9c203fbd179e887fa62fe21f35ffc66ee27e54accafe213a6f829fbc20effba21f793
+fea00cffa441feab33fb4ced97d6bf74cd1bc762de50edd080d99b28fb4cffc125d978ff
+adee960ef259d9ab61f893fb2fcf9eec5c86fe6aa5ff9f2ef151ffafc67bfac032f54ee5
+20dcaef194f335dc64ed56d673fbd84ea4f483cbf122e885ffd079fb5ac5ffb75ff2a516
+e02ad94ed0af21fea5f768afe283b6c927ade045a5f883dc4fffb072beff19d8a4d97be0
+9acf0bc59ffe70bcfb3093ffc959d872ebb378e5cb7bd855edcd86f2d275dd93d0bd88fa
+31f694ffa6f4b99dfb6daffe10f5c3a1edb577f550e4c05b88ffc579e680f4d009df61b1
+ff50bff7d82cd0ee4ccbfb86d870ed46e50da5fe8fd884fb6bff06d45efba1cb26f997e5
+1dbfffd312e340b8d85ef3b752ec9dd98c1eecd43dddb982f792ff7bf7bf63d830c1ed08
+fb46ff98f480fecc16ec9af26ad9f545afee5dff08edb139ffacf43cc7a8f687edc2469c
+f392ff38ccfb43a9ff18f5b568de2bbdff0af557ff13dbb759ec28e050d901c1e52ccbb4
+70e560cf0ce292fea81afbd237e0b51efe3e88ff9cc1e586f30ba974f3ba8be079b8e412
+f693db86f1d050df01eda5cd52ec7de0c10fffa5c743adef933987f996fb79fea1c832fe
+af09ffc1f778affd67fecb52e001e538dc93ff88fa54d199ed7ad851dd3094ffaf3acab6
+13c59fe18eca86d653fbbd6cdb7de057eb03d95ffdb1e807d57ce4699ef2d35de0c239fc
+97f85aafe5c29dd8b06efea0d0bb82fa8eff79a5ff86fabf3bff94f265d831cceaa26df5
+86fbc2a2bfefad43fe1cd866cbffe09c45f80cfe3d9afeb825b4ff6299ed7bffb92fe48c
+befe3fafe586f265fed96dfbb6edaa58d9b104e06fde88d3ef823b9edc11beed2c98f3c1
+a0b8fe5cf00ee69fb9ff24afda10fba5c0e370d1fa79ffd861f926fe3cf69ce07cc9f127
+fb94ff8fd17be01dd862feb8f724dbc00893fb9c63e4af11d889ee8640fc2af2ca3fe007
+feaf38e84af1d356dd32eda5d653bffe86ef9562fac906d84ae45bdc27e0c57ced91e4a5
+5415fbd87fd887e7c76ad99fe237c8fb1cafcb6afe9ef622c68ffc76d82ed8af02cb47e0
+19d0ff29ccf793ff1bf84898e5c6fe5be879ccaddf8846fb62cd9dc7accf29de61caf271
+e8b362ff57f32aa5e05297e586d879d86ceb2dfe13a4d864cc17f24cff9ef186dd9844a9
+ed84feafe732bffa7dffc29ffb22bfe093dc7abcfb6af179e4c19ec9b60dea94d180fd07
+f7af20d15affc03eb1ed96ff87f693ff79f7b04bfa30fec3b26cbfff42f4a527f250fc81
+f4b959d8f843edc15ad780e9b61aee52fe79f698ffbd86fe79beed6abf4ab6d87abbfa24
+b488f2afff41fa0bffd880ed18f539ff7dfb91f6a83bfe86c6ed0cd886c5fe05b9f61dff
+aff20fff94d0adbff44af9a5d981dfc139acff26f5b6ff60d140f25ab6ed22d94de03cd2
+a6ff52f362ff1ba5d990d85aff14fb66f761fe1be460dd79ec99f6b711e5a6ff60d031d9
+14cd4fd503dcbf9fd078edfaca1faddb6ccdff82eaaf08d888ffb676dcac11faafff4af9
+cb85dda5ed39e56bf0af5af39a3dd8fea5e536f1cd66d8fb45ce219fe07bd0af26f8a5dd
+75e558e049d815ebc555df2ea0fa93f15f9eedd37bddc03f9bdfb44bfd38e686d06fe333
+feaf6afacf77d85bd812e093d97ccbfe86d693f181fe67eb87d802cc93d4f445fe1fec80
+d989d8a0cd7bf3c39bc0ff38e04ac7fb7ad820df79eda4fb7ef29bfb6dff10e5b83a63ea
+9df08bfe06bedd3ccbffa640dd0dee86ff88d93793df9e5cffb614b8d25bd822ddc10bc4
+e89410ee60fba10cffbf79e48fd9f94fb6ed6ce6b84ac1fe85c5a4f287ff79a2f790ffce
+4bd921cefb8931fe4e87fbcc61fac781d960ff07fb93edc01cecb70be586ed8efb79f728
+ffa505dd52ff0dccafc717f873fe84ed36b6c69ccca9f847f423ff37dcaf46fb2bafd886
+fea05ef093f789feaf55c0e039d85ddf94f180ffafbd4bff33d455ed5eacfa9361e5c09c
+f95ec72bf2a5c2f10abfe62af396fa86ff9dfa80ffa6fd50f2ba79dc81c6edab50f502fe
+5a96c8ff34fbc37aff971dd8fb09afd93dcce504d973b8f580ffae41dcbfa5c2ee9f29ed
+a501f794ef9fddb545bb75f9c65bff9bfb31c64bcda5e067c6f06feabea5f433e5a0c0df
+5ada9fff7cfa5fee2fb8ca9bde82eb87fea6cb93ed62da03e4cb31d951cb08d2ff25b3fe
+92f536cc51d826e0fbcf86da7afac497e123d3f32cfb67d0aafe98d357ff79d9fe7ace61
+e044da07ca4ce032d96bde86ffc924fe4d87e093d7b67cdbf4188bdda506e236d8f29361
+befe77fa69b6fe5aed1898e066c7f77af25fe409d5ff82c5ea5cd820cb79f697ffc44293
+e2af4dccadf19efe1ab9fa429efb9543e25efe7af22db2fa15d651e90dd86cff78fd56bf
+f26bd20bef52f915ffacf76eb6ff83fc9cf46ba5ee61c30bb6ec89fe86f47008afec17e4
+b11df287fe78b3cc93ed1fd94fe079ea1ecdaf50b2f293c2fe7cf58cf1a1cf93f91ed048
+aee492cef71cff3eeec337afd7f152cffa88f3be4eb6f6d52fe09ced35caa5c0fbd33aef
+0ba5e01aff94fab678e051aafb8fff55ec2ed80eefadfe16d5f46dfe01dd6ce584cfafda
+13c9ff7cd99bce4fff72beed81de8ab5fb97c2dd03e3a51dfb52e293d883dfc24499ed1a
+bfe724dc46e9c986d8f9a5ff63d914dfa4c798f567fec17effb741bded0eff4bc2fe8ef4
+02fbbe9dfd3af8d708fb35a6d863d925fb58ed7ab6f69dfb64ed33b6d89bcb6dfba2ff4a
+93fe9f5fe06a9affdd3e93f0c21aaff861ff2886b2ff79d8fe69b6d058c847f31dfec92a
+e277db93feb6e568d87ded9f28debf95c3ff57f32eff60f2ad2aedbf1aedaac3e53fa5fb
+2ff6ce3de025b0f779ffcb8ad979ff3bf4b467fcd379fb61add87bf9b517ff3c7be52ad1
+95fabf45ffd933d8ac45e861d99fe05bd881e0a45be77cb5cb42ed6ee4bd69e69abfee1a
+ffacea76d613ffc63cd807ddafff86fa5af3b00de07bebc611edc025fdc51286b9fe5e87
+ffd084db93d7ed49c2e79b44c2ed2dfc83e090d9af68d8b0fa13d27b46a5fe30fa4fb9ff
+9349f838aad988e491e07ad1f9a552fe64f9058cfed06bc5af7aff86f264bfd844affa2d
+eda2cfbe22eca52fe1c596f259ffc082e296f2bf9efb79ed5aa7e47a5bfe76f19ec5fb03
+f787fea5f619faba34d8ff68f893d81390ffc456ff83e4be48c5fe89e2aa70f286fea453
+d415c0e02ddac05cf929b3e062ffaf4cdcacfbd803cce6a545f110e554befa9326f9a9ff
+75d8acf00fff61f59aff5aa1f287fbb8f283db89cbe565d1ed86e0bf0ffb4cc824fe4689
+ddc386e080d8f2991de2ff09d94fe6a5ff39ed95e565b5c707fe6dfa7acdffaf41fe0bd8
+af33ef65d456dd0ec2e032c9fd23f2ce86e00dfb3b93dbb732c74ab6d877cff29e16e0a7
+29ffadf03ea5dd24d8539af79330d85afbcb4fda27caf289ea61a5ff84fe95cca5ff86d8
+80cff879ee5994ec9f2bfad97afb8dfe9f01c5dc85e015b2f63d96ddafd032ed0bc0d94a
+e435e005d05deca308fba71eff79f693cca7edb9a1c1ff0af6b636ffa849ddc05a87b8f1
+9cc818d6b987fe12c1ff79f156e5aed90986f293c1ed78e593c4fe2bf68efeaf52ffb683
+d89c1af6c094d6afee70ffa5f186ed2eff9446feb87beebf7ade63cefa7cf58efcc60abf
+e594ed01a5ff8af8b437ff79fbbf4eed1fe969d954f536ee0bbce42fcbf943ffc166b9d8
+4fcb37f1aeff56f36bbee15cccfe8843f286cba7f76cffb3c794ff87f725ffc152eac55e
+d92ded53ff04f861e57ad86aead060c7f779feadf8d232fe6afb79f826cfa5f334d88cdd
+9a38ffbbe929da529fff4ff202b1e07ad86bec93d901ef51ff
+ >
+ >>
+
+ /Yellow <<
+ /HalftoneType 3
+ /Width 167
+ /Height 167
+ /Thresholds <
+1ace5bd99808fbbd63fab215e074d886dd9828eea2ff863995fa6ae423cff0a306f59afb
+45affe9cfa05f394fd60ed1b98e72da3fe8ee926c9e51adcad0ec5ec21bfd810bbfca5f2
+7dfea0fb88dd9ed00fd833e5c8fe65f72b93e1aa3bfb58e564ed19e05dd1ff62f4c7ff1e
+f2c5ff15f19801fa47f12daafa20ff4df318acdf83d29eff67fb1dafd979bfff4ff7c73b
+de4cff29f57aff6dfba2bff384d188ee6dff5ef20bf9d8f686fe33f5afcf4beaca6cfb9c
+f32cfe01facb64d915e5c6ed06d97cf7a943e0b0c730d6bc67cc7ad5be67ca26d8a5fbd8
+79c7ed56d87dff4fbefe69d6fe79affb69ffa0de4ad938d852c807e862fe79f4affe8043
+a5d986dcbe23ff9dc8b72cfeacca82fba327de9332a7d9933da5dc5bffcc8ade7bfecb6d
+eac0a5d894fe61b7ed5aaadc91c8ff56f023a0e0039df48dd885db59d9afe042ed17aaff
+47fcacc721cca5e469afc0e076d867ec86ff9d1fbfd845bad06ae9b57dfe93f6a551b6ff
+a0ed5ac7fb70ff7de586f4d92bef58ff9ff287ff37ba5dff86b3fb0ef293d987b0eb51bf
+f145d0b234e686ee79ff85f691f0a5cb19e2bf5b96e9b6ef13ff4dfacc7adf0bffd98840
+edb50ae8c178fbb6f76ffeb5f87fd8aa39ee62d8b03fd9b461fb28e63fcef62ec3ef0ef7
+4a9ee586fbcd81fed158e909f98bfec11c99ff88cae666ddbf2ff6a5fe79c1ff40940df1
+acfe17da33f0adff7ff88beea5c659e433d64ac1fb7ace3bbbff169bdc20f250ff0e97fe
+b5e01cd948e2c290f7cf03e03bcbbc61e232ed09b9fa2baae081edc15afa0dcdb4e01fd9
+5eff83f7ab3cedc21eff87d0a5e46fb0f651ef6598cffa61ffd07bfeb004e151d80cd253
+e025fbc0a0fe15f799ff06ef96c790fab272aefe7cd886ebd012ddb75eed32b1ffafc665
+d03693f8d252da339bf1129eec60d83ede1dbaedd6fb9e45c1e47ad48bdb42d80ce04cff
+19f888b7ff84ec1fdd6ce781d0aeea5dd289d977c8e68643a6f784feaf0beb45a7ef94f5
+80ff9fc4fb75ff5dcda1ff5bf704fea7c796fe30acfb9cd028dc55ceff7cfaa6c84bfb30
+baf11ad893c6aff714bfdd934eed36d9c495f183e587ff93f27be65dafe486ed79b7d646
+ff52d809ffd822e243ffbb76fea535fac494e48626fba5f1afe34aacf285fec078fbd87a
+ff89f295fa8f51af3bc5e87eb1fa55fe6cf487fe79cb9fdb6bedc911df9cf388fe0cf44c
+fc86f6b3fe3beeaf34fbc1ea5fb6ce6efb9cbffe53db6bd818ed48a8d892dd84e61ed988
+d379dd3be560f3c66ded7bfd95f2a20ad847df6dd993e05ec2fb79ff32ea5ae0a42af5c2
+adf867ff43bffe62ed1cc94ad909f4c84cd832c7fe6ae2a1f280edbe5cf99ccdaf29ed50
+c1e0931bf247d7ed54db14ff7cfbc60ce05bf4b23abde509cb5ae064c3ffee93fb61ff1d
+c4ed06cda5e73db8fb2ebefe4395fbac56cab65dd993e0bf35c5029dd87bfea3d08910ff
+d927edc56add88d229feacf896bfe51fef35f478cd95fb40f49aff81d9a34dff02df51d8
+34c6fb88f391fe05f57afe9741e5a0d486fc80ffba61de209fe588eea428dcc0a9f6bc9e
+ffb77aff93faaf27f3be12b9d03388e9c166f179fdc68ff778ffc0a4fcb67aff98cb5ede
+309eff93d81fceff9350f79eff17b6e52470db03d9b7f2975ebeff27c79ae486f17bccaf
+f238d0ff30f9d578ff2497d9ffaced61dd0ae04bf2d59651faad3dff17f664edc25bcf3d
+ff69fabf9cc2ff50ed6cdfc21baff012bfeb93cb86f993ffb668e02ecb61edadce10e8af
+c806edb71eda4bd2fb84ffc94bd812cffa964ffc2de559c635e01ad060e89fcb86fe79fb
+a5ffaf3bfb05d9ab44e508d95fe76acb0be1c13aec95bff3d861ed7ee6a369edd17fdd6c
+cefe86d3ffb7f79f4187e1acdd82f26afe12d851de06e460d979bee1871aeea5c3fa8552
+d82cffb7f87effab69f5cb75e093bfe17bd8a50cf28cdf88d9a551fe13b4d808ffb57afb
+d868b6fc35db49e5af12d944eec0a9ff9fc551ffb768fe72f863ffcd79f29a08e4b679f2
+86feb860f3cc91d887fe91f29cfb83dc0bff50e53cdc54e018d995c5e369f396b8ff9fd5
+28fe92f66da7f876fe0586b6cc2bfe5af7bc04b8fb2cf2a738ed50a53287e0bdfe23fa3c
+ea50d9b8f670ff9ff986ff95f70a9ffeafcb4cea3bbff28ae0a44193d824c6eb1eb6ff07
+f25faffb39ffbe67fe2ded01cff27ce161e9a5c82aec9347ffca7cf59eff79f5bf9dfe87
+1bf24ddb2be086edd136dab5e046a9fa38e6afcb3efb19e2aa41e7bd03ff4def0edd66d8
+52edb6f67ed988f2c293bff76efe79b4ff1dec63c956edaf51db40edd220dfa1c4ff46f7
+a5c1dd32d8fe9c58d987c7f97bd8f1c7fe5bed78d393cbaffc9f2593edaf21bfd227e05a
+edc742f16efb83b5e516fe65f7caf159e561a0fe86d7a5c6fa24c2dd7ee39ecbb67bfe97
+37c8a8fc86f759fe61bbe4a528e55ad01cd83be05ecdb0d993e683fb79f8169ffa93249f
+f0c67cd886fe6aed88d875ceff9d6de086d97ad0a5f926feab3aa3d324fea90cff479fe6
+23f242c587cefe25f879fbd082ffba5cfeaf53ed8edd6be41097fb8d47c5f579ff0cb2e2
+12864aa5d80eb3f361ff0881e2b4db46c6fc67f4b582fe74a5dd93d806d0ff71dbafd40f
+87afff80fbcd42dc50ed3590e8984bef1dfb52f4d84ae0afff22d039bfdd8dd2f30ccff2
+8ad983efa5fe85fa26f652fe0ad0aacb59bfdd4cebcbfe8811ff56ed15dba5ff55f7962d
+c3fb3bf2b4fe3deb75c988deb9ec58e06ccbee7fecc461b8d293fabe469eddb5e206bef2
+169ae182c7fa39d81bfb80ffbe60e0adec23d0a1e769c2feedb6f681ffcc2ce5a6d8f437
+ff86e57bd8aa4febbd2ed0fb1dff60f7a52bf39e45fbc4ed34c1dc05b9f37afe9ebfff77
+d2fda5d693e010b2fb87f35de593eda218fa409fff9352fe07faaf4bc1ec6adb7be080b6
+ea26ff99f46cffbe8043c0f29bd093fdb32dc0dd0bedafec7ed8a5169fe093ff5af402ff
+79fc94f936afdd28faa5ff58dd17e0aeed864f93ff9e60cdfb35f40ca6da84edafc942d9
+f218ff62b0fd51befb42972ed819e04b93fbc04088b9c862f10dfa3affc40ffed9af52e2
+85ce7decbf5dc5ed9469b7fd529bf69329e1c511d94df405b85fff62acff6dc71cb6d982
+f86affcb79f1c76fe0c1a4e96cd8ff9604d0a5ff16c9fb65f08be01ed8a702fbaedd65e0
+27d94cc7f29363fe69d41dff51f5b9fa5bcd19d984d59acb1cd87dc7fe79d886d901f195
+fe7ef60ffec5d93ec2e984b7dd6dcfff74fe9d5af5ae6db4cd93c0e47ded27ceadddff77
+faa4c2ed679cddff59fb99d0a5c0e079ddb08964ed9bc0f234d953fd8dfa22c0ff17ceac
+e564d2fba568fb86e0c194e6c52ec0ee3cb9ec96e445d710dc44b0e0ad34fb1dee45cbb5
+2c86f2affc39c0ed9533d6ba40c3fe86f2c58ded1fff84fb79f69e5ffaafcb93e5b786df
+6dd82eed76fbb8f239fa61f04de5a407f249ff6ae586d036d96dd8992efaa5f528fe4ea5
+f1944be329d0e902d6fe37f84ef20ad995ff88f56794cfba5bfe1fd0f90db6d81ced50fe
+329af25af6c8fa03ff45a7fe95e40eb6d880e250dd6bfa1dffaf47c0eb30f1a83aff4df2
+a5de76cdf855ff8afb77fec297fe03ed86d4b899ff67fddcc359e477dd9f4af4aeff7ef7
+a163dc51e238bad352caafe004e5cf1dea44fb37f8cd07fe94fd86dda54696d881e0a5fe
+68edc094d5accc3dfe5ef4afff4aeebb69e07bd892caff23d9aec0f763bcff81b8e579dc
+9ffe6fd75dd905e046f234e78ed9aa5eee76f8af7bdf8ff5bc16d8973d86df93c5dd13d8
+86ffcc3dfeb2f584ef8dd07bed98ff84d87acdf786d979fa08fe9f25dda905c1eba55ae7
+6dd894ff57f629bed81392edb624f988ffcb79e256db0fe4bf2ef99aff77f4a5f931a4ff
+7bb6ff89d8a4c55eaee9be3db3d00fffb4f31fffc010cdb62cff51f81beea0c0e99d22bf
+e579fed012ff5aed06bee661fb139fdd9050ef279affc542bfeb1ff086fbc1fe9ed87cf4
+4ffec786dc43cbff01d84eceff6dfeb7edaf5ff86cfb79f259a0ed9301a5d82ddd54e039
+d807dd5afe16b2e420d093d880c7f171d0f6862fd0f220b6f947afdd87ea7cfaacf43fff
+c75ad81fb6fe07c7a5fb5cfea5cb6ad8b510e461dcc14bed36d952f50dff96f277daa7ed
+67e179d763dfaf52fb7af5d06ee09bc887fa0d84d5fb64cbb134adf286d39ffa7cb4f293
+c4fe3dface93dfc10caafb7eb2fa4ccbaf6cb816ffb502e0982bffaced6ab9ed84e57bb1
+ea2dd518ffc024edadcf3abff761d9c1fb60ff9ff5affe6ef8aff39fe76bc1fb60ff40ed
+5bb7fe3eafd8ff61bffecb79e4c107fb51cf36e072d89e79f386ed64d896ec73b9d088ee
+06fd46f7c693ff82fb95bdf999c7aee050dc26ff4cf722ffbaf631fec26ded9ed842adfb
+c134ff56d8bcff3faaf103fbdd67c1eb24dc51e039cc54e57aedb61eff6efa87f22ae061
+d0a2ff28e57be068cbfb79d3f28811c1fe2fa5fb20f844c188fba94fe59fc92eff9de01d
+afff388fe0b63ec71395e49026c749b7ff33a2ef82e2affa14d897e553a0ee913d9cf32f
+fe9ec9abff90bffe0bf8d011e0affb2bf84bf320ff44afe08bd9a052ee29d40de45ace16
+fe6bbffa81d69fcb8bd8a14993eda306f9af24ff88f115a7dc8ae1af48db92e088d87ab7
+ff43affc93ff8af59bff2cafcb74e05ad735e9ca93c1fe14e25ff3c5eea7f842beea57a5
+d9fa5a9ee4cd6bdcc495ffd95fcbf17ddb78e767f07afbd083edc90df193fbbfd84effbe
+ee93dc7deccb0dd8b8289ee885ff29fbbe13e0b3dc65d87de05ed917f24a96e253a6ff94
+46bed0a0de87d881ebc878f22bffd084d96cf0afff7cee93e52ca5ec61f119fb5ff0b6dd
+7ecbe879d3e55bb9d982ea4cf21ffb7ec4f62afe4df41ecba5df5cce32d80fd968d6f405
+fdacf686dda551fc3fa0f280d8ab52bf2993ed9d1effc237afd7f68c52ffae4de00aaff5
+31b1fe0cfc96d408c8b728e057a7ff6dd94981f9a5ce8446fe02f74bafe55af387feb05c
+cbb667cefa78ff09f7a5fb24f186e5a5c6fb6dc1dd60c9f685ff6bc0fe3cfa9912ff5ec6
+b71afb93fec241a5de33d863ffc901fe87d97de00afe39fa28b7ff4093fac83bfeb1f876
+cfa4ed0ab3d36be288d97efb06f786f2a6fe80f9bb5de0963ac3ee12ffbf79e5c649bafe
+0bfb7affd86efdcd79f193ff8022beec06f187fab971d897df54d8b03ffaa4ff66f47cf9
+d34de5b2febd2ced0bfbd99fd1be9afd73ff94df36d3f50bd9f1914dd593e6ba40ccb66a
+ffc051ed22aff130feab16e53aed03b0cc6fe5aed39fe97ae05bdd2f86f7d579fc88f2ac
+59df96cf52fe98c7a5d973e267c7aaed03a1e4930ec99eff52beff68f9bda1ff3bef60d9
+6de0bf45c5ec1da3fe79c7ff649dd87bedaf01ff97ed68b3d3dead13e43aafd90adf4ae9
+c6fe7dd494d92acefb1eff87f976eec286dd49e0aecd1293fba21b88f2d16de189c336ff
+56e025dbc017c5f96d93e09c3bffbcf237ca79ff88f5d8379afe7eb8ff7bd885eccc79db
+aefd68f4b632fb4cf538fea8f39fbfe1a81ff255cd11c1fa78f330e6af3af960beff9af3
+15fb61cfff6dd8fd5ee02ee786d0af40ed17c3e097d283ff1c9fff9357c2f040b7eb1abf
+f72efb44d9f586d825c1e93163f090bdf850febf9ef9b68f3fe05ef379ff589ee0c13aae
+e517ff50bff19733ffbad932edb8e74199ffad5aecb47aee8dfaa550eb9f47c1ff52f9aa
+d91c9ffe87ed5add0aa5fad00fe0d746e701fa4e9eff935ac4df1aedce81dd91d8bb08cb
+4efa03ffc190bcff99eb3ed8b8ff6ccced79e00eca47afdf87dcaf4bed31b6f193d862fa
+1ee4c493fb8650fe21e8a8c2f675e5afdd6dd3fa69afda79e0a5ce91bf4dfe9df775fece
+3eff69d7b27ae65ccb1afcafc1fb35e5bfa9ef6293f3cf5bdb8deca505fed86187f7c67a
+ff63c2de14cbfe20f5cf1ad963caff79fbaced22d886ed6ec5e562d116fb6bbfe24b93f7
+a26cf988cda5bff21ebced2d9fff935bfeb525f970ff93e67cd965ed4ce02ada85fe9122
+a5dd15bbff93f485fcd05bff2cf59bbffb86c505fec09aed74fe55aff2bf9ff3b84aed3a
+d704fb2fff9a0dc2f248febe5cff20f180c2e03cdaaffaa5c4e608f2ce2aff85ee76e50f
+a1dc9314f844d1ff03a0fe79d82df6c45d93fbc1409cdd03aff475fa79b9df64a5ff81f4
+2cb5d404dd7ae561fe06b5fb33b0eb9ac7a9ff80eec15dedc428b9ff34e262d0fb79f8d0
+47bfe40bed98c2eb51d837ffa2ca94fbaaf1b548bee5b3fb82f89d4bd82ed9a51fec94d7
+71e819cb48ffb557f22aacd811cde607d934ca86fb93d985ed96ce7aedacfe80e5a608ec
+6de5affb1688ff94057cdd569afb9361f3b6dd52d886ffcb64fed17feab46fe6ca35f29b
+ff73daafe91aefaffe6af9cc2ed89fe55193fbc044d6afed5cf7b755feafd094c4f258c0
+ff2af94cf034d31cffb13cfe9ce57ad887fe9742e5b570d8fb7ac961ff3da5dd88edaf1f
+e83ed8087ffea2f20bd852ed62c0ee89fe7bf1bf7af854fec38ee0b079edd96dbbff7df0
+a370fa82ff6add13e55bffaf60f3b637dd51d82bccfb88d9c444a5d4f24cc8edf524ffbf
+35c2e09614a5fe2ef2a526edb83efec327fabe80e1af1cc0e43afe51dd79d824e0bd80ff
+5bf224ffc809f096fd1199d982ccf2881cfb4ce77aace072d886d879e09ddc7bcce561d9
+17fb4ced0edbacc906ff9d24b8f393d1affe10f778c8f96ffeb6f6d037dd6dff86de26d2
+fa04c644e559ffcb09d9af36ff63f7ce3599fbcb44e05effbd4ce0b0ef53fe7acc27c0e2
+15ffca87fa91ff984ced2684ffdb66ace49f5d8ed883eea6fe44fab8ed79d865c7f95692
+e29f69dead11f260d7fb62a5f381cbaaff57f2a537ed96d093d87bb6dc86d85cbfff41fb
+2faae0c099f326bfff11f4affe02f687fe55f206a5ff83f2c39ec0f66afe7ef154ecaed9
+46fb1af079cf5dda32bedfa24a89b1ed86d55ae89dffaf77b6ff9ecfb93aa1e486ea9abe
+e510acfed51787f8b5dc37d2f59326d0a4c7acfa89fe52d89e4eef1ed861e0bfa1f8d896
+0dfbcd1fffd0fc53e41ad87cda86d239f6affe4397d6ff08cdf549ff94c4fe4c93f0d808
+b6ec1597e584fece67f610fe4ef73ffe32eda7e174dec293ff4fee77cea5d952ddc4449d
+edaf2fbfd988fbbf39d5b65fe83cb1e02cd892dd83f568e6a4e068d893fe86fb970cf2b9
+ff26c2fe19f7af3bc74eedd861f016fbaef475fe23fb43d694ed5c84f3d89f0a93fc9d19
+c1fe76f80eee41d1aaf26cf8ba77e5aff512ff52c238f4c15793ecba33c69abeff63f507
+ff5be59802d9ade573bfed79b6d886ed2fa3e9bf4286cbff69fac943d90abae44cd987e0
+afd2a4c688fb2befa20bec7bda17ff39fa89fe7994e9c04fc5fb951fea4edd97f826fb93
+ff79c6fa5bff3bce0affbc2dc1ff42eb19e54cc3ff6adc7ce29e58e07acef283fe9531e0
+7ad886db27d061d9a6f185ff46c7e7a741ffc6eb79e2afdd4be395d866bbe80999de2dcf
+fc9442c9a5d48dfdb079e0abfe8661f00af748acd98cca9dd86bffcb6def1dfb35abfe1f
+f951affad10dffaffb9f37d986b7f69efb78afff6eed9e18f25aff01ccb567fad061fa87
+c6afe55bed0abbf827ff8fdf6de2c1a5ff79ed66b0cc08d8bb179ee5c195fba5ca79fc86
+b6f49fcdb9a5ec88d516fb45f5d092ff1fa5dd0fcbfbabff40f35dff80efb751c802b6df
+9720fbc060b726f35aff80fab138ffa2f66dffc986fea502c1ff76fb64eb04d0ff3ef218
+b8e0a5bf93c5ea25f14cfa22f0bd47fb93bfd888e761d0a1c2e06190e36dda22d3f45bfe
+21d65ac1eb27c8b634fbcb7dd995eb7cfec143afdf34d8fe639ed885c9e56ad960f114ff
+4bf835cdb911c3ff7df155fdaef4871ced4edc35e454ef02c85cff69f329d956ed98cbb5
+07ed5bc5fb71f5b7891cc2e69ac9afe013fe93faa3f472fed079ed94fbcb88d831cf01ed
+c65bd823e0b53be55df2afed86dc1de09eef68b8dd7dcbfb46ffe530fe76fba1e080ddaf
+86e0b639ff4ef7bc96ff39f314ffc831f893ed6db4e593ed80ff39a4fe84f8d868beff29
+f655dc24f29bff79f5ac03bff725ffa33ffba5d098c7aad293ed65fea4e041d997d46fdc
+44d9bfabff93f285d89cdd80e136db93fc7bffad5ff878fdbfa0ea42b2d052daf960ba08
+f74593eb7bdc29e257cc30a5dd07d93ea7fe68f086da9f79f988fec17efa93d827d93ad0
+58f2c43fbefa2baeea609eda7994d889d658cf32ffc15afe19ed87d3a4c906e058d885dc
+78a8edc34abdff01c644ade06beed461df04a0e846a5e08cd094e56fd810e6c469edd251
+dc73d5efb61efe54f47afb0bafde2ef28af669fe29f793fe6bf95ed013affe23f84bfeaf
+faab06c1e033cde721d89335fe86bfff25e582c6a5ffd86dd3fbc349affdc392ffaff368
+ff82f6d012e0b6fb57ffcc16ebab48d919ed63ff7df794fea96dff86cf95fe12f2c422fa
+ed5ae213ed93d9a60bf379d0aaf912f46dfe7ef29cfb44cdfb5a9efe7ad0a5f7bdfe10cb
+b51bf295bfff81f7ca50fa16ff4bb6fc8db846ffb56dfeb9f3128ce083afdd24e45dcaff
+6fd879d119e086e8bf05c3e225de79fac66dea94d1bf1d86edc661affa79bdff63f3c4d8
+01e45df16cfe2eed5194fda51d84ffd8864ced11d847e1b6c74d93e8a53696e02ba5dd86
+cdf475ffbfa2c1e04fd816e5ba20e347de6fd585ffb26a01fbaaff7af96bfdc49abeff58
+96e383dd30d8b61bb8e49505bfe01fdd3be55186d998fa7cffc354e236d80fb4e97ad886
+cdee31c1f896ce23e2a13894ccff47facb6bff99d8b642ec9efb52ffaecb3ea0ed78a8ff
+89eda351dbae39ff61f5d455ff96ed13dd4d9de0af4ba9fa87d89dd990d787f5c02eecb7
+dd9d0cf6bfaef86dfd9e1bf1affb6effb9f46abef251ff309fe19343f906a7fb8ef083cb
+f578feb6f74ee03bd9c0a5cb70c6b61ede50e83ded29d9fb40cbaffc53f9a6ff6df7afff
+7cf295fb88ffc02df153e640a8fb7af59afe6ac2fe3ff4be65aeec1bdd5cf17ff9b1fc68
+b5de8b05edbe3dfd86f7bf03c3e9995df2afff4df3c959d829cbff0af1be7ce38ab9e524
+d988fe84f2c10dfb86de62ec3bff0bfa49e00fd9af61fe3af3cc69e03899de7dcbff5edd
+27d84dd90dd0fe88e57cbdfb0cc4db81eccb31d869ff52a5d997088aeb9bfc77e6ff4ff2
+3cf6d086f294d86accb179b8f1649dec81de31cf4ed82cd95dce62d819e393c7abd088e0
+1edaaf43beed2796dbad06ffd985ff7dfb9cc608e04ce52dc4f2a8d87be5a728d980ff87
+39d9fb11e07fd89d0ef896fdb67ae168fbcd10ff419ff9b73eb4d839ff81c6ee2bfeb0ce
+93c7a9ee67ff79f7c593e55ca5fa88ffd22bef3da8d87aed88f77ffbaf3cd905caed6bb0
+f758feb968ffb6e407bffd32f2b9ffad1cbfef2f8ada86d89d48ffba10febff704fed822
+ffc50fd860ef91f383edaffe0cf9a5f472fb46ff07f7b1fe60cef282d2aff071faa0c542
+d158d8af36ffd178f39ffe8539fb4eff0fcdf1b948b3edcf6db5c864fa31fcdfbf62dc3c
+f699c730a4d981edcb6de0a7ec6de5a4d946afd89415fc60e679bdcb9ede4bed01adffc0
+21ed5bbbfb96bff904feb0c61fecb876ee65feb241ffd42adf9f22f394469ef9ce5dd862
+d93fd0f95a9fd8f827fe07fbaec979eea54a93e0a15ee84cabfb92ff7ae30afec13ea0e0
+85cb54df9ed87dea9b5bc0ed8b0afb52ff1bd837e77bfd8bef0de5c15293d9b716beddae
+cf93bbf3588efea2fa20a5ff2af4bd93d0b68644f1c1a5d01dffaff34cfabd16fe4ffb03
+f9bf26fa96ff6ff4bfa0f223f939fe1db7ff90c1da44e084cfaf08d964e683e4a344ff9c
+cd37ffc39cd77be3985beb79cfe679ddafed2a89eda0fb7bed83c6affe65b4caa4dd64e4
+24dc60e5b6ff6fc8f385cbe551dd25c69fd2b679f7d064f025ffb20ff2b73bd8fa2aa9ff
+c1a4dd7be489fe5cd820e0a0fe74f5aafa29ff7df652fe1bed62d8afe514dd64cbe588d8
+56e616ff60d9fe8f05ff5bed6fd87be0a55add9acf8ed8a558f168d21be052dd42c2df93
+d989e46dcf33fb63f29efe46fbc386fe23d75ec8f26ce57ddfad14fa50f21bccf6abfe4a
+befa17fe85c2ffb318b7de0cff4ae50fdf37f253afed92fe81fb36d81bde32b7ff1397f2
+81b6eb43ff5ae5a72eff9add81c6fa6bccfe79c593d94de030bbf948c7aff385f9ad3cc0
+d91dde6ced9de093eb73d6a4ff30fb72d388ed9f51f67afea5d795ed23a1ceea7fd987e0
+3dfe07c0ff75f525f261fec590bbea9fc1f787ffa54cff7ff344fba0e97cd8b511b8e36f
+f2b452f49fff26b7d00bfc57ed86d8ba93fbb7860fc5f29161b7d05ae03ad986ff51cf94
+d886f198ff89d4ff33ce4dc6a1f17af888fe52d0a9fa3cd8fd6bf293dd14fcc786d85bed
+34a2e525a5f113fe70f586fe66cba5f10b9cdf52cff268afff86d85ccd43d809b6fa41cb
+96c3f24bff30fcc20adeb636f24acaaff438b6f72afe9fefc394ec33df86d67ce033ed09
+ff40fb7a32d804e4b3cb14c5acd50fbff929ff94f688d917e9c68ed872ec51fea4bdca93
+ff48ed31d153ffd99733c2ffd93ff79dfb60f3afe465f223fe56c379ea1586b6f787ed0c
+cdbb48d3afec79e467ccaf02b9c925aef1934bed04fe89ceff67dcbf57e4acec02d0afed
+15ff82e5c12eff87bafa34c4e704fe88fb79ffc786e07dee019ce0b8d96ce0af5dfb86c3
+ff68fb75e557c6abcc15b849fb64c9b0fb4dffaace93b8d888cfaffe9bf17efb78f192fe
+69ef5aa5df71d835d456ffa540ee0efa88db79e740f81fd3a7c0fe81eea546fbadea0293
+edaf0cc6e89329c0fe79e7bea2d9fb61c0fad81ce0abff66fa98ef099dfb2bbeff76d9fe
+69f6d760bdfaafe179d9a54ff392ff87d342c99eff3e97d959d844fbb579dd13a5ed9556
+f2b7e320eda84bf421fe61bfff861da5f73dfec598ea02afd81bdd88ff7cfa67d8ff92d7
+a6f71993edbf0ef74bfb5bf319e864cc58d72edc51d928e086ffca49edaffe7cf385cdfc
+7ede9acf30f294d8afed60fa0997da20cbe56dd87ef8c96ad8ff8648c4eda038ddab42f6
+04bfa5e05a9bff9350bfd824e582ffd95ab1f417eda139e0a545ffd98c33bff71ffbc50a
+de38f49cfb62f179c7f77bfc95ed6cd0f65bffcc79febf873ba5d980cbe56cd9c2a6da5a
+ebb2ed7ad086e227bef979edc098f20cd843e3a653f222e95fdac43b9fda80e096caa8d8
+92f610ff86f49fff7af7a5d11d96f7c1049fe026dc60b6c838ff5afabf02ff4fa0e079c4
+f271fe65b3ff29dd59b6fc3596dfabf505fbd07effcc6de04eff2df3cb3ed7f579fbb4c6
+3bc18cc5e086d880facb7afbcf861ac3ff6ca9e06caeee7fb6d816c1e022daa52ceaae1a
+c6ff0193ecbe4de025d2ffb3f860fe2cbbff953cf72efb93d846ff13f353ff6dd9a72dfe
+4ab0e095ee84fec09ccf7bff86feadf569fec221ff3bfa50afdd94eb61cd07bac743feaf
+e05c86ffd06aed88ff1bf6af7be0a862e07fc9fb27afff3be3b7f607c1f093ff23d1a7f1
+1cfe7bd98856f21798f993ed84dab06deeb602e44588fe9ef71eff38ef4ce12195ed0d9e
+ebafdf4dedcd52ffd159fbcb7bfe86b0fa6bffcc73e0c0529fe2c2319bfb88f49b4aed15
+d596f29110f0d080e0c008f2b784d88cddadcf3bfbbf6bd3f978ff31d910ec38fbb704e0
+51d829e040a4ed7de49dc0fe78d823b6fb99ed80e86df230fbdaa542f8afcb50e46dd3f0
+14d0fe9bf6198eedce7bd8a04d93e89f45d962e588fa60d8b94ab1ffc1a5c5dd31d01ffe
+c00dfbc37cfe8fcef25bdc78ecb795befea5c4ff62c1f73ffe78fa9811f19e32e9992ae5
+52ed3bbfed08affb34feaff37afeafda12d861e5ca84dd73ea4dc3e0a55bff9f67fe56cc
+f969fe9a0eedb95aeedbaa24c75dcd8af77add67e5c96eedb5ff79bbf96bd9b413ef31e5
+5afec637e053fe0bcdb88bbf18c2e1930bfbbb98fe4bbcfb9229d953d5ffbe47e512edbb
+d96dfbcd83f3c03bafe27ded9de521ee4cfb72ffa8e9955ce0a237db5ad921afe811afd4
+5ffb05d064e852b0df7ad993d12ebfe186c7fe77c5ff6cdab6ff64cf95e05ad867dc21d8
+3ef163f9a8ff0cb6fb3fffbca2f96dfcc10dedadc4e4971fe941c0f67dffaf860bff87f3
+a5fbba46cbafff4aa5fa931199f1d305e749ff86d0af84f2a569f993d0bea2e54dffd881
+fb5fffcf62e02dc3e79442c3e56feeb56186f8a4fc86ff32f21da5fe0a9fffc510fe31f9
+63b6d893b8e545bf69ccf97bffaff496f99fff79befd3df286e37dfc2ebff925feb207f3
+a5ff71f820a5e004a4f3930fa5e527fe86f6a1f293ff6bd083e1bf49c3e87ac6abce0ae0
+33d844ddb651fa2688ffafc9a3df61d825d7fcc19fed4ddd01e7a2fe1796f2d827d0fbc4
+4886fec192c5f343ffd80acbedaf16ff39fa7af19d3ee7aced38b2f28afda506ffacf384
+ffc136f5d8b62cc754b2e081bedd73d2ed4feb87c1dc79cdf43cff12d287f3d9a529eb4a
+d718c84fe041cced67dda5c947f3b895ed77d869efc860dd39d95bd4f279fad843e7c7fb
+7ed9b643c40ec64ab7ec94ff1c9fed9358fe27f461fb78ff93f67afeca82f2cf43f05aff
+1afbaaf2934be039d2b895ff6dd886dfc23784ffbe74e4a5deaf55fa29ace568b8fb803e
+d8f18fdf61d912cafa9327c8a5dd1bd674edcc79d85adc0f9cde930bff90f4a6fa68cbff
+3ff8b866de9bfb45a5ff099cd97eedaffe0354ffb3c693f18bffb67bfaad2cfeb916ffa1
+d65ada08ffade445a0fe81f6b6feaf44cbbd66fcb7883ef260faa7ff8ef4abfb06de56c8
+f732fdd08ddd9ced88dab81cb1eb2b9be560a5dd8fd87be4c33a8acff57afa82fe26bff0
+2bf850ffaceeb14df435ff1ff09ad6b978c6f02f9fddff87c24bb6ed84ffaf63d8ff86f7
+79ff57f53ab6f820febfaff25dfecc6ce03fde03d92a9ee4931afebe21cdb0e581c7fb62
+f8974bc2e4f586e011fe52dd34edd00bdf98cb82e06fed1dff80e5c23388ffce1cd8a701
+86ea96ff16afd91fffc09bd216e951e038d95ed78af0a56dd9a504ef51d819cb4aeda4df
+52d2ff13bffa02fe35f6b578d9ff05b6c81bde62e358cbaf79e98ad61ae094d88dc0db5b
+ff15e1fe0296fac250bc1ef7a5fd24b3d52cf5b70dd84ce49cd987dd68c0eb9351fb2de6
+a549efb1d095fe86f2c35ef1aed086f778ff28f35bb5e02fcbf26c9d36d862ed9fcfa5fb
+6cafff88f352f72afb93c7aaf44299d9f3bc5ae569edc6fb28d860f5d086ed6de22fedbe
+93d0a5fe84f876fe26cdff46fac080ff93f5a5ff7efb6af4be79b3ed6dd981edc10afe4f
+a5ee62ffaf88f49dfe86fab908da5afe68f60dfd62b4e97ed89361c4db79e993fbd769dd
+7acbf95dedc16fee7bfeaf04c1fb26ff9f43c4e083d877c7fb8815ff52afe26bfeb54bff
+39ed5add8cd893dd1bbfffa61cfec8ee80ffc05ffa06c3e626d846c1e092d9bf3de561cd
+affb84119ff093fb3f8eb3e17ded9d38fe4fc9a1ff87f753fd23c8b810e6afdb79b1e578
+dfaf31e056d938d005d9af38fbd851ffafd04c9cdf86eccb79da30edd03fd90fd839cef2
+7deda7c99ed1aeed2ec5f545fcb6f750ff10d149afed06ff429fe09334fe9ee03ccef29f
+5ee57af1afff06f7b0ff1badd8eb79c6f539d60fe0c193e06dd501f04afe73f69157ead2
+79a50bcfaf25e088e27ab8f880fba001ff4ea6f987fe15dd57ecc5fe27dd78d0ff59c2fe
+4abae579b6f906d744addd7de069eed68835ffbb15c4f31dfcca7afe89f996f286ff9fc5
+26e0951df4abff6af7be21fbadf877b4fd6bf681ffa360fbc221ff51f94293ff9e6fe0c2
+299fe080b4f299ff82cd93e4c002ffc5d949bff78853ffd393d817e060db9f37d994f242
+b8f9229edb93ee73fb16abfa85ffa3caabe043d5fa933bdafbbcf84cfd6af336ff4aa5ed
+62b8e57bd0ed0cd976f18bffa549d886c0f50cbcec1aa4d4ff0dceec86dd7bfbcc09f197
+ff2ca3f3c75dd8fb9866d886b6ed10c65ce161d817e967f75efcc878e22cce3f99e49143
+c1e012bdca99ed54e3bf3e9be58aec7bbfe008bbfe1c95edbe3bf4c823d937e061f675fb
+b0865296fba724eccaac11f96dfe87d37bf2c86afe7ce564ccaffc7aff5ad09ac4ed35d8
+be59ea14c3ff9f06bffeae5be479dcc59abed897c1dd18cdfe38f7af6bff9fc94cd128c0
+f6b4fd3b94e09d78f9d9308df3af34ff4defb76cffb141ceaffb469cf79143c1ff3af148
+cfa1e9b71ffeb6fa82d393d8b046f9be91efafff61d0fe935fff52e52cafd918feaff762
+dc03d8fb6af3cb68d7f974ffd05aa5fe6df7a1ed29d84ed1efb7e414d0fe9538e6be50cb
+aaed20fe4ba5ed28d2a9ff32ed51e509b6f62bff79affe25f596fb5e86e5afed6bd8952f
+eeac12ff4ef21dfe75f59d5cdcbf21eab82dfcaee993e07b04a0d8fa5cfec44d93f1c854
+e093c6a5ca27e587c5f964e086cbe607deaced70e59fff6bf779ffcc8745a8db3afe0fe5
+9fd90bff50d816eaa00af1c5acf276fbcc7fef87dd25d084fead31ceaf38e6af4be30c89
+fbd786dcae54c1fe86f2991eff7df3904cc1fa7effa5f136c0df86cffb62b7f90298d98d
+d886caea78dd53c6e568b9ce6fd9b8f136d951f721ffcb59fb86ddb693d885e539c7f093
+63fec486e35ff319fb50ffb9ed6bafcc2bedaeff67a5fa71fc15f662fe55d91ea0ed14fe
+73bdff63f91fd9b708b4d828df4b9bf6bbf072ec65f27afe68b5cc94fbb779fad77ae520
+95d9a206ff5cd779ff52f3c478b8ff7efa85fea1cbaee5ba2ded14ffd80bb6e53efec960
+d831ddafe064d91ed886fb9d5af3990fc4e979c1e44dff1dfba543fdbfa2fa07afee41fe
+2b91c1ff7bd088e0a8f994d8b93ef661fbc558ffac0effd8a551f279da95cba9d587e451
+ff13f2be86de05cee822d9aaed93d8aff174fbd07adb5bf229afd893d07efe8af55afdc1
+aedd31e001ff96c7a5d022c2fb34ed63c7f24cb6ff51bffe38f7c0afe72fed9fe5b23af0
+da10ed50d214f23aff5298fa7acc5eafeb62c4dd7ab4e0a4fb6bff01f5a1ed5be008cdff
+3bd9adff40b1fe69f3aec86cf2d6871ff288c0ff7ce099d2f40da6e328fec06e43ec03fe
+93d5be09a4e07dcfe68830f7d306fec23aff4bf831b1d882df8cfe39b6fb519bffc039cf
+4eff0e9de0bb4bffc0a7d394ef4dff35ed4cdeacec960cf261fe93d0b829e442ff98f16e
+d885e126a5dd2ecba5ed71d061e04697fab608c86dffa459d898d98ce093d987edc346be
+f193f880ff9d33fa08f651c1ed93d6b942c3fe7cf678b5e56bed75bce025d99734e6be16
+9bffb3cc49e155d817fa5087cafb78ee9f14ddff9fcc5ef02ffeaff249fb299ffac16894
+e0a46aee85e5c1a0fe25f7c046d4a2f079bee4865bfe7ce585bffb2693ed9602f83efe6c
+e186dc9ffbbf2e87cdff7ad8af55fb78f7abed87dd4ae6adff5acffe84f56dfb02db85f2
+8ffecb67df93fbbf1ac2f986ff28f75ffd66d308fba5ff1fdf3dd917beedaacf94d918b6
+58fa7dff952ed0a5ed19c2fb2ed1fa86f180cefa62feafde3deb73fe9bf792f07edbffa5
+3bda57b7f57ec12be687c2e077d987d891deb954edafff33f5ba0dd89b11f164e55ea9eb
+6ddd20cffb1cd8edb4f32dcbeb69d4ff37cce881dfa5c60dfbb91ac87cd9fa3fb8e420ec
+c23cbdd85ccb09bffd9113c0f29406e45cd887e5afff2bd81abaff36ec4cd995e525de5c
+edaac91eeb7add85e06bcb9ffe71d6fb875afd67ff87e4c523e562f0affb48beff5d93dd
+9e0dca50fe10a5db46f069f893d90bdd30ce45c6b51dd8f381ffd34ae266faa5ff1a9cfa
+3dff15f661ffd108e259dd79d0ff5bface7bd991cbff08f793ff885af4b88e01a1dc973f
+f7b67cddaf4fffbe25edabcd76f75fff06bee864a4ff7ff3a5ff19fa81feaf32c5fa9a3d
+ddafc2ff23f39e3bc1e979f05989d6acfe79f56afea5ccb878ffa6c0fe50f335b6ec5aab
+ef9343c3e523cba1f03dfe9ed0bc0ae06ddc81cbacf454feafed93c6b0ea7ed086d825d2
+58fb7abcffa2fb6fed68b7c80887fbafb9d945d0afed69cc79eba8ca2499fb83ccacfb42
+a5ed7abeff18fb4196d8b549b8e0accb42fdc5fa6fffaec90af261fc9ec777f65efe39f1
+9fe594ed5aa9fbcb4cd80fd479df9ee861f2a1e54dd5ff7cfb43a0d960cffb934efba5da
+c2f60d9fe02bd0be4aea0ad94cf2309fd992d0f603ffce20e0afff6db2ea2ed4bf85f24e
+fb93c4ff20f83aeb05d883e061ff3cf557ff03fbafff79f1c4a5ed61e702d797fd2cf7a9
+edc31ed87af184f835b6e5a2c53bf2afed46b6f31593eac729de3cb5eca5c0f36bfea5f2
+0ffe81e66daf4ae018ed61fea2e42eed12dc99d986e054d81fcf84ffd61793f888fb95ee
+59cb24d886d96aefb41ce55bbff786fea913e0afc70dfe4786bef364b0ff7bfb93f58de3
+7eb8fa1cff5586deb978fa61f206d9f679ff60f90eb1da70ec3fafd886de95ff64f62dcf
+a3dd7ad895e1c13890e09f3afe1ed885b6f24bafdd84e04195ff4ffb10db61cafe04f755
+fe71da7affc96ed9ff4c9efb90f286d12de051db22e379d766d915ffc6ef86d693d9be44
+b5d886fb59ff2ec9afff92fc6ae0369af0c231e050da2cf98eff51fb06feba71f6c48ae0
+0ed843c9f46aff88ed7db6fad83bcbed01dd32c753ff38c3ed6cd5a5c0fb9949e7c1a5d0
+8abb42d89db8d888ed37ffc1a0f36bfdb646b9d988b5fa19c0fc21f34e9cecbd10f9c093
+e552ffcb79fec75aff6bcff387cb8de593ffa55ad990df86e810d89827fabd64c2e102d9
+5cfe6dfa7bff86c89aff34f99ef19529a5fa58ff22f88cff6dd093ea7db7ed0c7be742f3
+afc0fe51e5a1bfff7bc9a5d86be0bf9ccc2ddbaf33ffa5ee7beb82b6de26d942d0e51a93
+ff779bf883b6f29cd1a5fb0fb0e54bed2ac4fe9330ff51dafe83fa12f34bff99cbb615e2
+56d60ce0a7f113fec779ed86b5e06dceff6bf6d06fdd5daef39b34e2149eed25d8af0de8
+37fe54d728c0ed73ff2ec6b3fb51f4add81eaff777ffafca1ce59fcd04bdfb3eafed86d0
+54e1b6da35cd83e0b0eb05f14ade19cbfe79f8c0a5d28708ed6ed980f503aceb42fe0df5
+a93bf75dff7afa93cf48bffa22ff50c2fd7af25e9cfbd458dfba43d9ff61e623db61bcff
+85f979b3dc0ecbf285eb9b28c7a6e793bdd226f077fa8dff97f779fe7ee5a236e351ff38
+bffaae29c945acff29fbcd15b9fa8ad4fb63b7f875feb6f19fbeed86fb18b8cea0ed62a5
+dd80e06afed035dea140eda8c549edaadd6de8ca61dd21ff7ff96afe73f5a54786d9b9fe
+66f6af39da51dd22fabaffa3ca26ff5fd0f16bdd86e17fcaed83dd93ed01e277fd9860dc
+86e4983dcdabffc02eb7f611fecfae14c994fe81f3ce40d816cafe7ee5ad4cd816f8affc
+3ecd5cfe69fb85e05dd928cc4ed331d84ecafb7bd998ec9311eda4fe93ed84e6bb66efd8
+61e940a7e5cd3ce0c466ae01fa49b2d398f54bfa0cffc030fe45efb689f283cbf965ff87
+f57dff2cf6b90bfea5ed65d409df9fe411d8bbfe9b38a4d885e09cc4ff83ec975ad849fb
+a9bfe38933fd9fce47ff22b7fe17c556d2b0f218e6c3a5f808f4b0f90587d9ef66a5ed93
+5cfba1ef3eafdf069ef792edaf43f164ff93f5b771e087ee7ce003ddafc61efeabf180e5
+88ed9dff69b6ed09d25bfdcc7bd960d809db4f9cff9343febe86ff0993ff9d21dfffc593
+c2ff3ae080d993d857e394cca5c609e551fe1098d836d90ed65ed89f59f2be4ac3fb8af3
+c03ec2ff7df22ce5b4ef1eff4bfb03a9d844fdc892f182e61194fbb2c61bf3bc97ea79cf
+a6e69ffe3ca3d853fe34bed167dd85e8b93693fec646c0e028d864ffcc79fbc75bdd72fb
+96cebf2cdf5bc9ff4cd81cffabf79a45eba5cd36bfff01f6c01aaff226c0ff87deb049ff
+1df8aff47afed706e0abca1bedc3afed4cbbf58656dc26e779ef66ff21f186f370ff16f8
+61ff76d9abc1e579eeb6fd95f285fbafcf83e59c32d851affb934cdb68d180fb6dc7a5eb
+93bfe573eda30ce033d868fecd40ee58ff79e561affc51f830f368c9ff6eed93d976ffae
+25fe53d8fbc41fe28dff71f27fe5be1eed48a7ff27d13be00afd9fbdfa04a8dc7bebc255
+89d0ff6cf883ed9f52dca55ffad87bdda54bf02bf6a5c3e58a40cab63bbff270fb86f79b
+5bdb79fad077d9f385f99bd80bc7aece5fc52ad1afec83d892edbf2eff4bfba5248ae43d
+cf16df43fe1ef7bfff93ec19d8f6acfe07dd4cb7f261d12bf752fe28c1ff79f9b2f24eaf
+d980e0a5d92ef2c707d879de8fd8b627dab00efbb648e3be79f19f4cec80b8f405d1a5fe
+3499fa88b9e77cf288ffa5f26ae979d097e532fbb339d9f128b4dd0ed862fec76dfbd087
+37fe57fbc899d886ea5d9dd4ff6afad964afce25df4cd1f32ae4950ffc346be0a944fea5
+f741fb9efea5fa3a9adc23fb429ef38fdc6dd0ffc358f97bff93ed7ab6d87f04ce62ffb7
+8728c3e787ffce0ffe99e47ed988b6e04fd8a51ec799ff25fac10bbdfe549dfa88ffb511
+fe5ee479f3cb61d6f27dfacf19e0c096ff5acb87e546c9afe06ad0fe18d861d9b84bb5d9
+21ff45fb5ff2c569fe79bffa60c0ff87df14b7ed21b1e6aac2e09418f952ff01bffb22b7
+ed0faaff30f9b579ff83b5fe57c0edaacbbe15ffc269e07adc89ed05e079caf24fe9a6c0
+e161cd07edb839ddabbfe030d860c9ff4eefabe597d959c8ed9654f33393edaf59bfff17
+d0f97af286ffdc6ded7be59f61ed7aceafe065dc38ed94bdf19dfb429fe79412c93aa6ff
+84fb0facee38fc95f361ff10f64c86e2aefe01e493fe7cd587edc18eb816d8aded07a5e5
+9651ee9ef57cd793ff4bf70586eecf7de375b3f27ae585c6a0e087ed7fe7c238ea11cca4
+ff8a4afee1b275edb61af2bf31d3b952ffb66affc25efe18f67bfe5b9bf76ffe0588f0af
+fb1192e087fe43f527b3fb6dffbfa5c1e079d8fb3ea9ed943cc614ce45affb05d84cd0ff
+8bf63aff19f2afcd62fa41d01dc6afff2cf6afff89ea5cd96ec3dd7bd9b61cb8d883dca4
+c3f0953abeed60f42eec5dddaf0ccbff86f83894ffd23bfbc92ad84cff39f274dd89ceff
+5fb6fe3cc2df31d84dfe35f354d860d304fe9fbffa62d92fe5d67f5cf6d82dd0ff5fa5fe
+7bf697d813d9b003e086d897d793dfc01bed9fc5fa9847d0a6f4af24ccbe71c4ea0de041
+d91afe49fa21a1f2cb6ffbaffe9cf5ba65c0e186ecaf1cca5bdf85d89528fea4c1e88cff
+86dd6bd85ad843e0aff231b5f826fe50f59ffe2ff9b543ff20c0fb81c7a7cc9ac0f737fe
+9ff347e69fc1de4e88edb77afe6be19acca9c715f042afda27d8a5f583ff95f0a5dc6dff
+22fb8ad96fe04593f07af8b103fbcc3dacfc5894e4c24edd1de561c5f572fba3f240ff27
+f947ffa8d051e760c1fe86e953d7fc67f99fff79d199fa81ef88d46bc2e58909e055da61
+e337d8fe2896ff36f4a8fe9bbff744fbbe58e0087af34ae504ef87fe7df7c10297fccf62
+edafd286e95ce36deb93cda5e852f21dff50fa11a5d87be06ab2d023ff81f2afcb17e493
+f4b00afb5cfe9ebdf971febf8bed13d65bcc19d880ec88c9afed51f2acffd21fdec36bed
+a1fe96f083c8fa09ee87c0ff86f99f45bed131bacb69ed86d979e587fd28b6db1cde3bff
+77b9dd13e03aaffb5eaadc52b6f79dff5abfff97f222d886ff79a5edca69d886da48ed02
+a5d978d0f486ffd9a5cf75fea5c51dedb779fed83d91de9f44ff0cafd992d003f261fe86
+d979dd7ee285d8fd62ed1abefe75ed5fd809f971ff53d827c6f17ddd32ea65d8b30ee050
+adfc96f792fe5afa08b7e5409dfec41884b8fe983effbb2688dd0fe047b6d59ffb3fafd8
+26e1afff79fd82f7a9b7c814f330d965ccff79f76bcbacef339ff283d8ed25c1ed14ffcc
+05d938aff630d27bfbaeea01cbf947b5f715fe6dfa92ccff5aee9e37c94cc020fa9cca51
+f9a8cb2fe54daac6ff0be5bf94c4f72afb7affa8de2fd50cfe9fcf26f0af3cca85ffd632
+df93fbafe55adca3f280ffa449e5afd095fb28cbf67affc92dd83fe075dd8bcff67affbe
+2f8fd9f15487ecacd05fe843afff90f378ff29cc9bf279fe8eee19e853dd09e04beba0ba
+ff83ef9e0aec95bffb0796e0c14cffb76aa7ff77c6af86e579f1d076de68eca04ac1f19e
+62e088d3a4c6b723e262b9e517feaffb93f0b55fed32dd6be284ff88d5fb67a5f27efb69
+ec79d855e0bf50c2f393e0af44fab759ff88f5bb4a98faab12c84a9dfdb532b9da60d1fb
+931bff4ec0ed9346eab686e579f1a6c832ffa448da11e4c8f94abffbd70dfd81f8c1f2d0
+61d91de082ed61df0fd83cca5dd887cf9eff93fb7ffa62cab040fbd8ab36e556d8f661fe
+88cb08f2d03ed8f45df942feb613edb8fd0cc6ff8733fcc30eff3ae452f1d681fb35a7d9
+62e00add67ffc194ffb0fc0ad85beba113eecb5ada19d84affacf49f24fb9a5cff73eec2
+70eac695e008d9ade46ccef67bffd81bec89fe04edb138c1ed84e5a25effa8d109fa4bff
+c003fbbe68e8ba68fa9752a5e6932cb2e559dd199f8632f5affe51c5a5fab4ff6cf686ff
+a4fa2eee51d223d83be30df7c25a88edbe81ff7bb6ce1ded94fbb57be5ac2fbed89ec781
+ff9449a5d95cddb9d86be6b680ef94ff9040f398c5ed86d27ef29ed03ce513d54aa1ee93
+fb27bcdd952dfaafff86e1c01487edc579edcf39d818ffad04fb33c4ff5cfb1ff14eb6ea
+2cbc84c7f35bcd77fe99f956db08fecb1ee062ed9fd0b587e87cf3b117fecc85efb6fe02
+d0ff7cc0f270d8ffcbed9a68c9aaea01c74b94eb9cd608d962c788db7ff0a5ff8ed879e6
+b7ff18f9c523ee48ffa5c65ad62af761fd95ff1cee4de035dcb2fe81f9981fffaf44facf
+6ed808c7e5af0fff50f726ffb02aecb67af786f3cc72d97bc7f859fed09247c2ed3798fe
+d13cfeb40e9ffb8adb65e0c07ce7a374de93d28bff7acaa4edc13faee096d916e086cf9d
+f279b1f781fec352f423fe47dc29d7ed9e3be01fd881f2a550ed38a3fbb84ea70bffd82a
+fb5cf781fdd02de053ed7bfea5f711febf6ac1f251fe2593d8ae68e1af8ee586f232fe80
+e095d803de8de879fba5f868f01be63cc4f37acef2992afe5bf6a54efbc17cdd93d85ec7
+fa85fec756d9af35fe1bf19c3fedb761f1d9956dfad85cafe469d8ffbe4df1b7f63afeb0
+43f9be28f352da02e444fe61f894fb24ff86f6bf30ff49bfde3ad8be3494d980e06bcdaf
+ff864fc2fb93ff5dd93ce0c395fed90793e5f7c05ab0e28fd894d938adfe7cfbb1e021d5
+59e0af43e601abde81cbf439feb83bfcd102d860dfafee53ff85f3af57c5a9cf09c9bb92
+d3be93e04deb1587ddc1a7dd7aedcb66e0b61dfe77e5974ede10a8fb21ff93c0e367ffac
+cc1effa607f7be22b5f106bbf64687e5d58229a0d886f2d169edca78feb7ef85d895d80e
+dc56d463eb45a5edafd968fcac6cefa7ff15fac1a3f25b98f7adf16cd079f4a9fe65f71a
+bc60c2fe3a6cd9a1fa77ff20ef60e6bf13c9bd399af392ff7acafb85fed032fbbc79dd89
+cff263bcfe79f89a0fbfcd22e069d1fb31ff62f558ff2afa5dff70fba5bfff40fb12b9ff
+26adfe2ff9c09ff206fdce7bedd779e060ec43b2d104e679e086c6e566d7ff7ac3fe73cb
+aef81d99fab4fe6ddd19b7fb0fafe09341aaff25f366ffb0f188da72cbfe890efab621cc
+ff04dd60e3af3fff09e5bf37e00cd930e7c114bedd7ad6f08fec79ddff4af213db55cb9f
+ff86f4a4f16cffcf5fd941ed2ea5d84a96eca40dff50f00f9ee542a5db37c9ff7afaa0b8
+fe18b0dd88ed93d87de0a3ed06b8cc27d969e093ed71cf9ce088d76ced41b0daa538ffa0
+2cf2bfa5c4fe6dfab787fc56f940b6fd3397e03e9fe82cdf5fcaed4bdd0cee5aff79cc9e
+fe30f8c6e85dd091e1c23ea0fe0afbad29c8e67fd3f379b6d793f6b979ed66d978fe93c4
+ff87fb4ea0ed932effaf43ff2acf9eb3e487d293ec79dd07d04ad827dbac0bfca1f586b9
+e56af2c766f8d687d97dcbff6ec2f586fbb14bed30e747cb9ef64fd51fde41f2c078cbab
+f47bfe92f6ad57c1f846fc0bf24ad980ffcb5ef8bf59c1fb9347f90d9bdc3af2c82ed99e
+ed7fcaaff365fbce85ff93fca96aff85cea6c697ed38da61d8a60a98f777fb1886edd079
+e580ddf59f50ff34a1e042f24cc62cfbbf99c5f51cd851a5df73cbff60f9d280e098c7ad
+f91ec735fb7bfe2ef6b5fb6ff964fb7df4c566d81ecbfa12ffbd19e03cb6f324feb52caf
+ed12d85edda4cfbb93fe6cd986e27afcb6ff9f12fe48e837dd4fe502d5fe2cafd987d279
+ffaee51093ed22dc95e161d3e480edcf8bea62a5ff84d818ff52ea0bd8a620f251d402dc
+c130bbfd45f724afff90f482ffb6d93ae0a9bfffa524f84dc63e87d8f06cc6f962fec08a
+ff9ed10eff3aafe480edb81ef3ab0add9e47f304fb5be47eed94e0b846b6d8974593e3a5
+cc94e03c9fee81ff5a9bdd7799fa86ff6dc6a1d254fad885ff93f31cfe52f705c2f23bff
+0bf0aa2d86ceec6ad896ff85d0a3f161c697eb62e238e9c02b9afad469ff88f501ffaf1e
+feb658ff22bcdd0fed6be498da91f980fec779d988f46eeb9fe079d88ae6c94de01eec5a
+e579fec055d935e0c095d9ffa5fb1eafe3950cd89b17ec62d970ee86e67ac1ff44facd58
+e2c06cfec1a8cc76d816fe52ff05f2a5e50effbbed33d917ff57c7fe27ddc1adec46d3ed
+59cd9fe54df77af1bf5ce434c967e383d899e07ab4eba5c75ac0d9f953bcfb81db11b7fd
+28b8ff87f517ff9ffab57afec54caae6c247cfb578ea9ec832dd79cbfb6ff7afcc4cfb2a
+d157e041b2ed17e59cff14fa4ef319fe5aa5fa7ec5a5d030f1a310fa86f57bfe5eb713bf
+da84ff45cefe79e5c4aef822fea5d953fc27a0dd7999fe80f7b425ee60ffa5f596caaf87
+d083fe68efc475c0fe81f28feba870e59506f787fbb722b4fc06afff1de0a704fb76b5fe
+9fc1fa33ff5af425d062fb94ff459ae5a525f060f7c874e059da3dcbb1c453c705f361e0
+86f216affe80f0be51f67cfd96f5a54ad89e32fe93c1f271ffbfa0f686ffc344b9d093c8
+a5df7bcded07b6f76bffbd52c3dd96e463ce02c4ec8ff15ad09fed68b8ee3afd4a94e1b6
+3dbbed86c5f802b7ed2bd93febd091d920e04ded39ddf75ddb30d8ad42f91cafdf4cd103
+f6bc4affafd634c964ffd877edc788d85bc7ea92cfed4cda0aa8e08ed681ff95d914e787
+f2d102ffc98de1a552ee88f9bf82ee32f785fe93d8b91fffbf94e03add24fbd010d953e0
+07c0ff86f3bf63ee01afe59412dd37d953aeed7ee230ff61befb3b93ffd848dd14f389fc
+79ff20b5f3a5ff69fa32b4f405bffa28a5d885ddbe5cf593fa12b5e06ad2ff64caacff88
+55fe79f9c08cc4fc6a25ec89fa7dfe93c6ec6ac1ff7bd987fbcc68db7dfe8df1a552f495
+3ce56cee9c42ff279dfb88f2bf51f016ddaf3ff9a6cb28be7fef874dfc2fbfff1ed8a508
+fe94d8a5ea3ee44beda4d054fe76f7a4cb5cadff91f384b5ed3cd619dfabd08bfb3ecafe
+7cfac193fe21fb65f1afe704d8afe4679efe80cc9ae02dd85bc9eb48d83bdd9bc1e452ff
+7acaafff53f701ffcb1bdb79cafe31f29847befb1296e5bf0cedb262ff0fa5d8ffa3cb4f
+ed16e25bb7fa399ee05fed30aff21cea4fe40fc3e028d3f8abfe2ff5d07be0c21ee579ff
+97c0fe55edc27eed5cdbfe3baee0afd09cd979e569fbd8af51fb15bcd29aff7af76ee82c
+d9c36cff9ded67d831cdff79d993fb5aff36e079d9b14cedb507e061d9c5a5d8558cfe86
+f21ec7ed25b7ed4daff894ef739eff86f7af18fe74d997e81de07dcf91eaa366edafff4e
+9ed884dbaae16dcef142dca4d32be99cbef379c108e5b99fd5afff0bcfacf11dfdc293e2
+75fea4d0be93fe79fbb68613c1dd81b6f948ffba60d229e641b4cb8cfe31b6ff9b67d8fb
+61f50efe4afa9ecc4489edc87fe078fd22b2dd0cc9a7fbaf09ed43d81ce5b9fa8813e661
+ed7ec69bf2a5ff1ee797ce6dffa3ee8642ff0df9cfa843bffd5c88d6f678feca41d80bfb
+c726d752e0c593ed2dd864fc5ff131dd4bd5fe9738d2aef45efb15fe39f7b679fb86ff5a
+f6c649d939df52fb65ff28f44d9be577ff86d8b146ff13cfb862f530ed43afce5bffd9a0
+51fe09d8af6feaa5fd93c4f766fb0ed0a0e508ccf8931cc794ec82e4b419f4afff119fff
+3bf0bf90fa68b6ff3e87e196bff990fe85439fdfc2a5fe25b7fa0aca4abfef5ffe26f2c2
+3aaff8bf9aecb628f0db75d1adfb9f3cde02a5ff92e64fabfd93f26bff48affe8cf5a5d0
+86feaffb8626c1f962ea0dd073edc087d824e5c331bee19476fe85faafeaa7d193de6dcc
+fb86d826dd62e89cc9a6ed3be08cff9ec0f202e8be70fac496ed65cbf212dc50f301abd9
+7bde58ff82d9b745eeb0ff3faed82bc6eb7cd965d0ed6cafcc5ae045cfed79d7f35ffe34
+c650b7f1b3ff2bf948b3d0e252e992f86ba5d888de9f5bfbd51ae05ccb7aff69b8ff39e0
+11beff81c1e47af26dbedd7ae008cf9fbfe50ecb42da0ae59d15c6f3ace57edd92fe88de
+af4bf494ff5aa5f89b03fbc123e5b871c51eed49bffead31ed5bf598fe07f359f881ffc4
+09d861e37bfe9d35df1fe846acff2bb6fe9bbed786ff2ef193ebc03af38ae574d96bcdfb
+7aff964ffe39f8b233d8f604fe94f49f2dfbb81db4d093f2a5d905e468b0d592ed6a96ff
+7adb23ccfc0ff446bae59370ff8af335e596d80e9feb86f7d84bb1f358d826cbfe1bf65a
+baf936fb74d885f27aff6ebfee934dd905ff33c951f22eff9fd106b0eed06edfc46aeca1
+d016fd5eff86f89501f1c68ed8b644b8d592d829dd4e97eeaffb22d951b8f693ff7bbed9
+86e076ce34ed45e5b0c763fd1eaffaa717c2fe24f3a20bdd55edc986e0bf77feb67cd962
+d816e0afca56ffd94ce614ff61fb93c4f45bff03f5c729d89fff86b9e47cceff0df5c92f
+dc79fec34afbbef557c93184eed01effa1f95f9ad986afed6ddc95f04bffb7ea3fd5fb5a
+b8fe7bf2a5b9e99ec0d966e079fdcb861aff4df2b33cff80f299d979e038c3dd9e4bfb12
+ffa9f77cff72fba5bffc8648c1eb86caed61d841cdfd1af860f493fb87ff9a5ef9a5ce86
+e04dd4fb5a9fd753e0c0aff7a905fba618ecc325ff99f382ff6af888e5799ff67ad880e0
+af4ad917e39bdd50b8fa69ed5ae039a5fe6199dd52a9eeafd30999ed9161d193ffaefcb9
+62e5bf76d4afed3affd42bffc417c1e093259fddaa28c4e632bece66fb45ff17b3fa25f2
+a336f9d891db86fecd60e047ba2df6bfaaff6cfecd79e060ed24e438ebc25be11bd3ff95
+38fea517ff83f3af5beda8c605df51d810caec20d944fe95ed77c6b1f486ff79fa3387d3
+e561d0f29b5ee552de39c7b0dc3dd801f2c726febbed1fccf67afec165affb86cfb115f4
+72fbd82dc5f079d0fb8647ffb9fa26c0ff1bdc4ee30593fa9c4aef13fe85c8b779e7a060
+fda55bfab1fe5ff687ff6cafed1ee087d88be47cc2dc5ac7e6af47ed2ed80aa5ef8dcbfe
+ed930fd957e51aa5f793d184db69ccb30ef281f7a560f1ce6ce0bf98dd0be19fca51ffb6
+7cf9a5f384baff7fefc10cafff31e703dc3aed93d9ff4b9eff9245fcd386fac093fb28a5
+ff6efbbd68e0a54198ff943adfa82ff2d61de041fed99cc9b682f7ae1fff9e01c0e39353
+d8a6df79eba5f899c1dd34cdff89dead51fb06f54ebbe37ef3cd3ded11cc96df07d1f879
+ff5cf60ef15afe3eafff9367ff96c1fe79fabf34fb129f53ccfb88f384b9e028d940fec0
+9efb78ff9bd92fe0c011aff747fc30b2fb64ff31dc79edc729d855e03ba4e05b9ef7dd60
+d893fe81cfb71ac36ceac42ebfdda50aed9819e45ed2ee7de9a72cff86eeb6dd54c9fd86
+d0fb9f57ff79ef8fbe4dff05ec4be0c751e9affe33f6cb81f23ffbc335ce5ffe7bf4af0e
+ec43cbf188db93d0fe34d803b6d96abfff43acf39348dcc394b7d8a5bccc94e008ecca14
+e061afe550ea87d4afddffa74ce42ecffa67ff7cf2af08f243e5ba51c4fa70fe9fde87d5
+7eeacc86d87be89afb399fff92fb79facb18ffd02c87c5f857acf06bff9ff2b910f986f5
+6dfeca72d8ffadf19b0ccd47c1e05bd907fb6af4a50eed4c8be7bd80ddab11f9d288dd96
+fe6da4fa80d96adeb217fe66d8a46cfe86e823d651e186c2fea423e558fb1b86f1afff79
+f99fe579d8ed5ecbfead29fb4eff3cf420fb6af752a6fbb6f123d0b89aff5ef37d04edc8
+91ffaf42c6a5cb5ae793d3a9cb21ed88b1d035ed52ff07f4a54df125f9c00dd0b1e44ae9
+08d3b77ceda967d9feaf16bfe229d850df3dfea5d1b81ee15ab0f84abe3284feaff793fe
+82f093d17cd830e0c07dffc50bfac42cffc58635f254d825cbed12d541f8c279ed9fe104
+edbe16d8b3f26dff94f9507fd8ff6dd3a5c2ea9e4593ed2fcf1bfab220fbb610ed9fd0bf
+91e179d59dd884cfed864ba2ff7ef70bc4e037d8f8b924e060da9ef005feb632fb5dff7b
+f761fe04f3b77ad893d96ac6ff93dea562f35afe86cfbea2ee34fe4ebff29343ed9cff79
+f5affb86d776e042ff96c2f126db93fbd9c255e062dd13ce38ff4df7a4ff6ff9b02ae2af
+69f2af60edb7fea6e67ef5ab58ff86edaa25ffbe59c4ff7df491ff46a5ddc031d9baf537
+97c6f63bff52bffcc565bcfe93c769e3c17fe086f960ef02c4fe4bf219feb92dd8fac241
+dd66ed54a8fe9161a1fe7af213fb6fdd86edbf9ce018d893dc81e567c7fd1df23dfbb60f
+d844fecb8cd9ad1ef761fe6db3d896e506fbc864d835dec10f99ed22fa93ee79ec4ab6ff
+62c70588edb524ffc0a5fbb99feabc18c4d943edb86cfece4bd8e59545d917c0ff3ee3bf
+94db5cfc9ad82efb973cda51e0c180fb06affd9d15ddaee90884b7d880e012dda7e05aec
+3affa436fe4fd832df93fb83afdd7de5a55fff9f10e493c6fb90bfde74d8e5c146d1adc9
+95ea52d622fa63c2f555fe3bcbadff43a5e0bfa2d087e579edbc1bff3bfac196d824c1f5
+14ff86d1b67fff92faa84cffcf61d95acb01da9ffd86cea3f4afff3cf5d09641e85ade23
+cb86f2629bfe86d3ed1ba5ff8908fecc7bed64a2d97cf32bafe507d089f375e7b886fba6
+2bedc589e071e5c286fb62fecaf222fb9af361fe09f79eda86f4d06df2a5ff7ad75be530
+beff43c0f17bccf561fe1fb63cfe17f52f7aff89f92aff43beff93d97de439b5eda0bcfb
+1795d8f98657ff26f74cfeaf7ce598dc84e553ff89e07ad9af54fa39ed1ce071cbee7bb4
+f785ffa5f35fd834e00fe448d875d89f65f9d87af193fa6bfe40e5be04e65094f7d83fca
+f4b95bf893fbcd08fe61c4ff70b7ed46addc11fecc1ad3faaf4aff27f350ff3fb5db944a
+92ddaf43b8d890cb83d672e60aa8e5c517c0ed26ffb6f76acd93da04e94cbb87d3a4e8c3
+95d0afeed80adda5ed7ce2a50df14dffaffc68cd0ce05fd8f5882ccbed7ae065cdbf25fb
+5cd868f214cca5f04bfe41f4cb8edc9ed752f3049fe11dbfe02ed889fe7ff669fa80ff93
+f212fbc91db6ff09c64cd8a1db77f3ca7fffc0269bfb932fa5e423dc3b86eabfa5dd51d0
+f979ffce61eea14fe49561e593d8accb93d8a3ed2af7c5ff5ff886ff28f24fff24f154b8
+ff3993f89c61dca30f95e021fc5ef8c196d9ff33f372ff59fa449d6af6c352bfd95ef4cc
+81e0c21197de86ff7aef9e4ac1ffae01feb8a4f382db8aed07ffa4bbeb2eb7d09cdf8621
+ff61f774fea5c2fc6dfe4da5fb52e616ccbc9dc4da2acd5de0b48aed79cba9f58cff0db8
+fc30a1e036dbafeb51bdf1d879ffabc2ff9c4afb1ceeae2fc9b51efe87c6f779ffca0df2
+5cfe66f710fb61d8af1db7d60ced99e07cd894e08afbd360bfec51cefe79f3c7fe79f0b3
+dea03ffb0eb0e05bd801d979c9fdeab686fe1a9bfe33affe3c9fd8f82bf2a4c726feafed
+6de49bd33ed913ff4af8a8b9c93cfd67f75ffb03afeabfa8d00deaba34dd55d888ecc87a
+f2bfa9e446fe1ea5e67bfec054ff3de550db34e0afed5dd0adff79f688fb70d0ff8641ed
+bf5fe00ed6f18fe47afe99f568e07ad926b6ed36bbfba5c520eda9d08abfff79ee6ce5a5
+ca3eacfe14f958c82c9bfbd975ff06afd837af49d8a53a86ffd06bed79befe9eed86e5b1
+1fd036e064edce7ae5c767d2fb895abdd241e6b778de0fd850fa90ef75e488b4cb31e779
+e093d685e393c4ff37f94ef196c781e593ef24f8b608dc9928ff5ff193bffb6bf4af2feb
+86d680fe95fa834ac3fb84ed11cd56d815de9f02c2fd9f13fa93f677be37b6d815d94dec
+a6fa56ff74d7af65d93ae7a0c73ce449ed02cd9cfe54f574fbd06bddc0a5feafed861db1
+d996ee58fbc5f566ffc6ec1cb5d995fa21cf40acf82eff9660ff80f9aa4ff2a017eba622
+eeafff75fe65f9d052fb81f2c318bbfb42c1f079fa95fe5af20cffbf28ef6ad88be076ff
+2afa5bff79b0d06dff67facb82ddaf37ea52d608dd9cc4fa03f2b527b9d3ff9820df53d9
+8af17ffe66f2afe06ccce977d957cbfb94ff65f384ffc30ac1ed90e101fecf92ff7bf66d
+fc96ffa2b9f935c8b52fe7bb1aefb34bf301e44abcf3cb55fa86e28e1c9fe009b791f45a
+fe31aee082f2c968dd7df0c7a8d805c3ff2dc0f887ffbf86e50addabca1c96e9acd7379f
+ff7acfa5fe0add51d819cf9cdd4ea5dd81d943fe0fb4ce9ed8b815c2fe40f097e443a1fc
+06d0ff7cdc95ed83ff5ca8d859e0a5f01088f3cb6dffb8fa39e5afc84cff27f847b6ff2e
+f2b11dda48e0a5cb3f93e59f36da6bed9d2df253d209e0b318cf5be088dd7affd49e5bff
+c47ae088d87eceff8d3be0b627beffb2ed85d0fa46d6be93c5ef4affb917feafd712f749
+f28ce572b2df73d852e040c2f59333f1afff8620fec0e54cdd2aeb61cd87ff84f66cfb79
+c1fa58feaff299c0fb5fed3de8a7d983e0c00ed2afed62e56fb7f219fe4dcf22bfef88ff
+73fb7be6c144afe39928a7dd9623edba94d988e183c7a5d36bff9ff7ba03fbaff570feaf
+c0ff4cbcde86d99dfe84c8f985f222fe50ed0b89fad8af43fa23ff64f29f15c1f77dffa5
+dc4dd72ffe52a6e57ff612fc78d9669ded9348fba279dd99fe3fbefa5afe02f393fc9d57
+d0fb7de05ac7ed9369b3f797ffb794f4be25edafe032b5ee12e69f1bca52db24e086ff6a
+f64dfb2ca4ff86f730c8a5f947c18fc7aaf5a2fe3be51fcb4ada37fea5fb02f2b6fe78cf
+ff61f73cc0fb1af353fe07edc134ce7eed6bdf21d651f2228ecdfb60fe1cea67dc52a5e5
+6ad87dd094e0c13880eb94d8bf9ce736fbaee562d810f183f974e97bcaff26d961df99e7
+06cdfb39dbbe63e0fec01dd0a5ed15da84cc62dc2ad8ffbd4cd906f3a63bd8f204d157c7
+1efb43e2a5ca439effd25cd972ccfb7de579f4aac602d07bde93ccf35ad879b6ff12d886
+d9fb33e062d889dd7ab6ed9ac0f265de7bd760d849ea0da5d886e4a56fdd99d87ae0b05d
+e592ff55d09bff88e47ed1f69f13eca7cb94f527ffbf3affb0f540fb65ffaaf704fe5af5
+47b6d771da2efe9fe460cf0bddb8f71396ee89ffc34cbfff86b8e470ffce28ad5ae26bfb
+81d69fed93ff7af2b01388edaefd77ceff61bdff8bef82e566d96dff7ef2c20188f795ff
+4ab4ee30ffba43f19ffeb712ff63bae51afbce69ed94ff23afee82ff13f84ec7fb61ff16
+a7d82ced93ff8ef585beee3afa06fece4bfe31f8c586fe77f026befb39afd810fcb645e0
+afc73df14aafd780e096ca13a0eab6d929e087cdbc91d0a5f90bff94edbe47c3ff8ffca5
+3d9ce0c057d137abfaa354f221a5f40c9fedf887ffc52fde51ff36d41bbcca6edbfa9749
+c1e62793ed9f46df30fea1d0afed11d860fbaeebbb24b7e17fd4a5c78afe69d848edc98f
+e03ca6ed9d32e0b341bae379cbbd56e57beda507d593dbf779ff5ac71ce03ccffe6bcb9c
+de65b0ea81d7a647f213b6d2a5dd7ac9f962efbf79ff86fa79ff83c0fe5dfa0ff358fbd6
+87199ff2c152ee3aff1ee079d9b63fc985fa932ce579f0b5fe6df3a9fe84f01bc4da7aea
+cb7ad9c143d2b809aff68ae97cb6f4a5fb3ffeb731d6fe68a3f9d815cafa7ad8af0aff2f
+9afa91e533d851fea5f339fe06f753da14e581fa9b37f284fec350bffe86fa9ff550f909
+fe9fcdb637ffaff24ebf3ab9cda0e9b572fbaf28b5ff79b8f220c0f60cffbf96c3fb4cfe
+0ae89f29e0a54aed07d843dd25b5e406eda5d97be0a962f0c4fe4aadff84d899f187fd5c
+f489fe03aef1cc51d81fd94cd831db03b7d993fb3bff9929fb52ff9332f1d97aceb50dfa
+c645d96ae0a059f6bf0de0c342affe79b6ec5bf1c66df3c047ca79ff8fda85e071cd9fdf
+85eb7afbaad021bffe5ed709f793f25cd204d96dd68ddf86f21dfed382d971cafa87fd0d
+f34dfec0d95af9d818e04ec6ff9a68d989ec2be56bdc92f259fec670ffcb87dd7bf388cf
+fb61dbc375b9ff29c0fe3991dc7fd81ced61e566c62fd0aaea53c1de5abafb84ff94f788
+ff7ef9cb44ed87e05dd3f1afe384ebfe9c4fff3dfbd85f9cfe90f107d0ec9474f385ff87
+e14fdd21bffc369ee086dca5feb81bee40fb0fb3fa67c1ff36b6ca5aeda2d980dd95e96e
+db27df78ffa5f125fcaf42c2e09351f62bfea11aec96e07bd8950592ed9a61f5bdfc862f
+c3ed3cfb60d8a4f732cc75d887b7f21b98fb36feafe65193ed9e34fe48cc9be87acefa05
+b4fd9ebefb0eb7ff9cf816cba2f371ff189eed63cd07c861e0ac5dffbe0eaff8bf8d47c7
+02b66ac8e686e0976ceecc1fd879febb28ffcd5ada2dee9bf685ff88cbaff94bfe05f15a
+e3a2cbbd6ac3e540dd1f9df2d827ff88f54df91cff4ac8abff86ebb845b5da60cfff9b61
+fac19ddd66e1afd045adff2ff7c6ff40cbe9a24493e5adfb87dd7dc6ff5aafed95ff16f7
+40d9b0e36dd9c00fa2ffc219f9d886f16afb0bdd52bbeed057e032caa5de43d878e586fe
+27d886e0c32abce593edb42af19ed075fed88614ffaafd94dafb18a5f225c2ff2fa9ec5a
+e4af82e0a61bfb93d7b604b8d55de80fdd6ad896cf7cd836f95effa8f688ff94f0be4b8f
+e4b30db8e07acbbba3fb0fceb12ff793fe7df4950eedba2ee902aef340ff6dfac061e5b7
+74b0e4860fffb2ee03d951d31df2af07c1fd21d97ce069d08bfe52f6a55df1cc33f4b26c
+bee51fd9b4f286ff984492f293f77dfe70f4a8ff52db6aeda5fa45fea6f53efb4bffc253
+fa23e59f36c3e561eb2af24a79d6ff64b0dd78b8f880ffc138fa50f4c77ae445fea8fa28
+d994f280ff2be551ffafeb77d909e02dd85ad061fbc6fe62f39dfb3aafef2df379d967fd
+c45ae212d839e7c978fbd67dffc88cd883dd0eed8ad053ed1fc2fbd668dd79ff9ef485fe
+56e78edf81d052fba3beff02a8dd1ed1ff9a64e07ad2ff3cafff884ca2d82be6c1ff13dd
+50d724e2c206bfed33d5b810b6ed7fd96bdd9ad079e694d8b66bf6aefb88dd7fcfabe0f8
+b939bff703fdca47d9149ee88ed9b962ff94f27edc68ed79fe54c7a4ed84f3c21793fe95
+d484f16dfb19d99303a7d83dde88c1ff72d856e597ed18dd9cbdf6a5ffb651e09f47f1b5
+37fe20f8a5cb9bff16f593fe9f37aff132d8b741b5e06ecaa5fe42f16fe1af35ed58e5c9
+83eb932fc1fa91ee03a1ec5bc5edb8fe6bf9b577d8af73fe8df05d95fb6c9ffb80ff95da
+5fce08ffaf1ef8b210fd61fec94fd91aed3ebfff59992687edd879e3569bf489fbc94aff
+019dde36d810cd4dff9ecf3abdfa1dafd93a9dfbd027ef4dffafcaa5ed7ae5b6ee79ffc3
+61e505db86feaf39c2fa6aff3fcc5fc686f21effafcb79e566edb951fb5cbfe086d86cd0
+f87abffe62f78afb11bced1cd29ec0ff0ef5c293f8b638ff63fbaedd1bd859fdcb7dfa95
+12e039afcc1cfb40c9ed37d9b6ffc63bc4d921e14cf238fe9ce083c6ed67dac18fec0698
+f28bff7bb0f30cbceccffe9544ffa5bfde23d866b6f179c1fb50f8a5ed87e0af18f2a5df
+70cbff79f7b760bee47ddc9c14e751bfff49fa2fe1a518fe95f9a8eb1dd0ff53a5d988e6
+80fd26fa6dd962ed0efbc3a6d081dd2ae4a53ffe25ef49c0eb139fdc21e3c599ff4ff788
+fa2f96d879dd27cf60edafc748f075ff7fe3b151de2bd8fb84c3f063f39de986bef88117
+86dba5f279f7ac88c2e67af155fa33a5ff3af24bceafe138d84dcbe466d2fb6ea512e5af
+cb1df282ffa0f70dd3a5e56dedbd6cc4fd2cf7c188ff09ee9945e107d8f140a5fc31ccf8
+92fe34a5d886ce5af7b1d258c943bff66292f1bf31f201d88fdd9fe793ce87d99446ff09
+f560ff88f3c87eda9bff935cfbcb79edaf3bde80d8ac61daafed4cfe9efb81ff9612e19f
+cfb93ff3be23ff94f4b647afff05d97bd75bff01a2e0b0fa4efe0de059c8fb05afd325d8
+87e4cb79df9bfb7bff77f59cfab821fe9f41ddf3c165fa8afb6beb37cd61ea56ff2cafd0
+1eff419fd85aea48afd862fbaec1fe6690ffc55af3b662de79c4f50cfe98da80e02cf188
+ff78a0c7e40bdf9ec1fe5bed47d207fc33ff58f6bf9de487d579d903b0fa4fe50bbce1a8
+2affc186fe6bfa27f0bf01fd6de5ae1bc1e040d2fe5af709fe98cb86edc260ce74edd579
+e5acff27dc6ed2fc5aef93e5bf93b9ff3cd998ff74f66affae0af9ba1dd5bf28dea811d9
+87ed82c6f97a34ffb52dd952d287dc7bfe94dd86cbfe80e587b8f377ff96c5fb7ae522da
+4f93edbf0fea99d386ff0ab3e36edd61ed14ff52fb9ad90cd8fe2aa9ff7af849b6cda5ff
+6bf2b1d6a3e01fde5cc1fe23f0b6fe67cdb683f4ca3ff2d8974af209d0a5e55affd086d8
+3cccf368acf174bdeb86d86be914fb48a6f70effbf24fa9744bfec88f4af3fbed026ca33
+ed63d3af7cec50dda3cb42ec95d76cfe52efaf64fec16fff5ada04abe6d879c7ed79e20b
+feaff31bd132fab410d95fefd005e0bf13e532cda0f880ffd02de0b077fb1fed52c2f23d
+ffafd093c5a9cb74e565eeb34eedcc59d893ea71fa1fc1df9855f979bffe86f332a9d895
+47a5eb1cffd665a4ff8c61e6c47abaec51c8b38f32f59cff85b8fe0ac2fa2eaddc37f9b6
+db6ed0e77edd9f66e05acbfe934ffb1fe39cff7af982ffb3f41ffcc02df9ba13fdbf86fe
+46f2b2e57afbcb39edb22be693ffc95c8cf107a2ff93efa646c3e480edbf70f59bff4593
+fba566fe85b6ff52baed3d9ff281fec14cd8ba9efb82d89d1efc51f336f9bc20febe7cfa
+be6df437fe15d796ef8739fec218ed42afd96ccbf96fffb9f67cd99930f9d805b8fb1bf6
+a6ff6afb17d9f9ba5de70eef49d9b465d893ff7be59f5090ffa32dfe42b9fe8ef6a911e4
+c2a5ce86f20ce960dda34697e067eda5cc5ae892f220c5e088179ed901b7d873fbc466f5
+449efddd56fecf3bd852cbfb9b60fda53be5c328caafdd31cbf54bd4ed73d914c9abfb61
+dd22d9a4ff6ae51adb61f0be79dd95d884ec9fcf3be09b18e694dd85b0ff40a9e4b97ae5
+a5cb96f114ffa43fe310d838e54cfbc25c93edce70d858e034d986e69f48edcb7bd879e2
+86cbff23ed4dcf18fec6ed09e5c686f0d207d838edd160f234ff51afd886d815fbb6ff7e
+d019ff7afbaf62d8b65ea5edc5ff5af679ffab51e1a4bfd8ee199ae56dbef483f9932bc0
+dd07d6ff60a1fb7cf369ff79b8e6a220fa86f463e402cbadf763f205c794f8affe28d3f7
+3cff03fb46db8bf462ffcb7afb5fc2e269cbf50ffbce2aff73fa66d87adfc083f287fe9e
+c774eeaefe2fa5ff92fa81cba1f15dc7fe8821fba6ff1ff65098e0b6f86af2b23aaffa5c
+abe0619af380ff669afe82d894c1fa3ffea9ee79e209d99fe490d903c7ff33f7caff3a86
+b8ed94e020cdf30efb277fb6cb38aefa22b4df15edafff79f75394cfed4cd819e19ed907
+87f2c75be0b0fe93bcff4996e07cb6fe59cc44a4e57bafc886e17cb5ff0eacd929a3f103
+b7ff25f7b677dc5bafed54d902e5adfb24f6b548ddaf07f7b519df55bee543ed08b5fe24
+beff0d96e0afd445c69fd1affa883ea4d880df93d97acdfe1bf8c854e0a5c3e627beed05
+dd72e0c551bace54f85cfe41f567f14f9fde8d1093d8fa24d046affa61b6d595ddff4df2
+ffd97aec67c2ff62d838ecafbff20cb5ff85f8bf48eec0ff42affe952bcb39ea7ed1fc32
+c9ed29dd90edc050ff11edb64cf2d872c7fd6cf7d151e4d84fa9d930ffc493fe7fd888fc
+c4469ee55bcefd79caed61d6ff83cff46bdc9fc1eb51f379ceadf730ff6bf483fe37dc13
+edb9ff05fb55ff1df64393d9a82ffdbf18fb52b2f84dffa7f51a96ff24f389c0df79cb9b
+d886d6f360febef44daee46bfec986ed7cfe40c288d793bb09cda5fc44acda86e09920fe
+65e277c1e03ea5fe935fd89de00ed0f286dd6bf917afe85da5f67fff09fa93ceb761fecb
+9426f7b638e0b17ffeaf79f2cf84e0ad43eb09dd3aedaf62ffd086ff9c17e051befb9340
+ec9911ffb927fe7bd888de34e461d9a0ed07df5feb79fe85d76de8c296bbeba0c0ed78ff
+d86493f27fc8e179afcf5b92e4c06bd89dfc2fafed1cfa38ffb521afd92fcc9fff81f2a5
+0fdb2de058b5f615fa5ae986ff2fd399f703fe4af6d186d892f52599fbd610cefc30f669
+ed55beff58eec09fd983fecf3ad872d76bdf2bf5d89a18ffa9ce59f0c419edc12afbb50b
+fe5df193bef89cffb831f3b60cdb3ac5f292ffa221e4bd69faacc873e259d517ff9dfb7f
+f1b44fc48cbdfba5c74de52bdaaf46ef30cf5aff01d04bafe8c445b9ff0ac1fb26d8fe3b
+f2a5e64ccaa5ff7dd885e0c26dfbd072ed7ae00cd93dc1fb8bff93cded66e0a0c329f2af
+e179ed6ee4a0c7b75aef31fe50d9c452afe581b6c98fd4affb9f09d99927ff50f10f87fb
+b4f23ffeadec8641fad468e683fe9f71ff9661e6c668e89cd119fe4dd25ec979e4c18eef
+7cfaab4bd92fedcc79f2d02ddb46fb86f093e0ac43bfd804fc86e4ff42cf1bed9fc0fa5b
+fe86c5fb7be486b6f299fa11ff9cee6dacf36aec7db6cc5ffe02f068da13dd4afea20eec
+bf3aff97f753fcbc93df64d84df3069effad4bfeda9341c5fb1ab6cb5efb11ff95cca8e4
+78f286fe29f44efa1aff2f87d8f479fecf6ce5afc3dda22088e0c35a94ffbf79afed4ad8
+04debf41c8fa924bffc079f9a6c2e586f012faa522fe56e08ad0fe78f965b3ff0ca7fe7e
+edb0cb38fe62f9c569ff95ccb826afd893f862ff078be09af30eafd921fac635d87adc6f
+e020d2e53bd9a0ff10f693c7b686ff80f7aff260bdf7955ae5ad02c6a5d061eb1cf2a5e6
+7fd9bf33c6e18652c1fe9661bfff31f07ae5c062ea1ac0ff01e994da72dfaeeda4c1e64f
+b7c742aff6933bff4bf4b7ff9e1cf9c506dbf033c1ff93f77cfba5ed0dbfe0a120ed3bda
+7b29fda3dc68ecce79d82dea05b6c69fdd3bd892f34bdf9801ffa4bfd90fecaf28e548d9
+fe7df253addd7bccf2ad39d8a5ff61f150a2ff89f659cbaefa9652feb72fb1d977e033ed
+d227e3c23593d2e545cdff83d8fb62f22dff99fbbe31c4fe71f991f41afb9fed0bf2ade7
+83d993d8a63efaa2fb5badd8b53bb8ff8f37cb5bf76eff24fba5e00adabf9ae078d857e8
+bb70e5ac67b0fb8812e452d12fe05cb2fc35f5c486ff95f2b1cb38bbff4496f5a4ff6df7
+5bf114ffb85ae7afca66f8d260e02a9af284d0f66efa8dc40fb6fed130e9af26ffcd76e1
+80d887cbec62df28b8fe3887eacb79dd8fed47fa9eff539ffb5795d8fe098cfbab1df044
+afdc8ad8b648c870ff9515df48e562b3cfff78d859d824fc51f720ffb1c96dd288ee44fd
+9ff114bffb93e404d887de7aed86fe76f922c5fe01f179cfff4bd7fe24d9b8d8a4ef87d9
+81ffcb72d869ddb449e510ff72f885c7afe01ad986cb9fda93d886c7fc8616ffbf25acf1
+86fbc25eff52bee0a738eea5e03f98ff78fb86bf52fb19f531feaf13fbbea5e57dd7ff05
+bdf718fc62d0bc20cbaff279beff62a1edba65e194c8a4fe35f916ee87e5b443edc0a5ff
+95d8f8274fe5afff7bdc9ccb89df60ed06f537ff96de7ad863ccec6ad87bfea5ed53d61d
+cb5ed888eda563dcb1fb2ca5f37dbef28448fe35c3ff1af2a423f3abfe02f9ca80d891de
+55ed05fb5afe61f238ff1ffb4ff326a5d5ed77e588fe3ad969e6af32dd9909ffd867fc84
+f7c916d95ad6ed95b8d29fea6de096d047ff0af455afef935fe2c3a5fe86f182dd0dcde1
+18ebc82bfecf35ff6ee67bd083e09afe04f7d979fa59cc0ebd87ddf29333c0f946f408fe
+79d096d886e0c50ebff825fea64aff21f2c342b1fa8bff95f232ff51beea93449de3c917
+ec419ee1c19bf450afe566d0ec9343beea56acfe61ee25d79dd87addbf93c2e785d077e0
+7bccf84d9ffb58b6d894bfff11ccf773fbd379b0ce20eb55bcf188e5a50cf63eff4bb5d8
+57f488ed6bdac29edf40d3ff9f4bf303d83ffa5dffaa4ff8b586dd7bb1ed5bd806f15fff
+af51c7b86aaed024eb85d9fe5dab02c4ef82b5e96bd2afed31ff4afbb579f2a56ae284db
+b879de5f9dffd111dd48e56fd897cdfb16ffc6ed6095fe8bd0fa07ff63d5b979c5fe3d87
+ffd87ad093ed1bceaffb69fe30f7b13eff0fb0db3dedafff4293e0c12dc5fe0be951a5ed
+81b8e34bbcf350feb579dca14afa32ffc87adfc293fa03fec623aafc9330fa86feb723db
+bf93e76de3afca79ed9ad43cff51f913c3f686fbb6dd25d4f57dfbd838feb66cffaf3fc5
+fbb1fe65e217c9a5ff55a4d987e4c21ee659ffc346fa07f6cf92ebbf3586ee9fcfaffe08
+f7418ede86b60dfbd432dd53b6cb93ed20dafb059adfc115a0fa31ff5ebaf342a0e28ccd
+84e5a5d19afa79fea509d8befd04f297e250f37bfad045fe20a1ff9418dd88cafb02ffc3
+93d8b64dfba523e574edb079bfe041d0ecb616c86cf67bfb2ac5ff971cfeba26fc6bed82
+d0ace59b29dfa54b93fa9f3fea1f9fe586f3cb2fe09ced70e02bd496ff86ee25c0fb14f6
+5ba2fe80d92ded9fbee09a3efe15f5aefbc356f22ea4e07cc2f4ac5af2d879aff67bff86
+f75bafff9458c0f678fbafe06cdcc29ae482ffc70bf24fff18f153eb2adf4ccaf25b87d9
+b16aff78cfaddc1e9de48adac12ec5ed61f83593ed86e21df26cec81d0f35fdbc14fd9ff
+6af8af79ff93f2b059e088eda943d5ea59d992c1de04b6f22f89feb970ffbbed63c1e088
+c9ff53db0ba4f760fb14ba7af656f23cd861b3e07ecd93dcbf3ef4abcb8afc5286ffc780
+d86be0297fff93c1fa4bb3e424d0fe37beff4ec2ea14de3ae6cc73f3aee926d951ed2ef2
+af0ffb4bd929a5de94d877dd88fb7cd6aef76398ffcd38ebc424baed3193ffc663fb79f5
+a6fe87d97de8d0a85cb8fe9ccf07ff47bbff972efb9f11bbca1ee04dd832e4c207ff50bf
+fa7aa5f56efe38affbca69ffd754eeca3cd912b1ff09f24abded7ac6ed84d888ccffd88e
+ddbf7bf9c3fe39f24fff27ef88d061ea14d8c5f11fa8e547ff9ad8bbd902e363b9ff85f9
+6c9fe5941ded6eb4d881fea50ee032d865ff9ec993ce5eff86c0ed72cbfa62fe35f5aaca
+44befd0d93e0c11aaff77efea4f683fbc05aedb404ed52e041d70effbe24d9fe3bc84fe6
+a5c0e18715c4e585eeafe562ff6ff69cfa79fea5cb9dd915edca0de0c495f1884ae5bf79
+e00797f77efbcc85da93fb9b1cfca745ff23f3aa3b6bfe0e9ee5a50b92d89bd579e0adff
+09f8b5ff8136a5d7fb6eefb90afa4ea6fe87f5ce1ad93dc9ef61d9c4a0fa27ffbf4ac1f2
+92fe86f1bf4bfd0bf9a5c4e93ba5ffb754e586b6c603ffa0ee67b8ff34f186e060d849d7
+15d863ddad37ffd89ed291f86cf2af67fb73bfed86f96efe3797f7affd78d959fe3bf094
+dcb90ab6d646ed30f777fe538fffa84ae421d8fe9f16fab4fed45de0a551ec78d863e4cb
+81e6d070dd5ac6f8ecafc2fb2affb6f55dfb03f7c5439cdf934997edb6fe883ab2cc65e6
+7df2ca53dd329eed93fba812ff87fb56d2af69ed9ffa60d047dd14a9e283d977e01d93fb
+d80696f61dd0fe80e078d821c9ea6fd9aafe2cfbb8f36dffa9ed08f4c261b943ff15ade0
+c44be5b3f10caed821da83d1ed50dc42ed07d097d884cb2beda7fe87dd80d861e0a4bfde
+65ccf884ffa540cff2a44587b0f12ec7fe1af937ffb65dff31b9fa93ee9f1c9352e079d1
+63ec36df6ddcb07cfec161fbb9d95edd03bff7da1cffafd32c97eb82c6ff7ad35ae0c04f
+dd02e57af2b909db2fe497fa88cbff35f4b6fe57f2b9498bf3d27adbaf3bed5cf98cfeae
+43fabf5a9bdd930c9fe0934ec1fe6ee58ff2c697c1fb2f93ff9a39d89ff365ffaff518b6
+ff93cca6ff68f31ef95cfe7ada52f21bff94fbc33cf224fb9418d256c2ed9360ddb9e91e
+beff619bdec29ed111f3afd98706d847ffcfd9ff32ed95d989cc94ffbf4bed1ce5b12ff1
+22ff79f4d8529af1933ffeadf61ffcab43dc08fe79f2b274f79ad82efcc693ff7cd81fec
+5293d89928a5d86dffc6e65fbfff4cfb9ecbbc2fde60e387d104f5ce47eeb6fe36d0f97b
+b2d52afd1cec5edd70b9ef09cbf978ff31de9543c1e562c80efb52bfe086d890dd97d036
+e5afcf5bea0d86ffabd778edaff59dfb09b8fa27ff5bf77acfaff28947f070e99752f1c2
+fe79e4a96301b6c95afa14fe51f1109ffa91d886ffcf78e0a4cc438affc976ddbe6ae079
+d867cdf971f1a5d92efecfa846ffaf79e657c3f167ffa5c3ef79fbb8ed01e59824b3fb14
+aee56cf10affa7c3f313ffa3ed7ab3ff70d881deaf18eb44e399cab679f634fecf7fe0a8
+51d290e57acbfb5aa3fb80f279e79c34fb4dff03f272ffa264fb93c9afdd9960eebc4bd8
+37e062d0eb81d992d896dd36e60cffbfabfe42c0fb933db6f428bffbef83fda7bfdf86d8
+80e5d030e466f3509efbc20efbade9bc12fd5af9cb0dffb0ed159fe0b74cb6ec9321e8be
+65edc138fba00ce0af40fd06e05ad97ffe86d1f179cf9edd2dd888d96bed4294d8b63bb9
+fb1ec3e627f260ff95beff86f84affd887e4a520fa57fec3ef27b0fe05abedd626e09fd1
+21f4c3aded9fc5a7d612edc228f150fe2bf9c102ff87fec57dff9951fd68f410fe6afb86
+d879dd21cba5e028d0ed7ccd9dea8851d823e445a4f426ffb878fea5cb0bbfec3c8ee57b
+f22883e2a5ed3095e9c13d93febf27ff8cf86bc8ff7af9d011feb66eddb87af6c095d2af
+ff37cd4ddf38bef93efe5cf693ff57f798bfff78f993da6ae09f57fbaecd3ded52cf0eaf
+de9302fb49c0d993dd89119efbd85bd0f83892feaf41ffb560fe0fce59f73bfdb66de09b
+bed88de555e895cfb510adf227e5c01ccbace54dc9a8ee5af993fe7af781ffb013fa4cfe
+38ddff9cf27affc770e0af3aedc354ffa9f75cd1ffb74db3d8fec14ad1afff8760fbd85d
+e284c4e516dd52b3d83fabe082cbf54fffce20dd5ff96b9ff286f79bff64ace486ed74c9
+19b8ce22e14dd428ef51ff86f7be8e01e5a1c2fc6bf3d875f1afcc9aff78f33ab8ecbe4a
+87ea9d67bce06ac7eb7ddabf93e580de89d97acaf945ff08f338b9d384f53efadc6ad8b5
+78fea5ef72c5a3ec01b9cd2de051d904db4de1a0d893c7b67b
+ >
+ >>
+
+>>
+dup /HalftoneName 3 index put
+/Halftone defineresource
+pop
diff --git a/Master/xemtex/gslib/image-qa.ps b/Master/xemtex/gslib/image-qa.ps
new file mode 100644
index 00000000000..eb22b919b73
--- /dev/null
+++ b/Master/xemtex/gslib/image-qa.ps
@@ -0,0 +1,1827 @@
+%!PS
+% Copyright (C) 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+%
+% $Id: image-qa.ps,v 1.3.2.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/impath.ps b/Master/xemtex/gslib/impath.ps
new file mode 100644
index 00000000000..2b7d79fe67f
--- /dev/null
+++ b/Master/xemtex/gslib/impath.ps
@@ -0,0 +1,180 @@
+% Copyright (C) 1992, 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: impath.ps,v 1.3.4.1.2.1 2003/04/12 14:02:38 giles Exp $
+% impath.ps
+% Reverse-rasterize a bitmap to produce a Type 1 outline.
+% (This was formerly a Ghostscript operator implemented in C.)
+
+% <image> <width> <height> <wx> <wy> <ox> <oy> <string>
+% type1imagepath <substring>
+% Converts an image (bitmap) description of a character into
+% a scalable description in Adobe Type 1 format. The
+% current transformation matrix should be the same as the
+% FontMatrix of the font in which this character will be
+% used: this establishes the scaling relationship between
+% image pixels (the image is assumed to be 1 unit high in
+% user space) and the character coordinate system used in
+% the scalable description. wx and wy are the character
+% width, and ox and oy are the character origin relative
+% to the lower left corner of the bitmap, in *pixels*.
+% The image is assumed to be stored in left-to-right,
+% top-to-bottom order. Note that this is not consistent
+% with the `image' operator's interpretation of the CTM.
+% All coordinates in the scalable description are rounded to
+% integers, so the coefficients in the FontMatrix should
+% be on the order of 1/N for some value of N that is
+% either a multiple of the height/width or is large
+% compared to the width and height. (There is a
+% convention, which some PostScript programs rely on, that
+% N=1000.)
+% Note that the encoded description has *not* been subjected
+% to CharString encryption, which is necessary before the
+% description can be given to type1addpath: to do this,
+% follow the type1imagepath with
+% 4330 exch dup .type1encrypt exch pop
+% If the description is too complex to fit into the supplied
+% string, a limitcheck error results. A good rule of
+% thumb is that the size of the string should be about 6
+% times the number of 1-bits in the image that are not
+% completely surrounded by other 1-bits.
+
+% Import the Type 1 opcodes.
+(type1ops.ps) runlibfile
+
+100 dict
+dup /type1imagepath_dict exch def
+begin
+
+/rc { round cvi } bind def
+/moving [/rmoveto /hmoveto /vmoveto] def
+/drawing [/rlineto /hlineto /vlineto] def
+
+% Convert the current path to a Type 1 token array.
+/putxy % x y ops -> cs_elements
+ { 3 -1 roll dup x sub rc exch /x exch def
+ 3 -1 roll dup y sub rc exch /y exch def
+ % stack: ops dx dy
+ dup 0 eq
+ { % dy = 0, use hmoveto/lineto
+ pop exch 1 get
+ }
+ { 1 index 0 eq
+ { % dx = 0, use vmoveto/lineto
+ exch pop exch 2 get
+ }
+ { % use rmoveto/rlineto
+ 3 -1 roll 0 get
+ }
+ ifelse
+ }
+ ifelse
+ } bind def
+/pathtotype1 % -> charstack
+ { 3 dict begin /x 0 def /y 0 def
+ mark
+ { moving putxy
+ }
+ { drawing putxy
+ }
+ { % Convert curve to relative form
+ x y 3
+ { exch neg 7 index add rc
+ exch neg 6 index add rc
+ 8 -2 roll
+ }
+ repeat /y exch def /x exch def
+ 1 index 0 eq 5 index 0 eq and % dy1=dx3=0, hv
+ { 5 -1 roll pop exch pop /hvcurveto
+ }
+ { dup 0 eq 6 index 0 eq and % dx1=dy3=0, vh
+ { 6 -1 roll pop pop /vhcurveto
+ }
+ { /rrcurveto % none of the above
+ }
+ ifelse
+ }
+ ifelse
+ }
+ { /closepath
+ }
+ pathforall end
+ } bind def
+
+end % type1imagepath_dict
+
+% The main program
+/type1imagepath % image width height wx wy ox oy string ->
+ % substring
+ { type1imagepath_dict begin
+ /tsave save def
+ /ostring exch def
+ /oy exch def /ox exch def
+ /wy exch def /wx exch def
+ /height exch def /width exch def
+ /data exch def
+
+ /ofilter ostring /NullEncode filter def
+ /raster width 7 add 8 idiv def
+
+% Construct the coordinate transformation.
+ height dup scale
+ matrix currentmatrix matrix invertmatrix setmatrix
+
+% Determine the left side bearing.
+ /lsbx width
+ 0 1 width 1 sub
+ { dup dup 8 idiv 0 exch
+ raster raster height mul 1 sub
+ { data exch get or }
+ for exch 8 mod bitshift 128 and 0 ne
+ { exch pop exit }
+ if pop
+ }
+ for def
+
+% Compute and encode the origin, width, and side bearing.
+ mark
+ ox oy dtransform
+ rc /opty exch def rc /optx exch def
+ wx wy dtransform
+ rc /iwy exch def rc /iwx exch def
+ lsbx ox sub 0 dtransform
+ rc /ilsby exch def rc /ilsbx exch def
+ ilsbx
+ iwy 0 ne ilsby 0 ne or
+ { ilsby iwx iwy /sbw }
+ { iwx /hsbw }
+ ifelse
+ ofilter charstack_write
+
+% Flip over the Y axis, because the image is stored top-to-bottom.
+ [1 0 0 -1 0 height] concat
+% Account for the character origin.
+ lsbx oy translate
+% Trace the outline.
+ newpath
+ width height data .imagepath
+ gsave matrix setmatrix pathtotype1 grestore
+ ofilter charstack_write
+% Terminate the output
+ mark /endchar ofilter charstack_write
+
+ ofilter .fileposition ofilter closefile % flush buffers
+ ostring 0 3 -1 roll getinterval
+ tsave restore
+ end
+ } bind def
diff --git a/Master/xemtex/gslib/jispaper.ps b/Master/xemtex/gslib/jispaper.ps
new file mode 100644
index 00000000000..94ef1384ce9
--- /dev/null
+++ b/Master/xemtex/gslib/jispaper.ps
@@ -0,0 +1,28 @@
+% Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: jispaper.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/landscap.ps b/Master/xemtex/gslib/landscap.ps
new file mode 100644
index 00000000000..c99a312be01
--- /dev/null
+++ b/Master/xemtex/gslib/landscap.ps
@@ -0,0 +1,31 @@
+%!
+% 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.
+%
+% James E. Burns, 3/8/93, burns@nova.bellcore.com
+%
+% $Id: landscap.ps,v 1.1.6.1 2002/04/10 09:22:58 giles Exp $
+%
+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/Master/xemtex/gslib/level1.ps b/Master/xemtex/gslib/level1.ps
new file mode 100644
index 00000000000..b64374d18b1
--- /dev/null
+++ b/Master/xemtex/gslib/level1.ps
@@ -0,0 +1,3 @@
+%!
+% $Id: level1.ps,v 1.1.6.1 2002/04/10 09:22:58 giles Exp $
+/.setlanguagelevel where { pop 1 .setlanguagelevel } if
diff --git a/Master/xemtex/gslib/lines.ps b/Master/xemtex/gslib/lines.ps
new file mode 100644
index 00000000000..b784e01aa7c
--- /dev/null
+++ b/Master/xemtex/gslib/lines.ps
@@ -0,0 +1,166 @@
+%!
+% Copyright (C) 1989, 1990, 1992, 1994, 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: lines.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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/Master/xemtex/gslib/lp386.bat b/Master/xemtex/gslib/lp386.bat
new file mode 100644
index 00000000000..65141bcefb0
--- /dev/null
+++ b/Master/xemtex/gslib/lp386.bat
@@ -0,0 +1,2 @@
+@rem $Id: lp386.bat,v 1.1 2000/03/09 08:40:40 lpd Exp $
+@gs386 -sDEVICE=djet500 -dNOPAUSE -- gslp.ps -fCourier9 %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/xemtex/gslib/lp386r2.bat b/Master/xemtex/gslib/lp386r2.bat
new file mode 100644
index 00000000000..9a6f80d9afd
--- /dev/null
+++ b/Master/xemtex/gslib/lp386r2.bat
@@ -0,0 +1,2 @@
+@rem $Id: lp386r2.bat,v 1.1 2000/03/09 08:40:40 lpd Exp $
+@gs386 -sDEVICE=djet500 -dNOPAUSE -- gslp.ps -2r %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/xemtex/gslib/lpgs.bat b/Master/xemtex/gslib/lpgs.bat
new file mode 100644
index 00000000000..179667212d6
--- /dev/null
+++ b/Master/xemtex/gslib/lpgs.bat
@@ -0,0 +1,5 @@
+@echo off
+@rem $Id: lpgs.bat,v 1.2 2000/05/20 20:53:05 lpd Exp $
+
+call gssetgs.bat
+%GSC% -sDEVICE#djet500 -dNOPAUSE -sPROGNAME=lpgs -- gslp.ps -fCourier9 %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/xemtex/gslib/lpr2.bat b/Master/xemtex/gslib/lpr2.bat
new file mode 100644
index 00000000000..ede47c51e78
--- /dev/null
+++ b/Master/xemtex/gslib/lpr2.bat
@@ -0,0 +1,5 @@
+@echo off
+@rem $Id: lpr2.bat,v 1.2 2000/05/20 20:53:05 lpd Exp $
+
+call gssetgs.bat
+%GSC% -sDEVICE#djet500 -dNOPAUSE -sPROGNAME=lpr2 -- gslp.ps -2r %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/xemtex/gslib/lprsetup.sh b/Master/xemtex/gslib/lprsetup.sh
new file mode 100644
index 00000000000..8d4bc5073c3
--- /dev/null
+++ b/Master/xemtex/gslib/lprsetup.sh
@@ -0,0 +1,189 @@
+#!/bin/sh
+# $Id: lprsetup.sh,v 1.1 2000/03/09 08:40:40 lpd Exp $
+#
+# 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
+#
+
+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
+
+GSDIR=/usr/local/lib/ghostscript
+GSFILTERDIR=$GSDIR/filt
+SPOOLDIR=/var/spool
+GSIF=unix-lpr.sh
+PCAP=printcap.insert
+
+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/Master/xemtex/gslib/markhint.ps b/Master/xemtex/gslib/markhint.ps
new file mode 100644
index 00000000000..1ce2498fe55
--- /dev/null
+++ b/Master/xemtex/gslib/markhint.ps
@@ -0,0 +1,131 @@
+% Copyright (C) 1994, 1995, 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: markhint.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% markhint.ps
+% Draw the hints for a Type 1 font.
+
+(type1ops.ps) runlibfile
+
+/mhsetup % <matrix> <print> mhsetup -
+ { /mhprint exch def
+ /mhmx exch def
+ /mhdash 0 9 gsave initmatrix dtransform grestore idtransform add abs def
+ gsave
+ clippath pathbbox
+ 2 index sub /bbh exch def
+ 2 index sub /bbw exch def
+ /bby exch def
+ /bbx exch def
+ grestore
+ } def
+
+/markfonthints % <matrix> <print> markfonthints -
+ { mhsetup
+ } def
+
+/hmark % <y> hmark -
+ { bbx exch moveto bbw 0 rlineto stroke
+ } def
+/hsmark % <y0> <dy> hsmark -
+ { 1 index add exch gsave
+ [mhdash] 0 setdash 0 exch mhmx transform exch pop hmark
+ [mhdash 2 div dup 2 mul] 0 setdash 0 exch mhmx transform exch pop hmark
+ grestore
+ } def
+/vmark % <x> vmark -
+ { bby moveto 0 bbh rlineto stroke
+ } def
+/vsmark % <x0> <dx> vsmark -
+ { 1 index add exch gsave
+ [mhdash] mhdash setdash 0 mhmx transform pop vmark
+ [mhdash 2 div dup 2 mul] 0 setdash 0 mhmx transform pop vmark
+ grestore
+ } def
+/pmark % <x> <y> pmark -
+ { newpath 0 4.5 gsave initmatrix dtransform grestore idtransform add abs
+ 0 360 arc stroke
+ } def
+/mchdict mark
+ /hsbw { pop 0 mhmx transform translate 0 0 pmark }
+ /sbw { pop pop mhmx transform translate 0 0 pmark }
+ /hstem
+ { mhprint { (hstem ) print 2 copy 2 packedarray == } if
+ hsmark
+ }
+ /vstem
+ { mhprint { (vstem ) print 2 copy 2 packedarray == } if
+ vsmark
+ }
+ /hstem3
+ { mhprint { (hstem3 ) print 6 copy 6 packedarray == } if
+ 3 { hsmark } repeat
+ }
+ /vstem3
+ { mhprint { (vstem3 ) print 6 copy 6 packedarray == } if
+ 3 { vsmark } repeat
+ }
+ /div
+ { div
+ }
+ /callothersubr
+ { 3 eq
+ { pop
+ mhprint { (replace) = } if
+ % We're replacing hints; lighten the color.
+ currentrgbcolor 3 { 2 mul 3 div 3 1 roll } repeat setrgbcolor
+ }
+ { { pop } repeat
+ } ifelse
+ }
+ /callsubr
+ { Private /Subrs get exch get mchinterp
+ }
+ /pop
+ {
+ }
+ /return
+ {
+ }
+.dicttomark def
+
+/mchinterp % <charstring> mchinterp -
+ { 4330 exch dup length string .type1decrypt exch pop
+ dup length lenIV sub lenIV exch getinterval
+ 0 () /SubFileDecode filter
+ mark exch charstack_read ]
+ { dup type /nametype eq
+ { mchdict exch .knownget { exec } { cleartomark mark } ifelse
+ }
+ if
+ }
+ forall
+ } def
+
+/markcharhints % <charname> <matrix> <print> markcharhints -
+ { mhsetup
+ gsave mark
+ /Private currentfont /Private get def
+ Private rcheck % make sure we won't get an access error
+ { /lenIV Private /lenIV .knownget not { 4 } if def
+ currentfont /CharStrings get 3 -1 roll get mchinterp
+ }
+ { (Sorry, this font is protected; I can't show the hints.\n) print flush
+ exch
+ }
+ ifelse
+ cleartomark grestore
+ } def
diff --git a/Master/xemtex/gslib/markpath.ps b/Master/xemtex/gslib/markpath.ps
new file mode 100644
index 00000000000..e85dfe63ca8
--- /dev/null
+++ b/Master/xemtex/gslib/markpath.ps
@@ -0,0 +1,60 @@
+% Copyright (C) 1993 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: markpath.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% markpath.ps
+% Mark the corners of a path, drawing it slowly if desired.
+
+/Delay where { pop } { /Delay 0 def } ifelse
+/setxy0
+ { currentpoint /y0 exch def /x0 exch def
+ } def
+/bip
+ { epsx epsy idtransform /ey exch def /ex exch def
+ currentpoint ex 2 div ey 2 div rlineto currentpoint 0 ey neg rlineto
+ ex neg 0 rlineto 0 ey rlineto lineto lineto
+ stroke
+ } def
+/dally
+ { Delay { } repeat
+ Delay 0 ne { flushpage } if
+ } def
+/movebip
+ { /xs 2 index def /ys 1 index def
+ gsave newpath mpmx transform moveto setxy0 bip grestore
+ } def
+/linebip
+ { gsave newpath x0 y0 moveto mpmx transform lineto setxy0 bip dally grestore
+ } def
+/curvebip
+ { gsave newpath x0 y0 moveto 5 index 5 index mpmx transform lineto bip
+ 2 copy mpmx transform moveto 3 index 3 index mpmx transform lineto bip
+ x0 y0 moveto
+ 3 { mpmx transform 6 2 roll } repeat
+ curveto setxy0 bip dally grestore
+ } def
+/closebip
+ { xs ys linebip
+ } def
+
+/markpath % <matrix> markpath -
+ { /mpmx exch def
+ gsave initgraphics 9 dup dtransform grestore
+ /epsy exch def /epsx exch def
+ gsave 0 setlinewidth
+ { movebip } { linebip } { curvebip } { closebip } pathforall
+ grestore
+ } def
diff --git a/Master/xemtex/gslib/necp2x.upp b/Master/xemtex/gslib/necp2x.upp
new file mode 100644
index 00000000000..70a9d7e7cbd
--- /dev/null
+++ b/Master/xemtex/gslib/necp2x.upp
@@ -0,0 +1,35 @@
+-supModel="NEC Prinwriter 2X, 360x360DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/necp2x6.upp b/Master/xemtex/gslib/necp2x6.upp
new file mode 100644
index 00000000000..f0af04e03de
--- /dev/null
+++ b/Master/xemtex/gslib/necp2x6.upp
@@ -0,0 +1,35 @@
+-supModel="NEC Prinwriter 2X, 360x360DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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/Master/xemtex/gslib/packfile.ps b/Master/xemtex/gslib/packfile.ps
new file mode 100644
index 00000000000..3a311b2613e
--- /dev/null
+++ b/Master/xemtex/gslib/packfile.ps
@@ -0,0 +1,334 @@
+% Copyright (C) 1994, 1995, 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: packfile.ps,v 1.2.6.2.2.1 2003/04/12 14:02:39 giles Exp $
+% packfile.ps
+% Pack groups of files together, with compression, for use in
+% storage-scarce environments.
+
+% ****** NOTE: This file must be kept consistent with gs_pfile.ps.
+
+% ---------------- Huffman coding utilities ---------------- %
+
+% We count runs of zeros, and individual byte frequencies separately
+% depending on whether they follow or do not follow a run of zeros.
+/zruns 256 array def
+/zfreq 256 array def
+/nzfreq 256 array def
+/maxcode 13 def % max code length, must be between 10 and 16
+/maxzrun 100 def % max length of zero run, must be <= 100
+/statbuf 10000 string def
+
+% Initialize statistics.
+/initstats % - initstats -
+ { 0 1 255 { zruns exch 0 put } for
+ 0 1 255 { zfreq exch 0 put } for
+ 0 1 255 { nzfreq exch 0 put } for
+ } bind def
+
+% Accumulate statistics from an individual file.
+/addstats % <file> addstats -
+ { 0
+ { 1 index //statbuf readstring 3 1 roll
+ % Stack: file eof numzeros data
+ { dup 0 eq
+ { pop 1 add
+ }
+ { 1 index 0 ne
+ { exch 255 .min
+ //zruns exch 2 copy get 1 add put
+ 0 exch //zfreq
+ }
+ { //nzfreq
+ }
+ ifelse
+ exch 2 copy get 1 add put
+ }
+ ifelse
+ } forall
+ exch not { exit } if (.) print flush
+ } loop
+ pop closefile
+ } bind def
+
+% Compute the Huffman codes from the statistics.
+/statcodes % - statcodes <array>
+ { maxcode 1 add 256 add maxzrun 2 sub add 1 add array % full array
+ dup maxcode 1 add dup 2 index length exch sub getinterval % data
+ % Put statistics into array
+ dup 0 1 255
+ { zfreq 1 index get nzfreq 2 index get add put dup
+ } for
+ 0 zruns 1 get put
+ 256 zruns 2 maxzrun 2 sub getinterval putinterval
+ dup dup length 1 sub 1 put % EOD
+ maxcode .computecodes
+ } bind def
+
+% ---------------- File handling ---------------- %
+
+% Copy one file to another.
+% Close the input file, but not the output file.
+/copyfile % <infile> <outfile> copyfile <outfile> <length>
+ { 0 mark statbuf
+ { 4 index 1 index readstring
+ exch 5 index 1 index writestring
+ length 5 -1 roll add 4 1 roll
+ not { exit } if (.) print flush
+ } loop
+ cleartomark 3 -1 roll closefile dup == flush
+ } bind def
+
+% Represent a Type 1 font in its most compressed format.
+% Requires -dWRITESYSTEMDICT to run.
+% Does not close the output file.
+(wrfont.ps) runlibfile
+/compressfont % <fontname> <outfile> compressfont <outfile>
+ { exch save
+ systemdict /executeonly /readonly load put
+ systemdict /noaccess /readonly load put
+ systemdict readonly pop
+ wrfont_dict begin
+ /binary_CharStrings true def
+ /binary_tokens true def
+ /encrypt_CharStrings false def
+ /standard_only false def
+ /use_lenIV 0 def
+ /smallest_output true def
+ end
+ exch findfont setfont
+ 1 index writefont
+ restore
+ } bind def
+
+% ---------------- Main program ---------------- %
+
+% Find the length of a file.
+/filelength % <filename> filelength <length>
+ { status { pop pop exch pop } { -1 } ifelse
+ } bind def
+
+% Define the header string for a compressed file.
+/beginfilestring
+({dup token pop exch[/MaxCodeLength 2 index token pop/Tables 4 index token pop
+/EndOfData true/EncodeZeroRuns 256 .dicttomark
+/BoundedHuffmanDecode filter/MoveToFrontDecode filter
+[/BlockSize 4 -1 roll .dicttomark/BWBlockSortDecode filter
+}) readonly def
+
+% Write a 16-bit big-endian non-negative integer on a file.
+/write16 % <file> <int> write16 -
+ { 2 copy -8 bitshift write 255 and write
+ } bind def
+
+% Compress a group of files together.
+% Return a dictionary in which the keys are the input file names
+% and the values are [startpos length] in the uncompressed concatenation.
+% Does not open or close the output file.
+/tempname (t.em) def
+/packfiles % <filenames> <outfile> packfiles <outfile> <posdict>
+ { % Concatenate files to a temporary file.
+ tempname (w) file
+ dup /MoveToFrontEncode filter
+ dup <<
+ /BlockSize 1000000
+ >> /BWBlockSortEncode filter
+ % Stack: filenames outfile tempfile mtfe bwe
+ 5 -1 roll dup length dict 0 6 2 roll
+ { % Stack: outfile posdict pos tempfile mtfe bwe infilename
+ dup ==only dup (r) file 2 index copyfile exch pop
+ dup 7 index 4 2 roll 7 index exch 2 array astore put
+ 5 -1 roll add 4 1 roll
+ } forall
+ closefile closefile closefile pop exch
+ % Stack: posdict outfile
+ % Compute an optimal Huffman code.
+ initstats
+ tempname (r) file addstats
+ % Actually compress the file.
+ % Write the decompression information on the output first.
+ dup tempname filelength write==
+ dup maxcode write==
+ % Write the code table as a homogenous number array.
+ statcodes exch
+ dup 149 write dup 32 write dup 2 index length write16
+ exch { 2 copy write16 pop } forall
+ dup <<
+ /MaxCodeLength maxcode
+ /EndOfData true
+ /EncodeZeroRuns 256
+ /Tables statcodes
+ >> /BoundedHuffmanEncode filter
+ tempname (r) file exch copyfile pop closefile
+ exch
+ } bind def
+
+% Squeeze a font to a .cpf file in anticipation of compression.
+/squeezefont % <fontname> squeezefont <filename.cpf>
+ { dup type /nametype ne { cvn } if
+ dup
+ { dup type /stringtype eq { exit } if
+ Fontmap exch get
+ }
+ loop
+ % Stack: fontname filename
+ dup dup
+ { (.) search not { exit } if
+ exch pop exch 3 -1 roll pop
+ }
+ loop
+ % Stack: fontname filename noextname extension
+ exch
+ { (/) search not { (\\) search not { exit } if } if
+ pop pop
+ }
+ loop
+ % If the font extension is anything other than
+ % .pfa or .pfb, we assume it can't be rewritten
+ % using compressfont.
+ % Stack: fontname filename extension basename
+ (.cpf) concatstrings dup 5 1 roll (w) file
+ % Stack: outfilename fontname filename extension outfile
+ exch dup (pfa) eq exch (pfb) eq or
+ % Stack: outfilename fontname filename outfile bool
+ { exch pop compressfont
+ }
+ { 3 -1 roll pop
+ exch findlibfile pop exch pop
+ exch copyfile pop
+ }
+ ifelse closefile
+ } bind def
+
+% ---------------- Production code ---------------- %
+
+% The following code constructs a packed version of the commercial-quality
+% fonts available from Aladdin Enterprises. To use this code:
+% - If desired, change the output file names below.
+% - Make sure you have the synthetic font data (fontmap.shs and the
+% *.ps files for the commercial fonts) in a directory that is on
+% Ghostscript's search path.
+% - Construct the packed fonts by running
+% gs -dNODISPLAY -dWRITESYSTEMDICT packfile.ps
+% - If desired, move the output files to the directory that will be
+% used at run time. You no longer need the *.pfb or *.ps files
+% for the original fonts; however, you do still need the Fontmap
+% for these fonts, because it defines the font name aliases.
+% - Add the following line to the end of gs_fonts.ps:
+% (ALL.cmp) run
+% (substituting the definition of allmapname if you changed it).
+
+% Define the output file names. The extensions are arbitrary;
+% any legal file name is allowed.
+/allname (ALL.cff) def % the compressed font file
+/allmapname (ALL.cmp) def % the Fontmap override file
+
+% Load an alternate Fontmap that references the synthetic oblique and
+% narrow fonts.
+true .setglobal
+(fontmap.shs) findlibfile pop exch pop .loadFontmap
+false .setglobal
+
+% Define the packaging of fonts into font groups.
+% Fewer larger groups compress better, but make decompression slower.
+/Lists [
+[ % The oblique and narrow fonts are synthetic,
+ % and take very little space.
+ /AvantGarde-BookOblique /AvantGarde-DemiOblique
+ /Courier-Oblique /Courier-BoldOblique
+ /Helvetica-Oblique /Helvetica-BoldOblique
+ /Helvetica-Narrow /Helvetica-Narrow-Oblique
+ /Helvetica-Narrow-Bold /Helvetica-Narrow-BoldOblique
+]
+[/AvantGarde-Book /AvantGarde-Demi
+ /Bookman-Light] [/Bookman-LightItalic
+ /Bookman-Demi /Bookman-DemiItalic
+ /Courier] [/Courier-Bold
+ /Helvetica /Helvetica-Bold]
+[/NewCenturySchlbk-Roman /NewCenturySchlbk-Italic
+ /NewCenturySchlbk-Bold /NewCenturySchlbk-BoldItalic]
+[/Palatino-Roman /Palatino-Italic
+ /Palatino-Bold /Palatino-BoldItalic]
+[/Times-Roman /Times-Italic
+ /Times-Bold /Times-BoldItalic]
+[/Symbol
+ /ZapfChancery-MediumItalic
+ /ZapfDingbats]
+] def
+
+% We need to register the fonts under their true names, not aliases.
+/Lists Lists mark exch
+ { mark exch
+ { { Fontmap 1 index get dup type /nametype ne { pop exit } if
+ exch pop
+ }
+ loop
+ }
+ forall ]
+ }
+forall ] def
+
+% Squeeze the fonts to their .cpf format.
+(Squeezing... ) print flush
+/fdict mark
+Lists
+ { { dup squeezefont } forall } forall
+.dicttomark def
+(done.\n) print flush
+
+% Invert fdict.
+/f2dict fdict length dict def
+fdict { exch f2dict 3 1 roll put } forall
+
+% Construct the compressed font file.
+(Creating ) print allname print (... ) print flush
+/posdict fdict length dict def
+/all allname (w) file def
+all beginfilestring writestring
+Lists
+ { dup == flush
+ /fbegin all fileposition def
+ mark exch { fdict exch get } forall ]
+ all packfiles exch pop
+ /flength all fileposition fbegin sub def
+ { fbegin flength 3 -1 roll aload pop 4 packedarray
+ exch f2dict exch get exch posdict 3 1 roll put
+ }
+ forall
+ }
+forall
+all closefile
+(done.\n) print flush
+
+% Write the Fontmap addendum for accessing compressed fonts.
+(Writing ) print allmapname print (... ) print flush
+allmapname (w) file
+dup (%!
+/.runpackedlibfile where{pop}{(gs_pfile.ps)runlibfile}ifelse
+.currentglobal true .setglobal
+) writestring
+posdict
+ { exch 2 index exch write==only exch dup ({) writestring
+ dup allname write==only
+ exch { 1 index dup ( ) writestring exch write==only } forall
+ dup ( .runpackedlibfile}bind .definefontmap
+) writestring
+ }
+forall
+dup (.setglobal
+) writestring
+closefile
+(done.\n) print flush
diff --git a/Master/xemtex/gslib/pcharstr.ps b/Master/xemtex/gslib/pcharstr.ps
new file mode 100644
index 00000000000..06d6a29ca52
--- /dev/null
+++ b/Master/xemtex/gslib/pcharstr.ps
@@ -0,0 +1,127 @@
+% Copyright (C) 1990, 1992, 1997, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: pcharstr.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% pcharstr.ps
+% Print the CharStrings and Subrs (if present) from a Type 1 font,
+% in either a PostScript-like or a C-compatible form,
+% depending on whether CSFormat is defined as /PS or /C.
+
+% Load the Type 1 utilities.
+(type1ops.ps) runlibfile
+
+% Define the printing procedures for PostScript-like output.
+/pcs_ps_dict mark
+ /, {( ) print}
+ /charname {==only}
+ /csbegin {}
+ /beginchars {(%---------------- CharStrings\n) print}
+ /charbegin {==only}
+ /char1 {( ) print ==only}
+ /endchars {}
+ /beginsubrs {(%---------------- Subrs\n) print}
+ /subrbegin {=only}
+ /endsubrs {}
+ /beginboxes {(%---------------- Encoding & metrics\n) print}
+ /notdefbox {}
+ /boxbegin {=only ( ) print}
+ /boxend {(\n) print}
+ /endboxes {(%----------------\n) print}
+.dicttomark readonly def
+
+% Define the printing procedures for C-like output.
+/pcs_c_dict mark
+ /, {(, ) print}
+ /charname {(") print =only (") print}
+ /csbegin {counttomark =only ,}
+ /beginchars {(\nconstdata int CSCharData[] = {\n) print}
+ /charbegin {pop}
+ /char1 {=only ,}
+ /endchars {
+ (-1\n};\nconstdata char *CSCharNames[] = {\n) print
+ CharStrings {pop charname ,} forall (0\n};\n) print
+ }
+ /beginsubrs {(\nconstdata int CSSubrs[] = {\n) print}
+ /subrbegin {pop}
+ /endsubrs {(-1\n};\n) print}
+ /beginboxes {(\nconstdata type1_box CSboxes[] = {\n) print}
+ /notdefbox {( {""},\n) print}
+ /boxbegin {pop ( {) print}
+ /boxend {(},) =}
+ /endboxes {( {0}\n};\n) print}
+.dicttomark readonly def
+
+/printcs
+ { dup type /stringtype eq
+ { printcs1 (\n) print }
+ { ( ) print == }
+ ifelse
+ } bind def
+/printcs1
+ { save exch
+ lenIV 0 ge {
+ 4330 exch dup length string .type1decrypt exch pop
+ dup length lenIV sub lenIV exch getinterval
+ } if
+ 0 () /SubFileDecode filter
+ mark exch charstack_read csbegin
+ counttomark 1 sub -1 0 { index char1 } for
+ cleartomark restore
+ } bind def
+
+/printfont
+ { pcs_ps_dict
+ /CSFormat where { pop CSFormat /C eq { pop pcs_c_dict } if } if
+ begin
+ currentfont begin Private begin 10 dict begin
+
+ % Print the CharStrings and Subrs
+
+ beginchars
+ CharStrings { exch charbegin printcs } forall
+ endchars
+ /Subrs where
+ { pop % the dictionary
+ beginsubrs
+ 0 1 Subrs length 1 sub
+ { dup subrbegin
+ Subrs exch get printcs
+ } for
+ endsubrs
+ } if
+
+ % Print the bounding boxes
+
+ gsave nulldevice FontMatrix matrix invertmatrix concat
+ beginboxes
+ 0 1 Encoding length 1 sub
+ { dup Encoding exch get dup /.notdef eq
+ { pop pop notdefbox
+ }
+ { 1 index boxbegin charname ,
+ ( ) dup 0 4 -1 roll put
+ newpath 0 0 moveto false charpath
+ pathbbox ({) print 4 -1 roll =only ,
+ 3 -1 roll =only , exch =only , =only (}) print
+ boxend
+ }
+ ifelse
+ } for
+ endboxes
+ grestore
+
+ end end end end
+ } bind def
diff --git a/Master/xemtex/gslib/pdf2dsc b/Master/xemtex/gslib/pdf2dsc
new file mode 100644
index 00000000000..e47b429c40c
--- /dev/null
+++ b/Master/xemtex/gslib/pdf2dsc
@@ -0,0 +1,26 @@
+#! /bin/sh
+# $Id: pdf2dsc,v 1.3 2000/12/29 05:03:49 alexcher Exp $
+
+# psf2dsc: generates an index of a PDF file.
+#
+# Yves Arrouye <arrouye@debian.org>, 1996.
+# 2000-05-18 lpd <ghost@aladdin.com> added -dSAFER
+
+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 -q -dNODISPLAY -dSAFER -dDELAYSAFER\
+ -sPDFname="$pdffile" -sDSCname="$dscfile" pdf2dsc.ps -c quit
diff --git a/Master/xemtex/gslib/pdf2dsc.bat b/Master/xemtex/gslib/pdf2dsc.bat
new file mode 100644
index 00000000000..8d33bc9e48a
--- /dev/null
+++ b/Master/xemtex/gslib/pdf2dsc.bat
@@ -0,0 +1,18 @@
+@echo off
+@rem $Id: pdf2dsc.bat,v 1.2 2001/06/22 16:09:22 lpd Exp $
+@rem Convert PDF to DSC
+
+if %1/==/ goto usage
+if %2/==/ goto usage
+call gssetgs.bat
+
+rem Watcom C deletes = signs, so use # instead.
+%GSC% -q -dNODISPLAY -dSAFER -dDELAYSAFER -sPDFname#%1 -sDSCname#%2 -sOutputFile#%2 pdf2dsc.ps
+goto end
+
+:usage
+echo "Usage: pdf2dsc input.pdf output.dsc"
+
+:end
+
+
diff --git a/Master/xemtex/gslib/pdf2dsc.ps b/Master/xemtex/gslib/pdf2dsc.ps
new file mode 100644
index 00000000000..168dbd91632
--- /dev/null
+++ b/Master/xemtex/gslib/pdf2dsc.ps
@@ -0,0 +1,166 @@
+% Copyright (C) 1994, 1995, 1996, 1997, 1998 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: pdf2dsc.ps,v 1.3.4.2.2.1 2003/04/12 14:02:39 giles Exp $
+% 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 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
+
+% (str1) (str2) concatstr (str1str2)
+/concatstr {
+ 2 copy length exch length add string
+ dup dup 5 2 roll copy length
+% stack: newstring newstring str2 str1-length
+ exch putinterval
+} bind def
+
+ GS_PDF_ProcSet begin
+ pdfdict begin
+ PDFfile
+ pdfopen begin
+ /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) exch concatstr concatstr 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 pdfgetpage pdfshowpage } def\n) puts
+ (GS_PDF_ProcSet begin\npdfdict begin\n) puts
+ (%%EndProlog\n) puts
+ (%%BeginSetup\n) puts
+ DSCfile PDFname write==only
+ ( \(r\) file pdfopen begin\n) puts
+ (%%EndSetup\n) puts
+ % process each page
+ FirstPage 1 LastPage {
+ (%%Page: ) puts
+ dup DSCstring cvs puts
+ ( ) 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
+ currentdict pdfclose
+ end
+ end
+ end
+% write trailer
+(%%Trailer\n) puts
+(currentdict pdfclose\nend\nend\nend\n) puts
+(%%EOF\n) puts
+% close output file and exit
+DSCfile closefile
+quit
+% end of pdf2dsc.ps
diff --git a/Master/xemtex/gslib/pdf2ps b/Master/xemtex/gslib/pdf2ps
new file mode 100644
index 00000000000..b684739be95
--- /dev/null
+++ b/Master/xemtex/gslib/pdf2ps
@@ -0,0 +1,29 @@
+#!/bin/sh
+# $Id: pdf2ps,v 1.4 2001/06/22 16:09:22 lpd Exp $
+# Convert PDF to PostScript.
+
+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 $OPTIONS -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pswrite "-sOutputFile=$outfile" $OPTIONS -c save pop -f "$1"
diff --git a/Master/xemtex/gslib/pdf2ps.bat b/Master/xemtex/gslib/pdf2ps.bat
new file mode 100644
index 00000000000..618e1d15446
--- /dev/null
+++ b/Master/xemtex/gslib/pdf2ps.bat
@@ -0,0 +1,24 @@
+@echo off
+@rem $Id: pdf2ps.bat,v 1.5 2001/06/22 16:09:22 lpd Exp $
+@rem Convert PDF to PostScript.
+
+if %1/==/ goto usage
+if %2/==/ goto usage
+call gssetgs.bat
+echo -dNOPAUSE -dBATCH -dSAFER -sDEVICE#pswrite >_.at
+:cp
+if %3/==/ goto doit
+echo %1 >>_.at
+shift
+goto cp
+
+:doit
+rem Watcom C deletes = signs, so use # instead.
+%GSC% -q -sOutputFile#%2 @_.at %1
+if exist _.at erase _.at
+goto end
+
+:usage
+echo "Usage: pdf2ps [-dASCII85DecodePages=false] [-dLanguageLevel=n] input.pdf output.ps"
+
+:end
diff --git a/Master/xemtex/gslib/pdf2ps.cmd b/Master/xemtex/gslib/pdf2ps.cmd
new file mode 100755
index 00000000000..34e4a419c93
--- /dev/null
+++ b/Master/xemtex/gslib/pdf2ps.cmd
@@ -0,0 +1,41 @@
+/* $Id: pdf2ps.cmd,v 1.2 2001/02/03 18:31:12 alexcher Exp $ */
+/*
+ * 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 -dSAFER -sDEVICE=pswrite'
+
+/* 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/Master/xemtex/gslib/pdf_base.ps b/Master/xemtex/gslib/pdf_base.ps
new file mode 100644
index 00000000000..b18caf6803b
--- /dev/null
+++ b/Master/xemtex/gslib/pdf_base.ps
@@ -0,0 +1,640 @@
+% Copyright (C) 1994, 1996, 1997, 1998, 1999, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: pdf_base.ps,v 1.14.2.1.2.1 2003/04/12 14:02:39 giles Exp $
+% pdf_base.ps
+% Basic parser for PDF reader.
+
+% This handles basic parsing of the file (including the trailer
+% and cross-reference table), as well as objects, object references,
+% streams, and name/number trees; it doesn't include any facilities for
+% making marks on the page.
+
+/.setlanguagelevel where { pop 2 .setlanguagelevel } if
+.currentglobal true .setglobal
+/pdfdict where { pop } { /pdfdict 100 dict def } ifelse
+pdfdict begin
+
+% Define the name interpretation dictionary for reading values.
+/valueopdict mark
+ (<<) cvn { mark } bind % don't push an actual mark!
+ (>>) cvn /.dicttomark load
+ ([) cvn { mark } bind % ditto
+ (]) cvn dup load
+% /true true % see .pdfexectoken below
+% /false false % ibid.
+% /null null % ibid.
+ /F dup cvx % see Objects section below
+ /R dup cvx % see Objects section below
+ /stream dup cvx % see Streams section below
+.dicttomark readonly def
+
+% ------ Utilities ------ %
+
+% Define a scratch string. The PDF language definition says that
+% no line in a PDF file can exceed 255 characters.
+/pdfstring 255 string def
+
+% Read the previous line of a file. If we aren't at a line boundary,
+% read the line containing the current position.
+% Skip any blank lines.
+/prevline % - prevline <startpos> <substring>
+ { PDFfile fileposition dup () pdfstring
+ 2 index 257 sub 0 .max PDFfile exch setfileposition
+ { % Stack: initpos linepos line string
+ PDFfile fileposition
+ PDFfile 2 index readline pop
+ dup length 0 gt
+ { 3 2 roll 5 -2 roll pop pop 2 index }
+ { pop }
+ ifelse
+ % Stack: initpos linepos line string startpos
+ PDFfile fileposition 5 index ge { exit } if
+ pop
+ }
+ loop pop pop 3 -1 roll pop
+ } bind def
+
+% Handle the PDF 1.2 #nn escape convention when reading from a file.
+% This should eventually be done in C.
+/.pdffixname { % <execname> .pdffixname <execname'>
+ PDFversion 1.2 ge {
+ dup .namestring (#) search {
+ name#escape cvn exch pop
+ } {
+ pop
+ } ifelse
+ } if
+} bind def
+/name#escape % <post> <(#)> <pre> name#escape <string>
+{ exch pop
+ 1 index 2 () /SubFileDecode filter dup (x) readhexstring
+ % Stack: post pre stream char t/f
+ not { /.pdftoken cvx /syntaxerror signalerror } if
+ exch closefile concatstrings
+ exch 2 1 index length 2 sub getinterval
+ (#) search { name#escape } if concatstrings
+} bind def
+
+% Execute a file, interpreting its executable names in a given
+% dictionary. The name procedures may do whatever they want
+% to the operand stack.
+/.pdftokenerror { % <count> <opdict> <errtoken> .pdftokenerror -
+ BXlevel 0 le {
+ (%stderr) (w) file
+ dup (****************Unknown operator: ) writestring
+ dup 2 index .writecvs dup (\n) writestring flushfile
+ } if pop pop
+ count exch sub { pop } repeat % pop all the operands
+} bind def
+/.pdfexectoken { % <count> <opdict> <exectoken> .pdfexectoken ?
+ DEBUG { dup == flush } if
+ 2 copy .knownget {
+ exch pop exch pop exch pop exec
+ } {
+ % Normally, true, false, and null would appear in opdict
+ % and be treated as "operators". However, there is a
+ % special fast case in the PostScript interpreter for names
+ % that are defined in, and only in, systemdict and/or
+ % userdict: putting these three names in the PDF dictionaries
+ % destroys this property for them, slowing down their
+ % interpretation in all PostScript code. Therefore, we
+ % check for them explicitly here instead.
+ dup dup dup /true eq exch /false eq or exch /null eq or {
+ exch pop exch pop //systemdict exch get
+ } {
+ .pdftokenerror
+ } ifelse
+ } ifelse
+} bind def
+/.pdfrun { % <file> <opdict> .pdfrun -
+ % Construct a procedure with the stack depth, file and opdict
+ % bound into it.
+ 1 index cvlit count 2 sub 3 1 roll mark mark 5 2 roll
+ { % Stack: ..operands.. count opdict file
+ token {
+ dup type /nametype eq {
+ dup xcheck {
+ .pdfexectoken
+ } {
+ .pdffixname
+ exch pop exch pop DEBUG { dup ==only ( ) print flush } if
+ } ifelse
+ } {
+ exch pop exch pop DEBUG { dup ==only ( ) print flush } if
+ } ifelse
+ } {
+ (%%EOF) cvn cvx .pdfexectoken
+ } ifelse
+ }
+ aload pop .packtomark cvx
+ /loop cvx 2 packedarray cvx
+ { stopped /PDFsource } aload pop
+ PDFsource
+ { store { stop } if } aload pop .packtomark cvx
+ /PDFsource 3 -1 roll store exec
+} bind def
+
+% Execute a file, like .pdfrun, for a marking context.
+% This temporarily rebinds LocalResources and DefaultMatrix.
+/.pdfruncontext { % <resdict> <file> <opdict> .pdfruncontext -
+ /.pdfrun load LocalResources DefaultMatrix
+ /LocalResources 7 -1 roll store
+ /DefaultMatrix matrix currentmatrix store
+ 3 .execn
+ /DefaultMatrix exch store
+ /LocalResources exch store
+} bind def
+
+% Get the depth of the PDF operand stack. The main program (pdf_main.ps)
+% sets pdfemptycount before calling .pdfrun.
+/.pdfcount { % - .pdfcount <count>
+ count pdfemptycount sub
+} bind def
+
+% ------ File reading ------ %
+
+% Read the cross-reference entry for an (unresolved) object.
+% The caller must save and restore the PDFfile position if desired.
+% For invalid (free) objects, we return 0.
+/readxrefentry % <object#> readxrefentry <objpos>
+ { dup Objects exch lget
+ PDFfile exch setfileposition
+ PDFfile token pop % object position
+ PDFfile token pop % generation #
+ PDFfile token pop % n or f
+ dup /n eq
+ { pop 1 add dup 255 gt
+ { Generations ltype /stringtype eq
+ { % Convert Generations from a string to an array.
+ larray Generations llength lgrowto dup
+ 0 1 2 index llength 1 sub
+ { Generations 1 index lget lput dup
+ }
+ for pop /Generations exch store
+ }
+ if
+ }
+ if
+ }
+ { /f eq
+ { pop 0 }
+ { /readxrefentry cvx /syntaxerror signalerror }
+ ifelse
+ }
+ ifelse
+ % Stack: obj# objpos 1+gen#
+ Generations 4 -1 roll 3 -1 roll lput
+ } bind def
+
+% ================================ Objects ================================ %
+
+% Since we may have more than 64K objects, we have to use a 2-D array to
+% hold them (and the parallel Generations structure).
+/lshift 9 def
+/lnshift lshift neg def
+/lsubmask 1 lshift bitshift 1 sub def
+/lsublen lsubmask 1 add def
+/larray { % - larray <larray>
+ [ [] ]
+} bind def
+/lstring { % - lstring <lstring>
+ [ () ]
+} bind def
+/ltype { % <lseq> type <type>
+ 0 get type
+} bind def
+/lget { % <lseq> <index> lget <value>
+ dup //lsubmask and 3 1 roll //lnshift bitshift get exch get
+} bind def
+/lput { % <lseq> <index> <value> lput -
+ 3 1 roll
+ dup //lsubmask and 4 1 roll //lnshift bitshift get
+ 3 1 roll put
+} bind def
+/llength { % <lseq> llength <length>
+ dup length 1 sub dup //lshift bitshift
+ 3 1 roll get length add
+} bind def
+% lgrowto assumes newlength > llength(lseq)
+/growto { % <string/array> <length> growto <string'/array'>
+ 1 index type /stringtype eq { string } { array } ifelse
+ 2 copy copy pop exch pop
+} bind def
+/lgrowto { % <lseq> <newlength> lgrowto <lseq'>
+ dup //lsubmask add //lnshift bitshift dup 3 index length gt {
+ % Add more sub-arrays. Start by completing the last existing one.
+ % Stack: lseq newlen newtoplen
+ 3 -1 roll dup llength 1 sub //lsubmask or 1 add lgrowto
+ % Stack: newlen newtoplen lseq
+ [ exch aload pop
+ counttomark 2 add -1 roll % newtoplen
+ counttomark sub { dup 0 0 getinterval lsublen growto } repeat
+ dup 0 0 getinterval ] exch
+ } {
+ pop
+ } ifelse
+ % Expand the last sub-array.
+ 1 sub //lsubmask and 1 add
+ exch dup dup length 1 sub 2 copy
+ % Stack: newsublen lseq lseq len-1 lseq len-1
+ get 5 -1 roll growto put
+} bind def
+/lforall { % <lseq> <proc> lforall -
+ /forall cvx 2 packedarray cvx forall
+} bind def
+
+% We keep track of PDF objects using the following PostScript variables:
+%
+% Generations (lstring): Generations[N] holds 1+ the current
+% generation number for object number N. (As far as we can tell,
+% this is needed only for error checking.) For free objects,
+% Generations[N] is 0.
+%
+% Objects (larray): If object N is loaded, Objects[N] is the actual
+% object; otherwise, Objects[N] is an executable integer giving
+% the file offset of the object's entry in the cross-reference
+% table.
+%
+% GlobalObjects (dictionary): If object N has been resolved in
+% global VM, GlobalObjects[N] is the same as Objects[N]
+% (except that GlobalObjects itself is stored in global VM,
+% so the entry will not be deleted at the end of the page).
+%
+% IsGlobal (lstring): IsGlobal[N] = 1 iff object N was resolved in
+% global VM. This is an accelerator to avoid having to do a
+% dictionary lookup in GlobalObjects when resolving every object.
+
+% Initialize the PDF object tables.
+/initPDFobjects { % - initPDFobjects -
+ /Objects larray def
+ /Generations lstring def
+ .currentglobal true .setglobal
+ /GlobalObjects 20 dict def
+ .setglobal
+ /IsGlobal lstring def
+} bind def
+
+% Grow the tables to a specified size.
+/growPDFobjects { % <minsize> growPDFobjects -
+ dup Objects llength gt {
+ dup Objects exch lgrowto /Objects exch def
+ } if
+ dup Generations llength gt {
+ dup Generations exch lgrowto /Generations exch def
+ } if
+ dup IsGlobal llength gt {
+ dup IsGlobal exch lgrowto /IsGlobal exch def
+ } if
+ pop
+} bind def
+
+% We represent an unresolved object reference by a procedure of the form
+% {obj# gen# resolveR}. This is not a possible PDF object, because PDF has
+% no way to represent procedures. Since PDF in fact has no way to represent
+% any PostScript object that doesn't evaluate to itself, we can 'force'
+% a possibly indirect object painlessly with 'exec'.
+% Note that since we represent streams by executable dictionaries
+% (see below), we need both an xcheck and a type check to determine
+% whether an object has been resolved.
+/resolved? { % <object#> resolved? <value> true
+ % <object#> resolved? false
+ Objects 1 index lget dup xcheck {
+ dup type /integertype eq {
+ % Check whether the object is in GlobalObjects.
+ pop IsGlobal 1 index lget 0 eq {
+ pop false
+ } {
+ % Update Objects from GlobalObjects
+ DEBUG { (%Global=>local: ) print dup == } if
+ GlobalObjects 1 index get dup Objects 4 1 roll lput true
+ } ifelse
+ } {
+ exch pop true
+ } ifelse
+ } {
+ exch pop true
+ } ifelse
+} bind def
+/oforce /exec load def
+/oget { % <array> <index> oget <object>
+ % <dict> <key> oget <object>
+ % Before release 6.20, this procedure stored the resolved
+ % object back into the referring slot. In order to support
+ % PDF linearization, we no longer do this.
+ get oforce
+} bind def
+% A null value in a dictionary is equivalent to an omitted key;
+% we must check for this specially.
+/knownoget { % <dict> <key> knownoget <value> true
+ % <dict> <key> knownoget false
+ % See oget above regarding this procedure.
+ .knownget {
+ oforce dup null eq { pop false } { true } ifelse
+ } {
+ false
+ } ifelse
+} bind def
+
+% PDF 1.1 defines a 'foreign file reference', but not its meaning.
+% Per the specification, we convert these to nulls.
+/F { % <file#> <object#> <generation#> F <object>
+ % Some PDF 1.1 files use F as a synonym for f!
+ .pdfcount 3 lt { f } { pop pop pop null } ifelse
+} bind def
+
+/checkgeneration { % <object#> <generation#> checkgeneration <object#> <OK>
+ Generations 2 index lget 1 sub 1 index eq {
+ pop true
+ } {
+ QUIET not {
+ Generations 2 index lget 0 eq {
+ (Warning: reference to free object: )
+ } {
+ (Warning: wrong generation: )
+ } ifelse print 1 index =only ( ) print =only ( R) =
+ } {
+ pop
+ } ifelse false
+ } ifelse
+} bind def
+/R { % <object#> <generation#> R <object>
+ /resolveR cvx 3 packedarray cvx
+} bind def
+
+% If we encounter an object definition while reading sequentially,
+% we just store it away and keep going.
+/objopdict mark
+ valueopdict { } forall
+ /endobj dup cvx
+.dicttomark readonly def
+/obj { % <object#> <generation#> obj <object>
+ PDFfile objopdict .pdfrun
+} bind def
+/endobj { % <object#> <generation#> <object> endobj <object>
+ 3 1 roll
+ % Read the xref entry if we haven't yet done so.
+ % This is only needed for generation # checking.
+ 1 index resolved? {
+ pop
+ } {
+ PDFfile fileposition
+ 2 index readxrefentry pop
+ PDFoffset add PDFfile exch setfileposition
+ } ifelse
+ checkgeneration {
+ % The only global objects we bother to save are
+ % (resource) dictionaries.
+ 1 index dup gcheck exch type /dicttype eq and {
+ DEBUG { (%Local=>global: ) print dup == } if
+ GlobalObjects 1 index 3 index put
+ IsGlobal 1 index 1 put
+ } if
+ Objects exch 2 index lput
+ } {
+ pop pop null
+ } ifelse
+} bind def
+
+% When resolving an object reference, we stop at the endobj.
+/resolveopdict mark
+ valueopdict { } forall
+ /endobj { endobj exit } bind
+ % OmniForm generates PDF file with endobj missing in some
+ % objects. AR ignores this. So we have to do it too.
+ /obj { pop pop endobj exit } bind
+.dicttomark readonly def
+/resolveR { % <object#> <generation#> resolveR <object>
+ DEBUG { (%Resolving: ) print 2 copy 2 array astore == } if
+ 1 index resolved? {
+ exch pop exch pop
+ } {
+ PDFfile fileposition 3 1 roll
+ 1 index readxrefentry
+ 3 1 roll checkgeneration {
+ % Stack: savepos objpos obj#
+ exch PDFoffset add PDFfile exch setfileposition
+ PDFfile token pop 2 copy ne
+ { (xref error!) = /resolveR cvx /rangecheck signalerror
+ }
+ if pop PDFfile token pop
+ PDFfile token pop /obj ne
+ { (xref error!) = /resolveR cvx /rangecheck signalerror
+ }
+ if
+ pdf_run_resolve % PDFfile resolveopdict .pdfrun
+ }
+ { % Don't cache if the generation # is wrong.
+ pop pop null
+ } ifelse
+ exch PDFfile exch setfileposition
+ } ifelse
+} bind def
+
+% ================================ Streams ================================ %
+
+% We represent a stream by an executable dictionary that contains,
+% in addition to the contents of the original stream dictionary:
+% /File - the file or string where the stream contents are stored,
+% if the stream is not an external one.
+% /FilePosition - iff File is a file, the position in the file
+% where the contents start.
+% /StreamKey - the key used to decrypt this stream, if any.
+% We do the real work of constructing the data stream only when the
+% contents are needed.
+
+% Construct a stream. The length is not reliable in the face of
+% different end-of-line conventions, but it's all we've got.
+%
+% PDF files are inconsistent about what may fall between the 'stream' keyword
+% and the actual stream data, and it appears that no one algorithm can
+% detect this reliably. We used to try to guess whether the file included
+% extraneous \r and/or \n characters, but we no longer attempt to do so,
+% especially since the PDF 1.2 specification states flatly that the only
+% legal terminators following the 'stream' keyword are \n or \r\n, both of
+% which are properly skipped and discarded by the token operator.
+/stream { % <dict> stream <modified_dict>
+ dup /F known dup PDFsource PDFfile eq or {
+ not {
+ dup /File PDFfile put
+ dup /FilePosition PDFfile fileposition put
+ DEBUG { (%FilePosition: ) print dup /FilePosition get == } if
+ } if
+ PDFfile fileposition 1 index /Length oget add
+ PDFfile exch setfileposition
+ } {
+ pop
+ % We're already reading from a stream, which we can't reposition.
+ % Capture the sub-stream contents in a string.
+ dup /Length oget string PDFsource exch readstring
+ not {
+ (Unexpected EOF in stream!) =
+ /stream cvx /rangecheck signalerror
+ } if
+ 1 index exch /File exch put
+ } ifelse
+ PDFsource token pop
+ /endstream ne { /stream cvx /syntaxerror signalerror } if
+ cvx
+} bind def
+/endstream {
+ exit
+} bind def
+
+% Contrary to the published PDF (1.3) specification, Acrobat Reader
+% accepts abbreviated filter names everywhere, not just for in-line images,
+% and some applications (notably htmldoc) rely on this.
+/unabbrevfilterdict mark
+ /AHx /ASCIIHexDecode /A85 /ASCII85Decode /CCF /CCITTFaxDecode
+ /DCT /DCTDecode /Fl /FlateDecode /LZW /LZWDecode /RL /RunLengthDecode
+.dicttomark readonly def
+
+% Extract and apply filters.
+/filterparms { % <dict> <DPkey> <Fkey> filterparms
+ % <dict> <parms> <filternames>
+ 2 index exch .knownget {
+ exch 2 index exch .knownget {
+ % Both filters and parameters.
+ exch dup type /nametype eq {
+ 1 array astore exch 1 array astore exch
+ } if
+ } {
+ % Filters, but no parameters.
+ null exch
+ dup type /nametype eq { 1 array astore } if
+ } ifelse
+ } {
+ % No filters: ignore parameters, if any.
+ pop null { }
+ } ifelse
+} bind def
+/filtername { % <filtername> filtername <filtername'>
+ //unabbrevfilterdict 1 index .knownget { exch pop } if
+} bind def
+/applyfilters { % <parms> <source> <filternames> applyfilters <stream>
+ 2 index null eq {
+ { filtername filter }
+ } {
+ { % Stack: parms stream filtername
+ 2 index 0 oget dup null eq { pop } { exch } ifelse filtername filter
+ exch dup length 1 sub 1 exch getinterval exch
+ }
+ } ifelse forall exch pop
+} bind def
+
+% Resolve a stream dictionary to a PostScript stream.
+% Streams with no filters require special handling:
+% - If we are going to interpret their contents, we let endstream
+% terminate the interpretation loop;
+% - If we are just going to read data from them, we impose
+% a SubFileDecode filter that reads just the requisite amount of data.
+% Note that, in general, resolving a stream repositions PDFfile.
+% Clients must save and restore the position of PDFfile themselves.
+/resolvestream { % <streamdict> <readdata?> resolvestream <stream>
+ 1 index /F .knownget {
+ % This stream is stored on an external file.
+ (r) file 3 -1 roll
+ /FDecodeParms /FFilter filterparms
+ % Stack: readdata? file dict parms filternames
+ 4 -1 roll exch
+ pdf_decrypt_stream
+ applyfilters
+ } {
+ exch dup /FilePosition .knownget {
+ 1 index /File get exch setfileposition
+ } if
+ % Stack: readdata? dict
+ /DecodeParms /Filter filterparms
+ % Stack: readdata? dict parms filternames
+ 2 index /File get exch
+ % Stack: readdata? dict parms file/string filternames
+ pdf_decrypt_stream % add decryption if needed
+ dup length 0 eq {
+ % All the PDF filters have EOD markers, but in this case
+ % there is no specified filter.
+ pop exch pop
+ % Stack: readdata? dict file/string
+ 2 index {
+ % We're going to read data; use a SubFileDecode filter.
+ 1 index /Length oget () /SubFileDecode filter
+ } {
+ dup type /filetype ne {
+ % Use a SubFileDecode filter to read from a string.
+ 0 () /SubFileDecode filter
+ } if
+ } ifelse
+ } {
+ applyfilters
+ } ifelse
+ } ifelse
+ % Stack: readdata? dict file
+ exch pop exch pop
+} bind def
+
+% ============================ Name/number trees ============================ %
+
+/nameoget { % <nametree> <key> nameoget <obj|null>
+ exch /Names exch .treeget
+} bind def
+
+/numoget { % <numtree> <key> numoget <obj|null>
+ exch /Nums exch .treeget
+} bind def
+
+/.treeget { % <key> <leafkey> <tree> .treeget <obj|null>
+ dup /Kids knownoget {
+ exch pop .branchget
+ } {
+ exch get .leafget
+ } ifelse
+} bind def
+
+/.branchget { % <key> <leafkey> <kids> .branchget <obj|null>
+ dup length 0 eq {
+ pop pop pop null
+ } {
+ dup length -1 bitshift 2 copy oget
+ % Stack: key leafkey kids mid kids[mid]
+ dup /Limits oget aload pop
+ % Stack: key leafkey kids mid kids[mid] min max
+ 6 index lt {
+ pop pop
+ 1 add 1 index length 1 index sub getinterval .branchget
+ } {
+ 5 index gt {
+ pop
+ 0 exch getinterval .branchget
+ } {
+ exch pop exch pop .treeget
+ } ifelse
+ } ifelse
+ } ifelse
+} bind def
+
+/.leafget { % <key> <pairs> .leafget <obj|null>
+ dup length 2 eq {
+ dup 0 get 2 index eq { 1 oget } { pop null } ifelse
+ exch pop
+ } {
+ dup length -1 bitshift -2 and 2 copy oget
+ % Stack: key pairs mid pairs[mid]
+ 3 index gt { 0 exch } { 1 index length 1 index sub } ifelse
+ getinterval .leafget
+ } ifelse
+} bind def
+
+end % pdfdict
+.setglobal
diff --git a/Master/xemtex/gslib/pdf_draw.ps b/Master/xemtex/gslib/pdf_draw.ps
new file mode 100644
index 00000000000..b75a84e725a
--- /dev/null
+++ b/Master/xemtex/gslib/pdf_draw.ps
@@ -0,0 +1,1151 @@
+% Copyright (C) 1994, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: pdf_draw.ps,v 1.36.2.2.2.1 2003/04/12 14:02:39 giles Exp $
+% pdf_draw.ps
+% PDF drawing operations (graphics, text, and images).
+
+/.setlanguagelevel where { pop 2 .setlanguagelevel } if
+.currentglobal true .setglobal
+/pdfdict where { pop } { /pdfdict 100 dict def } ifelse
+GS_PDF_ProcSet begin
+pdfdict begin
+
+% For simplicity, we use a single interpretation dictionary for all
+% PDF graphics operations, even though this is too liberal.
+/drawopdict 100 dict def
+
+% ================================ Graphics ================================ %
+
+% ---------------- Functions ---------------- %
+
+% Note that resolvefunction converts a PDF Function to a PostScript Function;
+% resolve*fnproc converts a PDF function to a PostScript procedure.
+
+/fnrdict mark
+ 0 { .resolvefn0 }
+ 2 { }
+ 3 { .resolvefn3 }
+ 4 { .resolvefn4 }
+.dicttomark readonly def
+
+/.resolvefn0 {
+ % Don't lose our place in PDFfile.
+ PDFfile fileposition exch
+ dup true resolvestream
+ % The stream isn't positionable, so read all the data now.
+ % Stack: filepos fndict stream
+ 1 index /Range oget length 2 idiv 2 index /BitsPerSample oget mul
+ 2 index /Size oget { mul } forall
+ 7 add 8 idiv string
+ 1 index exch readstring pop exch closefile
+ % Stack: filepos fndict data
+ exch dup length 1 add dict .copydict
+ dup /DataSource 4 -1 roll put
+ exch PDFfile exch setfileposition
+} bdef
+
+/.resolvefn3 {
+ dup length dict .copydict
+ dup /Bounds 2 copy knownoget { put } { pop pop } ifelse
+ dup /Encode 2 copy knownoget { put } { pop pop } ifelse
+ dup /Functions 2 copy oget mark exch dup {
+ oforce .resolvefn
+ } forall
+ counttomark -1 roll astore exch pop put
+} bdef
+
+/.resolvefn4 {
+ PDFfile fileposition exch % filepos fndict
+ dup true resolvestream % filepos fndict stream
+ exch dup length dict copy % filepos stream fndict2
+ dup /Function undef % filepos stream fndict2
+ exch dup token not {
+ () /rangecheck cvx signalerror
+ } if
+ exch token {
+ /rangecheck cvx signalerror
+ } if
+ % Use .bind to avoid idiom recognition.
+ .bind
+ 1 index /Function 3 -1 roll put
+ exch PDFfile exch setfileposition
+} bdef
+currentdict /tfopdict undef
+
+/.resolvefn { % <fndict> .resolvefn <fndict'>
+ dup /FunctionType oget //fnrdict exch get exec
+} bdef
+
+/resolvefunction { % <fndict> resolvefunction <function>
+ .resolvefn
+ DEBUG { (%Function: ) print dup === flush } if
+} bdef
+
+/resolvefnproc { % <fndict> resolvefnproc <proc>
+ resolvefunction .buildfunction
+} bdef
+
+/resolveidfnproc { % <fndict> resolveidfnproc <proc>
+ dup /Identity eq { pop { } } { resolvefnproc } ifelse
+} bdef
+
+/resolvedefaultfnproc { % <fndict> <default> resolved'fnproc <proc>
+ 1 index /Default eq { exch pop } { pop resolveidfnproc } ifelse
+} bdef
+
+% ---------------- Shadings ---------------- %
+
+/shrdict mark
+ /ColorSpace {
+ resolvecolorspace
+ }
+ /Function {
+ dup type /dicttype eq {
+ resolvefunction
+ } {
+ [ exch { oforce resolvefunction } forall ]
+ } ifelse
+ }
+.dicttomark readonly def
+
+/resolveshading { % <shadingstream> resolveshading <shading>
+ PDFfile fileposition exch
+ mark exch {
+ oforce //shrdict 2 index .knownget { exec } if
+ } forall .dicttomark
+ dup /ShadingType get 4 ge {
+ dup dup true resolvestream
+ % Make a reusable stream so that the shading doesn't
+ % reposition PDFfile at unexpected times.
+ /ReusableStreamDecode filter /DataSource exch put
+ } if exch PDFfile exch setfileposition
+} bdef
+/resolvesh { % <shname> resolveshading <shading>
+ Page /Shading rget {
+ resolveshading
+ } {
+ null
+ }ifelse
+} bdef
+
+% ---------------- Halftones ---------------- %
+
+/spotfunctions mark
+ /Round {
+ abs exch abs 2 copy add 1 le {
+ dup mul exch dup mul add 1 exch sub
+ } {
+ 1 sub dup mul exch 1 sub dup mul add 1 sub
+ } ifelse
+ }
+ /Diamond {
+ abs exch abs 2 copy add .75 le {
+ dup mul exch dup mul add 1 exch sub
+ } {
+ 2 copy add 1.23 le {
+ .85 mul add 1 exch sub
+ } {
+ 1 sub dup mul exch 1 sub dup mul add 1 sub
+ } ifelse
+ } ifelse
+ }
+ /Ellipse {
+ abs exch abs 2 copy 3 mul exch 4 mul add 3 sub dup 0 lt {
+ pop dup mul exch .75 div dup mul add 4 div 1 exch sub
+ } {
+ dup 1 gt {
+ pop 1 exch sub dup mul exch 1 exch sub
+ .75 div dup mul add 4 div 1 sub
+ } {
+ .5 exch sub exch pop exch pop
+ } ifelse
+ } ifelse
+ }
+ /EllipseA { dup mul .9 mul exch dup mul add 1 exch sub }
+ /InvertedEllipseA { dup mul .9 mul exch dup mul add 1 sub }
+ /EllipseB { dup 5 mul 8 div mul exch dup mul exch add sqrt 1 exch sub }
+ /EllipseC { dup mul .9 mul exch dup mul add 1 exch sub }
+ /InvertedEllipseC { dup mul .9 mul exch dup mul add 1 sub }
+ /Line { exch pop abs neg }
+ /LineX { pop }
+ /LineY { exch pop }
+ /Square { abs exch abs 2 copy lt { exch } if pop neg }
+ /Cross { abs exch abs 2 copy gt { exch } if pop neg }
+ /Rhomboid { abs exch abs 0.9 mul add 2 div }
+ /DoubleDot { 2 {360 mul sin 2 div exch } repeat add }
+ /InvertedDoubleDot { 2 {360 mul sin 2 div exch } repeat add neg }
+ /SimpleDot { dup mul exch dup mul add 1 exch sub }
+ /InvertedSimpleDot { dup mul exch dup mul add 1 sub }
+ /CosineDot { 180 mul cos exch 180 mul cos add 2 div }
+ /Double { exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add }
+ /InvertedDouble {
+ exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add neg
+ }
+.dicttomark readonly def
+
+/htrdict mark
+ 1 { .resolveht1 }
+ 5 { .resolveht5 }
+ % We don't support types 6, 10, or 16 yet.
+.dicttomark readonly def
+
+/.resolveht1 {
+ mark exch {
+ oforce
+ 1 index /SpotFunction eq {
+ dup type /nametype eq
+ { //spotfunctions exch get } { resolvefnproc }
+ ifelse
+ } {
+ 1 index /TransferFunction eq {
+ resolveidfnproc
+ } if
+ } ifelse
+ } forall .dicttomark
+} bdef
+
+/.resolveht5 {
+ mark exch {
+ oforce dup type /dicttype eq { resolvehalftone } if
+ } forall .dicttomark
+} bdef
+
+/resolvehalftone { % <dict> resolvehalftone <halftone>
+ dup /HalftoneType get //htrdict exch get exec
+} bdef
+
+% ---------------- Graphics state management ---------------- %
+
+/cmmatrix matrix def
+drawopdict begin
+ % Graphics state stack
+ /q { q } def
+ /Q { Q } def
+ % Graphics state setting
+ /cm { //cmmatrix astore concat } def
+ /i /setflat load def
+ /J /setlinecap load def
+ /d /setdash load def
+ /j /setlinejoin load def
+ /w /setlinewidth load def
+ /M /setmiterlimit load def
+ /gs { gs } def
+end
+
+% Each entry in this dictionary is
+% <gsres> <value> -proc- <gsres>
+/gsbg {
+ /BGDefault load resolvedefaultfnproc setblackgeneration
+} bdef
+/gsucr {
+ /UCRDefault load resolvedefaultfnproc setundercolorremoval
+} bdef
+/gstr {
+ dup type /arraytype eq {
+ { oforce /TRDefault load resolvedefaultfnproc } forall
+ setcolortransfer
+ } {
+ /TRDefault load resolvedefaultfnproc settransfer
+ } ifelse
+} bdef
+/gsparamdict mark
+ /SA { setstrokeadjust }
+ /OP { 1 index /op known not { dup op } if OP }
+ % The PDF 1.3 specification says that the name /Default is only
+ % recognized for {BG,UCR,TR}2. However, PDF 1.3 files produced
+ % by Adobe Acrobat Distiller 4.0 for Windows use the name /Default
+ % with the older keys, so we have to implement this.
+ /BG { 1 index /BG2 known { pop } { gsbg } ifelse }
+ /UCR { 1 index /UCR2 known { pop } { gsucr } ifelse }
+ /TR { 1 index /TR2 known { pop } { gstr } ifelse }
+ /HT {
+ dup /Default eq {
+ pop .setdefaultscreen
+ } {
+ %****** DOESN'T IMPLEMENT THE STREAM CASE YET ******
+ resolvehalftone sethalftone
+ } ifelse
+ }
+ /HTP {
+ % HTP may be present even if this isn't a DPS interpreter.
+ /sethalftonephase where { pop aload pop sethalftonephase } { pop } ifelse
+ }
+ % PDF 1.3
+ /Font { aload pop Tf }
+ /LW { setlinewidth }
+ /LC { setlinecap }
+ /LJ { setlinejoin }
+ /ML { setmiterlimit }
+ /D { aload pop setdash }
+ /RI { ri }
+ /op { op }
+ /OPM { OPM }
+ /BG2 { gsbg }
+ /UCR2 { gsucr }
+ /TR2 { gstr }
+ /FL { setflat }
+ /SM {
+ % SM may be present even if this is only a Level 2 interpreter.
+ /setsmoothness where { pop setsmoothness } { pop } ifelse
+ }
+ % PDF 1.4
+ % All of these require the "transparency" feature in the interpreter.
+ /ca { ca }
+ /CA { CA }
+ /SMask { gssmask }
+ /AIS { AIS }
+ /BM { BM }
+ /TK { TK }
+.dicttomark readonly def
+/gs { % <gsres> gs -
+ Page /ExtGState rget {
+ % We keep the dictionary on the stack during the forall so that
+ % keys that interact with each other have access to it.
+ dup {
+ oforce exch gsparamdict exch .knownget { exec } { pop } ifelse
+ } forall pop
+ } if
+} bdef
+
+% ------ Transparency support ------ %
+
+/gssmask {
+ dup /None eq {
+ pop null
+ } {
+ % Preprocess the SMask value into a parameter dictionary for
+ % .begintransparencymask, with added /BBox and /Draw keys.
+ mark exch % Stack: mark smaskdict
+ dup /S oget /Subtype exch 3 2 roll
+ % Stack: mark ... smaskdict
+ dup /BC knownoget { /Background exch 3 2 roll } if
+ dup /TR knownoget {
+ resolveidfnproc /TransferFunction exch 3 2 roll
+ } if
+ dup /G oget dup /BBox oget /BBox exch 4 2 roll
+ /.execmaskgroup cvx 2 packedarray cvx /Draw exch 3 2 roll
+ pop .dicttomark
+ } ifelse SMask
+} bdef
+
+% This procedure is called to actually render the soft mask.
+/.execmaskgroup { % <masknum> <paramdict> <formdict> .execmaskgroup -
+ % Save our place in PDFfile, and do a gsave to avoid resetting
+ % the color space.
+ gsave PDFfile fileposition 4 1 roll
+ % We have to select the group's color space so that the
+ % background color will be interpreted correctly.
+ dup /Group oget /CS knownoget { csresolve setcolorspace } if
+ exch dup /BBox get aload pop .begintransparencymask {
+ dup /Resources knownoget { oforce } { 0 dict } ifelse
+ exch false resolvestream
+ .execgroup .endtransparencymask
+ } .internalstopped {
+ .discardtransparencymask stop
+ } if
+ PDFfile exch setfileposition grestore
+} bdef
+% Paint a Form+Group XObject, either for a transparency mask or for a Do.
+/.execgroup { % <resdict> <stream> .execgroup -
+ gsave
+ 1 .setopacityalpha 1 .setshapealpha
+ 0 .inittransparencymask 1 .inittransparencymask
+ /Compatible .setblendmode
+ % Execute the body of the Form, similar to DoForm.
+ pdfopdict .pdfruncontext
+ grestore
+} bdef
+
+/.beginformgroup { % groupdict bbox .beginformgroup -
+ exch mark exch % bbox mark groupdict
+ dup /CS knownoget { csresolve setcolorspace } if
+ dup /I knownoget { /Isolated exch 3 2 roll } if
+ dup /K knownoget { /Knockout exch 3 2 roll } if
+ pop .dicttomark
+ % Stack: bbox paramdict
+ exch aload pop
+ .begintransparencygroup
+} bdef
+
+% .paintgroupform implements the Form PaintProc in the case where the
+% Form XObject dictionary includes a Group key. See .paintform below.
+/.paintgroupform { % <resdict> <stream> <formdict> .paintgroupform -
+ dup /Group oget exch /BBox oget
+ % Stack: resdict stream groupdict bbox
+ .beginformgroup {
+ .execgroup
+ } .internalstopped {
+ .discardtransparencygroup stop
+ } if .endtransparencygroup
+} bdef
+
+% Make an ImageType 103 (soft-masked) image.
+/makesoftmaskimage { % <datasource> <imagemask> <SMask> makesoftmaskimage
+ % <datasource> <imagemask>, updates currentdict =
+ % imagedict
+ % See the ImageType 3 case of makemaskimage below.
+ % SMask is a stream, another Image XObject.
+ % Stack: datasource imagemask(false) smaskstreamdict
+ PDFfile fileposition exch
+ dup /Matte knownoget { /Matte exch def } if
+ dup length dict makeimagedict pop
+ % In order to prevent the two data sources from being
+ % aliased, we need to make at least one a reusable stream.
+ % We pick the mask, since it's smaller (in case we need to
+ % read all its data now).
+ % Stack: datasource imagemask(false) savedpos
+ % maskdict is currentdict
+ /DataSource DataSource mark
+ /Intent 1
+ /AsyncRead true
+ .dicttomark .reusablestreamdecode def
+ PDFfile exch setfileposition
+ currentdict end currentdict end
+ 5 dict begin
+ /ImageType 103 def
+ /DataDict exch def
+ dup /InterleaveType 3 put
+ DataDict /Matte .knownget {
+ /Matte exch def
+ } if
+ AlphaIsShape { /ShapeMaskDict } { /OpacityMaskDict } ifelse exch def
+ /ColorSpace DataDict /ColorSpace get def
+} bdef
+
+% ---------------- Color setting ---------------- %
+
+/01_1 [0 1] readonly def
+/01_3 [0 1 0 1 0 1] readonly def
+/01_4 [0 1 0 1 0 1 0 1] readonly def
+
+% The keys here are resolved (PostScript, not PDF) color space names.
+/csncompdict mark
+ /DeviceGray { pop 1 }
+ /DeviceRGB { pop 3 }
+ /DeviceCMYK { pop 4 }
+ /CIEBasedA { pop 1 }
+ /CIEBasedABC { pop 3 }
+ /ICCBased { 1 oget /N oget }
+ /Separation { pop 1 }
+ /DeviceN { 1 oget length }
+.dicttomark readonly def
+
+% Perhaps some of the values in the following need to be modified
+% depending on the WhitePoint value....
+/cslabinit mark
+ /DecodeABC [{16 add 116 div} bind {500 div} bind {200 div} bind]
+ /MatrixABC [1 1 1 1 0 0 0 0 -1]
+ /DecodeLMN [
+ {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse
+ 0.9505 mul} bind
+ {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse
+ } bind
+ {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse
+ 1.0890 mul} bind
+ ]
+.dicttomark readonly def
+
+/csrdict mark
+ /DeviceGray {
+ /DefaultGray Page /ColorSpace rget { exch pop resolvecolorspace } if
+ }
+ /DeviceRGB {
+ /DefaultRGB Page /ColorSpace rget { exch pop resolvecolorspace } if
+ }
+ /DeviceCMYK { }
+ /CalGray {
+ 1 oget 6 dict begin
+ dup /Gamma knownoget {
+ /exp load 2 packedarray cvx /DecodeA exch def
+ } if
+ dup /BlackPoint knownoget { /BlackPoint exch def } if
+ dup /WhitePoint knownoget { /WhitePoint exch def } if
+ pop [ /CIEBasedA currentdict end ]
+ }
+ /CalRGB {
+ 1 oget 6 dict begin
+ dup /Gamma knownoget {
+ [ exch { /exp load 2 packedarray cvx } forall
+ ] /DecodeABC exch def
+ } if
+ dup /Matrix knownoget { /MatrixABC exch def } if
+ dup /BlackPoint knownoget { /BlackPoint exch def } if
+ dup /WhitePoint knownoget { /WhitePoint exch def } if
+ pop [ /CIEBasedABC currentdict end ]
+ }
+ /CalCMYK {
+ pop /DeviceCMYK % not defined by Adobe
+ }
+ /Lab {
+ 1 oget 6 dict begin
+ dup /Range knownoget not { [-100 100 -100 100] } if
+ [0 100 null null null null] dup 2 4 -1 roll putinterval
+ /RangeABC exch def
+ //cslabinit { def } forall
+ dup /BlackPoint knownoget { /BlackPoint exch def } if
+ dup /WhitePoint knownoget { /WhitePoint exch def } if
+ pop [ /CIEBasedABC currentdict end ]
+ }
+ /ICCBased {
+ PDFfile fileposition exch
+ dup dup 1 oget
+ mark exch { oforce } forall .dicttomark
+ dup dup true resolvestream
+ /ReusableStreamDecode filter /DataSource exch put
+ 1 exch put
+ exch PDFfile exch setfileposition
+ } bind
+ /Separation {
+ aload pop exch oforce resolvecolorspace exch oforce resolvefnproc
+ 4 array astore
+ }
+ /DeviceN {
+ 0 4 getinterval % ignore attributes
+ aload pop 3 -1 roll oforce
+ 3 -1 roll oforce resolvecolorspace
+ 3 -1 roll oforce resolvefnproc
+ 4 array astore
+ }
+ /Indexed {
+ aload pop 3 -1 roll oforce resolvecolorspace
+ % If the underlying space is a Lab space, we must scale
+ % the output of the lookup table as part of DecodeABC.
+ dup dup type /arraytype eq { 0 get } if /CIEBasedABC eq {
+ dup 1 get /DecodeLMN known {
+ 1 get dup length dict copy
+ begin /DecodeABC [ 0 2 4 {
+ RangeABC 1 index 1 add get RangeABC 2 index get sub /mul load
+ RangeABC 3 index get /add load
+ DecodeABC 6 -1 roll 2 idiv get [ 6 1 roll aload pop ] cvx
+ } for ] def
+ /RangeABC //01_3 def
+ currentdict end /CIEBasedABC exch 2 array astore
+ } if
+ } if
+ 3 1 roll
+ oforce dup type /stringtype ne {
+ % The color lookup table is a stream.
+ % Get its contents. Don't lose our place in PDFfile.
+ % Stack: /Indexed basespace hival lookup
+ PDFfile fileposition 5 1 roll true resolvestream
+ % Stack: filepos /Indexed basespace hival lookupstream
+ 1 index 1 add
+ % Stack: filepos /Indexed basespace hival lookupstream len
+ 3 index
+ dup dup type /arraytype eq { 0 get } if
+ //csncompdict exch get exec mul
+ string readstring pop
+ % Stack: filepos /Indexed basespace hival table
+ 5 -1 roll PDFfile exch setfileposition
+ }
+ if 4 array astore
+ }
+ /Pattern {
+ dup type /nametype ne {
+ dup length 1 gt {
+ 1 oget resolvecolorspace
+ /Pattern exch 2 array astore
+ } if
+ } if
+ }
+.dicttomark readonly def
+
+/cssubst { % <csname> cssubst <cspace'> true
+ % <csname> cssubst false
+ dup resolvecolorspace
+ dup 1 index ne { exch pop true } { pop pop false } ifelse
+} bdef
+
+/csnames mark
+ /DeviceGray dup /DeviceRGB dup /DeviceCMYK dup /Pattern dup
+.dicttomark readonly def
+/csresolve { % <csresourcename> csresolve <cspace>
+ dup Page /ColorSpace rget {
+ exch pop resolvecolorspace
+ } {
+ //csnames 1 index known not { /undefined cvx signalerror } if
+ } ifelse
+} bdef
+/resolvecolorspace { % <cspace> resolvecolorspace <cspace'>
+ dup dup type /arraytype eq { 0 get } if
+ //csrdict exch .knownget {
+ exec dup type /nametype ne { dup length 1 eq { 0 get } if } if
+ } {
+ csresolve
+ } ifelse
+} bdef
+
+/scresolve { % <c0> ... scresolve <multi>
+ % We can't really make sc[n] and SC[N] work, because
+ % the color space information isn't available at
+ % conversion time; so we hack it by assuming that
+ % all the operands on the stack are used, and that
+ % if the top operand is a name, it's a Pattern resource.
+ dup type /nametype eq
+ { Page /Pattern rget { resolvepattern } { null } ifelse }
+ if
+ dup type /dicttype eq {
+ % Check the PaintType, if any (shading patterns don't
+ % have one).
+ dup /PaintType .knownget { 2 eq } { false } ifelse
+ } {
+ .pdfcount 1 gt
+ } ifelse
+} bdef
+
+/.pdfpaintproc { % <patdict> <resdict> .pdfpaintproc -
+ DEBUG { (%Begin PaintProc) = flush } if
+ % For uncolored patterns, we have to unbind the current
+ % color and color space before running the PaintProc.
+ % There's no harm in doing this for colored patterns,
+ % so for simplicity, we always do it.
+ PDFfile fileposition 3 1 roll
+ q
+ null sc1 null SC1
+ exch false resolvestream pdfopdict .pdfruncontext
+ Q
+ DEBUG { (%End PaintProc) = flush } if
+ PDFfile exch setfileposition
+} bdef
+
+/resolvepattern { % <patternstreamdict> resolvepattern <patterndict>
+ % Don't do the resolvestream now: just capture the data
+ % from the file if necessary.
+ dup length dict copy
+ dup /FilePosition .knownget {
+ 1 index /File get dup fileposition 3 1 roll
+ % Stack: dict savepos pos file
+ dup 3 -1 roll setfileposition
+ dup 3 index /Length oget string readstring pop
+ % Stack: dict savepos file string
+ 3 1 roll exch setfileposition
+ 1 index /File 3 -1 roll put
+ dup /FilePosition undef
+ } if
+ dup /Shading knownoget {
+ resolveshading 1 index /Shading 3 -1 roll put
+ } if
+ dup /PaintProc [
+ % Bind the resource dictionary into the PaintProc.
+ 2 index /Resources knownoget { oforce } { 0 dict } ifelse
+ /.pdfpaintproc cvx
+ ] cvx put
+ DEBUG {
+ (%Pattern: ) print dup === flush
+ } if
+} bdef
+
+drawopdict begin
+ /g { /DeviceGray cssubst { cs sc1 } { g } ifelse } bdef
+ /rg { /DeviceRGB cssubst { cs sc* } { rg } ifelse } bdef
+ /k { k } bdef
+ /cs { csresolve cs } bdef
+ /sc { scresolve { sc* } { sc1 } ifelse } bdef
+ /scn /sc load def
+ /G { /DeviceGray cssubst { CS SC1 } { G } ifelse } bdef
+ /RG { /DeviceRGB cssubst { CS SC* } { RG } ifelse } bdef
+ /K { K } bdef
+ /CS { csresolve CS } bdef
+ /ri { ri } bdef
+ /SC { scresolve { SC* } { SC1 } ifelse } bdef
+ /SCN /SC load def
+end
+
+% ---------------- Paths ---------------- %
+
+drawopdict begin
+ % Path construction
+ /m /moveto load def
+ /l /lineto load def
+ /c /curveto load def
+ /v { currentpoint 6 2 roll curveto } def
+ /y { 2 copy curveto } def
+ /re {
+ 4 2 roll moveto exch dup 0 rlineto 0 3 -1 roll rlineto neg 0 rlineto
+ closepath
+ } def
+ /h /closepath load def
+ % Path painting and clipping
+ /n { n } def
+ /S { S } def
+ /s { s } def
+ /f { f } def
+ /f* { f* } def
+ /B { B } def
+ /b { b } def
+ /B* { B* } def
+ /b* { b* } def
+ /W { W } def
+ /W* { W* } def
+ /sh { resolvesh shfill } def
+end
+
+% ---------------- XObjects ---------------- %
+
+/xobjectprocs mark % <dict> -proc- -
+ /Image { DoImage }
+ /Form { DoForm }
+ /PS { DoPS }
+.dicttomark readonly def
+
+% Note that the keys in defaultdecodedict are resolved (PostScript, not PDF)
+% color space names.
+/defaultdecodedict mark
+ /DeviceGray { pop //01_1 } bind
+ /DeviceRGB { pop //01_3 } bind
+ /DeviceCMYK { pop //01_4 } bind
+ /CIEBasedA { 1 get /RangeA .knownget not { //01_1 } if } bind
+ /CIEBasedABC { 1 get /RangeABC .knownget not { //01_3 } if } bind
+ /ICCBased {
+ 1 oget dup /Range .knownget {
+ exch pop
+ }{
+ /N get [ exch {0 1} repeat ] readonly
+ } ifelse
+ } bind
+ /Separation { pop //01_1 } bind
+ /DeviceN {
+ 1 oget length [ exch {0 1} repeat ] readonly
+ } bind
+ /Indexed {
+ pop [ 0 1 BitsPerComponent bitshift 1 sub ]
+ } bind
+.dicttomark readonly def
+
+/checkaltimage { % <resdict> checkaltimage <resdict[']>
+ Printed {
+ dup /Alternates knownoget {
+ {
+ dup /DefaultForPrinting knownoget {
+ {
+ /Image oget exch pop exit
+ } {
+ pop
+ } ifelse
+ } {
+ pop
+ } ifelse
+ } forall
+ } if
+ } if
+} bdef
+
+/makeimagedict { % <resdict> <newdict> makeimagedict <imagemask>
+ % On return, newdict' is currentdict
+ begin
+ /Width 2 copy oget def
+ /Height 2 copy oget def
+ /BitsPerComponent 2 copy oget def
+ /Interpolate 2 copy knownoget { def } { pop } ifelse
+ makeimagekeys
+} bdef
+/makeimagekeys { % <resdict> makeimagekeys <imagemask>
+ % newdict is currentdict
+ % Assumes Width, Height, BPC, Interpolate already copied.
+ /ImageType 1 def
+ /ImageMatrix Width 0 0
+ % Handle 0-height images specially.
+ Height dup 0 eq { pop 1 } if neg 0 1 index neg
+ 6 array astore def
+ dup /ImageMask knownoget dup { and } if {
+ % Image mask
+ % Decode is required for the PostScript image operators.
+ % AI8 writes bogus decode array [0 1 0 0 0 0 0 0]
+ /Decode 2 copy knownoget { 0 2 getinterval } { //01_1 } ifelse def
+ % BitsPerComponent may be missing for masks.
+ % The spec requires it, but some producers omit it, and
+ % Acrobat Reader doesn't care.
+ /BitsPerComponent 2 copy known { pop } { 1 def } ifelse
+ true
+ } {
+ % Opaque image
+ dup /ColorSpace oget resolvecolorspace /ColorSpace exch def
+ % Decode is required for the PostScript image operators.
+ /Decode 2 copy knownoget not {
+ ColorSpace //defaultdecodedict
+ ColorSpace dup type /arraytype eq { 0 get } if get exec
+ } if def
+ false
+ } ifelse
+ % Even though we're going to read data,
+ % pass false to resolvestream so that
+ % it doesn't try to use Length (which may not be present).
+ exch false resolvestream /DataSource exch def
+} bdef
+
+/DoImage {
+ checkaltimage dup length 6 add dict
+ 1 index /SMask knownoget { 1 index exch /SMask exch put } if
+ 1 index /Mask knownoget { 1 index exch /Mask exch put } if
+ makeimagedict doimage
+} bdef
+/makemaskimage { % <datasource> <imagemask> <Mask> makemaskimage
+ % <datasource> <imagemask>, updates currentdict =
+ % imagedict
+ dup type /arraytype eq {
+ /ImageType 4 def
+ /MaskColor exch def
+ } {
+ % Mask is a stream, another Image XObject.
+ % Stack: datasource imagemask(false) maskstreamdict
+ PDFfile fileposition exch
+ dup length dict makeimagedict pop
+ % In order to prevent the two data sources from being
+ % aliased, we need to make at least one a reusable stream.
+ % We pick the mask, since it's smaller (in case we need to
+ % read all its data now).
+ % Stack: datasource imagemask(false) savedpos
+ % maskdict is currentdict
+ /DataSource DataSource mark
+ /Intent 1
+ /AsyncRead true
+ .dicttomark .reusablestreamdecode def
+ PDFfile exch setfileposition
+ currentdict end currentdict end
+ 5 dict begin
+ /ImageType 3 def
+ /InterleaveType 3 def
+ /DataDict exch def
+ /MaskDict exch def
+ /ColorSpace DataDict /ColorSpace get def
+ } ifelse
+} bdef
+/doimage { % <imagemask> doimage -
+ % imagedict is currentdict, gets popped from dstack
+ DataSource exch
+ PDFversion 1.4 ge { currentdict /SMask knownoget } { false } ifelse {
+ makesoftmaskimage
+ } {
+ currentdict /Mask knownoget {
+ makemaskimage
+ } if
+ } ifelse
+ % Stack: datasource imagemask
+ % image and imagemask can be redefined in gs_init.ps to tweak interpolation
+ % after device-specific files are run. Don't bind them here.
+ { currentdict end setfillstate /imagemask }
+ { ColorSpace setcolorspace currentdict end setfillblend /image }
+ ifelse
+ .systemvar exec
+
+ % Close the input stream, unless it is PDFfile or
+ % PDFsource.
+ dup dup PDFfile eq exch PDFsource eq or { pop } { closefile } ifelse
+} bdef
+
+/.paintform { % <formdict> <resdict> <stream> .paintform -
+ 3 -1 roll dup /Group known {
+ .paintgroupform
+ } {
+ pop pdfopdict .pdfruncontext
+ } ifelse
+} bdef
+
+/DoForm {
+ % Adobe 2nd edition of the PDF 1.3 spec makes /FormType
+ % and /Matrix keys optional. Cope with the missing keys.
+ dup length
+ 1 index /Matrix known
+ { dict
+ }
+ { 1 add dict
+ dup /Matrix { 1 0 0 1 0 0 } cvlit put
+ }
+ ifelse
+ copy
+ dup /FormType known not {
+ dup length 1 add dict copy dup /FormType 1 put
+ } if
+
+ dup [ 2 index /Resources knownoget { oforce } { 0 dict } ifelse
+ 3 index false /resolvestream cvx
+ /.paintform cvx
+ ] cvx /PaintProc exch put
+ execform
+} bdef
+
+/DoPS {
+ true resolvestream cvx exec
+} bdef
+
+drawopdict begin
+ /Do {
+ setfillblend
+ PDFfile fileposition exch
+ dup Page /XObject rget {
+ exch pop dup /Subtype get xobjectprocs exch get
+ % Don't leave extra objects on the stack while executing
+ % the definition of the form.
+ 3 -1 roll 2 .execn
+ } {
+ % This should cause an error, but Acrobat Reader can
+ % continue, so we do too.
+ (%stderr) (w) file
+ dup (****************Undefined XObject resource: ) writestring
+ dup 3 -1 roll write===
+ flushfile
+ } ifelse
+ PDFfile exch setfileposition
+ } bdef
+end
+
+% ---------------- In-line images ---------------- %
+
+% Undo the abbreviations in an in-line image dictionary.
+% Note that we must look inside array values.
+% /I is context-dependent.
+/unabbrevkeydict mark
+ /BPC /BitsPerComponent /CS /ColorSpace /D /Decode /DP /DecodeParms
+ /F /Filter /H /Height /I /Interpolate /IM /ImageMask /W /Width
+.dicttomark readonly def
+/unabbrevvaluedict mark
+ /AHx /ASCIIHexDecode /A85 /ASCII85Decode /CC /CalCMYK
+ /CCF /CCITTFaxDecode /CG /CalGray /CR /CalRGB
+ /DCT /DCTDecode /CMYK /DeviceCMYK /Fl /FlateDecode
+ /G /DeviceGray /RGB /DeviceRGB
+ /I /Indexed /LZW /LZWDecode /RL /RunLengthDecode
+.dicttomark readonly def
+/unabbrevtypedict mark
+ /nametype {
+ //unabbrevvaluedict 1 index .knownget { exch pop } if
+ }
+ /arraytype {
+ dup 0 1 2 index length 1 sub {
+ 2 copy get unabbrevvalue put dup
+ } for pop
+ }
+.dicttomark readonly def
+/unabbrevvalue { % <obj> unabbrevvalue <obj'>
+ oforce //unabbrevtypedict 1 index type .knownget { exec } if
+} bdef
+
+drawopdict begin
+ /BI { mark } bdef
+ /ID {
+ counttomark 2 idiv dup 6 add dict begin {
+ exch //unabbrevkeydict 1 index .knownget { exch pop } if
+ exch unabbrevvalue def
+ } repeat pop
+ /File PDFsource def
+ currentdict makeimagekeys doimage
+ % The Adobe documentation says that the data following ID
+ % consists of "lines", and some PDF files (specifically, some files
+ % produced by PCL2PDF from Visual Software) contain garbage bytes
+ % between the last byte of valid data and an EOL.
+ % Some files (PDFOUT v3.8d by GenText) have EI immediately following
+ % the stream. Some have no EOL and garbage bytes.
+ % Therefore, we skip all bytes before EI or EOL
+ 0
+ { PDFsource read not { //true exit } if
+ dup 10 eq 1 index 13 eq or
+ { pop PDFsource token pop /EI ne exit
+ }
+ if
+ exch 69 eq 1 index 73 eq and { //false exit } if % 'EI'
+ }
+ loop
+ exch pop
+ { /ID cvx /syntaxerror signalerror
+ }
+ if
+ } bdef
+end
+
+% ================================ Text ================================ %
+
+drawopdict begin
+ % Text control
+ /BT { BT } def
+ /ET { ET } def
+ /Tc { Tc } def
+ /TL { TL } def
+ /Tr { Tr } def
+ /Ts { Ts } def
+ /Tw { Tw } def
+ /Tz { Tz } def
+ % Text positioning
+ /Td { Td } def
+ /TD { TD } def
+ /Tm { Tm } def
+ /T* { T* } def
+ % Text painting
+ /Tj { Tj } def
+ /' { ' } def
+ /" { " } def
+ /TJ { TJ } def
+end
+
+% ============================== Annotations ============================== %
+
+
+
+% Get and normalize an annotation's rectangle.
+/annotrect { % <annot> annotrect <x> <y> <w> <h>
+ /Rect get aload pop
+ exch 3 index sub dup 0 lt { dup 5 -1 roll add 4 1 roll neg } if
+ exch 2 index sub dup 0 lt { dup 4 -1 roll add 3 1 roll neg } if
+} bdef
+
+% Set an annotation color.
+/annotsetcolor { % <annot> annotsetcolor -
+ /C knownoget { aload pop setrgbcolor } { 0 setgray } ifelse
+} bdef
+
+% Draw the border. Currently, we ignore requests for beveling, and we
+% don't round the corners of rectangles.
+/strokeborder { % <annot> <width> <dash> strokeborder -
+ 1 index 0 ne { % do not draw if border width is 0
+ gsave
+ 2 index annotsetcolor
+ 0 setdash dup setlinewidth
+ exch annotrect
+ 2 { 4 index sub 4 1 roll } repeat
+ 2 { 4 index 0.5 mul add 4 1 roll } repeat
+ rectstroke pop
+ grestore
+ } {
+ pop pop pop
+ } ifelse
+} bdef
+
+% Draw an annotation border.
+/drawborder { % <annot> drawborder -
+ gsave
+ dup /BS knownoget {
+ dup /W knownoget not { 1 } if
+ [] 2 index /S knownoget {
+ /D eq { 2 index /D knownoget not { [3] } if exch pop } if
+ } if 3 -1 roll pop strokeborder
+ } {
+ dup /Border knownoget {
+ dup 2 get
+ exch dup length 3 gt { 3 get } { pop [] } ifelse
+ strokeborder
+ } {
+ 1 [] strokeborder
+ } ifelse
+ } ifelse
+ grestore
+} bdef
+
+%
+% The PDF annotation F (flags) integer is bit encoded.
+% Bit 1 (LSB) Invisible: 1 --> Do not display if no handler.
+% Note: We have no handlers but we ignore this bit.
+% Bit 2 Hidden: 1 --> Do not display. We will not display if this bit is set.
+% Bit 3 Print: 1 --> Display if printing. We will display if this bit set
+% (and not hidden) and Printed is true
+% Bit 4 NoZoom: 1 --> Do not zoom annotation even if image is zoomed.
+% Bit 5 NoRotate: 1 --> Do not rotate annotation even if image is rotated.
+% Bit 6 NoView: 0 --> Display if this is a 'viewer'. We will display
+% if this bit is not set (and not hidden) and Printed is false
+% Bit 7 Read Only - 1 --> No interaction. We ignore this bit
+%
+/annotvisible { % <annot> annotvisible <visible>
+ /F knownoget not { 0 } if % Get flag value
+ dup 2 and 0 eq % Check hidden flag
+ exch dup 4 and 0 ne Printed and % Check print flag
+ exch 64 and 0 eq Printed not and % Check noview flag
+ or % Combine print and view
+ and % Combine with 'hidden' flag test
+} bdef
+
+/drawwidget { % <scalefactor> <annot> drawwidget -
+ dup /AP knownoget {
+ % Always use the Normal appearance.
+ /N oget
+ % Acrobat Distiller produces files in which this Form
+ % XObject lacks Type and Subtype keys. This is illegal,
+ % but Acrobat Reader accepts it. The only way we can
+ % tell whether this is a Form or a set of sub-appearances
+ % is by testing for the stream Length key.
+ dup /Length known {
+ % If this is a form then simply use it
+ true
+ } {
+ 1 index /AS knownoget not {
+ % If we do not have AS then use any appearance
+ { exch pop oforce exit } forall true
+ } {
+ % Stack: annot Ndict AS
+ % Get the specified appearance. If no appearance, then
+ % display nothing - set stack = false.
+ knownoget
+ } ifelse
+ } ifelse
+
+ % Stack: scale annot appearance true
+ % Stack: scale annot false
+ {
+ % Draw appearance
+ 1 index annotrect pop pop translate
+ 2 index dup scale % Apply scale factor
+ DoForm
+ } if
+ } if pop pop
+} bdef
+
+%
+% For stamp object we have to determine the size of the output rectangle
+% and the size of the BBox for the stamp image. From these we calculate
+% a scale factor for drawing the stamp.
+%
+/calcstampscale { % <annot> calcstampscale scale
+ dup annotrect 4 -2 roll pop pop pop % get x width
+ dup 0 lt { neg } if % get magnitude
+ exch /AP knownoget {
+ /N knownoget {
+ /BBox knownoget {
+ aload pop 4 -2 roll pop pop pop
+ div
+ } {
+ pop 1 % default to unity scaling
+ } ifelse % if we have /BBox
+ } {
+ pop 1
+ } ifelse % if we have /N
+ } {
+ pop 1
+ } ifelse % if we have /AP
+} bdef
+
+/drawlink { % <annot> drawlink -
+ dup drawborder
+ 1 exch drawwidget
+} bdef
+
+% Draw an annotation.
+/drawannottypes mark
+ /Link { drawlink } bind
+ /Stamp { dup calcstampscale exch drawwidget } bind
+.dicttomark readonly def
+/drawannot { % <annot> drawannot -
+ dup annotvisible {
+ gsave
+ dup dup /Subtype get //drawannottypes exch .knownget {
+ exec
+ } {
+ 1 exch drawwidget % Use drawwidget for everything else
+ } ifelse % type known
+ grestore
+ } if pop % annotvisible
+} bdef
+currentdict /drawannottypes undef
+
+end % pdfdict
+end % GS_PDF_ProcSet
+.setglobal
diff --git a/Master/xemtex/gslib/pdf_font.ps b/Master/xemtex/gslib/pdf_font.ps
new file mode 100644
index 00000000000..525ae34866e
--- /dev/null
+++ b/Master/xemtex/gslib/pdf_font.ps
@@ -0,0 +1,1224 @@
+% Copyright (C) 1994-2002 artofcode LLC. All rights reserved.
+%
+% 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.
+
+% $Id: pdf_font.ps,v 1.23.2.6.2.1 2003/04/12 14:02:39 giles Exp $
+% pdf_font.ps
+% PDF font operations.
+
+/.setlanguagelevel where { pop 2 .setlanguagelevel } if
+.currentglobal true .setglobal
+/pdfdict where { pop } { /pdfdict 100 dict def } ifelse
+GS_PDF_ProcSet begin
+pdfdict begin
+
+% We cache the PostScript font in an additional element of the
+% font resource dictionary, called PSFont.
+
+% ---------------- Encodings ---------------- %
+
+% Apply a list of differences to an Encoding.
+% Note that the differences may cause the array to grow.
+/updateencoding { % <encoding> <differences> updateencoding <enc'>
+ % Calculate the length of the result.
+ exch 0 2 index {
+ dup type /nametype ne { exch pop } { pop 1 add } ifelse
+ } forall
+ 1 index length .max array dup 0 4 -1 roll putinterval
+ exch 0 exch {
+ % Stack: enc' code element
+ dup type /nametype ne
+ { exch pop }
+ { 3 copy put pop 1 add }
+ ifelse
+ } forall pop
+} bdef
+
+% Get the Encoding for a font.
+/getencoding % <base-encoding> <font-resource> getencoding <enc>
+ { /Encoding knownoget
+ { dup type /nametype eq
+ {
+ % The published PDF specification says the Encoding name
+ % "must be" one of the 3 predefined Encodings, implying
+ % that an error should occur if it isn't. However, Acrobat
+ % Reader simply ignores unknown names, and since there are
+ % some buggy applications that rely on this, we do the same.
+
+ dup dup dup /MacRomanEncoding eq
+ exch /MacExpertEncoding eq or
+ exch /WinAnsiEncoding eq or
+ { exch pop findencoding
+ }
+ { pop
+ }
+ ifelse
+ }
+ { dup /BaseEncoding knownoget
+ { findencoding 3 -1 roll pop exch
+ }
+ if
+ /Differences knownoget { updateencoding } if
+ }
+ ifelse
+ }
+ if
+ } bdef
+
+% Rename a font with a generated name.
+/renamefont { % <fontdict> renamefont <font'>
+ dup /FontName 2 copy get genfontname dup 5 1 roll put definefont
+} bind def
+
+% Adjust a font according to the Encoding and Widths in the font resource.
+/adjustfont { % <font-resource> <font> adjustfont <font'>
+ getfontencoding
+ getfontmetrics 4 -1 roll pop .updatefont { renamefont } if
+} bind def
+
+% Get the (possibly modified) encoding of a font.
+/getfontencoding { % <font-resource> <font> getfontencoding
+ % <font-resource> <font> <Encoding|null>
+ 1 index /Encoding known {
+ dup /Encoding .knownget { 2 index getencoding } { null } ifelse
+ } {
+ null
+ } ifelse
+} bdef
+
+/find_in_diff % <Differences> <index> find_in_diff <bool>
+{ false exch 0 4 3 roll
+ { dup type /nametype ne { exch pop } { pop 1 add } ifelse
+ 2 copy eq {
+ pop pop pop true 0 0 exit
+ } if
+ } forall
+ pop pop
+} bdef
+
+% Get the metrics of a font, if specified.
+/getfontmetrics { % <font-resource> <font> <Encoding|null> getfontmetrics
+ % <font-resource> <font> <Encoding|null>
+ % <Metrics|null>
+ 2 index /Widths known {
+ dup null eq { pop dup /Encoding get } if
+ 4 dict begin
+ /Encoding exch def
+ /Metrics Encoding length dict def
+ exch
+ dup /Widths oget /Widths exch def
+ % Stack: font font-res
+ % Note that widths are always based on a 1000-unit
+ % character space, but the FontMatrix may specify
+ % some other scale factor. Compensate for this here,
+ % by scaling the Widths if necessary.
+ 0.001 2 index /FontMatrix get 0 get div
+ % Stack: font font-res mscale
+ 1 index /FirstChar oget dup 1 4 index /LastChar oget
+ { % Stack: font font-res mscale first-char index
+ Encoding 1 index get
+ Widths 2 index 4 index sub oget
+ % Stack: font font-res mscale first-char index charname width
+ 4 index mul
+ % The following 'loop' is only context for 'exit'.
+ {
+ % Work around a bug in pdfTeX, which can generate Encoding
+ % vectors containing nulls :
+ 1 index null eq { exit } if
+ % There is a hack here to deal with encodings where the
+ % same character appears more than once, because the Metrics
+ % dictionary works by character name, not by character code.
+ % We prefer to take (1) non-zero width, and (2) width for
+ % the character code which appears in Differences.
+ Metrics 2 index .knownget not { 0 } if 0 ne {
+ 5 index /Encoding knownoget not { exit } if
+ dup type /dicttype ne { pop exit } if
+ /Differences knownoget not { exit } if
+ 3 index //find_in_diff exec not { exit } if
+ } if
+ 2 copy Metrics 3 1 roll put
+ exit
+ } loop
+ pop pop pop
+ }
+ for pop
+ % Now fill in the MissingWidth for any encoded characters
+ % that aren't in Metrics already. Note that built-in
+ % fonts may have Widths/FirstChar/LastChar but no
+ % FontDescriptor, so we must check for this.
+ % Stack: font font-res mscale
+ 1 index /FontDescriptor knownoget {
+ Metrics exch
+ /MissingWidth knownoget { 2 index mul } { 0 } ifelse exch
+ Encoding {
+ % Stack: font font-res mscale missing-width metrics charname
+ % Work around the abovementioned pdfTeX bug.
+ dup null ne {
+ 2 copy known not { 2 copy 4 index put } if pop
+ } {
+ pop
+ } ifelse
+ } forall pop pop pop
+ } {
+ pop
+ } ifelse
+ exch Encoding Metrics end
+ } {
+ null
+ } ifelse
+} bdef
+
+currentdict /find_in_diff undef
+
+% ---------------- Descriptors ---------------- %
+
+% Partial descriptors for the 14 built-in fonts. Note that
+% from PDF 1.1 to PDF 1.2, the meaning of the Flag 6 in the FontDescriptor
+% object has undergone a subtle change in its meaning which has serious
+% consequences for searching with Acrobat:
+% In PDF 1.1, the flag meant: Font has StandardEncoding
+% In PDF 1.2, the flag means: Font has (subset of) StandardRomanCharacterSet
+/standardfontdescriptors mark
+ /Courier mark /Flags 16#23 .dicttomark
+ /Courier-Oblique 1 index
+ /Courier-Bold 1 index
+ /Courier-BoldOblique 1 index
+ /Helvetica mark /Flags 16#20 .dicttomark
+ /Helvetica-Oblique 1 index
+ /Helvetica-Bold 1 index
+ /Helvetica-BoldOblique 1 index
+ /Times-Roman mark /Flags 16#22 .dicttomark
+ /Times-Bold 1 index
+ /Times-Italic mark /Flags 16#62 .dicttomark
+ /Times-BoldItalic 1 index
+ /Symbol mark /Flags 16#4 .dicttomark
+ /ZapfDingbats 1 index
+.dicttomark readonly def
+
+% ---------------- Utilities ---------------- %
+
+/.glyphpath { % <glyphname> <boolean> .glyphpath -
+ % another glyphpath written in addxchar.ps does not work here...
+ currentfont 3 1 roll exch
+ currentfont dup length dict begin
+ { 1 index /Encoding eq { pop [ 3 -1 roll ] def } { def } ifelse } forall
+ currentdict end /.glyphpathfont exch definefont
+ setfont <00> exch charpath setfont
+} bdef
+
+/makeboldfont { % <basefont> <strokewidth> makeboldfont <boldfont>
+ 10 dict begin
+ /strokewidth exch def
+ /basefont exch def
+ /FontMatrix matrix def
+ %/FontName basefont /FontName get def
+ /FontName /.boldfont def
+ /FontType 3 def
+ /Encoding basefont /Encoding get def
+ /FontBBox [ basefont /FontBBox get cvx exec
+ 4 2 roll basefont /FontMatrix get transform
+ 4 2 roll basefont /FontMatrix get transform
+ ] def
+ /BuildGlyph {
+ gsave
+ exch begin
+ basefont setfont
+ strokewidth setlinewidth
+ 1 setlinejoin
+ newpath
+ 0 0 moveto dup false .glyphpath stroke
+ 0 0 moveto glyphshow
+ currentpoint setcharwidth
+ end
+ grestore
+ } bind def
+ currentdict
+ end
+ dup /FontName get exch definefont
+} bind def
+
+% Fabricate a font name by adding ?'s on the end.
+/genfontname % <name> genfontname <name>
+ { dup length string cvs
+ { (?) concatstrings
+ dup cvn FontDirectory exch known not { cvn exit } if
+ }
+ loop
+ } bdef
+
+% Find a font, and adjust its encoding if necessary.
+/.pdfdfndict mark
+ /defaultfontname /Helvetica
+.dicttomark readonly def
+/pdffindfont { % <font-resource> <fontname> pdffindfont <font>
+ % If the font isn't available, synthesize one based on
+ % its descriptor.
+ dup /Font resourcestatus {
+ pop pop findfont
+ } {
+ 1 index /FontDescriptor knownoget {
+ % Stack: font-res fontname fontdesc
+ dup /Flags oget
+ dup 16#40 and -6 bitshift % 1, oblique/italic
+ 1 index 16#40000 and -17 bitshift add % 2, bold
+ exch 16#2 and 2 bitshift add % 8, serif
+ % We should look at the fixed flag, too.
+ % Stack: font-res fontname fontdesc properties
+ 1 index /FontName oget exch
+ % Analyzes font name and extract "Narrow" property
+ % which is not described by the FontDescriptor Flags.
+ 0 2 index .fontnameproperties 4 and or
+ % Rebind the default font name to Helvetica so that
+ % fonts with no properties are handled correctly.
+ //.pdfdfndict begin .substitutefontname end
+ % Stack: font-res fontname fontdesc substname|null
+ Fontmap 1 index known not {
+ % No available good substitution, use the standard one.
+ pop 1 index .substitutefont
+ } if
+ QUIET not {
+ (Substituting font ) print dup =only
+ ( for ) print 2 index =only (.) = flush
+ } if
+ 3 -1 roll pop findfont
+ % Stack: font-res fontdesc font
+ % If this is a small-caps font, replace the CharString
+ % entries for a..z.
+ exch /Flags oget 16#20000 and 0 ne {
+ true .copyfontdict
+ dup /CharStrings 2 copy get dup length dict .copydict
+ 4 index /FirstChar get 97 .max
+ 5 index /LastChar get 122 .min 1 exch {
+ % Stack: font-res font' font' /CharStrings charstrings code
+ % Note that this only remaps a-z, not accented characters.
+ 5 index /Widths oget 1 index 7 index /FirstChar get sub oget
+ 1 string dup 0 5 -1 roll put
+ % Stack: font-res font' font' /CharStrings charstrings code
+ % width (x)
+ 2 index exch dup cvn exch
+ dup 0 2 copy get 32 sub put 4 -1 roll {
+ % Stack: operand (X) width
+ 0 setcharwidth exch pop
+ currentfont /FontMatrix get matrix invertmatrix concat
+ 0.7 dup scale 0 0 moveto show
+ } /exec cvx 4 packedarray cvx put
+ } for put
+ renamefont
+ } if
+ } {
+ % No descriptor available, use the default algorithm.
+ findfont
+ } ifelse
+ } ifelse adjustfont
+} bdef
+/findpdffont { % <font-resource> <fontname> findpdffont <font>
+ {} 3 1 roll % proc fnres fnname
+ [
+ [ (,Bold) { .03 makeboldfont } ]
+ [ (,BoldItalic) { .03 makeboldfont [ 1 0 .3 1 0 0 ] makefont } bind ]
+ [ (,Italic) { [ 1 0 .3 1 0 0 ] makefont } bind ]
+ ] {
+ 1 index dup length string cvs
+ 1 index 0 get tailmatch { % proc fnres fnname []
+ 3 -1 roll pop exch 1 get % proc fnres pre-fnname proc
+ 4 -1 roll pop 3 1 roll % proc fnres pre-fnname
+ exit
+ } { pop pop } ifelse % proc fnres fnname
+ } forall
+ pdffindfont exch exec
+} bdef
+
+% ---------------- Type 1 fonts ---------------- %
+
+/buildType1 % <Type1-font-resource> buildType1 <font>
+ { dup /BaseFont get pdffindfont
+ } bdef
+
+% The state dictionary for the embedded Type 1 font reading procedure
+% has the following keys and values:
+% data - stream (filter)
+% buffer, buffer2 - string
+% hexify - procedure to convert buffer to hex if needed
+% leftstr - string containing (non-negative) integer
+% sectionstr - string containing a character 0 .. 3
+% stream - (stream) dictionary
+% proc - procedure of the form {-dict- type1read}
+% pfbhdr - string containing 16#80 if PFB, 0 otherwise
+% When the procedure is executing, this dictionary is current.
+% leftstr and sectionstr are strings so that we can change their values
+% reliably in case the font executes a restore!
+% We also have to do something special about embedded fonts that
+% execute definefont more than once -- that is the function of topFontDict.
+
+% Read an embedded Type 1 font.
+/readfontfilter { % <proc> readfontfilter <filter>
+ 0 () /SubFileDecode filter
+} bdef
+/readtype1dict 5 dict dup begin
+ /definefont {
+ dup topFontDict eq topFontDict null eq or {
+ dup wcheck not { dup length dict copy } if
+ exch pop savedFontName exch
+ } if
+ //systemdict /definefont get exec
+ } bdef
+ /eexec {
+ % Assume the font dictionary is directly below the file on the stack
+ count 0 gt { /topFontDict 2 index cvlit store } if
+ 55665 /eexecDecode filter
+ //systemdict begin readtype1dictcopy begin cvx stopped
+ currentdict readtype1dictcopy eq { end } if
+ currentdict //systemdict eq { end } if
+ { stop } if
+ } bdef
+end readonly def
+/readtype1 { % <font-resource> <stream-dict> readtype1 <font>
+ % Read the definition, using a procedure-based filter
+ % that turns binary/hex conversion on and off
+ % at the right times.
+ 1 index exch
+ PDFfile fileposition 3 1 roll
+ 11 dict begin
+ /leftstr ( ) 10 string copy def
+ dup /Length1 oget leftstr cvs pop
+ /sectionstr <00> 1 string copy def
+ /pfbhdr <00> 1 string copy def
+ /stream 1 index def
+ true resolvestream /data exch def
+ /buffer 1000 string def % arbitrary
+ /buffer2 buffer length 2.1 div cvi 1 sub string def
+ /hexify /buf2hex load def
+ currentdict end
+ /type1read cvx 2 array astore cvx dup 0 get /proc 2 index put
+ readfontfilter
+ % Some buggy embedded fonts leave extra junk on the stack,
+ % so we have to make a closure that records the stack depth
+ % in a fail-safe way.
+ //systemdict begin
+ % The PDF specification is somewhat muddy about whether
+ % an embedded font's name is supposed to be the BaseFont
+ % from the Font object or the FontName from the descriptor.
+ % Acrobat Distiller requires the former. Save away the
+ % name so we can substitute it at definefont time.
+ //readtype1dict dup length 3 add dict copy begin
+ 1 index /BaseFont oget /savedFontName exch def
+ /topFontDict null def
+ /readtype1dictcopy currentdict def
+ { run } aload pop count 1 sub 2 packedarray cvx exec
+ end end
+ count exch sub { pop } repeat
+ PDFfile 3 -1 roll setfileposition
+ /BaseFont oget findfont
+ adjustfont
+ } bdef
+
+% Execute the appropriate reading procedure.
+/type1read % <dict> type1read <string>
+ { begin leftstr cvi
+ { type1read0 type1read1 type1read2 type1read3 } sectionstr 0 get get exec
+ ( ) leftstr copy cvs pop end
+ } bdef
+
+% Read the next block of data into the buffer.
+/type1readdata % <left> <buffer> type1readdata <substring> <left'>
+ { 0 2 index 2 index length .min getinterval
+ % Adobe requires readstring to signal an error if given
+ % an empty string. Work around this nonsense here.
+ dup length 0 ne { data exch readstring pop } if
+ dup length 3 -1 roll exch sub
+ DEBUG
+ { dup =only ( read ) print
+ 1 index length =only (: ) print
+ 1 index == flush
+ } if
+ } bdef
+
+% Read the initial byte to see if we need to skip a 6 byte PFB header
+/type1read0 { % <left> type1read0 <string> <left'>
+ sectionstr 0 1 put % either way we go to the next stage
+ pfbhdr type1readdata
+ 1 index 0 get 16#80 eq {
+ (\n **** Warning: Embedded Type1 font in PFB format is not valid PDF.)
+ pdfformaterror
+ DEBUG { (skipping PFB header) = flush } if
+ exch pop buffer 0 5 getinterval type1readdata exch
+ dup 4 get 256 mul 1 index 3 get add 256 mul
+ 1 index 2 get add 256 mul 1 index 1 get add
+ DEBUG { (PFB segment length = ) print dup = } if
+ exch pop % discard the string keeping the PFB segment length
+ 2 copy ne {
+ (\n **** Warning: Type 1 PFB segment length and Length 1 value do not match.)
+ pdfformaterror
+ exch % keep the PFB length instead
+ } if
+ pop
+ buffer type1readdata % go ahead and read a block
+ }
+ if % if not PFB, return pfbhdr string (first char of file, usually %).
+} bdef
+
+% Read the next block of the initial text portion.
+/type1read1 { % <left> type1read1 <string> <left'>
+ DEBUG { (read1 ) print } if
+ dup 0 eq {
+ pop sectionstr 0 2 put
+ stream /Length2 oget
+ % Determine whether to hexify data for eexec.
+ dup 8 lt {
+ type1read2 % Hexify.
+ } {
+ DEBUG { (read2 ) print } if
+ pfbhdr 0 get 16#80 eq {
+ % eat 6 more bytes of PFB junk before proceeding
+ DEBUG { (skipping PFB header in segment 2) = flush } if
+ buffer 0 6 getinterval type1readdata exch
+ dup 5 get 256 mul 1 index 4 get add 256 mul
+ 1 index 3 get add 256 mul 1 index 2 get add
+ DEBUG { (PFB segment length = ) print dup = } if
+ exch pop % discard the string keeping the PFB segment length
+ 2 copy ne {
+ (\n **** Warning: Type 1 PFB segment length and Length 2 value do not match.)
+ pdfformaterror
+ dup =
+ exch % keep the PFB length instead
+ } if
+ pop
+ } if
+ buffer2 type1readdata exch
+ % The check doesn't have to be 100% accurate:
+ % hexifying is always OK.
+ dup 0 8 getinterval 0 exch { or } forall
+ 128 ge {
+ /hexify { } store
+ /buffer2 buffer def % We don't need an intermediate buffer.
+ } if hexify exch
+ } ifelse
+ } {
+ buffer type1readdata
+ } ifelse
+} bdef
+
+% Convert a string from binary to hex for eexec.
+% Free variables: buffer.
+/buf2hex { % <string> buf2hex <hexstring>
+ buffer /ASCIIHexEncode filter dup 3 -1 roll writestring closefile
+ buffer (>) search pop exch pop exch pop
+} bdef
+
+% Read the next block of the encrypted portion.
+/type1trailer
+(0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+cleartomark\n)
+readonly def
+/type1read2 { % <left> type1read2 <string> <left'>
+ DEBUG { (read2 ) print } if
+ dup 0 eq
+ { pop sectionstr 0 3 put
+ stream /Length3 oget
+ dup 0 eq
+ { DEBUG { (trailer ) print } if
+ type1trailer exch
+ }
+ {
+ pfbhdr 0 get 16#80 eq {
+ % eat 6 more bytes of PFB junk before proceeding
+ DEBUG { (skipping PFB header in segment 3) = flush } if
+ buffer 0 6 getinterval type1readdata exch
+ dup 5 get 256 mul 1 index 4 get add 256 mul
+ 1 index 3 get add 256 mul 1 index 2 get add
+ DEBUG { (PFB segment length = ) print dup = } if
+ exch pop % discard the string keeping the PFB segment length
+ 2 copy ne {
+ (\n **** Warning: Type 1 PFB segment length and Length 3 value do not match.)
+ pdfformaterror
+ exch % keep the PFB length instead
+ } if
+ pop
+ (\n) pdfformaterror
+ } if
+ type1read3
+ }
+ ifelse
+ }
+ { buffer2 type1readdata exch hexify exch
+ }
+ ifelse
+} bdef
+
+% Read the next block of the final text portion.
+% When finished, this procedure returns an empty string.
+/type1read3 % <left> type1read3 <string> <left'>
+ { DEBUG { (read3 ) print } if
+ buffer type1readdata
+ } bdef
+
+% ---------------- Type 3 fonts ---------------- %
+
+/.notdefEncoding 256 { /.notdef } repeat 256 packedarray def
+
+/buildType3 { % <Type3-font-resource> buildType3 <font>
+ 8 dict begin
+ /FontType 3 def
+ /Resources 1 index /Resources knownoget { oforce } { 0 dict } ifelse def
+ /FontBBox 1 index /FontBBox get cvx def
+ /FontMatrix 1 index /FontMatrix oget def
+ /CharProcs 1 index /CharProcs oget def
+ 1 index /Widths knownoget {
+ /Widths exch def
+ /FirstChar 1 index /FirstChar oget def
+ /LastChar 1 index /LastChar oget def
+ } if
+ /FontName 1 index /Name get genfontname def
+ /Encoding .notdefEncoding 2 index getencoding def
+ % We have to define BuildChar rather than BuildGlyph:
+ % there is no PDF equivalent of glyphshow, and we need
+ % the character code to access the Widths.
+ /BuildChar {
+ % Stack: font charcode
+ 1 index begin 3 dict begin
+ /Font 3 -1 roll def /CharCode 1 index def
+ % Make unknown characters map to /.notdef
+ Encoding exch get dup CharProcs exch known
+ { CharProcs exch oget }
+ { pop CharProcs /.notdef oget }
+ ifelse
+ PDFfile fileposition exch
+ false resolvestream
+ % Stack: filepos stream
+ % Don't let setgcolor set the color inside the BuildGlyph
+ % procedure, because this causes an /undefined error.
+ q null /FillColor gput null /StrokeColor gput
+ Font /Resources get exch pdfopdict .pdfruncontext
+ Q
+ PDFfile exch setfileposition
+ end end
+ } bdef
+ FontName currentdict end definefont exch pop
+} bdef
+/.adjustcharwidth { % <wx> <wy> .adjustcharwidth <wx'> <wy'>
+ /Widths where {
+ begin
+ CharCode FirstChar ge CharCode LastChar le and {
+ exch pop Widths CharCode FirstChar sub get exch
+ } if end
+ } if
+} bdef
+
+% ---------------- TrueType fonts ---------------- %
+
+/TTfonts mark
+ /Arial /Helvetica
+ /Arial,Italic /Helvetica-Oblique
+ /Arial,Bold /Helvetica-Bold
+ /Arial,BoldItalic /Helvetica-BoldOblique
+ /CourierNew /Courier
+ /CourierNew,Bold /Courier-Bold
+ /TimesNewRoman /Times-Roman
+ /TimesNewRoman,Italic /Times-Italic
+ /TimesNewRoman,Bold /Times-Bold
+ /TimesNewRoman,BoldItalic /Times-BoldItalic
+ %
+ /ArialBlack,Italic /Arial-BlackItalic
+ /ArialNarrow,Bold /ArialNarrow-Bold
+ /ArialNarrow,BoldItalic /ArialNarrow-BoldItalic
+ /ArialNarrow,Italic /ArialNarrow-Italic
+ /BookAntiqua,Bold /BookAntiqua-Bold
+ /BookAntiqua,BoldItalic /BookAntiqua-BoldItalic
+ /BookAntiqua,Italic /BookAntiqua-Italic
+ /BookmanOldStyle,Bold /BookmanOldStyle-Bold
+ /BookmanOldStyle,BoldItalic /BookmanOldStyle-BoldItalic
+ /BookmanOldStyle,Italic /BookmanOldStyle-Italic
+ /CenturyGothic,Bold /CenturyGothic-Bold
+ /CenturyGothic,BoldItalic /CenturyGothic-BoldItalic
+ /CenturyGothic,Italic /CenturyGothic-Italic
+ /ComicSansMS,Bold /ComicSansMS-Bold
+ /CourierNew,Bold /CourierNewPS-BoldMT
+ /CourierNew,BoldItalic /CourierNewPS-BoldItalicMT
+ /CourierNew,Italic /CourierNewPS-ItalicMT
+ /FranklinGothicMedium,Italic /FranklinGothic-MediumItalic
+ /Garamond,Bold /Garamond-Bold
+ /Garamond,Italic /Garamond-Italic
+ /Georgia,Bold /Georgia-Bold
+ /Georgia,BoldItalic /Georgia-BoldItalic
+ /Georgia,Italic /Georgia-Italic
+ /Tahoma,Bold /Tahoma-Bold
+ /TrebuchetMS,Bold /TrebuchetMS-Bold
+ /TrebuchetMS,BoldItalic /Trebuchet-BoldItalic
+ /TrebuchetMS,Italic /TrebuchetMS-Italic
+ /Verdana,Bold /Verdana-Bold
+ /Verdana,BoldItalic /Verdana-BoldItalic
+ /Verdana,Italic /Verdana-Italic
+.dicttomark readonly def
+
+/buildTrueType { % <TrueType-font-resource> buildTrueType <font>
+ dup /BaseFont get
+ dup TTfonts exch .knownget {
+ exch pop
+ % Hack required by the PDF specification: if the
+ % font resource has Subtype = /TrueType but the actual
+ % (installed) font is not a TrueType font, ignore the
+ % Encoding in the font resource. However, all current
+ % versions of Acrobat Reader have the 14 base TrueType
+ % fonts built in, so this produces incorrect output for
+ % badly designed PDF files that specify these file names
+ % with /Subtype = /TrueType but no embedded definition.
+ % Compensate for this by removing the /Subtype key when
+ % looking up the font.
+ exch dup length dict copy dup /Subtype null put exch
+ } if
+ pdffindfont % findfont for PDF
+ % disable the auto-bold and auto-italic since it sometimes applies
+ % so an already bold or italic substitute font
+ %findpdffont % findfont and auto-bold and/or auto-italic font for PDF
+} bdef
+
+% Read an embedded TrueType font.
+/readtruetype { % <font-resource> <stream-dict> readtruetype <font>
+ % This is much simpler than readtype1, because we don't
+ % have to deal with the tripartite .PFB format.
+ 1 index exch
+ PDFfile fileposition 3 1 roll
+ true resolvestream readfontfilter
+ % Stack: filepos fontres stream
+ 1 index /Subtype get /CIDFontType2 eq {
+ .loadttcidfont
+ % Stack: filepos fontres cidfont
+ 1 index /CIDToGIDMap knownoget {
+ dup /Identity eq {
+ pop
+ } {
+ true resolvestream
+ % The following doesn't work for CIDToGIDMaps with more
+ % than 32K-1 entries. We'll fix it later if necessary.
+ % Stack: filepos fontres font mapstream
+ dup 2 index /CIDCount oget 2 mul string readstring pop exch closefile
+ exch dup length 5 add dict .copydict
+ dup /FID undef
+ dup /CIDMap 4 -1 roll put
+ dup /CIDFontName get exch /CIDFont defineresource
+ } ifelse
+ } if
+ } {
+ null 2 index getencoding .loadpdfttfont
+ } ifelse
+ exch pop
+ PDFfile 3 -1 roll setfileposition
+ % Ignore both the Encoding and the Widths.
+ exch pop
+} bdef
+
+% ---------------- Type 0 fonts ---------------- %
+
+% Predefine the known CMaps, but only create them on demand.
+/knownCMaps mark
+ /Identity-H { /Identity-H 0 makeIdentityCMap }
+ /Identity-V { /Identity-V 1 makeIdentityCMap }
+.dicttomark def
+
+/makeIdentityCMap { % <cmapname> <wmode> .makeIdentityCMap -
+ .currentglobal true .setglobal 3 1 roll
+ /CIDInit /ProcSet findresource begin
+ 12 dict begin
+ begincmap
+ /WMode exch def
+ /CMapName exch def
+ /CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Identity) def
+ /Supplement 0 def
+ end def
+ %/CMapName (see above)
+ /CMapVersion 1 def
+ /CMapType 1 def
+ %WMode (see above)
+ % The PDF documentation says that these CMaps map CIDs
+ % "1 to 65,536". This is a misprint for 0 to 65,535.
+ 1 begincodespacerange
+ % <0001> <00ff> <0100> <ffff>
+ <0000> <ffff>
+ endcodespacerange
+ 1 begincidrange
+ % <0001> <00ff> 1 <0100> <ffff> 256
+ <0000> <ffff> 0
+ endcidrange
+ endcmap
+ CMapName currentdict /CMap defineresource
+ knownCMaps CMapName 2 index put
+ end % CMap
+ end % CIDInit ProcSet
+ exch .setglobal
+} bdef
+
+/buildType0 { % <Type0-font-resource> buildType0 <font>
+ dup /BaseFont get % FontName
+ 1 index /Encoding oget
+ dup type /nametype eq {
+ dup /CMap resourcestatus {
+ pop pop /CMap findresource
+ } {
+ knownCMaps 1 index .knownget
+ { exch pop exec } { /undefined signalerror } ifelse
+ } ifelse
+ } {
+ PDFfile fileposition exch
+ dup /CMapName get exch true resolvestream cvx exec
+ /CMap findresource
+ exch PDFfile exch setfileposition
+ } ifelse % CMap
+ [
+ 3 index /DescendantFonts oget { exec resourcefont } forall
+ ] % subfonts
+ composefont
+ % Stack: fontres font
+ 1 index /FontMatrix knownoget {
+ dup aload pop true {0 0 1 0 0 1} {3 -1 roll eq and} forall {
+ 1 index exch makefont exch /FontName get exch definefont
+ } {
+ pop
+ } ifelse
+ } if exch pop
+} bdef
+
+% ---------------- CIDFontType0/2 fonts ---------------- %
+
+% Insert metrics into a CIDFont, by saving the PDF W, W2, DW, and DW2
+% arrays and using a (currently very inefficient) CDevProc.
+% For detail, refer "PDF Reference" third edition, p. 337,
+% "5.6.3 CIDFonts" and table "Entries in a CIDFont dictionary".
+
+/.pdfDefaultDW 1000 def
+/.pdfDefaultDW2 [ 880 -1000 ] def
+
+/addCIDmetrics { % <CIDFont-resource> <CIDFont> addCIDmetrics <fontdict>
+ dup length 5 add dict .copydict
+ dup /FID undef
+ dup /UniqueID undef
+ dup /XUID undef
+ % Insert the widths into the font.
+
+ % Stack: pdfresource newfont
+
+ 1 index /DW .knownget {
+ 1 index /DW 3 -1 roll put
+ } {
+ dup /DW .pdfDefaultDW put
+ } ifelse
+
+
+ 1 index /W .knownget {
+ dup 2 index /W 3 -1 roll put
+ .pdfMakeInternalW 1 index /.internalW 3 -1 roll put
+ } if
+
+
+ 1 index /DW2 .knownget {
+ 1 index /DW2 3 -1 roll put
+ } {
+ dup /DW2 .pdfDefaultDW2 put
+ } ifelse
+
+
+ 1 index /W2 .knownget {
+ dup 2 index /W2 3 -1 roll put
+ .pdfMakeInternalW2 1 index /.internalW2 3 -1 roll put
+ } if
+
+
+ dup /CDevProc 1 index /CIDWProc load /exec load 3 packedarray cvx put
+ exch pop
+} bdef
+
+/.pdfMakeInternalMTXArray { % <mtx_array> <item_size> .pdfConvertInternalW <mtx_array'>
+
+ % convert /W or /W2 to internal expression
+ %
+ % mtx_array: original /W or /W2 array
+ % item_size: number of metrics values per CID
+ %
+ % for detail of the metrics list format in PDF,
+ % refer PDF Ref. p.317 "Glyph Metrics in CIDFonts".
+ %
+ % format of single entry in internal expression
+ %
+ % [
+ % [cid_begin cid_end]
+ % value_is_varied (bool)
+ % [ [values for cid_begin...]
+ % [values for cid_begin + 1]
+ % ... ]
+ % ]
+ %
+
+ 7 dict
+ begin
+ /itemSize exch def
+ /M exch def % original /W or /W2
+ /Msize M length def
+ /Mi { M i get } def % W[i]
+ /Mi1 { M i 1 add get } def % W[i + 1]
+ /putMTXEntry <<
+ /arraytype {
+ [
+ [Mi Mi Mi1 length add 1 sub]
+ true
+ [
+ 0 itemSize Mi1 length 1 sub {
+ [ exch 1 1 index itemSize add 1 sub { Mi1 exch get } for ]
+ } for
+ ]
+ ]
+ /i i 2 add def
+ }
+ /integertype {
+ [
+ [Mi Mi1]
+ false
+ [[ i 2 add 1 i 1 add itemSize add { M exch get } for ]]
+ ]
+ /i i 3 add def
+ }
+ >> def
+
+ /i 0 def
+
+ [ { putMTXEntry Mi1 type get exec i Msize ge { exit } if } loop ]
+ end
+} def
+
+/.pdfMakeInternalW { dup length 0 gt { 1 .pdfMakeInternalMTXArray } if } def
+/.pdfMakeInternalW2 { dup length 0 gt { 3 .pdfMakeInternalMTXArray } if } def
+
+/.pdfGetMTXByCID { % <internalMTXArray> <cid>
+ % .pdfGetMTXByCID
+ % { <MTXEntry> true | false }
+
+ % get values for given CID from internal format of /W or /W2
+
+ exch
+ {
+ {
+ dup 0 get {} forall % Stack: <cid> <entry> <cid_0> <cid_1>
+ 3 index lt { pop pop false exit } if
+ 2 index exch sub dup 0 lt { pop pop false exit } if
+ 1 index 1 get not { pop 0 } if
+ exch 2 get exch get true exit
+ } loop
+ { exit } if
+ } forall
+ dup type /arraytype eq { exch pop true } { pop false } ifelse
+} def
+
+
+% Apply the [D]W[2] metrics to a character before displaying.
+/CIDWProc { % <w0x> <w0y> <llx> <lly> <urx> <ury>
+ % <w1x> <w1y> <vx> <vy> <cid> <font> CIDWproc
+ % <w0x'> ... <vy'>
+
+ begin % push <font> to currentdict
+ % <w1x> <w1y> <vx> <vy> won't be used and replaced, discard now
+ 5 1 roll pop pop pop pop
+
+ {
+ currentdict /DW .knownget not { % no DW
+ .pdfDefaultDW exit % replace <w0x> by defaultDW
+ } if
+
+ currentdict /.internalW .knownget not { % no W
+ exit % use already-stacked DW
+ } if
+
+ dup length 0 eq { % W is null array
+ pop % discard unusable W
+ exit % use already-stacked DW
+ } if
+
+ % W is finite array, try to get W_cid
+ 2 index .pdfGetMTXByCID { % got W, discard DW
+ exch pop {} forall
+ exit
+ } if
+
+ exit
+ } loop
+
+ 1000 div % <w0x'> (normalized W)
+ 0 % <w0y'>
+
+ % Stack: <w0x> <w0y> <llx> <lly> <urx> <ury> <cid> <w0x'> <w0y'>
+ 9 -2 roll pop pop % discard <w0x> <w0y>
+ 7 2 roll % put <w0x'> <w0y'>
+
+ % Stack: <w0x'> <w0y'> <llx> <lly> <urx> <ury> <cid>
+ 0 % <w1x'>
+ exch % put <w1x'>
+
+ % Stack: <w0x'> <w0y'> <llx> <lly> <urx> <ury> <w1x'> <cid>
+ {
+ currentdict /DW2 .knownget not { % no DW2, use defaultDW2
+ .pdfDefaultDW2 exit
+ } if
+
+ currentdict /.internalW2 .knownget not { % has DW2, no W2
+ exit % use already-stacked DW2
+ } if
+
+ dup length 0 eq { % W2 is null array
+ pop % discard unusable W2
+ exit % use already-stacked DW2
+ } if
+
+ 2 index .pdfGetMTXByCID { % got W2_cid, discard DW2
+ exch pop
+ exit
+ } if
+
+ % could not get W2_cid
+ exit
+
+ } loop
+
+ exch pop % discard <cid>
+
+
+ % Stack: <w0x'> <w0y'> <llx> <lly> <urx> <ury> <w1x'> { [<vy'> <w1y'>] | [<w1y'> <vx'> <vy'>] }
+ dup length 2 eq { % this is DW2
+ {1000 div} forall exch
+ 4 index 7 index add 2 div % <vx'> = (<urx> + <llx>) / 2
+ exch
+ }{ % assume W2
+ {1000 div} forall
+ } ifelse
+ end % recover currentdict
+
+} def
+
+
+
+%----------------------------------------------------------------
+
+% <string> <match> tailmatch ==> <pre> true
+% ==> <string> false
+/tailmatch {
+ 2 copy length 1 index length .min
+ dup 2 index length exch sub exch getinterval
+ 1 index eq {
+ length 1 index length exch sub
+ 0 exch getinterval true
+ } {
+ pop false
+ } ifelse
+} bind def
+
+/makeboldcidfont {
+ 16 dict begin
+ /strokewidth exch def
+ /basecidfont exch def
+ /FontMatrix [ 1 0 0 1 0 0 ] def
+
+ /CIDFontName /.boldfont def
+ /CIDFontType 1 def
+
+ /basefont-H /.basefont-H /Identity-H [ basecidfont ] composefont def
+ /basefont-V /.basefont-V /Identity-V [ basecidfont ] composefont def
+
+ /CIDSystemInfo dup basecidfont exch get def
+ /FontBBox [ basecidfont /FontBBox get cvx exec
+ 4 2 roll basecidfont /FontMatrix get transform
+ 4 2 roll basecidfont /FontMatrix get transform
+ ] def
+
+ /tmpstr 2 string def
+ /BuildGlyph {
+ gsave
+ exch begin
+ dup 256 idiv tmpstr exch 0 exch put
+ 256 mod tmpstr exch 1 exch put
+ rootfont /WMode known { rootfont /WMode get 1 eq } { false } ifelse
+ { basefont-V } { basefont-H } ifelse setfont
+ strokewidth setlinewidth
+ 1 setlinejoin
+ newpath
+ 0 0 moveto tmpstr false charpath stroke
+ 0 0 moveto tmpstr show
+ currentpoint setcharwidth
+ end
+ grestore
+ } bind def
+
+ currentdict
+ end
+ dup /CIDFontName get exch /CIDFont defineresource
+} bind def
+
+% <CIDFont-resource> <CIDFontName> findCIDFont <CIDFont-resource> <font>
+% CIDFont-resource is not modified.
+/findCIDFont {
+ {
+ dup /CIDFont resourcestatus {
+ pop pop /CIDFont findresource
+ exit
+ } if
+
+ dup dup length string cvs
+ (,Bold) tailmatch {
+ exch pop
+ cvn findCIDFont 0.03 makeboldcidfont
+ exit
+ } if
+ (,Italic) tailmatch {
+ exch pop
+ cvn findCIDFont
+ [ 1 0 0.3 1 0 0 ] makefont
+ exit
+ } if
+ (,BoldItalic) tailmatch {
+ exch pop
+ cvn findCIDFont 0.03 makeboldcidfont
+ [ 1 0 0.3 1 0 0 ] makefont
+ exit
+ } if
+ pop
+
+ 1 index /CIDSystemInfo get begin Registry (-) Ordering end
+ concatstrings concatstrings
+ cvn
+ QUIET not {
+ (Substituting ) print dup ==only
+ ( for ) print 1 index ==only (.\n) print
+ } if
+ exch pop
+ /CIDFont findresource
+ exit
+ } loop
+} bdef
+
+/buildCIDType0 { % <CIDFontType0-font-resource> buildCIDType0 <font>
+ dup /BaseFont get exch 1 index findCIDFont
+ addCIDmetrics /CIDFont defineresource
+} bdef
+
+/buildCIDType2 { % <CIDFontType2-font-resource> buildCIDType2 <font>
+ dup /BaseFont get exch 1 index findCIDFont
+ addCIDmetrics /CIDFont defineresource
+} bdef
+
+% ---------------- Other embedded fonts ---------------- %
+
+/fontloadprocs mark
+ /Type1C /readType1C cvx
+ /CIDFontType0C /readCIDFontType0C cvx
+.dicttomark readonly def
+
+% Read an embedded compressed font.
+/readType1C { % <font-resource> <stream-dict> readType1C <font>
+ 1 index exch
+ PDFfile fileposition 3 1 roll
+ dup true resolvestream dup readfontfilter
+ % Stack: pos resource streamdict stream filter
+ 3 index /FontDescriptor oget /FontName oget
+ 1 index FRD
+ closefile closefile pop
+ PDFfile 3 -1 roll setfileposition
+ /FontDescriptor oget /FontName oget findfont
+ adjustfont
+} bdef
+
+% Read an embedded CFF CIDFont.
+/readCIDFontType0C { % <font-resource> <stream-dict> readCIDFontType0C <font>
+ PDFfile fileposition 3 1 roll
+ dup true resolvestream dup readfontfilter
+ % Stack: pos resource streamdict stream filter
+ 3 index /FontDescriptor oget /FontName oget
+ 1 index FRD
+ closefile closefile pop
+ PDFfile 3 -1 roll setfileposition
+ % Some broken Adobe software produces PDF files in which
+ % the FontName of the CFF font and the FontName in the
+ % FontDescriptor don't match the BaseFont in the font.
+ % Use the FontName, rather than the BaseFont, here.
+ dup /FontDescriptor oget /FontName oget /CIDFont findresource
+ addCIDmetrics dup /CIDFontName get exch /CIDFont defineresource
+} bdef
+
+% ---------------- Font lookup ---------------- %
+
+/fonttypeprocs mark % <font-resource> -proc- <font>
+ /Type0 /buildType0 cvx
+ /Type1 /buildType1 cvx
+ /MMType1 1 index
+ /Type3 /buildType3 cvx
+ /TrueType /buildTrueType cvx
+ /CIDFontType0 /buildCIDType0 cvx
+ /CIDFontType2 /buildCIDType2 cvx
+.dicttomark readonly def
+
+/resourcefont % <font-resource> resourcefont <font>
+ { dup /PSFont .knownget
+ { /FID .knownget { type /fonttype eq } { false } ifelse }
+ { false }
+ ifelse
+ { /PSFont get
+ }
+ { dup dup /FontDescriptor knownoget
+ { % Stack: font-res font-res font-desc
+ dup /FontFile knownoget
+ { exch pop readtype1 true }
+ { dup /FontFile2 knownoget
+ { exch pop readtruetype true }
+ { /FontFile3 knownoget
+ { dup /Subtype get fontloadprocs exch get exec true }
+ { false }
+ ifelse
+ }
+ ifelse
+ }
+ ifelse
+ }
+ { false }
+ ifelse
+ % Stack: font-res font-res false
+ % -or-: font-res font true
+ not
+ { dup /Subtype get fonttypeprocs exch get exec }
+ if
+ 2 copy /PSFont exch put
+ exch pop
+ }
+ ifelse
+ } bdef
+
+drawopdict begin
+ /d0 {
+ .adjustcharwidth setcharwidth
+ } bdef
+ /d1 {
+ 6 -2 roll .adjustcharwidth 6 2 roll setcachedevice
+ } bdef
+ /Tf {
+ 1 index Page /Font rget not { 1 index /invalidfont signalerror } if
+ resourcefont exch Tf pop
+ } bdef
+end
+
+end % pdfdict
+end % GS_PDF_ProcSet
+.setglobal
diff --git a/Master/xemtex/gslib/pdf_main.ps b/Master/xemtex/gslib/pdf_main.ps
new file mode 100644
index 00000000000..fd87aa5c99d
--- /dev/null
+++ b/Master/xemtex/gslib/pdf_main.ps
@@ -0,0 +1,813 @@
+% Copyright (C) 1994, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: pdf_main.ps,v 1.35.2.7.2.3 2003/04/12 14:02:39 giles Exp $
+% pdf_main.ps
+% PDF file- and page-level operations.
+
+/.setlanguagelevel where { pop 2 .setlanguagelevel } if
+.currentglobal true .setglobal
+/pdfdict where { pop } { /pdfdict 100 dict def } ifelse
+pdfdict begin
+
+% Patch in an obsolete variable used by some third-party software.
+/#? false def
+
+% Test whether the current output device handles pdfmark.
+/.writepdfmarkdict 1 dict dup /pdfmark null put readonly def
+/.writepdfmarks { % - .writepdfmarks <bool>
+ currentdevice //.writepdfmarkdict .getdeviceparams
+ mark eq { false } { pop pop true } ifelse
+ systemdict /DOPDFMARKS known or
+} bind def
+
+% For simplicity, we use a single interpretation dictionary for all
+% PDF graphics execution, even though this is too liberal.
+/pdfopdict mark
+ objopdict { } forall
+ drawopdict { } forall
+ /endstream { exit } bind
+ (%%EOF) cvn { exit } bind % for filters
+ % PDF 1.1 operators
+ /BX { /BXlevel BXlevel 1 add store } bind
+ /EX { /BXlevel BXlevel 1 sub store } bind
+ /PS { cvx exec } bind
+ % PDF 1.2 operators
+ /BMC { pop } bind
+ /BDC { pop pop } bind
+ /EMC { }
+ /MP { pop } bind
+ /DP { pop pop } bind
+.dicttomark readonly def
+
+% ======================== Main program ======================== %
+
+end % pdfdict
+userdict begin
+
+/defaultfontname /Times-Roman def
+
+% Make sure the registered encodings are loaded, so we don't run the risk
+% that some of the indices for their names will overflow the packed
+% representation. (Yes, this is a hack.)
+SymbolEncoding pop
+DingbatsEncoding pop
+
+% Redefine 'run' so it recognizes PDF files.
+systemdict begin
+/.runps /run load def
+/run {
+ dup type /filetype ne { (r) file } if
+ dup ( ) .peekstring {
+ (%) eq {
+ dup ( ) .peekstring {
+ (%PDF-) eq {
+ dup (%stdin) (r) file eq {
+ % Copy PDF from stdin to temporary file then run it.
+ null (w+) //systemdict /.tempfile get exec exch 3 1 roll
+ % stack: tempname stdin tempfile
+ 1024 string
+ {
+ % stack: tempname stdin tempfile string
+ 2 index 1 index readstring
+ exch 3 index exch writestring
+ not { exit } if
+ }
+ loop
+ pop exch closefile
+ % stack: tempname tempfile
+ dup 0 setfileposition
+ dup runpdf
+ closefile deletefile
+ } {
+ runpdf
+ } ifelse
+ } {
+ cvx .runps % doesn't start with %PDF-
+ } ifelse
+ } {
+ pop cvx .runps % didn't read 5 characters
+ } ifelse
+ } {
+ cvx .runps % didn't start with %
+ } ifelse
+ } {
+ pop closefile % file was empty
+ } ifelse
+} bind odef
+currentdict /runpdfstring .undef
+
+/runpdf { % <file> runpdf -
+ userdict begin
+ % It turns out that the PDF interpreter uses memory more
+ % effectively if it is run under at least one level of save.
+ % This is counter-intuitive, and we don't understand why it happens,
+ % but the improvement is significant.
+ /PDFTopSave save def
+ /Page# null def
+ /Page null def
+ /DSCPageCount 0 def
+ /PDFSave null def
+ GS_PDF_ProcSet begin
+ pdfdict begin
+ pdfopen begin
+ Trailer /Root oget /Pages oget /CropBox knownoget
+ { mark /CropBox 3 -1 roll /PAGES pdfmark
+ }
+ if
+ /FirstPage where
+ { pop FirstPage dup pdfpagecount gt
+ { (\nRequested FirstPage is greater than the number of pages in the file: ) print
+ pdfpagecount = flush
+ } if
+ } {
+ 1
+ } ifelse
+ 1
+ /LastPage where { pop LastPage pdfpagecount .min } { pdfpagecount } ifelse
+ 2 index 1 index gt
+ { ( No pages will be processed \(FirstPage > LastPage\).) = flush }
+ { QUIET not
+ { (Processing pages ) print 2 index =only ( through ) print dup =only
+ (.) = flush
+ }
+ if
+ }
+ ifelse
+ { dup /Page# exch store
+ QUIET not { (Page ) print dup == flush } if
+ pdfgetpage pdfshowpage
+ } for
+ currentdict pdfclose
+ end % temporary dict
+ end % pdfdict
+ end % userdict
+ end % GS_PDF_ProcSet
+ PDFTopSave restore
+} bind def
+end % systemdict
+% Redefine the procedure that the C code uses for running piped input.
+% It is OK to use { (%stdin) run } here, because a startjob cannot occur.
+/.runstdin {
+ { (%stdin) run } execute0
+} bind def
+
+end % userdict
+pdfdict begin
+
+% ======================== File parsing ======================== %
+
+% Read the cross-reference and trailer sections.
+
+/traileropdict mark
+ (<<) cvn { mark } bind
+ (>>) cvn /.dicttomark load
+ ([) cvn { mark } bind % ditto
+ (]) cvn dup load
+% /true true % see .pdfexectoken in pdf_base.ps
+% /false false % ibid.
+% /null null % ibid.
+ /R { /resolveR cvx 3 packedarray cvx } bind % see Objects below
+ /startxref /exit load
+.dicttomark readonly def
+
+% Because of EOL conversion, lines with fixed contents might be followed
+% by one or more blanks.
+/lineeq % <filestr> <conststr> lineeq <bool>
+ { anchorsearch
+ { pop { ( ) anchorsearch not { () eq exit } if pop } loop }
+ { pop false }
+ ifelse
+ } bind def
+/linene { lineeq not } bind def
+
+% Read (mostly scan) the cross-reference table.
+/readxref % <pos> readxref <trailerdict>
+ { PDFoffset add PDFfile exch setfileposition
+ % In some PDF files, this position actually points to
+ % white space before the xref line. Skip over this here.
+ { PDFfile fileposition PDFfile read pop 32 gt { exit } if pop
+ } loop
+ PDFfile exch setfileposition
+ % The PDF specification says that the 'xref' must be on a line
+ % by itself. The code here formerly used readline and linene to
+ % check this. However, Acrobat Reader only requires the line to
+ % begin with 'xref', and there are enough applications producing
+ % non-compliant PDF files that we have to do this too.
+ PDFfile pdfstring 0 4 getinterval readstring pop
+ (xref) ne { /readxref cvx /syntaxerror signalerror } if
+ % Store the xref table entry position for each object.
+ % We only need to read the run headers, not every entry.
+ { PDFfile token pop % first object # or trailer
+ dup /trailer eq { pop exit } if
+ PDFfile pdfstring readline pop
+ token pop % entry count
+ exch pop exch
+ % This section might be adding new objects:
+ % ensure that Objects and Generations are big enough.
+ % Stack: count obj#
+ 2 copy add growPDFobjects
+ PDFfile fileposition 3 -1 roll
+ { Objects 2 index lget null eq % later update might have set it
+ { Objects 2 index 2 index cvx lput }
+ if exch 1 add exch 20 add
+ }
+ repeat PDFfile exch setfileposition pop
+ } loop
+ count /pdfemptycount exch def
+ PDFfile traileropdict .pdfrun
+ } bind def
+
+% Open a PDF file and read the header, trailer, and cross-reference.
+/pdfopen { % <file> pdfopen <dict>
+ pdfopenfile begin
+ pdfopencache
+ .writepdfmarks {
+ % Copy bookmarks (outline) to the output.
+ Trailer /Root oget /Outlines knownoget {
+ /First knownoget {
+ { dup writeoutline /Next knownoget not { exit } if } loop
+ } if
+ } if
+ } if % end .writepdfmarks
+ currentdict end
+} bind def
+/pdfopencache { % - pdfopencache -
+ % Create and initialize some caches.
+ /PageCount pdfpagecount def
+ /PageNumbers PageCount 65534 .min dict def
+ /PageIndex PageCount 65534 .min array def
+} bind def
+/pdfopenfile { % <file> pdfopenfile <dict>
+ pdfdict readonly pop % can't do it any earlier than this
+ 15 dict begin
+ /LocalResources 0 dict def
+ /DefaultMatrix null def % establish binding
+ /Printed where { pop } {
+ % Guess whether the output device is a printer.
+ /Printed currentpagedevice /OutputFile known def
+ } ifelse
+ /PSLevel1 where { pop } { /PSLevel1 false def } ifelse
+ cvlit /PDFfile exch def
+ /PDFsource PDFfile def
+ /Repaired false def
+ PDFfile dup 0 setfileposition pdfstring readstring
+ not {/pdfopen cvx /syntaxerror signalerror} if
+ (%PDF-) search not {/pdfopen cvx /syntaxerror signalerror} if
+ length /PDFoffset exch def pop cvr /PDFversion exch def
+ findxref
+ initPDFobjects
+ % Read the last cross-reference table.
+ readxref /Trailer exch def
+ Trailer /Encrypt known
+ { pdf_process_Encrypt % signal error
+ }
+ if
+ % Read any previous cross-reference tables.
+ Trailer { /Prev .knownget not { exit } if readxref } loop
+ Repaired { printrepaired } if
+ currentdict end
+ } bind def
+
+% Skip backward over the %%EOF at the end of the PDF file, and read
+% the preceding startxref line. The PDF specification unambiguously
+% requires that the %%EOF appear on a line by itself, and that the
+% startxref and the following position value appear on separate lines;
+% however, some applications (including, apparently, Acrobat Distiller
+% on the Macintosh) may add up to 2K of garbage after the %%EOF, and some
+% other applications also truncate the %%EOF to %%EO, and/or put the
+% startxref and the following value on the same line.
+% A file reported from Distiller 3.02b for AIX 4.1.1 has 2076 bytes
+% of garbage. The tolerance is increased to 4K to cover future
+% applications and bigger allocation units.
+/findxref { % - findxref <xrefpos>
+ PDFfile dup dup 0 setfileposition bytesavailable
+ dup /PDFfilelen exch def
+ % Find the last %%EOF string (within 4096 bytes)
+ 4096 sub PDFoffset .max
+ 2 copy setfileposition
+ PDFfilelen exch sub string 1 index exch readstring pop {
+ (\015%%EO) search { % Adobe can handle truncated key string
+ pop pop % if found, keep searching 'post' string
+ } {
+ (\012%%EO) search
+ { pop pop } { exit } ifelse % exit if neither string found
+ } ifelse
+ } loop
+ PDFfilelen exch length sub 4 sub PDFoffset .max exch 1 index setfileposition
+ % Stack: eofpos
+ % Check for whether this is, in fact, a valid PDF file.
+ dup PDFfilelen exch sub dup dup 7 gt exch 6 lt or {
+ pop true
+ } {
+ string PDFfile exch readstring pop
+ dup (%%EOF\n) eq exch dup (%%EOF\r) eq
+ exch (%%EOF\r\n) eq or or not
+ } ifelse {
+ (
+ **** This file has a corrupted %%EOF marker, or garbage after the %%EOF.
+) pdfformaterror
+ } if
+ PDFfile exch setfileposition
+ % Now read the startxref and xref start position.
+ prevline token not { null } if dup type /integertype eq {
+ exch pop cvi % xref start position
+ exch PDFfile exch setfileposition
+ prevline (startxref) linene { /findxref cvx /syntaxerror signalerror } if
+ pop
+ } { % else, this file has 'startxref #####' format
+ (startxref) ne { /findxref cvx /syntaxerror signalerror } if
+ cvi % xref start position
+ (
+ **** The format of the startxref line in this file is invalid.
+) pdfformaterror
+ exch PDFfile exch setfileposition
+ } ifelse
+} bind def
+/stderrfile (%stderr) (w) file def
+/stderrprint { % <string> stderrprint -
+ //stderrfile dup 3 -1 roll writestring flushfile
+} bind def
+/pdfformaterror { % <string> pdfformaterror -
+ stderrprint
+ /Repaired true store
+} bind def
+/printrepaired {
+ Trailer /Info knownoget {
+ /Producer knownoget not { null } if
+ } {
+ null
+ } ifelse
+ dup null eq {
+ pop (\
+ **** Please notify the author of the software that produced this file
+)
+ } {
+ ( **** The file was produced by ) stderrprint
+ % Handle a Unicode Producer.
+ (\376\377) anchorsearch {
+ pop dup length 2 idiv string 0 1 2 index length 1 sub {
+ % Stack: origstr newstr i
+ 1 index exch 3 index 1 index 2 mul 1 add get put
+ } for exch pop
+ } if
+ stderrprint
+ (:
+ **** please notify the author of this software
+)
+ } ifelse stderrprint
+(\
+ **** that the file does not conform to Adobe's published PDF
+ **** specification. Processing of the file will continue normally.
+
+) stderrprint
+} bind def
+
+% Write the outline structure for a file. Uses linkdest (below).
+/writeoutline % <outlinedict> writeoutline -
+ { mark
+ 0 2 index /First knownoget
+ { { exch 1 add exch /Next knownoget not { exit } if } loop }
+ if
+ % stack: dict mark count
+ dup 0 eq
+ { pop 1 index
+ }
+ { 2 index /Count knownoget { 0 lt { neg } if } if
+ /Count exch 3 index
+ }
+ ifelse linkdest /Title oget /Title exch /OUT pdfmark
+ /First knownoget
+ { { dup writeoutline /Next knownoget not { exit } if } loop }
+ if
+ } bind def
+
+% Close a PDF file.
+/pdfclose % <dict> pdfclose -
+ { begin
+ PDFfile closefile
+ end
+ } bind def
+
+% ======================== Page accessing ======================== %
+
+% Get a (possibly inherited) attribute of a page.
+/pget % <pagedict> <key> pget <value> -true-
+ % <pagedict> <key> pget -false-
+ { 2 copy knownoget
+ { exch pop exch pop true
+ }
+ { exch /Parent knownoget
+ { exch pget }
+ { pop false }
+ ifelse
+ }
+ ifelse
+ } bind def
+
+% Get the value of a resource on a given page.
+/rget { % <resname> <pagedict> <restype> rget <value> -true-
+ % <resname> <pagedict> <restype> rget -false-
+ LocalResources 1 index knownoget {
+ 3 index knownoget
+ } {
+ false
+ } ifelse {
+ exch pop exch pop exch pop true
+ } {
+ exch /Resources pget {
+ exch knownoget { exch knownoget } { pop false } ifelse
+ } {
+ pop pop false
+ } ifelse
+ } ifelse
+} bind def
+
+% Get the total number of pages in the document.
+/pdfpagecount % - pdfpagecount <int>
+ { Trailer /Root oget /Pages oget /Count oget
+ } bind def
+
+% Find the N'th page of the document by iterating through the Pages tree.
+% The first page is numbered 1.
+/pdffindpageref { % <int> pdffindpage <objref>
+ dup Trailer /Root oget /Pages get
+ { % We should be able to tell when we reach a leaf
+ % by finding a Type unequal to /Pages. Unfortunately,
+ % some files distributed by Adobe lack the Type key
+ % in some of the Pages nodes! Instead, we check for Kids.
+ dup oforce /Kids knownoget not { exit } if
+ exch pop null
+ 0 1 3 index length 1 sub {
+ 2 index exch get
+ dup oforce dup /Kids known { /Count oget } { pop 1 } ifelse
+ % Stack: index kids null noderef count
+ dup 5 index ge { pop exch pop exit } if
+ 5 -1 roll exch sub 4 1 roll pop
+ } for exch pop
+ % Stack: index null|noderef
+ dup null eq { pop pop 1 null exit } if
+ } loop
+ % Stack: index countleft noderef
+ 1 index 1 ne { pop pop /pdffindpage cvx /rangecheck signalerror } if
+ exch pop
+ PageIndex 2 index 1 sub 65533 .min 2 index oforce put
+ PageNumbers 1 index oforce 3 index dup 65534 le
+ { put }
+ { pop pop pop } % don't store more than 65534 pagenumbers
+ ifelse
+ exch pop
+} bind def
+/pdffindpage { % <int> pdffindpage <pagedict>
+ pdffindpageref oforce
+} bind def
+
+% Find the N'th page of the document.
+% The first page is numbered 1.
+/pdfgetpage % <int> pdfgetpage <pagedict>
+ { PageIndex 1 index 1 sub dup 65533 lt
+ { get }
+ { pop pop null }
+ ifelse
+ dup null ne
+ { exch pop oforce }
+ { pop pdffindpage }
+ ifelse
+ } bind def
+
+% Find the page number of a page object (inverse of pdfgetpage).
+/pdfpagenumber % <pagedict> pdfpagenumber <int>
+ { % We use the simplest and stupidest of all possible algorithms....
+ PageNumbers 1 index .knownget
+ { exch pop
+ }
+ { 1 1 PageCount 1 add % will give a rangecheck if not found
+ { dup pdfgetpage oforce 2 index eq { exit } if pop
+ }
+ for exch pop
+ }
+ ifelse
+ } bind def
+
+% Display a given page.
+/boxrect % [<llx> <lly> <urx> <ury>] boxrect <x> <y> <w> <h>
+ { aload pop exch 3 index sub exch 2 index sub
+ } bind def
+/resolvedest { % <name|string|other> resolvedest <other|null>
+ dup type /nametype eq {
+ Trailer /Root oget /Dests knownoget {
+ exch knownoget not { null } if
+ } {
+ null
+ } ifelse
+ } {
+ dup type /stringtype eq {
+ Trailer /Root oget /Names knownoget {
+ /Dests knownoget {
+ exch nameoget
+ } {
+ pop null
+ } ifelse
+ } {
+ pop null
+ } ifelse
+ } if
+ } ifelse
+} bind def
+/linkdest { % <link|outline> linkdest
+ % ([/Page <n>] /View <view> | ) <link|outline>
+ dup /Dest knownoget
+ { resolvedest
+ dup type /dicttype eq { /D knownoget not { null } if } if
+ dup null eq
+ { pop }
+ { dup 0 oget
+ dup null eq
+ { pop }
+ { dup type /integertype ne { pdfpagenumber } if
+ /Page exch 4 -2 roll
+ }
+ ifelse
+ dup length 1 sub 1 exch getinterval /View exch 3 -1 roll
+ }
+ ifelse
+ }
+ if
+} bind def
+% <pagedict> mark ... -proc- -
+/namedactions 8 dict dup begin
+ /FirstPage {
+ /Page 1 3 -1 roll
+ } def
+ /LastPage {
+ counttomark 2 add index pdfpagecount /Page exch 3 -1 roll
+ } def
+ /NextPage {
+ counttomark 2 add index pdfpagenumber 1 add /Page exch 3 -1 roll
+ } def
+ /PrevPage {
+ counttomark 2 add index pdfpagenumber 1 sub /Page exch 3 -1 roll
+ } def
+end readonly def
+% <pagedict> <annotdict> -proc- -
+/annottypes 5 dict dup begin
+ /Text {
+ mark exch
+ { /Rect /Open /Contents }
+ { 2 copy knownoget { 3 -1 roll } { pop } ifelse }
+ forall pop /ANN pdfmark
+ } bind def
+ /Link {
+ mark exch
+ dup /C knownoget { /Color exch 3 -1 roll } if
+ { /Rect /Border }
+ { 2 copy knownoget { 3 -1 roll } { pop } ifelse }
+ forall dup /A knownoget {
+ dup /URI known {
+ /A mark 3 2 roll % <<>> /A [ <<action>>
+ { oforce } forall
+ .dicttomark
+ 3 2 roll
+ } {
+ dup /D knownoget {
+ exch pop exch dup length dict copy dup /Dest 4 -1 roll put
+ } {
+ /N knownoget { % Assume /S /Named
+ namedactions exch .knownget { exec } if
+ } if
+ } ifelse
+ } ifelse
+ } if
+ linkdest pop /LNK pdfmark
+ } bind def
+end readonly def
+
+/pdfshowpage % <pagedict> pdfshowpage -
+ { dup /Page exch store
+ pdfshowpage_init
+ pdfshowpage_setpage
+ pdfshowpage_finish
+ } bind def
+
+/pdfpagecontents % <pagedict> pdfpagecontents <contents>
+ { } bind def
+
+/pdfshowpage_init % <pagedict> pdfshowpage_init <pagedict>
+ { /DSCPageCount DSCPageCount 1 add store
+ } bind def
+
+/.pdfshowpage_Install { % <pagedict> [<prevproc>] .pdfshowpage_Install -
+ exch
+ % We would like to clip to the CropBox here, but the subsequent
+ % initgraphics would override it. Instead, we have to handle it
+ % in graphicsbeginpage.
+ dup /CropBox pget dup {exch pop} if systemdict /UseCropBox known and {
+ dup /CropBox pget pop dup 0 get neg exch 1 get neg translate
+ } {
+ dup /MediaBox pget {
+ dup 0 get neg exch 1 get neg translate
+ } if
+ } ifelse
+ pop 0 get exec
+} bind def
+
+/pdfshowpage_setpage { % <pagedict> pdfshowpage_setpage <pagedict>
+ 4 dict begin % for setpagedevice
+ % Stack: pagedict
+ currentpagedevice /Orientation 2 index /Rotate pget not { 0 } if 90 idiv
+ % Rotate specifies *clockwise* rotation!
+ neg 3 and def
+ % Stack: pagedict currentpagedict
+ 1 index /CropBox pget dup {exch pop} if systemdict /UseCropBox known and {
+ % Set the page size.
+ 1 index /CropBox pget pop
+ boxrect 2 array astore /PageSize exch def pop pop
+ } {
+ 1 index /MediaBox pget {
+ % Set the page size.
+ boxrect 2 array astore /PageSize exch def pop pop
+ } if
+ } ifelse
+ dup /Install .knownget {
+ % Don't let the Install procedure get more deeply
+ % nested after every page.
+ dup type dup /arraytype eq exch /packedarraytype eq or {
+ dup length 4 eq {
+ dup 2 get /.pdfshowpage_Install load eq {
+ 1 get 0 get % previous procedure
+ } if
+ } if
+ } if
+ } {
+ { }
+ } ifelse 1 array astore
+ 2 index exch /.pdfshowpage_Install load /exec load
+ 4 packedarray cvx
+ % Stack: pagedict currentpagedict installproc
+ /Install exch def
+ % Stack: pagedict currentpagedict
+ pop currentdict end setpagedevice
+} bind def
+
+/pdfshowpage_finish { % <pagedict> pdfshowpage_finish -
+ save /PDFSave exch store
+ (before exec) VMDEBUG
+
+ .writepdfmarks {
+
+ % Copy the crop box.
+ dup /CropBox knownoget {
+ % If the page has been rotated, rotate the CropBox.
+ mark /CropBox 3 -1 roll
+ 3 index /Rotate pget {
+ 90 idiv 1 and 0 ne {
+ aload pop 4 -2 roll exch 4 2 roll exch 4 array astore
+ } if
+ } if
+ /PAGE pdfmark
+ } if
+
+ % Copy annotations and links.
+ dup /Annots knownoget {
+ 0 1 2 index length 1 sub
+ { 1 index exch oget
+ dup /Subtype oget annottypes exch .knownget { exec } { pop } ifelse
+ }
+ for pop
+ } if
+
+ } if % end .writepdfmarks
+
+ % Display the actual page contents.
+ 6 dict begin
+ /BXlevel 0 def
+ /BGDefault currentblackgeneration def
+ /UCRDefault currentundercolorremoval def
+ %****** DOESN'T HANDLE COLOR TRANSFER YET ******
+ /TRDefault currenttransfer def
+ matrix currentmatrix 2 dict
+ 2 index /CropBox knownoget {
+ boxrect 4 array astore 1 index /ClipRect 3 -1 roll put
+ } if
+ dictbeginpage /DefaultMatrix 1 index store setmatrix
+ dup % for showing annotations below
+ count /pdfemptycount exch store
+ gsave
+ % If the page uses any transparency features, show it within
+ % a transparency group.
+ PDFversion 1.4 lt {
+ showpagecontents
+ } {
+ dup pageusestransparency {
+ % Show the page within a PDF 1.4 device filter.
+ 0 .pushpdf14devicefilter {
+ % If the page has a Group, enclose contents in transparency group.
+ % (Adobe Tech Note 5407, sec 9.2)
+ dup /Group knownoget {
+ 1 index /CropBox knownoget not {
+ 1 index /MediaBox oget
+ } if .beginformgroup {
+ showpagecontents
+ } .internalstopped {
+ .discardtransparencygroup stop
+ } if .endtransparencygroup
+ } {
+ showpagecontents
+ } ifelse
+ } .internalstopped {
+ % todo: discard
+ .popdevicefilter stop
+ } if .popdevicefilter
+ } {
+ showpagecontents
+ } ifelse
+ } ifelse
+ grestore
+ % todo: mixing drawing ops outside the device filter could cause
+ % problems, for example with the pnga device.
+ /Annots knownoget { { oforce drawannot } forall } if
+ endpage
+ end % scratch dict
+ (after exec) VMDEBUG
+ PDFSave restore
+} bind def
+/showpagecontents { % <pagedict> showpagecontents -
+ /Contents knownoget not { 0 array } if
+ dup type /arraytype ne { 1 array astore } if {
+ oforce false resolvestream pdfopdict .pdfrun
+ } forall
+} bind def
+/processcolorspace { % - processcolorspace <colorspace>
+ % The following is per the PLRM3.
+ currentdevice 1 dict dup /ProcessColorModel dup put .getdeviceparams
+ exch pop exch pop
+ dup type /nametype ne { cvn } if
+ dup { setcolorspace } .internalstopped { pop /DeviceRGB } if
+} bind def
+
+% ------ Transparency support ------ %
+
+% Determine whether a page might invoke any transparency features:
+% - Group in the page dictionary
+% - Non-default ca, CA, or SMask in an ExtGState
+% - Form XObject with Group
+% - Image XObject with SMask
+% ****** DO WE NEED TO LOOK IN RESOURCE DICTS OF OTHER CONTENT STREAMS? ******
+/pageusestransparency { % <pagedict> pageusestransparency <bool>
+ PDFversion 1.4 lt {
+ pop false
+ } {
+ dup /Group known {
+ pop true
+ } {
+ false exch {
+ dup resourceusestransparency { pop not exit } if
+ /Parent knownoget not { exit } if
+ } loop
+ } ifelse
+ } ifelse
+} bind def
+% Check the Resources of a page or Form.
+/resourceusestransparency { % <dict> resourceusestransparency <bool>
+ { % Use loop to provide an exitable context.
+ /Resources knownoget not { 0 dict } if
+ dup /ExtGState knownoget {
+ false exch {
+ exch pop oforce
+ dup /ca knownoget { 1 ne { pop not exit } if } if
+ dup /CA knownoget { 1 ne { pop not exit } if } if
+ dup /SMask knownoget { /None ne { pop not exit } if } if
+ pop
+ } forall { pop true exit } if
+ } if
+ dup /XObject knownoget {
+ false exch {
+ exch pop oforce dup /Subtype get
+ dup /Image eq { 1 index /SMask known { pop pop not exit } if } if
+ /Form eq {
+ dup /Group known { pop not exit } if
+ resourceusestransparency { not exit } if
+ } {
+ pop
+ } ifelse
+ } forall { pop true exit } if
+ } if
+ pop false exit
+ } loop
+} bind def
+
+end % pdfdict
+.setglobal
diff --git a/Master/xemtex/gslib/pdf_ops.ps b/Master/xemtex/gslib/pdf_ops.ps
new file mode 100644
index 00000000000..4c98a7f23b7
--- /dev/null
+++ b/Master/xemtex/gslib/pdf_ops.ps
@@ -0,0 +1,521 @@
+% Copyright (C) 1994, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: pdf_ops.ps,v 1.17.2.2.2.1 2003/04/12 14:02:39 giles Exp $
+% Definitions for most of the PDF operators.
+
+.currentglobal true .setglobal
+
+% Define pdfmark. Don't allow it to be bound in.
+% Also don't define it in systemdict, because this leads some Adobe code
+% to think this interpreter is a distiller.
+% (If this interpreter really is a distiller, don't do this.)
+systemdict /pdfmark known not
+ { userdict /pdfmark { cleartomark } bind put } if
+
+userdict /GS_PDF_ProcSet 127 dict dup begin
+
+% ---------------- Abbreviations ---------------- %
+
+/bdef { bind def } bind def
+
+% ---------------- Graphics state stack ---------------- %
+
+% PDF adds a number of parameters to the graphics state.
+% We implement this by pushing and popping a dictionary
+% each time we do a PDF gsave or grestore.
+% The keys in this dictionary are as follows:
+% self % identifies the dictionary as one of ours
+% ClipRect % (optional)
+% Show
+% TextSaveMatrix % matrix at time of BT (iff within BT/ET)
+% (The following correspond directly to PDF state parameters.)
+% AlphaIsShape
+% FillConstantAlpha
+% FillColor
+% FillColorSpace
+% FillOverprint
+% SoftMask
+% StrokeConstantAlpha
+% StrokeColor
+% StrokeColorSpace
+% StrokeOverprint
+% TextSpacing
+% TextHScaling
+% Leading
+% TextFont
+% TextLineMatrix
+% TextMatrix
+% TextRise
+% TextRenderingMode
+% WordSpacing
+
+/nodict 1 dict def
+nodict /self { //nodict } executeonly put
+nodict readonly pop
+
+/dictbeginpage { % <initialdict> dictbeginpage -
+ //nodict 20 dict .copydict begin { def } forall
+ graphicsbeginpage textbeginpage
+} bdef
+/endpage { % - endpage -
+ showpage end
+} bdef
+
+/graphicsbeginpage {
+ initgraphics
+ currentdict /ClipRect .knownget { aload pop rectclip } if
+ 0 g 0 G false op false OP 0 OPM
+ 1 ca 1 CA null SMask false AIS /Compatible BM true TK
+} bdef
+
+/gput % <value> <key> gput -
+ { exch currentdict //nodict eq { /self dup load end 5 dict begin def } if
+ % If we're in a Level 1 system, we need to grow the
+ % dictionary explicitly.
+ currentdict length currentdict maxlength ge %eq
+ { currentdict dup length 3 mul 2 idiv 1 add dict .copydict end begin
+ }
+ if def
+ } bdef
+
+/q {
+ gsave //nodict begin
+} bdef
+% Some PDF files have excess Q operators!
+/Q {
+ currentdict /self .knownget { exec //nodict eq { end grestore } if } if
+} bdef
+
+% ---------------- Color setting ---------------- %
+
+/fcput % <color> <colorspace> fcput -
+ { /FillColorSpace gput /FillColor gput
+ } bdef
+/scput % <color> <colorspace> scput -
+ { /StrokeColorSpace gput /StrokeColor gput
+ } bdef
+
+/csdevgray [/DeviceGray] readonly def
+/csdevrgb [/DeviceRGB] readonly def
+/csdevcmyk [/DeviceCMYK] readonly def
+/cspattern [/Pattern] readonly def
+/nullpattern1 mark
+ /PatternType 1 /PaintType 1 /TilingType 3 /BBox [0 0 0 0]
+ /XStep 1 /YStep 1 /PaintProc { }
+.dicttomark readonly def
+/nullpattern2 nullpattern1 dup length dict copy readonly def
+
+% Each entry in the color space dictionary is a procedure of the form
+% <cspace> -proc- <cspace> <initial-color>
+/CSdict mark
+ /DeviceGray { pop //csdevgray 0 } bind
+ /DeviceRGB { pop //csdevrgb [0 0 0] cvx } bind
+ /DeviceCMYK { pop //csdevcmyk [0 0 0 1] cvx } bind
+ /CIEBasedA { 0 } bind
+ /CIEBasedABC { [0 0 0] cvx } bind
+ /ICCBased { [ 1 index 1 oget /N get { 0 } repeat ] cvx } bind
+ /Separation { 1 } bind
+ /DeviceN { % What is the correct value??
+ [ 1 index 1 get length { 1 } repeat ] cvx
+ } bind
+ /Indexed { 0 } bind
+ /Pattern {
+ dup type /nametype eq 1 index length 1 eq or {
+ pop //cspattern //nullpattern1 matrix makepattern
+ } {
+ //nullpattern2 matrix makepattern 1 index 1 get csset
+ % Stack: patternspace nullpattern basecolor basespace
+ pop [ 3 1 roll dup type /arraytype eq { aload pop } if
+ counttomark -1 roll ] cvx
+ } ifelse
+ } bind
+.dicttomark readonly def
+/csset % <cspace> csset <color> <cspace>
+ { dup dup type /nametype ne { 0 get } if //CSdict exch get exec exch
+ } bdef
+
+/g { //csdevgray fcput } bdef
+/G { //csdevgray scput } bdef
+/rg { 3 array astore cvx //csdevrgb fcput } bdef
+/RG { 3 array astore cvx //csdevrgb scput } bdef
+/k { 4 array astore cvx //csdevcmyk fcput } bdef
+/K { 4 array astore cvx //csdevcmyk scput } bdef
+/cs { csset fcput } bdef
+/CS { csset scput } bdef
+/ri { pop } bdef
+% We have to break up sc according to the number of operands.
+/sc1 { /FillColor gput } bdef
+/SC1 { /StrokeColor gput } bdef
+% We have to avoid storing into a color array associated with an outer
+% gsave level, so we do a kind of "copy on write".
+/sc* {
+ currentdict /FillColor .knownget {
+ astore pop
+ } {
+ /FillColor load length array astore cvx /FillColor gput
+ } ifelse
+} bdef
+/SC* {
+ currentdict /StrokeColor .knownget {
+ astore pop
+ } {
+ /StrokeColor load length array astore cvx /StrokeColor gput
+ } ifelse
+} bdef
+
+% ---------------- Overprint/transparency setting ---------------- %
+
+/op { /FillOverprint gput } bdef
+/OP { /StrokeOverprint gput } bdef
+/OPM {
+ /.setoverprintmode where { pop .setoverprintmode } { pop } ifelse
+} bdef
+/ca { /FillConstantAlpha gput } bdef
+/CA { /StrokeConstantAlpha gput } bdef
+/SMask { /SoftMask gput } bdef
+/AIS { /AlphaIsShape gput } bdef
+/BM {
+ /.setblendmode where {
+ pop [ exch dup type /nametype ne { aload pop } if /Normal ] {
+ { .setblendmode } .internalstopped not { exit } if pop
+ } forall
+ } {
+ pop
+ } ifelse
+} bdef
+/TK {
+ /.settextknockout where { pop .settextknockout } { pop } ifelse
+} bdef
+
+% ---------------- Color installation ---------------- %
+
+% Establish a given color (and color space) as current.
+/.settransparencyparams { % <alpha> <smask> .settransparencyparams -
+ /.begintransparencymask where {
+ pop AlphaIsShape {
+ 1 .setopacityalpha 0 .inittransparencymask exch .setshapealpha 1
+ } {
+ 1 .setshapealpha 1 .inittransparencymask exch .setopacityalpha 0
+ } ifelse
+ % Set the soft mask by rendering the XObject. Doing this every time
+ % is obviously very inefficient; we'll improve it later.
+ .settransparencymask
+ } {
+ pop pop
+ } ifelse
+} bdef
+/.settransparencymask { % <paramdict> <masknum> .settransparencymask -
+ exch dup null eq {
+ pop .inittransparencymask
+ } {
+ dup /Draw get exec
+ } ifelse
+} bdef
+% (Non-mask) images must execute setfillblend.
+/setfillblend {
+ FillOverprint setoverprint
+ FillConstantAlpha SoftMask .settransparencyparams
+} def
+/setfillstate {
+ FillColor FillColorSpace setgcolor setfillblend
+} def
+/setstrokestate {
+ StrokeColor StrokeColorSpace setgcolor StrokeOverprint setoverprint
+ StrokeConstantAlpha SoftMask .settransparencyparams
+} def
+/Cdict 15 dict dup begin % <color...> <colorspace> -proc- -
+ /DeviceGray { pop setgray } bdef
+ /DeviceRGB { pop setrgbcolor } bdef
+ /DeviceCMYK { pop setcmykcolor } bdef
+ /CIEBasedA
+ { dup currentcolorspace eq { pop } { setcolorspace } ifelse setcolor } bdef
+ /CIEBasedABC /CIEBasedA load def
+ /CIEBasedDEF /CIEBasedA load def
+ /CIEBasedDEFG /CIEBasedA load def
+ /ICCBased /CIEBasedA load def
+ /Separation /CIEBasedA load def
+ /DeviceN /CIEBasedA load def
+ /Indexed /CIEBasedA load def
+ /Pattern
+ { dup currentcolorspace eq { pop } { setcolorspace } ifelse
+ dup /Matrix .knownget not { matrix } if
+ gsave DefaultMatrix setmatrix makepattern grestore setcolor
+ } bdef
+end def
+/setgcolor % (null | <color...>) <colorspace> setgcolor -
+ { 1 index null eq
+ { pop pop }
+ { dup 0 get //Cdict exch get exec }
+ ifelse
+ } bdef
+/fsexec % <fillop|strokeop> fsexec -
+ { % Preserve the current point, if any.
+ { currentpoint } stopped
+ { $error /newerror false put cvx exec }
+ { 3 -1 roll cvx exec moveto }
+ ifelse
+ } bdef
+
+% ---------------- Path painting and clipping ---------------- %
+
+/S { setstrokestate /stroke fsexec } bdef
+/f { setfillstate /fill fsexec } bdef
+/f* { setfillstate /eofill fsexec } bdef
+/n { newpath } bdef % don't allow n to get bound in
+/s { closepath S } bdef
+/B { gsave setfillstate fill grestore S } bdef
+/b { closepath B } bdef
+/B* { gsave setfillstate eofill grestore S } bdef
+/b* { closepath B* } bdef
+
+% Clipping:
+
+/Wdict 4 dict dup begin
+/S { gsave setstrokestate stroke grestore n } bdef
+/f { gsave setfillstate fill grestore n } bdef
+/f* { gsave setfillstate eofill grestore n } bdef
+/n { end clip newpath } bdef
+end readonly def
+/W { //Wdict begin } bdef
+/W*dict 4 dict dup begin
+Wdict { def } forall
+/n { end eoclip newpath } bdef
+end readonly def
+/W* { //W*dict begin } bdef
+
+% ---------------- Text control ---------------- %
+
+/textbeginpage
+ { /TextSpacing 0 def % 0 Tc
+ /TextLeading 0 def % 0 TL
+ /TextRenderingMode 0 def % 0 Tr
+ /TextRise 0 def % 0 Ts
+ /WordSpacing 0 def % 0 Tw
+ /TextHScaling 1.0 def % 100 Tz
+ /TextFont null def
+ /Show { showfirst } def
+ } bdef
+
+% Contrary to the statement in the PDF manual, BT and ET *can* be nested,
+% if the CharProc for a Type 3 font does a BT/ET itself.
+% Since we always call the CharProc inside a q/Q, we simply ensure that
+% the text state is saved and restored like the rest of the extended
+% graphics state.
+
+/settextmatrix {
+ TextMatrix concat
+ TextHScaling 1 ne { TextHScaling 1 scale } if
+ TextRise 0 ne { 0 TextRise translate } if
+ TextFont dup null eq { pop } { setfont } ifelse
+} bdef
+/settextstate {
+ % The text state can be set even outside BT/ET.
+ currentdict /TextSaveMatrix known {
+ TextSaveMatrix setmatrix settextmatrix
+ } if
+} bdef
+/settextposition {
+ % Update the TextMatrix translation.
+ gsave TextSaveMatrix setmatrix
+ currentpoint TextMatrix 4 2 getinterval astore pop
+ % We would like to do "grestore currentpoint translate"
+ % here, but some PDF files set a singular text matrix
+ % (0 0 0 0 <x> <y> Tm), so we can't do this.
+ TextTempMatrix identmatrix setmatrix currentpoint
+ grestore
+ TextTempMatrix currentmatrix 4 2 getinterval astore pop
+ TextTempMatrix setmatrix
+} bdef
+
+/BT {
+ currentdict /TextLineMatrix .knownget
+ { identmatrix pop TextMatrix identmatrix pop }
+ { matrix /TextLineMatrix gput matrix /TextMatrix gput }
+ ifelse
+ { showfirst } /Show gput
+ currentdict /TextSaveMatrix .knownget not {
+ matrix dup /TextSaveMatrix gput
+ } if currentmatrix pop settextmatrix
+ matrix /TextTempMatrix gput % see settextposition
+} bdef
+/ET {
+ TextRenderingMode 4 ge { clip newpath } if
+ TextSaveMatrix setmatrix
+ currentdict /TextSaveMatrix undef
+} bdef
+/Tc { /TextSpacing gput { showfirst } /Show gput } bdef
+/TL { /TextLeading gput } bdef
+/Tr { /TextRenderingMode gput { showfirst } /Show gput } bdef
+/Ts { /TextRise gput settextstate } bdef
+/Tw { /WordSpacing gput { showfirst } /Show gput } bdef
+/Tz { 100 div /TextHScaling gput settextstate} bdef
+
+% ---------------- Font control ---------------- %
+
+/Tf { % <font> <scale> Tf -
+ dup 1 eq { pop } { scalefont } ifelse
+ /TextFont gput settextstate
+} bdef
+
+% Read a CFF font.
+/FRD % <resname> <file> FRD -
+ { /FontSetInit /ProcSet findresource begin true ReadData
+ } bdef
+
+% Copy a font, removing its FID. If changed is true, also remove
+% the UniqueID and XUID, if any. If the original dictionary doesn't have
+% the keys being removed, don't copy it.
+/.copyfontdict % <font> <changed> .copyfontdict <dict>
+ { 1 index /FID known
+ 1 index { 2 index /UniqueID known or 2 index /XUID known or } if
+ { % We add 1 to the length just in case the original
+ % didn't have a FID.
+ exch dup length 1 add dict exch
+ { % Stack: changed newfont key value
+ 1 index /FID eq 4 index
+ { 2 index /UniqueID eq or 2 index /XUID eq or }
+ if not { 3 copy put } if pop pop
+ }
+ forall exch
+ }
+ if pop
+ } bdef
+
+% Insert a new Encoding or Metrics into a font if necessary.
+% Return a possibly updated font, and a flag to indicate whether
+% the font was actually copied.
+/.updatefontmetrics { % <font> <Metrics|null> .updatefontmetrics
+ % <font'> <copied>
+ dup null ne {
+ exch true .copyfontdict dup /Metrics 4 -1 roll put true
+ } {
+ pop false
+ } ifelse
+} bdef
+/.updatefontencoding { % <font> <Encoding|null> .updatefontencoding
+ % <font'> <copied>
+ dup null ne { dup 2 index /Encoding get ne } { false } ifelse {
+ exch false .copyfontdict dup /Encoding 4 -1 roll put true
+ } {
+ pop false
+ } ifelse
+} bdef
+/.updatefont { % <font> <Encoding|null> <Metrics|null> .updatefont
+ % <font'> <copied>
+ 3 -1 roll exch .updatefontmetrics
+ % Stack: enc|null font' copied
+ 3 1 roll exch .updatefontencoding 3 -1 roll or
+} bdef
+
+% ---------------- Text positioning ---------------- %
+
+/Td {
+ TextLineMatrix transform TextLineMatrix 4 2 getinterval astore pop
+ TextLineMatrix TextMatrix copy pop settextstate
+} bdef
+/TD { dup neg /TextLeading gput Td } bdef
+/T* { 0 TextLeading neg Td } bdef
+/Tm {
+ TextLineMatrix astore TextMatrix copy pop settextstate
+} bdef
+
+% ---------------- Text painting ---------------- %
+
+/Vexch {
+ rootfont /WMode .knownget { 1 eq { exch } if } if
+} bind def
+
+/textrenderingprocs [ % (0 is handled specially)
+ % Painting-only modes
+ { tf } { tS } { tB } { tn }
+ % Clipping modes
+ { gsave tf grestore tW }
+ { gsave tS grestore tW }
+ { gsave tB grestore tW }
+ { tW }
+] readonly def
+/setshowstate
+ { WordSpacing 0 eq TextSpacing 0 eq and
+ { TextRenderingMode 0 eq
+ { { setfillstate show } }
+ { { false charpath textrenderingprocs TextRenderingMode get exec } }
+ ifelse
+ }
+ { TextRenderingMode 0 eq
+ { WordSpacing 0 eq
+ { { setfillstate TextSpacing 0 Vexch 3 -1 roll ashow } }
+ { TextSpacing 0 eq
+ { { setfillstate WordSpacing 0 Vexch 32 4 -1 roll widthshow } }
+ { { setfillstate WordSpacing 0 Vexch 32
+ TextSpacing 0 Vexch 6 -1 roll awidthshow } }
+ ifelse
+ }
+ ifelse
+ }
+ { { WordSpacing TextSpacing
+ % Implement the combination of t3 and false charpath.
+ % Note that we must use cshow for this, because we
+ % can't parse multi-byte strings any other way.
+ % Stack: string xword xchar
+ { pop pop (x) dup 0 3 index put false charpath
+ % Stack: xword xchar ccode
+ 3 copy 32 eq { add } { exch pop } ifelse 0 Vexch rmoveto pop
+ }
+ 4 -1 roll cshow pop pop
+ textrenderingprocs TextRenderingMode get exec
+ }
+ }
+ ifelse
+ }
+ ifelse /Show gput
+ } bdef
+/showfirst { setshowstate Show } def
+
+/Tj {
+ 0 0 moveto Show settextposition
+} bdef
+/' { T* Tj } bdef
+/" { exch Tc exch Tw T* Tj } bdef
+/TJ {
+ 0 0 moveto {
+ dup type /stringtype eq {
+ Show
+ } { -1000 div
+ currentfont /ScaleMatrix .knownget { 0 get mul } if
+ 0 Vexch rmoveto
+ } ifelse
+ } forall settextposition
+} bdef
+
+/tf { setfillstate currentpoint fill moveto } bdef
+/tn { currentpoint newpath moveto } bdef
+% For stroking characters, temporarily restore the graphics CTM so that
+% the line width will be transformed properly.
+/Tmatrix matrix def
+/tS
+ { setstrokestate
+ currentpoint //Tmatrix currentmatrix TextSaveMatrix setmatrix stroke
+ setmatrix moveto
+ } bdef
+/tB { gsave tf grestore tS } bdef
+% This does the wrong thing if there have been multiple text operations
+% within a single BT/ET pair, but it's a start.
+/tW { } bdef
+
+end readonly put % GS_PDF_ProcSet
+
+.setglobal
diff --git a/Master/xemtex/gslib/pdf_sec.ps b/Master/xemtex/gslib/pdf_sec.ps
new file mode 100644
index 00000000000..e19e4b4397e
--- /dev/null
+++ b/Master/xemtex/gslib/pdf_sec.ps
@@ -0,0 +1,361 @@
+% Copyright (C) 1996-1998 Geoffrey Keating.
+% Copyright (C) 2001 Artifex Software, Inc.
+% This file may be freely distributed with or without modifications,
+% so long as modified versions are marked as such and copyright notices are
+% not removed.
+
+% $Id: pdf_sec.ps,v 1.5.2.1 2002/04/02 13:57:27 mpsuzuki Exp $
+% Implementation of security hooks for PDF reader.
+
+% This file contains the procedures that have to take encryption into
+% account when reading a PDF file. It replaces the stub version of this
+% file that is shipped with GhostScript. It requires GhostScript 7.01
+% or later.
+
+% Documentation for using this file is available at
+% http://www.ozemail.com.au/%7Egeoffk/pdfencrypt/
+
+% Modified by Alex Cherepanov to work with GS 6.60 and higher.
+% New versions of GS require explicit checks for /true , /false, and /null
+% in .decpdfrun . This fix is backward-compatible.
+
+% Modified by Raph Levien and Ralph Giles to use the new C
+% implementations of md5 and arcfour in ghostscript 7.01, and to
+% be compatible with PDF 1.4 128-bit encryption.
+
+/.setlanguagelevel where { pop 2 .setlanguagelevel } if
+.currentglobal true .setglobal
+/pdfdict where { pop } { /pdfdict 100 dict def } ifelse
+pdfdict begin
+
+% Older ghostscript versions do not have .pdftoken, so we use 'token' instead.
+/.pdftoken where { pop } { /.pdftoken /token load def } ifelse
+
+% take a stream and arc4 decrypt it.
+% <stream> <key> arc4decodefilter <stream>
+/arc4decodefilter {
+ 1 dict begin
+ /Key exch def
+ currentdict end /ArcfourDecode filter
+} bind def
+
+% <ciphertext> <key> arc4decode <plaintext>
+/arc4decode {
+ %(key: ) print dup == (ct: ) print 1 index ==
+ 1 index length 0 eq {
+ pop
+ } {
+ 1 index length string 3 1 roll arc4decodefilter exch readstring pop
+ } ifelse
+} bind def
+
+/md5 {
+ 16 string dup /MD5Encode filter dup 4 3 roll writestring closefile
+} bind def
+
+/pdf_padding_string
+ <28bf4e5e4e758a41 64004e56fffa0108
+ 2e2e00b6d0683e80 2f0ca9fe6453697a>
+def
+
+% Pad a key out to 32 bytes.
+/pdf_pad_key { % <key> pdf_pad_key <padded key>
+ dup length 32 gt { 0 32 getinterval } if
+ pdf_padding_string
+ 0 32 3 index length sub getinterval
+ concatstrings
+} bind def
+
+/pdf_xorbytes { % <iter-num> <key> pdf_xorbytes <xored-key>
+ dup length dup string
+ exch 1 sub 0 1 3 2 roll {
+ % <iter-num> <key> <new-key> <byte-num>
+ dup 3 index exch get 4 index xor
+ % <iter-num> <key> <new-key> <byte-num> <byte>
+ 3 copy put pop pop
+ } for
+ 3 1 roll pop pop
+} bind def
+
+% Get length of encryption key in bytes
+/pdf_key_length { % pdf_key_length <key_length>
+ Trailer /Encrypt oget /Length knownoget { -3 bitshift } { 5 } ifelse
+} bind def
+
+% Algorithm 3.2
+/pdf_compute_encryption_key { % <password> pdf_compute_encryption_key <key>
+ % Step 1.
+ pdf_pad_key
+
+ % Step 2, 3.
+ Trailer /Encrypt oget dup /O oget
+ % <padded-key> <encrypt> <O>
+
+ % Step 4.
+ exch /P oget 4 string exch
+ 2 copy 255 and 0 exch put
+ 2 copy -8 bitshift 255 and 1 exch put
+ 2 copy -16 bitshift 255 and 2 exch put
+ 2 copy -24 bitshift 255 and 3 exch put pop
+ % <padded-key> <O> <P>
+
+ % Step 5.
+ Trailer /ID oget 0 oget
+ 3 { concatstrings } repeat md5
+
+ % Step 6.
+ Trailer /Encrypt oget /R oget 3 eq {
+ 50 { md5 } repeat
+ } if
+
+ % Step 7.
+ 0 pdf_key_length getinterval
+} bind def
+
+% Algorithm 3.4
+/pdf_gen_user_password_R2 { % <filekey> pdf_gen_user_password_R2 <U>
+
+ % Step 2.
+ pdf_padding_string exch arc4decode
+} bind def
+
+% Algorithm 3.5
+/pdf_gen_user_password_R3 { % <filekey> pdf_gen_user_password_R3 <U>
+
+ % Step 2.
+ pdf_padding_string
+
+ % Step 3.
+ Trailer /ID oget 0 oget
+ concatstrings md5
+
+ % Step 4.
+ 1 index arc4decode
+
+ % Step 5.
+ 1 1 19 {
+ 2 index pdf_xorbytes arc4decode
+ } for
+ exch pop
+
+} bind def
+
+/pdf_gen_user_password { % <password> pdf_gen_user_password <filekey> <U>
+ % common Step 1 of Algorithms 3.4 and 3.5.
+ pdf_compute_encryption_key dup
+
+ Trailer /Encrypt oget
+
+ /R oget dup 2 eq {
+ pop pdf_gen_user_password_R2
+ } {
+ dup 3 eq {
+ pop pdf_gen_user_password_R3
+ } {
+ (****This file uses an unknown standard security handler revision: )
+ print == flush
+ /pdf_check_user_password cvx /undefined signalerror
+ } ifelse
+ } ifelse
+} bind def
+
+% Algorithm 3.6
+/pdf_check_user_password { % <password> pdf_check_user_password <filekey> true
+ % <password> pdf_check_user_password false
+ pdf_gen_user_password
+
+ Trailer /Encrypt oget /U oget
+
+ 0 2 index length getinterval eq {
+ true
+ } {
+ pop false
+ } ifelse
+} bind def
+
+% Compute an owner key, ie the result of step 4 of Algorithm 3.3
+/pdf_owner_key % <password> pdf_owner_key <owner-key>
+{
+ % Step 1.
+ pdf_pad_key
+
+ % Step 2.
+ md5
+
+ % 3.3 Step 3.
+ Trailer /Encrypt oget /R oget 3 eq {
+ 50 { md5 } repeat
+ } if
+
+ % Step 4.
+ 0 pdf_key_length getinterval
+} bind def
+
+% Algorithm 3.7
+/pdf_check_owner_password { % <password> pdf_check_owner_password <filekey> true
+ % <password> pdf_check_owner_password false
+ % Step 1.
+ pdf_owner_key
+
+ % Step 2.
+ Trailer /Encrypt oget dup /O oget 2 index arc4decode
+ % <encryption-key> <encrypt-dict> <decrypted-O>
+
+ % Step 3.
+ exch /R oget 3 eq {
+ 1 1 19 {
+ 2 index pdf_xorbytes arc4decode
+ } for
+ } if
+ exch pop
+ % <result-of-step-3>
+
+ pdf_check_user_password
+} bind def
+
+% Process the encryption information in the Trailer.
+/pdf_process_Encrypt {
+ Trailer /Encrypt oget
+ /Filter oget /Standard eq not {
+ (****This file uses an unknown security handler.\n) print flush
+ /pdf_process_Encrypt cvx /undefined signalerror
+ } if
+ () pdf_check_user_password
+ {
+ /FileKey exch def
+ } {
+ /PDFPassword where {
+ pop PDFPassword pdf_check_user_password
+ {
+ /FileKey exch def
+ } {
+ PDFPassword pdf_check_owner_password
+ {
+ /FileKey exch def
+ } {
+ (****Password did not work.\n) print flush
+ /pdf_process_Encrypt cvx /invalidfileaccess signalerror
+ } ifelse
+ } ifelse
+ } {
+ (****This file requires a password for access.\n) print flush
+ /pdf_process_Encrypt cvx /invalidfileaccess signalerror
+ } ifelse
+ } ifelse
+
+% Trailer /Encrypt oget /P oget 4 and 0 eq #? and
+% { (****This owner of this file has requested you do not print it.\n)
+% print flush
+% /pdf_process_Encrypt cvx /invalidfileaccess signalerror
+% }
+% if
+} bind def
+
+% Calculate the key used to decrypt an object (to pass to .decpdfrun or
+% put into a stream dictionary).
+/computeobjkey % <object#> <generation#> computeobjkey <keystring>
+{
+ exch
+ FileKey length 5 add string
+ dup 0 FileKey putinterval
+ exch
+ % stack: gen# string obj#
+ 2 copy 255 and FileKey length exch put
+ 2 copy -8 bitshift 255 and FileKey length 1 add exch put
+ 2 copy -16 bitshift 255 and FileKey length 2 add exch put
+ pop exch
+ 2 copy 255 and FileKey length 3 add exch put
+ 2 copy -8 bitshift 255 and FileKey length 4 add exch put
+ pop md5 0 FileKey length 5 add 2 index length .min getinterval
+} bind def
+
+% As .pdfrun, but decrypt strings with key <key>.
+/.decpdfrun % <file> <keystring> <opdict> .decpdfrun -
+ { % Construct a procedure with the file, opdict and key bound into it.
+ 2 index cvlit mark mark 5 2 roll
+ { .pdftoken not { (%%EOF) cvn cvx } if
+ dup xcheck
+ { DEBUG { dup == flush } if
+ 3 -1 roll pop
+ 2 copy .knownget
+ { exch pop exch pop exec
+ }
+ { exch pop
+ dup /true eq
+ { pop //true
+ }
+ { dup /false eq
+ { pop //false
+ }
+ { dup /null eq
+ { pop //null
+ }
+ { (%stderr) (w) file
+ dup (****************Unknown operator: ) writestring
+ dup 3 -1 roll .writecvs dup (\n) writestring flushfile
+ }
+ ifelse
+ }
+ ifelse
+ }
+ ifelse
+ }
+ ifelse
+ }
+ { exch pop DEBUG { dup ==only ( ) print flush } if
+ dup type /stringtype eq
+ { 1 index arc4decode
+ DEBUG { (%Decrypted: ) print dup == flush } if
+ }
+ if
+ exch pop
+ }
+ ifelse
+ }
+ aload pop .packtomark cvx
+ /loop cvx 2 packedarray cvx
+ { stopped /PDFsource } aload pop
+ PDFsource
+ { store { stop } if } aload pop .packtomark cvx
+ /PDFsource 3 -1 roll store exec
+ } bind def
+
+% Run the code to resolve an object reference.
+/pdf_run_resolve
+ { /FileKey where
+ { pop
+ 2 copy computeobjkey dup 4 1 roll
+ PDFfile exch resolveopdict .decpdfrun
+ dup dup dup 5 2 roll
+ % stack: object object key object object
+ xcheck exch type /dicttype eq and
+ { /StreamKey exch put }
+ { pop pop }
+ ifelse
+ }
+ { PDFfile resolveopdict .pdfrun }
+ ifelse
+ } bind def
+
+% Prefix a decryption filter to a stream if needed.
+% Stack: readdata? dict parms file/string filternames
+% (both before and after).
+/pdf_decrypt_stream
+ { 3 index /StreamKey known
+ {
+ exch
+ % Stack: readdata? dict parms filternames file/string
+ 3 index /Length oget
+ dup 0 eq {
+ % Handle Length=0 case specially to avoid SubFileDecode semantics
+ pop pop ()
+ } {
+ () /SubFileDecode filter
+ } ifelse
+ 3 index /StreamKey get arc4decodefilter
+ exch
+ } if
+ } bind def
+
+end % pdfdict
+.setglobal
diff --git a/Master/xemtex/gslib/pdfopt b/Master/xemtex/gslib/pdfopt
new file mode 100644
index 00000000000..0c2413bd7ef
--- /dev/null
+++ b/Master/xemtex/gslib/pdfopt
@@ -0,0 +1,20 @@
+#!/bin/sh
+# $Id: pdfopt,v 1.4 2001/07/23 06:57:27 lpd Exp $
+# Convert PDF to "optimized" form.
+
+OPTIONS="-dSAFER -dDELAYSAFER"
+while true
+do
+ case "$1" in
+ -*) OPTIONS="$OPTIONS $1" ;;
+ *) break ;;
+ esac
+ shift
+done
+
+if [ $# -ne 2 ]; then
+ echo "Usage: `basename $0` input.pdf output.pdf" 1>&2
+ exit 1
+fi
+
+exec gs -q -dNODISPLAY $OPTIONS -- pdfopt.ps "$1" "$2"
diff --git a/Master/xemtex/gslib/pdfopt.bat b/Master/xemtex/gslib/pdfopt.bat
new file mode 100644
index 00000000000..18d86e404e3
--- /dev/null
+++ b/Master/xemtex/gslib/pdfopt.bat
@@ -0,0 +1,22 @@
+@echo off
+@rem $Id: pdfopt.bat,v 1.4 2001/07/23 06:57:27 lpd Exp $
+@rem Convert PDF to "optimized" form.
+
+if %1/==/ goto usage
+if %2/==/ goto usage
+call gssetgs.bat
+echo -q -dNODISPLAY -dSAFER -dDELAYSAFER >_.at
+:cp
+if %3/==/ goto doit
+echo %1 >>_.at
+shift
+goto cp
+
+:doit
+%GSC% -q @_.at -- pdfopt.ps %1 %2
+goto end
+
+:usage
+echo "Usage: pdfopt input.pdf output.pdf"
+
+:end
diff --git a/Master/xemtex/gslib/pdfopt.ps b/Master/xemtex/gslib/pdfopt.ps
new file mode 100644
index 00000000000..c037b126556
--- /dev/null
+++ b/Master/xemtex/gslib/pdfopt.ps
@@ -0,0 +1,1126 @@
+% Copyright (C) 2000, 2001 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: pdfopt.ps,v 1.10.2.2.2.1 2003/04/12 14:02:39 giles Exp $
+% PDF linearizer ("optimizer").
+
+.currentglobal true .setglobal
+/pdfoptdict 200 dict def
+pdfoptdict begin
+
+% This linearizer is designed for simplicity, not for performance.
+% See the main program (the last procedure in the file) for comments
+% describing the main processing sequence.
+
+% ---------------- Utilities ---------------- %
+
+% ------ Data structures ------ %
+
+% Distinguish dictionaries, arrays, and everything else.
+/ifdaelse { % <obj> <dictproc> <arrayproc> <otherproc> ifdaelse -
+ 3 index type dup /dicttype eq {
+ pop pop pop
+ } {
+ dup /arraytype ne exch /packedarraytype ne and {
+ exch
+ } if pop exch pop
+ } ifelse exec
+} bind def
+
+% Implement dynamically growable arrays using a dictionary.
+/darray { % <size> darray <darray>
+ dict
+} bind def
+/dadd { % <darray> <value> dadd -
+ 1 index length exch put
+} bind def
+/daforall { % <darray> <proc> daforall -
+ /exch cvx /get cvx 3 -1 roll /exec cvx 5 packedarray cvx
+ 0 1 2 index 0 get length 1 sub 4 -1 roll for
+} bind def
+/dacontents { % <darray> dacontents <array>
+ [ exch { } daforall ]
+} bind def
+/dacontstring { % <darray> dacontstring <string>
+ 0 1 index { exch pop length add } forall string
+ dup /NullEncode filter
+ % Stack: darray str filter
+ 3 -1 roll { 1 index exch writestring } daforall
+ closefile
+} bind def
+
+% Force an object, mapping it if it is a reference.
+/omforcenew { % <obj> omforce <obj'> <notseen>
+ dup oforce 2 copy eq { pop true } { exch 0 get omapnew exch pop } ifelse
+} bind def
+/omforce { % <obj> omforce <obj'>
+ omforcenew pop
+} bind def
+/omget { % <dict|array> <key> omget <obj>
+ get omforce
+} bind def
+% Visit an entire tree.
+/omvisit { % <obj> omvisit -
+ omforcenew {
+ { { omvisit omvisit } forall }
+ { { omvisit } forall }
+ { pop }
+ ifdaelse
+ } {
+ pop
+ } ifelse
+} bind def
+% Visit a tree, stopping at references to Page objects.
+% (This is only needed for the OpenAction in the Catalog.)
+/omvisitnopage { % <obj> omvisitnopage -
+ dup oforce dup type /dicttype eq {
+ /Type .knownget { /Page eq } { false } ifelse
+ } {
+ pop false
+ } ifelse {
+ pop % Page reference
+ } {
+ omforcenew {
+ { { omvisitnopage omvisitnopage } forall }
+ { { omvisitnopage } forall }
+ { pop }
+ ifdaelse
+ } {
+ pop
+ } ifelse
+ } ifelse
+} bind def
+
+% Collect the list of currently mapped object numbers, in order.
+/omapped { % - omapped <obj#s>
+ RMap length array RMap {
+ 2 index 3 1 roll 1 sub exch put
+ } forall
+} bind def
+
+% Collect the list of object numbers passed to omap by a procedure.
+/visited { % <proc> visited <obj#s>
+ false currentomap 2 .execn
+ omapped exch setomap
+} bind def
+
+% ------ Output ------ %
+
+% Provide a framework for closure-based streams.
+.currentglobal false .setglobal
+userdict /clostreams 20 dict put % stream -> [data endproc]
+.setglobal
+% Create a closure-based stream.
+/clostream { % <data> <proc> <endproc> clostream <stream>
+ 2 index 3 -1 roll /exec load 3 packedarray cvx
+ /NullEncode filter
+ % Stack: data endproc stream
+ clostreams 1 index 5 -2 roll 2 array astore put
+} bind def
+% Close a closure-based stream.
+/closend { % <stream> closend <result>
+ dup closefile clostreams exch
+ 2 copy get 3 1 roll undef aload pop exec
+} bind def
+
+% Implement in-memory output streams.
+/msproc { % <data> <more> <accum> msproc <scratch>
+ 3 -1 roll dadd { 100 string } { () } ifelse
+} bind def
+/mstream { % - mstream <mstream>
+ 10 darray {msproc} {dacontstring} clostream
+} bind def
+/mcontents { % <mstream> mcontents <string>
+ closend
+} bind def
+
+% Implement a stream that only keeps track of its position.
+% (All streams should do this, but the PLRM doesn't require it.)
+/posbuf 100 string def
+/posproc { % <data> <more> <accum> posproc <scratch>
+ 0 2 copy get 5 -1 roll length add put
+ pop //posbuf
+} bind def
+/postream { % - postream <postream>
+ [0] {posproc} {0 get} clostream
+} bind def
+/poslength { % <postream> poslength <pos>
+ closend
+} bind def
+
+% Implement streams with variable-bit-width data.
+% Note that these are dictionary objects, not stream objects.
+/bitstream { % <stream> bitstream <bstream>
+ 4 dict begin /S exch def /N 8 def /B 0 def
+ currentdict end
+} bind def
+/bitwrite { % <bstream> <value> <width> bitwrite -
+ PDEBUG { ( ) print 1 index =only (:) print dup = } if
+ 3 -1 roll begin
+ N exch sub dup 0 ge {
+ /N exch def N bitshift B add
+ } {
+ 2 copy bitshift B add S exch write
+ % Stack: value -left
+ { 8 add dup 0 ge { exit } if
+ 2 copy bitshift 255 and S exch write
+ } loop
+ /N 1 index def bitshift 255 and
+ } ifelse /B exch def
+ end
+} bind def
+/bitflush { % <bstream> bitflush -
+ begin N 8 ne { S B write /B 0 def /N 8 def } if end
+} bind def
+
+% Capture OFile output on the temporary file, in memory, or just as a length.
+/totemp { % <proc> totemp <start> <end>
+ TFile fileposition OFile
+ /OFile TFile def 3 .execn
+ /OFile exch def
+ TFile fileposition
+} bind def
+/tomemory { % <proc> tomemory <string>
+ OFile /OFile mstream def 2 .execn
+ OFile mcontents exch /OFile exch def
+} bind def
+/tolength { % <proc> tolength <string>
+ OFile /OFile postream def 2 .execn
+ OFile poslength exch /OFile exch def
+} bind def
+
+% Copy a range of bytes from TFile to OFile.
+/copyrange { % <start> <end> copybytes -
+ TFile 2 index setfileposition
+ exch sub 1024 string exch {
+ % Stack: buf left
+ 2 copy 1 index length .min 0 exch getinterval
+ TFile exch readstring pop OFile exch writestring
+ 1 index length sub dup 0 le { exit } if
+ } loop pop pop
+} bind def
+
+% Pad with blanks to a specified position.
+/padto { % <pos> padto -
+ OFile fileposition sub
+ dup 0 lt {
+ (ERROR: file position incorrect by ) print =
+ /padto cvx /rangecheck signalerror
+ } {
+ { ( ) ows } repeat
+ } ifelse
+} bind def
+
+% ---------------- Read objects into memory ---------------- %
+
+/touch { % <object> touch -
+ {
+ { touch touch } forall
+ } {
+ dup xcheck {
+ % Executable array, must be an indirect object.
+ dup 0 get resolved? { pop pop } { oforce touch } ifelse
+ } {
+ { touch } forall
+ } ifelse
+ } {
+ pop
+ } ifdaelse
+} bind def
+
+% ---------------- Replace references with referents ---------------- %
+
+/replaceable? { % <value> replaceable? <bool>
+ dup type /integertype eq exch xcheck not and
+} bind def
+/replacement { % <obj|ref> replacement <obj'>
+ dup oforce dup replaceable? { exch } if pop
+} bind def
+
+/replacerefs { % <object> replacerefs <object>
+ {
+ dup {
+ 2 index 2 index undef
+ exch replacement exch replacement
+ 2 index 3 1 roll put
+ } forall
+ } {
+ 0 1 2 index length 1 sub {
+ 1 index exch 2 copy get replacement put
+ } for
+ } {
+ } ifdaelse
+} bind def
+
+/replaceReferences { % - replaceReferences -
+ Objects { replacerefs pop } lforall
+ % Delete replaced objects.
+ 0 1 Objects llength 1 sub {
+ Objects 1 index lget replaceable? {
+ PDEBUG { (Deleting ) print dup = } if
+ Generations 1 index 0 lput
+ } if pop
+ } for
+} bind def
+
+% ---------------- Create new objects ---------------- %
+
+/createObjects { % [<obj>...] createObjects <firstobj#>
+ Objects llength dup
+ dup 3 index length add growPDFobjects
+ % Stack: objects objn objn
+ 3 1 roll exch {
+ Objects 2 index 3 -1 roll lput
+ Generations 1 index 1 lput
+ 1 add
+ } forall pop
+} bind def
+
+% ---------------- Propagate attributes ---------------- %
+
+/nopropattrs <<
+ % Never propagate these.
+ /Type dup /Kids dup /Count dup /Parent dup
+ % Handle Resources specially.
+ /Resources dup
+>> def
+
+% Merge Resources.
+/mergeres { % <fromdict> <todict> mergeres -
+ % Values in todict take priority over fromdict.
+ 1 index /Resources .knownget {
+ 1 index /Resources .knownget {
+ % Stack: fromdict todict fromres tores
+ exch oforce exch oforce
+ % todict's Resources may be shared, so make a copy.
+ dup length dict .copydict
+ exch {
+ % Stack: fromdict todict tores' fromkey fromvalue
+ 2 index 2 index knownoget {
+ % Stack: fromdict todict tores' fromkey fromvalue tovalue
+ exch oforce exch
+ % ProcSet is an array, other types are dictionaries.
+ dup type /dicttype eq {
+ % Dictionary, not ProcSet.
+ exch dup length 2 index length add dict .copydict .copydict
+ } {
+ % Array or packed array, ProcSet.
+ % Use dictionaries to do the merge.
+ dup length 2 index length add dict begin
+ exch { dup def } forall { dup def } forall
+ mark currentdict end { pop } forall .packtomark
+ } ifelse
+ } if
+ 2 index 3 1 roll put
+ } forall
+ } if /Resources exch put pop
+ } {
+ pop pop
+ } ifelse
+} bind def
+
+% Merge attributes other than Resources.
+/mergeattrs { % <fromdict> <todict> mergeattrs <fromdict> <todict>
+ % Values in todict take priority over fromdict.
+ 1 index {
+ % Stack: fromdict todict fromkey fromvalue
+ //nopropattrs 2 index known {
+ pop pop
+ } {
+ 2 index 2 index known { pop pop } { 2 index 3 1 roll put } ifelse
+ } ifelse
+ } forall
+} bind def
+
+% Propagate attributes to a subtree.
+/proppage { % <attrs> <subtree> proppage -
+ % We should be able to tell when we reach a leaf
+ % by finding a Type unequal to /Pages. Unfortunately,
+ % some files distributed by Adobe lack the Type key
+ % in some of the Pages nodes! Instead, we check for Kids.
+ dup /Kids knownoget {
+ % Accumulate inherited values.
+ 3 1 roll
+ % Stack: kids attrs pagesnode
+ dup length dict .copydict mergeattrs
+ dup 3 1 roll mergeres
+ exch { oforce 1 index exch proppage } forall pop
+ } {
+ % Merge inherited values into the leaf.
+ mergeattrs mergeres
+ } ifelse
+} bind def
+
+% Propagate attributes to all pages.
+/propagateAttributes { % - propagateAttributes -
+ 0 dict Trailer /Root oget /Pages oget proppage
+} bind def
+
+% ---------------- Identify document-level objects ---------------- %
+
+/identifyDocumentObjects { % - identifyDocumentObjects <obj#s>
+ {
+ Trailer /Root omget
+ dup /PageMode .knownget { omvisit } if
+ % Don't allow omvisit to trace references to Page objects.
+ dup /OpenAction .knownget { omvisitnopage } if
+ Trailer /Encrypt .knownget { omvisit } if
+ dup /Threads .knownget {
+ omforce { omforce } forall
+ } if
+ dup /AcroForm .knownget { omvisit } if
+ pop
+ } visited
+} bind def
+
+% ---------------- Identify the objects of each page ---------------- %
+
+/identifyfont { % <fontref> identifyfont -
+ omforce {
+ exch /FontDescriptor eq {
+ omforce dup /Flags .knownget { 32 and 0 ne } { false } ifelse
+ exch {
+ exch dup dup /FontFile eq exch /FontFile2 eq or
+ exch /FontFile3 eq or 2 index and {
+ fontfiles exch dadd
+ } {
+ omvisit
+ } ifelse
+ } forall pop
+ } {
+ omvisit
+ } ifelse
+ } forall
+} bind def
+
+/identifyPageObjects { % <extra> <page#> identifyPageObjects <obj#s>
+ pdffindpageref
+ 4 dict begin
+ /images 10 darray def
+ /fontfiles 10 darray def
+ {
+ omforce
+ % Stack: extra page
+ % Visit any extra objects if applicable.
+ exch omvisit
+ % Visit Annots, if any.
+ % We don't try to defer the drawing information.
+ dup /Annots .knownget { omvisit } if
+ % Visit beads.
+ dup /B .knownget { omvisit } if
+ % Visit resources dictionaries.
+ dup /Resources .knownget {
+ omforce dup {
+ % Visit the first-level Resource dictionaries.
+ omforce pop pop
+ } forall {
+ % Visit the resources themselves.
+ % Skip Image XObjects, and FontFile streams if the
+ % FontDescriptor Flags have bit 6 set.
+ % We don't try to visit the resources in the order in which
+ % the Contents stream(s) reference(s) them.
+ exch dup /XObject eq {
+ pop oforce {
+ dup oforce /Subtype get /Image eq {
+ images exch dadd
+ } {
+ omvisit
+ } ifelse pop
+ } forall
+ } {
+ /Font eq {
+ oforce { identifyfont pop } forall
+ } {
+ oforce omvisit
+ } ifelse
+ } ifelse
+ } forall
+ } if
+ % Visit the Contents stream(s).
+ dup /Contents .knownget { omvisit } if
+ % Visit Image XObjects. We don't try to visit them in
+ % reference order.
+ images { omvisit } daforall
+ % Visit FontFile streams. We don't try to visit them in
+ % reference order.
+ fontfiles { omvisit } daforall
+ pop
+ } visited end
+} bind def
+
+% Identify the objects of the first page.
+/identifyFirstPageObjects { % -identifyFirstPageObjects <obj#s>
+ Trailer /Root oget null
+ 1 index /PageMode knownoget {
+ /UseOutlines eq {
+ 1 index /Outlines knownoget { exch pop } if
+ } if
+ } if exch pop
+ 1 identifyPageObjects
+} bind def
+
+% Identify the non-shared objects of the other pages, and the shared objects.
+/identifyOtherPageObjects { % - identifyOtherPageObjects [<pageobj#s> ...]
+ % <sharedobj#s>
+ 4 dict begin
+ /marks lstring Objects llength lgrowto def
+ % Mark document-level and first page objectsw.
+ [CatalogNs FirstPageNs] {
+ { marks exch 255 lput } forall
+ } forall
+ % Collect objects of other pages and identify sharing.
+ [ 2 1 pdfpagecount { null exch identifyPageObjects } for ]
+ dup {
+ { marks exch 2 copy lget 1 add 254 .min lput } forall
+ } forall
+ [ exch {
+ [ exch {
+ marks 1 index lget 1 ne { pop } if
+ } forall ]
+ } forall ]
+ [ 1 1 marks llength 1 sub {
+ marks 1 index lget dup 1 le exch 255 eq or { pop } if
+ } for ]
+ end
+} bind def
+
+% Identify objects not associated with any page.
+/identifyNonPageObjects { % - identifyNonPageObjects <obj#s>
+ 4 dict begin
+ /marks lstring Objects llength lgrowto def
+ [[[LPDictN PHSN] CatalogNs FirstPageNs SharedNs] OtherPageNs] {
+ { { marks exch 1 lput } forall } forall
+ } forall
+ %****** PUT THESE IN A REASONABLE ORDER ******
+ [ 1 1 Objects llength 1 sub {
+ marks 1 index lget 0 eq {
+ Generations 1 index lget 0 eq { pop } if
+ } {
+ pop
+ } ifelse
+ } for ]
+} bind def
+
+% ---------------- Assign object numbers ---------------- %
+
+% Assign object numbers to all objects that will be copied.
+% Return the first (translated) object number in the First Page xref table.
+/assignObjectNumbers { % - assignObjectNumbers -
+ OtherPageNs { { omap pop } forall } forall
+ SharedNs { omap pop } forall
+ NonPageNs { omap pop } forall
+ % Assign object numbers for the First Page xref table last.
+ LPDictN omap % don't pop, this is the return value
+ CatalogNs { omap pop } forall
+ FirstPageNs { omap pop } forall
+ PHSN omap pop
+} bind def
+
+% ---------------- Create the LPDict ---------------- %
+
+% Create the contents of the LPDict.
+/createLPDict { % <phsstart> <phsend> <firstpageend>
+ % <xref0start> <filelength> createLPDict -
+ LPDict
+ dup /Linearized 1 put
+ dup /L 4 -1 roll put % filelength
+ dup /T 4 -1 roll put % xref0start
+ dup /E 4 -1 roll put % firstpageend
+ dup /H 5 -2 roll 1 index sub 2 array astore put % phsstart, end-start
+ dup /O 1 pdffindpageref 0 get omap put
+ /N pdfpagecount put
+} bind def
+
+% ---------------- Adjust object positions ---------------- %
+
+/adjustObjectPositions { % <boundary> <deltabelow> <deltaabove>
+ % adjustObjectPositions -
+ % Objects fall into 4 categories: LPDict, PHS, Catalog, and others.
+ % We handle the first two as special cases.
+ XRef {
+ % Stack: bdy below above key loc
+ dup 5 index ge { 2 } { 3 } ifelse index add
+ XRef 3 1 roll put
+ } forall pop pop pop
+ XRef LPDictN omap HeaderLength put
+ XRef PHSN omap PHSStart put
+} bind def
+
+% ---------------- Write the output file ---------------- %
+
+% Write objects identified by object number.
+/writeobjn { % <obj#> writeobjn -
+ Generations 1 index lget pdfwriteobj
+} bind def
+/writeobjns { % <obj#s> writeobjns -
+ { writeobjn } forall
+} bind def
+
+% Write a part of the output file.
+/writePart { % <proc> <label> writePart -
+ PDEBUG {
+ dup print ( start=) print
+ OFile { .fileposition } stopped { pop (???) } if =
+ 2 .execn
+ print ( end=) print
+ OFile { .fileposition } stopped { pop (???) } if =
+ } {
+ pop exec
+ } ifelse
+} bind def
+
+% Write the header.
+/writePart1 { % - writePart1 -
+ {
+ pdfwriteheader
+ } (part1) writePart
+} bind def
+
+% Write the linearization parameters dictionary.
+/writePart2 { % - writePart2 -
+ {
+ LPDictN writeobjn
+ } (part2) writePart
+} bind def
+
+% Write the First Page xref table and trailer.
+% Free variables: FirstPageXN.
+/writePart3 { % <xrefstart> writePart3 -
+ {
+ FirstPageXN NObjects 1 add 1 index sub pdfwritexref
+ Trailer dup length 1 add dict copy
+ dup /Size NObjects 1 add put
+ dup /Prev 4 -1 roll put
+ pdfwritetrailer
+ 0 pdfwritestartxref
+ } (part3) writePart
+} bind def
+
+% Write the Catalog and other required document-level objects.
+% Free variables: CatalogNs.
+/writePart4 { % - writePart4 -
+ {
+ CatalogNs writeobjns
+ } (part4) writePart
+} bind def
+
+% Write the Primary Hint Stream.
+/writePart5 { % - writePart5 -
+ {
+ PHSN writeobjn
+ } (part5) writePart
+} bind def
+
+% Write the First Page's objects.
+% Free variables: FirstPageNs.
+/writePart6 { % - writePart6 -
+ {
+ FirstPageNs writeobjns
+ } (part6) writePart
+} bind def
+
+% Write the objects of other pages (Page + non-shared objects).
+% Free variables: OtherPageNs.
+/writePart7 { % - writePart7 <lengths>
+ {
+ [ OtherPageNs {
+ OFile fileposition exch
+ writeobjns OFile fileposition exch sub
+ } forall ]
+ } (part7) writePart
+} bind def
+
+% Write the shared objects of other pages.
+% Free variables: SharedNs.
+/writePart8 { % - writePart8 -
+ {
+ SharedNs writeobjns
+ } (part8) writePart
+} bind def
+
+% Write the other objects not associated with pages.
+% Free variables: NonPageNs.
+/writePart9 { % - writePart9 -
+ {
+ NonPageNs writeobjns
+ } (part9) writePart
+} bind def
+
+% Write the main xref table and trailer.
+% Free variables: FirstPageXN.
+/writePart11xref { % writePart11 -
+ {
+ 0 FirstPageXN pdfwritexref
+ } (part11xref) writePart
+} bind def
+/writePart11rest { % <part3start> writePart11rest -
+ {
+ << /Size FirstPageXN >> pdfwritetrailer
+ pdfwritestartxref
+ } (part11rest) writePart
+} bind def
+
+% ---------------- Write hint tables ---------------- %
+
+/bitsneeded { % <maxvalue> bitsneeded <#bits>
+ 0 exch { dup 0 eq { pop exit } if exch 1 add exch 2 idiv } loop
+} bind def
+
+% Find the start and end of objects in the output.
+/omstart { % <obj#> omstart <pos>
+ PDEBUG { (start\() print dup =only } if
+ omap
+ PDEBUG { (=>) print dup =only } if
+ XRef exch get
+ PDEBUG { (\) = ) print dup = } if
+} bind def
+/omend { % <obj#> omend <pos>
+ % The end of an object is the start of the next object.
+ % The caller must be sure that this object is not the last one
+ % in part 9.
+ PDEBUG { (end\() print dup =only } if
+ omap
+ PDEBUG { (=>) print dup =only } if
+ 1 add
+ % Check that the requested object wasn't the last one in part 6:
+ % the next object in the output file is the first in part 7.
+ PHSN omap 1 index eq { pop 1 } if
+ XRef exch get
+ PDEBUG { (\) = ) print dup = } if
+} bind def
+/omlength { % <obj#> omlength <length>
+ dup omend exch omstart sub
+} bind def
+
+% Find the Contents of a page.
+/contentsobjects { % <pagedict> contentsobjects <firstobj#> <lastobj#>
+ /Contents get
+ dup oforce dup type /dicttype eq {
+ pop dup
+ } {
+ dup 0 get exch dup length 1 sub get
+ } ifelse
+ exch 0 get exch 0 get
+} bind def
+/contentsstart { % <pagedict> contentsstart <pos>
+ contentsobjects pop omstart
+} bind def
+/contentslength { % <pagedict> contentslength <length>
+ contentsobjects omend exch omstart sub
+} bind def
+
+
+/writePageOffsetHints {
+ PDEBUG { /writePageOffsetHints == } if
+ 20 dict begin
+ /bits OFile bitstream def
+ /bwn { bits 3 1 roll bitwrite } def
+
+ % Calculate least length of a page.
+ FirstPageLength OtherPageLengths { .min } forall
+ /minpl exch def
+ % Calculate least contents length.
+ FirstPageNs 0 get Objects exch lget contentslength
+ OtherPageNs { 0 get Objects exch lget contentslength .min } forall
+ /mincl exch def
+
+ % The Adobe documentation says that all versions of Acrobat
+ % require item 8 (mincl) to be zero. Patch this here.
+ /mincl 0 def
+
+ % Calculate bits needed to represent greatest page length.
+ FirstPageLength OtherPageLengths { .max } forall
+ minpl sub bitsneeded /maxplbits exch def
+ % Calculate bits needed to represent the greatest Contents length.
+ FirstPageNs 0 get Objects exch lget contentslength
+ OtherPageNs { 0 get Objects exch lget contentslength .max } forall
+ mincl sub bitsneeded /maxclbits exch def
+
+ % Per Adobe documentation, Acrobat requires that item 5 (maxplbits)
+ % be equal to item 9 (maxclbits). Set both to the max of the two.
+ maxplbits maxclbits .max /maxplbits 1 index def /maxclbits exch def
+
+ % 1: Least number of objects in a page:
+ FirstPageNs length OtherPageNs { length .min } forall
+ /minnop 1 index def 32 bwn
+ % 2: Location of first page's Page object:
+ FirstPageNs 0 get omap XRef exch get 32 bwn
+ % 3: Bits needed to represent greatest # of objects in a page:
+ FirstPageNs length OtherPageNs { length .max } forall
+ minnop sub bitsneeded /maxnopbits 1 index def 16 bwn
+ % 4: Least length of a page:
+ minpl 32 bwn
+ % 5: Bits needed to represent the greatest page length:
+ maxplbits 16 bwn
+ % 6: Least start of Contents offset:
+ 0 % (Acrobat requires that this be 0.)
+ /minsco 1 index def 32 bwn
+ % 7: Bits needed to represent the greatest start of Contents
+ % offset:
+ 0 % (Acrobat ignores this.)
+ /maxscobits 1 index def 16 bwn
+ % 8: Least contents length:
+ mincl 32 bwn
+ % 9: Bits needed to represent the greatest Contents length:
+ maxclbits 16 bwn
+ % 10: Bits needed to represent the greatest number of Shared
+ 0 % Object references (we don't report any):
+ /maxsorbits 1 index def 16 bwn
+ % 11: Bits needed to identify a Shared Object (we don't
+ 0 % report any):
+ /sobits 1 index def 16 bwn
+ % 12: Bits needed to represent numerator of fraction (only
+ 0 % needed for Shared Object references, which we don't report):
+ /numfbits 1 index def 16 bwn
+ % 13: Denominator of fraction (only needed for Shared Object
+ % references, which we don't report):
+ 255 % arbitrary
+ /denf 1 index def 16 bwn
+
+ % Number of objects in pages:
+ FirstPageNs length minnop sub maxnopbits bwn
+ OtherPageNs {
+ length minnop sub maxnopbits bwn
+ } forall
+
+ % Total length of pages in bytes;
+ FirstPageLength minpl sub maxplbits bwn
+ OtherPageLengths {
+ minpl sub maxplbits bwn
+ } forall
+
+ % Number of shared objects referenced from page:
+ % (Currently we don't report this.)
+ OtherPageNs length 1 add { 0 maxsorbits bwn } repeat
+
+ % Since there are no shared object references,
+ % the next two sections are empty.
+
+ % Contents offsets:
+ [FirstPageNs OtherPageNs aload pop] {
+ 0 get Objects exch lget contentsstart minsco sub maxscobits bwn
+ } forall
+
+ % Contents lengths:
+ [FirstPageNs OtherPageNs aload pop] {
+ 0 get Objects exch lget contentslength mincl sub maxclbits bwn
+ } forall
+
+ bits bitflush end
+} bind def
+
+/writeSharedObjectHints {
+ PDEBUG { /writeSharedObjectHints == } if
+ 20 dict begin
+ /bits OFile bitstream def
+ /bwn { bits 3 1 roll bitwrite } def
+
+ % Currently we use the Shared Object hint table only for
+ % the objects in the first page, which are all treated as
+ % "shared" objects.
+
+ % Object number of first object in Shared Objects section
+ % (not currently used):
+ 0 32 bwn
+ % Location of first object in Shared Objects section
+ % (not currently used): If there are no shared objects,
+ % Acrobat sets this to the location of linearization
+ % parameters object (the very first object).
+ { pdfwriteheader } tomemory length 32 bwn
+ % Number of Shared Object entries for first page:
+ FirstPageNs length 32 bwn
+ % Number of Shared Object entries for Shared Objects
+ % section (not currently used):
+ FirstPageNs length 32 bwn
+ % Bits needed to represent the greatest number of objects
+ % in a shared object group (always 0, because all groups
+ % have only 1 object):
+ 0 16 bwn
+ % Least length of a Shared Object Group in bytes:
+ 16#7fffffff FirstPageNs { omlength .min } forall
+ /minsol 1 index def 32 bwn
+ % Bits needed to represent the greatest length of a
+ % Shared Object Group:
+ 0 FirstPageNs { omlength .max } forall
+ minsol sub bitsneeded
+ /maxsolbits 1 index def 16 bwn
+
+ % Lengths of shared object groups:
+ FirstPageNs { omlength minsol sub maxsolbits bwn } forall
+
+ % MD5 flag:
+ 0 1 bwn
+
+ bits bitflush end
+} bind def
+
+% ---------------- Main program ---------------- %
+
+/tmpprefix (/tmp/) def
+
+/pdfOptimize { % <infile> <outfile> pdfOptimize -
+ realtime 3 1 roll
+ exch pdfdict begin pdfopenfile dup begin
+ 40 dict begin
+ /IDict exch def
+ /OFile exch def
+ /starttime exch def
+ /now {
+ QUIET { pop } { print (, t = ) print realtime starttime sub = flush } ifelse
+ } def
+ omapinit
+
+ % Create and open a temporary file.
+
+ null (w) .tempfile /TFile exch def /TFileName exch def
+ .setsafe
+
+ % Read all objects into memory.
+
+ Trailer touch
+ (Read objects) now
+
+ % Replace indirect references to numbers. This is needed
+ % for the Length of streams, and doesn't hurt anything else.
+
+ replaceReferences
+ (Replaced references) now
+
+ % Create the two new objects: the linearization parameter
+ % dictionary, and the Primary Hint Stream.
+
+ /LPDict 10 dict def
+ /PHS 10 dict cvx def % executable = stream
+ [LPDict PHS] createObjects
+ /LPDictN 1 index def 1 add
+ /PHSN exch def
+ PDEBUG { << /LPDictN LPDictN /PHSN PHSN >> === } if
+
+ % Count the number of objects in the output.
+
+ 0 0 1 Objects llength 1 sub {
+ Generations exch lget 0 ne { 1 add } if
+ } for
+ /NObjects exch def
+ QUIET not { NObjects =only ( objects total) = flush } if
+
+ % Propagate inherited attributes down the page tree.
+
+ propagateAttributes
+ (Propagated attributes) now
+
+ % Identify the document-level objects (part 4).
+
+ identifyDocumentObjects /CatalogNs exch def
+ QUIET not { CatalogNs === flush } if
+ (Identified Catalog) now
+
+ % Identify the first page's objects (part 6),
+ % including the Outlines tree if appropriate.
+
+ pdfopencache
+ /FirstPageNs identifyFirstPageObjects def
+ QUIET not { FirstPageNs === flush } if
+ (Identified first page) now
+
+ % Identify shared vs. non-shared objects for remaining pages
+ % (parts 7 and 8).
+
+ identifyOtherPageObjects
+ /SharedNs exch def
+ /OtherPageNs exch def
+ QUIET not { OtherPageNs === flush SharedNs === flush } if
+ (Identified other pages) now
+
+ % Identify objects not associated with any page (part 9).
+
+ /NonPageNs identifyNonPageObjects def
+ QUIET not { NonPageNs === flush } if
+ (Identified non-pages) now
+
+ % Assign final object numbers to all the objects.
+ % (The omap is currently empty.)
+
+ /FirstPageXN assignObjectNumbers def
+ (Assigned objects #s) now
+
+ % Write the document-level objects (part 4).
+
+ { writePart4 } totemp
+ /CatalogTempEnd exch def /CatalogTempStart exch def
+ (Wrote Catalog) now
+
+ % Write the first page's objects (part 6).
+
+ { writePart6 } totemp
+ /FirstPageTempEnd exch def /FirstPageTempStart exch def
+ (Wrote first page) now
+
+ % Write the non-shared objects for other pages (part 7).
+
+ { writePart7 /OtherPageLengths exch def } totemp
+ /OtherPageTempEnd exch def /OtherPageTempStart exch def
+ (Wrote other pages) now
+
+ % Write the shared objects for other pages (part 8).
+
+ { writePart8 } totemp
+ /SharedTempEnd exch def /SharedTempStart exch def
+ (Wrote shared objects) now
+
+ % Write the objects not associated with pages (part 9).
+
+ { writePart9 } totemp
+ /NonPageTempEnd exch def /NonPageTempStart exch def
+
+ % Compute conservative lengths of parts 2,3,5,11 of the output.
+ % It's OK for these to be too large, but not too small.
+
+ % Make dummy XRef entres for LPDict and PHS.
+ XRef LPDictN omap 0 put
+ XRef PHSN omap 0 put
+
+ /HeaderLength { % this is exact
+ writePart1 % part 1
+ } tolength def
+ /CatalogLength % this is exact
+ CatalogTempEnd CatalogTempStart sub def % part 4
+ /FirstPageLength % this is exact
+ FirstPageTempEnd FirstPageTempStart sub def % part 6
+ /OtherObjectsLength % this is exact
+ NonPageTempEnd OtherPageTempStart sub def % parts 7,8,9
+ /ObjectsLength % this is exact
+ CatalogLength FirstPageLength add OtherObjectsLength add def
+ /XrefLength { % part 11
+ % The LPDict must end within the first 1024 bytes,
+ % so the start of the FirstPage xref table can't exceed 1024.
+ writePart11xref 1024 writePart11rest
+ } tolength def
+ /NominalFileLength % Make a generous allowance for parts 2,3,5.
+ HeaderLength ObjectsLength 3 mul add 10000 add 99999 .max def
+ /FirstPageXrefLength { % part 3
+ NominalFileLength writePart3
+ } tolength def
+ /LPDictLength { % part 2
+ NominalFileLength dup 2 mul 2 copy add 1 index dup createLPDict writePart2
+ } tolength def
+
+ % Compute a few additional values from the above.
+
+ /XrefBeginLength {
+ (xref\n0 ) ows
+ OFile FirstPageXN write=
+ } tolength def
+ HeaderLength LPDictLength add
+ /FirstPageXrefStart 1 index def
+ FirstPageXrefLength add
+ /CatalogStart 1 index def
+ CatalogLength add % phsstart
+ /PHSStart exch def
+
+ % Adjust the object positions ignoring PHS.
+ % (Writing the PHS needs these.)
+
+ 0 0 CatalogStart CatalogTempStart sub adjustObjectPositions
+ % Make a temporary XRef entry for the PHS, for the benefit of omend.
+ XRef PHSN omap CatalogStart put
+ (Adjusted positions) now
+
+ % Construct the hint tables (part 5).
+
+ { writePageOffsetHints } totemp
+ pop /PHSTempStart exch def
+ { writeSharedObjectHints } totemp
+ exch PHSTempStart sub PHS /S 3 -1 roll put
+ PHSTempStart sub /PHSTempLength exch def
+ (Wrote hints) now
+
+ % Prepare to read TFile.
+ TFile closefile
+ /TFile TFileName (r) file def
+
+ PHS
+ dup /File TFile put
+ dup /FilePosition PHSTempStart put
+ dup /Length PHSTempLength put
+ pop
+ /PHSLength { writePart5 } tolength def
+
+ % Construct the linearization parameter dictionary (part 2).
+
+ PHSStart
+ dup PHSLength add % phsend
+ /FirstPageStart 1 index def
+ dup FirstPageLength add % firstpageend
+ dup OtherObjectsLength add
+ /XrefStart 1 index def
+ XrefBeginLength add % xref0start
+ dup XrefBeginLength sub XrefLength add % fileend
+ % Because of a bug, Acrobat Reader doesn't recognize any file
+ % shorter than 1K as linearized. Patch this here.
+ 1024 .max
+ /FileLength 1 index def
+ createLPDict
+
+ % Adjust the object positions again, taking the PHS into account.
+
+ PHSStart 0 PHSLength adjustObjectPositions
+ (Readjusted positions) now
+
+ % Finally, write the output file.
+
+ writePart1
+ writePart2
+ FirstPageXrefStart padto
+ XrefStart writePart3
+ CatalogStart padto
+ CatalogTempStart CatalogTempEnd copyrange % part 4
+ writePart5
+ FirstPageStart padto
+ FirstPageTempStart NonPageTempEnd copyrange % parts 6,7,8,9
+ % No Overflow Hint Stream (part 10).
+ XrefStart padto
+ writePart11xref
+ { FirstPageXrefStart writePart11rest } tomemory
+ FileLength 1 index length sub padto ows
+ (Wrote output file) now
+
+ % Wrap up.
+
+ TFile closefile TFileName deletefile
+ end % temporary dict
+ end % IDict
+} bind def
+
+end % pdfoptdict
+.setglobal
+
+% Check for command line arguments.
+[ shellarguments {
+ ] dup length 2 eq {
+ % Load the pdfwrite utilities if necessary.
+ /omapinit where { pop } { (pdfwrite.ps) runlibfile } ifelse
+ save exch
+ aload pop exch (r) file exch (w) file
+ 3000000 setvmthreshold
+ pdfoptdict begin pdfOptimize end
+ restore
+ } {
+ (Usage: gs -dNODISPLAY -- pdfopt.ps input.pdf output.pdf) = flush quit
+ } ifelse
+} {
+ pop
+} ifelse
diff --git a/Master/xemtex/gslib/pdfwrite.ps b/Master/xemtex/gslib/pdfwrite.ps
new file mode 100644
index 00000000000..922bfaafd1a
--- /dev/null
+++ b/Master/xemtex/gslib/pdfwrite.ps
@@ -0,0 +1,284 @@
+% Copyright (C) 1999, 2000, 2001 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: pdfwrite.ps,v 1.7.2.1.2.1 2003/04/12 14:02:39 giles Exp $
+% Writer for transmuting PDF files.
+
+% NOTES:
+% We do editing by replacing objects (in the cache) and then doing a
+% simple recursive walk with object renumbering.
+% Free variables:
+% RMap [per input file] (dict): input_obj# => output_obj#
+% PDFfile (file): current input file
+% OFile (file): current output file
+% XRef (dict): output_obj# => output_file_pos
+% ToWrite: 0..N-1 => [obj# gen#]
+
+/.setlanguagelevel where { pop 2 .setlanguagelevel } if
+.currentglobal true .setglobal
+
+/PDEBUG where { pop } { /PDEBUG false def } ifelse
+
+% ================ Object mapping ================ %
+
+% Initialize the object number and location map.
+/omapinit { % - omapinit -
+ /RMap 100 dict def
+ /XRef 100 dict def
+ PDEBUG { (omapinit) = } if
+} def
+
+% Map an object number.
+/omapnew { % <oldobj#> omap <newobj#> <isnew>
+ RMap 1 index .knownget {
+ exch pop false
+ } {
+ PDEBUG { (omap\() print dup =only } if
+ RMap dup length 1 add 2 index exch dup 5 1 roll put pop true
+ PDEBUG { (\) = ) print 1 index = } if
+ } ifelse
+} def
+/omap { % <oldobj#> omap <newobj#>
+ omapnew pop
+} bind def
+
+% Save and restore the object map.
+% Note that currentomap either returns a copy or calls omapinit.
+/currentomap { % <copy> currentomap <omap>
+ {
+ [RMap dup length dict copy XRef dup length dict copy]
+ } {
+ [RMap XRef] omapinit
+ } ifelse
+} bind def
+/setomap { % <omap> setomap -
+ aload pop /XRef exch def /RMap exch def
+ PDEBUG {
+ (setomap: #Xref = ) print XRef length =only
+ (, #RMap = ) print RMap length =
+ } if
+} bind def
+
+% ================ Writing ================ %
+
+% ---------------- Low-level output ---------------- %
+
+% Write a string on the output file.
+/ows { % <string> ows -
+ OFile exch writestring
+} def
+
+% ---------------- Scalars ---------------- %
+
+% Note that the '#' character isn't legal in a name unless it is a prefix
+% for a hex encoded character (for PDF 1.2 and later). The following assumes
+% that the names are already valid PDF 1.2+ names so that we can treat the
+% '#' as a legal character. The next two hex characters are already in the
+% set of valid name characters. PDF 1.1 and earlier allowed spaces in names
+% which probably wouldn't make it past the tokenizer anyway.
+/pdfnamechars
+ (!"#$&'*+,-.0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\\^_`abcdefghijklmnopqrstuvwxyz|~)
+readonly def
+/pdfwritename { % <name> pdfwritename -
+ (/) ows .namestring {
+ ( ) dup 0 4 -1 roll put
+ //pdfnamechars 1 index search {
+ pop pop pop
+ } {
+ pop 0 get 256 add 16 =string cvrs
+ dup 0 (#) 0 get put
+ } ifelse ows
+ } forall
+} def
+
+% ---------------- Composite objects ---------------- %
+
+/pdfwriteprocs mark
+ /resolveR { pdfwriteref }
+ /O { pdfwritenewref }
+.dicttomark readonly def
+/pdfwritearray { % <array> pdfwritearray -
+ dup xcheck {
+ aload pop //pdfwriteprocs exch get exec
+ } {
+ % Because of a bug in Acrobat's parser for linearization parameters,
+ % we have to include some whitespace after the opening [ (!).
+ ([ ) ows { pdfwritevalue (\n) ows } forall (]) ows
+ } ifelse
+} def
+
+/pdfwritedict { % <dict> pdfwritedict -
+ dup xcheck {
+ pdfwritestream
+ } {
+ (<<) ows {
+ exch pdfwritevalue ( ) ows pdfwritevalue (\n) ows
+ } forall (>>) ows
+ } ifelse
+} def
+
+% ---------------- References ---------------- %
+
+/pdfwritenewref { % <newobj#> pdfwritenewref -
+ OFile exch write=only ( 0 R) ows
+} def
+
+/pdfwriteref { % <obj#> <gen#> pdfwriteref -
+ 1 index omapnew {
+ ToWrite dup length 5 -2 roll 2 packedarray put
+ } {
+ exch pop exch pop
+ } ifelse
+ pdfwritenewref
+} def
+
+/pdfcopystring 200 string def
+/pdfwritestream { % <streamdict> pdfwritestream -
+ % Remove File, FilePosition, and StreamKey;
+ % optimize by replacing an indirect Length.
+ dup dup length dict copy
+ % Stack: origdict dict
+ dup /File undef dup /FilePosition undef dup /StreamKey undef
+ dup /Length get dup oforce ne {
+ dup /Length 2 copy oget put
+ } if
+ exch dup /File get dup 3 -1 roll /FilePosition get setfileposition
+ pdfcopystream
+} def
+
+% We put copying the stream contents in separate procedures so that we
+% can replace this function if desired.
+/pdfcopybytes { % <fromfile> <tofile> <length> pdfcopybytes -
+ {
+ dup 0 eq { exit } if
+ //pdfcopystring 0 2 index 2 index length .min getinterval
+ 3 index exch readstring 3 1 roll
+ 3 index 1 index writestring length sub exch not { exit } if
+ } loop pop pop pop
+} def
+/pdfcopystream { % <newstreamdict> <file> pdfcopystream -
+ % (file has been positioned)
+ 1 index pdfwritevalue (stream\n) ows
+ exch /Length get OFile exch pdfcopybytes
+ (endstream) ows
+} def
+
+% ---------------- General values/objects ---------------- %
+
+/pdfwritetypes mark
+ % Scalars
+ /nulltype { pop (null) ows }
+ /integertype { =string cvs ows }
+ /booleantype 1 index
+ /realtype { OFile exch write===only }
+ /stringtype 1 index
+ /nametype { pdfwritename }
+ % Composite/reference objects
+ /arraytype { pdfwritearray }
+ /packedarraytype 1 index
+ /dicttype { pdfwritedict }
+.dicttomark readonly def
+
+/pdfwritevalue { % <obj> pdfwritevalue -
+ PDEBUG { (****Writing: ) print dup === flush } if
+ //pdfwritetypes 1 index type get exec
+} def
+
+% We make pdfwriteobjdef a separate procedure for external use.
+/pdfwriteobjheader { % <newobj#> pdfwriteobjheader -
+ XRef 1 index OFile .fileposition put
+ PDEBUG { (XRef\() print dup =only (\) = ) print XRef 1 index get = } if
+ OFile exch write=only ( 0 obj\n) ows
+} def
+/pdfwriteobjdef { % <newobj#> <value> pdfwriteobjdef -
+ exch pdfwriteobjheader
+ pdfwritevalue (\nendobj\n) ows
+} def
+/pdfwriteobj { % <obj#> <gen#> pdfwriteobj -
+ 1 index exch resolveR exch omap exch pdfwriteobjdef
+} def
+
+% ---------------- File-level entities ---------------- %
+
+% Write a PDF file header.
+% Free variables: OFile, PDFversion.
+/pdfwriteheader { % - pdfwriteheader -
+ (%PDF-) ows OFile PDFversion write=
+ (%\347\363\317\323\n) ows
+} bind def
+
+% Write a cross-reference table and trailer.
+/pdfwritexref { % <firstobj#> <#objs> pdfwritexref -
+ (xref\n) ows
+ OFile 2 index write=only ( ) ows OFile 1 index write=
+ 1 index add 1 sub 1 exch {
+ dup 0 eq {
+ pop (0000000000 65535 f \n) ows
+ } {
+ XRef exch get 1000000000 add =string cvs
+ dup 0 (0) 0 get put
+ ows ( 00000 n \n) ows
+ } ifelse
+ } for
+} bind def
+/pdfwritetrailer { % <trailer> pdfwritetrailer -
+ (trailer\n) ows pdfwritevalue (\n) ows
+} bind def
+/pdfwritestartxref { % <startpos> pdfwritestartxref -
+ (startxref\n) ows OFile exch write=
+ (%%EOF\n) ows
+} bind def
+
+% ================ Top-level control ================ %
+
+/pdfwrite { % <file> <trailer> pdfwrite -
+ 10 dict begin
+ /trailer exch def
+ /OFile exch def
+ /ToWrite 100 dict def
+ omapinit
+
+ % Write the PDF file header.
+
+ pdfwriteheader
+
+ % Write the objects.
+
+ trailer {
+ exch pop dup xcheck { % The only executable objects are references.
+ aload pop pop pdfwriteobj
+ } {
+ pop
+ } ifelse
+ } forall
+ % Walk the object graph.
+ {
+ ToWrite dup length dup 0 eq { pop pop exit } if
+ 1 sub 2 copy get 3 1 roll undef aload pop pdfwriteobj
+ } loop
+
+ % Write the xref table and trailer.
+
+ /xref OFile fileposition def
+ 0 XRef length 1 add pdfwritexref
+ trailer dup length 1 add dict copy
+ dup /Size XRef length 1 add put pdfwritetrailer
+ xref pdfwritestartxref
+
+ end
+} def
+
+.setglobal
diff --git a/Master/xemtex/gslib/pf2afm b/Master/xemtex/gslib/pf2afm
new file mode 100644
index 00000000000..6e36d3e1f61
--- /dev/null
+++ b/Master/xemtex/gslib/pf2afm
@@ -0,0 +1,8 @@
+#!/bin/sh
+# $Id: pf2afm,v 1.2 2001/02/03 21:31:40 alexcher Exp $
+# 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.
+
+exec gs -q -dNODISPLAY -dSAFER -dDELAYSAFER -- pf2afm.ps "$@"
diff --git a/Master/xemtex/gslib/pf2afm.bat b/Master/xemtex/gslib/pf2afm.bat
new file mode 100644
index 00000000000..ec03a6ccd20
--- /dev/null
+++ b/Master/xemtex/gslib/pf2afm.bat
@@ -0,0 +1,17 @@
+@echo off
+@rem $Id: pf2afm.bat,v 1.3 2001/06/22 16:09:22 lpd Exp $
+@rem Make an AFM file from PFB / PFA and (optionally) PFM files.
+
+if %1/==/ goto usage
+if not %2/==/ goto usage
+call gssetgs.bat
+
+%GSC% -q -dNODISPLAY -dSAFER -dDELAYSAFER -- pf2afm.ps %1
+goto end
+
+:usage
+echo "Usage: pf2afm disk_font_name"
+
+:end
+
+
diff --git a/Master/xemtex/gslib/pf2afm.cmd b/Master/xemtex/gslib/pf2afm.cmd
new file mode 100755
index 00000000000..2165e988d96
--- /dev/null
+++ b/Master/xemtex/gslib/pf2afm.cmd
@@ -0,0 +1,7 @@
+/* $Id: pf2afm.cmd,v 1.2 2001/02/03 21:31:40 alexcher Exp $ */
+/*
+ * 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 -dSAFER -dDELAYSAFER -- pf2afm.ps %1
diff --git a/Master/xemtex/gslib/pf2afm.ps b/Master/xemtex/gslib/pf2afm.ps
new file mode 100644
index 00000000000..3bc9013f8f7
--- /dev/null
+++ b/Master/xemtex/gslib/pf2afm.ps
@@ -0,0 +1,497 @@
+%!
+% 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
+
+% $Id: pf2afm.ps,v 1.3.2.1 2002/04/10 09:22:58 giles Exp $
+
+% 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
+
+% charnumber print-charname -
+% prints the name of the encoded character
+/print-charname {
+ PFBencoding 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) 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) 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
+ skipb-p % PFM: CharSet
+ 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) 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 =string cvs 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?) 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
+
+% pf[ba]filename makeafm -
+
+/makeafm {
+ count 0 eq {(Missing font file name) printquit} if
+ /ifn edef
+ ifn length 0 eq {(Empty font file name) 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
+ ifn (.pfb) search {
+ 3 -1 roll length 0 eq {% file name extension = ".pfb"
+ ifn dup length string copy /pfbn edef
+ /ifn edef
+ }{pop} ifelse
+ } if pop
+ ifn (.pfa) search {
+ 3 -1 roll length 0 eq {% file name extension = ".pfa"
+ ifn dup length string copy /pfan edef
+ /ifn edef
+ }{pop} ifelse
+ } if pop
+ 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) printquit
+ } if
+
+ /ofn ifn (.afm) concatstrings def
+ ofn status {
+ pop pop pop pop (Resulting file exists) printquit
+ } if
+ /ofi ofn (w) file def
+ //systemdict /.setsafe known { .setsafe } if
+
+ /pfmn ifn (.pfm) concatstrings def
+ pfmn status {
+ pop pop pop pop
+ }{
+ () pfmn {
+ (/) search {
+ 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) print
+ } ifelse
+ } ifelse
+
+ 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)
+ (Usage: gs [-dNODISPLAY] -- pf2afm.ps disk_font_name\n) printquit
+ } ifelse
+ }
+ {pop}
+ifelse
diff --git a/Master/xemtex/gslib/pfbtopfa b/Master/xemtex/gslib/pfbtopfa
new file mode 100644
index 00000000000..1e914fb53fd
--- /dev/null
+++ b/Master/xemtex/gslib/pfbtopfa
@@ -0,0 +1,16 @@
+#!/bin/sh
+# $Id: pfbtopfa,v 1.3 2001/06/22 16:09:22 lpd Exp $
+# Convert .pfb fonts to .pfa format
+
+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 -q -dNODISPLAY -- pfbtopfa.ps "$1" "$outfile"
diff --git a/Master/xemtex/gslib/pfbtopfa.ps b/Master/xemtex/gslib/pfbtopfa.ps
new file mode 100644
index 00000000000..886d9eef471
--- /dev/null
+++ b/Master/xemtex/gslib/pfbtopfa.ps
@@ -0,0 +1,35 @@
+% Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: pfbtopfa.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% 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/Master/xemtex/gslib/pftogsf.bat b/Master/xemtex/gslib/pftogsf.bat
new file mode 100644
index 00000000000..3808852cacd
--- /dev/null
+++ b/Master/xemtex/gslib/pftogsf.bat
@@ -0,0 +1,20 @@
+@echo off
+@rem $Id: pftogsf.bat,v 1.2 2000/05/20 20:53:05 lpd Exp $
+
+rem ******************************
+rem * Convert .pf? files to .gsf *
+rem ******************************
+
+call gssetgs.bat
+echo (wrfont.ps) run (unprot.ps) run unprot >_temp_.ps
+echo systemdict /definefont. /definefont load put >>_temp_.ps
+echo systemdict /definefont { userdict /LFN 3 index put definefont. } bind put >>_temp_.ps
+echo ARGUMENTS 0 get (r) file .loadfont LFN findfont setfont prunefont reprot >>_temp_.ps
+echo ARGUMENTS 1 get (w) file dup writefont closefile quit >>_temp_.ps
+rem for %%f in (cyr cyri) do %GSC% -q -dNODISPLAY -dWRITESYSTEMDICT -- _temp_.ps fonts\pfa\%%f.pfa fonts\%%f.gsf
+rem for %%f in (ncrr ncrb ncrri ncrbi) do %GSC% -q -dNODISPLAY -dWRITESYSTEMDICT -- _temp_.ps fonts\pfa\%%f.pfa fonts\%%f.gsf
+rem for %%f in (bchr bchb bchri bchbi) do %GSC% -q -dNODISPLAY -dWRITESYSTEMDICT -- _temp_.ps fonts\pfa\%%f.pfa fonts\%%f.gsf
+rem for %%f in (putr putb putri putbi) do %GSC% -q -dNODISPLAY -dWRITESYSTEMDICT -- _temp_.ps fonts\pfa\%%f.pfa fonts\%%f.gsf
+rem for %%f in (n019003l n021003l u003043t u004006t) do %GSC% -q -dNODISPLAY -dWRITESYSTEMDICT -- _temp_.ps fonts\%%f.gsf %%f.gsf
+for %%f in (hig_____ kak_____) do %GSC% -q -dNODISPLAY -dWRITESYSTEMDICT -- _temp_.ps fonts\pfb\%%f.pfb %%f.gsf
+rem %GSC% -q -dNODISPLAY -dWRITESYSTEMDICT -- _temp_.ps allfonts\baxter.pfb baxter.gsf
diff --git a/Master/xemtex/gslib/pj-gs.sh b/Master/xemtex/gslib/pj-gs.sh
new file mode 100644
index 00000000000..7f8eaa78c85
--- /dev/null
+++ b/Master/xemtex/gslib/pj-gs.sh
@@ -0,0 +1,289 @@
+#!/bin/sh
+# $Id: pj-gs.sh,v 1.1 2000/03/09 08:40:40 lpd Exp $
+
+# PaintJet driver script for Ghostscript,
+# created by Philippe-Andre Prindeville <philipp@res.enst.fr>
+
+# PCL level 1 interface
+#
+#=======================================================================#
+# OPTIONS RECOGNIZED: ( all may be preceded with a "-" ) #
+# NOTE: Options marked with a "*" before their descriptions #
+# are provided for backward compatibility with the #
+# former hp2225a, hp2227a and hp3630a printer models - #
+# these models have become links to this model. Consult #
+# your printer reference manual to determine which #
+# options are valid for your particular printer. #
+# #
+# Horizontal Pitch Selection: #
+# c compressed print mode #
+# e * expanded print pitch #
+# 10 * 10 cpi (Pica print pitch) #
+# (expanded compressed on thinkjet and quietjet)#
+# 12 * 12 cpi (Elite print pitch) #
+# #
+# Print Quality Selection #
+# q | lq * near letter quality #
+# #
+# Font Selection #
+# b | bold * set font stroke weight to bold #
+# #
+# Output filtering: (Default Cooked) #
+# r | raw raw mode for plotting mode etc. #
+# #
+# Other: #
+# nb do not output banner page (to save paper) #
+# #
+# NOTE: * = NOT OFFICIAL PCL LEVEL 1 OPTIONS, USE OF #
+# THESE OPTIONS MAY OR MAY NOT PRODUCE #
+# DESIRED RESULTS. #
+#=======================================================================#
+
+PATH="/bin:/usr/bin:/usr/lib:/usr/local/bin"
+export PATH
+
+# set up redirection of stderr
+log=/usr/spool/lp/log
+exec 2>>$log
+
+# sec_class=`getconf SECURITY_CLASS`
+sec_class=
+if [ $? -ne 0 ]
+then
+ echo "getconf SECURITY_CLASS failed"
+fi
+
+# Save the arguments to the model
+printer=`basename $0`
+
+if [ "$sec_class" = "2" ] # B1 Trusted System
+then
+ reqid=$1
+ user=$2
+ dev=$3
+ title=$4
+ copies=$5
+ options=$6
+else
+ reqid=$1
+ user=$2
+ title=$3
+ copies=$4
+ options=$5
+fi
+
+
+# Definitions of functions used within this script
+do_banner()
+{
+ # Print the standard header
+ x="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+ echo "$x\n$x\n$x\n$x\n"
+ banner `echo $user`
+ echo "\n"
+ user=`pwget -n $user | line | cut -d: -f5`
+ if [ -n "$user" ]
+ then
+ echo "User: $user\n"
+ else
+ echo "\n"
+ fi
+ echo "Request id: $reqid Printer: `basename $0`\n"
+ date
+ echo "\n"
+ if [ -n "$title" ]
+ then
+ banner "$title"
+ fi
+ echo "\014\r\c"
+}
+
+# Set up interface
+if [ -t 1 ]
+then
+ stty 9600 opost onlcr -parenb cs8 ixon -istrip clocal tab3 <&1 2>/dev/null
+else
+ slp -n -k 2>/dev/null
+fi
+
+# Handle disable and cancel traps.
+trap "echo 'Terminated: $reqid' >> $log; trap 15; kill -15 0; exit 0 " 15
+
+# Set up printer default modes
+echo "\033&k0S\c" # reset pitches
+echo "\033(s0B\033)s0B\c" # reset stroke weights
+echo "\033&d@\c" # disable auto-underline
+echo "\033&l6D\c" # reset to 6 lpi
+echo "\033(s0Q\c" # reset print quality
+echo "\033&v0S\c" # reset color
+echo "\033&k2G\c" # Set line termination mode
+
+
+# Determine which options have been invoked
+pitch="def"
+weight="def"
+quality="def"
+# outputmode="cooked"
+outputmode="raw"
+# banner="yes"
+banner=
+
+for i in $options
+do
+ case "$i" in
+ -c | c) # compressed print
+ pitch="c";;
+
+ -e | e) # expanded print
+ pitch="e";;
+
+ -10 | 10) # pitch set to 10 cpi
+ pitch="10";;
+
+ -12 | 12) # pitch set to 12 cpi
+ pitch="12";;
+
+ -q | q | -lq | lq) # near letter quality
+ quality=1;;
+
+ -b | b | -bold | bold) # set font weight to bold
+ weight=1;;
+
+ r | raw) # raw mode for binary output to printer
+ outputmode="raw";;
+
+ -nb | nb) # do not output banner page
+ banner="";;
+
+ esac
+done
+
+shift; shift; shift; shift; shift
+
+if [ "$sec_class" = "2" ] # B1 Trusted System
+then
+ shift
+ files="$*"
+ Nofilter= Nolabel=
+ set -- `getopt fl $options`
+ if [ $? != 0 ]
+ then
+ exit 2
+ fi
+
+ for opt in $*
+ do
+ shift
+ case $opt in
+ -f) Nofilter=$opt ;;
+ -l) Nolabel=$opt ;;
+ --) break ;;
+ esac
+ done
+
+ # Print the sensitivity label of the process
+ echo "$x\n$x\n"
+ /usr/lib/lpbanner -j $reqid -t "$title" -u $user -p PCL1 -n $printer -d $dev $files
+ echo "\n$x\n$x"
+
+else
+ # Assume that the rest of the arguments are files
+ files="$*"
+ # print the banner if nb option not specified
+ if [ -n "$banner" ]
+ then
+ do_banner
+ fi
+fi
+
+# Print the spooled files
+i=1
+while [ $i -le $copies ]
+do
+ for file in $files
+ do
+
+ # If raw mode, turn off output processing,
+ # set for no tab expansion
+ # If cooked mode, uncomment the cooked case if it is
+ # desired not to print on the page perforations
+ case "$outputmode" in
+ raw) if [ -t 1 ]
+ then
+ stty raw 9600 -opost -parenb cs8 ixon -istrip clocal tab0 <&1 2>/dev/null
+ else
+ slp -r 2>/dev/null
+ fi
+ echo "\033&k0G";; # Reset line termination mode
+ # cooked) echo "\033&l1L\r\c";;
+ esac
+
+ case "$pitch" in
+ def);;
+ c) echo "\033&k2S\r\c";;
+ e) echo "\033&k1S\r\c";;
+ 10) echo "\033&k3S\r\c";;
+ 12) echo "\033&k0S\r\c"
+ echo "\033&k4S\r\c";;
+ esac
+
+ case "$quality" in
+ def);;
+ *) echo "\033(s${quality}Q\r\c";;
+ esac
+
+ case "$weight" in
+ def) echo "\033(s0B\033)s0B\r\c";;
+ *) echo "\033(s${weight}B\r\c";;
+ esac
+
+ if [ "$sec_class" = "2" ] # B1 Trusted System
+ then
+ /usr/lib/lprcat $Nofilter $Nolabel $file PCL1 $user $dev
+ else
+ type=`file $file | sed 's/^[^:]*..//'`
+ case "$type" in
+ postscript*)
+#
+# We could do the following, but this would leave gs with a rather large
+# image in memory for (possibly) several minutes. Better to use and
+# intermediate file, since cat is "lightweight"...
+#
+# gs -q -sDEVICE=paintjet -r180 -sOutputFile=- -dDISKFONTS -dNOPAUSE - < $file 2>/tmp/sh$$
+
+ gs -q -sDEVICE=paintjet -r180 -sOutputFile=/tmp/pj$$ -dDISKFONTS -dNOPAUSE - < $file 1>2
+ cat /tmp/pj$$
+ rm /tmp/pj$$
+ needff=
+ ;;
+ *) cat "$file" 2>/tmp/sh$$
+ needff=1
+ ;;
+ esac
+
+ if [ -s /tmp/sh$$ ]
+ then
+# cat /tmp/sh$$ # output any errors
+ cat /tmp/sh$$ 1>2 # output any errors
+ fi
+ rm -f /tmp/sh$$
+ if [ $needff ]; then echo "\014\r\c"; fi
+ fi
+
+ echo "\033&k0S\r\c" # reset pitches
+ echo "\033(s0B\033)s0B\r\c" # reset stroke weights
+ echo "\033&d@\r\c" # disable auto-underline
+ echo "\033&l6D\r\c" # reset to 6 lpi
+ echo "\033(s0Q\c" # reset print quality
+ echo "\033&v0S\c" # reset color
+ done
+ i=`expr $i + 1`
+ done
+
+# Insure all buffers are flushed to printer
+if [ -t 1 ]
+then
+ stty 9600 opost onlcr -parenb cs8 ixon -istrip clocal tab3 <&1 2>/dev/null
+fi
+
+exit 0
diff --git a/Master/xemtex/gslib/ppath.ps b/Master/xemtex/gslib/ppath.ps
new file mode 100644
index 00000000000..8c2b596da95
--- /dev/null
+++ b/Master/xemtex/gslib/ppath.ps
@@ -0,0 +1,55 @@
+% Copyright (C) 1989, 1995, 1997 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: ppath.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% 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/Master/xemtex/gslib/pphs b/Master/xemtex/gslib/pphs
new file mode 100644
index 00000000000..03fc797ec63
--- /dev/null
+++ b/Master/xemtex/gslib/pphs
@@ -0,0 +1,7 @@
+#!/bin/sh
+# $Id: pphs,v 1.1 2001/07/15 16:25:02 lpd Exp $
+# Print the Primary Hint Stream from a linearized PDF file. Usage:
+# pphs filename.pdf
+# Output goes to stdout.
+
+exec gs -q -dNODISPLAY -- pphs.ps "$@"
diff --git a/Master/xemtex/gslib/pphs.ps b/Master/xemtex/gslib/pphs.ps
new file mode 100644
index 00000000000..5b841f744fb
--- /dev/null
+++ b/Master/xemtex/gslib/pphs.ps
@@ -0,0 +1,222 @@
+% Copyright (C) 2001 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: pphs.ps,v 1.3.2.1.2.1 2003/04/12 14:02:39 giles Exp $
+% 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 5000 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/Master/xemtex/gslib/prfont.ps b/Master/xemtex/gslib/prfont.ps
new file mode 100644
index 00000000000..c71dce1ad01
--- /dev/null
+++ b/Master/xemtex/gslib/prfont.ps
@@ -0,0 +1,242 @@
+%!
+%%Creator: Eric Gisin <egisin@waterloo.csnet>
+%%Title: Print font catalog
+% Copyright (c) 1986 Eric Gisin
+% Copyright (C) 1992 Aladdin Enterprises, Menlo Park, CA (ghost@aladdin.com)
+% Modified to print all 256 encoded characters.
+% Copyright (C) 1993 Aladdin Enterprises, Menlo Park, CA (ghost@aladdin.com)
+% Modified to print unencoded characters.
+% Copyright (C) 1994 Aladdin Enterprises, Menlo Park, CA (ghost@aladdin.com)
+% Modified to always create 256-element Encoding vectors.
+% Copyright (C) 1995 Aladdin Enterprises, Menlo Park, CA (ghost@aladdin.com)
+% Modified to print more than 128 unencoded characters.
+% Copyright (C) 1996 Aladdin Enterprises, Menlo Park, CA (ghost@aladdin.com)
+% 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 (ghost@aladdin.com)
+% Modified to sort unencoded characters.
+% Copyright (C) 2000 Aladdin Enterprises, Menlo Park, CA (ghost@aladdin.com)
+% Modified to print CIDFonts as well as fonts.
+% O(N^2) sorting replaced with O(N log N).
+
+% $Id: prfont.ps,v 1.2.6.1 2002/04/02 13:57:27 mpsuzuki Exp $
+
+% 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 32 sub 224 .min {
+ 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 63 DoLine
+ 36 1.5 Inch moveto 64 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 191 DoLine
+ 36 1.5 Inch moveto 192 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/Master/xemtex/gslib/printafm b/Master/xemtex/gslib/printafm
new file mode 100644
index 00000000000..97e09ae83b6
--- /dev/null
+++ b/Master/xemtex/gslib/printafm
@@ -0,0 +1,7 @@
+#!/bin/sh
+# $Id: printafm,v 1.1 2000/03/09 08:40:40 lpd Exp $
+# Print the metrics from a font in AFM format. Usage:
+# printafm fontname
+# Output goes to stdout.
+
+exec gs -q -dNODISPLAY -- printafm.ps "$@"
diff --git a/Master/xemtex/gslib/printafm.ps b/Master/xemtex/gslib/printafm.ps
new file mode 100644
index 00000000000..2b4ed14e889
--- /dev/null
+++ b/Master/xemtex/gslib/printafm.ps
@@ -0,0 +1,149 @@
+%!
+% 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.
+
+% $Id: printafm.ps,v 1.1.6.1 2002/04/10 09:22:58 giles Exp $
+
+% 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.
+
+/onechar 1 string def
+
+% c toupper - c
+/toupper {
+ dup dup 8#141 ge exch 8#172 le and {
+ 8#40 sub
+ } if
+} 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
+ } {
+ pop
+ } ifelse
+ } forall
+ % 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
+ (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) =
+ (FontName ) print currentfont /FontName get =
+
+ % Print the FontInfo
+
+ currentfont /FontInfo get {
+ exch
+ =string cvs dup dup 0 get 0 exch toupper put print
+ ( ) print =
+ } 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/Master/xemtex/gslib/ps2ai.ps b/Master/xemtex/gslib/ps2ai.ps
new file mode 100644
index 00000000000..15bb6fef675
--- /dev/null
+++ b/Master/xemtex/gslib/ps2ai.ps
@@ -0,0 +1,552 @@
+%!
+% Copyright (C) 1994 , 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: ps2ai.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+%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 } 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]
+/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 } def % 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 } def
+/xdef {exch def} def
+/trx {transform exch} def
+/cbdef {cvx bind def} def
+/jltz {dup abs 0.0001 lt {pop 0} if} def % 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
+ } def
+} 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
+ } def
+} 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 } bind def }{/jp {print}bind def} ifelse
+/jpnum {jltz ( ) jp =string cvs jp } bind def
+/jpmat { dup /jarry exch def length 1 sub /j_num exch def
+ (\[) jp 0 1 j_num {jarry exch get jpnum} for (\]) jp } def
+%
+% 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
+} def
+/jpm {
+ ckpnt
+ /dpth true def
+ transform 2 copy /yst xdef /xst xdef exch jpnum jpnum ( m\n) jp } bind def
+/jpl { trx jpnum jpnum ( l\n) jp } bind def
+/jpc { 6 4 roll trx jpnum jpnum 4 2 roll trx jpnum jpnum trx
+ jpnum jpnum ( c\n) jp } bind def
+/jpp {xst jpnum yst jpnum ( l\n) jp /clstate true def} def
+/cntpaths { % count paths on stack
+ oldgsave
+ {pop pop /jnump jnump 1 add def} {pop pop} {6 {pop} repeat}{} pathforall
+ oldgrestore
+} def
+/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
+} bind def
+%
+% Painting Operators
+%
+/oldnewpath [/newpath load] cbdef
+/newpath { (\n) jp /spth 0 def ppforall} def
+/stroke { (\n) jp /spth 1 def ppforall } def
+/fill {(\n) jp /spth 2 def ppforall } def
+/eofill {(1 D\n) jp fill (0 D\n) jp} def
+/clip {clarry gcnt get {(Q\nq\n) jp}{(q\n) jp} ifelse
+ /fclp true def clarry gcnt true put} def
+/eoclip {(1 D\n) jp clip (0 D\n) jp} def
+%
+% Text Operators
+%
+/oldshow [/show load] cbdef
+/curpt {stringwidth pop jx add jy} def
+/jNN {dup 0 eq {pop oldgsave currentfont /FontMatrix get setmatrix kscl
+ oldgrestore} if
+} def
+/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
+} def
+% AI does not support negitive font sizes
+/curftsize {currentfont /FontMatrix get 0 get jNN abs 1000 mul} def
+/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
+} bind def
+%/curftname {currentfont /FontName get ftnamefix}def
+/curftname { currentfont /FontName known {currentfont /FontName get}
+ { (Times-Roman)} ifelse ftnamefix } def
+/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
+} bind def
+% 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 } def
+/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
+} def
+/ashow {exch pop exch /j_ax exch def show /j_ax {0} def } def
+}
+ {
+/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} def
+/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} def
+} ifelse
+/widthshow { show pop pop pop} def
+/awidthshow {ashow pop pop pop} def
+/kshow {show pop} def
+%/show {true charpath fill} bind def % get outline of charactor
+joutln {/show { true charpath currentpoint
+ /jy exch def /jx exch def fill jx jy moveto} bind def} if
+%/show {oldshow} def % 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
+ } def
+/oldsetgray [/setgray load] cbdef
+/setgray {0 0 0 4 -1 roll 1 exch sub setcmykcolor} def
+/oldsethsbcolor [/sethsbcolor load] cbdef
+/sethsbcolor {oldsethsbcolor currentcmykcolor setcmykcolor} def
+/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 } def
+%
+% State Operators
+%
+/oldsetlinewidth [/setlinewidth load] cbdef
+/setlinewidth {kscl abs mul jltz oldsetlinewidth
+ currentlinewidth jpnum ( w\n) jp } def
+/oldsetlinecap [/setlinecap load] cbdef
+/setlinecap {dup oldsetlinecap jpnum ( J\n) jp} def
+/oldsetlinejoin [/setlinejoin load] cbdef
+/setlinejoin {dup oldsetlinejoin jpnum ( j\n) jp} def
+/oldsetmiterlimit [/setmiterlimit load] cbdef
+/setmiterlimit {dup oldsetmiterlimit jpnum ( M\n) jp}def
+/oldsetdash [/setdash load] cbdef
+/setdash {exch [ exch {kscl abs mul} forall ] exch kscl abs mul oldsetdash
+ currentdash exch jpmat jpnum ( d\n) jp } def
+/oldsetflat [/setflat load] cbdef
+/setflat {dup oldsetflat jpnum ( i\n) jp } def
+%
+% 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
+} def
+/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
+} def
+/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
+} def
+/oldgsave [/gsave load] cbdef
+/gsave {oldgsave /gcnt gcnt 1 add def } def % clarry gcnt false put} def
+% (%%Note:gsave ) jp gcnt jpnum (\n) jp} def
+/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 } def
+% oldgrestore currentstate } def
+% (%%Note:grestore ) jp gcnt 1 add jpnum (\n) jp} def
+/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} def
+/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 } def
+%
+% 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)} def
+ /typecheck {pop pop} def
+} if
+jerr {
+ /handleerror {
+ (%%Note: ps2ai error, aborting rest of conversion\n) jp showpage
+ } def
+} 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} def
+ /@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} def
+ /endp {showpage pm restore} def % because the restore stops clean up
+} def
+%
+% Handle (some) PS Level 2
+%
+/rectstroke { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto
+ closepath stroke} def
+/rectfill { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto
+ fill } def
+/rectclip { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto
+ closepath clip newpath jMacfix {jmacimp} if } def
+%
+% 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/Master/xemtex/gslib/ps2ascii b/Master/xemtex/gslib/ps2ascii
new file mode 100644
index 00000000000..7e285b12e6a
--- /dev/null
+++ b/Master/xemtex/gslib/ps2ascii
@@ -0,0 +1,18 @@
+#!/bin/sh
+# $Id: ps2ascii,v 1.3 2001/06/22 16:09:22 lpd Exp $
+# 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.
+
+trap "rm -f _temp_.err _temp_.out" 0 1 2 15
+
+OPTIONS="-q -dNODISPLAY -dSAFER -dNOBIND -dWRITESYSTEMDICT -dSIMPLE"
+if ( test $# -eq 0 ) then
+ gs $OPTIONS -c save -f ps2ascii.ps - -c quit
+elif ( test $# -eq 1 ) then
+ gs $OPTIONS -c save -f ps2ascii.ps "$1" -c quit
+else
+ gs $OPTIONS -c save -f ps2ascii.ps "$1" -c quit >"$2"
+fi
diff --git a/Master/xemtex/gslib/ps2ascii.bat b/Master/xemtex/gslib/ps2ascii.bat
new file mode 100644
index 00000000000..ad1bdcd2478
--- /dev/null
+++ b/Master/xemtex/gslib/ps2ascii.bat
@@ -0,0 +1,15 @@
+@echo off
+@rem $Id: ps2ascii.bat,v 1.3 2000/05/20 20:53:05 lpd Exp $
+
+call gssetgs.bat
+if '%1'=='' goto a0
+if '%2'=='' goto a1
+%GSC% -q -dNODISPLAY -dSAFER -dNOBIND -dWRITESYSTEMDICT -dSIMPLE ps2ascii.ps %1 -c quit >%2
+goto x
+:a0
+%GSC% -q -dNODISPLAY -dSAFER -dNOBIND -dWRITESYSTEMDICT -dSIMPLE ps2ascii.ps - -c quit
+goto x
+:a1
+%GSC% -q -dNODISPLAY -dSAFER -dNOBIND -dWRITESYSTEMDICT -dSIMPLE ps2ascii.ps %1 -c quit
+goto x
+:x
diff --git a/Master/xemtex/gslib/ps2ascii.cmd b/Master/xemtex/gslib/ps2ascii.cmd
new file mode 100755
index 00000000000..c1316b89841
--- /dev/null
+++ b/Master/xemtex/gslib/ps2ascii.cmd
@@ -0,0 +1,18 @@
+/* $Id: ps2ascii.cmd,v 1.1 2000/07/05 16:21:13 lpd Exp $ */
+/*
+ * 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 -dNODISPLAY -dNOBIND -dWRITESYSTEMDICT -dSIMPLE ps2ascii.ps %1 -c quit >%2
+goto x
+:a0
+gsos2 -q -dNODISPLAY -dNOBIND -dWRITESYSTEMDICT -dSIMPLE ps2ascii.ps - -c quit
+goto x
+:a1
+gsos2 -q -dNODISPLAY -dNOBIND -dWRITESYSTEMDICT -dSIMPLE ps2ascii.ps %1 -c quit
+goto x
+:x
diff --git a/Master/xemtex/gslib/ps2ascii.ps b/Master/xemtex/gslib/ps2ascii.ps
new file mode 100644
index 00000000000..44770910fb5
--- /dev/null
+++ b/Master/xemtex/gslib/ps2ascii.ps
@@ -0,0 +1,1509 @@
+% Copyright (C) 1991, 1995, 1996, 1998, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: ps2ascii.ps,v 1.3.2.2.2.1 2003/04/12 14:02:39 giles Exp $
+% Extract the ASCII text from a PostScript file. Nothing is displayed.
+% Instead, ASCII information is written to stdout. The idea is similar to
+% Glenn Reid's `distillery', only a lot more simple-minded, and less robust.
+
+% If SIMPLE is defined, just the text is written, with a guess at line
+% breaks and word spacing. If SIMPLE is not defined, lines are written
+% to stdout as follows:
+%
+% F <height> <width> (<fontname>)
+% Indicate the font height and the width of a space.
+%
+% P
+% Indicate the end of the page.
+%
+% S <x> <y> (<string>) <width>
+% Display a string.
+%
+% <width> and <height> are integer dimensions in units of 1/720".
+% <x> and <y> are integer coordinates, in units of 1/720", with the origin
+% at the lower left.
+% <string> and <fontname> are strings represented with the standard
+% PostScript escape conventions.
+
+% If COMPLEX is defined, the following additional types of lines are
+% written to stdout.
+%
+% C <r> <g> <b>
+% Indicate the current color.
+%
+% I <x> <y> <width> <height>
+% Note the presence of an image.
+%
+% R <x> <y> <width> <height>
+% Fill a rectangle.
+%
+% <r>, <g>, and <b> are RGB values expressed as integers between 0 and 1000.
+%
+% Note that future versions of this program (in COMPLEX mode) may add
+% other output elements, so programs parsing the output should be
+% prepared to ignore elements that they do not recognize.
+
+% Note that this code will only work in all cases if systemdict is writable
+% and if `binding' the definitions of operators defined as procedures
+% is deferred. For this reason, it is normally invoked with
+% gs -q -dNODISPLAY -dNOBIND -dWRITESYSTEMDICT ps2ascii.ps
+
+% Thanks to:
+% J Greely <jgreely@cis.ohio-state.edu> for improvements to this code;
+% Jerry Whelan <jerryw@abode.ccd.bnl.gov> for motivating other improvements;
+% David M. Jones <dmjones@theory.lcs.mit.edu> for improvements noted below.
+
+%% Additional modifications by David M. Jones
+%% (dmjones@theory.lcs.mit.edu), December 23, 1997
+%%
+%% (a) Rewrote forall loop at the end of .show.write. This fixes a
+%% stack leakage problem, but the changes are more significant
+%% than that.
+%%
+%% .char.map includes the names of all characters in the
+%% StandardEncoding, ISOLatin1Encoding, OT1Encoding and
+%% T1Encoding vectors. Thus, if the Encoding vector for the
+%% current font contains a name that is not in .char.map, it's
+%% redundant to check if the Encoding vector is equal to one of
+%% the known vectors. Previous versions of ps2ascii would give
+%% up at this point, and substitute an asterisk (*) for the
+%% character. I've taken the liberty of instead using the
+%% OT1Encoding vector to translate the character, on the grounds
+%% that in the cases I'm most interested in, a font without a
+%% useful Encoding vector was most likely created by a DVI to PS
+%% converter such as dvips or DVILASER (and OT1Encoding is
+%% largely compatible with StandardEncoding anyway). [Note that
+%% this does not make my earlier changes to support dvips (see
+%% fix (a) under my 1996 changes) completely obsolete, since
+%% there's additional useful information I can extract in that
+%% case.]
+%%
+%% Overall, this should provide better support for some documents
+%% (e.g, DVILASER documents will no longer be translated into a
+%% series of *'s) without breaking any other documents any worse
+%% than they already were broken.
+%%
+%% (b) Fixed two bugs in dvips.df-tail: (1) changed "dup 127" to "dup
+%% 128" to fix fencepost error, and (2) gave each font it's own
+%% FontName rather than having all fonts share the same name.
+%%
+%% (c) Added one further refinement to the heuristic for detecting
+%% paragraph breaks: do not ever start a new paragraph after a
+%% line ending in a hyphen.
+%%
+%% (d) Added a bunch of missing letters from the T1Encoding,
+%% OT1Encoding and ISOLatin1Encoding vectors to .letter.chars to
+%% improve hyphen-elimination algorithm. This still won't help
+%% if there's no useful Encoding vector.
+%%
+%% NOTE: A better solution to the problem of missing Encoding vectors
+%% might be to redefine definefont to check whether the Encoding
+%% vector is sensible and, if not, replace it by a default. This
+%% would alleviate the need for constant tests in the .show.write
+%% loop, as well as automatically solving the problem noted in fix
+%% (d) above, and the similar problem with .break.chars. This should
+%% be investigated. Also, the hyphen-elimination algorithm really
+%% needs to be looked at carefully and rethought.
+
+%%* Modifications to ps2ascii.ps by David M. Jones
+%%* (dmjones@theory.lcs.mit.edu), June 25-July 8, 1996
+
+%%* Modifications:
+%%*
+%%* (a) added code to give better support for dvips files by providing
+%%* FontBBox's, FontName's and Encoding vectors for downloaded
+%%* bitmap fonts. This is done by using dvips's start-hook to
+%%* overwrite the df-tail and D procedures that dvips uses to
+%%* define its Type 3 bitmap fonts. Thus, this change should
+%%* provide better support for dvips-generated PS files without
+%%* affecting the handling of other documents.
+%%*
+%%* (b) Fixed two bugs that could potentially affect any PS file, not
+%%* just those created by dvips: (1) added missing "get" operator
+%%* in .show.write and (2) fixed bug that caused a hyphen at the
+%%* end of a line to be replaced by a space rather than begin
+%%* deleted. Note that the first bug was a source of stack
+%%* leakage, causing ps2ascii to run out of operand stack space
+%%* occasionally.
+%%*
+%%* Search for "%%* BF" to find these modifications.
+%%*
+%%* (c) Improved the heuristic for determining whether a line break
+%%* has occurred and whether a line break represents a paragraph
+%%* break. Previously, any change in the vertical position caused
+%%* a line break; now a line break is only registered if the
+%%* change is larger than the height of the current font. This
+%%* means that superscripts, subscripts, and such things as
+%%* shifted accents generated by TeX won't cause line breaks.
+%%* Paragraph-recognition is now done by comparing the indentation
+%%* of the new line to the indentation of the previous line and by
+%%* comparing the vertical distance between the new line and the
+%%* previous line to the vertical distance between the previous
+%%* line and its predecessor.
+%%*
+%%* (d) Added a hook for renaming the files where stdout and stderr
+%%* go.
+%%*
+%%* In general, my additions or changes to the code are described in
+%%* comments beginning with "%%*". However, there are numerous other
+%%* places where I have either re-formatted code or added comments to
+%%* the code while I was trying to understand it. These are usually
+%%* not specially marked.
+%%*
+
+/QUIET true def
+systemdict wcheck { systemdict } { userdict } ifelse begin
+/.max where { pop } { /.max { 2 copy lt { exch } if pop } bind def } ifelse
+/COMPLEX dup where { pop true } { false } ifelse def
+/SIMPLE dup where { pop true } { false } ifelse def
+/setglobal where
+ { pop currentglobal /setglobal load true setglobal }
+ { { } }
+ifelse
+
+% Define a way to store and retrieve integers that survives save/restore.
+/.i.string0 (0 ) def
+/.i.string .i.string0 length string def
+/.iget { cvi } bind def
+/.iput { exch //.i.string exch copy cvs pop } bind def
+/.inew { //.i.string0 dup length string copy } bind def
+
+% We only want to redefine operators if they are defined already.
+
+/codef { 1 index where { pop def } { pop pop } ifelse } def
+
+% Redefine the end-of-page operators.
+
+/erasepage { } codef
+/copypage { SIMPLE { (\014) } { (P\n) } ifelse //print } codef
+/showpage { copypage erasepage initgraphics } codef
+
+% Redefine the fill operators to detect rectangles.
+
+/.orderrect % <llx> <lly> <urx> <ury> .orderrect <llx> <lly> <w> <h>
+ { % Ensure llx <= urx, lly <= ury.
+ 1 index 4 index lt { 4 2 roll } if
+ dup 3 index lt { 3 1 roll exch } if
+ exch 3 index sub exch 2 index sub
+ } odef
+/.fillcomplex
+ { % Do a first pass to see if the path is all rectangles in
+ % the output coordinate system. We don't worry about overlapping
+ % rectangles that might be partially not filled.
+ % Stack: mark llx0 lly0 urx0 ury0 ... true mark x0 y0 ...
+ mark true mark
+ % Add a final moveto so we pick up any trailing unclosed subpath.
+ 0 0 itransform moveto
+ { .coord counttomark 2 gt
+ { counttomark 4 gt { .fillcheckrect } { 4 2 roll pop pop } ifelse }
+ if
+ }
+ { .coord }
+ { cleartomark not mark exit }
+ { counttomark -2 roll 2 copy counttomark 2 roll .fillcheckrect }
+ pathforall cleartomark
+ { .showcolor counttomark 4 idiv
+ { counttomark -4 roll .orderrect
+ (R ) //print .show==4
+ }
+ repeat pop
+ }
+ { cleartomark
+ }
+ ifelse
+ } odef
+/.fillcheckrect
+ { % Check whether the current subpath is a rectangle.
+ % If it is, add it to the list of rectangles being accumulated;
+ % if not exit the .fillcomplex loop.
+ % The subpath has not been closed.
+ % Stack: as in .fillcomplex, + newx newy
+ counttomark 10 eq { 9 index 9 index 4 2 roll } if
+ counttomark 12 ne { cleartomark not mark exit } if
+ 12 2 roll
+ % Check for the two possible forms of rectangles:
+ % x0 y0 x0 y1 x1 y1 x1 y0 x0 y0
+ % x0 y0 x1 y0 x1 y1 x0 y1 x0 y0
+ 9 index 2 index eq 9 index 2 index eq and
+ 10 index 9 index eq
+ { % Check for first form.
+ 7 index 6 index eq and 6 index 5 index eq and 3 index 2 index eq and
+ }
+ { % Check for second form.
+ 9 index 8 index eq and
+ 8 index 7 index eq and 5 index 4 index eq and 4 index 3 index eq and
+ }
+ ifelse not { cleartomark not mark exit } if
+ % We have a rectangle.
+ pop pop pop pop 4 2 roll pop pop 8 4 roll
+ } odef
+/eofill { COMPLEX { .fillcomplex } if newpath } codef
+/fill { COMPLEX { .fillcomplex } if newpath } codef
+/rectfill { gsave newpath .rectappend fill grestore } codef
+/ueofill { gsave newpath uappend eofill grestore } codef
+/ufill { gsave newpath uappend fill grestore } codef
+
+% Redefine the stroke operators to detect rectangles.
+
+/rectstroke
+ { gsave newpath
+ dup type dup /arraytype eq exch /packedarraytype eq or
+ { dup length 6 eq { exch .rectappend concat } { .rectappend } ifelse }
+ { .rectappend }
+ ifelse stroke grestore
+ } codef
+/.strokeline % <fromx> <fromy> <tox> <toy> .strokeline <tox> <toy>
+ % Note: fromx and fromy are in output coordinates;
+ % tox and toy are in user coordinates.
+ { .coord 2 copy 6 2 roll .orderrect
+ % Add in the line width. Assume square or round caps.
+ currentlinewidth 2 div dup .dcoord add abs 1 .max 5 1 roll
+ 4 index add 4 1 roll 4 index add 4 1 roll
+ 4 index sub 4 1 roll 5 -1 roll sub 4 1 roll
+ (R ) //print .show==4
+ } odef
+/.strokecomplex
+ { % Do a first pass to see if the path is all horizontal and vertical
+ % lines in the output coordinate system.
+ % Stack: true mark origx origy curx cury
+ true mark null null null null
+ { .coord 6 2 roll pop pop pop pop 2 copy }
+ { .coord 1 index 4 index eq 1 index 4 index eq or
+ { 4 2 roll pop pop }
+ { cleartomark not mark exit }
+ ifelse
+ }
+ { cleartomark not mark exit }
+ { counttomark -2 roll 2 copy counttomark 2 roll
+ 1 index 4 index eq 1 index 4 index eq or
+ { pop pop 2 copy }
+ { cleartomark not mark exit }
+ ifelse
+ }
+ pathforall cleartomark
+ 0 currentlinewidth .dcoord 0 eq exch 0 eq or and
+ % Do the second pass to write out the rectangles.
+ % Stack: origx origy curx cury
+ { .showcolor null null null null
+ { 6 2 roll pop pop pop pop 2 copy .coord }
+ { .strokeline }
+ { }
+ { 3 index 3 index .strokeline }
+ pathforall pop pop pop pop
+ }
+ if
+ } odef
+/stroke { COMPLEX { .strokecomplex } if newpath } codef
+/ustroke
+ { gsave newpath
+ dup length 6 eq { exch uappend concat } { uappend } ifelse
+ stroke grestore
+ } codef
+
+% The image operators must read the input and note the dimensions.
+% Eventually we should redefine these to detect 1-bit-high all-black images,
+% since this is how dvips does underlining (!).
+
+/.noteimagerect % <width> <height> <matrix> .noteimagerect -
+ { COMPLEX
+ { gsave setmatrix itransform 0 0 itransform
+ grestore .coord 4 2 roll .coord .orderrect
+ (I ) //print .show==4
+ }
+ { pop pop pop
+ }
+ ifelse
+ } odef
+/colorimage where
+ { pop /colorimage
+ { 1 index
+ { dup 6 add index 1 index 6 add index 2 index 5 add index }
+ { 6 index 6 index 5 index }
+ ifelse .noteimagerect gsave nulldevice //colorimage grestore
+ } codef
+ } if
+/.noteimage % Arguments as for image[mask]
+ { dup type /dicttype eq
+ { dup /Width get 1 index /Height get 2 index /ImageMatrix get }
+ { 4 index 4 index 3 index }
+ ifelse .noteimagerect
+ } odef
+/image { .noteimage gsave nulldevice //image grestore } codef
+/imagemask { .noteimage gsave nulldevice //imagemask grestore } codef
+
+% Output the current color if necessary.
+/.color.r .inew def
+ .color.r -1 .iput % make sure we write the color at the beginning
+/.color.g .inew def
+/.color.b .inew def
+/.showcolor
+ { COMPLEX
+ { currentrgbcolor
+ 1000 mul round cvi
+ 3 1 roll 1000 mul round cvi
+ exch 1000 mul round cvi
+ % Stack: b g r
+ dup //.color.r .iget eq
+ 2 index //.color.g .iget eq and
+ 3 index //.color.b .iget eq and
+ { pop pop pop
+ }
+ { (C ) //print
+ dup //.color.r exch .iput .show==only
+ ( ) //print dup //.color.g exch .iput .show==only
+ ( ) //print dup //.color.b exch .iput .show==only
+ (\n) //print
+ }
+ ifelse
+ }
+ if
+ } bind def
+
+% Redefine `show'.
+
+% Set things up so our output will be in tenths of a point, with origin at
+% lower left. This isolates us from the peculiarities of individual devices.
+
+/.show.ident.matrix matrix def
+/.show.ident { % - .show.ident <scale> <matrix>
+% //.show.ident.matrix defaultmatrix
+% % Assume the original transformation is well-behaved.
+% 0.1 0 2 index dtransform abs exch abs .max /.show.scale exch def
+% 0.1 dup 3 -1 roll scale
+ gsave initmatrix
+ % Assume the original transformation is well-behaved...
+ 0.1 0 dtransform abs exch abs .max
+ 0.1 dup scale .show.ident.matrix currentmatrix
+ % ... but undo any rotation into landscape orientation.
+ dup 0 get 0 eq {
+ 1 get dup abs div 90 mul rotate
+ .show.ident.matrix currentmatrix
+ } if
+ grestore
+} bind def
+
+/.coord { % <x> <y> .coord <x'> <y'>
+ transform .show.ident exch pop itransform
+ exch round cvi exch round cvi
+} odef
+
+/.dcoord { % <dx> <dy> .coord <dx'> <dy'>
+ % Transforming distances is trickier, because
+ % the coordinate system might be rotated.
+ .show.ident pop 3 1 roll
+ exch 0 dtransform
+ dup mul exch dup mul add sqrt
+ 2 index div round cvi
+ exch 0 exch dtransform
+ dup mul exch dup mul add sqrt
+ 3 -1 roll div round cvi
+} odef
+
+% Remember the current X, Y, and height.
+/.show.x .inew def
+/.show.y .inew def
+/.show.height .inew def
+
+% Remember the last character of the previous string; if it was a
+% hyphen preceded by a letter, we didn't output the hyphen.
+
+/.show.last (\000) def
+
+% Remember the current font.
+/.font.name 130 string def
+/.font.name.length .inew def
+/.font.height .inew def
+/.font.width .inew def
+
+%%* Also remember indentation of current line and previous vertical
+%%* skip
+
+/.show.indent .inew def
+/.show.dy .inew def
+
+% We have to redirect stdout somehow....
+
+/.show.stdout { (%stdout) (w) file } bind def
+
+% Make sure writing will work even if a program uses =string.
+/.show.string =string length string def
+/.show.=string =string length string def
+/.show==only
+ { //=string //.show.=string copy pop
+ dup type /stringtype eq
+ { dup length //.show.string length le
+ { dup rcheck { //.show.string copy } if
+ } if
+ } if
+ .show.stdout exch write==only
+ //.show.=string //=string copy pop
+ } odef
+/.show==4
+ { 4 -1 roll .show==only ( ) //print
+ 3 -1 roll .show==only ( ) //print
+ exch .show==only ( ) //print
+ .show==only (\n) //print
+ } odef
+
+/.showwidth % Same as stringwidth, but disable COMPLEX so that
+ % we don't try to detect rectangles during BuildChar.
+ { COMPLEX
+ { /COMPLEX false def stringwidth /COMPLEX true def }
+ { stringwidth }
+ ifelse
+ } odef
+
+/.showfont % <string> .showfont <string>
+ { gsave
+ % Try getting the height and width of the font from the FontBBox.
+ currentfont /FontBBox .knownget not { {0 0 0 0} } if
+ aload pop % llx lly urx ury
+ exch 4 -1 roll % lly ury urx llx
+ sub % lly ury dx
+ 3 1 roll exch % dx ury lly
+ sub % dx dy
+ 2 copy .max 0 ne
+ { currentfont /FontMatrix get dtransform
+ }
+ { pop pop
+ % Fonts produced by dvips, among other applications, have
+ % BuildChar procedures that bomb out when given unexpected
+ % characters, and there is no way to determine whether a given
+ % character will do this. So for Type 1 fonts, we measure a
+ % typical character ('X'); for others, we punt.
+ currentfont /FontType get 1 eq
+ { (X) .showwidth pop dup 1.3 mul
+ }
+ { % No safe way to get the character size. Punt.
+ 0 0
+ }
+ ifelse
+ }
+ ifelse .dcoord exch
+ currentfont /FontName .knownget not { () } if
+ dup type /stringtype ne { //.show.string cvs } if
+ grestore
+ % Stack: height width fontname
+ SIMPLE
+ { pop pop //.show.height exch .iput }
+ { 2 index //.font.height .iget eq
+ 2 index //.font.width .iget eq and
+ 1 index //.font.name 0 //.font.name.length .iget getinterval eq and
+ { pop pop pop
+ }
+ { (F ) //print
+ 3 -1 roll dup //.font.height exch .iput .show==only ( ) //print
+ exch dup //.font.width exch .iput .show==only ( ) //print
+ dup length //.font.name.length exch .iput
+ //.font.name cvs .show==only (\n) //print
+ }
+ ifelse
+ }
+ ifelse
+ } odef
+
+% Define the letters -- characters which, if they occur followed by a hyphen
+% at the end of a line, cause the hyphen and line break to be ignored.
+/.letter.chars 100 dict def
+mark
+ 65 1 90 { dup 32 add } for
+ counttomark
+ { StandardEncoding exch get .letter.chars exch dup put }
+ repeat
+pop
+
+%%* Add the rest of the letters from the [O]T1Encoding and
+%%* ISOLatin1Encoding vectors
+
+mark
+ /AE
+ /Aacute
+ /Abreve
+ /Acircumflex
+ /Adieresis
+ /Agrave
+ /Aogonek
+ /Aring
+ /Atilde
+ /Cacute
+ /Ccaron
+ /Ccedilla
+ /Dcaron
+ /Eacute
+ /Ecaron
+ /Ecircumflex
+ /Edieresis
+ /Egrave
+ /Eng
+ /Eogonek
+ /Eth
+ /Gbreve
+ /Germandbls
+ /IJ
+ /Iacute
+ /Icircumflex
+ /Idieresis
+ /Idot
+ /Igrave
+ /Lacute
+ /Lcaron
+ /Lslash
+ /Nacute
+ /Ncaron
+ /Ntilde
+ /OE
+ /Oacute
+ /Ocircumflex
+ /Odieresis
+ /Ograve
+ /Ohungarumlaut
+ /Oslash
+ /Otilde
+ /Racute
+ /Rcaron
+ /Sacute
+ /Scaron
+ /Scedilla
+ /Tcaron
+ /Tcedilla
+ /Thorn
+ /Uacute
+ /Ucircumflex
+ /Udieresis
+ /Ugrave
+ /Uhungarumlaut
+ /Uring
+ /Yacute
+ /Ydieresis
+ /Zacute
+ /Zcaron
+ /Zdot
+ /aacute
+ /abreve
+ /acircumflex
+ /adieresis
+ /ae
+ /agrave
+ /aogonek
+ /aring
+ /atilde
+ /cacute
+ /ccaron
+ /ccedilla
+ /dbar
+ /dcaron
+ /dotlessi
+ /dotlessj
+ /eacute
+ /ecaron
+ /ecircumflex
+ /edieresis
+ /egrave
+ /eng
+ /eogonek
+ /eth
+ /exclamdown
+ /ff
+ /ffi
+ /ffl
+ /fi
+ /fl
+ /gbreve
+ /germandbls
+ /iacute
+ /icircumflex
+ /idieresis
+ /igrave
+ /ij
+ /lacute
+ /lcaron
+ /lslash
+ /nacute
+ /ncaron
+ /ntilde
+ /oacute
+ /ocircumflex
+ /odieresis
+ /oe
+ /ograve
+ /ohungarumlaut
+ /oslash
+ /otilde
+ /questiondown
+ /racute
+ /rcaron
+ /sacute
+ /scaron
+ /scedilla
+ /section
+ /sterling
+ /tcaron
+ /tcedilla
+ /thorn
+ /uacute
+ /ucircumflex
+ /udieresis
+ /ugrave
+ /uhungarumlaut
+ /uring
+ /yacute
+ /ydieresis
+ /zacute
+ /zcaron
+ /zdot
+counttomark
+ { .letter.chars exch dup put }
+repeat
+pop
+
+% Define a set of characters which, if they occur at the start of a line,
+% are taken as indicating a paragraph break.
+/.break.chars 50 dict def
+mark
+ /bullet /dagger /daggerdbl /periodcentered /section
+ counttomark
+ { .break.chars exch dup put }
+ repeat
+pop
+
+% Define character translation to ASCII.
+% We have to do this for the entire character set.
+
+/.char.map 500 dict def
+
+/.chars.def { counttomark 2 idiv { .char.map 3 1 roll put } repeat pop } def
+
+% Encode the printable ASCII characters.
+
+mark 32 1 126
+ { 1 string dup 0 4 -1 roll put
+ dup 0 get StandardEncoding exch get exch
+ }
+for .chars.def
+
+ % Encode accents.
+mark
+ /acute (')
+ /caron (^)
+ /cedilla (,)
+ /circumflex (^)
+ /dieresis (")
+ /grave (`)
+ /ring (*)
+ /tilde (~)
+.chars.def
+
+ % Encode the ISO accented characters.
+mark 192 1 255
+ { ISOLatin1Encoding exch get =string cvs
+ dup 0 1 getinterval 1 index dup length 1 sub 1 exch getinterval
+ .char.map 2 index known .char.map 2 index known and
+ { .char.map 3 -1 roll get .char.map 3 -1 roll get concatstrings
+ .char.map 3 1 roll put
+ }
+ { pop pop pop
+ }
+ ifelse
+ }
+for .chars.def
+
+% Encode the remaining standard and ISO alphabetic characters.
+
+mark
+ /AE (AE) /Eth (DH) /OE (OE) /Thorn (Th)
+ /ae (ae) /eth (dh)
+ /ffi (ffi) /ffl (ffl) /fi (fi) /fl (fl)
+ /germandbls (ss) /oe (oe) /thorn (th)
+.chars.def
+
+% Encode the other standard and ISO characters.
+
+mark
+ /brokenbar (|) /bullet (*) /copyright ((C)) /currency (#)
+ /dagger (#) /daggerdbl (##) /degree (o) /divide (/) /dotaccent (.)
+ /dotlessi (i)
+ /ellipsis (...) /emdash (--) /endash (-) /exclamdown (!)
+ /florin (f) /fraction (/)
+ /guillemotleft (<<) /guillemotright (>>)
+ /guilsinglleft (<) /guilsinglright (>) /hungarumlaut ("") /logicalnot (~)
+ /macron (_) /minus (-) /mu (u) /multiply (*)
+ /ogonek (,) /onehalf (1/2) /onequarter (1/4) /onesuperior (1)
+ /ordfeminine (-a) /ordmasculine (-o)
+ /paragraph (||) /periodcentered (*) /perthousand (o/oo) /plusminus (+-)
+ /questiondown (?) /quotedblbase (") /quotedblleft (") /quotedblright (")
+ /quotesinglbase (,) /quotesingle (') /registered ((R))
+ /section ($) /sterling (#)
+ /threequarters (3/4) /threesuperior (3) /trademark ((TM)) /twosuperior (2)
+ /yen (Y)
+.chars.def
+
+% Encode a few common Symbol characters.
+
+mark
+ /asteriskmath (*) /copyrightsans ((C)) /copyrightserif ((C))
+ /greaterequal (>=) /lessequal (<=) /registersans ((R)) /registerserif ((R))
+ /trademarksans ((TM)) /trademarkserif ((TM))
+.chars.def
+
+%%* Add a few characters from StandardEncoding and ISOLatin1Encoding
+%%* that were missing.
+
+mark
+ /cent (c)
+ /guilsinglleft (<)
+ /guilsinglright (>)
+ /breve (*)
+ /Lslash (L/)
+ /lslash (l/)
+.chars.def
+
+%%* Define the OT1Encoding and T1Encoding vectors for use with dvips
+%%* files. Unfortunately, there's no way of telling what font is
+%%* really being used within a dvips document, so we can't provide an
+%%* appropriate encoding for each individual font. Instead, we'll
+%%* just provide support for the two most popular text encodings, the
+%%* OT1 and T1 encodings, and just accept the fact that any font not
+%%* using one of those encodings will be rendered as gibberish.
+%%*
+%%* OT1 is Knuth's 7-bit encoding for the CMR text fonts, while T1
+%%* (aka the Cork encoding) is the 8-bit encoding used by the DC
+%%* fonts, a preliminary version of the proposed Extended Computer
+%%* Modern fonts. Unfortunately, T1 is not a strict extension of OT1;
+%%* they differ in positions 8#000 through 8#040, 8#074, 8#076, 8#134,
+%%* 8#137, 8#173, 8#174, 8#175 and 8#177, so we can't use the same
+%%* vector for both.
+%%*
+%%* Of course, we also can't reliably tell the difference between an
+%%* OT1-encoded font and a T1-encoded font based on the information in
+%%* a dvips-created PostScript file. As a best-guess solution, we'll
+%%* use the T1 encoding if the font contains any characters in
+%%* positions above 8#177 and the OT1 encoding if it doesn't.
+
+/T1Encoding 256 array def
+
+/OT1Encoding 256 array def
+
+%%* T1Encoding shares a lot with StandardEncoding, so let's start
+%%* there.
+
+StandardEncoding T1Encoding copy pop
+
+/OT1.encode {
+ counttomark
+ 2 idiv
+ { OT1Encoding 3 1 roll put }
+ repeat
+ cleartomark
+} def
+
+/T1.encode {
+ counttomark
+ 2 idiv
+ { T1Encoding 3 1 roll put }
+ repeat
+ cleartomark
+} def
+
+mark
+ 8#000 /grave
+ 8#001 /acute
+ 8#002 /circumflex
+ 8#003 /tilde
+ 8#004 /dieresis
+ 8#005 /hungarumlaut
+ 8#006 /ring
+ 8#007 /caron
+
+ 8#010 /breve
+ 8#011 /macron
+ 8#012 /dotaccent
+ 8#013 /cedilla
+ 8#014 /ogonek
+ 8#015 /quotesinglbase
+ 8#016 /guilsinglleft
+ 8#017 /guilsinglright
+
+ 8#020 /quotedblleft
+ 8#021 /quotedblright
+ 8#022 /quotedblbase
+ 8#023 /guillemotleft
+ 8#024 /guillemotright
+ 8#025 /endash
+ 8#026 /emdash
+ 8#027 /cwm
+
+ 8#030 /perthousandzero
+ 8#031 /dotlessi
+ 8#032 /dotlessj
+ 8#033 /ff
+ 8#034 /fi
+ 8#035 /fl
+ 8#036 /ffi
+ 8#037 /ffl
+
+%% 8#040 through 8#176 follow StandardEncoding
+
+ 8#177 /hyphen
+T1.encode
+
+mark
+ 8#200 /Abreve
+ 8#201 /Aogonek
+ 8#202 /Cacute
+ 8#203 /Ccaron
+ 8#204 /Dcaron
+ 8#205 /Ecaron
+ 8#206 /Eogonek
+ 8#207 /Gbreve
+ 8#210 /Lacute
+ 8#211 /Lcaron
+ 8#212 /Lslash
+ 8#213 /Nacute
+ 8#214 /Ncaron
+ 8#215 /Eng
+ 8#216 /Ohungarumlaut
+ 8#217 /Racute
+ 8#220 /Rcaron
+ 8#221 /Sacute
+ 8#222 /Scaron
+ 8#223 /Scedilla
+ 8#224 /Tcaron
+ 8#225 /Tcedilla
+ 8#226 /Uhungarumlaut
+ 8#227 /Uring
+ 8#230 /Ydieresis
+ 8#231 /Zacute
+ 8#232 /Zcaron
+ 8#233 /Zdot
+ 8#234 /IJ
+ 8#235 /Idot
+ 8#236 /dbar
+ 8#237 /section
+ 8#240 /abreve
+ 8#241 /aogonek
+ 8#242 /cacute
+ 8#243 /ccaron
+ 8#244 /dcaron
+ 8#245 /ecaron
+ 8#246 /eogonek
+ 8#247 /gbreve
+ 8#250 /lacute
+ 8#251 /lcaron
+ 8#252 /lslash
+ 8#253 /nacute
+ 8#254 /ncaron
+ 8#255 /eng
+ 8#256 /ohungarumlaut
+ 8#257 /racute
+ 8#260 /rcaron
+ 8#261 /sacute
+ 8#262 /scaron
+ 8#263 /scedilla
+ 8#264 /tcaron
+ 8#265 /tcedilla
+ 8#266 /uhungarumlaut
+ 8#267 /uring
+ 8#270 /ydieresis
+ 8#271 /zacute
+ 8#272 /zcaron
+ 8#273 /zdot
+ 8#274 /ij
+ 8#275 /exclamdown
+ 8#276 /questiondown
+ 8#277 /sterling
+
+ 8#300 /Agrave
+ 8#301 /Aacute
+ 8#302 /Acircumflex
+ 8#303 /Atilde
+ 8#304 /Adieresis
+ 8#305 /Aring
+ 8#306 /AE
+ 8#307 /Ccedilla
+ 8#310 /Egrave
+ 8#311 /Eacute
+ 8#312 /Ecircumflex
+ 8#313 /Edieresis
+ 8#314 /Igrave
+ 8#315 /Iacute
+ 8#316 /Icircumflex
+ 8#317 /Idieresis
+ 8#320 /Eth
+ 8#321 /Ntilde
+ 8#322 /Ograve
+ 8#323 /Oacute
+ 8#324 /Ocircumflex
+ 8#325 /Otilde
+ 8#326 /Odieresis
+ 8#327 /OE
+ 8#330 /Oslash
+ 8#331 /Ugrave
+ 8#332 /Uacute
+ 8#333 /Ucircumflex
+ 8#334 /Udieresis
+ 8#335 /Yacute
+ 8#336 /Thorn
+ 8#337 /Germandbls
+
+ 8#340 /agrave
+ 8#341 /aacute
+ 8#342 /acircumflex
+ 8#343 /atilde
+ 8#344 /adieresis
+ 8#345 /aring
+ 8#346 /ae
+ 8#347 /ccedilla
+ 8#350 /egrave
+ 8#351 /eacute
+ 8#352 /ecircumflex
+ 8#353 /edieresis
+ 8#354 /igrave
+ 8#355 /iacute
+ 8#356 /icircumflex
+ 8#357 /idieresis
+ 8#360 /eth
+ 8#361 /ntilde
+ 8#362 /ograve
+ 8#363 /oacute
+ 8#364 /ocircumflex
+ 8#365 /otilde
+ 8#366 /odieresis
+ 8#367 /oe
+ 8#370 /oslash
+ 8#371 /ugrave
+ 8#372 /uacute
+ 8#373 /ucircumflex
+ 8#374 /udieresis
+ 8#375 /yacute
+ 8#376 /thorn
+ 8#377 /germandbls
+
+T1.encode
+
+%%* Now copy OT1Encoding into T1Encoding and make a few changes.
+
+T1Encoding OT1Encoding copy pop
+
+mark
+ 8#000 /Gamma
+ 8#001 /Delta
+ 8#002 /Theta
+ 8#003 /Lambda
+ 8#004 /Xi
+ 8#005 /Pi
+ 8#006 /Sigma
+ 8#007 /Upsilon
+
+ 8#010 /Phi
+ 8#011 /Psi
+ 8#012 /Omega
+ 8#013 /ff
+ 8#014 /fi
+ 8#015 /fl
+ 8#016 /ffi
+ 8#017 /ffl
+
+ 8#020 /dotlessi
+ 8#021 /dotlessj
+ 8#022 /grave
+ 8#023 /acute
+ 8#024 /caron
+ 8#025 /breve
+ 8#026 /macron
+ 8#027 /ring
+
+ 8#030 /cedilla
+ 8#031 /germandbls
+ 8#032 /ae
+ 8#033 /oe
+ 8#034 /oslash
+ 8#035 /AE
+ 8#036 /OE
+ 8#037 /Oslash
+
+ 8#040 /polishslash
+
+ 8#042 /quotedblright
+
+ 8#074 /exclamdown
+ 8#076 /questiondown
+
+ 8#134 /quotedblleft
+ 8#137 /dotaccent
+
+ 8#173 /endash
+ 8#174 /emdash
+ 8#175 /hungarumlaut
+ 8#177 /dieresis
+OT1.encode
+
+%%* And add a few characters from the OT1Encoding
+
+mark
+ /Gamma (\\Gamma )
+ /Delta (\\Delta )
+ /Theta (\\Theta )
+ /Lambda (\\Lambda )
+ /Xi (\\Xi )
+ /Pi (\\Pi )
+ /Sigma (\\Sigma )
+ /Upsilon (\\Upsilon )
+
+ /Phi (\\Phi )
+ /Psi (\\Psi )
+ /Omega (\\Omega )
+
+ /dotlessj (j)
+ /ff (ff)
+
+ /cwm ()
+
+ /perthousandzero (0)
+
+ /polishslash ()
+
+ /Abreve (A*)
+ /Aogonek (A,)
+ /Cacute (C')
+ /Ccaron (C^)
+ /Dcaron (D^)
+ /Ecaron (E^)
+ /Eogonek (E,)
+ /Gbreve (G*)
+ /Lacute (L')
+ /Lcaron (L^)
+ /Nacute (N')
+ /Ncaron (N^)
+ /Eng (NG)
+ /Ohungarumlaut (O"")
+ /Racute (R')
+ /Rcaron (R^)
+ /Sacute (S')
+ /Scaron (S^)
+ /Scedilla (S,)
+ /Tcaron (T^)
+ /Tcedilla (T,)
+ /Uhungarumlaut (U"")
+ /Uring (U*)
+ /Ydieresis (Y")
+ /Zacute (Z')
+ /Zcaron (Z^)
+ /Zdot (Z.)
+ /IJ (IJ)
+ /Idot (I.)
+ /dbar (d-)
+ /abreve (a*)
+ /aogonek (a,)
+ /cacute (c')
+ /ccaron (c^)
+ /dcaron (d^)
+ /ecaron (e^)
+ /eogonek (e,)
+ /gbreve (g*)
+ /lacute (l')
+ /lcaron (l^)
+ /nacute (n')
+ /ncaron (n^)
+ /eng (ng)
+ /ohungarumlaut (o"")
+ /racute (r')
+ /rcaron (r^)
+ /sacute (s')
+ /scaron (s^)
+ /scedilla (s,)
+ /tcaron (t^)
+ /tcedilla (t,)
+ /uhungarumlaut (u"")
+ /uring (u*)
+ /zacute (z')
+ /zcaron (z^)
+ /zdot (z.)
+ /ij (ij)
+ /Germandbls (SS)
+.chars.def
+
+%%* We extend the df-tail command to stick in an Encoding vector (see
+%%* above for a discussion of the T1 and OT1 encodings), put in a
+%%* FontName (which will just be dvips's name for the font, i.e., Fa,
+%%* Fb, etc.) and give each font a separate FontBBox instead of
+%%* letting them all share a single one.
+
+/dvips.df-tail % id numcc maxcc df-tail
+ {
+ /nn 9 dict N
+ nn begin
+ %%
+ %% Choose an encoding based on the highest position occupied.
+ %%
+ dup 128 gt { T1Encoding } { OT1Encoding } ifelse
+ /Encoding X
+ /FontType 3 N
+ %%
+ %% It's ok for all the fonts to share a FontMatrix, but they
+ %% need to have separate FontBBoxes
+ %%
+ /FontMatrix fntrx N
+ /FontBBox [0 0 0 0] N
+ string /base X
+ array /BitMaps X
+ %%
+ %% And let's throw in a FontName for good measure
+ %%
+ dup ( ) cvs
+ %%
+ %% Make sure each font gets it own private FontName. -- dmj,
+ %% 12/23/97
+ %%
+ dup length string copy
+ /FontName X
+ /BuildChar {CharBuilder} N
+ end
+ dup { /foo setfont }
+ 2 array copy cvx N
+ load
+ 0 nn put
+ /ctr 0 N
+ [
+} def
+
+%%* This is functionally equivalent to dvips's /D procedure, but it
+%%* also calculates the Font Bounding Box while defining the
+%%* characters.
+
+/dvips.D % char-data ch D - : define character bitmap in current font
+{
+ /cc X % char-data
+ dup type /stringtype ne {]} if % char-data
+
+ /ch-data X
+ nn /base get cc ctr put % (adds ctr to cc'th position of BASE)
+ nn /BitMaps get
+ ctr
+ ch-data % BitMaps ctr char-data
+ sf 1 ne {
+ dup dup length 1 sub dup 2 index S get sf div put
+ } if
+ put % puts char-data into BitMaps at index ctr
+ /ctr ctr 1 add N
+%%
+%% Make sure the Font Bounding Box encloses the Bounding Box of the
+%% current character
+%%
+ nn /FontBBox get % BB
+
+ dup % calculate new llx
+ dup 0 get
+ ch-xoff
+ .min
+ 0 exch put
+
+ dup % calculate new lly
+ dup 1 get
+ ch-yoff ch-height sub
+ .min
+ 1 exch put
+
+ dup % calculate new urx
+ dup 2 get
+ ch-dx ch-width add
+ .max
+ 2 exch put
+
+ dup 3 get % calculate new ury
+ ch-yoff
+ .max
+ 3 exch put
+
+} def
+
+%%* Define start-hook to replace df-tail and D by our versions.
+%%* Unfortunately, the user can redefine start-hook and thus bypass
+%%* these changes, but I don't see an obvious way around that.
+
+userdict /start-hook {
+ TeXDict /df-tail /dvips.df-tail load bind put
+ TeXDict /D /dvips.D load bind put
+} put
+
+%%* Introduce a symbolic constant for hyphens. (Need to make
+%%* allowance for hyphen being in different place?)
+
+/.hyphen 45 def
+
+% Write out a string. If it ends in a letter and a hyphen,
+% don't write the hyphen, and set .show.last to a hyphen;
+% otherwise, set .show.last to the character (or \000 if it was a hyphen).
+/.show.write % <string>
+ {
+ dup length 1 ge
+ { dup dup length 1 sub get % string last_char
+ dup .hyphen eq % string last_char hyphen?
+ { % string last_char
+ 1 index length 1 gt
+ { 1 index dup length 2 sub get }
+ { //.show.last 0 get }
+ ifelse % string last_char prev-char
+ currentfont /Encoding get exch get % look up prev-char
+ //.letter.chars exch known % is it a letter?
+ { % Remove the hyphen % string last_char
+ exch % last_char string
+ dup length 1 sub % last_char string len-1
+ 0 exch getinterval % last_char string-1
+ exch % string-1 last_char
+ }
+ { pop 0 } % string 0
+ ifelse
+ }
+ if
+ //.show.last 0 3 -1 roll put % store last_char
+ % in .show.last
+ % If .show.last ==
+ % hyphen, then
+ % last char of
+ % previous string
+ % was a hyphen
+ }
+ if % string
+ { % begin forall % c
+ dup % c c
+ currentfont /Encoding get % c c vec
+ exch get % c name
+ dup //.char.map exch known % c name bool
+ { exch pop }
+ { pop OT1Encoding exch get }
+ ifelse % name
+ //.char.map exch get % translation
+ .show.stdout exch writestring
+ }
+ forall
+} odef
+
+/.showstring1 { % string
+ currentpoint .coord % string x y
+ 3 -1 roll dup .showwidth % x y string dx dy
+ 1 index % x y string dx dy dx
+ 0 rmoveto % x y string dx dy
+ .dcoord pop % x y string width
+ SIMPLE
+ { % x y string width
+ 2 index % x y string width y
+ //.show.y .iget % x y string width y old.y
+ %%*
+ %%* Replaced test "has y changed" by "has y changed by more
+ %%* than the current font height" so that subscripts and
+ %%* superscripts won't cause line/paragraph breaks
+ %%*
+ sub abs dup % x y string width dy dy
+ //.show.height .iget
+ gt
+ { % x y string width dy
+
+ %%* Vertical position has changed by more than the font
+ %%* height, so we now try to figure out whether we've
+ %%* started a new paragraph or merely a new line, using a
+ %%* variety of heuristics.
+
+ %%* If any of the following is true, we start a new
+ %%* paragraph:
+
+ %%* (a) the current vertical shift is more than 1.1 times
+ %%* the previous vertical shift, where 1.1 is an
+ %%* arbitrarily chosen factor that could probably be
+ %%* refined.
+
+ dup % x y string width dy dy
+ //.show.dy .iget 1.1 mul
+ gt
+ exch
+
+ %%* Save the new vertical shift
+
+ //.show.dy exch .iput
+
+ %%* (b) The vertical shift is more than 1.3 times the
+ %%* "size" of the current font. I've removed this
+ %%* test since it's not really very useful.
+
+%%* //.show.dy .iget
+%%* //.show.height .iget 1.4 mul
+%%* gt % x y string width bool
+%%* .show.height .iget 0 gt and % only perform test if font
+%%* % height is nonzero
+%%* or
+
+ %%* (c) the first character of the new line is one of the
+ %%* .break.chars
+
+ 2 index length % x y string width newpar? len
+ 0 gt % x y string width newpar? len>0?
+ {
+ 2 index 0 get % x y string width newpar? s
+ currentfont /Encoding get
+ exch get % x y string width newpar? s_enc
+ //.break.chars exch known { pop true } if
+ }
+ if % x y string width newpar?
+
+ %%* (d) The indentation of the new line is greater than
+ %%* the indentation of the previous line.
+
+ 4 index
+ //.show.indent .iget
+ gt
+ or
+
+ %%* HOWEVER, if the line ends in a hyphen, we do NOT begin
+ %%* a new paragraph (cf. comment at end of BF2). --dmj,
+ %%* 12/23/97
+
+ //.show.last 0 get .hyphen ne
+ and
+
+ % newpar?
+ { (\n\n) } % Paragraph
+ { % Line
+ %%*
+ %%* BF2: If last character on a line is
+ %%* a hyphen, we omit the hyphen and
+ %%* run the lines together. Of
+ %%* course, this will fail if a word
+ %%* with an explicit hyphen (e.g.,
+ %%* X-ray) is split across two lines.
+ %%* Oh, well. (What should we do
+ %%* about a hyphen that ends a
+ %%* "paragraph"? Perhaps that should
+ %%* inhibit a paragraph break.)
+ %%*
+ //.show.last 0 get .hyphen eq
+ { () }
+ { ( ) }
+ ifelse % x y string width char
+ }
+ ifelse
+ //print
+
+ //.show.y 3 index .iput % x y string width
+ //.show.x 4 index .iput % x y string width
+ //.show.indent 4 index .iput
+ }
+ { % x y string width dy
+ % If the word processor split a hyphenated word within
+ % the same line, put out the hyphen now.
+ pop
+ //.show.last 0 get .hyphen eq { (-) //print } if
+ }
+ ifelse
+ %%*
+ %%* If have moved more than 1 point to
+ %%* the right, interpret it as a
+ %%* space? This need to be looked at
+ %%* more closely.
+ %%*
+ 3 index % x y string width x
+ //.show.x .iget 10 add gt % x y string width bool
+ { ( ) //print }
+ if
+ % x y string width
+ 4 1 roll % width x y string
+ .show.write pop % width x
+ add //.show.x exch .iput % <empty>
+ }
+ { (S ) //print .show==4 }
+ ifelse
+} odef
+
+/.showstring
+ { dup () eq { pop } { .showstring1 } ifelse
+ } bind def
+
+% Redefine all the string display operators.
+
+/show {
+ .showfont
+ .showcolor
+ .showstring
+} codef
+
+% We define all the other operators in terms of .show1.
+
+/.show1.string ( ) def
+/.show1 { //.show1.string exch 0 exch put //.show1.string .showstring } odef
+/ashow
+ { .showfont .showcolor
+ { .show1 2 copy rmoveto } forall
+ pop pop
+ } codef
+/awidthshow
+ { .showfont .showcolor
+ { dup .show1 4 index eq { 4 index 4 index rmoveto } if
+ 2 copy rmoveto
+ }
+ forall
+ pop pop pop pop pop
+ } codef
+/widthshow
+ { .showfont .showcolor
+ //.show1.string 0 4 -1 roll put
+ { //.show1.string search not { exit } if
+ .showstring .showstring
+ 2 index 2 index rmoveto
+ } loop
+ .showstring pop pop
+ } codef
+/kshow
+ { .showfont .showcolor
+ %**************** Should construct a closure, in case the procedure
+ %**************** affects the o-stack.
+ { .show1 dup exec } forall pop
+ } codef
+
+% We don't really do the right thing with the Level 2 show operators,
+% but we do something semi-reasonable.
+/xshow { pop show } codef
+/yshow { pop show } codef
+/xyshow { pop show } codef
+/glyphshow
+ { currentfont /Encoding .knownget not { {} } if
+ 0 1 2 index length 1 sub
+ { % Stack: glyph encoding index
+ 2 copy get 3 index eq { exch pop exch pop null exit } if
+ pop
+ }
+ for null eq { (X) dup 0 4 -1 roll put show } { pop } ifelse
+ } codef
+
+end
+
+% Bind the operators we just defined, and all the others if we didn't
+% do it before. Also reenable 'bind' for future files.
+
+.bindoperators
+NOBIND currentdict systemdict ne and
+ { systemdict begin .bindoperators end }
+if
+NOBIND
+ { /bind /.bind load def }
+if
+
+% Make systemdict read-only if it wasn't already.
+
+systemdict wcheck { systemdict readonly pop } if
+
+% Restore the current local/global VM mode.
+
+exec
+
+
diff --git a/Master/xemtex/gslib/ps2epsi b/Master/xemtex/gslib/ps2epsi
new file mode 100644
index 00000000000..8e349d205a1
--- /dev/null
+++ b/Master/xemtex/gslib/ps2epsi
@@ -0,0 +1,78 @@
+#!/bin/sh
+# $Id: ps2epsi,v 1.7.2.1 2002/04/22 20:18:24 giles Exp $
+
+tmpfile=/tmp/ps2epsi$$
+
+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
+
+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";
+ print "end";
+ exit(0);
+ }
+ ' U="$USERNAME$LOGNAME" F=1 - F=2 "${infile}" >$tmpfile
+
+gs -q -dNOPAUSE -dSAFER -dDELAYSAFER -r72 -sDEVICE=bit -sOutputFile=/dev/null $tmpfile ps2epsi.ps $tmpfile <"${infile}" 1>&2
+rm -f $tmpfile
+
+(
+cat << BEGINEPS
+save countdictstack mark newpath /showpage {} def /setpagedevice {pop} def
+%%EndProlog
+%%Page: 1 1
+%%BeginDocument: ${infile}
+BEGINEPS
+
+cat "${infile}" |
+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
+%%EndDocument
+%%Trailer
+cleartomark countdictstack exch sub { end } repeat restore
+%%EOF
+ENDEPS
+
+) >> "${outfile}"
+
+exit 0
diff --git a/Master/xemtex/gslib/ps2epsi.bat b/Master/xemtex/gslib/ps2epsi.bat
new file mode 100644
index 00000000000..53ff10d1aac
--- /dev/null
+++ b/Master/xemtex/gslib/ps2epsi.bat
@@ -0,0 +1,28 @@
+@echo off
+@rem $Id: ps2epsi.bat,v 1.6 2001/06/22 16:09:22 lpd Exp $
+
+if %1/==/ goto usage
+if %2/==/ goto usage
+
+call gssetgs.bat
+set infile=%1
+set outfile=%2
+
+rem Ghostscript uses %outfile% to define the output file
+%GSC% -q -dNOPAUSE -dSAFER -dDELAYSAFER -sDEVICE=bit -sOutputFile=NUL ps2epsi.ps < %infile%
+
+rem We bracket the actual file with a few commands to help encapsulation
+echo /InitDictCount countdictstack def gsave save mark newpath >> %outfile%
+
+rem Append the original onto the preview header
+copy %outfile% + %infile%
+
+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/Master/xemtex/gslib/ps2epsi.cmd b/Master/xemtex/gslib/ps2epsi.cmd
new file mode 100755
index 00000000000..d5a0f52ccba
--- /dev/null
+++ b/Master/xemtex/gslib/ps2epsi.cmd
@@ -0,0 +1,31 @@
+/* $Id: ps2epsi.cmd,v 1.3 2001/06/22 16:09:22 lpd Exp $ */
+/*
+ * 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 Ghostscript uses %outfile% to define the output file
+gsos2 -q -dNOPAUSE -dSAFER -dDELAYSAFER -sDEVICE=bit -sOutputFile=NUL ps2epsi.ps < %infile%
+
+rem We bracket the actual file with a few commands to help encapsulation
+echo /InitDictCount countdictstack def gsave save mark newpath >> %outfile%
+
+rem Append the original onto the preview header
+copy %outfile% + %infile%
+
+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/Master/xemtex/gslib/ps2epsi.ps b/Master/xemtex/gslib/ps2epsi.ps
new file mode 100644
index 00000000000..0bd22288def
--- /dev/null
+++ b/Master/xemtex/gslib/ps2epsi.ps
@@ -0,0 +1,248 @@
+% Copyright (C) 1990-2002 artofcode LLC. All rights reserved.
+%
+% 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.
+
+% $Id: ps2epsi.ps,v 1.5.2.3.2.1 2003/04/12 14:02:39 giles Exp $
+% 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@aladdin.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
+ { % 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
+ //systemdict /.setsafe known { .setsafe } if
+ } 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
+ } if
+ } for
+
+ % Calculate the bounding box values.
+ % Note that these must be corrected to produce closed-open intervals.
+ /llx lm def
+ /lly devheight bm sub 1 sub def
+ /urx rm 1 add def
+ /ury devheight tm sub def
+
+ % 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 (%%BoundingBox: ) writestring
+ epsifile llx write==only epsifile ( ) writestring
+ epsifile lly write==only epsifile ( ) writestring
+ epsifile urx write==only epsifile ( ) writestring
+ epsifile ury write==
+
+ % Define character and bit widths for the output line buffer:
+ /cwidth rm lm sub 1 add def
+ /out cwidth string def
+
+ 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/Master/xemtex/gslib/ps2pdf b/Master/xemtex/gslib/ps2pdf
new file mode 100644
index 00000000000..1f4c8376531
--- /dev/null
+++ b/Master/xemtex/gslib/ps2pdf
@@ -0,0 +1,7 @@
+#!/bin/sh
+# $Id: ps2pdf,v 1.1 2000/03/09 08:40:40 lpd Exp $
+# Convert PostScript to PDF.
+
+# Currently, we produce PDF 1.2 by default, but this is not guaranteed
+# not to change in the future.
+exec ps2pdf12 "$@"
diff --git a/Master/xemtex/gslib/ps2pdf.bat b/Master/xemtex/gslib/ps2pdf.bat
new file mode 100644
index 00000000000..4abdf2becaf
--- /dev/null
+++ b/Master/xemtex/gslib/ps2pdf.bat
@@ -0,0 +1,18 @@
+@echo off
+@rem $Id: ps2pdf.bat,v 1.6 2001/06/22 16:09:22 lpd Exp $
+
+rem Convert PostScript to PDF 1.2 (Acrobat 3-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.
+
+rem The current default compatibility level is PDF 1.2.
+echo -dCompatibilityLevel#1.2 >_.at
+goto bot
+
+rem Pass arguments through a file to avoid overflowing the command line.
+:top
+echo %1 >>_.at
+shift
+:bot
+if not %3/==/ goto top
+call ps2pdfxx %1 %2
diff --git a/Master/xemtex/gslib/ps2pdf.cmd b/Master/xemtex/gslib/ps2pdf.cmd
new file mode 100755
index 00000000000..1ca35f2f416
--- /dev/null
+++ b/Master/xemtex/gslib/ps2pdf.cmd
@@ -0,0 +1,43 @@
+/* $Id: ps2pdf.cmd,v 1.1 2000/07/05 16:21:13 lpd Exp $ */
+/*
+ * 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). */
+/* 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 -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/Master/xemtex/gslib/ps2pdf12 b/Master/xemtex/gslib/ps2pdf12
new file mode 100644
index 00000000000..885960a0476
--- /dev/null
+++ b/Master/xemtex/gslib/ps2pdf12
@@ -0,0 +1,5 @@
+#!/bin/sh
+# $Id: ps2pdf12,v 1.1 2000/03/09 08:40:40 lpd Exp $
+# Convert PostScript to PDF 1.2 (Acrobat 3-and-later compatible).
+
+exec ps2pdfwr -dCompatibilityLevel=1.2 "$@"
diff --git a/Master/xemtex/gslib/ps2pdf12.bat b/Master/xemtex/gslib/ps2pdf12.bat
new file mode 100644
index 00000000000..c18d30c2f30
--- /dev/null
+++ b/Master/xemtex/gslib/ps2pdf12.bat
@@ -0,0 +1,15 @@
+@echo off
+@rem $Id: ps2pdf12.bat,v 1.5 2001/06/22 16:09:22 lpd Exp $
+
+rem Convert PostScript to PDF 1.2 (Acrobat 3-and-later compatible).
+
+echo -dCompatibilityLevel#1.2 >_.at
+goto bot
+
+rem Pass arguments through a file to avoid overflowing the command line.
+:top
+echo %1 >>_.at
+shift
+:bot
+if not %3/==/ goto top
+call ps2pdfxx %1 %2
diff --git a/Master/xemtex/gslib/ps2pdf12.cmd b/Master/xemtex/gslib/ps2pdf12.cmd
new file mode 100755
index 00000000000..2514039a76c
--- /dev/null
+++ b/Master/xemtex/gslib/ps2pdf12.cmd
@@ -0,0 +1,11 @@
+/* $Id: ps2pdf12.cmd,v 1.1 2000/07/05 16:21:13 lpd Exp $ */
+/*
+ * 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/Master/xemtex/gslib/ps2pdf13 b/Master/xemtex/gslib/ps2pdf13
new file mode 100644
index 00000000000..86b4d3ca963
--- /dev/null
+++ b/Master/xemtex/gslib/ps2pdf13
@@ -0,0 +1,5 @@
+#!/bin/sh
+# $Id: ps2pdf13,v 1.1 2000/03/09 08:40:40 lpd Exp $
+# Convert PostScript to PDF 1.3 (Acrobat 4-and-later compatible).
+
+exec ps2pdfwr -dCompatibilityLevel=1.3 "$@"
diff --git a/Master/xemtex/gslib/ps2pdf13.bat b/Master/xemtex/gslib/ps2pdf13.bat
new file mode 100644
index 00000000000..3881a1c967f
--- /dev/null
+++ b/Master/xemtex/gslib/ps2pdf13.bat
@@ -0,0 +1,15 @@
+@echo off
+@rem $Id: ps2pdf13.bat,v 1.5 2001/06/22 16:09:22 lpd Exp $
+
+rem Convert PostScript to PDF 1.3 (Acrobat 4-and-later compatible).
+
+echo -dCompatibilityLevel#1.3 >_.at
+goto bot
+
+rem Pass arguments through a file to avoid overflowing the command line.
+:top
+echo %1 >>_.at
+shift
+:bot
+if not %3/==/ goto top
+call ps2pdfxx %1 %2
diff --git a/Master/xemtex/gslib/ps2pdf13.cmd b/Master/xemtex/gslib/ps2pdf13.cmd
new file mode 100755
index 00000000000..8b26b38874b
--- /dev/null
+++ b/Master/xemtex/gslib/ps2pdf13.cmd
@@ -0,0 +1,11 @@
+/* $Id: ps2pdf13.cmd,v 1.2 2000/09/10 19:32:44 lpd Exp $ */
+/*
+ * 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/Master/xemtex/gslib/ps2pdf14 b/Master/xemtex/gslib/ps2pdf14
new file mode 100644
index 00000000000..65802329861
--- /dev/null
+++ b/Master/xemtex/gslib/ps2pdf14
@@ -0,0 +1,5 @@
+#!/bin/sh
+# $Id: ps2pdf14,v 1.1 2000/09/10 19:33:47 lpd Exp $
+# Convert PostScript to PDF 1.4 (Acrobat 5-and-later compatible).
+
+exec ps2pdfwr -dCompatibilityLevel=1.4 "$@"
diff --git a/Master/xemtex/gslib/ps2pdf14.bat b/Master/xemtex/gslib/ps2pdf14.bat
new file mode 100644
index 00000000000..a5f7d7d9397
--- /dev/null
+++ b/Master/xemtex/gslib/ps2pdf14.bat
@@ -0,0 +1,15 @@
+@echo off
+@rem $Id: ps2pdf14.bat,v 1.2 2001/06/22 16:09:22 lpd Exp $
+
+rem Convert PostScript to PDF 1.4 (Acrobat 5-and-later compatible).
+
+echo -dCompatibilityLevel#1.4 >_.at
+goto bot
+
+rem Pass arguments through a file to avoid overflowing the command line.
+:top
+echo %1 >>_.at
+shift
+:bot
+if not %3/==/ goto top
+call ps2pdfxx %1 %2
diff --git a/Master/xemtex/gslib/ps2pdf14.cmd b/Master/xemtex/gslib/ps2pdf14.cmd
new file mode 100755
index 00000000000..9144e695dae
--- /dev/null
+++ b/Master/xemtex/gslib/ps2pdf14.cmd
@@ -0,0 +1,11 @@
+/* $Id: ps2pdf14.cmd,v 1.1 2000/09/10 19:33:47 lpd Exp $ */
+/*
+ * 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/Master/xemtex/gslib/ps2pdfwr b/Master/xemtex/gslib/ps2pdfwr
new file mode 100644
index 00000000000..562824094bc
--- /dev/null
+++ b/Master/xemtex/gslib/ps2pdfwr
@@ -0,0 +1,36 @@
+#!/bin/sh
+# $Id: ps2pdfwr,v 1.6.2.1 2002/01/22 21:34:04 jackiem Exp $
+# Convert PostScript to PDF without specifying CompatibilityLevel.
+
+OPTIONS="-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 $OPTIONS -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "-sOutputFile=$outfile" $OPTIONS -c .setpdfwrite -f "$infile"
diff --git a/Master/xemtex/gslib/ps2pdfxx.bat b/Master/xemtex/gslib/ps2pdfxx.bat
new file mode 100644
index 00000000000..5e6797d0d35
--- /dev/null
+++ b/Master/xemtex/gslib/ps2pdfxx.bat
@@ -0,0 +1,56 @@
+@echo off
+@rem $Id: ps2pdfxx.bat,v 1.10 2001/06/22 16:09:22 lpd Exp $
+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 gssetgs.bat
+echo -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE#pdfwrite >_.at2
+
+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 >>_.at2
+copy /b /y _.at2+_.at >NUL
+echo -c .setpdfwrite -f %1 >>_.at2
+%GSC% @_.at @_.at2
+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
+call ps2pdfxx %1 %_1:.PS=.pdf%
+set _1=
+
+:end
+rem Clean up.
+if exist _.at erase _.at
+if exist _.at2 erase _.at2
diff --git a/Master/xemtex/gslib/ps2ps b/Master/xemtex/gslib/ps2ps
new file mode 100644
index 00000000000..9449b563fb6
--- /dev/null
+++ b/Master/xemtex/gslib/ps2ps
@@ -0,0 +1,20 @@
+#!/bin/sh
+# $Id: ps2ps,v 1.3 2001/06/22 16:09:22 lpd Exp $
+# "Distill" PostScript.
+
+OPTIONS="-dSAFER"
+while true
+do
+ case "$1" in
+ -*) OPTIONS="$OPTIONS $1" ;;
+ *) break ;;
+ esac
+ shift
+done
+
+if [ $# -ne 2 ]; then
+ echo "Usage: `basename $0` ...switches... input.ps output.ps" 1>&2
+ exit 1
+fi
+
+exec gs -q -sDEVICE=pswrite "-sOutputFile=$2" -dNOPAUSE -dBATCH $OPTIONS "$1"
diff --git a/Master/xemtex/gslib/ps2ps.bat b/Master/xemtex/gslib/ps2ps.bat
new file mode 100644
index 00000000000..be005e0f484
--- /dev/null
+++ b/Master/xemtex/gslib/ps2ps.bat
@@ -0,0 +1,23 @@
+@echo off
+@rem $Id: ps2ps.bat,v 1.4 2001/06/22 16:09:22 lpd Exp $
+@rem "Distill" PostScript.
+
+if %1/==/ goto usage
+if %2/==/ goto usage
+call gssetgs.bat
+echo -dNODISPLAY -dNOPAUSE -dSAFER -dBATCH >_.at
+:cp
+if %3/==/ goto doit
+echo %1 >>_.at
+shift
+goto cp
+
+:doit
+rem Watcom C deletes = signs, so use # instead.
+%GSC% -q -sDEVICE#pswrite -sOutputFile#%2 @_.at %1
+goto end
+
+:usage
+echo "Usage: ps2ps ...switches... input.ps output.ps"
+
+:end
diff --git a/Master/xemtex/gslib/ps2ps.cmd b/Master/xemtex/gslib/ps2ps.cmd
new file mode 100755
index 00000000000..9a556fdff14
--- /dev/null
+++ b/Master/xemtex/gslib/ps2ps.cmd
@@ -0,0 +1,36 @@
+/* $Id: ps2ps.cmd,v 1.1 2000/07/05 16:21:13 lpd Exp $ */
+/*
+ * 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='-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=pswrite -sOutputFile='outfile options infile
+exit
+
+usage:
+say 'Usage: ps2ps ...switches... input.ps output.ps'
+exit
diff --git a/Master/xemtex/gslib/pv.sh b/Master/xemtex/gslib/pv.sh
new file mode 100644
index 00000000000..0f3ae56f1c7
--- /dev/null
+++ b/Master/xemtex/gslib/pv.sh
@@ -0,0 +1,37 @@
+#!/bin/sh -f
+# $Id: pv.sh,v 1.1 2000/03/09 08:40:40 lpd Exp $
+#
+# pv - preview a specified page of a dvi file in a Ghostscript window
+# usage: pv page file
+#
+# pv converts the given page to PostScript and displays it
+# in a Ghostscript window.
+#
+if [ $# -lt 2 ] ;then
+ echo usage: $0 'page_number file_name[.dvi]'
+ exit 1
+fi
+#
+# The following line used to appear here:
+#
+#RESOLUTION=100
+#
+# But according to Peter Dyballa
+# <pete@lovelace.informatik.uni-frankfurt.de>, "Modern versions of dvips are
+# taught to read configuration files which tell them the paths to PK, TFM,
+# VF and other files for example PostScript font programmes. These files
+# tell #dvips too which default resolution is used and therefore which
+# series of PK files (based on 300 DPI or 400 DPI or 600 DPI or even more)
+# are held on the system." So we have deleted this line, and also removed
+# the -D switch from the call of dvips below.
+#
+TEMPDIR=.
+PAGE=$1
+shift
+FILE=$1
+shift
+trap "rm -rf $TEMPDIR/$FILE.$$.pv" 0 1 2 15
+#dvips -D$RESOLUTION -p $PAGE -n 1 $FILE $* -o $FILE.$$.pv
+dvips -p $PAGE -n 1 $FILE $* -o $FILE.$$.pv
+gs $FILE.$$.pv
+exit 0
diff --git a/Master/xemtex/gslib/quit.ps b/Master/xemtex/gslib/quit.ps
new file mode 100644
index 00000000000..eb5f288470a
--- /dev/null
+++ b/Master/xemtex/gslib/quit.ps
@@ -0,0 +1 @@
+quit
diff --git a/Master/xemtex/gslib/ras1.upp b/Master/xemtex/gslib/ras1.upp
new file mode 100644
index 00000000000..beb3433f845
--- /dev/null
+++ b/Master/xemtex/gslib/ras1.upp
@@ -0,0 +1,8 @@
+-supModel="SUN rasterfile, 1 Bit, 2 Colors (Ghostscript-Rendering)"
+-sDEVICE=uniprint
+-dNOPAUSE
+-dSAFER
+-dupColorModel=/DeviceGray
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/SunRaster
+-dupComponentBits={1}
diff --git a/Master/xemtex/gslib/ras24.upp b/Master/xemtex/gslib/ras24.upp
new file mode 100644
index 00000000000..c92f26e9694
--- /dev/null
+++ b/Master/xemtex/gslib/ras24.upp
@@ -0,0 +1,8 @@
+-supModel="SUN rasterfile, 24 Bit, 7 Colors (RGB-Error-Diffusion)"
+-sDEVICE=uniprint
+-dNOPAUSE
+-dSAFER
+-dupColorModel=/DeviceRGB
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/SunRaster
+-dupComponentBits="{8 8 8}"
diff --git a/Master/xemtex/gslib/ras3.upp b/Master/xemtex/gslib/ras3.upp
new file mode 100644
index 00000000000..96a0a2c7087
--- /dev/null
+++ b/Master/xemtex/gslib/ras3.upp
@@ -0,0 +1,8 @@
+-supModel="SUN rasterfile, 3 Bit, 7 Colors (RGB-Ghostscript)"
+-sDEVICE=uniprint
+-dNOPAUSE
+-dSAFER
+-dupColorModel=/DeviceRGB
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/SunRaster
+-dupComponentBits="{1 1 1}"
diff --git a/Master/xemtex/gslib/ras32.upp b/Master/xemtex/gslib/ras32.upp
new file mode 100644
index 00000000000..f75c6bbfa77
--- /dev/null
+++ b/Master/xemtex/gslib/ras32.upp
@@ -0,0 +1,8 @@
+-supModel="SUN rasterfile, 32 Bit, 6+1 Colors (CMYK-Error-Diffusion)"
+-sDEVICE=uniprint
+-dNOPAUSE
+-dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/SunRaster
+
diff --git a/Master/xemtex/gslib/ras4.upp b/Master/xemtex/gslib/ras4.upp
new file mode 100644
index 00000000000..1a9330058fa
--- /dev/null
+++ b/Master/xemtex/gslib/ras4.upp
@@ -0,0 +1,8 @@
+-supModel="SUN rasterfile, 4 Bit, 6+1 Colors (CMYK-Ghostscript)"
+-sDEVICE=uniprint
+-dNOPAUSE
+-dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/SunRaster
+-dupComponentBits="{1 1 1 1}"
diff --git a/Master/xemtex/gslib/ras8m.upp b/Master/xemtex/gslib/ras8m.upp
new file mode 100644
index 00000000000..304ad535d41
--- /dev/null
+++ b/Master/xemtex/gslib/ras8m.upp
@@ -0,0 +1,8 @@
+-supModel="SUN rasterfile, 8 Bit, 2 Colors (Error-Diffusion)"
+-sDEVICE=uniprint
+-dNOPAUSE
+-dSAFER
+-dupColorModel=/DeviceGray
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/SunRaster
+-dupComponentBits={8}
diff --git a/Master/xemtex/gslib/rollconv.ps b/Master/xemtex/gslib/rollconv.ps
new file mode 100644
index 00000000000..fbf5cacea69
--- /dev/null
+++ b/Master/xemtex/gslib/rollconv.ps
@@ -0,0 +1,385 @@
+%!
+% Copyright (C) 1995, 1996 Aladdin Enterprises. All rights reserved.
+% 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.
+
+% $Id: rollconv.ps,v 1.1.8.1 2003/04/12 14:02:39 giles Exp $
+% 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 (¿1pyÊ8å) 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
+(¿1py¼öUz) noaccess
+(¿1py½Äži) noaccess
+(¿1pù) noaccess
+(¿1p|35r·I) 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 55665 /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/Master/xemtex/gslib/showchar.ps b/Master/xemtex/gslib/showchar.ps
new file mode 100644
index 00000000000..bf560dd5383
--- /dev/null
+++ b/Master/xemtex/gslib/showchar.ps
@@ -0,0 +1,94 @@
+% Copyright (C) 1993, 1994, 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: showchar.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% showchar.ps
+% Show the outline and rasterized forms of a character.
+
+/F where { pop } { /F /Times-Roman def } ifelse
+/P where { pop } { /P 16 def } ifelse
+/Rx where { pop } { /Rx 100 def } ifelse
+/Ry where { pop } { /Ry 100 def } ifelse
+/Cs where { pop } { /Cs (M) def } ifelse
+/Pr where { pop } { /Pr false def } ifelse
+/Delay where { pop } { /Delay 0 def } ifelse
+
+0 setgray
+(markpath.ps) runlibfile
+(markhint.ps) runlibfile
+/mmx [1 0 0 1 0 0] def
+/getpath % - getpath <pathproc>
+ { [
+ { /moveto cvx } { /lineto cvx } { /curveto cvx } { /closepath cvx }
+ pathforall
+ ] cvx
+ } def
+/bitselectfont % <fontname> <scale> bitselectfont -
+ { exch findfont exch scalefont setfont
+ % Compute the bounding box in device coordinates.
+ gsave [Rx 72 div 0 0 Ry 72 div 0 0] setmatrix
+ currentfont /FontMatrix get concat
+ currentfont /FontBBox get aload pop
+ transform ceiling cvi /ury exch def ceiling cvi /urx exch def
+ transform floor cvi /lly exch def floor cvi /llx exch def
+ /bbx urx llx sub def /bby ury lly sub def
+ grestore
+ } def
+/bitshow % <string> bitshow -
+ { /S exch def gsave
+ /W bbx 8 add 7 or 1 add def
+ /H bby 8 add def
+ /buf W 8 idiv string def
+ /M [Rx 72 div 0 0 Ry -72 div 4 llx sub H 4 sub] def
+ M W H <ff 00> makeimagedevice
+ /dev exch def
+ gsave dev setdevice
+ newpath 0 lly idtransform moveto
+ 0 setgray
+ gsave
+ /hpath S false charpath getpath def
+ grestore
+ S show grestore
+ 20 20 translate
+ 50000 Rx Ry .max P mul div dup scale
+ 0.7 setgray
+ 0 W H true M
+ { dup 1 add exch dev exch buf copyscanlines
+ } imagemask pop
+ 0 setlinewidth
+ gsave 0.5 1 0.5 setrgbcolor hpath exec mmx markpath grestore
+ 0 0.5 1 setrgbcolor hpath exec stroke
+ % Show the hints for Type 1 fonts also.
+ currentfont /FontType get 1 eq
+ { gsave 1 0 0 setrgbcolor
+ 0 lly M idtransform translate
+ currentfont /FontMatrix get
+ dup Pr markfonthints
+ currentfont /Encoding get S 0 get get exch Pr markcharhints
+ grestore
+ }
+ if
+ } def
+F P bitselectfont
+/S1 1 string def
+Cs
+ { /C exch def
+ currentfont /Encoding get C get /.notdef ne
+ { save S1 0 C put S1 bitshow
+ showpage restore
+ } if
+ } forall
+quit
diff --git a/Master/xemtex/gslib/showpage.ps b/Master/xemtex/gslib/showpage.ps
new file mode 100644
index 00000000000..0a6ae9a7e1f
--- /dev/null
+++ b/Master/xemtex/gslib/showpage.ps
@@ -0,0 +1 @@
+showpage
diff --git a/Master/xemtex/gslib/st640ih.upp b/Master/xemtex/gslib/st640ih.upp
new file mode 100644
index 00000000000..0c79f3bbc76
--- /dev/null
+++ b/Master/xemtex/gslib/st640ih.upp
@@ -0,0 +1,57 @@
+-supModel="Epson Stylus Color 640, 1440x720DpI, Inkjet Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/st640ihg.upp b/Master/xemtex/gslib/st640ihg.upp
new file mode 100644
index 00000000000..faaf5dfc10e
--- /dev/null
+++ b/Master/xemtex/gslib/st640ihg.upp
@@ -0,0 +1,42 @@
+-supModel="Epson Stylus Color 640, 1440x720DpI, Grayscale, Inkjet Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/st640p.upp b/Master/xemtex/gslib/st640p.upp
new file mode 100644
index 00000000000..431592ffd96
--- /dev/null
+++ b/Master/xemtex/gslib/st640p.upp
@@ -0,0 +1,49 @@
+-supModel="Epson Stylus Color 640, 720x720DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/st640pg.upp b/Master/xemtex/gslib/st640pg.upp
new file mode 100644
index 00000000000..07cca7d7204
--- /dev/null
+++ b/Master/xemtex/gslib/st640pg.upp
@@ -0,0 +1,34 @@
+-supModel="Epson Stylus Color 640, 720x720DpI, Grayscale, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/st640pl.upp b/Master/xemtex/gslib/st640pl.upp
new file mode 100644
index 00000000000..4c851d51e51
--- /dev/null
+++ b/Master/xemtex/gslib/st640pl.upp
@@ -0,0 +1,49 @@
+-supModel="Epson Stylus Color 640, 360x360DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/st640plg.upp b/Master/xemtex/gslib/st640plg.upp
new file mode 100644
index 00000000000..82fe7a668b8
--- /dev/null
+++ b/Master/xemtex/gslib/st640plg.upp
@@ -0,0 +1,34 @@
+-supModel="Epson Stylus Color 640, 360x360DpI, Grayscale, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc.upp b/Master/xemtex/gslib/stc.upp
new file mode 100644
index 00000000000..c363728ab8e
--- /dev/null
+++ b/Master/xemtex/gslib/stc.upp
@@ -0,0 +1,53 @@
+-supModel="Epson Stylus Color I (and PRO Series), 360x360DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc1520h.upp b/Master/xemtex/gslib/stc1520h.upp
new file mode 100644
index 00000000000..e58b831cd24
--- /dev/null
+++ b/Master/xemtex/gslib/stc1520h.upp
@@ -0,0 +1,58 @@
+-supModel="Epson Stylus Color 1520, 1440x720DpI, Inkjet Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc2.upp b/Master/xemtex/gslib/stc2.upp
new file mode 100644
index 00000000000..b3a0ce16239
--- /dev/null
+++ b/Master/xemtex/gslib/stc2.upp
@@ -0,0 +1,53 @@
+-supModel="Epson Stylus Color II / IIs, 360x360DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc200_h.upp b/Master/xemtex/gslib/stc200_h.upp
new file mode 100644
index 00000000000..40cdcd9c9bc
--- /dev/null
+++ b/Master/xemtex/gslib/stc200_h.upp
@@ -0,0 +1,51 @@
+-supModel="Epson Stylus Color 200 , 360x720DpI"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc2_h.upp b/Master/xemtex/gslib/stc2_h.upp
new file mode 100644
index 00000000000..878abae53c5
--- /dev/null
+++ b/Master/xemtex/gslib/stc2_h.upp
@@ -0,0 +1,53 @@
+-supModel="Epson Stylus Color II, 720x720DpI, Special Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc2s_h.upp b/Master/xemtex/gslib/stc2s_h.upp
new file mode 100644
index 00000000000..802621fc876
--- /dev/null
+++ b/Master/xemtex/gslib/stc2s_h.upp
@@ -0,0 +1,57 @@
+-supModel="Epson Stylus Color IIs, 720x720DpI, Special Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc300.upp b/Master/xemtex/gslib/stc300.upp
new file mode 100644
index 00000000000..029faac5dc5
--- /dev/null
+++ b/Master/xemtex/gslib/stc300.upp
@@ -0,0 +1,60 @@
+-supModel="Epson Stylus Color 300, 360x360 dpi, colour, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc300bl.upp b/Master/xemtex/gslib/stc300bl.upp
new file mode 100644
index 00000000000..4c577952ea9
--- /dev/null
+++ b/Master/xemtex/gslib/stc300bl.upp
@@ -0,0 +1,40 @@
+-supModel="Epson Stylus Color 300, 180x180 dpi, black only, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc300bm.upp b/Master/xemtex/gslib/stc300bm.upp
new file mode 100644
index 00000000000..db69d4a164a
--- /dev/null
+++ b/Master/xemtex/gslib/stc300bm.upp
@@ -0,0 +1,43 @@
+-supModel="Epson Stylus Color 300, 360x360 dpi, black only, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc500p.upp b/Master/xemtex/gslib/stc500p.upp
new file mode 100644
index 00000000000..e3b43d25b13
--- /dev/null
+++ b/Master/xemtex/gslib/stc500p.upp
@@ -0,0 +1,48 @@
+-supModel="Epson Stylus Color 500, 360x360DpI, not Weaved, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc500ph.upp b/Master/xemtex/gslib/stc500ph.upp
new file mode 100644
index 00000000000..c14bae5fe60
--- /dev/null
+++ b/Master/xemtex/gslib/stc500ph.upp
@@ -0,0 +1,48 @@
+-supModel="Epson Stylus Color 500, 720x720DpI, not Weaved, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc600ih.upp b/Master/xemtex/gslib/stc600ih.upp
new file mode 100644
index 00000000000..6428c273da6
--- /dev/null
+++ b/Master/xemtex/gslib/stc600ih.upp
@@ -0,0 +1,58 @@
+-supModel="Epson Stylus Color 600, 1440x720DpI, Inkjet Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc600p.upp b/Master/xemtex/gslib/stc600p.upp
new file mode 100644
index 00000000000..f3b8338cac8
--- /dev/null
+++ b/Master/xemtex/gslib/stc600p.upp
@@ -0,0 +1,34 @@
+-supModel="Epson Stylus Color 600, 720x720DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc600pl.upp b/Master/xemtex/gslib/stc600pl.upp
new file mode 100644
index 00000000000..cfd6abf3530
--- /dev/null
+++ b/Master/xemtex/gslib/stc600pl.upp
@@ -0,0 +1,34 @@
+-supModel="Epson Stylus Color 600, 360x360DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc640p.upp b/Master/xemtex/gslib/stc640p.upp
new file mode 100644
index 00000000000..6559f89defd
--- /dev/null
+++ b/Master/xemtex/gslib/stc640p.upp
@@ -0,0 +1,33 @@
+-supModel="Epson Stylus Color 640, 720x720DpI, Inkjet Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc800ih.upp b/Master/xemtex/gslib/stc800ih.upp
new file mode 100644
index 00000000000..2adbab95952
--- /dev/null
+++ b/Master/xemtex/gslib/stc800ih.upp
@@ -0,0 +1,58 @@
+-supModel="Epson Stylus Color 800, 1440x720DpI, Inkjet Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc800p.upp b/Master/xemtex/gslib/stc800p.upp
new file mode 100644
index 00000000000..daaa005eb5f
--- /dev/null
+++ b/Master/xemtex/gslib/stc800p.upp
@@ -0,0 +1,34 @@
+-supModel="Epson Stylus Color 800, 720x720DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc800pl.upp b/Master/xemtex/gslib/stc800pl.upp
new file mode 100644
index 00000000000..7eceb31fd0c
--- /dev/null
+++ b/Master/xemtex/gslib/stc800pl.upp
@@ -0,0 +1,34 @@
+-supModel="Epson Stylus Color 800, 360x360DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc_h.upp b/Master/xemtex/gslib/stc_h.upp
new file mode 100644
index 00000000000..6cf3c11026b
--- /dev/null
+++ b/Master/xemtex/gslib/stc_h.upp
@@ -0,0 +1,53 @@
+-supModel="Epson Stylus Color I (and PRO Series), 720x720DpI, Special Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stc_l.upp b/Master/xemtex/gslib/stc_l.upp
new file mode 100644
index 00000000000..f6de35a3bd3
--- /dev/null
+++ b/Master/xemtex/gslib/stc_l.upp
@@ -0,0 +1,26 @@
+-supModel="Epson Stylus Color I (and PRO Series), 360x360DpI, noWeave"
+-sDEVICE=uniprint
+-dNOPAUSE
+-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="<
+ 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/Master/xemtex/gslib/stcany.upp b/Master/xemtex/gslib/stcany.upp
new file mode 100644
index 00000000000..e00ea5c29e0
--- /dev/null
+++ b/Master/xemtex/gslib/stcany.upp
@@ -0,0 +1,24 @@
+-supModel="Any Epson Stylus Color, 360x360DpI"
+-sDEVICE=uniprint
+-dNOPAUSE
+-dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r360x360
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupComponentBits="{1 1 1 1}"
+-dupBeginPageCommand="<
+ 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/Master/xemtex/gslib/stcany_h.upp b/Master/xemtex/gslib/stcany_h.upp
new file mode 100644
index 00000000000..43a67b3dcfd
--- /dev/null
+++ b/Master/xemtex/gslib/stcany_h.upp
@@ -0,0 +1,24 @@
+-supModel="Any Epson Stylus Color, 720x720DpI"
+-sDEVICE=uniprint
+-dNOPAUSE
+-dSAFER
+-dupColorModel=/DeviceCMYKgenerate
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r720x720
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupComponentBits="{1 1 1 1}"
+-dupBeginPageCommand="<
+ 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/Master/xemtex/gslib/stcinfo.ps b/Master/xemtex/gslib/stcinfo.ps
new file mode 100644
index 00000000000..c910f0d9435
--- /dev/null
+++ b/Master/xemtex/gslib/stcinfo.ps
@@ -0,0 +1,800 @@
+% Copyright (C) 1995 Aladdin Enterprises. All rights reserved
+%
+% 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.
+
+% $Id: stcinfo.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% 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 (Aladdin 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/Master/xemtex/gslib/stcolor.ps b/Master/xemtex/gslib/stcolor.ps
new file mode 100644
index 00000000000..76b51dcc383
--- /dev/null
+++ b/Master/xemtex/gslib/stcolor.ps
@@ -0,0 +1,172 @@
+% Copyright (C) 1995 Aladdin Enterprises. All rights reserved
+%
+% 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.
+
+% $Id: stcolor.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% 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 (Aladdin 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/Master/xemtex/gslib/stocht.ps b/Master/xemtex/gslib/stocht.ps
new file mode 100644
index 00000000000..db56356c3a6
--- /dev/null
+++ b/Master/xemtex/gslib/stocht.ps
@@ -0,0 +1,63 @@
+% Copyright (C) 1999, 2000 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: stocht.ps,v 1.3.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% 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.ps
+
+% 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/Master/xemtex/gslib/sysvlp.sh b/Master/xemtex/gslib/sysvlp.sh
new file mode 100644
index 00000000000..b93304ce481
--- /dev/null
+++ b/Master/xemtex/gslib/sysvlp.sh
@@ -0,0 +1,46 @@
+#!/bin/sh
+# $Id: sysvlp.sh,v 1.1 2000/03/09 08:40:40 lpd Exp $
+
+# System V 3.2 lp interface for parallel, postscript printer
+# with ghostscript 2.5.n.
+#
+# Thanks to Arne Ludwig (arne@rrzbu.hanse.de) for this script.
+#
+
+DEVICE=lbp8
+GSHOME=/local/gs/2.5b2
+FONT=/local
+LIBDIR=/usr/spool/lp/admins/lp/interfaces
+#EHANDLER=$LIBDIR/ehandler.ps
+
+GS_LIB=$GSHOME:$FONT/fonts:$FONT/fonts/lw:$FONT/fonts/gs
+export GS_LIB
+
+copies=$4
+shift 5
+files="$*"
+
+# serial line settings
+# stty 19200 ixon ixoff 0<&1
+# stty 1200 tabs cread opost onlcr ixon ixany ff1 cr2 nl0 0<&1
+
+# Brother HL-4: switch to HP laserjet II+ emulation
+# echo "\033\015H\c"
+
+i=1
+while [ $i -le $copies ]
+do
+ for file in $files
+ do
+ $GSHOME/gs \
+ -sOUTPUTFILE=/tmp/psp$$.%02d \
+ -sDEVICE=$DEVICE \
+ $EHANDLER $file \
+ < /dev/null >> /usr/tmp/ps_log 2>&1
+
+ cat /tmp/psp$$.* 2>> /usr/tmp/ps_log
+ rm -f /tmp/psp$$.*
+ done
+ i=`expr $i + 1`
+done
+exit 0
diff --git a/Master/xemtex/gslib/traceimg.ps b/Master/xemtex/gslib/traceimg.ps
new file mode 100644
index 00000000000..1b8488c9aa7
--- /dev/null
+++ b/Master/xemtex/gslib/traceimg.ps
@@ -0,0 +1,43 @@
+% Copyright (C) 1994 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: traceimg.ps,v 1.2.6.2.2.1 2003/04/12 14:02:39 giles Exp $
+% 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/Master/xemtex/gslib/traceop.ps b/Master/xemtex/gslib/traceop.ps
new file mode 100644
index 00000000000..3ac00cb8623
--- /dev/null
+++ b/Master/xemtex/gslib/traceop.ps
@@ -0,0 +1,84 @@
+% Copyright (C) 1992, 1993, 1994, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: traceop.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% 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/Master/xemtex/gslib/type1enc.ps b/Master/xemtex/gslib/type1enc.ps
new file mode 100644
index 00000000000..02573c42f01
--- /dev/null
+++ b/Master/xemtex/gslib/type1enc.ps
@@ -0,0 +1,66 @@
+% Copyright (C) 1992, 1993 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: type1enc.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% type1enc.ps
+% PostScript language versions of the Type 1 encryption/decryption algorithms.
+
+% This file is normally not needed with Ghostscript, since Ghostscript
+% implements these algorithms in C. For the specifications, see Chapter 7 of
+% "Adobe Type 1 Font Format," ISBN 0-201-57044-0, published by Addison-Wesley.
+
+/.type1crypt % <R> <from> <to> <proc> .type1crypt <R'> <to>
+ % (auxiliary procedure)
+ { 4 1 roll
+ 0 2 index length getinterval
+ 0 1 2 index length 1 sub
+ { % Stack: proc R from to index
+ 2 index 1 index get % proc R from to index C/P
+ 4 index -8 bitshift xor 3 copy put % proc R from to index P/C
+ 5 index exec % proc R from to C
+
+% Compute R' = ((R + C) * 52845 + 22719) mod 65536
+% without exceeding a 31-bit integer magnitude, given that
+% 0 <= R <= 65535 and 0 <= C <= 255.
+
+ 4 -1 roll add
+ dup 20077 mul % 52845 - 32768
+ exch 1 and 15 bitshift add % only care about 16 low-order bits
+ 22719 add 65535 and 3 1 roll
+ }
+ for exch pop 3 -1 roll pop
+ } bind def
+
+% <state> <fromString> <toString> .type1encrypt <newState> <toSubstring>
+% Encrypts fromString according to the algorithm for Adobe
+% Type 1 fonts, writing the result into toString.
+% toString must be at least as long as fromString or a
+% rangecheck error occurs. state is the initial state of
+% the encryption algorithm (a 16-bit non-negative
+% integer); newState is the new state of the algorithm.
+
+/.type1encrypt
+ { { exch pop } .type1crypt
+ } bind def
+
+% <state> <fromString> <toString> .type1decrypt <newState> <toSubstring>
+% Decrypts fromString according to the algorithm for Adobe
+% Type 1 fonts, writing the result into toString. Other
+% specifications are as for type1encrypt.
+
+/.type1decrypt
+ { { pop 2 index exch get } .type1crypt
+ } bind def
diff --git a/Master/xemtex/gslib/type1ops.ps b/Master/xemtex/gslib/type1ops.ps
new file mode 100644
index 00000000000..c4644924f73
--- /dev/null
+++ b/Master/xemtex/gslib/type1ops.ps
@@ -0,0 +1,238 @@
+% Copyright (C) 1992, 1997, 1998, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: type1ops.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% type1ops.ps
+% Define the Type 1 and Type 2 font opcodes for use by Ghostscript utilities.
+
+% Define the default value of lenIV.
+% Note that this expects the current font to be on the dictionary stack.
+
+/lenIV { FontType 2 eq { -1 } { 4 } ifelse } def
+
+% ---------------- Encoding ---------------- %
+
+/Type1encode 70 dict
+
+ % Data types
+
+dup /nulltype {
+ pop ()
+} put
+dup /nametype {
+ Type1encode exch get
+} put
+dup /stringtype {
+} put
+dup /integertype {
+ dup dup -107 ge exch 107 le and {
+ 139 add (x) dup 0 4 -1 roll put
+ } {
+ dup dup -1131 ge exch 1131 le and {
+ dup 0 ge { 16#f694 } { neg 16#fa94 } ifelse add
+ (xx) dup dup 0 4 index -8 bitshift put
+ 1 4 -1 roll 255 and put
+ } {
+ (\377xxxx) 1 1 4 {
+ dup 8 mul 32 sub 3 index exch bitshift 255 and
+ 2 index 3 1 roll put
+ } for exch pop
+ } ifelse
+ } ifelse
+} put
+
+ % Operators
+
+% Identical or similar in Type 1 and Type 2.
+/c_hstem 1 def dup /hstem <01> put
+/c_vstem 3 def dup /vstem <03> put
+/c_vmoveto 4 def dup /vmoveto <04> put
+/c_rlineto 5 def dup /rlineto <05> put
+/c_hlineto 6 def dup /hlineto <06> put
+/c_vlineto 7 def dup /vlineto <07> put
+/c_rrcurveto 8 def dup /rrcurveto <08> put
+/c_callsubr 10 def /s_callsubr <0a> def dup /callsubr s_callsubr put
+/c_return 11 def dup /return <0b> put
+/c_escape 12 def
+ /ce_div 12 def /s_div <0c0c> def dup /div s_div put
+/c_endchar 14 def /s_endchar <0e> def dup /endchar s_endchar put
+/c_rmoveto 21 def dup /rmoveto <15> put
+/c_hmoveto 22 def dup /hmoveto <16> put
+/c_vhcurveto 30 def dup /vhcurveto <1e> put
+/c_hvcurveto 31 def dup /hvcurveto <1f> put
+% Only in Type 1.
+/c_closepath 9 def dup /closepath <09> put
+/c_hsbw 13 def /s_hsbw <0d> def dup /hsbw s_hsbw put
+ /ce_dotsection 0 def /s_dotsection <0c06> def dup /dotsection s_dotsection put
+ /ce_vstem3 1 def /s_vstem3 <0c01> def dup /vstem3 s_vstem3 put
+ /ce_hstem3 2 def /s_hstem3 <0c02> def dup /hstem3 s_hstem3 put
+ /ce_seac 6 def /s_seac <0c06> def dup /seac s_seac put
+ /ce_sbw 7 def /s_sbw <0c07> def dup /sbw s_sbw put
+ /ce_callothersubr 16 def /s_callothersubr <0c10> def dup /callothersubr s_callothersubr put
+ /ce_pop 17 def /s_pop <0c11> def dup /pop s_pop put
+ /ce_setcurrentpoint 33 def /s_setcurrentpoint <0c21> def dup /setcurrentpoint s_setcurrentpoint put
+ /s_setcurrentpoint_hmoveto s_setcurrentpoint <8b16> concatstrings def
+% Only in Type 2.
+dup /blend <10> put
+dup /hstemhm <12> put
+dup /hintmask <13> put
+dup /cntrmask <14> put
+dup /vstemhm <17> put
+dup /rcurveline <18> put
+dup /rlinecurve <19> put
+dup /vvcurveto <1a> put
+dup /hhcurveto <1b> put
+dup /callgsubr <1d> put
+ dup /and <0c03> put
+ dup /or <0c04> put
+ dup /not <0c05> put
+ dup /store <0c08> put
+ dup /abs <0c09> put
+ dup /add <0c0a> put
+ dup /sub <0c0b> put
+ dup /load <0c0d> put
+ dup /neg <0c0c> put
+ dup /eq <0c0f> put
+ dup /drop <0c12> put
+ dup /put <0c14> put
+ dup /get <0c15> put
+ dup /ifelse <0c16> put
+ dup /random <0c17> put
+ dup /mul <0c18> put
+ dup /sqrt <0c1a> put
+ dup /dup <0c1b> put
+ dup /exch <0c1c> put
+ dup /index <0c1d> put
+ dup /roll <0c1e> put
+ dup /hflex <0c22> put
+ dup /flex <0c23> put
+ dup /hflex1 <0c24> put
+ dup /flex1 <0c25> put
+
+readonly def
+
+% ---------------- Decoding ---------------- %
+
+/Type1decode 512 array
+
+Type1encode {
+ dup type /stringtype eq {
+ dup length 1 eq { 0 get } { 1 get 256 add } ifelse
+ % stack: array key code
+ exch 2 index 3 1 roll put
+ } {
+ pop pop
+ } ifelse
+} forall
+
+dup 12 {
+ dup read pop dup Type1decode exch 256 add get dup null ne
+ { exch pop }
+ { pop 2 string dup 0 12 put dup 1 4 -1 roll put }
+ ifelse
+} put
+dup 28 { % Type 2 only
+ dup read pop 128 xor 128 sub 8 bitshift
+ 1 index read pop add
+} put
+32 1 246 { 2 copy dup 139 sub put pop } for
+dup 247 { dup read pop 108 add } put
+dup 248 { dup read pop 364 add } put
+dup 249 { dup read pop 620 add } put
+dup 250 { dup read pop 876 add } put
+dup 251 { dup read pop 108 add neg } put
+dup 252 { dup read pop 364 add neg } put
+dup 253 { dup read pop 620 add neg } put
+dup 254 { dup read pop 876 add neg } put
+dup 255 { % Different for Type 1 and Type 2
+ dup read pop 128 xor 128 sub
+ 3 { 8 bitshift 1 index read pop add } repeat
+ FontType 2 eq { 65536.0 div } if
+} put
+
+readonly def
+
+% ---------------- Procedures ---------------- %
+
+% For these utilities, a CharString is represented by a sequence of
+% integers, reals, strings, and names, either in an array or on the stack.
+% Integers and reals represent themselves; strings are other data that
+% appears in the CharString; names are CharString operator names.
+% A CharString in an array is called a "charproc"; a CharString on
+% the stack is called a "charstack", and is delimited by a mark.
+% Individual elements are called "chartokens".
+
+% ------ Encoding ------ %
+
+% Get the string for a chartoken.
+% Note that this string may be overwritten by the next call.
+/chartoken_string { % <chartoken> chartoken_string <string>
+ dup type Type1encode exch get exec
+} bind def
+% Compute the length of a CharString.
+/chartoken_length { % <chartoken> chartoken_length <length>
+ chartoken_string length
+} bind def
+/charproc_length { % <charproc> charproc_length <length>
+ 0 exch { chartoken_length add } forall
+} bind def
+/charstack_length { % <charstack> charstack_length <charstack> <length>
+ counttomark 0 exch -1 1 { index chartoken_length add } for
+} bind def
+
+% Write a CharString to a file. Normally this will be a NullEncode filter
+% writing on a string of the correct length.
+/chartoken_write { % <file> <chartoken> chartoken_write -
+ chartoken_string writestring
+} bind def
+/charproc_write { % <file> <charproc> charproc_write -
+ { 1 index exch chartoken_write } forall pop
+} bind def
+% Note that the arguments of charstack_write are backwards.
+/charstack_write { % <charstack> <file> charstack_write -
+ counttomark 1 sub -1 1 { index 1 index exch chartoken_write } for
+ cleartomark
+} bind def
+
+% Convert a charproc or charstack to an *un*encrypted CharString.
+/charproc_string { % <charproc> charproc_string <string>
+ mark exch aload pop charstack_string
+} bind def
+/charstack_string { % <charstack> charstack_string <string>
+ charstack_length lenIV 0 gt {
+ lenIV add string
+ dup dup length lenIV sub lenIV exch getinterval % skip lenIV
+ } {
+ string
+ } ifelse
+ /NullEncode filter
+ exch 1 index counttomark 1 add 2 roll
+ charstack_write closefile
+% lenIV 0 ge { 4330 exch dup .type1encrypt exch pop readonly } if
+} bind def
+
+% ------ Decoding ------ %
+
+% Decode a CharString (unencrypted).
+/charstack_read { % <file> charstack_read <no-mark-charstack>
+ { dup read not { pop exit } if
+ Type1decode 1 index get dup null eq {
+ pop 1 string dup 0 4 -1 roll put
+ } {
+ exch pop exec
+ } ifelse exch
+ } loop
+} bind def
diff --git a/Master/xemtex/gslib/uninfo.ps b/Master/xemtex/gslib/uninfo.ps
new file mode 100644
index 00000000000..211d3af15a5
--- /dev/null
+++ b/Master/xemtex/gslib/uninfo.ps
@@ -0,0 +1,221 @@
+%!
+% Copyright (C) 1997 Aladdin Enterprises. All rights reserved
+%
+% 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.
+
+% $Id: uninfo.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% 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/Master/xemtex/gslib/unix-lpr.sh b/Master/xemtex/gslib/unix-lpr.sh
new file mode 100644
index 00000000000..48754326920
--- /dev/null
+++ b/Master/xemtex/gslib/unix-lpr.sh
@@ -0,0 +1,161 @@
+#!/bin/sh
+# $Id: unix-lpr.sh,v 1.1.6.1 2002/04/22 19:54:55 giles Exp $
+#
+# 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'.
+#
+
+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 -q -dNOPAUSE -sDEVICE=${device} -dBitsPerPixel=${bpp} $colorspec \
+ -sOutputFile=\|"${gsoutput}" -
+# -sOutputFile=${gspipe} -
+
+rm -f ${gspipe}
+#
+# End the logfile entry
+#
+echo "gsif: end - `date`"
+
diff --git a/Master/xemtex/gslib/unprot.ps b/Master/xemtex/gslib/unprot.ps
new file mode 100644
index 00000000000..712eff6064e
--- /dev/null
+++ b/Master/xemtex/gslib/unprot.ps
@@ -0,0 +1,68 @@
+% Copyright (C) 1991, 1992, 1998 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: unprot.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% Disable all access checks. This is useful for printing out
+% eexec-encrypted Type 1 fonts, and similar purposes.
+
+systemdict wcheck
+ { /protdict systemdict def
+ }
+ { (Please restart Ghostscript with the -dWRITESYSTEMDICT switch.\n) print
+ (Some access checks will remain active if you do not do this.\n) print
+ flush
+ /protdict userdict def
+ }
+ifelse
+
+% The procedures we're about to define will go in systemdict,
+% so they must be allocated in global VM.
+
+.currentglobal true .setglobal
+
+protdict begin
+ /readonly. /readonly load def
+ /executeonly. /executeonly load def
+ /noaccess. /noaccess load def
+ /readonly { } odef
+ /readonly.. /readonly load def
+ /executeonly { } odef
+ /executeonly.. /executeonly load def
+ /noaccess { } odef
+ /noaccess.. /noaccess load def
+end
+
+% Disable the access checks.
+
+/unprot
+ { protdict begin
+ /readonly /readonly.. load def
+ /executeonly /executeonly.. load def
+ /noaccess /noaccess.. load def
+ end
+ } bind def
+
+% Re-enable the access checks.
+
+/reprot
+ { protdict begin
+ /readonly /readonly. load def
+ /executeonly /executeonly. load def
+ /noaccess /noaccess. load def
+ end
+ } bind def
+
+.setglobal
diff --git a/Master/xemtex/gslib/viewcmyk.ps b/Master/xemtex/gslib/viewcmyk.ps
new file mode 100644
index 00000000000..8a95f8b02cd
--- /dev/null
+++ b/Master/xemtex/gslib/viewcmyk.ps
@@ -0,0 +1,64 @@
+% Copyright (C) 1996, 1997, 1998 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: viewcmyk.ps,v 1.2.6.2.2.1 2003/04/12 14:02:39 giles Exp $
+% 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/Master/xemtex/gslib/viewgif.ps b/Master/xemtex/gslib/viewgif.ps
new file mode 100644
index 00000000000..a03bff0aa00
--- /dev/null
+++ b/Master/xemtex/gslib/viewgif.ps
@@ -0,0 +1,161 @@
+% Copyright (C) 1989, 1992, 1993, 1998 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: viewgif.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% 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
+ DEBUG { Header { exch == == } forall (----------------\n) print flush } if
+ F readGIFimageHeader /ImageHeader exch def
+ currentdict ImageHeader end begin begin
+ DEBUG { 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
diff --git a/Master/xemtex/gslib/viewjpeg.ps b/Master/xemtex/gslib/viewjpeg.ps
new file mode 100644
index 00000000000..082c27d2c52
--- /dev/null
+++ b/Master/xemtex/gslib/viewjpeg.ps
@@ -0,0 +1,153 @@
+%! viewjpeg.ps Copyright (C) 1994 Thomas Merz <tm@pdflib.com>
+%
+% 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.
+
+% $Id: viewjpeg.ps,v 1.1.6.2.2.1 2003/04/12 14:02:39 giles Exp $
+% 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.
+%
+% 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
+
+ DEBUG { 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
diff --git a/Master/xemtex/gslib/viewmiff.ps b/Master/xemtex/gslib/viewmiff.ps
new file mode 100644
index 00000000000..daf56ed458c
--- /dev/null
+++ b/Master/xemtex/gslib/viewmiff.ps
@@ -0,0 +1,125 @@
+% Copyright (C) 1998 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: viewmiff.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% 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.
+
+% 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 {
+ .namestring (=) 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
+ /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/Master/xemtex/gslib/viewpbm.ps b/Master/xemtex/gslib/viewpbm.ps
new file mode 100644
index 00000000000..2ba6907e48f
--- /dev/null
+++ b/Master/xemtex/gslib/viewpbm.ps
@@ -0,0 +1,185 @@
+% Copyright (C) 1992, 1995, 1996, 1998, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: viewpbm.ps,v 1.2.6.2.2.1 2003/04/12 14:02:39 giles Exp $
+% 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.
+
+/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
+.dicttomark readonly def
+/pbmsetup { % <file> <w> <h> <readproc> runpbm -
+ /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
+ % 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
+ } {
+ % Scale the image (uniformly) to fit the page.
+ clippath pathbbox pop pop translate
+ pathbbox .min exch pop exch pop ceiling
+ dup Height Width gt {
+ Width mul Height div exch
+ } {
+ Height mul Width div
+ } 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
+ 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
+ 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 [--] viewpbm.ps filename.p*m ...\n) print
+ ( e.g.: gs [--] viewpbm.ps my.ppm another.ppm\n) print flush
+ }
+ ifelse
+ }
+ { pop
+ }
+ifelse
diff --git a/Master/xemtex/gslib/viewpcx.ps b/Master/xemtex/gslib/viewpcx.ps
new file mode 100644
index 00000000000..204db00eb03
--- /dev/null
+++ b/Master/xemtex/gslib/viewpcx.ps
@@ -0,0 +1,151 @@
+% Copyright (C) 1996, 1999 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: viewpcx.ps,v 1.2.6.2.2.1 2003/04/12 14:02:39 giles Exp $
+% 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.
+% ****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
+ /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
+ % 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
+ }
+ { % 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 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/Master/xemtex/gslib/viewps2a.ps b/Master/xemtex/gslib/viewps2a.ps
new file mode 100644
index 00000000000..53073ea3fdd
--- /dev/null
+++ b/Master/xemtex/gslib/viewps2a.ps
@@ -0,0 +1,33 @@
+% Copyright (C) 1995 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: viewps2a.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% 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/Master/xemtex/gslib/wftopfa b/Master/xemtex/gslib/wftopfa
new file mode 100644
index 00000000000..a6cf9bb9729
--- /dev/null
+++ b/Master/xemtex/gslib/wftopfa
@@ -0,0 +1,3 @@
+#!/bin/sh
+# $Id: wftopfa,v 1.1 2000/03/09 08:40:40 lpd Exp $
+exec gs -q -dNODISPLAY -- wftopfa.ps "$@"
diff --git a/Master/xemtex/gslib/wftopfa.ps b/Master/xemtex/gslib/wftopfa.ps
new file mode 100644
index 00000000000..a3ab45964a8
--- /dev/null
+++ b/Master/xemtex/gslib/wftopfa.ps
@@ -0,0 +1,304 @@
+% Copyright (C) 1995, 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: wftopfa.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% wftopfa.ps
+% Convert a Wadalab base font to .PFA (or .PFB) format.
+
+(gs_ksb_e.ps) runlibfile
+(wrfont.ps) runlibfile
+
+/wftopfa_dict 100 dict def
+wftopfa_dict begin
+
+/KanjiSubEncoding dup .findencoding def
+
+% Initialize parameters.
+/init % - init -
+ { /chars 256 dict def
+ /version (001.001) def
+ /highcode 0 def
+ /StdHW [32] def
+ /StdVW [32] def
+ /UniqueID 20000000 def
+ /FontBase (Wadalab) def
+ /StdEncMode false def
+ /CustomEncMode false def
+ /Binary false def
+ /Encrypt true def
+ } bind def
+
+% Read definitions.
+/rdstring 5000 string def
+/readdefs % <filename> readdefs -
+ { (r) file
+ { dup rdstring readline not { pop exit } if
+ dup length 15 ge
+ { dup dup length 7 sub 7 getinterval (> CompD) eq
+ { token pop exch token pop exch pop
+ dup 0 get /highcode exch def
+ exch chars 3 1 roll put
+ }
+ { pop
+ }
+ ifelse
+ }
+ { pop
+ }
+ ifelse
+ }
+ loop closefile
+ } bind def
+
+% Write out the final font.
+/writepfa
+ { 4 string highcode 16#1000 add 16 2 index cvrs 0 (.r) putinterval
+ FontBase exch concatstrings /fullname exch def
+ UniqueID 20000000 eq { /UniqueID 4990000 highcode add def } if
+ /encoding CustomEncMode
+ { KanjiSubEncoding }
+ { StdEncMode { StandardEncoding } { ISOLatin1Encoding } ifelse }
+ ifelse def
+
+ /Font 30 dict def
+ Font begin
+ /FontInfo 20 dict def
+ FontInfo begin
+
+ % Write the clear text part.
+
+ /CreationDate (%Calendar%) currentdevparams
+ dup /Weekday get {(Sun )(Mon )(Tue )(Wed )(Thu )(Fri )(Sat )} exch get
+ 1 index /Month get 1 sub
+ {(Jan)(Feb)(Mar)(Apr)(May)(Jun)(Jul)(Aug)(Sep)(Oct)(Nov)(Dec)} exch get
+ concatstrings
+ {{/Day ( )} {/Hour ( )} {/Minute (:)} {/Second (:)} {/Year ( )}}
+ { dup 1 get 3 -1 roll exch concatstrings exch
+ 0 get 2 index exch get
+ dup 10 lt { =string cvs (0) exch concatstrings } { =string cvs } ifelse
+ concatstrings
+ }
+ forall exch pop readonly def
+ /VMusage 100000 def
+ /version version readonly def
+ /Notice (No copyright on this font. Original available from moe.ipl.t.u-tokyo.ac.jp:/Font. Converted by wftopfa.ps (Aladdin Enterprises).) readonly def
+ /FullName fullname readonly def
+ /FamilyName FontBase readonly def
+ /Weight (Regular) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch true def
+ /UnderlinePosition 0 def
+ /UnderlineThickness 0 def
+
+ end % FontInfo
+
+ /FontName fullname cvn def
+ /Encoding encoding def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [.001 0 0 .001 0 -0.16] readonly def
+ /UniqueID UniqueID def
+ /FontBBox [0 0 1000 1000] readonly def
+
+ /Private 20 dict def
+ Private begin
+
+ /-| {string currentfile exch readstring pop} readonly def
+ /|- {readonly def} readonly def
+ /| {readonly put} readonly def
+ /BlueValues [] readonly def
+ /OtherBlues [] readonly def
+ /MinFeature {16 16} readonly def
+ /StdHW StdHW def
+ /StdVW StdVW def
+ /ForceBold false def
+ /password 5839 def
+ /UniqueID UniqueID def
+ /OtherSubrs [] readonly def
+ /Subrs [
+ (\020\2771p|\020\024\020=-\223D\\\342R) readonly
+ (\020\2771py\274\366Uz) readonly
+ (\020\2771py\275\304\236i) readonly
+ (\020\2771p\371) readonly
+ (\020\2771p~\266+6\034\3446z) readonly
+ ] readonly def
+
+ end % Private
+
+ /CharStrings 256 dict def
+ chars
+ { exch =string cvs
+ dup 0 get highcode eq
+ { 1 get encoding exch get exch CharStrings 3 1 roll put }
+ { pop pop }
+ ifelse
+ }
+ forall
+
+ end % Font
+
+ Font /FontName get Font definefont setfont
+ (%stdout) (w) file writefont
+ } bind def
+
+% Scan the command line and process files.
+/options mark
+ /version { 2 copy get /version exch def 1 add } bind
+ /StdHW { 2 copy get cvx exec /StdHW exch def 1 add } bind
+ /StdVW { 2 copy get cvx exec /StdVW exch def 1 add } bind
+ /UniqueId { 2 copy get cvi /UniqueID exch def 1 add } bind
+ /UniqueID 1 index
+ /FontBase { 2 copy get /FontBase exch def 1 add } bind
+ /StdEnc { /StdEncMode true def } bind
+ /CustomEnc { /CustomEncMode true def } bind
+ /Binary { /Binary true def } bind
+ /noEncrypt { /Encrypt false def } bind
+.dicttomark def
+/wftopfa % [(arg1) ...] wftopfa -
+ { init dup 0
+ { dup 2 index length ge { exit } if
+ 2 copy get exch 1 add exch
+ options 1 index .knownget { exch pop exec } { readdefs } ifelse
+ }
+ loop pop pop
+ wrfont_dict /binary_CharStrings Binary put
+ wrfont_dict /eexec_encrypt Encrypt put
+ wrfont_dict /name_all_Encodings CustomEncMode put
+ writepfa
+ } bind def
+
+end % wftopfa_dict
+
+/wftopfa
+ { mark exch wftopfa_dict begin /saved save def { wftopfa } exec false%stopped
+ { cleartomark true } { cleartomark false } ifelse
+ saved end restore { stop } if
+ } bind def
+
+[ shellarguments
+ { ] wftopfa }
+ { pop }
+ifelse
+
+% ---------------- Root font ---------------- %
+
+% Define the Encoding for the root font.
+/wfrootencoding
+% \x00-\x3F
+ 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
+ 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-\x7F
+ 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
+ 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-\xFF
+128 copy
+256 packedarray def
+
+% Define the template for the root font dictionary.
+/wfrootfontdict mark
+ /FontType 0
+ /FontMatrix [1 0 0 1 0 0]
+ /FMapType 2
+ /Encoding wfrootencoding
+.dicttomark def
+
+% Define a dummy (placeholder) Type 1 font for the FDepVector.
+/type1dummyfont % <fontname> type1dummyfont <font>
+ { mark /FontName 3 -1 roll
+ /FontType 1
+ /FontMatrix [.001 0 0 .001 0 0]
+ /FontBBox [0 0 1000 1000]
+ /Encoding /KanjiSubEncoding findencoding
+ /CharStrings 0 dict
+ /Private mark /BlueValues [] /password 5839 .dicttomark
+ .dicttomark dup /FontName get exch definefont
+ } bind def
+
+% Write a root font. Again, wrfont.ps does most of the work.
+/makerootfont % <rootname> makerootfont <font>
+ { wfrootfontdict dup length 4 add % FontName, FDepVector, PrefEnc, FID
+ dict copy begin
+ cvlit /FontName exch def
+ 4 dict begin
+ /len FontName length def
+ /str len 4 add string def
+ FontName str cvs pop
+ str len (.r) putinterval
+ /FDepVector [ 16#21 1 16#74
+ { dup wfrootencoding exch get 0 eq
+ { pop
+ }
+ { 16 str len 2 add 2 getinterval cvrs pop
+ str cvn type1dummyfont
+ }
+ ifelse
+ }
+ for end counttomark -1 roll dup counttomark 2 roll
+ ] def
+ FontName currentdict end definefont
+ } bind def
+/writerootfont % <rootname> writerootfont -
+ { save exch makerootfont setfont (%stdout) (w) file writefont restore
+ } bind def
+
+% ---------------- Converting entire fonts ---------------- %
+
+% Define the directory where the Wadalab fonts are stored.
+/wfdir (/home/ghost/kanji/w) def
+
+% Convert an entire Wadalab font.
+/writeentirefont % <fontname> <template*> writeentirefont -
+ { 2 dict begin
+ /templates exch def
+ /fontname exch def
+ [ templates
+ { wfdir (/) concatstrings exch concatstrings { copystring }
+ 100 string filenameforall
+ }
+ forall
+ wfdir (/wadalab-sym/*.ps) concatstrings { copystring }
+ 100 string filenameforall
+ ]
+ (%!\n) print
+ { /currentuserparams where
+ { pop currentuserparams /VMReclaim get -2 vmreclaim { vmreclaim } }
+ { { } }
+ ifelse
+ } == (exec\n) print
+ (/KanjiSubEncoding ) print /KanjiSubEncoding findencoding ==
+ (readonly def\n) print
+ { (%stderr) (w) file dup 2 index write== flushfile
+ mark exch (CustomEnc) (Binary) (noEncrypt)
+ (FontBase) fontname counttomark -1 roll ] wftopfa
+ }
+ forall
+ fontname cvn writerootfont
+ (exec\n) print
+ end
+ } def % don't bind, so we can print the procedure
+
+% Convert the Wadalab JIS 1&2 SaiMincho font.
+% To invoke this from the command line,
+% gs -dNODISPLAY -q wftopfa.ps -c writeSaiMincho0 flush quit >wmin0.ps
+% To make the resulting font loadable on demand, add to the Fontmap file:
+% /Wadalab-SaiMincho (wmin0.ps) ;
+/writeSaiMincho0
+ { (Wadalab-SaiMincho) [ (wadalab-mincho-0-8/*.ps) ] writeentirefont
+ } bind def
diff --git a/Master/xemtex/gslib/winmaps.ps b/Master/xemtex/gslib/winmaps.ps
new file mode 100644
index 00000000000..40939ce0282
--- /dev/null
+++ b/Master/xemtex/gslib/winmaps.ps
@@ -0,0 +1,107 @@
+% Copyright (C) 1993 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: winmaps.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% 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/Master/xemtex/gslib/wmakebat.bat b/Master/xemtex/gslib/wmakebat.bat
new file mode 100644
index 00000000000..cfe53b955a1
--- /dev/null
+++ b/Master/xemtex/gslib/wmakebat.bat
@@ -0,0 +1,4 @@
+@rem Execute this script with echo on, so we can see what's happening.
+@rem $Id: wmakebat.bat,v 1.1 2000/03/09 08:40:40 lpd Exp $
+wmakel -u -n -h %1 %2 %3 %4 %5 %6 %7 %8 %9 >_wm_temp.bat
+_wm_temp.bat
diff --git a/Master/xemtex/gslib/wrfont.ps b/Master/xemtex/gslib/wrfont.ps
new file mode 100644
index 00000000000..3d1ffc463fb
--- /dev/null
+++ b/Master/xemtex/gslib/wrfont.ps
@@ -0,0 +1,663 @@
+% Copyright (C) 1991, 1995, 1996 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: wrfont.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% wrfont.ps
+% Write out a Type 1 font in readable, reloadable form.
+% Note that this does NOT work on protected fonts, such as Adobe fonts
+% (unless you have loaded unprot.ps first, in which case you may be
+% violating the Adobe license).
+
+% ****** NOTE: This file must be kept consistent with gs_pfile.ps.
+
+/wrfont_dict 100 dict def
+wrfont_dict begin
+
+% ------ Options ------ %
+
+% Define whether to use eexec encryption for the font.
+% eexec encryption is only useful for compatibility with Adobe Type Manager
+% and other programs; it only slows Ghostscript down.
+ /eexec_encrypt false def
+
+% Define whether to write out the CharStrings in binary or in hex.
+% Binary takes less space on the file, but isn't guaranteed portable.
+ /binary_CharStrings false def
+
+% Define whether to use binary token encodings when possible.
+% Binary tokens are smaller and load faster, but are a Level 2 feature.
+ /binary_tokens false def
+
+% Define whether to encrypt the CharStrings on the file. (CharStrings
+% are always encrypted in memory.) Unencrypted CharStrings load about
+% 20% slower, but make the files compress much better for transport.
+ /encrypt_CharStrings true def
+
+% Define whether the font must provide standard PostScript language
+% equivalents for any facilities it uses that are provided in Ghostscript
+% but are not part of the standard PostScript language.
+ /standard_only true def
+
+% Define the value of lenIV to use in writing out the font.
+% use_lenIV = 0 produces the smallest output, but this may not be
+% compatible with old Adobe interpreters. use_lenIV = -1 means
+% use the value of lenIV from the font.
+ /use_lenIV -1 def
+
+% Define whether to produce the smallest possible output, relying
+% as much as possible on Ghostscript-specific support code.
+% Taking full advantage of this requires the following settings:
+% binary_CharStrings = true, binary_tokens = true, standard_only = false.
+ /smallest_output false def
+
+% Define whether to write out all currently known Encodings by name,
+% or only StandardEncoding and ISOLatin1Encoding.
+ /name_all_Encodings false def
+
+% ---------------- Runtime support ---------------- %
+
+/.packedfilefilter where
+ { pop }
+ { (gs_pfile.ps) runlibfile }
+ifelse
+
+% ------ Output utilities ------ %
+
+% By convention, the output file is named psfile.
+
+% Define some utilities for writing the output file.
+ /wtstring 2000 string def
+ /wb {psfile exch write} bind def
+ /wnb {/wb load repeat} bind def
+ /w1 {psfile exch write} bind def
+ /ws {psfile exch writestring} bind def
+ /wl {ws (\n) ws} bind def
+ /wt {wtstring cvs ws ( ) ws} bind def
+ /wd % Write a dictionary.
+ { dup length wo {dict dup begin} wol { we } forall
+ {end} wol
+ } bind def
+ /wld % Write a large dictionary more efficiently.
+ % Ignore the readonly attributes.
+ { dup length wo {dict dup begin} wol
+ 0 exch
+ { exch wo wo () wl
+ 1 add dup 200 eq
+ { wo ({def} repeat) wl 0 }
+ if
+ }
+ forall
+ dup 0 ne
+ { wo ({def} repeat) wl }
+ { pop }
+ ifelse
+ (end) ws
+ } bind def
+ /we % Write a dictionary entry.
+ { exch wo wo /def cvx wo (\n) ws
+ } bind def
+ /wcs % Write a CharString (or Subrs entry)
+ { dup type /stringtype eq
+ { 4330 exch changelenIV 0 ge
+ { % Add some leading garbage bytes.
+ wtstring changelenIV 2 index length getinterval
+ .type1decrypt exch pop
+ wtstring exch 0 exch length changelenIV add getinterval
+ }
+ { % Drop some leading garbage bytes.
+ wtstring .type1decrypt exch pop
+ changelenIV neg 1 index length 1 index sub getinterval
+ }
+ ifelse
+ binary_tokens encrypt_CharStrings and
+ { % Suppress recognizing the readonly status of the string.
+ 4330 exch dup .type1encrypt exch pop wo
+ }
+ { encrypt_CharStrings
+ { 4330 exch dup .type1encrypt exch pop
+ } if
+ smallest_output
+ { wo
+ }
+ { readonly dup length wo
+ binary_tokens not { ( ) ws } if
+ readproc ws wx
+ }
+ ifelse
+ }
+ ifelse
+ }
+ { wo % PostScript procedure
+ }
+ ifelse
+ } bind def
+
+% Construct the inversion of the system name table.
+ /SystemNames where
+ { pop /snit 256 dict def
+ 0 1 255
+ { dup SystemNames exch get
+ dup null ne { exch snit 3 1 roll put } { pop pop } ifelse
+ }
+ for
+ }
+ { /snit 1 dict def
+ }
+ ifelse
+
+% Write an object, using binary tokens if requested and possible.
+ /woa % write in ascii
+ { psfile exch write==only
+ } bind def
+
+ % Lookup table for ASCII output.
+
+ /intbytes % int nbytes -> byte*
+ { { dup 255 and exch -8 bitshift } repeat pop
+ } bind def
+ /wotta 10 dict dup begin
+ { /booleantype /integertype }
+ { { ( ) ws woa } def }
+ forall
+ % Iterate over arrays so we can print operators.
+ /arraytype
+ { dup xcheck {(}) ({)} {(]) ([)} ifelse ws exch dup wol exch ws wop
+ } bind def
+ /dicttype
+ { ( ) ws wd } def
+ /nametype
+ { dup xcheck { ( ) ws } if woa
+ } bind def
+ % Map back operators to their names,
+ % so we can write procedures.
+ /nulltype
+ { pop ( null) ws
+ } bind def
+ /operatortype
+ { wtstring cvs cvn cvx wo
+ } bind def
+ % Convert reals to integers if possible.
+ /realtype
+ { dup cvi 1 index eq { cvi wo } { ( ) ws woa } ifelse
+ } bind def
+ % == truncates strings longer than 200 characters!
+ /stringtype
+ { (\() ws dup
+ { dup dup 32 lt exch 127 ge or
+ { (\\) ws dup -6 bitshift 48 add w1
+ dup -3 bitshift 7 and 48 add w1
+ 7 and 48 add
+ }
+ { dup dup -2 and 40 eq exch 92 eq or {(\\) ws} if
+ }
+ ifelse w1
+ }
+ forall
+ (\)) ws wop
+ } bind def
+ /packedarraytype
+ { ([) ws dup { wo } forall
+ encodingnames 1 index known
+ % This is an encoding, but not one of the standard ones.
+ % Use the built-in encoding only if it is available.
+ { encodingnames exch get wo
+ ({findencoding}stopped{pop) ws
+ (}{counttomark 1 add 1 roll cleartomark}ifelse)
+ }
+ { pop ()
+ }
+ ifelse
+ (/packedarray where{pop counttomark packedarray exch pop}{]readonly}ifelse) ws
+ wl
+ }
+ def
+ end def
+
+ % Lookup table for binary output.
+
+ /wottb 8 dict dup begin
+ wotta currentdict copy pop
+ /integertype
+ { dup dup 127 le exch -128 ge and
+ { 136 wb 255 and wb }
+ { dup dup 32767 le exch -32768 ge and
+ { 134 wb 2 intbytes wb wb }
+ { 132 wb 4 intbytes wb wb wb wb }
+ ifelse
+ }
+ ifelse
+ } bind def
+ /nametype
+ { dup snit exch known
+ { dup xcheck { 146 } { 145 } ifelse wb
+ snit exch get wb
+ }
+ { wotta /nametype get exec
+ }
+ ifelse
+ } bind def
+ /stringtype
+ { dup dup length dup 255 le { 142 2 } { 2 intbytes 143 3 } ifelse wnb
+ ws wop
+ } bind def
+ end def
+
+ /wop % Write object protection
+ { wcheck not { /readonly cvx wo } if
+ } bind def
+ /wo % Write an object.
+ { dup type binary_tokens { wottb } { wotta } ifelse
+ exch get exec
+ } bind def
+ /wol % Write a list of objects.
+ { { wo } forall
+ } bind def
+
+% Write a hex string for Subrs or CharStrings.
+ /wx % string ->
+ { binary_CharStrings
+ { ws
+ }
+ { % Some systems choke on very long lines, so
+ % we break up the hexstring into chunks of 50 characters.
+ { dup length 25 le {exit} if
+ dup 0 25 getinterval psfile exch writehexstring (\n) ws
+ dup length 25 sub 25 exch getinterval
+ } loop
+ psfile exch writehexstring
+ } ifelse
+ } bind def
+
+% ------ CharString encryption utilities ------ %
+
+/enc_dict 20 dict def
+1 dict begin
+/bind { } def % make sure we can print out the procedures
+enc_dict begin
+
+(type1enc.ps) runlibfile
+enc_dict /.type1decrypt undef % we don't need this
+
+end end
+
+enc_dict { 1 index where { pop pop pop } { def } ifelse } forall
+
+% ------ Other utilities ------ %
+
+% Test whether two values are equal (for default dictionary entries).
+ /valueeq % <obj1> <obj2> valueeq <bool>
+ { 2 copy eq
+ { pop pop true }
+ { % Special hack for comparing FontMatrix values
+ dup type /arraytype eq 2 index type /arraytype eq and
+ { dup length 2 index length eq
+ { true 0 1 3 index length 1 sub
+ { % Stack: arr1 arr2 true index
+ 3 index 1 index get 3 index 3 -1 roll get eq not
+ { pop false exit }
+ if
+ }
+ for 3 1 roll pop pop
+ }
+ { pop pop false
+ }
+ ifelse
+ }
+ { pop pop false
+ }
+ ifelse
+ }
+ ifelse
+ } bind def
+
+% ------ The main program ------ %
+
+% Define the dictionary of keys to skip because they are treated specially.
+/.fontskipkeys mark
+ /CharStrings dup
+ /Encoding dup
+ /FDepVector dup
+ /FID dup
+ /FontInfo dup
+ /Metrics dup
+ /Metrics2 dup
+ /Private dup
+.dicttomark def
+/.minfontskipkeys mark
+ .fontskipkeys { } forall
+ /FontName dup
+ /UniqueID dup
+.dicttomark def
+/.privateskipkeys mark
+ /ND dup
+ /NP dup
+ /RD dup
+ /Subrs dup
+.dicttomark def
+/.minprivateskipkeys mark
+ .privateskipkeys { } forall
+ /MinFeature dup
+ /Password dup
+ /UniqueID dup
+.dicttomark def
+
+% Define the procedures for the Private dictionary.
+% These must be defined without `bind',
+% for the sake of the DISKFONTS feature.
+4 dict begin
+ /-! {string currentfile exch readhexstring pop} def
+ /-| {string currentfile exch readstring pop} def
+ /|- {readonly def} def
+ /| {readonly put} def
+currentdict end /encrypted_procs exch def
+4 dict begin
+ /-! {string currentfile exch readhexstring pop
+ 4330 exch dup .type1encrypt exch pop} def
+ /-| {string currentfile exch readstring pop
+ 4330 exch dup .type1encrypt exch pop} def
+ /|- {readonly def} def
+ /| {readonly put} def
+currentdict end /unencrypted_procs exch def
+
+% Construct an inverse dictionary of encodings.
+/encodingnames mark
+ StandardEncoding /StandardEncoding
+ ISOLatin1Encoding /ISOLatin1Encoding
+ SymbolEncoding /SymbolEncoding
+ DingbatsEncoding /DingbatsEncoding
+ /resourceforall where
+ { pop (*) { cvn dup findencoding exch } 100 string /Encoding resourceforall }
+ if
+.dicttomark def
+
+% Invert the standard encodings.
+.knownEncodings length 256 mul dict begin
+ 0 .knownEncodings
+ { { currentdict 1 index known { pop } { 1 index def } ifelse
+ 1 add
+ }
+ forall
+ }
+ forall pop
+currentdict end /inverseencodings exch def
+
+/writefont % <psfile> writefont - (writes the current font)
+ { /psfile exch def
+ /Font currentfont def
+ /FontInfo Font /FontInfo .knownget not { 0 dict } if def
+ /FontType Font /FontType get def
+ /hasPrivate Font /Private known def
+ /Private hasPrivate { Font /Private get } { 0 dict } ifelse def
+ /readproc binary_CharStrings { (-| ) } { (-! ) } ifelse def
+ /privateprocs
+ encrypt_CharStrings binary_tokens not and
+ { encrypted_procs } { unencrypted_procs } ifelse
+ def
+ /addlenIV false def
+ /changelenIV use_lenIV 0 lt
+ { 0 }
+ { use_lenIV Private /lenIV .knownget not
+ { 4 /addlenIV use_lenIV 4 ne def } if sub }
+ ifelse def
+ /minimize
+ smallest_output
+ FontType 1 eq and
+ Font /UniqueID known and
+ def
+ (%!FontType) ws FontType wtstring cvs ws (-1.0: ) ws
+ currentfont /FontName get wt
+ FontInfo /version .knownget not { (001.001) } if wl
+ FontInfo /CreationDate .knownget { (%%Creation Date: ) ws wl } if
+ FontInfo /VMusage .knownget
+ { (%%VMusage: ) ws dup wt wtstring cvs wl }
+ if
+ (systemdict begin) wl
+
+% If we're going to use eexec, create the filters now.
+ /realpsfile psfile def
+ eexec_encrypt
+ { /eexecfilter psfile binary_CharStrings not
+ { pop /bxstring 35 string def
+ { pop dup length 0 ne
+ { realpsfile exch writehexstring realpsfile (\n) writestring }
+ { pop }
+ ifelse bxstring
+ }
+ /NullEncode filter dup /hexfilter exch def
+ }
+ if 55665 /eexecEncode filter def
+ }
+ if
+
+% Turn on binary tokens if relevant.
+ binary_tokens { (currentobjectformat 1 setobjectformat) wl } if
+
+% If the file has a UniqueID, write out a check against loading it twice.
+ minimize
+ { Font /FontName get wo
+ Font /UniqueID get wo
+ Private length addlenIV { 1 add } if wo
+ Font length 1 add wo % +1 for FontFile
+ ( .checkexistingfont) wl
+ }
+ { Font /UniqueID known
+ { ({} FontDirectory) ws Font /FontName get dup wo ( known) wl
+ ( {) ws wo ( findfont dup /UniqueID known) wl
+ ( { dup /UniqueID get) ws Font /UniqueID get wo ( eq exch /FontType get 1 eq and }) wl
+ ( { pop false } ifelse) wl
+ ( { pop save /restore load } if) wl
+ ( } if) wl
+ }
+ if
+ }
+ ifelse
+
+% If we are writing unencrypted CharStrings for a standard environment,
+% write out the encryption procedures.
+ privateprocs unencrypted_procs eq standard_only and
+ { (systemdict /.type1encrypt known) wl
+ ( { save /restore load } { { } } ifelse) wl
+ (userdict begin) wl
+ enc_dict { we } forall
+ (end exec) wl
+ }
+ if
+
+% Write out the creation of the font dictionary and FontInfo.
+ minimize not
+ { Font length 1 add wo {dict begin} wol % +1 for FontFile
+ }
+ if
+ (/FontInfo ) ws FontInfo wd {readonly def} wol
+
+% Write out the other fixed entries in the font dictionary.
+ Font begin
+ Font
+ { minimize
+ { .minfontskipkeys 2 index known
+ { pop pop
+ }
+ { //.compactfontdefault 2 index .knownget
+ { 1 index valueeq { pop pop } { we } ifelse }
+ { we }
+ ifelse
+ }
+ ifelse
+ }
+ { .fontskipkeys 2 index known { pop pop } { we } ifelse
+ }
+ ifelse
+ } forall
+ /Encoding
+ encodingnames Encoding known
+ name_all_Encodings
+ Encoding StandardEncoding eq or
+ Encoding ISOLatin1Encoding eq or and
+ { encodingnames Encoding get cvx }
+ { Encoding }
+ ifelse
+ dup /StandardEncoding cvx eq minimize and
+ { pop pop }
+ { we }
+ ifelse
+
+% Write the FDepVector, if any.
+ Font /FDepVector .knownget
+ { {/FDepVector [} wol
+ { /FontName get wo {findfont} wol () wl } forall
+ {] readonly def} wol
+ }
+ if
+
+% Write out the Metrics, if any.
+ Font /Metrics .knownget
+ { (/Metrics ) ws wld {readonly def} wol
+ }
+ if
+ Font /Metrics2 .knownget
+ { (/Metrics2 ) ws wld {readonly def} wol
+ }
+ if
+
+% Start the eexec-encrypted section, if applicable.
+ eexec_encrypt
+ { {currentdict currentfile eexec} wol () wl
+ /psfile eexecfilter store
+ (\000\000\000\000) ws {begin} wol
+ }
+ if
+
+% Create and initialize the Private dictionary, if any.
+ hasPrivate
+{
+ Private
+ minimize
+ { begin {Private dup begin}
+ }
+ { dup length privateprocs length add dict copy begin
+ privateprocs { readonly def } forall
+ /Private wo
+ currentdict length 1 add wo {dict dup begin}
+ }
+ ifelse wol () wl
+ currentdict
+ { 1 index minimize { .minprivateskipkeys } { .privateskipkeys } ifelse
+ exch known
+ { pop pop }
+ { 1 index /lenIV eq use_lenIV 0 ge and { pop use_lenIV } if we }
+ ifelse
+ } forall
+ addlenIV { /lenIV use_lenIV we } if
+}
+if
+
+% Write the Subrs entries, if any.
+ currentdict /Subrs known
+ { (/Subrs[) wl
+ Subrs
+ { dup null ne
+ { wcs minimize not { () wl } if }
+ { pop /null cvx wo }
+ ifelse
+ } forall
+ {] dup {readonly pop} forall readonly def} wol () wl
+ }
+ if
+
+% Wrap up the Private dictionary.
+ hasPrivate
+ { end % Private
+ minimize
+ { {end readonly pop} } % Private
+ { {end readonly def} } % Private in font
+ ifelse wol
+ }
+ if
+
+% Write the CharStrings entries.
+% Detect identical (eq) entries, which bdftops produces.
+ currentdict /CharStrings known
+{
+ /CharStrings wo CharStrings length wo
+ minimize
+ { encrypt_CharStrings not wo ( .readCharStrings) wl
+ CharStrings length dict
+ CharStrings
+ { exch inverseencodings 1 index .knownget not { dup } if wo
+ % Stack: vdict value key
+ 3 copy pop .knownget { wo pop pop } { 3 copy put pop wcs } ifelse
+ } forall
+ }
+ { {dict dup Private begin begin} wol () wl
+ CharStrings length dict
+ CharStrings
+ { 2 index 1 index known
+ { exch wo 1 index exch get wo {load def} wol () wl
+ }
+ { 2 index 1 index 3 index put
+ exch wo wcs ( |-) wl
+ }
+ ifelse
+ } forall
+ {end end} wol
+ }
+ ifelse
+ pop
+ { readonly def } % CharStrings in font
+ wol
+}
+if
+
+% Terminate the output.
+ end % Font
+ eexec_encrypt
+ { {end mark currentfile closefile} wol () wl
+ eexecfilter dup flushfile closefile % psfile is eexecfilter
+ binary_CharStrings not { hexfilter dup flushfile closefile } if
+ /psfile realpsfile store
+ 8
+ { (0000000000000000000000000000000000000000000000000000000000000000)
+ wl
+ }
+ repeat {cleartomark} wol
+ }
+ if
+ { FontName currentdict end definefont pop
+ }
+ wol
+ Font /UniqueID known { /exec cvx wo } if
+ binary_tokens { /setobjectformat cvx wo } if
+ ( end) wl % systemdict
+
+ } bind def
+
+% ------ Other utilities ------ %
+
+% Prune garbage characters and OtherSubrs out of the current font,
+% if the relevant dictionaries are writable.
+/prunefont
+ { currentfont /CharStrings get wcheck
+ { currentfont /CharStrings get dup [ exch
+ { pop dup (S????00?) .stringmatch not { pop } if
+ } forall
+ ] { 2 copy undef pop } forall pop
+ }
+ if
+ } bind def
+
+end % wrfont_dict
+
+/writefont { wrfont_dict begin writefont end } def
diff --git a/Master/xemtex/gslib/zeroline.ps b/Master/xemtex/gslib/zeroline.ps
new file mode 100644
index 00000000000..7411a170d64
--- /dev/null
+++ b/Master/xemtex/gslib/zeroline.ps
@@ -0,0 +1,101 @@
+%!
+% Copyright (C) 1994 Aladdin Enterprises. All rights reserved.
+%
+% 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.
+
+% $Id: zeroline.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $
+% 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