From 646a5c1cbfd95873950a87b5f75d52073a967023 Mon Sep 17 00:00:00 2001 From: Patrick J Volkerding Date: Mon, 28 May 2018 19:12:29 +0000 Subject: Mon May 28 19:12:29 UTC 2018 a/pkgtools-15.0-noarch-13.txz: Rebuilt. installpkg: default line length for --terselength is the number of columns. removepkg: added --terse mode. upgradepkg: default line length for --terselength is the number of columns. upgradepkg: accept -option in addition to --option. ap/vim-8.1.0026-x86_64-1.txz: Upgraded. d/bison-3.0.5-x86_64-1.txz: Upgraded. e/emacs-26.1-x86_64-1.txz: Upgraded. kde/kopete-4.14.3-x86_64-8.txz: Rebuilt. Recompiled against libidn-1.35. n/conntrack-tools-1.4.5-x86_64-1.txz: Upgraded. n/libnetfilter_conntrack-1.0.7-x86_64-1.txz: Upgraded. n/libnftnl-1.1.0-x86_64-1.txz: Upgraded. n/links-2.16-x86_64-2.txz: Rebuilt. Rebuilt to enable X driver for -g mode. n/lynx-2.8.9dev.19-x86_64-1.txz: Upgraded. n/nftables-0.8.5-x86_64-1.txz: Upgraded. n/p11-kit-0.23.11-x86_64-1.txz: Upgraded. n/ulogd-2.0.7-x86_64-1.txz: Upgraded. n/whois-5.3.1-x86_64-1.txz: Upgraded. xap/network-manager-applet-1.8.12-x86_64-1.txz: Upgraded. xap/vim-gvim-8.1.0026-x86_64-1.txz: Upgraded. --- source/t/texlive/README.tlpkg | 18 + source/t/texlive/doinst.sh | 5 + .../dump.unused.internal.libraries.from.sources.sh | 15 + .../patches/texlive-20170524-source-gcc7-1.patch | 33 + .../texlive-20170524-source-upstream_fixes-2.patch | 451 ++++++++ .../t/texlive/patches/texlive-poppler-0.59.patch | 1142 ++++++++++++++++++++ source/t/texlive/prep/README | 2 + source/t/texlive/prep/texmf_get.sh | 752 +++++++++++++ source/t/texlive/slack-desc | 19 + source/t/texlive/texlive.SlackBuild | 252 +++++ source/t/texlive/texlive.url | 6 + 11 files changed, 2695 insertions(+) create mode 100644 source/t/texlive/README.tlpkg create mode 100644 source/t/texlive/doinst.sh create mode 100755 source/t/texlive/dump.unused.internal.libraries.from.sources.sh create mode 100644 source/t/texlive/patches/texlive-20170524-source-gcc7-1.patch create mode 100644 source/t/texlive/patches/texlive-20170524-source-upstream_fixes-2.patch create mode 100644 source/t/texlive/patches/texlive-poppler-0.59.patch create mode 100644 source/t/texlive/prep/README create mode 100644 source/t/texlive/prep/texmf_get.sh create mode 100644 source/t/texlive/slack-desc create mode 100755 source/t/texlive/texlive.SlackBuild create mode 100644 source/t/texlive/texlive.url (limited to 'source/t/texlive') diff --git a/source/t/texlive/README.tlpkg b/source/t/texlive/README.tlpkg new file mode 100644 index 00000000..35c25dd2 --- /dev/null +++ b/source/t/texlive/README.tlpkg @@ -0,0 +1,18 @@ +The TeXLive Package Manager, i.e. tlmgr(1), is not shipped with this +TeXLive package, as it's not expected to work properly (if at all). +The general consensus from the TeXLive users mailing list is that +distributions should not be shipping tlpkg. + +The *proper* way to upgrade the TeXLive Slackware package (or any +part of it) is through your Slackware's package manager. If you +elect to try tlmgr(1), and it doesn't work at all, or worse, it messes +up part of your TeXLive installation, too bad. On the other hand, +if you are able to document exactly what we need to do in order to +make it: + 1) work + 2) put updates and such in a user-specific directory, i.e. + *not* alter/replace system package contents +then we would love to hear from you. :-) + +--rworkman :-) + diff --git a/source/t/texlive/doinst.sh b/source/t/texlive/doinst.sh new file mode 100644 index 00000000..f864e767 --- /dev/null +++ b/source/t/texlive/doinst.sh @@ -0,0 +1,5 @@ +chroot . /usr/bin/mktexlsr 1>/dev/null 2>/dev/null +printf "y\n" | chroot . /usr/bin/updmap-sys --syncwithtrees 1>/dev/null 2>/dev/null +chroot . /usr/bin/updmap-sys 1>/dev/null 2>/dev/null +chroot . /usr/bin/fmtutil-sys --all 1>/dev/null 2>/dev/null +chroot . /usr/bin/mtxrun --generate 1>/dev/null 2>/dev/null diff --git a/source/t/texlive/dump.unused.internal.libraries.from.sources.sh b/source/t/texlive/dump.unused.internal.libraries.from.sources.sh new file mode 100755 index 00000000..71ab0b53 --- /dev/null +++ b/source/t/texlive/dump.unused.internal.libraries.from.sources.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# Repacks the texlive tarball to remove unused sources. + +VERSION=${VERSION:-$(echo texlive-*source.tar.?z* | rev | cut -f 2 -d - | cut -f 1 -d - | rev)} + +tar xf texlive-${VERSION}-source.tar.xz || exit 1 +mv texlive-${VERSION}-source.tar.xz texlive-${VERSION}-source.tar.xz.orig +( cd texlive-${VERSION}-source/libs && rm -rf cairo freetype2 gd gmp mpfr icu libpng pixman zlib ) +( cd texlive-${VERSION}-source/utils && rm -rf asymptote ) +tar cf texlive-${VERSION}-source.tar texlive-${VERSION}-source +rm -r texlive-${VERSION}-source +#xz -9 texlive-${VERSION}-source.tar +xz texlive-${VERSION}-source.tar +touch -r texlive-${VERSION}-source.tar.xz.orig texlive-${VERSION}-source.tar.xz +rm texlive-${VERSION}-source.tar.xz.orig diff --git a/source/t/texlive/patches/texlive-20170524-source-gcc7-1.patch b/source/t/texlive/patches/texlive-20170524-source-gcc7-1.patch new file mode 100644 index 00000000..c2d3521a --- /dev/null +++ b/source/t/texlive/patches/texlive-20170524-source-gcc7-1.patch @@ -0,0 +1,33 @@ +Submitted By: Ken Moffat +Date: 2017-06-05 +Initial Package Version: 20170524 +Upstream Status: Unknown +Origin: http://tug.org/pipermail/tex-live/2017-June/040192.html +Description: From Dr. Werner Fink of SuSe, fixes compilation with gcc-7.1 + +diff -Naur texlive-20170524-source.orig/texk/web2c/luatexdir/luaffi/ctype.c texlive-20170524-source/texk/web2c/luatexdir/luaffi/ctype.c +--- texlive-20170524-source.orig/texk/web2c/luatexdir/luaffi/ctype.c 2017-02-10 01:03:59.000000000 +0000 ++++ texlive-20170524-source/texk/web2c/luatexdir/luaffi/ctype.c 2017-06-05 02:32:34.548531839 +0100 +@@ -245,6 +245,10 @@ + + lua_pop(L, 1); /* mt */ + cd = (struct cdata*) lua_touserdata(L, idx); ++ if (!cd) { ++ lua_pushnil(L); ++ return NULL; ++ } + *ct = cd->type; + lua_getuservalue(L, idx); + +diff -Naur texlive-20170524-source.orig/texk/web2c/luatexdir/luaffi/ffi.h texlive-20170524-source/texk/web2c/luatexdir/luaffi/ffi.h +--- texlive-20170524-source.orig/texk/web2c/luatexdir/luaffi/ffi.h 2017-03-11 01:04:06.000000000 +0000 ++++ texlive-20170524-source/texk/web2c/luatexdir/luaffi/ffi.h 2017-06-05 02:32:34.548531839 +0100 +@@ -370,7 +370,7 @@ + #endif + struct cdata { + const struct ctype type +-#ifdef __GNUC__ ++#if 0 /* def __GNUC__ */ + __attribute__ ((aligned(16))) + #endif + ; diff --git a/source/t/texlive/patches/texlive-20170524-source-upstream_fixes-2.patch b/source/t/texlive/patches/texlive-20170524-source-upstream_fixes-2.patch new file mode 100644 index 00000000..e4ea52e2 --- /dev/null +++ b/source/t/texlive/patches/texlive-20170524-source-upstream_fixes-2.patch @@ -0,0 +1,451 @@ +Submitted By: Ken Moffat +Date: 2017-06-13 +Initial Package Version: 2017-05-25 +Upstream Status: Applied +Origin: Upstream +Description: Consolidated fixes for luatex. + +1. Removes debugging code which was accidentally left in +luatex, which made the (infrequently needed) io.popen useless. Also +disables io.saved_popen and changes the reported date of the luatex +version. + +2. Fix for io.lines (fixed in r44572). + +diff -Naur a/texk/web2c/luatexdir/lua/liolibext.c b/texk/web2c/luatexdir/lua/liolibext.c +--- a/texk/web2c/luatexdir/lua/liolibext.c 2017-03-11 01:04:06.000000000 +0000 ++++ b/texk/web2c/luatexdir/lua/liolibext.c 2017-06-11 01:49:11.813308882 +0100 +@@ -365,7 +365,7 @@ + lua_pushliteral(L,"all command execution is disabled"); + } else if (restrictedshell == 0) { + lua_pushboolean(L,1); +- lua_pushliteral(L,"all commands are permitted"); ++ lua_pushstring(L,filename); + } else { + char *safecmd = NULL; + char *cmdname = NULL; +@@ -374,10 +374,6 @@ + lua_pushboolean(L,0); + lua_pushliteral(L, "specific command execution disabled"); + break; +- case 1: +- lua_pushboolean(L,1); +- lua_pushstring(L,filename); +- break; + case 2: + lua_pushboolean(L,1); + lua_pushstring(L,safecmd); +diff -Naur a/texk/web2c/luatexdir/lua/luatex-core.c b/texk/web2c/luatexdir/lua/luatex-core.c +--- a/texk/web2c/luatexdir/lua/luatex-core.c 2017-04-19 11:07:10.000000000 +0100 ++++ b/texk/web2c/luatexdir/lua/luatex-core.c 2017-06-12 19:34:37.320003411 +0100 +@@ -52,7 +52,7 @@ + 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f, + 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x6c, 0x6f, 0x63, 0x61, +- 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x66, 0x69, +@@ -84,169 +84,175 @@ + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x2d, 0x2d, 0x20, + 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, +- 0x0a, 0x69, 0x6f, 0x2e, 0x73, 0x61, 0x76, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, +- 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, +- 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x0a, 0x69, 0x6f, 0x2e, 0x73, 0x61, 0x76, +- 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x2d, +- 0x2d, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, +- 0x79, 0x0a, 0x6d, 0x74, 0x2e, 0x73, 0x61, 0x76, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6d, 0x74, +- 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x2d, 0x2d, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, +- 0x20, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, +- 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, +- 0x5f, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, +- 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x6f, +- 0x77, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, +- 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x69, ++ 0x0a, 0x2d, 0x2d, 0x20, 0x28, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, ++ 0x20, 0x74, 0x6c, 0x31, 0x37, 0x20, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x29, 0x20, 0x69, ++ 0x6f, 0x2e, 0x73, 0x61, 0x76, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x70, 0x6f, ++ 0x70, 0x65, 0x6e, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, ++ 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x0a, 0x69, 0x6f, 0x2e, 0x73, 0x61, 0x76, 0x65, 0x64, ++ 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x2d, 0x2d, 0x20, ++ 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x0a, ++ 0x6d, 0x74, 0x2e, 0x73, 0x61, 0x76, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6d, 0x74, 0x5f, 0x6c, ++ 0x69, 0x6e, 0x65, 0x73, 0x20, 0x2d, 0x2d, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x72, ++ 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, ++ 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, + 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x29, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x68, +- 0x6f, 0x77, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, +- 0x61, 0x6e, 0x64, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x68, 0x6f, 0x77, 0x2c, 0x27, 0x77, 0x27, +- 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x66, 0x69, 0x6c, +- 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x27, 0x77, 0x27, 0x29, 0x0a, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x63, +- 0x6f, 0x72, 0x64, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, +- 0x2c, 0x27, 0x72, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, +- 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, +- 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, +- 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, +- 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, +- 0x6c, 0x79, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x69, 0x66, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, 0x0a, 0x20, +- 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x68, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x75, 0x62, 0x28, 0x68, 0x6f, 0x77, 0x2c, 0x27, +- 0x5b, 0x5e, 0x72, 0x62, 0x5d, 0x27, 0x2c, 0x27, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, +- 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x68, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x6f, 0x77, 0x20, ++ 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x6f, 0x77, ++ 0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x66, +- 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x27, 0x72, 0x27, +- 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, +- 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, +- 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, +- 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, +- 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, +- 0x6b, 0x61, 0x79, 0x2c, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6f, +- 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, +- 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x6b, +- 0x61, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, +- 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, +- 0x20, 0x69, 0x6f, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2c, +- 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, +- 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, +- 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, +- 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, +- 0x20, 0x66, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, +- 0x65, 0x2c, 0x27, 0x72, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x20, +- 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, +- 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x68, 0x6f, 0x77, ++ 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x61, 0x6e, ++ 0x64, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x68, 0x6f, 0x77, 0x2c, 0x27, 0x77, 0x27, 0x29, 0x20, ++ 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x66, 0x69, 0x6c, 0x65, 0x6e, ++ 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x27, 0x77, 0x27, 0x29, 0x0a, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, ++ 0x64, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x27, ++ 0x72, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, ++ 0x72, 0x6e, 0x20, 0x66, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, ++ 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, ++ 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, ++ 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, ++ 0x66, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x6f, ++ 0x77, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x75, 0x62, 0x28, 0x68, 0x6f, 0x77, 0x2c, 0x27, 0x5b, 0x5e, ++ 0x72, 0x62, 0x5d, 0x27, 0x2c, 0x27, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x69, 0x66, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x74, 0x68, ++ 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, ++ 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x6f, 0x70, ++ 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x69, 0x66, 0x20, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x66, 0x69, 0x6c, ++ 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x27, 0x72, 0x27, 0x29, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, ++ 0x72, 0x6e, 0x20, 0x66, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, ++ 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, ++ 0x69, 0x6f, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x2e, 0x2e, ++ 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6b, 0x61, ++ 0x79, 0x2c, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x63, ++ 0x68, 0x65, 0x63, 0x6b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x6e, ++ 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x6b, 0x61, 0x79, ++ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, ++ 0x6f, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2c, 0x2e, 0x2e, ++ 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, ++ 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, ++ 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x6e, ++ 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, ++ 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x6f, ++ 0x70, 0x65, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x68, 0x6f, 0x77, 0x20, 0x6f, 0x72, 0x20, ++ 0x27, 0x72, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, ++ 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, ++ 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6f, 0x5f, ++ 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, ++ 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, ++ 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, ++ 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, ++ 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, ++ 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x66, +- 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, +- 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, +- 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x66, 0x29, 0x0a, +- 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, +- 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, +- 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, +- 0x65, 0x28, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, +- 0x0a, 0x0a, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, +- 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x6d, 0x74, 0x2e, +- 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, +- 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x57, +- 0x65, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, +- 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, +- 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, +- 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x2e, 0x20, 0x54, +- 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x61, +- 0x73, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x54, 0x65, 0x58, 0x74, 0x2e, 0x0a, 0x0a, +- 0x69, 0x66, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x75, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x31, +- 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, +- 0x65, 0x6e, 0x20, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, +- 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65, +- 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x70, 0x6f, +- 0x70, 0x65, 0x6e, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x73, 0x61, 0x66, +- 0x65, 0x72, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68, +- 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, +- 0x74, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, +- 0x73, 0x70, 0x61, 0x77, 0x6e, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6e, +- 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, +- 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x74, +- 0x65, 0x6d, 0x70, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6e, +- 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, +- 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, +- 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x6e, +- 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x74, 0x6d, 0x70, 0x66, 0x69, +- 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, +- 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, +- 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x63, 0x68, 0x64, 0x69, 0x72, 0x20, 0x20, 0x3d, 0x20, +- 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, +- 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, +- 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x72, 0x6d, 0x64, 0x69, 0x72, 0x20, 0x20, 0x3d, 0x20, 0x6e, +- 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x6d, 0x6b, 0x64, 0x69, 0x72, +- 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, +- 0x73, 0x61, 0x76, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x6e, 0x69, +- 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x73, 0x61, 0x76, 0x65, 0x64, 0x5f, 0x6f, +- 0x70, 0x65, 0x6e, 0x20, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, +- 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x0a, 0x0a, +- 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x73, 0x61, 0x66, 0x65, 0x72, 0x6f, 0x70, 0x74, +- 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x68, 0x65, 0x6c, +- 0x6c, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, +- 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, +- 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x66, 0x66, 0x69, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, +- 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, +- 0x2c, 0x20, 0x66, 0x66, 0x69, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x69, 0x66, 0x20, 0x6b, 0x20, 0x7e, 0x3d, 0x20, 0x27, 0x67, 0x63, 0x27, 0x20, 0x74, 0x68, +- 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, +- 0x66, 0x69, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, +- 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x65, +- 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x6f, 0x73, 0x2e, 0x5b, 0x65, 0x78, 0x65, 0x63, 0x75, +- 0x74, 0x65, 0x7c, 0x6f, 0x73, 0x2e, 0x73, 0x70, 0x61, 0x77, 0x6e, 0x7c, 0x6f, 0x73, 0x2e, 0x65, +- 0x78, 0x65, 0x63, 0x5d, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x61, 0x72, 0x65, +- 0x20, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x20, 0x61, 0x77, 0x61, +- 0x72, 0x65, 0x29, 0x0a, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6d, 0x64, 0x35, 0x20, 0x74, 0x68, 0x65, +- 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x6d, +- 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x73, 0x75, 0x62, 0x20, 0x20, 0x20, 0x3d, +- 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3d, 0x20, +- 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x20, 0x20, 0x3d, +- 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x0a, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, +- 0x75, 0x6d, 0x68, 0x65, 0x78, 0x61, 0x28, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, +- 0x75, 0x6d, 0x28, 0x6b, 0x29, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, +- 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, +- 0x74, 0x28, 0x22, 0x25, 0x30, 0x32, 0x78, 0x22, 0x2c, 0x62, 0x79, 0x74, 0x65, 0x28, 0x63, 0x29, +- 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a, +- 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, +- 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, 0x48, 0x45, 0x58, +- 0x41, 0x28, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, +- 0x75, 0x72, 0x6e, 0x20, 0x28, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x75, 0x6d, 0x28, 0x6b, 0x29, +- 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, +- 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, +- 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x30, +- 0x32, 0x58, 0x22, 0x2c, 0x62, 0x79, 0x74, 0x65, 0x28, 0x63, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, +- 0x6e, 0x64, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x00 ++ 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, ++ 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, ++ 0x5f, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x6d, 0x74, 0x2e, 0x6c, 0x69, 0x6e, ++ 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x72, ++ 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x57, 0x65, 0x20, 0x61, ++ 0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, ++ 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, ++ 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, ++ 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, ++ 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, ++ 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x54, 0x65, 0x58, 0x74, 0x2e, 0x0a, 0x0a, 0x69, 0x66, 0x20, ++ 0x6b, 0x70, 0x73, 0x65, 0x75, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68, ++ 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x20, ++ 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, ++ 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x3d, ++ 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, ++ 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x73, 0x61, 0x66, 0x65, 0x72, 0x6f, ++ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, ++ 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x73, 0x70, 0x61, ++ 0x77, 0x6e, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, ++ 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x20, 0x3d, ++ 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x6d, 0x70, ++ 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, ++ 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x3d, ++ 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x6e, ++ 0x61, 0x6d, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, ++ 0x73, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x74, 0x6d, 0x70, 0x66, 0x69, 0x6c, 0x65, 0x20, ++ 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x75, 0x74, ++ 0x70, 0x75, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x6c, 0x66, 0x73, 0x2e, 0x63, 0x68, 0x64, 0x69, 0x72, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x20, 0x20, ++ 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x74, 0x6f, ++ 0x75, 0x63, 0x68, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, ++ 0x66, 0x73, 0x2e, 0x72, 0x6d, 0x64, 0x69, 0x72, 0x20, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x20, 0x20, 0x3d, ++ 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x73, 0x61, 0x76, ++ 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, ++ 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, ++ 0x6c, 0x79, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x73, 0x61, 0x66, 0x65, ++ 0x72, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x6f, 0x72, 0x20, ++ 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x31, ++ 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x20, 0x3d, ++ 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x66, 0x66, 0x69, 0x27, 0x29, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, ++ 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x66, 0x66, 0x69, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6b, 0x20, 0x7e, 0x3d, 0x20, 0x27, 0x67, 0x63, ++ 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x20, 0x3d, 0x20, 0x6e, 0x69, ++ 0x6c, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x6f, 0x73, 0x2e, 0x5b, 0x65, ++ 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x7c, 0x6f, 0x73, 0x2e, 0x73, 0x70, 0x61, 0x77, 0x6e, 0x7c, ++ 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x5d, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, ++ 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, ++ 0x20, 0x61, 0x77, 0x61, 0x72, 0x65, 0x29, 0x0a, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6d, 0x64, 0x35, ++ 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, ++ 0x20, 0x73, 0x75, 0x6d, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, ++ 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x73, 0x75, 0x62, ++ 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, ++ 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, ++ 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, ++ 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, 0x65, ++ 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, ++ 0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, 0x68, 0x65, 0x78, 0x61, 0x28, 0x6b, 0x29, 0x0a, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x67, 0x73, ++ 0x75, 0x62, 0x28, 0x73, 0x75, 0x6d, 0x28, 0x6b, 0x29, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x2c, 0x20, ++ 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, ++ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x30, 0x32, 0x78, 0x22, 0x2c, 0x62, 0x79, 0x74, ++ 0x65, 0x28, 0x63, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, ++ 0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, ++ 0x6d, 0x48, 0x45, 0x58, 0x41, 0x28, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x75, ++ 0x6d, 0x28, 0x6b, 0x29, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, ++ 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, ++ 0x28, 0x22, 0x25, 0x30, 0x32, 0x58, 0x22, 0x2c, 0x62, 0x79, 0x74, 0x65, 0x28, 0x63, 0x29, 0x29, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x00 + }; + return luaL_dostring(L, (const char*) luatex_core_lua); + } +\ No newline at end of file +diff -Naur a/texk/web2c/luatexdir/lua/luatex-core.lua b/texk/web2c/luatexdir/lua/luatex-core.lua +--- a/texk/web2c/luatexdir/lua/luatex-core.lua 2017-04-19 11:07:10.000000000 +0100 ++++ b/texk/web2c/luatexdir/lua/luatex-core.lua 2017-06-12 19:34:37.320003411 +0100 +@@ -16,7 +16,7 @@ + + local io_open = io.open + local io_popen = io.popen +-local io_line = io.lines ++local io_lines = io.lines + + local fio_readline = fio.readline + local fio_checkpermission = fio.checkpermission +@@ -29,7 +29,7 @@ + local kpseused = status.kpse_used -- 0 1 + + io.saved_open = io_open -- can be protected +-io.saved_popen = io_popen -- can be protected ++-- (deleted for tl17 rebuild) io.saved_popen = io_popen -- can be protected + io.saved_lines = io_lines -- always readonly + mt.saved_lines = mt_lines -- always readonly + +@@ -71,12 +71,16 @@ + end + end + +-local function luatex_io_lines(name) +- local f = io_open(name,'r') +- if f then +- return function() +- return fio_readline(f) ++local function luatex_io_lines(name,how) ++ if name then ++ local f = io_open(name,how or 'r') ++ if f then ++ return function() ++ return fio_readline(f) ++ end + end ++ else ++ return io_lines() + end + end + +@@ -122,7 +126,6 @@ + lfs.rmdir = nil + lfs.mkdir = nil + +- io.saved_popen = nil + io.saved_open = luatex_io_open_readonly + + end +diff -Naur a/texk/web2c/luatexdir/luatex.c b/texk/web2c/luatexdir/luatex.c +--- a/texk/web2c/luatexdir/luatex.c 2017-03-31 14:27:09.000000000 +0100 ++++ b/texk/web2c/luatexdir/luatex.c 2017-06-11 01:49:11.813308882 +0100 +@@ -28,9 +28,11 @@ + + #define TeX + ++/* for tl17 update, change luatex_date_info but nothing else, ++ as context depends on the numeric version number. */ + int luatex_version = 100; /* \.{\\luatexversion} */ + int luatex_revision = '4'; /* \.{\\luatexrevision} */ +-int luatex_date_info = 2017033109; /* the compile date is now hardwired :YEAR MONTH DAY HOUR*/ ++int luatex_date_info = 2017060901; /* the compile date is now hardwired :YEAR MONTH DAY HOUR*/ + const char *luatex_version_string = "1.0.4"; + const char *engine_name = my_name; /* the name of this engine */ + diff --git a/source/t/texlive/patches/texlive-poppler-0.59.patch b/source/t/texlive/patches/texlive-poppler-0.59.patch new file mode 100644 index 00000000..401315a6 --- /dev/null +++ b/source/t/texlive/patches/texlive-poppler-0.59.patch @@ -0,0 +1,1142 @@ +diff -ur source.orig/texk/web2c/luatexdir/image/pdftoepdf.w source/texk/web2c/luatexdir/image/pdftoepdf.w +--- source.orig/texk/web2c/luatexdir/image/pdftoepdf.w 2017-05-08 22:39:36.639375783 +0200 ++++ source/texk/web2c/luatexdir/image/pdftoepdf.w 2017-09-19 11:23:36.586768739 +0200 +@@ -224,7 +224,7 @@ + free(checksum); + } + if (pdf_doc->doc == NULL) { +- docmemstream = new MemStream( docstream,0,streamsize, obj.initNull() ); ++ docmemstream = new MemStream( docstream,0,streamsize, Object(objNull) ); + doc = new PDFDoc(docmemstream); /* takes ownership of docmemstream */ + pdf_doc->pc++; + if (!doc->isOk() || !doc->okToPrint()) { +@@ -408,9 +408,8 @@ + Object obj1; + pdf_begin_array(pdf); + for (i = 0, l = array->getLength(); i < l; ++i) { +- array->getNF(i, &obj1); ++ obj1 = array->getNF(i); + copyObject(pdf, pdf_doc, &obj1); +- obj1.free(); + } + pdf_end_array(pdf); + } +@@ -422,9 +421,8 @@ + pdf_begin_dict(pdf); + for (i = 0, l = dict->getLength(); i < l; ++i) { + copyName(pdf, dict->getKey(i)); +- dict->getValNF(i, &obj1); ++ obj1 = dict->getValNF(i); + copyObject(pdf, pdf_doc, &obj1); +- obj1.free(); + } + pdf_end_dict(pdf); + } +@@ -510,13 +508,12 @@ + PDFDoc *doc = pdf_doc->doc; + xref = doc->getXRef(); + for (r = pdf_doc->inObjList; r != NULL;) { +- xref->fetch(r->ref.num, r->ref.gen, &obj1); ++ obj1 = xref->fetch(r->ref.num, r->ref.gen); + if (obj1.isStream()) + pdf_begin_obj(pdf, r->num, OBJSTM_NEVER); + else + pdf_begin_obj(pdf, r->num, 2); + copyObject(pdf, pdf_doc, &obj1); +- obj1.free(); + pdf_end_obj(pdf); + n = r->next; + delete r; +@@ -740,7 +737,7 @@ + catalog = doc->getCatalog(); + page = catalog->getPage(img_pagenum(idict)); + pageref = catalog->getPageRef(img_pagenum(idict)); +- doc->getXRef()->fetch(pageref->num, pageref->gen, &pageobj); ++ pageobj = doc->getXRef()->fetch(pageref->num, pageref->gen); + pageDict = pageobj.getDict(); + /* write the Page header */ + pdf_begin_obj(pdf, img_objnum(idict), OBJSTM_NEVER); +@@ -757,12 +754,11 @@ + pdf_dict_add_int(pdf, "PTEX.PageNumber", (int) img_pagenum(idict)); + } + if ((suppress_optional_info & 8) == 0) { +- doc->getDocInfoNF(&obj1); ++ obj1 = doc->getDocInfoNF(); + if (obj1.isRef()) { + /* the info dict must be indirect (PDF Ref p. 61) */ + pdf_dict_add_ref(pdf, "PTEX.InfoDict", addInObj(pdf, pdf_doc, obj1.getRef())); + } +- obj1.free(); + } + if (img_is_bbox(idict)) { + bbox[0] = sp2bp(img_bbox(idict)[0]); +@@ -788,19 +784,17 @@ + Now all relevant parts of the Page dictionary are copied. Metadata validity + check is needed(as a stream it must be indirect). + */ +- pageDict->lookupNF("Metadata", &obj1); ++ obj1 = pageDict->lookupNF("Metadata"); + if (!obj1.isNull() && !obj1.isRef()) + formatted_warning("pdf inclusion","/Metadata must be indirect object"); +- obj1.free(); + /* copy selected items in Page dictionary */ + for (i = 0; pagedictkeys[i] != NULL; i++) { +- pageDict->lookupNF(pagedictkeys[i], &obj1); ++ obj1 = pageDict->lookupNF(pagedictkeys[i]); + if (!obj1.isNull()) { + pdf_add_name(pdf, pagedictkeys[i]); + /* preserves indirection */ + copyObject(pdf, pdf_doc, &obj1); + } +- obj1.free(); + } + /* + If there are no Resources in the Page dict of the embedded page, +@@ -808,32 +802,28 @@ + PDF file, climbing up the tree until the Resources are found. + (This fixes a problem with Scribus 1.3.3.14.) + */ +- pageDict->lookupNF("Resources", &obj1); ++ obj1 = pageDict->lookupNF("Resources"); + if (obj1.isNull()) { + op1 = &pagesobj1; + op2 = &pagesobj2; +- pageDict->lookup("Parent", op1); ++ *op1 = pageDict->lookup("Parent"); + while (op1->isDict()) { +- obj1.free(); +- op1->dictLookupNF("Resources", &obj1); ++ obj1 = op1->dictLookupNF("Resources"); + if (!obj1.isNull()) { + pdf_add_name(pdf, "Resources"); + copyObject(pdf, pdf_doc, &obj1); + break; + } +- op1->dictLookup("Parent", op2); ++ *op2 = op1->dictLookup("Parent"); + optmp = op1; + op1 = op2; + op2 = optmp; +- op2->free(); + }; + if (!op1->isDict()) + formatted_warning("pdf inclusion","Page /Resources missing"); +- op1->free(); + } +- obj1.free(); + /* Write the Page contents. */ +- page->getContents(&contents); ++ contents = page->getContents(); + if (contents.isStream()) { + /* + Variant A: get stream and recompress under control of \pdfcompresslevel +@@ -844,27 +834,23 @@ + + Variant B: copy stream without recompressing + */ +- contents.streamGetDict()->lookup("F", &obj1); ++ obj1 = contents.streamGetDict()->lookup("F"); + if (!obj1.isNull()) { + normal_error("pdf inclusion","unsupported external stream"); + } +- obj1.free(); +- contents.streamGetDict()->lookup("Length", &obj1); ++ obj1 = contents.streamGetDict()->lookup("Length"); + pdf_add_name(pdf, "Length"); + copyObject(pdf, pdf_doc, &obj1); +- obj1.free(); +- contents.streamGetDict()->lookup("Filter", &obj1); ++ obj1 = contents.streamGetDict()->lookup("Filter"); + if (!obj1.isNull()) { + pdf_add_name(pdf, "Filter"); + copyObject(pdf, pdf_doc, &obj1); +- obj1.free(); +- contents.streamGetDict()->lookup("DecodeParms", &obj1); ++ obj1 = contents.streamGetDict()->lookup("DecodeParms"); + if (!obj1.isNull()) { + pdf_add_name(pdf, "DecodeParms"); + copyObject(pdf, pdf_doc, &obj1); + } + } +- obj1.free(); + pdf_end_dict(pdf); + pdf_begin_stream(pdf); + copyStreamStream(pdf, contents.getStream()->getUndecodedStream()); +@@ -875,8 +861,8 @@ + pdf_end_dict(pdf); + pdf_begin_stream(pdf); + for (i = 0, l = contents.arrayGetLength(); i < l; ++i) { +- copyStreamStream(pdf, (contents.arrayGet(i, &obj1))->getStream()); +- obj1.free(); ++ obj1 = contents.arrayGet(i); ++ copyStreamStream(pdf, obj1.getStream()); + if (i < (l - 1)) { + /* + Put a space between streams to be on the safe side (streams +@@ -897,8 +883,6 @@ + } + /* write out all indirect objects */ + writeRefs(pdf, pdf_doc); +- contents.free(); +- pageobj.free(); + /* + unrefPdfDocument() must come after contents.free() and pageobj.free()! + TH: The next line makes repeated pdf inclusion unacceptably slow +diff -ur source.orig/texk/web2c/luatexdir/lua/lepdflib.cc source/texk/web2c/luatexdir/lua/lepdflib.cc +--- source.orig/texk/web2c/luatexdir/lua/lepdflib.cc 2017-05-08 22:39:36.689375107 +0200 ++++ source/texk/web2c/luatexdir/lua/lepdflib.cc 2017-09-19 09:48:19.658021769 +0200 +@@ -538,7 +538,7 @@ + pdfdoc_changed_error(L); \ + uout = new_Object_userdata(L); \ + uout->d = new Object(); \ +- ((in *) uin->d)->function((Object *) uout->d); \ ++ *((Object *)uout->d) = ((in *) uin->d)->function(); \ + uout->atype = ALLOC_LEPDF; \ + uout->pc = uin->pc; \ + uout->pd = uin->pd; \ +@@ -668,13 +668,11 @@ + + static int m_Array_incRef(lua_State * L) + { +- int i; + udstruct *uin; + uin = (udstruct *) luaL_checkudata(L, 1, M_Array); + if (uin->pd != NULL && uin->pd->pc != uin->pc) + pdfdoc_changed_error(L); +- i = ((Array *) uin->d)->incRef(); +- lua_pushinteger(L, i); ++ lua_pushinteger(L, 1); + return 1; + } + +@@ -685,8 +683,7 @@ + uin = (udstruct *) luaL_checkudata(L, 1, M_Array); + if (uin->pd != NULL && uin->pd->pc != uin->pc) + pdfdoc_changed_error(L); +- i = ((Array *) uin->d)->decRef(); +- lua_pushinteger(L, i); ++ lua_pushinteger(L, 1); + return 1; + } + +@@ -702,7 +699,7 @@ + if ((uin->pd != NULL && uin->pd->pc != uin->pc) + || (uobj->pd != NULL && uobj->pd->pc != uobj->pc)) + pdfdoc_changed_error(L); +- ((Array *) uin->d)->add(((Object *) uobj->d)); ++ ((Array *) uin->d)->add(std::move(*((Object *) uobj->d))); + return 0; + } + +@@ -718,7 +715,7 @@ + if (i > 0 && i <= len) { + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((Array *) uin->d)->get(i - 1, (Object *) uout->d); ++ *((Object *) uout->d) = ((Array *) uin->d)->get(i - 1); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -739,7 +736,7 @@ + if (i > 0 && i <= len) { + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((Array *) uin->d)->getNF(i - 1, (Object *) uout->d); ++ *((Object *) uout->d) = ((Array *) uin->d)->getNF(i - 1); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -953,25 +950,21 @@ + + static int m_Dict_incRef(lua_State * L) + { +- int i; + udstruct *uin; + uin = (udstruct *) luaL_checkudata(L, 1, M_Dict); + if (uin->pd != NULL && uin->pd->pc != uin->pc) + pdfdoc_changed_error(L); +- i = ((Dict *) uin->d)->incRef(); +- lua_pushinteger(L, i); ++ lua_pushinteger(L, 1); + return 1; + } + + static int m_Dict_decRef(lua_State * L) + { +- int i; + udstruct *uin; + uin = (udstruct *) luaL_checkudata(L, 1, M_Dict); + if (uin->pd != NULL && uin->pd->pc != uin->pc) + pdfdoc_changed_error(L); +- i = ((Dict *) uin->d)->decRef(); +- lua_pushinteger(L, i); ++ lua_pushinteger(L, 1); + return 1; + } + +@@ -986,7 +979,7 @@ + pdfdoc_changed_error(L); + s = copyString(luaL_checkstring(L, 2)); + uobj = (udstruct *) luaL_checkudata(L, 3, M_Object); +- ((Dict *) uin->d)->add(s, ((Object *) uobj->d)); ++ ((Dict *) uin->d)->add(s, std::move(*((Object *) uobj->d))); + return 0; + } + +@@ -999,7 +992,7 @@ + pdfdoc_changed_error(L); + s = luaL_checkstring(L, 2); + uobj = (udstruct *) luaL_checkudata(L, 3, M_Object); +- ((Dict *) uin->d)->set(s, ((Object *) uobj->d)); ++ ((Dict *) uin->d)->set(s, std::move(*((Object *) uobj->d))); + return 0; + } + +@@ -1027,7 +1020,7 @@ + s = luaL_checkstring(L, 2); + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((Dict *) uin->d)->lookup(s, (Object *) uout->d); ++ *((Object *) uout->d) = ((Dict *) uin->d)->lookup(s); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -1044,7 +1037,7 @@ + s = luaL_checkstring(L, 2); + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((Dict *) uin->d)->lookupNF(s, (Object *) uout->d); ++ *((Object *) uout->d) = ((Dict *) uin->d)->lookupNF(s); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -1096,7 +1089,7 @@ + if (i > 0 && i <= len) { + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((Dict *) uin->d)->getVal(i - 1, (Object *) uout->d); ++ *((Object *) uout->d) = ((Dict *) uin->d)->getVal(i - 1); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -1117,7 +1110,7 @@ + if (i > 0 && i <= len) { + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((Dict *) uin->d)->getValNF(i - 1, (Object *) uout->d); ++ *((Object *) uout->d) = ((Dict *) uin->d)->getValNF(i - 1); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -1381,9 +1374,9 @@ + pdfdoc_changed_error(L); + luaL_checktype(L, 2, LUA_TBOOLEAN); + if (lua_toboolean(L, 2) != 0) +- ((Object *) uin->d)->initBool(gTrue); ++ *((Object *) uin->d) = Object(gTrue); + else +- ((Object *) uin->d)->initBool(gFalse); ++ *((Object *) uin->d) = Object(gFalse); + return 0; + } + +@@ -1395,7 +1388,7 @@ + if (uin->pd != NULL && uin->pd->pc != uin->pc) + pdfdoc_changed_error(L); + i = luaL_checkint(L, 2); +- ((Object *) uin->d)->initInt(i); ++ *((Object *) uin->d) = Object(i); + return 0; + } + +@@ -1407,7 +1400,7 @@ + if (uin->pd != NULL && uin->pd->pc != uin->pc) + pdfdoc_changed_error(L); + d = luaL_checknumber(L, 2); +- ((Object *) uin->d)->initReal(d); ++ *((Object *) uin->d) = Object(d); + return 0; + } + +@@ -1422,7 +1415,7 @@ + pdfdoc_changed_error(L); + s = luaL_checklstring(L, 2, &len); + gs = new GooString(s, len); +- ((Object *) uin->d)->initString(gs); ++ *((Object *) uin->d) = Object(gs); + return 0; + } + +@@ -1434,7 +1427,7 @@ + if (uin->pd != NULL && uin->pd->pc != uin->pc) + pdfdoc_changed_error(L); + s = luaL_checkstring(L, 2); +- ((Object *) uin->d)->initName(s); ++ *((Object *) uin->d) = Object(objName, s); + return 0; + } + +@@ -1444,13 +1437,14 @@ + uin = (udstruct *) luaL_checkudata(L, 1, M_Object); + if (uin->pd != NULL && uin->pd->pc != uin->pc) + pdfdoc_changed_error(L); +- ((Object *) uin->d)->initNull(); ++ *((Object *) uin->d) = Object(objNull); + return 0; + } + + static int m_Object_initArray(lua_State * L) + { + udstruct *uin, *uxref; ++ Array *a; + uin = (udstruct *) luaL_checkudata(L, 1, M_Object); + uxref = (udstruct *) luaL_checkudata(L, 2, M_XRef); + if (uin->pd != NULL && uxref->pd != NULL && uin->pd != uxref->pd) +@@ -1458,7 +1452,8 @@ + if ((uin->pd != NULL && uin->pd->pc != uin->pc) + || (uxref->pd != NULL && uxref->pd->pc != uxref->pc)) + pdfdoc_changed_error(L); +- ((Object *) uin->d)->initArray((XRef *) uxref->d); ++ a = new Array((XRef *) uxref->d); ++ *((Object *) uin->d) = Object(a); + return 0; + } + +@@ -1469,6 +1464,7 @@ + static int m_Object_initDict(lua_State * L) + { + udstruct *uin, *uxref; ++ Dict *d; + uin = (udstruct *) luaL_checkudata(L, 1, M_Object); + uxref = (udstruct *) luaL_checkudata(L, 2, M_XRef); + if (uin->pd != NULL && uxref->pd != NULL && uin->pd != uxref->pd) +@@ -1476,7 +1472,8 @@ + if ((uin->pd != NULL && uin->pd->pc != uin->pc) + || (uxref->pd != NULL && uxref->pd->pc != uxref->pc)) + pdfdoc_changed_error(L); +- ((Object *) uin->d)->initDict((XRef *) uxref->d); ++ d = new Dict((XRef *) uxref->d); ++ *((Object *) uin->d) = Object(d); + return 0; + } + +@@ -1490,7 +1487,7 @@ + if ((uin->pd != NULL && uin->pd->pc != uin->pc) + || (ustream->pd != NULL && ustream->pd->pc != ustream->pc)) + pdfdoc_changed_error(L); +- ((Object *) uin->d)->initStream((Stream *) ustream->d); ++ *((Object *) uin->d) = Object((Stream *) ustream->d); + return 0; + } + +@@ -1503,7 +1500,7 @@ + pdfdoc_changed_error(L); + num = luaL_checkint(L, 2); + gen = luaL_checkint(L, 3); +- ((Object *) uin->d)->initRef(num, gen); ++ *((Object *) uin->d) = Object(num, gen); + return 0; + } + +@@ -1515,7 +1512,7 @@ + if (uin->pd != NULL && uin->pd->pc != uin->pc) + pdfdoc_changed_error(L); + s = luaL_checkstring(L, 2); +- ((Object *) uin->d)->initCmd(CHARP_CAST s); ++ *((Object *) uin->d) = Object(objCmd, CHARP_CAST s); + return 0; + } + +@@ -1525,7 +1522,7 @@ + uin = (udstruct *) luaL_checkudata(L, 1, M_Object); + if (uin->pd != NULL && uin->pd->pc != uin->pc) + pdfdoc_changed_error(L); +- ((Object *) uin->d)->initError(); ++ *((Object *) uin->d) = Object(objError); + return 0; + } + +@@ -1535,7 +1532,7 @@ + uin = (udstruct *) luaL_checkudata(L, 1, M_Object); + if (uin->pd != NULL && uin->pd->pc != uin->pc) + pdfdoc_changed_error(L); +- ((Object *) uin->d)->initEOF(); ++ *((Object *) uin->d) = Object(objEOF); + return 0; + } + +@@ -1551,7 +1548,7 @@ + pdfdoc_changed_error(L); + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((Object *) uin->d)->fetch((XRef *) uxref->d, (Object *) uout->d); ++ *((Object *) uout->d) = ((Object *) uin->d)->fetch((XRef *) uxref->d); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -1816,7 +1813,7 @@ + pdfdoc_changed_error(L); + if (!((Object *) uin->d)->isArray()) + luaL_error(L, "Object is not an Array"); +- ((Object *) uin->d)->arrayAdd((Object *) uobj->d); ++ ((Object *) uin->d)->arrayAdd(std::move(*((Object *) uobj->d))); + return 0; + } + +@@ -1833,7 +1830,7 @@ + if (i > 0 && i <= len) { + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((Object *) uin->d)->arrayGet(i - 1, (Object *) uout->d); ++ *((Object *) uout->d) = ((Object *) uin->d)->arrayGet(i - 1); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -1857,7 +1854,7 @@ + if (i > 0 && i <= len) { + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((Object *) uin->d)->arrayGetNF(i - 1, (Object *) uout->d); ++ *((Object *) uout->d) = ((Object *) uin->d)->arrayGetNF(i - 1); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -1897,7 +1894,7 @@ + pdfdoc_changed_error(L); + if (!((Object *) uin->d)->isDict()) + luaL_error(L, "Object is not a Dict"); +- ((Object *) uin->d)->dictAdd(copyString(s), (Object *) uobj->d); ++ ((Object *) uin->d)->dictAdd(copyString(s), std::move(*((Object *) uobj->d))); + return 0; + } + +@@ -1915,7 +1912,7 @@ + pdfdoc_changed_error(L); + if (!((Object *) uin->d)->isDict()) + luaL_error(L, "Object is not a Dict"); +- ((Object *) uin->d)->dictSet(s, (Object *) uobj->d); ++ ((Object *) uin->d)->dictSet(s, std::move(*((Object *) uobj->d))); + return 0; + } + +@@ -1930,7 +1927,7 @@ + if (((Object *) uin->d)->isDict()) { + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((Object *) uin->d)->dictLookup(s, (Object *) uout->d); ++ *((Object *) uout->d) = ((Object *) uin->d)->dictLookup(s); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -1950,7 +1947,7 @@ + if (((Object *) uin->d)->isDict()) { + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((Object *) uin->d)->dictLookupNF(s, (Object *) uout->d); ++ *((Object *) uout->d) = ((Object *) uin->d)->dictLookupNF(s); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -1991,7 +1988,7 @@ + if (i > 0 && i <= len) { + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((Object *) uin->d)->dictGetVal(i - 1, (Object *) uout->d); ++ *((Object *) uout->d) = ((Object *) uin->d)->dictGetVal(i - 1); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -2015,7 +2012,7 @@ + if (i > 0 && i <= len) { + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((Object *) uin->d)->dictGetValNF(i - 1, (Object *) uout->d); ++ *((Object *) uout->d) = ((Object *) uin->d)->dictGetValNF(i - 1); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -2243,7 +2240,7 @@ + m_poppler_get_poppler(Page, Dict, getPieceInfo); + m_poppler_get_poppler(Page, Dict, getSeparationInfo); + m_poppler_get_poppler(Page, Dict, getResourceDict); +-m_poppler_get_OBJECT(Page, getAnnots); ++m_poppler_get_OBJECT(Page, getAnnotsObject); + + m_poppler_get_OBJECT(Page, getContents); + +@@ -2270,7 +2267,7 @@ + {"getPieceInfo", m_Page_getPieceInfo}, + {"getSeparationInfo", m_Page_getSeparationInfo}, + {"getResourceDict", m_Page_getResourceDict}, +- {"getAnnots", m_Page_getAnnots}, ++ {"getAnnots", m_Page_getAnnotsObject}, + {"getContents", m_Page_getContents}, + {"__tostring", m_Page__tostring}, + {NULL, NULL} // sentinel +@@ -2520,7 +2517,7 @@ + if (((PdfDocument *) uin->d)->doc->getXRef()->isOk()) { + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((PdfDocument *) uin->d)->doc->getDocInfo((Object *) uout->d); ++ *((Object *) uout->d) = ((PdfDocument *) uin->d)->doc->getDocInfo(); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -2538,7 +2535,7 @@ + if (((PdfDocument *) uin->d)->doc->getXRef()->isOk()) { + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((PdfDocument *) uin->d)->doc->getDocInfoNF((Object *) uout->d); ++ *((Object *) uout->d) = ((PdfDocument *) uin->d)->doc->getDocInfoNF(); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -2841,7 +2838,7 @@ + uout = new_Object_userdata(L); + uout->d = new Object(); + origin = (Object *) (((Attribute *) uin->d)->getValue()); +- origin->copy ( ((Object *)uout->d) ); ++ *((Object *) uout->d) = origin->copy(); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -3320,7 +3317,7 @@ + parent = root->findParentElement(i-1); + if (parent != NULL) { + uout = new_StructElement_userdata(L); +- uout->d = new StructElement( *parent ); ++ uout->d = (StructElement *) parent; + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +@@ -3370,7 +3367,7 @@ + gen = luaL_checkint(L, 3); + uout = new_Object_userdata(L); + uout->d = new Object(); +- ((XRef *) uin->d)->fetch(num, gen, (Object *) uout->d); ++ *((Object *) uout->d) = ((XRef *) uin->d)->fetch(num, gen); + uout->atype = ALLOC_LEPDF; + uout->pc = uin->pc; + uout->pd = uin->pd; +diff -ur source.orig/texk/web2c/luatexdir/lua/lpdfscannerlib.cc source/texk/web2c/luatexdir/lua/lpdfscannerlib.cc +--- source.orig/texk/web2c/luatexdir/lua/lpdfscannerlib.cc 2017-05-08 22:39:36.692708395 +0200 ++++ source/texk/web2c/luatexdir/lua/lpdfscannerlib.cc 2017-09-19 09:48:19.658021769 +0200 +@@ -634,7 +634,7 @@ + int i; + for (i=0;iget(i, val); ++ *val = arrayref->get(i); + if (val->isStream()) { + ObjectList *rover = self->_streams; + ObjectList *item = (ObjectList *)priv_xmalloc (sizeof(ObjectList)); +diff -ur source.orig/texk/web2c/pdftexdir/pdftoepdf.cc source/texk/web2c/pdftexdir/pdftoepdf.cc +--- source.orig/texk/web2c/pdftexdir/pdftoepdf.cc 2017-06-16 21:49:09.293857387 +0200 ++++ source/texk/web2c/pdftexdir/pdftoepdf.cc 2017-09-19 09:48:19.661355046 +0200 +@@ -84,31 +84,6 @@ + #define MASK_SUPPRESS_PTEX_PAGENUMBER 0x04 + #define MASK_SUPPRESS_PTEX_INFODICT 0x08 + +-// PdfObject encapsulates the xpdf Object type, +-// and properly frees its resources on destruction. +-// Use obj-> to access members of the Object, +-// and &obj to get a pointer to the object. +-// It is no longer necessary to call Object::free explicitely. +- +-class PdfObject { +- public: +- PdfObject() { // nothing +- } ~PdfObject() { +- iObject.free(); +- } +- Object *operator->() { +- return &iObject; +- } +- Object *operator&() { +- return &iObject; +- } +- private: // no copying or assigning +- PdfObject(const PdfObject &); +- void operator=(const PdfObject &); +- public: +- Object iObject; +-}; +- + // When copying the Resources of the selected page, all objects are copied + // recusively top-down. Indirect objects however are not fetched during + // copying, but get a new object number from pdfTeX and then will be +@@ -212,18 +187,6 @@ + delete pdf_doc; + } + +-// Replacement for +-// Object *initDict(Dict *dict1){ initObj(objDict); dict = dict1; return this; } +- +-static void initDictFromDict(PdfObject & obj, Dict * dict) +-{ +- obj->initDict(xref); +- for (int i = 0, l = dict->getLength(); i < l; i++) { +- Object obj1; +- obj->dictAdd(copyString(dict->getKey(i)), dict->getValNF(i, &obj1)); +- } +-} +- + // -------------------------------------------------------------------- + + static int addEncoding(GfxFont * gfont) +@@ -320,10 +283,10 @@ + + static void copyDictEntry(Object * obj, int i) + { +- PdfObject obj1; ++ Object obj1; + copyName(obj->dictGetKey(i)); + pdf_puts(" "); +- obj->dictGetValNF(i, &obj1); ++ obj1 = obj->dictGetValNF(i); + copyObject(&obj1); + pdf_puts("\n"); + } +@@ -376,17 +339,17 @@ + static void copyProcSet(Object * obj) + { + int i, l; +- PdfObject procset; ++ Object procset; + if (!obj->isArray()) + pdftex_fail("PDF inclusion: invalid ProcSet array type <%s>", + obj->getTypeName()); + pdf_puts("/ProcSet [ "); + for (i = 0, l = obj->arrayGetLength(); i < l; ++i) { +- obj->arrayGetNF(i, &procset); +- if (!procset->isName()) ++ procset = obj->arrayGetNF(i); ++ if (!procset.isName()) + pdftex_fail("PDF inclusion: invalid ProcSet entry type <%s>", +- procset->getTypeName()); +- copyName(procset->getName()); ++ procset.getTypeName()); ++ copyName(procset.getName()); + pdf_puts(" "); + } + pdf_puts("]\n"); +@@ -394,10 +357,29 @@ + + #define REPLACE_TYPE1C true + ++static bool embeddableFont(Object * fontdesc) ++{ ++ Object fontfile, ffsubtype; ++ ++ if (!fontdesc->isDict()) ++ return false; ++ fontfile = fontdesc->dictLookup("FontFile"); ++ if (fontfile.isStream()) ++ return true; ++ if (REPLACE_TYPE1C) { ++ fontfile = fontdesc->dictLookup("FontFile3"); ++ if (!fontfile.isStream()) ++ return false; ++ ffsubtype = fontfile.streamGetDict()->lookup("Subtype"); ++ return ffsubtype.isName() && !strcmp(ffsubtype.getName(), "Type1C"); ++ } ++ return false; ++} ++ + static void copyFont(char *tag, Object * fontRef) + { +- PdfObject fontdict, subtype, basefont, fontdescRef, fontdesc, charset, +- fontfile, ffsubtype, stemV; ++ Object fontdict, subtype, basefont, fontdescRef, fontdesc, charset, ++ stemV; + GfxFont *gfont; + fd_entry *fd; + fm_entry *fontmap; +@@ -413,33 +395,39 @@ + } + // Only handle included Type1 (and Type1C) fonts; anything else will be copied. + // Type1C fonts are replaced by Type1 fonts, if REPLACE_TYPE1C is true. +- if (!fixedinclusioncopyfont && fontRef->fetch(xref, &fontdict)->isDict() +- && fontdict->dictLookup("Subtype", &subtype)->isName() +- && !strcmp(subtype->getName(), "Type1") +- && fontdict->dictLookup("BaseFont", &basefont)->isName() +- && fontdict->dictLookupNF("FontDescriptor", &fontdescRef)->isRef() +- && fontdescRef->fetch(xref, &fontdesc)->isDict() +- && (fontdesc->dictLookup("FontFile", &fontfile)->isStream() +- || (REPLACE_TYPE1C +- && fontdesc->dictLookup("FontFile3", &fontfile)->isStream() +- && fontfile->streamGetDict()->lookup("Subtype", +- &ffsubtype)->isName() +- && !strcmp(ffsubtype->getName(), "Type1C"))) +- && (fontmap = lookup_fontmap(basefont->getName())) != NULL) { ++ fontdict = fontRef->fetch(xref); ++ fontdesc = Object(objNull); ++ if (fontdict.isDict()) { ++ subtype = fontdict.dictLookup("Subtype"); ++ basefont = fontdict.dictLookup("BaseFont"); ++ fontdescRef = fontdict.dictLookupNF("FontDescriptor"); ++ if (fontdescRef.isRef()) { ++ fontdesc = fontdescRef.fetch(xref); ++ } ++ } ++ if (!fixedinclusioncopyfont && fontdict.isDict() ++ && subtype.isName() ++ && !strcmp(subtype.getName(), "Type1") ++ && basefont.isName() ++ && fontdescRef.isRef() ++ && fontdesc.isDict() ++ && embeddableFont(&fontdesc) ++ && (fontmap = lookup_fontmap(basefont.getName())) != NULL) { + // round /StemV value, since the PDF input is a float + // (see Font Descriptors in PDF reference), but we only store an + // integer, since we don't want to change the struct. +- fontdesc->dictLookup("StemV", &stemV); +- fd = epdf_create_fontdescriptor(fontmap, zround(stemV->getNum())); +- if (fontdesc->dictLookup("CharSet", &charset) && +- charset->isString() && is_subsetable(fontmap)) +- epdf_mark_glyphs(fd, charset->getString()->getCString()); ++ stemV = fontdesc.dictLookup("StemV"); ++ fd = epdf_create_fontdescriptor(fontmap, zround(stemV.getNum())); ++ charset = fontdesc.dictLookup("CharSet"); ++ if (!charset.isNull() && ++ charset.isString() && is_subsetable(fontmap)) ++ epdf_mark_glyphs(fd, charset.getString()->getCString()); + else + embed_whole_font(fd); +- addFontDesc(fontdescRef->getRef(), fd); ++ addFontDesc(fontdescRef.getRef(), fd); + copyName(tag); + gfont = GfxFont::makeFont(xref, tag, fontRef->getRef(), +- fontdict->getDict()); ++ fontdict.getDict()); + pdf_printf(" %d 0 R ", addFont(fontRef->getRef(), fd, + addEncoding(gfont))); + } else { +@@ -451,24 +439,24 @@ + + static void copyFontResources(Object * obj) + { +- PdfObject fontRef; ++ Object fontRef; + int i, l; + if (!obj->isDict()) + pdftex_fail("PDF inclusion: invalid font resources dict type <%s>", + obj->getTypeName()); + pdf_puts("/Font << "); + for (i = 0, l = obj->dictGetLength(); i < l; ++i) { +- obj->dictGetValNF(i, &fontRef); +- if (fontRef->isRef()) ++ fontRef = obj->dictGetValNF(i); ++ if (fontRef.isRef()) + copyFont(obj->dictGetKey(i), &fontRef); +- else if (fontRef->isDict()) { // some programs generate pdf with embedded font object ++ else if (fontRef.isDict()) { // some programs generate pdf with embedded font object + copyName(obj->dictGetKey(i)); + pdf_puts(" "); + copyObject(&fontRef); + } + else + pdftex_fail("PDF inclusion: invalid font in reference type <%s>", +- fontRef->getTypeName()); ++ fontRef.getTypeName()); + } + pdf_puts(">>\n"); + } +@@ -557,7 +545,7 @@ + + static void copyObject(Object * obj) + { +- PdfObject obj1; ++ Object obj1; + int i, l, c; + Ref ref; + char *p; +@@ -601,8 +589,8 @@ + } else if (obj->isArray()) { + pdf_puts("["); + for (i = 0, l = obj->arrayGetLength(); i < l; ++i) { +- obj->arrayGetNF(i, &obj1); +- if (!obj1->isName()) ++ obj1 = obj->arrayGetNF(i); ++ if (!obj1.isName()) + pdf_puts(" "); + copyObject(&obj1); + } +@@ -612,9 +600,8 @@ + copyDict(obj); + pdf_puts(">>"); + } else if (obj->isStream()) { +- initDictFromDict(obj1, obj->streamGetDict()); + pdf_puts("<<\n"); +- copyDict(&obj1); ++ copyDict(obj->getStream()->getDictObject()); + pdf_puts(">>\n"); + pdf_puts("stream\n"); + copyStream(obj->getStream()->getUndecodedStream()); +@@ -638,9 +625,8 @@ + InObj *r; + for (r = inObjList; r != 0; r = r->next) { + if (!r->written) { +- Object obj1; + r->written = 1; +- xref->fetch(r->ref.num, r->ref.gen, &obj1); ++ Object obj1 = xref->fetch(r->ref.num, r->ref.gen); + if (r->type == objFont) { + assert(!obj1.isStream()); + pdfbeginobj(r->num, 2); // \pdfobjcompresslevel = 2 is for this +@@ -656,7 +642,6 @@ + pdf_puts("\n"); + pdfendobj(); + } +- obj1.free(); + } + } + } +@@ -839,8 +824,8 @@ + Page *page; + Ref *pageRef; + Dict *pageDict; +- PdfObject contents, obj1, obj2, pageObj, dictObj; +- PdfObject groupDict; ++ Object contents, obj1, obj2, pageObj, dictObj; ++ Object groupDict; + bool writeSepGroup = false; + Object info; + char *key; +@@ -867,8 +852,8 @@ + encodingList = 0; + page = pdf_doc->doc->getCatalog()->getPage(epdf_selected_page); + pageRef = pdf_doc->doc->getCatalog()->getPageRef(epdf_selected_page); +- xref->fetch(pageRef->num, pageRef->gen, &pageObj); +- pageDict = pageObj->getDict(); ++ pageObj = xref->fetch(pageRef->num, pageRef->gen); ++ pageDict = pageObj.getDict(); + rotate = page->getRotate(); + PDFRectangle *pagebox; + // write the Page header +@@ -886,7 +871,7 @@ + pdf_printf("/%s.PageNumber %i\n", pdfkeyprefix, (int) epdf_selected_page); + } + if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_INFODICT) == 0) { +- pdf_doc->doc->getDocInfoNF(&info); ++ info = pdf_doc->doc->getDocInfoNF(); + if (info.isRef()) { + // the info dict must be indirect (PDF Ref p. 61) + pdf_printf("/%s.InfoDict ", pdfkeyprefix); +@@ -942,14 +927,14 @@ + pdf_puts(stripzeros(s)); + + // Metadata validity check (as a stream it must be indirect) +- pageDict->lookupNF("Metadata", &dictObj); +- if (!dictObj->isNull() && !dictObj->isRef()) ++ dictObj = pageDict->lookupNF("Metadata"); ++ if (!dictObj.isNull() && !dictObj.isRef()) + pdftex_warn("PDF inclusion: /Metadata must be indirect object"); + + // copy selected items in Page dictionary except Resources & Group + for (i = 0; pageDictKeys[i] != NULL; i++) { +- pageDict->lookupNF(pageDictKeys[i], &dictObj); +- if (!dictObj->isNull()) { ++ dictObj = pageDict->lookupNF(pageDictKeys[i]); ++ if (!dictObj.isNull()) { + pdf_newline(); + pdf_printf("/%s ", pageDictKeys[i]); + copyObject(&dictObj); // preserves indirection +@@ -957,8 +942,8 @@ + } + + // handle page group +- pageDict->lookupNF("Group", &dictObj); +- if (!dictObj->isNull()) { ++ dictObj = pageDict->lookupNF("Group"); ++ if (!dictObj.isNull()) { + if (pdfpagegroupval == 0) { + // another pdf with page group was included earlier on the + // same page; copy the Group entry as is. See manual for +@@ -972,11 +957,11 @@ + copyObject(&dictObj); + } else { + // write Group dict as a separate object, since the Page dict also refers to it +- pageDict->lookup("Group", &dictObj); +- if (!dictObj->isDict()) ++ dictObj = pageDict->lookup("Group"); ++ if (!dictObj.isDict()) + pdftex_fail("PDF inclusion: /Group dict missing"); + writeSepGroup = true; +- initDictFromDict(groupDict, page->getGroup()); ++ groupDict = Object(page->getGroup()); + pdf_printf("/Group %ld 0 R\n", (long)pdfpagegroupval); + } + } +@@ -989,14 +974,14 @@ + pdftex_warn + ("PDF inclusion: /Resources missing. 'This practice is not recommended' (PDF Ref)"); + } else { +- initDictFromDict(obj1, page->getResourceDict()); ++ Object *obj1 = page->getResourceDictObject(); + if (!obj1->isDict()) + pdftex_fail("PDF inclusion: invalid resources dict type <%s>", + obj1->getTypeName()); + pdf_newline(); + pdf_puts("/Resources <<\n"); + for (i = 0, l = obj1->dictGetLength(); i < l; ++i) { +- obj1->dictGetVal(i, &obj2); ++ obj2 = obj1->dictGetVal(i); + key = obj1->dictGetKey(i); + if (strcmp("Font", key) == 0) + copyFontResources(&obj2); +@@ -1009,8 +994,8 @@ + } + + // write the page contents +- page->getContents(&contents); +- if (contents->isStream()) { ++ contents = page->getContents(); ++ if (contents.isStream()) { + + // Variant A: get stream and recompress under control + // of \pdfcompresslevel +@@ -1021,36 +1006,35 @@ + + // Variant B: copy stream without recompressing + // +- contents->streamGetDict()->lookup("F", &obj1); +- if (!obj1->isNull()) { ++ obj1 = contents.streamGetDict()->lookup("F"); ++ if (!obj1.isNull()) { + pdftex_fail("PDF inclusion: Unsupported external stream"); + } +- contents->streamGetDict()->lookup("Length", &obj1); +- assert(!obj1->isNull()); ++ obj1 = contents.streamGetDict()->lookup("Length"); ++ assert(!obj1.isNull()); + pdf_puts("/Length "); + copyObject(&obj1); + pdf_puts("\n"); +- contents->streamGetDict()->lookup("Filter", &obj1); +- if (!obj1->isNull()) { ++ obj1 = contents.streamGetDict()->lookup("Filter"); ++ if (!obj1.isNull()) { + pdf_puts("/Filter "); + copyObject(&obj1); + pdf_puts("\n"); +- contents->streamGetDict()->lookup("DecodeParms", &obj1); +- if (!obj1->isNull()) { ++ obj1 = contents.streamGetDict()->lookup("DecodeParms"); ++ if (!obj1.isNull()) { + pdf_puts("/DecodeParms "); + copyObject(&obj1); + pdf_puts("\n"); + } + } + pdf_puts(">>\nstream\n"); +- copyStream(contents->getStream()->getUndecodedStream()); ++ copyStream(contents.getStream()->getUndecodedStream()); + pdfendstream(); +- } else if (contents->isArray()) { ++ } else if (contents.isArray()) { + pdfbeginstream(); +- for (i = 0, l = contents->arrayGetLength(); i < l; ++i) { +- Object contentsobj; +- copyStream((contents->arrayGet(i, &contentsobj))->getStream()); +- contentsobj.free(); ++ for (i = 0, l = contents.arrayGetLength(); i < l; ++i) { ++ Object contentsobj = contents.arrayGet(i); ++ copyStream(contentsobj.getStream()); + if (i < l - 1) + pdf_newline(); // add a newline after each stream except the last + } +diff -ur source.orig/texk/web2c/pdftexdir/pdftosrc.cc source/texk/web2c/pdftexdir/pdftosrc.cc +--- source.orig/texk/web2c/pdftexdir/pdftosrc.cc 2017-06-16 21:49:09.297190679 +0200 ++++ source/texk/web2c/pdftexdir/pdftosrc.cc 2017-09-19 09:48:19.661355046 +0200 +@@ -86,22 +86,20 @@ + objgen = atoi(argv[3]); + } + xref = doc->getXRef(); +- catalogDict.initNull(); +- xref->getCatalog(&catalogDict); ++ catalogDict = xref->getCatalog(); + if (!catalogDict.isDict("Catalog")) { + fprintf(stderr, "No Catalog found\n"); + exit(1); + } +- srcStream.initNull(); ++ srcStream = Object(objNull); + if (objnum == 0) { +- catalogDict.dictLookup("SourceObject", &srcStream); ++ srcStream = catalogDict.dictLookup("SourceObject"); + static char const_SourceFile[] = "SourceFile"; + if (!srcStream.isStream(const_SourceFile)) { + fprintf(stderr, "No SourceObject found\n"); + exit(1); + } +- srcName.initNull(); +- srcStream.getStream()->getDict()->lookup("SourceName", &srcName); ++ srcName = srcStream.getStream()->getDict()->lookup("SourceName"); + if (!srcName.isString()) { + fprintf(stderr, "No SourceName found\n"); + exit(1); +@@ -110,7 +108,7 @@ + // We cannot free srcName, as objname shares its string. + // srcName.free(); + } else if (objnum > 0) { +- xref->fetch(objnum, objgen, &srcStream); ++ srcStream = xref->fetch(objnum, objgen); + if (!srcStream.isStream()) { + fprintf(stderr, "Not a Stream object\n"); + exit(1); +@@ -159,29 +157,26 @@ + int localOffset = 0; + Guint firstOffset; + +- assert(xref->fetch(e->offset, 0, &objStr)->isStream()); +- nObjects = objStr.streamGetDict()->lookup("N", &obj1)->getInt(); +- obj1.free(); +- first = objStr.streamGetDict()->lookup("First", &obj1)->getInt(); +- obj1.free(); ++ objStr = xref->fetch(e->offset, 0); ++ assert(objStr.isStream()); ++ obj1 = objStr.streamGetDict()->lookup("N"); ++ nObjects = obj1.getInt(); ++ obj1 = objStr.streamGetDict()->lookup("First"); ++ first = obj1.getInt(); + firstOffset = objStr.getStream()->getBaseStream()->getStart() + first; + + // parse the header: object numbers and offsets + objStr.streamReset(); +- obj1.initNull(); +- str = new EmbedStream(objStr.getStream(), &obj1, gTrue, first); ++ str = new EmbedStream(objStr.getStream(), Object(objNull), gTrue, first); + parser = new Parser(xref, new Lexer(xref, str), gFalse); + for (n = 0; n < nObjects; ++n) { +- parser->getObj(&obj1); +- parser->getObj(&obj2); ++ obj1 = parser->getObj(); ++ obj2 = parser->getObj(); + if (n == e->gen) + localOffset = obj2.getInt(); +- obj1.free(); +- obj2.free(); + } + while (str->getChar() != EOF) ; + delete parser; +- objStr.free(); + + fprintf(outfile, "%.10lu 00000 n\n", + (long unsigned)(firstOffset + localOffset)); +@@ -192,7 +187,6 @@ + s->reset(); + while ((c = s->getChar()) != EOF) + fputc(c, outfile); +- srcStream.free(); + } + if (objnum == 0) + fprintf(stderr, "Source file extracted to %s\n", outname); +@@ -201,7 +195,6 @@ + else + fprintf(stderr, "Cross-reference table extracted to %s\n", outname); + fclose(outfile); +- catalogDict.free(); + delete doc; + delete globalParams; + } diff --git a/source/t/texlive/prep/README b/source/t/texlive/prep/README new file mode 100644 index 00000000..479e834d --- /dev/null +++ b/source/t/texlive/prep/README @@ -0,0 +1,2 @@ +The script(s) in this directory are used to create the texmf archives +from the original Texlive netarchives. diff --git a/source/t/texlive/prep/texmf_get.sh b/source/t/texlive/prep/texmf_get.sh new file mode 100644 index 00000000..396fdceb --- /dev/null +++ b/source/t/texlive/prep/texmf_get.sh @@ -0,0 +1,752 @@ +#!/bin/bash + +# texmf_get.sh (c) 2016-2017 Johannes Schoepfer, Germany, slackbuilds[at]schoepfer[dot]info +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# V 0.14.2 +# +# Prepare xz-compressed tarballs of texlive-texmf-trees based on texlive.tlpdb +# This script takes care of dependencies(as far as these are present in texlive.tlpdb) of collections and packages, +# and that every texlive-package is included only once. +# The editions(base/extra/fonts/docs) should contain nobinaries(exception biber) +# -base: the most usefull stuff, all metafonts, all manpages, the most +# binaries/scripts, 65mb 2017-11-07 +# -docs: -base documentation only, no manpages/GNU infofiles +# -fonts: fonts only, no metafonts +# -extra: remaining stuff +# +# texlive netarchive policy: Every package is included as dependency +# in exactly one collection. A package may have dependencies on other +# packages from any collection. + +# package source: http://mirror.ctan.org/systems/texlive/tlnet/archive/ + +#set -e +MAJORVERSION=2017 + +# globally excluded packages, which e.g. are +# -useless without tlmgr-installer +# -non-linux +# -covered by an external package +# -obsolete + +global_exclude=" + asymptote + tlcockpit + tlshell + texosquery + aleph + omega + antomega + omegaware + lambda + otibet + cslatex + " + +texmf_editions () { + # At first, $corepackages for the base, and other essentials + PACKAGES=" + $(cat $corepackages) + collection-basic + collection-latex + collection-metapost + collection-plaingeneric + collection-fontutils + collection-luatex + collection-context + cbfonts-fd + xetex-devanagari + " texmfget base || exit 1 + + # Now the fonts package to make sure that big fonts like cm-super are not included elsewhere as dependency + PACKAGES=" + cm-super + cbfonts + ipaex + wadalab + ethiop-t1 + fonts-tlwg + uhc + fandol + arphic + arphic-ttf + nanumtype1 + baekmuk + unfonts-extra + unfonts-core + " texmfget fonts || exit 1 + + # put some stuff in "extra" to before these make their way into "base" as dependency + PACKAGES=" + $(grep ^"name biblatex" $db | grep -v '\.' | cut -d' ' -f2 ) + biber.x86_64-linux + biber.i386-linux + bib2gls + bibarts + arara + latex2nemeth + ghsystem + adobemapping + knitting + pgfornament + pgfplots + arabi + nwejm + uantwerpendocs + sduthesis + stellenbosch + fithesis + gregoriotex + lilyglyphs + musixtex-fonts + beebe + velthuis + mwe + pdfx + media9 + pst-cox + pst-poker + pst-vectorian + pst-geo + quran + ijsra + fibeamer + udesoftec + xduthesis + hustthesis + bangorcsthesis + sapthesis + uowthesis + cs + pl + cc-pl + tipa + kerkis + amiri + cns + vntex + montex + xcharter + fonts-churchslavonic + japanese-otf + sanskrit-t1 + skaknew + padauk + " texmfget extra || exit 1 + + # Completing the base + PACKAGES=" + collection-langcyrillic + collection-langczechslovak + collection-langeuropean + collection-langenglish + collection-langfrench + collection-langgerman + collection-langgreek + collection-langitalian + collection-langpolish + collection-langportuguese + collection-langspanish + collection-langjapanese + collection-langkorean + collection-langarabic + collection-langchinese + collection-langcjk + collection-langother + collection-xetex + collection-humanities + collection-mathscience + collection-pictures + collection-publishers + collection-music + collection-games + collection-fontsrecommended + collection-latexrecommended + collection-binextra + collection-bibtexextra + collection-formatsextra + collection-latexextra + acro + acronym + acroterm + enumitem + enumitem-zref + yfonts + doublestroke + was + xypic + barcodes + qrcode + lastpage + appendix + changebar + footmisc + multirow + overpic + subfigure + titlesec + siunitx + combelow + csquotes + etoolbox + etextools + idxlayout + bidi + filecontents + eplain + texsis + mltex + lollipop + moreverb + indextools + splitindex + eepic + bigfoot + xstring + showexpl + cweb-latex + hypdvips + ptex + perltex + collection-pstricks + $(collection_by_size fontsextra 20000 || exit 1) + " texmfget base || exit 1 + + # Put all remaining stuff in "extra" + # Pull some bin-packages from tlnet, which aren't provided by the texlive source tarball + PACKAGES=" + collection-texworks + collection-wintools + wasy2-ps + " texmfget extra || exit 1 + + # Call "fonts" at the end to add remaining fonts + PACKAGES=" + collection-fontsextra + " texmfget fonts || exit 1 + +} + +# ==== Nothing to edit beyond this line ==== + +usage () { + echo + echo "Generate texmf trees/editions based on collections/packages and their dependencies." + echo "./texmf_get.sh [base|docs|extra|fonts]" + echo + echo "-base: texfiles, no docs" + echo "-docs: docs of -base" + echo "-extra: remaining texfiles and docs" + echo "-fonts: fonts and docs" + echo + echo "Only new/updated/missing tex packages are downloaded." + echo "The first run takes \"long\", tex packages(about 2500Mb)" + echo "need to be downloaded and metafiles are generated." + echo "To check out a new version/release, delete" + echo "$db" + echo "A new ascii database is pulled on the next run," + echo "and a new version yymmdd is set." + echo + echo "All generated tarballs, logs etc. are going to" + echo "$TMP" + echo +} + +collection_by_size () { + # from collection $1, pull packages smaller $2 bytes + start_n="$(grep -n ^"name collection-$1"$ $db | cut -d':' -f1)" + # find end of package/collection + for emptyline in $emptylines + do + if [ "$emptyline" -gt "$start_n" ] + then + end_n=$emptyline + break + fi + done + extrapackages="$(sed "${start_n},${end_n}!d" $db | grep ^"depend " | grep -v ^"depend collection" | sed "s/^depend//g" )" + + # add if smaller than ... + for checksize in $extrapackages + do + package_meta $checksize || exit 1 + size=$(grep ^"containersize " $texmf/$checksize.meta | cut -d' ' -f2) + # for $2, e.g. 3000 means 3kb + [ $size -lt $2 ] && echo $checksize + done +} + +package_meta () { + if [ ! -s "$texmf/$1.meta" ] + then + # collection start linenumer + start_n="$(grep -n ^"name ${1}"$ $db | cut -d':' -f1)" + [ -z "$start_n" ] && echo "$1 was not found in $db, bye." && exit 1 + # find end of package/collection + for emptyline in $emptylines + do + if [ "$emptyline" -gt "$start_n" ] + then + end_n=$emptyline + break + fi + done + # Don't handle collections as dependency of other collections + sed "${start_n},${end_n}!d;/^depend collection/d" $db > $texmf/$1.meta + fi +} + +download () { + # Download packages, if not already available. Not every packages has a corresponding .doc package. + # Try three times if package isn't present, with -t1 to get another mirror the second time + cd $texmf + if [ ! -s "${1}${flavour}.tar.xz" ] + then + for run in {1..10} + do + wget -t1 -c ${mirror}archive/${1}${flavour}.tar.xz + [ -s "${1}${flavour}.tar.xz" ] && break + done + fi + # If no success by downloading, write error log + [ ! -s ${1}${flavour}.tar.xz ] && echo "Downloading ${1}${flavour}.tar.xz did not work, writing to $errorlog" && echo "$VERSION" >> $errorlog && echo "Error downloading ${1}${flavour}.tar.xz" >> $errorlog && exit 1 + + # check sha512, give three tries for downloading again(diffrent mirrors are used automatically) + if [ "$flavour" = ".doc" ] + then + sha512="$(grep ^doccontainerchecksum $texmf/$1.meta | cut -d' ' -f2 )" + else + sha512="$(grep ^containerchecksum $texmf/$1.meta | cut -d' ' -f2 )" + fi + + for run in {1..10} + do + if [ "$(sha512sum ${1}${flavour}.tar.xz | cut -d' ' -f1 )" != "$sha512" ] + then + # Download (hopefully) newer file + rm ${1}${flavour}.tar.xz + wget -t1 -c ${mirror}archive/${1}${flavour}.tar.xz + else + break + fi + done + # check sha512 again, exit if it fails + if [ "$(sha512sum ${1}${flavour}.tar.xz | cut -d' ' -f1 )" != "$sha512" ] + then + echo "sha512sum $(sha512sum ${1}${flavour}.tar.xz | cut -d' ' -f1 ) of" + echo "${package}${flavour}.tar.xz doesn't match with $db" + # delete metafile on failure to get generated again on next run, where new $db may be in use + rm $texmf/$1.meta + echo "sha512sum $sha512" + echo "Delete ${db}* to be current again, and try again." + exit 1 + fi +} + +untar () { + # leave if $1 has no content. Therea collections with basically no used package, e.g. texworks + if [ -s "$1" ] + then + while read package + do + # untar all packages, check for relocation, "relocate 1" -> untar in texmf-dist + download $package || exit 1 + # untar the tex package + unset relocated + [ -n "$(grep -w ^"relocated 1" $texmf/$package.meta)" ] && relocated="-C texmf-dist" + tar vxf ${package}${flavour}.tar.xz --exclude tlpkg $relocated || exit 1 + + # if binaries are present, put them in texmf-dist + [ -d bin ] && cp -a bin texmf-dist && rm -rf bin + if [ "$flavour" = ".doc" ] + then + size=$(( $(grep ^doccontainersize $texmf/$package.meta | cut -d' ' -f2 ) / 1024 )) + else + size=$(( $(grep ^containersize $texmf/$package.meta | cut -d' ' -f2 ) / 1024 )) + fi + shortdesc="$(grep ^shortdesc $texmf/$package.meta | cut -d' ' -f2- )" + echo "$size Kb, $package$flavour: $shortdesc" >> $output.meta + #grep ^"execute addMap" $texmf/$package.meta | sed "s/^execute //g" >> $output.updmap.cfg + done < $1 + + # copy packages index to texmf-dist, so included packages are known in later installation + cat $output.meta >> $output.$edition.meta + + # cleanup + [ -f $output.meta ] && rm $output.meta + fi +} + +remove_cruft () { + # Remove m$-stuff, ConTeXt single-user-system stuff, source leftovers and pdf-versions of manpages + rm -rf texmf-dist/source + rm -rf texmf-dist/scripts/context/stubs/source/ + find texmf-dist/ -type d -name 'win32' -exec rm -rf {} + + find texmf-dist/ -type d -name 'win64' -exec rm -rf {} + + find texmf-dist/ -type d -name 'mswin' -exec rm -rf {} + + find texmf-dist/ -type d -name 'win' -exec rm -rf {} + + find texmf-dist/ -type d -name 'setup' -exec rm -rf {} + + find texmf-dist/ -type d -name 'install' -exec rm -rf {} + + find texmf-dist/ -type f -name '*.bat' -delete + find texmf-dist/ -type f -name '*.bat.w95' -delete + find texmf-dist/ -type f -name '*win32*' -delete + find texmf-dist/ -type f -name 'winansi*' -delete + find texmf-dist/ -type f -name '*-man.pdf' -delete + # Remove zero-length files, as these appear e.g. in hyph-utf8 tex-package. + find . -type f -size 0c -delete +} + +texmfget () { + # make sure no package is added more than once. + echo "Preparing index of packages to be added to -${1} ..." + echo "$PACKAGES" | sed "s/[[:space:]]//g;/^$/d" > $collections_tobedone + # Remove outputfile if already present + >$output + >$output_doc + + # Only do something if $collection wasn't already done before + while [ -s $collections_tobedone ] + do + collection=$(tail -n1 $collections_tobedone) + + # continue with next collection if collection was already done + if [ -s "$collections_done" ] + then + grep -w "^${collection}$" $collections_done &> /dev/null + if [ $? = 0 ] + then + # remove from $collections_tobedone + sed -i "/^$collection$/d" $collections_tobedone + if [ -n "$(grep "^${collection} added to" $logfile)" ] + then + echo "$collection already added " >> $logfile + fi + continue + fi + fi + + package_meta $collection || exit 1 + + # Don't handle collections as dependency of other collections, as this destroys control over what packages to be added + # If $collection is a singel package(not a collection-), add it here + if [ -n "$(head -n1 $texmf/$collection.meta | fgrep -v "name collection" )" ] + then + # if package contains only docs, add to docpackages + if [ -z "$(grep ^runfiles $texmf/$collection.meta)" -a -n "$(grep ^docfiles $texmf/$collection.meta)" ] + then + sed -i "/^$collection$/d" $collections_tobedone + echo "$collection" >> $collections_done + echo "$collection" >> $output_doc + echo "$collection added to -docs $1" >> $logfile + continue + fi + # if package contains also docs, add also to docpackages + if [ -n "$(grep ^docfiles $texmf/$collection.meta)" ] + then + echo "$collection" >> $output_doc + echo "$collection added to -docs $1" >> $logfile + fi + echo "$collection" >> $output + echo "$collection added to -$1" >> $logfile + fi + # add dependend packages, but no binary(ARCH) and no packages conataining a '.'. Packges with dot indicate binary/texlive-manager/windows packages + grep ^"depend " $texmf/$collection.meta | grep -v "ARCH$" | grep -v '\.' | cut -d' ' -f2- > $dependencies + if [ -s "$dependencies" ] + then + echo "----------------" >> $logfile + echo "Dependencies of $collection: $(cat $dependencies | tr '\n' ' ')" >> $logfile + for dependency in $(cat $dependencies) + do + if [ -n "$(grep ^"${dependency}"$ $collections_done)" ] + then + sed -i "/^${dependency}$/d" $dependencies + continue + else + for exclude in $global_exclude + do + if [ "$exclude" = "$dependency" ] + then + sed -i "/^${exclude}$/d" $dependencies + echo "$exclude excluded, see \$global_exclude" >> $logfile + fi + done + fi + done + cat $dependencies >> $collections_tobedone + echo "----------------" >> $logfile + fi + + sed -i "/^${collection}$/d" $collections_tobedone + echo "$collection" >> $collections_done + done + # handle package index list per edition + cat $output >> $TMP/packages.$1 + # handle doc package index, one for each edition + cat $output_doc >> $TMP/packages.$1.doc + + # untar only one $edition, untar docs together with -extra/-fonts edition + if [ "$1" = $edition -o docs = $edition ] + then + cd $texmf + + # Cleanup tar-directory + [ -d $texmf/texmf-dist ] && rm -rf $texmf/texmf-dist + mkdir $texmf/texmf-dist + + # Make tarball/checksum reproducible by setting mtime(clamp-mtime), owner, group and sort content + # --clamp-mtime --mtime doesn't work with tar 1.13, when makepkg creates the tarball: + # tar-1.13: time_t value 9223372036854775808 too large (max=68719476735) + case $edition in + base) + unset flavour + untar $output || exit 1 + remove_cruft || exit 1 + tar vrf $tarball --owner=0 --group=0 --sort=name texmf-dist || exit 1 + rm -rf texmf-dist + ;; + extra|fonts) + unset flavour + untar $output || exit 1 + export flavour=".doc" + untar $output_doc || exit 1 + remove_cruft || exit 1 + #tar vrf $tarball --clamp-mtime --mtime --owner=0 --group=0 --sort=name texmf-dist || exit 1 + tar vrf $tarball --owner=0 --group=0 --sort=name texmf-dist || exit 1 + rm -rf texmf-dist + ;; + docs) + export flavour=".doc" + # only add -base docs to -docs + if [ $1 = base ] + then + untar $output_doc || exit 1 + remove_cruft || exit 1 + #tar vrf $tarball --clamp-mtime --mtime --owner=0 --group=0 --sort=name texmf-dist || exit 1 + tar vrf $tarball --owner=0 --group=0 --sort=name texmf-dist || exit 1 + rm -rf texmf-dist + fi + ;; + esac + fi +} + +# Main + +# release mirror +mirror="http://mirror.ctan.org/systems/texlive/tlnet/" +# pre-test mirror 2016 +# mirror="http://ftp.cstug.cz/pub/tex/local/tlpretest/" +LANG=C +TMP=$PWD/tmp +output=$TMP/packages +output_doc=$TMP/packages.doc.tmp +errorlog=$TMP/error.log +texmf=$TMP/texmf +db=$TMP/texlive.tlpdb +tmpfile=$TMP/tmpfile +collections_done=$TMP/done +collections_tobedone=$TMP/tobedone +corepackages=$TMP/corepackages +allcollections=$TMP/allcollections +metafonts=$TMP/metafonts +manpages=$TMP/manpages +dependencies=$TMP/deps +packages_base=$TMP/packages.base +packages_extra=$TMP/packages.extra +packages_fonts=$TMP/packages.fonts +packages_metafont=$TMP/packages.metafont +packages_manpages=$TMP/packages.manpages + +case "$1" in + base|docs|extra|fonts) edition=$1; echo "Building $edition tarball ...";; + *) usage; exit 0 ;; +esac + +mkdir -p $texmf +cd $TMP + +# Set VERSION, get texlive.tlpdb and keep unshorten $db.orig +if [ ! -s ${db}.orig -o ! -s $db ] +then + echo $MAJORVERSION.$(date +%y%m%d) > VERSION + wget -c -O ${db}.orig ${mirror}tlpkg/texlive.tlpdb + # remove most content from $db to be faster on later processing. + # keep dependencies/manpages/metafonts/binfiles/shortdesc/sizes + egrep '^\S|^ RELOC/doc/man|^ texmf-dist/doc/man/man|^ RELOC/doc/info/|^ texmf-dist/doc/info/|^ texmf-dist/fonts/source/public/|^ RELOC/fonts/source/public|^ bin|^$' ${db}.orig | grep -v ^longdesc > $db + + # As $db (might be)/is new, remove the meta-files, might created again with (pontentionally) new content + rm -rf $texmf/*.meta +fi + +# Get linenumbers of empty lines from $db +emptylines="$(grep -n ^$ $db | cut -d':' -f1)" + +# Provide TLCore packages for -base, as these packages(and their dependencies) should be present in any case. +grep -B1 ^'category TLCore' $db | grep -v ^'category TLCore' | grep -v ^-- | grep -v '\.' | cut -d' ' -f2 > $corepackages + +# Make a list of all collections +grep ^"name collection-" $db | cut -d' ' -f2 > $allcollections + +# globally exclude from $corepackages +for exclude in $global_exclude +do + sed -i "/^${exclude}$/d" $corepackages +done + +VERSION=$(cat $TMP/VERSION) +tarball=$TMP/texlive-$edition-$VERSION.tar +# set logfile +logfile=$TMP/$VERSION.log + +# reset some files +>$logfile +>$tarball +>$collections_done +>$metafonts +>$manpages +>$packages_metafont +>$packages_manpages +>$packages_base +>$packages_extra +>$packages_fonts +>$packages_base.doc +>$packages_extra.doc +>$packages_fonts.doc +>$TMP/packages.$edition.meta + +# put the editions base/extra/fonts together +texmf_editions || exit 1 + +# Check if all collections ar part in at least one edition +while read collection +do + grep -w "$collection" $collections_done &> /dev/null + if [ $? != 0 ] + then + echo "Error: $collection was not handled, edit packages/collections inthe texmfget function in $0." | tee -a $logfile + exit 1 + fi +done < $allcollections + +# meta data about added packages +sort -n $output.$edition.meta > $tmpfile +mv $tmpfile $output.$edition.meta + +# cleanup +rm $allcollections +rm $corepackages +rm $collections_done +rm $collections_tobedone +rm $output +rm $output_doc +rm $dependencies + +[ ! -d texmf-dist ] && mkdir texmf-dist +# include all metafonts in base package, plus packages which misses font-mf tag on CTAN +echo "Looking for metafont files to be included in -base ..." +for metafont in $(paste -s $packages_extra $packages_fonts ) +do + if [ -n "$(egrep "(fonts/source/public/)" $texmf/$metafont.meta )" ] + then + # include all metafonts in -base, write index for later exclution from other editions. + package_meta $metafont || exit 1 + echo "Adding metafonts from $metafont to -base" + unset flavour + download $metafont || exit 1 + unset relocated + pathprefix="texmf-dist/" + [ -n "$(grep -w ^"relocated 1" $texmf/$metafont.meta)" ] && relocated="-C texmf-dist" && unset pathprefix + tar vxf $texmf/$metafont.tar.xz $relocated ${pathprefix}fonts/source ${pathprefix}tex/latex 2>/dev/null | sed "s/^fonts/texmf-dist\/fonts/g;s/^tex\//texmf-dist\/tex\//g" >> $metafonts + echo $metafont >> $packages_metafont + fi +done + +# include manpages/GNU infofiles in -base, write index for later exclution from other editions. +# In -extra there should not be any manpage left. +echo "Looking for manpages/GNU infofiles to be included in -base ..." +for package in $(paste -s $packages_metafont $packages_base.doc | sort -u) +do + if [ -n "$(egrep "(doc/man/man|doc/info/)" $texmf/$package.meta )" ] + then + echo "Adding manpage from $package to -base" + flavour=".doc" download $package || exit 1 + unset relocated + pathprefix="texmf-dist/" + [ -n "$(grep -w ^"relocated 1" $texmf/$package.meta)" ] && relocated="-C texmf-dist" && unset pathprefix + tar vxf $texmf/${package}.doc.tar.xz --exclude "*.man[15].pdf" $relocated ${pathprefix}doc/man/ ${pathprefix}doc/info 2>/dev/null | sed "s/^doc/texmf-dist\/doc/g" >> $manpages + echo "$package" >> $packages_manpages + fi +done + +case $edition in + base) + # Content info + cat << EOF | gzip -9 >> $texmf/texmf-dist/packages.$edition.gz +Content of -$edition: +$(sort $packages_base) + +Metafonts from packages: +$(sort $packages_metafont) + +Manpages from packages: +$(sort $packages_manpages) +EOF + + # add manpages/metafonts to the tarball + tar rf $tarball --owner=0 --group=0 --sort=name texmf-dist || exit 1 + # cleanup extracted metafonts/manpages + rm -rf texmf-dist + # handle koma-script docs, the author wants the docs to be shipped along, html doc seems sufficient + tar f $tarball --delete $(tar tf $tarball | grep /doc/.*koma-script.*pdf) + ;; + extra|fonts) + # cleanup extracted metafonts/manpages + rm -rf texmf-dist + echo "Removing manpages/metafonts from -extra/-fonts/-docs which now reside in -base" + tar -f $tarball --delete $(paste $manpages $metafonts) 2>/dev/null + # content info + mkdir texmf-dist + echo "Content of -$edition, including documentation:" > $texmf/texmf-dist/packages.$edition + sort $TMP/packages.$edition >> $texmf/texmf-dist/packages.$edition + gzip -9 $texmf/texmf-dist/packages.$edition + tar rf $tarball --owner=0 --group=0 --sort=name texmf-dist || exit 1 + ;; + docs) + # cleanup extracted metafonts/manpages + rm -rf texmf-dist + echo "Removing manpages/metafonts from -extra/-fonts/-docs which no reside in -base" + tar -f $tarball --delete $(paste $manpages $metafonts) 2>/dev/null + # content info, this edition conains all docs from -base + mkdir texmf-dist + echo "Content of -$edition, documentation for -base:" > $texmf/texmf-dist/packages.$edition + sort $packages_base.doc >> $texmf/texmf-dist/packages.$edition + gzip -9 $texmf/texmf-dist/packages.$edition + tar rf $tarball --owner=0 --group=0 --sort=name texmf-dist || exit 1 + ;; +esac + +# compress the tarball as everything is in place now +echo "Compressing $tarball ..." +[ -f $tarball.xz ] && rm $tarball.xz +xz -9 -T0 $tarball || exit 1 +md5sum $tarball.xz +ls -lh $tarball.xz +echo "Logfile: $logfile" diff --git a/source/t/texlive/slack-desc b/source/t/texlive/slack-desc new file mode 100644 index 00000000..d004be14 --- /dev/null +++ b/source/t/texlive/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. +# Line up the first '|' above the ':' following the base package name, and +# the '|' on the right side marks the last column you can put a character in. +# You must make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':' except on otherwise blank lines. + + |-----handy-ruler------------------------------------------------------| +texlive: texlive (TeX binaries, support files, and formats) +texlive: +texlive: This package contains binaries, support files, TeX formats and +texlive: packages, and other files from the TeXLive TeX distribution. +texlive: Included are input files for TeX, runtime configuration files, +texlive: hyphenation tables, manpages, and the computer modern fonts. +texlive: +texlive: SlackBuilds.org has more texmf files and documentation in the +texlive: texlive-extra, texlive-fonts, and texlive-docs packages. +texlive: +texlive: diff --git a/source/t/texlive/texlive.SlackBuild b/source/t/texlive/texlive.SlackBuild new file mode 100755 index 00000000..f41e9fa6 --- /dev/null +++ b/source/t/texlive/texlive.SlackBuild @@ -0,0 +1,252 @@ +#!/bin/bash + +# TeXLive build script for Slackware + +# Copyright 2009, 2017, 2018 Patrick J. Volkerding, Sebeka, MN, USA +# Copyright 2009-2014 Robby Workman, Northport, AL, USA +# Copyright 2016-2017 Johannes Schoepfer, Germany +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# URL: ftp://tug.org/historic/systems/texlive/ +# Testrelease: ftp://tug.org/texlive/Images/test/ + +cd $(dirname $0) ; CWD=$(pwd) + +PKGNAM=texlive +SOURCEVERSION=${SOURCEVERSION:-20170520} +VERSION=${VERSION:-2017.171108} +BUILD=${BUILD:-6} + +TMP=${TMP:-/tmp} +PKG=$TMP/package-texlive + +if [ -z "$ARCH" ]; then + case "$( uname -m )" in + i?86) ARCH=i586 ;; + arm*) ARCH=arm ;; + *) ARCH=$( uname -m ) ;; + esac +fi + +# If the variable PRINT_PACKAGE_NAME is set, then this script will report what +# the name of the created package would be, and then exit. This information +# could be useful to other scripts. +if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then + echo "$PKGNAM-$VERSION-$ARCH-$BUILD.txz" + exit 0 +fi + +NUMJOBS=${NUMJOBS:-" -j7 "} + +if [ "$ARCH" = "i586" ]; then + SLKCFLAGS="-O2 -march=i586 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +else + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +fi + +# NOTE: Using the system version of poppler will require texlive to be +# recompiled with pretty much every poppler update, as they almost always +# bump the shared library version. But sometimes you do what you have +# to do... +SYSTEMPOPPLER=${SYSTEMPOPPLER:-YES} +if [ "$SYSTEMPOPPLER" = "NO" ]; then + POPPLER="--without-system-poppler --without-system-xpdf" +else + POPPLER="--with-system-poppler --with-system-xpdf" +fi + +rm -rf $PKG +mkdir -p $TMP $PKG +cd $TMP +rm -rf texlive-$SOURCEVERSION-source +tar xvf $CWD/texlive-${SOURCEVERSION}-source.tar.xz || exit 1 +cd texlive-$SOURCEVERSION-source || exit 1 +chown -R root:root . +chmod -R u+w,go-w,a+rX-st . + +export LANG=C +export PATH="$PKG/usr/bin:$PATH" +export LD_LIBRARY_PATH="$PKG/usr/lib${LIBDIRSUFFIX}:$LD_LIBRARY_PATH" + +# set TEXMFROOT and TEXMFLOCAL +sed -i \ + -e 's|^TEXMFROOT.*|TEXMFROOT = $SELFAUTODIR/share|' \ + -e 's|^TEXMFLOCAL.*|TEXMFLOCAL = $TEXMFROOT/texmf-local|' \ + texk/kpathsea/texmf.cnf + +# prevent compiling Xdvi with libXp +sed -i 's|-lXp ||' texk/xdvik/configure + +# Thanks to the lfs-folks ... +patch -Np1 -i $CWD/patches/texlive-20170524-source-gcc7-1.patch || exit 1 +patch -Np1 -i $CWD/patches/texlive-20170524-source-upstream_fixes-2.patch || exit 1 + +# Thanks to archlinux for the poppler-0.59 API fixup patch: +if [ ! "$SYSTEMPOPPLER" = "NO" ]; then + patch -Np1 -i $CWD/patches/texlive-poppler-0.59.patch || exit 1 +fi + +# --with-system-harfbuzz requires graphite2 (and harfbuzz linked to it) +mkdir build +cd build + CFLAGS="$SLKCFLAGS" \ + CXXFLAGS="$SLKCFLAGS -fpermissive" \ + ../configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --with-banner-add=' on Slackware' \ + --disable-native-texlive-build \ + --enable-largefile \ + --enable-shared \ + --disable-static \ + --disable-missing \ + --disable-multiplatform \ + --disable-debug \ + --with-x \ + --enable-xindy \ + --disable-xindy-docs \ + --disable-xindy-rules \ + --with-clisp-runtime=system \ + --enable-gc=system \ + --with-system-zlib \ + --with-system-libpng \ + --with-system-t1lib \ + --with-system-gd \ + --with-system-freetype2 \ + --with-system-libgs \ + --with-system-icu \ + --with-system-pixman \ + --with-system-cairo \ + --with-system-gmp \ + --with-system-mpfr \ + --with-system-fontconfig \ + --with-system-ncurses \ + --without-system-harfbuzz \ + --disable-aleph \ + --disable-dump-share \ + $POPPLER \ + --build=$ARCH-slackware-linux || exit 1 + + make $NUMJOBS || make || exit 1 + # make check || exit 1 + make install-strip DESTDIR=$PKG || exit 1 + + # Don't ship .la files: + rm -f $PKG/usr/lib${LIBDIRSUFFIX}/*.la + + # Remove all files which are covered by tlnet + rm -rf $PKG/usr/share $PKG/usr/man $PKG/usr/info + + # install the tlnet stuff + mkdir -p $PKG/usr/share + tar xvf $CWD/texlive-base-$VERSION.tar.xz -C $PKG/usr/share || exit 1 + chown -R root:root $PKG + chmod -R u+w,go-w,a+rX-st $PKG + + # Create symlinks + make texlinks DESTDIR=$PKG || exit 1 + +cd .. + +# set some paths +sed -i \ + -e 's|^TEXMFROOT.*|TEXMFROOT = $SELFAUTODIR/share|' \ + -e 's|^TEXMFLOCAL.*|TEXMFLOCAL = $TEXMFROOT/texmf-local|' \ + -e 's|^OSFONTDIR.*|OSFONTDIR = ~/.fonts:/usr/share/fonts|' \ + -e 's|texlive20[0-9][0-9]|texlive|g' \ + $PKG/usr/share/texmf-dist/web2c/texmf.cnf + +# disable obsolete aleph/lamed/cslatex/pdfcslatex +sed -i \ + -e 's|^aleph|#! aleph|' \ + -e 's|^lamed|#! lamed|' \ + -e 's|^cslatex|#! cslatex|' \ + -e 's|^pdfcslatex|#! pdfcslatex|' \ + $PKG/usr/share/texmf-dist/web2c/fmtutil.cnf + +# make ConTeXt work, and remove unused settings +sed -i \ + -e 's|selfautoparent:|/usr/share/|g' \ + -e 's|\(TEXMFLOCAL[ ]*=[ ]*\)[^,]*|\1"/usr/share/texmf-local"|' \ + -e 's|texlive20[0-9][0-9]|texlive|g' \ + -e '/selfautodir/d' \ + -e '/texmflocal/d' \ + $PKG/usr/share/texmf-dist/web2c/texmfcnf.lua + +# provide texlive fonts optionally for other system apps +mkdir -p $PKG/etc/fonts/conf.avail +cat > $PKG/etc/fonts/conf.avail/09-texlive.conf << EOF + + + + /usr/share/texmf-dist/fonts/opentype + /usr/share/texmf-dist/fonts/truetype + +EOF + +# Install the docs while we're still here +mkdir -p $PKG/usr/doc/texlive-$VERSION +cp -a ChangeLog README* $PKG/usr/doc/texlive-$VERSION +# Install index of provided tex packages to the docs +mv $PKG/usr/share/texmf-dist/packages.base.gz $PKG/usr/doc/texlive-$VERSION + +# Put a symlink to /usr/share/texmf-dist/doc in our Slackware docdir +ln -s ../../share/texmf-dist/doc $PKG/usr/doc/texlive-$VERSION/doc + +# We won't make tlmgr easily available; it's still there, but +# we'll make it harder to void the warranty :-) +rm -f $PKG/usr/bin/tlmgr +cat $CWD/README.tlpkg > $PKG/usr/doc/texlive-$VERSION/README.tlpkg + +# Create some directories to make it clear that they're owned by this package +mkdir -p $PKG/usr/share/{texmf-config,texmf-var,texmf-local} + +# Add some perl modules, at least one of which is required by updmap +mkdir -p $PKG/usr/share/perl5 +mv texk/tests/TeXLive $PKG/usr/share/perl5/ + +# Move manual pages to the correct place +mkdir $PKG/usr/man +mv $PKG/usr/share/texmf-dist/doc/man/man1 $PKG/usr/man +mv $PKG/usr/share/texmf-dist/doc/man/man5 $PKG/usr/man +rmdir $PKG/usr/share/texmf-dist/doc/man +mv $PKG/usr/share/texmf-dist/doc/info $PKG/usr + +# Handle the man pages +find $PKG/usr/man -type f -exec gzip -9 {} \; +for i in $(find $PKG/usr/man -type l) ; do ln -s $(readlink $i).gz $i.gz ; rm $i ; done + +# Handle the GNU info pages +rm -f $PKG/usr/info/dir +gzip -9 $PKG/usr/info/* + +mkdir -p $PKG/install +zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -p -l y -c n $TMP/$PKGNAM-$VERSION-$ARCH-$BUILD.txz diff --git a/source/t/texlive/texlive.url b/source/t/texlive/texlive.url new file mode 100644 index 00000000..5ff52d66 --- /dev/null +++ b/source/t/texlive/texlive.url @@ -0,0 +1,6 @@ +http://mirrors.ctan.org/systems/texlive/Source/texlive-20170520-source.tar.xz +5456dfd7858fe53cdd0fda5f0eb4fd35 + +http://slackware.schoepfer.info/slackbuilds/texlive/2017/texlive/texlive-base-2017.170622.tar.xz +29bee4e0671431334fc1dcae3e0087c0 + -- cgit v1.2.3