From 73b668742a86c06c84cde2da658b5135367d23fe Mon Sep 17 00:00:00 2001 From: Patrick J Volkerding Date: Thu, 25 May 2023 00:24:33 +0000 Subject: Thu May 25 00:24:33 UTC 2023 patches/packages/curl-8.1.1-x86_64-1_slack15.0.txz: Upgraded. This is a bugfix release. patches/packages/texlive-2023.230322-x86_64-1_slack15.0.txz: Upgraded. This update patches a security issue: LuaTeX before 1.17.0 allows execution of arbitrary shell commands when compiling a TeX file obtained from an untrusted source. This occurs because luatex-core.lua lets the original io.popen be accessed. This also affects TeX Live before 2023 r66984 and MiKTeX before 23.5. Thanks to Johannes Schoepfer. For more information, see: https://www.cve.org/CVERecord?id=CVE-2023-32700 (* Security fix *) --- ChangeLog.rss | 26 +- ChangeLog.txt | 14 + FILELIST.TXT | 244 +-- patches/packages/curl-8.1.0-x86_64-1_slack15.0.txt | 11 - patches/packages/curl-8.1.1-x86_64-1_slack15.0.txt | 11 + .../texlive-2023.230322-x86_64-1_slack15.0.txt | 11 + patches/source/texlive/README.tlpkg | 18 + patches/source/texlive/doinst.sh | 4 + patches/source/texlive/douninst.sh | 4 + .../dump.unused.internal.libraries.from.sources.sh | 17 + patches/source/texlive/prep/README | 2 + patches/source/texlive/prep/excludes.texmf | 21 + patches/source/texlive/prep/packages.texmf | 1334 +++++++++++++ patches/source/texlive/prep/texmf_get.sh | 941 +++++++++ patches/source/texlive/slack-desc | 19 + .../texlive-20230313-source-security_fix-1.patch | 2034 ++++++++++++++++++++ patches/source/texlive/texlive.SlackBuild | 216 +++ patches/source/texlive/texlive.unicode5.0.diff | 24 + patches/source/texlive/texlive.url | 2 + recompress.sh | 3 + 20 files changed, 4831 insertions(+), 125 deletions(-) delete mode 100644 patches/packages/curl-8.1.0-x86_64-1_slack15.0.txt create mode 100644 patches/packages/curl-8.1.1-x86_64-1_slack15.0.txt create mode 100644 patches/packages/texlive-2023.230322-x86_64-1_slack15.0.txt create mode 100644 patches/source/texlive/README.tlpkg create mode 100644 patches/source/texlive/doinst.sh create mode 100644 patches/source/texlive/douninst.sh create mode 100755 patches/source/texlive/dump.unused.internal.libraries.from.sources.sh create mode 100644 patches/source/texlive/prep/README create mode 100644 patches/source/texlive/prep/excludes.texmf create mode 100644 patches/source/texlive/prep/packages.texmf create mode 100644 patches/source/texlive/prep/texmf_get.sh create mode 100644 patches/source/texlive/slack-desc create mode 100644 patches/source/texlive/texlive-20230313-source-security_fix-1.patch create mode 100755 patches/source/texlive/texlive.SlackBuild create mode 100644 patches/source/texlive/texlive.unicode5.0.diff create mode 100644 patches/source/texlive/texlive.url diff --git a/ChangeLog.rss b/ChangeLog.rss index 3fdb0cfbc..b4a4f621c 100644 --- a/ChangeLog.rss +++ b/ChangeLog.rss @@ -11,9 +11,31 @@ Tracking Slackware development in git. en-us urn:uuid:c964f45e-6732-11e8-bbe5-107b4450212f - Mon, 22 May 2023 19:05:02 GMT - Tue, 23 May 2023 11:30:15 GMT + Thu, 25 May 2023 00:24:33 GMT + Thu, 25 May 2023 11:30:18 GMT maintain_current_git.sh v 1.17 + + Thu, 25 May 2023 00:24:33 GMT + Thu, 25 May 2023 00:24:33 GMT + https://git.slackware.nl/current/tag/?h=20230525002433 + 20230525002433 + + +patches/packages/curl-8.1.1-x86_64-1_slack15.0.txz: Upgraded. + This is a bugfix release. +patches/packages/texlive-2023.230322-x86_64-1_slack15.0.txz: Upgraded. + This update patches a security issue: + LuaTeX before 1.17.0 allows execution of arbitrary shell commands when + compiling a TeX file obtained from an untrusted source. This occurs + because luatex-core.lua lets the original io.popen be accessed. This also + affects TeX Live before 2023 r66984 and MiKTeX before 23.5. + Thanks to Johannes Schoepfer. + For more information, see: + https://www.cve.org/CVERecord?id=CVE-2023-32700 + (* Security fix *) + ]]> + + Mon, 22 May 2023 19:05:02 GMT Mon, 22 May 2023 19:05:02 GMT diff --git a/ChangeLog.txt b/ChangeLog.txt index 745192382..ffda12288 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,3 +1,17 @@ +Thu May 25 00:24:33 UTC 2023 +patches/packages/curl-8.1.1-x86_64-1_slack15.0.txz: Upgraded. + This is a bugfix release. +patches/packages/texlive-2023.230322-x86_64-1_slack15.0.txz: Upgraded. + This update patches a security issue: + LuaTeX before 1.17.0 allows execution of arbitrary shell commands when + compiling a TeX file obtained from an untrusted source. This occurs + because luatex-core.lua lets the original io.popen be accessed. This also + affects TeX Live before 2023 r66984 and MiKTeX before 23.5. + Thanks to Johannes Schoepfer. + For more information, see: + https://www.cve.org/CVERecord?id=CVE-2023-32700 + (* Security fix *) ++--------------------------+ Mon May 22 19:05:02 UTC 2023 patches/packages/c-ares-1.19.1-x86_64-1_slack15.0.txz: Upgraded. This update fixes bugs and security issues: diff --git a/FILELIST.TXT b/FILELIST.TXT index 4d677cd7c..965812926 100644 --- a/FILELIST.TXT +++ b/FILELIST.TXT @@ -1,20 +1,20 @@ -Mon May 22 19:07:31 UTC 2023 +Thu May 25 00:32:02 UTC 2023 Here is the file list for this directory. If you are using a mirror site and find missing or extra files in the disk subdirectories, please have the archive administrator refresh the mirror. -drwxr-xr-x 12 root root 4096 2023-05-22 19:05 . +drwxr-xr-x 12 root root 4096 2023-05-25 00:24 . -rw-r--r-- 1 root root 5767 2022-02-02 22:44 ./ANNOUNCE.15.0 -rw-r--r-- 1 root root 16609 2022-03-30 19:03 ./CHANGES_AND_HINTS.TXT --rw-r--r-- 1 root root 1177375 2023-05-19 19:02 ./CHECKSUMS.md5 --rw-r--r-- 1 root root 163 2023-05-19 19:02 ./CHECKSUMS.md5.asc +-rw-r--r-- 1 root root 1177873 2023-05-22 19:07 ./CHECKSUMS.md5 +-rw-r--r-- 1 root root 163 2023-05-22 19:07 ./CHECKSUMS.md5.asc -rw-r--r-- 1 root root 17976 1994-06-10 02:28 ./COPYING -rw-r--r-- 1 root root 35147 2007-06-30 04:21 ./COPYING3 -rw-r--r-- 1 root root 19573 2016-06-23 20:08 ./COPYRIGHT.TXT -rw-r--r-- 1 root root 616 2006-10-02 04:37 ./CRYPTO_NOTICE.TXT --rw-r--r-- 1 root root 2012478 2023-05-22 19:05 ./ChangeLog.txt +-rw-r--r-- 1 root root 2013154 2023-05-25 00:24 ./ChangeLog.txt drwxr-xr-x 3 root root 4096 2013-03-20 22:17 ./EFI drwxr-xr-x 2 root root 4096 2022-02-02 08:21 ./EFI/BOOT -rw-r--r-- 1 root root 1187840 2021-06-15 19:16 ./EFI/BOOT/bootx64.efi @@ -25,7 +25,7 @@ drwxr-xr-x 2 root root 4096 2022-02-02 08:21 ./EFI/BOOT -rwxr-xr-x 1 root root 2504 2019-07-05 18:54 ./EFI/BOOT/make-grub.sh -rw-r--r-- 1 root root 10722 2013-09-21 19:02 ./EFI/BOOT/osdetect.cfg -rw-r--r-- 1 root root 1273 2013-08-12 21:08 ./EFI/BOOT/tools.cfg --rw-r--r-- 1 root root 1535381 2023-05-19 19:01 ./FILELIST.TXT +-rw-r--r-- 1 root root 1536056 2023-05-22 19:07 ./FILELIST.TXT -rw-r--r-- 1 root root 1572 2012-08-29 18:27 ./GPG-KEY -rw-r--r-- 1 root root 864745 2022-02-02 08:25 ./PACKAGES.TXT -rw-r--r-- 1 root root 8034 2022-02-02 03:36 ./README.TXT @@ -738,13 +738,13 @@ drwxr-xr-x 2 root root 4096 2008-05-07 05:21 ./pasture/source/php/pear -rwxr-xr-x 1 root root 9448 2018-05-16 22:38 ./pasture/source/php/php.SlackBuild -rw-r--r-- 1 root root 775 2017-07-07 19:25 ./pasture/source/php/php.ini-development.diff.gz -rw-r--r-- 1 root root 830 2005-12-09 05:18 ./pasture/source/php/slack-desc -drwxr-xr-x 4 root root 4096 2023-05-22 19:07 ./patches --rw-r--r-- 1 root root 71543 2023-05-22 19:07 ./patches/CHECKSUMS.md5 --rw-r--r-- 1 root root 163 2023-05-22 19:07 ./patches/CHECKSUMS.md5.asc --rw-r--r-- 1 root root 96868 2023-05-22 19:07 ./patches/FILE_LIST --rw-r--r-- 1 root root 12033163 2023-05-22 19:07 ./patches/MANIFEST.bz2 --rw-r--r-- 1 root root 52089 2023-05-22 19:07 ./patches/PACKAGES.TXT -drwxr-xr-x 3 root root 20480 2023-05-22 19:07 ./patches/packages +drwxr-xr-x 4 root root 4096 2023-05-25 00:32 ./patches +-rw-r--r-- 1 root root 72906 2023-05-25 00:32 ./patches/CHECKSUMS.md5 +-rw-r--r-- 1 root root 163 2023-05-25 00:32 ./patches/CHECKSUMS.md5.asc +-rw-r--r-- 1 root root 98678 2023-05-25 00:31 ./patches/FILE_LIST +-rw-r--r-- 1 root root 12544725 2023-05-25 00:31 ./patches/MANIFEST.bz2 +-rw-r--r-- 1 root root 52781 2023-05-25 00:32 ./patches/PACKAGES.TXT +drwxr-xr-x 3 root root 20480 2023-05-25 00:31 ./patches/packages -rw-r--r-- 1 root root 327 2022-02-15 05:07 ./patches/packages/aaa_base-15.0-x86_64-4_slack15.0.txt -rw-r--r-- 1 root root 10716 2022-02-15 05:07 ./patches/packages/aaa_base-15.0-x86_64-4_slack15.0.txz -rw-r--r-- 1 root root 163 2022-02-15 05:07 ./patches/packages/aaa_base-15.0-x86_64-4_slack15.0.txz.asc @@ -778,9 +778,9 @@ drwxr-xr-x 3 root root 20480 2023-05-22 19:07 ./patches/packages -rw-r--r-- 1 root root 416 2023-05-19 18:13 ./patches/packages/cups-filters-1.28.17-x86_64-1_slack15.0.txt -rw-r--r-- 1 root root 827024 2023-05-19 18:13 ./patches/packages/cups-filters-1.28.17-x86_64-1_slack15.0.txz -rw-r--r-- 1 root root 163 2023-05-19 18:13 ./patches/packages/cups-filters-1.28.17-x86_64-1_slack15.0.txz.asc --rw-r--r-- 1 root root 552 2023-05-17 16:53 ./patches/packages/curl-8.1.0-x86_64-1_slack15.0.txt --rw-r--r-- 1 root root 1347864 2023-05-17 16:53 ./patches/packages/curl-8.1.0-x86_64-1_slack15.0.txz --rw-r--r-- 1 root root 163 2023-05-17 16:53 ./patches/packages/curl-8.1.0-x86_64-1_slack15.0.txz.asc +-rw-r--r-- 1 root root 552 2023-05-23 16:55 ./patches/packages/curl-8.1.1-x86_64-1_slack15.0.txt +-rw-r--r-- 1 root root 1348832 2023-05-23 16:55 ./patches/packages/curl-8.1.1-x86_64-1_slack15.0.txz +-rw-r--r-- 1 root root 163 2023-05-23 16:55 ./patches/packages/curl-8.1.1-x86_64-1_slack15.0.txz.asc -rw-r--r-- 1 root root 373 2022-02-24 19:12 ./patches/packages/cyrus-sasl-2.1.28-x86_64-1_slack15.0.txt -rw-r--r-- 1 root root 993108 2022-02-24 19:12 ./patches/packages/cyrus-sasl-2.1.28-x86_64-1_slack15.0.txz -rw-r--r-- 1 root root 163 2022-02-24 19:12 ./patches/packages/cyrus-sasl-2.1.28-x86_64-1_slack15.0.txz.asc @@ -950,6 +950,9 @@ drwxr-xr-x 2 root root 4096 2023-02-18 02:05 ./patches/packages/linux-5.15 -rw-r--r-- 1 root root 395 2023-03-24 19:11 ./patches/packages/tar-1.34-x86_64-2_slack15.0.txt -rw-r--r-- 1 root root 850388 2023-03-24 19:11 ./patches/packages/tar-1.34-x86_64-2_slack15.0.txz -rw-r--r-- 1 root root 163 2023-03-24 19:11 ./patches/packages/tar-1.34-x86_64-2_slack15.0.txz.asc +-rw-r--r-- 1 root root 508 2023-05-23 19:35 ./patches/packages/texlive-2023.230322-x86_64-1_slack15.0.txt +-rw-r--r-- 1 root root 68289104 2023-05-23 19:35 ./patches/packages/texlive-2023.230322-x86_64-1_slack15.0.txz +-rw-r--r-- 1 root root 163 2023-05-23 19:35 ./patches/packages/texlive-2023.230322-x86_64-1_slack15.0.txz.asc -rw-r--r-- 1 root root 354 2022-02-15 18:37 ./patches/packages/util-linux-2.37.4-x86_64-1_slack15.0.txt -rw-r--r-- 1 root root 2805300 2022-02-15 18:37 ./patches/packages/util-linux-2.37.4-x86_64-1_slack15.0.txz -rw-r--r-- 1 root root 163 2022-02-15 18:37 ./patches/packages/util-linux-2.37.4-x86_64-1_slack15.0.txz.asc @@ -995,7 +998,7 @@ drwxr-xr-x 2 root root 4096 2023-02-18 02:05 ./patches/packages/linux-5.15 -rw-r--r-- 1 root root 463 2023-04-05 18:16 ./patches/packages/zstd-1.5.5-x86_64-1_slack15.0.txt -rw-r--r-- 1 root root 459652 2023-04-05 18:16 ./patches/packages/zstd-1.5.5-x86_64-1_slack15.0.txz -rw-r--r-- 1 root root 163 2023-04-05 18:16 ./patches/packages/zstd-1.5.5-x86_64-1_slack15.0.txz.asc -drwxr-xr-x 75 root root 4096 2023-05-22 18:04 ./patches/source +drwxr-xr-x 76 root root 4096 2023-05-24 02:18 ./patches/source drwxr-xr-x 2 root root 4096 2022-01-16 05:07 ./patches/source/aaa_base -rw-r--r-- 1 root root 11041 2022-02-15 04:49 ./patches/source/aaa_base/_aaa_base.tar.gz -rwxr-xr-x 1 root root 3894 2022-02-15 05:07 ./patches/source/aaa_base/aaa_base.SlackBuild @@ -1086,9 +1089,9 @@ drwxr-xr-x 2 root root 4096 2023-05-19 18:08 ./patches/source/cups-filters -rw-r--r-- 1 root root 46 2021-06-29 19:51 ./patches/source/cups/cups.url -rw-r--r-- 1 root root 454 2021-04-26 18:11 ./patches/source/cups/doinst.sh.gz -rw-r--r-- 1 root root 1094 2018-11-29 19:15 ./patches/source/cups/slack-desc -drwxr-xr-x 2 root root 4096 2023-05-17 16:51 ./patches/source/curl --rw-r--r-- 1 root root 2612568 2023-05-17 06:09 ./patches/source/curl/curl-8.1.0.tar.xz --rw-r--r-- 1 root root 488 2023-05-17 06:09 ./patches/source/curl/curl-8.1.0.tar.xz.asc +drwxr-xr-x 2 root root 4096 2023-05-23 16:54 ./patches/source/curl +-rw-r--r-- 1 root root 2613348 2023-05-23 06:14 ./patches/source/curl/curl-8.1.1.tar.xz +-rw-r--r-- 1 root root 488 2023-05-23 06:14 ./patches/source/curl/curl-8.1.1.tar.xz.asc -rwxr-xr-x 1 root root 4861 2022-04-27 18:34 ./patches/source/curl/curl.SlackBuild -rw-r--r-- 1 root root 30 2018-04-20 16:49 ./patches/source/curl/curl.url -rw-r--r-- 1 root root 1004 2019-02-06 21:57 ./patches/source/curl/slack-desc @@ -1627,6 +1630,23 @@ drwxr-xr-x 2 root root 4096 2023-03-24 19:04 ./patches/source/tar -rw-r--r-- 1 root root 181 2021-02-13 11:33 ./patches/source/tar/tar-1.34.tar.xz.sig -rwxr-xr-x 1 root root 5465 2023-03-24 19:04 ./patches/source/tar/tar.SlackBuild -rw-r--r-- 1 root root 564 2018-09-06 21:52 ./patches/source/tar/tar.nolonezero.diff.gz +drwxr-xr-x 3 root root 4096 2023-05-23 19:26 ./patches/source/texlive +-rw-r--r-- 1 root root 773 2017-05-22 17:37 ./patches/source/texlive/README.tlpkg +-rw-r--r-- 1 root root 137 2023-03-21 11:44 ./patches/source/texlive/doinst.sh.gz +-rw-r--r-- 1 root root 135 2023-03-22 12:55 ./patches/source/texlive/douninst.sh +-rwxr-xr-x 1 root root 893 2023-03-21 17:45 ./patches/source/texlive/dump.unused.internal.libraries.from.sources.sh +drwxr-xr-x 2 root root 4096 2023-03-22 07:06 ./patches/source/texlive/prep +-rw-r--r-- 1 root root 109 2017-09-29 05:12 ./patches/source/texlive/prep/README +-rw-r--r-- 1 root root 523 2022-05-21 17:43 ./patches/source/texlive/prep/excludes.texmf +-rw-r--r-- 1 root root 14014 2023-03-22 06:35 ./patches/source/texlive/prep/packages.texmf +-rw-r--r-- 1 root root 32992 2023-03-22 06:53 ./patches/source/texlive/prep/texmf_get.sh +-rw-r--r-- 1 root root 996 2018-08-22 16:53 ./patches/source/texlive/slack-desc +-rw-r--r-- 1 root root 28288604 2023-03-11 18:14 ./patches/source/texlive/texlive-20230311-source.tar.xz +-rw-r--r-- 1 root root 19770 2023-05-22 19:22 ./patches/source/texlive/texlive-20230313-source-security_fix-1.patch.gz +-rw-r--r-- 1 root root 58399144 2023-03-22 07:17 ./patches/source/texlive/texlive-base-230322.tar.xz +-rwxr-xr-x 1 root root 6995 2023-05-23 19:28 ./patches/source/texlive/texlive.SlackBuild +-rw-r--r-- 1 root root 334 2023-05-23 19:26 ./patches/source/texlive/texlive.unicode5.0.diff.gz +-rw-r--r-- 1 root root 150 2023-03-22 07:44 ./patches/source/texlive/texlive.url drwxr-xr-x 4 root root 4096 2022-02-15 02:04 ./patches/source/util-linux -rw-r--r-- 1 root root 53236 2011-07-12 20:47 ./patches/source/util-linux/adjtimex_1.29-2.2.diff.gz -rw-r--r-- 1 root root 85551 2010-04-17 03:32 ./patches/source/util-linux/adjtimex_1.29.orig.tar.gz @@ -2733,26 +2753,26 @@ drwxr-xr-x 2 root root 69632 2022-02-01 08:29 ./slackware64/kde -rw-r--r-- 1 root root 308 2022-01-06 22:02 ./slackware64/kde/baloo-widgets-21.12.1-x86_64-1.txt -rw-r--r-- 1 root root 114040 2022-01-06 22:02 ./slackware64/kde/baloo-widgets-21.12.1-x86_64-1.txz -rw-r--r-- 1 root root 163 2022-01-06 22:02 ./slackware64/kde/baloo-widgets-21.12.1-x86_64-1.txz.asc --rw-r--r-- 1 root root 181 2022-01-06 22:39 ./slackware64/kde/blinken-21.12.1-x86_64-1.txt --rw-r--r-- 1 root root 2412052 2022-01-06 22:39 ./slackware64/kde/blinken-21.12.1-x86_64-1.txz --rw-r--r-- 1 root root 163 2022-01-06 22:39 ./slackware64/kde/blinken-21.12.1-x86_64-1.txz.asc --rw-r--r-- 1 root root 234 2022-01-04 21:49 ./slackware64/kde/bluedevil-5.23.5-x86_64-1.txt --rw-r--r-- 1 root root 293380 2022-01-04 21:49 ./slackware64/kde/bluedevil-5.23.5-x86_64-1.txz --rw-r--r-- 1 root root 163 2022-01-04 21:49 ./slackware64/kde/bluedevil-5.23.5-x86_64-1.txz.asc --rw-r--r-- 1 root root 439 2022-01-08 22:27 ./slackware64/kde/bluez-qt-5.90.0-x86_64-1.txt --rw-r--r-- 1 root root 249008 2022-01-08 22:27 ./slackware64/kde/bluez-qt-5.90.0-x86_64-1.txz --rw-r--r-- 1 root root 163 2022-01-08 22:27 ./slackware64/kde/bluez-qt-5.90.0-x86_64-1.txz.asc --rw-r--r-- 1 root root 426 2022-01-06 22:30 ./slackware64/kde/bomber-21.12.1-x86_64-1.txt --rw-r--r-- 1 root root 886364 2022-01-06 22:30 ./slackware64/kde/bomber-21.12.1-x86_64-1.txz --rw-r--r-- 1 root root 163 2022-01-06 22:30 ./slackware64/kde/bomber-21.12.1-x86_64-1.txz.asc --rw-r--r-- 1 root root 331 2022-01-06 22:29 ./slackware64/kde/bovo-21.12.1-x86_64-1.txt --rw-r--r-- 1 root root 297460 2022-01-06 22:29 ./slackware64/kde/bovo-21.12.1-x86_64-1.txz --rw-r--r-- 1 root root 163 2022-01-06 22:29 ./slackware64/kde/bovo-21.12.1-x86_64-1.txz.asc --rw-r--r-- 1 root root 195 2022-01-04 21:34 ./slackware64/kde/breeze-5.23.5-x86_64-1.txt --rw-r--r-- 1 root root 71737464 2022-01-04 21:34 ./slackware64/kde/breeze-5.23.5-x86_64-1.txz --rw-r--r-- 1 root root 163 2022-01-04 21:34 ./slackware64/kde/breeze-5.23.5-x86_64-1.txz.asc --rw-r--r-- 1 root root 202 2022-01-04 21:34 ./slackware64/kde/breeze-grub-5.23.5-x86_64-1.txt --rw-r--r-- 1 root root 3140496 2022-01-04 21:34 ./slackware64/kde/breeze-grub-5.23.5-x86_64-1.txz +-rw-r--r-- 1 root root 181 2022-01-06 22:39 ./slackware64/kde/blinken-21.12.1-x86_64-1.txt +-rw-r--r-- 1 root root 2412052 2022-01-06 22:39 ./slackware64/kde/blinken-21.12.1-x86_64-1.txz +-rw-r--r-- 1 root root 163 2022-01-06 22:39 ./slackware64/kde/blinken-21.12.1-x86_64-1.txz.asc +-rw-r--r-- 1 root root 234 2022-01-04 21:49 ./slackware64/kde/bluedevil-5.23.5-x86_64-1.txt +-rw-r--r-- 1 root root 293380 2022-01-04 21:49 ./slackware64/kde/bluedevil-5.23.5-x86_64-1.txz +-rw-r--r-- 1 root root 163 2022-01-04 21:49 ./slackware64/kde/bluedevil-5.23.5-x86_64-1.txz.asc +-rw-r--r-- 1 root root 439 2022-01-08 22:27 ./slackware64/kde/bluez-qt-5.90.0-x86_64-1.txt +-rw-r--r-- 1 root root 249008 2022-01-08 22:27 ./slackware64/kde/bluez-qt-5.90.0-x86_64-1.txz +-rw-r--r-- 1 root root 163 2022-01-08 22:27 ./slackware64/kde/bluez-qt-5.90.0-x86_64-1.txz.asc +-rw-r--r-- 1 root root 426 2022-01-06 22:30 ./slackware64/kde/bomber-21.12.1-x86_64-1.txt +-rw-r--r-- 1 root root 886364 2022-01-06 22:30 ./slackware64/kde/bomber-21.12.1-x86_64-1.txz +-rw-r--r-- 1 root root 163 2022-01-06 22:30 ./slackware64/kde/bomber-21.12.1-x86_64-1.txz.asc +-rw-r--r-- 1 root root 331 2022-01-06 22:29 ./slackware64/kde/bovo-21.12.1-x86_64-1.txt +-rw-r--r-- 1 root root 297460 2022-01-06 22:29 ./slackware64/kde/bovo-21.12.1-x86_64-1.txz +-rw-r--r-- 1 root root 163 2022-01-06 22:29 ./slackware64/kde/bovo-21.12.1-x86_64-1.txz.asc +-rw-r--r-- 1 root root 195 2022-01-04 21:34 ./slackware64/kde/breeze-5.23.5-x86_64-1.txt +-rw-r--r-- 1 root root 71737464 2022-01-04 21:34 ./slackware64/kde/breeze-5.23.5-x86_64-1.txz +-rw-r--r-- 1 root root 163 2022-01-04 21:34 ./slackware64/kde/breeze-5.23.5-x86_64-1.txz.asc +-rw-r--r-- 1 root root 202 2022-01-04 21:34 ./slackware64/kde/breeze-grub-5.23.5-x86_64-1.txt +-rw-r--r-- 1 root root 3140496 2022-01-04 21:34 ./slackware64/kde/breeze-grub-5.23.5-x86_64-1.txz -rw-r--r-- 1 root root 163 2022-01-04 21:34 ./slackware64/kde/breeze-grub-5.23.5-x86_64-1.txz.asc -rw-r--r-- 1 root root 218 2022-01-04 21:34 ./slackware64/kde/breeze-gtk-5.23.5-x86_64-1.txt -rw-r--r-- 1 root root 182972 2022-01-04 21:34 ./slackware64/kde/breeze-gtk-5.23.5-x86_64-1.txz @@ -5470,26 +5490,26 @@ drwxr-xr-x 2 root root 65536 2022-02-01 04:47 ./slackware64/x -rw-r--r-- 1 root root 7968 2021-04-17 18:28 ./slackware64/x/eglexternalplatform-1.1-x86_64-1.txz -rw-r--r-- 1 root root 163 2021-04-17 18:28 ./slackware64/x/eglexternalplatform-1.1-x86_64-1.txz.asc -rw-r--r-- 1 root root 330 2021-02-13 13:18 ./slackware64/x/encodings-1.0.5-noarch-3.txt --rw-r--r-- 1 root root 581184 2021-02-13 13:18 ./slackware64/x/encodings-1.0.5-noarch-3.txz --rw-r--r-- 1 root root 163 2021-02-13 13:18 ./slackware64/x/encodings-1.0.5-noarch-3.txz.asc --rw-r--r-- 1 root root 501 2021-02-13 12:46 ./slackware64/x/fcitx-4.2.9.8-x86_64-3.txt --rw-r--r-- 1 root root 7256024 2021-02-13 12:46 ./slackware64/x/fcitx-4.2.9.8-x86_64-3.txz --rw-r--r-- 1 root root 163 2021-02-13 12:46 ./slackware64/x/fcitx-4.2.9.8-x86_64-3.txz.asc --rw-r--r-- 1 root root 235 2021-04-06 18:34 ./slackware64/x/fcitx-anthy-0.2.4-x86_64-1.txt --rw-r--r-- 1 root root 127552 2021-04-06 18:34 ./slackware64/x/fcitx-anthy-0.2.4-x86_64-1.txz --rw-r--r-- 1 root root 163 2021-04-06 18:34 ./slackware64/x/fcitx-anthy-0.2.4-x86_64-1.txz.asc --rw-r--r-- 1 root root 354 2021-02-13 12:44 ./slackware64/x/fcitx-configtool-0.4.10-x86_64-3.txt --rw-r--r-- 1 root root 46344 2021-02-13 12:44 ./slackware64/x/fcitx-configtool-0.4.10-x86_64-3.txz --rw-r--r-- 1 root root 163 2021-02-13 12:44 ./slackware64/x/fcitx-configtool-0.4.10-x86_64-3.txz.asc --rw-r--r-- 1 root root 248 2021-02-13 12:44 ./slackware64/x/fcitx-hangul-0.3.1-x86_64-3.txt --rw-r--r-- 1 root root 26676 2021-02-13 12:44 ./slackware64/x/fcitx-hangul-0.3.1-x86_64-3.txz --rw-r--r-- 1 root root 163 2021-02-13 12:44 ./slackware64/x/fcitx-hangul-0.3.1-x86_64-3.txz.asc --rw-r--r-- 1 root root 304 2021-02-13 12:44 ./slackware64/x/fcitx-kkc-0.1.4-x86_64-3.txt --rw-r--r-- 1 root root 62688 2021-02-13 12:44 ./slackware64/x/fcitx-kkc-0.1.4-x86_64-3.txz --rw-r--r-- 1 root root 163 2021-02-13 12:44 ./slackware64/x/fcitx-kkc-0.1.4-x86_64-3.txz.asc --rw-r--r-- 1 root root 304 2021-02-13 12:45 ./slackware64/x/fcitx-libpinyin-0.5.4-x86_64-2.txt --rw-r--r-- 1 root root 9915684 2021-02-13 12:45 ./slackware64/x/fcitx-libpinyin-0.5.4-x86_64-2.txz --rw-r--r-- 1 root root 163 2021-02-13 12:45 ./slackware64/x/fcitx-libpinyin-0.5.4-x86_64-2.txz.asc +-rw-r--r-- 1 root root 581184 2021-02-13 13:18 ./slackware64/x/encodings-1.0.5-noarch-3.txz +-rw-r--r-- 1 root root 163 2021-02-13 13:18 ./slackware64/x/encodings-1.0.5-noarch-3.txz.asc +-rw-r--r-- 1 root root 501 2021-02-13 12:46 ./slackware64/x/fcitx-4.2.9.8-x86_64-3.txt +-rw-r--r-- 1 root root 7256024 2021-02-13 12:46 ./slackware64/x/fcitx-4.2.9.8-x86_64-3.txz +-rw-r--r-- 1 root root 163 2021-02-13 12:46 ./slackware64/x/fcitx-4.2.9.8-x86_64-3.txz.asc +-rw-r--r-- 1 root root 235 2021-04-06 18:34 ./slackware64/x/fcitx-anthy-0.2.4-x86_64-1.txt +-rw-r--r-- 1 root root 127552 2021-04-06 18:34 ./slackware64/x/fcitx-anthy-0.2.4-x86_64-1.txz +-rw-r--r-- 1 root root 163 2021-04-06 18:34 ./slackware64/x/fcitx-anthy-0.2.4-x86_64-1.txz.asc +-rw-r--r-- 1 root root 354 2021-02-13 12:44 ./slackware64/x/fcitx-configtool-0.4.10-x86_64-3.txt +-rw-r--r-- 1 root root 46344 2021-02-13 12:44 ./slackware64/x/fcitx-configtool-0.4.10-x86_64-3.txz +-rw-r--r-- 1 root root 163 2021-02-13 12:44 ./slackware64/x/fcitx-configtool-0.4.10-x86_64-3.txz.asc +-rw-r--r-- 1 root root 248 2021-02-13 12:44 ./slackware64/x/fcitx-hangul-0.3.1-x86_64-3.txt +-rw-r--r-- 1 root root 26676 2021-02-13 12:44 ./slackware64/x/fcitx-hangul-0.3.1-x86_64-3.txz +-rw-r--r-- 1 root root 163 2021-02-13 12:44 ./slackware64/x/fcitx-hangul-0.3.1-x86_64-3.txz.asc +-rw-r--r-- 1 root root 304 2021-02-13 12:44 ./slackware64/x/fcitx-kkc-0.1.4-x86_64-3.txt +-rw-r--r-- 1 root root 62688 2021-02-13 12:44 ./slackware64/x/fcitx-kkc-0.1.4-x86_64-3.txz +-rw-r--r-- 1 root root 163 2021-02-13 12:44 ./slackware64/x/fcitx-kkc-0.1.4-x86_64-3.txz.asc +-rw-r--r-- 1 root root 304 2021-02-13 12:45 ./slackware64/x/fcitx-libpinyin-0.5.4-x86_64-2.txt +-rw-r--r-- 1 root root 9915684 2021-02-13 12:45 ./slackware64/x/fcitx-libpinyin-0.5.4-x86_64-2.txz +-rw-r--r-- 1 root root 163 2021-02-13 12:45 ./slackware64/x/fcitx-libpinyin-0.5.4-x86_64-2.txz.asc -rw-r--r-- 1 root root 266 2021-02-13 12:45 ./slackware64/x/fcitx-m17n-0.2.4-x86_64-3.txt -rw-r--r-- 1 root root 28156 2021-02-13 12:45 ./slackware64/x/fcitx-m17n-0.2.4-x86_64-3.txz -rw-r--r-- 1 root root 163 2021-02-13 12:45 ./slackware64/x/fcitx-m17n-0.2.4-x86_64-3.txz.asc @@ -8597,36 +8617,36 @@ drwxr-xr-x 2 root root 4096 2022-01-06 01:36 ./source/d/mercurial -rw-r--r-- 1 root root 4764161 2022-01-05 17:23 ./source/d/mercurial/mercurial-6.0.1.tar.lz -rwxr-xr-x 1 root root 4114 2021-11-23 19:08 ./source/d/mercurial/mercurial.SlackBuild -rw-r--r-- 1 root root 38 2017-12-02 19:13 ./source/d/mercurial/mercurial.url --rw-r--r-- 1 root root 1245 2018-02-27 06:13 ./source/d/mercurial/slack-desc -drwxr-xr-x 2 root root 4096 2021-11-03 00:39 ./source/d/meson --rw-r--r-- 1 root root 756 2021-05-11 18:50 ./source/d/meson/39bb5e07eab736b525abfc66eb5ad0dd626aedc6.patch.gz --rw-r--r-- 1 root root 3439483 2021-10-28 09:00 ./source/d/meson/meson-0.59.4.tar.lz --rwxr-xr-x 1 root root 3004 2021-11-03 00:39 ./source/d/meson/meson.SlackBuild --rw-r--r-- 1 root root 185 2021-05-11 18:55 ./source/d/meson/meson.import.copy.diff.gz --rw-r--r-- 1 root root 36 2018-11-09 03:24 ./source/d/meson/meson.url --rw-r--r-- 1 root root 895 2018-02-27 06:13 ./source/d/meson/slack-desc -drwxr-xr-x 2 root root 4096 2021-02-13 05:31 ./source/d/nasm --rw-r--r-- 1 root root 995732 2020-08-28 16:04 ./source/d/nasm/nasm-2.15.05.tar.xz --rwxr-xr-x 1 root root 3182 2021-02-13 05:31 ./source/d/nasm/nasm.SlackBuild --rw-r--r-- 1 root root 791 2018-02-27 06:13 ./source/d/nasm/slack-desc -drwxr-xr-x 2 root root 4096 2021-02-13 05:31 ./source/d/ninja --rw-r--r-- 1 root root 170607 2020-11-28 11:27 ./source/d/ninja/ninja-1.10.2.tar.lz --rwxr-xr-x 1 root root 4463 2021-02-13 05:31 ./source/d/ninja/ninja.SlackBuild --rw-r--r-- 1 root root 37 2020-08-19 02:05 ./source/d/ninja/ninja.url --rw-r--r-- 1 root root 889 2018-02-27 06:13 ./source/d/ninja/slack-desc -drwxr-xr-x 2 root root 4096 2021-06-14 12:23 ./source/d/opencl-headers --rw-r--r-- 1 root root 45288 2021-06-14 12:08 ./source/d/opencl-headers/OpenCL-Headers-2021.04.29.tar.lz --rwxr-xr-x 1 root root 2553 2021-06-15 18:58 ./source/d/opencl-headers/opencl-headers.SlackBuild --rw-r--r-- 1 root root 56 2021-06-14 12:16 ./source/d/opencl-headers/opencl-headers.url --rw-r--r-- 1 root root 811 2021-06-15 18:56 ./source/d/opencl-headers/slack-desc -drwxr-xr-x 2 root root 4096 2021-02-13 05:31 ./source/d/oprofile --rw-r--r-- 1 root root 896753 2020-07-20 15:35 ./source/d/oprofile/oprofile-1.4.0.tar.lz --rwxr-xr-x 1 root root 4462 2021-08-28 19:45 ./source/d/oprofile/oprofile.SlackBuild --rw-r--r-- 1 root root 1002 2018-02-27 06:13 ./source/d/oprofile/slack-desc -drwxr-xr-x 2 root root 4096 2021-02-13 05:31 ./source/d/p2c --rw-r--r-- 1 root root 304657 2016-01-04 23:03 ./source/d/p2c/p2c-2.01.tar.lz --rwxr-xr-x 1 root root 5093 2021-02-13 05:31 ./source/d/p2c/p2c.SlackBuild --rw-r--r-- 1 root root 50 2019-02-21 19:17 ./source/d/p2c/p2c.url +-rw-r--r-- 1 root root 1245 2018-02-27 06:13 ./source/d/mercurial/slack-desc +drwxr-xr-x 2 root root 4096 2021-11-03 00:39 ./source/d/meson +-rw-r--r-- 1 root root 756 2021-05-11 18:50 ./source/d/meson/39bb5e07eab736b525abfc66eb5ad0dd626aedc6.patch.gz +-rw-r--r-- 1 root root 3439483 2021-10-28 09:00 ./source/d/meson/meson-0.59.4.tar.lz +-rwxr-xr-x 1 root root 3004 2021-11-03 00:39 ./source/d/meson/meson.SlackBuild +-rw-r--r-- 1 root root 185 2021-05-11 18:55 ./source/d/meson/meson.import.copy.diff.gz +-rw-r--r-- 1 root root 36 2018-11-09 03:24 ./source/d/meson/meson.url +-rw-r--r-- 1 root root 895 2018-02-27 06:13 ./source/d/meson/slack-desc +drwxr-xr-x 2 root root 4096 2021-02-13 05:31 ./source/d/nasm +-rw-r--r-- 1 root root 995732 2020-08-28 16:04 ./source/d/nasm/nasm-2.15.05.tar.xz +-rwxr-xr-x 1 root root 3182 2021-02-13 05:31 ./source/d/nasm/nasm.SlackBuild +-rw-r--r-- 1 root root 791 2018-02-27 06:13 ./source/d/nasm/slack-desc +drwxr-xr-x 2 root root 4096 2021-02-13 05:31 ./source/d/ninja +-rw-r--r-- 1 root root 170607 2020-11-28 11:27 ./source/d/ninja/ninja-1.10.2.tar.lz +-rwxr-xr-x 1 root root 4463 2021-02-13 05:31 ./source/d/ninja/ninja.SlackBuild +-rw-r--r-- 1 root root 37 2020-08-19 02:05 ./source/d/ninja/ninja.url +-rw-r--r-- 1 root root 889 2018-02-27 06:13 ./source/d/ninja/slack-desc +drwxr-xr-x 2 root root 4096 2021-06-14 12:23 ./source/d/opencl-headers +-rw-r--r-- 1 root root 45288 2021-06-14 12:08 ./source/d/opencl-headers/OpenCL-Headers-2021.04.29.tar.lz +-rwxr-xr-x 1 root root 2553 2021-06-15 18:58 ./source/d/opencl-headers/opencl-headers.SlackBuild +-rw-r--r-- 1 root root 56 2021-06-14 12:16 ./source/d/opencl-headers/opencl-headers.url +-rw-r--r-- 1 root root 811 2021-06-15 18:56 ./source/d/opencl-headers/slack-desc +drwxr-xr-x 2 root root 4096 2021-02-13 05:31 ./source/d/oprofile +-rw-r--r-- 1 root root 896753 2020-07-20 15:35 ./source/d/oprofile/oprofile-1.4.0.tar.lz +-rwxr-xr-x 1 root root 4462 2021-08-28 19:45 ./source/d/oprofile/oprofile.SlackBuild +-rw-r--r-- 1 root root 1002 2018-02-27 06:13 ./source/d/oprofile/slack-desc +drwxr-xr-x 2 root root 4096 2021-02-13 05:31 ./source/d/p2c +-rw-r--r-- 1 root root 304657 2016-01-04 23:03 ./source/d/p2c/p2c-2.01.tar.lz +-rwxr-xr-x 1 root root 5093 2021-02-13 05:31 ./source/d/p2c/p2c.SlackBuild +-rw-r--r-- 1 root root 50 2019-02-21 19:17 ./source/d/p2c/p2c.url -rw-r--r-- 1 root root 994 2018-02-27 06:13 ./source/d/p2c/slack-desc drwxr-xr-x 2 root root 4096 2022-01-23 01:07 ./source/d/parallel -rw-r--r-- 1 root root 1794754 2022-01-22 15:49 ./source/d/parallel/parallel-20220122.tar.lz @@ -15029,28 +15049,28 @@ drwxr-xr-x 2 root root 12288 2020-05-18 17:50 ./source/x/x11/slack-desc -rw-r--r-- 1 root root 822 2012-04-08 02:11 ./source/x/x11/slack-desc/font-bh-ttf -rw-r--r-- 1 root root 850 2012-04-08 02:12 ./source/x/x11/slack-desc/font-bh-type1 -rw-r--r-- 1 root root 960 2012-04-08 02:13 ./source/x/x11/slack-desc/font-bitstream-100dpi --rw-r--r-- 1 root root 946 2012-04-08 02:13 ./source/x/x11/slack-desc/font-bitstream-75dpi --rw-r--r-- 1 root root 962 2012-04-08 02:13 ./source/x/x11/slack-desc/font-bitstream-speedo --rw-r--r-- 1 root root 948 2012-04-08 02:14 ./source/x/x11/slack-desc/font-bitstream-type1 --rw-r--r-- 1 root root 946 2012-04-08 02:15 ./source/x/x11/slack-desc/font-cronyx-cyrillic --rw-r--r-- 1 root root 890 2012-04-08 02:15 ./source/x/x11/slack-desc/font-cursor-misc --rw-r--r-- 1 root root 890 2012-04-08 02:15 ./source/x/x11/slack-desc/font-daewoo-misc --rw-r--r-- 1 root root 848 2012-04-08 02:15 ./source/x/x11/slack-desc/font-dec-misc --rw-r--r-- 1 root root 864 2012-04-08 02:16 ./source/x/x11/slack-desc/font-ibm-type1 --rw-r--r-- 1 root root 862 2012-04-08 02:17 ./source/x/x11/slack-desc/font-isas-misc --rw-r--r-- 1 root root 848 2012-04-08 02:17 ./source/x/x11/slack-desc/font-jis-misc --rw-r--r-- 1 root root 876 2012-04-08 02:17 ./source/x/x11/slack-desc/font-micro-misc --rw-r--r-- 1 root root 918 2012-04-08 02:17 ./source/x/x11/slack-desc/font-misc-cyrillic --rw-r--r-- 1 root root 918 2012-04-08 02:17 ./source/x/x11/slack-desc/font-misc-ethiopic --rw-r--r-- 1 root root 890 2012-04-08 02:17 ./source/x/x11/slack-desc/font-misc-meltho --rw-r--r-- 1 root root 862 2012-04-08 02:17 ./source/x/x11/slack-desc/font-misc-misc --rw-r--r-- 1 root root 862 2012-04-08 02:17 ./source/x/x11/slack-desc/font-mutt-misc --rw-r--r-- 1 root root 946 2012-04-08 02:17 ./source/x/x11/slack-desc/font-schumacher-misc --rw-r--r-- 1 root root 946 2012-04-08 02:18 ./source/x/x11/slack-desc/font-screen-cyrillic --rw-r--r-- 1 root root 862 2012-04-08 02:17 ./source/x/x11/slack-desc/font-sony-misc --rw-r--r-- 1 root root 848 2012-04-08 02:18 ./source/x/x11/slack-desc/font-sun-misc --rw-r--r-- 1 root root 822 2012-04-08 02:18 ./source/x/x11/slack-desc/font-util --rw-r--r-- 1 root root 974 2012-04-08 02:19 ./source/x/x11/slack-desc/font-winitzki-cyrillic +-rw-r--r-- 1 root root 946 2012-04-08 02:13 ./source/x/x11/slack-desc/font-bitstream-75dpi +-rw-r--r-- 1 root root 962 2012-04-08 02:13 ./source/x/x11/slack-desc/font-bitstream-speedo +-rw-r--r-- 1 root root 948 2012-04-08 02:14 ./source/x/x11/slack-desc/font-bitstream-type1 +-rw-r--r-- 1 root root 946 2012-04-08 02:15 ./source/x/x11/slack-desc/font-cronyx-cyrillic +-rw-r--r-- 1 root root 890 2012-04-08 02:15 ./source/x/x11/slack-desc/font-cursor-misc +-rw-r--r-- 1 root root 890 2012-04-08 02:15 ./source/x/x11/slack-desc/font-daewoo-misc +-rw-r--r-- 1 root root 848 2012-04-08 02:15 ./source/x/x11/slack-desc/font-dec-misc +-rw-r--r-- 1 root root 864 2012-04-08 02:16 ./source/x/x11/slack-desc/font-ibm-type1 +-rw-r--r-- 1 root root 862 2012-04-08 02:17 ./source/x/x11/slack-desc/font-isas-misc +-rw-r--r-- 1 root root 848 2012-04-08 02:17 ./source/x/x11/slack-desc/font-jis-misc +-rw-r--r-- 1 root root 876 2012-04-08 02:17 ./source/x/x11/slack-desc/font-micro-misc +-rw-r--r-- 1 root root 918 2012-04-08 02:17 ./source/x/x11/slack-desc/font-misc-cyrillic +-rw-r--r-- 1 root root 918 2012-04-08 02:17 ./source/x/x11/slack-desc/font-misc-ethiopic +-rw-r--r-- 1 root root 890 2012-04-08 02:17 ./source/x/x11/slack-desc/font-misc-meltho +-rw-r--r-- 1 root root 862 2012-04-08 02:17 ./source/x/x11/slack-desc/font-misc-misc +-rw-r--r-- 1 root root 862 2012-04-08 02:17 ./source/x/x11/slack-desc/font-mutt-misc +-rw-r--r-- 1 root root 946 2012-04-08 02:17 ./source/x/x11/slack-desc/font-schumacher-misc +-rw-r--r-- 1 root root 946 2012-04-08 02:18 ./source/x/x11/slack-desc/font-screen-cyrillic +-rw-r--r-- 1 root root 862 2012-04-08 02:17 ./source/x/x11/slack-desc/font-sony-misc +-rw-r--r-- 1 root root 848 2012-04-08 02:18 ./source/x/x11/slack-desc/font-sun-misc +-rw-r--r-- 1 root root 822 2012-04-08 02:18 ./source/x/x11/slack-desc/font-util +-rw-r--r-- 1 root root 974 2012-04-08 02:19 ./source/x/x11/slack-desc/font-winitzki-cyrillic -rw-r--r-- 1 root root 920 2012-04-08 02:20 ./source/x/x11/slack-desc/font-xfree86-type1 -rw-r--r-- 1 root root 883 2012-04-08 02:20 ./source/x/x11/slack-desc/fontcacheproto -rw-r--r-- 1 root root 824 2012-04-08 02:20 ./source/x/x11/slack-desc/fontsproto diff --git a/patches/packages/curl-8.1.0-x86_64-1_slack15.0.txt b/patches/packages/curl-8.1.0-x86_64-1_slack15.0.txt deleted file mode 100644 index 54c4e875d..000000000 --- a/patches/packages/curl-8.1.0-x86_64-1_slack15.0.txt +++ /dev/null @@ -1,11 +0,0 @@ -curl: curl (command line URL data transfer tool) -curl: -curl: Curl is a command line tool for transferring data specified with URL -curl: syntax. The command is designed to work without user interaction or -curl: any kind of interactivity. Curl offers a busload of useful tricks -curl: like proxy support, user authentication, ftp upload, HTTP post, SSL -curl: (https:) connections, cookies, file transfer resume and more. -curl: -curl: libcurl is a library that Curl uses to do its job. It is readily -curl: available to be used by your software, too. -curl: diff --git a/patches/packages/curl-8.1.1-x86_64-1_slack15.0.txt b/patches/packages/curl-8.1.1-x86_64-1_slack15.0.txt new file mode 100644 index 000000000..54c4e875d --- /dev/null +++ b/patches/packages/curl-8.1.1-x86_64-1_slack15.0.txt @@ -0,0 +1,11 @@ +curl: curl (command line URL data transfer tool) +curl: +curl: Curl is a command line tool for transferring data specified with URL +curl: syntax. The command is designed to work without user interaction or +curl: any kind of interactivity. Curl offers a busload of useful tricks +curl: like proxy support, user authentication, ftp upload, HTTP post, SSL +curl: (https:) connections, cookies, file transfer resume and more. +curl: +curl: libcurl is a library that Curl uses to do its job. It is readily +curl: available to be used by your software, too. +curl: diff --git a/patches/packages/texlive-2023.230322-x86_64-1_slack15.0.txt b/patches/packages/texlive-2023.230322-x86_64-1_slack15.0.txt new file mode 100644 index 000000000..6c6caa414 --- /dev/null +++ b/patches/packages/texlive-2023.230322-x86_64-1_slack15.0.txt @@ -0,0 +1,11 @@ +texlive: texlive (TeX binaries, support files, and formats) +texlive: +texlive: This package contains binaries, support files, TeX formats and +texlive: packages, and other files included in 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 and texlive-docs packages. +texlive: +texlive: diff --git a/patches/source/texlive/README.tlpkg b/patches/source/texlive/README.tlpkg new file mode 100644 index 000000000..35c25dd25 --- /dev/null +++ b/patches/source/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/patches/source/texlive/doinst.sh b/patches/source/texlive/doinst.sh new file mode 100644 index 000000000..cd1c7fe63 --- /dev/null +++ b/patches/source/texlive/doinst.sh @@ -0,0 +1,4 @@ +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 diff --git a/patches/source/texlive/douninst.sh b/patches/source/texlive/douninst.sh new file mode 100644 index 000000000..27d51c4ae --- /dev/null +++ b/patches/source/texlive/douninst.sh @@ -0,0 +1,4 @@ +# Remove directories/data generated by doinst.sh +rm -rf usr/share/texmf-config +rm -rf usr/share/texmf-local +rm -rf usr/share/texmf-var diff --git a/patches/source/texlive/dump.unused.internal.libraries.from.sources.sh b/patches/source/texlive/dump.unused.internal.libraries.from.sources.sh new file mode 100755 index 000000000..79027a199 --- /dev/null +++ b/patches/source/texlive/dump.unused.internal.libraries.from.sources.sh @@ -0,0 +1,17 @@ +#!/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 graphite2 harfbuzz mpfr icu libpng pixman zlib ) +( cd texlive-${VERSION}-source/utils && rm -rf asymptote ) +( cd texlive-${VERSION}-source/utils && rm -rf texdoctk ) +( cd texlive-${VERSION}-source/utils && rm -rf m-tx ) +( cd texlive-${VERSION}-source/texk/texlive && rm -rf w*_wrapper ) +tar cf texlive-${VERSION}-source.tar texlive-${VERSION}-source +rm -r texlive-${VERSION}-source +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/patches/source/texlive/prep/README b/patches/source/texlive/prep/README new file mode 100644 index 000000000..479e834d8 --- /dev/null +++ b/patches/source/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/patches/source/texlive/prep/excludes.texmf b/patches/source/texlive/prep/excludes.texmf new file mode 100644 index 000000000..8c909631a --- /dev/null +++ b/patches/source/texlive/prep/excludes.texmf @@ -0,0 +1,21 @@ +# Globally exclude packages/collections, which are +# -useless without tlmgr-installer +# -non-linux, e.g. texworks(windows binary) +# -covered by an external package, e.g. asymptote on SBo +# -binaries provided already by texlive.Slackbuild +# -only sources, e.g. metatype1, patch, ... + +global_exclude=" + 00texlive.config + 00texlive.image + 00texlive.installation + 00texlive.installer + asymptote + collection-texworks + collection-wintools + texlive-common + texlive-msg-translations + texosquery + tlcockpit + tlshell + " diff --git a/patches/source/texlive/prep/packages.texmf b/patches/source/texlive/prep/packages.texmf new file mode 100644 index 000000000..adadc069b --- /dev/null +++ b/patches/source/texlive/prep/packages.texmf @@ -0,0 +1,1334 @@ + # special packages, move docs to -docs +special_packages=" + koma-script + " + +# keep precompiled binaries not shipped as source by TL upstream, +# corresponding package should be in -extra, keep an eye on that ;-) +# list binary, not package name +keep_precompiled=" + biber + luametatex + " + +# Packages for -base, remaining packages are going to -extra +PACKAGES=" +collection-basic +collection-latex +collection-latexrecommended +caption +koma-script +collection-metapost +collection-humanities +collection-langenglish +collection-langitalian +collection-langportuguese +collection-langspanish +$(grep ^"name hyphen-.*" $db | cut -d' ' -f2 ) +$(grep ^"name babel-.*" $db | cut -d' ' -f2 ) + +# collection-langczechslovak +lshort-czech +lshort-slovak +texlive-cz +vlna + +# collection-langcyrillic +cmcyr +cyrillic +cyrillic-bin +cyrplain +disser +eskd +eskdx +gost +lcyw +lh +lhcyr +mongolian-babel +numnameru +ruhyphen +russ +serbian-apostrophe +serbian-date-lat +serbian-def-cyr +serbian-lig +t2 +ukrhyph +xecyrmongolian + +# collection-langgreek +begingreek +betababel +gfsbaskerville +gfsporson +greek-fontenc +greek-inputenc +greekdates +greektex +greektonoi +ibycus-babel +ibygrk +levy +lgreek +mkgrkindex +teubner +xgreek +yannisgr + +# collection-fontsrecommended +avantgar +bookman +charter +courier +euro +euro-ce +eurosym +fpl +helvetic +lm +lm-math +manfnt-font +marvosym +mathpazo +mflogo-font +ncntrsbk +palatino +pxfonts +rsfs +symbol +tex-gyre +tex-gyre-math +times +tipa +txfonts +utopia +wasy +wasysym +zapfchan +zapfding + +$(collection_by_size luatex 99999 || exit 1) +optex + +$(collection_by_size plaingeneric 99999 || exit 1) +tex4ht + +$(collection_by_size fontutils 999999 || exit 1) + +$(collection_by_size fontsextra 38999 || exit 1) +ascii-font +bbm +bbm-macros +bbold +cmbright +eulervm +fontawesome5 +ly1 +sauter +sauterfonts + +# collection-latexextra +acronym +adjustbox +bigfoot +collectbox +comment +coolfn +csquotes +datatool +datetime2 +$(grep ^"name datetime2-.*" $db | cut -d' ' -f2 ) +darkmode +docshots +doublestroke +enumitem +etoc +frame +framed +gensymb +glossaries +$(grep ^"name glossaries-.*" $db | cut -d' ' -f2 ) +gradient-text +imakeidx +lipsum +mfirstuc +mdframed +moderncv +moreverb +multirow +nfssext-cfr +nomencl +opencolor +pangram +resmes +sectsty +splitindex +stackengine +supertabular +swungdash +termcal +tocloft +ucs +wrapfig2 +xpatch +xstring + +a0poster +a4wide +a5comb +abraces +abstract +accsupp +acroterm +actuarialangle +actuarialsymbol +addfont +addlines +adjmulticol +adrconv +advdate +alnumsec +alphalph +altfont +altsubsup +amsaddr +anonchap +answers +anyfontsize +appendix +appendixnumberbeamer +apptools +arabicfront +arcs +arraycols +arrayjobx +arraysort +asciilist +assignment +association-matrix +atenddvi +atendofenv +authoraftertitle +authorarchive +autofancyhdr +autonum +autopuncitems +axessibility +background +bankstatement +basicarith +bchart +beamerappendixnote +beameraudience +beamerauxtheme +beamercolorthemeowl +beamerdarkthemes +beamersubframe +beamertheme-arguelles +beamertheme-cuerna +beamertheme-detlevcm +beamertheme-epyt +beamertheme-light +beamertheme-phnompenh +beamertheme-saintpetersburg +beamertheme-simpledarkblue +beamertheme-simpleplus +beamertheme-upenn-bc +beamerthemejltree +beamerthemelalic +beamerthemenirma +beamerthemenord +bearwear +beton +bez123 +bhcexam +bibletext +bigints +bilingualpages +biochemistry-colors +bizcard +block +blowup +bold-extra +book-of-common-prayer +booklet +boolexpr +bophook +boxedminipage +bracketkey +braket +breakurl +bubblesort +bullcntr +bxcalc +bxdpx-beamer +bxdvidriver +bxenclose +calcage +calrsfs +cancel +canoniclayout +capt-of +captcont +captdef +catchfilebetweentags +catechis +cclicenses +cd +cd-cover +cdcmd +cellspace +censor +centeredline +centerlastline +changelayout +changelog +chappg +chapterfolder +cheatsheet +checkend +childdoc +chkfloat +chletter +chngcntr +chronology +circledsteps +classics +classpack +clefval +clicks +clipboard +clock +clrdblpg +clrstrip +cmdstring +cmdtrack +cmsd +cntformats +cntperchap +codebox +codesection +collcell +colophon +color-edits +colordoc +colorinfo +coloring +colorwav +colorweb +colourchange +combelow +comma +commado +commedit +competences +constants +continue +contour +conv-xkv +cooking +coollist +coolstr +coolthms +cooltooltips +copyedit +copyrightbox +coseoul +counttexruns +courseoutline +coverpage +cprotect +cprotectinside +crbox +crefthe +crossreference +crossreftools +crumbs +css-colors +csvmerge +cuisine +currency +currfile +currvita +cutwin +cv +cyber +cybercic +dashbox +dashrule +dashundergaps +datax +datenumber +datestamp +dblfloatfix +debate +decimal +decorule +delimtxt +diagbox +diagnose +dichokey +dimnum +dirtytalk +dnaseq +docmfp +docmute +documentation +docutils +doi +dotarrow +dotlessi +dotseqn +download +dox +dpfloat +dprogress +drac +draftfigure +draftwatermark +dynamicnumber +dynblocks +ean13isbn +easy-todo +easyfig +easyformat +easyreview +ecclesiastic +ecv +ed +edichokey +eemeir +efbox +egplot +ehhline +einfart +ellipsis +elmath +elocalloc +emarks +embedall +embrac +emptypage +endheads +endnotes-hy +engpron +engrec +envbig +environ +epigraph +epigraph-keys +eq-pin2corr +eqell +eqlist +eqnalign +eqname +eqparbox +errata +erw-l3 +esdiff +esieecv +esindex +etaremune +eukdate +eulerpx +everyhook +everypage +excludeonly +exercisepoints +exercises +exesheet +exp-testopt +expdlist +exsol +fancyhandout +fancynum +fancypar +fancyslides +fancytabs +fbox +fcolumn +fetchcls +fewerfloatpages +ffcode +fifo-stack +figsize +filecontents +filecontentsdef +filemod +fink +finstrut +fixcmex +fixfoot +fixmetodonotes +fjodor +flabels +flacards +flagderiv +flashcards +flexipage +flipbook +flippdf +floatflt +fmp +fn2end +fnbreak +fncylab +fnpara +fnumprint +foilhtml +fontaxes +footnotebackref +footnoterange +foreign +forloop +forms16be +formular +fragments +ftcap +ftnxtra +fullblck +fullminipage +fullwidth +fundus-calligra +fundus-cyr +fundus-sueterlin +fwlw +gatherenum +gcard +gcite +gender +genmpage +getfiledate +getitems +gindex +ginpenc +gitfile-info +gitinfo +gitinfo2 +gitlog +gitver +globalvals +gmdoc-enhance +gmiflink +grabbox +graphbox +graphicscache +graphicx-psmin +graphicxbox +grayhints +grfpaste +grid +grid-system +gridset +gridslides +gs1 +guitlogo +handin +handout +handoutwithnotes +hang +hanging +hardwrap +harnon-cv +harpoon +he-she +hhtensor +hideanswer +highlightlatex +histogr +hobsub +href-ul +hrefhide +hvindex +hvlogos +hvpygmentex +hvqrurl +hypdestopt +hypdoc +hyperbar +hypernat +hyphenat +identkey +idxcmds +idxlayout +iexec +ifallfalse +iffont +ifoddpage +ifthenx +iitem +image-gallery +import +inline-images +inlinedef +inlinelabel +inputtrc +intopdf +inversepath +invoice-class +invoice2 +isonums +isopt +isorot +isotope +issuulinks +jlabels +jmsdelim +jvlisting +kalendarium +keyindex +keyparse +keyval2e +kix +koma-moderncvclassic +koma-script-sfs +komacv-rg +ktv-texdata +labels +labels4easylist +labelschanged +lambdax +lastpackage +lastpage +latex-uni8 +latexdemo +latexgit +lazylist +lccaps +lcd +lcg +leading +lectureslides +leftidx +leftindex +lengthconvert +lewis +libgreek +linegoal +linop +listing +listingsutf8 +listlbls +listliketab +listofsymbols +lkproof +lmake +locality +logbox +logical-markup-utils +longfigure +longnamefilelist +lstaddons +lstfiracode +lt3rawobjects +ltablex +ltxguidex +ltxnew +lua-check-hyphen +macrolist +macroswap +magaz +magicwatermark +mailing +mailmerge +makebase +makebox +makeglos +makelabels +makerobust +manfnt +manuscript +manyind +marginfit +marginfix +marginnote +mathexam +maybemath +mcaption +mceinleger +mcite +medstarbeamer +meetingmins +memexsupp +memory +mensa-tex +menu +menucard +method +mftinc +mi-solns +midpage +mindflow +minibox +minidocument +minipage-marginpar +minorrevision +mla-paper +mleftright +mlist +mnotes +modernposter +moderntimeline +modref +modroman +modular +monofill +moreenum +moresize +mparhack +mtgreek +multenum +multiaudience +multibbl +multicap +multicolrule +multidef +multienv +multiexpand +multifootnote +multilang +multiple-choice +mversion +mylatex +namespc +needspace +nestquot +newenviron +newfile +newspaper +newunicodechar +newvbtm +newverbs +nextpage +ninecolors +noconflict +noindentafter +noitcrul +nolbreaks +nomentbl +nonfloat +nonumonpart +nopageno +normalcolor +notoccite +nowidow +numberedblock +numname +ocgx +ocr-latex +oldstyle +onlyamsmath +optional +orcidlink +orientation +outline +outliner +outlines +outlining +overlays +overpic +padcount +pagecolor +pagecont +pagenote +pagerange +palette +papercdcase +papermas +parades +paresse +parnotes +parselines +pas-cours +pas-tableur +patchcmd +pauldoc +pawpict +pbox +pdf14 +pdfcolmk +pdfmarginpar +pdfoverlay +pdfpagediff +pdfpc +pdfpc-movie +pdfprivacy +pdfsync +permute +petiteannonce +pgfmath-xfp +phfextendedabstract +phffullpagefigure +phfparen +phfquotetext +phfsvnwatermark +photo +picture +piff +plantslabels +plweb +polynomial +postcards +poster-mac +practicalreports +precattl +prelim2e +prettyref +printlen +progressbar +proofread +properties +protocol +psfragx +pxgreeks +python +qcm +quicktype +quiz2socrative +quotchap +quoting +randtext +rccol +rcs-multi +rcsinfo +readablecv +realboxes +recipe +recipecard +rectopma +refcheck +refenums +reflectgraphics +regcount +regexpatch +regstats +repeatindex +repltext +rescansync +returntogrid +rgltxdoc +rjlparshap +rlepsf +robustcommand +romanbar +romanbarpagenumber +romanneg +romannum +rotfloat +rotpages +roundbox +rterface +rtkinenc +rulerbox +rulercompass +rvwrite +sanitize-umlaut +saveenv +savefnmark +savesym +scale +scalebar +scalerel +schooldocs +scrambledenvs +scrlayer-fancyhdr +scrlttr2copy +sdrt +secdot +secnum +sectionbox +sectionbreak +seealso +selinput +semantic-markup +semesterplanner +semioneside +semproc +semtex +sepfootnotes +seqsplit +sesstime +sffms +shadow +shadowtext +shdoc +shorttoc +show2e +showcharinbox +showdim +showexpl +showlabels +sidecap +silence +simplecv +simpleinvoice +simplivre +sitem +skills +slantsc +smalltableof +smart-eqn +smartref +smartunits +snaptodo +snotez +soulpos +spacingtricks +sparklines +sphack +spot +spverbatim +srbook-mem +srcltx +sslides +stack +stdclsdv +stdpage +stealcaps +storebox +storecmd +stubs +styledcmd +subdepth +subdocs +subeqn +subeqnarray +subfigmat +subfiles +subfloat +substitutefont +suppose +svgcolor +svn +svninfo +swfigure +syntax +syntrace +synttree +tabbing +tabfigures +tableaux +tableof +tablists +tabls +tablvar +tabto-ltx +tabularborder +tabularew +tagging +tagpair +tdclock +technics +ted +templatetools +termcal +termlist +termsim +testhyphens +tex-label +texlogos +texments +texsurgery +textfit +textmerg +textpos +textualicomma +texvc +thinsp +threadcol +threeparttablex +thumb +thumby +ticket +titlefoot +titlepic +titleref +titling +to-be-determined +tocbibind +tocdata +tocvsec2 +todo +tokenizer +toolbox +topfloat +totalcount +totcount +totpages +transparent +trfsigns +trimspaces +trivfloat +trsym +truncate +tucv +turnthepage +twoinone +twoup +txgreeks +type1cm +typogrid +uassign +uebungsblatt +umoline +underlin +underoverlap +undolabl +unisc +unitconv +uri +ushort +uspace +utf8add +uwmslide +variablelm +varsfromjobname +varwidth +vcell +vdmlisting +verbatimbox +verbatimcopy +verbdef +verbments +version +versonotes +vertbars +vgrid +vmargin +volumes +vtable +vwcol +wallpaper +warning +warpcol +was +widetable +widows-and-orphans +williams +wordlike +worksheet +wtref +xargs +xcntperchap +xcomment +xcpdftips +xellipsis +xfakebold +xhfill +xltabular +xmpincl +xnewcommand +xoptarg +xpeek +xprintlen +xpunctuate +xurl +xytree +yafoot +yaletter +zebra-goodies +ziffer +zwgetfdate + +$(collection_by_size langeuropean 299999 || exit 1) + +$(collection_by_size langfrench 23999 || exit 1) + +# collection-langgerman +apalike-german +dehyph +dehyph-exptl +dhua +etdipa +fifinddo-info +german +germbib +germkorr +l2picfaq +l2tabu +milog +r_und_s +schulmathematik +termcal-de +uhrzeit +umlaute +voss-mathcol + +$(collection_by_size langpolish 8999 || exit 1) + +$(collection_by_size langarabic 1999 || exit 1) +arabtex + +$(collection_by_size langchinese 4999 || exit 1) + +# collection-langjapanese +asternote +luatexja + +$(collection_by_size langcjk 2999 || exit 1) + +$(collection_by_size langother 29999 || exit 1) + +$(collection_by_size pictures 22999 || exit 1) +circuitikz +xypic + +$(collection_by_size pstricks 99999 || exit 1) +pst-pdf + +$(collection_by_size mathscience 19999 || exit 1) +siunits + +$(collection_by_size games 39999 || exit 1) + +# collection-xetex +arabxetex +awesomebox +businesscard-qrcode +fixlatvian +font-change-xetex +fontbook +fontwrap +interchar +na-position +realscripts +simple-resume-cv +simple-thesis-dissertation +ucharclasses +unisugar +xebaposter +xechangebar +xecolor +xecyr +xeindex +xesearch +xespotcolor +xetex +xetex-pstricks +xetexconfig +xetexfontinfo +xevlna + +# collection-formatsextra +edmac +eplain +hitex +jadetex +lollipop +mltex +mxedruli +passivetex +psizzl +startex +texsis +xmltex +xmltexconfig + +# collection-binextra +a2ping +adhocfilelist +bibtex8 +bibtexu +bundledoc +checklistings +chklref +chktex +cluttex +ctie +cweb +de-macro +detex +dtl +dtxgen +dvi2tty +dviasm +dvicopy +dvidvi +dviinfox +dviljk +dviout-util +dvipng +dvipos +dvisvgm +findhyph +fragmaster +git-latexdiff +gsftopk +hook-pre-commit-pkg +installfont +lacheck +latex-git-log +latex-papersize +latex2man +latexdiff +latexfileversion +latexindent +latexmk +latexpand +light-latex-make +listings-ext +ltxfileinfo +ltximg +luajittex +make4ht +match_parens +mflua +mkjobtexmf +optexcount +patgen +pdfbook2 +pdfcrop +pdfjam +pdflatexpicscale +pdftex-quiet +pdftosrc +pdfxup +pfarrei +pkfix +pkfix-helper +purifyeps +pythontex +seetexk +spix +srcredact +sty2dtx +synctex +tex4ebook +texcount +texdef +texdiff +texdirflatten +texdoc +texfot +texlive-scripts-extra +texloganalyser +texlogfilter +texware +tie +tpic2pdftex +typeoutfileinfo +web +xindex +xindy +xpdfopen + +# collection-publishers +chifoot +ebook +inkpaper +revtex +scrjrnl + +# collection-bibtexextra +aaai-named +aichej +ajl +amsrefs +annotate +apacite +apalike-ejor +apalike2 +archaeologie +authordate +besjournals +bestpapers +bibarts +bibexport +bibhtml +bibexport +bibhtml +biblist +bibtexperllibs +bibtopic +bibtopicprefix +bibunits +biolett-bst +bookdb +breakcites +cell +chbibref +chembst +chicago +chicago-annote +chicagoa +chscite +citeref +collection-latex +collref +compactbib +crossrefware +custom-bib +din1505 +dk-bib +doipubmed +econ-bst +economic +fbs +figbib +footbib +francais-bst +gbt7714 +harvmac +icite +ietfbibs +ijqc +inlinebib +iopart-num +is-bst +jbact +jmb +jneurosci +jurabib +ksfh_nat +listbib +logreq +ltb2bib +luabibentry +margbib +multibib +multibibliography +newcastle-bst +nmbib +notes2bib +notex-bst +perception +plainyr +pnas2009 +rsc +showtags +sort-by-letters +splitbib +turabian-formatting +urlbst +usebib +vak +xcite +zootaxa-bst + +#collection-music +abc +autosp +bagpipe +chordbars +chordbox +ddphonism +figbas +gchords +gtrcrd +guitar +guitarchordschemes +guitartabs +harmony +latex4musicians +leadsheets +lyluatex +musical +musicography +octave +piano +songbook +songs +xml2pmx +xpiano +" texmfget base diff --git a/patches/source/texlive/prep/texmf_get.sh b/patches/source/texlive/prep/texmf_get.sh new file mode 100644 index 000000000..6876a4cb0 --- /dev/null +++ b/patches/source/texlive/prep/texmf_get.sh @@ -0,0 +1,941 @@ +#!/bin/bash + +# texmf_get.sh +# +# Copyright 2016 - 2023 Johannes Schoepfer, Germany, slackbuilds@schoepfer.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. +# +# version 15.1.1 +# +# 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/docs) should contain no binaries +# -base: the most usefull stuff, most binaries/scripts, +# manpages for binaries/scripts 65mb 2017-11-07 +# -docs: -base documentation only, no manpages/GNU infofiles +# -extra: remaining stuff and corresponding docs +# +# texlive netarchive policy: Every package is included as dependency +# in exactly one collection. A package may have dependencies on other +# packages from any collection. + +#set -e +# Official mirror +mirror="http://mirror.ctan.org/systems/texlive/tlnet/" +# Pre-test mirror for new releases +#mirror="http://ftp.cstug.cz/pub/tex/local/tlpretest/" +cd $(dirname $0) ; CWD=$(pwd) +TMP=${TMP:-$CWD/tmp} + +usage () { + echo + echo "Generate texmf trees/editions based on collections/packages" + echo "and their (hard)dependencies." + echo "./texmf_get.sh [base|docs|extra|lint]" + echo + echo "-base: texfiles, no docs" + echo "-docs: docs of -base" + echo "-extra: remaining texfiles and docs" + echo "[lint]: compare filename contents of all generated editions," + echo " to detect overlapping files" + echo + echo "Only new/updated/missing tex packages are downloaded." + echo "The first run takes \"long\", tex packages(about 3Gb)" + echo "need to be downloaded." + echo "To check out a new version/release, delete" + echo "$db" + echo "A new ascii index file/database(texlive.tlpdb) is will be" + echo "pulled on the next run, and a new version yymmdd will be 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 "ERROR: \"$1\" is no package in $db, edit $CWD/packages.texmf !" && 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 multiple times if package isn't present or checksum fails + + unset checksum_ok + if [ "$flavour" = ".doc" ] + then + sha512="$(grep ^doccontainerchecksum $texmf/$1.meta | cut -d' ' -f2 )" + else + sha512="$(grep ^containerchecksum $texmf/$1.meta | cut -d' ' -f2 )" + fi + + cd $texmf + + for run in {1..10} + do + [ ! -s "${1}${flavour}.tar.xz" ] && \ + wget -q --show-progress -t1 -c ${mirror}archive/${1}${flavour}.tar.xz + [ ! -s "${1}${flavour}.tar.xz" ] && continue + if [ "$(sha512sum ${1}${flavour}.tar.xz | cut -d' ' -f1 )" != "$sha512" ] + then + echo "sha512sum of ${1}${flavour}.tar.xz doesn't match $texmf/$1.meta" + echo "deleting ${1}${flavour}.tar.xz" + rm ${1}${flavour}.tar.xz + else + checksum_ok=yes + break + fi + done + + # If no success by downloading, write error log + if [ -z "$checksum_ok" ] + then + echo "Downloading ${1}${flavour}.tar.xz or sh512sum check was not successful,\\ + writing to $errorlog" + echo "Delete ${db}* and $TMP/VERSION, then try again, bye." + echo "$VERSION" >> $errorlog + echo "Error downloading ${1}${flavour}.tar.xz" >> $errorlog + exit 1 + fi +} + +untar () { + # leave if $1 has no content + if [ -s "$1" ] + then + while read package + do + echo "untar $package$flavour" + # untar all packages, check for relocation, "relocate 1" -> untar in texmf-dist + download $package || exit 1 + # untar package, relocate to texmf-dist if necessary, binary packages always need relocation + relocated='.' + [ -n "$(grep -w ^"relocated 1" $texmf/$package.meta)" -o -n "$(grep ^"binfiles " $texmf/$package.meta)" ] && relocated="texmf-dist" + # if not .doc package, investigate files for dependencies/provides + if [ -n "$flavour" ] + then + tar xf ${package}${flavour}.tar.xz --exclude tlpkg -C $relocated || exit 1 + else + tar vxf ${package}${flavour}.tar.xz \ + --exclude tlpkg/tlpobj \ + -C $relocated | grep -E '\.sty$|\.bbx$|\.cls$' > $texmf/$package.deps + if [ -n "$texmf/$package.deps" ] + then + unset provide + unset depends + for depfile in $(cat $texmf/$package.deps) + do + filename="$( echo $depfile | rev | cut -d'.' -f2- | cut -d'/' -f1 | rev)" + # always add $filename as "ProvidesPackage", if it's a .sty + echo $depfile | grep '\.sty'$ &>/dev/null + [ $? = 0 ] && provide+="${filename}," + provide+="$(sed "s/%.*//g" $texmf/$relocated/$depfile | sed -z "s/\(Package\|ExplPackage\|File\|Class\)\n/\1/g" | sed "s/[[:space:]]//" | sed -n "s/.*\\\Provides\(Package\|ExplPackage\|File\|Class\){\([^}]*\)}.*/\2/p" | sed "s/\\\filename/$filename/g;s/\\\ExplFileName/$filename/g" | sed "s/\(\.sty$\|\.cls$\)//g" | sort -u | tr '\n' ',')" + depends+="$(sed "s/%.*//g" $texmf/$relocated/$depfile | sed -n "s/.*\(\\\require\|\\\use\)package{\([^}]*\)}.*/\2/p" | sort -u | tr '\n' ',')" + done + if [ -n "$provide" ] + then + echo "$package $provide" >> $TMP/provides.run.$edition + fi + if [ -n "$depends" ] + then + echo "$package $depends" >> $TMP/depends.run.$edition + fi + fi + fi + + # Delete binaries, these are provided by the buildscript + # Keep symlinks and scripts + + for arch in $platforms + do + if [ -d $texmf/texmf-dist/bin/$arch ] + then + [ ! -d $texmf/texmf-dist/linked_scripts ] && \ + mkdir $texmf/texmf-dist/linked_scripts + # remove the unfortunate "man" link + [ -L "$texmf/texmf-dist/bin/$arch/man" ] && \ + rm $texmf/texmf-dist/bin/$arch/man + for link in $(find $texmf/texmf-dist/bin/$arch -type l) + do + # if link has "../.." content, re-create link to match + # final destiantion /usr/share/texmf-dist + a="$(readlink $link)" + b=${a/..\/../..\/share} + link_valid_dest=$texmf/texmf-dist/linked_scripts/${link##*/} + ln -sf $b $link_valid_dest + rm $link + done + + # keep only precompiled binaries of special packages, see packages.texmf, + # these should only be in -extra. + # remove xindy.mem(gzip compresses data) to prevent overwriting + # the one built from the source + for bin in $(find $texmf/texmf-dist/bin/$arch -type f -exec file '{}' + | \ + grep -e "shared object" -e ELF -e "gzip compressed data" | cut -f 1 -d : ) + do + binfile="$(echo $bin | rev | cut -d'/' -f1 | rev)" + remove_binary=yes + # for multiple binaries this extra loop is neccesary + for binary in $keep_precompiled + do + if [ "$(echo $bin | rev | cut -d'/' -f1 | rev)" = "$binary" ] + then + remove_binary=no + fi + done + if [ $remove_binary = yes ] + then + # might be already removed by a previous run + if [ -s "$bin" ] + then + #echo "Deleting binary \"$arch/$binfile\"" + rm $bin && echo "$package: $binfile" >> $binary_removed.$edition + fi + fi + done + # move scripts to linked-scripts + for script in \ + $(find $texmf/texmf-dist/bin/$arch -type f -exec file '{}' + | \ + grep -wv ELF | cut -f 1 -d : ) + do + mv $script $texmf/texmf-dist/linked_scripts/ + done + fi + done + + for tlpkg_dir in $texmf/tlpkg $texmf/texmf-dist/tlpkg + do + if [ -d $tlpkg_dir ] + then + for bin in $(find $tlpkg_dir -type f -exec file '{}' + | \ + grep -e "shared object" -e ELF -e "gzip compressed data" | cut -f 1 -d : ) + do + rm $bin + echo -n "$package:" >> $binary_removed.$edition + echo $bin | rev | cut -d'/' -f1 | rev >> $binary_removed.$edition + done + find $tlpkg_dir -type d -empty -delete + if [ -d $tlpkg_dir/TeXLive ] + then + mkdir -p $texmf/texmf-dist/scripts/texlive/TeXLive + mv $tlpkg_dir/TeXLive/* $texmf/texmf-dist/scripts/texlive/TeXLive + fi + fi + done + + if [ "$flavour" = ".doc" ] + then + size=$(grep ^doccontainersize $texmf/$package.meta | cut -d' ' -f2) + else + size=$(grep ^containersize $texmf/$package.meta | cut -d' ' -f2) + # add maps to updmap.cfg, don't add special_packages map files to -base + add_map=yes + if [ $edition = base ] + then + for no_map in $special_packages + do + [ $no_map = $package ] && add_map=no && break + done + fi + [ $add_map = yes ] && grep ^'execute ' $texmf/$package.meta | grep Map | cut -d' ' -f2- | sed "s/^add//g" >> $updmap.$edition + fi + shortdesc="$(grep ^shortdesc $texmf/$package.meta | cut -d' ' -f2- )" + echo "$size byte, $package$flavour: $shortdesc" >> $output.meta + # make index of uncompressed size of each package + echo "$(xz -l --verbose ${package}${flavour}.tar.xz | grep "Uncompressed size" | \ + cut -d'(' -f2 | cut -d' ' -f1 ) byte, $package$flavour: $shortdesc" >> $output.meta.uncompressed + done < $1 + + # add a path to updmap + if [ -s "$texmf/texmf-dist/linked_scripts/updmap" ] + then + sed -i '/unshift.*@INC.*/a unshift(@INC, "$TEXMFROOT/texmf-dist/scripts/texlive");' $texmf/texmf-dist/linked_scripts/updmap || exit 1 + fi + + # copy packages index to texmf-dist, to have a list of included packages in the final installation + # don't list binary packages, as the binaries itself are not contained, + # only symlinks/scripts. + cat $output.meta | grep -v '\-linux:' >> $output.$edition.meta + cat $output.meta.uncompressed | grep -v '\-linux:' >> $output.$edition.meta.uncompressed + + # cleanup + [ -f $output.meta ] && rm $output.meta + [ -f $output.meta.uncompressed ] && rm $output.meta.uncompressed + fi +} + +remove_cruft () { + # Remove m$-stuff, ConTeXt single-user-system stuff, empty files/directories and pdf-manpages + rm -rf $texmf/texmf-dist/source + rm -rf $texmf/texmf-dist/scripts/context/stubs/source/ + find $texmf/texmf-dist/ -type d -name 'win32' -exec rm -rf {} + + find $texmf/texmf-dist/ -type d -name 'win64' -exec rm -rf {} + + find $texmf/texmf-dist/ -type d -name 'mswin' -exec rm -rf {} + + find $texmf/texmf-dist/ -type d -name 'win' -exec rm -rf {} + + find $texmf/texmf-dist/ -type d -name 'setup' -exec rm -rf {} + + find $texmf/texmf-dist/ -type d -name 'install' -exec rm -rf {} + + find $texmf/texmf-dist/ -type f -name 'uninstall*.sh' -delete + find $texmf/texmf-dist/ -type f -name '*.bat' -delete + find $texmf/texmf-dist/ -type f -name '*.bat.w95' -delete + find $texmf/texmf-dist/ -type f -name '*.vbs' -delete + find $texmf/texmf-dist/ -type f -name '*win32*' -delete + find $texmf/texmf-dist/ -type f -name 'winansi*' -delete + find $texmf/texmf-dist/ -type f -name '*man1.pdf' -delete + find $texmf/texmf-dist/ -type f -name '*man5.pdf' -delete + find $texmf/texmf-dist/ -type f -name '*.man' -delete + find $texmf/texmf-dist/ -type f -empty -delete + find $texmf/texmf-dist/ -type d -empty -delete + + echo "Replace duplicate files by symlinks, this may take a while ..." + + LASTSIZE=x + find $texmf/texmf-dist/ -type f -printf '%s %p\n' | sort -n | + while read -r SIZE FILE + do + # symlinks alse need some bytes, start linking above 10 bytes + if [ "$SIZE" -gt 10 -a "$SIZE" == "$LASTSIZE" ] + then + if [ "$(sha512sum $FILE | cut -d' ' -f1)" \ + == "$(sha512sum $LASTFILE | cut -d' ' -f1)" ] + then + echo "$FILE $LASTFILE $SIZE" >> $duplicatelog + ln -srf $FILE $LASTFILE + fi + fi + LASTSIZE="$SIZE" + LASTFILE="$FILE" + done +} + +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;s/#.*$//;/^$/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 + + # If $collection is a singel package(not a collection-), add it here + if [ -n "$(head -n1 $texmf/$collection.meta | grep -v "name collection" )" ] + then + unset addpackage + # if package contains docs, add to docs-packages + if [ -n "$(grep ^docfiles $texmf/$collection.meta)" ] + then + echo "$collection" >> $output_doc + echo "$collection added to docs $1" >> $logfile + addpackage=yes + fi + # if package contains runfiles, binfiles or depend, add to edition + if [ \ + -n "$(grep ^runfiles $texmf/$collection.meta)" -o \ + -n "$(grep ^binfiles $texmf/$collection.meta)" -o \ + -n "$(grep ^depend $texmf/$collection.meta)" \ + ] + then + echo "$collection" >> $output + echo "$collection added to -$1" >> $logfile + addpackage=yes + fi + # if package contains only srcfiles, don't add to a edition + if [ -n "$(grep ^srcfiles $texmf/$collection.meta)" -a -z "$addpackage" ] + then + echo "$collection only contains srcfiles, added nowhere" >> $logfile + addpackage=yes + fi + # abort if package seems broken + if [ -z "$addpackage" ] + then + echo "$collection doesn't contain any docfiles/runfiles/binfiles/depends or srcfiles" + echo "Please exclude package/report to upstream mailinglist tex-live@tug.org, bye." + exit 1 + fi + fi + + # Don't handle collections as dependency of other collections, + # as this destroys control over packages to be added. + # Add dependend packages, but no binary(ARCH) and no packages + # containing a '.'. Packages with dot indicate binary/texlive-manager/windows packages + + grep ^"depend " $texmf/$collection.meta | cut -d' ' -f2- > $dependencies + + if [ -s "$dependencies" ] + then + # check for .ARCH packages which may be binaries, scripts or links + # Binaries should all come from the sourcebuild(exception $keep_precompiled) + for dependency in $(cat $dependencies) + do + echo $dependency | grep '\.ARCH'$ &>/dev/null + if [ $? = 0 ] + then + for arch in $platforms + do + archpackage="$(echo $dependency | sed "s/\.ARCH$/\.$arch/")" + grep ^"name $archpackage"$ $db &>/dev/null && echo "$archpackage" >> $dependencies.verified_arch + done + else + echo $dependency >> $dependencies.verified_arch + fi + done + if [ -f $dependencies.verified_arch ] + then + mv $dependencies.verified_arch $dependencies + else + rm $dependencies + fi + fi + + 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 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) + echo "Adding files to $( echo $tarball | rev | cut -d'/' -f1 | rev ) ..." + case $edition in + base) + unset flavour + untar $output || exit 1 + remove_cruft || exit 1 + tar rf $tarball --owner=0 --group=0 --sort=name texmf-dist || exit 1 + rm -rf texmf-dist + ;; + extra) + 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 rf $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 rf $tarball --owner=0 --group=0 --sort=name texmf-dist || exit 1 + rm -rf texmf-dist + fi + ;; + esac + fi +} + +lint () { + +echo "Comparing content of all editions, this may take a while ..." +cd $TMP +# check if all editions of same VERSION are there, take -base as reference +if [ -s texlive-extra-$VERSION.tar.xz \ + -a -s texlive-docs-$VERSION.tar.xz ] +then + for edition in base extra docs + do + echo "Extracting index of texlive-${edition}-$VERSION.tar.xz ..." + # don't list directories + tar tf texlive-${edition}-$VERSION.tar.xz | grep -v '/'$ > $TMP/packages.$edition.lint + done + + # compare content + for edition in base extra docs + do + >$TMP/packages.$edition.lint.dup + if [ $edition = base ] + then + echo "check if files of base are present in another edition" + while read line + do + grep ^"$line"$ $TMP/packages.extra.lint >> $TMP/packages.base.lint.dup + grep ^"$line"$ $TMP/packages.docs.lint >> $TMP/packages.base.lint.dup + done < $TMP/packages.$edition.lint + fi + done +else + echo "Not all editions are present to lint them. Create them first by" + echo "$0 [base|docs|extra]" + echo "bye." + exit 1 +fi + +exit 0 + +} + +# Main + +LANG=C +output=$TMP/packages +output_doc=$TMP/packages.doc.tmp +errorlog=$TMP/error.log +duplicatelog=$TMP/duplicate.log +texmf=$TMP/texmf +db=$TMP/texlive.tlpdb +tmpfile=$TMP/tmpfile +collections_done=$TMP/done +collections_tobedone=$TMP/tobedone +allcollections=$TMP/allcollections +binary_removed=$TMP/binaries.removed +manpages=$TMP/manpages +dependencies=$TMP/deps +packages_base=$TMP/packages.base +packages_extra=$TMP/packages.extra +packages_manpages=$TMP/packages.manpages +updmap=$TMP/updmap.cfg +files_split=$TMP/files.split +platforms="x86_64-linux i386-linux" + +# Source global excludes +source $CWD/excludes.texmf + +mkdir -p $texmf +cd $TMP + +case "$1" in + base|docs|extra) edition=$1;; + lint) lint ;; + *) usage; exit 0 ;; +esac + +echo "Building $edition tarball ..." + +# Set VERSION, get texlive.tlpdb and strip it, keep texlive.tlpdb.orig +if [ ! -s ${db}.orig -o ! -s $db -o ! -s VERSION ] +then + for run in {1..10} + do + wget -q --show-progress -t1 -c -O ${db}.orig.xz ${mirror}tlpkg/texlive.tlpdb.xz + [ -s "${db}.orig.xz" ] && break + done + unxz -f ${db}.orig.xz || exit 1 + echo $(date +%y%m%d) > VERSION + + # remove most content from $db to be faster on later processing. + # keep dependencies/manpages/binfiles/shortdesc/sizes + echo "Preparing texlive.tlpdb ..." + grep -E \ + '^\S|^ RELOC/doc/man|^ texmf-dist/doc/man/man|^ RELOC/doc/info/|^ texmf-dist/doc/info/|^ bin|^$' \ + ${db}.orig | grep -v ^longdesc > $db + + # As $db might be renewed, remove the all package meta-files + # to make them be created again based on (new) $db + rm -rf $texmf/*.meta +fi + +# Get linenumbers of empty lines from $db +emptylines="$(grep -n ^$ $db | cut -d':' -f1)" + +# Make a list of all collections +grep ^"name collection-" $db | cut -d' ' -f2 > $allcollections +# remove global excluded collection(s) +for exclude in $global_exclude +do + sed -i "/^$exclude/d" $allcollections +done + +# translate .ARCH to platforms in excludes, to make .ARCH packages excludeable by $global_exclude +for exclude in $global_exclude +do + if [ -n "$(echo $exclude | grep '\.ARCH'$ )" ] + then + for arch in $platforms + do + global_exclude+=" $(echo $exclude | sed "s/\.ARCH$/\.$arch/")" + done + global_exclude=${global_exclude/$exclude/} + fi +done + +VERSION=$(cat $TMP/VERSION) +tarball=$TMP/texlive-$edition-$VERSION.tar +# set logfile +logfile=$TMP/$VERSION.log + +# reset some files +>$logfile +>$tarball +>$collections_done +>$duplicatelog +>$files_split +>$manpages +>$packages_manpages +>$updmap.$edition +>$packages_base +>$packages_extra +>$packages_base.doc +>$packages_extra.doc +>$TMP/packages.$edition.meta +>$TMP/packages.$edition.meta.uncompressed +>$TMP/provides.run.$edition +>$TMP/depends.run.$edition +>$binary_removed.$edition + +# Load texmf package list to generate -base/-extra/-docs +source $CWD/packages.texmf + +# Put everything in -extra which is not in -base +PACKAGES=" + $(cat $allcollections) + " texmfget extra + +# Check if all collections are 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." + echo "Edit packages/collections in the texmfget function." | tee -a $logfile + exit 1 + fi +done < $allcollections + +# cleanup +rm $allcollections +rm $collections_done +rm $collections_tobedone +rm $output +rm $output_doc +rm $dependencies + +# untar special- and manpage packages to be splitted/moved to other editions +# splitting special packages, files index +echo "Prepare index of to be splitted/moved files from -base" +[ ! -d texmf-dist ] && mkdir texmf-dist +for package in $special_packages +do + echo "Splitting $package" + # special packages have to be in -base, as only here are special + # tasks done to reduce size of -base edition + if [ -z "$( grep ^"$package"$ $packages_base )" ] + then + echo "$package was not found to be part of -base" + echo "Edit \$special_packages in $0," + echo "it should contain only packages from -base, bye." + exit 1 + fi + unset relocated + pathprefix="texmf-dist/" + [ -n "$(grep -w ^"relocated 1" $texmf/$package.meta)" ] && \ + relocated="-C texmf-dist" && unset pathprefix + # avoid big pdf docs which are also present as html + # move (big)type1 fonts to -extra + # $files_split lists files to be moved from -base to -extra + tar tf $texmf/${package}.tar.xz | sed \ + -ne "/.*doc\/latex\/.*\.pdf$/p" \ + -ne "/.*fonts\/map\/.*\.map$/p" \ + -ne "/.*fonts\/enc\/.*\.enc$/p" \ + -ne "/.*fonts\/afm\/.*\.\(afm\|afm\.gz\)$/p" \ + -ne "/.*fonts\/type1\/.*\.pfb$/p" \ + -ne "/.*fonts\/vf\/.*\.vf$/p" | \ + tee -a $files_split > $files_split.tmp + + if [ $edition = base ] + then + # Calculate package-minimal size, uncompressed and compressed + mkdir -p calculate/texmf-dist + tar xf $texmf/$package.tar.xz -C calculate/texmf-dist --exclude-from=$files_split.tmp + tar cf calculate/calc.tar.xz -I 'xz' calculate/texmf-dist + size_minimal=$(du -bc calculate/calc.tar.xz | tail -n1 | sed "s/[[:space:]].*//") + size_minimal_uncompressed="$(xz -l --verbose calculate/calc.tar.xz | grep "Uncompressed size" | cut -d'(' -f2 | cut -d' ' -f1 )" + sed -i \ + -e "s/^[0-9]* byte, $package: /$size_minimal byte, $package-minimal: /" \ + $output.base.meta + sed -i \ + -e "s/^[0-9]* byte, $package: /$size_minimal_uncompressed byte, $package-minimal: /" \ + $output.base.meta.uncompressed + rm -rf calculate + fi + + if [ $edition = extra ] + then + mkdir -p calculate/texmf-dist + tar xf $texmf/${package}.tar.xz -C calculate/texmf-dist $(paste $files_split.tmp) + tar cf calculate/calc.tar.xz -I 'xz' calculate/texmf-dist + size_extended=$(du -bc calculate/calc.tar.xz | tail -n1 | sed "s/[[:space:]].*//") + size_extended_uncompressed="$(xz -l --verbose calculate/calc.tar.xz | \ + grep "Uncompressed size" | cut -d'(' -f2 | cut -d' ' -f1 )" + + # put new sizes in package index uncompressed + sed -i \ + -e "s/^[0-9]* byte, $package: /$size_extended byte, $package-extended: /" \ + $output.extra.meta + sed -i \ + -e "s/^[0-9]* byte, $package: /$size_extended_uncompressed byte, $package-extended: /" \ + $output.extra.meta.uncompressed + rm -rf calculate + + # put map files from splitted packages in -extra + mkdir meta_tmp + tar xf $texmf/${package}.tar.xz -C meta_tmp tlpkg/tlpobj/$package.tlpobj + grep ^'execute ' meta_tmp/tlpkg/tlpobj/$package.tlpobj | \ + grep Map | cut -d' ' -f2- | sed "s/^add//g" >> $updmap.$edition + rm -rf meta_tmp + fi + + # untar to provide files for -extra + tar xf $texmf/${package}.tar.xz $relocated $(paste $files_split.tmp) +done + +# cleanup +rm $files_split.tmp + +# fix relocation in index for splitted packages +sed -i \ + -e "s|^doc|texmf-dist\/doc|g" \ + -e "s|^fonts|texmf-dist\/fonts|g" \ + -e "s|^dvips|texmf-dist\/dvips|g" \ + $files_split + +# sort meta data about added packages +sort -n $output.$edition.meta > $tmpfile +mv $tmpfile $output.$edition.meta +sort -n $output.$edition.meta.uncompressed > $tmpfile +mv $tmpfile $output.$edition.meta.uncompressed + +sort -u $binary_removed.$edition > $tmpfile +mv $tmpfile $binary_removed.$edition + +# include manpages/GNU infofiles in -base, write index for later exclusion from other editions. +# In -extra/-docs there should not be any manpage left. +echo "Looking for manpages/GNU infofiles to be included in -base ..." +for package in $(paste -s $packages_base.doc | sort -u) +do + if [ -n "$(grep -E "(doc/man/man|doc/info/)" $texmf/$package.meta )" ] + then + echo "Adding manpage from $package.doc 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 tf $texmf/${package}.doc.tar.xz | sed \ + -ne "/.*doc\/man\/.*\.1$/p" \ + -ne "/.*doc\/man\/.*\.5$/p" \ + -ne "/.*doc\/info\/.*\.info$/p" \ + | tee -a $manpages > $manpages.tmp + # untar to provide files for -/extra/-docs + tar xf $texmf/${package}.doc.tar.xz $relocated $(paste $manpages.tmp) + echo "$package" >> $packages_manpages + fi +done + +# cleanup +rm $manpages.tmp +sed -i \ + -e "s/^doc/texmf-dist\/doc/g" \ + $manpages + +case $edition in + base) + # Content info + cat << EOF | gzip -9 >> $texmf/texmf-dist/packages.$edition.gz +Content of -$edition: +$(sed "/-linux$/d" $packages_base | sort) +EOF + # create texdoc cache file + if [ $(command -v texdoc) ] + then + mkdir -p texmf-dist/scripts/texdoc || exit 1 + TEXMFVAR=$texmf/texmf-dist \ + texdoc -c texlive_tlpdb=$TMP/texlive.tlpdb.orig \ + -DlM texlive-en >/dev/null 2>&1 + mv texmf-dist/texdoc/cache-tlpdb.lua \ + texmf-dist/scripts/texdoc/Data.tlpdb.lua || exit 1 + # add cache to tarball + tar rf $tarball --owner=0 --group=0 --sort=name \ + texmf-dist/scripts/texdoc/Data.tlpdb.lua || exit 1 + else + echo "WARNING: texdoc binary(comming with texlive) is not installed, the texdoc cache" + echo "Data.tlpdb.lua can't be created and wont't be available." + echo "Texdoc will not wotk without this." + echo "" + echo "Continue with any key or abort with ctrl-c" + read -n1 + fi + + # prepare updmap.cfg + tar xf $tarball texmf-dist/web2c/updmap.cfg + end_n="$(grep -n 'end of updmap-hdr' texmf-dist/web2c/updmap.cfg | cut -d':' -f1)" + + sed "1,${end_n}!d" texmf-dist/web2c/updmap.cfg > $TMP/updmap.cfg.tmp + cat $updmap.$edition >> $TMP/updmap.cfg.tmp + mv $TMP/updmap.cfg.tmp texmf-dist/web2c/updmap.cfg + tar f $tarball --delete texmf-dist/web2c/updmap.cfg + tar rf $tarball --owner=0 --group=0 --sort=name \ + texmf-dist/web2c/updmap.cfg + + # add manpages/GNU infofiles to the tarball + tar rf $tarball --owner=0 --group=0 --sort=name \ + texmf-dist/doc/man/ texmf-dist/doc/info/ \ + texmf-dist/packages.$edition.gz \ + || exit 1 + echo "Removing files -from base, splitted from special packages to be included in -extra" + tar f $tarball --delete $(paste $files_split) || exit 1 + ;; + extra) + echo "Removing manpages from $edition which now reside in -base" + tar f $tarball --delete $(paste $manpages) 2>/dev/null + # content info + echo "Content of -$edition, including documentation:" > $texmf/texmf-dist/packages.$edition + sed "/-linux$/d" $TMP/packages.$edition | sort >> $texmf/texmf-dist/packages.$edition + gzip -9 $texmf/texmf-dist/packages.$edition + + # add -extra updmap.cfg + mkdir -p $texmf/texmf-dist/web2c + mv $updmap.$edition $texmf/texmf-dist/web2c + tar rf $tarball --owner=0 --group=0 --sort=name \ + --exclude texmf-dist/doc \ + texmf-dist \ + || exit 1 + ;; + docs) + # add docs splittet from base from special packages, add packages index + # content info, this edition contains all docs from -base + 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/doc/ \ + texmf-dist/packages.$edition.gz \ + || exit 1 + echo "Removing manpages from $edition which now reside in -base" + tar f $tarball --delete $(paste $manpages) || exit 1 + ;; +esac + +rm -rf texmf-dist +[ -f $updmap.$edition ] && rm $updmap.$edition + +# compress the tarball as everything is in place now +echo "Compressing $tarball ..." +[ -f $tarball.xz ] && rm $tarball.xz +xz -T0 $tarball || exit 1 +ls -lh $tarball.xz +echo "Logfile: $logfile" + +# End of story diff --git a/patches/source/texlive/slack-desc b/patches/source/texlive/slack-desc new file mode 100644 index 000000000..2534a9e3a --- /dev/null +++ b/patches/source/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 included in 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 and texlive-docs packages. +texlive: +texlive: diff --git a/patches/source/texlive/texlive-20230313-source-security_fix-1.patch b/patches/source/texlive/texlive-20230313-source-security_fix-1.patch new file mode 100644 index 000000000..cdce6e558 --- /dev/null +++ b/patches/source/texlive/texlive-20230313-source-security_fix-1.patch @@ -0,0 +1,2034 @@ +Submitted By: Ken Moffat +Date: 2023-05-04 +Initial Package Version: 20230313 +Upstream Status: Applied +Origin: Upstream +Description: LuaTeX fixes for obscure ways to work around some security features. + +On this occasion I've taken the three commits in the mirror which were +relevant to this, and omitted the many other fixes, some of which are +only parts of an svn commit with other changes for texmf-dist (not in the +git mirror) and other fixes for minor issues in japanese variants, some +of which are very large commits. I have therefore also ignored the +change to fix the uuptex test. + +From ad8702a45e317fa9d396ef4d50467c37964a9543 Mon Sep 17 00:00:00 2001 +From: Luigi Scarso +Date: Fri, 31 Mar 2023 20:15:48 +0000 +Subject: [PATCH 15/39] Bump to version 1.16.1; bugfix for setpdforigin() (A. + Matthias) + +git-svn-id: svn://tug.org/texlive/trunk/Build/source@66717 c570f23f-e606-0410-a88d-b1316a301751 +--- + texk/web2c/luatexdir/ChangeLog | 5 ++++- + texk/web2c/luatexdir/lua/lpdflib.c | 2 +- + texk/web2c/luatexdir/luatex.c | 4 ++-- + texk/web2c/luatexdir/luatex_svnversion.h | 2 +- + 4 files changed, 8 insertions(+), 5 deletions(-) + +diff --git a/texk/web2c/luatexdir/ChangeLog b/texk/web2c/luatexdir/ChangeLog +index 868f64cc3..27fbebcbb 100644 +--- a/texk/web2c/luatexdir/ChangeLog ++++ b/texk/web2c/luatexdir/ChangeLog +@@ -1,5 +1,8 @@ ++2023-03-30 Luigi Scarso ++ * bugfix for setpdforigin() (A. Matthias) ++ + 2023-02-22 Luigi Scarso +- * fix latelua data reference (side effect of deferred late additions) (H.Hagen) ++ * fix latelua data reference (side effect of deferred late additions) (H.Hagen) + + 2023-02-18 Luigi Scarso + * Fixed the "Invalid unicode ranges in CMap beginbfrange operator bug" as in pdfTeX (Hàn Thế Thành) +diff --git a/texk/web2c/luatexdir/lua/lpdflib.c b/texk/web2c/luatexdir/lua/lpdflib.c +index 70fbde76b..263fd5644 100644 +--- a/texk/web2c/luatexdir/lua/lpdflib.c ++++ b/texk/web2c/luatexdir/lua/lpdflib.c +@@ -1048,7 +1048,7 @@ static int setpdforigin(lua_State * L) + if (lua_type(L, 1) == LUA_TNUMBER) { + h = (int) lua_roundnumber(L, 1); + if (lua_type(L, 2) == LUA_TNUMBER) { +- v = (int) lua_roundnumber(L, 1); ++ v = (int) lua_roundnumber(L, 2); + } else { + v = h; + } +diff --git a/texk/web2c/luatexdir/luatex.c b/texk/web2c/luatexdir/luatex.c +index c11b0ca62..40eaa2a11 100644 +--- a/texk/web2c/luatexdir/luatex.c ++++ b/texk/web2c/luatexdir/luatex.c +@@ -33,8 +33,8 @@ + */ + + int luatex_version = 116; +-int luatex_revision = '0'; +-const char *luatex_version_string = "1.16.0"; ++int luatex_revision = '1'; ++const char *luatex_version_string = "1.16.1"; + const char *engine_name = my_name; + + #include +diff --git a/texk/web2c/luatexdir/luatex_svnversion.h b/texk/web2c/luatexdir/luatex_svnversion.h +index 257aec718..76d929807 100644 +--- a/texk/web2c/luatexdir/luatex_svnversion.h ++++ b/texk/web2c/luatexdir/luatex_svnversion.h +@@ -1,4 +1,4 @@ + #ifndef luatex_svn_revision_h + #define luatex_svn_revision_h +-#define luatex_svn_revision 7567 ++#define luatex_svn_revision 7569 + #endif +-- +2.39.2 + +From 6ace460233115bd42b36e63c7ddce11cc92a1ebd Mon Sep 17 00:00:00 2001 +From: Luigi Scarso +Date: Sat, 29 Apr 2023 14:41:51 +0000 +Subject: [PATCH 36/39] LuaTeX 1.17.0 . + +git-svn-id: svn://tug.org/texlive/trunk/Build/source@66967 c570f23f-e606-0410-a88d-b1316a301751 +--- + texk/web2c/luatexdir/ChangeLog | 31 + + texk/web2c/luatexdir/NEWS | 24 + + texk/web2c/luatexdir/font/writettf.c | 3 +- + texk/web2c/luatexdir/lua/llualib.c | 10 +- + texk/web2c/luatexdir/lua/loslibext.c | 171 +++ + texk/web2c/luatexdir/lua/luainit.c | 39 +- + texk/web2c/luatexdir/lua/luastuff.c | 20 +- + texk/web2c/luatexdir/lua/luatex-api.h | 1 + + texk/web2c/luatexdir/lua/luatex-core.c | 1225 +++++++++-------- + texk/web2c/luatexdir/lua/luatex-core.lua | 24 +- + .../luatexdir/luafontloader/src/luafflib.c | 1 - + .../luatexdir/luasocket/src/lua_preload.c | 9 + + texk/web2c/luatexdir/luatex.c | 6 +- + texk/web2c/luatexdir/luatex_svnversion.h | 2 +- + texk/web2c/luatexdir/tex/texnodes.c | 2 +- + 15 files changed, 932 insertions(+), 636 deletions(-) + +diff --git a/texk/web2c/luatexdir/ChangeLog b/texk/web2c/luatexdir/ChangeLog +index 27fbebcbb..f182f16e4 100644 +--- a/texk/web2c/luatexdir/ChangeLog ++++ b/texk/web2c/luatexdir/ChangeLog +@@ -1,3 +1,34 @@ ++2023-04-29 Luigi Scarso ++ * LuaTeX 1.17.0 ++ ++2023-04-28 Luigi Scarso ++ * new option --no-socket, same as --nosocket ++ ++2023-04-27 Luigi Scarso ++ * new option --socket to split socket and shell escape; ++ * the mime library is always available (Max Chernoff); ++ * Fixed ChangeLog ++ ++2023-04-25 Luigi Scarso ++ * socket library by default not enabled; ++ it is enabled with --shell-escape but not with --shell-restricted. ++ The option ---nosocket remains unchanged. ++ The two new functions os.socketgettime and os.socketsleep are ++ like socket.gettime and socket.sleep, but they are always available. ++ * Luatex 1.17.0 ++ ++2023-04-24 Luigi Scarso ++ * static kpse.check_permissions in os.kpsepopen ++ * Fixed date in ChangeLog ++ ++2023-04-23 Luigi Scarso ++ * new os.kpsepopen -- replace io.popen if kpse is active. ++ * Luatex 1.16.2 ++ ++2023-04-18 Luigi Scarso ++ * lua.setluaname(n, s) and lua.getluaname(n): ++ fixed mismatch between documentation and implementation (J. Friedrich). ++ + 2023-03-30 Luigi Scarso + * bugfix for setpdforigin() (A. Matthias) + +diff --git a/texk/web2c/luatexdir/NEWS b/texk/web2c/luatexdir/NEWS +index 8557c139d..41d6d4d14 100644 +--- a/texk/web2c/luatexdir/NEWS ++++ b/texk/web2c/luatexdir/NEWS +@@ -1,3 +1,27 @@ ++============================================================== ++LuaTeX 1.17.0 2023-04-29 ++============================================================== ++ ++- A breaking backward compatibility change: by default the socket ++ library is not enabled . ++ The new option --socket enable the socket library as ++ before, as also --shell-escape (without --shell-restricted); ++ --nosocket, --no-socket , --safer disabled the library, and ++ they have the priority in case of conflicting options. ++ The mime library is always available; socket.sleep ++ and socket.gettime are duplicated as os.socketsleep ++ and os.socketgettime, both always available. ++ The new os.kpsepopen replace io.popopen in kpse mode ++ (i.e. when kpse_init is not zero) as it was before ++ but the permission now cannot be changed anymore with ++ kpse.check_permission . ++ The function os.kpsepopen follows the same restrictions ++ as io.popen . ++ Thanks to Max Chernoff for debugging. ++ ++ ++ ++ + ============================================================== + LuaTeX 1.16.0 2023-02-19 + ============================================================== +diff --git a/texk/web2c/luatexdir/font/writettf.c b/texk/web2c/luatexdir/font/writettf.c +index cf034e98d..6270cbf04 100644 +--- a/texk/web2c/luatexdir/font/writettf.c ++++ b/texk/web2c/luatexdir/font/writettf.c +@@ -1518,7 +1518,7 @@ static void do_writeotf(PDF pdf, fd_entry * fd) + if (tracefilenames) + tex_printf("<<%s", cur_file_name); + ttf_read_tabdir(); +- /*tex Read teh font parameters. */ ++ /*tex Read the font parameters. */ + if (ttf_name_lookup("head", false) != NULL) + ttf_read_head(); + if (ttf_name_lookup("hhea", false) != NULL) +@@ -1570,4 +1570,3 @@ void writeotf(PDF pdf, fd_entry * fd) + xfree(ttf_buffer); + cur_file_name = NULL; + } +- +diff --git a/texk/web2c/luatexdir/lua/llualib.c b/texk/web2c/luatexdir/lua/llualib.c +index 0586aba02..d91a9a729 100644 +--- a/texk/web2c/luatexdir/lua/llualib.c ++++ b/texk/web2c/luatexdir/lua/llualib.c +@@ -319,8 +319,8 @@ static int set_luaname(lua_State * L) + { + int k; + const char *s; +- if (lua_gettop(L) == 3) { +- k = (int) luaL_checkinteger(L, 2); ++ if (lua_gettop(L) == 2) { ++ k = (int) luaL_checkinteger(L, 1); + if (k > 65535 || k < 0) { + /* error */ + } else { +@@ -328,8 +328,8 @@ static int set_luaname(lua_State * L) + free(luanames[k]); + luanames[k] = NULL; + } +- if (lua_type(L,3) == LUA_TSTRING) { +- s = lua_tostring(L, 3); ++ if (lua_type(L, 2) == LUA_TSTRING) { ++ s = lua_tostring(L, 2); + if (s != NULL) + luanames[k] = xstrdup(s); + } +@@ -340,7 +340,7 @@ static int set_luaname(lua_State * L) + + static int get_luaname(lua_State * L) + { +- int k = (int) luaL_checkinteger(L, 2); ++ int k = (int) luaL_checkinteger(L, 1); + if (k > 65535 || k < 0) { + /* error */ + lua_pushnil(L); +diff --git a/texk/web2c/luatexdir/lua/loslibext.c b/texk/web2c/luatexdir/lua/loslibext.c +index 2e6befc2d..79368ef92 100644 +--- a/texk/web2c/luatexdir/lua/loslibext.c ++++ b/texk/web2c/luatexdir/lua/loslibext.c +@@ -1047,6 +1047,167 @@ static int os_execute(lua_State * L) + } + + ++/* ++** ====================================================== ++** l_kpse_popen spawns a new process connected to the current ++** one through the file streams with some checks by kpse. ++** Almost verbatim from Lua liolib.c . ++** ======================================================= ++*/ ++#if !defined(l_kpse_popen) /* { */ ++ ++#if defined(LUA_USE_POSIX) /* { */ ++ ++#define l_kpse_popen(L,c,m) (fflush(NULL), popen(c,m)) ++#define l_kpse_pclose(L,file) (pclose(file)) ++ ++#elif defined(LUA_USE_WINDOWS) /* }{ */ ++ ++#define l_kpse_popen(L,c,m) (_popen(c,m)) ++#define l_kpse_pclose(L,file) (_pclose(file)) ++ ++#else /* }{ */ ++ ++/* ISO C definitions */ ++#define l_kpse_popen(L,c,m) \ ++ ((void)((void)c, m), \ ++ luaL_error(L, "'popen' not supported"), \ ++ (FILE*)0) ++#define l_kpse_pclose(L,file) ((void)L, (void)file, -1) ++ ++#endif /* } */ ++ ++#endif /* } */ ++typedef luaL_Stream LStream; ++#define tolstream(L) ((LStream *)luaL_checkudata(L, 1, LUA_FILEHANDLE)) ++static LStream *newprefile (lua_State *L) { ++ LStream *p = (LStream *)lua_newuserdata(L, sizeof(LStream)); ++ p->closef = NULL; /* mark file handle as 'closed' */ ++ luaL_setmetatable(L, LUA_FILEHANDLE); ++ return p; ++} ++static int io_kpse_pclose (lua_State *L) { ++ LStream *p = tolstream(L); ++ return luaL_execresult(L, l_kpse_pclose(L, p->f)); ++} ++static int io_kpse_check_permissions(lua_State *L) { ++ const char *filename = luaL_checkstring(L, 1); ++ if (filename == NULL) { ++ lua_pushboolean(L,0); ++ lua_pushliteral(L,"no command name given"); ++ } else if (shellenabledp <= 0) { ++ lua_pushboolean(L,0); ++ lua_pushliteral(L,"all command execution is disabled"); ++ } else if (restrictedshell == 0) { ++ lua_pushboolean(L,1); ++ lua_pushstring(L,filename); ++ } else { ++ char *safecmd = NULL; ++ char *cmdname = NULL; ++ switch (shell_cmd_is_allowed(filename, &safecmd, &cmdname)) { ++ case 0: ++ lua_pushboolean(L,0); ++ lua_pushliteral(L, "specific command execution disabled"); ++ break; ++ case 1: ++ /* doesn't happen */ ++ lua_pushboolean(L,1); ++ lua_pushstring(L,filename); ++ break; ++ case 2: ++ lua_pushboolean(L,1); ++ lua_pushstring(L,safecmd); ++ break; ++ default: ++ /* -1 */ ++ lua_pushboolean(L,0); ++ lua_pushliteral(L, "bad command line quoting"); ++ break; ++ } ++ } ++ return 2; ++} ++static int io_kpse_popen (lua_State *L) { ++ const char *filename = NULL; ++ const char *mode = NULL; ++ LStream *p = NULL; ++ int okay; ++ filename = luaL_checkstring(L, 1); ++ mode = luaL_optstring(L, 2, "r"); ++ lua_pushstring(L,filename); ++ io_kpse_check_permissions(L); ++ filename = luaL_checkstring(L, -1); ++ okay = lua_toboolean(L,-2); ++ if (okay && filename) { ++ p = newprefile(L); ++ luaL_argcheck(L, ((mode[0] == 'r' || mode[0] == 'w') && mode[1] == '\0'), ++ 2, "invalid mode"); ++ p->f = l_kpse_popen(L, filename, mode); ++ p->closef = &io_kpse_pclose; ++ return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1; ++ } else { ++ lua_pushnil(L); ++ lua_pushvalue(L,-2); ++ return 2; ++ } ++} ++ ++ ++ ++/* socket.sleep and socket.gettime */ ++/* are duplicated here, and they are */ ++/* always available (the socket library */ ++/* can be nil in some setups) */ ++#ifdef _WIN32 ++static int socket_timeout_lua_sleep(lua_State *L) ++{ ++ double n = luaL_checknumber(L, 1); ++ if (n < 0.0) n = 0.0; ++ if (n < DBL_MAX/1000.0) n *= 1000.0; ++ if (n > INT_MAX) n = INT_MAX; ++ Sleep((int)n); ++ return 0; ++} ++static double socket_timeout_gettime(void) { ++ FILETIME ft; ++ double t; ++ GetSystemTimeAsFileTime(&ft); ++ /* Windows file time (time since January 1, 1601 (UTC)) */ ++ t = ft.dwLowDateTime/1.0e7 + ft.dwHighDateTime*(4294967296.0/1.0e7); ++ /* convert to Unix Epoch time (time since January 1, 1970 (UTC)) */ ++ return (t - 11644473600.0); ++} ++#else ++static int socket_timeout_lua_sleep(lua_State *L) ++{ ++ double n = luaL_checknumber(L, 1); ++ struct timespec t, r; ++ if (n < 0.0) n = 0.0; ++ if (n > INT_MAX) n = INT_MAX; ++ t.tv_sec = (int) n; ++ n -= t.tv_sec; ++ t.tv_nsec = (int) (n * 1000000000); ++ if (t.tv_nsec >= 1000000000) t.tv_nsec = 999999999; ++ while (nanosleep(&t, &r) != 0) { ++ t.tv_sec = r.tv_sec; ++ t.tv_nsec = r.tv_nsec; ++ } ++ return 0; ++} ++static double socket_timeout_gettime(void) { ++ struct timeval v; ++ gettimeofday(&v, (struct timezone *) NULL); ++ /* Unix Epoch time (time since January 1, 1970 (UTC)) */ ++ return v.tv_sec + v.tv_usec/1.0e6; ++} ++#endif ++static int socket_timeout_lua_gettime(lua_State *L) ++{ ++ lua_pushnumber(L, socket_timeout_gettime()); ++ return 1; ++} ++ ++ + void open_oslibext(lua_State * L) + { + +@@ -1081,5 +1242,15 @@ void open_oslibext(lua_State * L) + lua_pushcfunction(L, os_tmpdir); + lua_setfield(L, -2, "tmpdir"); + ++ lua_pushcfunction(L, io_kpse_popen); ++ lua_setfield(L, -2, "kpsepopen"); ++ ++ lua_pushcfunction(L, socket_timeout_lua_sleep); ++ lua_setfield(L, -2, "socketsleep"); ++ ++ lua_pushcfunction(L, socket_timeout_lua_gettime); ++ lua_setfield(L, -2, "socketgettime"); ++ ++ + lua_pop(L, 1); /* pop the table */ + } +diff --git a/texk/web2c/luatexdir/lua/luainit.c b/texk/web2c/luatexdir/lua/luainit.c +index 9eecb714c..bac5444c2 100644 +--- a/texk/web2c/luatexdir/lua/luainit.c ++++ b/texk/web2c/luatexdir/lua/luainit.c +@@ -85,6 +85,8 @@ const_string LUATEX_IHELP[] = { + " --lua=FILE load and execute a lua initialization script", + " --[no-]mktex=FMT disable/enable mktexFMT generation (FMT=tex/tfm)", + " --nosocket disable the lua socket library", ++ " --no-socket disable the lua socket library", ++ " --socket enable the lua socket library", + " --output-comment=STRING use STRING for DVI file comment instead of date (no effect for PDF)", + " --output-directory=DIR use existing DIR as the directory to write files in", + " --output-format=FORMAT use FORMAT for job output; FORMAT is 'dvi' or 'pdf'", +@@ -108,6 +110,7 @@ const_string LUATEX_IHELP[] = { + #endif + "", + "See the reference manual for more information about the startup process.", ++ "LuaTeX package page: https://ctan.org/pkg/luatex", + NULL + }; + +@@ -212,9 +215,30 @@ char *jithash_hashname = NULL; + #endif + + int safer_option = 0; +-int nosocket_option = 0; ++int nosocket_option = 1; ++int nosocket_cli_option = 0; ++int yessocket_cli_option = 0; ++int socket_bitmask = 0; + int utc_option = 0; + ++/*tex We use a bitmask for the socket library: |0000| and |1xxx| implies |--nosocket|, ++ otherwise the socket library is enabled. Default value is |0000|, i.e. |--nosocket|. ++*/ ++#define UPDATE_SOCKET_STATUS() do { \ ++ socket_bitmask = 0; \ ++ socket_bitmask = safer_option==1? (8+socket_bitmask):socket_bitmask;\ ++ socket_bitmask = nosocket_cli_option==1? (4+socket_bitmask):socket_bitmask;\ ++ socket_bitmask = (shellenabledp == 1 && restrictedshell == 0)?(2+socket_bitmask):socket_bitmask;\ ++ socket_bitmask = yessocket_cli_option==1? (1+socket_bitmask):socket_bitmask;\ ++ if( socket_bitmask==0) { \ ++ nosocket_option = 1; \ ++ } else if ( socket_bitmask<4) { \ ++ nosocket_option = 0; \ ++ } else { \ ++ nosocket_option = 1; \ ++ } \ ++} while (0) ++ + /*tex + + Test whether getopt found an option ``A''. Assumes the option index is in the +@@ -242,7 +266,9 @@ static struct option long_options[] = { + #endif + {"safer", 0, &safer_option, 1}, + {"utc", 0, &utc_option, 1}, +- {"nosocket", 0, &nosocket_option, 1}, ++ {"nosocket", 0, &nosocket_cli_option, 1}, ++ {"no-socket", 0, &nosocket_cli_option, 1}, ++ {"socket", 0, &yessocket_cli_option, 1}, + {"help", 0, 0, 0}, + {"ini", 0, &ini_version, 1}, + {"interaction", 1, 0, 0}, +@@ -524,14 +550,11 @@ static void parse_options(int ac, char **av) + input_name = xstrdup(sargv[sargc-1]); + sargv[sargc-1] = normalize_quotes(input_name, "argument"); + } +- if (safer_option) /* --safer implies --nosocket */ +- nosocket_option = 1; ++ UPDATE_SOCKET_STATUS(); + return; + #endif + } +- /*tex |--safer| implies |--nosocket| */ +- if (safer_option) +- nosocket_option = 1; ++ UPDATE_SOCKET_STATUS(); + /*tex Finalize the input filename. */ + if (input_name != NULL) { + argv[optind] = normalize_quotes(input_name, "argument"); +@@ -981,6 +1004,7 @@ void lua_initialize(int ac, char **av) + shellenabledp = true; + restrictedshell = false; + safer_option = 0; ++ nosocket_option = 0; + } + /*tex + Get the current locale (it should be |C|) and save |LC_CTYPE|, |LC_COLLATE| +@@ -1149,6 +1173,7 @@ void lua_initialize(int ac, char **av) + } + free(v1); + } ++ UPDATE_SOCKET_STATUS(); + /*tex If shell escapes are restricted, get allowed cmds from cnf. */ + if (shellenabledp && restrictedshell == 1) { + v1 = NULL; +diff --git a/texk/web2c/luatexdir/lua/luastuff.c b/texk/web2c/luatexdir/lua/luastuff.c +index 4176431ed..62d21c321 100644 +--- a/texk/web2c/luatexdir/lua/luastuff.c ++++ b/texk/web2c/luatexdir/lua/luastuff.c +@@ -323,7 +323,8 @@ void luainterpreter(void) + /*tex + The socket and mime libraries are a bit tricky to open because they use a + load-time dependency that has to be worked around for luatex, where the C +- module is loaded way before the lua module. ++ module is loaded way before the lua module. ++ The mime library is always available, even if the socket library is not enabled. + */ + if (!nosocket_option) { + /* todo: move this to common */ +@@ -348,6 +349,23 @@ void luainterpreter(void) + lua_pop(L, 2); + /*tex preload the pure \LUA\ modules */ + luatex_socketlua_open(L); ++ } else { ++ lua_getglobal(L, "package"); ++ lua_getfield(L, -1, "loaded"); ++ if (!lua_istable(L, -1)) { ++ lua_newtable(L); ++ lua_setfield(L, -2, "loaded"); ++ lua_getfield(L, -1, "loaded"); ++ } ++ /*tex |package.loaded.mime = nil| */ ++ luaopen_mime_core(L); ++ lua_setfield(L, -2, "mime.core"); ++ lua_pushnil(L); ++ lua_setfield(L, -2, "mime"); ++ /*tex pop the table */ ++ lua_pop(L, 1); ++ /*tex preload the pure \LUA\ mime module */ ++ luatex_socketlua_safe_open(L); + } + luaopen_zlib(L); + luaopen_gzip(L); +diff --git a/texk/web2c/luatexdir/lua/luatex-api.h b/texk/web2c/luatexdir/lua/luatex-api.h +index 553be2c18..3ade2bc4d 100644 +--- a/texk/web2c/luatexdir/lua/luatex-api.h ++++ b/texk/web2c/luatexdir/lua/luatex-api.h +@@ -123,6 +123,7 @@ extern int luaopen_profiler(lua_State * L); + extern int luaopen_socket_core(lua_State * L); + extern int luaopen_mime_core(lua_State * L); + extern void luatex_socketlua_open(lua_State * L); ++extern void luatex_socketlua_safe_open(lua_State * L); + + extern int luaopen_img(lua_State * L); + extern int l_new_image(lua_State * L); +diff --git a/texk/web2c/luatexdir/lua/luatex-core.c b/texk/web2c/luatexdir/lua/luatex-core.c +index c9c4d941b..d912bf4a5 100644 +--- a/texk/web2c/luatexdir/lua/luatex-core.c ++++ b/texk/web2c/luatexdir/lua/luatex-core.c +@@ -27,7 +27,7 @@ int load_luatex_core_lua (lua_State * L) + 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x65, 0x61, + 0x6d, 0x27, 0x2c, 0x0a, 0x2d, 0x2d, 0x20, 0x7d, 0x0a, 0x0a, 0x4c, 0x55, 0x41, 0x54, 0x45, 0x58, + 0x43, 0x4f, 0x52, 0x45, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3d, 0x20, 0x31, 0x2e, +- 0x31, 0x35, 0x31, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x65, 0x20, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, ++ 0x31, 0x36, 0x31, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x65, 0x20, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x20, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, +@@ -53,632 +53,645 @@ int load_luatex_core_lua (lua_State * L) + 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x0a, 0x2d, 0x2d, 0x20, 0x61, 0x72, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, +- 0x20, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, +- 0x73, 0x61, 0x66, 0x65, 0x72, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x74, +- 0x61, 0x74, 0x75, 0x73, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x72, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, +- 0x6e, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x63, +- 0x61, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x73, 0x68, 0x65, +- 0x6c, 0x6c, 0x5f, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x20, 0x2d, 0x2d, 0x20, 0x30, 0x20, 0x28, +- 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x29, 0x20, 0x31, 0x20, 0x28, 0x61, 0x6e, 0x79, +- 0x74, 0x68, 0x69, 0x6e, 0x67, 0x29, 0x20, 0x32, 0x20, 0x28, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, +- 0x63, 0x74, 0x65, 0x64, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x70, 0x73, 0x65, +- 0x75, 0x73, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, +- 0x2e, 0x6b, 0x70, 0x73, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, +- 0x20, 0x30, 0x20, 0x31, 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, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x79, +- 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x73, 0x75, +- 0x62, 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, 0x69, 0x6e, 0x64, 0x20, 0x3d, +- 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, +- 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x69, 0x6f, 0x2e, +- 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, +- 0x6c, 0x20, 0x6d, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6d, 0x74, 0x2e, 0x6c, 0x69, 0x6e, +- 0x65, 0x73, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x70, +- 0x73, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, +- 0x6f, 0x6e, 0x20, 0x20, 0x3d, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, +- 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, +- 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, +- 0x64, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x6b, 0x70, +- 0x73, 0x65, 0x2e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, +- 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, +- 0x70, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, +- 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x2e, 0x72, 0x65, 0x63, 0x6f, +- 0x72, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x0a, +- 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, +- 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x70, +- 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, +- 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 0x20, +- 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x0a, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, +- 0x5f, 0x6e, 0x6c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x69, 0x6f, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6e, +- 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 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, 0x20, 0x20, 0x20, 0x20, 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, 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, +- 0x20, 0x20, 0x20, 0x20, 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, +- 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, 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, 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, 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, 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, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x63, +- 0x6f, 0x72, 0x64, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x61, +- 0x6d, 0x65, 0x2c, 0x27, 0x77, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x5f, 0x72, 0x65, +- 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x61, +- 0x6d, 0x65, 0x2c, 0x27, 0x72, 0x27, 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, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, +- 0x72, 0x6e, 0x20, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 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, ++ 0x20, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x0a, 0x0a, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, ++ 0x6c, 0x20, 0x73, 0x61, 0x66, 0x65, 0x72, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, ++ 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x72, 0x5f, 0x6f, 0x70, 0x74, ++ 0x69, 0x6f, 0x6e, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x65, ++ 0x73, 0x63, 0x61, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x73, ++ 0x68, 0x65, 0x6c, 0x6c, 0x5f, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x20, 0x2d, 0x2d, 0x20, 0x30, ++ 0x20, 0x28, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x29, 0x20, 0x31, 0x20, 0x28, 0x61, ++ 0x6e, 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x29, 0x20, 0x32, 0x20, 0x28, 0x72, 0x65, 0x73, 0x74, ++ 0x72, 0x69, 0x63, 0x74, 0x65, 0x64, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x70, ++ 0x73, 0x65, 0x75, 0x73, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, ++ 0x75, 0x73, 0x2e, 0x6b, 0x70, 0x73, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, ++ 0x2d, 0x2d, 0x20, 0x30, 0x20, 0x31, 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, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, ++ 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, ++ 0x73, 0x75, 0x62, 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, 0x69, 0x6e, 0x64, ++ 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x0a, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x69, ++ 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, ++ 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6d, 0x74, 0x2e, 0x6c, ++ 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, ++ 0x6b, 0x70, 0x73, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, ++ 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x20, 0x3d, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x2e, 0x63, 0x68, 0x65, ++ 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, ++ 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x63, ++ 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x20, 0x3d, 0x20, ++ 0x6b, 0x70, 0x73, 0x65, 0x2e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x69, 0x6e, 0x70, 0x75, ++ 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, ++ 0x20, 0x6b, 0x70, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x75, 0x74, 0x70, ++ 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x2e, 0x72, 0x65, ++ 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, ++ 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x6f, ++ 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x2d, 0x2d, 0x20, 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, 0x20, 0x20, 0x3d, ++ 0x20, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x2d, 0x2d, 0x20, 0x6e, 0x6f, 0x74, ++ 0x20, 0x6e, 0x65, 0x65, 0x64, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, ++ 0x73, 0x2e, 0x6b, 0x70, 0x73, 0x65, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6f, ++ 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 0x20, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6f, 0x2e, 0x72, 0x65, ++ 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, ++ 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x6c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x69, 0x6f, 0x2e, ++ 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 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, 0x20, 0x20, 0x20, 0x20, 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, 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, 0x20, 0x20, 0x20, 0x20, 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, 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, 0x20, 0x20, 0x20, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 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, 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, 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, 0x20, 0x20, 0x20, 0x20, 0x6b, ++ 0x70, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, ++ 0x66, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x27, 0x77, 0x27, 0x29, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 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, 0x20, 0x20, 0x20, 0x20, ++ 0x6b, 0x70, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x70, 0x75, 0x74, ++ 0x66, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x27, 0x72, 0x27, 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, 0x20, ++ 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 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, 0x20, 0x20, 0x20, 0x20, 0x68, 0x6f, ++ 0x77, 0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, 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, 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, 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, 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, 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, 0x20, +- 0x20, 0x20, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x27, 0x72, 0x27, 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, 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, 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, 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, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, +- 0x72, 0x6e, 0x20, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 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, 0x20, +- 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6b, 0x61, 0x79, 0x2c, 0x20, 0x66, +- 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x6b, 0x70, 0x73, 0x65, 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, 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, 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, 0x20, 0x20, 0x20, 0x20, +- 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x2d, 0x2d, 0x20, 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, 0x2d, 0x2d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, +- 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 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, 0x2d, 0x2d, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, ++ 0x27, 0x72, 0x27, 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, 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, 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, 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, 0x20, ++ 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x20, 0x6e, 0x6f, 0x74, ++ 0x20, 0x6e, 0x65, 0x65, 0x64, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, ++ 0x73, 0x2e, 0x6b, 0x70, 0x73, 0x65, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x2d, 0x2d, 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, ++ 0x2d, 0x2d, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6b, 0x61, 0x79, ++ 0x2c, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x6b, 0x70, 0x73, 0x65, 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, 0x2d, 0x2d, 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, 0x2d, 0x2d, 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, 0x2d, 0x2d, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x2d, 0x2d, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 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, 0x2d, 0x2d, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 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, 0x2d, 0x2d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x69, 0x66, 0x20, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, ++ 0x2d, 0x20, 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, 0x2d, 0x2d, 0x20, 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, 0x2d, 0x2d, 0x20, 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, 0x2d, 0x2d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x2d, 0x2d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x2d, 0x2d, 0x20, 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, 0x2d, 0x2d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x2d, 0x2d, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, +- 0x46, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20, +- 0x74, 0x68, 0x65, 0x20, 0x67, 0x63, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x6b, +- 0x69, 0x63, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x6e, 0x65, 0x65, +- 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x69, +- 0x63, 0x69, 0x74, 0x6c, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x6f, 0x20, +- 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, +- 0x69, 0x73, 0x20, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x74, 0x79, +- 0x70, 0x65, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, +- 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, +- 0x61, 0x6d, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, ++ 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, 0x2d, 0x2d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 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, 0x2d, 0x2d, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x65, ++ 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x73, ++ 0x6f, 0x6d, 0x65, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, ++ 0x63, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x6b, 0x69, 0x63, 0x6b, 0x20, 0x69, ++ 0x6e, 0x20, 0x73, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, ++ 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x6c, 0x79, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, ++ 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, 0x66, 0x6c, ++ 0x75, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, ++ 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, ++ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 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, 0x20, 0x20, ++ 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, ++ 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 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, 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, 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, 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, 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, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, ++ 0x6c, 0x20, 0x6c, 0x20, 0x3d, 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, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, ++ 0x20, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x20, 0x3d, 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, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, +- 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, ++ 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, ++ 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, ++ 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, ++ 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, ++ 0x20, 0x77, 0x68, 0x6f, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x69, 0x74, 0x20, 0x74, 0x68, 0x69, ++ 0x73, 0x20, 0x77, 0x61, 0x79, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x70, 0x61, ++ 0x74, 0x63, 0x68, 0x65, 0x64, 0x20, 0x27, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x27, ++ 0x20, 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x27, 0x22, 0x20, 0x2e, ++ 0x2e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x27, 0x22, 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, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 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, 0x20, 0x20, ++ 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 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, 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, 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, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 0x20, 0x20, 0x20, 0x20, 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, 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, 0x2d, 0x2d, ++ 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, 0x20, 0x2d, 0x2d, 0x20, 0x6e, 0x6f, ++ 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x20, 0x75, 0x73, 0x65, 0x20, ++ 0x6f, 0x73, 0x2e, 0x6b, 0x70, 0x73, 0x65, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x73, 0x2e, 0x6b, ++ 0x70, 0x73, 0x65, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x65, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, ++ 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6c, 0x73, 0x65, ++ 0x77, 0x68, 0x65, 0x72, 0x65, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x6d, ++ 0x61, 0x79, 0x62, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, ++ 0x68, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, ++ 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, ++ 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x6c, 0x20, 0x3d, ++ 0x20, 0x74, 0x65, 0x78, 0x69, 0x6f, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x6c, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, ++ 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, ++ 0x61, 0x74, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, ++ 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, ++ 0x6d, 0x6d, 0x79, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, ++ 0x64, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 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, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, ++ 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x6c, ++ 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x73, 0x61, 0x66, 0x65, 0x72, 0x20, 0x6f, ++ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, ++ 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x71, 0x20, 0x69, 0x73, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x2c, 0x66, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x6c, 0x69, ++ 0x6d, 0x69, 0x74, 0x65, 0x64, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62, ++ 0x6c, 0x65, 0x64, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, ++ 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 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, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, +- 0x6e, 0x20, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x66, 0x6f, 0x72, 0x20, +- 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x77, 0x68, 0x6f, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x69, +- 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x77, 0x61, 0x79, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, +- 0x72, 0x28, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x20, 0x27, 0x69, 0x6f, 0x2e, 0x6c, +- 0x69, 0x6e, 0x65, 0x73, 0x27, 0x20, 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x6f, 0x70, 0x65, 0x6e, +- 0x20, 0x27, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, +- 0x27, 0x22, 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, 0x6c, 0x73, 0x65, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, +- 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 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, 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, 0x0a, 0x20, +- 0x20, 0x20, 0x20, 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, 0x20, 0x20, +- 0x20, 0x20, 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, 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, +- 0x6c, 0x73, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x65, 0x20, 0x61, +- 0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, +- 0x20, 0x65, 0x6c, 0x73, 0x65, 0x77, 0x68, 0x65, 0x72, 0x65, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, +- 0x0a, 0x2d, 0x2d, 0x20, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6f, +- 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x6b, 0x70, 0x73, 0x65, +- 0x20, 0x6d, 0x6f, 0x64, 0x65, 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, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, +- 0x5f, 0x6e, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x69, 0x6f, 0x2e, 0x77, 0x72, 0x69, 0x74, +- 0x65, 0x5f, 0x6e, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, +- 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, +- 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, +- 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, +- 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x66, 0x29, 0x0a, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, +- 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 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, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, +- 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x72, 0x69, +- 0x74, 0x65, 0x5f, 0x6e, 0x6c, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x73, 0x61, +- 0x66, 0x65, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x2c, 0x20, +- 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x71, 0x20, 0x69, 0x73, 0x20, 0x25, +- 0x73, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x2c, 0x66, 0x20, 0x61, 0x6e, +- 0x64, 0x20, 0x22, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x22, +- 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x6f, +- 0x72, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 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, 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, 0x20, 0x20, +- 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x28, 0x2e, 0x2e, 0x2e, 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, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, +- 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x6c, +- 0x69, 0x6d, 0x69, 0x74, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, +- 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, +- 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, +- 0x74, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, +- 0x79, 0x28, 0x22, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x22, 0x29, 0x0a, +- 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x73, 0x70, 0x61, 0x77, 0x6e, 0x20, 0x20, 0x20, 0x3d, +- 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6f, +- 0x73, 0x2e, 0x73, 0x70, 0x61, 0x77, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, +- 0x2e, 0x65, 0x78, 0x65, 0x63, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, +- 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, +- 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, ++ 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, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, ++ 0x75, 0x72, 0x6e, 0x20, 0x66, 0x28, 0x2e, 0x2e, 0x2e, 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, 0x6e, 0x64, 0x0a, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, ++ 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x28, ++ 0x73, 0x74, 0x72, 0x2c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, ++ 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, ++ 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3d, 0x20, ++ 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73, ++ 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, ++ 0x73, 0x2e, 0x73, 0x70, 0x61, 0x77, 0x6e, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, ++ 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73, 0x2e, 0x73, 0x70, 0x61, ++ 0x77, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, ++ 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, ++ 0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x22, 0x29, 0x0a, 0x20, 0x20, ++ 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x20, 0x3d, 0x20, 0x69, ++ 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73, 0x2e, ++ 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, ++ 0x74, 0x65, 0x6d, 0x70, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, ++ 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x64, ++ 0x69, 0x72, 0x22, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x6b, 0x70, 0x73, ++ 0x65, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, ++ 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73, 0x2e, 0x6b, 0x70, 0x73, 0x65, 0x70, 0x6f, ++ 0x70, 0x65, 0x6e, 0x22, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x70, 0x6f, ++ 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, ++ 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x22, 0x29, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, ++ 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, ++ 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x22, 0x2c, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x5f, ++ 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, ++ 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, +- 0x28, 0x22, 0x6f, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x22, 0x29, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x69, ++ 0x28, 0x22, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, ++ 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73, 0x2e, +- 0x74, 0x65, 0x6d, 0x70, 0x64, 0x69, 0x72, 0x22, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, +- 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, +- 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70, +- 0x65, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, +- 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, +- 0x6d, 0x79, 0x28, 0x22, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x22, 0x2c, 0x6c, 0x75, 0x61, +- 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, +- 0x6f, 0x6e, 0x6c, 0x79, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x72, 0x65, +- 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, +- 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, +- 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, ++ 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, ++ 0x2e, 0x74, 0x6d, 0x70, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, ++ 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x69, 0x6f, 0x2e, 0x74, 0x6d, 0x70, 0x66, ++ 0x69, 0x6c, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x75, 0x74, ++ 0x70, 0x75, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, ++ 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x69, 0x6f, 0x2e, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x29, ++ 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x63, 0x68, 0x64, 0x69, 0x72, 0x20, + 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, +- 0x22, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x29, 0x0a, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x74, 0x6d, 0x70, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x69, +- 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x69, 0x6f, 0x2e, +- 0x74, 0x6d, 0x70, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, +- 0x2e, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, +- 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x69, 0x6f, 0x2e, 0x6f, 0x75, 0x74, 0x70, +- 0x75, 0x74, 0x22, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x63, 0x68, +- 0x64, 0x69, 0x72, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, +- 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6c, 0x66, 0x73, 0x2e, 0x63, 0x68, 0x64, 0x69, 0x72, 0x22, 0x29, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x20, 0x20, +- 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, +- 0x6c, 0x66, 0x73, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, +- 0x66, 0x73, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, +- 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6c, 0x66, 0x73, 0x2e, 0x74, 0x6f, +- 0x75, 0x63, 0x68, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x72, 0x6d, +- 0x64, 0x69, 0x72, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, +- 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6c, 0x66, 0x73, 0x2e, 0x72, 0x6d, 0x64, 0x69, 0x72, 0x22, 0x29, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x20, 0x20, +- 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, +- 0x6c, 0x66, 0x73, 0x2e, 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x22, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 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, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x6d, 0x61, 0x79, 0x62, 0x65, +- 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, +- 0x69, 0x6e, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 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, +- 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x6c, 0x69, 0x62, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, +- 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, +- 0x65, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x5b, 0x34, 0x5d, 0x20, 0x3d, +- 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, +- 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, +- 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x73, 0x2e, 0x73, +- 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x66, +- 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x65, 0x6e, 0x64, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 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, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x66, 0x69, 0x20, 0x74, 0x68, +- 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 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, 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, 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, +- 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x20, 0x3d, 0x20, 0x6e, 0x69, +- 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, +- 0x61, 0x64, 0x65, 0x64, 0x2e, 0x66, 0x66, 0x69, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, +- 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, +- 0x61, 0x64, 0x2e, 0x66, 0x66, 0x69, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x0a, 0x0a, +- 0x65, 0x6e, 0x64, 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, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, 0x68, +- 0x65, 0x78, 0x61, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 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, 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, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x22, 0x6c, 0x66, 0x73, 0x2e, 0x63, 0x68, 0x64, 0x69, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, ++ 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6c, 0x66, 0x73, 0x2e, ++ 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x74, ++ 0x6f, 0x75, 0x63, 0x68, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, ++ 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6c, 0x66, 0x73, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x22, ++ 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x72, 0x6d, 0x64, 0x69, 0x72, 0x20, ++ 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, ++ 0x22, 0x6c, 0x66, 0x73, 0x2e, 0x72, 0x6d, 0x64, 0x69, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x20, 0x20, 0x3d, 0x20, 0x69, 0x6e, ++ 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x28, 0x22, 0x6c, 0x66, 0x73, 0x2e, ++ 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x22, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x62, ++ 0x75, 0x67, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 0x65, ++ 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x20, 0x61, 0x6c, 0x73, ++ 0x6f, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x6b, ++ 0x70, 0x73, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 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, 0x70, 0x61, 0x63, 0x6b, ++ 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x6c, 0x69, 0x62, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x65, 0x6e, ++ 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x65, ++ 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x65, 0x61, ++ 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, ++ 0x76, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, ++ 0x73, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, ++ 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x65, 0x6e, 0x64, 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, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x66, 0x69, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 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, 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, 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, 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, 0x6e, 0x64, 0x0a, 0x0a, +- 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, +- 0x75, 0x6d, 0x48, 0x45, 0x58, 0x41, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, +- 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, 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, 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, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, +- 0x64, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, +- 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6d, +- 0x69, 0x67, 0x68, 0x74, 0x20, 0x67, 0x6f, 0x20, 0x61, 0x77, 0x61, 0x79, 0x0a, 0x0a, 0x69, 0x66, +- 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x74, 0x61, +- 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, +- 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, +- 0x6f, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, +- 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, +- 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, +- 0x65, 0x72, 0x73, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, +- 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, +- 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, +- 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x6f, +- 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x20, 0x74, 0x68, 0x69, +- 0x73, 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, 0x73, 0x74, 0x61, 0x79, 0x0a, 0x0a, 0x69, 0x66, +- 0x20, 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x2d, 0x2d, 0x20, 0x6c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x32, 0x3a, 0x20, 0x77, 0x65, 0x27, +- 0x72, 0x65, 0x20, 0x6f, 0x6b, 0x61, 0x79, 0x0a, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, +- 0x75, 0x74, 0x66, 0x38, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, +- 0x2d, 0x20, 0x6c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x3a, 0x20, 0x20, 0x62, 0x69, 0x74, 0x77, +- 0x69, 0x73, 0x65, 0x2e, 0x6c, 0x75, 0x61, 0x2c, 0x20, 0x76, 0x20, 0x31, 0x2e, 0x32, 0x34, 0x20, +- 0x32, 0x30, 0x31, 0x34, 0x2f, 0x31, 0x32, 0x2f, 0x32, 0x36, 0x20, 0x31, 0x37, 0x3a, 0x32, 0x30, +- 0x3a, 0x35, 0x33, 0x20, 0x72, 0x6f, 0x62, 0x65, 0x72, 0x74, 0x6f, 0x0a, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x20, +- 0x5b, 0x5b, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, +- 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x6e, 0x73, 0x74, +- 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x3a, 0x20, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x20, +- 0x2e, 0x2e, 0x2e, 0x20, 0x7d, 0x0a, 0x0a, 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x7b, +- 0x0a, 0x20, 0x20, 0x62, 0x6e, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, +- 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, +- 0x6e, 0x20, 0x7e, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, +- 0x46, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x20, +- 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x20, 0x79, +- 0x2c, 0x20, 0x7a, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, +- 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x7a, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x78, 0x20, 0x6f, 0x72, 0x20, +- 0x2d, 0x31, 0x29, 0x20, 0x26, 0x20, 0x28, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x2d, 0x31, 0x29, 0x29, +- 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, +- 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x26, 0x20, 0x79, 0x20, 0x26, +- 0x20, 0x7a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, +- 0x2c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, +- 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, +- 0x3d, 0x20, 0x72, 0x65, 0x73, 0x20, 0x26, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x69, +- 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, ++ 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, ++ 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, ++ 0x2e, 0x66, 0x66, 0x69, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, ++ 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x66, ++ 0x66, 0x69, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 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, 0x69, 0x66, 0x20, ++ 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, 0x68, 0x65, 0x78, 0x61, 0x20, ++ 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 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, 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, 0x20, 0x20, 0x20, ++ 0x20, 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, ++ 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, 0x48, 0x45, ++ 0x58, 0x41, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, ++ 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, 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, ++ 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x65, ++ 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, ++ 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74, ++ 0x20, 0x67, 0x6f, 0x20, 0x61, 0x77, 0x61, 0x79, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, ++ 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, ++ 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6e, ++ 0x6f, 0x74, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, ++ 0x72, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, ++ 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, ++ 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x0a, ++ 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, ++ 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, ++ 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, ++ 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x69, ++ 0x67, 0x68, 0x74, 0x20, 0x73, 0x74, 0x61, 0x79, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x62, 0x69, 0x74, ++ 0x33, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, ++ 0x6c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x32, 0x3a, 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, 0x6f, ++ 0x6b, 0x61, 0x79, 0x0a, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x66, 0x38, ++ 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6c, 0x75, ++ 0x61, 0x20, 0x35, 0x2e, 0x33, 0x3a, 0x20, 0x20, 0x62, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x2e, ++ 0x6c, 0x75, 0x61, 0x2c, 0x20, 0x76, 0x20, 0x31, 0x2e, 0x32, 0x34, 0x20, 0x32, 0x30, 0x31, 0x34, ++ 0x2f, 0x31, 0x32, 0x2f, 0x32, 0x36, 0x20, 0x31, 0x37, 0x3a, 0x32, 0x30, 0x3a, 0x35, 0x33, 0x20, ++ 0x72, 0x6f, 0x62, 0x65, 0x72, 0x74, 0x6f, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x74, ++ 0x33, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x20, 0x5b, 0x5b, 0x0a, 0x6c, ++ 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x65, ++ 0x6c, 0x65, 0x63, 0x74, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, ++ 0x6f, 0x66, 0x3a, 0x20, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x2e, 0x2e, 0x2e, 0x20, ++ 0x7d, 0x0a, 0x0a, 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x62, ++ 0x6e, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, ++ 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7e, 0x61, + 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, +- 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, +- 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x7a, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x78, 0x20, +- 0x6f, 0x72, 0x20, 0x30, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, +- 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, +- 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, +- 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x7c, 0x20, 0x79, 0x20, +- 0x7c, 0x20, 0x7a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, +- 0x31, 0x2c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x2e, 0x2e, 0x2e, +- 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, +- 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x20, 0x7c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, +- 0x69, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, +- 0x73, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, +- 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, +- 0x62, 0x78, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, +- 0x28, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, +- 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x7a, 0x20, 0x74, 0x68, 0x65, 0x6e, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, +- 0x78, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x20, 0x7e, 0x20, 0x28, 0x79, 0x20, 0x6f, 0x72, 0x20, +- 0x30, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x7e, 0x20, +- 0x79, 0x20, 0x7e, 0x20, 0x7a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, +- 0x69, 0x3d, 0x31, 0x2c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x2e, +- 0x2e, 0x2e, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, +- 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x20, 0x7e, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, +- 0x74, 0x28, 0x69, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, +- 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, +- 0x72, 0x65, 0x73, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, +- 0x20, 0x20, 0x62, 0x74, 0x65, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, +- 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, +- 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x7a, 0x20, 0x74, +- 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, +- 0x20, 0x28, 0x28, 0x28, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x26, 0x20, 0x28, +- 0x79, 0x20, 0x6f, 0x72, 0x20, 0x2d, 0x31, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, +- 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, ++ 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, ++ 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x2c, ++ 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, ++ 0x20, 0x7a, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, ++ 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x2d, 0x31, 0x29, 0x20, ++ 0x26, 0x20, 0x28, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x2d, 0x31, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, ++ 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, ++ 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, ++ 0x65, 0x73, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x26, 0x20, 0x79, 0x20, 0x26, 0x20, 0x7a, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, 0x73, 0x65, 0x6c, ++ 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x64, 0x6f, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, ++ 0x73, 0x20, 0x26, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x69, 0x2c, 0x2e, 0x2e, 0x2e, ++ 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x20, 0x26, 0x20, 0x30, ++ 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, ++ 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x20, 0x3d, ++ 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x2c, ++ 0x20, 0x7a, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, ++ 0x6e, 0x6f, 0x74, 0x20, 0x7a, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x30, ++ 0x29, 0x20, 0x7c, 0x20, 0x28, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x29, 0x20, 0x26, 0x20, ++ 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, ++ 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, ++ 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x7c, 0x20, 0x79, 0x20, 0x7c, 0x20, 0x7a, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, 0x73, 0x65, ++ 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x64, 0x6f, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, ++ 0x65, 0x73, 0x20, 0x7c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x69, 0x2c, 0x2e, 0x2e, ++ 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x20, 0x26, 0x20, ++ 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, ++ 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x78, 0x6f, 0x72, ++ 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x20, ++ 0x79, 0x2c, 0x20, 0x7a, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, ++ 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x7a, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x78, 0x20, 0x6f, 0x72, ++ 0x20, 0x30, 0x29, 0x20, 0x7e, 0x20, 0x28, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x29, 0x20, ++ 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, +- 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x26, 0x20, 0x79, 0x20, 0x26, 0x20, ++ 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x7e, 0x20, 0x79, 0x20, 0x7e, 0x20, + 0x7a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x20, +- 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, +- 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x20, 0x26, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, +- 0x69, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, +- 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x72, +- 0x65, 0x73, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x29, +- 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, +- 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, +- 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, +- 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x61, 0x20, 0x26, +- 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x29, 0x20, 0x3c, 0x3c, 0x20, +- 0x62, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, +- 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, +- 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, +- 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x61, +- 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x29, 0x20, 0x3e, +- 0x3e, 0x20, 0x62, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, +- 0x46, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x61, 0x72, 0x73, 0x68, 0x69, +- 0x66, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, +- 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x26, +- 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, +- 0x69, 0x66, 0x20, 0x62, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x61, 0x20, +- 0x26, 0x20, 0x30, 0x78, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x29, 0x20, 0x3d, 0x3d, +- 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, +- 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x29, 0x20, 0x26, 0x20, +- 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, +- 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, +- 0x20, 0x28, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x29, 0x20, 0x7c, 0x20, 0x7e, 0x28, 0x30, +- 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x29, 0x29, +- 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x6c, +- 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, +- 0x6e, 0x20, 0x28, 0x61, 0x20, 0x2c, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d, +- 0x20, 0x62, 0x20, 0x26, 0x20, 0x33, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, +- 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, +- 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x20, 0x3c, 0x3c, 0x20, 0x62, 0x29, 0x20, +- 0x7c, 0x20, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, 0x28, 0x33, 0x32, 0x20, 0x2d, 0x20, 0x62, 0x29, +- 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x26, ++ 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, ++ 0x20, 0x72, 0x65, 0x73, 0x20, 0x7e, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x69, 0x2c, ++ 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x20, ++ 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x74, ++ 0x65, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, ++ 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, ++ 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x7a, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x28, ++ 0x78, 0x20, 0x6f, 0x72, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x26, 0x20, 0x28, 0x79, 0x20, 0x6f, 0x72, ++ 0x20, 0x2d, 0x31, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, ++ 0x46, 0x46, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, ++ 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, ++ 0x73, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x26, 0x20, 0x79, 0x20, 0x26, 0x20, 0x7a, 0x0a, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, 0x73, 0x65, 0x6c, 0x65, ++ 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, ++ 0x65, 0x73, 0x20, 0x26, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x69, 0x2c, 0x2e, 0x2e, ++ 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x72, 0x65, 0x73, 0x20, 0x26, ++ 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x29, 0x20, 0x7e, 0x3d, 0x20, ++ 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, ++ 0x0a, 0x20, 0x20, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, ++ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, ++ 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x62, 0x29, 0x20, 0x26, + 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x65, 0x6e, +- 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, +- 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, +- 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x2d, 0x62, 0x20, 0x26, 0x20, 0x33, 0x31, 0x0a, 0x20, +- 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, +- 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x61, +- 0x20, 0x3c, 0x3c, 0x20, 0x62, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, 0x28, +- 0x33, 0x32, 0x20, 0x2d, 0x20, 0x62, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, +- 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, +- 0x46, 0x46, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, +- 0x61, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, +- 0x61, 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, +- 0x75, 0x72, 0x6e, 0x20, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, 0x66, 0x29, 0x20, 0x26, 0x20, 0x7e, +- 0x28, 0x2d, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x28, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x29, +- 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, +- 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, +- 0x20, 0x76, 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, +- 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x20, 0x3d, 0x20, 0x7e, 0x28, 0x2d, 0x31, 0x20, +- 0x3c, 0x3c, 0x20, 0x28, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x61, 0x20, 0x26, 0x20, 0x7e, 0x28, +- 0x6d, 0x61, 0x73, 0x6b, 0x20, 0x3c, 0x3c, 0x20, 0x66, 0x29, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x28, +- 0x76, 0x20, 0x26, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x66, 0x29, 0x29, ++ 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, ++ 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, ++ 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x61, 0x20, 0x26, 0x20, 0x30, ++ 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x29, + 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, +- 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, +- 0x5d, 0x20, 0x29, 0x0a, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x62, 0x69, 0x74, 0x20, +- 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6c, 0x75, 0x61, +- 0x6a, 0x69, 0x74, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x77, 0x29, 0x0a, 0x0a, 0x20, +- 0x20, 0x20, 0x20, 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, +- 0x28, 0x20, 0x5b, 0x5b, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x2c, +- 0x20, 0x62, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x2c, 0x20, 0x6c, +- 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x62, 0x61, 0x6e, 0x64, +- 0x2c, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x62, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x62, 0x69, 0x74, 0x2e, +- 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x2c, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x6c, 0x73, 0x68, 0x69, +- 0x66, 0x74, 0x0a, 0x0a, 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, +- 0x61, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x61, 0x72, +- 0x73, 0x68, 0x69, 0x66, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x20, 0x20, 0x20, +- 0x20, 0x3d, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x6e, 0x6f, 0x74, 0x20, +- 0x20, 0x20, 0x20, 0x3d, 0x20, 0x62, 0x6e, 0x6f, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x6f, 0x72, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x62, 0x6f, 0x72, 0x2c, 0x0a, +- 0x20, 0x20, 0x62, 0x78, 0x6f, 0x72, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, +- 0x62, 0x78, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x74, 0x65, 0x73, 0x74, 0x20, 0x20, 0x20, +- 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, +- 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x28, +- 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, +- 0x0a, 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, +- 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x2c, 0x66, 0x2c, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x28, 0x72, 0x73, 0x68, +- 0x69, 0x66, 0x74, 0x28, 0x61, 0x2c, 0x66, 0x29, 0x2c, 0x32, 0x5e, 0x28, 0x77, 0x20, 0x6f, 0x72, +- 0x20, 0x31, 0x29, 0x2d, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, +- 0x6c, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x72, 0x6f, +- 0x6c, 0x2c, 0x0a, 0x20, 0x20, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x6c, +- 0x73, 0x68, 0x69, 0x66, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, +- 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x2c, 0x76, 0x2c, +- 0x66, 0x2c, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, +- 0x61, 0x73, 0x6b, 0x20, 0x3d, 0x20, 0x32, 0x5e, 0x28, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, +- 0x2d, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, +- 0x6e, 0x64, 0x28, 0x61, 0x2c, 0x62, 0x6e, 0x6f, 0x74, 0x28, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, +- 0x28, 0x6d, 0x61, 0x73, 0x6b, 0x2c, 0x66, 0x29, 0x29, 0x29, 0x2b, 0x6c, 0x73, 0x68, 0x69, 0x66, +- 0x74, 0x28, 0x62, 0x61, 0x6e, 0x64, 0x28, 0x76, 0x2c, 0x6d, 0x61, 0x73, 0x6b, 0x29, 0x2c, 0x66, +- 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x72, 0x6f, 0x74, 0x61, +- 0x74, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x72, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x20, +- 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, +- 0x2c, 0x0a, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x5d, 0x20, 0x29, +- 0x0a, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x68, +- 0x6f, 0x70, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, +- 0x20, 0x6f, 0x72, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, +- 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x62, +- 0x69, 0x74, 0x33, 0x32, 0x22, 0x29, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, +- 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x66, +- 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, +- 0x72, 0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x29, 0x20, 0x72, 0x69, 0x67, +- 0x68, 0x74, 0x0a, 0x0a, 0x64, 0x6f, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, +- 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, +- 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, +- 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x73, 0x6f, 0x63, +- 0x6b, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, +- 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, +- 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x5d, 0x20, 0x65, +- 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, +- 0x61, 0x64, 0x65, 0x64, 0x2e, 0x6d, 0x69, 0x6d, 0x65, 0x20, 0x20, 0x20, 0x74, 0x68, 0x65, 0x6e, +- 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x6d, 0x69, 0x6d, 0x65, 0x20, 0x20, 0x20, 0x3d, +- 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x22, 0x6d, 0x69, 0x6d, 0x65, 0x2e, 0x63, 0x6f, +- 0x72, 0x65, 0x22, 0x5d, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, +- 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x6c, 0x66, +- 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x6c, 0x66, +- 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x65, 0x6e, 0x64, +- 0x0a, 0x0a, 0x64, 0x6f, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, +- 0x6c, 0x66, 0x73, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, +- 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, +- 0x6c, 0x69, 0x6e, 0x6b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x3d, +- 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x61, 0x74, 0x74, 0x72, +- 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, +- 0x68, 0x65, 0x73, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x62, 0x65, 0x20, +- 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x66, 0x73, 0x20, 0x28, +- 0x77, 0x61, 0x73, 0x20, 0x64, 0x65, 0x61, 0x64, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x20, 0x62, 0x65, +- 0x66, 0x6f, 0x72, 0x65, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, +- 0x74, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x69, 0x73, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, +- 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, +- 0x6f, 0x6e, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x69, 0x73, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x61, +- 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x61, 0x74, 0x74, +- 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x22, 0x6d, 0x6f, +- 0x64, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x69, +- 0x6c, 0x65, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6c, 0x69, 0x6e, +- 0x6b, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, ++ 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x61, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, ++ 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, ++ 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, ++ 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, ++ 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x74, ++ 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, ++ 0x20, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, ++ 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x61, ++ 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x29, 0x20, 0x7c, 0x20, 0x7e, 0x28, 0x30, 0x78, 0x46, 0x46, 0x46, ++ 0x46, 0x46, 0x46, 0x46, 0x46, 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, ++ 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, ++ 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x6c, 0x72, 0x6f, 0x74, 0x61, ++ 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, ++ 0x20, 0x2c, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x62, 0x20, 0x26, ++ 0x20, 0x33, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x26, 0x20, ++ 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, ++ 0x20, 0x3d, 0x20, 0x28, 0x61, 0x20, 0x3c, 0x3c, 0x20, 0x62, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x61, ++ 0x20, 0x3e, 0x3e, 0x20, 0x28, 0x33, 0x32, 0x20, 0x2d, 0x20, 0x62, 0x29, 0x29, 0x0a, 0x20, 0x20, ++ 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, ++ 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, ++ 0x20, 0x72, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, ++ 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, ++ 0x20, 0x3d, 0x20, 0x2d, 0x62, 0x20, 0x26, 0x20, 0x33, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, ++ 0x20, 0x3d, 0x20, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, ++ 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x20, 0x3c, 0x3c, 0x20, ++ 0x62, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, 0x28, 0x33, 0x32, 0x20, 0x2d, ++ 0x20, 0x62, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, ++ 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, ++ 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, ++ 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x66, ++ 0x2c, 0x20, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, ++ 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, 0x66, 0x29, 0x20, 0x26, 0x20, 0x7e, 0x28, 0x2d, 0x31, 0x20, ++ 0x3c, 0x3c, 0x20, 0x28, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, ++ 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, ++ 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x76, 0x2c, 0x20, ++ 0x66, 0x2c, 0x20, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, ++ 0x6d, 0x61, 0x73, 0x6b, 0x20, 0x3d, 0x20, 0x7e, 0x28, 0x2d, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x28, ++ 0x77, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, ++ 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x61, 0x20, 0x26, 0x20, 0x7e, 0x28, 0x6d, 0x61, 0x73, 0x6b, ++ 0x20, 0x3c, 0x3c, 0x20, 0x66, 0x29, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x28, 0x76, 0x20, 0x26, 0x20, ++ 0x6d, 0x61, 0x73, 0x6b, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x66, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, ++ 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, ++ 0x0a, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x5d, 0x20, 0x29, 0x0a, ++ 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x62, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, ++ 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, 0x20, ++ 0x28, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x77, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, ++ 0x69, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x20, 0x5b, 0x5b, ++ 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x62, 0x6e, 0x6f, ++ 0x74, 0x2c, 0x20, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x2c, 0x20, 0x6c, 0x73, 0x68, 0x69, 0x66, ++ 0x74, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x62, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x62, 0x69, ++ 0x74, 0x2e, 0x62, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x72, 0x73, 0x68, 0x69, ++ 0x66, 0x74, 0x2c, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x0a, 0x0a, ++ 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x61, 0x72, 0x73, 0x68, ++ 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x61, 0x72, 0x73, 0x68, 0x69, 0x66, ++ 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x62, ++ 0x61, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x6e, 0x6f, 0x74, 0x20, 0x20, 0x20, 0x20, 0x3d, ++ 0x20, 0x62, 0x6e, 0x6f, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x62, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x78, ++ 0x6f, 0x72, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x62, 0x78, 0x6f, 0x72, ++ 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x74, 0x65, 0x73, 0x74, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x66, 0x75, ++ 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x28, 0x2e, 0x2e, 0x2e, 0x29, ++ 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x65, ++ 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, ++ 0x6e, 0x28, 0x61, 0x2c, 0x66, 0x2c, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, ++ 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x28, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, ++ 0x61, 0x2c, 0x66, 0x29, 0x2c, 0x32, 0x5e, 0x28, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x2d, ++ 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x6c, 0x72, 0x6f, 0x74, ++ 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x2c, 0x0a, 0x20, ++ 0x20, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x6c, 0x73, 0x68, 0x69, 0x66, ++ 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x66, ++ 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x2c, 0x76, 0x2c, 0x66, 0x2c, 0x77, 0x29, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x20, ++ 0x3d, 0x20, 0x32, 0x5e, 0x28, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x2d, 0x31, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x28, 0x61, ++ 0x2c, 0x62, 0x6e, 0x6f, 0x74, 0x28, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x6d, 0x61, 0x73, ++ 0x6b, 0x2c, 0x66, 0x29, 0x29, 0x29, 0x2b, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x62, 0x61, ++ 0x6e, 0x64, 0x28, 0x76, 0x2c, 0x6d, 0x61, 0x73, 0x6b, 0x29, 0x2c, 0x66, 0x29, 0x0a, 0x20, 0x20, ++ 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, ++ 0x20, 0x62, 0x69, 0x74, 0x2e, 0x72, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x73, 0x68, 0x69, ++ 0x66, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x2c, 0x0a, 0x7d, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x5d, 0x20, 0x29, 0x0a, 0x0a, 0x65, 0x6c, ++ 0x73, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x68, 0x6f, 0x70, 0x65, 0x20, ++ 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, ++ 0x66, 0x61, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, ++ 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x62, 0x69, 0x74, 0x33, 0x32, ++ 0x22, 0x29, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x69, 0x73, ++ 0x20, 0x69, 0x73, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x67, ++ 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, ++ 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x29, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0a, 0x0a, ++ 0x64, 0x6f, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, ++ 0x61, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, ++ 0x6f, 0x61, 0x64, 0x65, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, ++ 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, ++ 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x73, 0x6f, 0x63, 0x6b, ++ 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x22, 0x73, 0x6f, 0x63, ++ 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x5d, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, ++ 0x2e, 0x6d, 0x69, 0x6d, 0x65, 0x20, 0x20, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x61, ++ 0x64, 0x65, 0x64, 0x2e, 0x6d, 0x69, 0x6d, 0x65, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, ++ 0x64, 0x65, 0x64, 0x5b, 0x22, 0x6d, 0x69, 0x6d, 0x65, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x5d, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, +- 0x6f, 0x74, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x69, 0x73, 0x64, 0x69, 0x72, 0x20, 0x74, 0x68, 0x65, +- 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, +- 0x6f, 0x6e, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x69, 0x73, 0x64, 0x69, 0x72, 0x28, 0x6e, 0x61, 0x6d, +- 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, +- 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x61, 0x74, 0x74, 0x72, +- 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x22, 0x6d, 0x6f, 0x64, +- 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x64, 0x69, 0x72, +- 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, +- 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x68, +- 0x61, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6f, 0x72, 0x74, +- 0x20, 0x6f, 0x66, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, +- 0x20, 0x6b, 0x70, 0x73, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, +- 0x74, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x20, +- 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, +- 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6e, +- 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, +- 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, +- 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6e, 0x6f, +- 0x77, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x61, 0x72, +- 0x67, 0x65, 0x74, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x2e, 0x2e, +- 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x66, +- 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, +- 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x6b, 0x28, 0x6e, 0x61, +- 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x61, 0x74, +- 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x22, 0x74, +- 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, ++ 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x6c, 0x66, 0x73, 0x20, 0x74, 0x68, ++ 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x6c, 0x66, 0x73, 0x20, 0x3d, 0x20, ++ 0x6c, 0x66, 0x73, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x64, 0x6f, ++ 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x66, 0x73, 0x61, ++ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, ++ 0x6c, 0x66, 0x73, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, ++ 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, ++ 0x2e, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, ++ 0x65, 0x73, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, ++ 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x62, 0x65, 0x20, 0x64, 0x6f, 0x6e, 0x65, ++ 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x66, 0x73, 0x20, 0x28, 0x77, 0x61, 0x73, 0x20, ++ 0x64, 0x65, 0x61, 0x64, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, ++ 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x66, ++ 0x73, 0x2e, 0x69, 0x73, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, ++ 0x66, 0x73, 0x2e, 0x69, 0x73, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, ++ 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, ++ 0x74, 0x65, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x29, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, ++ 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x20, ++ 0x6f, 0x72, 0x20, 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, +- 0x6e, 0x64, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x00 ++ 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, ++ 0x66, 0x73, 0x2e, 0x69, 0x73, 0x64, 0x69, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, ++ 0x66, 0x73, 0x2e, 0x69, 0x73, 0x64, 0x69, 0x72, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, ++ 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, ++ 0x65, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x29, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, ++ 0x72, 0x6e, 0x20, 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, ++ 0x72, 0x79, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, ++ 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, ++ 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, ++ 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6b, 0x70, 0x73, ++ 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x66, ++ 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, ++ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, ++ 0x6e, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x28, ++ 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, ++ 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x74, 0x68, ++ 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, ++ 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x0a, 0x20, ++ 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x72, 0x65, ++ 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x66, 0x73, ++ 0x2e, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x6b, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, ++ 0x72, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, ++ 0x75, 0x74, 0x65, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x22, 0x74, 0x61, 0x72, 0x67, 0x65, ++ 0x74, 0x22, 0x29, 0x20, 0x6f, 0x72, 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, 0x0a, ++ 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x00 + }; + return luaL_dostring(L, (const char*) luatex_core_lua); + } +\ No newline at end of file +diff --git a/texk/web2c/luatexdir/lua/luatex-core.lua b/texk/web2c/luatexdir/lua/luatex-core.lua +index 12941dbe7..d33c12179 100644 +--- a/texk/web2c/luatexdir/lua/luatex-core.lua ++++ b/texk/web2c/luatexdir/lua/luatex-core.lua +@@ -7,7 +7,7 @@ + -- copyright = 'LuaTeX Development Team', + -- } + +-LUATEXCOREVERSION = 1.151 -- we reflect the luatex version where changes happened ++LUATEXCOREVERSION = 1.161 -- we reflect the luatex version where changes happened + + -- This file overloads some Lua functions. The readline variants provide the same + -- functionality as LuaTeX <= 1.04 and doing it this way permits us to keep the +@@ -16,6 +16,8 @@ LUATEXCOREVERSION = 1.151 -- we reflect the luatex version where changes happene + -- We test for functions already being defined so that we don't overload ones that + -- are provided in the startup script. + ++ ++ + local saferoption = status.safer_option + local shellescape = status.shell_escape -- 0 (disabled) 1 (anything) 2 (restricted) + local kpseused = status.kpse_used -- 0 1 +@@ -34,7 +36,7 @@ if kpseused == 1 then + local kpse_recordoutputfile = kpse.record_output_file + + local io_open = io.open +- local io_popen = io.popen ++ -- local io_popen = io.popen -- not need, we use os.kpsepopen + local io_lines = io.lines + + local fio_readline = fio.readline +@@ -75,12 +77,13 @@ if kpseused == 1 then + return f + end + +- local function luatex_io_popen(name,...) +- local okay, found = kpse_checkpermission(name) +- if okay and found then +- return io_popen(found,...) +- end +- end ++ -- not need, we use os.kpsepopen ++ --local function luatex_io_popen(name,...) ++ -- local okay, found = kpse_checkpermission(name) ++ -- if okay and found then ++ -- return io_popen(found,...) ++ -- end ++ --end + + -- local function luatex_io_lines(name,how) + -- if name then +@@ -130,7 +133,8 @@ if kpseused == 1 then + mt.lines = luatex_io_readline + + io.open = luatex_io_open +- io.popen = luatex_io_popen ++ --io.popen = luatex_io_popen -- not need, we use os.kpsepopen ++ io.popen = os.kpsepopen + + else + +@@ -169,6 +173,8 @@ if saferoption == 1 then + os.setenv = installdummy("os.setenv") + os.tempdir = installdummy("os.tempdir") + ++ os.kpsepopen = installdummy("os.kpsepopen") ++ + io.popen = installdummy("io.popen") + io.open = installdummy("io.open",luatex_io_open_readonly) + +diff --git a/texk/web2c/luatexdir/luafontloader/src/luafflib.c b/texk/web2c/luatexdir/luafontloader/src/luafflib.c +index 434413b00..41e5c3a32 100644 +--- a/texk/web2c/luatexdir/luafontloader/src/luafflib.c ++++ b/texk/web2c/luatexdir/luafontloader/src/luafflib.c +@@ -1236,7 +1236,6 @@ static void handle_pfminfo(lua_State * L, struct pfminfo pfm) + dump_intfield(L, "vlinegap", pfm.vlinegap); + dump_intfield(L, "hhead_ascent", pfm.hhead_ascent); + dump_intfield(L, "hhead_descent", pfm.hhead_descent); +- dump_intfield(L, "hhead_descent", pfm.hhead_descent); + dump_intfield(L, "os2_typoascent", pfm.os2_typoascent); + dump_intfield(L, "os2_typodescent", pfm.os2_typodescent); + dump_intfield(L, "os2_typolinegap", pfm.os2_typolinegap); +diff --git a/texk/web2c/luatexdir/luasocket/src/lua_preload.c b/texk/web2c/luatexdir/luasocket/src/lua_preload.c +index 838871c1d..b235f6a51 100644 +--- a/texk/web2c/luatexdir/luasocket/src/lua_preload.c ++++ b/texk/web2c/luatexdir/luasocket/src/lua_preload.c +@@ -16,6 +16,7 @@ int luatex_ftp_lua_open(lua_State*); + + + extern void luatex_socketlua_open (lua_State *) ; ++extern void luatex_socketlua_safe_open (lua_State *) ; + #include "ftp_lua.c" + #include "headers_lua.c" + #include "http_lua.c" +@@ -47,3 +48,11 @@ luatex_socketlua_open (lua_State *L) { + TEST(luatex_http_lua_open(L)); + TEST(luatex_ftp_lua_open(L)); + } ++ ++/* luatex_socketlua_safe_open: load safe modules */ ++/* of luasocket ( mime ). */ ++void ++luatex_socketlua_safe_open (lua_State *L) { ++ TEST(luatex_ltn12_lua_open(L)); ++ TEST(luatex_mime_lua_open(L)); ++} +diff --git a/texk/web2c/luatexdir/luatex.c b/texk/web2c/luatexdir/luatex.c +index 40eaa2a11..949389e62 100644 +--- a/texk/web2c/luatexdir/luatex.c ++++ b/texk/web2c/luatexdir/luatex.c +@@ -32,9 +32,9 @@ + stick to "0" upto "9" so users can expect a number represented as string. + */ + +-int luatex_version = 116; +-int luatex_revision = '1'; +-const char *luatex_version_string = "1.16.1"; ++int luatex_version = 117; ++int luatex_revision = '0'; ++const char *luatex_version_string = "1.17.0"; + const char *engine_name = my_name; + + #include +diff --git a/texk/web2c/luatexdir/luatex_svnversion.h b/texk/web2c/luatexdir/luatex_svnversion.h +index 76d929807..6b6137b1b 100644 +--- a/texk/web2c/luatexdir/luatex_svnversion.h ++++ b/texk/web2c/luatexdir/luatex_svnversion.h +@@ -1,4 +1,4 @@ + #ifndef luatex_svn_revision_h + #define luatex_svn_revision_h +-#define luatex_svn_revision 7569 ++#define luatex_svn_revision 7581 + #endif +diff --git a/texk/web2c/luatexdir/tex/texnodes.c b/texk/web2c/luatexdir/tex/texnodes.c +index 6e0ae1ff8..72f6716dd 100644 +--- a/texk/web2c/luatexdir/tex/texnodes.c ++++ b/texk/web2c/luatexdir/tex/texnodes.c +@@ -1203,7 +1203,7 @@ void l_set_whatsit_data(void) { + the original one as a metatable. After some experiments (that also included + timing) with these scenarios I decided that a deep copy made no sense, nor + did nilling. In the end both the shallow copy and the metatable variant were +- both ok, although the second ons is slower. The most important aspect to keep ++ both ok, although the second one is slower. The most important aspect to keep + in mind is that references to other nodes in properties no longer can be + valid for that copy. We could use two tables (one unique and one shared) or + metatables but that only complicates matters. +-- +2.39.2 + +From aeeac98c8f462092f49d3d9f5f8c41737154f7e5 Mon Sep 17 00:00:00 2001 +From: Karl Berry +Date: Tue, 2 May 2023 15:28:44 +0000 +Subject: [PATCH 39/39] reformat NEWS + +git-svn-id: svn://tug.org/texlive/trunk/Build/source@66985 c570f23f-e606-0410-a88d-b1316a301751 +--- + texk/web2c/luatexdir/NEWS | 23 +++++++++++++---------- + 1 file changed, 13 insertions(+), 10 deletions(-) + +diff --git a/texk/web2c/luatexdir/NEWS b/texk/web2c/luatexdir/NEWS +index 41d6d4d14..3f15df0a7 100644 +--- a/texk/web2c/luatexdir/NEWS ++++ b/texk/web2c/luatexdir/NEWS +@@ -3,23 +3,26 @@ LuaTeX 1.17.0 2023-04-29 + ============================================================== + + - A breaking backward compatibility change: by default the socket +- library is not enabled . ++ library is not enabled. + The new option --socket enable the socket library as + before, as also --shell-escape (without --shell-restricted); + --nosocket, --no-socket , --safer disabled the library, and + they have the priority in case of conflicting options. +- The mime library is always available; socket.sleep +- and socket.gettime are duplicated as os.socketsleep +- and os.socketgettime, both always available. +- The new os.kpsepopen replace io.popopen in kpse mode +- (i.e. when kpse_init is not zero) as it was before +- but the permission now cannot be changed anymore with +- kpse.check_permission . ++ ++ socket.sleep and socket.gettime are duplicated as os.socketsleep and ++ os.socketgettime, both always available. ++ ++ The new function os.kpsepopen replaces io.popen in kpse mode ++ (i.e. when kpse_init is not zero) as it was before, ++ but the permission can no longer be changed with ++ kpse.check_permission. + The function os.kpsepopen follows the same restrictions +- as io.popen . ++ as io.popen. ++ ++ The mime library is always available. ++ + Thanks to Max Chernoff for debugging. + +- + + + ============================================================== +-- +2.39.2 + diff --git a/patches/source/texlive/texlive.SlackBuild b/patches/source/texlive/texlive.SlackBuild new file mode 100755 index 000000000..53c772768 --- /dev/null +++ b/patches/source/texlive/texlive.SlackBuild @@ -0,0 +1,216 @@ +#!/bin/bash + +# TeXLive build script for Slackware + +# Copyright 2009, 2017 - 2023 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: https://tug.org/texlive/Images/test/ +# Upstream stable fixes: svn://tug.org/texlive/branches/branch2023/Build/source + +cd $(dirname $0) ; CWD=$(pwd) + +PKGNAM=texlive +SOURCEVERSION=${SOURCEVERSION:-20230311} +TEXMFVERSION=${TEXMFVERSION:-230322} +VERSION=${VERSION:-2023.$TEXMFVERSION} +BUILD=${BUILD:-1_slack15.0} + +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:-" -j$(expr $(nproc) + 1) "} + +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 + +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 . + +# CVE-2023-32700: +zcat $CWD/texlive-20230313-source-security_fix-1.patch.gz | patch -p1 --verbose || exit 1 + +# Define a few new symbols since the Slackware 15.0 release: +zcat $CWD/texlive.unicode5.0.diff.gz | patch -p1 --verbose || exit 1 + +mkdir build +cd build + CFLAGS="$SLKCFLAGS" \ + CXXFLAGS="$SLKCFLAGS" \ + ../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 \ + --disable-dialog \ + --disable-xz \ + --disable-texdoctk \ + --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 \ + --with-system-harfbuzz \ + --disable-linked-scripts \ + --build=$ARCH-slackware-linux || exit 1 + + make $NUMJOBS || make || exit 1 + #make check || exit 1 + make install-strip DESTDIR=$PKG || exit 1 + +cd .. + +# Don't ship .la files: +rm -f $PKG/usr/lib${LIBDIRSUFFIX}/*.la + +TEXMFROOT=/usr/share + +# Remove all files which are covered by tlnet +rm -rf $PKG$TEXMFROOT $PKG/usr/man $PKG/usr/info + +# install the tlnet stuff +mkdir -p $PKG$TEXMFROOT +tar xvf $CWD/texlive-base-$TEXMFVERSION.tar.xz -C $PKG$TEXMFROOT || exit 1 +chown -R root:root $PKG +chmod -R u+w,go-w,a+rX-st $PKG + +# use symlinks/scripts from tlnet +mv $PKG$TEXMFROOT/texmf-dist/linked_scripts/* $PKG/usr/bin +rmdir $PKG$TEXMFROOT/texmf-dist/linked_scripts + +# set some paths +sed -i \ + -e "s|^TEXMFROOT.*|TEXMFROOT = $TEXMFROOT|" \ + -e "s|^TEXMFLOCAL.*|TEXMFLOCAL = \$TEXMFROOT/texmf-local|" \ + -e "s|^OSFONTDIR.*|OSFONTDIR = ~/.fonts:/usr/share/fonts|" \ + $PKG$TEXMFROOT/texmf-dist/web2c/texmf.cnf + +# 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 + + + + $TEXMFROOT/texmf-dist/fonts/opentype + $TEXMFROOT/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$TEXMFROOT/texmf-dist/packages.base.gz $PKG/usr/doc/texlive-$VERSION + +# Put a symlink to $TEXMFROOT/texmf-dist/doc in our Slackware docdir +ln -srf $PKG$TEXMFROOT/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$TEXMFROOT/{texmf-config,texmf-var,texmf-local} + +# Add texlive perl modules +mkdir -p $PKG/usr/share/perl5 +mv $PKG$TEXMFROOT/texmf-dist/scripts/texlive/TeXLive $PKG/usr/share/perl5/ + +# Move manual pages to the correct place +mkdir $PKG/usr/man +mv $PKG$TEXMFROOT/texmf-dist/doc/man/man1 $PKG/usr/man +mv $PKG$TEXMFROOT/texmf-dist/doc/man/man5 $PKG/usr/man +rmdir $PKG$TEXMFROOT/texmf-dist/doc/man + +# 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 +mv $PKG$TEXMFROOT/texmf-dist/doc/info $PKG/usr +rm -f $PKG/usr/info/dir +gzip -9 $PKG/usr/info/* + +mkdir -p $PKG/install +# Don't demand a global lock when running the install script: +echo "# This install script should not collide with any other script's activities," > $PKG/install/doinst.sh +echo "# so don't demand a lock by installpkg: NOLOCK" >> $PKG/install/doinst.sh +zcat $CWD/doinst.sh.gz >> $PKG/install/doinst.sh +cat $CWD/douninst.sh > $PKG/install/douninst.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/patches/source/texlive/texlive.unicode5.0.diff b/patches/source/texlive/texlive.unicode5.0.diff new file mode 100644 index 000000000..d3a31e9e3 --- /dev/null +++ b/patches/source/texlive/texlive.unicode5.0.diff @@ -0,0 +1,24 @@ +--- ./texk/bibtex-x/bibtex-1.c.orig 2022-04-28 22:14:26.000000000 -0500 ++++ ./texk/bibtex-x/bibtex-1.c 2023-05-23 14:24:44.172208827 -0500 +@@ -330,8 +330,8 @@ + case UBLOCK_LATIN_EXTENDED_C: + case UBLOCK_LATIN_EXTENDED_D: + case UBLOCK_LATIN_EXTENDED_E: +- case UBLOCK_LATIN_EXTENDED_F: +- case UBLOCK_LATIN_EXTENDED_G: ++ case 313: ++ case 314: + case UBLOCK_LATIN_EXTENDED_ADDITIONAL: + case UBLOCK_GREEK: + case UBLOCK_GREEK_EXTENDED: +--- ./texk/bibtex-x/bibtex-4.c.orig 2022-05-17 08:08:34.000000000 -0500 ++++ ./texk/bibtex-x/bibtex-4.c 2023-05-23 14:25:44.436210175 -0500 +@@ -2826,7 +2826,7 @@ + case UBLOCK_KATAKANA: + case UBLOCK_KATAKANA_PHONETIC_EXTENSIONS: + case UBLOCK_KANA_EXTENDED_A: +- case UBLOCK_KANA_EXTENDED_B: ++ case 312: + case UBLOCK_SMALL_KANA_EXTENSION: + string_width |= 0x002; + break; diff --git a/patches/source/texlive/texlive.url b/patches/source/texlive/texlive.url new file mode 100644 index 000000000..03c1a6e30 --- /dev/null +++ b/patches/source/texlive/texlive.url @@ -0,0 +1,2 @@ +https://ctan.net/systems/texlive/Source/texlive-20230311-source.tar.xz +http://slackware.schoepfer.info/slackbuilds/texlive/texlive-base-230322.tar.xz diff --git a/recompress.sh b/recompress.sh index 25c8ba397..9a19972e5 100755 --- a/recompress.sh +++ b/recompress.sh @@ -1181,6 +1181,9 @@ gzip ./patches/source/python3/python3.no-static-library.diff gzip ./patches/source/python3/python3.readline.set_pre_input_hook.diff gzip ./patches/source/python3/python3.setup.py.x86_64.diff gzip ./patches/source/python3/python3.distutils.x86_64.diff +gzip ./patches/source/texlive/texlive-20230313-source-security_fix-1.patch +gzip ./patches/source/texlive/doinst.sh +gzip ./patches/source/texlive/texlive.unicode5.0.diff gzip ./patches/source/sysstat/doinst.sh gzip ./patches/source/xorg-server-xwayland/CVE-2022-46342.patch gzip ./patches/source/xorg-server-xwayland/CVE-2022-46343.patch -- cgit v1.2.3-65-gdbad