]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Update ipp documentation to reflect the behavior of configuring WiFi on IPP USB printers. master
authorSteve Algernon <salgernon@apple.com>
Fri, 27 Oct 2023 22:47:22 +0000 (15:47 -0700)
committerSteve Algernon <salgernon@apple.com>
Fri, 27 Oct 2023 23:19:49 +0000 (16:19 -0700)
135 files changed:
.gitignore
.lgtm.yml
CHANGES.md
INSTALL.md
Makefile
README.md
backend/backend-private.h
backend/ipp.c
backend/network.c
backend/org.cups.usb-quirks
backend/snmp.c
backend/testbackend.c
backend/usb-darwin.c
backend/usb-libusb.c
backend/usb-unix.c
berkeley/lpc.c
cgi-bin/admin.c
cgi-bin/classes.c
cgi-bin/help-index.c
cgi-bin/ipp-var.c
cgi-bin/printers.c
cgi-bin/template.c
cgi-bin/var.c
conf/cgi.types [new file with mode: 0644]
config-scripts/cups-compiler.m4
configure
configure.ac
cups/auth.c
cups/cups.h
cups/cupspm.md
cups/dest.c
cups/getdevices.c
cups/getifaddrs-internal.h
cups/hash.c
cups/http-addr.c
cups/http-addrlist.c
cups/http-support.c
cups/http.c
cups/http.h
cups/ipp-file.c
cups/ipp-support.c
cups/ipp-vars.c
cups/ipp.c
cups/options.c
cups/ppd-cache.c
cups/ppd-mark.c
cups/ppd-private.h
cups/ppd.c
cups/pwg-media.c
cups/request.c
cups/snprintf.c
cups/testclient.c
cups/testdest.c
cups/tls-darwin.c
cups/tls-gnutls.c
cups/tls-sspi.c
cups/tlscheck.c
doc/help/cgi.html
doc/help/cupspm.html
doc/help/man-cupsd.conf.html
doc/help/man-ipptool.html
doc/help/man-ipptoolfile.html
doc/help/spec-ipp.html
doc/test.cgi [new file with mode: 0755]
doc/test.php [new file with mode: 0755]
examples/testfile.txt
filter/common.c
filter/rastertohp.c
filter/rastertopdf.cpp [new file with mode: 0644]
locale/cups.pot
locale/cups.strings
locale/cups_ca.po
locale/cups_cs.po
locale/cups_de.po
locale/cups_en.po
locale/cups_es.po
locale/cups_fr.po
locale/cups_it.po
locale/cups_ja.po
locale/cups_pt_BR.po
locale/cups_ru.po
locale/cups_zh_CN.po
locale/ipp-strings.c
man/cupsd.conf.5
man/ipptool.1
man/ipptoolfile.5
notifier/rss.c
packaging/cups.list.in
ppdc/ppdc-import.cxx
ppdc/ppdc-source.cxx
ppdc/ppdc.cxx
ppdc/ppdhtml.cxx
ppdc/ppdi.cxx
ppdc/ppdmerge.cxx
ppdc/ppdpo.cxx
ppdc/sample.drv
scheduler/auth.c
scheduler/cert.c
scheduler/classes.c
scheduler/client.c
scheduler/conf.c
scheduler/conf.h
scheduler/cups-deviced.c
scheduler/cups-lpd.c
scheduler/ipp.c
scheduler/job.c
scheduler/listen.c
scheduler/log.c
scheduler/main.c
scheduler/printers.c
scheduler/subscriptions.c
scheduler/sysman.c
scheduler/util.c
scripts/makesrcdist
systemv/cancel.c
systemv/cupstestppd.c
systemv/lp.c
systemv/lpadmin.c
systemv/lpstat.c
templates/Makefile
templates/choose-model.tmpl
test/run-stp-tests.sh
tools/ippeveprinter.c
tools/ippeveps.c
tools/ippfind.c
tools/ipptool.c
tools/printer-lg-png.h [new file with mode: 0644]
tools/printer-lg.png [new file with mode: 0644]
tools/printer-png.h
tools/printer-sm-png.h [new file with mode: 0644]
tools/printer-sm.png [new file with mode: 0644]
tools/printer.png
vcnet/config.h
vcnet/dns_sd.c
xcode/config.h

index a5e32e600aa0d5ef4cdc5892c4e1dd3f19c49306..3bc3f2efcc2e43f1552c99bd6509ae3ba3f1b30f 100644 (file)
@@ -1,6 +1,6 @@
 *.a
 *.bck
-*.cgi
+/cgi-bin/*.cgi
 *.o
 autom4te.cache
 config.h
index 626551724863bcc968ddc625602aa2aff76bf913..e7f2e0dff3aff2af274d10687fd8eea585eb025d 100644 (file)
--- 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
index 6af792b82911b61c266273d7115ebdabe7658f3e..9da22c8e76e5600e73e72a8a29d074972fa0f121 100644 (file)
@@ -1,5 +1,113 @@
-CHANGES - 2.3.2 - 2019-12-18
-============================
+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
+----------------------
+
+- CVE-2020-3898: The `ppdOpen` function did not handle invalid UI
+  constraint.  `ppdcSource::get_resolution` function did not handle
+  invalid resolution strings.
+- CVE-2019-8842: The `ippReadIO` function may under-read an extension
+  field.
+- Fixed WARNING_OPTIONS support for GCC 9.x
 
 
 Changes in CUPS v2.3.2
index f8801347a628858a8f46424a343cc06d0c60f256..f88dfedff8e116f36696bb9ef9af41d1da48b1db 100644 (file)
@@ -1,4 +1,4 @@
-INSTALL - CUPS v2.3.1 - 2019-12-13
+INSTALL - CUPS v2.3.6 - 2022-05-25
 ==================================
 
 This file describes how to compile and install CUPS from source code. For more
index 15544627f6cd0c6975d8409f790162dbade0f01d..294ac5ea499cdf79bbc79fcf401e91e23c74d54f 100644 (file)
--- 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
 
index 6e15a93e72b51c3aaea043d0864871578ed4b321..f48de536751f846495cc9ab6becada312320232b 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,5 +1,10 @@
-README - CUPS v2.3.1 - 2019-12-13
-=================================
+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
index 85fb8aef8ae36f5ef2cc664d888d2e45601065e0..d19b06b823b6d77a8bb3e4861de8d0d59c174dfe 100644 (file)
@@ -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
@@ -52,6 +53,14 @@ extern "C" {
 #  endif /* __cplusplus */
 
 
+/*
+ * 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 */
index 3f3e1867d3efb0b631b743a28b5a62e701386e31..3779c88fa45ff41c59b0dcfb76c072979b25f3a9 100644 (file)
@@ -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;
index 5af0a8eeadd07145f6c5b6eab74ee1d68ad2d890..f7ee2fbbe3c8e080c9e34d6d7f1e7e22e4240a21 100644 (file)
@@ -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;
 
index cd684d33f9c87cbf629726b63145f8560726b73f..83f62c165fc909cda94d85a54208acbb914ff5ff 100644 (file)
@@ -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)
 # 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
 
 # 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
 # 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
index 66ac884c67e24e83013864cf2625384f569abfb9..084c6f5118a28388c31000c68b6741ba40c38455 100644 (file)
@@ -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");
 }
 
 
@@ -969,9 +971,15 @@ read_snmp_response(int fd)         /* I - SNMP socket file descriptor */
        _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1,
                       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 :
index 6dbd0abee691651678b3ca330e9cddec835a3c1f..6412a022b766fbda099b681d9d25150d1ca306f0 100644 (file)
@@ -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);
index 1c412da6f572144d7979329675864501dc1b6a87..f0d04ab42cec8df0aa64caada361ea039fa49b30 100644 (file)
@@ -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__ */
 
 
 /*
index 393fe65eeeeae55c1958797f2570e8d60b28ffcf..d7c762392924fcfbd5251d885e13d77d7f4bf6e0 100644 (file)
@@ -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.
index 81e20c524bc66c108addb0aa14cdc9ff128d116d..d256a813ba80e4b4868e891f70102028b98c3740 100644 (file)
@@ -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),
index 7ab43ea123528fcb4d90cccf1807bc7be3f30fcf..7af10354fc7c2a214215338892fa30f581950c13 100644 (file)
@@ -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> "));
     }
   }
 
@@ -200,6 +201,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.
  */
index f087809f7cf1e3d6298cf84daed90fb844869f0e..57ae4e869c8ccd0a8c3a485861a3f4835abf8350 100644 (file)
@@ -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);
-}
index 78ef08e22f1ab2ecbb08c5f81cd1c4da0d5ce415..718604ab2bf9cd2f821a9f8268dd82f49ccccf81 100644 (file)
@@ -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);
     }
 
index ce97e47a43e3777f29bc8abdd048b7b59ac79a04..3da1010e6a2985c7520e39381f8cd39bb3c6c9b1 100644 (file)
@@ -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;
index 8c5a5616dd5232ab5c3f52b5239d96381f5034c0..443f920a5a2826b5c5147d8744a31fa3b2b0f850 100644 (file)
@@ -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);
     }
 
index bbc153e3b74a35ecc414e5f399db5ddf634af200..2a33b6832d6d2f124b07e91c57f134a19530e500 100644 (file)
@@ -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);
     }
 
index 1972b4ae2ca2252b03135ae5a6a523fdfe02bfb7..3300a8852e01f8706001f0c12758c9a6f0b6e958 100644 (file)
@@ -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))
             {
index 349a2184536b8c0474e720755d2d09c20d2c2af5..c7289c7217db444d4771acccf929db54b6a25bb2 100644 (file)
@@ -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 (file)
index 0000000..2c39b3f
--- /dev/null
@@ -0,0 +1 @@
+application/x-httpd-cgi cgi php
index 63ea1f47010fa67764eb1d7b1fdb186ce59cc0d1..604faf1b9f0484a9c7602ad0110f412101e65e2b 100644 (file)
@@ -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,22 +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
-               1.* | 2.* | 3.* | 4.* | 5.* | 6.* | \(clang-*)
-                       ;;
-               *)
-                       WARNING_OPTIONS="$WARNING_OPTIONS -Wno-format-truncation -Wno-format-overflow -Wno-tautological-compare"
+        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...
index e06b17f594205cacdc42e6d635b86be89e7bda8b..642b3058dce74b3549c80490a84ca1b85f737842 100755 (executable)
--- 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.2.
+# 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.2'
-PACKAGE_STRING='CUPS 2.3.2'
+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.2 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.2:";;
+     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.2
+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.2, 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.2"
+CUPS_VERSION="2.3.6"
 CUPS_REVISION=""
 CUPS_BUILD="cups-$CUPS_VERSION"
 
@@ -6905,22 +6905,20 @@ 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...
        gccversion=`$CC --version | head -1 | awk '{print $NF}'`
        case "$gccversion" in
-               1.* | 2.* | 3.* | 4.* | 5.* | 6.* | \(clang-*)
-                       ;;
-               *)
+               7.* | 8.* | 9.*)
                        WARNING_OPTIONS="$WARNING_OPTIONS -Wno-format-truncation -Wno-format-overflow -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...
@@ -10387,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.2, 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
@@ -10450,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.2
+CUPS config.status 2.3.6
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
index eff353b7e645410fe3d7bdf2786f3512aded1446..f8767969d1f9ae99be801eeb9f1466593a48c3cd 100644 (file)
@@ -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.2], [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)
index db45bbba68bd427bed9fa933dacd54c801ec9d48..bff6d218f5c71574dd53cbcce088c4172755ceb3 100644 (file)
@@ -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
index 6d48141e5824b5eab15e8bb795170b19f64fc25e..bdf9f7a18621e72a44482a6d84b4f52afe49d673 100644 (file)
@@ -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.0302
+#  define CUPS_VERSION                 2.0306
 #  define CUPS_VERSION_MAJOR           2
 #  define CUPS_VERSION_MINOR           3
-#  define CUPS_VERSION_PATCH           2
+#  define CUPS_VERSION_PATCH           6
 
 #  define CUPS_BC_FD                   3
                                        /* Back-channel file descriptor for
index d4d6d7c55d6f21a0ffede74a04ce8d75202b46d4..7e03c3d6561a1c595a5bad9ddd5447754d094a91 100644 (file)
@@ -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.1
+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
index cde987a0951f2f9a27e8d2e973aca34ee6f903fd..984c6bddfa8adfe72b27e68ba6889b1c151971c4 100644 (file)
@@ -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';
 }
index de2186f5faf0589cd941b87ef38df75662737092..a3554064094845fa9f48304eb6372e4edf1440ed 100644 (file)
@@ -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);
 
index 35e98be77f816461a09c79f6299d20e4109394da..4e20f73d93fdd5f5c208526605c8da8a77a1a287 100644 (file)
@@ -25,6 +25,7 @@
 #    include <unistd.h>
 #    include <fcntl.h>
 #    include <sys/socket.h>
+#    include <netinet/in.h>
 #    define CUPS_SOCAST
 #  endif /* _WIN32 */
 
index 4fbb443db10cbf2180bb2af6266ed00a177d9a89..c153c665591dff31a6bc7e5ab8614a4f90ae5715 100644 (file)
@@ -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);
index 86749c84856ad7f56a86e601e1522c3ef10e8614..8e81c6f7db043ee3c9f7951893492b2d2eab2106 100644 (file)
@@ -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);
 
index 485c6f43da2012f67d09b35440fdf8d11a44c419..89b3d92fb6fc2bb1f57c552a875f494be76f8e02 100644 (file)
@@ -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 --;
index 63175145ee97acae89909529282e97032c5a96c3..49557300eea7933835aee533429a563c16da4680 100644 (file)
@@ -840,6 +840,13 @@ httpGetDateTime(const char *s)             /* I - Date/time string */
   DEBUG_printf(("4httpGetDateTime: day=%d, mon=\"%s\", year=%d, hour=%d, "
                 "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.
   */
index 8d69ce31f83f511517ef2d1452a72248013c2292..43ace18f4428f7313809e644dead8b4af81a677a 100644 (file)
@@ -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);
index 01a0321dfa068a3396f479f1039e8bc83b949f74..45761a7ca599e8af6a50540984dfc38408b7e6a0 100644 (file)
@@ -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@ ****/
index 5db5932a4e086cdfa6bafe142340dff0c6906d31..5483a607df600c4752114e6745d978dc8086449d 100644 (file)
@@ -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);
 }
 
 
index bfb9dff09909a9a227e93f9593ad66da186afbc1..d9e900649aa86ea2dfb05e16924c3422a938d868 100644 (file)
@@ -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);
 }
index 395b0ebf3e130951cb2482c3230c3d3b6150a7bc..69efbd9aa0751ef28e61cc38a797a8255f90c100 100644 (file)
@@ -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])
index 1595b8b6103e0c938dcb9f1a6172ea9b1c7d249e..42cf2fcaf778ab9b6b31c370324861804dbbf0a9 100644 (file)
@@ -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));
@@ -2956,11 +2955,10 @@ ippReadIO(void       *src,              /* I - Data source */
             * Read 32-bit "extension" tag...
             */
 
-           if ((*cb)(src, buffer, 4) < 1)
+           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);
 }
 
 
index 11814c9af256d8796016e14f1d27659dea7b160f..e45858c2c9e9c7f879d432c9d872c490e052c730 100644 (file)
@@ -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);
index 5965e382bb80b2108b7c9ebbf56451daa4af53fb..091f39f3cc19e9baec273fae349390146a0be001 100644 (file)
@@ -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';
 }
index 7ec0df473951a40cfc5beb0e12fbf656e8cd149e..25797b3761ea4c1296c37a2459ee642f1a1bab29 100644 (file)
@@ -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;
index 7b406c971bdd6e37edc9bc4dd6e4151e942ee12d..11ddae3662c8ada77f01c0f1d6d9c51758ce84d3 100644 (file)
@@ -35,7 +35,7 @@ extern "C" {
  * Constants...
  */
 
-#  define _PPD_CACHE_VERSION         /* Version number in cache file */
+#  define _PPD_CACHE_VERSION   10      /* Version number in cache file */
 
 
 /*
index ff52df2e17b890e7603256d538a6bfd7fcafa2f8..ac5dbc62bb8d78aa8de022f8f9bb854d4525eaa8 100644 (file)
@@ -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));
        }
       }
     }
@@ -1719,8 +1776,7 @@ _ppdOpen(
                      constraint->choice1, constraint->option2,
                     constraint->choice2))
       {
-        case 0 : /* Error */
-       case 1 : /* Error */
+        default : /* Error */
            pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
            goto error;
 
@@ -2336,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;
 
@@ -2840,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);
 }
index 00bb2ed61a89d79c8f6346b1ed5a225d1067b50c..535db08800c483fe52ebc4aa92589295d99a226a 100644 (file)
@@ -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);
index 69a7801375ade2a3a8eb8b16f92baf8fc3aa1bcf..ff967f05ad14a8edc57f169438ad9a3acc248d6a 100644 (file)
@@ -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
index 49652e2c43b55abc415fa6538fd01f1dd3b89e4a..066252ee7654bd172ea1b78ef9c173669944e768 100644 (file)
@@ -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);
 }
index cf945df98a6d3d24fb1051c0ff344911e1cb0a8d..16ac40db7cc8a2b5ca375081b8fe15f67ed01f35 100644 (file)
@@ -24,7 +24,7 @@
  * Constants...
  */
 
-#define MAX_CLIENTS    1             /* 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"
   };
 
 
index a65e09960d84cd1219e8c1f010331595f023a2d0..9b07e77718fb161c2c5a92cb1b72f7e9d8079062 100644 (file)
@@ -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;
index b3bd50bf819e1d7e5a0422ae543371fce87ec8cb..0741a320e7081ebb293b5095bd0ca705bbc27383 100644 (file)
@@ -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 };
index 329cc0eb42e4183f9efd1615111f4c417379bf95..ffe1aa695b40d00a7bd96b5dbe7c04aa297d392a 100644 (file)
@@ -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)
index ccbdf8aaf0648d94b0d9019c4885f20fcd58cea0..52ded5f21f6f43f55e482d4844f839559b55a298 100644 (file)
@@ -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...)
@@ -2017,13 +2017,6 @@ http_sspi_make_credentials(
   SchannelCred.cCreds    = 1;
   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.
   */
index c88e7d09150d89bacf557db0ed00fe4e45d07e9d..4b0be1f83b8f1f939e26a6d2fe5988362ddd1b65 100644 (file)
@@ -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;
 
 
 /*
index 34c6debb35d3f7b57345c9059f778763f6db89e0..150bacdbcc7b4efe098eb5f7ff55d5bc75414c9b 100644 (file)
@@ -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>
index 9b48cde34cc490afce03ed4b5e8249a3bcaaa32f..677f2bc3c6e9cb73e0da598a06eaa4c9882b6390 100644 (file)
@@ -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.1">
+    <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">
index 1668eee8afdaef64d82a191596e85e1ea7df382b..70e00b5be1612ab0550da954f5cc73f27ef4111f 100644 (file)
@@ -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>
index 5f9b86212b744c6809cbc89966191d8f5c63a67c..c908fa709408a5df39bfe3da203429991a2d2138 100644 (file)
@@ -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>
index e0f6727d783527285b7ea989b936b2f5bea1376f..95d4a5660d6f8e9ff2cc5531deade7b4fdd1358a 100644 (file)
@@ -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>
index 8f0ad313d7b78f8e51e24fb8d2654a87e9ca6f0a..f9702dad371c0cb68f0535382eba868b3b4bf6f0 100644 (file)
@@ -10,7 +10,7 @@
 <!--
   IPP specification for CUPS.
 
-  Copyright © 2007-2016 by Apple Inc.
+  Copyright © 2007-2023 by Apple Inc.
   Copyright © 1997-2007 by Easy Software Products.
 
   Licensed under Apache License v2.0.  See the file "LICENSE" for more
@@ -1886,6 +1886,76 @@ CUPS-Get-PPDs Response:
 <h4>printer-type-mask (type2 enum)<span class='info'>CUPS 1.1</span></h4>
 
 <p>The "printer-type-mask" attribute is used to choose printers or classes with the CUPS-Get-Printers and CUPS-Get-Classes operations. The bits are defined identically to the printer-type attribute and default to all 1's.
+</p>
+
+<h4>printer-wifi-password (octetString(MAX))</h4>
+
+<p>The optional "printer-wifi-password" description attribute provides the wireless network password for a printer.
+Printers must not return this attribute in the response to a Get-Printer-Attributes request.
+This attribute can only be set via an authenticated Set-Printer-Attributes request over a secure channel,
+or via an unauthenticated IPP USB connection when the printer is in its initial setup state.
+When a value for this attribute is not set, the 'wifi-not-configured-report' keyword must be present in the
+"printer-state-reasons" printer attribute values. If a printer supports this attribute, it must also support
+the "printer-wifi-ssid" and "printer-wifi-state" attributes.</p>
+
+<h4>printer-wifi-ssid (name(MAX))</h4>
+
+<p>The optional "printer-wifi-ssid" description attribute specifies the wireless network name for the printer.
+When set to the empty string, the printer must not join infrastructure or ad-hoc networks.
+This attribute can only be set via an authenticated Set-Printer-Attributes request over a secure channel,
+or via an unauthenticated IPP USB connection when the printer is in its initial setup state.
+This attribute also must reflect any configuration done by the user through the printer's web interface,
+control panel, or other interface. When a value for this attribute is not set, the 'wifi-not-configured-report'
+keyword must be present in the "printer-state-reasons" printer attribute values.
+If a printer supports this attribute, it must also support the "printer-wifi-password" and
+"printer-wifi-state" attributes.</p>
+
+<p>Printers that support the Set-Printer-Attribtes operation and "printer-wifi-password" and "printer-wifi-ssid"
+printer description attributes must also support unauthenticated Set-Printer-Attributes requests over USB when Wi-Fi
+networking has not yet been configured. This allows a client to configure the Wi-Fi networking of a printer over USB.</p>
+
+<p>When configuring a wireless network, clients must send both the "printer-wifi-ssid" and "printer-wifi-password"
+printer description attributes. If only one attribute is supplied, the printer must reject the request with the
+client-error-bad-request status code. If either attribute is supplied with an invalid value,
+the printer must reject the request with the client-error-attributes-or-values-not-supported status code.</p>
+
+In addition to other defined printer-state-reasons, the 'wifi-not-configured-report' reason is returned when the
+"printer-wifi-password" and "printer-wifi-ssid" printer description attributes are not set,
+regardless of the value of the "printer-wifi-state" printer status attribute.
+
+<h4>printer-wifi-state (type2 enum)</h4>
+
+<p>The optional "printer-wifi-state" status attribute specifies a printer's current wireless network state as
+an enumerated value. The following values are currently defined:</p>
+
+<div class='table'><table align='center' border='1' width='80%' summary='Wireless Networking State'>
+<tbody>
+<tr>
+       <td>3</td>
+       <td>(off) wireless networking is turned off</td>
+</tr>
+<tr>
+       <td>4</td>
+       <td>(not-configured) wireless networking is not yet configured</td>
+</tr>
+<tr>
+       <td>5</td>
+       <td>(not-visible) the configured wireless network is not visible</td>
+</tr>
+<tr>
+       <td>6</td>
+       <td>(cannot-join) unable to join the configured wireless network</td>
+</tr>
+<tr>
+       <td>7</td>
+       <td>(joining) joining the configured wireless network</td>
+</tr>
+<tr>
+       <td>8</td>
+       <td>(on) joined to the configured wireless network</td>
+</tr>
+</tbody>
+</table></div>
 
 <h4>requesting-user-name-allowed (1setof name(127))<span class='info'>CUPS 1.1</span></h4>
 
diff --git a/doc/test.cgi b/doc/test.cgi
new file mode 100755 (executable)
index 0000000..6d98759
--- /dev/null
@@ -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 (executable)
index 0000000..f33a54f
--- /dev/null
@@ -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");
+?>
index bad0a31e37f548da258823067d42a0cd3594bcb8..46bbf08483b154c1e7d1826cddfed5abb869cc67 100644 (file)
@@ -1,60 +1,60 @@
-All work and no play makes Johhny a dull boy.  All work and no\r
-play makes Johhny a dull boy.  All work and no play makes Johhny\r
-a dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy. All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy. All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy. All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy. All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy. All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy. All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy.  All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.  All\r
-work and no play makes Johhny a dull boy. All work and no play\r
-makes Johhny a dull boy.  All work and no play makes Johhny a\r
-dull boy.  All work and no play makes Johhny a dull boy.\r
+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.
index 672b7c8cd5ff5c617a647c3242c946ed10c91d75..e0cbcd384083025743d0e2af37f50150a70a468c 100644 (file)
@@ -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 = "";
 
  /*
index 0d76c42a28e79416e7ddcb4351c51034e27bca0d..5f7fa1ba9e9f6db3cd7ea1da32cd657917f3fbf0 100644 (file)
@@ -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 (file)
index 0000000..55c39b1
--- /dev/null
@@ -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;
+}
index 150c5a19950fa8274c98a2a07461eee6457d720b..db081a50c4c23bfe2a343d7ec258a0ef09230cb8 100644 (file)
@@ -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,9 +23,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: CUPS 2.3.1\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 19:46-0500\n"
+"POT-Creation-Date: 2019-12-18 20:19-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -11299,1618 +11299,1623 @@ msgstr ""
 msgid "media-type.com.hp.premium-photo"
 msgstr ""
 
-#. TRANSLATORS: Continuous
+#. TRANSLATORS: Premium Matte Presentation Paper
 #: locale/ipp-strings.c:1610
+msgid "media-type.com.hp.premium-presentation-matte"
+msgstr ""
+
+#. TRANSLATORS: Continuous
+#: locale/ipp-strings.c:1612
 msgid "media-type.continuous"
 msgstr ""
 
 #. TRANSLATORS: Continuous Long
-#: locale/ipp-strings.c:1612
+#: locale/ipp-strings.c:1614
 msgid "media-type.continuous-long"
 msgstr ""
 
 #. TRANSLATORS: Continuous Short
-#: locale/ipp-strings.c:1614
+#: locale/ipp-strings.c:1616
 msgid "media-type.continuous-short"
 msgstr ""
 
 #. TRANSLATORS: Corrugated Board
-#: locale/ipp-strings.c:1616
+#: locale/ipp-strings.c:1618
 msgid "media-type.corrugated-board"
 msgstr ""
 
 #. TRANSLATORS: Optical Disc
-#: locale/ipp-strings.c:1618
+#: locale/ipp-strings.c:1620
 msgid "media-type.disc"
 msgstr ""
 
 #. TRANSLATORS: Glossy Optical Disc
-#: locale/ipp-strings.c:1620
+#: locale/ipp-strings.c:1622
 msgid "media-type.disc-glossy"
 msgstr ""
 
 #. TRANSLATORS: High Gloss Optical Disc
-#: locale/ipp-strings.c:1622
+#: locale/ipp-strings.c:1624
 msgid "media-type.disc-high-gloss"
 msgstr ""
 
 #. TRANSLATORS: Matte Optical Disc
-#: locale/ipp-strings.c:1624
+#: locale/ipp-strings.c:1626
 msgid "media-type.disc-matte"
 msgstr ""
 
 #. TRANSLATORS: Satin Optical Disc
-#: locale/ipp-strings.c:1626
+#: locale/ipp-strings.c:1628
 msgid "media-type.disc-satin"
 msgstr ""
 
 #. TRANSLATORS: Semi-Gloss Optical Disc
-#: locale/ipp-strings.c:1628
+#: locale/ipp-strings.c:1630
 msgid "media-type.disc-semi-gloss"
 msgstr ""
 
 #. TRANSLATORS: Double Wall
-#: locale/ipp-strings.c:1630
+#: locale/ipp-strings.c:1632
 msgid "media-type.double-wall"
 msgstr ""
 
 #. TRANSLATORS: Dry Film
-#: locale/ipp-strings.c:1632
+#: locale/ipp-strings.c:1634
 msgid "media-type.dry-film"
 msgstr ""
 
 #. TRANSLATORS: DVD
-#: locale/ipp-strings.c:1634
+#: locale/ipp-strings.c:1636
 msgid "media-type.dvd"
 msgstr ""
 
 #. TRANSLATORS: Embossing Foil
-#: locale/ipp-strings.c:1636
+#: locale/ipp-strings.c:1638
 msgid "media-type.embossing-foil"
 msgstr ""
 
 #. TRANSLATORS: End Board
-#: locale/ipp-strings.c:1638
+#: locale/ipp-strings.c:1640
 msgid "media-type.end-board"
 msgstr ""
 
 #. TRANSLATORS: Envelope
-#: locale/ipp-strings.c:1640
+#: locale/ipp-strings.c:1642
 msgid "media-type.envelope"
 msgstr ""
 
 #. TRANSLATORS: Archival Envelope
-#: locale/ipp-strings.c:1642
+#: locale/ipp-strings.c:1644
 msgid "media-type.envelope-archival"
 msgstr ""
 
 #. TRANSLATORS: Bond Envelope
-#: locale/ipp-strings.c:1644
+#: locale/ipp-strings.c:1646
 msgid "media-type.envelope-bond"
 msgstr ""
 
 #. TRANSLATORS: Coated Envelope
-#: locale/ipp-strings.c:1646
+#: locale/ipp-strings.c:1648
 msgid "media-type.envelope-coated"
 msgstr ""
 
 #. TRANSLATORS: Cotton Envelope
-#: locale/ipp-strings.c:1648
+#: locale/ipp-strings.c:1650
 msgid "media-type.envelope-cotton"
 msgstr ""
 
 #. TRANSLATORS: Fine Envelope
-#: locale/ipp-strings.c:1650
+#: locale/ipp-strings.c:1652
 msgid "media-type.envelope-fine"
 msgstr ""
 
 #. TRANSLATORS: Heavyweight Envelope
-#: locale/ipp-strings.c:1652
+#: locale/ipp-strings.c:1654
 msgid "media-type.envelope-heavyweight"
 msgstr ""
 
 #. TRANSLATORS: Inkjet Envelope
-#: locale/ipp-strings.c:1654
+#: locale/ipp-strings.c:1656
 msgid "media-type.envelope-inkjet"
 msgstr ""
 
 #. TRANSLATORS: Lightweight Envelope
-#: locale/ipp-strings.c:1656
+#: locale/ipp-strings.c:1658
 msgid "media-type.envelope-lightweight"
 msgstr ""
 
 #. TRANSLATORS: Plain Envelope
-#: locale/ipp-strings.c:1658
+#: locale/ipp-strings.c:1660
 msgid "media-type.envelope-plain"
 msgstr ""
 
 #. TRANSLATORS: Preprinted Envelope
-#: locale/ipp-strings.c:1660
+#: locale/ipp-strings.c:1662
 msgid "media-type.envelope-preprinted"
 msgstr ""
 
 #. TRANSLATORS: Windowed Envelope
-#: locale/ipp-strings.c:1662
+#: locale/ipp-strings.c:1664
 msgid "media-type.envelope-window"
 msgstr ""
 
 #. TRANSLATORS: Fabric
-#: locale/ipp-strings.c:1664
+#: locale/ipp-strings.c:1666
 msgid "media-type.fabric"
 msgstr ""
 
 #. TRANSLATORS: Archival Fabric
-#: locale/ipp-strings.c:1666
+#: locale/ipp-strings.c:1668
 msgid "media-type.fabric-archival"
 msgstr ""
 
 #. TRANSLATORS: Glossy Fabric
-#: locale/ipp-strings.c:1668
+#: locale/ipp-strings.c:1670
 msgid "media-type.fabric-glossy"
 msgstr ""
 
 #. TRANSLATORS: High Gloss Fabric
-#: locale/ipp-strings.c:1670
+#: locale/ipp-strings.c:1672
 msgid "media-type.fabric-high-gloss"
 msgstr ""
 
 #. TRANSLATORS: Matte Fabric
-#: locale/ipp-strings.c:1672
+#: locale/ipp-strings.c:1674
 msgid "media-type.fabric-matte"
 msgstr ""
 
 #. TRANSLATORS: Semi-Gloss Fabric
-#: locale/ipp-strings.c:1674
+#: locale/ipp-strings.c:1676
 msgid "media-type.fabric-semi-gloss"
 msgstr ""
 
 #. TRANSLATORS: Waterproof Fabric
-#: locale/ipp-strings.c:1676
+#: locale/ipp-strings.c:1678
 msgid "media-type.fabric-waterproof"
 msgstr ""
 
 #. TRANSLATORS: Film
-#: locale/ipp-strings.c:1678
+#: locale/ipp-strings.c:1680
 msgid "media-type.film"
 msgstr ""
 
 #. TRANSLATORS: Flexo Base
-#: locale/ipp-strings.c:1680
+#: locale/ipp-strings.c:1682
 msgid "media-type.flexo-base"
 msgstr ""
 
 #. TRANSLATORS: Flexo Photo Polymer
-#: locale/ipp-strings.c:1682
+#: locale/ipp-strings.c:1684
 msgid "media-type.flexo-photo-polymer"
 msgstr ""
 
 #. TRANSLATORS: Flute
-#: locale/ipp-strings.c:1684
+#: locale/ipp-strings.c:1686
 msgid "media-type.flute"
 msgstr ""
 
 #. TRANSLATORS: Foil
-#: locale/ipp-strings.c:1686
+#: locale/ipp-strings.c:1688
 msgid "media-type.foil"
 msgstr ""
 
 #. TRANSLATORS: Full Cut Tabs
-#: locale/ipp-strings.c:1688
+#: locale/ipp-strings.c:1690
 msgid "media-type.full-cut-tabs"
 msgstr ""
 
 #. TRANSLATORS: Glass
-#: locale/ipp-strings.c:1690
+#: locale/ipp-strings.c:1692
 msgid "media-type.glass"
 msgstr ""
 
 #. TRANSLATORS: Glass Colored
-#: locale/ipp-strings.c:1692
+#: locale/ipp-strings.c:1694
 msgid "media-type.glass-colored"
 msgstr ""
 
 #. TRANSLATORS: Glass Opaque
-#: locale/ipp-strings.c:1694
+#: locale/ipp-strings.c:1696
 msgid "media-type.glass-opaque"
 msgstr ""
 
 #. TRANSLATORS: Glass Surfaced
-#: locale/ipp-strings.c:1696
+#: locale/ipp-strings.c:1698
 msgid "media-type.glass-surfaced"
 msgstr ""
 
 #. TRANSLATORS: Glass Textured
-#: locale/ipp-strings.c:1698
+#: locale/ipp-strings.c:1700
 msgid "media-type.glass-textured"
 msgstr ""
 
 #. TRANSLATORS: Gravure Cylinder
-#: locale/ipp-strings.c:1700
+#: locale/ipp-strings.c:1702
 msgid "media-type.gravure-cylinder"
 msgstr ""
 
 #. TRANSLATORS: Image Setter Paper
-#: locale/ipp-strings.c:1702
+#: locale/ipp-strings.c:1704
 msgid "media-type.image-setter-paper"
 msgstr ""
 
 #. TRANSLATORS: Imaging Cylinder
-#: locale/ipp-strings.c:1704
+#: locale/ipp-strings.c:1706
 msgid "media-type.imaging-cylinder"
 msgstr ""
 
 #. TRANSLATORS: Photo Paper Plus Glossy II
-#: locale/ipp-strings.c:1706
+#: locale/ipp-strings.c:1708
 msgid "media-type.jp.co.canon-photo-paper-plus-glossy-ii"
 msgstr ""
 
 #. TRANSLATORS: Photo Paper Pro Platinum
-#: locale/ipp-strings.c:1708
+#: locale/ipp-strings.c:1710
 msgid "media-type.jp.co.canon-photo-paper-pro-platinum"
 msgstr ""
 
 #. TRANSLATORS: Photo Paper Plus Glossy II
-#: locale/ipp-strings.c:1710
+#: locale/ipp-strings.c:1712
 msgid "media-type.jp.co.canon_photo-paper-plus-glossy-ii"
 msgstr ""
 
 #. TRANSLATORS: Photo Paper Pro Platinum
-#: locale/ipp-strings.c:1712
+#: locale/ipp-strings.c:1714
 msgid "media-type.jp.co.canon_photo-paper-pro-platinum"
 msgstr ""
 
 #. TRANSLATORS: Labels
-#: locale/ipp-strings.c:1714
+#: locale/ipp-strings.c:1716
 msgid "media-type.labels"
 msgstr ""
 
 #. TRANSLATORS: Colored Labels
-#: locale/ipp-strings.c:1716
+#: locale/ipp-strings.c:1718
 msgid "media-type.labels-colored"
 msgstr ""
 
 #. TRANSLATORS: Glossy Labels
-#: locale/ipp-strings.c:1718
+#: locale/ipp-strings.c:1720
 msgid "media-type.labels-glossy"
 msgstr ""
 
 #. TRANSLATORS: High Gloss Labels
-#: locale/ipp-strings.c:1720
+#: locale/ipp-strings.c:1722
 msgid "media-type.labels-high-gloss"
 msgstr ""
 
 #. TRANSLATORS: Inkjet Labels
-#: locale/ipp-strings.c:1722
+#: locale/ipp-strings.c:1724
 msgid "media-type.labels-inkjet"
 msgstr ""
 
 #. TRANSLATORS: Matte Labels
-#: locale/ipp-strings.c:1724
+#: locale/ipp-strings.c:1726
 msgid "media-type.labels-matte"
 msgstr ""
 
 #. TRANSLATORS: Permanent Labels
-#: locale/ipp-strings.c:1726
+#: locale/ipp-strings.c:1728
 msgid "media-type.labels-permanent"
 msgstr ""
 
 #. TRANSLATORS: Satin Labels
-#: locale/ipp-strings.c:1728
+#: locale/ipp-strings.c:1730
 msgid "media-type.labels-satin"
 msgstr ""
 
 #. TRANSLATORS: Security Labels
-#: locale/ipp-strings.c:1730
+#: locale/ipp-strings.c:1732
 msgid "media-type.labels-security"
 msgstr ""
 
 #. TRANSLATORS: Semi-Gloss Labels
-#: locale/ipp-strings.c:1732
+#: locale/ipp-strings.c:1734
 msgid "media-type.labels-semi-gloss"
 msgstr ""
 
 #. TRANSLATORS: Laminating Foil
-#: locale/ipp-strings.c:1734
+#: locale/ipp-strings.c:1736
 msgid "media-type.laminating-foil"
 msgstr ""
 
 #. TRANSLATORS: Letterhead
-#: locale/ipp-strings.c:1736
+#: locale/ipp-strings.c:1738
 msgid "media-type.letterhead"
 msgstr ""
 
 #. TRANSLATORS: Metal
-#: locale/ipp-strings.c:1738
+#: locale/ipp-strings.c:1740
 msgid "media-type.metal"
 msgstr ""
 
 #. TRANSLATORS: Metal Glossy
-#: locale/ipp-strings.c:1740
+#: locale/ipp-strings.c:1742
 msgid "media-type.metal-glossy"
 msgstr ""
 
 #. TRANSLATORS: Metal High Gloss
-#: locale/ipp-strings.c:1742
+#: locale/ipp-strings.c:1744
 msgid "media-type.metal-high-gloss"
 msgstr ""
 
 #. TRANSLATORS: Metal Matte
-#: locale/ipp-strings.c:1744
+#: locale/ipp-strings.c:1746
 msgid "media-type.metal-matte"
 msgstr ""
 
 #. TRANSLATORS: Metal Satin
-#: locale/ipp-strings.c:1746
+#: locale/ipp-strings.c:1748
 msgid "media-type.metal-satin"
 msgstr ""
 
 #. TRANSLATORS: Metal Semi Gloss
-#: locale/ipp-strings.c:1748
+#: locale/ipp-strings.c:1750
 msgid "media-type.metal-semi-gloss"
 msgstr ""
 
 #. TRANSLATORS: Mounting Tape
-#: locale/ipp-strings.c:1750
+#: locale/ipp-strings.c:1752
 msgid "media-type.mounting-tape"
 msgstr ""
 
 #. TRANSLATORS: Multi Layer
-#: locale/ipp-strings.c:1752
+#: locale/ipp-strings.c:1754
 msgid "media-type.multi-layer"
 msgstr ""
 
 #. TRANSLATORS: Multi Part Form
-#: locale/ipp-strings.c:1754
+#: locale/ipp-strings.c:1756
 msgid "media-type.multi-part-form"
 msgstr ""
 
 #. TRANSLATORS: Other
-#: locale/ipp-strings.c:1756
+#: locale/ipp-strings.c:1758
 msgid "media-type.other"
 msgstr ""
 
 #. TRANSLATORS: Paper
-#: locale/ipp-strings.c:1758
+#: locale/ipp-strings.c:1760
 msgid "media-type.paper"
 msgstr ""
 
 #. TRANSLATORS: Photo Paper
-#: locale/ipp-strings.c:1760
+#: locale/ipp-strings.c:1762
 msgid "media-type.photographic"
 msgstr ""
 
 #. TRANSLATORS: Photographic Archival
-#: locale/ipp-strings.c:1762
+#: locale/ipp-strings.c:1764
 msgid "media-type.photographic-archival"
 msgstr ""
 
 #. TRANSLATORS: Photo Film
-#: locale/ipp-strings.c:1764
+#: locale/ipp-strings.c:1766
 msgid "media-type.photographic-film"
 msgstr ""
 
 #. TRANSLATORS: Glossy Photo Paper
-#: locale/ipp-strings.c:1766
+#: locale/ipp-strings.c:1768
 msgid "media-type.photographic-glossy"
 msgstr ""
 
 #. TRANSLATORS: High Gloss Photo Paper
-#: locale/ipp-strings.c:1768
+#: locale/ipp-strings.c:1770
 msgid "media-type.photographic-high-gloss"
 msgstr ""
 
 #. TRANSLATORS: Matte Photo Paper
-#: locale/ipp-strings.c:1770
+#: locale/ipp-strings.c:1772
 msgid "media-type.photographic-matte"
 msgstr ""
 
 #. TRANSLATORS: Satin Photo Paper
-#: locale/ipp-strings.c:1772
+#: locale/ipp-strings.c:1774
 msgid "media-type.photographic-satin"
 msgstr ""
 
 #. TRANSLATORS: Semi-Gloss Photo Paper
-#: locale/ipp-strings.c:1774
+#: locale/ipp-strings.c:1776
 msgid "media-type.photographic-semi-gloss"
 msgstr ""
 
 #. TRANSLATORS: Plastic
-#: locale/ipp-strings.c:1776
+#: locale/ipp-strings.c:1778
 msgid "media-type.plastic"
 msgstr ""
 
 #. TRANSLATORS: Plastic Archival
-#: locale/ipp-strings.c:1778
+#: locale/ipp-strings.c:1780
 msgid "media-type.plastic-archival"
 msgstr ""
 
 #. TRANSLATORS: Plastic Colored
-#: locale/ipp-strings.c:1780
+#: locale/ipp-strings.c:1782
 msgid "media-type.plastic-colored"
 msgstr ""
 
 #. TRANSLATORS: Plastic Glossy
-#: locale/ipp-strings.c:1782
+#: locale/ipp-strings.c:1784
 msgid "media-type.plastic-glossy"
 msgstr ""
 
 #. TRANSLATORS: Plastic High Gloss
-#: locale/ipp-strings.c:1784
+#: locale/ipp-strings.c:1786
 msgid "media-type.plastic-high-gloss"
 msgstr ""
 
 #. TRANSLATORS: Plastic Matte
-#: locale/ipp-strings.c:1786
+#: locale/ipp-strings.c:1788
 msgid "media-type.plastic-matte"
 msgstr ""
 
 #. TRANSLATORS: Plastic Satin
-#: locale/ipp-strings.c:1788
+#: locale/ipp-strings.c:1790
 msgid "media-type.plastic-satin"
 msgstr ""
 
 #. TRANSLATORS: Plastic Semi Gloss
-#: locale/ipp-strings.c:1790
+#: locale/ipp-strings.c:1792
 msgid "media-type.plastic-semi-gloss"
 msgstr ""
 
 #. TRANSLATORS: Plate
-#: locale/ipp-strings.c:1792
+#: locale/ipp-strings.c:1794
 msgid "media-type.plate"
 msgstr ""
 
 #. TRANSLATORS: Polyester
-#: locale/ipp-strings.c:1794
+#: locale/ipp-strings.c:1796
 msgid "media-type.polyester"
 msgstr ""
 
 #. TRANSLATORS: Pre Cut Tabs
-#: locale/ipp-strings.c:1796
+#: locale/ipp-strings.c:1798
 msgid "media-type.pre-cut-tabs"
 msgstr ""
 
 #. TRANSLATORS: Roll
-#: locale/ipp-strings.c:1798
+#: locale/ipp-strings.c:1800
 msgid "media-type.roll"
 msgstr ""
 
 #. TRANSLATORS: Screen
-#: locale/ipp-strings.c:1800
+#: locale/ipp-strings.c:1802
 msgid "media-type.screen"
 msgstr ""
 
 #. TRANSLATORS: Screen Paged
-#: locale/ipp-strings.c:1802
+#: locale/ipp-strings.c:1804
 msgid "media-type.screen-paged"
 msgstr ""
 
 #. TRANSLATORS: Self Adhesive
-#: locale/ipp-strings.c:1804
+#: locale/ipp-strings.c:1806
 msgid "media-type.self-adhesive"
 msgstr ""
 
 #. TRANSLATORS: Self Adhesive Film
-#: locale/ipp-strings.c:1806
+#: locale/ipp-strings.c:1808
 msgid "media-type.self-adhesive-film"
 msgstr ""
 
 #. TRANSLATORS: Shrink Foil
-#: locale/ipp-strings.c:1808
+#: locale/ipp-strings.c:1810
 msgid "media-type.shrink-foil"
 msgstr ""
 
 #. TRANSLATORS: Single Face
-#: locale/ipp-strings.c:1810
+#: locale/ipp-strings.c:1812
 msgid "media-type.single-face"
 msgstr ""
 
 #. TRANSLATORS: Single Wall
-#: locale/ipp-strings.c:1812
+#: locale/ipp-strings.c:1814
 msgid "media-type.single-wall"
 msgstr ""
 
 #. TRANSLATORS: Sleeve
-#: locale/ipp-strings.c:1814
+#: locale/ipp-strings.c:1816
 msgid "media-type.sleeve"
 msgstr ""
 
 #. TRANSLATORS: Stationery
-#: locale/ipp-strings.c:1816
+#: locale/ipp-strings.c:1818
 msgid "media-type.stationery"
 msgstr ""
 
 #. TRANSLATORS: Stationery Archival
-#: locale/ipp-strings.c:1818
+#: locale/ipp-strings.c:1820
 msgid "media-type.stationery-archival"
 msgstr ""
 
 #. TRANSLATORS: Coated Paper
-#: locale/ipp-strings.c:1820
+#: locale/ipp-strings.c:1822
 msgid "media-type.stationery-coated"
 msgstr ""
 
 #. TRANSLATORS: Stationery Cotton
-#: locale/ipp-strings.c:1822
+#: locale/ipp-strings.c:1824
 msgid "media-type.stationery-cotton"
 msgstr ""
 
 #. TRANSLATORS: Vellum Paper
-#: locale/ipp-strings.c:1824
+#: locale/ipp-strings.c:1826
 msgid "media-type.stationery-fine"
 msgstr ""
 
 #. TRANSLATORS: Heavyweight Paper
-#: locale/ipp-strings.c:1826
+#: locale/ipp-strings.c:1828
 msgid "media-type.stationery-heavyweight"
 msgstr ""
 
 #. TRANSLATORS: Stationery Heavyweight Coated
-#: locale/ipp-strings.c:1828
+#: locale/ipp-strings.c:1830
 msgid "media-type.stationery-heavyweight-coated"
 msgstr ""
 
 #. TRANSLATORS: Stationery Inkjet Paper
-#: locale/ipp-strings.c:1830
+#: locale/ipp-strings.c:1832
 msgid "media-type.stationery-inkjet"
 msgstr ""
 
 #. TRANSLATORS: Letterhead
-#: locale/ipp-strings.c:1832
+#: locale/ipp-strings.c:1834
 msgid "media-type.stationery-letterhead"
 msgstr ""
 
 #. TRANSLATORS: Lightweight Paper
-#: locale/ipp-strings.c:1834
+#: locale/ipp-strings.c:1836
 msgid "media-type.stationery-lightweight"
 msgstr ""
 
 #. TRANSLATORS: Preprinted Paper
-#: locale/ipp-strings.c:1836
+#: locale/ipp-strings.c:1838
 msgid "media-type.stationery-preprinted"
 msgstr ""
 
 #. TRANSLATORS: Punched Paper
-#: locale/ipp-strings.c:1838
+#: locale/ipp-strings.c:1840
 msgid "media-type.stationery-prepunched"
 msgstr ""
 
 #. TRANSLATORS: Tab Stock
-#: locale/ipp-strings.c:1840
+#: locale/ipp-strings.c:1842
 msgid "media-type.tab-stock"
 msgstr ""
 
 #. TRANSLATORS: Tractor
-#: locale/ipp-strings.c:1842
+#: locale/ipp-strings.c:1844
 msgid "media-type.tractor"
 msgstr ""
 
 #. TRANSLATORS: Transfer
-#: locale/ipp-strings.c:1844
+#: locale/ipp-strings.c:1846
 msgid "media-type.transfer"
 msgstr ""
 
 #. TRANSLATORS: Transparency
-#: locale/ipp-strings.c:1846
+#: locale/ipp-strings.c:1848
 msgid "media-type.transparency"
 msgstr ""
 
 #. TRANSLATORS: Triple Wall
-#: locale/ipp-strings.c:1848
+#: locale/ipp-strings.c:1850
 msgid "media-type.triple-wall"
 msgstr ""
 
 #. TRANSLATORS: Wet Film
-#: locale/ipp-strings.c:1850
+#: locale/ipp-strings.c:1852
 msgid "media-type.wet-film"
 msgstr ""
 
 #. TRANSLATORS: Media Weight (grams per m²)
-#: locale/ipp-strings.c:1852
+#: locale/ipp-strings.c:1854
 msgid "media-weight-metric"
 msgstr ""
 
 #. TRANSLATORS: 28 x 40″
-#: locale/ipp-strings.c:1854
+#: locale/ipp-strings.c:1856
 msgid "media.asme_f_28x40in"
 msgstr ""
 
 #. TRANSLATORS: A4 or US Letter
-#: locale/ipp-strings.c:1856
+#: locale/ipp-strings.c:1858
 msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in"
 msgstr ""
 
 #. TRANSLATORS: 2a0
-#: locale/ipp-strings.c:1858
+#: locale/ipp-strings.c:1860
 msgid "media.iso_2a0_1189x1682mm"
 msgstr ""
 
 #. TRANSLATORS: A0
-#: locale/ipp-strings.c:1860
+#: locale/ipp-strings.c:1862
 msgid "media.iso_a0_841x1189mm"
 msgstr ""
 
 #. TRANSLATORS: A0x3
-#: locale/ipp-strings.c:1862
+#: locale/ipp-strings.c:1864
 msgid "media.iso_a0x3_1189x2523mm"
 msgstr ""
 
 #. TRANSLATORS: A10
-#: locale/ipp-strings.c:1864
+#: locale/ipp-strings.c:1866
 msgid "media.iso_a10_26x37mm"
 msgstr ""
 
 #. TRANSLATORS: A1
-#: locale/ipp-strings.c:1866
+#: locale/ipp-strings.c:1868
 msgid "media.iso_a1_594x841mm"
 msgstr ""
 
 #. TRANSLATORS: A1x3
-#: locale/ipp-strings.c:1868
+#: locale/ipp-strings.c:1870
 msgid "media.iso_a1x3_841x1783mm"
 msgstr ""
 
 #. TRANSLATORS: A1x4
-#: locale/ipp-strings.c:1870
+#: locale/ipp-strings.c:1872
 msgid "media.iso_a1x4_841x2378mm"
 msgstr ""
 
 #. TRANSLATORS: A2
-#: locale/ipp-strings.c:1872
+#: locale/ipp-strings.c:1874
 msgid "media.iso_a2_420x594mm"
 msgstr ""
 
 #. TRANSLATORS: A2x3
-#: locale/ipp-strings.c:1874
+#: locale/ipp-strings.c:1876
 msgid "media.iso_a2x3_594x1261mm"
 msgstr ""
 
 #. TRANSLATORS: A2x4
-#: locale/ipp-strings.c:1876
+#: locale/ipp-strings.c:1878
 msgid "media.iso_a2x4_594x1682mm"
 msgstr ""
 
 #. TRANSLATORS: A2x5
-#: locale/ipp-strings.c:1878
+#: locale/ipp-strings.c:1880
 msgid "media.iso_a2x5_594x2102mm"
 msgstr ""
 
 #. TRANSLATORS: A3 (Extra)
-#: locale/ipp-strings.c:1880
+#: locale/ipp-strings.c:1882
 msgid "media.iso_a3-extra_322x445mm"
 msgstr ""
 
 #. TRANSLATORS: A3
-#: locale/ipp-strings.c:1882
+#: locale/ipp-strings.c:1884
 msgid "media.iso_a3_297x420mm"
 msgstr ""
 
 #. TRANSLATORS: A3x3
-#: locale/ipp-strings.c:1884
+#: locale/ipp-strings.c:1886
 msgid "media.iso_a3x3_420x891mm"
 msgstr ""
 
 #. TRANSLATORS: A3x4
-#: locale/ipp-strings.c:1886
+#: locale/ipp-strings.c:1888
 msgid "media.iso_a3x4_420x1189mm"
 msgstr ""
 
 #. TRANSLATORS: A3x5
-#: locale/ipp-strings.c:1888
+#: locale/ipp-strings.c:1890
 msgid "media.iso_a3x5_420x1486mm"
 msgstr ""
 
 #. TRANSLATORS: A3x6
-#: locale/ipp-strings.c:1890
+#: locale/ipp-strings.c:1892
 msgid "media.iso_a3x6_420x1783mm"
 msgstr ""
 
 #. TRANSLATORS: A3x7
-#: locale/ipp-strings.c:1892
+#: locale/ipp-strings.c:1894
 msgid "media.iso_a3x7_420x2080mm"
 msgstr ""
 
 #. TRANSLATORS: A4 (Extra)
-#: locale/ipp-strings.c:1894
+#: locale/ipp-strings.c:1896
 msgid "media.iso_a4-extra_235.5x322.3mm"
 msgstr ""
 
 #. TRANSLATORS: A4 (Tab)
-#: locale/ipp-strings.c:1896
+#: locale/ipp-strings.c:1898
 msgid "media.iso_a4-tab_225x297mm"
 msgstr ""
 
 #. TRANSLATORS: A4
-#: locale/ipp-strings.c:1898
+#: locale/ipp-strings.c:1900
 msgid "media.iso_a4_210x297mm"
 msgstr ""
 
 #. TRANSLATORS: A4x3
-#: locale/ipp-strings.c:1900
+#: locale/ipp-strings.c:1902
 msgid "media.iso_a4x3_297x630mm"
 msgstr ""
 
 #. TRANSLATORS: A4x4
-#: locale/ipp-strings.c:1902
+#: locale/ipp-strings.c:1904
 msgid "media.iso_a4x4_297x841mm"
 msgstr ""
 
 #. TRANSLATORS: A4x5
-#: locale/ipp-strings.c:1904
+#: locale/ipp-strings.c:1906
 msgid "media.iso_a4x5_297x1051mm"
 msgstr ""
 
 #. TRANSLATORS: A4x6
-#: locale/ipp-strings.c:1906
+#: locale/ipp-strings.c:1908
 msgid "media.iso_a4x6_297x1261mm"
 msgstr ""
 
 #. TRANSLATORS: A4x7
-#: locale/ipp-strings.c:1908
+#: locale/ipp-strings.c:1910
 msgid "media.iso_a4x7_297x1471mm"
 msgstr ""
 
 #. TRANSLATORS: A4x8
-#: locale/ipp-strings.c:1910
+#: locale/ipp-strings.c:1912
 msgid "media.iso_a4x8_297x1682mm"
 msgstr ""
 
 #. TRANSLATORS: A4x9
-#: locale/ipp-strings.c:1912
+#: locale/ipp-strings.c:1914
 msgid "media.iso_a4x9_297x1892mm"
 msgstr ""
 
 #. TRANSLATORS: A5 (Extra)
-#: locale/ipp-strings.c:1914
+#: locale/ipp-strings.c:1916
 msgid "media.iso_a5-extra_174x235mm"
 msgstr ""
 
 #. TRANSLATORS: A5
-#: locale/ipp-strings.c:1916
+#: locale/ipp-strings.c:1918
 msgid "media.iso_a5_148x210mm"
 msgstr ""
 
 #. TRANSLATORS: A6
-#: locale/ipp-strings.c:1918
+#: locale/ipp-strings.c:1920
 msgid "media.iso_a6_105x148mm"
 msgstr ""
 
 #. TRANSLATORS: A7
-#: locale/ipp-strings.c:1920
+#: locale/ipp-strings.c:1922
 msgid "media.iso_a7_74x105mm"
 msgstr ""
 
 #. TRANSLATORS: A8
-#: locale/ipp-strings.c:1922
+#: locale/ipp-strings.c:1924
 msgid "media.iso_a8_52x74mm"
 msgstr ""
 
 #. TRANSLATORS: A9
-#: locale/ipp-strings.c:1924
+#: locale/ipp-strings.c:1926
 msgid "media.iso_a9_37x52mm"
 msgstr ""
 
 #. TRANSLATORS: B0
-#: locale/ipp-strings.c:1926
+#: locale/ipp-strings.c:1928
 msgid "media.iso_b0_1000x1414mm"
 msgstr ""
 
 #. TRANSLATORS: B10
-#: locale/ipp-strings.c:1928
+#: locale/ipp-strings.c:1930
 msgid "media.iso_b10_31x44mm"
 msgstr ""
 
 #. TRANSLATORS: B1
-#: locale/ipp-strings.c:1930
+#: locale/ipp-strings.c:1932
 msgid "media.iso_b1_707x1000mm"
 msgstr ""
 
 #. TRANSLATORS: B2
-#: locale/ipp-strings.c:1932
+#: locale/ipp-strings.c:1934
 msgid "media.iso_b2_500x707mm"
 msgstr ""
 
 #. TRANSLATORS: B3
-#: locale/ipp-strings.c:1934
+#: locale/ipp-strings.c:1936
 msgid "media.iso_b3_353x500mm"
 msgstr ""
 
 #. TRANSLATORS: B4
-#: locale/ipp-strings.c:1936
+#: locale/ipp-strings.c:1938
 msgid "media.iso_b4_250x353mm"
 msgstr ""
 
 #. TRANSLATORS: B5 (Extra)
-#: locale/ipp-strings.c:1938
+#: locale/ipp-strings.c:1940
 msgid "media.iso_b5-extra_201x276mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope B5
-#: locale/ipp-strings.c:1940
+#: locale/ipp-strings.c:1942
 msgid "media.iso_b5_176x250mm"
 msgstr ""
 
 #. TRANSLATORS: B6
-#: locale/ipp-strings.c:1942
+#: locale/ipp-strings.c:1944
 msgid "media.iso_b6_125x176mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope B6/C4
-#: locale/ipp-strings.c:1944
+#: locale/ipp-strings.c:1946
 msgid "media.iso_b6c4_125x324mm"
 msgstr ""
 
 #. TRANSLATORS: B7
-#: locale/ipp-strings.c:1946
+#: locale/ipp-strings.c:1948
 msgid "media.iso_b7_88x125mm"
 msgstr ""
 
 #. TRANSLATORS: B8
-#: locale/ipp-strings.c:1948
+#: locale/ipp-strings.c:1950
 msgid "media.iso_b8_62x88mm"
 msgstr ""
 
 #. TRANSLATORS: B9
-#: locale/ipp-strings.c:1950
+#: locale/ipp-strings.c:1952
 msgid "media.iso_b9_44x62mm"
 msgstr ""
 
 #. TRANSLATORS: CEnvelope 0
-#: locale/ipp-strings.c:1952
+#: locale/ipp-strings.c:1954
 msgid "media.iso_c0_917x1297mm"
 msgstr ""
 
 #. TRANSLATORS: CEnvelope 10
-#: locale/ipp-strings.c:1954
+#: locale/ipp-strings.c:1956
 msgid "media.iso_c10_28x40mm"
 msgstr ""
 
 #. TRANSLATORS: CEnvelope 1
-#: locale/ipp-strings.c:1956
+#: locale/ipp-strings.c:1958
 msgid "media.iso_c1_648x917mm"
 msgstr ""
 
 #. TRANSLATORS: CEnvelope 2
-#: locale/ipp-strings.c:1958
+#: locale/ipp-strings.c:1960
 msgid "media.iso_c2_458x648mm"
 msgstr ""
 
 #. TRANSLATORS: CEnvelope 3
-#: locale/ipp-strings.c:1960
+#: locale/ipp-strings.c:1962
 msgid "media.iso_c3_324x458mm"
 msgstr ""
 
 #. TRANSLATORS: CEnvelope 4
-#: locale/ipp-strings.c:1962
+#: locale/ipp-strings.c:1964
 msgid "media.iso_c4_229x324mm"
 msgstr ""
 
 #. TRANSLATORS: CEnvelope 5
-#: locale/ipp-strings.c:1964
+#: locale/ipp-strings.c:1966
 msgid "media.iso_c5_162x229mm"
 msgstr ""
 
 #. TRANSLATORS: CEnvelope 6
-#: locale/ipp-strings.c:1966
+#: locale/ipp-strings.c:1968
 msgid "media.iso_c6_114x162mm"
 msgstr ""
 
 #. TRANSLATORS: CEnvelope 6c5
-#: locale/ipp-strings.c:1968
+#: locale/ipp-strings.c:1970
 msgid "media.iso_c6c5_114x229mm"
 msgstr ""
 
 #. TRANSLATORS: CEnvelope 7
-#: locale/ipp-strings.c:1970
+#: locale/ipp-strings.c:1972
 msgid "media.iso_c7_81x114mm"
 msgstr ""
 
 #. TRANSLATORS: CEnvelope 7c6
-#: locale/ipp-strings.c:1972
+#: locale/ipp-strings.c:1974
 msgid "media.iso_c7c6_81x162mm"
 msgstr ""
 
 #. TRANSLATORS: CEnvelope 8
-#: locale/ipp-strings.c:1974
+#: locale/ipp-strings.c:1976
 msgid "media.iso_c8_57x81mm"
 msgstr ""
 
 #. TRANSLATORS: CEnvelope 9
-#: locale/ipp-strings.c:1976
+#: locale/ipp-strings.c:1978
 msgid "media.iso_c9_40x57mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope DL
-#: locale/ipp-strings.c:1978
+#: locale/ipp-strings.c:1980
 msgid "media.iso_dl_110x220mm"
 msgstr ""
 
 #. TRANSLATORS: Id-1
-#: locale/ipp-strings.c:1980
+#: locale/ipp-strings.c:1982
 msgid "media.iso_id-1_53.98x85.6mm"
 msgstr ""
 
 #. TRANSLATORS: Id-3
-#: locale/ipp-strings.c:1982
+#: locale/ipp-strings.c:1984
 msgid "media.iso_id-3_88x125mm"
 msgstr ""
 
 #. TRANSLATORS: ISO RA0
-#: locale/ipp-strings.c:1984
+#: locale/ipp-strings.c:1986
 msgid "media.iso_ra0_860x1220mm"
 msgstr ""
 
 #. TRANSLATORS: ISO RA1
-#: locale/ipp-strings.c:1986
+#: locale/ipp-strings.c:1988
 msgid "media.iso_ra1_610x860mm"
 msgstr ""
 
 #. TRANSLATORS: ISO RA2
-#: locale/ipp-strings.c:1988
+#: locale/ipp-strings.c:1990
 msgid "media.iso_ra2_430x610mm"
 msgstr ""
 
 #. TRANSLATORS: ISO RA3
-#: locale/ipp-strings.c:1990
+#: locale/ipp-strings.c:1992
 msgid "media.iso_ra3_305x430mm"
 msgstr ""
 
 #. TRANSLATORS: ISO RA4
-#: locale/ipp-strings.c:1992
+#: locale/ipp-strings.c:1994
 msgid "media.iso_ra4_215x305mm"
 msgstr ""
 
 #. TRANSLATORS: ISO SRA0
-#: locale/ipp-strings.c:1994
+#: locale/ipp-strings.c:1996
 msgid "media.iso_sra0_900x1280mm"
 msgstr ""
 
 #. TRANSLATORS: ISO SRA1
-#: locale/ipp-strings.c:1996
+#: locale/ipp-strings.c:1998
 msgid "media.iso_sra1_640x900mm"
 msgstr ""
 
 #. TRANSLATORS: ISO SRA2
-#: locale/ipp-strings.c:1998
+#: locale/ipp-strings.c:2000
 msgid "media.iso_sra2_450x640mm"
 msgstr ""
 
 #. TRANSLATORS: ISO SRA3
-#: locale/ipp-strings.c:2000
+#: locale/ipp-strings.c:2002
 msgid "media.iso_sra3_320x450mm"
 msgstr ""
 
 #. TRANSLATORS: ISO SRA4
-#: locale/ipp-strings.c:2002
+#: locale/ipp-strings.c:2004
 msgid "media.iso_sra4_225x320mm"
 msgstr ""
 
 #. TRANSLATORS: JIS B0
-#: locale/ipp-strings.c:2004
+#: locale/ipp-strings.c:2006
 msgid "media.jis_b0_1030x1456mm"
 msgstr ""
 
 #. TRANSLATORS: JIS B10
-#: locale/ipp-strings.c:2006
+#: locale/ipp-strings.c:2008
 msgid "media.jis_b10_32x45mm"
 msgstr ""
 
 #. TRANSLATORS: JIS B1
-#: locale/ipp-strings.c:2008
+#: locale/ipp-strings.c:2010
 msgid "media.jis_b1_728x1030mm"
 msgstr ""
 
 #. TRANSLATORS: JIS B2
-#: locale/ipp-strings.c:2010
+#: locale/ipp-strings.c:2012
 msgid "media.jis_b2_515x728mm"
 msgstr ""
 
 #. TRANSLATORS: JIS B3
-#: locale/ipp-strings.c:2012
+#: locale/ipp-strings.c:2014
 msgid "media.jis_b3_364x515mm"
 msgstr ""
 
 #. TRANSLATORS: JIS B4
-#: locale/ipp-strings.c:2014
+#: locale/ipp-strings.c:2016
 msgid "media.jis_b4_257x364mm"
 msgstr ""
 
 #. TRANSLATORS: JIS B5
-#: locale/ipp-strings.c:2016
+#: locale/ipp-strings.c:2018
 msgid "media.jis_b5_182x257mm"
 msgstr ""
 
 #. TRANSLATORS: JIS B6
-#: locale/ipp-strings.c:2018
+#: locale/ipp-strings.c:2020
 msgid "media.jis_b6_128x182mm"
 msgstr ""
 
 #. TRANSLATORS: JIS B7
-#: locale/ipp-strings.c:2020
+#: locale/ipp-strings.c:2022
 msgid "media.jis_b7_91x128mm"
 msgstr ""
 
 #. TRANSLATORS: JIS B8
-#: locale/ipp-strings.c:2022
+#: locale/ipp-strings.c:2024
 msgid "media.jis_b8_64x91mm"
 msgstr ""
 
 #. TRANSLATORS: JIS B9
-#: locale/ipp-strings.c:2024
+#: locale/ipp-strings.c:2026
 msgid "media.jis_b9_45x64mm"
 msgstr ""
 
 #. TRANSLATORS: JIS Executive
-#: locale/ipp-strings.c:2026
+#: locale/ipp-strings.c:2028
 msgid "media.jis_exec_216x330mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Chou 2
-#: locale/ipp-strings.c:2028
+#: locale/ipp-strings.c:2030
 msgid "media.jpn_chou2_111.1x146mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Chou 3
-#: locale/ipp-strings.c:2030
+#: locale/ipp-strings.c:2032
 msgid "media.jpn_chou3_120x235mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Chou 40
-#: locale/ipp-strings.c:2032
+#: locale/ipp-strings.c:2034
 msgid "media.jpn_chou40_90x225mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Chou 4
-#: locale/ipp-strings.c:2034
+#: locale/ipp-strings.c:2036
 msgid "media.jpn_chou4_90x205mm"
 msgstr ""
 
 #. TRANSLATORS: Hagaki
-#: locale/ipp-strings.c:2036
+#: locale/ipp-strings.c:2038
 msgid "media.jpn_hagaki_100x148mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Kahu
-#: locale/ipp-strings.c:2038
+#: locale/ipp-strings.c:2040
 msgid "media.jpn_kahu_240x322.1mm"
 msgstr ""
 
 #. TRANSLATORS: 270 x 382mm
-#: locale/ipp-strings.c:2040
+#: locale/ipp-strings.c:2042
 msgid "media.jpn_kaku1_270x382mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Kahu 2
-#: locale/ipp-strings.c:2042
+#: locale/ipp-strings.c:2044
 msgid "media.jpn_kaku2_240x332mm"
 msgstr ""
 
 #. TRANSLATORS: 216 x 277mm
-#: locale/ipp-strings.c:2044
+#: locale/ipp-strings.c:2046
 msgid "media.jpn_kaku3_216x277mm"
 msgstr ""
 
 #. TRANSLATORS: 197 x 267mm
-#: locale/ipp-strings.c:2046
+#: locale/ipp-strings.c:2048
 msgid "media.jpn_kaku4_197x267mm"
 msgstr ""
 
 #. TRANSLATORS: 190 x 240mm
-#: locale/ipp-strings.c:2048
+#: locale/ipp-strings.c:2050
 msgid "media.jpn_kaku5_190x240mm"
 msgstr ""
 
 #. TRANSLATORS: 142 x 205mm
-#: locale/ipp-strings.c:2050
+#: locale/ipp-strings.c:2052
 msgid "media.jpn_kaku7_142x205mm"
 msgstr ""
 
 #. TRANSLATORS: 119 x 197mm
-#: locale/ipp-strings.c:2052
+#: locale/ipp-strings.c:2054
 msgid "media.jpn_kaku8_119x197mm"
 msgstr ""
 
 #. TRANSLATORS: Oufuku Reply Postcard
-#: locale/ipp-strings.c:2054
+#: locale/ipp-strings.c:2056
 msgid "media.jpn_oufuku_148x200mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope You 4
-#: locale/ipp-strings.c:2056
+#: locale/ipp-strings.c:2058
 msgid "media.jpn_you4_105x235mm"
 msgstr ""
 
 #. TRANSLATORS: 10 x 11″
-#: locale/ipp-strings.c:2058
+#: locale/ipp-strings.c:2060
 msgid "media.na_10x11_10x11in"
 msgstr ""
 
 #. TRANSLATORS: 10 x 13″
-#: locale/ipp-strings.c:2060
+#: locale/ipp-strings.c:2062
 msgid "media.na_10x13_10x13in"
 msgstr ""
 
 #. TRANSLATORS: 10 x 14″
-#: locale/ipp-strings.c:2062
+#: locale/ipp-strings.c:2064
 msgid "media.na_10x14_10x14in"
 msgstr ""
 
 #. TRANSLATORS: 10 x 15″
-#: locale/ipp-strings.c:2064
+#: locale/ipp-strings.c:2066
 msgid "media.na_10x15_10x15in"
 msgstr ""
 
 #. TRANSLATORS: 11 x 12″
-#: locale/ipp-strings.c:2066
+#: locale/ipp-strings.c:2068
 msgid "media.na_11x12_11x12in"
 msgstr ""
 
 #. TRANSLATORS: 11 x 15″
-#: locale/ipp-strings.c:2068
+#: locale/ipp-strings.c:2070
 msgid "media.na_11x15_11x15in"
 msgstr ""
 
 #. TRANSLATORS: 12 x 19″
-#: locale/ipp-strings.c:2070
+#: locale/ipp-strings.c:2072
 msgid "media.na_12x19_12x19in"
 msgstr ""
 
 #. TRANSLATORS: 5 x 7″
-#: locale/ipp-strings.c:2072
+#: locale/ipp-strings.c:2074
 msgid "media.na_5x7_5x7in"
 msgstr ""
 
 #. TRANSLATORS: 6 x 9″
-#: locale/ipp-strings.c:2074
+#: locale/ipp-strings.c:2076
 msgid "media.na_6x9_6x9in"
 msgstr ""
 
 #. TRANSLATORS: 7 x 9″
-#: locale/ipp-strings.c:2076
+#: locale/ipp-strings.c:2078
 msgid "media.na_7x9_7x9in"
 msgstr ""
 
 #. TRANSLATORS: 9 x 11″
-#: locale/ipp-strings.c:2078
+#: locale/ipp-strings.c:2080
 msgid "media.na_9x11_9x11in"
 msgstr ""
 
 #. TRANSLATORS: Envelope A2
-#: locale/ipp-strings.c:2080
+#: locale/ipp-strings.c:2082
 msgid "media.na_a2_4.375x5.75in"
 msgstr ""
 
 #. TRANSLATORS: 9 x 12″
-#: locale/ipp-strings.c:2082
+#: locale/ipp-strings.c:2084
 msgid "media.na_arch-a_9x12in"
 msgstr ""
 
 #. TRANSLATORS: 12 x 18″
-#: locale/ipp-strings.c:2084
+#: locale/ipp-strings.c:2086
 msgid "media.na_arch-b_12x18in"
 msgstr ""
 
 #. TRANSLATORS: 18 x 24″
-#: locale/ipp-strings.c:2086
+#: locale/ipp-strings.c:2088
 msgid "media.na_arch-c_18x24in"
 msgstr ""
 
 #. TRANSLATORS: 24 x 36″
-#: locale/ipp-strings.c:2088
+#: locale/ipp-strings.c:2090
 msgid "media.na_arch-d_24x36in"
 msgstr ""
 
 #. TRANSLATORS: 26 x 38″
-#: locale/ipp-strings.c:2090
+#: locale/ipp-strings.c:2092
 msgid "media.na_arch-e2_26x38in"
 msgstr ""
 
 #. TRANSLATORS: 27 x 39″
-#: locale/ipp-strings.c:2092
+#: locale/ipp-strings.c:2094
 msgid "media.na_arch-e3_27x39in"
 msgstr ""
 
 #. TRANSLATORS: 36 x 48″
-#: locale/ipp-strings.c:2094
+#: locale/ipp-strings.c:2096
 msgid "media.na_arch-e_36x48in"
 msgstr ""
 
 #. TRANSLATORS: 12 x 19.17″
-#: locale/ipp-strings.c:2096
+#: locale/ipp-strings.c:2098
 msgid "media.na_b-plus_12x19.17in"
 msgstr ""
 
 #. TRANSLATORS: Envelope C5
-#: locale/ipp-strings.c:2098
+#: locale/ipp-strings.c:2100
 msgid "media.na_c5_6.5x9.5in"
 msgstr ""
 
 #. TRANSLATORS: 17 x 22″
-#: locale/ipp-strings.c:2100
+#: locale/ipp-strings.c:2102
 msgid "media.na_c_17x22in"
 msgstr ""
 
 #. TRANSLATORS: 22 x 34″
-#: locale/ipp-strings.c:2102
+#: locale/ipp-strings.c:2104
 msgid "media.na_d_22x34in"
 msgstr ""
 
 #. TRANSLATORS: 34 x 44″
-#: locale/ipp-strings.c:2104
+#: locale/ipp-strings.c:2106
 msgid "media.na_e_34x44in"
 msgstr ""
 
 #. TRANSLATORS: 11 x 14″
-#: locale/ipp-strings.c:2106
+#: locale/ipp-strings.c:2108
 msgid "media.na_edp_11x14in"
 msgstr ""
 
 #. TRANSLATORS: 12 x 14″
-#: locale/ipp-strings.c:2108
+#: locale/ipp-strings.c:2110
 msgid "media.na_eur-edp_12x14in"
 msgstr ""
 
 #. TRANSLATORS: Executive
-#: locale/ipp-strings.c:2110
+#: locale/ipp-strings.c:2112
 msgid "media.na_executive_7.25x10.5in"
 msgstr ""
 
 #. TRANSLATORS: 44 x 68″
-#: locale/ipp-strings.c:2112
+#: locale/ipp-strings.c:2114
 msgid "media.na_f_44x68in"
 msgstr ""
 
 #. TRANSLATORS: European Fanfold
-#: locale/ipp-strings.c:2114
+#: locale/ipp-strings.c:2116
 msgid "media.na_fanfold-eur_8.5x12in"
 msgstr ""
 
 #. TRANSLATORS: US Fanfold
-#: locale/ipp-strings.c:2116
+#: locale/ipp-strings.c:2118
 msgid "media.na_fanfold-us_11x14.875in"
 msgstr ""
 
 #. TRANSLATORS: Foolscap
-#: locale/ipp-strings.c:2118
+#: locale/ipp-strings.c:2120
 msgid "media.na_foolscap_8.5x13in"
 msgstr ""
 
 #. TRANSLATORS: 8 x 13″
-#: locale/ipp-strings.c:2120
+#: locale/ipp-strings.c:2122
 msgid "media.na_govt-legal_8x13in"
 msgstr ""
 
 #. TRANSLATORS: 8 x 10″
-#: locale/ipp-strings.c:2122
+#: locale/ipp-strings.c:2124
 msgid "media.na_govt-letter_8x10in"
 msgstr ""
 
 #. TRANSLATORS: 3 x 5″
-#: locale/ipp-strings.c:2124
+#: locale/ipp-strings.c:2126
 msgid "media.na_index-3x5_3x5in"
 msgstr ""
 
 #. TRANSLATORS: 6 x 8″
-#: locale/ipp-strings.c:2126
+#: locale/ipp-strings.c:2128
 msgid "media.na_index-4x6-ext_6x8in"
 msgstr ""
 
 #. TRANSLATORS: 4 x 6″
-#: locale/ipp-strings.c:2128
+#: locale/ipp-strings.c:2130
 msgid "media.na_index-4x6_4x6in"
 msgstr ""
 
 #. TRANSLATORS: 5 x 8″
-#: locale/ipp-strings.c:2130
+#: locale/ipp-strings.c:2132
 msgid "media.na_index-5x8_5x8in"
 msgstr ""
 
 #. TRANSLATORS: Statement
-#: locale/ipp-strings.c:2132
+#: locale/ipp-strings.c:2134
 msgid "media.na_invoice_5.5x8.5in"
 msgstr ""
 
 #. TRANSLATORS: 11 x 17″
-#: locale/ipp-strings.c:2134
+#: locale/ipp-strings.c:2136
 msgid "media.na_ledger_11x17in"
 msgstr ""
 
 #. TRANSLATORS: US Legal (Extra)
-#: locale/ipp-strings.c:2136
+#: locale/ipp-strings.c:2138
 msgid "media.na_legal-extra_9.5x15in"
 msgstr ""
 
 #. TRANSLATORS: US Legal
-#: locale/ipp-strings.c:2138
+#: locale/ipp-strings.c:2140
 msgid "media.na_legal_8.5x14in"
 msgstr ""
 
 #. TRANSLATORS: US Letter (Extra)
-#: locale/ipp-strings.c:2140
+#: locale/ipp-strings.c:2142
 msgid "media.na_letter-extra_9.5x12in"
 msgstr ""
 
 #. TRANSLATORS: US Letter (Plus)
-#: locale/ipp-strings.c:2142
+#: locale/ipp-strings.c:2144
 msgid "media.na_letter-plus_8.5x12.69in"
 msgstr ""
 
 #. TRANSLATORS: US Letter
-#: locale/ipp-strings.c:2144
+#: locale/ipp-strings.c:2146
 msgid "media.na_letter_8.5x11in"
 msgstr ""
 
 #. TRANSLATORS: Envelope Monarch
-#: locale/ipp-strings.c:2146
+#: locale/ipp-strings.c:2148
 msgid "media.na_monarch_3.875x7.5in"
 msgstr ""
 
 #. TRANSLATORS: Envelope #10
-#: locale/ipp-strings.c:2148
+#: locale/ipp-strings.c:2150
 msgid "media.na_number-10_4.125x9.5in"
 msgstr ""
 
 #. TRANSLATORS: Envelope #11
-#: locale/ipp-strings.c:2150
+#: locale/ipp-strings.c:2152
 msgid "media.na_number-11_4.5x10.375in"
 msgstr ""
 
 #. TRANSLATORS: Envelope #12
-#: locale/ipp-strings.c:2152
+#: locale/ipp-strings.c:2154
 msgid "media.na_number-12_4.75x11in"
 msgstr ""
 
 #. TRANSLATORS: Envelope #14
-#: locale/ipp-strings.c:2154
+#: locale/ipp-strings.c:2156
 msgid "media.na_number-14_5x11.5in"
 msgstr ""
 
 #. TRANSLATORS: Envelope #9
-#: locale/ipp-strings.c:2156
+#: locale/ipp-strings.c:2158
 msgid "media.na_number-9_3.875x8.875in"
 msgstr ""
 
 #. TRANSLATORS: 8.5 x 13.4″
-#: locale/ipp-strings.c:2158
+#: locale/ipp-strings.c:2160
 msgid "media.na_oficio_8.5x13.4in"
 msgstr ""
 
 #. TRANSLATORS: Envelope Personal
-#: locale/ipp-strings.c:2160
+#: locale/ipp-strings.c:2162
 msgid "media.na_personal_3.625x6.5in"
 msgstr ""
 
 #. TRANSLATORS: Quarto
-#: locale/ipp-strings.c:2162
+#: locale/ipp-strings.c:2164
 msgid "media.na_quarto_8.5x10.83in"
 msgstr ""
 
 #. TRANSLATORS: 8.94 x 14″
-#: locale/ipp-strings.c:2164
+#: locale/ipp-strings.c:2166
 msgid "media.na_super-a_8.94x14in"
 msgstr ""
 
 #. TRANSLATORS: 13 x 19″
-#: locale/ipp-strings.c:2166
+#: locale/ipp-strings.c:2168
 msgid "media.na_super-b_13x19in"
 msgstr ""
 
 #. TRANSLATORS: 30 x 42″
-#: locale/ipp-strings.c:2168
+#: locale/ipp-strings.c:2170
 msgid "media.na_wide-format_30x42in"
 msgstr ""
 
 #. TRANSLATORS: 12 x 16″
-#: locale/ipp-strings.c:2170
+#: locale/ipp-strings.c:2172
 msgid "media.oe_12x16_12x16in"
 msgstr ""
 
 #. TRANSLATORS: 14 x 17″
-#: locale/ipp-strings.c:2172
+#: locale/ipp-strings.c:2174
 msgid "media.oe_14x17_14x17in"
 msgstr ""
 
 #. TRANSLATORS: 18 x 22″
-#: locale/ipp-strings.c:2174
+#: locale/ipp-strings.c:2176
 msgid "media.oe_18x22_18x22in"
 msgstr ""
 
 #. TRANSLATORS: 17 x 24″
-#: locale/ipp-strings.c:2176
+#: locale/ipp-strings.c:2178
 msgid "media.oe_a2plus_17x24in"
 msgstr ""
 
 #. TRANSLATORS: 2 x 3.5″
-#: locale/ipp-strings.c:2178
+#: locale/ipp-strings.c:2180
 msgid "media.oe_business-card_2x3.5in"
 msgstr ""
 
 #. TRANSLATORS: 10 x 12″
-#: locale/ipp-strings.c:2180
+#: locale/ipp-strings.c:2182
 msgid "media.oe_photo-10r_10x12in"
 msgstr ""
 
 #. TRANSLATORS: 20 x 24″
-#: locale/ipp-strings.c:2182
+#: locale/ipp-strings.c:2184
 msgid "media.oe_photo-20r_20x24in"
 msgstr ""
 
 #. TRANSLATORS: 3.5 x 5″
-#: locale/ipp-strings.c:2184
+#: locale/ipp-strings.c:2186
 msgid "media.oe_photo-l_3.5x5in"
 msgstr ""
 
 #. TRANSLATORS: 10 x 15″
-#: locale/ipp-strings.c:2186
+#: locale/ipp-strings.c:2188
 msgid "media.oe_photo-s10r_10x15in"
 msgstr ""
 
 #. TRANSLATORS: 4 x 4″
-#: locale/ipp-strings.c:2188
+#: locale/ipp-strings.c:2190
 msgid "media.oe_square-photo_4x4in"
 msgstr ""
 
 #. TRANSLATORS: 5 x 5″
-#: locale/ipp-strings.c:2190
+#: locale/ipp-strings.c:2192
 msgid "media.oe_square-photo_5x5in"
 msgstr ""
 
 #. TRANSLATORS: 184 x 260mm
-#: locale/ipp-strings.c:2192
+#: locale/ipp-strings.c:2194
 msgid "media.om_16k_184x260mm"
 msgstr ""
 
 #. TRANSLATORS: 195 x 270mm
-#: locale/ipp-strings.c:2194
+#: locale/ipp-strings.c:2196
 msgid "media.om_16k_195x270mm"
 msgstr ""
 
 #. TRANSLATORS: 55 x 85mm
-#: locale/ipp-strings.c:2196
+#: locale/ipp-strings.c:2198
 msgid "media.om_business-card_55x85mm"
 msgstr ""
 
 #. TRANSLATORS: 55 x 91mm
-#: locale/ipp-strings.c:2198
+#: locale/ipp-strings.c:2200
 msgid "media.om_business-card_55x91mm"
 msgstr ""
 
 #. TRANSLATORS: 54 x 86mm
-#: locale/ipp-strings.c:2200
+#: locale/ipp-strings.c:2202
 msgid "media.om_card_54x86mm"
 msgstr ""
 
 #. TRANSLATORS: 275 x 395mm
-#: locale/ipp-strings.c:2202
+#: locale/ipp-strings.c:2204
 msgid "media.om_dai-pa-kai_275x395mm"
 msgstr ""
 
 #. TRANSLATORS: 89 x 119mm
-#: locale/ipp-strings.c:2204
+#: locale/ipp-strings.c:2206
 msgid "media.om_dsc-photo_89x119mm"
 msgstr ""
 
 #. TRANSLATORS: Folio
-#: locale/ipp-strings.c:2206
+#: locale/ipp-strings.c:2208
 msgid "media.om_folio-sp_215x315mm"
 msgstr ""
 
 #. TRANSLATORS: Folio (Special)
-#: locale/ipp-strings.c:2208
+#: locale/ipp-strings.c:2210
 msgid "media.om_folio_210x330mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Invitation
-#: locale/ipp-strings.c:2210
+#: locale/ipp-strings.c:2212
 msgid "media.om_invite_220x220mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Italian
-#: locale/ipp-strings.c:2212
+#: locale/ipp-strings.c:2214
 msgid "media.om_italian_110x230mm"
 msgstr ""
 
 #. TRANSLATORS: 198 x 275mm
-#: locale/ipp-strings.c:2214
+#: locale/ipp-strings.c:2216
 msgid "media.om_juuro-ku-kai_198x275mm"
 msgstr ""
 
 #. TRANSLATORS: 200 x 300
-#: locale/ipp-strings.c:2216
+#: locale/ipp-strings.c:2218
 msgid "media.om_large-photo_200x300"
 msgstr ""
 
 #. TRANSLATORS: 130 x 180mm
-#: locale/ipp-strings.c:2218
+#: locale/ipp-strings.c:2220
 msgid "media.om_medium-photo_130x180mm"
 msgstr ""
 
 #. TRANSLATORS: 267 x 389mm
-#: locale/ipp-strings.c:2220
+#: locale/ipp-strings.c:2222
 msgid "media.om_pa-kai_267x389mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Postfix
-#: locale/ipp-strings.c:2222
+#: locale/ipp-strings.c:2224
 msgid "media.om_postfix_114x229mm"
 msgstr ""
 
 #. TRANSLATORS: 100 x 150mm
-#: locale/ipp-strings.c:2224
+#: locale/ipp-strings.c:2226
 msgid "media.om_small-photo_100x150mm"
 msgstr ""
 
 #. TRANSLATORS: 89 x 89mm
-#: locale/ipp-strings.c:2226
+#: locale/ipp-strings.c:2228
 msgid "media.om_square-photo_89x89mm"
 msgstr ""
 
 #. TRANSLATORS: 100 x 200mm
-#: locale/ipp-strings.c:2228
+#: locale/ipp-strings.c:2230
 msgid "media.om_wide-photo_100x200mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Chinese #10
-#: locale/ipp-strings.c:2230
+#: locale/ipp-strings.c:2232
 msgid "media.prc_10_324x458mm"
 msgstr ""
 
 #. TRANSLATORS: Chinese 16k
-#: locale/ipp-strings.c:2232
+#: locale/ipp-strings.c:2234
 msgid "media.prc_16k_146x215mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Chinese #1
-#: locale/ipp-strings.c:2234
+#: locale/ipp-strings.c:2236
 msgid "media.prc_1_102x165mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Chinese #2
-#: locale/ipp-strings.c:2236
+#: locale/ipp-strings.c:2238
 msgid "media.prc_2_102x176mm"
 msgstr ""
 
 #. TRANSLATORS: Chinese 32k
-#: locale/ipp-strings.c:2238
+#: locale/ipp-strings.c:2240
 msgid "media.prc_32k_97x151mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Chinese #3
-#: locale/ipp-strings.c:2240
+#: locale/ipp-strings.c:2242
 msgid "media.prc_3_125x176mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Chinese #4
-#: locale/ipp-strings.c:2242
+#: locale/ipp-strings.c:2244
 msgid "media.prc_4_110x208mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Chinese #5
-#: locale/ipp-strings.c:2244
+#: locale/ipp-strings.c:2246
 msgid "media.prc_5_110x220mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Chinese #6
-#: locale/ipp-strings.c:2246
+#: locale/ipp-strings.c:2248
 msgid "media.prc_6_120x320mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Chinese #7
-#: locale/ipp-strings.c:2248
+#: locale/ipp-strings.c:2250
 msgid "media.prc_7_160x230mm"
 msgstr ""
 
 #. TRANSLATORS: Envelope Chinese #8
-#: locale/ipp-strings.c:2250
+#: locale/ipp-strings.c:2252
 msgid "media.prc_8_120x309mm"
 msgstr ""
 
 #. TRANSLATORS: ROC 16k
-#: locale/ipp-strings.c:2252
+#: locale/ipp-strings.c:2254
 msgid "media.roc_16k_7.75x10.75in"
 msgstr ""
 
 #. TRANSLATORS: ROC 8k
-#: locale/ipp-strings.c:2254
+#: locale/ipp-strings.c:2256
 msgid "media.roc_8k_10.75x15.5in"
 msgstr ""
 
@@ -12920,82 +12925,82 @@ msgid "members of class %s:"
 msgstr ""
 
 #. TRANSLATORS: Multiple Document Handling
-#: locale/ipp-strings.c:2256
+#: locale/ipp-strings.c:2258
 msgid "multiple-document-handling"
 msgstr ""
 
 #. TRANSLATORS: Separate Documents Collated Copies
-#: locale/ipp-strings.c:2258
+#: locale/ipp-strings.c:2260
 msgid "multiple-document-handling.separate-documents-collated-copies"
 msgstr ""
 
 #. TRANSLATORS: Separate Documents Uncollated Copies
-#: locale/ipp-strings.c:2260
+#: locale/ipp-strings.c:2262
 msgid "multiple-document-handling.separate-documents-uncollated-copies"
 msgstr ""
 
 #. TRANSLATORS: Single Document
-#: locale/ipp-strings.c:2262
+#: locale/ipp-strings.c:2264
 msgid "multiple-document-handling.single-document"
 msgstr ""
 
 #. TRANSLATORS: Single Document New Sheet
-#: locale/ipp-strings.c:2264
+#: locale/ipp-strings.c:2266
 msgid "multiple-document-handling.single-document-new-sheet"
 msgstr ""
 
 #. TRANSLATORS: Multiple Object Handling
-#: locale/ipp-strings.c:2266
+#: locale/ipp-strings.c:2268
 msgid "multiple-object-handling"
 msgstr ""
 
 #. TRANSLATORS: Multiple Object Handling Actual
-#: locale/ipp-strings.c:2268
+#: locale/ipp-strings.c:2270
 msgid "multiple-object-handling-actual"
 msgstr ""
 
 #. TRANSLATORS: Automatic
-#: locale/ipp-strings.c:2270
+#: locale/ipp-strings.c:2272
 msgid "multiple-object-handling.auto"
 msgstr ""
 
 #. TRANSLATORS: Best Fit
-#: locale/ipp-strings.c:2272
+#: locale/ipp-strings.c:2274
 msgid "multiple-object-handling.best-fit"
 msgstr ""
 
 #. TRANSLATORS: Best Quality
-#: locale/ipp-strings.c:2274
+#: locale/ipp-strings.c:2276
 msgid "multiple-object-handling.best-quality"
 msgstr ""
 
 #. TRANSLATORS: Best Speed
-#: locale/ipp-strings.c:2276
+#: locale/ipp-strings.c:2278
 msgid "multiple-object-handling.best-speed"
 msgstr ""
 
 #. TRANSLATORS: One At A Time
-#: locale/ipp-strings.c:2278
+#: locale/ipp-strings.c:2280
 msgid "multiple-object-handling.one-at-a-time"
 msgstr ""
 
 #. TRANSLATORS: On Timeout
-#: locale/ipp-strings.c:2280
+#: locale/ipp-strings.c:2282
 msgid "multiple-operation-time-out-action"
 msgstr ""
 
 #. TRANSLATORS: Abort Job
-#: locale/ipp-strings.c:2282
+#: locale/ipp-strings.c:2284
 msgid "multiple-operation-time-out-action.abort-job"
 msgstr ""
 
 #. TRANSLATORS: Hold Job
-#: locale/ipp-strings.c:2284
+#: locale/ipp-strings.c:2286
 msgid "multiple-operation-time-out-action.hold-job"
 msgstr ""
 
 #. TRANSLATORS: Process Job
-#: locale/ipp-strings.c:2286
+#: locale/ipp-strings.c:2288
 msgid "multiple-operation-time-out-action.process-job"
 msgstr ""
 
@@ -13008,22 +13013,22 @@ msgid "no system default destination"
 msgstr ""
 
 #. TRANSLATORS: Noise Removal
-#: locale/ipp-strings.c:2288
+#: locale/ipp-strings.c:2290
 msgid "noise-removal"
 msgstr ""
 
 #. TRANSLATORS: Notify Attributes
-#: locale/ipp-strings.c:2290
+#: locale/ipp-strings.c:2292
 msgid "notify-attributes"
 msgstr ""
 
 #. TRANSLATORS: Notify Charset
-#: locale/ipp-strings.c:2292
+#: locale/ipp-strings.c:2294
 msgid "notify-charset"
 msgstr ""
 
 #. TRANSLATORS: Notify Events
-#: locale/ipp-strings.c:2294
+#: locale/ipp-strings.c:2296
 msgid "notify-events"
 msgstr ""
 
@@ -13032,137 +13037,137 @@ msgid "notify-events not specified."
 msgstr ""
 
 #. TRANSLATORS: Document Completed
-#: locale/ipp-strings.c:2296
+#: locale/ipp-strings.c:2298
 msgid "notify-events.document-completed"
 msgstr ""
 
 #. TRANSLATORS: Document Config Changed
-#: locale/ipp-strings.c:2298
+#: locale/ipp-strings.c:2300
 msgid "notify-events.document-config-changed"
 msgstr ""
 
 #. TRANSLATORS: Document Created
-#: locale/ipp-strings.c:2300
+#: locale/ipp-strings.c:2302
 msgid "notify-events.document-created"
 msgstr ""
 
 #. TRANSLATORS: Document Fetchable
-#: locale/ipp-strings.c:2302
+#: locale/ipp-strings.c:2304
 msgid "notify-events.document-fetchable"
 msgstr ""
 
 #. TRANSLATORS: Document State Changed
-#: locale/ipp-strings.c:2304
+#: locale/ipp-strings.c:2306
 msgid "notify-events.document-state-changed"
 msgstr ""
 
 #. TRANSLATORS: Document Stopped
-#: locale/ipp-strings.c:2306
+#: locale/ipp-strings.c:2308
 msgid "notify-events.document-stopped"
 msgstr ""
 
 #. TRANSLATORS: Job Completed
-#: locale/ipp-strings.c:2308
+#: locale/ipp-strings.c:2310
 msgid "notify-events.job-completed"
 msgstr ""
 
 #. TRANSLATORS: Job Config Changed
-#: locale/ipp-strings.c:2310
+#: locale/ipp-strings.c:2312
 msgid "notify-events.job-config-changed"
 msgstr ""
 
 #. TRANSLATORS: Job Created
-#: locale/ipp-strings.c:2312
+#: locale/ipp-strings.c:2314
 msgid "notify-events.job-created"
 msgstr ""
 
 #. TRANSLATORS: Job Fetchable
-#: locale/ipp-strings.c:2314
+#: locale/ipp-strings.c:2316
 msgid "notify-events.job-fetchable"
 msgstr ""
 
 #. TRANSLATORS: Job Progress
-#: locale/ipp-strings.c:2316
+#: locale/ipp-strings.c:2318
 msgid "notify-events.job-progress"
 msgstr ""
 
 #. TRANSLATORS: Job State Changed
-#: locale/ipp-strings.c:2318
+#: locale/ipp-strings.c:2320
 msgid "notify-events.job-state-changed"
 msgstr ""
 
 #. TRANSLATORS: Job Stopped
-#: locale/ipp-strings.c:2320
+#: locale/ipp-strings.c:2322
 msgid "notify-events.job-stopped"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:2322
+#: locale/ipp-strings.c:2324
 msgid "notify-events.none"
 msgstr ""
 
 #. TRANSLATORS: Printer Config Changed
-#: locale/ipp-strings.c:2324
+#: locale/ipp-strings.c:2326
 msgid "notify-events.printer-config-changed"
 msgstr ""
 
 #. TRANSLATORS: Printer Finishings Changed
-#: locale/ipp-strings.c:2326
+#: locale/ipp-strings.c:2328
 msgid "notify-events.printer-finishings-changed"
 msgstr ""
 
 #. TRANSLATORS: Printer Media Changed
-#: locale/ipp-strings.c:2328
+#: locale/ipp-strings.c:2330
 msgid "notify-events.printer-media-changed"
 msgstr ""
 
 #. TRANSLATORS: Printer Queue Order Changed
-#: locale/ipp-strings.c:2330
+#: locale/ipp-strings.c:2332
 msgid "notify-events.printer-queue-order-changed"
 msgstr ""
 
 #. TRANSLATORS: Printer Restarted
-#: locale/ipp-strings.c:2332
+#: locale/ipp-strings.c:2334
 msgid "notify-events.printer-restarted"
 msgstr ""
 
 #. TRANSLATORS: Printer Shutdown
-#: locale/ipp-strings.c:2334
+#: locale/ipp-strings.c:2336
 msgid "notify-events.printer-shutdown"
 msgstr ""
 
 #. TRANSLATORS: Printer State Changed
-#: locale/ipp-strings.c:2336
+#: locale/ipp-strings.c:2338
 msgid "notify-events.printer-state-changed"
 msgstr ""
 
 #. TRANSLATORS: Printer Stopped
-#: locale/ipp-strings.c:2338
+#: locale/ipp-strings.c:2340
 msgid "notify-events.printer-stopped"
 msgstr ""
 
 #. TRANSLATORS: Notify Get Interval
-#: locale/ipp-strings.c:2340
+#: locale/ipp-strings.c:2342
 msgid "notify-get-interval"
 msgstr ""
 
 #. TRANSLATORS: Notify Lease Duration
-#: locale/ipp-strings.c:2342
+#: locale/ipp-strings.c:2344
 msgid "notify-lease-duration"
 msgstr ""
 
 #. TRANSLATORS: Notify Natural Language
-#: locale/ipp-strings.c:2344
+#: locale/ipp-strings.c:2346
 msgid "notify-natural-language"
 msgstr ""
 
 #. TRANSLATORS: Notify Pull Method
-#: locale/ipp-strings.c:2346
+#: locale/ipp-strings.c:2348
 msgid "notify-pull-method"
 msgstr ""
 
 #. TRANSLATORS: Notify Recipient
-#: locale/ipp-strings.c:2348
+#: locale/ipp-strings.c:2350
 msgid "notify-recipient-uri"
 msgstr ""
 
@@ -13177,397 +13182,397 @@ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme."
 msgstr ""
 
 #. TRANSLATORS: Notify Sequence Numbers
-#: locale/ipp-strings.c:2350
+#: locale/ipp-strings.c:2352
 msgid "notify-sequence-numbers"
 msgstr ""
 
 #. TRANSLATORS: Notify Subscription Ids
-#: locale/ipp-strings.c:2352
+#: locale/ipp-strings.c:2354
 msgid "notify-subscription-ids"
 msgstr ""
 
 #. TRANSLATORS: Notify Time Interval
-#: locale/ipp-strings.c:2354
+#: locale/ipp-strings.c:2356
 msgid "notify-time-interval"
 msgstr ""
 
 #. TRANSLATORS: Notify User Data
-#: locale/ipp-strings.c:2356
+#: locale/ipp-strings.c:2358
 msgid "notify-user-data"
 msgstr ""
 
 #. TRANSLATORS: Notify Wait
-#: locale/ipp-strings.c:2358
+#: locale/ipp-strings.c:2360
 msgid "notify-wait"
 msgstr ""
 
 #. TRANSLATORS: Number Of Retries
-#: locale/ipp-strings.c:2360
+#: locale/ipp-strings.c:2362
 msgid "number-of-retries"
 msgstr ""
 
 #. TRANSLATORS: Number-Up
-#: locale/ipp-strings.c:2362
+#: locale/ipp-strings.c:2364
 msgid "number-up"
 msgstr ""
 
 #. TRANSLATORS: Object Offset
-#: locale/ipp-strings.c:2364
+#: locale/ipp-strings.c:2366
 msgid "object-offset"
 msgstr ""
 
 #. TRANSLATORS: Object Size
-#: locale/ipp-strings.c:2366
+#: locale/ipp-strings.c:2368
 msgid "object-size"
 msgstr ""
 
 #. TRANSLATORS: Organization Name
-#: locale/ipp-strings.c:2368
+#: locale/ipp-strings.c:2370
 msgid "organization-name"
 msgstr ""
 
 #. TRANSLATORS: Orientation
-#: locale/ipp-strings.c:2370
+#: locale/ipp-strings.c:2372
 msgid "orientation-requested"
 msgstr ""
 
 #. TRANSLATORS: Portrait
-#: locale/ipp-strings.c:2372
+#: locale/ipp-strings.c:2374
 msgid "orientation-requested.3"
 msgstr ""
 
 #. TRANSLATORS: Landscape
-#: locale/ipp-strings.c:2374
+#: locale/ipp-strings.c:2376
 msgid "orientation-requested.4"
 msgstr ""
 
 #. TRANSLATORS: Reverse Landscape
-#: locale/ipp-strings.c:2376
+#: locale/ipp-strings.c:2378
 msgid "orientation-requested.5"
 msgstr ""
 
 #. TRANSLATORS: Reverse Portrait
-#: locale/ipp-strings.c:2378
+#: locale/ipp-strings.c:2380
 msgid "orientation-requested.6"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:2380
+#: locale/ipp-strings.c:2382
 msgid "orientation-requested.7"
 msgstr ""
 
 #. TRANSLATORS: Scanned Image Options
-#: locale/ipp-strings.c:2382
+#: locale/ipp-strings.c:2384
 msgid "output-attributes"
 msgstr ""
 
 #. TRANSLATORS: Output Tray
-#: locale/ipp-strings.c:2384
+#: locale/ipp-strings.c:2386
 msgid "output-bin"
 msgstr ""
 
 #. TRANSLATORS: Automatic
-#: locale/ipp-strings.c:2386
+#: locale/ipp-strings.c:2388
 msgid "output-bin.auto"
 msgstr ""
 
 #. TRANSLATORS: Bottom
-#: locale/ipp-strings.c:2388
+#: locale/ipp-strings.c:2390
 msgid "output-bin.bottom"
 msgstr ""
 
 #. TRANSLATORS: Center
-#: locale/ipp-strings.c:2390
+#: locale/ipp-strings.c:2392
 msgid "output-bin.center"
 msgstr ""
 
 #. TRANSLATORS: Face Down
-#: locale/ipp-strings.c:2392
+#: locale/ipp-strings.c:2394
 msgid "output-bin.face-down"
 msgstr ""
 
 #. TRANSLATORS: Face Up
-#: locale/ipp-strings.c:2394
+#: locale/ipp-strings.c:2396
 msgid "output-bin.face-up"
 msgstr ""
 
 #. TRANSLATORS: Large Capacity
-#: locale/ipp-strings.c:2396
+#: locale/ipp-strings.c:2398
 msgid "output-bin.large-capacity"
 msgstr ""
 
 #. TRANSLATORS: Left
-#: locale/ipp-strings.c:2398
+#: locale/ipp-strings.c:2400
 msgid "output-bin.left"
 msgstr ""
 
 #. TRANSLATORS: Mailbox 1
-#: locale/ipp-strings.c:2400
+#: locale/ipp-strings.c:2402
 msgid "output-bin.mailbox-1"
 msgstr ""
 
 #. TRANSLATORS: Mailbox 10
-#: locale/ipp-strings.c:2402
+#: locale/ipp-strings.c:2404
 msgid "output-bin.mailbox-10"
 msgstr ""
 
 #. TRANSLATORS: Mailbox 2
-#: locale/ipp-strings.c:2404
+#: locale/ipp-strings.c:2406
 msgid "output-bin.mailbox-2"
 msgstr ""
 
 #. TRANSLATORS: Mailbox 3
-#: locale/ipp-strings.c:2406
+#: locale/ipp-strings.c:2408
 msgid "output-bin.mailbox-3"
 msgstr ""
 
 #. TRANSLATORS: Mailbox 4
-#: locale/ipp-strings.c:2408
+#: locale/ipp-strings.c:2410
 msgid "output-bin.mailbox-4"
 msgstr ""
 
 #. TRANSLATORS: Mailbox 5
-#: locale/ipp-strings.c:2410
+#: locale/ipp-strings.c:2412
 msgid "output-bin.mailbox-5"
 msgstr ""
 
 #. TRANSLATORS: Mailbox 6
-#: locale/ipp-strings.c:2412
+#: locale/ipp-strings.c:2414
 msgid "output-bin.mailbox-6"
 msgstr ""
 
 #. TRANSLATORS: Mailbox 7
-#: locale/ipp-strings.c:2414
+#: locale/ipp-strings.c:2416
 msgid "output-bin.mailbox-7"
 msgstr ""
 
 #. TRANSLATORS: Mailbox 8
-#: locale/ipp-strings.c:2416
+#: locale/ipp-strings.c:2418
 msgid "output-bin.mailbox-8"
 msgstr ""
 
 #. TRANSLATORS: Mailbox 9
-#: locale/ipp-strings.c:2418
+#: locale/ipp-strings.c:2420
 msgid "output-bin.mailbox-9"
 msgstr ""
 
 #. TRANSLATORS: Middle
-#: locale/ipp-strings.c:2420
+#: locale/ipp-strings.c:2422
 msgid "output-bin.middle"
 msgstr ""
 
 #. TRANSLATORS: My Mailbox
-#: locale/ipp-strings.c:2422
+#: locale/ipp-strings.c:2424
 msgid "output-bin.my-mailbox"
 msgstr ""
 
 #. TRANSLATORS: Rear
-#: locale/ipp-strings.c:2424
+#: locale/ipp-strings.c:2426
 msgid "output-bin.rear"
 msgstr ""
 
 #. TRANSLATORS: Right
-#: locale/ipp-strings.c:2426
+#: locale/ipp-strings.c:2428
 msgid "output-bin.right"
 msgstr ""
 
 #. TRANSLATORS: Side
-#: locale/ipp-strings.c:2428
+#: locale/ipp-strings.c:2430
 msgid "output-bin.side"
 msgstr ""
 
 #. TRANSLATORS: Stacker 1
-#: locale/ipp-strings.c:2430
+#: locale/ipp-strings.c:2432
 msgid "output-bin.stacker-1"
 msgstr ""
 
 #. TRANSLATORS: Stacker 10
-#: locale/ipp-strings.c:2432
+#: locale/ipp-strings.c:2434
 msgid "output-bin.stacker-10"
 msgstr ""
 
 #. TRANSLATORS: Stacker 2
-#: locale/ipp-strings.c:2434
+#: locale/ipp-strings.c:2436
 msgid "output-bin.stacker-2"
 msgstr ""
 
 #. TRANSLATORS: Stacker 3
-#: locale/ipp-strings.c:2436
+#: locale/ipp-strings.c:2438
 msgid "output-bin.stacker-3"
 msgstr ""
 
 #. TRANSLATORS: Stacker 4
-#: locale/ipp-strings.c:2438
+#: locale/ipp-strings.c:2440
 msgid "output-bin.stacker-4"
 msgstr ""
 
 #. TRANSLATORS: Stacker 5
-#: locale/ipp-strings.c:2440
+#: locale/ipp-strings.c:2442
 msgid "output-bin.stacker-5"
 msgstr ""
 
 #. TRANSLATORS: Stacker 6
-#: locale/ipp-strings.c:2442
+#: locale/ipp-strings.c:2444
 msgid "output-bin.stacker-6"
 msgstr ""
 
 #. TRANSLATORS: Stacker 7
-#: locale/ipp-strings.c:2444
+#: locale/ipp-strings.c:2446
 msgid "output-bin.stacker-7"
 msgstr ""
 
 #. TRANSLATORS: Stacker 8
-#: locale/ipp-strings.c:2446
+#: locale/ipp-strings.c:2448
 msgid "output-bin.stacker-8"
 msgstr ""
 
 #. TRANSLATORS: Stacker 9
-#: locale/ipp-strings.c:2448
+#: locale/ipp-strings.c:2450
 msgid "output-bin.stacker-9"
 msgstr ""
 
 #. TRANSLATORS: Top
-#: locale/ipp-strings.c:2450
+#: locale/ipp-strings.c:2452
 msgid "output-bin.top"
 msgstr ""
 
 #. TRANSLATORS: Tray 1
-#: locale/ipp-strings.c:2452
+#: locale/ipp-strings.c:2454
 msgid "output-bin.tray-1"
 msgstr ""
 
 #. TRANSLATORS: Tray 10
-#: locale/ipp-strings.c:2454
+#: locale/ipp-strings.c:2456
 msgid "output-bin.tray-10"
 msgstr ""
 
 #. TRANSLATORS: Tray 2
-#: locale/ipp-strings.c:2456
+#: locale/ipp-strings.c:2458
 msgid "output-bin.tray-2"
 msgstr ""
 
 #. TRANSLATORS: Tray 3
-#: locale/ipp-strings.c:2458
+#: locale/ipp-strings.c:2460
 msgid "output-bin.tray-3"
 msgstr ""
 
 #. TRANSLATORS: Tray 4
-#: locale/ipp-strings.c:2460
+#: locale/ipp-strings.c:2462
 msgid "output-bin.tray-4"
 msgstr ""
 
 #. TRANSLATORS: Tray 5
-#: locale/ipp-strings.c:2462
+#: locale/ipp-strings.c:2464
 msgid "output-bin.tray-5"
 msgstr ""
 
 #. TRANSLATORS: Tray 6
-#: locale/ipp-strings.c:2464
+#: locale/ipp-strings.c:2466
 msgid "output-bin.tray-6"
 msgstr ""
 
 #. TRANSLATORS: Tray 7
-#: locale/ipp-strings.c:2466
+#: locale/ipp-strings.c:2468
 msgid "output-bin.tray-7"
 msgstr ""
 
 #. TRANSLATORS: Tray 8
-#: locale/ipp-strings.c:2468
+#: locale/ipp-strings.c:2470
 msgid "output-bin.tray-8"
 msgstr ""
 
 #. TRANSLATORS: Tray 9
-#: locale/ipp-strings.c:2470
+#: locale/ipp-strings.c:2472
 msgid "output-bin.tray-9"
 msgstr ""
 
 #. TRANSLATORS: Scanned Image Quality
-#: locale/ipp-strings.c:2472
+#: locale/ipp-strings.c:2474
 msgid "output-compression-quality-factor"
 msgstr ""
 
 #. TRANSLATORS: Page Delivery
-#: locale/ipp-strings.c:2474
+#: locale/ipp-strings.c:2476
 msgid "page-delivery"
 msgstr ""
 
 #. TRANSLATORS: Reverse Order Face-down
-#: locale/ipp-strings.c:2476
+#: locale/ipp-strings.c:2478
 msgid "page-delivery.reverse-order-face-down"
 msgstr ""
 
 #. TRANSLATORS: Reverse Order Face-up
-#: locale/ipp-strings.c:2478
+#: locale/ipp-strings.c:2480
 msgid "page-delivery.reverse-order-face-up"
 msgstr ""
 
 #. TRANSLATORS: Same Order Face-down
-#: locale/ipp-strings.c:2480
+#: locale/ipp-strings.c:2482
 msgid "page-delivery.same-order-face-down"
 msgstr ""
 
 #. TRANSLATORS: Same Order Face-up
-#: locale/ipp-strings.c:2482
+#: locale/ipp-strings.c:2484
 msgid "page-delivery.same-order-face-up"
 msgstr ""
 
 #. TRANSLATORS: System Specified
-#: locale/ipp-strings.c:2484
+#: locale/ipp-strings.c:2486
 msgid "page-delivery.system-specified"
 msgstr ""
 
 #. TRANSLATORS: Page Order Received
-#: locale/ipp-strings.c:2486
+#: locale/ipp-strings.c:2488
 msgid "page-order-received"
 msgstr ""
 
 #. TRANSLATORS: 1 To N
-#: locale/ipp-strings.c:2488
+#: locale/ipp-strings.c:2490
 msgid "page-order-received.1-to-n-order"
 msgstr ""
 
 #. TRANSLATORS: N To 1
-#: locale/ipp-strings.c:2490
+#: locale/ipp-strings.c:2492
 msgid "page-order-received.n-to-1-order"
 msgstr ""
 
 #. TRANSLATORS: Page Ranges
-#: locale/ipp-strings.c:2492
+#: locale/ipp-strings.c:2494
 msgid "page-ranges"
 msgstr ""
 
 #. TRANSLATORS: Pages
-#: locale/ipp-strings.c:2494
+#: locale/ipp-strings.c:2496
 msgid "pages"
 msgstr ""
 
 #. TRANSLATORS: Pages Per Subset
-#: locale/ipp-strings.c:2496
+#: locale/ipp-strings.c:2498
 msgid "pages-per-subset"
 msgstr ""
 
 #. TRANSLATORS: Pclm Raster Back Side
-#: locale/ipp-strings.c:2498
+#: locale/ipp-strings.c:2500
 msgid "pclm-raster-back-side"
 msgstr ""
 
 #. TRANSLATORS: Flipped
-#: locale/ipp-strings.c:2500
+#: locale/ipp-strings.c:2502
 msgid "pclm-raster-back-side.flipped"
 msgstr ""
 
 #. TRANSLATORS: Normal
-#: locale/ipp-strings.c:2502
+#: locale/ipp-strings.c:2504
 msgid "pclm-raster-back-side.normal"
 msgstr ""
 
 #. TRANSLATORS: Rotated
-#: locale/ipp-strings.c:2504
+#: locale/ipp-strings.c:2506
 msgid "pclm-raster-back-side.rotated"
 msgstr ""
 
 #. TRANSLATORS: Pclm Source Resolution
-#: locale/ipp-strings.c:2506
+#: locale/ipp-strings.c:2508
 msgid "pclm-source-resolution"
 msgstr ""
 
@@ -13576,27 +13581,27 @@ msgid "pending"
 msgstr ""
 
 #. TRANSLATORS: Platform Shape
-#: locale/ipp-strings.c:2508
+#: locale/ipp-strings.c:2510
 msgid "platform-shape"
 msgstr ""
 
 #. TRANSLATORS: Round
-#: locale/ipp-strings.c:2510
+#: locale/ipp-strings.c:2512
 msgid "platform-shape.ellipse"
 msgstr ""
 
 #. TRANSLATORS: Rectangle
-#: locale/ipp-strings.c:2512
+#: locale/ipp-strings.c:2514
 msgid "platform-shape.rectangle"
 msgstr ""
 
 #. TRANSLATORS: Platform Temperature
-#: locale/ipp-strings.c:2514
+#: locale/ipp-strings.c:2516
 msgid "platform-temperature"
 msgstr ""
 
 #. TRANSLATORS: Post-dial String
-#: locale/ipp-strings.c:2516
+#: locale/ipp-strings.c:2518
 msgid "post-dial-string"
 msgstr ""
 
@@ -14074,297 +14079,297 @@ msgid "ppdmerge: Unable to backup %s to %s - %s"
 msgstr ""
 
 #. TRANSLATORS: Pre-dial String
-#: locale/ipp-strings.c:2518
+#: locale/ipp-strings.c:2520
 msgid "pre-dial-string"
 msgstr ""
 
 #. TRANSLATORS: Number-Up Layout
-#: locale/ipp-strings.c:2520
+#: locale/ipp-strings.c:2522
 msgid "presentation-direction-number-up"
 msgstr ""
 
 #. TRANSLATORS: Top-bottom, Right-left
-#: locale/ipp-strings.c:2522
+#: locale/ipp-strings.c:2524
 msgid "presentation-direction-number-up.tobottom-toleft"
 msgstr ""
 
 #. TRANSLATORS: Top-bottom, Left-right
-#: locale/ipp-strings.c:2524
+#: locale/ipp-strings.c:2526
 msgid "presentation-direction-number-up.tobottom-toright"
 msgstr ""
 
 #. TRANSLATORS: Right-left, Top-bottom
-#: locale/ipp-strings.c:2526
+#: locale/ipp-strings.c:2528
 msgid "presentation-direction-number-up.toleft-tobottom"
 msgstr ""
 
 #. TRANSLATORS: Right-left, Bottom-top
-#: locale/ipp-strings.c:2528
+#: locale/ipp-strings.c:2530
 msgid "presentation-direction-number-up.toleft-totop"
 msgstr ""
 
 #. TRANSLATORS: Left-right, Top-bottom
-#: locale/ipp-strings.c:2530
+#: locale/ipp-strings.c:2532
 msgid "presentation-direction-number-up.toright-tobottom"
 msgstr ""
 
 #. TRANSLATORS: Left-right, Bottom-top
-#: locale/ipp-strings.c:2532
+#: locale/ipp-strings.c:2534
 msgid "presentation-direction-number-up.toright-totop"
 msgstr ""
 
 #. TRANSLATORS: Bottom-top, Right-left
-#: locale/ipp-strings.c:2534
+#: locale/ipp-strings.c:2536
 msgid "presentation-direction-number-up.totop-toleft"
 msgstr ""
 
 #. TRANSLATORS: Bottom-top, Left-right
-#: locale/ipp-strings.c:2536
+#: locale/ipp-strings.c:2538
 msgid "presentation-direction-number-up.totop-toright"
 msgstr ""
 
 #. TRANSLATORS: Print Accuracy
-#: locale/ipp-strings.c:2538
+#: locale/ipp-strings.c:2540
 msgid "print-accuracy"
 msgstr ""
 
 #. TRANSLATORS: Print Base
-#: locale/ipp-strings.c:2540
+#: locale/ipp-strings.c:2542
 msgid "print-base"
 msgstr ""
 
 #. TRANSLATORS: Print Base Actual
-#: locale/ipp-strings.c:2542
+#: locale/ipp-strings.c:2544
 msgid "print-base-actual"
 msgstr ""
 
 #. TRANSLATORS: Brim
-#: locale/ipp-strings.c:2544
+#: locale/ipp-strings.c:2546
 msgid "print-base.brim"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:2546
+#: locale/ipp-strings.c:2548
 msgid "print-base.none"
 msgstr ""
 
 #. TRANSLATORS: Raft
-#: locale/ipp-strings.c:2548
+#: locale/ipp-strings.c:2550
 msgid "print-base.raft"
 msgstr ""
 
 #. TRANSLATORS: Skirt
-#: locale/ipp-strings.c:2550
+#: locale/ipp-strings.c:2552
 msgid "print-base.skirt"
 msgstr ""
 
 #. TRANSLATORS: Standard
-#: locale/ipp-strings.c:2552
+#: locale/ipp-strings.c:2554
 msgid "print-base.standard"
 msgstr ""
 
 #. TRANSLATORS: Print Color Mode
-#: locale/ipp-strings.c:2554
+#: locale/ipp-strings.c:2556
 msgid "print-color-mode"
 msgstr ""
 
 #. TRANSLATORS: Automatic
-#: locale/ipp-strings.c:2556
+#: locale/ipp-strings.c:2558
 msgid "print-color-mode.auto"
 msgstr ""
 
 #. TRANSLATORS: Auto Monochrome
-#: locale/ipp-strings.c:2558
+#: locale/ipp-strings.c:2560
 msgid "print-color-mode.auto-monochrome"
 msgstr ""
 
 #. TRANSLATORS: Text
-#: locale/ipp-strings.c:2560
+#: locale/ipp-strings.c:2562
 msgid "print-color-mode.bi-level"
 msgstr ""
 
 #. TRANSLATORS: Color
-#: locale/ipp-strings.c:2562
+#: locale/ipp-strings.c:2564
 msgid "print-color-mode.color"
 msgstr ""
 
 #. TRANSLATORS: Highlight
-#: locale/ipp-strings.c:2564
+#: locale/ipp-strings.c:2566
 msgid "print-color-mode.highlight"
 msgstr ""
 
 #. TRANSLATORS: Monochrome
-#: locale/ipp-strings.c:2566
+#: locale/ipp-strings.c:2568
 msgid "print-color-mode.monochrome"
 msgstr ""
 
 #. TRANSLATORS: Process Text
-#: locale/ipp-strings.c:2568
+#: locale/ipp-strings.c:2570
 msgid "print-color-mode.process-bi-level"
 msgstr ""
 
 #. TRANSLATORS: Process Monochrome
-#: locale/ipp-strings.c:2570
+#: locale/ipp-strings.c:2572
 msgid "print-color-mode.process-monochrome"
 msgstr ""
 
 #. TRANSLATORS: Print Optimization
-#: locale/ipp-strings.c:2572
+#: locale/ipp-strings.c:2574
 msgid "print-content-optimize"
 msgstr ""
 
 #. TRANSLATORS: Print Content Optimize Actual
-#: locale/ipp-strings.c:2574
+#: locale/ipp-strings.c:2576
 msgid "print-content-optimize-actual"
 msgstr ""
 
 #. TRANSLATORS: Automatic
-#: locale/ipp-strings.c:2576
+#: locale/ipp-strings.c:2578
 msgid "print-content-optimize.auto"
 msgstr ""
 
 #. TRANSLATORS: Graphics
-#: locale/ipp-strings.c:2578
+#: locale/ipp-strings.c:2580
 msgid "print-content-optimize.graphic"
 msgstr ""
 
 #. TRANSLATORS: Graphics
-#: locale/ipp-strings.c:2580
+#: locale/ipp-strings.c:2582
 msgid "print-content-optimize.graphics"
 msgstr ""
 
 #. TRANSLATORS: Photo
-#: locale/ipp-strings.c:2582
+#: locale/ipp-strings.c:2584
 msgid "print-content-optimize.photo"
 msgstr ""
 
 #. TRANSLATORS: Text
-#: locale/ipp-strings.c:2584
+#: locale/ipp-strings.c:2586
 msgid "print-content-optimize.text"
 msgstr ""
 
 #. TRANSLATORS: Text and Graphics
-#: locale/ipp-strings.c:2586
+#: locale/ipp-strings.c:2588
 msgid "print-content-optimize.text-and-graphic"
 msgstr ""
 
 #. TRANSLATORS: Text And Graphics
-#: locale/ipp-strings.c:2588
+#: locale/ipp-strings.c:2590
 msgid "print-content-optimize.text-and-graphics"
 msgstr ""
 
 #. TRANSLATORS: Print Objects
-#: locale/ipp-strings.c:2590
+#: locale/ipp-strings.c:2592
 msgid "print-objects"
 msgstr ""
 
 #. TRANSLATORS: Print Quality
-#: locale/ipp-strings.c:2592
+#: locale/ipp-strings.c:2594
 msgid "print-quality"
 msgstr ""
 
 #. TRANSLATORS: Draft
-#: locale/ipp-strings.c:2594
+#: locale/ipp-strings.c:2596
 msgid "print-quality.3"
 msgstr ""
 
 #. TRANSLATORS: Normal
-#: locale/ipp-strings.c:2596
+#: locale/ipp-strings.c:2598
 msgid "print-quality.4"
 msgstr ""
 
 #. TRANSLATORS: High
-#: locale/ipp-strings.c:2598
+#: locale/ipp-strings.c:2600
 msgid "print-quality.5"
 msgstr ""
 
 #. TRANSLATORS: Print Rendering Intent
-#: locale/ipp-strings.c:2600
+#: locale/ipp-strings.c:2602
 msgid "print-rendering-intent"
 msgstr ""
 
 #. TRANSLATORS: Absolute
-#: locale/ipp-strings.c:2602
+#: locale/ipp-strings.c:2604
 msgid "print-rendering-intent.absolute"
 msgstr ""
 
 #. TRANSLATORS: Automatic
-#: locale/ipp-strings.c:2604
+#: locale/ipp-strings.c:2606
 msgid "print-rendering-intent.auto"
 msgstr ""
 
 #. TRANSLATORS: Perceptual
-#: locale/ipp-strings.c:2606
+#: locale/ipp-strings.c:2608
 msgid "print-rendering-intent.perceptual"
 msgstr ""
 
 #. TRANSLATORS: Relative
-#: locale/ipp-strings.c:2608
+#: locale/ipp-strings.c:2610
 msgid "print-rendering-intent.relative"
 msgstr ""
 
 #. TRANSLATORS: Relative w/Black Point Compensation
-#: locale/ipp-strings.c:2610
+#: locale/ipp-strings.c:2612
 msgid "print-rendering-intent.relative-bpc"
 msgstr ""
 
 #. TRANSLATORS: Saturation
-#: locale/ipp-strings.c:2612
+#: locale/ipp-strings.c:2614
 msgid "print-rendering-intent.saturation"
 msgstr ""
 
 #. TRANSLATORS: Print Scaling
-#: locale/ipp-strings.c:2614
+#: locale/ipp-strings.c:2616
 msgid "print-scaling"
 msgstr ""
 
 #. TRANSLATORS: Automatic
-#: locale/ipp-strings.c:2616
+#: locale/ipp-strings.c:2618
 msgid "print-scaling.auto"
 msgstr ""
 
 #. TRANSLATORS: Auto-fit
-#: locale/ipp-strings.c:2618
+#: locale/ipp-strings.c:2620
 msgid "print-scaling.auto-fit"
 msgstr ""
 
 #. TRANSLATORS: Fill
-#: locale/ipp-strings.c:2620
+#: locale/ipp-strings.c:2622
 msgid "print-scaling.fill"
 msgstr ""
 
 #. TRANSLATORS: Fit
-#: locale/ipp-strings.c:2622
+#: locale/ipp-strings.c:2624
 msgid "print-scaling.fit"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:2624
+#: locale/ipp-strings.c:2626
 msgid "print-scaling.none"
 msgstr ""
 
 #. TRANSLATORS: Print Supports
-#: locale/ipp-strings.c:2626
+#: locale/ipp-strings.c:2628
 msgid "print-supports"
 msgstr ""
 
 #. TRANSLATORS: Print Supports Actual
-#: locale/ipp-strings.c:2628
+#: locale/ipp-strings.c:2630
 msgid "print-supports-actual"
 msgstr ""
 
 #. TRANSLATORS: With Specified Material
-#: locale/ipp-strings.c:2630
+#: locale/ipp-strings.c:2632
 msgid "print-supports.material"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:2632
+#: locale/ipp-strings.c:2634
 msgid "print-supports.none"
 msgstr ""
 
 #. TRANSLATORS: Standard
-#: locale/ipp-strings.c:2634
+#: locale/ipp-strings.c:2636
 msgid "print-supports.standard"
 msgstr ""
 
@@ -14404,4067 +14409,4067 @@ msgid "printer %s/%s now printing %s-%d.  enabled since %s"
 msgstr ""
 
 #. TRANSLATORS: Printer Kind
-#: locale/ipp-strings.c:2636
+#: locale/ipp-strings.c:2638
 msgid "printer-kind"
 msgstr ""
 
 #. TRANSLATORS: Disc
-#: locale/ipp-strings.c:2638
+#: locale/ipp-strings.c:2640
 msgid "printer-kind.disc"
 msgstr ""
 
 #. TRANSLATORS: Document
-#: locale/ipp-strings.c:2640
+#: locale/ipp-strings.c:2642
 msgid "printer-kind.document"
 msgstr ""
 
 #. TRANSLATORS: Envelope
-#: locale/ipp-strings.c:2642
+#: locale/ipp-strings.c:2644
 msgid "printer-kind.envelope"
 msgstr ""
 
 #. TRANSLATORS: Label
-#: locale/ipp-strings.c:2644
+#: locale/ipp-strings.c:2646
 msgid "printer-kind.label"
 msgstr ""
 
 #. TRANSLATORS: Large Format
-#: locale/ipp-strings.c:2646
+#: locale/ipp-strings.c:2648
 msgid "printer-kind.large-format"
 msgstr ""
 
 #. TRANSLATORS: Photo
-#: locale/ipp-strings.c:2648
+#: locale/ipp-strings.c:2650
 msgid "printer-kind.photo"
 msgstr ""
 
 #. TRANSLATORS: Postcard
-#: locale/ipp-strings.c:2650
+#: locale/ipp-strings.c:2652
 msgid "printer-kind.postcard"
 msgstr ""
 
 #. TRANSLATORS: Receipt
-#: locale/ipp-strings.c:2652
+#: locale/ipp-strings.c:2654
 msgid "printer-kind.receipt"
 msgstr ""
 
 #. TRANSLATORS: Roll
-#: locale/ipp-strings.c:2654
+#: locale/ipp-strings.c:2656
 msgid "printer-kind.roll"
 msgstr ""
 
 #. TRANSLATORS: Message From Operator
-#: locale/ipp-strings.c:2656
+#: locale/ipp-strings.c:2658
 msgid "printer-message-from-operator"
 msgstr ""
 
 #. TRANSLATORS: Print Resolution
-#: locale/ipp-strings.c:2658
+#: locale/ipp-strings.c:2660
 msgid "printer-resolution"
 msgstr ""
 
 #. TRANSLATORS: Printer State
-#: locale/ipp-strings.c:2660
+#: locale/ipp-strings.c:2662
 msgid "printer-state"
 msgstr ""
 
 #. TRANSLATORS: Detailed Printer State
-#: locale/ipp-strings.c:2662
+#: locale/ipp-strings.c:2664
 msgid "printer-state-reasons"
 msgstr ""
 
 #. TRANSLATORS: Old Alerts Have Been Removed
-#: locale/ipp-strings.c:2664
+#: locale/ipp-strings.c:2666
 msgid "printer-state-reasons.alert-removal-of-binary-change-entry"
 msgstr ""
 
 #. TRANSLATORS: Bander Added
-#: locale/ipp-strings.c:2666
+#: locale/ipp-strings.c:2668
 msgid "printer-state-reasons.bander-added"
 msgstr ""
 
 #. TRANSLATORS: Bander Almost Empty
-#: locale/ipp-strings.c:2668
+#: locale/ipp-strings.c:2670
 msgid "printer-state-reasons.bander-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Bander Almost Full
-#: locale/ipp-strings.c:2670
+#: locale/ipp-strings.c:2672
 msgid "printer-state-reasons.bander-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Bander At Limit
-#: locale/ipp-strings.c:2672
+#: locale/ipp-strings.c:2674
 msgid "printer-state-reasons.bander-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Bander Closed
-#: locale/ipp-strings.c:2674
+#: locale/ipp-strings.c:2676
 msgid "printer-state-reasons.bander-closed"
 msgstr ""
 
 #. TRANSLATORS: Bander Configuration Change
-#: locale/ipp-strings.c:2676
+#: locale/ipp-strings.c:2678
 msgid "printer-state-reasons.bander-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Bander Cover Closed
-#: locale/ipp-strings.c:2678
+#: locale/ipp-strings.c:2680
 msgid "printer-state-reasons.bander-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Bander Cover Open
-#: locale/ipp-strings.c:2680
+#: locale/ipp-strings.c:2682
 msgid "printer-state-reasons.bander-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Bander Empty
-#: locale/ipp-strings.c:2682
+#: locale/ipp-strings.c:2684
 msgid "printer-state-reasons.bander-empty"
 msgstr ""
 
 #. TRANSLATORS: Bander Full
-#: locale/ipp-strings.c:2684
+#: locale/ipp-strings.c:2686
 msgid "printer-state-reasons.bander-full"
 msgstr ""
 
 #. TRANSLATORS: Bander Interlock Closed
-#: locale/ipp-strings.c:2686
+#: locale/ipp-strings.c:2688
 msgid "printer-state-reasons.bander-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Bander Interlock Open
-#: locale/ipp-strings.c:2688
+#: locale/ipp-strings.c:2690
 msgid "printer-state-reasons.bander-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Bander Jam
-#: locale/ipp-strings.c:2690
+#: locale/ipp-strings.c:2692
 msgid "printer-state-reasons.bander-jam"
 msgstr ""
 
 #. TRANSLATORS: Bander Life Almost Over
-#: locale/ipp-strings.c:2692
+#: locale/ipp-strings.c:2694
 msgid "printer-state-reasons.bander-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Bander Life Over
-#: locale/ipp-strings.c:2694
+#: locale/ipp-strings.c:2696
 msgid "printer-state-reasons.bander-life-over"
 msgstr ""
 
 #. TRANSLATORS: Bander Memory Exhausted
-#: locale/ipp-strings.c:2696
+#: locale/ipp-strings.c:2698
 msgid "printer-state-reasons.bander-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Bander Missing
-#: locale/ipp-strings.c:2698
+#: locale/ipp-strings.c:2700
 msgid "printer-state-reasons.bander-missing"
 msgstr ""
 
 #. TRANSLATORS: Bander Motor Failure
-#: locale/ipp-strings.c:2700
+#: locale/ipp-strings.c:2702
 msgid "printer-state-reasons.bander-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Bander Near Limit
-#: locale/ipp-strings.c:2702
+#: locale/ipp-strings.c:2704
 msgid "printer-state-reasons.bander-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Bander Offline
-#: locale/ipp-strings.c:2704
+#: locale/ipp-strings.c:2706
 msgid "printer-state-reasons.bander-offline"
 msgstr ""
 
 #. TRANSLATORS: Bander Opened
-#: locale/ipp-strings.c:2706
+#: locale/ipp-strings.c:2708
 msgid "printer-state-reasons.bander-opened"
 msgstr ""
 
 #. TRANSLATORS: Bander Over Temperature
-#: locale/ipp-strings.c:2708
+#: locale/ipp-strings.c:2710
 msgid "printer-state-reasons.bander-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Bander Power Saver
-#: locale/ipp-strings.c:2710
+#: locale/ipp-strings.c:2712
 msgid "printer-state-reasons.bander-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Bander Recoverable Failure
-#: locale/ipp-strings.c:2712
+#: locale/ipp-strings.c:2714
 msgid "printer-state-reasons.bander-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Bander Recoverable Storage
-#: locale/ipp-strings.c:2714
+#: locale/ipp-strings.c:2716
 msgid "printer-state-reasons.bander-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Bander Removed
-#: locale/ipp-strings.c:2716
+#: locale/ipp-strings.c:2718
 msgid "printer-state-reasons.bander-removed"
 msgstr ""
 
 #. TRANSLATORS: Bander Resource Added
-#: locale/ipp-strings.c:2718
+#: locale/ipp-strings.c:2720
 msgid "printer-state-reasons.bander-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Bander Resource Removed
-#: locale/ipp-strings.c:2720
+#: locale/ipp-strings.c:2722
 msgid "printer-state-reasons.bander-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Bander Thermistor Failure
-#: locale/ipp-strings.c:2722
+#: locale/ipp-strings.c:2724
 msgid "printer-state-reasons.bander-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Bander Timing Failure
-#: locale/ipp-strings.c:2724
+#: locale/ipp-strings.c:2726
 msgid "printer-state-reasons.bander-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Bander Turned Off
-#: locale/ipp-strings.c:2726
+#: locale/ipp-strings.c:2728
 msgid "printer-state-reasons.bander-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Bander Turned On
-#: locale/ipp-strings.c:2728
+#: locale/ipp-strings.c:2730
 msgid "printer-state-reasons.bander-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Bander Under Temperature
-#: locale/ipp-strings.c:2730
+#: locale/ipp-strings.c:2732
 msgid "printer-state-reasons.bander-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Bander Unrecoverable Failure
-#: locale/ipp-strings.c:2732
+#: locale/ipp-strings.c:2734
 msgid "printer-state-reasons.bander-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Bander Unrecoverable Storage Error
-#: locale/ipp-strings.c:2734
+#: locale/ipp-strings.c:2736
 msgid "printer-state-reasons.bander-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Bander Warming Up
-#: locale/ipp-strings.c:2736
+#: locale/ipp-strings.c:2738
 msgid "printer-state-reasons.bander-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Binder Added
-#: locale/ipp-strings.c:2738
+#: locale/ipp-strings.c:2740
 msgid "printer-state-reasons.binder-added"
 msgstr ""
 
 #. TRANSLATORS: Binder Almost Empty
-#: locale/ipp-strings.c:2740
+#: locale/ipp-strings.c:2742
 msgid "printer-state-reasons.binder-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Binder Almost Full
-#: locale/ipp-strings.c:2742
+#: locale/ipp-strings.c:2744
 msgid "printer-state-reasons.binder-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Binder At Limit
-#: locale/ipp-strings.c:2744
+#: locale/ipp-strings.c:2746
 msgid "printer-state-reasons.binder-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Binder Closed
-#: locale/ipp-strings.c:2746
+#: locale/ipp-strings.c:2748
 msgid "printer-state-reasons.binder-closed"
 msgstr ""
 
 #. TRANSLATORS: Binder Configuration Change
-#: locale/ipp-strings.c:2748
+#: locale/ipp-strings.c:2750
 msgid "printer-state-reasons.binder-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Binder Cover Closed
-#: locale/ipp-strings.c:2750
+#: locale/ipp-strings.c:2752
 msgid "printer-state-reasons.binder-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Binder Cover Open
-#: locale/ipp-strings.c:2752
+#: locale/ipp-strings.c:2754
 msgid "printer-state-reasons.binder-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Binder Empty
-#: locale/ipp-strings.c:2754
+#: locale/ipp-strings.c:2756
 msgid "printer-state-reasons.binder-empty"
 msgstr ""
 
 #. TRANSLATORS: Binder Full
-#: locale/ipp-strings.c:2756
+#: locale/ipp-strings.c:2758
 msgid "printer-state-reasons.binder-full"
 msgstr ""
 
 #. TRANSLATORS: Binder Interlock Closed
-#: locale/ipp-strings.c:2758
+#: locale/ipp-strings.c:2760
 msgid "printer-state-reasons.binder-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Binder Interlock Open
-#: locale/ipp-strings.c:2760
+#: locale/ipp-strings.c:2762
 msgid "printer-state-reasons.binder-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Binder Jam
-#: locale/ipp-strings.c:2762
+#: locale/ipp-strings.c:2764
 msgid "printer-state-reasons.binder-jam"
 msgstr ""
 
 #. TRANSLATORS: Binder Life Almost Over
-#: locale/ipp-strings.c:2764
+#: locale/ipp-strings.c:2766
 msgid "printer-state-reasons.binder-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Binder Life Over
-#: locale/ipp-strings.c:2766
+#: locale/ipp-strings.c:2768
 msgid "printer-state-reasons.binder-life-over"
 msgstr ""
 
 #. TRANSLATORS: Binder Memory Exhausted
-#: locale/ipp-strings.c:2768
+#: locale/ipp-strings.c:2770
 msgid "printer-state-reasons.binder-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Binder Missing
-#: locale/ipp-strings.c:2770
+#: locale/ipp-strings.c:2772
 msgid "printer-state-reasons.binder-missing"
 msgstr ""
 
 #. TRANSLATORS: Binder Motor Failure
-#: locale/ipp-strings.c:2772
+#: locale/ipp-strings.c:2774
 msgid "printer-state-reasons.binder-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Binder Near Limit
-#: locale/ipp-strings.c:2774
+#: locale/ipp-strings.c:2776
 msgid "printer-state-reasons.binder-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Binder Offline
-#: locale/ipp-strings.c:2776
+#: locale/ipp-strings.c:2778
 msgid "printer-state-reasons.binder-offline"
 msgstr ""
 
 #. TRANSLATORS: Binder Opened
-#: locale/ipp-strings.c:2778
+#: locale/ipp-strings.c:2780
 msgid "printer-state-reasons.binder-opened"
 msgstr ""
 
 #. TRANSLATORS: Binder Over Temperature
-#: locale/ipp-strings.c:2780
+#: locale/ipp-strings.c:2782
 msgid "printer-state-reasons.binder-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Binder Power Saver
-#: locale/ipp-strings.c:2782
+#: locale/ipp-strings.c:2784
 msgid "printer-state-reasons.binder-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Binder Recoverable Failure
-#: locale/ipp-strings.c:2784
+#: locale/ipp-strings.c:2786
 msgid "printer-state-reasons.binder-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Binder Recoverable Storage
-#: locale/ipp-strings.c:2786
+#: locale/ipp-strings.c:2788
 msgid "printer-state-reasons.binder-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Binder Removed
-#: locale/ipp-strings.c:2788
+#: locale/ipp-strings.c:2790
 msgid "printer-state-reasons.binder-removed"
 msgstr ""
 
 #. TRANSLATORS: Binder Resource Added
-#: locale/ipp-strings.c:2790
+#: locale/ipp-strings.c:2792
 msgid "printer-state-reasons.binder-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Binder Resource Removed
-#: locale/ipp-strings.c:2792
+#: locale/ipp-strings.c:2794
 msgid "printer-state-reasons.binder-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Binder Thermistor Failure
-#: locale/ipp-strings.c:2794
+#: locale/ipp-strings.c:2796
 msgid "printer-state-reasons.binder-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Binder Timing Failure
-#: locale/ipp-strings.c:2796
+#: locale/ipp-strings.c:2798
 msgid "printer-state-reasons.binder-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Binder Turned Off
-#: locale/ipp-strings.c:2798
+#: locale/ipp-strings.c:2800
 msgid "printer-state-reasons.binder-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Binder Turned On
-#: locale/ipp-strings.c:2800
+#: locale/ipp-strings.c:2802
 msgid "printer-state-reasons.binder-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Binder Under Temperature
-#: locale/ipp-strings.c:2802
+#: locale/ipp-strings.c:2804
 msgid "printer-state-reasons.binder-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Binder Unrecoverable Failure
-#: locale/ipp-strings.c:2804
+#: locale/ipp-strings.c:2806
 msgid "printer-state-reasons.binder-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Binder Unrecoverable Storage Error
-#: locale/ipp-strings.c:2806
+#: locale/ipp-strings.c:2808
 msgid "printer-state-reasons.binder-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Binder Warming Up
-#: locale/ipp-strings.c:2808
+#: locale/ipp-strings.c:2810
 msgid "printer-state-reasons.binder-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Camera Failure
-#: locale/ipp-strings.c:2810
+#: locale/ipp-strings.c:2812
 msgid "printer-state-reasons.camera-failure"
 msgstr ""
 
 #. TRANSLATORS: Chamber Cooling
-#: locale/ipp-strings.c:2812
+#: locale/ipp-strings.c:2814
 msgid "printer-state-reasons.chamber-cooling"
 msgstr ""
 
 #. TRANSLATORS: Chamber Failure
-#: locale/ipp-strings.c:2814
+#: locale/ipp-strings.c:2816
 msgid "printer-state-reasons.chamber-failure"
 msgstr ""
 
 #. TRANSLATORS: Chamber Heating
-#: locale/ipp-strings.c:2816
+#: locale/ipp-strings.c:2818
 msgid "printer-state-reasons.chamber-heating"
 msgstr ""
 
 #. TRANSLATORS: Chamber Temperature High
-#: locale/ipp-strings.c:2818
+#: locale/ipp-strings.c:2820
 msgid "printer-state-reasons.chamber-temperature-high"
 msgstr ""
 
 #. TRANSLATORS: Chamber Temperature Low
-#: locale/ipp-strings.c:2820
+#: locale/ipp-strings.c:2822
 msgid "printer-state-reasons.chamber-temperature-low"
 msgstr ""
 
 #. TRANSLATORS: Cleaner Life Almost Over
-#: locale/ipp-strings.c:2822
+#: locale/ipp-strings.c:2824
 msgid "printer-state-reasons.cleaner-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Cleaner Life Over
-#: locale/ipp-strings.c:2824
+#: locale/ipp-strings.c:2826
 msgid "printer-state-reasons.cleaner-life-over"
 msgstr ""
 
 #. TRANSLATORS: Configuration Change
-#: locale/ipp-strings.c:2826
+#: locale/ipp-strings.c:2828
 msgid "printer-state-reasons.configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Connecting To Device
-#: locale/ipp-strings.c:2828
+#: locale/ipp-strings.c:2830
 msgid "printer-state-reasons.connecting-to-device"
 msgstr ""
 
 #. TRANSLATORS: Cover Open
-#: locale/ipp-strings.c:2830
+#: locale/ipp-strings.c:2832
 msgid "printer-state-reasons.cover-open"
 msgstr ""
 
 #. TRANSLATORS: Deactivated
-#: locale/ipp-strings.c:2832
+#: locale/ipp-strings.c:2834
 msgid "printer-state-reasons.deactivated"
 msgstr ""
 
 #. TRANSLATORS: Developer Empty
-#: locale/ipp-strings.c:2834
+#: locale/ipp-strings.c:2836
 msgid "printer-state-reasons.developer-empty"
 msgstr ""
 
 #. TRANSLATORS: Developer Low
-#: locale/ipp-strings.c:2836
+#: locale/ipp-strings.c:2838
 msgid "printer-state-reasons.developer-low"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Added
-#: locale/ipp-strings.c:2838
+#: locale/ipp-strings.c:2840
 msgid "printer-state-reasons.die-cutter-added"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Almost Empty
-#: locale/ipp-strings.c:2840
+#: locale/ipp-strings.c:2842
 msgid "printer-state-reasons.die-cutter-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Almost Full
-#: locale/ipp-strings.c:2842
+#: locale/ipp-strings.c:2844
 msgid "printer-state-reasons.die-cutter-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter At Limit
-#: locale/ipp-strings.c:2844
+#: locale/ipp-strings.c:2846
 msgid "printer-state-reasons.die-cutter-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Closed
-#: locale/ipp-strings.c:2846
+#: locale/ipp-strings.c:2848
 msgid "printer-state-reasons.die-cutter-closed"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Configuration Change
-#: locale/ipp-strings.c:2848
+#: locale/ipp-strings.c:2850
 msgid "printer-state-reasons.die-cutter-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Cover Closed
-#: locale/ipp-strings.c:2850
+#: locale/ipp-strings.c:2852
 msgid "printer-state-reasons.die-cutter-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Cover Open
-#: locale/ipp-strings.c:2852
+#: locale/ipp-strings.c:2854
 msgid "printer-state-reasons.die-cutter-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Empty
-#: locale/ipp-strings.c:2854
+#: locale/ipp-strings.c:2856
 msgid "printer-state-reasons.die-cutter-empty"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Full
-#: locale/ipp-strings.c:2856
+#: locale/ipp-strings.c:2858
 msgid "printer-state-reasons.die-cutter-full"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Interlock Closed
-#: locale/ipp-strings.c:2858
+#: locale/ipp-strings.c:2860
 msgid "printer-state-reasons.die-cutter-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Interlock Open
-#: locale/ipp-strings.c:2860
+#: locale/ipp-strings.c:2862
 msgid "printer-state-reasons.die-cutter-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Jam
-#: locale/ipp-strings.c:2862
+#: locale/ipp-strings.c:2864
 msgid "printer-state-reasons.die-cutter-jam"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Life Almost Over
-#: locale/ipp-strings.c:2864
+#: locale/ipp-strings.c:2866
 msgid "printer-state-reasons.die-cutter-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Life Over
-#: locale/ipp-strings.c:2866
+#: locale/ipp-strings.c:2868
 msgid "printer-state-reasons.die-cutter-life-over"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Memory Exhausted
-#: locale/ipp-strings.c:2868
+#: locale/ipp-strings.c:2870
 msgid "printer-state-reasons.die-cutter-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Missing
-#: locale/ipp-strings.c:2870
+#: locale/ipp-strings.c:2872
 msgid "printer-state-reasons.die-cutter-missing"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Motor Failure
-#: locale/ipp-strings.c:2872
+#: locale/ipp-strings.c:2874
 msgid "printer-state-reasons.die-cutter-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Near Limit
-#: locale/ipp-strings.c:2874
+#: locale/ipp-strings.c:2876
 msgid "printer-state-reasons.die-cutter-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Offline
-#: locale/ipp-strings.c:2876
+#: locale/ipp-strings.c:2878
 msgid "printer-state-reasons.die-cutter-offline"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Opened
-#: locale/ipp-strings.c:2878
+#: locale/ipp-strings.c:2880
 msgid "printer-state-reasons.die-cutter-opened"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Over Temperature
-#: locale/ipp-strings.c:2880
+#: locale/ipp-strings.c:2882
 msgid "printer-state-reasons.die-cutter-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Power Saver
-#: locale/ipp-strings.c:2882
+#: locale/ipp-strings.c:2884
 msgid "printer-state-reasons.die-cutter-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Recoverable Failure
-#: locale/ipp-strings.c:2884
+#: locale/ipp-strings.c:2886
 msgid "printer-state-reasons.die-cutter-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Recoverable Storage
-#: locale/ipp-strings.c:2886
+#: locale/ipp-strings.c:2888
 msgid "printer-state-reasons.die-cutter-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Removed
-#: locale/ipp-strings.c:2888
+#: locale/ipp-strings.c:2890
 msgid "printer-state-reasons.die-cutter-removed"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Resource Added
-#: locale/ipp-strings.c:2890
+#: locale/ipp-strings.c:2892
 msgid "printer-state-reasons.die-cutter-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Resource Removed
-#: locale/ipp-strings.c:2892
+#: locale/ipp-strings.c:2894
 msgid "printer-state-reasons.die-cutter-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Thermistor Failure
-#: locale/ipp-strings.c:2894
+#: locale/ipp-strings.c:2896
 msgid "printer-state-reasons.die-cutter-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Timing Failure
-#: locale/ipp-strings.c:2896
+#: locale/ipp-strings.c:2898
 msgid "printer-state-reasons.die-cutter-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Turned Off
-#: locale/ipp-strings.c:2898
+#: locale/ipp-strings.c:2900
 msgid "printer-state-reasons.die-cutter-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Turned On
-#: locale/ipp-strings.c:2900
+#: locale/ipp-strings.c:2902
 msgid "printer-state-reasons.die-cutter-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Under Temperature
-#: locale/ipp-strings.c:2902
+#: locale/ipp-strings.c:2904
 msgid "printer-state-reasons.die-cutter-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Unrecoverable Failure
-#: locale/ipp-strings.c:2904
+#: locale/ipp-strings.c:2906
 msgid "printer-state-reasons.die-cutter-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Unrecoverable Storage Error
-#: locale/ipp-strings.c:2906
+#: locale/ipp-strings.c:2908
 msgid "printer-state-reasons.die-cutter-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Die Cutter Warming Up
-#: locale/ipp-strings.c:2908
+#: locale/ipp-strings.c:2910
 msgid "printer-state-reasons.die-cutter-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Door Open
-#: locale/ipp-strings.c:2910
+#: locale/ipp-strings.c:2912
 msgid "printer-state-reasons.door-open"
 msgstr ""
 
 #. TRANSLATORS: Extruder Cooling
-#: locale/ipp-strings.c:2912
+#: locale/ipp-strings.c:2914
 msgid "printer-state-reasons.extruder-cooling"
 msgstr ""
 
 #. TRANSLATORS: Extruder Failure
-#: locale/ipp-strings.c:2914
+#: locale/ipp-strings.c:2916
 msgid "printer-state-reasons.extruder-failure"
 msgstr ""
 
 #. TRANSLATORS: Extruder Heating
-#: locale/ipp-strings.c:2916
+#: locale/ipp-strings.c:2918
 msgid "printer-state-reasons.extruder-heating"
 msgstr ""
 
 #. TRANSLATORS: Extruder Jam
-#: locale/ipp-strings.c:2918
+#: locale/ipp-strings.c:2920
 msgid "printer-state-reasons.extruder-jam"
 msgstr ""
 
 #. TRANSLATORS: Extruder Temperature High
-#: locale/ipp-strings.c:2920
+#: locale/ipp-strings.c:2922
 msgid "printer-state-reasons.extruder-temperature-high"
 msgstr ""
 
 #. TRANSLATORS: Extruder Temperature Low
-#: locale/ipp-strings.c:2922
+#: locale/ipp-strings.c:2924
 msgid "printer-state-reasons.extruder-temperature-low"
 msgstr ""
 
 #. TRANSLATORS: Fan Failure
-#: locale/ipp-strings.c:2924
+#: locale/ipp-strings.c:2926
 msgid "printer-state-reasons.fan-failure"
 msgstr ""
 
 #. TRANSLATORS: Fax Modem Life Almost Over
-#: locale/ipp-strings.c:2926
+#: locale/ipp-strings.c:2928
 msgid "printer-state-reasons.fax-modem-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Fax Modem Life Over
-#: locale/ipp-strings.c:2928
+#: locale/ipp-strings.c:2930
 msgid "printer-state-reasons.fax-modem-life-over"
 msgstr ""
 
 #. TRANSLATORS: Fax Modem Missing
-#: locale/ipp-strings.c:2930
+#: locale/ipp-strings.c:2932
 msgid "printer-state-reasons.fax-modem-missing"
 msgstr ""
 
 #. TRANSLATORS: Fax Modem Turned Off
-#: locale/ipp-strings.c:2932
+#: locale/ipp-strings.c:2934
 msgid "printer-state-reasons.fax-modem-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Fax Modem Turned On
-#: locale/ipp-strings.c:2934
+#: locale/ipp-strings.c:2936
 msgid "printer-state-reasons.fax-modem-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Folder Added
-#: locale/ipp-strings.c:2936
+#: locale/ipp-strings.c:2938
 msgid "printer-state-reasons.folder-added"
 msgstr ""
 
 #. TRANSLATORS: Folder Almost Empty
-#: locale/ipp-strings.c:2938
+#: locale/ipp-strings.c:2940
 msgid "printer-state-reasons.folder-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Folder Almost Full
-#: locale/ipp-strings.c:2940
+#: locale/ipp-strings.c:2942
 msgid "printer-state-reasons.folder-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Folder At Limit
-#: locale/ipp-strings.c:2942
+#: locale/ipp-strings.c:2944
 msgid "printer-state-reasons.folder-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Folder Closed
-#: locale/ipp-strings.c:2944
+#: locale/ipp-strings.c:2946
 msgid "printer-state-reasons.folder-closed"
 msgstr ""
 
 #. TRANSLATORS: Folder Configuration Change
-#: locale/ipp-strings.c:2946
+#: locale/ipp-strings.c:2948
 msgid "printer-state-reasons.folder-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Folder Cover Closed
-#: locale/ipp-strings.c:2948
+#: locale/ipp-strings.c:2950
 msgid "printer-state-reasons.folder-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Folder Cover Open
-#: locale/ipp-strings.c:2950
+#: locale/ipp-strings.c:2952
 msgid "printer-state-reasons.folder-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Folder Empty
-#: locale/ipp-strings.c:2952
+#: locale/ipp-strings.c:2954
 msgid "printer-state-reasons.folder-empty"
 msgstr ""
 
 #. TRANSLATORS: Folder Full
-#: locale/ipp-strings.c:2954
+#: locale/ipp-strings.c:2956
 msgid "printer-state-reasons.folder-full"
 msgstr ""
 
 #. TRANSLATORS: Folder Interlock Closed
-#: locale/ipp-strings.c:2956
+#: locale/ipp-strings.c:2958
 msgid "printer-state-reasons.folder-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Folder Interlock Open
-#: locale/ipp-strings.c:2958
+#: locale/ipp-strings.c:2960
 msgid "printer-state-reasons.folder-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Folder Jam
-#: locale/ipp-strings.c:2960
+#: locale/ipp-strings.c:2962
 msgid "printer-state-reasons.folder-jam"
 msgstr ""
 
 #. TRANSLATORS: Folder Life Almost Over
-#: locale/ipp-strings.c:2962
+#: locale/ipp-strings.c:2964
 msgid "printer-state-reasons.folder-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Folder Life Over
-#: locale/ipp-strings.c:2964
+#: locale/ipp-strings.c:2966
 msgid "printer-state-reasons.folder-life-over"
 msgstr ""
 
 #. TRANSLATORS: Folder Memory Exhausted
-#: locale/ipp-strings.c:2966
+#: locale/ipp-strings.c:2968
 msgid "printer-state-reasons.folder-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Folder Missing
-#: locale/ipp-strings.c:2968
+#: locale/ipp-strings.c:2970
 msgid "printer-state-reasons.folder-missing"
 msgstr ""
 
 #. TRANSLATORS: Folder Motor Failure
-#: locale/ipp-strings.c:2970
+#: locale/ipp-strings.c:2972
 msgid "printer-state-reasons.folder-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Folder Near Limit
-#: locale/ipp-strings.c:2972
+#: locale/ipp-strings.c:2974
 msgid "printer-state-reasons.folder-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Folder Offline
-#: locale/ipp-strings.c:2974
+#: locale/ipp-strings.c:2976
 msgid "printer-state-reasons.folder-offline"
 msgstr ""
 
 #. TRANSLATORS: Folder Opened
-#: locale/ipp-strings.c:2976
+#: locale/ipp-strings.c:2978
 msgid "printer-state-reasons.folder-opened"
 msgstr ""
 
 #. TRANSLATORS: Folder Over Temperature
-#: locale/ipp-strings.c:2978
+#: locale/ipp-strings.c:2980
 msgid "printer-state-reasons.folder-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Folder Power Saver
-#: locale/ipp-strings.c:2980
+#: locale/ipp-strings.c:2982
 msgid "printer-state-reasons.folder-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Folder Recoverable Failure
-#: locale/ipp-strings.c:2982
+#: locale/ipp-strings.c:2984
 msgid "printer-state-reasons.folder-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Folder Recoverable Storage
-#: locale/ipp-strings.c:2984
+#: locale/ipp-strings.c:2986
 msgid "printer-state-reasons.folder-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Folder Removed
-#: locale/ipp-strings.c:2986
+#: locale/ipp-strings.c:2988
 msgid "printer-state-reasons.folder-removed"
 msgstr ""
 
 #. TRANSLATORS: Folder Resource Added
-#: locale/ipp-strings.c:2988
+#: locale/ipp-strings.c:2990
 msgid "printer-state-reasons.folder-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Folder Resource Removed
-#: locale/ipp-strings.c:2990
+#: locale/ipp-strings.c:2992
 msgid "printer-state-reasons.folder-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Folder Thermistor Failure
-#: locale/ipp-strings.c:2992
+#: locale/ipp-strings.c:2994
 msgid "printer-state-reasons.folder-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Folder Timing Failure
-#: locale/ipp-strings.c:2994
+#: locale/ipp-strings.c:2996
 msgid "printer-state-reasons.folder-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Folder Turned Off
-#: locale/ipp-strings.c:2996
+#: locale/ipp-strings.c:2998
 msgid "printer-state-reasons.folder-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Folder Turned On
-#: locale/ipp-strings.c:2998
+#: locale/ipp-strings.c:3000
 msgid "printer-state-reasons.folder-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Folder Under Temperature
-#: locale/ipp-strings.c:3000
+#: locale/ipp-strings.c:3002
 msgid "printer-state-reasons.folder-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Folder Unrecoverable Failure
-#: locale/ipp-strings.c:3002
+#: locale/ipp-strings.c:3004
 msgid "printer-state-reasons.folder-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Folder Unrecoverable Storage Error
-#: locale/ipp-strings.c:3004
+#: locale/ipp-strings.c:3006
 msgid "printer-state-reasons.folder-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Folder Warming Up
-#: locale/ipp-strings.c:3006
+#: locale/ipp-strings.c:3008
 msgid "printer-state-reasons.folder-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Fuser temperature high
-#: locale/ipp-strings.c:3008
+#: locale/ipp-strings.c:3010
 msgid "printer-state-reasons.fuser-over-temp"
 msgstr ""
 
 #. TRANSLATORS: Fuser temperature low
-#: locale/ipp-strings.c:3010
+#: locale/ipp-strings.c:3012
 msgid "printer-state-reasons.fuser-under-temp"
 msgstr ""
 
 #. TRANSLATORS: Hold New Jobs
-#: locale/ipp-strings.c:3012
+#: locale/ipp-strings.c:3014
 msgid "printer-state-reasons.hold-new-jobs"
 msgstr ""
 
 #. TRANSLATORS: Identify Printer
-#: locale/ipp-strings.c:3014
+#: locale/ipp-strings.c:3016
 msgid "printer-state-reasons.identify-printer-requested"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Added
-#: locale/ipp-strings.c:3016
+#: locale/ipp-strings.c:3018
 msgid "printer-state-reasons.imprinter-added"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Almost Empty
-#: locale/ipp-strings.c:3018
+#: locale/ipp-strings.c:3020
 msgid "printer-state-reasons.imprinter-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Almost Full
-#: locale/ipp-strings.c:3020
+#: locale/ipp-strings.c:3022
 msgid "printer-state-reasons.imprinter-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Imprinter At Limit
-#: locale/ipp-strings.c:3022
+#: locale/ipp-strings.c:3024
 msgid "printer-state-reasons.imprinter-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Closed
-#: locale/ipp-strings.c:3024
+#: locale/ipp-strings.c:3026
 msgid "printer-state-reasons.imprinter-closed"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Configuration Change
-#: locale/ipp-strings.c:3026
+#: locale/ipp-strings.c:3028
 msgid "printer-state-reasons.imprinter-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Cover Closed
-#: locale/ipp-strings.c:3028
+#: locale/ipp-strings.c:3030
 msgid "printer-state-reasons.imprinter-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Cover Open
-#: locale/ipp-strings.c:3030
+#: locale/ipp-strings.c:3032
 msgid "printer-state-reasons.imprinter-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Empty
-#: locale/ipp-strings.c:3032
+#: locale/ipp-strings.c:3034
 msgid "printer-state-reasons.imprinter-empty"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Full
-#: locale/ipp-strings.c:3034
+#: locale/ipp-strings.c:3036
 msgid "printer-state-reasons.imprinter-full"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Interlock Closed
-#: locale/ipp-strings.c:3036
+#: locale/ipp-strings.c:3038
 msgid "printer-state-reasons.imprinter-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Interlock Open
-#: locale/ipp-strings.c:3038
+#: locale/ipp-strings.c:3040
 msgid "printer-state-reasons.imprinter-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Jam
-#: locale/ipp-strings.c:3040
+#: locale/ipp-strings.c:3042
 msgid "printer-state-reasons.imprinter-jam"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Life Almost Over
-#: locale/ipp-strings.c:3042
+#: locale/ipp-strings.c:3044
 msgid "printer-state-reasons.imprinter-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Life Over
-#: locale/ipp-strings.c:3044
+#: locale/ipp-strings.c:3046
 msgid "printer-state-reasons.imprinter-life-over"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Memory Exhausted
-#: locale/ipp-strings.c:3046
+#: locale/ipp-strings.c:3048
 msgid "printer-state-reasons.imprinter-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Missing
-#: locale/ipp-strings.c:3048
+#: locale/ipp-strings.c:3050
 msgid "printer-state-reasons.imprinter-missing"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Motor Failure
-#: locale/ipp-strings.c:3050
+#: locale/ipp-strings.c:3052
 msgid "printer-state-reasons.imprinter-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Near Limit
-#: locale/ipp-strings.c:3052
+#: locale/ipp-strings.c:3054
 msgid "printer-state-reasons.imprinter-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Offline
-#: locale/ipp-strings.c:3054
+#: locale/ipp-strings.c:3056
 msgid "printer-state-reasons.imprinter-offline"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Opened
-#: locale/ipp-strings.c:3056
+#: locale/ipp-strings.c:3058
 msgid "printer-state-reasons.imprinter-opened"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Over Temperature
-#: locale/ipp-strings.c:3058
+#: locale/ipp-strings.c:3060
 msgid "printer-state-reasons.imprinter-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Power Saver
-#: locale/ipp-strings.c:3060
+#: locale/ipp-strings.c:3062
 msgid "printer-state-reasons.imprinter-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Recoverable Failure
-#: locale/ipp-strings.c:3062
+#: locale/ipp-strings.c:3064
 msgid "printer-state-reasons.imprinter-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Recoverable Storage
-#: locale/ipp-strings.c:3064
+#: locale/ipp-strings.c:3066
 msgid "printer-state-reasons.imprinter-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Removed
-#: locale/ipp-strings.c:3066
+#: locale/ipp-strings.c:3068
 msgid "printer-state-reasons.imprinter-removed"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Resource Added
-#: locale/ipp-strings.c:3068
+#: locale/ipp-strings.c:3070
 msgid "printer-state-reasons.imprinter-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Resource Removed
-#: locale/ipp-strings.c:3070
+#: locale/ipp-strings.c:3072
 msgid "printer-state-reasons.imprinter-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Thermistor Failure
-#: locale/ipp-strings.c:3072
+#: locale/ipp-strings.c:3074
 msgid "printer-state-reasons.imprinter-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Timing Failure
-#: locale/ipp-strings.c:3074
+#: locale/ipp-strings.c:3076
 msgid "printer-state-reasons.imprinter-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Turned Off
-#: locale/ipp-strings.c:3076
+#: locale/ipp-strings.c:3078
 msgid "printer-state-reasons.imprinter-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Turned On
-#: locale/ipp-strings.c:3078
+#: locale/ipp-strings.c:3080
 msgid "printer-state-reasons.imprinter-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Under Temperature
-#: locale/ipp-strings.c:3080
+#: locale/ipp-strings.c:3082
 msgid "printer-state-reasons.imprinter-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Unrecoverable Failure
-#: locale/ipp-strings.c:3082
+#: locale/ipp-strings.c:3084
 msgid "printer-state-reasons.imprinter-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Unrecoverable Storage Error
-#: locale/ipp-strings.c:3084
+#: locale/ipp-strings.c:3086
 msgid "printer-state-reasons.imprinter-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Imprinter Warming Up
-#: locale/ipp-strings.c:3086
+#: locale/ipp-strings.c:3088
 msgid "printer-state-reasons.imprinter-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Input Cannot Feed Size Selected
-#: locale/ipp-strings.c:3088
+#: locale/ipp-strings.c:3090
 msgid "printer-state-reasons.input-cannot-feed-size-selected"
 msgstr ""
 
 #. TRANSLATORS: Input Manual Input Request
-#: locale/ipp-strings.c:3090
+#: locale/ipp-strings.c:3092
 msgid "printer-state-reasons.input-manual-input-request"
 msgstr ""
 
 #. TRANSLATORS: Input Media Color Change
-#: locale/ipp-strings.c:3092
+#: locale/ipp-strings.c:3094
 msgid "printer-state-reasons.input-media-color-change"
 msgstr ""
 
 #. TRANSLATORS: Input Media Form Parts Change
-#: locale/ipp-strings.c:3094
+#: locale/ipp-strings.c:3096
 msgid "printer-state-reasons.input-media-form-parts-change"
 msgstr ""
 
 #. TRANSLATORS: Input Media Size Change
-#: locale/ipp-strings.c:3096
+#: locale/ipp-strings.c:3098
 msgid "printer-state-reasons.input-media-size-change"
 msgstr ""
 
 #. TRANSLATORS: Input Media Tray Failure
-#: locale/ipp-strings.c:3098
+#: locale/ipp-strings.c:3100
 msgid "printer-state-reasons.input-media-tray-failure"
 msgstr ""
 
 #. TRANSLATORS: Input Media Tray Feed Error
-#: locale/ipp-strings.c:3100
+#: locale/ipp-strings.c:3102
 msgid "printer-state-reasons.input-media-tray-feed-error"
 msgstr ""
 
 #. TRANSLATORS: Input Media Tray Jam
-#: locale/ipp-strings.c:3102
+#: locale/ipp-strings.c:3104
 msgid "printer-state-reasons.input-media-tray-jam"
 msgstr ""
 
 #. TRANSLATORS: Input Media Type Change
-#: locale/ipp-strings.c:3104
+#: locale/ipp-strings.c:3106
 msgid "printer-state-reasons.input-media-type-change"
 msgstr ""
 
 #. TRANSLATORS: Input Media Weight Change
-#: locale/ipp-strings.c:3106
+#: locale/ipp-strings.c:3108
 msgid "printer-state-reasons.input-media-weight-change"
 msgstr ""
 
 #. TRANSLATORS: Input Pick Roller Failure
-#: locale/ipp-strings.c:3108
+#: locale/ipp-strings.c:3110
 msgid "printer-state-reasons.input-pick-roller-failure"
 msgstr ""
 
 #. TRANSLATORS: Input Pick Roller Life Over
-#: locale/ipp-strings.c:3110
+#: locale/ipp-strings.c:3112
 msgid "printer-state-reasons.input-pick-roller-life-over"
 msgstr ""
 
 #. TRANSLATORS: Input Pick Roller Life Warn
-#: locale/ipp-strings.c:3112
+#: locale/ipp-strings.c:3114
 msgid "printer-state-reasons.input-pick-roller-life-warn"
 msgstr ""
 
 #. TRANSLATORS: Input Pick Roller Missing
-#: locale/ipp-strings.c:3114
+#: locale/ipp-strings.c:3116
 msgid "printer-state-reasons.input-pick-roller-missing"
 msgstr ""
 
 #. TRANSLATORS: Input Tray Elevation Failure
-#: locale/ipp-strings.c:3116
+#: locale/ipp-strings.c:3118
 msgid "printer-state-reasons.input-tray-elevation-failure"
 msgstr ""
 
 #. TRANSLATORS: Paper tray is missing
-#: locale/ipp-strings.c:3118
+#: locale/ipp-strings.c:3120
 msgid "printer-state-reasons.input-tray-missing"
 msgstr ""
 
 #. TRANSLATORS: Input Tray Position Failure
-#: locale/ipp-strings.c:3120
+#: locale/ipp-strings.c:3122
 msgid "printer-state-reasons.input-tray-position-failure"
 msgstr ""
 
 #. TRANSLATORS: Inserter Added
-#: locale/ipp-strings.c:3122
+#: locale/ipp-strings.c:3124
 msgid "printer-state-reasons.inserter-added"
 msgstr ""
 
 #. TRANSLATORS: Inserter Almost Empty
-#: locale/ipp-strings.c:3124
+#: locale/ipp-strings.c:3126
 msgid "printer-state-reasons.inserter-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Inserter Almost Full
-#: locale/ipp-strings.c:3126
+#: locale/ipp-strings.c:3128
 msgid "printer-state-reasons.inserter-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Inserter At Limit
-#: locale/ipp-strings.c:3128
+#: locale/ipp-strings.c:3130
 msgid "printer-state-reasons.inserter-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Inserter Closed
-#: locale/ipp-strings.c:3130
+#: locale/ipp-strings.c:3132
 msgid "printer-state-reasons.inserter-closed"
 msgstr ""
 
 #. TRANSLATORS: Inserter Configuration Change
-#: locale/ipp-strings.c:3132
+#: locale/ipp-strings.c:3134
 msgid "printer-state-reasons.inserter-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Inserter Cover Closed
-#: locale/ipp-strings.c:3134
+#: locale/ipp-strings.c:3136
 msgid "printer-state-reasons.inserter-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Inserter Cover Open
-#: locale/ipp-strings.c:3136
+#: locale/ipp-strings.c:3138
 msgid "printer-state-reasons.inserter-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Inserter Empty
-#: locale/ipp-strings.c:3138
+#: locale/ipp-strings.c:3140
 msgid "printer-state-reasons.inserter-empty"
 msgstr ""
 
 #. TRANSLATORS: Inserter Full
-#: locale/ipp-strings.c:3140
+#: locale/ipp-strings.c:3142
 msgid "printer-state-reasons.inserter-full"
 msgstr ""
 
 #. TRANSLATORS: Inserter Interlock Closed
-#: locale/ipp-strings.c:3142
+#: locale/ipp-strings.c:3144
 msgid "printer-state-reasons.inserter-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Inserter Interlock Open
-#: locale/ipp-strings.c:3144
+#: locale/ipp-strings.c:3146
 msgid "printer-state-reasons.inserter-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Inserter Jam
-#: locale/ipp-strings.c:3146
+#: locale/ipp-strings.c:3148
 msgid "printer-state-reasons.inserter-jam"
 msgstr ""
 
 #. TRANSLATORS: Inserter Life Almost Over
-#: locale/ipp-strings.c:3148
+#: locale/ipp-strings.c:3150
 msgid "printer-state-reasons.inserter-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Inserter Life Over
-#: locale/ipp-strings.c:3150
+#: locale/ipp-strings.c:3152
 msgid "printer-state-reasons.inserter-life-over"
 msgstr ""
 
 #. TRANSLATORS: Inserter Memory Exhausted
-#: locale/ipp-strings.c:3152
+#: locale/ipp-strings.c:3154
 msgid "printer-state-reasons.inserter-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Inserter Missing
-#: locale/ipp-strings.c:3154
+#: locale/ipp-strings.c:3156
 msgid "printer-state-reasons.inserter-missing"
 msgstr ""
 
 #. TRANSLATORS: Inserter Motor Failure
-#: locale/ipp-strings.c:3156
+#: locale/ipp-strings.c:3158
 msgid "printer-state-reasons.inserter-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Inserter Near Limit
-#: locale/ipp-strings.c:3158
+#: locale/ipp-strings.c:3160
 msgid "printer-state-reasons.inserter-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Inserter Offline
-#: locale/ipp-strings.c:3160
+#: locale/ipp-strings.c:3162
 msgid "printer-state-reasons.inserter-offline"
 msgstr ""
 
 #. TRANSLATORS: Inserter Opened
-#: locale/ipp-strings.c:3162
+#: locale/ipp-strings.c:3164
 msgid "printer-state-reasons.inserter-opened"
 msgstr ""
 
 #. TRANSLATORS: Inserter Over Temperature
-#: locale/ipp-strings.c:3164
+#: locale/ipp-strings.c:3166
 msgid "printer-state-reasons.inserter-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Inserter Power Saver
-#: locale/ipp-strings.c:3166
+#: locale/ipp-strings.c:3168
 msgid "printer-state-reasons.inserter-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Inserter Recoverable Failure
-#: locale/ipp-strings.c:3168
+#: locale/ipp-strings.c:3170
 msgid "printer-state-reasons.inserter-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Inserter Recoverable Storage
-#: locale/ipp-strings.c:3170
+#: locale/ipp-strings.c:3172
 msgid "printer-state-reasons.inserter-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Inserter Removed
-#: locale/ipp-strings.c:3172
+#: locale/ipp-strings.c:3174
 msgid "printer-state-reasons.inserter-removed"
 msgstr ""
 
 #. TRANSLATORS: Inserter Resource Added
-#: locale/ipp-strings.c:3174
+#: locale/ipp-strings.c:3176
 msgid "printer-state-reasons.inserter-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Inserter Resource Removed
-#: locale/ipp-strings.c:3176
+#: locale/ipp-strings.c:3178
 msgid "printer-state-reasons.inserter-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Inserter Thermistor Failure
-#: locale/ipp-strings.c:3178
+#: locale/ipp-strings.c:3180
 msgid "printer-state-reasons.inserter-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Inserter Timing Failure
-#: locale/ipp-strings.c:3180
+#: locale/ipp-strings.c:3182
 msgid "printer-state-reasons.inserter-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Inserter Turned Off
-#: locale/ipp-strings.c:3182
+#: locale/ipp-strings.c:3184
 msgid "printer-state-reasons.inserter-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Inserter Turned On
-#: locale/ipp-strings.c:3184
+#: locale/ipp-strings.c:3186
 msgid "printer-state-reasons.inserter-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Inserter Under Temperature
-#: locale/ipp-strings.c:3186
+#: locale/ipp-strings.c:3188
 msgid "printer-state-reasons.inserter-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Inserter Unrecoverable Failure
-#: locale/ipp-strings.c:3188
+#: locale/ipp-strings.c:3190
 msgid "printer-state-reasons.inserter-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Inserter Unrecoverable Storage Error
-#: locale/ipp-strings.c:3190
+#: locale/ipp-strings.c:3192
 msgid "printer-state-reasons.inserter-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Inserter Warming Up
-#: locale/ipp-strings.c:3192
+#: locale/ipp-strings.c:3194
 msgid "printer-state-reasons.inserter-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Interlock Closed
-#: locale/ipp-strings.c:3194
+#: locale/ipp-strings.c:3196
 msgid "printer-state-reasons.interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Interlock Open
-#: locale/ipp-strings.c:3196
+#: locale/ipp-strings.c:3198
 msgid "printer-state-reasons.interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Interpreter Cartridge Added
-#: locale/ipp-strings.c:3198
+#: locale/ipp-strings.c:3200
 msgid "printer-state-reasons.interpreter-cartridge-added"
 msgstr ""
 
 #. TRANSLATORS: Interpreter Cartridge Removed
-#: locale/ipp-strings.c:3200
+#: locale/ipp-strings.c:3202
 msgid "printer-state-reasons.interpreter-cartridge-deleted"
 msgstr ""
 
 #. TRANSLATORS: Interpreter Complex Page Encountered
-#: locale/ipp-strings.c:3202
+#: locale/ipp-strings.c:3204
 msgid "printer-state-reasons.interpreter-complex-page-encountered"
 msgstr ""
 
 #. TRANSLATORS: Interpreter Memory Decrease
-#: locale/ipp-strings.c:3204
+#: locale/ipp-strings.c:3206
 msgid "printer-state-reasons.interpreter-memory-decrease"
 msgstr ""
 
 #. TRANSLATORS: Interpreter Memory Increase
-#: locale/ipp-strings.c:3206
+#: locale/ipp-strings.c:3208
 msgid "printer-state-reasons.interpreter-memory-increase"
 msgstr ""
 
 #. TRANSLATORS: Interpreter Resource Added
-#: locale/ipp-strings.c:3208
+#: locale/ipp-strings.c:3210
 msgid "printer-state-reasons.interpreter-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Interpreter Resource Deleted
-#: locale/ipp-strings.c:3210
+#: locale/ipp-strings.c:3212
 msgid "printer-state-reasons.interpreter-resource-deleted"
 msgstr ""
 
 #. TRANSLATORS: Printer resource unavailable
-#: locale/ipp-strings.c:3212
+#: locale/ipp-strings.c:3214
 msgid "printer-state-reasons.interpreter-resource-unavailable"
 msgstr ""
 
 #. TRANSLATORS: Lamp At End of Life
-#: locale/ipp-strings.c:3214
+#: locale/ipp-strings.c:3216
 msgid "printer-state-reasons.lamp-at-eol"
 msgstr ""
 
 #. TRANSLATORS: Lamp Failure
-#: locale/ipp-strings.c:3216
+#: locale/ipp-strings.c:3218
 msgid "printer-state-reasons.lamp-failure"
 msgstr ""
 
 #. TRANSLATORS: Lamp Near End of Life
-#: locale/ipp-strings.c:3218
+#: locale/ipp-strings.c:3220
 msgid "printer-state-reasons.lamp-near-eol"
 msgstr ""
 
 #. TRANSLATORS: Laser At End of Life
-#: locale/ipp-strings.c:3220
+#: locale/ipp-strings.c:3222
 msgid "printer-state-reasons.laser-at-eol"
 msgstr ""
 
 #. TRANSLATORS: Laser Failure
-#: locale/ipp-strings.c:3222
+#: locale/ipp-strings.c:3224
 msgid "printer-state-reasons.laser-failure"
 msgstr ""
 
 #. TRANSLATORS: Laser Near End of Life
-#: locale/ipp-strings.c:3224
+#: locale/ipp-strings.c:3226
 msgid "printer-state-reasons.laser-near-eol"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Added
-#: locale/ipp-strings.c:3226
+#: locale/ipp-strings.c:3228
 msgid "printer-state-reasons.make-envelope-added"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Almost Empty
-#: locale/ipp-strings.c:3228
+#: locale/ipp-strings.c:3230
 msgid "printer-state-reasons.make-envelope-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Almost Full
-#: locale/ipp-strings.c:3230
+#: locale/ipp-strings.c:3232
 msgid "printer-state-reasons.make-envelope-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker At Limit
-#: locale/ipp-strings.c:3232
+#: locale/ipp-strings.c:3234
 msgid "printer-state-reasons.make-envelope-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Closed
-#: locale/ipp-strings.c:3234
+#: locale/ipp-strings.c:3236
 msgid "printer-state-reasons.make-envelope-closed"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Configuration Change
-#: locale/ipp-strings.c:3236
+#: locale/ipp-strings.c:3238
 msgid "printer-state-reasons.make-envelope-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Cover Closed
-#: locale/ipp-strings.c:3238
+#: locale/ipp-strings.c:3240
 msgid "printer-state-reasons.make-envelope-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Cover Open
-#: locale/ipp-strings.c:3240
+#: locale/ipp-strings.c:3242
 msgid "printer-state-reasons.make-envelope-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Empty
-#: locale/ipp-strings.c:3242
+#: locale/ipp-strings.c:3244
 msgid "printer-state-reasons.make-envelope-empty"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Full
-#: locale/ipp-strings.c:3244
+#: locale/ipp-strings.c:3246
 msgid "printer-state-reasons.make-envelope-full"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Interlock Closed
-#: locale/ipp-strings.c:3246
+#: locale/ipp-strings.c:3248
 msgid "printer-state-reasons.make-envelope-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Interlock Open
-#: locale/ipp-strings.c:3248
+#: locale/ipp-strings.c:3250
 msgid "printer-state-reasons.make-envelope-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Jam
-#: locale/ipp-strings.c:3250
+#: locale/ipp-strings.c:3252
 msgid "printer-state-reasons.make-envelope-jam"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Life Almost Over
-#: locale/ipp-strings.c:3252
+#: locale/ipp-strings.c:3254
 msgid "printer-state-reasons.make-envelope-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Life Over
-#: locale/ipp-strings.c:3254
+#: locale/ipp-strings.c:3256
 msgid "printer-state-reasons.make-envelope-life-over"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Memory Exhausted
-#: locale/ipp-strings.c:3256
+#: locale/ipp-strings.c:3258
 msgid "printer-state-reasons.make-envelope-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Missing
-#: locale/ipp-strings.c:3258
+#: locale/ipp-strings.c:3260
 msgid "printer-state-reasons.make-envelope-missing"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Motor Failure
-#: locale/ipp-strings.c:3260
+#: locale/ipp-strings.c:3262
 msgid "printer-state-reasons.make-envelope-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Near Limit
-#: locale/ipp-strings.c:3262
+#: locale/ipp-strings.c:3264
 msgid "printer-state-reasons.make-envelope-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Offline
-#: locale/ipp-strings.c:3264
+#: locale/ipp-strings.c:3266
 msgid "printer-state-reasons.make-envelope-offline"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Opened
-#: locale/ipp-strings.c:3266
+#: locale/ipp-strings.c:3268
 msgid "printer-state-reasons.make-envelope-opened"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Over Temperature
-#: locale/ipp-strings.c:3268
+#: locale/ipp-strings.c:3270
 msgid "printer-state-reasons.make-envelope-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Power Saver
-#: locale/ipp-strings.c:3270
+#: locale/ipp-strings.c:3272
 msgid "printer-state-reasons.make-envelope-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Recoverable Failure
-#: locale/ipp-strings.c:3272
+#: locale/ipp-strings.c:3274
 msgid "printer-state-reasons.make-envelope-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Recoverable Storage
-#: locale/ipp-strings.c:3274
+#: locale/ipp-strings.c:3276
 msgid "printer-state-reasons.make-envelope-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Removed
-#: locale/ipp-strings.c:3276
+#: locale/ipp-strings.c:3278
 msgid "printer-state-reasons.make-envelope-removed"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Resource Added
-#: locale/ipp-strings.c:3278
+#: locale/ipp-strings.c:3280
 msgid "printer-state-reasons.make-envelope-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Resource Removed
-#: locale/ipp-strings.c:3280
+#: locale/ipp-strings.c:3282
 msgid "printer-state-reasons.make-envelope-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Thermistor Failure
-#: locale/ipp-strings.c:3282
+#: locale/ipp-strings.c:3284
 msgid "printer-state-reasons.make-envelope-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Timing Failure
-#: locale/ipp-strings.c:3284
+#: locale/ipp-strings.c:3286
 msgid "printer-state-reasons.make-envelope-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Turned Off
-#: locale/ipp-strings.c:3286
+#: locale/ipp-strings.c:3288
 msgid "printer-state-reasons.make-envelope-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Turned On
-#: locale/ipp-strings.c:3288
+#: locale/ipp-strings.c:3290
 msgid "printer-state-reasons.make-envelope-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Under Temperature
-#: locale/ipp-strings.c:3290
+#: locale/ipp-strings.c:3292
 msgid "printer-state-reasons.make-envelope-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Unrecoverable Failure
-#: locale/ipp-strings.c:3292
+#: locale/ipp-strings.c:3294
 msgid "printer-state-reasons.make-envelope-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Unrecoverable Storage Error
-#: locale/ipp-strings.c:3294
+#: locale/ipp-strings.c:3296
 msgid "printer-state-reasons.make-envelope-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Envelope Maker Warming Up
-#: locale/ipp-strings.c:3296
+#: locale/ipp-strings.c:3298
 msgid "printer-state-reasons.make-envelope-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Marker Adjusting Print Quality
-#: locale/ipp-strings.c:3298
+#: locale/ipp-strings.c:3300
 msgid "printer-state-reasons.marker-adjusting-print-quality"
 msgstr ""
 
 #. TRANSLATORS: Marker Cleaner Missing
-#: locale/ipp-strings.c:3300
+#: locale/ipp-strings.c:3302
 msgid "printer-state-reasons.marker-cleaner-missing"
 msgstr ""
 
 #. TRANSLATORS: Marker Developer Almost Empty
-#: locale/ipp-strings.c:3302
+#: locale/ipp-strings.c:3304
 msgid "printer-state-reasons.marker-developer-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Marker Developer Empty
-#: locale/ipp-strings.c:3304
+#: locale/ipp-strings.c:3306
 msgid "printer-state-reasons.marker-developer-empty"
 msgstr ""
 
 #. TRANSLATORS: Marker Developer Missing
-#: locale/ipp-strings.c:3306
+#: locale/ipp-strings.c:3308
 msgid "printer-state-reasons.marker-developer-missing"
 msgstr ""
 
 #. TRANSLATORS: Marker Fuser Missing
-#: locale/ipp-strings.c:3308
+#: locale/ipp-strings.c:3310
 msgid "printer-state-reasons.marker-fuser-missing"
 msgstr ""
 
 #. TRANSLATORS: Marker Fuser Thermistor Failure
-#: locale/ipp-strings.c:3310
+#: locale/ipp-strings.c:3312
 msgid "printer-state-reasons.marker-fuser-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Marker Fuser Timing Failure
-#: locale/ipp-strings.c:3312
+#: locale/ipp-strings.c:3314
 msgid "printer-state-reasons.marker-fuser-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Marker Ink Almost Empty
-#: locale/ipp-strings.c:3314
+#: locale/ipp-strings.c:3316
 msgid "printer-state-reasons.marker-ink-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Marker Ink Empty
-#: locale/ipp-strings.c:3316
+#: locale/ipp-strings.c:3318
 msgid "printer-state-reasons.marker-ink-empty"
 msgstr ""
 
 #. TRANSLATORS: Marker Ink Missing
-#: locale/ipp-strings.c:3318
+#: locale/ipp-strings.c:3320
 msgid "printer-state-reasons.marker-ink-missing"
 msgstr ""
 
 #. TRANSLATORS: Marker Opc Missing
-#: locale/ipp-strings.c:3320
+#: locale/ipp-strings.c:3322
 msgid "printer-state-reasons.marker-opc-missing"
 msgstr ""
 
 #. TRANSLATORS: Marker Print Ribbon Almost Empty
-#: locale/ipp-strings.c:3322
+#: locale/ipp-strings.c:3324
 msgid "printer-state-reasons.marker-print-ribbon-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Marker Print Ribbon Empty
-#: locale/ipp-strings.c:3324
+#: locale/ipp-strings.c:3326
 msgid "printer-state-reasons.marker-print-ribbon-empty"
 msgstr ""
 
 #. TRANSLATORS: Marker Print Ribbon Missing
-#: locale/ipp-strings.c:3326
+#: locale/ipp-strings.c:3328
 msgid "printer-state-reasons.marker-print-ribbon-missing"
 msgstr ""
 
 #. TRANSLATORS: Marker Supply Almost Empty
-#: locale/ipp-strings.c:3328
+#: locale/ipp-strings.c:3330
 msgid "printer-state-reasons.marker-supply-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Ink/toner empty
-#: locale/ipp-strings.c:3330
+#: locale/ipp-strings.c:3332
 msgid "printer-state-reasons.marker-supply-empty"
 msgstr ""
 
 #. TRANSLATORS: Ink/toner low
-#: locale/ipp-strings.c:3332
+#: locale/ipp-strings.c:3334
 msgid "printer-state-reasons.marker-supply-low"
 msgstr ""
 
 #. TRANSLATORS: Marker Supply Missing
-#: locale/ipp-strings.c:3334
+#: locale/ipp-strings.c:3336
 msgid "printer-state-reasons.marker-supply-missing"
 msgstr ""
 
 #. TRANSLATORS: Marker Toner Cartridge Missing
-#: locale/ipp-strings.c:3336
+#: locale/ipp-strings.c:3338
 msgid "printer-state-reasons.marker-toner-cartridge-missing"
 msgstr ""
 
 #. TRANSLATORS: Marker Toner Missing
-#: locale/ipp-strings.c:3338
+#: locale/ipp-strings.c:3340
 msgid "printer-state-reasons.marker-toner-missing"
 msgstr ""
 
 #. TRANSLATORS: Ink/toner waste bin almost full
-#: locale/ipp-strings.c:3340
+#: locale/ipp-strings.c:3342
 msgid "printer-state-reasons.marker-waste-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Ink/toner waste bin full
-#: locale/ipp-strings.c:3342
+#: locale/ipp-strings.c:3344
 msgid "printer-state-reasons.marker-waste-full"
 msgstr ""
 
 #. TRANSLATORS: Marker Waste Ink Receptacle Almost Full
-#: locale/ipp-strings.c:3344
+#: locale/ipp-strings.c:3346
 msgid "printer-state-reasons.marker-waste-ink-receptacle-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Marker Waste Ink Receptacle Full
-#: locale/ipp-strings.c:3346
+#: locale/ipp-strings.c:3348
 msgid "printer-state-reasons.marker-waste-ink-receptacle-full"
 msgstr ""
 
 #. TRANSLATORS: Marker Waste Ink Receptacle Missing
-#: locale/ipp-strings.c:3348
+#: locale/ipp-strings.c:3350
 msgid "printer-state-reasons.marker-waste-ink-receptacle-missing"
 msgstr ""
 
 #. TRANSLATORS: Marker Waste Missing
-#: locale/ipp-strings.c:3350
+#: locale/ipp-strings.c:3352
 msgid "printer-state-reasons.marker-waste-missing"
 msgstr ""
 
 #. TRANSLATORS: Marker Waste Toner Receptacle Almost Full
-#: locale/ipp-strings.c:3352
+#: locale/ipp-strings.c:3354
 msgid "printer-state-reasons.marker-waste-toner-receptacle-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Marker Waste Toner Receptacle Full
-#: locale/ipp-strings.c:3354
+#: locale/ipp-strings.c:3356
 msgid "printer-state-reasons.marker-waste-toner-receptacle-full"
 msgstr ""
 
 #. TRANSLATORS: Marker Waste Toner Receptacle Missing
-#: locale/ipp-strings.c:3356
+#: locale/ipp-strings.c:3358
 msgid "printer-state-reasons.marker-waste-toner-receptacle-missing"
 msgstr ""
 
 #. TRANSLATORS: Material Empty
-#: locale/ipp-strings.c:3358
+#: locale/ipp-strings.c:3360
 msgid "printer-state-reasons.material-empty"
 msgstr ""
 
 #. TRANSLATORS: Material Low
-#: locale/ipp-strings.c:3360
+#: locale/ipp-strings.c:3362
 msgid "printer-state-reasons.material-low"
 msgstr ""
 
 #. TRANSLATORS: Material Needed
-#: locale/ipp-strings.c:3362
+#: locale/ipp-strings.c:3364
 msgid "printer-state-reasons.material-needed"
 msgstr ""
 
 #. TRANSLATORS: Media Drying
-#: locale/ipp-strings.c:3364
+#: locale/ipp-strings.c:3366
 msgid "printer-state-reasons.media-drying"
 msgstr ""
 
 #. TRANSLATORS: Paper tray is empty
-#: locale/ipp-strings.c:3366
+#: locale/ipp-strings.c:3368
 msgid "printer-state-reasons.media-empty"
 msgstr ""
 
 #. TRANSLATORS: Paper jam
-#: locale/ipp-strings.c:3368
+#: locale/ipp-strings.c:3370
 msgid "printer-state-reasons.media-jam"
 msgstr ""
 
 #. TRANSLATORS: Paper tray is almost empty
-#: locale/ipp-strings.c:3370
+#: locale/ipp-strings.c:3372
 msgid "printer-state-reasons.media-low"
 msgstr ""
 
 #. TRANSLATORS: Load paper
-#: locale/ipp-strings.c:3372
+#: locale/ipp-strings.c:3374
 msgid "printer-state-reasons.media-needed"
 msgstr ""
 
 #. TRANSLATORS: Media Path Cannot Do 2-Sided Printing
-#: locale/ipp-strings.c:3374
+#: locale/ipp-strings.c:3376
 msgid "printer-state-reasons.media-path-cannot-duplex-media-selected"
 msgstr ""
 
 #. TRANSLATORS: Media Path Failure
-#: locale/ipp-strings.c:3376
+#: locale/ipp-strings.c:3378
 msgid "printer-state-reasons.media-path-failure"
 msgstr ""
 
 #. TRANSLATORS: Media Path Input Empty
-#: locale/ipp-strings.c:3378
+#: locale/ipp-strings.c:3380
 msgid "printer-state-reasons.media-path-input-empty"
 msgstr ""
 
 #. TRANSLATORS: Media Path Input Feed Error
-#: locale/ipp-strings.c:3380
+#: locale/ipp-strings.c:3382
 msgid "printer-state-reasons.media-path-input-feed-error"
 msgstr ""
 
 #. TRANSLATORS: Media Path Input Jam
-#: locale/ipp-strings.c:3382
+#: locale/ipp-strings.c:3384
 msgid "printer-state-reasons.media-path-input-jam"
 msgstr ""
 
 #. TRANSLATORS: Media Path Input Request
-#: locale/ipp-strings.c:3384
+#: locale/ipp-strings.c:3386
 msgid "printer-state-reasons.media-path-input-request"
 msgstr ""
 
 #. TRANSLATORS: Media Path Jam
-#: locale/ipp-strings.c:3386
+#: locale/ipp-strings.c:3388
 msgid "printer-state-reasons.media-path-jam"
 msgstr ""
 
 #. TRANSLATORS: Media Path Media Tray Almost Full
-#: locale/ipp-strings.c:3388
+#: locale/ipp-strings.c:3390
 msgid "printer-state-reasons.media-path-media-tray-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Media Path Media Tray Full
-#: locale/ipp-strings.c:3390
+#: locale/ipp-strings.c:3392
 msgid "printer-state-reasons.media-path-media-tray-full"
 msgstr ""
 
 #. TRANSLATORS: Media Path Media Tray Missing
-#: locale/ipp-strings.c:3392
+#: locale/ipp-strings.c:3394
 msgid "printer-state-reasons.media-path-media-tray-missing"
 msgstr ""
 
 #. TRANSLATORS: Media Path Output Feed Error
-#: locale/ipp-strings.c:3394
+#: locale/ipp-strings.c:3396
 msgid "printer-state-reasons.media-path-output-feed-error"
 msgstr ""
 
 #. TRANSLATORS: Media Path Output Full
-#: locale/ipp-strings.c:3396
+#: locale/ipp-strings.c:3398
 msgid "printer-state-reasons.media-path-output-full"
 msgstr ""
 
 #. TRANSLATORS: Media Path Output Jam
-#: locale/ipp-strings.c:3398
+#: locale/ipp-strings.c:3400
 msgid "printer-state-reasons.media-path-output-jam"
 msgstr ""
 
 #. TRANSLATORS: Media Path Pick Roller Failure
-#: locale/ipp-strings.c:3400
+#: locale/ipp-strings.c:3402
 msgid "printer-state-reasons.media-path-pick-roller-failure"
 msgstr ""
 
 #. TRANSLATORS: Media Path Pick Roller Life Over
-#: locale/ipp-strings.c:3402
+#: locale/ipp-strings.c:3404
 msgid "printer-state-reasons.media-path-pick-roller-life-over"
 msgstr ""
 
 #. TRANSLATORS: Media Path Pick Roller Life Warn
-#: locale/ipp-strings.c:3404
+#: locale/ipp-strings.c:3406
 msgid "printer-state-reasons.media-path-pick-roller-life-warn"
 msgstr ""
 
 #. TRANSLATORS: Media Path Pick Roller Missing
-#: locale/ipp-strings.c:3406
+#: locale/ipp-strings.c:3408
 msgid "printer-state-reasons.media-path-pick-roller-missing"
 msgstr ""
 
 #. TRANSLATORS: Motor Failure
-#: locale/ipp-strings.c:3408
+#: locale/ipp-strings.c:3410
 msgid "printer-state-reasons.motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Printer going offline
-#: locale/ipp-strings.c:3410
+#: locale/ipp-strings.c:3412
 msgid "printer-state-reasons.moving-to-paused"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:3412
+#: locale/ipp-strings.c:3414
 msgid "printer-state-reasons.none"
 msgstr ""
 
 #. TRANSLATORS: Optical Photoconductor Life Over
-#: locale/ipp-strings.c:3414
+#: locale/ipp-strings.c:3416
 msgid "printer-state-reasons.opc-life-over"
 msgstr ""
 
 #. TRANSLATORS: OPC almost at end-of-life
-#: locale/ipp-strings.c:3416
+#: locale/ipp-strings.c:3418
 msgid "printer-state-reasons.opc-near-eol"
 msgstr ""
 
 #. TRANSLATORS: Check the printer for errors
-#: locale/ipp-strings.c:3418
+#: locale/ipp-strings.c:3420
 msgid "printer-state-reasons.other"
 msgstr ""
 
 #. TRANSLATORS: Output bin is almost full
-#: locale/ipp-strings.c:3420
+#: locale/ipp-strings.c:3422
 msgid "printer-state-reasons.output-area-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Output bin is full
-#: locale/ipp-strings.c:3422
+#: locale/ipp-strings.c:3424
 msgid "printer-state-reasons.output-area-full"
 msgstr ""
 
 #. TRANSLATORS: Output Mailbox Select Failure
-#: locale/ipp-strings.c:3424
+#: locale/ipp-strings.c:3426
 msgid "printer-state-reasons.output-mailbox-select-failure"
 msgstr ""
 
 #. TRANSLATORS: Output Media Tray Failure
-#: locale/ipp-strings.c:3426
+#: locale/ipp-strings.c:3428
 msgid "printer-state-reasons.output-media-tray-failure"
 msgstr ""
 
 #. TRANSLATORS: Output Media Tray Feed Error
-#: locale/ipp-strings.c:3428
+#: locale/ipp-strings.c:3430
 msgid "printer-state-reasons.output-media-tray-feed-error"
 msgstr ""
 
 #. TRANSLATORS: Output Media Tray Jam
-#: locale/ipp-strings.c:3430
+#: locale/ipp-strings.c:3432
 msgid "printer-state-reasons.output-media-tray-jam"
 msgstr ""
 
 #. TRANSLATORS: Output tray is missing
-#: locale/ipp-strings.c:3432
+#: locale/ipp-strings.c:3434
 msgid "printer-state-reasons.output-tray-missing"
 msgstr ""
 
 #. TRANSLATORS: Paused
-#: locale/ipp-strings.c:3434
+#: locale/ipp-strings.c:3436
 msgid "printer-state-reasons.paused"
 msgstr ""
 
 #. TRANSLATORS: Perforater Added
-#: locale/ipp-strings.c:3436
+#: locale/ipp-strings.c:3438
 msgid "printer-state-reasons.perforater-added"
 msgstr ""
 
 #. TRANSLATORS: Perforater Almost Empty
-#: locale/ipp-strings.c:3438
+#: locale/ipp-strings.c:3440
 msgid "printer-state-reasons.perforater-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Perforater Almost Full
-#: locale/ipp-strings.c:3440
+#: locale/ipp-strings.c:3442
 msgid "printer-state-reasons.perforater-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Perforater At Limit
-#: locale/ipp-strings.c:3442
+#: locale/ipp-strings.c:3444
 msgid "printer-state-reasons.perforater-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Perforater Closed
-#: locale/ipp-strings.c:3444
+#: locale/ipp-strings.c:3446
 msgid "printer-state-reasons.perforater-closed"
 msgstr ""
 
 #. TRANSLATORS: Perforater Configuration Change
-#: locale/ipp-strings.c:3446
+#: locale/ipp-strings.c:3448
 msgid "printer-state-reasons.perforater-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Perforater Cover Closed
-#: locale/ipp-strings.c:3448
+#: locale/ipp-strings.c:3450
 msgid "printer-state-reasons.perforater-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Perforater Cover Open
-#: locale/ipp-strings.c:3450
+#: locale/ipp-strings.c:3452
 msgid "printer-state-reasons.perforater-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Perforater Empty
-#: locale/ipp-strings.c:3452
+#: locale/ipp-strings.c:3454
 msgid "printer-state-reasons.perforater-empty"
 msgstr ""
 
 #. TRANSLATORS: Perforater Full
-#: locale/ipp-strings.c:3454
+#: locale/ipp-strings.c:3456
 msgid "printer-state-reasons.perforater-full"
 msgstr ""
 
 #. TRANSLATORS: Perforater Interlock Closed
-#: locale/ipp-strings.c:3456
+#: locale/ipp-strings.c:3458
 msgid "printer-state-reasons.perforater-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Perforater Interlock Open
-#: locale/ipp-strings.c:3458
+#: locale/ipp-strings.c:3460
 msgid "printer-state-reasons.perforater-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Perforater Jam
-#: locale/ipp-strings.c:3460
+#: locale/ipp-strings.c:3462
 msgid "printer-state-reasons.perforater-jam"
 msgstr ""
 
 #. TRANSLATORS: Perforater Life Almost Over
-#: locale/ipp-strings.c:3462
+#: locale/ipp-strings.c:3464
 msgid "printer-state-reasons.perforater-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Perforater Life Over
-#: locale/ipp-strings.c:3464
+#: locale/ipp-strings.c:3466
 msgid "printer-state-reasons.perforater-life-over"
 msgstr ""
 
 #. TRANSLATORS: Perforater Memory Exhausted
-#: locale/ipp-strings.c:3466
+#: locale/ipp-strings.c:3468
 msgid "printer-state-reasons.perforater-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Perforater Missing
-#: locale/ipp-strings.c:3468
+#: locale/ipp-strings.c:3470
 msgid "printer-state-reasons.perforater-missing"
 msgstr ""
 
 #. TRANSLATORS: Perforater Motor Failure
-#: locale/ipp-strings.c:3470
+#: locale/ipp-strings.c:3472
 msgid "printer-state-reasons.perforater-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Perforater Near Limit
-#: locale/ipp-strings.c:3472
+#: locale/ipp-strings.c:3474
 msgid "printer-state-reasons.perforater-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Perforater Offline
-#: locale/ipp-strings.c:3474
+#: locale/ipp-strings.c:3476
 msgid "printer-state-reasons.perforater-offline"
 msgstr ""
 
 #. TRANSLATORS: Perforater Opened
-#: locale/ipp-strings.c:3476
+#: locale/ipp-strings.c:3478
 msgid "printer-state-reasons.perforater-opened"
 msgstr ""
 
 #. TRANSLATORS: Perforater Over Temperature
-#: locale/ipp-strings.c:3478
+#: locale/ipp-strings.c:3480
 msgid "printer-state-reasons.perforater-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Perforater Power Saver
-#: locale/ipp-strings.c:3480
+#: locale/ipp-strings.c:3482
 msgid "printer-state-reasons.perforater-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Perforater Recoverable Failure
-#: locale/ipp-strings.c:3482
+#: locale/ipp-strings.c:3484
 msgid "printer-state-reasons.perforater-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Perforater Recoverable Storage
-#: locale/ipp-strings.c:3484
+#: locale/ipp-strings.c:3486
 msgid "printer-state-reasons.perforater-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Perforater Removed
-#: locale/ipp-strings.c:3486
+#: locale/ipp-strings.c:3488
 msgid "printer-state-reasons.perforater-removed"
 msgstr ""
 
 #. TRANSLATORS: Perforater Resource Added
-#: locale/ipp-strings.c:3488
+#: locale/ipp-strings.c:3490
 msgid "printer-state-reasons.perforater-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Perforater Resource Removed
-#: locale/ipp-strings.c:3490
+#: locale/ipp-strings.c:3492
 msgid "printer-state-reasons.perforater-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Perforater Thermistor Failure
-#: locale/ipp-strings.c:3492
+#: locale/ipp-strings.c:3494
 msgid "printer-state-reasons.perforater-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Perforater Timing Failure
-#: locale/ipp-strings.c:3494
+#: locale/ipp-strings.c:3496
 msgid "printer-state-reasons.perforater-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Perforater Turned Off
-#: locale/ipp-strings.c:3496
+#: locale/ipp-strings.c:3498
 msgid "printer-state-reasons.perforater-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Perforater Turned On
-#: locale/ipp-strings.c:3498
+#: locale/ipp-strings.c:3500
 msgid "printer-state-reasons.perforater-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Perforater Under Temperature
-#: locale/ipp-strings.c:3500
+#: locale/ipp-strings.c:3502
 msgid "printer-state-reasons.perforater-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Perforater Unrecoverable Failure
-#: locale/ipp-strings.c:3502
+#: locale/ipp-strings.c:3504
 msgid "printer-state-reasons.perforater-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Perforater Unrecoverable Storage Error
-#: locale/ipp-strings.c:3504
+#: locale/ipp-strings.c:3506
 msgid "printer-state-reasons.perforater-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Perforater Warming Up
-#: locale/ipp-strings.c:3506
+#: locale/ipp-strings.c:3508
 msgid "printer-state-reasons.perforater-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Platform Cooling
-#: locale/ipp-strings.c:3508
+#: locale/ipp-strings.c:3510
 msgid "printer-state-reasons.platform-cooling"
 msgstr ""
 
 #. TRANSLATORS: Platform Failure
-#: locale/ipp-strings.c:3510
+#: locale/ipp-strings.c:3512
 msgid "printer-state-reasons.platform-failure"
 msgstr ""
 
 #. TRANSLATORS: Platform Heating
-#: locale/ipp-strings.c:3512
+#: locale/ipp-strings.c:3514
 msgid "printer-state-reasons.platform-heating"
 msgstr ""
 
 #. TRANSLATORS: Platform Temperature High
-#: locale/ipp-strings.c:3514
+#: locale/ipp-strings.c:3516
 msgid "printer-state-reasons.platform-temperature-high"
 msgstr ""
 
 #. TRANSLATORS: Platform Temperature Low
-#: locale/ipp-strings.c:3516
+#: locale/ipp-strings.c:3518
 msgid "printer-state-reasons.platform-temperature-low"
 msgstr ""
 
 #. TRANSLATORS: Power Down
-#: locale/ipp-strings.c:3518
+#: locale/ipp-strings.c:3520
 msgid "printer-state-reasons.power-down"
 msgstr ""
 
 #. TRANSLATORS: Power Up
-#: locale/ipp-strings.c:3520
+#: locale/ipp-strings.c:3522
 msgid "printer-state-reasons.power-up"
 msgstr ""
 
 #. TRANSLATORS: Printer Reset Manually
-#: locale/ipp-strings.c:3522
+#: locale/ipp-strings.c:3524
 msgid "printer-state-reasons.printer-manual-reset"
 msgstr ""
 
 #. TRANSLATORS: Printer Reset Remotely
-#: locale/ipp-strings.c:3524
+#: locale/ipp-strings.c:3526
 msgid "printer-state-reasons.printer-nms-reset"
 msgstr ""
 
 #. TRANSLATORS: Printer Ready To Print
-#: locale/ipp-strings.c:3526
+#: locale/ipp-strings.c:3528
 msgid "printer-state-reasons.printer-ready-to-print"
 msgstr ""
 
 #. TRANSLATORS: Puncher Added
-#: locale/ipp-strings.c:3528
+#: locale/ipp-strings.c:3530
 msgid "printer-state-reasons.puncher-added"
 msgstr ""
 
 #. TRANSLATORS: Puncher Almost Empty
-#: locale/ipp-strings.c:3530
+#: locale/ipp-strings.c:3532
 msgid "printer-state-reasons.puncher-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Puncher Almost Full
-#: locale/ipp-strings.c:3532
+#: locale/ipp-strings.c:3534
 msgid "printer-state-reasons.puncher-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Puncher At Limit
-#: locale/ipp-strings.c:3534
+#: locale/ipp-strings.c:3536
 msgid "printer-state-reasons.puncher-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Puncher Closed
-#: locale/ipp-strings.c:3536
+#: locale/ipp-strings.c:3538
 msgid "printer-state-reasons.puncher-closed"
 msgstr ""
 
 #. TRANSLATORS: Puncher Configuration Change
-#: locale/ipp-strings.c:3538
+#: locale/ipp-strings.c:3540
 msgid "printer-state-reasons.puncher-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Puncher Cover Closed
-#: locale/ipp-strings.c:3540
+#: locale/ipp-strings.c:3542
 msgid "printer-state-reasons.puncher-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Puncher Cover Open
-#: locale/ipp-strings.c:3542
+#: locale/ipp-strings.c:3544
 msgid "printer-state-reasons.puncher-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Puncher Empty
-#: locale/ipp-strings.c:3544
+#: locale/ipp-strings.c:3546
 msgid "printer-state-reasons.puncher-empty"
 msgstr ""
 
 #. TRANSLATORS: Puncher Full
-#: locale/ipp-strings.c:3546
+#: locale/ipp-strings.c:3548
 msgid "printer-state-reasons.puncher-full"
 msgstr ""
 
 #. TRANSLATORS: Puncher Interlock Closed
-#: locale/ipp-strings.c:3548
+#: locale/ipp-strings.c:3550
 msgid "printer-state-reasons.puncher-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Puncher Interlock Open
-#: locale/ipp-strings.c:3550
+#: locale/ipp-strings.c:3552
 msgid "printer-state-reasons.puncher-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Puncher Jam
-#: locale/ipp-strings.c:3552
+#: locale/ipp-strings.c:3554
 msgid "printer-state-reasons.puncher-jam"
 msgstr ""
 
 #. TRANSLATORS: Puncher Life Almost Over
-#: locale/ipp-strings.c:3554
+#: locale/ipp-strings.c:3556
 msgid "printer-state-reasons.puncher-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Puncher Life Over
-#: locale/ipp-strings.c:3556
+#: locale/ipp-strings.c:3558
 msgid "printer-state-reasons.puncher-life-over"
 msgstr ""
 
 #. TRANSLATORS: Puncher Memory Exhausted
-#: locale/ipp-strings.c:3558
+#: locale/ipp-strings.c:3560
 msgid "printer-state-reasons.puncher-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Puncher Missing
-#: locale/ipp-strings.c:3560
+#: locale/ipp-strings.c:3562
 msgid "printer-state-reasons.puncher-missing"
 msgstr ""
 
 #. TRANSLATORS: Puncher Motor Failure
-#: locale/ipp-strings.c:3562
+#: locale/ipp-strings.c:3564
 msgid "printer-state-reasons.puncher-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Puncher Near Limit
-#: locale/ipp-strings.c:3564
+#: locale/ipp-strings.c:3566
 msgid "printer-state-reasons.puncher-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Puncher Offline
-#: locale/ipp-strings.c:3566
+#: locale/ipp-strings.c:3568
 msgid "printer-state-reasons.puncher-offline"
 msgstr ""
 
 #. TRANSLATORS: Puncher Opened
-#: locale/ipp-strings.c:3568
+#: locale/ipp-strings.c:3570
 msgid "printer-state-reasons.puncher-opened"
 msgstr ""
 
 #. TRANSLATORS: Puncher Over Temperature
-#: locale/ipp-strings.c:3570
+#: locale/ipp-strings.c:3572
 msgid "printer-state-reasons.puncher-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Puncher Power Saver
-#: locale/ipp-strings.c:3572
+#: locale/ipp-strings.c:3574
 msgid "printer-state-reasons.puncher-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Puncher Recoverable Failure
-#: locale/ipp-strings.c:3574
+#: locale/ipp-strings.c:3576
 msgid "printer-state-reasons.puncher-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Puncher Recoverable Storage
-#: locale/ipp-strings.c:3576
+#: locale/ipp-strings.c:3578
 msgid "printer-state-reasons.puncher-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Puncher Removed
-#: locale/ipp-strings.c:3578
+#: locale/ipp-strings.c:3580
 msgid "printer-state-reasons.puncher-removed"
 msgstr ""
 
 #. TRANSLATORS: Puncher Resource Added
-#: locale/ipp-strings.c:3580
+#: locale/ipp-strings.c:3582
 msgid "printer-state-reasons.puncher-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Puncher Resource Removed
-#: locale/ipp-strings.c:3582
+#: locale/ipp-strings.c:3584
 msgid "printer-state-reasons.puncher-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Puncher Thermistor Failure
-#: locale/ipp-strings.c:3584
+#: locale/ipp-strings.c:3586
 msgid "printer-state-reasons.puncher-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Puncher Timing Failure
-#: locale/ipp-strings.c:3586
+#: locale/ipp-strings.c:3588
 msgid "printer-state-reasons.puncher-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Puncher Turned Off
-#: locale/ipp-strings.c:3588
+#: locale/ipp-strings.c:3590
 msgid "printer-state-reasons.puncher-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Puncher Turned On
-#: locale/ipp-strings.c:3590
+#: locale/ipp-strings.c:3592
 msgid "printer-state-reasons.puncher-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Puncher Under Temperature
-#: locale/ipp-strings.c:3592
+#: locale/ipp-strings.c:3594
 msgid "printer-state-reasons.puncher-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Puncher Unrecoverable Failure
-#: locale/ipp-strings.c:3594
+#: locale/ipp-strings.c:3596
 msgid "printer-state-reasons.puncher-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Puncher Unrecoverable Storage Error
-#: locale/ipp-strings.c:3596
+#: locale/ipp-strings.c:3598
 msgid "printer-state-reasons.puncher-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Puncher Warming Up
-#: locale/ipp-strings.c:3598
+#: locale/ipp-strings.c:3600
 msgid "printer-state-reasons.puncher-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Added
-#: locale/ipp-strings.c:3600
+#: locale/ipp-strings.c:3602
 msgid "printer-state-reasons.separation-cutter-added"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Almost Empty
-#: locale/ipp-strings.c:3602
+#: locale/ipp-strings.c:3604
 msgid "printer-state-reasons.separation-cutter-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Almost Full
-#: locale/ipp-strings.c:3604
+#: locale/ipp-strings.c:3606
 msgid "printer-state-reasons.separation-cutter-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter At Limit
-#: locale/ipp-strings.c:3606
+#: locale/ipp-strings.c:3608
 msgid "printer-state-reasons.separation-cutter-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Closed
-#: locale/ipp-strings.c:3608
+#: locale/ipp-strings.c:3610
 msgid "printer-state-reasons.separation-cutter-closed"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Configuration Change
-#: locale/ipp-strings.c:3610
+#: locale/ipp-strings.c:3612
 msgid "printer-state-reasons.separation-cutter-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Cover Closed
-#: locale/ipp-strings.c:3612
+#: locale/ipp-strings.c:3614
 msgid "printer-state-reasons.separation-cutter-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Cover Open
-#: locale/ipp-strings.c:3614
+#: locale/ipp-strings.c:3616
 msgid "printer-state-reasons.separation-cutter-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Empty
-#: locale/ipp-strings.c:3616
+#: locale/ipp-strings.c:3618
 msgid "printer-state-reasons.separation-cutter-empty"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Full
-#: locale/ipp-strings.c:3618
+#: locale/ipp-strings.c:3620
 msgid "printer-state-reasons.separation-cutter-full"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Interlock Closed
-#: locale/ipp-strings.c:3620
+#: locale/ipp-strings.c:3622
 msgid "printer-state-reasons.separation-cutter-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Interlock Open
-#: locale/ipp-strings.c:3622
+#: locale/ipp-strings.c:3624
 msgid "printer-state-reasons.separation-cutter-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Jam
-#: locale/ipp-strings.c:3624
+#: locale/ipp-strings.c:3626
 msgid "printer-state-reasons.separation-cutter-jam"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Life Almost Over
-#: locale/ipp-strings.c:3626
+#: locale/ipp-strings.c:3628
 msgid "printer-state-reasons.separation-cutter-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Life Over
-#: locale/ipp-strings.c:3628
+#: locale/ipp-strings.c:3630
 msgid "printer-state-reasons.separation-cutter-life-over"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Memory Exhausted
-#: locale/ipp-strings.c:3630
+#: locale/ipp-strings.c:3632
 msgid "printer-state-reasons.separation-cutter-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Missing
-#: locale/ipp-strings.c:3632
+#: locale/ipp-strings.c:3634
 msgid "printer-state-reasons.separation-cutter-missing"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Motor Failure
-#: locale/ipp-strings.c:3634
+#: locale/ipp-strings.c:3636
 msgid "printer-state-reasons.separation-cutter-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Near Limit
-#: locale/ipp-strings.c:3636
+#: locale/ipp-strings.c:3638
 msgid "printer-state-reasons.separation-cutter-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Offline
-#: locale/ipp-strings.c:3638
+#: locale/ipp-strings.c:3640
 msgid "printer-state-reasons.separation-cutter-offline"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Opened
-#: locale/ipp-strings.c:3640
+#: locale/ipp-strings.c:3642
 msgid "printer-state-reasons.separation-cutter-opened"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Over Temperature
-#: locale/ipp-strings.c:3642
+#: locale/ipp-strings.c:3644
 msgid "printer-state-reasons.separation-cutter-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Power Saver
-#: locale/ipp-strings.c:3644
+#: locale/ipp-strings.c:3646
 msgid "printer-state-reasons.separation-cutter-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Recoverable Failure
-#: locale/ipp-strings.c:3646
+#: locale/ipp-strings.c:3648
 msgid "printer-state-reasons.separation-cutter-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Recoverable Storage
-#: locale/ipp-strings.c:3648
+#: locale/ipp-strings.c:3650
 msgid "printer-state-reasons.separation-cutter-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Removed
-#: locale/ipp-strings.c:3650
+#: locale/ipp-strings.c:3652
 msgid "printer-state-reasons.separation-cutter-removed"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Resource Added
-#: locale/ipp-strings.c:3652
+#: locale/ipp-strings.c:3654
 msgid "printer-state-reasons.separation-cutter-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Resource Removed
-#: locale/ipp-strings.c:3654
+#: locale/ipp-strings.c:3656
 msgid "printer-state-reasons.separation-cutter-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Thermistor Failure
-#: locale/ipp-strings.c:3656
+#: locale/ipp-strings.c:3658
 msgid "printer-state-reasons.separation-cutter-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Timing Failure
-#: locale/ipp-strings.c:3658
+#: locale/ipp-strings.c:3660
 msgid "printer-state-reasons.separation-cutter-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Turned Off
-#: locale/ipp-strings.c:3660
+#: locale/ipp-strings.c:3662
 msgid "printer-state-reasons.separation-cutter-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Turned On
-#: locale/ipp-strings.c:3662
+#: locale/ipp-strings.c:3664
 msgid "printer-state-reasons.separation-cutter-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Under Temperature
-#: locale/ipp-strings.c:3664
+#: locale/ipp-strings.c:3666
 msgid "printer-state-reasons.separation-cutter-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Unrecoverable Failure
-#: locale/ipp-strings.c:3666
+#: locale/ipp-strings.c:3668
 msgid "printer-state-reasons.separation-cutter-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Unrecoverable Storage Error
-#: locale/ipp-strings.c:3668
+#: locale/ipp-strings.c:3670
 msgid "printer-state-reasons.separation-cutter-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Separation Cutter Warming Up
-#: locale/ipp-strings.c:3670
+#: locale/ipp-strings.c:3672
 msgid "printer-state-reasons.separation-cutter-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Added
-#: locale/ipp-strings.c:3672
+#: locale/ipp-strings.c:3674
 msgid "printer-state-reasons.sheet-rotator-added"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Almost Empty
-#: locale/ipp-strings.c:3674
+#: locale/ipp-strings.c:3676
 msgid "printer-state-reasons.sheet-rotator-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Almost Full
-#: locale/ipp-strings.c:3676
+#: locale/ipp-strings.c:3678
 msgid "printer-state-reasons.sheet-rotator-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator At Limit
-#: locale/ipp-strings.c:3678
+#: locale/ipp-strings.c:3680
 msgid "printer-state-reasons.sheet-rotator-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Closed
-#: locale/ipp-strings.c:3680
+#: locale/ipp-strings.c:3682
 msgid "printer-state-reasons.sheet-rotator-closed"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Configuration Change
-#: locale/ipp-strings.c:3682
+#: locale/ipp-strings.c:3684
 msgid "printer-state-reasons.sheet-rotator-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Cover Closed
-#: locale/ipp-strings.c:3684
+#: locale/ipp-strings.c:3686
 msgid "printer-state-reasons.sheet-rotator-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Cover Open
-#: locale/ipp-strings.c:3686
+#: locale/ipp-strings.c:3688
 msgid "printer-state-reasons.sheet-rotator-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Empty
-#: locale/ipp-strings.c:3688
+#: locale/ipp-strings.c:3690
 msgid "printer-state-reasons.sheet-rotator-empty"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Full
-#: locale/ipp-strings.c:3690
+#: locale/ipp-strings.c:3692
 msgid "printer-state-reasons.sheet-rotator-full"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Interlock Closed
-#: locale/ipp-strings.c:3692
+#: locale/ipp-strings.c:3694
 msgid "printer-state-reasons.sheet-rotator-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Interlock Open
-#: locale/ipp-strings.c:3694
+#: locale/ipp-strings.c:3696
 msgid "printer-state-reasons.sheet-rotator-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Jam
-#: locale/ipp-strings.c:3696
+#: locale/ipp-strings.c:3698
 msgid "printer-state-reasons.sheet-rotator-jam"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Life Almost Over
-#: locale/ipp-strings.c:3698
+#: locale/ipp-strings.c:3700
 msgid "printer-state-reasons.sheet-rotator-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Life Over
-#: locale/ipp-strings.c:3700
+#: locale/ipp-strings.c:3702
 msgid "printer-state-reasons.sheet-rotator-life-over"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Memory Exhausted
-#: locale/ipp-strings.c:3702
+#: locale/ipp-strings.c:3704
 msgid "printer-state-reasons.sheet-rotator-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Missing
-#: locale/ipp-strings.c:3704
+#: locale/ipp-strings.c:3706
 msgid "printer-state-reasons.sheet-rotator-missing"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Motor Failure
-#: locale/ipp-strings.c:3706
+#: locale/ipp-strings.c:3708
 msgid "printer-state-reasons.sheet-rotator-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Near Limit
-#: locale/ipp-strings.c:3708
+#: locale/ipp-strings.c:3710
 msgid "printer-state-reasons.sheet-rotator-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Offline
-#: locale/ipp-strings.c:3710
+#: locale/ipp-strings.c:3712
 msgid "printer-state-reasons.sheet-rotator-offline"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Opened
-#: locale/ipp-strings.c:3712
+#: locale/ipp-strings.c:3714
 msgid "printer-state-reasons.sheet-rotator-opened"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Over Temperature
-#: locale/ipp-strings.c:3714
+#: locale/ipp-strings.c:3716
 msgid "printer-state-reasons.sheet-rotator-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Power Saver
-#: locale/ipp-strings.c:3716
+#: locale/ipp-strings.c:3718
 msgid "printer-state-reasons.sheet-rotator-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Recoverable Failure
-#: locale/ipp-strings.c:3718
+#: locale/ipp-strings.c:3720
 msgid "printer-state-reasons.sheet-rotator-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Recoverable Storage
-#: locale/ipp-strings.c:3720
+#: locale/ipp-strings.c:3722
 msgid "printer-state-reasons.sheet-rotator-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Removed
-#: locale/ipp-strings.c:3722
+#: locale/ipp-strings.c:3724
 msgid "printer-state-reasons.sheet-rotator-removed"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Resource Added
-#: locale/ipp-strings.c:3724
+#: locale/ipp-strings.c:3726
 msgid "printer-state-reasons.sheet-rotator-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Resource Removed
-#: locale/ipp-strings.c:3726
+#: locale/ipp-strings.c:3728
 msgid "printer-state-reasons.sheet-rotator-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Thermistor Failure
-#: locale/ipp-strings.c:3728
+#: locale/ipp-strings.c:3730
 msgid "printer-state-reasons.sheet-rotator-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Timing Failure
-#: locale/ipp-strings.c:3730
+#: locale/ipp-strings.c:3732
 msgid "printer-state-reasons.sheet-rotator-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Turned Off
-#: locale/ipp-strings.c:3732
+#: locale/ipp-strings.c:3734
 msgid "printer-state-reasons.sheet-rotator-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Turned On
-#: locale/ipp-strings.c:3734
+#: locale/ipp-strings.c:3736
 msgid "printer-state-reasons.sheet-rotator-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Under Temperature
-#: locale/ipp-strings.c:3736
+#: locale/ipp-strings.c:3738
 msgid "printer-state-reasons.sheet-rotator-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Unrecoverable Failure
-#: locale/ipp-strings.c:3738
+#: locale/ipp-strings.c:3740
 msgid "printer-state-reasons.sheet-rotator-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Unrecoverable Storage Error
-#: locale/ipp-strings.c:3740
+#: locale/ipp-strings.c:3742
 msgid "printer-state-reasons.sheet-rotator-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Sheet Rotator Warming Up
-#: locale/ipp-strings.c:3742
+#: locale/ipp-strings.c:3744
 msgid "printer-state-reasons.sheet-rotator-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Printer offline
-#: locale/ipp-strings.c:3744
+#: locale/ipp-strings.c:3746
 msgid "printer-state-reasons.shutdown"
 msgstr ""
 
 #. TRANSLATORS: Slitter Added
-#: locale/ipp-strings.c:3746
+#: locale/ipp-strings.c:3748
 msgid "printer-state-reasons.slitter-added"
 msgstr ""
 
 #. TRANSLATORS: Slitter Almost Empty
-#: locale/ipp-strings.c:3748
+#: locale/ipp-strings.c:3750
 msgid "printer-state-reasons.slitter-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Slitter Almost Full
-#: locale/ipp-strings.c:3750
+#: locale/ipp-strings.c:3752
 msgid "printer-state-reasons.slitter-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Slitter At Limit
-#: locale/ipp-strings.c:3752
+#: locale/ipp-strings.c:3754
 msgid "printer-state-reasons.slitter-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Slitter Closed
-#: locale/ipp-strings.c:3754
+#: locale/ipp-strings.c:3756
 msgid "printer-state-reasons.slitter-closed"
 msgstr ""
 
 #. TRANSLATORS: Slitter Configuration Change
-#: locale/ipp-strings.c:3756
+#: locale/ipp-strings.c:3758
 msgid "printer-state-reasons.slitter-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Slitter Cover Closed
-#: locale/ipp-strings.c:3758
+#: locale/ipp-strings.c:3760
 msgid "printer-state-reasons.slitter-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Slitter Cover Open
-#: locale/ipp-strings.c:3760
+#: locale/ipp-strings.c:3762
 msgid "printer-state-reasons.slitter-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Slitter Empty
-#: locale/ipp-strings.c:3762
+#: locale/ipp-strings.c:3764
 msgid "printer-state-reasons.slitter-empty"
 msgstr ""
 
 #. TRANSLATORS: Slitter Full
-#: locale/ipp-strings.c:3764
+#: locale/ipp-strings.c:3766
 msgid "printer-state-reasons.slitter-full"
 msgstr ""
 
 #. TRANSLATORS: Slitter Interlock Closed
-#: locale/ipp-strings.c:3766
+#: locale/ipp-strings.c:3768
 msgid "printer-state-reasons.slitter-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Slitter Interlock Open
-#: locale/ipp-strings.c:3768
+#: locale/ipp-strings.c:3770
 msgid "printer-state-reasons.slitter-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Slitter Jam
-#: locale/ipp-strings.c:3770
+#: locale/ipp-strings.c:3772
 msgid "printer-state-reasons.slitter-jam"
 msgstr ""
 
 #. TRANSLATORS: Slitter Life Almost Over
-#: locale/ipp-strings.c:3772
+#: locale/ipp-strings.c:3774
 msgid "printer-state-reasons.slitter-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Slitter Life Over
-#: locale/ipp-strings.c:3774
+#: locale/ipp-strings.c:3776
 msgid "printer-state-reasons.slitter-life-over"
 msgstr ""
 
 #. TRANSLATORS: Slitter Memory Exhausted
-#: locale/ipp-strings.c:3776
+#: locale/ipp-strings.c:3778
 msgid "printer-state-reasons.slitter-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Slitter Missing
-#: locale/ipp-strings.c:3778
+#: locale/ipp-strings.c:3780
 msgid "printer-state-reasons.slitter-missing"
 msgstr ""
 
 #. TRANSLATORS: Slitter Motor Failure
-#: locale/ipp-strings.c:3780
+#: locale/ipp-strings.c:3782
 msgid "printer-state-reasons.slitter-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Slitter Near Limit
-#: locale/ipp-strings.c:3782
+#: locale/ipp-strings.c:3784
 msgid "printer-state-reasons.slitter-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Slitter Offline
-#: locale/ipp-strings.c:3784
+#: locale/ipp-strings.c:3786
 msgid "printer-state-reasons.slitter-offline"
 msgstr ""
 
 #. TRANSLATORS: Slitter Opened
-#: locale/ipp-strings.c:3786
+#: locale/ipp-strings.c:3788
 msgid "printer-state-reasons.slitter-opened"
 msgstr ""
 
 #. TRANSLATORS: Slitter Over Temperature
-#: locale/ipp-strings.c:3788
+#: locale/ipp-strings.c:3790
 msgid "printer-state-reasons.slitter-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Slitter Power Saver
-#: locale/ipp-strings.c:3790
+#: locale/ipp-strings.c:3792
 msgid "printer-state-reasons.slitter-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Slitter Recoverable Failure
-#: locale/ipp-strings.c:3792
+#: locale/ipp-strings.c:3794
 msgid "printer-state-reasons.slitter-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Slitter Recoverable Storage
-#: locale/ipp-strings.c:3794
+#: locale/ipp-strings.c:3796
 msgid "printer-state-reasons.slitter-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Slitter Removed
-#: locale/ipp-strings.c:3796
+#: locale/ipp-strings.c:3798
 msgid "printer-state-reasons.slitter-removed"
 msgstr ""
 
 #. TRANSLATORS: Slitter Resource Added
-#: locale/ipp-strings.c:3798
+#: locale/ipp-strings.c:3800
 msgid "printer-state-reasons.slitter-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Slitter Resource Removed
-#: locale/ipp-strings.c:3800
+#: locale/ipp-strings.c:3802
 msgid "printer-state-reasons.slitter-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Slitter Thermistor Failure
-#: locale/ipp-strings.c:3802
+#: locale/ipp-strings.c:3804
 msgid "printer-state-reasons.slitter-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Slitter Timing Failure
-#: locale/ipp-strings.c:3804
+#: locale/ipp-strings.c:3806
 msgid "printer-state-reasons.slitter-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Slitter Turned Off
-#: locale/ipp-strings.c:3806
+#: locale/ipp-strings.c:3808
 msgid "printer-state-reasons.slitter-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Slitter Turned On
-#: locale/ipp-strings.c:3808
+#: locale/ipp-strings.c:3810
 msgid "printer-state-reasons.slitter-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Slitter Under Temperature
-#: locale/ipp-strings.c:3810
+#: locale/ipp-strings.c:3812
 msgid "printer-state-reasons.slitter-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Slitter Unrecoverable Failure
-#: locale/ipp-strings.c:3812
+#: locale/ipp-strings.c:3814
 msgid "printer-state-reasons.slitter-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Slitter Unrecoverable Storage Error
-#: locale/ipp-strings.c:3814
+#: locale/ipp-strings.c:3816
 msgid "printer-state-reasons.slitter-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Slitter Warming Up
-#: locale/ipp-strings.c:3816
+#: locale/ipp-strings.c:3818
 msgid "printer-state-reasons.slitter-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Spool Area Full
-#: locale/ipp-strings.c:3818
+#: locale/ipp-strings.c:3820
 msgid "printer-state-reasons.spool-area-full"
 msgstr ""
 
 #. TRANSLATORS: Stacker Added
-#: locale/ipp-strings.c:3820
+#: locale/ipp-strings.c:3822
 msgid "printer-state-reasons.stacker-added"
 msgstr ""
 
 #. TRANSLATORS: Stacker Almost Empty
-#: locale/ipp-strings.c:3822
+#: locale/ipp-strings.c:3824
 msgid "printer-state-reasons.stacker-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Stacker Almost Full
-#: locale/ipp-strings.c:3824
+#: locale/ipp-strings.c:3826
 msgid "printer-state-reasons.stacker-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Stacker At Limit
-#: locale/ipp-strings.c:3826
+#: locale/ipp-strings.c:3828
 msgid "printer-state-reasons.stacker-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Stacker Closed
-#: locale/ipp-strings.c:3828
+#: locale/ipp-strings.c:3830
 msgid "printer-state-reasons.stacker-closed"
 msgstr ""
 
 #. TRANSLATORS: Stacker Configuration Change
-#: locale/ipp-strings.c:3830
+#: locale/ipp-strings.c:3832
 msgid "printer-state-reasons.stacker-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Stacker Cover Closed
-#: locale/ipp-strings.c:3832
+#: locale/ipp-strings.c:3834
 msgid "printer-state-reasons.stacker-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Stacker Cover Open
-#: locale/ipp-strings.c:3834
+#: locale/ipp-strings.c:3836
 msgid "printer-state-reasons.stacker-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Stacker Empty
-#: locale/ipp-strings.c:3836
+#: locale/ipp-strings.c:3838
 msgid "printer-state-reasons.stacker-empty"
 msgstr ""
 
 #. TRANSLATORS: Stacker Full
-#: locale/ipp-strings.c:3838
+#: locale/ipp-strings.c:3840
 msgid "printer-state-reasons.stacker-full"
 msgstr ""
 
 #. TRANSLATORS: Stacker Interlock Closed
-#: locale/ipp-strings.c:3840
+#: locale/ipp-strings.c:3842
 msgid "printer-state-reasons.stacker-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Stacker Interlock Open
-#: locale/ipp-strings.c:3842
+#: locale/ipp-strings.c:3844
 msgid "printer-state-reasons.stacker-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Stacker Jam
-#: locale/ipp-strings.c:3844
+#: locale/ipp-strings.c:3846
 msgid "printer-state-reasons.stacker-jam"
 msgstr ""
 
 #. TRANSLATORS: Stacker Life Almost Over
-#: locale/ipp-strings.c:3846
+#: locale/ipp-strings.c:3848
 msgid "printer-state-reasons.stacker-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Stacker Life Over
-#: locale/ipp-strings.c:3848
+#: locale/ipp-strings.c:3850
 msgid "printer-state-reasons.stacker-life-over"
 msgstr ""
 
 #. TRANSLATORS: Stacker Memory Exhausted
-#: locale/ipp-strings.c:3850
+#: locale/ipp-strings.c:3852
 msgid "printer-state-reasons.stacker-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Stacker Missing
-#: locale/ipp-strings.c:3852
+#: locale/ipp-strings.c:3854
 msgid "printer-state-reasons.stacker-missing"
 msgstr ""
 
 #. TRANSLATORS: Stacker Motor Failure
-#: locale/ipp-strings.c:3854
+#: locale/ipp-strings.c:3856
 msgid "printer-state-reasons.stacker-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Stacker Near Limit
-#: locale/ipp-strings.c:3856
+#: locale/ipp-strings.c:3858
 msgid "printer-state-reasons.stacker-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Stacker Offline
-#: locale/ipp-strings.c:3858
+#: locale/ipp-strings.c:3860
 msgid "printer-state-reasons.stacker-offline"
 msgstr ""
 
 #. TRANSLATORS: Stacker Opened
-#: locale/ipp-strings.c:3860
+#: locale/ipp-strings.c:3862
 msgid "printer-state-reasons.stacker-opened"
 msgstr ""
 
 #. TRANSLATORS: Stacker Over Temperature
-#: locale/ipp-strings.c:3862
+#: locale/ipp-strings.c:3864
 msgid "printer-state-reasons.stacker-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Stacker Power Saver
-#: locale/ipp-strings.c:3864
+#: locale/ipp-strings.c:3866
 msgid "printer-state-reasons.stacker-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Stacker Recoverable Failure
-#: locale/ipp-strings.c:3866
+#: locale/ipp-strings.c:3868
 msgid "printer-state-reasons.stacker-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Stacker Recoverable Storage
-#: locale/ipp-strings.c:3868
+#: locale/ipp-strings.c:3870
 msgid "printer-state-reasons.stacker-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Stacker Removed
-#: locale/ipp-strings.c:3870
+#: locale/ipp-strings.c:3872
 msgid "printer-state-reasons.stacker-removed"
 msgstr ""
 
 #. TRANSLATORS: Stacker Resource Added
-#: locale/ipp-strings.c:3872
+#: locale/ipp-strings.c:3874
 msgid "printer-state-reasons.stacker-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Stacker Resource Removed
-#: locale/ipp-strings.c:3874
+#: locale/ipp-strings.c:3876
 msgid "printer-state-reasons.stacker-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Stacker Thermistor Failure
-#: locale/ipp-strings.c:3876
+#: locale/ipp-strings.c:3878
 msgid "printer-state-reasons.stacker-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Stacker Timing Failure
-#: locale/ipp-strings.c:3878
+#: locale/ipp-strings.c:3880
 msgid "printer-state-reasons.stacker-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Stacker Turned Off
-#: locale/ipp-strings.c:3880
+#: locale/ipp-strings.c:3882
 msgid "printer-state-reasons.stacker-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Stacker Turned On
-#: locale/ipp-strings.c:3882
+#: locale/ipp-strings.c:3884
 msgid "printer-state-reasons.stacker-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Stacker Under Temperature
-#: locale/ipp-strings.c:3884
+#: locale/ipp-strings.c:3886
 msgid "printer-state-reasons.stacker-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Stacker Unrecoverable Failure
-#: locale/ipp-strings.c:3886
+#: locale/ipp-strings.c:3888
 msgid "printer-state-reasons.stacker-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Stacker Unrecoverable Storage Error
-#: locale/ipp-strings.c:3888
+#: locale/ipp-strings.c:3890
 msgid "printer-state-reasons.stacker-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Stacker Warming Up
-#: locale/ipp-strings.c:3890
+#: locale/ipp-strings.c:3892
 msgid "printer-state-reasons.stacker-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Stapler Added
-#: locale/ipp-strings.c:3892
+#: locale/ipp-strings.c:3894
 msgid "printer-state-reasons.stapler-added"
 msgstr ""
 
 #. TRANSLATORS: Stapler Almost Empty
-#: locale/ipp-strings.c:3894
+#: locale/ipp-strings.c:3896
 msgid "printer-state-reasons.stapler-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Stapler Almost Full
-#: locale/ipp-strings.c:3896
+#: locale/ipp-strings.c:3898
 msgid "printer-state-reasons.stapler-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Stapler At Limit
-#: locale/ipp-strings.c:3898
+#: locale/ipp-strings.c:3900
 msgid "printer-state-reasons.stapler-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Stapler Closed
-#: locale/ipp-strings.c:3900
+#: locale/ipp-strings.c:3902
 msgid "printer-state-reasons.stapler-closed"
 msgstr ""
 
 #. TRANSLATORS: Stapler Configuration Change
-#: locale/ipp-strings.c:3902
+#: locale/ipp-strings.c:3904
 msgid "printer-state-reasons.stapler-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Stapler Cover Closed
-#: locale/ipp-strings.c:3904
+#: locale/ipp-strings.c:3906
 msgid "printer-state-reasons.stapler-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Stapler Cover Open
-#: locale/ipp-strings.c:3906
+#: locale/ipp-strings.c:3908
 msgid "printer-state-reasons.stapler-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Stapler Empty
-#: locale/ipp-strings.c:3908
+#: locale/ipp-strings.c:3910
 msgid "printer-state-reasons.stapler-empty"
 msgstr ""
 
 #. TRANSLATORS: Stapler Full
-#: locale/ipp-strings.c:3910
+#: locale/ipp-strings.c:3912
 msgid "printer-state-reasons.stapler-full"
 msgstr ""
 
 #. TRANSLATORS: Stapler Interlock Closed
-#: locale/ipp-strings.c:3912
+#: locale/ipp-strings.c:3914
 msgid "printer-state-reasons.stapler-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Stapler Interlock Open
-#: locale/ipp-strings.c:3914
+#: locale/ipp-strings.c:3916
 msgid "printer-state-reasons.stapler-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Stapler Jam
-#: locale/ipp-strings.c:3916
+#: locale/ipp-strings.c:3918
 msgid "printer-state-reasons.stapler-jam"
 msgstr ""
 
 #. TRANSLATORS: Stapler Life Almost Over
-#: locale/ipp-strings.c:3918
+#: locale/ipp-strings.c:3920
 msgid "printer-state-reasons.stapler-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Stapler Life Over
-#: locale/ipp-strings.c:3920
+#: locale/ipp-strings.c:3922
 msgid "printer-state-reasons.stapler-life-over"
 msgstr ""
 
 #. TRANSLATORS: Stapler Memory Exhausted
-#: locale/ipp-strings.c:3922
+#: locale/ipp-strings.c:3924
 msgid "printer-state-reasons.stapler-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Stapler Missing
-#: locale/ipp-strings.c:3924
+#: locale/ipp-strings.c:3926
 msgid "printer-state-reasons.stapler-missing"
 msgstr ""
 
 #. TRANSLATORS: Stapler Motor Failure
-#: locale/ipp-strings.c:3926
+#: locale/ipp-strings.c:3928
 msgid "printer-state-reasons.stapler-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Stapler Near Limit
-#: locale/ipp-strings.c:3928
+#: locale/ipp-strings.c:3930
 msgid "printer-state-reasons.stapler-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Stapler Offline
-#: locale/ipp-strings.c:3930
+#: locale/ipp-strings.c:3932
 msgid "printer-state-reasons.stapler-offline"
 msgstr ""
 
 #. TRANSLATORS: Stapler Opened
-#: locale/ipp-strings.c:3932
+#: locale/ipp-strings.c:3934
 msgid "printer-state-reasons.stapler-opened"
 msgstr ""
 
 #. TRANSLATORS: Stapler Over Temperature
-#: locale/ipp-strings.c:3934
+#: locale/ipp-strings.c:3936
 msgid "printer-state-reasons.stapler-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Stapler Power Saver
-#: locale/ipp-strings.c:3936
+#: locale/ipp-strings.c:3938
 msgid "printer-state-reasons.stapler-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Stapler Recoverable Failure
-#: locale/ipp-strings.c:3938
+#: locale/ipp-strings.c:3940
 msgid "printer-state-reasons.stapler-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Stapler Recoverable Storage
-#: locale/ipp-strings.c:3940
+#: locale/ipp-strings.c:3942
 msgid "printer-state-reasons.stapler-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Stapler Removed
-#: locale/ipp-strings.c:3942
+#: locale/ipp-strings.c:3944
 msgid "printer-state-reasons.stapler-removed"
 msgstr ""
 
 #. TRANSLATORS: Stapler Resource Added
-#: locale/ipp-strings.c:3944
+#: locale/ipp-strings.c:3946
 msgid "printer-state-reasons.stapler-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Stapler Resource Removed
-#: locale/ipp-strings.c:3946
+#: locale/ipp-strings.c:3948
 msgid "printer-state-reasons.stapler-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Stapler Thermistor Failure
-#: locale/ipp-strings.c:3948
+#: locale/ipp-strings.c:3950
 msgid "printer-state-reasons.stapler-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Stapler Timing Failure
-#: locale/ipp-strings.c:3950
+#: locale/ipp-strings.c:3952
 msgid "printer-state-reasons.stapler-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Stapler Turned Off
-#: locale/ipp-strings.c:3952
+#: locale/ipp-strings.c:3954
 msgid "printer-state-reasons.stapler-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Stapler Turned On
-#: locale/ipp-strings.c:3954
+#: locale/ipp-strings.c:3956
 msgid "printer-state-reasons.stapler-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Stapler Under Temperature
-#: locale/ipp-strings.c:3956
+#: locale/ipp-strings.c:3958
 msgid "printer-state-reasons.stapler-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Stapler Unrecoverable Failure
-#: locale/ipp-strings.c:3958
+#: locale/ipp-strings.c:3960
 msgid "printer-state-reasons.stapler-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Stapler Unrecoverable Storage Error
-#: locale/ipp-strings.c:3960
+#: locale/ipp-strings.c:3962
 msgid "printer-state-reasons.stapler-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Stapler Warming Up
-#: locale/ipp-strings.c:3962
+#: locale/ipp-strings.c:3964
 msgid "printer-state-reasons.stapler-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Added
-#: locale/ipp-strings.c:3964
+#: locale/ipp-strings.c:3966
 msgid "printer-state-reasons.stitcher-added"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Almost Empty
-#: locale/ipp-strings.c:3966
+#: locale/ipp-strings.c:3968
 msgid "printer-state-reasons.stitcher-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Almost Full
-#: locale/ipp-strings.c:3968
+#: locale/ipp-strings.c:3970
 msgid "printer-state-reasons.stitcher-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Stitcher At Limit
-#: locale/ipp-strings.c:3970
+#: locale/ipp-strings.c:3972
 msgid "printer-state-reasons.stitcher-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Closed
-#: locale/ipp-strings.c:3972
+#: locale/ipp-strings.c:3974
 msgid "printer-state-reasons.stitcher-closed"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Configuration Change
-#: locale/ipp-strings.c:3974
+#: locale/ipp-strings.c:3976
 msgid "printer-state-reasons.stitcher-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Cover Closed
-#: locale/ipp-strings.c:3976
+#: locale/ipp-strings.c:3978
 msgid "printer-state-reasons.stitcher-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Cover Open
-#: locale/ipp-strings.c:3978
+#: locale/ipp-strings.c:3980
 msgid "printer-state-reasons.stitcher-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Empty
-#: locale/ipp-strings.c:3980
+#: locale/ipp-strings.c:3982
 msgid "printer-state-reasons.stitcher-empty"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Full
-#: locale/ipp-strings.c:3982
+#: locale/ipp-strings.c:3984
 msgid "printer-state-reasons.stitcher-full"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Interlock Closed
-#: locale/ipp-strings.c:3984
+#: locale/ipp-strings.c:3986
 msgid "printer-state-reasons.stitcher-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Interlock Open
-#: locale/ipp-strings.c:3986
+#: locale/ipp-strings.c:3988
 msgid "printer-state-reasons.stitcher-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Jam
-#: locale/ipp-strings.c:3988
+#: locale/ipp-strings.c:3990
 msgid "printer-state-reasons.stitcher-jam"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Life Almost Over
-#: locale/ipp-strings.c:3990
+#: locale/ipp-strings.c:3992
 msgid "printer-state-reasons.stitcher-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Life Over
-#: locale/ipp-strings.c:3992
+#: locale/ipp-strings.c:3994
 msgid "printer-state-reasons.stitcher-life-over"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Memory Exhausted
-#: locale/ipp-strings.c:3994
+#: locale/ipp-strings.c:3996
 msgid "printer-state-reasons.stitcher-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Missing
-#: locale/ipp-strings.c:3996
+#: locale/ipp-strings.c:3998
 msgid "printer-state-reasons.stitcher-missing"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Motor Failure
-#: locale/ipp-strings.c:3998
+#: locale/ipp-strings.c:4000
 msgid "printer-state-reasons.stitcher-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Near Limit
-#: locale/ipp-strings.c:4000
+#: locale/ipp-strings.c:4002
 msgid "printer-state-reasons.stitcher-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Offline
-#: locale/ipp-strings.c:4002
+#: locale/ipp-strings.c:4004
 msgid "printer-state-reasons.stitcher-offline"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Opened
-#: locale/ipp-strings.c:4004
+#: locale/ipp-strings.c:4006
 msgid "printer-state-reasons.stitcher-opened"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Over Temperature
-#: locale/ipp-strings.c:4006
+#: locale/ipp-strings.c:4008
 msgid "printer-state-reasons.stitcher-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Power Saver
-#: locale/ipp-strings.c:4008
+#: locale/ipp-strings.c:4010
 msgid "printer-state-reasons.stitcher-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Recoverable Failure
-#: locale/ipp-strings.c:4010
+#: locale/ipp-strings.c:4012
 msgid "printer-state-reasons.stitcher-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Recoverable Storage
-#: locale/ipp-strings.c:4012
+#: locale/ipp-strings.c:4014
 msgid "printer-state-reasons.stitcher-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Removed
-#: locale/ipp-strings.c:4014
+#: locale/ipp-strings.c:4016
 msgid "printer-state-reasons.stitcher-removed"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Resource Added
-#: locale/ipp-strings.c:4016
+#: locale/ipp-strings.c:4018
 msgid "printer-state-reasons.stitcher-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Resource Removed
-#: locale/ipp-strings.c:4018
+#: locale/ipp-strings.c:4020
 msgid "printer-state-reasons.stitcher-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Thermistor Failure
-#: locale/ipp-strings.c:4020
+#: locale/ipp-strings.c:4022
 msgid "printer-state-reasons.stitcher-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Timing Failure
-#: locale/ipp-strings.c:4022
+#: locale/ipp-strings.c:4024
 msgid "printer-state-reasons.stitcher-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Turned Off
-#: locale/ipp-strings.c:4024
+#: locale/ipp-strings.c:4026
 msgid "printer-state-reasons.stitcher-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Turned On
-#: locale/ipp-strings.c:4026
+#: locale/ipp-strings.c:4028
 msgid "printer-state-reasons.stitcher-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Under Temperature
-#: locale/ipp-strings.c:4028
+#: locale/ipp-strings.c:4030
 msgid "printer-state-reasons.stitcher-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Unrecoverable Failure
-#: locale/ipp-strings.c:4030
+#: locale/ipp-strings.c:4032
 msgid "printer-state-reasons.stitcher-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Unrecoverable Storage Error
-#: locale/ipp-strings.c:4032
+#: locale/ipp-strings.c:4034
 msgid "printer-state-reasons.stitcher-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Stitcher Warming Up
-#: locale/ipp-strings.c:4034
+#: locale/ipp-strings.c:4036
 msgid "printer-state-reasons.stitcher-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Partially stopped
-#: locale/ipp-strings.c:4036
+#: locale/ipp-strings.c:4038
 msgid "printer-state-reasons.stopped-partly"
 msgstr ""
 
 #. TRANSLATORS: Stopping
-#: locale/ipp-strings.c:4038
+#: locale/ipp-strings.c:4040
 msgid "printer-state-reasons.stopping"
 msgstr ""
 
 #. TRANSLATORS: Subunit Added
-#: locale/ipp-strings.c:4040
+#: locale/ipp-strings.c:4042
 msgid "printer-state-reasons.subunit-added"
 msgstr ""
 
 #. TRANSLATORS: Subunit Almost Empty
-#: locale/ipp-strings.c:4042
+#: locale/ipp-strings.c:4044
 msgid "printer-state-reasons.subunit-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Subunit Almost Full
-#: locale/ipp-strings.c:4044
+#: locale/ipp-strings.c:4046
 msgid "printer-state-reasons.subunit-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Subunit At Limit
-#: locale/ipp-strings.c:4046
+#: locale/ipp-strings.c:4048
 msgid "printer-state-reasons.subunit-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Subunit Closed
-#: locale/ipp-strings.c:4048
+#: locale/ipp-strings.c:4050
 msgid "printer-state-reasons.subunit-closed"
 msgstr ""
 
 #. TRANSLATORS: Subunit Cooling Down
-#: locale/ipp-strings.c:4050
+#: locale/ipp-strings.c:4052
 msgid "printer-state-reasons.subunit-cooling-down"
 msgstr ""
 
 #. TRANSLATORS: Subunit Empty
-#: locale/ipp-strings.c:4052
+#: locale/ipp-strings.c:4054
 msgid "printer-state-reasons.subunit-empty"
 msgstr ""
 
 #. TRANSLATORS: Subunit Full
-#: locale/ipp-strings.c:4054
+#: locale/ipp-strings.c:4056
 msgid "printer-state-reasons.subunit-full"
 msgstr ""
 
 #. TRANSLATORS: Subunit Life Almost Over
-#: locale/ipp-strings.c:4056
+#: locale/ipp-strings.c:4058
 msgid "printer-state-reasons.subunit-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Subunit Life Over
-#: locale/ipp-strings.c:4058
+#: locale/ipp-strings.c:4060
 msgid "printer-state-reasons.subunit-life-over"
 msgstr ""
 
 #. TRANSLATORS: Subunit Memory Exhausted
-#: locale/ipp-strings.c:4060
+#: locale/ipp-strings.c:4062
 msgid "printer-state-reasons.subunit-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Subunit Missing
-#: locale/ipp-strings.c:4062
+#: locale/ipp-strings.c:4064
 msgid "printer-state-reasons.subunit-missing"
 msgstr ""
 
 #. TRANSLATORS: Subunit Motor Failure
-#: locale/ipp-strings.c:4064
+#: locale/ipp-strings.c:4066
 msgid "printer-state-reasons.subunit-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Subunit Near Limit
-#: locale/ipp-strings.c:4066
+#: locale/ipp-strings.c:4068
 msgid "printer-state-reasons.subunit-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Subunit Offline
-#: locale/ipp-strings.c:4068
+#: locale/ipp-strings.c:4070
 msgid "printer-state-reasons.subunit-offline"
 msgstr ""
 
 #. TRANSLATORS: Subunit Opened
-#: locale/ipp-strings.c:4070
+#: locale/ipp-strings.c:4072
 msgid "printer-state-reasons.subunit-opened"
 msgstr ""
 
 #. TRANSLATORS: Subunit Over Temperature
-#: locale/ipp-strings.c:4072
+#: locale/ipp-strings.c:4074
 msgid "printer-state-reasons.subunit-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Subunit Power Saver
-#: locale/ipp-strings.c:4074
+#: locale/ipp-strings.c:4076
 msgid "printer-state-reasons.subunit-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Subunit Recoverable Failure
-#: locale/ipp-strings.c:4076
+#: locale/ipp-strings.c:4078
 msgid "printer-state-reasons.subunit-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Subunit Recoverable Storage
-#: locale/ipp-strings.c:4078
+#: locale/ipp-strings.c:4080
 msgid "printer-state-reasons.subunit-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Subunit Removed
-#: locale/ipp-strings.c:4080
+#: locale/ipp-strings.c:4082
 msgid "printer-state-reasons.subunit-removed"
 msgstr ""
 
 #. TRANSLATORS: Subunit Resource Added
-#: locale/ipp-strings.c:4082
+#: locale/ipp-strings.c:4084
 msgid "printer-state-reasons.subunit-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Subunit Resource Removed
-#: locale/ipp-strings.c:4084
+#: locale/ipp-strings.c:4086
 msgid "printer-state-reasons.subunit-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Subunit Thermistor Failure
-#: locale/ipp-strings.c:4086
+#: locale/ipp-strings.c:4088
 msgid "printer-state-reasons.subunit-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Subunit Timing Failure
-#: locale/ipp-strings.c:4088
+#: locale/ipp-strings.c:4090
 msgid "printer-state-reasons.subunit-timing-Failure"
 msgstr ""
 
 #. TRANSLATORS: Subunit Turned Off
-#: locale/ipp-strings.c:4090
+#: locale/ipp-strings.c:4092
 msgid "printer-state-reasons.subunit-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Subunit Turned On
-#: locale/ipp-strings.c:4092
+#: locale/ipp-strings.c:4094
 msgid "printer-state-reasons.subunit-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Subunit Under Temperature
-#: locale/ipp-strings.c:4094
+#: locale/ipp-strings.c:4096
 msgid "printer-state-reasons.subunit-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Subunit Unrecoverable Failure
-#: locale/ipp-strings.c:4096
+#: locale/ipp-strings.c:4098
 msgid "printer-state-reasons.subunit-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Subunit Unrecoverable Storage
-#: locale/ipp-strings.c:4098
+#: locale/ipp-strings.c:4100
 msgid "printer-state-reasons.subunit-unrecoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Subunit Warming Up
-#: locale/ipp-strings.c:4100
+#: locale/ipp-strings.c:4102
 msgid "printer-state-reasons.subunit-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Printer stopped responding
-#: locale/ipp-strings.c:4102
+#: locale/ipp-strings.c:4104
 msgid "printer-state-reasons.timed-out"
 msgstr ""
 
 #. TRANSLATORS: Out of toner
-#: locale/ipp-strings.c:4104
+#: locale/ipp-strings.c:4106
 msgid "printer-state-reasons.toner-empty"
 msgstr ""
 
 #. TRANSLATORS: Toner low
-#: locale/ipp-strings.c:4106
+#: locale/ipp-strings.c:4108
 msgid "printer-state-reasons.toner-low"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Added
-#: locale/ipp-strings.c:4108
+#: locale/ipp-strings.c:4110
 msgid "printer-state-reasons.trimmer-added"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Almost Empty
-#: locale/ipp-strings.c:4110
+#: locale/ipp-strings.c:4112
 msgid "printer-state-reasons.trimmer-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Almost Full
-#: locale/ipp-strings.c:4112
+#: locale/ipp-strings.c:4114
 msgid "printer-state-reasons.trimmer-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Trimmer At Limit
-#: locale/ipp-strings.c:4114
+#: locale/ipp-strings.c:4116
 msgid "printer-state-reasons.trimmer-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Closed
-#: locale/ipp-strings.c:4116
+#: locale/ipp-strings.c:4118
 msgid "printer-state-reasons.trimmer-closed"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Configuration Change
-#: locale/ipp-strings.c:4118
+#: locale/ipp-strings.c:4120
 msgid "printer-state-reasons.trimmer-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Cover Closed
-#: locale/ipp-strings.c:4120
+#: locale/ipp-strings.c:4122
 msgid "printer-state-reasons.trimmer-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Cover Open
-#: locale/ipp-strings.c:4122
+#: locale/ipp-strings.c:4124
 msgid "printer-state-reasons.trimmer-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Empty
-#: locale/ipp-strings.c:4124
+#: locale/ipp-strings.c:4126
 msgid "printer-state-reasons.trimmer-empty"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Full
-#: locale/ipp-strings.c:4126
+#: locale/ipp-strings.c:4128
 msgid "printer-state-reasons.trimmer-full"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Interlock Closed
-#: locale/ipp-strings.c:4128
+#: locale/ipp-strings.c:4130
 msgid "printer-state-reasons.trimmer-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Interlock Open
-#: locale/ipp-strings.c:4130
+#: locale/ipp-strings.c:4132
 msgid "printer-state-reasons.trimmer-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Jam
-#: locale/ipp-strings.c:4132
+#: locale/ipp-strings.c:4134
 msgid "printer-state-reasons.trimmer-jam"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Life Almost Over
-#: locale/ipp-strings.c:4134
+#: locale/ipp-strings.c:4136
 msgid "printer-state-reasons.trimmer-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Life Over
-#: locale/ipp-strings.c:4136
+#: locale/ipp-strings.c:4138
 msgid "printer-state-reasons.trimmer-life-over"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Memory Exhausted
-#: locale/ipp-strings.c:4138
+#: locale/ipp-strings.c:4140
 msgid "printer-state-reasons.trimmer-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Missing
-#: locale/ipp-strings.c:4140
+#: locale/ipp-strings.c:4142
 msgid "printer-state-reasons.trimmer-missing"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Motor Failure
-#: locale/ipp-strings.c:4142
+#: locale/ipp-strings.c:4144
 msgid "printer-state-reasons.trimmer-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Near Limit
-#: locale/ipp-strings.c:4144
+#: locale/ipp-strings.c:4146
 msgid "printer-state-reasons.trimmer-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Offline
-#: locale/ipp-strings.c:4146
+#: locale/ipp-strings.c:4148
 msgid "printer-state-reasons.trimmer-offline"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Opened
-#: locale/ipp-strings.c:4148
+#: locale/ipp-strings.c:4150
 msgid "printer-state-reasons.trimmer-opened"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Over Temperature
-#: locale/ipp-strings.c:4150
+#: locale/ipp-strings.c:4152
 msgid "printer-state-reasons.trimmer-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Power Saver
-#: locale/ipp-strings.c:4152
+#: locale/ipp-strings.c:4154
 msgid "printer-state-reasons.trimmer-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Recoverable Failure
-#: locale/ipp-strings.c:4154
+#: locale/ipp-strings.c:4156
 msgid "printer-state-reasons.trimmer-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Recoverable Storage
-#: locale/ipp-strings.c:4156
+#: locale/ipp-strings.c:4158
 msgid "printer-state-reasons.trimmer-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Removed
-#: locale/ipp-strings.c:4158
+#: locale/ipp-strings.c:4160
 msgid "printer-state-reasons.trimmer-removed"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Resource Added
-#: locale/ipp-strings.c:4160
+#: locale/ipp-strings.c:4162
 msgid "printer-state-reasons.trimmer-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Resource Removed
-#: locale/ipp-strings.c:4162
+#: locale/ipp-strings.c:4164
 msgid "printer-state-reasons.trimmer-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Thermistor Failure
-#: locale/ipp-strings.c:4164
+#: locale/ipp-strings.c:4166
 msgid "printer-state-reasons.trimmer-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Timing Failure
-#: locale/ipp-strings.c:4166
+#: locale/ipp-strings.c:4168
 msgid "printer-state-reasons.trimmer-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Turned Off
-#: locale/ipp-strings.c:4168
+#: locale/ipp-strings.c:4170
 msgid "printer-state-reasons.trimmer-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Turned On
-#: locale/ipp-strings.c:4170
+#: locale/ipp-strings.c:4172
 msgid "printer-state-reasons.trimmer-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Under Temperature
-#: locale/ipp-strings.c:4172
+#: locale/ipp-strings.c:4174
 msgid "printer-state-reasons.trimmer-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Unrecoverable Failure
-#: locale/ipp-strings.c:4174
+#: locale/ipp-strings.c:4176
 msgid "printer-state-reasons.trimmer-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Unrecoverable Storage Error
-#: locale/ipp-strings.c:4176
+#: locale/ipp-strings.c:4178
 msgid "printer-state-reasons.trimmer-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Trimmer Warming Up
-#: locale/ipp-strings.c:4178
+#: locale/ipp-strings.c:4180
 msgid "printer-state-reasons.trimmer-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Unknown
-#: locale/ipp-strings.c:4180
+#: locale/ipp-strings.c:4182
 msgid "printer-state-reasons.unknown"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Added
-#: locale/ipp-strings.c:4182
+#: locale/ipp-strings.c:4184
 msgid "printer-state-reasons.wrapper-added"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Almost Empty
-#: locale/ipp-strings.c:4184
+#: locale/ipp-strings.c:4186
 msgid "printer-state-reasons.wrapper-almost-empty"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Almost Full
-#: locale/ipp-strings.c:4186
+#: locale/ipp-strings.c:4188
 msgid "printer-state-reasons.wrapper-almost-full"
 msgstr ""
 
 #. TRANSLATORS: Wrapper At Limit
-#: locale/ipp-strings.c:4188
+#: locale/ipp-strings.c:4190
 msgid "printer-state-reasons.wrapper-at-limit"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Closed
-#: locale/ipp-strings.c:4190
+#: locale/ipp-strings.c:4192
 msgid "printer-state-reasons.wrapper-closed"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Configuration Change
-#: locale/ipp-strings.c:4192
+#: locale/ipp-strings.c:4194
 msgid "printer-state-reasons.wrapper-configuration-change"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Cover Closed
-#: locale/ipp-strings.c:4194
+#: locale/ipp-strings.c:4196
 msgid "printer-state-reasons.wrapper-cover-closed"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Cover Open
-#: locale/ipp-strings.c:4196
+#: locale/ipp-strings.c:4198
 msgid "printer-state-reasons.wrapper-cover-open"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Empty
-#: locale/ipp-strings.c:4198
+#: locale/ipp-strings.c:4200
 msgid "printer-state-reasons.wrapper-empty"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Full
-#: locale/ipp-strings.c:4200
+#: locale/ipp-strings.c:4202
 msgid "printer-state-reasons.wrapper-full"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Interlock Closed
-#: locale/ipp-strings.c:4202
+#: locale/ipp-strings.c:4204
 msgid "printer-state-reasons.wrapper-interlock-closed"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Interlock Open
-#: locale/ipp-strings.c:4204
+#: locale/ipp-strings.c:4206
 msgid "printer-state-reasons.wrapper-interlock-open"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Jam
-#: locale/ipp-strings.c:4206
+#: locale/ipp-strings.c:4208
 msgid "printer-state-reasons.wrapper-jam"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Life Almost Over
-#: locale/ipp-strings.c:4208
+#: locale/ipp-strings.c:4210
 msgid "printer-state-reasons.wrapper-life-almost-over"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Life Over
-#: locale/ipp-strings.c:4210
+#: locale/ipp-strings.c:4212
 msgid "printer-state-reasons.wrapper-life-over"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Memory Exhausted
-#: locale/ipp-strings.c:4212
+#: locale/ipp-strings.c:4214
 msgid "printer-state-reasons.wrapper-memory-exhausted"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Missing
-#: locale/ipp-strings.c:4214
+#: locale/ipp-strings.c:4216
 msgid "printer-state-reasons.wrapper-missing"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Motor Failure
-#: locale/ipp-strings.c:4216
+#: locale/ipp-strings.c:4218
 msgid "printer-state-reasons.wrapper-motor-failure"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Near Limit
-#: locale/ipp-strings.c:4218
+#: locale/ipp-strings.c:4220
 msgid "printer-state-reasons.wrapper-near-limit"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Offline
-#: locale/ipp-strings.c:4220
+#: locale/ipp-strings.c:4222
 msgid "printer-state-reasons.wrapper-offline"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Opened
-#: locale/ipp-strings.c:4222
+#: locale/ipp-strings.c:4224
 msgid "printer-state-reasons.wrapper-opened"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Over Temperature
-#: locale/ipp-strings.c:4224
+#: locale/ipp-strings.c:4226
 msgid "printer-state-reasons.wrapper-over-temperature"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Power Saver
-#: locale/ipp-strings.c:4226
+#: locale/ipp-strings.c:4228
 msgid "printer-state-reasons.wrapper-power-saver"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Recoverable Failure
-#: locale/ipp-strings.c:4228
+#: locale/ipp-strings.c:4230
 msgid "printer-state-reasons.wrapper-recoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Recoverable Storage
-#: locale/ipp-strings.c:4230
+#: locale/ipp-strings.c:4232
 msgid "printer-state-reasons.wrapper-recoverable-storage"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Removed
-#: locale/ipp-strings.c:4232
+#: locale/ipp-strings.c:4234
 msgid "printer-state-reasons.wrapper-removed"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Resource Added
-#: locale/ipp-strings.c:4234
+#: locale/ipp-strings.c:4236
 msgid "printer-state-reasons.wrapper-resource-added"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Resource Removed
-#: locale/ipp-strings.c:4236
+#: locale/ipp-strings.c:4238
 msgid "printer-state-reasons.wrapper-resource-removed"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Thermistor Failure
-#: locale/ipp-strings.c:4238
+#: locale/ipp-strings.c:4240
 msgid "printer-state-reasons.wrapper-thermistor-failure"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Timing Failure
-#: locale/ipp-strings.c:4240
+#: locale/ipp-strings.c:4242
 msgid "printer-state-reasons.wrapper-timing-failure"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Turned Off
-#: locale/ipp-strings.c:4242
+#: locale/ipp-strings.c:4244
 msgid "printer-state-reasons.wrapper-turned-off"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Turned On
-#: locale/ipp-strings.c:4244
+#: locale/ipp-strings.c:4246
 msgid "printer-state-reasons.wrapper-turned-on"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Under Temperature
-#: locale/ipp-strings.c:4246
+#: locale/ipp-strings.c:4248
 msgid "printer-state-reasons.wrapper-under-temperature"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Unrecoverable Failure
-#: locale/ipp-strings.c:4248
+#: locale/ipp-strings.c:4250
 msgid "printer-state-reasons.wrapper-unrecoverable-failure"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Unrecoverable Storage Error
-#: locale/ipp-strings.c:4250
+#: locale/ipp-strings.c:4252
 msgid "printer-state-reasons.wrapper-unrecoverable-storage-error"
 msgstr ""
 
 #. TRANSLATORS: Wrapper Warming Up
-#: locale/ipp-strings.c:4252
+#: locale/ipp-strings.c:4254
 msgid "printer-state-reasons.wrapper-warming-up"
 msgstr ""
 
 #. TRANSLATORS: Idle
-#: locale/ipp-strings.c:4254
+#: locale/ipp-strings.c:4256
 msgid "printer-state.3"
 msgstr ""
 
 #. TRANSLATORS: Processing
-#: locale/ipp-strings.c:4256
+#: locale/ipp-strings.c:4258
 msgid "printer-state.4"
 msgstr ""
 
 #. TRANSLATORS: Stopped
-#: locale/ipp-strings.c:4258
+#: locale/ipp-strings.c:4260
 msgid "printer-state.5"
 msgstr ""
 
 #. TRANSLATORS: Printer Uptime
-#: locale/ipp-strings.c:4260
+#: locale/ipp-strings.c:4262
 msgid "printer-up-time"
 msgstr ""
 
@@ -18473,52 +18478,52 @@ msgid "processing"
 msgstr ""
 
 #. TRANSLATORS: Proof Print
-#: locale/ipp-strings.c:4262
+#: locale/ipp-strings.c:4264
 msgid "proof-print"
 msgstr ""
 
 #. TRANSLATORS: Proof Print Copies
-#: locale/ipp-strings.c:4264
+#: locale/ipp-strings.c:4266
 msgid "proof-print-copies"
 msgstr ""
 
 #. TRANSLATORS: Punching
-#: locale/ipp-strings.c:4266
+#: locale/ipp-strings.c:4268
 msgid "punching"
 msgstr ""
 
 #. TRANSLATORS: Punching Locations
-#: locale/ipp-strings.c:4268
+#: locale/ipp-strings.c:4270
 msgid "punching-locations"
 msgstr ""
 
 #. TRANSLATORS: Punching Offset
-#: locale/ipp-strings.c:4270
+#: locale/ipp-strings.c:4272
 msgid "punching-offset"
 msgstr ""
 
 #. TRANSLATORS: Punch Edge
-#: locale/ipp-strings.c:4272
+#: locale/ipp-strings.c:4274
 msgid "punching-reference-edge"
 msgstr ""
 
 #. TRANSLATORS: Bottom
-#: locale/ipp-strings.c:4274
+#: locale/ipp-strings.c:4276
 msgid "punching-reference-edge.bottom"
 msgstr ""
 
 #. TRANSLATORS: Left
-#: locale/ipp-strings.c:4276
+#: locale/ipp-strings.c:4278
 msgid "punching-reference-edge.left"
 msgstr ""
 
 #. TRANSLATORS: Right
-#: locale/ipp-strings.c:4278
+#: locale/ipp-strings.c:4280
 msgid "punching-reference-edge.right"
 msgstr ""
 
 #. TRANSLATORS: Top
-#: locale/ipp-strings.c:4280
+#: locale/ipp-strings.c:4282
 msgid "punching-reference-edge.top"
 msgstr ""
 
@@ -18532,57 +18537,57 @@ msgid "request-id uses indefinite length"
 msgstr ""
 
 #. TRANSLATORS: Requested Attributes
-#: locale/ipp-strings.c:4282
+#: locale/ipp-strings.c:4284
 msgid "requested-attributes"
 msgstr ""
 
 #. TRANSLATORS: Retry Interval
-#: locale/ipp-strings.c:4284
+#: locale/ipp-strings.c:4286
 msgid "retry-interval"
 msgstr ""
 
 #. TRANSLATORS: Retry Timeout
-#: locale/ipp-strings.c:4286
+#: locale/ipp-strings.c:4288
 msgid "retry-time-out"
 msgstr ""
 
 #. TRANSLATORS: Save Disposition
-#: locale/ipp-strings.c:4288
+#: locale/ipp-strings.c:4290
 msgid "save-disposition"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:4290
+#: locale/ipp-strings.c:4292
 msgid "save-disposition.none"
 msgstr ""
 
 #. TRANSLATORS: Print and Save
-#: locale/ipp-strings.c:4292
+#: locale/ipp-strings.c:4294
 msgid "save-disposition.print-save"
 msgstr ""
 
 #. TRANSLATORS: Save Only
-#: locale/ipp-strings.c:4294
+#: locale/ipp-strings.c:4296
 msgid "save-disposition.save-only"
 msgstr ""
 
 #. TRANSLATORS: Save Document Format
-#: locale/ipp-strings.c:4296
+#: locale/ipp-strings.c:4298
 msgid "save-document-format"
 msgstr ""
 
 #. TRANSLATORS: Save Info
-#: locale/ipp-strings.c:4298
+#: locale/ipp-strings.c:4300
 msgid "save-info"
 msgstr ""
 
 #. TRANSLATORS: Save Location
-#: locale/ipp-strings.c:4300
+#: locale/ipp-strings.c:4302
 msgid "save-location"
 msgstr ""
 
 #. TRANSLATORS: Save Name
-#: locale/ipp-strings.c:4302
+#: locale/ipp-strings.c:4304
 msgid "save-name"
 msgstr ""
 
@@ -18595,57 +18600,57 @@ msgid "scheduler is running"
 msgstr ""
 
 #. TRANSLATORS: Separator Sheets
-#: locale/ipp-strings.c:4304
+#: locale/ipp-strings.c:4306
 msgid "separator-sheets"
 msgstr ""
 
 #. TRANSLATORS: Type of Separator Sheets
-#: locale/ipp-strings.c:4306
+#: locale/ipp-strings.c:4308
 msgid "separator-sheets-type"
 msgstr ""
 
 #. TRANSLATORS: Start and End Sheets
-#: locale/ipp-strings.c:4308
+#: locale/ipp-strings.c:4310
 msgid "separator-sheets-type.both-sheets"
 msgstr ""
 
 #. TRANSLATORS: End Sheet
-#: locale/ipp-strings.c:4310
+#: locale/ipp-strings.c:4312
 msgid "separator-sheets-type.end-sheet"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:4312
+#: locale/ipp-strings.c:4314
 msgid "separator-sheets-type.none"
 msgstr ""
 
 #. TRANSLATORS: Slip Sheets
-#: locale/ipp-strings.c:4314
+#: locale/ipp-strings.c:4316
 msgid "separator-sheets-type.slip-sheets"
 msgstr ""
 
 #. TRANSLATORS: Start Sheet
-#: locale/ipp-strings.c:4316
+#: locale/ipp-strings.c:4318
 msgid "separator-sheets-type.start-sheet"
 msgstr ""
 
 #. TRANSLATORS: 2-Sided Printing
-#: locale/ipp-strings.c:4318
+#: locale/ipp-strings.c:4320
 msgid "sides"
 msgstr ""
 
 #. TRANSLATORS: Off
-#: locale/ipp-strings.c:4320
+#: locale/ipp-strings.c:4322
 msgid "sides.one-sided"
 msgstr ""
 
 #. TRANSLATORS: On (Portrait)
-#: locale/ipp-strings.c:4322
+#: locale/ipp-strings.c:4324
 msgid "sides.two-sided-long-edge"
 msgstr ""
 
 #. TRANSLATORS: On (Landscape)
-#: locale/ipp-strings.c:4324
+#: locale/ipp-strings.c:4326
 msgid "sides.two-sided-short-edge"
 msgstr ""
 
@@ -18659,72 +18664,72 @@ msgid "status\t\tShow status of daemon and queue."
 msgstr ""
 
 #. TRANSLATORS: Status Message
-#: locale/ipp-strings.c:4326
+#: locale/ipp-strings.c:4328
 msgid "status-message"
 msgstr ""
 
 #. TRANSLATORS: Staple
-#: locale/ipp-strings.c:4328
+#: locale/ipp-strings.c:4330
 msgid "stitching"
 msgstr ""
 
 #. TRANSLATORS: Stitching Angle
-#: locale/ipp-strings.c:4330
+#: locale/ipp-strings.c:4332
 msgid "stitching-angle"
 msgstr ""
 
 #. TRANSLATORS: Stitching Locations
-#: locale/ipp-strings.c:4332
+#: locale/ipp-strings.c:4334
 msgid "stitching-locations"
 msgstr ""
 
 #. TRANSLATORS: Staple Method
-#: locale/ipp-strings.c:4334
+#: locale/ipp-strings.c:4336
 msgid "stitching-method"
 msgstr ""
 
 #. TRANSLATORS: Automatic
-#: locale/ipp-strings.c:4336
+#: locale/ipp-strings.c:4338
 msgid "stitching-method.auto"
 msgstr ""
 
 #. TRANSLATORS: Crimp
-#: locale/ipp-strings.c:4338
+#: locale/ipp-strings.c:4340
 msgid "stitching-method.crimp"
 msgstr ""
 
 #. TRANSLATORS: Wire
-#: locale/ipp-strings.c:4340
+#: locale/ipp-strings.c:4342
 msgid "stitching-method.wire"
 msgstr ""
 
 #. TRANSLATORS: Stitching Offset
-#: locale/ipp-strings.c:4342
+#: locale/ipp-strings.c:4344
 msgid "stitching-offset"
 msgstr ""
 
 #. TRANSLATORS: Staple Edge
-#: locale/ipp-strings.c:4344
+#: locale/ipp-strings.c:4346
 msgid "stitching-reference-edge"
 msgstr ""
 
 #. TRANSLATORS: Bottom
-#: locale/ipp-strings.c:4346
+#: locale/ipp-strings.c:4348
 msgid "stitching-reference-edge.bottom"
 msgstr ""
 
 #. TRANSLATORS: Left
-#: locale/ipp-strings.c:4348
+#: locale/ipp-strings.c:4350
 msgid "stitching-reference-edge.left"
 msgstr ""
 
 #. TRANSLATORS: Right
-#: locale/ipp-strings.c:4350
+#: locale/ipp-strings.c:4352
 msgid "stitching-reference-edge.right"
 msgstr ""
 
 #. TRANSLATORS: Top
-#: locale/ipp-strings.c:4352
+#: locale/ipp-strings.c:4354
 msgid "stitching-reference-edge.top"
 msgstr ""
 
@@ -18733,62 +18738,62 @@ msgid "stopped"
 msgstr ""
 
 #. TRANSLATORS: Subject
-#: locale/ipp-strings.c:4354
+#: locale/ipp-strings.c:4356
 msgid "subject"
 msgstr ""
 
 #. TRANSLATORS: Subscription Privacy Attributes
-#: locale/ipp-strings.c:4356
+#: locale/ipp-strings.c:4358
 msgid "subscription-privacy-attributes"
 msgstr ""
 
 #. TRANSLATORS: All
-#: locale/ipp-strings.c:4358
+#: locale/ipp-strings.c:4360
 msgid "subscription-privacy-attributes.all"
 msgstr ""
 
 #. TRANSLATORS: Default
-#: locale/ipp-strings.c:4360
+#: locale/ipp-strings.c:4362
 msgid "subscription-privacy-attributes.default"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:4362
+#: locale/ipp-strings.c:4364
 msgid "subscription-privacy-attributes.none"
 msgstr ""
 
 #. TRANSLATORS: Subscription Description
-#: locale/ipp-strings.c:4364
+#: locale/ipp-strings.c:4366
 msgid "subscription-privacy-attributes.subscription-description"
 msgstr ""
 
 #. TRANSLATORS: Subscription Template
-#: locale/ipp-strings.c:4366
+#: locale/ipp-strings.c:4368
 msgid "subscription-privacy-attributes.subscription-template"
 msgstr ""
 
 #. TRANSLATORS: Subscription Privacy Scope
-#: locale/ipp-strings.c:4368
+#: locale/ipp-strings.c:4370
 msgid "subscription-privacy-scope"
 msgstr ""
 
 #. TRANSLATORS: All
-#: locale/ipp-strings.c:4370
+#: locale/ipp-strings.c:4372
 msgid "subscription-privacy-scope.all"
 msgstr ""
 
 #. TRANSLATORS: Default
-#: locale/ipp-strings.c:4372
+#: locale/ipp-strings.c:4374
 msgid "subscription-privacy-scope.default"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:4374
+#: locale/ipp-strings.c:4376
 msgid "subscription-privacy-scope.none"
 msgstr ""
 
 #. TRANSLATORS: Owner
-#: locale/ipp-strings.c:4376
+#: locale/ipp-strings.c:4378
 msgid "subscription-privacy-scope.owner"
 msgstr ""
 
@@ -18803,142 +18808,142 @@ msgid "system default destination: %s/%s"
 msgstr ""
 
 #. TRANSLATORS: T33 Subaddress
-#: locale/ipp-strings.c:4378
+#: locale/ipp-strings.c:4380
 msgid "t33-subaddress"
 msgstr ""
 
 #. TRANSLATORS: To Name
-#: locale/ipp-strings.c:4380
+#: locale/ipp-strings.c:4382
 msgid "to-name"
 msgstr ""
 
 #. TRANSLATORS: Transmission Status
-#: locale/ipp-strings.c:4382
+#: locale/ipp-strings.c:4384
 msgid "transmission-status"
 msgstr ""
 
 #. TRANSLATORS: Pending
-#: locale/ipp-strings.c:4384
+#: locale/ipp-strings.c:4386
 msgid "transmission-status.3"
 msgstr ""
 
 #. TRANSLATORS: Pending Retry
-#: locale/ipp-strings.c:4386
+#: locale/ipp-strings.c:4388
 msgid "transmission-status.4"
 msgstr ""
 
 #. TRANSLATORS: Processing
-#: locale/ipp-strings.c:4388
+#: locale/ipp-strings.c:4390
 msgid "transmission-status.5"
 msgstr ""
 
 #. TRANSLATORS: Canceled
-#: locale/ipp-strings.c:4390
+#: locale/ipp-strings.c:4392
 msgid "transmission-status.7"
 msgstr ""
 
 #. TRANSLATORS: Aborted
-#: locale/ipp-strings.c:4392
+#: locale/ipp-strings.c:4394
 msgid "transmission-status.8"
 msgstr ""
 
 #. TRANSLATORS: Completed
-#: locale/ipp-strings.c:4394
+#: locale/ipp-strings.c:4396
 msgid "transmission-status.9"
 msgstr ""
 
 #. TRANSLATORS: Cut
-#: locale/ipp-strings.c:4396
+#: locale/ipp-strings.c:4398
 msgid "trimming"
 msgstr ""
 
 #. TRANSLATORS: Cut Position
-#: locale/ipp-strings.c:4398
+#: locale/ipp-strings.c:4400
 msgid "trimming-offset"
 msgstr ""
 
 #. TRANSLATORS: Cut Edge
-#: locale/ipp-strings.c:4400
+#: locale/ipp-strings.c:4402
 msgid "trimming-reference-edge"
 msgstr ""
 
 #. TRANSLATORS: Bottom
-#: locale/ipp-strings.c:4402
+#: locale/ipp-strings.c:4404
 msgid "trimming-reference-edge.bottom"
 msgstr ""
 
 #. TRANSLATORS: Left
-#: locale/ipp-strings.c:4404
+#: locale/ipp-strings.c:4406
 msgid "trimming-reference-edge.left"
 msgstr ""
 
 #. TRANSLATORS: Right
-#: locale/ipp-strings.c:4406
+#: locale/ipp-strings.c:4408
 msgid "trimming-reference-edge.right"
 msgstr ""
 
 #. TRANSLATORS: Top
-#: locale/ipp-strings.c:4408
+#: locale/ipp-strings.c:4410
 msgid "trimming-reference-edge.top"
 msgstr ""
 
 #. TRANSLATORS: Type of Cut
-#: locale/ipp-strings.c:4410
+#: locale/ipp-strings.c:4412
 msgid "trimming-type"
 msgstr ""
 
 #. TRANSLATORS: Draw Line
-#: locale/ipp-strings.c:4412
+#: locale/ipp-strings.c:4414
 msgid "trimming-type.draw-line"
 msgstr ""
 
 #. TRANSLATORS: Full
-#: locale/ipp-strings.c:4414
+#: locale/ipp-strings.c:4416
 msgid "trimming-type.full"
 msgstr ""
 
 #. TRANSLATORS: Partial
-#: locale/ipp-strings.c:4416
+#: locale/ipp-strings.c:4418
 msgid "trimming-type.partial"
 msgstr ""
 
 #. TRANSLATORS: Perforate
-#: locale/ipp-strings.c:4418
+#: locale/ipp-strings.c:4420
 msgid "trimming-type.perforate"
 msgstr ""
 
 #. TRANSLATORS: Score
-#: locale/ipp-strings.c:4420
+#: locale/ipp-strings.c:4422
 msgid "trimming-type.score"
 msgstr ""
 
 #. TRANSLATORS: Tab
-#: locale/ipp-strings.c:4422
+#: locale/ipp-strings.c:4424
 msgid "trimming-type.tab"
 msgstr ""
 
 #. TRANSLATORS: Cut After
-#: locale/ipp-strings.c:4424
+#: locale/ipp-strings.c:4426
 msgid "trimming-when"
 msgstr ""
 
 #. TRANSLATORS: Every Document
-#: locale/ipp-strings.c:4426
+#: locale/ipp-strings.c:4428
 msgid "trimming-when.after-documents"
 msgstr ""
 
 #. TRANSLATORS: Job
-#: locale/ipp-strings.c:4428
+#: locale/ipp-strings.c:4430
 msgid "trimming-when.after-job"
 msgstr ""
 
 #. TRANSLATORS: Every Set
-#: locale/ipp-strings.c:4430
+#: locale/ipp-strings.c:4432
 msgid "trimming-when.after-sets"
 msgstr ""
 
 #. TRANSLATORS: Every Page
-#: locale/ipp-strings.c:4432
+#: locale/ipp-strings.c:4434
 msgid "trimming-when.after-sheets"
 msgstr ""
 
@@ -18955,57 +18960,57 @@ msgid "variable-bindings uses indefinite length"
 msgstr ""
 
 #. TRANSLATORS: X Accuracy
-#: locale/ipp-strings.c:4434
+#: locale/ipp-strings.c:4436
 msgid "x-accuracy"
 msgstr ""
 
 #. TRANSLATORS: X Dimension
-#: locale/ipp-strings.c:4436
+#: locale/ipp-strings.c:4438
 msgid "x-dimension"
 msgstr ""
 
 #. TRANSLATORS: X Offset
-#: locale/ipp-strings.c:4438
+#: locale/ipp-strings.c:4440
 msgid "x-offset"
 msgstr ""
 
 #. TRANSLATORS: X Origin
-#: locale/ipp-strings.c:4440
+#: locale/ipp-strings.c:4442
 msgid "x-origin"
 msgstr ""
 
 #. TRANSLATORS: Y Accuracy
-#: locale/ipp-strings.c:4442
+#: locale/ipp-strings.c:4444
 msgid "y-accuracy"
 msgstr ""
 
 #. TRANSLATORS: Y Dimension
-#: locale/ipp-strings.c:4444
+#: locale/ipp-strings.c:4446
 msgid "y-dimension"
 msgstr ""
 
 #. TRANSLATORS: Y Offset
-#: locale/ipp-strings.c:4446
+#: locale/ipp-strings.c:4448
 msgid "y-offset"
 msgstr ""
 
 #. TRANSLATORS: Y Origin
-#: locale/ipp-strings.c:4448
+#: locale/ipp-strings.c:4450
 msgid "y-origin"
 msgstr ""
 
 #. TRANSLATORS: Z Accuracy
-#: locale/ipp-strings.c:4450
+#: locale/ipp-strings.c:4452
 msgid "z-accuracy"
 msgstr ""
 
 #. TRANSLATORS: Z Dimension
-#: locale/ipp-strings.c:4452
+#: locale/ipp-strings.c:4454
 msgid "z-dimension"
 msgstr ""
 
 #. TRANSLATORS: Z Offset
-#: locale/ipp-strings.c:4454
+#: locale/ipp-strings.c:4456
 msgid "z-offset"
 msgstr ""
 
index 22a276111f0b1147f4e146da1824a4e43ed0e7a4..aedc92fb702ea95b45042944847aaf04b3974012 100644 (file)
 "media-type.com.hp.premium-inkjet" = "Inkjet Premium Paper";
 // TRANSLATORS: Photo Premium Paper
 "media-type.com.hp.premium-photo" = "Photo Premium Paper";
+// TRANSLATORS: Premium Matte Presentation Paper
+"media-type.com.hp.premium-presentation-matte" = "Premium Matte Presentation Paper";
 // TRANSLATORS: Continuous
 "media-type.continuous" = "Continuous";
 // TRANSLATORS: Continuous Long
index 218438c1892a201684978f773c50cc6e087170d2..7e189e60565129995e7d0a06e25831e86ee2de94 100644 (file)
@@ -13,7 +13,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 2.3\n"
 "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n"
-"POT-Creation-Date: 2019-12-18 19:46-0500\n"
+"POT-Creation-Date: 2019-12-18 20:19-0500\n"
 "PO-Revision-Date: 2012-09-29 11:21+0200\n"
 "Last-Translator: Àngel Mompó <mecatxis@gmail.com>\n"
 "Language-Team: Catalan <ca@dodds.net>\n"
@@ -9013,6 +9013,10 @@ msgstr ""
 msgid "media-type.com.hp.premium-photo"
 msgstr ""
 
+#. TRANSLATORS: Premium Matte Presentation Paper
+msgid "media-type.com.hp.premium-presentation-matte"
+msgstr ""
+
 #. TRANSLATORS: Continuous
 msgid "media-type.continuous"
 msgstr ""
index 972adab28abfb6b66d3ce353f1b7352f0b50603b..329e9ffef633b93b0bd16241f98be1611ef31d40 100644 (file)
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 2.3\n"
 "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n"
-"POT-Creation-Date: 2019-12-18 19:46-0500\n"
+"POT-Creation-Date: 2019-12-18 20:19-0500\n"
 "PO-Revision-Date: 2012-09-14 10:26+0100\n"
 "Last-Translator: Jan Bartos <jan.bartos@madeta.cz>\n"
 "Language-Team: Czech\n"
@@ -8794,6 +8794,10 @@ msgstr ""
 msgid "media-type.com.hp.premium-photo"
 msgstr ""
 
+#. TRANSLATORS: Premium Matte Presentation Paper
+msgid "media-type.com.hp.premium-presentation-matte"
+msgstr ""
+
 #. TRANSLATORS: Continuous
 msgid "media-type.continuous"
 msgstr ""
index 3ac83febc1691b88c615dac4a1537b7a060c0325..6ac08cbfe06f43e4435ab64f74a9c41614ef242c 100644 (file)
@@ -22,7 +22,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 2.3\n"
 "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n"
-"POT-Creation-Date: 2019-12-18 19:46-0500\n"
+"POT-Creation-Date: 2019-12-18 20:19-0500\n"
 "PO-Revision-Date: 2017-10-25 14:57+0200\n"
 "Last-Translator: Joachim Schwender <joachim.schwender@web.de>\n"
 "Language-Team: German <LL@li.org>\n"
@@ -8917,6 +8917,10 @@ msgstr ""
 msgid "media-type.com.hp.premium-photo"
 msgstr ""
 
+#. TRANSLATORS: Premium Matte Presentation Paper
+msgid "media-type.com.hp.premium-presentation-matte"
+msgstr ""
+
 #. TRANSLATORS: Continuous
 msgid "media-type.continuous"
 msgstr ""
index c3d30007ca733de3127964dc9bcff9a032dcee35..fd7ea0ac013d9c7a47c453b00ea244449fa7cdd8 100644 (file)
@@ -24,7 +24,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 2.3.0\n"
 "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n"
-"POT-Creation-Date: 2019-12-18 19:46-0500\n"
+"POT-Creation-Date: 2019-12-18 20:19-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: English\n"
@@ -9096,6 +9096,10 @@ msgstr "Inkjet Premium Paper"
 msgid "media-type.com.hp.premium-photo"
 msgstr "Photo Premium Paper"
 
+#. TRANSLATORS: Premium Matte Presentation Paper
+msgid "media-type.com.hp.premium-presentation-matte"
+msgstr "Premium Matte Presentation Paper"
+
 #. TRANSLATORS: Continuous
 msgid "media-type.continuous"
 msgstr "Continuous"
index 5864d49bc5cc5d6ff11bd2a443af47ca35ca2a1c..3a31f4d8d7df44e3dc4079602ce39a61b2a2b063 100644 (file)
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 2.3\n"
 "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n"
-"POT-Creation-Date: 2019-12-18 19:46-0500\n"
+"POT-Creation-Date: 2019-12-18 20:19-0500\n"
 "PO-Revision-Date: 2016-06-26 21:17+0100\n"
 "Last-Translator: Juan Pablo González Riopedre <jpgriopedre@yahoo.es>\n"
 "Language-Team: Spanish\n"
@@ -9027,6 +9027,10 @@ msgstr ""
 msgid "media-type.com.hp.premium-photo"
 msgstr ""
 
+#. TRANSLATORS: Premium Matte Presentation Paper
+msgid "media-type.com.hp.premium-presentation-matte"
+msgstr ""
+
 #. TRANSLATORS: Continuous
 msgid "media-type.continuous"
 msgstr ""
index 319a0bacaac7e4599efae371c89e3a7931109482..7d228282c1c80a08d967ff9d237ea2c0309648a0 100644 (file)
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 2.3\n"
 "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n"
-"POT-Creation-Date: 2019-12-18 19:46-0500\n"
+"POT-Creation-Date: 2019-12-18 20:19-0500\n"
 "PO-Revision-Date: 2012-12-12 11:12+0100\n"
 "Last-Translator: Stéphane Blondon <stephane.blondon@gmail.com>\n"
 "Language-Team: French <LL@li.org>\n"
@@ -8812,6 +8812,10 @@ msgstr ""
 msgid "media-type.com.hp.premium-photo"
 msgstr ""
 
+#. TRANSLATORS: Premium Matte Presentation Paper
+msgid "media-type.com.hp.premium-presentation-matte"
+msgstr ""
+
 #. TRANSLATORS: Continuous
 msgid "media-type.continuous"
 msgstr ""
index df2880c3f0d7d7dee03d724a3fdd48c823937bf6..90bcb38ab7206a8ac7dbf824ec659e79338cb0d4 100644 (file)
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 2.3\n"
 "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n"
-"POT-Creation-Date: 2019-12-18 19:46-0500\n"
+"POT-Creation-Date: 2019-12-18 20:19-0500\n"
 "PO-Revision-Date: 2013-07-14 12:00+0200\n"
 "Last-Translator: Giovanni Scafora <giovanni@archlinux.org>\n"
 "Language-Team: Italian - Arch Linux Italian Team <giovanni@archlinux.org>\n"
@@ -9009,6 +9009,10 @@ msgstr ""
 msgid "media-type.com.hp.premium-photo"
 msgstr ""
 
+#. TRANSLATORS: Premium Matte Presentation Paper
+msgid "media-type.com.hp.premium-presentation-matte"
+msgstr ""
+
 #. TRANSLATORS: Continuous
 msgid "media-type.continuous"
 msgstr ""
index 9471f0ed074551f1577d68d3abfcd110d97d2f3a..a287be291894ee56674bab22656b9eda5990dec0 100644 (file)
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 2.3\n"
 "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n"
-"POT-Creation-Date: 2019-12-18 19:46-0500\n"
+"POT-Creation-Date: 2019-12-18 20:19-0500\n"
 "PO-Revision-Date: 2014-11-15 19:27+0900\n"
 "Last-Translator: OPFC TRANSCUPS <opfc-transcups@sourceforge.jp>\n"
 "Language-Team: Japanese - OPFC TRANSCUPS <opfc-transcups@sourceforge.jp>\n"
@@ -9001,6 +9001,10 @@ msgstr ""
 msgid "media-type.com.hp.premium-photo"
 msgstr ""
 
+#. TRANSLATORS: Premium Matte Presentation Paper
+msgid "media-type.com.hp.premium-presentation-matte"
+msgstr ""
+
 #. TRANSLATORS: Continuous
 msgid "media-type.continuous"
 msgstr ""
index 431061525b3f1b28f62737000477d32ca5fc27e0..cdb4392621d83285945945224f455dc1e9e8007a 100644 (file)
@@ -22,7 +22,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 2.3\n"
 "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n"
-"POT-Creation-Date: 2019-12-18 19:46-0500\n"
+"POT-Creation-Date: 2019-12-18 20:19-0500\n"
 "PO-Revision-Date: 2016-01-31 16:45-0200\n"
 "Last-Translator: Rafael Fontenelle <rffontenelle@gmail.com>\n"
 "Language-Team: Brazilian Portuguese <traducao-cups-pt-br@googlegroups.com>\n"
@@ -9018,6 +9018,10 @@ msgstr ""
 msgid "media-type.com.hp.premium-photo"
 msgstr ""
 
+#. TRANSLATORS: Premium Matte Presentation Paper
+msgid "media-type.com.hp.premium-presentation-matte"
+msgstr ""
+
 #. TRANSLATORS: Continuous
 msgid "media-type.continuous"
 msgstr ""
index 4fae4ccf8d660f4931515465e6e70668e04892f7..5a0d0da53ef03d80fdfd24e3b150d50570baf513 100644 (file)
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 2.0\n"
 "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n"
-"POT-Creation-Date: 2019-12-18 19:46-0500\n"
+"POT-Creation-Date: 2019-12-18 20:19-0500\n"
 "PO-Revision-Date: 2015-01-28 12:00-0800\n"
 "Last-Translator: Aleksandr Proklov\n"
 "Language-Team: Russian - PuppyRus Linux Team\n"
@@ -8966,6 +8966,10 @@ msgstr ""
 msgid "media-type.com.hp.premium-photo"
 msgstr ""
 
+#. TRANSLATORS: Premium Matte Presentation Paper
+msgid "media-type.com.hp.premium-presentation-matte"
+msgstr ""
+
 #. TRANSLATORS: Continuous
 msgid "media-type.continuous"
 msgstr ""
index a68fe92a7e941149f45d7caa1bd53586e8740bd8..c1dd080d73d1a36e7675d0629788047ef0fefbf6 100644 (file)
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 2.3\n"
 "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n"
-"POT-Creation-Date: 2019-12-18 19:46-0500\n"
+"POT-Creation-Date: 2019-12-18 20:19-0500\n"
 "PO-Revision-Date: 2018-10-09 00:21-0500\n"
 "Last-Translator: Mingcong Bai <jeffbai@aosc.io>\n"
 "Language-Team: Chinese (Simplified)\n"
@@ -8934,6 +8934,10 @@ msgstr ""
 msgid "media-type.com.hp.premium-photo"
 msgstr ""
 
+#. TRANSLATORS: Premium Matte Presentation Paper
+msgid "media-type.com.hp.premium-presentation-matte"
+msgstr ""
+
 #. TRANSLATORS: Continuous
 msgid "media-type.continuous"
 msgstr ""
index 73a527f4eaa08065b470de022654cb4811f44dae..40b246ce86f0cd2686a74d49b87a00110d48d1a9 100644 (file)
@@ -1606,6 +1606,8 @@ _("media-type.com.hp.mid-weight");
 _("media-type.com.hp.premium-inkjet");
 /* TRANSLATORS: Photo Premium Paper */
 _("media-type.com.hp.premium-photo");
+/* TRANSLATORS: Premium Matte Presentation Paper */
+_("media-type.com.hp.premium-presentation-matte");
 /* TRANSLATORS: Continuous */
 _("media-type.continuous");
 /* TRANSLATORS: Continuous Long */
index 00b1a22d66af8ef410a5337f516e810a2be0e3ba..beeccc69a51bea1a9b2720beca9534c265540324 100644 (file)
@@ -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.
index ce858da596247a709b90d044a78317f09a068a1b..7d2cca562f0805d67e8b82e64aff6b572f5d362b 100644 (file)
@@ -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.
index 700101773c8f7a8a24b6f709d3a6ce0a7135a8b3..b4b08c056102ed72595394db1a51acff0822ae47 100644 (file)
@@ -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.
index 44d368c703f8c95257a272bdf0385609effcae60..516b61545859a01ce07a5e29fc59d7b589b0a89d 100644 (file)
@@ -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,
index 537c19450894f4c8994136d6357be372aa00520f..d674d2ac42c7acf796e28e19d0c7dfe714402d5b 100644 (file)
@@ -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
index 04b587d7ff6d398a00c30630792855ecf74fdf03..b4a8341386d25a770f096bfeb7450fa583b6e075 100644 (file)
@@ -323,5 +323,8 @@ ppdcSource::import_ppd(const char *f)       // I - Filename
     }
   }
 
+  if (ppd)
+    ppdClose(ppd);
+
   return (1);
 }
index c25d49668e4a883a94ee26fc2cfdf3e70e0ee979..aec29131496371589021b95082a8e16d034f95ab 100644 (file)
@@ -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));
 }
 
 
@@ -1743,15 +1743,17 @@ ppdcSource::get_resolution(ppdcFile *fp)// I - File to read
 
   switch (sscanf(name, "%dx%d", &xdpi, &ydpi))
   {
-    case 0 :
-        _cupsLangPrintf(stderr,
-                       _("ppdc: Bad resolution name \"%s\" on line %d of "
-                         "%s."), name, fp->line, fp->filename);
-        break;
     case 1 :
         ydpi = xdpi;
-       break;
-  }
+        break;
+    case 2 :
+        break;
+    default :
+        _cupsLangPrintf(stderr,
+                  _("ppdc: Bad resolution name \"%s\" on line %d of "
+        "%s."), name, fp->line, fp->filename);
+        break;
+}
 
   // Create the necessary PS commands...
   snprintf(command, sizeof(command),
@@ -1878,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));
 }
 
 
index 5411b5e376fab661a366623ce456fb4a74d51750..385f456413ed4c7b5354610db3a5b05545a10d62 100644 (file)
@@ -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);
index 506e6616620ba08be8458e54983049adc58b8f03..75636a9447bbc9e0d38fb809c048328184f02a36 100644 (file)
@@ -20,7 +20,7 @@
 // Local functions...
 //
 
-static void    usage(void);
+static void    usage(void) _CUPS_NORETURN;
 
 
 //
index e5bb0469aaa82fd8d7eabaad8c872184c5ab82b1..a2f9648f28f7a0190adeb7120f508c46099c37f7 100644 (file)
@@ -21,7 +21,7 @@
 // Local functions...
 //
 
-static void    usage(void);
+static void    usage(void) _CUPS_NORETURN;
 
 
 //
index 94d67ff839a34e38b102f175f34e0dc533193505..1ab804399d6cf2eda53cc6971dfb2fa6488f6e28 100644 (file)
@@ -22,7 +22,7 @@
 //
 
 static const char      *ppd_locale(ppd_file_t *ppd);
-static void            usage(void);
+static void            usage(void) _CUPS_NORETURN;
 
 
 //
index 244aaf186c7511cd27277e272c3996faaeba1ac4..498b34e3d7f0d3c7ab4d3ac67c921f8cd99aa796 100644 (file)
@@ -21,7 +21,7 @@
 //
 
 static void    add_ui_strings(ppdcDriver *d, ppdcCatalog *catalog);
-static void    usage(void);
+static void    usage(void) _CUPS_NORETURN;
 
 
 //
index 148cf0f543ba6f86fa0709ad11c802f08d83a022..416e545d1cd082981e66275ce362d5d7c3a4a060 100644 (file)
@@ -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
 #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
 #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
 #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
index 4fbad6e2440f38375b957de68d1b0e6f20ff2033..4fdcf1177e916191aea1c35f14d5b19b99c209c6 100644 (file)
@@ -202,7 +202,6 @@ cupsdAddNameMask(cups_array_t **masks,      /* IO - Masks array (created as needed) *
 
     if (ifptr >= ifname && *ifptr == ')')
     {
-      ifptr --;
       *ifptr = '\0';
     }
 
index 258e8fc83394e6eec96bdc192f3cc0c0f1893897..2a28b568f89f9fe95318ab517875ebcaa39bcc7d 100644 (file)
@@ -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);
 }
index 14d2558bf0f12a97e7d3dfea359042ac4f5e80bc..8e24f9ba4187d301bf5f1b8be0c47cfb0d21d670 100644 (file)
@@ -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");
 
  /*
index c2ee8f12a6e3a460790a1e664efcd1180f4587a0..0126ef02daec31edd8ff9a4f0eb79bc4497787d5 100644 (file)
@@ -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));
 
index bb6049b2c6ce28483ceaf21bf707d53fe6d8dca2..1180ac9b81f87bf98b274ea20addb90631790c92 100644 (file)
@@ -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;
index b4e14eed99d157b2c1e02c1e4708ca85f08678f4..791c0d360cbcb76d35985c9dc927f49b41329037 100644 (file)
@@ -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),
index 77703b98330bbf8f985871033c4dc3aa929d3b9a..14478fd990afece7781fbff3efeeaf966cd1edf7 100644 (file)
@@ -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);
index 0da3d0c06e4e10ddcd446b87f261e8b6c15aa9a2..7b1dc4834631605bc78adbd89c9133e074e961fe 100644 (file)
@@ -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,
index 2fe3bf25cc3ac6d384663a95788ae9bf6f18deb2..2e7e579171a9afb5e81c528264a64b335d551eba 100644 (file)
@@ -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));
index e20e7c563edc65340155d2ad8b8882fe24e0e10e..351d43b116209677fa4f3711da32eb669e4cf478 100644 (file)
@@ -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 ?
index 92c7c626b182accfae0af62f21eb2cff94d7c0bb..dbf959b25aac2a32c55464472789b38d62d1ad89 100644 (file)
@@ -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));
 
index 2bd1952f7d1decd39edf1d1a699e4795504a426b..efc16ad9db0c03cae2f8936db9b704c3c0780ba7 100644 (file)
@@ -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));
index d5fdf971a8acee0ac51bf9e5f353828c4ae3f2bc..edd49d906a935cabd469de4fb26a3840f254022a 100644 (file)
@@ -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 */
     }
 
    /*
index 80690397da3ef0e6a13af92f373c2daacca7c0fc..991a17eb1989706dd9b1c43b34f1bf13e6e1f3a0 100644 (file)
@@ -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
@@ -446,7 +446,7 @@ cupsdCreateCommonData(void)
 
   /* cups-version */
   ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_TEXT | IPP_TAG_COPY,
-               "cups-version", NULL, CUPS_SVERSION + 6);
+               "cups-version", NULL, &CUPS_SVERSION[6]);
 
   /* generated-natural-language-supported (no IPP_TAG_COPY) */
   ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_LANGUAGE,
@@ -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"))
index 15acedca8d07a5b9ce6af4b23fc75aa5ac38e00c..2dbb28f85b146d35abcaf98c0c2c9ddde21bd2ab 100644 (file)
@@ -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);
 
index 56eb4e32a057e458aeb0f20eddc9538a6ccb6e97..81e3ed43bfc5c21fee9acc74c0f4865bceaf9cf6 100644 (file)
@@ -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 =
index 865690444d113d4816fc4043c15f177f16f0c5e1..228733f38885f76851331290bab6b9e5be60010c 100644 (file)
@@ -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);
 }
 
 
index 33b2f37cc69d7ff73f5ce61a02db0a415b1c97a7..fa8dd4efd5ef4e1a158845270e1432547243399e 100755 (executable)
@@ -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
index c85a86e0cac3402b934413f305efe5d0032f95a4..0f303886d3086a3f43d936fb83b9e4db8e502108 100644 (file)
@@ -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);
     }
index b94cae94408aa76cffad1a80e252634daeb9bf54..c3a2d19dce002ce1bb1cbe98ec89946bf49789a6 100644 (file)
@@ -261,7 +261,6 @@ main(int  argc,                             /* I - Number of command-line args */
 
          default :
              usage();
-             break;
        }
     }
     else
index 298c158257ea90f100b5e345a64f705fcc3b7885..fd818a56d5a715bc2c48a6a403ede5309bcff5e2 100644 (file)
@@ -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);
index ca6d386b2e12ebb0b51b6bf874be54144b4df714..dc875cb8c79d7733570f6b7de9bc78a2839b6cb7 100644 (file)
@@ -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."));
   }
@@ -1156,105 +1149,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)
     {
index 1d14cb8e07b7210d0335d898a1cbc4e320df5521..86e7a7ca33361566623cbb9481d37ebece973de3 100644 (file)
@@ -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)
index 59720bd686f989f57f86fa371c5773de89d580ba..b0a47dee8b49eeef51ca410744178e3f55a1ac86 100644 (file)
@@ -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 \
index e916cf8a092a8dbc34f5b0ba3ca6251b1d2d4bb9..9c9b71f22c7e4f04b14aa14e1e66a2161f4b40e1 100644 (file)
@@ -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>
index 2f9630f5242ccd7a7318c505469ad0d4a14ca049..58d2692f5b47d98824b6a833c017a5d1f9ecad3b 100755 (executable)
@@ -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
index 41954a570c76d1750765bd21399c126a69bd8e32..15caa69d850d5aeaacfd41be357fdabefaf74b5a 100644 (file)
@@ -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;
@@ -2727,6 +2791,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;
@@ -3123,6 +3223,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";
index 52e14ee167b774c8e42a0f2f6bcbe60a6923fe25..cdedc8899a564244d669c19e6f553cbc21e2f9d5 100644 (file)
@@ -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));
index 246ab4dba87363dd3a09e58fc41c09916a842f5c..ae5af7d40dd2196b5f4267f36ba5cb33b5253281 100644 (file)
@@ -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"));
index a3a694d5fa4e312b3f3323d1930f886ac38ad5c8..e89fb5bcad8f5bcd39ce0e90668abd09b9631a37 100644 (file)
@@ -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
 #endif /* !O_BINARY */
 
 
+/*
+ * 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...
   */
 
@@ -881,21 +912,259 @@ 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 */
@@ -915,6 +1184,28 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
   if (Cancel)
     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';
@@ -2124,56 +2588,492 @@ get_string(ipp_attribute_t *attr,      /* I - IPP attribute */
       httpAssembleURI(HTTP_URI_CODING_ALL, buffer, (int)bufsize, scheme, userpass, hostname, port, resource);
     }
 
-    return (buffer);
-  }
-  else
-    return (value);
-}
+    return (buffer);
+  }
+  else
+    return (value);
+}
+
+
+/*
+ * 'init_data()' - Initialize test data.
+ */
+
+static void
+init_data(ipptool_test_t *data)        /* I - Data */
+{
+  memset(data, 0, sizeof(ipptool_test_t));
+
+  data->output       = IPPTOOL_OUTPUT_LIST;
+  data->outfile      = cupsFileStdout();
+  data->family       = AF_UNSPEC;
+  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;
+  data->show_header  = 1;
+}
+
+
+/*
+ * 'iso_date()' - Return an ISO 8601 date/time string for the given IPP dateTime
+ *                value.
+ */
+
+static char *                          /* O - ISO 8601 date/time string */
+iso_date(const ipp_uchar_t *date)      /* I - IPP (RFC 1903) date/time value */
+{
+  time_t       utctime;                /* UTC time since 1970 */
+  struct tm    utcdate;                /* UTC date/time */
+  static char  buffer[255];            /* String buffer */
+
+
+  utctime = ippDateToTime(date);
+  gmtime_r(&utctime, &utcdate);
+
+  snprintf(buffer, sizeof(buffer), "%04d-%02d-%02dT%02d:%02d:%02dZ",
+          utcdate.tm_year + 1900, utcdate.tm_mon + 1, utcdate.tm_mday,
+          utcdate.tm_hour, utcdate.tm_min, utcdate.tm_sec);
+
+  return (buffer);
+}
+
+
+/*
+ * '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.
+       */
 
-/*
- * 'init_data()' - Initialize test data.
- */
+       _ippVarsExpand(data->vars, value, temp, sizeof(value));
 
-static void
-init_data(_cups_testdata_t *data)      /* I - Data */
-{
-  memset(data, 0, sizeof(_cups_testdata_t));
+       ptr = value + strlen(value) - 1;
 
-  data->output       = _CUPS_OUTPUT_LIST;
-  data->outfile      = cupsFileStdout();
-  data->family       = AF_UNSPEC;
-  data->def_transfer = _CUPS_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->show_header  = 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;
 
-/*
- * 'iso_date()' - Return an ISO 8601 date/time string for the given IPP dateTime
- *                value.
- */
+         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...
+         */
 
-static char *                          /* O - ISO 8601 date/time string */
-iso_date(const ipp_uchar_t *date)      /* I - IPP (RFC 1903) date/time value */
-{
-  time_t       utctime;                /* UTC time since 1970 */
-  struct tm    utcdate;                /* UTC date/time */
-  static char  buffer[255];            /* String buffer */
+         for (ptr = value; *ptr; ptr ++)
+         {
+           if (*ptr == '\\' && ptr[1])
+           {
+            /*
+             * Remove \ from \foo...
+             */
 
+             _cups_strcpy(ptr, ptr + 1);
+           }
+         }
 
-  utctime = ippDateToTime(date);
-  gmtime_r(&utctime, &utcdate);
+         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);
+      }
+    }
+  }
 
-  snprintf(buffer, sizeof(buffer), "%04d-%02d-%02dT%02d:%02d:%02dZ",
-          utcdate.tm_year + 1900, utcdate.tm_mon + 1, utcdate.tm_mday,
-          utcdate.tm_hour, utcdate.tm_min, utcdate.tm_sec);
+  print_fatal_error(data, "Missing closing brace on line %d of \"%s\".", f->linenum, f->filename);
 
-  return (buffer);
+  return (0);
 }
 
 
@@ -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;
-        }
+       }
       }
+    }
+
+    // Output the line...
+    for (i = 0; i < num_displayed; i ++)
+    {
+      if (i)
+        cupsFilePutChar(data->outfile, ' ');
 
-      cupsFilePrintf(data->outfile, "%*s", (int)-widths[i], buffer);
+      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"));
@@ -4335,30 +5343,155 @@ 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 (file)
index 0000000..a7d328d
--- /dev/null
@@ -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 (file)
index 0000000..439c59c
Binary files /dev/null and b/tools/printer-lg.png differ
index 95c42c5c966650f8a7d1055db8a995d27ee4ae2a..192b1fd6b461b551fe7269f0fca04c8fa6e25e88 100644 (file)
@@ -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 (file)
index 0000000..033ccc8
--- /dev/null
@@ -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 (file)
index 0000000..e87527e
Binary files /dev/null and b/tools/printer-sm.png differ
index 9bb5196aa1f1ae2537e5547d8923ee1174b6028f..1d499b63296f902cbb0b165a8b868530ed5e0840 100644 (file)
Binary files a/tools/printer.png and b/tools/printer.png differ
index 6c87f98b5e1fa8d9eae7009599962c99f11daace..b74bf2e09af77bd653561b92c492c155796382ad 100644 (file)
@@ -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.2"
-#define CUPS_MINIMAL "CUPS/2.3.2"
+#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
 
 
 /*
index 25131dd6ccc50d4a7da099f26b812048605ac10a..952367928af3d2c3c3bcb8168d612a8278ac3200 100644 (file)
@@ -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);
 }
 
 
index 782a62ff8fc11313d7729cdb72ec7f2320de7279..f05007751f52a1268e0aedba4eef3a3e1f1b071f 100644 (file)
@@ -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.2"
-#define CUPS_MINIMAL "CUPS/2.3.2"
+#define CUPS_SVERSION "CUPS v2.3.6"
+#define CUPS_MINIMAL "CUPS/2.3.6"
 
 
 /*