aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAshish Kumar Gupta <kumarashishg@google.com>2023-10-04 16:24:59 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-10-04 16:24:59 +0000
commit45075b337ae6c6229a67bfcba16ca53cc80f5401 (patch)
tree0185bbcd84908a3510e5d49af5bad888e2906c76
parent5478c9d2070d51e1dc7441f339a629da0cce6e20 (diff)
parent914e0a5950722425ee9940ee2fe23a1ab131ba68 (diff)
downloadlibcups-45075b337ae6c6229a67bfcba16ca53cc80f5401.tar.gz
Merge remote-tracking branch 'aosp/upstream-master' into mymerge am: a293ceeead am: d3bde411b6 am: b66d5bb57b am: 383bf344ae am: 914e0a5950
Original change: https://android-review.googlesource.com/c/platform/external/libcups/+/2770208 Change-Id: Iee9cbe4084d1b229f890392a853d0c062cf55e65 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--.gitignore2
-rw-r--r--.lgtm.yml3
-rw-r--r--CHANGES.md103
-rw-r--r--INSTALL.md2
-rw-r--r--METADATA6
-rw-r--r--Makefile10
-rw-r--r--README.md11
-rw-r--r--backend/backend-private.h12
-rw-r--r--backend/ipp.c89
-rw-r--r--backend/network.c2
-rw-r--r--backend/org.cups.usb-quirks69
-rw-r--r--backend/snmp.c10
-rw-r--r--backend/testbackend.c5
-rw-r--r--backend/usb-darwin.c140
-rw-r--r--backend/usb-libusb.c2
-rw-r--r--backend/usb-unix.c20
-rw-r--r--berkeley/lpc.c31
-rw-r--r--cgi-bin/admin.c97
-rw-r--r--cgi-bin/classes.c6
-rw-r--r--cgi-bin/help-index.c2
-rw-r--r--cgi-bin/ipp-var.c10
-rw-r--r--cgi-bin/printers.c6
-rw-r--r--cgi-bin/template.c17
-rw-r--r--cgi-bin/var.c4
-rw-r--r--conf/cgi.types1
-rw-r--r--config-scripts/cups-compiler.m48
-rwxr-xr-xconfigure24
-rw-r--r--configure.ac4
-rw-r--r--cups/auth.c39
-rw-r--r--cups/cups.h6
-rw-r--r--cups/cupspm.md4
-rw-r--r--cups/dest.c95
-rw-r--r--cups/getdevices.c18
-rw-r--r--cups/getifaddrs-internal.h1
-rw-r--r--cups/hash.c2
-rw-r--r--cups/http-addr.c2
-rw-r--r--cups/http-addrlist.c10
-rw-r--r--cups/http-support.c7
-rw-r--r--cups/http.c4
-rw-r--r--cups/http.h2
-rw-r--r--cups/ipp-file.c15
-rw-r--r--cups/ipp-support.c4
-rw-r--r--cups/ipp-vars.c20
-rw-r--r--cups/ipp.c174
-rw-r--r--cups/options.c9
-rw-r--r--cups/ppd-cache.c117
-rw-r--r--cups/ppd-mark.c2
-rw-r--r--cups/ppd-private.h2
-rw-r--r--cups/ppd.c93
-rw-r--r--cups/pwg-media.c4
-rw-r--r--cups/request.c4
-rw-r--r--cups/snprintf.c13
-rw-r--r--cups/testclient.c53
-rw-r--r--cups/testdest.c5
-rw-r--r--cups/tls-darwin.c5
-rw-r--r--cups/tls-gnutls.c7
-rw-r--r--cups/tls-sspi.c91
-rw-r--r--cups/tlscheck.c2
-rw-r--r--doc/help/cgi.html97
-rw-r--r--doc/help/cupspm.html6
-rw-r--r--doc/help/man-cupsd.conf.html13
-rw-r--r--doc/help/man-ipptool.html6
-rw-r--r--doc/help/man-ipptoolfile.html26
-rwxr-xr-xdoc/test.cgi7
-rwxr-xr-xdoc/test.php20
-rw-r--r--examples/testfile.txt120
-rw-r--r--filter/common.c2
-rw-r--r--filter/rastertohp.c3
-rw-r--r--filter/rastertopdf.cpp478
-rw-r--r--locale/cups.pot4
-rw-r--r--man/cupsd.conf.523
-rw-r--r--man/ipptool.111
-rw-r--r--man/ipptoolfile.533
-rw-r--r--notifier/rss.c2
-rw-r--r--packaging/cups.list.in4
-rw-r--r--ppdc/ppdc-import.cxx3
-rw-r--r--ppdc/ppdc-source.cxx6
-rw-r--r--ppdc/ppdc.cxx5
-rw-r--r--ppdc/ppdhtml.cxx2
-rw-r--r--ppdc/ppdi.cxx2
-rw-r--r--ppdc/ppdmerge.cxx2
-rw-r--r--ppdc/ppdpo.cxx2
-rw-r--r--ppdc/sample.drv19
-rw-r--r--scheduler/auth.c1
-rw-r--r--scheduler/cert.c4
-rw-r--r--scheduler/classes.c9
-rw-r--r--scheduler/client.c60
-rw-r--r--scheduler/conf.c2
-rw-r--r--scheduler/conf.h2
-rw-r--r--scheduler/cups-deviced.c2
-rw-r--r--scheduler/cups-lpd.c2
-rw-r--r--scheduler/ipp.c51
-rw-r--r--scheduler/job.c22
-rw-r--r--scheduler/listen.c2
-rw-r--r--scheduler/log.c4
-rw-r--r--scheduler/main.c6
-rw-r--r--scheduler/printers.c19
-rw-r--r--scheduler/subscriptions.c11
-rw-r--r--scheduler/sysman.c6
-rw-r--r--scheduler/util.c8
-rwxr-xr-xscripts/makesrcdist2
-rw-r--r--systemv/cancel.c8
-rw-r--r--systemv/cupstestppd.c1
-rw-r--r--systemv/lp.c18
-rw-r--r--systemv/lpadmin.c118
-rw-r--r--systemv/lpstat.c26
-rw-r--r--templates/Makefile2
-rw-r--r--templates/choose-model.tmpl2
-rwxr-xr-xtest/run-stp-tests.sh3
-rw-r--r--tools/ippeveprinter.c949
-rw-r--r--tools/ippeveps.c2
-rw-r--r--tools/ippfind.c18
-rw-r--r--tools/ipptool.c1947
-rw-r--r--tools/printer-lg-png.h1850
-rw-r--r--tools/printer-lg.pngbin0 -> 29521 bytes
-rw-r--r--tools/printer-png.h744
-rw-r--r--tools/printer-sm-png.h235
-rw-r--r--tools/printer-sm.pngbin0 -> 3687 bytes
-rw-r--r--tools/printer.pngbin4805 -> 7147 bytes
-rw-r--r--vcnet/config.h11
-rw-r--r--vcnet/dns_sd.c20
-rw-r--r--xcode/config.h6
122 files changed, 6547 insertions, 2028 deletions
diff --git a/.gitignore b/.gitignore
index a5e32e60..3bc3f2ef 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,6 @@
*.a
*.bck
-*.cgi
+/cgi-bin/*.cgi
*.o
autom4te.cache
config.h
diff --git a/.lgtm.yml b/.lgtm.yml
index 62655172..e7f2e0df 100644
--- a/.lgtm.yml
+++ b/.lgtm.yml
@@ -2,3 +2,6 @@ queries:
- exclude: cpp/integer-multiplication-cast-to-long
- exclude: cpp/missing-header-guard
- exclude: cpp/short-global-name
+ - exclude: cpp/tainted-format-string
+ - exclude: cpp/toctou-race-condition
+ - exclude: cpp/constant-comparison
diff --git a/CHANGES.md b/CHANGES.md
index df728926..9da22c8e 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,5 +1,103 @@
-CHANGES - 2.3.3 - 2020-04-24
-============================
+Change History
+==============
+
+Changes in CUPS v2.3.6
+----------------------
+- CVE-2022-26691: An incorrect comparison in local admin authentication.
+
+
+Changes in CUPS v2.3.5
+----------------------
+
+- The automated test suite can now be activated using `make test` for
+ consistency with other projects and CI environments - the old `make check`
+ continues to work as well, and the previous test server behavior can be
+ accessed by running `make testserver`.
+- ippeveprinter now supports multiple icons and strings files.
+- ippeveprinter now uses the system's FQDN with Avahi.
+- ippeveprinter now supports Get-Printer-Attributes on "/".
+- ippeveprinter now uses a deterministic "printer-uuid" value.
+- ippeveprinter now uses system sounds on macOS for Identify-Printer.
+- Updated ippfind to look for files in "~/Desktop" on Windows.
+- Updated ippfind to honor `SKIP-XXX` directives with `PAUSE`.
+- Updated IPP Everywhere support to work around printers that only advertise
+ color raster support but really also support grayscale (OpenPrinting #1)
+- ipptool now supports DNS-SD URIs like `ipps://My%20Printer._ipps._tcp.local`
+ (OpenPrinting #5)
+- ipptool now supports monitoring the printer state while submitting a job
+ with the `MONITOR-PRINTER-STATE` directive (OpenPrinting #153)
+- ipptool now supports testing for unique values with the `WITH-DISTINCT-VALUES`
+ predicate (OpenPrinting #153)
+- ipptool now supports retrying requests on a `server-error-busy` status code
+ (OpenPrinting #153)
+- ipptool now supports `value-tag(MAX)` and `value-tag(MIN:MAX)` for the
+ `OF-TYPE` predicate (OpenPrinting #153)
+- The scheduler now allows root backends to have world read permissions but not
+ world execute permissions (OpenPrinting #21)
+- Failures to bind IPv6 listener sockets no longer cause errors if IPv6 is
+ disabled on the host (OpenPrinting #25)
+- The SNMP backend now supports the HP and Ricoh vendor MIBs (OpenPrinting #28)
+- The scheduler no longer includes a timestamp in files it writes (OpenPrinting #29)
+- IPP Everywhere PPDs could have an "unknown" default InputSlot (OpenPrinting #44)
+- The `httpAddrListen` function now uses a listen backlog of 128.
+- The PPD functions now treat boolean values as case-insensitive (OpenPrinting #106)
+- Temporary queue names no longer end with an underscore (OpenPrinting #110)
+- Added USB quirks (Issue #5789, #5766, #5823, #5831, #5838, #5843, #5867)
+- Fixed IPP Everywhere v1.1 conformance issues in ippeveprinter.
+- Fixed DNS-SD name collision support in ippeveprinter.
+- Fixed compiler and code analyzer warnings.
+- Fixed TLS support on Windows.
+- Fixed ippfind sub-type searches with Avahi.
+- Fixed the default hostname used by ippeveprinter on macOS.
+- Fixed resolution of local IPP-USB printers with Avahi.
+- Fixed coverity issues (OpenPrinting #2)
+- Fixed `httpAddrConnect` issues (OpenPrinting #3)
+- Fixed web interface device URI issue (OpenPrinting #4)
+- Fixed lp/lpr "printer/class not found" error reporting (OpenPrinting #6)
+- Fixed a memory leak in the scheduler (OpenPrinting #12)
+- Fixed a potential integer overflow in the PPD hashing code (OpenPrinting #13)
+- Fixed output-bin and print-quality handling issues (OpenPrinting #18)
+- Fixed PPD options getting mapped to odd IPP values like "tray---4" (OpenPrinting #23)
+- Fixed remote access to the cupsd.conf and log files (OpenPrinting #24)
+- Fixed a logging regression caused by a previous change for Issue #5604
+ (OpenPrinting #25)
+- Fixed the "uri-security-supported" value from the scheduler (OpenPrinting #42)
+- Fixed IPP backend crash bug with "printer-alert" values (OpenPrinting #43)
+- Fixed default options that incorrectly use the "custom" prefix (OpenPrinting #48)
+- Fixed a memory leak when resolving DNS-SD URIs (OpenPrinting #49)
+- Fixed cupsManualCopies values in IPP Everywhere PPDs (Issue #5807)
+- Fixed duplicate ColorModel entries for AirPrint printers (Issue 59)
+- Fixed crash bug in `ppdOpen` (OpenPrinting #64, OpenPrinting #78)
+- Fixed regression in `snprintf` emulation function (OpenPrinting #67)
+- Fixed reporting of printer instances when enumerating and when no options are
+ set for the main instance (OpenPrinting #71)
+- Fixed segfault in help.cgi when searching in man pages (OpenPrinting #81)
+- Fixed a bug in ipptool that caused the reuse of request IDs when repeating a
+ test (OpenPrinting #153)
+- Root certificates were incorrectly stored in "~/.cups/ssl".
+- Fixed a PPD memory leak caused by emulator definitions (OpenPrinting #124)
+- Fixed a `DISPLAY` bug in `ipptool` (OpenPrinting #139)
+- `httpReconnect2` did not reset the socket file descriptor when the TLS
+ negotiation failed (Issue #5907)
+- `httpUpdate` did not reset the socket file descriptor when the TLS
+ negotiation failed (Apple #5915)
+- The `ippeveprinter` tool now automatically uses an available port.
+- The IPP backend now retries Validate-Job requests (OpenPrinting #132)
+- Removed support for the (long deprecated and unused) `KeepAliveTimeout`
+ directive in `cupsd.conf` (Issue #5733)
+- Fixed `@IF(name)` handling in `cupsd.conf` (Issue #5918)
+- The scheduler now supports the "everywhere" model directly (Issue #5919)
+- Fixed documentation and added examples for CUPS' limited CGI support
+ (Issue #5940)
+- Fixed the `lpc` command prompt (Issue #5946)
+- Fixed `job-pages-per-set` value for duplex print jobs.
+
+
+Changes in CUPS v2.3.4
+----------------------
+
+- CVE-2020-10001: Fixed a buffer (read) overflow in the `ippReadIO` function.
+
Changes in CUPS v2.3.3
----------------------
@@ -11,6 +109,7 @@ Changes in CUPS v2.3.3
field.
- Fixed WARNING_OPTIONS support for GCC 9.x
+
Changes in CUPS v2.3.2
----------------------
diff --git a/INSTALL.md b/INSTALL.md
index 37cc94b6..f88dfedf 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,4 +1,4 @@
-INSTALL - CUPS v2.3.3 - 2020-04-24
+INSTALL - CUPS v2.3.6 - 2022-05-25
==================================
This file describes how to compile and install CUPS from source code. For more
diff --git a/METADATA b/METADATA
index cc1d0e0b..bd0e1d9e 100644
--- a/METADATA
+++ b/METADATA
@@ -12,14 +12,14 @@ third_party {
type: GIT
value: "https://github.com/apple/cups/"
}
- version: "v2.3.3"
+ version: "v2.3.6"
license_type: BY_EXCEPTION_ONLY
license_note: "would be RESTRICTED save for Apple license in backend/usb-darwin.c"
security {
- tag: "NVD-CPE2.3:cpe:/a:cups:cups:2.3.3"
+ tag: "NVD-CPE2.3:cpe:/a:cups:cups:2.3.6"
}
last_upgrade_date {
- year: 2022
+ year: 2023
month: 10
day: 4
}
diff --git a/Makefile b/Makefile
index 15544627..294ac5ea 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
#
# Top-level Makefile for CUPS.
#
-# Copyright © 2007-2019 by Apple Inc.
+# Copyright © 2007-2021 by Apple Inc.
# Copyright © 1997-2007 by Easy Software Products, all rights reserved.
#
# Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -230,16 +230,16 @@ uninstall:
# Run the test suite...
#
-test: all unittests
- echo Running CUPS test suite...
+testserver: all unittests
+ echo Running CUPS test server...
cd test; ./run-stp-tests.sh $(TESTOPTIONS)
-check: all unittests
+check test: all unittests
echo Running CUPS test suite with defaults...
cd test; ./run-stp-tests.sh 1 0 n n
-debugcheck: all unittests
+debugcheck debugtest: all unittests
echo Running CUPS test suite with debug printfs...
cd test; ./run-stp-tests.sh 1 0 n y
diff --git a/README.md b/README.md
index 700213d7..f48de536 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,10 @@
-README - CUPS v2.3.3 - 2020-04-24
-=================================
+README - Apple CUPS v2.3.6 - 2022-05-25
+=======================================
+
+> Note: Apple CUPS is the version of CUPS that is shipped with macOS and iOS.
+> For the current version of CUPS that is used on other operating systems, see
+> <https://openprinting.github.io/cups> for details.
+
INTRODUCTION
------------
@@ -157,7 +162,7 @@ This will prevent the filters from misinterpreting your print file.
LEGAL STUFF
-----------
-Copyright © 2007-2019 by Apple Inc.
+Copyright © 2007-2021 by Apple Inc.
Copyright © 1997-2007 by Easy Software Products.
CUPS is provided under the terms of the Apache License, Version 2.0 with
diff --git a/backend/backend-private.h b/backend/backend-private.h
index 85fb8aef..d19b06b8 100644
--- a/backend/backend-private.h
+++ b/backend/backend-private.h
@@ -1,7 +1,8 @@
/*
* Backend support definitions for CUPS.
*
- * Copyright © 2007-2014 by Apple Inc.
+ * Copyright © 2021 by OpenPrinting
+ * Copyright © 2007-2021 by Apple Inc.
* Copyright © 1997-2007 by Easy Software Products, all rights reserved.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -53,6 +54,14 @@ extern "C" {
/*
+ * Log messages in backend signal handlers or other places where stdio cannot
+ * be used...
+ */
+
+# define backendMessage(msg) {const char *s = msg; write(2, s, strlen(s));}
+
+
+/*
* OID constants...
*/
@@ -320,7 +329,6 @@ extern int backendSNMPSupplies(int snmp_fd, http_addr_t *addr,
extern int backendWaitLoop(int snmp_fd, http_addr_t *addr,
int use_bc, _cups_sccb_t side_cb);
-
# ifdef __cplusplus
}
# endif /* __cplusplus */
diff --git a/backend/ipp.c b/backend/ipp.c
index 3f3e1867..3779c88f 100644
--- a/backend/ipp.c
+++ b/backend/ipp.c
@@ -1,7 +1,8 @@
/*
* IPP backend for CUPS.
*
- * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2021 by OpenPrinting
+ * Copyright © 2007-2021 by Apple Inc.
* Copyright © 1997-2007 by Easy Software Products, all rights reserved.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -256,6 +257,7 @@ main(int argc, /* I - Number of command-line args */
get_job_attrs = 0, /* Does printer support Get-Job-Attributes? */
send_document = 0, /* Does printer support Send-Document? */
validate_job = 0, /* Does printer support Validate-Job? */
+ validate_retried = 0, /* Was Validate-Job request retried? */
copies, /* Number of copies for job */
copies_remaining; /* Number of copies remaining */
const char *content_type, /* CONTENT_TYPE environment variable */
@@ -1559,7 +1561,17 @@ main(int argc, /* I - Number of command-line args */
ipp_status == IPP_STATUS_ERROR_BAD_REQUEST)
break;
else if (job_auth == NULL && ipp_status > IPP_STATUS_ERROR_BAD_REQUEST)
+ {
+ if (!validate_retried)
+ {
+ // Retry Validate-Job operation once, to work around known printer bug...
+ validate_retried = 1;
+ sleep(10);
+ continue;
+ }
+
goto cleanup;
+ }
}
/*
@@ -2240,7 +2252,8 @@ main(int argc, /* I - Number of command-line args */
else if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED)
fputs("JOBSTATE: account-authorization-failed\n", stderr);
- if (job_canceled)
+ // job_canceled can be -1 which should not be treated as CUPS_BACKEND_OK
+ if (job_canceled > 0)
return (CUPS_BACKEND_OK);
else if (ipp_status == IPP_STATUS_ERROR_NOT_AUTHORIZED || ipp_status == IPP_STATUS_ERROR_FORBIDDEN || ipp_status == IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED)
return (CUPS_BACKEND_AUTH_REQUIRED);
@@ -2825,7 +2838,21 @@ new_request(
*/
_httpDecodeURI(phone, keyword, sizeof(phone));
- for (ptr = phone; *ptr;)
+ ptr = phone;
+
+ /*
+ * Weed out "Custom." in the beginning, this allows to put the
+ * "phone" option as custom string option into the PPD so that
+ * print dialogs not supporting fax display the option and
+ * allow entering the phone number. Print dialogs also send "None"
+ * if no phone number got entered, filter this, too.
+ */
+ if (!_cups_strcasecmp(phone, "None"))
+ *ptr = '\0';
+ if (!_cups_strncasecmp(phone, "Custom.", 7))
+ _cups_strcpy(ptr, ptr + 7);
+
+ for (; *ptr;)
{
if (*ptr == ',')
*ptr = 'p';
@@ -2835,20 +2862,36 @@ new_request(
ptr ++;
}
- httpAssembleURI(HTTP_URI_CODING_ALL, tel_uri, sizeof(tel_uri), "tel", NULL, NULL, 0, phone);
- ippAddString(destination, IPP_TAG_JOB, IPP_TAG_URI, "destination-uri", NULL, tel_uri);
-
- if ((keyword = cupsGetOption("faxPrefix", num_options,
- options)) != NULL && *keyword)
+ if (strlen(phone) > 0)
{
- char predial[1024]; /* Pre-dial string */
+ httpAssembleURI(HTTP_URI_CODING_ALL, tel_uri, sizeof(tel_uri), "tel", NULL, NULL, 0, phone);
+ ippAddString(destination, IPP_TAG_JOB, IPP_TAG_URI, "destination-uri", NULL, tel_uri);
+ fprintf(stderr, "DEBUG: Faxing to phone %s; destination-uri: %s\n", phone, tel_uri);
- _httpDecodeURI(predial, keyword, sizeof(predial));
- ippAddString(destination, IPP_TAG_JOB, IPP_TAG_TEXT, "pre-dial-string", NULL, predial);
- }
+ if ((keyword = cupsGetOption("faxPrefix", num_options, options)) != NULL && *keyword)
+ {
+ char predial[1024]; /* Pre-dial string */
+
+ _httpDecodeURI(predial, keyword, sizeof(predial));
+ ptr = predial;
+ if (!_cups_strcasecmp(ptr, "None"))
+ *ptr = '\0';
+ if (!_cups_strncasecmp(ptr, "Custom.", 7))
+ ptr += 7;
+ if (strlen(ptr) > 0)
+ {
+ ippAddString(destination, IPP_TAG_JOB, IPP_TAG_TEXT, "pre-dial-string", NULL, ptr);
+ fprintf(stderr, "DEBUG: Pre-dialing %s; pre-dial-string: %s\n", ptr, ptr);
+ }
+ else
+ fprintf(stderr, "WARNING: Pre-dial number for fax not valid! Sending fax without pre-dial number.\n");
+ }
- ippAddCollection(request, IPP_TAG_JOB, "destination-uris", destination);
- ippDelete(destination);
+ ippAddCollection(request, IPP_TAG_JOB, "destination-uris", destination);
+ ippDelete(destination);
+ }
+ else
+ fprintf(stderr, "ERROR: Phone number for fax not valid! Fax cannot be sent.\n");
}
}
else
@@ -3075,7 +3118,7 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */
* Report alerts and messages...
*/
- if ((pa = ippFindAttribute(ipp, "printer-alert", IPP_TAG_TEXT)) != NULL)
+ if ((pa = ippFindAttribute(ipp, "printer-alert", IPP_TAG_STRING)) != NULL)
report_attr(pa);
if ((pam = ippFindAttribute(ipp, "printer-alert-message",
@@ -3116,11 +3159,10 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */
if (*ptr < ' ' && *ptr > 0 && *ptr != '\t')
{
/*
- * Substitute "<XX>" for the control character; sprintf is safe because
- * we always leave 6 chars free at the end...
+ * Substitute "<XX>" for the control character...
*/
- sprintf(valptr, "<%02X>", *ptr);
+ snprintf(valptr, sizeof(value) - (size_t)(valptr - value), "<%02X>", *ptr);
valptr += 4;
}
else
@@ -3203,7 +3245,8 @@ run_as_user(char *argv[], /* I - Command-line arguments */
const char *device_uri, /* I - Device URI */
int fd) /* I - File to print */
{
- const char *auth_negotiate;/* AUTH_NEGOTIATE env var */
+ const char *auth_negotiate,/* AUTH_NEGOTIATE env var */
+ *content_type; /* [FINAL_]CONTENT_TYPE env vars */
xpc_connection_t conn; /* Connection to XPC service */
xpc_object_t request; /* Request message dictionary */
__block xpc_object_t response; /* Response message dictionary */
@@ -3266,6 +3309,10 @@ run_as_user(char *argv[], /* I - Command-line arguments */
getenv("AUTH_INFO_REQUIRED"));
if ((auth_negotiate = getenv("AUTH_NEGOTIATE")) != NULL)
xpc_dictionary_set_string(request, "auth-negotiate", auth_negotiate);
+ if ((content_type = getenv("CONTENT_TYPE")) != NULL)
+ xpc_dictionary_set_string(request, "content-type", content_type);
+ if ((content_type = getenv("FINAL_CONTENT_TYPE")) != NULL)
+ xpc_dictionary_set_string(request, "final-content-type", content_type);
xpc_dictionary_set_fd(request, "stdin", fd);
xpc_dictionary_set_fd(request, "stderr", 2);
xpc_dictionary_set_fd(request, "side-channel", CUPS_SC_FD);
@@ -3388,7 +3435,7 @@ sigterm_handler(int sig) /* I - Signal */
{
(void)sig; /* remove compiler warnings... */
- write(2, "DEBUG: Got SIGTERM.\n", 20);
+ backendMessage("DEBUG: Got SIGTERM.\n");
#if defined(HAVE_GSSAPI) && defined(HAVE_XPC)
if (child_pid)
@@ -3404,7 +3451,7 @@ sigterm_handler(int sig) /* I - Signal */
* Flag that the job should be canceled...
*/
- write(2, "DEBUG: sigterm_handler: job_canceled = 1.\n", 25);
+ backendMessage("DEBUG: sigterm_handler: job_canceled = 1.\n");
job_canceled = 1;
return;
diff --git a/backend/network.c b/backend/network.c
index 5af0a8ee..f7ee2fbb 100644
--- a/backend/network.c
+++ b/backend/network.c
@@ -258,7 +258,7 @@ backendNetworkSideCB(
i < packet.object_value.string.num_bytes &&
dataptr < (data + sizeof(data) - 3);
i ++, dataptr += 2)
- sprintf(dataptr, "%02X", packet.object_value.string.bytes[i]);
+ snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%02X", packet.object_value.string.bytes[i]);
datalen += (int)strlen(dataptr);
break;
diff --git a/backend/org.cups.usb-quirks b/backend/org.cups.usb-quirks
index cd684d33..83f62c16 100644
--- a/backend/org.cups.usb-quirks
+++ b/backend/org.cups.usb-quirks
@@ -68,7 +68,7 @@
# Canon, Inc. PIXMA iP6000D Printer (https://bugs.launchpad.net/bugs/1160638)
0x04a9 0x1095 unidir
-# Canon, Inc. PIXMA iP4200 Printer (Issue #4155)
+# Canon, Inc. PIXMA iP4200 Printer (Apple #4155)
0x04a9 0x10a2 unidir
# Canon, Inc. PIXMA iP4300 Printer (https://bugs.launchpad.net/bugs/1032385)
@@ -86,12 +86,15 @@
# Canon, Inc. MP540 Printer, https://bugzilla.redhat.com/967873
0x04a9 0x1730 unidir
-# Canon, Inc. MP550 Printer (Issue #4155)
+# Canon, Inc. MP550 Printer (Apple #4155)
0x04a9 0x173d unidir
-# Canon, Inc. MP560 Printer (Issue #4155)
+# Canon, Inc. MP560 Printer (Apple #4155)
0x04a9 0x173e unidir
+# Canon, Inc. PIXMA G1501 Printer (Apple #5831)
+0x04a9 0x1796 unidir
+
# Canon, Inc. MF4150 Printer (https://bugs.launchpad.net/bugs/1160638)
0x04a9 0x26a3 no-reattach
@@ -140,7 +143,7 @@
# Samsung ML-2160 Series (https://bugzilla.redhat.com/show_bug.cgi?id=873123)
0x04e8 0x330f unidir
-# All Zebra devices (https://bugs.launchpad.net/bugs/1001028) (Issue #5395)
+# All Zebra devices (https://bugs.launchpad.net/bugs/1001028) (Apple #5395)
0x0a5f unidir no-reattach
# Canon CP-10
@@ -230,75 +233,87 @@
# Lexmark E238 (<rdar://problem/14493054>)
0x043d 0x00d7 no-reattach
-# Lexmark E238 (Issue #4448)
+# Lexmark E238 (Apple #4448)
0x043d 0x009a no-reattach
-# Canon MX310 (Issue #4482)
+# Canon MX310 (Apple #4482)
0x04a9 0x1728 unidir
-# Canon MX320 (Issue #4482)
+# Canon MX320 (Apple #4482)
0x04A9 0x1736 unidir
-# All Intermec devices (Issue #4553)
+# All Intermec devices (Apple #4553)
0x067e no-reattach
-# HP LaserJet 1015 (Issue #5617)
+# HP LaserJet 1010 (Apple #5789)
+0x03f0 0x0c17 delay-close
+
+# HP LaserJet 1015 (Apple #5617)
0x03f0 0x0e17 delay-close
-# HP LaserJet 1150 (Issue #4549)
+# HP LaserJet 1150 (Apple #4549)
0x03f0 0x0f17 delay-close
-# HP LaserJet 1300 (Issue #4549)
+# HP LaserJet 1300 (Apple #4549)
0x03f0 0x1017 delay-close
0x03f0 0x1117 delay-close
-# HP LaserJet 1320 (Issue #4549)
+# HP LaserJet 1320 (Apple #4549)
0x03f0 0x1d17 delay-close
# Canon, Inc. MP530 Printer
0x04a9 0x1712 unidir
-# Xerox WorkCentre 3220 (https://bugs.launchpad.net/bugs/1406203, Issue #4789)
+# Xerox WorkCentre 3220 (https://bugs.launchpad.net/bugs/1406203, Apple #4789)
0x0924 0x4294 no-reattach
-# Lexmark C540n (Issue #4778)
+# Lexmark C540n (Apple #4778)
0x043d 0x0139 no-reattach
-# Kyocera Ecosys P6026cdn (Issue #4900)
+# Kyocera Ecosys P6026cdn (Apple #4900)
0x0482 0x063f no-reattach
-# Kyocera Ecosys P6130cdn (Issue #5102)
+# Kyocera Ecosys P6130cdn (Apple #5102)
0x0482 0x0677 no-reattach
-# Lexmark E260dn (Issue #4994)
+# Lexmark E260dn (Apple #4994)
0x043d 0x0123 no-reattach
-# HP LaserJet 1160 (Issue #5121)
+# HP LaserJet 1160 (Apple #5121)
0x03f0 0x1e17 delay-close
-# Canon, Inc. MP280 series (Issue #5221)
+# Canon, Inc. MP280 series (Apple #5221)
0x04a9 0x1746 unidir
-# Star Micronics printers (Issue #5251)
+# Star Micronics printers (Apple #5251)
0x0519 unidir
-# Lexmark Optra E310 (Issue #5259)
+# Lexmark Optra E310 (Apple #5259)
0x043d 0x000c no-reattach
-# HP LaserJet P1102 (Issue #5310)
+# HP LaserJet P1102 (Apple #5310)
0x03F0 0x002A no-reattach
# Lexmark MS317dn
0x043d 0x0226 no-reattach
-# Star TSP743 (Issue #5443)
+# Star TSP743 (Apple #5443)
0x0519 0x0001 delay-close
-# Lexmark E120n (Issue #5478)
+# Lexmark E120n (Apple #5478)
0x043d 0x00cc no-reattach
-# All Xerox printers (Issue #5523)
+# Lexmark E120n MT4506-100 (Apple #5766)
+0x043d 0x00cd no-reattach
+
+# All Xerox printers (Apple #5523)
0x0924 no-reattach
-# Dymo 450 Turbo (Issue #5521)
-0x0922 0x0021 unidir
+# Citizen CT-S4000 (Apple #5823)
+0x2730 0x2008 unidir delay-close
+
+# All Arkscan label printers (Apple #5867)
+0x2d84 unidir no-reattach
+
+# HP DesignJet 130 (Apple #5838)
+0x03f0 0x0314 no-reattach
diff --git a/backend/snmp.c b/backend/snmp.c
index 66ac884c..084c6f51 100644
--- a/backend/snmp.c
+++ b/backend/snmp.c
@@ -154,6 +154,8 @@ static const int UriOID[] = { CUPS_OID_ppmPortServiceNameOrURI, 1, 1, -1 };
static const int LexmarkProductOID[] = { 1,3,6,1,4,1,641,2,1,2,1,2,1,-1 };
static const int LexmarkProductOID2[] = { 1,3,6,1,4,1,674,10898,100,2,1,2,1,2,1,-1 };
static const int LexmarkDeviceIdOID[] = { 1,3,6,1,4,1,641,2,1,2,1,3,1,-1 };
+static const int HPDeviceIdOID[] = { 1,3,6,1,4,1,11,2,3,9,1,1,7,0,-1 };
+static const int RicohDeviceIdOID[] = { 1,3,6,1,4,1,367,3,2,1,1,1,11,0,-1 };
static const int XeroxProductOID[] = { 1,3,6,1,4,1,128,2,1,3,1,2,0,-1 };
static cups_array_t *DeviceURIs = NULL;
static int HostNameLookups = 0;
@@ -422,7 +424,7 @@ alarm_handler(int sig) /* I - Signal number */
#endif /* !HAVE_SIGSET && !HAVE_SIGACTION */
if (DebugLevel)
- write(2, "DEBUG: ALARM!\n", 14);
+ backendMessage("DEBUG: ALARM!\n");
}
@@ -970,8 +972,14 @@ read_snmp_response(int fd) /* I - SNMP socket file descriptor */
packet.community, CUPS_ASN1_GET_REQUEST,
DEVICE_ID, LexmarkDeviceIdOID);
_cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1,
+ packet.community, CUPS_ASN1_GET_REQUEST,
+ DEVICE_ID, RicohDeviceIdOID);
+ _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1,
packet.community, CUPS_ASN1_GET_REQUEST,
DEVICE_PRODUCT, XeroxProductOID);
+ _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1,
+ packet.community, CUPS_ASN1_GET_REQUEST,
+ DEVICE_ID, HPDeviceIdOID);
break;
case DEVICE_DESCRIPTION :
diff --git a/backend/testbackend.c b/backend/testbackend.c
index 6dbd0abe..6412a022 100644
--- a/backend/testbackend.c
+++ b/backend/testbackend.c
@@ -19,6 +19,7 @@
#include <fcntl.h>
#include <sys/wait.h>
#include <signal.h>
+#include "backend-private.h"
/*
@@ -395,7 +396,7 @@ main(int argc, /* I - Number of command-line args */
data = ps_data;
write(1, data, strlen(data));
- write(2, "DEBUG: START\n", 13);
+ backendMessage("DEBUG: START\n");
timeout = 60.0;
while ((bytes = cupsBackChannelRead(buffer, sizeof(buffer),
timeout)) > 0)
@@ -403,7 +404,7 @@ main(int argc, /* I - Number of command-line args */
write(2, buffer, (size_t)bytes);
timeout = 5.0;
}
- write(2, "\nDEBUG: END\n", 12);
+ backendMessage("\nDEBUG: END\n");
}
exit(0);
diff --git a/backend/usb-darwin.c b/backend/usb-darwin.c
index 1c412da6..f0d04ab4 100644
--- a/backend/usb-darwin.c
+++ b/backend/usb-darwin.c
@@ -1,5 +1,7 @@
/*
- * Copyright 2005-2016 Apple Inc. All rights reserved.
+ * USB backend for macOS.
+ *
+ * Copyright © 2005-2021 Apple Inc. All rights reserved.
*
* IMPORTANT: This Apple software is supplied to you by Apple Computer,
* Inc. ("Apple") in consideration of your agreement to the following
@@ -288,11 +290,11 @@ static void status_timer_cb(CFRunLoopTimerRef timer, void *info);
#define IS_64BIT 1
#define IS_NOT_64BIT 0
-#if defined(__i386__) || defined(__x86_64__)
+#if defined(__arm64e__)
static pid_t child_pid; /* Child PID */
-static void run_legacy_backend(int argc, char *argv[], int fd) _CUPS_NORETURN; /* Starts child backend process running as a ppc executable */
-#endif /* __i386__ || __x86_64__ */
-static void sigterm_handler(int sig); /* SIGTERM handler */
+static void run_legacy_backend(int argc, char *argv[], int fd) _CUPS_NORETURN; /* Starts child backend process running as a x86_64 executable */
+static void sigterm_handler(int sig); /* SIGTERM handler */
+#endif /* __arm64e__ */
static void sigquit_handler(int sig, siginfo_t *si, void *unused) _CUPS_NORETURN;
#ifdef PARSE_PS_ERRORS
@@ -357,6 +359,8 @@ print_device(const char *uri, /* I - Device URI */
(void)uri;
+ (void)argc;
+ (void)argv;
/*
* Catch SIGQUIT to determine who is sending it...
@@ -436,18 +440,18 @@ print_device(const char *uri, /* I - Device URI */
status = registry_open(&driverBundlePath);
-#if defined(__i386__) || defined(__x86_64__)
+#if defined(__arm64e__)
/*
* If we were unable to load the class drivers for this printer it's
- * probably because they're ppc or i386. In this case try to run this
- * backend as i386 or ppc executables so we can use them...
+ * probably because they're x86_64 (or older). In this case try to run this
+ * backend as x86_64 so we can use them...
*/
if (status == -2)
{
run_legacy_backend(argc, argv, print_fd);
/* Never returns here */
}
-#endif /* __i386__ || __x86_64__ */
+#endif /* __arm64e__ */
if (status == -2)
{
@@ -1510,12 +1514,11 @@ static kern_return_t load_printerdriver(CFStringRef *driverBundlePath)
SInt32 score;
kern_return_t kr;
printer_interface_t interface;
- HRESULT res;
kr = IOCreatePlugInInterfaceForService(g.printer_obj, kIOUSBInterfaceUserClientTypeID, kIOCFPlugInInterfaceID, &iodev, &score);
if (kr == kIOReturnSuccess)
{
- if ((res = (*iodev)->QueryInterface(iodev, USB_INTERFACE_KIND, (LPVOID *) &interface)) == noErr)
+ if ((*iodev)->QueryInterface(iodev, USB_INTERFACE_KIND, (LPVOID *) &interface) == noErr)
{
*driverBundlePath = IORegistryEntryCreateCFProperty(g.printer_obj, kUSBClassDriverProperty, NULL, kNilOptions);
@@ -1596,7 +1599,7 @@ static CFStringRef copy_printer_interface_deviceid(printer_interface_t printer,
/* This request takes the 0 based configuration index. IOKit returns a 1 based configuration index */
configurationIndex -= 1;
- bzero(&request, sizeof(request));
+ memset(&request, 0, sizeof(request));
request.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBClass, kUSBInterface);
request.bRequest = kUSBPrintClassGetDeviceID;
@@ -1613,14 +1616,14 @@ static CFStringRef copy_printer_interface_deviceid(printer_interface_t printer,
if (actualLength > 2 && actualLength <= bufferLength - 2)
{
- ret = CFStringCreateWithBytes(NULL, (const UInt8 *) &request.pData[2], actualLength - 2, kCFStringEncodingUTF8, false);
+ ret = CFStringCreateWithBytes(NULL, (const UInt8 *)request.pData + 2, actualLength - 2, kCFStringEncodingUTF8, false);
}
else if (actualLength > 2) {
err = sendRequest(actualLength);
if (err == kIOReturnSuccess && request.wLenDone > 0)
{
actualLength = OSSwapBigToHostInt16(*((UInt16 *)request.pData));
- ret = CFStringCreateWithBytes(NULL, (const UInt8 *) &request.pData[2], actualLength - 2, kCFStringEncodingUTF8, false);
+ ret = CFStringCreateWithBytes(NULL, (const UInt8 *)request.pData + 2, actualLength - 2, kCFStringEncodingUTF8, false);
}
}
}
@@ -1638,7 +1641,7 @@ static CFStringRef copy_printer_interface_deviceid(printer_interface_t printer,
IOUSBDevRequestTO request;
IOUSBDeviceDescriptor desc;
- bzero(&request, sizeof(request));
+ memset(&request, 0, sizeof(request));
request.bmRequestType = USBmakebmRequestType( kUSBIn, kUSBStandard, kUSBDevice );
request.bRequest = kUSBRqGetDescriptor;
@@ -1667,41 +1670,59 @@ static CFStringRef copy_printer_interface_deviceid(printer_interface_t printer,
CFStringAppendFormat(extras, NULL, CFSTR("MDL:%@;"), model);
}
- if (serial == NULL && desc.iSerialNumber != 0)
+ if (desc.iSerialNumber != 0)
{
- serial = copy_printer_interface_indexed_description(printer, desc.iSerialNumber, kUSBLanguageEnglish);
- if (serial && CFStringGetLength(serial) > 0)
- CFStringAppendFormat(extras, NULL, CFSTR("SERN:%@;"), serial);
+ // Always look at the USB serial number since some printers
+ // incorrectly include a bogus static serial number in their
+ // IEEE-1284 device ID string...
+ CFStringRef userial = copy_printer_interface_indexed_description(printer, desc.iSerialNumber, kUSBLanguageEnglish);
+ if (userial && CFStringGetLength(userial) > 0 && (serial == NULL || CFStringCompare(serial, userial, kCFCompareCaseInsensitive) != kCFCompareEqualTo))
+ {
+ if (serial != NULL)
+ {
+ // 1284 serial number doesn't match USB serial number, so replace the existing SERN: in device ID
+ CFRange range = CFStringFind(ret, serial, 0);
+ CFMutableStringRef deviceIDString = CFStringCreateMutableCopy(NULL, 0, ret);
+ CFStringReplace(deviceIDString, range, userial);
+ CFRelease(ret);
+ ret = deviceIDString;
+
+ CFRelease(serial);
+ }
+ else
+ {
+ // No 1284 serial number so add SERN: with USB serial number to device ID
+ CFStringAppendFormat(extras, NULL, CFSTR("SERN:%@;"), userial);
+ }
+ serial = userial;
+ }
+ else if (userial != NULL)
+ CFRelease(userial);
}
if (ret != NULL)
{
CFStringAppend(extras, ret);
CFRelease(ret);
-
- ret = extras;
- }
- else
- {
- ret = extras;
}
+ ret = extras;
}
}
if (ret != NULL)
{
- /* Remove special characters from the serial number */
- CFRange range = (serial != NULL ? CFStringFind(serial, CFSTR("+"), 0) : CFRangeMake(0, 0));
- if (range.length == 1)
- {
- range = CFStringFind(ret, serial, 0);
+ /* Remove special characters from the serial number */
+ CFRange range = (serial != NULL ? CFStringFind(serial, CFSTR("+"), 0) : CFRangeMake(0, 0));
+ if (range.length == 1)
+ {
+ range = CFStringFind(ret, serial, 0);
- CFMutableStringRef deviceIDString = CFStringCreateMutableCopy(NULL, 0, ret);
- CFRelease(ret);
+ CFMutableStringRef deviceIDString = CFStringCreateMutableCopy(NULL, 0, ret);
+ CFRelease(ret);
- ret = deviceIDString;
- CFStringFindAndReplace(deviceIDString, CFSTR("+"), CFSTR(""), range, 0);
- }
+ ret = deviceIDString;
+ CFStringFindAndReplace(deviceIDString, CFSTR("+"), CFSTR(""), range, 0);
+ }
}
if (manufacturer != NULL)
@@ -1728,7 +1749,7 @@ static CFStringRef copy_printer_interface_indexed_description(printer_interface_
UInt8 description[256]; // Max possible descriptor length
IOUSBDevRequestTO request;
- bzero(description, 2);
+ memset(description, 0, 2);
request.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice);
request.bRequest = kUSBRqGetDescriptor;
@@ -1742,7 +1763,7 @@ static CFStringRef copy_printer_interface_indexed_description(printer_interface_
err = (*printer)->ControlRequestTO(printer, 0, &request);
if (err != kIOReturnSuccess && err != kIOReturnOverrun)
{
- bzero(description, request.wLength);
+ memset(description, 0, request.wLength);
// Let's try again full length. Here's why:
// On USB 2.0 controllers, we will not get an overrun error. We just get a "babble" error
@@ -1775,7 +1796,7 @@ static CFStringRef copy_printer_interface_indexed_description(printer_interface_
request.wValue = (kUSBStringDesc << 8) | index;
request.wIndex = language;
- bzero(description, length);
+ memset(description, 0, length);
request.wLength = (UInt16)length;
request.pData = &description;
request.completionTimeout = 0;
@@ -1791,7 +1812,7 @@ static CFStringRef copy_printer_interface_indexed_description(printer_interface_
if ((description[0] & 1) != 0)
description[0] &= 0xfe;
- char buffer[258] = {};
+ char buffer[258] = {0};
unsigned int maxLength = sizeof buffer;
if (description[0] > 1)
{
@@ -2053,11 +2074,11 @@ static void setup_cfLanguage(void)
}
#pragma mark -
-#if defined(__i386__) || defined(__x86_64__)
+#if defined(__arm64e__)
/*!
* @function run_legacy_backend
*
- * @abstract Starts child backend process running as a ppc or i386 executable.
+ * @abstract Starts child backend process running as a x86_64 executable.
*
* @result Never returns; always calls exit().
*
@@ -2076,18 +2097,14 @@ static void run_legacy_backend(int argc,
/*
- * If we're running as x86_64 or i386 and couldn't load the class driver
- * (because it's ppc or i386), then try to re-exec ourselves in ppc or i386
- * mode to try again. If we don't have a ppc or i386 architecture we may be
+ * If we're running as ARM and couldn't load the class driver
+ * (because it's x86_64, i386 or ppc), then try to re-exec ourselves in x86_64
+ * mode to try again. If we don't have that architecture we may be
* running with the same architecture again so guard against this by setting
* and testing an environment variable...
*/
-# ifdef __x86_64__
- usb_legacy_status = getenv("USB_I386_STATUS");
-# else
- usb_legacy_status = getenv("USB_PPC_STATUS");
-# endif /* __x86_64__ */
+ usb_legacy_status = getenv("USB_LEGACY_STATUS");
if (!usb_legacy_status)
{
@@ -2116,21 +2133,13 @@ static void run_legacy_backend(int argc,
* Set the environment variable...
*/
-# ifdef __x86_64__
- setenv("USB_I386_STATUS", "1", false);
-# else
- setenv("USB_PPC_STATUS", "1", false);
-# endif /* __x86_64__ */
+ setenv("USB_LEGACY_STATUS", "1", false);
/*
* Tell the kernel to use the specified CPU architecture...
*/
-# ifdef __x86_64__
- cpu_type_t cpu = CPU_TYPE_I386;
-# else
- cpu_type_t cpu = CPU_TYPE_POWERPC;
-# endif /* __x86_64__ */
+ cpu_type_t cpu = CPU_TYPE_X86_64;
size_t ocount = 1;
posix_spawnattr_t attrs;
@@ -2139,11 +2148,7 @@ static void run_legacy_backend(int argc,
posix_spawnattr_setsigdefault(&attrs, &oldmask);
if (posix_spawnattr_setbinpref_np(&attrs, 1, &cpu, &ocount) || ocount != 1)
{
-# ifdef __x86_64__
- perror("DEBUG: Unable to set binary preference to i386");
-# else
- perror("DEBUG: Unable to set binary preference to ppc");
-# endif /* __x86_64__ */
+ perror("DEBUG: Unable to set binary preference to X86_64");
_cupsLangPrintFilter(stderr, "ERROR",
_("Unable to use legacy USB class driver."));
exit(CUPS_BACKEND_STOP);
@@ -2217,8 +2222,6 @@ static void run_legacy_backend(int argc,
exit(exitstatus);
}
-#endif /* __i386__ || __x86_64__ */
-
/*
* 'sigterm_handler()' - SIGTERM handler.
@@ -2227,7 +2230,6 @@ static void run_legacy_backend(int argc,
static void
sigterm_handler(int sig) /* I - Signal */
{
-#if defined(__i386__) || defined(__x86_64__)
/*
* If we started a child process pass the signal on to it...
*/
@@ -2249,12 +2251,12 @@ sigterm_handler(int sig) /* I - Signal */
_exit(0);
else
{
- write(2, "DEBUG: Child crashed.\n", 22);
+ backendMessage("DEBUG: Child crashed.\n");
_exit(CUPS_BACKEND_STOP);
}
}
-#endif /* __i386__ || __x86_64__ */
}
+#endif /* __arm64e__ */
/*
diff --git a/backend/usb-libusb.c b/backend/usb-libusb.c
index 393fe65e..d7c76239 100644
--- a/backend/usb-libusb.c
+++ b/backend/usb-libusb.c
@@ -1,7 +1,7 @@
/*
* LIBUSB interface code for CUPS.
*
- * Copyright 2007-2019 by Apple Inc.
+ * Copyright 2007-2020 by Apple Inc.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
* information.
diff --git a/backend/usb-unix.c b/backend/usb-unix.c
index 81e20c52..d256a813 100644
--- a/backend/usb-unix.c
+++ b/backend/usb-unix.c
@@ -214,21 +214,21 @@ list_devices(void)
* for USB printer devices. We get the honor of trying them all...
*/
- sprintf(device, "/dev/usblp%d", i);
+ snprintf(device, sizeof(device), "/dev/usblp%d", i);
if ((fd = open(device, O_RDWR | O_EXCL)) < 0)
{
if (errno != ENOENT)
continue;
- sprintf(device, "/dev/usb/lp%d", i);
+ snprintf(device, sizeof(device), "/dev/usb/lp%d", i);
if ((fd = open(device, O_RDWR | O_EXCL)) < 0)
{
if (errno != ENOENT)
continue;
- sprintf(device, "/dev/usb/usblp%d", i);
+ snprintf(device, sizeof(device), "/dev/usb/usblp%d", i);
if ((fd = open(device, O_RDWR | O_EXCL)) < 0)
continue;
@@ -258,7 +258,7 @@ list_devices(void)
for (i = 0; i < 8; i ++)
{
- sprintf(device, "/dev/usb/printer%d", i);
+ snprintf(device, sizeof(device), "/dev/usb/printer%d", i);
if ((fd = open(device, O_WRONLY | O_EXCL)) >= 0)
{
@@ -278,11 +278,11 @@ list_devices(void)
for (i = 0; i < 8; i ++)
{
- sprintf(device, "/dev/ulpt%d", i);
+ snprintf(device, sizeof(device), "/dev/ulpt%d", i);
if (!access(device, 0))
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
- sprintf(device, "/dev/unlpt%d", i);
+ snprintf(device, sizeof(device), "/dev/unlpt%d", i);
if (!access(device, 0))
printf("direct usb:%s \"Unknown\" \"USB Printer #%d (no reset)\"\n", device, i + 1);
}
@@ -344,15 +344,15 @@ open_device(const char *uri, /* I - Device URI */
* for USB printer devices. We get the honor of trying them all...
*/
- sprintf(device, "/dev/usblp%d", i);
+ snprintf(device, sizeof(device), "/dev/usblp%d", i);
if ((fd = open(device, O_RDWR | O_EXCL)) < 0 && errno == ENOENT)
{
- sprintf(device, "/dev/usb/lp%d", i);
+ snprintf(device, sizeof(device), "/dev/usb/lp%d", i);
if ((fd = open(device, O_RDWR | O_EXCL)) < 0 && errno == ENOENT)
{
- sprintf(device, "/dev/usb/usblp%d", i);
+ snprintf(device, sizeof(device), "/dev/usb/usblp%d", i);
if ((fd = open(device, O_RDWR | O_EXCL)) < 0 && errno == ENOENT)
continue;
@@ -440,7 +440,7 @@ open_device(const char *uri, /* I - Device URI */
{
for (i = 0, busy = 0; i < 8; i ++)
{
- sprintf(device, "/dev/usb/printer%d", i);
+ snprintf(device, sizeof(device), "/dev/usb/printer%d", i);
if ((fd = open(device, O_WRONLY | O_EXCL)) >= 0)
backendGetDeviceID(fd, device_id, sizeof(device_id),
diff --git a/berkeley/lpc.c b/berkeley/lpc.c
index 7ab43ea1..7af10354 100644
--- a/berkeley/lpc.c
+++ b/berkeley/lpc.c
@@ -21,6 +21,7 @@
static int compare_strings(const char *, const char *, size_t);
static void do_command(http_t *, const char *, const char *);
static void show_help(const char *);
+static void show_prompt(const char *message);
static void show_status(http_t *, const char *);
@@ -59,7 +60,7 @@ main(int argc, /* I - Number of command-line arguments */
* Do the command prompt thing...
*/
- _cupsLangPuts(stdout, _("lpc> ")); /* TODO: Need no-newline version */
+ show_prompt(_("lpc> "));
while (fgets(line, sizeof(line), stdin) != NULL)
{
/*
@@ -87,7 +88,7 @@ main(int argc, /* I - Number of command-line arguments */
* Nothing left, just show a prompt...
*/
- _cupsLangPuts(stdout, _("lpc> ")); /* TODO: Need no newline version */
+ show_prompt(_("lpc> "));
continue;
}
@@ -123,7 +124,7 @@ main(int argc, /* I - Number of command-line arguments */
* Put another prompt out to the user...
*/
- _cupsLangPuts(stdout, _("lpc> ")); /* TODO: Need no newline version */
+ show_prompt(_("lpc> "));
}
}
@@ -201,6 +202,30 @@ show_help(const char *command) /* I - Command to describe or NULL */
/*
+ * 'show_prompt()' - Show a localized prompt message.
+ */
+
+static void
+show_prompt(const char *message) /* I - Message string to use */
+{
+ ssize_t bytes; /* Number of bytes formatted */
+ char output[8192]; /* Message buffer */
+ cups_lang_t *lang = cupsLangDefault();
+ /* Default language */
+
+ /*
+ * Transcode to the destination charset and write the prompt...
+ */
+
+ if ((bytes = cupsUTF8ToCharset(output, (cups_utf8_t *)_cupsLangString(lang, message), sizeof(output), lang->encoding)) > 0)
+ {
+ fwrite(output, 1, (size_t)bytes, stdout);
+ fflush(stdout);
+ }
+}
+
+
+/*
* 'show_status()' - Show printers.
*/
diff --git a/cgi-bin/admin.c b/cgi-bin/admin.c
index f087809f..57ae4e86 100644
--- a/cgi-bin/admin.c
+++ b/cgi-bin/admin.c
@@ -1,7 +1,7 @@
/*
* Administration CGI for CUPS.
*
- * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2007-2021 by Apple Inc.
* Copyright © 1997-2007 by Easy Software Products.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -50,7 +50,6 @@ static void do_set_sharing(http_t *http);
static char *get_option_value(ppd_file_t *ppd, const char *name,
char *buffer, size_t bufsize);
static double get_points(double number, const char *uval);
-static char *get_printer_ppd(const char *uri, char *buffer, size_t bufsize);
/*
@@ -208,7 +207,7 @@ main(void)
* bytes left in the array...
*/
- sprintf(ptr, "%%%02X", *url & 255);
+ snprintf(ptr, sizeof(encoded) - (size_t)(ptr - encoded), "%%%02X", *url & 255);
ptr += 3;
}
else
@@ -763,6 +762,13 @@ do_am_printer(http_t *http, /* I - HTTP connection */
cgiSetVariable("TEMPLATE_NAME", template);
}
+
+ /*
+ * Set DEVICE_URI to the actual device uri, without make and model from
+ * html form.
+ */
+
+ cgiSetVariable("DEVICE_URI", var);
}
}
@@ -864,7 +870,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */
break;
else
{
- sprintf(baudrate, "%d", baudrates[i]);
+ snprintf(baudrate, sizeof(baudrate), "%d", baudrates[i]);
cgiSetArray("BAUDRATES", i, baudrate);
}
@@ -1118,9 +1124,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */
if (!file)
{
var = cgiGetVariable("PPD_NAME");
- if (!strcmp(var, "everywhere"))
- get_printer_ppd(cgiGetVariable("DEVICE_URI"), evefile, sizeof(evefile));
- else if (strcmp(var, "__no_change__"))
+ if (strcmp(var, "__no_change__"))
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name",
NULL, var);
}
@@ -3728,82 +3732,3 @@ get_points(double number, /* I - Original number */
else /* Points */
return (number);
}
-
-
-/*
- * 'get_printer_ppd()' - Get an IPP Everywhere PPD file for the given URI.
- */
-
-static char * /* O - Filename or NULL */
-get_printer_ppd(const char *uri, /* I - Printer URI */
- char *buffer, /* I - Filename buffer */
- size_t bufsize) /* I - Size of filename buffer */
-{
- http_t *http; /* Connection to printer */
- ipp_t *request, /* Get-Printer-Attributes request */
- *response; /* Get-Printer-Attributes response */
- char resolved[1024], /* Resolved URI */
- scheme[32], /* URI scheme */
- userpass[256], /* Username:password */
- host[256], /* Hostname */
- resource[256]; /* Resource path */
- int port; /* Port number */
- static const char * const pattrs[] = /* Printer attributes we need */
- {
- "all",
- "media-col-database"
- };
-
-
- /*
- * Connect to the printer...
- */
-
- if (strstr(uri, "._tcp"))
- {
- /*
- * Resolve URI...
- */
-
- if (!_httpResolveURI(uri, resolved, sizeof(resolved), _HTTP_RESOLVE_DEFAULT, NULL, NULL))
- {
- fprintf(stderr, "ERROR: Unable to resolve \"%s\".\n", uri);
- return (NULL);
- }
-
- uri = resolved;
- }
-
- if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
- {
- fprintf(stderr, "ERROR: Bad printer URI \"%s\".\n", uri);
- return (NULL);
- }
-
- http = httpConnect2(host, port, NULL, AF_UNSPEC, !strcmp(scheme, "ipps") ? HTTP_ENCRYPTION_ALWAYS : HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL);
- if (!http)
- {
- fprintf(stderr, "ERROR: Unable to connect to \"%s:%d\": %s\n", host, port, cupsLastErrorString());
- return (NULL);
- }
-
- /*
- * Send a Get-Printer-Attributes request...
- */
-
- request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
- ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(pattrs) / sizeof(pattrs[0])), NULL, pattrs);
- response = cupsDoRequest(http, request, resource);
-
- if (!_ppdCreateFromIPP(buffer, bufsize, response))
- fprintf(stderr, "ERROR: Unable to create PPD file: %s\n", strerror(errno));
-
- ippDelete(response);
- httpClose(http);
-
- if (buffer[0])
- return (buffer);
- else
- return (NULL);
-}
diff --git a/cgi-bin/classes.c b/cgi-bin/classes.c
index 78ef08e2..718604ab 100644
--- a/cgi-bin/classes.c
+++ b/cgi-bin/classes.c
@@ -362,7 +362,7 @@ show_all_classes(http_t *http, /* I - Connection to server */
if (first < 0)
first = 0;
- sprintf(val, "%d", count);
+ snprintf(val, sizeof(val), "%d", count);
cgiSetVariable("TOTAL", val);
for (i = 0, pclass = (ipp_attribute_t *)cupsArrayIndex(classes, first);
@@ -378,13 +378,13 @@ show_all_classes(http_t *http, /* I - Connection to server */
if (first > 0)
{
- sprintf(val, "%d", first - CUPS_PAGE_MAX);
+ snprintf(val, sizeof(val), "%d", first - CUPS_PAGE_MAX);
cgiSetVariable("PREV", val);
}
if ((first + CUPS_PAGE_MAX) < count)
{
- sprintf(val, "%d", first + CUPS_PAGE_MAX);
+ snprintf(val, sizeof(val), "%d", first + CUPS_PAGE_MAX);
cgiSetVariable("NEXT", val);
}
diff --git a/cgi-bin/help-index.c b/cgi-bin/help-index.c
index ce97e47a..3da1010e 100644
--- a/cgi-bin/help-index.c
+++ b/cgi-bin/help-index.c
@@ -579,7 +579,7 @@ helpSearchIndex(help_index_t *hi, /* I - Index */
*/
for (; node; node = (help_node_t *)cupsArrayNext(hi->nodes))
- if (section && strcmp(node->section, section))
+ if (node->section && section && strcmp(node->section, section))
continue;
else if (filename && strcmp(node->filename, filename))
continue;
diff --git a/cgi-bin/ipp-var.c b/cgi-bin/ipp-var.c
index 8c5a5616..443f920a 100644
--- a/cgi-bin/ipp-var.c
+++ b/cgi-bin/ipp-var.c
@@ -224,7 +224,7 @@ cgiGetIPPObjects(ipp_t *response, /* I - IPP response */
char buf[255]; /* Number buffer */
- sprintf(buf, "%d", attr->values[i].integer);
+ snprintf(buf, sizeof(buf), "%d", attr->values[i].integer);
if (cgiDoSearch(search, buf))
add = 1;
@@ -291,7 +291,7 @@ cgiMoveJobs(http_t *http, /* I - Connection to server */
char temp[255]; /* Temporary string */
- sprintf(temp, "%d", job_id);
+ snprintf(temp, sizeof(temp), "%d", job_id);
cgiSetVariable("JOB_ID", temp);
}
@@ -1441,7 +1441,7 @@ cgiShowJobs(http_t *http, /* I - Connection to server */
cgiSetVariable("SECTION", section);
- sprintf(val, "%d", count);
+ snprintf(val, sizeof(val), "%d", count);
cgiSetVariable("TOTAL", val);
if (which_jobs)
@@ -1469,13 +1469,13 @@ cgiShowJobs(http_t *http, /* I - Connection to server */
if (first > 0)
{
- sprintf(val, "%d", first - CUPS_PAGE_MAX);
+ snprintf(val, sizeof(val), "%d", first - CUPS_PAGE_MAX);
cgiSetVariable("PREV", val);
}
if ((first + CUPS_PAGE_MAX) < count)
{
- sprintf(val, "%d", first + CUPS_PAGE_MAX);
+ snprintf(val, sizeof(val), "%d", first + CUPS_PAGE_MAX);
cgiSetVariable("NEXT", val);
}
diff --git a/cgi-bin/printers.c b/cgi-bin/printers.c
index bbc153e3..2a33b683 100644
--- a/cgi-bin/printers.c
+++ b/cgi-bin/printers.c
@@ -379,7 +379,7 @@ show_all_printers(http_t *http, /* I - Connection to server */
if (first < 0)
first = 0;
- sprintf(val, "%d", count);
+ snprintf(val, sizeof(val), "%d", count);
cgiSetVariable("TOTAL", val);
for (i = 0, printer = (ipp_attribute_t *)cupsArrayIndex(printers, first);
@@ -395,13 +395,13 @@ show_all_printers(http_t *http, /* I - Connection to server */
if (first > 0)
{
- sprintf(val, "%d", first - CUPS_PAGE_MAX);
+ snprintf(val, sizeof(val), "%d", first - CUPS_PAGE_MAX);
cgiSetVariable("PREV", val);
}
if ((first + CUPS_PAGE_MAX) < count)
{
- sprintf(val, "%d", first + CUPS_PAGE_MAX);
+ snprintf(val, sizeof(val), "%d", first + CUPS_PAGE_MAX);
cgiSetVariable("NEXT", val);
}
diff --git a/cgi-bin/template.c b/cgi-bin/template.c
index 1972b4ae..3300a885 100644
--- a/cgi-bin/template.c
+++ b/cgi-bin/template.c
@@ -33,7 +33,6 @@ cgiCopyTemplateFile(FILE *out, /* I - Output file */
{
FILE *in; /* Input file */
-
fprintf(stderr, "DEBUG2: cgiCopyTemplateFile(out=%p, tmpl=\"%s\")\n", out,
tmpl ? tmpl : "(null)");
@@ -51,7 +50,7 @@ cgiCopyTemplateFile(FILE *out, /* I - Output file */
if ((in = fopen(tmpl, "r")) == NULL)
{
fprintf(stderr, "ERROR: Unable to open template file \"%s\" - %s\n",
- tmpl ? tmpl : "(null)", strerror(errno));
+ tmpl, strerror(errno));
return;
}
@@ -91,8 +90,6 @@ cgiCopyTemplateLang(const char *tmpl) /* I - Base filename */
* Convert the language to a locale name...
*/
- locale[0] = '\0';
-
if ((lang = getenv("LANG")) != NULL)
{
locale[0] = '/';
@@ -101,6 +98,10 @@ cgiCopyTemplateLang(const char *tmpl) /* I - Base filename */
if ((locptr = strchr(locale, '.')) != NULL)
*locptr = '\0'; /* Strip charset */
}
+ else
+ {
+ locale[0] = '\0';
+ }
fprintf(stderr, "DEBUG2: lang=\"%s\", locale=\"%s\"...\n",
lang ? lang : "(null)", locale);
@@ -307,9 +308,9 @@ cgi_copy(FILE *out, /* I - Output file */
*/
if (name[1])
- sprintf(outval, "%d", cgiGetSize(name + 1));
+ snprintf(outval, sizeof(outval), "%d", cgiGetSize(name + 1));
else
- sprintf(outval, "%d", element + 1);
+ snprintf(outval, sizeof(outval), "%d", element + 1);
outptr = outval;
}
@@ -457,7 +458,7 @@ cgi_copy(FILE *out, /* I - Output file */
continue;
else if (ch == '#')
{
- sprintf(s, "%d", element + 1);
+ snprintf(s, sizeof(compare) - (size_t)(s - compare), "%d", element + 1);
s += strlen(s);
}
else if (ch == '{')
@@ -473,7 +474,7 @@ cgi_copy(FILE *out, /* I - Output file */
*innerptr = '\0';
if (innername[0] == '#')
- sprintf(s, "%d", cgiGetSize(innername + 1));
+ snprintf(s, sizeof(compare) - (size_t)(s - compare), "%d", cgiGetSize(innername + 1));
else if ((innerptr = strrchr(innername, '-')) != NULL &&
isdigit(innerptr[1] & 255))
{
diff --git a/cgi-bin/var.c b/cgi-bin/var.c
index 349a2184..c7289c72 100644
--- a/cgi-bin/var.c
+++ b/cgi-bin/var.c
@@ -1,7 +1,7 @@
/*
* CGI form variable and array functions for CUPS.
*
- * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2007-2020 by Apple Inc.
* Copyright © 1997-2005 by Easy Software Products.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -304,7 +304,7 @@ cgiInitialize(void)
if (boundary)
boundary += 9;
- if (content_type && !strncmp(content_type, "multipart/form-data; ", 21))
+ if (!strncmp(content_type, "multipart/form-data; ", 21))
{
if (!cgi_initialize_multipart(boundary))
return (0);
diff --git a/conf/cgi.types b/conf/cgi.types
new file mode 100644
index 00000000..2c39b3f2
--- /dev/null
+++ b/conf/cgi.types
@@ -0,0 +1 @@
+application/x-httpd-cgi cgi php
diff --git a/config-scripts/cups-compiler.m4 b/config-scripts/cups-compiler.m4
index 86e8bc48..604faf1b 100644
--- a/config-scripts/cups-compiler.m4
+++ b/config-scripts/cups-compiler.m4
@@ -1,7 +1,7 @@
dnl
dnl Compiler stuff for CUPS.
dnl
-dnl Copyright 2007-2018 by Apple Inc.
+dnl Copyright 2007-2020 by Apple Inc.
dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
dnl
dnl Licensed under Apache License v2.0. See the file "LICENSE" for more information.
@@ -169,20 +169,20 @@ if test -n "$GCC"; then
fi
# Add useful warning options for tracking down problems...
- WARNING_OPTIONS="-Wall -Wno-format-y2k -Wunused -Wno-unused-result -Wsign-conversion"
+ WARNING_OPTIONS="-Wall -Wno-format-y2k -Wunused -Wno-unused-result -Wsign-conversion -Wno-unused-but-set-variable -Wno-unused-variable"
# Test GCC version for certain warning flags since -Werror
# doesn't trigger...
gccversion=`$CC --version | head -1 | awk '{print $NF}'`
case "$gccversion" in
- 7.* | 8.*)
+ 7.* | 8.* | 9.*)
WARNING_OPTIONS="$WARNING_OPTIONS -Wno-format-truncation -Wno-tautological-compare"
;;
esac
# Additional warning options for development testing...
if test -d .git; then
- WARNING_OPTIONS="-Werror -Wno-error=deprecated-declarations $WARNING_OPTIONS"
+ WARNING_OPTIONS="-Werror -Wno-error=deprecated-declarations -Wno-unknown-warning-option $WARNING_OPTIONS"
fi
else
# Add vendor-specific compiler options...
diff --git a/configure b/configure
index 7a7a12f8..642b3058 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for CUPS 2.3.3.
+# Generated by GNU Autoconf 2.69 for CUPS 2.3.6.
#
# Report bugs to <https://github.com/apple/cups/issues>.
#
@@ -580,8 +580,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='CUPS'
PACKAGE_TARNAME='cups'
-PACKAGE_VERSION='2.3.3'
-PACKAGE_STRING='CUPS 2.3.3'
+PACKAGE_VERSION='2.3.6'
+PACKAGE_STRING='CUPS 2.3.6'
PACKAGE_BUGREPORT='https://github.com/apple/cups/issues'
PACKAGE_URL='https://www.cups.org/'
@@ -1467,7 +1467,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures CUPS 2.3.3 to adapt to many kinds of systems.
+\`configure' configures CUPS 2.3.6 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1532,7 +1532,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of CUPS 2.3.3:";;
+ short | recursive ) echo "Configuration of CUPS 2.3.6:";;
esac
cat <<\_ACEOF
@@ -1713,7 +1713,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-CUPS configure 2.3.3
+CUPS configure 2.3.6
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2177,7 +2177,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by CUPS $as_me 2.3.3, which was
+It was created by CUPS $as_me 2.3.6, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2694,7 +2694,7 @@ done
ac_config_headers="$ac_config_headers config.h"
-CUPS_VERSION="2.3.3"
+CUPS_VERSION="2.3.6"
CUPS_REVISION=""
CUPS_BUILD="cups-$CUPS_VERSION"
@@ -6905,7 +6905,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
# Add useful warning options for tracking down problems...
- WARNING_OPTIONS="-Wall -Wno-format-y2k -Wunused -Wno-unused-result -Wsign-conversion"
+ WARNING_OPTIONS="-Wall -Wno-format-y2k -Wunused -Wno-unused-result -Wsign-conversion -Wno-unused-but-set-variable -Wno-unused-variable"
# Test GCC version for certain warning flags since -Werror
# doesn't trigger...
@@ -6918,7 +6918,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
# Additional warning options for development testing...
if test -d .git; then
- WARNING_OPTIONS="-Werror -Wno-error=deprecated-declarations $WARNING_OPTIONS"
+ WARNING_OPTIONS="-Werror -Wno-error=deprecated-declarations -Wno-unknown-warning-option $WARNING_OPTIONS"
fi
else
# Add vendor-specific compiler options...
@@ -10385,7 +10385,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by CUPS $as_me 2.3.3, which was
+This file was extended by CUPS $as_me 2.3.6, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -10448,7 +10448,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-CUPS config.status 2.3.3
+CUPS config.status 2.3.6
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index dbf3bda3..f8767969 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
dnl
dnl Configuration script for CUPS.
dnl
-dnl Copyright © 2007-2019 by Apple Inc.
+dnl Copyright © 2007-2021 by Apple Inc.
dnl Copyright © 1997-2007 by Easy Software Products, all rights reserved.
dnl
dnl Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -12,7 +12,7 @@ dnl We need at least autoconf 2.60...
AC_PREREQ(2.60)
dnl Package name and version...
-AC_INIT([CUPS], [2.3.3], [https://github.com/apple/cups/issues], [cups], [https://www.cups.org/])
+AC_INIT([CUPS], [2.3.6], [https://github.com/apple/cups/issues], [cups], [https://www.cups.org/])
sinclude(config-scripts/cups-opsys.m4)
sinclude(config-scripts/cups-common.m4)
diff --git a/cups/auth.c b/cups/auth.c
index db45bbba..bff6d218 100644
--- a/cups/auth.c
+++ b/cups/auth.c
@@ -90,6 +90,7 @@ static void cups_gss_printf(OM_uint32 major_status, OM_uint32 minor_status,
# define cups_gss_printf(major, minor, message)
# endif /* DEBUG */
#endif /* HAVE_GSSAPI */
+static int cups_is_local_connection(http_t *http);
static int cups_local_auth(http_t *http);
@@ -174,10 +175,10 @@ cupsDoAuthentication(
DEBUG_printf(("2cupsDoAuthentication: Trying scheme \"%s\"...", scheme));
#ifdef HAVE_GSSAPI
- if (!_cups_strcasecmp(scheme, "Negotiate"))
+ if (!_cups_strcasecmp(scheme, "Negotiate") && !cups_is_local_connection(http))
{
/*
- * Kerberos authentication...
+ * Kerberos authentication to remote server...
*/
int gss_status; /* Auth status */
@@ -201,7 +202,9 @@ cupsDoAuthentication(
}
else
#endif /* HAVE_GSSAPI */
- if (_cups_strcasecmp(scheme, "Basic") && _cups_strcasecmp(scheme, "Digest"))
+ if (_cups_strcasecmp(scheme, "Basic") &&
+ _cups_strcasecmp(scheme, "Digest") &&
+ _cups_strcasecmp(scheme, "Negotiate"))
{
/*
* Other schemes not yet supported...
@@ -215,7 +218,7 @@ cupsDoAuthentication(
* See if we should retry the current username:password...
*/
- if ((http->digest_tries > 1 || !http->userpass[0]) && (!_cups_strcasecmp(scheme, "Basic") || (!_cups_strcasecmp(scheme, "Digest"))))
+ if (http->digest_tries > 1 || !http->userpass[0])
{
/*
* Nope - get a new password from the user...
@@ -295,7 +298,7 @@ cupsDoAuthentication(
}
}
- if (http->authstring)
+ if (http->authstring && http->authstring[0])
{
DEBUG_printf(("1cupsDoAuthentication: authstring=\"%s\".", http->authstring));
@@ -327,10 +330,6 @@ _cupsSetNegotiateAuthString(
gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER;
/* Output token */
-
- (void)method;
- (void)resource;
-
# ifdef __APPLE__
/*
* If the weak-linked GSSAPI/Kerberos library is not present, don't try
@@ -447,6 +446,9 @@ _cupsSetNegotiateAuthString(
}
}
}
+# else
+ (void)method;
+ (void)resource;
# endif /* HAVE_GSS_ACQUIRED_CRED_EX_F */
if (major_status == GSS_S_NO_CRED)
@@ -559,9 +561,9 @@ cups_auth_find(const char *www_authenticate, /* I - Pointer into WWW-Authenticat
* Skip quoted value...
*/
- www_authenticate ++;
- while (*www_authenticate && *www_authenticate != '\"')
+ do
www_authenticate ++;
+ while (*www_authenticate && *www_authenticate != '\"');
DEBUG_printf(("9cups_auth_find: After quoted: \"%s\"", www_authenticate));
}
@@ -916,6 +918,14 @@ cups_gss_printf(OM_uint32 major_status,/* I - Major status code */
# endif /* DEBUG */
#endif /* HAVE_GSSAPI */
+static int /* O - 0 if not a local connection */
+ /* 1 if local connection */
+cups_is_local_connection(http_t *http) /* I - HTTP connection to server */
+{
+ if (!httpAddrLocalhost(http->hostaddr) && _cups_strcasecmp(http->hostname, "localhost") != 0)
+ return 0;
+ return 1;
+}
/*
* 'cups_local_auth()' - Get the local authorization certificate if
@@ -958,7 +968,7 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
* See if we are accessing localhost...
*/
- if (!httpAddrLocalhost(http->hostaddr) && _cups_strcasecmp(http->hostname, "localhost") != 0)
+ if (!cups_is_local_connection(http))
{
DEBUG_puts("8cups_local_auth: Not a local connection!");
return (1);
@@ -1032,11 +1042,6 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
}
# endif /* HAVE_AUTHORIZATION_H */
-# ifdef HAVE_GSSAPI
- if (cups_auth_find(www_auth, "Negotiate"))
- return (1);
-# endif /* HAVE_GSSAPI */
-
# if defined(SO_PEERCRED) && defined(AF_LOCAL)
/*
* See if we can authenticate using the peer credentials provided over a
diff --git a/cups/cups.h b/cups/cups.h
index 74955ebd..bdf9f7a1 100644
--- a/cups/cups.h
+++ b/cups/cups.h
@@ -1,7 +1,7 @@
/*
* API definitions for CUPS.
*
- * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2007-2022 by Apple Inc.
* Copyright © 1997-2007 by Easy Software Products.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -42,10 +42,10 @@ extern "C" {
* Constants...
*/
-# define CUPS_VERSION 2.0303
+# define CUPS_VERSION 2.0306
# define CUPS_VERSION_MAJOR 2
# define CUPS_VERSION_MINOR 3
-# define CUPS_VERSION_PATCH 3
+# define CUPS_VERSION_PATCH 6
# define CUPS_BC_FD 3
/* Back-channel file descriptor for
diff --git a/cups/cupspm.md b/cups/cupspm.md
index b6e09baa..7e03c3d6 100644
--- a/cups/cupspm.md
+++ b/cups/cupspm.md
@@ -1,8 +1,8 @@
---
title: CUPS Programming Manual
author: Michael R Sweet
-copyright: Copyright © 2007-2019 by Apple Inc. All Rights Reserved.
-version: 2.3.3
+copyright: Copyright © 2007-2022 by Apple Inc. All Rights Reserved.
+version: 2.3.6
...
> Please [file issues on Github](https://github.com/apple/cups/issues) to
diff --git a/cups/dest.c b/cups/dest.c
index cde987a0..984c6bdd 100644
--- a/cups/dest.c
+++ b/cups/dest.c
@@ -271,7 +271,11 @@ cupsAddDest(const char *name, /* I - Destination name */
if (!cupsGetDest(name, instance, num_dests, *dests))
{
if (instance && !cupsGetDest(name, NULL, num_dests, *dests))
- return (num_dests);
+ {
+ // Add destination first...
+ if ((dest = cups_add_dest(name, NULL, &num_dests, dests)) == NULL)
+ return (num_dests);
+ }
if ((dest = cups_add_dest(name, instance, &num_dests, dests)) == NULL)
return (num_dests);
@@ -1839,7 +1843,10 @@ cupsGetNamedDest(http_t *http, /* I - Connection to server or @code CUPS_HTT
cupsEnumDests(0, 1000, NULL, 0, 0, (cups_dest_cb_t)cups_name_cb, &data);
if (!data.dest)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist."), 1);
return (NULL);
+ }
dest = data.dest;
}
@@ -3376,7 +3383,7 @@ cups_enum_dests(
cups_dest_cb_t cb, /* I - Callback function */
void *user_data) /* I - User data */
{
- int i, j, /* Looping vars */
+ int i, j, k, /* Looping vars */
num_dests; /* Number of destinations */
cups_dest_t *dests = NULL, /* Destinations */
*dest; /* Current destination */
@@ -3521,17 +3528,31 @@ cups_enum_dests(
const char *device_uri; /* Device URI */
#endif /* HAVE_DNSSD || HAVE_AVAHI */
- if ((user_dest = cupsGetDest(dest->name, dest->instance, data.num_dests, data.dests)) != NULL)
+ if ((user_dest = cupsGetDest(dest->name, NULL, data.num_dests, data.dests)) != NULL)
{
/*
- * Apply user defaults to this destination...
+ * Apply user defaults to this destination for all instances...
*/
- for (j = user_dest->num_options, option = user_dest->options; j > 0; j --, option ++)
- dest->num_options = cupsAddOption(option->name, option->value, dest->num_options, &dest->options);
- }
+ for (j = user_dest - data.dests; j < data.num_dests; j ++, user_dest ++)
+ {
+ if (_cups_strcasecmp(user_dest->name, dest->name))
+ {
+ j = data.num_dests;
+ break;
+ }
- if (!(*cb)(user_data, i > 1 ? CUPS_DEST_FLAGS_MORE : CUPS_DEST_FLAGS_NONE, dest))
+ for (k = dest->num_options, option = dest->options; k > 0; k --, option ++)
+ user_dest->num_options = cupsAddOption(option->name, option->value, user_dest->num_options, &user_dest->options);
+
+ if (!(*cb)(user_data, i > 1 ? CUPS_DEST_FLAGS_MORE : CUPS_DEST_FLAGS_NONE, user_dest))
+ break;
+ }
+
+ if (j < data.num_dests)
+ break;
+ }
+ else if (!(*cb)(user_data, i > 1 ? CUPS_DEST_FLAGS_MORE : CUPS_DEST_FLAGS_NONE, dest))
break;
#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
@@ -3794,25 +3815,45 @@ cups_enum_dests(
if ((user_dest = cupsGetDest(dest->name, dest->instance, data.num_dests, data.dests)) != NULL)
{
/*
- * Apply user defaults to this destination...
+ * Apply user defaults to this destination for all instances...
*/
- for (j = user_dest->num_options, option = user_dest->options; j > 0; j --, option ++)
- dest->num_options = cupsAddOption(option->name, option->value, dest->num_options, &dest->options);
- }
+ for (j = user_dest - data.dests; j < data.num_dests; j ++, user_dest ++)
+ {
+ if (_cups_strcasecmp(user_dest->name, dest->name))
+ {
+ j = data.num_dests;
+ break;
+ }
- if (!strcasecmp(dest->name, data.def_name) && !data.def_instance)
- {
- DEBUG_printf(("1cups_enum_dests: Setting is_default on discovered \"%s\".", dest->name));
- dest->is_default = 1;
+ for (k = dest->num_options, option = dest->options; k > 0; k --, option ++)
+ user_dest->num_options = cupsAddOption(option->name, option->value, user_dest->num_options, &user_dest->options);
+
+ if (!(*cb)(user_data, CUPS_DEST_FLAGS_NONE, user_dest))
+ break;
+ }
+
+ if (j < data.num_dests)
+ {
+ remaining = -1;
+ break;
+ }
}
+ else
+ {
+ if (!strcasecmp(dest->name, data.def_name) && !data.def_instance)
+ {
+ DEBUG_printf(("1cups_enum_dests: Setting is_default on discovered \"%s\".", dest->name));
+ dest->is_default = 1;
+ }
- DEBUG_printf(("1cups_enum_dests: Add callback for \"%s\".", device->dest.name));
- if (!(*cb)(user_data, CUPS_DEST_FLAGS_NONE, dest))
- {
- remaining = -1;
- break;
- }
+ DEBUG_printf(("1cups_enum_dests: Add callback for \"%s\".", device->dest.name));
+ if (!(*cb)(user_data, CUPS_DEST_FLAGS_NONE, dest))
+ {
+ remaining = -1;
+ break;
+ }
+ }
}
device->state = _CUPS_DNSSD_ACTIVE;
@@ -4183,7 +4224,7 @@ cups_get_dests(
* Out of memory!
*/
- DEBUG_puts("9cups_get_dests: Out of memory!");
+ DEBUG_puts("9cups_get_dests: Could not find destination after adding, must be out of memory.");
break;
}
}
@@ -4366,5 +4407,13 @@ cups_queue_name(
*nameptr++ = '_';
}
+ /*
+ * Remove an underscore if it is the last character and isn't the only
+ * character in the name...
+ */
+
+ if (nameptr > (name + 1) && nameptr[-1] == '_')
+ nameptr --;
+
*nameptr = '\0';
}
diff --git a/cups/getdevices.c b/cups/getdevices.c
index de2186f5..a3554064 100644
--- a/cups/getdevices.c
+++ b/cups/getdevices.c
@@ -246,20 +246,14 @@ cupsGetDevices(
httpBlocking(http, blocking);
httpFlush(http);
- if (status == HTTP_STATUS_ERROR)
- _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(http->error), 0);
- else
- {
- attr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT);
+ attr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT);
- DEBUG_printf(("cupsGetDevices: status-code=%s, status-message=\"%s\"",
- ippErrorString(response->request.status.status_code),
- attr ? attr->values[0].string.text : ""));
+ DEBUG_printf(("cupsGetDevices: status-code=%s, status-message=\"%s\"",
+ ippErrorString(response->request.status.status_code),
+ attr ? attr->values[0].string.text : ""));
- _cupsSetError(response->request.status.status_code,
- attr ? attr->values[0].string.text :
- ippErrorString(response->request.status.status_code), 0);
- }
+ _cupsSetError(response->request.status.status_code,
+ attr ? attr->values[0].string.text : ippErrorString(response->request.status.status_code), 0);
ippDelete(response);
diff --git a/cups/getifaddrs-internal.h b/cups/getifaddrs-internal.h
index 35e98be7..4e20f73d 100644
--- a/cups/getifaddrs-internal.h
+++ b/cups/getifaddrs-internal.h
@@ -25,6 +25,7 @@
# include <unistd.h>
# include <fcntl.h>
# include <sys/socket.h>
+# include <netinet/in.h>
# define CUPS_SOCAST
# endif /* _WIN32 */
diff --git a/cups/hash.c b/cups/hash.c
index 4fbb443d..c153c665 100644
--- a/cups/hash.c
+++ b/cups/hash.c
@@ -199,7 +199,7 @@ cupsHashData(const char *algorithm, /* I - Algorithm name */
goto too_small;
_cupsMD5Init(&state);
- _cupsMD5Append(&state, data, datalen);
+ _cupsMD5Append(&state, data, (int)datalen);
_cupsMD5Finish(&state, hash);
return (16);
diff --git a/cups/http-addr.c b/cups/http-addr.c
index 86749c84..8e81c6f7 100644
--- a/cups/http-addr.c
+++ b/cups/http-addr.c
@@ -243,7 +243,7 @@ httpAddrListen(http_addr_t *addr, /* I - Address to bind to */
* Listen...
*/
- if (listen(fd, 5))
+ if (listen(fd, 128))
{
_cupsSetHTTPError(HTTP_STATUS_ERROR);
diff --git a/cups/http-addrlist.c b/cups/http-addrlist.c
index 485c6f43..89b3d92f 100644
--- a/cups/http-addrlist.c
+++ b/cups/http-addrlist.c
@@ -238,7 +238,14 @@ httpAddrConnect2(
}
if (!addrlist && nfds == 0)
+ {
+#ifdef _WIN32
+ errno = WSAEHOSTDOWN;
+#else
+ errno = EHOSTDOWN;
+#endif // _WIN32
break;
+ }
/*
* See if we can connect to any of the addresses so far...
@@ -369,6 +376,9 @@ httpAddrConnect2(
remaining -= 250;
}
+ if (remaining <= 0)
+ errno = ETIMEDOUT;
+
while (nfds > 0)
{
nfds --;
diff --git a/cups/http-support.c b/cups/http-support.c
index 63175145..49557300 100644
--- a/cups/http-support.c
+++ b/cups/http-support.c
@@ -841,6 +841,13 @@ httpGetDateTime(const char *s) /* I - Date/time string */
"min=%d, sec=%d", day, mon, year, hour, min, sec));
/*
+ * Check for invalid year (RFC 7231 says it's 4DIGIT)
+ */
+
+ if (year > 9999)
+ return (0);
+
+ /*
* Convert the month name to a number from 0 to 11.
*/
diff --git a/cups/http.c b/cups/http.c
index 8d69ce31..43ace18f 100644
--- a/cups/http.c
+++ b/cups/http.c
@@ -1,7 +1,7 @@
/*
* HTTP routines for CUPS.
*
- * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2007-2021 by Apple Inc.
* Copyright © 1997-2007 by Easy Software Products, all rights reserved.
*
* This file contains Kerberos support code, copyright 2006 by
@@ -2421,6 +2421,7 @@ httpReconnect2(http_t *http, /* I - HTTP connection */
if (_httpTLSStart(http) != 0)
{
httpAddrClose(NULL, http->fd);
+ http->fd = -1;
return (-1);
}
@@ -2786,6 +2787,7 @@ _httpUpdate(http_t *http, /* I - HTTP connection */
if (_httpTLSStart(http) != 0)
{
httpAddrClose(NULL, http->fd);
+ http->fd = -1;
*status = http->status = HTTP_STATUS_ERROR;
return (0);
diff --git a/cups/http.h b/cups/http.h
index 01a0321d..45761a7c 100644
--- a/cups/http.h
+++ b/cups/http.h
@@ -346,7 +346,7 @@ typedef enum http_trust_e /**** Level of trust for credentials @since CUPS 2.0/
HTTP_TRUST_CHANGED, /* Credentials have changed */
HTTP_TRUST_EXPIRED, /* Credentials are expired */
HTTP_TRUST_RENEWED, /* Credentials have been renewed */
- HTTP_TRUST_UNKNOWN, /* Credentials are unknown/new */
+ HTTP_TRUST_UNKNOWN /* Credentials are unknown/new */
} http_trust_t;
typedef enum http_uri_status_e /**** URI separation status @since CUPS 1.2@ ****/
diff --git a/cups/ipp-file.c b/cups/ipp-file.c
index 5db5932a..5483a607 100644
--- a/cups/ipp-file.c
+++ b/cups/ipp-file.c
@@ -303,10 +303,7 @@ _ippFileReadToken(_ipp_file_t *f, /* I - File to read from */
* Start of quoted text or regular expression...
*/
- if (ch == '<')
- quote = '>';
- else
- quote = ch;
+ quote = ch;
DEBUG_printf(("1_ippFileReadToken: Start of quoted string, quote=%c, pos=%ld", quote, (long)cupsFileTell(f->fp)));
}
@@ -571,12 +568,10 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */
{
case IPP_TAG_BOOLEAN :
return (ippSetBoolean(ipp, attr, element, !_cups_strcasecmp(value, "true")));
- break;
case IPP_TAG_ENUM :
case IPP_TAG_INTEGER :
return (ippSetInteger(ipp, attr, element, (int)strtol(value, NULL, 0)));
- break;
case IPP_TAG_DATE :
{
@@ -690,7 +685,6 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */
return (ippSetDate(ipp, attr, element, date));
}
- break;
case IPP_TAG_RESOLUTION :
{
@@ -718,7 +712,6 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */
else
return (ippSetResolution(ipp, attr, element, (ipp_res_t)0, xres, yres));
}
- break;
case IPP_TAG_RANGE :
{
@@ -733,7 +726,6 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */
return (ippSetRange(ipp, attr, element, lower, upper));
}
- break;
case IPP_TAG_STRING :
valuelen = strlen(value);
@@ -774,7 +766,6 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */
}
else
return (ippSetOctetString(ipp, attr, element, value, (int)valuelen));
- break;
case IPP_TAG_TEXTLANG :
case IPP_TAG_NAMELANG :
@@ -787,7 +778,6 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */
case IPP_TAG_LANGUAGE :
case IPP_TAG_MIMETYPE :
return (ippSetString(ipp, attr, element, value));
- break;
case IPP_TAG_BEGIN_COLLECTION :
{
@@ -808,14 +798,11 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */
return (status);
}
- break;
default :
report_error(f, v, user_data, "Unsupported value on line %d of \"%s\".", f->linenum, f->filename);
return (0);
}
-
- return (1);
}
diff --git a/cups/ipp-support.c b/cups/ipp-support.c
index bfb9dff0..d9e90064 100644
--- a/cups/ipp-support.c
+++ b/cups/ipp-support.c
@@ -2262,7 +2262,7 @@ ippErrorString(ipp_status_t error) /* I - Error status */
* No, build an "0xxxxx" error string...
*/
- sprintf(cg->ipp_unknown, "0x%04x", error);
+ snprintf(cg->ipp_unknown, sizeof(cg->ipp_unknown), "0x%04x", error);
return (cg->ipp_unknown);
}
@@ -2339,7 +2339,7 @@ ippOpString(ipp_op_t op) /* I - Operation ID */
* No, build an "0xxxxx" operation string...
*/
- sprintf(cg->ipp_unknown, "0x%04x", op);
+ snprintf(cg->ipp_unknown, sizeof(cg->ipp_unknown), "0x%04x", op);
return (cg->ipp_unknown);
}
diff --git a/cups/ipp-vars.c b/cups/ipp-vars.c
index 395b0ebf..69efbd9a 100644
--- a/cups/ipp-vars.c
+++ b/cups/ipp-vars.c
@@ -12,7 +12,7 @@
* Include necessary headers...
*/
-#include <cups/cups.h>
+#include "cups-private.h"
#include "ipp-private.h"
#include "string-private.h"
#include "debug-internal.h"
@@ -220,10 +220,22 @@ _ippVarsSet(_ipp_vars_t *v, /* I - IPP variables */
{
if (!strcmp(name, "uri"))
{
- char uri[1024]; /* New printer URI */
- http_uri_status_t uri_status; /* URI status */
+ char uri[1024]; /* New printer URI */
+ char resolved[1024]; /* Resolved mDNS URI */
- if ((uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, value, v->scheme, sizeof(v->scheme), v->username, sizeof(v->username), v->host, sizeof(v->host), &(v->port), v->resource, sizeof(v->resource))) < HTTP_URI_STATUS_OK)
+ if (strstr(value, "._tcp"))
+ {
+ /*
+ * Resolve URI...
+ */
+
+ if (!_httpResolveURI(value, resolved, sizeof(resolved), _HTTP_RESOLVE_DEFAULT, NULL, NULL))
+ return (0);
+
+ value = resolved;
+ }
+
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, value, v->scheme, sizeof(v->scheme), v->username, sizeof(v->username), v->host, sizeof(v->host), &(v->port), v->resource, sizeof(v->resource)) < HTTP_URI_STATUS_OK)
return (0);
if (v->username[0])
diff --git a/cups/ipp.c b/cups/ipp.c
index 3d529346..42cf2fca 100644
--- a/cups/ipp.c
+++ b/cups/ipp.c
@@ -1,7 +1,7 @@
/*
* Internet Printing Protocol functions for CUPS.
*
- * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2007-2021 by Apple Inc.
* Copyright © 1997-2007 by Easy Software Products, all rights reserved.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -2866,8 +2866,9 @@ ippReadIO(void *src, /* I - Data source */
unsigned char *buffer, /* Data buffer */
string[IPP_MAX_TEXT],
/* Small string buffer */
- *bufptr; /* Pointer into buffer */
- ipp_attribute_t *attr; /* Current attribute */
+ *bufptr, /* Pointer into buffer */
+ *bufend; /* End of buffer */
+ ipp_attribute_t *attr = NULL; /* Current attribute */
ipp_tag_t tag; /* Current tag */
ipp_tag_t value_tag; /* Current value tag */
_ipp_value_t *value; /* Current value */
@@ -2900,8 +2901,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, 8) < 8)
{
DEBUG_puts("1ippReadIO: Unable to read header.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
/*
@@ -2939,8 +2939,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, 1) < 1)
{
DEBUG_puts("1ippReadIO: Callback returned EOF/error");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
DEBUG_printf(("2ippReadIO: ipp->current=%p, ipp->prev=%p", (void *)ipp->current, (void *)ipp->prev));
@@ -2959,8 +2958,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, 4) < 4)
{
DEBUG_puts("1ippReadIO: Callback returned EOF/error");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
tag = (ipp_tag_t)((((((buffer[0] << 8) | buffer[1]) << 8) |
@@ -2974,8 +2972,7 @@ ippReadIO(void *src, /* I - Data source */
_cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP extension tag larger than 0x7FFFFFFF."), 1);
DEBUG_printf(("1ippReadIO: bad tag 0x%x.", tag));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
}
@@ -2994,8 +2991,7 @@ ippReadIO(void *src, /* I - Data source */
{
_cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid group tag."), 1);
DEBUG_printf(("1ippReadIO: bad tag 0x%02x.", tag));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
else if (tag < IPP_TAG_UNSUPPORTED_VALUE)
{
@@ -3003,13 +2999,20 @@ ippReadIO(void *src, /* I - Data source */
* Group tag... Set the current group and continue...
*/
- if (ipp->curtag == tag)
+ if (parent)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid group tag."), 1);
+ DEBUG_printf(("1ippReadIO: bad tag 0x%02x.", tag));
+ goto rollback;
+ }
+ else if (ipp->curtag == tag)
ipp->prev = ippAddSeparator(ipp);
else if (ipp->current)
ipp->prev = ipp->current;
ipp->curtag = tag;
ipp->current = NULL;
+ attr = NULL;
DEBUG_printf(("2ippReadIO: group tag=%x(%s), ipp->prev=%p", tag, ippTagString(tag), (void *)ipp->prev));
continue;
}
@@ -3024,8 +3027,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, 2) < 2)
{
DEBUG_puts("1ippReadIO: unable to read name length.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
n = (buffer[0] << 8) | buffer[1];
@@ -3034,8 +3036,7 @@ ippReadIO(void *src, /* I - Data source */
{
_cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP name larger than 32767 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad name length %d.", n));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
DEBUG_printf(("2ippReadIO: name length=%d", n));
@@ -3044,7 +3045,7 @@ ippReadIO(void *src, /* I - Data source */
{
_cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid named IPP attribute in collection."), 1);
DEBUG_puts("1ippReadIO: bad attribute name in collection.");
- return (IPP_STATE_ERROR);
+ goto rollback;
}
else if (n == 0 && tag != IPP_TAG_MEMBERNAME && tag != IPP_TAG_END_COLLECTION)
{
@@ -3056,8 +3057,7 @@ ippReadIO(void *src, /* I - Data source */
{
_cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP attribute has no name."), 1);
DEBUG_puts("1ippReadIO: Attribute without name and no current.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
attr = ipp->current;
@@ -3096,8 +3096,7 @@ ippReadIO(void *src, /* I - Data source */
DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)",
value_tag, ippTagString(value_tag), tag,
ippTagString(tag)));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
if (value_tag != tag)
@@ -3123,8 +3122,7 @@ ippReadIO(void *src, /* I - Data source */
DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)",
value_tag, ippTagString(value_tag), tag,
ippTagString(tag)));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
if (value_tag == IPP_TAG_INTEGER && tag == IPP_TAG_RANGE)
@@ -3146,8 +3144,7 @@ ippReadIO(void *src, /* I - Data source */
DEBUG_printf(("1ippReadIO: value tag %x(%s) != %x(%s)",
value_tag, ippTagString(value_tag), tag,
ippTagString(tag)));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
/*
@@ -3155,10 +3152,7 @@ ippReadIO(void *src, /* I - Data source */
*/
if ((value = ipp_set_value(ipp, &attr, attr->num_values)) == NULL)
- {
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
- }
+ goto rollback;
}
else if (tag == IPP_TAG_MEMBERNAME)
{
@@ -3170,8 +3164,13 @@ ippReadIO(void *src, /* I - Data source */
{
_cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP member name is not empty."), 1);
DEBUG_puts("1ippReadIO: member name not empty.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
+ }
+ else if (!parent)
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP member attribute outside of collection."), 1);
+ DEBUG_puts("1ippReadIO: member attribute outside of collection.");
+ goto rollback;
}
if (ipp->current)
@@ -3182,8 +3181,7 @@ ippReadIO(void *src, /* I - Data source */
{
_cupsSetHTTPError(HTTP_STATUS_ERROR);
DEBUG_puts("1ippReadIO: unable to allocate attribute.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
DEBUG_printf(("2ippReadIO: membername, ipp->current=%p, ipp->prev=%p", (void *)ipp->current, (void *)ipp->prev));
@@ -3199,8 +3197,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: unable to read name.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
buffer[n] = '\0';
@@ -3213,8 +3210,7 @@ ippReadIO(void *src, /* I - Data source */
{
_cupsSetHTTPError(HTTP_STATUS_ERROR);
DEBUG_puts("1ippReadIO: unable to allocate attribute.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
DEBUG_printf(("2ippReadIO: name=\"%s\", ipp->current=%p, ipp->prev=%p", buffer, (void *)ipp->current, (void *)ipp->prev));
@@ -3230,8 +3226,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, 2) < 2)
{
DEBUG_puts("1ippReadIO: unable to read value length.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
n = (buffer[0] << 8) | buffer[1];
@@ -3242,8 +3237,7 @@ ippReadIO(void *src, /* I - Data source */
_cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP value larger than 32767 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad value length %d.", n));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
switch (tag)
@@ -3259,15 +3253,13 @@ ippReadIO(void *src, /* I - Data source */
_cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP enum value not 4 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad integer value length %d.", n));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
if ((*cb)(src, buffer, 4) < 4)
{
DEBUG_puts("1ippReadIO: Unable to read integer value.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
n = (((((buffer[0] << 8) | buffer[1]) << 8) | buffer[2]) << 8) |
@@ -3285,15 +3277,13 @@ ippReadIO(void *src, /* I - Data source */
_cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP boolean value not 1 byte."),
1);
DEBUG_printf(("1ippReadIO: bad boolean value length %d.", n));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
if ((*cb)(src, buffer, 1) < 1)
{
DEBUG_puts("1ippReadIO: Unable to read boolean value.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
value->boolean = (char)buffer[0];
@@ -3334,8 +3324,7 @@ ippReadIO(void *src, /* I - Data source */
if ((*cb)(src, buffer, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: unable to read string value.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
}
@@ -3349,15 +3338,13 @@ ippReadIO(void *src, /* I - Data source */
{
_cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP date value not 11 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad date value length %d.", n));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
if ((*cb)(src, value->date, 11) < 11)
{
DEBUG_puts("1ippReadIO: Unable to read date value.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
break;
@@ -3367,15 +3354,13 @@ ippReadIO(void *src, /* I - Data source */
_cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP resolution value not 9 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad resolution value length %d.", n));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
if ((*cb)(src, buffer, 9) < 9)
{
DEBUG_puts("1ippReadIO: Unable to read resolution value.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
value->resolution.xres =
@@ -3395,15 +3380,13 @@ ippReadIO(void *src, /* I - Data source */
_("IPP rangeOfInteger value not 8 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad rangeOfInteger value length "
"%d.", n));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
if ((*cb)(src, buffer, 8) < 8)
{
DEBUG_puts("1ippReadIO: Unable to read range value.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
value->range.lower =
@@ -3428,19 +3411,18 @@ ippReadIO(void *src, /* I - Data source */
"minimum 4 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad stringWithLanguage value "
"length %d.", n));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
if ((*cb)(src, buffer, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: Unable to read string w/language "
"value.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
bufptr = buffer;
+ bufend = buffer + n;
/*
* text-with-language and name-with-language are composite
@@ -3454,14 +3436,13 @@ ippReadIO(void *src, /* I - Data source */
n = (bufptr[0] << 8) | bufptr[1];
- if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE) || n >= (int)sizeof(string))
+ if ((bufptr + 2 + n + 2) > bufend || n >= (int)sizeof(string))
{
_cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP language length overflows value."), 1);
DEBUG_printf(("1ippReadIO: bad language value length %d.",
n));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
else if (n >= IPP_MAX_LANGUAGE)
{
@@ -3469,8 +3450,7 @@ ippReadIO(void *src, /* I - Data source */
_("IPP language length too large."), 1);
DEBUG_printf(("1ippReadIO: bad language value length %d.",
n));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
memcpy(string, bufptr + 2, (size_t)n);
@@ -3481,13 +3461,12 @@ ippReadIO(void *src, /* I - Data source */
bufptr += 2 + n;
n = (bufptr[0] << 8) | bufptr[1];
- if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE))
+ if ((bufptr + 2 + n) > bufend)
{
_cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP string length overflows value."), 1);
DEBUG_printf(("1ippReadIO: bad string value length %d.", n));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
bufptr[2 + n] = '\0';
@@ -3507,30 +3486,28 @@ ippReadIO(void *src, /* I - Data source */
_("IPP begCollection value not 0 bytes."), 1);
DEBUG_puts("1ippReadIO: begCollection tag with value length "
"> 0.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
if (ippReadIO(src, cb, 1, ipp, value->collection) == IPP_STATE_ERROR)
{
DEBUG_puts("1ippReadIO: Unable to read collection value.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
break;
case IPP_TAG_END_COLLECTION :
- _cupsBufferRelease((char *)buffer);
-
if (n > 0)
{
_cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP endCollection value not 0 bytes."), 1);
DEBUG_puts("1ippReadIO: endCollection tag with value length "
"> 0.");
- return (IPP_STATE_ERROR);
+ goto rollback;
}
+ _cupsBufferRelease((char *)buffer);
+
DEBUG_puts("1ippReadIO: endCollection tag...");
return (ipp->state = IPP_STATE_DATA);
@@ -3545,22 +3522,19 @@ ippReadIO(void *src, /* I - Data source */
_cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP memberName with no attribute."), 1);
DEBUG_puts("1ippReadIO: Member name without attribute.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
else if (n == 0)
{
_cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP memberName value is empty."), 1);
DEBUG_puts("1ippReadIO: Empty member name value.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
else if ((*cb)(src, buffer, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: Unable to read member name value.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
buffer[n] = '\0';
@@ -3585,8 +3559,7 @@ ippReadIO(void *src, /* I - Data source */
_("IPP octetString length too large."), 1);
DEBUG_printf(("1ippReadIO: bad octetString value length %d.",
n));
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
value->unknown.length = n;
@@ -3597,15 +3570,13 @@ ippReadIO(void *src, /* I - Data source */
{
_cupsSetHTTPError(HTTP_STATUS_ERROR);
DEBUG_puts("1ippReadIO: Unable to allocate value");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
if ((*cb)(src, value->unknown.data, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: Unable to read unsupported value.");
- _cupsBufferRelease((char *)buffer);
- return (IPP_STATE_ERROR);
+ goto rollback;
}
}
else
@@ -3633,6 +3604,17 @@ ippReadIO(void *src, /* I - Data source */
_cupsBufferRelease((char *)buffer);
return (ipp->state);
+
+ // If we get here, there was an error that required us to roll back the last
+ // attribute read in order to keep the IPP message valid...
+ rollback:
+
+ _cupsBufferRelease((char *)buffer);
+
+ if (attr)
+ ippDeleteAttribute(ipp, attr);
+
+ return (IPP_STATE_ERROR);
}
diff --git a/cups/options.c b/cups/options.c
index 11814c9a..e45858c2 100644
--- a/cups/options.c
+++ b/cups/options.c
@@ -603,16 +603,15 @@ _cupsGet1284Values(
if (ptr < (value + sizeof(value) - 1))
*ptr++ = *device_id;
- if (!*device_id)
- break;
-
while (ptr > value && _cups_isspace(ptr[-1]))
ptr --;
*ptr = '\0';
- device_id ++;
-
num_values = cupsAddOption(key, value, num_values, values);
+
+ if (!*device_id)
+ break;
+ device_id ++;
}
return (num_values);
diff --git a/cups/ppd-cache.c b/cups/ppd-cache.c
index 5965e382..091f39f3 100644
--- a/cups/ppd-cache.c
+++ b/cups/ppd-cache.c
@@ -78,8 +78,11 @@ _cupsConvertOptions(
int num_finishings = 0, /* Number of finishing values */
finishings[10]; /* Finishing enum values */
ppd_choice_t *choice; /* Marked choice */
- int finishings_copies = copies;
+ int finishings_copies = copies,
/* Number of copies for finishings */
+ job_pages = 0, /* job-pages value */
+ number_up = 1; /* number-up value */
+ const char *value; /* Option value */
/*
@@ -365,6 +368,28 @@ _cupsConvertOptions(
* Map finishing options...
*/
+ if (copies != finishings_copies)
+ {
+ // Figure out the proper job-pages-per-set value...
+ if ((value = cupsGetOption("job-pages", num_options, options)) == NULL)
+ value = cupsGetOption("com.apple.print.PrintSettings.PMTotalBeginPages..n.", num_options, options);
+
+ if (value)
+ job_pages = atoi(value);
+
+ // Adjust for number-up
+ if ((value = cupsGetOption("number-up", num_options, options)) != NULL)
+ number_up = atoi(value);
+
+ job_pages = (job_pages + number_up - 1) / number_up;
+
+ // When duplex printing, raster data will include an extra (blank) page to
+ // make the total number of pages even. Make sure this is reflected in the
+ // page count...
+ if ((job_pages & 1) && (keyword = cupsGetOption("sides", num_options, options)) != NULL && strcmp(keyword, "one-sided"))
+ job_pages ++;
+ }
+
if ((finishing_template = cupsGetOption("cupsFinishingTemplate", num_options, options)) == NULL)
finishing_template = cupsGetOption("finishing-template", num_options, options);
@@ -376,13 +401,13 @@ _cupsConvertOptions(
ippAddCollection(request, IPP_TAG_JOB, "finishings-col", fin_col);
ippDelete(fin_col);
- if (copies != finishings_copies && (keyword = cupsGetOption("job-impressions", num_options, options)) != NULL)
+ if (copies != finishings_copies && job_pages > 0)
{
/*
* Send job-pages-per-set attribute to apply finishings correctly...
*/
- ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-pages-per-set", atoi(keyword) / finishings_copies);
+ ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-pages-per-set", job_pages);
}
}
else
@@ -392,13 +417,13 @@ _cupsConvertOptions(
{
ippAddIntegers(request, IPP_TAG_JOB, IPP_TAG_ENUM, "finishings", num_finishings, finishings);
- if (copies != finishings_copies && (keyword = cupsGetOption("job-impressions", num_options, options)) != NULL)
+ if (copies != finishings_copies && job_pages > 0)
{
/*
* Send job-pages-per-set attribute to apply finishings correctly...
*/
- ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-pages-per-set", atoi(keyword) / finishings_copies);
+ ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-pages-per-set", job_pages);
}
}
}
@@ -3228,7 +3253,7 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */
cupsFilePuts(fp, "*cupsFilter2: \"application/vnd.cups-pdf application/pdf 10 -\"\n");
}
else
- cupsFilePuts(fp, "*cupsManualCopies: true\n");
+ cupsFilePuts(fp, "*cupsManualCopies: True\n");
if (is_apple)
cupsFilePuts(fp, "*cupsFilter2: \"image/urf image/urf 100 -\"\n");
if (is_pwg)
@@ -3620,10 +3645,12 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */
if ((attr = ippFindAttribute(ippGetCollection(defattr, 0), "media-source", IPP_TAG_ZERO)) != NULL)
pwg_ppdize_name(ippGetString(attr, 0, NULL), ppdname, sizeof(ppdname));
else
- strlcpy(ppdname, "Unknown", sizeof(ppdname));
+ ppdname[0] = '\0';
if ((attr = ippFindAttribute(response, "media-source-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 1)
{
+ int have_default = ppdname[0] != '\0';
+ /* Do we have a default InputSlot? */
static const char * const sources[] =
{ /* Standard "media-source" strings */
"auto",
@@ -3678,21 +3705,31 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */
"roll-10"
};
- cupsFilePrintf(fp, "*OpenUI *InputSlot: PickOne\n"
- "*OrderDependency: 10 AnySetup *InputSlot\n"
- "*DefaultInputSlot: %s\n", ppdname);
- for (i = 0, count = ippGetCount(attr); i < count; i ++)
+ cupsFilePuts(fp, "*OpenUI *InputSlot: PickOne\n"
+ "*OrderDependency: 10 AnySetup *InputSlot\n");
+ if (have_default)
+ cupsFilePrintf(fp, "*DefaultInputSlot: %s\n", ppdname);
+
+ for (i = 0; i < count; i ++)
{
keyword = ippGetString(attr, i, NULL);
pwg_ppdize_name(keyword, ppdname, sizeof(ppdname));
+ if (i == 0 && !have_default)
+ cupsFilePrintf(fp, "*DefaultInputSlot: %s\n", ppdname);
+
for (j = 0; j < (int)(sizeof(sources) / sizeof(sources[0])); j ++)
if (!strcmp(sources[j], keyword))
{
snprintf(msgid, sizeof(msgid), "media-source.%s", keyword);
+
+ if ((msgstr = _cupsLangString(lang, msgid)) == msgid || !strcmp(msgid, msgstr))
+ if ((msgstr = _cupsMessageLookup(strings, msgid)) == msgid)
+ msgstr = keyword;
+
cupsFilePrintf(fp, "*InputSlot %s: \"<</MediaPosition %d>>setpagedevice\"\n", ppdname, j);
- cupsFilePrintf(fp, "*%s.InputSlot %s/%s: \"\"\n", lang->language, ppdname, _cupsLangString(lang, msgid));
+ cupsFilePrintf(fp, "*%s.InputSlot %s/%s: \"\"\n", lang->language, ppdname, msgstr);
break;
}
}
@@ -3744,6 +3781,8 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */
int wrote_color = 0;
const char *default_color = NULL; /* Default */
+ cupsFilePrintf(fp, "*%% ColorModel from %s\n", ippGetName(attr));
+
for (i = 0, count = ippGetCount(attr); i < count; i ++)
{
keyword = ippGetString(attr, i, NULL);
@@ -3790,6 +3829,11 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */
PRINTF_COLOROPTION("RGB", _("Color"), CUPS_CSPACE_SRGB, 8)
default_color = "RGB";
+
+ // Apparently some printers only advertise color support, so make sure
+ // we also do grayscale for these printers...
+ if (!ippContainsString(attr, "sgray_8") && !ippContainsString(attr, "black_1") && !ippContainsString(attr, "black_8") && !ippContainsString(attr, "W8") && !ippContainsString(attr, "W8-16"))
+ PRINTF_COLOROPTION("Gray", _("GrayScale"), CUPS_CSPACE_SW, 8)
}
else if (!strcasecmp(keyword, "adobe-rgb_16") || !strcmp(keyword, "ADOBERGB48") || !strcmp(keyword, "ADOBERGB24-48"))
{
@@ -3924,7 +3968,7 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */
else
strlcpy(ppdname, "Unknown", sizeof(ppdname));
- if ((attr = ippFindAttribute(response, "output-bin-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 1)
+ if ((attr = ippFindAttribute(response, "output-bin-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 0)
{
ipp_attribute_t *trays = ippFindAttribute(response, "printer-output-tray", IPP_TAG_STRING);
/* printer-output-tray attribute, if any */
@@ -5140,6 +5184,8 @@ pwg_unppdize_name(const char *ppd, /* I - PPD keyword */
{
char *ptr, /* Pointer into name buffer */
*end; /* End of name buffer */
+ int nodash = 1; /* Next char in IPP name cannot be a
+ dash (first char or after a dash) */
if (_cups_islower(*ppd))
@@ -5151,7 +5197,9 @@ pwg_unppdize_name(const char *ppd, /* I - PPD keyword */
const char *ppdptr; /* Pointer into PPD keyword */
for (ppdptr = ppd + 1; *ppdptr; ppdptr ++)
- if (_cups_isupper(*ppdptr) || strchr(dashchars, *ppdptr))
+ if (_cups_isupper(*ppdptr) || strchr(dashchars, *ppdptr) ||
+ (*ppdptr == '-' && *(ppdptr - 1) == '-') ||
+ (*ppdptr == '-' && *(ppdptr + 1) == '\0'))
break;
if (!*ppdptr)
@@ -5163,19 +5211,44 @@ pwg_unppdize_name(const char *ppd, /* I - PPD keyword */
for (ptr = name, end = name + namesize - 1; *ppd && ptr < end; ppd ++)
{
- if (_cups_isalnum(*ppd) || *ppd == '-')
+ if (_cups_isalnum(*ppd))
+ {
*ptr++ = (char)tolower(*ppd & 255);
- else if (strchr(dashchars, *ppd))
- *ptr++ = '-';
+ nodash = 0;
+ }
+ else if (*ppd == '-' || strchr(dashchars, *ppd))
+ {
+ if (nodash == 0)
+ {
+ *ptr++ = '-';
+ nodash = 1;
+ }
+ }
else
+ {
*ptr++ = *ppd;
+ nodash = 0;
+ }
- if (!_cups_isupper(*ppd) && _cups_isalnum(*ppd) &&
- _cups_isupper(ppd[1]) && ptr < end)
- *ptr++ = '-';
- else if (!isdigit(*ppd & 255) && isdigit(ppd[1] & 255))
- *ptr++ = '-';
+ if (nodash == 0)
+ {
+ if (!_cups_isupper(*ppd) && _cups_isalnum(*ppd) &&
+ _cups_isupper(ppd[1]) && ptr < end)
+ {
+ *ptr++ = '-';
+ nodash = 1;
+ }
+ else if (!isdigit(*ppd & 255) && isdigit(ppd[1] & 255))
+ {
+ *ptr++ = '-';
+ nodash = 1;
+ }
+ }
}
+ /* Remove trailing dashes */
+ while (ptr > name && *(ptr - 1) == '-')
+ ptr --;
+
*ptr = '\0';
}
diff --git a/cups/ppd-mark.c b/cups/ppd-mark.c
index 7ec0df47..25797b37 100644
--- a/cups/ppd-mark.c
+++ b/cups/ppd-mark.c
@@ -307,7 +307,7 @@ cupsMarkOptions(
* Look it up in the PPD file...
*/
- sprintf(s, "%d", j);
+ snprintf(s, sizeof(s), "%d", j);
if ((attr = ppdFindAttr(ppd, "cupsIPPFinishings", s)) == NULL)
continue;
diff --git a/cups/ppd-private.h b/cups/ppd-private.h
index 7b406c97..11ddae36 100644
--- a/cups/ppd-private.h
+++ b/cups/ppd-private.h
@@ -35,7 +35,7 @@ extern "C" {
* Constants...
*/
-# define _PPD_CACHE_VERSION 9 /* Version number in cache file */
+# define _PPD_CACHE_VERSION 10 /* Version number in cache file */
/*
diff --git a/cups/ppd.c b/cups/ppd.c
index 199cf034..ac5dbc62 100644
--- a/cups/ppd.c
+++ b/cups/ppd.c
@@ -125,6 +125,7 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
free(ppd->lang_encoding);
free(ppd->nickname);
free(ppd->patches);
+ free(ppd->emulations);
free(ppd->jcl_begin);
free(ppd->jcl_end);
free(ppd->jcl_ps);
@@ -871,15 +872,15 @@ _ppdOpen(
ppd_decode(ppd->jcl_ps); /* Decode quoted string */
}
else if (!strcmp(keyword, "AccurateScreensSupport"))
- ppd->accurate_screens = !strcmp(string, "True");
+ ppd->accurate_screens = !strcasecmp(string, "True");
else if (!strcmp(keyword, "ColorDevice"))
- ppd->color_device = !strcmp(string, "True");
+ ppd->color_device = !strcasecmp(string, "True");
else if (!strcmp(keyword, "ContoneOnly"))
- ppd->contone_only = !strcmp(string, "True");
+ ppd->contone_only = !strcasecmp(string, "True");
else if (!strcmp(keyword, "cupsFlipDuplex"))
- ppd->flip_duplex = !strcmp(string, "True");
+ ppd->flip_duplex = !strcasecmp(string, "True");
else if (!strcmp(keyword, "cupsManualCopies"))
- ppd->manual_copies = !strcmp(string, "True");
+ ppd->manual_copies = !strcasecmp(string, "True");
else if (!strcmp(keyword, "cupsModelNumber"))
ppd->model_number = atoi(string);
else if (!strcmp(keyword, "cupsColorProfile"))
@@ -1496,6 +1497,27 @@ _ppdOpen(
goto error;
}
+ if (option && (!_cups_strcasecmp(option->defchoice, "custom") || !_cups_strncasecmp(option->defchoice, "custom.", 7)))
+ {
+ /*
+ * "*DefaultOption: Custom..." may set the default to a custom value
+ * or (for a very small number of incompatible PPD files) select a
+ * standard choice for the option, which CUPS renames to "_Custom..."
+ * to avoid compatibility issues. See which this is...
+ */
+
+ char tchoice[PPD_MAX_NAME]; /* Temporary choice name */
+
+ snprintf(tchoice, sizeof(tchoice), "_%s", option->defchoice);
+
+ if (ppdFindChoice(option, tchoice))
+ {
+ strlcpy(option->defchoice, tchoice, sizeof(option->defchoice));
+
+ DEBUG_printf(("2_ppdOpen: Reset Default%s to %s...", option->keyword, tchoice));
+ }
+ }
+
option = NULL;
free(string);
@@ -1510,6 +1532,27 @@ _ppdOpen(
goto error;
}
+ if (option && (!_cups_strcasecmp(option->defchoice, "custom") || !_cups_strncasecmp(option->defchoice, "custom.", 7)))
+ {
+ /*
+ * "*DefaultOption: Custom..." may set the default to a custom value
+ * or (for a very small number of incompatible PPD files) select a
+ * standard choice for the option, which CUPS renames to "_Custom..."
+ * to avoid compatibility issues. See which this is...
+ */
+
+ char tchoice[PPD_MAX_NAME]; /* Temporary choice name */
+
+ snprintf(tchoice, sizeof(tchoice), "_%s", option->defchoice);
+
+ if (ppdFindChoice(option, tchoice))
+ {
+ strlcpy(option->defchoice, tchoice, sizeof(option->defchoice));
+
+ DEBUG_printf(("2_ppdOpen: Reset Default%s to %s...", option->keyword, tchoice));
+ }
+ }
+
option = NULL;
free(string);
@@ -1668,11 +1711,9 @@ _ppdOpen(
* Set the default as part of the current option...
*/
- DEBUG_printf(("2_ppdOpen: Setting %s to %s...", keyword, string));
-
- strlcpy(option->defchoice, string, sizeof(option->defchoice));
+ strlcpy(option->defchoice, string, sizeof(option->defchoice));
- DEBUG_printf(("2_ppdOpen: %s is now %s...", keyword, option->defchoice));
+ DEBUG_printf(("2_ppdOpen: Set %s to %s...", keyword, option->defchoice));
}
else
{
@@ -1682,11 +1723,27 @@ _ppdOpen(
ppd_option_t *toption; /* Temporary option */
-
if ((toption = ppdFindOption(ppd, keyword + 7)) != NULL)
{
- DEBUG_printf(("2_ppdOpen: Setting %s to %s...", keyword, string));
- strlcpy(toption->defchoice, string, sizeof(toption->defchoice));
+ if (!_cups_strcasecmp(string, "custom") || !_cups_strncasecmp(string, "custom.", 7))
+ {
+ /*
+ * "*DefaultOption: Custom..." may set the default to a custom value
+ * or (for a very small number of incompatible PPD files) select a
+ * standard choice for the option, which CUPS renames to "_Custom..."
+ * to avoid compatibility issues. See which this is...
+ */
+
+ snprintf(toption->defchoice, sizeof(toption->defchoice), "_%s", string);
+ if (!ppdFindChoice(toption, toption->defchoice))
+ strlcpy(toption->defchoice, string, sizeof(toption->defchoice));
+ }
+ else
+ {
+ strlcpy(toption->defchoice, string, sizeof(toption->defchoice));
+ }
+
+ DEBUG_printf(("2_ppdOpen: Set %s to %s...", keyword, toption->defchoice));
}
}
}
@@ -2335,8 +2392,16 @@ ppd_add_attr(ppd_file_t *ppd, /* I - PPD file data */
* Copy data over...
*/
+ if (!_cups_strcasecmp(spec, "custom") || !_cups_strncasecmp(spec, "custom.", 7))
+ {
+ temp->spec[0] = '_';
+ strlcpy(temp->spec + 1, spec, sizeof(temp->spec) - 1);
+ }
+ else {
+ strlcpy(temp->spec, spec, sizeof(temp->spec));
+ }
+
strlcpy(temp->name, name, sizeof(temp->name));
- strlcpy(temp->spec, spec, sizeof(temp->spec));
strlcpy(temp->text, text, sizeof(temp->text));
temp->value = (char *)value;
@@ -2839,7 +2904,7 @@ ppd_hash_option(ppd_option_t *option) /* I - Option */
for (hash = option->keyword[0], k = option->keyword + 1; *k;)
- hash = 33 * hash + *k++;
+ hash = (int)(33U * (unsigned)hash) + *k++;
return (hash & 511);
}
diff --git a/cups/pwg-media.c b/cups/pwg-media.c
index 00bb2ed6..535db088 100644
--- a/cups/pwg-media.c
+++ b/cups/pwg-media.c
@@ -448,13 +448,13 @@ pwgInitSize(pwg_size_t *size, /* I - Size to initialize */
size->width = x_dimension->values[0].integer;
size->length = y_dimension->values[0].integer;
}
- else if (!x_dimension)
+ else if (!x_dimension) /* x_dimension is missing */
{
_cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("Missing x-dimension in media-size."), 1);
return (0);
}
- else if (!y_dimension)
+ else /* y_dimension must be missing */
{
_cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("Missing y-dimension in media-size."), 1);
diff --git a/cups/request.c b/cups/request.c
index 69a78013..ff967f05 100644
--- a/cups/request.c
+++ b/cups/request.c
@@ -395,7 +395,7 @@ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP
ippDelete(response);
response = NULL;
- http->status = status = HTTP_STATUS_ERROR;
+ http->status = HTTP_STATUS_ERROR;
http->error = EINVAL;
}
}
@@ -422,7 +422,7 @@ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP
if (!cupsDoAuthentication(http, "POST", resource))
httpReconnect2(http, 30000, NULL);
else
- http->status = status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
+ http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
}
#ifdef HAVE_SSL
diff --git a/cups/snprintf.c b/cups/snprintf.c
index 49652e2c..066252ee 100644
--- a/cups/snprintf.c
+++ b/cups/snprintf.c
@@ -1,6 +1,7 @@
/*
* snprintf functions for CUPS.
*
+ * Copyright © 2021 by OpenPrinting
* Copyright © 2007-2019 by Apple Inc.
* Copyright © 1997-2007 by Easy Software Products.
*
@@ -81,7 +82,8 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */
format ++;
width = va_arg(ap, int);
- snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", width);
+ /* Note: Can't use snprintf here since we are implementing this function... */
+ sprintf(tptr, "%d", width);
tptr += strlen(tptr);
}
else
@@ -113,7 +115,8 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */
format ++;
prec = va_arg(ap, int);
- snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", prec);
+ /* Note: Can't use snprintf here since we are implementing this function... */
+ sprintf(tptr, "%d", prec);
tptr += strlen(tptr);
}
else
@@ -171,6 +174,7 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */
if ((width + 2) > sizeof(temp))
break;
+ /* Note: Can't use snprintf here since we are implementing this function... */
sprintf(temp, tformat, va_arg(ap, double));
templen = strlen(temp);
@@ -202,6 +206,7 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */
if ((width + 2) > sizeof(temp))
break;
+ /* Note: Can't use snprintf here since we are implementing this function... */
sprintf(temp, tformat, va_arg(ap, int));
templen = strlen(temp);
@@ -226,6 +231,7 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */
if ((width + 2) > sizeof(temp))
break;
+ /* Note: Can't use snprintf here since we are implementing this function... */
sprintf(temp, tformat, va_arg(ap, void *));
templen = strlen(temp);
@@ -317,7 +323,8 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */
* Nul-terminate the string and return the number of characters needed.
*/
- *bufptr = '\0';
+ if (bufptr && bufptr < bufend)
+ *bufptr = '\0';
return (bytes);
}
diff --git a/cups/testclient.c b/cups/testclient.c
index cf945df9..16ac40db 100644
--- a/cups/testclient.c
+++ b/cups/testclient.c
@@ -24,7 +24,7 @@
* Constants...
*/
-#define MAX_CLIENTS 16 /* Maximum number of client threads */
+#define MAX_CLIENTS 100 /* Maximum number of client threads */
/*
@@ -44,12 +44,12 @@ typedef struct _client_data_s
int grayscale, /* Force grayscale? */
keepfile; /* Keep temporary file? */
ipp_pstate_t printer_state; /* Current printer state */
- char printer_state_reasons[1024];
- /* Current printer-state-reasons */
+ char printer_state_reasons[1024];
+ /* Current printer-state-reasons */
int job_id; /* Job ID for submitted job */
ipp_jstate_t job_state; /* Current job state */
- char job_state_reasons[1024];
- /* Current job-state-reasons */
+ char job_state_reasons[1024];
+ /* Current job-state-reasons */
} _client_data_t;
@@ -66,12 +66,12 @@ static int verbosity = 0;
* Local functions...
*/
-static const char *make_raster_file(ipp_t *response, int grayscale, char *tempname, size_t tempsize, const char **format);
-static void *monitor_printer(_client_data_t *data);
+static const char *make_raster_file(ipp_t *response, int grayscale, char *tempname, size_t tempsize, const char **format);
+static void *monitor_printer(_client_data_t *data);
static void *run_client(_client_data_t *data);
-static void show_attributes(const char *title, int request, ipp_t *ipp);
-static void show_capabilities(ipp_t *response);
-static void usage(void);
+static void show_attributes(const char *title, int request, ipp_t *ipp);
+static void show_capabilities(ipp_t *response);
+static void usage(void);
/*
@@ -396,15 +396,7 @@ make_raster_file(ipp_t *response, /* I - Printer attributes */
* Figure out the the media, resolution, and color mode...
*/
- if ((attr = ippFindAttribute(response, "media-default", IPP_TAG_KEYWORD)) != NULL)
- {
- /*
- * Use default media...
- */
-
- media = pwgMediaForPWG(ippGetString(attr, 0, NULL));
- }
- else if ((attr = ippFindAttribute(response, "media-ready", IPP_TAG_KEYWORD)) != NULL)
+ if ((attr = ippFindAttribute(response, "media-ready", IPP_TAG_KEYWORD)) != NULL)
{
/*
* Use ready media...
@@ -417,6 +409,14 @@ make_raster_file(ipp_t *response, /* I - Printer attributes */
else
media = pwgMediaForPWG(ippGetString(attr, 0, NULL));
}
+ else if ((attr = ippFindAttribute(response, "media-default", IPP_TAG_KEYWORD)) != NULL)
+ {
+ /*
+ * Use default media...
+ */
+
+ media = pwgMediaForPWG(ippGetString(attr, 0, NULL));
+ }
else
{
puts("No default or ready media reported by printer, aborting.");
@@ -486,15 +486,15 @@ make_raster_file(ipp_t *response, /* I - Printer attributes */
header.cupsInteger[CUPS_RASTER_PWG_TotalPageCount] = 1;
- if (header.cupsWidth > (4 * header.HWResolution[0]))
+ if (header.cupsWidth > (2 * header.HWResolution[0]))
{
xoff = header.HWResolution[0] / 2;
yoff = header.HWResolution[1] / 2;
}
else
{
- xoff = 0;
- yoff = 0;
+ xoff = header.HWResolution[0] / 4;
+ yoff = header.HWResolution[1] / 4;
}
xrep = (header.cupsWidth - 2 * xoff) / 140;
@@ -603,6 +603,8 @@ make_raster_file(ipp_t *response, /* I - Printer attributes */
for (y = 0; y < header.cupsHeight; y ++)
cupsRasterWritePixels(ras, line, header.cupsBytesPerLine);
+ free(line);
+
cupsRasterClose(ras);
close(fd);
@@ -768,11 +770,8 @@ run_client(
ipp_attribute_t *attr; /* Attribute in response */
static const char * const pattrs[] = /* Printer attributes we are interested in */
{
- "job-template",
- "printer-defaults",
- "printer-description",
- "media-col-database",
- "media-col-ready"
+ "all",
+ "media-col-database"
};
diff --git a/cups/testdest.c b/cups/testdest.c
index a65e0996..9b07e777 100644
--- a/cups/testdest.c
+++ b/cups/testdest.c
@@ -410,7 +410,6 @@ print_file(http_t *http, /* I - Connection to destination */
{
cups_file_t *fp; /* File to print */
int job_id; /* Job ID */
- ipp_status_t status; /* Submission status */
const char *title; /* Title of job */
char buffer[32768]; /* File buffer */
ssize_t bytes; /* Bytes read/to write */
@@ -427,7 +426,7 @@ print_file(http_t *http, /* I - Connection to destination */
else
title = filename;
- if ((status = cupsCreateDestJob(http, dest, dinfo, &job_id, title, num_options, options)) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
+ if (cupsCreateDestJob(http, dest, dinfo, &job_id, title, num_options, options) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
{
printf("Unable to create job: %s\n", cupsLastErrorString());
cupsFileClose(fp);
@@ -454,7 +453,7 @@ print_file(http_t *http, /* I - Connection to destination */
cupsFileClose(fp);
- if ((status = cupsFinishDestDocument(http, dest, dinfo)) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
+ if (cupsFinishDestDocument(http, dest, dinfo) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
{
printf("Unable to send document: %s\n", cupsLastErrorString());
return;
diff --git a/cups/tls-darwin.c b/cups/tls-darwin.c
index b3bd50bf..0741a320 100644
--- a/cups/tls-darwin.c
+++ b/cups/tls-darwin.c
@@ -1,7 +1,8 @@
/*
* TLS support code for CUPS on macOS.
*
- * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2021 by OpenPrinting
+ * Copyright © 2007-2021 by Apple Inc.
* Copyright © 1997-2007 by Easy Software Products, all rights reserved.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -291,7 +292,7 @@ cupsMakeServerCredentials(
else
tls_selfsigned = ident;
- _cupsMutexLock(&tls_mutex);
+ _cupsMutexUnlock(&tls_mutex);
# if 0 /* Someday perhaps SecItemCopyMatching will work for identities, at which point */
CFTypeRef itemKeys[] = { kSecClass, kSecAttrLabel, kSecValueRef };
diff --git a/cups/tls-gnutls.c b/cups/tls-gnutls.c
index 329cc0eb..ffe1aa69 100644
--- a/cups/tls-gnutls.c
+++ b/cups/tls-gnutls.c
@@ -659,7 +659,7 @@ httpCredentialsString(
if (!buffer)
return (0);
- if (buffer && bufsize > 0)
+ if (bufsize > 0)
*buffer = '\0';
if ((first = (http_credential_t *)cupsArrayFirst(credentials)) != NULL &&
@@ -939,7 +939,7 @@ http_gnutls_default_path(char *buffer,/* I - Path buffer */
/* Pointer to library globals */
- if (cg->home)
+ if (cg->home && getuid())
{
snprintf(buffer, bufsize, "%s/.cups", cg->home);
if (access(buffer, 0))
@@ -1516,8 +1516,7 @@ _httpTLSStart(http_t *http) /* I - Connection to server */
DEBUG_printf(("4_httpTLSStart: Using certificate \"%s\" and private key \"%s\".", crtfile, keyfile));
- if (!status)
- status = gnutls_certificate_set_x509_key_file(*credentials, crtfile, keyfile, GNUTLS_X509_FMT_PEM);
+ status = gnutls_certificate_set_x509_key_file(*credentials, crtfile, keyfile, GNUTLS_X509_FMT_PEM);
}
if (!status)
diff --git a/cups/tls-sspi.c b/cups/tls-sspi.c
index ccbdf8aa..52ded5f2 100644
--- a/cups/tls-sspi.c
+++ b/cups/tls-sspi.c
@@ -1332,8 +1332,6 @@ http_sspi_client(http_t *http, /* I - Client connection */
SecBufferDesc outBuffer; /* Array of SecBuffer structs */
SecBuffer outBuffers[1]; /* Security package buffer */
int ret = 0; /* Return value */
- char username[1024], /* Current username */
- common_name[1024]; /* CN=username */
DEBUG_printf(("4http_sspi_client(http=%p, hostname=\"%s\")", http, hostname));
@@ -1349,16 +1347,11 @@ http_sspi_client(http_t *http, /* I - Client connection */
* Lookup the client certificate...
*/
- dwSize = sizeof(username);
- GetUserNameA(username, &dwSize);
- snprintf(common_name, sizeof(common_name), "CN=%s", username);
-
- if (!http_sspi_find_credentials(http, L"ClientContainer", common_name))
- if (!http_sspi_make_credentials(http->tls, L"ClientContainer", common_name, _HTTP_MODE_CLIENT, 10))
- {
- DEBUG_puts("5http_sspi_client: Unable to get client credentials.");
- return (-1);
- }
+ if (!http_sspi_find_credentials(http, L"ClientContainer", NULL))
+ {
+ DEBUG_puts("5http_sspi_client: Unable to get client credentials.");
+ return (-1);
+ }
/*
* Initiate a ClientHello message and generate a token.
@@ -1711,48 +1704,55 @@ http_sspi_find_credentials(
goto cleanup;
}
- dwSize = 0;
-
- if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, NULL, &dwSize, NULL))
+ if (common_name)
{
- DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
- ok = FALSE;
- goto cleanup;
- }
+ dwSize = 0;
- p = (PBYTE)malloc(dwSize);
+ if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, NULL, &dwSize, NULL))
+ {
+ DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+ ok = FALSE;
+ goto cleanup;
+ }
- if (!p)
- {
- DEBUG_printf(("5http_sspi_find_credentials: malloc failed for %d bytes.", dwSize));
- ok = FALSE;
- goto cleanup;
- }
+ p = (PBYTE)malloc(dwSize);
- if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, p, &dwSize, NULL))
- {
- DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
- ok = FALSE;
- goto cleanup;
- }
+ if (!p)
+ {
+ DEBUG_printf(("5http_sspi_find_credentials: malloc failed for %d bytes.", dwSize));
+ ok = FALSE;
+ goto cleanup;
+ }
- sib.cbData = dwSize;
- sib.pbData = p;
+ if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, p, &dwSize, NULL))
+ {
+ DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+ ok = FALSE;
+ goto cleanup;
+ }
- storedContext = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_NAME, &sib, NULL);
+ sib.cbData = dwSize;
+ sib.pbData = p;
- if (!storedContext)
- {
- DEBUG_printf(("5http_sspi_find_credentials: Unable to find credentials for \"%s\".", common_name));
- ok = FALSE;
- goto cleanup;
+ storedContext = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_NAME, &sib, NULL);
+
+ if (!storedContext)
+ {
+ DEBUG_printf(("5http_sspi_find_credentials: Unable to find credentials for \"%s\".", common_name));
+ ok = FALSE;
+ goto cleanup;
+ }
}
ZeroMemory(&SchannelCred, sizeof(SchannelCred));
SchannelCred.dwVersion = SCHANNEL_CRED_VERSION;
- SchannelCred.cCreds = 1;
- SchannelCred.paCred = &storedContext;
+
+ if (common_name)
+ {
+ SchannelCred.cCreds = 1;
+ SchannelCred.paCred = &storedContext;
+ }
/*
* Set supported protocols (can also be overriden in the registry...)
@@ -2018,13 +2018,6 @@ http_sspi_make_credentials(
SchannelCred.paCred = &storedContext;
/*
- * SSPI doesn't seem to like it if grbitEnabledProtocols is set for a client.
- */
-
- if (mode == _HTTP_MODE_SERVER)
- SchannelCred.grbitEnabledProtocols = SP_PROT_SSL3TLS1;
-
- /*
* Create an SSPI credential.
*/
diff --git a/cups/tlscheck.c b/cups/tlscheck.c
index c88e7d09..4b0be1f8 100644
--- a/cups/tlscheck.c
+++ b/cups/tlscheck.c
@@ -22,7 +22,7 @@ int main(void) { puts("Sorry, no TLS support compiled in."); return (1); }
* Local functions...
*/
-static void usage(void);
+static void usage(void) _CUPS_NORETURN;
/*
diff --git a/doc/help/cgi.html b/doc/help/cgi.html
index 34c6debb..150bacdb 100644
--- a/doc/help/cgi.html
+++ b/doc/help/cgi.html
@@ -1,82 +1,41 @@
-<HTML>
+<!DOCTYPE html>
+<html>
<!-- SECTION: Getting Started -->
-<HEAD>
- <TITLE>Using CGI Programs</TITLE>
- <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
+ <head>
+ <title>Using CGI Programs</title>
+ <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+ </head>
+ <body>
+ <h1 class="title">Using CGI Programs</h1>
-<H1 CLASS="title">Using CGI Programs</H1>
+ <p>CUPS provides a dynamic web interface through dedicated CGI programs that are executed when users open special directories on the CUPS server. Each CGI performs administration, class, help, job, and printer functions as directed by the user, but the actual programs that are run and functions that are available are limited to those that were originally designed into the scheduler.</p>
-<P>CUPS provides a dynamic web interface through dedicated CGI programs that
-are executed when users open special directories on the CUPS server. Each CGI
-performs administration, class, help, job, and printer functions as directed by
-the user, but the actual programs that are run and functions that are available
-are limited to those that were originally designed into the scheduler.</P>
+ <p>CUPS also supports CGI scripts/programs for pages you want to provide, although this functionality is disabled by default. The "application/x-httpd-cgi" MIME media type is used to identify CGI content and can be associated with any filename extension. The scheduler requires CGI content to have the execute bit set, not have world or group write permissions, and any CGI scripts need to include a <tt>#!</tt> line as the first line of a script to identify the script interpreter. For example, a PHP script would look like:</p>
-<P>CUPS also supports CGI programs and specific scripting languages (Java, Perl,
-PHP, and Python) for pages you want to provide. The interpreters for these
-languages are currently configured at compile time and are associated with
-MIME media types. <a href="#TABLE1">Table 1</a> shows the MIME media types that
-are reserved for each type of page and are the same as those used by the Apache
-web server.</P>
+ <pre class="example">
+#!/usr/bin/php -fn
+&lt;?php
+...
+?&gt;
+</pre>
-<DIV CLASS="table"><TABLE SUMMARY="CGI MIME Media Types">
-<CAPTION><A NAME="TABLE1">Table 1</A>: CGI MIME Media Types</CAPTION>
-<TR>
- <TH>MIME Media Type</TH>
- <TH>Description</TH>
-</TR>
-<TR>
- <TD>application/x-httpd-cgi</TD>
- <TD>CGI script/program</TD>
-</TR>
-<TR>
- <TD>application/x-httpd-java</TD>
- <TD>Java program</TD>
-</TR>
-<TR>
- <TD>application/x-httpd-perl</TD>
- <TD>Perl script</TD>
-</TR>
-<TR>
- <TD>application/x-httpd-php</TD>
- <TD>PHP script</TD>
-</TR>
-<TR>
- <TD>application/x-httpd-python</TD>
- <TD>Python script</TD>
-</TR>
-</TABLE></DIV>
-<H2><A NAME="CONFIG">Configuring the Server</A></H2>
+ <h2><a name="CONFIG">Configuring the Server</a></h2>
-<P>In order to enable the corresponding type, you must create a
-new <VAR>/etc/cups/cgi.types</VAR> file which maps the filename
-extensions to the appropriate MIME types, for example:</P>
+ <p>In order to enable the corresponding type, you must create a new <var>/etc/cups/cgi.types</var> file which maps the filename extensions you use to the appropriate MIME types. For example, the following will support CGI programs/scripts with the "cgi" extension:</p>
-<PRE CLASS="command">
+ <pre class="command">
application/x-httpd-cgi cgi
-application/x-httpd-java class
-application/x-httpd-perl pl
-application/x-httpd-php php
-application/x-httpd-python py
-</PRE>
+</pre>
-<P>CGI scripts/programs (application/x-httpd-cgi) also must be owned by root, have execution permissions, and not have world or group write permissions to be treated as a CGI script or program.</P>
-<H2><A NAME="LIMITS">Limitations</A></H2>
+ <h2><a name="LIMITS">Limitations</a></h2>
-<P>CUPS implements most of the CGI/1.1 specification, with the
-following exceptions:</P>
+ <p>CUPS implements most of the CGI/1.1 specification, with the following exceptions:</p>
-<UL>
-
- <LI>No PATH_INFO or PATH_TRANSLATED support</LI>
-
- <LI>Limited HTTP field support; only the Content-Length (CONTENT_LENGTH), Content-Type (CONTENT_TYPE), Cookie (HTTP_COOKIE), Referrer (HTTP_REFERRER), and User-Agent (HTTP_USER_AGENT) fields are placed in environment variables at this time</LI>
-
-</UL>
-
-</BODY>
-</HTML>
+ <ul>
+ <li>No PATH_INFO or PATH_TRANSLATED support</li>
+ <li>Limited HTTP field support; only the Content-Length (<tt>CONTENT_LENGTH</tt>), Content-Type (<tt>CONTENT_TYPE</tt>), Cookie (<tt>HTTP_COOKIE</tt>), Referrer (<tt>HTTP_REFERRER</tt>), and User-Agent (<tt>HTTP_USER_AGENT</tt>) fields are placed in environment variables at this time</li>
+ </ul>
+ </body>
+</html>
diff --git a/doc/help/cupspm.html b/doc/help/cupspm.html
index fbe4f6d8..677f2bc3 100644
--- a/doc/help/cupspm.html
+++ b/doc/help/cupspm.html
@@ -7,8 +7,8 @@
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta name="creator" content="codedoc v3.1">
<meta name="author" content="Michael R Sweet">
- <meta name="copyright" content="Copyright &#xa9; 2007-2019 by Apple Inc. All Rights Reserved.">
- <meta name="version" content="2.3.3">
+ <meta name="copyright" content="Copyright &#xa9; 2007-2022 by Apple Inc. All Rights Reserved.">
+ <meta name="version" content="2.3.6">
<style type="text/css"><!--
body, p, h1, h2, h3, h4 {
font-family: sans-serif;
@@ -174,7 +174,7 @@ h3.title {
<body>
<h1 class="title">CUPS Programming Manual</h1>
<p>Michael R Sweet</p>
- <p>Copyright &#xa9; 2007-2019 by Apple Inc. All Rights Reserved.</p>
+ <p>Copyright &#xa9; 2007-2020 by Apple Inc. All Rights Reserved.</p>
<div class="contents">
<h2 class="title">Contents</h2>
<ul class="contents">
diff --git a/doc/help/man-cupsd.conf.html b/doc/help/man-cupsd.conf.html
index 1668eee8..70e00b5b 100644
--- a/doc/help/man-cupsd.conf.html
+++ b/doc/help/man-cupsd.conf.html
@@ -145,9 +145,6 @@ The default is "5".
<dd style="margin-left: 5.0em"><dt><b>KeepAlive No</b>
<dd style="margin-left: 5.0em">Specifies whether to support HTTP keep-alive connections.
The default is "Yes".
-<dt><a name="KeepAliveTimeout"></a><b>KeepAliveTimeout </b><i>seconds</i>
-<dd style="margin-left: 5.0em">Specifies how long an idle client connection remains open.
-The default is "30".
<dt><a name="LimitIPP"></a><b>&lt;Limit </b><i>operation </i>...<b>> </b>... <b>&lt;/Limit></b>
<dd style="margin-left: 5.0em">Specifies the IPP operations that are being limited inside a Policy section. IPP operation names are listed below in the section "IPP OPERATION NAMES".
<dt><a name="Limit"></a><b>&lt;Limit </b><i>method </i>...<b>> </b>... <b>&lt;/Limit></b>
@@ -163,11 +160,6 @@ The default is "0" which disables the limit check.
<dd style="margin-left: 5.0em">Listens to the specified address and port or domain socket path for connections.
Multiple Listen directives can be provided to listen on multiple addresses.
The Listen directive is similar to the Port directive but allows you to restrict access to specific interfaces or networks.
-<dt><a name="ListenBackLog"></a><b>ListenBackLog </b><i>number</i>
-<dd style="margin-left: 5.0em">Specifies the number of pending connections that will be allowed.
-This normally only affects very busy servers that have reached the MaxClients limit, but can also be triggered by large numbers of simultaneous connections.
-When the limit is reached, the operating system will refuse additional connections until the scheduler can accept the pending ones.
-The default is the OS-defined default limit, typically either "5" for older operating systems or "128" for newer operating systems.
<dt><a name="Location"></a><b>&lt;Location </b><i>/path</i><b>> </b>... <b>&lt;/Location></b>
<dd style="margin-left: 5.0em">Specifies access control for the named location.
Paths are documented below in the section "LOCATION PATHS".
@@ -556,6 +548,9 @@ The default is no classification banner.
<dd style="margin-left: 5.0em"><br>
Specifies whether users may override the classification (cover page) of individual print jobs using the "job-sheets" option.
The default is "No".
+<dt><a name="ListenBackLog"></a><b>ListenBackLog </b><i>number</i>
+<dd style="margin-left: 5.0em">Specified the number of pending connections that will be allowed.
+The scheduler now uses the value "128" on all platforms.
<dt><a name="PageLogFormat"></a><b>PageLogFormat </b><i>format-string</i>
<dd style="margin-left: 5.0em">Specifies the format of PageLog lines.
Sequences beginning with percent (%) characters are replaced with the corresponding information, while all other characters are copied literally.
@@ -624,7 +619,7 @@ Require authentication for accesses from outside the 10. network:
<b>subscriptions.conf</b>(5),
CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
-Copyright &copy; 2007-2019 by Apple Inc.
+Copyright &copy; 2007-2021 by Apple Inc.
</body>
</html>
diff --git a/doc/help/man-ipptool.html b/doc/help/man-ipptool.html
index 5f9b8621..c908fa70 100644
--- a/doc/help/man-ipptool.html
+++ b/doc/help/man-ipptool.html
@@ -36,6 +36,8 @@ ipptool - perform internet printing protocol requests
<b>-P</b>
<i>filename.plist</i>
] [
+<b>-R</b>
+] [
<b>-S</b>
] [
<b>-T</b>
@@ -128,6 +130,8 @@ The default is to use "Transfer-Encoding: chunked" for requests with attached fi
<dt><b>-P</b><i> filename.plist</i>
<dd style="margin-left: 5.0em">Specifies that the test results should be written to the named XML (Apple plist) file in addition to the regular test report (<b>-t</b>).
This option is incompatible with the <b>-i</b> (interval) and <b>-n</b> (repeat-count) options.
+<dt><b>-R</b>
+<dd style="margin-left: 5.0em">Retries tests when the "server-error-busy" status code is returned.
<dt><b>-S</b>
<dd style="margin-left: 5.0em">Forces (dedicated) TLS encryption when connecting to the server.
<dt><b>-T</b><i> seconds</i>
@@ -225,7 +229,7 @@ IANA IPP Registry (<a href="http://www.iana.org/assignments/ipp\-registrations)"
PWG Internet Printing Protocol Workgroup (<a href="http://www.pwg.org/ipp">http://www.pwg.org/ipp</a>)
RFC 8011 (<a href="http://tools.ietf.org/html/rfc8011)">http://tools.ietf.org/html/rfc8011)</a>,
<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
-Copyright &copy; 2007-2019 by Apple Inc.
+Copyright &copy; 2007-2021 by Apple Inc.
</body>
</html>
diff --git a/doc/help/man-ipptoolfile.html b/doc/help/man-ipptoolfile.html
index e0f6727d..95d4a566 100644
--- a/doc/help/man-ipptoolfile.html
+++ b/doc/help/man-ipptoolfile.html
@@ -175,6 +175,9 @@ test report.
<dd style="margin-left: 5.0em">Specifies whether
<b>ipptool</b>(8)
will ignore errors and continue with subsequent tests.
+<dt><b>MONITOR-PRINTER-STATE </b>[ <i>printer-uri </i>] <b>{ EXPECT </b><i>attribute-name </i>[ <i>predicate(s) </i>] <b>}</b>
+<dd style="margin-left: 5.0em">Specifies printer state monitoring tests to run in parallel with the test operation.
+The monitoring tests will run until all of the <b>EXPECT</b> conditions are satisfied or the primary test operation has completed, whichever occurs first.
<dt><b>NAME "</b><i>literal string</i><b>"</b>
<dd style="margin-left: 5.0em">Specifies the human-readable name of the test.
<dt><b>OPERATION </b><i>operation-code</i>
@@ -219,19 +222,25 @@ The following predicates are understood following the <b>EXPECT</b> test directi
<dt><b>COUNT </b><i>number</i>
<dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to have the specified number of values.
<dt><b>DEFINE-MATCH </b><i>variable-name</i>
-<dd style="margin-left: 5.0em">Defines the variable to "1" when the <b>EXPECT</b> condition matches. A side-effect of this predicate is that this <b>EXPECT</b> will never fail a test.
+<dd style="margin-left: 5.0em">Defines the variable to "1" when the <b>EXPECT</b> condition matches.
+A side-effect of this predicate is that this <b>EXPECT</b> will never fail a test.
<dt><b>DEFINE-NO-MATCH </b><i>variable-name</i>
-<dd style="margin-left: 5.0em">Defines the variable to "1" when the <b>EXPECT</b> condition does not match. A side-effect of this predicate is that this <b>EXPECT</b> will never fail a test.
+<dd style="margin-left: 5.0em">Defines the variable to "1" when the <b>EXPECT</b> condition does not match.
+A side-effect of this predicate is that this <b>EXPECT</b> will never fail a test.
<dt><b>DEFINE-VALUE </b><i>variable-name</i>
-<dd style="margin-left: 5.0em">Defines the variable to the value of the attribute when the <b>EXPECT</b> condition matches. A side-effect of this predicate is that this <b>EXPECT</b> will never fail a test.
+<dd style="margin-left: 5.0em">Defines the variable to the value of the attribute when the <b>EXPECT</b> condition matches.
+A side-effect of this predicate is that this <b>EXPECT</b> will never fail a test.
+<dt><b>DISPLAY-MATCH </b><i>"message"</i>
+<dd style="margin-left: 5.0em">Displays the specified message when the <b>EXPECT</b> condition matches.
<dt><b>IF-DEFINED </b><i>variable-name</i>
<dd style="margin-left: 5.0em">Makes the <b>EXPECT</b> conditions apply only if the specified variable is defined.
<dt><b>IF-NOT-DEFINED </b><i>variable-name</i>
<dd style="margin-left: 5.0em">Makes the <b>EXPECT</b> conditions apply only if the specified variable is not defined.
<dt><b>IN-GROUP </b><i>tag</i>
<dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to be in the specified group tag.
-<dt><b>OF-TYPE </b><i>tag[|tag,...]</i>
+<dt><b>OF-TYPE </b><i>tag[(limits)|tag|...]</i>
<dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to use one of the specified value tag(s).
+Most value tags also support the specification of limits in parenthesis, for example "name(42)" would allow nameWith/WithoutLanguage strings up to 42 octets in length, "name(4:MAX)" would allow nameWith/WithoutLanguage strings between 4 and 255 octets in length, and "integer(-273:MAX)" would allow integers between -273 and 2147483647.
<dt><b>REPEAT-LIMIT </b><i>number</i>
<dd style="margin-left: 5.0em"><br>
Specifies the maximum number of times to repeat if the <b>REPEAT-MATCH</b> or <b>REPEAT-NO-MATCH</b> predicate is specified. The default value is 1000.
@@ -260,7 +269,12 @@ Specifies the maximum number of times to repeat if the <b>REPEAT-MATCH</b> or <b
<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-VALUES "true"</b>
<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute match the boolean value given.
<dt><b>WITH-ALL-VALUES "/</b><i>regular expression</i><b>/"</b>
-<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
+<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute match the regular expression, which must conform to the POSIX regular expression syntax.
+Comparisons are case-sensitive.
+<dt><b>WITH-DISTINCT-VALUES</b>
+<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute are unique.
+Comparisons are case-sensitive.
+Only charset, collection, enum, integer, keyword, mimeMediaType, naturalLanguage, rangeOfInteger, resolution, uriScheme attributes support this predicate.
<dt><b>WITH-HOSTNAME "</b><i>literal string</i><b>"</b>
<dd style="margin-left: 5.0em"><dt><b>WITH-HOSTNAME "/</b><i>regular expression</i><b>/"</b>
<dd style="margin-left: 5.0em">Requires that at least one URI value contains a matching hostname.
@@ -536,7 +550,7 @@ IANA IPP Registry (<a href="http://www.iana.org/assignments/ipp-registrations)">
PWG Internet Printing Protocol Workgroup (<a href="http://www.pwg.org/ipp)">http://www.pwg.org/ipp)</a>,
RFC 8011 (<a href="http://tools.ietf.org/html/rfc8011">http://tools.ietf.org/html/rfc8011</a>)
<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
-Copyright &copy; 2007-2019 by Apple Inc.
+Copyright &copy; 2007-2021 by Apple Inc.
</body>
</html>
diff --git a/doc/test.cgi b/doc/test.cgi
new file mode 100755
index 00000000..6d98759a
--- /dev/null
+++ b/doc/test.cgi
@@ -0,0 +1,7 @@
+#!/bin/sh
+echo "Content-Type: text/plain"
+echo ""
+echo "POSIX shell CGI test page."
+echo ""
+echo "ps ax"
+ps ax
diff --git a/doc/test.php b/doc/test.php
new file mode 100755
index 00000000..f33a54f7
--- /dev/null
+++ b/doc/test.php
@@ -0,0 +1,20 @@
+#!/usr/bin/php -nf
+<?php
+print("Content-Type: text/html\n\n");
+print("<!DOCTYPE html>\n"
+ ."<html>\n"
+ ." <head>\n"
+ ." <title>PHP script CGI test page</title>\n"
+ ." </head>\n"
+ ." <body>\n"
+ ." <h1>PHP script CGI test page</h1>\n"
+ ." <pre><kbd>ps ax</kbd>\n");
+$fp = popen("ps ax", "r");
+while ($line = fgets($fp, 1024))
+{
+ print(htmlspecialchars($line));
+}
+print("</pre>\n"
+ ." </body>\n"
+ ."</html>\n");
+?>
diff --git a/examples/testfile.txt b/examples/testfile.txt
index bad0a31e..46bbf084 100644
--- a/examples/testfile.txt
+++ b/examples/testfile.txt
@@ -1,60 +1,60 @@
-All work and no play makes Johhny a dull boy. All work and no
-play makes Johhny a dull boy. All work and no play makes Johhny
-a dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy. All
-work and no play makes Johhny a dull boy. All work and no play
-makes Johhny a dull boy. All work and no play makes Johhny a
-dull boy. All work and no play makes Johhny a dull boy.
+All work and no play makes Johhny a dull boy. All work and no
+play makes Johhny a dull boy. All work and no play makes Johhny
+a dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy. All
+work and no play makes Johhny a dull boy. All work and no play
+makes Johhny a dull boy. All work and no play makes Johhny a
+dull boy. All work and no play makes Johhny a dull boy.
diff --git a/filter/common.c b/filter/common.c
index 672b7c8c..e0cbcd38 100644
--- a/filter/common.c
+++ b/filter/common.c
@@ -301,7 +301,7 @@ WriteLabelProlog(const char *label, /* I - Page label */
if ((classification = getenv("CLASSIFICATION")) == NULL)
classification = "";
- if (strcmp(classification, "none") == 0)
+ else if (strcmp(classification, "none") == 0)
classification = "";
/*
diff --git a/filter/rastertohp.c b/filter/rastertohp.c
index 0d76c42a..5f7fa1ba 100644
--- a/filter/rastertohp.c
+++ b/filter/rastertohp.c
@@ -813,8 +813,7 @@ main(int argc, /* I - Number of command-line arguments */
Shutdown();
- if (ppd)
- ppdClose(ppd);
+ ppdClose(ppd);
/*
* Close the raster stream...
diff --git a/filter/rastertopdf.cpp b/filter/rastertopdf.cpp
new file mode 100644
index 00000000..55c39b13
--- /dev/null
+++ b/filter/rastertopdf.cpp
@@ -0,0 +1,478 @@
+/*
+ * Raster filter to pdf
+ *
+ * Copyright © 2022 by Apple Inc.
+ *
+ * Licensed under Apache License v2.0. See the file "LICENSE" for more
+ * information.
+ *
+ * see <https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf> for complete spec
+ * see <https://zlib.net/manual.html> for zlib documentation
+ *
+ * To build with zlib:
+ * g++ -c -g -Os -o rastertopdf.o rastertopdf.cpp
+ * cc -o rasterToPDF rastertopdf.o -lz -lstdc++ `cups-config --libs`
+ *
+ * To build without zlib: This will produce very large pdf files.
+ * g++ -DDeflateData=0 -c -g -Os -o rastertopdf.o rastertopdf.cpp
+ * cc -o rasterToPDF rastertopdf.o -lstdc++ `cups-config --libs`
+ */
+
+#include <cups/cups.h>
+#include <cups/raster.h>
+#include <cups/backend.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <libgen.h>
+#include <limits.h>
+#include <signal.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <vector>
+
+
+#ifndef __has_include
+ static_assert(false, "__has_include not supported");
+#endif
+
+#if ( !defined(DeflateData) )
+ #if __has_include(<zlib.h>)
+ #define DeflateData 1
+ #include <zlib.h>
+ #else
+ #define DeflateData 0
+ #endif
+#elif ( DeflateData )
+ #if __has_include(<zlib.h>)
+ #include <zlib.h>
+ #else
+ #warning 'zlib.h' does not exits.
+ #undef DeflateData
+ #define DeflateData 0
+ #endif
+#endif
+
+static int Canceled = 0; /* Has the current job been canceled? */
+
+// MARK: - Misc -
+static int rasterToPDFColorSpace( cups_cspace_t colorSpace, int bitsPerPixel, int *bitsPerComponent, char *cs, size_t csLen )
+{
+ switch (colorSpace)
+ {
+ case CUPS_CSPACE_W:
+ case CUPS_CSPACE_SW:
+ *bitsPerComponent = bitsPerPixel;
+ strncpy( cs, "[/CalGray << /Gamma 2.2 /WhitePoint[ 0.9505 1.0 1.089 ] >>]", csLen );
+ break;
+
+ case CUPS_CSPACE_RGB:
+ case CUPS_CSPACE_SRGB:
+ *bitsPerComponent = bitsPerPixel/3;
+ strncpy( cs, "[/CalRGB <<\n"
+ " /Gamma[ 2.2 2.2 2.2 ]\n"
+ " /Matrix[ 0.4124 0.2126 0.0193\n"
+ " 0.3576 0.7152 0.1192\n"
+ " 0.1805 0.0722 0.9505 ]\n"
+ " /WhitePoint[ 0.9505 1.0 1.089 ]\n"
+ ">>]", csLen );
+ break;
+
+ default :
+ // AirPrint only requires sRGB and 2.2 gray.
+ // NOTE: This is not a general solution.
+ fprintf(stderr, "DEBUG: Unsupported colorspace %u.\n", colorSpace);
+ return -1;
+ }
+ return 0;
+}
+
+static void compressImageData(const unsigned char *inData,
+ size_t inSize,
+ unsigned char **outData,
+ size_t *outSize )
+{
+ if (outData == NULL || outSize == NULL)
+ {
+ fprintf(stderr, "Invalid Parameters, Line:%d\n", __LINE__);
+ exit( EXIT_FAILURE );
+ }
+#if DeflateData
+ int err = ENOMEM;
+
+ *outSize = compressBound( (uLongf)inSize );
+ *outData = (unsigned char *)malloc( *outSize );
+
+ if (*outData != NULL) err = compress( *outData, outSize, inData, inSize );
+
+ if (err != 0)
+ {
+ fprintf( stderr, "Failed to %s data, Line:%d\n", (*outData ? "compress" : "allocate"), __LINE__);
+
+ if (*outData) free( *outData );
+
+ *outData = (unsigned char *)inData;
+ *outSize = inSize;
+ }
+#else
+ *outData = (unsigned char *)inData;
+ *outSize = inSize;
+#endif
+}
+
+// MARK: - PDF Stuff -
+static long writeImageObject(FILE *pdfFile,
+ unsigned int imageReference,
+ unsigned int width,
+ unsigned int height,
+ int interpolate,
+ int bitsPerComponent,
+ char colorspace[64],
+ const unsigned char *rasterData,
+ size_t rasterDataSize )
+{
+ unsigned char *data = NULL;
+ size_t size;
+ long objectOffset = 0;
+
+ compressImageData( rasterData, rasterDataSize, &data, &size );
+
+ fprintf(pdfFile, "\n%u 0 obj\n", imageReference );
+ objectOffset = ftell(pdfFile);
+ fprintf(pdfFile, "<< /Type /XObject\n"
+ " /Subtype /Image\n"
+ " /Width %u\n"
+ " /Height %u\n"
+ " /Interpolate %s\n"
+ " /ColorSpace %s\n"
+ " /BitsPerComponent %d\n"
+ " /Length %zu\n", width, height, (interpolate ? "true" : "false"), colorspace, bitsPerComponent, rasterDataSize );
+
+ if (rasterData != data)
+ fprintf(pdfFile, " /Filter /FlateDecode\n");
+
+ fprintf(pdfFile, ">>\nstream\n" );
+ fwrite( data, size, 1, pdfFile );
+ fprintf(pdfFile, "\nendstream"
+ "\nendobj\n");
+
+ // free the data the was allocated in compressImageData
+ if (rasterData != data) free( data );
+
+ return objectOffset;
+}
+
+static long writePageStream(FILE *pdfFile,
+ unsigned int streamReference,
+ int width,
+ int height,
+ int pageNumber)
+{
+ long objectOffset = 0;
+ char imageStream[64];
+
+ snprintf( imageStream, sizeof( imageStream ), "q %d 0 0 %d 0 0 cm /Im%u Do Q", width, height, pageNumber );
+
+ fprintf(pdfFile, "\n%u 0 obj\n", streamReference );
+ objectOffset = ftell(pdfFile);
+ fprintf(pdfFile, "<< /Length %zu >>\n"
+ "stream\n"
+ "%s"
+ "\nendstream"
+ "\nendobj\n", strlen(imageStream), imageStream );
+
+ return objectOffset;
+}
+
+static long writePageObject(FILE *pdfFile,
+ unsigned int pageReference,
+ unsigned int resouceReference,
+ unsigned int contentReference,
+ int width,
+ int height)
+{
+ long objectOffset = 0;
+
+ fprintf(pdfFile, "\n%u 0 obj\n", pageReference );
+ objectOffset = ftell(pdfFile);
+ fprintf(pdfFile, "<< /Type /Page\n"
+ " /Parent 2 0 R\n"
+ " /Resources %u 0 R\n"
+ " /Contents %u 0 R\n"
+ " /MediaBox [0 0 %d %d]\n"
+ ">>\nendobj\n", resouceReference, contentReference, width, height );
+
+ return objectOffset;
+}
+
+static long writeResourceObject(FILE *pdfFile,
+ unsigned int rsrcReference,
+ unsigned int contentReference,
+ unsigned int page )
+{
+ long objectOffset = 0;
+
+ fprintf(pdfFile, "\n%u 0 obj\n", rsrcReference );
+ objectOffset = ftell(pdfFile);
+ fprintf(pdfFile, "<< /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im%u %u 0 R >> >>\nendobj\n", page, contentReference );
+
+ return objectOffset;
+}
+
+static long writePagesObject( FILE *pdfFile, std::vector<unsigned int> pages )
+{
+ long objectOffset = 0;
+
+ fprintf(pdfFile, "\n2 0 obj\n");
+ objectOffset = ftell(pdfFile);
+ fprintf(pdfFile, "<< /Type /Pages /Count %lu /Kids [", (unsigned long)pages.size());
+ for (unsigned int i : pages )
+ {
+ fprintf( pdfFile, " %d 0 R", i );
+ }
+ fprintf(pdfFile, " ] >>\nendobj\n");
+
+ return objectOffset;
+}
+
+static long writeCatalogObject( FILE *pdfFile, unsigned int objectReference )
+{
+ long objectOffset = 0;
+
+ fprintf(pdfFile, "\n%u 0 obj\n", objectReference);
+ objectOffset = ftell(pdfFile);
+ fprintf(pdfFile, "<< /Type /Catalog /Pages 2 0 R >>\n");
+ fprintf(pdfFile, "endobj\n");
+
+ return objectOffset;
+}
+
+static void writeTrailerObject(FILE *pdfFile,
+ unsigned int catalogReference,
+ unsigned long numObjects,
+ long startXOffset)
+{
+ fprintf( pdfFile, "trailer\n"
+ "<< /Root %u 0 R\n"
+ " /Size %lu >>\n"
+ "startxref\n"
+ "%ld\n"
+ "%%%%EOF\n", catalogReference, numObjects, startXOffset);
+}
+
+static long writeXRefTable( FILE *pdfFile, std::vector<long> offsets, long startOffset )
+{
+ long objectOffset = ftell(pdfFile);
+ fprintf( pdfFile, "xref\n"
+ "0 %lu\n"
+ "0000000000 65535 f\n", (unsigned long)(offsets.size() + 1) );
+ for (long offset : offsets )
+ {
+ fprintf( pdfFile, "%010ld 00000 n\n", offset - startOffset );
+ }
+ return objectOffset;
+}
+
+static long writeHeader( FILE *pdfFile )
+{
+ fprintf(pdfFile, "%%PDF-1.3\n");
+
+ return ftell(pdfFile);
+}
+
+// MARK: - Work -
+static int convertCUPSRasterToPDF( int rasterIn )
+{
+ #define kInitialImageReferenceID 10
+ int err = 0;
+ int pages = 0;
+ unsigned int objectReference = kInitialImageReferenceID;
+ unsigned int catalogReference = objectReference++;
+
+ long startOffset;
+ long offset;
+
+ float width = 0;
+ float height = 0;
+
+ size_t largestAllocatedMemory = 0;
+ unsigned char *rasterData = NULL;
+
+ std::vector<unsigned int> pageReferences;
+ std::vector<long> objectOffsets;
+ cups_raster_t *rasterFile = NULL;
+ cups_page_header2_t pageHeader;
+
+ FILE *pdfFile = stdout;
+
+ rasterFile = cupsRasterOpen(rasterIn, CUPS_RASTER_READ);
+ if (rasterFile == NULL)
+ {
+ err = errno;
+ fprintf(stderr, "ERROR: Error reading raster data.\n");
+ perror("DEBUG: cupsRasterOpen failed to open the file");
+ goto bail;
+ }
+
+ startOffset = writeHeader( pdfFile );
+ while ( !Canceled && cupsRasterReadHeader2(rasterFile, &pageHeader) )
+ {
+ char colorspace[256];
+ int bitsPerComponent = 8;
+
+ fprintf(stderr, "PAGE: %d %d\n", pages+1, pageHeader.NumCopies);
+ fprintf(stderr, "DEBUG:%04d] pageHeader.colorSpace=%u, .bitsPerPixel=%u, .duplexMode=%u\n",
+ pages, pageHeader.cupsColorSpace, pageHeader.cupsBitsPerPixel, pageHeader.Duplex);
+ fprintf(stderr, "DEBUG: pageHeader.width=%u, .height=%u, .resolution=%u x %u\n",
+ pageHeader.cupsWidth, pageHeader.cupsHeight, pageHeader.HWResolution[0], pageHeader.HWResolution[1]);
+
+ int status = rasterToPDFColorSpace( pageHeader.cupsColorSpace, pageHeader.cupsBitsPerPixel, &bitsPerComponent, colorspace, sizeof(colorspace) );
+ if (status)
+ {
+ fprintf( stderr, "INFO: Unable to determine a colorspace. skipping this page.\n" );
+ continue;
+ }
+
+ size_t imageSize = pageHeader.cupsHeight * pageHeader.cupsBytesPerLine;
+ if (imageSize > largestAllocatedMemory)
+ {
+ rasterData = (unsigned char *)(rasterData == NULL ? malloc(imageSize) : realloc(rasterData, imageSize));
+ largestAllocatedMemory = imageSize;
+ }
+
+ if (rasterData == NULL)
+ {
+ fprintf(stderr, "ERROR: Unable to allocate memory for page info\n");
+ err = -1;
+ break;
+ }
+
+ size_t result = (size_t) cupsRasterReadPixels(rasterFile, rasterData, (unsigned int)imageSize);
+ if (result != imageSize)
+ {
+ err = -2;
+ fprintf(stderr, "ERROR: Unable to read print data.\n");
+ fprintf(stderr, "DEBUG: cupsRasterReadPixels faild on page:%d (%zu of %zu bytes read)\n", pages+1, result, imageSize );
+ break;
+ }
+
+ width = 72.0 * pageHeader.cupsWidth / pageHeader.HWResolution[1];
+ height = 72.0 * pageHeader.cupsHeight / pageHeader.HWResolution[0];
+
+ unsigned int pageReference = objectReference++;
+ unsigned int rsrcReference = objectReference++;
+ unsigned int streamReference = objectReference++;
+ unsigned int imageReference = objectReference++;
+ int interpolate = 0;
+
+ offset = writePageStream(pdfFile, streamReference, width, height, pages+1 );
+ objectOffsets.push_back( offset );
+
+ offset = writePageObject(pdfFile,
+ pageReference,
+ rsrcReference,
+ streamReference,
+ width,
+ height);
+ objectOffsets.push_back( offset );
+
+ offset = writeResourceObject(pdfFile, rsrcReference, imageReference, pages+1 );
+ objectOffsets.push_back( offset );
+
+ offset = writeImageObject(pdfFile,
+ imageReference,
+ pageHeader.cupsWidth,
+ pageHeader.cupsHeight,
+ interpolate,
+ bitsPerComponent,
+ colorspace,
+ rasterData,
+ imageSize);
+ objectOffsets.push_back( offset );
+
+ pageReferences.push_back( pageReference );
+ pages++;
+ }
+
+ offset = writePagesObject( pdfFile, pageReferences );
+ objectOffsets.push_back( offset );
+
+ offset = writeCatalogObject( pdfFile, catalogReference );
+ objectOffsets.push_back( offset );
+
+ offset = writeXRefTable( pdfFile, objectOffsets, startOffset );
+
+ writeTrailerObject( pdfFile, catalogReference,
+ objectOffsets.size() + 1, offset - startOffset );
+bail:
+ if ( pdfFile != NULL ) fclose( pdfFile );
+ if ( rasterFile != NULL ) cupsRasterClose(rasterFile);
+ if ( rasterIn != -1 ) close( rasterIn );
+ if ( rasterData ) free( rasterData );
+
+ return err;
+}
+
+static void sigterm_handler(int sig)
+{
+ (void)sig;
+
+ Canceled = 1;
+}
+
+static void installSignalHandler( void )
+{
+#ifdef HAVE_SIGSET
+ sigset(SIGTERM, sigterm_handler);
+#elif defined(HAVE_SIGACTION)
+ struct sigaction action; /* Actions for POSIX signals */
+ memset(&action, 0, sizeof(action));
+
+ sigemptyset(&action.sa_mask);
+ sigaddset(&action.sa_mask, SIGTERM);
+
+ action.sa_handler = sigterm_handler;
+ sigaction(SIGTERM, &action, NULL);
+#else
+ signal(SIGTERM, sigterm_handler);
+#endif /* HAVE_SIGSET */
+}
+
+// MARK: -
+int main(int argc, const char * argv[])
+{
+ int err = 0;
+
+ /*
+ * Make sure status messages are not buffered...
+ */
+ setbuf(stderr, NULL);
+
+ /*
+ * Check the command-line...
+ */
+ if (argc < 6 || argc > 7)
+ {
+ fprintf(stderr, "Usage: %s job-id user title copies options [file]\n",
+ argv[0]);
+ return (CUPS_BACKEND_FAILED);
+ }
+
+ /*
+ * Register a signal handler to eject the current page if the
+ * job is cancelled.
+ */
+ installSignalHandler();
+
+ int fd = fileno(stdin);
+ if (argc == 7)
+ {
+ if ((fd = open(argv[6], O_RDONLY)) < 0)
+ {
+ perror("ERROR: Unable to open file");
+ return (1);
+ }
+ }
+
+ err = convertCUPSRasterToPDF( fd );
+ return err;
+}
diff --git a/locale/cups.pot b/locale/cups.pot
index 679d1856..db081a50 100644
--- a/locale/cups.pot
+++ b/locale/cups.pot
@@ -1,7 +1,7 @@
#
# Message catalog template for CUPS.
#
-# Copyright © 2007-2019 by Apple Inc.
+# Copyright © 2007-2020 by Apple Inc.
# Copyright © 2005-2007 by Easy Software Products.
#
# Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -23,7 +23,7 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: CUPS 2.3.3\n"
+"Project-Id-Version: CUPS 2.3.6\n"
"Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n"
"POT-Creation-Date: 2019-12-18 20:19-0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
diff --git a/man/cupsd.conf.5 b/man/cupsd.conf.5
index 00b1a22d..beeccc69 100644
--- a/man/cupsd.conf.5
+++ b/man/cupsd.conf.5
@@ -1,13 +1,13 @@
.\"
.\" cupsd.conf man page for CUPS.
.\"
-.\" Copyright © 2007-2019 by Apple Inc.
+.\" Copyright © 2007-2021 by Apple Inc.
.\" Copyright © 1997-2006 by Easy Software Products.
.\"
.\" Licensed under Apache License v2.0. See the file "LICENSE" for more
.\" information.
.\"
-.TH cupsd.conf 5 "CUPS" "16 July 2019" "Apple Inc."
+.TH cupsd.conf 5 "CUPS" "1 October 2021" "Apple Inc."
.SH NAME
cupsd.conf \- server configuration file for cups
.SH DESCRIPTION
@@ -212,11 +212,6 @@ The default is "5".
\fBKeepAlive No\fR
Specifies whether to support HTTP keep-alive connections.
The default is "Yes".
-.\"#KeepAliveTimeout
-.TP 5
-\fBKeepAliveTimeout \fIseconds\fR
-Specifies how long an idle client connection remains open.
-The default is "30".
.\"#LimitIPP
.TP 5
\fB<Limit \fIoperation \fR...\fB> \fR... \fB</Limit>\fR
@@ -245,13 +240,6 @@ The default is "0" which disables the limit check.
Listens to the specified address and port or domain socket path for connections.
Multiple Listen directives can be provided to listen on multiple addresses.
The Listen directive is similar to the Port directive but allows you to restrict access to specific interfaces or networks.
-.\"#ListenBackLog
-.TP 5
-\fBListenBackLog \fInumber\fR
-Specifies the number of pending connections that will be allowed.
-This normally only affects very busy servers that have reached the MaxClients limit, but can also be triggered by large numbers of simultaneous connections.
-When the limit is reached, the operating system will refuse additional connections until the scheduler can accept the pending ones.
-The default is the OS-defined default limit, typically either "5" for older operating systems or "128" for newer operating systems.
.\"#Location
.TP 5
\fB<Location \fI/path\fB> \fR... \fB</Location>\fR
@@ -829,6 +817,11 @@ The default is no classification banner.
.br
Specifies whether users may override the classification (cover page) of individual print jobs using the "job-sheets" option.
The default is "No".
+.\"#ListenBackLog
+.TP 5
+\fBListenBackLog \fInumber\fR
+Specified the number of pending connections that will be allowed.
+The scheduler now uses the value "128" on all platforms.
.\"#PageLogFormat
.TP 5
\fBPageLogFormat \fIformat-string\fR
@@ -902,4 +895,4 @@ Require authentication for accesses from outside the 10. network:
.BR subscriptions.conf (5),
CUPS Online Help (http://localhost:631/help)
.SH COPYRIGHT
-Copyright \[co] 2007-2019 by Apple Inc.
+Copyright \[co] 2007-2021 by Apple Inc.
diff --git a/man/ipptool.1 b/man/ipptool.1
index ce858da5..7d2cca56 100644
--- a/man/ipptool.1
+++ b/man/ipptool.1
@@ -1,12 +1,12 @@
.\"
.\" ipptool man page.
.\"
-.\" Copyright © 2010-2019 by Apple Inc.
+.\" Copyright © 2010-2021 by Apple Inc.
.\"
.\" Licensed under Apache License v2.0. See the file "LICENSE" for more
.\" information.
.\"
-.TH ipptool 1 "CUPS" "26 April 2019" "Apple Inc."
+.TH ipptool 1 "CUPS" "5 April 2021" "Apple Inc."
.SH NAME
ipptool \- perform internet printing protocol requests
.SH SYNOPSIS
@@ -36,6 +36,8 @@ ipptool \- perform internet printing protocol requests
.B \-P
.I filename.plist
] [
+.B \-R
+] [
.B \-S
] [
.B \-T
@@ -139,6 +141,9 @@ The default is to use "Transfer\-Encoding: chunked" for requests with attached f
Specifies that the test results should be written to the named XML (Apple plist) file in addition to the regular test report (\fB\-t\fR).
This option is incompatible with the \fB\-i\fR (interval) and \fB\-n\fR (repeat\-count) options.
.TP 5
+.B \-R
+Retries tests when the "server-error-busy" status code is returned.
+.TP 5
.B \-S
Forces (dedicated) TLS encryption when connecting to the server.
.TP 5
@@ -249,4 +254,4 @@ IANA IPP Registry (http://www.iana.org/assignments/ipp\-registrations),
PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)
RFC 8011 (http://tools.ietf.org/html/rfc8011),
.SH COPYRIGHT
-Copyright \[co] 2007-2019 by Apple Inc.
+Copyright \[co] 2007-2021 by Apple Inc.
diff --git a/man/ipptoolfile.5 b/man/ipptoolfile.5
index 70010177..b4b08c05 100644
--- a/man/ipptoolfile.5
+++ b/man/ipptoolfile.5
@@ -1,12 +1,12 @@
.\"
.\" ipptoolfile man page.
.\"
-.\" Copyright © 2010-2019 by Apple Inc.
+.\" Copyright © 2010-2021 by Apple Inc.
.\"
.\" Licensed under Apache License v2.0. See the file "LICENSE" for more
.\" information.
.\"
-.TH ipptoolfile 5 "CUPS" "15 August 2019" "Apple Inc."
+.TH ipptoolfile 5 "CUPS" "12 May 2021" "Apple Inc."
.SH NAME
ipptoolfile \- ipptool file format
.SH DESCRIPTION
@@ -214,6 +214,10 @@ Specifies whether
.BR ipptool (8)
will ignore errors and continue with subsequent tests.
.TP 5
+\fBMONITOR-PRINTER-STATE \fR[ \fIprinter-uri \fR] \fB{ EXPECT \fIattribute-name \fR[ \fIpredicate(s) \fR] \fB}\fR
+Specifies printer state monitoring tests to run in parallel with the test operation.
+The monitoring tests will run until all of the \fBEXPECT\fR conditions are satisfied or the primary test operation has completed, whichever occurs first.
+.TP 5
\fBNAME "\fIliteral string\fB"\fR
Specifies the human-readable name of the test.
.TP 5
@@ -277,13 +281,19 @@ The following predicates are understood following the \fBEXPECT\fR test directiv
Requires the \fBEXPECT\fR attribute to have the specified number of values.
.TP 5
\fBDEFINE\-MATCH \fIvariable-name\fR
-Defines the variable to "1" when the \fBEXPECT\fR condition matches. A side-effect of this predicate is that this \fBEXPECT\fR will never fail a test.
+Defines the variable to "1" when the \fBEXPECT\fR condition matches.
+A side-effect of this predicate is that this \fBEXPECT\fR will never fail a test.
.TP 5
\fBDEFINE\-NO\-MATCH \fIvariable-name\fR
-Defines the variable to "1" when the \fBEXPECT\fR condition does not match. A side-effect of this predicate is that this \fBEXPECT\fR will never fail a test.
+Defines the variable to "1" when the \fBEXPECT\fR condition does not match.
+A side-effect of this predicate is that this \fBEXPECT\fR will never fail a test.
.TP 5
\fBDEFINE\-VALUE \fIvariable-name\fR
-Defines the variable to the value of the attribute when the \fBEXPECT\fR condition matches. A side-effect of this predicate is that this \fBEXPECT\fR will never fail a test.
+Defines the variable to the value of the attribute when the \fBEXPECT\fR condition matches.
+A side-effect of this predicate is that this \fBEXPECT\fR will never fail a test.
+.TP 5
+\fBDISPLAY\-MATCH \fI"message"\fR
+Displays the specified message when the \fBEXPECT\fR condition matches.
.TP 5
\fBIF\-DEFINED \fIvariable-name\fR
Makes the \fBEXPECT\fR conditions apply only if the specified variable is defined.
@@ -294,8 +304,9 @@ Makes the \fBEXPECT\fR conditions apply only if the specified variable is not de
\fBIN\-GROUP \fItag\fR
Requires the \fBEXPECT\fR attribute to be in the specified group tag.
.TP 5
-\fBOF\-TYPE \fItag[|tag,...]\fR
+\fBOF\-TYPE \fItag[(limits)|tag|...]\fR
Requires the \fBEXPECT\fR attribute to use one of the specified value tag(s).
+Most value tags also support the specification of limits in parenthesis, for example "name(42)" would allow nameWith/WithoutLanguage strings up to 42 octets in length, "name(4:MAX)" would allow nameWith/WithoutLanguage strings between 4 and 255 octets in length, and "integer(-273:MAX)" would allow integers between -273 and 2147483647.
.TP 5
\fBREPEAT\-LIMIT \fInumber\fR
.br
@@ -342,7 +353,13 @@ Requires that all values of the \fBEXPECT\fR attribute match the number(s) or nu
Requires that all values of the \fBEXPECT\fR attribute match the boolean value given.
.TP 5
\fBWITH\-ALL\-VALUES "/\fIregular expression\fB/"\fR
-Requires that all values of the \fBEXPECT\fR attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
+Requires that all values of the \fBEXPECT\fR attribute match the regular expression, which must conform to the POSIX regular expression syntax.
+Comparisons are case-sensitive.
+.TP 5
+\fBWITH\-DISTINCT\-VALUES\fR
+Requires that all values of the \fBEXPECT\fR attribute are unique.
+Comparisons are case-sensitive.
+Only charset, collection, enum, integer, keyword, mimeMediaType, naturalLanguage, rangeOfInteger, resolution, uriScheme attributes support this predicate.
.TP 5
\fBWITH\-HOSTNAME "\fIliteral string\fB"\fR
.TP 5
@@ -652,4 +669,4 @@ IANA IPP Registry (http://www.iana.org/assignments/ipp-registrations),
PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp),
RFC 8011 (http://tools.ietf.org/html/rfc8011)
.SH COPYRIGHT
-Copyright \[co] 2007-2019 by Apple Inc.
+Copyright \[co] 2007-2021 by Apple Inc.
diff --git a/notifier/rss.c b/notifier/rss.c
index 44d368c7..516b6154 100644
--- a/notifier/rss.c
+++ b/notifier/rss.c
@@ -46,7 +46,7 @@ static char *rss_password; /* Password for remote RSS */
*/
static int compare_rss(_cups_rss_t *a, _cups_rss_t *b);
-static void delete_message(_cups_rss_t *rss);
+static void delete_message(_cups_rss_t *msg);
static void load_rss(cups_array_t *rss, const char *filename);
static _cups_rss_t *new_message(int sequence_number, char *subject,
char *text, char *link_url,
diff --git a/packaging/cups.list.in b/packaging/cups.list.in
index 537c1945..d674d2ac 100644
--- a/packaging/cups.list.in
+++ b/packaging/cups.list.in
@@ -346,12 +346,12 @@ l 0755 root sys /usr/bsd/lprm $BINDIR/lprm
%system darwin
f 0555 root sys $LIBDIR/libcups.2.dylib cups/libcups.2.dylib nostrip()
l 0755 root sys $LIBDIR/libcups.dylib libcups.2.dylib
-f 0555 root sys $LIBDIR/libcupsimage.2.dylib filter/libcupsimage.2.dylib nostrip()
+f 0555 root sys $LIBDIR/libcupsimage.2.dylib cups/libcupsimage.2.dylib nostrip()
l 0755 root sys $LIBDIR/libcupsimage.dylib libcupsimage.2.dylib
%system !darwin
f 0555 root sys $LIBDIR/libcups.so.2 cups/libcups.so.2 nostrip()
l 0755 root sys $LIBDIR/libcups.so libcups.so.2
-f 0555 root sys $LIBDIR/libcupsimage.so.2 filter/libcupsimage.so.2 nostrip()
+f 0555 root sys $LIBDIR/libcupsimage.so.2 cups/libcupsimage.so.2 nostrip()
l 0755 root sys $LIBDIR/libcupsimage.so libcupsimage.so.2
%system all
%subpackage
diff --git a/ppdc/ppdc-import.cxx b/ppdc/ppdc-import.cxx
index 04b587d7..b4a83413 100644
--- a/ppdc/ppdc-import.cxx
+++ b/ppdc/ppdc-import.cxx
@@ -323,5 +323,8 @@ ppdcSource::import_ppd(const char *f) // I - Filename
}
}
+ if (ppd)
+ ppdClose(ppd);
+
return (1);
}
diff --git a/ppdc/ppdc-source.cxx b/ppdc/ppdc-source.cxx
index b28c4724..aec29131 100644
--- a/ppdc/ppdc-source.cxx
+++ b/ppdc/ppdc-source.cxx
@@ -1,7 +1,7 @@
//
// Source class for the CUPS PPD Compiler.
//
-// Copyright 2007-2018 by Apple Inc.
+// Copyright 2007-2020 by Apple Inc.
// Copyright 2002-2007 by Easy Software Products.
//
// Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -537,7 +537,7 @@ ppdcSource::get_color_profile(
for (i = 0; i < 9; i ++)
m[i] = get_float(fp);
- return (new ppdcProfile(resolution, media_type, g, d, m));
+ return (new ppdcProfile(resolution, media_type, d, g, m));
}
@@ -1880,7 +1880,7 @@ ppdcSource::get_simple_profile(ppdcFile *fp)
}
// Return the new profile...
- return (new ppdcProfile(resolution, media_type, g, kd, m));
+ return (new ppdcProfile(resolution, media_type, kd, g, m));
}
diff --git a/ppdc/ppdc.cxx b/ppdc/ppdc.cxx
index 5411b5e3..385f4564 100644
--- a/ppdc/ppdc.cxx
+++ b/ppdc/ppdc.cxx
@@ -21,7 +21,7 @@
// Local functions...
//
-static void usage(void);
+static void usage(void) _CUPS_NORETURN;
//
@@ -229,7 +229,6 @@ main(int argc, // I - Number of command-line arguments
default : // Unknown
usage();
- break;
}
}
else
@@ -393,7 +392,7 @@ main(int argc, // I - Number of command-line arguments
return (1);
}
- if (templocales != locales)
+ if (templocales && templocales != locales)
templocales->release();
cupsFileClose(fp);
diff --git a/ppdc/ppdhtml.cxx b/ppdc/ppdhtml.cxx
index 506e6616..75636a94 100644
--- a/ppdc/ppdhtml.cxx
+++ b/ppdc/ppdhtml.cxx
@@ -20,7 +20,7 @@
// Local functions...
//
-static void usage(void);
+static void usage(void) _CUPS_NORETURN;
//
diff --git a/ppdc/ppdi.cxx b/ppdc/ppdi.cxx
index e5bb0469..a2f9648f 100644
--- a/ppdc/ppdi.cxx
+++ b/ppdc/ppdi.cxx
@@ -21,7 +21,7 @@
// Local functions...
//
-static void usage(void);
+static void usage(void) _CUPS_NORETURN;
//
diff --git a/ppdc/ppdmerge.cxx b/ppdc/ppdmerge.cxx
index 94d67ff8..1ab80439 100644
--- a/ppdc/ppdmerge.cxx
+++ b/ppdc/ppdmerge.cxx
@@ -22,7 +22,7 @@
//
static const char *ppd_locale(ppd_file_t *ppd);
-static void usage(void);
+static void usage(void) _CUPS_NORETURN;
//
diff --git a/ppdc/ppdpo.cxx b/ppdc/ppdpo.cxx
index 244aaf18..498b34e3 100644
--- a/ppdc/ppdpo.cxx
+++ b/ppdc/ppdpo.cxx
@@ -21,7 +21,7 @@
//
static void add_ui_strings(ppdcDriver *d, ppdcCatalog *catalog);
-static void usage(void);
+static void usage(void) _CUPS_NORETURN;
//
diff --git a/ppdc/sample.drv b/ppdc/sample.drv
index 148cf0f5..416e545d 100644
--- a/ppdc/sample.drv
+++ b/ppdc/sample.drv
@@ -56,6 +56,7 @@
#media "w108h36/1.50x0.50\"" 108 36
#media "w108h72/1.50x1.00\"" 108 72
#media "w108h144/1.50x2.00\"" 108 144
+#media "w142h227/80x50mm" 142 227
#media "w144h26/2.00x0.37\"" 144 26
#media "w144h36/2.00x0.50\"" 144 36
#media "w144h72/2.00x1.00\"" 144 72
@@ -78,7 +79,10 @@
#media "w216h90/3.00x1.25\"" 216 90
#media "w216h144/3.00x2.00\"" 216 144
#media "w216h216/3.00x3.00\"" 216 216
+#media "w216h288/3.00x4.00\"" 216 288
#media "w216h360/3.00x5.00\"" 216 360
+#media "w216h432/3.00x6.00\"" 216 432
+#media "w216h576/3.00x8.00\"" 216 576
#media "w234h144/3.25x2.00\"" 234 144
#media "w234h360/3.25x5.00\"" 234 360
#media "w234h396/3.25x5.50\"" 234 396
@@ -93,6 +97,7 @@
#media "w288h360/4.00x5.00\"" 288 360
#media "w288h432/4.00x6.00\"" 288 432
#media "w288h468/4.00x6.50\"" 288 468
+#media "w288h576/4.00x8.00\"" 288 576
#media "w288h936/4.00x13.00\"" 288 936
#media "w432h72/6.00x1.00\"" 432 72
#media "w432h144/6.00x2.00\"" 432 144
@@ -101,6 +106,7 @@
#media "w432h360/6.00x5.00\"" 432 360
#media "w432h432/6.00x6.00\"" 432 432
#media "w432h468/6.00x6.50\"" 432 468
+#media "w432h576/6.00x8.00\"" 432 576
#media "w576h72/8.00x1.00\"" 576 72
#media "w576h144/8.00x2.00\"" 576 144
#media "w576h216/8.00x3.00\"" 576 216
@@ -108,6 +114,7 @@
#media "w576h360/8.00x5.00\"" 576 360
#media "w576h432/8.00x6.00\"" 576 432
#media "w576h468/8.00x6.50\"" 576 468
+#media "w595h72/8.26x1.00\"" 595 72
// Common stuff for all drivers...
Attribute "cupsVersion" "" "2.3"
@@ -115,7 +122,7 @@ Attribute "FileSystem" "" "False"
Attribute "LandscapeOrientation" "" "Plus90"
Attribute "TTRasterizer" "" "Type42"
-Copyright "Copyright (c) 2007-2019 by Apple Inc."
+Copyright "Copyright (c) 2007-2021 by Apple Inc."
Copyright "Copyright (c) 1997-2007 by Easy Software Products."
Copyright ""
Copyright "Licensed under Apache License v2.0. See the file \"LICENSE\" for more"
@@ -936,12 +943,16 @@ Version "2.3"
MinSize 36 36
MaxSize 576 3600
+ MediaSize A4
+ MediaSize A5
+ MediaSize A5Rotated
MediaSize w90h18
MediaSize w90h162
MediaSize w108h18
MediaSize w108h36
MediaSize w108h72
MediaSize w108h144
+ MediaSize w142h227
MediaSize w144h26
MediaSize w144h36
MediaSize w144h72
@@ -959,8 +970,11 @@ Version "2.3"
MediaSize w216h72
MediaSize w216h90
MediaSize w216h144
+ MediaSize w216h288
MediaSize w216h216
MediaSize w216h360
+ MediaSize w216h432
+ MediaSize w216h576
MediaSize w234h144
MediaSize w234h360
MediaSize w234h396
@@ -975,6 +989,7 @@ Version "2.3"
*MediaSize w288h360
MediaSize w288h432
MediaSize w288h468
+ MediaSize w288h576
MediaSize w288h936
MediaSize w432h72
MediaSize w432h144
@@ -983,6 +998,7 @@ Version "2.3"
MediaSize w432h360
MediaSize w432h432
MediaSize w432h468
+ MediaSize w432h576
MediaSize w576h72
MediaSize w576h144
MediaSize w576h216
@@ -990,6 +1006,7 @@ Version "2.3"
MediaSize w576h360
MediaSize w576h432
MediaSize w576h468
+ MediaSize w595h72
*Resolution k 1 0 0 0 203dpi
Resolution k 1 0 0 0 300dpi
diff --git a/scheduler/auth.c b/scheduler/auth.c
index 4fbad6e2..4fdcf117 100644
--- a/scheduler/auth.c
+++ b/scheduler/auth.c
@@ -202,7 +202,6 @@ cupsdAddNameMask(cups_array_t **masks, /* IO - Masks array (created as needed) *
if (ifptr >= ifname && *ifptr == ')')
{
- ifptr --;
*ifptr = '\0';
}
diff --git a/scheduler/cert.c b/scheduler/cert.c
index 258e8fc8..2a28b568 100644
--- a/scheduler/cert.c
+++ b/scheduler/cert.c
@@ -434,5 +434,9 @@ ctcompare(const char *a, /* I - First string */
b ++;
}
+ // either both *a and *b == '\0', or one points inside a string,
+ // so factor that in.
+ result |= (*a ^ *b);
+
return (result);
}
diff --git a/scheduler/classes.c b/scheduler/classes.c
index 14d2558b..8e24f9ba 100644
--- a/scheduler/classes.c
+++ b/scheduler/classes.c
@@ -658,13 +658,10 @@ cupsdSaveAllClasses(void)
{
cups_file_t *fp; /* classes.conf file */
char filename[1024], /* classes.conf filename */
- temp[1024], /* Temporary string */
value[2048], /* Value string */
*name; /* Current user name */
cupsd_printer_t *pclass; /* Current printer class */
int i; /* Looping var */
- time_t curtime; /* Current time */
- struct tm curdate; /* Current date */
cups_option_t *option; /* Current option */
@@ -683,12 +680,8 @@ cupsdSaveAllClasses(void)
* Write a small header to the file...
*/
- time(&curtime);
- localtime_r(&curtime, &curdate);
- strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate);
-
cupsFilePuts(fp, "# Class configuration file for " CUPS_SVERSION "\n");
- cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp);
+ cupsFilePrintf(fp, "# Written by cupsd\n");
cupsFilePuts(fp, "# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING\n");
/*
diff --git a/scheduler/client.c b/scheduler/client.c
index c2ee8f12..0126ef02 100644
--- a/scheduler/client.c
+++ b/scheduler/client.c
@@ -1,8 +1,9 @@
/*
* Client routines for the CUPS scheduler.
*
- * Copyright © 2007-2019 by Apple Inc.
- * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright © 2021 by OpenPrinting.
+ * Copyright © 2007-2021 by Apple Inc.
+ * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
*
* This file contains Kerberos support code, copyright 2006 by
* Jelmer Vernooij.
@@ -2109,18 +2110,13 @@ cupsdSendHeader(
}
else if (auth_type == CUPSD_AUTH_NEGOTIATE)
{
-#if defined(SO_PEERCRED) && defined(AF_LOCAL)
- if (httpAddrFamily(httpGetAddress(con->http)) == AF_LOCAL)
- strlcpy(auth_str, "PeerCred", sizeof(auth_str));
- else
-#endif /* SO_PEERCRED && AF_LOCAL */
strlcpy(auth_str, "Negotiate", sizeof(auth_str));
}
- if (con->best && auth_type != CUPSD_AUTH_NEGOTIATE && !con->is_browser && !_cups_strcasecmp(httpGetHostname(con->http, NULL, 0), "localhost"))
+ if (con->best && !con->is_browser && !_cups_strcasecmp(httpGetHostname(con->http, NULL, 0), "localhost"))
{
/*
- * Add a "trc" (try root certification) parameter for local non-Kerberos
+ * Add a "trc" (try root certification) parameter for local
* requests when the request requires system group membership - then the
* client knows the root certificate can/should be used.
*
@@ -2789,6 +2785,25 @@ get_file(cupsd_client_t *con, /* I - Client connection */
perm_check = 0;
}
+ else if (!strcmp(con->uri, "/admin/conf/cupsd.conf"))
+ {
+ strlcpy(filename, ConfigurationFile, len);
+
+ perm_check = 0;
+ }
+ else if (!strncmp(con->uri, "/admin/log/", 11))
+ {
+ if (!strncmp(con->uri + 11, "access_log", 10) && AccessLog[0] == '/')
+ strlcpy(filename, AccessLog, len);
+ else if (!strncmp(con->uri + 11, "error_log", 9) && ErrorLog[0] == '/')
+ strlcpy(filename, ErrorLog, len);
+ else if (!strncmp(con->uri + 11, "page_log", 8) && PageLog[0] == '/')
+ strlcpy(filename, PageLog, len);
+ else
+ return (NULL);
+
+ perm_check = 0;
+ }
else if (!strncmp(con->uri, "/admin", 6) || !strncmp(con->uri, "/classes", 8) || !strncmp(con->uri, "/jobs", 5) || !strncmp(con->uri, "/printers", 9))
{
/*
@@ -2822,25 +2837,6 @@ get_file(cupsd_client_t *con, /* I - Client connection */
perm_check = 0;
}
- else if (!strcmp(con->uri, "/admin/conf/cupsd.conf"))
- {
- strlcpy(filename, ConfigurationFile, len);
-
- perm_check = 0;
- }
- else if (!strncmp(con->uri, "/admin/log/", 11))
- {
- if (!strncmp(con->uri + 11, "access_log", 10) && AccessLog[0] == '/')
- strlcpy(filename, AccessLog, len);
- else if (!strncmp(con->uri + 11, "error_log", 9) && ErrorLog[0] == '/')
- strlcpy(filename, ErrorLog, len);
- else if (!strncmp(con->uri + 11, "page_log", 8) && PageLog[0] == '/')
- strlcpy(filename, PageLog, len);
- else
- return (NULL);
-
- perm_check = 0;
- }
else if (con->language)
{
snprintf(language, sizeof(language), "/%s", con->language->language);
@@ -2938,7 +2934,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */
*/
if (language[3])
- language[0] = '\0'; /* Strip country code */
+ language[3] = '\0'; /* Strip country code */
else
language[0] = '\0'; /* Strip language */
}
@@ -3124,8 +3120,7 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */
return (0);
}
- if (!_cups_strcasecmp(type->type, "x-httpd-cgi") &&
- (filestats->st_mode & 0111))
+ if (!_cups_strcasecmp(type->type, "x-httpd-cgi") && (filestats->st_mode & 0111) && (getuid() || !(filestats->st_mode & 022)))
{
/*
* "application/x-httpd-cgi" is a CGI script.
@@ -3471,8 +3466,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
}
else
{
- sprintf(content_length, "CONTENT_LENGTH=" CUPS_LLFMT,
- CUPS_LLCAST con->bytes);
+ snprintf(content_length, sizeof(content_length), "CONTENT_LENGTH=" CUPS_LLFMT, CUPS_LLCAST con->bytes);
snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s",
httpGetField(con->http, HTTP_FIELD_CONTENT_TYPE));
diff --git a/scheduler/conf.c b/scheduler/conf.c
index bb6049b2..1180ac9b 100644
--- a/scheduler/conf.c
+++ b/scheduler/conf.c
@@ -95,7 +95,6 @@ static const cupsd_var_t cupsd_vars[] =
{ "JobKillDelay", &JobKillDelay, CUPSD_VARTYPE_TIME },
{ "JobRetryLimit", &JobRetryLimit, CUPSD_VARTYPE_INTEGER },
{ "JobRetryInterval", &JobRetryInterval, CUPSD_VARTYPE_TIME },
- { "KeepAliveTimeout", &KeepAliveTimeout, CUPSD_VARTYPE_TIME },
{ "KeepAlive", &KeepAlive, CUPSD_VARTYPE_BOOLEAN },
#ifdef HAVE_LAUNCHD
{ "LaunchdTimeout", &IdleExitTimeout, CUPSD_VARTYPE_TIME },
@@ -719,7 +718,6 @@ cupsdReadConfiguration(void)
FilterNice = 0;
HostNameLookups = FALSE;
KeepAlive = TRUE;
- KeepAliveTimeout = DEFAULT_KEEPALIVE;
ListenBackLog = SOMAXCONN;
LogDebugHistory = 200;
LogFilePerm = CUPS_DEFAULT_LOG_FILE_PERM;
diff --git a/scheduler/conf.h b/scheduler/conf.h
index b4e14eed..791c0d36 100644
--- a/scheduler/conf.h
+++ b/scheduler/conf.h
@@ -199,8 +199,6 @@ VAR int MaxClients VALUE(100),
/* Timeout during requests */
KeepAlive VALUE(TRUE),
/* Support the Keep-Alive option? */
- KeepAliveTimeout VALUE(DEFAULT_KEEPALIVE),
- /* Timeout between requests */
FileDevice VALUE(FALSE),
/* Allow file: devices? */
FilterLimit VALUE(0),
diff --git a/scheduler/cups-deviced.c b/scheduler/cups-deviced.c
index 77703b98..14478fd9 100644
--- a/scheduler/cups-deviced.c
+++ b/scheduler/cups-deviced.c
@@ -265,7 +265,7 @@ main(int argc, /* I - Number of command-line args */
* all others run as the unprivileged user...
*/
- start_backend(dent->filename, !(dent->fileinfo.st_mode & (S_IWGRP | S_IRWXO)));
+ start_backend(dent->filename, !(dent->fileinfo.st_mode & (S_IWGRP | S_IWOTH | S_IXOTH)));
}
cupsDirClose(dir);
diff --git a/scheduler/cups-lpd.c b/scheduler/cups-lpd.c
index 0da3d0c0..7b1dc483 100644
--- a/scheduler/cups-lpd.c
+++ b/scheduler/cups-lpd.c
@@ -1268,7 +1268,7 @@ remove_jobs(const char *dest, /* I - Destination */
request = ippNewRequest(IPP_OP_CANCEL_JOB);
- sprintf(uri, "ipp://localhost/jobs/%d", id);
+ snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", id);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
diff --git a/scheduler/ipp.c b/scheduler/ipp.c
index 2fe3bf25..2e7e5791 100644
--- a/scheduler/ipp.c
+++ b/scheduler/ipp.c
@@ -1,7 +1,7 @@
/*
* IPP routines for the CUPS scheduler.
*
- * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2007-2021 by Apple Inc.
* Copyright © 1997-2007 by Easy Software Products, all rights reserved.
*
* This file contains Kerberos support code, copyright 2006 by
@@ -72,6 +72,7 @@ static void copy_subscription_attrs(cupsd_client_t *con,
cups_array_t *ra,
cups_array_t *exclude);
static void create_job(cupsd_client_t *con, ipp_attribute_t *uri);
+static void *create_local_bg_thread(cupsd_printer_t *printer);
static void create_local_printer(cupsd_client_t *con);
static cups_array_t *create_requested_array(ipp_t *request);
static void create_subscriptions(cupsd_client_t *con, ipp_attribute_t *uri);
@@ -880,7 +881,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */
* Class doesn't exist; see if we have a printer of the same name...
*/
- if ((pclass = cupsdFindPrinter(resource + 9)) != NULL)
+ if (cupsdFindPrinter(resource + 9))
{
/*
* Yes, return an error...
@@ -2273,7 +2274,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
* Printer doesn't exist; see if we have a class of the same name...
*/
- if ((printer = cupsdFindClass(resource + 10)) != NULL)
+ if (cupsdFindClass(resource + 10))
{
/*
* Yes, return an error...
@@ -2691,7 +2692,22 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
need_restart_job = 1;
changed_driver = 1;
- if (!strcmp(ppd_name, "raw"))
+ if (!strcmp(ppd_name, "everywhere"))
+ {
+ // Create IPP Everywhere PPD...
+ if (!printer->device_uri || (strncmp(printer->device_uri, "dnssd://", 8) && strncmp(printer->device_uri, "ipp://", 6) && strncmp(printer->device_uri, "ipps://", 7) && strncmp(printer->device_uri, "ippusb://", 9)))
+ {
+ send_ipp_status(con, IPP_INTERNAL_ERROR, _("IPP Everywhere driver requires an IPP connection."));
+ if (!modify)
+ cupsdDeletePrinter(printer, 0);
+
+ return;
+ }
+
+ // Run a background thread to create the PPD...
+ _cupsThreadCreate((_cups_thread_func_t)create_local_bg_thread, printer);
+ }
+ else if (!strcmp(ppd_name, "raw"))
{
/*
* Raw driver, remove any existing PPD file.
@@ -4891,7 +4907,7 @@ copy_printer_attrs(
}
if (printer->alert && (!ra || cupsArrayFind(ra, "printer-alert")))
- ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_STRING, "printer-alert", NULL, printer->alert);
+ ippAddOctetString(con->response, IPP_TAG_PRINTER, "printer-alert", printer->alert, (int)strlen(printer->alert));
if (printer->alert_description && (!ra || cupsArrayFind(ra, "printer-alert-description")))
ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-alert-description", NULL, printer->alert_description);
@@ -5016,6 +5032,9 @@ copy_printer_attrs(
if (!ra || cupsArrayFind(ra, "queued-job-count"))
add_queued_job_count(con, printer);
+ if (!ra || cupsArrayFind(ra, "uri-security-supported"))
+ ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "uri-security-supported", NULL, is_encrypted ? "tls" : "none");
+
copy_attrs(con->response, printer->attrs, ra, IPP_TAG_ZERO, 0, NULL);
if (printer->ppd_attrs)
copy_attrs(con->response, printer->ppd_attrs, ra, IPP_TAG_ZERO, 0, NULL);
@@ -9353,11 +9372,10 @@ restart_job(cupsd_client_t *con, /* I - Client connection */
cupsdLogJob(job, CUPSD_LOG_DEBUG,
"Restarted by \"%s\" with job-hold-until=%s.",
username, attr->values[0].string.text);
- cupsdSetJobHoldUntil(job, attr->values[0].string.text, 0);
-
- cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED | CUPSD_EVENT_JOB_STATE,
- NULL, job, "Job restarted by user with job-hold-until=%s",
- attr->values[0].string.text);
+ cupsdSetJobHoldUntil(job, attr->values[0].string.text, 1);
+ cupsdSetJobState(job, IPP_JOB_HELD, CUPSD_JOB_DEFAULT,
+ "Job restarted by user with job-hold-until=%s",
+ attr->values[0].string.text);
}
else
{
@@ -10866,17 +10884,13 @@ set_printer_defaults(
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
- sprintf(value, "%d", attr->values[0].integer);
- printer->num_options = cupsAddOption(name, value,
- printer->num_options,
- &(printer->options));
+ printer->num_options = cupsAddIntegerOption(name, attr->values[0].integer, printer->num_options, &(printer->options));
cupsdLogMessage(CUPSD_LOG_DEBUG,
"Setting %s to %s...", attr->name, value);
break;
case IPP_TAG_RANGE :
- sprintf(value, "%d-%d", attr->values[0].range.lower,
- attr->values[0].range.upper);
+ snprintf(value, sizeof(value), "%d-%d", attr->values[0].range.lower, attr->values[0].range.upper);
printer->num_options = cupsAddOption(name, value,
printer->num_options,
&(printer->options));
@@ -10885,10 +10899,7 @@ set_printer_defaults(
break;
case IPP_TAG_RESOLUTION :
- sprintf(value, "%dx%d%s", attr->values[0].resolution.xres,
- attr->values[0].resolution.yres,
- attr->values[0].resolution.units == IPP_RES_PER_INCH ?
- "dpi" : "dpcm");
+ snprintf(value, sizeof(value), "%dx%d%s", attr->values[0].resolution.xres, attr->values[0].resolution.yres, attr->values[0].resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
printer->num_options = cupsAddOption(name, value,
printer->num_options,
&(printer->options));
diff --git a/scheduler/job.c b/scheduler/job.c
index e20e7c56..351d43b1 100644
--- a/scheduler/job.c
+++ b/scheduler/job.c
@@ -893,7 +893,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
goto abort_job;
}
- sprintf(jobid, "%d", job->id);
+ snprintf(jobid, sizeof(jobid), "%d", job->id);
argv[0] = job->printer->name;
argv[1] = jobid;
@@ -1247,7 +1247,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
else if (stat(command, &backinfo))
backroot = 0;
else
- backroot = !(backinfo.st_mode & (S_IWGRP | S_IRWXO));
+ backroot = !(backinfo.st_mode & (S_IWGRP | S_IWOTH | S_IXOTH));
argv[0] = job->printer->sanitized_device_uri;
@@ -2179,11 +2179,8 @@ cupsdSaveAllJobs(void)
{
int i; /* Looping var */
cups_file_t *fp; /* job.cache file */
- char filename[1024], /* job.cache filename */
- temp[1024]; /* Temporary string */
+ char filename[1024]; /* job.cache filename */
cupsd_job_t *job; /* Current job */
- time_t curtime; /* Current time */
- struct tm curdate; /* Current date */
snprintf(filename, sizeof(filename), "%s/job.cache", CacheDir);
@@ -2196,12 +2193,8 @@ cupsdSaveAllJobs(void)
* Write a small header to the file...
*/
- time(&curtime);
- localtime_r(&curtime, &curdate);
- strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate);
-
cupsFilePuts(fp, "# Job cache file for " CUPS_SVERSION "\n");
- cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp);
+ cupsFilePrintf(fp, "# Written by cupsd\n");
cupsFilePrintf(fp, "NextJobId %d\n", NextJobId);
/*
@@ -2625,7 +2618,7 @@ cupsdSetJobState(
else
cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "%s", buffer);
- if (newstate == IPP_JOB_STOPPED || newstate == IPP_JOB_ABORTED || newstate == IPP_JOB_HELD)
+ if (newstate == IPP_JOB_STOPPED || newstate == IPP_JOB_ABORTED)
cupsdLogJob(job, CUPSD_LOG_ERROR, "%s", buffer);
else
cupsdLogJob(job, CUPSD_LOG_INFO, "%s", buffer);
@@ -3119,8 +3112,7 @@ finalize_job(cupsd_job_t *job, /* I - Job */
* rarely have current information for network devices...
*/
- if (strncmp(job->printer->device_uri, "usb:", 4) &&
- strncmp(job->printer->device_uri, "ippusb:", 7))
+ if (!strstr(job->printer->device_uri, "usb:"))
cupsdSetPrinterReasons(job->printer, "-offline-report");
/*
@@ -3229,7 +3221,7 @@ finalize_job(cupsd_job_t *job, /* I - Job */
exit_code = job->status;
}
- cupsdLogJob(job, CUPSD_LOG_INFO, "Backend returned status %d (%s)",
+ cupsdLogJob(job, CUPSD_LOG_WARN, "Backend returned status %d (%s)",
exit_code,
exit_code == CUPS_BACKEND_FAILED ? "failed" :
exit_code == CUPS_BACKEND_AUTH_REQUIRED ?
diff --git a/scheduler/listen.c b/scheduler/listen.c
index 92c7c626..dbf959b2 100644
--- a/scheduler/listen.c
+++ b/scheduler/listen.c
@@ -160,7 +160,7 @@ cupsdStartListening(void)
if (lis->fd == -1)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
+ cupsdLogMessage(errno == EAFNOSUPPORT ? CUPSD_LOG_INFO : CUPSD_LOG_ERROR,
"Unable to open listen socket for address %s:%d - %s.",
s, p, strerror(errno));
diff --git a/scheduler/log.c b/scheduler/log.c
index 2bd1952f..efc16ad9 100644
--- a/scheduler/log.c
+++ b/scheduler/log.c
@@ -569,11 +569,7 @@ cupsdLogJob(cupsd_job_t *job, /* I - Job */
* Format and write the log message...
*/
-#ifdef HAVE_SYSTEMD_SD_JOURNAL_H
- if (job && strcmp(ErrorLog, "syslog"))
-#else
if (job)
-#endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
snprintf(jobmsg, sizeof(jobmsg), "[Job %d] %s", job->id, message);
else
strlcpy(jobmsg, message, sizeof(jobmsg));
diff --git a/scheduler/main.c b/scheduler/main.c
index d5fdf971..edd49d90 100644
--- a/scheduler/main.c
+++ b/scheduler/main.c
@@ -232,7 +232,6 @@ main(int argc, /* I - Number of command-line args */
case 'h' : /* Show usage/help */
usage(0);
- break;
case 'l' : /* Started by launchd/systemd/upstart... */
#ifdef HAVE_ONDEMAND
@@ -312,7 +311,6 @@ main(int argc, /* I - Number of command-line args */
_cupsLangPrintf(stderr, _("cupsd: Unknown option \"%c\" - "
"aborting."), *opt);
usage(1);
- break;
}
}
}
@@ -581,7 +579,7 @@ main(int argc, /* I - Number of command-line args */
* Clean out old temp files and printer cache data.
*/
- if (!strncmp(TempDir, RequestRoot, strlen(RequestRoot)))
+ if (!RequestRoot || !strncmp(TempDir, RequestRoot, strlen(RequestRoot)))
cupsdCleanFiles(TempDir, NULL);
cupsdCleanFiles(CacheDir, "*.ipp");
@@ -1888,7 +1886,6 @@ service_add_listener(int fd, /* I - Socket file descriptor */
{
cupsdLogMessage(CUPSD_LOG_ERROR, "service_add_listener: Unable to allocate listener: %s.", strerror(errno));
exit(EXIT_FAILURE);
- return;
}
cupsArrayAdd(Listeners, lis);
@@ -1940,7 +1937,6 @@ service_checkin(void)
{
cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get listener sockets: %s", strerror(error));
exit(EXIT_FAILURE);
- return; /* anti-compiler-warning */
}
/*
diff --git a/scheduler/printers.c b/scheduler/printers.c
index e341bdb0..991a17eb 100644
--- a/scheduler/printers.c
+++ b/scheduler/printers.c
@@ -1,7 +1,7 @@
/*
* Printer routines for the CUPS scheduler.
*
- * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2007-2020 by Apple Inc.
* Copyright © 1997-2007 by Easy Software Products, all rights reserved.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -822,12 +822,15 @@ cupsdDeletePrinter(
ippDelete(p->attrs);
ippDelete(p->ppd_attrs);
+ _ppdCacheDestroy(p->pc);
+
mimeDeleteType(MimeDatabase, p->filetype);
mimeDeleteType(MimeDatabase, p->prefiltertype);
cupsdFreeStrings(&(p->users));
cupsdFreeQuotas(p);
+ cupsdClearString(&p->uuid);
cupsdClearString(&p->uri);
cupsdClearString(&p->hostname);
cupsdClearString(&p->name);
@@ -1472,13 +1475,10 @@ cupsdSaveAllPrinters(void)
int i; /* Looping var */
cups_file_t *fp; /* printers.conf file */
char filename[1024], /* printers.conf filename */
- temp[1024], /* Temporary string */
value[2048], /* Value string */
*ptr, /* Pointer into value */
*name; /* Current user/group name */
cupsd_printer_t *printer; /* Current printer class */
- time_t curtime; /* Current time */
- struct tm curdate; /* Current date */
cups_option_t *option; /* Current option */
ipp_attribute_t *marker; /* Current marker attribute */
@@ -1498,12 +1498,8 @@ cupsdSaveAllPrinters(void)
* Write a small header to the file...
*/
- time(&curtime);
- localtime_r(&curtime, &curdate);
- strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate);
-
cupsFilePuts(fp, "# Printer configuration file for " CUPS_SVERSION "\n");
- cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp);
+ cupsFilePrintf(fp, "# Written by cupsd\n");
cupsFilePuts(fp, "# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING\n");
cupsFilePrintf(fp, "NextPrinterId %d\n", NextPrinterId);
@@ -2316,8 +2312,6 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
"uri-authentication-supported", NULL, auth_supported);
- ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
- "uri-security-supported", NULL, "none");
if (p->printer_id)
ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-id", p->printer_id);
ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name", NULL,
@@ -4016,7 +4010,8 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */
num_qualities = 0;
- if ((output_mode = ppdFindOption(ppd, "OutputMode")) != NULL)
+ if ((output_mode = ppdFindOption(ppd, "OutputMode")) ||
+ (output_mode = ppdFindOption(ppd, "cupsPrintQuality")))
{
if (ppdFindChoice(output_mode, "draft") ||
ppdFindChoice(output_mode, "fast"))
diff --git a/scheduler/subscriptions.c b/scheduler/subscriptions.c
index 15acedca..2dbb28f8 100644
--- a/scheduler/subscriptions.c
+++ b/scheduler/subscriptions.c
@@ -1021,11 +1021,8 @@ cupsdSaveAllSubscriptions(void)
{
int i; /* Looping var */
cups_file_t *fp; /* subscriptions.conf file */
- char filename[1024], /* subscriptions.conf filename */
- temp[1024]; /* Temporary string */
+ char filename[1024]; /* subscriptions.conf filename */
cupsd_subscription_t *sub; /* Current subscription */
- time_t curtime; /* Current time */
- struct tm curdate; /* Current date */
unsigned mask; /* Current event mask */
const char *name; /* Current event name */
int hex; /* Non-zero if we are writing hex data */
@@ -1046,12 +1043,8 @@ cupsdSaveAllSubscriptions(void)
* Write a small header to the file...
*/
- time(&curtime);
- localtime_r(&curtime, &curdate);
- strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate);
-
cupsFilePuts(fp, "# Subscription configuration file for " CUPS_SVERSION "\n");
- cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp);
+ cupsFilePrintf(fp, "# Written by cupsd\n");
cupsFilePrintf(fp, "NextSubscriptionId %d\n", NextSubscriptionId);
diff --git a/scheduler/sysman.c b/scheduler/sysman.c
index 56eb4e32..81e3ed43 100644
--- a/scheduler/sysman.c
+++ b/scheduler/sysman.c
@@ -425,7 +425,7 @@ sysEventThreadEntry(void)
* Register for power state change notifications
*/
- bzero(&threadData, sizeof(threadData));
+ memset(&threadData, 0, sizeof(threadData));
threadData.sysevent.powerKernelPort =
IORegisterForSystemPower(&threadData, &powerNotifierPort,
@@ -441,7 +441,7 @@ sysEventThreadEntry(void)
* Register for system configuration change notifications
*/
- bzero(&storeContext, sizeof(storeContext));
+ memset(&storeContext, 0, sizeof(storeContext));
storeContext.info = &threadData;
store = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("cupsd"),
@@ -536,7 +536,7 @@ sysEventThreadEntry(void)
* this later.
*/
- bzero(&timerContext, sizeof(timerContext));
+ memset(&timerContext, 0, sizeof(timerContext));
timerContext.info = &threadData;
threadData.timerRef =
diff --git a/scheduler/util.c b/scheduler/util.c
index 86569044..228733f3 100644
--- a/scheduler/util.c
+++ b/scheduler/util.c
@@ -108,7 +108,7 @@ cupsdCompareNames(const char *s, /* I - First string */
return (-1);
else if (digits > 0)
return (1);
- else if (diff)
+ else
return (diff);
}
else if (tolower(*s) < tolower(*t))
@@ -142,10 +142,10 @@ cupsdCompareNames(const char *s, /* I - First string */
cups_array_t * /* O - CUPS array */
cupsdCreateStringsArray(const char *s) /* I - Comma-delimited strings */
{
- if (!s || !*s)
- return (NULL);
- else
+ if (s && *s)
return (_cupsArrayNewStrings(s, ','));
+ else
+ return (NULL);
}
diff --git a/scripts/makesrcdist b/scripts/makesrcdist
index 33b2f37c..fa8dd4ef 100755
--- a/scripts/makesrcdist
+++ b/scripts/makesrcdist
@@ -59,7 +59,7 @@ else
exit 1
fi
- temp=`head -1 README.md | awk '{print $4}'`
+ temp=`head -1 README.md | awk '{print $5}'`
if test "$temp" != "v$version"; then
echo "Still need to update version to v$version in README.md (saw $temp)"
exit 1
diff --git a/systemv/cancel.c b/systemv/cancel.c
index c85a86e0..0f303886 100644
--- a/systemv/cancel.c
+++ b/systemv/cancel.c
@@ -274,7 +274,7 @@ main(int argc, /* I - Number of command-line arguments */
}
else
{
- sprintf(uri, "ipp://localhost/jobs/%d", job_id);
+ snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
uri);
}
@@ -311,8 +311,7 @@ main(int argc, /* I - Number of command-line arguments */
op == IPP_PURGE_JOBS ? "purge-jobs" : "cancel-job",
cupsLastErrorString());
- if (response)
- ippDelete(response);
+ ippDelete(response);
return (1);
}
@@ -375,8 +374,7 @@ main(int argc, /* I - Number of command-line arguments */
op == IPP_PURGE_JOBS ? "purge-jobs" : "cancel-job",
cupsLastErrorString());
- if (response)
- ippDelete(response);
+ ippDelete(response);
return (1);
}
diff --git a/systemv/cupstestppd.c b/systemv/cupstestppd.c
index b94cae94..c3a2d19d 100644
--- a/systemv/cupstestppd.c
+++ b/systemv/cupstestppd.c
@@ -261,7 +261,6 @@ main(int argc, /* I - Number of command-line args */
default :
usage();
- break;
}
}
else
diff --git a/systemv/lp.c b/systemv/lp.c
index 298c1582..fd818a56 100644
--- a/systemv/lp.c
+++ b/systemv/lp.c
@@ -161,6 +161,12 @@ main(int argc, /* I - Number of command-line arguments */
"name."), argv[0]);
return (1);
}
+ else if (cupsLastError() == IPP_STATUS_ERROR_NOT_FOUND)
+ {
+ _cupsLangPrintf(stderr,
+ _("%s: Error - The printer or class does not exist."), argv[0]);
+ return (1);
+ }
break;
case 'f' : /* Form */
@@ -280,9 +286,7 @@ main(int argc, /* I - Number of command-line arguments */
return (1);
}
- sprintf(buffer, "%d", num_copies);
- num_options = cupsAddOption("copies", buffer, num_options,
- &options);
+ num_options = cupsAddIntegerOption("copies", num_copies, num_options, &options);
break;
case 'o' : /* Option */
@@ -342,9 +346,7 @@ main(int argc, /* I - Number of command-line arguments */
return (1);
}
- sprintf(buffer, "%d", priority);
- num_options = cupsAddOption("job-priority", buffer, num_options,
- &options);
+ num_options = cupsAddIntegerOption("job-priority", priority, num_options, &options);
break;
case 's' : /* Silent */
@@ -660,7 +662,7 @@ restart_job(const char *command, /* I - Command name */
request = ippNewRequest(IPP_RESTART_JOB);
- sprintf(uri, "ipp://localhost/jobs/%d", job_id);
+ snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"job-uri", NULL, uri);
@@ -708,7 +710,7 @@ set_job_attrs(
request = ippNewRequest(IPP_SET_JOB_ATTRIBUTES);
- sprintf(uri, "ipp://localhost/jobs/%d", job_id);
+ snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"job-uri", NULL, uri);
diff --git a/systemv/lpadmin.c b/systemv/lpadmin.c
index ca6d386b..dc875cb8 100644
--- a/systemv/lpadmin.c
+++ b/systemv/lpadmin.c
@@ -1,7 +1,8 @@
/*
* "lpadmin" command for CUPS.
*
- * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2021 by OpenPrinting.
+ * Copyright © 2007-2021 by Apple Inc.
* Copyright © 1997-2006 by Easy Software Products.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -28,7 +29,6 @@ static int delete_printer_from_class(http_t *http, char *printer,
static int delete_printer_option(http_t *http, char *printer,
char *option);
static int enable_printer(http_t *http, char *printer);
-static char *get_printer_ppd(const char *uri, char *buffer, size_t bufsize, int *num_options, cups_option_t **options);
static cups_ptype_t get_printer_type(http_t *http, char *printer, char *uri,
size_t urisize);
static int set_printer_options(http_t *http, char *printer,
@@ -240,14 +240,14 @@ main(int argc, /* I - Number of command-line arguments */
case 'E' : /* Enable the printer/enable encryption */
if (printer == NULL)
{
-#ifdef HAVE_SSL
+#ifdef HAVE_TLS
cupsSetEncryption(HTTP_ENCRYPTION_REQUIRED);
if (http)
httpEncryption(http, HTTP_ENCRYPTION_REQUIRED);
#else
_cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]);
-#endif /* HAVE_SSL */
+#endif /* HAVE_TLS */
break;
}
@@ -625,14 +625,7 @@ main(int argc, /* I - Number of command-line arguments */
return (1);
#endif /* __APPLE__ */
}
- else if (ppd_name && !strcmp(ppd_name, "everywhere") && device_uri)
- {
- if ((file = get_printer_ppd(device_uri, evefile, sizeof(evefile), &num_options, &options)) == NULL)
- return (1);
-
- num_options = cupsRemoveOption("ppd-name", num_options, &options);
- }
- else if (ppd_name || file)
+ else if ((ppd_name && strcmp(ppd_name, "everywhere")) || file)
{
_cupsLangPuts(stderr, _("lpadmin: Printer drivers are deprecated and will stop working in a future version of CUPS."));
}
@@ -1157,105 +1150,6 @@ enable_printer(http_t *http, /* I - Server connection */
/*
- * 'get_printer_ppd()' - Get an IPP Everywhere PPD file for the given URI.
- */
-
-static char * /* O - Filename or NULL */
-get_printer_ppd(
- const char *uri, /* I - Printer URI */
- char *buffer, /* I - Filename buffer */
- size_t bufsize, /* I - Size of filename buffer */
- int *num_options, /* IO - Number of options */
- cups_option_t **options) /* IO - Options */
-{
- http_t *http; /* Connection to printer */
- ipp_t *request, /* Get-Printer-Attributes request */
- *response; /* Get-Printer-Attributes response */
- ipp_attribute_t *attr; /* Attribute from response */
- char resolved[1024], /* Resolved URI */
- scheme[32], /* URI scheme */
- userpass[256], /* Username:password */
- host[256], /* Hostname */
- resource[256]; /* Resource path */
- int port; /* Port number */
- static const char * const pattrs[] = /* Attributes to use */
- {
- "all",
- "media-col-database"
- };
-
-
- /*
- * Connect to the printer...
- */
-
- if (strstr(uri, "._tcp"))
- {
- /*
- * Resolve URI...
- */
-
- if (!_httpResolveURI(uri, resolved, sizeof(resolved), _HTTP_RESOLVE_DEFAULT, NULL, NULL))
- {
- _cupsLangPrintf(stderr, _("%s: Unable to resolve \"%s\"."), "lpadmin", uri);
- return (NULL);
- }
-
- uri = resolved;
- }
-
- if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
- {
- _cupsLangPrintf(stderr, _("%s: Bad printer URI \"%s\"."), "lpadmin", uri);
- return (NULL);
- }
-
- http = httpConnect2(host, port, NULL, AF_UNSPEC, !strcmp(scheme, "ipps") ? HTTP_ENCRYPTION_ALWAYS : HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL);
- if (!http)
- {
- _cupsLangPrintf(stderr, _("%s: Unable to connect to \"%s:%d\": %s"), "lpadmin", host, port, cupsLastErrorString());
- return (NULL);
- }
-
- /*
- * Send a Get-Printer-Attributes request...
- */
-
- request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
- ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), NULL, pattrs);
- response = cupsDoRequest(http, request, resource);
-
- if (cupsLastError() >= IPP_STATUS_REDIRECTION_OTHER_SITE)
- {
- _cupsLangPrintf(stderr, _("%s: Unable to query printer: %s"), "lpadmin", cupsLastErrorString());
- buffer[0] = '\0';
- }
- else if (_ppdCreateFromIPP(buffer, bufsize, response))
- {
- if (!cupsGetOption("printer-geo-location", *num_options, *options) && (attr = ippFindAttribute(response, "printer-geo-location", IPP_TAG_URI)) != NULL)
- *num_options = cupsAddOption("printer-geo-location", ippGetString(attr, 0, NULL), *num_options, options);
-
- if (!cupsGetOption("printer-info", *num_options, *options) && (attr = ippFindAttribute(response, "printer-info", IPP_TAG_TEXT)) != NULL)
- *num_options = cupsAddOption("printer-info", ippGetString(attr, 0, NULL), *num_options, options);
-
- if (!cupsGetOption("printer-location", *num_options, *options) && (attr = ippFindAttribute(response, "printer-location", IPP_TAG_TEXT)) != NULL)
- *num_options = cupsAddOption("printer-location", ippGetString(attr, 0, NULL), *num_options, options);
- }
- else
- _cupsLangPrintf(stderr, _("%s: Unable to create PPD file: %s"), "lpadmin", strerror(errno));
-
- ippDelete(response);
- httpClose(http);
-
- if (buffer[0])
- return (buffer);
- else
- return (NULL);
-}
-
-
-/*
* 'get_printer_type()' - Determine the printer type and URI.
*/
@@ -1373,7 +1267,7 @@ set_printer_options(
if (file)
ppdfile = file;
- else if ((ppdname = cupsGetOption("ppd-name", num_options, options)) != NULL && strcmp(ppdname, "raw") && num_options > 1)
+ else if ((ppdname = cupsGetOption("ppd-name", num_options, options)) != NULL && strcmp(ppdname, "everywhere") && strcmp(ppdname, "raw") && num_options > 1)
{
if ((ppdfile = cupsGetServerPPD(http, ppdname)) != NULL)
{
diff --git a/systemv/lpstat.c b/systemv/lpstat.c
index 1d14cb8e..86e7a7ca 100644
--- a/systemv/lpstat.c
+++ b/systemv/lpstat.c
@@ -634,7 +634,7 @@ match_list(const char *list, /* I - List of names */
if (!name)
return (0);
- while (*list)
+ do
{
/*
* Skip leading whitespace and commas...
@@ -660,6 +660,7 @@ match_list(const char *list, /* I - List of names */
while (*list && !isspace(*list & 255) && *list != ',')
list ++;
}
+ while (*list);
return (0);
}
@@ -810,8 +811,8 @@ show_accepting(const char *printers, /* I - Destinations */
_cupsLangPrintf(stdout, _("%s not accepting requests since %s -"),
printer, printer_state_time);
_cupsLangPrintf(stdout, _("\t%s"),
- (message == NULL || !*message) ?
- "reason unknown" : message);
+ (message && *message) ?
+ message : "reason unknown");
}
for (i = 0; i < num_dests; i ++)
@@ -826,8 +827,8 @@ show_accepting(const char *printers, /* I - Destinations */
_("%s/%s not accepting requests since %s -"),
printer, dests[i].instance, printer_state_time);
_cupsLangPrintf(stdout, _("\t%s"),
- (message == NULL || !*message) ?
- "reason unknown" : message);
+ (message && *message) ?
+ message : "reason unknown");
}
}
}
@@ -950,7 +951,7 @@ show_classes(const char *dests) /* I - Destinations */
printer_uri = NULL;
members = NULL;
- while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
+ do
{
if (!strcmp(attr->name, "printer-name") &&
attr->value_tag == IPP_TAG_NAME)
@@ -966,6 +967,7 @@ show_classes(const char *dests) /* I - Destinations */
attr = attr->next;
}
+ while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER);
/*
* If this is a remote class, grab the class info from the
@@ -1789,10 +1791,10 @@ show_printers(const char *printers, /* I - Destinations */
if ((message && *message) || pstate == IPP_PRINTER_STOPPED)
{
- if (!message || !*message)
- _cupsLangPuts(stdout, _("\treason unknown"));
+ if (message && *message)
+ _cupsLangPrintf(stdout, "\t%s", message);
else
- _cupsLangPrintf(stdout, "\t%s", message);
+ _cupsLangPuts(stdout, _("\treason unknown"));
}
if (long_status > 1)
@@ -1909,10 +1911,10 @@ show_printers(const char *printers, /* I - Destinations */
if ((message && *message) || pstate == IPP_PRINTER_STOPPED)
{
- if (!message || !*message)
- _cupsLangPuts(stdout, _("\treason unknown"));
- else
+ if (message && *message)
_cupsLangPrintf(stdout, "\t%s", message);
+ else
+ _cupsLangPuts(stdout, _("\treason unknown"));
}
if (long_status > 1)
diff --git a/templates/Makefile b/templates/Makefile
index 59720bd6..b0a47dee 100644
--- a/templates/Makefile
+++ b/templates/Makefile
@@ -73,8 +73,6 @@ FILES = \
printers.tmpl \
printers-header.tmpl \
restart.tmpl \
- samba-export.tmpl \
- samba-exported.tmpl \
search.tmpl \
set-printer-options-header.tmpl \
set-printer-options-trailer.tmpl \
diff --git a/templates/choose-model.tmpl b/templates/choose-model.tmpl
index e916cf8a..9c9b71f2 100644
--- a/templates/choose-model.tmpl
+++ b/templates/choose-model.tmpl
@@ -39,7 +39,7 @@
<TD>
<SELECT NAME="PPD_NAME" SIZE="10">
{op=add-printer?:<OPTION VALUE="__no_change__" SELECTED>Current Driver - {current_make_and_model}</OPTION>:}
-{show_ipp_everywhere?<OPTION VALUE="everywhere" SELECTED>{current_make_and_model} - IPP Everywhere &trade;</OPTION>:}
+{show_ipp_everywhere?<OPTION VALUE="everywhere" SELECTED>{current_make_and_model?{current_make_and_model} -:} IPP Everywhere &trade;</OPTION>:}
{[ppd_name]<OPTION VALUE="{ppd_name}" {op=modify-printer?:{?current_make_and_model={ppd_make_and_model}?SELECTED:}}>{ppd_make_and_model} ({ppd_natural_language})
}</SELECT>
</TD>
diff --git a/test/run-stp-tests.sh b/test/run-stp-tests.sh
index 2f9630f5..58d2692f 100755
--- a/test/run-stp-tests.sh
+++ b/test/run-stp-tests.sh
@@ -3,7 +3,7 @@
# Perform the complete set of IPP compliance tests specified in the
# CUPS Software Test Plan.
#
-# Copyright © 2007-2019 by Apple Inc.
+# Copyright © 2007-2021 by Apple Inc.
# Copyright © 1997-2007 by Easy Software Products, all rights reserved.
#
# Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -356,6 +356,7 @@ cat >$BASE/share/banners/classified <<EOF
EOF
ln -s $root/data $BASE/share
ln -s $root/ppdc/sample.drv $BASE/share/drv
+ln -s $root/conf/cgi.types $BASE/share/mime
ln -s $root/conf/mime.types $BASE/share/mime
ln -s $root/conf/mime.convs $BASE/share/mime
ln -s $root/data/*.h $BASE/share/ppdc
diff --git a/tools/ippeveprinter.c b/tools/ippeveprinter.c
index 41954a57..15caa69d 100644
--- a/tools/ippeveprinter.c
+++ b/tools/ippeveprinter.c
@@ -1,10 +1,12 @@
/*
* IPP Everywhere printer application for CUPS.
*
- * Copyright © 2010-2019 by Apple Inc.
+ * Copyright © 2021 by OpenPrinting.
+ * Copyright © 2020 by the IEEE-ISTO Printer Working Group.
+ * Copyright © 2010-2021 by Apple Inc.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
- * information.º
+ * information.
*
* Note: This program began life as the "ippserver" sample code that first
* appeared in CUPS 1.4. The name has been changed in order to distinguish it
@@ -38,6 +40,7 @@ typedef ULONG nfds_t;
#else
extern char **environ;
+# include <spawn.h>
# include <sys/fcntl.h>
# include <sys/wait.h>
# include <poll.h>
@@ -48,7 +51,9 @@ extern char **environ;
#elif defined(HAVE_AVAHI)
# include <avahi-client/client.h>
# include <avahi-client/publish.h>
+# include <avahi-common/alternative.h>
# include <avahi-common/error.h>
+# include <avahi-common/malloc.h>
# include <avahi-common/thread-watch.h>
#endif /* HAVE_DNSSD */
@@ -74,6 +79,8 @@ extern char **environ;
#endif /* HAVE_LIBPAM */
#include "printer-png.h"
+#include "printer-lg-png.h"
+#include "printer-sm-png.h"
/*
@@ -178,16 +185,22 @@ typedef struct ippeve_printer_s /**** Printer data ****/
/* TODO: One IPv4 and one IPv6 listener are really not sufficient */
int ipv4, /* IPv4 listener */
ipv6; /* IPv6 listener */
- ippeve_srv_t ipp_ref, /* Bonjour IPP service */
- ipps_ref, /* Bonjour IPPS service */
- http_ref, /* Bonjour HTTP service */
- printer_ref; /* Bonjour LPD service */
- char *dnssd_name, /* printer-dnssd-name */
+#ifdef HAVE_DNSSD
+ ippeve_srv_t ipp_ref, /* DNS-SD IPP service */
+ ipps_ref, /* DNS-SD IPPS service */
+ http_ref, /* DNS-SD HTTP service */
+ printer_ref; /* DNS-SD LPD service */
+#elif defined(HAVE_AVAHI)
+ ippeve_srv_t dnssd_ref; /* DNS-SD services */
+#endif /* HAVE_DNSSD */
+ char *dnssd_subtypes;/* DNS-SD subtypes */
+ int dnssd_collision;/* Name collision? */
+ char *dnssd_name, /* printer-dns-sd-name */
*name, /* printer-name */
- *icon, /* Icon filename */
+ *icons[3], /* Icon filenames */
+ *strings, /* Strings filename */
*directory, /* Spool directory */
*hostname, /* Hostname */
- *uri, /* printer-uri-supported */
*device_uri, /* Device URI (if any) */
*output_format, /* Output format */
#if !CUPS_LITE
@@ -239,7 +252,10 @@ typedef struct ippeve_client_s /**** Client data ****/
http_state_t operation; /* Request operation */
ipp_op_t operation_id; /* IPP operation-id */
char uri[1024], /* Request URI */
- *options; /* URI options */
+ *options, /* URI options */
+ host_field[HTTP_MAX_VALUE];
+ /* Host: header */
+ int host_port; /* Port number from Host: header */
http_addr_t addr; /* Client address */
char hostname[256], /* Client hostname */
username[HTTP_MAX_VALUE];
@@ -264,7 +280,7 @@ static int create_job_file(ippeve_job_t *job, char *fname, size_t fnamesize, co
static int create_listener(const char *name, int port, int family);
static ipp_t *create_media_col(const char *media, const char *source, const char *type, int width, int length, int bottom, int left, int right, int top);
static ipp_t *create_media_size(int width, int length);
-static ippeve_printer_t *create_printer(const char *servername, int serverport, const char *name, const char *location, const char *icon, cups_array_t *docformats, const char *subtypes, const char *directory, const char *command, const char *device_uri, const char *output_format, ipp_t *attrs);
+static ippeve_printer_t *create_printer(const char *servername, int serverport, const char *name, const char *location, const char *icons, const char *strings, cups_array_t *docformats, const char *subtypes, const char *directory, const char *command, const char *device_uri, const char *output_format, ipp_t *attrs);
static void debug_attributes(const char *title, ipp_t *ipp, int response);
static void delete_client(ippeve_client_t *client);
static void delete_job(ippeve_job_t *job);
@@ -280,11 +296,14 @@ static int filter_cb(ippeve_filter_t *filter, ipp_t *dst, ipp_attribute_t *attr
static ippeve_job_t *find_job(ippeve_client_t *client);
static void finish_document_data(ippeve_client_t *client, ippeve_job_t *job);
static void finish_document_uri(ippeve_client_t *client, ippeve_job_t *job);
+static void flush_document_data(ippeve_client_t *client);
+static int have_document_data(ippeve_client_t *client);
static void html_escape(ippeve_client_t *client, const char *s, size_t slen);
static void html_footer(ippeve_client_t *client);
static void html_header(ippeve_client_t *client, const char *title, int refresh);
static void html_printf(ippeve_client_t *client, const char *format, ...) _CUPS_FORMAT(2, 3);
static void ipp_cancel_job(ippeve_client_t *client);
+static void ipp_cancel_my_jobs(ippeve_client_t *client);
static void ipp_close_job(ippeve_client_t *client);
static void ipp_create_job(ippeve_client_t *client);
static void ipp_get_job_attributes(ippeve_client_t *client);
@@ -311,7 +330,7 @@ static int process_http(ippeve_client_t *client);
static int process_ipp(ippeve_client_t *client);
static void *process_job(ippeve_job_t *job);
static void process_state_message(ippeve_job_t *job, char *message);
-static int register_printer(ippeve_printer_t *printer, const char *subtypes);
+static int register_printer(ippeve_printer_t *printer);
static int respond_http(ippeve_client_t *client, http_status_t code, const char *content_coding, const char *type, size_t length);
static void respond_ipp(ippeve_client_t *client, ipp_status_t status, const char *message, ...) _CUPS_FORMAT(3, 4);
static void respond_unsupported(ippeve_client_t *client, ipp_attribute_t *attr);
@@ -368,6 +387,7 @@ main(int argc, /* I - Number of command-line args */
#if !CUPS_LITE
*ppdfile = NULL, /* PPD file */
#endif /* !CUPS_LITE */
+ *strings = NULL, /* Strings file */
*subtypes = "_print"; /* DNS-SD service subtype */
int legacy = 0, /* Legacy mode? */
duplex = 0, /* Duplex mode */
@@ -475,6 +495,14 @@ main(int argc, /* I - Number of command-line args */
break;
#endif /* !CUPS_LITE */
+ case 'S' : /* -S filename.strings */
+ i ++;
+ if (i >= argc)
+ usage(1);
+
+ strings = argv[i];
+ break;
+
case 'V' : /* -V max-version */
i ++;
if (i >= argc)
@@ -621,27 +649,6 @@ main(int argc, /* I - Number of command-line args */
* Apply defaults as needed...
*/
- if (!serverport)
- {
-#ifdef _WIN32
- /*
- * Windows is almost always used as a single user system, so use a default
- * port number of 8631.
- */
-
- serverport = 8631;
-
-#else
- /*
- * Use 8000 + UID mod 1000 for the default port number...
- */
-
- serverport = 8000 + ((int)getuid() % 1000);
-#endif /* _WIN32 */
-
- _cupsLangPrintf(stderr, _("Listening on port %d."), serverport);
- }
-
if (!directory[0])
{
const char *tmpdir; /* Temporary directory */
@@ -699,7 +706,7 @@ main(int argc, /* I - Number of command-line args */
else
attrs = load_legacy_attributes(make, model, ppm, ppm_color, duplex, docformats);
- if ((printer = create_printer(servername, serverport, name, location, icon, docformats, subtypes, directory, command, device_uri, output_format, attrs)) == NULL)
+ if ((printer = create_printer(servername, serverport, name, location, icon, strings, docformats, subtypes, directory, command, device_uri, output_format, attrs)) == NULL)
return (1);
printer->web_forms = web_forms;
@@ -1177,7 +1184,11 @@ create_job(ippeve_client_t *client) /* I - Client */
job->id = client->printer->next_job_id ++;
- snprintf(uri, sizeof(uri), "%s/%d", client->printer->uri, job->id);
+ if ((attr = ippFindAttribute(client->request, "printer-uri", IPP_TAG_URI)) != NULL)
+ snprintf(uri, sizeof(uri), "%s/%d", ippGetString(attr, 0, NULL), job->id);
+ else
+ httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, client->printer->hostname, client->printer->port, "/ipp/print/%d", job->id);
+
httpAssembleUUID(client->printer->hostname, client->printer->port, client->printer->name, job->id, uuid, sizeof(uuid));
ippAddDate(job->attrs, IPP_TAG_JOB, "date-time-at-creation", ippTimeToDate(time(&job->created)));
@@ -1185,9 +1196,17 @@ create_job(ippeve_client_t *client) /* I - Client */
ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL, uri);
ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uuid", NULL, uuid);
if ((attr = ippFindAttribute(client->request, "printer-uri", IPP_TAG_URI)) != NULL)
+ {
ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, ippGetString(attr, 0, NULL));
+ }
else
- ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, client->printer->uri);
+ {
+ char printer_uri[1024]; /* job-printer-uri value */
+
+ httpAssembleURI(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), "ipp", NULL, client->printer->hostname, client->printer->port, "/ipp/print");
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, printer_uri);
+ }
+
ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", (int)(job->created - client->printer->start_time));
cupsArrayAdd(client->printer->jobs, job);
@@ -1385,9 +1404,10 @@ create_printer(
int serverport, /* I - Server port */
const char *name, /* I - printer-name */
const char *location, /* I - printer-location */
- const char *icon, /* I - printer-icons */
+ const char *icons, /* I - printer-icons */
+ const char *strings, /* I - printer-strings-uri */
cups_array_t *docformats, /* I - document-format-supported */
- const char *subtypes, /* I - Bonjour service subtype(s) */
+ const char *subtypes, /* I - DNS-SD service subtype(s) */
const char *directory, /* I - Spool directory */
const char *command, /* I - Command to run on job files, if any */
const char *device_uri, /* I - Output device, if any */
@@ -1399,15 +1419,10 @@ create_printer(
#ifndef _WIN32
char path[1024]; /* Full path to command */
#endif /* !_WIN32 */
- char uri[1024], /* Printer URI */
-#ifdef HAVE_SSL
- securi[1024], /* Secure printer URI */
- *uris[2], /* All URIs */
-#endif /* HAVE_SSL */
- icons[1024], /* printer-icons URI */
- adminurl[1024], /* printer-more-info URI */
- supplyurl[1024],/* printer-supply-info-uri URI */
- uuid[128]; /* printer-uuid */
+ unsigned char sha256[32]; /* SHA-256 digest/sum */
+ char uuid_data[1024],/* Data to hash for printer-uuid */
+ uuid[128], /* printer-uuid */
+ *iconsptr; /* Pointer into icons string */
int k_supported; /* Maximum file size supported */
int num_formats; /* Number of supported document formats */
const char *formats[100], /* Supported document formats */
@@ -1629,23 +1644,47 @@ create_printer(
return (NULL);
}
- printer->ipv4 = -1;
- printer->ipv6 = -1;
- printer->name = strdup(name);
- printer->dnssd_name = strdup(name);
- printer->command = command ? strdup(command) : NULL;
- printer->device_uri = device_uri ? strdup(device_uri) : NULL;
- printer->output_format = output_format ? strdup(output_format) : NULL;
- printer->directory = strdup(directory);
- printer->icon = icon ? strdup(icon) : NULL;
- printer->port = serverport;
- printer->start_time = time(NULL);
- printer->config_time = printer->start_time;
- printer->state = IPP_PSTATE_IDLE;
- printer->state_reasons = IPPEVE_PREASON_NONE;
- printer->state_time = printer->start_time;
- printer->jobs = cupsArrayNew((cups_array_func_t)compare_jobs, NULL);
- printer->next_job_id = 1;
+ printer->ipv4 = -1;
+ printer->ipv6 = -1;
+ printer->name = strdup(name);
+ printer->dnssd_name = strdup(name);
+ printer->dnssd_subtypes = subtypes ? strdup(subtypes) : NULL;
+ printer->command = command ? strdup(command) : NULL;
+ printer->device_uri = device_uri ? strdup(device_uri) : NULL;
+ printer->output_format = output_format ? strdup(output_format) : NULL;
+ printer->directory = strdup(directory);
+ printer->icons[0] = icons ? strdup(icons) : NULL;
+ printer->strings = strings ? strdup(strings) : NULL;
+ printer->port = serverport;
+ printer->start_time = time(NULL);
+ printer->config_time = printer->start_time;
+ printer->state = IPP_PSTATE_IDLE;
+ printer->state_reasons = IPPEVE_PREASON_NONE;
+ printer->state_time = printer->start_time;
+ printer->jobs = cupsArrayNew((cups_array_func_t)compare_jobs, NULL);
+ printer->next_job_id = 1;
+
+ if (printer->icons[0])
+ {
+ /*
+ * Extract up to 3 icons...
+ */
+
+ for (i = 1, iconsptr = strchr(icons, ','); iconsptr && i < 3; i ++, iconsptr = strchr(iconsptr, ','))
+ {
+ *iconsptr++ = '\0';
+ printer->icons[i] = iconsptr;
+ }
+
+ if (iconsptr)
+ *iconsptr = '\0'; /* Strip any icons after the third... */
+
+ while (i < 3)
+ {
+ printer->icons[i] = printer->icons[i - 1];
+ i ++;
+ }
+ }
if (servername)
{
@@ -1653,9 +1692,21 @@ create_printer(
}
else
{
- char temp[1024]; /* Temporary string */
+ char temp[1024], /* Temporary string */
+ *tempptr; /* Pointer into temporary string */
+
+#ifdef HAVE_AVAHI
+ const char *avahi_name = avahi_client_get_host_name_fqdn(DNSSDClient);
- printer->hostname = strdup(httpGetHostname(NULL, temp, sizeof(temp)));
+ if (avahi_name)
+ strlcpy(temp, avahi_name, sizeof(temp));
+ else
+#endif /* HAVE_AVAHI */
+
+ if ((tempptr = strstr(httpGetHostname(NULL, temp, sizeof(temp)), ".lan")) != NULL && !tempptr[5])
+ strlcpy(tempptr, ".local", sizeof(temp) - (size_t)(tempptr - temp));
+
+ printer->hostname = strdup(temp);
}
_cupsRWInit(&(printer->rwlock));
@@ -1664,10 +1715,50 @@ create_printer(
* Create the listener sockets...
*/
- if ((printer->ipv4 = create_listener(servername, printer->port, AF_INET)) < 0)
+ if (printer->port)
{
- perror("Unable to create IPv4 listener");
- goto bad_printer;
+ if ((printer->ipv4 = create_listener(servername, printer->port, AF_INET)) < 0)
+ {
+ perror("Unable to create IPv4 listener");
+ goto bad_printer;
+ }
+ }
+ else
+ {
+#ifdef _WIN32
+ /*
+ * Windows is almost always used as a single user system, so use a default
+ * port number of 8631.
+ */
+
+ serverport = 8631;
+
+#else
+ /*
+ * Use 8000 + UID mod 1000 for the default port number...
+ */
+
+ serverport = 8000 + ((int)getuid() % 1000);
+#endif /* _WIN32 */
+
+ while (serverport < 10000)
+ {
+ if ((printer->ipv4 = create_listener(servername, serverport, AF_INET)) >= 0)
+ break;
+
+ serverport ++;
+ }
+
+ if (serverport < 10000)
+ {
+ _cupsLangPrintf(stderr, _("Listening on port %d."), serverport);
+ printer->port = serverport;
+ }
+ else
+ {
+ perror("Unable to create IPv4 listener");
+ goto bad_printer;
+ }
}
if ((printer->ipv6 = create_listener(servername, printer->port, AF_INET6)) < 0)
@@ -1677,31 +1768,21 @@ create_printer(
}
/*
- * Prepare URI values for the printer attributes...
+ * Prepare values for the printer attributes...
*/
- httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, printer->hostname, printer->port, "/ipp/print");
- printer->uri = strdup(uri);
- printer->urilen = strlen(uri);
-
-#ifdef HAVE_SSL
- httpAssembleURI(HTTP_URI_CODING_ALL, securi, sizeof(securi), "ipps", NULL, printer->hostname, printer->port, "/ipp/print");
-#endif /* HAVE_SSL */
-
- httpAssembleURI(HTTP_URI_CODING_ALL, icons, sizeof(icons), WEB_SCHEME, NULL, printer->hostname, printer->port, "/icon.png");
- httpAssembleURI(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), WEB_SCHEME, NULL, printer->hostname, printer->port, "/");
- httpAssembleURI(HTTP_URI_CODING_ALL, supplyurl, sizeof(supplyurl), WEB_SCHEME, NULL, printer->hostname, printer->port, "/supplies");
- httpAssembleUUID(printer->hostname, serverport, name, 0, uuid, sizeof(uuid));
+ snprintf(uuid_data, sizeof(uuid_data), "_IPPEVEPRINTER_:%s:%d:%s", printer->hostname, printer->port, printer->name);
+ cupsHashData("sha2-256", (unsigned char *)uuid_data, strlen(uuid_data), sha256, sizeof(sha256));
+ snprintf(uuid, sizeof(uuid), "urn:uuid:%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", sha256[0], sha256[1], sha256[3], sha256[4], sha256[5], sha256[6], (sha256[10] & 15) | 0x30, sha256[11], (sha256[15] & 0x3f) | 0x40, sha256[16], sha256[20], sha256[21], sha256[25], sha256[26], sha256[30], sha256[31]);
if (Verbosity)
{
- fprintf(stderr, "printer-more-info=\"%s\"\n", adminurl);
- fprintf(stderr, "printer-supply-info-uri=\"%s\"\n", supplyurl);
#ifdef HAVE_SSL
- fprintf(stderr, "printer-uri=\"%s\",\"%s\"\n", uri, securi);
+ fprintf(stderr, "printer-uri-supported=\"ipp://%s:%d/ipp/print\",\"ipps://%s:%d/ipp/print\"\n", printer->hostname, printer->port, printer->hostname, printer->port);
#else
- fprintf(stderr, "printer-uri=\"%s\"\n", uri);
+ fprintf(stderr, "printer-uri-supported=\"ipp://%s:%d/ipp/print\"\n", printer->hostname, printer->port);
#endif /* HAVE_SSL */
+ fprintf(stderr, "printer-uuid=\"%s\"\n", uuid);
}
/*
@@ -1859,9 +1940,6 @@ create_printer(
/* printer-geo-location */
ippAddOutOfBand(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_UNKNOWN, "printer-geo-location");
- /* printer-icons */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-icons", NULL, icons);
-
/* printer-is-accepting-jobs */
ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1);
@@ -1871,9 +1949,6 @@ create_printer(
/* printer-location */
ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location", NULL, location);
- /* printer-more-info */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-more-info", NULL, adminurl);
-
/* printer-name */
ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name", NULL, name);
@@ -1883,19 +1958,8 @@ create_printer(
/* printer-organizational-unit */
ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-organizational-unit", NULL, "");
- /* printer-supply-info-uri */
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-supply-info-uri", NULL, supplyurl);
-
- /* printer-uri-supported */
-#ifdef HAVE_SSL
- uris[0] = uri;
- uris[1] = securi;
-
- ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", 2, NULL, (const char **)uris);
-
-#else
- ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", NULL, uri);
-#endif /* HAVE_SSL */
+ /* printer-strings-languages-supported */
+ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_LANGUAGE, "printer-strings-languages-supported", NULL, "en");
/* printer-uuid */
ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uuid", NULL, uuid);
@@ -1929,10 +1993,10 @@ create_printer(
debug_attributes("Printer", printer->attrs, 0);
/*
- * Register the printer with Bonjour...
+ * Register the printer with DNS-SD...
*/
- if (!register_printer(printer, subtypes))
+ if (!register_printer(printer))
goto bad_printer;
/*
@@ -2088,14 +2152,8 @@ delete_printer(ippeve_printer_t *printer) /* I - Printer */
#elif defined(HAVE_AVAHI)
avahi_threaded_poll_lock(DNSSDMaster);
- if (printer->printer_ref)
- avahi_entry_group_free(printer->printer_ref);
- if (printer->ipp_ref)
- avahi_entry_group_free(printer->ipp_ref);
- if (printer->ipps_ref)
- avahi_entry_group_free(printer->ipps_ref);
- if (printer->http_ref)
- avahi_entry_group_free(printer->http_ref);
+ if (printer->dnssd_ref)
+ avahi_entry_group_free(printer->dnssd_ref);
avahi_threaded_poll_unlock(DNSSDMaster);
#endif /* HAVE_DNSSD */
@@ -2104,8 +2162,10 @@ delete_printer(ippeve_printer_t *printer) /* I - Printer */
free(printer->dnssd_name);
if (printer->name)
free(printer->name);
- if (printer->icon)
- free(printer->icon);
+ if (printer->icons[0])
+ free(printer->icons[0]);
+ if (printer->strings)
+ free(printer->strings);
if (printer->command)
free(printer->command);
if (printer->device_uri)
@@ -2118,8 +2178,6 @@ delete_printer(ippeve_printer_t *printer) /* I - Printer */
free(printer->directory);
if (printer->hostname)
free(printer->hostname);
- if (printer->uri)
- free(printer->uri);
ippDelete(printer->attrs);
cupsArrayDelete(printer->jobs);
@@ -2130,7 +2188,7 @@ delete_printer(ippeve_printer_t *printer) /* I - Printer */
#ifdef HAVE_DNSSD
/*
- * 'dnssd_callback()' - Handle Bonjour registration events.
+ * 'dnssd_callback()' - Handle DNS-SD registration events.
*/
static void DNSSD_API
@@ -2141,32 +2199,29 @@ dnssd_callback(
const char *name, /* I - Service name */
const char *regtype, /* I - Service type */
const char *domain, /* I - Domain for service */
- ippeve_printer_t *printer) /* I - Printer */
+ ippeve_printer_t *printer) /* I - Printer */
{
(void)sdRef;
(void)flags;
(void)domain;
+ (void)name;
- if (errorCode)
+ if (errorCode == kDNSServiceErr_NameConflict)
{
- fprintf(stderr, "DNSServiceRegister for %s failed with error %d.\n", regtype, (int)errorCode);
- return;
+ fputs("DNS-SD service name collision detected.\n", stderr);
+ printer->dnssd_collision = 1;
}
- else if (strcasecmp(name, printer->dnssd_name))
+ else if (errorCode)
{
- if (Verbosity)
- fprintf(stderr, "Now using DNS-SD service name \"%s\".\n", name);
-
- /* No lock needed since only the main thread accesses/changes this */
- free(printer->dnssd_name);
- printer->dnssd_name = strdup(name);
+ fprintf(stderr, "DNSServiceRegister for %s failed with error %d.\n", regtype, (int)errorCode);
+ return;
}
}
#elif defined(HAVE_AVAHI)
/*
- * 'dnssd_callback()' - Handle Bonjour registration events.
+ * 'dnssd_callback()' - Handle DNS-SD registration events.
*/
static void
@@ -2175,9 +2230,17 @@ dnssd_callback(
AvahiEntryGroupState state, /* I - Registration state */
void *context) /* I - Printer */
{
+ ippeve_printer_t *printer = (ippeve_printer_t *)context;
+ /* Printer */
+
+
(void)srv;
- (void)state;
- (void)context;
+
+ if (state == AVAHI_ENTRY_GROUP_COLLISION)
+ {
+ fputs("DNS-SD service name collision detected.\n", stderr);
+ printer->dnssd_collision = 1;
+ }
}
@@ -2191,10 +2254,8 @@ static void
dnssd_client_cb(
AvahiClient *c, /* I - Client */
AvahiClientState state, /* I - Current state */
- void *userdata) /* I - User data (unused) */
+ void *userdata) /* I - User data (printer) */
{
- (void)userdata;
-
if (!c)
return;
@@ -2226,7 +2287,7 @@ dnssd_init(void)
#ifdef HAVE_DNSSD
if (DNSServiceCreateConnection(&DNSSDMaster) != kDNSServiceErr_NoError)
{
- fputs("Error: Unable to initialize Bonjour.\n", stderr);
+ fputs("Error: Unable to initialize DNS-SD.\n", stderr);
exit(1);
}
@@ -2235,13 +2296,13 @@ dnssd_init(void)
if ((DNSSDMaster = avahi_threaded_poll_new()) == NULL)
{
- fputs("Error: Unable to initialize Bonjour.\n", stderr);
+ fputs("Error: Unable to initialize DNS-SD.\n", stderr);
exit(1);
}
if ((DNSSDClient = avahi_client_new(avahi_threaded_poll_get(DNSSDMaster), AVAHI_CLIENT_NO_FAIL, dnssd_client_cb, NULL, &error)) == NULL)
{
- fputs("Error: Unable to initialize Bonjour.\n", stderr);
+ fputs("Error: Unable to initialize DNS-SD.\n", stderr);
exit(1);
}
@@ -2292,10 +2353,12 @@ find_job(ippeve_client_t *client) /* I - Client */
if ((attr = ippFindAttribute(client->request, "job-uri", IPP_TAG_URI)) != NULL)
{
const char *uri = ippGetString(attr, 0, NULL);
+ /* URI value */
+ const char *uriptr = strrchr(uri, '/');
+ /* Pointer to the last slash in the URI */
- if (!strncmp(uri, client->printer->uri, client->printer->urilen) &&
- uri[client->printer->urilen] == '/')
- key.id = atoi(uri + client->printer->urilen + 1);
+ if (uriptr && isdigit(uriptr[1] & 255))
+ key.id = atoi(uriptr + 1);
else
return (NULL);
}
@@ -2476,8 +2539,9 @@ finish_document_uri(
* Do we have a file to print?
*/
- if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
+ if (have_document_data(client))
{
+ flush_document_data(client);
respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Unexpected document data following request.");
goto abort_job;
@@ -2728,6 +2792,42 @@ finish_document_uri(
/*
+ * 'flush_document_data()' - Safely flush remaining document data.
+ */
+
+static void
+flush_document_data(
+ ippeve_client_t *client) /* I - Client */
+{
+ char buffer[8192]; /* Read buffer */
+
+
+ if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
+ {
+ while (httpRead2(client->http, buffer, sizeof(buffer)) > 0);
+ }
+}
+
+
+/*
+ * 'have_document_data()' - Determine whether we have more document data.
+ */
+
+static int /* O - 1 if data is present, 0 otherwise */
+have_document_data(
+ ippeve_client_t *client) /* I - Client */
+{
+ char temp; /* Data */
+
+
+ if (httpGetState(client->http) != HTTP_STATE_POST_RECV)
+ return (0);
+ else
+ return (httpPeek(client->http, &temp, 1) > 0);
+}
+
+
+/*
* 'html_escape()' - Write a HTML-safe string.
*/
@@ -2989,7 +3089,7 @@ html_printf(ippeve_client_t *client, /* I - Client */
if ((size_t)(width + 2) > sizeof(temp))
break;
- sprintf(temp, tformat, va_arg(ap, double));
+ snprintf(temp, sizeof(temp), tformat, va_arg(ap, double));
httpWrite2(client->http, temp, strlen(temp));
break;
@@ -3007,13 +3107,13 @@ html_printf(ippeve_client_t *client, /* I - Client */
# ifdef HAVE_LONG_LONG
if (size == 'L')
- sprintf(temp, tformat, va_arg(ap, long long));
+ snprintf(temp, sizeof(temp), tformat, va_arg(ap, long long));
else
# endif /* HAVE_LONG_LONG */
if (size == 'l')
- sprintf(temp, tformat, va_arg(ap, long));
+ snprintf(temp, sizeof(temp), tformat, va_arg(ap, long));
else
- sprintf(temp, tformat, va_arg(ap, int));
+ snprintf(temp, sizeof(temp), tformat, va_arg(ap, int));
httpWrite2(client->http, temp, strlen(temp));
break;
@@ -3022,7 +3122,7 @@ html_printf(ippeve_client_t *client, /* I - Client */
if ((size_t)(width + 2) > sizeof(temp))
break;
- sprintf(temp, tformat, va_arg(ap, void *));
+ snprintf(temp, sizeof(temp), tformat, va_arg(ap, void *));
httpWrite2(client->http, temp, strlen(temp));
break;
@@ -3124,6 +3224,53 @@ ipp_cancel_job(ippeve_client_t *client) /* I - Client */
/*
+ * 'ipp_cancel_my_jobs()' - Cancel all jobs.
+ *
+ * Note: Since ippeveprinter doesn't do spooling, this really just cancels the
+ * current job.
+ */
+
+static void
+ipp_cancel_my_jobs(
+ ippeve_client_t *client) /* I - Client */
+{
+ ippeve_job_t *job; /* Job information */
+
+
+ _cupsRWLockWrite(&client->printer->rwlock);
+
+ if ((job = client->printer->active_job) != NULL)
+ {
+ /*
+ * See if the job is already completed, canceled, or aborted; if so,
+ * we can't cancel...
+ */
+
+ if (job->state < IPP_JSTATE_CANCELED)
+ {
+ /*
+ * Cancel the job...
+ */
+
+ if (job->state == IPP_JSTATE_PROCESSING || (job->state == IPP_JSTATE_HELD && job->fd >= 0))
+ {
+ job->cancel = 1;
+ }
+ else
+ {
+ job->state = IPP_JSTATE_CANCELED;
+ job->completed = time(NULL);
+ }
+ }
+ }
+
+ respond_ipp(client, IPP_STATUS_OK, NULL);
+
+ _cupsRWUnlock(&client->printer->rwlock);
+}
+
+
+/*
* 'ipp_close_job()' - Close an open job.
*/
@@ -3190,25 +3337,23 @@ ipp_create_job(ippeve_client_t *client) /* I - Client */
/*
- * Validate print job attributes...
+ * Do we have a file to print?
*/
- if (!valid_job_attributes(client))
+ if (have_document_data(client))
{
- httpFlush(client->http);
+ flush_document_data(client);
+ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+ "Unexpected document data following request.");
return;
}
/*
- * Do we have a file to print?
+ * Validate print job attributes...
*/
- if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
- {
- respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
- "Unexpected document data following request.");
+ if (!valid_job_attributes(client))
return;
- }
/*
* Create the job...
@@ -3477,6 +3622,29 @@ ipp_get_printer_attributes(
if (!ra || cupsArrayFind(ra, "printer-current-time"))
ippAddDate(client->response, IPP_TAG_PRINTER, "printer-current-time", ippTimeToDate(time(NULL)));
+ if (!ra || cupsArrayFind(ra, "printer-icons"))
+ {
+ char uris[3][1024]; /* Buffers for URIs */
+ const char *values[3]; /* Values for attribute */
+
+ httpAssembleURI(HTTP_URI_CODING_ALL, uris[0], sizeof(uris[0]), WEB_SCHEME, NULL, client->host_field, client->host_port, "/icon-sm.png");
+ httpAssembleURI(HTTP_URI_CODING_ALL, uris[1], sizeof(uris[1]), WEB_SCHEME, NULL, client->host_field, client->host_port, "/icon.png");
+ httpAssembleURI(HTTP_URI_CODING_ALL, uris[2], sizeof(uris[2]), WEB_SCHEME, NULL, client->host_field, client->host_port, "/icon-lg.png");
+
+ values[0] = uris[0];
+ values[1] = uris[1];
+ values[2] = uris[2];
+
+ ippAddStrings(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-icons", 3, NULL, values);
+ }
+
+ if (!ra || cupsArrayFind(ra, "printer-more-info"))
+ {
+ char uri[1024]; /* URI value */
+
+ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), WEB_SCHEME, NULL, client->host_field, client->host_port, "/");
+ ippAddString(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-more-info", NULL, uri);
+ }
if (!ra || cupsArrayFind(ra, "printer-state"))
ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", (int)printer->state);
@@ -3521,9 +3689,42 @@ ipp_get_printer_attributes(
}
}
+ if (!ra || cupsArrayFind(ra, "printer-strings-uri"))
+ {
+ char uri[1024]; /* URI value */
+
+ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), WEB_SCHEME, NULL, client->host_field, client->host_port, "/en.strings");
+ ippAddString(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-strings-uri", NULL, uri);
+ }
+
+ if (!ra || cupsArrayFind(ra, "printer-supply-info-uri"))
+ {
+ char uri[1024]; /* URI value */
+
+ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), WEB_SCHEME, NULL, client->host_field, client->host_port, "/supplies");
+ ippAddString(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-supply-info-uri", NULL, uri);
+ }
+
if (!ra || cupsArrayFind(ra, "printer-up-time"))
ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-up-time", (int)(time(NULL) - printer->start_time));
+ if (!ra || cupsArrayFind(ra, "printer-uri-supported"))
+ {
+ char uris[2][1024]; /* Buffers for URIs */
+ const char *values[2]; /* Values for attribute */
+ int num_values = 0; /* Number of values */
+
+ httpAssembleURI(HTTP_URI_CODING_ALL, uris[0], sizeof(uris[0]), "ipp", NULL, client->host_field, client->host_port, "/ipp/print");
+ values[num_values ++] = uris[0];
+
+#ifdef HAVE_SSL
+ httpAssembleURI(HTTP_URI_CODING_ALL, uris[1], sizeof(uris[1]), "ipps", NULL, client->host_field, client->host_port, "/ipp/print");
+ values[num_values ++] = uris[1];
+#endif /* HAVE_SSL */
+
+ ippAddStrings(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", num_values, NULL, values);
+ }
+
if (!ra || cupsArrayFind(ra, "queued-job-count"))
ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "queued-job-count", printer->active_job && printer->active_job->state < IPP_JSTATE_CANCELED);
@@ -3550,8 +3751,21 @@ ipp_identify_printer(
if (!actions || ippContainsString(actions, "sound"))
{
+#ifdef __APPLE__
+ pid_t pid; /* Process ID for "afplay" utility */
+ static const char * const afplay[3] =
+ { /* Arguments for "afplay" utility */
+ "/usr/bin/afplay",
+ "/System/Library/Sounds/Ping.aiff",
+ NULL
+ };
+
+ posix_spawn(&pid, afplay[0], NULL, NULL, (char **)afplay, NULL);
+
+#else
putchar(0x07);
fflush(stdout);
+#endif /* __APPLE__ */
}
if (ippContainsString(actions, "display"))
@@ -3577,7 +3791,7 @@ ipp_print_job(ippeve_client_t *client) /* I - Client */
if (!valid_job_attributes(client))
{
- httpFlush(client->http);
+ flush_document_data(client);
return;
}
@@ -3585,7 +3799,7 @@ ipp_print_job(ippeve_client_t *client) /* I - Client */
* Do we have a file to print?
*/
- if (httpGetState(client->http) == HTTP_STATE_POST_SEND)
+ if (!have_document_data(client))
{
respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "No file in request.");
return;
@@ -3625,7 +3839,7 @@ ipp_print_uri(ippeve_client_t *client) /* I - Client */
if (!valid_job_attributes(client))
{
- httpFlush(client->http);
+ flush_document_data(client);
return;
}
@@ -3658,6 +3872,7 @@ ipp_send_document(
{
ippeve_job_t *job; /* Job information */
ipp_attribute_t *attr; /* Current attribute */
+ int have_data; /* Have document data? */
/*
@@ -3666,26 +3881,28 @@ ipp_send_document(
if ((job = find_job(client)) == NULL)
{
+ flush_document_data(client);
respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
- httpFlush(client->http);
return;
}
/*
* See if we already have a document for this job or the job has already
- * in a non-pending state...
+ * in a terminating state...
*/
- if (job->state > IPP_JSTATE_HELD)
+ have_data = have_document_data(client);
+
+ if ((job->filename || job->fd >= 0) && have_data)
{
- respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job is not in a pending state.");
- httpFlush(client->http);
+ flush_document_data(client);
+ respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported.");
return;
}
- else if (job->filename || job->fd >= 0)
+ else if (job->state > IPP_JSTATE_HELD && have_data)
{
- respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported.");
- httpFlush(client->http);
+ flush_document_data(client);
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job is not in a pending state.");
return;
}
@@ -3695,20 +3912,20 @@ ipp_send_document(
if ((attr = ippFindAttribute(client->request, "last-document", IPP_TAG_ZERO)) == NULL)
{
+ flush_document_data(client);
respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing required last-document attribute.");
- httpFlush(client->http);
return;
}
else if (ippGetGroupTag(attr) != IPP_TAG_OPERATION)
{
+ flush_document_data(client);
respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "The last-document attribute is not in the operation group.");
- httpFlush(client->http);
return;
}
- else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1 || !ippGetBoolean(attr, 0))
+ else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1)
{
+ flush_document_data(client);
respond_unsupported(client, attr);
- httpFlush(client->http);
return;
}
@@ -3716,12 +3933,15 @@ ipp_send_document(
* Validate document attributes...
*/
- if (!valid_doc_attributes(client))
+ if (have_data && !valid_doc_attributes(client))
{
- httpFlush(client->http);
+ flush_document_data(client);
return;
}
+ if (!have_data && !job->filename)
+ job->state = IPP_JSTATE_ABORTED;
+
/*
* Then finish getting the document data and process things...
*/
@@ -3739,7 +3959,8 @@ ipp_send_document(
_cupsRWUnlock(&(client->printer->rwlock));
- finish_document_data(client, job);
+ if (have_data)
+ finish_document_data(client, job);
}
@@ -3762,44 +3983,39 @@ ipp_send_uri(ippeve_client_t *client) /* I - Client */
if ((job = find_job(client)) == NULL)
{
respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
- httpFlush(client->http);
return;
}
/*
* See if we already have a document for this job or the job has already
- * in a non-pending state...
+ * in a non-terminating state...
*/
- if (job->state > IPP_JSTATE_HELD)
+ if (job->filename || job->fd >= 0)
{
- respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job is not in a pending state.");
- httpFlush(client->http);
+ respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported.");
return;
}
- else if (job->filename || job->fd >= 0)
+ else if (job->state > IPP_JSTATE_HELD)
{
- respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported.");
- httpFlush(client->http);
+ flush_document_data(client);
+ respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job is not in a pending state.");
return;
}
if ((attr = ippFindAttribute(client->request, "last-document", IPP_TAG_ZERO)) == NULL)
{
respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing required last-document attribute.");
- httpFlush(client->http);
return;
}
else if (ippGetGroupTag(attr) != IPP_TAG_OPERATION)
{
respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "The last-document attribute is not in the operation group.");
- httpFlush(client->http);
return;
}
- else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1 || !ippGetBoolean(attr, 0))
+ else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1)
{
respond_unsupported(client, attr);
- httpFlush(client->http);
return;
}
@@ -3809,7 +4025,7 @@ ipp_send_uri(ippeve_client_t *client) /* I - Client */
if (!valid_doc_attributes(client))
{
- httpFlush(client->http);
+ flush_document_data(client);
return;
}
@@ -4105,7 +4321,7 @@ load_legacy_attributes(
"oe_photo-l_3.5x5in", /* Photo L */
"na_index-4x6_4x6in", /* Photo 4x6 */
"iso_a6_105x148mm", /* A6 */
- "na_5x7_5x7in" /* Photo 5x7 aka 2L */
+ "na_5x7_5x7in", /* Photo 5x7 aka 2L */
"iso_a5_148x210mm", /* A5 */
};
static const char * const media_ready[] =
@@ -4359,9 +4575,36 @@ load_legacy_attributes(
if (cupsArrayFind(docformats, (void *)"application/pdf"))
ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "document-password-supported", 1023);
+ /* finishing-template-supported */
+ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template-supported", NULL, "none");
+
+ /* finishings-col-database */
+ col = ippNew();
+ ippAddString(col, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template", NULL, "none");
+ ippAddCollection(attrs, IPP_TAG_PRINTER, "finishings-col-database", col);
+ ippDelete(col);
+
+ /* finishings-col-default */
+ col = ippNew();
+ ippAddString(col, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template", NULL, "none");
+ ippAddCollection(attrs, IPP_TAG_PRINTER, "finishings-col-default", col);
+ ippDelete(col);
+
+ /* finishings-col-ready */
+ col = ippNew();
+ ippAddString(col, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template", NULL, "none");
+ ippAddCollection(attrs, IPP_TAG_PRINTER, "finishings-col-ready", col);
+ ippDelete(col);
+
+ /* finishings-col-supported */
+ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishings-col-supported", NULL, "finishing-template");
+
/* finishings-default */
ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-default", IPP_FINISHINGS_NONE);
+ /* finishings-ready */
+ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-ready", IPP_FINISHINGS_NONE);
+
/* finishings-supported */
ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-supported", IPP_FINISHINGS_NONE);
@@ -5000,7 +5243,7 @@ load_ppd_attributes(
}
/* finishings-col-supported */
- ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishings-col-supported", NULL, "finishing-template");
+ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishings-col-supported", NULL, "finishing-template");
/* finishings-default */
ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-default", IPP_FINISHINGS_NONE);
@@ -5623,8 +5866,9 @@ process_http(ippeve_client_t *client) /* I - Client connection */
ipp_state_t ipp_state; /* State of IPP transfer */
char scheme[32], /* Method/scheme */
userpass[128], /* Username:password */
- hostname[HTTP_MAX_HOST];
+ hostname[HTTP_MAX_HOST],
/* Hostname */
+ *ptr; /* Pointer into value */
int port; /* Port number */
static const char * const http_states[] =
{ /* Strings for logging HTTP method */
@@ -5733,6 +5977,10 @@ process_http(ippeve_client_t *client) /* I - Client connection */
return (0);
}
+ /*
+ * Validate the host header...
+ */
+
if (!httpGetField(client->http, HTTP_FIELD_HOST)[0] &&
httpGetVersion(client->http) >= HTTP_VERSION_1_1)
{
@@ -5740,6 +5988,36 @@ process_http(ippeve_client_t *client) /* I - Client connection */
* HTTP/1.1 and higher require the "Host:" field...
*/
+ fprintf(stderr, "%s Missing Host: header.\n", client->hostname);
+ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
+ return (0);
+ }
+
+ strlcpy(client->host_field, httpGetField(client->http, HTTP_FIELD_HOST), sizeof(client->host_field));
+ if ((ptr = strrchr(client->host_field, ':')) != NULL)
+ {
+ /*
+ * Grab port number from Host: header...
+ */
+
+ *ptr++ = '\0';
+ client->host_port = atoi(ptr);
+ }
+ else
+ {
+ /*
+ * Use the default port number...
+ */
+
+ client->host_port = client->printer->port;
+ }
+
+ ptr = strrchr(client->host_field, '.');
+
+ if (!isdigit(client->host_field[0] & 255) && client->host_field[0] != '[' && strcmp(client->host_field, client->printer->hostname) && strcmp(client->host_field, "localhost") &&
+ (!ptr || (strcmp(ptr, ".local") && strcmp(ptr, ".local."))))
+ {
+ fprintf(stderr, "%s Bad Host: header '%s'.\n", client->hostname, client->host_field);
respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
return (0);
}
@@ -5787,7 +6065,9 @@ process_http(ippeve_client_t *client) /* I - Client connection */
return (respond_http(client, HTTP_STATUS_OK, NULL, NULL, 0));
case HTTP_STATE_HEAD :
- if (!strcmp(client->uri, "/icon.png"))
+ if (!strcmp(client->uri, "/en.strings"))
+ return (respond_http(client, HTTP_STATUS_OK, NULL, "text/strings", 0));
+ else if (!strcmp(client->uri, "/icon.png") || !strcmp(client->uri, "/icon-lg.png") || !strcmp(client->uri, "/icon-sm.png"))
return (respond_http(client, HTTP_STATUS_OK, NULL, "image/png", 0));
else if (!strcmp(client->uri, "/") || !strcmp(client->uri, "/media") || !strcmp(client->uri, "/supplies"))
return (respond_http(client, HTTP_STATUS_OK, NULL, "text/html", 0));
@@ -5795,22 +6075,54 @@ process_http(ippeve_client_t *client) /* I - Client connection */
return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
case HTTP_STATE_GET :
- if (!strcmp(client->uri, "/icon.png"))
+ if (!strcmp(client->uri, "/en.strings"))
{
/*
- * Send PNG icon file.
+ * Send strings file.
*/
- if (client->printer->icon)
+ if (client->printer->strings)
{
int fd; /* Icon file */
struct stat fileinfo; /* Icon file information */
char buffer[4096]; /* Copy buffer */
ssize_t bytes; /* Bytes */
- fprintf(stderr, "Icon file is \"%s\".\n", client->printer->icon);
+ if (!stat(client->printer->strings, &fileinfo) && (fd = open(client->printer->strings, O_RDONLY)) >= 0)
+ {
+ if (!respond_http(client, HTTP_STATUS_OK, NULL, "text/strings", (size_t)fileinfo.st_size))
+ {
+ close(fd);
+ return (0);
+ }
+
+ while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
+ httpWrite2(client->http, buffer, (size_t)bytes);
- if (!stat(client->printer->icon, &fileinfo) && (fd = open(client->printer->icon, O_RDONLY)) >= 0)
+ httpFlushWrite(client->http);
+
+ close(fd);
+ }
+ else
+ return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
+ }
+ else
+ return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
+ }
+ else if (!strcmp(client->uri, "/icon.png"))
+ {
+ /*
+ * Send medium PNG icon file.
+ */
+
+ if (client->printer->icons[1])
+ {
+ int fd; /* Icon file */
+ struct stat fileinfo; /* Icon file information */
+ char buffer[4096]; /* Copy buffer */
+ ssize_t bytes; /* Bytes */
+
+ if (!stat(client->printer->icons[1], &fileinfo) && (fd = open(client->printer->icons[1], O_RDONLY)) >= 0)
{
if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size))
{
@@ -5839,6 +6151,90 @@ process_http(ippeve_client_t *client) /* I - Client connection */
httpFlushWrite(client->http);
}
}
+ else if (!strcmp(client->uri, "/icon-lg.png"))
+ {
+ /*
+ * Send large PNG icon file.
+ */
+
+ if (client->printer->icons[2])
+ {
+ int fd; /* Icon file */
+ struct stat fileinfo; /* Icon file information */
+ char buffer[4096]; /* Copy buffer */
+ ssize_t bytes; /* Bytes */
+
+ if (!stat(client->printer->icons[2], &fileinfo) && (fd = open(client->printer->icons[2], O_RDONLY)) >= 0)
+ {
+ if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size))
+ {
+ close(fd);
+ return (0);
+ }
+
+ while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
+ httpWrite2(client->http, buffer, (size_t)bytes);
+
+ httpFlushWrite(client->http);
+
+ close(fd);
+ }
+ else
+ return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
+ }
+ else
+ {
+ fputs("Icon file is internal printer-lg.png.\n", stderr);
+
+ if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", sizeof(printer_lg_png)))
+ return (0);
+
+ httpWrite2(client->http, (const char *)printer_lg_png, sizeof(printer_lg_png));
+ httpFlushWrite(client->http);
+ }
+ }
+ else if (!strcmp(client->uri, "/icon-sm.png"))
+ {
+ /*
+ * Send small PNG icon file.
+ */
+
+ if (client->printer->icons[0])
+ {
+ int fd; /* Icon file */
+ struct stat fileinfo; /* Icon file information */
+ char buffer[4096]; /* Copy buffer */
+ ssize_t bytes; /* Bytes */
+
+ if (!stat(client->printer->icons[0], &fileinfo) && (fd = open(client->printer->icons[0], O_RDONLY)) >= 0)
+ {
+ if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size))
+ {
+ close(fd);
+ return (0);
+ }
+
+ while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
+ httpWrite2(client->http, buffer, (size_t)bytes);
+
+ httpFlushWrite(client->http);
+
+ close(fd);
+ }
+ else
+ return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
+ }
+ else
+ {
+ fputs("Icon file is internal printer-sm.png.\n", stderr);
+
+ if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", sizeof(printer_sm_png)))
+ return (0);
+
+ httpWrite2(client->http, (const char *)printer_sm_png, sizeof(printer_sm_png));
+ httpFlushWrite(client->http);
+ }
+ }
else
{
/*
@@ -6083,12 +6479,13 @@ process_ipp(ippeve_client_t *client) /* I - Client */
else if ((!strcmp(name, "job-uri") &&
strncmp(resource, "/ipp/print/", 11)) ||
(!strcmp(name, "printer-uri") &&
- strcmp(resource, "/ipp/print")))
+ strcmp(resource, "/ipp/print") &&
+ (strcmp(resource, "/") || ippGetOperation(client->request) != IPP_OP_GET_PRINTER_ATTRIBUTES)))
respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "%s %s not found.",
name, ippGetString(uri, 0, NULL));
else if (client->operation_id != IPP_OP_GET_PRINTER_ATTRIBUTES && (status = authenticate_request(client)) != HTTP_STATUS_CONTINUE)
{
- httpFlush(client->http);
+ flush_document_data(client);
return (respond_http(client, status, NULL, NULL, 0));
}
@@ -6118,7 +6515,7 @@ process_ipp(ippeve_client_t *client) /* I - Client */
if (!respond_http(client, HTTP_STATUS_EXPECTATION_FAILED, NULL, NULL, 0))
return (0);
- httpFlush(client->http);
+ flush_document_data(client);
return (1);
}
}
@@ -6157,6 +6554,10 @@ process_ipp(ippeve_client_t *client) /* I - Client */
ipp_cancel_job(client);
break;
+ case IPP_OP_CANCEL_MY_JOBS :
+ ipp_cancel_my_jobs(client);
+ break;
+
case IPP_OP_GET_JOB_ATTRIBUTES :
ipp_get_job_attributes(client);
break;
@@ -6745,44 +7146,44 @@ process_state_message(
/*
- * 'register_printer()' - Register a printer object via Bonjour.
+ * 'register_printer()' - Register a printer object via DNS-SD.
*/
static int /* O - 1 on success, 0 on error */
register_printer(
- ippeve_printer_t *printer, /* I - Printer */
- const char *subtypes) /* I - Service subtype(s) */
+ ippeve_printer_t *printer) /* I - Printer */
{
#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- ippeve_txt_t ipp_txt; /* Bonjour IPP TXT record */
+ ippeve_txt_t ipp_txt; /* DNS-SD IPP TXT record */
int i, /* Looping var */
count; /* Number of values */
ipp_attribute_t *color_supported,
*document_format_supported,
*printer_location,
*printer_make_and_model,
- *printer_more_info,
*printer_uuid,
*sides_supported,
*urf_supported; /* Printer attributes */
const char *value; /* Value string */
- char formats[252], /* List of supported formats */
+ char adminurl[247], /* adminurl value */
+ formats[252], /* List of supported formats */
urf[252], /* List of supported URF values */
*ptr; /* Pointer into string */
- if (!strcmp(subtypes, "off"))
+ if (printer->dnssd_subtypes && !strcmp(printer->dnssd_subtypes, "off"))
return (1);
color_supported = ippFindAttribute(printer->attrs, "color-supported", IPP_TAG_BOOLEAN);
document_format_supported = ippFindAttribute(printer->attrs, "document-format-supported", IPP_TAG_MIMETYPE);
printer_location = ippFindAttribute(printer->attrs, "printer-location", IPP_TAG_TEXT);
printer_make_and_model = ippFindAttribute(printer->attrs, "printer-make-and-model", IPP_TAG_TEXT);
- printer_more_info = ippFindAttribute(printer->attrs, "printer-more-info", IPP_TAG_URI);
printer_uuid = ippFindAttribute(printer->attrs, "printer-uuid", IPP_TAG_URI);
sides_supported = ippFindAttribute(printer->attrs, "sides-supported", IPP_TAG_KEYWORD);
urf_supported = ippFindAttribute(printer->attrs, "urf-supported", IPP_TAG_KEYWORD);
+ httpAssembleURI(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), WEB_SCHEME, NULL, printer->hostname, printer->port, "/");
+
for (i = 0, count = ippGetCount(document_format_supported), ptr = formats; i < count; i ++)
{
value = ippGetString(document_format_supported, i, NULL);
@@ -6815,11 +7216,35 @@ register_printer(
break;
}
-#endif /* HAVE_DNSSD || HAVE_AVAHI */
+ /*
+ * Rename the service as needed...
+ */
+
+ if (printer->dnssd_collision)
+ {
+ char new_dnssd_name[256]; /* New DNS-SD name */
+ const char *uuid = ippGetString(printer_uuid, 0, NULL);
+ /* "printer-uuid" value */
+
+ _cupsRWLockWrite(&printer->rwlock);
+
+ snprintf(new_dnssd_name, sizeof(new_dnssd_name), "%s (%c%c%c%c%c%c)", printer->dnssd_name, toupper(uuid[39]), toupper(uuid[40]), toupper(uuid[41]), toupper(uuid[42]), toupper(uuid[43]), toupper(uuid[44]));
+
+ free(printer->dnssd_name);
+ printer->dnssd_name = strdup(new_dnssd_name);
+
+ fprintf(stderr, "DNS-SD name collision, trying new DNS-SD service name '%s'.\n", printer->dnssd_name);
+
+ _cupsRWUnlock(&printer->rwlock);
+
+ printer->dnssd_collision = 0;
+ }
+#endif /* HAVE_DNSSD || HAVE_AVAHI */
+
#ifdef HAVE_DNSSD
- DNSServiceErrorType error; /* Error from Bonjour */
- char regtype[256]; /* Bonjour service type */
- uint32_t interface; /* Interface index */
+ DNSServiceErrorType error; /* Error from DNS-SD */
+ char regtype[256]; /* DNS-SD service type */
+ uint32_t ifindex; /* Interface index */
/*
@@ -6830,8 +7255,7 @@ register_printer(
TXTRecordSetValue(&ipp_txt, "rp", 9, "ipp/print");
if ((value = ippGetString(printer_make_and_model, 0, NULL)) != NULL)
TXTRecordSetValue(&ipp_txt, "ty", (uint8_t)strlen(value), value);
- if ((value = ippGetString(printer_more_info, 0, NULL)) != NULL)
- TXTRecordSetValue(&ipp_txt, "adminurl", (uint8_t)strlen(value), value);
+ TXTRecordSetValue(&ipp_txt, "adminurl", (uint8_t)strlen(adminurl), adminurl);
if ((value = ippGetString(printer_location, 0, NULL)) != NULL)
TXTRecordSetValue(&ipp_txt, "note", (uint8_t)strlen(value), value);
TXTRecordSetValue(&ipp_txt, "pdl", (uint8_t)strlen(formats), formats);
@@ -6852,11 +7276,14 @@ register_printer(
* defend our service name but not actually support LPD...
*/
- interface = !strcmp(printer->hostname, "localhost") ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny;
+ ifindex = !strcmp(printer->hostname, "localhost") ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny;
+
+ if (printer->printer_ref)
+ DNSServiceRefDeallocate(printer->printer_ref);
printer->printer_ref = DNSSDMaster;
- if ((error = DNSServiceRegister(&(printer->printer_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, "_printer._tcp", NULL /* domain */, NULL /* host */, 0 /* port */, 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
+ if ((error = DNSServiceRegister(&(printer->printer_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, "_printer._tcp", NULL /* domain */, NULL /* host */, 0 /* port */, 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
{
_cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, "_printer._tcp", error);
return (0);
@@ -6867,14 +7294,17 @@ register_printer(
* advertise our IPP printer...
*/
+ if (printer->ipp_ref)
+ DNSServiceRefDeallocate(printer->ipp_ref);
+
printer->ipp_ref = DNSSDMaster;
- if (subtypes && *subtypes)
- snprintf(regtype, sizeof(regtype), "_ipp._tcp,%s", subtypes);
+ if (printer->dnssd_subtypes && *(printer->dnssd_subtypes))
+ snprintf(regtype, sizeof(regtype), "_ipp._tcp,%s", printer->dnssd_subtypes);
else
strlcpy(regtype, "_ipp._tcp", sizeof(regtype));
- if ((error = DNSServiceRegister(&(printer->ipp_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
+ if ((error = DNSServiceRegister(&(printer->ipp_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
{
_cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, regtype, error);
return (0);
@@ -6886,14 +7316,17 @@ register_printer(
* advertise our IPPS printer...
*/
+ if (printer->ipps_ref)
+ DNSServiceRefDeallocate(printer->ipps_ref);
+
printer->ipps_ref = DNSSDMaster;
- if (subtypes && *subtypes)
- snprintf(regtype, sizeof(regtype), "_ipps._tcp,%s", subtypes);
+ if (printer->dnssd_subtypes && *(printer->dnssd_subtypes))
+ snprintf(regtype, sizeof(regtype), "_ipps._tcp,%s", printer->dnssd_subtypes);
else
strlcpy(regtype, "_ipps._tcp", sizeof(regtype));
- if ((error = DNSServiceRegister(&(printer->ipps_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
+ if ((error = DNSServiceRegister(&(printer->ipps_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
{
_cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, regtype, error);
return (0);
@@ -6905,9 +7338,12 @@ register_printer(
* real port number to advertise our IPP printer...
*/
+ if (printer->http_ref)
+ DNSServiceRefDeallocate(printer->http_ref);
+
printer->http_ref = DNSSDMaster;
- if ((error = DNSServiceRegister(&(printer->http_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, "_http._tcp,_printer", NULL /* domain */, NULL /* host */, htons(printer->port), 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
+ if ((error = DNSServiceRegister(&(printer->http_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, "_http._tcp,_printer", NULL /* domain */, NULL /* host */, htons(printer->port), 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
{
_cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, "_http._tcp,_printer", error);
return (0);
@@ -6926,8 +7362,7 @@ register_printer(
ipp_txt = avahi_string_list_add_printf(ipp_txt, "rp=ipp/print");
if ((value = ippGetString(printer_make_and_model, 0, NULL)) != NULL)
ipp_txt = avahi_string_list_add_printf(ipp_txt, "ty=%s", value);
- if ((value = ippGetString(printer_more_info, 0, NULL)) != NULL)
- ipp_txt = avahi_string_list_add_printf(ipp_txt, "adminurl=%s", value);
+ ipp_txt = avahi_string_list_add_printf(ipp_txt, "adminurl=%s", adminurl);
if ((value = ippGetString(printer_location, 0, NULL)) != NULL)
ipp_txt = avahi_string_list_add_printf(ipp_txt, "note=%s", value);
ipp_txt = avahi_string_list_add_printf(ipp_txt, "pdl=%s", formats);
@@ -6949,18 +7384,21 @@ register_printer(
avahi_threaded_poll_lock(DNSSDMaster);
- printer->ipp_ref = avahi_entry_group_new(DNSSDClient, dnssd_callback, NULL);
+ if (printer->dnssd_ref)
+ avahi_entry_group_free(printer->dnssd_ref);
+
+ printer->dnssd_ref = avahi_entry_group_new(DNSSDClient, dnssd_callback, printer);
- avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_printer._tcp", NULL, NULL, 0, NULL);
+ avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_printer._tcp", NULL, NULL, 0, NULL);
/*
* Then register the _ipp._tcp (IPP)...
*/
- avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, NULL, printer->port, ipp_txt);
- if (subtypes && *subtypes)
+ avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, NULL, printer->port, ipp_txt);
+ if (printer->dnssd_subtypes && *(printer->dnssd_subtypes))
{
- char *temptypes = strdup(subtypes), *start, *end;
+ char *temptypes = strdup(printer->dnssd_subtypes), *start, *end;
for (start = temptypes; *start; start = end)
{
@@ -6970,7 +7408,7 @@ register_printer(
end = start + strlen(start);
snprintf(temp, sizeof(temp), "%s._sub._ipp._tcp", start);
- avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, temp);
+ avahi_entry_group_add_service_subtype(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, temp);
}
free(temptypes);
@@ -6981,10 +7419,10 @@ register_printer(
* _ipps._tcp (IPPS) for secure printing...
*/
- avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, NULL, printer->port, ipp_txt);
- if (subtypes && *subtypes)
+ avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, NULL, printer->port, ipp_txt);
+ if (printer->dnssd_subtypes && *(printer->dnssd_subtypes))
{
- char *temptypes = strdup(subtypes), *start, *end;
+ char *temptypes = strdup(printer->dnssd_subtypes), *start, *end;
for (start = temptypes; *start; start = end)
{
@@ -6994,7 +7432,7 @@ register_printer(
end = start + strlen(start);
snprintf(temp, sizeof(temp), "%s._sub._ipps._tcp", start);
- avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, temp);
+ avahi_entry_group_add_service_subtype(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, temp);
}
free(temptypes);
@@ -7005,14 +7443,14 @@ register_printer(
* Finally _http.tcp (HTTP) for the web interface...
*/
- avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, NULL, printer->port, NULL);
- avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, "_printer._sub._http._tcp");
+ avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, NULL, printer->port, NULL);
+ avahi_entry_group_add_service_subtype(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, "_printer._sub._http._tcp");
/*
* Commit it...
*/
- avahi_entry_group_commit(printer->ipp_ref);
+ avahi_entry_group_commit(printer->dnssd_ref);
avahi_threaded_poll_unlock(DNSSDMaster);
avahi_string_list_free(ipp_txt);
@@ -7194,14 +7632,13 @@ respond_unsupported(
static void
run_printer(ippeve_printer_t *printer) /* I - Printer */
{
- int num_fds; /* Number of file descriptors */
- struct pollfd polldata[3]; /* poll() data */
- int timeout; /* Timeout for poll() */
- ippeve_client_t *client; /* New client */
+ int num_fds; /* Number of file descriptors */
+ struct pollfd polldata[3]; /* poll() data */
+ ippeve_client_t *client; /* New client */
/*
- * Setup poll() data for the Bonjour service socket and IPv4/6 listeners...
+ * Setup poll() data for the DNS-SD service socket and IPv4/6 listeners...
*/
polldata[0].fd = printer->ipv4;
@@ -7223,12 +7660,7 @@ run_printer(ippeve_printer_t *printer) /* I - Printer */
for (;;)
{
- if (cupsArrayCount(printer->jobs))
- timeout = 10;
- else
- timeout = -1;
-
- if (poll(polldata, (nfds_t)num_fds, timeout) < 0 && errno != EINTR)
+ if (poll(polldata, (nfds_t)num_fds, 1000) < 0 && errno != EINTR)
{
perror("poll() failed");
break;
@@ -7270,11 +7702,20 @@ run_printer(ippeve_printer_t *printer) /* I - Printer */
}
}
+ /*
+ * Process DNS-SD messages...
+ */
+
#ifdef HAVE_DNSSD
if (polldata[2].revents & POLLIN)
DNSServiceProcessResult(DNSSDMaster);
#endif /* HAVE_DNSSD */
+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
+ if (printer->dnssd_collision)
+ register_printer(printer);
+#endif /* HAVE_DNSSD || HAVE_AVAHI */
+
/*
* Clean out old jobs...
*/
@@ -7932,13 +8373,16 @@ usage(int status) /* O - Exit status */
_cupsLangPuts(stdout, _("-K keypath Set location of server X.509 certificates and keys."));
#endif /* HAVE_SSL */
_cupsLangPuts(stdout, _("-M manufacturer Set manufacturer name (default=Test)"));
+#if !CUPS_LITE
_cupsLangPuts(stdout, _("-P filename.ppd Load printer attributes from PPD file"));
+#endif /* !CUPS_LITE */
+ _cupsLangPuts(stdout, _("-S filename.strings Set strings file"));
_cupsLangPuts(stdout, _("-V version Set default IPP version"));
_cupsLangPuts(stdout, _("-a filename.conf Load printer attributes from conf file"));
_cupsLangPuts(stdout, _("-c command Set print command"));
_cupsLangPuts(stdout, _("-d spool-directory Set spool directory"));
_cupsLangPuts(stdout, _("-f type/subtype[,...] Set supported file types"));
- _cupsLangPuts(stdout, _("-i iconfile.png Set icon file"));
+ _cupsLangPuts(stdout, _("-i iconfile.png[,...] Set icon file(s)"));
_cupsLangPuts(stdout, _("-k Keep job spool files"));
_cupsLangPuts(stdout, _("-l location Set location of printer"));
_cupsLangPuts(stdout, _("-m model Set model name (default=Printer)"));
@@ -8056,6 +8500,7 @@ valid_doc_attributes(
memset(header, 0, sizeof(header));
httpPeek(client->http, (char *)header, sizeof(header));
+ fprintf(stderr, "%s %s Auto-type header: %02X%02X%02X%02X%02X%02X%02X%02X\n", client->hostname, op_name, header[0], header[1], header[2], header[3], header[4], header[5], header[6], header[7]);
if (!memcmp(header, "%PDF", 4))
format = "application/pdf";
else if (!memcmp(header, "%!", 2))
@@ -8064,7 +8509,7 @@ valid_doc_attributes(
format = "image/jpeg";
else if (!memcmp(header, "\211PNG", 4))
format = "image/png";
- else if (!memcmp(header, "RAS2", 4))
+ else if (!memcmp(header, "RaS2PwgR", 8))
format = "image/pwg-raster";
else if (!memcmp(header, "UNIRAST", 8))
format = "image/urf";
diff --git a/tools/ippeveps.c b/tools/ippeveps.c
index 52e14ee1..cdedc889 100644
--- a/tools/ippeveps.c
+++ b/tools/ippeveps.c
@@ -185,7 +185,7 @@ ascii85(const unsigned char *data, /* I - Data to write */
if (length > 0)
{
// Copy any remainder into the leftdata array...
- if ((length - leftcount) > 0)
+ if (length > leftcount)
memcpy(leftdata + leftcount, data, (size_t)(length - leftcount));
memset(leftdata + length, 0, (size_t)(4 - length));
diff --git a/tools/ippfind.c b/tools/ippfind.c
index 246ab4db..ae5af7d4 100644
--- a/tools/ippfind.c
+++ b/tools/ippfind.c
@@ -3,6 +3,8 @@
* commands such as IPP and Bonjour conformance tests. This tool is
* inspired by the UNIX "find" command, thus its name.
*
+ * Copyright © 2021 by OpenPrinting.
+ * Copyright © 2020 by the IEEE-ISTO Printer Working Group
* Copyright © 2008-2018 by Apple Inc.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -159,7 +161,7 @@ static void browse_callback(AvahiServiceBrowser *browser,
static void client_callback(AvahiClient *client,
AvahiClientState state,
void *context);
-#endif /* HAVE_AVAHI */
+#endif /* HAVE_DNSSD */
static int compare_services(ippfind_srv_t *a, ippfind_srv_t *b);
static const char *dnssd_error_string(int error);
@@ -1273,6 +1275,16 @@ main(int argc, /* I - Number of command-line args */
}
#elif defined(HAVE_AVAHI)
+ char *subtype, /* Sub-type, if any */
+ subtype_buf[256]; /* Sub-type buffer */
+
+ if ((subtype = strstr(regtype, ",_")) != NULL)
+ {
+ *subtype++ = '\0';
+ snprintf(subtype_buf, sizeof(subtype_buf), "%s._sub.%s", subtype, regtype);
+ regtype = subtype_buf;
+ }
+
if (avahi_service_browser_new(avahi_client, AVAHI_IF_UNSPEC,
AVAHI_PROTO_UNSPEC, regtype, domain, 0,
browse_callback, services))
@@ -2774,6 +2786,7 @@ show_usage(void)
_cupsLangPuts(stderr, _("-h regex Match hostname to regular expression"));
_cupsLangPuts(stderr, _("-l List attributes"));
_cupsLangPuts(stderr, _("-n regex Match service name to regular expression"));
+ _cupsLangPuts(stderr, _("-N name Match service name to literal name value"));
_cupsLangPuts(stderr, _("-p Print URI if true"));
_cupsLangPuts(stderr, _("-q Quietly report match via exit code"));
_cupsLangPuts(stderr, _("-r True if service is remote"));
@@ -2786,8 +2799,9 @@ show_usage(void)
_cupsLangPuts(stderr, _("--exec utility [argument ...] ;\n"
" Execute program if true"));
_cupsLangPuts(stderr, _("--host regex Match hostname to regular expression"));
- _cupsLangPuts(stderr, _("--ls List attributes"));
+ _cupsLangPuts(stderr, _("--literal-name name Match service name to literal name value"));
_cupsLangPuts(stderr, _("--local True if service is local"));
+ _cupsLangPuts(stderr, _("--ls List attributes"));
_cupsLangPuts(stderr, _("--name regex Match service name to regular expression"));
_cupsLangPuts(stderr, _("--path regex Match resource path to regular expression"));
_cupsLangPuts(stderr, _("--port number[-number] Match port to number or range"));
diff --git a/tools/ipptool.c b/tools/ipptool.c
index a3a694d5..e89fb5bc 100644
--- a/tools/ipptool.c
+++ b/tools/ipptool.c
@@ -1,7 +1,9 @@
/*
* ipptool command for CUPS.
*
- * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2021 by OpenPrinting.
+ * Copyright © 2020 by The Printer Working Group.
+ * Copyright © 2007-2021 by Apple Inc.
* Copyright © 1997-2007 by Easy Software Products.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -30,37 +32,46 @@
/*
+ * Limits...
+ */
+
+#define MAX_EXPECT 200 // Maximum number of EXPECT directives
+#define MAX_DISPLAY 200 // Maximum number of DISPLAY directives
+#define MAX_MONITOR 10 // Maximum number of MONITOR-PRINTER-STATE EXPECT directives
+
+
+/*
* Types...
*/
-typedef enum _cups_transfer_e /**** How to send request data ****/
+typedef enum ipptool_transfer_e /**** How to send request data ****/
{
- _CUPS_TRANSFER_AUTO, /* Chunk for files, length for static */
- _CUPS_TRANSFER_CHUNKED, /* Chunk always */
- _CUPS_TRANSFER_LENGTH /* Length always */
-} _cups_transfer_t;
+ IPPTOOL_TRANSFER_AUTO, /* Chunk for files, length for static */
+ IPPTOOL_TRANSFER_CHUNKED, /* Chunk always */
+ IPPTOOL_TRANSFER_LENGTH /* Length always */
+} ipptool_transfer_t;
-typedef enum _cups_output_e /**** Output mode ****/
+typedef enum ipptool_output_e /**** Output mode ****/
{
- _CUPS_OUTPUT_QUIET, /* No output */
- _CUPS_OUTPUT_TEST, /* Traditional CUPS test output */
- _CUPS_OUTPUT_PLIST, /* XML plist test output */
- _CUPS_OUTPUT_IPPSERVER, /* ippserver attribute file output */
- _CUPS_OUTPUT_LIST, /* Tabular list output */
- _CUPS_OUTPUT_CSV /* Comma-separated values output */
-} _cups_output_t;
-
-typedef enum _cups_with_e /**** WITH flags ****/
+ IPPTOOL_OUTPUT_QUIET, /* No output */
+ IPPTOOL_OUTPUT_TEST, /* Traditional CUPS test output */
+ IPPTOOL_OUTPUT_PLIST, /* XML plist test output */
+ IPPTOOL_OUTPUT_IPPSERVER, /* ippserver attribute file output */
+ IPPTOOL_OUTPUT_LIST, /* Tabular list output */
+ IPPTOOL_OUTPUT_CSV /* Comma-separated values output */
+} ipptool_output_t;
+
+typedef enum ipptool_with_e /**** WITH flags ****/
{
- _CUPS_WITH_LITERAL = 0, /* Match string is a literal value */
- _CUPS_WITH_ALL = 1, /* Must match all values */
- _CUPS_WITH_REGEX = 2, /* Match string is a regular expression */
- _CUPS_WITH_HOSTNAME = 4, /* Match string is a URI hostname */
- _CUPS_WITH_RESOURCE = 8, /* Match string is a URI resource */
- _CUPS_WITH_SCHEME = 16 /* Match string is a URI scheme */
-} _cups_with_t;
-
-typedef struct _cups_expect_s /**** Expected attribute info ****/
+ IPPTOOL_WITH_LITERAL = 0, /* Match string is a literal value */
+ IPPTOOL_WITH_ALL = 1, /* Must match all values */
+ IPPTOOL_WITH_REGEX = 2, /* Match string is a regular expression */
+ IPPTOOL_WITH_HOSTNAME = 4, /* Match string is a URI hostname */
+ IPPTOOL_WITH_RESOURCE = 8, /* Match string is a URI resource */
+ IPPTOOL_WITH_SCHEME = 16 /* Match string is a URI scheme */
+} ipptool_with_t;
+
+typedef struct ipptool_expect_s /**** Expected attribute info ****/
{
int optional, /* Optional attribute? */
not_expect, /* Don't expect attribute? */
@@ -74,16 +85,18 @@ typedef struct _cups_expect_s /**** Expected attribute info ****/
*with_value_from, /* Attribute must have one of the values in this attribute */
*define_match, /* Variable to define on match */
*define_no_match, /* Variable to define on no-match */
- *define_value; /* Variable to define with value */
+ *define_value, /* Variable to define with value */
+ *display_match; /* Message to display on a match */
int repeat_limit, /* Maximum number of times to repeat */
repeat_match, /* Repeat test on match */
repeat_no_match, /* Repeat test on no match */
- with_flags, /* WITH flags */
+ with_distinct, /* WITH-DISTINCT-VALUES? */
+ with_flags, /* WITH flags */
count; /* Expected count if > 0 */
ipp_tag_t in_group; /* IN-GROUP value */
-} _cups_expect_t;
+} ipptool_expect_t;
-typedef struct _cups_status_s /**** Status info ****/
+typedef struct ipptool_status_s /**** Status info ****/
{
ipp_status_t status; /* Expected status code */
char *if_defined, /* Only if variable is defined */
@@ -94,14 +107,16 @@ typedef struct _cups_status_s /**** Status info ****/
int repeat_limit, /* Maximum number of times to repeat */
repeat_match, /* Repeat the test when it does not match */
repeat_no_match; /* Repeat the test when it matches */
-} _cups_status_t;
+} ipptool_status_t;
-typedef struct _cups_testdata_s /**** Test Data ****/
+typedef struct ipptool_test_s /**** Test Data ****/
{
/* Global Options */
+ _ipp_vars_t *vars; /* Variables */
http_encryption_t encryption; /* Encryption for connection */
int family; /* Address family */
- _cups_output_t output; /* Output mode */
+ ipptool_output_t output; /* Output mode */
+ int repeat_on_busy; /* Repeat tests on server-error-busy */
int stop_after_include_error;
/* Stop after include errors? */
double timeout; /* Timeout for connection */
@@ -110,7 +125,7 @@ typedef struct _cups_testdata_s /**** Test Data ****/
/* Test Defaults */
int def_ignore_errors; /* Default IGNORE-ERRORS value */
- _cups_transfer_t def_transfer; /* Default TRANSFER value */
+ ipptool_transfer_t def_transfer; /* Default TRANSFER value */
int def_version; /* Default IPP version */
/* Global State */
@@ -131,26 +146,36 @@ typedef struct _cups_testdata_s /**** Test Data ****/
char compression[16]; /* COMPRESSION value */
useconds_t delay; /* Initial delay */
int num_displayed; /* Number of displayed attributes */
- char *displayed[200]; /* Displayed attributes */
+ char *displayed[MAX_DISPLAY];/* Displayed attributes */
int num_expects; /* Number of expected attributes */
- _cups_expect_t expects[200], /* Expected attributes */
+ ipptool_expect_t expects[MAX_EXPECT], /* Expected attributes */
*expect, /* Current expected attribute */
*last_expect; /* Last EXPECT (for predicates) */
char file[1024], /* Data filename */
file_id[1024]; /* File identifier */
int ignore_errors; /* Ignore test failures? */
char name[1024]; /* Test name */
+ char pause[1024]; /* PAUSE value */
useconds_t repeat_interval; /* Repeat interval (delay) */
int request_id; /* Current request ID */
char resource[512]; /* Resource for request */
- int skip_test, /* Skip this test? */
+ int pass_test, /* Pass this test? */
+ skip_test, /* Skip this test? */
num_statuses; /* Number of valid status codes */
- _cups_status_t statuses[100], /* Valid status codes */
+ ipptool_status_t statuses[100], /* Valid status codes */
*last_status; /* Last STATUS (for predicates) */
char test_id[1024]; /* Test identifier */
- _cups_transfer_t transfer; /* To chunk or not to chunk */
+ ipptool_transfer_t transfer; /* To chunk or not to chunk */
int version; /* IPP version number to use */
-} _cups_testdata_t;
+ _cups_thread_t monitor_thread; /* Monitoring thread ID */
+ int monitor_done; /* Set to 1 to stop monitor thread */
+ char *monitor_uri; /* MONITOR-PRINTER-STATE URI */
+ useconds_t monitor_delay, /* MONITOR-PRINTER-STATE DELAY value, if any */
+ monitor_interval; /* MONITOR-PRINTER-STATE DELAY interval */
+ int num_monitor_expects; /* Number MONITOR-PRINTER-STATE EXPECTs */
+ ipptool_expect_t monitor_expects[MAX_MONITOR];
+ /* MONITOR-PRINTER-STATE EXPECTs */
+} ipptool_test_t;
/*
@@ -167,32 +192,35 @@ static int Cancel = 0; /* Cancel test? */
static void add_stringf(cups_array_t *a, const char *s, ...) _CUPS_FORMAT(2, 3);
static int compare_uris(const char *a, const char *b);
static void copy_hex_string(char *buffer, unsigned char *data, int datalen, size_t bufsize);
-static int do_test(_ipp_file_t *f, _ipp_vars_t *vars, _cups_testdata_t *data);
-static int do_tests(const char *testfile, _ipp_vars_t *vars, _cups_testdata_t *data);
-static int error_cb(_ipp_file_t *f, _cups_testdata_t *data, const char *error);
-static int expect_matches(_cups_expect_t *expect, ipp_tag_t value_tag);
+static void *do_monitor_printer_state(ipptool_test_t *data);
+static int do_test(_ipp_file_t *f, ipptool_test_t *data);
+static int do_tests(const char *testfile, ipptool_test_t *data);
+static int error_cb(_ipp_file_t *f, ipptool_test_t *data, const char *error);
+static int expect_matches(ipptool_expect_t *expect, ipp_attribute_t *attr);
static char *get_filename(const char *testfile, char *dst, const char *src, size_t dstsize);
static const char *get_string(ipp_attribute_t *attr, int element, int flags, char *buffer, size_t bufsize);
-static void init_data(_cups_testdata_t *data);
+static void init_data(ipptool_test_t *data);
static char *iso_date(const ipp_uchar_t *date);
+static int parse_monitor_printer_state(_ipp_file_t *f, ipptool_test_t *data);
static void pause_message(const char *message);
-static void print_attr(cups_file_t *outfile, _cups_output_t output, ipp_attribute_t *attr, ipp_tag_t *group);
-static void print_csv(_cups_testdata_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths);
-static void print_fatal_error(_cups_testdata_t *data, const char *s, ...) _CUPS_FORMAT(2, 3);
-static void print_ippserver_attr(_cups_testdata_t *data, ipp_attribute_t *attr, int indent);
-static void print_ippserver_string(_cups_testdata_t *data, const char *s, size_t len);
-static void print_line(_cups_testdata_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths);
-static void print_xml_header(_cups_testdata_t *data);
+static void print_attr(cups_file_t *outfile, ipptool_output_t output, ipp_attribute_t *attr, ipp_tag_t *group);
+static ipp_attribute_t *print_csv(ipptool_test_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths);
+static void print_fatal_error(ipptool_test_t *data, const char *s, ...) _CUPS_FORMAT(2, 3);
+static void print_ippserver_attr(ipptool_test_t *data, ipp_attribute_t *attr, int indent);
+static void print_ippserver_string(ipptool_test_t *data, const char *s, size_t len);
+static ipp_attribute_t *print_line(ipptool_test_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths);
+static void print_xml_header(ipptool_test_t *data);
static void print_xml_string(cups_file_t *outfile, const char *element, const char *s);
-static void print_xml_trailer(_cups_testdata_t *data, int success, const char *message);
+static void print_xml_trailer(ipptool_test_t *data, int success, const char *message);
#ifndef _WIN32
static void sigterm_handler(int sig);
#endif /* _WIN32 */
static int timeout_cb(http_t *http, void *user_data);
-static int token_cb(_ipp_file_t *f, _ipp_vars_t *vars, _cups_testdata_t *data, const char *token);
+static int token_cb(_ipp_file_t *f, _ipp_vars_t *vars, ipptool_test_t *data, const char *token);
static void usage(void) _CUPS_NORETURN;
+static int with_distinct_values(cups_array_t *errors, ipp_attribute_t *attr);
static const char *with_flags_string(int flags);
-static int with_value(_cups_testdata_t *data, cups_array_t *errors, char *value, int flags, ipp_attribute_t *attr, char *matchbuf, size_t matchlen);
+static int with_value(ipptool_test_t *data, cups_array_t *errors, char *value, int flags, ipp_attribute_t *attr, char *matchbuf, size_t matchlen);
static int with_value_from(cups_array_t *errors, ipp_attribute_t *fromattr, ipp_attribute_t *attr, char *matchbuf, size_t matchlen);
@@ -215,8 +243,8 @@ main(int argc, /* I - Number of command-line args */
*testfile; /* Test file to use */
int interval, /* Test interval in microseconds */
repeat; /* Repeat count */
- _cups_testdata_t data; /* Test data */
_ipp_vars_t vars; /* Variables */
+ ipptool_test_t data; /* Test data */
_cups_globals_t *cg = _cupsGlobals();
/* Global data */
@@ -239,8 +267,9 @@ main(int argc, /* I - Number of command-line args */
init_data(&data);
_ippVarsInit(&vars, NULL, (_ipp_ferror_cb_t)error_cb, (_ipp_ftoken_cb_t)token_cb);
+ data.vars = &vars;
- _ippVarsSet(&vars, "date-start", iso_date(ippTimeToDate(time(NULL))));
+ _ippVarsSet(data.vars, "date-start", iso_date(ippTimeToDate(time(NULL))));
/*
* We need at least:
@@ -278,7 +307,7 @@ main(int argc, /* I - Number of command-line args */
exit(1);
}
- data.output = _CUPS_OUTPUT_IPPSERVER;
+ data.output = IPPTOOL_OUTPUT_IPPSERVER;
}
else if (!strcmp(argv[i], "--stop-after-include-error"))
{
@@ -306,16 +335,16 @@ main(int argc, /* I - Number of command-line args */
#endif /* AF_INET6 */
case 'C' : /* Enable HTTP chunking */
- data.def_transfer = _CUPS_TRANSFER_CHUNKED;
+ data.def_transfer = IPPTOOL_TRANSFER_CHUNKED;
break;
case 'E' : /* Encrypt with TLS */
-#ifdef HAVE_SSL
+#ifdef HAVE_TLS
data.encryption = HTTP_ENCRYPT_REQUIRED;
#else
_cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."),
argv[0]);
-#endif /* HAVE_SSL */
+#endif /* HAVE_TLS */
break;
case 'I' : /* Ignore errors */
@@ -323,7 +352,7 @@ main(int argc, /* I - Number of command-line args */
break;
case 'L' : /* Disable HTTP chunking */
- data.def_transfer = _CUPS_TRANSFER_LENGTH;
+ data.def_transfer = IPPTOOL_TRANSFER_LENGTH;
break;
case 'P' : /* Output to plist file */
@@ -344,7 +373,7 @@ main(int argc, /* I - Number of command-line args */
exit(1);
}
- data.output = _CUPS_OUTPUT_PLIST;
+ data.output = IPPTOOL_OUTPUT_PLIST;
if (interval || repeat)
{
@@ -353,13 +382,16 @@ main(int argc, /* I - Number of command-line args */
}
break;
+ case 'R' : /* Repeat on server-error-busy */
+ data.repeat_on_busy = 1;
+ break;
+
case 'S' : /* Encrypt with SSL */
-#ifdef HAVE_SSL
+#ifdef HAVE_TLS
data.encryption = HTTP_ENCRYPT_ALWAYS;
#else
- _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."),
- argv[0]);
-#endif /* HAVE_SSL */
+ _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), "ipptool");
+#endif /* HAVE_TLS */
break;
case 'T' : /* Set timeout */
@@ -367,9 +399,7 @@ main(int argc, /* I - Number of command-line args */
if (i >= argc)
{
- _cupsLangPrintf(stderr,
- _("%s: Missing timeout for \"-T\"."),
- "ipptool");
+ _cupsLangPrintf(stderr, _("%s: Missing timeout for \"-T\"."), "ipptool");
usage();
}
@@ -381,9 +411,7 @@ main(int argc, /* I - Number of command-line args */
if (i >= argc)
{
- _cupsLangPrintf(stderr,
- _("%s: Missing version for \"-V\"."),
- "ipptool");
+ _cupsLangPrintf(stderr, _("%s: Missing version for \"-V\"."), "ipptool");
usage();
}
@@ -415,7 +443,7 @@ main(int argc, /* I - Number of command-line args */
break;
case 'X' : /* Produce XML output */
- data.output = _CUPS_OUTPUT_PLIST;
+ data.output = IPPTOOL_OUTPUT_PLIST;
if (interval || repeat)
{
@@ -425,7 +453,7 @@ main(int argc, /* I - Number of command-line args */
break;
case 'c' : /* CSV output */
- data.output = _CUPS_OUTPUT_CSV;
+ data.output = IPPTOOL_OUTPUT_CSV;
break;
case 'd' : /* Define a variable */
@@ -433,8 +461,7 @@ main(int argc, /* I - Number of command-line args */
if (i >= argc)
{
- _cupsLangPuts(stderr,
- _("ipptool: Missing name=value for \"-d\"."));
+ _cupsLangPuts(stderr, _("ipptool: Missing name=value for \"-d\"."));
usage();
}
@@ -444,7 +471,7 @@ main(int argc, /* I - Number of command-line args */
else
value = name + strlen(name);
- _ippVarsSet(&vars, name, value);
+ _ippVarsSet(data.vars, name, value);
break;
case 'f' : /* Set the default test filename */
@@ -452,8 +479,7 @@ main(int argc, /* I - Number of command-line args */
if (i >= argc)
{
- _cupsLangPuts(stderr,
- _("ipptool: Missing filename for \"-f\"."));
+ _cupsLangPuts(stderr, _("ipptool: Missing filename for \"-f\"."));
usage();
}
@@ -482,7 +508,7 @@ main(int argc, /* I - Number of command-line args */
else
strlcpy(filename, argv[i], sizeof(filename));
- _ippVarsSet(&vars, "filename", filename);
+ _ippVarsSet(data.vars, "filename", filename);
if ((ext = strrchr(filename, '.')) != NULL)
{
@@ -491,43 +517,43 @@ main(int argc, /* I - Number of command-line args */
*/
if (!_cups_strcasecmp(ext, ".gif"))
- _ippVarsSet(&vars, "filetype", "image/gif");
+ _ippVarsSet(data.vars, "filetype", "image/gif");
else if (!_cups_strcasecmp(ext, ".htm") ||
!_cups_strcasecmp(ext, ".htm.gz") ||
!_cups_strcasecmp(ext, ".html") ||
!_cups_strcasecmp(ext, ".html.gz"))
- _ippVarsSet(&vars, "filetype", "text/html");
+ _ippVarsSet(data.vars, "filetype", "text/html");
else if (!_cups_strcasecmp(ext, ".jpg") ||
!_cups_strcasecmp(ext, ".jpeg"))
- _ippVarsSet(&vars, "filetype", "image/jpeg");
+ _ippVarsSet(data.vars, "filetype", "image/jpeg");
else if (!_cups_strcasecmp(ext, ".pcl") ||
!_cups_strcasecmp(ext, ".pcl.gz"))
- _ippVarsSet(&vars, "filetype", "application/vnd.hp-PCL");
+ _ippVarsSet(data.vars, "filetype", "application/vnd.hp-PCL");
else if (!_cups_strcasecmp(ext, ".pdf"))
- _ippVarsSet(&vars, "filetype", "application/pdf");
+ _ippVarsSet(data.vars, "filetype", "application/pdf");
else if (!_cups_strcasecmp(ext, ".png"))
- _ippVarsSet(&vars, "filetype", "image/png");
+ _ippVarsSet(data.vars, "filetype", "image/png");
else if (!_cups_strcasecmp(ext, ".ps") ||
!_cups_strcasecmp(ext, ".ps.gz"))
- _ippVarsSet(&vars, "filetype", "application/postscript");
+ _ippVarsSet(data.vars, "filetype", "application/postscript");
else if (!_cups_strcasecmp(ext, ".pwg") ||
!_cups_strcasecmp(ext, ".pwg.gz") ||
!_cups_strcasecmp(ext, ".ras") ||
!_cups_strcasecmp(ext, ".ras.gz"))
- _ippVarsSet(&vars, "filetype", "image/pwg-raster");
+ _ippVarsSet(data.vars, "filetype", "image/pwg-raster");
else if (!_cups_strcasecmp(ext, ".tif") ||
!_cups_strcasecmp(ext, ".tiff"))
- _ippVarsSet(&vars, "filetype", "image/tiff");
+ _ippVarsSet(data.vars, "filetype", "image/tiff");
else if (!_cups_strcasecmp(ext, ".txt") ||
!_cups_strcasecmp(ext, ".txt.gz"))
- _ippVarsSet(&vars, "filetype", "text/plain");
+ _ippVarsSet(data.vars, "filetype", "text/plain");
else if (!_cups_strcasecmp(ext, ".urf") ||
!_cups_strcasecmp(ext, ".urf.gz"))
- _ippVarsSet(&vars, "filetype", "image/urf");
+ _ippVarsSet(data.vars, "filetype", "image/urf");
else if (!_cups_strcasecmp(ext, ".xps"))
- _ippVarsSet(&vars, "filetype", "application/openxps");
+ _ippVarsSet(data.vars, "filetype", "application/openxps");
else
- _ippVarsSet(&vars, "filetype", "application/octet-stream");
+ _ippVarsSet(data.vars, "filetype", "application/octet-stream");
}
else
{
@@ -535,7 +561,7 @@ main(int argc, /* I - Number of command-line args */
* Use the "auto-type" MIME media type...
*/
- _ippVarsSet(&vars, "filetype", "application/octet-stream");
+ _ippVarsSet(data.vars, "filetype", "application/octet-stream");
}
break;
@@ -561,7 +587,7 @@ main(int argc, /* I - Number of command-line args */
}
}
- if ((data.output == _CUPS_OUTPUT_PLIST || data.output == _CUPS_OUTPUT_IPPSERVER) && interval)
+ if ((data.output == IPPTOOL_OUTPUT_PLIST || data.output == IPPTOOL_OUTPUT_IPPSERVER) && interval)
{
_cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\"."));
usage();
@@ -569,7 +595,7 @@ main(int argc, /* I - Number of command-line args */
break;
case 'l' : /* List as a table */
- data.output = _CUPS_OUTPUT_LIST;
+ data.output = IPPTOOL_OUTPUT_LIST;
break;
case 'n' : /* Repeat count */
@@ -583,7 +609,7 @@ main(int argc, /* I - Number of command-line args */
else
repeat = atoi(argv[i]);
- if ((data.output == _CUPS_OUTPUT_PLIST || data.output == _CUPS_OUTPUT_IPPSERVER) && repeat)
+ if ((data.output == IPPTOOL_OUTPUT_PLIST || data.output == IPPTOOL_OUTPUT_IPPSERVER) && repeat)
{
_cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\"."));
usage();
@@ -591,11 +617,11 @@ main(int argc, /* I - Number of command-line args */
break;
case 'q' : /* Be quiet */
- data.output = _CUPS_OUTPUT_QUIET;
+ data.output = IPPTOOL_OUTPUT_QUIET;
break;
case 't' : /* CUPS test output */
- data.output = _CUPS_OUTPUT_TEST;
+ data.output = IPPTOOL_OUTPUT_TEST;
break;
case 'v' : /* Be verbose */
@@ -609,34 +635,34 @@ main(int argc, /* I - Number of command-line args */
}
}
else if (!strncmp(argv[i], "ipp://", 6) || !strncmp(argv[i], "http://", 7)
-#ifdef HAVE_SSL
+#ifdef HAVE_TLS
|| !strncmp(argv[i], "ipps://", 7) || !strncmp(argv[i], "https://", 8)
-#endif /* HAVE_SSL */
+#endif /* HAVE_TLS */
)
{
/*
* Set URI...
*/
- if (vars.uri)
+ if (data.vars->uri)
{
_cupsLangPuts(stderr, _("ipptool: May only specify a single URI."));
usage();
}
-#ifdef HAVE_SSL
+#ifdef HAVE_TLS
if (!strncmp(argv[i], "ipps://", 7) || !strncmp(argv[i], "https://", 8))
data.encryption = HTTP_ENCRYPT_ALWAYS;
-#endif /* HAVE_SSL */
+#endif /* HAVE_TLS */
- if (!_ippVarsSet(&vars, "uri", argv[i]))
+ if (!_ippVarsSet(data.vars, "uri", argv[i]))
{
_cupsLangPrintf(stderr, _("ipptool: Bad URI \"%s\"."), argv[i]);
return (1);
}
- if (vars.username[0] && vars.password)
- cupsSetPasswordCB2(_ippVarsPasswordCB, &vars);
+ if (data.vars->username[0] && data.vars->password)
+ cupsSetPasswordCB2(_ippVarsPasswordCB, data.vars);
}
else
{
@@ -644,7 +670,7 @@ main(int argc, /* I - Number of command-line args */
* Run test...
*/
- if (!vars.uri)
+ if (!data.vars->uri)
{
_cupsLangPuts(stderr, _("ipptool: URI required before test file."));
_cupsLangPuts(stderr, argv[i]);
@@ -666,26 +692,31 @@ main(int argc, /* I - Number of command-line args */
else
testfile = argv[i];
- if (!do_tests(testfile, &vars, &data))
+ if (access(testfile, 0))
+ {
+ _cupsLangPrintf(stderr, _("%s: Unable to open \"%s\": %s"), "ipptool", testfile, strerror(errno));
+ status = 1;
+ }
+ else if (!do_tests(testfile, &data))
status = 1;
}
}
- if (!vars.uri || !testfile)
+ if (!data.vars->uri || !testfile)
usage();
/*
* Loop if the interval is set...
*/
- if (data.output == _CUPS_OUTPUT_PLIST)
+ if (data.output == IPPTOOL_OUTPUT_PLIST)
print_xml_trailer(&data, !status, NULL);
else if (interval > 0 && repeat > 0)
{
while (repeat > 1)
{
usleep((useconds_t)interval);
- do_tests(testfile, &vars, &data);
+ do_tests(testfile, &data);
repeat --;
}
}
@@ -694,11 +725,11 @@ main(int argc, /* I - Number of command-line args */
for (;;)
{
usleep((useconds_t)interval);
- do_tests(testfile, &vars, &data);
+ do_tests(testfile, &data);
}
}
- if ((data.output == _CUPS_OUTPUT_TEST || (data.output == _CUPS_OUTPUT_PLIST && data.outfile)) && data.test_count > 1)
+ if ((data.output == IPPTOOL_OUTPUT_TEST || (data.output == IPPTOOL_OUTPUT_PLIST && data.outfile)) && data.test_count > 1)
{
/*
* Show a summary report if there were multiple tests...
@@ -709,7 +740,7 @@ main(int argc, /* I - Number of command-line args */
cupsFileClose(data.outfile);
-/*
+ /*
* Exit...
*/
@@ -882,20 +913,258 @@ copy_hex_string(char *buffer, /* I - String buffer */
/*
+ * 'do_monitor_printer_state()' - Do the MONITOR-PRINTER-STATE tests in the background.
+ */
+
+static void * // O - Thread exit status
+do_monitor_printer_state(
+ ipptool_test_t *data) // I - Test data
+{
+ int i, j; // Looping vars
+ char scheme[32], // URI scheme
+ userpass[32], // URI username:password
+ host[256], // URI hostname/IP address
+ resource[256]; // URI resource path
+ int port; // URI port number
+ http_encryption_t encryption; // Encryption to use
+ http_t *http; // Connection to printer
+ ipp_t *request, // IPP request
+ *response = NULL; // IPP response
+ http_status_t status; // Request status
+ ipp_attribute_t *found; // Found attribute
+ ipptool_expect_t *expect; // Current EXPECT test
+ char buffer[131072]; // Copy buffer
+ int num_pattrs; // Number of printer attributes
+ const char *pattrs[100]; // Printer attributes we care about
+
+
+ // Connect to the printer...
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, data->monitor_uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
+ {
+ print_fatal_error(data, "Bad printer URI \"%s\".", data->monitor_uri);
+ return (NULL);
+ }
+
+ if (!_cups_strcasecmp(scheme, "https") || !_cups_strcasecmp(scheme, "ipps") || port == 443)
+ encryption = HTTP_ENCRYPTION_ALWAYS;
+ else
+ encryption = data->encryption;
+
+ if ((http = httpConnect2(host, port, NULL, data->family, encryption, 1, 30000, NULL)) == NULL)
+ {
+ print_fatal_error(data, "Unable to connect to \"%s\" on port %d - %s", host, port, cupsLastErrorString());
+ return (0);
+ }
+
+#ifdef HAVE_LIBZ
+ httpSetDefaultField(http, HTTP_FIELD_ACCEPT_ENCODING, "deflate, gzip, identity");
+#else
+ httpSetDefaultField(http, HTTP_FIELD_ACCEPT_ENCODING, "identity");
+#endif /* HAVE_LIBZ */
+
+ if (data->timeout > 0.0)
+ httpSetTimeout(http, data->timeout, timeout_cb, NULL);
+
+ // Wait for the initial delay as needed...
+ if (data->monitor_delay)
+ usleep(data->monitor_delay);
+
+ // Create a query request that we'll reuse...
+ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
+ ippSetRequestId(request, data->request_id * 100 - 1);
+ ippSetVersion(request, data->version / 10, data->version % 10);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, data->monitor_uri);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser());
+
+ for (i = data->num_monitor_expects, expect = data->monitor_expects, num_pattrs = 0; i > 0; i --, expect ++)
+ {
+ // Add EXPECT attribute names...
+ for (j = 0; j < num_pattrs; j ++)
+ {
+ if (!strcmp(expect->name, pattrs[j]))
+ break;
+ }
+
+ if (j >= num_pattrs && num_pattrs < (int)(sizeof(pattrs) / sizeof(pattrs[0])))
+ pattrs[num_pattrs ++] = expect->name;
+ }
+
+ if (num_pattrs > 0)
+ ippAddStrings(request, IPP_TAG_OPERATION, IPP_CONST_TAG(IPP_TAG_KEYWORD), "requested-attributes", num_pattrs, NULL, pattrs);
+
+ // Loop until we need to stop...
+ while (!data->monitor_done && !Cancel)
+ {
+ // Poll the printer state...
+ ippSetRequestId(request, ippGetRequestId(request) + 1);
+
+ if ((status = cupsSendRequest(http, request, resource, ippLength(request))) != HTTP_STATUS_ERROR)
+ {
+ response = cupsGetResponse(http, resource);
+ status = httpGetStatus(http);
+ }
+
+ if (!data->monitor_done && !Cancel && status == HTTP_STATUS_ERROR && httpError(data->http) != EINVAL &&
+#ifdef _WIN32
+ httpError(data->http) != WSAETIMEDOUT)
+#else
+ httpError(data->http) != ETIMEDOUT)
+#endif // _WIN32
+ {
+ if (httpReconnect2(http, 30000, NULL))
+ break;
+ }
+ else if (status == HTTP_STATUS_ERROR || status == HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED)
+ {
+ break;
+ }
+ else if (status != HTTP_STATUS_OK)
+ {
+ httpFlush(http);
+
+ if (status == HTTP_STATUS_UNAUTHORIZED)
+ continue;
+
+ break;
+ }
+
+ for (i = data->num_monitor_expects, expect = data->monitor_expects; i > 0; i --, expect ++)
+ {
+ if (expect->if_defined && !_ippVarsGet(data->vars, expect->if_defined))
+ continue;
+
+ if (expect->if_not_defined && _ippVarsGet(data->vars, expect->if_not_defined))
+ continue;
+
+ found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO);
+
+ if ((found && expect->not_expect) ||
+ (!found && !(expect->not_expect || expect->optional)) ||
+ (found && !expect_matches(expect, found)) ||
+ (expect->in_group && ippGetGroupTag(found) != expect->in_group) ||
+ (expect->with_distinct && !with_distinct_values(NULL, found)))
+ {
+ if (expect->define_no_match)
+ {
+ _ippVarsSet(data->vars, expect->define_no_match, "1");
+ data->monitor_done = 1;
+ }
+ break;
+ }
+
+ if (found)
+ ippAttributeString(found, buffer, sizeof(buffer));
+
+ if (found && !with_value(data, NULL, expect->with_value, expect->with_flags, found, buffer, sizeof(buffer)))
+ {
+ if (expect->define_no_match)
+ {
+ _ippVarsSet(data->vars, expect->define_no_match, "1");
+ data->monitor_done = 1;
+ }
+ break;
+ }
+
+ if (found && expect->count > 0 && ippGetCount(found) != expect->count)
+ {
+ if (expect->define_no_match)
+ {
+ _ippVarsSet(data->vars, expect->define_no_match, "1");
+ data->monitor_done = 1;
+ }
+ break;
+ }
+
+ if (found && expect->display_match && (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())))
+ cupsFilePrintf(cupsFileStdout(), "CONT]\n\n%s\n\n %-68.68s [", expect->display_match, data->name);
+
+ if (found && expect->define_match)
+ {
+ _ippVarsSet(data->vars, expect->define_match, "1");
+ data->monitor_done = 1;
+ }
+
+ if (found && expect->define_value)
+ {
+ if (!expect->with_value)
+ {
+ int last = ippGetCount(found) - 1;
+ // Last element in attribute
+
+ switch (ippGetValueTag(found))
+ {
+ case IPP_TAG_ENUM :
+ case IPP_TAG_INTEGER :
+ snprintf(buffer, sizeof(buffer), "%d", ippGetInteger(found, last));
+ break;
+
+ case IPP_TAG_BOOLEAN :
+ if (ippGetBoolean(found, last))
+ strlcpy(buffer, "true", sizeof(buffer));
+ else
+ strlcpy(buffer, "false", sizeof(buffer));
+ break;
+
+ case IPP_TAG_CHARSET :
+ case IPP_TAG_KEYWORD :
+ case IPP_TAG_LANGUAGE :
+ case IPP_TAG_MIMETYPE :
+ case IPP_TAG_NAME :
+ case IPP_TAG_NAMELANG :
+ case IPP_TAG_TEXT :
+ case IPP_TAG_TEXTLANG :
+ case IPP_TAG_URI :
+ case IPP_TAG_URISCHEME :
+ strlcpy(buffer, ippGetString(found, last, NULL), sizeof(buffer));
+ break;
+
+ default :
+ ippAttributeString(found, buffer, sizeof(buffer));
+ break;
+ }
+ }
+
+ _ippVarsSet(data->vars, expect->define_value, buffer);
+ data->monitor_done = 1;
+ }
+ }
+
+ if (i == 0)
+ data->monitor_done = 1; // All tests passed
+
+ ippDelete(response);
+ response = NULL;
+
+ // Sleep between requests...
+ if (data->monitor_done || Cancel)
+ break;
+
+ usleep(data->monitor_interval);
+ }
+
+ // Close the connection to the printer and return...
+ httpClose(http);
+ ippDelete(request);
+ ippDelete(response);
+
+ return (NULL);
+}
+
+
+/*
* 'do_test()' - Do a single test from the test file.
*/
static int /* O - 1 on success, 0 on failure */
-do_test(_ipp_file_t *f, /* I - IPP data file */
- _ipp_vars_t *vars, /* I - IPP variables */
- _cups_testdata_t *data) /* I - Test data */
+do_test(_ipp_file_t *f, /* I - IPP data file */
+ ipptool_test_t *data) /* I - Test data */
{
int i, /* Looping var */
status_ok, /* Did we get a matching status? */
repeat_count = 0, /* Repeat count */
repeat_test; /* Repeat the test? */
- _cups_expect_t *expect; /* Current expected attribute */
+ ipptool_expect_t *expect; /* Current expected attribute */
ipp_t *request, /* IPP request */
*response; /* IPP response */
size_t length; /* Length of IPP request */
@@ -916,6 +1185,28 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
return (0);
/*
+ * Show any PAUSE message, as needed...
+ */
+
+ if (data->pause[0])
+ {
+ if (!data->skip_test && !data->pass_test)
+ pause_message(data->pause);
+
+ data->pause[0] = '\0';
+ }
+
+ /*
+ * Start the background thread as needed...
+ */
+
+ if (data->monitor_uri)
+ {
+ data->monitor_done = 0;
+ data->monitor_thread = _cupsThreadCreate((_cups_thread_func_t)do_monitor_printer_state, data);
+ }
+
+ /*
* Take over control of the attributes in the request...
*/
@@ -931,7 +1222,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
ippSetVersion(request, data->version / 10, data->version % 10);
ippSetRequestId(request, data->request_id);
- if (data->output == _CUPS_OUTPUT_PLIST)
+ if (data->output == IPPTOOL_OUTPUT_PLIST)
{
cupsFilePuts(data->outfile, "<dict>\n");
cupsFilePuts(data->outfile, "<key>Name</key>\n");
@@ -964,46 +1255,58 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
cupsFilePuts(data->outfile, "</array>\n");
}
- if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
+ if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
{
if (data->verbosity)
{
cupsFilePrintf(cupsFileStdout(), " %s:\n", ippOpString(ippGetOperation(request)));
for (attrptr = ippFirstAttribute(request); attrptr; attrptr = ippNextAttribute(request))
- print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL);
+ print_attr(cupsFileStdout(), IPPTOOL_OUTPUT_TEST, attrptr, NULL);
}
cupsFilePrintf(cupsFileStdout(), " %-68.68s [", data->name);
}
- if ((data->skip_previous && !data->prev_pass) || data->skip_test)
+ if ((data->skip_previous && !data->prev_pass) || data->skip_test || data->pass_test)
{
- data->skip_count ++;
+ if (!data->pass_test)
+ data->skip_count ++;
ippDelete(request);
request = NULL;
response = NULL;
- if (data->output == _CUPS_OUTPUT_PLIST)
+ if (data->output == IPPTOOL_OUTPUT_PLIST)
{
cupsFilePuts(data->outfile, "<key>Successful</key>\n");
cupsFilePuts(data->outfile, "<true />\n");
cupsFilePuts(data->outfile, "<key>Skipped</key>\n");
- cupsFilePuts(data->outfile, "<true />\n");
+ if (data->pass_test)
+ cupsFilePuts(data->outfile, "<false />\n");
+ else
+ cupsFilePuts(data->outfile, "<true />\n");
cupsFilePuts(data->outfile, "<key>StatusCode</key>\n");
- print_xml_string(data->outfile, "string", "skip");
+ if (data->pass_test)
+ print_xml_string(data->outfile, "string", "pass");
+ else
+ print_xml_string(data->outfile, "string", "skip");
cupsFilePuts(data->outfile, "<key>ResponseAttributes</key>\n");
cupsFilePuts(data->outfile, "<dict />\n");
}
- if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
- cupsFilePuts(cupsFileStdout(), "SKIP]\n");
+ if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
+ {
+ if (data->pass_test)
+ cupsFilePuts(cupsFileStdout(), "PASS]\n");
+ else
+ cupsFilePuts(cupsFileStdout(), "SKIP]\n");
+ }
goto skip_error;
}
- vars->password_tries = 0;
+ data->vars->password_tries = 0;
do
{
@@ -1015,7 +1318,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
status = HTTP_STATUS_OK;
- if (data->transfer == _CUPS_TRANSFER_CHUNKED || (data->transfer == _CUPS_TRANSFER_AUTO && data->file[0]))
+ if (data->transfer == IPPTOOL_TRANSFER_CHUNKED || (data->transfer == IPPTOOL_TRANSFER_AUTO && data->file[0]))
{
/*
* Send request using chunking - a 0 length means "chunk".
@@ -1056,6 +1359,8 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
{
while (!response && !Cancel && data->prev_pass)
{
+ ippSetRequestId(request, ++ data->request_id);
+
status = cupsSendRequest(data->http, request, data->resource, length);
#ifdef HAVE_LIBZ
@@ -1185,16 +1490,16 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
if ((attrptr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) != NULL)
{
snprintf(temp, sizeof(temp), "%d", ippGetInteger(attrptr, 0));
- _ippVarsSet(vars, "job-id", temp);
+ _ippVarsSet(data->vars, "job-id", temp);
}
if ((attrptr = ippFindAttribute(response, "job-uri", IPP_TAG_URI)) != NULL)
- _ippVarsSet(vars, "job-uri", ippGetString(attrptr, 0, NULL));
+ _ippVarsSet(data->vars, "job-uri", ippGetString(attrptr, 0, NULL));
if ((attrptr = ippFindAttribute(response, "notify-subscription-id", IPP_TAG_INTEGER)) != NULL)
{
snprintf(temp, sizeof(temp), "%d", ippGetInteger(attrptr, 0));
- _ippVarsSet(vars, "notify-subscription-id", temp);
+ _ippVarsSet(data->vars, "notify-subscription-id", temp);
}
/*
@@ -1212,27 +1517,27 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
major = ippGetVersion(response, &minor);
if (major != (data->version / 10) || minor != (data->version % 10))
- add_stringf(data->errors, "Bad version %d.%d in response - expected %d.%d (RFC 2911 section 3.1.8).", major, minor, data->version / 10, data->version % 10);
+ add_stringf(data->errors, "Bad version %d.%d in response - expected %d.%d (RFC 8011 section 4.1.8).", major, minor, data->version / 10, data->version % 10);
}
if (ippGetRequestId(response) != data->request_id)
- add_stringf(data->errors, "Bad request ID %d in response - expected %d (RFC 2911 section 3.1.1)", ippGetRequestId(response), data->request_id);
+ add_stringf(data->errors, "Bad request ID %d in response - expected %d (RFC 8011 section 4.1.1)", ippGetRequestId(response), data->request_id);
attrptr = ippFirstAttribute(response);
if (!attrptr)
{
- add_stringf(data->errors, "Missing first attribute \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 2911 section 3.1.4).");
+ add_stringf(data->errors, "Missing first attribute \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 8011 section 4.1.4).");
}
else
{
if (!ippGetName(attrptr) || ippGetValueTag(attrptr) != IPP_TAG_CHARSET || ippGetGroupTag(attrptr) != IPP_TAG_OPERATION || ippGetCount(attrptr) != 1 ||strcmp(ippGetName(attrptr), "attributes-charset"))
- add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 2911 section 3.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr)));
+ add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 8011 section 4.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr)));
attrptr = ippNextAttribute(response);
if (!attrptr)
- add_stringf(data->errors, "Missing second attribute \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 2911 section 3.1.4).");
+ add_stringf(data->errors, "Missing second attribute \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 8011 section 4.1.4).");
else if (!ippGetName(attrptr) || ippGetValueTag(attrptr) != IPP_TAG_LANGUAGE || ippGetGroupTag(attrptr) != IPP_TAG_OPERATION || ippGetCount(attrptr) != 1 || strcmp(ippGetName(attrptr), "attributes-natural-language"))
- add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 2911 section 3.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr)));
+ add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 8011 section 4.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr)));
}
if ((attrptr = ippFindAttribute(response, "status-message", IPP_TAG_ZERO)) != NULL)
@@ -1241,13 +1546,13 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
/* String value */
if (ippGetValueTag(attrptr) != IPP_TAG_TEXT)
- add_stringf(data->errors, "status-message (text(255)) has wrong value tag %s (RFC 2911 section 3.1.6.2).", ippTagString(ippGetValueTag(attrptr)));
+ add_stringf(data->errors, "status-message (text(255)) has wrong value tag %s (RFC 8011 section 4.1.6.2).", ippTagString(ippGetValueTag(attrptr)));
if (ippGetGroupTag(attrptr) != IPP_TAG_OPERATION)
- add_stringf(data->errors, "status-message (text(255)) has wrong group tag %s (RFC 2911 section 3.1.6.2).", ippTagString(ippGetGroupTag(attrptr)));
+ add_stringf(data->errors, "status-message (text(255)) has wrong group tag %s (RFC 8011 section 4.1.6.2).", ippTagString(ippGetGroupTag(attrptr)));
if (ippGetCount(attrptr) != 1)
- add_stringf(data->errors, "status-message (text(255)) has %d values (RFC 2911 section 3.1.6.2).", ippGetCount(attrptr));
+ add_stringf(data->errors, "status-message (text(255)) has %d values (RFC 8011 section 4.1.6.2).", ippGetCount(attrptr));
if (status_message && strlen(status_message) > 255)
- add_stringf(data->errors, "status-message (text(255)) has bad length %d (RFC 2911 section 3.1.6.2).", (int)strlen(status_message));
+ add_stringf(data->errors, "status-message (text(255)) has bad length %d (RFC 8011 section 4.1.6.2).", (int)strlen(status_message));
}
if ((attrptr = ippFindAttribute(response, "detailed-status-message",
@@ -1257,25 +1562,13 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
/* String value */
if (ippGetValueTag(attrptr) != IPP_TAG_TEXT)
- add_stringf(data->errors,
- "detailed-status-message (text(MAX)) has wrong "
- "value tag %s (RFC 2911 section 3.1.6.3).",
- ippTagString(ippGetValueTag(attrptr)));
+ add_stringf(data->errors, "detailed-status-message (text(MAX)) has wrong value tag %s (RFC 8011 section 4.1.6.3).", ippTagString(ippGetValueTag(attrptr)));
if (ippGetGroupTag(attrptr) != IPP_TAG_OPERATION)
- add_stringf(data->errors,
- "detailed-status-message (text(MAX)) has wrong "
- "group tag %s (RFC 2911 section 3.1.6.3).",
- ippTagString(ippGetGroupTag(attrptr)));
+ add_stringf(data->errors, "detailed-status-message (text(MAX)) has wrong group tag %s (RFC 8011 section 4.1.6.3).", ippTagString(ippGetGroupTag(attrptr)));
if (ippGetCount(attrptr) != 1)
- add_stringf(data->errors,
- "detailed-status-message (text(MAX)) has %d values"
- " (RFC 2911 section 3.1.6.3).",
- ippGetCount(attrptr));
+ add_stringf(data->errors, "detailed-status-message (text(MAX)) has %d values (RFC 8011 section 4.1.6.3).", ippGetCount(attrptr));
if (detailed_status_message && strlen(detailed_status_message) > 1023)
- add_stringf(data->errors,
- "detailed-status-message (text(MAX)) has bad "
- "length %d (RFC 2911 section 3.1.6.3).",
- (int)strlen(detailed_status_message));
+ add_stringf(data->errors, "detailed-status-message (text(MAX)) has bad length %d (RFC 8011 section 4.1.6.3).", (int)strlen(detailed_status_message));
}
a = cupsArrayNew((cups_array_func_t)strcmp, NULL);
@@ -1321,9 +1614,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
}
if (out_of_order)
- add_stringf(data->errors, "Attribute groups out of order (%s < %s)",
- ippTagString(ippGetGroupTag(attrptr)),
- ippTagString(group));
+ add_stringf(data->errors, "Attribute groups out of order (%s < %s)", ippTagString(ippGetGroupTag(attrptr)), ippTagString(group));
if (ippGetGroupTag(attrptr) != IPP_TAG_ZERO)
group = ippGetGroupTag(attrptr);
@@ -1334,9 +1625,8 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
if (ippGetName(attrptr))
{
- if (cupsArrayFind(a, (void *)ippGetName(attrptr)) && data->output < _CUPS_OUTPUT_LIST)
- add_stringf(data->errors, "Duplicate \"%s\" attribute in %s group",
- ippGetName(attrptr), ippTagString(group));
+ if (cupsArrayFind(a, (void *)ippGetName(attrptr)) && data->output < IPPTOOL_OUTPUT_LIST)
+ add_stringf(data->errors, "Duplicate \"%s\" attribute in %s group", ippGetName(attrptr), ippTagString(group));
cupsArrayAdd(a, (void *)ippGetName(attrptr));
}
@@ -1349,14 +1639,21 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
* values...
*/
+ if (ippGetStatusCode(response) == IPP_STATUS_ERROR_BUSY && data->repeat_on_busy)
+ {
+ // Repeat on a server-error-busy status code...
+ status_ok = 1;
+ repeat_test = 1;
+ }
+
for (i = 0, status_ok = 0; i < data->num_statuses; i ++)
{
if (data->statuses[i].if_defined &&
- !_ippVarsGet(vars, data->statuses[i].if_defined))
+ !_ippVarsGet(data->vars, data->statuses[i].if_defined))
continue;
if (data->statuses[i].if_not_defined &&
- _ippVarsGet(vars, data->statuses[i].if_not_defined))
+ _ippVarsGet(data->vars, data->statuses[i].if_not_defined))
continue;
if (ippGetStatusCode(response) == data->statuses[i].status)
@@ -1367,7 +1664,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
repeat_test = 1;
if (data->statuses[i].define_match)
- _ippVarsSet(vars, data->statuses[i].define_match, "1");
+ _ippVarsSet(data->vars, data->statuses[i].define_match, "1");
}
else
{
@@ -1376,7 +1673,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
if (data->statuses[i].define_no_match)
{
- _ippVarsSet(vars, data->statuses[i].define_no_match, "1");
+ _ippVarsSet(data->vars, data->statuses[i].define_no_match, "1");
status_ok = 1;
}
}
@@ -1387,21 +1684,18 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
for (i = 0; i < data->num_statuses; i ++)
{
if (data->statuses[i].if_defined &&
- !_ippVarsGet(vars, data->statuses[i].if_defined))
+ !_ippVarsGet(data->vars, data->statuses[i].if_defined))
continue;
if (data->statuses[i].if_not_defined &&
- _ippVarsGet(vars, data->statuses[i].if_not_defined))
+ _ippVarsGet(data->vars, data->statuses[i].if_not_defined))
continue;
if (!data->statuses[i].repeat_match || repeat_count >= data->statuses[i].repeat_limit)
- add_stringf(data->errors, "EXPECTED: STATUS %s (got %s)",
- ippErrorString(data->statuses[i].status),
- ippErrorString(cupsLastError()));
+ add_stringf(data->errors, "EXPECTED: STATUS %s (got %s)", ippErrorString(data->statuses[i].status), ippErrorString(cupsLastError()));
}
- if ((attrptr = ippFindAttribute(response, "status-message",
- IPP_TAG_TEXT)) != NULL)
+ if ((attrptr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT)) != NULL)
add_stringf(data->errors, "status-message=\"%s\"", ippGetString(attrptr, 0, NULL));
}
@@ -1409,11 +1703,11 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
{
ipp_attribute_t *group_found; /* Found parent attribute for group tests */
- if (expect->if_defined && !_ippVarsGet(vars, expect->if_defined))
+ if (expect->if_defined && !_ippVarsGet(data->vars, expect->if_defined))
continue;
if (expect->if_not_defined &&
- _ippVarsGet(vars, expect->if_not_defined))
+ _ippVarsGet(data->vars, expect->if_not_defined))
continue;
if ((found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO)) != NULL && expect->in_group && expect->in_group != ippGetGroupTag(found))
@@ -1441,11 +1735,12 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
if ((found && expect->not_expect) ||
(!found && !(expect->not_expect || expect->optional)) ||
- (found && !expect_matches(expect, ippGetValueTag(found))) ||
- (group_found && expect->in_group && ippGetGroupTag(group_found) != expect->in_group))
+ (found && !expect_matches(expect, found)) ||
+ (group_found && expect->in_group && ippGetGroupTag(group_found) != expect->in_group) ||
+ (expect->with_distinct && !with_distinct_values(NULL, found)))
{
if (expect->define_no_match)
- _ippVarsSet(vars, expect->define_no_match, "1");
+ _ippVarsSet(data->vars, expect->define_no_match, "1");
else if (!expect->define_match && !expect->define_value)
{
if (found && expect->not_expect && !expect->with_value && !expect->with_value_from)
@@ -1454,7 +1749,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
add_stringf(data->errors, "EXPECTED: %s", expect->name);
else if (found)
{
- if (!expect_matches(expect, ippGetValueTag(found)))
+ if (!expect_matches(expect, found))
add_stringf(data->errors, "EXPECTED: %s OF-TYPE %s (got %s)",
expect->name, expect->of_type,
ippTagString(ippGetValueTag(found)));
@@ -1463,6 +1758,9 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
add_stringf(data->errors, "EXPECTED: %s IN-GROUP %s (got %s).",
expect->name, ippTagString(expect->in_group),
ippTagString(ippGetGroupTag(group_found)));
+
+ if (expect->with_distinct)
+ with_distinct_values(data->errors, found);
}
}
@@ -1477,7 +1775,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
if (found && expect->with_value_from && !with_value_from(NULL, ippFindAttribute(response, expect->with_value_from, IPP_TAG_ZERO), found, buffer, sizeof(buffer)))
{
if (expect->define_no_match)
- _ippVarsSet(vars, expect->define_no_match, "1");
+ _ippVarsSet(data->vars, expect->define_no_match, "1");
else if (!expect->define_match && !expect->define_value && ((!expect->repeat_match && !expect->repeat_no_match) || repeat_count >= expect->repeat_limit))
{
add_stringf(data->errors, "EXPECTED: %s WITH-VALUES-FROM %s", expect->name, expect->with_value_from);
@@ -1493,11 +1791,11 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
else if (found && !with_value(data, NULL, expect->with_value, expect->with_flags, found, buffer, sizeof(buffer)))
{
if (expect->define_no_match)
- _ippVarsSet(vars, expect->define_no_match, "1");
+ _ippVarsSet(data->vars, expect->define_no_match, "1");
else if (!expect->define_match && !expect->define_value &&
!expect->repeat_match && (!expect->repeat_no_match || repeat_count >= expect->repeat_limit))
{
- if (expect->with_flags & _CUPS_WITH_REGEX)
+ if (expect->with_flags & IPPTOOL_WITH_REGEX)
add_stringf(data->errors, "EXPECTED: %s %s /%s/", expect->name, with_flags_string(expect->with_flags), expect->with_value);
else
add_stringf(data->errors, "EXPECTED: %s %s \"%s\"", expect->name, with_flags_string(expect->with_flags), expect->with_value);
@@ -1515,11 +1813,10 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
if (found && expect->count > 0 && ippGetCount(found) != expect->count)
{
if (expect->define_no_match)
- _ippVarsSet(vars, expect->define_no_match, "1");
+ _ippVarsSet(data->vars, expect->define_no_match, "1");
else if (!expect->define_match && !expect->define_value)
{
- add_stringf(data->errors, "EXPECTED: %s COUNT %d (got %d)", expect->name,
- expect->count, ippGetCount(found));
+ add_stringf(data->errors, "EXPECTED: %s COUNT %d (got %d)", expect->name, expect->count, ippGetCount(found));
}
if (expect->repeat_no_match &&
@@ -1537,19 +1834,13 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
if (!attrptr || ippGetCount(attrptr) != ippGetCount(found))
{
if (expect->define_no_match)
- _ippVarsSet(vars, expect->define_no_match, "1");
+ _ippVarsSet(data->vars, expect->define_no_match, "1");
else if (!expect->define_match && !expect->define_value)
{
if (!attrptr)
- add_stringf(data->errors,
- "EXPECTED: %s (%d values) SAME-COUNT-AS %s "
- "(not returned)", expect->name,
- ippGetCount(found), expect->same_count_as);
+ add_stringf(data->errors, "EXPECTED: %s (%d values) SAME-COUNT-AS %s (not returned)", expect->name, ippGetCount(found), expect->same_count_as);
else if (ippGetCount(attrptr) != ippGetCount(found))
- add_stringf(data->errors,
- "EXPECTED: %s (%d values) SAME-COUNT-AS %s "
- "(%d values)", expect->name, ippGetCount(found),
- expect->same_count_as, ippGetCount(attrptr));
+ add_stringf(data->errors, "EXPECTED: %s (%d values) SAME-COUNT-AS %s (%d values)", expect->name, ippGetCount(found), expect->same_count_as, ippGetCount(attrptr));
}
if (expect->repeat_no_match &&
@@ -1560,8 +1851,11 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
}
}
+ if (found && expect->display_match && (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())))
+ cupsFilePrintf(cupsFileStdout(), "\n%s\n\n", expect->display_match);
+
if (found && expect->define_match)
- _ippVarsSet(vars, expect->define_match, "1");
+ _ippVarsSet(data->vars, expect->define_match, "1");
if (found && expect->define_value)
{
@@ -1618,7 +1912,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
}
}
- _ippVarsSet(vars, expect->define_value, buffer);
+ _ippVarsSet(data->vars, expect->define_value, buffer);
}
if (found && expect->repeat_match &&
@@ -1635,7 +1929,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
if (repeat_test)
{
- if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
+ if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
{
cupsFilePrintf(cupsFileStdout(), "%04d]\n", repeat_count);
\
@@ -1650,7 +1944,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
{
if (!strcmp(data->displayed[i], attrname))
{
- print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL);
+ print_attr(cupsFileStdout(), IPPTOOL_OUTPUT_TEST, attrptr, NULL);
break;
}
}
@@ -1659,7 +1953,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
}
}
- if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
+ if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
{
cupsFilePrintf(cupsFileStdout(), " %-68.68s [", data->name);
}
@@ -1682,7 +1976,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
else
data->fail_count ++;
- if (data->output == _CUPS_OUTPUT_PLIST)
+ if (data->output == IPPTOOL_OUTPUT_PLIST)
{
cupsFilePuts(data->outfile, "<key>Successful</key>\n");
cupsFilePuts(data->outfile, data->prev_pass ? "<true />\n" : "<false />\n");
@@ -1698,7 +1992,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
cupsFilePuts(data->outfile, "</dict>\n");
cupsFilePuts(data->outfile, "</array>\n");
}
- else if (data->output == _CUPS_OUTPUT_IPPSERVER && response)
+ else if (data->output == IPPTOOL_OUTPUT_IPPSERVER && response)
{
for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response))
{
@@ -1709,7 +2003,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
}
}
- if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
+ if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
{
cupsFilePuts(cupsFileStdout(), data->prev_pass ? "PASS]\n" : "FAIL]\n");
@@ -1721,14 +2015,14 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
if (data->verbosity && response)
{
for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response))
- print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL);
+ print_attr(cupsFileStdout(), IPPTOOL_OUTPUT_TEST, attrptr, NULL);
}
}
}
- else if (!data->prev_pass && data->output != _CUPS_OUTPUT_QUIET)
+ else if (!data->prev_pass && data->output != IPPTOOL_OUTPUT_QUIET)
fprintf(stderr, "%s\n", cupsLastErrorString());
- if (data->prev_pass && data->output >= _CUPS_OUTPUT_LIST && !data->verbosity && data->num_displayed > 0)
+ if (data->prev_pass && data->output >= IPPTOOL_OUTPUT_LIST && !data->verbosity && data->num_displayed > 0)
{
size_t width; /* Length of value */
@@ -1746,7 +2040,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
}
}
- if (data->output == _CUPS_OUTPUT_CSV)
+ if (data->output == IPPTOOL_OUTPUT_CSV)
print_csv(data, NULL, NULL, data->num_displayed, data->displayed, widths);
else
print_line(data, NULL, NULL, data->num_displayed, data->displayed, widths);
@@ -1760,10 +2054,10 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
if (attrptr)
{
- if (data->output == _CUPS_OUTPUT_CSV)
- print_csv(data, response, attrptr, data->num_displayed, data->displayed, widths);
+ if (data->output == IPPTOOL_OUTPUT_CSV)
+ attrptr = print_csv(data, response, attrptr, data->num_displayed, data->displayed, widths);
else
- print_line(data, response, attrptr, data->num_displayed, data->displayed, widths);
+ attrptr = print_line(data, response, attrptr, data->num_displayed, data->displayed, widths);
while (attrptr && ippGetGroupTag(attrptr) > IPP_TAG_OPERATION)
attrptr = ippNextAttribute(response);
@@ -1772,7 +2066,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
}
else if (!data->prev_pass)
{
- if (data->output == _CUPS_OUTPUT_PLIST)
+ if (data->output == IPPTOOL_OUTPUT_PLIST)
{
cupsFilePuts(data->outfile, "<key>Errors</key>\n");
cupsFilePuts(data->outfile, "<array>\n");
@@ -1785,7 +2079,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
cupsFilePuts(data->outfile, "</array>\n");
}
- if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
+ if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
{
for (error = (char *)cupsArrayFirst(data->errors);
error;
@@ -1794,7 +2088,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
}
}
- if (data->num_displayed > 0 && !data->verbosity && response && (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())))
+ if (data->num_displayed > 0 && !data->verbosity && response && (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())))
{
for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response))
{
@@ -1814,7 +2108,13 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
skip_error:
- if (data->output == _CUPS_OUTPUT_PLIST)
+ if (data->monitor_thread)
+ {
+ data->monitor_done = 1;
+ _cupsThreadWait(data->monitor_thread);
+ }
+
+ if (data->output == IPPTOOL_OUTPUT_PLIST)
cupsFilePuts(data->outfile, "</dict>\n");
ippDelete(response);
@@ -1822,36 +2122,25 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
for (i = 0; i < data->num_statuses; i ++)
{
- if (data->statuses[i].if_defined)
- free(data->statuses[i].if_defined);
- if (data->statuses[i].if_not_defined)
- free(data->statuses[i].if_not_defined);
- if (data->statuses[i].define_match)
- free(data->statuses[i].define_match);
- if (data->statuses[i].define_no_match)
- free(data->statuses[i].define_no_match);
+ free(data->statuses[i].if_defined);
+ free(data->statuses[i].if_not_defined);
+ free(data->statuses[i].define_match);
+ free(data->statuses[i].define_no_match);
}
data->num_statuses = 0;
for (i = data->num_expects, expect = data->expects; i > 0; i --, expect ++)
{
free(expect->name);
- if (expect->of_type)
- free(expect->of_type);
- if (expect->same_count_as)
- free(expect->same_count_as);
- if (expect->if_defined)
- free(expect->if_defined);
- if (expect->if_not_defined)
- free(expect->if_not_defined);
- if (expect->with_value)
- free(expect->with_value);
- if (expect->define_match)
- free(expect->define_match);
- if (expect->define_no_match)
- free(expect->define_no_match);
- if (expect->define_value)
- free(expect->define_value);
+ free(expect->of_type);
+ free(expect->same_count_as);
+ free(expect->if_defined);
+ free(expect->if_not_defined);
+ free(expect->with_value);
+ free(expect->define_match);
+ free(expect->define_no_match);
+ free(expect->define_value);
+ free(expect->display_match);
}
data->num_expects = 0;
@@ -1859,6 +2148,24 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
free(data->displayed[i]);
data->num_displayed = 0;
+ free(data->monitor_uri);
+ data->monitor_uri = NULL;
+
+ for (i = data->num_monitor_expects, expect = data->monitor_expects; i > 0; i --, expect ++)
+ {
+ free(expect->name);
+ free(expect->of_type);
+ free(expect->same_count_as);
+ free(expect->if_defined);
+ free(expect->if_not_defined);
+ free(expect->with_value);
+ free(expect->define_match);
+ free(expect->define_no_match);
+ free(expect->define_value);
+ free(expect->display_match);
+ }
+ data->num_monitor_expects = 0;
+
return (data->ignore_errors || data->prev_pass);
}
@@ -1868,9 +2175,8 @@ do_test(_ipp_file_t *f, /* I - IPP data file */
*/
static int /* O - 1 on success, 0 on failure */
-do_tests(const char *testfile, /* I - Test file to use */
- _ipp_vars_t *vars, /* I - Variables */
- _cups_testdata_t *data) /* I - Test data */
+do_tests(const char *testfile, /* I - Test file to use */
+ ipptool_test_t *data) /* I - Test data */
{
http_encryption_t encryption; /* Encryption mode */
@@ -1879,14 +2185,14 @@ do_tests(const char *testfile, /* I - Test file to use */
* Connect to the printer/server...
*/
- if (!_cups_strcasecmp(vars->scheme, "https") || !_cups_strcasecmp(vars->scheme, "ipps"))
+ if (!_cups_strcasecmp(data->vars->scheme, "https") || !_cups_strcasecmp(data->vars->scheme, "ipps") || data->vars->port == 443)
encryption = HTTP_ENCRYPTION_ALWAYS;
else
encryption = data->encryption;
- if ((data->http = httpConnect2(vars->host, vars->port, NULL, data->family, encryption, 1, 30000, NULL)) == NULL)
+ if ((data->http = httpConnect2(data->vars->host, data->vars->port, NULL, data->family, encryption, 1, 30000, NULL)) == NULL)
{
- print_fatal_error(data, "Unable to connect to \"%s\" on port %d - %s", vars->host, vars->port, cupsLastErrorString());
+ print_fatal_error(data, "Unable to connect to \"%s\" on port %d - %s", data->vars->host, data->vars->port, cupsLastErrorString());
return (0);
}
@@ -1903,7 +2209,7 @@ do_tests(const char *testfile, /* I - Test file to use */
* Run tests...
*/
- _ippFileParse(vars, testfile, (void *)data);
+ _ippFileParse(data->vars, testfile, (void *)data);
/*
* Close connection and return...
@@ -1922,7 +2228,7 @@ do_tests(const char *testfile, /* I - Test file to use */
static int /* O - 1 to continue, 0 to stop */
error_cb(_ipp_file_t *f, /* I - IPP file data */
- _cups_testdata_t *data, /* I - Test data */
+ ipptool_test_t *data, /* I - Test data */
const char *error) /* I - Error message */
{
(void)f;
@@ -1939,13 +2245,18 @@ error_cb(_ipp_file_t *f, /* I - IPP file data */
static int /* O - 1 if matches, 0 otherwise */
expect_matches(
- _cups_expect_t *expect, /* I - Expected attribute */
- ipp_tag_t value_tag) /* I - Value tag for attribute */
+ ipptool_expect_t *expect, /* I - Expected attribute */
+ ipp_attribute_t *attr) /* I - Attribute */
{
- int match; /* Match? */
- char *of_type, /* Type name to match */
- *next, /* Next name to match */
- sep; /* Separator character */
+ int i, /* Looping var */
+ count, /* Number of values */
+ match; /* Match? */
+ char *of_type, /* Type name to match */
+ *paren, /* Pointer to opening parenthesis */
+ *next, /* Next name to match */
+ sep; /* Separator character */
+ ipp_tag_t value_tag; /* Syntax/value tag */
+ int lower, upper; /* Lower and upper bounds for syntax */
/*
@@ -1960,6 +2271,9 @@ expect_matches(
* types separated by "," or "|"...
*/
+ value_tag = ippGetValueTag(attr);
+ count = ippGetCount(attr);
+
for (of_type = expect->of_type, match = 0; !match && *of_type; of_type = next)
{
/*
@@ -1975,19 +2289,154 @@ expect_matches(
* Support some meta-types to make it easier to write the test file.
*/
+ if ((paren = strchr(of_type, '(')) != NULL)
+ {
+ char *ptr; // Pointer into syntax string
+
+ *paren = '\0';
+
+ if (!strncmp(paren + 1, "MIN:", 4))
+ {
+ lower = INT_MIN;
+ ptr = paren + 5;
+ }
+ else if ((ptr = strchr(paren + 1, ':')) != NULL)
+ {
+ lower = atoi(paren + 1);
+ }
+ else
+ {
+ lower = 0;
+ ptr = paren + 1;
+ }
+
+ if (!strcmp(ptr, "MAX)"))
+ upper = INT_MAX;
+ else
+ upper = atoi(ptr);
+ }
+ else
+ {
+ lower = INT_MIN;
+ upper = INT_MAX;
+ }
+
if (!strcmp(of_type, "text"))
- match = value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_TEXT;
+ {
+ if (upper == INT_MAX)
+ upper = 1023;
+
+ if (value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_TEXT)
+ {
+ for (i = 0; i < count; i ++)
+ {
+ if (strlen(ippGetString(attr, i, NULL)) > (size_t)upper)
+ break;
+ }
+
+ match = (i == count);
+ }
+ }
else if (!strcmp(of_type, "name"))
- match = value_tag == IPP_TAG_NAMELANG || value_tag == IPP_TAG_NAME;
+ {
+ if (upper == INT_MAX)
+ upper = 255;
+
+ if (value_tag == IPP_TAG_NAMELANG || value_tag == IPP_TAG_NAME)
+ {
+ for (i = 0; i < count; i ++)
+ {
+ if (strlen(ippGetString(attr, i, NULL)) > (size_t)upper)
+ break;
+ }
+
+ match = (i == count);
+ }
+ }
else if (!strcmp(of_type, "collection"))
+ {
match = value_tag == IPP_TAG_BEGIN_COLLECTION;
- else
- match = value_tag == ippTagValue(of_type);
+ }
+ else if (value_tag == ippTagValue(of_type))
+ {
+ switch (value_tag)
+ {
+ case IPP_TAG_KEYWORD :
+ case IPP_TAG_URI :
+ if (upper == INT_MAX)
+ {
+ if (value_tag == IPP_TAG_KEYWORD)
+ upper = 255;
+ else
+ upper = 1023;
+ }
+
+ for (i = 0; i < count; i ++)
+ {
+ if (strlen(ippGetString(attr, i, NULL)) > (size_t)upper)
+ break;
+ }
+
+ match = (i == count);
+ break;
+
+ case IPP_TAG_STRING :
+ if (upper == INT_MAX)
+ upper = 1023;
+
+ for (i = 0; i < count; i ++)
+ {
+ int datalen; // Length of octetString value
+
+ ippGetOctetString(attr, i, &datalen);
+
+ if (datalen > upper)
+ break;
+ }
+
+ match = (i == count);
+ break;
+
+ case IPP_TAG_INTEGER :
+ for (i = 0; i < count; i ++)
+ {
+ int value = ippGetInteger(attr, i);
+ // Integer value
+
+ if (value < lower || value > upper)
+ break;
+ }
+
+ match = (i == count);
+ break;
+
+ case IPP_TAG_RANGE :
+ for (i = 0; i < count; i ++)
+ {
+ int vupper, vlower = ippGetRange(attr, i, &vupper);
+ // Range value
+
+ if (vlower < lower || vlower > upper || vupper < lower || vupper > upper)
+ break;
+ }
+
+ match = (i == count);
+ break;
+
+ default :
+ // No other constraints, so this is a match
+ match = 1;
+ break;
+ }
+ }
/*
- * Restore the separator if we have one...
+ * Restore the separators if we have them...
*/
+ if (paren)
+ *paren = '(';
+
if (sep)
*next++ = sep;
}
@@ -2047,6 +2496,21 @@ get_filename(const char *testfile, /* I - Current test file */
dstptr = dst; /* Should never happen */
strlcpy(dstptr, src, dstsize - (size_t)(dstptr - dst));
+
+#if _WIN32
+ if (_access(dst, 0))
+ {
+ /*
+ * Not available relative to the testfile, see if it can be found on the
+ * desktop...
+ */
+ const char *userprofile = getenv("USERPROFILE");
+ /* User home directory */
+
+ if (userprofile)
+ snprintf(dst, dstsize, "%s/Desktop/%s", userprofile, src);
+ }
+#endif /* _WIN32 */
}
return (dst);
@@ -2075,7 +2539,7 @@ get_string(ipp_attribute_t *attr, /* I - IPP attribute */
value = ippGetString(attr, element, NULL);
- if (flags & _CUPS_WITH_HOSTNAME)
+ if (flags & IPPTOOL_WITH_HOSTNAME)
{
if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), buffer, (int)bufsize, &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
buffer[0] = '\0';
@@ -2086,14 +2550,14 @@ get_string(ipp_attribute_t *attr, /* I - IPP attribute */
return (buffer);
}
- else if (flags & _CUPS_WITH_RESOURCE)
+ else if (flags & IPPTOOL_WITH_RESOURCE)
{
if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, buffer, (int)bufsize) < HTTP_URI_STATUS_OK)
buffer[0] = '\0';
return (buffer);
}
- else if (flags & _CUPS_WITH_SCHEME)
+ else if (flags & IPPTOOL_WITH_SCHEME)
{
if (httpSeparateURI(HTTP_URI_CODING_ALL, value, buffer, (int)bufsize, userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
buffer[0] = '\0';
@@ -2136,19 +2600,19 @@ get_string(ipp_attribute_t *attr, /* I - IPP attribute */
*/
static void
-init_data(_cups_testdata_t *data) /* I - Data */
+init_data(ipptool_test_t *data) /* I - Data */
{
- memset(data, 0, sizeof(_cups_testdata_t));
+ memset(data, 0, sizeof(ipptool_test_t));
- data->output = _CUPS_OUTPUT_LIST;
+ data->output = IPPTOOL_OUTPUT_LIST;
data->outfile = cupsFileStdout();
data->family = AF_UNSPEC;
- data->def_transfer = _CUPS_TRANSFER_AUTO;
+ data->def_transfer = IPPTOOL_TRANSFER_AUTO;
data->def_version = 11;
data->errors = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
data->pass = 1;
data->prev_pass = 1;
- data->request_id = (CUPS_RAND() % 1000) * 137 + 1;
+ data->request_id = (CUPS_RAND() % 1000) * 137;
data->show_header = 1;
}
@@ -2178,6 +2642,442 @@ iso_date(const ipp_uchar_t *date) /* I - IPP (RFC 1903) date/time value */
/*
+ * 'parse_monitor_printer_state()' - Parse the MONITOR-PRINTER-STATE directive.
+ *
+ * MONITOR-PRINTER-STATE [printer-uri] {
+ * DELAY nnn
+ * EXPECT attribute-name ...
+ * }
+ */
+
+static int /* O - 1 to continue, 0 to stop */
+parse_monitor_printer_state(
+ _ipp_file_t *f, /* I - IPP file data */
+ ipptool_test_t *data) /* I - Test data */
+{
+ char token[256], /* Token string */
+ name[1024], /* Name string */
+ temp[1024], /* Temporary string */
+ value[1024], /* Value string */
+ *ptr; /* Pointer into value */
+
+
+ if (!_ippFileReadToken(f, temp, sizeof(temp)))
+ {
+ print_fatal_error(data, "Missing printer URI on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ if (strcmp(temp, "{"))
+ {
+ // Got a printer URI so copy it...
+ _ippVarsExpand(data->vars, value, temp, sizeof(value));
+ data->monitor_uri = strdup(value);
+
+ // Then see if we have an opening brace...
+ if (!_ippFileReadToken(f, temp, sizeof(temp)) || strcmp(temp, "{"))
+ {
+ print_fatal_error(data, "Missing opening brace on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+ }
+ else
+ {
+ // Use the default printer URI...
+ data->monitor_uri = strdup(data->vars->uri);
+ }
+
+ // Loop until we get a closing brace...
+ while (_ippFileReadToken(f, token, sizeof(token)))
+ {
+ if (_cups_strcasecmp(token, "COUNT") &&
+ _cups_strcasecmp(token, "DEFINE-MATCH") &&
+ _cups_strcasecmp(token, "DEFINE-NO-MATCH") &&
+ _cups_strcasecmp(token, "DEFINE-VALUE") &&
+ _cups_strcasecmp(token, "DISPLAY-MATCH") &&
+ _cups_strcasecmp(token, "IF-DEFINED") &&
+ _cups_strcasecmp(token, "IF-NOT-DEFINED") &&
+ _cups_strcasecmp(token, "IN-GROUP") &&
+ _cups_strcasecmp(token, "OF-TYPE") &&
+ _cups_strcasecmp(token, "WITH-DISTINCT-VALUES") &&
+ _cups_strcasecmp(token, "WITH-VALUE"))
+ data->last_expect = NULL;
+
+ if (!strcmp(token, "}"))
+ return (1);
+ else if (!_cups_strcasecmp(token, "EXPECT"))
+ {
+ /*
+ * Expected attributes...
+ */
+
+ if (data->num_monitor_expects >= (int)(sizeof(data->monitor_expects) / sizeof(data->monitor_expects[0])))
+ {
+ print_fatal_error(data, "Too many EXPECT's on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ if (!_ippFileReadToken(f, name, sizeof(name)))
+ {
+ print_fatal_error(data, "Missing EXPECT name on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ data->last_expect = data->monitor_expects + data->num_monitor_expects;
+ data->num_monitor_expects ++;
+
+ memset(data->last_expect, 0, sizeof(ipptool_expect_t));
+ data->last_expect->repeat_limit = 1000;
+
+ if (name[0] == '!')
+ {
+ data->last_expect->not_expect = 1;
+ data->last_expect->name = strdup(name + 1);
+ }
+ else if (name[0] == '?')
+ {
+ data->last_expect->optional = 1;
+ data->last_expect->name = strdup(name + 1);
+ }
+ else
+ data->last_expect->name = strdup(name);
+ }
+ else if (!_cups_strcasecmp(token, "COUNT"))
+ {
+ int count; /* Count value */
+
+ if (!_ippFileReadToken(f, temp, sizeof(temp)))
+ {
+ print_fatal_error(data, "Missing COUNT number on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ if ((count = atoi(temp)) <= 0)
+ {
+ print_fatal_error(data, "Bad COUNT \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename);
+ return (0);
+ }
+
+ if (data->last_expect)
+ {
+ data->last_expect->count = count;
+ }
+ else
+ {
+ print_fatal_error(data, "COUNT without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+ }
+ else if (!_cups_strcasecmp(token, "DEFINE-MATCH"))
+ {
+ if (!_ippFileReadToken(f, temp, sizeof(temp)))
+ {
+ print_fatal_error(data, "Missing DEFINE-MATCH variable on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ if (data->last_expect)
+ {
+ data->last_expect->define_match = strdup(temp);
+ }
+ else
+ {
+ print_fatal_error(data, "DEFINE-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+ }
+ else if (!_cups_strcasecmp(token, "DEFINE-NO-MATCH"))
+ {
+ if (!_ippFileReadToken(f, temp, sizeof(temp)))
+ {
+ print_fatal_error(data, "Missing DEFINE-NO-MATCH variable on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ if (data->last_expect)
+ {
+ data->last_expect->define_no_match = strdup(temp);
+ }
+ else
+ {
+ print_fatal_error(data, "DEFINE-NO-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+ }
+ else if (!_cups_strcasecmp(token, "DEFINE-VALUE"))
+ {
+ if (!_ippFileReadToken(f, temp, sizeof(temp)))
+ {
+ print_fatal_error(data, "Missing DEFINE-VALUE variable on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ if (data->last_expect)
+ {
+ data->last_expect->define_value = strdup(temp);
+ }
+ else
+ {
+ print_fatal_error(data, "DEFINE-VALUE without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+ }
+ else if (!_cups_strcasecmp(token, "DISPLAY-MATCH"))
+ {
+ if (!_ippFileReadToken(f, temp, sizeof(temp)))
+ {
+ print_fatal_error(data, "Missing DISPLAY-MATCH message on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ if (data->last_expect)
+ {
+ data->last_expect->display_match = strdup(temp);
+ }
+ else
+ {
+ print_fatal_error(data, "DISPLAY-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+ }
+ else if (!_cups_strcasecmp(token, "DELAY"))
+ {
+ /*
+ * Delay before operation...
+ */
+
+ double dval; /* Delay value */
+
+ if (!_ippFileReadToken(f, temp, sizeof(temp)))
+ {
+ print_fatal_error(data, "Missing DELAY value on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ _ippVarsExpand(data->vars, value, temp, sizeof(value));
+
+ if ((dval = _cupsStrScand(value, &ptr, localeconv())) < 0.0 || (*ptr && *ptr != ','))
+ {
+ print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename);
+ return (0);
+ }
+
+ data->monitor_delay = (useconds_t)(1000000.0 * dval);
+
+ if (*ptr == ',')
+ {
+ if ((dval = _cupsStrScand(ptr + 1, &ptr, localeconv())) <= 0.0 || *ptr)
+ {
+ print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename);
+ return (0);
+ }
+
+ data->monitor_interval = (useconds_t)(1000000.0 * dval);
+ }
+ else
+ data->monitor_interval = data->monitor_delay;
+ }
+ else if (!_cups_strcasecmp(token, "OF-TYPE"))
+ {
+ if (!_ippFileReadToken(f, temp, sizeof(temp)))
+ {
+ print_fatal_error(data, "Missing OF-TYPE value tag(s) on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ if (data->last_expect)
+ {
+ data->last_expect->of_type = strdup(temp);
+ }
+ else
+ {
+ print_fatal_error(data, "OF-TYPE without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+ }
+ else if (!_cups_strcasecmp(token, "IN-GROUP"))
+ {
+ ipp_tag_t in_group; /* IN-GROUP value */
+
+ if (!_ippFileReadToken(f, temp, sizeof(temp)))
+ {
+ print_fatal_error(data, "Missing IN-GROUP group tag on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ if ((in_group = ippTagValue(temp)) == IPP_TAG_ZERO || in_group >= IPP_TAG_UNSUPPORTED_VALUE)
+ {
+ print_fatal_error(data, "Bad IN-GROUP group tag \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename);
+ return (0);
+ }
+ else if (data->last_expect)
+ {
+ data->last_expect->in_group = in_group;
+ }
+ else
+ {
+ print_fatal_error(data, "IN-GROUP without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+ }
+ else if (!_cups_strcasecmp(token, "IF-DEFINED"))
+ {
+ if (!_ippFileReadToken(f, temp, sizeof(temp)))
+ {
+ print_fatal_error(data, "Missing IF-DEFINED name on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ if (data->last_expect)
+ {
+ data->last_expect->if_defined = strdup(temp);
+ }
+ else
+ {
+ print_fatal_error(data, "IF-DEFINED without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+ }
+ else if (!_cups_strcasecmp(token, "IF-NOT-DEFINED"))
+ {
+ if (!_ippFileReadToken(f, temp, sizeof(temp)))
+ {
+ print_fatal_error(data, "Missing IF-NOT-DEFINED name on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ if (data->last_expect)
+ {
+ data->last_expect->if_not_defined = strdup(temp);
+ }
+ else
+ {
+ print_fatal_error(data, "IF-NOT-DEFINED without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+ }
+ else if (!_cups_strcasecmp(token, "WITH-DISTINCT-VALUES"))
+ {
+ if (data->last_expect)
+ {
+ data->last_expect->with_distinct = 1;
+ }
+ else
+ {
+ print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename);
+ return (0);
+ }
+ }
+ else if (!_cups_strcasecmp(token, "WITH-VALUE"))
+ {
+ off_t lastpos; /* Last file position */
+ int lastline; /* Last line number */
+
+ if (!_ippFileReadToken(f, temp, sizeof(temp)))
+ {
+ print_fatal_error(data, "Missing %s value on line %d of \"%s\".", token, f->linenum, f->filename);
+ return (0);
+ }
+
+ /*
+ * Read additional comma-delimited values - needed since legacy test files
+ * will have unquoted WITH-VALUE values with commas...
+ */
+
+ ptr = temp + strlen(temp);
+
+ for (;;)
+ {
+ lastpos = cupsFileTell(f->fp);
+ lastline = f->linenum;
+ ptr += strlen(ptr);
+
+ if (!_ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp))))
+ break;
+
+ if (!strcmp(ptr, ","))
+ {
+ /*
+ * Append a value...
+ */
+
+ ptr += strlen(ptr);
+
+ if (!_ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp))))
+ break;
+ }
+ else
+ {
+ /*
+ * Not another value, stop here...
+ */
+
+ cupsFileSeek(f->fp, lastpos);
+ f->linenum = lastline;
+ *ptr = '\0';
+ break;
+ }
+ }
+
+ if (data->last_expect)
+ {
+ /*
+ * Expand any variables in the value and then save it.
+ */
+
+ _ippVarsExpand(data->vars, value, temp, sizeof(value));
+
+ ptr = value + strlen(value) - 1;
+
+ if (value[0] == '/' && ptr > value && *ptr == '/')
+ {
+ /*
+ * WITH-VALUE is a POSIX extended regular expression.
+ */
+
+ data->last_expect->with_value = calloc(1, (size_t)(ptr - value));
+ data->last_expect->with_flags |= IPPTOOL_WITH_REGEX;
+
+ if (data->last_expect->with_value)
+ memcpy(data->last_expect->with_value, value + 1, (size_t)(ptr - value - 1));
+ }
+ else
+ {
+ /*
+ * WITH-VALUE is a literal value...
+ */
+
+ for (ptr = value; *ptr; ptr ++)
+ {
+ if (*ptr == '\\' && ptr[1])
+ {
+ /*
+ * Remove \ from \foo...
+ */
+
+ _cups_strcpy(ptr, ptr + 1);
+ }
+ }
+
+ data->last_expect->with_value = strdup(value);
+ data->last_expect->with_flags |= IPPTOOL_WITH_LITERAL;
+ }
+ }
+ else
+ {
+ print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename);
+ return (0);
+ }
+ }
+ }
+
+ print_fatal_error(data, "Missing closing brace on line %d of \"%s\".", f->linenum, f->filename);
+
+ return (0);
+}
+
+
+/*
* 'pause_message()' - Display the message and pause until the user presses a key.
*/
@@ -2238,7 +3138,7 @@ pause_message(const char *message) /* I - Message */
* Display the prompt...
*/
- cupsFilePrintf(cupsFileStdout(), "%s\n---- PRESS ANY KEY ----", message);
+ cupsFilePrintf(cupsFileStdout(), "\n%s\n\n---- PRESS ANY KEY ----", message);
#ifdef _WIN32
/*
@@ -2281,17 +3181,17 @@ pause_message(const char *message) /* I - Message */
*/
static void
-print_attr(cups_file_t *outfile, /* I - Output file */
- _cups_output_t output, /* I - Output format */
- ipp_attribute_t *attr, /* I - Attribute to print */
- ipp_tag_t *group) /* IO - Current group */
+print_attr(cups_file_t *outfile, /* I - Output file */
+ ipptool_output_t output, /* I - Output format */
+ ipp_attribute_t *attr, /* I - Attribute to print */
+ ipp_tag_t *group) /* IO - Current group */
{
int i, /* Looping var */
count; /* Number of values */
ipp_attribute_t *colattr; /* Collection attribute */
- if (output == _CUPS_OUTPUT_PLIST)
+ if (output == IPPTOOL_OUTPUT_PLIST)
{
if (!ippGetName(attr) || (group && *group != ippGetGroupTag(attr)))
{
@@ -2417,7 +3317,7 @@ print_attr(cups_file_t *outfile, /* I - Output file */
{
char buffer[131072]; /* Value buffer */
- if (output == _CUPS_OUTPUT_TEST)
+ if (output == IPPTOOL_OUTPUT_TEST)
{
if (!ippGetName(attr))
{
@@ -2438,21 +3338,20 @@ print_attr(cups_file_t *outfile, /* I - Output file */
* 'print_csv()' - Print a line of CSV text.
*/
-static void
+static ipp_attribute_t * /* O - Next attribute */
print_csv(
- _cups_testdata_t *data, /* I - Test data */
- ipp_t *ipp, /* I - Response message */
- ipp_attribute_t *attr, /* I - First attribute for line */
- int num_displayed, /* I - Number of attributes to display */
- char **displayed, /* I - Attributes to display */
- size_t *widths) /* I - Column widths */
+ ipptool_test_t *data, /* I - Test data */
+ ipp_t *ipp, /* I - Response message */
+ ipp_attribute_t *attr, /* I - First attribute for line */
+ int num_displayed, /* I - Number of attributes to display */
+ char **displayed, /* I - Attributes to display */
+ size_t *widths) /* I - Column widths */
{
int i; /* Looping var */
size_t maxlength; /* Max length of all columns */
- char *buffer, /* String buffer */
- *bufptr; /* Pointer into buffer */
- ipp_attribute_t *current; /* Current attribute */
-
+ ipp_attribute_t *current = attr; /* Current attribute */
+ char *values[MAX_DISPLAY], /* Strings to display */
+ *valptr; /* Pointer into value */
/*
* Get the maximum string length we have to show and allocate...
@@ -2464,63 +3363,76 @@ print_csv(
maxlength += 2;
- if ((buffer = malloc(maxlength)) == NULL)
- return;
-
/*
* Loop through the attributes to display...
*/
if (attr)
{
- for (i = 0; i < num_displayed; i ++)
- {
- if (i)
- cupsFilePutChar(data->outfile, ',');
+ // Collect the values...
+ memset(values, 0, sizeof(values));
- buffer[0] = '\0';
+ for (; current; current = ippNextAttribute(ipp))
+ {
+ if (!ippGetName(current))
+ break;
- for (current = attr; current; current = ippNextAttribute(ipp))
+ for (i = 0; i < num_displayed; i ++)
{
- if (!ippGetName(current))
- break;
- else if (!strcmp(ippGetName(current), displayed[i]))
+ if (!strcmp(ippGetName(current), displayed[i]))
{
- ippAttributeString(current, buffer, maxlength);
+ if ((values[i] = (char *)calloc(1, maxlength)) != NULL)
+ ippAttributeString(current, values[i], maxlength);
break;
- }
+ }
}
+ }
- if (strchr(buffer, ',') != NULL || strchr(buffer, '\"') != NULL ||
- strchr(buffer, '\\') != NULL)
+ // Output the line...
+ for (i = 0; i < num_displayed; i ++)
+ {
+ if (i)
+ cupsFilePutChar(data->outfile, ',');
+
+ if (!values[i])
+ continue;
+
+ if (strchr(values[i], ',') != NULL || strchr(values[i], '\"') != NULL || strchr(values[i], '\\') != NULL)
{
- cupsFilePutChar(cupsFileStdout(), '\"');
- for (bufptr = buffer; *bufptr; bufptr ++)
+ // Quoted value...
+ cupsFilePutChar(data->outfile, '\"');
+ for (valptr = values[i]; *valptr; valptr ++)
{
- if (*bufptr == '\\' || *bufptr == '\"')
- cupsFilePutChar(cupsFileStdout(), '\\');
- cupsFilePutChar(cupsFileStdout(), *bufptr);
+ if (*valptr == '\\' || *valptr == '\"')
+ cupsFilePutChar(data->outfile, '\\');
+ cupsFilePutChar(data->outfile, *valptr);
}
- cupsFilePutChar(cupsFileStdout(), '\"');
+ cupsFilePutChar(data->outfile, '\"');
}
else
- cupsFilePuts(data->outfile, buffer);
+ {
+ // Unquoted value...
+ cupsFilePuts(data->outfile, values[i]);
+ }
+
+ free(values[i]);
}
- cupsFilePutChar(cupsFileStdout(), '\n');
+ cupsFilePutChar(data->outfile, '\n');
}
else
{
+ // Show column headings...
for (i = 0; i < num_displayed; i ++)
{
if (i)
- cupsFilePutChar(cupsFileStdout(), ',');
+ cupsFilePutChar(data->outfile, ',');
cupsFilePuts(data->outfile, displayed[i]);
}
- cupsFilePutChar(cupsFileStdout(), '\n');
+ cupsFilePutChar(data->outfile, '\n');
}
- free(buffer);
+ return (current);
}
@@ -2530,7 +3442,7 @@ print_csv(
static void
print_fatal_error(
- _cups_testdata_t *data, /* I - Test data */
+ ipptool_test_t *data, /* I - Test data */
const char *s, /* I - Printf-style format string */
...) /* I - Additional arguments as needed */
{
@@ -2550,7 +3462,7 @@ print_fatal_error(
* Then output it...
*/
- if (data->output == _CUPS_OUTPUT_PLIST)
+ if (data->output == IPPTOOL_OUTPUT_PLIST)
{
print_xml_header(data);
print_xml_trailer(data, 0, buffer);
@@ -2566,7 +3478,7 @@ print_fatal_error(
static void
print_ippserver_attr(
- _cups_testdata_t *data, /* I - Test data */
+ ipptool_test_t *data, /* I - Test data */
ipp_attribute_t *attr, /* I - Attribute to print */
int indent) /* I - Indentation level */
{
@@ -2677,7 +3589,7 @@ print_ippserver_attr(
static void
print_ippserver_string(
- _cups_testdata_t *data, /* I - Test data */
+ ipptool_test_t *data, /* I - Test data */
const char *s, /* I - String to print */
size_t len) /* I - Length of string */
{
@@ -2699,9 +3611,9 @@ print_ippserver_string(
* 'print_line()' - Print a line of formatted or CSV text.
*/
-static void
+static ipp_attribute_t * /* O - Next attribute */
print_line(
- _cups_testdata_t *data, /* I - Test data */
+ ipptool_test_t *data, /* I - Test data */
ipp_t *ipp, /* I - Response message */
ipp_attribute_t *attr, /* I - First attribute for line */
int num_displayed, /* I - Number of attributes to display */
@@ -2710,8 +3622,8 @@ print_line(
{
int i; /* Looping var */
size_t maxlength; /* Max length of all columns */
- char *buffer; /* String buffer */
- ipp_attribute_t *current; /* Current attribute */
+ ipp_attribute_t *current = attr; /* Current attribute */
+ char *values[MAX_DISPLAY]; /* Strings to display */
/*
@@ -2724,61 +3636,74 @@ print_line(
maxlength += 2;
- if ((buffer = malloc(maxlength)) == NULL)
- return;
-
/*
* Loop through the attributes to display...
*/
if (attr)
{
- for (i = 0; i < num_displayed; i ++)
- {
- if (i)
- cupsFilePutChar(cupsFileStdout(), ' ');
+ // Collect the values...
+ memset(values, 0, sizeof(values));
- buffer[0] = '\0';
+ for (; current; current = ippNextAttribute(ipp))
+ {
+ if (!ippGetName(current))
+ break;
- for (current = attr; current; current = ippNextAttribute(ipp))
+ for (i = 0; i < num_displayed; i ++)
{
- if (!ippGetName(current))
- break;
- else if (!strcmp(ippGetName(current), displayed[i]))
+ if (!strcmp(ippGetName(current), displayed[i]))
{
- ippAttributeString(current, buffer, maxlength);
+ if ((values[i] = (char *)calloc(1, maxlength)) != NULL)
+ ippAttributeString(current, values[i], maxlength);
break;
- }
+ }
}
+ }
- cupsFilePrintf(data->outfile, "%*s", (int)-widths[i], buffer);
+ // Output the line...
+ for (i = 0; i < num_displayed; i ++)
+ {
+ if (i)
+ cupsFilePutChar(data->outfile, ' ');
+
+ cupsFilePrintf(data->outfile, "%*s", (int)-widths[i], values[i] ? values[i] : "");
+ free(values[i]);
}
- cupsFilePutChar(cupsFileStdout(), '\n');
+ cupsFilePutChar(data->outfile, '\n');
}
else
{
+ // Show column headings...
+ char *buffer = (char *)malloc(maxlength);
+ // Buffer for separator lines
+
+ if (!buffer)
+ return (current);
+
for (i = 0; i < num_displayed; i ++)
{
if (i)
- cupsFilePutChar(cupsFileStdout(), ' ');
+ cupsFilePutChar(data->outfile, ' ');
cupsFilePrintf(data->outfile, "%*s", (int)-widths[i], displayed[i]);
}
- cupsFilePutChar(cupsFileStdout(), '\n');
+ cupsFilePutChar(data->outfile, '\n');
for (i = 0; i < num_displayed; i ++)
{
if (i)
- cupsFilePutChar(cupsFileStdout(), ' ');
+ cupsFilePutChar(data->outfile, ' ');
memset(buffer, '-', widths[i]);
buffer[widths[i]] = '\0';
cupsFilePuts(data->outfile, buffer);
}
- cupsFilePutChar(cupsFileStdout(), '\n');
+ cupsFilePutChar(data->outfile, '\n');
+ free(buffer);
}
- free(buffer);
+ return (current);
}
@@ -2787,7 +3712,7 @@ print_line(
*/
static void
-print_xml_header(_cups_testdata_t *data)/* I - Test data */
+print_xml_header(ipptool_test_t *data)/* I - Test data */
{
if (!data->xml_header)
{
@@ -2798,7 +3723,7 @@ print_xml_header(_cups_testdata_t *data)/* I - Test data */
cupsFilePuts(data->outfile, "<key>ipptoolVersion</key>\n");
cupsFilePuts(data->outfile, "<string>" CUPS_SVERSION "</string>\n");
cupsFilePuts(data->outfile, "<key>Transfer</key>\n");
- cupsFilePrintf(data->outfile, "<string>%s</string>\n", data->transfer == _CUPS_TRANSFER_AUTO ? "auto" : data->transfer == _CUPS_TRANSFER_CHUNKED ? "chunked" : "length");
+ cupsFilePrintf(data->outfile, "<string>%s</string>\n", data->transfer == IPPTOOL_TRANSFER_AUTO ? "auto" : data->transfer == IPPTOOL_TRANSFER_CHUNKED ? "chunked" : "length");
cupsFilePuts(data->outfile, "<key>Tests</key>\n");
cupsFilePuts(data->outfile, "<array>\n");
@@ -2907,7 +3832,7 @@ print_xml_string(cups_file_t *outfile, /* I - Test data */
static void
print_xml_trailer(
- _cups_testdata_t *data, /* I - Test data */
+ ipptool_test_t *data, /* I - Test data */
int success, /* I - 1 on success, 0 on failure */
const char *message) /* I - Error message or NULL */
{
@@ -2989,10 +3914,10 @@ timeout_cb(http_t *http, /* I - Connection to server */
*/
static int /* O - 1 to continue, 0 to stop */
-token_cb(_ipp_file_t *f, /* I - IPP file data */
- _ipp_vars_t *vars, /* I - IPP variables */
- _cups_testdata_t *data, /* I - Test data */
- const char *token) /* I - Current token */
+token_cb(_ipp_file_t *f, /* I - IPP file data */
+ _ipp_vars_t *vars, /* I - IPP variables */
+ ipptool_test_t *data, /* I - Test data */
+ const char *token) /* I - Current token */
{
char name[1024], /* Name string */
temp[1024], /* Temporary string */
@@ -3018,6 +3943,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
_cups_strcasecmp(token, "DEFINE-MATCH") &&
_cups_strcasecmp(token, "DEFINE-NO-MATCH") &&
_cups_strcasecmp(token, "DEFINE-VALUE") &&
+ _cups_strcasecmp(token, "DISPLAY-MATCH") &&
_cups_strcasecmp(token, "IF-DEFINED") &&
_cups_strcasecmp(token, "IF-NOT-DEFINED") &&
_cups_strcasecmp(token, "IN-GROUP") &&
@@ -3030,6 +3956,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") &&
_cups_strcasecmp(token, "WITH-ALL-RESOURCES") &&
_cups_strcasecmp(token, "WITH-ALL-SCHEMES") &&
+ _cups_strcasecmp(token, "WITH-DISTINCT-VALUES") &&
_cups_strcasecmp(token, "WITH-HOSTNAME") &&
_cups_strcasecmp(token, "WITH-RESOURCE") &&
_cups_strcasecmp(token, "WITH-SCHEME") &&
@@ -3048,7 +3975,17 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
if (!strcmp(token, "}"))
{
- return (do_test(f, vars, data));
+ return (do_test(f, data));
+ }
+ else if (!strcmp(token, "MONITOR-PRINTER-STATE"))
+ {
+ if (data->monitor_uri)
+ {
+ print_fatal_error(data, "Extra MONITOR-PRINTER-STATE seen on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ return (parse_monitor_printer_state(f, data));
}
else if (!strcmp(token, "COMPRESSION"))
{
@@ -3132,7 +4069,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
if (_ippFileReadToken(f, temp, sizeof(temp)))
{
- pause_message(temp);
+ strlcpy(data->pause, temp, sizeof(data->pause));
}
else
{
@@ -3151,11 +4088,11 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
{
if (isdigit(temp[0] & 255))
{
- data->request_id = atoi(temp);
+ data->request_id = atoi(temp) - 1;
}
else if (!_cups_strcasecmp(temp, "random"))
{
- data->request_id = (CUPS_RAND() % 1000) * 137 + 1;
+ data->request_id = (CUPS_RAND() % 1000) * 137;
}
else
{
@@ -3169,6 +4106,40 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
return (0);
}
}
+ else if (!strcmp(token, "PASS-IF-DEFINED"))
+ {
+ /*
+ * PASS-IF-DEFINED variable
+ */
+
+ if (_ippFileReadToken(f, name, sizeof(name)))
+ {
+ if (_ippVarsGet(vars, name))
+ data->pass_test = 1;
+ }
+ else
+ {
+ print_fatal_error(data, "Missing PASS-IF-DEFINED value on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+ }
+ else if (!strcmp(token, "PASS-IF-NOT-DEFINED"))
+ {
+ /*
+ * PASS-IF-NOT-DEFINED variable
+ */
+
+ if (_ippFileReadToken(f, name, sizeof(name)))
+ {
+ if (!_ippVarsGet(vars, name))
+ data->pass_test = 1;
+ }
+ else
+ {
+ print_fatal_error(data, "Missing PASS-IF-NOT-DEFINED value on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+ }
else if (!strcmp(token, "SKIP-IF-DEFINED"))
{
/*
@@ -3270,15 +4241,15 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
{
if (!strcmp(temp, "auto"))
{
- data->transfer = _CUPS_TRANSFER_AUTO;
+ data->transfer = IPPTOOL_TRANSFER_AUTO;
}
else if (!strcmp(temp, "chunked"))
{
- data->transfer = _CUPS_TRANSFER_CHUNKED;
+ data->transfer = IPPTOOL_TRANSFER_CHUNKED;
}
else if (!strcmp(temp, "length"))
{
- data->transfer = _CUPS_TRANSFER_LENGTH;
+ data->transfer = IPPTOOL_TRANSFER_LENGTH;
}
else
{
@@ -3509,7 +4480,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
data->last_expect = data->expects + data->num_expects;
data->num_expects ++;
- memset(data->last_expect, 0, sizeof(_cups_expect_t));
+ memset(data->last_expect, 0, sizeof(ipptool_expect_t));
data->last_expect->repeat_limit = 1000;
data->last_expect->expect_all = expect_all;
@@ -3614,6 +4585,24 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
return (0);
}
}
+ else if (!_cups_strcasecmp(token, "DISPLAY-MATCH"))
+ {
+ if (!_ippFileReadToken(f, temp, sizeof(temp)))
+ {
+ print_fatal_error(data, "Missing DISPLAY-MATCH mesaage on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+
+ if (data->last_expect)
+ {
+ data->last_expect->display_match = strdup(temp);
+ }
+ else
+ {
+ print_fatal_error(data, "DISPLAY-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+ return (0);
+ }
+ }
else if (!_cups_strcasecmp(token, "OF-TYPE"))
{
if (!_ippFileReadToken(f, temp, sizeof(temp)))
@@ -3778,6 +4767,18 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
return (0);
}
}
+ else if (!_cups_strcasecmp(token, "WITH-DISTINCT-VALUES"))
+ {
+ if (data->last_expect)
+ {
+ data->last_expect->with_distinct = 1;
+ }
+ else
+ {
+ print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename);
+ return (0);
+ }
+ }
else if (!_cups_strcasecmp(token, "WITH-ALL-VALUES") ||
!_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") ||
!_cups_strcasecmp(token, "WITH-ALL-RESOURCES") ||
@@ -3793,14 +4794,14 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
if (data->last_expect)
{
if (!_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") || !_cups_strcasecmp(token, "WITH-HOSTNAME"))
- data->last_expect->with_flags = _CUPS_WITH_HOSTNAME;
+ data->last_expect->with_flags = IPPTOOL_WITH_HOSTNAME;
else if (!_cups_strcasecmp(token, "WITH-ALL-RESOURCES") || !_cups_strcasecmp(token, "WITH-RESOURCE"))
- data->last_expect->with_flags = _CUPS_WITH_RESOURCE;
+ data->last_expect->with_flags = IPPTOOL_WITH_RESOURCE;
else if (!_cups_strcasecmp(token, "WITH-ALL-SCHEMES") || !_cups_strcasecmp(token, "WITH-SCHEME"))
- data->last_expect->with_flags = _CUPS_WITH_SCHEME;
+ data->last_expect->with_flags = IPPTOOL_WITH_SCHEME;
if (!_cups_strncasecmp(token, "WITH-ALL-", 9))
- data->last_expect->with_flags |= _CUPS_WITH_ALL;
+ data->last_expect->with_flags |= IPPTOOL_WITH_ALL;
}
if (!_ippFileReadToken(f, temp, sizeof(temp)))
@@ -3866,7 +4867,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
*/
data->last_expect->with_value = calloc(1, (size_t)(ptr - value));
- data->last_expect->with_flags |= _CUPS_WITH_REGEX;
+ data->last_expect->with_flags |= IPPTOOL_WITH_REGEX;
if (data->last_expect->with_value)
memcpy(data->last_expect->with_value, value + 1, (size_t)(ptr - value - 1));
@@ -3890,7 +4891,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
}
data->last_expect->with_value = strdup(value);
- data->last_expect->with_flags |= _CUPS_WITH_LITERAL;
+ data->last_expect->with_flags |= IPPTOOL_WITH_LITERAL;
}
}
else
@@ -3916,7 +4917,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
_ippVarsExpand(vars, value, temp, sizeof(value));
data->last_expect->with_value_from = strdup(value);
- data->last_expect->with_flags = _CUPS_WITH_LITERAL;
+ data->last_expect->with_flags = IPPTOOL_WITH_LITERAL;
}
else
{
@@ -3965,10 +4966,10 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
if (data->show_header)
{
- if (data->output == _CUPS_OUTPUT_PLIST)
+ if (data->output == IPPTOOL_OUTPUT_PLIST)
print_xml_header(data);
- if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
+ if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
cupsFilePrintf(cupsFileStdout(), "\"%s\":\n", f->filename);
data->show_header = 0;
@@ -3984,9 +4985,9 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
if ((ptr = strrchr(data->name, '.')) != NULL)
*ptr = '\0';
data->repeat_interval = 5000000;
- data->request_id ++;
- strlcpy(data->resource, vars->resource, sizeof(data->resource));
+ strlcpy(data->resource, data->vars->resource, sizeof(data->resource));
data->skip_previous = 0;
+ data->pass_test = 0;
data->skip_test = 0;
data->num_statuses = 0;
data->last_status = NULL;
@@ -3994,6 +4995,12 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
data->transfer = data->def_transfer;
data->version = data->def_version;
+ free(data->monitor_uri);
+ data->monitor_uri = NULL;
+ data->monitor_delay = 0;
+ data->monitor_interval = 5000000;
+ data->num_monitor_expects = 0;
+
_ippVarsSet(vars, "date-current", iso_date(ippTimeToDate(time(NULL))));
f->attrs = ippNew();
@@ -4085,7 +5092,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
* Map the filename to and then run the tests...
*/
- _cups_testdata_t inc_data; /* Data for included file */
+ ipptool_test_t inc_data; /* Data for included file */
char filename[1024]; /* Mapped filename */
memcpy(&inc_data, data, sizeof(inc_data));
@@ -4094,7 +5101,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
inc_data.prev_pass = 1;
inc_data.show_header = 1;
- if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error)
+ if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error)
{
data->pass = data->prev_pass = 0;
return (0);
@@ -4121,7 +5128,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
* Map the filename to and then run the tests...
*/
- _cups_testdata_t inc_data; /* Data for included file */
+ ipptool_test_t inc_data; /* Data for included file */
char filename[1024]; /* Mapped filename */
memcpy(&inc_data, data, sizeof(inc_data));
@@ -4130,7 +5137,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
inc_data.prev_pass = 1;
inc_data.show_header = 1;
- if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error)
+ if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error)
{
data->pass = data->prev_pass = 0;
return (0);
@@ -4157,7 +5164,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
* Map the filename to and then run the tests...
*/
- _cups_testdata_t inc_data; /* Data for included file */
+ ipptool_test_t inc_data; /* Data for included file */
char filename[1024]; /* Mapped filename */
memcpy(&inc_data, data, sizeof(inc_data));
@@ -4166,7 +5173,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
inc_data.prev_pass = 1;
inc_data.show_header = 1;
- if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error)
+ if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error)
{
data->pass = data->prev_pass = 0;
return (0);
@@ -4242,11 +5249,11 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */
if (_ippFileReadToken(f, temp, sizeof(temp)))
{
if (!strcmp(temp, "auto"))
- data->def_transfer = _CUPS_TRANSFER_AUTO;
+ data->def_transfer = IPPTOOL_TRANSFER_AUTO;
else if (!strcmp(temp, "chunked"))
- data->def_transfer = _CUPS_TRANSFER_CHUNKED;
+ data->def_transfer = IPPTOOL_TRANSFER_CHUNKED;
else if (!strcmp(temp, "length"))
- data->def_transfer = _CUPS_TRANSFER_LENGTH;
+ data->def_transfer = IPPTOOL_TRANSFER_LENGTH;
else
{
print_fatal_error(data, "Bad TRANSFER value \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename);
@@ -4316,6 +5323,7 @@ usage(void)
_cupsLangPuts(stderr, _("-I Ignore errors"));
_cupsLangPuts(stderr, _("-L Send requests using content-length"));
_cupsLangPuts(stderr, _("-P filename.plist Produce XML plist to a file and test report to standard output"));
+ _cupsLangPuts(stderr, _("-R Repeat tests on server-error-busy"));
_cupsLangPuts(stderr, _("-S Test with encryption using HTTPS"));
_cupsLangPuts(stderr, _("-T seconds Set the receive/send timeout in seconds"));
_cupsLangPuts(stderr, _("-V version Set default IPP version"));
@@ -4336,29 +5344,154 @@ usage(void)
/*
+ * 'with_distinct_values()' - Verify that an attribute contains unique values.
+ */
+
+static int // O - 1 if distinct, 0 if duplicate
+with_distinct_values(
+ cups_array_t *errors, // I - Array of errors
+ ipp_attribute_t *attr) // I - Attribute to test
+{
+ int i, // Looping var
+ count; // Number of values
+ ipp_tag_t value_tag; // Value syntax
+ const char *value; // Current value
+ char buffer[8192]; // Temporary buffer
+ cups_array_t *values; // Array of values as strings
+
+
+ // If there is only 1 value, it must be distinct
+ if ((count = ippGetCount(attr)) == 1)
+ return (1);
+
+ // Only check integers, enums, rangeOfInteger, resolution, and nul-terminated
+ // strings...
+ switch (value_tag = ippGetValueTag(attr))
+ {
+ case IPP_TAG_INTEGER :
+ case IPP_TAG_ENUM :
+ case IPP_TAG_RANGE :
+ case IPP_TAG_RESOLUTION :
+ case IPP_TAG_KEYWORD :
+ case IPP_TAG_URISCHEME :
+ case IPP_TAG_CHARSET :
+ case IPP_TAG_LANGUAGE :
+ case IPP_TAG_MIMETYPE :
+ case IPP_TAG_BEGIN_COLLECTION :
+ break;
+
+ default :
+ add_stringf(errors, "WITH-DISTINCT-VALUES %s not supported for 1setOf %s", ippGetName(attr), ippTagString(value_tag));
+ return (0);
+ }
+
+ // Collect values and determine they are all unique...
+ values = cupsArrayNew3((cups_array_func_t)strcmp, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
+
+ for (i = 0; i < count; i ++)
+ {
+ switch (value_tag)
+ {
+ case IPP_TAG_INTEGER :
+ case IPP_TAG_ENUM :
+ snprintf(buffer, sizeof(buffer), "%d", ippGetInteger(attr, i));
+ value = buffer;
+ break;
+ case IPP_TAG_RANGE :
+ {
+ int upper, lower = ippGetRange(attr, i, &upper);
+ // Range values
+
+ snprintf(buffer, sizeof(buffer), "%d-%d", lower, upper);
+ value = buffer;
+ }
+ break;
+ case IPP_TAG_RESOLUTION :
+ {
+ ipp_res_t units; // Resolution units
+ int yres, xres = ippGetResolution(attr, i, &yres, &units);
+ // Resolution values
+
+ if (xres == yres)
+ snprintf(buffer, sizeof(buffer), "%d%s", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
+ else
+ snprintf(buffer, sizeof(buffer), "%dx%d%s", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
+ value = buffer;
+ }
+ break;
+ case IPP_TAG_KEYWORD :
+ case IPP_TAG_URISCHEME :
+ case IPP_TAG_CHARSET :
+ case IPP_TAG_LANGUAGE :
+ case IPP_TAG_MIMETYPE :
+ value = ippGetString(attr, i, NULL);
+ break;
+ case IPP_TAG_BEGIN_COLLECTION :
+ {
+ ipp_t *col = ippGetCollection(attr, i);
+ // Collection value
+ ipp_attribute_t *member; // Member attribute
+ char *bufptr, // Pointer into buffer
+ *bufend, // End of buffer
+ prefix; // Prefix character
+
+ for (prefix = '{', bufptr = buffer, bufend = buffer + sizeof(buffer) - 2, member = ippFirstAttribute(col); member && bufptr < bufend; member = ippNextAttribute(col))
+ {
+ *bufptr++ = prefix;
+ prefix = ' ';
+
+ ippAttributeString(member, bufptr, (size_t)(bufend - bufptr));
+ bufptr += strlen(bufptr);
+ }
+
+ *bufptr++ = '}';
+ *bufptr = '\0';
+ value = buffer;
+ }
+ break;
+ default : // Should never happen
+ value = "unsupported";
+ break;
+ }
+
+ if (cupsArrayFind(values, (void *)value))
+ add_stringf(errors, "DUPLICATE: %s=%s", ippGetName(attr), value);
+ else
+ cupsArrayAdd(values, (void *)value);
+ }
+
+ // Cleanup...
+ i = cupsArrayCount(values) == count;
+ cupsArrayDelete(values);
+
+ return (i);
+}
+
+
+/*
* 'with_flags_string()' - Return the "WITH-xxx" predicate that corresponds to
- the flags.
+ * the flags.
*/
static const char * /* O - WITH-xxx string */
with_flags_string(int flags) /* I - WITH flags */
{
- if (flags & _CUPS_WITH_ALL)
+ if (flags & IPPTOOL_WITH_ALL)
{
- if (flags & _CUPS_WITH_HOSTNAME)
+ if (flags & IPPTOOL_WITH_HOSTNAME)
return ("WITH-ALL-HOSTNAMES");
- else if (flags & _CUPS_WITH_RESOURCE)
+ else if (flags & IPPTOOL_WITH_RESOURCE)
return ("WITH-ALL-RESOURCES");
- else if (flags & _CUPS_WITH_SCHEME)
+ else if (flags & IPPTOOL_WITH_SCHEME)
return ("WITH-ALL-SCHEMES");
else
return ("WITH-ALL-VALUES");
}
- else if (flags & _CUPS_WITH_HOSTNAME)
+ else if (flags & IPPTOOL_WITH_HOSTNAME)
return ("WITH-HOSTNAME");
- else if (flags & _CUPS_WITH_RESOURCE)
+ else if (flags & IPPTOOL_WITH_RESOURCE)
return ("WITH-RESOURCE");
- else if (flags & _CUPS_WITH_SCHEME)
+ else if (flags & IPPTOOL_WITH_SCHEME)
return ("WITH-SCHEME");
else
return ("WITH-VALUE");
@@ -4370,7 +5503,7 @@ with_flags_string(int flags) /* I - WITH flags */
*/
static int /* O - 1 on match, 0 on non-match */
-with_value(_cups_testdata_t *data, /* I - Test data */
+with_value(ipptool_test_t *data, /* I - Test data */
cups_array_t *errors, /* I - Errors array */
char *value, /* I - Value string */
int flags, /* I - Flags for match */
@@ -4387,7 +5520,7 @@ with_value(_cups_testdata_t *data, /* I - Test data */
*matchbuf = '\0';
- match = (flags & _CUPS_WITH_ALL) ? 1 : 0;
+ match = (flags & IPPTOOL_WITH_ALL) ? 1 : 0;
/*
* NULL matches everything.
@@ -4450,7 +5583,7 @@ with_value(_cups_testdata_t *data, /* I - Test data */
}
}
- if (flags & _CUPS_WITH_ALL)
+ if (flags & IPPTOOL_WITH_ALL)
{
if (!valmatch)
{
@@ -4517,7 +5650,7 @@ with_value(_cups_testdata_t *data, /* I - Test data */
}
}
- if (flags & _CUPS_WITH_ALL)
+ if (flags & IPPTOOL_WITH_ALL)
{
if (!valmatch)
{
@@ -4552,13 +5685,13 @@ with_value(_cups_testdata_t *data, /* I - Test data */
if (!matchbuf[0])
strlcpy(matchbuf, value, matchlen);
- if (!(flags & _CUPS_WITH_ALL))
+ if (!(flags & IPPTOOL_WITH_ALL))
{
match = 1;
break;
}
}
- else if (flags & _CUPS_WITH_ALL)
+ else if (flags & IPPTOOL_WITH_ALL)
{
match = 0;
break;
@@ -4589,13 +5722,13 @@ with_value(_cups_testdata_t *data, /* I - Test data */
if (!matchbuf[0])
strlcpy(matchbuf, value, matchlen);
- if (!(flags & _CUPS_WITH_ALL))
+ if (!(flags & IPPTOOL_WITH_ALL))
{
match = 1;
break;
}
}
- else if (flags & _CUPS_WITH_ALL)
+ else if (flags & IPPTOOL_WITH_ALL)
{
match = 0;
break;
@@ -4635,7 +5768,7 @@ with_value(_cups_testdata_t *data, /* I - Test data */
case IPP_TAG_TEXTLANG :
case IPP_TAG_URI :
case IPP_TAG_URISCHEME :
- if (flags & _CUPS_WITH_REGEX)
+ if (flags & IPPTOOL_WITH_REGEX)
{
/*
* Value is an extended, case-sensitive POSIX regular expression...
@@ -4663,13 +5796,13 @@ with_value(_cups_testdata_t *data, /* I - Test data */
if (!matchbuf[0])
strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen);
- if (!(flags & _CUPS_WITH_ALL))
+ if (!(flags & IPPTOOL_WITH_ALL))
{
match = 1;
break;
}
}
- else if (flags & _CUPS_WITH_ALL)
+ else if (flags & IPPTOOL_WITH_ALL)
{
match = 0;
break;
@@ -4678,7 +5811,7 @@ with_value(_cups_testdata_t *data, /* I - Test data */
regfree(&re);
}
- else if (ippGetValueTag(attr) == IPP_TAG_URI && !(flags & (_CUPS_WITH_SCHEME | _CUPS_WITH_HOSTNAME | _CUPS_WITH_RESOURCE)))
+ else if (ippGetValueTag(attr) == IPP_TAG_URI && !(flags & (IPPTOOL_WITH_SCHEME | IPPTOOL_WITH_HOSTNAME | IPPTOOL_WITH_RESOURCE)))
{
/*
* Value is a literal URI string, see if the value(s) match...
@@ -4691,13 +5824,13 @@ with_value(_cups_testdata_t *data, /* I - Test data */
if (!matchbuf[0])
strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen);
- if (!(flags & _CUPS_WITH_ALL))
+ if (!(flags & IPPTOOL_WITH_ALL))
{
match = 1;
break;
}
}
- else if (flags & _CUPS_WITH_ALL)
+ else if (flags & IPPTOOL_WITH_ALL)
{
match = 0;
break;
@@ -4721,7 +5854,7 @@ with_value(_cups_testdata_t *data, /* I - Test data */
* Some URI components are case-sensitive, some not...
*/
- if (flags & (_CUPS_WITH_SCHEME | _CUPS_WITH_HOSTNAME))
+ if (flags & (IPPTOOL_WITH_SCHEME | IPPTOOL_WITH_HOSTNAME))
result = _cups_strcasecmp(value, get_string(attr, i, flags, temp, sizeof(temp)));
else
result = strcmp(value, get_string(attr, i, flags, temp, sizeof(temp)));
@@ -4756,13 +5889,13 @@ with_value(_cups_testdata_t *data, /* I - Test data */
if (!matchbuf[0])
strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen);
- if (!(flags & _CUPS_WITH_ALL))
+ if (!(flags & IPPTOOL_WITH_ALL))
{
match = 1;
break;
}
}
- else if (flags & _CUPS_WITH_ALL)
+ else if (flags & IPPTOOL_WITH_ALL)
{
match = 0;
break;
@@ -4778,7 +5911,7 @@ with_value(_cups_testdata_t *data, /* I - Test data */
break;
case IPP_TAG_STRING :
- if (flags & _CUPS_WITH_REGEX)
+ if (flags & IPPTOOL_WITH_REGEX)
{
/*
* Value is an extended, case-sensitive POSIX regular expression...
@@ -4815,13 +5948,13 @@ with_value(_cups_testdata_t *data, /* I - Test data */
if (!matchbuf[0])
strlcpy(matchbuf, temp, matchlen);
- if (!(flags & _CUPS_WITH_ALL))
+ if (!(flags & IPPTOOL_WITH_ALL))
{
match = 1;
break;
}
}
- else if (flags & _CUPS_WITH_ALL)
+ else if (flags & IPPTOOL_WITH_ALL)
{
match = 0;
break;
@@ -4912,13 +6045,13 @@ with_value(_cups_testdata_t *data, /* I - Test data */
if (!matchbuf[0])
copy_hex_string(matchbuf, adata, adatalen, matchlen);
- if (!(flags & _CUPS_WITH_ALL))
+ if (!(flags & IPPTOOL_WITH_ALL))
{
match = 1;
break;
}
}
- else if (flags & _CUPS_WITH_ALL)
+ else if (flags & IPPTOOL_WITH_ALL)
{
match = 0;
break;
diff --git a/tools/printer-lg-png.h b/tools/printer-lg-png.h
new file mode 100644
index 00000000..a7d328dd
--- /dev/null
+++ b/tools/printer-lg-png.h
@@ -0,0 +1,1850 @@
+static const unsigned char printer_lg_png[] =
+{
+ 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
+ 0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x08,0x06,0x00,0x00,0x00,0xf4,0x78,0xd4,
+ 0xfa,0x00,0x00,0x04,0x19,0x69,0x43,0x43,0x50,0x6b,0x43,0x47,0x43,0x6f,0x6c,0x6f,
+ 0x72,0x53,0x70,0x61,0x63,0x65,0x47,0x65,0x6e,0x65,0x72,0x69,0x63,0x52,0x47,0x42,
+ 0x00,0x00,0x38,0x8d,0x8d,0x55,0x5d,0x68,0x1c,0x55,0x14,0x3e,0xbb,0x73,0x67,0x23,
+ 0x24,0xce,0x53,0x6c,0x34,0x85,0x74,0xa8,0x3f,0x0d,0x25,0x0d,0x93,0x56,0x34,0xa1,
+ 0xb4,0xba,0x7f,0xdd,0xdd,0x36,0x6e,0x96,0x49,0x36,0xda,0x22,0xe8,0x64,0xf6,0xee,
+ 0xce,0x98,0xc9,0xce,0x38,0x33,0xbb,0xfd,0xa1,0x4f,0x45,0x50,0x7c,0x31,0xea,0x9b,
+ 0x14,0xc4,0xbf,0xb7,0x80,0x20,0x28,0xf5,0x0f,0xdb,0x3e,0xb4,0x2f,0x95,0x0a,0x25,
+ 0xda,0xd4,0x20,0x28,0x3e,0xb4,0xf8,0x83,0x50,0xe8,0x8b,0xa6,0xeb,0x99,0x3b,0x33,
+ 0x99,0x69,0xba,0xb1,0xde,0x65,0xee,0x7c,0xf3,0x9d,0xef,0x9e,0x7b,0xee,0xb9,0x67,
+ 0xef,0x05,0xe8,0xb9,0xaa,0x58,0x96,0x91,0x14,0x01,0x16,0x9a,0xae,0x2d,0x17,0x32,
+ 0xe2,0x73,0x87,0x8f,0x88,0x3d,0x2b,0x90,0x84,0x87,0xa0,0x17,0x06,0xa1,0x57,0x51,
+ 0x1d,0x2b,0x5d,0xa9,0x4c,0x02,0x36,0x4f,0x0b,0x77,0xb5,0x5b,0xdf,0x43,0xc2,0x7b,
+ 0x5f,0xd9,0xd5,0xdd,0xfe,0x9f,0xad,0xb7,0x46,0x1d,0x15,0x20,0x71,0x1f,0x62,0xb3,
+ 0xe6,0xa8,0x0b,0x88,0x8f,0x01,0xf0,0xa7,0x55,0xcb,0x76,0x01,0x7a,0xfa,0x91,0x1f,
+ 0x3f,0xea,0x5a,0x1e,0xf6,0x62,0xe8,0xb7,0x31,0x40,0xc4,0x2f,0x7a,0xb8,0xe1,0x63,
+ 0xd7,0xc3,0x73,0x3e,0x7e,0x8d,0x69,0x66,0xe4,0x2c,0xe2,0xd3,0x88,0x05,0x55,0x53,
+ 0x6a,0x88,0x97,0x10,0x8f,0xcc,0xc5,0xf8,0x46,0x0c,0xfb,0x31,0xb0,0xd6,0x5f,0xa0,
+ 0x4d,0x6a,0xeb,0xaa,0xe8,0xe5,0xa2,0x62,0x9b,0x75,0xdd,0xa0,0xb1,0x70,0xef,0x61,
+ 0xfe,0x9f,0x6d,0xc1,0x68,0x85,0xf3,0x6d,0xc3,0xa7,0xcf,0x99,0x9f,0x3e,0x84,0xef,
+ 0x61,0x5c,0xfb,0x2b,0x35,0x25,0xe7,0xe1,0x51,0xc4,0x4b,0xaa,0x92,0x9f,0x46,0xfc,
+ 0x08,0xe2,0x6b,0x6d,0x7d,0xb6,0x1c,0xe0,0xdb,0x96,0x9b,0x91,0x11,0x3f,0x06,0x90,
+ 0xdc,0xde,0x9a,0xaf,0xa6,0x11,0xef,0x44,0x5c,0xac,0xdb,0x07,0xaa,0xbe,0x9f,0xa4,
+ 0xad,0xb5,0x8a,0x21,0x7e,0xe7,0x84,0x36,0xf3,0x2c,0xe2,0x2d,0x88,0xcf,0x37,0xe7,
+ 0xca,0x53,0xc1,0xd8,0xab,0xaa,0x93,0xc5,0x9c,0xc1,0x76,0xc4,0xb7,0x35,0x5a,0xf2,
+ 0xf2,0x3b,0x04,0xc0,0x89,0xba,0x5b,0x9a,0xf1,0xc7,0x72,0xfb,0x6d,0x53,0x9e,0xf2,
+ 0xe7,0xe5,0xea,0x35,0x9a,0xcb,0x7b,0x79,0x44,0xfc,0xfa,0xbc,0x79,0x48,0xf6,0x7d,
+ 0x72,0x9f,0x39,0xed,0xe9,0x7c,0xe8,0xf3,0x84,0x96,0x2d,0x07,0xfc,0xa5,0x97,0x94,
+ 0x83,0x15,0xc4,0x83,0x88,0x7f,0xa1,0x46,0x41,0xf6,0xe7,0xe2,0xfe,0xb1,0xdc,0x4a,
+ 0x10,0x03,0x19,0x6a,0x1a,0xe5,0x49,0x7f,0x2e,0x92,0xa3,0x0e,0x5b,0x2f,0xe3,0x5d,
+ 0x6d,0xa6,0xe8,0xcf,0x4b,0x0c,0x17,0x37,0xd4,0x1f,0x4b,0x16,0xeb,0xfa,0x81,0x52,
+ 0xa0,0xff,0x44,0xb3,0x8b,0x72,0x80,0xaf,0x59,0x06,0xab,0x51,0x8c,0x8d,0x4f,0xda,
+ 0x2d,0xb9,0xea,0xeb,0xf9,0x51,0xc5,0xce,0x17,0x7c,0x9f,0x7c,0x85,0x36,0xab,0x81,
+ 0x7f,0xbe,0x0d,0xb3,0x09,0x05,0x28,0x98,0x30,0x87,0xbd,0x0a,0x4d,0x58,0x03,0x11,
+ 0x64,0x28,0x40,0x06,0xdf,0x16,0xd8,0x68,0xa9,0x83,0x0e,0x06,0x32,0x14,0xad,0x14,
+ 0x19,0x8a,0x5f,0xa1,0x66,0x17,0x1b,0xe7,0xc0,0x3c,0xf2,0x3a,0xb4,0x99,0xcd,0xc1,
+ 0xbe,0xc2,0x94,0xfe,0xc8,0xc8,0x5f,0x83,0xf9,0xb8,0xce,0xb4,0x2a,0x64,0x87,0x3e,
+ 0x82,0x16,0xb2,0x1a,0xfc,0x8e,0xac,0x16,0xd3,0x65,0xf1,0xab,0x85,0x5c,0x63,0x13,
+ 0x3f,0x7e,0x2c,0x37,0x02,0x3f,0x26,0x19,0x20,0x12,0xd9,0x83,0xcf,0x5e,0x32,0x49,
+ 0xf6,0x91,0x71,0x32,0x01,0x22,0x79,0x8a,0x3c,0x4d,0xf6,0x93,0x1c,0xb2,0x13,0x64,
+ 0xef,0xfa,0xd8,0x4a,0x6c,0x45,0x5e,0x3c,0x37,0xd6,0xfd,0xbc,0x8c,0x33,0x52,0xa6,
+ 0x9b,0x45,0xdd,0x39,0xb4,0xbb,0xa0,0x60,0xff,0x33,0x2a,0x4c,0x5c,0x53,0xd7,0xac,
+ 0x2c,0x0e,0xb6,0x86,0x23,0xcb,0x29,0xfb,0x05,0x5d,0xbd,0xfc,0xc6,0x5f,0xb1,0x5c,
+ 0xe9,0x2c,0x37,0x51,0xb6,0xe2,0x19,0x9d,0xba,0x57,0xce,0xf9,0x5f,0xf9,0xeb,0xfc,
+ 0x32,0xf6,0x2b,0xfc,0x6a,0xa4,0xe0,0x7f,0xe4,0x57,0xf1,0xb7,0x72,0xc7,0x5a,0xcc,
+ 0xbb,0xb2,0x4c,0xc3,0xec,0x6c,0x58,0x73,0x77,0x55,0x1a,0x6d,0x06,0xe3,0x16,0xf0,
+ 0xd1,0x99,0xc5,0x89,0xc5,0x1d,0xf3,0x71,0xf1,0xe4,0x57,0x0f,0x46,0x7e,0x96,0xc9,
+ 0x99,0xe7,0xaf,0xf4,0x5d,0x3c,0x59,0x6f,0x2e,0x0e,0x46,0xac,0x97,0x05,0xfa,0x6a,
+ 0xf9,0x56,0x19,0x4e,0x8d,0x44,0xac,0xf4,0x83,0xf4,0x87,0xb4,0x2c,0xbd,0x27,0x7d,
+ 0x28,0xfd,0xc6,0xbd,0xcd,0x7d,0xca,0x7d,0xcd,0x7d,0xce,0x7d,0xc1,0x5d,0x02,0x91,
+ 0x3b,0xcb,0x9d,0xe3,0xbe,0xe1,0x2e,0x70,0x1f,0x73,0x5f,0xc6,0xf6,0x6a,0xf3,0x1a,
+ 0x5a,0xdf,0x7b,0x16,0x79,0x18,0xb7,0x67,0xe9,0x96,0x6b,0xac,0x4a,0x21,0x23,0x6c,
+ 0x15,0x1e,0x16,0x72,0xc2,0x36,0xe1,0x51,0x61,0x32,0xf2,0x27,0x0c,0x08,0x63,0x42,
+ 0x51,0xd8,0x81,0x96,0xad,0xeb,0xfb,0x16,0x9f,0x2f,0x9e,0x3d,0x1d,0x0e,0x63,0x1f,
+ 0xe6,0xa7,0xfb,0x5c,0xbe,0x2e,0x56,0x01,0x89,0xfb,0xb1,0x02,0xf4,0x4d,0xfe,0x55,
+ 0x55,0x54,0xe9,0x70,0x94,0x29,0x1d,0x56,0x6f,0x4d,0x38,0xbe,0x41,0x13,0x8c,0x24,
+ 0x43,0x64,0x8c,0x94,0x36,0x54,0xf7,0xb8,0x57,0xf3,0xa1,0x22,0x95,0x4f,0xe5,0x52,
+ 0x69,0x10,0x53,0x3b,0x53,0x13,0xa9,0xb1,0xd4,0x41,0x0f,0x87,0xb3,0xa6,0x76,0xa0,
+ 0x6d,0x02,0xfb,0xfc,0x1d,0xd5,0xa9,0x6e,0xb2,0x52,0xea,0xd2,0x63,0xde,0x7d,0x02,
+ 0x59,0xd3,0x3a,0x6e,0xeb,0x0d,0xcd,0x15,0x77,0x4b,0xd2,0x93,0x62,0x1a,0xaf,0x36,
+ 0x2a,0x96,0x9a,0xea,0xe8,0x88,0xa8,0x18,0x86,0xc8,0x4c,0x8e,0x68,0x53,0x87,0xda,
+ 0x6d,0x5a,0x1b,0x05,0xef,0xde,0xf4,0x8f,0xf4,0x9b,0x32,0xbb,0x0f,0x13,0x5b,0x2e,
+ 0x47,0x9c,0xfb,0x0c,0xc0,0xbe,0x3f,0xf1,0xec,0xfb,0x2e,0xe2,0x8e,0xb4,0x00,0x96,
+ 0x1c,0x80,0x81,0xc7,0x23,0x6e,0x18,0xcf,0xca,0x07,0xde,0x05,0x38,0xf3,0x84,0xda,
+ 0xb2,0xdb,0xc1,0x1d,0x91,0x48,0x7c,0x0b,0xe0,0xd4,0xf7,0xec,0xf6,0xbf,0xfa,0x32,
+ 0x78,0x7e,0xfd,0xd4,0xe9,0xdc,0xc4,0x73,0xac,0xe7,0x2d,0x80,0xb5,0x37,0x3b,0x9d,
+ 0xbf,0xdf,0xef,0x74,0xd6,0x3e,0x40,0xff,0xab,0x00,0x67,0x8d,0x7f,0x01,0xa0,0x9f,
+ 0x7c,0x55,0x03,0x5c,0x0b,0xef,0x00,0x00,0x00,0x38,0x65,0x58,0x49,0x66,0x4d,0x4d,
+ 0x00,0x2a,0x00,0x00,0x00,0x08,0x00,0x01,0x87,0x69,0x00,0x04,0x00,0x00,0x00,0x01,
+ 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x00,0x00,0x02,0xa0,0x02,0x00,0x04,0x00,0x00,
+ 0x00,0x01,0x00,0x00,0x02,0x00,0xa0,0x03,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x00,0x00,0x28,0x30,0x97,0xbf,0x00,0x00,0x03,0x62,0x69,0x54,
+ 0x58,0x74,0x58,0x4d,0x4c,0x3a,0x63,0x6f,0x6d,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e,
+ 0x78,0x6d,0x70,0x00,0x00,0x00,0x00,0x00,0x3c,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65,
+ 0x74,0x61,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x78,0x3d,0x22,0x61,0x64,0x6f,0x62,
+ 0x65,0x3a,0x6e,0x73,0x3a,0x6d,0x65,0x74,0x61,0x2f,0x22,0x20,0x78,0x3a,0x78,0x6d,
+ 0x70,0x74,0x6b,0x3d,0x22,0x58,0x4d,0x50,0x20,0x43,0x6f,0x72,0x65,0x20,0x35,0x2e,
+ 0x34,0x2e,0x30,0x22,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x52,0x44,
+ 0x46,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x72,0x64,0x66,0x3d,0x22,0x68,0x74,0x74,
+ 0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x77,0x33,0x2e,0x6f,0x72,0x67,0x2f,0x31,
+ 0x39,0x39,0x39,0x2f,0x30,0x32,0x2f,0x32,0x32,0x2d,0x72,0x64,0x66,0x2d,0x73,0x79,
+ 0x6e,0x74,0x61,0x78,0x2d,0x6e,0x73,0x23,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x3c,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x69,0x6f,
+ 0x6e,0x20,0x72,0x64,0x66,0x3a,0x61,0x62,0x6f,0x75,0x74,0x3d,0x22,0x22,0x0a,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,
+ 0x3a,0x64,0x63,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x70,0x75,0x72,0x6c,
+ 0x2e,0x6f,0x72,0x67,0x2f,0x64,0x63,0x2f,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73,
+ 0x2f,0x31,0x2e,0x31,0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x49,0x70,0x74,0x63,0x34,0x78,0x6d,
+ 0x70,0x45,0x78,0x74,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x69,0x70,0x74,
+ 0x63,0x2e,0x6f,0x72,0x67,0x2f,0x73,0x74,0x64,0x2f,0x49,0x70,0x74,0x63,0x34,0x78,
+ 0x6d,0x70,0x45,0x78,0x74,0x2f,0x32,0x30,0x30,0x38,0x2d,0x30,0x32,0x2d,0x32,0x39,
+ 0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,
+ 0x6d,0x6c,0x6e,0x73,0x3a,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3d,0x22,
+ 0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6e,0x73,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e,
+ 0x63,0x6f,0x6d,0x2f,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x2f,0x31,0x2e,
+ 0x30,0x2f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,
+ 0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x53,0x65,0x71,0x3e,
+ 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x4d,0x69,0x63,0x68,0x61,0x65,0x6c,0x20,
+ 0x53,0x77,0x65,0x65,0x74,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,
+ 0x3a,0x53,0x65,0x71,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
+ 0x2f,0x64,0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,0x74,0x73,
+ 0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,
+ 0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x20,0x78,
+ 0x6d,0x6c,0x3a,0x6c,0x61,0x6e,0x67,0x3d,0x22,0x78,0x2d,0x64,0x65,0x66,0x61,0x75,
+ 0x6c,0x74,0x22,0x3e,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x32,0x30,
+ 0x31,0x30,0x20,0x41,0x70,0x70,0x6c,0x65,0x20,0x49,0x6e,0x63,0x2e,0x3c,0x2f,0x72,
+ 0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,
+ 0x74,0x73,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x70,
+ 0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,
+ 0x6e,0x65,0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x49,0x70,
+ 0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,
+ 0x6e,0x65,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x68,
+ 0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,
+ 0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x70,0x68,0x6f,0x74,
+ 0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,0x3e,0x0a,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,
+ 0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,
+ 0x66,0x3a,0x52,0x44,0x46,0x3e,0x0a,0x3c,0x2f,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65,
+ 0x74,0x61,0x3e,0x0a,0xa0,0x50,0x98,0x64,0x00,0x00,0x6b,0x41,0x49,0x44,0x41,0x54,
+ 0x78,0xda,0xed,0x9d,0x07,0xfc,0x1c,0x55,0xb9,0xb0,0x4f,0x7a,0xef,0x40,0x0a,0x49,
+ 0x20,0x10,0x9a,0x54,0xe9,0x46,0x7a,0x13,0x14,0x2e,0x52,0x42,0x53,0x54,0x04,0x2f,
+ 0x28,0x02,0xf7,0x7e,0x82,0x15,0x51,0x51,0x11,0x14,0x6c,0x28,0xc2,0xfd,0x79,0x51,
+ 0x41,0x41,0xa4,0x37,0xf9,0x40,0x3a,0x48,0x07,0x29,0x86,0x96,0x90,0x00,0x09,0x24,
+ 0x90,0x46,0x7a,0xcf,0x7e,0xe7,0x1d,0x32,0xff,0x6f,0x72,0x72,0xce,0x9c,0x33,0xbb,
+ 0x33,0xbb,0xb3,0xbb,0xcf,0x93,0xdf,0xc9,0xee,0x7f,0x77,0x76,0x66,0xce,0xb4,0xb7,
+ 0x9c,0xf7,0x7d,0x4f,0x27,0x55,0x52,0x2a,0x95,0x4a,0x1f,0xfd,0xb2,0xad,0x6e,0xdb,
+ 0xe9,0x36,0x56,0xb7,0x31,0xba,0x8d,0xd4,0x6d,0x3d,0xdd,0x06,0xeb,0xd6,0x4b,0xb7,
+ 0xee,0xba,0x75,0x51,0x00,0x00,0x00,0xf5,0x67,0x95,0x6e,0xcb,0x75,0x5b,0xa2,0xdb,
+ 0x1c,0xdd,0x66,0xe9,0x36,0x4d,0xb7,0x29,0xba,0x4d,0xd2,0xed,0x45,0xdd,0x5e,0xea,
+ 0xd4,0xa9,0xd3,0xa2,0x32,0xee,0x7c,0xa7,0x12,0x09,0xfc,0x7e,0xfa,0x65,0x7f,0xdd,
+ 0x0e,0xd0,0x6d,0x8f,0x35,0xc2,0xbf,0x33,0xd7,0x17,0x00,0x00,0x34,0x31,0xab,0x45,
+ 0x09,0xd0,0xed,0x51,0xdd,0xee,0xd5,0xed,0x3e,0xad,0x10,0x2c,0x68,0x7b,0x05,0x40,
+ 0x0b,0xfd,0x41,0xfa,0xe5,0x08,0xdd,0x8e,0xd5,0x6d,0x5f,0xdd,0xba,0x71,0xad,0x00,
+ 0x00,0x40,0x0b,0xb3,0x42,0xb7,0x07,0x74,0xbb,0x4e,0xb7,0x9b,0xb5,0x32,0x30,0xb7,
+ 0xad,0x14,0x00,0x2d,0xf8,0xf7,0xd4,0x2f,0xa7,0xea,0x76,0xb4,0x6e,0x3d,0xb8,0x1e,
+ 0x00,0x00,0xa0,0x0d,0x59,0xaa,0xdb,0x8d,0xba,0x5d,0xa1,0x15,0x81,0x47,0x5a,0x56,
+ 0x01,0xd0,0x42,0x5f,0xdc,0xf9,0xe3,0x75,0x3b,0x5b,0xb7,0x9d,0x39,0xef,0x00,0x00,
+ 0x00,0x1d,0x3c,0xa3,0xdb,0xc5,0xba,0x5d,0xaf,0x95,0x81,0xd5,0x2d,0xa3,0x00,0x68,
+ 0xe1,0x7f,0xa4,0x7e,0x39,0x5f,0xb7,0xad,0x39,0xc7,0x00,0x00,0x00,0x4e,0x26,0xe8,
+ 0x76,0x9e,0x56,0x02,0x6e,0x6a,0x6a,0x05,0x40,0x0b,0xfe,0x2d,0xf5,0xcb,0x65,0xea,
+ 0xc3,0xf1,0x7d,0x00,0x00,0x00,0x08,0x43,0xe2,0x04,0xbe,0xa2,0x15,0x81,0x57,0x8b,
+ 0xda,0x40,0x21,0x51,0xf6,0x5a,0xf0,0xf7,0xd6,0xed,0x02,0xfd,0xf6,0x05,0x84,0x3f,
+ 0x00,0x00,0x40,0x66,0x44,0x76,0xbe,0x20,0xb2,0x54,0x64,0x6a,0x53,0x78,0x00,0xf4,
+ 0x8e,0xee,0xae,0x5f,0xae,0x51,0x1f,0xe6,0xed,0x03,0x00,0x00,0x40,0x6d,0x48,0x5d,
+ 0x81,0x13,0xb4,0x37,0xe0,0x89,0xd2,0x7a,0x00,0xb4,0xf0,0xff,0x9a,0x7e,0x79,0x18,
+ 0xe1,0x0f,0x00,0x00,0x90,0x1b,0x22,0x53,0x1f,0x5e,0x23,0x63,0xcb,0xe5,0x01,0xd0,
+ 0x3b,0x25,0x95,0xf9,0xfe,0xa8,0xdb,0x61,0x9c,0x27,0x00,0x00,0x80,0xc2,0xb8,0x5d,
+ 0xb7,0x2f,0x68,0x6f,0xc0,0x9c,0x86,0x2b,0x00,0x5a,0xf8,0x8b,0x66,0x72,0x8f,0xfa,
+ 0xb0,0x5c,0x2f,0x00,0x00,0x00,0x14,0x8b,0x94,0x19,0x3e,0x48,0x2b,0x01,0x53,0x6a,
+ 0x59,0x49,0x4d,0x43,0x00,0x5a,0xf8,0x6f,0xaf,0x5f,0x1e,0x43,0xf8,0x03,0x00,0x00,
+ 0xd4,0x0d,0x91,0xb9,0x8f,0xad,0x91,0xc1,0xf5,0x57,0x00,0xf4,0x86,0xf7,0xd6,0x2f,
+ 0x0f,0xe9,0x36,0x8c,0x73,0x01,0x00,0x00,0x50,0x57,0x44,0xf6,0x3e,0xb4,0x46,0x16,
+ 0x57,0x45,0x55,0x43,0x00,0x6b,0x36,0xf8,0x7f,0x75,0xeb,0xc9,0x39,0x00,0x00,0x00,
+ 0x68,0x18,0x52,0x4e,0xf8,0x60,0x3d,0x1c,0xf0,0x50,0xe1,0x0a,0xc0,0x1a,0x97,0x83,
+ 0x6c,0x68,0x00,0xc7,0x1d,0x00,0x00,0xa0,0xe1,0xcc,0xd3,0x6d,0x6f,0xad,0x04,0xbc,
+ 0x50,0x98,0x02,0xb0,0x26,0xe0,0x4f,0xc6,0xfc,0x71,0xfb,0x03,0x00,0x00,0x94,0x87,
+ 0x19,0xba,0x8d,0xcb,0x12,0x18,0x18,0xac,0x00,0xac,0x49,0xf5,0x7b,0x52,0x11,0xf0,
+ 0x07,0x00,0x00,0x50,0x46,0x24,0x3b,0x60,0xb7,0xd0,0x14,0xc1,0x2c,0x41,0x80,0x7f,
+ 0x44,0xf8,0x03,0x00,0x00,0x94,0x96,0xb1,0x6b,0x64,0x75,0x10,0x41,0x0a,0xc0,0x9a,
+ 0xea,0x43,0x14,0xf9,0x01,0x00,0x00,0x28,0x37,0x87,0x85,0x56,0x0c,0xf4,0x0e,0x01,
+ 0xac,0xa9,0xed,0x2f,0xe5,0x7d,0xbb,0x71,0x5c,0x01,0x00,0x00,0x4a,0xcf,0x0a,0xdd,
+ 0xf6,0xf2,0xcd,0x1d,0xd0,0xc9,0x23,0xfc,0x65,0x06,0xa2,0x7f,0x2b,0x6a,0xfb,0x03,
+ 0x00,0x00,0x34,0x13,0x12,0x0c,0xb8,0x8d,0x56,0x02,0x16,0xbb,0x16,0xf0,0x0d,0x01,
+ 0x9c,0x8b,0xf0,0x07,0x00,0x00,0x68,0x3a,0xc6,0xac,0x91,0xe1,0xd9,0x3d,0x00,0xda,
+ 0xfa,0xdf,0x52,0xbf,0x48,0x4e,0x61,0x77,0x8e,0x23,0x00,0x00,0x40,0xd3,0xb1,0x5c,
+ 0xb7,0xed,0xb5,0x17,0xe0,0xd5,0xac,0x0a,0xc0,0xfd,0xfa,0x65,0xdf,0x5a,0xb7,0xbe,
+ 0x72,0xe5,0x4a,0x35,0x77,0xee,0xdc,0xd4,0x65,0xba,0x75,0xeb,0xa6,0x06,0x0e,0x1c,
+ 0xc8,0xa9,0x02,0x00,0x00,0xc8,0x97,0x07,0xb4,0x02,0xb0,0x5f,0xb0,0x02,0xa0,0x85,
+ 0xff,0x51,0xfa,0xe5,0x86,0x3c,0xb6,0x7c,0xe9,0xa5,0x97,0xaa,0x33,0xcf,0x3c,0x33,
+ 0x75,0x99,0xee,0xdd,0xbb,0xab,0x65,0xcb,0x96,0x71,0x9a,0x00,0x00,0x00,0xf2,0xe7,
+ 0x68,0xad,0x04,0xdc,0x68,0x7e,0xd8,0xd9,0x22,0xfc,0xe5,0xb3,0x1f,0xe4,0xb5,0xd5,
+ 0xe5,0xcb,0x97,0xe7,0xb2,0x0c,0x00,0x00,0x00,0x54,0xc5,0x0f,0xd6,0xc8,0xf6,0x74,
+ 0x05,0x40,0x33,0x5e,0xb7,0xad,0x39,0x5e,0x00,0x00,0x00,0x2d,0xc1,0xd6,0x6b,0x64,
+ 0xbb,0x57,0x01,0x38,0x9b,0x63,0x05,0x00,0x00,0xd0,0x52,0x9c,0x9d,0xaa,0x00,0x68,
+ 0x17,0xc1,0x9e,0xfa,0x65,0x67,0x8e,0x13,0x00,0x00,0x40,0x4b,0xb1,0xf3,0x1a,0x19,
+ 0xef,0xf4,0x00,0x9c,0xca,0x31,0x02,0x00,0x00,0x68,0x49,0x4e,0xb5,0x2a,0x00,0x5a,
+ 0x33,0x18,0xa4,0x5f,0x8e,0xe2,0xf8,0x00,0x00,0x00,0xb4,0x24,0x47,0xad,0x91,0xf5,
+ 0xeb,0x78,0x00,0x8e,0xd0,0xad,0x27,0xc7,0x07,0x00,0x00,0xa0,0x25,0xe9,0xb9,0x46,
+ 0xd6,0xaf,0xa3,0x00,0x1c,0xcb,0xb1,0x01,0x00,0x00,0x68,0x69,0x3a,0x64,0x7d,0x57,
+ 0xf9,0x4f,0xbb,0x04,0xfa,0xa9,0x1c,0xaa,0xfe,0xd9,0x18,0x3f,0x7e,0xbc,0xda,0x60,
+ 0x83,0x0d,0x52,0x97,0xe9,0xdb,0xb7,0x2f,0xa7,0x04,0x00,0x00,0xa0,0x78,0xf6,0x15,
+ 0x99,0xaf,0x0b,0x03,0x2d,0xe8,0xb4,0x46,0x01,0x10,0x97,0xc0,0x4d,0x1c,0x17,0x00,
+ 0x00,0x80,0x96,0xe7,0x08,0xad,0x00,0xdc,0x12,0x0f,0x01,0xec,0xcf,0xf1,0x00,0x00,
+ 0x00,0x68,0x0b,0x0e,0x90,0xff,0x62,0x05,0x60,0x0f,0x8e,0x07,0x00,0x00,0x40,0x5b,
+ 0x10,0xc9,0xfc,0x4e,0xda,0xfd,0x2f,0x03,0xf0,0xf3,0x94,0xbd,0x2a,0x20,0x00,0x00,
+ 0x00,0xb4,0x16,0xab,0x75,0xeb,0x2f,0x42,0x7f,0x1b,0x84,0x3f,0x00,0x00,0x40,0xdb,
+ 0x20,0x32,0x7f,0x5b,0xf9,0x6f,0x3b,0x8e,0x05,0x00,0x00,0x40,0x5b,0xb1,0x9d,0xa4,
+ 0x01,0x8e,0xe5,0x38,0xb8,0x99,0x37,0x6f,0x9e,0x7a,0xf3,0xcd,0x37,0xa3,0xf6,0xd6,
+ 0x5b,0x6f,0xa9,0xd5,0xab,0x57,0xab,0xa1,0x43,0x87,0xaa,0xe1,0xc3,0x87,0xab,0x61,
+ 0xc3,0x86,0xa9,0x51,0xa3,0x46,0xa9,0x3e,0x7d,0xfa,0xd0,0xcf,0x12,0xb0,0x68,0xd1,
+ 0x22,0x35,0x75,0xea,0x54,0x35,0x7d,0xfa,0x74,0xf5,0xee,0xbb,0xef,0x46,0xaf,0x0b,
+ 0x17,0x2e,0x54,0x43,0x86,0x0c,0x89,0xfa,0x20,0x6d,0xc4,0x88,0x11,0x6a,0x93,0x4d,
+ 0x36,0x51,0x3a,0x02,0x96,0x8b,0x9b,0x73,0x01,0xd0,0xce,0x8c,0x15,0x05,0x60,0x4c,
+ 0x91,0x5b,0x98,0x32,0x65,0x8a,0x7a,0xe0,0x81,0x07,0x52,0x97,0x11,0xc1,0x72,0xec,
+ 0xb1,0xc7,0x96,0x62,0x3b,0x2b,0x57,0xae,0x54,0x37,0xde,0x78,0xa3,0xfa,0xdd,0xef,
+ 0x7e,0xa7,0x5e,0x78,0xe1,0x05,0xf5,0xc1,0x07,0x1f,0xa4,0x2e,0xdf,0xb5,0x6b,0x57,
+ 0xb5,0xef,0xbe,0xfb,0xaa,0xa3,0x8e,0x3a,0x4a,0x1d,0x71,0xc4,0x11,0xde,0x9a,0x07,
+ 0x65,0x39,0x9e,0x65,0xef,0x67,0x28,0xb3,0x67,0xcf,0x56,0xb7,0xde,0x7a,0xab,0xba,
+ 0xfe,0xfa,0xeb,0xd5,0x7d,0xf7,0xdd,0xa7,0x56,0xac,0x58,0xe1,0xfd,0x8d,0x28,0x33,
+ 0xd2,0x87,0x23,0x8f,0x3c,0x52,0xed,0xb1,0xc7,0x1e,0xaa,0x4b,0x97,0x2e,0x35,0xed,
+ 0xc3,0x8b,0x2f,0xbe,0xa8,0x9e,0x79,0xe6,0x99,0xd4,0x65,0x06,0x0c,0x18,0x10,0x1d,
+ 0xbb,0x7a,0x72,0xd7,0x5d,0x77,0x45,0x82,0xd7,0x45,0xe7,0xce,0x9d,0xd5,0xe7,0x3e,
+ 0xf7,0xb9,0xe8,0xb5,0x55,0xce,0x05,0x00,0x04,0x33,0x46,0x6a,0x00,0x3c,0x5e,0x29,
+ 0x90,0x8b,0x2f,0xbe,0xb8,0xa2,0x37,0xe4,0x6d,0x8d,0xde,0x8e,0x7e,0x78,0x55,0x7e,
+ 0xf2,0x93,0x9f,0x54,0x46,0x8e,0x1c,0x19,0xb4,0x1e,0x5b,0xd3,0x0f,0xd2,0xca,0xf1,
+ 0xc7,0x1f,0x5f,0xd1,0x0f,0xdd,0xd2,0x1e,0xcf,0x66,0xe9,0xa7,0x8f,0x89,0x13,0x27,
+ 0x56,0x0e,0x3f,0xfc,0xf0,0x8a,0x56,0x4c,0xaa,0xee,0x87,0xb4,0x8d,0x37,0xde,0xb8,
+ 0x72,0xc7,0x1d,0x77,0xd4,0xb4,0x2f,0xe7,0x9c,0x73,0x4e,0xd0,0x31,0x7b,0xfb,0xed,
+ 0xb7,0xeb,0x76,0x7c,0xb4,0x47,0xa7,0xd2,0xbb,0x77,0xef,0xd4,0x7d,0x92,0x63,0x37,
+ 0x73,0xe6,0xcc,0x96,0x3a,0x17,0x00,0x10,0xcc,0xe3,0x22,0x29,0x26,0xb6,0xbb,0x02,
+ 0x70,0xd3,0x4d,0x37,0x55,0xb4,0xd5,0x5c,0xd3,0xc3,0x2b,0xd9,0xb4,0xb5,0x57,0xb9,
+ 0xec,0xb2,0xcb,0x2a,0xab,0x56,0xad,0x2a,0xd5,0xf1,0x6c,0xa6,0x7e,0xba,0x58,0xba,
+ 0x74,0x69,0xe5,0x7b,0xdf,0xfb,0x5e,0xa5,0x47,0x8f,0x1e,0xb9,0xf5,0x43,0x9a,0xb6,
+ 0x40,0x2b,0xd3,0xa6,0x4d,0xab,0x6a,0x9f,0x9e,0x7b,0xee,0xb9,0xa0,0x6d,0x5c,0x70,
+ 0xc1,0x05,0x75,0x3b,0x4e,0x97,0x5f,0x7e,0xb9,0x77,0x7f,0x44,0x68,0xb7,0xda,0xb9,
+ 0x00,0x80,0x70,0xdd,0x5d,0x24,0xc5,0xec,0x76,0x56,0x00,0xe4,0x77,0x62,0x9d,0xe5,
+ 0xf9,0x00,0x8b,0xdb,0x21,0x87,0x1c,0x12,0x3d,0x24,0xcb,0x70,0x3c,0x9b,0xad,0x9f,
+ 0x36,0x9e,0x7d,0xf6,0xd9,0xca,0xd8,0xb1,0x63,0x0b,0xe9,0x83,0xb4,0xf5,0xd6,0x5b,
+ 0xaf,0xf2,0xd2,0x4b,0x2f,0x55,0xb5,0x6f,0xdb,0x6d,0xb7,0x9d,0x77,0xfd,0x5b,0x6e,
+ 0xb9,0x65,0xdd,0xee,0xec,0x5d,0x76,0xd9,0xc5,0xbb,0x3f,0xb5,0x58,0xdb,0x65,0x3e,
+ 0x17,0x00,0x10,0xc4,0x6c,0x19,0xfc,0xeb,0xd5,0x8e,0x83,0x1f,0x32,0x06,0x7e,0xda,
+ 0x69,0xa7,0xa9,0xb3,0xcf,0x3e,0x3b,0x0a,0x78,0x2b,0x6a,0x0c,0x56,0xc6,0x7d,0x97,
+ 0x2f,0x5f,0x4e,0x3f,0x6b,0xe4,0x89,0x27,0x9e,0x50,0xfb,0xed,0xb7,0x9f,0x9a,0x34,
+ 0x69,0x52,0x61,0xdb,0x98,0x35,0x6b,0x96,0x3a,0xe0,0x80,0x03,0xd4,0x6b,0xaf,0xbd,
+ 0x96,0xf9,0xb7,0x9f,0xff,0xfc,0xe7,0xbd,0xcb,0xbc,0xfa,0xea,0xab,0xea,0xa9,0xa7,
+ 0x9e,0x2a,0xfc,0x9c,0x4b,0x4c,0xc2,0xd3,0x4f,0x3f,0x9d,0xba,0x8c,0x1e,0x02,0x52,
+ 0x07,0x1f,0x7c,0x70,0x4b,0x9e,0x0b,0x00,0x08,0xa2,0x97,0x28,0x00,0xdd,0xdb,0xb1,
+ 0xe7,0x9f,0xfd,0xec,0x67,0xd5,0x15,0x57,0x5c,0x51,0xf8,0x76,0xee,0xbc,0xf3,0x4e,
+ 0x75,0xcc,0x31,0xc7,0x04,0x05,0x44,0xd1,0x4f,0x3b,0x0f,0x3f,0xfc,0xb0,0x3a,0xe8,
+ 0xa0,0x83,0xa2,0x4c,0x85,0xa2,0x79,0xef,0xbd,0xf7,0xd4,0xfe,0xfb,0xef,0x1f,0x65,
+ 0x43,0x64,0xe1,0x84,0x13,0x4e,0x88,0x02,0x25,0x7d,0xfc,0xe9,0x4f,0x7f,0x2a,0xbc,
+ 0x0f,0xff,0xfb,0xbf,0xff,0xeb,0x5d,0xe6,0x8b,0x5f,0xfc,0x62,0x55,0x01,0x77,0xcd,
+ 0x70,0x2e,0x00,0x20,0x88,0xee,0xa2,0x00,0xb4,0x5d,0xd8,0xed,0xd5,0x57,0x5f,0xad,
+ 0xae,0xbb,0xee,0xba,0xba,0x6d,0x4f,0x22,0xa3,0x7f,0xf4,0xa3,0x1f,0xd1,0xcf,0x2a,
+ 0x78,0xf4,0xd1,0x47,0x95,0x1e,0x62,0x50,0x0b,0x16,0x2c,0x08,0xfe,0x4d,0xb7,0x6e,
+ 0xdd,0xd4,0xe8,0xd1,0xa3,0xd5,0x8e,0x3b,0xee,0xa8,0xb6,0xde,0x7a,0xeb,0x28,0xf5,
+ 0x2c,0x0b,0xef,0xbc,0xf3,0x8e,0x3a,0xf9,0xe4,0x93,0x33,0xfd,0x46,0xd2,0xda,0x42,
+ 0x2c,0xea,0xbf,0xfe,0xf5,0xaf,0x85,0x7a,0x4a,0x96,0x2d,0x5b,0xa6,0xfe,0xfc,0xe7,
+ 0x3f,0xa7,0x2e,0x23,0x51,0xff,0x59,0xfb,0xd7,0x4c,0xe7,0x02,0x00,0x82,0xe8,0xa2,
+ 0x8a,0x1e,0x64,0x28,0x5b,0x0c,0x80,0xce,0x4d,0xae,0x0c,0x1c,0x38,0x30,0x73,0xd4,
+ 0xbb,0xaa,0x71,0x4c,0xb3,0x7b,0xf7,0xee,0x95,0x97,0x5f,0x7e,0x99,0x7e,0x66,0x40,
+ 0xa7,0x26,0x56,0x74,0x9a,0x58,0xd0,0x76,0x75,0x2e,0x79,0x45,0x5b,0xe1,0x15,0xad,
+ 0x84,0x54,0x74,0x0e,0xfa,0x3a,0xeb,0xd2,0xae,0xe4,0xca,0x4f,0x7f,0xfa,0xd3,0xca,
+ 0x86,0x1b,0x6e,0x18,0xdc,0x97,0x6b,0xae,0xb9,0x26,0xd3,0xfe,0xea,0xf4,0xb7,0xa0,
+ 0xf5,0xea,0xf4,0xcb,0xc2,0xee,0xb7,0x6b,0xaf,0xbd,0xd6,0xbb,0x7d,0xad,0xa8,0xb4,
+ 0xfc,0xb9,0x00,0x00,0x3f,0x6d,0xa7,0x00,0x68,0xf7,0xa5,0x77,0x19,0x79,0xd0,0x9d,
+ 0x7f,0xfe,0xf9,0x95,0x7f,0xfc,0xe3,0x1f,0x95,0xc9,0x93,0x27,0x57,0xf4,0x38,0x7a,
+ 0x47,0xd4,0xf3,0x2b,0xaf,0xbc,0x12,0x45,0x73,0x6f,0xb3,0xcd,0x36,0x99,0x85,0xe3,
+ 0x9e,0x7b,0xee,0x59,0xd1,0xe3,0xf0,0xf4,0x33,0x90,0x13,0x4f,0x3c,0x31,0x68,0x7b,
+ 0x3b,0xec,0xb0,0x43,0x45,0x8f,0x79,0x07,0xad,0x53,0x5b,0xaf,0x95,0x33,0xce,0x38,
+ 0x23,0x68,0xbd,0xba,0x08,0x52,0x94,0x4e,0x97,0x25,0x2a,0x7e,0xd0,0xa0,0x41,0x85,
+ 0x47,0xdf,0xa7,0xa1,0x5d,0xe6,0x85,0x28,0x20,0xcd,0x76,0x2e,0x00,0x00,0x05,0x20,
+ 0x53,0x3b,0xf0,0xc0,0x03,0x2b,0xb7,0xdc,0x72,0x4b,0x87,0x20,0xf4,0xa1,0x8b,0xe8,
+ 0x64,0x4e,0xab,0xd3,0x6e,0x79,0xfa,0x19,0xc0,0x0d,0x37,0xdc,0x10,0xb4,0x1d,0x5d,
+ 0x3c,0xa6,0x2a,0xc1,0xf0,0x9d,0xef,0x7c,0x27,0x68,0xfd,0xdf,0xff,0xfe,0xf7,0x33,
+ 0xad,0xf7,0xcb,0x5f,0xfe,0xb2,0x77,0x9d,0xda,0x2d,0x9e,0x4b,0xfe,0xbd,0xc9,0x1b,
+ 0x6f,0xbc,0x11,0x59,0xdf,0x69,0xdb,0xd6,0xd5,0x1d,0x2b,0x3a,0x4e,0xa3,0x2d,0xce,
+ 0x05,0x00,0xa0,0x00,0x78,0x9b,0x1e,0x97,0xac,0xda,0x2d,0xab,0x23,0xbb,0x2b,0xeb,
+ 0xaf,0xbf,0x7e,0xf0,0xb6,0x3e,0xf6,0xb1,0x8f,0xd1,0xcf,0x00,0xcb,0x50,0xd2,0xc0,
+ 0x7c,0xdb,0xd0,0x65,0x64,0xa3,0x65,0xab,0xe5,0xb0,0xc3,0x0e,0x0b,0xda,0x46,0x16,
+ 0x9e,0x7c,0xf2,0xc9,0xa0,0xe3,0xf3,0xeb,0x5f,0xff,0x3a,0xf7,0x7b,0xed,0xdc,0x73,
+ 0xcf,0xf5,0x6e,0xf7,0x9b,0xdf,0xfc,0x66,0xdb,0x9c,0x0b,0x00,0x40,0x01,0xf0,0x8e,
+ 0x87,0xea,0x5a,0xe5,0x35,0x6d,0xfb,0x9f,0xff,0xfc,0x67,0xa6,0x62,0x28,0xb5,0x8c,
+ 0x91,0xb7,0x43,0x3f,0x2f,0xbd,0xf4,0xd2,0xa0,0x71,0xe6,0x87,0x1e,0x7a,0xa8,0xa6,
+ 0xfe,0x48,0x05,0x3b,0x89,0x59,0xf0,0x6d,0x4b,0x07,0xbf,0x65,0x5a,0xaf,0xe4,0xfb,
+ 0xfb,0xd6,0xb9,0xd3,0x4e,0x3b,0xe5,0x7a,0x9f,0x89,0x37,0xc7,0x57,0xdd,0x51,0x8e,
+ 0x99,0x4e,0xdd,0x6b,0xab,0x73,0x01,0x00,0x6e,0xda,0x7a,0x1a,0xe0,0x8b,0x2e,0xba,
+ 0x28,0xca,0x61,0x97,0x09,0x6f,0x6a,0x61,0xdc,0xb8,0x71,0x4a,0xbb,0x27,0x83,0x97,
+ 0xbf,0xf2,0xca,0x2b,0xe9,0xa7,0x03,0x51,0x4a,0xb5,0x75,0xec,0x5d,0x4e,0xea,0xc7,
+ 0xef,0xb5,0xd7,0x5e,0x35,0xf5,0x47,0x17,0xb2,0x51,0xe3,0xc7,0x8f,0xf7,0x2e,0x77,
+ 0xd5,0x55,0x57,0x65,0x5a,0x6f,0x48,0x4d,0x00,0x5d,0x48,0x47,0x69,0x05,0x29,0xb7,
+ 0x73,0x7c,0xf7,0xdd,0x77,0x2b,0x5d,0x3d,0x2f,0x75,0x19,0x99,0xcb,0x61,0xd3,0x4d,
+ 0x37,0x6d,0xab,0x73,0x01,0x00,0xe9,0x37,0x79,0x5b,0x7a,0x00,0xf2,0x76,0xc1,0xea,
+ 0x99,0xce,0x2a,0x7a,0x82,0x9c,0xa0,0x6d,0xcb,0x38,0x6c,0xb5,0x41,0x72,0xad,0xde,
+ 0xcf,0xdb,0x6f,0xbf,0x3d,0x68,0xdd,0x7a,0x42,0xa4,0x5c,0xfa,0x73,0xdb,0x6d,0xb7,
+ 0x79,0xb7,0x35,0x78,0xf0,0xe0,0x4c,0xfd,0x90,0x0c,0x8c,0x90,0x8c,0x8a,0xaf,0x7f,
+ 0xfd,0xeb,0xb9,0x9d,0x17,0x2d,0x84,0xbd,0xdb,0x93,0x0c,0x81,0x76,0x3b,0x17,0x00,
+ 0x80,0x07,0x60,0x2d,0x7e,0xf3,0x9b,0xdf,0x28,0x1d,0x7d,0x9c,0xeb,0x3a,0x65,0x06,
+ 0xbe,0xaf,0x7d,0xed,0x6b,0x41,0xcb,0x4a,0x81,0x13,0x1d,0xb0,0x45,0x3f,0x2d,0x68,
+ 0x97,0xb3,0x77,0x99,0xcd,0x36,0xdb,0x4c,0xed,0xb3,0xcf,0x3e,0xb9,0xf4,0xe7,0x13,
+ 0x9f,0xf8,0x84,0xea,0xd9,0xb3,0x67,0xea,0x32,0x73,0xe6,0xcc,0x89,0x66,0x61,0x0c,
+ 0x45,0xaa,0xec,0x49,0x01,0x1b,0x1f,0x7f,0xf9,0xcb,0x5f,0x72,0xa9,0xce,0x28,0xc7,
+ 0x59,0x97,0xf5,0x4d,0x5d,0x46,0xf2,0xef,0xc5,0x52,0x6f,0xb7,0x73,0x01,0x00,0x6e,
+ 0xda,0x4e,0x01,0xd0,0x93,0xd7,0xa8,0xd3,0x4f,0x3f,0xbd,0x90,0x75,0x4b,0x25,0xbc,
+ 0x50,0x7c,0xd3,0xc7,0xb6,0x63,0x3f,0x75,0x1a,0x9d,0x7a,0xf0,0xc1,0x07,0xbd,0xcb,
+ 0xe9,0x2c,0x86,0xdc,0xfa,0xa2,0xc7,0x9d,0xd5,0x56,0x5b,0x6d,0xe5,0x5d,0xee,0xf9,
+ 0xe7,0x9f,0xcf,0xb4,0xde,0x2f,0x7c,0xe1,0x0b,0xde,0x65,0xa4,0xc8,0xcd,0xbd,0xf7,
+ 0xde,0x5b,0x73,0x1f,0xc4,0x2d,0xee,0xab,0xc0,0x28,0xd3,0xfe,0xea,0xf8,0x8d,0xb6,
+ 0x3c,0x17,0x00,0x80,0x02,0x10,0xa1,0xd3,0xb4,0x0a,0x5b,0xb7,0x9e,0xce,0x54,0xe9,
+ 0xbc,0xf9,0x52,0x28,0x00,0xcd,0xd8,0x4f,0xa9,0x5f,0x1f,0x52,0x25,0x2f,0xc4,0xba,
+ 0xce,0x42,0x48,0x5f,0xb2,0x0a,0x9d,0x4f,0x7f,0xfa,0xd3,0xaa,0x7f,0xff,0xfe,0x41,
+ 0xc2,0xbb,0x56,0x42,0x4a,0xff,0x7e,0xe9,0x4b,0x5f,0xca,0xb4,0xce,0x56,0x3a,0x17,
+ 0x00,0x80,0x02,0x50,0x17,0x42,0x27,0x58,0x29,0x5a,0x01,0x68,0xc6,0x7e,0x4a,0xa9,
+ 0xd9,0x10,0x76,0xdb,0x6d,0xb7,0x5c,0xfb,0x32,0x66,0xcc,0x98,0xdc,0x85,0x4e,0xef,
+ 0xde,0xbd,0x83,0x82,0xda,0x6e,0xbe,0xf9,0xe6,0x4c,0xa5,0x75,0x6d,0xc7,0xcc,0x37,
+ 0x61,0x8e,0xce,0xcf,0x0f,0xb2,0xac,0x5b,0xf5,0x5c,0x00,0x00,0x0a,0x40,0x5d,0x08,
+ 0xb5,0x8c,0x75,0xa5,0x3d,0xfa,0x59,0x85,0xd0,0x91,0x31,0xe2,0x11,0x23,0x46,0xe4,
+ 0xda,0x97,0x7e,0xfd,0xfa,0x79,0x97,0x79,0xfd,0xf5,0xd7,0x33,0xaf,0x37,0x24,0x1b,
+ 0x60,0xf1,0xe2,0xc5,0x4a,0x17,0xda,0xa9,0x7a,0xdf,0x7f,0xff,0xfb,0xdf,0xe7,0x6e,
+ 0xfd,0xb7,0xe2,0xb9,0x00,0x80,0x75,0xe9,0xca,0x21,0xc8,0x97,0x2d,0xb6,0xd8,0x22,
+ 0x68,0xb9,0xb9,0x73,0xe7,0xd2,0x4f,0x83,0x90,0xa9,0x72,0x57,0xad,0x5a,0x15,0xcd,
+ 0x48,0x97,0x27,0x13,0x26,0x4c,0xf0,0x2e,0x53,0xcd,0xec,0x77,0x62,0x79,0xeb,0xe2,
+ 0x35,0x4a,0x97,0x59,0x4e,0x5d,0x4e,0x66,0x08,0x3c,0xe9,0xa4,0x93,0x32,0xaf,0x7f,
+ 0xfe,0xfc,0xf9,0x4a,0xcf,0x3f,0x90,0xba,0xcc,0x80,0x01,0x03,0x82,0x3c,0x11,0xad,
+ 0x7e,0x2e,0xfe,0xfe,0xf7,0xbf,0xab,0xc7,0x1e,0x7b,0xac,0xb4,0xf7,0x93,0x78,0x3e,
+ 0x98,0xf4,0x08,0x50,0x00,0xda,0x44,0x01,0x90,0xa0,0xad,0x25,0x4b,0x96,0xa8,0x5e,
+ 0xbd,0x7a,0xd1,0x4f,0x8d,0x2e,0x64,0xa3,0x66,0xcf,0x9e,0x1d,0xb4,0xbe,0xbc,0xa2,
+ 0xce,0xb3,0x0a,0xdb,0xac,0xe8,0x02,0x39,0x51,0xf0,0x9d,0xaf,0x76,0x82,0x08,0x51,
+ 0x99,0xf2,0x56,0x62,0x2b,0xb2,0xa0,0xd3,0xfa,0x22,0x0f,0x42,0x1a,0x32,0x1d,0x74,
+ 0xd6,0x6b,0xac,0x15,0xcf,0x85,0xcc,0x90,0x28,0xc7,0xab,0xac,0xc8,0x10,0x0d,0x0a,
+ 0x00,0xd4,0x1b,0x86,0x00,0x72,0x46,0x4f,0x06,0x13,0x1c,0x6d,0x5d,0x8f,0x39,0xd5,
+ 0x9b,0xa5,0x9f,0x7a,0xb6,0xb9,0xa8,0xf0,0x4c,0x59,0x11,0x41,0x2b,0x16,0x6f,0x56,
+ 0xf4,0x24,0x3a,0x91,0x22,0x90,0x86,0xf4,0x5b,0xa6,0x6e,0xce,0x4a,0x11,0xc1,0x7f,
+ 0xad,0x7c,0x2e,0x00,0x00,0x05,0xa0,0x70,0x24,0x57,0x3e,0xf4,0x41,0x4b,0x3f,0x3f,
+ 0x24,0xc4,0xe2,0x6c,0x34,0xd5,0x58,0x9e,0x32,0x04,0x10,0x52,0x25,0x2f,0xab,0x02,
+ 0xf0,0xe2,0x8b,0x2f,0x46,0x91,0xfa,0x69,0xec,0xb2,0xcb,0x2e,0x6a,0xfb,0xed,0xb7,
+ 0xcf,0xbc,0xcf,0xad,0x7a,0x2e,0x00,0x00,0x05,0xa0,0x34,0x82,0xb1,0x96,0xe8,0xef,
+ 0x56,0xeb,0xa7,0x14,0x78,0x29,0x3b,0xd5,0x9e,0xaf,0x90,0x60,0x40,0x5d,0x0b,0x3f,
+ 0xd3,0x18,0x75,0x51,0xd6,0x7f,0xab,0x9f,0x0b,0x00,0x40,0x01,0x28,0x14,0x49,0x01,
+ 0x0b,0xa1,0x6b,0xd7,0xae,0xf4,0x73,0x0d,0xcd,0x10,0x14,0x59,0x6d,0xd5,0xbe,0xa3,
+ 0x8f,0x3e,0x3a,0xe8,0x58,0x85,0xd6,0x04,0x58,0xb6,0x6c,0x59,0x34,0xa6,0x9d,0x46,
+ 0xdf,0xbe,0x7d,0xd5,0xf1,0xc7,0x1f,0x5f,0xd5,0xfe,0xb6,0xf2,0xb9,0x00,0x00,0x14,
+ 0x80,0x42,0xf1,0x55,0x65,0x8b,0x91,0x08,0x6d,0xfa,0xd9,0x3c,0x0f,0xf4,0x6a,0x15,
+ 0x36,0x49,0x6d,0x3b,0xf2,0xc8,0x23,0xbd,0xcb,0x5d,0x77,0xdd,0x75,0x91,0x70,0xf7,
+ 0x71,0xd3,0x4d,0x37,0x79,0xad,0x74,0x11,0xfe,0xa2,0x04,0xb4,0xaa,0x70,0x6d,0x76,
+ 0xe5,0x19,0xa0,0x14,0xf7,0x11,0x87,0x20,0x7f,0x16,0x2d,0x5a,0x14,0xb4,0xdc,0xc0,
+ 0x81,0x03,0xe9,0xe7,0x1a,0xf4,0x24,0x2f,0x2d,0x2d,0x74,0xa4,0x34,0xb0,0xcf,0x6a,
+ 0x97,0x58,0x09,0x3d,0x21,0x8e,0x37,0x6d,0xaf,0x48,0xf7,0x7f,0xab,0x9e,0x8b,0xdd,
+ 0x77,0xdf,0x5d,0xcd,0x9a,0x35,0xab,0xb4,0xfd,0xc9,0x5a,0xa8,0x09,0x00,0x05,0xa0,
+ 0xc9,0x05,0x63,0xb3,0x7b,0x00,0xf2,0xec,0xe7,0x7a,0xeb,0xad,0x17,0xb4,0xae,0xef,
+ 0x7d,0xef,0x7b,0x99,0xa6,0x24,0x2e,0x0b,0x32,0x15,0xef,0xa8,0x51,0xa3,0x94,0x9e,
+ 0x29,0x30,0x75,0x39,0xa9,0x09,0x90,0xa6,0x00,0x48,0x4d,0x81,0xfb,0xef,0xbf,0x3f,
+ 0x75,0x1d,0x12,0xf8,0x27,0x01,0x80,0xd5,0xd2,0x8a,0xe7,0xe2,0xcc,0x33,0xcf,0x8c,
+ 0x1a,0x00,0xfc,0x7f,0x18,0x02,0x28,0x00,0x5f,0x6e,0xb6,0x20,0x6e,0xe1,0x2e,0x5d,
+ 0xba,0xd0,0xcf,0x8c,0x42,0x27,0xa4,0x50,0x4c,0x29,0x6f,0xb4,0xce,0x9d,0xa3,0x94,
+ 0x40,0x1f,0x77,0xdf,0x7d,0xb7,0x7a,0xff,0xfd,0xf7,0x9d,0xdf,0xff,0xe1,0x0f,0x7f,
+ 0xf0,0xa6,0xe8,0xd5,0x62,0xfd,0xb7,0xc3,0xb9,0x00,0x00,0x14,0x80,0x42,0x90,0xa9,
+ 0x59,0x43,0xc6,0x50,0x9b,0xdd,0xfd,0x9f,0x77,0x3f,0xa5,0xae,0x40,0x88,0xa2,0xd0,
+ 0xcc,0x42,0x47,0x8a,0x02,0xf9,0x90,0x22,0x3c,0x32,0x4d,0xb0,0x0d,0xc9,0x7d,0x17,
+ 0x05,0x20,0x0d,0x29,0xfa,0xf3,0x99,0xcf,0x7c,0xa6,0xa6,0xfd,0x6c,0x87,0x73,0x01,
+ 0x00,0x28,0x00,0xb9,0xe3,0x9b,0x98,0x25,0x66,0xf3,0xcd,0x37,0xa7,0x9f,0x09,0xa4,
+ 0x58,0x8e,0xcc,0x59,0xef,0x43,0xd2,0xe5,0x42,0x87,0x1e,0xca,0x86,0x54,0x4f,0x94,
+ 0xb1,0x68,0x1f,0xae,0x6c,0x00,0xf1,0x0e,0xc8,0x14,0xc2,0x69,0xc8,0xf0,0x41,0xad,
+ 0xca,0x65,0x3b,0x9c,0x0b,0x00,0x40,0x01,0x68,0x98,0x60,0xac,0x65,0x8c,0xb6,0x55,
+ 0xfb,0xb9,0xd3,0x4e,0x3b,0x05,0x59,0xc8,0x22,0x08,0x9b,0x15,0x09,0x06,0xf4,0x21,
+ 0xb3,0xdd,0x49,0xa1,0x1f,0x93,0xa2,0x26,0xfe,0x69,0xd7,0x73,0x01,0x80,0x02,0x00,
+ 0x28,0x00,0x25,0xe9,0x67,0xe8,0xdc,0xf2,0xb7,0xdc,0x72,0x4b,0xd3,0x1e,0xb7,0x63,
+ 0x8e,0x39,0x26,0xa8,0x84,0xb2,0xe9,0x05,0x90,0x21,0x97,0x3b,0xee,0xb8,0x23,0xf5,
+ 0x37,0x12,0x49,0x2e,0x13,0x10,0xe5,0x41,0x3b,0x9c,0x0b,0x00,0x14,0x00,0xc8,0x95,
+ 0xd0,0x79,0xd4,0x9b,0x5d,0x01,0x28,0xa2,0x9f,0xfb,0xed,0xb7,0x5f,0xd0,0x72,0x77,
+ 0xde,0x79,0x67,0x64,0x7d,0x36,0x23,0x32,0xbe,0x7e,0xf8,0xe1,0x87,0x7b,0x97,0x93,
+ 0x38,0x80,0x64,0xbd,0x7b,0x51,0x08,0x7c,0x75,0x17,0xf2,0xb2,0xfe,0xdb,0xe5,0x5c,
+ 0x00,0xa0,0x00,0x40,0x6e,0x48,0xf4,0xb6,0xaf,0x3e,0xbb,0x30,0x74,0xe8,0xd0,0x28,
+ 0x25,0x8c,0x7e,0xae,0x8d,0xa4,0xaf,0x85,0x8c,0x3d,0x4b,0x11,0x9c,0xbf,0xfd,0xed,
+ 0x6f,0x4d,0x7b,0xfc,0x42,0x4a,0x03,0xcf,0x98,0x31,0x43,0xdd,0x73,0xcf,0x3d,0x1d,
+ 0x7f,0xfb,0x72,0xff,0xc5,0xab,0x10,0x12,0x64,0xc8,0xb9,0x00,0x00,0x14,0x80,0x02,
+ 0x90,0x39,0xc7,0x43,0x22,0xe3,0x0f,0x39,0xe4,0x10,0xfa,0x69,0xbb,0x18,0x75,0xaa,
+ 0x5c,0xa8,0xe5,0x79,0xfe,0xf9,0xe7,0x37,0xed,0x8c,0x70,0x07,0x1d,0x74,0x90,0x1a,
+ 0x36,0x6c,0x98,0x77,0x39,0xa9,0x09,0x20,0x88,0xb7,0xc5,0x37,0xe4,0x72,0xc4,0x11,
+ 0x47,0x04,0x09,0x6c,0xce,0x05,0x00,0xa0,0x00,0x14,0x80,0x2b,0x7d,0xcb,0xe4,0x94,
+ 0x53,0x4e,0xa1,0x9f,0x0e,0xce,0x38,0xe3,0x8c,0xa0,0xe5,0x44,0x20,0x5e,0x73,0xcd,
+ 0x35,0x4d,0x79,0xfc,0xa4,0x8a,0x5d,0x48,0xaa,0xde,0xad,0xb7,0xde,0x1a,0x4d,0xa5,
+ 0x5c,0xcf,0xe0,0xbf,0x76,0x3b,0x17,0x00,0x28,0x00,0x6d,0xc4,0xd2,0xa5,0x4b,0x0b,
+ 0x59,0xaf,0x58,0x69,0xf7,0xde,0x7b,0xaf,0x77,0xb9,0x2d,0xb7,0xdc,0x52,0x7d,0xfc,
+ 0xe3,0x1f,0xa7,0x9f,0x0e,0xf6,0xdc,0x73,0x4f,0xb5,0xf7,0xde,0x7b,0x07,0x2d,0x7b,
+ 0xce,0x39,0xe7,0xa8,0x77,0xdf,0x7d,0xb7,0x29,0xaf,0xc3,0x10,0x77,0xbd,0x9c,0x43,
+ 0x11,0xfe,0xd7,0x5f,0x7f,0x7d,0xea,0x72,0x9b,0x6e,0xba,0x69,0x54,0x69,0x30,0x6f,
+ 0xda,0xe5,0x5c,0x00,0xa0,0x00,0xb4,0x09,0x22,0x94,0xde,0x7a,0xeb,0xad,0xdc,0xd7,
+ 0x7b,0xde,0x79,0xe7,0x05,0x2d,0x77,0xf2,0xc9,0x27,0xd3,0x4f,0x0f,0xe7,0x9e,0x7b,
+ 0x6e,0xd0,0x72,0x12,0x19,0x2f,0x33,0xed,0x2d,0x5f,0xbe,0xbc,0xe9,0xae,0xc3,0xed,
+ 0xb6,0xdb,0x4e,0xed,0xb8,0xe3,0x8e,0xde,0xe5,0xce,0x3e,0xfb,0x6c,0x6f,0xc5,0x45,
+ 0xf1,0xb4,0x48,0xee,0x7e,0x11,0xb4,0xc3,0xb9,0x00,0x40,0x01,0x68,0x13,0x9e,0x7b,
+ 0xee,0xb9,0x28,0xc7,0x39,0xc4,0x8a,0x0d,0xe5,0xb2,0xcb,0x2e,0x53,0x0f,0x3c,0xf0,
+ 0x80,0x77,0xb9,0x9e,0x3d,0x7b,0xe6,0x1a,0xa8,0xd5,0xaa,0xfd,0x3c,0xe0,0x80,0x03,
+ 0xd4,0x6e,0xbb,0xed,0x16,0xb4,0xec,0xe3,0x8f,0x3f,0x1e,0x09,0xc0,0xd0,0x99,0x09,
+ 0xcb,0x44,0x48,0x30,0xa0,0x0f,0x19,0x4e,0x08,0xa9,0x2d,0xc0,0xb9,0x00,0x80,0xb6,
+ 0x57,0x00,0x84,0xd9,0xb3,0x67,0xab,0x83,0x0f,0x3e,0x38,0x9a,0xc8,0xa4,0x56,0x57,
+ 0xb9,0x44,0x6a,0x9f,0x75,0xd6,0x59,0xc1,0xd6,0xd4,0x06,0x1b,0x6c,0x40,0x3f,0x03,
+ 0xb8,0xf4,0xd2,0x4b,0x55,0xf7,0xee,0xdd,0x83,0x96,0xbd,0xfa,0xea,0xab,0x23,0x41,
+ 0x35,0x73,0xe6,0xcc,0x42,0x8e,0xa3,0x04,0xb8,0xf9,0xa6,0xdf,0xad,0x06,0x99,0xb2,
+ 0xb7,0x5b,0xb7,0x6e,0x35,0xad,0xe3,0xb0,0xc3,0x0e,0x0b,0x0a,0x28,0xe4,0x5c,0x00,
+ 0xc0,0x3a,0x54,0x0a,0xe6,0xe2,0x8b,0x2f,0x96,0x99,0x4b,0xbc,0xad,0x5e,0xdb,0x31,
+ 0xdb,0x46,0x1b,0x6d,0x54,0xd1,0x63,0xac,0x55,0x6d,0x53,0xd7,0x65,0xaf,0xe8,0x39,
+ 0xd7,0x83,0xb6,0xf3,0x91,0x8f,0x7c,0xa4,0xa2,0xdd,0xa3,0xf4,0x33,0x03,0xda,0xe3,
+ 0x90,0xa9,0x8f,0xa3,0x47,0x8f,0xae,0xe8,0x60,0xb4,0x8a,0x16,0x12,0x35,0x6f,0x5b,
+ 0x4f,0xcd,0x5b,0xb9,0xee,0xba,0xeb,0x2a,0x9f,0xfd,0xec,0x67,0x2b,0x3a,0xba,0xbe,
+ 0xb2,0xe1,0x86,0x1b,0x16,0x72,0x7f,0xe8,0x9a,0x00,0x55,0x9d,0xcf,0xb8,0xdd,0x75,
+ 0xd7,0x5d,0x95,0x7a,0xd0,0x0e,0xe7,0x02,0xa0,0xdd,0x68,0x7b,0x05,0x20,0x6e,0xba,
+ 0x82,0x5a,0x45,0xcf,0xd7,0x5e,0x59,0xb8,0x70,0xa1,0x77,0x5b,0x2f,0xbf,0xfc,0x72,
+ 0x45,0xa7,0x5d,0x05,0xaf,0x5b,0x8f,0xcf,0x56,0x1e,0x79,0xe4,0x91,0xba,0x1e,0xcf,
+ 0x66,0xef,0x67,0x8c,0x9e,0x41,0x2f,0x73,0x1f,0x75,0xcd,0xfd,0x48,0x69,0xd1,0x56,
+ 0x68,0xa6,0x6d,0x4d,0x9a,0x34,0xa9,0xf2,0x8b,0x5f,0xfc,0xa2,0xa2,0xab,0xe0,0x55,
+ 0xb4,0x65,0xbe,0xd6,0x3a,0x75,0x4d,0x83,0x42,0xee,0x8f,0x9b,0x6f,0xbe,0xb9,0xea,
+ 0x73,0x29,0x42,0x36,0x0f,0x01,0xcb,0xb9,0x00,0x68,0x4f,0xba,0xe2,0x03,0xf9,0x10,
+ 0x89,0x6e,0x97,0xd6,0xa7,0x4f,0x9f,0xa8,0x52,0x9b,0x8c,0x7b,0x6a,0xab,0x59,0x69,
+ 0x6b,0x23,0x72,0x9f,0x4b,0x84,0xb3,0x7e,0x28,0x45,0x11,0xd9,0x52,0xab,0x3d,0x0b,
+ 0xa7,0x9e,0x7a,0x6a,0x6e,0x25,0x5a,0xdb,0xad,0x9f,0x97,0x5f,0x7e,0x79,0xb4,0x1f,
+ 0x2f,0xbd,0xf4,0x52,0xf0,0x6f,0x24,0x2d,0xed,0xa4,0x93,0x4e,0x8a,0x02,0xe3,0x24,
+ 0xd8,0x6e,0x9f,0x7d,0xf6,0x51,0x9b,0x6c,0xb2,0x49,0x94,0x27,0xdf,0xbb,0x77,0xef,
+ 0x68,0x02,0x9b,0xb9,0x73,0xe7,0x46,0x41,0x92,0xd2,0xde,0x7e,0xfb,0xed,0xe8,0x55,
+ 0x02,0xd9,0xea,0xcd,0x27,0x3f,0xf9,0xc9,0x68,0xfa,0xdd,0x59,0xb3,0x66,0x65,0xfe,
+ 0xad,0x04,0x5a,0x4a,0xbe,0x7e,0xbd,0x68,0xf5,0x73,0x01,0xc0,0x10,0x40,0x9b,0x7a,
+ 0x00,0x8a,0x6a,0x87,0x1e,0x7a,0x68,0x6e,0x2e,0xf1,0x76,0xea,0x67,0x12,0x5d,0x15,
+ 0xaf,0xb2,0xeb,0xae,0xbb,0x36,0xb4,0x7f,0x45,0x5a,0x9d,0x3a,0xdf,0x3e,0xf3,0xfe,
+ 0xe8,0xe9,0x7a,0x2b,0x53,0xa7,0x4e,0xad,0xbb,0xc5,0xd0,0xea,0xe7,0x02,0xa0,0x9d,
+ 0x68,0xbb,0x20,0xc0,0x6f,0x7f,0xfb,0xdb,0x75,0xdb,0x96,0x54,0x52,0x13,0x4b,0xba,
+ 0xd6,0x40,0xaf,0x76,0xef,0xa7,0x94,0x14,0x7e,0xf0,0xc1,0x07,0xd5,0x51,0x47,0x1d,
+ 0xd5,0x92,0xd7,0x64,0x35,0xd9,0x00,0x12,0xdc,0x39,0x72,0xe4,0xc8,0xba,0xef,0x6b,
+ 0xab,0x9f,0x0b,0x80,0x76,0xa2,0xed,0x14,0x80,0x1f,0xff,0xf8,0xc7,0xea,0x82,0x0b,
+ 0x2e,0x28,0x7c,0x3b,0xe3,0xc6,0x8d,0x53,0xb7,0xdd,0x76,0x5b,0x94,0x12,0x47,0x3f,
+ 0x6b,0xa7,0x57,0xaf,0x5e,0x91,0x92,0x21,0x05,0x67,0x5a,0x0d,0x49,0xd7,0xdc,0x7a,
+ 0xeb,0xad,0x33,0xfd,0xa6,0x88,0xca,0x7f,0x9c,0x0b,0x00,0x14,0x80,0x96,0xe7,0x5b,
+ 0xdf,0xfa,0x96,0xd2,0x81,0x49,0xd1,0xcc,0x6c,0x79,0xa3,0x5d,0xb3,0xea,0x1b,0xdf,
+ 0xf8,0x86,0xba,0xef,0xbe,0xfb,0xa2,0x71,0x76,0xfa,0x99,0x1f,0x32,0x8e,0xfc,0xd3,
+ 0x9f,0xfe,0x54,0xe9,0xc8,0xf7,0x68,0x3c,0xb9,0x95,0xc8,0x92,0xcb,0x3f,0x7c,0xf8,
+ 0x70,0xf5,0xa9,0x4f,0x7d,0xaa,0xa1,0xfb,0xdb,0xca,0xe7,0x02,0x00,0x05,0xa0,0xc5,
+ 0x91,0x07,0xae,0x04,0x28,0xc9,0x6b,0x5e,0x55,0xd4,0xb6,0xdd,0x76,0x5b,0xf5,0xe4,
+ 0x93,0x4f,0xaa,0x0b,0x2f,0xbc,0xb0,0x61,0x96,0x7f,0x3b,0xf4,0x53,0xdc,0xdf,0xff,
+ 0xfa,0xd7,0xbf,0xa2,0x29,0x72,0x25,0x80,0xb1,0x48,0x64,0x58,0x43,0xbc,0x1c,0xa7,
+ 0x9f,0x7e,0x7a,0xa1,0xdb,0x39,0xe1,0x84,0x13,0x22,0xa5,0x2a,0x04,0x09,0xaa,0x93,
+ 0x02,0x40,0x65,0xa0,0x15,0xcf,0x05,0x40,0xdb,0x50,0x74,0x90,0x81,0x8e,0x1c,0xf6,
+ 0x06,0xf5,0x68,0x0b,0xb2,0xa1,0xc1,0x86,0x3a,0x2a,0xbe,0x32,0x7e,0xfc,0xf8,0x68,
+ 0x3f,0x54,0xc6,0x80,0x24,0x1d,0x85,0x5d,0xd1,0x63,0xe0,0x15,0x5d,0xb3,0xbd,0xb0,
+ 0x20,0xb8,0x76,0xec,0x67,0x28,0x3a,0x73,0xa1,0x72,0xe5,0x95,0x57,0x46,0xe9,0x8a,
+ 0xfd,0xfa,0xf5,0xab,0x39,0xc0,0x4c,0x2b,0x34,0x15,0x5d,0xff,0xbe,0xa2,0x4b,0x1e,
+ 0x57,0x74,0x15,0xc5,0x8a,0x8e,0x52,0xaf,0x5b,0x5f,0xf4,0xec,0x89,0x41,0xa9,0x96,
+ 0x93,0x27,0x4f,0x2e,0x65,0x40,0x51,0x2b,0x9d,0x0b,0x80,0x76,0xa0,0x93,0xfc,0xd7,
+ 0x0a,0x8a,0xcc,0x25,0x97,0x5c,0x12,0xd5,0x4d,0x0f,0x50,0x78,0x9c,0xdf,0x2d,0x59,
+ 0xb2,0x24,0x72,0x69,0xea,0xdc,0xec,0xc8,0x6a,0x96,0x94,0x38,0x49,0x47,0x5a,0xb9,
+ 0x72,0x65,0x34,0xdf,0xba,0x94,0x38,0x95,0x0a,0x77,0x23,0x46,0x8c,0x88,0x02,0xb0,
+ 0x24,0xf8,0xed,0x98,0x63,0x8e,0x89,0x5c,0xb2,0xf4,0xb3,0xf1,0xc8,0x7e,0xeb,0x3a,
+ 0x04,0xd1,0x74,0xc5,0x92,0xaa,0xf6,0xfe,0xfb,0xef,0x47,0x4d,0xaa,0xd2,0xc9,0x77,
+ 0xd2,0xb7,0x65,0xcb,0x96,0x29,0x2d,0x9c,0xa2,0xbe,0x48,0x05,0x3d,0x79,0x95,0x26,
+ 0x69,0x90,0x92,0x12,0xa9,0x23,0xdc,0xa3,0xe5,0x80,0x73,0x01,0xd0,0xea,0xa0,0x00,
+ 0x78,0x90,0x79,0xef,0x25,0x4f,0x59,0x5c,0xae,0x32,0xd6,0xdd,0x68,0xd7,0x6b,0xbb,
+ 0xf4,0x33,0x67,0x2f,0x57,0xd4,0x37,0x71,0xb1,0xc7,0xfd,0x03,0xce,0x05,0x40,0xbb,
+ 0x43,0x21,0x20,0x0f,0x52,0x68,0x45,0x8a,0x96,0xd0,0xcf,0x26,0xd6,0x72,0x75,0xec,
+ 0xc3,0xe0,0xc1,0x83,0xb9,0x98,0x39,0x17,0x00,0x90,0x7c,0xee,0x73,0x08,0x00,0x00,
+ 0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,
+ 0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,
+ 0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00,0x00,
+ 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00,
+ 0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x20,0x23,0x2d,0x33,0x1d,0xf0,0x56,0x5b,
+ 0x6d,0xa5,0xf6,0xdd,0x77,0xdf,0xd4,0x65,0xfa,0xf6,0xed,0x4b,0x3f,0x01,0x00,0x00,
+ 0x34,0x9d,0x2a,0x1a,0x0e,0x03,0x00,0x00,0x40,0x7b,0xc1,0x10,0x00,0x00,0x00,0x00,
+ 0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,
+ 0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,
+ 0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,
+ 0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,
+ 0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,
+ 0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,
+ 0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,
+ 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,
+ 0x00,0x00,0x00,0x94,0x8a,0xae,0x1c,0x02,0x00,0x28,0x33,0x2b,0x57,0xae,0x54,0x73,
+ 0xe7,0xce,0x4d,0x5d,0xa6,0x5b,0xb7,0x6e,0x6a,0xe0,0xc0,0x81,0x1c,0x2c,0x00,0x14,
+ 0x00,0x00,0x68,0x15,0x7e,0xf7,0xbb,0xdf,0xa9,0x33,0xcf,0x3c,0x33,0x75,0x99,0xee,
+ 0xdd,0xbb,0xab,0x65,0xcb,0x96,0x71,0xb0,0x00,0x32,0xc0,0x10,0x00,0x00,0x94,0x9a,
+ 0xe5,0xcb,0x97,0xe7,0xb2,0x0c,0x00,0xa0,0x00,0x00,0x00,0x00,0xa0,0x00,0x70,0x08,
+ 0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00,
+ 0x00,0x00,0x00,0xa0,0x25,0x20,0x0d,0x10,0x00,0xa0,0x4d,0x59,0xb0,0x60,0x81,0x7a,
+ 0xf3,0xcd,0x37,0xa3,0x36,0x65,0xca,0x94,0xe8,0x75,0xda,0xb4,0x69,0xea,0xdc,0x73,
+ 0xcf,0x55,0xdb,0x6d,0xb7,0x1d,0x07,0x08,0x05,0x00,0x00,0x00,0x5a,0x81,0xf9,0xf3,
+ 0xe7,0xab,0x93,0x4f,0x3e,0xb9,0x43,0xe0,0xcf,0x9e,0x3d,0xdb,0xba,0xdc,0xe1,0x87,
+ 0x1f,0x8e,0x02,0x80,0x02,0x00,0x00,0xd0,0x58,0xc6,0x8f,0x1f,0xaf,0x36,0xd8,0x60,
+ 0x83,0xd4,0x65,0xfa,0xf6,0xed,0xcb,0x81,0x0a,0x60,0xc9,0x92,0x25,0xea,0x86,0x1b,
+ 0x6e,0xe0,0x40,0x00,0x0a,0x00,0x00,0x94,0x9f,0xd1,0xa3,0x47,0xab,0x13,0x4f,0x3c,
+ 0x91,0x03,0x01,0x90,0x33,0x04,0x01,0x02,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,
+ 0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,
+ 0x34,0x29,0x64,0x01,0x00,0x34,0x88,0x79,0xf3,0xe6,0x75,0x14,0x61,0x79,0xeb,0xad,
+ 0xb7,0xd4,0xea,0xd5,0xab,0xd5,0xd0,0xa1,0x43,0xd5,0xf0,0xe1,0xc3,0xd5,0xb0,0x61,
+ 0xc3,0xd4,0xa8,0x51,0xa3,0x54,0x9f,0x3e,0x7d,0x9a,0xba,0x8f,0x92,0x76,0x36,0x79,
+ 0xf2,0xe4,0xa8,0x49,0xde,0xf9,0xaa,0x55,0xab,0xd4,0x7a,0xeb,0xad,0x17,0xb5,0xfd,
+ 0xf7,0xdf,0x5f,0x75,0xef,0xde,0xbd,0x6d,0xce,0x75,0x7c,0x1c,0xde,0x7e,0xfb,0x6d,
+ 0xd5,0xb9,0x73,0x67,0xb5,0xfe,0xfa,0xeb,0x47,0xe9,0x8d,0x5b,0x6c,0xb1,0x45,0x74,
+ 0xae,0xc1,0xcf,0xa2,0x45,0x8b,0xd4,0xd4,0xa9,0x53,0xd5,0xf4,0xe9,0xd3,0xd5,0xbb,
+ 0xef,0xbe,0x1b,0xbd,0x2e,0x5c,0xb8,0x50,0x0d,0x19,0x32,0x24,0xba,0x67,0xa4,0x8d,
+ 0x18,0x31,0x42,0x6d,0xb2,0xc9,0x26,0xaa,0x53,0xa7,0x4e,0xdc,0x3b,0x28,0x00,0x00,
+ 0xb5,0x21,0x37,0xdf,0x03,0x0f,0x3c,0x90,0xba,0x8c,0x08,0xea,0x63,0x8f,0x3d,0x36,
+ 0x75,0x99,0x95,0x2b,0x57,0xaa,0x1b,0x6f,0xbc,0x51,0xfd,0xee,0x77,0xbf,0x53,0x2f,
+ 0xbc,0xf0,0x82,0xfa,0xe0,0x83,0x0f,0xd2,0x6f,0xce,0xae,0x5d,0xd5,0xbe,0xfb,0xee,
+ 0xab,0x8e,0x3a,0xea,0x28,0x75,0xc4,0x11,0x47,0x78,0x73,0xe1,0xcb,0xd2,0xcf,0xd7,
+ 0x5f,0x7f,0x5d,0xfd,0xec,0x67,0x3f,0x53,0x7f,0xff,0xfb,0xdf,0xa3,0x07,0x74,0xa5,
+ 0x52,0xb1,0x2e,0xf7,0xce,0x3b,0xef,0x44,0x0f,0xeb,0x7a,0xed,0x57,0x3d,0xb7,0x23,
+ 0x0f,0xeb,0xdb,0x6e,0xbb,0x4d,0x5d,0x76,0xd9,0x65,0xea,0xd9,0x67,0x9f,0x55,0x73,
+ 0xe7,0xce,0x4d,0x5d,0x7e,0xab,0xad,0xb6,0x52,0x07,0x1f,0x7c,0xb0,0xfa,0xea,0x57,
+ 0xbf,0x1a,0x09,0xaf,0x3c,0x84,0xc7,0x5f,0xff,0xfa,0xd7,0x75,0x8e,0xfd,0xcc,0x99,
+ 0x33,0x83,0x7e,0x7f,0xe7,0x9d,0x77,0xaa,0x65,0xcb,0x96,0x65,0xda,0xe6,0xae,0xbb,
+ 0xee,0xaa,0xb6,0xd9,0x66,0x9b,0xdc,0xaf,0x4b,0x29,0x56,0x74,0xeb,0xad,0xb7,0xaa,
+ 0xeb,0xaf,0xbf,0x5e,0xdd,0x77,0xdf,0x7d,0x6a,0xc5,0x8a,0x15,0xde,0xdf,0x88,0x42,
+ 0x25,0xf7,0xcc,0x91,0x47,0x1e,0xa9,0xf6,0xd8,0x63,0x0f,0xd5,0xa5,0x4b,0x97,0xb6,
+ 0xbc,0x77,0xbc,0x54,0x00,0x20,0x95,0x8b,0x2f,0xbe,0x58,0xee,0x42,0x6f,0x73,0xa1,
+ 0x1f,0x60,0x95,0x9f,0xfc,0xe4,0x27,0x95,0x91,0x23,0x47,0x06,0xad,0xc7,0xd6,0xb4,
+ 0xc5,0x58,0x39,0xfe,0xf8,0xe3,0x2b,0xfa,0xa1,0x50,0xda,0x7e,0x3e,0xf5,0xd4,0x53,
+ 0x15,0xad,0xac,0x44,0xfb,0x1a,0xb2,0x1e,0xfd,0x10,0xab,0xcb,0x7e,0xd5,0xab,0xff,
+ 0xf1,0xb9,0xbe,0xe8,0xa2,0x8b,0x2a,0x1b,0x6d,0xb4,0x51,0x55,0xe7,0xb9,0x5b,0xb7,
+ 0x6e,0x95,0xaf,0x7c,0xe5,0x2b,0x15,0x2d,0xa8,0x6b,0xea,0xcb,0x33,0xcf,0x3c,0x53,
+ 0xf5,0xb5,0x56,0x6d,0x3b,0xeb,0xac,0xb3,0x72,0xbd,0x1e,0x27,0x4e,0x9c,0x58,0xd1,
+ 0x15,0x09,0x2b,0x5a,0x11,0xae,0x69,0xbf,0x36,0xde,0x78,0xe3,0xca,0x1d,0x77,0xdc,
+ 0x51,0xea,0x67,0x44,0x51,0xf7,0x8e,0x0f,0x62,0x00,0x00,0x0a,0xe4,0xe6,0x9b,0x6f,
+ 0x8e,0x0a,0xd9,0x7c,0xeb,0x5b,0xdf,0x8a,0x6a,0xac,0x57,0x8b,0x0c,0x0f,0x5c,0x7b,
+ 0xed,0xb5,0x6a,0xcb,0x2d,0xb7,0x8c,0x3c,0x08,0xf2,0x77,0x59,0x90,0x7d,0x39,0xfd,
+ 0xf4,0xd3,0x23,0x0b,0x50,0x3c,0x1c,0x65,0xda,0xb7,0x7a,0xf2,0xe7,0x3f,0xff,0x39,
+ 0x3a,0xd7,0xdf,0xf8,0xc6,0x37,0xa2,0x21,0x9d,0x6a,0x10,0xeb,0x56,0xbc,0x06,0xbb,
+ 0xec,0xb2,0x8b,0x7a,0xf9,0xe5,0x97,0xdb,0xf2,0x38,0x8a,0xe7,0xe1,0xfb,0xdf,0xff,
+ 0x7e,0xe4,0x4d,0x10,0xcb,0x5f,0x3c,0x67,0xb5,0x20,0x43,0x6c,0x87,0x1e,0x7a,0x68,
+ 0xe4,0x49,0x13,0xcb,0xb9,0x4c,0x34,0xfa,0xde,0x41,0x01,0x00,0x28,0x88,0x4b,0x2e,
+ 0xb9,0x44,0x1d,0x7d,0xf4,0xd1,0xd1,0xb8,0x65,0x5e,0xc8,0x58,0xb2,0xb6,0x10,0xa3,
+ 0x07,0x5a,0x56,0x17,0x6d,0x51,0x0f,0x6b,0x71,0x6b,0x8a,0xd0,0x6a,0x57,0x44,0x68,
+ 0x8b,0xeb,0x5e,0xaa,0x15,0xe6,0x75,0xae,0x45,0x68,0x8d,0x1b,0x37,0x4e,0x3d,0xfe,
+ 0xf8,0xe3,0x6d,0x75,0x2c,0x9f,0x7b,0xee,0xb9,0x48,0xf0,0xff,0xe0,0x07,0x3f,0xc8,
+ 0xfd,0xfa,0xbe,0xe9,0xa6,0x9b,0xd4,0x0e,0x3b,0xec,0xa0,0xfe,0xfd,0xef,0x7f,0x97,
+ 0x46,0xd1,0x69,0xf4,0xbd,0x83,0x02,0x00,0x90,0x33,0x62,0xb1,0x9c,0x76,0xda,0x69,
+ 0xea,0xec,0xb3,0xcf,0x2e,0x4c,0xa3,0xbf,0xeb,0xae,0xbb,0x22,0x8b,0x66,0xf9,0xf2,
+ 0xe5,0x0d,0xeb,0xa7,0x4c,0x2c,0x73,0xc8,0x21,0x87,0xb4,0x75,0x6d,0x79,0xb1,0x28,
+ 0xf7,0xde,0x7b,0x6f,0xf5,0xdb,0xdf,0xfe,0x36,0xf7,0x75,0x8b,0xb2,0x27,0x0a,0x64,
+ 0xe8,0xb8,0x7d,0xb3,0xf3,0xc4,0x13,0x4f,0xa8,0xfd,0xf6,0xdb,0x4f,0x4d,0x9a,0x34,
+ 0xa9,0xb0,0x6d,0xcc,0x9a,0x35,0x4b,0x1d,0x70,0xc0,0x01,0xea,0xb5,0xd7,0x5e,0x6b,
+ 0x68,0x5f,0xcb,0x72,0xef,0xa0,0x00,0x00,0xe4,0xcc,0x67,0x3f,0xfb,0x59,0x75,0xc5,
+ 0x15,0x57,0x14,0xbe,0x1d,0x09,0xd4,0x3a,0xe6,0x98,0x63,0x82,0x82,0xa2,0xf2,0x46,
+ 0x82,0xdc,0x24,0x68,0xcd,0x17,0xf8,0xd4,0xca,0xbc,0xf1,0xc6,0x1b,0x6a,0xa7,0x9d,
+ 0x76,0x2a,0xd4,0x4a,0x97,0x48,0x77,0xb9,0x9e,0x5a,0x9d,0x87,0x1f,0x7e,0x58,0x1d,
+ 0x74,0xd0,0x41,0x91,0xd2,0x53,0x34,0xef,0xbd,0xf7,0x5e,0x14,0x45,0x2f,0x5e,0x96,
+ 0x46,0x50,0xa6,0x7b,0x07,0x05,0x00,0x20,0x47,0xae,0xbe,0xfa,0x6a,0x75,0xdd,0x75,
+ 0xd7,0xd5,0x6d,0x7b,0x32,0x46,0xfa,0xa3,0x1f,0xfd,0xa8,0xee,0xfd,0xfc,0xf9,0xcf,
+ 0x7f,0xde,0x76,0xee,0x69,0xd3,0x82,0x3b,0xec,0xb0,0xc3,0x22,0x61,0x52,0x34,0xf7,
+ 0xdc,0x73,0x8f,0xfa,0xc7,0x3f,0xfe,0xd1,0xb2,0xc7,0xf2,0xd1,0x47,0x1f,0x8d,0xac,
+ 0xe1,0x05,0x0b,0x16,0x04,0xff,0x46,0x07,0x4b,0x46,0xf1,0x16,0x3b,0xee,0xb8,0xa3,
+ 0xda,0x7a,0xeb,0xad,0xa3,0x34,0xc0,0x2c,0x88,0xe7,0x46,0xa6,0x45,0x6e,0x04,0x65,
+ 0xba,0x77,0x48,0x03,0x04,0xc8,0x09,0x09,0xf2,0x3b,0xf3,0xcc,0x33,0xb3,0x69,0xe0,
+ 0x3a,0x1f,0xbc,0xd6,0x61,0x82,0x0b,0x2f,0xbc,0x50,0x1d,0x77,0xdc,0x71,0x51,0x2a,
+ 0x59,0x3d,0xd0,0xd1,0xd9,0xea,0xbc,0xf3,0xce,0xcb,0xf4,0x1b,0xc9,0x59,0x6e,0xe4,
+ 0x70,0x45,0x9e,0xc8,0xf9,0xd2,0x19,0x19,0xea,0x95,0x57,0x5e,0xc9,0xf4,0x3b,0xc9,
+ 0xfb,0x97,0xdf,0x4a,0x5a,0x5b,0x35,0xe7,0xf8,0xc0,0x03,0x0f,0x0c,0x5e,0x7e,0xd0,
+ 0xa0,0x41,0x6a,0xec,0xd8,0xb1,0xeb,0xa4,0x91,0x2d,0x5e,0xbc,0x38,0x4a,0x2f,0xf3,
+ 0xd1,0xbb,0x77,0xef,0xa8,0x1e,0x45,0x16,0x74,0xe6,0x43,0xe6,0x7e,0x89,0xc5,0x7f,
+ 0xc2,0x09,0x27,0x44,0xfb,0xe5,0x43,0xf2,0xfa,0xe5,0xb8,0xcb,0xb8,0xb9,0xb8,0xf1,
+ 0x65,0x1f,0x93,0x48,0x0a,0x9d,0x28,0xc4,0xbf,0xfa,0xd5,0xaf,0x82,0x82,0xfd,0xee,
+ 0xbf,0xff,0xfe,0x28,0xb0,0x56,0xd6,0x59,0x2f,0x4a,0x77,0xef,0x90,0xe4,0x05,0x90,
+ 0x4f,0x8a,0x8f,0x76,0x61,0x7a,0x97,0xd1,0xf9,0xc9,0x95,0xf3,0xcf,0x3f,0xbf,0xa2,
+ 0x2d,0xba,0x8a,0x2e,0xf0,0x51,0xd1,0xf1,0x02,0xd1,0x36,0x96,0x2e,0x5d,0x5a,0xd1,
+ 0x02,0xa5,0x72,0xc1,0x05,0x17,0x54,0x74,0x10,0x54,0xe6,0x54,0xa7,0x3d,0xf7,0xdc,
+ 0xb3,0xa2,0x85,0x4b,0x5d,0xfa,0x29,0xdb,0xf2,0x2d,0xb3,0xd7,0x5e,0x7b,0x55,0xf4,
+ 0xb8,0x78,0x45,0xe7,0x6d,0x77,0xa4,0x2c,0xe9,0x5c,0xf8,0xca,0x83,0x0f,0x3e,0x58,
+ 0xf9,0xc5,0x2f,0x7e,0x51,0x39,0xe7,0x9c,0x73,0x2a,0xfa,0xa1,0xdf,0x94,0x69,0x80,
+ 0x3a,0xb6,0x23,0x68,0x39,0x9d,0xb1,0x51,0xb9,0xf4,0xd2,0x4b,0x2b,0xda,0xbd,0x5d,
+ 0xd1,0x63,0xcf,0x1d,0xdb,0xd1,0x6e,0xfd,0x8a,0xce,0xf3,0xae,0x6c,0xbf,0xfd,0xf6,
+ 0x99,0xce,0xb1,0x16,0x70,0x35,0xf7,0x71,0xc6,0x8c,0x19,0x41,0xdb,0xd2,0x19,0x0d,
+ 0x75,0xb9,0xb7,0x74,0xe0,0x64,0xd0,0xfe,0xe8,0xe0,0xbd,0xca,0xd3,0x4f,0x3f,0x1d,
+ 0xb4,0x4e,0xed,0x49,0xa8,0x9c,0x71,0xc6,0x19,0x41,0xeb,0xd5,0x4a,0x4e,0x45,0x2b,
+ 0x21,0x75,0xbb,0x76,0xea,0x7d,0xef,0xf8,0x40,0x01,0x00,0xc8,0xe9,0xe6,0x4e,0x6b,
+ 0xda,0x7a,0xab,0xdc,0x72,0xcb,0x2d,0x1d,0x02,0xdf,0x87,0x4e,0xf5,0xab,0xe8,0xc2,
+ 0x21,0x99,0xb6,0xa1,0x87,0x1f,0x1a,0xde,0x4f,0x1d,0xb9,0x5e,0xb9,0xf7,0xde,0x7b,
+ 0x4b,0x95,0x63,0x5d,0xcf,0xfe,0x4b,0xd3,0x85,0x7c,0x2a,0x7f,0xfa,0xd3,0x9f,0xbc,
+ 0xe7,0x5a,0x57,0xb0,0x8b,0x72,0xbf,0x43,0xd7,0xab,0xe3,0x4a,0x5a,0x4a,0x01,0xd0,
+ 0x01,0x70,0x41,0xfb,0xa2,0x0b,0xf9,0x54,0x25,0xa4,0xbf,0xf3,0x9d,0xef,0x04,0xad,
+ 0x5f,0xa7,0x1c,0x96,0xe2,0xda,0x29,0xe2,0xde,0xa1,0x0e,0x00,0x40,0x03,0x91,0xb1,
+ 0x49,0xc9,0xef,0x95,0x71,0x5c,0x5d,0xd4,0x24,0xb8,0x22,0x99,0x64,0x11,0x48,0x05,
+ 0x39,0x71,0x1b,0x87,0xd2,0xc8,0x74,0xa2,0xfe,0xfd,0xfb,0x47,0x95,0xef,0xfe,0xf9,
+ 0xcf,0x7f,0x46,0x01,0x56,0xed,0x88,0x8c,0x4b,0xff,0xfa,0xd7,0xbf,0x8e,0x22,0xcc,
+ 0x3f,0xf7,0xb9,0xcf,0x79,0xcf,0xb5,0x54,0x86,0x93,0xea,0x76,0x52,0xdb,0x21,0x84,
+ 0x87,0x1e,0x7a,0xa8,0x65,0x8e,0x95,0x94,0xef,0x95,0x6b,0xdc,0x87,0x54,0x45,0x94,
+ 0x8c,0x17,0xb9,0xbe,0xb2,0x22,0xb1,0x31,0x12,0xa7,0xe1,0xe3,0xaa,0xab,0xae,0x6a,
+ 0xe8,0xb1,0x68,0xe4,0xbd,0x83,0x02,0x00,0x50,0x10,0x12,0xe9,0xfb,0xd2,0x4b,0x2f,
+ 0x45,0xe5,0x48,0xab,0x41,0x6a,0xc4,0x6b,0xaf,0x81,0xea,0xd1,0xa3,0x47,0xd0,0xf2,
+ 0x12,0x58,0x94,0x75,0x5c,0x3a,0x0f,0xa4,0x36,0xb9,0x44,0x34,0x87,0x3c,0x6c,0x5b,
+ 0x95,0x7e,0xfd,0xfa,0x45,0x59,0x19,0xda,0xf5,0x1c,0x95,0x70,0x0e,0x45,0xc6,0xb5,
+ 0xbf,0xf8,0xc5,0x2f,0x06,0x2d,0x2b,0xe5,0xa3,0x5b,0x85,0x3f,0xfe,0xf1,0x8f,0x51,
+ 0x4a,0x9e,0xef,0xd8,0xfc,0xe1,0x0f,0x7f,0x50,0x7d,0xfb,0xf6,0xad,0x7a,0x3b,0x12,
+ 0x70,0xe7,0xab,0x99,0x2f,0xb5,0xf6,0x45,0xf8,0x36,0x82,0x46,0xdf,0x3b,0x28,0x00,
+ 0x00,0x05,0xa0,0xcb,0xc1,0x46,0x96,0x4b,0xd6,0x40,0x2a,0x13,0x29,0x06,0x23,0x55,
+ 0xd1,0x42,0xb9,0xf2,0xca,0x2b,0xeb,0xda,0x4f,0x5d,0xde,0x58,0x3d,0xf2,0xc8,0x23,
+ 0x51,0x34,0x76,0xbb,0x22,0x35,0xd9,0xe5,0x18,0x64,0x09,0xd2,0x4b,0x22,0xde,0x82,
+ 0x10,0xa5,0xa1,0x9a,0xe0,0xc1,0x32,0x22,0x43,0xcf,0xe2,0x29,0xf1,0x21,0xb5,0xfc,
+ 0xf5,0x78,0x78,0x4d,0xdb,0x92,0x40,0xc8,0xf1,0xe3,0xc7,0x97,0xd2,0x0b,0x50,0x86,
+ 0x7b,0x07,0x05,0x00,0x20,0x67,0xe4,0xe1,0xf6,0xf5,0xaf,0x7f,0x3d,0xb7,0xf5,0x89,
+ 0x55,0x19,0x3a,0x11,0x90,0xa4,0x21,0x56,0x1c,0x13,0x88,0xe4,0x8d,0xcc,0xbc,0x26,
+ 0x96,0x53,0xa8,0x0b,0xbb,0x15,0x91,0xbe,0x4b,0x01,0x1b,0x1d,0xd0,0x57,0xf5,0x3a,
+ 0x64,0x06,0xc8,0x10,0x21,0x30,0x67,0xce,0x9c,0x96,0x38,0x66,0xe2,0x29,0x91,0x68,
+ 0xf8,0x90,0xeb,0x3e,0x0f,0x42,0x26,0x6f,0x92,0x82,0x3c,0xf5,0xba,0x6f,0xca,0x74,
+ 0xef,0xa0,0x00,0x00,0xe4,0xc8,0x6f,0x7e,0xf3,0x9b,0xdc,0x1e,0x5c,0x31,0x32,0x56,
+ 0xfc,0xb5,0xaf,0x7d,0x2d,0x68,0x59,0xc9,0x4b,0x97,0x02,0x35,0xf5,0xe0,0xf7,0xbf,
+ 0xff,0x7d,0x94,0x8b,0xdd,0xae,0x0c,0x1c,0x38,0x50,0xe9,0x49,0x66,0x72,0x99,0xca,
+ 0x57,0x04,0x82,0x0f,0x49,0x05,0x93,0x59,0xfe,0x9a,0x1d,0x9d,0x19,0xe1,0x5d,0x66,
+ 0xb3,0xcd,0x36,0x53,0xfb,0xec,0xb3,0x4f,0x2e,0xdb,0xfb,0xc4,0x27,0x3e,0xa1,0x7a,
+ 0xf6,0xec,0xe9,0x55,0xae,0x64,0x46,0xbf,0x7a,0x51,0x96,0x7b,0x07,0x05,0x00,0x20,
+ 0x27,0x24,0x08,0x4f,0x26,0xf6,0x28,0x02,0xa9,0xf8,0x17,0x8a,0x9e,0x09,0xae,0xf0,
+ 0xbe,0x9e,0x72,0xca,0x29,0xea,0x53,0x9f,0xfa,0x54,0xdb,0x9e,0x6b,0x19,0x9f,0x96,
+ 0xc9,0x7f,0x36,0xdd,0x74,0xd3,0x5c,0xd6,0x17,0x1a,0xec,0x59,0x4f,0x2b,0xb5,0x08,
+ 0x74,0xba,0xab,0xd2,0xe9,0x6c,0xde,0xe5,0xaa,0x1d,0x4e,0xb1,0x21,0x31,0x00,0x21,
+ 0x35,0x32,0x9e,0x7f,0xfe,0xf9,0xba,0x1c,0x83,0x32,0xdd,0x3b,0x28,0x00,0x00,0x39,
+ 0xf1,0xe5,0x2f,0x7f,0xb9,0xb0,0x75,0xeb,0x29,0x4d,0x83,0xe7,0x5a,0x2f,0x5a,0x01,
+ 0x18,0x33,0x66,0x8c,0xd2,0xf9,0xc8,0x6d,0x7d,0xae,0xbf,0xfb,0xdd,0xef,0xe6,0xfa,
+ 0x10,0x0f,0x1d,0xe2,0x69,0x76,0x74,0x2e,0x7f,0x50,0x51,0x9b,0xbc,0xa3,0xe1,0x43,
+ 0xee,0x9d,0x7a,0x28,0x00,0x65,0xbb,0x77,0x50,0x00,0x00,0x9a,0x04,0xc9,0x2a,0x28,
+ 0x83,0x02,0xa0,0x73,0xdc,0x6b,0x8a,0xcc,0x6e,0x76,0xa4,0x6c,0xed,0xf7,0xbe,0xf7,
+ 0xbd,0x5c,0xd7,0xd9,0x2e,0x0a,0x80,0x94,0xfd,0x0d,0x61,0xb7,0xdd,0x76,0xcb,0x5d,
+ 0xf0,0x96,0x41,0x01,0x28,0xdb,0xbd,0x83,0x02,0x00,0xd0,0x24,0x84,0x7a,0x00,0x8a,
+ 0x4e,0x05,0xd4,0xd5,0xcc,0xda,0xfa,0x3c,0xfc,0xe5,0x2f,0x7f,0x89,0x4a,0x38,0xe7,
+ 0x89,0x6f,0x8c,0xba,0x9d,0x14,0x00,0x39,0x16,0x92,0x59,0x91,0x27,0x92,0xa6,0xe9,
+ 0x43,0x4a,0x09,0x17,0x4d,0xd9,0xee,0x1d,0xe6,0x02,0x00,0x68,0x12,0xa4,0x2e,0x40,
+ 0x08,0xba,0x6c,0x28,0x07,0xab,0x40,0xa4,0xce,0x3e,0x54,0xc7,0x53,0x4f,0x3d,0xe5,
+ 0x5d,0x46,0x66,0xcb,0x93,0xd9,0x01,0xf3,0x64,0xc2,0x84,0x09,0xde,0x65,0xea,0x31,
+ 0x13,0x61,0xd9,0x40,0x01,0x00,0x68,0x31,0x05,0x40,0xa6,0x07,0x96,0x68,0xf1,0x5e,
+ 0xbd,0x7a,0x71,0xd0,0xa0,0x34,0xe8,0xd2,0xc8,0x41,0xb5,0x0c,0xe4,0xfa,0xcd,0x2b,
+ 0x03,0x20,0x0b,0x32,0xc3,0x63,0xbb,0xc1,0x10,0x00,0x40,0x13,0x59,0x9e,0xa1,0x55,
+ 0x01,0xdb,0xd1,0x9a,0x81,0x72,0xf3,0xc1,0x07,0x1f,0x94,0x3a,0x8b,0x41,0x66,0x24,
+ 0x14,0xef,0x03,0x0a,0x00,0x00,0x94,0x12,0xa9,0x09,0x10,0xfa,0xb0,0x05,0x28,0x13,
+ 0xcd,0x50,0xc9,0xb0,0xdd,0xbc,0x00,0x28,0x00,0x00,0x2d,0xa8,0x00,0xe8,0x29,0x51,
+ 0x39,0x58,0x50,0x2a,0x9a,0xa1,0x92,0x61,0xbb,0xdd,0x37,0x28,0x00,0x00,0x4d,0x44,
+ 0xef,0xde,0xbd,0x83,0x96,0xcb,0x32,0x21,0x0d,0x40,0x3d,0x68,0x86,0xe0,0xd4,0xd5,
+ 0xab,0x57,0xa3,0x00,0x00,0x40,0x39,0x91,0x00,0xa9,0x10,0x06,0x0c,0x18,0xc0,0xc1,
+ 0x02,0x84,0x6b,0x46,0xda,0x4d,0x71,0x46,0x01,0x00,0x68,0x22,0x16,0x2d,0x5a,0x14,
+ 0xb4,0x9c,0xd4,0xa9,0x07,0x28,0x13,0x83,0x07,0x0f,0x46,0x01,0x40,0x01,0x00,0x80,
+ 0xa2,0x15,0x00,0x3c,0x00,0x50,0x36,0xd6,0x5b,0x6f,0xbd,0xa0,0xe5,0xa4,0xca,0xa2,
+ 0x64,0x0b,0x34,0xa2,0x85,0x4c,0xca,0x84,0x02,0x00,0x00,0x0d,0x41,0x52,0x95,0x7c,
+ 0x48,0xd5,0xb3,0x2e,0x5d,0xba,0x70,0xb0,0xa0,0x29,0x15,0x80,0x90,0xa2,0x3d,0x80,
+ 0x02,0x00,0xd0,0x56,0xc8,0x54,0xbf,0x21,0xe3,0xa8,0xb8,0xff,0xa1,0x8c,0x48,0x1d,
+ 0x8b,0x10,0xc5,0x14,0x05,0x00,0x05,0x00,0x00,0x0c,0x5e,0x7b,0xed,0xb5,0xa0,0xe5,
+ 0x36,0xdf,0x7c,0x73,0x0e,0x16,0x94,0x0e,0x99,0x42,0x79,0xc8,0x90,0x21,0xde,0xe5,
+ 0x26,0x4e,0x9c,0x18,0x3c,0xd4,0x05,0x28,0x00,0x00,0x28,0x00,0x09,0x76,0xd9,0x65,
+ 0x17,0x0e,0x16,0x94,0x92,0x9d,0x76,0xda,0xc9,0xbb,0x8c,0x94,0x0c,0xbe,0xfb,0xee,
+ 0xbb,0x39,0x58,0x28,0x00,0x00,0x80,0x02,0x00,0xad,0xc2,0xfe,0xfb,0xef,0x1f,0xb4,
+ 0xdc,0x2d,0xb7,0xdc,0xc2,0xc1,0x42,0x01,0x00,0x80,0x98,0xd0,0xb9,0xd4,0x51,0x00,
+ 0xa0,0xac,0xec,0xb7,0xdf,0x7e,0x41,0xcb,0xdd,0x79,0xe7,0x9d,0x91,0x27,0x00,0x50,
+ 0x00,0x00,0xda,0x9e,0xf7,0xdf,0x7f,0x5f,0x3d,0xfd,0xf4,0xd3,0xde,0xe5,0x86,0x0e,
+ 0x1d,0xaa,0x46,0x8d,0x1a,0xc5,0x01,0x83,0x9a,0x58,0xb6,0x6c,0x59,0x21,0xeb,0xdd,
+ 0x7e,0xfb,0xed,0x83,0xe2,0x00,0xa4,0x6c,0xf0,0xdf,0xfe,0xf6,0x37,0x4e,0x04,0x0a,
+ 0x00,0x00,0xfc,0xfd,0xef,0x7f,0x0f,0xca,0x00,0x38,0xe4,0x90,0x43,0x38,0x58,0x50,
+ 0x33,0xef,0xbe,0xfb,0x6e,0x31,0x02,0xa7,0x73,0xe7,0x60,0x2f,0xc0,0xf9,0xe7,0x9f,
+ 0xdf,0x76,0xb3,0xf3,0xa1,0x00,0x00,0xc0,0x3a,0xfc,0xe5,0x2f,0x7f,0x09,0x5a,0xee,
+ 0x94,0x53,0x4e,0xe1,0x60,0x81,0x93,0xd0,0xfa,0x10,0xd3,0xa6,0x4d,0x2b,0x6c,0x1f,
+ 0xce,0x38,0xe3,0x8c,0xa0,0xe5,0x24,0xe6,0xe5,0x9a,0x6b,0xae,0xe1,0xa4,0xa1,0x00,
+ 0x00,0x94,0x9f,0xa5,0x4b,0x97,0x16,0xb2,0x5e,0x19,0xfb,0xbf,0xf7,0xde,0x7b,0xbd,
+ 0xcb,0x6d,0xb9,0xe5,0x96,0xea,0xe3,0x1f,0xff,0x38,0x27,0x02,0x9c,0x48,0x8d,0x08,
+ 0x49,0xc7,0xf3,0xf1,0xce,0x3b,0xef,0x14,0xb6,0x0f,0x7b,0xee,0xb9,0xa7,0xda,0x7b,
+ 0xef,0xbd,0x83,0x96,0x3d,0xe7,0x9c,0x73,0x0a,0xf3,0x46,0x00,0x0a,0x00,0x40,0x6e,
+ 0x88,0xf0,0x7d,0xeb,0xad,0xb7,0x72,0x5f,0xef,0x79,0xe7,0x9d,0x17,0xb4,0xdc,0xc9,
+ 0x27,0x9f,0xcc,0x49,0x80,0x54,0xa4,0xd6,0xbd,0x14,0xe4,0xf1,0xf1,0xe6,0x9b,0x6f,
+ 0x16,0xba,0x1f,0xe7,0x9e,0x7b,0x6e,0xd0,0x72,0x52,0xfc,0xea,0xe8,0xa3,0x8f,0x56,
+ 0xcb,0x97,0x2f,0xe7,0xe4,0xa1,0x00,0x00,0x94,0x97,0xe7,0x9e,0x7b,0x2e,0xca,0x73,
+ 0x0e,0xb1,0xd6,0x43,0xb9,0xec,0xb2,0xcb,0xd4,0x03,0x0f,0x3c,0xe0,0x5d,0xae,0x67,
+ 0xcf,0x9e,0xea,0x73,0x9f,0xfb,0x1c,0x27,0x01,0xbc,0xac,0xbf,0xfe,0xfa,0xde,0x65,
+ 0xfe,0xfd,0xef,0x7f,0xab,0x27,0x9f,0x7c,0xb2,0xb0,0x7d,0x38,0xe0,0x80,0x03,0xd4,
+ 0x6e,0xbb,0xed,0x16,0xb4,0xec,0xe3,0x8f,0x3f,0x1e,0x0d,0x6d,0x85,0xce,0x84,0x09,
+ 0x28,0x00,0x00,0x0d,0x61,0xf6,0xec,0xd9,0xea,0xe0,0x83,0x0f,0x56,0xdf,0xff,0xfe,
+ 0xf7,0x6b,0x1e,0x12,0xb8,0xe7,0x9e,0x7b,0xd4,0x59,0x67,0x9d,0x15,0x6c,0x51,0x6d,
+ 0xb0,0xc1,0x06,0x9c,0x00,0xf0,0xb2,0xd9,0x66,0x9b,0x05,0x2d,0xf7,0xa3,0x1f,0xfd,
+ 0xa8,0xd0,0xfd,0xb8,0xf4,0xd2,0x4b,0x55,0xf7,0xee,0xdd,0x83,0x96,0xbd,0xfa,0xea,
+ 0xab,0x23,0xa5,0x61,0xe6,0xcc,0x99,0x85,0xec,0x8b,0x04,0x1b,0x4a,0xe6,0x01,0x0a,
+ 0x00,0x00,0xd4,0xfc,0x30,0xf9,0xc1,0x0f,0x7e,0x10,0x8d,0xc9,0xdf,0x70,0xc3,0x0d,
+ 0x55,0xad,0xe3,0x8f,0x7f,0xfc,0xa3,0x3a,0xea,0xa8,0xa3,0x82,0x72,0xa1,0x3f,0xf2,
+ 0x91,0x8f,0xa8,0xaf,0x7f,0xfd,0xeb,0x1c,0x78,0x08,0x22,0x34,0x53,0xe4,0x8e,0x3b,
+ 0xee,0x50,0xf7,0xdf,0x7f,0x7f,0x61,0xfb,0x21,0xf5,0x2a,0x7e,0xf9,0xcb,0x5f,0x06,
+ 0x2f,0xff,0xf0,0xc3,0x0f,0xab,0x9d,0x77,0xde,0x59,0x5d,0x7b,0xed,0xb5,0x41,0x19,
+ 0x31,0x3e,0xe6,0xcd,0x9b,0x17,0xa5,0x1a,0x9e,0x78,0xe2,0x89,0x51,0xfa,0xec,0x76,
+ 0xdb,0x6d,0xd7,0x76,0xd7,0x42,0x57,0x6e,0x87,0xe6,0x44,0xdc,0x73,0x7f,0xfd,0xeb,
+ 0x5f,0xd5,0xeb,0xaf,0xbf,0xae,0xfa,0xf4,0xe9,0xa3,0x7a,0xf7,0xee,0xad,0x7a,0xf5,
+ 0xea,0x15,0xbd,0x97,0x57,0xf9,0x3b,0xd9,0x42,0xbe,0x93,0x14,0x1d,0xc8,0x0f,0x89,
+ 0x07,0x18,0x3f,0x7e,0xbc,0xda,0x63,0x8f,0x3d,0xd4,0x69,0xa7,0x9d,0xa6,0x3e,0xfd,
+ 0xe9,0x4f,0x47,0xc7,0x39,0x8d,0x57,0x5e,0x79,0x45,0x7d,0xe7,0x3b,0xdf,0x51,0x37,
+ 0xdf,0x7c,0x73,0xd0,0x36,0x24,0xa0,0xeb,0x8a,0x2b,0xae,0x50,0xdd,0xba,0x75,0xe3,
+ 0x80,0x43,0x10,0x9f,0xfc,0xe4,0x27,0x83,0x97,0x3d,0xf0,0xc0,0x03,0xa3,0xa8,0xfd,
+ 0x1f,0xff,0xf8,0xc7,0xde,0x6b,0xb7,0x1a,0xbe,0xfc,0xe5,0x2f,0x47,0x2e,0x7e,0xb1,
+ 0xf0,0x43,0x78,0xfb,0xed,0xb7,0xd5,0x09,0x27,0x9c,0x10,0x29,0xd8,0xdf,0xfc,0xe6,
+ 0x37,0xd5,0xa1,0x87,0x1e,0x1a,0x3c,0xcb,0xa0,0xf0,0xc6,0x1b,0x6f,0xa8,0xdb,0x6f,
+ 0xbf,0x3d,0x52,0x6e,0x44,0xa1,0x48,0x0e,0x2b,0x88,0x12,0x80,0x02,0x00,0xa5,0x45,
+ 0xb4,0x5e,0x19,0x0f,0xbe,0xee,0xba,0xeb,0xd4,0x94,0x29,0x53,0xa2,0x87,0xbf,0xcc,
+ 0x61,0x2d,0x17,0xf1,0x07,0x1f,0x7c,0x10,0xbd,0x8f,0x3f,0x8b,0x85,0x43,0xfc,0x59,
+ 0x08,0xb2,0xac,0x6c,0x43,0xac,0x4e,0xb1,0x62,0xa5,0xc9,0xba,0xe3,0x57,0x69,0xb1,
+ 0x45,0x2a,0xcb,0xc5,0xdb,0x49,0x6e,0x43,0xd2,0x8c,0x7a,0xf4,0xe8,0x11,0xb9,0xf6,
+ 0x64,0x5c,0x3a,0x56,0x38,0x62,0x25,0x45,0xa6,0xaa,0xed,0xdb,0xb7,0x6f,0xf4,0x2a,
+ 0x4d,0xe6,0xad,0x8f,0x9b,0x44,0x28,0x4b,0x80,0x92,0x34,0xf9,0x2e,0x74,0xbf,0xcb,
+ 0x8e,0x44,0xf1,0x4b,0x93,0x63,0x70,0xf8,0xe1,0x87,0x47,0x63,0x9f,0x1b,0x6d,0xb4,
+ 0x91,0xda,0x70,0xc3,0x0d,0xa3,0x61,0x02,0x89,0x72,0x9e,0x34,0x69,0x92,0xba,0xfe,
+ 0xfa,0xeb,0xd5,0xf3,0xcf,0x3f,0x9f,0x69,0xdd,0xa7,0x9e,0x7a,0x6a,0xa4,0x60,0x00,
+ 0x84,0xb2,0xf1,0xc6,0x1b,0x47,0xd6,0x77,0x48,0x61,0x29,0xb9,0xcf,0x7f,0xf5,0xab,
+ 0x5f,0x45,0x0a,0xe9,0x41,0x07,0x1d,0x14,0x79,0xb5,0xb6,0xd8,0x62,0x8b,0x68,0x1d,
+ 0xe2,0x8e,0x7f,0xf9,0xe5,0x97,0x23,0xa5,0x55,0x84,0xe7,0x77,0xbf,0xfb,0xdd,0xaa,
+ 0xf6,0xe7,0xf2,0xcb,0x2f,0x8f,0xae,0xfb,0x97,0x5e,0x7a,0x29,0xf8,0x37,0x92,0x22,
+ 0x78,0xd2,0x49,0x27,0x45,0xcf,0x08,0xb1,0xdc,0xf7,0xd9,0x67,0x1f,0xb5,0xc9,0x26,
+ 0x9b,0x44,0x45,0x86,0xe4,0x39,0x23,0x93,0x09,0xcd,0x9d,0x3b,0x37,0x52,0xc2,0xa5,
+ 0x89,0xe2,0x20,0xaf,0x12,0x54,0x08,0x28,0x00,0x4d,0x41,0x2c,0x60,0xa5,0x2a,0x97,
+ 0x4c,0x8e,0x21,0xee,0x64,0xa9,0x08,0x97,0x14,0xb8,0x49,0x21,0x29,0x16,0xbc,0x7c,
+ 0x17,0x5b,0xf2,0xf1,0xfb,0x78,0x3d,0x3e,0x64,0x59,0x59,0x9f,0x44,0x0a,0x27,0x05,
+ 0x7b,0xa8,0x42,0x91,0x5c,0x5e,0x9a,0x28,0x0b,0xd2,0xe4,0x46,0x94,0x87,0x85,0x28,
+ 0x12,0xf1,0x67,0xf1,0x7b,0xf3,0xb3,0x58,0xe1,0x90,0xdf,0xf7,0xef,0xdf,0xbf,0x43,
+ 0x29,0x10,0x2d,0x5f,0x9a,0x04,0x30,0x49,0x93,0x07,0x8e,0x8c,0x79,0xcb,0xeb,0xb0,
+ 0x61,0xc3,0xa2,0xef,0xca,0xee,0xc1,0x90,0x87,0x92,0xe4,0x35,0xe7,0x95,0xdb,0x2c,
+ 0xd6,0xcf,0xaf,0x7f,0xfd,0x6b,0x6e,0x14,0xc8,0xcc,0x25,0x97,0x5c,0xa2,0xf6,0xda,
+ 0x6b,0xaf,0xe0,0xe5,0x45,0x80,0xfe,0xfe,0xf7,0xbf,0x77,0x7e,0x2f,0xca,0x6c,0xb5,
+ 0x0a,0x80,0x08,0xec,0x7f,0xfc,0xe3,0x1f,0xea,0x3f,0xfe,0xe3,0x3f,0xd4,0x53,0x4f,
+ 0x3d,0x95,0xf9,0x19,0xf9,0xc2,0x0b,0x2f,0x44,0x0d,0x50,0x00,0x5a,0x4a,0xf0,0x2f,
+ 0x58,0xb0,0x40,0xdd,0x7a,0xeb,0xad,0x91,0xf6,0x9d,0x9c,0x1e,0x33,0xcd,0x32,0x4e,
+ 0x7e,0x67,0x53,0x12,0x7c,0xf8,0x7e,0x1f,0xb2,0x6d,0x79,0x95,0x26,0x5e,0x80,0xd0,
+ 0x20,0x1f,0xdf,0xf1,0x98,0x3f,0x7f,0x7e,0x14,0xa4,0x23,0xd6,0x46,0xac,0x30,0x24,
+ 0x15,0x08,0xb1,0x54,0xc4,0xdb,0x20,0x9e,0x03,0x51,0x1a,0xc4,0x12,0x10,0x05,0x61,
+ 0xc4,0x88,0x11,0x6a,0xf4,0xe8,0xd1,0x91,0xc5,0x3d,0x76,0xec,0xd8,0xe8,0xbb,0xa2,
+ 0xf8,0xf6,0xb7,0xbf,0xad,0x2e,0xb8,0xe0,0x82,0xba,0x5c,0x23,0x52,0x4d,0x4d,0x3c,
+ 0x06,0xb8,0xfe,0xa1,0x1a,0x24,0x17,0xff,0xd8,0x63,0x8f,0x8d,0xbc,0x89,0x65,0x40,
+ 0x14,0xf9,0x07,0x1f,0x7c,0x30,0x1a,0x8f,0xbf,0xf1,0xc6,0x1b,0x39,0x41,0x28,0x00,
+ 0xed,0x29,0xf4,0x45,0xa0,0x89,0x36,0x2c,0xd6,0xbe,0x54,0xe3,0x4a,0x5a,0xe0,0x36,
+ 0x81,0x9b,0xb4,0xc8,0x4d,0x8b,0x3d,0xeb,0xf2,0xd5,0x0c,0x19,0xd4,0xf2,0xfb,0xd0,
+ 0xf5,0x0b,0x22,0xe8,0x4c,0x61,0xe7,0xea,0x8f,0x78,0x11,0x66,0xcc,0x98,0x11,0xb5,
+ 0x17,0x5f,0x7c,0x31,0xfa,0x4e,0x14,0x08,0x19,0x92,0x88,0x83,0x9a,0x8a,0x18,0x5e,
+ 0x90,0x71,0x52,0x19,0xde,0x10,0x45,0xa0,0x48,0xc6,0x8d,0x1b,0xa7,0x6e,0xbb,0xed,
+ 0xb6,0xa8,0x3f,0x00,0xd5,0x22,0x51,0xf8,0x13,0x26,0x4c,0x88,0x52,0xfe,0xca,0x80,
+ 0x28,0xf0,0xa2,0xd4,0x7e,0xe3,0x1b,0xdf,0x50,0x3f,0xfb,0xd9,0xcf,0x38,0x41,0x75,
+ 0x80,0xa8,0xaf,0x12,0x08,0xfe,0x25,0x4b,0x96,0x44,0x17,0xfe,0x71,0xc7,0x1d,0xa7,
+ 0x3e,0xf6,0xb1,0x8f,0x45,0x91,0xb1,0x52,0x89,0x2b,0x76,0x69,0xcb,0x6b,0xec,0x9e,
+ 0x8f,0x5f,0x5d,0x43,0x00,0xb5,0x2c,0x9f,0xfc,0xcc,0x66,0xd1,0x67,0xfd,0x7d,0xcd,
+ 0x17,0x67,0x0e,0xfd,0x17,0x2f,0xca,0xc2,0x85,0x0b,0xd5,0xc8,0x91,0x23,0x23,0xaf,
+ 0x40,0x32,0x6e,0x21,0x6e,0x79,0xf2,0xad,0x6f,0x7d,0x4b,0xfd,0xe1,0x0f,0x7f,0x08,
+ 0x2a,0xb6,0x92,0x15,0x89,0xaf,0x90,0x87,0xe3,0x7d,0xf7,0xdd,0x57,0x48,0x40,0x16,
+ 0xb4,0x17,0x32,0x94,0x26,0x0a,0xf1,0xb6,0xdb,0x6e,0x5b,0x9a,0x7d,0x92,0x7b,0xf6,
+ 0xa7,0x3f,0xfd,0xa9,0xba,0xeb,0xae,0xbb,0xda,0x32,0x2a,0x1f,0x05,0xa0,0x4d,0x84,
+ 0xbe,0xb4,0x7f,0xfe,0xf3,0x9f,0xea,0x8b,0x5f,0xfc,0xa2,0xda,0x7c,0xf3,0xcd,0xd5,
+ 0x45,0x17,0x5d,0x14,0x59,0xa9,0xf1,0x58,0x76,0x9a,0xfb,0x3d,0x16,0x80,0x66,0xcb,
+ 0x7b,0xf9,0x5a,0xbf,0xaf,0xb5,0xd5,0xd2,0x1f,0x09,0x8a,0x94,0x21,0x83,0xe1,0xc3,
+ 0x87,0x47,0xc3,0x00,0xe6,0xb1,0x4f,0x0a,0xfe,0xbc,0x95,0x80,0x2f,0x7c,0xe1,0x0b,
+ 0x51,0x90,0x92,0xbc,0xe6,0xe5,0x69,0x90,0x87,0xb4,0x64,0x7e,0x5c,0x78,0xe1,0x85,
+ 0x58,0xfe,0x90,0xab,0x12,0x20,0x81,0xc5,0x5f,0xf9,0xca,0x57,0x72,0x19,0xae,0xcb,
+ 0x0b,0xa9,0xa5,0xf1,0xaf,0x7f,0xfd,0x4b,0x5d,0x75,0xd5,0x55,0xd1,0xf0,0x5d,0x91,
+ 0x88,0x67,0x51,0xbc,0x6a,0xa7,0x9f,0x7e,0x3a,0x0a,0x00,0x14,0x2b,0xf4,0xc5,0xc5,
+ 0x2f,0xb9,0xa7,0x62,0xe9,0x1f,0x79,0xe4,0x91,0xea,0xd5,0x57,0x5f,0x8d,0x1e,0xee,
+ 0x32,0x06,0x66,0x0a,0xb4,0xa4,0xd5,0x6b,0xb3,0x80,0xf3,0x6e,0xb5,0x6e,0x2f,0xef,
+ 0xfd,0xad,0x66,0x7d,0x12,0x70,0x38,0x7d,0xfa,0xf4,0x68,0xfc,0x5f,0xc6,0xfe,0x93,
+ 0x41,0x89,0xf1,0x79,0x88,0x33,0x18,0xcc,0xcf,0xf3,0x54,0x04,0xe4,0xc1,0x2a,0x9e,
+ 0x80,0x47,0x1e,0x79,0x24,0x4a,0x05,0xac,0xc6,0x62,0x8f,0x67,0x4e,0x93,0xe0,0xab,
+ 0x67,0x9f,0x7d,0x36,0xaa,0x32,0x58,0x24,0x32,0x7c,0xe1,0xa3,0x11,0x9e,0x87,0x7a,
+ 0xed,0x57,0x23,0xfb,0x1f,0xb2,0x5e,0x51,0xfc,0x42,0x27,0xf3,0xc9,0x82,0x78,0xc6,
+ 0x7e,0xfb,0xdb,0xdf,0x46,0x29,0xc5,0x62,0x90,0x14,0xb1,0x8d,0x6a,0x3d,0x80,0x12,
+ 0x13,0x20,0xca,0xf4,0x95,0x57,0x5e,0xa9,0x8e,0x38,0xe2,0x88,0x28,0xc6,0xa7,0x56,
+ 0xe4,0x38,0xca,0x5c,0x04,0x52,0x62,0x5b,0xaa,0x76,0x8a,0xb1,0x20,0xc6,0x58,0xb5,
+ 0x41,0x8c,0x65,0xbe,0x77,0xbc,0x1e,0x97,0x4a,0xde,0xe6,0x0f,0xac,0x23,0xf8,0x63,
+ 0x64,0x6c,0x5f,0x5c,0xc4,0x92,0x8a,0xb2,0xe9,0xa6,0x9b,0x06,0x5d,0x34,0xf5,0xde,
+ 0xd7,0x6a,0xa3,0xfe,0x43,0x96,0x2f,0x12,0xb1,0xf6,0xc5,0x83,0x22,0xd6,0x42,0x7c,
+ 0xa3,0xd9,0x62,0x22,0x24,0x02,0xdf,0xe6,0x35,0x48,0x0b,0x74,0x94,0x88,0xe9,0xb3,
+ 0xcf,0x3e,0x3b,0xd3,0xb9,0x36,0x91,0x61,0x1e,0x71,0x6b,0x4a,0x40,0xa7,0x3c,0xd0,
+ 0x24,0xf5,0x4f,0xae,0x03,0x09,0x60,0x94,0xb4,0x49,0x89,0x5b,0x88,0x83,0x16,0x65,
+ 0xb8,0x42,0x04,0xff,0x31,0xc7,0x1c,0x13,0x79,0x30,0x00,0xea,0xc9,0xc4,0x89,0x13,
+ 0xa3,0x40,0x3c,0xc9,0x99,0x97,0xf4,0x54,0x69,0x32,0x24,0x29,0x1e,0x02,0xc9,0x48,
+ 0x12,0x05,0x61,0xf0,0xe0,0xc1,0x6a,0xcc,0x98,0x31,0x51,0x61,0x1e,0x49,0x43,0x95,
+ 0x34,0xbc,0x7a,0x5c,0xab,0x72,0x9f,0x88,0x52,0x2d,0xd3,0x63,0x4b,0xda,0xa0,0x64,
+ 0x45,0x49,0x93,0x2c,0x23,0xf9,0x4e,0xee,0x25,0xd9,0x47,0x51,0x14,0x64,0x7f,0x24,
+ 0x43,0x48,0x5e,0xa5,0x49,0xa6,0x82,0xa4,0xe0,0xee,0xba,0xeb,0xae,0xd1,0x72,0x80,
+ 0x02,0x50,0x17,0xc1,0x2f,0x0f,0xfa,0xaf,0x7e,0xf5,0xab,0x91,0x15,0x27,0xb9,0xaa,
+ 0xb1,0x0b,0xb7,0xd6,0xa0,0x3c,0xdf,0xf2,0x59,0x83,0x02,0x6b,0x5d,0x7f,0xbd,0x83,
+ 0x12,0xe5,0xbb,0x38,0xc5,0x50,0xf2,0x92,0xa5,0x96,0x80,0x0f,0x29,0x38,0x92,0xe6,
+ 0x45,0x28,0x4a,0x01,0xb0,0x21,0x9e,0x08,0xd9,0x7f,0x49,0xbb,0x14,0xa5,0x25,0x4e,
+ 0xbf,0x04,0x28,0x1b,0x52,0xaf,0x42,0x04,0xab,0x5c,0xb3,0xa1,0x33,0x0a,0xd6,0xfb,
+ 0x79,0x2b,0xf7,0x92,0x28,0x27,0xf1,0xfd,0x04,0x7e,0x78,0xe2,0x14,0x28,0xf8,0xe5,
+ 0xfd,0x2d,0xb7,0xdc,0xa2,0x7e,0xf8,0xc3,0x1f,0x46,0xd6,0xdd,0x36,0xdb,0x6c,0xb3,
+ 0x8e,0xc0,0x4b,0xe6,0xe9,0x9b,0x02,0xc8,0x7c,0xb5,0x09,0xc8,0xb4,0x57,0x9b,0x30,
+ 0xb3,0x09,0x61,0xdf,0x77,0xae,0xf5,0x65,0xfd,0xde,0x26,0xf0,0xab,0xed,0xbf,0x58,
+ 0xfc,0x62,0x95,0x88,0x9b,0x7f,0xfb,0xed,0xb7,0xcf,0x24,0x74,0xe3,0x75,0xda,0x02,
+ 0x16,0xeb,0xe9,0xc5,0x90,0xed,0x8b,0xfb,0x15,0xa0,0xec,0x88,0xd1,0x52,0xe6,0xd8,
+ 0x13,0xb9,0x5f,0xc5,0x2b,0x01,0x28,0x00,0xa5,0x10,0xfc,0x62,0x95,0x4a,0x49,0x57,
+ 0x71,0xf5,0x8a,0x4b,0x37,0x54,0xe0,0x9a,0xc2,0x27,0x4b,0x5e,0x7f,0xde,0x16,0x7b,
+ 0x11,0x69,0x81,0xb5,0xf6,0x5f,0x04,0xbf,0x54,0xf4,0x12,0x57,0xb9,0x54,0x33,0x33,
+ 0x8f,0xbb,0xaf,0x7f,0x71,0x91,0x21,0x33,0x6b,0xc1,0x3c,0x06,0x00,0x00,0x28,0x00,
+ 0x10,0x2c,0xfc,0xe5,0x55,0x2a,0x66,0xdd,0x74,0xd3,0x4d,0x51,0x51,0x0b,0x41,0x5c,
+ 0x52,0xd5,0x16,0xee,0xa9,0x46,0x20,0x9b,0xdf,0xf9,0x2c,0xf2,0x5a,0x3c,0x08,0xd5,
+ 0x78,0x24,0xaa,0xed,0xbf,0x08,0xfe,0xc9,0x93,0x27,0x47,0x9e,0x14,0x11,0xfc,0x49,
+ 0xcf,0x41,0x16,0x85,0x46,0xc6,0xdc,0xcd,0x20,0x27,0x9b,0x17,0x02,0x45,0x00,0x00,
+ 0x50,0x00,0x20,0x48,0xf0,0x4b,0x60,0x97,0x08,0xfe,0xb8,0x94,0x65,0x2c,0x78,0xd2,
+ 0x4a,0xf1,0xd6,0xea,0x62,0x0f,0x59,0x9f,0x8f,0x5a,0x84,0x5c,0x56,0x17,0x7f,0x35,
+ 0xfd,0x97,0xe9,0x75,0x25,0x08,0x49,0xc6,0x1d,0x45,0xf0,0x27,0x8b,0x01,0x85,0xc4,
+ 0x1c,0x98,0xdb,0xb6,0xcd,0xae,0x67,0xfe,0x06,0xc1,0x0f,0x00,0x28,0x00,0x90,0x2a,
+ 0xf8,0x85,0x67,0x9e,0x79,0x26,0x12,0xfc,0x32,0x29,0x46,0x1e,0x02,0x39,0xeb,0x7e,
+ 0x14,0xe9,0xd2,0xaf,0x45,0x29,0xa8,0xb5,0xff,0x22,0xf8,0x45,0xa9,0x92,0x3a,0xe1,
+ 0x92,0xfe,0x26,0x55,0xc2,0xd2,0x14,0x30,0xdb,0xb9,0xb1,0x1d,0x0f,0x51,0x00,0xcc,
+ 0xe8,0x7f,0x89,0x0b,0x70,0x29,0x31,0x00,0x00,0x28,0x00,0xd0,0x21,0x5c,0x44,0x60,
+ 0xc8,0x54,0x92,0x92,0xd2,0x25,0xe3,0xd1,0x59,0x2c,0x52,0x9f,0xf0,0xcc,0x1a,0x45,
+ 0x9f,0x66,0x41,0xfb,0x26,0x07,0xaa,0x75,0x7f,0x6b,0xdd,0x7f,0xdb,0xef,0x67,0xcd,
+ 0x9a,0x15,0x09,0x7e,0x71,0xd3,0x4b,0x70,0x5f,0x48,0x64,0x7f,0x88,0x87,0x26,0xe9,
+ 0x01,0xb0,0x15,0x14,0x92,0x73,0x2a,0xdb,0x44,0xf8,0x03,0x00,0x0a,0x00,0xac,0x23,
+ 0x48,0x96,0x2f,0x5f,0x1e,0xe5,0xf2,0x4b,0x1d,0x76,0x09,0xf2,0xb3,0xb9,0xb8,0x8b,
+ 0x9e,0x8c,0x27,0xab,0xc0,0xad,0x25,0x6a,0xbf,0x88,0xed,0xa5,0x59,0xfc,0x52,0x14,
+ 0x49,0x04,0xb4,0x64,0x4b,0xc8,0x58,0x7f,0x11,0xc8,0xfa,0x93,0x45,0x85,0x62,0xeb,
+ 0x1f,0xcb,0x1f,0x00,0x50,0x00,0x60,0x1d,0xab,0x51,0xea,0xc9,0x4b,0xe1,0x09,0x29,
+ 0xe4,0x32,0x6f,0xde,0xbc,0x60,0x01,0x19,0xb2,0x8d,0x5a,0x5d,0xf4,0x59,0xa3,0xea,
+ 0xb3,0x1e,0x83,0x5a,0x3c,0x18,0x21,0xeb,0x8f,0x67,0xf8,0x5b,0xbc,0x78,0xb1,0xda,
+ 0x7a,0xeb,0xad,0xa3,0x8c,0x89,0x22,0xb3,0x12,0x92,0x0a,0x80,0x58,0xfc,0xa2,0x00,
+ 0xc4,0x4a,0x9c,0x59,0x1d,0x10,0x65,0x00,0x00,0x50,0x00,0xda,0x54,0xf0,0x8b,0x3b,
+ 0xfa,0xf6,0xdb,0x6f,0x8f,0xac,0x7e,0x29,0x84,0xe1,0x2a,0x18,0x93,0x25,0xe8,0x2d,
+ 0xcf,0x34,0x3f,0x13,0x9f,0xcb,0xbf,0x1a,0x01,0x9e,0x25,0x8b,0x20,0x4b,0xff,0xe5,
+ 0xd8,0x8a,0xc5,0x2f,0x0a,0xd5,0x16,0x5b,0x6c,0x11,0x55,0x46,0x34,0xf3,0xf2,0x7d,
+ 0x1e,0x8b,0x6a,0x14,0x04,0x49,0x03,0x94,0x26,0xc2,0x5f,0x5e,0x63,0x2f,0x40,0x96,
+ 0xe3,0x04,0x00,0x80,0x02,0xd0,0xa2,0x82,0x7f,0xea,0xd4,0xa9,0xea,0xd6,0x5b,0x6f,
+ 0x8d,0xc6,0xf9,0x45,0x48,0x84,0x08,0xe7,0xac,0xcb,0x84,0x08,0xb8,0x22,0xd6,0x9f,
+ 0xc5,0xa3,0x50,0xc4,0xfe,0xc5,0xae,0x7e,0xb1,0xfc,0xa5,0x2a,0xe2,0xee,0xbb,0xef,
+ 0xde,0x51,0x01,0x2f,0xab,0x00,0xce,0x9a,0x05,0x10,0x07,0x01,0xc6,0xc2,0x3f,0x1e,
+ 0xf3,0x37,0xe7,0x04,0x00,0x00,0x40,0x01,0x68,0x33,0xc1,0x2f,0x82,0x49,0x2a,0xf7,
+ 0x49,0xc9,0xde,0x32,0xb8,0x81,0x8b,0xae,0xcd,0x5f,0xcf,0x2c,0x01,0xb1,0xf8,0xc5,
+ 0xd5,0x2f,0xaf,0xa3,0x46,0x8d,0x52,0x07,0x1e,0x78,0x60,0x14,0xe1,0x5f,0x4b,0xa1,
+ 0xa2,0xb4,0x2c,0x00,0x89,0xd7,0x88,0x67,0x57,0x4c,0x2a,0x0c,0xb1,0x07,0x20,0x9e,
+ 0x10,0xc8,0x35,0x31,0x10,0x31,0x01,0x00,0x80,0x02,0xd0,0x06,0x82,0x5f,0x04,0xbe,
+ 0x08,0x7e,0x51,0x00,0x42,0x2c,0xdd,0x7a,0x91,0x87,0x05,0x9e,0xe7,0xf2,0xd5,0x0a,
+ 0x7e,0x49,0x91,0x94,0xa0,0x49,0x09,0xec,0x93,0x49,0x6e,0xfa,0xf7,0xef,0xef,0x15,
+ 0xe0,0x21,0xdf,0xdb,0xfa,0x23,0x13,0x82,0xc8,0xb0,0xc2,0xa2,0x45,0x8b,0xd6,0x0a,
+ 0xee,0x8b,0x7f,0x1b,0x0b,0xff,0xb8,0xe5,0x3d,0x0b,0x20,0x00,0x00,0x0a,0x40,0xc9,
+ 0x05,0xbf,0x3c,0xfc,0x1f,0x7d,0xf4,0xd1,0xc8,0xd5,0x2f,0xd5,0xfb,0xaa,0xb1,0x80,
+ 0xeb,0x9d,0x67,0x9f,0x77,0x50,0x9c,0x4d,0x80,0xe6,0xd5,0xff,0x58,0xf0,0xcb,0x4c,
+ 0x5d,0x52,0xc4,0x47,0x66,0x0c,0x13,0x6b,0xbc,0xa8,0xe3,0x25,0x82,0x5d,0x2c,0x7e,
+ 0x09,0xd8,0x4c,0x4e,0x01,0x6c,0xf6,0xd5,0x26,0xfc,0x6d,0x01,0x80,0x00,0x00,0x28,
+ 0x00,0x2d,0x26,0xf8,0x65,0x5a,0xd6,0xeb,0xaf,0xbf,0x3e,0x2a,0xd5,0xbb,0x70,0xe1,
+ 0x42,0xab,0x25,0x5c,0x6d,0x1e,0x7e,0xd6,0xdf,0x87,0x78,0x00,0x7c,0xb5,0xf4,0xab,
+ 0x19,0xdf,0x4f,0xcb,0x62,0xa8,0xb5,0xff,0x49,0xc1,0x2f,0x2e,0x7e,0x99,0x2e,0x54,
+ 0x5c,0xfe,0xb6,0xdf,0xe5,0x31,0x5b,0xa0,0x08,0x7e,0x11,0xfa,0x62,0xf1,0xbb,0x84,
+ 0x7a,0x72,0x7d,0xc9,0x65,0xf0,0x00,0x00,0x00,0x0a,0x40,0x0b,0x0b,0x7d,0x79,0xc8,
+ 0xbf,0xf8,0xe2,0x8b,0xea,0xf1,0xc7,0x1f,0x8f,0xca,0xf4,0x8a,0xd0,0x37,0x27,0x80,
+ 0x71,0x09,0xd4,0x5a,0xa3,0xf2,0xf3,0xa8,0x04,0x98,0x57,0x65,0xbd,0x22,0xb6,0x97,
+ 0xec,0x7f,0x52,0xf0,0xcb,0xbc,0xe1,0x92,0xcb,0x2f,0x91,0xfd,0xb5,0x44,0xed,0xa7,
+ 0x05,0xf5,0xc9,0x79,0x15,0xa1,0x2f,0xe7,0x33,0x2e,0xef,0x1b,0x9f,0xef,0xe4,0x72,
+ 0xb6,0xdf,0xc7,0x82,0x3f,0xb9,0x9c,0xa9,0x08,0x30,0xfe,0x0f,0x00,0x28,0x00,0x4d,
+ 0x28,0xf4,0x25,0x00,0xec,0xa1,0x87,0x1e,0x52,0x0f,0x3c,0xf0,0x80,0x7a,0xf2,0xc9,
+ 0x27,0xa3,0x68,0xef,0x78,0x0e,0xeb,0x64,0xaa,0x59,0x1e,0x41,0x72,0x59,0x26,0xf3,
+ 0xa9,0xc6,0xc2,0xad,0x65,0xff,0x6a,0x75,0xf9,0x87,0xec,0x8f,0x08,0xfe,0x09,0x13,
+ 0x26,0x44,0x82,0x5f,0x8e,0xf3,0x66,0x9b,0x6d,0xa6,0x36,0xdf,0x7c,0xf3,0xb5,0x6a,
+ 0xf6,0xe7,0x55,0xaa,0x38,0xb6,0xe0,0xa5,0x66,0x80,0x8c,0xf3,0x8b,0xf5,0x9f,0x74,
+ 0xf7,0x9b,0x0a,0x42,0xf2,0xef,0xa4,0x90,0xf7,0x45,0xfe,0x9b,0xfb,0xb0,0xd5,0x56,
+ 0x5b,0xa9,0x7d,0xf7,0xdd,0x37,0xf5,0xba,0xeb,0xdb,0xb7,0x2f,0x4f,0x13,0x00,0x40,
+ 0x01,0x68,0x84,0xd0,0x17,0x9e,0x7f,0xfe,0xf9,0xa8,0x3c,0xef,0xfd,0xf7,0xdf,0x1f,
+ 0x05,0x83,0xc9,0xfc,0xd0,0xeb,0xaf,0xbf,0x7e,0xb0,0xc5,0x6b,0xe2,0xcb,0xab,0x0f,
+ 0x29,0xb5,0x6b,0xbe,0xa6,0x4d,0x96,0x93,0x75,0x48,0xa1,0xd6,0xd9,0xfc,0x6a,0xe9,
+ 0xbf,0x08,0x61,0x49,0xe9,0x13,0xcf,0x8a,0xac,0x63,0xf4,0xe8,0xd1,0x91,0xa0,0xb4,
+ 0xd5,0xec,0x37,0xcf,0x53,0xb5,0x41,0x7f,0x62,0xf1,0xcb,0x38,0xbf,0x9c,0xdb,0xa4,
+ 0xe0,0x77,0x59,0xf4,0x2e,0x85,0xc7,0x54,0x06,0x6c,0xfb,0x98,0xe4,0x93,0x9f,0xfc,
+ 0x64,0xd4,0x00,0x00,0x50,0x00,0x4a,0x24,0xf4,0xe5,0xe1,0x7f,0xef,0xbd,0xf7,0xaa,
+ 0xab,0xaf,0xbe,0x3a,0xb2,0x44,0x45,0x00,0x0d,0x19,0x32,0x44,0xf5,0xe9,0xd3,0xa7,
+ 0x2a,0x8b,0x36,0x4d,0x40,0x56,0x13,0x65,0xef,0x1b,0xc3,0xcf,0xb2,0x7c,0x9e,0xd3,
+ 0xeb,0x56,0xdb,0x7f,0x11,0xfc,0x62,0xf5,0x4b,0x2c,0x85,0x20,0x91,0xfd,0x52,0xc1,
+ 0xcf,0x56,0xb3,0x3f,0xaf,0x20,0x49,0x29,0xc2,0x24,0x16,0xbf,0xb8,0xfa,0xd3,0x82,
+ 0xf7,0x62,0x65,0x20,0xf6,0x14,0x98,0xa4,0x8d,0xf9,0x13,0x07,0x00,0x00,0x28,0x00,
+ 0x4d,0x22,0xf8,0x05,0xb1,0x3e,0x7f,0xf5,0xab,0x5f,0xa9,0xd7,0x5f,0x7f,0xbd,0xe3,
+ 0x33,0x11,0x4c,0xd3,0xa6,0x4d,0xe3,0xcc,0xd6,0x89,0x71,0xe3,0xc6,0x79,0x95,0x87,
+ 0x6a,0x2b,0xf9,0x2d,0x5b,0xb6,0x2c,0x12,0xfc,0x32,0xa4,0x63,0x0a,0xf1,0xa4,0x90,
+ 0xb7,0x8d,0xfd,0xbb,0x3c,0x00,0x00,0x00,0xd0,0x64,0x0a,0x40,0xf2,0x81,0x2e,0xae,
+ 0xe7,0x0b,0x2f,0xbc,0x50,0xdd,0x77,0xdf,0x7d,0x9c,0xc1,0x12,0x9c,0x97,0x6a,0x63,
+ 0x0e,0x5c,0x1e,0x8a,0xb8,0x88,0x8f,0x28,0x00,0xb6,0x31,0x7d,0x9b,0xb5,0x1f,0xbf,
+ 0x4f,0x7e,0x67,0x5e,0x37,0x28,0x00,0x00,0x00,0x4d,0xa4,0x00,0x98,0xe3,0xc1,0x92,
+ 0xbb,0x7f,0xde,0x79,0xe7,0x45,0x96,0x21,0x94,0x9b,0xac,0x41,0x89,0x71,0x2e,0xbf,
+ 0x78,0x71,0x4c,0x57,0xbe,0x29,0xf8,0x93,0x9f,0x99,0x55,0xfd,0xd2,0x66,0x28,0x04,
+ 0x00,0x80,0x92,0x2b,0x00,0xb6,0x40,0xb0,0x2b,0xae,0xb8,0x42,0xfd,0xcf,0xff,0xfc,
+ 0x0f,0x67,0xad,0x84,0x42,0x3e,0x44,0xe0,0xbb,0xbe,0x97,0xb1,0x7d,0x49,0xe7,0x93,
+ 0x20,0xbf,0xd8,0xda,0xb7,0x09,0xfa,0xf8,0xbd,0x4d,0x39,0x30,0x3d,0x00,0x71,0xd5,
+ 0x3f,0xf3,0x5a,0x02,0x00,0x80,0x12,0x2b,0x00,0xe6,0x38,0xae,0x3c,0xc8,0x7f,0xf8,
+ 0xc3,0x1f,0x46,0x33,0xf3,0x41,0xf9,0x15,0xb5,0xd0,0xd2,0xbd,0xc9,0x5c,0x7e,0x9b,
+ 0x90,0x37,0xd7,0xe9,0x1a,0xe7,0x4f,0x0b,0x0a,0x4c,0x7a,0x00,0x50,0x04,0x00,0x00,
+ 0x4a,0xac,0x00,0x98,0x0f,0x75,0xb1,0x0e,0xbf,0xfb,0xdd,0xef,0x46,0x53,0xf2,0x42,
+ 0x6b,0x28,0x0b,0xa2,0xd0,0x25,0x05,0x7f,0xd2,0xa2,0x4f,0xcb,0xe7,0xb7,0xb9,0xfe,
+ 0x6d,0xd5,0xfd,0x5c,0xb5,0x01,0x00,0x00,0xa0,0x84,0x0a,0x80,0xab,0x60,0xcb,0x45,
+ 0x17,0x5d,0x84,0xf0,0x6f,0x22,0x01,0xef,0x73,0xf9,0x4b,0x1a,0xa1,0x08,0xfe,0x78,
+ 0x52,0x1e,0x57,0xe0,0x9e,0xcd,0xda,0x4f,0x2a,0x05,0xbe,0x3a,0x00,0x71,0x60,0x20,
+ 0x00,0x00,0x94,0x58,0x01,0x70,0xb9,0x74,0xaf,0xbd,0xf6,0xda,0xa8,0xb0,0x0f,0x34,
+ 0x07,0x69,0x75,0x07,0x24,0xb0,0x2f,0x59,0xb6,0xd7,0x96,0xcf,0xef,0xf2,0x04,0xb8,
+ 0x14,0x04,0xd7,0xf0,0x80,0xd9,0x18,0x02,0x00,0x09,0x2e,0x9d,0x31,0x63,0x46,0xd4,
+ 0xde,0x7b,0xef,0xbd,0x8e,0xf7,0x71,0x93,0xcc,0x93,0xe3,0x8f,0x3f,0x5e,0x1d,0x77,
+ 0xdc,0x71,0xd1,0x1c,0x16,0x00,0x28,0x00,0x0d,0x12,0xfe,0xf2,0x30,0x7f,0xec,0xb1,
+ 0xc7,0xd4,0x2f,0x7f,0xf9,0x4b,0xce,0x50,0x93,0x7b,0x00,0x44,0xf0,0x8b,0xbb,0x3f,
+ 0xce,0xe5,0x4f,0x5a,0xef,0xf1,0xfb,0xb8,0xa4,0x6f,0x52,0x80,0xbb,0xb2,0x00,0x4c,
+ 0x21,0x9f,0x54,0x26,0x4c,0x0f,0x80,0x29,0xf0,0xc9,0x06,0x68,0x2d,0xe4,0x9a,0x32,
+ 0x05,0xb9,0xab,0xc5,0x85,0xab,0x4c,0x06,0x0d,0x1a,0xa4,0xfe,0xcf,0xff,0xf9,0x3f,
+ 0xea,0xcc,0x33,0xcf,0x54,0xfd,0xfa,0xf5,0xe3,0x1a,0x01,0x14,0x80,0x46,0x08,0xff,
+ 0x64,0x93,0xb9,0xe3,0x65,0xdc,0x1f,0x17,0x6e,0x73,0x08,0x7d,0xdb,0xdf,0xf2,0x70,
+ 0x16,0x8b,0x5f,0xca,0xf6,0x26,0xdd,0xf1,0xb6,0x68,0x7d,0x53,0x60,0xbb,0xaa,0xfd,
+ 0x99,0xc3,0x02,0xbe,0x21,0x83,0xe4,0xb6,0xa0,0x39,0x90,0x73,0x26,0x95,0x26,0x43,
+ 0x84,0xfa,0xdc,0xb9,0x73,0xab,0xde,0x8e,0x08,0xfe,0xff,0xfe,0xef,0xff,0x5e,0x47,
+ 0xf0,0x93,0x3e,0x0a,0x28,0x00,0x0d,0x14,0xfe,0xf2,0x00,0x90,0x88,0x7f,0x99,0xe2,
+ 0x15,0x9a,0x03,0xd3,0xe5,0x2f,0xe7,0x70,0xce,0x9c,0x39,0xce,0x40,0x3c,0x9b,0x80,
+ 0x77,0x09,0x74,0xdb,0xb0,0x80,0x29,0xd8,0x6d,0xf1,0x01,0xb1,0xd2,0xc1,0x10,0x40,
+ 0x39,0x48,0xba,0xe0,0xd3,0x9a,0x4c,0x2a,0x15,0xa7,0x6f,0x16,0x41,0x2c,0xf8,0xbf,
+ 0xfa,0xd5,0xaf,0xaa,0xfe,0xfd,0xfb,0xaf,0xf3,0x3c,0xb2,0x55,0xaa,0x04,0x40,0x01,
+ 0x28,0x48,0xf8,0x27,0x1f,0xe0,0xf2,0xc0,0x96,0xea,0x7e,0x4f,0x3c,0xf1,0x04,0x67,
+ 0xa6,0x49,0xbd,0x00,0xbe,0x4a,0x7d,0x49,0xc1,0x6e,0x73,0xf3,0x9b,0x02,0xdd,0xe7,
+ 0x11,0xf0,0xa5,0x04,0x22,0xf8,0x8b,0x23,0x0f,0x17,0x7c,0xbd,0x10,0xc1,0xff,0x5f,
+ 0xff,0xf5,0x5f,0xea,0xf4,0xd3,0x4f,0xef,0x10,0xfc,0x69,0xd7,0x85,0xa9,0xd4,0x02,
+ 0xa0,0x00,0x14,0xe8,0x01,0x90,0x87,0xb9,0x3c,0x24,0x18,0xf7,0x6f,0x5e,0x05,0x20,
+ 0x39,0xb6,0x6f,0x56,0xe7,0xf3,0xa5,0xe9,0xb9,0x82,0xf7,0x42,0x32,0x03,0xd2,0xd6,
+ 0x05,0xd9,0xa8,0x97,0x0b,0xbe,0xde,0x82,0xff,0xb4,0xd3,0x4e,0xeb,0x10,0xfc,0xc9,
+ 0x6b,0x30,0xf9,0x6a,0xfb,0x0c,0x25,0x00,0x50,0x00,0x0a,0xb4,0x16,0x63,0x61,0x21,
+ 0xed,0xa6,0x9b,0x6e,0x8a,0xc6,0xff,0xa1,0xb9,0x30,0x1f,0x94,0xe2,0xc2,0xb5,0x59,
+ 0xe8,0x36,0xeb,0xdd,0x54,0x0a,0x6c,0x31,0x02,0xae,0xc0,0xc0,0xb4,0xba,0x01,0xb6,
+ 0x99,0xff,0xda,0xf9,0x21,0x5e,0x16,0x17,0x7c,0xe8,0xf5,0x24,0xd3,0x4e,0xbb,0x9a,
+ 0x7c,0x2f,0x33,0x44,0x26,0xe7,0x8a,0xb0,0x09,0xfe,0xb3,0xce,0x3a,0x4b,0x9d,0x7a,
+ 0xea,0xa9,0xaa,0x6f,0xdf,0xbe,0x6b,0x05,0x9b,0xc6,0x2d,0xde,0x96,0x39,0x59,0x95,
+ 0x4d,0x09,0x00,0x40,0x01,0xc8,0xd9,0xea,0x4f,0x36,0xb9,0xa1,0xff,0xfc,0xe7,0x3f,
+ 0x73,0x46,0x5a,0x40,0x11,0xb0,0x09,0x77,0x5b,0x10,0xa0,0x2b,0x9f,0xdf,0x15,0x1f,
+ 0x10,0x62,0xed,0xb7,0x53,0x10,0x60,0x33,0xb9,0xe0,0x85,0x58,0x80,0x77,0xe9,0xd2,
+ 0x65,0x1d,0xa1,0x2e,0x9f,0xc5,0x82,0xdf,0x14,0xba,0xc9,0x6b,0x44,0xea,0x48,0x48,
+ 0x4b,0x13,0xfc,0x12,0xd8,0x77,0xca,0x29,0xa7,0x38,0x05,0xbf,0xa9,0x04,0xd8,0xae,
+ 0x63,0x53,0xf8,0xa3,0x0c,0x00,0x0a,0x40,0x4e,0x4a,0x40,0xf2,0x81,0x2f,0x4d,0x6e,
+ 0xd0,0x7b,0xee,0xb9,0xa7,0x29,0x5c,0x8a,0xe0,0xf6,0xe8,0xc4,0xc4,0x45,0x7e,0x4c,
+ 0x45,0x20,0x79,0xfe,0x5d,0x13,0xf8,0xd8,0xd2,0xfe,0xd2,0x84,0xbd,0x2b,0x33,0x20,
+ 0xb9,0xed,0x66,0x0a,0x02,0x6c,0x36,0x17,0xbc,0x29,0xc4,0x6d,0x7f,0xcb,0xf1,0x97,
+ 0xf7,0xae,0x02,0x51,0xb6,0x6b,0xca,0x0c,0xf2,0x94,0x54,0x52,0x9f,0xe0,0x3f,0xe3,
+ 0x8c,0x33,0xd4,0x49,0x27,0x9d,0xa4,0xfa,0xf4,0xe9,0xd3,0x31,0xc7,0x84,0x4b,0xf0,
+ 0xc7,0xfb,0x15,0xbf,0xf7,0x79,0xb5,0x00,0x50,0x00,0x72,0x12,0x14,0x36,0x25,0x80,
+ 0x82,0x3f,0xad,0xe1,0x01,0xc8,0x9a,0xba,0x67,0xfb,0x4d,0xda,0xf2,0x49,0x2f,0x82,
+ 0x99,0x19,0x60,0x7a,0x18,0x7c,0xb3,0x0f,0xd6,0x93,0x66,0x73,0xc1,0x27,0x85,0xb9,
+ 0xeb,0x7d,0x52,0x88,0x86,0x4c,0x02,0x15,0x0b,0xda,0xf8,0x7d,0xda,0xb4,0xd1,0x49,
+ 0xc1,0x2f,0x2d,0x4d,0xf0,0x4b,0x60,0xdf,0x89,0x27,0x9e,0x18,0x59,0xfc,0x42,0x5c,
+ 0x6c,0x2a,0x4d,0xe0,0xc7,0xfb,0x20,0x4d,0xae,0x99,0xa4,0x12,0x80,0xf0,0x07,0x14,
+ 0x80,0x3a,0x59,0xff,0xd2,0x26,0x4f,0x9e,0xac,0x5e,0x7b,0xed,0x35,0xce,0x46,0x8b,
+ 0x78,0x03,0xe4,0x01,0x9c,0xf4,0x00,0x98,0x82,0xd9,0xb4,0xd0,0x6d,0x4a,0x81,0x4d,
+ 0x71,0x08,0xcd,0x02,0xb0,0x0d,0x17,0x14,0x41,0x33,0xb9,0xe0,0x63,0xc1,0x17,0x0b,
+ 0x70,0x79,0x75,0xbd,0x77,0xb9,0xe0,0x43,0xa7,0x75,0xce,0xe3,0x3a,0x92,0x34,0x60,
+ 0x69,0x69,0x82,0xff,0x2b,0x5f,0xf9,0x8a,0x3a,0xe1,0x84,0x13,0x3a,0x2a,0xf7,0x49,
+ 0xcd,0x09,0x53,0xf0,0xc7,0xfd,0x8e,0x85,0x7c,0x2c,0xe8,0x93,0x7d,0x4c,0x2a,0x23,
+ 0xa6,0xe2,0x02,0x80,0x02,0x90,0xa3,0xe0,0x37,0x1f,0xe0,0x62,0xed,0x3c,0xfc,0xf0,
+ 0xc3,0x9c,0x89,0x16,0x22,0x1e,0x02,0xf0,0x95,0xe8,0x75,0x55,0xef,0x73,0x95,0x05,
+ 0x0e,0x59,0x97,0x4d,0x29,0xc8,0x7a,0xad,0x8a,0x15,0x2e,0xc1,0xa8,0x52,0x32,0xd6,
+ 0x56,0x36,0xb6,0x6c,0x2e,0xf8,0x58,0x80,0xc7,0x42,0xbc,0x6b,0xd7,0xae,0xd6,0xcf,
+ 0x6b,0xb9,0x7f,0x93,0x42,0x32,0x69,0x41,0xe7,0x89,0x9c,0x3b,0x11,0xfa,0xe2,0x2d,
+ 0x49,0x13,0xfc,0x12,0xd1,0x7f,0xcc,0x31,0xc7,0x74,0x08,0x7e,0x51,0xc4,0x92,0x63,
+ 0xfa,0xa6,0xb5,0x1f,0x0b,0xff,0xe4,0xb5,0x12,0x0f,0x49,0x98,0x59,0x27,0x21,0x43,
+ 0x13,0x00,0x28,0x00,0x35,0x2a,0x03,0x49,0x0f,0xc0,0xa3,0x8f,0x3e,0xca,0x99,0x68,
+ 0x01,0xcb,0x3f,0x7e,0x80,0xda,0xb2,0x00,0x7c,0x56,0x7e,0x5a,0xb3,0xb9,0xfe,0x4d,
+ 0x61,0x6f,0x0b,0x2e,0x4c,0x56,0x92,0x14,0xeb,0x50,0x02,0x4d,0x27,0x4e,0x9c,0x18,
+ 0x55,0x28,0xfc,0xe0,0x83,0x0f,0xa2,0x62,0x45,0x32,0xde,0x2e,0x02,0x3f,0x16,0xf6,
+ 0x65,0x70,0xc1,0xc7,0x96,0xaa,0x08,0x72,0x9f,0x50,0xaf,0x87,0x40,0x32,0xe7,0x78,
+ 0xc8,0xdb,0x3a,0x96,0xf3,0x24,0x42,0x5f,0x84,0xbf,0xab,0xfa,0xa7,0x08,0xfe,0xff,
+ 0xfc,0xcf,0xff,0x54,0x47,0x1e,0x79,0xa4,0xea,0xd5,0xab,0x57,0x87,0xe0,0xb7,0x59,
+ 0xfc,0xc9,0x2c,0x02,0x59,0x9f,0x1c,0x2b,0xb3,0x3f,0xae,0xe1,0x27,0x02,0x00,0x01,
+ 0x05,0xa0,0x00,0xe1,0xe0,0x0a,0xfe,0x93,0x07,0xf1,0xeb,0xaf,0xbf,0xce,0x99,0x68,
+ 0x62,0x4c,0xd7,0x70,0x5c,0xfe,0xd7,0x67,0xe5,0xa7,0x05,0xf5,0xa5,0xcd,0x01,0xe0,
+ 0xca,0x24,0x48,0x2e,0x23,0x81,0x60,0xa3,0x46,0x8d,0x52,0xaf,0xbe,0xfa,0xaa,0x7a,
+ 0xeb,0xad,0xb7,0x3a,0x84,0xc5,0x83,0x0f,0x3e,0xd8,0xb0,0x63,0x94,0x14,0xde,0x66,
+ 0x4b,0x0a,0xf8,0xd8,0x5a,0x6d,0x94,0xd0,0x09,0x99,0xd5,0x31,0xed,0xfb,0x2c,0x82,
+ 0x7f,0xde,0xbc,0x79,0x91,0xf0,0x4f,0x13,0xfc,0x5f,0xfa,0xd2,0x97,0xd4,0x61,0x87,
+ 0x1d,0xa6,0x7a,0xf6,0xec,0x19,0x24,0xf8,0x93,0x0a,0x80,0x4d,0xf8,0x53,0x2b,0x02,
+ 0xa0,0x8e,0x1e,0x80,0x34,0x25,0xe0,0x95,0x57,0x5e,0xe1,0x2c,0x34,0xb9,0xf5,0x6f,
+ 0x5a,0x88,0xb1,0x07,0xc0,0x1c,0x8f,0xb7,0x59,0xfb,0xa6,0x65,0xef,0x8a,0x15,0x48,
+ 0x2e,0x17,0xbf,0xb7,0x15,0x19,0xea,0xd6,0xad,0x9b,0x1a,0x3e,0x7c,0x78,0x24,0x54,
+ 0x9e,0x7d,0xf6,0xd9,0xc2,0x1f,0xf0,0x36,0x41,0x6e,0x7e,0x26,0xfb,0x94,0x74,0x51,
+ 0x87,0x8c,0xa1,0x67,0x11,0xa6,0x79,0x8f,0xd1,0xfb,0x2c,0xfe,0xac,0x1e,0x01,0x73,
+ 0xff,0xe4,0xfa,0x10,0xc1,0x2f,0x2d,0x4d,0xf0,0x9f,0x7c,0xf2,0xc9,0xea,0x90,0x43,
+ 0x0e,0x51,0x3d,0x7a,0xf4,0x58,0x47,0xf0,0xc7,0xaf,0x49,0x81,0x9f,0x14,0xfc,0xb6,
+ 0x7d,0xb5,0x15,0xa0,0x4a,0xbe,0xe6,0x71,0x2e,0x00,0x50,0x00,0x02,0x04,0x7f,0xec,
+ 0x01,0x98,0x34,0x69,0x12,0x67,0xa1,0xc5,0x94,0x81,0x38,0x08,0x30,0xc4,0xca,0x4f,
+ 0x2b,0xfa,0x13,0xe2,0x01,0x48,0x5a,0xa1,0x43,0x86,0x0c,0x89,0xdc,0xc8,0x2f,0xbf,
+ 0xfc,0x72,0x4d,0xfd,0x88,0x2d,0xc7,0xa4,0x30,0x37,0xdf,0xc7,0x6e,0xf9,0x10,0xe1,
+ 0x60,0x0a,0xe4,0xbc,0xc7,0xd0,0xcd,0x31,0x7a,0x53,0x40,0x67,0x4d,0xbb,0xcb,0xdb,
+ 0xe2,0x8f,0xf7,0x2f,0xf6,0xf8,0xf9,0x04,0xbf,0xa4,0xf2,0x1d,0x70,0xc0,0x01,0x1d,
+ 0x82,0x5f,0x0a,0xfe,0x98,0xc5,0x7b,0x6c,0x82,0x3f,0x69,0xed,0x27,0x05,0x7e,0x16,
+ 0x45,0x07,0x45,0x00,0x50,0x00,0xea,0xa0,0x04,0xc8,0xc3,0x40,0xda,0xdb,0x6f,0xbf,
+ 0xcd,0x59,0x68,0x01,0xc1,0x9f,0x7c,0x2f,0x0a,0x40,0x5a,0x0c,0x40,0x68,0xb3,0x29,
+ 0x0c,0xb6,0x6b,0x49,0x66,0x73,0x13,0x8b,0xff,0xcd,0x37,0xdf,0x4c,0x7d,0x78,0x27,
+ 0x05,0x79,0xda,0x6b,0xde,0x0f,0xfa,0xa2,0xc7,0xd0,0x7d,0x02,0x3f,0x34,0xed,0x2e,
+ 0x2f,0x8b,0xdf,0x44,0xce,0x91,0x08,0x7e,0x09,0x9a,0x4c,0x13,0xfc,0x9f,0xff,0xfc,
+ 0xe7,0xd5,0x3e,0xfb,0xec,0xa3,0xba,0x77,0xef,0xbe,0x8e,0xc5,0xef,0x1a,0xe3,0x4f,
+ 0x2a,0x52,0x66,0xff,0x43,0x5c,0xfc,0xb6,0x8a,0x80,0x08,0x7a,0x40,0x01,0xc8,0x59,
+ 0x40,0x98,0xd6,0x7f,0xac,0x04,0x4c,0x9f,0x3e,0x9d,0xb3,0xd0,0x62,0x24,0x3d,0x00,
+ 0x69,0x2e,0xfd,0xac,0xb9,0xfe,0xe6,0xb5,0x24,0x82,0x42,0x72,0xc4,0x25,0x22,0xdf,
+ 0x85,0xb8,0xdf,0x45,0xb8,0x48,0x1d,0xf8,0xd8,0x42,0xcc,0x6b,0x0c,0xbb,0x5a,0x0b,
+ 0xda,0x26,0x84,0xf2,0x1c,0xf3,0xf7,0x45,0xed,0xe7,0x39,0x86,0x2f,0xe7,0x5a,0x9a,
+ 0xdc,0xcb,0xf1,0x6b,0xfc,0x3e,0xf9,0x79,0x5a,0x54,0xbf,0xe4,0xf0,0xef,0xb1,0xc7,
+ 0x1e,0xd1,0xb9,0x92,0xe5,0x5c,0x82,0x3f,0x69,0xed,0x9b,0x25,0x9e,0x6d,0x65,0x9f,
+ 0xb3,0x34,0xac,0x7c,0x40,0x01,0x28,0xd8,0xf2,0x37,0x03,0x00,0xa5,0x49,0x14,0x36,
+ 0xb4,0x96,0x37,0x20,0x8e,0xa2,0x77,0x4d,0x02,0x64,0xcb,0x02,0xb0,0x59,0xf7,0xae,
+ 0xef,0x44,0x00,0x88,0x5b,0x58,0x84,0xbf,0x0b,0x49,0x11,0x13,0xe1,0x12,0x97,0x83,
+ 0x2d,0xd2,0x22,0xaf,0xc6,0x82,0x4e,0x53,0x00,0x1a,0x39,0x86,0x1f,0x0b,0x75,0x9b,
+ 0x10,0x37,0xdf,0xd7,0x12,0x5f,0x21,0xe7,0xe6,0x33,0x9f,0xf9,0x8c,0xda,0x7d,0xf7,
+ 0xdd,0x3b,0x04,0x7f,0x5a,0x1e,0x7f,0xac,0xbc,0x98,0xe9,0x7c,0x36,0x81,0x6f,0xa6,
+ 0x01,0xa6,0xcd,0x2d,0x60,0x53,0x04,0x7c,0xa5,0x82,0x01,0x50,0x00,0x32,0x28,0x01,
+ 0x69,0x5e,0x00,0x19,0xb3,0x85,0xe6,0x16,0xf8,0xc9,0x07,0x65,0x32,0x05,0x30,0x69,
+ 0xc9,0x87,0xb8,0xfa,0xcd,0xc0,0xc0,0xe4,0xe7,0xf1,0x67,0x62,0x1d,0xa6,0x09,0x9f,
+ 0x01,0x03,0x06,0xa8,0xc1,0x83,0x07,0x77,0xa4,0x8a,0x55,0x63,0xf1,0xd6,0xdb,0x43,
+ 0x90,0x55,0x61,0xc8,0x4a,0xac,0x6c,0x8b,0x80,0x35,0xad,0xf5,0x58,0x98,0xe7,0x21,
+ 0xd4,0x43,0x05,0xbf,0x14,0xef,0xd9,0x79,0xe7,0x9d,0xa3,0xe1,0x16,0x97,0xe0,0x4f,
+ 0x0a,0x6e,0x53,0x51,0x72,0x59,0xf8,0xb6,0xf9,0x05,0x5c,0x73,0x0f,0xd8,0x84,0xbf,
+ 0x4d,0xe8,0x33,0x2c,0x00,0x28,0x00,0x35,0x0a,0x08,0x33,0x22,0x3c,0x7e,0x20,0x49,
+ 0x8b,0xdd,0x7d,0xd0,0x1a,0xb8,0x02,0x00,0x4d,0x97,0xbe,0xaf,0x78,0x8f,0xe9,0x01,
+ 0x10,0x21,0x21,0xcd,0x26,0xa0,0xe4,0x01,0x2f,0x82,0x45,0x04,0xbf,0x58,0x93,0x26,
+ 0x36,0x17,0x78,0x2d,0x63,0xe2,0xb5,0x5a,0xe4,0x79,0x58,0xfc,0xa6,0xab,0x3d,0xad,
+ 0x95,0x21,0xd5,0x4d,0xce,0xcd,0xb1,0xc7,0x1e,0xab,0x3e,0xfa,0xd1,0x8f,0xae,0x25,
+ 0xf8,0x5d,0x6e,0xfe,0xf8,0xbc,0xd9,0x8e,0xa1,0x29,0xec,0x5d,0x69,0x95,0xae,0x94,
+ 0xcb,0x50,0x65,0x00,0x00,0x05,0x20,0x27,0xe1,0xef,0xca,0x02,0x68,0x74,0xd1,0x15,
+ 0xc8,0xd7,0xd3,0x93,0x54,0x00,0x92,0x1e,0x80,0xf8,0xbd,0x39,0xf9,0x4f,0x52,0xc8,
+ 0x27,0xd7,0x15,0xff,0x4e,0x14,0x44,0x69,0x36,0x21,0x26,0x31,0x00,0xeb,0xad,0xb7,
+ 0x5e,0x24,0xfc,0x93,0xc2,0xc2,0x66,0x71,0xa7,0xbd,0xd6,0xea,0x21,0xb0,0x09,0x7c,
+ 0x9f,0x80,0xb7,0x29,0x17,0xb1,0x50,0xf4,0x09,0x76,0x97,0x22,0x54,0x6f,0xe4,0x98,
+ 0x4b,0xa4,0xbe,0xe4,0xe7,0x9b,0xaf,0xf1,0xfb,0xf8,0x6f,0x39,0x57,0x52,0x64,0xe9,
+ 0xee,0xbb,0xef,0x6e,0xb8,0xb7,0xaa,0x9e,0x9e,0x9d,0x32,0x7a,0xeb,0xe8,0x7f,0xfd,
+ 0xfb,0x3f,0x62,0xc4,0x88,0x48,0x29,0xfd,0xf9,0xcf,0x7f,0xde,0xfa,0x0a,0x80,0x6d,
+ 0x26,0x37,0xd3,0xf5,0x1f,0x2b,0x00,0xd0,0xfc,0x24,0x05,0x98,0x2d,0xf8,0x2f,0x64,
+ 0x82,0x20,0x53,0xf0,0x8b,0xa0,0x13,0xc1,0x6f,0x8b,0x1a,0x97,0x22,0x3f,0xeb,0xaf,
+ 0xbf,0x7e,0x14,0xfd,0x6f,0xbb,0xd9,0xaa,0xc9,0x53,0xaf,0x75,0x79,0xd7,0x32,0x36,
+ 0x61,0x1e,0xbb,0xe2,0xcb,0x2c,0xd4,0x6d,0x82,0xdd,0xfc,0x3c,0x8e,0xd6,0x0f,0xc1,
+ 0x76,0x1e,0xeb,0x91,0x7e,0x68,0xfe,0x3e,0xa9,0x90,0xd6,0x52,0x32,0xda,0xa6,0xfc,
+ 0x66,0x5d,0x1f,0xfd,0x6f,0xfd,0xfe,0x4b,0x6a,0xb2,0xb4,0x97,0x5e,0x7a,0xc9,0x1a,
+ 0xb7,0xd2,0x76,0x1e,0x80,0x64,0x1a,0xa0,0x2b,0x25,0x08,0x9a,0xd7,0x03,0x10,0x0b,
+ 0x32,0x9b,0xeb,0xdf,0x25,0xec,0xcd,0xe5,0xe3,0x71,0x7e,0x13,0xb1,0xf4,0x45,0xf0,
+ 0xc7,0x35,0xe0,0xeb,0x65,0x89,0x98,0xeb,0x4f,0x0a,0xf5,0xd8,0x62,0x4f,0x0a,0xf5,
+ 0xf8,0x7d,0x99,0x84,0xba,0x08,0xeb,0xd8,0x12,0x37,0x05,0x7a,0xdc,0xe4,0x3b,0x69,
+ 0xa1,0x9e,0x8d,0xd8,0x85,0x1f,0xda,0xc7,0x7a,0x5b,0x9c,0x8d,0xf0,0xec,0xd0,0x7f,
+ 0xfa,0x1f,0xdf,0x1b,0x52,0xef,0x42,0x26,0x01,0x7b,0xf7,0xdd,0x77,0x9d,0xfb,0xd2,
+ 0x68,0x65,0xa0,0xae,0x31,0x00,0xa6,0x85,0x88,0x02,0xd0,0x1a,0xc2,0x3f,0x79,0xf1,
+ 0x26,0x67,0x02,0x4c,0x9e,0x7f,0x9f,0x47,0x20,0x4e,0xff,0x32,0xc7,0xac,0x65,0xcc,
+ 0x56,0x84,0xbe,0xb8,0xfa,0xe3,0xc2,0x30,0xb5,0xa6,0xdd,0xd9,0x6e,0xec,0x38,0x28,
+ 0x4e,0x6e,0x5c,0xd9,0x8f,0x38,0x3e,0x25,0x29,0xd4,0x63,0xc1,0x5e,0x86,0xeb,0x36,
+ 0x16,0xea,0xa6,0x00,0x77,0x09,0xf5,0xd0,0x07,0x62,0x5a,0xdf,0x6c,0x16,0x4e,0x16,
+ 0x05,0xc7,0x36,0x47,0x43,0x96,0x07,0xac,0x69,0xc1,0x85,0xac,0x2f,0x6d,0x79,0x57,
+ 0xdd,0x7f,0xfa,0x4f,0xff,0xab,0xed,0x7f,0x5c,0xf3,0x42,0xbc,0x93,0x62,0xb0,0x98,
+ 0xbf,0x33,0x97,0x6f,0xf4,0xd4,0xd3,0x85,0xa7,0x01,0x9a,0x42,0xc0,0x6c,0xd0,0xdc,
+ 0x98,0x17,0x6d,0x2c,0xc0,0x5d,0xd1,0xfc,0xb6,0x80,0x3f,0x11,0xb4,0xa6,0xb5,0x2c,
+ 0xc2,0x6b,0xe8,0xd0,0xa1,0x91,0xfb,0xcc,0x56,0xcf,0xdd,0xdc,0xb6,0x2b,0xa5,0x2d,
+ 0x29,0xb8,0x6d,0xef,0xcb,0x2a,0xd4,0xcd,0xd7,0xb8,0x49,0x90,0xa3,0x58,0xf0,0xb6,
+ 0x60,0x47,0x9f,0xfb,0xbd,0x56,0x8b,0xad,0x56,0x0b,0xc9,0x7c,0x20,0xd7,0x2a,0x20,
+ 0xb2,0x3e,0xb0,0xe9,0x3f,0xfd,0x2f,0xb2,0xff,0x22,0xf8,0xc5,0x3b,0x39,0x70,0xe0,
+ 0xc0,0x75,0xac,0x7c,0x33,0x05,0x3a,0x6f,0xef,0x48,0xa9,0x87,0x00,0x4c,0x4f,0x80,
+ 0x39,0x55,0x2c,0xb4,0x86,0xfb,0x3f,0x16,0xe6,0xa6,0x07,0xc0,0x2c,0xe8,0x13,0x5f,
+ 0x07,0xb1,0x00,0x4e,0x5e,0x07,0xa2,0x39,0x0f,0x1b,0x36,0x2c,0xba,0x89,0x6c,0x37,
+ 0x5e,0xec,0x7e,0x8f,0xad,0xf3,0xa4,0x20,0x37,0x5b,0x99,0xdc,0xef,0x49,0x6b,0x3c,
+ 0x29,0xd8,0x63,0x81,0x2e,0x7f,0xc7,0x55,0x08,0x43,0x3c,0x1b,0x21,0xf1,0x33,0xb5,
+ 0x8e,0xa9,0xda,0x2c,0x26,0x73,0x0c,0xd5,0xb7,0xbe,0xe4,0x39,0xf0,0x59,0x60,0xbe,
+ 0xf5,0xf9,0x04,0x04,0xfd,0xa7,0xff,0x8d,0xe8,0xbf,0x54,0x21,0x95,0xfb,0x37,0xb6,
+ 0xf8,0x93,0x9e,0x4e,0xb3,0x48,0x55,0xfc,0x7b,0xb3,0xee,0x44,0xc8,0x74,0xd4,0x4d,
+ 0x39,0x04,0x60,0x1b,0x06,0x60,0x08,0xa0,0x35,0xbd,0x00,0xc9,0xa9,0x80,0xd3,0xa6,
+ 0xe9,0x8d,0xdd,0xec,0xc9,0xf3,0x2f,0x05,0x7b,0xc4,0xda,0x97,0x1b,0x49,0xbe,0x97,
+ 0x71,0x33,0x53,0xa0,0xbb,0xb2,0x01,0x1a,0x25,0xd4,0xa5,0x89,0x00,0x4f,0x0a,0x77,
+ 0xb3,0x89,0x50,0x0f,0x7d,0x20,0xc5,0xc7,0x2e,0x4f,0x8b,0x2b,0xcf,0x31,0xdb,0xbc,
+ 0x2b,0x1e,0x96,0x6d,0x7d,0xf4,0x9f,0xfe,0x67,0x59,0xbf,0x8c,0xef,0x0b,0xb1,0xc5,
+ 0xef,0xf2,0x7e,0xdb,0x94,0x0a,0x57,0x8d,0x8b,0x7a,0x2b,0x01,0x85,0x65,0x01,0x98,
+ 0x82,0xdf,0xa6,0x08,0xa0,0x00,0xb4,0x9e,0x17,0x20,0xad,0x0e,0x40,0x5a,0x80,0xdf,
+ 0xc2,0x85,0x0b,0xa3,0xd6,0x48,0xa1,0x2e,0xc2,0xdc,0x14,0xe0,0xb6,0xcf,0x92,0x42,
+ 0x3d,0xd4,0xfd,0x5e,0xc4,0x03,0x29,0xab,0x45,0x54,0xab,0x8b,0x33,0x0f,0x45,0x91,
+ 0xfe,0xd3,0xff,0x66,0xef,0x7f,0x3c,0x64,0x29,0x71,0x49,0xe6,0xba,0xcc,0xe7,0xa2,
+ 0x29,0xc8,0x45,0xc9,0x4f,0xd6,0xba,0x48,0x2a,0x02,0x2d,0x1b,0x03,0xe0,0xf2,0x02,
+ 0x30,0x17,0x77,0x6b,0xb1,0x74,0xe9,0xd2,0x8e,0xb9,0xdd,0x4d,0xa5,0x4f,0x4a,0xf7,
+ 0xd6,0xbb,0x28,0x4d,0x52,0xa8,0x27,0x05,0xb9,0x29,0xd4,0xe5,0xef,0xa4,0xfb,0xdd,
+ 0xf7,0x40,0x08,0x75,0x61,0x16,0xfd,0x40,0xf2,0xb9,0x64,0xab,0xd9,0x7e,0x96,0xf5,
+ 0xd1,0x7f,0xfa,0xdf,0x4e,0xfd,0x97,0xe7,0x97,0x3c,0xe3,0x24,0x28,0x59,0xe2,0x92,
+ 0x7c,0xc1,0x90,0xb6,0x00,0x3f,0x59,0x47,0x5c,0x8c,0x2a,0x7e,0x46,0xd9,0x02,0x03,
+ 0xeb,0xe5,0x05,0xa8,0x6b,0x16,0x80,0x4d,0x11,0x80,0xe6,0xb7,0xfe,0xa5,0x9c,0xf3,
+ 0x94,0x29,0x53,0x22,0xb7,0x7d,0x5c,0x7b,0x3f,0x3e,0xb7,0x22,0xf8,0xf3,0x1c,0x8f,
+ 0x8f,0x85,0xba,0x29,0xd8,0x6d,0xaf,0xd5,0x5a,0xea,0x45,0x51,0x6f,0x8b,0xab,0x6c,
+ 0xd0,0x7f,0xfa,0xdf,0x8c,0xfd,0x97,0xfd,0x93,0x79,0x47,0xc4,0xe2,0x97,0x52,0xe3,
+ 0x2e,0x81,0x6f,0xeb,0x53,0x72,0x5a,0x6a,0x79,0x4d,0xce,0x93,0x62,0x3e,0xd7,0x5a,
+ 0xc2,0x03,0x90,0xa6,0x15,0xe1,0x01,0x68,0x2d,0xc1,0x2f,0xd6,0xbe,0x4c,0xe7,0x3c,
+ 0x67,0xce,0x9c,0x75,0xbe,0x8b,0xdd,0x64,0x21,0x82,0x35,0x2e,0x3e,0x63,0x4b,0x6b,
+ 0x13,0x8d,0x5b,0xd6,0x13,0x97,0xf9,0xcd,0x22,0xd4,0x6d,0x43,0x0d,0x00,0x00,0xa1,
+ 0x88,0xe0,0x97,0xd8,0xa4,0xe1,0xc3,0x87,0x07,0x3d,0x13,0x5d,0x55,0x46,0x63,0x25,
+ 0x20,0xf6,0x82,0xc6,0x1e,0x47,0xd7,0xd4,0xd5,0x4d,0x1d,0x03,0x90,0xc5,0x0b,0x00,
+ 0xcd,0x85,0x08,0x74,0x11,0xf8,0x33,0x67,0xce,0x8c,0xac,0x7b,0x9b,0xd0,0x8d,0x3f,
+ 0x77,0x09,0x75,0xf3,0xbd,0x4d,0xa8,0x4b,0x4a,0x8d,0x78,0x16,0x92,0xe3,0x6c,0x66,
+ 0x1a,0x61,0xbd,0x27,0xf5,0x09,0x7d,0x00,0xd4,0xab,0x20,0x11,0xfd,0xa7,0xff,0xf4,
+ 0xbf,0x98,0xfe,0x4b,0x80,0x9f,0x4c,0x21,0x3e,0x72,0xe4,0xc8,0x54,0x41,0x9f,0x26,
+ 0xf4,0x6d,0x1e,0x8e,0xd8,0x28,0xf1,0xcd,0x0f,0xd2,0xb4,0x1e,0x80,0x34,0x8f,0x00,
+ 0xc2,0xbf,0x79,0x11,0x2b,0x7c,0xf6,0xec,0xd9,0x51,0x75,0x2b,0xb9,0x48,0x45,0x70,
+ 0x8b,0xbb,0x5f,0x52,0x5f,0x92,0xa9,0x6d,0x71,0x8e,0x7a,0x48,0x9e,0xba,0xcd,0x25,
+ 0x28,0x37,0x9e,0x6c,0x43,0xc6,0xc9,0x64,0x5d,0xa6,0x07,0x21,0x6b,0xe9,0xd1,0x5a,
+ 0x4a,0x95,0xe6,0xe5,0x01,0xcb,0x73,0x7b,0xf4,0x9f,0xfe,0xd3,0xff,0xe2,0xfa,0x2f,
+ 0xc6,0x8b,0xcc,0x24,0x6a,0x13,0xfc,0x69,0xbf,0xf5,0xd5,0x27,0x48,0xc6,0x00,0x24,
+ 0xd3,0x00,0x6d,0x05,0xd2,0x5a,0x2e,0x0d,0x30,0x54,0x39,0x80,0xf2,0x22,0x02,0x59,
+ 0xf2,0xf3,0xa5,0x25,0x49,0x73,0x8d,0xf9,0xc6,0xfc,0x92,0xaf,0x32,0x64,0x20,0x59,
+ 0x00,0x72,0x43,0xb8,0xdc,0xfc,0x8c,0xa1,0xd2,0x7f,0xfa,0x4f,0xff,0x8b,0xe8,0x7f,
+ 0x5c,0xd6,0x7a,0xc3,0x0d,0x37,0xb4,0x0a,0x72,0x57,0x8d,0x03,0x9b,0xa5,0x6f,0xfb,
+ 0x2c,0x19,0x48,0x98,0x4c,0x03,0x94,0xe7,0x5d,0x1c,0x08,0x68,0x2e,0xdb,0xb4,0x41,
+ 0x80,0x36,0x0b,0x1f,0xcb,0xbf,0xb9,0x49,0xe6,0xac,0x66,0x55,0xf0,0x5c,0xaf,0x71,
+ 0x09,0xde,0x38,0x43,0x20,0x9e,0x9a,0xd5,0x76,0x83,0x95,0xe1,0x81,0x51,0xf4,0xfa,
+ 0x5c,0x56,0x05,0xfd,0xa7,0xff,0xf4,0xbf,0x98,0xfd,0x8d,0x4b,0x7e,0x8b,0x61,0x63,
+ 0x7b,0xf6,0xb8,0x66,0xed,0x0c,0x11,0xce,0x36,0x2f,0x40,0xf2,0x39,0x17,0xb7,0x58,
+ 0x09,0xc8,0xb2,0xee,0xa6,0xf0,0x00,0xa4,0xb9,0x4b,0x50,0x06,0xda,0x8f,0xe4,0x78,
+ 0x97,0x5c,0xf4,0x22,0xf8,0xcd,0xe2,0x3e,0xc9,0x1b,0x34,0xd6,0x8c,0x5d,0xca,0x47,
+ 0xc8,0x18,0x9f,0xed,0x7d,0x2d,0x63,0x86,0x69,0xeb,0xab,0x66,0xcc,0xd1,0x65,0x51,
+ 0xd0,0x7f,0xfa,0x4f,0xff,0x8b,0xeb,0xbf,0x2c,0xb7,0x78,0xf1,0xe2,0x28,0xa5,0x2f,
+ 0x1e,0xae,0x34,0xc7,0xf3,0x5d,0x0a,0x88,0x69,0xd9,0x9b,0xcb,0xb8,0x9e,0x67,0x71,
+ 0x10,0xa0,0x78,0x53,0xa5,0x25,0xa7,0x47,0x6f,0x94,0x3c,0xac,0x5b,0x10,0x20,0xb4,
+ 0x2e,0x59,0x83,0x72,0xc4,0xdd,0x26,0xc2,0xdf,0xa6,0x65,0x9b,0xcb,0x27,0xf3,0x64,
+ 0x6b,0x2d,0xed,0xe9,0xb3,0x28,0x7c,0x0f,0x1c,0xdf,0xfa,0xcc,0xdf,0xfb,0xf6,0x3f,
+ 0x64,0xfd,0xf4,0x9f,0xfe,0xd3,0xff,0x7c,0xfb,0x2f,0xc1,0xc5,0x92,0x55,0x14,0x57,
+ 0xf0,0xb3,0x3d,0x87,0x5c,0x55,0xf9,0xd2,0x94,0x01,0x73,0x9a,0x61,0xdb,0xf2,0xe2,
+ 0x71,0x88,0x5b,0x5c,0x4b,0xc0,0xd6,0xea,0x15,0x14,0xd8,0x15,0xf1,0x05,0xb5,0x0a,
+ 0xff,0x2c,0xb5,0xbc,0x45,0xf0,0x27,0x0b,0xe9,0x84,0x7a,0x0c,0x42,0x2d,0x9a,0x10,
+ 0x6b,0x23,0xd4,0x22,0xc9,0xe2,0xd1,0xc8,0x63,0xff,0xe8,0x3f,0xfd,0xa7,0xff,0xc5,
+ 0xad,0x5f,0x2c,0x7e,0x09,0xf0,0x1b,0x31,0x62,0x84,0xd7,0x8b,0x60,0x13,0xf0,0xb6,
+ 0xdf,0x84,0xce,0x8c,0x98,0xac,0x03,0x20,0xcd,0x56,0x2d,0xb5,0x11,0xa0,0x00,0x40,
+ 0xcd,0x6e,0x7d,0x9f,0x86,0x1e,0xcf,0xca,0x17,0x47,0xbc,0x9a,0xb3,0xfb,0x99,0xeb,
+ 0x2a,0x4b,0xed,0xf2,0x46,0x1d,0x4b,0xfa,0x4f,0xff,0xe9,0x7f,0x7e,0xfd,0x97,0x5c,
+ 0x7e,0x79,0xe6,0xc8,0xec,0xa2,0xa6,0xd1,0x62,0xfe,0xd6,0x25,0xdc,0xcd,0x67,0x5d,
+ 0x5a,0xaa,0x9f,0x4d,0xf0,0xc7,0xdb,0x8b,0x85,0x7f,0xb2,0x35,0x52,0x11,0x40,0x01,
+ 0x80,0x9a,0x3d,0x00,0xe6,0xfb,0xe4,0x67,0xc9,0x62,0x40,0xa6,0x6b,0xd1,0xf6,0x80,
+ 0xf2,0x69,0xfc,0x3e,0x17,0x5f,0xd2,0x65,0xe8,0x73,0x49,0x66,0x75,0x79,0x16,0xe5,
+ 0x3d,0xa1,0xff,0xf4,0x9f,0xfe,0xe7,0xdf,0xff,0x78,0x02,0x31,0x29,0xe4,0x13,0x62,
+ 0xf1,0xa7,0x79,0x02,0x6c,0x16,0x7e,0x48,0x5a,0xa1,0xcd,0x18,0x2a,0x53,0x41,0x3c,
+ 0x14,0x00,0x28,0x04,0xb9,0xd0,0x45,0xdb,0x4d,0x1b,0xe3,0x0f,0x19,0x33,0xcc,0xf2,
+ 0x40,0xa8,0xc6,0xe2,0xc9,0x73,0x8c,0x2d,0xab,0x05,0x43,0xff,0xe9,0x3f,0xfd,0xcf,
+ 0xbf,0xff,0x22,0xf8,0xe3,0x0a,0x7e,0xae,0xe7,0x4f,0x9a,0x80,0x77,0xd5,0xf5,0x0f,
+ 0x71,0xf1,0xbb,0xde,0x27,0xff,0x4e,0x2a,0x01,0xf1,0x67,0x21,0x13,0x09,0xa1,0x00,
+ 0x40,0x29,0x3d,0x00,0x66,0x90,0x8c,0x69,0xf1,0x67,0x19,0x73,0xcc,0xd3,0xe2,0x71,
+ 0x3d,0x3c,0x8a,0xbc,0xb1,0xb2,0x6e,0x8f,0xfe,0xd3,0x7f,0xfa,0x9f,0x4f,0xff,0x65,
+ 0x39,0x29,0x22,0x26,0xc1,0x7d,0x32,0xd6,0x1f,0x52,0x99,0xaf,0x16,0xeb,0x3f,0x4d,
+ 0xe0,0x9b,0x25,0x80,0x93,0x53,0xa2,0xbb,0xac,0x7f,0x73,0x78,0x01,0x0f,0x00,0x94,
+ 0x16,0x29,0xd6,0xd3,0xa7,0x4f,0x1f,0xeb,0x0d,0xec,0x1a,0xe3,0xaf,0x37,0x14,0x4e,
+ 0xa1,0xff,0xf4,0xbf,0x3d,0xfa,0x3f,0x77,0xee,0x5c,0xd5,0xbb,0x77,0xef,0x75,0x4a,
+ 0x87,0x9b,0xc7,0xc1,0xf5,0x59,0x68,0x30,0x5f,0x9a,0xa2,0x63,0x4b,0x23,0x74,0x6d,
+ 0xcb,0x65,0xfd,0x13,0x03,0x00,0xa5,0x46,0x72,0x66,0xa5,0x04,0xb0,0x94,0xe9,0x8d,
+ 0xc7,0xb4,0xcc,0x22,0x16,0x79,0xd5,0xea,0xce,0xe3,0xfb,0x34,0x97,0x62,0xad,0x69,
+ 0x53,0x79,0xa7,0x65,0xd1,0x7f,0xfa,0x4f,0xff,0xb3,0xf5,0x4f,0x26,0x24,0x93,0x3e,
+ 0x4a,0x5a,0x9f,0x6f,0x3c,0xdd,0x66,0xe1,0xfb,0xac,0xfe,0x2c,0xfb,0x1e,0x32,0x4c,
+ 0xe0,0xb3,0xfe,0xeb,0x6e,0xc8,0x21,0xd2,0x20,0x0b,0x32,0xbe,0x26,0xda,0x36,0x00,
+ 0x40,0xa3,0x89,0x4b,0x91,0xbb,0x02,0x0a,0x93,0x82,0xd6,0x15,0xdd,0xef,0x12,0xc0,
+ 0x21,0x63,0xfa,0x69,0x93,0x02,0xd9,0xb6,0x5f,0x36,0x3a,0x73,0x09,0x01,0x00,0x40,
+ 0xb3,0x62,0x0b,0xde,0xb3,0x09,0x5e,0xdf,0xb8,0xbe,0xb9,0x2e,0x9f,0x77,0xc0,0x15,
+ 0x34,0x68,0x5a,0xf8,0xae,0xed,0xa3,0x00,0x00,0x00,0x00,0xd4,0x28,0xfc,0xd3,0x8a,
+ 0x01,0xa5,0x0d,0x61,0x98,0xcb,0x25,0xad,0x78,0xdf,0x04,0x3f,0x69,0xef,0x43,0xb6,
+ 0x8f,0x02,0x00,0x00,0x00,0x90,0x93,0x22,0x10,0x62,0xe9,0xa7,0xd5,0xed,0x37,0xbd,
+ 0x00,0xa1,0xc3,0x06,0x65,0x18,0xcf,0x47,0x01,0x00,0x00,0x00,0x70,0x58,0xfa,0x69,
+ 0x15,0xfb,0xd2,0xfe,0xb6,0xb9,0xf1,0xd3,0x52,0x18,0x51,0x00,0x00,0x00,0x00,0x1a,
+ 0xe4,0x09,0x30,0x3f,0xb3,0x15,0xe5,0xb1,0xa5,0xe8,0xd9,0x52,0xf9,0xd2,0x3c,0x05,
+ 0xc9,0xed,0xf8,0xb6,0x8f,0x02,0x00,0x00,0x00,0x50,0xb0,0x22,0xe0,0x4a,0x7f,0x0c,
+ 0x15,0xc4,0xa1,0xde,0x82,0x50,0x4f,0x01,0x59,0x00,0x00,0x00,0x00,0x39,0x5b,0xfc,
+ 0x36,0xeb,0xdd,0x54,0x06,0xcc,0xc9,0x7e,0x4c,0x2f,0x80,0x4d,0xc0,0xa7,0xd5,0x01,
+ 0x48,0xfb,0xcc,0xdc,0x46,0xa3,0x6b,0xfe,0xa3,0x00,0x00,0x00,0x40,0x4b,0x61,0x96,
+ 0xdd,0x4d,0x0a,0x63,0xb3,0x70,0x50,0x48,0x3a,0x60,0x35,0x11,0xfc,0xb6,0xe8,0x7f,
+ 0x5b,0x49,0x60,0x3c,0x00,0x00,0x00,0x00,0x39,0x7a,0x00,0xcc,0x48,0xfd,0x34,0x4b,
+ 0xbc,0x1a,0xcb,0xde,0xf4,0x34,0x98,0xca,0x84,0x2b,0x7b,0x20,0xb9,0x7d,0x3c,0x00,
+ 0x00,0x00,0x00,0x05,0x79,0x02,0x6c,0x02,0xd9,0x25,0xf4,0x43,0x2d,0x7b,0x5b,0x1c,
+ 0x41,0xc8,0xac,0x80,0xe6,0x90,0x43,0x9a,0xd2,0x81,0x02,0x00,0x00,0x00,0x50,0x85,
+ 0xe0,0x37,0x05,0xad,0xab,0x86,0x7f,0x56,0x0b,0xdc,0xcc,0x18,0xb0,0x09,0xf8,0x90,
+ 0xed,0x93,0x05,0x00,0x00,0x00,0x50,0x20,0xb5,0x14,0xe3,0xf1,0x15,0xf5,0x31,0x2d,
+ 0x7f,0x9f,0x82,0xe1,0xaa,0x23,0x50,0x36,0xda,0x76,0x32,0xa0,0x85,0x0b,0x17,0xaa,
+ 0x19,0x33,0x66,0x70,0xd7,0x00,0x00,0x14,0x44,0x8f,0x1e,0x3d,0xd4,0xa8,0x51,0xa3,
+ 0x0a,0x17,0xfa,0xae,0xb2,0xbc,0xe6,0xb2,0x69,0x13,0xfc,0x98,0x16,0x7e,0xb2,0x1c,
+ 0xb0,0x6b,0x08,0x20,0x74,0xfb,0x65,0xad,0x0e,0xd8,0x16,0x0a,0x80,0xcc,0x5d,0x3f,
+ 0x70,0xe0,0xc0,0xb5,0x3e,0x93,0x79,0xa3,0x37,0xde,0x78,0x63,0xe7,0x6f,0x1a,0x3d,
+ 0x97,0x76,0xad,0x53,0x75,0xe6,0xbd,0x7d,0xfa,0x4f,0xff,0xe9,0x3f,0xfd,0xaf,0x66,
+ 0x7b,0x32,0x83,0xe8,0xbc,0x79,0xf3,0x0a,0xdd,0xcf,0x10,0xeb,0xdf,0x95,0x31,0xe0,
+ 0x9a,0xd1,0x2f,0x6d,0x1e,0x80,0x6a,0xb6,0x8f,0x02,0xd0,0x20,0x7a,0xf7,0xee,0x5d,
+ 0x95,0x0b,0x26,0xed,0x37,0xbe,0x1b,0x34,0xaf,0x8b,0xdb,0xf7,0x5d,0x23,0xb7,0x4f,
+ 0xff,0xe9,0x3f,0xfd,0xa7,0xff,0x3e,0x96,0x2d,0x5b,0x56,0xb8,0x07,0x20,0xd4,0xca,
+ 0x77,0x29,0x34,0xe6,0xe4,0x3f,0xa1,0xde,0x86,0x90,0x80,0x40,0x14,0x80,0x06,0x5b,
+ 0xff,0x3d,0x7b,0xf6,0xcc,0xac,0xe1,0x86,0x68,0xe0,0x9d,0x3b,0x77,0xce,0xb4,0x7c,
+ 0xd6,0xf5,0xa7,0x5d,0x90,0xb5,0x6a,0xe8,0xf4,0x9f,0xfe,0xd3,0x7f,0xfa,0x5f,0x74,
+ 0xff,0xe5,0xb3,0x22,0x15,0x80,0x34,0xa5,0x25,0x2d,0x55,0xcf,0xd5,0x7f,0xdb,0x6f,
+ 0xcd,0xdf,0x64,0x39,0xc6,0x65,0x57,0x04,0x5a,0x5e,0x01,0xe8,0xd3,0xa7,0x8f,0xf3,
+ 0xe0,0xdb,0x4e,0x78,0xda,0xb4,0x92,0x3e,0x0d,0x3c,0xcf,0xe5,0xe3,0x9b,0x4b,0x5e,
+ 0x5d,0x37,0x78,0xf2,0xf7,0x21,0xcb,0xd3,0x7f,0xfa,0x4f,0xff,0xe9,0x7f,0x3d,0xfb,
+ 0xbf,0x64,0xc9,0x92,0xc2,0x5d,0xe2,0x3e,0x45,0x26,0x74,0x1c,0xdf,0xe5,0x59,0xc8,
+ 0x22,0xf8,0x43,0xb6,0x8f,0x02,0x50,0x27,0xba,0x74,0xe9,0xa2,0x7a,0xf5,0xea,0xd5,
+ 0xb4,0xfb,0x9f,0xbc,0x60,0x44,0x8b,0x5e,0xb4,0x68,0x51,0x74,0x43,0x2d,0x5f,0xbe,
+ 0x5c,0xad,0x5e,0xbd,0xba,0xe1,0x63,0x4d,0xf2,0xb0,0xe9,0xde,0xbd,0xbb,0xea,0xdb,
+ 0xb7,0xaf,0xea,0xdf,0xbf,0x7f,0x74,0xbc,0x8b,0xd6,0xe6,0x43,0x1e,0x4a,0xf5,0x72,
+ 0x91,0x36,0xc2,0x9a,0xa1,0xff,0xf4,0xbf,0x99,0xfa,0x2f,0xcf,0xab,0x7a,0xe1,0x9a,
+ 0xb0,0xc7,0x14,0xc2,0xbe,0xc0,0xbd,0x10,0x05,0xc1,0xa7,0x88,0xb8,0xb6,0x8f,0x02,
+ 0x50,0x47,0x44,0x30,0x55,0xeb,0x92,0xab,0xd5,0x65,0x97,0xd7,0xf2,0x0b,0x16,0x2c,
+ 0x50,0x73,0xe7,0xce,0xb5,0xba,0xd1,0x5c,0xa5,0x27,0xf3,0xd8,0x7e,0xc8,0xfa,0x62,
+ 0xf7,0x9e,0xb4,0x0f,0x3e,0xf8,0x40,0x0d,0x1b,0x36,0xac,0x43,0xe1,0xca,0xfb,0x78,
+ 0x55,0xa3,0x79,0x17,0xdd,0xff,0x7a,0x9c,0x7f,0xfa,0x4f,0xff,0x9b,0xb5,0xff,0xf2,
+ 0x5c,0x58,0xb9,0x72,0x65,0xdd,0xac,0xff,0xb4,0x59,0xfe,0x7c,0x0a,0x43,0x16,0x81,
+ 0xef,0x1a,0x3a,0xc8,0xba,0x7d,0x14,0x80,0x82,0xad,0x7f,0x09,0xfe,0xcb,0xe2,0x62,
+ 0x4b,0x8e,0x69,0xf9,0xbe,0x77,0xd5,0x99,0x4e,0x5e,0x04,0xbe,0x31,0xb2,0x34,0x8d,
+ 0x7d,0xe9,0xd2,0xa5,0x6a,0xe6,0xcc,0x99,0x6b,0x34,0x68,0xad,0x41,0x76,0x1e,0xa0,
+ 0xbf,0x13,0x85,0xa6,0x97,0x6e,0x5d,0xa3,0xcf,0x72,0xbc,0x8d,0xd6,0xac,0x2f,0xbe,
+ 0x50,0x3b,0x25,0x3e,0x73,0x2d,0x2f,0x1e,0x88,0x65,0xda,0x13,0x31,0x4f,0x55,0x74,
+ 0x5b,0xb5,0x6a,0x95,0x9a,0x3e,0x7d,0x7a,0x94,0xf2,0x23,0xa9,0x3f,0xb5,0xf6,0x3f,
+ 0xeb,0x03,0xc8,0x77,0xfc,0x9b,0xed,0xfc,0xd3,0x7f,0xfa,0xdf,0xec,0xfd,0x5f,0xbc,
+ 0x78,0x71,0x5d,0xad,0xff,0xb4,0x4a,0x7f,0x59,0xc7,0xef,0x43,0xbc,0x0c,0x59,0xb7,
+ 0x8f,0x02,0x50,0x47,0xfa,0xf5,0xeb,0xd7,0x71,0xf1,0x56,0xeb,0x32,0x2b,0x72,0x8c,
+ 0xcc,0x76,0xe3,0xc4,0x17,0x91,0xa4,0xcc,0xbc,0xf7,0xde,0x7b,0x4a,0xae,0xa1,0x2e,
+ 0x5d,0xd7,0x53,0x9d,0xbb,0x0c,0xd1,0xa2,0xb8,0x6b,0x87,0x80,0x36,0xc5,0xf5,0x3a,
+ 0xdb,0x36,0xc4,0xb7,0x7f,0x79,0x7d,0x63,0xeb,0x7f,0x9d,0xd6,0xd4,0x85,0x8a,0xdf,
+ 0x57,0x1c,0xbf,0xd0,0xea,0x88,0xfe,0xa6,0xb3,0xfe,0xd7,0x55,0x2b,0x5a,0x7d,0xb4,
+ 0x12,0x30,0x40,0xad,0x5a,0x39,0x35,0xda,0xff,0xd9,0xb3,0x67,0xab,0x0d,0x37,0xdc,
+ 0xb0,0xa6,0xfe,0xdb,0x1e,0x80,0x59,0x6f,0xa2,0x3c,0x5c,0xa6,0x8d,0x3a,0xff,0xf4,
+ 0x9f,0xfe,0x37,0x7b,0xff,0xeb,0x15,0xfc,0x97,0xe6,0xda,0x4f,0x9b,0x07,0x20,0xab,
+ 0x20,0x77,0x79,0x40,0xab,0xd9,0x3e,0x0a,0x40,0xc1,0x88,0xe0,0x4f,0x0b,0xfe,0x2b,
+ 0x83,0xcb,0xce,0x75,0x31,0x8b,0xd5,0x3f,0x67,0xce,0x1c,0xdd,0x87,0x1e,0xaa,0x5b,
+ 0x8f,0xd1,0xfa,0xb5,0xa7,0xea,0xd6,0xbd,0x97,0x1a,0x32,0x64,0x13,0xd5,0xb7,0xff,
+ 0x50,0x6d,0x5d,0xf7,0xd5,0x42,0xb7,0x5b,0x6d,0xdb,0xce,0x6a,0xf0,0x1b,0xac,0x5a,
+ 0xb5,0x42,0x2d,0x59,0x3c,0x57,0xbd,0x37,0xe3,0x15,0xb5,0x68,0xe1,0x2c,0xd5,0x45,
+ 0x89,0x77,0x42,0xbb,0xfb,0x56,0xbc,0x17,0x69,0xfd,0xe2,0x0d,0x90,0xec,0x8b,0x6a,
+ 0xfa,0x9f,0xe5,0x01,0x96,0x87,0xc5,0x50,0xb6,0xf3,0x4f,0xff,0xe9,0x7f,0x2b,0xf4,
+ 0x5f,0xe2,0x95,0xea,0x29,0xf4,0x7c,0x81,0x7c,0x21,0x9f,0xdb,0x3c,0x30,0xbe,0xac,
+ 0x82,0x6a,0xbc,0x05,0x28,0x00,0x75,0xb0,0xfe,0xcd,0x13,0x54,0x6f,0x97,0x5d,0x9a,
+ 0xa6,0xea,0xba,0xa1,0x44,0xf8,0xcb,0x78,0x7f,0x97,0xae,0xfd,0x54,0xf7,0x9e,0x1b,
+ 0xe9,0xfd,0xe9,0xa6,0x86,0x0d,0xdf,0x5a,0xad,0x3f,0x74,0x33,0xfd,0x7d,0x9e,0x55,
+ 0x9b,0x3d,0x3e,0x02,0x8f,0x82,0xd0,0xa5,0x6b,0x17,0xd5,0xbd,0xc7,0x70,0xd5,0x7f,
+ 0xe0,0x30,0x35,0x79,0xd2,0x23,0x6a,0xc1,0xfc,0xf7,0x54,0xd7,0xee,0x43,0xb4,0x17,
+ 0xe0,0xfd,0xa8,0x3f,0x12,0xa4,0x68,0x2a,0x00,0x45,0x8f,0xb1,0x66,0x3d,0xfe,0x65,
+ 0x3c,0xff,0xf4,0x9f,0xfe,0xb7,0x4a,0xff,0xeb,0xe5,0xfe,0xb7,0xf5,0x3b,0x4b,0xb4,
+ 0x7e,0x9a,0xa5,0xef,0x2b,0xfe,0x13,0xb2,0x7d,0x62,0x00,0xea,0x8c,0x1c,0x70,0x57,
+ 0xf0,0x5f,0xd6,0xb4,0x9b,0xac,0x63,0x62,0x69,0x2e,0x3d,0xdb,0xf6,0x93,0x7f,0x8b,
+ 0xdb,0x5f,0x2c,0xff,0x2e,0x5d,0xfb,0xaa,0xee,0xbd,0xc6,0xa8,0x6e,0xdd,0x7a,0xab,
+ 0x4d,0x37,0xdb,0x53,0xf5,0xee,0x33,0xd8,0x2b,0x91,0x65,0x35,0xb2,0x1b,0xf1,0xea,
+ 0xe2,0xf7,0xa1,0xd7,0x9d,0xef,0xf7,0x69,0xea,0xc2,0x88,0x91,0xdb,0xaa,0x89,0xaf,
+ 0xce,0xd4,0xef,0xba,0xeb,0x0f,0xbb,0xea,0xcf,0x57,0xae,0x75,0xbc,0x42,0xfb,0x1f,
+ 0x32,0x06,0x9a,0xf6,0x1a,0x62,0x2d,0x95,0xf9,0xfc,0xd3,0x7f,0xfa,0xdf,0x2a,0xfd,
+ 0x97,0xf8,0xa5,0xa2,0x83,0xff,0xf2,0xb4,0xb4,0x6d,0xe7,0xc9,0x54,0x02,0x5c,0xdb,
+ 0xb2,0x0d,0xd3,0x34,0x53,0x55,0xc0,0x96,0x53,0x00,0xc4,0xf5,0x5f,0x6d,0x3a,0x9a,
+ 0x6f,0x8c,0x2e,0xcf,0x1b,0x2e,0xb9,0x3e,0x19,0x2b,0x7b,0xff,0xfd,0xf7,0x75,0xa0,
+ 0x5f,0x37,0xd5,0xa3,0xf7,0x87,0xc2,0x7f,0xf3,0x8f,0xec,0xaf,0x23,0xea,0x07,0x04,
+ 0x5a,0x0f,0x1e,0x01,0x5e,0x6b,0xd1,0x90,0x14,0x05,0xa0,0x4f,0xbf,0xc1,0x3a,0x46,
+ 0xa1,0xf3,0x5a,0xdb,0x8c,0xad,0xff,0x3c,0xc7,0x48,0xeb,0xe1,0x32,0x6d,0xd4,0xf9,
+ 0xa7,0xff,0xf4,0xbf,0x95,0xfa,0x2f,0x99,0x4b,0x65,0xc3,0x56,0xe3,0x3f,0xcd,0xb3,
+ 0x92,0x66,0xc1,0x9b,0xb3,0x00,0x86,0x0e,0x3b,0x50,0x07,0xa0,0x0e,0x48,0x3e,0x7a,
+ 0x11,0xc5,0x17,0xaa,0xd1,0xf8,0x43,0x5d,0x78,0xe2,0xfa,0x97,0xf7,0xbd,0xfb,0x8d,
+ 0xd1,0xae,0xf4,0x1e,0x6a,0xd3,0x2d,0x3e,0xae,0x06,0x0e,0xde,0xc0,0x69,0x81,0x7b,
+ 0xa3,0xfc,0x8c,0xef,0xd7,0x55,0x08,0xd6,0x56,0x18,0xd6,0xdd,0xd9,0xf4,0xf5,0x25,
+ 0xbf,0xef,0xb4,0x6c,0x55,0x34,0x24,0x50,0x59,0xbd,0x4a,0xff,0xbd,0xaa,0xa3,0xf6,
+ 0x82,0xad,0x22,0x58,0x9e,0x69,0x47,0x59,0x5d,0xa4,0x65,0x3e,0xff,0xf4,0x9f,0xfe,
+ 0xb7,0x4a,0xff,0x25,0xfe,0x47,0x3c,0x00,0x8d,0x16,0xf4,0xe6,0xdf,0xbe,0xf3,0xe4,
+ 0x9a,0xe2,0x37,0xcd,0xf5,0x1f,0xe2,0xe6,0xb7,0xc5,0x12,0xa0,0x00,0x14,0x84,0x08,
+ 0x1e,0x29,0x4c,0x13,0xe2,0x52,0xab,0x56,0x3b,0x4e,0x8b,0xda,0xad,0x26,0xed,0x46,
+ 0x66,0x25,0x94,0x80,0x99,0x6e,0xdd,0xfb,0xab,0x6e,0x3d,0x07,0xaa,0x01,0x03,0x86,
+ 0xe9,0x31,0xff,0x31,0x1e,0x81,0xed,0x93,0xf0,0x3e,0x05,0x21,0x9b,0xcf,0x3f,0xed,
+ 0xeb,0x45,0x73,0x66,0x69,0xcf,0x45,0x67,0xb5,0x72,0xf9,0xdc,0xd4,0xe1,0x97,0x5a,
+ 0x5d,0x8c,0xb6,0xf3,0x91,0xe7,0x18,0x6d,0xa3,0xce,0x3f,0xfd,0xa7,0xff,0xad,0xd4,
+ 0x7f,0xc9,0x02,0x6a,0x24,0x2e,0xc1,0x6e,0x73,0xed,0xbb,0xbe,0x77,0x1d,0xab,0x3c,
+ 0x82,0x0a,0x51,0x00,0xea,0x60,0xfd,0xe7,0xe1,0x22,0xcb,0x9a,0x96,0xe3,0x5b,0xbf,
+ 0xcb,0x85,0x26,0xe3,0xfe,0xf2,0xda,0xa3,0xcf,0x88,0xe8,0x06,0x1a,0xb9,0xf1,0xf6,
+ 0xaa,0x6b,0xb7,0xae,0x3e,0x35,0x37,0xd5,0xa4,0x5f,0x47,0xfe,0x9b,0xfb,0xee,0x75,
+ 0x01,0x84,0x33,0x67,0xf6,0x9b,0xaa,0xb3,0x5e,0xcf,0x8a,0xe5,0x1f,0xde,0xf8,0x32,
+ 0xeb,0x62,0x5a,0xfc,0x45,0xb5,0x63,0xa2,0x45,0xaf,0xaf,0x51,0xe7,0x9f,0xfe,0xd3,
+ 0xff,0x56,0xe9,0xbf,0x7c,0x27,0x41,0xcc,0x32,0x04,0x58,0x6f,0x61,0x17,0x3a,0xd5,
+ 0xaf,0xcf,0xb5,0xef,0x12,0xea,0x21,0x13,0x05,0x85,0x4c,0x42,0x84,0x02,0x50,0x10,
+ 0xe2,0x7a,0x96,0xf1,0xff,0xa2,0xb4,0x49,0xdf,0x0d,0x14,0xe2,0x82,0x33,0xdf,0x4b,
+ 0xb4,0xbc,0x44,0xcb,0x76,0xe9,0xda,0x53,0x47,0xfd,0x0f,0xd4,0x1e,0x8c,0xfe,0x6a,
+ 0xc8,0x06,0xeb,0xce,0x9d,0xbd,0x6e,0x96,0xde,0xda,0x9f,0x7c,0x98,0xb7,0xdf,0xc9,
+ 0x99,0xb7,0x9f,0xfd,0x6e,0x5a,0xdb,0x63,0xb0,0x8e,0xc3,0x60,0xcd,0xd7,0x8b,0x17,
+ 0xcf,0x57,0xf3,0xe7,0xcd,0xd0,0xdf,0x2d,0xd7,0x1e,0x80,0xf9,0x1d,0x65,0x81,0xab,
+ 0xb1,0x50,0x8a,0x3e,0x3f,0x65,0x3c,0xff,0xf4,0x9f,0xfe,0xb7,0x52,0xff,0x65,0xec,
+ 0x5f,0xa6,0xfe,0x15,0x43,0x26,0xef,0xb2,0xe0,0x59,0x85,0xbf,0xad,0x04,0xb0,0x4d,
+ 0x90,0x87,0x94,0x02,0x8e,0x97,0x0b,0x55,0x32,0x5c,0xdb,0xa7,0x14,0x70,0x81,0xc4,
+ 0xae,0xe7,0x22,0xf3,0x74,0xf3,0xbe,0x61,0xa4,0x7c,0xae,0xbc,0xf6,0xea,0x33,0x3c,
+ 0xd2,0x9a,0x47,0x8d,0xd9,0x56,0xf5,0xe8,0xd9,0xc3,0x27,0x8f,0xbd,0x31,0x01,0xbe,
+ 0x11,0x01,0xef,0xfa,0x4d,0x07,0x81,0x23,0x4b,0x70,0xea,0xdb,0x93,0x55,0x67,0x3d,
+ 0xfe,0xbf,0x64,0xd1,0xcc,0xe8,0xf3,0xc1,0x83,0x07,0xa7,0x06,0x0d,0x65,0x7d,0x60,
+ 0x56,0xf3,0x10,0x68,0xa6,0xf3,0x4f,0xff,0xe9,0x7f,0x2b,0xf5,0x5f,0xbc,0x99,0x82,
+ 0x64,0x00,0xd4,0x53,0x01,0xb0,0x29,0x02,0x2e,0x81,0xee,0x1a,0x0e,0x08,0x89,0xdc,
+ 0xb7,0x05,0x11,0x26,0xcf,0xb1,0x6f,0xfb,0x0c,0x01,0x14,0x48,0x32,0xf8,0x2f,0xe4,
+ 0xa0,0xe7,0xad,0x95,0x65,0x1d,0xc3,0x93,0xcf,0x25,0xf5,0xaf,0x73,0xe7,0xae,0xaa,
+ 0x57,0xbf,0xa1,0xda,0x0b,0xd0,0x4d,0x8d,0x18,0xbd,0x95,0xea,0xa2,0xdd,0xff,0x99,
+ 0x03,0x86,0x3c,0x02,0xde,0x94,0xe8,0x59,0x7f,0x6f,0x53,0x40,0x56,0xad,0x5a,0xa9,
+ 0x66,0xce,0x98,0xa4,0xd7,0xa3,0xf3,0xfe,0x17,0xcf,0x8a,0x14,0x98,0x41,0x83,0x06,
+ 0x75,0xdc,0xf8,0x21,0x63,0x98,0x3e,0x17,0x66,0x35,0x0f,0xdf,0x66,0x39,0xff,0xf4,
+ 0x9f,0xfe,0xb7,0x52,0xff,0xc5,0xf2,0x97,0x58,0x26,0x41,0x26,0x2a,0xab,0xa7,0xd0,
+ 0x4f,0xfb,0xdb,0xf7,0xbb,0x50,0xb7,0x7e,0x88,0xc2,0x15,0xb2,0x3e,0x14,0x80,0x22,
+ 0x3a,0xa1,0x85,0x4f,0xcf,0x9e,0x3d,0x53,0x35,0xf2,0x90,0x1b,0xb0,0x9e,0x16,0x80,
+ 0xb8,0xcb,0x24,0x62,0xb6,0x67,0x1f,0x11,0xfe,0xdd,0xd5,0xf0,0x91,0x9b,0xab,0x9e,
+ 0xbd,0x7a,0xdb,0x4d,0xfa,0x8c,0x95,0xfa,0x2c,0x57,0x5e,0x7a,0x61,0x00,0x5f,0x4c,
+ 0x80,0x25,0xe6,0xe0,0x7d,0x2d,0xfc,0x57,0xad,0x5a,0xae,0x96,0x2f,0x9d,0xad,0x3f,
+ 0x5e,0xa9,0x83,0x17,0x07,0xae,0x55,0xfc,0xa7,0x0c,0xb3,0x91,0x95,0xf9,0xfc,0xd3,
+ 0x7f,0xfa,0xdf,0x4a,0xfd,0x9f,0x35,0x6b,0xd6,0x5a,0x82,0x4e,0x94,0x00,0x5f,0x29,
+ 0xf6,0x3c,0xfb,0x99,0x16,0xdc,0x57,0x6b,0xe0,0x63,0x5a,0xd6,0x80,0xcb,0xf5,0x6f,
+ 0x53,0x32,0xf0,0x00,0x14,0x84,0xad,0xf2,0x5f,0x51,0xee,0xa5,0xbc,0x2a,0x77,0xc5,
+ 0xee,0xb2,0x3e,0x03,0x46,0x44,0x51,0xf4,0xa3,0x36,0xd9,0x36,0xb2,0xfe,0x83,0x4c,
+ 0xf0,0x75,0xae,0x54,0x95,0x29,0x2d,0x30,0x8e,0x17,0xe8,0xe4,0x8a,0x21,0x08,0x48,
+ 0x03,0x9c,0xfe,0xce,0xab,0xd1,0x7e,0x2f,0x5d,0x38,0x23,0xfa,0x68,0xc8,0x90,0x21,
+ 0x35,0xcd,0x4e,0x58,0x76,0xca,0x58,0x3a,0x96,0xfe,0xd3,0xff,0x32,0xf4,0x5f,0x84,
+ 0xbd,0x04,0xff,0x25,0xa9,0x97,0x02,0xe0,0x12,0xf4,0x21,0x69,0x7a,0x2e,0xa1,0x6d,
+ 0xf6,0xd3,0x57,0x10,0xc8,0xdc,0x7e,0x51,0x13,0x11,0xa1,0x00,0x38,0x88,0x03,0xcf,
+ 0x42,0x35,0xb4,0x6a,0x6f,0xc8,0xbc,0xa2,0x74,0x65,0x86,0x3f,0xc9,0x95,0xed,0xde,
+ 0xb3,0xbf,0xea,0xd9,0x7b,0xa0,0xea,0x3f,0x68,0x03,0xb5,0xfe,0xb0,0x51,0x89,0x20,
+ 0x3e,0xa3,0xd2,0x5f,0x36,0xf9,0xee,0xbf,0x99,0x55,0x70,0x9a,0xbf,0xf5,0xfb,0x0f,
+ 0xe6,0xea,0x9a,0xff,0x0b,0x67,0xab,0xd5,0xab,0x16,0xeb,0xe0,0xbf,0x85,0xd1,0xac,
+ 0x8b,0xe6,0xcc,0x8b,0xd5,0x4c,0x1e,0x52,0x4b,0x29,0xd5,0x66,0x3a,0xff,0xf4,0x9f,
+ 0xfe,0xb7,0x52,0xff,0x25,0x96,0x49,0xbc,0x99,0x66,0x7f,0xea,0xa5,0x98,0xa4,0x09,
+ 0xf9,0xb4,0x7d,0xb1,0xa5,0x4a,0xda,0xac,0xff,0x10,0x2f,0x43,0x5a,0x10,0x21,0xa5,
+ 0x80,0x0b,0x24,0x9e,0xf8,0xc7,0x76,0xe0,0x6b,0x99,0xcd,0xaa,0xd6,0x1b,0x3a,0x8d,
+ 0xd8,0xfa,0xef,0x3b,0x68,0x64,0x64,0x45,0x6f,0x3c,0x76,0x87,0xa8,0x98,0x8e,0x5b,
+ 0x40,0xa7,0x5b,0xec,0xd9,0x67,0xff,0xab,0x6d,0x7d,0xd3,0xdf,0x7e,0x39,0xda,0xef,
+ 0xc5,0xf3,0xdf,0xb5,0x5a,0xff,0xb5,0xb8,0xdb,0x42,0x2b,0x9f,0xd9,0xc6,0x5c,0x9b,
+ 0xe5,0xfc,0xd3,0x7f,0xfa,0xdf,0x4a,0xfd,0x4f,0xba,0xff,0x93,0x1e,0x80,0x7a,0x7b,
+ 0x28,0x42,0x2c,0xfc,0xe4,0xe7,0xe6,0x7b,0x97,0x3b,0xdf,0x65,0xbd,0xbb,0x84,0x7c,
+ 0x33,0x4c,0x02,0xd4,0x32,0x0a,0x80,0x59,0x75,0xae,0x2c,0xb3,0x67,0xb9,0x10,0x4d,
+ 0x79,0xfe,0xfc,0xf9,0xfa,0xc6,0xd5,0x69,0x8b,0xfd,0x87,0xe9,0x71,0x73,0x3d,0xfe,
+ 0xbf,0xd1,0x16,0x5a,0x01,0xe8,0x9a,0x10,0xc0,0x6b,0x0b,0xe8,0xec,0x4f,0x93,0x8c,
+ 0x1a,0x41,0x06,0x9f,0xc2,0xd2,0xc5,0x0b,0xd4,0xf4,0x77,0x27,0xea,0xca,0x7f,0xcb,
+ 0xd5,0x92,0x05,0xef,0x45,0xa9,0x7f,0xae,0xdc,0xff,0x7a,0xb8,0xff,0xb2,0x3c,0x40,
+ 0xcb,0x70,0xfe,0xe9,0x3f,0xfd,0x6f,0xa5,0xfe,0x4b,0xe0,0x9f,0x6d,0xe2,0x9f,0x7a,
+ 0x2b,0x00,0xa1,0x4a,0x4b,0xd6,0x69,0x80,0x4d,0x8f,0x4a,0xda,0xd0,0x42,0xd9,0x27,
+ 0xfe,0x69,0x49,0x05,0x20,0x76,0x3d,0x17,0x3d,0xdb,0x96,0xef,0x86,0x0b,0x8d,0xdc,
+ 0x97,0xca,0x7f,0x72,0x73,0xf4,0xec,0x33,0x44,0xd7,0xd0,0xef,0xaa,0x06,0x0e,0x19,
+ 0xa6,0x03,0x18,0x7b,0xa7,0xbb,0xef,0x7c,0x63,0xf4,0xb5,0xdf,0x29,0xc1,0xb3,0x09,
+ 0xbd,0x36,0xe1,0x51,0xb9,0xbd,0xd5,0xfc,0xd9,0x53,0xa2,0x1d,0x18,0x3a,0x74,0x68,
+ 0x14,0xf9,0x9f,0xf7,0x6c,0x65,0x79,0xbb,0x48,0xcb,0x72,0xfe,0xe9,0x3f,0xfd,0x6f,
+ 0xa5,0xfe,0x4f,0x9f,0x3e,0xdd,0xb9,0xbe,0x7a,0x06,0x02,0xfa,0x04,0x79,0x9a,0x27,
+ 0x20,0xad,0xef,0x69,0xa5,0x7f,0x7d,0xb5,0x02,0x6c,0xdb,0x47,0x01,0x28,0x40,0x01,
+ 0x88,0x2f,0x32,0xdf,0x0d,0x9a,0xa5,0x54,0xa7,0x4d,0x9b,0x4e,0xfb,0x3b,0x74,0xb6,
+ 0xac,0xb8,0x4e,0x76,0xf7,0x9e,0x7d,0xa2,0x8a,0x7f,0x3d,0x7b,0xeb,0xf2,0xc5,0x3a,
+ 0xf7,0x3f,0x7d,0xf6,0xbe,0xb5,0x25,0xfe,0xba,0x0a,0x42,0xb6,0x98,0x80,0x75,0xe4,
+ 0xbb,0x27,0xe9,0x20,0x5e,0x7e,0xd2,0x2b,0x4f,0xab,0xf7,0xa7,0x4f,0x56,0xcb,0x16,
+ 0xcf,0x56,0x8b,0xe6,0xbd,0x1b,0x0d,0xbd,0x48,0xea,0x5f,0x96,0xfe,0x87,0x96,0x52,
+ 0x0d,0x79,0x00,0x65,0x7d,0x40,0x97,0xe1,0xfc,0xd3,0x7f,0xfa,0xdf,0x2a,0xfd,0x17,
+ 0x4f,0xa6,0xb4,0x2c,0x6e,0xf9,0x7a,0x0f,0x09,0xf8,0xf2,0xf5,0xb3,0x0e,0x2b,0x84,
+ 0xf6,0x2b,0x6d,0xfb,0x28,0x00,0x39,0xd2,0xa3,0x47,0x8f,0xaa,0xdc,0x41,0x59,0x6b,
+ 0x79,0xe7,0x35,0x3b,0x97,0x14,0xc9,0x88,0x22,0x4b,0xf5,0xb6,0x3a,0x75,0xd6,0x1e,
+ 0x81,0x05,0x73,0xa2,0xf1,0xff,0x0f,0x17,0x0b,0xf3,0xd9,0x67,0x4e,0x0a,0xf0,0xcd,
+ 0x0e,0xe8,0xf1,0x30,0xc8,0x62,0x13,0x27,0x3c,0xa5,0x5e,0x79,0xe1,0x21,0x1d,0xf4,
+ 0xb7,0x40,0xcd,0x7e,0xe7,0xdf,0x51,0xca,0xdf,0xe8,0xd1,0xa3,0x9d,0x0f,0x8c,0x3c,
+ 0x8e,0x57,0x91,0x63,0x98,0x8d,0x3a,0xff,0xf4,0x9f,0xfe,0xb7,0x42,0xff,0xc5,0xba,
+ 0x7f,0xfb,0xed,0xb7,0x53,0xb7,0x29,0xcb,0x14,0x5d,0x10,0x28,0xab,0xf5,0x6e,0x5a,
+ 0xe3,0x36,0xcf,0x4a,0xa8,0x80,0x77,0x79,0x5d,0x6c,0xdb,0x60,0x08,0xa0,0xa0,0x31,
+ 0x1e,0x19,0x83,0x0e,0xd5,0xe6,0xb2,0xce,0xaf,0x9d,0xd7,0x85,0x98,0x44,0x6e,0x08,
+ 0xf9,0x6c,0xc5,0xd2,0x85,0xfa,0x55,0xa7,0xd1,0x2d,0x59,0xa4,0xa6,0x4e,0x7e,0x49,
+ 0x6d,0xbc,0xf9,0x0e,0xa5,0x4c,0x29,0x5a,0xb2,0x68,0xbe,0x7a,0xf1,0xe9,0x7b,0xd5,
+ 0xbb,0x6f,0xbf,0xa6,0xf7,0x79,0x81,0x9a,0x31,0xe5,0x99,0x48,0x55,0xd8,0x64,0x93,
+ 0x4d,0xd6,0xaa,0xbd,0x90,0xb7,0xcb,0xb1,0x1e,0x95,0xd2,0x1a,0x71,0xfe,0xe9,0x3f,
+ 0xfd,0x6f,0x85,0xfe,0xbf,0xf5,0xd6,0x5b,0xd1,0x34,0xe6,0x3e,0x05,0xa0,0x1e,0x32,
+ 0xc0,0xe6,0x09,0xb1,0xb9,0xf7,0x43,0xa6,0xf0,0xcd,0xea,0xaa,0x77,0x55,0x07,0x74,
+ 0x05,0x20,0xa2,0x00,0xe4,0x48,0x2c,0x4c,0x43,0x6e,0xa0,0xac,0x95,0xba,0x7c,0x17,
+ 0x5a,0xb5,0xeb,0x8f,0x85,0xe6,0xd2,0x45,0x73,0xd4,0xaa,0x15,0x8b,0xf5,0x0c,0x80,
+ 0x7d,0xd5,0x8b,0xcf,0xfc,0x43,0x2d,0x5e,0x32,0x5f,0x8d,0xd9,0x6c,0x3b,0xd5,0xa7,
+ 0xef,0x20,0x1d,0x1b,0xd0,0xc5,0x67,0xd3,0x67,0xf2,0x10,0xac,0x1b,0x54,0xb8,0xf6,
+ 0x12,0xe6,0xf2,0xcb,0x97,0x2e,0x56,0x73,0x67,0xcf,0x50,0xef,0xbc,0xf9,0x8a,0x56,
+ 0x4e,0x26,0x44,0x55,0xff,0x16,0xcc,0x9d,0xa6,0x66,0x4d,0x9d,0xa0,0xfb,0xd4,0x49,
+ 0x8d,0xd1,0xc2,0x5f,0xdc,0xff,0xb5,0x1c,0x5f,0x9f,0x45,0xe3,0x73,0x49,0x66,0x7d,
+ 0x80,0x96,0xe5,0xfc,0xd3,0x7f,0xfa,0xdf,0xec,0xfd,0x7f,0xff,0xfd,0xf7,0xa3,0xe6,
+ 0xa3,0x1e,0x0a,0x40,0x5a,0x6a,0x5e,0x9a,0x25,0x9e,0x56,0x1b,0x20,0xc4,0xe2,0xf7,
+ 0x29,0x6a,0xd5,0x2a,0x14,0x28,0x00,0x19,0xb5,0xbf,0x50,0x97,0x59,0x88,0x8b,0xad,
+ 0xd6,0xd9,0xbf,0x42,0xd2,0x74,0x64,0xcc,0x5c,0x02,0x67,0xe4,0xe6,0x78,0xef,0xad,
+ 0x7f,0xa9,0x91,0x9b,0x8f,0x8b,0x2a,0x01,0x4e,0x7e,0xf5,0x69,0x35,0x45,0xb7,0x10,
+ 0x17,0x7f,0xee,0xc7,0x31,0x45,0xbd,0x58,0xb6,0x78,0x9e,0x9a,0x39,0x6d,0x82,0x4e,
+ 0xf9,0x9b,0x15,0x29,0x2f,0x63,0xc6,0x8c,0x59,0x6b,0xd8,0x25,0x6b,0xff,0xb3,0x3c,
+ 0x70,0x92,0xaf,0x3e,0x0b,0xa6,0x59,0xce,0x3f,0xfd,0xa7,0xff,0xcd,0xdc,0x7f,0xc9,
+ 0xf9,0x7f,0xe3,0x8d,0x37,0x82,0xbd,0xae,0xf5,0xb2,0x80,0x6d,0x53,0xf9,0xfa,0x5c,
+ 0xff,0x2e,0x21,0x6f,0x2a,0x03,0x21,0x25,0xe6,0x43,0xb7,0x8f,0x02,0x50,0x80,0xf6,
+ 0x97,0xe5,0x22,0xc9,0xba,0x6c,0xde,0xb3,0x75,0x75,0xeb,0xd6,0x4d,0x0d,0x1f,0x3e,
+ 0x5c,0xbd,0xfb,0xee,0xbb,0x6a,0xf9,0x92,0x05,0xea,0xad,0x09,0x0f,0xa8,0xc1,0xc3,
+ 0xc7,0xaa,0x3e,0x03,0x87,0xa9,0x6e,0x3d,0x7a,0x47,0xe9,0x81,0x9d,0x12,0x82,0xb9,
+ 0x6e,0xca,0xd4,0x9a,0xd7,0x55,0x2b,0x57,0xa8,0x95,0x2b,0x96,0xa8,0xc5,0xf3,0x66,
+ 0x6a,0xab,0x7f,0xba,0x4e,0xf5,0x9b,0x1d,0xed,0xfb,0x06,0x1b,0x6c,0xa0,0x86,0x0d,
+ 0x1b,0x96,0x69,0x4c,0xaf,0xd6,0x34,0x25,0xdf,0xf8,0x69,0x33,0x9e,0x7f,0xfa,0x4f,
+ 0xff,0x9b,0xb5,0xff,0x92,0xc1,0xf4,0xec,0xb3,0xcf,0x66,0x9a,0x75,0xb5,0xe8,0x38,
+ 0x00,0x9b,0xf5,0xed,0x52,0xb6,0x7c,0xca,0x97,0x2b,0xe8,0x31,0x6b,0x31,0xa0,0x6a,
+ 0xb7,0x8f,0x02,0x90,0x91,0xb8,0xfa,0x94,0x2f,0x95,0xa3,0x1a,0x17,0x5c,0x91,0x48,
+ 0xea,0x5c,0xe4,0x01,0x78,0xef,0x3d,0x2d,0x70,0x97,0xab,0x99,0x53,0x5f,0x8e,0x5a,
+ 0x19,0x3d,0x2c,0x32,0xc3,0x9f,0x08,0x7f,0xa9,0xb7,0x50,0x86,0xfd,0xc9,0x62,0x21,
+ 0x95,0xf5,0xfc,0xd3,0x7f,0xfa,0xdf,0x6c,0xfd,0x97,0x5c,0xff,0xc7,0x1e,0x7b,0xcc,
+ 0x3a,0xe7,0x4a,0x23,0x15,0x00,0x97,0x80,0xcd,0x2a,0x6c,0x43,0xa7,0xfa,0xb5,0x29,
+ 0x1e,0x21,0xdb,0x27,0x0d,0xb0,0xa0,0x13,0x2e,0x81,0x28,0xc9,0x62,0x40,0xb5,0xb8,
+ 0xb8,0xaa,0xd1,0x3c,0xab,0x5d,0xdf,0x86,0x1b,0x6e,0x18,0x15,0xd0,0x91,0xaa,0x80,
+ 0x92,0x4a,0xb3,0x7c,0xf9,0xf2,0x86,0x5f,0x20,0xb2,0xff,0xe2,0xa1,0x90,0xe3,0x29,
+ 0xf3,0x2b,0xc8,0xfe,0xc9,0xdf,0x45,0xf4,0xbf,0x9a,0x3c,0x69,0xdf,0xf9,0x6d,0xa6,
+ 0xf3,0x4f,0xff,0xe9,0x7f,0xb3,0xf4,0x7f,0xf6,0xec,0xd9,0xea,0xc9,0x27,0x9f,0xec,
+ 0x78,0x3e,0x64,0x55,0x00,0xea,0x21,0xf4,0xd3,0xc6,0xe1,0xb3,0x0a,0x79,0x73,0xac,
+ 0xdf,0x15,0xdd,0x9f,0x65,0xfb,0xcc,0x05,0x50,0x10,0xe2,0x96,0x32,0xeb,0xd0,0x17,
+ 0xe5,0x92,0xcb,0x7b,0x7d,0xe2,0x4a,0xcb,0xe2,0x4e,0x6b,0x26,0x8b,0xa4,0x11,0xe7,
+ 0xa3,0xd9,0xce,0x3f,0xfd,0xa7,0xff,0x65,0xef,0xff,0x9b,0x6f,0xbe,0xa9,0xfe,0xf5,
+ 0xaf,0x7f,0x45,0xb1,0x0c,0x71,0xcd,0x8f,0x32,0x29,0x00,0x59,0xac,0x7f,0x57,0xc4,
+ 0xbe,0x4d,0x41,0xf0,0xa5,0x16,0x9a,0xeb,0x0c,0xdd,0x3e,0x0a,0x40,0xce,0xcc,0x9c,
+ 0x39,0x33,0x72,0xa9,0xe7,0x71,0x01,0x15,0x99,0x96,0x53,0xf6,0xd9,0xc1,0xe8,0x3f,
+ 0xfd,0xa7,0xff,0xf4,0x3f,0xde,0x3f,0xa9,0x57,0xf2,0xfc,0xf3,0xcf,0x77,0xe4,0xfa,
+ 0xf7,0xef,0xdf,0xbf,0xaa,0xaa,0x7e,0x45,0x07,0x02,0x86,0xd6,0xf9,0x4f,0xab,0x02,
+ 0xe8,0x52,0x24,0x42,0xbc,0x0d,0xbe,0xe5,0xcb,0x3e,0xac,0xd4,0xf4,0x0a,0x80,0x0c,
+ 0x01,0x48,0x4e,0xea,0x46,0x1b,0x6d,0x54,0x93,0x0b,0xce,0xa7,0x21,0xfb,0x2a,0x6b,
+ 0x85,0xdc,0xd0,0x59,0x34,0xf0,0xbc,0x67,0x07,0xa3,0xff,0xf4,0x9f,0xfe,0xd3,0xff,
+ 0x90,0xfe,0x8b,0xd5,0x3f,0x61,0xc2,0x84,0x8e,0xaa,0xa5,0x32,0xdb,0x6a,0x56,0xd7,
+ 0xbf,0xe9,0x05,0x28,0x2a,0x0e,0x20,0xad,0x5a,0x61,0xa8,0xf0,0xf7,0x05,0xf7,0xd9,
+ 0x82,0xfc,0xb2,0xec,0x5b,0x99,0x15,0x81,0x96,0x98,0x0e,0x78,0xd2,0xa4,0x49,0x51,
+ 0x6a,0x9a,0x44,0xd7,0x67,0x49,0xbb,0xa9,0xa5,0xd2,0x56,0xde,0x79,0xbf,0x21,0xeb,
+ 0x4f,0x4b,0x4b,0xaa,0x26,0xed,0x88,0xfe,0xd3,0x7f,0xfa,0x4f,0xff,0x63,0xa6,0x4e,
+ 0x9d,0xaa,0x5e,0x79,0xe5,0x15,0xb5,0x60,0xc1,0x82,0x8e,0xdf,0x49,0x3c,0x50,0xe8,
+ 0x10,0x6b,0x23,0x14,0x00,0x97,0xa5,0x6f,0xa6,0xf0,0xf9,0xdc,0xfb,0xa6,0x35,0x1f,
+ 0x5a,0xfb,0x3f,0xc4,0x53,0x54,0xe6,0x82,0x40,0x2d,0xa1,0x00,0xc8,0x81,0x7d,0xea,
+ 0xa9,0xa7,0xd4,0xa6,0x9b,0x6e,0xaa,0xb6,0xdc,0x72,0xcb,0xb5,0xaa,0x03,0x16,0x55,
+ 0x59,0x2b,0xab,0x46,0x5f,0x8d,0x8b,0xd0,0x67,0x81,0xd4,0xba,0x3c,0xfd,0xa7,0xff,
+ 0xf4,0xbf,0xbd,0xfb,0x2f,0x79,0xfd,0xd3,0xa6,0x4d,0x8b,0xac,0xfe,0xd8,0xe2,0x8f,
+ 0xbf,0x17,0xa3,0x4a,0xac,0xff,0x5a,0x69,0x44,0x1c,0x80,0x4b,0xd0,0xfb,0x52,0xf8,
+ 0xcc,0xf7,0x69,0x6e,0x7e,0xf3,0x5c,0xa7,0x4d,0x2d,0x4c,0x16,0x40,0x91,0x9d,0xd0,
+ 0x75,0xe9,0xe5,0x00,0x4f,0x9e,0x3c,0x39,0x1a,0x0e,0x18,0x31,0x62,0x44,0x94,0xba,
+ 0x26,0x91,0xec,0x12,0x64,0x27,0xdf,0x9b,0x13,0x06,0xf9,0x5c,0x78,0xb5,0xce,0xee,
+ 0x95,0xd5,0x65,0x97,0xb5,0xf2,0x57,0xc8,0xe4,0x23,0xb6,0x0b,0x92,0xfe,0xd3,0x7f,
+ 0xfa,0xdf,0x7e,0xfd,0x97,0x94,0x69,0x19,0x2e,0x95,0xa0,0x69,0xc9,0x3a,0x92,0xc8,
+ 0xfe,0x59,0xb3,0x66,0x59,0xa7,0xf2,0x15,0xc4,0x88,0x92,0xe7,0x67,0x1e,0x56,0x6b,
+ 0x91,0x0a,0x80,0xcf,0x0a,0x4f,0x73,0xdb,0xbb,0x84,0xbc,0x39,0x4f,0x40,0x88,0xc7,
+ 0xc1,0xa5,0x6c,0x51,0x09,0xb0,0x0e,0x24,0x2b,0xd3,0xc9,0x85,0x2e,0xae,0x2c,0x69,
+ 0x69,0x48,0x90,0x4b,0xb3,0xcd,0xdd,0x0c,0x00,0x50,0x34,0xe2,0xf6,0x8f,0x4b,0x7d,
+ 0xe7,0x25,0xa4,0xeb,0xed,0x02,0x0f,0x89,0xd6,0xcf,0xe2,0xe1,0xf1,0x79,0x03,0x5c,
+ 0x55,0x04,0x6d,0xde,0x88,0x32,0xd1,0xb9,0x15,0x2e,0x58,0xb1,0xf0,0xa5,0x55,0xeb,
+ 0xbe,0x03,0x00,0x68,0x77,0xe4,0x99,0x28,0x56,0xbf,0xb8,0xfd,0xf3,0x7e,0x3e,0x16,
+ 0xe5,0x05,0xb0,0x59,0xfa,0x36,0x41,0x1c,0x2a,0x7c,0xd3,0xf2,0xf7,0x4d,0x77,0xbe,
+ 0xcb,0xd3,0xd0,0x4c,0x33,0x02,0x76,0x6d,0x95,0x8b,0x57,0x2e,0xdc,0xb9,0x73,0xe7,
+ 0x86,0x6b,0x3e,0x6b,0xdc,0x65,0x65,0x4f,0xcf,0xa9,0x87,0xa6,0x4c,0xff,0xe9,0x3f,
+ 0xfd,0x6f,0xef,0xfe,0x4b,0x90,0x9e,0x3c,0x43,0xb3,0x1a,0x52,0x65,0xea,0x47,0x11,
+ 0xc7,0x25,0x2d,0xab,0xc0,0x17,0x27,0xd0,0x0c,0x1e,0xe6,0x96,0x51,0x00,0xc4,0x6d,
+ 0xb5,0x64,0xc9,0x92,0x68,0x9c,0x2b,0xcb,0x0d,0xdc,0x8c,0x25,0x41,0xf3,0xd6,0xa0,
+ 0xe9,0x3f,0xfd,0xa7,0xff,0xed,0xd9,0x7f,0x31,0x84,0x24,0xca,0x5f,0x4a,0xfc,0x36,
+ 0x63,0xbf,0x43,0x85,0xb1,0xeb,0x77,0xe6,0x6f,0x5c,0x53,0x08,0xdb,0xbc,0x0e,0x21,
+ 0xdb,0x27,0x06,0xa0,0x8e,0x48,0xe9,0x5a,0xf1,0x02,0x48,0x59,0xdd,0x90,0x1b,0x5f,
+ 0x2e,0xfe,0x7a,0x45,0xa8,0x02,0x00,0x94,0x49,0xf1,0x11,0xa3,0x49,0x04,0x7f,0x35,
+ 0x05,0x7e,0x5a,0xc9,0xfa,0xb7,0xd5,0x43,0xb0,0x05,0x17,0xc6,0xcb,0xa6,0x15,0x0f,
+ 0xaa,0x46,0x19,0x41,0x01,0xc8,0x51,0x9b,0x95,0xc9,0x6b,0x16,0x2d,0x5a,0x14,0x45,
+ 0xbb,0xfa,0x0e,0x7e,0x72,0x18,0x00,0x00,0xa0,0xd5,0x91,0x82,0x3e,0x12,0x34,0x2d,
+ 0xad,0x9e,0x16,0x7f,0xa3,0x95,0x0c,0x5b,0x8d,0x7f,0x9b,0x05,0x6f,0xab,0xb5,0x60,
+ 0x93,0x0f,0x69,0xf3,0x0d,0x84,0x28,0x19,0x28,0x00,0x05,0x6a,0xb6,0x12,0xc4,0x22,
+ 0x6e,0x2d,0x19,0x0e,0x90,0x26,0x11,0xff,0x92,0x1d,0x60,0x0a,0xfb,0xd8,0x0b,0x10,
+ 0xcf,0x2a,0x08,0x00,0xd0,0x2a,0xcf,0x41,0x79,0xb6,0xc9,0xd8,0xbe,0x34,0x19,0xdb,
+ 0x17,0xe1,0xdf,0x08,0x41,0xec,0xaa,0xbd,0x5f,0x94,0x27,0xc0,0x36,0x8d,0xaf,0x19,
+ 0x98,0x67,0xab,0x20,0x68,0xc6,0x84,0xf9,0x5c,0xff,0x3e,0x65,0x20,0x29,0xf8,0xa9,
+ 0x04,0xd8,0x00,0x6f,0x80,0xb8,0xb8,0x42,0xa6,0xb1,0x15,0x25,0xa1,0x0c,0x4a,0x00,
+ 0x9e,0x88,0xda,0x1e,0x32,0x00,0x50,0x3e,0xea,0x35,0x1d,0xb0,0xab,0x2c,0x70,0xd6,
+ 0x62,0x40,0xa1,0xf3,0x04,0x84,0x56,0x5b,0x34,0x15,0x13,0x14,0x80,0x92,0x21,0x45,
+ 0x2f,0x44,0x09,0x68,0x74,0x3c,0x00,0x42,0x0c,0x00,0x5a,0x8d,0x7a,0x64,0x16,0x98,
+ 0xc5,0x79,0x6c,0xd6,0xbe,0xcf,0x6a,0xcf,0x3a,0x76,0x5f,0xcd,0x24,0x44,0xa5,0x33,
+ 0x94,0xb9,0x3c,0xff,0x7f,0xd9,0x4b,0x04,0x30,0x00,0x40,0xbe,0xd6,0x7f,0xd1,0xc3,
+ 0x0e,0x3e,0xe1,0x9b,0x56,0xd7,0x3f,0x8b,0xd7,0xd5,0x54,0x10,0x6c,0x15,0x03,0x43,
+ 0x26,0x15,0x42,0x01,0x40,0x09,0x00,0x00,0x68,0x79,0x6a,0x99,0x45,0xb0,0x16,0x45,
+ 0xc0,0x25,0x90,0x6d,0xe3,0xfa,0x59,0x64,0x84,0xcd,0x9d,0xef,0x2a,0x0b,0x6c,0x2b,
+ 0x16,0x84,0x02,0x50,0x62,0x44,0x53,0x95,0xb4,0x98,0x7a,0x8d,0x59,0x01,0x00,0xb4,
+ 0x2a,0x32,0xb4,0x5a,0x0f,0xeb,0xdf,0xfc,0x3b,0x4b,0x66,0x57,0xe8,0x30,0x40,0xda,
+ 0xf8,0xbf,0xcd,0x33,0xd0,0x2c,0x85,0x81,0x50,0x00,0x2c,0x5a,0x9e,0x5c,0xb8,0xf5,
+ 0xd4,0x5c,0x01,0x00,0x5a,0x4d,0xf8,0xd7,0xab,0xaa,0xa0,0xcd,0xc2,0x4e,0xab,0xcb,
+ 0xef,0x5b,0x57,0x9a,0x65,0x6f,0xf3,0x2a,0xd8,0x26,0x9e,0x72,0x15,0x19,0x42,0x01,
+ 0x68,0x12,0x25,0x40,0x14,0x00,0xbc,0x01,0x00,0x00,0xd9,0x9e,0x9d,0x32,0x94,0x5a,
+ 0x6f,0xe1,0x9f,0x66,0xb1,0xbb,0x04,0x6f,0xda,0xef,0x92,0x56,0x7c,0x5a,0x6d,0x00,
+ 0xdb,0xf6,0x6d,0xe9,0xe6,0x65,0xf5,0x00,0x90,0x05,0x90,0xa6,0x1d,0x69,0xf7,0x95,
+ 0x5c,0xcc,0x92,0x1d,0xb0,0x62,0xc5,0x0a,0xea,0x05,0x00,0x00,0xb8,0x84,0xc9,0x9a,
+ 0x5a,0x03,0x8d,0x98,0xf5,0xcf,0x97,0x8b,0xef,0xb3,0xf6,0x6d,0xcb,0xb9,0xac,0xfc,
+ 0xb4,0x14,0x42,0xdb,0xbe,0x50,0x0a,0xb8,0x45,0x14,0x01,0x39,0x91,0xa2,0x04,0x88,
+ 0x42,0x20,0x8d,0x2a,0x82,0x00,0xd0,0xce,0xcf,0xc5,0x78,0x22,0x21,0x69,0x8d,0x74,
+ 0x71,0xbb,0xc6,0xdc,0x5d,0xe5,0x7c,0x6d,0x41,0x82,0xae,0xcf,0x42,0xc6,0xf4,0x5d,
+ 0x5e,0x84,0xb2,0x07,0x95,0xa3,0x00,0x64,0x40,0x4e,0x66,0xb3,0xce,0x96,0x05,0x00,
+ 0xd0,0x6e,0xcf,0x6b,0xd3,0xd2,0xaf,0x36,0x38,0x30,0x4d,0x11,0xf0,0x6d,0xbf,0xd4,
+ 0x4a,0x1c,0x97,0x09,0x00,0x00,0x34,0x2b,0xbe,0x68,0x7d,0xd3,0x22,0xf7,0x59,0xfa,
+ 0x66,0x2a,0x9f,0xb9,0xde,0x34,0xc1,0xee,0xdb,0x3e,0x1e,0x00,0x00,0x00,0x80,0x9c,
+ 0x2d,0x7d,0x9b,0x20,0x0e,0x89,0xea,0x77,0x09,0xe7,0xac,0x31,0x05,0xa1,0xdb,0xc7,
+ 0x03,0x00,0x00,0x00,0x90,0x93,0xf5,0x9f,0x56,0x74,0x27,0x99,0x9b,0x6f,0x2b,0x0c,
+ 0x14,0xa2,0x0c,0xa4,0x6d,0x37,0xf9,0x99,0x6b,0xd8,0xa1,0xac,0xf1,0x62,0x28,0x00,
+ 0x00,0x00,0xd0,0xb4,0xd6,0xbf,0xe9,0xda,0x37,0xdd,0xfa,0xb6,0xea,0x80,0xd5,0x5a,
+ 0xff,0xae,0xed,0xdb,0x84,0xbe,0x6b,0xfb,0x28,0x00,0x00,0x00,0x00,0x39,0x78,0x00,
+ 0xd2,0xea,0xfb,0x57,0x33,0x8e,0x6f,0xfb,0xde,0x5c,0x87,0x2d,0x8e,0x20,0xcb,0xf6,
+ 0x51,0x00,0x00,0x00,0x00,0x72,0xf2,0x04,0x24,0x05,0x72,0xfc,0xde,0x25,0xf4,0x43,
+ 0xac,0x7e,0xb3,0x18,0x90,0x29,0xd0,0x6b,0xd9,0x3e,0x0a,0x00,0x00,0x00,0x40,0x0e,
+ 0x5e,0x80,0x90,0x29,0x78,0x7d,0xae,0x7f,0xf3,0x37,0xf1,0xb0,0x82,0x2d,0x93,0xc0,
+ 0x8c,0x27,0xa8,0x66,0xfb,0x28,0x00,0x00,0x00,0x00,0x35,0x5a,0xfe,0xa6,0x80,0x0d,
+ 0x11,0xb6,0xb6,0x40,0x3d,0xdb,0xfb,0xa4,0x22,0x10,0x2a,0xe0,0x6b,0x99,0x75,0x10,
+ 0x05,0x00,0x00,0x00,0x20,0xc0,0xfa,0xaf,0x66,0xd9,0x34,0x21,0x6f,0xa6,0xee,0xa5,
+ 0xd5,0xf5,0x0f,0x4d,0xf7,0x23,0x0b,0x00,0x00,0x00,0xa0,0x81,0xde,0x82,0xa4,0xc0,
+ 0xb6,0x05,0xfa,0x99,0x63,0xfd,0xb6,0xb4,0x41,0x9b,0x65,0x1f,0xe2,0x7d,0x20,0x06,
+ 0x00,0x00,0x00,0xa0,0x20,0x0f,0x80,0xaf,0x3e,0xbf,0xf9,0xb7,0x2b,0xf0,0xaf,0xda,
+ 0x92,0xc1,0xcd,0x32,0x09,0x10,0x0a,0x00,0x00,0x00,0x34,0xbd,0x55,0x9f,0x14,0xb6,
+ 0x21,0x95,0xff,0x5c,0xb3,0xfa,0xb9,0xdc,0xf8,0xd5,0xd6,0xff,0x2f,0xf3,0x34,0xc0,
+ 0x28,0x00,0x00,0x00,0xd0,0x12,0x5e,0x00,0xdb,0xd8,0xbc,0x6b,0x7a,0x5e,0xd7,0xd4,
+ 0xbd,0x2e,0xeb,0xdd,0xe5,0xba,0x4f,0xfb,0x5d,0xda,0xf6,0xcb,0x04,0x73,0x01,0x00,
+ 0x00,0x40,0x4b,0x28,0x02,0xa6,0x35,0x6e,0xb3,0xf2,0x6d,0x82,0x39,0x4d,0x48,0x87,
+ 0x8e,0xe9,0xa7,0x05,0x0b,0x96,0x55,0x09,0xc0,0x03,0x00,0x00,0x00,0x4d,0x6d,0xfd,
+ 0xdb,0x22,0xf9,0x6d,0x9e,0x01,0x97,0xc0,0x4e,0xfb,0xde,0x37,0xce,0x6f,0xdb,0xbe,
+ 0xcb,0x33,0x81,0x02,0x00,0x00,0x00,0x50,0xa0,0x17,0x20,0x24,0x5a,0xdf,0x87,0x6b,
+ 0x62,0x9f,0x6a,0xbd,0x11,0x28,0x00,0x00,0x00,0x00,0x05,0x79,0x01,0x5c,0x02,0x3b,
+ 0x4d,0x70,0xfb,0xb2,0x05,0x5c,0xf5,0x02,0x4c,0xeb,0xdf,0xac,0x08,0x58,0xf6,0x79,
+ 0x00,0x50,0x00,0x00,0x00,0xa0,0x69,0xc9,0xc3,0xc5,0x9e,0x56,0xb8,0xc7,0x9c,0x65,
+ 0x30,0xa9,0x08,0xa4,0x59,0xfc,0x65,0x16,0xfa,0x28,0x00,0x00,0x00,0xd0,0x32,0xd6,
+ 0x7f,0x88,0xe0,0x75,0x45,0xeb,0x9b,0x02,0xdf,0x96,0x36,0x98,0x6c,0xbe,0xb2,0xc0,
+ 0xcd,0x20,0xf8,0x51,0x00,0x00,0x00,0xa0,0x25,0x94,0x80,0x90,0xcf,0x6c,0x96,0xbe,
+ 0x19,0xc0,0x97,0xfc,0xcc,0x14,0xf0,0x2e,0x6f,0x43,0xd9,0x67,0xfc,0x4b,0x83,0x34,
+ 0x40,0x00,0x00,0x68,0x29,0x5c,0x65,0x7e,0xb3,0xa4,0x00,0xba,0xea,0xfe,0xa7,0xfd,
+ 0x26,0xcd,0xfb,0x40,0x29,0x60,0x00,0x00,0x80,0x82,0x3c,0x01,0xae,0x09,0x7f,0x6c,
+ 0x11,0xfd,0xbe,0xf7,0x69,0x25,0x81,0x43,0x84,0xbf,0x6d,0xfb,0x78,0x00,0x00,0x00,
+ 0x00,0x72,0x14,0xfc,0xb6,0xc9,0x7d,0x5c,0xc5,0x78,0x7c,0x9e,0x00,0x73,0x19,0xdf,
+ 0x76,0x5d,0x5e,0x87,0xb4,0x32,0xc5,0x78,0x00,0x00,0x00,0x00,0x6a,0x24,0x29,0xb8,
+ 0x4d,0xcb,0xdb,0x57,0xa0,0xc7,0x65,0xc1,0x87,0x04,0xf2,0xb9,0xea,0x03,0xf8,0xb6,
+ 0x8f,0x02,0x00,0x00,0x00,0x90,0xb3,0x07,0xc0,0xac,0xbe,0x67,0x9b,0x07,0x20,0x29,
+ 0xb0,0xb3,0x08,0x65,0x9f,0x90,0x77,0x79,0x05,0x98,0x0c,0x08,0x00,0x00,0xa0,0x0e,
+ 0x8a,0x40,0x9a,0xa0,0xaf,0xa5,0x42,0x9f,0xab,0xd8,0x90,0x4d,0xf8,0xdb,0xbc,0x12,
+ 0x0c,0x01,0x00,0x00,0x00,0xe4,0x28,0xf4,0xcd,0xbf,0xcd,0xe0,0xbd,0x34,0xc1,0xbb,
+ 0x7a,0xf5,0xea,0x54,0x2b,0x3f,0x6d,0x3b,0xa6,0x90,0xf7,0x6d,0x9f,0x21,0x00,0x00,
+ 0x00,0x80,0x1c,0xb1,0x15,0xef,0x09,0xad,0xdf,0xef,0x0a,0xdc,0x73,0x59,0xf6,0xa6,
+ 0xf0,0xcf,0xb2,0x7d,0x3c,0x00,0x00,0x00,0x00,0x39,0x0b,0x7f,0x9f,0xc5,0x9e,0xe6,
+ 0x3d,0x70,0x55,0x08,0x74,0xd5,0x09,0x70,0x65,0x11,0xb8,0xb6,0x8f,0x07,0x00,0x00,
+ 0x00,0x20,0x67,0xf2,0x9c,0x03,0xc0,0x16,0x1f,0xe0,0x9a,0xf4,0xc7,0xa6,0x08,0x84,
+ 0xae,0x17,0x05,0x00,0x00,0x00,0xa0,0x0e,0xca,0x81,0xab,0x74,0xaf,0x4d,0xb8,0x9b,
+ 0x82,0x3e,0xcd,0x7a,0xf7,0xc5,0x0b,0x94,0x7d,0x26,0x40,0x14,0x00,0x00,0x00,0x68,
+ 0x49,0x6c,0xd5,0xff,0x42,0x83,0x03,0x5d,0xd9,0x02,0x59,0x84,0xb9,0x6d,0xfb,0x65,
+ 0x83,0x4a,0x80,0x00,0x00,0xd0,0xd4,0x96,0x7e,0x5a,0xc0,0x5e,0x9a,0x20,0xb7,0xb9,
+ 0xf6,0x93,0xcb,0x66,0xb5,0xe2,0x5d,0xdb,0x2f,0x6b,0x3d,0x00,0x14,0x00,0x00,0x00,
+ 0x68,0x7a,0x4b,0xdf,0x66,0xc1,0xbb,0xa6,0xf7,0x35,0x05,0xb2,0x2d,0xc8,0xaf,0x16,
+ 0x81,0x1d,0x12,0x1b,0x50,0x06,0x18,0x02,0x00,0x00,0x80,0xa6,0xb5,0xfe,0xe3,0xd7,
+ 0xb4,0xa2,0x3b,0xc9,0xfc,0x7c,0x5f,0x59,0xe0,0x6a,0x32,0x08,0x6c,0xf1,0x04,0xb6,
+ 0x6d,0xa3,0x00,0x00,0x00,0x00,0xe4,0x64,0xfd,0x27,0x03,0xf8,0xd2,0xea,0xfe,0xbb,
+ 0xc6,0xf1,0xb3,0x4c,0xeb,0xeb,0xdb,0xbe,0xf9,0x99,0x6d,0xfb,0x65,0x82,0x21,0x00,
+ 0x00,0x00,0x68,0x5a,0x0f,0x80,0x2f,0x35,0xcf,0x36,0x8e,0xef,0x1b,0x93,0xf7,0x8d,
+ 0xe3,0xbb,0xe6,0x1b,0x48,0xab,0x19,0x80,0x07,0x00,0x00,0x00,0xa0,0x00,0x4f,0x80,
+ 0x69,0xf1,0xa7,0xb9,0xdd,0x5d,0x56,0xbf,0xad,0xac,0xaf,0x69,0xdd,0x57,0xbb,0x7d,
+ 0x3c,0x00,0x00,0x00,0x00,0x39,0x7b,0x01,0x92,0xd6,0x76,0xb5,0x11,0xfb,0xae,0xb2,
+ 0xc0,0xbe,0x8c,0x01,0xdb,0xf6,0x6d,0x1e,0x06,0x3c,0x00,0x00,0x00,0x00,0x39,0x5b,
+ 0xfe,0x69,0x56,0x7d,0xe8,0x6f,0x5d,0x01,0x85,0x49,0xe1,0x6e,0x2a,0x0e,0xae,0xed,
+ 0x97,0xb9,0xf8,0x0f,0x0a,0x00,0x00,0x00,0xb4,0x8c,0xf5,0x9f,0x26,0xe4,0x5d,0xb5,
+ 0xfa,0x4d,0x81,0xee,0x9b,0xd4,0xc7,0xe6,0x15,0xc8,0x32,0xd1,0x0f,0x1e,0x00,0x00,
+ 0x00,0x80,0x06,0x78,0x09,0x5c,0xb5,0xfb,0x93,0x02,0xda,0x5c,0x36,0xb4,0xac,0x6f,
+ 0x88,0x70,0xa7,0x0e,0x00,0x00,0x00,0x40,0x41,0x1e,0x00,0x5f,0x7d,0x7e,0x53,0xd8,
+ 0xdb,0x3e,0xcf,0x12,0xbc,0x57,0xed,0xf6,0x51,0x00,0x00,0x00,0x00,0x72,0xb0,0xee,
+ 0xd3,0x2a,0xef,0xf9,0x2a,0x01,0xfa,0x5c,0xff,0xa1,0x71,0x04,0xa1,0xdb,0x47,0x01,
+ 0x00,0x00,0x00,0xc8,0xc9,0x0b,0x60,0x1b,0x9b,0x0f,0xc9,0xcd,0x4f,0x8b,0x11,0xf0,
+ 0x79,0x00,0xd2,0x7e,0x97,0xb6,0xfd,0x32,0x41,0x1a,0x20,0x00,0x00,0xb4,0x84,0x22,
+ 0x60,0x5a,0xe3,0x69,0x82,0x3e,0xad,0x80,0x4f,0xda,0x7a,0x5d,0x8a,0x81,0x4d,0x69,
+ 0x28,0xbb,0x12,0x80,0x07,0x00,0x00,0x00,0x9a,0xda,0xfa,0xb7,0x45,0xf2,0xdb,0x3c,
+ 0x03,0x59,0xd2,0xf6,0x5c,0x81,0x7f,0xe6,0xef,0x6c,0xdb,0x77,0x79,0x26,0x50,0x00,
+ 0x00,0x00,0x00,0x0a,0xf4,0x02,0xf8,0xa6,0x01,0x0e,0xc1,0x97,0xeb,0x5f,0xcd,0xf6,
+ 0xcb,0x06,0x43,0x00,0x00,0x00,0xd0,0x12,0x5e,0x80,0x50,0x81,0x6c,0xfb,0xbd,0xf9,
+ 0x3e,0x44,0x91,0xb0,0x55,0x07,0xb4,0x7d,0x46,0x0c,0x00,0x00,0x00,0x40,0x8e,0xd8,
+ 0xca,0xff,0x66,0x1d,0x6f,0x77,0xd5,0x04,0x48,0xfb,0xce,0x55,0x0e,0xd8,0xb6,0x8e,
+ 0x32,0xc3,0x10,0x00,0x00,0x00,0x34,0xb5,0xf5,0x1f,0x22,0x78,0x5d,0xd1,0xfa,0xf1,
+ 0xab,0x2d,0x76,0x20,0xf9,0x9d,0xad,0xce,0x7f,0xb5,0xdb,0x47,0x01,0x00,0x00,0x00,
+ 0xc8,0x41,0x09,0x08,0xf9,0xcc,0x66,0xcd,0x9b,0x01,0x7c,0xa6,0x07,0xc1,0x56,0xf7,
+ 0x3f,0x2d,0x28,0x30,0x6d,0xac,0x9f,0xd9,0x00,0x01,0x00,0x00,0x0a,0xc6,0x66,0x95,
+ 0xbb,0xd2,0xfe,0x5c,0x43,0x06,0xae,0xba,0xff,0x59,0x95,0x11,0x97,0xa7,0x00,0x05,
+ 0x20,0xc1,0xca,0x95,0x2b,0xb9,0x6a,0x01,0x00,0x20,0x98,0xb9,0x73,0xe7,0x46,0xaf,
+ 0x83,0x06,0x0d,0x4a,0x2d,0xfc,0x63,0x5a,0xfc,0x21,0xef,0xb3,0xba,0xec,0x5d,0x01,
+ 0x84,0x49,0xef,0x02,0x0a,0x00,0x00,0x00,0x40,0x81,0x56,0x7f,0x5a,0xbe,0xbf,0x2b,
+ 0x80,0x2f,0x29,0xf8,0x43,0x02,0x09,0x6d,0x35,0x00,0xd2,0x3c,0x08,0x4c,0x06,0x04,
+ 0x00,0x00,0x90,0x33,0xe6,0xcc,0x7d,0x69,0x55,0xff,0x6c,0xe3,0xfa,0x36,0x45,0x21,
+ 0x54,0xe1,0xb0,0x29,0x14,0xae,0xa9,0x86,0x51,0x00,0x00,0x00,0x00,0x72,0xb6,0xfe,
+ 0x6d,0xd5,0xff,0x7c,0x56,0x79,0x16,0xa1,0xec,0x13,0xf2,0xb6,0x6d,0x96,0x79,0x1e,
+ 0x00,0xa1,0x34,0x43,0x00,0x5d,0xbb,0x32,0x1a,0x01,0x00,0x00,0xe1,0xf4,0xeb,0xd7,
+ 0x6f,0x1d,0x41,0x9c,0x7c,0xb5,0xa5,0xfb,0xd5,0xa2,0x64,0xa4,0x59,0xf4,0xb6,0xed,
+ 0x9b,0xdf,0xe1,0x01,0x00,0x00,0x00,0xc8,0x01,0x57,0x4a,0x5e,0x68,0x6a,0x9e,0xaf,
+ 0xce,0x7f,0xda,0x72,0x2e,0x25,0xc0,0xb5,0x7d,0x86,0x00,0x00,0x00,0x00,0x72,0xc4,
+ 0x56,0xbc,0x27,0xb4,0x7e,0x7f,0x5a,0xa0,0x9e,0x19,0x14,0xe8,0x12,0xfe,0xa1,0xdb,
+ 0x27,0x0d,0x10,0x00,0x00,0xa0,0x00,0x2f,0x40,0x48,0x10,0x9f,0x4f,0x78,0xdb,0xbe,
+ 0xb7,0x59,0xf4,0x69,0xd3,0x0c,0xbb,0xb6,0x5f,0x46,0x0f,0x00,0x0a,0x00,0x00,0x00,
+ 0xb4,0x8d,0xb7,0xc0,0x65,0x8d,0xdb,0x26,0xfe,0x09,0x99,0xf4,0xa7,0x99,0x61,0x08,
+ 0x00,0x00,0x00,0x9a,0xda,0xfa,0xf7,0x79,0x06,0x5c,0xf3,0x00,0xd8,0x72,0xf9,0xf3,
+ 0x9a,0xec,0xa7,0xec,0x33,0x01,0xa2,0x00,0x00,0x00,0x40,0xd3,0x5b,0xf4,0x3e,0x6b,
+ 0xdf,0xe5,0xca,0xf7,0x09,0x6f,0xdf,0x3c,0x00,0xd5,0x7a,0x1b,0xca,0x02,0x43,0x00,
+ 0x00,0x00,0xd0,0xd4,0x5e,0x00,0x57,0x1e,0xbe,0xcd,0xad,0x6f,0x0a,0xf8,0xb4,0xca,
+ 0x7f,0x69,0x56,0xbc,0x6b,0x26,0xc0,0xd0,0x00,0x44,0x14,0x00,0x00,0x00,0x80,0x9c,
+ 0xbd,0x00,0x69,0x11,0xfa,0x79,0x05,0xe8,0x85,0x7a,0x10,0xca,0x5a,0x03,0x40,0x60,
+ 0x08,0x00,0x00,0x00,0x9a,0xd6,0xfa,0x8f,0x5f,0x6d,0x95,0xf9,0x92,0xcb,0xa5,0xa5,
+ 0xf4,0xd5,0xb2,0xdd,0xe4,0xfa,0x5d,0x02,0xbf,0x9a,0xc9,0x85,0x50,0x00,0x00,0x00,
+ 0x00,0x52,0xac,0x70,0x73,0xd6,0x3d,0x5f,0xdd,0xff,0xb4,0xe2,0x3f,0x59,0x3d,0x02,
+ 0xb6,0xc9,0x80,0x42,0xe6,0x1d,0x28,0x0b,0x0c,0x01,0x00,0x00,0x40,0xd3,0x7a,0x00,
+ 0x5c,0xd3,0xf7,0xd6,0x52,0xf7,0xdf,0x55,0xc8,0x27,0xeb,0xfb,0x6a,0xb7,0x8f,0x07,
+ 0x00,0x00,0x00,0x20,0xa3,0xc0,0x4e,0x0a,0xee,0xac,0x93,0xfd,0xd8,0x26,0xfc,0x31,
+ 0xad,0x7b,0xdb,0x36,0x6d,0x41,0x88,0x65,0x75,0xfb,0xe3,0x01,0x00,0x00,0x80,0x96,
+ 0xf1,0x02,0x98,0xd6,0x77,0x16,0xef,0x81,0x4b,0x89,0x08,0xcd,0x18,0x30,0xbf,0x6f,
+ 0xa6,0xe2,0x40,0x78,0x00,0x00,0x00,0xa0,0x65,0x14,0x01,0xdf,0x67,0x36,0x81,0x6f,
+ 0x06,0x11,0x9a,0x6e,0xfb,0x90,0x71,0xfd,0x66,0xac,0x0a,0x88,0x02,0x00,0x00,0x00,
+ 0x2d,0x49,0x5a,0xad,0x7e,0x53,0xa0,0xbb,0xe6,0x05,0x48,0xf3,0x0a,0x64,0xf5,0x38,
+ 0xa0,0x00,0x00,0x00,0x00,0xd4,0x51,0x09,0x30,0x95,0x01,0x57,0x9a,0x9e,0x2b,0x63,
+ 0xa0,0xd6,0x40,0xbe,0xb2,0xd6,0x02,0x40,0x01,0x00,0x00,0x80,0xa6,0xc4,0x96,0xd2,
+ 0x17,0x32,0x3b,0x5f,0xda,0xac,0x7f,0x59,0xc6,0xf1,0xd3,0x52,0x0a,0xcd,0x7d,0x59,
+ 0xbd,0x7a,0x35,0x0a,0x00,0x00,0x00,0x40,0x9e,0xd6,0xbd,0x59,0x0b,0x20,0x69,0xf1,
+ 0xbb,0x8a,0xff,0xa4,0x55,0xeb,0x0b,0xb5,0xd6,0x7d,0xb3,0x0a,0x96,0x55,0xf0,0xc7,
+ 0x90,0x05,0x00,0x00,0x00,0x4d,0xed,0x05,0x30,0xc7,0xed,0x5d,0xb9,0xf8,0x49,0x81,
+ 0x6f,0xbe,0xf7,0xcd,0xfe,0xe7,0xda,0xae,0xf9,0x3b,0xf9,0x4c,0x84,0x7e,0x72,0xbf,
+ 0xe4,0x6f,0x0a,0x01,0x01,0x00,0x00,0x14,0xa4,0x08,0x98,0xd6,0x79,0x9a,0xa0,0x77,
+ 0x7d,0x1f,0xba,0x1d,0xd3,0xc3,0x60,0x1b,0x3a,0xc8,0xaa,0x54,0xd4,0x1b,0x86,0x00,
+ 0x00,0x00,0xa0,0xa9,0xad,0x7f,0x57,0xae,0xbe,0x6d,0x88,0x20,0x54,0x38,0x9b,0x69,
+ 0x81,0xa6,0x02,0x21,0x56,0x7d,0xec,0xde,0x4f,0xfe,0x3e,0xb6,0xfe,0xe3,0xd7,0xac,
+ 0x71,0x05,0x78,0x00,0x00,0x00,0x00,0x32,0xe0,0x72,0xe7,0xa7,0x79,0x09,0x42,0xbd,
+ 0x09,0xa6,0x70,0x37,0x97,0x35,0x15,0x11,0x9b,0x72,0x81,0x02,0x00,0x00,0x00,0x50,
+ 0xa0,0x17,0x20,0x54,0xe0,0x9b,0x9e,0x02,0x9b,0x17,0x21,0x19,0xc0,0xe7,0x2b,0xf3,
+ 0x6b,0xfb,0xcc,0xfc,0x3d,0x0a,0x00,0x00,0x00,0x40,0x8e,0x56,0x7f,0x35,0xc2,0xd5,
+ 0x36,0x1c,0x60,0x9b,0xde,0xd7,0xf6,0xb9,0x4b,0xc9,0x30,0xe3,0x01,0x5c,0xd3,0x03,
+ 0xa3,0x00,0x00,0x00,0x00,0xd4,0x68,0xfd,0x67,0xf5,0x10,0xd8,0xca,0xfa,0x26,0x05,
+ 0xb6,0x39,0xae,0x9f,0x65,0xfa,0x60,0xd7,0x70,0x40,0x59,0x63,0x00,0x08,0x02,0x04,
+ 0x00,0x80,0x96,0x55,0x0c,0x4c,0x37,0xbf,0x29,0x8c,0x6d,0x6e,0xfa,0xb4,0x57,0x73,
+ 0x1d,0xb6,0xb8,0x00,0x5b,0x70,0x20,0x1e,0x00,0x00,0x00,0x80,0x3a,0x92,0x14,0xc6,
+ 0xa6,0x85,0x1e,0xe7,0xe7,0xbb,0x2c,0x74,0xd7,0x04,0x41,0xb6,0xdf,0xd8,0x0a,0xfe,
+ 0x94,0x3d,0x0d,0x10,0x05,0x00,0x00,0x00,0x5a,0xc6,0xea,0x4f,0x13,0xe8,0x66,0x60,
+ 0x9f,0xcd,0xca,0x77,0x09,0x6f,0x5b,0x51,0xa1,0xd0,0x54,0x42,0x3c,0x00,0x00,0x00,
+ 0x00,0x05,0x08,0xfd,0x50,0x21,0xec,0x9b,0xdc,0xc7,0x55,0x4f,0x20,0x2d,0x66,0xc0,
+ 0x37,0xe7,0x00,0x0a,0x00,0x00,0x00,0x40,0x81,0x4a,0x80,0x2b,0x75,0xcf,0xb6,0x7c,
+ 0x68,0xce,0x7e,0xb2,0x84,0xaf,0x6b,0x38,0xc0,0xa5,0x00,0x54,0x5b,0x69,0x10,0x05,
+ 0x00,0x00,0x00,0x20,0x40,0xf8,0xbb,0xd2,0xf5,0xd2,0x84,0x72,0x9a,0x7b,0xdf,0x14,
+ 0xd6,0xc9,0x18,0x02,0xd7,0x30,0x40,0x9a,0x27,0x20,0xa9,0x4c,0xa0,0x00,0x00,0x00,
+ 0x00,0xe4,0x6c,0xfd,0x87,0x4c,0xff,0xeb,0xf2,0x0e,0xd8,0x4a,0xfd,0xfa,0xaa,0xf9,
+ 0xd9,0x3c,0x09,0xc9,0xbf,0xcb,0x5e,0x04,0x08,0x05,0x00,0x00,0x00,0x9a,0x16,0x9b,
+ 0x8b,0x3e,0x8b,0xd5,0x6f,0xce,0xd2,0x17,0x32,0x9e,0x9f,0xfc,0x9d,0x99,0x02,0x98,
+ 0x26,0xf4,0x19,0x02,0x00,0x00,0x00,0x28,0xc0,0x0b,0xe0,0x12,0xba,0x3e,0xd7,0xbc,
+ 0xed,0x33,0x9b,0x52,0xe1,0xf2,0x14,0x84,0x2a,0x22,0x9f,0xf9,0xcc,0x67,0x50,0x00,
+ 0x00,0x00,0x00,0x8a,0x52,0x00,0x92,0xae,0xfe,0x58,0x28,0x27,0xf3,0xfd,0x43,0x14,
+ 0x88,0xb4,0xd8,0x02,0x73,0xfd,0xbe,0xcc,0x02,0xe1,0xd8,0x63,0x8f,0x55,0xbb,0xec,
+ 0xb2,0x4b,0xe9,0x8e,0x1d,0x95,0x00,0x01,0x00,0xa0,0x69,0x85,0xbf,0x59,0x91,0xcf,
+ 0x35,0x69,0x8f,0x2f,0x8a,0xdf,0x35,0xe5,0x6f,0x48,0x6c,0x80,0x6b,0x5d,0xf2,0xfb,
+ 0xa3,0x8f,0x3e,0x5a,0x7d,0xf4,0xa3,0x1f,0x2d,0xe5,0x7c,0x00,0x78,0x00,0x00,0x00,
+ 0xa0,0x29,0xb1,0x59,0xf6,0xc9,0xf1,0x79,0xd3,0x82,0x77,0x59,0xec,0x49,0xa5,0xc1,
+ 0x5c,0xa7,0xf9,0x77,0x9a,0x17,0x21,0xb9,0x5d,0xf9,0xec,0xa8,0xa3,0x8e,0x52,0xdb,
+ 0x6c,0xb3,0x4d,0xc7,0x72,0xf2,0x79,0xdc,0x92,0xc4,0x7f,0xd7,0x5b,0x49,0x40,0x01,
+ 0x00,0x00,0x80,0x96,0xf0,0x02,0xb8,0x2c,0xf3,0xe4,0x72,0x69,0x69,0x83,0xbe,0x39,
+ 0x00,0x6c,0xdb,0x76,0xcd,0x35,0xb0,0xf7,0xde,0x7b,0xab,0x2d,0xb7,0xdc,0x32,0x55,
+ 0xe8,0xa7,0x29,0x03,0x28,0x00,0x00,0x00,0x00,0x29,0xc2,0xdf,0xf6,0x3e,0xe9,0x0d,
+ 0x30,0xbf,0xb3,0xcd,0xfe,0x67,0xce,0x0d,0x90,0xb6,0x7e,0x33,0x06,0x20,0x7e,0x9f,
+ 0xcc,0x00,0x18,0x31,0x62,0x84,0xda,0x75,0xd7,0x5d,0xd7,0x12,0xf2,0x66,0x33,0x49,
+ 0x7e,0x56,0x2f,0x25,0x00,0x05,0x00,0x00,0x00,0x5a,0x46,0x09,0x48,0x2b,0xd5,0x6b,
+ 0x0a,0xea,0x90,0x71,0x7d,0x53,0x20,0x27,0x87,0x18,0x5c,0xeb,0x91,0x71,0xff,0xce,
+ 0x9d,0x3b,0xa7,0x2a,0x00,0x3e,0x85,0xa0,0x1e,0x10,0x04,0x08,0x00,0x00,0x4d,0x89,
+ 0x6d,0xa6,0x3f,0xdb,0x67,0xf1,0xe7,0xb6,0x80,0x41,0x73,0x7a,0x5f,0xdb,0xdf,0xb2,
+ 0x7c,0xdc,0x92,0xdb,0x35,0xd7,0x33,0x7f,0xfe,0x7c,0x75,0xf2,0xc9,0x27,0xab,0xae,
+ 0x5d,0xbb,0x5a,0x85,0xbc,0x4d,0x29,0x68,0x24,0x0d,0x57,0x00,0xe4,0x40,0x01,0x00,
+ 0x00,0x54,0x23,0xfc,0xcd,0x62,0x3c,0xa6,0x62,0x60,0xbe,0xda,0x04,0xbd,0x2b,0x86,
+ 0xc0,0x35,0xee,0x6f,0xcb,0x3e,0x98,0x33,0x67,0x8e,0xfa,0xc2,0x17,0xbe,0xa0,0xfa,
+ 0xf4,0xe9,0xd3,0x21,0xec,0xcd,0xe6,0x52,0x02,0x1a,0xa5,0x10,0x34,0x5c,0x01,0xe8,
+ 0xdb,0xb7,0x2f,0x57,0x32,0x00,0x00,0x64,0x56,0x00,0x92,0x6e,0xf8,0xa4,0x35,0xee,
+ 0xb2,0xe4,0xd3,0xd2,0xfe,0xe2,0xdf,0xbb,0xbc,0x0a,0xa6,0x17,0x21,0xf9,0xfb,0xd9,
+ 0xb3,0x67,0x47,0x85,0x7e,0x86,0x0f,0x1f,0x1e,0x09,0xf8,0x2e,0x5d,0xba,0x74,0xbc,
+ 0xc6,0xcd,0x54,0x02,0x4c,0x45,0x20,0xa6,0x9e,0x19,0x01,0x0d,0x57,0x00,0x7a,0xf5,
+ 0xea,0xc5,0x95,0x0c,0x00,0x00,0x99,0x58,0xb5,0x6a,0x95,0xd5,0x92,0x77,0xb5,0xa4,
+ 0x05,0x6f,0x0a,0x79,0xdb,0xe7,0xb1,0x82,0xe1,0xab,0x06,0x28,0x96,0xbf,0x14,0xfa,
+ 0xd9,0x78,0xe3,0x8d,0xd7,0x11,0xfe,0x49,0xeb,0xdf,0x54,0x06,0x4c,0xe1,0xdf,0x96,
+ 0x1e,0x80,0x81,0x03,0x07,0x72,0x25,0x03,0x00,0x40,0x4d,0x0a,0x40,0x88,0x32,0x60,
+ 0x0a,0x78,0xf3,0xf7,0x69,0x7f,0xdb,0x94,0x85,0x79,0xf3,0xe6,0xa9,0xcf,0x7f,0xfe,
+ 0xf3,0x6a,0xec,0xd8,0xb1,0xeb,0x08,0x79,0x69,0x32,0xc4,0x2d,0xcd,0xf4,0x02,0x98,
+ 0xc3,0x02,0x8d,0x8a,0x07,0x68,0xb8,0x02,0xb0,0xe1,0x86,0x1b,0x72,0x25,0x03,0x00,
+ 0x40,0x26,0x42,0x2c,0xfe,0xb4,0x21,0x80,0xf8,0x33,0xc1,0x15,0x14,0x98,0xf6,0xfb,
+ 0xa5,0x4b,0x97,0xaa,0x2f,0x7d,0xe9,0x4b,0x6b,0xb9,0xfd,0x5d,0x82,0x3f,0xf9,0xde,
+ 0x36,0x1c,0x60,0xba,0xfd,0xdb,0x26,0x0d,0x70,0x83,0x0d,0x36,0xe0,0x4a,0x06,0x00,
+ 0x80,0x4c,0xd6,0x7f,0xf7,0xee,0xdd,0xd7,0x49,0xf7,0x33,0x0b,0xf3,0x98,0x42,0xde,
+ 0x95,0xef,0x9f,0x5c,0xce,0xf5,0x3e,0xb9,0x1e,0x09,0xf4,0x93,0x80,0xbf,0x1e,0x3d,
+ 0x7a,0x58,0x05,0xbf,0xad,0xb9,0xbc,0x00,0xb6,0xa1,0x80,0x7a,0xd1,0x70,0x05,0x60,
+ 0xe8,0xd0,0xa1,0x5c,0xcd,0x00,0x00,0x10,0x2c,0xfc,0x63,0x8b,0x3d,0x6d,0x32,0x9e,
+ 0x90,0x7c,0x7f,0x73,0xaa,0x60,0x57,0xc9,0xdf,0xe4,0x3a,0xb7,0xda,0x6a,0x2b,0xb5,
+ 0xe7,0x9e,0x7b,0xae,0x35,0xd6,0xef,0x12,0xfa,0xdd,0xba,0x75,0xf3,0x2a,0x02,0x8d,
+ 0xcc,0x02,0x28,0x85,0x07,0x40,0x0e,0x46,0x3c,0x9e,0x03,0x00,0x00,0x90,0x26,0xfc,
+ 0x93,0xc5,0x78,0x42,0xa6,0xe5,0xf5,0x59,0xf5,0xf1,0x7b,0x9b,0x17,0x21,0xb9,0xcc,
+ 0xc1,0x07,0x1f,0xac,0x46,0x8f,0x1e,0x6d,0xb5,0xf8,0x45,0xd8,0xbb,0x9a,0x29,0xfc,
+ 0x93,0x81,0x80,0x49,0x45,0xa0,0xde,0xd4,0x25,0x06,0xc0,0xd5,0x31,0xf9,0x5c,0x0e,
+ 0x8e,0xd4,0x4b,0x06,0x00,0x00,0x48,0x13,0xfe,0x2b,0x57,0xae,0xb4,0x96,0xf7,0x75,
+ 0xa5,0xe7,0xb9,0xc6,0xf1,0x4d,0xcb,0xdf,0x57,0x37,0x40,0xda,0xa7,0x3f,0xfd,0xe9,
+ 0xb5,0x84,0x7f,0x52,0x01,0x48,0x0a,0x7b,0x19,0x9a,0x88,0x9b,0x4d,0x09,0x90,0x96,
+ 0xcc,0x12,0x68,0x64,0x26,0x40,0xa1,0x0a,0x80,0xab,0xde,0xb1,0xd9,0xc9,0xad,0xb7,
+ 0xde,0x9a,0xab,0x1b,0x00,0x00,0xac,0x88,0xe0,0x97,0x96,0x14,0xd8,0xb6,0xbc,0x7f,
+ 0x9b,0xd0,0xb7,0x7d,0x66,0x56,0x05,0x34,0x97,0x31,0x97,0x17,0xe1,0xbf,0xfe,0xfa,
+ 0xeb,0x7b,0x85,0xbf,0xcf,0x03,0xe0,0x1b,0x02,0xf0,0x19,0xcd,0x79,0x53,0xc8,0x10,
+ 0x40,0xda,0xcc,0x47,0xb6,0x65,0x37,0xdb,0x6c,0x33,0xae,0x70,0x00,0x00,0x70,0x0a,
+ 0xff,0xa4,0x30,0x37,0x05,0xbb,0xe9,0xaa,0x37,0x95,0x02,0x73,0xd2,0x1f,0xdf,0x94,
+ 0xc0,0xc9,0x75,0x1d,0x71,0xc4,0x11,0x1d,0x43,0xd5,0x49,0xe1,0x6f,0x13,0xf4,0x36,
+ 0xeb,0xdf,0x14,0xfe,0xb6,0xca,0x80,0x8d,0xb0,0xfe,0x0b,0xf7,0x00,0x84,0x7a,0x01,
+ 0xa4,0x18,0xd0,0x76,0xdb,0x6d,0xc7,0x95,0x0e,0x00,0x00,0x6b,0x09,0xff,0x15,0x2b,
+ 0x56,0xac,0x25,0xa4,0x6d,0x29,0x7b,0x2e,0x8b,0x3e,0x7e,0x75,0xe5,0xff,0xbb,0xaa,
+ 0x07,0xc6,0xef,0x45,0xf8,0x4b,0xa0,0x7a,0x9a,0xf0,0x4f,0x0a,0xfd,0xa4,0xf0,0xb7,
+ 0x0d,0x01,0xb8,0x52,0x01,0x1b,0x61,0xfd,0x17,0xe6,0x01,0x70,0x29,0x01,0x69,0x9e,
+ 0x01,0x99,0x3a,0xf1,0xc5,0x17,0x5f,0xe4,0x8a,0x07,0x00,0x80,0x48,0xf0,0xc7,0x96,
+ 0xbf,0xad,0x5e,0xbf,0x29,0xe4,0x93,0xd6,0xbd,0x6b,0x26,0xc0,0xb4,0x38,0x81,0x78,
+ 0xf9,0xfe,0xfd,0xfb,0xab,0x71,0xe3,0xc6,0x75,0x8c,0xf7,0x27,0x23,0xfd,0xe5,0xd5,
+ 0x27,0xfc,0x5d,0xe3,0xff,0x69,0x95,0x00,0x1b,0x55,0x08,0xa8,0x6e,0x59,0x00,0xa6,
+ 0x86,0x63,0x36,0x29,0xa6,0x30,0x72,0xe4,0x48,0x35,0x6d,0xda,0x34,0xae,0x7c,0x00,
+ 0x80,0x36,0x17,0xfe,0xb1,0xe5,0x6f,0x0a,0xef,0xe4,0x54,0xbc,0x49,0xd7,0x7e,0x32,
+ 0xed,0x2f,0x29,0xd8,0x4d,0x65,0xc0,0x1c,0x06,0x88,0x3f,0xfb,0xe8,0x47,0x3f,0x1a,
+ 0xc5,0xa3,0xf5,0xee,0xdd,0x3b,0xfa,0xcc,0x55,0xdc,0xc7,0x25,0xfc,0xa5,0x26,0x80,
+ 0x4d,0x09,0xf0,0x0d,0x01,0x34,0xaa,0x06,0x40,0x21,0x0a,0x80,0x79,0xa0,0x6d,0xd6,
+ 0xbe,0xab,0xed,0xb7,0xdf,0x7e,0xea,0xaa,0xab,0xae,0xe2,0xea,0x07,0x00,0x68,0x73,
+ 0xe1,0x6f,0x0a,0xe8,0x18,0xd3,0xc5,0xef,0xca,0xdd,0x37,0x2d,0x7e,0x9b,0xe5,0x2f,
+ 0x95,0x68,0xc5,0xfb,0x2c,0x01,0x7e,0x49,0x19,0x95,0xac,0xdf,0x9f,0xb4,0xfc,0x63,
+ 0x05,0x20,0x4d,0xf8,0xdb,0x02,0x00,0x7d,0xf3,0x00,0x34,0x8a,0xc2,0x3d,0x00,0xae,
+ 0x09,0x0f,0x6c,0xf3,0x24,0x0f,0x1b,0x36,0x4c,0x6d,0xb2,0xc9,0x26,0x6a,0xf2,0xe4,
+ 0xc9,0xdc,0x05,0x00,0x00,0x6d,0xc6,0xf2,0xe5,0xcb,0xad,0x96,0xbf,0x59,0xac,0x27,
+ 0x69,0xf5,0xbb,0x02,0x00,0x6d,0x7f,0xcb,0xfb,0x9e,0x3d,0x7b,0xaa,0xdd,0x76,0xdb,
+ 0x4d,0x6d,0xba,0xe9,0xa6,0x91,0x40,0x8e,0x89,0x05,0xb3,0x39,0x93,0x9f,0x2f,0xd5,
+ 0xaf,0x1a,0xcb,0xbf,0x0c,0xd6,0x7f,0xa1,0x0a,0x40,0x88,0xf5,0x6f,0x1e,0x04,0x39,
+ 0x48,0x07,0x1d,0x74,0x90,0xba,0xfc,0xf2,0xcb,0xb9,0x13,0x00,0x00,0xda,0xd0,0xf2,
+ 0x8f,0x05,0xb5,0x6d,0x0c,0xdf,0x66,0xd5,0x27,0x5d,0xff,0xae,0xdf,0x08,0x9b,0x6f,
+ 0xbe,0x79,0xe4,0xe6,0x97,0x31,0xfe,0x58,0x71,0x30,0x65,0x51,0x56,0xe1,0x5f,0xcd,
+ 0xd8,0x7f,0x59,0x84,0x7f,0x61,0x0a,0x40,0xb2,0x8a,0x92,0xaf,0x99,0x1a,0x91,0xd4,
+ 0x58,0x96,0xa1,0x80,0xfb,0xef,0xbf,0x9f,0x3b,0x02,0x00,0xa0,0x4d,0x2c,0x7f,0x69,
+ 0xa6,0xf0,0xb7,0xb9,0xf0,0x6d,0xa9,0x7a,0x36,0x17,0xbf,0x2c,0x27,0xc2,0xfe,0x63,
+ 0x1f,0xfb,0x58,0x14,0x5f,0x96,0x5c,0x36,0x29,0x84,0x4d,0xcb,0x3c,0xe9,0xf6,0xb7,
+ 0x09,0xff,0xf8,0xd5,0x74,0xfb,0x9b,0xc2,0xdf,0x9c,0x19,0xd0,0x55,0xf6,0xb7,0x91,
+ 0xc3,0x00,0x0d,0xc9,0x02,0xb0,0x1d,0xf4,0xe4,0x67,0x12,0x88,0x31,0x71,0xe2,0x44,
+ 0x35,0x75,0xea,0x54,0xee,0x0c,0x00,0x80,0x36,0x10,0xfe,0xb6,0x2a,0x7d,0x36,0x81,
+ 0x6f,0xab,0xe7,0x9f,0xfc,0x3c,0x19,0xd0,0x27,0x42,0xda,0x26,0x83,0xcc,0x99,0xf8,
+ 0x5c,0x96,0xbf,0x19,0xf4,0x97,0x96,0xf6,0x67,0x0a,0x7f,0xd3,0xf5,0x6f,0x7a,0xbd,
+ 0x1b,0x2d,0xfc,0x0b,0x55,0x00,0x7c,0xd6,0xbe,0x4d,0xeb,0x4a,0xfe,0x2d,0x35,0x97,
+ 0xaf,0xbe,0xfa,0xea,0x68,0xca,0x45,0x00,0x00,0x68,0x4d,0xe1,0x2f,0xcf,0xf8,0xa4,
+ 0x40,0xf4,0x05,0xf2,0x99,0xc2,0x3f,0x1e,0x02,0x18,0x31,0x62,0x44,0x34,0xb6,0xbf,
+ 0xde,0x7a,0xeb,0xad,0xa5,0x0c,0xa4,0xc9,0xa2,0x50,0xe1,0xef,0x52,0x00,0x92,0x9f,
+ 0x27,0x27,0xff,0x49,0x5a,0xfd,0xf2,0x5a,0x46,0xe1,0x1f,0x2b,0x00,0x32,0x0b,0x4f,
+ 0x97,0xa2,0xad,0xff,0x34,0x97,0x8b,0xa9,0x04,0xc8,0xab,0x1c,0xd4,0xa3,0x8e,0x3a,
+ 0x4a,0x5d,0x73,0xcd,0x35,0xce,0x31,0x1d,0x00,0x00,0x68,0x4e,0x96,0x2d,0x5b,0xd6,
+ 0xe1,0xf6,0x77,0x4d,0xe2,0x63,0x8b,0xf4,0x4f,0x0a,0x4e,0x91,0x13,0xbb,0xef,0xbe,
+ 0x7b,0x14,0x3c,0x2e,0x82,0x37,0x5e,0x26,0x59,0x5d,0xcf,0x74,0xbd,0xdb,0xe4,0x4e,
+ 0x48,0x89,0x5f,0x53,0xe0,0xbb,0x6a,0xfd,0xdb,0xc6,0xfb,0xcd,0xc9,0x7e,0xca,0x20,
+ 0xfc,0x45,0xf6,0x8b,0x02,0x20,0x67,0xa0,0x57,0x91,0x5b,0xf1,0x79,0x01,0x4c,0x6d,
+ 0x29,0xfe,0xbc,0x6f,0xdf,0xbe,0xea,0xc8,0x23,0x8f,0x54,0x37,0xde,0x78,0x23,0x77,
+ 0x0b,0x00,0x40,0x8b,0x20,0x56,0x7f,0x72,0xcc,0xdf,0x25,0xf8,0xcd,0xef,0x63,0x8b,
+ 0x7f,0x8b,0x2d,0xb6,0xe8,0x08,0xe8,0x4b,0x0e,0x03,0xd8,0x84,0xbd,0x4f,0xf6,0xc8,
+ 0x6b,0x72,0xcc,0xdf,0xa7,0x00,0x98,0xef,0x6d,0x75,0xfe,0xcd,0xd9,0xfe,0xca,0x64,
+ 0xf5,0x27,0x1d,0x30,0xa2,0x00,0x2c,0x29,0x4a,0x01,0x70,0x45,0xfd,0xbb,0x34,0x2f,
+ 0xd3,0x15,0x23,0xef,0x07,0x0d,0x1a,0xa4,0x0e,0x3d,0xf4,0x50,0x75,0xc7,0x1d,0x77,
+ 0x70,0xd7,0x00,0x00,0xb4,0x80,0xe5,0x2f,0xcd,0xb4,0xec,0xcd,0xbf,0xcd,0x98,0x80,
+ 0x01,0x03,0x06,0x44,0x01,0x7d,0xa3,0x46,0x8d,0x5a,0x6b,0x7d,0xae,0xaa,0x7a,0xa6,
+ 0xbc,0x09,0xb5,0xfc,0x43,0x14,0x00,0x97,0xcb,0x3f,0x44,0xf8,0x97,0x48,0x09,0x58,
+ 0xd2,0x49,0x1f,0xd8,0x89,0xfa,0xcd,0xd8,0xbc,0xd7,0x1c,0xd7,0x59,0x8e,0x5b,0x3c,
+ 0x95,0x63,0x9c,0xea,0x11,0x5f,0x04,0xd2,0x44,0x1b,0x34,0x5b,0xfc,0x5d,0x9c,0x17,
+ 0x3a,0x6f,0xde,0x3c,0x75,0xf3,0xcd,0x37,0x33,0x1c,0x00,0x00,0xd0,0xc4,0x96,0xbf,
+ 0x3c,0xd7,0x6d,0x81,0x7c,0xb6,0xb2,0xbe,0xf2,0xba,0xe3,0x8e,0x3b,0xa6,0x06,0xf4,
+ 0xb9,0x02,0xfb,0x42,0x05,0xbf,0x2d,0xea,0x3f,0xa9,0x00,0xd8,0x94,0x01,0x53,0x59,
+ 0x30,0x3d,0xd8,0x4d,0x20,0xfc,0x85,0x49,0xe2,0x01,0x98,0x55,0x84,0x02,0x60,0x3b,
+ 0x41,0x3e,0xeb,0xdf,0xd5,0x44,0x81,0xe8,0xd7,0xaf,0x9f,0x1a,0x3f,0x7e,0xbc,0xba,
+ 0xed,0xb6,0xdb,0x08,0x0c,0x04,0x00,0x68,0x42,0xe1,0x9f,0x7c,0x76,0xbb,0x66,0xea,
+ 0x13,0xa4,0x34,0xbc,0x8c,0xed,0x87,0x06,0xf4,0xf9,0x04,0xbf,0xe9,0x5d,0x76,0x09,
+ 0xff,0xa4,0xf5,0x6f,0x53,0x02,0x6c,0x82,0xdf,0x37,0xe6,0x5f,0x52,0xe1,0x2f,0xcc,
+ 0x12,0x05,0xa0,0xd0,0xe2,0xfb,0x21,0xc1,0x17,0xe6,0x41,0x95,0x26,0x1e,0x03,0x69,
+ 0x49,0x2f,0x82,0x54,0x70,0x3a,0xfa,0xe8,0xa3,0xd5,0x43,0x0f,0x3d,0x44,0x8a,0x20,
+ 0x00,0x40,0x93,0x09,0x7f,0x33,0x72,0x3f,0xf9,0x5e,0x5c,0xec,0x12,0xc5,0x3f,0x76,
+ 0xec,0xd8,0xcc,0x01,0x7d,0xa6,0x7c,0x49,0x0a,0x64,0xdb,0xf0,0x72,0x9a,0xf0,0x37,
+ 0x95,0x00,0xf3,0x7d,0xf2,0x77,0x65,0xad,0xf0,0x17,0xc8,0x34,0x51,0x00,0xa6,0x14,
+ 0x29,0xfc,0x6d,0x05,0x81,0x42,0xc6,0x5f,0x62,0x05,0x40,0x5a,0xec,0x05,0x88,0xc7,
+ 0x84,0xf6,0xda,0x6b,0xaf,0x68,0xd2,0x20,0x51,0x04,0x00,0x00,0xa0,0xbc,0x2c,0x59,
+ 0xb2,0x24,0x72,0xfb,0xbb,0xca,0xf6,0xca,0x74,0xbb,0xfb,0xee,0xbb,0x6f,0x47,0x40,
+ 0x5f,0x4c,0x48,0x40,0x9f,0xe9,0x55,0x0e,0xb1,0xf8,0x6d,0xc2,0xdf,0xa5,0x04,0xd8,
+ 0x84,0xbe,0xcf,0xe5,0xdf,0x24,0xc2,0x5f,0x98,0x22,0x0a,0xc0,0xa4,0xa2,0x85,0x7f,
+ 0xfc,0xea,0xaa,0xb8,0x14,0x0b,0xfa,0x58,0xd3,0x4a,0x0a,0xff,0xd8,0x0b,0x60,0xce,
+ 0xfb,0x2c,0x39,0x9f,0xc7,0x1d,0x77,0x9c,0x7a,0xf2,0xc9,0x27,0xd5,0x94,0x29,0x53,
+ 0xb8,0xcb,0x00,0x00,0x4a,0x28,0xfc,0xa5,0x25,0x05,0x7e,0x5c,0x89,0x4f,0x82,0xf9,
+ 0x0e,0x38,0xe0,0x00,0x6b,0x3d,0xfe,0xac,0x01,0x7d,0xa1,0x42,0x3f,0x44,0x01,0x70,
+ 0x7d,0xe7,0xca,0x56,0x2b,0x63,0x85,0xbf,0x40,0xa2,0x18,0x80,0x17,0x8b,0xde,0x8a,
+ 0x2b,0x06,0x40,0x84,0x79,0x52,0x09,0x88,0x85,0x7f,0xfc,0x1a,0xbb,0xfe,0x4d,0xe1,
+ 0x1f,0x5f,0x48,0xf2,0xf7,0x2e,0xbb,0xec,0xa2,0x76,0xd8,0x61,0x07,0xf5,0xd4,0x53,
+ 0x4f,0xa9,0x77,0xde,0x79,0x87,0x3b,0x0e,0x00,0xa0,0xa4,0xc2,0x5f,0x9e,0xed,0x5b,
+ 0x6d,0xb5,0x55,0x14,0xcd,0x9f,0x4c,0xdf,0xab,0x25,0xa0,0xcf,0x14,0xfa,0xe6,0xf0,
+ 0x72,0x9a,0xf0,0x4f,0x7b,0xef,0xb2,0xf6,0xd3,0xac,0xfe,0x26,0x12,0xfe,0xc2,0x8b,
+ 0x92,0x05,0xd0,0x57,0xbf,0x99,0x27,0xca,0x57,0xde,0x6b,0x37,0x85,0x75,0x9c,0x0d,
+ 0x60,0x66,0x04,0xc4,0xa5,0x20,0x93,0x59,0x01,0xc9,0x2c,0x81,0x64,0x36,0x40,0xdc,
+ 0xe2,0x75,0x24,0xd7,0x2b,0xdb,0x79,0xf5,0xd5,0x57,0xd5,0x84,0x09,0x13,0xb8,0xfb,
+ 0x00,0x00,0x1a,0x2c,0xfc,0x63,0x21,0x2f,0xee,0xfd,0x71,0xe3,0xc6,0xa9,0x8d,0x36,
+ 0xda,0x68,0x9d,0x89,0x78,0xd2,0xaa,0xf4,0x85,0x08,0x7d,0x5f,0x70,0x5f,0xe8,0xe7,
+ 0xae,0x66,0x6e,0xd7,0x54,0x4c,0x92,0x0a,0x4c,0x13,0x09,0x7f,0x09,0xbc,0xe8,0xdf,
+ 0x55,0xef,0xec,0x42,0x7d,0x92,0x5e,0xd2,0x7f,0x6c,0x5f,0x84,0xe5,0x6f,0x46,0x70,
+ 0xca,0x01,0x8b,0x5d,0x40,0xb1,0x17,0x40,0x4e,0x48,0x2c,0xc4,0x93,0xaf,0xa6,0x07,
+ 0xc0,0x9c,0x16,0x52,0x90,0x65,0x93,0x0a,0x87,0x68,0x97,0xdb,0x6c,0xb3,0x8d,0x9a,
+ 0x3f,0x7f,0xbe,0x7a,0xf3,0xcd,0x37,0xd5,0xeb,0xaf,0xbf,0xbe,0xd6,0x32,0x00,0x00,
+ 0x50,0x1c,0x8b,0x17,0x2f,0x8e,0x8c,0x38,0x99,0xd8,0x6d,0xfb,0xed,0xb7,0x8f,0x9e,
+ 0xc9,0xb1,0xa0,0x34,0x27,0xe2,0xa9,0x36,0x8a,0x3f,0x74,0x7c,0xdf,0xf5,0xb9,0xaf,
+ 0x0e,0x8d,0xcd,0xcd,0x1f,0x32,0xd6,0xdf,0x24,0xc2,0x5f,0x78,0x49,0xef,0xeb,0xa2,
+ 0x78,0x2e,0x80,0x47,0x8b,0x50,0x00,0x92,0x8a,0x80,0xa9,0x04,0x24,0x15,0x80,0xa4,
+ 0x12,0x20,0x4d,0xa2,0x41,0xd3,0x84,0xbe,0xa9,0x71,0xc5,0x7f,0xc7,0xd1,0xa4,0xf2,
+ 0x2a,0x17,0xdf,0x47,0x3e,0xf2,0x91,0x28,0x7f,0x54,0x7e,0x2b,0xda,0xa8,0xd4,0x12,
+ 0x98,0x39,0x73,0x66,0xa4,0x1c,0xc8,0xdf,0x8b,0x16,0x2d,0x8a,0xbc,0x08,0x00,0x00,
+ 0x90,0x1d,0xc9,0xcd,0x17,0xeb,0x5e,0xd2,0xb4,0xa5,0x50,0x4f,0x3c,0xac,0x3b,0x66,
+ 0xcc,0x98,0x75,0x02,0xc0,0xe3,0xe7,0xb4,0x2f,0x98,0xcf,0x26,0xf4,0x43,0xc7,0xf6,
+ 0xb3,0x58,0xf7,0xa6,0x42,0x91,0x45,0xe8,0x9b,0xfd,0x6a,0x32,0xe1,0x1f,0xcb,0xfc,
+ 0x8e,0xc9,0x80,0xee,0xd5,0xed,0xf4,0xa2,0x84,0xbf,0x2d,0x8f,0x33,0xf6,0x04,0xc8,
+ 0x01,0x4f,0x8e,0xf1,0xc7,0x16,0xbf,0x69,0xfd,0xc7,0xda,0xa3,0x4b,0xa9,0x88,0x3d,
+ 0x07,0xf1,0xf6,0x92,0xbf,0x95,0xcf,0x7a,0xf5,0xea,0x15,0x35,0x89,0x38,0x4d,0x42,
+ 0x61,0x21,0x00,0x80,0xda,0x8c,0x3b,0xd7,0x73,0x39,0xeb,0xd8,0x7e,0x35,0x42,0x3f,
+ 0x8b,0xf0,0xf7,0x59,0xf8,0xb6,0xc0,0x3e,0xdf,0x38,0x7f,0x93,0x09,0x7e,0x95,0x90,
+ 0xf9,0x1d,0x0a,0xc0,0x7d,0xba,0xad,0xd0,0xad,0x5b,0x3d,0xbd,0x00,0x49,0x05,0x20,
+ 0xf6,0x02,0xd8,0xac,0xfe,0x34,0xc1,0x2f,0x16,0xbc,0xbc,0xc6,0xc2,0x3f,0x56,0x1c,
+ 0x64,0xfd,0xe6,0xf0,0x81,0xb9,0xae,0x64,0x10,0x0a,0x00,0x00,0xd4,0xa6,0x04,0xa4,
+ 0x29,0x00,0x45,0x8d,0xeb,0xa7,0x09,0xfe,0xb4,0xb9,0x66,0xd2,0x2c,0xfd,0x34,0xa1,
+ 0xdf,0xc4,0x56,0x7f,0xcc,0x8a,0x35,0x32,0xff,0x43,0x05,0x40,0x77,0x62,0x81,0x16,
+ 0x86,0x0f,0xe8,0xb7,0x07,0xd5,0xc3,0x0b,0x90,0x1c,0x0f,0x32,0xbd,0x00,0x3e,0x05,
+ 0xc0,0x54,0x22,0x4c,0x57,0x52,0x32,0x7e,0xc0,0x54,0x02,0x92,0xdb,0xc4,0x03,0x00,
+ 0x00,0x90,0xbf,0xe0,0xf7,0x3d,0xa3,0xab,0x4d,0xdd,0x0b,0x15,0xfe,0x79,0x0a,0x7d,
+ 0x97,0xb5,0xdf,0xe4,0x86,0xe3,0x03,0x22,0xf3,0x93,0x1e,0x00,0xe1,0xba,0xa2,0x14,
+ 0x00,0xd7,0x05,0x13,0x2b,0x02,0x49,0xc1,0xec,0x1a,0xf7,0xf7,0x69,0x94,0x71,0x56,
+ 0x40,0x2c,0xf4,0xd3,0x82,0x08,0x6d,0x9e,0x00,0x00,0x00,0xc8,0xd7,0xf2,0x4f,0xab,
+ 0xd2,0xe7,0xab,0xce,0x17,0xf2,0x99,0xed,0xf7,0xa1,0xee,0xfd,0xb4,0x71,0x7d,0x57,
+ 0x54,0x7f,0x8b,0x78,0x8c,0xaf,0x8b,0xdf,0x24,0x15,0x80,0x9b,0x75,0xfb,0xad,0x6e,
+ 0x3d,0x8b,0xf6,0x02,0x24,0x15,0x80,0x64,0x46,0x80,0x2d,0xd8,0xcf,0xb6,0x1e,0xdb,
+ 0x05,0x15,0x0b,0x7f,0x5b,0x09,0x61,0x33,0x26,0x20,0x29,0xf4,0x6d,0xdb,0x43,0x21,
+ 0x00,0x00,0x70,0x0b,0x7c,0x9f,0xe0,0x0f,0x99,0xfe,0x3d,0xc4,0xd2,0x0f,0x0d,0xea,
+ 0x73,0x55,0x02,0x34,0x15,0x90,0x90,0x80,0xbe,0x16,0x16,0xfc,0xc2,0xd2,0x35,0xb2,
+ 0x7e,0x6d,0x05,0x40,0x77,0x70,0xae,0x16,0x7c,0x37,0xea,0xb7,0x9f,0xa9,0xe7,0x45,
+ 0x94,0x1c,0x0e,0x48,0x56,0x84,0xb2,0x09,0xfd,0x34,0x8d,0x32,0x6e,0x66,0x05,0x41,
+ 0x5b,0x31,0xa1,0xa4,0xc7,0x01,0xa1,0x0f,0x00,0x50,0x9b,0xf5,0x1f,0x22,0xfc,0x43,
+ 0x2d,0xfe,0x50,0x05,0x20,0x34,0x65,0xcf,0x15,0xd0,0x67,0xee,0xbb,0x4d,0x3e,0xb5,
+ 0x60,0x8c,0xd8,0x8d,0x22,0xeb,0x6d,0x1e,0x00,0xe1,0x8a,0x22,0x15,0x80,0x64,0x59,
+ 0x60,0x53,0x01,0x08,0xb1,0xfa,0x4d,0x05,0x20,0xbe,0x10,0xa4,0x30,0x50,0x7c,0xb1,
+ 0x88,0x27,0x20,0xa9,0x00,0xc4,0x05,0x82,0x4c,0x4f,0x80,0xcb,0x0b,0x80,0x22,0x00,
+ 0x00,0x10,0x26,0xf8,0x93,0xcf,0xe7,0xf8,0x79,0x6e,0x7b,0x4e,0xa7,0x59,0xfe,0x21,
+ 0x95,0xf8,0xb2,0x8c,0xed,0xdb,0x04,0x7f,0x9b,0x5a,0xfb,0x36,0xae,0x48,0xfe,0xd1,
+ 0xd5,0x38,0xb9,0x8f,0x68,0x01,0xf8,0x8c,0x7e,0xbb,0x73,0x3d,0x95,0x00,0x33,0x1e,
+ 0x20,0x4d,0x01,0x48,0x5e,0x54,0x22,0xf8,0x93,0x43,0x00,0xd2,0x92,0x4a,0x80,0x19,
+ 0x0b,0x10,0x12,0x0f,0x80,0x22,0x00,0x00,0xa0,0x52,0x2d,0x61,0x5f,0xd0,0x5f,0x16,
+ 0xb7,0xbf,0xad,0xde,0x7e,0x88,0x9b,0xbf,0xd6,0x28,0xfe,0x36,0x12,0xfa,0x31,0xcf,
+ 0x88,0x8c,0x77,0x2a,0x00,0x6b,0xb8,0x58,0xb7,0xbf,0x16,0x7d,0x31,0x25,0x95,0x80,
+ 0x38,0x70,0xcf,0xa6,0x04,0xa4,0xb9,0x95,0xe2,0x0b,0x23,0x16,0xfe,0xb1,0xe0,0x4f,
+ 0x2a,0x00,0xe6,0x9c,0x02,0xc4,0x02,0x00,0x00,0x54,0x2f,0xfc,0x6d,0x82,0xdf,0xe6,
+ 0xa5,0xb5,0x4d,0xc9,0x9b,0xc5,0xfd,0x6f,0x2b,0xd4,0x53,0x6d,0x40,0x5f,0x9b,0x5a,
+ 0xfb,0x36,0xd9,0xbe,0xf6,0x79,0xb4,0x08,0x3d,0x91,0xc2,0x32,0x41,0xd0,0xd6,0x45,
+ 0xee,0x89,0x4d,0x00,0x27,0x85,0x74,0x52,0x80,0x27,0x85,0x7a,0x52,0xd8,0xdb,0x9a,
+ 0x6d,0x26,0x41,0xdf,0x30,0x80,0x29,0xe8,0x11,0xfc,0x00,0x00,0x6e,0x45,0xc0,0xa7,
+ 0x00,0x84,0xa6,0xfa,0xb9,0xac,0x7e,0x57,0x50,0x1f,0x01,0x7d,0x55,0x23,0x13,0xe4,
+ 0x6c,0xa7,0xfb,0xbe,0x3a,0xd5,0x03,0x20,0x0b,0x68,0x01,0xf8,0x3d,0xfd,0xf6,0x86,
+ 0x7a,0x79,0x01,0x92,0xd3,0x05,0x27,0x3d,0x01,0x3e,0xf7,0x92,0x79,0x21,0xb9,0x14,
+ 0x80,0x90,0x79,0x05,0xd2,0x84,0x3e,0x0a,0x01,0x00,0x60,0xf9,0xfb,0x3d,0x00,0x69,
+ 0x41,0xda,0x21,0x19,0x00,0xa1,0x82,0x9f,0x80,0xbe,0xcc,0x9c,0x67,0x0a,0x7f,0xab,
+ 0x07,0x20,0x21,0xf4,0xee,0xd7,0x2f,0xfb,0x16,0xbd,0x57,0x36,0x4f,0x40,0xb2,0x14,
+ 0x70,0xb2,0x99,0xc2,0xdd,0xf4,0x0e,0xf8,0x84,0x7f,0xa8,0x02,0x80,0xc0,0x07,0x00,
+ 0xc8,0xc7,0x03,0x10,0x32,0x6d,0xaf,0x4d,0xf0,0x63,0xed,0xe7,0x86,0x14,0xfe,0xd9,
+ 0xcf,0x7a,0x4e,0x53,0x04,0xf3,0x96,0xfa,0xe5,0x05,0xdd,0xba,0x37,0x4a,0x09,0xf0,
+ 0x29,0x02,0x2e,0xa5,0xc0,0x36,0xa3,0xa0,0x2d,0x06,0x00,0xe1,0x0f,0x00,0x50,0xbd,
+ 0x12,0x90,0x25,0x08,0x30,0xed,0x35,0x6b,0x3d,0x7e,0xdb,0xf6,0x11,0xfa,0x56,0x96,
+ 0xeb,0xb6,0xbd,0x3e,0x26,0xaf,0xda,0xbe,0xec,0x9a,0x72,0xa2,0x5f,0xd5,0xc2,0xf0,
+ 0x12,0xfd,0xf6,0x5b,0xf5,0xb8,0xa8,0x5c,0x75,0xf9,0x5d,0x5a,0x5f,0x72,0xb8,0x20,
+ 0xce,0xff,0x77,0x09,0xfe,0x34,0xeb,0x1f,0xe1,0x0f,0x00,0x50,0x9b,0x12,0x10,0x5a,
+ 0xf3,0x3f,0x8f,0x2a,0x7d,0x58,0xfb,0x99,0xb8,0xc4,0x25,0xfc,0x53,0x3d,0x00,0x6b,
+ 0x04,0x62,0x6f,0xfd,0xf2,0x6f,0xdd,0xc6,0xd4,0x6b,0x6f,0x6d,0xc1,0x79,0xa6,0xe5,
+ 0xee,0x12,0xf0,0x69,0x82,0x1f,0xf7,0x3f,0x00,0x40,0xbe,0xc2,0x3f,0xab,0x12,0xe0,
+ 0x52,0x0c,0xd2,0x52,0xf8,0xb0,0xf6,0xab,0x66,0x8a,0x6e,0xdb,0xe8,0x63,0xb4,0xb8,
+ 0x2a,0x05,0x60,0x8d,0x40,0xdc,0x5d,0xbf,0x3c,0xac,0x0a,0x9c,0x29,0x30,0x4d,0x09,
+ 0x48,0x2a,0x03,0xe6,0xd0,0x80,0x6b,0x0a,0x61,0x53,0xe8,0x23,0xfc,0x01,0x00,0x1a,
+ 0xa7,0x04,0xd8,0xc6,0xf3,0xb3,0x58,0xfb,0x04,0xf4,0x65,0x46,0x66,0xfc,0xdb,0x4b,
+ 0x1f,0xa7,0x27,0x52,0xcf,0x65,0xa0,0x40,0xfe,0x9a,0xb2,0xe4,0x10,0xd6,0x43,0x09,
+ 0x08,0x55,0x04,0x5c,0x02,0xdf,0x57,0xfc,0x27,0x24,0x0b,0x00,0x00,0x00,0x94,0x55,
+ 0xf0,0xdb,0x2c,0x74,0x9b,0x60,0x77,0x09,0x7c,0x57,0x34,0x3f,0xd6,0x7e,0x4d,0x9c,
+ 0xad,0x8f,0xd7,0x25,0xde,0xf3,0x98,0x41,0x20,0xdf,0xa6,0x5f,0x0e,0xab,0x77,0x2f,
+ 0x4c,0x45,0x20,0x4d,0x19,0x70,0x29,0x07,0xb6,0xe5,0x6d,0x42,0x1f,0x25,0x00,0x00,
+ 0xa0,0x3a,0x0f,0x80,0xcb,0x13,0x10,0xda,0x6c,0xeb,0x43,0xf0,0x57,0xc5,0xed,0xfa,
+ 0x98,0xfd,0x47,0xd0,0xb9,0xcc,0x20,0x88,0x07,0xeb,0x97,0x27,0x75,0x1b,0xdb,0x88,
+ 0x1e,0xf9,0x3c,0x02,0x2e,0xa5,0xc0,0xb5,0x5c,0x9a,0xd0,0x47,0x11,0x00,0x00,0x70,
+ 0x0b,0x7e,0x97,0x32,0x90,0x96,0x93,0x4f,0x69,0xde,0xba,0x30,0x49,0xb7,0xdd,0xf4,
+ 0xf1,0x9b,0x93,0xab,0x02,0xb0,0x46,0x30,0x4a,0x30,0xe0,0x63,0xba,0x0d,0x6b,0x54,
+ 0xef,0x5c,0x8a,0x80,0xcd,0x43,0x90,0xf6,0x19,0x02,0x1f,0x00,0x20,0x3f,0x85,0x20,
+ 0x64,0x58,0xc0,0xb5,0x1c,0x82,0x3f,0x17,0x66,0xe8,0x36,0x4e,0x1f,0xc3,0x29,0xc1,
+ 0xe7,0xb0,0x0a,0x01,0xbc,0xbd,0x7e,0x79,0x48,0xb7,0x01,0x8d,0xec,0xa9,0x4b,0x88,
+ 0xa7,0x59,0xf9,0xa1,0x01,0x7f,0x28,0x04,0x00,0x00,0x7e,0x0f,0x80,0xcb,0x13,0xe0,
+ 0x13,0xf0,0x04,0xf5,0xe5,0xce,0x3c,0xdd,0xf6,0xd6,0xc7,0xf1,0x85,0x4c,0xe7,0xb4,
+ 0x4a,0xe1,0xbb,0xb7,0x7e,0xf9,0xbf,0xba,0xf5,0x2c,0x43,0xcf,0x7d,0x16,0x7d,0x88,
+ 0xe0,0x47,0xe8,0x03,0x00,0xd4,0xa6,0x0c,0xa4,0x59,0xf3,0x08,0xfd,0xc2,0x58,0xaa,
+ 0xdb,0xc1,0xfa,0x78,0x3e,0x94,0xf9,0x3c,0xd6,0x20,0x74,0x45,0x09,0xb8,0xb5,0xd1,
+ 0x9e,0x80,0x2c,0xc2,0x3c,0x54,0xc8,0xa3,0x0c,0x00,0x00,0x84,0x7b,0x00,0xb2,0x2a,
+ 0x07,0x90,0xab,0xe5,0x7f,0x78,0x35,0xc2,0xbf,0x26,0x05,0x60,0x8d,0xa0,0xdc,0x7e,
+ 0x8d,0x27,0x60,0x58,0x33,0x1d,0x31,0x04,0x3c,0x00,0x40,0x63,0x14,0x04,0xc8,0x8d,
+ 0x19,0x6b,0x2c,0xff,0x17,0xaa,0x3e,0x67,0x39,0x08,0x53,0x09,0x0c,0xbc,0x47,0x35,
+ 0x28,0x3b,0x00,0x00,0x00,0xa0,0xcd,0x90,0x68,0xff,0x83,0xb2,0x04,0xfc,0xd9,0xe8,
+ 0x9c,0x83,0xd6,0x27,0x3b,0xb0,0x9b,0x6e,0xb7,0x73,0x4e,0x00,0x00,0x00,0x0a,0x45,
+ 0x64,0xed,0x6e,0xb5,0x0a,0xff,0x5c,0x14,0x80,0x35,0x4a,0xc0,0x9c,0x35,0x85,0x07,
+ 0xce,0x56,0x1f,0x96,0x20,0x04,0x00,0x00,0x80,0xfc,0x10,0xd9,0x2a,0x15,0xfe,0xfe,
+ 0x23,0x34,0xcf,0xdf,0x2b,0xbb,0xf3,0xde,0xc3,0x35,0x73,0x07,0x5c,0xa3,0xea,0x38,
+ 0x81,0x10,0x00,0x00,0x40,0x0b,0x23,0xd6,0xfe,0x09,0xbe,0xda,0xfe,0x0d,0xf1,0x00,
+ 0x18,0xde,0x00,0xd9,0xc1,0x6d,0x74,0xfb,0x89,0xfa,0x70,0x2e,0x62,0x00,0x00,0x00,
+ 0xc8,0xce,0xf2,0x35,0xb2,0x74,0x9b,0xbc,0x85,0x7f,0x21,0x1e,0x00,0xc3,0x1b,0xb0,
+ 0xa5,0x7e,0xb9,0x4c,0xb7,0x7d,0x39,0x8f,0x00,0x00,0x00,0xc1,0x3c,0xa0,0xdb,0x57,
+ 0xb4,0xe0,0x7f,0xb5,0xa8,0x0d,0x74,0x2e,0x72,0xef,0x65,0xc7,0x75,0xdb,0x4f,0xbf,
+ 0x3d,0x5a,0xb7,0x09,0x9c,0x4f,0x00,0x00,0x80,0x54,0x44,0x56,0x1e,0x2d,0xb2,0xb3,
+ 0x48,0xe1,0x5f,0xb8,0x07,0xc0,0xf0,0x06,0x88,0xb2,0x31,0x5e,0x7d,0x18,0x28,0xb8,
+ 0x33,0xe7,0x18,0x00,0x00,0xa0,0x83,0x67,0x74,0xbb,0x58,0xb7,0xeb,0xb5,0xe0,0x5f,
+ 0x5d,0x8f,0x0d,0x36,0xa4,0x72,0x83,0x56,0x06,0xf6,0xd4,0x2f,0xa7,0xea,0x76,0x94,
+ 0x2a,0x49,0x39,0x61,0x00,0x00,0x80,0x3a,0x23,0x65,0x7c,0x6f,0xd4,0xed,0x0a,0x2d,
+ 0xf4,0x1f,0xa9,0xf7,0xc6,0x1b,0x5a,0xba,0x49,0x2b,0x02,0x83,0xf4,0xcb,0x11,0xba,
+ 0x1d,0xab,0x3e,0x8c,0x13,0xe8,0xc6,0xf5,0x00,0x00,0x00,0x2d,0x8c,0xa4,0xf3,0xc9,
+ 0xf8,0xfe,0x75,0xba,0xdd,0xac,0x05,0xff,0xdc,0x46,0xed,0x48,0x69,0x6a,0x37,0x6a,
+ 0x65,0xa0,0x9f,0x7e,0x39,0x40,0xb7,0xfd,0x75,0xdb,0x43,0xb7,0x6d,0x55,0xc1,0x31,
+ 0x0a,0x00,0x00,0x00,0x05,0x23,0xee,0xfc,0x97,0x74,0x7b,0x54,0xb7,0xfb,0x74,0xbb,
+ 0x57,0x0b,0xfd,0x05,0x65,0xd8,0xb1,0xd2,0x16,0x6f,0xd6,0x0a,0x41,0x5f,0xf5,0x61,
+ 0x3a,0xe1,0x76,0xea,0xc3,0x32,0xc3,0x52,0x57,0x60,0xa4,0x6e,0xeb,0xe9,0x36,0x58,
+ 0xb7,0x5e,0xba,0x75,0xd7,0xad,0x0b,0xd7,0x17,0x00,0x00,0x34,0x80,0x55,0xea,0xc3,
+ 0x54,0xbd,0x25,0xba,0x49,0x71,0x9e,0x59,0xba,0x4d,0x53,0x1f,0xe6,0xed,0x4b,0xb9,
+ 0xde,0x17,0x45,0xf8,0x6b,0x81,0xbf,0xa8,0x8c,0x3b,0xff,0xff,0x00,0xa9,0xd9,0x66,
+ 0x33,0x79,0x3c,0x5d,0x0d,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,
+ 0x82,
+
+};
diff --git a/tools/printer-lg.png b/tools/printer-lg.png
new file mode 100644
index 00000000..439c59c7
--- /dev/null
+++ b/tools/printer-lg.png
Binary files differ
diff --git a/tools/printer-png.h b/tools/printer-png.h
index 95c42c5c..192b1fd6 100644
--- a/tools/printer-png.h
+++ b/tools/printer-png.h
@@ -2,304 +2,450 @@ static const unsigned char printer_png[] =
{
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x08,0x06,0x00,0x00,0x00,0xc3,0x3e,0x61,
- 0xcb,0x00,0x00,0x12,0x8c,0x49,0x44,0x41,0x54,0x78,0x01,0xec,0xd5,0x01,0x44,0x2c,
- 0x51,0x14,0xc6,0xf1,0xcf,0x06,0x10,0x25,0x45,0xa9,0x01,0x12,0x48,0x02,0x01,0x10,
- 0x64,0x42,0x28,0x28,0x03,0xa1,0x24,0x01,0xc5,0x14,0x04,0x29,0x50,0x29,0x54,0x01,
- 0x50,0x51,0xa0,0xc8,0xc0,0x50,0xa1,0x28,0x80,0x0a,0x02,0x01,0xad,0x10,0xb2,0xc4,
- 0x32,0xbb,0xcb,0xff,0xed,0xbb,0x76,0xc7,0x1a,0xdb,0xbe,0x17,0xc0,0x6d,0x7e,0x1c,
- 0xec,0x39,0xe3,0x0c,0xf7,0xdb,0xbb,0xab,0x46,0x00,0x07,0xf0,0x81,0x10,0xc8,0x02,
- 0x11,0x16,0xb0,0x5c,0x54,0xc9,0x2a,0xac,0x64,0xe7,0xe8,0xa7,0x80,0x6e,0xe0,0x18,
- 0x28,0x61,0x3b,0xfb,0x95,0x2a,0x59,0x76,0xff,0x6f,0xf8,0x2e,0x90,0xc3,0x36,0xa9,
- 0x1c,0xe0,0xaa,0x11,0x60,0xce,0xea,0x5b,0x9f,0x2a,0x01,0x73,0x8d,0x6e,0x7e,0x09,
- 0xdb,0xa5,0x4a,0x80,0x5b,0xef,0x3f,0x3f,0xc7,0x6f,0x91,0xca,0x01,0xdd,0xaa,0x02,
- 0x8e,0x49,0x18,0x1c,0x1c,0xa4,0xa7,0xa7,0x87,0xf5,0xf5,0x75,0xac,0x94,0x3a,0x56,
- 0x59,0x06,0x70,0x24,0x79,0x4a,0xc8,0x66,0xb3,0xa6,0x3e,0x3f,0x3f,0x65,0xa5,0x94,
- 0x67,0xb2,0x07,0x7c,0xea,0x58,0x5e,0x5e,0x66,0x7e,0x7e,0x9e,0xf3,0xf3,0x73,0x52,
- 0xd6,0xf2,0x05,0x84,0xa4,0x7e,0xab,0x30,0x23,0xa9,0x5f,0x75,0x1c,0x1c,0x1c,0x68,
- 0x73,0x73,0x53,0xb7,0xb7,0xb7,0xaa,0xf5,0xfc,0xfc,0x6c,0xfa,0x5b,0x5b,0x5b,0x2a,
- 0x16,0x8b,0xfa,0xf8,0xf8,0xd0,0xc9,0xc9,0x89,0xa6,0xa7,0xa7,0x35,0x35,0x35,0xa5,
- 0xed,0xed,0x6d,0xbd,0xbf,0xbf,0xeb,0x5f,0x3b,0x01,0x3d,0x3c,0x3c,0x68,0x6d,0x6d,
- 0x4d,0x63,0x63,0x63,0x5a,0x5a,0x5a,0x52,0x10,0x04,0x6a,0xe4,0xed,0xed,0x4d,0xbb,
- 0xbb,0xbb,0xf2,0x3c,0x4f,0x13,0x13,0x13,0xda,0xd8,0xd8,0xd0,0xeb,0xeb,0xab,0x6a,
- 0xed,0xed,0xed,0x99,0x77,0x5c,0x5d,0x5d,0xe9,0x3b,0x37,0x37,0x37,0xe6,0x99,0xa3,
- 0xa3,0x23,0x25,0x5d,0x5e,0x5e,0xca,0xf7,0x7d,0x8d,0x8e,0x8e,0x6a,0x61,0x61,0x41,
- 0xa7,0xa7,0xa7,0x02,0x64,0xa9,0x7e,0x01,0x11,0x75,0xb4,0xb7,0xb7,0x23,0x89,0xc5,
- 0xc5,0x45,0x6a,0xed,0xef,0xef,0x23,0xc9,0xd4,0xd3,0xd3,0x13,0x9d,0x9d,0x9d,0x48,
- 0xaa,0x2d,0xd3,0x2b,0x87,0xdb,0x70,0xe7,0xca,0xca,0x0a,0x92,0x48,0xd6,0xec,0xec,
- 0x2c,0x85,0x42,0x81,0xa4,0x30,0x0c,0x69,0x6b,0x6b,0x23,0xf9,0x7c,0x4b,0x4b,0x8b,
- 0x99,0x55,0xb9,0xae,0x6b,0xfa,0xbd,0xbd,0xbd,0x7c,0xa7,0xaf,0xaf,0x0f,0x49,0x94,
- 0x03,0xa6,0xea,0xeb,0xeb,0x8b,0xc9,0xc9,0x49,0xd3,0x4f,0xd6,0xf8,0xf8,0x38,0xf9,
- 0x7c,0x1e,0x0b,0x45,0x22,0xf6,0xf3,0x2f,0x40,0x57,0x57,0x17,0x99,0x4c,0x86,0xa1,
- 0xa1,0x21,0x73,0x98,0xc3,0xc3,0xc3,0xf1,0xcc,0x71,0x1c,0xa2,0x28,0xaa,0xbb,0xb3,
- 0xb5,0xb5,0x15,0x49,0x7f,0x3f,0x9b,0x43,0x9f,0x99,0x99,0xa9,0xce,0x4c,0x1d,0x1e,
- 0x1e,0x52,0xeb,0xe5,0xe5,0x85,0xa6,0xa6,0x26,0x33,0x1b,0x19,0x19,0x21,0x08,0x02,
- 0x2e,0x2e,0x2e,0x18,0x18,0x18,0x30,0xbd,0x8e,0x8e,0x8e,0x38,0xa0,0xb3,0xb3,0xb3,
- 0x78,0xcf,0xfd,0xfd,0x3d,0x49,0x77,0x77,0x77,0xf1,0xfc,0xf1,0xf1,0x91,0x2a,0xcf,
- 0xf3,0x4c,0xaf,0xb9,0xb9,0x99,0x9d,0x9d,0x1d,0xae,0xaf,0xaf,0x59,0x5d,0x5d,0x8d,
- 0xdf,0x5b,0xfe,0xc5,0xc3,0x46,0x7f,0xd8,0x33,0x03,0x8f,0xda,0x82,0x20,0x8c,0x7f,
- 0x3d,0xb7,0xaa,0x22,0x88,0x50,0x54,0x49,0x52,0x10,0x08,0x55,0x55,0x10,0x08,0x22,
- 0x80,0x0a,0xa8,0xa0,0x84,0x82,0x42,0xe8,0x9f,0xa8,0x92,0x84,0x90,0x00,0xa9,0x28,
- 0x54,0x14,0x92,0x84,0x40,0x44,0x29,0x52,0xa9,0x54,0x29,0x85,0x6a,0xde,0x67,0x98,
- 0x63,0x9d,0xb7,0x75,0xea,0x7a,0x91,0xea,0xc7,0x70,0xdf,0xee,0xdb,0xdd,0x75,0x76,
- 0x76,0x67,0xbe,0x29,0x6e,0x07,0xb0,0xdb,0xb7,0xb8,0xb8,0x28,0x0e,0xea,0x08,0xd6,
- 0x3f,0x3a,0x3a,0xea,0x9b,0x53,0xad,0xb9,0xb9,0x59,0xee,0xef,0xef,0xc5,0xd8,0xdb,
- 0xdb,0x93,0x8c,0x8c,0x8c,0xc0,0x79,0x18,0x5e,0xc4,0x68,0x6c,0x6c,0xd4,0xf6,0xd2,
- 0xd2,0x52,0x79,0x7a,0x7a,0x12,0x83,0xa1,0x46,0x92,0x92,0x92,0xb4,0x8f,0xe1,0x45,
- 0xdb,0x1e,0x1e,0x1e,0x74,0x5f,0x00,0xa4,0xb3,0xb3,0x53,0xc2,0x30,0x54,0x69,0x5f,
- 0x79,0x79,0xb9,0x18,0x9b,0x9b,0x9b,0x92,0x90,0x90,0x20,0x00,0xd4,0x81,0x5c,0xba,
- 0xba,0xba,0xcc,0xd9,0x6d,0x4f,0xc6,0xaf,0x03,0x6c,0x6f,0x6f,0x4b,0x98,0xe3,0xe3,
- 0xe3,0xe0,0xd6,0xb4,0xb4,0xb4,0x78,0xe7,0x6c,0x6a,0x6a,0x92,0x97,0x97,0x17,0x09,
- 0xa1,0xaa,0xc3,0xe6,0x66,0x6c,0xd7,0xb6,0xf3,0xf3,0xf3,0xa0,0x8d,0xf9,0x85,0x84,
- 0xa9,0xaa,0xaa,0xd2,0xbe,0xb6,0xb6,0x36,0x31,0x3a,0x3a,0x3a,0x82,0x97,0xe6,0xf1,
- 0xf1,0x51,0x8c,0x9b,0x9b,0x1b,0x49,0x4b,0x4b,0xd3,0xbe,0xb1,0xb1,0xb1,0xf0,0x21,
- 0xab,0x03,0x86,0xf7,0xc5,0x5c,0x22,0x58,0x7f,0x7f,0x7f,0xdf,0xe9,0xf9,0x75,0x00,
- 0xfd,0xa0,0x3e,0x72,0x73,0x73,0xb5,0x9f,0x87,0x13,0x39,0xa7,0xcb,0xc4,0xc4,0x84,
- 0xcd,0xad,0x1f,0x9e,0xe8,0x33,0x6e,0x6d,0x65,0x65,0x65,0xc2,0xe4,0xcf,0x35,0xc9,
- 0xcc,0xcc,0xd4,0xbe,0xfa,0xfa,0x7a,0x31,0xdc,0x31,0x33,0x33,0x33,0x62,0x8c,0x8c,
- 0x8c,0xd8,0x33,0xaf,0x31,0xdf,0x68,0x68,0x68,0xd0,0xf6,0xc4,0xc4,0xc4,0x7f,0xe6,
- 0xaf,0xae,0xae,0x0e,0xe6,0x5a,0x5d,0x5d,0x15,0x63,0x7a,0x7a,0x5a,0xd7,0x8c,0xb2,
- 0x9e,0x9e,0x1e,0xf9,0xca,0xfc,0xc1,0x27,0xc0,0x83,0x06,0xc1,0xc5,0xc5,0x45,0x5c,
- 0xe3,0xdc,0xb1,0xbc,0x75,0xae,0x02,0x01,0x63,0xbf,0x6b,0xb8,0xbc,0xbc,0x04,0x51,
- 0x35,0x62,0x54,0x56,0x56,0xa2,0xa8,0xa8,0x08,0xc4,0xcd,0xf4,0x31,0x3e,0x3e,0x0e,
- 0xa2,0x6a,0x85,0x4e,0x00,0xe2,0xae,0xa1,0xaa,0x26,0x3c,0xff,0xfa,0xfa,0x3a,0x0c,
- 0x77,0x8d,0x83,0x83,0x03,0xd0,0x21,0x22,0x6d,0x6b,0x6b,0x0b,0x5f,0x99,0x4f,0x71,
- 0x80,0xdb,0xdb,0x5b,0x10,0xb0,0x94,0x1c,0xd7,0x38,0x77,0x2c,0x13,0x3c,0x18,0x94,
- 0x8c,0x58,0x59,0x59,0xf1,0xda,0xe4,0xe4,0x24,0x5c,0x18,0x12,0x40,0xc0,0x1c,0x05,
- 0x67,0x67,0x67,0xea,0x3c,0x76,0x18,0xed,0xed,0xed,0x30,0xdc,0x35,0x0a,0x0a,0x0a,
- 0xbc,0x73,0x9b,0xf1,0x46,0x83,0xd8,0x1c,0x3a,0x67,0x84,0xa9,0x44,0xfe,0xca,0xc4,
- 0xf0,0x9f,0x61,0x92,0x86,0x93,0x93,0x93,0xe0,0x83,0x7e,0x84,0xa3,0xa3,0x23,0x18,
- 0x36,0x96,0x89,0x1f,0x0c,0x11,0xb1,0x43,0x88,0xa4,0xb5,0xb5,0x15,0x83,0x83,0x83,
- 0xba,0x1f,0x6a,0x79,0xbd,0xb1,0x04,0x54,0x0e,0xa0,0x6a,0x81,0x61,0x6b,0x6c,0x6c,
- 0x6c,0xe8,0xbe,0x2b,0x2a,0x2a,0x90,0x9c,0x9c,0x8c,0x28,0x18,0x7a,0xd4,0xe2,0xe0,
- 0xfb,0xbc,0x00,0xd4,0xeb,0x08,0x33,0x3f,0x3f,0x0f,0x66,0xf7,0x20,0x60,0x0e,0x10,
- 0x3d,0xce,0x81,0xf1,0x3a,0x38,0xfc,0xec,0xec,0x6c,0x80,0x50,0x11,0x20,0x3f,0x3f,
- 0x1f,0x20,0xc3,0xc3,0xc3,0xb8,0xbe,0xbe,0xc6,0x7b,0xc8,0xcb,0xcb,0x03,0x65,0x29,
- 0x40,0x98,0xf0,0x61,0x6a,0x6a,0xca,0x77,0xfb,0x95,0x9a,0x9a,0x1a,0x80,0x30,0x61,
- 0x04,0x25,0x20,0xe2,0xe0,0x67,0x3a,0x40,0x6d,0x6d,0xad,0x1b,0xe3,0xb4,0x52,0xc7,
- 0x02,0x0f,0x88,0x1e,0x1a,0x55,0x00,0x7c,0x30,0x19,0x43,0x7f,0x7f,0xbf,0xeb,0x08,
- 0x5a,0x99,0x63,0x61,0x09,0x20,0x03,0x03,0x03,0xa0,0x2c,0x83,0x5b,0xdd,0x23,0xfa,
- 0x94,0xb3,0x28,0x83,0xc3,0xc3,0x43,0x18,0xcf,0xcf,0xcf,0x3a,0x6e,0x69,0x69,0x09,
- 0x61,0x28,0xf9,0x00,0xb2,0xbb,0xbb,0x8b,0xab,0xab,0x2b,0xa4,0xa6,0xa6,0xfa,0xf6,
- 0xa4,0xe1,0x82,0xb2,0x10,0x20,0x43,0x43,0x43,0xea,0x30,0x22,0x02,0x83,0x4a,0x04,
- 0x73,0x73,0x73,0xfa,0x42,0x7c,0x3b,0xe2,0x55,0x01,0xae,0x15,0x17,0x17,0x0b,0x6f,
- 0x91,0xa4,0xa7,0xa7,0xeb,0xbf,0xf9,0x84,0xca,0xec,0xec,0xec,0x6b,0x73,0x9a,0x69,
- 0x36,0x5e,0x57,0x57,0xa7,0x55,0x3b,0x6b,0xa3,0x53,0x79,0x2b,0x81,0xdd,0xdd,0xdd,
- 0xc1,0xff,0xa1,0xf6,0x57,0x45,0xc0,0xa7,0xdc,0xd6,0xd4,0xdf,0x61,0xee,0xee,0xee,
- 0x74,0x0d,0x00,0x8e,0x54,0xf4,0xb3,0xb3,0xb3,0x23,0x39,0x39,0x39,0x6e,0x91,0x4b,
- 0x55,0x4c,0x61,0x61,0x61,0xd0,0xb6,0xb0,0xb0,0xf0,0x73,0x64,0x60,0x56,0x56,0x96,
- 0x00,0x90,0xde,0xde,0xde,0x57,0x1d,0x60,0x79,0x79,0x59,0x4a,0x4a,0x4a,0xdc,0x43,
- 0xd5,0x0f,0xc6,0xcc,0xf9,0x2d,0xa7,0x52,0xdd,0xdd,0xd7,0xd7,0x27,0x29,0x29,0x29,
- 0xc1,0x38,0xfe,0x16,0x3e,0xcf,0x56,0x3d,0xf4,0xc2,0x3a,0xbd,0xeb,0x2c,0x6a,0xb1,
- 0x58,0x4c,0x0b,0x44,0x7c,0x79,0x44,0xf1,0x17,0x7e,0xd4,0xd6,0xd6,0xd6,0xe4,0x2d,
- 0xf8,0xa7,0x6f,0xad,0x5d,0x58,0xad,0xc0,0x8c,0xb1,0x5e,0x25,0x1d,0x93,0xba,0x6f,
- 0xea,0x00,0x1f,0xc0,0x57,0x07,0x38,0x3d,0x3d,0xd5,0x43,0xe7,0x13,0x29,0xca,0x3b,
- 0x5f,0x15,0xde,0x74,0x2d,0xc7,0xd2,0xf4,0xf7,0x7b,0x61,0x1e,0x20,0x4c,0xda,0x74,
- 0xdc,0x5f,0x76,0xce,0x40,0x23,0xde,0x26,0x0a,0xe3,0x07,0xdd,0x40,0xd7,0x51,0xa1,
- 0x44,0x00,0x54,0x20,0x29,0x50,0x04,0xd0,0x05,0xa4,0x1b,0x88,0x80,0x82,0xa8,0x00,
- 0xba,0x82,0x84,0x2e,0x23,0x21,0x20,0x52,0x74,0x2d,0xf3,0xfd,0x3c,0x3c,0x2c,0x8d,
- 0xf5,0x1d,0xbb,0xfd,0x8d,0xed,0xfc,0x18,0x6f,0x6f,0xb3,0xdb,0xf6,0xce,0x9c,0x9d,
- 0x99,0x39,0xe7,0x3c,0x23,0x47,0xcf,0x9c,0x61,0x5a,0x69,0x9f,0x9f,0x9f,0x0d,0x83,
- 0x91,0xb7,0x71,0x3a,0x65,0x00,0xd3,0x48,0x39,0x82,0x8a,0xa1,0x1d,0x41,0x45,0xed,
- 0x02,0x8a,0x32,0x00,0x56,0xed,0x71,0x7b,0x7b,0x1b,0x77,0x77,0x77,0xc1,0x62,0x29,
- 0x32,0x5c,0x5d,0x5d,0xe9,0xbd,0xf8,0xd8,0xa3,0x18,0x84,0x56,0xfc,0x69,0xa2,0xf5,
- 0x29,0xca,0x00,0x8a,0x32,0x80,0xa2,0x0c,0xa0,0x28,0x03,0x28,0xca,0x11,0x54,0xac,
- 0xaf,0xaf,0x2b,0x34,0x8d,0x16,0xe1,0x2f,0xfa,0x01,0x8a,0xdf,0xd4,0x4a,0x92,0x88,
- 0x3a,0xba,0x01,0x14,0xa7,0xa7,0xa7,0x41,0xd6,0x72,0x90,0x24,0x1a,0x73,0x42,0x0e,
- 0xb1,0xe5,0xe5,0x65,0xe5,0x2d,0xfc,0x41,0x47,0x50,0xb1,0xb2,0xb2,0xd2,0x22,0x42,
- 0xa2,0x94,0x24,0xb5,0x06,0x98,0x5d,0x77,0xd8,0xd7,0x3a,0x32,0xcc,0x2b,0xf5,0x0c,
- 0xe1,0x8a,0x32,0x97,0xb2,0x5a,0x49,0x84,0x29,0xca,0x1e,0x3a,0x3b,0x3b,0x8b,0xc3,
- 0xc3,0xc3,0x40,0x5d,0xe4,0xcc,0x65,0xe1,0x0c,0x25,0xde,0xa3,0x0c,0xa7,0x80,0xf7,
- 0xf7,0xf7,0xe0,0x5e,0xe5,0xfe,0xfe,0x3e,0xaf,0x89,0xcc,0x3f,0xcf,0xe2,0x8d,0x00,
- 0x39,0xdd,0x61,0x3f,0xbc,0x4d,0x8e,0x81,0x65,0x6b,0xd6,0x0e,0xa6,0x32,0xa4,0x48,
- 0x3c,0x6d,0x9b,0x9b,0x9b,0xbe,0x9f,0xcc,0x2e,0x92,0xc0,0xc5,0x90,0x9f,0xd8,0xfd,
- 0xff,0x9c,0x25,0x95,0xd7,0x44,0xe6,0x9f,0xc7,0x2c,0x9c,0x01,0x24,0x75,0x87,0x6e,
- 0x30,0x6b,0x0c,0x2d,0x40,0x51,0x63,0xd1,0x51,0x09,0x03,0x90,0x20,0xd5,0x1d,0x2e,
- 0x63,0x5b,0x5d,0x5d,0x75,0x9d,0x32,0xa0,0xcc,0xc7,0xc7,0x47,0xbb,0xbe,0xbe,0xf6,
- 0xdf,0x6c,0x6b,0x6b,0x6b,0xba,0xa7,0x34,0x82,0x65,0x69,0x4d,0x64,0xe2,0x79,0x16,
- 0xdb,0x00,0x12,0xba,0xc3,0x5e,0x83,0x49,0xe8,0xfa,0xfc,0xfc,0x3c,0x53,0x8e,0x24,
- 0xd3,0x8d,0x32,0x8a,0x40,0x57,0xe7,0x24,0x92,0xa1,0x9c,0x5e,0x03,0x24,0x34,0x91,
- 0x89,0xe7,0x59,0x70,0x3f,0x00,0xba,0xc3,0x78,0x7a,0x7a,0x72,0xa8,0x5a,0xf0,0xcd,
- 0xd4,0xfc,0xe9,0xf9,0x54,0x59,0xc5,0x1d,0x98,0x37,0xf5,0xfe,0x59,0x76,0x0a,0x37,
- 0x37,0x37,0x41,0xc3,0x07,0xe8,0xba,0xb1,0xb1,0x11,0xa0,0x75,0x40,0x06,0x94,0x51,
- 0x4a,0xb1,0xf7,0xdf,0x65,0x24,0x08,0xc3,0x08,0xe3,0x2c,0xe6,0x78,0x7d,0x7d,0x0d,
- 0x48,0x3c,0xcf,0x82,0x6f,0x03,0xd1,0x14,0x38,0xa5,0xdc,0x08,0x8b,0x41,0x2c,0xeb,
- 0xea,0xc1,0xb0,0x1d,0x33,0xa0,0xce,0x37,0x86,0xb3,0x12,0x22,0x0d,0x7c,0x7d,0x7d,
- 0x85,0x41,0x5d,0xa4,0x45,0xdc,0x64,0x61,0x21,0xf9,0x43,0x4c,0x93,0x7e,0x1e,0x58,
- 0x8a,0x45,0x23,0xa1,0x3b,0x9c,0x37,0xfa,0xe6,0xcf,0x4e,0x4f,0x13,0xa9,0xd2,0x43,
- 0x7a,0xc5,0x72,0x04,0xe5,0x75,0x87,0xa3,0x93,0xd3,0x44,0x4e,0xa1,0x46,0x80,0xbe,
- 0xee,0x70,0x24,0xac,0x42,0x32,0x79,0x4d,0x64,0x8d,0x00,0x69,0xdd,0xe1,0x08,0x78,
- 0x61,0xf7,0xfd,0xfd,0x1d,0x06,0xf2,0x9a,0xc8,0x32,0x80,0xbc,0xee,0x70,0x00,0xb4,
- 0x3b,0x09,0x78,0x7b,0x7b,0xeb,0xcc,0xe5,0x09,0x4d,0xe4,0xe0,0x06,0xa0,0x68,0xd7,
- 0xe3,0xe3,0xa3,0x24,0xdb,0x7b,0x7b,0x7b,0xe1,0xc2,0x89,0x5e,0x81,0x83,0x23,0x76,
- 0x76,0x76,0x54,0x76,0x77,0x77,0x55,0xf8,0x9d,0x5c,0xb8,0x47,0x47,0x47,0x0a,0x94,
- 0x70,0xca,0x46,0x5c,0x5e,0x5e,0x06,0x7b,0xdc,0x60,0x5f,0x1b,0x34,0x98,0xc4,0x9e,
- 0x1d,0xd4,0x30,0x38,0x54,0x24,0xdd,0x66,0xd8,0xd4,0x41,0x11,0x78,0x06,0x2d,0x66,
- 0xd5,0xdf,0x1b,0x04,0x3d,0xa3,0xff,0x67,0x9c,0x46,0xc1,0xbd,0x5c,0xc8,0x66,0x7f,
- 0x7f,0x3f,0xd0,0x44,0x06,0xe8,0xb0,0x09,0x4e,0x37,0x0b,0x8e,0xf0,0x8d,0xad,0xad,
- 0xad,0xc0,0x13,0xa8,0x10,0xf5,0xc5,0xc5,0xc5,0x98,0xc1,0x20,0x3a,0xbd,0xe1,0x37,
- 0x97,0x53,0x86,0x8e,0x68,0x9c,0xbb,0xa7,0x42,0xa7,0xfb,0xda,0x2d,0xae,0x9b,0xf6,
- 0x7a,0x4e,0x00,0x91,0x63,0x85,0x86,0xd3,0xe7,0xcc,0xa0,0x3b,0x94,0x67,0xd0,0xaf,
- 0x63,0xa1,0xd8,0xfe,0x97,0x56,0x32,0xf1,0xfe,0x93,0x93,0x13,0xd5,0xd1,0x71,0xad,
- 0x07,0x1d,0x68,0x51,0xaa,0x0a,0x9d,0x9b,0xd6,0x44,0xe6,0x9f,0x47,0x88,0xf8,0x8d,
- 0x8e,0xe7,0xdb,0xd9,0x8e,0x8f,0x8f,0x1b,0xdf,0x6a,0x79,0xb3,0x26,0x0b,0x56,0xed,
- 0xeb,0xe4,0xcf,0xbd,0xfa,0x1f,0x85,0x50,0xac,0x3a,0x1f,0xa3,0x52,0x21,0xf0,0x22,
- 0x0f,0x19,0x9f,0x99,0xd0,0x1d,0x8e,0x86,0xda,0x4c,0xea,0x64,0x8e,0xb0,0x93,0x40,
- 0x35,0xaf,0x89,0x1c,0x23,0x25,0x4c,0x5a,0x41,0x9c,0x16,0x8d,0x28,0x58,0x3b,0x38,
- 0x38,0x98,0x57,0x51,0xc7,0xe3,0xf9,0xd2,0xe9,0x62,0x93,0x07,0x38,0xb1,0x9f,0x57,
- 0x43,0x30,0x12,0xe4,0x75,0x87,0xa2,0x58,0x8a,0x39,0x40,0xa4,0x4b,0xe1,0x56,0x0e,
- 0x57,0x0c,0x3a,0x64,0x5e,0x0e,0x11,0x39,0x6c,0xd0,0xf8,0x6b,0xdf,0xce,0x09,0x5e,
- 0x61,0x0c,0x75,0x3a,0xce,0x85,0xe1,0x30,0x8a,0x7f,0xeb,0x07,0xd0,0xc2,0xe5,0xe5,
- 0xe5,0x45,0xb1,0x6f,0x5c,0xab,0xba,0xf7,0xd6,0xa6,0xb5,0xd6,0x5d,0x69,0x83,0xeb,
- 0x74,0x05,0xff,0xac,0xab,0xeb,0xf1,0x9b,0xcb,0xa8,0xd8,0x0a,0x69,0x31,0xe7,0xd7,
- 0xf8,0x24,0x2f,0x46,0x1a,0x79,0xf6,0x98,0x02,0x82,0x29,0x40,0x75,0x22,0x4f,0x91,
- 0x9d,0xab,0x58,0x81,0xb7,0xf3,0xf3,0x73,0x0d,0xc7,0x84,0x5b,0x7f,0x14,0xe6,0x7e,
- 0x5f,0xbb,0xc5,0x75,0xbd,0xd7,0x33,0xcf,0xeb,0x1c,0xdf,0xed,0xed,0xed,0xc6,0xb6,
- 0x47,0x9f,0xe1,0x2b,0x53,0x81,0x16,0x93,0x04,0x57,0x14,0xde,0xe4,0x77,0x9a,0x37,
- 0x31,0x16,0x45,0xf7,0x1e,0x1e,0x1e,0x14,0x4a,0xfd,0xaf,0xbd,0x73,0x80,0xb5,0x2d,
- 0x87,0xc2,0x70,0xc7,0x7c,0xf6,0xbb,0x1a,0xdb,0xb6,0xad,0x60,0x3c,0xc1,0xd8,0x88,
- 0x86,0xe1,0x8d,0xed,0x0c,0xc3,0x61,0xcc,0xb1,0x1d,0x8c,0x6d,0xdb,0xf3,0x6c,0xf5,
- 0x7b,0xc9,0x9f,0xa4,0x3b,0xdd,0x39,0x7d,0xa7,0xe9,0x3e,0xf7,0xec,0xbb,0xfe,0x64,
- 0xa5,0x3d,0xdd,0x3c,0xfd,0x57,0xd7,0xaa,0x76,0xcb,0x37,0xfd,0x05,0x60,0x2e,0x00,
- 0xd3,0xce,0x4c,0x14,0x46,0xa8,0x0a,0x42,0x3d,0x60,0x28,0xa6,0x9a,0x90,0x98,0x7a,
- 0x4a,0x3d,0xa5,0x1f,0x4b,0x83,0x70,0x5c,0x92,0x31,0x90,0x63,0xd8,0x38,0xc1,0x42,
- 0x40,0x3e,0xed,0xd3,0xd2,0xe4,0x83,0x80,0x58,0x3f,0xd9,0xc1,0xb1,0xf4,0x3c,0x75,
- 0x01,0xde,0xc1,0x37,0xe3,0x1c,0x1d,0x3c,0x84,0xbd,0x06,0x4a,0xe8,0x57,0x46,0x71,
- 0x7e,0x25,0x91,0xf6,0xd6,0x01,0x20,0x81,0x3f,0xca,0xa7,0xe0,0x6f,0xbf,0xfd,0x76,
- 0x63,0xfd,0xe2,0x90,0x4c,0x89,0x87,0x68,0x9e,0x4f,0x88,0x25,0x20,0x8e,0xcf,0x27,
- 0x2c,0x05,0xba,0x5c,0x21,0x56,0xc2,0xca,0x60,0x28,0x21,0xbd,0x70,0xcc,0xaf,0xa3,
- 0x57,0x8e,0xa9,0xe1,0xbc,0x07,0x56,0xc7,0xef,0xac,0xa2,0x3a,0x4c,0xfb,0x14,0x80,
- 0x4c,0xf7,0xb3,0x69,0xe8,0xc5,0x6b,0x74,0x60,0x84,0x6e,0x51,0x9e,0x2d,0xb2,0x31,
- 0xfd,0x8a,0x13,0x72,0x0c,0x49,0x04,0xd6,0x23,0x20,0x54,0x71,0x48,0x65,0x82,0x08,
- 0x69,0x58,0x19,0xc8,0xa7,0x05,0xc3,0x72,0x72,0x6a,0x59,0xe8,0xf9,0x00,0xc5,0xe4,
- 0xfd,0x98,0xa0,0x01,0xf1,0x4c,0xcc,0xa0,0xd2,0xcb,0xbb,0x70,0x1d,0x4a,0xd0,0x1a,
- 0x05,0x10,0x01,0x74,0xbd,0x36,0x5d,0xcb,0x26,0xa3,0xe5,0xeb,0x45,0x3c,0x69,0x22,
- 0x5f,0x35,0x7f,0x08,0xc3,0x52,0x30,0xd4,0x8b,0xd2,0x40,0x2a,0x84,0x32,0xf2,0x47,
- 0xa9,0x25,0x8d,0xd2,0x0a,0x81,0xcc,0x10,0xf2,0xd3,0xa8,0x20,0x4a,0x56,0x86,0x38,
- 0x04,0x22,0x34,0x33,0x99,0xbc,0x11,0x90,0x28,0x05,0x40,0x81,0x68,0x71,0xd0,0x95,
- 0xcd,0xb7,0x01,0x0c,0xd5,0x72,0x2f,0xd2,0x7c,0x2f,0x23,0xd7,0xa8,0xe9,0xdb,0x2a,
- 0x05,0xc0,0xf4,0xf6,0x64,0xb1,0x63,0x99,0x7e,0x44,0xa4,0x4b,0x01,0xc8,0x78,0x32,
- 0xdd,0xaf,0xd9,0xc7,0x78,0x38,0x71,0xc8,0x83,0xd4,0xa0,0x29,0x8a,0x50,0x8a,0x21,
- 0x95,0x78,0x2a,0x20,0x53,0xf7,0x62,0xc5,0x53,0x2a,0xa0,0xbe,0x85,0xe2,0xce,0x3b,
- 0xef,0x3c,0xe7,0x27,0x9c,0xf2,0x2e,0x28,0x9c,0xf3,0xeb,0x13,0x42,0x3a,0xef,0xd3,
- 0xbe,0x3a,0x80,0x32,0x00,0x0d,0xf7,0xeb,0xff,0x37,0xdd,0x2c,0x0d,0x2c,0x80,0x94,
- 0x00,0x62,0x10,0x4a,0x3d,0x5f,0xd3,0x30,0xc8,0x03,0xc1,0x9d,0xfa,0x15,0xaa,0xf7,
- 0xd6,0xfd,0x24,0x58,0x07,0x14,0x84,0xf3,0x65,0x5d,0x28,0xf1,0xa4,0x33,0x18,0xe5,
- 0x97,0x92,0x67,0x65,0x71,0x8e,0x51,0x29,0x85,0x78,0x07,0xa4,0x60,0xfd,0x6a,0xfa,
- 0x85,0x8d,0x68,0x0b,0xc6,0x4a,0x3f,0xe4,0xe3,0x17,0x99,0x54,0xd8,0x24,0x18,0xab,
- 0xf7,0x1b,0x51,0x88,0x0c,0x85,0x10,0x87,0xe9,0x85,0x7c,0x99,0x5b,0x91,0x1a,0x90,
- 0xa9,0x50,0xd7,0xe8,0xb7,0xd2,0x20,0x8d,0xde,0x43,0x59,0x12,0x84,0xdf,0x31,0xa9,
- 0x27,0x36,0xde,0x81,0xa5,0xb4,0xfa,0xf3,0xd3,0x3a,0xc8,0x72,0x81,0xd5,0xe2,0xff,
- 0xfa,0xb1,0x05,0xee,0xd9,0x9d,0x05,0x20,0xb3,0x7a,0xd5,0xdc,0xc2,0x02,0xc8,0xec,
- 0x53,0x1a,0xfd,0x87,0x11,0xf8,0x70,0x7d,0xe9,0x12,0x25,0x15,0x42,0x25,0x90,0xc7,
- 0xf9,0x8a,0x13,0x4a,0xc8,0x90,0x14,0x2b,0xc4,0x7f,0xcf,0x21,0x38,0x83,0xd0,0x6e,
- 0x15,0x48,0xf9,0x45,0xef,0x29,0x8a,0xcd,0x6f,0xf2,0x46,0x2e,0x30,0xdd,0x02,0x90,
- 0xa9,0x7e,0x47,0x0d,0x2a,0x52,0x5a,0x5c,0xb9,0x09,0xf0,0xf2,0xf8,0x5d,0x2c,0x0f,
- 0xa5,0x57,0x04,0xe2,0xe3,0x51,0x08,0xe2,0xf2,0xf9,0x1c,0x23,0x44,0xc8,0x94,0x08,
- 0x01,0xe9,0xae,0xa1,0xfc,0xf9,0x65,0x15,0x48,0x95,0x64,0x2c,0xa4,0xf2,0x02,0x3c,
- 0xfa,0xe8,0xa3,0x2a,0x08,0xa4,0xa5,0x5b,0x00,0xbd,0x00,0x99,0xde,0x14,0x78,0x16,
- 0xcf,0xc4,0xb7,0xfb,0x0f,0x26,0xe4,0x93,0x35,0xf1,0x03,0xb3,0x9f,0xff,0x69,0x75,
- 0x79,0xc2,0x1b,0xaf,0x2f,0xe1,0xaa,0xfd,0x5c,0x05,0x0a,0x42,0x90,0x2e,0x57,0x40,
- 0x7a,0xdc,0x0a,0x24,0x28,0x00,0xd2,0x14,0xd4,0xfe,0xa6,0x94,0xf3,0x5c,0x2c,0x10,
- 0x69,0x94,0x78,0x90,0x5b,0xc2,0x0b,0x12,0x5a,0xbe,0xc4,0x47,0xce,0xa7,0x25,0x42,
- 0xab,0x84,0x3a,0x51,0xec,0x3a,0xf5,0xa4,0x4e,0x98,0x30,0x81,0x78,0x5f,0xcc,0x0a,
- 0x46,0x53,0x71,0x03,0x68,0x2d,0xca,0x90,0x91,0x81,0x79,0xc7,0x13,0x90,0xa7,0x90,
- 0x19,0xef,0x43,0xc1,0x20,0x7f,0x66,0xcd,0x9a,0x15,0xdc,0x2b,0xf6,0x7e,0xaa,0x4b,
- 0xf5,0xcd,0xb4,0x70,0xea,0x1e,0x32,0xf9,0x06,0x21,0xf9,0x4b,0xa3,0xaa,0x32,0x49,
- 0x5a,0x3a,0x2b,0xd8,0x20,0x72,0x43,0xa2,0x23,0xbf,0x4d,0x01,0x5a,0x48,0x3c,0xa2,
- 0xb8,0x10,0x4b,0x2b,0xa6,0x00,0x34,0x2d,0x68,0x76,0x98,0x94,0x11,0xa6,0x7d,0x47,
- 0x50,0x5b,0xd2,0xc3,0xb0,0xec,0x94,0x30,0x7c,0x0c,0x2f,0x48,0x65,0x24,0xb5,0x62,
- 0x44,0x73,0x05,0xe9,0xf8,0x82,0x54,0xfe,0x68,0xbb,0xf6,0x15,0x0a,0x74,0x06,0x31,
- 0xc8,0x15,0x83,0xee,0x59,0x7d,0x66,0xfc,0x78,0x21,0x0b,0x00,0x41,0x34,0xcf,0x34,
- 0x9a,0x46,0x88,0xf0,0x60,0x85,0x8a,0x83,0xbf,0xfe,0x5e,0xe4,0x96,0x2c,0x1f,0x70,
- 0xdb,0x4c,0x3a,0xc1,0xcb,0x89,0x0e,0xd9,0x76,0xb2,0x42,0xc4,0x8b,0x8f,0x6f,0xb9,
- 0xed,0x91,0xfe,0xdc,0x95,0xea,0x9f,0xaf,0x4a,0xf5,0x79,0x41,0x5a,0x81,0xf3,0x25,
- 0x75,0xd7,0xa7,0xfc,0x7f,0xc2,0xe4,0xe7,0x4b,0xf8,0xff,0xd4,0xe0,0x37,0xd4,0xff,
- 0x57,0x95,0xaf,0x98,0x05,0xf0,0xab,0x6d,0x24,0x0f,0x7f,0xfe,0xfd,0xcf,0x02,0x37,
- 0x77,0xe4,0x14,0x37,0x77,0x70,0x5f,0xe7,0x5f,0xd5,0xf9,0xac,0x71,0x80,0xc0,0xff,
- 0x24,0x0c,0xb0,0x62,0xf9,0x6f,0x2c,0xa7,0xc0,0xfd,0xfb,0xb7,0x04,0xe7,0x7f,0xc9,
- 0x9c,0x40,0x7e,0x7d,0x9a,0xe2,0x45,0x14,0x80,0x92,0xcf,0x88,0x58,0x0a,0xd0,0xe4,
- 0xb5,0x9b,0x4c,0x75,0xbb,0xec,0x75,0xa4,0xdb,0xa8,0x23,0xa1,0x90,0xbf,0xc4,0xad,
- 0x5e,0x33,0x0f,0x05,0x23,0xe3,0x73,0x08,0xeb,0x5b,0x97,0x41,0x3b,0x9f,0xee,0xf0,
- 0xf8,0x54,0xf7,0xfa,0x52,0xae,0x74,0x42,0xc5,0x4b,0x28,0x00,0x3d,0x4b,0x98,0xa9,
- 0xa4,0xce,0x8c,0xff,0xe7,0xcd,0x77,0x7b,0x1d,0x74,0xa1,0x9b,0x39,0x94,0xb6,0x4a,
- 0xc6,0xd7,0x9f,0xbe,0xe9,0x26,0x6c,0xbd,0x9a,0xfb,0xa7,0x76,0xa6,0x60,0x29,0x82,
- 0xe7,0x2b,0x2c,0xdf,0x59,0x53,0xe4,0x7e,0x9a,0x0d,0x95,0x66,0x01,0xe2,0xc7,0x8a,
- 0xba,0x00,0x4a,0x3f,0x95,0xbf,0xa4,0x3f,0xb8,0x6a,0xed,0x96,0x6e,0xbb,0xdd,0xf6,
- 0x71,0x13,0xa6,0x4c,0x8c,0xa9,0x3f,0x17,0x10,0x3a,0xb0,0x64,0xd1,0x3c,0xf7,0xc3,
- 0x97,0x2f,0xb9,0x99,0x33,0xa6,0xa7,0x29,0x58,0x01,0xf4,0xb8,0x7b,0x19,0xd3,0x4f,
- 0xe9,0x97,0xfb,0x4b,0xb7,0x00,0x21,0xf9,0x65,0x15,0x40,0x93,0x20,0x92,0xb0,0x66,
- 0x99,0xfb,0xfa,0x93,0x57,0xdd,0xc0,0x0e,0x7b,0x05,0x99,0x53,0xad,0x02,0x2c,0x5e,
- 0xf0,0x8f,0xfb,0xf2,0x83,0x17,0xdc,0xa4,0xad,0x56,0x78,0xe5,0xda,0xba,0xbc,0xc9,
- 0x2f,0x74,0xbf,0x9c,0xe7,0x51,0xea,0x7f,0xf8,0xe1,0x07,0x92,0x89,0xeb,0x58,0xf2,
- 0xb0,0x70,0x24,0xad,0x8c,0x02,0xa0,0xa1,0xb8,0x81,0x14,0x0c,0x0d,0xcc,0x72,0x7f,
- 0x7d,0xf3,0xb2,0xfb,0xe3,0xab,0x17,0x6b,0x4b,0x88,0xfa,0x14,0x66,0xae,0x9f,0xe8,
- 0x31,0xa1,0xe9,0x01,0x9b,0xc0,0x85,0x28,0x4e,0x98,0x8f,0xf4,0xe7,0x21,0xfe,0x83,
- 0x4f,0xea,0x4c,0x1d,0x09,0xcd,0xef,0x00,0xca,0x54,0x00,0x96,0x28,0xc5,0x05,0xf0,
- 0x69,0x16,0xa6,0x5a,0xa4,0x44,0x10,0x0c,0xea,0x44,0x50,0x74,0x00,0xa7,0xbc,0xcf,
- 0xce,0x9f,0x05,0xc4,0xa4,0x13,0x26,0xb2,0xb2,0xe2,0x57,0x75,0xc8,0x56,0x33,0x8d,
- 0x53,0xfa,0xfd,0xeb,0xd3,0x0b,0x35,0x03,0xd9,0x6b,0x1f,0x68,0xae,0x7e,0xea,0xc3,
- 0x9a,0xaf,0x64,0x35,0x72,0x7e,0xce,0xff,0x87,0x78,0x5a,0x3d,0x01,0xf9,0xca,0xdb,
- 0x84,0x0a,0x20,0xe7,0x05,0xef,0xa1,0x78,0xa9,0x3a,0x00,0x9d,0x40,0x9a,0x30,0x9a,
- 0xdc,0xec,0x50,0x66,0x25,0xa7,0xe7,0xfb,0xda,0x84,0x4a,0x53,0xde,0x00,0x4c,0xee,
- 0x71,0x08,0xd7,0x9c,0x44,0xde,0x2f,0x3f,0x5f,0x9a,0xa9,0x04,0xf2,0x62,0x68,0x2c,
- 0x12,0x4c,0x1f,0xcf,0xce,0x5c,0x83,0x20,0x05,0x49,0xb1,0x42,0x4a,0x8b,0x59,0xce,
- 0x66,0x46,0x03,0x35,0x6b,0x07,0x53,0xc6,0x43,0x0d,0xf9,0xf9,0xc9,0xac,0xa8,0x14,
- 0xff,0x1f,0x49,0xcf,0xe8,0x07,0xc8,0x34,0xb9,0x45,0x3f,0x90,0x30,0xa4,0x5a,0x83,
- 0x8c,0xe1,0xe0,0xd6,0xc0,0xe6,0x03,0x80,0xd6,0x29,0x80,0x21,0x7d,0x3e,0x80,0x59,
- 0x80,0xf6,0x2b,0x80,0xc2,0x68,0x85,0xb0,0xfd,0x16,0xc0,0x90,0x3e,0x1f,0xc0,0x14,
- 0xa0,0xa5,0xe4,0x27,0xa4,0xb5,0x4d,0x01,0x0c,0xa1,0xe9,0x4f,0xa8,0x03,0xb4,0x60,
- 0xb9,0x78,0x43,0xde,0x7c,0x80,0xf6,0x5b,0x00,0x6b,0x05,0x44,0x49,0x6f,0x9f,0x02,
- 0x18,0xa2,0xa6,0x3f,0x85,0x70,0x73,0x01,0xed,0xaf,0x00,0x8e,0xe3,0x8e,0x20,0xeb,
- 0x0d,0x14,0xac,0x23,0x68,0x1c,0x12,0xaf,0x79,0x03,0x4a,0xb3,0x7e,0x80,0x71,0xaa,
- 0x14,0xe5,0x46,0x03,0xf9,0x64,0xbb,0x3f,0x60,0x23,0x80,0xa4,0x87,0xf1,0x7c,0x05,
- 0xe8,0x93,0xb5,0xf8,0xad,0x22,0x68,0xcd,0x40,0x1b,0x18,0x1a,0x17,0xeb,0x03,0x18,
- 0x6c,0x3e,0x80,0x91,0x2f,0xd8,0x58,0x80,0x55,0x02,0x15,0x0f,0xd6,0x0c,0x54,0xfa,
- 0xf8,0x50,0x00,0x53,0x04,0x48,0x8f,0xc5,0xcd,0x05,0xb4,0x14,0xfa,0x96,0x50,0x02,
- 0xe9,0x92,0x60,0x6d,0xe5,0xf6,0x29,0x80,0x41,0x24,0x8b,0x68,0x91,0x1d,0x84,0xed,
- 0x55,0x00,0x43,0x95,0xf8,0x5a,0x61,0xff,0xe5,0xf6,0x29,0x80,0x21,0x20,0xbe,0xae,
- 0xf4,0x8f,0x8c,0x8c,0xb8,0xa3,0x8f,0x3e,0x5a,0x6b,0x14,0x65,0x29,0xc0,0x18,0x5b,
- 0xb1,0xcb,0xcc,0xbf,0x56,0x06,0xaf,0xf3,0xfb,0x2c,0xad,0xef,0xb7,0xd5,0xd5,0x2a,
- 0xeb,0xfa,0x82,0xbb,0x7b,0x05,0x60,0x4d,0x5a,0xc3,0xd8,0x40,0xb5,0xa4,0x57,0xdd,
- 0x81,0xdf,0x61,0xdc,0x5d,0x72,0xc9,0x25,0xac,0xdf,0x80,0x68,0xf3,0xab,0xee,0x14,
- 0x80,0x8b,0x90,0xbd,0xf7,0xde,0xdb,0xf5,0x1c,0x06,0x11,0x0e,0xd1,0x0a,0x83,0xb4,
- 0x53,0x4f,0x3d,0x15,0xbf,0xcf,0x0a,0xe2,0x6c,0x18,0xc1,0x2a,0xe2,0x5a,0xce,0xa7,
- 0x7b,0x05,0xc0,0x7c,0xb0,0x93,0x27,0x61,0xef,0x60,0xd0,0x3e,0x46,0xd5,0x5a,0x3e,
- 0x04,0xb3,0xa7,0xd1,0xd5,0x57,0x5f,0xed,0x76,0xdd,0x75,0x57,0xcc,0x3f,0x7b,0x07,
- 0x60,0xb5,0x51,0x00,0x2c,0x40,0x77,0x2e,0x40,0xe4,0x63,0x3e,0xb8,0xd1,0x69,0xa7,
- 0x9d,0xe6,0x7a,0x02,0x83,0xb6,0x81,0x09,0x9a,0x7f,0xfb,0xed,0xb7,0x1f,0x5b,0xd8,
- 0xb9,0x8b,0x2f,0xbe,0xd8,0xed,0xb8,0xe3,0x8e,0x70,0xc4,0x8a,0x2d,0xac,0x24,0x8e,
- 0x10,0xc7,0x05,0x68,0x9b,0xbc,0x8e,0x3d,0x81,0x2b,0x58,0xa6,0x27,0xa6,0x00,0x54,
- 0x24,0xd0,0xa2,0xdd,0x76,0xdb,0x8d,0xe5,0xcb,0x1a,0xda,0x3d,0xd4,0x20,0x68,0xbb,
- 0x5c,0xd5,0xc5,0x0e,0x3b,0xec,0x30,0x42,0xed,0x73,0xc8,0x67,0xf9,0x54,0xd2,0x59,
- 0xab,0x81,0xd2,0x0f,0xf1,0x84,0x90,0x0f,0x77,0x1d,0x4b,0x3f,0xdc,0xa3,0x1e,0x7f,
- 0xc7,0x2c,0x00,0xa5,0x1f,0xf2,0xb9,0x19,0x0f,0x38,0xf0,0xc0,0x03,0xf1,0x31,0xe6,
- 0x0e,0x1a,0x24,0x1f,0xa1,0x84,0x5f,0x76,0xd9,0x65,0xec,0xde,0xc6,0x76,0xfa,0x6c,
- 0x61,0x07,0xc9,0x28,0x02,0x3b,0xac,0x91,0xe6,0x86,0x87,0x87,0xdd,0xc0,0xc0,0x00,
- 0x8b,0x4c,0xc3,0x55,0x2a,0xf9,0xe0,0x6f,0x36,0x8d,0x7a,0xc6,0x47,0x4e,0x8d,0xf9,
- 0x1d,0xb6,0x1c,0x61,0x2f,0x7f,0xf6,0x0e,0xd4,0x26,0xce,0xa4,0x61,0x0d,0xbe,0xfa,
- 0xea,0x2b,0xf6,0xf8,0xe7,0xb7,0xcb,0x87,0x41,0x80,0x60,0x0a,0x1e,0x15,0xb9,0x7d,
- 0xf6,0xd9,0x47,0x3b,0xa2,0x51,0xda,0x49,0xc7,0xef,0x73,0x4e,0x20,0xa4,0x71,0x8c,
- 0x73,0x36,0x70,0x2f,0xc3,0x67,0x71,0x01,0x2f,0xc6,0x14,0x40,0x2e,0x00,0x0b,0x80,
- 0x69,0x41,0x21,0x00,0x3b,0x7a,0x70,0x8c,0x34,0x6d,0xe3,0x0e,0x08,0x0d,0xf9,0xeb,
- 0x1a,0x11,0x42,0xa0,0x88,0x17,0xe9,0xf0,0x00,0xd9,0x84,0xfc,0xc6,0xf4,0x73,0x4c,
- 0xdb,0xe2,0x89,0x78,0x24,0x15,0x70,0xbf,0xc9,0xe8,0xe8,0xe8,0xcf,0x3e,0x72,0x0b,
- 0x15,0xc2,0x48,0x33,0x10,0xb2,0x03,0xe1,0x41,0xda,0xae,0x4d,0xdb,0xba,0x21,0x68,
- 0x9f,0x49,0xd7,0xa2,0x3c,0x0c,0x08,0x97,0x5f,0xc7,0xdc,0x53,0xbb,0xc7,0xc4,0x63,
- 0x19,0x58,0xaa,0x9f,0xe3,0x28,0x41,0xa4,0xc3,0x27,0x15,0x0c,0x16,0x5c,0xbd,0xb1,
- 0xbf,0x08,0x05,0x78,0xcc,0x45,0xa0,0xbd,0x71,0x65,0x05,0xf0,0x33,0xf8,0x1b,0x09,
- 0xfe,0x67,0x70,0x70,0x10,0xe1,0x58,0x86,0x98,0x28,0x1f,0x11,0xf2,0x95,0xee,0x5c,
- 0x09,0x69,0xec,0x54,0x8e,0x02,0xd0,0xce,0x57,0x27,0x4f,0x97,0xc4,0x0b,0x8f,0xc1,
- 0xbd,0xe6,0x03,0xdc,0xe5,0xe5,0x1c,0x2f,0x93,0xaa,0x56,0x40,0x4a,0xa0,0x10,0xad,
- 0xa3,0xd9,0x41,0xed,0x94,0x95,0x2d,0xb5,0xac,0xa9,0x21,0x1f,0xca,0x6f,0xb9,0x5f,
- 0x44,0xd6,0x41,0x64,0xcb,0xbf,0x67,0x62,0x3e,0x9c,0x13,0xd1,0x9d,0x20,0x91,0xc6,
- 0xfe,0x13,0xb8,0xff,0x9a,0x31,0xe8,0xea,0x20,0x44,0xc1,0x3a,0x80,0xd5,0x01,0xe4,
- 0x6e,0x09,0x11,0xd2,0x91,0x4c,0xc8,0xf4,0x9f,0xe5,0xef,0xf5,0x8c,0x14,0x40,0x80,
- 0xc4,0x6b,0x7c,0x70,0x4f,0x8d,0x12,0xe8,0x9c,0x40,0x0c,0x45,0x94,0x21,0x90,0x00,
- 0xf9,0xe4,0xdf,0xe0,0xef,0xf9,0x80,0xab,0x03,0x96,0xc0,0xcb,0xbc,0xb5,0x6d,0x83,
- 0x61,0x1e,0xdc,0xa6,0x4e,0x39,0x1a,0xf0,0xf2,0x90,0x97,0x55,0x96,0x6f,0x7d,0x0f,
- 0x38,0x84,0xcb,0x81,0x6e,0xe6,0x9e,0x0d,0x79,0xb9,0x8d,0xce,0x22,0x2f,0xbf,0x78,
- 0x59,0x6e,0xf9,0x39,0xe6,0xb1,0x1c,0xae,0xe0,0x0c,0xee,0xe0,0xd0,0xd5,0xc3,0xad,
- 0x03,0x63,0x75,0xc1,0xae,0xdd,0xd9,0xb0,0x20,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,
- 0x44,0xae,0x42,0x60,0x82,
+ 0xcb,0x00,0x00,0x04,0x19,0x69,0x43,0x43,0x50,0x6b,0x43,0x47,0x43,0x6f,0x6c,0x6f,
+ 0x72,0x53,0x70,0x61,0x63,0x65,0x47,0x65,0x6e,0x65,0x72,0x69,0x63,0x52,0x47,0x42,
+ 0x00,0x00,0x38,0x8d,0x8d,0x55,0x5d,0x68,0x1c,0x55,0x14,0x3e,0xbb,0x73,0x67,0x23,
+ 0x24,0xce,0x53,0x6c,0x34,0x85,0x74,0xa8,0x3f,0x0d,0x25,0x0d,0x93,0x56,0x34,0xa1,
+ 0xb4,0xba,0x7f,0xdd,0xdd,0x36,0x6e,0x96,0x49,0x36,0xda,0x22,0xe8,0x64,0xf6,0xee,
+ 0xce,0x98,0xc9,0xce,0x38,0x33,0xbb,0xfd,0xa1,0x4f,0x45,0x50,0x7c,0x31,0xea,0x9b,
+ 0x14,0xc4,0xbf,0xb7,0x80,0x20,0x28,0xf5,0x0f,0xdb,0x3e,0xb4,0x2f,0x95,0x0a,0x25,
+ 0xda,0xd4,0x20,0x28,0x3e,0xb4,0xf8,0x83,0x50,0xe8,0x8b,0xa6,0xeb,0x99,0x3b,0x33,
+ 0x99,0x69,0xba,0xb1,0xde,0x65,0xee,0x7c,0xf3,0x9d,0xef,0x9e,0x7b,0xee,0xb9,0x67,
+ 0xef,0x05,0xe8,0xb9,0xaa,0x58,0x96,0x91,0x14,0x01,0x16,0x9a,0xae,0x2d,0x17,0x32,
+ 0xe2,0x73,0x87,0x8f,0x88,0x3d,0x2b,0x90,0x84,0x87,0xa0,0x17,0x06,0xa1,0x57,0x51,
+ 0x1d,0x2b,0x5d,0xa9,0x4c,0x02,0x36,0x4f,0x0b,0x77,0xb5,0x5b,0xdf,0x43,0xc2,0x7b,
+ 0x5f,0xd9,0xd5,0xdd,0xfe,0x9f,0xad,0xb7,0x46,0x1d,0x15,0x20,0x71,0x1f,0x62,0xb3,
+ 0xe6,0xa8,0x0b,0x88,0x8f,0x01,0xf0,0xa7,0x55,0xcb,0x76,0x01,0x7a,0xfa,0x91,0x1f,
+ 0x3f,0xea,0x5a,0x1e,0xf6,0x62,0xe8,0xb7,0x31,0x40,0xc4,0x2f,0x7a,0xb8,0xe1,0x63,
+ 0xd7,0xc3,0x73,0x3e,0x7e,0x8d,0x69,0x66,0xe4,0x2c,0xe2,0xd3,0x88,0x05,0x55,0x53,
+ 0x6a,0x88,0x97,0x10,0x8f,0xcc,0xc5,0xf8,0x46,0x0c,0xfb,0x31,0xb0,0xd6,0x5f,0xa0,
+ 0x4d,0x6a,0xeb,0xaa,0xe8,0xe5,0xa2,0x62,0x9b,0x75,0xdd,0xa0,0xb1,0x70,0xef,0x61,
+ 0xfe,0x9f,0x6d,0xc1,0x68,0x85,0xf3,0x6d,0xc3,0xa7,0xcf,0x99,0x9f,0x3e,0x84,0xef,
+ 0x61,0x5c,0xfb,0x2b,0x35,0x25,0xe7,0xe1,0x51,0xc4,0x4b,0xaa,0x92,0x9f,0x46,0xfc,
+ 0x08,0xe2,0x6b,0x6d,0x7d,0xb6,0x1c,0xe0,0xdb,0x96,0x9b,0x91,0x11,0x3f,0x06,0x90,
+ 0xdc,0xde,0x9a,0xaf,0xa6,0x11,0xef,0x44,0x5c,0xac,0xdb,0x07,0xaa,0xbe,0x9f,0xa4,
+ 0xad,0xb5,0x8a,0x21,0x7e,0xe7,0x84,0x36,0xf3,0x2c,0xe2,0x2d,0x88,0xcf,0x37,0xe7,
+ 0xca,0x53,0xc1,0xd8,0xab,0xaa,0x93,0xc5,0x9c,0xc1,0x76,0xc4,0xb7,0x35,0x5a,0xf2,
+ 0xf2,0x3b,0x04,0xc0,0x89,0xba,0x5b,0x9a,0xf1,0xc7,0x72,0xfb,0x6d,0x53,0x9e,0xf2,
+ 0xe7,0xe5,0xea,0x35,0x9a,0xcb,0x7b,0x79,0x44,0xfc,0xfa,0xbc,0x79,0x48,0xf6,0x7d,
+ 0x72,0x9f,0x39,0xed,0xe9,0x7c,0xe8,0xf3,0x84,0x96,0x2d,0x07,0xfc,0xa5,0x97,0x94,
+ 0x83,0x15,0xc4,0x83,0x88,0x7f,0xa1,0x46,0x41,0xf6,0xe7,0xe2,0xfe,0xb1,0xdc,0x4a,
+ 0x10,0x03,0x19,0x6a,0x1a,0xe5,0x49,0x7f,0x2e,0x92,0xa3,0x0e,0x5b,0x2f,0xe3,0x5d,
+ 0x6d,0xa6,0xe8,0xcf,0x4b,0x0c,0x17,0x37,0xd4,0x1f,0x4b,0x16,0xeb,0xfa,0x81,0x52,
+ 0xa0,0xff,0x44,0xb3,0x8b,0x72,0x80,0xaf,0x59,0x06,0xab,0x51,0x8c,0x8d,0x4f,0xda,
+ 0x2d,0xb9,0xea,0xeb,0xf9,0x51,0xc5,0xce,0x17,0x7c,0x9f,0x7c,0x85,0x36,0xab,0x81,
+ 0x7f,0xbe,0x0d,0xb3,0x09,0x05,0x28,0x98,0x30,0x87,0xbd,0x0a,0x4d,0x58,0x03,0x11,
+ 0x64,0x28,0x40,0x06,0xdf,0x16,0xd8,0x68,0xa9,0x83,0x0e,0x06,0x32,0x14,0xad,0x14,
+ 0x19,0x8a,0x5f,0xa1,0x66,0x17,0x1b,0xe7,0xc0,0x3c,0xf2,0x3a,0xb4,0x99,0xcd,0xc1,
+ 0xbe,0xc2,0x94,0xfe,0xc8,0xc8,0x5f,0x83,0xf9,0xb8,0xce,0xb4,0x2a,0x64,0x87,0x3e,
+ 0x82,0x16,0xb2,0x1a,0xfc,0x8e,0xac,0x16,0xd3,0x65,0xf1,0xab,0x85,0x5c,0x63,0x13,
+ 0x3f,0x7e,0x2c,0x37,0x02,0x3f,0x26,0x19,0x20,0x12,0xd9,0x83,0xcf,0x5e,0x32,0x49,
+ 0xf6,0x91,0x71,0x32,0x01,0x22,0x79,0x8a,0x3c,0x4d,0xf6,0x93,0x1c,0xb2,0x13,0x64,
+ 0xef,0xfa,0xd8,0x4a,0x6c,0x45,0x5e,0x3c,0x37,0xd6,0xfd,0xbc,0x8c,0x33,0x52,0xa6,
+ 0x9b,0x45,0xdd,0x39,0xb4,0xbb,0xa0,0x60,0xff,0x33,0x2a,0x4c,0x5c,0x53,0xd7,0xac,
+ 0x2c,0x0e,0xb6,0x86,0x23,0xcb,0x29,0xfb,0x05,0x5d,0xbd,0xfc,0xc6,0x5f,0xb1,0x5c,
+ 0xe9,0x2c,0x37,0x51,0xb6,0xe2,0x19,0x9d,0xba,0x57,0xce,0xf9,0x5f,0xf9,0xeb,0xfc,
+ 0x32,0xf6,0x2b,0xfc,0x6a,0xa4,0xe0,0x7f,0xe4,0x57,0xf1,0xb7,0x72,0xc7,0x5a,0xcc,
+ 0xbb,0xb2,0x4c,0xc3,0xec,0x6c,0x58,0x73,0x77,0x55,0x1a,0x6d,0x06,0xe3,0x16,0xf0,
+ 0xd1,0x99,0xc5,0x89,0xc5,0x1d,0xf3,0x71,0xf1,0xe4,0x57,0x0f,0x46,0x7e,0x96,0xc9,
+ 0x99,0xe7,0xaf,0xf4,0x5d,0x3c,0x59,0x6f,0x2e,0x0e,0x46,0xac,0x97,0x05,0xfa,0x6a,
+ 0xf9,0x56,0x19,0x4e,0x8d,0x44,0xac,0xf4,0x83,0xf4,0x87,0xb4,0x2c,0xbd,0x27,0x7d,
+ 0x28,0xfd,0xc6,0xbd,0xcd,0x7d,0xca,0x7d,0xcd,0x7d,0xce,0x7d,0xc1,0x5d,0x02,0x91,
+ 0x3b,0xcb,0x9d,0xe3,0xbe,0xe1,0x2e,0x70,0x1f,0x73,0x5f,0xc6,0xf6,0x6a,0xf3,0x1a,
+ 0x5a,0xdf,0x7b,0x16,0x79,0x18,0xb7,0x67,0xe9,0x96,0x6b,0xac,0x4a,0x21,0x23,0x6c,
+ 0x15,0x1e,0x16,0x72,0xc2,0x36,0xe1,0x51,0x61,0x32,0xf2,0x27,0x0c,0x08,0x63,0x42,
+ 0x51,0xd8,0x81,0x96,0xad,0xeb,0xfb,0x16,0x9f,0x2f,0x9e,0x3d,0x1d,0x0e,0x63,0x1f,
+ 0xe6,0xa7,0xfb,0x5c,0xbe,0x2e,0x56,0x01,0x89,0xfb,0xb1,0x02,0xf4,0x4d,0xfe,0x55,
+ 0x55,0x54,0xe9,0x70,0x94,0x29,0x1d,0x56,0x6f,0x4d,0x38,0xbe,0x41,0x13,0x8c,0x24,
+ 0x43,0x64,0x8c,0x94,0x36,0x54,0xf7,0xb8,0x57,0xf3,0xa1,0x22,0x95,0x4f,0xe5,0x52,
+ 0x69,0x10,0x53,0x3b,0x53,0x13,0xa9,0xb1,0xd4,0x41,0x0f,0x87,0xb3,0xa6,0x76,0xa0,
+ 0x6d,0x02,0xfb,0xfc,0x1d,0xd5,0xa9,0x6e,0xb2,0x52,0xea,0xd2,0x63,0xde,0x7d,0x02,
+ 0x59,0xd3,0x3a,0x6e,0xeb,0x0d,0xcd,0x15,0x77,0x4b,0xd2,0x93,0x62,0x1a,0xaf,0x36,
+ 0x2a,0x96,0x9a,0xea,0xe8,0x88,0xa8,0x18,0x86,0xc8,0x4c,0x8e,0x68,0x53,0x87,0xda,
+ 0x6d,0x5a,0x1b,0x05,0xef,0xde,0xf4,0x8f,0xf4,0x9b,0x32,0xbb,0x0f,0x13,0x5b,0x2e,
+ 0x47,0x9c,0xfb,0x0c,0xc0,0xbe,0x3f,0xf1,0xec,0xfb,0x2e,0xe2,0x8e,0xb4,0x00,0x96,
+ 0x1c,0x80,0x81,0xc7,0x23,0x6e,0x18,0xcf,0xca,0x07,0xde,0x05,0x38,0xf3,0x84,0xda,
+ 0xb2,0xdb,0xc1,0x1d,0x91,0x48,0x7c,0x0b,0xe0,0xd4,0xf7,0xec,0xf6,0xbf,0xfa,0x32,
+ 0x78,0x7e,0xfd,0xd4,0xe9,0xdc,0xc4,0x73,0xac,0xe7,0x2d,0x80,0xb5,0x37,0x3b,0x9d,
+ 0xbf,0xdf,0xef,0x74,0xd6,0x3e,0x40,0xff,0xab,0x00,0x67,0x8d,0x7f,0x01,0xa0,0x9f,
+ 0x7c,0x55,0x03,0x5c,0x0b,0xef,0x00,0x00,0x00,0x38,0x65,0x58,0x49,0x66,0x4d,0x4d,
+ 0x00,0x2a,0x00,0x00,0x00,0x08,0x00,0x01,0x87,0x69,0x00,0x04,0x00,0x00,0x00,0x01,
+ 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x00,0x00,0x02,0xa0,0x02,0x00,0x04,0x00,0x00,
+ 0x00,0x01,0x00,0x00,0x00,0x80,0xa0,0x03,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x80,0x00,0x00,0x00,0x00,0x6b,0x46,0x26,0x4d,0x00,0x00,0x03,0x62,0x69,0x54,
+ 0x58,0x74,0x58,0x4d,0x4c,0x3a,0x63,0x6f,0x6d,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e,
+ 0x78,0x6d,0x70,0x00,0x00,0x00,0x00,0x00,0x3c,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65,
+ 0x74,0x61,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x78,0x3d,0x22,0x61,0x64,0x6f,0x62,
+ 0x65,0x3a,0x6e,0x73,0x3a,0x6d,0x65,0x74,0x61,0x2f,0x22,0x20,0x78,0x3a,0x78,0x6d,
+ 0x70,0x74,0x6b,0x3d,0x22,0x58,0x4d,0x50,0x20,0x43,0x6f,0x72,0x65,0x20,0x35,0x2e,
+ 0x34,0x2e,0x30,0x22,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x52,0x44,
+ 0x46,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x72,0x64,0x66,0x3d,0x22,0x68,0x74,0x74,
+ 0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x77,0x33,0x2e,0x6f,0x72,0x67,0x2f,0x31,
+ 0x39,0x39,0x39,0x2f,0x30,0x32,0x2f,0x32,0x32,0x2d,0x72,0x64,0x66,0x2d,0x73,0x79,
+ 0x6e,0x74,0x61,0x78,0x2d,0x6e,0x73,0x23,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x3c,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x69,0x6f,
+ 0x6e,0x20,0x72,0x64,0x66,0x3a,0x61,0x62,0x6f,0x75,0x74,0x3d,0x22,0x22,0x0a,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,
+ 0x3a,0x64,0x63,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x70,0x75,0x72,0x6c,
+ 0x2e,0x6f,0x72,0x67,0x2f,0x64,0x63,0x2f,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73,
+ 0x2f,0x31,0x2e,0x31,0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x49,0x70,0x74,0x63,0x34,0x78,0x6d,
+ 0x70,0x45,0x78,0x74,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x69,0x70,0x74,
+ 0x63,0x2e,0x6f,0x72,0x67,0x2f,0x73,0x74,0x64,0x2f,0x49,0x70,0x74,0x63,0x34,0x78,
+ 0x6d,0x70,0x45,0x78,0x74,0x2f,0x32,0x30,0x30,0x38,0x2d,0x30,0x32,0x2d,0x32,0x39,
+ 0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,
+ 0x6d,0x6c,0x6e,0x73,0x3a,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3d,0x22,
+ 0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6e,0x73,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e,
+ 0x63,0x6f,0x6d,0x2f,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x2f,0x31,0x2e,
+ 0x30,0x2f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,
+ 0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x53,0x65,0x71,0x3e,
+ 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x4d,0x69,0x63,0x68,0x61,0x65,0x6c,0x20,
+ 0x53,0x77,0x65,0x65,0x74,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,
+ 0x3a,0x53,0x65,0x71,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
+ 0x2f,0x64,0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,0x74,0x73,
+ 0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,
+ 0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x20,0x78,
+ 0x6d,0x6c,0x3a,0x6c,0x61,0x6e,0x67,0x3d,0x22,0x78,0x2d,0x64,0x65,0x66,0x61,0x75,
+ 0x6c,0x74,0x22,0x3e,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x32,0x30,
+ 0x31,0x30,0x20,0x41,0x70,0x70,0x6c,0x65,0x20,0x49,0x6e,0x63,0x2e,0x3c,0x2f,0x72,
+ 0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,
+ 0x74,0x73,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x70,
+ 0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,
+ 0x6e,0x65,0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x49,0x70,
+ 0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,
+ 0x6e,0x65,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x68,
+ 0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,
+ 0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x70,0x68,0x6f,0x74,
+ 0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,0x3e,0x0a,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,
+ 0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,
+ 0x66,0x3a,0x52,0x44,0x46,0x3e,0x0a,0x3c,0x2f,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65,
+ 0x74,0x61,0x3e,0x0a,0xa0,0x50,0x98,0x64,0x00,0x00,0x13,0xdb,0x49,0x44,0x41,0x54,
+ 0x78,0xda,0xed,0x9d,0x07,0x90,0x55,0x35,0x17,0xc7,0xd7,0x5e,0xc7,0xde,0xd7,0x55,
+ 0xec,0xbd,0x0b,0x0a,0x28,0x88,0x88,0xae,0x05,0x7b,0xd7,0xc1,0xbe,0x2a,0x28,0x22,
+ 0xba,0xe8,0x88,0x8d,0xcf,0x82,0x34,0xa5,0x0a,0xa2,0x28,0xae,0xa8,0x58,0x41,0x71,
+ 0x64,0x11,0x07,0xc5,0x2e,0xa2,0xa0,0xa8,0xe8,0x88,0xd8,0x16,0x15,0xb0,0x20,0x56,
+ 0x14,0xcd,0xb7,0xbf,0xb8,0xe7,0x9a,0xcd,0xe6,0xbe,0x77,0xef,0x6b,0xbb,0xdc,0x97,
+ 0xcc,0xfc,0x27,0xf7,0xdd,0x92,0x77,0x6f,0xce,0x3f,0x27,0x27,0xc9,0x49,0x52,0x52,
+ 0x92,0x22,0x28,0xa5,0xca,0x6a,0x51,0x59,0x8b,0xea,0x5a,0xd4,0xd4,0x62,0x89,0xf2,
+ 0xa1,0xa9,0x87,0x25,0x75,0xb2,0xaa,0xae,0x93,0x5d,0x59,0x49,0xdc,0x50,0xfb,0x50,
+ 0x69,0x2d,0xaa,0x6a,0xb1,0xd4,0xe7,0xe7,0x32,0x1f,0x96,0xd6,0xc9,0xb2,0x34,0xaa,
+ 0xf0,0xcb,0x6b,0xb1,0xc8,0xe7,0x5b,0xe2,0x02,0x32,0x2d,0x4f,0x27,0xfc,0x0a,0x5f,
+ 0xea,0x13,0xaf,0x0d,0x2a,0x52,0x95,0x7c,0x2f,0xfc,0xe2,0x20,0x41,0xb9,0xab,0xce,
+ 0xf7,0x6a,0xbf,0xb8,0xaa,0x83,0x52,0x93,0x00,0x55,0xf6,0x1d,0x7b,0xee,0xb9,0xa7,
+ 0xda,0x7c,0xf3,0xcd,0xd5,0x4d,0x37,0xdd,0xe4,0xb3,0x2b,0x99,0xa1,0xca,0x6c,0xea,
+ 0x35,0x50,0xfd,0x1b,0x6c,0xb0,0x81,0xe2,0xf2,0xe5,0x97,0x5f,0xee,0xb3,0x2a,0xb9,
+ 0x55,0x41,0x59,0x49,0x5d,0x5b,0xb1,0x41,0xe8,0xd1,0xa3,0x87,0xba,0xe8,0xa2,0x8b,
+ 0xd4,0x13,0x4f,0x3c,0xe1,0xb3,0x2a,0xb9,0xa1,0xb2,0xa4,0xae,0xc3,0xc0,0x87,0xe2,
+ 0x0c,0xd5,0x10,0xa0,0xc6,0x75,0x65,0xe8,0xd0,0xa1,0xaa,0x4f,0x9f,0x3e,0xea,0xc5,
+ 0x17,0x5f,0xac,0x77,0x7e,0xe6,0xcc,0x99,0xfa,0x7c,0xdf,0xbe,0x7d,0xd5,0x9f,0x7f,
+ 0xfe,0xa9,0xe6,0xcf,0x9f,0xaf,0xaa,0xaa,0xaa,0x54,0xa7,0x4e,0x9d,0xd4,0x29,0xa7,
+ 0x9c,0xa2,0xfa,0xf5,0xeb,0xa7,0xe6,0xcd,0x9b,0xa7,0xd2,0xa5,0xf9,0xcf,0x3f,0xff,
+ 0xa8,0x57,0x5f,0x7d,0x55,0xdd,0x78,0xe3,0x8d,0xea,0xa8,0xa3,0x8e,0xd2,0x55,0xcd,
+ 0xd3,0x4f,0x3f,0x9d,0xf2,0x6d,0xbf,0xfc,0xf2,0x4b,0x75,0xfb,0xed,0xb7,0xab,0xd3,
+ 0x4e,0x3b,0x4d,0x1d,0x77,0xdc,0x71,0xda,0x3e,0xf9,0xe4,0x93,0x4f,0xea,0xdd,0x33,
+ 0x78,0xf0,0x60,0xfd,0x1f,0xcf,0x3d,0xf7,0x5c,0x68,0x3a,0xcf,0x3f,0xff,0xbc,0xbe,
+ 0x67,0xf4,0xe8,0xd1,0x0d,0xae,0x8d,0x1f,0x3f,0x5e,0x5d,0x79,0xe5,0x95,0xaa,0xbc,
+ 0xbc,0x5c,0x5d,0x7c,0xf1,0xc5,0xea,0xc1,0x07,0x1f,0xd4,0xef,0x9a,0xd0,0x50,0x03,
+ 0x01,0x9c,0xdd,0xbb,0x61,0x36,0x00,0x42,0xe4,0x3c,0x80,0x0c,0x9b,0x6c,0xb2,0x49,
+ 0xf0,0x5b,0xc0,0xb9,0xd7,0x5e,0x7b,0x2d,0x65,0x9a,0x57,0x5d,0x75,0x55,0x83,0xe7,
+ 0xc0,0xf9,0xe7,0x9f,0xaf,0x89,0xd5,0x80,0xaa,0xd5,0xd5,0x6a,0xbd,0xf5,0xd6,0x6b,
+ 0x70,0xff,0xda,0x6b,0xaf,0xad,0xaf,0x49,0x40,0x70,0x9c,0xdf,0x76,0xdb,0x6d,0x43,
+ 0xbf,0x7a,0xfb,0xed,0xb7,0xd7,0xf7,0x74,0xee,0xdc,0x39,0x38,0xf7,0xf3,0xcf,0x3f,
+ 0x6b,0x02,0xbb,0xde,0x09,0xb2,0xfd,0xf6,0xdb,0x6f,0x49,0x24,0xc0,0x92,0x92,0xb0,
+ 0x2b,0x51,0x08,0xb0,0xe9,0xa6,0x9b,0xaa,0xe5,0x97,0x5f,0x5e,0xb5,0x68,0xd1,0x42,
+ 0x67,0x66,0xbb,0x76,0xed,0x82,0x6b,0x65,0x65,0x65,0x6a,0xc9,0x92,0x25,0xce,0x34,
+ 0xd7,0x59,0x67,0x1d,0x1d,0xf3,0x9b,0x4c,0x3f,0xef,0xbc,0xf3,0x82,0x6b,0xe0,0xce,
+ 0x3b,0xef,0xac,0xf7,0xdc,0x87,0x1f,0x7e,0xa8,0x56,0x58,0x61,0x05,0x7d,0xed,0xd0,
+ 0x43,0x0f,0x55,0x13,0x26,0x4c,0x50,0x4f,0x3e,0xf9,0xa4,0xda,0x7d,0xf7,0xdd,0xf5,
+ 0xb9,0x0d,0x37,0xdc,0x30,0x10,0xd0,0xc3,0x0f,0x3f,0x1c,0xa4,0x83,0x86,0xb1,0xc3,
+ 0x4b,0x2f,0xbd,0x14,0x5c,0x9f,0x31,0x63,0x46,0x70,0xfe,0xf4,0xd3,0x4f,0xd7,0xe7,
+ 0xd6,0x5c,0x73,0x4d,0xad,0x65,0xd0,0x12,0xd7,0x5e,0x7b,0x6d,0xf0,0xbf,0x68,0xb6,
+ 0x24,0x86,0xac,0x08,0x40,0xe9,0x9b,0x34,0x69,0x52,0xbd,0xeb,0x10,0x41,0xae,0xdf,
+ 0x75,0xd7,0x5d,0xce,0x34,0xc1,0x09,0x27,0x9c,0xa0,0x7e,0xfd,0xf5,0xd7,0xe0,0x1a,
+ 0xaa,0x7c,0xad,0xb5,0xd6,0x0a,0xc8,0xf3,0xd7,0x5f,0x7f,0x05,0xd7,0x8e,0x3c,0xf2,
+ 0x48,0x7d,0x7e,0xe7,0x9d,0x77,0x56,0x4b,0x97,0xfe,0xd7,0x60,0xf9,0xfa,0xeb,0xaf,
+ 0xd5,0xca,0x2b,0xaf,0xac,0xaf,0x0d,0x1b,0x36,0x4c,0x9f,0xfb,0xfd,0xf7,0xdf,0xf5,
+ 0x7b,0x71,0xee,0xc2,0x0b,0x2f,0x6c,0xf0,0x5d,0x67,0x9d,0x75,0x96,0xbe,0xd6,0xbc,
+ 0x79,0xf3,0xe0,0xdc,0xb4,0x69,0xd3,0xd4,0x72,0xcb,0x2d,0xa7,0xcf,0x43,0x20,0x33,
+ 0x5c,0x72,0xc9,0x25,0x01,0xd9,0xcd,0x77,0xf2,0x04,0xa8,0xc5,0x3b,0xef,0xbc,0xd3,
+ 0xe0,0x39,0xea,0x7f,0x29,0x35,0x67,0x9e,0x79,0xa6,0x33,0xcd,0x63,0x8f,0x3d,0xd6,
+ 0x59,0xaf,0xd2,0xea,0x90,0xb4,0xe7,0xcc,0x99,0xa3,0xcf,0x2d,0x5c,0xb8,0x30,0x38,
+ 0xd7,0xbf,0x7f,0xff,0x06,0xcf,0xb4,0x6e,0xdd,0x5a,0x5f,0xc3,0x06,0x91,0x50,0x51,
+ 0x51,0x11,0x68,0x9a,0x3f,0xfe,0xf8,0x23,0x38,0xff,0xd3,0x4f,0x3f,0xa9,0xd5,0x57,
+ 0x5f,0x5d,0x5f,0x1b,0x39,0x72,0x64,0x03,0x21,0x43,0x40,0xfb,0xbd,0x26,0x4f,0x9e,
+ 0x1c,0xfc,0xff,0xdc,0xb9,0x73,0x3d,0x01,0x4c,0x02,0x90,0xa1,0xae,0xb0,0xc5,0x16,
+ 0x5b,0xe8,0xeb,0x08,0x27,0x4e,0xdf,0xc2,0xbd,0xf7,0xde,0x1b,0xa4,0x4d,0xc6,0x13,
+ 0x50,0xe3,0x72,0x6e,0x8f,0x3d,0xf6,0x50,0xc7,0x1f,0x7f,0x7c,0x3d,0xac,0xbf,0xfe,
+ 0xfa,0xfa,0xda,0x41,0x07,0x1d,0x14,0xa4,0x63,0x3e,0xf3,0xe8,0xa3,0x8f,0x06,0xe7,
+ 0x47,0x8c,0x18,0x11,0xa8,0x79,0xea,0x7c,0x09,0x1d,0x3a,0x74,0xd0,0xe7,0x57,0x5a,
+ 0x69,0xa5,0x06,0xe9,0x1f,0x70,0xc0,0x01,0x41,0x5a,0xa6,0x41,0x3c,0x76,0xec,0x58,
+ 0xfd,0x9f,0xe9,0x70,0xd9,0x65,0x97,0x15,0x1f,0x01,0xf6,0xde,0x7b,0x6f,0x7d,0x7d,
+ 0x87,0x1d,0x76,0x88,0x45,0x00,0x5a,0x01,0x92,0xb6,0xa8,0xe2,0x07,0x1e,0x78,0xc0,
+ 0x69,0x98,0xd9,0xa0,0x7a,0x30,0xc3,0x76,0xdb,0x6d,0xa7,0xcf,0x53,0x7d,0x48,0xd8,
+ 0x77,0xdf,0x7d,0x03,0x43,0xd3,0x0c,0xdb,0x6c,0xb3,0x4d,0xa4,0xff,0x30,0xc9,0xd4,
+ 0xbb,0x77,0xef,0x48,0xcf,0xd8,0x85,0xa0,0x28,0x08,0x80,0x05,0xce,0xf5,0xf6,0xed,
+ 0xdb,0xc7,0x22,0xc0,0x98,0x31,0x63,0x82,0xb4,0x5f,0x7e,0xf9,0xe5,0xc0,0xfa,0x97,
+ 0x73,0xbd,0x7a,0xf5,0x52,0x2f,0xbc,0xf0,0x82,0x13,0xd4,0xe3,0x66,0xa0,0x89,0xc8,
+ 0x33,0x2b,0xae,0xb8,0xa2,0xfa,0xf6,0xdb,0x6f,0x75,0x8b,0x45,0xd2,0x79,0xf3,0xcd,
+ 0x37,0xeb,0xdd,0xbb,0xff,0xfe,0xfb,0xeb,0xf3,0x5b,0x6d,0xb5,0x55,0x68,0xfa,0x60,
+ 0xc1,0x82,0x05,0xc1,0x33,0xdf,0x7d,0xf7,0x9d,0x7a,0xf7,0xdd,0x77,0xd3,0xa2,0xa9,
+ 0x57,0x1b,0x39,0x27,0x00,0x86,0xd2,0x1a,0x6b,0xac,0xe1,0x2c,0x69,0xe9,0x08,0x70,
+ 0xeb,0xad,0xb7,0x06,0x69,0xd7,0xd4,0xd4,0x04,0x6d,0x7f,0x39,0x47,0x9f,0x41,0xd4,
+ 0xf0,0xf9,0xe7,0x9f,0x07,0x86,0x1d,0x56,0xfd,0xa5,0x97,0x5e,0xaa,0x8f,0x69,0x39,
+ 0xd8,0xe1,0xdc,0x73,0xcf,0xd5,0xd7,0x56,0x5d,0x75,0xd5,0x7a,0x36,0x43,0x31,0x84,
+ 0xac,0x08,0x80,0x81,0xe6,0xea,0x48,0x91,0xeb,0xf7,0xdd,0x77,0x9f,0x33,0xcd,0x2e,
+ 0x5d,0xba,0x38,0xff,0x93,0x01,0x28,0x29,0x89,0xa6,0x31,0xd6,0xac,0x59,0x33,0x7d,
+ 0x7e,0xe3,0x8d,0x37,0x56,0x3f,0xfe,0xf8,0x63,0xe4,0x8f,0x3b,0xf8,0xe0,0x83,0xf5,
+ 0x73,0x3b,0xee,0xb8,0xa3,0x5a,0x77,0xdd,0x75,0xf5,0xf1,0x90,0x21,0x43,0x1a,0xdc,
+ 0xc7,0x7b,0xca,0x3b,0x43,0x42,0x4f,0x80,0x88,0x04,0xd8,0x69,0xa7,0x9d,0xd4,0x5b,
+ 0x6f,0xbd,0x55,0xaf,0xa7,0x8e,0x7a,0x9f,0x6b,0x08,0xcd,0x6e,0x36,0x49,0x9a,0xb4,
+ 0x12,0xae,0xbe,0xfa,0xea,0x7a,0xfd,0x04,0xf4,0xcc,0x49,0xba,0x77,0xdf,0x7d,0x77,
+ 0xbd,0xe7,0x68,0xf7,0xcb,0x35,0x0c,0x2b,0x4a,0xb7,0x04,0x9a,0x85,0xb4,0xe7,0xed,
+ 0xe6,0x28,0xe1,0xfe,0xfb,0xef,0xaf,0x57,0x1f,0xaf,0xb6,0xda,0x6a,0x4e,0x02,0xfd,
+ 0xfd,0xf7,0xdf,0xba,0x59,0x28,0x5a,0x80,0xe6,0xab,0x49,0x40,0x54,0x3f,0xef,0x40,
+ 0xb3,0xd3,0x13,0xc0,0x20,0x80,0x00,0xa1,0x1f,0x78,0xe0,0x81,0x81,0xea,0x5f,0x65,
+ 0x95,0x55,0x9c,0xdd,0xba,0x66,0x3f,0x80,0x58,0xe3,0x6d,0xdb,0xb6,0x0d,0x6c,0x06,
+ 0xd0,0xa6,0x4d,0x1b,0x67,0x4f,0xa0,0xa8,0x70,0x40,0xdb,0x9f,0x16,0x01,0x1d,0x50,
+ 0xf2,0x9f,0x1c,0xdb,0xe1,0x97,0x5f,0x7e,0xd1,0xff,0x21,0xcf,0x99,0x4d,0x45,0x3b,
+ 0xbc,0xf7,0xde,0x7b,0xaa,0xb4,0xb4,0xb4,0x5e,0x27,0x17,0x06,0x9c,0x69,0x20,0x3e,
+ 0xfb,0xec,0xb3,0xc5,0x43,0x80,0x8d,0x36,0xda,0x48,0x7f,0xf4,0x15,0x57,0x5c,0x11,
+ 0x4a,0x80,0x29,0x53,0xa6,0x68,0x2d,0x60,0x0a,0x95,0x0c,0x7b,0xe5,0x95,0x57,0x52,
+ 0x92,0x8a,0x76,0x37,0xfd,0xed,0x94,0x36,0x79,0x8e,0xe3,0x0b,0x2e,0xb8,0xa0,0x41,
+ 0xef,0xa1,0x19,0x9e,0x7a,0xea,0xa9,0x7a,0x64,0x11,0x23,0x8f,0x16,0x00,0x5d,0xcb,
+ 0xae,0x20,0x1d,0x3f,0xa6,0x61,0x19,0x16,0x7e,0xf8,0xe1,0x07,0xdd,0x77,0x21,0x7d,
+ 0x05,0x02,0x9a,0x9a,0x68,0x1e,0x8c,0xba,0xa2,0x21,0x40,0x58,0x70,0x19,0x81,0x58,
+ 0xd9,0x08,0xfd,0x9b,0x6f,0xbe,0x49,0xf9,0xac,0xad,0x55,0x28,0xe9,0xa8,0x6f,0xe0,
+ 0x2a,0xf5,0x61,0x61,0xd1,0xa2,0x45,0xea,0x8d,0x37,0xde,0xd0,0xcf,0xe5,0xc3,0x68,
+ 0xa3,0x4a,0xf8,0xf8,0xe3,0x8f,0x35,0x61,0x92,0xa8,0xf6,0x73,0x4e,0x80,0xa8,0xc1,
+ 0x3b,0x99,0x78,0x02,0x78,0x02,0x78,0x02,0x78,0x02,0x2c,0xd3,0x04,0x98,0x35,0x6b,
+ 0x96,0x1a,0x38,0x70,0xa0,0x1a,0x34,0x68,0x50,0xec,0xd1,0x31,0x9a,0x77,0x3c,0x9b,
+ 0xce,0x18,0xf3,0xa1,0x09,0x13,0xc0,0x07,0x4f,0x00,0x1f,0x3c,0x01,0x7c,0xf0,0x04,
+ 0xf0,0xc1,0x13,0xc0,0x07,0x4f,0x00,0x1f,0x3c,0x01,0x8a,0x23,0x24,0x75,0xae,0xa4,
+ 0x27,0x40,0xc4,0x90,0xcf,0x4e,0x2c,0xc6,0x1e,0x3c,0x01,0x9a,0x78,0xc8,0xc7,0x5c,
+ 0x49,0x26,0x9c,0xe0,0xb9,0x6c,0x7b,0x4f,0x7b,0x02,0x14,0x49,0xd8,0x65,0x97,0x5d,
+ 0xb4,0x56,0x61,0x52,0x8a,0x27,0x40,0x96,0x21,0xd3,0x79,0x87,0xf6,0x5c,0xc7,0xaf,
+ 0xbe,0xfa,0x4a,0xcf,0x4c,0xc2,0x25,0x7c,0xf8,0xf0,0xe1,0xce,0xf4,0x53,0x3d,0xcf,
+ 0x0c,0x25,0xbc,0x87,0x70,0x60,0x39,0xfa,0xe8,0xa3,0x55,0xcf,0x9e,0x3d,0xb5,0x03,
+ 0xa9,0x19,0x66,0xcf,0x9e,0xad,0x9f,0x91,0x6a,0x05,0x3f,0x45,0x7e,0x03,0xba,0xd8,
+ 0xed,0x10,0x65,0x4e,0x64,0xdc,0xef,0x49,0x1c,0x01,0x32,0x9d,0x77,0x68,0x0e,0x6e,
+ 0xe1,0x63,0x20,0xd3,0xd6,0xec,0xb9,0x83,0x51,0x3c,0xa4,0x3e,0xfb,0xec,0xb3,0xc0,
+ 0xf5,0xdc,0x04,0xde,0x45,0xa6,0xff,0xa4,0xe9,0xfd,0x6c,0x03,0x0f,0x26,0x33,0x44,
+ 0x9d,0x13,0x19,0xf7,0x7b,0x12,0x4b,0x80,0xb8,0xf3,0x0e,0xcd,0x0c,0x63,0x8e,0xa1,
+ 0x4c,0x40,0x21,0xb3,0x10,0x54,0x1c,0x02,0x88,0xb7,0x12,0x02,0x87,0x6c,0xbb,0xee,
+ 0xba,0x6b,0x70,0x0d,0x0f,0x28,0x53,0x03,0xdc,0x76,0xdb,0x6d,0x41,0x9a,0xbb,0xed,
+ 0xb6,0x9b,0xfe,0x0d,0x18,0x2c,0x93,0x10,0x67,0x4e,0x64,0xdc,0xef,0x49,0x2c,0x01,
+ 0xe2,0xce,0x3b,0x34,0x33,0x8c,0x89,0xae,0xe3,0xc6,0x8d,0x8b,0xd5,0x0a,0xb0,0x7d,
+ 0x24,0xbb,0x77,0xef,0x1e,0x58,0xf5,0xc4,0xe2,0x93,0xc8,0xc4,0xd9,0xb8,0x36,0x40,
+ 0x9c,0x39,0x91,0x71,0xbf,0x27,0xb1,0x04,0x88,0x33,0xef,0xd0,0xce,0xb0,0x01,0x03,
+ 0x06,0xc4,0x6e,0x06,0x9a,0xcf,0x33,0xbf,0xc0,0x0e,0x38,0xb9,0x86,0xcd,0x47,0x48,
+ 0x45,0x80,0x4c,0xe6,0x44,0xc6,0xf9,0x9e,0x44,0xdb,0x00,0xae,0xe0,0x9a,0x77,0x68,
+ 0x67,0x58,0x2a,0x07,0x97,0x28,0x04,0x70,0xb9,0x9c,0x9f,0x7c,0xf2,0xc9,0x19,0x11,
+ 0x20,0x93,0x39,0x91,0x71,0xbe,0xa7,0xe8,0x08,0xe0,0x9a,0x77,0x98,0x6b,0x02,0xb8,
+ 0x9e,0xcf,0x94,0x00,0x99,0xce,0x89,0xf4,0x04,0x88,0x31,0xef,0xb0,0x29,0x13,0x20,
+ 0xd3,0x39,0x91,0x9e,0x00,0x31,0xe6,0x1d,0x36,0x15,0x02,0xd0,0xbe,0x77,0xb5,0xfd,
+ 0x33,0x99,0x13,0x59,0xf4,0x04,0x88,0x3b,0xef,0xb0,0x31,0x09,0x20,0xcd,0x39,0xd7,
+ 0xac,0x26,0x42,0x26,0x73,0x22,0x8b,0x9e,0x00,0x71,0xe7,0x1d,0x36,0x26,0x01,0x30,
+ 0xe6,0xe4,0x9d,0x59,0x6d,0xcd,0x0e,0x99,0xcc,0x89,0x6c,0x92,0x04,0xa0,0x3d,0xcc,
+ 0x8a,0x1a,0x0c,0x7a,0x1c,0x7e,0xf8,0xe1,0x01,0x0e,0x3b,0xec,0x30,0xbd,0x3a,0x07,
+ 0xb3,0x78,0x01,0xeb,0x09,0x00,0xce,0xd1,0x85,0x7b,0xe2,0x89,0x27,0xea,0x66,0x4e,
+ 0xd7,0xae,0x5d,0xd5,0x0d,0x37,0xdc,0xa0,0x67,0xf6,0xd2,0x11,0x32,0x7d,0xfa,0x74,
+ 0x3d,0x8d,0x2b,0xac,0x1f,0x20,0xce,0xbc,0xc3,0xc6,0x24,0x80,0x39,0x2b,0x99,0x4e,
+ 0x1b,0xbe,0x99,0x2e,0x64,0x33,0xc4,0x9d,0x13,0xd9,0x64,0x08,0x80,0x9a,0x9d,0x3a,
+ 0x75,0xaa,0xee,0x94,0x81,0xbd,0x22,0x74,0x96,0x71,0x93,0xd8,0x05,0xf3,0x9e,0xb0,
+ 0xfb,0x5b,0xb5,0x6a,0xa5,0x3b,0x56,0x20,0x96,0xa8,0xf3,0x4c,0xe7,0x1d,0xd2,0x33,
+ 0x28,0xf7,0x2d,0x5e,0xbc,0x38,0xf4,0x7b,0xc2,0xe6,0x4a,0xa6,0x7b,0x9e,0xfa,0x9d,
+ 0x6b,0x54,0x41,0xae,0x70,0xdd,0x75,0xd7,0xd5,0x9b,0x94,0xba,0xdf,0x7e,0xfb,0x35,
+ 0xb8,0x27,0xce,0x9c,0xc8,0xa8,0xdf,0x93,0x37,0x02,0x20,0x10,0xea,0x2b,0x98,0x4f,
+ 0x69,0xa6,0x37,0xcb,0x04,0x2c,0x97,0xd8,0x3c,0x0e,0xbb,0x6e,0x82,0xf5,0x7a,0x10,
+ 0x3e,0xa4,0x02,0xac,0x08,0x86,0x2a,0xe4,0x3f,0x73,0x35,0xef,0xb0,0x31,0x02,0xef,
+ 0xcf,0xec,0x64,0x96,0xb0,0xb3,0x35,0x9b,0x19,0xf2,0x31,0x27,0x32,0xa7,0x04,0x40,
+ 0xe5,0xd0,0x7e,0x3d,0xe6,0x98,0x63,0xf4,0x48,0x58,0xae,0x80,0xe0,0x99,0xbf,0x4f,
+ 0x2f,0x9f,0xd9,0x19,0xc2,0x28,0x1b,0x19,0x81,0x26,0xf0,0xb3,0x8e,0x1a,0x91,0x00,
+ 0x2c,0xa0,0x30,0x6a,0xd4,0xa8,0x60,0xb8,0x32,0x57,0x60,0xcd,0x81,0xbd,0xf6,0xda,
+ 0x4b,0x75,0xec,0xd8,0xb1,0x41,0x4f,0x18,0xc0,0x28,0x62,0xb5,0x2f,0xb4,0x80,0x27,
+ 0x40,0x81,0x09,0x40,0xa6,0xd3,0xa1,0x42,0x1d,0x84,0xba,0x17,0xb5,0x8c,0xe1,0x26,
+ 0xb1,0x0b,0xe6,0x3d,0xae,0xfb,0xc5,0x66,0xa0,0x8d,0x4c,0x7d,0x4f,0xa9,0x37,0x49,
+ 0x41,0x55,0x00,0x31,0x38,0x66,0x54,0x8d,0xea,0x86,0xc1,0x1d,0x4f,0x80,0x02,0x10,
+ 0x80,0xba,0xea,0xed,0xb7,0xdf,0x56,0xdd,0xba,0x75,0xd3,0x82,0x61,0xb8,0xd5,0x06,
+ 0x64,0x90,0xd8,0x05,0xf3,0x1e,0xfb,0x7e,0x84,0xcb,0x3a,0xbe,0xb4,0x08,0x10,0xb0,
+ 0x08,0x9f,0x98,0xaa,0x00,0x62,0xb0,0x04,0x1d,0x96,0x30,0xe7,0xa8,0x37,0xbf,0xff,
+ 0xfe,0x7b,0x4d,0x00,0x3f,0xef,0x30,0xcf,0x04,0xc0,0xe0,0xc2,0xbb,0x05,0x6b,0x36,
+ 0x9f,0x40,0xb0,0x26,0xb0,0x27,0x30,0x26,0x71,0xb4,0x40,0xf0,0x8c,0xb1,0xb3,0x2a,
+ 0x09,0xe7,0x59,0xb1,0x03,0x3b,0x20,0x89,0x4b,0xb8,0x36,0x19,0x02,0x50,0xea,0x11,
+ 0x3e,0xcd,0xa8,0x7c,0x0b,0x1f,0x20,0x58,0x01,0x4e,0x10,0x18,0x7f,0x22,0x78,0x56,
+ 0xfb,0x42,0x43,0x6c,0xbd,0xf5,0xd6,0x8d,0x4e,0x00,0xaa,0x40,0x56,0x44,0xf9,0xe8,
+ 0xa3,0x8f,0x92,0x4b,0x00,0x84,0x4f,0xe6,0xe2,0xa9,0x52,0x08,0xe1,0x03,0x54,0x3d,
+ 0x75,0x7f,0xcb,0x96,0x2d,0x03,0x75,0x2f,0x82,0x67,0xfd,0xa1,0x2d,0xb7,0xdc,0x52,
+ 0xfb,0xe7,0xe7,0x8b,0x00,0xd8,0x14,0xd8,0x16,0x0c,0xb4,0x30,0x6a,0x88,0x2f,0x1e,
+ 0xfd,0x0a,0x27,0x9d,0x74,0x92,0x7e,0x27,0xc8,0x87,0xd7,0x11,0x1d,0x4d,0x54,0x85,
+ 0x38,0x67,0x2c,0xcb,0xfb,0x09,0x94,0xa4,0x63,0x39,0x6e,0x49,0x58,0xe2,0x85,0x22,
+ 0x00,0x16,0x3f,0x82,0xe7,0x58,0xd4,0xbd,0x29,0x78,0xf6,0x22,0xa0,0x53,0x86,0xfb,
+ 0xa2,0x12,0x00,0x0d,0x86,0xbf,0xde,0xeb,0xaf,0xbf,0xae,0x7b,0x12,0xe9,0x2c,0xb9,
+ 0xfe,0xfa,0xeb,0xf5,0x02,0x52,0xd8,0x1b,0xfc,0x07,0x3d,0x71,0xac,0x15,0xcc,0x0a,
+ 0x67,0x08,0x18,0xa3,0x12,0xb0,0xbe,0x20,0xc2,0x06,0xf4,0xc4,0x71,0x0f,0xab,0x90,
+ 0x7f,0xfa,0xe9,0xa7,0xda,0x1d,0x8b,0xce,0x25,0xe9,0x8b,0x48,0x14,0x01,0x68,0x5b,
+ 0xd3,0xc6,0xbe,0xe5,0x96,0x5b,0x0a,0x26,0x7c,0x21,0x80,0x08,0x5e,0xd4,0x3d,0xc2,
+ 0xc7,0xcf,0x0e,0x21,0xe1,0x08,0x81,0x43,0x24,0x06,0x23,0x3d,0x8d,0x74,0x9e,0x3c,
+ 0xf3,0xcc,0x33,0xda,0xe1,0x83,0x11,0x3f,0x76,0xf9,0xa0,0x23,0x09,0xd2,0xd2,0xc3,
+ 0xc6,0xda,0x80,0xf4,0x9a,0xe1,0x12,0x86,0x40,0x21,0x0f,0xe9,0x90,0x06,0xc2,0xe5,
+ 0x1c,0x83,0x2d,0x9b,0x6d,0xb6,0x99,0x76,0x17,0x63,0xa1,0x6b,0x13,0xa4,0xc1,0x7f,
+ 0xb2,0x72,0x18,0xfe,0x85,0xac,0x8b,0x48,0xf3,0x93,0x92,0x8f,0x01,0x8a,0xeb,0x19,
+ 0x1d,0x4d,0x89,0x23,0x00,0xa5,0x8a,0x8e,0x1d,0xac,0xf0,0x42,0x13,0x80,0x85,0x9e,
+ 0x45,0xf0,0x08,0x00,0xe1,0x8b,0xe0,0x11,0x1e,0x02,0xc3,0xdf,0x8d,0xfe,0x70,0xce,
+ 0xa3,0x15,0x38,0x27,0xa5,0x56,0x04,0x8a,0x00,0x19,0xfd,0xa3,0x1b,0x35,0x2a,0xf8,
+ 0x6f,0x62,0x9e,0x83,0x2c,0x08,0xfe,0xec,0xb3,0xcf,0xd6,0x24,0x63,0x25,0x34,0xd6,
+ 0x19,0xa6,0xf5,0x81,0x06,0x60,0x75,0x34,0xfa,0x21,0x12,0x47,0x00,0x3e,0x86,0xd2,
+ 0xcf,0x07,0x32,0xd8,0x50,0x48,0x02,0x50,0xb2,0x45,0xdd,0x23,0x78,0x84,0x80,0x5b,
+ 0x34,0x82,0x46,0x35,0xa3,0x82,0x39,0xc7,0xe2,0x94,0xf4,0x15,0xd0,0x1f,0x2e,0xb1,
+ 0x79,0x4c,0x6c,0x83,0xf3,0x3c,0x27,0x55,0x0a,0xe4,0x22,0x2d,0xfe,0x07,0xc2,0x40,
+ 0x24,0x08,0x84,0xba,0xa7,0x2a,0x60,0xf0,0x8a,0xd5,0x46,0x99,0x0d,0x84,0x47,0x11,
+ 0xfb,0x10,0xe1,0xaa,0x05,0x01,0xd0,0x02,0x54,0x3f,0x68,0x00,0x0a,0x4b,0xa2,0x08,
+ 0x80,0xfa,0x67,0x95,0x4d,0x3e,0xb2,0x90,0xc2,0x07,0x47,0x1c,0x71,0x44,0x50,0xcf,
+ 0x23,0x78,0x31,0xb8,0x50,0xe5,0x94,0x68,0x8c,0x42,0xd4,0xbb,0x40,0x6c,0x05,0x0c,
+ 0x45,0x11,0x2c,0xc2,0xe4,0x79,0xd1,0x1a,0x94,0x62,0x88,0xc3,0xe2,0xd1,0xc4,0xa4,
+ 0x47,0xda,0xdc,0x87,0xa6,0xa1,0xba,0x21,0x1d,0x06,0x62,0x18,0x31,0x94,0xd1,0x48,
+ 0xb4,0x51,0x18,0x30,0x56,0x25,0x36,0x8f,0xa3,0xde,0x6f,0x23,0xdd,0xf3,0x71,0xc0,
+ 0x40,0x19,0xdd,0xe7,0x51,0x48,0x59,0x12,0x66,0xfc,0x31,0xf0,0xc0,0x62,0x89,0x8d,
+ 0x41,0x00,0x11,0x3c,0x82,0x43,0xd5,0x53,0x2a,0x11,0xbe,0x59,0x15,0xd8,0x42,0xa5,
+ 0x3a,0xa0,0x4e,0x47,0xfd,0x73,0x2f,0x6a,0x9c,0x12,0x0f,0x49,0x10,0x2c,0xbd,0x87,
+ 0xf4,0x27,0x1c,0x72,0xc8,0x21,0x91,0x00,0x09,0x24,0x36,0x8f,0x73,0x75,0x7f,0x5c,
+ 0xd8,0xe9,0xdb,0xe0,0x1a,0xe4,0x45,0x63,0xcb,0x48,0x2a,0x5a,0xdc,0x74,0x27,0x8f,
+ 0x4c,0x00,0x54,0x1a,0xa3,0x52,0xef,0xbf,0xff,0x7e,0x41,0x85,0x4f,0x29,0xc6,0x10,
+ 0xa3,0xb4,0x63,0x71,0x53,0x52,0xa5,0x8e,0xa7,0x44,0x73,0x8d,0x3a,0x1a,0xc1,0x72,
+ 0x3f,0x7d,0x04,0x8c,0x0e,0xe2,0x22,0x0d,0xe3,0x25,0x36,0x8f,0x89,0x5d,0xd7,0x6d,
+ 0x14,0xfa,0x7e,0x1b,0xe9,0xde,0x3f,0x15,0xd8,0xef,0x80,0x96,0x13,0xfe,0x15,0xe6,
+ 0x50,0x3a,0x32,0x84,0x04,0xa9,0x34,0x41,0x28,0x01,0xb0,0x70,0xa9,0xeb,0x0a,0x25,
+ 0x7c,0x1c,0x26,0xa8,0x9f,0x69,0x96,0xc9,0x47,0xf0,0x41,0x30,0x1a,0xf0,0x91,0xb9,
+ 0x04,0x5a,0x41,0x62,0xf3,0x38,0x57,0xf7,0x17,0x02,0xfc,0x3f,0xf9,0x46,0xe9,0x37,
+ 0x1d,0x6d,0xc4,0x6f,0x02,0xbf,0x42,0x19,0x2c,0x8b,0x4d,0x00,0xd9,0x11,0xa3,0xd0,
+ 0x55,0x80,0x7c,0x00,0xec,0x47,0xa5,0x09,0xf0,0xee,0x91,0xd8,0x3c,0x0e,0xbb,0x9e,
+ 0x0e,0xd9,0x3e,0x1f,0x37,0x7d,0x1b,0xe9,0xbe,0x27,0xdd,0xfd,0x54,0x6d,0xd4,0xf5,
+ 0x61,0x0e,0x36,0x14,0x1e,0x7a,0x29,0x65,0xb0,0x6c,0x99,0x20,0x00,0xfd,0xfd,0x7c,
+ 0x14,0x5d,0xc0,0xd4,0x6b,0x12,0xbb,0x60,0xde,0xe3,0xba,0x3f,0xdb,0xeb,0xe9,0x10,
+ 0x37,0x7d,0x1b,0x99,0xbe,0x0f,0x25,0x1f,0x7b,0x26,0xcc,0xa3,0xca,0x84,0x39,0x58,
+ 0xb6,0xcc,0x68,0x00,0x8f,0xd4,0x48,0x25,0x70,0x4a,0xbd,0xd8,0x01,0xc4,0x51,0x7a,
+ 0x4a,0x3d,0x01,0x96,0x61,0x02,0x98,0xc2,0xb6,0x81,0xf6,0xf0,0x04,0x48,0x28,0x01,
+ 0x5c,0x02,0x17,0xa1,0x4b,0x9c,0x77,0x02,0x60,0x99,0x47,0xad,0x2f,0x3d,0xe2,0x03,
+ 0x43,0xcf,0x95,0xef,0xb6,0xc0,0x6d,0xa1,0x9b,0xc8,0x1b,0x01,0xb0,0x40,0x79,0x49,
+ 0x3a,0x6d,0x4c,0x30,0x08,0x23,0xb1,0x79,0x4c,0x8c,0x71,0x67,0x36,0xa3,0xc2,0x80,
+ 0xd7,0x8f,0x9d,0xee,0xb2,0x82,0x54,0xdf,0x1f,0x17,0x61,0x5d,0xf0,0x22,0x70,0x57,
+ 0x89,0xb7,0x0d,0xc9,0xbc,0x11,0x80,0xce,0x07,0xba,0x1c,0xa5,0xbb,0xd4,0xe5,0xc2,
+ 0x6d,0xba,0x7d,0xef,0xdb,0xbc,0x8d,0xda,0xaf,0xd5,0x99,0xaa,0xfd,0x61,0xd7,0xa8,
+ 0x83,0x0f,0xfd,0x17,0x72,0x4c,0xac,0x51,0x7b,0xdc,0xb6,0x7d,0x77,0xb5,0xf3,0x2e,
+ 0xad,0xf5,0x47,0xb8,0xba,0x38,0xed,0xff,0x33,0xcf,0xe5,0xe3,0x7e,0x1b,0xf6,0xf3,
+ 0x51,0xbe,0x3f,0xd5,0xf3,0x61,0xe0,0xfb,0xc3,0x34,0x6f,0x2a,0xa1,0xdb,0xad,0x88,
+ 0xbc,0x11,0x80,0x76,0xa7,0xe9,0xb9,0x93,0x0a,0xad,0x5a,0xb7,0x53,0x47,0x9f,0x78,
+ 0xb3,0xba,0xa8,0xdb,0x04,0x75,0x61,0xb7,0xa7,0x75,0xac,0x71,0xb9,0x11,0x1b,0x68,
+ 0x79,0xc0,0xa9,0xfa,0xe5,0xa3,0xa6,0x9f,0x4b,0x88,0x0b,0x9a,0xe9,0x8e,0x26,0x71,
+ 0x21,0x81,0x26,0x4c,0x45,0x00,0x57,0x93,0xd2,0x6e,0x4e,0xe6,0x8d,0x00,0xa8,0xf1,
+ 0x30,0x8f,0x5f,0x1b,0x7c,0x4c,0xcb,0x36,0x27,0xa8,0x2b,0x6f,0x7c,0x41,0x55,0xfe,
+ 0x6f,0x6a,0x5a,0x5c,0xd6,0x73,0xa2,0x6a,0xd1,0xaa,0x3c,0xa5,0x57,0xb1,0x09,0xbc,
+ 0x74,0x24,0x36,0x8f,0xa3,0xbe,0x5f,0x63,0xc3,0xf5,0xfe,0x94,0x6e,0x06,0xb7,0xc2,
+ 0x08,0x60,0x97,0x72,0x7b,0xec,0xc1,0x3c,0xce,0x0b,0x01,0x48,0x38,0xcc,0x03,0xd8,
+ 0xf6,0xf8,0x6d,0x7f,0x48,0x07,0x75,0x41,0xf7,0x7b,0x54,0xdf,0x51,0xb3,0x23,0x81,
+ 0x7b,0x79,0x26,0x2c,0xbd,0x5c,0x7a,0x20,0x67,0x92,0x7e,0x21,0xd2,0xc3,0xbe,0x92,
+ 0xb1,0x8e,0x30,0x02,0x84,0x0d,0x06,0xd9,0x83,0x4f,0x79,0x21,0x00,0x2a,0x91,0x71,
+ 0x72,0x17,0xce,0x38,0xe3,0x8c,0x20,0x06,0x6d,0xdb,0x77,0x54,0xb7,0x8c,0x9c,0xa6,
+ 0x86,0x3f,0x39,0xaf,0x21,0xc6,0x7d,0xfd,0x5f,0x5c,0x8b,0x01,0x0f,0x7c,0xa8,0x3a,
+ 0x1c,0x79,0xba,0x9e,0x5c,0x12,0x96,0x9e,0x79,0x2e,0x1f,0xc8,0xf6,0xff,0xb2,0x7d,
+ 0x9e,0xe1,0x60,0xbc,0xa0,0x18,0x14,0x0b,0x23,0x80,0x5d,0xd2,0xc3,0xc0,0xc8,0x67,
+ 0x5e,0x08,0x20,0x33,0x76,0xa3,0xa0,0x6d,0xbb,0x0e,0xea,0xec,0xae,0xfd,0x54,0xcf,
+ 0x81,0x13,0xd5,0x35,0x77,0x3c,0x1b,0xc4,0xfa,0xd8,0x88,0xbb,0xf5,0xaa,0x52,0x87,
+ 0x1f,0xd7,0x29,0x6d,0xda,0xf8,0xf0,0x49,0x6c,0x1e,0x47,0x7d,0x9f,0x7c,0xa7,0x97,
+ 0xcd,0xff,0x41,0x00,0x06,0x76,0x20,0x00,0xc0,0xef,0x21,0x4c,0x03,0xb8,0x4a,0xbb,
+ 0x3d,0xd4,0x9d,0x37,0x02,0x60,0x00,0x9e,0x73,0xce,0x39,0x91,0xc0,0x47,0xd1,0xa4,
+ 0x09,0xeb,0xb9,0x92,0xf3,0x30,0x9f,0x8c,0xb0,0x9f,0xc7,0x15,0x4b,0x62,0xf3,0x38,
+ 0xea,0xff,0xa7,0x43,0xbe,0xd3,0x8f,0xfa,0x7f,0x10,0x00,0x8f,0x25,0x11,0x3e,0x80,
+ 0x0c,0x61,0x1a,0xc0,0x55,0xda,0x5d,0xc8,0x0b,0x01,0x18,0x8f,0x47,0x60,0x2c,0x89,
+ 0xc6,0x5c,0x81,0x8a,0x8a,0x0a,0x1d,0xbb,0x20,0xd7,0x88,0x5d,0xb0,0x9f,0xb7,0xef,
+ 0x8f,0x7b,0x3d,0xdd,0xff,0xa7,0x4b,0x2f,0xdb,0xf7,0x8b,0xfb,0xfd,0x90,0x9e,0x82,
+ 0x80,0x17,0x13,0xde,0x4c,0x26,0x01,0xc2,0x0c,0x41,0x5b,0xe8,0x36,0x01,0xcc,0xb5,
+ 0x16,0xf2,0x46,0x00,0x9c,0x33,0x80,0xb8,0x4d,0xe3,0xc1,0x93,0x09,0xe4,0x59,0x62,
+ 0xf3,0x38,0xea,0xf5,0xb8,0xe9,0x15,0xfa,0xfe,0x28,0xdf,0x8f,0x93,0xab,0x2d,0x7c,
+ 0x10,0x66,0x08,0xda,0xa5,0x5c,0x84,0x6d,0x2e,0xb0,0x21,0x24,0xc8,0x0b,0x01,0xa8,
+ 0x9b,0xf0,0xa3,0xc3,0x3d,0x0b,0xf7,0x2b,0x3c,0x76,0xc4,0x69,0x33,0x15,0xc4,0x63,
+ 0xd7,0x06,0x19,0x90,0x6b,0x08,0x41,0xc5,0x05,0xdc,0x3c,0xce,0x16,0x61,0xdf,0x21,
+ 0x48,0x97,0x0f,0x22,0x7c,0xd2,0x12,0x0f,0x27,0x5b,0xf8,0x80,0x2a,0x21,0x2e,0x01,
+ 0x4c,0xd0,0xf3,0x5a,0x90,0xc1,0x20,0xf1,0xe4,0x71,0x7d,0x84,0x47,0xe6,0x08,0xb3,
+ 0x01,0x52,0x09,0xdc,0x3e,0x2e,0xd8,0x68,0x20,0x5a,0x41,0x5c,0xae,0xbd,0xf0,0xb2,
+ 0x03,0x4d,0x40,0x16,0x8f,0x0e,0xcb,0x6b,0x5b,0xf0,0xa6,0xd0,0x6d,0xf8,0xe1,0xe0,
+ 0x04,0xc2,0x55,0xea,0x6d,0xc1,0x33,0xa0,0x06,0x3c,0x01,0x12,0x4a,0x00,0x57,0x69,
+ 0x17,0xc1,0x7b,0x02,0x24,0x1c,0xae,0x92,0x6e,0x1e,0x03,0x7c,0x09,0x3c,0x01,0x12,
+ 0x0a,0x5b,0xe0,0x2e,0xe1,0x7b,0x02,0x14,0x01,0x01,0x44,0xc8,0x66,0x89,0x37,0x63,
+ 0xe0,0x09,0x90,0x50,0x02,0x98,0xc2,0x36,0x05,0xee,0x09,0x50,0x04,0x08,0x13,0xbc,
+ 0x6b,0x92,0x89,0x27,0x40,0x42,0x09,0x10,0x75,0x26,0x92,0x27,0x40,0x02,0x61,0x97,
+ 0xf4,0x30,0x30,0x7b,0xc8,0x13,0x20,0xa1,0x1a,0x20,0x4c,0xe0,0x9e,0x00,0x45,0xa2,
+ 0x01,0x5c,0xc2,0x77,0xc1,0x13,0x20,0xc1,0x04,0x10,0x21,0xdb,0x04,0x90,0xf5,0x05,
+ 0x3c,0x01,0x12,0x0a,0xbb,0x94,0x8b,0xb0,0x25,0x36,0x49,0xe0,0x09,0x50,0x24,0x04,
+ 0x08,0x5b,0x91,0x24,0x27,0x04,0xc0,0x35,0xc9,0xa3,0xe9,0xc0,0x2c,0xf1,0xae,0x25,
+ 0x68,0xcc,0x63,0xaf,0x01,0x12,0x88,0x54,0x25,0xde,0x86,0x27,0x40,0xc2,0x09,0x10,
+ 0xb6,0x90,0x14,0x0b,0x67,0x01,0x4f,0x80,0x84,0x12,0x20,0x6c,0xb5,0x30,0x59,0x31,
+ 0xcd,0x13,0x20,0xc1,0x70,0x95,0x74,0xf3,0x18,0xb0,0xaa,0xb9,0x27,0x40,0x42,0x61,
+ 0x0b,0xdc,0x16,0xbe,0xb9,0x8c,0x9d,0x27,0x40,0x82,0x09,0x20,0xa5,0x5c,0x84,0x2e,
+ 0x8b,0x6f,0xb0,0xd2,0x1a,0x0b,0x68,0x12,0x7b,0x02,0x24,0x94,0x00,0xa6,0xd0,0x81,
+ 0x29,0x74,0x56,0x0c,0x95,0x75,0x94,0x3d,0x01,0x12,0x08,0x11,0xbc,0x08,0x1c,0x98,
+ 0x8b,0x67,0x33,0x9f,0x00,0xb7,0x72,0x62,0x4f,0x80,0x04,0x42,0x04,0x6f,0x0b,0x5d,
+ 0x20,0xcb,0xe2,0xb3,0xcd,0x8d,0x27,0x40,0x02,0xe1,0x2a,0xe9,0xe6,0x3e,0x09,0x4c,
+ 0xce,0x61,0x06,0x37,0xfb,0x0d,0xcf,0x9a,0x35,0x2b,0xfb,0x95,0x42,0xa9,0x6f,0x7c,
+ 0xc6,0x37,0x0d,0x88,0xc0,0xcd,0x0d,0x30,0x88,0x99,0x4d,0x84,0xe0,0x01,0xc6,0x21,
+ 0x7b,0x28,0x56,0x57,0x57,0xeb,0xb5,0x82,0x59,0xf6,0x3f,0xab,0xc5,0xa2,0x0b,0xbd,
+ 0x65,0x8c,0x47,0x38,0xd8,0xd8,0x02,0x81,0x8b,0xb0,0x45,0xf0,0xb2,0xdd,0x0d,0x2b,
+ 0xb2,0x0d,0x19,0x32,0x44,0x8d,0x1d,0x3b,0x56,0xef,0x6c,0xf2,0xc5,0x17,0x5f,0xe8,
+ 0x8d,0x3f,0xd8,0x00,0x24,0xe3,0xe5,0xe2,0xd9,0x5d,0xcb,0x67,0x7e,0xe3,0x83,0x81,
+ 0x20,0x11,0xba,0xec,0x6b,0x24,0x7b,0x1c,0xb1,0xbf,0x51,0x97,0x2e,0x5d,0xd4,0xa0,
+ 0x41,0x83,0xf4,0xe6,0xdd,0x93,0x27,0x4f,0xd6,0xbb,0xbd,0x51,0x88,0xd9,0xd5,0x2c,
+ 0xa3,0xfd,0x02,0xd8,0x6c,0xe0,0x83,0x0f,0x3e,0xd0,0x6c,0xda,0x67,0x9f,0x7d,0xbc,
+ 0x10,0x1a,0x59,0xf8,0xe6,0xc6,0x56,0x08,0x1c,0x30,0x29,0xb7,0x73,0xe7,0xce,0x7a,
+ 0xb7,0xb4,0xc1,0x83,0x07,0x6b,0xe1,0x4f,0x9a,0x34,0x49,0x17,0x5c,0x36,0xb5,0x64,
+ 0x3f,0xa3,0x8c,0x76,0x0c,0xe1,0x21,0x76,0x0c,0x63,0xcb,0x18,0x12,0x2c,0xc4,0x96,
+ 0xb1,0x1e,0x6e,0x50,0xcf,0x8b,0xd0,0x59,0x97,0x01,0x50,0x2d,0xa3,0x99,0xd9,0xd0,
+ 0x73,0xc0,0x80,0x01,0x6a,0xf8,0xf0,0xe1,0xea,0xa1,0x87,0x1e,0xd2,0x25,0x9f,0x6a,
+ 0x9b,0x2d,0xed,0x50,0xfd,0x51,0x36,0xb3,0x82,0x00,0x4b,0x52,0x6d,0x1a,0xc5,0xbe,
+ 0x7c,0x30,0xab,0x50,0x5b,0xc7,0x7a,0xd4,0xdf,0x42,0x47,0x4a,0x3b,0x6d,0x7f,0x76,
+ 0x2a,0xed,0xdd,0xbb,0xb7,0xea,0xdb,0xb7,0xaf,0xba,0xe3,0x8e,0x3b,0xb4,0xe0,0xd9,
+ 0xd5,0x6c,0xdc,0xb8,0x71,0x7a,0x0f,0x45,0x34,0x36,0x25,0x3f,0xaa,0xf0,0x91,0x3d,
+ 0x04,0xa8,0x09,0xdb,0x36,0x6e,0xfe,0xfc,0xf9,0x6a,0xc6,0x8c,0x19,0xba,0x49,0x31,
+ 0x62,0xc4,0x08,0xd5,0xa3,0x47,0x0f,0x5f,0x1d,0x14,0x50,0xf8,0xcd,0x9a,0x35,0xd3,
+ 0x6b,0x00,0xf5,0xea,0xd5,0x2b,0x28,0xed,0x18,0x79,0xf7,0xdc,0x73,0x8f,0x2e,0xf1,
+ 0xc8,0x65,0xca,0x94,0x29,0x7a,0x47,0xf7,0x39,0x73,0xe6,0xa8,0x05,0x0b,0x16,0xc4,
+ 0xdd,0xc6,0xae,0x06,0x02,0x54,0xa7,0xda,0x38,0x72,0xee,0xdc,0xb9,0x7a,0x4b,0xf6,
+ 0x47,0x1e,0x79,0x44,0x0d,0x1b,0x36,0x4c,0xf5,0xeb,0xd7,0x4f,0x55,0x56,0x56,0xfe,
+ 0xbb,0x0c,0xac,0x6f,0x22,0xe6,0x65,0xb8,0x97,0x25,0xe0,0x4e,0x3d,0xf5,0x54,0x5d,
+ 0xb7,0x53,0xda,0x07,0x0e,0x1c,0xa8,0x0b,0x20,0xa5,0xfd,0xf1,0xc7,0x1f,0xd7,0x4d,
+ 0x3c,0x36,0xb1,0x9c,0x39,0x73,0xa6,0x16,0x3c,0xa5,0x9e,0xe6,0x9e,0xec,0x12,0x16,
+ 0x63,0x0f,0xc3,0x6a,0x08,0x50,0x99,0x6a,0xf3,0xc8,0x85,0x0b,0x17,0x06,0x9b,0x29,
+ 0x43,0x02,0x5e,0x84,0x0d,0x95,0xfb,0xf4,0xe9,0xa3,0x5f,0x90,0xad,0x65,0xc1,0xcd,
+ 0x37,0xdf,0xec,0x91,0x05,0x24,0x1f,0xc9,0x53,0x4a,0x7b,0xff,0xfe,0xfd,0xb5,0x61,
+ 0x47,0x9b,0x9e,0xd2,0x3e,0x61,0xc2,0x04,0x2d,0x83,0xe9,0xd3,0xa7,0x6b,0x79,0xd0,
+ 0xc4,0xa3,0xc4,0x53,0x48,0xd9,0x1b,0x99,0x02,0x9b,0xaa,0xb9,0x17,0x12,0x2a,0x21,
+ 0x40,0x19,0x76,0x5f,0x98,0x31,0xc8,0x06,0xc9,0x54,0x05,0xfc,0x29,0x9a,0x00,0xb5,
+ 0x33,0x66,0xcc,0x18,0xfd,0x62,0x6c,0xc2,0x3c,0x74,0xe8,0x50,0xad,0x96,0x3c,0xb2,
+ 0x07,0x79,0x49,0x9e,0x8e,0x1c,0x39,0x52,0x8d,0x1e,0x3d,0x5a,0x3d,0xf6,0xd8,0x63,
+ 0x6a,0xe2,0xc4,0x89,0xc1,0x6e,0xa5,0x6c,0x57,0x4b,0x69,0xa7,0x85,0x46,0x3d,0x9f,
+ 0xe5,0xc6,0xd5,0xc8,0xbc,0xac,0x84,0x50,0x7b,0x50,0x15,0xa6,0x05,0x84,0x04,0x68,
+ 0x02,0xaa,0x03,0x6c,0x02,0x0c,0x43,0x5a,0x07,0xb0,0x72,0xfc,0xf8,0xf1,0xda,0x08,
+ 0x61,0x57,0x6e,0x8f,0xcc,0x41,0x1e,0x92,0x97,0x6c,0x51,0x8b,0xd0,0x29,0xed,0xd3,
+ 0xa6,0x4d,0xd3,0xed,0x79,0x4a,0x3b,0xf9,0xbf,0x78,0xf1,0xe2,0x7a,0xa5,0x3d,0xcb,
+ 0xed,0x6a,0xab,0x4a,0x24,0xd4,0xfe,0x28,0xad,0xc5,0xa2,0x54,0x24,0xa0,0x3a,0x40,
+ 0xdd,0xb0,0x9f,0x30,0xad,0x03,0x9a,0x88,0x6c,0x2c,0x09,0x33,0x69,0x7a,0x78,0x64,
+ 0x0f,0xf2,0x92,0x3c,0x45,0xdb,0x52,0xd8,0xe6,0xcd,0x9b,0xa7,0x3b,0xe4,0x72,0x50,
+ 0xda,0xed,0x80,0xac,0x4b,0x4b,0xcc,0x50,0x7b,0xa2,0x3c,0xac,0x2a,0x10,0x22,0xc0,
+ 0x3c,0x88,0xc0,0x0b,0x41,0x06,0x54,0x11,0x2f,0x08,0xe8,0x75,0xf2,0xc8,0x1c,0x92,
+ 0x8f,0xe4,0x29,0x06,0x1d,0x1b,0x3e,0x52,0xda,0xd9,0x99,0x3c,0x07,0xa5,0xdd,0x56,
+ 0xfd,0xe5,0x25,0xae,0x50,0x7b,0xa1,0x22,0x15,0x09,0x84,0x08,0xbc,0x10,0x6c,0x84,
+ 0x10,0x1e,0xb9,0x07,0x79,0x9b,0x63,0xa1,0x9b,0xc2,0xaf,0x28,0x49,0x15,0xea,0x34,
+ 0xc1,0x22,0xe5,0x43,0xd2,0xc2,0xa2,0xd0,0x92,0xef,0x20,0x41,0x69,0x9d,0x61,0xb8,
+ 0xd4,0xe7,0xdb,0x32,0x1f,0x96,0xd6,0xc9,0xb2,0xb4,0x24,0x6e,0xa8,0x6b,0x22,0x56,
+ 0xd6,0x75,0x16,0xd5,0xb8,0xba,0x8d,0x7d,0x68,0x72,0x61,0x49,0x9d,0xac,0xaa,0xeb,
+ 0x64,0x57,0x96,0x4a,0xc6,0xff,0x07,0x09,0xd2,0xdd,0xcf,0xb2,0x57,0xe1,0x2d,0x00,
+ 0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,
};
diff --git a/tools/printer-sm-png.h b/tools/printer-sm-png.h
new file mode 100644
index 00000000..033ccc88
--- /dev/null
+++ b/tools/printer-sm-png.h
@@ -0,0 +1,235 @@
+static const unsigned char printer_sm_png[] =
+{
+ 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
+ 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x08,0x03,0x00,0x00,0x00,0x60,0xdc,0x09,
+ 0xb5,0x00,0x00,0x04,0x19,0x69,0x43,0x43,0x50,0x6b,0x43,0x47,0x43,0x6f,0x6c,0x6f,
+ 0x72,0x53,0x70,0x61,0x63,0x65,0x47,0x65,0x6e,0x65,0x72,0x69,0x63,0x52,0x47,0x42,
+ 0x00,0x00,0x38,0x8d,0x8d,0x55,0x5d,0x68,0x1c,0x55,0x14,0x3e,0xbb,0x73,0x67,0x23,
+ 0x24,0xce,0x53,0x6c,0x34,0x85,0x74,0xa8,0x3f,0x0d,0x25,0x0d,0x93,0x56,0x34,0xa1,
+ 0xb4,0xba,0x7f,0xdd,0xdd,0x36,0x6e,0x96,0x49,0x36,0xda,0x22,0xe8,0x64,0xf6,0xee,
+ 0xce,0x98,0xc9,0xce,0x38,0x33,0xbb,0xfd,0xa1,0x4f,0x45,0x50,0x7c,0x31,0xea,0x9b,
+ 0x14,0xc4,0xbf,0xb7,0x80,0x20,0x28,0xf5,0x0f,0xdb,0x3e,0xb4,0x2f,0x95,0x0a,0x25,
+ 0xda,0xd4,0x20,0x28,0x3e,0xb4,0xf8,0x83,0x50,0xe8,0x8b,0xa6,0xeb,0x99,0x3b,0x33,
+ 0x99,0x69,0xba,0xb1,0xde,0x65,0xee,0x7c,0xf3,0x9d,0xef,0x9e,0x7b,0xee,0xb9,0x67,
+ 0xef,0x05,0xe8,0xb9,0xaa,0x58,0x96,0x91,0x14,0x01,0x16,0x9a,0xae,0x2d,0x17,0x32,
+ 0xe2,0x73,0x87,0x8f,0x88,0x3d,0x2b,0x90,0x84,0x87,0xa0,0x17,0x06,0xa1,0x57,0x51,
+ 0x1d,0x2b,0x5d,0xa9,0x4c,0x02,0x36,0x4f,0x0b,0x77,0xb5,0x5b,0xdf,0x43,0xc2,0x7b,
+ 0x5f,0xd9,0xd5,0xdd,0xfe,0x9f,0xad,0xb7,0x46,0x1d,0x15,0x20,0x71,0x1f,0x62,0xb3,
+ 0xe6,0xa8,0x0b,0x88,0x8f,0x01,0xf0,0xa7,0x55,0xcb,0x76,0x01,0x7a,0xfa,0x91,0x1f,
+ 0x3f,0xea,0x5a,0x1e,0xf6,0x62,0xe8,0xb7,0x31,0x40,0xc4,0x2f,0x7a,0xb8,0xe1,0x63,
+ 0xd7,0xc3,0x73,0x3e,0x7e,0x8d,0x69,0x66,0xe4,0x2c,0xe2,0xd3,0x88,0x05,0x55,0x53,
+ 0x6a,0x88,0x97,0x10,0x8f,0xcc,0xc5,0xf8,0x46,0x0c,0xfb,0x31,0xb0,0xd6,0x5f,0xa0,
+ 0x4d,0x6a,0xeb,0xaa,0xe8,0xe5,0xa2,0x62,0x9b,0x75,0xdd,0xa0,0xb1,0x70,0xef,0x61,
+ 0xfe,0x9f,0x6d,0xc1,0x68,0x85,0xf3,0x6d,0xc3,0xa7,0xcf,0x99,0x9f,0x3e,0x84,0xef,
+ 0x61,0x5c,0xfb,0x2b,0x35,0x25,0xe7,0xe1,0x51,0xc4,0x4b,0xaa,0x92,0x9f,0x46,0xfc,
+ 0x08,0xe2,0x6b,0x6d,0x7d,0xb6,0x1c,0xe0,0xdb,0x96,0x9b,0x91,0x11,0x3f,0x06,0x90,
+ 0xdc,0xde,0x9a,0xaf,0xa6,0x11,0xef,0x44,0x5c,0xac,0xdb,0x07,0xaa,0xbe,0x9f,0xa4,
+ 0xad,0xb5,0x8a,0x21,0x7e,0xe7,0x84,0x36,0xf3,0x2c,0xe2,0x2d,0x88,0xcf,0x37,0xe7,
+ 0xca,0x53,0xc1,0xd8,0xab,0xaa,0x93,0xc5,0x9c,0xc1,0x76,0xc4,0xb7,0x35,0x5a,0xf2,
+ 0xf2,0x3b,0x04,0xc0,0x89,0xba,0x5b,0x9a,0xf1,0xc7,0x72,0xfb,0x6d,0x53,0x9e,0xf2,
+ 0xe7,0xe5,0xea,0x35,0x9a,0xcb,0x7b,0x79,0x44,0xfc,0xfa,0xbc,0x79,0x48,0xf6,0x7d,
+ 0x72,0x9f,0x39,0xed,0xe9,0x7c,0xe8,0xf3,0x84,0x96,0x2d,0x07,0xfc,0xa5,0x97,0x94,
+ 0x83,0x15,0xc4,0x83,0x88,0x7f,0xa1,0x46,0x41,0xf6,0xe7,0xe2,0xfe,0xb1,0xdc,0x4a,
+ 0x10,0x03,0x19,0x6a,0x1a,0xe5,0x49,0x7f,0x2e,0x92,0xa3,0x0e,0x5b,0x2f,0xe3,0x5d,
+ 0x6d,0xa6,0xe8,0xcf,0x4b,0x0c,0x17,0x37,0xd4,0x1f,0x4b,0x16,0xeb,0xfa,0x81,0x52,
+ 0xa0,0xff,0x44,0xb3,0x8b,0x72,0x80,0xaf,0x59,0x06,0xab,0x51,0x8c,0x8d,0x4f,0xda,
+ 0x2d,0xb9,0xea,0xeb,0xf9,0x51,0xc5,0xce,0x17,0x7c,0x9f,0x7c,0x85,0x36,0xab,0x81,
+ 0x7f,0xbe,0x0d,0xb3,0x09,0x05,0x28,0x98,0x30,0x87,0xbd,0x0a,0x4d,0x58,0x03,0x11,
+ 0x64,0x28,0x40,0x06,0xdf,0x16,0xd8,0x68,0xa9,0x83,0x0e,0x06,0x32,0x14,0xad,0x14,
+ 0x19,0x8a,0x5f,0xa1,0x66,0x17,0x1b,0xe7,0xc0,0x3c,0xf2,0x3a,0xb4,0x99,0xcd,0xc1,
+ 0xbe,0xc2,0x94,0xfe,0xc8,0xc8,0x5f,0x83,0xf9,0xb8,0xce,0xb4,0x2a,0x64,0x87,0x3e,
+ 0x82,0x16,0xb2,0x1a,0xfc,0x8e,0xac,0x16,0xd3,0x65,0xf1,0xab,0x85,0x5c,0x63,0x13,
+ 0x3f,0x7e,0x2c,0x37,0x02,0x3f,0x26,0x19,0x20,0x12,0xd9,0x83,0xcf,0x5e,0x32,0x49,
+ 0xf6,0x91,0x71,0x32,0x01,0x22,0x79,0x8a,0x3c,0x4d,0xf6,0x93,0x1c,0xb2,0x13,0x64,
+ 0xef,0xfa,0xd8,0x4a,0x6c,0x45,0x5e,0x3c,0x37,0xd6,0xfd,0xbc,0x8c,0x33,0x52,0xa6,
+ 0x9b,0x45,0xdd,0x39,0xb4,0xbb,0xa0,0x60,0xff,0x33,0x2a,0x4c,0x5c,0x53,0xd7,0xac,
+ 0x2c,0x0e,0xb6,0x86,0x23,0xcb,0x29,0xfb,0x05,0x5d,0xbd,0xfc,0xc6,0x5f,0xb1,0x5c,
+ 0xe9,0x2c,0x37,0x51,0xb6,0xe2,0x19,0x9d,0xba,0x57,0xce,0xf9,0x5f,0xf9,0xeb,0xfc,
+ 0x32,0xf6,0x2b,0xfc,0x6a,0xa4,0xe0,0x7f,0xe4,0x57,0xf1,0xb7,0x72,0xc7,0x5a,0xcc,
+ 0xbb,0xb2,0x4c,0xc3,0xec,0x6c,0x58,0x73,0x77,0x55,0x1a,0x6d,0x06,0xe3,0x16,0xf0,
+ 0xd1,0x99,0xc5,0x89,0xc5,0x1d,0xf3,0x71,0xf1,0xe4,0x57,0x0f,0x46,0x7e,0x96,0xc9,
+ 0x99,0xe7,0xaf,0xf4,0x5d,0x3c,0x59,0x6f,0x2e,0x0e,0x46,0xac,0x97,0x05,0xfa,0x6a,
+ 0xf9,0x56,0x19,0x4e,0x8d,0x44,0xac,0xf4,0x83,0xf4,0x87,0xb4,0x2c,0xbd,0x27,0x7d,
+ 0x28,0xfd,0xc6,0xbd,0xcd,0x7d,0xca,0x7d,0xcd,0x7d,0xce,0x7d,0xc1,0x5d,0x02,0x91,
+ 0x3b,0xcb,0x9d,0xe3,0xbe,0xe1,0x2e,0x70,0x1f,0x73,0x5f,0xc6,0xf6,0x6a,0xf3,0x1a,
+ 0x5a,0xdf,0x7b,0x16,0x79,0x18,0xb7,0x67,0xe9,0x96,0x6b,0xac,0x4a,0x21,0x23,0x6c,
+ 0x15,0x1e,0x16,0x72,0xc2,0x36,0xe1,0x51,0x61,0x32,0xf2,0x27,0x0c,0x08,0x63,0x42,
+ 0x51,0xd8,0x81,0x96,0xad,0xeb,0xfb,0x16,0x9f,0x2f,0x9e,0x3d,0x1d,0x0e,0x63,0x1f,
+ 0xe6,0xa7,0xfb,0x5c,0xbe,0x2e,0x56,0x01,0x89,0xfb,0xb1,0x02,0xf4,0x4d,0xfe,0x55,
+ 0x55,0x54,0xe9,0x70,0x94,0x29,0x1d,0x56,0x6f,0x4d,0x38,0xbe,0x41,0x13,0x8c,0x24,
+ 0x43,0x64,0x8c,0x94,0x36,0x54,0xf7,0xb8,0x57,0xf3,0xa1,0x22,0x95,0x4f,0xe5,0x52,
+ 0x69,0x10,0x53,0x3b,0x53,0x13,0xa9,0xb1,0xd4,0x41,0x0f,0x87,0xb3,0xa6,0x76,0xa0,
+ 0x6d,0x02,0xfb,0xfc,0x1d,0xd5,0xa9,0x6e,0xb2,0x52,0xea,0xd2,0x63,0xde,0x7d,0x02,
+ 0x59,0xd3,0x3a,0x6e,0xeb,0x0d,0xcd,0x15,0x77,0x4b,0xd2,0x93,0x62,0x1a,0xaf,0x36,
+ 0x2a,0x96,0x9a,0xea,0xe8,0x88,0xa8,0x18,0x86,0xc8,0x4c,0x8e,0x68,0x53,0x87,0xda,
+ 0x6d,0x5a,0x1b,0x05,0xef,0xde,0xf4,0x8f,0xf4,0x9b,0x32,0xbb,0x0f,0x13,0x5b,0x2e,
+ 0x47,0x9c,0xfb,0x0c,0xc0,0xbe,0x3f,0xf1,0xec,0xfb,0x2e,0xe2,0x8e,0xb4,0x00,0x96,
+ 0x1c,0x80,0x81,0xc7,0x23,0x6e,0x18,0xcf,0xca,0x07,0xde,0x05,0x38,0xf3,0x84,0xda,
+ 0xb2,0xdb,0xc1,0x1d,0x91,0x48,0x7c,0x0b,0xe0,0xd4,0xf7,0xec,0xf6,0xbf,0xfa,0x32,
+ 0x78,0x7e,0xfd,0xd4,0xe9,0xdc,0xc4,0x73,0xac,0xe7,0x2d,0x80,0xb5,0x37,0x3b,0x9d,
+ 0xbf,0xdf,0xef,0x74,0xd6,0x3e,0x40,0xff,0xab,0x00,0x67,0x8d,0x7f,0x01,0xa0,0x9f,
+ 0x7c,0x55,0x03,0x5c,0x0b,0xef,0x00,0x00,0x00,0x38,0x65,0x58,0x49,0x66,0x4d,0x4d,
+ 0x00,0x2a,0x00,0x00,0x00,0x08,0x00,0x01,0x87,0x69,0x00,0x04,0x00,0x00,0x00,0x01,
+ 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x00,0x00,0x02,0xa0,0x02,0x00,0x04,0x00,0x00,
+ 0x00,0x01,0x00,0x00,0x00,0x30,0xa0,0x03,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x30,0x00,0x00,0x00,0x00,0xf8,0xff,0x4e,0x36,0x00,0x00,0x03,0x62,0x69,0x54,
+ 0x58,0x74,0x58,0x4d,0x4c,0x3a,0x63,0x6f,0x6d,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e,
+ 0x78,0x6d,0x70,0x00,0x00,0x00,0x00,0x00,0x3c,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65,
+ 0x74,0x61,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x78,0x3d,0x22,0x61,0x64,0x6f,0x62,
+ 0x65,0x3a,0x6e,0x73,0x3a,0x6d,0x65,0x74,0x61,0x2f,0x22,0x20,0x78,0x3a,0x78,0x6d,
+ 0x70,0x74,0x6b,0x3d,0x22,0x58,0x4d,0x50,0x20,0x43,0x6f,0x72,0x65,0x20,0x35,0x2e,
+ 0x34,0x2e,0x30,0x22,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x52,0x44,
+ 0x46,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x72,0x64,0x66,0x3d,0x22,0x68,0x74,0x74,
+ 0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x77,0x33,0x2e,0x6f,0x72,0x67,0x2f,0x31,
+ 0x39,0x39,0x39,0x2f,0x30,0x32,0x2f,0x32,0x32,0x2d,0x72,0x64,0x66,0x2d,0x73,0x79,
+ 0x6e,0x74,0x61,0x78,0x2d,0x6e,0x73,0x23,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x3c,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x69,0x6f,
+ 0x6e,0x20,0x72,0x64,0x66,0x3a,0x61,0x62,0x6f,0x75,0x74,0x3d,0x22,0x22,0x0a,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,
+ 0x3a,0x64,0x63,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x70,0x75,0x72,0x6c,
+ 0x2e,0x6f,0x72,0x67,0x2f,0x64,0x63,0x2f,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73,
+ 0x2f,0x31,0x2e,0x31,0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x49,0x70,0x74,0x63,0x34,0x78,0x6d,
+ 0x70,0x45,0x78,0x74,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x69,0x70,0x74,
+ 0x63,0x2e,0x6f,0x72,0x67,0x2f,0x73,0x74,0x64,0x2f,0x49,0x70,0x74,0x63,0x34,0x78,
+ 0x6d,0x70,0x45,0x78,0x74,0x2f,0x32,0x30,0x30,0x38,0x2d,0x30,0x32,0x2d,0x32,0x39,
+ 0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,
+ 0x6d,0x6c,0x6e,0x73,0x3a,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3d,0x22,
+ 0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6e,0x73,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e,
+ 0x63,0x6f,0x6d,0x2f,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x2f,0x31,0x2e,
+ 0x30,0x2f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,
+ 0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x53,0x65,0x71,0x3e,
+ 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x4d,0x69,0x63,0x68,0x61,0x65,0x6c,0x20,
+ 0x53,0x77,0x65,0x65,0x74,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,
+ 0x3a,0x53,0x65,0x71,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
+ 0x2f,0x64,0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,0x74,0x73,
+ 0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,
+ 0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x20,0x78,
+ 0x6d,0x6c,0x3a,0x6c,0x61,0x6e,0x67,0x3d,0x22,0x78,0x2d,0x64,0x65,0x66,0x61,0x75,
+ 0x6c,0x74,0x22,0x3e,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x32,0x30,
+ 0x31,0x30,0x20,0x41,0x70,0x70,0x6c,0x65,0x20,0x49,0x6e,0x63,0x2e,0x3c,0x2f,0x72,
+ 0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,
+ 0x74,0x73,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x70,
+ 0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,
+ 0x6e,0x65,0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x49,0x70,
+ 0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,
+ 0x6e,0x65,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x68,
+ 0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,
+ 0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x70,0x68,0x6f,0x74,
+ 0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,0x3e,0x0a,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,
+ 0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,
+ 0x66,0x3a,0x52,0x44,0x46,0x3e,0x0a,0x3c,0x2f,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65,
+ 0x74,0x61,0x3e,0x0a,0xa0,0x50,0x98,0x64,0x00,0x00,0x02,0xa0,0x50,0x4c,0x54,0x45,
+ 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff,
+ 0xff,0xff,0xfc,0xfc,0xfc,0xff,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x01,0x02,0x02,
+ 0x02,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x07,
+ 0x08,0x08,0x08,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0d,
+ 0x0d,0x0d,0x0f,0x0f,0x0f,0x10,0x10,0x10,0x11,0x11,0x11,0x12,0x12,0x12,0x13,0x13,
+ 0x13,0x14,0x14,0x14,0x15,0x15,0x15,0x16,0x16,0x16,0x18,0x18,0x18,0x19,0x19,0x19,
+ 0x1c,0x1c,0x1c,0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1f,0x1f,0x1f,0x20,0x20,0x20,0x21,
+ 0x21,0x21,0x22,0x22,0x22,0x23,0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25,0x26,0x26,
+ 0x26,0x27,0x27,0x27,0x28,0x28,0x28,0x29,0x29,0x29,0x2a,0x2a,0x2a,0x2c,0x2c,0x2c,
+ 0x2d,0x2d,0x2d,0x2d,0x2e,0x39,0x2e,0x2e,0x2e,0x2e,0x2e,0x39,0x2e,0x2f,0x35,0x2f,
+ 0x2f,0x2f,0x2f,0x2f,0x3a,0x30,0x30,0x30,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,
+ 0x33,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38,
+ 0x38,0x3c,0x55,0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3a,0x3a,0x3c,0x3b,0x3b,0x3b,0x3c,
+ 0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,0x3e,0x3e,0x3e,0x43,0x60,0x3f,0x3f,0x3f,0x40,0x40,
+ 0x40,0x41,0x41,0x41,0x41,0x42,0x45,0x41,0x44,0x4c,0x42,0x42,0x42,0x43,0x43,0x43,
+ 0x44,0x44,0x44,0x45,0x45,0x45,0x46,0x46,0x46,0x47,0x47,0x47,0x48,0x48,0x48,0x49,
+ 0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b,0x4c,0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,
+ 0x4e,0x4f,0x4f,0x4f,0x50,0x50,0x50,0x51,0x51,0x51,0x52,0x52,0x52,0x53,0x53,0x53,
+ 0x54,0x54,0x54,0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57,0x57,0x58,0x58,0x58,0x59,
+ 0x59,0x59,0x5a,0x5a,0x5a,0x5b,0x5b,0x5b,0x5c,0x5c,0x5c,0x5e,0x5e,0x5e,0x5f,0x5f,
+ 0x5f,0x5f,0x6e,0x90,0x60,0x60,0x60,0x60,0x69,0xa2,0x61,0x61,0x61,0x62,0x62,0x62,
+ 0x63,0x63,0x63,0x65,0x65,0x65,0x66,0x66,0x66,0x67,0x67,0x67,0x68,0x68,0x68,0x6a,
+ 0x6a,0x6a,0x6a,0x7a,0xa0,0x6b,0x6b,0x6b,0x6c,0x6c,0x6c,0x6d,0x6d,0x6d,0x71,0x71,
+ 0x71,0x71,0x82,0xab,0x71,0x83,0xac,0x72,0x72,0x72,0x74,0x74,0x74,0x76,0x76,0x76,
+ 0x77,0x77,0x77,0x79,0x79,0x79,0x7c,0x7c,0x7c,0x7d,0x7d,0x7d,0x7f,0x7f,0x7f,0x80,
+ 0x80,0x80,0x81,0x81,0x81,0x82,0x82,0x82,0x83,0x83,0x83,0x84,0x84,0x84,0x85,0x85,
+ 0x85,0x86,0x86,0x86,0x87,0x87,0x87,0x8a,0x8a,0x8a,0x8c,0x8c,0x8c,0x8d,0x8d,0x8d,
+ 0x8e,0x8e,0x8e,0x90,0x90,0x90,0x91,0x91,0x91,0x92,0x92,0x92,0x93,0x93,0x93,0x96,
+ 0x96,0x96,0x98,0x98,0x98,0x9b,0x9b,0x9b,0x9d,0x9d,0x9d,0x9f,0x9f,0x9f,0xa0,0xa0,
+ 0xa0,0xa2,0xa2,0xa2,0xa3,0xa3,0xa3,0xa6,0xa6,0xa6,0xa7,0xa7,0xa7,0xa8,0xa8,0xa8,
+ 0xaa,0xaa,0xaa,0xab,0xab,0xab,0xad,0xad,0xad,0xae,0xae,0xae,0xaf,0xaf,0xaf,0xb0,
+ 0xb0,0xb0,0xb2,0xb2,0xb2,0xb4,0xb4,0xb4,0xb7,0xb7,0xb7,0xb9,0xb9,0xb9,0xba,0xba,
+ 0xba,0xbb,0xbb,0xbb,0xbc,0xbc,0xbc,0xbd,0xbd,0xbd,0xbe,0xbe,0xbe,0xc0,0xc0,0xc0,
+ 0xc2,0xc2,0xc2,0xc3,0xc3,0xc3,0xc4,0xc4,0xc4,0xc5,0xc5,0xc5,0xc6,0xc6,0xc6,0xc7,
+ 0xc7,0xc7,0xc9,0xc9,0xc9,0xca,0xca,0xca,0xcc,0xcc,0xcc,0xcd,0xcd,0xcd,0xce,0xce,
+ 0xce,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0xd4,0xd4,0xd4,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9,
+ 0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xde,0xde,0xde,0xdf,
+ 0xdf,0xdf,0xe0,0xe0,0xe0,0xe2,0xe2,0xe2,0xe3,0xe3,0xe3,0xe5,0xe5,0xe5,0xe6,0xe6,
+ 0xe6,0xe9,0xe9,0xe9,0xea,0xea,0xea,0xeb,0xeb,0xeb,0xed,0xed,0xed,0xee,0xee,0xee,
+ 0xef,0xef,0xef,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0xf4,
+ 0xf4,0xf4,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xfa,0xfa,
+ 0xfa,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe,0xfe,0xfe,0xff,0xff,0xff,
+ 0x96,0xb7,0x1b,0xef,0x00,0x00,0x00,0x08,0x74,0x52,0x4e,0x53,0x00,0x08,0x7f,0xc4,
+ 0xdc,0xdc,0xfc,0xfc,0x86,0xfa,0x37,0x3a,0x00,0x00,0x03,0x97,0x49,0x44,0x41,0x54,
+ 0x18,0x19,0x95,0xc1,0x6f,0x68,0xd4,0x75,0x1c,0xc0,0xf1,0xf7,0xe7,0xfb,0xfb,0xfe,
+ 0xee,0xcf,0xe6,0xb1,0x73,0x53,0xdb,0xfa,0xc3,0xc2,0x1d,0x35,0xcc,0x1c,0x4a,0x60,
+ 0x89,0x3e,0x50,0xfa,0x43,0x52,0x4a,0x52,0x94,0x48,0x33,0x0c,0x1f,0x84,0x21,0x3d,
+ 0xe8,0x0f,0xe1,0xa3,0x20,0x0c,0x83,0x11,0x42,0x04,0xd2,0x1f,0xb0,0x7a,0x12,0x14,
+ 0x66,0xd1,0x13,0x35,0x08,0x4b,0x4b,0x54,0xc4,0xd4,0x5c,0x63,0x78,0xe8,0x6a,0x59,
+ 0x6a,0xdb,0xed,0x76,0xdb,0xfd,0xee,0xee,0xf7,0xfd,0xf4,0xbb,0x6d,0xa2,0x79,0x3a,
+ 0xcf,0xd7,0x4b,0x10,0xf1,0x4c,0x2f,0xf5,0xe8,0x74,0xa1,0xaa,0x88,0xe9,0xa7,0x7e,
+ 0x19,0x67,0xe4,0xf0,0xaf,0xd4,0xaf,0x5f,0x8c,0x37,0x36,0xc0,0x2d,0xf0,0xac,0xa9,
+ 0x8c,0xd1,0x73,0xcf,0x2f,0xab,0x16,0x1f,0xb8,0x74,0xac,0x7d,0xf5,0xcc,0x93,0xbb,
+ 0x16,0x3c,0xf1,0xc1,0x86,0xc6,0x3d,0x6d,0xb3,0x76,0xf9,0x6b,0x5a,0xa8,0x61,0x4c,
+ 0x6f,0xe1,0x08,0x9f,0x8d,0x3c,0xf7,0x6a,0xe9,0xfc,0xce,0x55,0x43,0x7b,0x83,0x2d,
+ 0x2f,0x1d,0x3f,0x65,0x0e,0xba,0xf7,0xdb,0x7b,0x96,0xb7,0xed,0xa3,0x56,0xaf,0x25,
+ 0x92,0x5c,0x47,0x7b,0x96,0x75,0x0b,0x83,0xdd,0x99,0x0b,0xef,0x5c,0x1c,0x5c,0xbe,
+ 0xa3,0x69,0x59,0x7c,0xaf,0x16,0xe6,0x0d,0xf6,0xc0,0x83,0xcf,0xf0,0x3f,0x96,0x88,
+ 0x2b,0xc6,0x06,0xdb,0x4f,0x16,0xf9,0xa7,0xab,0x63,0xc6,0x36,0x0b,0xd9,0x1d,0xaf,
+ 0xc4,0xbb,0x36,0xcd,0x85,0x1e,0x6a,0x58,0x22,0xe1,0xd6,0x73,0x9b,0x13,0x7c,0x7d,
+ 0xac,0xfc,0x7a,0xd3,0xcb,0x2f,0xb6,0x3e,0xf2,0x70,0xf7,0xa7,0xf7,0xb3,0x79,0x5b,
+ 0x3a,0xb3,0x91,0x5a,0x92,0x05,0x1e,0xfa,0xb9,0x98,0xe0,0x2b,0x59,0x99,0x00,0x2a,
+ 0xe5,0x24,0x93,0xf2,0x29,0xae,0xc3,0x12,0x79,0x96,0x04,0xb4,0x49,0x82,0x88,0xb5,
+ 0x4c,0x49,0x71,0x3d,0x92,0xe5,0xd6,0x18,0x6e,0x91,0xe1,0xc6,0x8e,0x0f,0x53,0xcb,
+ 0x70,0x63,0x03,0xe3,0x4c,0xf8,0x84,0xab,0x58,0x6a,0x7c,0x91,0xda,0xbf,0xec,0xf1,
+ 0x81,0x1f,0x87,0x17,0x15,0x2a,0x67,0x0f,0x94,0xb2,0x1b,0xb2,0xef,0x9d,0x5b,0x9f,
+ 0xd8,0xe5,0xaf,0x69,0xe9,0xe9,0x18,0x5f,0x8b,0xa1,0xc6,0xe1,0x43,0x2f,0x7c,0x7e,
+ 0xaa,0xb0,0x7d,0xc9,0xc2,0xc3,0x85,0xc2,0xbb,0x99,0xfb,0xbe,0x5f,0xd2,0xf8,0x5a,
+ 0x7b,0xcf,0xf2,0xb6,0x7d,0xec,0xf4,0x56,0x82,0x65,0x8a,0x73,0x0a,0x82,0x88,0xb0,
+ 0xb6,0xf3,0xd1,0xfe,0x7b,0x57,0x2c,0x22,0xf2,0xd8,0xd2,0x83,0x87,0x62,0xd2,0x18,
+ 0xec,0xd5,0xc2,0x3c,0x1a,0x9f,0x04,0x2c,0x13,0xb4,0xd2,0xff,0xe5,0x88,0xb1,0x5e,
+ 0x43,0x73,0x6b,0xa7,0x16,0x39,0xf3,0x34,0x57,0xf1,0x82,0x78,0xd7,0xa6,0xb9,0x4c,
+ 0xb2,0x44,0x34,0x1c,0xf9,0xb6,0x8f,0x18,0x12,0x8e,0xe6,0x8e,0xfc,0xe0,0x3e,0x72,
+ 0xed,0xf3,0x7f,0xe7,0x8a,0xe7,0xdf,0x7c,0x63,0xf3,0xb6,0x74,0x66,0xa3,0x10,0x91,
+ 0x2c,0x1a,0x9e,0xf9,0x69,0x80,0x2a,0x1d,0x1d,0x6b,0xca,0xcd,0xba,0xb8,0xa9,0x23,
+ 0x01,0xaa,0xea,0xb4,0x70,0x62,0xe6,0x7c,0x81,0xe1,0x34,0xe4,0x53,0x4c,0xb0,0x50,
+ 0xd9,0xff,0x21,0x53,0x32,0x7a,0x36,0xd7,0xfc,0x40,0xd2,0x2f,0xeb,0xd8,0xf1,0xd3,
+ 0x47,0x7f,0xcb,0xb9,0xa7,0xb6,0xa8,0x40,0x1a,0x48,0x31,0xc9,0xe2,0x8a,0xdf,0x71,
+ 0x99,0xeb,0x1b,0xaf,0x54,0x5a,0xf7,0x1c,0x3d,0x9d,0xab,0x58,0x5f,0xc6,0x1a,0xb6,
+ 0x76,0x71,0x2d,0x8b,0x2b,0x0e,0x72,0x99,0x1b,0x2d,0xbb,0x6f,0x76,0x83,0xe7,0x25,
+ 0x5c,0xe0,0x56,0x74,0xb7,0x18,0x57,0x12,0x2e,0x13,0xf1,0x0c,0x16,0x57,0x62,0x4a,
+ 0x30,0x32,0x98,0x0f,0xed,0x0c,0xdf,0x7a,0x7e,0xcc,0x4b,0xfa,0x7e,0xe9,0x63,0x15,
+ 0xae,0x08,0x0b,0xa9,0xed,0x09,0x63,0xa1,0xc2,0xa4,0x20,0x48,0xde,0x19,0x36,0x59,
+ 0xae,0x6f,0xd8,0xcd,0x69,0xd6,0x51,0xdf,0x58,0x54,0x99,0x14,0x8f,0x13,0x70,0x89,
+ 0x1b,0xb8,0x0b,0x55,0x2d,0x2a,0x96,0x2a,0xef,0x76,0x95,0xa1,0x7c,0xd9,0xc8,0x1d,
+ 0x56,0x14,0x51,0xe1,0x1a,0xa5,0xbf,0x55,0x41,0x9d,0x62,0x89,0xd8,0xbb,0x8d,0x14,
+ 0xfc,0xc5,0x70,0x22,0x96,0x04,0x54,0x94,0x2a,0x51,0x41,0x45,0x89,0x5c,0xc0,0x89,
+ 0x52,0x65,0x89,0xa4,0x1b,0xe0,0xdf,0x8e,0x26,0x2d,0xa7,0xd2,0x5c,0x45,0x54,0x50,
+ 0x51,0x60,0x30,0xef,0x2b,0x4a,0x95,0x25,0x92,0x68,0x74,0x6e,0xf6,0x5f,0x7f,0x3a,
+ 0x3b,0xdb,0x29,0xaa,0xa2,0xa2,0x22,0x88,0x08,0x46,0xc4,0x9a,0x7c,0xdf,0x25,0xdf,
+ 0xc7,0x81,0x02,0x96,0xc8,0x1f,0xd9,0xc0,0xa9,0xa2,0x0a,0x28,0x53,0x04,0x04,0x41,
+ 0x04,0x35,0x80,0x03,0x42,0xc0,0x52,0xe5,0x7b,0x65,0xa6,0x63,0x7c,0x20,0x54,0x01,
+ 0x2c,0x13,0x4c,0x9c,0x9b,0x08,0x15,0x71,0x80,0xa5,0x4e,0xaa,0x28,0x11,0x4b,0x9d,
+ 0xd4,0xa1,0x02,0x18,0xea,0xe4,0x50,0x14,0xb0,0x40,0x91,0x3a,0x9c,0xbf,0x4d,0x95,
+ 0x88,0x05,0x12,0xd4,0x21,0xe5,0x84,0x2a,0x4b,0xbd,0x1c,0x04,0x80,0xa5,0x4e,0x61,
+ 0x09,0x19,0x17,0xb0,0xd4,0x29,0x07,0x41,0xe8,0x09,0x16,0x31,0x4d,0x39,0x6e,0x2e,
+ 0x20,0xf0,0xde,0x8a,0x1b,0x4c,0xa7,0xd8,0xa5,0xdc,0xdc,0x50,0xb9,0x65,0xfd,0xdb,
+ 0xad,0x0d,0x5e,0xa7,0x75,0x26,0xbe,0x40,0x0f,0xe4,0x98,0x5e,0xbe,0xb9,0x7b,0x56,
+ 0x3a,0x95,0x4a,0x88,0xb3,0xa1,0x69,0x98,0xb3,0x28,0x53,0x72,0x4c,0x47,0x6c,0x43,
+ 0x7a,0x46,0x32,0xee,0x1b,0x42,0x11,0xd3,0x17,0x8c,0x05,0x65,0x65,0x3a,0x62,0x63,
+ 0xc9,0x98,0x35,0x90,0x71,0x82,0x88,0x31,0x27,0x55,0x99,0x96,0x18,0x4f,0xe8,0x74,
+ 0xa1,0xea,0x7f,0x66,0xc2,0x6f,0x17,0x59,0xdf,0xbf,0x1b,0x00,0x00,0x00,0x00,0x49,
+ 0x45,0x4e,0x44,0xae,0x42,0x60,0x82,
+
+};
diff --git a/tools/printer-sm.png b/tools/printer-sm.png
new file mode 100644
index 00000000..e87527e7
--- /dev/null
+++ b/tools/printer-sm.png
Binary files differ
diff --git a/tools/printer.png b/tools/printer.png
index 9bb5196a..1d499b63 100644
--- a/tools/printer.png
+++ b/tools/printer.png
Binary files differ
diff --git a/vcnet/config.h b/vcnet/config.h
index 76fc7fd5..b74bf2e0 100644
--- a/vcnet/config.h
+++ b/vcnet/config.h
@@ -1,7 +1,7 @@
/*
* Configuration file for CUPS on Windows.
*
- * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2007-2022 by Apple Inc.
* Copyright © 1997-2007 by Easy Software Products.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
@@ -97,8 +97,8 @@ typedef unsigned long useconds_t;
* Version of software...
*/
-#define CUPS_SVERSION "CUPS v2.3.3"
-#define CUPS_MINIMAL "CUPS/2.3.3"
+#define CUPS_SVERSION "CUPS v2.3.6"
+#define CUPS_MINIMAL "CUPS/2.3.6"
/*
@@ -330,9 +330,8 @@ typedef unsigned long useconds_t;
* Do we have the (v)snprintf() functions?
*/
-/* Windows snprintf/vsnprintf are non-conforming */
-/* #undef HAVE_SNPRINTF */
-/* #undef HAVE_VSNPRINTF */
+#define HAVE_SNPRINTF 1
+#define HAVE_VSNPRINTF 1
/*
diff --git a/vcnet/dns_sd.c b/vcnet/dns_sd.c
index 25131dd6..95236792 100644
--- a/vcnet/dns_sd.c
+++ b/vcnet/dns_sd.c
@@ -102,7 +102,7 @@ DNSServiceErrorType DNSSD_API DNSServiceAddRecord
if (dnssd_add_record)
return (*dnssd_add_record)(sdRef, RecordRef, flags, rrtype, rdlen, rdata, ttl);
else
- return (-1);
+ return (kDNSServiceErr_ServiceNotRunning);
}
@@ -124,7 +124,7 @@ DNSServiceErrorType DNSSD_API DNSServiceBrowse
if (dnssd_browse)
return (*dnssd_browse)(sdRef, flags, interfaceIndex, regtype, domain, callBack, context);
else
- return (-1);
+ return (kDNSServiceErr_ServiceNotRunning);
}
@@ -156,7 +156,7 @@ DNSServiceErrorType DNSSD_API DNSServiceCreateConnection(DNSServiceRef *sdRef)
if (dnssd_create_connection)
return (*dnssd_create_connection)(sdRef);
else
- return (-1);
+ return (kDNSServiceErr_ServiceNotRunning);
}
@@ -169,7 +169,7 @@ DNSServiceErrorType DNSSD_API DNSServiceProcessResult(DNSServiceRef sdRef)
if (dnssd_process_result)
return (*dnssd_process_result)(sdRef);
else
- return (-1);
+ return (kDNSServiceErr_ServiceNotRunning);
}
@@ -192,7 +192,7 @@ DNSServiceErrorType DNSSD_API DNSServiceQueryRecord
if (dnssd_query_record)
return (*dnssd_query_record)(sdRef, flags, interfaceIndex, fullname, rrtype, rrclass, callBack, context);
else
- return (-1);
+ return (kDNSServiceErr_ServiceNotRunning);
}
@@ -216,7 +216,7 @@ int DNSSD_API DNSServiceRefSockFD(DNSServiceRef sdRef)
if (dnssd_sock_fd)
return (*dnssd_sock_fd)(sdRef);
else
- return (-1);
+ return (kDNSServiceErr_ServiceNotRunning);
}
@@ -243,7 +243,7 @@ DNSServiceErrorType DNSSD_API DNSServiceRegister
if (dnssd_register)
return (*dnssd_register)(sdRef, flags, interfaceIndex, name, regtype, domain, host, port, txtLen, txtRecord, callBack, context);
else
- return (-1);
+ return (kDNSServiceErr_ServiceNotRunning);
}
@@ -261,7 +261,7 @@ DNSServiceErrorType DNSSD_API DNSServiceRemoveRecord
if (dnssd_remove_record)
return (*dnssd_remove_record)(sdRef, RecordRef, flags);
else
- return (-1);
+ return (kDNSServiceErr_ServiceNotRunning);
}
@@ -284,7 +284,7 @@ DNSServiceErrorType DNSSD_API DNSServiceResolve
if (dnssd_resolve)
return (*dnssd_resolve)(sdRef, flags, interfaceIndex, name, regtype, domain, callBack, context);
else
- return (-1);
+ return (kDNSServiceErr_ServiceNotRunning);
}
@@ -305,7 +305,7 @@ DNSServiceErrorType DNSSD_API DNSServiceUpdateRecord
if (dnssd_update_record)
return (*dnssd_update_record)(sdRef, RecordRef, flags, rdlen, rdata, ttl);
else
- return (-1);
+ return (kDNSServiceErr_ServiceNotRunning);
}
diff --git a/xcode/config.h b/xcode/config.h
index 5953431a..f0500775 100644
--- a/xcode/config.h
+++ b/xcode/config.h
@@ -1,7 +1,7 @@
/*
* Configuration file for CUPS and Xcode.
*
- * Copyright 2007-2019 by Apple Inc.
+ * Copyright 2007-2022 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more information.
@@ -18,8 +18,8 @@
* Version of software...
*/
-#define CUPS_SVERSION "CUPS v2.3.3"
-#define CUPS_MINIMAL "CUPS/2.3.3"
+#define CUPS_SVERSION "CUPS v2.3.6"
+#define CUPS_MINIMAL "CUPS/2.3.6"
/*