From a48458814a4c26a6430b27105c0ab747c907473f Mon Sep 17 00:00:00 2001 From: msweet Date: Wed, 31 Aug 2011 01:58:55 +0000 Subject: [PATCH] Merge changes from CUPS 1.6svn-r9939. git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@3392 a1ca3aef-8c08-0410-bb20-df032aa958be --- CHANGES-1.5.txt | 182 ++ CHANGES.txt | 168 +- Makedefs.in | 15 - Makefile | 4 +- backend/Dependencies | 18 - backend/Makefile | 58 +- backend/easysw-firewire-design.txt | 0 backend/easysw-firewire-linux.txt | 0 backend/ipp.c | 3 +- backend/parallel.c | 676 ----- backend/serial.c | 1327 --------- backend/snmp-supplies.c | 6 +- backend/usb-darwin.c | 74 +- conf/mime.convs.in | 38 - config-scripts/cups-common.m4 | 23 +- config-scripts/cups-defaults.m4 | 46 - config-scripts/cups-image.m4 | 112 - config-scripts/cups-pap.m4 | 0 config-scripts/cups-pdf.m4 | 113 - config-scripts/cups-scripting.m4 | 11 - config-scripts/cups-sharedlibs.m4 | 19 +- configure.in | 4 +- cups-config.in | 30 +- cups/Makefile | 1 + cups/cups.h | 6 +- cups/http.c | 132 +- cups/libcups.exp | 0 cups/libcups.order | 0 cups/mark.c | 8 +- cups/ppd-cache.c | 7 +- cups/ppd.c | 178 +- cups/raster-private.h | 67 + cups/request.c | 21 +- cups/testfile.c | 12 +- data/Makefile | 16 - data/escp.h | 34 - data/pcl.h | 38 - data/psglyphs | 1051 ------- data/utf-8 | 40 - driver/Dependencies | 75 - driver/Makefile | 382 --- driver/api-driver.header | 34 - driver/api-driver.shtml | 18 - driver/attr.c | 109 - driver/check.c | 111 - driver/cmyk.c | 1955 ------------- driver/commandtoescpx.c | 245 -- driver/commandtopclx.c | 172 -- driver/dither.c | 306 -- driver/driver.h | 249 -- driver/image.pgm | Bin 152380 -> 0 bytes driver/image.ppm | Bin 457020 -> 0 bytes driver/libcupsdriver.exp | 30 - driver/lut.c | 202 -- driver/pack.c | 307 -- driver/pcl-common.c | 272 -- driver/pcl-common.h | 71 - driver/rastertoescpx.c | 1931 ------------ driver/rastertopclx.c | 1956 ------------- driver/rgb.c | 558 ---- driver/srgb.c | 79 - driver/testcmyk.c | 437 --- driver/testdither.c | 191 -- driver/testdriver.c | 176 -- driver/testrgb.c | 348 --- filter/Dependencies | 309 +- filter/Makefile | 80 +- filter/bannertops.c | 1094 ------- filter/error.c | 3 +- filter/image-bmp.c | 545 ---- filter/image-colorspace.c | 1567 ---------- filter/image-gif.c | 696 ----- filter/image-jpeg.c | 322 -- filter/image-photocd.c | 333 --- filter/image-pix.c | 240 -- filter/image-png.c | 315 -- filter/image-pnm.c | 320 -- filter/image-private.h | 220 -- filter/image-sgi.c | 295 -- filter/image-sgi.h | 86 - filter/image-sgilib.c | 890 ------ filter/image-sun.c | 407 --- filter/image-tiff.c | 1715 ----------- filter/image-zoom.c | 361 --- filter/image.c | 813 ------ filter/image.h | 130 - filter/imagetops.c | 1078 ------- filter/imagetoraster.c | 4368 ---------------------------- filter/interpret.c | 4 +- filter/libcupsimage.order | 0 filter/pdftops.c | 621 ---- filter/pstext.c | 511 ---- filter/pstext.h | 74 - filter/pstops.c | 18 +- filter/raster.c | 13 +- filter/testimage.c | 99 - filter/testraster.c | 8 +- filter/textcommon.c | 1214 -------- filter/textcommon.h | 114 - filter/texttops.c | 1165 -------- fonts/Makefile | 118 - fonts/Monospace | 2744 ----------------- fonts/Monospace-Bold | 2354 --------------- fonts/Monospace-BoldOblique | 2445 ---------------- fonts/Monospace-Oblique | 2706 ----------------- locale/ppdc.pot | 0 packaging/cups.list.in | 17 - packaging/cups.spec.in | 27 +- ppdc/Dependencies | 3 +- ppdc/libcupsppdc.exp | 0 ppdc/ppdc-source.cxx | 60 - ppdc/sample.drv | 2 +- scheduler/client.c | 43 +- scheduler/conf.c | 5 +- scheduler/cups-driverd.cxx | 4 +- scheduler/cups-exec.c | 4 +- scheduler/cupsd.order | 0 scheduler/job.c | 5 +- scheduler/log.c | 13 +- scripting/perl/CUPS.pm | 144 - scripting/perl/CUPS.xs | 270 -- scripting/perl/Makefile.PL | 17 - scripting/perl/README | 35 - scripting/perl/test.pl | 17 - scripting/php/Dependencies | 7 - scripting/php/Makefile | 153 - scripting/php/README | 157 - scripting/php/phpcups.c | 487 ---- scripting/php/phpcups.h | 67 - scripting/php/phpcups.php | 60 - systemv/cupstestppd.c | 147 +- templates/maintenance.tmpl | 0 test/ipptool.c | 84 +- test/run-stp-tests.sh | 26 +- test/str-header.html | 8 +- tools/makedocset | 0 136 files changed, 941 insertions(+), 46068 deletions(-) create mode 100644 CHANGES-1.5.txt delete mode 100644 backend/easysw-firewire-design.txt delete mode 100644 backend/easysw-firewire-linux.txt delete mode 100644 backend/parallel.c delete mode 100644 backend/serial.c delete mode 100644 config-scripts/cups-image.m4 delete mode 100644 config-scripts/cups-pap.m4 delete mode 100644 config-scripts/cups-pdf.m4 delete mode 100644 cups/libcups.exp delete mode 100755 cups/libcups.order create mode 100644 cups/raster-private.h delete mode 100644 data/escp.h delete mode 100644 data/pcl.h delete mode 100644 data/psglyphs delete mode 100644 data/utf-8 delete mode 100644 driver/Dependencies delete mode 100644 driver/Makefile delete mode 100644 driver/api-driver.header delete mode 100644 driver/api-driver.shtml delete mode 100644 driver/attr.c delete mode 100644 driver/check.c delete mode 100644 driver/cmyk.c delete mode 100644 driver/commandtoescpx.c delete mode 100644 driver/commandtopclx.c delete mode 100644 driver/dither.c delete mode 100644 driver/driver.h delete mode 100644 driver/image.pgm delete mode 100644 driver/image.ppm delete mode 100644 driver/libcupsdriver.exp delete mode 100644 driver/lut.c delete mode 100644 driver/pack.c delete mode 100644 driver/pcl-common.c delete mode 100644 driver/pcl-common.h delete mode 100644 driver/rastertoescpx.c delete mode 100644 driver/rastertopclx.c delete mode 100644 driver/rgb.c delete mode 100644 driver/srgb.c delete mode 100644 driver/testcmyk.c delete mode 100644 driver/testdither.c delete mode 100644 driver/testdriver.c delete mode 100644 driver/testrgb.c delete mode 100644 filter/bannertops.c delete mode 100644 filter/image-bmp.c delete mode 100644 filter/image-colorspace.c delete mode 100644 filter/image-gif.c delete mode 100644 filter/image-jpeg.c delete mode 100644 filter/image-photocd.c delete mode 100644 filter/image-pix.c delete mode 100644 filter/image-png.c delete mode 100644 filter/image-pnm.c delete mode 100644 filter/image-private.h delete mode 100644 filter/image-sgi.c delete mode 100644 filter/image-sgi.h delete mode 100644 filter/image-sgilib.c delete mode 100644 filter/image-sun.c delete mode 100644 filter/image-tiff.c delete mode 100644 filter/image-zoom.c delete mode 100644 filter/image.c delete mode 100644 filter/image.h delete mode 100644 filter/imagetops.c delete mode 100644 filter/imagetoraster.c delete mode 100644 filter/libcupsimage.order delete mode 100644 filter/pdftops.c delete mode 100644 filter/pstext.c delete mode 100644 filter/pstext.h delete mode 100644 filter/testimage.c delete mode 100644 filter/textcommon.c delete mode 100644 filter/textcommon.h delete mode 100644 filter/texttops.c delete mode 100644 fonts/Makefile delete mode 100644 fonts/Monospace delete mode 100644 fonts/Monospace-Bold delete mode 100644 fonts/Monospace-BoldOblique delete mode 100644 fonts/Monospace-Oblique delete mode 100644 locale/ppdc.pot delete mode 100644 ppdc/libcupsppdc.exp delete mode 100644 scheduler/cupsd.order delete mode 100644 scripting/perl/CUPS.pm delete mode 100644 scripting/perl/CUPS.xs delete mode 100644 scripting/perl/Makefile.PL delete mode 100644 scripting/perl/README delete mode 100644 scripting/perl/test.pl delete mode 100644 scripting/php/Dependencies delete mode 100644 scripting/php/Makefile delete mode 100644 scripting/php/README delete mode 100644 scripting/php/phpcups.c delete mode 100644 scripting/php/phpcups.h delete mode 100755 scripting/php/phpcups.php delete mode 100644 templates/maintenance.tmpl delete mode 100644 tools/makedocset diff --git a/CHANGES-1.5.txt b/CHANGES-1.5.txt new file mode 100644 index 000000000..100312bab --- /dev/null +++ b/CHANGES-1.5.txt @@ -0,0 +1,182 @@ +CHANGES-1.5.txt +--------------- + +CHANGES IN CUPS V1.5.1 + + - Documentation updates (STR #3885) + - The scheduler now logs config file errors to stderr (STR #3936) + - The configure script incorrectly used bundle-based localizations on + Linux (STR #3938) + - The cups-driverd helper program did not cache .drv files properly, + sometimes leading to a crash (STR #3921) + - CUPS did not build on stock Mac OS X installations. + - Encryption was broken with OpenSSL. + - ipptool's XML output used date/time values with timezone offsets, + which are not supported by Mac OS X's NSDate class. + - Several programs did not support the cupsFilter2 keyword in PPD files. + - The IPP backend incorrectly reported spool-area-full states. + - cupsMarkOptions() did not protect against a bad PPD that was missing + one or more standard Duplex options. + - The PostScript filter did not mirror N-up output properly. + - The ipptool program did not validate UTF-8 strings in XML output. + - Fixed supply level reporting for some printers. + - The scheduler no longer automatically logs debug messages for jobs + that were held or canceled. + - The cupsSendRequest function did not flush remaining response data + from a previous request, leading to apparent chunking issues. + - The scheduler did not report the correct version in the Server: header + (STR #3903) + - The scheduler did not support 1284 device IDs reported by driver + interface programs longer than 127 characters (STR #3871) + - The image filters did not support loading images larger than the + RIPCache setting (STR #3901) + - "PAGE: total NNN" messages did not get logged properly (STR #3887) + - Updated the PWG Raster support to conform to the current draft of the + PWG Raster Format specification. + - The PWG Raster filter did not always write the correct number of + padding lines on the bottom of the page (STR #3904) + - When reporting a denial-of-service attack from the domain socket, the + address reported does not always contain the correct path (STR #3888) + - Badly formed GIF files could cause the image filters to crash + (STR #3914) + - Jobs canceled at the printer were retried by the IPP backend. + - "cupsfilter -u" deleted the input file instead of the PPD file. + - The scheduler did not compute the cost of PPD filters defined using + the cupsFilter2 keyword properly. + - The scheduler did not correctly support the maxsize() attribute for + PPD filters. + + +CHANGES IN CUPS V1.5.0 + + - Documentation updates. + - Localization update (STR #3865) + - Needed to limit TLS to v1.0 on some versions of Mac OS X. + - The snmp backend did not work with some printers. + + +CHANGES IN CUPS V1.5rc1 + + - Compile fixes (STR #3849, STR #3850) + - The scheduler didn't check for empty values for several configuration + directives (STR #3861) + - ipptool didn't generate valid XML when a test was skipped. + - Added additional error checking to the 1284 device ID code (STR #3858) + - Fixed some compatibility issues migrating from the old usblp backend + to the libusb backend (STR #3860) + - Fixed the wake-from-sleep printing behavior on Mac OS X. + - The scheduler incorrectly allowed jobs to be held from a terminating + state. + - The cups-driverd program could crash when a PPD was renamed. + - The dnssd backend took too long to discover printers on large or busy + networks with the new default timeout used by lpinfo and the web + interface. This resulted in "lost" printers. + + +CHANGES IN CUPS V1.5b2 + + - Documentation updates. + - Localization updates (STR #3845) + - Compiler warning cleanup. + - Fixed PIE support for Linux (STR #3846) + - Made httpSetTimeout API public and use it in the IPP backend to avoid + timeout errors. + - The scheduler incorrectly set the "authenticated" printer-type bit for + remote queues using authentication. + + +CHANGES IN CUPS V1.5b1 + + - The CUPS library now supports per-connection HTTP timeouts and + callbacks. + - The CUPS library now supports (limited) SSL/TLS X.509 certificate + validation and revocation (STR #1616) + - Updated the PostScript filter to support IncludeFeature in more + circumstances (STR #3417) + - The schedule did not correctly parse some IPv6 addresses and masks in + the cupsd.conf file (STR #3533) + - Fixed a case-insensitive string comparison issue for locales that do + not treat "I" and "i" as equivalent (STR #3800) + - The scheduler reported an incorrect job-printer-uri value when sharing + was not enabled (STR #3639) + - The scheduler now allows the ServerAlias directive to contain multiple + hostnames separated by spaces or commas (STR #3813) + - The scheduler now sets the process group for child processes and + manages the group (STR #2829) + - Fixed some minor issues discovered by a Coverity scan (STR #3838) + - The scheduler now more carefully creates and removes configuration, + cache, and state files (STR #3715) + - The lpadmin command now allows default option values to be deleted + (STR #2959) + - The lpadmin command now allows the cupsIPPSupplies and + cupsSNMPSupplies keywords to be set in a PPD file (STR #3825) + - Moving a held job no longer releases it (STR #3839) + - Restored support for GNU TLS and OpenSSL with threading enabled + (STR #3605) + - Fixed a confusing error message from cups-polld (STR #3806) + - Increased the default RIPCache value to 128MB (STR #3535) + - MIME errors are now routed to the error_log file (STR #2410) + - Updated PDF filter to support new Ghostscript ps2write device + (STR #3766) + - Updated PDF filter to support new Poppler option to preserve page + sizes in PDF files when the user has not selected a particular media + size (STR #3689) + - Added new PWG Raster filter for IPP Everywhere printer support. + - Added job-uuid, printer-uuid, and subscription-uuid attributes. + - Added support for the cupsSingleFile PPD keyword. + - Dropped support for the printer-state-history attribute (STR #3654) + - Added support for a new cupsIPPSupplies keyword in PPD files to allow + drivers to disable IPP supply level reporting. + - Added support for a new cupsFilter2 keyword in PPD files to allow for + the propagation of the actual MIME media type produced by a filter. + - The scheduler did not always get the correct Kerberos username when + authenticating (STR #3670) + - Added new cupsRasterOpenIO function and CUPS_RASTER_WRITE_PWG to the + CUPS imaging library to support printing to IPP Everywhere raster + printers. + - The scheduler now provides default values for the pages-per-minute and + pages-per-minute-color attributes for PPD files that lack a + Throughput keyword. + - Email notifications did not work on Mac OS X. + - The cupstestppd program now shows an error for files missing a + CloseGroup keyword (STR #3668) + - Name resolution errors no longer cause queues to stop (STR #3719, + STR #3753) + - Added a new cups-exec helper program that applies security profiles + to filters, port monitors, backends, CGI programs, and mini-daemons. + - The web interface can now be disabled using the WebInterface directive + in cupsd.conf (STR #2625) + - The scheduler now provides privacy controls for jobs and subscriptions + (STR #2969) + - Added new cupsArrayNew3 API which offers memory management of array + elements. + - Added several new color spaces to the CUPS raster format (STR #3419) + - The Validate-Job operation now uses the same policy as Print-Job by + default. + - CUPS now uses iconv to implement all of its character encoding + support (STR #3097) + - The scheduler now implements the Cancel-Jobs, Cancel-My-Jobs, and + Close-Job operations along with the job-ids operation attribute from + PWG 5100.11. + - The main CUPS header () no longer includes the PPD header + (). + - The scheduler and CUPS API now support the print-quality job template + attribute. + - The scheduler no longer supports the old Mac OS X Server quota + plugin. + - The scheduler now allows writing to /Users/Shared from print filters + on Mac OS X. + - CUPS no longer supports the old ~/.cupsrc or ~/.lpoptions files from + CUPS 1.1.x. The ~/.cups/client.conf and ~/.cups/lpoptions files that + were introduced in CUPS 1.2 must now be used. + - The ipptest tool is now a first-class user program and has several + improvements along with new documentation (STR #3484) + - The cupstestppd tool now warns about non-unique filenames and + provides a way to ignore all filename warnings. + - Dropped support for the recoverable: and recovered: message prefixes. + - The scheduler now requires that filters and backends have group write + permissions disabled. + - The PPD compiler now checks for overlapping filenames when writing + PPD files. + - The HP-GL/2 filter is no longer included with CUPS (STR #3322) + - The SCSI backend is no longer included with CUPS (STR #3500) diff --git a/CHANGES.txt b/CHANGES.txt index 3de675517..58b9973db 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,162 +1,10 @@ -CHANGES.txt - 2011-08-06 ------------------------- +CHANGES.txt - 1.6b1 - 2011-08-27 +-------------------------------- -CHANGES IN CUPS V1.5.1 +CHANGES IN CUPS V1.6b1 - - Documentation updates (STR #3885) - - The scheduler did not report the correct version in the Server: header - (STR #3903) - - The scheduler did not support 1284 device IDs reported by driver - interface programs longer than 127 characters (STR #3871) - - The image filters did not support loading images larger than the - RIPCache setting (STR #3901) - - "PAGE: total NNN" messages did not get logged properly (STR #3887) - - Updated the PWG Raster support to conform to the current draft of the - PWG Raster Format specification. - - The PWG Raster filter did not always write the correct number of - padding lines on the bottom of the page (STR #3904) - - When reporting a denial-of-service attack from the domain socket, the - address reported does not always contain the correct path (STR #3888) - - Badly formed GIF files could cause the image filters to crash - (STR #3914) - - Jobs canceled at the printer were retried by the IPP backend. - - "cupsfilter -u" deleted the input file instead of the PPD file. - - The scheduler did not compute the cost of PPD filters defined using - the cupsFilter2 keyword properly. - - The scheduler did not correctly support the maxsize() attribute for - PPD filters. - - -CHANGES IN CUPS V1.5.0 - - - Documentation updates. - - Localization update (STR #3865) - - Needed to limit TLS to v1.0 on some versions of Mac OS X. - - The snmp backend did not work with some printers. - - -CHANGES IN CUPS V1.5rc1 - - - Compile fixes (STR #3849, STR #3850) - - The scheduler didn't check for empty values for several configuration - directives (STR #3861) - - ipptool didn't generate valid XML when a test was skipped. - - Added additional error checking to the 1284 device ID code (STR #3858) - - Fixed some compatibility issues migrating from the old usblp backend - to the libusb backend (STR #3860) - - Fixed the wake-from-sleep printing behavior on Mac OS X. - - The scheduler incorrectly allowed jobs to be held from a terminating - state. - - The cups-driverd program could crash when a PPD was renamed. - - The dnssd backend took too long to discover printers on large or busy - networks with the new default timeout used by lpinfo and the web - interface. This resulted in "lost" printers. - - -CHANGES IN CUPS V1.5b2 - - - Documentation updates. - - Localization updates (STR #3845) - - Compiler warning cleanup. - - Fixed PIE support for Linux (STR #3846) - - Made httpSetTimeout API public and use it in the IPP backend to avoid - timeout errors. - - The scheduler incorrectly set the "authenticated" printer-type bit for - remote queues using authentication. - - -CHANGES IN CUPS V1.5b1 - - - The CUPS library now supports per-connection HTTP timeouts and - callbacks. - - The CUPS library now supports (limited) SSL/TLS X.509 certificate - validation and revocation (STR #1616) - - Updated the PostScript filter to support IncludeFeature in more - circumstances (STR #3417) - - The schedule did not correctly parse some IPv6 addresses and masks in - the cupsd.conf file (STR #3533) - - Fixed a case-insensitive string comparison issue for locales that do - not treat "I" and "i" as equivalent (STR #3800) - - The scheduler reported an incorrect job-printer-uri value when sharing - was not enabled (STR #3639) - - The scheduler now allows the ServerAlias directive to contain multiple - hostnames separated by spaces or commas (STR #3813) - - The scheduler now sets the process group for child processes and - manages the group (STR #2829) - - Fixed some minor issues discovered by a Coverity scan (STR #3838) - - The scheduler now more carefully creates and removes configuration, - cache, and state files (STR #3715) - - The lpadmin command now allows default option values to be deleted - (STR #2959) - - The lpadmin command now allows the cupsIPPSupplies and - cupsSNMPSupplies keywords to be set in a PPD file (STR #3825) - - Moving a held job no longer releases it (STR #3839) - - Restored support for GNU TLS and OpenSSL with threading enabled - (STR #3605) - - Fixed a confusing error message from cups-polld (STR #3806) - - Increased the default RIPCache value to 128MB (STR #3535) - - MIME errors are now routed to the error_log file (STR #2410) - - Updated PDF filter to support new Ghostscript ps2write device - (STR #3766) - - Updated PDF filter to support new Poppler option to preserve page - sizes in PDF files when the user has not selected a particular media - size (STR #3689) - - Added new PWG Raster filter for IPP Everywhere printer support. - - Added job-uuid, printer-uuid, and subscription-uuid attributes. - - Added support for the cupsSingleFile PPD keyword. - - Dropped support for the printer-state-history attribute (STR #3654) - - Added support for a new cupsIPPSupplies keyword in PPD files to allow - drivers to disable IPP supply level reporting. - - Added support for a new cupsFilter2 keyword in PPD files to allow for - the propagation of the actual MIME media type produced by a filter. - - The scheduler did not always get the correct Kerberos username when - authenticating (STR #3670) - - Added new cupsRasterOpenIO function and CUPS_RASTER_WRITE_PWG to the - CUPS imaging library to support printing to IPP Everywhere raster - printers. - - The scheduler now provides default values for the pages-per-minute and - pages-per-minute-color attributes for PPD files that lack a - Throughput keyword. - - Email notifications did not work on Mac OS X. - - The cupstestppd program now shows an error for files missing a - CloseGroup keyword (STR #3668) - - Name resolution errors no longer cause queues to stop (STR #3719, - STR #3753) - - Added a new cups-exec helper program that applies security profiles - to filters, port monitors, backends, CGI programs, and mini-daemons. - - The web interface can now be disabled using the WebInterface directive - in cupsd.conf (STR #2625) - - The scheduler now provides privacy controls for jobs and subscriptions - (STR #2969) - - Added new cupsArrayNew3 API which offers memory management of array - elements. - - Added several new color spaces to the CUPS raster format (STR #3419) - - The Validate-Job operation now uses the same policy as Print-Job by - default. - - CUPS now uses iconv to implement all of its character encoding - support (STR #3097) - - The scheduler now implements the Cancel-Jobs, Cancel-My-Jobs, and - Close-Job operations along with the job-ids operation attribute from - PWG 5100.11. - - The main CUPS header () no longer includes the PPD header - (). - - The scheduler and CUPS API now support the print-quality job template - attribute. - - The scheduler no longer supports the old Mac OS X Server quota - plugin. - - The scheduler now allows writing to /Users/Shared from print filters - on Mac OS X. - - CUPS no longer supports the old ~/.cupsrc or ~/.lpoptions files from - CUPS 1.1.x. The ~/.cups/client.conf and ~/.cups/lpoptions files that - were introduced in CUPS 1.2 must now be used. - - The ipptest tool is now a first-class user program and has several - improvements along with new documentation (STR #3484) - - The cupstestppd tool now warns about non-unique filenames and - provides a way to ignore all filename warnings. - - Dropped support for the recoverable: and recovered: message prefixes. - - The scheduler now requires that filters and backends have group write - permissions disabled. - - The PPD compiler now checks for overlapping filenames when writing - PPD files. - - The HP-GL/2 filter is no longer included with CUPS (STR #3322) - - The SCSI backend is no longer included with CUPS (STR #3500) + - The PHP module has been removed (STR #3932) + - The bannertops, commandtoescpx, commandtopclx, imagetops, + imagetoraster, pdftops, rastertoescpx, rastertopclx, and texttops + filters have been removed (STR #3930) + - The serial and parallel backends have been removed (STR 3935) diff --git a/Makedefs.in b/Makedefs.in index 0d4397f5b..b9a97a3b1 100644 --- a/Makedefs.in +++ b/Makedefs.in @@ -30,7 +30,6 @@ LD = @LD@ LIBTOOL = @LIBTOOL@ LN = @LN@ -sf MV = @MV@ -PHPCONFIG = @PHPCONFIG@ RANLIB = @RANLIB@ RM = @RM@ -f RMDIR = @RMDIR@ @@ -79,19 +78,15 @@ UNINSTALL_LANGUAGES = @UNINSTALL_LANGUAGES@ LIBCUPS = @LIBCUPS@ LIBCUPSCGI = @LIBCUPSCGI@ -LIBCUPSDRIVER = @LIBCUPSDRIVER@ LIBCUPSIMAGE = @LIBCUPSIMAGE@ LIBCUPSMIME = @LIBCUPSMIME@ LIBCUPSPPDC = @LIBCUPSPPDC@ LIBCUPSSTATIC = @LIBCUPSSTATIC@ -LIBJPEG = @LIBJPEG@ LIBLDAP = @LIBLDAP@ LIBMALLOC = @LIBMALLOC@ LIBPAPER = @LIBPAPER@ -LIBPNG = @LIBPNG@ LIBSLP = @LIBSLP@ LIBGSSAPI = @LIBGSSAPI@ -LIBTIFF = @LIBTIFF@ LIBUSB = @LIBUSB@ LIBWRAP = @LIBWRAP@ LIBZ = @LIBZ@ @@ -135,7 +130,6 @@ ALL_CXXFLAGS = -I.. -D_CUPS_SOURCE $(CXXFLAGS) $(SSLFLAGS) \ ARCHFLAGS = @ARCHFLAGS@ ARFLAGS = @ARFLAGS@ BACKLIBS = @BACKLIBS@ -BANNERTOPS = @BANNERTOPS@ BUILDDIRS = @BUILDDIRS@ CFLAGS = @CPPFLAGS@ @CFLAGS@ COMMONLIBS = @LIBS@ @@ -147,28 +141,19 @@ DNSSD_BACKEND = @DNSSD_BACKEND@ DSOFLAGS = -L../cups @DSOFLAGS@ DSOLIBS = @DSOLIBS@ $(COMMONLIBS) DNSSDLIBS = @DNSSDLIBS@ -FONTS = @FONTS@ -IMGLIBS = @IMGLIBS@ -IMGFILTERS = @IMGFILTERS@ LAUNCHDLIBS = @LAUNCHDLIBS@ LDFLAGS = -L../cgi-bin -L../cups -L../filter -L../ppdc \ -L../scheduler @LDARCHFLAGS@ \ @LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM) -LEGACY_BACKENDS = @LEGACY_BACKENDS@ LINKCUPS = @LINKCUPS@ $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(LIBZ) LINKCUPSIMAGE = @LINKCUPSIMAGE@ LIBS = $(LINKCUPS) $(COMMONLIBS) OPTIM = @OPTIM@ OPTIONS = PAMLIBS = @PAMLIBS@ -PAP = @PAP@ -PDFTOPS = @PDFTOPS@ -PHPDIR = @PHPDIR@ -PHPOPTIONS = @PHPOPTIONS@ -I../.. `$(PHPCONFIG) --includes` SERVERLIBS = @SERVERLIBS@ SSLFLAGS = @SSLFLAGS@ SSLLIBS = @SSLLIBS@ -TEXTTOPS = @TEXTTOPS@ UNITTESTS = @UNITTESTS@ diff --git a/Makefile b/Makefile index 747955d75..96c73aba8 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ include Makedefs # Directories to make... # -DIRS = cups test $(BUILDDIRS) $(PHPDIR) $(FONTS) +DIRS = cups test $(BUILDDIRS) # @@ -285,7 +285,7 @@ docset: apihelp # sloc: - for dir in cups cupslite scheduler; do \ + for dir in cups scheduler; do \ (cd $$dir; $(MAKE) $(MFLAGS) sloc) || exit 1;\ done diff --git a/backend/Dependencies b/backend/Dependencies index 4f99c17ef..291418160 100644 --- a/backend/Dependencies +++ b/backend/Dependencies @@ -28,24 +28,6 @@ dnssd.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h dnssd.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h dnssd.o: ../cups/transcode.h ../cups/thread-private.h ../cups/snmp-private.h dnssd.o: ../cups/backend.h ../cups/sidechannel.h ../cups/array.h -parallel.o: backend-private.h ../cups/cups-private.h ../cups/cups.h -parallel.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -parallel.o: ../cups/array.h ../cups/language.h ../cups/string-private.h -parallel.o: ../config.h ../cups/debug-private.h ../cups/ppd-private.h -parallel.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h -parallel.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h -parallel.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h -parallel.o: ../cups/transcode.h ../cups/thread-private.h -parallel.o: ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h -serial.o: backend-private.h ../cups/cups-private.h ../cups/cups.h -serial.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -serial.o: ../cups/array.h ../cups/language.h ../cups/string-private.h -serial.o: ../config.h ../cups/debug-private.h ../cups/ppd-private.h -serial.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h -serial.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h -serial.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h -serial.o: ../cups/transcode.h ../cups/thread-private.h ../cups/snmp-private.h -serial.o: ../cups/backend.h ../cups/sidechannel.h snmp.o: backend-private.h ../cups/cups-private.h ../cups/cups.h snmp.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h snmp.o: ../cups/array.h ../cups/language.h ../cups/string-private.h diff --git a/backend/Makefile b/backend/Makefile index 5a0521cff..27f4e6859 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -21,13 +21,37 @@ include ../Makedefs # Object files... # -RBACKENDS = ipp lpd $(DNSSD_BACKEND) -UBACKENDS = $(LEGACY_BACKENDS) serial snmp socket usb -UNITTESTS = test1284 testbackend testsupplies -TARGETS = libbackend.a $(RBACKENDS) $(UBACKENDS) -LIBOBJS = ieee1284.o network.o runloop.o snmp-supplies.o -OBJS = ipp.o lpd.o dnssd.o parallel.o serial.o snmp.o \ - socket.o test1284.o testbackend.o testsupplies.o usb.o +RBACKENDS = \ + ipp \ + lpd \ + $(DNSSD_BACKEND) +UBACKENDS = \ + snmp \ + socket \ + usb +UNITTESTS = \ + test1284 \ + testbackend \ + testsupplies +TARGETS = \ + libbackend.a \ + $(RBACKENDS) \ + $(UBACKENDS) +LIBOBJS = \ + ieee1284.o \ + network.o \ + runloop.o \ + snmp-supplies.o +OBJS = \ + ipp.o \ + lpd.o \ + dnssd.o \ + snmp.o \ + socket.o \ + test1284.o \ + testbackend.o \ + testsupplies.o \ + usb.o # @@ -56,7 +80,7 @@ unittests: $(UNITTESTS) # clean: - $(RM) $(OBJS) $(TARGETS) $(UNITTESTS) $(LIBOBJS) http mdns + $(RM) $(OBJS) $(TARGETS) $(UNITTESTS) $(LIBOBJS) http https ipps mdns # @@ -226,24 +250,6 @@ lpd: lpd.o ../cups/$(LIBCUPS) libbackend.a $(CC) $(LDFLAGS) -o lpd lpd.o libbackend.a $(LIBS) -# -# parallel -# - -parallel: parallel.o ../cups/$(LIBCUPS) libbackend.a - echo Linking $@... - $(CC) $(LDFLAGS) -o parallel parallel.o libbackend.a $(LIBS) - - -# -# serial -# - -serial: serial.o ../cups/$(LIBCUPS) libbackend.a - echo Linking $@... - $(CC) $(LDFLAGS) -o serial serial.o libbackend.a $(BACKLIBS) $(LIBS) - - # # snmp # diff --git a/backend/easysw-firewire-design.txt b/backend/easysw-firewire-design.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/backend/easysw-firewire-linux.txt b/backend/easysw-firewire-linux.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/backend/ipp.c b/backend/ipp.c index d5e18fefc..67d05cfd9 100644 --- a/backend/ipp.c +++ b/backend/ipp.c @@ -111,7 +111,7 @@ static const char * const pattrs[] = /* Printer attributes we want */ "printer-is-accepting-jobs", "printer-state", "printer-state-message", - "printer-state-reasons", + "printer-state-reasons" }; static const char * const remote_job_states[] = { /* Remote job state keywords */ @@ -2824,6 +2824,7 @@ update_reasons(ipp_attribute_t *attr, /* I - printer-state-reasons or NULL */ if (strcmp(reason, "none") && strcmp(reason, "none-report") && strcmp(reason, "paused") && + strncmp(reason, "spool-area-full", 15) && strcmp(reason, "com.apple.print.recoverable-warning") && strncmp(reason, "cups-", 5)) cupsArrayAdd(new_reasons, reason); diff --git a/backend/parallel.c b/backend/parallel.c deleted file mode 100644 index 125aa8141..000000000 --- a/backend/parallel.c +++ /dev/null @@ -1,676 +0,0 @@ -/* - * "$Id: parallel.c 7810 2008-07-29 01:11:15Z mike $" - * - * Parallel port backend for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1997-2007 by Easy Software Products, all rights reserved. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * "LICENSE" which should have been included with this file. If this - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * main() - Send a file to the specified parallel port. - * list_devices() - List all parallel devices. - * side_cb() - Handle side-channel requests... - */ - -/* - * Include necessary headers. - */ - -#include "backend-private.h" - -#ifdef __hpux -# include -#else -# include -#endif /* __hpux */ - -#ifdef WIN32 -# include -#else -# include -# include -# include -# include -#endif /* WIN32 */ - -#ifdef __sgi -# include -# ifndef INV_EPP_ECP_PLP -# define INV_EPP_ECP_PLP 6 /* From 6.3/6.4/6.5 sys/invent.h */ -# define INV_ASO_SERIAL 14 /* serial portion of SGI ASO board */ -# define INV_IOC3_DMA 16 /* DMA mode IOC3 serial */ -# define INV_IOC3_PIO 17 /* PIO mode IOC3 serial */ -# define INV_ISA_DMA 19 /* DMA mode ISA serial -- O2 */ -# endif /* !INV_EPP_ECP_PLP */ -#endif /* __sgi */ - - -/* - * Local functions... - */ - -static void list_devices(void); -static int side_cb(int print_fd, int device_fd, int snmp_fd, - http_addr_t *addr, int use_bc); - - -/* - * 'main()' - Send a file to the specified parallel port. - * - * Usage: - * - * printer-uri job-id user title copies options [file] - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments (6 or 7) */ - char *argv[]) /* I - Command-line arguments */ -{ - char method[255], /* Method in URI */ - hostname[1024], /* Hostname */ - username[255], /* Username info (not used) */ - resource[1024], /* Resource info (device and options) */ - *options; /* Pointer to options */ - int port; /* Port number (not used) */ - int print_fd, /* Print file */ - device_fd, /* Parallel device */ - use_bc; /* Read back-channel data? */ - int copies; /* Number of copies to print */ - ssize_t tbytes; /* Total number of bytes written */ - struct termios opts; /* Parallel port options */ -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ - - - /* - * Make sure status messages are not buffered... - */ - - setbuf(stderr, NULL); - - /* - * Ignore SIGPIPE signals... - */ - -#ifdef HAVE_SIGSET - sigset(SIGPIPE, SIG_IGN); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - action.sa_handler = SIG_IGN; - sigaction(SIGPIPE, &action, NULL); -#else - signal(SIGPIPE, SIG_IGN); -#endif /* HAVE_SIGSET */ - - /* - * Check command-line... - */ - - if (argc == 1) - { - list_devices(); - return (CUPS_BACKEND_OK); - } - else if (argc < 6 || argc > 7) - { - _cupsLangPrintf(stderr, - _("Usage: %s job-id user title copies options [file]"), - argv[0]); - return (CUPS_BACKEND_FAILED); - } - - /* - * If we have 7 arguments, print the file named on the command-line. - * Otherwise, send stdin instead... - */ - - if (argc == 6) - { - print_fd = 0; - copies = 1; - } - else - { - /* - * Try to open the print file... - */ - - if ((print_fd = open(argv[6], O_RDONLY)) < 0) - { - _cupsLangPrintError("ERROR", _("Unable to open print file")); - return (CUPS_BACKEND_FAILED); - } - - copies = atoi(argv[4]); - } - - /* - * Extract the device name and options from the URI... - */ - - httpSeparateURI(HTTP_URI_CODING_ALL, cupsBackendDeviceURI(argv), - method, sizeof(method), username, sizeof(username), - hostname, sizeof(hostname), &port, - resource, sizeof(resource)); - - /* - * See if there are any options... - */ - - if ((options = strchr(resource, '?')) != NULL) - { - /* - * Yup, terminate the device name string and move to the first - * character of the options... - */ - - *options++ = '\0'; - } - - /* - * Open the parallel port device... - */ - - fputs("STATE: +connecting-to-device\n", stderr); - - do - { -#if defined(__linux) || defined(__FreeBSD__) - /* - * The Linux and FreeBSD parallel port drivers currently are broken WRT - * select() and bidirection I/O... - */ - - device_fd = open(resource, O_WRONLY | O_EXCL); - use_bc = 0; - -#else - if ((device_fd = open(resource, O_RDWR | O_EXCL)) < 0) - { - device_fd = open(resource, O_WRONLY | O_EXCL); - use_bc = 0; - } - else - use_bc = 1; -#endif /* __linux || __FreeBSD__ */ - - if (device_fd == -1) - { - if (getenv("CLASS") != NULL) - { - /* - * If the CLASS environment variable is set, the job was submitted - * to a class and not to a specific queue. In this case, we want - * to abort immediately so that the job can be requeued on the next - * available printer in the class. - */ - - _cupsLangPrintFilter(stderr, "INFO", - _("Unable to contact printer, queuing on next " - "printer in class.")); - - /* - * Sleep 5 seconds to keep the job from requeuing too rapidly... - */ - - sleep(5); - - return (CUPS_BACKEND_FAILED); - } - - if (errno == EBUSY) - { - _cupsLangPrintFilter(stderr, "INFO", - _("Printer busy; will retry in 30 seconds.")); - sleep(30); - } - else if (errno == ENXIO || errno == EIO || errno == ENOENT) - { - _cupsLangPrintFilter(stderr, "INFO", - _("Printer not connected; will retry in 30 " - "seconds.")); - sleep(30); - } - else - { - _cupsLangPrintError("ERROR", _("Unable to open device file")); - return (CUPS_BACKEND_FAILED); - } - } - } - while (device_fd < 0); - - fputs("STATE: -connecting-to-device\n", stderr); - - /* - * Set any options provided... - */ - - tcgetattr(device_fd, &opts); - - opts.c_lflag &= ~(ICANON | ECHO | ISIG); /* Raw mode */ - - /**** No options supported yet ****/ - - tcsetattr(device_fd, TCSANOW, &opts); - - /* - * Finally, send the print file... - */ - - tbytes = 0; - - while (copies > 0 && tbytes >= 0) - { - copies --; - - if (print_fd != 0) - { - fputs("PAGE: 1 1\n", stderr); - lseek(print_fd, 0, SEEK_SET); - } - - tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 1, side_cb); - - if (print_fd != 0 && tbytes >= 0) - _cupsLangPrintFilter(stderr, "INFO", _("Print file sent.")); - } - - /* - * Close the socket connection and input file and return... - */ - - close(device_fd); - - if (print_fd != 0) - close(print_fd); - - return (CUPS_BACKEND_OK); -} - - -/* - * 'list_devices()' - List all parallel devices. - */ - -static void -list_devices(void) -{ -#if defined(__hpux) || defined(__sgi) || defined(__sun) - static char *funky_hex = "0123456789abcdefghijklmnopqrstuvwxyz"; - /* Funky hex numbering used for some devices */ -#endif /* __hpux || __sgi || __sun */ - -#ifdef __linux - int i; /* Looping var */ - int fd; /* File descriptor */ - char device[255], /* Device filename */ - basedevice[255], /* Base device filename for ports */ - device_id[1024], /* Device ID string */ - make_model[1024], /* Make and model */ - info[1024], /* Info string */ - uri[1024]; /* Device URI */ - - - if (!access("/dev/parallel/", 0)) - strcpy(basedevice, "/dev/parallel/"); - else if (!access("/dev/printers/", 0)) - strcpy(basedevice, "/dev/printers/"); - else - strcpy(basedevice, "/dev/lp"); - - for (i = 0; i < 4; i ++) - { - /* - * Open the port, if available... - */ - - sprintf(device, "%s%d", basedevice, i); - if ((fd = open(device, O_RDWR | O_EXCL)) < 0) - fd = open(device, O_WRONLY); - - if (fd >= 0) - { - /* - * Now grab the IEEE 1284 device ID string... - */ - - snprintf(uri, sizeof(uri), "parallel:%s", device); - - if (!backendGetDeviceID(fd, device_id, sizeof(device_id), - make_model, sizeof(make_model), - NULL, uri, sizeof(uri))) - { - snprintf(info, sizeof(info), "%s LPT #%d", make_model, i + 1); - cupsBackendReport("direct", uri, make_model, info, device_id, NULL); - } - else - { - snprintf(info, sizeof(info), "LPT #%d", i + 1); - cupsBackendReport("direct", uri, NULL, info, NULL, NULL); - } - - close(fd); - } - } -#elif defined(__sgi) - int i, j, n; /* Looping vars */ - char device[255]; /* Device filename */ - inventory_t *inv; /* Hardware inventory info */ - - - /* - * IRIX maintains a hardware inventory of most devices... - */ - - setinvent(); - - while ((inv = getinvent()) != NULL) - { - if (inv->inv_class == INV_PARALLEL && - (inv->inv_type == INV_ONBOARD_PLP || - inv->inv_type == INV_EPP_ECP_PLP)) - { - /* - * Standard parallel port... - */ - - puts("direct parallel:/dev/plp \"Unknown\" \"Onboard Parallel Port\""); - } - else if (inv->inv_class == INV_PARALLEL && - inv->inv_type == INV_EPC_PLP) - { - /* - * EPC parallel port... - */ - - printf("direct parallel:/dev/plp%d \"Unknown\" \"Integral EPC parallel port, Ebus slot %d\"\n", - inv->inv_controller, inv->inv_controller); - } - } - - endinvent(); - - /* - * Central Data makes serial and parallel "servers" that can be - * connected in a number of ways. Look for ports... - */ - - for (i = 0; i < 10; i ++) - for (j = 0; j < 8; j ++) - for (n = 0; n < 32; n ++) - { - if (i == 8) /* EtherLite */ - sprintf(device, "/dev/lpn%d%c", j, funky_hex[n]); - else if (i == 9) /* PCI */ - sprintf(device, "/dev/lpp%d%c", j, funky_hex[n]); - else /* SCSI */ - sprintf(device, "/dev/lp%d%d%c", i, j, funky_hex[n]); - - if (access(device, 0) == 0) - { - if (i == 8) - printf("direct parallel:%s \"Unknown\" \"Central Data EtherLite Parallel Port, ID %d, port %d\"\n", - device, j, n); - else if (i == 9) - printf("direct parallel:%s \"Unknown\" \"Central Data PCI Parallel Port, ID %d, port %d\"\n", - device, j, n); - else - printf("direct parallel:%s \"Unknown\" \"Central Data SCSI Parallel Port, logical bus %d, ID %d, port %d\"\n", - device, i, j, n); - } - } -#elif defined(__sun) - int i, j, n; /* Looping vars */ - char device[255]; /* Device filename */ - - - /* - * Standard parallel ports... - */ - - for (i = 0; i < 10; i ++) - { - sprintf(device, "/dev/ecpp%d", i); - if (access(device, 0) == 0) - printf("direct parallel:%s \"Unknown\" \"Sun IEEE-1284 Parallel Port #%d\"\n", - device, i + 1); - } - - for (i = 0; i < 10; i ++) - { - sprintf(device, "/dev/bpp%d", i); - if (access(device, 0) == 0) - printf("direct parallel:%s \"Unknown\" \"Sun Standard Parallel Port #%d\"\n", - device, i + 1); - } - - for (i = 0; i < 3; i ++) - { - sprintf(device, "/dev/lp%d", i); - - if (access(device, 0) == 0) - printf("direct parallel:%s \"Unknown\" \"PC Parallel Port #%d\"\n", - device, i + 1); - } - - /* - * MAGMA parallel ports... - */ - - for (i = 0; i < 40; i ++) - { - sprintf(device, "/dev/pm%02d", i); - if (access(device, 0) == 0) - printf("direct parallel:%s \"Unknown\" \"MAGMA Parallel Board #%d Port #%d\"\n", - device, (i / 10) + 1, (i % 10) + 1); - } - - /* - * Central Data parallel ports... - */ - - for (i = 0; i < 9; i ++) - for (j = 0; j < 8; j ++) - for (n = 0; n < 32; n ++) - { - if (i == 8) /* EtherLite */ - sprintf(device, "/dev/sts/lpN%d%c", j, funky_hex[n]); - else - sprintf(device, "/dev/sts/lp%c%d%c", i + 'C', j, - funky_hex[n]); - - if (access(device, 0) == 0) - { - if (i == 8) - printf("direct parallel:%s \"Unknown\" \"Central Data EtherLite Parallel Port, ID %d, port %d\"\n", - device, j, n); - else - printf("direct parallel:%s \"Unknown\" \"Central Data SCSI Parallel Port, logical bus %d, ID %d, port %d\"\n", - device, i, j, n); - } - } -#elif defined(__hpux) - int i, j, n; /* Looping vars */ - char device[255]; /* Device filename */ - - - /* - * Standard parallel ports... - */ - - if (access("/dev/rlp", 0) == 0) - puts("direct parallel:/dev/rlp \"Unknown\" \"Standard Parallel Port (/dev/rlp)\""); - - for (i = 0; i < 7; i ++) - for (j = 0; j < 7; j ++) - { - sprintf(device, "/dev/c%dt%dd0_lp", i, j); - if (access(device, 0) == 0) - printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d,%d\"\n", - device, i, j); - } - - /* - * Central Data parallel ports... - */ - - for (i = 0; i < 9; i ++) - for (j = 0; j < 8; j ++) - for (n = 0; n < 32; n ++) - { - if (i == 8) /* EtherLite */ - sprintf(device, "/dev/lpN%d%c", j, funky_hex[n]); - else - sprintf(device, "/dev/lp%c%d%c", i + 'C', j, - funky_hex[n]); - - if (access(device, 0) == 0) - { - if (i == 8) - printf("direct parallel:%s \"Unknown\" \"Central Data EtherLite Parallel Port, ID %d, port %d\"\n", - device, j, n); - else - printf("direct parallel:%s \"Unknown\" \"Central Data SCSI Parallel Port, logical bus %d, ID %d, port %d\"\n", - device, i, j, n); - } - } -#elif defined(__osf__) - int i; /* Looping var */ - int fd; /* File descriptor */ - char device[255]; /* Device filename */ - - - for (i = 0; i < 3; i ++) - { - sprintf(device, "/dev/lp%d", i); - if ((fd = open(device, O_WRONLY)) >= 0) - { - close(fd); - printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d\"\n", device, i + 1); - } - } -#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) - int i; /* Looping var */ - int fd; /* File descriptor */ - char device[255]; /* Device filename */ - - - for (i = 0; i < 3; i ++) - { - sprintf(device, "/dev/lpt%d", i); - if ((fd = open(device, O_WRONLY)) >= 0) - { - close(fd); - printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d (interrupt-driven)\"\n", device, i + 1); - } - - sprintf(device, "/dev/lpa%d", i); - if ((fd = open(device, O_WRONLY)) >= 0) - { - close(fd); - printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d (polled)\"\n", device, i + 1); - } - } -#elif defined(_AIX) - int i; /* Looping var */ - int fd; /* File descriptor */ - char device[255]; /* Device filename */ - - - for (i = 0; i < 8; i ++) - { - sprintf(device, "/dev/lp%d", i); - if ((fd = open(device, O_WRONLY)) >= 0) - { - close(fd); - printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d\"\n", device, i + 1); - } - } -#endif -} - - -/* - * 'side_cb()' - Handle side-channel requests... - */ - -static int /* O - 0 on success, -1 on error */ -side_cb(int print_fd, /* I - Print file */ - int device_fd, /* I - Device file */ - int snmp_fd, /* I - SNMP socket (unused) */ - http_addr_t *addr, /* I - Device address (unused) */ - int use_bc) /* I - Using back-channel? */ -{ - cups_sc_command_t command; /* Request command */ - cups_sc_status_t status; /* Request/response status */ - char data[2048]; /* Request/response data */ - int datalen; /* Request/response data size */ - - - (void)snmp_fd; - (void)addr; - - datalen = sizeof(data); - - if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0)) - return (-1); - - switch (command) - { - case CUPS_SC_CMD_DRAIN_OUTPUT : - if (backendDrainOutput(print_fd, device_fd)) - status = CUPS_SC_STATUS_IO_ERROR; - else if (tcdrain(device_fd)) - status = CUPS_SC_STATUS_IO_ERROR; - else - status = CUPS_SC_STATUS_OK; - - datalen = 0; - break; - - case CUPS_SC_CMD_GET_BIDI : - status = CUPS_SC_STATUS_OK; - data[0] = use_bc; - datalen = 1; - break; - - case CUPS_SC_CMD_GET_DEVICE_ID : - memset(data, 0, sizeof(data)); - - if (backendGetDeviceID(device_fd, data, sizeof(data) - 1, - NULL, 0, NULL, NULL, 0)) - { - status = CUPS_SC_STATUS_NOT_IMPLEMENTED; - datalen = 0; - } - else - { - status = CUPS_SC_STATUS_OK; - datalen = strlen(data); - } - break; - - default : - status = CUPS_SC_STATUS_NOT_IMPLEMENTED; - datalen = 0; - break; - } - - return (cupsSideChannelWrite(command, status, data, datalen, 1.0)); -} - - -/* - * End of "$Id: parallel.c 7810 2008-07-29 01:11:15Z mike $". - */ diff --git a/backend/serial.c b/backend/serial.c deleted file mode 100644 index def68cb85..000000000 --- a/backend/serial.c +++ /dev/null @@ -1,1327 +0,0 @@ -/* - * "$Id: serial.c 7647 2008-06-16 17:39:40Z mike $" - * - * Serial port backend for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1997-2007 by Easy Software Products, all rights reserved. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * "LICENSE" which should have been included with this file. If this - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * main() - Send a file to the printer or server. - * list_devices() - List all serial devices. - * side_cb() - Handle side-channel requests... - */ - -/* - * Include necessary headers. - */ - -#include "backend-private.h" -#include - -#ifdef __hpux -# include -#endif /* __hpux */ - -#ifdef WIN32 -# include -#else -# include -# include -# include -# ifdef __hpux -# include -# else -# include -# endif /* __hpux */ -# ifdef HAVE_SYS_IOCTL_H -# include -# endif /* HAVE_SYS_IOCTL_H */ -#endif /* WIN32 */ - -#ifdef __sgi -# include -# ifndef INV_EPP_ECP_PLP -# define INV_EPP_ECP_PLP 6 /* From 6.3/6.4/6.5 sys/invent.h */ -# define INV_ASO_SERIAL 14 /* serial portion of SGI ASO board */ -# define INV_IOC3_DMA 16 /* DMA mode IOC3 serial */ -# define INV_IOC3_PIO 17 /* PIO mode IOC3 serial */ -# define INV_ISA_DMA 19 /* DMA mode ISA serial -- O2 */ -# endif /* !INV_EPP_ECP_PLP */ -#endif /* __sgi */ - -#ifndef CRTSCTS -# ifdef CNEW_RTSCTS -# define CRTSCTS CNEW_RTSCTS -# else -# define CRTSCTS 0 -# endif /* CNEW_RTSCTS */ -#endif /* !CRTSCTS */ - -#if defined(__APPLE__) -# include -# include -# include -# include -#endif /* __APPLE__ */ - -#if defined(__linux) && defined(TIOCGSERIAL) -# include -# include -#endif /* __linux && TIOCGSERIAL */ - - -/* - * Local functions... - */ - -static void list_devices(void); -static int side_cb(int print_fd, int device_fd, int use_bc); - - -/* - * 'main()' - Send a file to the printer or server. - * - * Usage: - * - * printer-uri job-id user title copies options [file] - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments (6 or 7) */ - char *argv[]) /* I - Command-line arguments */ -{ - char method[255], /* Method in URI */ - hostname[1024], /* Hostname */ - username[255], /* Username info (not used) */ - resource[1024], /* Resource info (device and options) */ - *options, /* Pointer to options */ - *name, /* Name of option */ - *value, /* Value of option */ - sep; /* Option separator */ - int port; /* Port number (not used) */ - int copies; /* Number of copies to print */ - int side_eof = 0, /* Saw EOF on side-channel? */ - print_fd, /* Print file */ - device_fd; /* Serial device */ - int nfds; /* Maximum file descriptor value + 1 */ - fd_set input, /* Input set for reading */ - output; /* Output set for writing */ - ssize_t print_bytes, /* Print bytes read */ - bc_bytes, /* Backchannel bytes read */ - total_bytes, /* Total bytes written */ - bytes; /* Bytes written */ - int dtrdsr; /* Do dtr/dsr flow control? */ - int print_size; /* Size of output buffer for writes */ - char print_buffer[8192], /* Print data buffer */ - *print_ptr, /* Pointer into print data buffer */ - bc_buffer[1024]; /* Back-channel data buffer */ - struct termios opts; /* Serial port options */ - struct termios origopts; /* Original port options */ -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ - - - /* - * Make sure status messages are not buffered... - */ - - setbuf(stderr, NULL); - - /* - * Ignore SIGPIPE signals... - */ - -#ifdef HAVE_SIGSET - sigset(SIGPIPE, SIG_IGN); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - action.sa_handler = SIG_IGN; - sigaction(SIGPIPE, &action, NULL); -#else - signal(SIGPIPE, SIG_IGN); -#endif /* HAVE_SIGSET */ - - /* - * Check command-line... - */ - - if (argc == 1) - { - list_devices(); - return (CUPS_BACKEND_OK); - } - else if (argc < 6 || argc > 7) - { - _cupsLangPrintf(stderr, - _("Usage: %s job-id user title copies options [file]"), - argv[0]); - return (CUPS_BACKEND_FAILED); - } - - /* - * If we have 7 arguments, print the file named on the command-line. - * Otherwise, send stdin instead... - */ - - if (argc == 6) - { - print_fd = 0; - copies = 1; - } - else - { - /* - * Try to open the print file... - */ - - if ((print_fd = open(argv[6], O_RDONLY)) < 0) - { - _cupsLangPrintError("ERROR", _("Unable to open print file")); - return (CUPS_BACKEND_FAILED); - } - - copies = atoi(argv[4]); - } - - /* - * Extract the device name and options from the URI... - */ - - httpSeparateURI(HTTP_URI_CODING_ALL, cupsBackendDeviceURI(argv), - method, sizeof(method), username, sizeof(username), - hostname, sizeof(hostname), &port, - resource, sizeof(resource)); - - /* - * See if there are any options... - */ - - if ((options = strchr(resource, '?')) != NULL) - { - /* - * Yup, terminate the device name string and move to the first - * character of the options... - */ - - *options++ = '\0'; - } - - /* - * Open the serial port device... - */ - - fputs("STATE: +connecting-to-device\n", stderr); - - do - { - if ((device_fd = open(resource, O_RDWR | O_NOCTTY | O_EXCL | - O_NDELAY)) == -1) - { - if (getenv("CLASS") != NULL) - { - /* - * If the CLASS environment variable is set, the job was submitted - * to a class and not to a specific queue. In this case, we want - * to abort immediately so that the job can be requeued on the next - * available printer in the class. - */ - - _cupsLangPrintFilter(stderr, "INFO", - _("Unable to contact printer, queuing on next " - "printer in class.")); - - /* - * Sleep 5 seconds to keep the job from requeuing too rapidly... - */ - - sleep(5); - - return (CUPS_BACKEND_FAILED); - } - - if (errno == EBUSY) - { - _cupsLangPrintFilter(stderr, "INFO", - _("Printer busy; will retry in 30 seconds.")); - sleep(30); - } - else - { - _cupsLangPrintError("ERROR", _("Unable to open device file")); - return (CUPS_BACKEND_FAILED); - } - } - } - while (device_fd < 0); - - fputs("STATE: -connecting-to-device\n", stderr); - - /* - * Set any options provided... - */ - - tcgetattr(device_fd, &origopts); - tcgetattr(device_fd, &opts); - - opts.c_lflag &= ~(ICANON | ECHO | ISIG); - /* Raw mode */ - opts.c_oflag &= ~OPOST; /* Don't post-process */ - - print_size = 96; /* 9600 baud / 10 bits/char / 10Hz */ - dtrdsr = 0; /* No dtr/dsr flow control */ - - if (options) - { - while (*options) - { - /* - * Get the name... - */ - - name = options; - - while (*options && *options != '=' && *options != '+' && *options != '&') - options ++; - - if ((sep = *options) != '\0') - *options++ = '\0'; - - if (sep == '=') - { - /* - * Get the value... - */ - - value = options; - - while (*options && *options != '+' && *options != '&') - options ++; - - if (*options) - *options++ = '\0'; - } - else - value = (char *)""; - - /* - * Process the option... - */ - - if (!_cups_strcasecmp(name, "baud")) - { - /* - * Set the baud rate... - */ - - print_size = atoi(value) / 100; - -#if B19200 == 19200 - cfsetispeed(&opts, atoi(value)); - cfsetospeed(&opts, atoi(value)); -#else - switch (atoi(value)) - { - case 1200 : - cfsetispeed(&opts, B1200); - cfsetospeed(&opts, B1200); - break; - case 2400 : - cfsetispeed(&opts, B2400); - cfsetospeed(&opts, B2400); - break; - case 4800 : - cfsetispeed(&opts, B4800); - cfsetospeed(&opts, B4800); - break; - case 9600 : - cfsetispeed(&opts, B9600); - cfsetospeed(&opts, B9600); - break; - case 19200 : - cfsetispeed(&opts, B19200); - cfsetospeed(&opts, B19200); - break; - case 38400 : - cfsetispeed(&opts, B38400); - cfsetospeed(&opts, B38400); - break; -# ifdef B57600 - case 57600 : - cfsetispeed(&opts, B57600); - cfsetospeed(&opts, B57600); - break; -# endif /* B57600 */ -# ifdef B115200 - case 115200 : - cfsetispeed(&opts, B115200); - cfsetospeed(&opts, B115200); - break; -# endif /* B115200 */ -# ifdef B230400 - case 230400 : - cfsetispeed(&opts, B230400); - cfsetospeed(&opts, B230400); - break; -# endif /* B230400 */ - default : - _cupsLangPrintFilter(stderr, "WARNING", - _("Unsupported baud rate: %s"), value); - break; - } -#endif /* B19200 == 19200 */ - } - else if (!_cups_strcasecmp(name, "bits")) - { - /* - * Set number of data bits... - */ - - switch (atoi(value)) - { - case 7 : - opts.c_cflag &= ~CSIZE; - opts.c_cflag |= CS7; - opts.c_cflag |= PARENB; - opts.c_cflag &= ~PARODD; - break; - case 8 : - opts.c_cflag &= ~CSIZE; - opts.c_cflag |= CS8; - opts.c_cflag &= ~PARENB; - break; - } - } - else if (!_cups_strcasecmp(name, "parity")) - { - /* - * Set parity checking... - */ - - if (!_cups_strcasecmp(value, "even")) - { - opts.c_cflag |= PARENB; - opts.c_cflag &= ~PARODD; - } - else if (!_cups_strcasecmp(value, "odd")) - { - opts.c_cflag |= PARENB; - opts.c_cflag |= PARODD; - } - else if (!_cups_strcasecmp(value, "none")) - opts.c_cflag &= ~PARENB; - else if (!_cups_strcasecmp(value, "space")) - { - /* - * Note: we only support space parity with 7 bits per character... - */ - - opts.c_cflag &= ~CSIZE; - opts.c_cflag |= CS8; - opts.c_cflag &= ~PARENB; - } - else if (!_cups_strcasecmp(value, "mark")) - { - /* - * Note: we only support mark parity with 7 bits per character - * and 1 stop bit... - */ - - opts.c_cflag &= ~CSIZE; - opts.c_cflag |= CS7; - opts.c_cflag &= ~PARENB; - opts.c_cflag |= CSTOPB; - } - } - else if (!_cups_strcasecmp(name, "flow")) - { - /* - * Set flow control... - */ - - if (!_cups_strcasecmp(value, "none")) - { - opts.c_iflag &= ~(IXON | IXOFF); - opts.c_cflag &= ~CRTSCTS; - } - else if (!_cups_strcasecmp(value, "soft")) - { - opts.c_iflag |= IXON | IXOFF; - opts.c_cflag &= ~CRTSCTS; - } - else if (!_cups_strcasecmp(value, "hard") || - !_cups_strcasecmp(value, "rtscts")) - { - opts.c_iflag &= ~(IXON | IXOFF); - opts.c_cflag |= CRTSCTS; - } - else if (!_cups_strcasecmp(value, "dtrdsr")) - { - opts.c_iflag &= ~(IXON | IXOFF); - opts.c_cflag &= ~CRTSCTS; - - dtrdsr = 1; - } - } - else if (!_cups_strcasecmp(name, "stop")) - { - switch (atoi(value)) - { - case 1 : - opts.c_cflag &= ~CSTOPB; - break; - - case 2 : - opts.c_cflag |= CSTOPB; - break; - } - } - } - } - - tcsetattr(device_fd, TCSANOW, &opts); - fcntl(device_fd, F_SETFL, 0); - - /* - * Now that we are "connected" to the port, ignore SIGTERM so that we - * can finish out any page data the driver sends (e.g. to eject the - * current page... Only ignore SIGTERM if we are printing data from - * stdin (otherwise you can't cancel raw jobs...) - */ - - if (!print_fd) - { -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, SIG_IGN); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_IGN; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, SIG_IGN); -#endif /* HAVE_SIGSET */ - } - - /* - * Figure out the maximum file descriptor value to use with select()... - */ - - nfds = (print_fd > device_fd ? print_fd : device_fd) + 1; - - /* - * Finally, send the print file. Ordinarily we would just use the - * backendRunLoop() function, however since we need to use smaller - * writes and may need to do DSR/DTR flow control, we duplicate much - * of the code here instead... - */ - - if (print_size > sizeof(print_buffer)) - print_size = sizeof(print_buffer); - - total_bytes = 0; - - while (copies > 0) - { - copies --; - - if (print_fd != 0) - { - fputs("PAGE: 1 1\n", stderr); - lseek(print_fd, 0, SEEK_SET); - } - - /* - * Now loop until we are out of data from print_fd... - */ - - for (print_bytes = 0, print_ptr = print_buffer;;) - { - /* - * Use select() to determine whether we have data to copy around... - */ - - FD_ZERO(&input); - if (!print_bytes) - FD_SET(print_fd, &input); - FD_SET(device_fd, &input); - if (!print_bytes && !side_eof) - FD_SET(CUPS_SC_FD, &input); - - FD_ZERO(&output); - if (print_bytes) - FD_SET(device_fd, &output); - - if (select(nfds, &input, &output, NULL, NULL) < 0) - continue; /* Ignore errors here */ - - /* - * Check if we have a side-channel request ready... - */ - - if (FD_ISSET(CUPS_SC_FD, &input)) - { - /* - * Do the side-channel request, then start back over in the select - * loop since it may have read from print_fd... - */ - - if (side_cb(print_fd, device_fd, 1)) - side_eof = 1; - continue; - } - - /* - * Check if we have back-channel data ready... - */ - - if (FD_ISSET(device_fd, &input)) - { - if ((bc_bytes = read(device_fd, bc_buffer, sizeof(bc_buffer))) > 0) - { - fprintf(stderr, - "DEBUG: Received " CUPS_LLFMT " bytes of back-channel data\n", - CUPS_LLCAST bc_bytes); - cupsBackChannelWrite(bc_buffer, bc_bytes, 1.0); - } - } - - /* - * Check if we have print data ready... - */ - - if (FD_ISSET(print_fd, &input)) - { - if ((print_bytes = read(print_fd, print_buffer, print_size)) < 0) - { - /* - * Read error - bail if we don't see EAGAIN or EINTR... - */ - - if (errno != EAGAIN || errno != EINTR) - { - perror("DEBUG: Unable to read print data"); - - tcsetattr(device_fd, TCSADRAIN, &origopts); - - close(device_fd); - - if (print_fd != 0) - close(print_fd); - - return (CUPS_BACKEND_FAILED); - } - - print_bytes = 0; - } - else if (print_bytes == 0) - { - /* - * End of file, break out of the loop... - */ - - break; - } - - print_ptr = print_buffer; - } - - /* - * Check if the device is ready to receive data and we have data to - * send... - */ - - if (print_bytes && FD_ISSET(device_fd, &output)) - { - if (dtrdsr) - { - /* - * Check the port and sleep until DSR is set... - */ - - int status; - - - if (!ioctl(device_fd, TIOCMGET, &status)) - if (!(status & TIOCM_DSR)) - { - /* - * Wait for DSR to go high... - */ - - fputs("DEBUG: DSR is low; waiting for device...\n", stderr); - - do - { - /* - * Poll every 100ms... - */ - - usleep(100000); - - if (ioctl(device_fd, TIOCMGET, &status)) - break; - } - while (!(status & TIOCM_DSR)); - - fputs("DEBUG: DSR is high; writing to device...\n", stderr); - } - } - - if ((bytes = write(device_fd, print_ptr, print_bytes)) < 0) - { - /* - * Write error - bail if we don't see an error we can retry... - */ - - if (errno != EAGAIN && errno != EINTR && errno != ENOTTY) - { - perror("DEBUG: Unable to write print data"); - - tcsetattr(device_fd, TCSADRAIN, &origopts); - - close(device_fd); - - if (print_fd != 0) - close(print_fd); - - return (CUPS_BACKEND_FAILED); - } - } - else - { - fprintf(stderr, "DEBUG: Wrote %d bytes...\n", (int)bytes); - - print_bytes -= bytes; - print_ptr += bytes; - total_bytes += bytes; - } - } - } - } - - /* - * Close the serial port and input file and return... - */ - - tcsetattr(device_fd, TCSADRAIN, &origopts); - - close(device_fd); - - if (print_fd != 0) - close(print_fd); - - return (CUPS_BACKEND_OK); -} - - -/* - * 'list_devices()' - List all serial devices. - */ - -static void -list_devices(void) -{ -#if defined(__hpux) || defined(__sgi) || defined(__sun) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) - static char *funky_hex = "0123456789abcdefghijklmnopqrstuvwxyz"; - /* Funky hex numbering used for some * - * devices */ -#endif /* __hpux || __sgi || __sun || __FreeBSD__ || __OpenBSD__ || __FreeBSD_kernel__ */ - - -#ifdef __linux - int i, j; /* Looping vars */ - int fd; /* File descriptor */ - char device[255]; /* Device filename */ - char info[255]; /* Device info/description */ -# ifdef TIOCGSERIAL - struct serial_struct serinfo; /* serial port info */ -# endif /* TIOCGSERIAL */ - - - for (i = 0; i < 100; i ++) - { - sprintf(device, "/dev/ttyS%d", i); - - if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) - { -# ifdef TIOCGSERIAL - /* - * See if this port exists... - */ - - serinfo.reserved_char[0] = 0; - - if (!ioctl(fd, TIOCGSERIAL, &serinfo)) - { - if (serinfo.type == PORT_UNKNOWN) - { - /* - * Nope... - */ - - close(fd); - continue; - } - } -# endif /* TIOCGSERIAL */ - - close(fd); - - snprintf(info, sizeof(info), - _cupsLangString(cupsLangDefault(), _("Serial Port #%d")), i + 1); - -# if defined(_ARCH_PPC) || defined(powerpc) || defined(__powerpc) - printf("serial serial:%s?baud=230400 \"Unknown\" \"%s\"\n", device, info); -# else - printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", device, info); -# endif /* _ARCH_PPC || powerpc || __powerpc */ - } - } - - for (i = 0; i < 16; i ++) - { - snprintf(info, sizeof(info), - _cupsLangString(cupsLangDefault(), _("USB Serial Port #%d")), - i + 1); - - sprintf(device, "/dev/usb/ttyUSB%d", i); - if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) - { - close(fd); - printf("serial serial:%s?baud=230400 \"Unknown\" \"%s\"\n", device, info); - } - - sprintf(device, "/dev/ttyUSB%d", i); - if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) - { - close(fd); - printf("serial serial:%s?baud=230400 \"Unknown\" \"%s\"\n", device, info); - } - } - - for (i = 0; i < 64; i ++) - { - for (j = 0; j < 8; j ++) - { - sprintf(device, "/dev/ttyQ%02de%d", i, j); - if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) - { - close(fd); - - printf("serial serial:%s?baud=115200 \"Unknown\" " - "\"Equinox ESP %d Port #%d\"\n", device, i, j + 1); - } - } - } -#elif defined(__sgi) - int i, j, n; /* Looping vars */ - char device[255]; /* Device filename */ - inventory_t *inv; /* Hardware inventory info */ - - - /* - * IRIX maintains a hardware inventory of most devices... - */ - - setinvent(); - - while ((inv = getinvent()) != NULL) - { - if (inv->inv_class == INV_SERIAL) - { - /* - * Some sort of serial port... - */ - - if (inv->inv_type == INV_CDSIO || inv->inv_type == INV_CDSIO_E) - { - /* - * CDSIO port... - */ - - for (n = 0; n < 6; n ++) - printf("serial serial:/dev/ttyd%d?baud=38400 \"Unknown\" \"CDSIO Board %d Serial Port #%d\"\n", - n + 5 + 8 * inv->inv_controller, inv->inv_controller, n + 1); - } - else if (inv->inv_type == INV_EPC_SERIAL) - { - /* - * Everest serial port... - */ - - if (inv->inv_unit == 0) - i = 1; - else - i = 41 + 4 * (int)inv->inv_controller; - - for (n = 0; n < (int)inv->inv_state; n ++) - printf("serial serial:/dev/ttyd%d?baud=38400 \"Unknown\" \"EPC Serial Port %d, Ebus slot %d\"\n", - n + i, n + 1, (int)inv->inv_controller); - } - else if (inv->inv_state > 1) - { - /* - * Standard serial port under IRIX 6.4 and earlier... - */ - - for (n = 0; n < (int)inv->inv_state; n ++) - printf("serial serial:/dev/ttyd%d?baud=38400 \"Unknown\" \"Onboard Serial Port %d\"\n", - n + (int)inv->inv_unit + 1, n + (int)inv->inv_unit + 1); - } - else - { - /* - * Standard serial port under IRIX 6.5 and beyond... - */ - - printf("serial serial:/dev/ttyd%d?baud=115200 \"Unknown\" \"Onboard Serial Port %d\"\n", - (int)inv->inv_controller, (int)inv->inv_controller); - } - } - } - - endinvent(); - - /* - * Central Data makes serial and parallel "servers" that can be - * connected in a number of ways. Look for ports... - */ - - for (i = 0; i < 10; i ++) - for (j = 0; j < 8; j ++) - for (n = 0; n < 32; n ++) - { - if (i == 8) /* EtherLite */ - sprintf(device, "/dev/ttydn%d%c", j, funky_hex[n]); - else if (i == 9) /* PCI */ - sprintf(device, "/dev/ttydp%d%c", j, funky_hex[n]); - else /* SCSI */ - sprintf(device, "/dev/ttyd%d%d%c", i, j, funky_hex[n]); - - if (access(device, 0) == 0) - { - if (i == 8) - printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data EtherLite Serial Port, ID %d, port %d\"\n", - device, j, n); - else if (i == 9) - printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data PCI Serial Port, ID %d, port %d\"\n", - device, j, n); - else - printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data SCSI Serial Port, logical bus %d, ID %d, port %d\"\n", - device, i, j, n); - } - } -#elif defined(__sun) - int i, j, n; /* Looping vars */ - char device[255]; /* Device filename */ - char info[255]; /* Device info/description */ - - - /* - * Standard serial ports... - */ - - for (i = 0; i < 26; i ++) - { - sprintf(device, "/dev/cua/%c", 'a' + i); - if (!access(device, 0)) - { - snprintf(info, sizeof(info), - _cupsLangString(cupsLangDefault(), _("Serial Port #%d")), i + 1); - -# ifdef B115200 - printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", device, info); -# else - printf("serial serial:%s?baud=38400 \"Unknown\" \"%s\"\n", device, info); -# endif /* B115200 */ - } - } - - /* - * MAGMA serial ports... - */ - - for (i = 0; i < 40; i ++) - { - sprintf(device, "/dev/term/%02d", i); - if (access(device, 0) == 0) - printf("serial serial:%s?baud=38400 \"Unknown\" \"MAGMA Serial Board #%d Port #%d\"\n", - device, (i / 10) + 1, (i % 10) + 1); - } - - /* - * Central Data serial ports... - */ - - for (i = 0; i < 9; i ++) - for (j = 0; j < 8; j ++) - for (n = 0; n < 32; n ++) - { - if (i == 8) /* EtherLite */ - sprintf(device, "/dev/sts/ttyN%d%c", j, funky_hex[n]); - else - sprintf(device, "/dev/sts/tty%c%d%c", i + 'C', j, - funky_hex[n]); - - if (access(device, 0) == 0) - { - if (i == 8) - printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data EtherLite Serial Port, ID %d, port %d\"\n", - device, j, n); - else - printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data SCSI Serial Port, logical bus %d, ID %d, port %d\"\n", - device, i, j, n); - } - } -#elif defined(__hpux) - int i, j, n; /* Looping vars */ - char device[255]; /* Device filename */ - - - /* - * Standard serial ports... - */ - - for (i = 0; i < 10; i ++) - { - sprintf(device, "/dev/tty%dp0", i); - if (access(device, 0) == 0) - printf("serial serial:%s?baud=38400 \"Unknown\" \"Serial Port #%d\"\n", - device, i + 1); - } - - /* - * Central Data serial ports... - */ - - for (i = 0; i < 9; i ++) - for (j = 0; j < 8; j ++) - for (n = 0; n < 32; n ++) - { - if (i == 8) /* EtherLite */ - sprintf(device, "/dev/ttyN%d%c", j, funky_hex[n]); - else - sprintf(device, "/dev/tty%c%d%c", i + 'C', j, - funky_hex[n]); - - if (access(device, 0) == 0) - { - if (i == 8) - printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data EtherLite Serial Port, ID %d, port %d\"\n", - device, j, n); - else - printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data SCSI Serial Port, logical bus %d, ID %d, port %d\"\n", - device, i, j, n); - } - } -#elif defined(__osf__) - int i; /* Looping var */ - char device[255]; /* Device filename */ - - - /* - * Standard serial ports... - */ - - for (i = 0; i < 100; i ++) - { - sprintf(device, "/dev/tty%02d", i); - if (access(device, 0) == 0) - printf("serial serial:%s?baud=38400 \"Unknown\" \"Serial Port #%d\"\n", - device, i + 1); - } -#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) - int i, j; /* Looping vars */ - int fd; /* File descriptor */ - char device[255]; /* Device filename */ - char info[255]; /* Device info/description */ - - - /* - * SIO ports... - */ - - for (i = 0; i < 32; i ++) - { - sprintf(device, "/dev/ttyd%c", funky_hex[i]); - if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) - { - close(fd); - - snprintf(info, sizeof(info), - _cupsLangString(cupsLangDefault(), _("Serial Port #%d")), i + 1); - - printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", device, info); - } - } - - /* - * Cyclades ports... - */ - - for (i = 0; i < 16; i ++) /* Should be up to 65536 boards... */ - for (j = 0; j < 32; j ++) - { - sprintf(device, "/dev/ttyc%d%c", i, funky_hex[j]); - if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) - { - close(fd); - printf("serial serial:%s?baud=115200 \"Unknown\" \"Cyclades #%d Serial Port #%d\"\n", - device, i, j + 1); - } - - sprintf(device, "/dev/ttyC%d%c", i, funky_hex[j]); - if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) - { - close(fd); - printf("serial serial:%s?baud=115200 \"Unknown\" \"Cyclades #%d Serial Port #%d\"\n", - device, i, j + 1); - } - } - - /* - * Digiboard ports... - */ - - for (i = 0; i < 16; i ++) /* Should be up to 65536 boards... */ - for (j = 0; j < 32; j ++) - { - sprintf(device, "/dev/ttyD%d%c", i, funky_hex[j]); - if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) - { - close(fd); - printf("serial serial:%s?baud=115200 \"Unknown\" \"Digiboard #%d Serial Port #%d\"\n", - device, i, j + 1); - } - } - - /* - * Stallion ports... - */ - - for (i = 0; i < 32; i ++) - { - sprintf(device, "/dev/ttyE%c", funky_hex[i]); - if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) - { - close(fd); - printf("serial serial:%s?baud=115200 \"Unknown\" \"Stallion Serial Port #%d\"\n", - device, i + 1); - } - } - - /* - * SX ports... - */ - - for (i = 0; i < 128; i ++) - { - sprintf(device, "/dev/ttyA%d", i + 1); - if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) - { - close(fd); - printf("serial serial:%s?baud=115200 \"Unknown\" \"SX Serial Port #%d\"\n", - device, i + 1); - } - } -#elif defined(__NetBSD__) - int i, j; /* Looping vars */ - int fd; /* File descriptor */ - char device[255]; /* Device filename */ - char info[255]; /* Device info/description */ - - - /* - * Standard serial ports... - */ - - for (i = 0; i < 4; i ++) - { - sprintf(device, "/dev/tty%02d", i); - if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) - { - close(fd); - - snprintf(info, sizeof(info), - _cupsLangString(cupsLangDefault(), _("Serial Port #%d")), i + 1); - - printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", device, info); - } - } - - /* - * Cyclades-Z ports... - */ - - for (i = 0; i < 16; i ++) /* Should be up to 65536 boards... */ - for (j = 0; j < 64; j ++) - { - sprintf(device, "/dev/ttyCZ%02d%02d", i, j); - if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) - { - close(fd); - printf("serial serial:%s?baud=115200 \"Unknown\" \"Cyclades #%d Serial Prt #%d\"\n", - device, i, j + 1); - } - } -#elif defined(__APPLE__) - /* - * Standard serial ports on MacOS X... - */ - - kern_return_t kernResult; - mach_port_t masterPort; - io_iterator_t serialPortIterator; - CFMutableDictionaryRef classesToMatch; - io_object_t serialService; - - - kernResult = IOMasterPort(MACH_PORT_NULL, &masterPort); - if (KERN_SUCCESS != kernResult) - return; - - /* - * Serial devices are instances of class IOSerialBSDClient. - */ - - classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue); - if (classesToMatch != NULL) - { - CFDictionarySetValue(classesToMatch, CFSTR(kIOSerialBSDTypeKey), - CFSTR(kIOSerialBSDRS232Type)); - - kernResult = IOServiceGetMatchingServices(masterPort, classesToMatch, - &serialPortIterator); - if (kernResult == KERN_SUCCESS) - { - while ((serialService = IOIteratorNext(serialPortIterator))) - { - CFTypeRef serialNameAsCFString; - CFTypeRef bsdPathAsCFString; - CFTypeRef hiddenVal; - char serialName[128]; - char bsdPath[1024]; - Boolean result; - - - /* Check if hidden... */ - hiddenVal = IORegistryEntrySearchCFProperty(serialService, - kIOServicePlane, - CFSTR("HiddenPort"), - kCFAllocatorDefault, - kIORegistryIterateRecursively | - kIORegistryIterateParents); - if (hiddenVal) - CFRelease(hiddenVal); /* This interface should not be used */ - else - { - serialNameAsCFString = - IORegistryEntryCreateCFProperty(serialService, - CFSTR(kIOTTYDeviceKey), - kCFAllocatorDefault, 0); - if (serialNameAsCFString) - { - result = CFStringGetCString(serialNameAsCFString, serialName, - sizeof(serialName), - kCFStringEncodingASCII); - CFRelease(serialNameAsCFString); - - if (result) - { - bsdPathAsCFString = - IORegistryEntryCreateCFProperty(serialService, - CFSTR(kIOCalloutDeviceKey), - kCFAllocatorDefault, 0); - if (bsdPathAsCFString) - { - result = CFStringGetCString(bsdPathAsCFString, bsdPath, - sizeof(bsdPath), - kCFStringEncodingASCII); - CFRelease(bsdPathAsCFString); - - if (result) - printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", - bsdPath, serialName); - } - } - } - } - - IOObjectRelease(serialService); - } - - /* - * Release the iterator. - */ - - IOObjectRelease(serialPortIterator); - } - } -#endif -} - - -/* - * 'side_cb()' - Handle side-channel requests... - */ - -static int /* O - 0 on success, -1 on error */ -side_cb(int print_fd, /* I - Print file */ - int device_fd, /* I - Device file */ - int use_bc) /* I - Using back-channel? */ -{ - cups_sc_command_t command; /* Request command */ - cups_sc_status_t status; /* Request/response status */ - char data[2048]; /* Request/response data */ - int datalen; /* Request/response data size */ - - - datalen = sizeof(data); - - if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0)) - return (-1); - - switch (command) - { - case CUPS_SC_CMD_DRAIN_OUTPUT : - if (backendDrainOutput(print_fd, device_fd)) - status = CUPS_SC_STATUS_IO_ERROR; - else if (tcdrain(device_fd)) - status = CUPS_SC_STATUS_IO_ERROR; - else - status = CUPS_SC_STATUS_OK; - - datalen = 0; - break; - - case CUPS_SC_CMD_GET_BIDI : - status = CUPS_SC_STATUS_OK; - data[0] = use_bc; - datalen = 1; - break; - - default : - status = CUPS_SC_STATUS_NOT_IMPLEMENTED; - datalen = 0; - break; - } - - return (cupsSideChannelWrite(command, status, data, datalen, 1.0)); -} - - -/* - * End of "$Id: serial.c 7647 2008-06-16 17:39:40Z mike $". - */ diff --git a/backend/snmp-supplies.c b/backend/snmp-supplies.c index 1bd8b7fa5..92febb602 100644 --- a/backend/snmp-supplies.c +++ b/backend/snmp-supplies.c @@ -229,12 +229,12 @@ backendSNMPSupplies( for (i = 0, ptr = value; i < num_supplies; i ++, ptr += strlen(ptr)) { - if (supplies[i].max_capacity > 0) + if (supplies[i].max_capacity > 0 && supplies[i].level >= 0) percent = 100 * supplies[i].level / supplies[i].max_capacity; else percent = 50; - if (percent <= 10) + if (percent <= 5) { switch (supplies[i].type) { @@ -279,7 +279,7 @@ backendSNMPSupplies( if (i) *ptr++ = ','; - if (supplies[i].max_capacity > 0) + if (supplies[i].max_capacity > 0 && supplies[i].level >= 0) sprintf(ptr, "%d", percent); else strcpy(ptr, "-1"); diff --git a/backend/usb-darwin.c b/backend/usb-darwin.c index 2576ac64c..44a14ba0b 100644 --- a/backend/usb-darwin.c +++ b/backend/usb-darwin.c @@ -761,24 +761,8 @@ print_device(const char *uri, /* I - Device URI */ fprintf(stderr, "DEBUG: Sent %lld bytes...\n", (off_t)total_bytes); - if (!print_fd) - { - /* - * Re-enable the SIGTERM handler so pthread_kill() will work... - */ - - struct sigaction action; /* POSIX signal action */ - - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - sigaddset(&action.sa_mask, SIGTERM); - action.sa_handler = sigterm_handler; - sigaction(SIGTERM, &action, NULL); - } - /* - * Wait for the side channel thread to exit... + * Signal the side channel thread to exit... */ if (have_sidechannel) @@ -805,44 +789,23 @@ print_device(const char *uri, /* I - Device URI */ &cond_timeout) != 0) break; } - - if (!g.sidechannel_thread_done) - { - /* - * Force the side-channel thread to exit... - */ - - fputs("DEBUG: Force the side-channel thread to exit...\n", stderr); - pthread_kill(sidechannel_thread_id, SIGTERM); - } } pthread_mutex_unlock(&g.sidechannel_thread_mutex); - - pthread_join(sidechannel_thread_id, NULL); - - pthread_cond_destroy(&g.sidechannel_thread_cond); - pthread_mutex_destroy(&g.sidechannel_thread_mutex); } - pthread_cond_destroy(&g.readwrite_lock_cond); - pthread_mutex_destroy(&g.readwrite_lock_mutex); - /* - * Signal the read thread to stop... + * Signal the read thread to exit then wait 7 seconds for it to complete... */ g.read_thread_stop = 1; - /* - * Give the read thread WAIT_EOF_DELAY seconds to complete all the data. If - * we are not signaled in that time then force the thread to exit. - */ - pthread_mutex_lock(&g.read_thread_mutex); if (!g.read_thread_done) { + fputs("DEBUG: Waiting for read thread to exit...\n", stderr); + gettimeofday(&tv, NULL); cond_timeout.tv_sec = tv.tv_sec + WAIT_EOF_DELAY; cond_timeout.tv_nsec = tv.tv_usec * 1000; @@ -854,25 +817,34 @@ print_device(const char *uri, /* I - Device URI */ break; } + /* + * If it didn't exit abort the pending read and wait an additional second... + */ + if (!g.read_thread_done) { - /* - * Force the read thread to exit... - */ + fputs("DEBUG: Read thread still active, aborting the pending read...\n", + stderr); g.wait_eof = 0; - fputs("DEBUG: Force the read thread to exit...\n", stderr); - pthread_kill(read_thread_id, SIGTERM); + + (*g.classdriver)->Abort(g.classdriver); + + gettimeofday(&tv, NULL); + cond_timeout.tv_sec = tv.tv_sec + 1; + cond_timeout.tv_nsec = tv.tv_usec * 1000; + + while (!g.read_thread_done) + { + if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex, + &cond_timeout) != 0) + break; + } } } pthread_mutex_unlock(&g.read_thread_mutex); - pthread_join(read_thread_id, NULL); /* wait for the read thread to return */ - - pthread_cond_destroy(&g.read_thread_cond); - pthread_mutex_destroy(&g.read_thread_mutex); - /* * Close the connection and input file and general clean up... */ diff --git a/conf/mime.convs.in b/conf/mime.convs.in index 83e7301ec..533fd955a 100644 --- a/conf/mime.convs.in +++ b/conf/mime.convs.in @@ -38,51 +38,13 @@ # PostScript filters # -@DEFAULT_PDFTOPS@application/pdf application/vnd.cups-postscript 66 pdftops application/postscript application/vnd.cups-postscript 66 pstops -@DEFAULT_TEXTTOPS@application/x-cshell application/postscript 33 texttops -@DEFAULT_TEXTTOPS@application/x-csource application/postscript 33 texttops -@DEFAULT_TEXTTOPS@application/x-perl application/postscript 33 texttops -@DEFAULT_TEXTTOPS@application/x-shell application/postscript 33 texttops -@DEFAULT_TEXTTOPS@text/plain application/postscript 33 texttops -@DEFAULT_TEXTTOPS@text/css application/postscript 33 texttops -@DEFAULT_TEXTTOPS@text/html application/postscript 33 texttops -@DEFAULT_IMAGEFILTERS@image/gif application/vnd.cups-postscript 66 imagetops -@DEFAULT_IMAGEFILTERS@image/png application/vnd.cups-postscript 66 imagetops -@DEFAULT_IMAGEFILTERS@image/jpeg application/vnd.cups-postscript 66 imagetops -@DEFAULT_IMAGEFILTERS@image/tiff application/vnd.cups-postscript 66 imagetops -@DEFAULT_IMAGEFILTERS@image/x-bitmap application/vnd.cups-postscript 66 imagetops -@DEFAULT_IMAGEFILTERS@image/x-photocd application/vnd.cups-postscript 66 imagetops -@DEFAULT_IMAGEFILTERS@image/x-portable-anymap application/vnd.cups-postscript 66 imagetops -@DEFAULT_IMAGEFILTERS@image/x-portable-bitmap application/vnd.cups-postscript 66 imagetops -@DEFAULT_IMAGEFILTERS@image/x-portable-graymap application/vnd.cups-postscript 66 imagetops -@DEFAULT_IMAGEFILTERS@image/x-portable-pixmap application/vnd.cups-postscript 66 imagetops -@DEFAULT_IMAGEFILTERS@image/x-sgi-rgb application/vnd.cups-postscript 66 imagetops -@DEFAULT_IMAGEFILTERS@image/x-xbitmap application/vnd.cups-postscript 66 imagetops -@DEFAULT_IMAGEFILTERS@image/x-xpixmap application/vnd.cups-postscript 66 imagetops -@DEFAULT_IMAGEFILTERS@image/x-sun-raster application/vnd.cups-postscript 66 imagetops -@DEFAULT_BANNERTOPS@application/vnd.cups-banner application/postscript 33 bannertops ######################################################################## # # Raster filters... # -@DEFAULT_IMAGEFILTERS@image/gif application/vnd.cups-raster 100 imagetoraster -@DEFAULT_IMAGEFILTERS@image/png application/vnd.cups-raster 100 imagetoraster -@DEFAULT_IMAGEFILTERS@image/jpeg application/vnd.cups-raster 100 imagetoraster -@DEFAULT_IMAGEFILTERS@image/tiff application/vnd.cups-raster 100 imagetoraster -@DEFAULT_IMAGEFILTERS@image/x-bitmap application/vnd.cups-raster 100 imagetoraster -@DEFAULT_IMAGEFILTERS@image/x-photocd application/vnd.cups-raster 100 imagetoraster -@DEFAULT_IMAGEFILTERS@image/x-portable-anymap application/vnd.cups-raster 100 imagetoraster -@DEFAULT_IMAGEFILTERS@image/x-portable-bitmap application/vnd.cups-raster 100 imagetoraster -@DEFAULT_IMAGEFILTERS@image/x-portable-graymap application/vnd.cups-raster 100 imagetoraster -@DEFAULT_IMAGEFILTERS@image/x-portable-pixmap application/vnd.cups-raster 100 imagetoraster -@DEFAULT_IMAGEFILTERS@image/x-sgi-rgb application/vnd.cups-raster 100 imagetoraster -@DEFAULT_IMAGEFILTERS@image/x-xbitmap application/vnd.cups-raster 100 imagetoraster -@DEFAULT_IMAGEFILTERS@image/x-xpixmap application/vnd.cups-raster 100 imagetoraster -@DEFAULT_IMAGEFILTERS@image/x-sun-raster application/vnd.cups-raster 100 imagetoraster - # PWG Raster filter for IPP Everywhere... application/vnd.cups-raster image/pwg-raster 100 rastertopwg diff --git a/config-scripts/cups-common.m4 b/config-scripts/cups-common.m4 index 7e6d84b30..245d6f6e6 100644 --- a/config-scripts/cups-common.m4 +++ b/config-scripts/cups-common.m4 @@ -20,11 +20,11 @@ dnl Set the name of the config header file... AC_CONFIG_HEADER(config.h) dnl Version number information... -CUPS_VERSION="1.5.1" +CUPS_VERSION="1.6svn" CUPS_REVISION="" -#if test -z "$CUPS_REVISION" -a -d .svn; then -# CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`" -#fi +if test -z "$CUPS_REVISION" -a -d .svn; then + CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`" +fi CUPS_BUILD="cups-$CUPS_VERSION" AC_ARG_WITH(cups_build, [ --with-cups-build set "cups-config --build" string ], @@ -123,6 +123,7 @@ AC_SUBST(LIBPAPER) dnl Checks for header files. AC_HEADER_STDC +AC_CHECK_HEADER(stdlib.h,AC_DEFINE(HAVE_STDLIB_H)) AC_CHECK_HEADER(crypt.h,AC_DEFINE(HAVE_CRYPT_H)) AC_CHECK_HEADER(langinfo.h,AC_DEFINE(HAVE_LANGINFO_H)) AC_CHECK_HEADER(malloc.h,AC_DEFINE(HAVE_MALLOC_H)) @@ -241,6 +242,15 @@ if test x$enable_tcp_wrappers = xyes; then LIBWRAP="-lwrap")]) fi +dnl ZLIB +LIBZ="" +AC_CHECK_HEADER(zlib.h, + AC_CHECK_LIB(z, gzgets, + AC_DEFINE(HAVE_LIBZ) + LIBZ="-lz" + LIBS="$LIBS -lz")) +AC_SUBST(LIBZ) + dnl Flags for "ar" command... case $uname in Darwin* | *BSD*) @@ -310,11 +320,9 @@ dnl Extra platform-specific libraries... CUPS_DEFAULT_PRINTOPERATOR_AUTH="@SYSTEM" CUPS_SYSTEM_AUTHKEY="" INSTALLXPC="" -LEGACY_BACKENDS="parallel" case $uname in Darwin*) - LEGACY_BACKENDS="" BACKLIBS="$BACKLIBS -framework IOKit" SERVERLIBS="$SERVERLIBS -framework IOKit -weak_framework ApplicationServices" LIBS="-framework SystemConfiguration -framework CoreFoundation -framework Security $LIBS" @@ -394,7 +402,6 @@ AC_SUBST(CUPS_DEFAULT_PRINTOPERATOR_AUTH) AC_DEFINE_UNQUOTED(CUPS_DEFAULT_PRINTOPERATOR_AUTH, "$CUPS_DEFAULT_PRINTOPERATOR_AUTH") AC_SUBST(CUPS_SYSTEM_AUTHKEY) AC_SUBST(INSTALLXPC) -AC_SUBST(LEGACY_BACKENDS) dnl Check for build components COMPONENTS="all" @@ -406,7 +413,7 @@ AC_ARG_WITH(components, [ --with-components set components to build: case "$COMPONENTS" in all) - BUILDDIRS="filter backend berkeley cgi-bin driver monitor notifier ppdc scheduler systemv conf data desktop locale man doc examples templates" + BUILDDIRS="filter backend berkeley cgi-bin monitor notifier ppdc scheduler systemv conf data desktop locale man doc examples templates" ;; core) diff --git a/config-scripts/cups-defaults.m4 b/config-scripts/cups-defaults.m4 index a568edb21..eebbb29bb 100644 --- a/config-scripts/cups-defaults.m4 +++ b/config-scripts/cups-defaults.m4 @@ -434,52 +434,6 @@ AC_ARG_WITH(ipp-port, [ --with-ipp-port set port number for IPP, defaul AC_SUBST(DEFAULT_IPP_PORT) AC_DEFINE_UNQUOTED(CUPS_DEFAULT_IPP_PORT,$DEFAULT_IPP_PORT) -dnl Filters -AC_ARG_ENABLE(bannertops, [ --enable-bannertops always build the banner filter ]) -AC_ARG_ENABLE(texttops, [ --enable-texttops always build the text filter ]) - -if test "x$enable_bannertops" = xno; then - BANNERTOPS="" - DEFAULT_BANNERTOPS="#" -elif test "x$enable_bannertops" = xyes; then - BANNERTOPS="bannertops" - DEFAULT_BANNERTOPS="" -elif test $uname = Darwin; then - BANNERTOPS="" - DEFAULT_BANNERTOPS="#" -else - BANNERTOPS="bannertops" - DEFAULT_BANNERTOPS="" -fi - -if test "x$enable_texttops" = xno; then - TEXTTOPS="" - DEFAULT_TEXTTOPS="#" -elif test "x$enable_texttops" = xyes; then - TEXTTOPS="texttops" - DEFAULT_TEXTTOPS="" -elif test $uname = Darwin; then - TEXTTOPS="" - DEFAULT_TEXTTOPS="#" -else - TEXTTOPS="texttops" - DEFAULT_TEXTTOPS="" -fi - -AC_SUBST(BANNERTOPS) -AC_SUBST(DEFAULT_BANNERTOPS) -AC_SUBST(DEFAULT_TEXTTOPS) -AC_SUBST(TEXTTOPS) - -dnl Fonts -if test "x$BANNERTOPS" = x -a "x$TEXTTOPS" = x; then - FONTS="" -else - FONTS="fonts" -fi - -AC_SUBST(FONTS) - dnl Web interface... AC_ARG_ENABLE(webif, [ --enable-webif enable the web interface by default, default=no for Mac OS X]) case "x$enable_webif" in diff --git a/config-scripts/cups-image.m4 b/config-scripts/cups-image.m4 deleted file mode 100644 index 6df7befe2..000000000 --- a/config-scripts/cups-image.m4 +++ /dev/null @@ -1,112 +0,0 @@ -dnl -dnl "$Id: cups-image.m4 6649 2007-07-11 21:46:42Z mike $" -dnl -dnl Image library/filter stuff for CUPS. -dnl -dnl Copyright 2007-2011 by Apple Inc. -dnl Copyright 1997-2006 by Easy Software Products, all rights reserved. -dnl -dnl These coded instructions, statements, and computer programs are the -dnl property of Apple Inc. and are protected by Federal copyright -dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" -dnl which should have been included with this file. If this file is -dnl file is missing or damaged, see the license at "http://www.cups.org/". -dnl - -dnl See if we want the image filters included at all... -AC_ARG_ENABLE(image, [ --enable-image always build the image filters]) - -DEFAULT_IMAGEFILTERS="#" -IMGFILTERS="" -if test "x$enable_image" != xno; then - AC_MSG_CHECKING(whether to build image filters) - if test "x$enable_image" = xyes -o $uname != Darwin; then - IMGFILTERS="imagetops imagetoraster" - DEFAULT_IMAGEFILTERS="" - AC_MSG_RESULT(yes) - else - AC_MSG_RESULT(no) - fi -fi - -AC_SUBST(DEFAULT_IMAGEFILTERS) -AC_SUBST(IMGFILTERS) - -dnl Check for image libraries... -AC_ARG_ENABLE(jpeg, [ --disable-jpeg disable JPEG support]) -AC_ARG_ENABLE(png, [ --disable-png disable PNG support]) -AC_ARG_ENABLE(tiff, [ --disable-tiff disable TIFF support]) - -LIBJPEG="" -LIBPNG="" -LIBTIFF="" -LIBZ="" - -AC_SUBST(LIBJPEG) -AC_SUBST(LIBPNG) -AC_SUBST(LIBTIFF) -AC_SUBST(LIBZ) - -dnl Image libraries use math library functions... -AC_SEARCH_LIBS(pow, m) - -dnl Save the current libraries since we don't want the image libraries -dnl included with every program... -SAVELIBS="$LIBS" - -dnl JPEG library... -if test x$enable_jpeg != xno; then - AC_CHECK_HEADER(jpeglib.h, - AC_CHECK_LIB(jpeg, jpeg_destroy_decompress, - AC_DEFINE(HAVE_LIBJPEG) - LIBJPEG="-ljpeg" - LIBS="$LIBS -ljpeg")) -else - AC_MSG_NOTICE([JPEG support disabled with --disable-jpeg.]) -fi - -dnl ZLIB library... -AC_CHECK_HEADER(zlib.h, - AC_CHECK_LIB(z, gzgets, - AC_DEFINE(HAVE_LIBZ) - LIBZ="-lz" - LIBS="$LIBS -lz")) - -dnl PNG library... -if test x$enable_png != xno; then - AC_CHECK_HEADER(png.h, - AC_CHECK_LIB(png, png_create_read_struct, - AC_DEFINE(HAVE_LIBPNG) - LIBPNG="-lpng")) -else - AC_MSG_NOTICE([PNG support disabled with --disable-png.]) -fi - -dnl TIFF library... -if test x$enable_tiff != xno; then - AC_CHECK_HEADER(tiff.h, - AC_CHECK_LIB(tiff, TIFFReadScanline, - AC_DEFINE(HAVE_LIBTIFF) - LIBTIFF="-ltiff")) -else - AC_MSG_NOTICE([TIFF support disabled with --disable-tiff.]) -fi - -dnl Restore original LIBS settings... -LIBS="$SAVELIBS" - -EXPORT_LIBJPEG="$LIBJPEG" -EXPORT_LIBPNG="$LIBPNG" -EXPORT_LIBTIFF="$LIBTIFF" -EXPORT_LIBZ="$LIBZ" - -AC_SUBST(EXPORT_LIBJPEG) -AC_SUBST(EXPORT_LIBPNG) -AC_SUBST(EXPORT_LIBTIFF) -AC_SUBST(EXPORT_LIBZ) - -AC_CHECK_HEADER(stdlib.h,AC_DEFINE(HAVE_STDLIB_H)) - -dnl -dnl End of "$Id: cups-image.m4 6649 2007-07-11 21:46:42Z mike $". -dnl diff --git a/config-scripts/cups-pap.m4 b/config-scripts/cups-pap.m4 deleted file mode 100644 index e69de29bb..000000000 diff --git a/config-scripts/cups-pdf.m4 b/config-scripts/cups-pdf.m4 deleted file mode 100644 index 575a5bac1..000000000 --- a/config-scripts/cups-pdf.m4 +++ /dev/null @@ -1,113 +0,0 @@ -dnl -dnl "$Id: cups-pdf.m4 7449 2008-04-14 18:27:53Z mike $" -dnl -dnl PDF filter configuration stuff for CUPS. -dnl -dnl Copyright 2007-2011 by Apple Inc. -dnl Copyright 2006 by Easy Software Products, all rights reserved. -dnl -dnl These coded instructions, statements, and computer programs are the -dnl property of Apple Inc. and are protected by Federal copyright -dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" -dnl which should have been included with this file. If this file is -dnl file is missing or damaged, see the license at "http://www.cups.org/". -dnl - -AC_ARG_WITH(pdftops, [ --with-pdftops set pdftops filter (gs,/path/to/gs,pdftops,/path/to/pdftops,none), default=pdftops ]) - -PDFTOPS="" -CUPS_PDFTOPS="" -CUPS_GHOSTSCRIPT="" - -case "x$with_pdftops" in - x) # Default/auto - if test $uname != Darwin; then - AC_PATH_PROG(CUPS_PDFTOPS, pdftops) - if test "x$CUPS_PDFTOPS" != x; then - AC_DEFINE(HAVE_PDFTOPS) - PDFTOPS="pdftops" - else - AC_PATH_PROG(CUPS_GHOSTSCRIPT, gs) - if test "x$CUPS_GHOSTSCRIPT" != x; then - AC_DEFINE(HAVE_GHOSTSCRIPT) - PDFTOPS="pdftops" - fi - fi - fi - ;; - - xgs) - AC_PATH_PROG(CUPS_GHOSTSCRIPT, gs) - if test "x$CUPS_GHOSTSCRIPT" != x; then - AC_DEFINE(HAVE_GHOSTSCRIPT) - PDFTOPS="pdftops" - else - AC_MSG_ERROR(Unable to find gs program!) - exit 1 - fi - ;; - - x/*/gs) # Use /path/to/gs without any check: - CUPS_GHOSTSCRIPT="$with_pdftops" - AC_DEFINE(HAVE_GHOSTSCRIPT) - PDFTOPS="pdftops" - ;; - - xpdftops) - AC_PATH_PROG(CUPS_PDFTOPS, pdftops) - if test "x$CUPS_PDFTOPS" != x; then - AC_DEFINE(HAVE_PDFTOPS) - PDFTOPS="pdftops" - else - AC_MSG_ERROR(Unable to find pdftops program!) - exit 1 - fi - ;; - - x/*/pdftops) # Use /path/to/pdftops without any check: - CUPS_PDFTOPS="$with_pdftops" - AC_DEFINE(HAVE_PDFTOPS) - PDFTOPS="pdftops" - ;; - - xnone) # Make no pdftops filter if with_pdftops=none: - ;; - - *) # Invalid with_pdftops value: - AC_MSG_ERROR(Invalid with_pdftops value!) - exit 1 - ;; -esac - -if test "x$CUPS_PDFTOPS" != x; then - AC_MSG_CHECKING(whether pdftops supports -origpagesizes) - if ($CUPS_PDFTOPS -h 2>&1 | grep -q -- -origpagesizes); then - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_PDFTOPS_WITH_ORIGPAGESIZES) - else - AC_MSG_RESULT(no) - fi - - DEFAULT_PDFTOPS="" -elif test "x$CUPS_GHOSTSCRIPT" != x; then - AC_MSG_CHECKING(whether gs supports the ps2write device) - if ($CUPS_GHOSTSCRIPT -h 2>&1 | grep -q ps2write); then - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_GHOSTSCRIPT_PS2WRITE) - else - AC_MSG_RESULT(no) - fi - - DEFAULT_PDFTOPS="" -else - DEFAULT_PDFTOPS="#" -fi - -AC_DEFINE_UNQUOTED(CUPS_PDFTOPS, "$CUPS_PDFTOPS") -AC_DEFINE_UNQUOTED(CUPS_GHOSTSCRIPT, "$CUPS_GHOSTSCRIPT") -AC_SUBST(DEFAULT_PDFTOPS) -AC_SUBST(PDFTOPS) - -dnl -dnl End of "$Id: cups-pdf.m4 7449 2008-04-14 18:27:53Z mike $". -dnl diff --git a/config-scripts/cups-scripting.m4 b/config-scripts/cups-scripting.m4 index 4bfb4e15a..d4ed98850 100644 --- a/config-scripts/cups-scripting.m4 +++ b/config-scripts/cups-scripting.m4 @@ -68,17 +68,6 @@ else AC_DEFINE(HAVE_PHP) fi -PHPDIR="" -if test "x$CUPS_PHP" != xno; then - AC_PATH_PROG(PHPCONFIG, php-config) - - if test "x$PHPCONFIG" != x; then - PHPDIR="scripting/php" - fi -fi - -AC_SUBST(PHPDIR) - dnl Do we have Python? AC_ARG_WITH(python, [ --with-python set Python interpreter for web interfaces ], CUPS_PYTHON="$withval", diff --git a/config-scripts/cups-sharedlibs.m4 b/config-scripts/cups-sharedlibs.m4 index 2e255b763..f126f3604 100644 --- a/config-scripts/cups-sharedlibs.m4 +++ b/config-scripts/cups-sharedlibs.m4 @@ -27,7 +27,6 @@ if test x$enable_shared != xno; then SunOS*) LIBCUPS="lib$cupsbase.so.2" LIBCUPSCGI="libcupscgi.so.1" - LIBCUPSDRIVER="libcupsdriver.so.1" LIBCUPSIMAGE="libcupsimage.so.2" LIBCUPSMIME="libcupsmime.so.1" LIBCUPSPPDC="libcupsppdc.so.1" @@ -38,7 +37,6 @@ if test x$enable_shared != xno; then UNIX_S*) LIBCUPS="lib$cupsbase.so.2" LIBCUPSCGI="libcupscgi.so.1" - LIBCUPSDRIVER="libcupsdriver.so.1" LIBCUPSIMAGE="libcupsimage.so.2" LIBCUPSMIME="libcupsmime.so.1" LIBCUPSPPDC="libcupsppdc.so.1" @@ -51,7 +49,6 @@ if test x$enable_shared != xno; then ia64) LIBCUPS="lib$cupsbase.so.2" LIBCUPSCGI="libcupscgi.so.1" - LIBCUPSDRIVER="libcupsdriver.so.1" LIBCUPSIMAGE="libcupsimage.so.2" LIBCUPSMIME="libcupsmime.so.1" LIBCUPSPPDC="libcupsppdc.so.1" @@ -62,7 +59,6 @@ if test x$enable_shared != xno; then *) LIBCUPS="lib$cupsbase.sl.2" LIBCUPSCGI="libcupscgi.sl.1" - LIBCUPSDRIVER="libcupsdriver.sl.1" LIBCUPSIMAGE="libcupsimage.sl.2" LIBCUPSMIME="libcupsmime.sl.1" LIBCUPSPPDC="libcupsppdc.sl.1" @@ -75,7 +71,6 @@ if test x$enable_shared != xno; then IRIX) LIBCUPS="lib$cupsbase.so.2" LIBCUPSCGI="libcupscgi.so.1" - LIBCUPSDRIVER="libcupsdriver.so.1" LIBCUPSIMAGE="libcupsimage.so.2" LIBCUPSMIME="libcupsmime.so.1" LIBCUPSPPDC="libcupsppdc.so.1" @@ -86,7 +81,6 @@ if test x$enable_shared != xno; then OSF1* | Linux | GNU | *BSD*) LIBCUPS="lib$cupsbase.so.2" LIBCUPSCGI="libcupscgi.so.1" - LIBCUPSDRIVER="libcupsdriver.so.1" LIBCUPSIMAGE="libcupsimage.so.2" LIBCUPSMIME="libcupsmime.so.1" LIBCUPSPPDC="libcupsppdc.so.1" @@ -97,7 +91,6 @@ if test x$enable_shared != xno; then Darwin*) LIBCUPS="lib$cupsbase.2.dylib" LIBCUPSCGI="libcupscgi.1.dylib" - LIBCUPSDRIVER="libcupsdriver.1.dylib" LIBCUPSIMAGE="libcupsimage.2.dylib" LIBCUPSMIME="libcupsmime.1.dylib" LIBCUPSPPDC="libcupsppdc.1.dylib" @@ -109,7 +102,6 @@ if test x$enable_shared != xno; then LIBCUPS="lib${cupsbase}_s.a" LIBCUPSBASE="${cupsbase}_s" LIBCUPSCGI="libcupscgi_s.a" - LIBCUPSDRIVER="libcupsdriver_s.a" LIBCUPSIMAGE="libcupsimage_s.a" LIBCUPSMIME="libcupsmime_s.a" LIBCUPSPPDC="libcupsppdc_s.a" @@ -122,7 +114,6 @@ if test x$enable_shared != xno; then echo " option with compiler." LIBCUPS="lib$cupsbase.so.2" LIBCUPSCGI="libcupscgi.so.1" - LIBCUPSDRIVER="libcupsdriver.so.1" LIBCUPSIMAGE="libcupsimage.so.2" LIBCUPSMIME="libcupsmime.so.1" LIBCUPSPPDC="libcupsppdc.so.1" @@ -135,7 +126,6 @@ else PICFLAG=0 LIBCUPS="lib$cupsbase.a" LIBCUPSCGI="libcupscgi.a" - LIBCUPSDRIVER="libcupsdriver.a" LIBCUPSIMAGE="libcupsimage.a" LIBCUPSMIME="libcupsmime.a" LIBCUPSPPDC="libcupsppdc.a" @@ -156,7 +146,6 @@ AC_SUBST(DSO64FLAGS) AC_SUBST(LIBCUPS) AC_SUBST(LIBCUPSBASE) AC_SUBST(LIBCUPSCGI) -AC_SUBST(LIBCUPSDRIVER) AC_SUBST(LIBCUPSIMAGE) AC_SUBST(LIBCUPSMIME) AC_SUBST(LIBCUPSPPDC) @@ -167,7 +156,6 @@ if test x$enable_shared = xno; then LINKCUPSIMAGE="../filter/libcupsimage.a" EXTLINKCUPS="-lcups" - EXTLINKCUPSDRIVER="-lcupsdriver" EXTLINKCUPSIMAGE="-lcupsimage" else if test $uname = AIX; then @@ -175,20 +163,17 @@ else LINKCUPSIMAGE="-lcupsimage_s" EXTLINKCUPS="-lcups_s" - EXTLINKCUPSDRIVER="-lcupsdriver_s" EXTLINKCUPSIMAGE="-lcupsimage_s" else LINKCUPS="-l${cupsbase}" LINKCUPSIMAGE="-lcupsimage" EXTLINKCUPS="-lcups" - EXTLINKCUPSDRIVER="-lcupsdriver" EXTLINKCUPSIMAGE="-lcupsimage" fi fi AC_SUBST(EXTLINKCUPS) -AC_SUBST(EXTLINKCUPSDRIVER) AC_SUBST(EXTLINKCUPSIMAGE) AC_SUBST(LINKCUPS) AC_SUBST(LINKCUPSIMAGE) @@ -201,7 +186,7 @@ if test "$DSO" != ":"; then # rather than to the executables. This makes things smaller if you # are using any static libraries, and it also allows us to distribute # a single DSO rather than a bunch... - DSOLIBS="\$(LIBTIFF) \$(LIBPNG) \$(LIBJPEG) \$(LIBZ)" + DSOLIBS="\$(LIBZ)" IMGLIBS="" # Tell the run-time linkers where to find a DSO. Some platforms @@ -258,7 +243,7 @@ if test "$DSO" != ":"; then esac else DSOLIBS="" - IMGLIBS="\$(LIBTIFF) \$(LIBPNG) \$(LIBJPEG) \$(LIBZ)" + IMGLIBS="\$(LIBZ)" fi AC_SUBST(DSOLIBS) diff --git a/configure.in b/configure.in index d219d56fe..60702956a 100644 --- a/configure.in +++ b/configure.in @@ -25,7 +25,6 @@ sinclude(config-scripts/cups-sharedlibs.m4) sinclude(config-scripts/cups-libtool.m4) sinclude(config-scripts/cups-compiler.m4) -sinclude(config-scripts/cups-image.m4) sinclude(config-scripts/cups-network.m4) sinclude(config-scripts/cups-poll.m4) sinclude(config-scripts/cups-slp.m4) @@ -38,7 +37,6 @@ sinclude(config-scripts/cups-largefile.m4) sinclude(config-scripts/cups-dnssd.m4) sinclude(config-scripts/cups-launchd.m4) sinclude(config-scripts/cups-defaults.m4) -sinclude(config-scripts/cups-pdf.m4) sinclude(config-scripts/cups-scripting.m4) INSTALL_LANGUAGES="" @@ -56,7 +54,7 @@ if test "x$LANGUAGES" != x; then LANGFILES="$LANGFILES templates/$lang/header.tmpl" fi done -elif test "x$CUPS_BUNDLEDIR" != ""; then +elif test "x$CUPS_BUNDLEDIR" != x; then INSTALL_LANGUAGES="install-langbundle" UNINSTALL_LANGUAGES="uninstall-langbundle" fi diff --git a/cups-config.in b/cups-config.in index f59abe0bb..7ba104477 100755 --- a/cups-config.in +++ b/cups-config.in @@ -1,10 +1,10 @@ #! /bin/sh # -# "$Id: cups-config.in 7394 2008-03-21 23:41:43Z mike $" -# +# "$Id: cups-config.in 9926 2011-08-27 09:23:01Z mike $" +# # CUPS configuration utility. # -# Copyright 2007-2010 by Apple Inc. +# Copyright 2007-2011 by Apple Inc. # Copyright 2001-2006 by Easy Software Products, all rights reserved. # # These coded instructions, statements, and computer programs are the @@ -15,7 +15,7 @@ # VERSION="@CUPS_VERSION@" -APIVERSION="1.5" +APIVERSION="1.6" BUILD="@CUPS_BUILD@" prefix=@prefix@ @@ -35,8 +35,7 @@ INSTALLSTATIC=@INSTALLSTATIC@ # flags for C++ compiler: CFLAGS="" LDFLAGS="@EXPORT_LDFLAGS@" -LIBS="@LIBGSSAPI@ @EXPORT_SSLLIBS@ @EXPORT_LIBZ@ @LIBS@" -IMGLIBS="@EXPORT_LIBTIFF@ @EXPORT_LIBJPEG@ @EXPORT_LIBPNG@" +LIBS="@LIBGSSAPI@ @EXPORT_SSLLIBS@ @LIBZ@ @LIBS@" # Check for local invocation... selfdir=`dirname $0` @@ -46,9 +45,6 @@ if test -f "$selfdir/cups/cups.h"; then LDFLAGS="-L$selfdir/cups -L$selfdir/filter $LDFLAGS" libdir="$selfdir/cups" imagelibdir="$selfdir/filter" - if test ! -f "$selfdir/cups/raster.h"; then - ln -s ../filter/raster.h "$selfdir/cups" - fi else if test $includedir != /usr/include; then CFLAGS="$CFLAGS -I$includedir" @@ -68,7 +64,7 @@ usage () echo " cups-config --datadir" echo " cups-config --help" echo " cups-config --ldflags" - echo " cups-config [--driver] [--image] [--static] --libs" + echo " cups-config [--image] [--static] --libs" echo " cups-config --serverbin" echo " cups-config --serverroot" echo " cups-config --version" @@ -83,7 +79,6 @@ fi # Parse command line options static=no image=no -driver=no while test $# -gt 0; do case $1 in @@ -99,9 +94,6 @@ while test $# -gt 0; do --datadir) echo $cups_datadir ;; - --driver) - driver=yes - ;; --help) usage 0 ;; @@ -117,16 +109,10 @@ while test $# -gt 0; do if test $image = yes; then libs="@EXTLINKCUPSIMAGE@ $libs" fi - if test $driver = yes; then - libs="@EXTLINKCUPSDRIVER@ $libs" - fi else libs="$libdir/libcups.a $LIBS"; if test $image = yes; then - libs="$libdir/libcupsimage.a $IMGLIBS $libs" - fi - if test $driver = yes; then - libs="$libdir/libcupsdriver.a $libs" + libs="$libdir/libcupsimage.a $libs" fi fi echo $libs @@ -156,5 +142,5 @@ while test $# -gt 0; do done # -# End of "$Id: cups-config.in 7394 2008-03-21 23:41:43Z mike $". +# End of "$Id: cups-config.in 9926 2011-08-27 09:23:01Z mike $". # diff --git a/cups/Makefile b/cups/Makefile index 6052bec01..113f8f645 100644 --- a/cups/Makefile +++ b/cups/Makefile @@ -120,6 +120,7 @@ HEADERSPRIV = \ md5-private.h \ ppd-private.h \ pwg-private.h \ + raster-private.h \ snmp-private.h \ string-private.h \ thread-private.h diff --git a/cups/cups.h b/cups/cups.h index 14cb02bba..857f17fbe 100644 --- a/cups/cups.h +++ b/cups/cups.h @@ -60,10 +60,10 @@ extern "C" { * Constants... */ -# define CUPS_VERSION 1.0501 +# define CUPS_VERSION 1.0599 # define CUPS_VERSION_MAJOR 1 -# define CUPS_VERSION_MINOR 5 -# define CUPS_VERSION_PATCH 1 +# define CUPS_VERSION_MINOR 6 +# define CUPS_VERSION_PATCH -1 # define CUPS_BC_FD 3 /* Back-channel file descriptor for select/poll */ # define CUPS_DATE_ANY (time_t)-1 diff --git a/cups/http.c b/cups/http.c index 037efd32e..8aab65a1d 100644 --- a/cups/http.c +++ b/cups/http.c @@ -2186,7 +2186,10 @@ _httpReadGNUTLS( size_t length) /* I - Number of bytes to read */ { http_t *http; /* HTTP connection */ + ssize_t bytes; /* Bytes read */ + + DEBUG_printf(("6_httpReadGNUTLS(ptr=%p, data=%p, length=%d)", ptr, data, (int)length)); http = (http_t *)ptr; @@ -2206,7 +2209,9 @@ _httpReadGNUTLS( } } - return (recv(http->fd, data, length, 0)); + bytes = recv(http->fd, data, length, 0); + DEBUG_printf(("6_httpReadGNUTLS: bytes=%d", (int)bytes)); + return (bytes); } #endif /* HAVE_SSL && HAVE_GNUTLS */ @@ -3189,7 +3194,16 @@ _httpWriteGNUTLS( const void *data, /* I - Data buffer */ size_t length) /* I - Number of bytes to write */ { - return (send(((http_t *)ptr)->fd, data, length, 0)); + ssize_t bytes; /* Bytes written */ + + + DEBUG_printf(("6_httpWriteGNUTLS(ptr=%p, data=%p, length=%d)", ptr, data, + (int)length)); + http_debug_hex("_httpWriteGNUTLS", data, (int)length); + + bytes = send(((http_t *)ptr)->fd, data, length, 0); + DEBUG_printf(("_httpWriteGNUTLS: bytes=%d", (int)bytes)); + return (bytes); } #endif /* HAVE_SSL && HAVE_GNUTLS */ @@ -3760,7 +3774,7 @@ http_set_credentials(http_t *http) /* I - Connection to server */ * 'http_setup_ssl()' - Set up SSL/TLS support on a connection. */ -static int /* O - Status of connection */ +static int /* O - 0 on success, -1 on failure */ http_setup_ssl(http_t *http) /* I - Connection to server */ { _cups_globals_t *cg = _cupsGlobals(); @@ -3768,29 +3782,30 @@ http_setup_ssl(http_t *http) /* I - Connection to server */ int any_root; /* Allow any root */ # ifdef HAVE_LIBSSL - SSL_CTX *context; /* Context for encryption */ - BIO *bio; /* BIO data */ + SSL_CTX *context; /* Context for encryption */ + BIO *bio; /* BIO data */ + const char *message = NULL;/* Error message */ # elif defined(HAVE_GNUTLS) + int status; /* Status of handshake */ gnutls_certificate_client_credentials *credentials; /* TLS credentials */ # elif defined(HAVE_CDSASSL) - OSStatus error; /* Error code */ - const char *message = NULL; /* Error message */ - char *hostname; /* Hostname */ + OSStatus error; /* Error code */ + char *hostname; /* Hostname */ + const char *message = NULL;/* Error message */ # ifdef HAVE_SECCERTIFICATECOPYDATA - cups_array_t *credentials; /* Credentials array */ - cups_array_t *names; /* CUPS distinguished names */ - CFArrayRef dn_array; /* CF distinguished names array */ - CFIndex count; /* Number of credentials */ - CFDataRef data; /* Certificate data */ - int i; /* Looping var */ - http_credential_t - *credential; /* Credential data */ + cups_array_t *credentials; /* Credentials array */ + cups_array_t *names; /* CUPS distinguished names */ + CFArrayRef dn_array; /* CF distinguished names array */ + CFIndex count; /* Number of credentials */ + CFDataRef data; /* Certificate data */ + int i; /* Looping var */ + http_credential_t *credential; /* Credential data */ # endif /* HAVE_SECCERTIFICATECOPYDATA */ # elif defined(HAVE_SSPISSL) - TCHAR username[256]; /* Username returned from GetUserName() */ - TCHAR commonName[256]; /* Common name for certificate */ - DWORD dwSize; /* 32 bit size */ + TCHAR username[256]; /* Username returned from GetUserName() */ + TCHAR commonName[256];/* Common name for certificate */ + DWORD dwSize; /* 32 bit size */ # endif /* HAVE_LIBSSL */ @@ -3806,6 +3821,8 @@ http_setup_ssl(http_t *http) /* I - Connection to server */ any_root = cg->any_root; # ifdef HAVE_LIBSSL + (void)any_root; + context = SSL_CTX_new(SSLv23_client_method()); SSL_CTX_set_options(context, SSL_OP_NO_SSLv2); /* Only use SSLv3 or TLS */ @@ -3814,16 +3831,17 @@ http_setup_ssl(http_t *http) /* I - Connection to server */ BIO_ctrl(bio, BIO_C_SET_FILE_PTR, 0, (char *)http); http->tls = SSL_new(context); - SSL_set_bio(http->tls_credentials, bio, bio); + SSL_set_bio(http->tls, bio, bio); if (SSL_connect(http->tls) != 1) { -# ifdef DEBUG unsigned long error; /* Error code */ while ((error = ERR_get_error()) != 0) - DEBUG_printf(("8http_setup_ssl: %s", ERR_error_string(error, NULL))); -# endif /* DEBUG */ + { + message = ERR_error_string(error, NULL); + DEBUG_printf(("8http_setup_ssl: %s", message)); + } SSL_CTX_free(context); SSL_free(http->tls); @@ -3836,7 +3854,12 @@ http_setup_ssl(http_t *http) /* I - Connection to server */ # endif /* WIN32 */ http->status = HTTP_ERROR; - return (HTTP_ERROR); + if (!message) + message = _("Unable to establish a secure connection to host."); + + _cupsSetError(IPP_PKI_ERROR, message, 1); + + return (-1); } # elif defined(HAVE_GNUTLS) @@ -3844,8 +3867,11 @@ http_setup_ssl(http_t *http) /* I - Connection to server */ malloc(sizeof(gnutls_certificate_client_credentials)); if (credentials == NULL) { - http->error = errno; + DEBUG_printf(("8http_setup_ssl: Unable to allocate credentials: %s", + strerror(errno))); + http->error = errno; http->status = HTTP_ERROR; + _cupsSetHTTPError(HTTP_ERROR); return (-1); } @@ -3854,22 +3880,31 @@ http_setup_ssl(http_t *http) /* I - Connection to server */ gnutls_init(&http->tls, GNUTLS_CLIENT); gnutls_set_default_priority(http->tls); + gnutls_server_name_set(http->tls, GNUTLS_NAME_DNS, http->hostname, strlen(http->hostname)); gnutls_credentials_set(http->tls, GNUTLS_CRD_CERTIFICATE, *credentials); gnutls_transport_set_ptr(http->tls, (gnutls_transport_ptr)http); gnutls_transport_set_pull_function(http->tls, _httpReadGNUTLS); gnutls_transport_set_push_function(http->tls, _httpWriteGNUTLS); - if ((gnutls_handshake(http->tls)) != GNUTLS_E_SUCCESS) + while ((status = gnutls_handshake(http->tls)) != GNUTLS_E_SUCCESS) { - http->error = errno; - http->status = HTTP_ERROR; + DEBUG_printf(("8http_setup_ssl: gnutls_handshake returned %d (%s)", + status, gnutls_strerror(status))); - gnutls_deinit(http->tls); - gnutls_certificate_free_credentials(*credentials); - free(credentials); - http->tls = NULL; + if (gnutls_error_is_fatal(status)) + { + http->error = EIO; + http->status = HTTP_ERROR; - return (-1); + _cupsSetError(IPP_PKI_ERROR, gnutls_strerror(status), 0); + + gnutls_deinit(http->tls); + gnutls_certificate_free_credentials(*credentials); + free(credentials); + http->tls = NULL; + + return (-1); + } } http->tls_credentials = credentials; @@ -3877,8 +3912,9 @@ http_setup_ssl(http_t *http) /* I - Connection to server */ # elif defined(HAVE_CDSASSL) if ((error = SSLNewContext(false, &http->tls))) { - http->error = error; + http->error = errno; http->status = HTTP_ERROR; + _cupsSetHTTPError(HTTP_ERROR); return (-1); } @@ -3892,13 +3928,6 @@ http_setup_ssl(http_t *http) /* I - Connection to server */ DEBUG_printf(("4http_setup_ssl: SSLSetIOFuncs, error=%d", (int)error)); } - if (!error) - { - error = SSLSetProtocolVersionEnabled(http->tls, kSSLProtocol2, false); - DEBUG_printf(("4http_setup_ssl: SSLSetProtocolVersionEnabled, error=%d", - (int)error)); - } - if (!error) { error = SSLSetAllowsAnyRoot(http->tls, any_root); @@ -4130,6 +4159,7 @@ http_setup_ssl(http_t *http) /* I - Connection to server */ http->tls = _sspiAlloc(); if (!http->tls) + { return (-1); http->tls->sock = http->fd; @@ -4143,6 +4173,13 @@ http_setup_ssl(http_t *http) /* I - Connection to server */ { _sspiFree(http->tls_credentials); http->tls_credentials = NULL; + + http->error = EIO; + http->status = HTTP_ERROR; + + _cupsSetError(IPP_PKI_ERROR, + _("Unable to establish a secure connection to host."), 1); + return (-1); } @@ -4153,6 +4190,13 @@ http_setup_ssl(http_t *http) /* I - Connection to server */ { _sspiFree(http->tls_credentials); http->tls_credentials = NULL; + + http->error = EIO; + http->status = HTTP_ERROR; + + _cupsSetError(IPP_PKI_ERROR, + _("Unable to establish a secure connection to host."), 1); + return (-1); } # endif /* HAVE_CDSASSL */ @@ -4173,11 +4217,11 @@ http_shutdown_ssl(http_t *http) /* I - Connection to server */ # ifdef HAVE_LIBSSL SSL_CTX *context; /* Context for encryption */ - context = SSL_get_SSL_CTX(http->tls_credentials); + context = SSL_get_SSL_CTX(http->tls); - SSL_shutdown(http->tls_credentials); + SSL_shutdown(http->tls); SSL_CTX_free(context); - SSL_free(http->tls_credentials); + SSL_free(http->tls); # elif defined(HAVE_GNUTLS) gnutls_certificate_client_credentials *credentials; diff --git a/cups/libcups.exp b/cups/libcups.exp deleted file mode 100644 index e69de29bb..000000000 diff --git a/cups/libcups.order b/cups/libcups.order deleted file mode 100755 index e69de29bb..000000000 diff --git a/cups/mark.c b/cups/mark.c index 113220071..44fc54d68 100644 --- a/cups/mark.c +++ b/cups/mark.c @@ -257,11 +257,13 @@ cupsMarkOptions( * Map sides to duplex option... */ - if (!strcmp(sides, "one-sided")) + if (!strcmp(sides, "one-sided") && cache->sides_1sided) ppd_mark_option(ppd, cache->sides_option, cache->sides_1sided); - else if (!strcmp(sides, "two-sided-long-edge")) + else if (!strcmp(sides, "two-sided-long-edge") && + cache->sides_2sided_long) ppd_mark_option(ppd, cache->sides_option, cache->sides_2sided_long); - else if (!strcmp(sides, "two-sided-short-edge")) + else if (!strcmp(sides, "two-sided-short-edge") && + cache->sides_2sided_short) ppd_mark_option(ppd, cache->sides_option, cache->sides_2sided_short); } } diff --git a/cups/ppd-cache.c b/cups/ppd-cache.c index b19610981..e161d057a 100644 --- a/cups/ppd-cache.c +++ b/cups/ppd-cache.c @@ -873,11 +873,8 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */ pwg_name = "top"; else if (!_cups_strncasecmp(choice->choice, "Side", 4)) pwg_name = "side"; - else if (!_cups_strcasecmp(choice->choice, "Roll") || - !_cups_strcasecmp(choice->choice, "Roll1")) + else if (!_cups_strcasecmp(choice->choice, "Roll")) pwg_name = "main-roll"; - else if (!_cups_strcasecmp(choice->choice, "Roll2")) - pwg_name = "alternate-roll"; else { /* @@ -938,6 +935,8 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */ pwg_name = "stationery-letterhead"; else if (!_cups_strncasecmp(choice->choice, "Preprint", 8)) pwg_name = "stationery-preprinted"; + else if (!_cups_strcasecmp(choice->choice, "Recycled")) + pwg_name = "stationery-recycled"; else if (!_cups_strncasecmp(choice->choice, "Transparen", 10)) pwg_name = "transparency"; else diff --git a/cups/ppd.c b/cups/ppd.c index 53e9fbf5a..325c4de5a 100644 --- a/cups/ppd.c +++ b/cups/ppd.c @@ -1,5 +1,5 @@ /* - * "$Id: ppd.c 7906 2008-09-03 20:19:43Z mike $" + * "$Id: ppd.c 9900 2011-08-17 20:59:46Z mike $" * * PPD file routines for CUPS. * @@ -43,6 +43,7 @@ * ppd_compare_coptions() - Compare two custom options. * ppd_compare_options() - Compare two options. * ppd_decode() - Decode a string value... + * ppd_free_filters() - Free the filters array. * ppd_free_group() - Free a single UI group. * ppd_free_option() - Free a single option. * ppd_get_coption() - Get a custom option record. @@ -52,6 +53,7 @@ * ppd_hash_option() - Generate a hash of the option name... * ppd_read() - Read a line from a PPD file, skipping comment * lines as necessary. + * ppd_update_filters() - Update the filters array as needed. */ /* @@ -110,6 +112,7 @@ static int ppd_compare_coptions(ppd_coption_t *a, ppd_coption_t *b); static int ppd_compare_options(ppd_option_t *a, ppd_option_t *b); static int ppd_decode(char *string); +static void ppd_free_filters(ppd_file_t *ppd); static void ppd_free_group(ppd_group_t *group); static void ppd_free_option(ppd_option_t *option); static ppd_coption_t *ppd_get_coption(ppd_file_t *ppd, const char *name); @@ -125,6 +128,8 @@ static int ppd_read(cups_file_t *fp, _ppd_line_t *line, char *keyword, char *option, char *text, char **string, int ignoreblank, _cups_globals_t *cg); +static int ppd_update_filters(ppd_file_t *ppd, + _cups_globals_t *cg); /* @@ -138,7 +143,6 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */ ppd_emul_t *emul; /* Current emulation */ ppd_group_t *group; /* Current group */ char **font; /* Current font */ - char **filter; /* Current filter */ ppd_attr_t **attr; /* Current attribute */ ppd_coption_t *coption; /* Current custom option */ ppd_cparam_t *cparam; /* Current custom parameter */ @@ -211,13 +215,7 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */ * Free any filters... */ - if (ppd->num_filters > 0) - { - for (i = ppd->num_filters, filter = ppd->filters; i > 0; i --, filter ++) - _cupsStrFree(*filter); - - ppd_free(ppd->filters); - } + ppd_free_filters(ppd); /* * Free any fonts... @@ -880,11 +878,10 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */ ppd->num_filters ++; /* - * Copy filter string and prevent it from being freed below... + * Retain a copy of the filter string... */ - *filter = string; - string = NULL; + *filter = _cupsStrRetain(string); } else if (!strcmp(keyword, "Throughput")) ppd->throughput = atoi(string); @@ -1961,6 +1958,17 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */ return (NULL); } + /* + * Update the filters array as needed... + */ + + if (!ppd_update_filters(ppd, cg)) + { + ppdClose(ppd); + + return (NULL); + } + /* * Create the sorted options array and set the option back-pointer for * each choice and custom option... @@ -2376,6 +2384,30 @@ ppd_decode(char *string) /* I - String to decode */ } +/* + * 'ppd_free_filters()' - Free the filters array. + */ + +static void +ppd_free_filters(ppd_file_t *ppd) /* I - PPD file */ +{ + int i; /* Looping var */ + char **filter; /* Current filter */ + + + if (ppd->num_filters > 0) + { + for (i = ppd->num_filters, filter = ppd->filters; i > 0; i --, filter ++) + _cupsStrFree(*filter); + + ppd_free(ppd->filters); + + ppd->num_filters = 0; + ppd->filters = NULL; + } +} + + /* * 'ppd_free_group()' - Free a single UI group. */ @@ -3140,5 +3172,125 @@ ppd_read(cups_file_t *fp, /* I - File to read from */ /* - * End of "$Id: ppd.c 7906 2008-09-03 20:19:43Z mike $". + * 'ppd_update_filters()' - Update the filters array as needed. + * + * This function re-populates the filters array with cupsFilter2 entries that + * have been stripped of the destination MIME media types and any maxsize hints. + * + * (All for backwards-compatibility) + */ + +static int /* O - 1 on success, 0 on failure */ +ppd_update_filters(ppd_file_t *ppd,/* I - PPD file */ + _cups_globals_t *cg) /* I - Global data */ +{ + ppd_attr_t *attr; /* Current cupsFilter2 value */ + char srcsuper[16], /* Source MIME media type */ + srctype[256], + dstsuper[16], /* Destination MIME media type */ + dsttype[256], + program[1024], /* Command to run */ + *ptr, /* Pointer into command to run */ + buffer[1024], /* Re-written cupsFilter value */ + **filter; /* Current filter */ + int cost; /* Cost of filter */ + + + DEBUG_printf(("4ppd_update_filters(ppd=%p, cg=%p)", ppd, cg)); + + /* + * See if we have any cupsFilter2 lines... + */ + + if ((attr = ppdFindAttr(ppd, "cupsFilter2", NULL)) == NULL) + { + DEBUG_puts("5ppd_update_filters: No cupsFilter2 keywords present."); + return (1); + } + + /* + * Yes, free the cupsFilter-defined filters and re-build... + */ + + ppd_free_filters(ppd); + + do + { + /* + * Parse the cupsFilter2 string: + * + * src/type dst/type cost program + * src/type dst/type cost maxsize(n) program + */ + + DEBUG_printf(("5ppd_update_filters: cupsFilter2=\"%s\"", attr->value)); + + if (sscanf(attr->value, "%15[^/]/%255s%*[ \t]%15[^/]/%255s%d%*[ \t]%1023[^\n]", + srcsuper, srctype, dstsuper, dsttype, &cost, program) != 6) + { + DEBUG_puts("5ppd_update_filters: Bad cupsFilter2 line."); + cg->ppd_status = PPD_BAD_VALUE; + + return (0); + } + + DEBUG_printf(("5ppd_update_filters: srcsuper=\"%s\", srctype=\"%s\", " + "dstsuper=\"%s\", dsttype=\"%s\", cost=%d, program=\"%s\"", + srcsuper, srctype, dstsuper, dsttype, cost, program)); + + if (!strncmp(program, "maxsize(", 8) && + (ptr = strchr(program + 8, ')')) != NULL) + { + DEBUG_puts("5ppd_update_filters: Found maxsize(nnn)."); + + ptr ++; + while (_cups_isspace(*ptr)) + ptr ++; + + _cups_strcpy(program, ptr); + DEBUG_printf(("5ppd_update_filters: New program=\"%s\"", program)); + } + + /* + * Convert to cupsFilter format: + * + * src/type cost program + */ + + snprintf(buffer, sizeof(buffer), "%s/%s %d %s", srcsuper, srctype, cost, + program); + DEBUG_printf(("5ppd_update_filters: Adding \"%s\".", buffer)); + + /* + * Add a cupsFilter-compatible string to the filters array. + */ + + if (ppd->num_filters == 0) + filter = malloc(sizeof(char *)); + else + filter = realloc(ppd->filters, sizeof(char *) * (ppd->num_filters + 1)); + + if (filter == NULL) + { + DEBUG_puts("5ppd_update_filters: Out of memory."); + cg->ppd_status = PPD_ALLOC_ERROR; + + return (0); + } + + ppd->filters = filter; + filter += ppd->num_filters; + ppd->num_filters ++; + + *filter = _cupsStrAlloc(buffer); + } + while ((attr = ppdFindNextAttr(ppd, "cupsFilter2", NULL)) != NULL); + + DEBUG_puts("5ppd_update_filters: Completed OK."); + return (1); +} + + +/* + * End of "$Id: ppd.c 9900 2011-08-17 20:59:46Z mike $". */ diff --git a/cups/raster-private.h b/cups/raster-private.h new file mode 100644 index 000000000..0a1996c5c --- /dev/null +++ b/cups/raster-private.h @@ -0,0 +1,67 @@ +/* + * "$Id$" + * + * Private image library definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_RASTER_PRIVATE_H_ +# define _CUPS_RASTER_PRIVATE_H_ + +/* + * Include necessary headers... + */ + +# include "raster.h" +# include +# include +# include +# ifdef WIN32 +# include +# include /* for htonl() definition */ +# else +# include +# include +# endif /* WIN32 */ + + +/* + * min/max/abs macros... + */ + +# ifndef max +# define max(a,b) ((a) > (b) ? (a) : (b)) +# endif /* !max */ +# ifndef min +# define min(a,b) ((a) < (b) ? (a) : (b)) +# endif /* !min */ +# ifndef abs +# define abs(a) ((a) < 0 ? -(a) : (a)) +# endif /* !abs */ + + +/* + * Prototypes... + */ + +extern int _cupsRasterExecPS(cups_page_header2_t *h, + int *preferred_bits, + const char *code); +extern void _cupsRasterAddError(const char *f, ...); +extern void _cupsRasterClearError(void); + +#endif /* !_CUPS_RASTER_PRIVATE_H_ */ + +/* + * End of "$Id$". + */ diff --git a/cups/request.c b/cups/request.c index 7d724b6ab..e8b142512 100644 --- a/cups/request.c +++ b/cups/request.c @@ -343,7 +343,8 @@ cupsDoRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP_ * * Use this function to get the response for an IPP request sent using * cupsSendDocument() or cupsSendRequest(). For requests that return - * additional data, use httpRead() after getting a successful response. + * additional data, use httpRead() after getting a successful response, + * otherwise call httpFlush() to complete the response processing. * * @since CUPS 1.4/Mac OS X 10.6@ */ @@ -426,6 +427,8 @@ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP response = NULL; _cupsSetError(IPP_SERVICE_UNAVAILABLE, NULL, 0); + http->status = status = HTTP_ERROR; + http->error = EIO; } } else if (status != HTTP_ERROR) @@ -451,7 +454,7 @@ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP if (!cupsDoAuthentication(http, "POST", resource)) httpReconnect(http); else - status = HTTP_AUTHORIZATION_CANCELED; + http->status = status = HTTP_AUTHORIZATION_CANCELED; } #ifdef HAVE_SSL @@ -637,6 +640,20 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP if ((http = _cupsConnect()) == NULL) return (HTTP_SERVICE_UNAVAILABLE); + /* + * If the prior request was not flushed out, do so now... + */ + + if (http->state == HTTP_GET_SEND || + http->state == HTTP_POST_SEND) + httpFlush(http); + else if (http->state != HTTP_WAITING) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + + return (HTTP_ERROR); + } + #ifdef HAVE_SSL /* * See if we have an auth-info attribute and are communicating over diff --git a/cups/testfile.c b/cups/testfile.c index ed3d86af6..2aa3fb99c 100644 --- a/cups/testfile.c +++ b/cups/testfile.c @@ -133,9 +133,9 @@ main(int argc, /* I - Number of command-line arguments */ * Count lines in psglyphs, rewind, then count again. */ - fputs("\ncupsFileOpen(\"../data/psglyphs\", \"r\"): ", stdout); + fputs("\ncupsFileOpen(\"../data/media.defs\", \"r\"): ", stdout); - if ((fp = cupsFileOpen("../data/psglyphs", "r")) == NULL) + if ((fp = cupsFileOpen("../data/media.defs", "r")) == NULL) { puts("FAIL"); status ++; @@ -145,9 +145,9 @@ main(int argc, /* I - Number of command-line arguments */ puts("PASS"); fputs("cupsFileGets: ", stdout); - if ((count = count_lines(fp)) != 1051) + if ((count = count_lines(fp)) != 208) { - printf("FAIL (got %d lines, expected 1051)\n", count); + printf("FAIL (got %d lines, expected 208)\n", count); status ++; } else @@ -165,9 +165,9 @@ main(int argc, /* I - Number of command-line arguments */ puts("PASS"); fputs("cupsFileGets: ", stdout); - if ((count = count_lines(fp)) != 1051) + if ((count = count_lines(fp)) != 208) { - printf("FAIL (got %d lines, expected 1051)\n", count); + printf("FAIL (got %d lines, expected 208)\n", count); status ++; } else diff --git a/data/Makefile b/data/Makefile index 4f575a5ce..7df826095 100644 --- a/data/Makefile +++ b/data/Makefile @@ -27,21 +27,15 @@ BANNERS = \ topsecret \ unclassified -CHARSETS = \ - utf-8 - DATAFILES = \ - psglyphs \ testprint PPDCFILES = \ epson.h \ - escp.h \ font.defs \ hp.h \ label.h \ media.defs \ - pcl.h \ raster.defs @@ -96,12 +90,6 @@ install-data: for file in $(BANNERS); do \ $(INSTALL_DATA) $$file $(DATADIR)/banners; \ done - $(INSTALL_DIR) -m 755 $(DATADIR)/charsets - if test "x$(BANNERTOPS)" != x -o "x$(TEXTTOPS)" != x; then \ - for file in $(CHARSETS); do \ - $(INSTALL_DATA) $$file $(DATADIR)/charsets; \ - done; \ - fi $(INSTALL_DIR) -m 755 $(DATADIR)/data for file in $(DATAFILES); do \ $(INSTALL_DATA) $$file $(DATADIR)/data; \ @@ -143,9 +131,6 @@ uninstall: for file in $(BANNERS); do \ $(RM) $(DATADIR)/banners/$$file; \ done - for file in $(CHARSETS); do \ - $(RM) $(DATADIR)/charsets/$$file; \ - done for file in $(DATAFILES); do \ $(RM) $(DATADIR)/data/$$file; \ done @@ -156,7 +141,6 @@ uninstall: -$(RMDIR) $(DATADIR)/ppdc -$(RMDIR) $(DATADIR)/model -$(RMDIR) $(DATADIR)/data - -$(RMDIR) $(DATADIR)/charsets -$(RMDIR) $(DATADIR)/banners -$(RMDIR) $(DATADIR) diff --git a/data/escp.h b/data/escp.h deleted file mode 100644 index 94389f3b9..000000000 --- a/data/escp.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * "$Id$" - * - * This file contains model number definitions for the CUPS unified - * ESC/P driver. - * - * Copyright 2007 by Apple Inc. - * Copyright 1997-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - */ - -/* General ESC/P Support */ -#define ESCP_DOTMATRIX 0x1 /* Dot matrix printer? */ -#define ESCP_MICROWEAVE 0x2 /* Use microweave command? */ -#define ESCP_STAGGER 0x4 /* Are color jets staggered? */ -#define ESCP_ESCK 0x8 /* Use print mode command?*/ -#define ESCP_EXT_UNITS 0x10 /* Use extended unit commands? */ -#define ESCP_EXT_MARGINS 0x20 /* Use extended margin command */ -#define ESCP_USB 0x40 /* Send USB packet mode escape? */ -#define ESCP_PAGE_SIZE 0x80 /* Use page size command */ -#define ESCP_RASTER_ESCI 0x100 /* Use ESC i graphics command */ - -/* Remote mode support */ -#define ESCP_REMOTE 0x1000 /* Use remote mode commands? */ - - -/* - * End of "$Id$". - */ diff --git a/data/pcl.h b/data/pcl.h deleted file mode 100644 index 0cb1effe5..000000000 --- a/data/pcl.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * "$Id$" - * - * This file contains model number definitions for the CUPS unified - * PCL driver. - * - * Copyright 2007 by Apple Inc. - * Copyright 1997-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - */ - -/* General PCL Support */ -#define PCL_PAPER_SIZE 0x1 /* Use ESC&l#A */ -#define PCL_INKJET 0x2 /* Use inkjet commands */ - -/* Raster Support */ -#define PCL_RASTER_END_COLOR 0x100 /* Use ESC*rC */ -#define PCL_RASTER_CID 0x200 /* Use ESC*v#W */ -#define PCL_RASTER_CRD 0x400 /* Use ESC*g#W */ -#define PCL_RASTER_SIMPLE 0x800 /* Use ESC*r#U */ -#define PCL_RASTER_RGB24 0x1000 /* Use 24-bit RGB mode */ - -/* PJL Support */ -#define PCL_PJL 0x10000 /* Use PJL Commands */ -#define PCL_PJL_PAPERWIDTH 0x20000 /* Use PJL PAPERWIDTH/LENGTH */ -#define PCL_PJL_HPGL2 0x40000 /* Enter HPGL2 */ -#define PCL_PJL_PCL3GUI 0x80000 /* Enter PCL3GUI */ -#define PCL_PJL_RESOLUTION 0x100000 /* Use PJL SET RESOLUTION */ - - -/* - * End of "$Id$". - */ diff --git a/data/psglyphs b/data/psglyphs deleted file mode 100644 index c4a902c66..000000000 --- a/data/psglyphs +++ /dev/null @@ -1,1051 +0,0 @@ -0020 space -0021 exclam -0022 quotedbl -0023 numbersign -0024 dollar -0025 percent -0026 ampersand -0027 quotesingle -0028 parenleft -0029 parenright -002a asterisk -002b plus -002c comma -002d minus -002e period -002f slash -0030 zero -0031 one -0032 two -0033 three -0034 four -0035 five -0036 six -0037 seven -0038 eight -0039 nine -003a colon -003b semicolon -003c less -003d equal -003e greater -003f question -0040 at -0041 A -0042 B -0043 C -0044 D -0045 E -0046 F -0047 G -0048 H -0049 I -004a J -004b K -004c L -004d M -004e N -004f O -0050 P -0051 Q -0052 R -0053 S -0054 T -0055 U -0056 V -0057 W -0058 X -0059 Y -005a Z -005b bracketleft -005c backslash -005d bracketright -005e asciicircum -005f underscore -0060 grave -0061 a -0062 b -0063 c -0064 d -0065 e -0066 f -0067 g -0068 h -0069 i -006a j -006b k -006c l -006d m -006e n -006f o -0070 p -0071 q -0072 r -0073 s -0074 t -0075 u -0076 v -0077 w -0078 x -0079 y -007a z -007b braceleft -007c bar -007d braceright -007e asciitilde -00a0 space -00a1 exclamdown -00a2 cent -00a3 sterling -00a4 currency -00a5 yen -00a6 brokenbar -00a7 section -00a8 dieresis -00a9 copyright -00aa ordfeminine -00ab guillemotleft -00ac logicalnot -00ad hyphen -00ae registered -00af macron -00b0 degree -00b1 plusminus -00b2 twosuperior -00b3 threesuperior -00b4 acute -00b5 mu -00b6 paragraph -00b7 periodcentered -00b8 cedilla -00b9 onesuperior -00ba ordmasculine -00bb guillemotright -00bc onequarter -00bd onehalf -00be threequarters -00bf questiondown -00c0 Agrave -00c1 Aacute -00c2 Acircumflex -00c3 Atilde -00c4 Adieresis -00c5 Aring -00c6 AE -00c7 Ccedilla -00c8 Egrave -00c9 Eacute -00ca Ecircumflex -00cb Edieresis -00cc Igrave -00cd Iacute -00ce Icircumflex -00cf Idieresis -00d0 Eth -00d1 Ntilde -00d2 Ograve -00d3 Oacute -00d4 Ocircumflex -00d5 Otilde -00d6 Odieresis -00d7 multiply -00d8 Oslash -00d9 Ugrave -00da Uacute -00db Ucircumflex -00dc Udieresis -00dd Yacute -00de Thorn -00df germandbls -00e0 agrave -00e1 aacute -00e2 acircumflex -00e3 atilde -00e4 adieresis -00e5 aring -00e6 ae -00e7 ccedilla -00e8 egrave -00e9 eacute -00ea ecircumflex -00eb edieresis -00ec igrave -00ed iacute -00ee icircumflex -00ef idieresis -00f0 eth -00f1 ntilde -00f2 ograve -00f3 oacute -00f4 ocircumflex -00f5 otilde -00f6 odieresis -00f7 divide -00f8 oslash -00f9 ugrave -00fa uacute -00fb ucircumflex -00fc udieresis -00fd yacute -00fe thorn -00ff ydieresis -0100 Amacron -0101 amacron -0102 Abreve -0103 abreve -0104 Aogonek -0105 aogonek -0106 Cacute -0107 cacute -0108 Ccircumflex -0109 ccircumflex -010a Cdotaccent -010b cdotaccent -010c Ccaron -010d ccaron -010e Dcaron -010f dcaron -0110 Dcroat -0111 dcroat -0112 Emacron -0113 emacron -0114 Ebreve -0115 ebreve -0116 Edotaccent -0117 edotaccent -0118 Eogonek -0119 eogonek -011a Ecaron -011b ecaron -011c Gcircumflex -011d gcircumflex -011e Gbreve -011f gbreve -0120 Gdotaccent -0121 gdotaccent -0122 Gcommaaccent -0123 gcommaaccent -0124 Hcircumflex -0125 hcircumflex -0126 Hbar -0127 hbar -0128 Itilde -0129 itilde -012a Imacron -012b imacron -012c Ibreve -012d ibreve -012e Iogonek -012f iogonek -0130 Idotaccent -0131 dotlessi -0132 IJ -0133 ij -0134 Jcircumflex -0135 jcircumflex -0136 Kcommaaccent -0137 kcommaaccent -0138 kgreenlandic -0139 Lacute -013a lacute -013b Lcommaaccent -013c lcommaaccent -013d Lcaron -013e lcaron -013f Ldot -0140 ldot -0141 Lslash -0142 lslash -0143 Nacute -0144 nacute -0145 Ncommaaccent -0146 ncommaaccent -0147 Ncaron -0148 ncaron -0149 napostrophe -014a Eng -014b eng -014c Omacron -014d omacron -014e Obreve -014f obreve -0150 Ohungarumlaut -0151 ohungarumlaut -0152 OE -0153 oe -0154 Racute -0155 racute -0156 Rcommaaccent -0157 rcommaaccent -0158 Rcaron -0159 rcaron -015a Sacute -015b sacute -015c Scircumflex -015d scircumflex -015e Scedilla -015f scedilla -0160 Scaron -0161 scaron -0162 Tcommaaccent -0163 tcommaaccent -0164 Tcaron -0165 tcaron -0166 Tbar -0167 tbar -0168 Utilde -0169 utilde -016a Umacron -016b umacron -016c Ubreve -016d ubreve -016e Uring -016f uring -0170 Uhungarumlaut -0171 uhungarumlaut -0172 Uogonek -0173 uogonek -0174 Wcircumflex -0175 wcircumflex -0176 Ycircumflex -0177 ycircumflex -0178 Ydieresis -0179 Zacute -017a zacute -017b Zdotaccent -017c zdotaccent -017d Zcaron -017e zcaron -017f longs -0192 florin -01a0 Ohorn -01a1 ohorn -01af Uhorn -01b0 uhorn -01e6 Gcaron -01e7 gcaron -01fa Aringacute -01fb aringacute -01fc AEacute -01fd aeacute -01fe Oslashacute -01ff oslashacute -0218 Scommaaccent -0219 scommaaccent -021a Tcommaaccent -021b tcommaaccent -02bc afii57929 -02bd afii64937 -02c6 circumflex -02c7 caron -02c9 macron -02d8 breve -02d9 dotaccent -02da ring -02db ogonek -02dc tilde -02dd hungarumlaut -0300 gravecomb -0301 acutecomb -0303 tildecomb -0309 hookabovecomb -0323 dotbelowcomb -0384 tonos -0385 dieresistonos -0386 Alphatonos -0387 anoteleia -0388 Epsilontonos -0389 Etatonos -038a Iotatonos -038c Omicrontonos -038e Upsilontonos -038f Omegatonos -0390 iotadieresistonos -0391 Alpha -0392 Beta -0393 Gamma -0394 Delta -0395 Epsilon -0396 Zeta -0397 Eta -0398 Theta -0399 Iota -039a Kappa -039b Lambda -039c Mu -039d Nu -039e Xi -039f Omicron -03a0 Pi -03a1 Rho -03a3 Sigma -03a4 Tau -03a5 Upsilon -03a6 Phi -03a7 Chi -03a8 Psi -03a9 Omega -03aa Iotadieresis -03ab Upsilondieresis -03ac alphatonos -03ad epsilontonos -03ae etatonos -03af iotatonos -03b0 upsilondieresistonos -03b1 alpha -03b2 beta -03b3 gamma -03b4 delta -03b5 epsilon -03b6 zeta -03b7 eta -03b8 theta -03b9 iota -03ba kappa -03bb lambda -03bc mu -03bd nu -03be xi -03bf omicron -03c0 pi -03c1 rho -03c2 sigma1 -03c3 sigma -03c4 tau -03c5 upsilon -03c6 phi -03c7 chi -03c8 psi -03c9 omega -03ca iotadieresis -03cb upsilondieresis -03cc omicrontonos -03cd upsilontonos -03ce omegatonos -03d1 theta1 -03d2 Upsilon1 -03d5 phi1 -03d6 omega1 -0401 afii10023 -0402 afii10051 -0403 afii10052 -0404 afii10053 -0405 afii10054 -0406 afii10055 -0407 afii10056 -0408 afii10057 -0409 afii10058 -040a afii10059 -040b afii10060 -040c afii10061 -040e afii10062 -040f afii10145 -0410 afii10017 -0411 afii10018 -0412 afii10019 -0413 afii10020 -0414 afii10021 -0415 afii10022 -0416 afii10024 -0417 afii10025 -0418 afii10026 -0419 afii10027 -041a afii10028 -041b afii10029 -041c afii10030 -041d afii10031 -041e afii10032 -041f afii10033 -0420 afii10034 -0421 afii10035 -0422 afii10036 -0423 afii10037 -0424 afii10038 -0425 afii10039 -0426 afii10040 -0427 afii10041 -0428 afii10042 -0429 afii10043 -042a afii10044 -042b afii10045 -042c afii10046 -042d afii10047 -042e afii10048 -042f afii10049 -0430 afii10065 -0431 afii10066 -0432 afii10067 -0433 afii10068 -0434 afii10069 -0435 afii10070 -0436 afii10072 -0437 afii10073 -0438 afii10074 -0439 afii10075 -043a afii10076 -043b afii10077 -043c afii10078 -043d afii10079 -043e afii10080 -043f afii10081 -0440 afii10082 -0441 afii10083 -0442 afii10084 -0443 afii10085 -0444 afii10086 -0445 afii10087 -0446 afii10088 -0447 afii10089 -0448 afii10090 -0449 afii10091 -044a afii10092 -044b afii10093 -044c afii10094 -044d afii10095 -044e afii10096 -044f afii10097 -0451 afii10071 -0452 afii10099 -0453 afii10100 -0454 afii10101 -0455 afii10102 -0456 afii10103 -0457 afii10104 -0458 afii10105 -0459 afii10106 -045a afii10107 -045b afii10108 -045c afii10109 -045e afii10110 -045f afii10193 -0462 afii10146 -0463 afii10194 -0472 afii10147 -0473 afii10195 -0474 afii10148 -0475 afii10196 -0490 afii10050 -0491 afii10098 -04d9 afii10846 -05b0 afii57799 -05b1 afii57801 -05b2 afii57800 -05b3 afii57802 -05b4 afii57793 -05b5 afii57794 -05b6 afii57795 -05b7 afii57798 -05b8 afii57797 -05b9 afii57806 -05bb afii57796 -05bc afii57807 -05bd afii57839 -05be afii57645 -05bf afii57841 -05c0 afii57842 -05c1 afii57804 -05c2 afii57803 -05c3 afii57658 -05d0 afii57664 -05d1 afii57665 -05d2 afii57666 -05d3 afii57667 -05d4 afii57668 -05d5 afii57669 -05d6 afii57670 -05d7 afii57671 -05d8 afii57672 -05d9 afii57673 -05da afii57674 -05db afii57675 -05dc afii57676 -05dd afii57677 -05de afii57678 -05df afii57679 -05e0 afii57680 -05e1 afii57681 -05e2 afii57682 -05e3 afii57683 -05e4 afii57684 -05e5 afii57685 -05e6 afii57686 -05e7 afii57687 -05e8 afii57688 -05e9 afii57689 -05ea afii57690 -05f0 afii57716 -05f1 afii57717 -05f2 afii57718 -060c afii57388 -061b afii57403 -061f afii57407 -0621 afii57409 -0622 afii57410 -0623 afii57411 -0624 afii57412 -0625 afii57413 -0626 afii57414 -0627 afii57415 -0628 afii57416 -0629 afii57417 -062a afii57418 -062b afii57419 -062c afii57420 -062d afii57421 -062e afii57422 -062f afii57423 -0630 afii57424 -0631 afii57425 -0632 afii57426 -0633 afii57427 -0634 afii57428 -0635 afii57429 -0636 afii57430 -0637 afii57431 -0638 afii57432 -0639 afii57433 -063a afii57434 -0640 afii57440 -0641 afii57441 -0642 afii57442 -0643 afii57443 -0644 afii57444 -0645 afii57445 -0646 afii57446 -0647 afii57470 -0648 afii57448 -0649 afii57449 -064a afii57450 -064b afii57451 -064c afii57452 -064d afii57453 -064e afii57454 -064f afii57455 -0650 afii57456 -0651 afii57457 -0652 afii57458 -0660 afii57392 -0661 afii57393 -0662 afii57394 -0663 afii57395 -0664 afii57396 -0665 afii57397 -0666 afii57398 -0667 afii57399 -0668 afii57400 -0669 afii57401 -066a afii57381 -066d afii63167 -0679 afii57511 -067e afii57506 -0686 afii57507 -0688 afii57512 -0691 afii57513 -0698 afii57508 -06a4 afii57505 -06af afii57509 -06ba afii57514 -06d2 afii57519 -06d5 afii57534 -1e80 Wgrave -1e81 wgrave -1e82 Wacute -1e83 wacute -1e84 Wdieresis -1e85 wdieresis -1ef2 Ygrave -1ef3 ygrave -200c afii61664 -200d afii301 -200e afii299 -200f afii300 -2012 figuredash -2013 endash -2014 emdash -2015 afii00208 -2017 underscoredbl -2018 quoteleft -2019 quoteright -201a quotesinglbase -201b quotereversed -201c quotedblleft -201d quotedblright -201e quotedblbase -2020 dagger -2021 daggerdbl -2022 bullet -2024 onedotenleader -2025 twodotenleader -2026 ellipsis -202c afii61573 -202d afii61574 -202e afii61575 -2030 perthousand -2032 minute -2033 second -2039 guilsinglleft -203a guilsinglright -203c exclamdbl -2044 fraction -2070 zerosuperior -2074 foursuperior -2075 fivesuperior -2076 sixsuperior -2077 sevensuperior -2078 eightsuperior -2079 ninesuperior -207d parenleftsuperior -207e parenrightsuperior -207f nsuperior -2080 zeroinferior -2081 oneinferior -2082 twoinferior -2083 threeinferior -2084 fourinferior -2085 fiveinferior -2086 sixinferior -2087 seveninferior -2088 eightinferior -2089 nineinferior -208d parenleftinferior -208e parenrightinferior -20a1 colonmonetary -20a3 franc -20a4 lira -20a7 peseta -20aa afii57636 -20ab dong -20ac Euro -2105 afii61248 -2111 Ifraktur -2113 afii61289 -2116 afii61352 -2118 weierstrass -211c Rfraktur -211e prescription -2122 trademark -2126 Omega -212e estimated -2135 aleph -2153 onethird -2154 twothirds -215b oneeighth -215c threeeighths -215d fiveeighths -215e seveneighths -2190 arrowleft -2191 arrowup -2192 arrowright -2193 arrowdown -2194 arrowboth -2195 arrowupdn -21a8 arrowupdnbse -21b5 carriagereturn -21d0 arrowdblleft -21d1 arrowdblup -21d2 arrowdblright -21d3 arrowdbldown -21d4 arrowdblboth -2200 universal -2202 partialdiff -2203 existential -2205 emptyset -2206 Delta -2207 gradient -2208 element -2209 notelement -220b suchthat -220f product -2211 summation -2212 minus -2215 fraction -2217 asteriskmath -2219 periodcentered -221a radical -221d proportional -221e infinity -221f orthogonal -2220 angle -2227 logicaland -2228 logicalor -2229 intersection -222a union -222b integral -2234 therefore -223c similar -2245 congruent -2248 approxequal -2260 notequal -2261 equivalence -2264 lessequal -2265 greaterequal -2282 propersubset -2283 propersuperset -2284 notsubset -2286 reflexsubset -2287 reflexsuperset -2295 circleplus -2297 circlemultiply -22a5 perpendicular -22c5 dotmath -2302 house -2310 revlogicalnot -2320 integraltp -2321 integralbt -2329 angleleft -232a angleright -2500 SF100000 -2502 SF110000 -250c SF010000 -2510 SF030000 -2514 SF020000 -2518 SF040000 -251c SF080000 -2524 SF090000 -252c SF060000 -2534 SF070000 -253c SF050000 -2550 SF430000 -2551 SF240000 -2552 SF510000 -2553 SF520000 -2554 SF390000 -2555 SF220000 -2556 SF210000 -2557 SF250000 -2558 SF500000 -2559 SF490000 -255a SF380000 -255b SF280000 -255c SF270000 -255d SF260000 -255e SF360000 -255f SF370000 -2560 SF420000 -2561 SF190000 -2562 SF200000 -2563 SF230000 -2564 SF470000 -2565 SF480000 -2566 SF410000 -2567 SF450000 -2568 SF460000 -2569 SF400000 -256a SF540000 -256b SF530000 -256c SF440000 -2580 upblock -2584 dnblock -2588 block -258c lfblock -2590 rtblock -2591 ltshade -2592 shade -2593 dkshade -25a0 filledbox -25a1 H22073 -25aa H18543 -25ab H18551 -25ac filledrect -25b2 triagup -25ba triagrt -25bc triagdn -25c4 triaglf -25ca lozenge -25cb circle -25cf H18533 -25d8 invbullet -25d9 invcircle -25e6 openbullet -263a smileface -263b invsmileface -263c sun -2640 female -2642 male -2660 spade -2663 club -2665 heart -2666 diamond -266a musicalnote -266b musicalnotedbl -f6be dotlessj -f6bf LL -f6c0 ll -f6c1 Scedilla -f6c2 scedilla -f6c3 commaaccent -f6c4 afii10063 -f6c5 afii10064 -f6c6 afii10192 -f6c7 afii10831 -f6c8 afii10832 -f6c9 Acute -f6ca Caron -f6cb Dieresis -f6cc DieresisAcute -f6cd DieresisGrave -f6ce Grave -f6cf Hungarumlaut -f6d0 Macron -f6d1 cyrBreve -f6d2 cyrFlex -f6d3 dblGrave -f6d4 cyrbreve -f6d5 cyrflex -f6d6 dblgrave -f6d7 dieresisacute -f6d8 dieresisgrave -f6d9 copyrightserif -f6da registerserif -f6db trademarkserif -f6dc onefitted -f6dd rupiah -f6de threequartersemdash -f6df centinferior -f6e0 centsuperior -f6e1 commainferior -f6e2 commasuperior -f6e3 dollarinferior -f6e4 dollarsuperior -f6e5 hypheninferior -f6e6 hyphensuperior -f6e7 periodinferior -f6e8 periodsuperior -f6e9 asuperior -f6ea bsuperior -f6eb dsuperior -f6ec esuperior -f6ed isuperior -f6ee lsuperior -f6ef msuperior -f6f0 osuperior -f6f1 rsuperior -f6f2 ssuperior -f6f3 tsuperior -f6f4 Brevesmall -f6f5 Caronsmall -f6f6 Circumflexsmall -f6f7 Dotaccentsmall -f6f8 Hungarumlautsmall -f6f9 Lslashsmall -f6fa OEsmall -f6fb Ogoneksmall -f6fc Ringsmall -f6fd Scaronsmall -f6fe Tildesmall -f6ff Zcaronsmall -f721 exclamsmall -f724 dollaroldstyle -f726 ampersandsmall -f730 zerooldstyle -f731 oneoldstyle -f732 twooldstyle -f733 threeoldstyle -f734 fouroldstyle -f735 fiveoldstyle -f736 sixoldstyle -f737 sevenoldstyle -f738 eightoldstyle -f739 nineoldstyle -f73f questionsmall -f760 Gravesmall -f761 Asmall -f762 Bsmall -f763 Csmall -f764 Dsmall -f765 Esmall -f766 Fsmall -f767 Gsmall -f768 Hsmall -f769 Ismall -f76a Jsmall -f76b Ksmall -f76c Lsmall -f76d Msmall -f76e Nsmall -f76f Osmall -f770 Psmall -f771 Qsmall -f772 Rsmall -f773 Ssmall -f774 Tsmall -f775 Usmall -f776 Vsmall -f777 Wsmall -f778 Xsmall -f779 Ysmall -f77a Zsmall -f7a1 exclamdownsmall -f7a2 centoldstyle -f7a8 Dieresissmall -f7af Macronsmall -f7b4 Acutesmall -f7b8 Cedillasmall -f7bf questiondownsmall -f7e0 Agravesmall -f7e1 Aacutesmall -f7e2 Acircumflexsmall -f7e3 Atildesmall -f7e4 Adieresissmall -f7e5 Aringsmall -f7e6 AEsmall -f7e7 Ccedillasmall -f7e8 Egravesmall -f7e9 Eacutesmall -f7ea Ecircumflexsmall -f7eb Edieresissmall -f7ec Igravesmall -f7ed Iacutesmall -f7ee Icircumflexsmall -f7ef Idieresissmall -f7f0 Ethsmall -f7f1 Ntildesmall -f7f2 Ogravesmall -f7f3 Oacutesmall -f7f4 Ocircumflexsmall -f7f5 Otildesmall -f7f6 Odieresissmall -f7f8 Oslashsmall -f7f9 Ugravesmall -f7fa Uacutesmall -f7fb Ucircumflexsmall -f7fc Udieresissmall -f7fd Yacutesmall -f7fe Thornsmall -f7ff Ydieresissmall -f8e5 radicalex -f8e6 arrowvertex -f8e7 arrowhorizex -f8e8 registersans -f8e9 copyrightsans -f8ea trademarksans -f8eb parenlefttp -f8ec parenleftex -f8ed parenleftbt -f8ee bracketlefttp -f8ef bracketleftex -f8f0 bracketleftbt -f8f1 bracelefttp -f8f2 braceleftmid -f8f3 braceleftbt -f8f4 braceex -f8f5 integralex -f8f6 parenrighttp -f8f7 parenrightex -f8f8 parenrightbt -f8f9 bracketrighttp -f8fa bracketrightex -f8fb bracketrightbt -f8fc bracerighttp -f8fd bracerightmid -f8fe bracerightbt -fb00 ff -fb01 fi -fb02 fl -fb03 ffi -fb04 ffl -fb1f afii57705 -fb2a afii57694 -fb2b afii57695 -fb35 afii57723 -fb4b afii57700 diff --git a/data/utf-8 b/data/utf-8 deleted file mode 100644 index 044691b46..000000000 --- a/data/utf-8 +++ /dev/null @@ -1,40 +0,0 @@ -charset utf8 - -# -# This file defines the font mappings used for Unicode/UTF-8 text printing. -# -# Each line consists of: -# -# first last direction width normal bold italic bold-italic -# -# First and last are the first and last glyphs in the font mapping -# that correspond to that font; a maximum of 256 characters can be -# mapped within each group, with a maximum of 256 mappings (this is a -# PostScript limitation.) The glyph values are hexadecimal. -# -# Direction is the string "ltor" or "rtol", indicating left-to-right or -# right-to-left text. -# -# Width is the string "single" or "double"; double means that the glyphs -# are twice as wide as ASCII characters in the Monospace typeface. -# -# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use -# for each presentation. If characters are only available in a single -# style then only one typeface should be listed, e.g. -# -# 1000 10ff ltor single Monospace -# -# Each font that is listed will be downloaded to the printer when used. -# - -0000 00FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique -0100 01FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique -0200 02FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique -0300 03FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique -0400 04FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique -1E00 1EFF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique -2000 20FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique -2300 23FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique -2400 24FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique -2500 25FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique -2600 26FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique diff --git a/driver/Dependencies b/driver/Dependencies deleted file mode 100644 index 6730f13f5..000000000 --- a/driver/Dependencies +++ /dev/null @@ -1,75 +0,0 @@ -# DO NOT DELETE - -commandtoescpx.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h -commandtoescpx.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h -commandtoescpx.o: ../cups/array.h ../cups/language.h ../cups/string-private.h -commandtoescpx.o: ../config.h ../cups/debug-private.h ../cups/ppd-private.h -commandtoescpx.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h -commandtoescpx.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h -commandtoescpx.o: ../cups/ipp-private.h ../cups/ipp.h -commandtoescpx.o: ../cups/language-private.h ../cups/transcode.h -commandtoescpx.o: ../cups/thread-private.h driver.h ../cups/raster.h -commandtoescpx.o: ../cups/ppd.h ../data/escp.h -commandtopclx.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h -commandtopclx.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h -commandtopclx.o: ../cups/array.h ../cups/language.h ../cups/string-private.h -commandtopclx.o: ../config.h ../cups/debug-private.h ../cups/ppd-private.h -commandtopclx.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h -commandtopclx.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h -commandtopclx.o: ../cups/ipp-private.h ../cups/ipp.h -commandtopclx.o: ../cups/language-private.h ../cups/transcode.h -commandtopclx.o: ../cups/thread-private.h driver.h ../cups/raster.h -commandtopclx.o: ../cups/ppd.h ../data/pcl.h -rastertoescpx.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -rastertoescpx.o: ../cups/ipp.h ../cups/http.h ../cups/array.h -rastertoescpx.o: ../cups/language.h ../cups/raster.h ../cups/cups.h -rastertoescpx.o: ../cups/ppd.h ../cups/language-private.h ../cups/transcode.h -rastertoescpx.o: ../cups/string-private.h ../config.h ../data/escp.h -rastertopclx.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -rastertopclx.o: ../cups/ipp.h ../cups/http.h ../cups/array.h -rastertopclx.o: ../cups/language.h ../cups/raster.h ../cups/cups.h -rastertopclx.o: ../cups/ppd.h ../cups/language-private.h ../cups/transcode.h -rastertopclx.o: ../cups/string-private.h ../config.h pcl-common.h -rastertopclx.o: ../data/pcl.h -pcl-common.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -pcl-common.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -pcl-common.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h pcl-common.h -pcl-common.o: ../cups/string-private.h ../config.h ../data/pcl.h -testcmyk.o: ../cups/string-private.h ../config.h driver.h ../cups/cups.h -testcmyk.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -testcmyk.o: ../cups/array.h ../cups/language.h ../cups/raster.h -testcmyk.o: ../cups/cups.h ../cups/ppd.h -testdither.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -testdither.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -testdither.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h -testdither.o: ../cups/string-private.h ../config.h -testrgb.o: ../cups/string-private.h ../config.h driver.h ../cups/cups.h -testrgb.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -testrgb.o: ../cups/array.h ../cups/language.h ../cups/raster.h ../cups/cups.h -testrgb.o: ../cups/ppd.h -attr.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -attr.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -attr.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h -attr.o: ../cups/string-private.h ../config.h -check.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -check.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -check.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h -cmyk.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -cmyk.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -cmyk.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h -cmyk.o: ../cups/string-private.h ../config.h -dither.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -dither.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -dither.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h ../config.h -lut.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -lut.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -lut.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h -pack.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -pack.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -pack.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h -rgb.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -rgb.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -rgb.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h -srgb.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -srgb.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -srgb.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h diff --git a/driver/Makefile b/driver/Makefile deleted file mode 100644 index 21fdfe29c..000000000 --- a/driver/Makefile +++ /dev/null @@ -1,382 +0,0 @@ -# -# "$Id$" -# -# Makefile for the CUPS base drivers. -# -# Copyright 2007-2010 by Apple Inc. -# Copyright 2002-2005 by Easy Software Products. -# -# These coded instructions, statements, and computer programs are the -# property of Apple Inc. and are protected by Federal copyright -# law. Distribution and use rights are outlined in the file "LICENSE.txt" -# which should have been included with this file. If this file is -# file is missing or damaged, see the license at "http://www.cups.org/". -# - -# -# Include standard definitions... -# - -include ../Makedefs - - -# -# Object files... -# - -LIBOBJS = \ - attr.o \ - check.o \ - cmyk.o \ - dither.o \ - lut.o \ - pack.o \ - rgb.o \ - srgb.o -OBJS = \ - commandtoescpx.o \ - commandtopclx.o \ - rastertoescpx.o \ - rastertopclx.o \ - pcl-common.o \ - testcmyk.o \ - testdither.o \ - testrgb.o \ - $(LIBOBJS) - -LIBTARGETS = \ - $(LIBCUPSDRIVER) \ - libcupsdriver.a -UNITTARGETS = \ - testcmyk \ - testdither \ - testrgb -FILTERS = \ - commandtoescpx \ - commandtopclx \ - rastertoescpx \ - rastertopclx -TARGETS = \ - $(LIBTARGETS) \ - $(FILTERS) - - -# -# Make everything... -# - -all: $(TARGETS) - - -# -# Make library targets... -# - -libs: $(LIBTARGETS) - - -# -# Make unit tests... -# - -unittests: $(UNITTARGETS) - - -# -# Clean everything... -# - -clean: - $(RM) $(OBJS) core - $(RM) *.bck core.* - $(RM) $(TARGETS) $(UNITTARGETS) - $(RM) -r test - $(RM) libcupsdriver.so libcupsdriver.sl libcupsdriver.dylib - - -# -# Update dependencies... -# - -depend: - makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1 - - -# -# Install all targets... -# - -install: all install-data install-headers install-libs install-exec - - -# -# Install data files... -# - -install-data: - - -# -# Install programs... -# - -install-exec: - $(INSTALL_DIR) $(SERVERBIN)/filter - for file in $(FILTERS); do \ - $(INSTALL_BIN) $$file $(SERVERBIN)/filter; \ - done - if test "x$(SYMROOT)" != "x"; then \ - $(INSTALL_DIR) $(SYMROOT); \ - for file in $(FILTERS); do \ - cp $$file $(SYMROOT); \ - done \ - fi - - -# -# Install headers... -# - -install-headers: - echo Installing header files in $(INCLUDEDIR)/cups... - $(INSTALL_DIR) -m 755 $(INCLUDEDIR)/cups - $(INSTALL_DATA) driver.h $(INCLUDEDIR)/cups - - -# -# Install libraries... -# - -install-libs: $(INSTALLSTATIC) - echo Installing libraries in $(LIBDIR)... - $(INSTALL_DIR) -m 755 $(LIBDIR) - $(INSTALL_LIB) $(LIBCUPSDRIVER) $(LIBDIR) - if test $(LIBCUPSDRIVER) = "libcupsdriver.so.1" -o $(LIBCUPSDRIVER) = "libcupsdriver.sl.1"; then \ - $(RM) $(LIBDIR)/`basename $(LIBCUPSDRIVER) .1`; \ - $(LN) $(LIBCUPSDRIVER) $(LIBDIR)/`basename $(LIBCUPSDRIVER) .1`; \ - fi - if test $(LIBCUPSDRIVER) = "libcupsdriver.1.dylib"; then \ - $(RM) $(LIBDIR)/libcupsdriver.dylib; \ - $(LN) $(LIBCUPSDRIVER) $(LIBDIR)/libcupsdriver.dylib; \ - fi - if test "x$(SYMROOT)" != "x"; then \ - $(INSTALL_DIR) $(SYMROOT); \ - cp $(LIBCUPSDRIVER) $(SYMROOT); \ - fi - -installstatic: - $(INSTALL_DIR) -m 755 $(LIBDIR) - $(INSTALL_LIB) -m 755 libcupsdriver.a $(LIBDIR) - $(RANLIB) $(LIBDIR)/libcupsdriver.a - $(CHMOD) 555 $(LIBDIR)/libcupsdriver.a - - -# -# Uninstall... -# - -uninstall: - for file in commandtoescpx commandtopclx rastertoescpx rastertopclx; do \ - $(RM) $(SERVERBIN)/filter/$$file; \ - done - $(RM) $(LIBDIR)/libcupsdriver.1.dylib - $(RM) $(LIBDIR)/libcupsdriver.a - $(RM) $(LIBDIR)/libcupsdriver.dylib - $(RM) $(LIBDIR)/libcupsdriver_s.a - $(RM) $(LIBDIR)/libcupsdriver.sl - $(RM) $(LIBDIR)/libcupsdriver.sl.1 - $(RM) $(LIBDIR)/libcupsdriver.so - $(RM) $(LIBDIR)/libcupsdriver.so.1 - -$(RMDIR) $(LIBDIR) - $(RM) $(INCLUDEDIR)/cups/driver.h - -$(RMDIR) $(INCLUDEDIR)/cups - - -# -# Automatic API help files... -# - -apihelp: - mxmldoc --section "Programming" \ - --title "Printer Driver API" \ - --css ../doc/cups-printable.css \ - --header api-driver.header --intro api-driver.shtml \ - api-driver.xml \ - driver.h $(LIBOBJS:.o=.c) >../doc/help/api-driver.html - mxmldoc --tokens help/api-driver.html >../doc/help/api-driver.tokens - $(RM) api-driver.xml - -framedhelp: - mxmldoc --framed api-driver \ - --section "Programming" \ - --title "Printer Driver API" \ - --css ../doc/cups-printable.css \ - --header api-driver.header --intro api-driver.shtml \ - driver.h $(LIBOBJS:.o=.c) - - -# -# commandtopclx, the PCL command printer driver. -# - -commandtopclx: commandtopclx.o $(LIBCUPSDRIVER) ../cups/$(LIBCUPS) - echo Linking $@... - $(CC) $(LDFLAGS) -o $@ commandtopclx.o -L. -lcupsdriver $(LIBS) - - -# -# commandtoescpx, the ESC/P command printer driver. -# - -commandtoescpx: commandtoescpx.o $(LIBCUPSDRIVER) ../cups/$(LIBCUPS) - echo Linking $@... - $(CC) $(LDFLAGS) -o $@ commandtoescpx.o -L. -lcupsdriver $(LIBS) - - -# -# rastertoescpx, the ESC/P raster printer driver. -# - -rastertoescpx: rastertoescpx.o $(LIBCUPSDRIVER) ../cups/$(LIBCUPS) - echo Linking $@... - $(CC) $(LDFLAGS) -o $@ rastertoescpx.o -L. -lcupsdriver \ - $(LINKCUPSIMAGE) $(LIBS) - - -# -# rastertopclx, the ESC/P raster printer driver. -# - -rastertopclx: rastertopclx.o pcl-common.o $(LIBCUPSDRIVER) \ - ../cups/$(LIBCUPS) - echo Linking $@... - $(CC) $(LDFLAGS) -o $@ rastertopclx.o pcl-common.o -L. -lcupsdriver \ - $(LINKCUPSIMAGE) $(LIBS) - - -# -# test, make a common test subdirectory for the other test programs. -# - -test: - if test ! -d test; then \ - rm -rf test; \ - mkdir test; \ - fi - - -# -# testcmyk, test cmyk separation functions. -# - -testcmyk: test testcmyk.o libcupsdriver.a ../cups/$(LIBCUPSSTATIC) - echo Linking $@... - $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testcmyk.o libcupsdriver.a \ - ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ - $(COMMONLIBS) $(LIBZ) - echo Running CMYK API tests... - ./testcmyk > test/testcmyk.log - - -# -# testdither, test dithering functions. -# - -testdither: test testdither.o libcupsdriver.a ../cups/$(LIBCUPSSTATIC) - echo Linking $@... - $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testdither.o libcupsdriver.a \ - ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ - $(COMMONLIBS) $(LIBZ) - echo Running dither API tests... - ./testdither > test/0-255.pgm 2>test/0-255.log - ./testdither 0 127 255 > test/0-127-255.pgm 2>test/0-127-255.log - ./testdither 0 85 170 255 > test/0-85-170-255.pgm 2>test/0-85-170-255.log - ./testdither 0 63 127 170 198 227 255 > test/0-63-127-170-198-227-255.pgm 2>test/0-63-127-170-198-227-255.log - ./testdither 0 210 383 > test/0-210-383.pgm 2>test/0-210-383.log - ./testdither 0 82 255 > test/0-82-255.pgm 2>test/0-82-255.log - ./testdither 0 510 > test/0-510.pgm 2>test/0-510.log - ./testdither 0 1020 > test/0-1020.pgm 2>test/0-1020.log - - -# -# testrgb, test RGB separation functions. -# - -testrgb: test testrgb.o libcupsdriver.a ../cups/$(LIBCUPSSTATIC) - echo Linking $@... - $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testrgb.o libcupsdriver.a \ - ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ - $(COMMONLIBS) $(LIBZ) - echo Running RGB API tests... - ./testrgb > test/testrgb.log 2>&1 || echo "RGB tests failed!" - - -# -# libcupsdriver.so.1, libcupsdriver.sl.1 -# - -libcupsdriver.so.1 libcupsdriver.sl.1: $(LIBOBJS) - echo Linking $@... - $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBS) - $(RM) `basename $@ .1` - $(LN) $@ `basename $@ .1` - - -# -# libcupsdriver.1.dylib -# - -libcupsdriver.1.dylib: $(LIBOBJS) libcupsdriver.exp - echo Linking $@... - $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ \ - -install_name $(libdir)/$@ \ - -current_version 1.0.0 \ - -compatibility_version 1.0.0 \ - -exported_symbols_list libcupsdriver.exp \ - $(LIBOBJS) $(LIBS) - $(RM) libcupsdriver.dylib - $(LN) $@ libcupsdriver.dylib - - -# -# libcupsdriver_s.a -# - -libcupsdriver_s.a: $(LIBOBJS) - echo Creating $@... - $(DSO) $(DSOFLAGS) -o libcupsdriver_s.o $(LIBOBJS) $(LIBS) - $(RM) $@ - $(AR) $(ARFLAGS) $@ libcupsdriver_s.o - - -# -# libcupsdriver.la -# - -libcupsdriver.la: $(LIBOBJS) - echo Linking $@... - $(CC) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) -rpath $(LIBDIR) \ - -version-info 1:0 $(LIBS) - - -# -# libcupsdriver.a -# - -libcupsdriver.a: $(LIBOBJS) - echo Archiving $@... - $(RM) $@ - $(AR) $(ARFLAGS) $@ $(LIBOBJS) - $(RANLIB) $@ - - -# -# Include dependencies... -# - -include Dependencies - - -# -# End of "$Id$". -# diff --git a/driver/api-driver.header b/driver/api-driver.header deleted file mode 100644 index 0f3937bc1..000000000 --- a/driver/api-driver.header +++ /dev/null @@ -1,34 +0,0 @@ - - -

Driver API

- -
- - - - - - - - - - - - - - - - -
Headercups/driver.h
Library-lcupsdriver
See AlsoProgramming: Introduction to CUPS Programming
diff --git a/driver/api-driver.shtml b/driver/api-driver.shtml deleted file mode 100644 index 0e8bcff27..000000000 --- a/driver/api-driver.shtml +++ /dev/null @@ -1,18 +0,0 @@ - - -

Overview

- -

The driver API provides common dithering, color conversion, and utility -functions for CUPS drivers.

diff --git a/driver/attr.c b/driver/attr.c deleted file mode 100644 index 4eba32417..000000000 --- a/driver/attr.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * "$Id$" - * - * PPD attribute lookup routine for CUPS. - * - * Copyright 2007-2010 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * cupsFindAttr() - Find a PPD attribute based on the colormodel, - * media, and resolution. - */ - -/* - * Include necessary headers. - */ - -#include "driver.h" -#include - - -/* - * 'cupsFindAttr()' - Find a PPD attribute based on the colormodel, - * media, and resolution. - */ - -ppd_attr_t * /* O - Matching attribute or NULL */ -cupsFindAttr(ppd_file_t *ppd, /* I - PPD file */ - const char *name, /* I - Attribute name */ - const char *colormodel, /* I - Color model */ - const char *media, /* I - Media type */ - const char *resolution, /* I - Resolution */ - char *spec, /* O - Final selection string */ - int specsize) /* I - Size of string buffer */ -{ - ppd_attr_t *attr; /* Attribute */ - - - /* - * Range check input... - */ - - if (!ppd || !name || !colormodel || !media || !resolution || !spec || - specsize < PPD_MAX_NAME) - return (NULL); - - /* - * Look for the attribute with the following keywords: - * - * ColorModel.MediaType.Resolution - * ColorModel.Resolution - * ColorModel - * MediaType.Resolution - * MediaType - * Resolution - * "" - */ - - snprintf(spec, specsize, "%s.%s.%s", colormodel, media, resolution); - fprintf(stderr, "DEBUG2: Looking for \"*%s %s\"...\n", name, spec); - if ((attr = ppdFindAttr(ppd, name, spec)) != NULL && attr->value != NULL) - return (attr); - - snprintf(spec, specsize, "%s.%s", colormodel, resolution); - fprintf(stderr, "DEBUG2: Looking for \"*%s %s\"...\n", name, spec); - if ((attr = ppdFindAttr(ppd, name, spec)) != NULL && attr->value != NULL) - return (attr); - - strlcpy(spec, colormodel, specsize); - fprintf(stderr, "DEBUG2: Looking for \"*%s %s\"...\n", name, spec); - if ((attr = ppdFindAttr(ppd, name, spec)) != NULL && attr->value != NULL) - return (attr); - - snprintf(spec, specsize, "%s.%s", media, resolution); - fprintf(stderr, "DEBUG2: Looking for \"*%s %s\"...\n", name, spec); - if ((attr = ppdFindAttr(ppd, name, spec)) != NULL && attr->value != NULL) - return (attr); - - strlcpy(spec, media, specsize); - fprintf(stderr, "DEBUG2: Looking for \"*%s %s\"...\n", name, spec); - if ((attr = ppdFindAttr(ppd, name, spec)) != NULL && attr->value != NULL) - return (attr); - - strlcpy(spec, resolution, specsize); - fprintf(stderr, "DEBUG2: Looking for \"*%s %s\"...\n", name, spec); - if ((attr = ppdFindAttr(ppd, name, spec)) != NULL && attr->value != NULL) - return (attr); - - spec[0] = '\0'; - fprintf(stderr, "DEBUG2: Looking for \"*%s\"...\n", name); - if ((attr = ppdFindAttr(ppd, name, spec)) != NULL && attr->value != NULL) - return (attr); - - fprintf(stderr, "DEBUG2: No instance of \"*%s\" found...\n", name); - - return (NULL); -} - - -/* - * End of "$Id$". - */ diff --git a/driver/check.c b/driver/check.c deleted file mode 100644 index d7ceb3d44..000000000 --- a/driver/check.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * "$Id$" - * - * Byte checking routines for CUPS. - * - * Copyright 2007 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * cupsCheckBytes() - Check to see if all bytes are zero. - * cupsCheckValue() - Check to see if all bytes match the given value. - */ - -/* - * Include necessary headers. - */ - -#include "driver.h" - - -/* - * 'cupsCheckBytes()' - Check to see if all bytes are zero. - */ - -int /* O - 1 if they match */ -cupsCheckBytes(const unsigned char *bytes, /* I - Bytes to check */ - int length) /* I - Number of bytes to check */ -{ - while (length > 7) - { - if (*bytes++) - return (0); - if (*bytes++) - return (0); - if (*bytes++) - return (0); - if (*bytes++) - return (0); - if (*bytes++) - return (0); - if (*bytes++) - return (0); - if (*bytes++) - return (0); - if (*bytes++) - return (0); - - length -= 8; - } - - while (length > 0) - if (*bytes++) - return (0); - else - length --; - - return (1); -} - - -/* - * 'cupsCheckValue()' - Check to see if all bytes match the given value. - */ - -int /* O - 1 if they match */ -cupsCheckValue(const unsigned char *bytes, /* I - Bytes to check */ - int length, /* I - Number of bytes to check */ - const unsigned char value) /* I - Value to check */ -{ - while (length > 7) - { - if (*bytes++ != value) - return (0); - if (*bytes++ != value) - return (0); - if (*bytes++ != value) - return (0); - if (*bytes++ != value) - return (0); - if (*bytes++ != value) - return (0); - if (*bytes++ != value) - return (0); - if (*bytes++ != value) - return (0); - if (*bytes++ != value) - return (0); - - length -= 8; - } - - while (length > 0) - if (*bytes++ != value) - return (0); - else - length --; - - return (1); -} - - -/* - * End of "$Id$". - */ diff --git a/driver/cmyk.c b/driver/cmyk.c deleted file mode 100644 index c6c350c24..000000000 --- a/driver/cmyk.c +++ /dev/null @@ -1,1955 +0,0 @@ -/* - * "$Id$" - * - * CMYK color separation code for CUPS. - * - * Copyright 2007-2010 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * cupsCMYKDelete() - Delete a color separation. - * cupsCMYKDoBlack() - Do a black separation... - * cupsCMYKDoCMYK() - Do a CMYK separation... - * cupsCMYKDoGray() - Do a grayscale separation... - * cupsCMYKDoRGB() - Do an sRGB separation... - * cupsCMYKLoad() - Load a CMYK color profile from PPD attributes. - * cupsCMYKNew() - Create a new CMYK color separation. - * cupsCMYKSetBlack() - Set the transition range for CMY to black. - * cupsCMYKSetCurve() - Set a color transform curve using points. - * cupsCMYKSetGamma() - Set a color transform curve using gamma and - * density. - * cupsCMYKSetInkLimit() - Set the limit on the amount of ink. - * cupsCMYKSetLtDk() - Set light/dark ink transforms. - */ - -/* - * Include necessary headers. - */ - -#include "driver.h" -#include - - -/* - * 'cupsCMYKDelete()' - Delete a color separation. - */ - -void -cupsCMYKDelete(cups_cmyk_t *cmyk) /* I - Color separation */ -{ - /* - * Range check input... - */ - - if (cmyk == NULL) - return; - - /* - * Free memory used... - */ - - free(cmyk->channels[0]); - free(cmyk); -} - - -/* - * 'cupsCMYKDoBlack()' - Do a black separation... - */ - -void -cupsCMYKDoBlack(const cups_cmyk_t *cmyk, - /* I - Color separation */ - const unsigned char *input, - /* I - Input grayscale pixels */ - short *output, - /* O - Output Device-N pixels */ - int num_pixels) - /* I - Number of pixels */ -{ - int k; /* Current black value */ - const short **channels; /* Copy of channel LUTs */ - int ink, /* Amount of ink */ - ink_limit; /* Ink limit from separation */ - - - /* - * Range check input... - */ - - if (cmyk == NULL || input == NULL || output == NULL || num_pixels <= 0) - return; - - /* - * Loop through it all... - */ - - channels = (const short **)cmyk->channels; - ink_limit = cmyk->ink_limit; - - switch (cmyk->num_channels) - { - case 1 : /* Black */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - k = *input++; - *output++ = channels[0][k]; - - num_pixels --; - } - break; - - case 2 : /* Black, light black */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - k = *input++; - output[0] = channels[0][k]; - output[1] = channels[1][k]; - - if (ink_limit) - { - ink = output[0] + output[1]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - } - } - - output += 2; - num_pixels --; - } - break; - - case 3 : /* CMY */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - k = *input++; - output[0] = channels[0][k]; - output[1] = channels[1][k]; - output[2] = channels[2][k]; - - if (ink_limit) - { - ink = output[0] + output[1] + output[2]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - output[2] = ink_limit * output[2] / ink; - } - } - - output += 3; - num_pixels --; - } - break; - - case 4 : /* CMYK */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - k = *input++; - *output++ = 0; - *output++ = 0; - *output++ = 0; - *output++ = channels[3][k]; - - num_pixels --; - } - break; - - case 6 : /* CcMmYK */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - k = *input++; - *output++ = 0; - *output++ = 0; - *output++ = 0; - *output++ = 0; - *output++ = 0; - *output++ = channels[5][k]; - - num_pixels --; - } - break; - - case 7 : /* CcMmYKk */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - k = *input++; - output[0] = 0; - output[1] = 0; - output[2] = 0; - output[3] = 0; - output[4] = 0; - output[5] = channels[5][k]; - output[6] = channels[6][k]; - - if (ink_limit) - { - ink = output[5] + output[6]; - - if (ink > ink_limit) - { - output[5] = ink_limit * output[5] / ink; - output[6] = ink_limit * output[6] / ink; - } - } - - output += 7; - num_pixels --; - } - break; - } -} - - -/* - * 'cupsCMYKDoCMYK()' - Do a CMYK separation... - */ - -void -cupsCMYKDoCMYK(const cups_cmyk_t *cmyk, - /* I - Color separation */ - const unsigned char *input, - /* I - Input grayscale pixels */ - short *output, - /* O - Output Device-N pixels */ - int num_pixels) - /* I - Number of pixels */ -{ - int c, /* Current cyan value */ - m, /* Current magenta value */ - y, /* Current yellow value */ - k; /* Current black value */ - const short **channels; /* Copy of channel LUTs */ - int ink, /* Amount of ink */ - ink_limit; /* Ink limit from separation */ - - - /* - * Range check input... - */ - - if (cmyk == NULL || input == NULL || output == NULL || num_pixels <= 0) - return; - - /* - * Loop through it all... - */ - - channels = (const short **)cmyk->channels; - ink_limit = cmyk->ink_limit; - - switch (cmyk->num_channels) - { - case 1 : /* Black */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - c = *input++; - m = *input++; - y = *input++; - k = *input++ + (c * 31 + m * 61 + y * 8) / 100; - - if (k < 255) - *output++ = channels[0][k]; - else - *output++ = channels[0][255]; - - num_pixels --; - } - break; - - case 2 : /* Black, light black */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - c = *input++; - m = *input++; - y = *input++; - k = *input++ + (c * 31 + m * 61 + y * 8) / 100; - - if (k < 255) - { - output[0] = channels[0][k]; - output[1] = channels[1][k]; - } - else - { - output[0] = channels[0][255]; - output[1] = channels[1][255]; - } - - if (ink_limit) - { - ink = output[0] + output[1]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - } - } - - output += 2; - num_pixels --; - } - break; - - case 3 : /* CMY */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - c = *input++; - m = *input++; - y = *input++; - k = *input++; - c += k; - m += k; - y += k; - - if (c < 255) - output[0] = channels[0][c]; - else - output[0] = channels[0][255]; - - if (m < 255) - output[1] = channels[1][m]; - else - output[1] = channels[1][255]; - - if (y < 255) - output[2] = channels[2][y]; - else - output[2] = channels[2][255]; - - if (ink_limit) - { - ink = output[0] + output[1] + output[2]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - output[2] = ink_limit * output[2] / ink; - } - } - - output += 3; - num_pixels --; - } - break; - - case 4 : /* CMYK */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - c = *input++; - m = *input++; - y = *input++; - k = *input++; - - output[0] = channels[0][c]; - output[1] = channels[1][m]; - output[2] = channels[2][y]; - output[3] = channels[3][k]; - - if (ink_limit) - { - ink = output[0] + output[1] + output[2] + output[3]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - output[2] = ink_limit * output[2] / ink; - output[3] = ink_limit * output[3] / ink; - } - } - - output += 4; - num_pixels --; - } - break; - - case 6 : /* CcMmYK */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - c = *input++; - m = *input++; - y = *input++; - k = *input++; - - output[0] = channels[0][c]; - output[1] = channels[1][c]; - output[2] = channels[2][m]; - output[3] = channels[3][m]; - output[4] = channels[4][y]; - output[5] = channels[5][k]; - - if (ink_limit) - { - ink = output[0] + output[1] + output[2] + output[3] + - output[4] + output[5]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - output[2] = ink_limit * output[2] / ink; - output[3] = ink_limit * output[3] / ink; - output[4] = ink_limit * output[4] / ink; - output[5] = ink_limit * output[5] / ink; - } - } - - output += 6; - num_pixels --; - } - break; - - case 7 : /* CcMmYKk */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - c = *input++; - m = *input++; - y = *input++; - k = *input++; - - output[0] = channels[0][c]; - output[1] = channels[1][c]; - output[2] = channels[2][m]; - output[3] = channels[3][m]; - output[4] = channels[4][y]; - output[5] = channels[5][k]; - output[6] = channels[6][k]; - - if (ink_limit) - { - ink = output[0] + output[1] + output[2] + output[3] + - output[4] + output[5] + output[6]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - output[2] = ink_limit * output[2] / ink; - output[3] = ink_limit * output[3] / ink; - output[4] = ink_limit * output[4] / ink; - output[5] = ink_limit * output[5] / ink; - output[6] = ink_limit * output[6] / ink; - } - } - - output += 7; - num_pixels --; - } - break; - } -} - - -/* - * 'cupsCMYKDoGray()' - Do a grayscale separation... - */ - -void -cupsCMYKDoGray(const cups_cmyk_t *cmyk, - /* I - Color separation */ - const unsigned char *input, - /* I - Input grayscale pixels */ - short *output, - /* O - Output Device-N pixels */ - int num_pixels) - /* I - Number of pixels */ -{ - int k, /* Current black value */ - kc; /* Current black color value */ - const short **channels; /* Copy of channel LUTs */ - int ink, /* Amount of ink */ - ink_limit; /* Ink limit from separation */ - - - /* - * Range check input... - */ - - if (cmyk == NULL || input == NULL || output == NULL || num_pixels <= 0) - return; - - /* - * Loop through it all... - */ - - channels = (const short **)cmyk->channels; - ink_limit = cmyk->ink_limit; - - switch (cmyk->num_channels) - { - case 1 : /* Black */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - k = cups_scmy_lut[*input++]; - *output++ = channels[0][k]; - - num_pixels --; - } - break; - - case 2 : /* Black, light black */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - k = cups_scmy_lut[*input++]; - output[0] = channels[0][k]; - output[1] = channels[1][k]; - - if (ink_limit) - { - ink = output[0] + output[1]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - } - } - - output += 2; - num_pixels --; - } - break; - - case 3 : /* CMY */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - k = cups_scmy_lut[*input++]; - output[0] = channels[0][k]; - output[1] = channels[1][k]; - output[2] = channels[2][k]; - - if (ink_limit) - { - ink = output[0] + output[1] + output[2]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - output[2] = ink_limit * output[2] / ink; - } - } - - output += 3; - num_pixels --; - } - break; - - case 4 : /* CMYK */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - k = cups_scmy_lut[*input++]; - kc = cmyk->color_lut[k]; - k = cmyk->black_lut[k]; - output[0] = channels[0][kc]; - output[1] = channels[1][kc]; - output[2] = channels[2][kc]; - output[3] = channels[3][k]; - - if (ink_limit) - { - ink = output[0] + output[1] + output[2] + output[3]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - output[2] = ink_limit * output[2] / ink; - output[3] = ink_limit * output[3] / ink; - } - } - - output += 4; - num_pixels --; - } - break; - - case 6 : /* CcMmYK */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - k = cups_scmy_lut[*input++]; - kc = cmyk->color_lut[k]; - k = cmyk->black_lut[k]; - output[0] = channels[0][kc]; - output[1] = channels[1][kc]; - output[2] = channels[2][kc]; - output[3] = channels[3][kc]; - output[4] = channels[4][kc]; - output[5] = channels[5][k]; - - if (ink_limit) - { - ink = output[0] + output[1] + output[2] + output[3] + - output[4] + output[5]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - output[2] = ink_limit * output[2] / ink; - output[3] = ink_limit * output[3] / ink; - output[4] = ink_limit * output[4] / ink; - output[5] = ink_limit * output[5] / ink; - } - } - - output += 6; - num_pixels --; - } - break; - - case 7 : /* CcMmYKk */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - k = cups_scmy_lut[*input++]; - kc = cmyk->color_lut[k]; - k = cmyk->black_lut[k]; - output[0] = channels[0][kc]; - output[1] = channels[1][kc]; - output[2] = channels[2][kc]; - output[3] = channels[3][kc]; - output[4] = channels[4][kc]; - output[5] = channels[5][k]; - output[6] = channels[6][k]; - - if (ink_limit) - { - ink = output[0] + output[1] + output[2] + output[3] + - output[4] + output[5] + output[6]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - output[2] = ink_limit * output[2] / ink; - output[3] = ink_limit * output[3] / ink; - output[4] = ink_limit * output[4] / ink; - output[5] = ink_limit * output[5] / ink; - output[6] = ink_limit * output[6] / ink; - } - } - - output += 7; - num_pixels --; - } - break; - } -} - - -/* - * 'cupsCMYKDoRGB()' - Do an sRGB separation... - */ - -void -cupsCMYKDoRGB(const cups_cmyk_t *cmyk, - /* I - Color separation */ - const unsigned char *input, - /* I - Input grayscale pixels */ - short *output, - /* O - Output Device-N pixels */ - int num_pixels) - /* I - Number of pixels */ -{ - int c, /* Current cyan value */ - m, /* Current magenta value */ - y, /* Current yellow value */ - k, /* Current black value */ - kc, /* Current black color value */ - km; /* Maximum black value */ - const short **channels; /* Copy of channel LUTs */ - int ink, /* Amount of ink */ - ink_limit; /* Ink limit from separation */ - - - /* - * Range check input... - */ - - if (cmyk == NULL || input == NULL || output == NULL || num_pixels <= 0) - return; - - /* - * Loop through it all... - */ - - channels = (const short **)cmyk->channels; - ink_limit = cmyk->ink_limit; - - switch (cmyk->num_channels) - { - case 1 : /* Black */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - c = cups_scmy_lut[*input++]; - m = cups_scmy_lut[*input++]; - y = cups_scmy_lut[*input++]; - k = (c * 31 + m * 61 + y * 8) / 100; - - *output++ = channels[0][k]; - - num_pixels --; - } - break; - - case 2 : /* Black, light black */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - c = cups_scmy_lut[*input++]; - m = cups_scmy_lut[*input++]; - y = cups_scmy_lut[*input++]; - k = (c * 31 + m * 61 + y * 8) / 100; - - output[0] = channels[0][k]; - output[1] = channels[1][k]; - - if (ink_limit) - { - ink = output[0] + output[1]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - } - } - - output += 2; - num_pixels --; - } - break; - - case 3 : /* CMY */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - c = cups_scmy_lut[*input++]; - m = cups_scmy_lut[*input++]; - y = cups_scmy_lut[*input++]; - - output[0] = channels[0][c]; - output[1] = channels[1][m]; - output[2] = channels[2][y]; - - if (ink_limit) - { - ink = output[0] + output[1] + output[2]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - output[2] = ink_limit * output[2] / ink; - } - } - - output += 3; - num_pixels --; - } - break; - - case 4 : /* CMYK */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - c = cups_scmy_lut[*input++]; - m = cups_scmy_lut[*input++]; - y = cups_scmy_lut[*input++]; - k = min(c, min(m, y)); - - if ((km = max(c, max(m, y))) > k) - k = k * k * k / (km * km); - - kc = cmyk->color_lut[k] - k; - k = cmyk->black_lut[k]; - c += kc; - m += kc; - y += kc; - - output[0] = channels[0][c]; - output[1] = channels[1][m]; - output[2] = channels[2][y]; - output[3] = channels[3][k]; - - if (ink_limit) - { - ink = output[0] + output[1] + output[2] + output[3]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - output[2] = ink_limit * output[2] / ink; - output[3] = ink_limit * output[3] / ink; - } - } - - output += 4; - num_pixels --; - } - break; - - case 6 : /* CcMmYK */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - c = cups_scmy_lut[*input++]; - m = cups_scmy_lut[*input++]; - y = cups_scmy_lut[*input++]; - k = min(c, min(m, y)); - - if ((km = max(c, max(m, y))) > k) - k = k * k * k / (km * km); - - kc = cmyk->color_lut[k] - k; - k = cmyk->black_lut[k]; - c += kc; - m += kc; - y += kc; - - output[0] = channels[0][c]; - output[1] = channels[1][c]; - output[2] = channels[2][m]; - output[3] = channels[3][m]; - output[4] = channels[4][y]; - output[5] = channels[5][k]; - - if (ink_limit) - { - ink = output[0] + output[1] + output[2] + output[3] + - output[4] + output[5]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - output[2] = ink_limit * output[2] / ink; - output[3] = ink_limit * output[3] / ink; - output[4] = ink_limit * output[4] / ink; - output[5] = ink_limit * output[5] / ink; - } - } - - output += 6; - num_pixels --; - } - break; - - case 7 : /* CcMmYKk */ - while (num_pixels > 0) - { - /* - * Get the input black value and then set the corresponding color - * channel values... - */ - - c = cups_scmy_lut[*input++]; - m = cups_scmy_lut[*input++]; - y = cups_scmy_lut[*input++]; - k = min(c, min(m, y)); - - if ((km = max(c, max(m, y))) > k) - k = k * k * k / (km * km); - - kc = cmyk->color_lut[k] - k; - k = cmyk->black_lut[k]; - c += kc; - m += kc; - y += kc; - - output[0] = channels[0][c]; - output[1] = channels[1][c]; - output[2] = channels[2][m]; - output[3] = channels[3][m]; - output[4] = channels[4][y]; - output[5] = channels[5][k]; - output[6] = channels[6][k]; - - if (ink_limit) - { - ink = output[0] + output[1] + output[2] + output[3] + - output[4] + output[5] + output[6]; - - if (ink > ink_limit) - { - output[0] = ink_limit * output[0] / ink; - output[1] = ink_limit * output[1] / ink; - output[2] = ink_limit * output[2] / ink; - output[3] = ink_limit * output[3] / ink; - output[4] = ink_limit * output[4] / ink; - output[5] = ink_limit * output[5] / ink; - output[6] = ink_limit * output[6] / ink; - } - } - - output += 7; - num_pixels --; - } - break; - } -} - - -/* - * 'cupsCMYKLoad()' - Load a CMYK color profile from PPD attributes. - */ - -cups_cmyk_t * /* O - CMYK color separation */ -cupsCMYKLoad(ppd_file_t *ppd, /* I - PPD file */ - const char *colormodel, /* I - ColorModel value */ - const char *media, /* I - MediaType value */ - const char *resolution) /* I - Resolution value */ -{ - cups_cmyk_t *cmyk; /* CMYK color separation */ - char spec[PPD_MAX_NAME]; /* Profile name */ - ppd_attr_t *attr; /* Attribute from PPD file */ - int num_channels; /* Number of color components */ - float gamval, /* Gamma correction value */ - density, /* Density value */ - light, /* Light ink limit */ - dark, /* Light ink cut-off */ - lower, /* Start of black ink */ - upper; /* End of color ink */ - int num_xypoints; /* Number of X,Y points */ - float xypoints[100 * 2], /* X,Y points */ - *xyptr; /* Current X,Y point */ - - - /* - * Range check input... - */ - - if (ppd == NULL || colormodel == NULL || resolution == NULL || media == NULL) - return (NULL); - - /* - * Find the following attributes: - * - * cupsAllGamma - Set default curve using gamma + density - * cupsAllXY - Set default curve using XY points - * cupsBlackGamma - Set black curve using gamma + density - * cupsBlackGeneration - Set black generation - * cupsBlackLightDark - Set black light/dark transition - * cupsBlackXY - Set black curve using XY points - * cupsCyanGamma - Set cyan curve using gamma + density - * cupsCyanLightDark - Set cyan light/dark transition - * cupsCyanXY - Set cyan curve using XY points - * cupsInkChannels - Set number of color channels - * cupsInkLimit - Set total ink limit - * cupsLightBlackGamma - Set light black curve using gamma + density - * cupsLightBlackXY - Set light black curve using XY points - * cupsLightCyanGamma - Set light cyan curve using gamma + density - * cupsLightCyanXY - Set light cyan curve using XY points - * cupsLightMagentaGamma - Set light magenta curve using gamma + density - * cupsLightMagentaXY - Set light magenta curve using XY points - * cupsMagentaGamma - Set magenta curve using gamma + density - * cupsMagentaLightDark - Set magenta light/dark transition - * cupsMagentaXY - Set magenta curve using XY points - * cupsYellowGamma - Set yellow curve using gamma + density - * cupsYellowXY - Set yellow curve using XY points - * - * The only required attribute is cupsInkChannels. - * - * The *XY attributes have precedence over the *Gamma attributes, and - * the *Light* attributes have precedence over the corresponding - * *LightDark* attributes. - */ - - /* - * Get the required cupsInkChannels attribute... - */ - - if ((attr = cupsFindAttr(ppd, "cupsInkChannels", colormodel, media, - resolution, spec, sizeof(spec))) == NULL) - return (NULL); - - num_channels = atoi(attr->value); - - if (num_channels < 1 || num_channels > 7 || num_channels == 5) - return (NULL); - - if ((cmyk = cupsCMYKNew(num_channels)) == NULL) - return (NULL); - - /* - * Get the optional cupsInkLimit attribute... - */ - - if ((attr = cupsFindAttr(ppd, "cupsInkLimit", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - cupsCMYKSetInkLimit(cmyk, atof(attr->value)); - - /* - * Get the optional cupsBlackGeneration attribute... - */ - - if ((attr = cupsFindAttr(ppd, "cupsBlackGeneration", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - if (sscanf(attr->value, "%f%f", &lower, &upper) == 2) - cupsCMYKSetBlack(cmyk, lower, upper); - } - - /* - * Get the optional cupsBlackXY or cupsBlackGamma attributes... - */ - - if (num_channels != 3) - { - if ((attr = cupsFindAttr(ppd, "cupsBlackXY", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - for (num_xypoints = 0, xyptr = xypoints; - attr != NULL && attr->value != NULL && num_xypoints < 100; - attr = ppdFindNextAttr(ppd, "cupsBlackXY", spec)) - if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) - { - num_xypoints ++; - xyptr += 2; - } - - switch (num_channels) - { - case 1 : - case 2 : - cupsCMYKSetCurve(cmyk, 0, num_xypoints, xypoints); - break; - case 4 : - cupsCMYKSetCurve(cmyk, 3, num_xypoints, xypoints); - break; - case 6 : - case 7 : - cupsCMYKSetCurve(cmyk, 5, num_xypoints, xypoints); - break; - } - } - else if ((attr = cupsFindAttr(ppd, "cupsBlackGamma", colormodel, - media, resolution, spec, - sizeof(spec))) != NULL) - { - if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) - switch (num_channels) - { - case 1 : - case 2 : - cupsCMYKSetGamma(cmyk, 0, gamval, density); - break; - case 4 : - cupsCMYKSetGamma(cmyk, 3, gamval, density); - break; - case 6 : - case 7 : - cupsCMYKSetGamma(cmyk, 5, gamval, density); - break; - } - } - else if ((attr = cupsFindAttr(ppd, "cupsAllXY", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - for (num_xypoints = 0, xyptr = xypoints; - attr != NULL && attr->value != NULL && num_xypoints < 100; - attr = ppdFindNextAttr(ppd, "cupsAllXY", spec)) - if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) - { - num_xypoints ++; - xyptr += 2; - } - - switch (num_channels) - { - case 1 : - case 2 : - cupsCMYKSetCurve(cmyk, 0, num_xypoints, xypoints); - break; - case 4 : - cupsCMYKSetCurve(cmyk, 3, num_xypoints, xypoints); - break; - case 6 : - case 7 : - cupsCMYKSetCurve(cmyk, 5, num_xypoints, xypoints); - break; - } - } - else if ((attr = cupsFindAttr(ppd, "cupsAllGamma", colormodel, - media, resolution, spec, - sizeof(spec))) != NULL && - num_channels != 3) - { - if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) - switch (num_channels) - { - case 1 : - case 2 : - cupsCMYKSetGamma(cmyk, 0, gamval, density); - break; - case 4 : - cupsCMYKSetGamma(cmyk, 3, gamval, density); - break; - case 6 : - case 7 : - cupsCMYKSetGamma(cmyk, 5, gamval, density); - break; - } - } - } - - if (num_channels > 2) - { - /* - * Get the optional cupsCyanXY or cupsCyanGamma attributes... - */ - - if ((attr = cupsFindAttr(ppd, "cupsCyanXY", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - for (num_xypoints = 0, xyptr = xypoints; - attr != NULL && attr->value != NULL && num_xypoints < 100; - attr = ppdFindNextAttr(ppd, "cupsCyanXY", spec)) - if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) - { - num_xypoints ++; - xyptr += 2; - } - - cupsCMYKSetCurve(cmyk, 0, num_xypoints, xypoints); - } - else if ((attr = cupsFindAttr(ppd, "cupsCyanGamma", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) - cupsCMYKSetGamma(cmyk, 0, gamval, density); - } - else if ((attr = cupsFindAttr(ppd, "cupsAllXY", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - for (num_xypoints = 0, xyptr = xypoints; - attr != NULL && attr->value != NULL && num_xypoints < 100; - attr = ppdFindNextAttr(ppd, "cupsAllXY", spec)) - if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) - { - num_xypoints ++; - xyptr += 2; - } - - cupsCMYKSetCurve(cmyk, 0, num_xypoints, xypoints); - } - else if ((attr = cupsFindAttr(ppd, "cupsAllGamma", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) - cupsCMYKSetGamma(cmyk, 0, gamval, density); - } - - /* - * Get the optional cupsMagentaXY or cupsMagentaGamma attributes... - */ - - if ((attr = cupsFindAttr(ppd, "cupsMagentaXY", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - for (num_xypoints = 0, xyptr = xypoints; - attr != NULL && attr->value != NULL && num_xypoints < 100; - attr = ppdFindNextAttr(ppd, "cupsMagentaXY", spec)) - if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) - { - num_xypoints ++; - xyptr += 2; - } - - switch (num_channels) - { - case 3 : - case 4 : - cupsCMYKSetCurve(cmyk, 1, num_xypoints, xypoints); - break; - case 6 : - case 7 : - cupsCMYKSetCurve(cmyk, 2, num_xypoints, xypoints); - break; - } - } - else if ((attr = cupsFindAttr(ppd, "cupsMagentaGamma", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) - switch (num_channels) - { - case 3 : - case 4 : - cupsCMYKSetGamma(cmyk, 1, gamval, density); - break; - case 6 : - case 7 : - cupsCMYKSetGamma(cmyk, 2, gamval, density); - break; - } - } - else if ((attr = cupsFindAttr(ppd, "cupsAllXY", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - for (num_xypoints = 0, xyptr = xypoints; - attr != NULL && attr->value != NULL && num_xypoints < 100; - attr = ppdFindNextAttr(ppd, "cupsAllXY", spec)) - if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) - { - num_xypoints ++; - xyptr += 2; - } - - switch (num_channels) - { - case 3 : - case 4 : - cupsCMYKSetCurve(cmyk, 1, num_xypoints, xypoints); - break; - case 6 : - case 7 : - cupsCMYKSetCurve(cmyk, 2, num_xypoints, xypoints); - break; - } - } - else if ((attr = cupsFindAttr(ppd, "cupsAllGamma", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) - switch (num_channels) - { - case 3 : - case 4 : - cupsCMYKSetGamma(cmyk, 1, gamval, density); - break; - case 6 : - case 7 : - cupsCMYKSetGamma(cmyk, 2, gamval, density); - break; - } - } - - /* - * Get the optional cupsYellowXY or cupsYellowGamma attributes... - */ - - if ((attr = cupsFindAttr(ppd, "cupsYellowXY", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - for (num_xypoints = 0, xyptr = xypoints; - attr != NULL && attr->value != NULL && num_xypoints < 100; - attr = ppdFindNextAttr(ppd, "cupsYellowXY", spec)) - if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) - { - num_xypoints ++; - xyptr += 2; - } - - switch (num_channels) - { - case 3 : - case 4 : - cupsCMYKSetCurve(cmyk, 2, num_xypoints, xypoints); - break; - case 6 : - case 7 : - cupsCMYKSetCurve(cmyk, 4, num_xypoints, xypoints); - break; - } - } - else if ((attr = cupsFindAttr(ppd, "cupsYellowGamma", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) - switch (num_channels) - { - case 3 : - case 4 : - cupsCMYKSetGamma(cmyk, 2, gamval, density); - break; - case 6 : - case 7 : - cupsCMYKSetGamma(cmyk, 4, gamval, density); - break; - } - } - else if ((attr = cupsFindAttr(ppd, "cupsAllXY", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - for (num_xypoints = 0, xyptr = xypoints; - attr != NULL && attr->value != NULL && num_xypoints < 100; - attr = ppdFindNextAttr(ppd, "cupsAllXY", spec)) - if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) - { - num_xypoints ++; - xyptr += 2; - } - - switch (num_channels) - { - case 3 : - case 4 : - cupsCMYKSetCurve(cmyk, 2, num_xypoints, xypoints); - break; - case 6 : - case 7 : - cupsCMYKSetCurve(cmyk, 4, num_xypoints, xypoints); - break; - } - } - else if ((attr = cupsFindAttr(ppd, "cupsAllGamma", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) - switch (num_channels) - { - case 3 : - case 4 : - cupsCMYKSetGamma(cmyk, 2, gamval, density); - break; - case 6 : - case 7 : - cupsCMYKSetGamma(cmyk, 4, gamval, density); - break; - } - } - } - - /* - * Get the optional cupsLightBlackXY, cupsLightBlackGamma, or - * cupsBlackLtDk attributes... - */ - - if (num_channels == 2 || num_channels == 7) - { - if ((attr = cupsFindAttr(ppd, "cupsLightBlackXY", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - for (num_xypoints = 0, xyptr = xypoints; - attr != NULL && attr->value != NULL && num_xypoints < 100; - attr = ppdFindNextAttr(ppd, "cupsLightBlackXY", spec)) - if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) - { - num_xypoints ++; - xyptr += 2; - } - - switch (num_channels) - { - case 2 : - cupsCMYKSetCurve(cmyk, 1, num_xypoints, xypoints); - break; - case 7 : - cupsCMYKSetCurve(cmyk, 6, num_xypoints, xypoints); - break; - } - } - else if ((attr = cupsFindAttr(ppd, "cupsLightBlackGamma", colormodel, - media, resolution, spec, - sizeof(spec))) != NULL) - { - if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) - switch (num_channels) - { - case 2 : - cupsCMYKSetGamma(cmyk, 1, gamval, density); - break; - case 7 : - cupsCMYKSetGamma(cmyk, 6, gamval, density); - break; - } - } - else if ((attr = cupsFindAttr(ppd, "cupsBlackLtDk", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - if (sscanf(attr->value, "%f%f", &light, &dark) == 2) - switch (num_channels) - { - case 2 : - cupsCMYKSetLtDk(cmyk, 0, light, dark); - break; - case 7 : - cupsCMYKSetLtDk(cmyk, 5, light, dark); - break; - } - else - fprintf(stderr, "ERROR: Bad cupsBlackLtDk value \"%s\"!\n", - attr->value); - } - else - fprintf(stderr, "WARNING: No light black attribute found for %s!\n", - spec); - } - - if (num_channels >= 6) - { - /* - * Get the optional cupsLightCyanXY, cupsLightCyanGamma, or - * cupsCyanLtDk attributes... - */ - - if ((attr = cupsFindAttr(ppd, "cupsLightCyanXY", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - for (num_xypoints = 0, xyptr = xypoints; - attr != NULL && attr->value != NULL && num_xypoints < 100; - attr = ppdFindNextAttr(ppd, "cupsLightCyanXY", spec)) - if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) - { - num_xypoints ++; - xyptr += 2; - } - - cupsCMYKSetCurve(cmyk, 1, num_xypoints, xypoints); - } - else if ((attr = cupsFindAttr(ppd, "cupsLightCyanGamma", colormodel, - media, resolution, spec, - sizeof(spec))) != NULL) - { - if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) - cupsCMYKSetGamma(cmyk, 1, gamval, density); - } - else if ((attr = cupsFindAttr(ppd, "cupsCyanLtDk", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - if (sscanf(attr->value, "%f%f", &light, &dark) == 2) - cupsCMYKSetLtDk(cmyk, 0, light, dark); - else - fprintf(stderr, "ERROR: Bad cupsCyanLtDk value \"%s\"!\n", - attr->value); - } - else - fprintf(stderr, "WARNING: No light cyan attribute found for %s!\n", - spec); - - /* - * Get the optional cupsLightMagentaXY, cupsLightMagentaGamma, or - * cupsMagentaLtDk attributes... - */ - - if ((attr = cupsFindAttr(ppd, "cupsLightMagentaXY", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - for (num_xypoints = 0, xyptr = xypoints; - attr != NULL && attr->value != NULL && num_xypoints < 100; - attr = ppdFindNextAttr(ppd, "cupsLightMagentaXY", spec)) - if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) - { - num_xypoints ++; - xyptr += 2; - } - - cupsCMYKSetCurve(cmyk, 3, num_xypoints, xypoints); - } - else if ((attr = cupsFindAttr(ppd, "cupsLightMagentaGamma", colormodel, - media, resolution, spec, - sizeof(spec))) != NULL) - { - if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) - cupsCMYKSetGamma(cmyk, 3, gamval, density); - } - else if ((attr = cupsFindAttr(ppd, "cupsMagentaLtDk", colormodel, media, - resolution, spec, sizeof(spec))) != NULL) - { - if (sscanf(attr->value, "%f%f", &light, &dark) == 2) - cupsCMYKSetLtDk(cmyk, 2, light, dark); - else - fprintf(stderr, "ERROR: Bad cupsMagentaLtDk value \"%s\"!\n", - attr->value); - } - else - fprintf(stderr, "WARNING: No light magenta attribute found for %s!\n", - spec); - } - - /* - * Return the new profile... - */ - - return (cmyk); -} - - -/* - * 'cupsCMYKNew()' - Create a new CMYK color separation. - */ - -cups_cmyk_t * /* O - New CMYK separation or NULL */ -cupsCMYKNew(int num_channels) /* I - Number of color components */ -{ - cups_cmyk_t *cmyk; /* New color separation */ - int i; /* Looping var */ - - - /* - * Range-check the input... - */ - - if (num_channels < 1) - return (NULL); - - /* - * Allocate memory for the separation... - */ - - if ((cmyk = calloc(1, sizeof(cups_cmyk_t))) == NULL) - return (NULL); - - /* - * Allocate memory for the LUTs... - */ - - cmyk->num_channels = num_channels; - - if ((cmyk->channels[0] = calloc(num_channels * 256, sizeof(short))) == NULL) - { - free(cmyk); - return (NULL); - } - - for (i = 1; i < num_channels; i ++) - cmyk->channels[i] = cmyk->channels[0] + i * 256; - - /* - * Fill in the LUTs with unity transitions... - */ - - for (i = 0; i < 256; i ++) - cmyk->black_lut[i] = i; - - switch (num_channels) - { - case 1 : /* K */ - case 2 : /* Kk */ - for (i = 0; i < 256; i ++) - { - cmyk->channels[0][i] = CUPS_MAX_LUT * i / 255; - } - break; - case 3 : /* CMY */ - for (i = 0; i < 256; i ++) - { - cmyk->channels[0][i] = CUPS_MAX_LUT * i / 255; - cmyk->channels[1][i] = CUPS_MAX_LUT * i / 255; - cmyk->channels[2][i] = CUPS_MAX_LUT * i / 255; - } - break; - case 4 : /* CMYK */ - for (i = 0; i < 256; i ++) - { - cmyk->channels[0][i] = CUPS_MAX_LUT * i / 255; - cmyk->channels[1][i] = CUPS_MAX_LUT * i / 255; - cmyk->channels[2][i] = CUPS_MAX_LUT * i / 255; - cmyk->channels[3][i] = CUPS_MAX_LUT * i / 255; - } - break; - case 6 : /* CcMmYK */ - case 7 : /* CcMmYKk */ - for (i = 0; i < 256; i ++) - { - cmyk->channels[0][i] = CUPS_MAX_LUT * i / 255; - cmyk->channels[2][i] = CUPS_MAX_LUT * i / 255; - cmyk->channels[4][i] = CUPS_MAX_LUT * i / 255; - cmyk->channels[5][i] = CUPS_MAX_LUT * i / 255; - } - break; - } - - /* - * Return the separation... - */ - - return (cmyk); -} - - -/* - * 'cupsCMYKSetBlack()' - Set the transition range for CMY to black. - */ - -void -cupsCMYKSetBlack(cups_cmyk_t *cmyk, /* I - CMYK color separation */ - float lower, /* I - No black ink */ - float upper) /* I - Only black ink */ -{ - int i, /* Looping var */ - delta, /* Difference between lower and upper */ - ilower, /* Lower level from 0 to 255 */ - iupper; /* Upper level from 0 to 255 */ - - - /* - * Range check input... - */ - - if (cmyk == NULL || lower < 0.0 || lower > 1.0 || upper < 0.0 || upper > 1.0 || - lower > upper) - return; - - /* - * Convert lower and upper to integers from 0 to 255... - */ - - ilower = (int)(255.0 * lower + 0.5); - iupper = (int)(255.0 * upper + 0.5); - delta = iupper - ilower; - - /* - * Generate the CMY-only data... - */ - - for (i = 0; i < ilower; i ++) - { - cmyk->black_lut[i] = 0; - cmyk->color_lut[i] = i; - } - - /* - * Then the transition data... - */ - - for (; i < iupper; i ++) - { - cmyk->black_lut[i] = iupper * (i - ilower) / delta; - cmyk->color_lut[i] = ilower - ilower * (i - ilower) / delta; - } - - /* - * Then the K-only data... - */ - - for (; i < 256; i ++) - { - cmyk->black_lut[i] = i; - cmyk->color_lut[i] = 0; - } - - fprintf(stderr, "DEBUG: cupsCMYKSetBlack(cmyk, lower=%.3f, upper=%.3f)\n", lower, upper); - - for (i = 0; i < 256; i += 17) - fprintf(stderr, "DEBUG: %3d = %3dk + %3dc\n", i, - cmyk->black_lut[i], cmyk->color_lut[i]); -} - - -/* - * 'cupsCMYKSetCurve()' - Set a color transform curve using points. - */ - -void -cupsCMYKSetCurve(cups_cmyk_t *cmyk, /* I - CMYK color separation */ - int channel, /* I - Color channel */ - int num_xypoints, - /* I - Number of X,Y points */ - const float *xypoints) /* I - X,Y points */ -{ - int i; /* Looping var */ - int xstart; /* Start position */ - int xend; /* End position */ - int xdelta; /* Difference in position */ - int ystart; /* Start value */ - int yend; /* End value */ - int ydelta; /* Difference in value */ - - - /* - * Range check input... - */ - - if (cmyk == NULL || channel < 0 || channel >= cmyk->num_channels || - num_xypoints < 1 || xypoints == NULL) - return; - - /* - * Initialize the lookup table for the specified channel... - */ - - for (xstart = xend = 0, ystart = yend = 0; - num_xypoints > 0; - num_xypoints --, xypoints += 2, xstart = xend, ystart = yend) - { - xend = (int)(255.0 * xypoints[1] + 0.5); - yend = (int)(CUPS_MAX_LUT * xypoints[0] + 0.5); - xdelta = xend - xstart; - ydelta = yend - ystart; - - for (i = xstart; i < xend; i ++) - cmyk->channels[channel][i] = ystart + ydelta * (i - xstart) / xdelta; - } - - /* - * Initialize any trailing values to the maximum of the last data point... - */ - - for (i = xend; i < 256; i ++) - cmyk->channels[channel][i] = yend; - - fprintf(stderr, "DEBUG: cupsCMYKSetXY(cmyk, channel=%d, num_xypoints=%d, " - "xypoints=[%.3f %.3f %.3f %.3f ...])\n", channel, - num_xypoints, xypoints[0], xypoints[1], xypoints[2], xypoints[3]); - - for (i = 0; i < 256; i += 17) - fprintf(stderr, "DEBUG: %3d = %4d\n", i, - cmyk->channels[channel + 0][i]); -} - - -/* - * 'cupsCMYKSetGamma()' - Set a color transform curve using gamma and density. - */ - -void -cupsCMYKSetGamma(cups_cmyk_t *cmyk, /* I - CMYK color separation */ - int channel, /* I - Ink channel */ - float gamval, /* I - Gamma correction */ - float density) /* I - Maximum density */ -{ - int i; /* Looping var */ - - - /* - * Range check input... - */ - - if (cmyk == NULL || channel < 0 || channel >= cmyk->num_channels || - gamval <= 0.0 || density <= 0.0 || density > 1.0) - return; - - /* - * Initialize the lookup table for the specified channel... - */ - - for (i = 0; i < 256; i ++) - cmyk->channels[channel][i] = (int)(density * CUPS_MAX_LUT * - pow((float)i / 255.0, gamval) + 0.5); - - fprintf(stderr, "DEBUG: cupsCMYKSetGamma(cmyk, channel=%d, gamval=%.3f, " - "density=%.3f)\n", channel, gamval, density); - - for (i = 0; i < 256; i += 17) - fprintf(stderr, "DEBUG: %3d = %4d\n", i, - cmyk->channels[channel + 0][i]); -} - - -/* - * 'cupsCMYKSetInkLimit()' - Set the limit on the amount of ink. - */ - -void -cupsCMYKSetInkLimit(cups_cmyk_t *cmyk, /* I - CMYK color separation */ - float limit) /* I - Limit of ink */ -{ - if (!cmyk || limit < 0.0) - return; - - cmyk->ink_limit = limit * CUPS_MAX_LUT; -} - - -/* - * 'cupsCMYKSetLtDk()' - Set light/dark ink transforms. - */ - -void -cupsCMYKSetLtDk(cups_cmyk_t *cmyk, /* I - CMYK color separation */ - int channel, /* I - Dark ink channel (+1 for light) */ - float light, /* I - Light ink only level */ - float dark) /* I - Dark ink only level */ -{ - int i, /* Looping var */ - delta, /* Difference between lower and upper */ - ilight, /* Light level from 0 to 255 */ - idark; /* Dark level from 0 to 255 */ - short lut[256]; /* Original LUT data */ - - - /* - * Range check input... - */ - - if (cmyk == NULL || light < 0.0 || light > 1.0 || dark < 0.0 || dark > 1.0 || - light > dark || channel < 0 || channel > (cmyk->num_channels - 2)) - return; - - /* - * Convert lower and upper to integers from 0 to 255... - */ - - ilight = (int)(255.0 * light + 0.5); - idark = (int)(255.0 * dark + 0.5); - delta = idark - ilight; - - /* - * Copy the dark ink LUT... - */ - - memcpy(lut, cmyk->channels[channel], sizeof(lut)); - - /* - * Generate the light-only data... - */ - - for (i = 0; i < ilight; i ++) - { - cmyk->channels[channel + 0][i] = 0; - cmyk->channels[channel + 1][i] = CUPS_MAX_LUT * i / ilight; - } - - /* - * Then the transition data... - */ - - for (; i < idark; i ++) - { - cmyk->channels[channel + 0][i] = CUPS_MAX_LUT * idark * (i - ilight) / - delta / 255; - cmyk->channels[channel + 1][i] = CUPS_MAX_LUT - CUPS_MAX_LUT * - (i - ilight) / delta; - } - - /* - * Then the K-only data... - */ - - for (; i < 256; i ++) - { - cmyk->channels[channel + 0][i] = CUPS_MAX_LUT * i / 255; - cmyk->channels[channel + 1][i] = 0; - } - - fprintf(stderr, "DEBUG: cupsCMYKSetLtDk(cmyk, channel=%d, light=%.3f, " - "dark=%.3f)\n", channel, light, dark); - - for (i = 0; i < 256; i += 17) - fprintf(stderr, "DEBUG: %3d = %4dlt + %4ddk\n", i, - cmyk->channels[channel + 0][i], cmyk->channels[channel + 1][i]); -} - - -/* - * End of "$Id$". - */ diff --git a/driver/commandtoescpx.c b/driver/commandtoescpx.c deleted file mode 100644 index d11bd9bd4..000000000 --- a/driver/commandtoescpx.c +++ /dev/null @@ -1,245 +0,0 @@ -/* - * "$Id$" - * - * Advanced EPSON ESC/P command filter for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * - * Contents: - * - * main() - Main entry and command processing. - */ - -/* - * Include necessary headers... - */ - -#include -#include "driver.h" -#include "data/escp.h" - - -/* - * 'main()' - Main entry and processing of driver. - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ -{ - FILE *fp; /* Command file */ - char line[1024], /* Line from file */ - *lineptr; /* Pointer into line */ - int feedpage; /* Feed the page */ - ppd_file_t *ppd; /* PPD file */ - - - /* - * Check for valid arguments... - */ - - if (argc < 6 || argc > 7) - { - /* - * We don't have the correct number of arguments; write an error message - * and return. - */ - - _cupsLangPrintf(stderr, - _("Usage: %s job-id user title copies options [file]"), - argv[0]); - return (1); - } - - /* - * Open the PPD file... - */ - - if ((ppd = ppdOpenFile(getenv("PPD"))) == NULL) - { - fputs("ERROR: Unable to open PPD file!\n", stderr); - return (1); - } - - /* - * Open the command file as needed... - */ - - if (argc == 7) - { - if ((fp = fopen(argv[6], "r")) == NULL) - { - perror("ERROR: Unable to open command file - "); - return (1); - } - } - else - fp = stdin; - - /* - * Some EPSON printers need an additional command issued at the - * beginning of each job to exit from USB "packet" mode... - */ - - if (ppd->model_number & ESCP_USB) - cupsWritePrintData("\000\000\000\033\001@EJL 1284.4\n@EJL \n\033@", 29); - - /* - * Reset the printer... - */ - - cupsWritePrintData("\033@", 2); - - /* - * Enter remote mode... - */ - - cupsWritePrintData("\033(R\010\000\000REMOTE1", 13); - feedpage = 0; - - /* - * Read the commands from the file and send the appropriate commands... - */ - - while (fgets(line, sizeof(line), fp) != NULL) - { - /* - * Drop trailing newline... - */ - - lineptr = line + strlen(line) - 1; - if (*lineptr == '\n') - *lineptr = '\0'; - - /* - * Skip leading whitespace... - */ - - for (lineptr = line; isspace(*lineptr); lineptr ++); - - /* - * Skip comments and blank lines... - */ - - if (*lineptr == '#' || !*lineptr) - continue; - - /* - * Parse the command... - */ - - if (_cups_strncasecmp(lineptr, "Clean", 5) == 0) - { - /* - * Clean heads... - */ - - cupsWritePrintData("CH\002\000\000\000", 6); - } - else if (_cups_strncasecmp(lineptr, "PrintAlignmentPage", 18) == 0) - { - /* - * Print alignment page... - */ - - int phase; - - phase = atoi(lineptr + 18); - - cupsWritePrintData("DT\003\000\000", 5); - putchar(phase & 255); - putchar(phase >> 8); - feedpage = 1; - } - else if (_cups_strncasecmp(lineptr, "PrintSelfTestPage", 17) == 0) - { - /* - * Print version info and nozzle check... - */ - - cupsWritePrintData("VI\002\000\000\000", 6); - cupsWritePrintData("NC\002\000\000\000", 6); - feedpage = 1; - } - else if (_cups_strncasecmp(lineptr, "ReportLevels", 12) == 0) - { - /* - * Report ink levels... - */ - - cupsWritePrintData("IQ\001\000\001", 5); - } - else if (_cups_strncasecmp(lineptr, "SetAlignment", 12) == 0) - { - /* - * Set head alignment... - */ - - int phase, x; - - if (sscanf(lineptr + 12, "%d%d", &phase, &x) != 2) - { - fprintf(stderr, "ERROR: Invalid printer command \"%s\"!\n", lineptr); - continue; - } - - cupsWritePrintData("DA\004\000", 4); - putchar(0); - putchar(phase); - putchar(0); - putchar(x); - cupsWritePrintData("SV\000\000", 4); - } - else - fprintf(stderr, "ERROR: Invalid printer command \"%s\"!\n", lineptr); - } - - /* - * Exit remote mode... - */ - - cupsWritePrintData("\033\000\000\000", 4); - - /* - * Eject the page as needed... - */ - - if (feedpage) - { - fputs("PAGE: 1 1\n", stderr); - - putchar(13); - putchar(10); - putchar(12); - } - - /* - * Reset the printer... - */ - - cupsWritePrintData("\033@", 2); - - /* - * Close the command file and return... - */ - - ppdClose(ppd); - - if (fp != stdin) - fclose(fp); - - return (0); -} - - -/* - * End of "$Id$". - */ diff --git a/driver/commandtopclx.c b/driver/commandtopclx.c deleted file mode 100644 index 1ef53aab4..000000000 --- a/driver/commandtopclx.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - * "$Id$" - * - * Advanced PCL command filter for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * - * Contents: - * - * main() - Main entry and command processing. - */ - -/* - * Include necessary headers... - */ - -#include -#include "driver.h" -#include "data/pcl.h" - - -/* - * 'main()' - Main entry and processing of driver. - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ -{ - FILE *fp; /* Command file */ - char line[1024], /* Line from file */ - *lineptr; /* Pointer into line */ - int feedpage; /* Feed the page */ - ppd_file_t *ppd; /* PPD file */ - - - /* - * Check for valid arguments... - */ - - if (argc < 6 || argc > 7) - { - /* - * We don't have the correct number of arguments; write an error message - * and return. - */ - - _cupsLangPrintf(stderr, - _("Usage: %s job-id user title copies options [file]"), - argv[0]); - return (1); - } - - /* - * Open the PPD file... - */ - - if ((ppd = ppdOpenFile(getenv("PPD"))) == NULL) - { - fputs("ERROR: Unable to open PPD file!\n", stderr); - return (1); - } - - /* - * Open the command file as needed... - */ - - if (argc == 7) - { - if ((fp = fopen(argv[6], "r")) == NULL) - { - perror("ERROR: Unable to open command file - "); - return (1); - } - } - else - fp = stdin; - - /* - * Reset the printer... - */ - - cupsWritePrintData("\033E", 2); - - /* - * Read the commands from the file and send the appropriate commands... - */ - - feedpage = 0; - - while (fgets(line, sizeof(line), fp) != NULL) - { - /* - * Drop trailing newline... - */ - - lineptr = line + strlen(line) - 1; - if (*lineptr == '\n') - *lineptr = '\0'; - - /* - * Skip leading whitespace... - */ - - for (lineptr = line; isspace(*lineptr); lineptr ++); - - /* - * Skip comments and blank lines... - */ - - if (*lineptr == '#' || !*lineptr) - continue; - - /* - * Parse the command... - */ - - if (_cups_strncasecmp(lineptr, "Clean", 5) == 0 && - (ppd->model_number & PCL_INKJET)) - { - /* - * Clean heads... - */ - - cupsWritePrintData("\033&b16WPML \004\000\006\001\004\001\005\001" - "\001\004\001\144", 22); - } - else - fprintf(stderr, "ERROR: Invalid printer command \"%s\"!\n", lineptr); - } - - /* - * Eject the page as needed... - */ - - if (feedpage) - { - fputs("PAGE: 1 1\n", stderr); - - putchar(12); - } - - /* - * Reset the printer... - */ - - cupsWritePrintData("\033E", 2); - - /* - * Close the command file and return... - */ - - ppdClose(ppd); - - if (fp != stdin) - fclose(fp); - - return (0); -} - - -/* - * End of "$Id$". - */ diff --git a/driver/dither.c b/driver/dither.c deleted file mode 100644 index dfefed7c1..000000000 --- a/driver/dither.c +++ /dev/null @@ -1,306 +0,0 @@ -/* - * "$Id$" - * - * Dithering routines for CUPS. - * - * Copyright 2007 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * cupsDitherDelete() - Free a dithering buffer. - * cupsDitherLine() - Dither a line of pixels... - * cupsDitherNew() - Create a dithering buffer. - */ - -/* - * Include necessary headers. - */ - -#include "driver.h" -#include - - -/* - * 'cupsDitherDelete()' - Free a dithering buffer. - * - * Returns 0 on success, -1 on failure. - */ - -void -cupsDitherDelete(cups_dither_t *d) /* I - Dithering buffer */ -{ - if (d != NULL) - free(d); -} - - -/* - * 'cupsDitherLine()' - Dither a line of pixels... - */ - -void -cupsDitherLine(cups_dither_t *d, /* I - Dither data */ - const cups_lut_t *lut, /* I - Lookup table */ - const short *data, /* I - Separation data */ - int num_channels, - /* I - Number of components */ - unsigned char *p) /* O - Pixels */ -{ - register int x, /* Horizontal position in line... */ - pixel, /* Current adjusted pixel... */ - e, /* Current error */ - e0,e1,e2; /* Error values */ - register int errval0, /* First half of error value */ - errval1, /* Second half of error value */ - errbase, /* Base multiplier */ - errbase0, /* Base multiplier for large values */ - errbase1, /* Base multiplier for small values */ - errrange; /* Range of random multiplier */ - register int *p0, /* Error buffer pointers... */ - *p1; - static char logtable[16384]; /* Error magnitude for randomness */ - static char loginit = 0; /* Has the table been initialized? */ - - - if (!loginit) - { - /* - * Initialize a logarithmic table for the magnitude of randomness - * that is introduced. - */ - - loginit = 1; - - logtable[0] = 0; - for (x = 1; x < 2049; x ++) - logtable[x] = (int)(log(x / 16.0) / log(2.0) + 1.0); - for (; x < 16384; x ++) - logtable[x] = logtable[2049]; - } - - if (d->row == 0) - { - /* - * Dither from left to right: - * - * e0 == p0[0] - * e1 e2 == p1[-1] p1[0] - */ - - p0 = d->errors + 2; - p1 = d->errors + 2 + d->width + 4; - e0 = p0[0]; - e1 = 0; - e2 = 0; - - /* - * Error diffuse each output pixel... - */ - - for (x = d->width; - x > 0; - x --, p0 ++, p1 ++, p ++, data += num_channels) - { - /* - * Skip blank pixels... - */ - - if (*data == 0) - { - *p = 0; - e0 = p0[1]; - p1[-1] = e1; - e1 = e2; - e2 = 0; - continue; - } - - /* - * Compute the net pixel brightness and brightness error. Set a dot - * if necessary... - */ - - pixel = lut[*data].intensity + e0 / 128; - - if (pixel > CUPS_MAX_LUT) - pixel = CUPS_MAX_LUT; - else if (pixel < 0) - pixel = 0; - - *p = lut[pixel].pixel; - e = lut[pixel].error; - - /* - * Set the randomness factor... - */ - - if (e > 0) - errrange = logtable[e]; - else - errrange = logtable[-e]; - - errbase = 8 - errrange; - errrange = errrange * 2 + 1; - - /* - * Randomize the error value. - */ - - if (errrange > 1) - { - errbase0 = errbase + (CUPS_RAND() % errrange); - errbase1 = errbase + (CUPS_RAND() % errrange); - } - else - errbase0 = errbase1 = errbase; - - /* - * X 7/16 = X e0 - * 3/16 5/16 1/16 = e1 e2 - */ - - errval0 = errbase0 * e; - errval1 = (16 - errbase0) * e; - e0 = p0[1] + 7 * errval0; - e1 = e2 + 5 * errval1; - - errval0 = errbase1 * e; - errval1 = (16 - errbase1) * e; - e2 = errval0; - p1[-1] = e1 + 3 * errval1; - } - } - else - { - /* - * Dither from right to left: - * - * e0 == p0[0] - * e2 e1 == p1[0] p1[1] - */ - - p0 = d->errors + d->width + 1 + d->width + 4; - p1 = d->errors + d->width + 1; - p += d->width - 1; - data += num_channels * (d->width - 1); - e0 = p0[0]; - e1 = 0; - e2 = 0; - - /* - * Error diffuse each output pixel... - */ - - for (x = d->width; - x > 0; - x --, p0 --, p1 --, p --, data -= num_channels) - { - /* - * Skip blank pixels... - */ - - if (*data == 0) - { - *p = 0; - e0 = p0[-1]; - p1[1] = e1; - e1 = e2; - e2 = 0; - continue; - } - - /* - * Compute the net pixel brightness and brightness error. Set a dot - * if necessary... - */ - - pixel = lut[*data].intensity + e0 / 128; - - if (pixel > CUPS_MAX_LUT) - pixel = CUPS_MAX_LUT; - else if (pixel < 0) - pixel = 0; - - *p = lut[pixel].pixel; - e = lut[pixel].error; - - /* - * Set the randomness factor... - */ - - if (e > 0) - errrange = logtable[e]; - else - errrange = logtable[-e]; - - errbase = 8 - errrange; - errrange = errrange * 2 + 1; - - /* - * Randomize the error value. - */ - - if (errrange > 1) - { - errbase0 = errbase + (CUPS_RAND() % errrange); - errbase1 = errbase + (CUPS_RAND() % errrange); - } - else - errbase0 = errbase1 = errbase; - - /* - * X 7/16 = X e0 - * 3/16 5/16 1/16 = e1 e2 - */ - - errval0 = errbase0 * e; - errval1 = (16 - errbase0) * e; - e0 = p0[-1] + 7 * errval0; - e1 = e2 + 5 * errval1; - - errval0 = errbase1 * e; - errval1 = (16 - errbase1) * e; - e2 = errval0; - p1[1] = e1 + 3 * errval1; - } - } - - /* - * Update to the next row... - */ - - d->row = 1 - d->row; -} - - -/* - * 'cupsDitherNew()' - Create an error-diffusion dithering buffer. - */ - -cups_dither_t * /* O - New state array */ -cupsDitherNew(int width) /* I - Width of output in pixels */ -{ - cups_dither_t *d; /* New dithering buffer */ - - - if ((d = (cups_dither_t *)calloc(1, sizeof(cups_dither_t) + - 2 * (width + 4) * - sizeof(int))) == NULL) - return (NULL); - - d->width = width; - - return (d); -} - - -/* - * End of "$Id$". - */ diff --git a/driver/driver.h b/driver/driver.h deleted file mode 100644 index ed4eab96d..000000000 --- a/driver/driver.h +++ /dev/null @@ -1,249 +0,0 @@ -/* - * "$Id$" - * - * Printer driver utilities header file for CUPS. - * - * Copyright 2007 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - */ - -#ifndef _CUPS_DRIVER_H_ -# define _CUPS_DRIVER_H_ - -# ifdef __cplusplus -extern "C" { -# endif /* __cplusplus */ - -/* - * Include necessary headers... - */ - -# include -# include -# include -# include - -# if defined(WIN32) || defined(__EMX__) -# include -# else -# include -# include -# endif /* WIN32 || __EMX__ */ - -# include -# include - - -/* - * Common macros... - */ - -# ifndef min -# define min(a,b) ((a) < (b) ? (a) : (b)) -# define max(a,b) ((a) > (b) ? (a) : (b)) -# endif /* !min */ - - -/* - * Constants... - */ - -#define CUPS_MAX_CHAN 15 /* Maximum number of color components */ -#define CUPS_MAX_LUT 4095 /* Maximum LUT value */ -#define CUPS_MAX_RGB 4 /* Maximum number of sRGB components */ - - -/* - * Types/structures for the various routines. - */ - -typedef struct cups_lut_s /**** Lookup Table for Dithering ****/ -{ - short intensity; /* Adjusted intensity */ - short pixel; /* Output pixel value */ - int error; /* Error from desired value */ -} cups_lut_t; - -typedef struct cups_dither_s /**** Dithering State ****/ -{ - int width; /* Width of buffer */ - int row; /* Current row */ - int errors[96]; /* Error values */ -} cups_dither_t; - -typedef struct cups_sample_s /**** Color sample point ****/ -{ - unsigned char rgb[3]; /* sRGB values */ - unsigned char colors[CUPS_MAX_RGB]; /* Color values */ -} cups_sample_t; - -typedef struct cups_rgb_s /**** Color separation lookup table ****/ -{ - int cube_size; /* Size of color cube (2-N) on a side */ - int num_channels; /* Number of colors per sample */ - unsigned char ****colors; /* 4-D array of sample values */ - int cube_index[256]; /* Index into cube for a given sRGB value */ - int cube_mult[256]; /* Multiplier value for a given sRGB value */ - int cache_init; /* Are cached values initialized? */ - unsigned char black[CUPS_MAX_RGB]; /* Cached black (sRGB = 0,0,0) */ - unsigned char white[CUPS_MAX_RGB]; /* Cached white (sRGB = 255,255,255) */ -} cups_rgb_t; - -typedef struct cups_cmyk_s /**** Simple CMYK lookup table ****/ -{ - unsigned char black_lut[256]; /* Black generation LUT */ - unsigned char color_lut[256]; /* Color removal LUT */ - int ink_limit; /* Ink limit */ - int num_channels; /* Number of components */ - short *channels[CUPS_MAX_CHAN]; - /* Lookup tables */ -} cups_cmyk_t; - - -/* - * Globals... - */ - -extern const unsigned char - cups_srgb_lut[256]; - /* sRGB gamma lookup table */ -extern const unsigned char - cups_scmy_lut[256]; - /* sRGB gamma lookup table (inverted) */ - - -/* - * Prototypes... - */ - -/* - * Attribute function... - */ - -extern ppd_attr_t *cupsFindAttr(ppd_file_t *ppd, const char *name, - const char *colormodel, - const char *media, - const char *resolution, - char *spec, int specsize); - -/* - * Byte checking functions... - */ - -extern int cupsCheckBytes(const unsigned char *, int); -extern int cupsCheckValue(const unsigned char *, int, - const unsigned char); - -/* - * Dithering functions... - */ - -extern void cupsDitherLine(cups_dither_t *d, const cups_lut_t *lut, - const short *data, int num_channels, - unsigned char *p); -extern cups_dither_t *cupsDitherNew(int width); -extern void cupsDitherDelete(cups_dither_t *); - -/* - * Lookup table functions for dithering... - */ - -extern cups_lut_t *cupsLutNew(int num_vals, const float *vals); -extern void cupsLutDelete(cups_lut_t *lut); -extern cups_lut_t *cupsLutLoad(ppd_file_t *ppd, - const char *colormodel, - const char *media, - const char *resolution, - const char *ink); - - -/* - * Bit packing functions... - */ - -extern void cupsPackHorizontal(const unsigned char *, - unsigned char *, int, - const unsigned char, const int); -extern void cupsPackHorizontal2(const unsigned char *, - unsigned char *, int, const int); -extern void cupsPackHorizontalBit(const unsigned char *, - unsigned char *, int, - const unsigned char, - const unsigned char); -extern void cupsPackVertical(const unsigned char *, unsigned char *, - int, const unsigned char, const int); - -/* - * Color separation functions... - */ - -extern void cupsRGBDelete(cups_rgb_t *rgb); -extern void cupsRGBDoGray(cups_rgb_t *rgb, - const unsigned char *input, - unsigned char *output, int num_pixels); -extern void cupsRGBDoRGB(cups_rgb_t *rgb, - const unsigned char *input, - unsigned char *output, int num_pixels); -extern cups_rgb_t *cupsRGBLoad(ppd_file_t *ppd, - const char *colormodel, - const char *media, - const char *resolution); -extern cups_rgb_t *cupsRGBNew(int num_samples, cups_sample_t *samples, - int cube_size, int num_channels); - -/* - * CMYK separation functions... - */ - -extern cups_cmyk_t *cupsCMYKNew(int num_channels); -extern void cupsCMYKDelete(cups_cmyk_t *cmyk); -extern void cupsCMYKDoBlack(const cups_cmyk_t *cmyk, - const unsigned char *input, - short *output, int num_pixels); -extern void cupsCMYKDoCMYK(const cups_cmyk_t *cmyk, - const unsigned char *input, - short *output, int num_pixels); -extern void cupsCMYKDoGray(const cups_cmyk_t *cmyk, - const unsigned char *input, - short *output, int num_pixels); -extern void cupsCMYKDoRGB(const cups_cmyk_t *cmyk, - const unsigned char *input, - short *output, int num_pixels); -extern cups_cmyk_t *cupsCMYKLoad(ppd_file_t *ppd, - const char *colormodel, - const char *media, - const char *resolution); -extern void cupsCMYKSetBlack(cups_cmyk_t *cmyk, - float lower, float upper); -extern void cupsCMYKSetCurve(cups_cmyk_t *cmyk, int channel, - int num_xypoints, - const float *xypoints); -extern void cupsCMYKSetGamma(cups_cmyk_t *cmyk, int channel, - float gamval, float density); -extern void cupsCMYKSetInkLimit(cups_cmyk_t *cmyk, float limit); -extern void cupsCMYKSetLtDk(cups_cmyk_t *cmyk, int channel, - float light, float dark); - - -/* - * Convenience macro for writing print data... - */ - -# define cupsWritePrintData(s,n) fwrite((s), 1, (n), stdout) - -# ifdef __cplusplus -} -# endif /* __cplusplus */ - -#endif /* !_CUPS_DRIVER_H_ */ - -/* - * End of "$Id$". - */ - diff --git a/driver/image.pgm b/driver/image.pgm deleted file mode 100644 index c0b7a22f7feb992bb441fb93b9a88a7da6341857..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 152380 zc-ri|_gh=*-rhOydCxg}Z*P0s-tOI|_uhnh?-e0H2q6SQAORBU1tE|?4HbGbz4zXG zFZTA{=e%i?WRgshN$+KnOp;0R=p=dnfter9%;j})T?X5ttb5(}_x?Q3TCmdZgucge z@MtcRll`7sA$dEQNmS}eMa}!={@slS{pFMm2 z{KboxuU@@={pQWvckkZ6|L`FsG&C$MJUk*YGAb%MIwm$YE-pSkAu%y2DLFYMH8m|Q zJv}2cGb;-M$%aBTyAbI zkC&I9Ur@m37YYPLMM7b*NK{fH7MGTlNhIav(u#`8N|{VvRaISGQ=?ESYim_1wML`W z>U4U8!Duv@%yo4ZOMShyp`o$SX0tanH8(pPPM6E=_IO&nUZ2nJ545(nwY9f*baZxg zb$9pl^!D}j_ka92FgQ3gG(0>qIyyEsK0YxyIW;vsJu^EyH#a}Ou(-Iiw7k5sy1KTu zzP_=!xwW;uy|cT!x3|B4aCmrhbbNerdU|$tetvOzd3AMteRF&J>C@-WKYjV~^UuHh z^1I*v{?GpGFZ_kS_?Q0DU;fK~<*)p&fAz2awZHb)|N8&-H~z-o{F{I4Z~gCo`)~i9 zzw>wh?*H-k{@&mJ`~Tn{{KJ3vkN)vL{wM$BpZ?Q-_Rs(MzxWsb@?ZX|fBmoj&A<7# z|Mvgi1Q@uljw}@2h@)T>4@E81?J@W7O}Tebw))eqZ(bs^3@rzUuc? zzdtVhh<}Xw4Sdz_tA77)>-Vp|>i1Q@uljw}@2h_Q|I?59RlolS`uQ}qMx(pKZZlL> zRuqvlV`4wt|Md^C*kWZvvpe8-w6wVF4UG-;4Th=`VTIZ4^81`_zssVKmdedd_Bx4J zSX5k;pHoE1NX)`hsAvL(N+weoMTG*X+MuZ}Vv}hMT22uszZjhVa#^`jt2NbC=kvKV zB8ko`s;;W8Rmz09RH4eGQ^?9IODjz_i_uVHFe%E)YYla-wvN{BnceM~R-3D*!(p_# zeGLkwrKNA=V|RDEyGgHiboF-kwzswqE$wV?3{OmaY;Wrwnx9=*T^Jc0UtZhVJ2*Vp z-CkPWJwDh!IX^!?3!dGZPoJ(&4iAq%-(KJT{PU;Fi}RDi-JLBU$mZtS%HqQE_R012 z)z!`M?%Mp!+|ue`U#H*e@p}EPCYQg>>+rOX%*>8-v@`{VW+r=@^!3eZk)%YZYOK>J zt*nyQD5_-@CYw&CFf}SF1#}#RUs+rzl!)_k3Q82}Vg{>7LM3L$#6sZN8L24{ z3>KD_k&a~Lvgm9EuTW50EftiB@)>w|W;z0kOo`8c!wCcul|jWq;W#Laj3btLwYvIx zx8H2lRhIA>$kg{Ao__n=S6Sq|N|U{%&24ddJ&pB^RztNUpGxMI>trUE$J4BpaC35t z2vUAu>CR4UDl6cNC1iYhcxYTgRA@*< zG6Dlnhh}4$914L#q%)X#rKNm{D3^lFN=reJNC+r~NFWf%bOsd-ffJAj5{4-88ZC}y zuUFGxtQIohi4kvJ-T%|?qtIlISXJlnxy-hfmd5&~Mr~06n@pe=N(G8~Yn@J#gTyoW zqOwwPJ};kNn8zSuu^0@FNT$-591e@k<>%+}ipt6bImzMg!lI+26HquZnTRKn8B(3r z+-xi^E6SnZFjyS;VNgf}B!et-_w;@2aG0tpH1+jnv)N)b%7leQ;#!MYskF6^j`cVi znwlFd7Q4@7R4C1^wt&~`wkgYH_O33E&EaeV`fV+LT-aKioSGb-4C*&JGQGLIcL?ma zwLUk$eYn35EV#FKaB^{ddU1Vuc5;68+_@iosD2DZftC9?d%;L?H}xKt*!4K zpB`>5P7Z(U>+9(RS=-&~Y<9Rn^!okX!&6g(?H*6(@bq|hlTl-q1Fwj{dDQFWh52QL zm8QlzbxpNOQ&m=>x7j@IIuR-{6^YJHPfbdMG4dsH2{?a30v;A06&w2O$PjE*1)z zES|79kAh4_F=!Y#mda!@sANW7F`2>=NJ@ERL}GMeT5@7C3P&Phk!TF9!ene{u}aE> zToMYJ4WVKosbE+pXBXQ7U43m$4jpiuqtRxmZ!pOVIh^7evq@1?-_|wI=c=o#uWK;X zJDvKwI5#pqIlDYRJT$Srd+-PQt-bo}FFZeEI3qr!PNUo$qb0FE1`EtpMlk>;rvIj<%O(=Qs9u zcQ=;jr^beQy4u@1yZZ;4?GBeW(Aws18hcA39PMs48|<2Lg_bF0izAejNh(SUutaQDa@?D{KRkF5kD`z; z*$@nyODEH*G!l+hTrRFE%|T}*Cndv(R3I)S6^AF&nPfy7f{aCxPy}h9(PVcwfgx|G z;2;u0-aL5z!>=A@Q7~kYT5q;llp1jPYi!O2ARmoP%M%K@SSY)5)36z zC}5#8G9XACiA*8}3rJpJkqBe}Lm=ef@JSKzsfmdha6FYpz!4~UrK(21Pn}DnlJO{L zMrwL`Is^)ZWWngV*4B?hj)r=JzNszHX!Nvb3&H0qmDk8C)t4}bJv}{sS4-#M*l-`1%|jDoAKTmxTb)j;Gn(u5TD?M4P{dPt zT0M4Mg;ZXUQ&FpKZf=ja^5YK=AG}OLBA|$b zG$aUE5*bZnQE9n+o}_?=g{3AY;jpOev@{43PoguK6e5<)CgB+*dbOucXLU9;*zBfC zE;8=@i+c~g{nZO36^SpbH8uM^*7|0IgGrq`=#8(ITRR<}dR2VJyKQms^3I;N-ld|sEiR%KFY z8XOk2Qf+azG+PXYin6N47MIiOb-6o6CWpKHvq!tji;J_<&8&}fw)Kq7&M$(t zxiB@}-rL*e?`(57xm``}_EuoRuECMP?)J8xq4Cj=?JYjH4NPsLxj|b~AkaZk z8az4nhkL)h6U)d!VR@B$o5x{Nn=D3Cy;&m>^VxKEp+r|kK~W311QLmv%Y>&xPT35Gs^o@hh1KJ- zH`*N@r_ExjD=(|D`TZ?EkIUWmaR_*1dUt1eVSaXYdTw=PdUo~T=y-1pC^Nsb0h07! zAG{qLUwr!c=5X)y>g??L7cc;C&iB?=H?}ud78aMccMnfNLA^L$A8vIAK90{Wu5N6s z&d>G?^tbxjTU{Qnr`Z+o*`5CG!NLBHKx_Bl*hqi7x6RvBX8`bGtt~A8B|JB$R9)BX zwp1%>nCaQL{5r3{qfJjs2zmSN{o6P1BjPf%;jnB76p2Sbp-HbFJb3>2RRRowA|NnW zL)?hIkDxeIfU>6tVdm54}< z3Qf&`q6st>o5|tk1*uI897xZrs&kp;rNUe?8b&KKG+Na1s%m+a&Y~0m{qXR#xM+A* zIuuW5F=$jU{*|Wk^2$oNG0@ZDb!hoCDiufK*Va2bCO20>i3k|vl`5IS(Ld1F-R5`O z>jC8Hbk>%Rb`M}XZ`aUBe`m+|`sVW7%nCSthZ~FYa~s=-XO~x(7Y7Fi zN2gbxzFZybo!?wu-2Cq6&o>uGJL~JahX-3r3-f#XM?rkMINO=*Yzg#FEUj(tAM9I{Sx)`r3VdPlKTrpeU$;EM#&fF~6)5zo36G2jj{t9xQ3yz8M$EGx9zK5bE**=4BeN0NF|S{| ze*NTiSWG&eh|1wHF`4P9iEtDKjlz)WJRUEX!=Ml`6f}Ye`itA7HZ}m~1N_w}Dn$Ip zcfJc@$V#aM0yP&zCJ``8m9EZWttcHFTc+t~^)y>mMIdhJUuZ60m;JV zh)RTXJd?|<(1^+amYV_}`?_0=0y>3^#pNp--5nEao1jFrn-z*GiNZItI5W}T?zDnF zV>Q$_`#L(kHixHkWO{aTq-SJteR+E7&-DXYc)SI8Zfo!4^7`iHdT;;W=%|m+h2bEe093Ny$R$!+h1Q=*grZB%6ERYzc>(R?Vns++deql-`*G*8*KFk0xnO$ z>+<(@``qpQ1KmECv!%7G7ksnc<_5j8Qd%jim5Fkok5E2m)38FDE^x@q{cOQnKXqdD_EEN~?;`!S*_a47|7Y~Ic zQ*t@z^o)$eY+y_*p32Mt^`1^9;L&6hoPfeh?AjWw*`U$tjV7b2qA2&#cXy(=@-h|$ ziKKE_R0@%jSEbh*>ZQ`sLJpnD&Mn~KBA>?sUZCYNF;FBDgGIwLl46iZB&e7)CXvd{ zFA|lAO2tARD_5*=c>OJ|Ixz`}XNzm~dQFW=Yp_}?nM48(1ItQH%Ff6n70IMx2A0Cg zsWM6>@+!I3+xKyxuel5q9u$&OWp#CouWl|(kG7fB`s&h3=NQm(u%o%oWUjBT)Hb-< z`#K!%wxPL|)us9Vf$7!d$?-qW&*Rgx!_Ae&#kH-2)1WQ@4gl3%U7znCTz|Q}y8Zm+ z^X1X*&hG9p@aERq>f!MzC@%o}_SeR{+dq!afLCsBt}c&G47GV%+ge;cpUdCV?RR$! z40gKgcBk9l-qGgsSWT+x%1T+4LN3XNhrN#j^GBsDCB!77pqY3wQ&u7n2v`URGCK6# z+mP^x@Wg1KUwBw(cvwW_tGjof+<6#meRF0y)3g}m%Y-;cB z>~@IJ>8U9h6p6v!HnF}uGxpJA(3rL2B2`Owcjw2pMw7`>XA!F!++CvszPA49wXKbn z#ex2@<>m3wKkqNwdj~tK3v+X8n?e1~&jHUL9G{+_pY0vo{_^Si)Ai?1mj^)8gVRe8 zquV>jCuf%zm*;1PCx@%!gJZzPtD9Tv03|1Y|Jpiy9v_&0ZGmQ2$M9fVb7P~u$>sHV zJuZt$TdSzm==HU7K0M@Y97j}M!p~>m=y? z0n!GnO~oKd7?M;9ShH58(&)^M4!fzQJnCHpuEMBS2=G~G3Xw=h!3aWGMYXB229OMo zN#hX^@YL|gObUs{p`j3XG@e2wfZh`t79N$DiNYdqi~^CQTv8?G(m7&vy{XydaJLwQ zmBk!Rp|nO>QBfwYsLV%0VQ>Tj4uj&*c%EEUUVu!^#xrZIvNE|$BCq$gHMLmtQ$M^5 zNx&AX8(Jr~=f(!Qnl&1$rIb^wvpJppz6QO~Vlh{kT!Dd^(bn$a#my~HREGM7mzGCI zW+%r0Ka7L;+t}JzoSvEvLf_4&+v}Cpt-atf<;m`U*YEQ7_F`{)?*#DR`4Pa2)3b}q z%S)i|_035TI+j+qc6UJlkBkraTiUw<9-qtBAWMeRRXi{Q25{EC&!NIc9lVYAdeev?) zH+NqA_#^^`N&WCDlgUVY6%rc}6Bm~NL8gXebMlbMknDss2ny(iCj;&x5y=!Po*wKk zqzWwwL8aztta_cn+GNvLMa5?_lpcqsgahUy8JU`th384C6-B36J zM+Bb=e1M}cSu`9PlN9>m*}I64H*sl5Dx1s8E0>q&=SlVTbrzf3?`^V_O2xd~a;-_L zt`Zk=Nl}_u^jgK#`Z|$F6eg65E ztDEby{hjUIjrGmFql2~i@u`uH)}FrZfUCh|tg|+{+xvQ2-5^mNEj~v_r@2Y1)ETt( zz81Syh>Xdgr6)v1rO_+uY?>N_4aBV9<8D$H@%TkK1O$o%ut;8nMdjpR-o6D<`t1G> zkDte*QXV~uMq;s$xX{qZ#Ds*Tl!S=)*%T%^EjcwkD;tIc@Bqp_i9jGy84NB3N5zt) zg^6KF36LD2R9aK#_E?ljF%fBetJ_*F0p^D!$3&&zxW%Pq;*x5uR$D8i5OHWY9D%~% zDQsRYi;QFO3JdcAGEk6dX)p{L78&~PO=vQXZLCul=ap*e)cOWr@8HKCtyW$vs;#SQ zw$zAtOi+_CcsveIqEPcIbxln*xygV;a>|v}YNMsGrMuJV^*iO*u#kigsYHRHcVVe_ zbga`-tF`p>bolJ%TA9V^_j&`K26Mfmb8x7$rDJGzZF6&DYiVwJeqnBMY-nZ`w2{@V zqtnyg60e6$3R;$-F z1lrvuF)}ZX=@MRwfl2!_GgXfkWd=#ZrN@HBE>VPR1Tzg(fxsKqQI4g;DB z29G0i^7A+pJeOBcke6R1=FxE&Dx1YXriDGabN6MW)?$uhsNjER_Ete zcP_3jj<(j;w~x+lKi%Hk{&aP601S40b$NC3`Sa)7+uwh=IRSXE3J`I2z-6_A@wtC~ zb$Nbyak9NUx3IFlxwWyjy0$qvGuqMC)7#;;s;U%Plf~WI)$RgcJm6{fTYZCV4wFi) z(Kq^Aon|RM@?G@ZmoeEyc7aG%R%vPRG}+q&t?iClX(gMC!E;J$jTXHK3nkI9Stu$M z5}ANZ$;7~3{_0^`N?H~S4bMzQBN1>&Qs~QUDjS=glAaC$M{pC42o4g3MyGN}*r5M- zF>fM1M8a?wD1uXM(nygB@4~6NCX2zOljq|ylB2TOh5WptQlX@>qDoPohsPj+{jhi} zo=6l(Q|USTsAT7?Ss2_c~Xr+rZQP{#zz0g@rkhxx4ug6Y_S16 zq7u+390ZBOAkg%DUP)!ON-g04K^*4l0z6G@aJF@NjP+)Vxi~vEB?2u_*m~!dM*4jw z313hmQP{itS{f{#uEE}}&X&3cKn`Ay!{!JKfUhz>v9!E6x41e#y08MK;lk#@&F%Hs z-p=0f`9*L$?&j0Y`SIb|)%E37aBuGB=H~Z5T^?+%E-kJuEiaF_>nzUpiOrL<)8ni2 z{iV_VzJcjQa2-rf%}mXXb+&f*wtMOo@>-*{!5!%EH(Bk@jzCw7zPY!(sZOI*=^EXQ z;JoEzM8|&f2A(Sv6&L68iVbc@z1ib%xGWWgd;&5X$&sjx7PSBcAyDyXB0HZBWI;eP zqaXg}NosORI*Npc#Nn|RG$J+P6^zEgrKe_OWM)CK;Ybvk$zafFR0@^E1PFm4O4$)F zLSDT~&dP|7$zm3Z3Xt*7oii-=lxkaTSK9|h}bjalwGBU$oze46!>+9^cI%|WYZE#|8e4x#$u>xT#@|heq z9!(&T0h(~jH42qdt}vR_?IV+Y&AL(!(6710+o-CsIrY+FHZrZOwaeojUYQwe(Mg4Z zA||K8+1Jz6H!v|X+~4gn>*^XEj%Hhfw{v)6e0XShdU0`fX=h^^OuntvmCd888-VA4 z$#1T%gMsi@=J=s}VoCj{**qjbDHa53U?Oxnop5L7B&GvYjo80Y# zlT(vpW7D%BKfAiy0*xA#smbXGZUWk^c6W=@->kOvb<~@*HA;PbBWMY=B0_4?-I$yj zy{f7rmnG0Tn(B=1MoYa`l*1yxGl71!8ck&`8cv{)a9DbwkcosL65c(!`@@^0^o%SN z0hJU2q{3n#vG1U?9DGJvW@dV3HUdke((?0oIV>892>Qz(_8(Z`FG63wO-PH42v2}h z=rm;9qwn8vtet)^r)$MbR1yS7CWBd5T_q_jEEN|}h*)4iB$`czr-RB!9ReIJI;DXF%2Ty^#)Pxtu33b>YA>Ka=+{c;|i!+>QVSTr)3EvnJ! zG%}%B@AeMP&G)bbIXO<53=GS)t!L4lU1-nXcpZ50p=F6Y`#ozsW zb$W0R%+Jra*B8M}azGF3!R58pm5uHB?iOF)#OCGCzkI&Fx!9lUYBK7oRo2$g`T3cd z`SGsS&hFL@hso@0ZEbOS11g-oSV$T&)&h>;PK67s`uzJDH(m<53&p(!EH zvH-B7vtr)C=sASU^sLNG2pmmffHRz*4-k%s5Aq)YMUXJVUxvPZlaTs8A~6#POvXUM zpS*yJwN1@-qpXlc4fY-!g~gRrNQ5GZh|2--2k-++!)7MLC1)ck0P(R{5~DDmLnl+{ z>~fiun;H5poI}GB#f{$P=H`~Jv4!Q8(LujiQ*Uq737A|C2F=W&lUYKkOj=%+Pt8%d z+6Sg)x@^GoW|yxSV1c$!R1V_Tq&D>doSU3q8SiXR$;t$|d02{Ra&dZQa&EG}y))3H zG`svBo7LiM9hjJ!oSK?kU!Pq#+MizB+}~T9UtHZhyu3a;*aaQ(gw~SD?o!FR8M!7=Vs;>)>gOn*Ty~$FK?fI`f_`E2xxF+z-87}Nh|Am=9d>{7sfjS zUEN@aS%O=~UIzfdrY3Kvud%t&?ElyzQ)_E#wCW18N>N+ENR51+B{G;bwW>lkr$kX( zt5%fc0~{m}Q0a-;>~guRQY$T1}i@Y7Wp>h)epb9^CCJW6NZ2#g*^W;H9Z@J z$cT7>U~map8IUX}4231r*&GIw%>n+yqew^?9*LJ=Up#pE=t+3=i%19#G#e70Mof!K z!;lKgt4e5aI1Z13AqdP|9xzs!w6d60n8&6P@OT0Wni3rm8J7qeEuBhZ^NNM}Y#Nop zq41?8wCuF>97Mw!js7zmypC?uus!IwB*+iDY z)7v*S*=nw>k?9-ldWFVls46Trx$N$~o`KDVov$;3}D(m*v{>k3r+{*s(<@M#!=JLt;>DG9l!B|%F!eh`lEE*0;OHN?( zg*j*ll0v|uaRBJJrRC)kQBkp|NKnM*QZX=GN<@5GQdATq8$n`&Oy(CB3HUrVT__T; zP-*GebZBG*qSQUq4hF>F^z`WDc$=u@9%G{jQb4;q?NKWL!V$})fH8>Rd^hckuMYp zVbF}EnApUW&UQE)xrjN+N-VmAmewleQg(WJdC&Ct#B5u$)g0)v z>Fiy@BRzhX-R2!xTwGjV9b4F3-a1;|J32YoSeTjK+B?`=otvJSotjzRIo#XY+Su4R zxwyFae0_d=bbNYxbA7zExVU+^v$wmqySoo^^Xzzkb9H&+`08kTWys}sG9`CJ# z1n(Fa=gqT6r6~m$T6>@R3q!!;5J&=xUsRA=QU=^pCR3D3Bqh1nl*soXvB^coXa4@CZuFx3$)&m!J(BwN9+fPK-^=&5rcw%Y_wMZLLaxMpX9A zjt`7D>vU>&k40DqHt+*|KwzMWo~+V?_hgzVt9CVYHDt6 zXLn~~ZGGn$^v~O?v*W|Vlao(ZhimgoJI4q6yZga~(d&y7;McX)6`O^nP$Z((2YHsj%1srW%AhvDp*6y*HiNOwQwHBmwtcQ*q86|;!zy0>R?;pKOgrLx9 z6g2M5k3T+s{5laH_u$7UD2_rxK_DW7>>dUAeTns!AcD zQI59{BUDwZgXdEdueKH z3^d5O<*mKLjkUGilk1zSn~T%K{e#2f^MkdS$=S8tcjx-!w-(bpR=8w~Xxzt`n!YjZc4tqxDm%;!-hK2T z363X|aaefVvmYKj3yH`;#Xo!y3JI=r1i2lD!4io$6pFxLGig*hno1zBNYqNq>*wLG zp1yk%p9aSSnVdl-;V>u^D&hT;XOU16jmgR_DzB7?=^P$Fj{>2rMy0Ccli=A2klJEhsGHf@%auk(p#1tH#saH#WbqxxPHJIN_9wiuffGS&gz* ztx@XL6*a~x78(jcG4cv{B4Hsv2b=glDk2)fk(&V#n6=u*-nsdysl~1BmDv%evO+4A zsg0H8b^Vhg-Ca#qqsBAnx3u(+4s|#in=JN^i>u2^3lkd`hbPAii<>7Gr@I^Lz*7gS zGvnh^lhZTvD_i?JTig5R0O~K#kAru^935^gOis?OY#kpSoLqmpI@?&D866&-oS9qM zJ=)*iIlMYOJU#^-XL(`7@A10oz!Ww%g7Rs1`CJx_&eZJf18CUOu2<;II%}PQ_?e`naMHlUp#sGHX=IuLs(d7WE!=|Y^>yvDagbJ-~Z-MfBo(E z-#-mWM$@HkW)8im6XGeh4-W)T=%CK<3c36}=Nf)~SJ?EKPdWwoRvj|fRi zjEG2Nsp59H&%g_c9y5s2b~S| zR%gf9VBg@x#9&Vspgwc!NNaOoXnY`GGue#R-o=fT<=K&yqn-VOnYp#YGmwx+pFV#& zU7s2n7#^LPnO#`h20EPrc(@7P@42%J1l(R;SX$rSKH5LH{PN{||6@;Ep#9_I!us0Q z-sZ~g^)I*QC&5NDGu7v8Xfy(xs8*=W%`J7!e!oqx)->5$y1M~MSj|qat+}pHkds@) zh=2CvIijdUC}hF2)02~ulj5R7LCb#^5f$qP)u3T<7i^Xt$g7jTT#r$E4C4jox;L*Ig}SvGOV5_a8ik z3kn!iOlnZSl$7}B@Yj!@hb1J&y$_AaK;iM2jLeu9Z&H$8-GB7>-f!=QWTc@vMdGq@ zc@-a%o|2ZD^!j~#R`jE%@f0j1H8l%~p%5@=B8^T9CL{ri{qz0;^ox4)^!1C#6f~7i z!Gi>)Gnotu86I4t1_v1y6B3@7jYg7l`8ha9G7uRHO^SRUnMPosQnG0UBAL#lDd+R~ zMMZobi(bsZqe(0_o0*eWAgpR=_4Uqd1ozLDR))*|^Ag@3$=&Y?aH8mQwH8NFm&*5wvTu5QVRdsHr0&7V<>%j>o}V9Y%z=np+dmGje0~C> z@26jW`gD2{jMAOGy{)y)gQNYe-QA$-aWQ^y}dX!-rGKL{N>9}x97V{ zlRZ7&dZS5GQC(A2RwPzht%1?$p@7|DF<4sMh8mSz>1cI!^x36(JRvRY{=@H5n1s~W zuvh76sTojcW=izC=Wk*%A!%_5>7e7|vNAFvp1g&jli!8CyZn52G@3@n;Ys4ET7^nm zRm{ufmlV<|Ocs+#XK@PzJRX-Pkkxy;`X*PG#>VI8Rz7MaT8q|bx2Xa92qnUjYI!aJ zhoP_;I24Yao0A9h7i-kb0av5L>$lhI)qoAgR}c2)XEs(x`=>^nja}no)4Rv>9lrM7 zfTv#9;P*C;SZo8`P3ofRO2hEk=d-=tx#7vJ!TbxNH^UTZMRS@g=5CV&6r)Nq%t$?fyI>Q(Xvy{@^V!_!bHlB)8;?mdf2 zg{DWmdif?HIxHd~Ju@@%S?KHJd@2LQ;$p$zdH(d_(>QW21(x;bK|<{J_cKvwVy;9{ zQ(0St%go43Nr+2SM*E5O_nk}(h<>D!mj!m}_ShjB7} zQ?tFkDxb^Yi;Gx6H*r`@7AP`#La|h7ZtChDo|_pNn;)O)sufqOtF<<#MO9s1B$X=k zRa_D^=w}21N8vIGsw7;YCD7g0pl@vJ>uqybZGn-6jlHe;x%K7o;rZpMfq}lx-jT7s zj-Kw0rshVgyVGZFQrJcTMM#}SW9Q1@@yYh=(8Su-Oy9`F;?~i{_3h>L)$#i5_~_*7 z(b>`d$@S%B@Gi8|)58Nmd8?bjyDOHKSJpSqPmZrYUu{kWm(xAVm$$oXGb4i|Q*)nw zy58U3TA65XwQH1Gl~idoRdCpfKwIC~?EKVVPoS+W(9#T2SEFfc>k5D$POZ)j{qBd* z*p$SO=g(h;hlj_eWFs-5PeWeBap^pEVIC$aI^_9-htCrUEHWG)`uN?eJ5MtcGl_he zvPM?T$D}1C#YJX9U@0%}K2OA;U>T{IXfimbIly~)c^n#zMyHbTR5Xl;rO0q$@4{ZZ z3Vjuxh9_eX7&3*zU@~YV0tTLy1%W}ckl@u>P;#M4QKQsoYvmOM*wmQF@Q^p5v1!?W zNs20K6;(13JBKSM6M?bFVY8SFHiw&2D6LVc^~M%YYkz;w;LPYmo1(ZE@U9m4&&v#g%oy zfFFBDMtWV&dS#8eMpCUeNH}@=;0DO-{OsgdUzg8evo|}l0n@4k5% z5*hyL@uO!i-$f>6fmnkjArfIF1?72pl$7_cUOaj5G$a)R>PYH`2jBkon}=^h(plwd zomy2@NXSl4NsLCrGol`U{~{TQgk@zy@w6OpVp*WzgV97I6DV{d4Fe;fh*EO+>$gwe z#74wHKtDlYNO&@x#iD_>1Ix;S!m=~c;$u^xXqHH;s?`|kOa?;vU$j%iA6Bbqx&mb+^~mYLrr?!{xSH z>|OxxmU@%LQY+*$Yr5MVHltD>SpVs#%d_=`>80(hnf}q4&C}~^&>hcC_t)lUXBPlT z93P)w1Mxs|9s#)9S)KSkU%&ozaBz4OJm!X)6$-1v z-q4`0k}IplQjJ!eBeZmN^?V!}2bFfP!>+B>SnSs3<_2@Em|etUQQ#4e?ml|{=H=rD z4}X04IyM7E;R*8@B1TS?K#a|fes=Hf!zXVdQeY?)68ZG`{a^p~$;&5EXp!DxRI6k{ z79N8_Ku~E>FYexXnTkRqpqWq{fCeG~k0S*2At4bM3XzTpu3wjN;$FY{@oh><8k_(M zJeG(hP=o%%V}c9^M2rauOGXfR60KULt81{{jz`g+EvKQ@Ya#i}~H*Y9ky8{|S3mMqfM>6rv1 zo?Dnpr2}j%3wX=T{*lqa&Ss5Tt+Tp)EsjQw&ePNC_OvL4LScS+eY4M@DVNG+dW%`3 z)~m`(NCHQ|>ok@sTem)49UUyp&aCck&wd=4-M;vAdw#qNa&i%{`^v^10J+QS^V6e) z{r$t^%d`FU#g(12?Ss=3&^1@~_D{~QFAg>rW`_Hx56+K3bN&1Y{O_3_LrJO5)=*cc zmX=q`OGLGrl02!cGtk=6J2*bKFx+a9l~$Bnu;^`0He)l2?g9Rc4cZLW6>kvpJhD0SGVOTPej)q|oxKcrC=!fT_+0bByfnG|$ z5y&(el?)gI)E6uQ5*HelilrBn*VfkR>l^CLHVGm!BqB0AIUzPGE)9;O^Mm*4^7)c7 zsjLv2o`DG7h0V#$Eh>?em&=qoeT~B6@^uXKcr?XazD(=#wKUo6`igQcmR#v_831lD z`NBLpO~9kb2D{3eTe|{*Hg989wc6_SyBahllIC`+LS<1_$gAa5DvQfrPNU?Nnj5S- z;6Z~3%eDIaZj;vF8J?Y8+@716-`Lxn>=~TeIK8>KIN99ZTAiDjTigIfJGr>Nxi~x8 z+uJ`r1%Ga@uJ0a$A$hjDw!XQ4bb4`qda%0-`povl+0M=Fr%yK*#|Lv=y5cfpQ=`?a z6qi)W#3G%gQmpZG`uuI3eZx~TgMO1tT&^@&+I#FuX#tVNrDL$f^yfc5dU*ebAMV|I z8Ip*}Efxu}@LZNaj>~xd{ja}y@G>eBiGZYlY8dhS^^f0$BVno7^pq=0;@^n@(h_0)BHTpTh~R zs8czG^5$;8xudJi(d-Mjm2x?#IyO@UGuPNuN}=Zoge7u=L7{Ij72>ERDo2aE&R{aA z*~on0zm^84qouREdt!5Y8#Ko4$*#V!<^7AR%d;(@-@@DyV94$Llgpdi>+|D-{lk;9 z!{fu9wbjl2_5IW1&E<{VgOhV$&HbI7-Ho+_Pq#;xSJ&59=f{T=0i~eKXf-v}*9ZmW zGD%szOQ*1Pc6)tZe``lqcdJ8JQC3lFF#3E-fv_m2OeW&w3b1dUJ$-opJ}_WZR1#h& z73C5j6cS$!k9vORH$MXSLc>$TUIw2{zyI`kC|>LHsN^O294a0(LI8(o3^wM)y}S4B zJ$eU$!XW8sSqKb)8eG{#kqHF;c}X%$id3L^5if@{L< z=@{tmo7lR&{ppu4N3;FCBlA1KJE?bex7HUISGTvfHvv7|0Q@^SJOEzX+1uYL z>vFl8n{BqnMq`acT%pt%J&i>KW*%3rk@1C6 zo{^1$Vkk@|1p_4_AlVoq7J($dvam>EWf2mJhCne8^#3@pC=`wc>OY=9z+sW_?39EA z2sOX3KrAV*)YR1$Chy^@h zaZzclUQ}m>7s%%y znVlS;TUj~&^wat2@#@FX@%gQ@+nY4w+Y}v8eeB8szPh`#(Iq^Q-UP!cbTeze3DLpflq# zXf#O7`)4nrvT!6w*yHYzD@6ML z9X-RdAE!rsj_#3*M|4Z4SGHwmMAK z29p**6)>C5=Jt9!yW8re#WH=pMu19=4SVtO(Zk0-J_?63sGuiun0O>CEiMI#MKY-* z0*Oq-!=j!)yz|Yy*Akh^psOzCmKAfUKowkYX%qAm)RVX2Z|>g#?I#VAnVg0ovN&Mk z0O4S81Uk6lh$Yadh%9=g5Cz3%L$Ode5{t(ovold>Je|kS=TUIkNipH!5g+0*;c$G8 zh{|Gf_@V+*Oe6r)h=>FjmP#YQ(^En1q4H%iv9h#CkOPnY@G3N&S|}3mWJ;w}S|u-S z)F_20I4ta40?XXh?Q#$B`X;zlv-jR}0*;w2u$Y;dnVHF!WXa6T9Ag|qoH)jSDTX+V2QS~6-^}dP*8Vly zI-``UlGJC(?&o_S_`3V;NBfUoovw_o9G&m$*liDI65<*JmMqXHcv2RLAv82holP}1 zH-yq-b2IY`6MaK-)4Olp-(0@feSGrf&Fib#OUV zw*bYDfHyz>^6~A}>C5BO^Q#w!$Jg(^{r%15+3Bl`v*VLj!03Gb{PEq#H>bxJm#4dn zErDqJKyPDvS9`WT5pC`nomqSGaH6%fqpPDSU9Yi5+D7JA)+R=J8sou8U9(Tg##QBn z?bhu(B@}JKr(&{|TB(RdCgF)ZU8F8u@6(Goe0)X0?OO#kUZ>p?a4J|nhf%En2X$*;1XunVVRUtA%2qYg)Zttu^W;JX0zn6DoNEr9iCE8gxn_ zM<7xd-MI(UYCai_L}F@lOKQ~ifIsAOINe4e7DJ>G5CmRs9?BqPk`yYX*4NaUY^sX{ z%{($0N#toA{$QY?sUZ@}wl?-QH@aDD0TIV>4(&YOdC=a{+5_-Yab-HQE796L(wDMo z^>U^oJ2uqX)IB^ldw+g6VB4o^P$L z&2@KgL^-*Jo$1uD|^KZ@+xJJU+g7eRKNk>TOVv|$aD|21xyl+J)G_wo|>EJ>*{K6ZqRT!YAL#; zthn&rox9~Ub<`s#6FGb~kANkhU<{Wx(bV8m^O#h0`Mq0rifbeyiBhK#vD`Kg+SD4I zQVxm_=oSJ;M3vnQm!F)F(q4 zIztYqTV(*18i{(X&W4`;rff@q!xB;1LVa>>_sL3IQ*+NyXV^$#$_zGFAd#x`8PysY zUzr@~Ye=_tbPtVBOw2yq+ueIGGQD^9{Ml&p^urE^gGC`T1wsy8%42c4%IM(w^V275 zYfIxBYY$dNTUz@jA8xNLKiuA4Tie{(fBId~(0FBN6Q!O3H~`U8JqIx4UP!ySb&kt=>;XQt3_(P$(q~K zED%W4xfyzmgocJxLtq3HimI?XZJuz@VX+zI5+<2Uri!f~CYp6(B3uQk)(}cJgyYG8 z7|%4?tVXrk=#QI#Su(^sdmCDY8Wn&ocnqqver9Q+y{WOYzo*_oBC-@ZwOR)xTdvHR zrPOd|GSkvLJ~KTwFfhG*f1=JD>qc1A4cvsgS15l5nt>0E&}J-e{`WOCy1 z!TQ4o4;Fi)9)D_Jes*$la%8f*WBlQx&CSW_rQPda|NUS8`Ny}bXM2Y)KfHf?^ZMq^ z+c&4D*SoE14wEaAo0C&dHxABjKL7Ob{Q2Ia&BuHDhc7N(tjz6Pyned1v9q`L{NmkK zUvq0`|Mw1@qo)4aA~+qECP!|)*>Nz z5`m%$q%xU^mQ8{eqY(%cnxd^wrBgAtQKi6PYw~UtmY0k5PKQpR0Eys_X>+MYCJ;!a zd^(3ofE3*;svyt>d^#0~pwb!gndL%7ZsU;E?l9{#8kyJ-jw=9o615nJs?lOGnF0T* z3?{R|tmYBnRh5-kEQuvEIX%Hd%x$$>G#WmgEfg!Q7Ly4WAb_96s+3ux>3B3~}Y^17K$}SF&c(LV@M2+vTk~HVZ48M>Cw)E zmDR=WpxvG57#`>w9vhp=1ltxj*B?$z&a5AQ{>Oj)*FQd=9~_*%&UL!V?PPedf4J8t zM`6LxKnUu_nXMC`iC;foA0KRQZtor(9KBp?NlhN*mPE|VtsJ~Nc`(@B-qJbRG143M zH}rdECXy)=y1W)9Z=PEiNQdg8;b_FIWHE>}`2|ok5~7OY%y}ip&mQz+=^`fq#^P45!gcd3=eKN0oB0<#+BD zR-h>y9+S=%NcEn8ODE=PwR(dIm>HX1t(Hp+!MI$a7Kt@t#UH89Vl{vem}}zVw*ei7 zRaMp!IYP0@8SzE@Akzz3MiE=A(Q1uOo7tq7kl`x3QzcOQlMNx8iiyI40<>Fn23Lq9 z1?ke}u(%qR7b1E&NlJ%dY~!m_?G1IQ_Kvhaq5%$6#uw4)Y#x_J=V&5zW`zUX!DeqH z)qVfTqeqJ)a}Oty*!Dh`%P7#vw4SgY55u9*1S*y98+bI@Gqo@_wej@H&h~6awxerk zprvtOabu&!+jM_xZFy#DYI*PN@BjI)e|$PSdU5j&c$fF@ZZ6L*UOZb*3Z*e$(C-d* zY+OG7_{;mNw;!(0jvj9T{0{dHrhS%<$0s`zjp@ejwafLf_Lg)w(H`$;4ftF7+sCG+ zCl^-d`!m`022nvdpKom(>}yWe=ca9RLVPs}54n?%Ce^ZqEI3@~t*>i{n?-bVWnnE6 zMz*FK647uhm5R6(DpqwtX-S^b?hMAmcBL5jN5G3VgN)0S%D5yY7ghA*t->lOfz4$z zc@l%&>oqHQOuf-)wg4|_*K0I#iO%2TQObd2DwH~l#i-S4olbC-Q19{iJO%*)0fke< zz!up;fEFb@E}J7&>P*(08hX4|9;_T@bK4YBgUb`LN||I5iKut@>?(yVDpG++uF{z; z>8X{msEp!~u*}VaeI2nxs;M~(2+x*#oM7|?O(q2vNx`x`K9xeI2{~d>Pik@Z(edNO zg_Ws{)m+~eQb=@ml`-DzKv!TYV88$?V?A4oBYh)_4_3A|))%Kn2Kq+^dwWL~A02FW z1?vZAm)2&c?yv7W|M=hk{qx(ax1YX#{r&9f=byg6-+QyWwKO=nwZ8puW&PmQ&CS=} zfB*9F%a`}S{p>v1*+1Hv@9dav9K@HyLo@SD^nM88bj^ves|Nz(A4C_)Y!zgCuRCmlRZ6+zz!|Z?icK5+;R!MsPGvk40|_0+*{$$kkd?sB3zv z%_)*|B(dSqmZ-}eOeE_9AdDIvPFJ+GKOMJ|Fcd6FuVr%unrO0nplkX$Fp0aX3(Ir; zjaI8gE0bufN<%npf)&FdNWkb4U(17$lt0`$I9Au#Gd4K^lH!?09kyv3_jgGvc_Ff$cUDhR+NcjAmK{e~OI)lxoB3B`lv4(6m5pYO9WH$F5pwYt6gWOH?Kd3|en=KkjL!s^cc z!P&>}pWlD@{Po+{*B^hnI{fr)YjtYl>hnMUb#ry`D%a5G?Yl4EKYsoh7?`u;7cWm= zT|Hgw2s>;Jx69>^1pUdLnbijaewEH;2?h1KXnWVl=x~4k*y8#~gO*0(XaUkaJ-q{+ znfho$y~E`Zs}+0-&}h0m)>iNJhdi#JPs2o4fAPsNwrDMb>3 zejkuS2}>+hsB@iAeIAFN39Z30R5C6fQ&>u13j{J_ZV{PYBV%D9B(7X05UOl;t5WAs zsZxzDV0!@ixs{)~oV9W2X;m;qD%H?Xm&4C&G}!~Ox&$5#hk`7~Wq_fyIHJvoWW5dh zr~fNYYP1_QI*m*rm&wEoWCfgM4go1oc#KMg)?zkj?CD%PrJmugp7F`9WGIpA;u&!n z4WQIru1M2Ne}6p(fhdQG_(X<473`b=Hsa*uVCV7H+RDQx`>P>vb1{X^*7mMu8wrlC zMWS&`O{`;Ku(_$RE)-TS8Z@zpxd;a^+3$qhXKLF0Wc=z_*d*Df5Uw`=Y{>!gFy?b-@>g?qBc>=CLVKN$|N~>H^pLHo@paMa9 zHyJbaQJ>WF01nY4#``@h`*F;1(} zs{U9!suq!JYbi3b!xe}IZ5oxqY%=HqT{Fu|OG{&e!&75z4OxfX>GrtI8l75icUb+& zmd2h&839{e%@dGW9JZ>ycYbaA+3CrXy~BgO-J{d}R*jHJl+{m9jkmivL@EkHW^2OT zQxAq(+gcJnf2N_SXMAdWWNmBb;OO9K?z#2l>x+Y}qus;v*RRg5-+cJ;_1m|vUw^tf zIllha*O~hduK)J)-~Q{bxh7e;slbbyw{O4x_WkDO`tst{tMgaWok6S36Ab$j4VlL7 z$(2VNivvlo-PYccu$evenRxf)V+~ISF-DbUvT6wz+QhEEwQY;lvo7-hk@MSWEN~2M$ zIVy`$%%oA-G9I0SEvdjVKyA4LZo3T>gMUoo6cQRJO0;EY`S9}DajqfR%j4}11Cv0p_bkkfHaP)va0D`QtaD~}<3x>U8*GbsZxULxc0%`^USh z(<9y4M0dsqM9Av)cg@buKUf@0XmLocH4t=%;?am#fg^GQ*;vFuqvGHY1cAoX#k&W_ zCsIlp4v9jP<=sV77&NZNY)INA94fr{9s-LhEr3usxpsdZn))Tz`4tHq+_ z;>k*nKi-h?t678^SS_TY3PonKS#%nSKp<0C3TG^tYHn=Gx)@cZWmqOxsM07@3b|6F zQAp@a7Mml;xgMKYt5T^=!M2ITrN#S;Q+@R^Bn-=9f#fXagSV3at@WoHn?`!9GOZHM z11g9^kgyb?!Poxa^y1a|*~yFjosC{25hJM^nVKAI@L0?imp78>n_habP!HZ+qV|b6 zTz$jL<3n)$`K#+3DZV~?{pIH1#nYXW*ROL6%zpm%@%^W-mv(MLUn z+&?}&JAU@;^!noU_08AcKA$`T#rtS&d2y(}t2xuyIk33>bZudC|KN0geR*MKsJk_4 z5Hi^!wZD6IdiKH6phJWsNSwi-E8w%J1lZy-ls@csY0y-3bp;edBoRagPxDxpmyd^| zkmUtM1S*-x)VkbZIi?m?4a4yz0(>o5r0{vYey>d}6avGi)@U>a1*IC!HyCMrBEYYp z5XX|pjs93D;&VFfS|)xrR<+iBhXoOT;1}Uno=B zyg`pyqcK|C_5F)$^CJ@-K?$M~uQq4^(qbNiPU9*yYLmaabF|YSHJJz!77|awvuRAe z%v68>`1DzM*9Qk@Cr@7;?w`N^`04wXpMLrJ?&ibyH!?(|K^t88`r%*y@4x=~)A7sG z)0aojuRi{P-|ruvAM9=}k9Reu2F7M*CnxVeT;4m{SXh0qxbfgVh$p?BjXnjFLg7lo z{WGKED@#Kf9)T(c_<8&;ISpNL>xUA)Nuw54GjWhgC<>dKq(O>f^==6s0*4jdEx-~9 z1g<^RY$g{MR={a0lf%fT33Qf7I2iO<6+D4Z0t8U2Rf;Gmrp@mpa>xV@wjhtll`2di zAx6ExMd}!E8b_8}p=3AcgklZAFDNE6c?^y!m+Eact5qRpprKfS$?QucTv8&mycUbB zEUiYO@H7^ah=Nu_a3WW#rKP1Qn-1$~)%m4xx>Ti*h{a+Nuuxi^-efizjRuo97Ox8% zIb3Uf>(JuL-2E7ERY+;btQB#15+R#QXG>)gQ(|F$vZvn6BZ{dgERjg#QxQy$&)oCj z`Xsl=`u^nFSXe6Zbx%yp3}+J!=}<>Ud(Y_1^zew^XcWtgYMVjpX`kQTy}G*j{Oj+( zegE=m_tDe+CmYB6FW!Iun47}=W1Hq*pV9f+s7L(!FaP|X|LZ@$yuUs>Jw7=(yS)14 z;`HO&z1^GRH*Yq>e06&3;qu)4gN=s|CdO9QXZpI56N~LGZ_DUFP{HRgMaE>u{e_8* z^%fBk!_vD$^&X3yQk{S2)(>~9ap)QdUPwjMzyVkcGz86+a)}rWvZgpMuaHedphTf$ zSVu0nUBxxJ%tnn=DAn7;k!aX!0sc>`(@4b%ZI)F+u=rdq8jVKA))e2vP(?bMCjjuX zSxs_61&%G1>s>%G^%B0EFAn)76poO^QE2rhkREMTnV5xxVfk8}&FeM@skoxD%8If| zI0lBqkw|z{Z6%Z_btjt|yW5-75hD{(QeIt)V+dqYiAW@p%H_J;`#2qTmBkJ0m_>qD z)pbwapXkg;;V6j-*e111Bo=dNbeceKwfM6WC&Q43WnjUzd-@$B83>(?K?{`CF& zXyd`7r%$$yb`D>EeEUAPsO6_zPxu|4$`tY{-u>;L|M};yA1+=3t^1>&{La&Z)2r97 zuaCC|yj+HBcz17S`|-|`M_uiGbJHzei_+mz&;-7gM!SGP#8Sk`=CP@X_0^1sMw40{ z4q)*(n2LLM@7%dpUJI>&5Vr6I>!)6r;I0OWSC6lRgiH^%b)|8c0g49)214E!t zK#E}$r7xLDceG}cVVjhNLBlI6YT2qBZ2}GenNM%FJDo07uEmAdV-y%8>E`Byi$|jB z<8h}(tCY#*A~v1HQ+uMZbVqM*PkTCGR~4$%Q?0G(mfpeM?!k#}qgbOg+kkg6+Jdcf+n|`P-@U)N*jbwa-@UW5`(*Fz z^775s-+sx>x_|tzA~iY^E%k5z^RK^s|8Vhq|NQ(s2jJ=V-@jg7zCGLQjv1AP=+v|Q zz1=5kGebQRrN!@%v6vQeLR z7nhe7LMc2plfk4C(Y0tYi_IWmNd#p1y<4~QFf^V>sh837i>uHKsotzNTdfwGC*<`9 z0$#g8t#`+B-U08=@|YjETjeq1DiG2vOU%@pS9S_QvYc;_~WjlU`s0UObyg#^MdF9oded zk@i&c@Pt?I3#XD+gVF4YHT4XP&22n8KY6k`Gu+!Zxw`#y|KM3}cJ}>mzy0$4^Shg? z1*y{6@p$iV|NS4|-(8kkG%}SX);Yj6exH_FQ&zzOPQ~i6YgKv?i$|uKd@{C7CFFtfwE}}< z)-$+#79sbfh0UPSg?gt)PJkgXh-w79x}v4 zB@^?xOcFNuWVR5Gsl{9R=SCN|_P6d&EN)I`wIXNtPe*g8S&u=f!9*9}a(GUOp z*MENd`1<<#;$;8m*~{bO7tc>y<$M~1WY6|L`T)px|73S-sl%bvbWN>oZaw?>k8f8O z&)cXtW4L)_d~D)Ai1&3J!^<-f1&=Kju^DVcWnn>4X-Q#u!M(iOx2os{t&~m1;qbL= zgIP+$lZcp_{2za~UF-@5ElL5gs+K0xYt=f7Cm4G65&CanTkJ%gB3d#3~| z)@qG*4!{pjW^x!*Do1Sx5yRt>V~g(<^E7scJK!?tEm9T-hf@a?9Dtt?(5J)gvg%b7 zwvb0cAy6bTnM4)p-C8!H8iqu`Feq4cMOkS{1%|701{2A~rpAOzD-oLQ4m}T#s3j1H z6b4r)`Qum>fS<)EW$`o?107meSW;46qxQAUZawUF8~9WPgRY8nwlzeenWi*wLd}`F zNI=b@utjpcLqM&Ca=a}aeRG@Z)5Fsb2I4ZFy=QzN5U6YKZf>$2-yl$I8BUb3GW*HIk=W^gp4O%^u zPQnwYEG~yiWXP>@)3lOi{q>>O=A|Xf( zP!tA7q;OScHUY#xcr6@>K)@l@RTVXO9#GwQu9;TaXH?3;k7Cnuu~0IJNT$%3Y>-1i z3RSDD7L8bLby|gZ7=}W?VD;Y2@WbuVh*`+svq=(vrZE*xv@|CgGTFv#L$XfKr?5my zd&HsU(OE)sBnD_|VsvDr(Z#|`5*=;va9w*>QwDr>^f$R&*=DUotFeb%YN^!TG&BG- z)R2Uu>u*1OxH{jE3y0RO{`bd!e!ITBd3$~O;`#HV z-K~}T-3AIED%a|h%|{1EdoN#4G{-_VZD4Tm=-r203!o2=p8fmW45MkA7M3Q*#>Zys z!N@nYg&kU{n2Cbppw$&{EVibgxTv(Uq@V&vrn8w80)>g^8%<&|8VRkq_v2rFEJM0% zDv?A=t1gD;HtLxS9$(PswB~4pefnw6BB=91$IDkZzN~IGNvn?D8 zG}^^d8JEf71^ULvCkC3VVy=u&;MfE4L^R#q9?0RWTFWmevRE7>1`NePu1WP4B@(T*fp_N7D=n5o-&7c7g-2Tg-Z&%?RKp^;h^zGZF z7@k5QVmn-Jr_JW_JKbKd)2vY#loAo2iLOC`G^SE3BveXnG^sQJ1xpf}T`srBZ4u!s z3rQlq#p$!FL`oi8#1i=HWLyzPV$%6sc86WZ!IAhnotT1vLTjpEc$PqnLLzG62%vxn zBnpMBtwmrN61_7JPNmWf4GEuBV+2K}5#}DR5lCbr7DWVQ1o$(PN`Pz|%Oo2bA{Mn; zuXMD|&v(WA8X}p2A@F%Zl_TERSRZa|NH*j;8~R*ktufFxHaOUsbgBeAyH9UupBm^- zn1CaPpjmczB;C^1oK2^jJ6h_JEe$$}T&bxOI?mgpQB9vf_LjB80q5(Nb#D&3LZ z^_SCNlw^Zn(4W?)L&2kt*y-+giY z?&ihTVr#<4mBg3N-n_kjzPk& z27^b#YHAAa6_ga`6+y}obb)|HCDFKIJ`IOP*A(BmT>>BjzLYDV!wbs_@=A~tI!$G? zS#$VecY{SIA|d5^n_VX$VIVaS1fEPG!eLMdaP~+P22Z3?sgz16 zh9=Zl9N}nPwmBQ~X>*evx&0PYJPyb$kHcazxk9`Xeb@`+ntI2`MIgV*1AZ%F4YutHn;k$ev?|K0GgBp_FPs z*3nul2006ltOb7DVp8)ckm?#Z1_iIGsi^_{34;^KR3@9lVOIlKnc|#V4X0aM>chEB zFB-Eus1j016c!&8B1oPr4nG`EH>B&64arP4;RMOlV=@L(sbtDXB{8rB4udPwI{cw< z*dK_bI|oLF+OtuQFFCk4HQJS}Z|E9n$T~EkxJ73%IN~u)Z9atS%QiMNb#%2fHl;%0 zbVwnT@RbH00Z*0ryBF3UEiSB0L=*xd3JOKj#434g@%+ozPanR2`S9U-Z@N7in*a3e z<1fE`c>U@uw=QsFbL;WuTu&y|J2gGCFh9BaI?^ zXS3P1xD-V%uQs%GcMePq^fpBs!fZ0K28za`AY=-iLBZ8lR}>XjlowZ^MRJW=NW%iA zf>e~20ox9%rHYjz27xW+;mY&x6&4oe=acv#!ICIt06!{^!T0%u0+mE*))@6tD!dv+ z)&UtZ>qHD#b!8O{2C1wDxvvHaN6_d@fF6sD$CIdRkwRl~hO(U<4KcMsDpi?1VXq~3 z%mm1sBqm=Z;IdNb`gk;!YH4-O~#XC#D_@8R={i293p&C00}F{_*>dZ*M+*`to3>4+lQBL-@RV%YVAmB z2%@55bAL~B@7UDBU{hZs4-2hA^L0k8OvK}G>FAp3veN3RG6;!4Wzvag6bgeuA!-pA z0=x!B7R#APJeiEHEXccex1gxtUNMZo7YO(~iNV#>kO(-<20fK8qSQcGCY{-+HCiP& z9EpO3RKhS!Iz87sStQfja`@e?#4%Ysxkf2ea2P_4IO68=R5Fd-;LvlCDM(NtS!|K!5r>^QKaPG_Wj z1e8L5OGBp7X=k7$7OhsVGkKFSHL(g2FCl1XKzISE6FG7%WY+dvt7b zZeerS$dZuA3?>1uYG~+N+C4ctJ9~BU_WPG-13s&${`8mcKmYXWx3|~VuP@IRbGu|l zlMZ)wbZ&X$VXlAu)$7x}O$k@symkKm`^T4?n=jsd`TXg0eX=)YWV7?`@Z1KCH`UVD z6m3g$K{(^-e2J9TtWv6E3=E{atg5OUL90dMuqY%Jk4ESETRwY&oI5MH4E+FD5MJk)Yp`z84)w0!ozt?M5bBMJS_wM9Z!qI<} zUo9G&>n<-=s&!1ZP^QXlG1Hk{es69SlumCnnJr$I-D*^F$V604MGcN4Q&{Vo!EigB zfrwWx;&9a}NApmBYhzNu6*5?SGEZrBxqPvP-l6FSkDshBwKS#Tu}sgz)b#X7dqaI4 zLqH;$LKZy`S97o~WS}FekYax-8xABo2fJEYLK>BlBi0C5G?u2WZ)9+BZh5)GAW+a5 zd;tMx9v+)n+Io6$bhNkk;^yPCp^%Sh-un3MmtVer$eph9^4aLf=IsDfL0WtHUxg~b&J zy29$S%K1F0(e2K)W7TO?;1UFaC^qX&W(^Nr`~wV)MOGGyb1Sc;9Q;fbRn;&A8d95^ zeCP0p46)u0KGmSpn;lN8(PA;1EOw{c?{T_Zc7uvdBcKr=dI;3+SRxhrW024|ca7pS(F+>If2rBL^pMzI?bodHM3>#q-&z>E*SVMn`7w{?hW=>fHV1&8Oh< zeLjZWdi>@4uY21Yk6+$=%uN-}4G;IX*f@~V0w7$7vMOjfijK`SaQB3w@r*~Ku~>w- zn$nW;@(Lu2NB~8LrSt7ZV8UfQM(*@3I2?&(6X6wQER3YKXI7~5L z9*^+JWEhfyqazA__~FjoTSc{W78zDnT2^@XPTsw|yTv7?Wfc%O5(Wby9#T_Ix{=cTHn^y+tW8VwGdBco15Evhq4hClxJ}S48BMp+T2p# z(_rP{@l0XTYxCD7vmHK#L_p$d6$+uqRNvXwFtD^X5VD#KN-CB@)t~~aORH+>Y!;!Wv;qbxE2^PuT|uYaVs(0aK8Mp~H!Aon z9<~N0G+A{Pi;h$E!e$20^s;Gn_bLRqp7!Swt_10iIZqFv; zb?Ia<*RkB`3C8OKet)h3p)HcA3)?kP5gvxYqZI9vvr9{ZAvq)W7*+$I^@<%jpI4#4 z2qbz}w7$N+d0=|7r?IiMw>8@~G&$DSk~@1e)->JL=oPV4fmGUS4>osqb!ErHd>N$( z>a^NItzDV0ML=TkKx7gMRjy#Pp}TQyXE2%aa9MmRoM3M18Jt~S-FW)s;qKAi_T&A% ztt=TA8eKj-d%C;xWbfJGh4kx|tcp^PO~n!Vw8Jm!#*i7YOmvaF~WC?HYh4?0A2 ziLWV>@Y{4UE)|D@R#ZTcI0l18fL8)CtE|R}tbvHb9q_xIPPf}?ck5_a0s(_%D2;lh z8Dxi|KmX}A@Q&40mEZ-&5eKwXs8%!J6@_<@WWGY9QESy=GF{H)2VBHjVl5O;$l-Ud zAn(qP_o@gCQq?U0UvB&8kAKN4t;pd=As}H;cx^45p)j~(5mzhW$%`)!q4rQli(;fP)hC(s0@XmfX8|M>je zXm3w%T_jZB*3+JCPbTVpdRNQPNO#=n4fwMy?QI?1UG2>it@VRh0U1x^nG@OifRRUH zaM=tdk0*DABFVP)`KQ}sb!s}WP$+>b)!IEadw*^3Xm|HuZ)fkt)8&34JuWdsZyhN6o#A`zXZ5{Tm_G=xwK(m`qd|H1EeUKzluI`0qs zz(4LR|Qj6xZ$mm)a0$ELx=$+x*+T>U)qD~m%hHIob?p$Oy(4%=ox9QR=fSR&uqG&DIkGkbq|`Toq_>R?M_b4%-BM`J?Il1H=srJUqX+yuLhpet5XEzMPB&y>6#YLPio? z_m7X($HpIC|Md0K_ZQFh9^PL*`f&60r|Zqp-oCNvhmWUxEIdvY%r>PHk&wrrkZWx| z7OJGE1_`SK{-qL1(AG7@Lw-4qAME#0s;X+CImWC48V0L@qcI2=tQG;Qu0b=US_i<- znd`@6F{(H?IIN0h^tpkm8Z;sb0*b-|-XxI;=voYsN&y*yAr{k0f4EnTsLa1z2*=h| zKuAo9j<0C4VPSX#j6?zW-Ok}xTvUOgP*Iftzk=Kj{QRN{IFZ5TsMT^V0f|6Y!^v`I zG?|Gc5&?_Om@B_XEE*1GqIR`hWA#MqlTnvWCdT14(fa;MSK$Z97j!5gui@lANjpNrB=dTZ+tUuh^+1p#5otj^o>1|9{+(7?eYZ zx>RR6;u4{Vs(^+9sRH@AvZAu88Ulq@Kv1Cmpg`3s%d1f|p2?m|4mO9yq5RD>vUS6pNKQy^My2Bddx4Kl#JC>N6=-dW+W| z428qtP&)250Qc(xo;v8zDdiNBDxB!OpF1UbxCto3Yj)+@HBO`FtIQw#oRPJ zF*GtZ($g68CEF%eR;PO!GvQF&r*~xAr?+2RUOt&MC5Gqc#)pU6TW7X+&dwJJB(^?W z?>F)3bS{@lX3_CfO)%Nm-r1dyQ0P=R8$*`R%8CAtq4CLuN4t-oY|RgjEN`yQx7J1L zrl0L^uWr72`|9-d+Wgq?#KMD(m+SM(TU!qwY)&=R^*lV-UE4l7zq-D8ce1xMIk$R$ zaC91c{6J4vS9@b!&=;<2&19Og>6ZSslvgX}3#I7l(ozT#UQ=FNT7#mSGc75fnoH*h zL<|hH28zN0&z?)r&~hjW4X>{F!@*QSuoRg(*N4?;*6KufC<2RD7_GY8);und7&e#3 z#}KGY28~3Z&}bAAiOQ7eRg~(o;{39_KLJTAxc6g84Oz?mp%zA@{GopUzk7vM z06$FS-8=wYaZzDmVFf66xl97`KL-Oe_12FVW5DN*IF)?9Om7Vb1HoXfFTEc`8IS|r z{!qZKRY<8gvCWem&UG&8OuH0pu~@E~qGWM_W0n^=77`fw7WvlXb8lbY^JHb zt0$9cYH0ux*x=Lh$XLLh`K8cWXjMs3c`c4*PP<$x5>=%W@JLVyhC(Ic(6H*tYAC!4 zjzPmJiVI7C&4EBs1Ry73u|%#Gim26PXpX>W)QN#hXEK;Mqrhj==nN*4PNh(2bTS@K zVTpAb2KfHGih>{i+yDJTe(|k>B9w?Lj+xO=0s=vym;8|*?%lnWSB7QM5oP}ezv80& z{1OC9Dwp!rRwEw+gJ5s}32luATwX1U#E=`T(Qv>Q2u9;(iw#5>m(vF@B@17!FoLv1EIC+6PCPjJUFUP-rclYfQ9v$Ab;o zpexieva)w}eXwXE(lQU0CZ?yF$F?55|MgMADmA7$k`4izEnpLH6c!dM4m9FZzsT*D-{|XE-EQR@JpIAps>o4g8VW#j;@dMWR!B0#VrEW0-?)9bSfTjD=;I~2n-fpUXWK@ zgFw~7kaz@+%4D(y5;_B2SV)j*L39w%NF*|wCzMD9G(3k5;LEk{rBO*(9EB-RE9tQE zlKi5Q;sRhY3-9LNs}%~wF&hDfgkl(Y@Pm{U{^c(}6qi8=3<|99_T79ypZTC3D=JIN z@gj-VYFE>03Q>8tD4~o;Y8GOuQB0+=t}Ye{c$_w&SR#@r%ub)(WOcjLTs&8$RqMR< z*@k4Y&a38$6iPk`$B;R^?qJub8(I$Hp)fVv-!d@TsKHd%z_54>%^1&SqP|cn9kzD% zubf^TJvnSbR?D27^KG3SquVzh4j1Y)zNT)vqSw&I3gYarx+4x z8@2*N)buZ}udl9ctxnA@^!t6iODpS}OC6E;z|!N@wda>-Cs#Y5G&deSeQ^qs;LelB zyH5^g;@y|Op6$Fm*+0Dg@aAA+WaeNwZqq6??o4NMB9m=y>+I2+!b9DHRd{gMemG=wbz*PNP$)Ao5dixrtXuWi3r3BGnY!%`3cj z=f^+&`NzA3d8LI_44yP(CBQMYSQ@rCFRv)qkmOE&1(wM`mES8UDk&*0ECBJLyrdj2 z6e>*?6$4fbz4IeVW08<(sFLDpvPk6##FELF&ncG(xViIFgI*8_ZAzX;~i*JT^xy#sTP zca~@FhoI#&NqB6qvukAY;%09?>1Z5?CbDKdP*f_70YOtF&P;34$05{IU{!V9T~Ps^ zMv*oxJzQUZbg;8JIoInk)%OqXz1$yCYes63M5=Wo(u+)%b^i*C?pDqCrKkFLqI4f$h-BI zKmF;)yn?$W`Q;Qk&uzjZ2xuGyarZAj`8*n9b?4~Ly(e#8Ke@O%>WgN2`!_FM-JYFX**UuV z;+t<@UtYapKSM*7oUCo;hS$izIgWb!`thV<-@yu-h5B3 ze|mLwdT3!`adBa8W@?~T%4O4usN1NwyL2#z1pz*%P^n~|R4kDTX*`Kctnuf&i%|S*daFUBGw6VR zdX-!%;BuJ+Do-szcDiA3txbRa;)@%ts5U$bFAzv0Au(Sr5=oh@H*U0JT2UmWLSyqf zlw2BxgvSv`WT8^QY->j2`68{=Wl_N-GS6t0(@A_bjYOg`*=(u3BVWoUlWwILP^H-D zj%V}POxox3c^!HwPc9V+MPiZ2gmefBc4PuUuiYCkKy+P4&+PGodpFm|yAv+0L@eZq zef8<_N-7f04sRTvUp#yHXm_-`5p|d)^3M77_1%Z>K3<+I&fdEf(s}hZrOBo?dJJ-X zq}CUe(S*9#_|f^@gM-cfLfUFB&u`p3zIglo#dqI784G(tk|!dO4N(a=0+CFSn)GrJL}H888oeh|Eyo>3i_`6pi`Y~G zGKoxO0W*qgMv<8i2vru13&dkFs8}Lf?TJQw0hit34|;4eflzJIs`NTF7@b;$RLo{D zsc1AAjqDM|ktoeKfPP=LqFX>PGU*&w2$UVMNJ2w5H=%H7EW={9dV)Tkm`(vD8ABk+ z%_dfBb88EU%2isd204nRi-uHG9FNPUlL!O?l`XS|Iy1R^KrIAAk1NvqJG0<%h2lZI z0AiU;Mw7|n1V3Ut-BlkP@|z_>jh@>=(p8pkUp#rZvp7&lcuh)~1eW>xM*9n?NFdR_ zb^pbi&tJd2H&g8E&VFnYF#+Cm%n({_6En&80P2vl~zDZEr4)EN>s5p5DH-|L$-9_uDtG zuCCrZy8Gzyo&BA1&|5!we*OBz3cym$XGqej|7GbN&OGMY%HQt%iofx!{!JsriauDD4m5(zjGojaDzBqHuWz$6jsebHDv z5(q{UPOHToO(o-gMU)+sEs({rRXvD;0=@GFQ3LTg<0oowc=lmv26O z{_1kAmhQ@QMm4(X_Ws?M-+c4(!Nslf9f!=Jvg_Fn^X-T8!>Nqh=8L8lPqr6k`vUG{V}9>=cmC7QzkYsx_44}J>E5lw z&4sygw!C!y>iOf#v%61TUOjraeERg!gwDP@y}Yx%GB>w4joeu=(&+B5bOwC@gghRf zPY;pl5Ea|jhNpqzZ8s{UFpDeDctZYgs@UNL#N;&F3=%e#h{ux{0;O6+Y9e9r3;>2O z#1<-LEIJ1k$+Z?22tU0{VX_%yOd4Bd)+v-q2`msvL@=L%BjTIB_@V_xq|wNDbjz22 z{_~Ai46zN_t%xR>JEQ_RED$q@XcUFT7U`^JizgDYt6???gG{6Htu{WE4BROiLl=Pr zfrX4wznFk-$CJRo!vQRn8N7*nS2g8U3;6<}Ol6CeD(SG%pjF5WflMgg*%^y=q_c7G zOJ!qjC65NdFdZ-P3~V1B+&o;FA1?Sb0yYN_k*_i`-dpc2=Xw`UKvsMG?#<~;MUvY58Dfez8l>lWM)S^^K`#pT2(e^wrzz#|JB`t21MxwZYl#2QQ!9 zzc@L$eDn15=;niyxxB`?0OELiadu^Qc7E~qHU)jf4&(-QC*l{SWHOIVY;SHSawSTG zQ6Un+kdPy?N248uu1q8p4Y^Igf3m3*GL^^_>2wlu6REwO3Q-vX79>#0SuBxSYcQGZ zE{|6)7HN!10g=Gc+VnE1T88K+5%S46GP&)GFWT{RHbld4oLR>5=|&((kl69QH`aYvQ1A94fA@>G#9YW(~~c^QaPt zWe9g>dwPn|^hGO?$wKsNY5KAiLt>zrbTSP~bwnk6xd8YV5*|;4 zBs!}v7)x}ge)00SH{R9T8S6fO`Rw}BgVo*pZ@&NdoIJ>-cs< zPPbSXaAC4{bo>6(55N5S-JRvpvC;m)>4mX@iLJZm4{x15d~$Jje`CuRFtTLssriMa zwav}drLm30Vs31*6g8?G(P*SIr6VC&j#L0kK~4k7Pi^%%ec_H&Co(C{ zBjU+SuEOk(cyusCBH)RDQQM?upF={$69`0>L_{Ib$ZWMMkuQ~dYsiwEP$btFbP^7o zs?r*bI-SAf4s_(Z`x^b(s9mFw2w}NIrjm&bq2$2U>B-L8%0N%rqf;5}Mjfk}5$?`x zuFj5)uN*(RwXt#g>5CVy?u{g~nQ&=s{occS`&Do9>Gj8tpFcj{&F3;5ey=|az`D^t z+$e(2@+1oRRJ=MeJ~FkmesXeibN6^>+N)$SSt3Va_~^;KyAM`US{aum@syjQ%Z+mH(7?dx!uY`0>aE+y`$u;l+`F~0SmnWtRmS;&^dguN-JjpF>oY0 z5Q5BLF&Qk8%HavckfWRig-CADaj|V=q1K?0iA`#;Kq!^TWGo7e-1a3PJ`#ljV!frM zwXLlUg=)v6$t*lG7=*b}SS({p{~+B@<2w6~r8sFE`k1W}_L0MrPD- z7^BN)gUMJz3qfSF$~Y_rYzSt$d;10&-6_Ar=8U@lrt?Kook}KEX!UxNGn%jV_SRx< zgIp}+bCgnM5^;9%iY~&w?z%IxfqycSR&O%`ueB0 zk8W+RF87ziCbcPAp6ctXC*9?ncMtdXcb11r4s&$=$;$_av(gZVV0gS5mQvH&N^!UOTwCGSeH=@&Qcyr?>V_?jCOM9iEZ1o2_aDA^a`b4XoO42g(B$UX^*7&rb$z`*P#c?{9h({(9-Cj^-aff=cK>vLZN9>n zifHPN?Va77wVAR>W~4$<&zCY4SH#S)K2p@AP{3OEc3g$?YBEtpKjyf$QwNGGMXVd!Gy zB#GRlm5XIEiAc<1a9H@(R^a!^K!Y0~d17%`JRVIz;~97;4ERB#)R;l;)rcXcKyI+O z!@%-~A~p$=itN5-LJ$P2%|eKPLSfKoolz&Iv^Td9U~?c6_Bl+TpMSio^30 z)6+#~YV~AialD>&sx%r;b$V`Qez3#l4SPMYm4%X1!=xK;zxw|B50|$V`i92G`n!wy zY%WutI=pu@J~cg<^Jt_TNo?WP`t;n^`sUvDWG=vGQs}D0!1VIL?UVb@&-ZtBH-@7o zXJQ(7lC!h>53kQQ*YX8E_AO=}92qLtj zaCl_m`pYj+?Px?n90uq|$FZVeF|1MPEefrSN2gF2kj8-A0vYhR4MGN$39*<=8ksA%WM4(Lpb5`STr)ZN~Lz1Eq04F zT&X%?p~`6U*xhD(P|sK0e*43V&Hj8xZE$>Yw7=09?@e_!cJH1{PEAjZH7Yqjk7_9o zu01-txv{l2TIz%tbhf2DKD~8-_?d_Mn~$EX^%M%7PDijbJiC48{-dYYU%lR~4-Jn_ z&8=?j?(W^(-&viT%CHnlzA3f6vbnuH(p@U&l3s(sBqp}t=?oT^iEnCdZEkMClF3v$ zjSdOrMwiQMv>4^ELJ!zWsI<6U2A$3Ah}y&~79Z(iK*C|c`}?99MWC|8DuawoCg5>c zDqC)}S#&CiO0N?$ux&)PTrT8G^&YcaDEhtrk!chR3P2{Zo9s`2Z2i6bp;0(eJC=%P z#XNkDT&gk4Wh@*DPa9)4J`Fe?CX>k^gMUsGbLk*uV9*wu)23I5VX-w7 zjHI(2QDmQWS235%WD1pXI;Pg!Bgwc!LuPP*!Gc&KsZwt=>a|D>wYwZvv)*WT1}d|| zLj(Pd-tICO+12{=?%kc;L91AA6!FDsgVEyj=oL~47ZO`N8oofLv3R5=d!*@f zdwaB8EQ0u(92*%O8yTo%dl&b1!8@N@-CSQ9aMKC$2!1d=GsW5P)v9FjVcKf{Uw1;rE)kF0(cpyb^?`ztjDs%YNQ8_%jYsk6-p^AQkuMe zr(O>%IH(&UK8KB*yyLJ*&3^zKKxcA9N}Ys71_5;gOJYfoC0eQ4sNo}X${_CfARz~B zaz0O_P{|m0JiZ+Tk{`Ogt)-<2gTZ1!C;~T$!cg(-xShq6h!uK?o`=KIxlAI!O0zo< z3R!`E6dI6_#iRi7+d=4qal?i{GJwTmkx1r>MPk`(EZSM+oGw6 zO+jX`=|mC}*lC&0>hT9XcB|EntWg+DPFJ8fIWk!9MgCo((mOc4eRj3Gyf9#BMeBve zaLmTXH4{mYM8alrI06MQvSz0x5R4{GY^f=l4mv{R!Tynn$+6L~$?Dkb)bz^6+Tr@_ z!uG+=^7v@hptUKnu2AFn!9vO@xA>Don`At5m+I4iZTP5|~Q^l!+tY0kRQDL?R2su3EyvV}V>W0xug73soTA zVL2aQCeV+<o(+^g^va(cv|#Nsxd`r?Q1UyUl4)sf-p+z-e>4!T%gj<-7U@yL$%4`pexz zQzIiwCy(yk>d7Rc4vje!sKhJ|n5b4NpfI2iqrm zeYsL1ol95+bQ%-ZIz2YC#pZI`R4f2k5SuTz0z|50N~O+X)&P9GT&A`M6H&h%x%NBg zwwuH>8eijx#yv^~o^%7pp|fOs0Ux5`+nc{6)7Y>?p;9V@d?AN`!6BQ+K$dZ2@+QC? zBxG@lLImmo{YYdgjmG5(-;qeqY6Y15X&|4f~pIOWx zg9=C^;n64*io{ddqPc{}uHr#Fi9&Am1-*fe&TuS+xRz8JAVQ(Lr$Y~$6WNeirGR)s z9>nBHVnMG{&EqTW;dsy+iXi9CdK-h|Geg6Zv!gwI6Kk_mOE+(=j)y#Uqg?JOWhx23 zM{OS&DtNR~0YoNJnH;%MD>9k`*<9FeHCWv)hcnb!2fP8E#$f-%+Sc;I$`TOpcLhgl zjrqAwfn1#3-yQDMGgz8LPfu5OdHe3!i)Rn6-dw+W_3rDx{QS?q|Mcz0x7V*;UO$*k z+2kCZMx{0eiUU<7oTtV{2aGbVCewSmyM5=Nmd+0HWi?Q z+8QnnFKi5Vbyrg55~%P-m0V@@MSXUI(dG?BJvN(Bt}r-5$#h4+ZP#GhX>^W^$AYLN zEE?6$=E7oNQ=}3e7v>N#1eQX>rwi@T{<@Wj#{g`{QD}4o8u5tJO#^H^+w)M~MsWo*9MlgM>O6X|57F*!Fk zzqSK%-s*H?U}k=5e0qMO9QKF8Zk^hhNCSzZf$Hsp*^E&nROrnrp-5|13k{A)zL<`O z)h4&gVzT)wJ@vt%!A9TE(Cp6s>O8VOu&}heyu2~p(=|F>0YaDeb|%3frb~j|^~O;D z&3k7rUYb%>+3hqHj^s3*_}lC2dmAlSiUhnKHOjL*2o2> z?xEAY{fD>fnQ}S}Og>_z^qu8gb+X59u$Z+HvC3=@q^cteJI71)S~XLyMx%bKMy@p4 z!(JN_q+Yv5VQ>J)7VXTJtBvv57`=r==StZu1_cjr3@w%b^(0~#1}>FD!jTwq4I9re zhKK6LwwC5Uwc?0m8kLO4;fWMFTObrkgs>2~%o4Ub4*aM={R$O-@==uT!!r9!?~?rZe*4h*DB ze0w(Ikjpekw*xjZXQVaS3^JuTnC~ed-#aqDwX?N-bpK#)Z)bjBXl58#$o{-n7s%GS zlRl@zD3G~>$&u})*@2Y9#q$D&+h?v zNA4b&U0z$?*jSqxsMmA;Sa|5x&RosQA=CAV>d^H3!>12lyto3AfslLu`MZDo{Qal* zZ{NND^m@O`*D<)XIN6)>nUqq0XZOHBU$rYPQ;BSSqbEm4PwtO()p8wPr`xJh+wG}b zJUf`zYYl*Cwa#$9Iy5o8xOKSIU#sQHwNyId)FUS@{T_z{{5EPfjfKpSb!H2dYGZ2i zsLE*u)*NQCnI!OLF*vzGfpiVv@R$&fM

>3N@phAhq?B6*q1)Hxn3iDh1gIL8UU- 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

dy?XcE*B?&rA3q)@ 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 R>gwv^^aR`ZhrRWy{|C9b3Z?)6 diff --git a/driver/image.ppm b/driver/image.ppm deleted file mode 100644 index 3823fe48b0ef0e6342cd8c3c13e7bb1d26e79ff1..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 457020 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

)9WL+RtR3G!SiflO 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 t - - -/* - * 'cupsLutDelete()' - Free the memory used by a lookup table. - */ - -void -cupsLutDelete(cups_lut_t *lut) /* I - Lookup table to free */ -{ - if (lut != NULL) - free(lut); -} - - -/* - * 'cupsLutLoad()' - Load a LUT from a PPD file. - */ - -cups_lut_t * /* O - New lookup table */ -cupsLutLoad(ppd_file_t *ppd, /* I - PPD file */ - const char *colormodel, /* I - Color model */ - const char *media, /* I - Media type */ - const char *resolution, /* I - Resolution */ - const char *ink) /* I - Ink name */ -{ - char name[PPD_MAX_NAME], /* Attribute name */ - spec[PPD_MAX_NAME]; /* Attribute spec */ - ppd_attr_t *attr; /* Attribute */ - int nvals; /* Number of values */ - float vals[4]; /* Values */ - - - /* - * Range check input... - */ - - if (!ppd || !colormodel || !media || !resolution || !ink) - return (NULL); - - /* - * Try to find the LUT values... - */ - - snprintf(name, sizeof(name), "cups%sDither", ink); - - if ((attr = cupsFindAttr(ppd, name, colormodel, media, resolution, spec, - sizeof(spec))) == NULL) - attr = cupsFindAttr(ppd, "cupsAllDither", colormodel, media, - resolution, spec, sizeof(spec)); - - if (!attr) - return (NULL); - - vals[0] = 0.0; - vals[1] = 0.0; - vals[2] = 0.0; - vals[3] = 0.0; - nvals = sscanf(attr->value, "%f%f%f", vals + 1, vals + 2, vals + 3) + 1; - - fprintf(stderr, "DEBUG: Loaded LUT %s from PPD with values [%.3f %.3f %.3f %.3f]\n", - name, vals[0], vals[1], vals[2], vals[3]); - - return (cupsLutNew(nvals, vals)); -} - - -/* - * 'cupsLutNew()' - Make a lookup table from a list of pixel values. - * - * Returns a pointer to the lookup table on success, NULL on failure. - */ - -cups_lut_t * /* O - New lookup table */ -cupsLutNew(int num_values, /* I - Number of values */ - const float *values) /* I - Lookup table values */ -{ - int pixel; /* Pixel value */ - cups_lut_t *lut; /* Lookup table */ - int start, /* Start value */ - end, /* End value */ - maxval; /* Maximum value */ - - - /* - * Range check... - */ - - if (!num_values || !values) - return (NULL); - - /* - * Allocate memory for the lookup table... - */ - - if ((lut = (cups_lut_t *)calloc((CUPS_MAX_LUT + 1), - sizeof(cups_lut_t))) == NULL) - return (NULL); - - /* - * Generate the dither lookup table. The pixel values are roughly - * defined by a piecewise linear curve that has an intensity value - * at each output pixel. This isn't perfectly accurate, but it's - * close enough for jazz. - */ - - maxval = CUPS_MAX_LUT / values[num_values - 1]; - - for (start = 0; start <= CUPS_MAX_LUT; start ++) - lut[start].intensity = start * maxval / CUPS_MAX_LUT; - - for (pixel = 0; pixel < num_values; pixel ++) - { - /* - * Select start and end values for this pixel... - */ - - if (pixel == 0) - start = 0; - else - start = (int)(0.5 * maxval * (values[pixel - 1] + - values[pixel])) + 1; - - if (start < 0) - start = 0; - else if (start > CUPS_MAX_LUT) - start = CUPS_MAX_LUT; - - if (pixel == (num_values - 1)) - end = CUPS_MAX_LUT; - else - end = (int)(0.5 * maxval * (values[pixel] + values[pixel + 1])); - - if (end < 0) - end = 0; - else if (end > CUPS_MAX_LUT) - end = CUPS_MAX_LUT; - - if (start == end) - break; - - /* - * Generate lookup values and errors for each pixel. - */ - - while (start <= end) - { - lut[start].pixel = pixel; - if (start == 0) - lut[0].error = 0; - else - lut[start].error = start - maxval * values[pixel]; - - start ++; - } - } - - /* - * Show the lookup table... - */ - - for (start = 0; start <= CUPS_MAX_LUT; start += CUPS_MAX_LUT / 15) - fprintf(stderr, "DEBUG: %d = %d/%d/%d\n", start, lut[start].intensity, - lut[start].pixel, lut[start].error); - - /* - * Return the lookup table... - */ - - return (lut); -} - - -/* - * End of "$Id$". - */ diff --git a/driver/pack.c b/driver/pack.c deleted file mode 100644 index d9d01d16b..000000000 --- a/driver/pack.c +++ /dev/null @@ -1,307 +0,0 @@ -/* - * "$Id$" - * - * Bit packing routines for CUPS. - * - * Copyright 2007 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * cupsPackHorizontal() - Pack pixels horizontally... - * cupsPackHorizontal2() - Pack 2-bit pixels horizontally... - * cupsPackHorizontalBit() - Pack pixels horizontally by bit... - * cupsPackVertical() - Pack pixels vertically... - */ - -/* - * Include necessary headers... - */ - -#include "driver.h" - - -/* - * 'cupsPackHorizontal()' - Pack pixels horizontally... - */ - -void -cupsPackHorizontal(const unsigned char *ipixels,/* I - Input pixels */ - unsigned char *obytes, /* O - Output bytes */ - int width, /* I - Number of pixels */ - const unsigned char clearto, /* I - Initial value of bytes */ - const int step) /* I - Step value between pixels */ -{ - register unsigned char b; /* Current byte */ - - - /* - * Do whole bytes first... - */ - - while (width > 7) - { - b = clearto; - - if (*ipixels) - b ^= 0x80; - ipixels += step; - if (*ipixels) - b ^= 0x40; - ipixels += step; - if (*ipixels) - b ^= 0x20; - ipixels += step; - if (*ipixels) - b ^= 0x10; - ipixels += step; - if (*ipixels) - b ^= 0x08; - ipixels += step; - if (*ipixels) - b ^= 0x04; - ipixels += step; - if (*ipixels) - b ^= 0x02; - ipixels += step; - if (*ipixels) - b ^= 0x01; - ipixels += step; - - *obytes++ = b; - - width -= 8; - } - - /* - * Then do the last N bytes (N < 8)... - */ - - b = clearto; - - switch (width) - { - case 7 : - if (ipixels[6 * step]) - b ^= 0x02; - case 6 : - if (ipixels[5 * step]) - b ^= 0x04; - case 5 : - if (ipixels[4 * step]) - b ^= 0x08; - case 4 : - if (ipixels[3 * step]) - b ^= 0x10; - case 3 : - if (ipixels[2 * step]) - b ^= 0x20; - case 2 : - if (ipixels[1 * step]) - b ^= 0x40; - case 1 : - if (ipixels[0]) - b ^= 0x80; - *obytes = b; - break; - } -} - - -/* - * 'cupsPackHorizontal2()' - Pack 2-bit pixels horizontally... - */ - -void -cupsPackHorizontal2(const unsigned char *ipixels, /* I - Input pixels */ - unsigned char *obytes, /* O - Output bytes */ - int width, /* I - Number of pixels */ - const int step) /* I - Stepping value */ -{ - register unsigned char b; /* Current byte */ - - - /* - * Do whole bytes first... - */ - - while (width > 3) - { - b = *ipixels; - ipixels += step; - b = (b << 2) | *ipixels; - ipixels += step; - b = (b << 2) | *ipixels; - ipixels += step; - b = (b << 2) | *ipixels; - ipixels += step; - - *obytes++ = b; - - width -= 4; - } - - /* - * Then do the last N bytes (N < 4)... - */ - - b = 0; - - switch (width) - { - case 3 : - b = ipixels[2 * step]; - case 2 : - b = (b << 2) | ipixels[step]; - case 1 : - b = (b << 2) | ipixels[0]; - *obytes = b << (8 - 2 * width); - break; - } -} - - -/* - * 'cupsPackHorizontalBit()' - Pack pixels horizontally by bit... - */ - -void -cupsPackHorizontalBit(const unsigned char *ipixels, /* I - Input pixels */ - unsigned char *obytes, /* O - Output bytes */ - int width, /* I - Number of pixels */ - const unsigned char clearto, /* I - Initial value of bytes */ - const unsigned char bit) /* I - Bit to check */ -{ - register unsigned char b; /* Current byte */ - - - /* - * Do whole bytes first... - */ - - while (width > 7) - { - b = clearto; - - if (*ipixels++ & bit) - b ^= 0x80; - if (*ipixels++ & bit) - b ^= 0x40; - if (*ipixels++ & bit) - b ^= 0x20; - if (*ipixels++ & bit) - b ^= 0x10; - if (*ipixels++ & bit) - b ^= 0x08; - if (*ipixels++ & bit) - b ^= 0x04; - if (*ipixels++ & bit) - b ^= 0x02; - if (*ipixels++ & bit) - b ^= 0x01; - - *obytes++ = b; - - width -= 8; - } - - /* - * Then do the last N bytes (N < 8)... - */ - - b = clearto; - - switch (width) - { - case 7 : - if (ipixels[6] & bit) - b ^= 0x02; - case 6 : - if (ipixels[5] & bit) - b ^= 0x04; - case 5 : - if (ipixels[4] & bit) - b ^= 0x08; - case 4 : - if (ipixels[3] & bit) - b ^= 0x10; - case 3 : - if (ipixels[2] & bit) - b ^= 0x20; - case 2 : - if (ipixels[1] & bit) - b ^= 0x40; - case 1 : - if (ipixels[0] & bit) - b ^= 0x80; - *obytes = b; - break; - } -} - - -/* - * 'cupsPackVertical()' - Pack pixels vertically... - */ - -void -cupsPackVertical(const unsigned char *ipixels, /* I - Input pixels */ - unsigned char *obytes, /* O - Output bytes */ - int width, /* I - Number of input pixels */ - const unsigned char bit, /* I - Output bit */ - const int step) /* I - Number of bytes between columns */ -{ - /* - * Loop through the entire array... - */ - - while (width > 7) - { - if (*ipixels++) - *obytes ^= bit; - obytes += step; - if (*ipixels++) - *obytes ^= bit; - obytes += step; - if (*ipixels++) - *obytes ^= bit; - obytes += step; - if (*ipixels++) - *obytes ^= bit; - obytes += step; - if (*ipixels++) - *obytes ^= bit; - obytes += step; - if (*ipixels++) - *obytes ^= bit; - obytes += step; - if (*ipixels++) - *obytes ^= bit; - obytes += step; - if (*ipixels++) - *obytes ^= bit; - obytes += step; - - width -= 8; - } - - while (width > 0) - { - if (*ipixels++) - *obytes ^= bit; - - obytes += step; - width --; - } -} - - -/* - * End of "$Id$". - */ diff --git a/driver/pcl-common.c b/driver/pcl-common.c deleted file mode 100644 index 427879338..000000000 --- a/driver/pcl-common.c +++ /dev/null @@ -1,272 +0,0 @@ -/* - * "$Id$" - * - * Common PCL functions for CUPS. - * - * Copyright 2007 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * pcl_set_media_size() - Set media size using the page size command. - * pjl_write() - Write a PJL command string, performing - * substitutions as needed. - */ - -/* - * Include necessary headers... - */ - -#include "driver.h" -#include "pcl-common.h" -#include - - -/* - * 'pcl_set_media_size()' - Set media size using the page size command. - */ - -void -pcl_set_media_size(ppd_file_t *ppd, /* I - PPD file */ - float width, /* I - Width of page */ - float length) /* I - Length of page */ -{ - (void)width; - - printf("\033&l0O"); /* Set portrait orientation */ - - if (ppd->model_number & PCL_PAPER_SIZE) - switch ((int)(length + 0.5f)) - { - case 419 : /* Postcard */ - printf("\033&l71A"); /* Set page size */ - break; - - case 540 : /* Monarch Envelope */ - printf("\033&l80A"); /* Set page size */ - break; - - case 567 : /* Double Postcard */ - printf("\033&l72A"); /* Set page size */ - break; - - case 595 : /* A5 */ - printf("\033&l25A"); /* Set page size */ - break; - - case 612 : /* Statement */ - printf("\033&l5A"); /* Set page size */ - break; - - case 624 : /* DL Envelope */ - printf("\033&l90A"); /* Set page size */ - break; - - case 649 : /* C5 Envelope */ - printf("\033&l91A"); /* Set page size */ - break; - - case 684 : /* COM-10 Envelope */ - printf("\033&l81A"); /* Set page size */ - break; - - case 709 : /* B5 Envelope */ - printf("\033&l100A"); /* Set page size */ - break; - - case 729 : /* B5 */ - printf("\033&l45A"); /* Set page size */ - break; - - case 756 : /* Executive */ - printf("\033&l1A"); /* Set page size */ - break; - - case 792 : /* Letter */ - printf("\033&l2A"); /* Set page size */ - break; - - case 842 : /* A4 */ - printf("\033&l26A"); /* Set page size */ - break; - - case 936 : /* Foolscap */ - printf("\033&l23A"); /* Set page size */ - break; - - case 1008 : /* Legal */ - printf("\033&l3A"); /* Set page size */ - break; - - case 1032 : /* B4 */ - printf("\033&l46A"); /* Set page size */ - break; - - case 1191 : /* A3 */ - printf("\033&l27A"); /* Set page size */ - break; - - case 1224 : /* Tabloid */ - printf("\033&l6A"); /* Set page size */ - break; - - default : - printf("\033&l101A"); /* Set page size */ - printf("\033&l6D\033&k12H"); /* Set 6 LPI, 10 CPI */ - printf("\033&l%.2fP", length / 12.0); - /* Set page length */ - printf("\033&l%.0fF", length / 12.0); - /* Set text length to page */ - break; - } - else - { - printf("\033&l6D\033&k12H"); /* Set 6 LPI, 10 CPI */ - printf("\033&l%.2fP", length / 12.0); - /* Set page length */ - printf("\033&l%.0fF", length / 12.0); - /* Set text length to page */ - } - - printf("\033&l0L"); /* Turn off perforation skip */ - printf("\033&l0E"); /* Reset top margin to 0 */ -} - - -/* - * 'pjl_write()' - Write a PJL command string, performing substitutions as needed. - */ - -void -pjl_write(ppd_file_t *ppd, /* I - PPD file */ - const char *format, /* I - Format string */ - const char *value, /* I - Value for %s */ - int job_id, /* I - Job ID */ - const char *user, /* I - Username */ - const char *title, /* I - Title */ - int num_options, /* I - Number of options */ - cups_option_t *options) /* I - Options */ -{ - const char *optval; /* Option value */ - char match[255], /* Match string */ - *mptr; /* Pointer into match string */ - - - if (!format) - return; - - while (*format) - { - if (*format == '%') - { - /* - * Perform substitution... - */ - - format ++; - switch (*format) - { - case 'b' : /* job-billing */ - if ((optval = cupsGetOption("job-billing", num_options, - options)) != NULL) - fputs(optval, stdout); - break; - - case 'h' : /* job-originating-host-name */ - if ((optval = cupsGetOption("job-originating-host-name", - num_options, options)) != NULL) - fputs(optval, stdout); - break; - - case 'j' : /* job-id */ - printf("%d", job_id); - break; - - case 'n' : /* CR + LF */ - putchar('\r'); - putchar('\n'); - break; - - case 'q' : /* double quote (") */ - putchar('\"'); - break; - - case 's' : /* "value" */ - if (value) - fputs(value, stdout); - break; - - case 't' : /* job-name */ - fputs(title, stdout); - break; - - case 'u' : /* job-originating-user-name */ - fputs(user, stdout); - break; - - case '?' : /* ?value:string; */ - /* - * Get the match value... - */ - - for (format ++, mptr = match; *format && *format != ':'; format ++) - if (mptr < (match + sizeof(match) - 1)) - *mptr++ = *format; - - if (!*format) - return; - - /* - * See if we have a match... - */ - - format ++; - *mptr = '\0'; - - if (!value || strcmp(match, value)) - { - /* - * Value doesn't match; skip the string that follows... - */ - - while (*format && *format != ';') - format ++; - } - else - { - /* - * Value matches; copy the string that follows... - */ - - while (*format && *format != ';') - putchar(*format++); - } - - if (!*format) - return; - break; - - default : /* Anything else */ - putchar('%'); - case '%' : /* %% = single % */ - putchar(*format); - break; - } - } - else - putchar(*format); - - format ++; - } -} - - -/* - * End of "$Id$". - */ diff --git a/driver/pcl-common.h b/driver/pcl-common.h deleted file mode 100644 index 7cab21cb9..000000000 --- a/driver/pcl-common.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * "$Id$" - * - * Common HP-PCL definitions for CUPS. - * - * Copyright 2007-2010 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products, All Rights Reserved. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - */ - -/* - * Include necessary headers... - */ - -#include -#include "data/pcl.h" - - -/* - * Functions/macros... - */ - -#define pcl_reset()\ - printf("\033E") -#define pcl_set_copies(copies)\ - printf("\033&l%dX", (copies)) -#define pcl_set_pcl_mode(m)\ - printf("\033%%%dA", (m)) -#define pcl_set_hpgl_mode(m)\ - printf("\033%%%dB", (m)) -#define pcl_set_negative_motion()\ - printf("\033&a1N") -#define pcl_set_media_source(source)\ - printf("\033&l%dH", source) -#define pcl_set_media_type(type)\ - printf("\033&l%dM", type) -#define pcl_set_duplex(duplex,landscape)\ - if (duplex) printf("\033&l%dS", (duplex) + (landscape)) -#define pcl_set_simple_black()\ - printf("\033*r-1U") -#define pcl_set_simple_color()\ - printf("\033*r3U") -#define pcl_set_simple_cmy()\ - printf("\033*r-3U") -#define pcl_set_simple_kcmy()\ - printf("\033*r-4U") -#define pcl_set_simple_resolution(r)\ - printf("\033*t%dR", (r)) - -#define pjl_escape()\ - printf("\033%%-12345X@PJL\r\n") -#define pjl_set_job(job_id,user,title)\ - printf("@PJL JOB NAME = \"%s\" DISPLAY = \"%d %s %s\"\r\n", \ - (title), (job_id), (user), (title)) -#define pjl_enter_language(lang)\ - printf("@PJL ENTER LANGUAGE=%s\r\n", (lang)) - -extern void pcl_set_media_size(ppd_file_t *ppd, float width, float length); -extern void pjl_write(ppd_file_t *ppd, const char *format, - const char *value, int job_id, - const char *user, const char *title, - int num_options, cups_option_t *options); - -/* - * End of "$Id$". - */ diff --git a/driver/rastertoescpx.c b/driver/rastertoescpx.c deleted file mode 100644 index 0bcc0a92c..000000000 --- a/driver/rastertoescpx.c +++ /dev/null @@ -1,1931 +0,0 @@ -/* - * "$Id$" - * - * Advanced EPSON ESC/P raster driver for CUPS. - * - * Copyright 2007-2010 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * Setup() - Prepare the printer for graphics output. - * StartPage() - Start a page of graphics. - * EndPage() - Finish a page of graphics. - * Shutdown() - Shutdown a printer. - * CancelJob() - Cancel the current job... - * CompressData() - Compress a line of graphics. - * OutputBand() - Output a band of graphics. - * ProcessLine() - Read graphics from the page stream and output - * as needed. - * main() - Main entry and processing of driver. - */ - -/* - * Include necessary headers... - */ - -#include "driver.h" -#include -#include -#include "data/escp.h" -#include - - -/* - * Softweave data... - */ - -typedef struct cups_weave_str -{ - struct cups_weave_str *prev, /* Previous band */ - *next; /* Next band */ - int x, y, /* Column/Line on the page */ - plane, /* Color plane */ - dirty, /* Is this buffer dirty? */ - row, /* Row in the buffer */ - count; /* Max rows this pass */ - unsigned char *buffer; /* Data buffer */ -} cups_weave_t; - - -/* - * Globals... - */ - -cups_rgb_t *RGB; /* RGB color separation data */ -cups_cmyk_t *CMYK; /* CMYK color separation data */ -unsigned char *PixelBuffer, /* Pixel buffer */ - *CMYKBuffer, /* CMYK buffer */ - *OutputBuffers[7], /* Output buffers */ - *DotBuffers[7], /* Dot buffers */ - *CompBuffer; /* Compression buffer */ -short *InputBuffer; /* Color separation buffer */ -cups_weave_t *DotAvailList, /* Available buffers */ - *DotUsedList, /* Used buffers */ - *DotBands[128][7]; /* Buffers in use */ -int DotBufferSize, /* Size of dot buffers */ - DotRowMax, /* Maximum row number in buffer */ - DotColStep, /* Step for each output column */ - DotRowStep, /* Step for each output line */ - DotRowFeed, /* Amount to feed for interleave */ - DotRowCount, /* Number of rows to output */ - DotRowOffset[7], /* Offset for each color on print head */ - DotRowCurrent, /* Current row */ - DotSize; /* Dot size (Pro 5000 only) */ -int PrinterPlanes, /* # of color planes */ - BitPlanes, /* # of bit planes per color */ - PrinterTop, /* Top of page */ - PrinterLength; /* Length of page */ -cups_lut_t *DitherLuts[7]; /* Lookup tables for dithering */ -cups_dither_t *DitherStates[7]; /* Dither state tables */ -int OutputFeed; /* Number of lines to skip */ -int Canceled; /* Is the job canceled? */ - - -/* - * Prototypes... - */ - -void Setup(ppd_file_t *); -void StartPage(ppd_file_t *, cups_page_header2_t *); -void EndPage(ppd_file_t *, cups_page_header2_t *); -void Shutdown(ppd_file_t *); - -void AddBand(cups_weave_t *band); -void CancelJob(int sig); -void CompressData(ppd_file_t *, const unsigned char *, const int, - int, int, const int, const int, const int, - const int); -void OutputBand(ppd_file_t *, cups_page_header2_t *, - cups_weave_t *band); -void ProcessLine(ppd_file_t *, cups_raster_t *, - cups_page_header2_t *, const int y); - - -/* - * 'Setup()' - Prepare a printer for graphics output. - */ - -void -Setup(ppd_file_t *ppd) /* I - PPD file */ -{ - /* - * Some EPSON printers need an additional command issued at the - * beginning of each job to exit from USB "packet" mode... - */ - - if (ppd->model_number & ESCP_USB) - cupsWritePrintData("\000\000\000\033\001@EJL 1284.4\n@EJL \n\033@", 29); -} - - -/* - * 'StartPage()' - Start a page of graphics. - */ - -void -StartPage(ppd_file_t *ppd, /* I - PPD file */ - cups_page_header2_t *header) /* I - Page header */ -{ - int i, y; /* Looping vars */ - int subrow, /* Current subrow */ - modrow, /* Subrow modulus */ - plane; /* Current color plane */ - unsigned char *ptr; /* Pointer into dot buffer */ - int bands; /* Number of bands to allocate */ - int units; /* Units for resolution */ - cups_weave_t *band; /* Current band */ - const char *colormodel; /* Color model string */ - char resolution[PPD_MAX_NAME], - /* Resolution string */ - spec[PPD_MAX_NAME]; /* PPD attribute name */ - ppd_attr_t *attr; /* Attribute from PPD file */ - const float default_lut[2] = /* Default dithering lookup table */ - { - 0.0, - 1.0 - }; - - - fprintf(stderr, "DEBUG: StartPage...\n"); - fprintf(stderr, "DEBUG: MediaClass = \"%s\"\n", header->MediaClass); - fprintf(stderr, "DEBUG: MediaColor = \"%s\"\n", header->MediaColor); - fprintf(stderr, "DEBUG: MediaType = \"%s\"\n", header->MediaType); - fprintf(stderr, "DEBUG: OutputType = \"%s\"\n", header->OutputType); - - fprintf(stderr, "DEBUG: AdvanceDistance = %d\n", header->AdvanceDistance); - fprintf(stderr, "DEBUG: AdvanceMedia = %d\n", header->AdvanceMedia); - fprintf(stderr, "DEBUG: Collate = %d\n", header->Collate); - fprintf(stderr, "DEBUG: CutMedia = %d\n", header->CutMedia); - fprintf(stderr, "DEBUG: Duplex = %d\n", header->Duplex); - fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], - header->HWResolution[1]); - fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", - header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], - header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]); - fprintf(stderr, "DEBUG: InsertSheet = %d\n", header->InsertSheet); - fprintf(stderr, "DEBUG: Jog = %d\n", header->Jog); - fprintf(stderr, "DEBUG: LeadingEdge = %d\n", header->LeadingEdge); - fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0], - header->Margins[1]); - fprintf(stderr, "DEBUG: ManualFeed = %d\n", header->ManualFeed); - fprintf(stderr, "DEBUG: MediaPosition = %d\n", header->MediaPosition); - fprintf(stderr, "DEBUG: MediaWeight = %d\n", header->MediaWeight); - fprintf(stderr, "DEBUG: MirrorPrint = %d\n", header->MirrorPrint); - fprintf(stderr, "DEBUG: NegativePrint = %d\n", header->NegativePrint); - fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies); - fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation); - fprintf(stderr, "DEBUG: OutputFaceUp = %d\n", header->OutputFaceUp); - fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], - header->PageSize[1]); - fprintf(stderr, "DEBUG: Separations = %d\n", header->Separations); - fprintf(stderr, "DEBUG: TraySwitch = %d\n", header->TraySwitch); - fprintf(stderr, "DEBUG: Tumble = %d\n", header->Tumble); - fprintf(stderr, "DEBUG: cupsWidth = %d\n", header->cupsWidth); - fprintf(stderr, "DEBUG: cupsHeight = %d\n", header->cupsHeight); - fprintf(stderr, "DEBUG: cupsMediaType = %d\n", header->cupsMediaType); - fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", header->cupsBitsPerColor); - fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", header->cupsBitsPerPixel); - fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", header->cupsBytesPerLine); - fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder); - fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace); - fprintf(stderr, "DEBUG: cupsCompression = %d\n", header->cupsCompression); - fprintf(stderr, "DEBUG: cupsRowCount = %d\n", header->cupsRowCount); - fprintf(stderr, "DEBUG: cupsRowFeed = %d\n", header->cupsRowFeed); - fprintf(stderr, "DEBUG: cupsRowStep = %d\n", header->cupsRowStep); - - /* - * Figure out the color model and spec strings... - */ - - switch (header->cupsColorSpace) - { - case CUPS_CSPACE_K : - colormodel = "Black"; - break; - case CUPS_CSPACE_W : - colormodel = "Gray"; - break; - default : - case CUPS_CSPACE_RGB : - colormodel = "RGB"; - break; - case CUPS_CSPACE_CMYK : - colormodel = "CMYK"; - break; - } - - if (header->HWResolution[0] != header->HWResolution[1]) - snprintf(resolution, sizeof(resolution), "%dx%ddpi", - header->HWResolution[0], header->HWResolution[1]); - else - snprintf(resolution, sizeof(resolution), "%ddpi", - header->HWResolution[0]); - - if (!header->MediaType[0]) - strcpy(header->MediaType, "Plain"); - - /* - * Load the appropriate color profiles... - */ - - RGB = NULL; - CMYK = NULL; - - fputs("DEBUG: Attempting to load color profiles using the following values:\n", stderr); - fprintf(stderr, "DEBUG: ColorModel = %s\n", colormodel); - fprintf(stderr, "DEBUG: MediaType = %s\n", header->MediaType); - fprintf(stderr, "DEBUG: Resolution = %s\n", resolution); - - if (header->cupsColorSpace == CUPS_CSPACE_RGB || - header->cupsColorSpace == CUPS_CSPACE_W) - RGB = cupsRGBLoad(ppd, colormodel, header->MediaType, resolution); - else - RGB = NULL; - - CMYK = cupsCMYKLoad(ppd, colormodel, header->MediaType, resolution); - - if (RGB) - fputs("DEBUG: Loaded RGB separation from PPD.\n", stderr); - - if (CMYK) - fputs("DEBUG: Loaded CMYK separation from PPD.\n", stderr); - else - { - fputs("DEBUG: Loading default CMYK separation.\n", stderr); - CMYK = cupsCMYKNew(4); - } - - PrinterPlanes = CMYK->num_channels; - - fprintf(stderr, "DEBUG: PrinterPlanes = %d\n", PrinterPlanes); - - /* - * Get the dithering parameters... - */ - - switch (PrinterPlanes) - { - case 1 : /* K */ - DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Black"); - break; - - case 2 : /* Kk */ - DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Black"); - DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "LightBlack"); - break; - - case 3 : /* CMY */ - DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Cyan"); - DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Magenta"); - DitherLuts[2] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Yellow"); - break; - - case 4 : /* CMYK */ - DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Cyan"); - DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Magenta"); - DitherLuts[2] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Yellow"); - DitherLuts[3] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Black"); - break; - - case 6 : /* CcMmYK */ - DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Cyan"); - DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "LightCyan"); - DitherLuts[2] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Magenta"); - DitherLuts[3] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "LightMagenta"); - DitherLuts[4] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Yellow"); - DitherLuts[5] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Black"); - break; - - case 7 : /* CcMmYKk */ - DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Cyan"); - DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "LightCyan"); - DitherLuts[2] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Magenta"); - DitherLuts[3] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "LightMagenta"); - DitherLuts[4] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Yellow"); - DitherLuts[5] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Black"); - DitherLuts[6] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "LightBlack"); - break; - } - - for (plane = 0; plane < PrinterPlanes; plane ++) - { - DitherStates[plane] = cupsDitherNew(header->cupsWidth); - - if (!DitherLuts[plane]) - DitherLuts[plane] = cupsLutNew(2, default_lut); - } - - if (DitherLuts[0][4095].pixel > 1) - BitPlanes = 2; - else - BitPlanes = 1; - - /* - * Initialize the printer... - */ - - printf("\033@"); - - if (ppd->model_number & ESCP_REMOTE) - { - /* - * Go into remote mode... - */ - - cupsWritePrintData("\033(R\010\000\000REMOTE1", 13); - - /* - * Disable status reporting... - */ - - cupsWritePrintData("ST\002\000\000\000", 6); - - /* - * Enable borderless printing... - */ - - if ((attr = ppdFindAttr(ppd, "cupsESCPFP", NULL)) != NULL && attr->value) - { - /* - * Set horizontal offset... - */ - - i = atoi(attr->value); - - cupsWritePrintData("FP\003\000\000", 5); - putchar(i & 255); - putchar(i >> 8); - } - - /* - * Set media type... - */ - - if (header->cupsMediaType) - { - sprintf(spec, "%d", header->cupsMediaType); - - if ((attr = ppdFindAttr(ppd, "cupsESCPSN0", spec)) != NULL && attr->value) - { - /* - * Set feed sequence... - */ - - cupsWritePrintData("SN\003\000\000\000", 6); - putchar(atoi(attr->value)); - } - - if ((attr = ppdFindAttr(ppd, "cupsESCPSN1", spec)) != NULL && attr->value) - { - /* - * Set platten gap... - */ - - cupsWritePrintData("SN\003\000\000\001", 6); - putchar(atoi(attr->value)); - } - - if ((attr = ppdFindAttr(ppd, "cupsESCPSN2", spec)) != NULL && attr->value) - { - /* - * Paper feeding/ejecting sequence... - */ - - cupsWritePrintData("SN\003\000\000\002", 6); - putchar(atoi(attr->value)); - } - - if ((attr = ppdFindAttr(ppd, "cupsESCPSN6", spec)) != NULL && attr->value) - { - /* - * Eject delay... - */ - - cupsWritePrintData("SN\003\000\000\006", 6); - putchar(atoi(attr->value)); - } - - if ((attr = ppdFindAttr(ppd, "cupsESCPMT", spec)) != NULL && attr->value) - { - /* - * Set media type. - */ - - cupsWritePrintData("MT\003\000\000\000", 6); - putchar(atoi(attr->value)); - } - - if ((attr = ppdFindAttr(ppd, "cupsESCPPH", spec)) != NULL && attr->value) - { - /* - * Set paper thickness. - */ - - cupsWritePrintData("PH\002\000\000", 5); - putchar(atoi(attr->value)); - } - } - - sprintf(spec, "%d", header->MediaPosition); - - if (header->MediaPosition) - { - if ((attr = ppdFindAttr(ppd, "cupsESCPPC", spec)) != NULL && attr->value) - { - /* - * Paper check. - */ - - cupsWritePrintData("PC\002\000\000", 5); - putchar(atoi(attr->value)); - } - - if ((attr = ppdFindAttr(ppd, "cupsESCPPP", spec)) != NULL && attr->value) - { - /* - * Paper path. - */ - - int a, b; - - a = b = 0; - sscanf(attr->value, "%d%d", &a, &b); - - cupsWritePrintData("PP\003\000\000", 5); - putchar(a); - putchar(b); - } - - if ((attr = ppdFindAttr(ppd, "cupsESCPEX", spec)) != NULL && attr->value) - { - /* - * Set media position. - */ - - cupsWritePrintData("EX\006\000\000\000\000\000\005", 9); - putchar(atoi(attr->value)); - } - } - - if ((attr = ppdFindAttr(ppd, "cupsESCPMS", spec)) != NULL && attr->value) - { - /* - * Set media size... - */ - - cupsWritePrintData("MS\010\000\000", 5); - putchar(atoi(attr->value)); - - switch (header->PageSize[1]) - { - case 1191 : /* A3 */ - putchar(0x01); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - break; - case 1032 : /* B4 */ - putchar(0x02); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - break; - case 842 : /* A4 */ - putchar(0x03); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - break; - case 595 : /* A4.Transverse */ - putchar(0x03); - putchar(0x01); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - break; - case 729 : /* B5 */ - putchar(0x04); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - break; - case 516 : /* B5.Transverse */ - putchar(0x04); - putchar(0x01); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - break; - case 1369 : /* Super A3/B */ - putchar(0x20); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - break; - case 792 : /* Letter */ - putchar(0x08); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - break; - case 612 : /* Letter.Transverse */ - putchar(0x08); - putchar(0x01); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - break; - case 1004 : /* Legal */ - putchar(0x0a); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - break; - case 1224 : /* Tabloid */ - putchar(0x2d); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - putchar(0x00); - break; - default : /* Custom size */ - putchar(0xff); - putchar(0xff); - i = 360 * header->PageSize[0] / 72; - putchar(i); - putchar(i >> 8); - i = 360 * header->PageSize[1] / 72; - putchar(i); - putchar(i >> 8); - break; - } - } - - sprintf(spec, "%d", header->CutMedia); - - if ((attr = ppdFindAttr(ppd, "cupsESCPAC", spec)) != NULL && attr->value) - { - /* - * Enable/disable cutter. - */ - - cupsWritePrintData("AC\002\000\000", 5); - putchar(atoi(attr->value)); - - if ((attr = ppdFindAttr(ppd, "cupsESCPSN80", header->MediaType)) != NULL && attr->value) - { - /* - * Cutting method... - */ - - cupsWritePrintData("SN\003\000\000\200", 6); - putchar(atoi(attr->value)); - } - - if ((attr = ppdFindAttr(ppd, "cupsESCPSN81", header->MediaType)) != NULL && attr->value) - { - /* - * Cutting pressure... - */ - - cupsWritePrintData("SN\003\000\000\201", 6); - putchar(atoi(attr->value)); - } - } - - if ((attr = ppdFindAttr(ppd, "cupsESCPCO", spec)) != NULL && attr->value) - { - /* - * Enable/disable cutter. - */ - - cupsWritePrintData("CO\010\000\000\000", 6); - putchar(atoi(attr->value)); - cupsWritePrintData("\000\000\000\000\000", 5); - } - - /* - * Exit remote mode... - */ - - cupsWritePrintData("\033\000\000\000", 4); - } - - /* - * Enter graphics mode... - */ - - cupsWritePrintData("\033(G\001\000\001", 6); - - /* - * Set the line feed increment... - */ - - /* TODO: get this from the PPD file... */ - for (units = 1440; units < header->HWResolution[0]; units *= 2); - - if (ppd->model_number & ESCP_EXT_UNITS) - { - cupsWritePrintData("\033(U\005\000", 5); - putchar(units / header->HWResolution[1]); - putchar(units / header->HWResolution[1]); - putchar(units / header->HWResolution[0]); - putchar(units); - putchar(units >> 8); - } - else - { - cupsWritePrintData("\033(U\001\000", 5); - putchar(3600 / header->HWResolution[1]); - } - - /* - * Set the page length... - */ - - PrinterLength = header->PageSize[1] * header->HWResolution[1] / 72; - - if (ppd->model_number & ESCP_PAGE_SIZE) - { - /* - * Set page size (expands bottom margin)... - */ - - cupsWritePrintData("\033(S\010\000", 5); - - i = header->PageSize[0] * header->HWResolution[1] / 72; - putchar(i); - putchar(i >> 8); - putchar(i >> 16); - putchar(i >> 24); - - i = header->PageSize[1] * header->HWResolution[1] / 72; - putchar(i); - putchar(i >> 8); - putchar(i >> 16); - putchar(i >> 24); - } - else - { - cupsWritePrintData("\033(C\002\000", 5); - putchar(PrinterLength & 255); - putchar(PrinterLength >> 8); - } - - /* - * Set the top and bottom margins... - */ - - PrinterTop = (int)((ppd->sizes[1].length - ppd->sizes[1].top) * - header->HWResolution[1] / 72.0); - - if (ppd->model_number & ESCP_EXT_MARGINS) - { - cupsWritePrintData("\033(c\010\000", 5); - - putchar(PrinterTop); - putchar(PrinterTop >> 8); - putchar(PrinterTop >> 16); - putchar(PrinterTop >> 24); - - putchar(PrinterLength); - putchar(PrinterLength >> 8); - putchar(PrinterLength >> 16); - putchar(PrinterLength >> 24); - } - else - { - cupsWritePrintData("\033(c\004\000", 5); - - putchar(PrinterTop & 255); - putchar(PrinterTop >> 8); - - putchar(PrinterLength & 255); - putchar(PrinterLength >> 8); - } - - /* - * Set the top position... - */ - - cupsWritePrintData("\033(V\002\000\000\000", 7); - - /* - * Enable unidirectional printing depending on the mode... - */ - - if ((attr = cupsFindAttr(ppd, "cupsESCPDirection", colormodel, - header->MediaType, resolution, spec, - sizeof(spec))) != NULL) - printf("\033U%c", atoi(attr->value)); - - /* - * Enable/disable microweaving as needed... - */ - - if ((attr = cupsFindAttr(ppd, "cupsESCPMicroWeave", colormodel, - header->MediaType, resolution, spec, - sizeof(spec))) != NULL) - printf("\033(i\001%c%c", 0, atoi(attr->value)); - - /* - * Set the dot size and print speed as needed... - */ - - if ((attr = cupsFindAttr(ppd, "cupsESCPDotSize", colormodel, - header->MediaType, resolution, spec, - sizeof(spec))) != NULL) - printf("\033(e\002%c%c%c", 0, 0, atoi(attr->value)); - - if (ppd->model_number & ESCP_ESCK) - { - /* - * Set the print mode... - */ - - if (PrinterPlanes == 1) - { - /* - * Fast black printing. - */ - - cupsWritePrintData("\033(K\002\000\000\001", 7); - } - else - { - /* - * Color printing. - */ - - cupsWritePrintData("\033(K\002\000\000\002", 7); - } - } - - /* - * Get softweave settings from header... - */ - - if (header->cupsRowCount <= 1) - { - DotRowCount = 1; - DotColStep = 1; - DotRowStep = 1; - DotRowFeed = 1; - } - else - { - DotRowCount = header->cupsRowCount; - DotRowFeed = header->cupsRowFeed; - DotRowStep = header->cupsRowStep % 100; - DotColStep = header->cupsRowStep / 100; - - if (DotColStep == 0) - DotColStep ++; - } - - /* - * Setup softweave parameters... - */ - - DotRowCurrent = 0; - DotRowMax = DotRowCount * DotRowStep; - DotBufferSize = (header->cupsWidth / DotColStep * BitPlanes + 7) / 8; - - fprintf(stderr, "DEBUG: DotBufferSize = %d\n", DotBufferSize); - fprintf(stderr, "DEBUG: DotColStep = %d\n", DotColStep); - fprintf(stderr, "DEBUG: DotRowMax = %d\n", DotRowMax); - fprintf(stderr, "DEBUG: DotRowStep = %d\n", DotRowStep); - fprintf(stderr, "DEBUG: DotRowFeed = %d\n", DotRowFeed); - fprintf(stderr, "DEBUG: DotRowCount = %d\n", DotRowCount); - - DotAvailList = NULL; - DotUsedList = NULL; - DotBuffers[0] = NULL; - - fprintf(stderr, "DEBUG: model_number = %x\n", ppd->model_number); - - if (DotRowMax > 1) - { - /* - * Compute offsets for the color jets on the print head... - */ - - bands = DotRowStep * DotColStep * PrinterPlanes * 4; - - memset(DotRowOffset, 0, sizeof(DotRowOffset)); - - if (PrinterPlanes == 1) - { - /* - * Use full height of print head... - */ - - if ((attr = ppdFindAttr(ppd, "cupsESCPBlack", resolution)) != NULL && - attr->value) - { - /* - * Use custom black head data... - */ - - sscanf(attr->value, "%d%d", &DotRowCount, &DotRowStep); - } - } - else if (ppd->model_number & ESCP_STAGGER) - { - /* - * Use staggered print head... - */ - - fputs("DEBUG: Offset head detected...\n", stderr); - - if ((attr = ppdFindAttr(ppd, "cupsESCPOffsets", resolution)) != NULL && - attr->value) - { - /* - * Use only 1/3 of the print head when printing color... - */ - - sscanf(attr->value, "%d%d%d%d", DotRowOffset + 0, - DotRowOffset + 1, DotRowOffset + 2, DotRowOffset + 3); - } - } - - for (i = 0; i < PrinterPlanes; i ++) - fprintf(stderr, "DEBUG: DotRowOffset[%d] = %d\n", i, DotRowOffset[i]); - - /* - * Allocate bands... - */ - - for (i = 0; i < bands; i ++) - { - band = (cups_weave_t *)calloc(1, sizeof(cups_weave_t)); - band->next = DotAvailList; - DotAvailList = band; - - band->buffer = calloc(DotRowCount, DotBufferSize); - } - - if (!DotAvailList) - { - fputs("ERROR: Unable to allocate band list\n", stderr); - exit(1); - } - - fputs("DEBUG: Pointer list at start of page...\n", stderr); - - for (band = DotAvailList; band != NULL; band = band->next) - fprintf(stderr, "DEBUG: %p\n", band); - - fputs("DEBUG: ----END----\n", stderr); - - /* - * Fill the initial bands... - */ - - modrow = DotColStep * DotRowStep; - - if (DotRowFeed == 0) - { - /* - * Automatically compute the optimal feed value... - */ - - DotRowFeed = DotRowCount / DotColStep - DotRowStep; - - while ((((DotRowFeed % 2) == 0) == ((DotRowCount % 2) == 0) || - ((DotRowFeed % 3) == 0) == ((DotRowCount % 3) == 0) || - ((DotRowFeed % 5) == 0) == ((DotRowCount % 5) == 0)) && - DotRowFeed > 1) - DotRowFeed --; - - if (DotRowFeed < 1) - DotRowFeed = 1; - - fprintf(stderr, "DEBUG: Auto DotRowFeed = %d, modrow=%d...\n", - DotRowFeed, modrow); - } - - memset(DotBands, 0, sizeof(DotBands)); - - for (i = modrow, subrow = modrow - 1, y = DotRowFeed; - i > 0; - i --, y += DotRowFeed) - { - while (DotBands[subrow][0]) - { - /* - * This subrow is already used, move to another one... - */ - - subrow = (subrow + 1) % modrow; - } - - for (plane = 0; plane < PrinterPlanes; plane ++) - { - /* - * Pull the next available band from the list... - */ - - band = DotAvailList; - DotAvailList = DotAvailList->next; - DotBands[subrow][plane] = band; - - /* - * Start the band in the first few passes, with the number of rows - * varying to allow for a nice interleaved pattern... - */ - - band->x = subrow / DotRowStep; - band->y = (subrow % DotRowStep) + DotRowOffset[plane]; - band->plane = plane; - band->row = 0; - band->count = DotRowCount - y / DotRowStep; - - if (band->count < 1) - band->count = 1; - else if (band->count > DotRowCount) - band->count = DotRowCount; - - fprintf(stderr, "DEBUG: DotBands[%d][%d] = %p, x = %d, y = %d, plane = %d, count = %d\n", - subrow, plane, band, band->x, band->y, band->plane, band->count); - } - - subrow = (subrow + DotRowFeed) % modrow; - } - } - else - { - /* - * Allocate memory for a single line of graphics... - */ - - ptr = calloc(PrinterPlanes, DotBufferSize); - - for (plane = 0; plane < PrinterPlanes; plane ++, ptr += DotBufferSize) - DotBuffers[plane] = ptr; - } - - /* - * Set the output resolution... - */ - - cupsWritePrintData("\033(D\004\000", 5); - putchar(units); - putchar(units >> 8); - putchar(units * DotRowStep / header->HWResolution[1]); - putchar(units * DotColStep / header->HWResolution[0]); - - /* - * Set the top of form... - */ - - OutputFeed = 0; - - /* - * Allocate buffers as needed... - */ - - PixelBuffer = malloc(header->cupsBytesPerLine); - InputBuffer = malloc(header->cupsWidth * PrinterPlanes * 2); - OutputBuffers[0] = malloc(PrinterPlanes * header->cupsWidth); - - for (i = 1; i < PrinterPlanes; i ++) - OutputBuffers[i] = OutputBuffers[0] + i * header->cupsWidth; - - if (RGB) - CMYKBuffer = malloc(header->cupsWidth * PrinterPlanes); - - CompBuffer = malloc(10 * DotBufferSize * DotRowMax); -} - - -/* - * 'EndPage()' - Finish a page of graphics. - */ - -void -EndPage(ppd_file_t *ppd, /* I - PPD file */ - cups_page_header2_t *header) /* I - Page header */ -{ - int i; /* Looping var */ - cups_weave_t *band, /* Current band */ - *next; /* Next band in list */ - int plane; /* Current plane */ - int subrow; /* Current subrow */ - int subrows; /* Number of subrows */ - - - /* - * Output the last bands of print data as necessary... - */ - - if (DotRowMax > 1) - { - /* - * Move the remaining bands to the used or avail lists... - */ - - subrows = DotRowStep * DotColStep; - - for (subrow = 0; subrow < subrows; subrow ++) - for (plane = 0; plane < PrinterPlanes; plane ++) - { - if (DotBands[subrow][plane]->dirty) - { - /* - * Insert into the used list... - */ - - DotBands[subrow][plane]->count = DotBands[subrow][plane]->row; - - AddBand(DotBands[subrow][plane]); - } - else - { - /* - * Nothing here, so move it to the available list... - */ - - DotBands[subrow][plane]->next = DotAvailList; - DotAvailList = DotBands[subrow][plane]; - } - - DotBands[subrow][plane] = NULL; - } - - /* - * Loop until all bands are written... - */ - - fputs("DEBUG: Pointer list at end of page...\n", stderr); - - for (band = DotUsedList; band != NULL; band = band->next) - fprintf(stderr, "DEBUG: %p (used)\n", band); - for (band = DotAvailList; band != NULL; band = band->next) - fprintf(stderr, "DEBUG: %p (avail)\n", band); - - fputs("DEBUG: ----END----\n", stderr); - - for (band = DotUsedList; band != NULL; band = next) - { - next = band->next; - - OutputBand(ppd, header, band); - - fprintf(stderr, "DEBUG: freeing used band %p, prev = %p, next = %p\n", - band, band->prev, band->next); - - free(band->buffer); - free(band); - } - - /* - * Free memory for the available bands, if any... - */ - - for (band = DotAvailList; band != NULL; band = next) - { - next = band->next; - - fprintf(stderr, "DEBUG: freeing avail band %p, prev = %p, next = %p\n", - band, band->prev, band->next); - - free(band->buffer); - free(band); - } - } - else - free(DotBuffers[0]); - - /* - * Output a page eject sequence... - */ - - putchar(12); - - /* - * Free memory for the page... - */ - - for (i = 0; i < PrinterPlanes; i ++) - { - cupsDitherDelete(DitherStates[i]); - cupsLutDelete(DitherLuts[i]); - } - - free(OutputBuffers[0]); - - free(PixelBuffer); - free(InputBuffer); - free(CompBuffer); - - cupsCMYKDelete(CMYK); - - if (RGB) - { - cupsRGBDelete(RGB); - free(CMYKBuffer); - } -} - - -/* - * 'Shutdown()' - Shutdown a printer. - */ - -void -Shutdown(ppd_file_t *ppd) /* I - PPD file */ -{ - /* - * Reset the printer... - */ - - printf("\033@"); - - if (ppd->model_number & ESCP_REMOTE) - { - /* - * Go into remote mode... - */ - - cupsWritePrintData("\033(R\010\000\000REMOTE1", 13); - - /* - * Load defaults... - */ - - cupsWritePrintData("LD\000\000", 4); - - /* - * Exit remote mode... - */ - - cupsWritePrintData("\033\000\000\000", 4); - } -} - - -/* - * 'AddBand()' - Add a band of data to the used list. - */ - -void -AddBand(cups_weave_t *band) /* I - Band to add */ -{ - cups_weave_t *current, /* Current band */ - *prev; /* Previous band */ - - - if (band->count < 1) - return; - - for (current = DotUsedList, prev = NULL; - current != NULL; - prev = current, current = current->next) - if (band->y < current->y || - (band->y == current->y && band->x < current->x) || - (band->y == current->y && band->x == current->x && - band->plane < current->plane)) - break; - - if (current != NULL) - { - /* - * Insert the band... - */ - - band->next = current; - band->prev = prev; - current->prev = band; - - if (prev != NULL) - prev->next = band; - else - DotUsedList = band; - } - else if (prev != NULL) - { - /* - * Append the band to the end... - */ - - band->prev = prev; - prev->next = band; - band->next = NULL; - } - else - { - /* - * First band in list... - */ - - DotUsedList = band; - band->prev = NULL; - band->next = NULL; - } -} - - -/* - * 'CancelJob()' - Cancel the current job... - */ - -void -CancelJob(int sig) /* I - Signal */ -{ - (void)sig; - - Canceled = 1; -} - - -/* - * 'CompressData()' - Compress a line of graphics. - */ - -void -CompressData(ppd_file_t *ppd, /* I - PPD file information */ - const unsigned char *line, /* I - Data to compress */ - const int length,/* I - Number of bytes */ - int plane, /* I - Color plane */ - int type, /* I - Type of compression */ - const int rows, /* I - Number of lines to write */ - const int xstep, /* I - Spacing between columns */ - const int ystep, /* I - Spacing between lines */ - const int offset)/* I - Head offset */ -{ - register const unsigned char *line_ptr, - /* Current byte pointer */ - *line_end, /* End-of-line byte pointer */ - *start; /* Start of compression sequence */ - register unsigned char *comp_ptr; /* Pointer into compression buffer */ - register int count; /* Count of bytes for output */ - register int bytes; /* Number of bytes per row */ - static int ctable[7][7] = /* Colors */ - { - { 0, 0, 0, 0, 0, 0, 0 }, /* K */ - { 0, 16, 0, 0, 0, 0, 0 }, /* Kk */ - { 2, 1, 4, 0, 0, 0, 0 }, /* CMY */ - { 2, 1, 4, 0, 0, 0, 0 }, /* CMYK */ - { 0, 0, 0, 0, 0, 0, 0 }, - { 2, 18, 1, 17, 4, 0, 0 }, /* CcMmYK */ - { 2, 18, 1, 17, 4, 0, 16 }, /* CcMmYKk */ - }; - - - switch (type) - { - case 0 : - /* - * Do no compression... - */ - - line_ptr = (const unsigned char *)line; - line_end = (const unsigned char *)line + length; - break; - - default : - /* - * Do TIFF pack-bits encoding... - */ - - line_ptr = (const unsigned char *)line; - line_end = (const unsigned char *)line + length; - comp_ptr = CompBuffer; - - while (line_ptr < line_end && (comp_ptr - CompBuffer) < length) - { - if ((line_ptr + 1) >= line_end) - { - /* - * Single byte on the end... - */ - - *comp_ptr++ = 0x00; - *comp_ptr++ = *line_ptr++; - } - else if (line_ptr[0] == line_ptr[1]) - { - /* - * Repeated sequence... - */ - - line_ptr ++; - count = 2; - - while (line_ptr < (line_end - 1) && - line_ptr[0] == line_ptr[1] && - count < 127) - { - line_ptr ++; - count ++; - } - - *comp_ptr++ = 257 - count; - *comp_ptr++ = *line_ptr++; - } - else - { - /* - * Non-repeated sequence... - */ - - start = line_ptr; - line_ptr ++; - count = 1; - - while (line_ptr < (line_end - 1) && - line_ptr[0] != line_ptr[1] && - count < 127) - { - line_ptr ++; - count ++; - } - - *comp_ptr++ = count - 1; - - memcpy(comp_ptr, start, count); - comp_ptr += count; - } - } - - if ((comp_ptr - CompBuffer) < length) - { - line_ptr = (const unsigned char *)CompBuffer; - line_end = (const unsigned char *)comp_ptr; - } - else - { - type = 0; - line_ptr = (const unsigned char *)line; - line_end = (const unsigned char *)line + length; - } - break; - } - - /* - * Position the print head... - */ - - putchar(0x0d); - - if (offset) - { - if (BitPlanes == 1) - cupsWritePrintData("\033(\\\004\000\240\005", 7); - else - printf("\033\\"); - - putchar(offset); - putchar(offset >> 8); - } - - /* - * Send the graphics... - */ - - bytes = length / rows; - - if (ppd->model_number & ESCP_RASTER_ESCI) - { - /* - * Send graphics with ESC i command. - */ - - printf("\033i"); - putchar(ctable[PrinterPlanes - 1][plane]); - putchar(type != 0); - putchar(BitPlanes); - putchar(bytes & 255); - putchar(bytes >> 8); - putchar(rows & 255); - putchar(rows >> 8); - } - else - { - /* - * Set the color if necessary... - */ - - if (PrinterPlanes > 1) - { - plane = ctable[PrinterPlanes - 1][plane]; - - if (plane & 0x10) - printf("\033(r%c%c%c%c", 2, 0, 1, plane & 0x0f); - else - printf("\033r%c", plane); - } - - /* - * Send graphics with ESC . command. - */ - - bytes *= 8; - - printf("\033."); - putchar(type != 0); - putchar(ystep); - putchar(xstep); - putchar(rows); - putchar(bytes & 255); - putchar(bytes >> 8); - } - - cupsWritePrintData(line_ptr, line_end - line_ptr); -} - - -/* - * 'OutputBand()' - Output a band of graphics. - */ - -void -OutputBand(ppd_file_t *ppd, /* I - PPD file */ - cups_page_header2_t *header, /* I - Page header */ - cups_weave_t *band) /* I - Current band */ -{ - int xstep, /* Spacing between columns */ - ystep; /* Spacing between rows */ - - - /* - * Interleaved ESC/P2 graphics... - */ - - OutputFeed = band->y - DotRowCurrent; - DotRowCurrent = band->y; - - fprintf(stderr, "DEBUG: Printing band %p, x = %d, y = %d, plane = %d, count = %d, OutputFeed = %d\n", - band, band->x, band->y, band->plane, band->count, OutputFeed); - - /* - * Compute step values... - */ - - xstep = 3600 * DotColStep / header->HWResolution[0]; - ystep = 3600 * DotRowStep / header->HWResolution[1]; - - /* - * Output the band... - */ - - if (OutputFeed > 0) - { - cupsWritePrintData("\033(v\002\000", 5); - putchar(OutputFeed & 255); - putchar(OutputFeed >> 8); - - OutputFeed = 0; - } - - CompressData(ppd, band->buffer, band->count * DotBufferSize, band->plane, - header->cupsCompression, band->count, xstep, ystep, band->x); - - /* - * Clear the band... - */ - - memset(band->buffer, 0, band->count * DotBufferSize); - band->dirty = 0; - - /* - * Flush the output buffers... - */ - - fflush(stdout); -} - - -/* - * 'ProcessLine()' - Read graphics from the page stream and output as needed. - */ - -void -ProcessLine(ppd_file_t *ppd, /* I - PPD file */ - cups_raster_t *ras, /* I - Raster stream */ - cups_page_header2_t *header, /* I - Page header */ - const int y) /* I - Current scanline */ -{ - int plane, /* Current color plane */ - width, /* Width of line */ - subwidth, /* Width of interleaved row */ - subrow, /* Subrow for interleaved output */ - offset, /* Offset to current line */ - pass, /* Pass number */ - xstep, /* X step value */ - ystep; /* Y step value */ - cups_weave_t *band; /* Current band */ - - - /* - * Read a row of graphics... - */ - - if (!cupsRasterReadPixels(ras, PixelBuffer, header->cupsBytesPerLine)) - return; - - /* - * Perform the color separation... - */ - - width = header->cupsWidth; - subwidth = header->cupsWidth / DotColStep; - xstep = 3600 / header->HWResolution[0]; - ystep = 3600 / header->HWResolution[1]; - - switch (header->cupsColorSpace) - { - case CUPS_CSPACE_W : - if (RGB) - { - cupsRGBDoGray(RGB, PixelBuffer, CMYKBuffer, width); - cupsCMYKDoCMYK(CMYK, CMYKBuffer, InputBuffer, width); - } - else - cupsCMYKDoGray(CMYK, PixelBuffer, InputBuffer, width); - break; - - case CUPS_CSPACE_K : - cupsCMYKDoBlack(CMYK, PixelBuffer, InputBuffer, width); - break; - - default : - case CUPS_CSPACE_RGB : - if (RGB) - { - cupsRGBDoRGB(RGB, PixelBuffer, CMYKBuffer, width); - cupsCMYKDoCMYK(CMYK, CMYKBuffer, InputBuffer, width); - } - else - cupsCMYKDoRGB(CMYK, PixelBuffer, InputBuffer, width); - break; - - case CUPS_CSPACE_CMYK : - cupsCMYKDoCMYK(CMYK, PixelBuffer, InputBuffer, width); - break; - } - - /* - * Dither the pixels... - */ - - for (plane = 0; plane < PrinterPlanes; plane ++) - { - cupsDitherLine(DitherStates[plane], DitherLuts[plane], InputBuffer + plane, - PrinterPlanes, OutputBuffers[plane]); - - if (DotRowMax == 1) - { - /* - * Handle microweaved output... - */ - - if (cupsCheckBytes(OutputBuffers[plane], width)) - continue; - - if (BitPlanes == 1) - cupsPackHorizontal(OutputBuffers[plane], DotBuffers[plane], - width, 0, 1); - else - cupsPackHorizontal2(OutputBuffers[plane], DotBuffers[plane], - width, 1); - - if (OutputFeed > 0) - { - cupsWritePrintData("\033(v\002\000", 5); - putchar(OutputFeed & 255); - putchar(OutputFeed >> 8); - OutputFeed = 0; - } - - CompressData(ppd, DotBuffers[plane], DotBufferSize, plane, 1, 1, - xstep, ystep, 0); - fflush(stdout); - } - else - { - /* - * Handle softweaved output... - */ - - for (pass = 0, subrow = y % DotRowStep; - pass < DotColStep; - pass ++, subrow += DotRowStep) - { - /* - * See if we need to output the band... - */ - - band = DotBands[subrow][plane]; - offset = band->row * DotBufferSize; - - if (BitPlanes == 1) - cupsPackHorizontal(OutputBuffers[plane] + pass, - band->buffer + offset, subwidth, 0, DotColStep); - else - cupsPackHorizontal2(OutputBuffers[plane] + pass, - band->buffer + offset, subwidth, DotColStep); - - band->row ++; - band->dirty |= !cupsCheckBytes(band->buffer + offset, DotBufferSize); - if (band->row >= band->count) - { - if (band->dirty) - { - /* - * Dirty band needs to be added to the used list... - */ - - AddBand(band); - - /* - * Then find a new band... - */ - - if (DotAvailList == NULL) - { - OutputBand(ppd, header, DotUsedList); - - DotBands[subrow][plane] = DotUsedList; - DotUsedList->x = band->x; - DotUsedList->y = band->y + band->count * DotRowStep; - DotUsedList->plane = band->plane; - DotUsedList->row = 0; - DotUsedList->count = DotRowCount; - DotUsedList = DotUsedList->next; - } - else - { - DotBands[subrow][plane] = DotAvailList; - DotAvailList->x = band->x; - DotAvailList->y = band->y + band->count * DotRowStep; - DotAvailList->plane = band->plane; - DotAvailList->row = 0; - DotAvailList->count = DotRowCount; - DotAvailList = DotAvailList->next; - } - } - else - { - /* - * This band isn't dirty, so reuse it... - */ - - fprintf(stderr, "DEBUG: Blank band %p, x = %d, y = %d, plane = %d, count = %d\n", - band, band->x, band->y, band->plane, band->count); - - band->y += band->count * DotRowStep; - band->row = 0; - band->count = DotRowCount; - } - } - } - } - } - - if (DotRowMax == 1) - OutputFeed ++; -} - - -/* - * 'main()' - Main entry and processing of driver. - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ -{ - int fd; /* File descriptor */ - cups_raster_t *ras; /* Raster stream for printing */ - cups_page_header2_t header; /* Page header from file */ - int page; /* Current page */ - int y; /* Current line */ - ppd_file_t *ppd; /* PPD file */ - int num_options; /* Number of options */ - cups_option_t *options; /* Options */ -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ - - - /* - * Make sure status messages are not buffered... - */ - - setbuf(stderr, NULL); - - /* - * Check command-line... - */ - - if (argc < 6 || argc > 7) - { - _cupsLangPrintFilter(stderr, "ERROR", - _("%s job-id user title copies options [file]"), - "rastertoescpx"); - return (1); - } - - num_options = cupsParseOptions(argv[5], 0, &options); - - /* - * Open the PPD file... - */ - - ppd = ppdOpenFile(getenv("PPD")); - - if (!ppd) - { - ppd_status_t status; /* PPD error */ - int linenum; /* Line number */ - - _cupsLangPrintFilter(stderr, "ERROR", - _("The PPD file could not be opened.")); - - status = ppdLastError(&linenum); - - fprintf(stderr, "DEBUG: %s on line %d.\n", ppdErrorString(status), linenum); - - return (1); - } - - ppdMarkDefaults(ppd); - cupsMarkOptions(ppd, num_options, options); - - /* - * Open the page stream... - */ - - if (argc == 7) - { - if ((fd = open(argv[6], O_RDONLY)) == -1) - { - _cupsLangPrintError("ERROR", _("Unable to open raster file")); - return (1); - } - } - else - fd = 0; - - ras = cupsRasterOpen(fd, CUPS_RASTER_READ); - - /* - * Register a signal handler to eject the current page if the - * job is cancelled. - */ - - Canceled = 0; - -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, CancelJob); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = CancelJob; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, CancelJob); -#endif /* HAVE_SIGSET */ - - /* - * Initialize the print device... - */ - - Setup(ppd); - - /* - * Process pages as needed... - */ - - page = 0; - - while (cupsRasterReadHeader2(ras, &header)) - { - /* - * Write a status message with the page number and number of copies. - */ - - if (Canceled) - break; - - page ++; - - fprintf(stderr, "PAGE: %d 1\n", page); - _cupsLangPrintFilter(stderr, "INFO", _("Starting page %d."), page); - - StartPage(ppd, &header); - - for (y = 0; y < header.cupsHeight; y ++) - { - /* - * Let the user know how far we have progressed... - */ - - if (Canceled) - break; - - if ((y & 127) == 0) - { - _cupsLangPrintFilter(stderr, "INFO", - _("Printing page %d, %d%% complete."), - page, 100 * y / header.cupsHeight); - fprintf(stderr, "ATTR: job-media-progress=%d\n", - 100 * y / header.cupsHeight); - } - - /* - * Read and write a line of graphics or whitespace... - */ - - ProcessLine(ppd, ras, &header, y); - } - - /* - * Eject the page... - */ - - _cupsLangPrintFilter(stderr, "INFO", _("Finished page %d."), page); - - EndPage(ppd, &header); - - if (Canceled) - break; - } - - Shutdown(ppd); - - cupsFreeOptions(num_options, options); - - cupsRasterClose(ras); - - if (fd != 0) - close(fd); - - if (page == 0) - { - _cupsLangPrintFilter(stderr, "ERROR", _("No pages were found.")); - return (1); - } - else - { - _cupsLangPrintFilter(stderr, "INFO", _("Ready to print.")); - return (0); - } -} - - -/* - * End of "$Id$". - */ diff --git a/driver/rastertopclx.c b/driver/rastertopclx.c deleted file mode 100644 index 42f008220..000000000 --- a/driver/rastertopclx.c +++ /dev/null @@ -1,1956 +0,0 @@ -/* - * "$Id$" - * - * Advanced HP Page Control Language and Raster Transfer Language - * filter for CUPS. - * - * Copyright 2007-2010 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * StartPage() - Start a page of graphics. - * EndPage() - Finish a page of graphics. - * Shutdown() - Shutdown a printer. - * CancelJob() - Cancel the current job... - * CompressData() - Compress a line of graphics. - * OutputLine() - Output the specified number of lines of graphics. - * ReadLine() - Read graphics from the page stream. - * main() - Main entry and processing of driver. - */ - -/* - * Include necessary headers... - */ - -#include "driver.h" -#include -#include -#include "pcl-common.h" -#include - - -/* - * Output modes... - */ - -typedef enum -{ - OUTPUT_BITMAP, /* Output bitmap data from RIP */ - OUTPUT_INVERBIT, /* Output inverted bitmap data */ - OUTPUT_RGB, /* Output 24-bit RGB data from RIP */ - OUTPUT_DITHERED /* Output dithered data */ -} pcl_output_t; - - -/* - * Globals... - */ - -cups_rgb_t *RGB; /* RGB color separation data */ -cups_cmyk_t *CMYK; /* CMYK color separation data */ -unsigned char *PixelBuffer, /* Pixel buffer */ - *CMYKBuffer, /* CMYK buffer */ - *OutputBuffers[6], /* Output buffers */ - *DotBuffers[6], /* Bit buffers */ - *CompBuffer, /* Compression buffer */ - *SeedBuffer, /* Mode 3 seed buffers */ - BlankValue; /* The blank value */ -short *InputBuffer; /* Color separation buffer */ -cups_lut_t *DitherLuts[6]; /* Lookup tables for dithering */ -cups_dither_t *DitherStates[6]; /* Dither state tables */ -int PrinterPlanes, /* Number of color planes */ - SeedInvalid, /* Contents of seed buffer invalid? */ - DotBits[6], /* Number of bits per color */ - DotBufferSizes[6], /* Size of one row of color dots */ - DotBufferSize, /* Size of complete line */ - OutputFeed, /* Number of lines to skip */ - Page; /* Current page number */ -pcl_output_t OutputMode; /* Output mode - see OUTPUT_ consts */ -const int ColorOrders[7][7] = /* Order of color planes */ - { - { 0, 0, 0, 0, 0, 0, 0 }, /* Black */ - { 0, 0, 0, 0, 0, 0, 0 }, - { 0, 1, 2, 0, 0, 0, 0 }, /* CMY */ - { 3, 0, 1, 2, 0, 0, 0 }, /* KCMY */ - { 0, 0, 0, 0, 0, 0, 0 }, - { 5, 0, 1, 2, 3, 4, 0 }, /* KCMYcm */ - { 5, 0, 1, 2, 3, 4, 6 } /* KCMYcmk */ - }; -int Canceled; /* Is the job canceled? */ - - -/* - * Prototypes... - */ - -void StartPage(ppd_file_t *ppd, cups_page_header2_t *header, int job_id, - const char *user, const char *title, int num_options, - cups_option_t *options); -void EndPage(ppd_file_t *ppd, cups_page_header2_t *header); -void Shutdown(ppd_file_t *ppd, int job_id, const char *user, - const char *title, int num_options, cups_option_t *options); - -void CancelJob(int sig); -void CompressData(unsigned char *line, int length, int plane, int pend, - int type); -void OutputLine(ppd_file_t *ppd, cups_page_header2_t *header); -int ReadLine(cups_raster_t *ras, cups_page_header2_t *header); - - -/* - * 'StartPage()' - Start a page of graphics. - */ - -void -StartPage(ppd_file_t *ppd, /* I - PPD file */ - cups_page_header2_t *header, /* I - Page header */ - int job_id, /* I - Job ID */ - const char *user, /* I - User printing job */ - const char *title, /* I - Title of job */ - int num_options, - /* I - Number of command-line options */ - cups_option_t *options) /* I - Command-line options */ -{ - int i; /* Temporary/looping var */ - int plane; /* Current plane */ - char s[255]; /* Temporary value */ - const char *colormodel; /* Color model string */ - char resolution[PPD_MAX_NAME], - /* Resolution string */ - spec[PPD_MAX_NAME]; /* PPD attribute name */ - ppd_attr_t *attr; /* Attribute from PPD file */ - ppd_choice_t *choice; /* Selected option */ - const int *order; /* Order to use */ - int xorigin, /* X origin of page */ - yorigin; /* Y origin of page */ - static const float default_lut[2] = /* Default dithering lookup table */ - { - 0.0, - 1.0 - }; - - - /* - * Debug info... - */ - - fprintf(stderr, "DEBUG: StartPage...\n"); - fprintf(stderr, "DEBUG: MediaClass = \"%s\"\n", header->MediaClass); - fprintf(stderr, "DEBUG: MediaColor = \"%s\"\n", header->MediaColor); - fprintf(stderr, "DEBUG: MediaType = \"%s\"\n", header->MediaType); - fprintf(stderr, "DEBUG: OutputType = \"%s\"\n", header->OutputType); - - fprintf(stderr, "DEBUG: AdvanceDistance = %d\n", header->AdvanceDistance); - fprintf(stderr, "DEBUG: AdvanceMedia = %d\n", header->AdvanceMedia); - fprintf(stderr, "DEBUG: Collate = %d\n", header->Collate); - fprintf(stderr, "DEBUG: CutMedia = %d\n", header->CutMedia); - fprintf(stderr, "DEBUG: Duplex = %d\n", header->Duplex); - fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], - header->HWResolution[1]); - fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", - header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], - header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]); - fprintf(stderr, "DEBUG: InsertSheet = %d\n", header->InsertSheet); - fprintf(stderr, "DEBUG: Jog = %d\n", header->Jog); - fprintf(stderr, "DEBUG: LeadingEdge = %d\n", header->LeadingEdge); - fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0], - header->Margins[1]); - fprintf(stderr, "DEBUG: ManualFeed = %d\n", header->ManualFeed); - fprintf(stderr, "DEBUG: MediaPosition = %d\n", header->MediaPosition); - fprintf(stderr, "DEBUG: MediaWeight = %d\n", header->MediaWeight); - fprintf(stderr, "DEBUG: MirrorPrint = %d\n", header->MirrorPrint); - fprintf(stderr, "DEBUG: NegativePrint = %d\n", header->NegativePrint); - fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies); - fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation); - fprintf(stderr, "DEBUG: OutputFaceUp = %d\n", header->OutputFaceUp); - fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], - header->PageSize[1]); - fprintf(stderr, "DEBUG: Separations = %d\n", header->Separations); - fprintf(stderr, "DEBUG: TraySwitch = %d\n", header->TraySwitch); - fprintf(stderr, "DEBUG: Tumble = %d\n", header->Tumble); - fprintf(stderr, "DEBUG: cupsWidth = %d\n", header->cupsWidth); - fprintf(stderr, "DEBUG: cupsHeight = %d\n", header->cupsHeight); - fprintf(stderr, "DEBUG: cupsMediaType = %d\n", header->cupsMediaType); - fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", header->cupsBitsPerColor); - fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", header->cupsBitsPerPixel); - fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", header->cupsBytesPerLine); - fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder); - fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace); - fprintf(stderr, "DEBUG: cupsCompression = %d\n", header->cupsCompression); - -#ifdef __APPLE__ - /* - * MacOS X 10.2.x doesn't set most of the page device attributes, so check - * the options and set them accordingly... - */ - - if (ppdIsMarked(ppd, "Duplex", "DuplexNoTumble")) - { - header->Duplex = CUPS_TRUE; - header->Tumble = CUPS_FALSE; - } - else if (ppdIsMarked(ppd, "Duplex", "DuplexTumble")) - { - header->Duplex = CUPS_TRUE; - header->Tumble = CUPS_TRUE; - } - - fprintf(stderr, "DEBUG: num_options=%d\n", num_options); - - for (i = 0; i < num_options; i ++) - fprintf(stderr, "DEBUG: options[%d]=[\"%s\" \"%s\"]\n", i, - options[i].name, options[i].value); -#endif /* __APPLE__ */ - - /* - * Figure out the color model and spec strings... - */ - - switch (header->cupsColorSpace) - { - case CUPS_CSPACE_K : - colormodel = "Black"; - break; - case CUPS_CSPACE_W : - colormodel = "Gray"; - break; - default : - case CUPS_CSPACE_RGB : - colormodel = "RGB"; - break; - case CUPS_CSPACE_CMY : - colormodel = "CMY"; - break; - case CUPS_CSPACE_CMYK : - colormodel = "CMYK"; - break; - } - - if (header->HWResolution[0] != header->HWResolution[1]) - snprintf(resolution, sizeof(resolution), "%dx%ddpi", - header->HWResolution[0], header->HWResolution[1]); - else - snprintf(resolution, sizeof(resolution), "%ddpi", - header->HWResolution[0]); - - if (!header->MediaType[0]) - strcpy(header->MediaType, "PLAIN"); - - /* - * Get the dithering parameters... - */ - - BlankValue = 0x00; - - if (header->cupsBitsPerColor == 1) - { - /* - * Use raw bitmap mode... - */ - - switch (header->cupsColorSpace) - { - case CUPS_CSPACE_K : - OutputMode = OUTPUT_BITMAP; - PrinterPlanes = 1; - break; - case CUPS_CSPACE_W : - OutputMode = OUTPUT_INVERBIT; - PrinterPlanes = 1; - break; - default : - case CUPS_CSPACE_RGB : - OutputMode = OUTPUT_INVERBIT; - PrinterPlanes = 3; - break; - case CUPS_CSPACE_CMY : - OutputMode = OUTPUT_BITMAP; - PrinterPlanes = 3; - break; - case CUPS_CSPACE_CMYK : - OutputMode = OUTPUT_BITMAP; - PrinterPlanes = 4; - break; - } - - if (OutputMode == OUTPUT_INVERBIT) - BlankValue = 0xff; - - DotBufferSize = header->cupsBytesPerLine; - - memset(DitherLuts, 0, sizeof(DitherLuts)); - memset(DitherStates, 0, sizeof(DitherStates)); - } - else if (header->cupsColorSpace == CUPS_CSPACE_RGB && - (ppd->model_number & PCL_RASTER_RGB24)) - { - /* - * Use 24-bit RGB output mode... - */ - - OutputMode = OUTPUT_RGB; - PrinterPlanes = 3; - DotBufferSize = header->cupsBytesPerLine; - - if (header->cupsCompression == 10) - BlankValue = 0xff; - - memset(DitherLuts, 0, sizeof(DitherLuts)); - memset(DitherStates, 0, sizeof(DitherStates)); - } - else if ((header->cupsColorSpace == CUPS_CSPACE_K || - header->cupsColorSpace == CUPS_CSPACE_W) && - (ppd->model_number & PCL_RASTER_RGB24) && - header->cupsCompression == 10) - { - /* - * Use 24-bit RGB output mode for grayscale/black output... - */ - - OutputMode = OUTPUT_RGB; - PrinterPlanes = 1; - DotBufferSize = header->cupsBytesPerLine; - - if (header->cupsColorSpace == CUPS_CSPACE_W) - BlankValue = 0xff; - - memset(DitherLuts, 0, sizeof(DitherLuts)); - memset(DitherStates, 0, sizeof(DitherStates)); - } - else - { - /* - * Use dithered output mode... - */ - - OutputMode = OUTPUT_DITHERED; - - /* - * Load the appropriate color profiles... - */ - - RGB = NULL; - CMYK = NULL; - - fputs("DEBUG: Attempting to load color profiles using the following values:\n", stderr); - fprintf(stderr, "DEBUG: ColorModel = %s\n", colormodel); - fprintf(stderr, "DEBUG: MediaType = %s\n", header->MediaType); - fprintf(stderr, "DEBUG: Resolution = %s\n", resolution); - - if (header->cupsColorSpace == CUPS_CSPACE_RGB || - header->cupsColorSpace == CUPS_CSPACE_W) - RGB = cupsRGBLoad(ppd, colormodel, header->MediaType, resolution); - - CMYK = cupsCMYKLoad(ppd, colormodel, header->MediaType, resolution); - - if (RGB) - fputs("DEBUG: Loaded RGB separation from PPD.\n", stderr); - - if (CMYK) - fputs("DEBUG: Loaded CMYK separation from PPD.\n", stderr); - else - { - fputs("DEBUG: Loading default K separation.\n", stderr); - CMYK = cupsCMYKNew(1); - } - - PrinterPlanes = CMYK->num_channels; - - /* - * Use dithered mode... - */ - - switch (PrinterPlanes) - { - case 1 : /* K */ - DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Black"); - break; - - case 3 : /* CMY */ - DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Cyan"); - DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Magenta"); - DitherLuts[2] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Yellow"); - break; - - case 4 : /* CMYK */ - DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Cyan"); - DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Magenta"); - DitherLuts[2] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Yellow"); - DitherLuts[3] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Black"); - break; - - case 6 : /* CcMmYK */ - DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Cyan"); - DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "LightCyan"); - DitherLuts[2] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Magenta"); - DitherLuts[3] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "LightMagenta"); - DitherLuts[4] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Yellow"); - DitherLuts[5] = cupsLutLoad(ppd, colormodel, header->MediaType, - resolution, "Black"); - break; - } - - for (plane = 0; plane < PrinterPlanes; plane ++) - { - if (!DitherLuts[plane]) - DitherLuts[plane] = cupsLutNew(2, default_lut); - - if (DitherLuts[plane][4095].pixel > 1) - DotBits[plane] = 2; - else - DotBits[plane] = 1; - - DitherStates[plane] = cupsDitherNew(header->cupsWidth); - - if (!DitherLuts[plane]) - DitherLuts[plane] = cupsLutNew(2, default_lut); - } - } - - fprintf(stderr, "DEBUG: PrinterPlanes = %d\n", PrinterPlanes); - - /* - * Initialize the printer... - */ - - if ((attr = ppdFindAttr(ppd, "cupsInitialNulls", NULL)) != NULL) - for (i = atoi(attr->value); i > 0; i --) - putchar(0); - - if (Page == 1 && (ppd->model_number & PCL_PJL)) - { - pjl_escape(); - - /* - * PJL job setup... - */ - - pjl_set_job(job_id, user, title); - - if ((attr = ppdFindAttr(ppd, "cupsPJL", "StartJob")) != NULL) - pjl_write(ppd, attr->value, NULL, job_id, user, title, num_options, - options); - - snprintf(spec, sizeof(spec), "RENDERMODE.%s", colormodel); - if ((attr = ppdFindAttr(ppd, "cupsPJL", spec)) != NULL) - printf("@PJL SET RENDERMODE=%s\r\n", attr->value); - - snprintf(spec, sizeof(spec), "COLORSPACE.%s", colormodel); - if ((attr = ppdFindAttr(ppd, "cupsPJL", spec)) != NULL) - printf("@PJL SET COLORSPACE=%s\r\n", attr->value); - - snprintf(spec, sizeof(spec), "RENDERINTENT.%s", colormodel); - if ((attr = ppdFindAttr(ppd, "cupsPJL", spec)) != NULL) - printf("@PJL SET RENDERINTENT=%s\r\n", attr->value); - - if ((attr = ppdFindAttr(ppd, "cupsPJL", "Duplex")) != NULL) - { - sprintf(s, "%d", header->Duplex); - pjl_write(ppd, attr->value, s, job_id, user, title, num_options, options); - } - - if ((attr = ppdFindAttr(ppd, "cupsPJL", "Tumble")) != NULL) - { - sprintf(s, "%d", header->Tumble); - pjl_write(ppd, attr->value, s, job_id, user, title, num_options, options); - } - - if ((attr = ppdFindAttr(ppd, "cupsPJL", "MediaClass")) != NULL) - pjl_write(ppd, attr->value, header->MediaClass, job_id, user, title, - num_options, options); - - if ((attr = ppdFindAttr(ppd, "cupsPJL", "MediaColor")) != NULL) - pjl_write(ppd, attr->value, header->MediaColor, job_id, user, title, - num_options, options); - - if ((attr = ppdFindAttr(ppd, "cupsPJL", "MediaType")) != NULL) - pjl_write(ppd, attr->value, header->MediaType, job_id, user, title, - num_options, options); - - if ((attr = ppdFindAttr(ppd, "cupsPJL", "OutputType")) != NULL) - pjl_write(ppd, attr->value, header->OutputType, job_id, user, title, - num_options, options); - - if ((attr = ppdFindAttr(ppd, "cupsPJL", "cupsBooklet")) != NULL && - (choice = ppdFindMarkedChoice(ppd, "cupsBooklet")) != NULL) - pjl_write(ppd, attr->value, choice->choice, job_id, user, title, - num_options, options); - - if ((attr = ppdFindAttr(ppd, "cupsPJL", "Jog")) != NULL) - { - sprintf(s, "%d", header->Jog); - pjl_write(ppd, attr->value, s, job_id, user, title, num_options, options); - } - - if ((attr = ppdFindAttr(ppd, "cupsPJL", "cupsPunch")) != NULL && - (choice = ppdFindMarkedChoice(ppd, "cupsPunch")) != NULL) - pjl_write(ppd, attr->value, choice->choice, job_id, user, title, - num_options, options); - - if ((attr = ppdFindAttr(ppd, "cupsPJL", "cupsStaple")) != NULL && - (choice = ppdFindMarkedChoice(ppd, "cupsStaple")) != NULL) - pjl_write(ppd, attr->value, choice->choice, job_id, user, title, - num_options, options); - - if ((attr = ppdFindAttr(ppd, "cupsPJL", "cupsRET")) != NULL && - (choice = ppdFindMarkedChoice(ppd, "cupsRET")) != NULL) - pjl_write(ppd, attr->value, choice->choice, job_id, user, title, - num_options, options); - - if ((attr = ppdFindAttr(ppd, "cupsPJL", "cupsTonerSave")) != NULL && - (choice = ppdFindMarkedChoice(ppd, "cupsTonerSave")) != NULL) - pjl_write(ppd, attr->value, choice->choice, job_id, user, title, - num_options, options); - - if (ppd->model_number & PCL_PJL_PAPERWIDTH) - { - printf("@PJL SET PAPERLENGTH=%d\r\n", header->PageSize[1] * 10); - printf("@PJL SET PAPERWIDTH=%d\r\n", header->PageSize[0] * 10); - } - - if (ppd->model_number & PCL_PJL_RESOLUTION) - printf("@PJL SET RESOLUTION=%d\r\n", header->HWResolution[0]); - - if (ppd->model_number & PCL_PJL_HPGL2) - pjl_enter_language("HPGL2"); - else if (ppd->model_number & PCL_PJL_PCL3GUI) - pjl_enter_language("PCL3GUI"); - else - pjl_enter_language("PCL"); - } - - if (Page == 1) - { - pcl_reset(); - } - - if (ppd->model_number & PCL_PJL_HPGL2) - { - if (Page == 1) - { - /* - * HP-GL/2 initialization... - */ - - printf("IN;"); - printf("MG\"%d %s %s\";", job_id, user, title); - } - - /* - * Set media size, position, type, etc... - */ - - printf("BP5,0;"); - printf("PS%.0f,%.0f;", - header->cupsHeight * 1016.0 / header->HWResolution[1], - header->cupsWidth * 1016.0 / header->HWResolution[0]); - printf("PU;"); - printf("PA0,0"); - - printf("MT%d;", header->cupsMediaType); - - if (header->CutMedia == CUPS_CUT_PAGE) - printf("EC;"); - else - printf("EC0;"); - - /* - * Set graphics mode... - */ - - pcl_set_pcl_mode(0); - pcl_set_negative_motion(); - } - else - { - /* - * Set media size, position, type, etc... - */ - - if (!header->Duplex || (Page & 1)) - { - pcl_set_media_size(ppd, header->PageSize[0], header->PageSize[1]); - - if (header->MediaPosition) - pcl_set_media_source(header->MediaPosition); - - pcl_set_media_type(header->cupsMediaType); - - if (ppdFindAttr(ppd, "cupsPJL", "Duplex") == NULL) - pcl_set_duplex(header->Duplex, header->Tumble); - - /* - * Set the number of copies... - */ - - if (!ppd->manual_copies) - pcl_set_copies(header->NumCopies); - - /* - * Set the output order/bin... - */ - - if (ppdFindAttr(ppd, "cupsPJL", "Jog") == NULL && header->Jog) - printf("\033&l%dG", header->Jog); - } - else - { - /* - * Print on the back side... - */ - - printf("\033&a2G"); - } - - if (header->Duplex && (ppd->model_number & PCL_RASTER_CRD)) - { - /* - * Reload the media... - */ - - pcl_set_media_source(-2); - } - - /* - * Set the units for cursor positioning and go to the top of the form. - */ - - printf("\033&u%dD", header->HWResolution[0]); - printf("\033*p0Y\033*p0X"); - } - - if ((attr = cupsFindAttr(ppd, "cupsPCLQuality", colormodel, - header->MediaType, resolution, spec, - sizeof(spec))) != NULL) - { - /* - * Set the print quality... - */ - - if (ppd->model_number & PCL_PJL_HPGL2) - printf("QM%d", atoi(attr->value)); - else - printf("\033*o%dM", atoi(attr->value)); - } - - /* - * Enter graphics mode... - */ - - if (ppd->model_number & PCL_RASTER_CRD) - { - /* - * Use configure raster data command... - */ - - if (OutputMode == OUTPUT_RGB) - { - /* - * Send 12-byte configure raster data command with horizontal and - * vertical resolutions as well as a color count... - */ - - if ((attr = cupsFindAttr(ppd, "cupsPCLCRDMode", colormodel, - header->MediaType, resolution, spec, - sizeof(spec))) != NULL) - i = atoi(attr->value); - else - i = 31; - - printf("\033*g12W"); - putchar(6); /* Format 6 */ - putchar(i); /* Set pen mode */ - putchar(0x00); /* Number components */ - putchar(0x01); /* (1 for RGB) */ - - putchar(header->HWResolution[0] >> 8); - putchar(header->HWResolution[0]); - putchar(header->HWResolution[1] >> 8); - putchar(header->HWResolution[1]); - - putchar(header->cupsCompression); /* Compression mode 3 or 10 */ - putchar(0x01); /* Portrait orientation */ - putchar(0x20); /* Bits per pixel (32 = RGB) */ - putchar(0x01); /* Planes per pixel (1 = chunky RGB) */ - } - else - { - /* - * Send the configure raster data command with horizontal and - * vertical resolutions as well as a color count... - */ - - printf("\033*g%dW", PrinterPlanes * 6 + 2); - putchar(2); /* Format 2 */ - putchar(PrinterPlanes); /* Output planes */ - - order = ColorOrders[PrinterPlanes - 1]; - - for (i = 0; i < PrinterPlanes; i ++) - { - plane = order[i]; - - putchar(header->HWResolution[0] >> 8); - putchar(header->HWResolution[0]); - putchar(header->HWResolution[1] >> 8); - putchar(header->HWResolution[1]); - putchar(0); - putchar(1 << DotBits[plane]); - } - } - } - else if ((ppd->model_number & PCL_RASTER_CID) && OutputMode == OUTPUT_RGB) - { - /* - * Use configure image data command... - */ - - pcl_set_simple_resolution(header->HWResolution[0]); - /* Set output resolution */ - - cupsWritePrintData("\033*v6W\0\3\0\10\10\10", 11); - /* 24-bit RGB */ - } - else - { - /* - * Use simple raster commands... - */ - - pcl_set_simple_resolution(header->HWResolution[0]); - /* Set output resolution */ - - if (PrinterPlanes == 3) - pcl_set_simple_cmy(); - else if (PrinterPlanes == 4) - pcl_set_simple_kcmy(); - } - - if ((attr = ppdFindAttr(ppd, "cupsPCLOrigin", "X")) != NULL) - xorigin = atoi(attr->value); - else - xorigin = 0; - - if ((attr = ppdFindAttr(ppd, "cupsPCLOrigin", "Y")) != NULL) - yorigin = atoi(attr->value); - else - yorigin = 120; - - printf("\033&a%dH\033&a%dV", xorigin, yorigin); - printf("\033*r%dS", header->cupsWidth); - printf("\033*r%dT", header->cupsHeight); - printf("\033*r1A"); - - if (header->cupsCompression && header->cupsCompression != 10) - printf("\033*b%dM", header->cupsCompression); - - OutputFeed = 0; - - /* - * Allocate memory for the page... - */ - - PixelBuffer = malloc(header->cupsBytesPerLine); - - if (OutputMode == OUTPUT_DITHERED) - { - InputBuffer = malloc(header->cupsWidth * PrinterPlanes * 2); - OutputBuffers[0] = malloc(PrinterPlanes * header->cupsWidth); - - for (i = 1; i < PrinterPlanes; i ++) - OutputBuffers[i] = OutputBuffers[0] + i * header->cupsWidth; - - if (RGB) - CMYKBuffer = malloc(header->cupsWidth * PrinterPlanes); - - for (plane = 0, DotBufferSize = 0; plane < PrinterPlanes; plane ++) - { - DotBufferSizes[plane] = (header->cupsWidth + 7) / 8 * DotBits[plane]; - DotBufferSize += DotBufferSizes[plane]; - } - - DotBuffers[0] = malloc(DotBufferSize); - for (plane = 1; plane < PrinterPlanes; plane ++) - DotBuffers[plane] = DotBuffers[plane - 1] + DotBufferSizes[plane - 1]; - } - - if (header->cupsCompression) - CompBuffer = malloc(DotBufferSize * 4); - - if (header->cupsCompression >= 3) - SeedBuffer = malloc(DotBufferSize); - - SeedInvalid = 1; - - fprintf(stderr, "BlankValue=%d\n", BlankValue); -} - - -/* - * 'EndPage()' - Finish a page of graphics. - */ - -void -EndPage(ppd_file_t *ppd, /* I - PPD file */ - cups_page_header2_t *header) /* I - Page header */ -{ - int plane; /* Current plane */ - - - /* - * End graphics mode... - */ - - if (ppd->model_number & PCL_RASTER_END_COLOR) - printf("\033*rC"); /* End color GFX */ - else - printf("\033*r0B"); /* End B&W GFX */ - - /* - * Output a page eject sequence... - */ - - if (ppd->model_number & PCL_PJL_HPGL2) - { - pcl_set_hpgl_mode(0); /* Back to HP-GL/2 mode */ - printf("PG;"); /* Eject the current page */ - } - else if (!(header->Duplex && (Page & 1))) - printf("\014"); /* Eject current page */ - - /* - * Free memory for the page... - */ - - free(PixelBuffer); - - if (OutputMode == OUTPUT_DITHERED) - { - for (plane = 0; plane < PrinterPlanes; plane ++) - { - cupsDitherDelete(DitherStates[plane]); - cupsLutDelete(DitherLuts[plane]); - } - - free(DotBuffers[0]); - free(InputBuffer); - free(OutputBuffers[0]); - - cupsCMYKDelete(CMYK); - - if (RGB) - { - cupsRGBDelete(RGB); - free(CMYKBuffer); - } - } - - if (header->cupsCompression) - free(CompBuffer); - - if (header->cupsCompression >= 3) - free(SeedBuffer); -} - - -/* - * 'Shutdown()' - Shutdown a printer. - */ - -void -Shutdown(ppd_file_t *ppd, /* I - PPD file */ - int job_id, /* I - Job ID */ - const char *user, /* I - User printing job */ - const char *title, /* I - Title of job */ - int num_options,/* I - Number of command-line options */ - cups_option_t *options) /* I - Command-line options */ -{ - ppd_attr_t *attr; /* Attribute from PPD file */ - - - if ((attr = ppdFindAttr(ppd, "cupsPCL", "EndJob")) != NULL) - { - /* - * Tell the printer how many pages were in the job... - */ - - putchar(0x1b); - printf(attr->value, Page); - } - else - { - /* - * Return the printer to the default state... - */ - - pcl_reset(); - } - - if (ppd->model_number & PCL_PJL) - { - pjl_escape(); - - if ((attr = ppdFindAttr(ppd, "cupsPJL", "EndJob")) != NULL) - pjl_write(ppd, attr->value, NULL, job_id, user, title, num_options, - options); - else - printf("@PJL EOJ\r\n"); - - pjl_escape(); - } -} - - -/* - * 'CancelJob()' - Cancel the current job... - */ - -void -CancelJob(int sig) /* I - Signal */ -{ - (void)sig; - - Canceled = 1; -} - - -/* - * 'CompressData()' - Compress a line of graphics. - */ - -void -CompressData(unsigned char *line, /* I - Data to compress */ - int length, /* I - Number of bytes */ - int plane, /* I - Color plane */ - int pend, /* I - End character for data */ - int type) /* I - Type of compression */ -{ - unsigned char *line_ptr, /* Current byte pointer */ - *line_end, /* End-of-line byte pointer */ - *comp_ptr, /* Pointer into compression buffer */ - *start, /* Start of compression sequence */ - *seed; /* Seed buffer pointer */ - int count, /* Count of bytes for output */ - offset, /* Offset of bytes for output */ - temp; /* Temporary count */ - int r, g, b; /* RGB deltas for mode 10 compression */ - - - switch (type) - { - default : - /* - * Do no compression; with a mode-0 only printer, we can compress blank - * lines... - */ - - line_ptr = line; - - if (cupsCheckBytes(line, length)) - line_end = line; /* Blank line */ - else - line_end = line + length; /* Non-blank line */ - break; - - case 1 : - /* - * Do run-length encoding... - */ - - line_end = line + length; - for (line_ptr = line, comp_ptr = CompBuffer; - line_ptr < line_end; - comp_ptr += 2, line_ptr += count) - { - for (count = 1; - (line_ptr + count) < line_end && - line_ptr[0] == line_ptr[count] && - count < 256; - count ++); - - comp_ptr[0] = count - 1; - comp_ptr[1] = line_ptr[0]; - } - - line_ptr = CompBuffer; - line_end = comp_ptr; - break; - - case 2 : - /* - * Do TIFF pack-bits encoding... - */ - - line_ptr = line; - line_end = line + length; - comp_ptr = CompBuffer; - - while (line_ptr < line_end) - { - if ((line_ptr + 1) >= line_end) - { - /* - * Single byte on the end... - */ - - *comp_ptr++ = 0x00; - *comp_ptr++ = *line_ptr++; - } - else if (line_ptr[0] == line_ptr[1]) - { - /* - * Repeated sequence... - */ - - line_ptr ++; - count = 2; - - while (line_ptr < (line_end - 1) && - line_ptr[0] == line_ptr[1] && - count < 127) - { - line_ptr ++; - count ++; - } - - *comp_ptr++ = 257 - count; - *comp_ptr++ = *line_ptr++; - } - else - { - /* - * Non-repeated sequence... - */ - - start = line_ptr; - line_ptr ++; - count = 1; - - while (line_ptr < (line_end - 1) && - line_ptr[0] != line_ptr[1] && - count < 127) - { - line_ptr ++; - count ++; - } - - *comp_ptr++ = count - 1; - - memcpy(comp_ptr, start, count); - comp_ptr += count; - } - } - - line_ptr = CompBuffer; - line_end = comp_ptr; - break; - - case 3 : - /* - * Do delta-row compression... - */ - - line_ptr = line; - line_end = line + length; - - comp_ptr = CompBuffer; - seed = SeedBuffer + plane * length; - - while (line_ptr < line_end) - { - /* - * Find the next non-matching sequence... - */ - - start = line_ptr; - - if (SeedInvalid) - { - /* - * The seed buffer is invalid, so do the next 8 bytes, max... - */ - - offset = 0; - - if ((count = line_end - line_ptr) > 8) - count = 8; - - line_ptr += count; - } - else - { - /* - * The seed buffer is valid, so compare against it... - */ - - while (*line_ptr == *seed && - line_ptr < line_end) - { - line_ptr ++; - seed ++; - } - - if (line_ptr == line_end) - break; - - offset = line_ptr - start; - - /* - * Find up to 8 non-matching bytes... - */ - - start = line_ptr; - count = 0; - while (*line_ptr != *seed && - line_ptr < line_end && - count < 8) - { - line_ptr ++; - seed ++; - count ++; - } - } - - /* - * Place mode 3 compression data in the buffer; see HP manuals - * for details... - */ - - if (offset >= 31) - { - /* - * Output multi-byte offset... - */ - - *comp_ptr++ = ((count - 1) << 5) | 31; - - offset -= 31; - while (offset >= 255) - { - *comp_ptr++ = 255; - offset -= 255; - } - - *comp_ptr++ = offset; - } - else - { - /* - * Output single-byte offset... - */ - - *comp_ptr++ = ((count - 1) << 5) | offset; - } - - memcpy(comp_ptr, start, count); - comp_ptr += count; - } - - line_ptr = CompBuffer; - line_end = comp_ptr; - - memcpy(SeedBuffer + plane * length, line, length); - break; - - case 10 : - /* - * Mode 10 "near lossless" RGB compression... - */ - - line_ptr = line; - line_end = line + length; - - comp_ptr = CompBuffer; - seed = SeedBuffer; - - if (PrinterPlanes == 1) - { - /* - * Do grayscale compression to RGB... - */ - - while (line_ptr < line_end) - { - /* - * Find the next non-matching sequence... - */ - - start = line_ptr; - while (line_ptr < line_end && - *line_ptr == *seed) - { - line_ptr ++; - seed ++; - } - - if (line_ptr == line_end) - break; - - offset = line_ptr - start; - - /* - * Find non-matching grayscale pixels... - */ - - start = line_ptr; - while (line_ptr < line_end && - *line_ptr != *seed) - { - line_ptr ++; - seed ++; - } - - count = line_ptr - start; - -#if 0 - fprintf(stderr, "DEBUG: offset=%d, count=%d, comp_ptr=%p(%d of %d)...\n", - offset, count, comp_ptr, comp_ptr - CompBuffer, - BytesPerLine * 5); -#endif /* 0 */ - - /* - * Place mode 10 compression data in the buffer; each sequence - * starts with a command byte that looks like: - * - * CMD SRC SRC OFF OFF CNT CNT CNT - * - * For the purpose of this driver, CMD and SRC are always 0. - * - * If the offset >= 3 then additional offset bytes follow the - * first command byte, each byte == 255 until the last one. - * - * If the count >= 7, then additional count bytes follow each - * group of pixels, each byte == 255 until the last one. - * - * The offset and count are in RGB tuples (not bytes, as for - * Mode 3 and 9)... - */ - - if (offset >= 3) - { - /* - * Output multi-byte offset... - */ - - if (count > 7) - *comp_ptr++ = 0x1f; - else - *comp_ptr++ = 0x18 | (count - 1); - - offset -= 3; - while (offset >= 255) - { - *comp_ptr++ = 255; - offset -= 255; - } - - *comp_ptr++ = offset; - } - else - { - /* - * Output single-byte offset... - */ - - if (count > 7) - *comp_ptr++ = (offset << 3) | 0x07; - else - *comp_ptr++ = (offset << 3) | (count - 1); - } - - temp = count - 8; - seed -= count; - - while (count > 0) - { - if (count <= temp) - { - /* - * This is exceedingly lame... The replacement counts - * are intermingled with the data... - */ - - if (temp >= 255) - *comp_ptr++ = 255; - else - *comp_ptr++ = temp; - - temp -= 255; - } - - /* - * Get difference between current and see pixels... - */ - - r = *start - *seed; - g = r; - b = ((*start & 0xfe) - (*seed & 0xfe)) / 2; - - if (r < -16 || r > 15 || g < -16 || g > 15 || b < -16 || b > 15) - { - /* - * Pack 24-bit RGB into 23 bits... Lame... - */ - - g = *start; - - *comp_ptr++ = g >> 1; - - if (g & 1) - *comp_ptr++ = 0x80 | (g >> 1); - else - *comp_ptr++ = g >> 1; - - if (g & 1) - *comp_ptr++ = 0x80 | (g >> 1); - else - *comp_ptr++ = g >> 1; - } - else - { - /* - * Pack 15-bit RGB difference... - */ - - *comp_ptr++ = 0x80 | ((r << 2) & 0x7c) | ((g >> 3) & 0x03); - *comp_ptr++ = ((g << 5) & 0xe0) | (b & 0x1f); - } - - count --; - start ++; - seed ++; - } - - /* - * Make sure we have the ending count if the replacement count - * was exactly 8 + 255n... - */ - - if (temp == 0) - *comp_ptr++ = 0; - } - } - else - { - /* - * Do RGB compression... - */ - - while (line_ptr < line_end) - { - /* - * Find the next non-matching sequence... - */ - - start = line_ptr; - while (line_ptr[0] == seed[0] && - line_ptr[1] == seed[1] && - line_ptr[2] == seed[2] && - (line_ptr + 2) < line_end) - { - line_ptr += 3; - seed += 3; - } - - if (line_ptr == line_end) - break; - - offset = (line_ptr - start) / 3; - - /* - * Find non-matching RGB tuples... - */ - - start = line_ptr; - while ((line_ptr[0] != seed[0] || - line_ptr[1] != seed[1] || - line_ptr[2] != seed[2]) && - (line_ptr + 2) < line_end) - { - line_ptr += 3; - seed += 3; - } - - count = (line_ptr - start) / 3; - - /* - * Place mode 10 compression data in the buffer; each sequence - * starts with a command byte that looks like: - * - * CMD SRC SRC OFF OFF CNT CNT CNT - * - * For the purpose of this driver, CMD and SRC are always 0. - * - * If the offset >= 3 then additional offset bytes follow the - * first command byte, each byte == 255 until the last one. - * - * If the count >= 7, then additional count bytes follow each - * group of pixels, each byte == 255 until the last one. - * - * The offset and count are in RGB tuples (not bytes, as for - * Mode 3 and 9)... - */ - - if (offset >= 3) - { - /* - * Output multi-byte offset... - */ - - if (count > 7) - *comp_ptr++ = 0x1f; - else - *comp_ptr++ = 0x18 | (count - 1); - - offset -= 3; - while (offset >= 255) - { - *comp_ptr++ = 255; - offset -= 255; - } - - *comp_ptr++ = offset; - } - else - { - /* - * Output single-byte offset... - */ - - if (count > 7) - *comp_ptr++ = (offset << 3) | 0x07; - else - *comp_ptr++ = (offset << 3) | (count - 1); - } - - temp = count - 8; - seed -= count * 3; - - while (count > 0) - { - if (count <= temp) - { - /* - * This is exceedingly lame... The replacement counts - * are intermingled with the data... - */ - - if (temp >= 255) - *comp_ptr++ = 255; - else - *comp_ptr++ = temp; - - temp -= 255; - } - - /* - * Get difference between current and see pixels... - */ - - r = start[0] - seed[0]; - g = start[1] - seed[1]; - b = ((start[2] & 0xfe) - (seed[2] & 0xfe)) / 2; - - if (r < -16 || r > 15 || g < -16 || g > 15 || b < -16 || b > 15) - { - /* - * Pack 24-bit RGB into 23 bits... Lame... - */ - - *comp_ptr++ = start[0] >> 1; - - if (start[0] & 1) - *comp_ptr++ = 0x80 | (start[1] >> 1); - else - *comp_ptr++ = start[1] >> 1; - - if (start[1] & 1) - *comp_ptr++ = 0x80 | (start[2] >> 1); - else - *comp_ptr++ = start[2] >> 1; - } - else - { - /* - * Pack 15-bit RGB difference... - */ - - *comp_ptr++ = 0x80 | ((r << 2) & 0x7c) | ((g >> 3) & 0x03); - *comp_ptr++ = ((g << 5) & 0xe0) | (b & 0x1f); - } - - count --; - start += 3; - seed += 3; - } - - /* - * Make sure we have the ending count if the replacement count - * was exactly 8 + 255n... - */ - - if (temp == 0) - *comp_ptr++ = 0; - } - } - - line_ptr = CompBuffer; - line_end = comp_ptr; - - memcpy(SeedBuffer, line, length); - break; - } - - /* - * Set the length of the data and write a raster plane... - */ - - printf("\033*b%d%c", (int)(line_end - line_ptr), pend); - cupsWritePrintData(line_ptr, line_end - line_ptr); -} - - -/* - * 'OutputLine()' - Output the specified number of lines of graphics. - */ - -void -OutputLine(ppd_file_t *ppd, /* I - PPD file */ - cups_page_header2_t *header) /* I - Page header */ -{ - int i, j; /* Looping vars */ - int plane; /* Current plane */ - unsigned char bit; /* Current bit */ - int bytes; /* Number of bytes/plane */ - int width; /* Width of line in pixels */ - const int *order; /* Order to use */ - unsigned char *ptr; /* Pointer into buffer */ - - - /* - * Output whitespace as needed... - */ - - if (OutputFeed > 0) - { - if (header->cupsCompression < 3) - { - /* - * Send blank raster lines... - */ - - while (OutputFeed > 0) - { - printf("\033*b0W"); - OutputFeed --; - } - } - else - { - /* - * Send Y offset command and invalidate the seed buffer... - */ - - printf("\033*b%dY", OutputFeed); - OutputFeed = 0; - SeedInvalid = 1; - } - } - - /* - * Write bitmap data as needed... - */ - - switch (OutputMode) - { - case OUTPUT_BITMAP : /* Send 1-bit bitmap data... */ - order = ColorOrders[PrinterPlanes - 1]; - bytes = header->cupsBytesPerLine / PrinterPlanes; - - for (i = 0; i < PrinterPlanes; i ++) - { - plane = order[i]; - - CompressData(PixelBuffer + i * bytes, bytes, plane, - (i < (PrinterPlanes - 1)) ? 'V' : 'W', - header->cupsCompression); - } - break; - - case OUTPUT_INVERBIT : /* Send inverted 1-bit bitmap data... */ - order = ColorOrders[PrinterPlanes - 1]; - bytes = header->cupsBytesPerLine / PrinterPlanes; - - for (i = header->cupsBytesPerLine, ptr = PixelBuffer; - i > 0; - i --, ptr ++) - *ptr = ~*ptr; - - for (i = 0; i < PrinterPlanes; i ++) - { - plane = order[i]; - - CompressData(PixelBuffer + i * bytes, bytes, plane, - (i < (PrinterPlanes - 1)) ? 'V' : 'W', - header->cupsCompression); - } - break; - - case OUTPUT_RGB : /* Send 24-bit RGB data... */ - if (PrinterPlanes == 1 && !BlankValue) - { - /* - * Invert black to grayscale... - */ - - for (i = header->cupsBytesPerLine, ptr = PixelBuffer; - i > 0; - i --, ptr ++) - *ptr = ~*ptr; - } - - /* - * Compress the output... - */ - - CompressData(PixelBuffer, header->cupsBytesPerLine, 0, 'W', - header->cupsCompression); - break; - - default : - order = ColorOrders[PrinterPlanes - 1]; - width = header->cupsWidth; - - for (i = 0, j = 0; i < PrinterPlanes; i ++) - { - plane = order[i]; - bytes = DotBufferSizes[plane] / DotBits[plane]; - - for (bit = 1, ptr = DotBuffers[plane]; - bit <= DotBits[plane]; - bit <<= 1, ptr += bytes, j ++) - { - cupsPackHorizontalBit(OutputBuffers[plane], DotBuffers[plane], - width, 0, bit); - CompressData(ptr, bytes, j, - i == (PrinterPlanes - 1) && - bit == DotBits[plane] ? 'W' : 'V', - header->cupsCompression); - } - } - break; - } - - /* - * The seed buffer, if any, now should contain valid data... - */ - - SeedInvalid = 0; -} - - -/* - * 'ReadLine()' - Read graphics from the page stream. - */ - -int /* O - Number of lines (0 if blank) */ -ReadLine(cups_raster_t *ras, /* I - Raster stream */ - cups_page_header2_t *header) /* I - Page header */ -{ - int plane, /* Current color plane */ - width; /* Width of line */ - - - /* - * Read raster data... - */ - - cupsRasterReadPixels(ras, PixelBuffer, header->cupsBytesPerLine); - - /* - * See if it is blank; if so, return right away... - */ - - if (cupsCheckValue(PixelBuffer, header->cupsBytesPerLine, BlankValue)) - return (0); - - /* - * If we aren't dithering, return immediately... - */ - - if (OutputMode != OUTPUT_DITHERED) - return (1); - - /* - * Perform the color separation... - */ - - width = header->cupsWidth; - - switch (header->cupsColorSpace) - { - case CUPS_CSPACE_W : - if (RGB) - { - cupsRGBDoGray(RGB, PixelBuffer, CMYKBuffer, width); - - if (RGB->num_channels == 1) - cupsCMYKDoBlack(CMYK, CMYKBuffer, InputBuffer, width); - else - cupsCMYKDoCMYK(CMYK, CMYKBuffer, InputBuffer, width); - } - else - cupsCMYKDoGray(CMYK, PixelBuffer, InputBuffer, width); - break; - - case CUPS_CSPACE_K : - cupsCMYKDoBlack(CMYK, PixelBuffer, InputBuffer, width); - break; - - default : - case CUPS_CSPACE_RGB : - if (RGB) - { - cupsRGBDoRGB(RGB, PixelBuffer, CMYKBuffer, width); - - if (RGB->num_channels == 1) - cupsCMYKDoBlack(CMYK, CMYKBuffer, InputBuffer, width); - else - cupsCMYKDoCMYK(CMYK, CMYKBuffer, InputBuffer, width); - } - else - cupsCMYKDoRGB(CMYK, PixelBuffer, InputBuffer, width); - break; - - case CUPS_CSPACE_CMYK : - cupsCMYKDoCMYK(CMYK, PixelBuffer, InputBuffer, width); - break; - } - - /* - * Dither the pixels... - */ - - for (plane = 0; plane < PrinterPlanes; plane ++) - cupsDitherLine(DitherStates[plane], DitherLuts[plane], InputBuffer + plane, - PrinterPlanes, OutputBuffers[plane]); - - /* - * Return 1 to indicate that we have non-blank output... - */ - - return (1); -} - - -/* - * 'main()' - Main entry and processing of driver. - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ -{ - int fd; /* File descriptor */ - cups_raster_t *ras; /* Raster stream for printing */ - cups_page_header2_t header; /* Page header from file */ - int y; /* Current line */ - ppd_file_t *ppd; /* PPD file */ - int job_id; /* Job ID */ - int num_options; /* Number of options */ - cups_option_t *options; /* Options */ -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ - - - /* - * Make sure status messages are not buffered... - */ - - setbuf(stderr, NULL); - - /* - * Check command-line... - */ - - if (argc < 6 || argc > 7) - { - _cupsLangPrintFilter(stderr, "ERROR", - _("%s job-id user title copies options [file]"), - "rastertopclx"); - return (1); - } - - num_options = cupsParseOptions(argv[5], 0, &options); - - /* - * Open the PPD file... - */ - - ppd = ppdOpenFile(getenv("PPD")); - - if (!ppd) - { - ppd_status_t status; /* PPD error */ - int linenum; /* Line number */ - - _cupsLangPrintFilter(stderr, "ERROR", - _("The PPD file could not be opened.")); - - status = ppdLastError(&linenum); - - fprintf(stderr, "DEBUG: %s on line %d.\n", ppdErrorString(status), linenum); - - return (1); - } - - ppdMarkDefaults(ppd); - cupsMarkOptions(ppd, num_options, options); - - /* - * Open the page stream... - */ - - if (argc == 7) - { - if ((fd = open(argv[6], O_RDONLY)) == -1) - { - _cupsLangPrintError("ERROR", _("Unable to open raster file")); - return (1); - } - } - else - fd = 0; - - ras = cupsRasterOpen(fd, CUPS_RASTER_READ); - - /* - * Register a signal handler to eject the current page if the - * job is cancelled. - */ - - Canceled = 0; - -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, CancelJob); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = CancelJob; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, CancelJob); -#endif /* HAVE_SIGSET */ - - /* - * Process pages as needed... - */ - - job_id = atoi(argv[1]); - - Page = 0; - - while (cupsRasterReadHeader2(ras, &header)) - { - /* - * Write a status message with the page number and number of copies. - */ - - if (Canceled) - break; - - Page ++; - - fprintf(stderr, "PAGE: %d %d\n", Page, header.NumCopies); - _cupsLangPrintFilter(stderr, "INFO", _("Starting page %d."), Page); - - StartPage(ppd, &header, atoi(argv[1]), argv[2], argv[3], - num_options, options); - - for (y = 0; y < (int)header.cupsHeight; y ++) - { - /* - * Let the user know how far we have progressed... - */ - - if (Canceled) - break; - - if ((y & 127) == 0) - { - _cupsLangPrintFilter(stderr, "INFO", - _("Printing page %d, %d%% complete."), - Page, 100 * y / header.cupsHeight); - fprintf(stderr, "ATTR: job-media-progress=%d\n", - 100 * y / header.cupsHeight); - } - - /* - * Read and write a line of graphics or whitespace... - */ - - if (ReadLine(ras, &header)) - OutputLine(ppd, &header); - else - OutputFeed ++; - } - - /* - * Eject the page... - */ - - _cupsLangPrintFilter(stderr, "INFO", _("Finished page %d."), Page); - - EndPage(ppd, &header); - - if (Canceled) - break; - } - - Shutdown(ppd, job_id, argv[2], argv[3], num_options, options); - - cupsFreeOptions(num_options, options); - - cupsRasterClose(ras); - - if (fd != 0) - close(fd); - - if (Page == 0) - { - _cupsLangPrintFilter(stderr, "ERROR", _("No pages were found.")); - return (1); - } - else - { - _cupsLangPrintFilter(stderr, "INFO", _("Ready to print.")); - return (0); - } -} - - -/* - * End of "$Id$". - */ diff --git a/driver/rgb.c b/driver/rgb.c deleted file mode 100644 index fd0b117a5..000000000 --- a/driver/rgb.c +++ /dev/null @@ -1,558 +0,0 @@ -/* - * "$Id$" - * - * RGB color separation code for CUPS. - * - * Copyright 2007 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * cupsRGBDelete() - Delete a color separation. - * cupsRGBDoGray() - Do a grayscale separation... - * cupsRGBDoRGB() - Do a RGB separation... - * cupsRGBLoad() - Load a RGB color profile from a PPD file. - * cupsRGBNew() - Create a new RGB color separation. - */ - -/* - * Include necessary headers. - */ - -#include "driver.h" - - -/* - * 'cupsRGBDelete()' - Delete a color separation. - */ - -void -cupsRGBDelete(cups_rgb_t *rgbptr) /* I - Color separation */ -{ - if (rgbptr == NULL) - return; - - free(rgbptr->colors[0][0][0]); - free(rgbptr->colors[0][0]); - free(rgbptr->colors[0]); - free(rgbptr->colors); - free(rgbptr); -} - - -/* - * 'cupsRGBDoGray()' - Do a grayscale separation... - */ - -void -cupsRGBDoGray(cups_rgb_t *rgbptr, - /* I - Color separation */ - const unsigned char *input, - /* I - Input grayscale pixels */ - unsigned char *output, - /* O - Output Device-N pixels */ - int num_pixels) - /* I - Number of pixels */ -{ - int i; /* Looping var */ - int lastgray; /* Previous grayscale */ - int xs, ys, zs, /* Current RGB row offsets */ - g, gi, gm0, gm1;/* Current gray index and multipliers ... */ - const unsigned char *color; /* Current color data */ - int tempg; /* Current separation color */ - int rgbsize; /* Separation data size */ - - - /* - * Range check input... - */ - - if (!rgbptr || !input || !output || num_pixels <= 0) - return; - - /* - * Initialize variables used for the duration of the separation... - */ - - lastgray = -1; - rgbsize = rgbptr->num_channels; - xs = rgbptr->cube_size * rgbptr->cube_size * rgbptr->num_channels; - ys = rgbptr->cube_size * rgbptr->num_channels; - zs = rgbptr->num_channels; - - /* - * Loop through it all... - */ - - while (num_pixels > 0) - { - /* - * See if the next pixel is a cached value... - */ - - num_pixels --; - - g = cups_srgb_lut[*input++]; - - if (g == lastgray) - { - /* - * Copy previous color and continue... - */ - - memcpy(output, output - rgbptr->num_channels, rgbsize); - - output += rgbptr->num_channels; - continue; - } - else if (g == 0x00 && rgbptr->cache_init) - { - /* - * Copy black color and continue... - */ - - memcpy(output, rgbptr->black, rgbsize); - - output += rgbptr->num_channels; - continue; - } - else if (g == 0xff && rgbptr->cache_init) - { - /* - * Copy white color and continue... - */ - - memcpy(output, rgbptr->white, rgbsize); - - output += rgbptr->num_channels; - continue; - } - - /* - * Nope, figure this one out on our own... - */ - - gi = rgbptr->cube_index[g]; - gm0 = rgbptr->cube_mult[g]; - gm1 = 256 - gm0; - - color = rgbptr->colors[gi][gi][gi]; - - for (i = 0; i < rgbptr->num_channels; i ++, color ++) - { - tempg = (color[0] * gm0 + color[xs + ys + zs] * gm1) / 256; - - if (tempg > 255) - *output++ = 255; - else if (tempg < 0) - *output++ = 0; - else - *output++ = tempg; - } - } -} - - -/* - * 'cupsRGBDoRGB()' - Do a RGB separation... - */ - -void -cupsRGBDoRGB(cups_rgb_t *rgbptr, - /* I - Color separation */ - const unsigned char *input, - /* I - Input RGB pixels */ - unsigned char *output, - /* O - Output Device-N pixels */ - int num_pixels) - /* I - Number of pixels */ -{ - int i; /* Looping var */ - int rgb, /* Current RGB color */ - lastrgb; /* Previous RGB color */ - int r, ri, rm0, rm1, rs, - /* Current red index, multipliexs, and row offset */ - g, gi, gm0, gm1, gs, - /* Current green ... */ - b, bi, bm0, bm1, bs; - /* Current blue ... */ - const unsigned char *color; /* Current color data */ - int tempr, /* Current separation colors */ - tempg, /* ... */ - tempb ; /* ... */ - int rgbsize; /* Separation data size */ - - - /* - * Range check input... - */ - - if (!rgbptr || !input || !output || num_pixels <= 0) - return; - - /* - * Initialize variables used for the duration of the separation... - */ - - lastrgb = -1; - rgbsize = rgbptr->num_channels; - rs = rgbptr->cube_size * rgbptr->cube_size * rgbptr->num_channels; - gs = rgbptr->cube_size * rgbptr->num_channels; - bs = rgbptr->num_channels; - - /* - * Loop through it all... - */ - - while (num_pixels > 0) - { - /* - * See if the next pixel is a cached value... - */ - - num_pixels --; - - r = cups_srgb_lut[*input++]; - g = cups_srgb_lut[*input++]; - b = cups_srgb_lut[*input++]; - rgb = (((r << 8) | g) << 8) | b; - - if (rgb == lastrgb) - { - /* - * Copy previous color and continue... - */ - - memcpy(output, output - rgbptr->num_channels, rgbsize); - - output += rgbptr->num_channels; - continue; - } - else if (rgb == 0x000000 && rgbptr->cache_init) - { - /* - * Copy black color and continue... - */ - - memcpy(output, rgbptr->black, rgbsize); - - output += rgbptr->num_channels; - continue; - } - else if (rgb == 0xffffff && rgbptr->cache_init) - { - /* - * Copy white color and continue... - */ - - memcpy(output, rgbptr->white, rgbsize); - - output += rgbptr->num_channels; - continue; - } - - /* - * Nope, figure this one out on our own... - */ - - ri = rgbptr->cube_index[r]; - rm0 = rgbptr->cube_mult[r]; - rm1 = 256 - rm0; - - gi = rgbptr->cube_index[g]; - gm0 = rgbptr->cube_mult[g]; - gm1 = 256 - gm0; - - bi = rgbptr->cube_index[b]; - bm0 = rgbptr->cube_mult[b]; - bm1 = 256 - bm0; - - color = rgbptr->colors[ri][gi][bi]; - - for (i = rgbptr->num_channels; i > 0; i --, color ++) - { - tempb = (color[0] * bm0 + color[bs] * bm1) / 256; - tempg = tempb * gm0; - tempb = (color[gs] * gm0 + color[gs + bs] * bm1) / 256; - tempg = (tempg + tempb * gm1) / 256; - - tempr = tempg * rm0; - - tempb = (color[rs] * bm0 + color[rs + bs] * bm1) / 256; - tempg = tempb * gm0; - tempb = (color[rs + gs] * bm0 + color[rs + gs + bs] * bm1) / 256; - tempg = (tempg + tempb * gm1) / 256; - - tempr = (tempr + tempg * rm1) / 256; - - if (tempr > 255) - *output++ = 255; - else if (tempr < 0) - *output++ = 0; - else - *output++ = tempr; - } - } -} - - -/* - * 'cupsRGBLoad()' - Load a RGB color profile from a PPD file. - */ - -cups_rgb_t * /* O - New color profile */ -cupsRGBLoad(ppd_file_t *ppd, /* I - PPD file */ - const char *colormodel, /* I - Color model */ - const char *media, /* I - Media type */ - const char *resolution) /* I - Resolution */ -{ - int i, /* Looping var */ - cube_size, /* Size of color lookup cube */ - num_channels, /* Number of color channels */ - num_samples; /* Number of color samples */ - cups_sample_t *samples; /* Color samples */ - float values[7]; /* Color sample values */ - char spec[PPD_MAX_NAME]; /* Profile name */ - ppd_attr_t *attr; /* Attribute from PPD file */ - cups_rgb_t *rgbptr; /* RGB color profile */ - - - /* - * Find the following attributes: - * - * cupsRGBProfile - Specifies the cube size, number of channels, and - * number of samples - * cupsRGBSample - Specifies an RGB to CMYK color sample - */ - - if ((attr = cupsFindAttr(ppd, "cupsRGBProfile", colormodel, media, - resolution, spec, sizeof(spec))) == NULL) - { - fputs("DEBUG2: No cupsRGBProfile attribute found for the current settings!\n", stderr); - return (NULL); - } - - if (!attr->value || sscanf(attr->value, "%d%d%d", &cube_size, &num_channels, - &num_samples) != 3) - { - fprintf(stderr, "ERROR: Bad cupsRGBProfile attribute \'%s\'!\n", - attr->value ? attr->value : "(null)"); - return (NULL); - } - - if (cube_size < 2 || cube_size > 16 || - num_channels < 1 || num_channels > CUPS_MAX_RGB || - num_samples != (cube_size * cube_size * cube_size)) - { - fprintf(stderr, "ERROR: Bad cupsRGBProfile attribute \'%s\'!\n", - attr->value); - return (NULL); - } - - /* - * Allocate memory for the samples and read them... - */ - - if ((samples = calloc(num_samples, sizeof(cups_sample_t))) == NULL) - { - fputs("ERROR: Unable to allocate memory for RGB profile!\n", stderr); - return (NULL); - } - - /* - * Read all of the samples... - */ - - for (i = 0; i < num_samples; i ++) - if ((attr = ppdFindNextAttr(ppd, "cupsRGBSample", spec)) == NULL) - break; - else if (!attr->value) - { - fputs("ERROR: Bad cupsRGBSample value!\n", stderr); - break; - } - else if (sscanf(attr->value, "%f%f%f%f%f%f%f", values + 0, - values + 1, values + 2, values + 3, values + 4, values + 5, - values + 6) != (3 + num_channels)) - { - fputs("ERROR: Bad cupsRGBSample value!\n", stderr); - break; - } - else - { - samples[i].rgb[0] = (int)(255.0 * values[0] + 0.5); - samples[i].rgb[1] = (int)(255.0 * values[1] + 0.5); - samples[i].rgb[2] = (int)(255.0 * values[2] + 0.5); - samples[i].colors[0] = (int)(255.0 * values[3] + 0.5); - if (num_channels > 1) - samples[i].colors[1] = (int)(255.0 * values[4] + 0.5); - if (num_channels > 2) - samples[i].colors[2] = (int)(255.0 * values[5] + 0.5); - if (num_channels > 3) - samples[i].colors[3] = (int)(255.0 * values[6] + 0.5); - } - - /* - * If everything went OK, create the color profile... - */ - - if (i == num_samples) - rgbptr = cupsRGBNew(num_samples, samples, cube_size, num_channels); - else - rgbptr = NULL; - - /* - * Free the temporary sample array and return... - */ - - free(samples); - - return (rgbptr); -} - - -/* - * 'cupsRGBNew()' - Create a new RGB color separation. - */ - -cups_rgb_t * /* O - New color separation or NULL */ -cupsRGBNew(int num_samples, /* I - Number of samples */ - cups_sample_t *samples, /* I - Samples */ - int cube_size, /* I - Size of LUT cube */ - int num_channels) /* I - Number of color components */ -{ - cups_rgb_t *rgbptr; /* New color separation */ - int i; /* Looping var */ - int r, g, b; /* Current RGB */ - int tempsize; /* Sibe of main arrays */ - unsigned char *tempc; /* Pointer for C arrays */ - unsigned char **tempb ; /* Pointer for Z arrays */ - unsigned char ***tempg; /* Pointer for Y arrays */ - unsigned char ****tempr; /* Pointer for X array */ - unsigned char rgb[3]; /* Temporary RGB value */ - - - /* - * Range-check the input... - */ - - if (!samples || num_samples != (cube_size * cube_size * cube_size) || - num_channels <= 0 || num_channels > CUPS_MAX_RGB) - return (NULL); - - /* - * Allocate memory for the separation... - */ - - if ((rgbptr = calloc(1, sizeof(cups_rgb_t))) == NULL) - return (NULL); - - /* - * Allocate memory for the samples and the LUT cube... - */ - - tempsize = cube_size * cube_size * cube_size; /* FUTURE: num_samples < cs^3 */ - - tempc = calloc(tempsize, num_channels); - tempb = calloc(tempsize, sizeof(unsigned char *)); - tempg = calloc(cube_size * cube_size, sizeof(unsigned char **)); - tempr = calloc(cube_size, sizeof(unsigned char ***)); - - if (tempc == NULL || tempb == NULL || tempg == NULL || tempr == NULL) - { - free(rgbptr); - - if (tempc) - free(tempc); - - if (tempb) - free(tempb); - - if (tempg) - free(tempg); - - if (tempr) - free(tempr); - - return (NULL); - } - - /* - * Fill in the arrays... - */ - - for (i = 0, r = 0; r < cube_size; r ++) - { - tempr[r] = tempg + r * cube_size; - - for (g = 0; g < cube_size; g ++) - { - tempr[r][g] = tempb + i; - - for (b = 0; b < cube_size; b ++, i ++) - tempr[r][g][b] = tempc + i * num_channels; - } - } - - for (i = 0; i < num_samples; i ++) - { - r = samples[i].rgb[0] * (cube_size - 1) / 255; - g = samples[i].rgb[1] * (cube_size - 1) / 255; - b = samples[i].rgb[2] * (cube_size - 1) / 255; - - memcpy(tempr[r][g][b], samples[i].colors, num_channels); - } - - rgbptr->cube_size = cube_size; - rgbptr->num_channels = num_channels; - rgbptr->colors = tempr; - - /* - * Generate the lookup tables for the cube indices and multipliers... - */ - - for (i = 0; i < 256; i ++) - { - rgbptr->cube_index[i] = i * (cube_size - 1) / 256; - - if (i == 0) - rgbptr->cube_mult[i] = 256; - else - rgbptr->cube_mult[i] = 255 - ((i * (cube_size - 1)) & 255); - } - - /* - * Generate the black and white cache values for the separation... - */ - - rgb[0] = 0; - rgb[1] = 0; - rgb[2] = 0; - - cupsRGBDoRGB(rgbptr, rgb, rgbptr->black, 1); - - rgb[0] = 255; - rgb[1] = 255; - rgb[2] = 255; - - cupsRGBDoRGB(rgbptr, rgb, rgbptr->white, 1); - - rgbptr->cache_init = 1; - - /* - * Return the separation... - */ - - return (rgbptr); -} - - -/* - * End of "$Id$". - */ diff --git a/driver/srgb.c b/driver/srgb.c deleted file mode 100644 index 0354f23e5..000000000 --- a/driver/srgb.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * "$Id$" - * - * sRGB lookup tables for CUPS. - * - * Copyright 2007 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - */ - -/* - * Include necessary headers. - */ - -#include "driver.h" - - -/* - * sRGB gamma lookup table. - */ - -const unsigned char cups_srgb_lut[256] = -{ - 0, 20, 28, 33, 38, 42, 46, 49, 52, 55, 58, 61, 63, 65, 68, - 70, 72, 74, 76, 78, 80, 81, 83, 85, 87, 88, 90, 91, 93, 94, - 96, 97, 99, 100, 102, 103, 104, 106, 107, 108, 109, 111, 112, 113, 114, - 115, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 147, 148, 149, 150, 151, 152, 153, 153, 154, 155, 156, 157, 158, - 158, 159, 160, 161, 162, 162, 163, 164, 165, 165, 166, 167, 168, 168, 169, - 170, 171, 171, 172, 173, 174, 174, 175, 176, 176, 177, 178, 178, 179, 180, - 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 189, 189, 190, - 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197, 198, 199, 199, - 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207, 208, 208, - 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 216, 216, 217, - 217, 218, 218, 219, 219, 220, 220, 221, 222, 222, 223, 223, 224, 224, 225, - 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, - 233, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 239, 240, - 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, - 248, 248, 249, 249, 249, 250, 250, 251, 251, 252, 252, 253, 253, 254, 254, - 255 -}; - - -/* - * sRGB gamma lookup table (inverted output to map to CMYK...) - */ - -const unsigned char cups_scmy_lut[256] = -{ - 255, 235, 227, 222, 217, 213, 209, 206, 203, 200, 197, 194, 192, 190, 187, - 185, 183, 181, 179, 177, 175, 174, 172, 170, 168, 167, 165, 164, 162, 161, - 159, 158, 156, 155, 153, 152, 151, 149, 148, 147, 146, 144, 143, 142, 141, - 140, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 127, 126, 125, 124, - 123, 122, 121, 120, 119, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, - 109, 108, 108, 107, 106, 105, 104, 103, 102, 102, 101, 100, 99, 98, 97, - 97, 96, 95, 94, 93, 93, 92, 91, 90, 90, 89, 88, 87, 87, 86, - 85, 84, 84, 83, 82, 81, 81, 80, 79, 79, 78, 77, 77, 76, 75, - 74, 74, 73, 72, 72, 71, 70, 70, 69, 68, 68, 67, 66, 66, 65, - 65, 64, 63, 63, 62, 61, 61, 60, 59, 59, 58, 58, 57, 56, 56, - 55, 55, 54, 53, 53, 52, 52, 51, 50, 50, 49, 49, 48, 47, 47, - 46, 46, 45, 45, 44, 43, 43, 42, 42, 41, 41, 40, 39, 39, 38, - 38, 37, 37, 36, 36, 35, 35, 34, 33, 33, 32, 32, 31, 31, 30, - 30, 29, 29, 28, 28, 27, 27, 26, 26, 25, 25, 24, 24, 23, 23, - 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 17, 17, 16, 16, 15, - 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, - 7, 7, 6, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, - 0 -}; - - -/* - * End of "$Id$". - */ diff --git a/driver/testcmyk.c b/driver/testcmyk.c deleted file mode 100644 index 97bac6f47..000000000 --- a/driver/testcmyk.c +++ /dev/null @@ -1,437 +0,0 @@ -/* - * "$Id$" - * - * Test the CMYK color separation code for CUPS. - * - * Copyright 2007-2010 by Apple Inc. - * Copyright 1993-2006 by Easy Software Products, All Rights Reserved. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * test_gray() - Test grayscale separations... - * test_rgb() - Test color separations... - * main() - Do color separation tests. - */ - -/* - * Include necessary headers. - */ - -#include -#include "driver.h" -#include - - -void test_gray(int num_comps, const char *basename); -void test_rgb(int num_comps, const char *basename); - - -/* - * 'main()' - Do color separation tests. - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ -{ - /* - * Make the test directory... - */ - - mkdir("test", 0755); - - /* - * Run tests for K, Kk, CMY, CMYK, CcMmYK, and CcMmYKk separations... - */ - - test_rgb(1, "test/K-rgb"); - test_rgb(2, "test/Kk-rgb"); - test_rgb(3, "test/CMY-rgb"); - test_rgb(4, "test/CMYK-rgb"); - test_rgb(6, "test/CcMmYK-rgb"); - test_rgb(7, "test/CcMmYKk-rgb"); - - test_gray(1, "test/K-gray"); - test_gray(2, "test/Kk-gray"); - test_gray(3, "test/CMY-gray"); - test_gray(4, "test/CMYK-gray"); - test_gray(6, "test/CcMmYK-gray"); - test_gray(7, "test/CcMmYKk-gray"); - - /* - * Return with no errors... - */ - - return (0); -} - - -/* - * 'test_gray()' - Test grayscale separations... - */ - -void -test_gray(int num_comps, /* I - Number of components */ - const char *basename) /* I - Base filename of output */ -{ - int i; /* Looping var */ - char filename[255]; /* Output filename */ - char line[255]; /* Line from PGM file */ - int width, height; /* Width and height of test image */ - int x, y; /* Current coordinate in image */ - int r, g, b; /* Current RGB color */ - unsigned char input[7000]; /* Line to separate */ - short output[48000], /* Output separation data */ - *outptr; /* Pointer in output */ - FILE *in; /* Input PPM file */ - FILE *out[CUPS_MAX_CHAN]; - /* Output PGM files */ - FILE *comp; /* Composite output */ - cups_cmyk_t *cmyk; /* Color separation */ - - - /* - * Open the test image... - */ - - in = fopen("image.pgm", "rb"); - while (fgets(line, sizeof(line), in) != NULL) - if (isdigit(line[0])) - break; - - sscanf(line, "%d%d", &width, &height); - - fgets(line, sizeof(line), in); - - /* - * Create the color separation... - */ - - cmyk = cupsCMYKNew(num_comps); - - switch (num_comps) - { - case 2 : /* Kk */ - cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0); - break; - - case 4 : - cupsCMYKSetGamma(cmyk, 2, 1.0, 0.9); - cupsCMYKSetBlack(cmyk, 0.5, 1.0); - break; - - case 6 : /* CcMmYK */ - cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0); - cupsCMYKSetLtDk(cmyk, 2, 0.5, 1.0); - cupsCMYKSetGamma(cmyk, 4, 1.0, 0.9); - cupsCMYKSetBlack(cmyk, 0.5, 1.0); - break; - - case 7 : /* CcMmYKk */ - cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0); - cupsCMYKSetLtDk(cmyk, 2, 0.5, 1.0); - cupsCMYKSetGamma(cmyk, 4, 1.0, 0.9); - cupsCMYKSetLtDk(cmyk, 5, 0.5, 1.0); - break; - } - - /* - * Open the color separation files... - */ - - for (i = 0; i < num_comps; i ++) - { - sprintf(filename, "%s%d.pgm", basename, i); - out[i] = fopen(filename, "wb"); - - fprintf(out[i], "P5\n%d %d 255\n", width, height); - } - - sprintf(filename, "%s.ppm", basename); - comp = fopen(filename, "wb"); - - fprintf(comp, "P6\n%d %d 255\n", width, height); - - /* - * Read the image and do the separations... - */ - - for (y = 0; y < height; y ++) - { - fread(input, width, 1, in); - - cupsCMYKDoGray(cmyk, input, output, width); - - for (x = 0, outptr = output; x < width; x ++, outptr += num_comps) - { - for (i = 0; i < num_comps; i ++) - putc(255 - 255 * outptr[i] / 4095, out[i]); - - r = 4095; - g = 4095; - b = 4095; - - switch (num_comps) - { - case 1 : - r -= outptr[0]; - g -= outptr[0]; - b -= outptr[0]; - break; - case 2 : - r -= outptr[0]; - g -= outptr[0]; - b -= outptr[0]; - - r -= outptr[1] / 2; - g -= outptr[1] / 2; - b -= outptr[1] / 2; - break; - case 3 : - r -= outptr[0]; - g -= outptr[1]; - b -= outptr[2]; - break; - case 4 : - r -= outptr[0]; - g -= outptr[1]; - b -= outptr[2]; - - r -= outptr[3]; - g -= outptr[3]; - b -= outptr[3]; - break; - case 6 : - r -= outptr[0] + outptr[1] / 2; - g -= outptr[2] + outptr[3] / 3; - b -= outptr[4]; - - r -= outptr[5]; - g -= outptr[5]; - b -= outptr[5]; - break; - case 7 : - r -= outptr[0] + outptr[1] / 2; - g -= outptr[2] + outptr[3] / 3; - b -= outptr[4]; - - r -= outptr[5] + outptr[6] / 2; - g -= outptr[5] + outptr[6] / 2; - b -= outptr[5] + outptr[6] / 2; - break; - } - - if (r < 0) - putc(0, comp); - else - putc(255 * r / 4095, comp); - - if (g < 0) - putc(0, comp); - else - putc(255 * g / 4095, comp); - - if (b < 0) - putc(0, comp); - else - putc(255 * b / 4095, comp); - } - } - - for (i = 0; i < num_comps; i ++) - fclose(out[i]); - - fclose(comp); - fclose(in); - - cupsCMYKDelete(cmyk); -} - - -/* - * 'test_rgb()' - Test color separations... - */ - -void -test_rgb(int num_comps, /* I - Number of components */ - const char *basename) /* I - Base filename of output */ -{ - int i; /* Looping var */ - char filename[255]; /* Output filename */ - char line[255]; /* Line from PPM file */ - int width, height; /* Width and height of test image */ - int x, y; /* Current coordinate in image */ - int r, g, b; /* Current RGB color */ - unsigned char input[7000]; /* Line to separate */ - short output[48000], /* Output separation data */ - *outptr; /* Pointer in output */ - FILE *in; /* Input PPM file */ - FILE *out[CUPS_MAX_CHAN]; - /* Output PGM files */ - FILE *comp; /* Composite output */ - cups_cmyk_t *cmyk; /* Color separation */ - - - /* - * Open the test image... - */ - - in = fopen("image.ppm", "rb"); - while (fgets(line, sizeof(line), in) != NULL) - if (isdigit(line[0])) - break; - - sscanf(line, "%d%d", &width, &height); - - fgets(line, sizeof(line), in); - - /* - * Create the color separation... - */ - - cmyk = cupsCMYKNew(num_comps); - - cupsCMYKSetBlack(cmyk, 0.5, 1.0); - - switch (num_comps) - { - case 2 : /* Kk */ - cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0); - break; - case 6 : /* CcMmYK */ - cupsCMYKSetGamma(cmyk, 0, 1.0, 0.8); - cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0); - cupsCMYKSetGamma(cmyk, 2, 1.0, 0.8); - cupsCMYKSetLtDk(cmyk, 2, 0.5, 1.0); - break; - case 7 : /* CcMmYKk */ - cupsCMYKSetGamma(cmyk, 0, 1.0, 0.8); - cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0); - cupsCMYKSetGamma(cmyk, 2, 1.0, 0.8); - cupsCMYKSetLtDk(cmyk, 2, 0.5, 1.0); - cupsCMYKSetLtDk(cmyk, 5, 0.5, 1.0); - break; - } - - /* - * Open the color separation files... - */ - - for (i = 0; i < num_comps; i ++) - { - sprintf(filename, "%s%d.pgm", basename, i); - out[i] = fopen(filename, "wb"); - - fprintf(out[i], "P5\n%d %d 255\n", width, height); - } - - sprintf(filename, "%s.ppm", basename); - comp = fopen(filename, "wb"); - - fprintf(comp, "P6\n%d %d 255\n", width, height); - - /* - * Read the image and do the separations... - */ - - for (y = 0; y < height; y ++) - { - fread(input, width, 3, in); - - cupsCMYKDoRGB(cmyk, input, output, width); - - for (x = 0, outptr = output; x < width; x ++, outptr += num_comps) - { - for (i = 0; i < num_comps; i ++) - putc(255 - 255 * outptr[i] / 4095, out[i]); - - r = 4095; - g = 4095; - b = 4095; - - switch (num_comps) - { - case 1 : - r -= outptr[0]; - g -= outptr[0]; - b -= outptr[0]; - break; - case 2 : - r -= outptr[0]; - g -= outptr[0]; - b -= outptr[0]; - - r -= outptr[1] / 2; - g -= outptr[1] / 2; - b -= outptr[1] / 2; - break; - case 3 : - r -= outptr[0]; - g -= outptr[1]; - b -= outptr[2]; - break; - case 4 : - r -= outptr[0]; - g -= outptr[1]; - b -= outptr[2]; - - r -= outptr[3]; - g -= outptr[3]; - b -= outptr[3]; - break; - case 6 : - r -= outptr[0] + outptr[1] / 2; - g -= outptr[2] + outptr[3] / 3; - b -= outptr[4]; - - r -= outptr[5]; - g -= outptr[5]; - b -= outptr[5]; - break; - case 7 : - r -= outptr[0] + outptr[1] / 2; - g -= outptr[2] + outptr[3] / 3; - b -= outptr[4]; - - r -= outptr[5] + outptr[6] / 2; - g -= outptr[5] + outptr[6] / 2; - b -= outptr[5] + outptr[6] / 2; - break; - } - - if (r < 0) - putc(0, comp); - else - putc(255 * r / 4095, comp); - - if (g < 0) - putc(0, comp); - else - putc(255 * g / 4095, comp); - - if (b < 0) - putc(0, comp); - else - putc(255 * b / 4095, comp); - } - } - - for (i = 0; i < num_comps; i ++) - fclose(out[i]); - - fclose(comp); - fclose(in); - - cupsCMYKDelete(cmyk); -} - - -/* - * End of "$Id$". - */ diff --git a/driver/testdither.c b/driver/testdither.c deleted file mode 100644 index 547e47d05..000000000 --- a/driver/testdither.c +++ /dev/null @@ -1,191 +0,0 @@ -/* - * "$Id$" - * - * Dither test program for CUPS. - * - * Try the following: - * - * testdither 0 255 > filename.ppm - * testdither 0 127 255 > filename.ppm - * testdither 0 85 170 255 > filename.ppm - * testdither 0 63 127 170 198 227 255 > filename.ppm - * testdither 0 210 383 > filename.ppm - * testdither 0 82 255 > filename.ppm - * - * Copyright 2007-2010 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * main() - Test dithering and output a PPM file. - * usage() - Show program usage... - */ - -/* - * Include necessary headers. - */ - -#include "driver.h" -#include - - -/* - * Local functions... - */ - -void usage(void); - - -/* - * 'main()' - Test dithering and output a PPM file. - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ -{ - int x, y; /* Current coordinate in image */ - short line[512]; /* Line to dither */ - unsigned char pixels[512], /* Dither pixels */ - *pixptr; /* Pointer in line */ - int output; /* Output pixel */ - cups_lut_t *lut; /* Dither lookup table */ - cups_dither_t *dither; /* Dither state */ - int nlutvals; /* Number of lookup values */ - float lutvals[16]; /* Lookup values */ - int pixvals[16]; /* Pixel values */ - - - /* - * See if we have lookup table values on the command-line... - */ - - if (argc > 1) - { - /* - * Yes, collect them... - */ - - nlutvals = 0; - - for (x = 1; x < argc; x ++) - if (isdigit(argv[x][0]) && nlutvals < 16) - { - pixvals[nlutvals] = atoi(argv[x]); - lutvals[nlutvals] = atof(argv[x]) / 255.0; - nlutvals ++; - } - else - usage(); - - /* - * See if we have at least 2 values... - */ - - if (nlutvals < 2) - usage(); - } - else - { - /* - * Otherwise use the default 2-entry LUT with values of 0 and 255... - */ - - nlutvals = 2; - lutvals[0] = 0.0; - lutvals[1] = 1.0; - pixvals[0] = 0; - pixvals[1] = 255; - } - - /* - * Create the lookup table and dither state... - */ - - lut = cupsLutNew(nlutvals, lutvals); - dither = cupsDitherNew(512); - - /* - * Put out the PGM header for a raw 256x256x8-bit grayscale file... - */ - - puts("P5\n512\n512\n255"); - - /* - * Dither 512 lines, which are written out in 256 image lines... - */ - - for (y = 0; y < 512; y ++) - { - /* - * Create the grayscale data for the current line... - */ - - for (x = 0; x < 512; x ++) - line[x] = 4095 * ((y / 32) * 16 + x / 32) / 255; - - /* - * Dither the line... - */ - - cupsDitherLine(dither, lut, line, 1, pixels); - - if (y == 0) - { - fputs("DEBUG: pixels =", stderr); - for (x = 0; x < 512; x ++) - fprintf(stderr, " %d", pixels[x]); - fputs("\n", stderr); - } - - /* - * Add or set the output pixel values... - */ - - for (x = 0, pixptr = pixels; x < 512; x ++, pixptr ++) - { - output = 255 - pixvals[*pixptr]; - - if (output < 0) - putchar(0); - else - putchar(output); - } - } - - /* - * Free the dither state and lookup table... - */ - - cupsDitherDelete(dither); - cupsLutDelete(lut); - - /* - * Return with no errors... - */ - - return (0); -} - - -/* - * 'usage()' - Show program usage... - */ - -void -usage(void) -{ - puts("Usage: testdither [val1 val2 [... val16]] >filename.ppm"); - exit(1); -} - - -/* - * End of "$Id$". - */ diff --git a/driver/testdriver.c b/driver/testdriver.c deleted file mode 100644 index 4263920e0..000000000 --- a/driver/testdriver.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * "$Id: testdriver.c 7306 2008-02-15 00:52:38Z mike $" - * - * Sample/test driver interface program for CUPS. - * - * This program handles listing and installing both static PPD files - * in CUPS_DATADIR/model and dynamically generated PPD files using - * the driver helper programs in CUPS_SERVERBIN/driver. - * - * Copyright 2007-2010 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * main() - Enumerate or display PPD files. - * cat_ppd() - Display a PPD file. - * list_ppds() - List PPDs. - */ - -/* - * Include necessary headers... - */ - -#include -#include - - -/* - * Local functions... - */ - -static int cat_ppd(const char *uri); -static int list_ppds(const char *name); - - -/* - * Sample data... - */ - -static const char *models[][2] = - { - { "foojet.ppd", "Foo Printer" }, - { "barjet.ppd", "Bar Printer" }, - { "foobar.ppd", "Foo/Bar Multifunction Printer" } - }; - - -/* - * 'main()' - Enumerate or display PPD files. - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line args */ - char *argv[]) /* I - Command-line arguments */ -{ - if (argc == 2 && !strcmp(argv[1], "list")) - return (list_ppds(argv[0])); - else if (argc == 3 && !strcmp(argv[1], "cat")) - return (cat_ppd(argv[2])); - - fprintf(stderr, "ERROR: Usage: %s cat URI\n", argv[0]); - fprintf(stderr, "ERROR: Usage: %s list\n", argv[0]); - return (1); -} - - -/* - * 'cat_ppd()' - Display a PPD file. - */ - -static int /* O - Exit status */ -cat_ppd(const char *uri) /* I - PPD URI */ -{ - int i; /* Looping var */ - char scheme[255], /* URI scheme */ - userpass[255], /* Username/password (unused) */ - hostname[255], /* Hostname (unused) */ - resource[1024]; /* Resource name */ - int port; /* Port (unused) */ - const char *name; /* Pointer to name in URI */ - - - if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), - userpass, sizeof(userpass), hostname, sizeof(hostname), - &port, resource, sizeof(resource)) < HTTP_URI_OK) - { - fprintf(stderr, "ERROR: Bad URI \"%s\"!\n", uri); - return (1); - } - - name = resource + 1; - - for (i = 0 ; i < (int)(sizeof(models) / sizeof(models[0])); i ++) - if (!strcmp(name, models[i][0])) - { - /* - * Actually display the PPD file... - */ - puts("*PPD-Adobe: \"4.3\""); - - puts("*LanguageEncoding: ISOLatin1"); - puts("*LanguageVersion: English"); - puts("*Manufacturer: \"Test\""); - puts("*FileVersion: \"1.0\""); - puts("*FormatVersion: \"4.3\""); - puts("*PSVersion: \"(3010) 1\""); - printf("*PCFileName: \"%s\"\n", models[i][0]); - - printf("*Product: \"(%s)\"\n", models[i][1]); - printf("*ModelName: \"Test %s\"\n", models[i][1]); - printf("*NickName: \"Test %s\"\n", models[i][1]); - printf("*ShortNickName: \"Test %s\"\n", models[i][1]); - - puts("*OpenUI PageSize: PickOne"); - puts("*OrderDependency: 10 AnySetup *PageSetup"); - puts("*DefaultPageSize: Letter"); - puts("*PageSize Letter: \"<>setpagedevice\""); - puts("*PageSize A4: \"<>setpagedevice\""); - puts("*CloseUI: *PageSize"); - - puts("*OpenUI PageRegion: PickOne"); - puts("*OrderDependency: 10 AnySetup *PageRegion"); - puts("*DefaultPageRegion: Letter"); - puts("*PageRegion Letter: \"<>setpagedevice\""); - puts("*PageRegion A4: \"<>setpagedevice\""); - puts("*CloseUI: *PageRegion"); - - puts("*DefaultImageableArea: Letter"); - puts("*ImageableArea Letter: \"0 0 612 792\""); - puts("*ImageableArea A4: \"0 0 595 842\""); - - puts("*DefaultPaperDimension: Letter"); - puts("*PaperDimension Letter: \"612 792\""); - puts("*PaperDimension A4: \"595 842\""); - - return (0); - } - - fprintf(stderr, "ERROR: Unknown URI \"%s\"!\n", uri); - return (1); -} - - -/* - * 'list_ppds()' - List PPDs. - */ - -static int /* O - Exit status */ -list_ppds(const char *name) /* I - Program name */ -{ - int i; /* Looping var */ - const char *base; /* Base name of program */ - - - if ((base = strrchr(name, '/')) != NULL) - base ++; - else - base = name; - - for (i = 0; i < (int)(sizeof(models) / sizeof(models[0])); i ++) - printf("\"%s:///%s\" en \"Test\" \"Test %s\" \"1284 device id\"\n", - base, models[i][0], models[i][1]); - - return (0); -} - - -/* - * End of "$Id: testdriver.c 7306 2008-02-15 00:52:38Z mike $". - */ diff --git a/driver/testrgb.c b/driver/testrgb.c deleted file mode 100644 index b2bd27031..000000000 --- a/driver/testrgb.c +++ /dev/null @@ -1,348 +0,0 @@ -/* - * "$Id$" - * - * Test the new RGB color separation code for CUPS. - * - * Copyright 2007-2010 by Apple Inc. - * Copyright 1993-2006 by Easy Software Products, All Rights Reserved. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * main() - Do color rgb tests. - * test_gray() - Test grayscale rgbs... - * test_rgb() - Test color rgbs... - */ - -/* - * Include necessary headers. - */ - -#include -#include "driver.h" -#include - -#ifdef HAVE_LIBLCMS -# include -#endif /* HAVE_LIBLCMS */ - - -void test_gray(cups_sample_t *samples, int num_samples, - int cube_size, int num_comps, const char *basename); -void test_rgb(cups_sample_t *samples, int num_samples, - int cube_size, int num_comps, - const char *basename); - - -/* - * 'main()' - Do color rgb tests. - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ -{ - static cups_sample_t CMYK[] = /* Basic 4-color sep */ - { - /*{ r, g, b }, { C, M, Y, K }*/ - { { 0, 0, 0 }, { 0, 0, 0, 255 } }, - { { 255, 0, 0 }, { 0, 255, 240, 0 } }, - { { 0, 255, 0 }, { 200, 0, 200, 0 } }, - { { 255, 255, 0 }, { 0, 0, 240, 0 } }, - { { 0, 0, 255 }, { 200, 200, 0, 0 } }, - { { 255, 0, 255 }, { 0, 200, 0, 0 } }, - { { 0, 255, 255 }, { 200, 0, 0, 0 } }, - { { 255, 255, 255 }, { 0, 0, 0, 0 } } - }; - - - /* - * Make the test directory... - */ - - mkdir("test", 0755); - - /* - * Run tests for CMYK and CMYK separations... - */ - - test_rgb(CMYK, 8, 2, 4, "test/rgb-cmyk"); - - test_gray(CMYK, 8, 2, 4, "test/gray-cmyk"); - - /* - * Return with no errors... - */ - - return (0); -} - - -/* - * 'test_gray()' - Test grayscale rgbs... - */ - -void -test_gray(cups_sample_t *samples, /* I - Sample values */ - int num_samples, /* I - Number of samples */ - int cube_size, /* I - Cube size */ - int num_comps, /* I - Number of components */ - const char *basename) /* I - Base filename of output */ -{ - int i; /* Looping var */ - char filename[255]; /* Output filename */ - char line[255]; /* Line from PPM file */ - int width, height; /* Width and height of test image */ - int x, y; /* Current coordinate in image */ - int r, g, b; /* Current RGB color */ - unsigned char input[7000]; /* Line to rgbarate */ - unsigned char output[48000], /* Output rgb data */ - *outptr; /* Pointer in output */ - FILE *in; /* Input PPM file */ - FILE *out[CUPS_MAX_CHAN]; - /* Output PGM files */ - FILE *comp; /* Composite output */ - cups_rgb_t *rgb; /* Color separation */ - - - /* - * Open the test image... - */ - - in = fopen("image.pgm", "rb"); - while (fgets(line, sizeof(line), in) != NULL) - if (isdigit(line[0])) - break; - - sscanf(line, "%d%d", &width, &height); - - fgets(line, sizeof(line), in); - - /* - * Create the color rgb... - */ - - rgb = cupsRGBNew(num_samples, samples, cube_size, num_comps); - - /* - * Open the color rgb files... - */ - - for (i = 0; i < num_comps; i ++) - { - sprintf(filename, "%s%d.pgm", basename, i); - out[i] = fopen(filename, "wb"); - - fprintf(out[i], "P5\n%d %d 255\n", width, height); - } - - sprintf(filename, "%s.ppm", basename); - comp = fopen(filename, "wb"); - - fprintf(comp, "P6\n%d %d 255\n", width, height); - - /* - * Read the image and do the rgbs... - */ - - for (y = 0; y < height; y ++) - { - fread(input, width, 1, in); - - cupsRGBDoGray(rgb, input, output, width); - - for (x = 0, outptr = output; x < width; x ++, outptr += num_comps) - { - for (i = 0; i < num_comps; i ++) - putc(255 - outptr[i], out[i]); - - r = 255; - g = 255; - b = 255; - - r -= outptr[0]; - g -= outptr[1]; - b -= outptr[2]; - - r -= outptr[3]; - g -= outptr[3]; - b -= outptr[3]; - - if (num_comps > 4) - { - r -= outptr[4] / 2; - g -= outptr[5] / 2; - } - - if (num_comps > 6) - { - r -= outptr[6] / 2; - g -= outptr[6] / 2; - b -= outptr[6] / 2; - } - - if (r < 0) - putc(0, comp); - else - putc(r, comp); - - if (g < 0) - putc(0, comp); - else - putc(g, comp); - - if (b < 0) - putc(0, comp); - else - putc(b, comp); - } - } - - for (i = 0; i < num_comps; i ++) - fclose(out[i]); - - fclose(comp); - fclose(in); - - cupsRGBDelete(rgb); -} - - -/* - * 'test_rgb()' - Test color rgbs... - */ - -void -test_rgb(cups_sample_t *samples, /* I - Sample values */ - int num_samples, /* I - Number of samples */ - int cube_size, /* I - Cube size */ - int num_comps, /* I - Number of components */ - const char *basename) /* I - Base filename of output */ -{ - int i; /* Looping var */ - char filename[255]; /* Output filename */ - char line[255]; /* Line from PPM file */ - int width, height; /* Width and height of test image */ - int x, y; /* Current coordinate in image */ - int r, g, b; /* Current RGB color */ - unsigned char input[7000]; /* Line to rgbarate */ - unsigned char output[48000], /* Output rgb data */ - *outptr; /* Pointer in output */ - FILE *in; /* Input PPM file */ - FILE *out[CUPS_MAX_CHAN]; - /* Output PGM files */ - FILE *comp; /* Composite output */ - cups_rgb_t *rgb; /* Color separation */ - - - /* - * Open the test image... - */ - - in = fopen("image.ppm", "rb"); - while (fgets(line, sizeof(line), in) != NULL) - if (isdigit(line[0])) - break; - - sscanf(line, "%d%d", &width, &height); - - fgets(line, sizeof(line), in); - - /* - * Create the color rgb... - */ - - rgb = cupsRGBNew(num_samples, samples, cube_size, num_comps); - - /* - * Open the color rgb files... - */ - - for (i = 0; i < num_comps; i ++) - { - sprintf(filename, "%s%d.pgm", basename, i); - out[i] = fopen(filename, "wb"); - - fprintf(out[i], "P5\n%d %d 255\n", width, height); - } - - sprintf(filename, "%s.ppm", basename); - comp = fopen(filename, "wb"); - - fprintf(comp, "P6\n%d %d 255\n", width, height); - - /* - * Read the image and do the rgbs... - */ - - for (y = 0; y < height; y ++) - { - fread(input, width, 3, in); - - cupsRGBDoRGB(rgb, input, output, width); - - for (x = 0, outptr = output; x < width; x ++, outptr += num_comps) - { - for (i = 0; i < num_comps; i ++) - putc(255 - outptr[i], out[i]); - - r = 255; - g = 255; - b = 255; - - r -= outptr[0]; - g -= outptr[1]; - b -= outptr[2]; - - r -= outptr[3]; - g -= outptr[3]; - b -= outptr[3]; - - if (num_comps > 4) - { - r -= outptr[4] / 2; - g -= outptr[5] / 2; - } - - if (num_comps > 6) - { - r -= outptr[6] / 2; - g -= outptr[6] / 2; - b -= outptr[6] / 2; - } - - if (r < 0) - putc(0, comp); - else - putc(r, comp); - - if (g < 0) - putc(0, comp); - else - putc(g, comp); - - if (b < 0) - putc(0, comp); - else - putc(b, comp); - } - } - - for (i = 0; i < num_comps; i ++) - fclose(out[i]); - - fclose(comp); - fclose(in); - - cupsRGBDelete(rgb); -} - - -/* - * End of "$Id$". - */ diff --git a/filter/Dependencies b/filter/Dependencies index f4a4c5b89..d51a06c8f 100644 --- a/filter/Dependencies +++ b/filter/Dependencies @@ -1,81 +1,17 @@ # DO NOT DELETE -image-bmp.o: image-private.h image.h ../cups/raster.h ../cups/cups.h -image-bmp.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-bmp.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-bmp.o: ../cups/debug-private.h ../cups/string-private.h ../config.h -image-colorspace.o: image-private.h image.h ../cups/raster.h ../cups/cups.h -image-colorspace.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-colorspace.o: ../cups/http.h ../cups/array.h ../cups/language.h -image-colorspace.o: ../cups/ppd.h ../cups/cups.h ../cups/debug-private.h -image-colorspace.o: ../cups/string-private.h ../config.h -image-gif.o: image-private.h image.h ../cups/raster.h ../cups/cups.h -image-gif.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-gif.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-gif.o: ../cups/debug-private.h ../cups/string-private.h ../config.h -image-jpeg.o: image-private.h image.h ../cups/raster.h ../cups/cups.h -image-jpeg.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-jpeg.o: ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h -image-jpeg.o: ../cups/cups.h ../cups/debug-private.h ../cups/string-private.h -image-jpeg.o: ../config.h -image-photocd.o: image-private.h image.h ../cups/raster.h ../cups/cups.h -image-photocd.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-photocd.o: ../cups/http.h ../cups/array.h ../cups/language.h -image-photocd.o: ../cups/ppd.h ../cups/cups.h ../cups/debug-private.h -image-photocd.o: ../cups/string-private.h ../config.h -image-pix.o: image-private.h image.h ../cups/raster.h ../cups/cups.h -image-pix.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-pix.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-pix.o: ../cups/debug-private.h ../cups/string-private.h ../config.h -image-png.o: image-private.h image.h ../cups/raster.h ../cups/cups.h -image-png.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-png.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-png.o: ../cups/debug-private.h ../cups/string-private.h ../config.h -image-pnm.o: image-private.h image.h ../cups/raster.h ../cups/cups.h -image-pnm.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-pnm.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-pnm.o: ../cups/debug-private.h ../cups/string-private.h ../config.h -image-sgi.o: image-private.h image.h ../cups/raster.h ../cups/cups.h -image-sgi.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-sgi.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-sgi.o: ../cups/debug-private.h ../cups/string-private.h ../config.h -image-sgi.o: image-sgi.h -image-sgilib.o: image-sgi.h -image-sun.o: image-private.h image.h ../cups/raster.h ../cups/cups.h -image-sun.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-sun.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-sun.o: ../cups/debug-private.h ../cups/string-private.h ../config.h -image-tiff.o: image-private.h image.h ../cups/raster.h ../cups/cups.h -image-tiff.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-tiff.o: ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h -image-tiff.o: ../cups/cups.h ../cups/debug-private.h ../cups/string-private.h -image-tiff.o: ../config.h -image-zoom.o: image-private.h image.h ../cups/raster.h ../cups/cups.h -image-zoom.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-zoom.o: ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h -image-zoom.o: ../cups/cups.h ../cups/debug-private.h ../cups/string-private.h -image-zoom.o: ../config.h -image.o: image-private.h image.h ../cups/raster.h ../cups/cups.h -image.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image.o: ../cups/debug-private.h ../cups/string-private.h ../config.h -error.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +error.o: ../cups/raster-private.h ../cups/raster.h ../cups/cups.h error.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h error.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h error.o: ../cups/debug-private.h ../cups/string-private.h ../config.h -interpret.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +interpret.o: ../cups/raster-private.h ../cups/raster.h ../cups/cups.h interpret.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h interpret.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h interpret.o: ../cups/debug-private.h ../cups/string-private.h ../config.h -raster.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +raster.o: ../cups/raster-private.h ../cups/raster.h ../cups/cups.h raster.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h raster.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h raster.o: ../cups/debug-private.h ../cups/string-private.h ../config.h -bannertops.o: pstext.h common.h ../cups/string-private.h ../config.h -bannertops.o: ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -bannertops.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h -bannertops.o: ../cups/array.h ../cups/language.h ../cups/transcode.h image.h -bannertops.o: ../cups/raster.h ../cups/ppd.h ../cups/language-private.h commandtops.o: ../cups/cups-private.h ../cups/cups.h ../cups/string-private.h commandtops.o: ../config.h ../cups/debug-private.h ../cups/ppd-private.h commandtops.o: ../cups/ppd.h ../cups/cups.h ../cups/file.h @@ -93,28 +29,9 @@ gziptoany.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h gziptoany.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h gziptoany.o: ../cups/language-private.h ../cups/transcode.h gziptoany.o: ../cups/thread-private.h -imagetops.o: common.h ../cups/string-private.h ../config.h ../cups/cups.h -imagetops.o: ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -imagetops.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -imagetops.o: image.h ../cups/raster.h ../cups/ppd.h -imagetops.o: ../cups/language-private.h ../cups/transcode.h -imagetoraster.o: common.h ../cups/string-private.h ../config.h ../cups/cups.h -imagetoraster.o: ../cups/ppd.h ../cups/cups.h ../cups/file.h -imagetoraster.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h -imagetoraster.o: ../cups/array.h ../cups/language.h image-private.h image.h -imagetoraster.o: ../cups/raster.h ../cups/ppd.h ../cups/debug-private.h -imagetoraster.o: ../cups/language-private.h ../cups/transcode.h common.o: common.h ../cups/string-private.h ../config.h ../cups/cups.h common.o: ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h common.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -pdftops.o: ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -pdftops.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h -pdftops.o: ../cups/language.h ../cups/string-private.h ../config.h -pdftops.o: ../cups/language-private.h ../cups/transcode.h -pstext.o: pstext.h common.h ../cups/string-private.h ../config.h -pstext.o: ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -pstext.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h -pstext.o: ../cups/language.h ../cups/transcode.h ../cups/language-private.h pstops.o: common.h ../cups/string-private.h ../config.h ../cups/cups.h pstops.o: ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h pstops.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h @@ -143,101 +60,25 @@ rastertopwg.o: ../cups/language.h ../cups/array.h ../cups/versioning.h rastertopwg.o: ../cups/raster.h ../cups/cups.h ../cups/file.h ../cups/ipp.h rastertopwg.o: ../cups/http.h ../cups/ppd.h ../cups/string-private.h rastertopwg.o: ../config.h -testimage.o: image.h ../cups/raster.h ../cups/cups.h ../cups/file.h -testimage.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h -testimage.o: ../cups/array.h ../cups/language.h ../cups/ppd.h -testraster.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +testraster.o: ../cups/raster-private.h ../cups/raster.h ../cups/cups.h testraster.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h testraster.o: ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h testraster.o: ../cups/cups.h ../cups/debug-private.h ../cups/string-private.h testraster.o: ../config.h -textcommon.o: textcommon.h common.h ../cups/string-private.h ../config.h -textcommon.o: ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -textcommon.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h -textcommon.o: ../cups/array.h ../cups/language.h ../cups/language-private.h -textcommon.o: ../cups/transcode.h -texttops.o: textcommon.h common.h ../cups/string-private.h ../config.h -texttops.o: ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -texttops.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h -texttops.o: ../cups/language.h ../cups/language-private.h ../cups/transcode.h # DO NOT DELETE -image-bmp.32.o: image-bmp.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-bmp.32.o: image-bmp.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-bmp.32.o: image-bmp.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-bmp.32.o: image-bmp.c ../cups/debug-private.h ../cups/string-private.h ../config.h -image-colorspace.32.o: image-colorspace.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-colorspace.32.o: image-colorspace.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-colorspace.32.o: image-colorspace.c ../cups/http.h ../cups/array.h ../cups/language.h -image-colorspace.32.o: image-colorspace.c ../cups/ppd.h ../cups/cups.h ../cups/debug-private.h -image-colorspace.32.o: image-colorspace.c ../cups/string-private.h ../config.h -image-gif.32.o: image-gif.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-gif.32.o: image-gif.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-gif.32.o: image-gif.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-gif.32.o: image-gif.c ../cups/debug-private.h ../cups/string-private.h ../config.h -image-jpeg.32.o: image-jpeg.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-jpeg.32.o: image-jpeg.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-jpeg.32.o: image-jpeg.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h -image-jpeg.32.o: image-jpeg.c ../cups/cups.h ../cups/debug-private.h ../cups/string-private.h -image-jpeg.32.o: image-jpeg.c ../config.h -image-photocd.32.o: image-photocd.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-photocd.32.o: image-photocd.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-photocd.32.o: image-photocd.c ../cups/http.h ../cups/array.h ../cups/language.h -image-photocd.32.o: image-photocd.c ../cups/ppd.h ../cups/cups.h ../cups/debug-private.h -image-photocd.32.o: image-photocd.c ../cups/string-private.h ../config.h -image-pix.32.o: image-pix.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-pix.32.o: image-pix.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-pix.32.o: image-pix.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-pix.32.o: image-pix.c ../cups/debug-private.h ../cups/string-private.h ../config.h -image-png.32.o: image-png.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-png.32.o: image-png.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-png.32.o: image-png.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-png.32.o: image-png.c ../cups/debug-private.h ../cups/string-private.h ../config.h -image-pnm.32.o: image-pnm.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-pnm.32.o: image-pnm.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-pnm.32.o: image-pnm.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-pnm.32.o: image-pnm.c ../cups/debug-private.h ../cups/string-private.h ../config.h -image-sgi.32.o: image-sgi.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-sgi.32.o: image-sgi.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-sgi.32.o: image-sgi.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-sgi.32.o: image-sgi.c ../cups/debug-private.h ../cups/string-private.h ../config.h -image-sgi.32.o: image-sgi.c image-sgi.h -image-sgilib.32.o: image-sgilib.c image-sgi.h -image-sun.32.o: image-sun.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-sun.32.o: image-sun.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-sun.32.o: image-sun.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-sun.32.o: image-sun.c ../cups/debug-private.h ../cups/string-private.h ../config.h -image-tiff.32.o: image-tiff.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-tiff.32.o: image-tiff.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-tiff.32.o: image-tiff.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h -image-tiff.32.o: image-tiff.c ../cups/cups.h ../cups/debug-private.h ../cups/string-private.h -image-tiff.32.o: image-tiff.c ../config.h -image-zoom.32.o: image-zoom.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-zoom.32.o: image-zoom.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-zoom.32.o: image-zoom.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h -image-zoom.32.o: image-zoom.c ../cups/cups.h ../cups/debug-private.h ../cups/string-private.h -image-zoom.32.o: image-zoom.c ../config.h -image.32.o: image.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image.32.o: image.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image.32.o: image.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image.32.o: image.c ../cups/debug-private.h ../cups/string-private.h ../config.h -error.32.o: error.c image-private.h image.h ../cups/raster.h ../cups/cups.h +error.32.o: error.c ../cups/raster-private.h ../cups/raster.h ../cups/cups.h error.32.o: error.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h error.32.o: error.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h error.32.o: error.c ../cups/debug-private.h ../cups/string-private.h ../config.h -interpret.32.o: interpret.c image-private.h image.h ../cups/raster.h ../cups/cups.h +interpret.32.o: interpret.c ../cups/raster-private.h ../cups/raster.h ../cups/cups.h interpret.32.o: interpret.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h interpret.32.o: interpret.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h interpret.32.o: interpret.c ../cups/debug-private.h ../cups/string-private.h ../config.h -raster.32.o: raster.c image-private.h image.h ../cups/raster.h ../cups/cups.h +raster.32.o: raster.c ../cups/raster-private.h ../cups/raster.h ../cups/cups.h raster.32.o: raster.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h raster.32.o: raster.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h raster.32.o: raster.c ../cups/debug-private.h ../cups/string-private.h ../config.h -bannertops.32.o: bannertops.c pstext.h common.h ../cups/string-private.h ../config.h -bannertops.32.o: bannertops.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -bannertops.32.o: bannertops.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h -bannertops.32.o: bannertops.c ../cups/array.h ../cups/language.h ../cups/transcode.h image.h -bannertops.32.o: bannertops.c ../cups/raster.h ../cups/ppd.h ../cups/language-private.h commandtops.32.o: commandtops.c ../cups/cups-private.h ../cups/cups.h ../cups/string-private.h commandtops.32.o: commandtops.c ../config.h ../cups/debug-private.h ../cups/ppd-private.h commandtops.32.o: commandtops.c ../cups/ppd.h ../cups/cups.h ../cups/file.h @@ -255,28 +96,9 @@ gziptoany.32.o: gziptoany.c ../cups/pwg-private.h ../cups/http-private.h ../cup gziptoany.32.o: gziptoany.c ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h gziptoany.32.o: gziptoany.c ../cups/language-private.h ../cups/transcode.h gziptoany.32.o: gziptoany.c ../cups/thread-private.h -imagetops.32.o: imagetops.c common.h ../cups/string-private.h ../config.h ../cups/cups.h -imagetops.32.o: imagetops.c ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -imagetops.32.o: imagetops.c ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -imagetops.32.o: imagetops.c image.h ../cups/raster.h ../cups/ppd.h -imagetops.32.o: imagetops.c ../cups/language-private.h ../cups/transcode.h -imagetoraster.32.o: imagetoraster.c common.h ../cups/string-private.h ../config.h ../cups/cups.h -imagetoraster.32.o: imagetoraster.c ../cups/ppd.h ../cups/cups.h ../cups/file.h -imagetoraster.32.o: imagetoraster.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h -imagetoraster.32.o: imagetoraster.c ../cups/array.h ../cups/language.h image-private.h image.h -imagetoraster.32.o: imagetoraster.c ../cups/raster.h ../cups/ppd.h ../cups/debug-private.h -imagetoraster.32.o: imagetoraster.c ../cups/language-private.h ../cups/transcode.h common.32.o: common.c common.h ../cups/string-private.h ../config.h ../cups/cups.h common.32.o: common.c ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h common.32.o: common.c ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -pdftops.32.o: pdftops.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -pdftops.32.o: pdftops.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h -pdftops.32.o: pdftops.c ../cups/language.h ../cups/string-private.h ../config.h -pdftops.32.o: pdftops.c ../cups/language-private.h ../cups/transcode.h -pstext.32.o: pstext.c pstext.h common.h ../cups/string-private.h ../config.h -pstext.32.o: pstext.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -pstext.32.o: pstext.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h -pstext.32.o: pstext.c ../cups/language.h ../cups/transcode.h ../cups/language-private.h pstops.32.o: pstops.c common.h ../cups/string-private.h ../config.h ../cups/cups.h pstops.32.o: pstops.c ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h pstops.32.o: pstops.c ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h @@ -305,101 +127,25 @@ rastertopwg.32.o: rastertopwg.c ../cups/language.h ../cups/array.h ../cups/vers rastertopwg.32.o: rastertopwg.c ../cups/raster.h ../cups/cups.h ../cups/file.h ../cups/ipp.h rastertopwg.32.o: rastertopwg.c ../cups/http.h ../cups/ppd.h ../cups/string-private.h rastertopwg.32.o: rastertopwg.c ../config.h -testimage.32.o: testimage.c image.h ../cups/raster.h ../cups/cups.h ../cups/file.h -testimage.32.o: testimage.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h -testimage.32.o: testimage.c ../cups/array.h ../cups/language.h ../cups/ppd.h -testraster.32.o: testraster.c image-private.h image.h ../cups/raster.h ../cups/cups.h +testraster.32.o: testraster.c ../cups/raster-private.h ../cups/raster.h ../cups/cups.h testraster.32.o: testraster.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h testraster.32.o: testraster.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h testraster.32.o: testraster.c ../cups/cups.h ../cups/debug-private.h ../cups/string-private.h testraster.32.o: testraster.c ../config.h -textcommon.32.o: textcommon.c textcommon.h common.h ../cups/string-private.h ../config.h -textcommon.32.o: textcommon.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -textcommon.32.o: textcommon.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h -textcommon.32.o: textcommon.c ../cups/array.h ../cups/language.h ../cups/language-private.h -textcommon.32.o: textcommon.c ../cups/transcode.h -texttops.32.o: texttops.c textcommon.h common.h ../cups/string-private.h ../config.h -texttops.32.o: texttops.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -texttops.32.o: texttops.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h -texttops.32.o: texttops.c ../cups/language.h ../cups/language-private.h ../cups/transcode.h # DO NOT DELETE -image-bmp.64.o: image-bmp.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-bmp.64.o: image-bmp.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-bmp.64.o: image-bmp.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-bmp.64.o: image-bmp.c ../cups/debug-private.h ../cups/string-private.h ../config.h -image-colorspace.64.o: image-colorspace.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-colorspace.64.o: image-colorspace.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-colorspace.64.o: image-colorspace.c ../cups/http.h ../cups/array.h ../cups/language.h -image-colorspace.64.o: image-colorspace.c ../cups/ppd.h ../cups/cups.h ../cups/debug-private.h -image-colorspace.64.o: image-colorspace.c ../cups/string-private.h ../config.h -image-gif.64.o: image-gif.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-gif.64.o: image-gif.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-gif.64.o: image-gif.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-gif.64.o: image-gif.c ../cups/debug-private.h ../cups/string-private.h ../config.h -image-jpeg.64.o: image-jpeg.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-jpeg.64.o: image-jpeg.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-jpeg.64.o: image-jpeg.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h -image-jpeg.64.o: image-jpeg.c ../cups/cups.h ../cups/debug-private.h ../cups/string-private.h -image-jpeg.64.o: image-jpeg.c ../config.h -image-photocd.64.o: image-photocd.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-photocd.64.o: image-photocd.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-photocd.64.o: image-photocd.c ../cups/http.h ../cups/array.h ../cups/language.h -image-photocd.64.o: image-photocd.c ../cups/ppd.h ../cups/cups.h ../cups/debug-private.h -image-photocd.64.o: image-photocd.c ../cups/string-private.h ../config.h -image-pix.64.o: image-pix.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-pix.64.o: image-pix.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-pix.64.o: image-pix.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-pix.64.o: image-pix.c ../cups/debug-private.h ../cups/string-private.h ../config.h -image-png.64.o: image-png.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-png.64.o: image-png.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-png.64.o: image-png.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-png.64.o: image-png.c ../cups/debug-private.h ../cups/string-private.h ../config.h -image-pnm.64.o: image-pnm.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-pnm.64.o: image-pnm.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-pnm.64.o: image-pnm.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-pnm.64.o: image-pnm.c ../cups/debug-private.h ../cups/string-private.h ../config.h -image-sgi.64.o: image-sgi.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-sgi.64.o: image-sgi.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-sgi.64.o: image-sgi.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-sgi.64.o: image-sgi.c ../cups/debug-private.h ../cups/string-private.h ../config.h -image-sgi.64.o: image-sgi.c image-sgi.h -image-sgilib.64.o: image-sgilib.c image-sgi.h -image-sun.64.o: image-sun.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-sun.64.o: image-sun.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image-sun.64.o: image-sun.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image-sun.64.o: image-sun.c ../cups/debug-private.h ../cups/string-private.h ../config.h -image-tiff.64.o: image-tiff.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-tiff.64.o: image-tiff.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-tiff.64.o: image-tiff.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h -image-tiff.64.o: image-tiff.c ../cups/cups.h ../cups/debug-private.h ../cups/string-private.h -image-tiff.64.o: image-tiff.c ../config.h -image-zoom.64.o: image-zoom.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image-zoom.64.o: image-zoom.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h -image-zoom.64.o: image-zoom.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h -image-zoom.64.o: image-zoom.c ../cups/cups.h ../cups/debug-private.h ../cups/string-private.h -image-zoom.64.o: image-zoom.c ../config.h -image.64.o: image.c image-private.h image.h ../cups/raster.h ../cups/cups.h -image.64.o: image.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h -image.64.o: image.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h -image.64.o: image.c ../cups/debug-private.h ../cups/string-private.h ../config.h -error.64.o: error.c image-private.h image.h ../cups/raster.h ../cups/cups.h +error.64.o: error.c ../cups/raster-private.h ../cups/raster.h ../cups/cups.h error.64.o: error.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h error.64.o: error.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h error.64.o: error.c ../cups/debug-private.h ../cups/string-private.h ../config.h -interpret.64.o: interpret.c image-private.h image.h ../cups/raster.h ../cups/cups.h +interpret.64.o: interpret.c ../cups/raster-private.h ../cups/raster.h ../cups/cups.h interpret.64.o: interpret.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h interpret.64.o: interpret.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h interpret.64.o: interpret.c ../cups/debug-private.h ../cups/string-private.h ../config.h -raster.64.o: raster.c image-private.h image.h ../cups/raster.h ../cups/cups.h +raster.64.o: raster.c ../cups/raster-private.h ../cups/raster.h ../cups/cups.h raster.64.o: raster.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h raster.64.o: raster.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h raster.64.o: raster.c ../cups/debug-private.h ../cups/string-private.h ../config.h -bannertops.64.o: bannertops.c pstext.h common.h ../cups/string-private.h ../config.h -bannertops.64.o: bannertops.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -bannertops.64.o: bannertops.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h -bannertops.64.o: bannertops.c ../cups/array.h ../cups/language.h ../cups/transcode.h image.h -bannertops.64.o: bannertops.c ../cups/raster.h ../cups/ppd.h ../cups/language-private.h commandtops.64.o: commandtops.c ../cups/cups-private.h ../cups/cups.h ../cups/string-private.h commandtops.64.o: commandtops.c ../config.h ../cups/debug-private.h ../cups/ppd-private.h commandtops.64.o: commandtops.c ../cups/ppd.h ../cups/cups.h ../cups/file.h @@ -417,28 +163,9 @@ gziptoany.64.o: gziptoany.c ../cups/pwg-private.h ../cups/http-private.h ../cup gziptoany.64.o: gziptoany.c ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h gziptoany.64.o: gziptoany.c ../cups/language-private.h ../cups/transcode.h gziptoany.64.o: gziptoany.c ../cups/thread-private.h -imagetops.64.o: imagetops.c common.h ../cups/string-private.h ../config.h ../cups/cups.h -imagetops.64.o: imagetops.c ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h -imagetops.64.o: imagetops.c ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -imagetops.64.o: imagetops.c image.h ../cups/raster.h ../cups/ppd.h -imagetops.64.o: imagetops.c ../cups/language-private.h ../cups/transcode.h -imagetoraster.64.o: imagetoraster.c common.h ../cups/string-private.h ../config.h ../cups/cups.h -imagetoraster.64.o: imagetoraster.c ../cups/ppd.h ../cups/cups.h ../cups/file.h -imagetoraster.64.o: imagetoraster.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h -imagetoraster.64.o: imagetoraster.c ../cups/array.h ../cups/language.h image-private.h image.h -imagetoraster.64.o: imagetoraster.c ../cups/raster.h ../cups/ppd.h ../cups/debug-private.h -imagetoraster.64.o: imagetoraster.c ../cups/language-private.h ../cups/transcode.h common.64.o: common.c common.h ../cups/string-private.h ../config.h ../cups/cups.h common.64.o: common.c ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h common.64.o: common.c ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h -pdftops.64.o: pdftops.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -pdftops.64.o: pdftops.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h -pdftops.64.o: pdftops.c ../cups/language.h ../cups/string-private.h ../config.h -pdftops.64.o: pdftops.c ../cups/language-private.h ../cups/transcode.h -pstext.64.o: pstext.c pstext.h common.h ../cups/string-private.h ../config.h -pstext.64.o: pstext.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -pstext.64.o: pstext.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h -pstext.64.o: pstext.c ../cups/language.h ../cups/transcode.h ../cups/language-private.h pstops.64.o: pstops.c common.h ../cups/string-private.h ../config.h ../cups/cups.h pstops.64.o: pstops.c ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h pstops.64.o: pstops.c ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h @@ -467,20 +194,8 @@ rastertopwg.64.o: rastertopwg.c ../cups/language.h ../cups/array.h ../cups/vers rastertopwg.64.o: rastertopwg.c ../cups/raster.h ../cups/cups.h ../cups/file.h ../cups/ipp.h rastertopwg.64.o: rastertopwg.c ../cups/http.h ../cups/ppd.h ../cups/string-private.h rastertopwg.64.o: rastertopwg.c ../config.h -testimage.64.o: testimage.c image.h ../cups/raster.h ../cups/cups.h ../cups/file.h -testimage.64.o: testimage.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h -testimage.64.o: testimage.c ../cups/array.h ../cups/language.h ../cups/ppd.h -testraster.64.o: testraster.c image-private.h image.h ../cups/raster.h ../cups/cups.h +testraster.64.o: testraster.c ../cups/raster-private.h ../cups/raster.h ../cups/cups.h testraster.64.o: testraster.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h testraster.64.o: testraster.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h testraster.64.o: testraster.c ../cups/cups.h ../cups/debug-private.h ../cups/string-private.h testraster.64.o: testraster.c ../config.h -textcommon.64.o: textcommon.c textcommon.h common.h ../cups/string-private.h ../config.h -textcommon.64.o: textcommon.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -textcommon.64.o: textcommon.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h -textcommon.64.o: textcommon.c ../cups/array.h ../cups/language.h ../cups/language-private.h -textcommon.64.o: textcommon.c ../cups/transcode.h -texttops.64.o: texttops.c textcommon.h common.h ../cups/string-private.h ../config.h -texttops.64.o: texttops.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h -texttops.64.o: texttops.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h -texttops.64.o: texttops.c ../cups/language.h ../cups/language-private.h ../cups/transcode.h diff --git a/filter/Makefile b/filter/Makefile index 104d4cda6..e7440eefe 100644 --- a/filter/Makefile +++ b/filter/Makefile @@ -19,13 +19,9 @@ include ../Makedefs FILTERS = \ - $(BANNERTOPS) \ commandtops \ gziptoany \ - $(TEXTTOPS) \ pstops \ - $(IMGFILTERS) \ - $(PDFTOPS) \ rastertoepson \ rastertohp \ rastertolabel \ @@ -37,23 +33,18 @@ LIBTARGETS = \ $(LIB64CUPSIMAGE) UNITTARGETS = \ rasterbench \ - testimage \ testraster TARGETS = \ $(LIBTARGETS) \ $(FILTERS) -IMAGEOBJS = image-bmp.o image-colorspace.o image-gif.o image-jpeg.o \ - image-photocd.o image-pix.o image-png.o image-pnm.o \ - image-sgi.o image-sgilib.o image-sun.o image-tiff.o \ - image-zoom.o image.o error.o interpret.o raster.o +IMAGEOBJS = error.o interpret.o raster.o IMAGE32OBJS = $(IMAGEOBJS:.o=.32.o) IMAGE64OBJS = $(IMAGEOBJS:.o=.64.o) OBJS = $(IMAGEOBJS) \ - bannertops.o commandtops.o gziptoany.o imagetops.o \ - imagetoraster.o common.o pdftops.o pstext.o pstops.o \ + commandtops.o gziptoany.o common.o pstops.o \ rasterbench.o rastertoepson.o rastertohp.o rastertolabel.o \ - rastertopwg.o testimage.o testraster.o textcommon.o texttops.o + rastertopwg.o testraster.o # @@ -139,8 +130,6 @@ install-exec: # install-headers: - $(INSTALL_DIR) -m 755 $(INCLUDEDIR)/cups - $(INSTALL_DATA) image.h $(INCLUDEDIR)/cups # @@ -200,8 +189,6 @@ uninstall: $(UNINSTALL32) $(UNINSTALL64) $(RM) $(LIBDIR)/libcupsimage.so $(RM) $(LIBDIR)/libcupsimage.so.2 -$(RMDIR) $(LIBDIR) - $(RM) $(INCLUDEDIR)/cups/image.h - -$(RMDIR) $(INCLUDEDIR)/cups uninstall32bit: $(RM) $(LIB32DIR)/libcupsimage.so @@ -286,16 +273,6 @@ framedhelp: --intro spec-ppd.shtml \ -# -# bannertops -# - -bannertops: bannertops.o pstext.o common.o ../cups/$(LIBCUPS) $(LIBCUPSIMAGE) - echo Linking $@... - $(CC) $(LDFLAGS) -o $@ bannertops.o pstext.o common.o $(LINKCUPSIMAGE) \ - $(IMGLIBS) $(LIBS) - - # # commandtops # @@ -397,38 +374,6 @@ libcupsimage.a: $(IMAGEOBJS) $(RANLIB) $@ -# -# testimage -# - -testimage: testimage.o libcupsimage.a ../Makedefs - echo Linking $@... - $(CC) $(LDFLAGS) -o $@ testimage.o libcupsimage.a \ - $(IMGLIBS) $(DSOLIBS) $(LIBS) - - -# -# imagetops -# - -imagetops: imagetops.o common.o $(LIBCUPSIMAGE) \ - ../cups/$(LIBCUPS) - echo Linking $@... - $(CC) $(LDFLAGS) -o $@ imagetops.o common.o $(LINKCUPSIMAGE) \ - $(IMGLIBS) $(LIBS) - - -# -# imagetoraster -# - -imagetoraster: imagetoraster.o common.o $(LIBCUPSIMAGE) \ - ../cups/$(LIBCUPS) - echo Linking $@... - $(CC) $(LDFLAGS) -o $@ imagetoraster.o common.o $(LINKCUPSIMAGE) \ - $(IMGLIBS) $(LIBS) - - # # pstops # @@ -438,15 +383,6 @@ pstops: pstops.o common.o ../cups/$(LIBCUPS) $(CC) $(LDFLAGS) -o $@ pstops.o common.o $(LIBS) -lm -# -# pdftops -# - -pdftops: pdftops.o common.o ../cups/$(LIBCUPS) - echo Linking $@... - $(CC) $(LDFLAGS) -o $@ pdftops.o common.o $(LIBS) - - # # rastertoepson # @@ -505,16 +441,6 @@ rasterbench: rasterbench.o libcupsimage.a $(CC) $(LDFLAGS) -o $@ rasterbench.o libcupsimage.a $(LIBS) -# -# texttops -# - -texttops: texttops.o textcommon.o common.o \ - ../cups/$(LIBCUPS) - echo Linking $@... - $(CC) $(LDFLAGS) -o $@ texttops.o textcommon.o common.o $(LIBS) - - # # Dependencies... # diff --git a/filter/bannertops.c b/filter/bannertops.c deleted file mode 100644 index 467980e99..000000000 --- a/filter/bannertops.c +++ /dev/null @@ -1,1094 +0,0 @@ -/* - * "$Id$" - * - * Banner to PostScript filter for CUPS. - * - * Copyright 2008-2011 by Apple Inc. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * main() - Generate PostScript cover pages. - * load_banner() - Load the banner file. - * ps_ascii85() - Print binary data as a series of base-85 numbers. - * write_banner() - Write a banner page... - * write_epilogue() - Write the PostScript file epilogue. - * write_prolog() - Write the PostScript file prolog with options. - */ - -/* - * Include necessary headers... - */ - -#include "pstext.h" -#include "image.h" -#include - - -/* - * Constants... - */ - -#define SHOW_IMAGEABLE_AREA 1 /* Show imageable area */ -#define SHOW_JOB_BILLING 2 /* Show billing string */ -#define SHOW_JOB_ID 4 /* Show job ID */ -#define SHOW_JOB_NAME 8 /* Show job title */ -#define SHOW_JOB_ORIGINATING_USER_NAME 16 /* Show owner of job */ -#define SHOW_JOB_ORIGINATING_HOST_NAME 32 /* Show submitting system */ -#define SHOW_JOB_UUID 64 /* Show job UUID */ -#define SHOW_OPTIONS 128 /* Show print options */ -#define SHOW_PAPER_NAME 256 /* Show paper size name */ -#define SHOW_PAPER_SIZE 512 /* Show paper dimensions */ -#define SHOW_PRINTER_DRIVER_NAME 1024 /* Show printer driver name */ -#define SHOW_PRINTER_DRIVER_VERSION 2048 /* Show printer driver version */ -#define SHOW_PRINTER_INFO 4096 /* Show printer description */ -#define SHOW_PRINTER_LOCATION 8192 /* Show printer location */ -#define SHOW_PRINTER_MAKE_AND_MODEL 16384 /* Show printer make and model */ -#define SHOW_PRINTER_NAME 32768 /* Show printer queue ID */ -#define SHOW_TIME_AT_CREATION 65536 /* Show date/time when submitted */ -#define SHOW_TIME_AT_PROCESSING 131072 /* Show date/time when printed */ - - -/* - * Structures... - */ - -typedef struct banner_file_s /**** Banner file data ****/ -{ - int show; /* What to show */ - char *header, /* Header text */ - *footer; /* Footer text */ - cups_array_t *notices, /* Notices to show */ - *images; /* Images to show */ -} banner_file_t; - - -/* - * Local functions... - */ - -static banner_file_t *load_banner(const char *filename); -static int write_banner(banner_file_t *banner, ppd_file_t *ppd, - ps_text_t *fonts, int job_id, - const char *title, const char *username, - int num_options, cups_option_t *options); -static void write_epilogue(int num_pages); -static ps_text_t *write_prolog(const char *title, const char *user); - - -/* - * 'main()' - Generate PostScript cover pages. - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line args */ - char *argv[]) /* I - Command-line arguments */ -{ - banner_file_t *banner; /* Banner file data */ - int num_options; /* Number of print options */ - cups_option_t *options; /* Print options */ - ppd_file_t *ppd; /* PPD file */ - ps_text_t *fonts; /* Fonts for output */ - int job_id; /* Job ID from command-line */ - const char *title, /* Title from command-line */ - *username; /* Username from command-line */ - int num_pages; /* Number of pages printed */ - - - /* - * Make sure status messages are not buffered... - */ - - setbuf(stderr, NULL); - - /* - * Check command-line... - */ - - if (argc < 6 || argc > 7) - { - _cupsLangPrintf(stderr, - _("Usage: %s job-id user title copies options file"), - argv[0]); - return (1); - } - - /* - * Get stuff from command-line... - */ - - job_id = atoi(argv[1]); - username = argv[2]; - title = argv[3]; - options = NULL; - num_options = cupsParseOptions(argv[5], 0, &options); - banner = load_banner(argv[6]); - - /* - * Set standard options and get the PPD file for this printer... - */ - - ppd = SetCommonOptions(num_options, options, 1); - - /* - * Write a PostScript banner document and return... - */ - - fonts = write_prolog(title, username); - num_pages = write_banner(banner, ppd, fonts, job_id, title, username, - num_options, options); - - write_epilogue(num_pages); - - return (0); -} - - -/* - * 'load_banner()' - Load the banner file. - */ - -static banner_file_t * /* O - Banner file data */ -load_banner(const char *filename) /* I - Filename or NULL for stdin */ -{ - cups_file_t *fp; /* File */ - char line[2048], /* Line buffer */ - *ptr; /* Pointer into line */ - int linenum; /* Current line number */ - banner_file_t *banner; /* Banner file data */ - const char *cups_docroot; /* CUPS_DOCROOT environment variable */ - - - fprintf(stderr, "DEBUG: load_banner(filename=\"%s\")\n", - filename ? filename : "(stdin)"); - - /* - * Open the banner file... - */ - - if (filename) - fp = cupsFileOpen(filename, "r"); - else - fp = cupsFileStdin(); - - if (!fp) - { - _cupsLangPrintError("ERROR", _("Unable to open print file")); - exit(1); - } - - /* - * Read the banner file... - */ - - if ((cups_docroot = getenv("CUPS_DOCROOT")) == NULL) - cups_docroot = CUPS_DOCROOT; - - banner = calloc(1, sizeof(banner_file_t)); - linenum = 0; - - while (cupsFileGets(fp, line, sizeof(line))) - { - /* - * Skip blank and comment lines... - */ - - linenum ++; - - fprintf(stderr, "DEBUG: %4d %s\n", linenum, line); - - if (line[0] == '#' || !line[0]) - continue; - - /* - * Break the line into keyword and value parts... - */ - - for (ptr = line; *ptr && !isspace(*ptr & 255); ptr ++); - - while (isspace(*ptr & 255)) - *ptr++ = '\0'; - - if (!*ptr) - { - _cupsLangPrintFilter(stderr, "ERROR", - _("Missing value on line %d of banner file."), - linenum); - continue; - } - - /* - * Save keyword values in the appropriate places... - */ - - if (!_cups_strcasecmp(line, "Footer")) - { - if (banner->footer) - fprintf(stderr, "DEBUG: Extra \"Footer\" on line %d of banner file\n", - linenum); - else - banner->footer = strdup(ptr); - } - else if (!_cups_strcasecmp(line, "Header")) - { - if (banner->header) - fprintf(stderr, "DEBUG: Extra \"Header\" on line %d of banner file\n", - linenum); - else - banner->header = strdup(ptr); - } - else if (!_cups_strcasecmp(line, "Image")) - { - char imagefile[1024]; /* Image filename */ - - - if (ptr[0] == '/') - strlcpy(imagefile, ptr, sizeof(imagefile)); - else - snprintf(imagefile, sizeof(imagefile), "%s/%s", cups_docroot, ptr); - - if (access(imagefile, R_OK)) - { - fprintf(stderr, "DEBUG: Image \"%s\" on line %d of banner file: %s\n", - ptr, linenum, strerror(errno)); - } - else - { - if (!banner->images) - banner->images = cupsArrayNew(NULL, NULL); - - cupsArrayAdd(banner->images, strdup(imagefile)); - } - } - else if (!_cups_strcasecmp(line, "Notice")) - { - if (!banner->notices) - banner->notices = cupsArrayNew(NULL, NULL); - - cupsArrayAdd(banner->notices, strdup(ptr)); - } - else if (!_cups_strcasecmp(line, "Show")) - { - char *value; /* Current value */ - - - for (value = ptr; *value; value = ptr) - { - /* - * Find the end of the current value - */ - - while (*ptr && !isspace(*ptr & 255)) - ptr ++; - - while (*ptr && isspace(*ptr & 255)) - *ptr++ = '\0'; - - /* - * Add the value to the show flags... - */ - if (!_cups_strcasecmp(value, "imageable-area")) - banner->show |= SHOW_IMAGEABLE_AREA; - else if (!_cups_strcasecmp(value, "job-billing")) - banner->show |= SHOW_JOB_BILLING; - else if (!_cups_strcasecmp(value, "job-id")) - banner->show |= SHOW_JOB_ID; - else if (!_cups_strcasecmp(value, "job-name")) - banner->show |= SHOW_JOB_NAME; - else if (!_cups_strcasecmp(value, "job-originating-host-name")) - banner->show |= SHOW_JOB_ORIGINATING_HOST_NAME; - else if (!_cups_strcasecmp(value, "job-originating-user-name")) - banner->show |= SHOW_JOB_ORIGINATING_USER_NAME; - else if (!_cups_strcasecmp(value, "job-uuid")) - banner->show |= SHOW_JOB_UUID; - else if (!_cups_strcasecmp(value, "options")) - banner->show |= SHOW_OPTIONS; - else if (!_cups_strcasecmp(value, "paper-name")) - banner->show |= SHOW_PAPER_NAME; - else if (!_cups_strcasecmp(value, "paper-size")) - banner->show |= SHOW_PAPER_SIZE; - else if (!_cups_strcasecmp(value, "printer-driver-name")) - banner->show |= SHOW_PRINTER_DRIVER_NAME; - else if (!_cups_strcasecmp(value, "printer-driver-version")) - banner->show |= SHOW_PRINTER_DRIVER_VERSION; - else if (!_cups_strcasecmp(value, "printer-info")) - banner->show |= SHOW_PRINTER_INFO; - else if (!_cups_strcasecmp(value, "printer-location")) - banner->show |= SHOW_PRINTER_LOCATION; - else if (!_cups_strcasecmp(value, "printer-make-and-model")) - banner->show |= SHOW_PRINTER_MAKE_AND_MODEL; - else if (!_cups_strcasecmp(value, "printer-name")) - banner->show |= SHOW_PRINTER_NAME; - else if (!_cups_strcasecmp(value, "time-at-creation")) - banner->show |= SHOW_TIME_AT_CREATION; - else if (!_cups_strcasecmp(value, "time-at-processing")) - banner->show |= SHOW_TIME_AT_PROCESSING; - else - { - fprintf(stderr, - "DEBUG: Unknown \"Show\" value \"%s\" on line %d of banner " - "file\n", value, linenum); - } - } - } - else - fprintf(stderr, "DEBUG: Unknown key \"%s\" on line %d of banner file\n", - line, linenum); - } - - if (filename) - cupsFileClose(fp); - - return (banner); -} - - -/* - * 'ps_ascii85()' - Print binary data as a series of base-85 numbers. - */ - -static void -ps_ascii85(cups_ib_t *data, /* I - Data to print */ - int length, /* I - Number of bytes to print */ - int last_line) /* I - Last line of raster data? */ -{ - unsigned b; /* Binary data word */ - unsigned char c[5]; /* ASCII85 encoded chars */ - static int col = 0; /* Current column */ - - - while (length > 3) - { - b = (((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3]; - - if (b == 0) - { - putchar('z'); - col ++; - } - else - { - c[4] = (b % 85) + '!'; - b /= 85; - c[3] = (b % 85) + '!'; - b /= 85; - c[2] = (b % 85) + '!'; - b /= 85; - c[1] = (b % 85) + '!'; - b /= 85; - c[0] = b + '!'; - - fwrite(c, 5, 1, stdout); - col += 5; - } - - data += 4; - length -= 4; - - if (col >= 75) - { - putchar('\n'); - col = 0; - } - } - - if (last_line) - { - if (length > 0) - { - memset(data + length, 0, 4 - length); - b = (((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3]; - - c[4] = (b % 85) + '!'; - b /= 85; - c[3] = (b % 85) + '!'; - b /= 85; - c[2] = (b % 85) + '!'; - b /= 85; - c[1] = (b % 85) + '!'; - b /= 85; - c[0] = b + '!'; - - fwrite(c, length + 1, 1, stdout); - } - - puts("~>"); - col = 0; - } -} - - -/* - * 'write_banner()' - Write a banner page... - */ - -static int /* O - Number of pages */ -write_banner(banner_file_t *banner, /* I - Banner file */ - ppd_file_t *ppd, /* I - PPD file */ - ps_text_t *fonts, /* I - Fonts */ - int job_id, /* I - Job ID */ - const char *title, /* I - Title of job */ - const char *username, /* I - Owner of job */ - int num_options, /* I - Number of options */ - cups_option_t *options) /* I - Options */ -{ - char *notice; /* Current notice */ - char *imagefile; /* Current image file */ - cups_array_t *images; /* Images */ - cups_image_t *image; /* Current image */ - const char *option; /* Option value */ - int i, j; /* Looping vars */ - float x, /* Current X position */ - y; /* Current Y position */ - cups_lang_t *language; /* Default language */ - int showlines; /* Number of lines to show */ - float fontsize; /* Font size to use */ - int num_pages; /* Number of pages */ - float print_width, /* Printable width of page */ - print_height, /* Printable height of page */ - info_top, /* Top of info fields */ - info_height, /* Height of info fields */ - line_height, /* Height of info lines */ - notices_height, /* Height of all notices */ - images_width, /* Width of all images */ - images_height, /* Height of all images */ - total_height; /* Height of all content */ - char text[1024]; /* Formatted field text */ - - - /* - * Figure out how many lines of text will be shown... - */ - - showlines = 0; - if (banner->show & SHOW_IMAGEABLE_AREA) - showlines += 2; - if (banner->show & SHOW_JOB_BILLING) - showlines ++; - if (banner->show & SHOW_JOB_ID) - showlines ++; - if (banner->show & SHOW_JOB_NAME) - showlines ++; - if (banner->show & SHOW_JOB_ORIGINATING_USER_NAME) - showlines ++; - if (banner->show & SHOW_JOB_ORIGINATING_HOST_NAME) - showlines ++; - if (banner->show & SHOW_JOB_UUID) - showlines ++; - if (banner->show & SHOW_OPTIONS) - { - for (j = 0; j < num_options; j ++) - { - if (_cups_strcasecmp("media", options[j].name) && - _cups_strcasecmp("PageSize", options[j].name) && - _cups_strcasecmp("PageRegion", options[j].name) && - _cups_strcasecmp("InputSlot", options[j].name) && - _cups_strcasecmp("MediaType", options[j].name) && - _cups_strcasecmp("finishings", options[j].name) && - _cups_strcasecmp("sides", options[j].name) && - _cups_strcasecmp("Duplex", options[j].name) && - _cups_strcasecmp("orientation-requested", options[j].name) && - _cups_strcasecmp("landscape", options[j].name) && - _cups_strcasecmp("number-up", options[j].name) && - _cups_strcasecmp("OutputOrder", options[j].name)) - continue; - - showlines ++; - } - } - if (banner->show & SHOW_PAPER_NAME) - showlines ++; - if (banner->show & SHOW_PAPER_SIZE) - showlines += 2; - if (banner->show & SHOW_PRINTER_DRIVER_NAME) - showlines ++; - if (banner->show & SHOW_PRINTER_DRIVER_VERSION) - showlines ++; - if (banner->show & SHOW_PRINTER_INFO) - showlines ++; - if (banner->show & SHOW_PRINTER_LOCATION) - showlines ++; - if (banner->show & SHOW_PRINTER_MAKE_AND_MODEL) - showlines ++; - if (banner->show & SHOW_PRINTER_NAME) - showlines ++; - if (banner->show & SHOW_TIME_AT_CREATION) - showlines ++; - if (banner->show & SHOW_TIME_AT_PROCESSING) - showlines ++; - - /* - * Figure out the dimensions and positions of everything... - */ - - print_width = PageRight - PageLeft; - print_height = PageTop - PageBottom; - fontsize = print_height / 60; /* Nominally 12pts */ - line_height = 1.2 * fontsize; - info_height = showlines * line_height; - notices_height = cupsArrayCount(banner->notices) * line_height; - - if (cupsArrayCount(banner->images)) - { - images = cupsArrayNew(NULL, NULL); - images_height = print_height / 10; /* Nominally 1" */ - - for (imagefile = (char *)cupsArrayFirst(banner->images), images_width = 0.0; - imagefile; - imagefile = (char *)cupsArrayNext(banner->images)) - { - if ((image = cupsImageOpen(imagefile, ColorDevice ? CUPS_IMAGE_RGB_CMYK : - CUPS_IMAGE_WHITE, - CUPS_IMAGE_WHITE, 100, 0, NULL)) == NULL) - { - fprintf(stderr, "DEBUG: Unable to open image file \"%s\"\n", - imagefile); - continue; - } - - images_width += cupsImageGetWidth(image) * images_height / - cupsImageGetHeight(image); - cupsArrayAdd(images, image); - } - } - else - { - images = NULL; - images_height = 0; - images_width = 0; - } - - total_height = info_height + notices_height + images_height; - if (cupsArrayCount(banner->notices) && showlines) - total_height += 2 * line_height; - if (cupsArrayCount(banner->images) && - (showlines || cupsArrayCount(banner->notices))) - total_height += 2 * line_height; - - info_top = 0.5 * (print_height + total_height); - - /* - * Write the page(s)... - */ - - language = cupsLangDefault(); - num_pages = Duplex ? 2 : 1; - - for (i = 1; i <= num_pages; i ++) - { - /* - * Start the page... - */ - - printf("%%%%Page: %s %d\n", i == 1 ? "coverpage" : "coverback", i); - puts("gsave"); - if (i == 1) - printf("%.1f %.1f translate\n", PageLeft, PageBottom); - else - printf("%.1f %.1f translate\n", PageWidth - PageRight, - PageLength - PageTop); - puts("0 setgray"); - - y = info_top; - - /* - * Information... - */ - - if (banner->show) - { - x = 0.33 * print_width; - - if (banner->show & SHOW_PRINTER_NAME) - { - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Printer Name: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, getenv("PRINTER")); - } - if (banner->show & SHOW_JOB_ID) - { - snprintf(text, sizeof(text), "%s-%d", getenv("PRINTER"), job_id); - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Job ID: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); - } - if (banner->show & SHOW_JOB_UUID) - { - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Job UUID: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, - cupsGetOption("job-uuid", num_options, options)); - } - if (banner->show & SHOW_JOB_NAME) - { - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Title: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, title); - } - if (banner->show & SHOW_JOB_ORIGINATING_USER_NAME) - { - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Printed For: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, username); - } - if (banner->show & SHOW_JOB_ORIGINATING_HOST_NAME) - { - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Printed From: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, - cupsGetOption("job-originating-host-name", num_options, - options)); - } - if (banner->show & SHOW_JOB_BILLING) - { - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Billing Information: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, - cupsGetOption("job-billing", num_options, options)); - } - if (banner->show & SHOW_OPTIONS) - { - printf("%.1f %.1f moveto", x, y); - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Options: "))); - - for (j = 0; j < num_options; j ++) - { - if (_cups_strcasecmp("media", options[j].name) && - _cups_strcasecmp("PageSize", options[j].name) && - _cups_strcasecmp("PageRegion", options[j].name) && - _cups_strcasecmp("InputSlot", options[j].name) && - _cups_strcasecmp("MediaType", options[j].name) && - _cups_strcasecmp("finishings", options[j].name) && - _cups_strcasecmp("sides", options[j].name) && - _cups_strcasecmp("Duplex", options[j].name) && - _cups_strcasecmp("orientation-requested", options[j].name) && - _cups_strcasecmp("landscape", options[j].name) && - _cups_strcasecmp("number-up", options[j].name) && - _cups_strcasecmp("OutputOrder", options[j].name)) - continue; - - if (!_cups_strcasecmp("landscape", options[j].name)) - strlcpy(text, "orientation-requested=landscape", sizeof(text)); - else if (!_cups_strcasecmp("orientation-requested", options[j].name)) - { - switch (atoi(options[j].value)) - { - default : - case IPP_PORTRAIT : - strlcpy(text, "orientation-requested=portrait", - sizeof(text)); - break; - - case IPP_LANDSCAPE : - strlcpy(text, "orientation-requested=landscape", - sizeof(text)); - break; - - case IPP_REVERSE_PORTRAIT : - strlcpy(text, "orientation-requested=reverse-portrait", - sizeof(text)); - break; - - case IPP_REVERSE_LANDSCAPE : - strlcpy(text, "orientation-requested=reverse-landscape", - sizeof(text)); - break; - } - } - else - snprintf(text, sizeof(text), "%s=%s", options[j].name, - options[j].value); - - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); - } - } - - if (banner->show & SHOW_PRINTER_INFO) - { - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Description: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, - getenv("PRINTER_INFO")); - } - if (banner->show & SHOW_PRINTER_LOCATION) - { - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Location: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, - getenv("PRINTER_LOCATION")); - } - if (banner->show & SHOW_PRINTER_MAKE_AND_MODEL) - { - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Make and Model: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, - ppd ? ppd->nickname : NULL); - } - - if (banner->show & SHOW_PAPER_NAME) - { - if ((option = cupsGetOption("media", num_options, options)) == NULL) - if ((option = cupsGetOption("PageSize", num_options, options)) == NULL) - if ((option = cupsGetOption("PageRegion", num_options, - options)) == NULL) - option = "Default"; - - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Media Name: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, option); - } - if (banner->show & SHOW_PAPER_SIZE) - { - snprintf(text, sizeof(text), - _cupsLangString(language, _("%.2f x %.2f inches")), - PageWidth / 72.0, PageLength / 72.0); - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Media Dimensions: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); - - snprintf(text, sizeof(text), - _cupsLangString(language, _("%.0f x %.0f millimeters")), - PageWidth * 25.4 / 72.0, PageLength * 25.4 / 72.0); - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); - } - if (banner->show & SHOW_IMAGEABLE_AREA) - { - snprintf(text, sizeof(text), - _cupsLangString(language, - _("%.2f x %.2f to %.2f x %.2f inches")), - PageLeft / 72.0, PageBottom / 72.0, - PageRight / 72.0, PageTop / 72.0); - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Media Limits: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); - - snprintf(text, sizeof(text), - _cupsLangString(language, - _("%.0f x %.0f to %.0f x %.0f millimeters")), - PageLeft * 25.4 / 72.0, PageBottom * 25.4 / 72.0, - PageRight * 25.4 / 72.0, PageTop * 25.4 / 72.0); - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); - - printf("gsave 2 setlinewidth 1 1 %.1f %.1f rectstroke grestore\n", - print_width - 2.0, print_height - 2.0); - } - if (banner->show & SHOW_PRINTER_DRIVER_NAME) - { - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Driver Name: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, - ppd ? ppd->pcfilename : NULL); - } - if (banner->show & SHOW_PRINTER_DRIVER_VERSION) - { - ppd_attr_t *file_version = ppdFindAttr(ppd, "FileVersion", NULL); - - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Driver Version: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, - file_version ? file_version->value : NULL); - } - if (banner->show & SHOW_TIME_AT_CREATION) - { - if ((option = cupsGetOption("time-at-creation", num_options, - options)) != NULL) - { - time_t curtime; /* Current time */ - struct tm *curdate; /* Current date */ - - curtime = (time_t)atoi(option); - curdate = localtime(&curtime); - - strftime(text, sizeof(text), "%c", curdate); - } - else - strlcpy(text, "?", sizeof(text)); - - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Created On: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); - } - if (banner->show & SHOW_TIME_AT_PROCESSING) - { - if ((option = cupsGetOption("time-at-processing", num_options, - options)) != NULL) - { - time_t curtime; /* Current time */ - struct tm *curdate; /* Current date */ - - curtime = (time_t)atoi(option); - curdate = localtime(&curtime); - - strftime(text, sizeof(text), "%c", curdate); - } - else - strlcpy(text, "?", sizeof(text)); - - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, - _cupsLangString(language, _("Printed On: "))); - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); - } - } - - /* - * Notices... - */ - - if (cupsArrayCount(banner->notices)) - { - if (banner->show) - y -= 2 * line_height; - - x = 0.5 * print_width; - - for (notice = (char *)cupsArrayFirst(banner->notices); - notice; - notice = (char *)cupsArrayNext(banner->notices)) - { - printf("%.1f %.1f moveto", x, y); - y -= line_height; - psTextUTF8(fonts, fontsize, PS_NORMAL, PS_CENTER, notice); - } - } - - /* - * Images... - */ - - if (cupsArrayCount(images)) - { - if (banner->show || cupsArrayCount(banner->notices)) - y -= 2 * line_height; - - x = 0.5 * (print_width - images_width); - - for (image = (cups_image_t *)cupsArrayFirst(images); - image; - image = (cups_image_t *)cupsArrayNext(images)) - { - float temp_width; /* Width of this image */ - int depth, /* Bytes per pixel */ - num_cols, /* Number of columns */ - row, /* Current row */ - num_rows, /* Number of rows */ - out_length, /* Length of data to write */ - out_offset; /* Offset in line buffer */ - unsigned char *line; /* Data for current row */ - - - depth = cupsImageGetDepth(image); - num_cols = cupsImageGetWidth(image); - num_rows = cupsImageGetHeight(image); - line = malloc(depth * num_cols + 3); - temp_width = num_cols * images_height / num_rows; - - printf("gsave %.1f %.1f translate %.3f %.3f scale\n", x, y, - temp_width / num_cols, images_height / num_rows); - x += temp_width; - - switch (cupsImageGetColorSpace(image)) - { - default : - case CUPS_IMAGE_WHITE : - printf("/DeviceGray setcolorspace" - "<<" - "/ImageType 1" - "/Width %d" - "/Height %d" - "/BitsPerComponent 8" - "/Decode[0 1]\n", - num_cols, num_rows); - break; - - case CUPS_IMAGE_RGB : - printf("/DeviceRGB setcolorspace" - "<<" - "/ImageType 1" - "/Width %d" - "/Height %d" - "/BitsPerComponent 8" - "/Decode[0 1 0 1 0 1]\n", - num_cols, num_rows); - break; - - case CUPS_IMAGE_CMYK : - printf("/DeviceCMYK setcolorspace" - "<<" - "/ImageType 1" - "/Width %d" - "/Height %d" - "/BitsPerComponent 8" - "/Decode[0 1 0 1 0 1 0 1]\n", - num_cols, num_rows); - break; - } - - puts("/DataSource currentfile" - "/ASCII85Decode filter" - "/ImageMatrix[1 0 0 -1 0 1]>>image"); - - for (row = 0, out_offset = 0; row < num_rows; row ++) - { - cupsImageGetRow(image, 0, row, num_cols, line + out_offset); - - out_length = num_cols * depth + out_offset; - out_offset = out_length & 3; - - ps_ascii85(line, out_length, row == (num_rows - 1)); - - if (out_offset > 0) - memcpy(line, line + out_length - out_offset, out_offset); - } - - puts("grestore"); - - if (i == num_pages) - cupsImageClose(image); - - free(line); - } - } - - /* - * Header and footer... - */ - - x = 0.5 * print_width; - - if (banner->header) - { - printf("%.1f %.1f moveto", x, print_height - 2 * fontsize); - psTextUTF8(fonts, 2 * fontsize, PS_BOLD, PS_CENTER, banner->header); - } - - if (banner->footer) - { - printf("%.1f %.1f moveto", x, fontsize); - psTextUTF8(fonts, 2 * fontsize, PS_BOLD, PS_CENTER, banner->footer); - } - - /* - * Show the page... - */ - - puts("grestore"); - puts("showpage"); - } - - return (num_pages); -} - - -/* - * 'write_epilogue()' - Write the PostScript file epilogue. - */ - -static void -write_epilogue(int num_pages) /* I - Number of pages */ -{ - puts("%%Trailer"); - printf("%%%%Pages: %d\n", num_pages); - puts("%%EOF"); -} - - -/* - * 'write_prolog()' - Write the PostScript file prolog with options. - */ - -ps_text_t * /* O - Fonts */ -write_prolog(const char *title, /* I - Title of job */ - const char *username) /* I - Username */ -{ - time_t curtime; /* Current time */ - struct tm *curtm; /* Current date */ - char curdate[255]; /* Current date (text format) */ - ps_text_t *fonts; /* Fonts */ - - - /* - * Get the fonts we'll need... - */ - - fonts = psTextInitialize(); - - /* - * Output the DSC header... - */ - - curtime = time(NULL); - curtm = localtime(&curtime); - strftime(curdate, sizeof(curdate), "%c", curtm); - - puts("%!PS-Adobe-3.0"); - printf("%%%%BoundingBox: %.0f %.0f %.0f %.0f\n", PageLeft, PageBottom, - PageRight, PageTop); - printf("%%cupsRotation: %d\n", (Orientation & 3) * 90); - puts("%%Creator: bannertops/" CUPS_SVERSION); - printf("%%%%CreationDate: %s\n", curdate); - puts("%%LanguageLevel: 2"); - puts("%%DocumentData: Clean7Bit"); - WriteTextComment("Title", title); - WriteTextComment("For", username); - printf("%%%%Pages: %d\n", Duplex ? 2 : 1); - psTextListFonts(fonts); - puts("%%EndComments"); - puts("%%BeginProlog"); - psTextEmbedFonts(fonts); - puts("%%EndProlog"); - - return (fonts); -} - - -/* - * End of "$Id$". - */ diff --git a/filter/error.c b/filter/error.c index 8a00964a8..a73186926 100644 --- a/filter/error.c +++ b/filter/error.c @@ -28,8 +28,7 @@ * Include necessary headers... */ -#include "image-private.h" -#include +#include /* diff --git a/filter/image-bmp.c b/filter/image-bmp.c deleted file mode 100644 index b93c1c500..000000000 --- a/filter/image-bmp.c +++ /dev/null @@ -1,545 +0,0 @@ -/* - * "$Id: image-bmp.c 7221 2008-01-16 22:20:08Z mike $" - * - * BMP image routines for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2007 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * _cupsImageReadBMP() - Read a BMP image file. - * read_word() - Read a 16-bit unsigned integer. - * read_dword() - Read a 32-bit unsigned integer. - * read_long() - Read a 32-bit signed integer. - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" - - -/* - * Constants for the bitmap compression... - */ - -# define BI_RGB 0 /* No compression - straight BGR data */ -# define BI_RLE8 1 /* 8-bit run-length compression */ -# define BI_RLE4 2 /* 4-bit run-length compression */ -# define BI_BITFIELDS 3 /* RGB bitmap with RGB masks */ - - -/* - * Local functions... - */ - -static unsigned short read_word(FILE *fp); -static unsigned int read_dword(FILE *fp); -static int read_long(FILE *fp); - - -/* - * '_cupsImageReadBMP()' - Read a BMP image file. - */ - -int /* O - Read status */ -_cupsImageReadBMP( - cups_image_t *img, /* IO - cupsImage */ - FILE *fp, /* I - cupsImage file */ - cups_icspace_t primary, /* I - Primary choice for colorspace */ - cups_icspace_t secondary, /* I - Secondary choice for colorspace */ - int saturation, /* I - Color saturation (%) */ - int hue, /* I - Color hue (degrees) */ - const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ -{ - int offset, /* Offset to bitmap data */ - info_size, /* Size of info header */ - planes, /* Number of planes (always 1) */ - depth, /* Depth of image (bits) */ - compression, /* Type of compression */ - image_size, /* Size of image in bytes */ - colors_used, /* Number of colors used */ - colors_important, /* Number of important colors */ - bpp, /* Bytes per pixel */ - x, y, /* Looping vars */ - color, /* Color of RLE pixel */ - count, /* Number of times to repeat */ - temp, /* Temporary color */ - align; /* Alignment bytes */ - cups_ib_t bit, /* Bit in image */ - byte; /* Byte in image */ - cups_ib_t *in, /* Input pixels */ - *out, /* Output pixels */ - *ptr; /* Pointer into pixels */ - cups_ib_t colormap[256][4]; /* Colormap */ - - - (void)secondary; - - /* - * Get the header... - */ - - getc(fp); /* Skip "BM" sync chars */ - getc(fp); - read_dword(fp); /* Skip size */ - read_word(fp); /* Skip reserved stuff */ - read_word(fp); - offset = read_dword(fp); - - fprintf(stderr, "DEBUG: offset = %d\n", offset); - - if (offset < 0) - { - fprintf(stderr, "DEBUG: Bad BMP offset %d\n", offset); - fclose(fp); - return (1); - } - - /* - * Then the bitmap information... - */ - - info_size = read_dword(fp); - img->xsize = read_long(fp); - img->ysize = read_long(fp); - planes = read_word(fp); - depth = read_word(fp); - compression = read_dword(fp); - image_size = read_dword(fp); - img->xppi = read_long(fp) * 0.0254 + 0.5; - img->yppi = read_long(fp) * 0.0254 + 0.5; - colors_used = read_dword(fp); - colors_important = read_dword(fp); - - if (img->xsize == 0 || img->xsize > CUPS_IMAGE_MAX_WIDTH || - img->ysize == 0 || img->ysize > CUPS_IMAGE_MAX_HEIGHT || - (depth != 1 && depth != 4 && depth != 8 && depth != 24)) - { - fprintf(stderr, "DEBUG: Bad BMP dimensions %ux%ux%d\n", - img->xsize, img->ysize, depth); - fclose(fp); - return (1); - } - - if (colors_used < 0 || colors_used > 256) - { - fprintf(stderr, "DEBUG: Bad BMP colormap size %d\n", colors_used); - fclose(fp); - return (1); - } - - if (img->xppi == 0 || img->yppi == 0) - { - fprintf(stderr, "DEBUG: Bad BMP resolution %dx%d PPI.\n", - img->xppi, img->yppi); - img->xppi = img->yppi = 128; - } - - /* - * Make sure the resolution info is valid... - */ - - fprintf(stderr, "info_size = %d, xsize = %d, ysize = %d, planes = %d, depth = %d\n", - info_size, img->xsize, img->ysize, planes, depth); - fprintf(stderr, "compression = %d, image_size = %d, xppi = %d, yppi = %d\n", - compression, image_size, img->xppi, img->yppi); - fprintf(stderr, "colors_used = %d, colors_important = %d\n", colors_used, - colors_important); - - if (info_size > 40) - for (info_size -= 40; info_size > 0; info_size --) - getc(fp); - - /* - * Get colormap... - */ - - if (colors_used == 0 && depth <= 8) - colors_used = 1 << depth; - - if (colors_used > 0) - fread(colormap, colors_used, 4, fp); - else - memset(colormap, 0, sizeof(colormap)); - - /* - * Setup image and buffers... - */ - - img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; - - cupsImageSetMaxTiles(img, 0); - - bpp = cupsImageGetDepth(img); - - if ((in = malloc(img->xsize * 3)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - fclose(fp); - return (1); - } - - if ((out = malloc(img->xsize * bpp)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - free(in); - fclose(fp); - return (1); - } - - /* - * Read the image data... - */ - - color = 0; - count = 0; - align = 0; - - for (y = img->ysize - 1; y >= 0; y --) - { - ptr = in; - - switch (depth) - { - case 1 : /* Bitmap */ - for (x = img->xsize, bit = 128, byte = 0; x > 0; x --) - { - if (bit == 128) - byte = getc(fp); - - if (byte & bit) - { - *ptr++ = colormap[1][2]; - *ptr++ = colormap[1][1]; - *ptr++ = colormap[1][0]; - } - else - { - *ptr++ = colormap[0][2]; - *ptr++ = colormap[0][1]; - *ptr++ = colormap[0][0]; - } - - if (bit > 1) - bit >>= 1; - else - bit = 128; - } - - /* - * Read remaining bytes to align to 32 bits... - */ - - for (temp = (img->xsize + 7) / 8; temp & 3; temp ++) - getc(fp); - break; - - case 4 : /* 16-color */ - for (x = img->xsize, bit = 0xf0, temp = 0; x > 0; x --) - { - /* - * Get a new count as needed... - */ - - if (compression != BI_RLE4 && count == 0) - { - count = 2; - color = -1; - } - - if (count == 0) - { - while (align > 0) - { - align --; - getc(fp); - } - - if ((count = getc(fp)) == 0) - { - if ((count = getc(fp)) == 0) - { - /* - * End of line... - */ - - x ++; - continue; - } - else if (count == 1) - { - /* - * End of image... - */ - - break; - } - else if (count == 2) - { - /* - * Delta... - */ - - count = getc(fp) * getc(fp) * img->xsize; - color = 0; - } - else - { - /* - * Absolute... - */ - - color = -1; - align = ((4 - (count & 3)) / 2) & 1; - } - } - else - color = getc(fp); - } - - /* - * Get a new color as needed... - */ - - count --; - - if (bit == 0xf0) - { - if (color < 0) - temp = getc(fp); - else - temp = color; - - /* - * Copy the color value... - */ - - *ptr++ = colormap[temp >> 4][2]; - *ptr++ = colormap[temp >> 4][1]; - *ptr++ = colormap[temp >> 4][0]; - bit = 0x0f; - } - else - { - /* - * Copy the color value... - */ - - *ptr++ = colormap[temp & 15][2]; - *ptr++ = colormap[temp & 15][1]; - *ptr++ = colormap[temp & 15][0]; - bit = 0xf0; - } - } - break; - - case 8 : /* 256-color */ - for (x = img->xsize; x > 0; x --) - { - /* - * Get a new count as needed... - */ - - if (compression != BI_RLE8) - { - count = 1; - color = -1; - } - - if (count == 0) - { - while (align > 0) - { - align --; - getc(fp); - } - - if ((count = getc(fp)) == 0) - { - if ((count = getc(fp)) == 0) - { - /* - * End of line... - */ - - x ++; - continue; - } - else if (count == 1) - { - /* - * End of image... - */ - - break; - } - else if (count == 2) - { - /* - * Delta... - */ - - count = getc(fp) * getc(fp) * img->xsize; - color = 0; - } - else - { - /* - * Absolute... - */ - - color = -1; - align = (2 - (count & 1)) & 1; - } - } - else - color = getc(fp); - } - - /* - * Get a new color as needed... - */ - - if (color < 0) - temp = getc(fp); - else - temp = color; - - count --; - - /* - * Copy the color value... - */ - - *ptr++ = colormap[temp][2]; - *ptr++ = colormap[temp][1]; - *ptr++ = colormap[temp][0]; - } - break; - - case 24 : /* 24-bit RGB */ - for (x = img->xsize; x > 0; x --, ptr += 3) - { - ptr[2] = getc(fp); - ptr[1] = getc(fp); - ptr[0] = getc(fp); - } - - /* - * Read remaining bytes to align to 32 bits... - */ - - for (temp = img->xsize * 3; temp & 3; temp ++) - getc(fp); - break; - } - - if (saturation != 100 || hue != 0) - cupsImageRGBAdjust(in, img->xsize, saturation, hue); - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->xsize); - break; - - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(in, out, img->xsize); - break; - - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->xsize); - break; - - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->xsize); - break; - - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * bpp, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - } - - fclose(fp); - free(in); - free(out); - - return (0); -} - - -/* - * 'read_word()' - Read a 16-bit unsigned integer. - */ - -static unsigned short /* O - 16-bit unsigned integer */ -read_word(FILE *fp) /* I - File to read from */ -{ - unsigned char b0, b1; /* Bytes from file */ - - b0 = getc(fp); - b1 = getc(fp); - - return ((b1 << 8) | b0); -} - - -/* - * 'read_dword()' - Read a 32-bit unsigned integer. - */ - -static unsigned int /* O - 32-bit unsigned integer */ -read_dword(FILE *fp) /* I - File to read from */ -{ - unsigned char b0, b1, b2, b3; /* Bytes from file */ - - b0 = getc(fp); - b1 = getc(fp); - b2 = getc(fp); - b3 = getc(fp); - - return ((((((b3 << 8) | b2) << 8) | b1) << 8) | b0); -} - - -/* - * 'read_long()' - Read a 32-bit signed integer. - */ - -static int /* O - 32-bit signed integer */ -read_long(FILE *fp) /* I - File to read from */ -{ - unsigned char b0, b1, b2, b3; /* Bytes from file */ - - b0 = getc(fp); - b1 = getc(fp); - b2 = getc(fp); - b3 = getc(fp); - - return ((int)(((((b3 << 8) | b2) << 8) | b1) << 8) | b0); -} - - -/* - * End of "$Id: image-bmp.c 7221 2008-01-16 22:20:08Z mike $". - */ diff --git a/filter/image-colorspace.c b/filter/image-colorspace.c deleted file mode 100644 index 8c25568d5..000000000 --- a/filter/image-colorspace.c +++ /dev/null @@ -1,1567 +0,0 @@ -/* - * "$Id: image-colorspace.c 7720 2008-07-11 22:46:21Z mike $" - * - * Colorspace conversions for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2006 by Easy Software Products. - * - * The color saturation/hue matrix stuff is provided thanks to Mr. Paul - * Haeberli at "http://www.sgi.com/grafica/matrix/index.html". - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * cupsImageCMYKToBlack() - Convert CMYK data to black. - * cupsImageCMYKToCMY() - Convert CMYK colors to CMY. - * cupsImageCMYKToCMYK() - Convert CMYK colors to CMYK. - * cupsImageCMYKToRGB() - Convert CMYK colors to device-dependent - * RGB. - * cupsImageCMYKToWhite() - Convert CMYK colors to luminance. - * cupsImageLut() - Adjust all pixel values with the given - * LUT. - * cupsImageRGBAdjust() - Adjust the hue and saturation of the - * given RGB colors. - * cupsImageRGBToBlack() - Convert RGB data to black. - * cupsImageRGBToCMY() - Convert RGB colors to CMY. - * cupsImageRGBToCMYK() - Convert RGB colors to CMYK. - * cupsImageRGBToRGB() - Convert RGB colors to device-dependent - * RGB. - * cupsImageRGBToWhite() - Convert RGB colors to luminance. - * cupsImageSetProfile() - Set the device color profile. - * cupsImageSetRasterColorSpace() - Set the destination colorspace. - * cupsImageWhiteToBlack() - Convert luminance colors to black. - * cupsImageWhiteToCMY() - Convert luminance colors to CMY. - * cupsImageWhiteToCMYK() - Convert luminance colors to CMYK. - * cupsImageWhiteToRGB() - Convert luminance data to RGB. - * cupsImageWhiteToWhite() - Convert luminance colors to device- - * dependent luminance. - * cielab() - Map CIE Lab transformation... - * huerotate() - Rotate the hue, maintaining luminance. - * ident() - Make an identity matrix. - * mult() - Multiply two matrices. - * rgb_to_lab() - Convert an RGB color to CIE Lab. - * rgb_to_xyz() - Convert an RGB color to CIE XYZ. - * saturate() - Make a saturation matrix. - * xform() - Transform a 3D point using a matrix... - * xrotate() - Rotate about the x (red) axis... - * yrotate() - Rotate about the y (green) axis... - * zrotate() - Rotate about the z (blue) axis... - * zshear() - Shear z using x and y... - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" - - -/* - * Define some math constants that are required... - */ - -#ifndef M_PI -# define M_PI 3.14159265358979323846 -#endif /* !M_PI */ - -#ifndef M_SQRT2 -# define M_SQRT2 1.41421356237309504880 -#endif /* !M_SQRT2 */ - -#ifndef M_SQRT1_2 -# define M_SQRT1_2 0.70710678118654752440 -#endif /* !M_SQRT1_2 */ - -/* - * CIE XYZ whitepoint... - */ - -#define D65_X (0.412453 + 0.357580 + 0.180423) -#define D65_Y (0.212671 + 0.715160 + 0.072169) -#define D65_Z (0.019334 + 0.119193 + 0.950227) - - -/* - * Lookup table structure... - */ - -typedef int cups_clut_t[3][256]; - - -/* - * Local globals... - */ - -static int cupsImageHaveProfile = 0; - /* Do we have a color profile? */ -static int *cupsImageDensity; - /* Ink/marker density LUT */ -static cups_clut_t *cupsImageMatrix; - /* Color transform matrix LUT */ -static cups_cspace_t cupsImageColorSpace = CUPS_CSPACE_RGB; - /* Destination colorspace */ - - -/* - * Local functions... - */ - -static float cielab(float x, float xn); -static void huerotate(float [3][3], float); -static void ident(float [3][3]); -static void mult(float [3][3], float [3][3], float [3][3]); -static void rgb_to_lab(cups_ib_t *val); -static void rgb_to_xyz(cups_ib_t *val); -static void saturate(float [3][3], float); -static void xform(float [3][3], float, float, float, float *, float *, float *); -static void xrotate(float [3][3], float, float); -static void yrotate(float [3][3], float, float); -static void zrotate(float [3][3], float, float); -static void zshear(float [3][3], float, float); - - -/* - * 'cupsImageCMYKToBlack()' - Convert CMYK data to black. - */ - -void -cupsImageCMYKToBlack( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - int k; /* Black value */ - - - if (cupsImageHaveProfile) - while (count > 0) - { - k = (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100 + in[3]; - - if (k < 255) - *out++ = cupsImageDensity[k]; - else - *out++ = cupsImageDensity[255]; - - in += 4; - count --; - } - else - while (count > 0) - { - k = (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100 + in[3]; - - if (k < 255) - *out++ = k; - else - *out++ = 255; - - in += 4; - count --; - } -} - - -/* - * 'cupsImageCMYKToCMY()' - Convert CMYK colors to CMY. - */ - -void -cupsImageCMYKToCMY( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - int c, m, y, k; /* CMYK values */ - int cc, cm, cy; /* Calibrated CMY values */ - - - if (cupsImageHaveProfile) - while (count > 0) - { - c = *in++; - m = *in++; - y = *in++; - k = *in++; - - cc = cupsImageMatrix[0][0][c] + - cupsImageMatrix[0][1][m] + - cupsImageMatrix[0][2][y] + k; - cm = cupsImageMatrix[1][0][c] + - cupsImageMatrix[1][1][m] + - cupsImageMatrix[1][2][y] + k; - cy = cupsImageMatrix[2][0][c] + - cupsImageMatrix[2][1][m] + - cupsImageMatrix[2][2][y] + k; - - if (cc < 0) - *out++ = 0; - else if (cc > 255) - *out++ = cupsImageDensity[255]; - else - *out++ = cupsImageDensity[cc]; - - if (cm < 0) - *out++ = 0; - else if (cm > 255) - *out++ = cupsImageDensity[255]; - else - *out++ = cupsImageDensity[cm]; - - if (cy < 0) - *out++ = 0; - else if (cy > 255) - *out++ = cupsImageDensity[255]; - else - *out++ = cupsImageDensity[cy]; - - count --; - } - else - while (count > 0) - { - c = *in++; - m = *in++; - y = *in++; - k = *in++; - - c += k; - m += k; - y += k; - - if (c < 255) - *out++ = c; - else - *out++ = 255; - - if (m < 255) - *out++ = y; - else - *out++ = 255; - - if (y < 255) - *out++ = y; - else - *out++ = 255; - - count --; - } -} - - -/* - * 'cupsImageCMYKToCMYK()' - Convert CMYK colors to CMYK. - */ - -void -cupsImageCMYKToCMYK( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - int c, m, y, k; /* CMYK values */ - int cc, cm, cy; /* Calibrated CMY values */ - - - if (cupsImageHaveProfile) - while (count > 0) - { - c = *in++; - m = *in++; - y = *in++; - k = *in++; - - cc = (cupsImageMatrix[0][0][c] + - cupsImageMatrix[0][1][m] + - cupsImageMatrix[0][2][y]); - cm = (cupsImageMatrix[1][0][c] + - cupsImageMatrix[1][1][m] + - cupsImageMatrix[1][2][y]); - cy = (cupsImageMatrix[2][0][c] + - cupsImageMatrix[2][1][m] + - cupsImageMatrix[2][2][y]); - - if (cc < 0) - *out++ = 0; - else if (cc > 255) - *out++ = cupsImageDensity[255]; - else - *out++ = cupsImageDensity[cc]; - - if (cm < 0) - *out++ = 0; - else if (cm > 255) - *out++ = cupsImageDensity[255]; - else - *out++ = cupsImageDensity[cm]; - - if (cy < 0) - *out++ = 0; - else if (cy > 255) - *out++ = cupsImageDensity[255]; - else - *out++ = cupsImageDensity[cy]; - - *out++ = cupsImageDensity[k]; - - count --; - } - else if (in != out) - { - while (count > 0) - { - *out++ = *in++; - *out++ = *in++; - *out++ = *in++; - *out++ = *in++; - - count --; - } - } -} - - -/* - * 'cupsImageCMYKToRGB()' - Convert CMYK colors to device-dependent RGB. - */ - -void -cupsImageCMYKToRGB( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - int c, m, y, k; /* CMYK values */ - int cr, cg, cb; /* Calibrated RGB values */ - - - if (cupsImageHaveProfile) - { - while (count > 0) - { - c = *in++; - m = *in++; - y = *in++; - k = *in++; - - cr = cupsImageMatrix[0][0][c] + - cupsImageMatrix[0][1][m] + - cupsImageMatrix[0][2][y] + k; - cg = cupsImageMatrix[1][0][c] + - cupsImageMatrix[1][1][m] + - cupsImageMatrix[1][2][y] + k; - cb = cupsImageMatrix[2][0][c] + - cupsImageMatrix[2][1][m] + - cupsImageMatrix[2][2][y] + k; - - if (cr < 0) - *out++ = 255; - else if (cr > 255) - *out++ = 255 - cupsImageDensity[255]; - else - *out++ = 255 - cupsImageDensity[cr]; - - if (cg < 0) - *out++ = 255; - else if (cg > 255) - *out++ = 255 - cupsImageDensity[255]; - else - *out++ = 255 - cupsImageDensity[cg]; - - if (cb < 0) - *out++ = 255; - else if (cb > 255) - *out++ = 255 - cupsImageDensity[255]; - else - *out++ = 255 - cupsImageDensity[cb]; - - count --; - } - } - else - { - while (count > 0) - { - c = 255 - *in++; - m = 255 - *in++; - y = 255 - *in++; - k = *in++; - - c -= k; - m -= k; - y -= k; - - if (c > 0) - *out++ = c; - else - *out++ = 0; - - if (m > 0) - *out++ = m; - else - *out++ = 0; - - if (y > 0) - *out++ = y; - else - *out++ = 0; - - if (cupsImageColorSpace == CUPS_CSPACE_CIELab || - cupsImageColorSpace >= CUPS_CSPACE_ICC1) - rgb_to_lab(out - 3); - else if (cupsImageColorSpace == CUPS_CSPACE_CIEXYZ) - rgb_to_xyz(out - 3); - - count --; - } - } -} - - -/* - * 'cupsImageCMYKToWhite()' - Convert CMYK colors to luminance. - */ - -void -cupsImageCMYKToWhite( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - int w; /* White value */ - - - if (cupsImageHaveProfile) - { - while (count > 0) - { - w = 255 - (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100 - in[3]; - - if (w > 0) - *out++ = cupsImageDensity[w]; - else - *out++ = cupsImageDensity[0]; - - in += 4; - count --; - } - } - else - { - while (count > 0) - { - w = 255 - (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100 - in[3]; - - if (w > 0) - *out++ = w; - else - *out++ = 0; - - in += 4; - count --; - } - } -} - - -/* - * 'cupsImageLut()' - Adjust all pixel values with the given LUT. - */ - -void -cupsImageLut(cups_ib_t *pixels, /* IO - Input/output pixels */ - int count, /* I - Number of pixels/bytes to adjust */ - const cups_ib_t *lut) /* I - Lookup table */ -{ - while (count > 0) - { - *pixels = lut[*pixels]; - pixels ++; - count --; - } -} - - -/* - * 'cupsImageRGBAdjust()' - Adjust the hue and saturation of the given RGB colors. - */ - -void -cupsImageRGBAdjust(cups_ib_t *pixels, /* IO - Input/output pixels */ - int count, /* I - Number of pixels to adjust */ - int saturation,/* I - Color saturation (%) */ - int hue) /* I - Color hue (degrees) */ -{ - int i, j, k; /* Looping vars */ - float mat[3][3]; /* Color adjustment matrix */ - static int last_sat = 100, /* Last saturation used */ - last_hue = 0; /* Last hue used */ - static cups_clut_t *lut = NULL; /* Lookup table for matrix */ - - - if (saturation != last_sat || hue != last_hue || !lut) - { - /* - * Build the color adjustment matrix... - */ - - ident(mat); - saturate(mat, saturation * 0.01); - huerotate(mat, (float)hue); - - /* - * Allocate memory for the lookup table... - */ - - if (lut == NULL) - lut = calloc(3, sizeof(cups_clut_t)); - - if (lut == NULL) - return; - - /* - * Convert the matrix into a 3x3 array of lookup tables... - */ - - for (i = 0; i < 3; i ++) - for (j = 0; j < 3; j ++) - for (k = 0; k < 256; k ++) - lut[i][j][k] = mat[i][j] * k + 0.5; - - /* - * Save the saturation and hue to compare later... - */ - - last_sat = saturation; - last_hue = hue; - } - - /* - * Adjust each pixel in the given buffer. - */ - - while (count > 0) - { - i = lut[0][0][pixels[0]] + - lut[1][0][pixels[1]] + - lut[2][0][pixels[2]]; - if (i < 0) - pixels[0] = 0; - else if (i > 255) - pixels[0] = 255; - else - pixels[0] = i; - - i = lut[0][1][pixels[0]] + - lut[1][1][pixels[1]] + - lut[2][1][pixels[2]]; - if (i < 0) - pixels[1] = 0; - else if (i > 255) - pixels[1] = 255; - else - pixels[1] = i; - - i = lut[0][2][pixels[0]] + - lut[1][2][pixels[1]] + - lut[2][2][pixels[2]]; - if (i < 0) - pixels[2] = 0; - else if (i > 255) - pixels[2] = 255; - else - pixels[2] = i; - - count --; - pixels += 3; - } -} - - -/* - * 'cupsImageRGBToBlack()' - Convert RGB data to black. - */ - -void -cupsImageRGBToBlack( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - if (cupsImageHaveProfile) - while (count > 0) - { - *out++ = cupsImageDensity[255 - (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100]; - in += 3; - count --; - } - else - while (count > 0) - { - *out++ = 255 - (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100; - in += 3; - count --; - } -} - - -/* - * 'cupsImageRGBToCMY()' - Convert RGB colors to CMY. - */ - -void -cupsImageRGBToCMY( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - int c, m, y, k; /* CMYK values */ - int cc, cm, cy; /* Calibrated CMY values */ - - - if (cupsImageHaveProfile) - while (count > 0) - { - c = 255 - *in++; - m = 255 - *in++; - y = 255 - *in++; - k = min(c, min(m, y)); - c -= k; - m -= k; - y -= k; - - cc = cupsImageMatrix[0][0][c] + - cupsImageMatrix[0][1][m] + - cupsImageMatrix[0][2][y] + k; - cm = cupsImageMatrix[1][0][c] + - cupsImageMatrix[1][1][m] + - cupsImageMatrix[1][2][y] + k; - cy = cupsImageMatrix[2][0][c] + - cupsImageMatrix[2][1][m] + - cupsImageMatrix[2][2][y] + k; - - if (cc < 0) - *out++ = 0; - else if (cc > 255) - *out++ = cupsImageDensity[255]; - else - *out++ = cupsImageDensity[cc]; - - if (cm < 0) - *out++ = 0; - else if (cm > 255) - *out++ = cupsImageDensity[255]; - else - *out++ = cupsImageDensity[cm]; - - if (cy < 0) - *out++ = 0; - else if (cy > 255) - *out++ = cupsImageDensity[255]; - else - *out++ = cupsImageDensity[cy]; - - count --; - } - else - while (count > 0) - { - c = 255 - in[0]; - m = 255 - in[1]; - y = 255 - in[2]; - k = min(c, min(m, y)); - - *out++ = (255 - in[1] / 4) * (c - k) / 255 + k; - *out++ = (255 - in[2] / 4) * (m - k) / 255 + k; - *out++ = (255 - in[0] / 4) * (y - k) / 255 + k; - in += 3; - count --; - } -} - - -/* - * 'cupsImageRGBToCMYK()' - Convert RGB colors to CMYK. - */ - -void -cupsImageRGBToCMYK( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - int c, m, y, k, /* CMYK values */ - km; /* Maximum K value */ - int cc, cm, cy; /* Calibrated CMY values */ - - - if (cupsImageHaveProfile) - while (count > 0) - { - c = 255 - *in++; - m = 255 - *in++; - y = 255 - *in++; - k = min(c, min(m, y)); - - if ((km = max(c, max(m, y))) > k) - k = k * k * k / (km * km); - - c -= k; - m -= k; - y -= k; - - cc = (cupsImageMatrix[0][0][c] + - cupsImageMatrix[0][1][m] + - cupsImageMatrix[0][2][y]); - cm = (cupsImageMatrix[1][0][c] + - cupsImageMatrix[1][1][m] + - cupsImageMatrix[1][2][y]); - cy = (cupsImageMatrix[2][0][c] + - cupsImageMatrix[2][1][m] + - cupsImageMatrix[2][2][y]); - - if (cc < 0) - *out++ = 0; - else if (cc > 255) - *out++ = cupsImageDensity[255]; - else - *out++ = cupsImageDensity[cc]; - - if (cm < 0) - *out++ = 0; - else if (cm > 255) - *out++ = cupsImageDensity[255]; - else - *out++ = cupsImageDensity[cm]; - - if (cy < 0) - *out++ = 0; - else if (cy > 255) - *out++ = cupsImageDensity[255]; - else - *out++ = cupsImageDensity[cy]; - - *out++ = cupsImageDensity[k]; - - count --; - } - else - while (count > 0) - { - c = 255 - *in++; - m = 255 - *in++; - y = 255 - *in++; - k = min(c, min(m, y)); - - if ((km = max(c, max(m, y))) > k) - k = k * k * k / (km * km); - - c -= k; - m -= k; - y -= k; - - *out++ = c; - *out++ = m; - *out++ = y; - *out++ = k; - - count --; - } -} - - -/* - * 'cupsImageRGBToRGB()' - Convert RGB colors to device-dependent RGB. - */ - -void -cupsImageRGBToRGB( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - int c, m, y, k; /* CMYK values */ - int cr, cg, cb; /* Calibrated RGB values */ - - - if (cupsImageHaveProfile) - { - while (count > 0) - { - c = 255 - *in++; - m = 255 - *in++; - y = 255 - *in++; - k = min(c, min(m, y)); - c -= k; - m -= k; - y -= k; - - cr = cupsImageMatrix[0][0][c] + - cupsImageMatrix[0][1][m] + - cupsImageMatrix[0][2][y] + k; - cg = cupsImageMatrix[1][0][c] + - cupsImageMatrix[1][1][m] + - cupsImageMatrix[1][2][y] + k; - cb = cupsImageMatrix[2][0][c] + - cupsImageMatrix[2][1][m] + - cupsImageMatrix[2][2][y] + k; - - if (cr < 0) - *out++ = 255; - else if (cr > 255) - *out++ = 255 - cupsImageDensity[255]; - else - *out++ = 255 - cupsImageDensity[cr]; - - if (cg < 0) - *out++ = 255; - else if (cg > 255) - *out++ = 255 - cupsImageDensity[255]; - else - *out++ = 255 - cupsImageDensity[cg]; - - if (cb < 0) - *out++ = 255; - else if (cb > 255) - *out++ = 255 - cupsImageDensity[255]; - else - *out++ = 255 - cupsImageDensity[cb]; - - count --; - } - } - else - { - if (in != out) - memcpy(out, in, count * 3); - - if (cupsImageColorSpace == CUPS_CSPACE_CIELab || - cupsImageColorSpace >= CUPS_CSPACE_ICC1) - { - while (count > 0) - { - rgb_to_lab(out); - - out += 3; - count --; - } - } - else if (cupsImageColorSpace == CUPS_CSPACE_CIEXYZ) - { - while (count > 0) - { - rgb_to_xyz(out); - - out += 3; - count --; - } - } - } -} - - -/* - * 'cupsImageRGBToWhite()' - Convert RGB colors to luminance. - */ - -void -cupsImageRGBToWhite( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - if (cupsImageHaveProfile) - { - while (count > 0) - { - *out++ = 255 - cupsImageDensity[255 - (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100]; - in += 3; - count --; - } - } - else - { - while (count > 0) - { - *out++ = (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100; - in += 3; - count --; - } - } -} - - -/* - * 'cupsImageSetProfile()' - Set the device color profile. - */ - -void -cupsImageSetProfile(float d, /* I - Ink/marker density */ - float g, /* I - Ink/marker gamma */ - float matrix[3][3]) /* I - Color transform matrix */ -{ - int i, j, k; /* Looping vars */ - float m; /* Current matrix value */ - int *im; /* Pointer into cupsImageMatrix */ - - - /* - * Allocate memory for the profile data... - */ - - if (cupsImageMatrix == NULL) - cupsImageMatrix = calloc(3, sizeof(cups_clut_t)); - - if (cupsImageMatrix == NULL) - return; - - if (cupsImageDensity == NULL) - cupsImageDensity = calloc(256, sizeof(int)); - - if (cupsImageDensity == NULL) - return; - - /* - * Populate the profile lookup tables... - */ - - cupsImageHaveProfile = 1; - - for (i = 0, im = cupsImageMatrix[0][0]; i < 3; i ++) - for (j = 0; j < 3; j ++) - for (k = 0, m = matrix[i][j]; k < 256; k ++) - *im++ = (int)(k * m + 0.5); - - for (k = 0, im = cupsImageDensity; k < 256; k ++) - *im++ = 255.0 * d * pow((float)k / 255.0, g) + 0.5; -} - - -/* - * 'cupsImageSetRasterColorSpace()' - Set the destination colorspace. - */ - -void -cupsImageSetRasterColorSpace( - cups_cspace_t cs) /* I - Destination colorspace */ -{ - /* - * Set the destination colorspace... - */ - - cupsImageColorSpace = cs; - - /* - * Don't use color profiles in colorimetric colorspaces... - */ - - if (cs == CUPS_CSPACE_CIEXYZ || - cs == CUPS_CSPACE_CIELab || - cs >= CUPS_CSPACE_ICC1) - cupsImageHaveProfile = 0; -} - - -/* - * 'cupsImageWhiteToBlack()' - Convert luminance colors to black. - */ - -void -cupsImageWhiteToBlack( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - if (cupsImageHaveProfile) - while (count > 0) - { - *out++ = cupsImageDensity[255 - *in++]; - count --; - } - else - while (count > 0) - { - *out++ = 255 - *in++; - count --; - } -} - - -/* - * 'cupsImageWhiteToCMY()' - Convert luminance colors to CMY. - */ - -void -cupsImageWhiteToCMY( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - if (cupsImageHaveProfile) - while (count > 0) - { - out[0] = cupsImageDensity[255 - *in++]; - out[1] = out[0]; - out[2] = out[0]; - out += 3; - count --; - } - else - while (count > 0) - { - *out++ = 255 - *in; - *out++ = 255 - *in; - *out++ = 255 - *in++; - count --; - } -} - - -/* - * 'cupsImageWhiteToCMYK()' - Convert luminance colors to CMYK. - */ - -void -cupsImageWhiteToCMYK( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - if (cupsImageHaveProfile) - while (count > 0) - { - *out++ = 0; - *out++ = 0; - *out++ = 0; - *out++ = cupsImageDensity[255 - *in++]; - count --; - } - else - while (count > 0) - { - *out++ = 0; - *out++ = 0; - *out++ = 0; - *out++ = 255 - *in++; - count --; - } -} - - -/* - * 'cupsImageWhiteToRGB()' - Convert luminance data to RGB. - */ - -void -cupsImageWhiteToRGB( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - if (cupsImageHaveProfile) - { - while (count > 0) - { - out[0] = 255 - cupsImageDensity[255 - *in++]; - out[1] = out[0]; - out[2] = out[0]; - out += 3; - count --; - } - } - else - { - while (count > 0) - { - *out++ = *in; - *out++ = *in; - *out++ = *in++; - - if (cupsImageColorSpace == CUPS_CSPACE_CIELab || - cupsImageColorSpace >= CUPS_CSPACE_ICC1) - rgb_to_lab(out - 3); - else if (cupsImageColorSpace == CUPS_CSPACE_CIEXYZ) - rgb_to_xyz(out - 3); - - count --; - } - } -} - - -/* - * 'cupsImageWhiteToWhite()' - Convert luminance colors to device-dependent - * luminance. - */ - -void -cupsImageWhiteToWhite( - const cups_ib_t *in, /* I - Input pixels */ - cups_ib_t *out, /* I - Output pixels */ - int count) /* I - Number of pixels */ -{ - if (cupsImageHaveProfile) - while (count > 0) - { - *out++ = 255 - cupsImageDensity[255 - *in++]; - count --; - } - else if (in != out) - memcpy(out, in, count); -} - - -/* - * 'cielab()' - Map CIE Lab transformation... - */ - -static float /* O - Adjusted color value */ -cielab(float x, /* I - Raw color value */ - float xn) /* I - Whitepoint color value */ -{ - float x_xn; /* Fraction of whitepoint */ - - - x_xn = x / xn; - - if (x_xn > 0.008856) - return (cbrt(x_xn)); - else - return (7.787 * x_xn + 16.0 / 116.0); -} - - -/* - * 'huerotate()' - Rotate the hue, maintaining luminance. - */ - -static void -huerotate(float mat[3][3], /* I - Matrix to append to */ - float rot) /* I - Hue rotation in degrees */ -{ - float hmat[3][3]; /* Hue matrix */ - float lx, ly, lz; /* Luminance vector */ - float xrs, xrc; /* X rotation sine/cosine */ - float yrs, yrc; /* Y rotation sine/cosine */ - float zrs, zrc; /* Z rotation sine/cosine */ - float zsx, zsy; /* Z shear x/y */ - - - /* - * Load the identity matrix... - */ - - ident(hmat); - - /* - * Rotate the grey vector into positive Z... - */ - - xrs = M_SQRT1_2; - xrc = M_SQRT1_2; - xrotate(hmat,xrs,xrc); - - yrs = -1.0 / sqrt(3.0); - yrc = -M_SQRT2 * yrs; - yrotate(hmat,yrs,yrc); - - /* - * Shear the space to make the luminance plane horizontal... - */ - - xform(hmat, 0.3086, 0.6094, 0.0820, &lx, &ly, &lz); - zsx = lx / lz; - zsy = ly / lz; - zshear(hmat, zsx, zsy); - - /* - * Rotate the hue... - */ - - zrs = sin(rot * M_PI / 180.0); - zrc = cos(rot * M_PI / 180.0); - - zrotate(hmat, zrs, zrc); - - /* - * Unshear the space to put the luminance plane back... - */ - - zshear(hmat, -zsx, -zsy); - - /* - * Rotate the grey vector back into place... - */ - - yrotate(hmat, -yrs, yrc); - xrotate(hmat, -xrs, xrc); - - /* - * Append it to the current matrix... - */ - - mult(hmat, mat, mat); -} - - -/* - * 'ident()' - Make an identity matrix. - */ - -static void -ident(float mat[3][3]) /* I - Matrix to identify */ -{ - mat[0][0] = 1.0; - mat[0][1] = 0.0; - mat[0][2] = 0.0; - mat[1][0] = 0.0; - mat[1][1] = 1.0; - mat[1][2] = 0.0; - mat[2][0] = 0.0; - mat[2][1] = 0.0; - mat[2][2] = 1.0; -} - - -/* - * 'mult()' - Multiply two matrices. - */ - -static void -mult(float a[3][3], /* I - First matrix */ - float b[3][3], /* I - Second matrix */ - float c[3][3]) /* I - Destination matrix */ -{ - int x, y; /* Looping vars */ - float temp[3][3]; /* Temporary matrix */ - - - /* - * Multiply a and b, putting the result in temp... - */ - - for (y = 0; y < 3; y ++) - for (x = 0; x < 3; x ++) - temp[y][x] = b[y][0] * a[0][x] + - b[y][1] * a[1][x] + - b[y][2] * a[2][x]; - - /* - * Copy temp to c (that way c can be a pointer to a or b). - */ - - memcpy(c, temp, sizeof(temp)); -} - - -/* - * 'rgb_to_lab()' - Convert an RGB color to CIE Lab. - */ - -static void -rgb_to_lab(cups_ib_t *val) /* IO - Color value */ -{ - float r, /* Red value */ - g, /* Green value */ - b, /* Blue value */ - ciex, /* CIE X value */ - ciey, /* CIE Y value */ - ciez, /* CIE Z value */ - ciey_yn, /* Normalized luminance */ - ciel, /* CIE L value */ - ciea, /* CIE a value */ - cieb; /* CIE b value */ - - - /* - * Convert sRGB to linear RGB... - */ - - r = pow((val[0] / 255.0 + 0.055) / 1.055, 2.4); - g = pow((val[1] / 255.0 + 0.055) / 1.055, 2.4); - b = pow((val[2] / 255.0 + 0.055) / 1.055, 2.4); - - /* - * Convert to CIE XYZ... - */ - - ciex = 0.412453 * r + 0.357580 * g + 0.180423 * b; - ciey = 0.212671 * r + 0.715160 * g + 0.072169 * b; - ciez = 0.019334 * r + 0.119193 * g + 0.950227 * b; - - /* - * Normalize and convert to CIE Lab... - */ - - ciey_yn = ciey / D65_Y; - - if (ciey_yn > 0.008856) - ciel = 116 * cbrt(ciey_yn) - 16; - else - ciel = 903.3 * ciey_yn; - -/*ciel = ciel;*/ - ciea = 500 * (cielab(ciex, D65_X) - cielab(ciey, D65_Y)); - cieb = 200 * (cielab(ciey, D65_Y) - cielab(ciez, D65_Z)); - - /* - * Scale the L value and bias the a and b values by 128 so that all - * numbers are from 0 to 255. - */ - - ciel = ciel * 2.55 + 0.5; - ciea += 128.5; - cieb += 128.5; - - /* - * Output 8-bit values... - */ - - if (ciel < 0.0) - val[0] = 0; - else if (ciel < 255.0) - val[0] = (int)ciel; - else - val[0] = 255; - - if (ciea < 0.0) - val[1] = 0; - else if (ciea < 255.0) - val[1] = (int)ciea; - else - val[1] = 255; - - if (cieb < 0.0) - val[2] = 0; - else if (cieb < 255.0) - val[2] = (int)cieb; - else - val[2] = 255; -} - - -/* - * 'rgb_to_xyz()' - Convert an RGB color to CIE XYZ. - */ - -static void -rgb_to_xyz(cups_ib_t *val) /* IO - Color value */ -{ - float r, /* Red value */ - g, /* Green value */ - b, /* Blue value */ - ciex, /* CIE X value */ - ciey, /* CIE Y value */ - ciez; /* CIE Z value */ - - - /* - * Convert sRGB to linear RGB... - */ - - r = pow((val[0] / 255.0 + 0.055) / 1.055, 2.4); - g = pow((val[1] / 255.0 + 0.055) / 1.055, 2.4); - b = pow((val[2] / 255.0 + 0.055) / 1.055, 2.4); - - /* - * Convert to CIE XYZ... - */ - - ciex = 0.412453 * r + 0.357580 * g + 0.180423 * b; - ciey = 0.212671 * r + 0.715160 * g + 0.072169 * b; - ciez = 0.019334 * r + 0.119193 * g + 0.950227 * b; - - /* - * Encode as 8-bit XYZ... - */ - - if (ciex < 0.0f) - val[0] = 0; - else if (ciex < 1.1f) - val[0] = (int)(231.8181f * ciex + 0.5); - else - val[0] = 255; - - if (ciey < 0.0f) - val[1] = 0; - else if (ciey < 1.1f) - val[1] = (int)(231.8181f * ciey + 0.5); - else - val[1] = 255; - - if (ciez < 0.0f) - val[2] = 0; - else if (ciez < 1.1f) - val[2] = (int)(231.8181f * ciez + 0.5); - else - val[2] = 255; -} - - -/* - * 'saturate()' - Make a saturation matrix. - */ - -static void -saturate(float mat[3][3], /* I - Matrix to append to */ - float sat) /* I - Desired color saturation */ -{ - float smat[3][3]; /* Saturation matrix */ - - - smat[0][0] = (1.0 - sat) * 0.3086 + sat; - smat[0][1] = (1.0 - sat) * 0.3086; - smat[0][2] = (1.0 - sat) * 0.3086; - smat[1][0] = (1.0 - sat) * 0.6094; - smat[1][1] = (1.0 - sat) * 0.6094 + sat; - smat[1][2] = (1.0 - sat) * 0.6094; - smat[2][0] = (1.0 - sat) * 0.0820; - smat[2][1] = (1.0 - sat) * 0.0820; - smat[2][2] = (1.0 - sat) * 0.0820 + sat; - - mult(smat, mat, mat); -} - - -/* - * 'xform()' - Transform a 3D point using a matrix... - */ - -static void -xform(float mat[3][3], /* I - Matrix */ - float x, /* I - Input X coordinate */ - float y, /* I - Input Y coordinate */ - float z, /* I - Input Z coordinate */ - float *tx, /* O - Output X coordinate */ - float *ty, /* O - Output Y coordinate */ - float *tz) /* O - Output Z coordinate */ -{ - *tx = x * mat[0][0] + y * mat[1][0] + z * mat[2][0]; - *ty = x * mat[0][1] + y * mat[1][1] + z * mat[2][1]; - *tz = x * mat[0][2] + y * mat[1][2] + z * mat[2][2]; -} - - -/* - * 'xrotate()' - Rotate about the x (red) axis... - */ - -static void -xrotate(float mat[3][3], /* I - Matrix */ - float rs, /* I - Rotation angle sine */ - float rc) /* I - Rotation angle cosine */ -{ - float rmat[3][3]; /* I - Rotation matrix */ - - - rmat[0][0] = 1.0; - rmat[0][1] = 0.0; - rmat[0][2] = 0.0; - - rmat[1][0] = 0.0; - rmat[1][1] = rc; - rmat[1][2] = rs; - - rmat[2][0] = 0.0; - rmat[2][1] = -rs; - rmat[2][2] = rc; - - mult(rmat, mat, mat); -} - - -/* - * 'yrotate()' - Rotate about the y (green) axis... - */ - -static void -yrotate(float mat[3][3], /* I - Matrix */ - float rs, /* I - Rotation angle sine */ - float rc) /* I - Rotation angle cosine */ -{ - float rmat[3][3]; /* I - Rotation matrix */ - - - rmat[0][0] = rc; - rmat[0][1] = 0.0; - rmat[0][2] = -rs; - - rmat[1][0] = 0.0; - rmat[1][1] = 1.0; - rmat[1][2] = 0.0; - - rmat[2][0] = rs; - rmat[2][1] = 0.0; - rmat[2][2] = rc; - - mult(rmat,mat,mat); -} - - -/* - * 'zrotate()' - Rotate about the z (blue) axis... - */ - -static void -zrotate(float mat[3][3], /* I - Matrix */ - float rs, /* I - Rotation angle sine */ - float rc) /* I - Rotation angle cosine */ -{ - float rmat[3][3]; /* I - Rotation matrix */ - - - rmat[0][0] = rc; - rmat[0][1] = rs; - rmat[0][2] = 0.0; - - rmat[1][0] = -rs; - rmat[1][1] = rc; - rmat[1][2] = 0.0; - - rmat[2][0] = 0.0; - rmat[2][1] = 0.0; - rmat[2][2] = 1.0; - - mult(rmat,mat,mat); -} - - -/* - * 'zshear()' - Shear z using x and y... - */ - -static void -zshear(float mat[3][3], /* I - Matrix */ - float dx, /* I - X shear */ - float dy) /* I - Y shear */ -{ - float smat[3][3]; /* Shear matrix */ - - - smat[0][0] = 1.0; - smat[0][1] = 0.0; - smat[0][2] = dx; - - smat[1][0] = 0.0; - smat[1][1] = 1.0; - smat[1][2] = dy; - - smat[2][0] = 0.0; - smat[2][1] = 0.0; - smat[2][2] = 1.0; - - mult(smat, mat, mat); -} - - -/* - * End of "$Id: image-colorspace.c 7720 2008-07-11 22:46:21Z mike $". - */ diff --git a/filter/image-gif.c b/filter/image-gif.c deleted file mode 100644 index c082c089f..000000000 --- a/filter/image-gif.c +++ /dev/null @@ -1,696 +0,0 @@ -/* - * "$Id: image-gif.c 7720 2008-07-11 22:46:21Z mike $" - * - * GIF image routines for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2007 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * _cupsImageReadGIF() - Read a GIF image file. - * gif_get_block() - Read a GIF data block... - * gif_get_code() - Get a LZW code from the file... - * gif_read_cmap() - Read the colormap from a GIF file... - * gif_read_image() - Read a GIF image stream... - * gif_read_lzw() - Read a byte from the LZW stream... - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" - - -/* - * GIF definitions... - */ - -#define GIF_INTERLACE 0x40 -#define GIF_COLORMAP 0x80 -#define GIF_MAX_BITS 12 - -typedef cups_ib_t gif_cmap_t[256][4]; -typedef short gif_table_t[4096]; - - -/* - * Local globals... - */ - -static int gif_eof = 0; /* Did we hit EOF? */ - - -/* - * Local functions... - */ - -static int gif_get_block(FILE *fp, unsigned char *buffer); -static int gif_get_code (FILE *fp, int code_size, int first_time); -static int gif_read_cmap(FILE *fp, int ncolors, gif_cmap_t cmap, - int *gray); -static int gif_read_image(FILE *fp, cups_image_t *img, gif_cmap_t cmap, - int interlace); -static int gif_read_lzw(FILE *fp, int first_time, int input_code_size); - - -/* - * '_cupsImageReadGIF()' - Read a GIF image file. - */ - -int /* O - Read status */ -_cupsImageReadGIF( - cups_image_t *img, /* IO - cupsImage */ - FILE *fp, /* I - cupsImage file */ - cups_icspace_t primary, /* I - Primary choice for colorspace */ - cups_icspace_t secondary, /* I - Secondary choice for colorspace */ - int saturation, /* I - Color saturation (%) */ - int hue, /* I - Color hue (degrees) */ - const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ -{ - unsigned char buf[1024]; /* Input buffer */ - gif_cmap_t cmap; /* Colormap */ - int i, /* Looping var */ - bpp, /* Bytes per pixel */ - gray, /* Grayscale image? */ - ncolors, /* Bits per pixel */ - transparent; /* Transparent color index */ - - - /* - * GIF files are either grayscale or RGB - no CMYK... - */ - - if (primary == CUPS_IMAGE_RGB_CMYK) - primary = CUPS_IMAGE_RGB; - - /* - * Read the header; we already know it is a GIF file... - */ - - fread(buf, 13, 1, fp); - - img->xsize = (buf[7] << 8) | buf[6]; - img->ysize = (buf[9] << 8) | buf[8]; - ncolors = 2 << (buf[10] & 0x07); - gray = primary == CUPS_IMAGE_BLACK || primary == CUPS_IMAGE_WHITE; - - if (buf[10] & GIF_COLORMAP) - if (gif_read_cmap(fp, ncolors, cmap, &gray)) - { - fclose(fp); - return (-1); - } - - transparent = -1; - - for (;;) - { - switch (getc(fp)) - { - case ';' : /* End of image */ - fclose(fp); - return (-1); /* Early end of file */ - - case '!' : /* Extension record */ - buf[0] = getc(fp); - if (buf[0] == 0xf9) /* Graphic Control Extension */ - { - gif_get_block(fp, buf); - if (buf[0] & 1) /* Get transparent color index */ - transparent = buf[3]; - } - - while (gif_get_block(fp, buf) != 0); - break; - - case ',' : /* cupsImage data */ - fread(buf, 9, 1, fp); - - if (buf[8] & GIF_COLORMAP) - { - ncolors = 2 << (buf[8] & 0x07); - gray = primary == CUPS_IMAGE_BLACK || primary == CUPS_IMAGE_WHITE; - - if (gif_read_cmap(fp, ncolors, cmap, &gray)) - { - fclose(fp); - return (-1); - } - } - - if (transparent >= 0) - { - /* - * Make transparent color white... - */ - - cmap[transparent][0] = 255; - cmap[transparent][1] = 255; - cmap[transparent][2] = 255; - } - - if (gray) - { - switch (secondary) - { - case CUPS_IMAGE_CMYK : - for (i = ncolors - 1; i >= 0; i --) - cupsImageWhiteToCMYK(cmap[i], cmap[i], 1); - break; - case CUPS_IMAGE_CMY : - for (i = ncolors - 1; i >= 0; i --) - cupsImageWhiteToCMY(cmap[i], cmap[i], 1); - break; - case CUPS_IMAGE_BLACK : - for (i = ncolors - 1; i >= 0; i --) - cupsImageWhiteToBlack(cmap[i], cmap[i], 1); - break; - case CUPS_IMAGE_WHITE : - break; - case CUPS_IMAGE_RGB : - case CUPS_IMAGE_RGB_CMYK : - for (i = ncolors - 1; i >= 0; i --) - cupsImageWhiteToRGB(cmap[i], cmap[i], 1); - break; - } - - img->colorspace = secondary; - } - else - { - if (hue != 0 || saturation != 100) - for (i = ncolors - 1; i >= 0; i --) - cupsImageRGBAdjust(cmap[i], 1, saturation, hue); - - switch (primary) - { - case CUPS_IMAGE_CMYK : - for (i = ncolors - 1; i >= 0; i --) - cupsImageRGBToCMYK(cmap[i], cmap[i], 1); - break; - case CUPS_IMAGE_CMY : - for (i = ncolors - 1; i >= 0; i --) - cupsImageRGBToCMY(cmap[i], cmap[i], 1); - break; - case CUPS_IMAGE_BLACK : - for (i = ncolors - 1; i >= 0; i --) - cupsImageRGBToBlack(cmap[i], cmap[i], 1); - break; - case CUPS_IMAGE_WHITE : - for (i = ncolors - 1; i >= 0; i --) - cupsImageRGBToWhite(cmap[i], cmap[i], 1); - break; - case CUPS_IMAGE_RGB : - case CUPS_IMAGE_RGB_CMYK : - for (i = ncolors - 1; i >= 0; i --) - cupsImageRGBToRGB(cmap[i], cmap[i], 1); - break; - } - - img->colorspace = primary; - } - - if (lut) - { - bpp = cupsImageGetDepth(img); - - for (i = ncolors - 1; i >= 0; i --) - cupsImageLut(cmap[i], bpp, lut); - } - - img->xsize = (buf[5] << 8) | buf[4]; - img->ysize = (buf[7] << 8) | buf[6]; - - /* - * Check the dimensions of the image; since the dimensions are - * a 16-bit integer we just need to check for 0... - */ - - if (img->xsize == 0 || img->ysize == 0) - { - fprintf(stderr, "DEBUG: Bad GIF image dimensions: %dx%d\n", - img->xsize, img->ysize); - fclose(fp); - return (1); - } - - i = gif_read_image(fp, img, cmap, buf[8] & GIF_INTERLACE); - fclose(fp); - return (i); - } - } -} - - -/* - * 'gif_get_block()' - Read a GIF data block... - */ - -static int /* O - Number characters read */ -gif_get_block(FILE *fp, /* I - File to read from */ - unsigned char *buf) /* I - Input buffer */ -{ - int count; /* Number of character to read */ - - - /* - * Read the count byte followed by the data from the file... - */ - - if ((count = getc(fp)) == EOF) - { - gif_eof = 1; - return (-1); - } - else if (count == 0) - gif_eof = 1; - else if (fread(buf, 1, count, fp) < count) - { - gif_eof = 1; - return (-1); - } - else - gif_eof = 0; - - return (count); -} - - -/* - * 'gif_get_code()' - Get a LZW code from the file... - */ - -static int /* O - LZW code */ -gif_get_code(FILE *fp, /* I - File to read from */ - int code_size, /* I - Size of code in bits */ - int first_time) /* I - 1 = first time, 0 = not first time */ -{ - unsigned i, j, /* Looping vars */ - ret; /* Return value */ - int count; /* Number of bytes read */ - static unsigned char buf[280]; /* Input buffer */ - static unsigned curbit, /* Current bit */ - lastbit, /* Last bit in buffer */ - done, /* Done with this buffer? */ - last_byte; /* Last byte in buffer */ - static const unsigned char bits[8] = /* Bit masks for codes */ - { - 0x01, 0x02, 0x04, 0x08, - 0x10, 0x20, 0x40, 0x80 - }; - - - if (first_time) - { - /* - * Just initialize the input buffer... - */ - - curbit = 0; - lastbit = 0; - last_byte = 0; - done = 0; - - return (0); - } - - if ((curbit + code_size) >= lastbit) - { - /* - * Don't have enough bits to hold the code... - */ - - if (done) - return (-1); /* Sorry, no more... */ - - /* - * Move last two bytes to front of buffer... - */ - - if (last_byte > 1) - { - buf[0] = buf[last_byte - 2]; - buf[1] = buf[last_byte - 1]; - last_byte = 2; - } - else if (last_byte == 1) - { - buf[0] = buf[last_byte - 1]; - last_byte = 1; - } - - /* - * Read in another buffer... - */ - - if ((count = gif_get_block(fp, buf + last_byte)) <= 0) - { - /* - * Whoops, no more data! - */ - - done = 1; - return (-1); - } - - /* - * Update buffer state... - */ - - curbit = (curbit - lastbit) + 8 * last_byte; - last_byte += count; - lastbit = last_byte * 8; - } - - for (ret = 0, i = curbit + code_size - 1, j = code_size; - j > 0; - i --, j --) - ret = (ret << 1) | ((buf[i / 8] & bits[i & 7]) != 0); - - curbit += code_size; - - return ret; -} - - -/* - * 'gif_read_cmap()' - Read the colormap from a GIF file... - */ - -static int /* O - -1 on error, 0 on success */ -gif_read_cmap(FILE *fp, /* I - File to read from */ - int ncolors, /* I - Number of colors in file */ - gif_cmap_t cmap, /* O - Colormap information */ - int *gray) /* IO - Is the image grayscale? */ -{ - int i; /* Looping var */ - - - /* - * Read the colormap... - */ - - for (i = 0; i < ncolors; i ++) - if (fread(cmap[i], 3, 1, fp) < 1) - return (-1); - - /* - * Check to see if the colormap is a grayscale ramp... - */ - - for (i = 0; i < ncolors; i ++) - if (cmap[i][0] != cmap[i][1] || cmap[i][1] != cmap[i][2]) - break; - - if (i == ncolors) - { - *gray = 1; - return (0); - } - - /* - * If this needs to be a grayscale image, convert the RGB values to - * luminance values... - */ - - if (*gray) - for (i = 0; i < ncolors; i ++) - cmap[i][0] = (cmap[i][0] * 31 + cmap[i][1] * 61 + cmap[i][2] * 8) / 100; - - return (0); -} - - -/* - * 'gif_read_image()' - Read a GIF image stream... - */ - -static int /* I - 0 = success, -1 = failure */ -gif_read_image(FILE *fp, /* I - Input file */ - cups_image_t *img, /* I - cupsImage pointer */ - gif_cmap_t cmap, /* I - Colormap */ - int interlace) /* I - Non-zero = interlaced image */ -{ - unsigned char code_size; /* Code size */ - cups_ib_t *pixels, /* Pixel buffer */ - *temp; /* Current pixel */ - int xpos, /* Current X position */ - ypos, /* Current Y position */ - pass; /* Current pass */ - int pixel; /* Current pixel */ - int bpp; /* Bytes per pixel */ - static const int xpasses[4] = /* X interleaving */ - { 8, 8, 4, 2 }, - ypasses[5] = /* Y interleaving */ - { 0, 4, 2, 1, 999999 }; - - - bpp = cupsImageGetDepth(img); - pixels = calloc(bpp, img->xsize); - xpos = 0; - ypos = 0; - pass = 0; - code_size = getc(fp); - - if (!pixels) - return (-1); - - if (code_size > GIF_MAX_BITS || gif_read_lzw(fp, 1, code_size) < 0) - { - free(pixels); - return (-1); - } - - temp = pixels; - while ((pixel = gif_read_lzw(fp, 0, code_size)) >= 0) - { - switch (bpp) - { - case 4 : - temp[3] = cmap[pixel][3]; - case 3 : - temp[2] = cmap[pixel][2]; - case 2 : - temp[1] = cmap[pixel][1]; - default : - temp[0] = cmap[pixel][0]; - } - - xpos ++; - temp += bpp; - if (xpos == img->xsize) - { - _cupsImagePutRow(img, 0, ypos, img->xsize, pixels); - - xpos = 0; - temp = pixels; - - if (interlace) - { - ypos += xpasses[pass]; - - if (ypos >= img->ysize) - { - pass ++; - - ypos = ypasses[pass]; - } - } - else - ypos ++; - } - - if (ypos >= img->ysize) - break; - } - - free(pixels); - - return (0); -} - - -/* - * 'gif_read_lzw()' - Read a byte from the LZW stream... - */ - -static int /* I - Byte from stream */ -gif_read_lzw(FILE *fp, /* I - File to read from */ - int first_time, /* I - 1 = first time, 0 = not first time */ - int input_code_size) /* I - Code size in bits */ -{ - int i, /* Looping var */ - code, /* Current code */ - incode; /* Input code */ - static short fresh = 0, /* 1 = empty buffers */ - code_size, /* Current code size */ - set_code_size, /* Initial code size set */ - max_code, /* Maximum code used */ - max_code_size, /* Maximum code size */ - firstcode, /* First code read */ - oldcode, /* Last code read */ - clear_code, /* Clear code for LZW input */ - end_code, /* End code for LZW input */ - *stack = NULL, /* Output stack */ - *sp; /* Current stack pointer */ - static gif_table_t *table = NULL; /* String table */ - - - if (first_time) - { - /* - * Setup LZW state... - */ - - set_code_size = input_code_size; - code_size = set_code_size + 1; - clear_code = 1 << set_code_size; - end_code = clear_code + 1; - max_code_size = 2 * clear_code; - max_code = clear_code + 2; - - /* - * Allocate memory for buffers... - */ - - if (table == NULL) - table = calloc(2, sizeof(gif_table_t)); - - if (table == NULL) - return (-1); - - if (stack == NULL) - stack = calloc(8192, sizeof(short)); - - if (stack == NULL) - return (-1); - - /* - * Initialize input buffers... - */ - - gif_get_code(fp, 0, 1); - - /* - * Wipe the decompressor table (already mostly 0 due to the calloc above...) - */ - - fresh = 1; - - for (i = 1; i < clear_code; i ++) - table[1][i] = i; - - sp = stack; - - return (0); - } - else if (fresh) - { - fresh = 0; - - do - { - firstcode = oldcode = gif_get_code(fp, code_size, 0); - } - while (firstcode == clear_code); - - return (firstcode & 255); - } - else if (!table) - return (0); - - if (sp > stack) - return ((*--sp) & 255); - - while ((code = gif_get_code(fp, code_size, 0)) >= 0) - { - if (code == clear_code) - { - /* - * Clear/reset the compression table... - */ - - memset(table, 0, 2 * sizeof(gif_table_t)); - for (i = 1; i < clear_code; i ++) - table[1][i] = i; - - code_size = set_code_size + 1; - max_code_size = 2 * clear_code; - max_code = clear_code + 2; - - sp = stack; - - firstcode = oldcode = gif_get_code(fp, code_size, 0); - - return (firstcode & 255); - } - else if (code == end_code || code > max_code) - { - unsigned char buf[260]; /* Block buffer */ - - if (!gif_eof) - while (gif_get_block(fp, buf) > 0); - - return (-2); - } - - incode = code; - - if (code == max_code) - { - if (sp < (stack + 8192)) - *sp++ = firstcode; - - code = oldcode; - } - - while (code >= clear_code && sp < (stack + 8192)) - { - *sp++ = table[1][code]; - if (code == table[0][code]) - return (255); - - code = table[0][code]; - } - - if (sp < (stack + 8192)) - *sp++ = firstcode = table[1][code]; - - code = max_code; - - if (code < 4096) - { - table[0][code] = oldcode; - table[1][code] = firstcode; - max_code ++; - - if (max_code >= max_code_size && max_code_size < 4096) - { - max_code_size *= 2; - code_size ++; - } - } - - oldcode = incode; - - if (sp > stack) - return ((*--sp) & 255); - } - - return (code & 255); -} - - -/* - * End of "$Id: image-gif.c 7720 2008-07-11 22:46:21Z mike $". - */ diff --git a/filter/image-jpeg.c b/filter/image-jpeg.c deleted file mode 100644 index 623a68928..000000000 --- a/filter/image-jpeg.c +++ /dev/null @@ -1,322 +0,0 @@ -/* - * "$Id: image-jpeg.c 7355 2008-02-28 20:49:40Z mike $" - * - * JPEG image routines for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2007 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * _cupsImageReadJPEG() - Read a JPEG image file. - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" - -#ifdef HAVE_LIBJPEG -# include /* JPEG/JFIF image definitions */ - - -/* - * '_cupsImageReadJPEG()' - Read a JPEG image file. - */ - -int /* O - Read status */ -_cupsImageReadJPEG( - cups_image_t *img, /* IO - cupsImage */ - FILE *fp, /* I - cupsImage file */ - cups_icspace_t primary, /* I - Primary choice for colorspace */ - cups_icspace_t secondary, /* I - Secondary choice for colorspace */ - int saturation, /* I - Color saturation (%) */ - int hue, /* I - Color hue (degrees) */ - const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ -{ - struct jpeg_decompress_struct cinfo; /* Decompressor info */ - struct jpeg_error_mgr jerr; /* Error handler info */ - cups_ib_t *in, /* Input pixels */ - *out; /* Output pixels */ - jpeg_saved_marker_ptr marker; /* Pointer to marker data */ - int psjpeg = 0; /* Non-zero if Photoshop CMYK JPEG */ - static const char *cspaces[] = - { /* JPEG colorspaces... */ - "JCS_UNKNOWN", - "JCS_GRAYSCALE", - "JCS_RGB", - "JCS_YCbCr", - "JCS_CMYK", - "JCS_YCCK" - }; - - - /* - * Read the JPEG header... - */ - - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_decompress(&cinfo); - jpeg_save_markers(&cinfo, JPEG_APP0 + 14, 0xffff); /* Adobe JPEG */ - jpeg_stdio_src(&cinfo, fp); - jpeg_read_header(&cinfo, 1); - - /* - * Parse any Adobe APPE data embedded in the JPEG file. Since Adobe doesn't - * bother following standards, we have to invert the CMYK JPEG data written by - * Adobe apps... - */ - - for (marker = cinfo.marker_list; marker; marker = marker->next) - if (marker->marker == (JPEG_APP0 + 14) && marker->data_length >= 12 && - !memcmp(marker->data, "Adobe", 5) && marker->data[11] == 2) - { - fputs("DEBUG: Adobe CMYK JPEG detected (inverting color values)\n", - stderr); - psjpeg = 1; - } - - cinfo.quantize_colors = 0; - - fprintf(stderr, "DEBUG: num_components = %d\n", cinfo.num_components); - fprintf(stderr, "DEBUG: jpeg_color_space = %s\n", - cspaces[cinfo.jpeg_color_space]); - - if (cinfo.num_components == 1) - { - fputs("DEBUG: Converting image to grayscale...\n", stderr); - - cinfo.out_color_space = JCS_GRAYSCALE; - cinfo.out_color_components = 1; - cinfo.output_components = 1; - - img->colorspace = secondary; - } - else if (cinfo.num_components == 4) - { - fputs("DEBUG: Converting image to CMYK...\n", stderr); - - cinfo.out_color_space = JCS_CMYK; - cinfo.out_color_components = 4; - cinfo.output_components = 4; - - img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_CMYK : primary; - } - else - { - fputs("DEBUG: Converting image to RGB...\n", stderr); - - cinfo.out_color_space = JCS_RGB; - cinfo.out_color_components = 3; - cinfo.output_components = 3; - - img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; - } - - jpeg_calc_output_dimensions(&cinfo); - - if (cinfo.output_width <= 0 || cinfo.output_width > CUPS_IMAGE_MAX_WIDTH || - cinfo.output_height <= 0 || cinfo.output_height > CUPS_IMAGE_MAX_HEIGHT) - { - fprintf(stderr, "DEBUG: Bad JPEG dimensions %dx%d!\n", - cinfo.output_width, cinfo.output_height); - - jpeg_destroy_decompress(&cinfo); - - fclose(fp); - return (1); - } - - img->xsize = cinfo.output_width; - img->ysize = cinfo.output_height; - - if (cinfo.X_density > 0 && cinfo.Y_density > 0 && cinfo.density_unit > 0) - { - if (cinfo.density_unit == 1) - { - img->xppi = cinfo.X_density; - img->yppi = cinfo.Y_density; - } - else - { - img->xppi = (int)((float)cinfo.X_density * 2.54); - img->yppi = (int)((float)cinfo.Y_density * 2.54); - } - - if (img->xppi == 0 || img->yppi == 0) - { - fprintf(stderr, "DEBUG: Bad JPEG image resolution %dx%d PPI.\n", - img->xppi, img->yppi); - img->xppi = img->yppi = 128; - } - } - - fprintf(stderr, "DEBUG: JPEG image %dx%dx%d, %dx%d PPI\n", - img->xsize, img->ysize, cinfo.output_components, - img->xppi, img->yppi); - - cupsImageSetMaxTiles(img, 0); - - in = malloc(img->xsize * cinfo.output_components); - out = malloc(img->xsize * cupsImageGetDepth(img)); - - jpeg_start_decompress(&cinfo); - - while (cinfo.output_scanline < cinfo.output_height) - { - jpeg_read_scanlines(&cinfo, (JSAMPROW *)&in, (JDIMENSION)1); - - if (psjpeg && cinfo.output_components == 4) - { - /* - * Invert CMYK data from Photoshop... - */ - - cups_ib_t *ptr; /* Pointer into buffer */ - int i; /* Looping var */ - - - for (ptr = in, i = img->xsize * 4; i > 0; i --, ptr ++) - *ptr = 255 - *ptr; - } - - if ((saturation != 100 || hue != 0) && cinfo.output_components == 3) - cupsImageRGBAdjust(in, img->xsize, saturation, hue); - - if ((img->colorspace == CUPS_IMAGE_WHITE && cinfo.out_color_space == JCS_GRAYSCALE) || - (img->colorspace == CUPS_IMAGE_CMYK && cinfo.out_color_space == JCS_CMYK)) - { -#ifdef DEBUG - int i, j; - cups_ib_t *ptr; - - - fputs("DEBUG: Direct Data...\n", stderr); - - fputs("DEBUG:", stderr); - - for (i = 0, ptr = in; i < img->xsize; i ++) - { - putc(' ', stderr); - for (j = 0; j < cinfo.output_components; j ++, ptr ++) - fprintf(stderr, "%02X", *ptr & 255); - } - - putc('\n', stderr); -#endif /* DEBUG */ - - if (lut) - cupsImageLut(in, img->xsize * cupsImageGetDepth(img), lut); - - _cupsImagePutRow(img, 0, cinfo.output_scanline - 1, img->xsize, in); - } - else if (cinfo.out_color_space == JCS_GRAYSCALE) - { - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_BLACK : - cupsImageWhiteToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_RGB : - cupsImageWhiteToRGB(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageWhiteToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageWhiteToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * cupsImageGetDepth(img), lut); - - _cupsImagePutRow(img, 0, cinfo.output_scanline - 1, img->xsize, out); - } - else if (cinfo.out_color_space == JCS_RGB) - { - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(in, out, img->xsize); - break; - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * cupsImageGetDepth(img), lut); - - _cupsImagePutRow(img, 0, cinfo.output_scanline - 1, img->xsize, out); - } - else /* JCS_CMYK */ - { - fputs("DEBUG: JCS_CMYK\n", stderr); - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageCMYKToWhite(in, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageCMYKToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageCMYKToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_RGB : - cupsImageCMYKToRGB(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * cupsImageGetDepth(img), lut); - - _cupsImagePutRow(img, 0, cinfo.output_scanline - 1, img->xsize, out); - } - } - - free(in); - free(out); - - jpeg_finish_decompress(&cinfo); - jpeg_destroy_decompress(&cinfo); - - fclose(fp); - - return (0); -} -#endif /* HAVE_LIBJPEG */ - - -/* - * End of "$Id: image-jpeg.c 7355 2008-02-28 20:49:40Z mike $". - */ diff --git a/filter/image-photocd.c b/filter/image-photocd.c deleted file mode 100644 index 512959dbc..000000000 --- a/filter/image-photocd.c +++ /dev/null @@ -1,333 +0,0 @@ -/* - * "$Id: image-photocd.c 7221 2008-01-16 22:20:08Z mike $" - * - * PhotoCD routines for CUPS. - * - * PhotoCD support is currently limited to the 768x512 base image, which - * is only YCC encoded. Support for the higher resolution images will - * require a lot of extra code... - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2006 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * _cupsImageReadPhotoCD() - Read a PhotoCD image file. - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" - - -/* - * '_cupsImageReadPhotoCD()' - Read a PhotoCD image file. - */ - -int /* O - Read status */ -_cupsImageReadPhotoCD( - cups_image_t *img, /* IO - cupsImage */ - FILE *fp, /* I - cupsImage file */ - cups_icspace_t primary, /* I - Primary choice for colorspace */ - cups_icspace_t secondary, /* I - Secondary choice for colorspace */ - int saturation, /* I - Color saturation (%) */ - int hue, /* I - Color hue (degrees) */ - const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ -{ - int x, y; /* Looping vars */ - int xdir, /* X direction */ - xstart; /* X starting point */ - int bpp; /* Bytes per pixel */ - int pass; /* Pass number */ - int rotation; /* 0 for 768x512, 1 for 512x768 */ - int temp, /* Adjusted luminance */ - temp2, /* Red, green, and blue values */ - cb, cr; /* Adjusted chroma values */ - cups_ib_t *in, /* Input (YCC) pixels */ - *iy, /* Luminance */ - *icb, /* Blue chroma */ - *icr, /* Red chroma */ - *rgb, /* RGB */ - *rgbptr, /* Pointer into RGB data */ - *out; /* Output pixels */ - - - (void)secondary; - - /* - * Get the image orientation... - */ - - fseek(fp, 72, SEEK_SET); - rotation = (getc(fp) & 63) != 8; - - /* - * Seek to the start of the base image... - */ - - fseek(fp, 0x30000, SEEK_SET); - - /* - * Allocate and initialize... - */ - - img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; - img->xppi = 128; - img->yppi = 128; - - if (rotation) - { - img->xsize = 512; - img->ysize = 768; - } - else - { - img->xsize = 768; - img->ysize = 512; - } - - cupsImageSetMaxTiles(img, 0); - - bpp = cupsImageGetDepth(img); - - if ((in = malloc(768 * 3)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - fclose(fp); - return (1); - } - - if ((out = malloc(768 * bpp)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - fclose(fp); - free(in); - return (1); - } - - if (bpp > 1) - { - if ((rgb = malloc(768 * 3)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - fclose(fp); - free(in); - free(out); - return (1); - } - } - else - rgb = NULL; - - if (rotation) - { - xstart = 767 * bpp; - xdir = -2 * bpp; - } - else - { - xstart = 0; - xdir = 0; - } - - /* - * Read the image file... - */ - - for (y = 0; y < 512; y += 2) - { - /* - * Grab the next two scanlines: - * - * YYYYYYYYYYYYYYY... - * YYYYYYYYYYYYYYY... - * CbCbCb...CrCrCr... - */ - - if (fread(in, 1, 768 * 3, fp) < (768 * 3)) - { - /* - * Couldn't read a row of data - return an error! - */ - - free(in); - free(out); - - if (bpp > 1) - free(rgb); - - return (-1); - } - - /* - * Process the two scanlines... - */ - - for (pass = 0, iy = in; pass < 2; pass ++) - { - if (bpp == 1) - { - /* - * Just extract the luminance channel from the line and put it - * in the image... - */ - - if (primary == CUPS_IMAGE_BLACK) - { - if (rotation) - { - for (rgbptr = out + xstart, x = 0; x < 768; x ++) - *rgbptr-- = 255 - *iy++; - - if (lut) - cupsImageLut(out, 768, lut); - - _cupsImagePutCol(img, 511 - y - pass, 0, 768, out); - } - else - { - cupsImageWhiteToBlack(iy, out, 768); - - if (lut) - cupsImageLut(out, 768, lut); - - _cupsImagePutRow(img, 0, y + pass, 768, out); - iy += 768; - } - } - else if (rotation) - { - for (rgbptr = out + xstart, x = 0; x < 768; x ++) - *rgbptr-- = 255 - *iy++; - - if (lut) - cupsImageLut(out, 768, lut); - - _cupsImagePutCol(img, 511 - y - pass, 0, 768, out); - } - else - { - if (lut) - cupsImageLut(iy, 768, lut); - - _cupsImagePutRow(img, 0, y + pass, 768, iy); - iy += 768; - } - } - else - { - /* - * Convert YCbCr to RGB... While every pixel gets a luminance - * value, adjacent pixels share chroma information. - */ - - cb = cr = 0.0f; - - for (x = 0, rgbptr = rgb + xstart, icb = in + 1536, icr = in + 1920; - x < 768; - x ++, iy ++, rgbptr += xdir) - { - if (!(x & 1)) - { - cb = (float)(*icb - 156); - cr = (float)(*icr - 137); - } - - temp = 92241 * (*iy); - - temp2 = (temp + 86706 * cr) / 65536; - if (temp2 < 0) - *rgbptr++ = 0; - else if (temp2 > 255) - *rgbptr++ = 255; - else - *rgbptr++ = temp2; - - temp2 = (temp - 25914 * cb - 44166 * cr) / 65536; - if (temp2 < 0) - *rgbptr++ = 0; - else if (temp2 > 255) - *rgbptr++ = 255; - else - *rgbptr++ = temp2; - - temp2 = (temp + 133434 * cb) / 65536; - if (temp2 < 0) - *rgbptr++ = 0; - else if (temp2 > 255) - *rgbptr++ = 255; - else - *rgbptr++ = temp2; - - if (x & 1) - { - icb ++; - icr ++; - } - } - - /* - * Adjust the hue and saturation if needed... - */ - - if (saturation != 100 || hue != 0) - cupsImageRGBAdjust(rgb, 768, saturation, hue); - - /* - * Then convert the RGB data to the appropriate colorspace and - * put it in the image... - */ - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(rgb, out, 768); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(rgb, out, 768); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(rgb, out, 768); - break; - } - - if (lut) - cupsImageLut(out, 768 * bpp, lut); - - if (rotation) - _cupsImagePutCol(img, 511 - y - pass, 0, 768, out); - else - _cupsImagePutRow(img, 0, y + pass, 768, out); - } - } - } - - /* - * Free memory and return... - */ - - free(in); - free(out); - if (bpp > 1) - free(rgb); - - return (0); -} - - -/* - * End of "$Id: image-photocd.c 7221 2008-01-16 22:20:08Z mike $". - */ diff --git a/filter/image-pix.c b/filter/image-pix.c deleted file mode 100644 index b940e770d..000000000 --- a/filter/image-pix.c +++ /dev/null @@ -1,240 +0,0 @@ -/* - * "$Id: image-pix.c 7221 2008-01-16 22:20:08Z mike $" - * - * Alias PIX image routines for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2007 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * _cupsImageReadPIX() - Read a PIX image file. - * read_short() - Read a 16-bit integer. - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" - - -/* - * Local functions... - */ - -static short read_short(FILE *fp); - - -/* - * '_cupsImageReadPIX()' - Read a PIX image file. - */ - -int /* O - Read status */ -_cupsImageReadPIX( - cups_image_t *img, /* IO - cupsImage */ - FILE *fp, /* I - cupsImage file */ - cups_icspace_t primary, /* I - Primary choice for colorspace */ - cups_icspace_t secondary, /* I - Secondary choice for colorspace */ - int saturation, /* I - Color saturation (%) */ - int hue, /* I - Color hue (degrees) */ - const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ -{ - short width, /* Width of image */ - height, /* Height of image */ - depth; /* Depth of image (bits) */ - int count, /* Repetition count */ - bpp, /* Bytes per pixel */ - x, y; /* Looping vars */ - cups_ib_t r, g, b; /* Red, green/gray, blue values */ - cups_ib_t *in, /* Input pixels */ - *out, /* Output pixels */ - *ptr; /* Pointer into pixels */ - - - /* - * Get the image dimensions and setup the image... - */ - - width = read_short(fp); - height = read_short(fp); - read_short(fp); - read_short(fp); - depth = read_short(fp); - - /* - * Check the dimensions of the image. Since the short values used for the - * width and height cannot exceed CUPS_IMAGE_MAX_WIDTH or - * CUPS_IMAGE_MAX_HEIGHT, we just need to verify they are positive integers. - */ - - if (width <= 0 || height <= 0 || - (depth != 8 && depth != 24)) - { - fprintf(stderr, "DEBUG: Bad PIX image dimensions %dx%dx%d\n", - width, height, depth); - fclose(fp); - return (1); - } - - if (depth == 8) - img->colorspace = secondary; - else - img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; - - img->xsize = width; - img->ysize = height; - - cupsImageSetMaxTiles(img, 0); - - bpp = cupsImageGetDepth(img); - - if ((in = malloc(img->xsize * (depth / 8))) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - fclose(fp); - return (1); - } - - if ((out = malloc(img->xsize * bpp)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - fclose(fp); - free(in); - return (1); - } - - /* - * Read the image data... - */ - - if (depth == 8) - { - for (count = 0, y = 0, g = 0; y < img->ysize; y ++) - { - if (img->colorspace == CUPS_IMAGE_WHITE) - ptr = out; - else - ptr = in; - - for (x = img->xsize; x > 0; x --, count --) - { - if (count == 0) - { - count = getc(fp); - g = getc(fp); - } - - *ptr++ = g; - } - - if (img->colorspace != CUPS_IMAGE_WHITE) - switch (img->colorspace) - { - default : - cupsImageWhiteToRGB(in, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageWhiteToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageWhiteToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageWhiteToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * bpp, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - } - } - else - { - for (count = 0, y = 0, r = 0, g = 0, b = 0; y < img->ysize; y ++) - { - ptr = in; - - for (x = img->xsize; x > 0; x --, count --) - { - if (count == 0) - { - count = getc(fp); - b = getc(fp); - g = getc(fp); - r = getc(fp); - } - - *ptr++ = r; - *ptr++ = g; - *ptr++ = b; - } - - if (saturation != 100 || hue != 0) - cupsImageRGBAdjust(in, img->xsize, saturation, hue); - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->xsize); - break; - case CUPS_IMAGE_RGB : - cupsImageRGBToWhite(in, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * bpp, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - } - } - - fclose(fp); - free(in); - free(out); - - return (0); -} - - -/* - * 'read_short()' - Read a 16-bit integer. - */ - -static short /* O - Value from file */ -read_short(FILE *fp) /* I - File to read from */ -{ - int ch; /* Character from file */ - - - ch = getc(fp); - return ((ch << 8) | getc(fp)); -} - - -/* - * End of "$Id: image-pix.c 7221 2008-01-16 22:20:08Z mike $". - */ diff --git a/filter/image-png.c b/filter/image-png.c deleted file mode 100644 index 81defbffa..000000000 --- a/filter/image-png.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - * "$Id: image-png.c 7437 2008-04-09 03:16:10Z mike $" - * - * PNG image routines for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2007 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * _cupsImageReadPNG() - Read a PNG image file. - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" - -#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ) -# include /* Portable Network Graphics (PNG) definitions */ - - -/* - * '_cupsImageReadPNG()' - Read a PNG image file. - */ - -int /* O - Read status */ -_cupsImageReadPNG( - cups_image_t *img, /* IO - cupsImage */ - FILE *fp, /* I - cupsImage file */ - cups_icspace_t primary, /* I - Primary choice for colorspace */ - cups_icspace_t secondary, /* I - Secondary choice for colorspace */ - int saturation, /* I - Color saturation (%) */ - int hue, /* I - Color hue (degrees) */ - const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ -{ - int y; /* Looping var */ - png_structp pp; /* PNG read pointer */ - png_infop info; /* PNG info pointers */ - png_uint_32 width, /* Width of image */ - height; /* Height of image */ - int bit_depth, /* Bit depth */ - color_type, /* Color type */ - interlace_type, /* Interlace type */ - compression_type, /* Compression type */ - filter_type; /* Filter type */ - png_uint_32 xppm, /* X pixels per meter */ - yppm; /* Y pixels per meter */ - int bpp; /* Bytes per pixel */ - int pass, /* Current pass */ - passes; /* Number of passes required */ - cups_ib_t *in, /* Input pixels */ - *inptr, /* Pointer into pixels */ - *out; /* Output pixels */ - png_color_16 bg; /* Background color */ - - - /* - * Setup the PNG data structures... - */ - - pp = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - info = png_create_info_struct(pp); - - /* - * Initialize the PNG read "engine"... - */ - - png_init_io(pp, fp); - - /* - * Get the image dimensions and load the output image... - */ - - png_read_info(pp, info); - - png_get_IHDR(pp, info, &width, &height, &bit_depth, &color_type, - &interlace_type, &compression_type, &filter_type); - - fprintf(stderr, "DEBUG: PNG image: %dx%dx%d, color_type=%x (%s%s%s)\n", - (int)width, (int)height, bit_depth, color_type, - (color_type & PNG_COLOR_MASK_COLOR) ? "RGB" : "GRAYSCALE", - (color_type & PNG_COLOR_MASK_ALPHA) ? "+ALPHA" : "", - (color_type & PNG_COLOR_MASK_PALETTE) ? "+PALETTE" : ""); - - if (color_type & PNG_COLOR_MASK_PALETTE) - png_set_expand(pp); - else if (bit_depth < 8) - { - png_set_packing(pp); - png_set_expand(pp); - } - else if (bit_depth == 16) - png_set_strip_16(pp); - - if (color_type & PNG_COLOR_MASK_COLOR) - img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : - primary; - else - img->colorspace = secondary; - - if (width == 0 || width > CUPS_IMAGE_MAX_WIDTH || - height == 0 || height > CUPS_IMAGE_MAX_HEIGHT) - { - fprintf(stderr, "DEBUG: PNG image has invalid dimensions %ux%u!\n", - (unsigned)width, (unsigned)height); - fclose(fp); - return (1); - } - - img->xsize = width; - img->ysize = height; - - if ((xppm = png_get_x_pixels_per_meter(pp, info)) != 0 && - (yppm = png_get_y_pixels_per_meter(pp, info)) != 0) - { - img->xppi = (int)((float)xppm * 0.0254); - img->yppi = (int)((float)yppm * 0.0254); - - if (img->xppi == 0 || img->yppi == 0) - { - fprintf(stderr, "DEBUG: PNG image has invalid resolution %dx%d PPI\n", - img->xppi, img->yppi); - - img->xppi = img->yppi = 128; - } - } - - cupsImageSetMaxTiles(img, 0); - - passes = png_set_interlace_handling(pp); - - /* - * Handle transparency... - */ - - if (png_get_valid(pp, info, PNG_INFO_tRNS)) - png_set_tRNS_to_alpha(pp); - - bg.red = 65535; - bg.green = 65535; - bg.blue = 65535; - - png_set_background(pp, &bg, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - - if (passes == 1) - { - /* - * Load one row at a time... - */ - - if (color_type == PNG_COLOR_TYPE_GRAY || - color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - in = malloc(img->xsize); - else - in = malloc(img->xsize * 3); - } - else - { - /* - * Interlaced images must be loaded all at once... - */ - - size_t bufsize; /* Size of buffer */ - - - if (color_type == PNG_COLOR_TYPE_GRAY || - color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - bufsize = img->xsize * img->ysize; - - if ((bufsize / img->xsize) != img->ysize) - { - fprintf(stderr, "DEBUG: PNG image dimensions (%ux%u) too large!\n", - (unsigned)width, (unsigned)height); - fclose(fp); - return (1); - } - } - else - { - bufsize = img->xsize * img->ysize * 3; - - if ((bufsize / (img->xsize * 3)) != img->ysize) - { - fprintf(stderr, "DEBUG: PNG image dimensions (%ux%u) too large!\n", - (unsigned)width, (unsigned)height); - fclose(fp); - return (1); - } - } - - in = malloc(bufsize); - } - - bpp = cupsImageGetDepth(img); - out = malloc(img->xsize * bpp); - - if (!in || !out) - { - fputs("DEBUG: Unable to allocate memory for PNG image!\n", stderr); - - if (in) - free(in); - - if (out) - free(out); - - fclose(fp); - - return (1); - } - - /* - * Read the image, interlacing as needed... - */ - - for (pass = 1; pass <= passes; pass ++) - for (inptr = in, y = 0; y < img->ysize; y ++) - { - png_read_row(pp, (png_bytep)inptr, NULL); - - if (pass == passes) - { - /* - * Output this row... - */ - - if (color_type & PNG_COLOR_MASK_COLOR) - { - if ((saturation != 100 || hue != 0) && bpp > 1) - cupsImageRGBAdjust(inptr, img->xsize, saturation, hue); - - switch (img->colorspace) - { - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(inptr, out, img->xsize); - break; - case CUPS_IMAGE_RGB : - case CUPS_IMAGE_RGB_CMYK : - cupsImageRGBToRGB(inptr, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(inptr, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(inptr, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(inptr, out, img->xsize); - break; - } - } - else - { - switch (img->colorspace) - { - case CUPS_IMAGE_WHITE : - memcpy(out, inptr, img->xsize); - break; - case CUPS_IMAGE_RGB : - case CUPS_IMAGE_RGB_CMYK : - cupsImageWhiteToRGB(inptr, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageWhiteToBlack(inptr, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageWhiteToCMY(inptr, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageWhiteToCMYK(inptr, out, img->xsize); - break; - } - } - - if (lut) - cupsImageLut(out, img->xsize * bpp, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - } - - if (passes > 1) - { - if (color_type & PNG_COLOR_MASK_COLOR) - inptr += img->xsize * 3; - else - inptr += img->xsize; - } - } - - png_read_end(pp, info); - png_destroy_read_struct(&pp, &info, NULL); - - fclose(fp); - free(in); - free(out); - - return (0); -} -#endif /* HAVE_LIBPNG && HAVE_LIBZ */ - - -/* - * End of "$Id: image-png.c 7437 2008-04-09 03:16:10Z mike $". - */ diff --git a/filter/image-pnm.c b/filter/image-pnm.c deleted file mode 100644 index 8cc761f33..000000000 --- a/filter/image-pnm.c +++ /dev/null @@ -1,320 +0,0 @@ -/* - * "$Id: image-pnm.c 7374 2008-03-08 01:13:26Z mike $" - * - * Portable Any Map file routines for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2007 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * _cupsImageReadPNM() - Read a PNM image file. - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" - - -/* - * '_cupsImageReadPNM()' - Read a PNM image file. - */ - -int /* O - Read status */ -_cupsImageReadPNM( - cups_image_t *img, /* IO - cupsImage */ - FILE *fp, /* I - cupsImage file */ - cups_icspace_t primary, /* I - Primary choice for colorspace */ - cups_icspace_t secondary, /* I - Secondary choice for colorspace */ - int saturation, /* I - Color saturation (%) */ - int hue, /* I - Color hue (degrees) */ - const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ -{ - int x, y; /* Looping vars */ - int bpp; /* Bytes per pixel */ - cups_ib_t *in, /* Input pixels */ - *inptr, /* Current input pixel */ - *out, /* Output pixels */ - *outptr, /* Current output pixel */ - bit; /* Bit in input line */ - char line[255], /* Input line */ - *lineptr; /* Pointer in line */ - int format, /* Format of PNM file */ - val, /* Pixel value */ - maxval; /* Maximum pixel value */ - - - /* - * Read the file header in the format: - * - * Pformat - * # comment1 - * # comment2 - * ... - * # commentN - * width - * height - * max sample - */ - - if ((lineptr = fgets(line, sizeof(line), fp)) == NULL) - { - fputs("DEBUG: Bad PNM header!\n", stderr); - fclose(fp); - return (1); - } - - lineptr ++; - - format = atoi(lineptr); - while (isdigit(*lineptr & 255)) - lineptr ++; - - while (lineptr != NULL && img->xsize == 0) - { - if (*lineptr == '\0' || *lineptr == '#') - lineptr = fgets(line, sizeof(line), fp); - else if (isdigit(*lineptr & 255)) - { - img->xsize = atoi(lineptr); - while (isdigit(*lineptr & 255)) - lineptr ++; - } - else - lineptr ++; - } - - while (lineptr != NULL && img->ysize == 0) - { - if (*lineptr == '\0' || *lineptr == '#') - lineptr = fgets(line, sizeof(line), fp); - else if (isdigit(*lineptr & 255)) - { - img->ysize = atoi(lineptr); - while (isdigit(*lineptr & 255)) - lineptr ++; - } - else - lineptr ++; - } - - if (format != 1 && format != 4) - { - maxval = 0; - - while (lineptr != NULL && maxval == 0) - { - if (*lineptr == '\0' || *lineptr == '#') - lineptr = fgets(line, sizeof(line), fp); - else if (isdigit(*lineptr & 255)) - { - maxval = atoi(lineptr); - while (isdigit(*lineptr & 255)) - lineptr ++; - } - else - lineptr ++; - } - } - else - maxval = 1; - - if (img->xsize == 0 || img->xsize > CUPS_IMAGE_MAX_WIDTH || - img->ysize == 0 || img->ysize > CUPS_IMAGE_MAX_HEIGHT) - { - fprintf(stderr, "DEBUG: Bad PNM dimensions %dx%d!\n", - img->xsize, img->ysize); - fclose(fp); - return (1); - } - - if (maxval == 0) - { - fprintf(stderr, "DEBUG: Bad PNM max value %d!\n", maxval); - fclose(fp); - return (1); - } - - if (format == 1 || format == 2 || format == 4 || format == 5) - img->colorspace = secondary; - else - img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; - - cupsImageSetMaxTiles(img, 0); - - bpp = cupsImageGetDepth(img); - - if ((in = malloc(img->xsize * 3)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - fclose(fp); - return (1); - } - - if ((out = malloc(img->xsize * bpp)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - fclose(fp); - free(in); - return (1); - } - - /* - * Read the image file... - */ - - for (y = 0; y < img->ysize; y ++) - { - switch (format) - { - case 1 : - for (x = img->xsize, inptr = in; x > 0; x --, inptr ++) - if (fscanf(fp, "%d", &val) == 1) - *inptr = val ? 0 : 255; - break; - - case 2 : - for (x = img->xsize, inptr = in; x > 0; x --, inptr ++) - if (fscanf(fp, "%d", &val) == 1) - *inptr = 255 * val / maxval; - break; - - case 3 : - for (x = img->xsize, inptr = in; x > 0; x --, inptr += 3) - { - if (fscanf(fp, "%d", &val) == 1) - inptr[0] = 255 * val / maxval; - if (fscanf(fp, "%d", &val) == 1) - inptr[1] = 255 * val / maxval; - if (fscanf(fp, "%d", &val) == 1) - inptr[2] = 255 * val / maxval; - } - break; - - case 4 : - fread(out, (img->xsize + 7) / 8, 1, fp); - for (x = img->xsize, inptr = in, outptr = out, bit = 128; - x > 0; - x --, inptr ++) - { - if (*outptr & bit) - *inptr = 0; - else - *inptr = 255; - - if (bit > 1) - bit >>= 1; - else - { - bit = 128; - outptr ++; - } - } - break; - - case 5 : - fread(in, img->xsize, 1, fp); - break; - - case 6 : - fread(in, img->xsize, 3, fp); - break; - } - - switch (format) - { - case 1 : - case 2 : - case 4 : - case 5 : - if (img->colorspace == CUPS_IMAGE_WHITE) - { - if (lut) - cupsImageLut(in, img->xsize, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, in); - } - else - { - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_RGB : - cupsImageWhiteToRGB(in, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageWhiteToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageWhiteToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageWhiteToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * bpp, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - } - break; - - default : - if ((saturation != 100 || hue != 0) && bpp > 1) - cupsImageRGBAdjust(in, img->xsize, saturation, hue); - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->xsize); - break; - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(in, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * bpp, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - break; - } - } - - free(in); - free(out); - - fclose(fp); - - return (0); -} - - -/* - * End of "$Id: image-pnm.c 7374 2008-03-08 01:13:26Z mike $". - */ diff --git a/filter/image-private.h b/filter/image-private.h deleted file mode 100644 index 2264cf1f7..000000000 --- a/filter/image-private.h +++ /dev/null @@ -1,220 +0,0 @@ -/* - * "$Id: image-private.h 7473 2008-04-21 17:51:58Z mike $" - * - * Private image library definitions for CUPS. - * - * Copyright 2007-2010 by Apple Inc. - * Copyright 1993-2006 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - */ - -#ifndef _CUPS_IMAGE_PRIVATE_H_ -# define _CUPS_IMAGE_PRIVATE_H_ - -/* - * Include necessary headers... - */ - -# include "image.h" -# include -# include -# include -# include -# include -# ifdef WIN32 -# include -# else -# include -# endif /* WIN32 */ -# include -# include - - -/* - * Constants... - */ - -# define CUPS_IMAGE_MAX_WIDTH 0x07ffffff - /* 2^27-1 to allow for 15-channel data */ -# define CUPS_IMAGE_MAX_HEIGHT 0x3fffffff - /* 2^30-1 */ - -# define CUPS_TILE_SIZE 256 /* 256x256 pixel tiles */ -# define CUPS_TILE_MINIMUM 10 /* Minimum number of tiles */ - - -/* - * min/max/abs macros... - */ - -# ifndef max -# define max(a,b) ((a) > (b) ? (a) : (b)) -# endif /* !max */ -# ifndef min -# define min(a,b) ((a) < (b) ? (a) : (b)) -# endif /* !min */ -# ifndef abs -# define abs(a) ((a) < 0 ? -(a) : (a)) -# endif /* !abs */ - - -/* - * Types and structures... - */ - -typedef enum cups_iztype_e /**** Image zoom type ****/ -{ - CUPS_IZOOM_FAST, /* Use nearest-neighbor sampling */ - CUPS_IZOOM_NORMAL, /* Use bilinear interpolation */ - CUPS_IZOOM_BEST /* Use bicubic interpolation */ -} cups_iztype_t; - -struct cups_ic_s; - -typedef struct cups_itile_s /**** Image tile ****/ -{ - int dirty; /* True if tile is dirty */ - off_t pos; /* Position of tile on disk (-1 if not written) */ - struct cups_ic_s *ic; /* Pixel data */ -} cups_itile_t; - -typedef struct cups_ic_s /**** Image tile cache ****/ -{ - struct cups_ic_s *prev, /* Previous tile in cache */ - *next; /* Next tile in cache */ - cups_itile_t *tile; /* Tile this is attached to */ - cups_ib_t *pixels; /* Pixel data */ -} cups_ic_t; - -struct cups_image_s /**** Image file data ****/ -{ - cups_icspace_t colorspace; /* Colorspace of image */ - unsigned xsize, /* Width of image in pixels */ - ysize, /* Height of image in pixels */ - xppi, /* X resolution in pixels-per-inch */ - yppi, /* Y resolution in pixels-per-inch */ - num_ics, /* Number of cached tiles */ - max_ics; /* Maximum number of cached tiles */ - cups_itile_t **tiles; /* Tiles in image */ - cups_ic_t *first, /* First cached tile in image */ - *last; /* Last cached tile in image */ - int cachefile; /* Tile cache file */ - char cachename[256]; /* Tile cache filename */ -}; - -struct cups_izoom_s /**** Image zoom data ****/ -{ - cups_image_t *img; /* Image to zoom */ - cups_iztype_t type; /* Type of zooming */ - unsigned xorig, /* X origin */ - yorig, /* Y origin */ - width, /* Width of input area */ - height, /* Height of input area */ - depth, /* Number of bytes per pixel */ - rotated, /* Non-zero if image needs to be rotated */ - xsize, /* Width of output image */ - ysize, /* Height of output image */ - xmax, /* Maximum input image X position */ - ymax, /* Maximum input image Y position */ - xmod, /* Threshold for Bresenheim rounding */ - ymod; /* ... */ - int xstep, /* Amount to step for each pixel along X */ - xincr, - instep, /* Amount to step pixel pointer along X */ - inincr, - ystep, /* Amount to step for each pixel along Y */ - yincr, - row; /* Current row */ - cups_ib_t *rows[2], /* Horizontally scaled pixel data */ - *in; /* Unscaled input pixel data */ -}; - - -/* - * Prototypes... - */ - -extern int _cupsImagePutCol(cups_image_t *img, int x, int y, - int height, const cups_ib_t *pixels); -extern int _cupsImagePutRow(cups_image_t *img, int x, int y, - int width, const cups_ib_t *pixels); -extern int _cupsImageReadBMP(cups_image_t *img, FILE *fp, - cups_icspace_t primary, - cups_icspace_t secondary, - int saturation, int hue, - const cups_ib_t *lut); -extern int _cupsImageReadFPX(cups_image_t *img, FILE *fp, - cups_icspace_t primary, - cups_icspace_t secondary, - int saturation, int hue, - const cups_ib_t *lut); -extern int _cupsImageReadGIF(cups_image_t *img, FILE *fp, - cups_icspace_t primary, - cups_icspace_t secondary, - int saturation, int hue, - const cups_ib_t *lut); -extern int _cupsImageReadJPEG(cups_image_t *img, FILE *fp, - cups_icspace_t primary, - cups_icspace_t secondary, - int saturation, int hue, - const cups_ib_t *lut); -extern int _cupsImageReadPIX(cups_image_t *img, FILE *fp, - cups_icspace_t primary, - cups_icspace_t secondary, - int saturation, int hue, - const cups_ib_t *lut); -extern int _cupsImageReadPNG(cups_image_t *img, FILE *fp, - cups_icspace_t primary, - cups_icspace_t secondary, - int saturation, int hue, - const cups_ib_t *lut); -extern int _cupsImageReadPNM(cups_image_t *img, FILE *fp, - cups_icspace_t primary, - cups_icspace_t secondary, - int saturation, int hue, - const cups_ib_t *lut); -extern int _cupsImageReadPhotoCD(cups_image_t *img, FILE *fp, - cups_icspace_t primary, - cups_icspace_t secondary, - int saturation, int hue, - const cups_ib_t *lut); -extern int _cupsImageReadSGI(cups_image_t *img, FILE *fp, - cups_icspace_t primary, - cups_icspace_t secondary, - int saturation, int hue, - const cups_ib_t *lut); -extern int _cupsImageReadSunRaster(cups_image_t *img, FILE *fp, - cups_icspace_t primary, - cups_icspace_t secondary, - int saturation, int hue, - const cups_ib_t *lut); -extern int _cupsImageReadTIFF(cups_image_t *img, FILE *fp, - cups_icspace_t primary, - cups_icspace_t secondary, - int saturation, int hue, - const cups_ib_t *lut); -extern void _cupsImageZoomDelete(cups_izoom_t *z); -extern void _cupsImageZoomFill(cups_izoom_t *z, int iy); -extern cups_izoom_t *_cupsImageZoomNew(cups_image_t *img, int xc0, int yc0, - int xc1, int yc1, int xsize, - int ysize, int rotated, - cups_iztype_t type); - -extern int _cupsRasterExecPS(cups_page_header2_t *h, - int *preferred_bits, - const char *code); -extern void _cupsRasterAddError(const char *f, ...); -extern void _cupsRasterClearError(void); - -#endif /* !_CUPS_IMAGE_PRIVATE_H_ */ - -/* - * End of "$Id: image-private.h 7473 2008-04-21 17:51:58Z mike $". - */ diff --git a/filter/image-sgi.c b/filter/image-sgi.c deleted file mode 100644 index 39d6f4453..000000000 --- a/filter/image-sgi.c +++ /dev/null @@ -1,295 +0,0 @@ -/* - * "$Id: image-sgi.c 7223 2008-01-16 23:41:19Z mike $" - * - * SGI image file routines for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2007 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * _cupsImageReadSGI() - Read a SGI image file. - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" -#include "image-sgi.h" - - -/* - * '_cupsImageReadSGI()' - Read a SGI image file. - */ - -int /* O - Read status */ -_cupsImageReadSGI( - cups_image_t *img, /* IO - cupsImage */ - FILE *fp, /* I - cupsImage file */ - cups_icspace_t primary, /* I - Primary choice for colorspace */ - cups_icspace_t secondary, /* I - Secondary choice for colorspace */ - int saturation, /* I - Color saturation (%) */ - int hue, /* I - Color hue (degrees) */ - const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ -{ - int i, y; /* Looping vars */ - int bpp; /* Bytes per pixel */ - sgi_t *sgip; /* SGI image file */ - cups_ib_t *in, /* Input pixels */ - *inptr, /* Current input pixel */ - *out; /* Output pixels */ - unsigned short *rows[4], /* Row pointers for image data */ - *red, - *green, - *blue, - *gray, - *alpha; - - - /* - * Setup the SGI file... - */ - - sgip = sgiOpenFile(fp, SGI_READ, 0, 0, 0, 0, 0); - - /* - * Get the image dimensions and load the output image... - */ - - /* - * Check the image dimensions; since xsize and ysize are unsigned shorts, - * just check if they are 0 since they can't exceed CUPS_IMAGE_MAX_WIDTH or - * CUPS_IMAGE_MAX_HEIGHT... - */ - - if (sgip->xsize == 0 || sgip->ysize == 0 || - sgip->zsize == 0 || sgip->zsize > 4) - { - fprintf(stderr, "DEBUG: Bad SGI image dimensions %ux%ux%u!\n", - sgip->xsize, sgip->ysize, sgip->zsize); - sgiClose(sgip); - return (1); - } - - if (sgip->zsize < 3) - img->colorspace = secondary; - else - img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; - - img->xsize = sgip->xsize; - img->ysize = sgip->ysize; - - cupsImageSetMaxTiles(img, 0); - - bpp = cupsImageGetDepth(img); - - if ((in = malloc(img->xsize * sgip->zsize)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - sgiClose(sgip); - return (1); - } - - if ((out = malloc(img->xsize * bpp)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - sgiClose(sgip); - free(in); - return (1); - } - - if ((rows[0] = calloc(img->xsize * sgip->zsize, - sizeof(unsigned short))) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - sgiClose(sgip); - free(in); - free(out); - return (1); - } - - for (i = 1; i < sgip->zsize; i ++) - rows[i] = rows[0] + i * img->xsize; - - /* - * Read the SGI image file... - */ - - for (y = 0; y < img->ysize; y ++) - { - for (i = 0; i < sgip->zsize; i ++) - sgiGetRow(sgip, rows[i], img->ysize - 1 - y, i); - - switch (sgip->zsize) - { - case 1 : - if (sgip->bpp == 1) - for (i = img->xsize - 1, gray = rows[0], inptr = in; - i >= 0; - i --) - { - *inptr++ = *gray++; - } - else - for (i = img->xsize - 1, gray = rows[0], inptr = in; - i >= 0; - i --) - { - *inptr++ = (*gray++) / 256 + 128; - } - break; - case 2 : - if (sgip->bpp == 1) - for (i = img->xsize - 1, gray = rows[0], alpha = rows[1], inptr = in; - i >= 0; - i --) - { - *inptr++ = (*gray++) * (*alpha++) / 255; - } - else - for (i = img->xsize - 1, gray = rows[0], alpha = rows[1], inptr = in; - i >= 0; - i --) - { - *inptr++ = ((*gray++) / 256 + 128) * (*alpha++) / 32767; - } - break; - case 3 : - if (sgip->bpp == 1) - for (i = img->xsize - 1, red = rows[0], green = rows[1], - blue = rows[2], inptr = in; - i >= 0; - i --) - { - *inptr++ = *red++; - *inptr++ = *green++; - *inptr++ = *blue++; - } - else - for (i = img->xsize - 1, red = rows[0], green = rows[1], - blue = rows[2], inptr = in; - i >= 0; - i --) - { - *inptr++ = (*red++) / 256 + 128; - *inptr++ = (*green++) / 256 + 128; - *inptr++ = (*blue++) / 256 + 128; - } - break; - case 4 : - if (sgip->bpp == 1) - for (i = img->xsize - 1, red = rows[0], green = rows[1], - blue = rows[2], alpha = rows[3], inptr = in; - i >= 0; - i --) - { - *inptr++ = (*red++) * (*alpha) / 255; - *inptr++ = (*green++) * (*alpha) / 255; - *inptr++ = (*blue++) * (*alpha++) / 255; - } - else - for (i = img->xsize - 1, red = rows[0], green = rows[1], - blue = rows[2], alpha = rows[3], inptr = in; - i >= 0; - i --) - { - *inptr++ = ((*red++) / 256 + 128) * (*alpha) / 32767; - *inptr++ = ((*green++) / 256 + 128) * (*alpha) / 32767; - *inptr++ = ((*blue++) / 256 + 128) * (*alpha++) / 32767; - } - break; - } - - if (sgip->zsize < 3) - { - if (img->colorspace == CUPS_IMAGE_WHITE) - { - if (lut) - cupsImageLut(in, img->xsize, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, in); - } - else - { - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_RGB : - case CUPS_IMAGE_RGB_CMYK : - cupsImageWhiteToRGB(in, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageWhiteToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageWhiteToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageWhiteToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * bpp, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - } - } - else - { - if ((saturation != 100 || hue != 0) && bpp > 1) - cupsImageRGBAdjust(in, img->xsize, saturation, hue); - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->xsize); - break; - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(in, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * bpp, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - } - } - - free(in); - free(out); - free(rows[0]); - - sgiClose(sgip); - - return (0); -} - - -/* - * End of "$Id: image-sgi.c 7223 2008-01-16 23:41:19Z mike $". - */ diff --git a/filter/image-sgi.h b/filter/image-sgi.h deleted file mode 100644 index 8f1781a2d..000000000 --- a/filter/image-sgi.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * "$Id: image-sgi.h 6649 2007-07-11 21:46:42Z mike $" - * - * SGI image file format library definitions for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - */ - -#ifndef _SGI_H_ -# define _SGI_H_ - -# include -# include -# include - -# ifdef __cplusplus -extern "C" { -# endif - - -/* - * Constants... - */ - -# define SGI_MAGIC 474 /* Magic number in image file */ - -# define SGI_READ 0 /* Read from an SGI image file */ -# define SGI_WRITE 1 /* Write to an SGI image file */ - -# define SGI_COMP_NONE 0 /* No compression */ -# define SGI_COMP_RLE 1 /* Run-length encoding */ -# define SGI_COMP_ARLE 2 /* Agressive run-length encoding */ - - -/* - * Image structure... - */ - -typedef struct -{ - FILE *file; /* Image file */ - int mode, /* File open mode */ - bpp, /* Bytes per pixel/channel */ - comp; /* Compression */ - unsigned short xsize, /* Width in pixels */ - ysize, /* Height in pixels */ - zsize; /* Number of channels */ - long firstrow, /* File offset for first row */ - nextrow, /* File offset for next row */ - **table, /* Offset table for compression */ - **length; /* Length table for compression */ - unsigned short *arle_row; /* Advanced RLE compression buffer */ - long arle_offset, /* Advanced RLE buffer offset */ - arle_length; /* Advanced RLE buffer length */ -} sgi_t; - - -/* - * Prototypes... - */ - -extern int sgiClose(sgi_t *sgip); -extern int sgiGetRow(sgi_t *sgip, unsigned short *row, int y, int z); -extern sgi_t *sgiOpen(const char *filename, int mode, int comp, int bpp, - int xsize, int ysize, int zsize); -extern sgi_t *sgiOpenFile(FILE *file, int mode, int comp, int bpp, - int xsize, int ysize, int zsize); -extern int sgiPutRow(sgi_t *sgip, unsigned short *row, int y, int z); - -# ifdef __cplusplus -} -# endif -#endif /* !_SGI_H_ */ - -/* - * End of "$Id: image-sgi.h 6649 2007-07-11 21:46:42Z mike $". - */ diff --git a/filter/image-sgilib.c b/filter/image-sgilib.c deleted file mode 100644 index 4f3d50fe0..000000000 --- a/filter/image-sgilib.c +++ /dev/null @@ -1,890 +0,0 @@ -/* - * "$Id: image-sgilib.c 7221 2008-01-16 22:20:08Z mike $" - * - * SGI image file format library routines for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * sgiClose() - Close an SGI image file. - * sgiGetRow() - Get a row of image data from a file. - * sgiOpen() - Open an SGI image file for reading or writing. - * sgiOpenFile() - Open an SGI image file for reading or writing. - * sgiPutRow() - Put a row of image data to a file. - * getlong() - Get a 32-bit big-endian integer. - * getshort() - Get a 16-bit big-endian integer. - * putlong() - Put a 32-bit big-endian integer. - * putshort() - Put a 16-bit big-endian integer. - * read_rle8() - Read 8-bit RLE data. - * read_rle16() - Read 16-bit RLE data. - * write_rle8() - Write 8-bit RLE data. - * write_rle16() - Write 16-bit RLE data. - */ - -#include "image-sgi.h" - - -/* - * Local functions... - */ - -static int getlong(FILE *); -static int getshort(FILE *); -static int putlong(long, FILE *); -static int putshort(unsigned short, FILE *); -static int read_rle8(FILE *, unsigned short *, int); -static int read_rle16(FILE *, unsigned short *, int); -static int write_rle8(FILE *, unsigned short *, int); -static int write_rle16(FILE *, unsigned short *, int); - - -/* - * 'sgiClose()' - Close an SGI image file. - */ - -int /* O - 0 on success, -1 on error */ -sgiClose(sgi_t *sgip) /* I - SGI image */ -{ - int i; /* Return status */ - long *offset; /* Looping var for offset table */ - - - if (sgip == NULL) - return (-1); - - if (sgip->mode == SGI_WRITE && sgip->comp != SGI_COMP_NONE) - { - /* - * Write the scanline offset table to the file... - */ - - fseek(sgip->file, 512, SEEK_SET); - - for (i = sgip->ysize * sgip->zsize, offset = sgip->table[0]; - i > 0; - i --, offset ++) - if (putlong(offset[0], sgip->file) < 0) - return (-1); - - for (i = sgip->ysize * sgip->zsize, offset = sgip->length[0]; - i > 0; - i --, offset ++) - if (putlong(offset[0], sgip->file) < 0) - return (-1); - } - - if (sgip->table != NULL) - { - free(sgip->table[0]); - free(sgip->table); - } - - if (sgip->length != NULL) - { - free(sgip->length[0]); - free(sgip->length); - } - - if (sgip->comp == SGI_COMP_ARLE) - free(sgip->arle_row); - - i = fclose(sgip->file); - free(sgip); - - return (i); -} - - -/* - * 'sgiGetRow()' - Get a row of image data from a file. - */ - -int /* O - 0 on success, -1 on error */ -sgiGetRow(sgi_t *sgip, /* I - SGI image */ - unsigned short *row, /* O - Row to read */ - int y, /* I - Line to read */ - int z) /* I - Channel to read */ -{ - int x; /* X coordinate */ - long offset; /* File offset */ - - - if (sgip == NULL || - row == NULL || - y < 0 || y >= sgip->ysize || - z < 0 || z >= sgip->zsize) - return (-1); - - switch (sgip->comp) - { - case SGI_COMP_NONE : - /* - * Seek to the image row - optimize buffering by only seeking if - * necessary... - */ - - offset = 512 + (y + z * sgip->ysize) * sgip->xsize * sgip->bpp; - if (offset != ftell(sgip->file)) - fseek(sgip->file, offset, SEEK_SET); - - if (sgip->bpp == 1) - { - for (x = sgip->xsize; x > 0; x --, row ++) - *row = getc(sgip->file); - } - else - { - for (x = sgip->xsize; x > 0; x --, row ++) - *row = getshort(sgip->file); - } - break; - - case SGI_COMP_RLE : - offset = sgip->table[z][y]; - if (offset != ftell(sgip->file)) - fseek(sgip->file, offset, SEEK_SET); - - if (sgip->bpp == 1) - return (read_rle8(sgip->file, row, sgip->xsize)); - else - return (read_rle16(sgip->file, row, sgip->xsize)); - } - - return (0); -} - - -/* - * 'sgiOpen()' - Open an SGI image file for reading or writing. - */ - -sgi_t * /* O - New image */ -sgiOpen(const char *filename, /* I - File to open */ - int mode, /* I - Open mode (SGI_READ or SGI_WRITE) */ - int comp, /* I - Type of compression */ - int bpp, /* I - Bytes per pixel */ - int xsize, /* I - Width of image in pixels */ - int ysize, /* I - Height of image in pixels */ - int zsize) /* I - Number of channels */ -{ - sgi_t *sgip; /* New SGI image file */ - FILE *file; /* Image file pointer */ - - - if (mode == SGI_READ) - file = fopen(filename, "rb"); - else - file = fopen(filename, "wb+"); - - if (file == NULL) - return (NULL); - - if ((sgip = sgiOpenFile(file, mode, comp, bpp, xsize, ysize, zsize)) == NULL) - fclose(file); - - return (sgip); -} - - -/* - * 'sgiOpenFile()' - Open an SGI image file for reading or writing. - */ - -sgi_t * /* O - New image */ -sgiOpenFile(FILE *file, /* I - File to open */ - int mode, /* I - Open mode (SGI_READ or SGI_WRITE) */ - int comp, /* I - Type of compression */ - int bpp, /* I - Bytes per pixel */ - int xsize, /* I - Width of image in pixels */ - int ysize, /* I - Height of image in pixels */ - int zsize) /* I - Number of channels */ -{ - int i, j; /* Looping var */ - char name[80]; /* Name of file in image header */ - short magic; /* Magic number */ - sgi_t *sgip; /* New image pointer */ - - - if ((sgip = calloc(sizeof(sgi_t), 1)) == NULL) - return (NULL); - - sgip->file = file; - - switch (mode) - { - case SGI_READ : - sgip->mode = SGI_READ; - - magic = getshort(sgip->file); - if (magic != SGI_MAGIC) - { - free(sgip); - return (NULL); - } - - sgip->comp = getc(sgip->file); - sgip->bpp = getc(sgip->file); - getshort(sgip->file); /* Dimensions */ - sgip->xsize = getshort(sgip->file); - sgip->ysize = getshort(sgip->file); - sgip->zsize = getshort(sgip->file); - getlong(sgip->file); /* Minimum pixel */ - getlong(sgip->file); /* Maximum pixel */ - - if (sgip->comp) - { - /* - * This file is compressed; read the scanline tables... - */ - - fseek(sgip->file, 512, SEEK_SET); - - if ((sgip->table = calloc(sgip->zsize, sizeof(long *))) == NULL) - { - free(sgip); - return (NULL); - } - - if ((sgip->table[0] = calloc(sgip->ysize * sgip->zsize, - sizeof(long))) == NULL) - { - free(sgip->table); - free(sgip); - return (NULL); - } - - for (i = 1; i < sgip->zsize; i ++) - sgip->table[i] = sgip->table[0] + i * sgip->ysize; - - for (i = 0; i < sgip->zsize; i ++) - for (j = 0; j < sgip->ysize; j ++) - sgip->table[i][j] = getlong(sgip->file); - } - break; - - case SGI_WRITE : - if (xsize < 1 || - ysize < 1 || - zsize < 1 || - bpp < 1 || bpp > 2 || - comp < SGI_COMP_NONE || comp > SGI_COMP_ARLE) - { - free(sgip); - return (NULL); - } - - sgip->mode = SGI_WRITE; - - putshort(SGI_MAGIC, sgip->file); - putc((sgip->comp = comp) != 0, sgip->file); - putc(sgip->bpp = bpp, sgip->file); - putshort(3, sgip->file); /* Dimensions */ - putshort(sgip->xsize = xsize, sgip->file); - putshort(sgip->ysize = ysize, sgip->file); - putshort(sgip->zsize = zsize, sgip->file); - if (bpp == 1) - { - putlong(0, sgip->file); /* Minimum pixel */ - putlong(255, sgip->file); /* Maximum pixel */ - } - else - { - putlong(-32768, sgip->file); /* Minimum pixel */ - putlong(32767, sgip->file); /* Maximum pixel */ - } - putlong(0, sgip->file); /* Reserved */ - - memset(name, 0, sizeof(name)); - fwrite(name, sizeof(name), 1, sgip->file); - - for (i = 0; i < 102; i ++) - putlong(0, sgip->file); - - switch (comp) - { - case SGI_COMP_NONE : /* No compression */ - /* - * This file is uncompressed. To avoid problems with sparse files, - * we need to write blank pixels for the entire image... - */ - - if (bpp == 1) - { - for (i = xsize * ysize * zsize; i > 0; i --) - putc(0, sgip->file); - } - else - { - for (i = xsize * ysize * zsize; i > 0; i --) - putshort(0, sgip->file); - } - break; - - case SGI_COMP_ARLE : /* Aggressive RLE */ - sgip->arle_row = calloc(xsize, sizeof(unsigned short)); - sgip->arle_offset = 0; - - case SGI_COMP_RLE : /* Run-Length Encoding */ - /* - * This file is compressed; write the (blank) scanline tables... - */ - - for (i = 2 * ysize * zsize; i > 0; i --) - putlong(0, sgip->file); - - sgip->firstrow = ftell(sgip->file); - sgip->nextrow = ftell(sgip->file); - if ((sgip->table = calloc(sgip->zsize, sizeof(long *))) == NULL) - { - free(sgip); - return (NULL); - } - - if ((sgip->table[0] = calloc(sgip->ysize * sgip->zsize, - sizeof(long))) == NULL) - { - free(sgip->table); - free(sgip); - return (NULL); - } - - for (i = 1; i < sgip->zsize; i ++) - sgip->table[i] = sgip->table[0] + i * sgip->ysize; - - if ((sgip->length = calloc(sgip->zsize, sizeof(long *))) == NULL) - { - free(sgip->table); - free(sgip); - return (NULL); - } - - if ((sgip->length[0] = calloc(sgip->ysize * sgip->zsize, - sizeof(long))) == NULL) - { - free(sgip->length); - free(sgip->table); - free(sgip); - return (NULL); - } - - for (i = 1; i < sgip->zsize; i ++) - sgip->length[i] = sgip->length[0] + i * sgip->ysize; - break; - } - break; - - default : - free(sgip); - return (NULL); - } - - return (sgip); -} - - -/* - * 'sgiPutRow()' - Put a row of image data to a file. - */ - -int /* O - 0 on success, -1 on error */ -sgiPutRow(sgi_t *sgip, /* I - SGI image */ - unsigned short *row, /* I - Row to write */ - int y, /* I - Line to write */ - int z) /* I - Channel to write */ -{ - int x; /* X coordinate */ - long offset; /* File offset */ - - - if (sgip == NULL || - row == NULL || - y < 0 || y >= sgip->ysize || - z < 0 || z >= sgip->zsize) - return (-1); - - switch (sgip->comp) - { - case SGI_COMP_NONE : - /* - * Seek to the image row - optimize buffering by only seeking if - * necessary... - */ - - offset = 512 + (y + z * sgip->ysize) * sgip->xsize * sgip->bpp; - if (offset != ftell(sgip->file)) - fseek(sgip->file, offset, SEEK_SET); - - if (sgip->bpp == 1) - { - for (x = sgip->xsize; x > 0; x --, row ++) - putc(*row, sgip->file); - } - else - { - for (x = sgip->xsize; x > 0; x --, row ++) - putshort(*row, sgip->file); - } - break; - - case SGI_COMP_ARLE : - if (sgip->table[z][y] != 0) - return (-1); - - /* - * First check the last row written... - */ - - if (sgip->arle_offset > 0) - { - for (x = 0; x < sgip->xsize; x ++) - if (row[x] != sgip->arle_row[x]) - break; - - if (x == sgip->xsize) - { - sgip->table[z][y] = sgip->arle_offset; - sgip->length[z][y] = sgip->arle_length; - return (0); - } - } - - /* - * If that didn't match, search all the previous rows... - */ - - fseek(sgip->file, sgip->firstrow, SEEK_SET); - - if (sgip->bpp == 1) - { - for (;;) - { - sgip->arle_offset = ftell(sgip->file); - if ((sgip->arle_length = read_rle8(sgip->file, sgip->arle_row, sgip->xsize)) < 0) - { - x = 0; - break; - } - - if (memcmp(row, sgip->arle_row, sgip->xsize * sizeof(unsigned short)) == 0) - { - x = sgip->xsize; - break; - } - } - } - else - { - for (;;) - { - sgip->arle_offset = ftell(sgip->file); - if ((sgip->arle_length = read_rle16(sgip->file, sgip->arle_row, sgip->xsize)) < 0) - { - x = 0; - break; - } - - if (memcmp(row, sgip->arle_row, sgip->xsize * sizeof(unsigned short)) == 0) - { - x = sgip->xsize; - break; - } - } - } - - if (x == sgip->xsize) - { - sgip->table[z][y] = sgip->arle_offset; - sgip->length[z][y] = sgip->arle_length; - return (0); - } - else - fseek(sgip->file, 0, SEEK_END); /* Clear EOF */ - - case SGI_COMP_RLE : - if (sgip->table[z][y] != 0) - return (-1); - - offset = sgip->table[z][y] = sgip->nextrow; - - if (offset != ftell(sgip->file)) - fseek(sgip->file, offset, SEEK_SET); - - if (sgip->bpp == 1) - x = write_rle8(sgip->file, row, sgip->xsize); - else - x = write_rle16(sgip->file, row, sgip->xsize); - - if (sgip->comp == SGI_COMP_ARLE) - { - sgip->arle_offset = offset; - sgip->arle_length = x; - memcpy(sgip->arle_row, row, sgip->xsize * sizeof(unsigned short)); - } - - sgip->nextrow = ftell(sgip->file); - sgip->length[z][y] = x; - - return (x); - } - - return (0); -} - - -/* - * 'getlong()' - Get a 32-bit big-endian integer. - */ - -static int /* O - Long value */ -getlong(FILE *fp) /* I - File to read from */ -{ - unsigned char b[4]; /* Bytes from file */ - - - fread(b, 4, 1, fp); - return ((b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]); -} - - -/* - * 'getshort()' - Get a 16-bit big-endian integer. - */ - -static int /* O - Short value */ -getshort(FILE *fp) /* I - File to read from */ -{ - unsigned char b[2]; /* Bytes from file */ - - - fread(b, 2, 1, fp); - return ((b[0] << 8) | b[1]); -} - - -/* - * 'putlong()' - Put a 32-bit big-endian integer. - */ - -static int /* O - 0 on success, -1 on error */ -putlong(long n, /* I - Long to write */ - FILE *fp) /* I - File to write to */ -{ - if (putc(n >> 24, fp) == EOF) - return (EOF); - if (putc(n >> 16, fp) == EOF) - return (EOF); - if (putc(n >> 8, fp) == EOF) - return (EOF); - if (putc(n, fp) == EOF) - return (EOF); - else - return (0); -} - - -/* - * 'putshort()' - Put a 16-bit big-endian integer. - */ - -static int /* O - 0 on success, -1 on error */ -putshort(unsigned short n, /* I - Short to write */ - FILE *fp) /* I - File to write to */ -{ - if (putc(n >> 8, fp) == EOF) - return (EOF); - if (putc(n, fp) == EOF) - return (EOF); - else - return (0); -} - - -/* - * 'read_rle8()' - Read 8-bit RLE data. - */ - -static int /* O - Value on success, -1 on error */ -read_rle8(FILE *fp, /* I - File to read from */ - unsigned short *row, /* O - Data */ - int xsize) /* I - Width of data in pixels */ -{ - int i, /* Looping var */ - ch, /* Current character */ - count, /* RLE count */ - length; /* Number of bytes read... */ - - - length = 0; - - while (xsize > 0) - { - if ((ch = getc(fp)) == EOF) - return (-1); - length ++; - - count = ch & 127; - if (count == 0) - break; - - if (ch & 128) - { - for (i = 0; i < count; i ++, row ++, xsize --, length ++) - if (xsize > 0) - *row = getc(fp); - } - else - { - ch = getc(fp); - length ++; - for (i = 0; i < count && xsize > 0; i ++, row ++, xsize --) - *row = ch; - } - } - - return (xsize > 0 ? -1 : length); -} - - -/* - * 'read_rle16()' - Read 16-bit RLE data. - */ - -static int /* O - Value on success, -1 on error */ -read_rle16(FILE *fp, /* I - File to read from */ - unsigned short *row, /* O - Data */ - int xsize) /* I - Width of data in pixels */ -{ - int i, /* Looping var */ - ch, /* Current character */ - count, /* RLE count */ - length; /* Number of bytes read... */ - - - length = 0; - - while (xsize > 0) - { - if ((ch = getshort(fp)) == EOF) - return (-1); - length ++; - - count = ch & 127; - if (count == 0) - break; - - if (ch & 128) - { - for (i = 0; i < count; i ++, row ++, xsize --, length ++) - if (xsize > 0) - *row = getshort(fp); - } - else - { - ch = getshort(fp); - length ++; - for (i = 0; i < count && xsize > 0; i ++, row ++, xsize --) - *row = ch; - } - } - - return (xsize > 0 ? -1 : length * 2); -} - - -/* - * 'write_rle8()' - Write 8-bit RLE data. - */ - -static int /* O - Length on success, -1 on error */ -write_rle8(FILE *fp, /* I - File to write to */ - unsigned short *row, /* I - Data */ - int xsize) /* I - Width of data in pixels */ -{ - int length, /* Length in bytes */ - count, /* Number of repeating pixels */ - i, /* Looping var */ - x; /* Current column */ - unsigned short *start, /* Start of current sequence */ - repeat; /* Repeated pixel */ - - - for (x = xsize, length = 0; x > 0;) - { - start = row; - row += 2; - x -= 2; - - while (x > 0 && (row[-2] != row[-1] || row[-1] != row[0])) - { - row ++; - x --; - } - - row -= 2; - x += 2; - - count = row - start; - while (count > 0) - { - i = count > 126 ? 126 : count; - count -= i; - - if (putc(128 | i, fp) == EOF) - return (-1); - length ++; - - while (i > 0) - { - if (putc(*start, fp) == EOF) - return (-1); - start ++; - i --; - length ++; - } - } - - if (x <= 0) - break; - - start = row; - repeat = row[0]; - - row ++; - x --; - - while (x > 0 && *row == repeat) - { - row ++; - x --; - } - - count = row - start; - while (count > 0) - { - i = count > 126 ? 126 : count; - count -= i; - - if (putc(i, fp) == EOF) - return (-1); - length ++; - - if (putc(repeat, fp) == EOF) - return (-1); - length ++; - } - } - - length ++; - - if (putc(0, fp) == EOF) - return (-1); - else - return (length); -} - - -/* - * 'write_rle16()' - Write 16-bit RLE data. - */ - -static int /* O - Length in words */ -write_rle16(FILE *fp, /* I - File to write to */ - unsigned short *row, /* I - Data */ - int xsize) /* I - Width of data in pixels */ -{ - int length, /* Length in words */ - count, /* Number of repeating pixels */ - i, /* Looping var */ - x; /* Current column */ - unsigned short *start, /* Start of current sequence */ - repeat; /* Repeated pixel */ - - - for (x = xsize, length = 0; x > 0;) - { - start = row; - row += 2; - x -= 2; - - while (x > 0 && (row[-2] != row[-1] || row[-1] != row[0])) - { - row ++; - x --; - } - - row -= 2; - x += 2; - - count = row - start; - while (count > 0) - { - i = count > 126 ? 126 : count; - count -= i; - - if (putshort(128 | i, fp) == EOF) - return (-1); - length ++; - - while (i > 0) - { - if (putshort(*start, fp) == EOF) - return (-1); - start ++; - i --; - length ++; - } - } - - if (x <= 0) - break; - - start = row; - repeat = row[0]; - - row ++; - x --; - - while (x > 0 && *row == repeat) - { - row ++; - x --; - } - - count = row - start; - while (count > 0) - { - i = count > 126 ? 126 : count; - count -= i; - - if (putshort(i, fp) == EOF) - return (-1); - length ++; - - if (putshort(repeat, fp) == EOF) - return (-1); - length ++; - } - } - - length ++; - - if (putshort(0, fp) == EOF) - return (-1); - else - return (2 * length); -} - - -/* - * End of "$Id: image-sgilib.c 7221 2008-01-16 22:20:08Z mike $". - */ diff --git a/filter/image-sun.c b/filter/image-sun.c deleted file mode 100644 index 8e6c1d3d9..000000000 --- a/filter/image-sun.c +++ /dev/null @@ -1,407 +0,0 @@ -/* - * "$Id: image-sun.c 7223 2008-01-16 23:41:19Z mike $" - * - * Sun Raster image file routines for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2007 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * _cupsImageReadSunRaster() - Read a SunRaster image file. - * read_unsigned() - Read a 32-bit unsigned integer. - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" - - -#define RAS_MAGIC 0x59a66a95 - - /* Sun supported ras_type's */ -#define RT_OLD 0 /* Raw pixrect image in 68000 byte order */ -#define RT_STANDARD 1 /* Raw pixrect image in 68000 byte order */ -#define RT_BYTE_ENCODED 2 /* Run-length compression of bytes */ -#define RT_FORMAT_RGB 3 /* XRGB or RGB instead of XBGR or BGR */ -#define RT_EXPERIMENTAL 0xffff /* Reserved for testing */ - - /* Sun registered ras_maptype's */ -#define RMT_RAW 2 - /* Sun supported ras_maptype's */ -#define RMT_NONE 0 /* ras_maplength is expected to be 0 */ -#define RMT_EQUAL_RGB 1 /* red[ras_maplength/3],green[],blue[] */ - -#define RAS_RLE 0x80 - -/* - * NOTES: - * Each line of the image is rounded out to a multiple of 16 bits. - * This corresponds to the rounding convention used by the memory pixrect - * package (/usr/include/pixrect/memvar.h) of the SunWindows system. - * The ras_encoding field (always set to 0 by Sun's supported software) - * was renamed to ras_length in release 2.0. As a result, rasterfiles - * of type 0 generated by the old software claim to have 0 length; for - * compatibility, code reading rasterfiles must be prepared to compute the - * true length from the width, height, and depth fields. - */ - -/* - * Local functions... - */ - -static unsigned read_unsigned(FILE *fp); - - -/* - * '_cupsImageReadSunRaster()' - Read a SunRaster image file. - */ - -int /* O - Read status */ -_cupsImageReadSunRaster( - cups_image_t *img, /* IO - cupsImage */ - FILE *fp, /* I - cupsImage file */ - cups_icspace_t primary, /* I - Primary choice for colorspace */ - cups_icspace_t secondary, /* I - Secondary choice for colorspace */ - int saturation, /* I - Color saturation (%) */ - int hue, /* I - Color hue (degrees) */ - const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ -{ - int i, x, y, - bpp, /* Bytes per pixel */ - scanwidth, - run_count, - run_value; - cups_ib_t *in, - *out, - *scanline, - *scanptr, - *p, - bit; - unsigned ras_depth, /* depth (1, 8, or 24 bits) of pixel */ - ras_type, /* type of file; see RT_* below */ - ras_maplength; /* length (bytes) of following map */ - unsigned char cmap[3][256]; /* colormap */ - - - /* - * Read the header; we already know that this is a raster file (cupsImageOpen - * checks this) so we don't need to check the magic number again. - */ - - fputs("DEBUG: Reading Sun Raster image...\n", stderr); - - read_unsigned(fp); /* Skip magic */ - img->xsize = read_unsigned(fp); - img->ysize = read_unsigned(fp); - ras_depth = read_unsigned(fp); - /* ras_length */read_unsigned(fp); - ras_type = read_unsigned(fp); - /* ras_maptype*/read_unsigned(fp); - ras_maplength = read_unsigned(fp); - - fprintf(stderr, "DEBUG: ras_width=%d, ras_height=%d, ras_depth=%d, ras_type=%d, ras_maplength=%d\n", - img->xsize, img->ysize, ras_depth, ras_type, ras_maplength); - - if (ras_maplength > 768 || - img->xsize == 0 || img->xsize > CUPS_IMAGE_MAX_WIDTH || - img->ysize == 0 || img->ysize > CUPS_IMAGE_MAX_HEIGHT || - ras_depth == 0 || ras_depth > 32) - { - fputs("DEBUG: Raster image cannot be loaded!\n", stderr); - return (1); - } - - if (ras_maplength > 0) - { - memset(cmap[0], 255, sizeof(cmap[0])); - memset(cmap[1], 0, sizeof(cmap[1])); - memset(cmap[2], 0, sizeof(cmap[2])); - - fread(cmap[0], 1, ras_maplength / 3, fp); - fread(cmap[1], 1, ras_maplength / 3, fp); - fread(cmap[2], 1, ras_maplength / 3, fp); - } - - /* - * Compute the width of each line and allocate memory as needed... - */ - - scanwidth = (img->xsize * ras_depth + 7) / 8; - if (scanwidth & 1) - scanwidth ++; - - if (ras_depth < 24 && ras_maplength == 0) - { - img->colorspace = secondary; - in = malloc(img->xsize + 1); - } - else - { - img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; - in = malloc(img->xsize * 3 + 1); - } - - if (!in) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - fclose(fp); - return (1); - } - - bpp = cupsImageGetDepth(img); - - if ((out = malloc(img->xsize * bpp)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - fclose(fp); - free(in); - return (1); - } - - if ((scanline = malloc(scanwidth)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - fclose(fp); - free(in); - free(out); - return (1); - } - - run_count = 0; - run_value = 0; - - fprintf(stderr, "DEBUG: bpp=%d, scanwidth=%d\n", bpp, scanwidth); - - for (y = 0; y < img->ysize; y ++) - { - if ((ras_depth != 8 && ras_depth != 24) || ras_maplength > 0) - p = scanline; - else - p = in; - - if (ras_type != RT_BYTE_ENCODED) - fread(p, scanwidth, 1, fp); - else - { - for (i = scanwidth; i > 0; i --, p ++) - { - if (run_count > 0) - { - *p = run_value; - run_count --; - } - else - { - run_value = getc(fp); - - if (run_value == RAS_RLE) - { - run_count = getc(fp); - if (run_count == 0) - *p = RAS_RLE; - else - run_value = *p = getc(fp); - } - else - *p = run_value; - } - } - } - - if (ras_depth == 1 && ras_maplength == 0) - { - /* - * 1-bit B&W image... - */ - - for (x = img->xsize, bit = 128, scanptr = scanline, p = in; - x > 0; - x --, p ++) - { - if (*scanptr & bit) - *p = 255; - else - *p = 0; - - if (bit > 1) - bit >>= 1; - else - { - bit = 128; - scanptr ++; - } - } - } - else if (ras_depth == 1) - { - /* - * 1-bit colormapped image... - */ - - for (x = img->xsize, bit = 128, scanptr = scanline, p = in; - x > 0; - x --) - { - if (*scanptr & bit) - { - *p++ = cmap[0][1]; - *p++ = cmap[1][1]; - *p++ = cmap[2][1]; - } - else - { - *p++ = cmap[0][0]; - *p++ = cmap[1][0]; - *p++ = cmap[2][0]; - } - - if (bit > 1) - bit >>= 1; - else - { - bit = 128; - scanptr ++; - } - } - } - else if (ras_depth == 8 && ras_maplength > 0) - { - /* - * 8-bit colormapped image. - */ - - for (x = img->xsize, scanptr = scanline, p = in; - x > 0; - x --) - { - *p++ = cmap[0][*scanptr]; - *p++ = cmap[1][*scanptr]; - *p++ = cmap[2][*scanptr++]; - } - } - else if (ras_depth == 24 && ras_type != RT_FORMAT_RGB) - { - /* - * Convert BGR to RGB... - */ - - for (x = img->xsize, scanptr = scanline, p = in; - x > 0; - x --, scanptr += 3) - { - *p++ = scanptr[2]; - *p++ = scanptr[1]; - *p++ = scanptr[0]; - } - } - - if (ras_depth <= 8 && ras_maplength == 0) - { - if (img->colorspace == CUPS_IMAGE_WHITE) - { - if (lut) - cupsImageLut(in, img->xsize, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, in); - } - else - { - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_RGB : - cupsImageWhiteToRGB(in, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageWhiteToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageWhiteToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageWhiteToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * bpp, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - } - } - else - { - if ((saturation != 100 || hue != 0) && bpp > 1) - cupsImageRGBAdjust(in, img->xsize, saturation, hue); - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * bpp, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - } - } - - free(scanline); - free(in); - free(out); - - fclose(fp); - - return (0); -} - - -/* - * 'read_unsigned()' - Read a 32-bit unsigned integer. - */ - -static unsigned /* O - Integer from file */ -read_unsigned(FILE *fp) /* I - File to read from */ -{ - unsigned v; /* Integer from file */ - - - v = getc(fp); - v = (v << 8) | getc(fp); - v = (v << 8) | getc(fp); - v = (v << 8) | getc(fp); - - return (v); -} - - -/* - * End of "$Id: image-sun.c 7223 2008-01-16 23:41:19Z mike $". - */ diff --git a/filter/image-tiff.c b/filter/image-tiff.c deleted file mode 100644 index 8e09ee5ce..000000000 --- a/filter/image-tiff.c +++ /dev/null @@ -1,1715 +0,0 @@ -/* - * "$Id: image-tiff.c 6649 2007-07-11 21:46:42Z mike $" - * - * TIFF file routines for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2007 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * _cupsImageReadTIFF() - Read a TIFF image file. - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" - -#ifdef HAVE_LIBTIFF -# include /* TIFF image definitions */ -# include -# include - - -/* - * '_cupsImageReadTIFF()' - Read a TIFF image file. - */ - -int /* O - Read status */ -_cupsImageReadTIFF( - cups_image_t *img, /* IO - cupsImage */ - FILE *fp, /* I - cupsImage file */ - cups_icspace_t primary, /* I - Primary choice for colorspace */ - cups_icspace_t secondary, /* I - Secondary choice for colorspace */ - int saturation, /* I - Color saturation (%) */ - int hue, /* I - Color hue (degrees) */ - const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ -{ - TIFF *tif; /* TIFF file */ - uint32 width, height; /* Size of image */ - uint16 photometric, /* Colorspace */ - compression, /* Type of compression */ - orientation, /* Orientation */ - resunit, /* Units for resolution */ - samples, /* Number of samples/pixel */ - bits, /* Number of bits/pixel */ - inkset, /* Ink set for color separations */ - numinks; /* Number of inks in set */ - float xres, /* Horizontal resolution */ - yres; /* Vertical resolution */ - uint16 *redcmap, /* Red colormap information */ - *greencmap, /* Green colormap information */ - *bluecmap; /* Blue colormap information */ - int c, /* Color index */ - num_colors, /* Number of colors */ - bpp, /* Bytes per pixel */ - x, y, /* Current x & y */ - row, /* Current row in image */ - xstart, ystart, /* Starting x & y */ - xdir, ydir, /* X & y direction */ - xcount, ycount, /* X & Y counters */ - pstep, /* Pixel step (= bpp or -2 * bpp) */ - scanwidth, /* Width of scanline */ - r, g, b, k, /* Red, green, blue, and black values */ - alpha; /* cupsImage includes alpha? */ - cups_ib_t *in, /* Input buffer */ - *out, /* Output buffer */ - *p, /* Pointer into buffer */ - *scanline, /* Scanline buffer */ - *scanptr, /* Pointer into scanline buffer */ - bit, /* Current bit */ - pixel, /* Current pixel */ - zero, /* Zero value (bitmaps) */ - one; /* One value (bitmaps) */ - - - /* - * Open the TIFF file and get the required parameters... - */ - - lseek(fileno(fp), 0, SEEK_SET); /* Work around "feature" in some stdio's */ - - if ((tif = TIFFFdOpen(fileno(fp), "", "r")) == NULL) - { - fputs("DEBUG: TIFFFdOpen() failed!\n", stderr); - fclose(fp); - return (-1); - } - - if (!TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width)) - { - fputs("DEBUG: No image width tag in the file!\n", stderr); - TIFFClose(tif); - fclose(fp); - return (-1); - } - - if (!TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height)) - { - fputs("DEBUG: No image height tag in the file!\n", stderr); - TIFFClose(tif); - fclose(fp); - return (-1); - } - - if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric)) - { - fputs("DEBUG: No photometric tag in the file!\n", stderr); - TIFFClose(tif); - fclose(fp); - return (-1); - } - - if (!TIFFGetField(tif, TIFFTAG_COMPRESSION, &compression)) - { - fputs("DEBUG: No compression tag in the file!\n", stderr); - TIFFClose(tif); - fclose(fp); - return (-1); - } - - if (!TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samples)) - samples = 1; - - if (!TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bits)) - bits = 1; - - /* - * Get the image orientation... - */ - - if (!TIFFGetField(tif, TIFFTAG_ORIENTATION, &orientation)) - orientation = 0; - - /* - * Get the image resolution... - */ - - if (TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres) && - TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres) && - TIFFGetField(tif, TIFFTAG_RESOLUTIONUNIT, &resunit)) - { - if (resunit == RESUNIT_INCH) - { - img->xppi = xres; - img->yppi = yres; - } - else if (resunit == RESUNIT_CENTIMETER) - { - img->xppi = xres * 2.54; - img->yppi = yres * 2.54; - } - else - { - img->xppi = 128; - img->yppi = 128; - } - - if (img->xppi == 0 || img->yppi == 0) - { - fputs("DEBUG: Bad TIFF resolution.\n", stderr); - img->xppi = img->yppi = 128; - } - - fprintf(stderr, "DEBUG: TIFF resolution = %fx%f, units=%d\n", - xres, yres, resunit); - fprintf(stderr, "DEBUG: Stored resolution = %dx%d PPI\n", - img->xppi, img->yppi); - } - - /* - * See if the image has an alpha channel... - */ - - if (samples == 2 || (samples == 4 && photometric == PHOTOMETRIC_RGB)) - alpha = 1; - else - alpha = 0; - - /* - * Check the size of the image... - */ - - if (width == 0 || width > CUPS_IMAGE_MAX_WIDTH || - height == 0 || height > CUPS_IMAGE_MAX_HEIGHT || - (bits != 1 && bits != 2 && bits != 4 && bits != 8) || - samples < 1 || samples > 4) - { - fprintf(stderr, "DEBUG: Bad TIFF dimensions %ux%ux%ux%u!\n", - (unsigned)width, (unsigned)height, (unsigned)bits, - (unsigned)samples); - TIFFClose(tif); - fclose(fp); - return (1); - } - - /* - * Setup the image size and colorspace... - */ - - img->xsize = width; - img->ysize = height; - if (photometric == PHOTOMETRIC_MINISBLACK || - photometric == PHOTOMETRIC_MINISWHITE) - img->colorspace = secondary; - else if (photometric == PHOTOMETRIC_SEPARATED && primary == CUPS_IMAGE_RGB_CMYK) - img->colorspace = CUPS_IMAGE_CMYK; - else if (primary == CUPS_IMAGE_RGB_CMYK) - img->colorspace = CUPS_IMAGE_RGB; - else - img->colorspace = primary; - - fprintf(stderr, "DEBUG: img->colorspace = %d\n", img->colorspace); - - bpp = cupsImageGetDepth(img); - - cupsImageSetMaxTiles(img, 0); - - /* - * Set the X & Y start and direction according to the image orientation... - */ - - switch (orientation) - { - case ORIENTATION_TOPRIGHT : - fputs("DEBUG: orientation = top-right\n", stderr); - break; - case ORIENTATION_RIGHTTOP : - fputs("DEBUG: orientation = right-top\n", stderr); - break; - default : - case ORIENTATION_TOPLEFT : - fputs("DEBUG: orientation = top-left\n", stderr); - break; - case ORIENTATION_LEFTTOP : - fputs("DEBUG: orientation = left-top\n", stderr); - break; - case ORIENTATION_BOTLEFT : - fputs("DEBUG: orientation = bottom-left\n", stderr); - break; - case ORIENTATION_LEFTBOT : - fputs("DEBUG: orientation = left-bottom\n", stderr); - break; - case ORIENTATION_BOTRIGHT : - fputs("DEBUG: orientation = bottom-right\n", stderr); - break; - case ORIENTATION_RIGHTBOT : - fputs("DEBUG: orientation = right-bottom\n", stderr); - break; - } - - switch (orientation) - { - case ORIENTATION_TOPRIGHT : - case ORIENTATION_RIGHTTOP : - xstart = img->xsize - 1; - xdir = -1; - ystart = 0; - ydir = 1; - break; - default : - case ORIENTATION_TOPLEFT : - case ORIENTATION_LEFTTOP : - xstart = 0; - xdir = 1; - ystart = 0; - ydir = 1; - break; - case ORIENTATION_BOTLEFT : - case ORIENTATION_LEFTBOT : - xstart = 0; - xdir = 1; - ystart = img->ysize - 1; - ydir = -1; - break; - case ORIENTATION_BOTRIGHT : - case ORIENTATION_RIGHTBOT : - xstart = img->xsize - 1; - xdir = -1; - ystart = img->ysize - 1; - ydir = -1; - break; - } - - /* - * Allocate a scanline buffer... - */ - - scanwidth = TIFFScanlineSize(tif); - scanline = _TIFFmalloc(scanwidth); - - /* - * Allocate input and output buffers... - */ - - if (orientation < ORIENTATION_LEFTTOP) - { - if (samples > 1 || photometric == PHOTOMETRIC_PALETTE) - pstep = xdir * 3; - else - pstep = xdir; - - in = malloc(img->xsize * 3 + 3); - out = malloc(img->xsize * bpp); - } - else - { - if (samples > 1 || photometric == PHOTOMETRIC_PALETTE) - pstep = ydir * 3; - else - pstep = ydir; - - in = malloc(img->ysize * 3 + 3); - out = malloc(img->ysize * bpp); - } - - /* - * Read the image. This is greatly complicated by the fact that TIFF - * supports literally hundreds of different colorspaces and orientations, - * each which must be handled separately... - */ - - fprintf(stderr, "DEBUG: photometric = %d\n", photometric); - fprintf(stderr, "DEBUG: compression = %d\n", compression); - - switch (photometric) - { - case PHOTOMETRIC_MINISWHITE : - case PHOTOMETRIC_MINISBLACK : - if (photometric == PHOTOMETRIC_MINISWHITE) - { - zero = 255; - one = 0; - } - else - { - zero = 0; - one = 255; - } - - if (orientation < ORIENTATION_LEFTTOP) - { - /* - * Row major order... - */ - - for (y = ystart, ycount = img->ysize, row = 0; - ycount > 0; - ycount --, y += ydir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart, bit = 128; - xcount > 0; - xcount --, p += pstep) - { - if (*scanptr & bit) - *p = one; - else - *p = zero; - - if (bit > 1) - bit >>= 1; - else - { - bit = 128; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart, bit = 0xc0; - xcount > 0; - xcount --, p += pstep) - { - pixel = *scanptr & bit; - while (pixel > 3) - pixel >>= 2; - *p = (255 * pixel / 3) ^ zero; - - if (bit > 3) - bit >>= 2; - else - { - bit = 0xc0; - scanptr ++; - } - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart, bit = 0xf0; - xcount > 0; - xcount --, p += pstep) - { - if (bit == 0xf0) - { - *p = (255 * ((*scanptr & 0xf0) >> 4) / 15) ^ zero; - bit = 0x0f; - } - else - { - *p = (255 * (*scanptr & 0x0f) / 15) ^ zero; - bit = 0xf0; - scanptr ++; - } - } - } - else if (xdir < 0 || zero || alpha) - { - TIFFReadScanline(tif, scanline, row, 0); - - if (alpha) - { - if (zero) - { - for (xcount = img->xsize, p = in + xstart, scanptr = scanline; - xcount > 0; - xcount --, p += pstep, scanptr += 2) - *p = (scanptr[1] * (255 - scanptr[0]) + - (255 - scanptr[1]) * 255) / 255; - } - else - { - for (xcount = img->xsize, p = in + xstart, scanptr = scanline; - xcount > 0; - xcount --, p += pstep, scanptr += 2) - *p = (scanptr[1] * scanptr[0] + - (255 - scanptr[1]) * 255) / 255; - } - } - else - { - if (zero) - { - for (xcount = img->xsize, p = in + xstart, scanptr = scanline; - xcount > 0; - xcount --, p += pstep, scanptr ++) - *p = 255 - *scanptr; - } - else - { - for (xcount = img->xsize, p = in + xstart, scanptr = scanline; - xcount > 0; - xcount --, p += pstep, scanptr ++) - *p = *scanptr; - } - } - } - else - TIFFReadScanline(tif, in, row, 0); - - if (img->colorspace == CUPS_IMAGE_WHITE) - { - if (lut) - cupsImageLut(in, img->xsize, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, in); - } - else - { - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_RGB : - cupsImageWhiteToRGB(in, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageWhiteToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageWhiteToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageWhiteToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * bpp, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - } - } - } - else - { - /* - * Column major order... - */ - - for (x = xstart, xcount = img->xsize, row = 0; - xcount > 0; - xcount --, x += xdir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + ystart, bit = 128; - ycount > 0; - ycount --, p += ydir) - { - if (*scanptr & bit) - *p = one; - else - *p = zero; - - if (bit > 1) - bit >>= 1; - else - { - bit = 128; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + ystart, bit = 0xc0; - ycount > 0; - ycount --, p += ydir) - { - pixel = *scanptr & 0xc0; - while (pixel > 3) - pixel >>= 2; - - *p = (255 * pixel / 3) ^ zero; - - if (bit > 3) - bit >>= 2; - else - { - bit = 0xc0; - scanptr ++; - } - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + ystart, bit = 0xf0; - ycount > 0; - ycount --, p += ydir) - { - if (bit == 0xf0) - { - *p = (255 * ((*scanptr & 0xf0) >> 4) / 15) ^ zero; - bit = 0x0f; - } - else - { - *p = (255 * (*scanptr & 0x0f) / 15) ^ zero; - bit = 0xf0; - scanptr ++; - } - } - } - else if (ydir < 0 || zero || alpha) - { - TIFFReadScanline(tif, scanline, row, 0); - - if (alpha) - { - if (zero) - { - for (ycount = img->ysize, p = in + ystart, scanptr = scanline; - ycount > 0; - ycount --, p += ydir, scanptr += 2) - *p = (scanptr[1] * (255 - scanptr[0]) + - (255 - scanptr[1]) * 255) / 255; - } - else - { - for (ycount = img->ysize, p = in + ystart, scanptr = scanline; - ycount > 0; - ycount --, p += ydir, scanptr += 2) - *p = (scanptr[1] * scanptr[0] + - (255 - scanptr[1]) * 255) / 255; - } - } - else - { - if (zero) - { - for (ycount = img->ysize, p = in + ystart, scanptr = scanline; - ycount > 0; - ycount --, p += ydir, scanptr ++) - *p = 255 - *scanptr; - } - else - { - for (ycount = img->ysize, p = in + ystart, scanptr = scanline; - ycount > 0; - ycount --, p += ydir, scanptr ++) - *p = *scanptr; - } - } - } - else - TIFFReadScanline(tif, in, row, 0); - - if (img->colorspace == CUPS_IMAGE_WHITE) - { - if (lut) - cupsImageLut(in, img->ysize, lut); - - _cupsImagePutCol(img, x, 0, img->ysize, in); - } - else - { - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_RGB : - cupsImageWhiteToRGB(in, out, img->ysize); - break; - case CUPS_IMAGE_BLACK : - cupsImageWhiteToBlack(in, out, img->ysize); - break; - case CUPS_IMAGE_CMY : - cupsImageWhiteToCMY(in, out, img->ysize); - break; - case CUPS_IMAGE_CMYK : - cupsImageWhiteToCMYK(in, out, img->ysize); - break; - } - - if (lut) - cupsImageLut(out, img->ysize * bpp, lut); - - _cupsImagePutCol(img, x, 0, img->ysize, out); - } - } - } - break; - - case PHOTOMETRIC_PALETTE : - if (!TIFFGetField(tif, TIFFTAG_COLORMAP, &redcmap, &greencmap, &bluecmap)) - { - fputs("DEBUG: No colormap tag in the file!\n", stderr); - fclose(fp); - return (-1); - } - - num_colors = 1 << bits; - - for (c = 0; c < num_colors; c ++) - { - redcmap[c] >>= 8; - greencmap[c] >>= 8; - bluecmap[c] >>= 8; - } - - if (orientation < ORIENTATION_LEFTTOP) - { - /* - * Row major order... - */ - - for (y = ystart, ycount = img->ysize, row = 0; - ycount > 0; - ycount --, y += ydir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, - p = in + xstart * 3, bit = 128; - xcount > 0; - xcount --, p += pstep) - { - if (*scanptr & bit) - { - p[0] = redcmap[1]; - p[1] = greencmap[1]; - p[2] = bluecmap[1]; - } - else - { - p[0] = redcmap[0]; - p[1] = greencmap[0]; - p[2] = bluecmap[0]; - } - - if (bit > 1) - bit >>= 1; - else - { - bit = 128; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, - p = in + xstart * 3, bit = 0xc0; - xcount > 0; - xcount --, p += pstep) - { - pixel = *scanptr & bit; - while (pixel > 3) - pixel >>= 2; - - p[0] = redcmap[pixel]; - p[1] = greencmap[pixel]; - p[2] = bluecmap[pixel]; - - if (bit > 3) - bit >>= 2; - else - { - bit = 0xc0; - scanptr ++; - } - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, - p = in + 3 * xstart, bit = 0xf0; - xcount > 0; - xcount --, p += pstep) - { - if (bit == 0xf0) - { - pixel = (*scanptr & 0xf0) >> 4; - p[0] = redcmap[pixel]; - p[1] = greencmap[pixel]; - p[2] = bluecmap[pixel]; - bit = 0x0f; - } - else - { - pixel = *scanptr++ & 0x0f; - p[0] = redcmap[pixel]; - p[1] = greencmap[pixel]; - p[2] = bluecmap[pixel]; - bit = 0xf0; - } - } - } - else - { - TIFFReadScanline(tif, scanline, row, 0); - - for (xcount = img->xsize, p = in + 3 * xstart, scanptr = scanline; - xcount > 0; - xcount --, p += pstep) - { - p[0] = redcmap[*scanptr]; - p[1] = greencmap[*scanptr]; - p[2] = bluecmap[*scanptr++]; - } - } - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->xsize); - break; - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(in, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * bpp, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - } - } - else - { - /* - * Column major order... - */ - - for (x = xstart, xcount = img->xsize, row = 0; - xcount > 0; - xcount --, x += xdir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, - p = in + 3 * ystart, bit = 128; - ycount > 0; - ycount --, p += ydir) - { - if (*scanptr & bit) - { - p[0] = redcmap[1]; - p[1] = greencmap[1]; - p[2] = bluecmap[1]; - } - else - { - p[0] = redcmap[0]; - p[1] = greencmap[0]; - p[2] = bluecmap[0]; - } - - if (bit > 1) - bit >>= 1; - else - { - bit = 128; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, - p = in + 3 * ystart, bit = 0xc0; - ycount > 0; - ycount --, p += ydir) - { - pixel = *scanptr & 0xc0; - while (pixel > 3) - pixel >>= 2; - - p[0] = redcmap[pixel]; - p[1] = greencmap[pixel]; - p[2] = bluecmap[pixel]; - - if (bit > 3) - bit >>= 2; - else - { - bit = 0xc0; - scanptr ++; - } - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, - p = in + 3 * ystart, bit = 0xf0; - ycount > 0; - ycount --, p += ydir) - { - if (bit == 0xf0) - { - pixel = (*scanptr & 0xf0) >> 4; - p[0] = redcmap[pixel]; - p[1] = greencmap[pixel]; - p[2] = bluecmap[pixel]; - bit = 0x0f; - } - else - { - pixel = *scanptr++ & 0x0f; - p[0] = redcmap[pixel]; - p[1] = greencmap[pixel]; - p[2] = bluecmap[pixel]; - bit = 0xf0; - } - } - } - else - { - TIFFReadScanline(tif, scanline, row, 0); - - for (ycount = img->ysize, p = in + 3 * ystart, scanptr = scanline; - ycount > 0; - ycount --, p += ydir) - { - p[0] = redcmap[*scanptr]; - p[1] = greencmap[*scanptr]; - p[2] = bluecmap[*scanptr++]; - } - } - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->ysize); - break; - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(in, out, img->ysize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->ysize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->ysize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->ysize); - break; - } - - if (lut) - cupsImageLut(out, img->ysize * bpp, lut); - - _cupsImagePutCol(img, x, 0, img->ysize, out); - } - } - break; - - case PHOTOMETRIC_RGB : - if (orientation < ORIENTATION_LEFTTOP) - { - /* - * Row major order... - */ - - for (y = ystart, ycount = img->ysize, row = 0; - ycount > 0; - ycount --, y += ydir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3, bit = 0xf0; - xcount > 0; - xcount --, p += pstep) - { - if (*scanptr & bit & 0x88) - p[0] = 255; - else - p[0] = 0; - - if (*scanptr & bit & 0x44) - p[1] = 255; - else - p[1] = 0; - - if (*scanptr & bit & 0x22) - p[2] = 255; - else - p[2] = 0; - - if (bit == 0xf0) - bit = 0x0f; - else - { - bit = 0xf0; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3; - xcount > 0; - xcount --, p += pstep, scanptr ++) - { - pixel = *scanptr >> 2; - p[0] = 255 * (pixel & 3) / 3; - pixel >>= 2; - p[1] = 255 * (pixel & 3) / 3; - pixel >>= 2; - p[2] = 255 * (pixel & 3) / 3; - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3; - xcount > 0; - xcount -= 2, p += 2 * pstep, scanptr += 3) - { - pixel = scanptr[0]; - p[1] = 255 * (pixel & 15) / 15; - pixel >>= 4; - p[0] = 255 * (pixel & 15) / 15; - pixel = scanptr[1]; - p[2] = 255 * ((pixel >> 4) & 15) / 15; - - if (xcount > 1) - { - p[pstep + 0] = 255 * (pixel & 15) / 15; - pixel = scanptr[2]; - p[pstep + 2] = 255 * (pixel & 15) / 15; - pixel >>= 4; - p[pstep + 1] = 255 * (pixel & 15) / 15; - } - } - } - else if (xdir < 0 || alpha) - { - TIFFReadScanline(tif, scanline, row, 0); - - if (alpha) - { - for (xcount = img->xsize, p = in + xstart * 3, scanptr = scanline; - xcount > 0; - xcount --, p += pstep, scanptr += 4) - { - p[0] = (scanptr[0] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; - p[1] = (scanptr[1] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; - p[2] = (scanptr[2] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; - } - } - else - { - for (xcount = img->xsize, p = in + xstart * 3, scanptr = scanline; - xcount > 0; - xcount --, p += pstep, scanptr += 3) - { - p[0] = scanptr[0]; - p[1] = scanptr[1]; - p[2] = scanptr[2]; - } - } - } - else - TIFFReadScanline(tif, in, row, 0); - - if ((saturation != 100 || hue != 0) && bpp > 1) - cupsImageRGBAdjust(in, img->xsize, saturation, hue); - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->xsize); - break; - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(in, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * bpp, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - } - } - else - { - /* - * Column major order... - */ - - for (x = xstart, xcount = img->xsize, row = 0; - xcount > 0; - xcount --, x += xdir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + ystart * 3, bit = 0xf0; - ycount > 0; - ycount --, p += pstep) - { - if (*scanptr & bit & 0x88) - p[0] = 255; - else - p[0] = 0; - - if (*scanptr & bit & 0x44) - p[1] = 255; - else - p[1] = 0; - - if (*scanptr & bit & 0x22) - p[2] = 255; - else - p[2] = 0; - - if (bit == 0xf0) - bit = 0x0f; - else - { - bit = 0xf0; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + ystart * 3; - ycount > 0; - ycount --, p += pstep, scanptr ++) - { - pixel = *scanptr >> 2; - p[0] = 255 * (pixel & 3) / 3; - pixel >>= 2; - p[1] = 255 * (pixel & 3) / 3; - pixel >>= 2; - p[2] = 255 * (pixel & 3) / 3; - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + ystart * 3; - ycount > 0; - ycount -= 2, p += 2 * pstep, scanptr += 3) - { - pixel = scanptr[0]; - p[1] = 255 * (pixel & 15) / 15; - pixel >>= 4; - p[0] = 255 * (pixel & 15) / 15; - pixel = scanptr[1]; - p[2] = 255 * ((pixel >> 4) & 15) / 15; - - if (ycount > 1) - { - p[pstep + 0] = 255 * (pixel & 15) / 15; - pixel = scanptr[2]; - p[pstep + 2] = 255 * (pixel & 15) / 15; - pixel >>= 4; - p[pstep + 1] = 255 * (pixel & 15) / 15; - } - } - } - else if (ydir < 0 || alpha) - { - TIFFReadScanline(tif, scanline, row, 0); - - if (alpha) - { - for (ycount = img->ysize, p = in + ystart * 3, scanptr = scanline; - ycount > 0; - ycount --, p += pstep, scanptr += 4) - { - p[0] = (scanptr[0] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; - p[1] = (scanptr[1] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; - p[2] = (scanptr[2] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; - } - } - else - { - for (ycount = img->ysize, p = in + ystart * 3, scanptr = scanline; - ycount > 0; - ycount --, p += pstep, scanptr += 3) - { - p[0] = scanptr[0]; - p[1] = scanptr[1]; - p[2] = scanptr[2]; - } - } - } - else - TIFFReadScanline(tif, in, row, 0); - - if ((saturation != 100 || hue != 0) && bpp > 1) - cupsImageRGBAdjust(in, img->ysize, saturation, hue); - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->ysize); - break; - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(in, out, img->ysize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->ysize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->ysize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->ysize); - break; - } - - if (lut) - cupsImageLut(out, img->ysize * bpp, lut); - - _cupsImagePutCol(img, x, 0, img->ysize, out); - } - } - break; - - case PHOTOMETRIC_SEPARATED : - inkset = INKSET_CMYK; - numinks = 4; - -#ifdef TIFFTAG_NUMBEROFINKS - if (!TIFFGetField(tif, TIFFTAG_INKSET, &inkset) && - !TIFFGetField(tif, TIFFTAG_NUMBEROFINKS, &numinks)) -#else - if (!TIFFGetField(tif, TIFFTAG_INKSET, &inkset)) -#endif /* TIFFTAG_NUMBEROFINKS */ - { - fputs("WARNING: No inkset or number-of-inks tag in the file!\n", stderr); - } - - if (inkset == INKSET_CMYK || numinks == 4) - { - if (orientation < ORIENTATION_LEFTTOP) - { - /* - * Row major order... - */ - - for (y = ystart, ycount = img->ysize, row = 0; - ycount > 0; - ycount --, y += ydir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3, bit = 0xf0; - xcount > 0; - xcount --, p += pstep) - { - if (*scanptr & bit & 0x11) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - if (*scanptr & bit & 0x88) - p[0] = 0; - else - p[0] = 255; - - if (*scanptr & bit & 0x44) - p[1] = 0; - else - p[1] = 255; - - if (*scanptr & bit & 0x22) - p[2] = 0; - else - p[2] = 255; - } - - if (bit == 0xf0) - bit = 0x0f; - else - { - bit = 0xf0; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3; - xcount > 0; - xcount --, p += pstep, scanptr ++) - { - pixel = *scanptr; - k = 255 * (pixel & 3) / 3; - if (k == 255) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - pixel >>= 2; - b = 255 - 255 * (pixel & 3) / 3 - k; - if (b < 0) - p[2] = 0; - else if (b < 256) - p[2] = b; - else - p[2] = 255; - - pixel >>= 2; - g = 255 - 255 * (pixel & 3) / 3 - k; - if (g < 0) - p[1] = 0; - else if (g < 256) - p[1] = g; - else - p[1] = 255; - - pixel >>= 2; - r = 255 - 255 * (pixel & 3) / 3 - k; - if (r < 0) - p[0] = 0; - else if (r < 256) - p[0] = r; - else - p[0] = 255; - } - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3; - xcount > 0; - xcount --, p += pstep, scanptr += 2) - { - pixel = scanptr[1]; - k = 255 * (pixel & 15) / 15; - if (k == 255) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - pixel >>= 4; - b = 255 - 255 * (pixel & 15) / 15 - k; - if (b < 0) - p[2] = 0; - else if (b < 256) - p[2] = b; - else - p[2] = 255; - - pixel = scanptr[0]; - g = 255 - 255 * (pixel & 15) / 15 - k; - if (g < 0) - p[1] = 0; - else if (g < 256) - p[1] = g; - else - p[1] = 255; - - pixel >>= 4; - r = 255 - 255 * (pixel & 15) / 15 - k; - if (r < 0) - p[0] = 0; - else if (r < 256) - p[0] = r; - else - p[0] = 255; - } - } - } - else if (img->colorspace == CUPS_IMAGE_CMYK) - { - TIFFReadScanline(tif, scanline, row, 0); - _cupsImagePutRow(img, 0, y, img->xsize, scanline); - } - else - { - TIFFReadScanline(tif, scanline, row, 0); - - for (xcount = img->xsize, p = in + xstart * 3, scanptr = scanline; - xcount > 0; - xcount --, p += pstep, scanptr += 4) - { - k = scanptr[3]; - if (k == 255) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - r = 255 - scanptr[0] - k; - if (r < 0) - p[0] = 0; - else if (r < 256) - p[0] = r; - else - p[0] = 255; - - g = 255 - scanptr[1] - k; - if (g < 0) - p[1] = 0; - else if (g < 256) - p[1] = g; - else - p[1] = 255; - - b = 255 - scanptr[2] - k; - if (b < 0) - p[2] = 0; - else if (b < 256) - p[2] = b; - else - p[2] = 255; - } - } - } - - if ((saturation != 100 || hue != 0) && bpp > 1) - cupsImageRGBAdjust(in, img->xsize, saturation, hue); - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->xsize); - break; - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(in, out, img->xsize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->xsize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->xsize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->xsize); - break; - } - - if (lut) - cupsImageLut(out, img->xsize * 3, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - } - } - else - { - /* - * Column major order... - */ - - for (x = xstart, xcount = img->xsize, row = 0; - xcount > 0; - xcount --, x += xdir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + xstart * 3, bit = 0xf0; - ycount > 0; - ycount --, p += pstep) - { - if (*scanptr & bit & 0x11) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - if (*scanptr & bit & 0x88) - p[0] = 0; - else - p[0] = 255; - - if (*scanptr & bit & 0x44) - p[1] = 0; - else - p[1] = 255; - - if (*scanptr & bit & 0x22) - p[2] = 0; - else - p[2] = 255; - } - - if (bit == 0xf0) - bit = 0x0f; - else - { - bit = 0xf0; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + xstart * 3; - ycount > 0; - ycount --, p += pstep, scanptr ++) - { - pixel = *scanptr; - k = 255 * (pixel & 3) / 3; - if (k == 255) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - pixel >>= 2; - b = 255 - 255 * (pixel & 3) / 3 - k; - if (b < 0) - p[2] = 0; - else if (b < 256) - p[2] = b; - else - p[2] = 255; - - pixel >>= 2; - g = 255 - 255 * (pixel & 3) / 3 - k; - if (g < 0) - p[1] = 0; - else if (g < 256) - p[1] = g; - else - p[1] = 255; - - pixel >>= 2; - r = 255 - 255 * (pixel & 3) / 3 - k; - if (r < 0) - p[0] = 0; - else if (r < 256) - p[0] = r; - else - p[0] = 255; - } - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + xstart * 3; - ycount > 0; - ycount --, p += pstep, scanptr += 2) - { - pixel = scanptr[1]; - k = 255 * (pixel & 15) / 15; - if (k == 255) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - pixel >>= 4; - b = 255 - 255 * (pixel & 15) / 15 - k; - if (b < 0) - p[2] = 0; - else if (b < 256) - p[2] = b; - else - p[2] = 255; - - pixel = scanptr[0]; - g = 255 - 255 * (pixel & 15) / 15 - k; - if (g < 0) - p[1] = 0; - else if (g < 256) - p[1] = g; - else - p[1] = 255; - - pixel >>= 4; - r = 255 - 255 * (pixel & 15) / 15 - k; - if (r < 0) - p[0] = 0; - else if (r < 256) - p[0] = r; - else - p[0] = 255; - } - } - } - else if (img->colorspace == CUPS_IMAGE_CMYK) - { - TIFFReadScanline(tif, scanline, row, 0); - _cupsImagePutCol(img, x, 0, img->ysize, scanline); - } - else - { - TIFFReadScanline(tif, scanline, row, 0); - - for (ycount = img->ysize, p = in + xstart * 3, scanptr = scanline; - ycount > 0; - ycount --, p += pstep, scanptr += 4) - { - k = scanptr[3]; - if (k == 255) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - r = 255 - scanptr[0] - k; - if (r < 0) - p[0] = 0; - else if (r < 256) - p[0] = r; - else - p[0] = 255; - - g = 255 - scanptr[1] - k; - if (g < 0) - p[1] = 0; - else if (g < 256) - p[1] = g; - else - p[1] = 255; - - b = 255 - scanptr[2] - k; - if (b < 0) - p[2] = 0; - else if (b < 256) - p[2] = b; - else - p[2] = 255; - } - } - } - - if ((saturation != 100 || hue != 0) && bpp > 1) - cupsImageRGBAdjust(in, img->ysize, saturation, hue); - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->ysize); - break; - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(in, out, img->ysize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->ysize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->ysize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->ysize); - break; - } - - if (lut) - cupsImageLut(out, img->ysize * bpp, lut); - - _cupsImagePutCol(img, x, 0, img->ysize, out); - } - } - - break; - } - - default : - _TIFFfree(scanline); - free(in); - free(out); - - TIFFClose(tif); - fputs("DEBUG: Unknown TIFF photometric value!\n", stderr); - return (-1); - } - - /* - * Free temporary buffers, close the TIFF file, and return. - */ - - _TIFFfree(scanline); - free(in); - free(out); - - TIFFClose(tif); - return (0); -} -#endif /* HAVE_LIBTIFF */ - - -/* - * End of "$Id: image-tiff.c 6649 2007-07-11 21:46:42Z mike $". - */ diff --git a/filter/image-zoom.c b/filter/image-zoom.c deleted file mode 100644 index c631a5021..000000000 --- a/filter/image-zoom.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * "$Id: image-zoom.c 6649 2007-07-11 21:46:42Z mike $" - * - * cupsImage zoom routines for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2006 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * _cupsImageZoomDelete() - Free a zoom record... - * _cupsImageZoomFill() - Fill a zoom record... - * _cupsImageZoomNew() - Allocate a pixel zoom record... - * zoom_bilinear() - Fill a zoom record with image data utilizing - * bilinear interpolation. - * zoom_nearest() - Fill a zoom record quickly using nearest-neighbor - * sampling. - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" - - -/* - * Local functions... - */ - -static void zoom_bilinear(cups_izoom_t *z, int iy); -static void zoom_nearest(cups_izoom_t *z, int iy); - - -/* - * '_cupsImageZoomDelete()' - Free a zoom record... - */ - -void -_cupsImageZoomDelete(cups_izoom_t *z) /* I - Zoom record to free */ -{ - free(z->rows[0]); - free(z->rows[1]); - free(z->in); - free(z); -} - - -/* - * '_cupsImageZoomFill()' - Fill a zoom record with image data utilizing bilinear - * interpolation. - */ - -void -_cupsImageZoomFill(cups_izoom_t *z, /* I - Zoom record to fill */ - int iy) /* I - Zoom image row */ -{ - switch (z->type) - { - case CUPS_IZOOM_FAST : - zoom_nearest(z, iy); - break; - - default : - zoom_bilinear(z, iy); - break; - } -} - - -/* - * '_cupsImageZoomNew()' - Allocate a pixel zoom record... - */ - -cups_izoom_t * -_cupsImageZoomNew( - cups_image_t *img, /* I - cupsImage to zoom */ - int xc0, /* I - Upper-lefthand corner */ - int yc0, /* I - ... */ - int xc1, /* I - Lower-righthand corner */ - int yc1, /* I - ... */ - int xsize, /* I - Final width of image */ - int ysize, /* I - Final height of image */ - int rotated, /* I - Non-zero if image is rotated 90 degs */ - cups_iztype_t type) /* I - Zoom type */ -{ - cups_izoom_t *z; /* New zoom record */ - int flip; /* Flip on X axis? */ - - - if (xsize > CUPS_IMAGE_MAX_WIDTH || - ysize > CUPS_IMAGE_MAX_HEIGHT || - (xc1 - xc0) > CUPS_IMAGE_MAX_WIDTH || - (yc1 - yc0) > CUPS_IMAGE_MAX_HEIGHT) - return (NULL); /* Protect against integer overflow */ - - if ((z = (cups_izoom_t *)calloc(1, sizeof(cups_izoom_t))) == NULL) - return (NULL); - - z->img = img; - z->row = 0; - z->depth = cupsImageGetDepth(img); - z->rotated = rotated; - z->type = type; - - if (xsize < 0) - { - flip = 1; - xsize = -xsize; - } - else - { - flip = 0; - } - - if (rotated) - { - z->xorig = xc1; - z->yorig = yc0; - z->width = yc1 - yc0 + 1; - z->height = xc1 - xc0 + 1; - z->xsize = xsize; - z->ysize = ysize; - z->xmod = z->width % z->xsize; - z->xstep = z->width / z->xsize; - z->xincr = 1; - z->ymod = z->height % z->ysize; - z->ystep = z->height / z->ysize; - z->yincr = 1; - z->instep = z->xstep * z->depth; - z->inincr = /* z->xincr * */ z->depth; /* z->xincr is always 1 */ - - if (z->width < img->ysize) - z->xmax = z->width; - else - z->xmax = z->width - 1; - - if (z->height < img->xsize) - z->ymax = z->height; - else - z->ymax = z->height - 1; - } - else - { - z->xorig = xc0; - z->yorig = yc0; - z->width = xc1 - xc0 + 1; - z->height = yc1 - yc0 + 1; - z->xsize = xsize; - z->ysize = ysize; - z->xmod = z->width % z->xsize; - z->xstep = z->width / z->xsize; - z->xincr = 1; - z->ymod = z->height % z->ysize; - z->ystep = z->height / z->ysize; - z->yincr = 1; - z->instep = z->xstep * z->depth; - z->inincr = /* z->xincr * */ z->depth; /* z->xincr is always 1 */ - - if (z->width < img->xsize) - z->xmax = z->width; - else - z->xmax = z->width - 1; - - if (z->height < img->ysize) - z->ymax = z->height; - else - z->ymax = z->height - 1; - } - - if (flip) - { - z->instep = -z->instep; - z->inincr = -z->inincr; - } - - if ((z->rows[0] = (cups_ib_t *)malloc(z->xsize * z->depth)) == NULL) - { - free(z); - return (NULL); - } - - if ((z->rows[1] = (cups_ib_t *)malloc(z->xsize * z->depth)) == NULL) - { - free(z->rows[0]); - free(z); - return (NULL); - } - - if ((z->in = (cups_ib_t *)malloc(z->width * z->depth)) == NULL) - { - free(z->rows[0]); - free(z->rows[1]); - free(z); - return (NULL); - } - - return (z); -} - - -/* - * 'zoom_bilinear()' - Fill a zoom record with image data utilizing bilinear - * interpolation. - */ - -static void -zoom_bilinear(cups_izoom_t *z, /* I - Zoom record to fill */ - int iy) /* I - Zoom image row */ -{ - cups_ib_t *r, /* Row pointer */ - *inptr; /* Pixel pointer */ - int xerr0, /* X error counter */ - xerr1; /* ... */ - int ix, - x, - count, - z_depth, - z_xstep, - z_xincr, - z_instep, - z_inincr, - z_xmax, - z_xmod, - z_xsize; - - - if (iy > z->ymax) - iy = z->ymax; - - z->row ^= 1; - - z_depth = z->depth; - z_xsize = z->xsize; - z_xmax = z->xmax; - z_xmod = z->xmod; - z_xstep = z->xstep; - z_xincr = z->xincr; - z_instep = z->instep; - z_inincr = z->inincr; - - if (z->rotated) - cupsImageGetCol(z->img, z->xorig - iy, z->yorig, z->width, z->in); - else - cupsImageGetRow(z->img, z->xorig, z->yorig + iy, z->width, z->in); - - if (z_inincr < 0) - inptr = z->in + (z->width - 1) * z_depth; - else - inptr = z->in; - - for (x = z_xsize, xerr0 = z_xsize, xerr1 = 0, ix = 0, r = z->rows[z->row]; - x > 0; - x --) - { - if (ix < z_xmax) - { - for (count = 0; count < z_depth; count ++) - *r++ = (inptr[count] * xerr0 + inptr[z_depth + count] * xerr1) / z_xsize; - } - else - { - for (count = 0; count < z_depth; count ++) - *r++ = inptr[count]; - } - - ix += z_xstep; - inptr += z_instep; - xerr0 -= z_xmod; - xerr1 += z_xmod; - - if (xerr0 <= 0) - { - xerr0 += z_xsize; - xerr1 -= z_xsize; - ix += z_xincr; - inptr += z_inincr; - } - } -} - - -/* - * 'zoom_nearest()' - Fill a zoom record quickly using nearest-neighbor - * sampling. - */ - -static void -zoom_nearest(cups_izoom_t *z, /* I - Zoom record to fill */ - int iy) /* I - Zoom image row */ -{ - cups_ib_t *r, /* Row pointer */ - *inptr; /* Pixel pointer */ - int xerr0; /* X error counter */ - int ix, - x, - count, - z_depth, - z_xstep, - z_xincr, - z_instep, - z_inincr, - z_xmod, - z_xsize; - - - if (iy > z->ymax) - iy = z->ymax; - - z->row ^= 1; - - z_depth = z->depth; - z_xsize = z->xsize; - z_xmod = z->xmod; - z_xstep = z->xstep; - z_xincr = z->xincr; - z_instep = z->instep; - z_inincr = z->inincr; - - if (z->rotated) - cupsImageGetCol(z->img, z->xorig - iy, z->yorig, z->width, z->in); - else - cupsImageGetRow(z->img, z->xorig, z->yorig + iy, z->width, z->in); - - if (z_inincr < 0) - inptr = z->in + (z->width - 1) * z_depth; - else - inptr = z->in; - - for (x = z_xsize, xerr0 = z_xsize, ix = 0, r = z->rows[z->row]; - x > 0; - x --) - { - for (count = 0; count < z_depth; count ++) - *r++ = inptr[count]; - - ix += z_xstep; - inptr += z_instep; - xerr0 -= z_xmod; - - if (xerr0 <= 0) - { - xerr0 += z_xsize; - ix += z_xincr; - inptr += z_inincr; - } - } -} - - -/* - * End of "$Id: image-zoom.c 6649 2007-07-11 21:46:42Z mike $". - */ diff --git a/filter/image.c b/filter/image.c deleted file mode 100644 index b00275c26..000000000 --- a/filter/image.c +++ /dev/null @@ -1,813 +0,0 @@ -/* - * "$Id: image.c 7473 2008-04-21 17:51:58Z mike $" - * - * Base image support for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * cupsImageClose() - Close an image file. - * cupsImageGetCol() - Get a column of pixels from an image. - * cupsImageGetColorSpace() - Get the image colorspace. - * cupsImageGetDepth() - Get the number of bytes per pixel. - * cupsImageGetHeight() - Get the height of an image. - * cupsImageGetRow() - Get a row of pixels from an image. - * cupsImageGetWidth() - Get the width of an image. - * cupsImageGetXPPI() - Get the horizontal resolution of an image. - * cupsImageGetYPPI() - Get the vertical resolution of an image. - * cupsImageOpen() - Open an image file and read it into memory. - * _cupsImagePutCol() - Put a column of pixels to an image. - * _cupsImagePutRow() - Put a row of pixels to an image. - * cupsImageSetMaxTiles() - Set the maximum number of tiles to cache. - * flush_tile() - Flush the least-recently-used tile in the cache. - * get_tile() - Get a cached tile. - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" - - -/* - * Local functions... - */ - -static void flush_tile(cups_image_t *img); -static cups_ib_t *get_tile(cups_image_t *img, int x, int y); - - -/* - * 'cupsImageClose()' - Close an image file. - */ - -void -cupsImageClose(cups_image_t *img) /* I - Image to close */ -{ - cups_ic_t *current, /* Current cached tile */ - *next; /* Next cached tile */ - - - /* - * Wipe the tile cache file (if any)... - */ - - if (img->cachefile >= 0) - { - DEBUG_printf(("Closing/removing swap file \"%s\"...\n", img->cachename)); - - close(img->cachefile); - unlink(img->cachename); - } - - /* - * Free the image cache... - */ - - DEBUG_puts("Freeing memory..."); - - for (current = img->first, next = NULL; current != NULL; current = next) - { - DEBUG_printf(("Freeing cache (%p, next = %p)...\n", current, next)); - - next = current->next; - free(current); - } - - /* - * Free the rest of memory... - */ - - if (img->tiles != NULL) - { - DEBUG_printf(("Freeing tiles (%p)...\n", img->tiles[0])); - - free(img->tiles[0]); - - DEBUG_printf(("Freeing tile pointers (%p)...\n", img->tiles)); - - free(img->tiles); - } - - free(img); -} - - -/* - * 'cupsImageGetCol()' - Get a column of pixels from an image. - */ - -int /* O - -1 on error, 0 on success */ -cupsImageGetCol(cups_image_t *img, /* I - Image */ - int x, /* I - Column */ - int y, /* I - Start row */ - int height, /* I - Column height */ - cups_ib_t *pixels) /* O - Pixel data */ -{ - int bpp, /* Bytes per pixel */ - twidth, /* Tile width */ - count; /* Number of pixels to get */ - const cups_ib_t *ib; /* Pointer into tile */ - - - if (img == NULL || x < 0 || x >= img->xsize || y >= img->ysize) - return (-1); - - if (y < 0) - { - height += y; - y = 0; - } - - if ((y + height) > img->ysize) - height = img->ysize - y; - - if (height < 1) - return (-1); - - bpp = cupsImageGetDepth(img); - twidth = bpp * (CUPS_TILE_SIZE - 1); - - while (height > 0) - { - ib = get_tile(img, x, y); - - if (ib == NULL) - return (-1); - - count = CUPS_TILE_SIZE - (y & (CUPS_TILE_SIZE - 1)); - if (count > height) - count = height; - - y += count; - height -= count; - - for (; count > 0; count --, ib += twidth) - switch (bpp) - { - case 4 : - *pixels++ = *ib++; - case 3 : - *pixels++ = *ib++; - *pixels++ = *ib++; - case 1 : - *pixels++ = *ib++; - break; - } - } - - return (0); -} - - -/* - * 'cupsImageGetColorSpace()' - Get the image colorspace. - */ - -cups_icspace_t /* O - Colorspace */ -cupsImageGetColorSpace( - cups_image_t *img) /* I - Image */ -{ - return (img->colorspace); -} - - -/* - * 'cupsImageGetDepth()' - Get the number of bytes per pixel. - */ - -int /* O - Bytes per pixel */ -cupsImageGetDepth(cups_image_t *img) /* I - Image */ -{ - return (abs(img->colorspace)); -} - - -/* - * 'cupsImageGetHeight()' - Get the height of an image. - */ - -unsigned /* O - Height in pixels */ -cupsImageGetHeight(cups_image_t *img) /* I - Image */ -{ - return (img->ysize); -} - - -/* - * 'cupsImageGetRow()' - Get a row of pixels from an image. - */ - -int /* O - -1 on error, 0 on success */ -cupsImageGetRow(cups_image_t *img, /* I - Image */ - int x, /* I - Start column */ - int y, /* I - Row */ - int width, /* I - Width of row */ - cups_ib_t *pixels) /* O - Pixel data */ -{ - int bpp, /* Bytes per pixel */ - count; /* Number of pixels to get */ - const cups_ib_t *ib; /* Pointer to pixels */ - - - if (img == NULL || y < 0 || y >= img->ysize || x >= img->xsize) - return (-1); - - if (x < 0) - { - width += x; - x = 0; - } - - if ((x + width) > img->xsize) - width = img->xsize - x; - - if (width < 1) - return (-1); - - bpp = img->colorspace < 0 ? -img->colorspace : img->colorspace; - - while (width > 0) - { - ib = get_tile(img, x, y); - - if (ib == NULL) - return (-1); - - count = CUPS_TILE_SIZE - (x & (CUPS_TILE_SIZE - 1)); - if (count > width) - count = width; - memcpy(pixels, ib, count * bpp); - pixels += count * bpp; - x += count; - width -= count; - } - - return (0); -} - - -/* - * 'cupsImageGetWidth()' - Get the width of an image. - */ - -unsigned /* O - Width in pixels */ -cupsImageGetWidth(cups_image_t *img) /* I - Image */ -{ - return (img->xsize); -} - - -/* - * 'cupsImageGetXPPI()' - Get the horizontal resolution of an image. - */ - -unsigned /* O - Horizontal PPI */ -cupsImageGetXPPI(cups_image_t *img) /* I - Image */ -{ - return (img->xppi); -} - - -/* - * 'cupsImageGetYPPI()' - Get the vertical resolution of an image. - */ - -unsigned /* O - Vertical PPI */ -cupsImageGetYPPI(cups_image_t *img) /* I - Image */ -{ - return (img->yppi); -} - - -/* - * 'cupsImageOpen()' - Open an image file and read it into memory. - */ - -cups_image_t * /* O - New image */ -cupsImageOpen( - const char *filename, /* I - Filename of image */ - cups_icspace_t primary, /* I - Primary colorspace needed */ - cups_icspace_t secondary, /* I - Secondary colorspace if primary no good */ - int saturation, /* I - Color saturation level */ - int hue, /* I - Color hue adjustment */ - const cups_ib_t *lut) /* I - RGB gamma/brightness LUT */ -{ - FILE *fp; /* File pointer */ - unsigned char header[16], /* First 16 bytes of file */ - header2[16]; /* Bytes 2048-2064 (PhotoCD) */ - cups_image_t *img; /* New image buffer */ - int status; /* Status of load... */ - - - DEBUG_printf(("cupsImageOpen(\"%s\", %d, %d, %d, %d, %p)\n", - filename ? filename : "(null)", primary, secondary, - saturation, hue, lut)); - - /* - * Figure out the file type... - */ - - if ((fp = fopen(filename, "r")) == NULL) - return (NULL); - - if (fread(header, 1, sizeof(header), fp) == 0) - { - fclose(fp); - return (NULL); - } - - fseek(fp, 2048, SEEK_SET); - memset(header2, 0, sizeof(header2)); - fread(header2, 1, sizeof(header2), fp); - fseek(fp, 0, SEEK_SET); - - /* - * Allocate memory... - */ - - img = calloc(sizeof(cups_image_t), 1); - - if (img == NULL) - { - fclose(fp); - return (NULL); - } - - /* - * Load the image as appropriate... - */ - - img->cachefile = -1; - img->max_ics = CUPS_TILE_MINIMUM; - img->xppi = 128; - img->yppi = 128; - - if (!memcmp(header, "GIF87a", 6) || !memcmp(header, "GIF89a", 6)) - status = _cupsImageReadGIF(img, fp, primary, secondary, saturation, hue, - lut); - else if (!memcmp(header, "BM", 2)) - status = _cupsImageReadBMP(img, fp, primary, secondary, saturation, hue, - lut); - else if (header[0] == 0x01 && header[1] == 0xda) - status = _cupsImageReadSGI(img, fp, primary, secondary, saturation, hue, - lut); - else if (header[0] == 0x59 && header[1] == 0xa6 && - header[2] == 0x6a && header[3] == 0x95) - status = _cupsImageReadSunRaster(img, fp, primary, secondary, saturation, - hue, lut); - else if (header[0] == 'P' && header[1] >= '1' && header[1] <= '6') - status = _cupsImageReadPNM(img, fp, primary, secondary, saturation, hue, - lut); - else if (!memcmp(header2, "PCD_IPI", 7)) - status = _cupsImageReadPhotoCD(img, fp, primary, secondary, saturation, - hue, lut); - else if (!memcmp(header + 8, "\000\010", 2) || - !memcmp(header + 8, "\000\030", 2)) - status = _cupsImageReadPIX(img, fp, primary, secondary, saturation, hue, - lut); -#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ) - else if (!memcmp(header, "\211PNG", 4)) - status = _cupsImageReadPNG(img, fp, primary, secondary, saturation, hue, - lut); -#endif /* HAVE_LIBPNG && HAVE_LIBZ */ -#ifdef HAVE_LIBJPEG - else if (!memcmp(header, "\377\330\377", 3) && /* Start-of-Image */ - header[3] >= 0xe0 && header[3] <= 0xef) /* APPn */ - status = _cupsImageReadJPEG(img, fp, primary, secondary, saturation, hue, - lut); -#endif /* HAVE_LIBJPEG */ -#ifdef HAVE_LIBTIFF - else if (!memcmp(header, "MM\000\052", 4) || - !memcmp(header, "II\052\000", 4)) - status = _cupsImageReadTIFF(img, fp, primary, secondary, saturation, hue, - lut); -#endif /* HAVE_LIBTIFF */ - else - { - fclose(fp); - status = -1; - } - - if (status) - { - free(img); - return (NULL); - } - else - return (img); -} - - -/* - * '_cupsImagePutCol()' - Put a column of pixels to an image. - */ - -int /* O - -1 on error, 0 on success */ -_cupsImagePutCol( - cups_image_t *img, /* I - Image */ - int x, /* I - Column */ - int y, /* I - Start row */ - int height, /* I - Column height */ - const cups_ib_t *pixels) /* I - Pixels to put */ -{ - int bpp, /* Bytes per pixel */ - twidth, /* Width of tile */ - count; /* Number of pixels to put */ - int tilex, /* Column within tile */ - tiley; /* Row within tile */ - cups_ib_t *ib; /* Pointer to pixels in tile */ - - - if (img == NULL || x < 0 || x >= img->xsize || y >= img->ysize) - return (-1); - - if (y < 0) - { - height += y; - y = 0; - } - - if ((y + height) > img->ysize) - height = img->ysize - y; - - if (height < 1) - return (-1); - - bpp = cupsImageGetDepth(img); - twidth = bpp * (CUPS_TILE_SIZE - 1); - tilex = x / CUPS_TILE_SIZE; - tiley = y / CUPS_TILE_SIZE; - - while (height > 0) - { - ib = get_tile(img, x, y); - - if (ib == NULL) - return (-1); - - img->tiles[tiley][tilex].dirty = 1; - tiley ++; - - count = CUPS_TILE_SIZE - (y & (CUPS_TILE_SIZE - 1)); - if (count > height) - count = height; - - y += count; - height -= count; - - for (; count > 0; count --, ib += twidth) - switch (bpp) - { - case 4 : - *ib++ = *pixels++; - case 3 : - *ib++ = *pixels++; - *ib++ = *pixels++; - case 1 : - *ib++ = *pixels++; - break; - } - } - - return (0); -} - - -/* - * '_cupsImagePutRow()' - Put a row of pixels to an image. - */ - -int /* O - -1 on error, 0 on success */ -_cupsImagePutRow( - cups_image_t *img, /* I - Image */ - int x, /* I - Start column */ - int y, /* I - Row */ - int width, /* I - Row width */ - const cups_ib_t *pixels) /* I - Pixel data */ -{ - int bpp, /* Bytes per pixel */ - count; /* Number of pixels to put */ - int tilex, /* Column within tile */ - tiley; /* Row within tile */ - cups_ib_t *ib; /* Pointer to pixels in tile */ - - - if (img == NULL || y < 0 || y >= img->ysize || x >= img->xsize) - return (-1); - - if (x < 0) - { - width += x; - x = 0; - } - - if ((x + width) > img->xsize) - width = img->xsize - x; - - if (width < 1) - return (-1); - - bpp = img->colorspace < 0 ? -img->colorspace : img->colorspace; - tilex = x / CUPS_TILE_SIZE; - tiley = y / CUPS_TILE_SIZE; - - while (width > 0) - { - ib = get_tile(img, x, y); - - if (ib == NULL) - return (-1); - - img->tiles[tiley][tilex].dirty = 1; - - count = CUPS_TILE_SIZE - (x & (CUPS_TILE_SIZE - 1)); - if (count > width) - count = width; - memcpy(ib, pixels, count * bpp); - pixels += count * bpp; - x += count; - width -= count; - tilex ++; - } - - return (0); -} - - -/* - * 'cupsImageSetMaxTiles()' - Set the maximum number of tiles to cache. - * - * If the "max_tiles" argument is 0 then the maximum number of tiles is - * computed from the image size or the RIP_CACHE environment variable. - */ - -void -cupsImageSetMaxTiles( - cups_image_t *img, /* I - Image to set */ - int max_tiles) /* I - Number of tiles to cache */ -{ - int cache_size, /* Size of tile cache in bytes */ - min_tiles, /* Minimum number of tiles to cache */ - max_size; /* Maximum cache size in bytes */ - char *cache_env, /* Cache size environment variable */ - cache_units[255]; /* Cache size units */ - - - min_tiles = max(CUPS_TILE_MINIMUM, - 1 + max((img->xsize + CUPS_TILE_SIZE - 1) / CUPS_TILE_SIZE, - (img->ysize + CUPS_TILE_SIZE - 1) / CUPS_TILE_SIZE)); - - if (max_tiles == 0) - max_tiles = ((img->xsize + CUPS_TILE_SIZE - 1) / CUPS_TILE_SIZE) * - ((img->ysize + CUPS_TILE_SIZE - 1) / CUPS_TILE_SIZE); - - cache_size = max_tiles * CUPS_TILE_SIZE * CUPS_TILE_SIZE * - cupsImageGetDepth(img); - - if ((cache_env = getenv("RIP_MAX_CACHE")) != NULL) - { - switch (sscanf(cache_env, "%d%254s", &max_size, cache_units)) - { - case 0 : - max_size = 32 * 1024 * 1024; - break; - case 1 : - max_size *= 4 * CUPS_TILE_SIZE * CUPS_TILE_SIZE; - break; - case 2 : - if (tolower(cache_units[0] & 255) == 'g') - max_size *= 1024 * 1024 * 1024; - else if (tolower(cache_units[0] & 255) == 'm') - max_size *= 1024 * 1024; - else if (tolower(cache_units[0] & 255) == 'k') - max_size *= 1024; - else if (tolower(cache_units[0] & 255) == 't') - max_size *= 4 * CUPS_TILE_SIZE * CUPS_TILE_SIZE; - break; - } - } - else - max_size = 32 * 1024 * 1024; - - if (cache_size > max_size) - max_tiles = max_size / CUPS_TILE_SIZE / CUPS_TILE_SIZE / - cupsImageGetDepth(img); - - if (max_tiles < min_tiles) - max_tiles = min_tiles; - - img->max_ics = max_tiles; - - DEBUG_printf(("max_ics=%d...\n", img->max_ics)); -} - - -/* - * 'flush_tile()' - Flush the least-recently-used tile in the cache. - */ - -static void -flush_tile(cups_image_t *img) /* I - Image */ -{ - int bpp; /* Bytes per pixel */ - cups_itile_t *tile; /* Pointer to tile */ - - - bpp = cupsImageGetDepth(img); - tile = img->first->tile; - - if (!tile->dirty) - { - tile->ic = NULL; - return; - } - - if (img->cachefile < 0) - { - if ((img->cachefile = cupsTempFd(img->cachename, - sizeof(img->cachename))) < 0) - { - tile->ic = NULL; - tile->dirty = 0; - return; - } - - DEBUG_printf(("Created swap file \"%s\"...\n", img->cachename)); - } - - if (tile->pos >= 0) - { - if (lseek(img->cachefile, tile->pos, SEEK_SET) != tile->pos) - { - tile->ic = NULL; - tile->dirty = 0; - return; - } - } - else - { - if ((tile->pos = lseek(img->cachefile, 0, SEEK_END)) < 0) - { - tile->ic = NULL; - tile->dirty = 0; - return; - } - } - - write(img->cachefile, tile->ic->pixels, bpp * CUPS_TILE_SIZE * CUPS_TILE_SIZE); - - tile->ic = NULL; - tile->dirty = 0; -} - - -/* - * 'get_tile()' - Get a cached tile. - */ - -static cups_ib_t * /* O - Pointer to tile or NULL */ -get_tile(cups_image_t *img, /* I - Image */ - int x, /* I - Column in image */ - int y) /* I - Row in image */ -{ - int bpp, /* Bytes per pixel */ - tilex, /* Column within tile */ - tiley, /* Row within tile */ - xtiles, /* Number of tiles horizontally */ - ytiles; /* Number of tiles vertically */ - cups_ic_t *ic; /* Cache pointer */ - cups_itile_t *tile; /* Tile pointer */ - - - if (img->tiles == NULL) - { - xtiles = (img->xsize + CUPS_TILE_SIZE - 1) / CUPS_TILE_SIZE; - ytiles = (img->ysize + CUPS_TILE_SIZE - 1) / CUPS_TILE_SIZE; - - DEBUG_printf(("Creating tile array (%dx%d)\n", xtiles, ytiles)); - - if ((img->tiles = calloc(sizeof(cups_itile_t *), ytiles)) == NULL) - return (NULL); - - if ((tile = calloc(xtiles * sizeof(cups_itile_t), ytiles)) == NULL) - return (NULL); - - for (tiley = 0; tiley < ytiles; tiley ++) - { - img->tiles[tiley] = tile; - for (tilex = xtiles; tilex > 0; tilex --, tile ++) - tile->pos = -1; - } - } - - bpp = cupsImageGetDepth(img); - tilex = x / CUPS_TILE_SIZE; - tiley = y / CUPS_TILE_SIZE; - tile = img->tiles[tiley] + tilex; - x &= (CUPS_TILE_SIZE - 1); - y &= (CUPS_TILE_SIZE - 1); - - if ((ic = tile->ic) == NULL) - { - if (img->num_ics < img->max_ics) - { - if ((ic = calloc(sizeof(cups_ic_t) + - bpp * CUPS_TILE_SIZE * CUPS_TILE_SIZE, 1)) == NULL) - { - if (img->num_ics == 0) - return (NULL); - - flush_tile(img); - ic = img->first; - } - else - { - ic->pixels = ((cups_ib_t *)ic) + sizeof(cups_ic_t); - - img->num_ics ++; - - DEBUG_printf(("Allocated cache tile %d (%p)...\n", img->num_ics, ic)); - } - } - else - { - DEBUG_printf(("Flushing old cache tile (%p)...\n", img->first)); - - flush_tile(img); - ic = img->first; - } - - ic->tile = tile; - tile->ic = ic; - - if (tile->pos >= 0) - { - DEBUG_printf(("Loading cache tile from file position " CUPS_LLFMT "...\n", - CUPS_LLCAST tile->pos)); - - lseek(img->cachefile, tile->pos, SEEK_SET); - read(img->cachefile, ic->pixels, bpp * CUPS_TILE_SIZE * CUPS_TILE_SIZE); - } - else - { - DEBUG_puts("Clearing cache tile..."); - - memset(ic->pixels, 0, bpp * CUPS_TILE_SIZE * CUPS_TILE_SIZE); - } - } - - if (ic == img->first) - { - if (ic->next != NULL) - ic->next->prev = NULL; - - img->first = ic->next; - ic->next = NULL; - ic->prev = NULL; - } - else if (img->first == NULL) - img->first = ic; - - if (ic != img->last) - { - /* - * Remove the cache entry from the list... - */ - - if (ic->prev != NULL) - ic->prev->next = ic->next; - if (ic->next != NULL) - ic->next->prev = ic->prev; - - /* - * And add it to the end... - */ - - if (img->last != NULL) - img->last->next = ic; - - ic->prev = img->last; - img->last = ic; - } - - ic->next = NULL; - - return (ic->pixels + bpp * (y * CUPS_TILE_SIZE + x)); -} - - -/* - * End of "$Id: image.c 7473 2008-04-21 17:51:58Z mike $". - */ diff --git a/filter/image.h b/filter/image.h deleted file mode 100644 index 142b5499f..000000000 --- a/filter/image.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * "$Id: image.h 7306 2008-02-15 00:52:38Z mike $" - * - * Image library definitions for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2006 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - */ - -#ifndef _CUPS_IMAGE_H_ -# define _CUPS_IMAGE_H_ - -/* - * Include necessary headers... - */ - -# include -# include - -# ifdef __cplusplus -extern "C" { -# endif /* __cplusplus */ - -/* - * Constants... - */ - -typedef enum cups_icspace_e /**** Image colorspaces ****/ -{ - CUPS_IMAGE_CMYK = -4, /* Cyan, magenta, yellow, and black */ - CUPS_IMAGE_CMY = -3, /* Cyan, magenta, and yellow */ - CUPS_IMAGE_BLACK = -1, /* Black */ - CUPS_IMAGE_WHITE = 1, /* White (luminance) */ - CUPS_IMAGE_RGB = 3, /* Red, green, and blue */ - CUPS_IMAGE_RGB_CMYK = 4 /* Use RGB or CMYK */ -} cups_icspace_t; - - -/* - * Types and structures... - */ - -typedef unsigned char cups_ib_t; /**** Image byte ****/ - -struct cups_image_s; -typedef struct cups_image_s cups_image_t; - /**** Image file data ****/ - -struct cups_izoom_s; -typedef struct cups_izoom_s cups_izoom_t; - /**** Image zoom data ****/ - - -/* - * Prototypes... - */ - -extern void cupsImageClose(cups_image_t *img) _CUPS_API_1_2; -extern void cupsImageCMYKToBlack(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; -extern void cupsImageCMYKToCMY(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; -extern void cupsImageCMYKToCMYK(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; -extern void cupsImageCMYKToRGB(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; -extern void cupsImageCMYKToWhite(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; -extern int cupsImageGetCol(cups_image_t *img, int x, int y, - int height, cups_ib_t *pixels) _CUPS_API_1_2; -extern cups_icspace_t cupsImageGetColorSpace(cups_image_t *img) _CUPS_API_1_2; -extern int cupsImageGetDepth(cups_image_t *img) _CUPS_API_1_2; -extern unsigned cupsImageGetHeight(cups_image_t *img) _CUPS_API_1_2; -extern int cupsImageGetRow(cups_image_t *img, int x, int y, - int width, cups_ib_t *pixels) _CUPS_API_1_2; -extern unsigned cupsImageGetWidth(cups_image_t *img) _CUPS_API_1_2; -extern unsigned cupsImageGetXPPI(cups_image_t *img) _CUPS_API_1_2; -extern unsigned cupsImageGetYPPI(cups_image_t *img) _CUPS_API_1_2; -extern void cupsImageLut(cups_ib_t *pixels, int count, - const cups_ib_t *lut) _CUPS_API_1_2; -extern cups_image_t *cupsImageOpen(const char *filename, - cups_icspace_t primary, - cups_icspace_t secondary, - int saturation, int hue, - const cups_ib_t *lut) _CUPS_API_1_2; -extern void cupsImageRGBAdjust(cups_ib_t *pixels, int count, - int saturation, int hue) _CUPS_API_1_2; -extern void cupsImageRGBToBlack(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; -extern void cupsImageRGBToCMY(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; -extern void cupsImageRGBToCMYK(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; -extern void cupsImageRGBToRGB(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; -extern void cupsImageRGBToWhite(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; -extern void cupsImageSetMaxTiles(cups_image_t *img, int max_tiles) _CUPS_API_1_2; -extern void cupsImageSetProfile(float d, float g, - float matrix[3][3]) _CUPS_API_1_2; -extern void cupsImageSetRasterColorSpace(cups_cspace_t cs) _CUPS_API_1_2; -extern void cupsImageWhiteToBlack(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; -extern void cupsImageWhiteToCMY(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; -extern void cupsImageWhiteToCMYK(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; -extern void cupsImageWhiteToRGB(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; -extern void cupsImageWhiteToWhite(const cups_ib_t *in, - cups_ib_t *out, int count) _CUPS_API_1_2; - - -# ifdef __cplusplus -} -# endif /* __cplusplus */ - -#endif /* !_CUPS_IMAGE_H_ */ - -/* - * End of "$Id: image.h 7306 2008-02-15 00:52:38Z mike $". - */ diff --git a/filter/imagetops.c b/filter/imagetops.c deleted file mode 100644 index d8638b25a..000000000 --- a/filter/imagetops.c +++ /dev/null @@ -1,1078 +0,0 @@ -/* - * "$Id: imagetops.c 6649 2007-07-11 21:46:42Z mike $" - * - * Image file to PostScript filter for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2007 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * main() - Main entry... - * ps_hex() - Print binary data as a series of hexadecimal numbers. - * ps_ascii85() - Print binary data as a series of base-85 numbers. - */ - -/* - * Include necessary headers... - */ - -#include "common.h" -#include "image.h" -#include -#include -#include - - -/* - * Globals... - */ - -int Flip = 0, /* Flip/mirror pages */ - XPosition = 0, /* Horizontal position on page */ - YPosition = 0, /* Vertical position on page */ - Collate = 0, /* Collate copies? */ - Copies = 1; /* Number of copies */ - - -/* - * Local functions... - */ - -static void ps_hex(cups_ib_t *, int, int); -static void ps_ascii85(cups_ib_t *, int, int); - - -/* - * 'main()' - Main entry... - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ -{ - cups_image_t *img; /* Image to print */ - float xprint, /* Printable area */ - yprint, - xinches, /* Total size in inches */ - yinches; - float xsize, /* Total size in points */ - ysize, - xsize2, - ysize2; - float aspect; /* Aspect ratio */ - int xpages, /* # x pages */ - ypages, /* # y pages */ - xpage, /* Current x page */ - ypage, /* Current y page */ - page; /* Current page number */ - int xc0, yc0, /* Corners of the page in image coords */ - xc1, yc1; - cups_ib_t *row; /* Current row */ - int y; /* Current Y coordinate in image */ - int colorspace; /* Output colorspace */ - int out_offset, /* Offset into output buffer */ - out_length; /* Length of output buffer */ - ppd_file_t *ppd; /* PPD file */ - ppd_choice_t *choice; /* PPD option choice */ - int num_options; /* Number of print options */ - cups_option_t *options; /* Print options */ - const char *val; /* Option value */ - int slowcollate; /* Collate copies the slow way */ - float g; /* Gamma correction value */ - float b; /* Brightness factor */ - float zoom; /* Zoom facter */ - int xppi, yppi; /* Pixels-per-inch */ - int hue, sat; /* Hue and saturation adjustment */ - int realcopies, /* Real copies being printed */ - emit_jcl; /* Emit JCL? */ - float left, top; /* Left and top of image */ - char filename[1024]; /* Name of file to print */ - time_t curtime; /* Current time */ - struct tm *curtm; /* Current date */ - char curdate[255]; /* Current date string */ - - - /* - * Make sure status messages are not buffered... - */ - - setbuf(stderr, NULL); - - /* - * Ignore broken pipe signals... - */ - - signal(SIGPIPE, SIG_IGN); - - /* - * Check command-line... - */ - - if (argc < 6 || argc > 7) - { - _cupsLangPrintf(stderr, - _("Usage: %s job-id user title copies options file"), - argv[0]); - return (1); - } - - /* - * Copy stdin as needed... - */ - - if (argc == 6) - { - int fd; /* File to write to */ - char buffer[8192]; /* Buffer to read into */ - int bytes; /* # of bytes to read */ - - - if ((fd = cupsTempFd(filename, sizeof(filename))) < 0) - { - _cupsLangPrintError("ERROR", _("Unable to copy print file")); - return (1); - } - - fprintf(stderr, "DEBUG: imagetops - copying to temp print file \"%s\".\n", - filename); - - while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0) - write(fd, buffer, bytes); - - close(fd); - } - else - strlcpy(filename, argv[6], sizeof(filename)); - - /* - * Process command-line options and write the prolog... - */ - - zoom = 0.0; - xppi = 0; - yppi = 0; - hue = 0; - sat = 100; - g = 1.0; - b = 1.0; - - Copies = atoi(argv[4]); - - options = NULL; - num_options = cupsParseOptions(argv[5], 0, &options); - - ppd = SetCommonOptions(num_options, options, 0); - - if ((val = cupsGetOption("multiple-document-handling", num_options, options)) != NULL) - { - /* - * This IPP attribute is unnecessarily complicated... - * - * single-document, separate-documents-collated-copies, and - * single-document-new-sheet all require collated copies. - * - * separate-documents-uncollated-copies allows for uncollated copies. - */ - - Collate = _cups_strcasecmp(val, "separate-documents-uncollated-copies") != 0; - } - - if ((val = cupsGetOption("Collate", num_options, options)) != NULL && - _cups_strcasecmp(val, "True") == 0) - Collate = 1; - - if ((val = cupsGetOption("gamma", num_options, options)) != NULL) - { - /* - * Get gamma value from 1 to 10000... - */ - - g = atoi(val) * 0.001f; - - if (g < 0.001f) - g = 0.001f; - else if (g > 10.0f) - g = 10.0f; - } - - if ((val = cupsGetOption("brightness", num_options, options)) != NULL) - { - /* - * Get brightness value from 10 to 1000. - */ - - b = atoi(val) * 0.01f; - - if (b < 0.1f) - b = 0.1f; - else if (b > 10.0f) - b = 10.0f; - } - - if ((val = cupsGetOption("scaling", num_options, options)) != NULL) - zoom = atoi(val) * 0.01; - else if ((val = cupsGetOption("fitplot", num_options, options)) != NULL && - !_cups_strcasecmp(val, "true")) - zoom = 1.0; - else if ((val = cupsGetOption("fit-to-page", num_options, options)) != NULL && - !_cups_strcasecmp(val, "true")) - zoom = 1.0; - - if ((val = cupsGetOption("ppi", num_options, options)) != NULL) - if (sscanf(val, "%dx%d", &xppi, &yppi) < 2) - yppi = xppi; - - if ((val = cupsGetOption("position", num_options, options)) != NULL) - { - if (_cups_strcasecmp(val, "center") == 0) - { - XPosition = 0; - YPosition = 0; - } - else if (_cups_strcasecmp(val, "top") == 0) - { - XPosition = 0; - YPosition = 1; - } - else if (_cups_strcasecmp(val, "left") == 0) - { - XPosition = -1; - YPosition = 0; - } - else if (_cups_strcasecmp(val, "right") == 0) - { - XPosition = 1; - YPosition = 0; - } - else if (_cups_strcasecmp(val, "top-left") == 0) - { - XPosition = -1; - YPosition = 1; - } - else if (_cups_strcasecmp(val, "top-right") == 0) - { - XPosition = 1; - YPosition = 1; - } - else if (_cups_strcasecmp(val, "bottom") == 0) - { - XPosition = 0; - YPosition = -1; - } - else if (_cups_strcasecmp(val, "bottom-left") == 0) - { - XPosition = -1; - YPosition = -1; - } - else if (_cups_strcasecmp(val, "bottom-right") == 0) - { - XPosition = 1; - YPosition = -1; - } - } - - if ((val = cupsGetOption("saturation", num_options, options)) != NULL) - sat = atoi(val); - - if ((val = cupsGetOption("hue", num_options, options)) != NULL) - hue = atoi(val); - - if ((choice = ppdFindMarkedChoice(ppd, "MirrorPrint")) != NULL) - { - val = choice->choice; - choice->marked = 0; - } - else - val = cupsGetOption("mirror", num_options, options); - - if (val && (!_cups_strcasecmp(val, "true") || !_cups_strcasecmp(val, "on") || - !_cups_strcasecmp(val, "yes"))) - Flip = 1; - - if ((val = cupsGetOption("emit-jcl", num_options, options)) != NULL && - (!_cups_strcasecmp(val, "false") || !_cups_strcasecmp(val, "off") || - !_cups_strcasecmp(val, "no") || !strcmp(val, "0"))) - emit_jcl = 0; - else - emit_jcl = 1; - - /* - * Open the input image to print... - */ - - colorspace = ColorDevice ? CUPS_IMAGE_RGB_CMYK : CUPS_IMAGE_WHITE; - - img = cupsImageOpen(filename, colorspace, CUPS_IMAGE_WHITE, sat, hue, NULL); - - if (argc == 6) - unlink(filename); - - if (img == NULL) - { - _cupsLangPrintFilter(stderr, "ERROR", - _("The print file could not be opened.")); - ppdClose(ppd); - return (1); - } - - colorspace = cupsImageGetColorSpace(img); - - /* - * Scale as necessary... - */ - - if (zoom == 0.0 && xppi == 0) - { - xppi = cupsImageGetXPPI(img); - yppi = cupsImageGetYPPI(img); - } - - if (yppi == 0) - yppi = xppi; - - fprintf(stderr, "DEBUG: Before scaling: xppi=%d, yppi=%d, zoom=%.2f\n", - xppi, yppi, zoom); - - if (xppi > 0) - { - /* - * Scale the image as neccesary to match the desired pixels-per-inch. - */ - - if (Orientation & 1) - { - xprint = (PageTop - PageBottom) / 72.0; - yprint = (PageRight - PageLeft) / 72.0; - } - else - { - xprint = (PageRight - PageLeft) / 72.0; - yprint = (PageTop - PageBottom) / 72.0; - } - - fprintf(stderr, "DEBUG: Before scaling: xprint=%.1f, yprint=%.1f\n", - xprint, yprint); - - xinches = (float)cupsImageGetWidth(img) / (float)xppi; - yinches = (float)cupsImageGetHeight(img) / (float)yppi; - - fprintf(stderr, "DEBUG: Image size is %.1f x %.1f inches...\n", - xinches, yinches); - - if ((val = cupsGetOption("natural-scaling", num_options, options)) != NULL) - { - xinches = xinches * atoi(val) / 100; - yinches = yinches * atoi(val) / 100; - } - - if (cupsGetOption("orientation-requested", num_options, options) == NULL && - cupsGetOption("landscape", num_options, options) == NULL) - { - /* - * Rotate the image if it will fit landscape but not portrait... - */ - - fputs("DEBUG: Auto orientation...\n", stderr); - - if ((xinches > xprint || yinches > yprint) && - xinches <= yprint && yinches <= xprint) - { - /* - * Rotate the image as needed... - */ - - fputs("DEBUG: Using landscape orientation...\n", stderr); - - Orientation = (Orientation + 1) & 3; - xsize = yprint; - yprint = xprint; - xprint = xsize; - } - } - } - else - { - /* - * Scale percentage of page size... - */ - - xprint = (PageRight - PageLeft) / 72.0; - yprint = (PageTop - PageBottom) / 72.0; - aspect = (float)cupsImageGetYPPI(img) / (float)cupsImageGetXPPI(img); - - fprintf(stderr, "DEBUG: Before scaling: xprint=%.1f, yprint=%.1f\n", - xprint, yprint); - - fprintf(stderr, "DEBUG: cupsImageGetXPPI(img) = %d, cupsImageGetYPPI(img) = %d, aspect = %f\n", - cupsImageGetXPPI(img), cupsImageGetYPPI(img), aspect); - - xsize = xprint * zoom; - ysize = xsize * cupsImageGetHeight(img) / cupsImageGetWidth(img) / aspect; - - if (ysize > (yprint * zoom)) - { - ysize = yprint * zoom; - xsize = ysize * cupsImageGetWidth(img) * aspect / cupsImageGetHeight(img); - } - - xsize2 = yprint * zoom; - ysize2 = xsize2 * cupsImageGetHeight(img) / cupsImageGetWidth(img) / aspect; - - if (ysize2 > (xprint * zoom)) - { - ysize2 = xprint * zoom; - xsize2 = ysize2 * cupsImageGetWidth(img) * aspect / cupsImageGetHeight(img); - } - - fprintf(stderr, "DEBUG: Portrait size is %.2f x %.2f inches\n", xsize, ysize); - fprintf(stderr, "DEBUG: Landscape size is %.2f x %.2f inches\n", xsize2, ysize2); - - if (cupsGetOption("orientation-requested", num_options, options) == NULL && - cupsGetOption("landscape", num_options, options) == NULL) - { - /* - * Choose the rotation with the largest area, but prefer - * portrait if they are equal... - */ - - fputs("DEBUG: Auto orientation...\n", stderr); - - if ((xsize * ysize) < (xsize2 * xsize2)) - { - /* - * Do landscape orientation... - */ - - fputs("DEBUG: Using landscape orientation...\n", stderr); - - Orientation = 1; - xinches = xsize2; - yinches = ysize2; - xprint = (PageTop - PageBottom) / 72.0; - yprint = (PageRight - PageLeft) / 72.0; - } - else - { - /* - * Do portrait orientation... - */ - - fputs("DEBUG: Using portrait orientation...\n", stderr); - - Orientation = 0; - xinches = xsize; - yinches = ysize; - } - } - else if (Orientation & 1) - { - fputs("DEBUG: Using landscape orientation...\n", stderr); - - xinches = xsize2; - yinches = ysize2; - xprint = (PageTop - PageBottom) / 72.0; - yprint = (PageRight - PageLeft) / 72.0; - } - else - { - fputs("DEBUG: Using portrait orientation...\n", stderr); - - xinches = xsize; - yinches = ysize; - xprint = (PageRight - PageLeft) / 72.0; - yprint = (PageTop - PageBottom) / 72.0; - } - } - - /* - * Compute the number of pages to print and the size of the image on each - * page... - */ - - xpages = ceil(xinches / xprint); - ypages = ceil(yinches / yprint); - - xprint = xinches / xpages; - yprint = yinches / ypages; - - fprintf(stderr, "DEBUG: xpages = %dx%.2fin, ypages = %dx%.2fin\n", - xpages, xprint, ypages, yprint); - - /* - * Update the page size for custom sizes... - */ - - if ((choice = ppdFindMarkedChoice(ppd, "PageSize")) != NULL && - _cups_strcasecmp(choice->choice, "Custom") == 0) - { - float width, /* New width in points */ - length; /* New length in points */ - char s[255]; /* New custom page size... */ - - - /* - * Use the correct width and length for the current orientation... - */ - - if (Orientation & 1) - { - width = yprint * 72.0; - length = xprint * 72.0; - } - else - { - width = xprint * 72.0; - length = yprint * 72.0; - } - - /* - * Add margins to page size... - */ - - width += ppd->custom_margins[0] + ppd->custom_margins[2]; - length += ppd->custom_margins[1] + ppd->custom_margins[3]; - - /* - * Enforce minimums... - */ - - if (width < ppd->custom_min[0]) - width = ppd->custom_min[0]; - - if (length < ppd->custom_min[1]) - length = ppd->custom_min[1]; - - fprintf(stderr, "DEBUG: Updated custom page size to %.2f x %.2f inches...\n", - width / 72.0, length / 72.0); - - /* - * Set the new custom size... - */ - - sprintf(s, "Custom.%.0fx%.0f", width, length); - ppdMarkOption(ppd, "PageSize", s); - - /* - * Update page variables... - */ - - PageWidth = width; - PageLength = length; - PageLeft = ppd->custom_margins[0]; - PageRight = width - ppd->custom_margins[2]; - PageBottom = ppd->custom_margins[1]; - PageTop = length - ppd->custom_margins[3]; - } - - /* - * See if we need to collate, and if so how we need to do it... - */ - - if (xpages == 1 && ypages == 1) - Collate = 0; - - slowcollate = Collate && ppdFindOption(ppd, "Collate") == NULL; - - if (Copies > 1 && !slowcollate) - { - realcopies = Copies; - Copies = 1; - } - else - realcopies = 1; - - /* - * Write any "exit server" options that have been selected... - */ - - ppdEmit(ppd, stdout, PPD_ORDER_EXIT); - - /* - * Write any JCL commands that are needed to print PostScript code... - */ - - if (emit_jcl) - ppdEmitJCL(ppd, stdout, atoi(argv[1]), argv[2], argv[3]); - - /* - * Start sending the document with any commands needed... - */ - - curtime = time(NULL); - curtm = localtime(&curtime); - - puts("%!PS-Adobe-3.0"); - printf("%%%%BoundingBox: %.0f %.0f %.0f %.0f\n", PageLeft, PageBottom, - PageRight, PageTop); - printf("%%%%LanguageLevel: %d\n", LanguageLevel); - printf("%%%%Pages: %d\n", xpages * ypages * Copies); - puts("%%DocumentData: Clean7Bit"); - puts("%%DocumentNeededResources: font Helvetica-Bold"); - puts("%%Creator: imagetops/" CUPS_SVERSION); - strftime(curdate, sizeof(curdate), "%c", curtm); - printf("%%%%CreationDate: %s\n", curdate); - WriteTextComment("Title", argv[3]); - WriteTextComment("For", argv[2]); - if (Orientation & 1) - puts("%%Orientation: Landscape"); - else - puts("%%Orientation: Portrait"); - puts("%%EndComments"); - puts("%%BeginProlog"); - - if (ppd != NULL && ppd->patches != NULL) - puts(ppd->patches); - - ppdEmit(ppd, stdout, PPD_ORDER_DOCUMENT); - ppdEmit(ppd, stdout, PPD_ORDER_ANY); - ppdEmit(ppd, stdout, PPD_ORDER_PROLOG); - - if (g != 1.0 || b != 1.0) - printf("{ neg 1 add dup 0 lt { pop 1 } { %.3f exp neg 1 add } " - "ifelse %.3f mul } bind settransfer\n", g, b); - - WriteCommon(); - switch (Orientation) - { - case 0 : - WriteLabelProlog(cupsGetOption("page-label", num_options, options), - PageBottom, PageTop, PageWidth); - break; - - case 1 : - WriteLabelProlog(cupsGetOption("page-label", num_options, options), - PageLeft, PageRight, PageLength); - break; - - case 2 : - WriteLabelProlog(cupsGetOption("page-label", num_options, options), - PageLength - PageTop, PageLength - PageBottom, - PageWidth); - break; - - case 3 : - WriteLabelProlog(cupsGetOption("page-label", num_options, options), - PageWidth - PageRight, PageWidth - PageLeft, - PageLength); - break; - } - - if (realcopies > 1) - { - if (ppd == NULL || ppd->language_level == 1) - printf("/#copies %d def\n", realcopies); - else - printf("<>setpagedevice\n", realcopies); - } - - puts("%%EndProlog"); - - /* - * Output the pages... - */ - - row = malloc(cupsImageGetWidth(img) * abs(colorspace) + 3); - - fprintf(stderr, "DEBUG: XPosition=%d, YPosition=%d, Orientation=%d\n", - XPosition, YPosition, Orientation); - fprintf(stderr, "DEBUG: xprint=%.0f, yprint=%.0f\n", xprint, yprint); - fprintf(stderr, "DEBUG: PageLeft=%.0f, PageRight=%.0f, PageWidth=%.0f\n", - PageLeft, PageRight, PageWidth); - fprintf(stderr, "DEBUG: PageBottom=%.0f, PageTop=%.0f, PageLength=%.0f\n", - PageBottom, PageTop, PageLength); - - switch (Orientation) - { - default : - switch (XPosition) - { - case -1 : - left = PageLeft; - break; - default : - left = (PageRight + PageLeft - xprint * 72) / 2; - break; - case 1 : - left = PageRight - xprint * 72; - break; - } - - switch (YPosition) - { - case -1 : - top = PageBottom + yprint * 72; - break; - default : - top = (PageTop + PageBottom + yprint * 72) / 2; - break; - case 1 : - top = PageTop; - break; - } - break; - - case 1 : - switch (XPosition) - { - case -1 : - left = PageBottom; - break; - default : - left = (PageTop + PageBottom - xprint * 72) / 2; - break; - case 1 : - left = PageTop - xprint * 72; - break; - } - - switch (YPosition) - { - case -1 : - top = PageLeft + yprint * 72; - break; - default : - top = (PageRight + PageLeft + yprint * 72) / 2; - break; - case 1 : - top = PageRight; - break; - } - break; - - case 2 : - switch (XPosition) - { - case 1 : - left = PageLeft; - break; - default : - left = (PageRight + PageLeft - xprint * 72) / 2; - break; - case -1 : - left = PageRight - xprint * 72; - break; - } - - switch (YPosition) - { - case 1 : - top = PageBottom + yprint * 72; - break; - default : - top = (PageTop + PageBottom + yprint * 72) / 2; - break; - case -1 : - top = PageTop; - break; - } - break; - - case 3 : - switch (XPosition) - { - case 1 : - left = PageBottom; - break; - default : - left = (PageTop + PageBottom - xprint * 72) / 2; - break; - case -1 : - left = PageTop - xprint * 72; - break; - } - - switch (YPosition) - { - case 1 : - top = PageLeft + yprint * 72; - break; - default : - top = (PageRight + PageLeft + yprint * 72) / 2; - break; - case -1 : - top = PageRight; - break; - } - break; - } - - fprintf(stderr, "DEBUG: left=%.2f, top=%.2f\n", left, top); - - for (page = 1; Copies > 0; Copies --) - for (xpage = 0; xpage < xpages; xpage ++) - for (ypage = 0; ypage < ypages; ypage ++, page ++) - { - if (ppd && ppd->num_filters == 0) - fprintf(stderr, "PAGE: %d %d\n", page, realcopies); - - _cupsLangPrintFilter(stderr, "INFO", _("Printing page %d."), page); - - printf("%%%%Page: %d %d\n", page, page); - - ppdEmit(ppd, stdout, PPD_ORDER_PAGE); - - puts("gsave"); - - if (Flip) - printf("%.0f 0 translate -1 1 scale\n", PageWidth); - - switch (Orientation) - { - case 1 : /* Landscape */ - printf("%.0f 0 translate 90 rotate\n", PageWidth); - break; - case 2 : /* Reverse Portrait */ - printf("%.0f %.0f translate 180 rotate\n", PageWidth, PageLength); - break; - case 3 : /* Reverse Landscape */ - printf("0 %.0f translate -90 rotate\n", PageLength); - break; - } - - puts("gsave"); - - xc0 = cupsImageGetWidth(img) * xpage / xpages; - xc1 = cupsImageGetWidth(img) * (xpage + 1) / xpages - 1; - yc0 = cupsImageGetHeight(img) * ypage / ypages; - yc1 = cupsImageGetHeight(img) * (ypage + 1) / ypages - 1; - - printf("%.1f %.1f translate\n", left, top); - - printf("%.3f %.3f scale\n\n", - xprint * 72.0 / (xc1 - xc0 + 1), - yprint * 72.0 / (yc1 - yc0 + 1)); - - if (LanguageLevel == 1) - { - printf("/picture %d string def\n", (xc1 - xc0 + 1) * abs(colorspace)); - printf("%d %d 8[1 0 0 -1 0 1]", (xc1 - xc0 + 1), (yc1 - yc0 + 1)); - - if (colorspace == CUPS_IMAGE_WHITE) - puts("{currentfile picture readhexstring pop} image"); - else - printf("{currentfile picture readhexstring pop} false %d colorimage\n", - abs(colorspace)); - - for (y = yc0; y <= yc1; y ++) - { - cupsImageGetRow(img, xc0, y, xc1 - xc0 + 1, row); - ps_hex(row, (xc1 - xc0 + 1) * abs(colorspace), y == yc1); - } - } - else - { - switch (colorspace) - { - case CUPS_IMAGE_WHITE : - puts("/DeviceGray setcolorspace"); - break; - case CUPS_IMAGE_RGB : - puts("/DeviceRGB setcolorspace"); - break; - case CUPS_IMAGE_CMYK : - puts("/DeviceCMYK setcolorspace"); - break; - } - - printf("<<" - "/ImageType 1" - "/Width %d" - "/Height %d" - "/BitsPerComponent 8", - xc1 - xc0 + 1, yc1 - yc0 + 1); - - switch (colorspace) - { - case CUPS_IMAGE_WHITE : - fputs("/Decode[0 1]", stdout); - break; - case CUPS_IMAGE_RGB : - fputs("/Decode[0 1 0 1 0 1]", stdout); - break; - case CUPS_IMAGE_CMYK : - fputs("/Decode[0 1 0 1 0 1 0 1]", stdout); - break; - } - - fputs("\n/DataSource currentfile/ASCII85Decode filter", stdout); - - if (((xc1 - xc0 + 1) / xprint) < 100.0) - fputs("/Interpolate true", stdout); - - puts("/ImageMatrix[1 0 0 -1 0 1]>>image"); - - for (y = yc0, out_offset = 0; y <= yc1; y ++) - { - cupsImageGetRow(img, xc0, y, xc1 - xc0 + 1, row + out_offset); - - out_length = (xc1 - xc0 + 1) * abs(colorspace) + out_offset; - out_offset = out_length & 3; - - ps_ascii85(row, out_length, y == yc1); - - if (out_offset > 0) - memcpy(row, row + out_length - out_offset, out_offset); - } - } - - puts("grestore"); - WriteLabels(0); - puts("grestore"); - puts("showpage"); - } - - puts("%%EOF"); - - /* - * End the job with the appropriate JCL command or CTRL-D otherwise. - */ - - if (emit_jcl) - { - if (ppd && ppd->jcl_end) - ppdEmitJCLEnd(ppd, stdout); - else - putchar(0x04); - } - - /* - * Close files... - */ - - cupsImageClose(img); - ppdClose(ppd); - - return (0); -} - - -/* - * 'ps_hex()' - Print binary data as a series of hexadecimal numbers. - */ - -static void -ps_hex(cups_ib_t *data, /* I - Data to print */ - int length, /* I - Number of bytes to print */ - int last_line) /* I - Last line of raster data? */ -{ - static int col = 0; /* Current column */ - static char *hex = "0123456789ABCDEF"; - /* Hex digits */ - - - while (length > 0) - { - /* - * Put the hex chars out to the file; note that we don't use printf() - * for speed reasons... - */ - - putchar(hex[*data >> 4]); - putchar(hex[*data & 15]); - - data ++; - length --; - - col += 2; - if (col > 78) - { - putchar('\n'); - col = 0; - } - } - - if (last_line && col) - { - putchar('\n'); - col = 0; - } -} - - -/* - * 'ps_ascii85()' - Print binary data as a series of base-85 numbers. - */ - -static void -ps_ascii85(cups_ib_t *data, /* I - Data to print */ - int length, /* I - Number of bytes to print */ - int last_line) /* I - Last line of raster data? */ -{ - unsigned b; /* Binary data word */ - unsigned char c[5]; /* ASCII85 encoded chars */ - static int col = 0; /* Current column */ - - - while (length > 3) - { - b = (((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3]; - - if (b == 0) - { - putchar('z'); - col ++; - } - else - { - c[4] = (b % 85) + '!'; - b /= 85; - c[3] = (b % 85) + '!'; - b /= 85; - c[2] = (b % 85) + '!'; - b /= 85; - c[1] = (b % 85) + '!'; - b /= 85; - c[0] = b + '!'; - - fwrite(c, 5, 1, stdout); - col += 5; - } - - data += 4; - length -= 4; - - if (col >= 75) - { - putchar('\n'); - col = 0; - } - } - - if (last_line) - { - if (length > 0) - { - memset(data + length, 0, 4 - length); - b = (((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3]; - - c[4] = (b % 85) + '!'; - b /= 85; - c[3] = (b % 85) + '!'; - b /= 85; - c[2] = (b % 85) + '!'; - b /= 85; - c[1] = (b % 85) + '!'; - b /= 85; - c[0] = b + '!'; - - fwrite(c, length + 1, 1, stdout); - } - - puts("~>"); - col = 0; - } -} - - -/* - * End of "$Id: imagetops.c 6649 2007-07-11 21:46:42Z mike $". - */ diff --git a/filter/imagetoraster.c b/filter/imagetoraster.c deleted file mode 100644 index e1add90cc..000000000 --- a/filter/imagetoraster.c +++ /dev/null @@ -1,4368 +0,0 @@ -/* - * "$Id: imagetoraster.c 7306 2008-02-15 00:52:38Z mike $" - * - * Image file to raster filter for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2007 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * main() - Main entry... - * blank_line() - Clear a line buffer to the blank value... - * format_CMY() - Convert image data to CMY. - * format_CMYK() - Convert image data to CMYK. - * format_K() - Convert image data to black. - * format_KCMY() - Convert image data to KCMY. - * format_KCMYcm() - Convert image data to KCMYcm. - * format_RGBA() - Convert image data to RGBA/RGBW. - * format_W() - Convert image data to luminance. - * format_YMC() - Convert image data to YMC. - * format_YMCK() - Convert image data to YMCK. - * make_lut() - Make a lookup table given gamma and brightness values. - * raster_cb() - Validate the page header. - */ - -/* - * Include necessary headers... - */ - -#include "common.h" -#include "image-private.h" -#include -#include -#include -#include - - -/* - * Globals... - */ - -int Flip = 0, /* Flip/mirror pages */ - XPosition = 0, /* Horizontal position on page */ - YPosition = 0, /* Vertical position on page */ - Collate = 0, /* Collate copies? */ - Copies = 1; /* Number of copies */ -int Floyd16x16[16][16] = /* Traditional Floyd ordered dither */ - { - { 0, 128, 32, 160, 8, 136, 40, 168, - 2, 130, 34, 162, 10, 138, 42, 170 }, - { 192, 64, 224, 96, 200, 72, 232, 104, - 194, 66, 226, 98, 202, 74, 234, 106 }, - { 48, 176, 16, 144, 56, 184, 24, 152, - 50, 178, 18, 146, 58, 186, 26, 154 }, - { 240, 112, 208, 80, 248, 120, 216, 88, - 242, 114, 210, 82, 250, 122, 218, 90 }, - { 12, 140, 44, 172, 4, 132, 36, 164, - 14, 142, 46, 174, 6, 134, 38, 166 }, - { 204, 76, 236, 108, 196, 68, 228, 100, - 206, 78, 238, 110, 198, 70, 230, 102 }, - { 60, 188, 28, 156, 52, 180, 20, 148, - 62, 190, 30, 158, 54, 182, 22, 150 }, - { 252, 124, 220, 92, 244, 116, 212, 84, - 254, 126, 222, 94, 246, 118, 214, 86 }, - { 3, 131, 35, 163, 11, 139, 43, 171, - 1, 129, 33, 161, 9, 137, 41, 169 }, - { 195, 67, 227, 99, 203, 75, 235, 107, - 193, 65, 225, 97, 201, 73, 233, 105 }, - { 51, 179, 19, 147, 59, 187, 27, 155, - 49, 177, 17, 145, 57, 185, 25, 153 }, - { 243, 115, 211, 83, 251, 123, 219, 91, - 241, 113, 209, 81, 249, 121, 217, 89 }, - { 15, 143, 47, 175, 7, 135, 39, 167, - 13, 141, 45, 173, 5, 133, 37, 165 }, - { 207, 79, 239, 111, 199, 71, 231, 103, - 205, 77, 237, 109, 197, 69, 229, 101 }, - { 63, 191, 31, 159, 55, 183, 23, 151, - 61, 189, 29, 157, 53, 181, 21, 149 }, - { 254, 127, 223, 95, 247, 119, 215, 87, - 253, 125, 221, 93, 245, 117, 213, 85 } - }; -int Floyd8x8[8][8] = - { - { 0, 32, 8, 40, 2, 34, 10, 42 }, - { 48, 16, 56, 24, 50, 18, 58, 26 }, - { 12, 44, 4, 36, 14, 46, 6, 38 }, - { 60, 28, 52, 20, 62, 30, 54, 22 }, - { 3, 35, 11, 43, 1, 33, 9, 41 }, - { 51, 19, 59, 27, 49, 17, 57, 25 }, - { 15, 47, 7, 39, 13, 45, 5, 37 }, - { 63, 31, 55, 23, 61, 29, 53, 21 } - }; -int Floyd4x4[4][4] = - { - { 0, 8, 2, 10 }, - { 12, 4, 14, 6 }, - { 3, 11, 1, 9 }, - { 15, 7, 13, 5 } - }; - -cups_ib_t OnPixels[256], /* On-pixel LUT */ - OffPixels[256]; /* Off-pixel LUT */ - - -/* - * Local functions... - */ - -static void blank_line(cups_page_header2_t *header, unsigned char *row); -static void format_CMY(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); -static void format_CMYK(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); -static void format_K(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); -static void format_KCMYcm(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); -static void format_KCMY(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); -#define format_RGB format_CMY -static void format_RGBA(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); -static void format_W(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); -static void format_YMC(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); -static void format_YMCK(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); -static void make_lut(cups_ib_t *, int, float, float); -static int raster_cb(cups_page_header2_t *header, int preferred_bits); - - -/* - * 'main()' - Main entry... - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ -{ - int i; /* Looping var */ - cups_image_t *img; /* Image to print */ - float xprint, /* Printable area */ - yprint, - xinches, /* Total size in inches */ - yinches; - float xsize, /* Total size in points */ - ysize, - xsize2, - ysize2; - float aspect; /* Aspect ratio */ - int xpages, /* # x pages */ - ypages, /* # y pages */ - xpage, /* Current x page */ - ypage, /* Current y page */ - xtemp, /* Bitmap width in pixels */ - ytemp, /* Bitmap height in pixels */ - page; /* Current page number */ - int xc0, yc0, /* Corners of the page in image coords */ - xc1, yc1; - ppd_file_t *ppd; /* PPD file */ - ppd_choice_t *choice; /* PPD option choice */ - char *resolution, /* Output resolution */ - *media_type; /* Media type */ - ppd_profile_t *profile; /* Color profile */ - ppd_profile_t userprofile; /* User-specified profile */ - cups_raster_t *ras; /* Raster stream */ - cups_page_header2_t header; /* Page header */ - int num_options; /* Number of print options */ - cups_option_t *options; /* Print options */ - const char *val; /* Option value */ - int slowcollate, /* Collate copies the slow way */ - slowcopies; /* Make copies the "slow" way? */ - float g; /* Gamma correction value */ - float b; /* Brightness factor */ - float zoom; /* Zoom facter */ - int xppi, yppi; /* Pixels-per-inch */ - int hue, sat; /* Hue and saturation adjustment */ - cups_izoom_t *z; /* Image zoom buffer */ - cups_iztype_t zoom_type; /* Image zoom type */ - int primary, /* Primary image colorspace */ - secondary; /* Secondary image colorspace */ - cups_ib_t *row, /* Current row */ - *r0, /* Top row */ - *r1; /* Bottom row */ - int y, /* Current Y coordinate on page */ - iy, /* Current Y coordinate in image */ - last_iy, /* Previous Y coordinate in image */ - yerr0, /* Top Y error value */ - yerr1; /* Bottom Y error value */ - cups_ib_t lut[256]; /* Gamma/brightness LUT */ - int plane, /* Current color plane */ - num_planes; /* Number of color planes */ - char filename[1024]; /* Name of file to print */ - - - /* - * Make sure status messages are not buffered... - */ - - setbuf(stderr, NULL); - - /* - * Ignore broken pipe signals... - */ - - signal(SIGPIPE, SIG_IGN); - - /* - * Check command-line... - */ - - if (argc < 6 || argc > 7) - { - _cupsLangPrintf(stderr, - _("Usage: %s job-id user title copies options file"), - argv[0]); - return (1); - } - - /* - * See if we need to use the imagetops and pstoraster filters instead... - */ - - options = NULL; - num_options = cupsParseOptions(argv[5], 0, &options); - - if (getenv("CLASSIFICATION") || - cupsGetOption("page-label", num_options, options)) - { - /* - * Yes, fork a copy of pstoraster and then transfer control to imagetops... - */ - - int mypipes[2]; /* New pipes for imagetops | pstoraster */ - int pid; /* PID of pstoraster */ - - - cupsFreeOptions(num_options, options); - - if (pipe(mypipes)) - { - _cupsLangPrintError("ERROR", _("Unable to create pipes for filters")); - return (errno); - } - - if ((pid = fork()) == 0) - { - /* - * Child process for pstoraster... Assign new pipe input to pstoraster... - */ - - dup2(mypipes[0], 0); - close(mypipes[0]); - close(mypipes[1]); - - execlp("pstoraster", argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], - NULL); - return (errno); - } - else if (pid < 0) - { - /* - * Error! - */ - - _cupsLangPrintError("ERROR", _("Unable to fork filter")); - return (errno); - } - - /* - * Update stdout so it points at the new pstoraster... - */ - - dup2(mypipes[1], 1); - close(mypipes[0]); - close(mypipes[1]); - - /* - * Run imagetops to get the classification or page labeling that was - * requested... - */ - - execlp("imagetops", argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], - argv[6], NULL); - return (errno); - } - - /* - * Copy stdin as needed... - */ - - if (argc == 6) - { - int fd; /* File to write to */ - char buffer[8192]; /* Buffer to read into */ - int bytes; /* # of bytes to read */ - - - if ((fd = cupsTempFd(filename, sizeof(filename))) < 0) - { - _cupsLangPrintError("ERROR", _("Unable to copy print file")); - return (1); - } - - fprintf(stderr, - "DEBUG: imagetoraster - copying to temp print file \"%s\".\n", - filename); - - while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0) - write(fd, buffer, bytes); - - close(fd); - } - else - strlcpy(filename, argv[6], sizeof(filename)); - - /* - * Process command-line options and write the prolog... - */ - - zoom = 0.0; - xppi = 0; - yppi = 0; - hue = 0; - sat = 100; - g = 1.0; - b = 1.0; - - Copies = atoi(argv[4]); - - ppd = SetCommonOptions(num_options, options, 0); - - if ((val = cupsGetOption("multiple-document-handling", num_options, options)) != NULL) - { - /* - * This IPP attribute is unnecessarily complicated... - * - * single-document, separate-documents-collated-copies, and - * single-document-new-sheet all require collated copies. - * - * separate-documents-collated-copies allows for uncollated copies. - */ - - Collate = _cups_strcasecmp(val, "separate-documents-collated-copies") != 0; - } - - if ((val = cupsGetOption("Collate", num_options, options)) != NULL && - _cups_strcasecmp(val, "True") == 0) - Collate = 1; - - if ((val = cupsGetOption("gamma", num_options, options)) != NULL) - { - /* - * Get gamma value from 1 to 10000... - */ - - g = atoi(val) * 0.001f; - - if (g < 0.001f) - g = 0.001f; - else if (g > 10.0f) - g = 10.0f; - } - - if ((val = cupsGetOption("brightness", num_options, options)) != NULL) - { - /* - * Get brightness value from 10 to 1000. - */ - - b = atoi(val) * 0.01f; - - if (b < 0.1f) - b = 0.1f; - else if (b > 10.0f) - b = 10.0f; - } - - if ((val = cupsGetOption("scaling", num_options, options)) != NULL) - zoom = atoi(val) * 0.01; - else if ((val = cupsGetOption("fitplot", num_options, options)) != NULL && - !_cups_strcasecmp(val, "true")) - zoom = 1.0; - else if ((val = cupsGetOption("fit-to-page", num_options, options)) != NULL && - !_cups_strcasecmp(val, "true")) - zoom = 1.0; - - if ((val = cupsGetOption("ppi", num_options, options)) != NULL) - if (sscanf(val, "%dx%d", &xppi, &yppi) < 2) - yppi = xppi; - - if ((val = cupsGetOption("position", num_options, options)) != NULL) - { - if (_cups_strcasecmp(val, "center") == 0) - { - XPosition = 0; - YPosition = 0; - } - else if (_cups_strcasecmp(val, "top") == 0) - { - XPosition = 0; - YPosition = 1; - } - else if (_cups_strcasecmp(val, "left") == 0) - { - XPosition = -1; - YPosition = 0; - } - else if (_cups_strcasecmp(val, "right") == 0) - { - XPosition = 1; - YPosition = 0; - } - else if (_cups_strcasecmp(val, "top-left") == 0) - { - XPosition = -1; - YPosition = 1; - } - else if (_cups_strcasecmp(val, "top-right") == 0) - { - XPosition = 1; - YPosition = 1; - } - else if (_cups_strcasecmp(val, "bottom") == 0) - { - XPosition = 0; - YPosition = -1; - } - else if (_cups_strcasecmp(val, "bottom-left") == 0) - { - XPosition = -1; - YPosition = -1; - } - else if (_cups_strcasecmp(val, "bottom-right") == 0) - { - XPosition = 1; - YPosition = -1; - } - } - - if ((val = cupsGetOption("saturation", num_options, options)) != NULL) - sat = atoi(val); - - if ((val = cupsGetOption("hue", num_options, options)) != NULL) - hue = atoi(val); - - if ((choice = ppdFindMarkedChoice(ppd, "MirrorPrint")) != NULL) - { - val = choice->choice; - choice->marked = 0; - } - else - val = cupsGetOption("mirror", num_options, options); - - if (val && (!_cups_strcasecmp(val, "true") || !_cups_strcasecmp(val, "on") || - !_cups_strcasecmp(val, "yes"))) - Flip = 1; - - /* - * Set the needed options in the page header... - */ - - if (cupsRasterInterpretPPD(&header, ppd, num_options, options, raster_cb)) - { - _cupsLangPrintFilter(stderr, "ERROR", - _("The page setup information was not valid.")); - fprintf(stderr, "DEBUG: %s\n", cupsRasterErrorString()); - return (1); - } - - /* - * Get the media type and resolution that have been chosen... - */ - - if ((choice = ppdFindMarkedChoice(ppd, "MediaType")) != NULL) - media_type = choice->choice; - else - media_type = ""; - - if ((choice = ppdFindMarkedChoice(ppd, "Resolution")) != NULL) - resolution = choice->choice; - else - resolution = ""; - - /* - * Choose the appropriate colorspace... - */ - - switch (header.cupsColorSpace) - { - case CUPS_CSPACE_W : - case CUPS_CSPACE_SW : - if (header.cupsBitsPerColor >= 8) - { - primary = CUPS_IMAGE_WHITE; - secondary = CUPS_IMAGE_WHITE; - } - else - { - primary = CUPS_IMAGE_BLACK; - secondary = CUPS_IMAGE_BLACK; - } - break; - - default : - case CUPS_CSPACE_RGB : - case CUPS_CSPACE_RGBA : - case CUPS_CSPACE_RGBW : - case CUPS_CSPACE_SRGB : - case CUPS_CSPACE_ADOBERGB : - if (header.cupsBitsPerColor >= 8) - { - primary = CUPS_IMAGE_RGB; - secondary = CUPS_IMAGE_RGB; - } - else - { - primary = CUPS_IMAGE_CMY; - secondary = CUPS_IMAGE_CMY; - } - break; - - case CUPS_CSPACE_K : - case CUPS_CSPACE_WHITE : - case CUPS_CSPACE_GOLD : - case CUPS_CSPACE_SILVER : - primary = CUPS_IMAGE_BLACK; - secondary = CUPS_IMAGE_BLACK; - break; - - case CUPS_CSPACE_CMYK : - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_KCMY : - case CUPS_CSPACE_KCMYcm : - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - if (header.cupsBitsPerColor == 1) - { - primary = CUPS_IMAGE_CMY; - secondary = CUPS_IMAGE_CMY; - } - else - { - primary = CUPS_IMAGE_CMYK; - secondary = CUPS_IMAGE_CMYK; - } - break; - - case CUPS_CSPACE_CMY : - case CUPS_CSPACE_YMC : - primary = CUPS_IMAGE_CMY; - secondary = CUPS_IMAGE_CMY; - break; - - case CUPS_CSPACE_CIEXYZ : - case CUPS_CSPACE_CIELab : - case CUPS_CSPACE_ICC1 : - case CUPS_CSPACE_ICC2 : - case CUPS_CSPACE_ICC3 : - case CUPS_CSPACE_ICC4 : - case CUPS_CSPACE_ICC5 : - case CUPS_CSPACE_ICC6 : - case CUPS_CSPACE_ICC7 : - case CUPS_CSPACE_ICC8 : - case CUPS_CSPACE_ICC9 : - case CUPS_CSPACE_ICCA : - case CUPS_CSPACE_ICCB : - case CUPS_CSPACE_ICCC : - case CUPS_CSPACE_ICCD : - case CUPS_CSPACE_ICCE : - case CUPS_CSPACE_ICCF : - case CUPS_CSPACE_DEVICE1 : - case CUPS_CSPACE_DEVICE2 : - case CUPS_CSPACE_DEVICE3 : - case CUPS_CSPACE_DEVICE4 : - case CUPS_CSPACE_DEVICE5 : - case CUPS_CSPACE_DEVICE6 : - case CUPS_CSPACE_DEVICE7 : - case CUPS_CSPACE_DEVICE8 : - case CUPS_CSPACE_DEVICE9 : - case CUPS_CSPACE_DEVICEA : - case CUPS_CSPACE_DEVICEB : - case CUPS_CSPACE_DEVICEC : - case CUPS_CSPACE_DEVICED : - case CUPS_CSPACE_DEVICEE : - case CUPS_CSPACE_DEVICEF : - fprintf(stderr, "DEBUG: Colorspace %d not supported.\n", - header.cupsColorSpace); - exit(1); - break; - } - - /* - * Find a color profile matching the current options... - */ - - if ((val = cupsGetOption("profile", num_options, options)) != NULL) - { - profile = &userprofile; - sscanf(val, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f", - &(userprofile.density), &(userprofile.gamma), - userprofile.matrix[0] + 0, userprofile.matrix[0] + 1, - userprofile.matrix[0] + 2, - userprofile.matrix[1] + 0, userprofile.matrix[1] + 1, - userprofile.matrix[1] + 2, - userprofile.matrix[2] + 0, userprofile.matrix[2] + 1, - userprofile.matrix[2] + 2); - - userprofile.density *= 0.001f; - userprofile.gamma *= 0.001f; - userprofile.matrix[0][0] *= 0.001f; - userprofile.matrix[0][1] *= 0.001f; - userprofile.matrix[0][2] *= 0.001f; - userprofile.matrix[1][0] *= 0.001f; - userprofile.matrix[1][1] *= 0.001f; - userprofile.matrix[1][2] *= 0.001f; - userprofile.matrix[2][0] *= 0.001f; - userprofile.matrix[2][1] *= 0.001f; - userprofile.matrix[2][2] *= 0.001f; - } - else if (ppd != NULL) - { - fprintf(stderr, "DEBUG: Searching for profile \"%s/%s\"...\n", - resolution, media_type); - - for (i = 0, profile = ppd->profiles; i < ppd->num_profiles; i ++, profile ++) - { - fprintf(stderr, "DEBUG: \"%s/%s\" = ", profile->resolution, - profile->media_type); - - if ((strcmp(profile->resolution, resolution) == 0 || - profile->resolution[0] == '-') && - (strcmp(profile->media_type, media_type) == 0 || - profile->media_type[0] == '-')) - { - fputs("MATCH\n", stderr); - break; - } - else - fputs("no.\n", stderr); - } - - /* - * If we found a color profile, use it! - */ - - if (i >= ppd->num_profiles) - profile = NULL; - } - else - profile = NULL; - - if (profile) - cupsImageSetProfile(profile->density, profile->gamma, profile->matrix); - - cupsImageSetRasterColorSpace(header.cupsColorSpace); - - /* - * Create a gamma/brightness LUT... - */ - - make_lut(lut, primary, g, b); - - /* - * Open the input image to print... - */ - - _cupsLangPrintFilter(stderr, "INFO", _("Loading print file.")); - - if (header.cupsColorSpace == CUPS_CSPACE_CIEXYZ || - header.cupsColorSpace == CUPS_CSPACE_CIELab || - header.cupsColorSpace >= CUPS_CSPACE_ICC1) - img = cupsImageOpen(filename, primary, secondary, sat, hue, NULL); - else - img = cupsImageOpen(filename, primary, secondary, sat, hue, lut); - - if (argc == 6) - unlink(filename); - - if (img == NULL) - { - _cupsLangPrintFilter(stderr, "ERROR", - _("The print file could not be opened.")); - ppdClose(ppd); - return (1); - } - - /* - * Scale as necessary... - */ - - if (zoom == 0.0 && xppi == 0) - { - xppi = img->xppi; - yppi = img->yppi; - } - - if (yppi == 0) - yppi = xppi; - - fprintf(stderr, "DEBUG: Before scaling: xppi=%d, yppi=%d, zoom=%.2f\n", - xppi, yppi, zoom); - - if (xppi > 0) - { - /* - * Scale the image as neccesary to match the desired pixels-per-inch. - */ - - if (Orientation & 1) - { - xprint = (PageTop - PageBottom) / 72.0; - yprint = (PageRight - PageLeft) / 72.0; - } - else - { - xprint = (PageRight - PageLeft) / 72.0; - yprint = (PageTop - PageBottom) / 72.0; - } - - fprintf(stderr, "DEBUG: Before scaling: xprint=%.1f, yprint=%.1f\n", - xprint, yprint); - - xinches = (float)img->xsize / (float)xppi; - yinches = (float)img->ysize / (float)yppi; - - fprintf(stderr, "DEBUG: Image size is %.1f x %.1f inches...\n", - xinches, yinches); - - if ((val = cupsGetOption("natural-scaling", num_options, options)) != NULL) - { - xinches = xinches * atoi(val) / 100; - yinches = yinches * atoi(val) / 100; - } - - if (cupsGetOption("orientation-requested", num_options, options) == NULL && - cupsGetOption("landscape", num_options, options) == NULL) - { - /* - * Rotate the image if it will fit landscape but not portrait... - */ - - fputs("DEBUG: Auto orientation...\n", stderr); - - if ((xinches > xprint || yinches > yprint) && - xinches <= yprint && yinches <= xprint) - { - /* - * Rotate the image as needed... - */ - - fputs("DEBUG: Using landscape orientation...\n", stderr); - - Orientation = (Orientation + 1) & 3; - xsize = yprint; - yprint = xprint; - xprint = xsize; - } - } - } - else - { - /* - * Scale percentage of page size... - */ - - xprint = (PageRight - PageLeft) / 72.0; - yprint = (PageTop - PageBottom) / 72.0; - aspect = (float)img->yppi / (float)img->xppi; - - fprintf(stderr, "DEBUG: Before scaling: xprint=%.1f, yprint=%.1f\n", - xprint, yprint); - - fprintf(stderr, "DEBUG: img->xppi = %d, img->yppi = %d, aspect = %f\n", - img->xppi, img->yppi, aspect); - - xsize = xprint * zoom; - ysize = xsize * img->ysize / img->xsize / aspect; - - if (ysize > (yprint * zoom)) - { - ysize = yprint * zoom; - xsize = ysize * img->xsize * aspect / img->ysize; - } - - xsize2 = yprint * zoom; - ysize2 = xsize2 * img->ysize / img->xsize / aspect; - - if (ysize2 > (xprint * zoom)) - { - ysize2 = xprint * zoom; - xsize2 = ysize2 * img->xsize * aspect / img->ysize; - } - - fprintf(stderr, "DEBUG: Portrait size is %.2f x %.2f inches\n", xsize, ysize); - fprintf(stderr, "DEBUG: Landscape size is %.2f x %.2f inches\n", xsize2, ysize2); - - if (cupsGetOption("orientation-requested", num_options, options) == NULL && - cupsGetOption("landscape", num_options, options) == NULL) - { - /* - * Choose the rotation with the largest area, but prefer - * portrait if they are equal... - */ - - fputs("DEBUG: Auto orientation...\n", stderr); - - if ((xsize * ysize) < (xsize2 * xsize2)) - { - /* - * Do landscape orientation... - */ - - fputs("DEBUG: Using landscape orientation...\n", stderr); - - Orientation = 1; - xinches = xsize2; - yinches = ysize2; - xprint = (PageTop - PageBottom) / 72.0; - yprint = (PageRight - PageLeft) / 72.0; - } - else - { - /* - * Do portrait orientation... - */ - - fputs("DEBUG: Using portrait orientation...\n", stderr); - - Orientation = 0; - xinches = xsize; - yinches = ysize; - } - } - else if (Orientation & 1) - { - fputs("DEBUG: Using landscape orientation...\n", stderr); - - xinches = xsize2; - yinches = ysize2; - xprint = (PageTop - PageBottom) / 72.0; - yprint = (PageRight - PageLeft) / 72.0; - } - else - { - fputs("DEBUG: Using portrait orientation...\n", stderr); - - xinches = xsize; - yinches = ysize; - xprint = (PageRight - PageLeft) / 72.0; - yprint = (PageTop - PageBottom) / 72.0; - } - } - - /* - * Compute the number of pages to print and the size of the image on each - * page... - */ - - xpages = ceil(xinches / xprint); - ypages = ceil(yinches / yprint); - - xprint = xinches / xpages; - yprint = yinches / ypages; - - fprintf(stderr, "DEBUG: xpages = %dx%.2fin, ypages = %dx%.2fin\n", - xpages, xprint, ypages, yprint); - - /* - * Compute the bitmap size... - */ - - if ((choice = ppdFindMarkedChoice(ppd, "PageSize")) != NULL && - _cups_strcasecmp(choice->choice, "Custom") == 0) - { - float width, /* New width in points */ - length; /* New length in points */ - - - /* - * Use the correct width and length for the current orientation... - */ - - if (Orientation & 1) - { - width = yprint * 72.0; - length = xprint * 72.0; - } - else - { - width = xprint * 72.0; - length = yprint * 72.0; - } - - /* - * Add margins to page size... - */ - - width += ppd->custom_margins[0] + ppd->custom_margins[2]; - length += ppd->custom_margins[1] + ppd->custom_margins[3]; - - /* - * Enforce minimums... - */ - - if (width < ppd->custom_min[0]) - width = ppd->custom_min[0]; - - if (length < ppd->custom_min[1]) - length = ppd->custom_min[1]; - - fprintf(stderr, "DEBUG: Updated custom page size to %.2f x %.2f inches...\n", - width / 72.0, length / 72.0); - - /* - * Set the new custom size... - */ - - strcpy(header.cupsPageSizeName, "Custom"); - - header.cupsPageSize[0] = width + 0.5; - header.cupsPageSize[1] = length + 0.5; - header.PageSize[0] = width + 0.5; - header.PageSize[1] = length + 0.5; - - /* - * Update page variables... - */ - - PageWidth = width; - PageLength = length; - PageLeft = ppd->custom_margins[0]; - PageRight = width - ppd->custom_margins[2]; - PageBottom = ppd->custom_margins[1]; - PageTop = length - ppd->custom_margins[3]; - - /* - * Remove margins from page size... - */ - - width -= ppd->custom_margins[0] + ppd->custom_margins[2]; - length -= ppd->custom_margins[1] + ppd->custom_margins[3]; - - /* - * Set the bitmap size... - */ - - header.cupsWidth = width * header.HWResolution[0] / 72.0; - header.cupsHeight = length * header.HWResolution[1] / 72.0; - - header.cupsBytesPerLine = (header.cupsBitsPerPixel * - header.cupsWidth + 7) / 8; - - if (header.cupsColorOrder == CUPS_ORDER_BANDED) - header.cupsBytesPerLine *= header.cupsNumColors; - } - - header.Margins[0] = PageLeft; - header.Margins[1] = PageBottom; - - fprintf(stderr, "DEBUG: PageSize = [%d %d]\n", header.PageSize[0], - header.PageSize[1]); - - switch (Orientation) - { - default : - switch (XPosition) - { - case -1 : - header.cupsImagingBBox[0] = PageLeft; - header.cupsImagingBBox[2] = PageLeft + xprint * 72; - break; - default : - header.cupsImagingBBox[0] = (PageRight + PageLeft - xprint * 72) / 2; - header.cupsImagingBBox[2] = (PageRight + PageLeft + xprint * 72) / 2; - break; - case 1 : - header.cupsImagingBBox[0] = PageRight - xprint * 72; - header.cupsImagingBBox[2] = PageRight; - break; - } - - switch (YPosition) - { - case -1 : - header.cupsImagingBBox[1] = PageBottom; - header.cupsImagingBBox[3] = PageBottom + yprint * 72; - break; - default : - header.cupsImagingBBox[1] = (PageTop + PageBottom - yprint * 72) / 2; - header.cupsImagingBBox[3] = (PageTop + PageBottom + yprint * 72) / 2; - break; - case 1 : - header.cupsImagingBBox[1] = PageTop - yprint * 72; - header.cupsImagingBBox[3] = PageTop; - break; - } - break; - - case 1 : - switch (XPosition) - { - case -1 : - header.cupsImagingBBox[0] = PageBottom; - header.cupsImagingBBox[2] = PageBottom + yprint * 72; - break; - default : - header.cupsImagingBBox[0] = (PageTop + PageBottom - yprint * 72) / 2; - header.cupsImagingBBox[2] = (PageTop + PageBottom + yprint * 72) / 2; - break; - case 1 : - header.cupsImagingBBox[0] = PageTop - yprint * 72; - header.cupsImagingBBox[2] = PageTop; - break; - } - - switch (YPosition) - { - case -1 : - header.cupsImagingBBox[1] = PageLeft; - header.cupsImagingBBox[3] = PageLeft + xprint * 72; - break; - default : - header.cupsImagingBBox[1] = (PageRight + PageLeft - xprint * 72) / 2; - header.cupsImagingBBox[3] = (PageRight + PageLeft + xprint * 72) / 2; - break; - case 1 : - header.cupsImagingBBox[1] = PageRight - xprint * 72; - header.cupsImagingBBox[3] = PageRight; - break; - } - break; - - case 2 : - switch (XPosition) - { - case 1 : - header.cupsImagingBBox[0] = PageLeft; - header.cupsImagingBBox[2] = PageLeft + xprint * 72; - break; - default : - header.cupsImagingBBox[0] = (PageRight + PageLeft - xprint * 72) / 2; - header.cupsImagingBBox[2] = (PageRight + PageLeft + xprint * 72) / 2; - break; - case -1 : - header.cupsImagingBBox[0] = PageRight - xprint * 72; - header.cupsImagingBBox[2] = PageRight; - break; - } - - switch (YPosition) - { - case 1 : - header.cupsImagingBBox[1] = PageBottom; - header.cupsImagingBBox[3] = PageBottom + yprint * 72; - break; - default : - header.cupsImagingBBox[1] = (PageTop + PageBottom - yprint * 72) / 2; - header.cupsImagingBBox[3] = (PageTop + PageBottom + yprint * 72) / 2; - break; - case -1 : - header.cupsImagingBBox[1] = PageTop - yprint * 72; - header.cupsImagingBBox[3] = PageTop; - break; - } - break; - - case 3 : - switch (XPosition) - { - case 1 : - header.cupsImagingBBox[0] = PageBottom; - header.cupsImagingBBox[2] = PageBottom + yprint * 72; - break; - default : - header.cupsImagingBBox[0] = (PageTop + PageBottom - yprint * 72) / 2; - header.cupsImagingBBox[2] = (PageTop + PageBottom + yprint * 72) / 2; - break; - case -1 : - header.cupsImagingBBox[0] = PageTop - yprint * 72; - header.cupsImagingBBox[2] = PageTop; - break; - } - - switch (YPosition) - { - case 1 : - header.cupsImagingBBox[1] = PageLeft; - header.cupsImagingBBox[3] = PageLeft + xprint * 72; - break; - default : - header.cupsImagingBBox[1] = (PageRight + PageLeft - xprint * 72) / 2; - header.cupsImagingBBox[3] = (PageRight + PageLeft + xprint * 72) / 2; - break; - case -1 : - header.cupsImagingBBox[1] = PageRight - xprint * 72; - header.cupsImagingBBox[3] = PageRight; - break; - } - break; - } - - header.ImagingBoundingBox[0] = header.cupsImagingBBox[0]; - header.ImagingBoundingBox[1] = header.cupsImagingBBox[1]; - header.ImagingBoundingBox[2] = header.cupsImagingBBox[2]; - header.ImagingBoundingBox[3] = header.cupsImagingBBox[3]; - - if (header.cupsColorOrder == CUPS_ORDER_PLANAR) - num_planes = header.cupsNumColors; - else - num_planes = 1; - - if (header.cupsBitsPerColor >= 8) - zoom_type = CUPS_IZOOM_NORMAL; - else - zoom_type = CUPS_IZOOM_FAST; - - /* - * See if we need to collate, and if so how we need to do it... - */ - - if (xpages == 1 && ypages == 1) - Collate = 0; - - slowcollate = Collate && ppdFindOption(ppd, "Collate") == NULL; - if (ppd != NULL) - slowcopies = ppd->manual_copies; - else - slowcopies = 1; - - if (Copies > 1 && !slowcollate && !slowcopies) - { - header.Collate = (cups_bool_t)Collate; - header.NumCopies = Copies; - - Copies = 1; - } - else - header.NumCopies = 1; - - /* - * Create the dithering lookup tables... - */ - - OnPixels[0] = 0x00; - OnPixels[255] = 0xff; - OffPixels[0] = 0x00; - OffPixels[255] = 0xff; - - switch (header.cupsBitsPerColor) - { - case 2 : - for (i = 1; i < 255; i ++) - { - OnPixels[i] = 0x55 * (i / 85 + 1); - OffPixels[i] = 0x55 * (i / 64); - } - break; - case 4 : - for (i = 1; i < 255; i ++) - { - OnPixels[i] = 17 * (i / 17 + 1); - OffPixels[i] = 17 * (i / 16); - } - break; - } - - /* - * Output the pages... - */ - - fprintf(stderr, "DEBUG: cupsWidth = %d\n", header.cupsWidth); - fprintf(stderr, "DEBUG: cupsHeight = %d\n", header.cupsHeight); - fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", header.cupsBitsPerColor); - fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", header.cupsBitsPerPixel); - fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", header.cupsBytesPerLine); - fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header.cupsColorOrder); - fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header.cupsColorSpace); - fprintf(stderr, "DEBUG: img->colorspace = %d\n", img->colorspace); - - row = malloc(2 * header.cupsBytesPerLine); - ras = cupsRasterOpen(1, CUPS_RASTER_WRITE); - - for (i = 0, page = 1; i < Copies; i ++) - for (xpage = 0; xpage < xpages; xpage ++) - for (ypage = 0; ypage < ypages; ypage ++, page ++) - { - _cupsLangPrintFilter(stderr, "INFO", _("Formatting page %d."), page); - - if (Orientation & 1) - { - xc0 = img->xsize * ypage / ypages; - xc1 = img->xsize * (ypage + 1) / ypages - 1; - yc0 = img->ysize * xpage / xpages; - yc1 = img->ysize * (xpage + 1) / xpages - 1; - - xtemp = header.HWResolution[0] * yprint; - ytemp = header.HWResolution[1] * xprint; - } - else - { - xc0 = img->xsize * xpage / xpages; - xc1 = img->xsize * (xpage + 1) / xpages - 1; - yc0 = img->ysize * ypage / ypages; - yc1 = img->ysize * (ypage + 1) / ypages - 1; - - xtemp = header.HWResolution[0] * xprint; - ytemp = header.HWResolution[1] * yprint; - } - - cupsRasterWriteHeader2(ras, &header); - - for (plane = 0; plane < num_planes; plane ++) - { - /* - * Initialize the image "zoom" engine... - */ - - if (Flip) - z = _cupsImageZoomNew(img, xc0, yc0, xc1, yc1, -xtemp, ytemp, - Orientation & 1, zoom_type); - else - z = _cupsImageZoomNew(img, xc0, yc0, xc1, yc1, xtemp, ytemp, - Orientation & 1, zoom_type); - - /* - * Write leading blank space as needed... - */ - - if (header.cupsHeight > z->ysize && YPosition <= 0) - { - blank_line(&header, row); - - y = header.cupsHeight - z->ysize; - if (YPosition == 0) - y /= 2; - - fprintf(stderr, "DEBUG: Writing %d leading blank lines...\n", y); - - for (; y > 0; y --) - { - if (cupsRasterWritePixels(ras, row, header.cupsBytesPerLine) < - header.cupsBytesPerLine) - { - _cupsLangPrintFilter(stderr, "ERROR", - _("Unable to send raster data to the " - "driver.")); - cupsImageClose(img); - exit(1); - } - } - } - - /* - * Then write image data... - */ - - for (y = z->ysize, yerr0 = 0, yerr1 = z->ysize, iy = 0, last_iy = -2; - y > 0; - y --) - { - if (iy != last_iy) - { - if (zoom_type != CUPS_IZOOM_FAST && (iy - last_iy) > 1) - _cupsImageZoomFill(z, iy); - - _cupsImageZoomFill(z, iy + z->yincr); - - last_iy = iy; - } - - /* - * Format this line of raster data for the printer... - */ - - blank_line(&header, row); - - r0 = z->rows[z->row]; - r1 = z->rows[1 - z->row]; - - switch (header.cupsColorSpace) - { - case CUPS_CSPACE_W : - format_W(&header, row, y, plane, z->xsize, z->ysize, - yerr0, yerr1, r0, r1); - break; - default : - case CUPS_CSPACE_RGB : - format_RGB(&header, row, y, plane, z->xsize, z->ysize, - yerr0, yerr1, r0, r1); - break; - case CUPS_CSPACE_RGBA : - case CUPS_CSPACE_RGBW : - format_RGBA(&header, row, y, plane, z->xsize, z->ysize, - yerr0, yerr1, r0, r1); - break; - case CUPS_CSPACE_K : - case CUPS_CSPACE_WHITE : - case CUPS_CSPACE_GOLD : - case CUPS_CSPACE_SILVER : - format_K(&header, row, y, plane, z->xsize, z->ysize, - yerr0, yerr1, r0, r1); - break; - case CUPS_CSPACE_CMY : - format_CMY(&header, row, y, plane, z->xsize, z->ysize, - yerr0, yerr1, r0, r1); - break; - case CUPS_CSPACE_YMC : - format_YMC(&header, row, y, plane, z->xsize, z->ysize, - yerr0, yerr1, r0, r1); - break; - case CUPS_CSPACE_CMYK : - format_CMYK(&header, row, y, plane, z->xsize, z->ysize, - yerr0, yerr1, r0, r1); - break; - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - format_YMCK(&header, row, y, plane, z->xsize, z->ysize, - yerr0, yerr1, r0, r1); - break; - case CUPS_CSPACE_KCMYcm : - if (header.cupsBitsPerColor == 1) - { - format_KCMYcm(&header, row, y, plane, z->xsize, z->ysize, - yerr0, yerr1, r0, r1); - break; - } - case CUPS_CSPACE_KCMY : - format_KCMY(&header, row, y, plane, z->xsize, z->ysize, - yerr0, yerr1, r0, r1); - break; - } - - /* - * Write the raster data to the driver... - */ - - if (cupsRasterWritePixels(ras, row, header.cupsBytesPerLine) < - header.cupsBytesPerLine) - { - _cupsLangPrintFilter(stderr, "ERROR", - _("Unable to send raster data to the " - "driver.")); - cupsImageClose(img); - exit(1); - } - - /* - * Compute the next scanline in the image... - */ - - iy += z->ystep; - yerr0 += z->ymod; - yerr1 -= z->ymod; - if (yerr1 <= 0) - { - yerr0 -= z->ysize; - yerr1 += z->ysize; - iy += z->yincr; - } - } - - /* - * Write trailing blank space as needed... - */ - - if (header.cupsHeight > z->ysize && YPosition >= 0) - { - blank_line(&header, row); - - y = header.cupsHeight - z->ysize; - if (YPosition == 0) - y = y - y / 2; - - fprintf(stderr, "DEBUG: Writing %d trailing blank lines...\n", y); - - for (; y > 0; y --) - { - if (cupsRasterWritePixels(ras, row, header.cupsBytesPerLine) < - header.cupsBytesPerLine) - { - _cupsLangPrintFilter(stderr, "ERROR", - _("Unable to send raster data to the " - "driver.")); - cupsImageClose(img); - exit(1); - } - } - } - - /* - * Free memory used for the "zoom" engine... - */ - - _cupsImageZoomDelete(z); - } - } - - /* - * Close files... - */ - - free(row); - cupsRasterClose(ras); - cupsImageClose(img); - ppdClose(ppd); - - return (0); -} - - -/* - * 'blank_line()' - Clear a line buffer to the blank value... - */ - -static void -blank_line(cups_page_header2_t *header, /* I - Page header */ - unsigned char *row) /* I - Row buffer */ -{ - int count; /* Remaining bytes */ - - - count = header->cupsBytesPerLine; - - switch (header->cupsColorSpace) - { - case CUPS_CSPACE_CIEXYZ : - while (count > 2) - { - *row++ = 242; - *row++ = 255; - *row++ = 255; - count -= 3; - } - break; - - case CUPS_CSPACE_CIELab : - case CUPS_CSPACE_ICC1 : - case CUPS_CSPACE_ICC2 : - case CUPS_CSPACE_ICC3 : - case CUPS_CSPACE_ICC4 : - case CUPS_CSPACE_ICC5 : - case CUPS_CSPACE_ICC6 : - case CUPS_CSPACE_ICC7 : - case CUPS_CSPACE_ICC8 : - case CUPS_CSPACE_ICC9 : - case CUPS_CSPACE_ICCA : - case CUPS_CSPACE_ICCB : - case CUPS_CSPACE_ICCC : - case CUPS_CSPACE_ICCD : - case CUPS_CSPACE_ICCE : - case CUPS_CSPACE_ICCF : - while (count > 2) - { - *row++ = 255; - *row++ = 128; - *row++ = 128; - count -= 3; - } - break; - - case CUPS_CSPACE_K : - case CUPS_CSPACE_CMY : - case CUPS_CSPACE_CMYK : - case CUPS_CSPACE_YMC : - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_KCMY : - case CUPS_CSPACE_KCMYcm : - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - case CUPS_CSPACE_WHITE : - case CUPS_CSPACE_GOLD : - case CUPS_CSPACE_SILVER : - memset(row, 0, count); - break; - - default : - memset(row, 255, count); - break; - } -} - - -/* - * 'format_CMY()' - Convert image data to CMY. - */ - -static void -format_CMY(cups_page_header2_t *header, /* I - Page header */ - unsigned char *row, /* IO - Bitmap data for device */ - int y, /* I - Current row */ - int z, /* I - Current plane */ - int xsize, /* I - Width of image data */ - int ysize, /* I - Height of image data */ - int yerr0, /* I - Top Y error */ - int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ -{ - cups_ib_t *ptr, /* Pointer into row */ - *cptr, /* Pointer into cyan */ - *mptr, /* Pointer into magenta */ - *yptr, /* Pointer into yellow */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int bandwidth; /* Width of a color band */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ - - - switch (XPosition) - { - case -1 : - bitoffset = 0; - break; - default : - bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); - break; - case 1 : - bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); - break; - } - - ptr = row + bitoffset / 8; - bandwidth = header->cupsBytesPerLine / 3; - - switch (header->cupsColorOrder) - { - case CUPS_ORDER_CHUNKED : - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 64 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize ; x > 0; x --) - { - if (*r0++ > dither[x & 15]) - *ptr ^= bitmask; - bitmask >>= 1; - - if (*r0++ > dither[x & 15]) - *ptr ^= bitmask; - bitmask >>= 1; - - if (*r0++ > dither[x & 15]) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 2; - else - { - bitmask = 64; - ptr ++; - } - } - break; - - case 2 : - dither = Floyd8x8[y & 7]; - - for (x = xsize ; x > 0; x --, r0 += 3) - { - if ((r0[0] & 63) > dither[x & 7]) - *ptr ^= (0x30 & OnPixels[r0[0]]); - else - *ptr ^= (0x30 & OffPixels[r0[0]]); - - if ((r0[1] & 63) > dither[x & 7]) - *ptr ^= (0x0c & OnPixels[r0[1]]); - else - *ptr ^= (0x0c & OffPixels[r0[1]]); - - if ((r0[2] & 63) > dither[x & 7]) - *ptr++ ^= (0x03 & OnPixels[r0[2]]); - else - *ptr++ ^= (0x03 & OffPixels[r0[2]]); - } - break; - - case 4 : - dither = Floyd4x4[y & 3]; - - for (x = xsize ; x > 0; x --, r0 += 3) - { - if ((r0[0] & 15) > dither[x & 3]) - *ptr++ ^= (0x0f & OnPixels[r0[0]]); - else - *ptr++ ^= (0x0f & OffPixels[r0[0]]); - - if ((r0[1] & 15) > dither[x & 3]) - *ptr ^= (0xf0 & OnPixels[r0[1]]); - else - *ptr ^= (0xf0 & OffPixels[r0[1]]); - - if ((r0[2] & 15) > dither[x & 3]) - *ptr++ ^= (0x0f & OnPixels[r0[2]]); - else - *ptr++ ^= (0x0f & OffPixels[r0[2]]); - } - break; - - case 8 : - for (x = xsize * 3; x > 0; x --, r0 ++, r1 ++) - if (*r0 == *r1) - *ptr++ = *r0; - else - *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; - break; - } - break; - - case CUPS_ORDER_BANDED : - cptr = ptr; - mptr = ptr + bandwidth; - yptr = ptr + 2 * bandwidth; - - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize; x > 0; x --) - { - if (*r0++ > dither[x & 15]) - *cptr ^= bitmask; - if (*r0++ > dither[x & 15]) - *mptr ^= bitmask; - if (*r0++ > dither[x & 15]) - *yptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - cptr ++; - mptr ++; - yptr ++; - } - } - break; - - case 2 : - bitmask = 0xc0 >> (bitoffset & 7); - dither = Floyd8x8[y & 7]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 63) > dither[x & 7]) - *cptr ^= (bitmask & OnPixels[*r0++]); - else - *cptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *mptr ^= (bitmask & OnPixels[*r0++]); - else - *mptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *yptr ^= (bitmask & OnPixels[*r0++]); - else - *yptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask > 3) - bitmask >>= 2; - else - { - bitmask = 0xc0; - - cptr ++; - mptr ++; - yptr ++; - } - } - break; - - case 4 : - bitmask = 0xf0 >> (bitoffset & 7); - dither = Floyd4x4[y & 3]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 15) > dither[x & 3]) - *cptr ^= (bitmask & OnPixels[*r0++]); - else - *cptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *mptr ^= (bitmask & OnPixels[*r0++]); - else - *mptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *yptr ^= (bitmask & OnPixels[*r0++]); - else - *yptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask == 0xf0) - bitmask = 0x0f; - else - { - bitmask = 0xf0; - - cptr ++; - mptr ++; - yptr ++; - } - } - break; - - case 8 : - for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) - { - if (r0[0] == r1[0]) - *cptr++ = r0[0]; - else - *cptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; - - if (r0[1] == r1[1]) - *mptr++ = r0[1]; - else - *mptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; - - if (r0[2] == r1[2]) - *yptr++ = r0[2]; - else - *yptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; - } - break; - } - break; - - case CUPS_ORDER_PLANAR : - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - switch (z) - { - case 0 : - for (x = xsize; x > 0; x --, r0 += 3) - { - if (r0[0] > dither[x & 15]) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - - case 1 : - for (x = xsize; x > 0; x --, r0 += 3) - { - if (r0[1] > dither[x & 15]) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - - case 2 : - for (x = xsize; x > 0; x --, r0 += 3) - { - if (r0[2] > dither[x & 15]) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - } - break; - - case 2 : - bitmask = 0xc0 >> (bitoffset & 7); - dither = Floyd8x8[y & 7]; - r0 += z; - - for (x = xsize; x > 0; x --, r0 += 3) - { - if ((*r0 & 63) > dither[x & 7]) - *ptr ^= (bitmask & OnPixels[*r0]); - else - *ptr ^= (bitmask & OffPixels[*r0]); - - if (bitmask > 3) - bitmask >>= 2; - else - { - bitmask = 0xc0; - - ptr ++; - } - } - break; - - case 4 : - bitmask = 0xf0 >> (bitoffset & 7); - dither = Floyd4x4[y & 3]; - r0 += z; - - for (x = xsize; x > 0; x --, r0 += 3) - { - if ((*r0 & 15) > dither[x & 3]) - *ptr ^= (bitmask & OnPixels[*r0]); - else - *ptr ^= (bitmask & OffPixels[*r0]); - - if (bitmask == 0xf0) - bitmask = 0x0f; - else - { - bitmask = 0xf0; - - ptr ++; - } - } - break; - - case 8 : - r0 += z; - r1 += z; - - for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) - { - if (*r0 == *r1) - *ptr++ = *r0; - else - *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; - } - break; - } - break; - } -} - - -/* - * 'format_CMYK()' - Convert image data to CMYK. - */ - -static void -format_CMYK(cups_page_header2_t *header,/* I - Page header */ - unsigned char *row, /* IO - Bitmap data for device */ - int y, /* I - Current row */ - int z, /* I - Current plane */ - int xsize, /* I - Width of image data */ - int ysize, /* I - Height of image data */ - int yerr0, /* I - Top Y error */ - int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ -{ - cups_ib_t *ptr, /* Pointer into row */ - *cptr, /* Pointer into cyan */ - *mptr, /* Pointer into magenta */ - *yptr, /* Pointer into yellow */ - *kptr, /* Pointer into black */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int bandwidth; /* Width of a color band */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ - int pc, pm, py; /* CMY pixels */ - - - switch (XPosition) - { - case -1 : - bitoffset = 0; - break; - default : - bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); - break; - case 1 : - bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); - break; - } - - ptr = row + bitoffset / 8; - bandwidth = header->cupsBytesPerLine / 4; - - switch (header->cupsColorOrder) - { - case CUPS_ORDER_CHUNKED : - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 128 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize ; x > 0; x --) - { - pc = *r0++ > dither[x & 15]; - pm = *r0++ > dither[x & 15]; - py = *r0++ > dither[x & 15]; - - if (pc && pm && py) - { - bitmask >>= 3; - *ptr ^= bitmask; - } - else - { - if (pc) - *ptr ^= bitmask; - bitmask >>= 1; - - if (pm) - *ptr ^= bitmask; - bitmask >>= 1; - - if (py) - *ptr ^= bitmask; - bitmask >>= 1; - } - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 128; - ptr ++; - } - } - break; - - case 2 : - dither = Floyd8x8[y & 7]; - - for (x = xsize ; x > 0; x --, r0 += 4) - { - if ((r0[0] & 63) > dither[x & 7]) - *ptr ^= (0xc0 & OnPixels[r0[0]]); - else - *ptr ^= (0xc0 & OffPixels[r0[0]]); - - if ((r0[1] & 63) > dither[x & 7]) - *ptr ^= (0x30 & OnPixels[r0[1]]); - else - *ptr ^= (0x30 & OffPixels[r0[1]]); - - if ((r0[2] & 63) > dither[x & 7]) - *ptr ^= (0x0c & OnPixels[r0[2]]); - else - *ptr ^= (0x0c & OffPixels[r0[2]]); - - if ((r0[3] & 63) > dither[x & 7]) - *ptr++ ^= (0x03 & OnPixels[r0[3]]); - else - *ptr++ ^= (0x03 & OffPixels[r0[3]]); - } - break; - - case 4 : - dither = Floyd4x4[y & 3]; - - for (x = xsize ; x > 0; x --, r0 += 4) - { - if ((r0[0] & 15) > dither[x & 3]) - *ptr ^= (0xf0 & OnPixels[r0[0]]); - else - *ptr ^= (0xf0 & OffPixels[r0[0]]); - - if ((r0[1] & 15) > dither[x & 3]) - *ptr++ ^= (0x0f & OnPixels[r0[1]]); - else - *ptr++ ^= (0x0f & OffPixels[r0[1]]); - - if ((r0[2] & 15) > dither[x & 3]) - *ptr ^= (0xf0 & OnPixels[r0[2]]); - else - *ptr ^= (0xf0 & OffPixels[r0[2]]); - - if ((r0[3] & 15) > dither[x & 3]) - *ptr++ ^= (0x0f & OnPixels[r0[3]]); - else - *ptr++ ^= (0x0f & OffPixels[r0[3]]); - } - break; - - case 8 : - for (x = xsize * 4; x > 0; x --, r0 ++, r1 ++) - if (*r0 == *r1) - *ptr++ = *r0; - else - *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; - break; - } - break; - - case CUPS_ORDER_BANDED : - cptr = ptr; - mptr = ptr + bandwidth; - yptr = ptr + 2 * bandwidth; - kptr = ptr + 3 * bandwidth; - - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize; x > 0; x --) - { - pc = *r0++ > dither[x & 15]; - pm = *r0++ > dither[x & 15]; - py = *r0++ > dither[x & 15]; - - if (pc && pm && py) - *kptr ^= bitmask; - else - { - if (pc) - *cptr ^= bitmask; - if (pm) - *mptr ^= bitmask; - if (py) - *yptr ^= bitmask; - } - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - cptr ++; - mptr ++; - yptr ++; - kptr ++; - } - } - break; - - case 2 : - bitmask = 0xc0 >> (bitoffset & 7); - dither = Floyd8x8[y & 7]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 63) > dither[x & 7]) - *cptr ^= (bitmask & OnPixels[*r0++]); - else - *cptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *mptr ^= (bitmask & OnPixels[*r0++]); - else - *mptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *yptr ^= (bitmask & OnPixels[*r0++]); - else - *yptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *kptr ^= (bitmask & OnPixels[*r0++]); - else - *kptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask > 3) - bitmask >>= 2; - else - { - bitmask = 0xc0; - - cptr ++; - mptr ++; - yptr ++; - kptr ++; - } - } - break; - - case 4 : - bitmask = 0xf0 >> (bitoffset & 7); - dither = Floyd4x4[y & 3]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 15) > dither[x & 3]) - *cptr ^= (bitmask & OnPixels[*r0++]); - else - *cptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *mptr ^= (bitmask & OnPixels[*r0++]); - else - *mptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *yptr ^= (bitmask & OnPixels[*r0++]); - else - *yptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *kptr ^= (bitmask & OnPixels[*r0++]); - else - *kptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask == 0xf0) - bitmask = 0x0f; - else - { - bitmask = 0xf0; - - cptr ++; - mptr ++; - yptr ++; - kptr ++; - } - } - break; - - case 8 : - for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) - { - if (r0[0] == r1[0]) - *cptr++ = r0[0]; - else - *cptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; - - if (r0[1] == r1[1]) - *mptr++ = r0[1]; - else - *mptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; - - if (r0[2] == r1[2]) - *yptr++ = r0[2]; - else - *yptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; - - if (r0[3] == r1[3]) - *kptr++ = r0[3]; - else - *kptr++ = (r0[3] * yerr0 + r1[3] * yerr1) / ysize; - } - break; - } - break; - - case CUPS_ORDER_PLANAR : - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize; x > 0; x --) - { - pc = *r0++ > dither[x & 15]; - pm = *r0++ > dither[x & 15]; - py = *r0++ > dither[x & 15]; - - if ((pc && pm && py && z == 3) || - (pc && z == 0) || (pm && z == 1) || (py && z == 2)) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - - case 2 : - bitmask = 0xc0 >> (bitoffset & 7); - dither = Floyd8x8[y & 7]; - r0 += z; - - for (x = xsize; x > 0; x --, r0 += 4) - { - if ((*r0 & 63) > dither[x & 7]) - *ptr ^= (bitmask & OnPixels[*r0]); - else - *ptr ^= (bitmask & OffPixels[*r0]); - - if (bitmask > 3) - bitmask >>= 2; - else - { - bitmask = 0xc0; - - ptr ++; - } - } - break; - - case 4 : - bitmask = 0xf0 >> (bitoffset & 7); - dither = Floyd4x4[y & 3]; - r0 += z; - - for (x = xsize; x > 0; x --, r0 += 4) - { - if ((*r0 & 15) > dither[x & 3]) - *ptr ^= (bitmask & OnPixels[*r0]); - else - *ptr ^= (bitmask & OffPixels[*r0]); - - if (bitmask == 0xf0) - bitmask = 0x0f; - else - { - bitmask = 0xf0; - - ptr ++; - } - } - break; - - case 8 : - r0 += z; - r1 += z; - - for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) - { - if (*r0 == *r1) - *ptr++ = *r0; - else - *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; - } - break; - } - break; - } -} - - -/* - * 'format_K()' - Convert image data to black. - */ - -static void -format_K(cups_page_header2_t *header, /* I - Page header */ - unsigned char *row, /* IO - Bitmap data for device */ - int y, /* I - Current row */ - int z, /* I - Current plane */ - int xsize, /* I - Width of image data */ - int ysize, /* I - Height of image data */ - int yerr0, /* I - Top Y error */ - int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ -{ - cups_ib_t *ptr, /* Pointer into row */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ - - - (void)z; - - switch (XPosition) - { - case -1 : - bitoffset = 0; - break; - default : - bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); - break; - case 1 : - bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); - break; - } - - ptr = row + bitoffset / 8; - - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize; x > 0; x --) - { - if (*r0++ > dither[x & 15]) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - - case 2 : - bitmask = 0xc0 >> (bitoffset & 7); - dither = Floyd8x8[y & 7]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 63) > dither[x & 7]) - *ptr ^= (bitmask & OnPixels[*r0++]); - else - *ptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask > 3) - bitmask >>= 2; - else - { - bitmask = 0xc0; - - ptr ++; - } - } - break; - - case 4 : - bitmask = 0xf0 >> (bitoffset & 7); - dither = Floyd4x4[y & 3]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 15) > dither[x & 3]) - *ptr ^= (bitmask & OnPixels[*r0++]); - else - *ptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask == 0xf0) - bitmask = 0x0f; - else - { - bitmask = 0xf0; - - ptr ++; - } - } - break; - - case 8 : - for (x = xsize; x > 0; x --, r0 ++, r1 ++) - { - if (*r0 == *r1) - *ptr++ = *r0; - else - *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; - } - break; - } -} - - -/* - * 'format_KCMY()' - Convert image data to KCMY. - */ - -static void -format_KCMY(cups_page_header2_t *header,/* I - Page header */ - unsigned char *row, /* IO - Bitmap data for device */ - int y, /* I - Current row */ - int z, /* I - Current plane */ - int xsize, /* I - Width of image data */ - int ysize, /* I - Height of image data */ - int yerr0, /* I - Top Y error */ - int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ -{ - cups_ib_t *ptr, /* Pointer into row */ - *cptr, /* Pointer into cyan */ - *mptr, /* Pointer into magenta */ - *yptr, /* Pointer into yellow */ - *kptr, /* Pointer into black */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int bandwidth; /* Width of a color band */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ - int pc, pm, py; /* CMY pixels */ - - - switch (XPosition) - { - case -1 : - bitoffset = 0; - break; - default : - bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); - break; - case 1 : - bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); - break; - } - - ptr = row + bitoffset / 8; - bandwidth = header->cupsBytesPerLine / 4; - - switch (header->cupsColorOrder) - { - case CUPS_ORDER_CHUNKED : - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 128 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize ; x > 0; x --) - { - pc = *r0++ > dither[x & 15]; - pm = *r0++ > dither[x & 15]; - py = *r0++ > dither[x & 15]; - - if (pc && pm && py) - { - *ptr ^= bitmask; - bitmask >>= 3; - } - else - { - bitmask >>= 1; - if (pc) - *ptr ^= bitmask; - - bitmask >>= 1; - if (pm) - *ptr ^= bitmask; - - bitmask >>= 1; - if (py) - *ptr ^= bitmask; - } - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 128; - ptr ++; - } - } - break; - - case 2 : - dither = Floyd8x8[y & 7]; - - for (x = xsize ; x > 0; x --, r0 += 4) - { - if ((r0[3] & 63) > dither[x & 7]) - *ptr ^= (0xc0 & OnPixels[r0[3]]); - else - *ptr ^= (0xc0 & OffPixels[r0[3]]); - - if ((r0[0] & 63) > dither[x & 7]) - *ptr ^= (0x30 & OnPixels[r0[0]]); - else - *ptr ^= (0x30 & OffPixels[r0[0]]); - - if ((r0[1] & 63) > dither[x & 7]) - *ptr ^= (0x0c & OnPixels[r0[1]]); - else - *ptr ^= (0x0c & OffPixels[r0[1]]); - - if ((r0[2] & 63) > dither[x & 7]) - *ptr++ ^= (0x03 & OnPixels[r0[2]]); - else - *ptr++ ^= (0x03 & OffPixels[r0[2]]); - } - break; - - case 4 : - dither = Floyd4x4[y & 3]; - - for (x = xsize ; x > 0; x --, r0 += 4) - { - if ((r0[3] & 15) > dither[x & 3]) - *ptr ^= (0xf0 & OnPixels[r0[3]]); - else - *ptr ^= (0xf0 & OffPixels[r0[3]]); - - if ((r0[0] & 15) > dither[x & 3]) - *ptr++ ^= (0x0f & OnPixels[r0[0]]); - else - *ptr++ ^= (0x0f & OffPixels[r0[0]]); - - if ((r0[1] & 15) > dither[x & 3]) - *ptr ^= (0xf0 & OnPixels[r0[1]]); - else - *ptr ^= (0xf0 & OffPixels[r0[1]]); - - if ((r0[2] & 15) > dither[x & 3]) - *ptr++ ^= (0x0f & OnPixels[r0[2]]); - else - *ptr++ ^= (0x0f & OffPixels[r0[2]]); - } - break; - - case 8 : - for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) - { - if (r0[3] == r1[3]) - *ptr++ = r0[3]; - else - *ptr++ = (r0[3] * yerr0 + r1[3] * yerr1) / ysize; - - if (r0[0] == r1[0]) - *ptr++ = r0[0]; - else - *ptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; - - if (r0[1] == r1[1]) - *ptr++ = r0[1]; - else - *ptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; - - if (r0[2] == r1[2]) - *ptr++ = r0[2]; - else - *ptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; - } - break; - } - break; - - case CUPS_ORDER_BANDED : - kptr = ptr; - cptr = ptr + bandwidth; - mptr = ptr + 2 * bandwidth; - yptr = ptr + 3 * bandwidth; - - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize; x > 0; x --) - { - pc = *r0++ > dither[x & 15]; - pm = *r0++ > dither[x & 15]; - py = *r0++ > dither[x & 15]; - - if (pc && pm && py) - *kptr ^= bitmask; - else - { - if (pc) - *cptr ^= bitmask; - if (pm) - *mptr ^= bitmask; - if (py) - *yptr ^= bitmask; - } - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - cptr ++; - mptr ++; - yptr ++; - kptr ++; - } - } - break; - - case 2 : - bitmask = 0xc0 >> (bitoffset & 7); - dither = Floyd8x8[y & 7]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 63) > dither[x & 7]) - *cptr ^= (bitmask & OnPixels[*r0++]); - else - *cptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *mptr ^= (bitmask & OnPixels[*r0++]); - else - *mptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *yptr ^= (bitmask & OnPixels[*r0++]); - else - *yptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *kptr ^= (bitmask & OnPixels[*r0++]); - else - *kptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask > 3) - bitmask >>= 2; - else - { - bitmask = 0xc0; - - cptr ++; - mptr ++; - yptr ++; - kptr ++; - } - } - break; - - case 4 : - bitmask = 0xf0 >> (bitoffset & 7); - dither = Floyd4x4[y & 3]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 15) > dither[x & 3]) - *cptr ^= (bitmask & OnPixels[*r0++]); - else - *cptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *mptr ^= (bitmask & OnPixels[*r0++]); - else - *mptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *yptr ^= (bitmask & OnPixels[*r0++]); - else - *yptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *kptr ^= (bitmask & OnPixels[*r0++]); - else - *kptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask == 0xf0) - bitmask = 0x0f; - else - { - bitmask = 0xf0; - - cptr ++; - mptr ++; - yptr ++; - kptr ++; - } - } - break; - - case 8 : - for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) - { - if (r0[0] == r1[0]) - *cptr++ = r0[0]; - else - *cptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; - - if (r0[1] == r1[1]) - *mptr++ = r0[1]; - else - *mptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; - - if (r0[2] == r1[2]) - *yptr++ = r0[2]; - else - *yptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; - - if (r0[3] == r1[3]) - *kptr++ = r0[3]; - else - *kptr++ = (r0[3] * yerr0 + r1[3] * yerr1) / ysize; - } - break; - } - break; - - case CUPS_ORDER_PLANAR : - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize; x > 0; x --) - { - pc = *r0++ > dither[x & 15]; - pm = *r0++ > dither[x & 15]; - py = *r0++ > dither[x & 15]; - - if ((pc && pm && py && z == 0) || - (pc && z == 1) || (pm && z == 2) || (py && z == 3)) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - - case 2 : - bitmask = 0xc0 >> (bitoffset & 7); - dither = Floyd8x8[y & 7]; - if (z == 0) - r0 += 3; - else - r0 += z - 1; - - for (x = xsize; x > 0; x --, r0 += 4) - { - if ((*r0 & 63) > dither[x & 7]) - *ptr ^= (bitmask & OnPixels[*r0]); - else - *ptr ^= (bitmask & OffPixels[*r0]); - - if (bitmask > 3) - bitmask >>= 2; - else - { - bitmask = 0xc0; - - ptr ++; - } - } - break; - - case 4 : - bitmask = 0xf0 >> (bitoffset & 7); - dither = Floyd4x4[y & 3]; - if (z == 0) - r0 += 3; - else - r0 += z - 1; - - for (x = xsize; x > 0; x --, r0 += 4) - { - if ((*r0 & 15) > dither[x & 3]) - *ptr ^= (bitmask & OnPixels[*r0]); - else - *ptr ^= (bitmask & OffPixels[*r0]); - - if (bitmask == 0xf0) - bitmask = 0x0f; - else - { - bitmask = 0xf0; - - ptr ++; - } - } - break; - - case 8 : - if (z == 0) - { - r0 += 3; - r1 += 3; - } - else - { - r0 += z - 1; - r1 += z - 1; - } - - for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) - { - if (*r0 == *r1) - *ptr++ = *r0; - else - *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; - } - break; - } - break; - } -} - - -/* - * 'format_KCMYcm()' - Convert image data to KCMYcm. - */ - -static void -format_KCMYcm( - cups_page_header2_t *header, /* I - Page header */ - unsigned char *row, /* IO - Bitmap data for device */ - int y, /* I - Current row */ - int z, /* I - Current plane */ - int xsize, /* I - Width of image data */ - int ysize, /* I - Height of image data */ - int yerr0, /* I - Top Y error */ - int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ -{ - int pc, pm, py, pk; /* Cyan, magenta, yellow, and black values */ - cups_ib_t *ptr, /* Pointer into row */ - *cptr, /* Pointer into cyan */ - *mptr, /* Pointer into magenta */ - *yptr, /* Pointer into yellow */ - *kptr, /* Pointer into black */ - *lcptr, /* Pointer into light cyan */ - *lmptr, /* Pointer into light magenta */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int bandwidth; /* Width of a color band */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ - - - switch (XPosition) - { - case -1 : - bitoffset = 0; - break; - default : - bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); - break; - case 1 : - bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); - break; - } - - ptr = row + bitoffset / 8; - bandwidth = header->cupsBytesPerLine / 6; - - switch (header->cupsColorOrder) - { - case CUPS_ORDER_CHUNKED : - dither = Floyd16x16[y & 15]; - - for (x = xsize ; x > 0; x --) - { - pc = *r0++ > dither[x & 15]; - pm = *r0++ > dither[x & 15]; - py = *r0++ > dither[x & 15]; - pk = pc && pm && py; - - if (pk) - *ptr++ ^= 32; /* Black */ - else if (pc && pm) - *ptr++ ^= 17; /* Blue (cyan + light magenta) */ - else if (pc && py) - *ptr++ ^= 6; /* Green (light cyan + yellow) */ - else if (pm && py) - *ptr++ ^= 12; /* Red (magenta + yellow) */ - else if (pc) - *ptr++ ^= 16; - else if (pm) - *ptr++ ^= 8; - else if (py) - *ptr++ ^= 4; - else - ptr ++; - } - break; - - case CUPS_ORDER_BANDED : - kptr = ptr; - cptr = ptr + bandwidth; - mptr = ptr + 2 * bandwidth; - yptr = ptr + 3 * bandwidth; - lcptr = ptr + 4 * bandwidth; - lmptr = ptr + 5 * bandwidth; - - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize; x > 0; x --) - { - pc = *r0++ > dither[x & 15]; - pm = *r0++ > dither[x & 15]; - py = *r0++ > dither[x & 15]; - pk = pc && pm && py; - - if (pk) - *kptr ^= bitmask; /* Black */ - else if (pc && pm) - { - *cptr ^= bitmask; /* Blue (cyan + light magenta) */ - *lmptr ^= bitmask; - } - else if (pc && py) - { - *lcptr ^= bitmask; /* Green (light cyan + yellow) */ - *yptr ^= bitmask; - } - else if (pm && py) - { - *mptr ^= bitmask; /* Red (magenta + yellow) */ - *yptr ^= bitmask; - } - else if (pc) - *cptr ^= bitmask; - else if (pm) - *mptr ^= bitmask; - else if (py) - *yptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - cptr ++; - mptr ++; - yptr ++; - kptr ++; - lcptr ++; - lmptr ++; - } - } - break; - - case CUPS_ORDER_PLANAR : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize; x > 0; x --) - { - pc = *r0++ > dither[x & 15]; - pm = *r0++ > dither[x & 15]; - py = *r0++ > dither[x & 15]; - pk = pc && pm && py; - - if (pk && z == 0) - *ptr ^= bitmask; - else if (pc && pm && (z == 1 || z == 5)) - *ptr ^= bitmask; /* Blue (cyan + light magenta) */ - else if (pc && py && (z == 3 || z == 4)) - *ptr ^= bitmask; /* Green (light cyan + yellow) */ - else if (pm && py && (z == 2 || z == 3)) - *ptr ^= bitmask; /* Red (magenta + yellow) */ - else if (pc && z == 1) - *ptr ^= bitmask; - else if (pm && z == 2) - *ptr ^= bitmask; - else if (py && z == 3) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - } -} - - -/* - * 'format_RGBA()' - Convert image data to RGBA/RGBW. - */ - -static void -format_RGBA(cups_page_header2_t *header,/* I - Page header */ - unsigned char *row, /* IO - Bitmap data for device */ - int y, /* I - Current row */ - int z, /* I - Current plane */ - int xsize, /* I - Width of image data */ - int ysize, /* I - Height of image data */ - int yerr0, /* I - Top Y error */ - int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ -{ - cups_ib_t *ptr, /* Pointer into row */ - *cptr, /* Pointer into cyan */ - *mptr, /* Pointer into magenta */ - *yptr, /* Pointer into yellow */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int bandwidth; /* Width of a color band */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ - - - switch (XPosition) - { - case -1 : - bitoffset = 0; - break; - default : - bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); - break; - case 1 : - bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); - break; - } - - ptr = row + bitoffset / 8; - bandwidth = header->cupsBytesPerLine / 4; - - switch (header->cupsColorOrder) - { - case CUPS_ORDER_CHUNKED : - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 128 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize ; x > 0; x --) - { - if (*r0++ > dither[x & 15]) - *ptr ^= bitmask; - bitmask >>= 1; - - if (*r0++ > dither[x & 15]) - *ptr ^= bitmask; - bitmask >>= 1; - - if (*r0++ > dither[x & 15]) - *ptr ^= bitmask; - - if (bitmask > 2) - bitmask >>= 2; - else - { - bitmask = 128; - ptr ++; - } - } - break; - - case 2 : - dither = Floyd8x8[y & 7]; - - for (x = xsize ; x > 0; x --, r0 += 3) - { - if ((r0[0] & 63) > dither[x & 7]) - *ptr ^= (0xc0 & OnPixels[r0[0]]); - else - *ptr ^= (0xc0 & OffPixels[r0[0]]); - - if ((r0[1] & 63) > dither[x & 7]) - *ptr ^= (0x30 & OnPixels[r0[1]]); - else - *ptr ^= (0x30 & OffPixels[r0[1]]); - - if ((r0[2] & 63) > dither[x & 7]) - *ptr ^= (0x0c & OnPixels[r0[2]]); - else - *ptr ^= (0x0c & OffPixels[r0[2]]); - - ptr ++; - } - break; - - case 4 : - dither = Floyd4x4[y & 3]; - - for (x = xsize ; x > 0; x --, r0 += 3) - { - if ((r0[0] & 15) > dither[x & 3]) - *ptr ^= (0xf0 & OnPixels[r0[0]]); - else - *ptr ^= (0xf0 & OffPixels[r0[0]]); - - if ((r0[1] & 15) > dither[x & 3]) - *ptr++ ^= (0x0f & OnPixels[r0[1]]); - else - *ptr++ ^= (0x0f & OffPixels[r0[1]]); - - if ((r0[2] & 15) > dither[x & 3]) - *ptr ^= (0xf0 & OnPixels[r0[2]]); - else - *ptr ^= (0xf0 & OffPixels[r0[2]]); - - ptr ++; - } - break; - - case 8 : - for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) - { - if (r0[0] == r1[0]) - *ptr++ = r0[0]; - else - *ptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; - - if (r0[1] == r1[1]) - *ptr++ = r0[1]; - else - *ptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; - - if (r0[2] == r1[2]) - *ptr++ = r0[2]; - else - *ptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; - - ptr ++; - } - break; - } - break; - - case CUPS_ORDER_BANDED : - cptr = ptr; - mptr = ptr + bandwidth; - yptr = ptr + 2 * bandwidth; - - memset(ptr + 3 * bandwidth, 255, bandwidth); - - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize; x > 0; x --) - { - if (*r0++ > dither[x & 15]) - *cptr ^= bitmask; - if (*r0++ > dither[x & 15]) - *mptr ^= bitmask; - if (*r0++ > dither[x & 15]) - *yptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - cptr ++; - mptr ++; - yptr ++; - } - } - break; - - case 2 : - bitmask = 0xc0 >> (bitoffset & 7); - dither = Floyd8x8[y & 7]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 63) > dither[x & 7]) - *cptr ^= (bitmask & OnPixels[*r0++]); - else - *cptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *mptr ^= (bitmask & OnPixels[*r0++]); - else - *mptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *yptr ^= (bitmask & OnPixels[*r0++]); - else - *yptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask > 3) - bitmask >>= 2; - else - { - bitmask = 0xc0; - - cptr ++; - mptr ++; - yptr ++; - } - } - break; - - case 4 : - bitmask = 0xf0 >> (bitoffset & 7); - dither = Floyd4x4[y & 3]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 15) > dither[x & 3]) - *cptr ^= (bitmask & OnPixels[*r0++]); - else - *cptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *mptr ^= (bitmask & OnPixels[*r0++]); - else - *mptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *yptr ^= (bitmask & OnPixels[*r0++]); - else - *yptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask == 0xf0) - bitmask = 0x0f; - else - { - bitmask = 0xf0; - - cptr ++; - mptr ++; - yptr ++; - } - } - break; - - case 8 : - for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) - { - if (r0[0] == r1[0]) - *cptr++ = r0[0]; - else - *cptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; - - if (r0[1] == r1[1]) - *mptr++ = r0[1]; - else - *mptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; - - if (r0[2] == r1[2]) - *yptr++ = r0[2]; - else - *yptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; - } - break; - } - break; - - case CUPS_ORDER_PLANAR : - if (z == 3) - { - memset(row, 255, header->cupsBytesPerLine); - break; - } - - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - switch (z) - { - case 0 : - for (x = xsize; x > 0; x --, r0 += 3) - { - if (r0[0] > dither[x & 15]) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - - case 1 : - for (x = xsize; x > 0; x --, r0 += 3) - { - if (r0[1] > dither[x & 15]) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - - case 2 : - for (x = xsize; x > 0; x --, r0 += 3) - { - if (r0[2] > dither[x & 15]) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - } - break; - - case 2 : - bitmask = 0xc0 >> (bitoffset & 7); - dither = Floyd8x8[y & 7]; - r0 += z; - - for (x = xsize; x > 0; x --, r0 += 3) - { - if ((*r0 & 63) > dither[x & 7]) - *ptr ^= (bitmask & OnPixels[*r0]); - else - *ptr ^= (bitmask & OffPixels[*r0]); - - if (bitmask > 3) - bitmask >>= 2; - else - { - bitmask = 0xc0; - - ptr ++; - } - } - break; - - case 4 : - bitmask = 0xf0 >> (bitoffset & 7); - dither = Floyd4x4[y & 3]; - r0 += z; - - for (x = xsize; x > 0; x --, r0 += 3) - { - if ((*r0 & 15) > dither[x & 3]) - *ptr ^= (bitmask & OnPixels[*r0]); - else - *ptr ^= (bitmask & OffPixels[*r0]); - - if (bitmask == 0xf0) - bitmask = 0x0f; - else - { - bitmask = 0xf0; - - ptr ++; - } - } - break; - - case 8 : - r0 += z; - r1 += z; - - for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) - { - if (*r0 == *r1) - *ptr++ = *r0; - else - *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; - } - break; - } - break; - } -} - - -/* - * 'format_W()' - Convert image data to luminance. - */ - -static void -format_W(cups_page_header2_t *header, /* I - Page header */ - unsigned char *row, /* IO - Bitmap data for device */ - int y, /* I - Current row */ - int z, /* I - Current plane */ - int xsize, /* I - Width of image data */ - int ysize, /* I - Height of image data */ - int yerr0, /* I - Top Y error */ - int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ -{ - cups_ib_t *ptr, /* Pointer into row */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ - - - (void)z; - - switch (XPosition) - { - case -1 : - bitoffset = 0; - break; - default : - bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); - break; - case 1 : - bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); - break; - } - - ptr = row + bitoffset / 8; - - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize; x > 0; x --) - { - if (*r0++ > dither[x & 15]) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - - case 2 : - bitmask = 0xc0 >> (bitoffset & 7); - dither = Floyd8x8[y & 7]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 63) > dither[x & 7]) - *ptr ^= (bitmask & OnPixels[*r0++]); - else - *ptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask > 3) - bitmask >>= 2; - else - { - bitmask = 0xc0; - - ptr ++; - } - } - break; - - case 4 : - bitmask = 0xf0 >> (bitoffset & 7); - dither = Floyd4x4[y & 3]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 15) > dither[x & 3]) - *ptr ^= (bitmask & OnPixels[*r0++]); - else - *ptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask == 0xf0) - bitmask = 0x0f; - else - { - bitmask = 0xf0; - - ptr ++; - } - } - break; - - case 8 : - for (x = xsize; x > 0; x --, r0 ++, r1 ++) - { - if (*r0 == *r1) - *ptr++ = *r0; - else - *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; - } - break; - } -} - - -/* - * 'format_YMC()' - Convert image data to YMC. - */ - -static void -format_YMC(cups_page_header2_t *header, /* I - Page header */ - unsigned char *row, /* IO - Bitmap data for device */ - int y, /* I - Current row */ - int z, /* I - Current plane */ - int xsize, /* I - Width of image data */ - int ysize, /* I - Height of image data */ - int yerr0, /* I - Top Y error */ - int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ -{ - cups_ib_t *ptr, /* Pointer into row */ - *cptr, /* Pointer into cyan */ - *mptr, /* Pointer into magenta */ - *yptr, /* Pointer into yellow */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int bandwidth; /* Width of a color band */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ - - - switch (XPosition) - { - case -1 : - bitoffset = 0; - break; - default : - bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); - break; - case 1 : - bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); - break; - } - - ptr = row + bitoffset / 8; - bandwidth = header->cupsBytesPerLine / 3; - - switch (header->cupsColorOrder) - { - case CUPS_ORDER_CHUNKED : - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 64 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize ; x > 0; x --, r0 += 3) - { - if (r0[2] > dither[x & 15]) - *ptr ^= bitmask; - bitmask >>= 1; - - if (r0[1] > dither[x & 15]) - *ptr ^= bitmask; - bitmask >>= 1; - - if (r0[0] > dither[x & 15]) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 2; - else - { - bitmask = 64; - ptr ++; - } - } - break; - - case 2 : - dither = Floyd8x8[y & 7]; - - for (x = xsize ; x > 0; x --, r0 += 3) - { - if ((r0[2] & 63) > dither[x & 7]) - *ptr ^= (0x30 & OnPixels[r0[2]]); - else - *ptr ^= (0x30 & OffPixels[r0[2]]); - - if ((r0[1] & 63) > dither[x & 7]) - *ptr ^= (0x0c & OnPixels[r0[1]]); - else - *ptr ^= (0x0c & OffPixels[r0[1]]); - - if ((r0[0] & 63) > dither[x & 7]) - *ptr++ ^= (0x03 & OnPixels[r0[0]]); - else - *ptr++ ^= (0x03 & OffPixels[r0[0]]); - } - break; - - case 4 : - dither = Floyd4x4[y & 3]; - - for (x = xsize ; x > 0; x --, r0 += 3) - { - if ((r0[2] & 15) > dither[x & 3]) - *ptr++ ^= (0x0f & OnPixels[r0[2]]); - else - *ptr++ ^= (0x0f & OffPixels[r0[2]]); - - if ((r0[1] & 15) > dither[x & 3]) - *ptr ^= (0xf0 & OnPixels[r0[1]]); - else - *ptr ^= (0xf0 & OffPixels[r0[1]]); - - if ((r0[0] & 15) > dither[x & 3]) - *ptr++ ^= (0x0f & OnPixels[r0[0]]); - else - *ptr++ ^= (0x0f & OffPixels[r0[0]]); - } - break; - - case 8 : - for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) - { - if (r0[2] == r1[2]) - *ptr++ = r0[2]; - else - *ptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; - - if (r0[1] == r1[1]) - *ptr++ = r0[1]; - else - *ptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; - - if (r0[0] == r1[0]) - *ptr++ = r0[0]; - else - *ptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; - } - break; - } - break; - - case CUPS_ORDER_BANDED : - yptr = ptr; - mptr = ptr + bandwidth; - cptr = ptr + 2 * bandwidth; - - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize; x > 0; x --) - { - if (*r0++ > dither[x & 15]) - *cptr ^= bitmask; - if (*r0++ > dither[x & 15]) - *mptr ^= bitmask; - if (*r0++ > dither[x & 15]) - *yptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - cptr ++; - mptr ++; - yptr ++; - } - } - break; - - case 2 : - bitmask = 0xc0 >> (bitoffset & 7); - dither = Floyd8x8[y & 7]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 63) > dither[x & 7]) - *cptr ^= (bitmask & OnPixels[*r0++]); - else - *cptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *mptr ^= (bitmask & OnPixels[*r0++]); - else - *mptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *yptr ^= (bitmask & OnPixels[*r0++]); - else - *yptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask > 3) - bitmask >>= 2; - else - { - bitmask = 0xc0; - - cptr ++; - mptr ++; - yptr ++; - } - } - break; - - case 4 : - bitmask = 0xf0 >> (bitoffset & 7); - dither = Floyd4x4[y & 3]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 15) > dither[x & 3]) - *cptr ^= (bitmask & OnPixels[*r0++]); - else - *cptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *mptr ^= (bitmask & OnPixels[*r0++]); - else - *mptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *yptr ^= (bitmask & OnPixels[*r0++]); - else - *yptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask == 0xf0) - bitmask = 0x0f; - else - { - bitmask = 0xf0; - - cptr ++; - mptr ++; - yptr ++; - } - } - break; - - case 8 : - for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) - { - if (r0[0] == r1[0]) - *cptr++ = r0[0]; - else - *cptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; - - if (r0[1] == r1[1]) - *mptr++ = r0[1]; - else - *mptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; - - if (r0[2] == r1[2]) - *yptr++ = r0[2]; - else - *yptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; - } - break; - } - break; - - case CUPS_ORDER_PLANAR : - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - switch (z) - { - case 2 : - for (x = xsize; x > 0; x --, r0 += 3) - { - if (r0[0] > dither[x & 15]) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - - case 1 : - for (x = xsize; x > 0; x --, r0 += 3) - { - if (r0[1] > dither[x & 15]) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - - case 0 : - for (x = xsize; x > 0; x --, r0 += 3) - { - if (r0[2] > dither[x & 15]) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - } - break; - - case 2 : - bitmask = 0xc0 >> (bitoffset & 7); - dither = Floyd8x8[y & 7]; - z = 2 - z; - r0 += z; - - for (x = xsize; x > 0; x --, r0 += 3) - { - if ((*r0 & 63) > dither[x & 7]) - *ptr ^= (bitmask & OnPixels[*r0]); - else - *ptr ^= (bitmask & OffPixels[*r0]); - - if (bitmask > 3) - bitmask >>= 2; - else - { - bitmask = 0xc0; - - ptr ++; - } - } - break; - - case 4 : - bitmask = 0xf0 >> (bitoffset & 7); - dither = Floyd4x4[y & 3]; - z = 2 - z; - r0 += z; - - for (x = xsize; x > 0; x --, r0 += 3) - { - if ((*r0 & 15) > dither[x & 3]) - *ptr ^= (bitmask & OnPixels[*r0]); - else - *ptr ^= (bitmask & OffPixels[*r0]); - - if (bitmask == 0xf0) - bitmask = 0x0f; - else - { - bitmask = 0xf0; - - ptr ++; - } - } - break; - - case 8 : - z = 2 - z; - r0 += z; - r1 += z; - - for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) - { - if (*r0 == *r1) - *ptr++ = *r0; - else - *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; - } - break; - } - break; - } -} - - -/* - * 'format_YMCK()' - Convert image data to YMCK. - */ - -static void -format_YMCK(cups_page_header2_t *header,/* I - Page header */ - unsigned char *row, /* IO - Bitmap data for device */ - int y, /* I - Current row */ - int z, /* I - Current plane */ - int xsize, /* I - Width of image data */ - int ysize, /* I - Height of image data */ - int yerr0, /* I - Top Y error */ - int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ -{ - cups_ib_t *ptr, /* Pointer into row */ - *cptr, /* Pointer into cyan */ - *mptr, /* Pointer into magenta */ - *yptr, /* Pointer into yellow */ - *kptr, /* Pointer into black */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int bandwidth; /* Width of a color band */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ - int pc, pm, py; /* CMY pixels */ - - - switch (XPosition) - { - case -1 : - bitoffset = 0; - break; - default : - bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); - break; - case 1 : - bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); - break; - } - - ptr = row + bitoffset / 8; - bandwidth = header->cupsBytesPerLine / 4; - - switch (header->cupsColorOrder) - { - case CUPS_ORDER_CHUNKED : - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 128 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize ; x > 0; x --) - { - pc = *r0++ > dither[x & 15]; - pm = *r0++ > dither[x & 15]; - py = *r0++ > dither[x & 15]; - - if (pc && pm && py) - { - bitmask >>= 3; - *ptr ^= bitmask; - } - else - { - if (py) - *ptr ^= bitmask; - bitmask >>= 1; - - if (pm) - *ptr ^= bitmask; - bitmask >>= 1; - - if (pc) - *ptr ^= bitmask; - bitmask >>= 1; - } - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 128; - - ptr ++; - } - } - break; - - case 2 : - dither = Floyd8x8[y & 7]; - - for (x = xsize ; x > 0; x --, r0 += 4) - { - if ((r0[2] & 63) > dither[x & 7]) - *ptr ^= (0xc0 & OnPixels[r0[2]]); - else - *ptr ^= (0xc0 & OffPixels[r0[2]]); - - if ((r0[1] & 63) > dither[x & 7]) - *ptr ^= (0x30 & OnPixels[r0[1]]); - else - *ptr ^= (0x30 & OffPixels[r0[1]]); - - if ((r0[0] & 63) > dither[x & 7]) - *ptr ^= (0x0c & OnPixels[r0[0]]); - else - *ptr ^= (0x0c & OffPixels[r0[0]]); - - if ((r0[3] & 63) > dither[x & 7]) - *ptr++ ^= (0x03 & OnPixels[r0[3]]); - else - *ptr++ ^= (0x03 & OffPixels[r0[3]]); - } - break; - - case 4 : - dither = Floyd4x4[y & 3]; - - for (x = xsize ; x > 0; x --, r0 += 4) - { - if ((r0[2] & 15) > dither[x & 3]) - *ptr ^= (0xf0 & OnPixels[r0[2]]); - else - *ptr ^= (0xf0 & OffPixels[r0[2]]); - - if ((r0[1] & 15) > dither[x & 3]) - *ptr++ ^= (0x0f & OnPixels[r0[1]]); - else - *ptr++ ^= (0x0f & OffPixels[r0[1]]); - - if ((r0[0] & 15) > dither[x & 3]) - *ptr ^= (0xf0 & OnPixels[r0[0]]); - else - *ptr ^= (0xf0 & OffPixels[r0[0]]); - - if ((r0[3] & 15) > dither[x & 3]) - *ptr++ ^= (0x0f & OnPixels[r0[3]]); - else - *ptr++ ^= (0x0f & OffPixels[r0[3]]); - } - break; - - case 8 : - for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) - { - if (r0[2] == r1[2]) - *ptr++ = r0[2]; - else - *ptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; - - if (r0[1] == r1[1]) - *ptr++ = r0[1]; - else - *ptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; - - if (r0[0] == r1[0]) - *ptr++ = r0[0]; - else - *ptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; - - if (r0[3] == r1[3]) - *ptr++ = r0[3]; - else - *ptr++ = (r0[3] * yerr0 + r1[3] * yerr1) / ysize; - } - break; - } - break; - - case CUPS_ORDER_BANDED : - yptr = ptr; - mptr = ptr + bandwidth; - cptr = ptr + 2 * bandwidth; - kptr = ptr + 3 * bandwidth; - - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize; x > 0; x --) - { - pc = *r0++ > dither[x & 15]; - pm = *r0++ > dither[x & 15]; - py = *r0++ > dither[x & 15]; - - if (pc && pm && py) - *kptr ^= bitmask; - else - { - if (pc) - *cptr ^= bitmask; - if (pm) - *mptr ^= bitmask; - if (py) - *yptr ^= bitmask; - } - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - - cptr ++; - mptr ++; - yptr ++; - kptr ++; - } - } - break; - - case 2 : - bitmask = 0xc0 >> (bitoffset & 7); - dither = Floyd8x8[y & 7]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 63) > dither[x & 7]) - *cptr ^= (bitmask & OnPixels[*r0++]); - else - *cptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *mptr ^= (bitmask & OnPixels[*r0++]); - else - *mptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *yptr ^= (bitmask & OnPixels[*r0++]); - else - *yptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 63) > dither[x & 7]) - *kptr ^= (bitmask & OnPixels[*r0++]); - else - *kptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask > 3) - bitmask >>= 2; - else - { - bitmask = 0xc0; - - cptr ++; - mptr ++; - yptr ++; - kptr ++; - } - } - break; - - case 4 : - bitmask = 0xf0 >> (bitoffset & 7); - dither = Floyd4x4[y & 3]; - - for (x = xsize; x > 0; x --) - { - if ((*r0 & 15) > dither[x & 3]) - *cptr ^= (bitmask & OnPixels[*r0++]); - else - *cptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *mptr ^= (bitmask & OnPixels[*r0++]); - else - *mptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *yptr ^= (bitmask & OnPixels[*r0++]); - else - *yptr ^= (bitmask & OffPixels[*r0++]); - - if ((*r0 & 15) > dither[x & 3]) - *kptr ^= (bitmask & OnPixels[*r0++]); - else - *kptr ^= (bitmask & OffPixels[*r0++]); - - if (bitmask == 0xf0) - bitmask = 0x0f; - else - { - bitmask = 0xf0; - - cptr ++; - mptr ++; - yptr ++; - kptr ++; - } - } - break; - - case 8 : - for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) - { - if (r0[0] == r1[0]) - *cptr++ = r0[0]; - else - *cptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; - - if (r0[1] == r1[1]) - *mptr++ = r0[1]; - else - *mptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; - - if (r0[2] == r1[2]) - *yptr++ = r0[2]; - else - *yptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; - - if (r0[3] == r1[3]) - *kptr++ = r0[3]; - else - *kptr++ = (r0[3] * yerr0 + r1[3] * yerr1) / ysize; - } - break; - } - break; - - case CUPS_ORDER_PLANAR : - switch (header->cupsBitsPerColor) - { - case 1 : - bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; - - for (x = xsize; x > 0; x --) - { - pc = *r0++ > dither[x & 15]; - pm = *r0++ > dither[x & 15]; - py = *r0++ > dither[x & 15]; - - if ((pc && pm && py && z == 3) || - (pc && z == 2) || (pm && z == 1) || (py && z == 0)) - *ptr ^= bitmask; - - if (bitmask > 1) - bitmask >>= 1; - else - { - bitmask = 0x80; - ptr ++; - } - } - break; - - case 2 : - bitmask = 0xc0 >> (bitoffset & 7); - dither = Floyd8x8[y & 7]; - if (z == 3) - r0 += 3; - else - r0 += 2 - z; - - for (x = xsize; x > 0; x --, r0 += 4) - { - if ((*r0 & 63) > dither[x & 7]) - *ptr ^= (bitmask & OnPixels[*r0]); - else - *ptr ^= (bitmask & OffPixels[*r0]); - - if (bitmask > 3) - bitmask >>= 2; - else - { - bitmask = 0xc0; - - ptr ++; - } - } - break; - - case 4 : - bitmask = 0xf0 >> (bitoffset & 7); - dither = Floyd4x4[y & 3]; - if (z == 3) - r0 += 3; - else - r0 += 2 - z; - - for (x = xsize; x > 0; x --, r0 += 4) - { - if ((*r0 & 15) > dither[x & 3]) - *ptr ^= (bitmask & OnPixels[*r0]); - else - *ptr ^= (bitmask & OffPixels[*r0]); - - if (bitmask == 0xf0) - bitmask = 0x0f; - else - { - bitmask = 0xf0; - - ptr ++; - } - } - break; - - case 8 : - if (z == 3) - { - r0 += 3; - r1 += 3; - } - else - { - r0 += 2 - z; - r1 += 2 - z; - } - - for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) - { - if (*r0 == *r1) - *ptr++ = *r0; - else - *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; - } - break; - } - break; - } -} - - -/* - * 'make_lut()' - Make a lookup table given gamma and brightness values. - */ - -static void -make_lut(cups_ib_t *lut, /* I - Lookup table */ - int colorspace, /* I - Colorspace */ - float g, /* I - Image gamma */ - float b) /* I - Image brightness */ -{ - int i; /* Looping var */ - int v; /* Current value */ - - - g = 1.0 / g; - b = 1.0 / b; - - for (i = 0; i < 256; i ++) - { - if (colorspace < 0) - v = 255.0 * b * (1.0 - pow(1.0 - (float)i / 255.0, g)) + 0.5; - else - v = 255.0 * (1.0 - b * (1.0 - pow((float)i / 255.0, g))) + 0.5; - - if (v < 0) - *lut++ = 0; - else if (v > 255) - *lut++ = 255; - else - *lut++ = v; - } -} - - -/* - * 'raster_cb()' - Validate the page header. - */ - -static int /* O - 0 if OK, -1 if not */ -raster_cb( - cups_page_header2_t *header, /* IO - Raster header */ - int preferred_bits) /* I - Preferred bits per color */ -{ - /* - * Ensure that colorimetric colorspaces use at least 8 bits per - * component... - */ - - if ((header->cupsColorSpace == CUPS_CSPACE_CIEXYZ || - header->cupsColorSpace == CUPS_CSPACE_CIELab || - header->cupsColorSpace >= CUPS_CSPACE_ICC1) && - header->cupsBitsPerColor < 8) - header->cupsBitsPerColor = 8; - - return (0); -} - - -/* - * End of "$Id: imagetoraster.c 7306 2008-02-15 00:52:38Z mike $". - */ diff --git a/filter/interpret.c b/filter/interpret.c index 017e578dc..32e6821db 100644 --- a/filter/interpret.c +++ b/filter/interpret.c @@ -3,7 +3,7 @@ * * PPD command interpreter for CUPS. * - * Copyright 2007-2010 by Apple Inc. + * Copyright 2007-2011 by Apple Inc. * Copyright 1993-2007 by Easy Software Products. * * These coded instructions, statements, and computer programs are the @@ -40,7 +40,7 @@ * Include necessary headers... */ -#include "image-private.h" +#include /* diff --git a/filter/libcupsimage.order b/filter/libcupsimage.order deleted file mode 100644 index e69de29bb..000000000 diff --git a/filter/pdftops.c b/filter/pdftops.c deleted file mode 100644 index 76da65dba..000000000 --- a/filter/pdftops.c +++ /dev/null @@ -1,621 +0,0 @@ -/* - * "$Id$" - * - * PDF to PostScript filter front-end for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * main() - Main entry for filter... - * cancel_job() - Flag the job as canceled. - */ - -/* - * Include necessary headers... - */ - -#include -#include -#include -#include -#include -#include -#include - - -/* - * Local functions... - */ - -static void cancel_job(int sig); - - -/* - * Local globals... - */ - -static int job_canceled = 0; - - -/* - * 'main()' - Main entry for filter... - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line args */ - char *argv[]) /* I - Command-line arguments */ -{ - int fd; /* Copy file descriptor */ - char *filename, /* PDF file to convert */ - tempfile[1024]; /* Temporary file */ - char buffer[8192]; /* Copy buffer */ - int bytes; /* Bytes copied */ - int num_options; /* Number of options */ - cups_option_t *options; /* Options */ - const char *val; /* Option value */ - int orientation, /* Output orientation */ - fit; /* Fit output to default page size? */ - ppd_file_t *ppd; /* PPD file */ - ppd_size_t *size; /* Current page size */ - int pdf_pid, /* Process ID for pdftops */ - pdf_argc, /* Number of args for pdftops */ - pstops_pid, /* Process ID of pstops filter */ - pstops_pipe[2], /* Pipe to pstops filter */ - wait_children, /* Number of child processes left */ - wait_pid, /* Process ID from wait() */ - wait_status, /* Status from child */ - exit_status = 0; /* Exit status */ - char *pdf_argv[100], /* Arguments for pdftops/gs */ - pdf_width[255], /* Paper width */ - pdf_height[255], /* Paper height */ - pstops_path[1024], /* Path to pstops program */ - *pstops_argv[7], /* Arguments for pstops filter */ - *pstops_options, /* Options for pstops filter */ - *pstops_start, /* Start of pstops filter option */ - *pstops_end; /* End of pstops filter option */ - const char *cups_serverbin; /* CUPS_SERVERBIN environment variable */ -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ - - - /* - * Make sure status messages are not buffered... - */ - - setbuf(stderr, NULL); - - /* - * Ignore broken pipe signals... - */ - - signal(SIGPIPE, SIG_IGN); - - /* - * Make sure we have the right number of arguments for CUPS! - */ - - if (argc < 6 || argc > 7) - { - _cupsLangPrintf(stderr, - _("Usage: %s job user title copies options [filename]"), - argv[0]); - return (1); - } - - /* - * Register a signal handler to cleanly cancel a job. - */ - -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, cancel_job); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = cancel_job; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, cancel_job); -#endif /* HAVE_SIGSET */ - - /* - * Copy stdin if needed... - */ - - if (argc == 6) - { - /* - * Copy stdin to a temp file... - */ - - if ((fd = cupsTempFd(tempfile, sizeof(tempfile))) < 0) - { - perror("DEBUG: Unable to copy PDF file"); - return (1); - } - - fprintf(stderr, "DEBUG: pdftops - copying to temp print file \"%s\"\n", - tempfile); - - while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0) - write(fd, buffer, bytes); - - close(fd); - - filename = tempfile; - } - else - { - /* - * Use the filename on the command-line... - */ - - filename = argv[6]; - tempfile[0] = '\0'; - } - - /* - * Load the PPD file and mark options... - */ - - ppd = ppdOpenFile(getenv("PPD")); - num_options = cupsParseOptions(argv[5], 0, &options); - - ppdMarkDefaults(ppd); - cupsMarkOptions(ppd, num_options, options); - - /* - * Build the pstops command-line... - */ - - if ((cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL) - cups_serverbin = CUPS_SERVERBIN; - - snprintf(pstops_path, sizeof(pstops_path), "%s/filter/pstops", - cups_serverbin); - - pstops_options = strdup(argv[5]); - - if ((pstops_start = strstr(pstops_options, "fitplot")) != NULL && - (!pstops_start[7] || isspace(pstops_start[7] & 255))) - { - /* - * Strip [no]fitplot option... - */ - - pstops_end = pstops_start + 7; - - if ((pstops_start - pstops_options) >= 2 && - !strncmp(pstops_start - 2, "no", 2)) - pstops_start -= 2; - - while (*pstops_end && isspace(*pstops_end & 255)) - pstops_end ++; - - _cups_strcpy(pstops_start, pstops_end); - } - - if ((pstops_start = strstr(pstops_options, "fit-to-page")) != NULL && - (!pstops_start[11] || isspace(pstops_start[11] & 255))) - { - /* - * Strip [no]fit-to-page option... - */ - - pstops_end = pstops_start + 11; - - if ((pstops_start - pstops_options) >= 2 && - !strncmp(pstops_start - 2, "no", 2)) - pstops_start -= 2; - - while (*pstops_end && isspace(*pstops_end & 255)) - pstops_end ++; - - _cups_strcpy(pstops_start, pstops_end); - } - - if ((pstops_start = strstr(pstops_options, "landscape")) != NULL && - (!pstops_start[9] || isspace(pstops_start[9] & 255))) - { - /* - * Strip [no]landscape option... - */ - - pstops_end = pstops_start + 9; - - if ((pstops_start - pstops_options) >= 2 && - !strncmp(pstops_start - 2, "no", 2)) - pstops_start -= 2; - - while (*pstops_end && isspace(*pstops_end & 255)) - pstops_end ++; - - _cups_strcpy(pstops_start, pstops_end); - } - - if ((pstops_start = strstr(pstops_options, "orientation-requested=")) != NULL) - { - /* - * Strip [no]fitplot option... - */ - - pstops_end = pstops_start + 22; - while (*pstops_end && !isspace(*pstops_end & 255)) - pstops_end ++; - - _cups_strcpy(pstops_start, pstops_end); - } - - pstops_argv[0] = argv[0]; /* Printer */ - pstops_argv[1] = argv[1]; /* Job */ - pstops_argv[2] = argv[2]; /* User */ - pstops_argv[3] = argv[3]; /* Title */ - pstops_argv[4] = argv[4]; /* Copies */ - pstops_argv[5] = pstops_options; /* Options */ - pstops_argv[6] = NULL; - - /* - * Build the command-line for the pdftops or gs filter... - */ - -#ifdef HAVE_PDFTOPS - pdf_argv[0] = (char *)"pdftops"; - pdf_argc = 1; -#else - pdf_argv[0] = (char *)"gs"; - pdf_argv[1] = (char *)"-q"; - pdf_argv[2] = (char *)"-dNOPAUSE"; - pdf_argv[3] = (char *)"-dBATCH"; - pdf_argv[4] = (char *)"-dSAFER"; -# ifdef HAVE_GHOSTSCRIPT_PS2WRITE - pdf_argv[5] = (char *)"-sDEVICE=ps2write"; -# else - pdf_argv[5] = (char *)"-sDEVICE=pswrite"; -# endif /* HAVE_GHOSTSCRIPT_PS2WRITE */ - pdf_argv[6] = (char *)"-sOUTPUTFILE=%stdout"; - pdf_argc = 7; -#endif /* HAVE_PDFTOPS */ - - if (ppd) - { - /* - * Set language level and TrueType font handling... - */ - - if (ppd->language_level == 1) - { -#ifdef HAVE_PDFTOPS - pdf_argv[pdf_argc++] = (char *)"-level1"; - pdf_argv[pdf_argc++] = (char *)"-noembtt"; -#else - pdf_argv[pdf_argc++] = (char *)"-dLanguageLevel=1"; -#endif /* HAVE_PDFTOPS */ - } - else if (ppd->language_level == 2) - { -#ifdef HAVE_PDFTOPS - pdf_argv[pdf_argc++] = (char *)"-level2"; - if (!ppd->ttrasterizer) - pdf_argv[pdf_argc++] = (char *)"-noembtt"; -#else - pdf_argv[pdf_argc++] = (char *)"-dLanguageLevel=2"; -#endif /* HAVE_PDFTOPS */ - } - else -#ifdef HAVE_PDFTOPS - pdf_argv[pdf_argc++] = (char *)"-level3"; -#else - pdf_argv[pdf_argc++] = (char *)"-dLanguageLevel=3"; -#endif /* HAVE_PDFTOPS */ - - if ((val = cupsGetOption("fitplot", num_options, options)) == NULL) - val = cupsGetOption("fit-to-page", num_options, options); - - if (val && _cups_strcasecmp(val, "no") && _cups_strcasecmp(val, "off") && - _cups_strcasecmp(val, "false")) - fit = 1; - else - fit = 0; - - /* - * Set output page size... - */ - - size = ppdPageSize(ppd, NULL); - if (size && fit) - { - /* - * Got the size, now get the orientation... - */ - - orientation = 0; - - if ((val = cupsGetOption("landscape", num_options, options)) != NULL) - { - if (_cups_strcasecmp(val, "no") != 0 && _cups_strcasecmp(val, "off") != 0 && - _cups_strcasecmp(val, "false") != 0) - orientation = 1; - } - else if ((val = cupsGetOption("orientation-requested", num_options, - options)) != NULL) - { - /* - * Map IPP orientation values to 0 to 3: - * - * 3 = 0 degrees = 0 - * 4 = 90 degrees = 1 - * 5 = -90 degrees = 3 - * 6 = 180 degrees = 2 - */ - - orientation = atoi(val) - 3; - if (orientation >= 2) - orientation ^= 1; - } - -#ifdef HAVE_PDFTOPS - if (orientation & 1) - { - snprintf(pdf_width, sizeof(pdf_width), "%.0f", size->length); - snprintf(pdf_height, sizeof(pdf_height), "%.0f", size->width); - } - else - { - snprintf(pdf_width, sizeof(pdf_width), "%.0f", size->width); - snprintf(pdf_height, sizeof(pdf_height), "%.0f", size->length); - } - - pdf_argv[pdf_argc++] = (char *)"-paperw"; - pdf_argv[pdf_argc++] = pdf_width; - pdf_argv[pdf_argc++] = (char *)"-paperh"; - pdf_argv[pdf_argc++] = pdf_height; - pdf_argv[pdf_argc++] = (char *)"-expand"; - -#else - if (orientation & 1) - { - snprintf(pdf_width, sizeof(pdf_width), "-dDEVICEWIDTHPOINTS=%.0f", - size->length); - snprintf(pdf_height, sizeof(pdf_height), "-dDEVICEHEIGHTPOINTS=%.0f", - size->width); - } - else - { - snprintf(pdf_width, sizeof(pdf_width), "-dDEVICEWIDTHPOINTS=%.0f", - size->width); - snprintf(pdf_height, sizeof(pdf_height), "-dDEVICEHEIGHTPOINTS=%.0f", - size->length); - } - - pdf_argv[pdf_argc++] = pdf_width; - pdf_argv[pdf_argc++] = pdf_height; -#endif /* HAVE_PDFTOPS */ - } -#if defined(HAVE_PDFTOPS) && defined(HAVE_PDFTOPS_WITH_ORIGPAGESIZES) - else - { - /* - * Use the page sizes of the original PDF document, this way documents - * which contain pages of different sizes can be printed correctly - */ - - pdf_argv[pdf_argc++] = (char *)"-origpagesizes"; - } -#endif /* HAVE_PDFTOPS && HAVE_PDFTOPS_WITH_ORIGPAGESIZES */ - } - -#ifdef HAVE_PDFTOPS - pdf_argv[pdf_argc++] = filename; - pdf_argv[pdf_argc++] = (char *)"-"; -#else - pdf_argv[pdf_argc++] = (char *)"-c"; - pdf_argv[pdf_argc++] = (char *)"save pop"; - pdf_argv[pdf_argc++] = (char *)"-f"; - pdf_argv[pdf_argc++] = filename; -#endif /* HAVE_PDFTOPS */ - - pdf_argv[pdf_argc] = NULL; - - /* - * Execute "pdftops/gs | pstops"... - */ - - if (pipe(pstops_pipe)) - { - perror("DEBUG: Unable to create pipe"); - - exit_status = 1; - goto error; - } - - if ((pdf_pid = fork()) == 0) - { - /* - * Child comes here... - */ - - dup2(pstops_pipe[1], 1); - close(pstops_pipe[0]); - close(pstops_pipe[1]); - -#ifdef HAVE_PDFTOPS - execv(CUPS_PDFTOPS, pdf_argv); - perror("DEBUG: Unable to execute pdftops program"); -#else - execv(CUPS_GHOSTSCRIPT, pdf_argv); - perror("DEBUG: Unable to execute gs program"); -#endif /* HAVE_PDFTOPS */ - - exit(1); - } - else if (pdf_pid < 0) - { - /* - * Unable to fork! - */ - -#ifdef HAVE_PDFTOPS - perror("DEBUG: Unable to execute pdftops program"); -#else - perror("DEBUG: Unable to execute gs program"); -#endif /* HAVE_PDFTOPS */ - - exit_status = 1; - goto error; - } - - fprintf(stderr, "DEBUG: Started filter %s (PID %d)\n", pdf_argv[0], pdf_pid); - - if ((pstops_pid = fork()) == 0) - { - /* - * Child comes here... - */ - - dup2(pstops_pipe[0], 0); - close(pstops_pipe[0]); - close(pstops_pipe[1]); - - execv(pstops_path, pstops_argv); - perror("DEBUG: Unable to execute pstops program"); - - exit(1); - } - else if (pstops_pid < 0) - { - /* - * Unable to fork! - */ - - perror("DEBUG: Unable to execute pstops program"); - - exit_status = 1; - goto error; - } - - fprintf(stderr, "DEBUG: Started filter pstops (PID %d)\n", pstops_pid); - - close(pstops_pipe[0]); - close(pstops_pipe[1]); - - /* - * Wait for the child processes to exit... - */ - - wait_children = 2; - - while (wait_children > 0) - { - /* - * Wait until we get a valid process ID or the job is canceled... - */ - - while ((wait_pid = wait(&wait_status)) < 0 && errno == EINTR) - { - if (job_canceled) - { - kill(pdf_pid, SIGTERM); - kill(pstops_pid, SIGTERM); - - job_canceled = 0; - } - } - - if (wait_pid < 0) - break; - - wait_children --; - - /* - * Report child status... - */ - - if (wait_status) - { - if (WIFEXITED(wait_status)) - { - exit_status = WEXITSTATUS(wait_status); - - fprintf(stderr, "DEBUG: PID %d (%s) stopped with status %d!\n", - wait_pid, -#ifdef HAVE_PDFTOPS - wait_pid == pdf_pid ? "pdftops" : "pstops", -#else - wait_pid == pdf_pid ? "gs" : "pstops", -#endif /* HAVE_PDFTOPS */ - exit_status); - } - else if (WTERMSIG(wait_status) == SIGTERM) - { - fprintf(stderr, - "DEBUG: PID %d (%s) was terminated normally with signal %d!\n", - wait_pid, -#ifdef HAVE_PDFTOPS - wait_pid == pdf_pid ? "pdftops" : "pstops", -#else - wait_pid == pdf_pid ? "gs" : "pstops", -#endif /* HAVE_PDFTOPS */ - exit_status); - } - else - { - exit_status = WTERMSIG(wait_status); - - fprintf(stderr, "DEBUG: PID %d (%s) crashed on signal %d!\n", wait_pid, -#ifdef HAVE_PDFTOPS - wait_pid == pdf_pid ? "pdftops" : "pstops", -#else - wait_pid == pdf_pid ? "gs" : "pstops", -#endif /* HAVE_PDFTOPS */ - exit_status); - } - } - else - { - fprintf(stderr, "DEBUG: PID %d (%s) exited with no errors.\n", wait_pid, -#ifdef HAVE_PDFTOPS - wait_pid == pdf_pid ? "pdftops" : "pstops"); -#else - wait_pid == pdf_pid ? "gs" : "pstops"); -#endif /* HAVE_PDFTOPS */ - } - } - - /* - * Cleanup and exit... - */ - - error: - - if (tempfile[0]) - unlink(tempfile); - - return (exit_status); -} - - -/* - * 'cancel_job()' - Flag the job as canceled. - */ - -static void -cancel_job(int sig) /* I - Signal number (unused) */ -{ - (void)sig; - - job_canceled = 1; -} - - -/* - * End of "$Id$". - */ diff --git a/filter/pstext.c b/filter/pstext.c deleted file mode 100644 index cfd8f08bb..000000000 --- a/filter/pstext.c +++ /dev/null @@ -1,511 +0,0 @@ -/* - * "$Id$" - * - * Common PostScript text code for CUPS. - * - * Copyright 2008-2010 by Apple Inc. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * psTextEmbedFonts() - Embed PostScript fonts. - * psTextListFonts() - List PostScript fonts. - * psTextInitialize() - Load and embed font data for UTF-8 text. - * psTextUTF8() - Output UTF-8 text at the current position. - * psTextUTF32() - Output UTF-32 text at the current position. - */ - -/* - * Include necessary headers... - */ - -#include "pstext.h" -#include - - -/* - * Composite font names... - */ - -static const char * const ps_font_names[] = -{ - "cupsNormal", - "cupsBold", - "cupsItalic", - "cupsBoldItalic" -}; - - -/* - * 'psTextEmbedFonts()'- Embed PostScript fonts. - */ - -void -psTextEmbedFonts(ps_text_t *fonts) /* I - Font data */ -{ - int i, j; /* Looping vars */ - const char *cups_datadir; /* CUPS_DATADIR environment variable */ - char *font; /* Current font */ - char filename[1024]; /* Current filename */ - FILE *fp; /* Current file */ - char line[1024]; /* Line from file */ - int ch; /* Character value */ - - - /* - * Get the data directory... - */ - - if ((cups_datadir = getenv("CUPS_DATADIR")) == NULL) - cups_datadir = CUPS_DATADIR; - - /* - * Embed each font... - */ - - for (font = (char *)cupsArrayFirst(fonts->unique); - font; - font = (char *)cupsArrayNext(fonts->unique)) - { - printf("%%%%BeginResource: font %s\n", font); - - snprintf(filename, sizeof(filename), "%s/fonts/%s", cups_datadir, font); - if ((fp = fopen(filename, "rb")) != NULL) - { - while ((j = fread(line, 1, sizeof(line), fp)) > 0) - fwrite(line, 1, j, stdout); - - fclose(fp); - } - else - { - _cupsLangPrintError("ERROR", _("Unable to open print file")); - fprintf(stderr, "DEBUG: Unable to open \"%s\".\n", filename); - } - - puts("\n%%EndResource"); - } - - /* - * Write the encoding arrays... - */ - - puts("% Character encodings"); - - for (i = 0; i < fonts->num_fonts; i ++) - { - printf("/cupsEncoding%02x [\n", i); - - for (ch = 0; ch < 256; ch ++) - { - if (fonts->glyphs[fonts->codes[i * 256 + ch]]) - printf("/%s", fonts->glyphs[fonts->codes[i * 256 + ch]]); - else if (fonts->codes[i * 256 + ch] > 255) - printf("/uni%04X", fonts->codes[i * 256 + ch]); - else - printf("/.notdef"); - - if ((ch & 7) == 7) - putchar('\n'); - } - - puts("] def"); - } - - /* - * Construct composite fonts... Start by reencoding the base fonts... - */ - - puts("% Reencode base fonts"); - - for (i = 0; i < 4; i ++) - for (j = 0; j < fonts->num_fonts; j ++) - { - printf("/%s findfont\n", fonts->fonts[j][i]); - printf("dup length 1 add dict begin\n" - " { 1 index /FID ne { def } { pop pop } ifelse } forall\n" - " /Encoding cupsEncoding%02x def\n" - " currentdict\n" - "end\n", j); - printf("/%s%02x exch definefont /%s%02x exch def\n", ps_font_names[i], j, - ps_font_names[i], j); - } - - /* - * Then merge them into composite fonts... - */ - - puts("% Create composite fonts"); - - for (i = 0; i < 4; i ++) - { - puts("8 dict begin"); - puts("/FontType 0 def/FontMatrix[1.0 0 0 1.0 0 0]def/FMapType 2 def" - "/Encoding["); - for (j = 0; j < fonts->num_fonts; j ++) - if (j == (fonts->num_fonts - 1)) - printf("%d", j); - else if ((j & 15) == 15) - printf("%d\n", j); - else - printf("%d ", j); - puts("]def/FDepVector["); - for (j = 0; j < fonts->num_fonts; j ++) - if (j == (fonts->num_fonts - 1)) - printf("%s%02x", ps_font_names[i], j); - else if ((j & 3) == 3) - printf("%s%02x\n", ps_font_names[i], j); - else - printf("%s%02x ", ps_font_names[i], j); - puts("]def currentdict end"); - printf("/%s exch definefont pop\n", ps_font_names[i]); - } - - /* - * Procedures... - */ - - puts("% Procedures to justify text...\n" - "/showcenter{dup stringwidth pop -0.5 mul 0 rmoveto show}bind def\n" - "/showleft{show}bind def\n" - "/showright{dup stringwidth pop neg 0 rmoveto show}bind def"); -} - - -/* - * 'psTextListFonts()' - List PostScript fonts. - */ - -void -psTextListFonts(ps_text_t *fonts) /* I - Font data */ -{ - char *font; /* Current font */ - - - font = (char *)cupsArrayFirst(fonts->unique); - printf("%%%%DocumentSuppliedResources: font %s\n", font); - while ((font = (char *)cupsArrayNext(fonts->unique)) != NULL) - printf("%%%%+ font %s\n", font); -} - - -/* - * 'psTextInitialize()' - Load and embed font data for UTF-8 text. - */ - -ps_text_t * /* O - Font data */ -psTextInitialize(void) -{ - ps_text_t *fonts; /* Font data */ - int i, j; /* Looping vars */ - char filename[1024]; /* Current filename */ - FILE *fp; /* Current file */ - const char *cups_datadir; /* CUPS_DATADIR environment variable */ - char line[1024], /* Line from file */ - *lineptr, /* Pointer into line */ - *valptr; /* Pointer to value in line */ - int unicode; /* Character value */ - int start, end; /* Start and end values for range */ - char glyph[64]; /* Glyph name */ - - - /* - * Get the data directory... - */ - - if ((cups_datadir = getenv("CUPS_DATADIR")) == NULL) - cups_datadir = CUPS_DATADIR; - - /* - * Initialize the PostScript text data... - */ - - fonts = (ps_text_t *)calloc(1, sizeof(ps_text_t)); - fonts->size = -1.0; - fonts->style = -1; - - /* - * Load the PostScript glyph names... - */ - - snprintf(filename, sizeof(filename), "%s/data/psglyphs", cups_datadir); - - if ((fp = fopen(filename, "r")) != NULL) - { - while (fscanf(fp, "%x%63s", &unicode, glyph) == 2) - fonts->glyphs[unicode] = _cupsStrAlloc(glyph); - - fclose(fp); - } - else - { - _cupsLangPrintError("ERROR", _("Unable to open print file")); - fprintf(stderr, "DEBUG: Unable to open \"%s\".\n", filename); - exit(1); - } - - /* - * Open the UTF-8 character set definition... - */ - - snprintf(filename, sizeof(filename), "%s/charsets/utf-8", cups_datadir); - - if ((fp = fopen(filename, "r")) == NULL) - { - /* - * Can't open charset file! - */ - - _cupsLangPrintError("ERROR", _("Unable to open print file")); - fprintf(stderr, "DEBUG: Unable to open \"%s\".\n", filename); - exit(1); - } - - if (!fgets(line, sizeof(line), fp) || strncmp(line, "charset utf8", 12)) - { - /* - * Bad/empty charset file! - */ - - fclose(fp); - _cupsLangPrintFilter(stderr, "ERROR", _("Bad charset file \"%s\"."), - filename); - exit(1); - } - - /* - * Read the font descriptions... - */ - - fonts->unique = cupsArrayNew((cups_array_func_t)strcmp, NULL); - - while (fgets(line, sizeof(line), fp) != NULL) - { - /* - * Skip comment and blank lines... - */ - - if (line[0] == '#' || line[0] == '\n') - continue; - - /* - * Read the font descriptions that should look like: - * - * start end direction width normal [bold italic bold-italic] - */ - - lineptr = line; - - start = strtol(lineptr, &lineptr, 16); - end = strtol(lineptr, &lineptr, 16); - - while (isspace(*lineptr & 255)) - lineptr ++; - - valptr = lineptr; - - while (!isspace(*lineptr & 255) && *lineptr) - lineptr ++; - - if (!*lineptr) - { - /* - * Can't have a font without all required values... - */ - - _cupsLangPrintFilter(stderr, "ERROR", - _("Bad font description line \"%s\"."), valptr); - fclose(fp); - exit(1); - } - - *lineptr++ = '\0'; - - if (!strcmp(valptr, "ltor")) - fonts->directions[fonts->num_fonts] = 1; - else if (!strcmp(valptr, "rtol")) - fonts->directions[fonts->num_fonts] = -1; - else - { - _cupsLangPrintFilter(stderr, "ERROR", _("Bad text direction \"%s\"."), - valptr); - fclose(fp); - exit(1); - } - - /* - * Got the direction, now get the width... - */ - - while (isspace(*lineptr & 255)) - lineptr ++; - - valptr = lineptr; - - while (!isspace(*lineptr & 255) && *lineptr) - lineptr ++; - - if (!*lineptr) - { - /* - * Can't have a font without all required values... - */ - - _cupsLangPrintFilter(stderr, "ERROR", - _("Bad font description line \"%s\"."), valptr); - fclose(fp); - exit(1); - } - - *lineptr++ = '\0'; - - if (!strcmp(valptr, "single")) - fonts->widths[fonts->num_fonts] = 1; - else if (!strcmp(valptr, "double")) - fonts->widths[fonts->num_fonts] = 2; - else - { - _cupsLangPrintFilter(stderr, "ERROR", _("Bad text width \"%s\"."), - valptr); - fclose(fp); - exit(1); - } - - /* - * Get the fonts... - */ - - for (i = 0; *lineptr && i < 4; i ++) - { - while (isspace(*lineptr & 255)) - lineptr ++; - - valptr = lineptr; - - while (!isspace(*lineptr & 255) && *lineptr) - lineptr ++; - - if (*lineptr) - *lineptr++ = '\0'; - - if (lineptr > valptr) - { - if (!cupsArrayFind(fonts->unique, valptr)) - cupsArrayAdd(fonts->unique, _cupsStrAlloc(valptr)); - - fonts->fonts[fonts->num_fonts][i] = _cupsStrAlloc(valptr); - } - } - - /* - * Fill in remaining fonts as needed... - */ - - for (j = i; j < 4; j ++) - fonts->fonts[fonts->num_fonts][j] = - _cupsStrAlloc(fonts->fonts[fonts->num_fonts][0]); - - /* - * Define the character mappings... - */ - - for (i = start, j = fonts->num_fonts * 256; i <= end; i ++, j ++) - { - fonts->chars[i] = j; - fonts->codes[j] = i; - } - - /* - * Move to the next font, stopping if needed... - */ - - fonts->num_fonts ++; - if (fonts->num_fonts >= 256) - break; - } - - fclose(fp); - - if (cupsArrayCount(fonts->unique) == 0) - { - _cupsLangPrintFilter(stderr, "ERROR", _("No fonts in charset file.")); - exit(1); - } - - return (fonts); -} - - -/* - * 'psTextUTF8()' - Output UTF-8 text at the current position. - */ - -void -psTextUTF8(ps_text_t *fonts, /* I - Font data */ - float size, /* I - Size in points */ - int style, /* I - Style */ - int align, /* I - Alignment */ - const char *text) /* I - UTF-8 text */ -{ - cups_utf32_t utf32[2048]; /* Temporary buffer */ - int utf32len; /* Number of characters */ - - - if (!text) - { - puts(""); - return; - } - - if ((utf32len = cupsUTF8ToUTF32(utf32, (cups_utf8_t *)text, - (int)(sizeof(utf32) / sizeof(utf32[0])))) > 0) - psTextUTF32(fonts, size, style, align, utf32, utf32len); -} - - -/* - * 'psTextUTF32()' - Output UTF-32 text at the current position. - */ - -void -psTextUTF32(ps_text_t *fonts, /* I - Font data */ - float size, /* I - Size in points */ - int style, /* I - Font style */ - int align, /* I - Alignment */ - const cups_utf32_t *text, /* I - UTF-32 text */ - int textlen) /* I - Length of text */ -{ - if (size != fonts->size || style != fonts->style) - { - printf("/%s findfont %g scalefont setfont\n", ps_font_names[style], size); - fonts->size = size; - fonts->style = style; - } - - putchar('<'); - while (textlen > 0) - { - printf("%04x", fonts->chars[*text]); - text ++; - textlen --; - } - - if (align == PS_CENTER) - puts(">showcenter"); - else if (align == PS_RIGHT) - puts(">showright"); - else - puts(">showleft"); -} - - -/* - * End of "$Id$". - */ diff --git a/filter/pstext.h b/filter/pstext.h deleted file mode 100644 index 41cbee433..000000000 --- a/filter/pstext.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * "$Id$" - * - * Common PostScript text definitions for CUPS. - * - * Copyright 2008-2010 by Apple Inc. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - */ - -/* - * Include necessary headers... - */ - -#include "common.h" -#include - - -/* - * Constants... - */ - -#define PS_NORMAL 0 /* Normal text */ -#define PS_BOLD 1 /* Bold text */ -#define PS_ITALIC 2 /* Italic text */ -#define PS_BOLDITALIC 3 /* Bold italic text */ - -#define PS_LEFT 1 /* Left-justified text */ -#define PS_CENTER 0 /* Center-justified text */ -#define PS_RIGHT -1 /* Right-justified text */ - - -/* - * Structures... - */ - -typedef struct ps_text_s /**** PostScript font data ****/ -{ - char *glyphs[65536]; /* PostScript glyphs for Unicode */ - int num_fonts; /* Number of fonts to use */ - char *fonts[256][4]; /* Fonts to use */ - cups_array_t *unique; /* Unique fonts */ - unsigned short chars[65536], /* 0xffcc (ff = font, cc = char) */ - codes[65536]; /* Unicode glyph mapping to fonts */ - int widths[256], /* Widths of each font */ - directions[256];/* Text directions for each font */ - float size; /* Current text size */ - int style; /* Current text style */ -} ps_text_t; - - -/* - * Functions... - */ - -extern void psTextEmbedFonts(ps_text_t *fonts); -extern void psTextListFonts(ps_text_t *fonts); -extern ps_text_t *psTextInitialize(void); -extern void psTextUTF8(ps_text_t *fonts, float size, int style, - int align, const char *text); -extern void psTextUTF32(ps_text_t *fonts, float size, int style, - int align, const cups_utf32_t *text, - int textlen); - - -/* - * End of "$Id$". - */ diff --git a/filter/pstops.c b/filter/pstops.c index f7dff2a47..c87ca2a78 100644 --- a/filter/pstops.c +++ b/filter/pstops.c @@ -2880,6 +2880,17 @@ start_nup(pstops_doc_t *doc, /* I - Document information */ break; } + /* + * Mirror the page as needed... + */ + + if (doc->mirror) + doc_printf(doc, "%.1f 0.0 translate -1 1 scale\n", PageWidth); + + /* + * Offset and scale as necessary for fitplot/fit-to-page/number-up... + */ + if (Duplex && doc->number_up > 1 && ((number / doc->number_up) & 1)) doc_printf(doc, "%.1f %.1f translate\n", PageWidth - PageRight, PageBottom); else if (doc->number_up > 1 || doc->fitplot) @@ -3234,13 +3245,6 @@ start_nup(pstops_doc_t *doc, /* I - Document information */ bboxx + margin, bboxy + margin, bboxw - 2 * margin, bboxl - 2 * margin); } - - /* - * Mirror the page as needed... - */ - - if (doc->mirror) - doc_printf(doc, "%.1f 0.0 translate -1 1 scale\n", PageWidth); } diff --git a/filter/raster.c b/filter/raster.c index 07d3caa87..cff03d37d 100644 --- a/filter/raster.c +++ b/filter/raster.c @@ -45,13 +45,7 @@ * Include necessary headers... */ -#include "image-private.h" -#if defined(WIN32) || defined(__EMX__) -# include -# include /* for htonl() definition */ -#else -# include -#endif /* WIN32 || __EMX__ */ +#include /* @@ -347,7 +341,8 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */ int count; /* Repetition count */ - if (r == NULL || r->mode != CUPS_RASTER_READ || r->remaining == 0) + if (r == NULL || r->mode != CUPS_RASTER_READ || r->remaining == 0 || + r->header.cupsBytesPerLine == 0) return (0); if (!r->compressed) @@ -933,7 +928,7 @@ cups_raster_read_header( cups_raster_update(r); - return (1); + return (r->header.cupsBytesPerLine != 0 && r->header.cupsHeight != 0); } diff --git a/filter/testimage.c b/filter/testimage.c deleted file mode 100644 index 57e3a197d..000000000 --- a/filter/testimage.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * "$Id$" - * - * Image library test program for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2006 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * main() - Main entry... - */ - -/* - * Include necessary headers... - */ - -#include "image.h" - - -/* - * 'main()' - Main entry... - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ -{ - cups_image_t *img; /* Image to print */ - cups_icspace_t primary; /* Primary image colorspace */ - FILE *out; /* Output PPM/PGM file */ - cups_ib_t *line; /* Line from file */ - int y, /* Current line */ - width, /* Width of image */ - height, /* Height of image */ - depth; /* Depth of image */ - - - if (argc != 3) - { - puts("Usage: testimage filename.ext filename.[ppm|pgm]"); - return (1); - } - - if (strstr(argv[2], ".ppm") != NULL) - primary = CUPS_IMAGE_RGB; - else - primary = CUPS_IMAGE_WHITE; - - img = cupsImageOpen(argv[1], primary, CUPS_IMAGE_WHITE, 100, 0, NULL); - - if (!img) - { - perror(argv[1]); - return (1); - } - - out = fopen(argv[2], "wb"); - - if (!out) - { - perror(argv[2]); - cupsImageClose(img); - return (1); - } - - width = cupsImageGetWidth(img); - height = cupsImageGetHeight(img); - depth = cupsImageGetDepth(img); - line = calloc(width, depth); - - fprintf(out, "P%d\n%d\n%d\n255\n", - cupsImageGetColorSpace(img) == CUPS_IMAGE_WHITE ? 5 : 6, - width, height); - - for (y = 0; y < height; y ++) - { - cupsImageGetRow(img, 0, y, width, line); - fwrite(line, width, depth, out); - } - - cupsImageClose(img); - fclose(out); - - return (0); -} - - -/* - * End of "$Id$". - */ diff --git a/filter/testraster.c b/filter/testraster.c index 64219fb12..4519aa25d 100644 --- a/filter/testraster.c +++ b/filter/testraster.c @@ -28,13 +28,7 @@ * Include necessary headers... */ -#include "image-private.h" -#ifdef WIN32 -# include -#else -# include -# include -#endif /* WIN32 */ +#include /* diff --git a/filter/textcommon.c b/filter/textcommon.c deleted file mode 100644 index 8101cafba..000000000 --- a/filter/textcommon.c +++ /dev/null @@ -1,1214 +0,0 @@ -/* - * "$Id: textcommon.c 6649 2007-07-11 21:46:42Z mike $" - * - * Common text filter routines for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1997-2007 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * TextMain() - Standard main entry for text filters. - * compare_keywords() - Compare two C/C++ keywords. - * getutf8() - Get a UTF-8 encoded wide character... - */ - -/* - * Include necessary headers... - */ - -#include "textcommon.h" -#include - - -/* - * Globals... - */ - -int WrapLines = 1, /* Wrap text in lines */ - SizeLines = 60, /* Number of lines on a page */ - SizeColumns = 80, /* Number of columns on a line */ - PageColumns = 1, /* Number of columns on a page */ - ColumnGutter = 0, /* Number of characters between text columns */ - ColumnWidth = 80, /* Width of each column */ - PrettyPrint = 0, /* Do pretty code formatting */ - Copies = 1; /* Number of copies */ -lchar_t **Page = NULL; /* Page characters */ -int NumPages = 0; /* Number of pages in document */ -float CharsPerInch = 10; /* Number of character columns per inch */ -float LinesPerInch = 6; /* Number of lines per inch */ -int NumKeywords = 0; /* Number of known keywords */ -char **Keywords = NULL; /* List of known keywords */ - - -/* - * Local globals... - */ - -static char *code_keywords[] = /* List of known C/C++ keywords... */ - { - "and", - "and_eq", - "asm", - "auto", - "bitand", - "bitor", - "bool", - "break", - "case", - "catch", - "char", - "class", - "compl", - "const", - "const_cast", - "continue", - "default", - "delete", - "do", - "double", - "dynamic_cast", - "else", - "enum", - "explicit", - "extern", - "false", - "float", - "for", - "friend", - "goto", - "if", - "inline", - "int", - "long", - "mutable", - "namespace", - "new", - "not", - "not_eq", - "operator", - "or", - "or_eq", - "private", - "protected", - "public", - "register", - "reinterpret_cast", - "return", - "short", - "signed", - "sizeof", - "static", - "static_cast", - "struct", - "switch", - "template", - "this", - "throw", - "true", - "try", - "typedef", - "typename", - "union", - "unsigned", - "virtual", - "void", - "volatile", - "while", - "xor", - "xor_eq" - }, - *sh_keywords[] = /* List of known Boure/Korn/zsh/bash keywords... */ - { - "alias", - "bg", - "break", - "case", - "cd", - "command", - "continue", - "do", - "done", - "echo", - "elif", - "else", - "esac", - "eval", - "exec", - "exit", - "export", - "fc", - "fg", - "fi", - "for", - "function", - "getopts", - "if", - "in", - "jobs", - "kill", - "let", - "limit", - "newgrp", - "print", - "pwd", - "read", - "readonly", - "return", - "select", - "set", - "shift", - "test", - "then", - "time", - "times", - "trap", - "typeset", - "ulimit", - "umask", - "unalias", - "unlimit", - "unset", - "until", - "wait", - "whence" - "while", - }, - *csh_keywords[] = /* List of known csh/tcsh keywords... */ - { - "alias", - "aliases", - "bg", - "bindkey", - "break", - "breaksw", - "builtins", - "case", - "cd", - "chdir", - "complete", - "continue", - "default", - "dirs", - "echo", - "echotc", - "else", - "end", - "endif", - "eval", - "exec", - "exit", - "fg", - "foreach", - "glob", - "goto", - "history", - "if", - "jobs", - "kill", - "limit", - "login", - "logout", - "ls", - "nice", - "nohup", - "notify", - "onintr", - "popd", - "pushd", - "pwd", - "rehash", - "repeat", - "set", - "setenv", - "settc", - "shift", - "source", - "stop", - "suspend", - "switch", - "telltc", - "then", - "time", - "umask", - "unalias", - "unbindkey", - "unhash", - "unlimit", - "unset", - "unsetenv", - "wait", - "where", - "which", - "while" - }, - *perl_keywords[] = /* List of known perl keywords... */ - { - "abs", - "accept", - "alarm", - "and", - "atan2", - "bind", - "binmode", - "bless", - "caller", - "chdir", - "chmod", - "chomp", - "chop", - "chown", - "chr", - "chroot", - "closdir", - "close", - "connect", - "continue", - "cos", - "crypt", - "dbmclose", - "dbmopen", - "defined", - "delete", - "die", - "do", - "dump", - "each", - "else", - "elsif", - "endgrent", - "endhostent", - "endnetent", - "endprotoent", - "endpwent", - "endservent", - "eof", - "eval", - "exec", - "exists", - "exit", - "exp", - "fcntl", - "fileno", - "flock", - "for", - "foreach", - "fork", - "format", - "formline", - "getc", - "getgrent", - "getgrgid", - "getgrnam", - "gethostbyaddr", - "gethostbyname", - "gethostent", - "getlogin", - "getnetbyaddr", - "getnetbyname", - "getnetent", - "getpeername", - "getpgrp", - "getppid", - "getpriority", - "getprotobyname", - "getprotobynumber", - "getprotoent", - "getpwent", - "getpwnam", - "getpwuid", - "getservbyname", - "getservbyport", - "getservent", - "getsockname", - "getsockopt", - "glob", - "gmtime", - "goto", - "grep", - "hex", - "if", - "import", - "index", - "int", - "ioctl", - "join", - "keys", - "kill", - "last", - "lc", - "lcfirst", - "length", - "link", - "listen", - "local", - "localtime", - "log", - "lstat", - "map", - "mkdir", - "msgctl", - "msgget", - "msgrcv", - "msgsend", - "my", - "next", - "no", - "not", - "oct", - "open", - "opendir", - "or", - "ord", - "pack", - "package", - "pipe", - "pop", - "pos", - "print", - "printf", - "push", - "quotemeta", - "rand", - "read", - "readdir", - "readlink", - "recv", - "redo", - "ref", - "rename", - "require", - "reset", - "return", - "reverse", - "rewinddir", - "rindex", - "rmdir", - "scalar", - "seek", - "seekdir", - "select", - "semctl", - "semget", - "semop", - "send", - "setgrent", - "sethostent", - "setnetent", - "setpgrp", - "setpriority", - "setprotoent", - "setpwent", - "setservent", - "setsockopt", - "shift", - "shmctl", - "shmget", - "shmread", - "shmwrite", - "shutdown", - "sin", - "sleep", - "socket", - "socketpair", - "sort", - "splice", - "split", - "sprintf", - "sqrt", - "srand", - "stat", - "study", - "sub", - "substr", - "symlink", - "syscall", - "sysread", - "sysseek", - "system", - "syswrite", - "tell", - "telldir", - "tie", - "tied", - "time", - "times" - "times", - "truncate", - "uc", - "ucfirst", - "umask", - "undef", - "unless", - "unlink", - "unpack", - "unshift", - "untie", - "until", - "use", - "utime", - "values", - "vec", - "wait", - "waitpid", - "wantarray", - "warn", - "while", - "write" - }; - - -/* - * Local functions... - */ - -static int compare_keywords(const void *, const void *); -static int getutf8(FILE *fp); - - -/* - * 'TextMain()' - Standard main entry for text filters. - */ - -int /* O - Exit status */ -TextMain(const char *name, /* I - Name of filter */ - int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ -{ - FILE *fp; /* Print file */ - ppd_file_t *ppd; /* PPD file */ - int i, /* Looping var */ - ch, /* Current char from file */ - lastch, /* Previous char from file */ - attr, /* Current attribute */ - line, /* Current line */ - column, /* Current column */ - page_column; /* Current page column */ - int num_options; /* Number of print options */ - cups_option_t *options; /* Print options */ - const char *val; /* Option value */ - char keyword[64], /* Keyword string */ - *keyptr; /* Pointer into string */ - int keycol; /* Column where keyword starts */ - int ccomment; /* Inside a C-style comment? */ - int cstring; /* Inside a C string */ - - - /* - * Make sure status messages are not buffered... - */ - - setbuf(stderr, NULL); - - /* - * Check command-line... - */ - - if (argc < 6 || argc > 7) - { - _cupsLangPrintf(stderr, - _("Usage: %s job-id user title copies options [file]"), - name); - return (1); - } - - /* - * If we have 7 arguments, print the file named on the command-line. - * Otherwise, send stdin instead... - */ - - if (argc == 6) - fp = stdin; - else - { - /* - * Try to open the print file... - */ - - if ((fp = fopen(argv[6], "rb")) == NULL) - { - perror("DEBUG: unable to open print file - "); - return (1); - } - } - - /* - * Process command-line options and write the prolog... - */ - - options = NULL; - num_options = cupsParseOptions(argv[5], 0, &options); - - if ((val = cupsGetOption("prettyprint", num_options, options)) != NULL && - _cups_strcasecmp(val, "no") && _cups_strcasecmp(val, "off") && - _cups_strcasecmp(val, "false")) - { - PageLeft = 72.0f; - PageRight = PageWidth - 36.0f; - PageBottom = PageBottom > 36.0f ? PageBottom : 36.0f; - PageTop = PageLength - 36.0f; - CharsPerInch = 12; - LinesPerInch = 8; - - if ((val = getenv("CONTENT_TYPE")) == NULL) - { - PrettyPrint = PRETTY_PLAIN; - NumKeywords = 0; - Keywords = NULL; - } - else if (_cups_strcasecmp(val, "application/x-cshell") == 0) - { - PrettyPrint = PRETTY_SHELL; - NumKeywords = sizeof(csh_keywords) / sizeof(csh_keywords[0]); - Keywords = csh_keywords; - } - else if (_cups_strcasecmp(val, "application/x-csource") == 0) - { - PrettyPrint = PRETTY_CODE; - NumKeywords = sizeof(code_keywords) / sizeof(code_keywords[0]); - Keywords = code_keywords; - } - else if (_cups_strcasecmp(val, "application/x-perl") == 0) - { - PrettyPrint = PRETTY_PERL; - NumKeywords = sizeof(perl_keywords) / sizeof(perl_keywords[0]); - Keywords = perl_keywords; - } - else if (_cups_strcasecmp(val, "application/x-shell") == 0) - { - PrettyPrint = PRETTY_SHELL; - NumKeywords = sizeof(sh_keywords) / sizeof(sh_keywords[0]); - Keywords = sh_keywords; - } - else - { - PrettyPrint = PRETTY_PLAIN; - NumKeywords = 0; - Keywords = NULL; - } - } - - ppd = SetCommonOptions(num_options, options, 1); - - if ((val = cupsGetOption("wrap", num_options, options)) == NULL) - WrapLines = 1; - else - WrapLines = !_cups_strcasecmp(val, "true") || !_cups_strcasecmp(val, "on") || - !_cups_strcasecmp(val, "yes"); - - if ((val = cupsGetOption("columns", num_options, options)) != NULL) - { - PageColumns = atoi(val); - - if (PageColumns < 1) - { - _cupsLangPrintFilter(stderr, "ERROR", _("Bad columns value %d."), - PageColumns); - return (1); - } - } - - if ((val = cupsGetOption("cpi", num_options, options)) != NULL) - { - CharsPerInch = atof(val); - - if (CharsPerInch <= 0.0) - { - _cupsLangPrintFilter(stderr, "ERROR", _("Bad cpi value %f."), - CharsPerInch); - return (1); - } - } - - if ((val = cupsGetOption("lpi", num_options, options)) != NULL) - { - LinesPerInch = atof(val); - - if (LinesPerInch <= 0.0) - { - _cupsLangPrintFilter(stderr, "ERROR", _("Bad lpi value %f."), - LinesPerInch); - return (1); - } - } - - if (PrettyPrint) - PageTop -= 216.0f / LinesPerInch; - - Copies = atoi(argv[4]); - - WriteProlog(argv[3], argv[2], getenv("CLASSIFICATION"), - cupsGetOption("page-label", num_options, options), ppd); - - /* - * Read text from the specified source and print it... - */ - - lastch = 0; - column = 0; - line = 0; - page_column = 0; - attr = 0; - keyptr = keyword; - keycol = 0; - ccomment = 0; - cstring = 0; - - while ((ch = getutf8(fp)) >= 0) - { - /* - * Control codes: - * - * BS Backspace (0x08) - * HT Horizontal tab; next 8th column (0x09) - * LF Line feed; forward full line (0x0a) - * VT Vertical tab; reverse full line (0x0b) - * FF Form feed (0x0c) - * CR Carriage return (0x0d) - * ESC 7 Reverse full line (0x1b 0x37) - * ESC 8 Reverse half line (0x1b 0x38) - * ESC 9 Forward half line (0x1b 0x39) - */ - - switch (ch) - { - case 0x08 : /* BS - backspace for boldface & underline */ - if (column > 0) - column --; - - keyptr = keyword; - keycol = column; - break; - - case 0x09 : /* HT - tab to next 8th column */ - if (PrettyPrint && keyptr > keyword) - { - *keyptr = '\0'; - keyptr = keyword; - - if (bsearch(&keyptr, Keywords, NumKeywords, sizeof(char *), - compare_keywords)) - { - /* - * Put keywords in boldface... - */ - - i = page_column * (ColumnWidth + ColumnGutter); - - while (keycol < column) - { - Page[line][keycol + i].attr |= ATTR_BOLD; - keycol ++; - } - } - } - - column = (column + 8) & ~7; - - if (column >= ColumnWidth && WrapLines) - { /* Wrap text to margins */ - line ++; - column = 0; - - if (line >= SizeLines) - { - page_column ++; - line = 0; - - if (page_column >= PageColumns) - { - WritePage(); - page_column = 0; - } - } - } - - keycol = column; - - attr &= ~ATTR_BOLD; - break; - - case 0x0d : /* CR */ -#ifndef __APPLE__ - /* - * All but MacOS/Darwin treat CR as was intended by ANSI - * folks, namely to move to column 0/1. Some programs still - * use this to do boldfacing and underlining... - */ - - column = 0; - break; -#else - /* - * MacOS/Darwin still need to treat CR as a line ending. - */ - - { - int nextch; - if ((nextch = getc(fp)) != 0x0a) - ungetc(nextch, fp); - else - ch = nextch; - } -#endif /* !__APPLE__ */ - - case 0x0a : /* LF - output current line */ - if (PrettyPrint && keyptr > keyword) - { - *keyptr = '\0'; - keyptr = keyword; - - if (bsearch(&keyptr, Keywords, NumKeywords, sizeof(char *), - compare_keywords)) - { - /* - * Put keywords in boldface... - */ - - i = page_column * (ColumnWidth + ColumnGutter); - - while (keycol < column) - { - Page[line][keycol + i].attr |= ATTR_BOLD; - keycol ++; - } - } - } - - line ++; - column = 0; - keycol = 0; - - if (!ccomment && !cstring) - attr &= ~(ATTR_ITALIC | ATTR_BOLD | ATTR_RED | ATTR_GREEN | ATTR_BLUE); - - if (line >= SizeLines) - { - page_column ++; - line = 0; - - if (page_column >= PageColumns) - { - WritePage(); - page_column = 0; - } - } - break; - - case 0x0b : /* VT - move up 1 line */ - if (line > 0) - line --; - - keyptr = keyword; - keycol = column; - - if (!ccomment && !cstring) - attr &= ~(ATTR_ITALIC | ATTR_BOLD | ATTR_RED | ATTR_GREEN | ATTR_BLUE); - break; - - case 0x0c : /* FF - eject current page... */ - if (PrettyPrint && keyptr > keyword) - { - *keyptr = '\0'; - keyptr = keyword; - - if (bsearch(&keyptr, Keywords, NumKeywords, sizeof(char *), - compare_keywords)) - { - /* - * Put keywords in boldface... - */ - - i = page_column * (ColumnWidth + ColumnGutter); - - while (keycol < column) - { - Page[line][keycol + i].attr |= ATTR_BOLD; - keycol ++; - } - } - } - - page_column ++; - column = 0; - keycol = 0; - line = 0; - - if (!ccomment && !cstring) - attr &= ~(ATTR_ITALIC | ATTR_BOLD | ATTR_RED | ATTR_GREEN | ATTR_BLUE); - - if (page_column >= PageColumns) - { - WritePage(); - page_column = 0; - } - break; - - case 0x1b : /* Escape sequence */ - ch = getutf8(fp); - if (ch == '7') - { - /* - * ESC 7 Reverse full line (0x1b 0x37) - */ - - if (line > 0) - line --; - } - else if (ch == '8') - { - /* - * ESC 8 Reverse half line (0x1b 0x38) - */ - - if ((attr & ATTR_RAISED) && line > 0) - { - attr &= ~ATTR_RAISED; - line --; - } - else if (attr & ATTR_LOWERED) - attr &= ~ATTR_LOWERED; - else - attr |= ATTR_RAISED; - } - else if (ch == '9') - { - /* - * ESC 9 Forward half line (0x1b 0x39) - */ - - if ((attr & ATTR_LOWERED) && line < (SizeLines - 1)) - { - attr &= ~ATTR_LOWERED; - line ++; - } - else if (attr & ATTR_RAISED) - attr &= ~ATTR_RAISED; - else - attr |= ATTR_LOWERED; - } - break; - - default : /* All others... */ - if (ch < ' ') - break; /* Ignore other control chars */ - - if (PrettyPrint > PRETTY_PLAIN) - { - /* - * Do highlighting of C/C++ keywords, preprocessor commands, - * and comments... - */ - - if (ch == ' ' && (attr & ATTR_BOLD)) - { - /* - * Stop bolding preprocessor command... - */ - - attr &= ~ATTR_BOLD; - } - else if (!(isalnum(ch & 255) || ch == '_') && keyptr > keyword) - { - /* - * Look for a keyword... - */ - - *keyptr = '\0'; - keyptr = keyword; - - if (!(attr & ATTR_ITALIC) && - bsearch(&keyptr, Keywords, NumKeywords, sizeof(char *), - compare_keywords)) - { - /* - * Put keywords in boldface... - */ - - i = page_column * (ColumnWidth + ColumnGutter); - - while (keycol < column) - { - Page[line][keycol + i].attr |= ATTR_BOLD; - keycol ++; - } - } - } - else if ((isalnum(ch & 255) || ch == '_') && !ccomment && !cstring) - { - /* - * Add characters to the current keyword (if they'll fit). - */ - - if (keyptr == keyword) - keycol = column; - - if (keyptr < (keyword + sizeof(keyword) - 1)) - *keyptr++ = ch; - } - else if (ch == '\"' && lastch != '\\' && !ccomment && !cstring) - { - /* - * Start a C string constant... - */ - - cstring = -1; - attr = ATTR_BLUE; - } - else if (ch == '*' && lastch == '/' && !cstring && - PrettyPrint != PRETTY_SHELL) - { - /* - * Start a C-style comment... - */ - - ccomment = 1; - attr = ATTR_ITALIC | ATTR_GREEN; - } - else if (ch == '/' && lastch == '/' && !cstring && - PrettyPrint == PRETTY_CODE) - { - /* - * Start a C++-style comment... - */ - - attr = ATTR_ITALIC | ATTR_GREEN; - } - else if (ch == '#' && !cstring && PrettyPrint != PRETTY_CODE) - { - /* - * Start a shell-style comment... - */ - - attr = ATTR_ITALIC | ATTR_GREEN; - } - else if (ch == '#' && column == 0 && !ccomment && !cstring && - PrettyPrint == PRETTY_CODE) - { - /* - * Start a preprocessor command... - */ - - attr = ATTR_BOLD | ATTR_RED; - } - } - - if (column >= ColumnWidth && WrapLines) - { /* Wrap text to margins */ - column = 0; - line ++; - - if (line >= SizeLines) - { - page_column ++; - line = 0; - - if (page_column >= PageColumns) - { - WritePage(); - page_column = 0; - } - } - } - - /* - * Add text to the current column & line... - */ - - if (column < ColumnWidth) - { - i = column + page_column * (ColumnWidth + ColumnGutter); - - if (PrettyPrint) - Page[line][i].attr = attr; - else if (ch == ' ' && Page[line][i].ch) - ch = Page[line][i].ch; - else if (ch == Page[line][i].ch) - Page[line][i].attr |= ATTR_BOLD; - else if (Page[line][i].ch == '_') - Page[line][i].attr |= ATTR_UNDERLINE; - else if (ch == '_') - { - Page[line][i].attr |= ATTR_UNDERLINE; - - if (Page[line][i].ch) - ch = Page[line][i].ch; - } - else - Page[line][i].attr = attr; - - Page[line][i].ch = ch; - } - - if (PrettyPrint) - { - if ((ch == '{' || ch == '}') && !ccomment && !cstring && - column < ColumnWidth) - { - /* - * Highlight curley braces... - */ - - Page[line][column].attr |= ATTR_BOLD; - } - else if ((ch == '/' || ch == '*') && lastch == '/' && - column < ColumnWidth && PrettyPrint != PRETTY_SHELL) - { - /* - * Highlight first comment character... - */ - - Page[line][column - 1].attr = attr; - } - else if (ch == '\"' && lastch != '\\' && !ccomment && cstring > 0) - { - /* - * End a C string constant... - */ - - cstring = 0; - attr &= ~ATTR_BLUE; - } - else if (ch == '/' && lastch == '*' && ccomment) - { - /* - * End a C-style comment... - */ - - ccomment = 0; - attr &= ~(ATTR_ITALIC | ATTR_GREEN); - } - - if (cstring < 0) - cstring = 1; - } - - column ++; - break; - } - - /* - * Save this character for the next cycle. - */ - - lastch = ch; - } - - /* - * Write any remaining page data... - */ - - if (line > 0 || page_column > 0 || column > 0) - WritePage(); - - /* - * Write the epilog and return... - */ - - WriteEpilogue(); - - if (ppd != NULL) - ppdClose(ppd); - - return (0); -} - - -/* - * 'compare_keywords()' - Compare two C/C++ keywords. - */ - -static int /* O - Result of strcmp */ -compare_keywords(const void *k1, /* I - First keyword */ - const void *k2) /* I - Second keyword */ -{ - return (strcmp(*((const char **)k1), *((const char **)k2))); -} - - -/* - * 'getutf8()' - Get a UTF-8 encoded wide character... - */ - -static int /* O - Character or -1 on error */ -getutf8(FILE *fp) /* I - File to read from */ -{ - int ch; /* Current character value */ - int next; /* Next character from file */ - - - /* - * Read the first character and process things accordingly... - * - * UTF-8 maps 16-bit characters to: - * - * 0 to 127 = 0xxxxxxx - * 128 to 2047 = 110xxxxx 10yyyyyy (xxxxxyyyyyy) - * 2048 to 65535 = 1110xxxx 10yyyyyy 10zzzzzz (xxxxyyyyyyzzzzzz) - * - * We also accept: - * - * 128 to 191 = 10xxxxxx - * - * since this range of values is otherwise undefined unless you are - * in the middle of a multi-byte character... - * - * This code currently does not support anything beyond 16-bit - * characters, in part because PostScript doesn't support more than - * 16-bit characters... - */ - - if ((ch = getc(fp)) == EOF) - return (EOF); - - if (ch < 0xc0) /* One byte character? */ - return (ch); - else if ((ch & 0xe0) == 0xc0) - { - /* - * Two byte character... - */ - - if ((next = getc(fp)) == EOF) - return (EOF); - else - return (((ch & 0x1f) << 6) | (next & 0x3f)); - } - else if ((ch & 0xf0) == 0xe0) - { - /* - * Three byte character... - */ - - if ((next = getc(fp)) == EOF) - return (EOF); - - ch = ((ch & 0x0f) << 6) | (next & 0x3f); - - if ((next = getc(fp)) == EOF) - return (EOF); - else - return ((ch << 6) | (next & 0x3f)); - } - else - { - /* - * More than three bytes... We don't support that... - */ - - return (EOF); - } -} - - -/* - * End of "$Id: textcommon.c 6649 2007-07-11 21:46:42Z mike $". - */ diff --git a/filter/textcommon.h b/filter/textcommon.h deleted file mode 100644 index 20eb5e606..000000000 --- a/filter/textcommon.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * "$Id: textcommon.h 6649 2007-07-11 21:46:42Z mike $" - * - * Common text filter definitions for CUPS. - * - * Copyright 2007-2010 by Apple Inc. - * Copyright 1997-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - */ - -/* - * Include necessary headers... - */ - -#include "common.h" - - -/* - * C++ magic... - */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - -/* - * Constants... - */ - -#define ATTR_NORMAL 0x00 -#define ATTR_BOLD 0x01 -#define ATTR_ITALIC 0x02 -#define ATTR_BOLDITALIC 0x03 -#define ATTR_FONT 0x03 - -#define ATTR_UNDERLINE 0x04 -#define ATTR_RAISED 0x08 -#define ATTR_LOWERED 0x10 -#define ATTR_RED 0x20 -#define ATTR_GREEN 0x40 -#define ATTR_BLUE 0x80 - -#define PRETTY_OFF 0 -#define PRETTY_PLAIN 1 -#define PRETTY_CODE 2 -#define PRETTY_SHELL 3 -#define PRETTY_PERL 4 -#define PRETTY_HTML 5 - - -/* - * Structures... - */ - -typedef struct /**** Character/attribute structure... ****/ -{ - unsigned short ch, /* Character */ - attr; /* Any attributes */ -} lchar_t; - - -/* - * Globals... - */ - -extern int WrapLines, /* Wrap text in lines */ - SizeLines, /* Number of lines on a page */ - SizeColumns, /* Number of columns on a line */ - PageColumns, /* Number of columns on a page */ - ColumnGutter, /* Number of characters between text columns */ - ColumnWidth, /* Width of each column */ - PrettyPrint, /* Do pretty code formatting? */ - Copies; /* Number of copies to produce */ -extern lchar_t **Page; /* Page characters */ -extern int NumPages; /* Number of pages in document */ -extern float CharsPerInch, /* Number of character columns per inch */ - LinesPerInch; /* Number of lines per inch */ -extern int UTF8, /* Use UTF-8 encoding? */ - NumKeywords; /* Number of known keywords */ -extern char **Keywords; /* List of known keywords... */ - - -/* - * Required functions... - */ - -extern int TextMain(const char *name, int argc, char *argv[]); -extern void WriteEpilogue(void); -extern void WritePage(void); -extern void WriteProlog(const char *title, const char *user, - const char *classification, const char *label, - ppd_file_t *ppd); - - -/* - * C++ magic... - */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -/* - * End of "$Id: textcommon.h 6649 2007-07-11 21:46:42Z mike $". - */ diff --git a/filter/texttops.c b/filter/texttops.c deleted file mode 100644 index af549cefa..000000000 --- a/filter/texttops.c +++ /dev/null @@ -1,1165 +0,0 @@ -/* - * "$Id: texttops.c 7720 2008-07-11 22:46:21Z mike $" - * - * Text to PostScript filter for CUPS. - * - * Copyright 2007-2010 by Apple Inc. - * Copyright 1993-2007 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * main() - Main entry for text to PostScript filter. - * WriteEpilogue() - Write the PostScript file epilogue. - * WritePage() - Write a page of text. - * WriteProlog() - Write the PostScript file prolog with options. - * write_line() - Write a row of text. - * write_string() - Write a string of text. - */ - -/* - * Include necessary headers... - */ - -#include "textcommon.h" -#include - - -/* - * Globals... - */ - -char *Glyphs[65536]; /* PostScript glyphs for Unicode */ -int NumFonts; /* Number of fonts to use */ -char *Fonts[256][4]; /* Fonts to use */ -unsigned short Chars[65536]; /* 0xffcc (ff = font, cc = char) */ -unsigned short Codes[65536]; /* Unicode glyph mapping to fonts */ -int Widths[256]; /* Widths of each font */ -int Directions[256];/* Text directions for each font */ - - -/* - * Local functions... - */ - -static void write_line(int row, lchar_t *line); -static void write_string(int col, int row, int len, lchar_t *s); -static void write_text(const char *s); - - -/* - * 'main()' - Main entry for text to PostScript filter. - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ -{ - return (TextMain("texttops", argc, argv)); -} - - -/* - * 'WriteEpilogue()' - Write the PostScript file epilogue. - */ - -void -WriteEpilogue(void) -{ - puts("%%Trailer"); - printf("%%%%Pages: %d\n", NumPages); - puts("%%EOF"); - - free(Page[0]); - free(Page); -} - - -/* - * 'WritePage()' - Write a page of text. - */ - -void -WritePage(void) -{ - int line; /* Current line */ - - - NumPages ++; - printf("%%%%Page: %d %d\n", NumPages, NumPages); - - puts("gsave"); - - if (PrettyPrint) - printf("%d H\n", NumPages); - - for (line = 0; line < SizeLines; line ++) - write_line(line, Page[line]); - - puts("grestore"); - puts("showpage"); - - memset(Page[0], 0, sizeof(lchar_t) * SizeColumns * SizeLines); -} - - -/* - * 'WriteProlog()' - Write the PostScript file prolog with options. - */ - -void -WriteProlog(const char *title, /* I - Title of job */ - const char *user, /* I - Username */ - const char *classification, /* I - Classification */ - const char *label, /* I - Page label */ - ppd_file_t *ppd) /* I - PPD file info */ -{ - int i, j, k; /* Looping vars */ - char *charset; /* Character set string */ - char filename[1024]; /* Glyph filenames */ - FILE *fp; /* Glyph files */ - const char *datadir; /* CUPS_DATADIR environment variable */ - char line[1024], /* Line from file */ - *lineptr, /* Pointer into line */ - *valptr; /* Pointer to value in line */ - int ch, unicode; /* Character values */ - int start, end; /* Start and end values for range */ - char glyph[64]; /* Glyph name */ - time_t curtime; /* Current time */ - struct tm *curtm; /* Current date */ - char curdate[255]; /* Current date (text format) */ - int num_fonts; /* Number of unique fonts */ - char *fonts[1024]; /* Unique fonts */ - static char *names[] = /* Font names */ - { - "cupsNormal", - "cupsBold", - "cupsItalic" - }; - - - /* - * Get the data directory... - */ - - if ((datadir = getenv("CUPS_DATADIR")) == NULL) - datadir = CUPS_DATADIR; - - /* - * Adjust margins as necessary... - */ - - if (classification || label) - { - /* - * Leave room for labels... - */ - - PageBottom += 36; - PageTop -= 36; - } - - /* - * Allocate memory for the page... - */ - - SizeColumns = (PageRight - PageLeft) / 72.0 * CharsPerInch; - SizeLines = (PageTop - PageBottom) / 72.0 * LinesPerInch; - - if (SizeColumns <= 0 || SizeColumns > 32767 || - SizeLines <= 0 || SizeLines > 32767) - { - _cupsLangPrintFilter(stderr, "ERROR", - _("Unable to print %dx%d text page."), - SizeColumns, SizeLines); - exit(1); - } - - if ((Page = calloc(sizeof(lchar_t *), SizeLines)) == NULL) - { - _cupsLangPrintFilter(stderr, "ERROR", - _("Unable to print %dx%d text page."), - SizeColumns, SizeLines); - exit(1); - } - - if ((Page[0] = calloc(sizeof(lchar_t), SizeColumns * SizeLines)) == NULL) - { - _cupsLangPrintFilter(stderr, "ERROR", - _("Unable to print %dx%d text page."), - SizeColumns, SizeLines); - exit(1); - } - - for (i = 1; i < SizeLines; i ++) - Page[i] = Page[0] + i * SizeColumns; - - if (PageColumns > 1) - { - ColumnGutter = CharsPerInch / 2; - ColumnWidth = (SizeColumns - ColumnGutter * (PageColumns - 1)) / - PageColumns; - } - else - ColumnWidth = SizeColumns; - - if (ColumnWidth <= 0) - { - _cupsLangPrintFilter(stderr, "ERROR", - _("Unable to print %d text columns."), PageColumns); - exit(1); - } - - /* - * Output the DSC header... - */ - - curtime = time(NULL); - curtm = localtime(&curtime); - strftime(curdate, sizeof(curdate), "%c", curtm); - - puts("%!PS-Adobe-3.0"); - printf("%%%%BoundingBox: 0 0 %.0f %.0f\n", PageWidth, PageLength); - printf("%%cupsRotation: %d\n", (Orientation & 3) * 90); - puts("%%Creator: texttops/" CUPS_SVERSION); - printf("%%%%CreationDate: %s\n", curdate); - WriteTextComment("Title", title); - WriteTextComment("For", user); - puts("%%Pages: (atend)"); - - /* - * Initialize globals... - */ - - NumFonts = 0; - memset(Fonts, 0, sizeof(Fonts)); - memset(Glyphs, 0, sizeof(Glyphs)); - memset(Chars, 0, sizeof(Chars)); - memset(Codes, 0, sizeof(Codes)); - - /* - * Load the PostScript glyph names and the corresponding character - * set definition... - */ - - snprintf(filename, sizeof(filename), "%s/data/psglyphs", datadir); - - if ((fp = fopen(filename, "r")) != NULL) - { - while (fscanf(fp, "%x%63s", &unicode, glyph) == 2) - Glyphs[unicode] = strdup(glyph); - - fclose(fp); - } - else - { - _cupsLangPrintError("ERROR", _("Unable to open psglyphs")); - exit(1); - } - - /* - * Get the output character set... - */ - - charset = getenv("CHARSET"); - if (charset != NULL && strcmp(charset, "us-ascii") != 0) - { - snprintf(filename, sizeof(filename), "%s/charsets/%s", datadir, charset); - - if ((fp = fopen(filename, "r")) == NULL) - { - /* - * Can't open charset file! - */ - - _cupsLangPrintError("ERROR", _("Unable to open charset file")); - exit(1); - } - - /* - * Opened charset file; now see if this is really a charset file... - */ - - if (fgets(line, sizeof(line), fp) == NULL) - { - /* - * Bad/empty charset file! - */ - - fclose(fp); - _cupsLangPrintFilter(stderr, "ERROR", _("Bad charset file \"%s\"."), - filename); - exit(1); - } - - if (strncmp(line, "charset", 7) != 0) - { - /* - * Bad format/not a charset file! - */ - - fclose(fp); - _cupsLangPrintFilter(stderr, "ERROR", _("Bad charset file \"%s\"."), - filename); - exit(1); - } - - /* - * See if this is an 8-bit or UTF-8 character set file... - */ - - line[strlen(line) - 1] = '\0'; /* Drop \n */ - for (lineptr = line + 7; isspace(*lineptr & 255); lineptr ++); /* Skip whitespace */ - - if (strcmp(lineptr, "utf8") == 0) - { - /* - * UTF-8 (Unicode) text... - */ - - NumFonts = 0; - - while (fgets(line, sizeof(line), fp) != NULL) - { - /* - * Skip comment and blank lines... - */ - - if (line[0] == '#' || line[0] == '\n') - continue; - - /* - * Read the font descriptions that should look like: - * - * start end direction width normal [bold italic bold-italic] - */ - - lineptr = line; - - start = strtol(lineptr, &lineptr, 16); - end = strtol(lineptr, &lineptr, 16); - - while (isspace(*lineptr & 255)) - lineptr ++; - - valptr = lineptr; - - while (!isspace(*lineptr & 255) && *lineptr) - lineptr ++; - - if (!*lineptr) - { - /* - * Can't have a font without all required values... - */ - - _cupsLangPrintFilter(stderr, "ERROR", - _("Bad font description line: %s"), valptr); - fclose(fp); - exit(1); - } - - *lineptr++ = '\0'; - - if (strcmp(valptr, "ltor") == 0) - Directions[NumFonts] = 1; - else if (strcmp(valptr, "rtol") == 0) - Directions[NumFonts] = -1; - else - { - _cupsLangPrintFilter(stderr, "ERROR", _("Bad text direction: %s"), - valptr); - fclose(fp); - exit(1); - } - - /* - * Got the direction, now get the width... - */ - - while (isspace(*lineptr & 255)) - lineptr ++; - - valptr = lineptr; - - while (!isspace(*lineptr & 255) && *lineptr) - lineptr ++; - - if (!*lineptr) - { - /* - * Can't have a font without all required values... - */ - - _cupsLangPrintFilter(stderr, "ERROR", - _("Bad font description line: %s"), valptr); - fclose(fp); - exit(1); - } - - *lineptr++ = '\0'; - - if (strcmp(valptr, "single") == 0) - Widths[NumFonts] = 1; - else if (strcmp(valptr, "double") == 0) - Widths[NumFonts] = 2; - else - { - _cupsLangPrintFilter(stderr, "ERROR", - _("Bad text width: %s"), valptr); - fclose(fp); - exit(1); - } - - /* - * Get the fonts... - */ - - for (i = 0; *lineptr && i < 4; i ++) - { - while (isspace(*lineptr & 255)) - lineptr ++; - - valptr = lineptr; - - while (!isspace(*lineptr & 255) && *lineptr) - lineptr ++; - - if (*lineptr) - *lineptr++ = '\0'; - - if (lineptr > valptr) - Fonts[NumFonts][i] = strdup(valptr); - } - - /* - * Fill in remaining fonts as needed... - */ - - for (j = i; j < 4; j ++) - Fonts[NumFonts][j] = strdup(Fonts[NumFonts][0]); - - /* - * Define the character mappings... - */ - - for (i = start, j = NumFonts * 256; i <= end; i ++, j ++) - { - Chars[i] = j; - Codes[j] = i; - } - - /* - * Move to the next font, stopping if needed... - */ - - NumFonts ++; - if (NumFonts >= 256) - break; - } - - fclose(fp); - } - else - { - _cupsLangPrintFilter(stderr, "ERROR", _("Bad charset type: %s"), lineptr); - fclose(fp); - exit(1); - } - } - else - { - /* - * Standard ASCII output just uses Courier, Courier-Bold, and - * possibly Courier-Oblique. - */ - - NumFonts = 1; - - Fonts[0][ATTR_NORMAL] = strdup("Courier"); - Fonts[0][ATTR_BOLD] = strdup("Courier-Bold"); - Fonts[0][ATTR_ITALIC] = strdup("Courier-Oblique"); - Fonts[0][ATTR_BOLDITALIC] = strdup("Courier-BoldOblique"); - - Widths[0] = 1; - Directions[0] = 1; - - /* - * Define US-ASCII characters... - */ - - for (i = 32; i < 127; i ++) - { - Chars[i] = i; - Codes[i] = i; - } - } - - /* - * Generate a list of unique fonts to use... - */ - - for (i = 0, num_fonts = 0; i < NumFonts; i ++) - for (j = PrettyPrint ? 2 : 1; j >= 0; j --) - { - for (k = 0; k < num_fonts; k ++) - if (strcmp(Fonts[i][j], fonts[k]) == 0) - break; - - if (k >= num_fonts) - { - /* - * Add new font... - */ - - fonts[num_fonts] = Fonts[i][j]; - num_fonts ++; - } - } - - /* - * List the fonts that will be used... - */ - - for (i = 0; i < num_fonts; i ++) - if (i == 0) - printf("%%%%DocumentNeededResources: font %s\n", fonts[i]); - else - printf("%%%%+ font %s\n", fonts[i]); - - puts("%%DocumentSuppliedResources: procset texttops 1.1 0"); - - for (i = 0; i < num_fonts; i ++) - { - if (ppd != NULL) - { - fprintf(stderr, "DEBUG: ppd->num_fonts = %d\n", ppd->num_fonts); - - for (j = 0; j < ppd->num_fonts; j ++) - { - fprintf(stderr, "DEBUG: ppd->fonts[%d] = %s\n", j, ppd->fonts[j]); - - if (strcmp(fonts[i], ppd->fonts[j]) == 0) - break; - } - } - else - j = 0; - - if ((ppd != NULL && j >= ppd->num_fonts) || - strncmp(fonts[i], "Courier", 7) == 0 || - strcmp(fonts[i], "Symbol") == 0) - { - /* - * Need to embed this font... - */ - - printf("%%%%+ font %s\n", fonts[i]); - } - } - - puts("%%EndComments"); - - puts("%%BeginProlog"); - - /* - * Download any missing fonts... - */ - - for (i = 0; i < num_fonts; i ++) - { - if (ppd != NULL) - { - for (j = 0; j < ppd->num_fonts; j ++) - if (strcmp(fonts[i], ppd->fonts[j]) == 0) - break; - } - else - j = 0; - - if ((ppd != NULL && j >= ppd->num_fonts) || - strncmp(fonts[i], "Courier", 7) == 0 || - strcmp(fonts[i], "Symbol") == 0) - { - /* - * Need to embed this font... - */ - - printf("%%%%BeginResource: font %s\n", fonts[i]); - - /**** MRS: Need to use CUPS_FONTPATH env var! ****/ - /**** Also look for Fontmap file or name.pfa, name.pfb... ****/ - snprintf(filename, sizeof(filename), "%s/fonts/%s", datadir, fonts[i]); - if ((fp = fopen(filename, "rb")) != NULL) - { - while ((j = fread(line, 1, sizeof(line), fp)) > 0) - fwrite(line, 1, j, stdout); - - fclose(fp); - } - - puts("\n%%EndResource"); - } - } - - /* - * Write the encoding array(s)... - */ - - puts("% character encoding(s)"); - - for (i = 0; i < NumFonts; i ++) - { - printf("/cupsEncoding%02x [\n", i); - - for (ch = 0; ch < 256; ch ++) - { - if (Glyphs[Codes[i * 256 + ch]]) - printf("/%s", Glyphs[Codes[i * 256 + ch]]); - else if (Codes[i * 256 + ch] > 255) - printf("/uni%04X", Codes[i * 256 + ch]); - else - printf("/.notdef"); - - if ((ch & 7) == 7) - putchar('\n'); - } - - puts("] def"); - } - - /* - * Create the fonts... - */ - - if (NumFonts == 1) - { - /* - * Just reencode the named fonts... - */ - - puts("% Reencode fonts"); - - for (i = PrettyPrint ? 2 : 1; i >= 0; i --) - { - printf("/%s findfont\n", Fonts[0][i]); - puts("dup length 1 add dict begin\n" - " { 1 index /FID ne { def } { pop pop } ifelse } forall\n" - " /Encoding cupsEncoding00 def\n" - " currentdict\n" - "end"); - printf("/%s exch definefont pop\n", names[i]); - } - } - else - { - /* - * Construct composite fonts... Start by reencoding the base fonts... - */ - - puts("% Reencode base fonts"); - - for (i = PrettyPrint ? 2 : 1; i >= 0; i --) - for (j = 0; j < NumFonts; j ++) - { - printf("/%s findfont\n", Fonts[j][i]); - printf("dup length 1 add dict begin\n" - " { 1 index /FID ne { def } { pop pop } ifelse } forall\n" - " /Encoding cupsEncoding%02x def\n" - " currentdict\n" - "end\n", j); - printf("/%s%02x exch definefont /%s%02x exch def\n", names[i], j, - names[i], j); - } - - /* - * Then merge them into composite fonts... - */ - - puts("% Create composite fonts..."); - - for (i = PrettyPrint ? 2 : 1; i >= 0; i --) - { - puts("8 dict begin"); - puts("/FontType 0 def/FontMatrix[1.0 0 0 1.0 0 0]def/FMapType 2 def/Encoding["); - for (j = 0; j < NumFonts; j ++) - if (j == (NumFonts - 1)) - printf("%d", j); - else if ((j & 15) == 15) - printf("%d\n", j); - else - printf("%d ", j); - puts("]def/FDepVector["); - for (j = 0; j < NumFonts; j ++) - if (j == (NumFonts - 1)) - printf("%s%02x", names[i], j); - else if ((j & 3) == 3) - printf("%s%02x\n", names[i], j); - else - printf("%s%02x ", names[i], j); - puts("]def currentdict end"); - printf("/%s exch definefont pop\n", names[i]); - } - } - - /* - * Output the texttops procset... - */ - - puts("%%BeginResource: procset texttops 1.1 0"); - - puts("% Define fonts"); - - printf("/FN /cupsNormal findfont [%.3f 0 0 %.3f 0 0] makefont def\n", - 120.0 / CharsPerInch, 68.0 / LinesPerInch); - printf("/FB /cupsBold findfont [%.3f 0 0 %.3f 0 0] makefont def\n", - 120.0 / CharsPerInch, 68.0 / LinesPerInch); - if (PrettyPrint) - printf("/FI /cupsItalic findfont [%.3f 0 0 %.3f 0 0] makefont def\n", - 120.0 / CharsPerInch, 68.0 / LinesPerInch); - - puts("% Common procedures"); - - puts("/N { FN setfont moveto } bind def"); - puts("/B { FB setfont moveto } bind def"); - printf("/U { gsave 0.5 setlinewidth 0 %.3f rmoveto " - "0 rlineto stroke grestore } bind def\n", -6.8 / LinesPerInch); - - if (PrettyPrint) - { - if (ColorDevice) - { - puts("/S { 0.0 setgray show } bind def"); - puts("/r { 0.5 0.0 0.0 setrgbcolor show } bind def"); - puts("/g { 0.0 0.5 0.0 setrgbcolor show } bind def"); - puts("/b { 0.0 0.0 0.5 setrgbcolor show } bind def"); - } - else - { - puts("/S { 0.0 setgray show } bind def"); - puts("/r { 0.2 setgray show } bind def"); - puts("/g { 0.2 setgray show } bind def"); - puts("/b { 0.2 setgray show } bind def"); - } - - puts("/I { FI setfont moveto } bind def"); - - puts("/n {"); - puts("\t20 string cvs % convert page number to string"); - if (NumFonts > 1) - { - /* - * Convert a number to double-byte chars... - */ - - puts("\tdup length % get length"); - puts("\tdup 2 mul string /P exch def % P = string twice as long"); - puts("\t0 1 2 index 1 sub { % loop through each character in the page number"); - puts("\t\tdup 3 index exch get % get character N from the page number"); - puts("\t\texch 2 mul dup % compute offset in P"); - puts("\t\tP exch 0 put % font 0"); - puts("\t\t1 add P exch 2 index put % character"); - puts("\t\tpop % discard character"); - puts("\t} for % do for loop"); - puts("\tpop pop % discard string and length"); - puts("\tP % put string on stack"); - } - puts("} bind def"); - - printf("/T"); - write_text(title); - puts("def"); - - printf("/D"); - write_text(curdate); - puts("def"); - - puts("/H {"); - puts("\tgsave"); - puts("\t0.9 setgray"); - - if (Duplex) - { - puts("\tdup 2 mod 0 eq {"); - printf("\t\t%.3f %.3f translate } {\n", - PageWidth - PageRight, PageTop + 72.0f / LinesPerInch); - printf("\t\t%.3f %.3f translate } ifelse\n", - PageLeft, PageTop + 72.0f / LinesPerInch); - } - else - printf("\t%.3f %.3f translate\n", - PageLeft, PageTop + 72.0f / LinesPerInch); - - printf("\t0 0 %.3f %.3f rectfill\n", PageRight - PageLeft, - 144.0f / LinesPerInch); - - puts("\tFB setfont"); - puts("\t0 setgray"); - - if (Duplex) - { - puts("\tdup 2 mod 0 eq {"); - printf("\t\tT stringwidth pop neg %.3f add %.3f } {\n", - PageRight - PageLeft - 36.0f / LinesPerInch, - (0.5f + 0.157f) * 72.0f / LinesPerInch); - printf("\t\t%.3f %.3f } ifelse\n", 36.0f / LinesPerInch, - (0.5f + 0.157f) * 72.0f / LinesPerInch); - } - else - printf("\t%.3f %.3f\n", 36.0f / LinesPerInch, - (0.5f + 0.157f) * 72.0f / LinesPerInch); - - puts("\tmoveto T show"); - - printf("\tD dup stringwidth pop neg 2 div %.3f add %.3f\n", - (PageRight - PageLeft) * 0.5, - (0.5f + 0.157f) * 72.0f / LinesPerInch); - puts("\tmoveto show"); - - if (Duplex) - { - puts("\tdup n exch 2 mod 0 eq {"); - printf("\t\t%.3f %.3f } {\n", 36.0f / LinesPerInch, - (0.5f + 0.157f) * 72.0f / LinesPerInch); - printf("\t\tdup stringwidth pop neg %.3f add %.3f } ifelse\n", - PageRight - PageLeft - 36.0f / LinesPerInch, - (0.5f + 0.157f) * 72.0f / LinesPerInch); - } - else - printf("\tn dup stringwidth pop neg %.3f add %.3f\n", - PageRight - PageLeft - 36.0f / LinesPerInch, - (0.5f + 0.157f) * 72.0f / LinesPerInch); - - puts("\tmoveto show"); - puts("\tgrestore"); - puts("} bind def"); - } - else - puts("/S { show } bind def"); - - puts("%%EndResource"); - - puts("%%EndProlog"); -} - - -/* - * 'write_line()' - Write a row of text. - */ - -static void -write_line(int row, /* I - Row number (0 to N) */ - lchar_t *line) /* I - Line to print */ -{ - int i; /* Looping var */ - int col; /* Current column */ - int attr; /* Current attribute */ - int font, /* Font to use */ - lastfont, /* Last font */ - mono; /* Monospaced? */ - lchar_t *start; /* First character in sequence */ - - - for (col = 0; col < SizeColumns;) - { - while (col < SizeColumns && (line->ch == ' ' || line->ch == 0)) - { - col ++; - line ++; - } - - if (col >= SizeColumns) - break; - - if (NumFonts == 1) - { - /* - * All characters in a single font - assume monospaced... - */ - - attr = line->attr; - start = line; - - while (col < SizeColumns && line->ch != 0 && attr == line->attr) - { - col ++; - line ++; - } - - write_string(col - (line - start), row, line - start, start); - } - else - { - /* - * Multiple fonts; break up based on the font... - */ - - attr = line->attr; - start = line; - lastfont = Chars[line->ch] / 256; - mono = strncmp(Fonts[lastfont][0], "Courier", 7) == 0; - col ++; - line ++; - - if (mono) - { - while (col < SizeColumns && line->ch != 0 && attr == line->attr) - { - font = Chars[line->ch] / 256; - if (strncmp(Fonts[font][0], "Courier", 7) != 0 || - font != lastfont) - break; - - col ++; - line ++; - } - } - - if (Directions[lastfont] > 0) - write_string(col - (line - start), row, line - start, start); - else - { - /* - * Do right-to-left text... - */ - - while (col < SizeColumns && line->ch != 0 && attr == line->attr) - { - if (Directions[Chars[line->ch] / 256] > 0 && - !ispunct(line->ch & 255) && !isspace(line->ch & 255)) - break; - - col ++; - line ++; - } - - for (i = 1; start < line; i ++, start ++) - if (!isspace(start->ch & 255)) - write_string(col - i, row, 1, start); - } - } - } -} - - -/* - * 'write_string()' - Write a string of text. - */ - -static void -write_string(int col, /* I - Start column */ - int row, /* I - Row */ - int len, /* I - Number of characters */ - lchar_t *s) /* I - String to print */ -{ - int ch; /* Current character */ - float x, y; /* Position of text */ - unsigned attr; /* Character attributes */ - - - /* - * Position the text and set the font... - */ - - if (Duplex && (NumPages & 1) == 0) - { - x = PageWidth - PageRight; - y = PageTop; - } - else - { - x = PageLeft; - y = PageTop; - } - - x += (float)col * 72.0f / (float)CharsPerInch; - y -= (float)(row + 0.843) * 72.0f / (float)LinesPerInch; - - attr = s->attr; - - if (attr & ATTR_RAISED) - y += 36.0 / (float)LinesPerInch; - else if (attr & ATTR_LOWERED) - y -= 36.0 / (float)LinesPerInch; - - if (x == (int)x) - printf("%.0f ", x); - else - printf("%.3f ", x); - - if (y == (int)y) - printf("%.0f ", y); - else - printf("%.3f ", y); - - if (attr & ATTR_BOLD) - putchar('B'); - else if (attr & ATTR_ITALIC) - putchar('I'); - else - putchar('N'); - - if (attr & ATTR_UNDERLINE) - printf(" %.3f U", (float)len * 72.0 / (float)CharsPerInch); - - if (NumFonts > 1) - { - /* - * Write a hex string... - */ - - putchar('<'); - - while (len > 0) - { - printf("%04x", Chars[s->ch]); - - len --; - s ++; - } - - putchar('>'); - } - else - { - /* - * Write a quoted string... - */ - - putchar('('); - - while (len > 0) - { - ch = Chars[s->ch]; - - if (ch < 32 || ch > 126) - { - /* - * Quote 8-bit and control characters... - */ - - printf("\\%03o", ch); - } - else - { - /* - * Quote the parenthesis and backslash as needed... - */ - - if (ch == '(' || ch == ')' || ch == '\\') - putchar('\\'); - - putchar(ch); - } - - len --; - s ++; - } - - putchar(')'); - } - - if (PrettyPrint) - { - if (attr & ATTR_RED) - puts("r"); - else if (attr & ATTR_GREEN) - puts("g"); - else if (attr & ATTR_BLUE) - puts("b"); - else - puts("S"); - } - else - puts("S"); -} - - -/* - * 'write_text()' - Write a text string, quoting/encoding as needed. - */ - -static void -write_text(const char *s) /* I - String to write */ -{ - int ch; /* Actual character value (UTF8) */ - const unsigned char *utf8; /* UTF8 text */ - - - if (NumFonts > 1) - { - /* - * 8/8 encoding... - */ - - putchar('<'); - - utf8 = (const unsigned char *)s; - - while (*utf8) - { - if (*utf8 < 0xc0) - ch = *utf8 ++; - else if ((*utf8 & 0xe0) == 0xc0) - { - /* - * Two byte character... - */ - - ch = ((utf8[0] & 0x1f) << 6) | (utf8[1] & 0x3f); - utf8 += 2; - } - else - { - /* - * Three byte character... - */ - - ch = ((((utf8[0] & 0x1f) << 6) | (utf8[1] & 0x3f)) << 6) | - (utf8[2] & 0x3f); - utf8 += 3; - } - - printf("%04x", Chars[ch]); - } - - putchar('>'); - } - else - { - /* - * Standard 8-bit encoding... - */ - - putchar('('); - - while (*s) - { - if (*s < 32 || *s > 126) - printf("\\%03o", *s); - else - { - if (*s == '(' || *s == ')' || *s == '\\') - putchar('\\'); - - putchar(*s); - } - - s ++; - } - - putchar(')'); - } -} - - -/* - * End of "$Id: texttops.c 7720 2008-07-11 22:46:21Z mike $". - */ diff --git a/fonts/Makefile b/fonts/Makefile deleted file mode 100644 index c87c3e644..000000000 --- a/fonts/Makefile +++ /dev/null @@ -1,118 +0,0 @@ -# -# "$Id: Makefile 7871 2008-08-27 21:12:43Z mike $" -# -# Fonts makefile for CUPS. -# -# Copyright 2007-2011 by Apple Inc. -# Copyright 1993-2006 by Easy Software Products. -# -# These coded instructions, statements, and computer programs are the -# property of Apple Inc. and are protected by Federal copyright -# law. Distribution and use rights are outlined in the file "LICENSE.txt" -# which should have been included with this file. If this file is -# file is missing or damaged, see the license at "http://www.cups.org/". -# - -include ../Makedefs - -# -# Font files... -# - -FONTS = \ - Monospace \ - Monospace-Bold \ - Monospace-BoldOblique \ - Monospace-Oblique - - -# -# Make everything... -# - -all: - - -# -# Make library targets... -# - -libs: - - -# -# Make unit tests... -# - -unittests: - - -# -# Clean all config and object files... -# - -clean: - - -# -# Dummy depend target... -# - -depend: - - -# -# Install all targets... -# - -install: all install-data install-headers install-libs install-exec - - -# -# Install data files... -# - -install-data: - $(INSTALL_DIR) -m 755 $(DATADIR)/fonts - if test "x$(BANNERTOPS)" != x -o "x$(TEXTTOPS)" != x; then \ - for file in $(FONTS); do \ - $(INSTALL_DATA) $$file $(DATADIR)/fonts; \ - done \ - fi - - -# -# Install programs... -# - -install-exec: - - -# -# Install headers... -# - -install-headers: - - -# -# Install libraries... -# - -install-libs: - - -# -# Uninstall files... -# - -uninstall: - for file in $(FONTS); do \ - $(RM) $(DATADIR)/fonts/$$file; \ - done - $(RMDIR) $(DATADIR)/fonts - - -# -# End of "$Id: Makefile 7871 2008-08-27 21:12:43Z mike $". -# diff --git a/fonts/Monospace b/fonts/Monospace deleted file mode 100644 index 2512b85fa..000000000 --- a/fonts/Monospace +++ /dev/null @@ -1,2744 +0,0 @@ -%!PS-AdobeFont-1.0: Monospace 1.15 -%%DocumentSuppliedResources: font Monospace -%%Title: Monospace -%Version: 1.15 -%%CreationDate: Thu Oct 27 10:50:21 2005 -%%Creator: mike -%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. -%Copyright: DejaVu changes are in public domain - -% Generated by FontForge 20051018 (http://fontforge.sf.net/) -%%EndComments - -FontDirectory/Monospace known{/Monospace findfont dup/UniqueID known{dup -/UniqueID get 4166841 eq exch/FontType get 1 eq and}{pop false}ifelse -{save true}{false}ifelse}{false}ifelse -11 dict begin -/FontType 1 def -/FontMatrix [0.000488281 0 0 0.000488281 0 0 ]readonly def -/FontName /Monospace def -/FontBBox {-109 -1034 1342 2133 }readonly def -/UniqueID 4166841 def -/PaintType 0 def -/FontInfo 11 dict dup begin - /version (1.15) readonly def - /Notice (Copyright \050c\051 2003 by Bitstream, Inc. All Rights Reserved.\012DejaVu changes are in public domain\012) readonly def -% Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. -% DejaVu changes are in public domain - /FullName (Monospace) readonly def - /FamilyName (Monospace) readonly def - /Weight (Book) readonly def - /FSType 0 def - /ItalicAngle 0 def - /isFixedPitch true def - /UnderlinePosition -213 def - /UnderlineThickness 141 def - /ascent 1556 def -end readonly def -/Encoding 256 array - 0 1 255 { 1 index exch /.notdef put} for -dup 32/space put -dup 33/exclam put -dup 34/quotedbl put -dup 35/numbersign put -dup 36/dollar put -dup 37/percent put -dup 38/ampersand put -dup 39/quotesingle put -dup 40/parenleft put -dup 41/parenright put -dup 42/asterisk put -dup 43/plus put -dup 44/comma put -dup 45/hyphen put -dup 46/period put -dup 47/slash put -dup 48/zero put -dup 49/one put -dup 50/two put -dup 51/three put -dup 52/four put -dup 53/five put -dup 54/six put -dup 55/seven put -dup 56/eight put -dup 57/nine put -dup 58/colon put -dup 59/semicolon put -dup 60/less put -dup 61/equal put -dup 62/greater put -dup 63/question put -dup 64/at put -dup 65/A put -dup 66/B put -dup 67/C put -dup 68/D put -dup 69/E put -dup 70/F put -dup 71/G put -dup 72/H put -dup 73/I put -dup 74/J put -dup 75/K put -dup 76/L put -dup 77/M put -dup 78/N put -dup 79/O put -dup 80/P put -dup 81/Q put -dup 82/R put -dup 83/S put -dup 84/T put -dup 85/U put -dup 86/V put -dup 87/W put -dup 88/X put -dup 89/Y put -dup 90/Z put -dup 91/bracketleft put -dup 92/backslash put -dup 93/bracketright put -dup 94/asciicircum put -dup 95/underscore put -dup 96/grave put -dup 97/a put -dup 98/b put -dup 99/c put -dup 100/d put -dup 101/e put -dup 102/f put -dup 103/g put -dup 104/h put -dup 105/i put -dup 106/j put -dup 107/k put -dup 108/l put -dup 109/m put -dup 110/n put -dup 111/o put -dup 112/p put -dup 113/q put -dup 114/r put -dup 115/s put -dup 116/t put -dup 117/u put -dup 118/v put -dup 119/w put -dup 120/x put -dup 121/y put -dup 122/z put -dup 123/braceleft put -dup 124/bar put -dup 125/braceright put -dup 126/asciitilde put -dup 160/nonbreakingspace put -dup 161/exclamdown put -dup 162/cent put -dup 163/sterling put -dup 164/currency put -dup 165/yen put -dup 166/brokenbar put -dup 167/section put -dup 168/dieresis put -dup 169/copyright put -dup 170/ordfeminine put -dup 171/guillemotleft put -dup 172/logicalnot put -dup 173/sfthyphen put -dup 174/registered put -dup 175/macron put -dup 176/degree put -dup 177/plusminus put -dup 178/twosuperior put -dup 179/threesuperior put -dup 180/acute put -dup 181/mu put -dup 182/paragraph put -dup 183/periodcentered put -dup 184/cedilla put -dup 185/onesuperior put -dup 186/ordmasculine put -dup 187/guillemotright put -dup 188/onequarter put -dup 189/onehalf put -dup 190/threequarters put -dup 191/questiondown put -dup 192/Agrave put -dup 193/Aacute put -dup 194/Acircumflex put -dup 195/Atilde put -dup 196/Adieresis put -dup 197/Aring put -dup 198/AE put -dup 199/Ccedilla put -dup 200/Egrave put -dup 201/Eacute put -dup 202/Ecircumflex put -dup 203/Edieresis put -dup 204/Igrave put -dup 205/Iacute put -dup 206/Icircumflex put -dup 207/Idieresis put -dup 208/Eth put -dup 209/Ntilde put -dup 210/Ograve put -dup 211/Oacute put -dup 212/Ocircumflex put -dup 213/Otilde put -dup 214/Odieresis put -dup 215/multiply put -dup 216/Oslash put -dup 217/Ugrave put -dup 218/Uacute put -dup 219/Ucircumflex put -dup 220/Udieresis put -dup 221/Yacute put -dup 222/Thorn put -dup 223/germandbls put -dup 224/agrave put -dup 225/aacute put -dup 226/acircumflex put -dup 227/atilde put -dup 228/adieresis put -dup 229/aring put -dup 230/ae put -dup 231/ccedilla put -dup 232/egrave put -dup 233/eacute put -dup 234/ecircumflex put -dup 235/edieresis put -dup 236/igrave put -dup 237/iacute put -dup 238/icircumflex put -dup 239/idieresis put -dup 240/eth put -dup 241/ntilde put -dup 242/ograve put -dup 243/oacute put -dup 244/ocircumflex put -dup 245/otilde put -dup 246/odieresis put -dup 247/divide put -dup 248/oslash put -dup 249/ugrave put -dup 250/uacute put -dup 251/ucircumflex put -dup 252/udieresis put -dup 253/yacute put -dup 254/thorn put -dup 255/ydieresis put -readonly def -currentdict end -currentfile eexec -17F6ABC0BD4E5B049FA8ED1415B73797205424D2E47FC5DF8590627DC99082760E8B3E17 -0C18AF49528FA9DB386CE480B471EC8797784FB466233A879056FB46290A8F49442020C3 -E00AF7FDB602BAC1C4F8636E32FDDB936FC70C567B075E18878EA286E1D24CC1E14B50B7 -DCDD17FD5295A3F44E0DA80366E61263EA00234FA095739BDE371FED9A24338A8CAB0F53 -5964F1515D62E477A2F1C2BEEA2DF171E3962F0DE53E2763D7DE117F6B5328691D69C4D8 -D071D89F6AB4731DFE0A1FCC4F32351620B2B48E12AEAD940270EF4990B511E7D052C3A4 -2AAEF583BD41B85778646ED2E9A86A73A1089F502672860E7A7A9CFC2F7B2E221C6C9080 -7B7E7B4218C9B10B574C73E195D6C97D1EDC5FA365221BD82148D1ADEA7F235FFC14AD5A -47E11207058A7A9059FF373F66FEA5A9113CE0BCAF084AAE135556FE84AA4C5A9070BD77 -E7D39A94BA711FDFE442366E9F27F14EF80FFF2C342189C2E28D9FC541F049944C1CF913 -2A014935BF47B42C4E0847A335B4E6CE5016C1B8FC0C3E153C07ADF3C0B00CE001DDF36F -DE0CC04A25FA1635707299ACB277BFF663DE9558664D1DE90465FBC67BAEA7B1851FCC85 -7364E4BB97470017B40C4D54096C4AE2469A5D037963C7F009DD25A32C20487FF1F1F0A0 -124BF0B10891BC1FBDC65F9192B7236A694E1CFD1388CD27288222AE80032683C803533D -E6C39DF03BFA02DB5F35C1B99531836F38F6F04192AE3228C0F19841842F5C907529175B -6BF7B4A8D7B3F27FB39A58B7D3CF11A306701B548C3DC231102A45496B5535C96FBF0412 -004ED0658F28F845F4B0C5F02A680737A738A559E8E6BFCA7584C0A9FAB1B5D3C8995508 -856337933B9A49D0624F25CC06C8243C2A8816426753B631100403B630D81FCA4D08527F -3AE881DA5332F16C4D8B15F3CBD4DF36430C2199BE5CD27CCF4BE86F5519C046E73442E3 -AEC3F3DAD10948A6AF7740BE87874A288FB27851EF698B571A027E5787BB45BA566A2822 -69423D624D118CA8D14B389A93193F1C8CF64CDC3F0153D4B8CA8AA843C2C26AAC2971DA -7F52B17B21ACE56A7021C6255A2707BFF033A1477C42C0B5D2001820FC9A8BFFB4E9DBAB -B595E925C78C9CF87420160DC0B549CBD8A3D12352AFE06CFEF38A2D3715AECCF86E0919 -790BA8FEAE050576C4DFCB416E2DF5FA3B25192F16A935C9CA82C87CC997CA5909B956FA -1622B10EAD7465B8FE6B347675D7C363581C9B52C9D020AD5CF983284D9359F4C8F9E91B -C073DAFC702EA788540E72A08668BEA885605C8D42E5F6BAE086F3591C614D438FAB01E1 -3D69768ED2249FF1079E2EE704F9672DF9DF9C8A41CADAE9013809F1DA83673A8398B477 -A13B4B0093E151F6489A2D9BC119A66232A1AB85F31979FBA9EE7F163FD59FE14C72FAFF -A1CFCC482619E13021FEC7F10C6730E5A7FCAEE84EB5011F13E407591BCE6353D5AD0634 -D4414B008C95F31170FD8F33F83C6B02DDDF05401012E7260A3DD0213857AF9072EF5DA7 -389AE027997C2D7130443A4B2E505A9F17B00E84E142E4ECBFF3AEF2C2C4E84F162E2F7E -436222EBA20B0DB87346084A2BF64B70B1796729F845D456702C7625AD2CA3D232345C9C -12B9DCBDFAB9B8F697E5E4EF2D473D119F81A46F6FD8A03AAC73211F36FF824DE6E03788 -BD669A0E7F2813A4AA830C8EF8BE445CABE6019318806D10C5952157FF8F8286C1EE7015 -45C8F60EFA854EAE66835A2046A6915D395F1E0366A459E43236162A929ABE6ECDB26B57 -EAE7CE3731E0DB75ED207292FD83B6B288231E4F3F8170DCB831DF571EC07CE2D698CB6B -88C63F342E89FA1BE8879269D9F818C4F740C38EB419A8A814E52AC7CA90187730F43520 -115D7388390F20A8119771ED45AE1E58C1DD30B171E7B5B2E75DC63EDF55BCB9D7BF3119 -5E4BC6D91227A24B996F83BF8AA17D3A1DFD34B32E91C4F51C229796662763D1668E884B -E9BE85D60132A4C45ECFA6FEBEFFD3E34AF21DA897B24A5B836D4DF2E81D1B51FE682095 -63128FFE15E36687F7720F3C980EDED7A794EB420F3E0465B1E93755F64A9C54A24058FE -E496317919512048C2B01062574EAA66A2F86D01F58D9D252F2A84E7B44A057D8DE0EF2F -EF7B752B46B1643D7E57D2871CC15D0DAC4852901205AEB7C996A957C4A0605AAC287AA6 -581DD2C8ED591B89BA7126687F970D7D49E84AD96BCE16AFE6508B25E85D530D9A9F7A11 -E788CBC50E80F8A4ECD26C241C37078EDC447DFF2A43ED7BF1E00B6F227926A9913ACEB0 -98B833E54B3FD10F9D0CE4B8ED76549239A7F4FE846B9D57F26B53229856681CA7D3EFB0 -22CCF57311C872CD0D0342A2FFC59E2F13B32D530B0268A4D01A14193D1B17001E205355 -1E42338F7BAE7D9B02780A3D972AE4E904DD34761AA66159CEF52B226277596A2A9433D6 -4B5AA165D9595B99829EEA6E26F4E10DE1B6E0F33BDBB010A036D221B7F4191F4420B6EF -621566F238B0ACC9A7C41B90823D9DA08E327896CAE4AEE60F860240EC8A89C03E44E2CD -D4E767F4D457275E3F7AD41D4983D7C6BCEE26E6A7EBAD234DADE81B2C98C1F3F396979C -04A4E00E6F4AFDDDBE9D9EB775D1A1EE76399AEC7D30D3CD09AFD73601ADF5593B56D0B1 -4471810AF628AF86D1237E3690509FBAB8FB2F4D041CDA612467B254CBBF83780C60C1C7 -AED265168AFC379F832EBA6D6DFA2CE6FBE127690B37309F6A613608BA98A5B77E9ED5E4 -E7C373750542C245C20D10035D1163AE93970F3A8CCA7B5A57DD0503060637DEA1CDC404 -713E1DE9E328DD8D902D24E0C70B17620EA2217B7E51589626FF6923A0D76DE1B480DFC9 -CE2B7BE62919C80623B7E39BBBE748E8E70242233CCCC5899AE70F1A3B380418564AAB15 -E4CCB6BE3A9329C58D8843AA7D287D851168FB531FA694CAE2B9D77C13720A9499C13D50 -B4D6AB2A5BCAE592D465FBADE34CF7316886A7287918889EEB7FE26AB47B5319F833422D -803421C29FBCCF0D64657D945676C968938B633371EA7B3114BE2C23FD20581CDE846A7F -C5C57C4A4BFBE5A649B20E3756BA94FA8C45D0542134790D6105890BB01C961ACB87C761 -743FBA8F2549015D6B171EFD0390ECDB7744E185BB9D88BA42C4CCD61CF9AAC20B6E4C0D -A70F20091A75C9250C9F9287CDDD78D39400A85D28C70E38B38D33903E7496D3EE1FE98D -B047C84C59A60A58DA8DAC47A058A825544C1B4F4CBDFDD99A04BB691854A20A773544DA -A39EC11B14C864220F74CC2307075EBB4847AFF216614A471B1B169DCFF4F89FE390CB97 -46089C958316DEFEDDDF9F3BE4A6BCD0423836A7AC3F7A29CC863418B703668188C962D3 -6803BCEF438B47363A40762165AB9671A46F9253DDE8AFC38DAE53F7E34230ADE2830956 -F5B7EB9BE9E0086B7FB715173272B381B494085744ED8F2EDFAA567E2DFEC2861A231157 -818D7DC0898DCB8B8AE30BC0F1A65F018BBDFF3ACBA4436B5E824B6B4CC0F4402856E259 -F1D5F1C770A1589A621F9747B5F7E81908016DD977ADED8019C39BF5CB9AB35CA82CC83E -AEC842F6913929F8339EC1DCB27A53E3E1006174E2C8CBE4756F6762395DFB5AD85947BC -63137E05269807A5958D5A346528162B4C1B485E858DDB2ED3AF35A0485CBDECE9A2893D -C28B94DABA77498C26861FEF72571B5B66477862642465030FA5633E47B24BB8697E5A20 -73945D8E2338E554D66EAF307D9035AC9678414E799EC56AD03EB72A72B227DC18C3B27E -8AA1679D14FFBABF22FD2EE80C94AD06C34FE7F7597A82E1EFF272F2FCD72AECE10D5102 -BA8682441BAB1E8DD83EFAD74757A96051DE07782FE7B7D7BDF36DF39A434E59F1D2630D -93B66D1AD1A9565211B13427A036019C538D4C4314905257E8FEB31FC5DD316F606D7BFB -9CC3829EBCEAAF3722E465C60AB1D7CBA1D2D229CC28D11DF8FAFD2169339C0B61AEC73B -6FC855B5567FBF05D9088734DDD8755700C80A5C942915811567F103D0CB70611DE63F61 -9B2908AEED0B33A1CD43A84785FF49EE977D5C45E1ADE13672FBB01DB79096DFF6036904 -30B27DD8C0609AB745C238EC6F73B1CB8234794DDD9E1A41681CC004362DB2A97B8A96E9 -C981F7848C4BA5ECCE7CB87713B6B7C7CDB7450AFA5FA6719A8EF035D672A136AD494139 -8E777EBDBCA5DC8A9DFD54654883221071167CB4756FCD042891D85E4B2F5F306F39CD0F -B2E267665EC0A394A150D73A9AFE7C1098609BB6247A6DD24B01BD3B78DA1E49AAAFF696 -D27A53696FC27DA3B017224587D43372CD3406CCE3AC952D73C9AF01058C8EFFBD0C177B -204C6DF2CFC597FF177ADCAB6FCBD5F0267B00CA18311A4250FD04DF3809D4DB2C0E4778 -3D905D787362901E1171745B2A66848A3B617F29FE183DF6F746F9011AB14925AAFA1C4C -159C27D3BF8537D6FAA40A20B47745BD7148C698C450F18D0ADEBA3095F0379B7D0B4354 -E1BFFF0C63C7D745F0085D7239612CB0E5EF4B8FAEF7C19A7300881206500AC612D0C42C -66F4B99C32AF8CFFB05749260B56B7B425B550C427368E45AB7BB682C9D3E07FAF35DC89 -0AC6191384133DA9DCA3F3977243D277E0A1B833E37C4399B67DC083168310ED294ABA2B -6A96F5F1F7E8A18E5C8A95CE1E224DBBFFCBE5E54BCD199625EBB5E5DDF1F2795DD53D81 -86A5EEE389B4EA7402B14D2BA4B3D9A1F50079AE9809A0B0A5061764A3320D9AB4B5CF1C -4BCAAA4CB0F2926A46397B9D8F3B3956E647FCF3034A34B6BAB88BD4C53FB84638DA56D2 -2C65DB9BDEB68FCAD5CAB7B184EAEC585677704583CE9372F90471EA5B68FC5D1DD702A0 -A7668E6C7416E4A5CD646EFD2359DBB7367492BC0B4E6BAFA13D3D3975604E1A187A6E61 -EF6087394EAC2F8FA9FB4C040A994545480329FF5FF9B4727A39356F8A4043A74A9A7E2D -250826ADD481F91B9DB916A9FD5FE4469A9861A96BDF6BD3DAE13293B9DC2A318A35D7FF -DBCD241F2FB394644895A3F53C457C752A72E8167E6B7D4495B3C1DF0EC53127509988F1 -49D6C49CDA35B00652F148D3CAEFA3EFD8954E80766AEFCB85953366389FD4DF6D70E36E -B321BDB176FE7B75CC31A73F4DB7BDF5E0B45C23FFAD7B7EE35B9B6E9EA4141F4F98430B -D93BE0FCF80D63D7860E9B43D161DA7A68C2BD51E2E95ED7B54A91466D0716603CC41E83 -7004D94DABC5D971330DF98672136E372129A77CB496C7200FE3E287F7936E8002B54C51 -25B364B6E07943A078E2C018678B7E159C1DFDE7633CC3633B38D50C54B98B45DF4A972B -93B4B4013F8F1EC0083B09F3FAFD2CE2B2ED5791DDC0945679A122F21B4C5D67DA6E5A5F -2A5893AD3AA7AFD891ABC6860F14EE16DDE548520DC88C2CE6099861B038EB25A01589D3 -2F4AE37FAA4D171416651CCE37FA4EB8D063A0977988E50F9036C0A9C8E99E6D586EED28 -E0FEFBE7406386EB9FBDCBD8DF820F6371C99C6F7A4F2E3F43FD2792A9A2D3F81BD3DC6E -DEB59B1B4DACC2F278A0C6C1D3B841A73525F311504CEFC8538CD53C487F612D9045AB40 -8B8A76195907E3B679CE68322703C2F80A50401BD44BB5D14080A46F859075C9B51BF0A2 -C42321EDE4254F558FE33357746631F407C16675320B8DF3E24E0FBE2E93BF718CBCCF5F -F21F013313BAF474F239CD0FE72EB03279791A95BB322DF5C4725763052185CD5CDEDC76 -071B4B2337B406337237A2A6490D75598CF6010D22582B8A12871C17003839A8A8C42E92 -EFC92B7EF0763D7B6481965F890802C7AD345F2FFB5A444DE404C833D1D9DB1CEE2DABB6 -42DB540CB398BD2C16A7383E649A0714154E72D94438FF904755399C1674F5E01CD45590 -CD04C4FE3292356650A3D431D7600426A1475B5919722726468C247BCD565965DA6E4A83 -28644CB1FD2A23B1B45F74E6B4BA9AE065BE873BBB80505D16D54D9DE69026CF1DE8DEBD -E472F067C70CB4104D23ED0CC9BF68055283A6CC2AAF48FC59A580DA8597F95EBB8F61FB -C4F6B12FEE888AD60897383AB17D227C0CEF95E86F149ED6B71C2FD67F5A996E8B34C5EE -23DFFEE49200A250611E32FE3300AEE9BF13790703B6AC983C965F1C52D2BE0BE876D4A8 -85FCE072D5D584B12CF2CF91BD7D7F9EDA1D6FD62F40AB5682312D6138030FA1EBE9B194 -1DA4ABAE5A781EA979F608C6F0D5481CF48AACE9F79031574204447596555188C3D6048D -B9D7D8D1F0B67DD5F3468E7C7B647DCD1AC3B3C95E1DA6DA05816B49DC8BB86E85C0094C -6C9A703B88F020363930195842A753EE42B4BEC13B668101203BBB7D5CF7E9C3E39716B9 -85F4BA374147BC7B13BC2515C8A500596D35152A102FA248B9E30D6050C11045B9A81213 -7C228594EE2725F43CCE59D3F1669F0B4722B2171811C2A12B1905C0B40EF1B1957731A3 -A20D29302DB48D061351430549F57084C31D008391BC9D20534EA98CA6F951E00FDE49F6 -22913C19F44E489CF9A80274B43CA60CA5C517C821426D5BFA185649ADC0F1AFFE8ABFBC -A0A03CF0DB690CAF902219A5580EEB11DD3ED650979550454929EFDCC32C7E8418B80F54 -F0CAD6049E2EB23D5DBC2D680772F03E8F3D19913E6F771AC65C1575AA6968CC6857633A -C2520C09AE900BA1CED6C5C21C2CF8BCA8D676A539F22DFE03B4134AA8181CB38BB0F69F -C83517AB3AAB165F2A1FA474E067627199406D26881E8066E509D3C39A1A8C4BF99D4D46 -922EEA6D05F7EBDD33A33774F24A650B9170D2CBC9A69317CF90010F9688EC72B3DFD2B7 -0EAE5DE97C03A5CBC355E8A57F7C36D9AF8DA95B4A307965074244B72B5689F6DA0FD360 -DD95C184A7037397C0598153F96AEBF3E059B042A3251AEBAFDB90631C7A7E52C89E7623 -07487D51B8A019BE505E4078DF87A79565DAEAFCBDCF4D99E658A3A6F33C252CC8FDEA27 -CC974B91269FB2FD905A619159300A0274E79C1F52ACACBF68E03CBA15523A0B2081C739 -3D397D3D4BDF3094FBC5D20852EF7766A4C83B708E2F75008756044AB2B55C57559CF7A4 -636F74B49D18E81057BE38166F87DF24C73B337533DCAFC8F7D4EF0A3C4C6B82E9BFA3E4 -F3116E011FFC4A89B7FB72CFF1B0229D6D578AC85DC6E6C3CB956193689607D6D7A48367 -0D7C529E5C5C223E081E3C6F1F3A2B8BA8EB5C4DBD19F9A5566694EDDAB69837B65C8299 -63A95E321181E4BA0B097FBDF72647838C8B49DE3AA88B6F755317FB1785E12DDA71F944 -49D3D1DBC0C167B3793747D9D6EBF6FA13A74FE1FFB6A2EBBDDE14A21040380DA4BC9088 -C60ED587EDF6E2A00BC041990F00C7568373598310FBB5FE87A1656E381A2C449C63B236 -5BDA6D3C51D1E5A1A0ED408221B2FA8397FE2FC992F990DB3E772F3EA54CB468AD471FB8 -0FB1E1A9CC6444B98D2993F5DAAC9B5CDE3ED8AD6FD8DE80001DC7D67A09B39BA8D0B35A -CEFD510CF34838F06C72047309CFA29787631CD33E0E4457DF26244706966FCAD9A90668 -A155F9BC4214693A80C3440F56C2A01D87AD998493130C344E9560A88F9969585B6D2D4C -AEDCA0D1954D6C84E0F717C48548C60B39D0013FC95E3DA0C13796130F3E0D8A240F8ACC -4BFD93D26A7185DE5AA0C493EF230D0A5EB0DDFBD49A66A61D814D2D03EE94B40A25F8C6 -5F615B8C4402B4FFF0A882316E9123C0267E0773E048658ECF5C0008EC18976EE2F8CB4C -E5B4C17F857B83E16622180B70F0433488E58826B39221566EAE2A9C350177F10D9737CA -6ED009C263E3198F02D7A3514B3AA1AE7B0BDBE901D84DC256855A3DFCC83BF51C9B3CCA -1FD2756DC6D54280E164E942530CC560BDD8FA6AEAD30EF5BD8A4A30EE5755C7A4D7C550 -F0399CCEB87FB781EF298DBA53BF7FC3373388DDE9AE21AFE51A7EADFE83767E8A112DBF -C595A9B0E833CE7F8ECE227028F10E36B8147340F6C0152DADF434AB60CC64BD9158E0E8 -C30F38FD0D5D7573D43FC3AA9403BE945DF46D040AAD91FF69D0B0FDDAF19EDE36F089AB -D8E00D8417C463C1CB3292E6AC20CAF026C74FE0F97CF8D7956678D1A104002A68D53664 -A82EAA93112A3BD2B55113F37E8588E78C0429E482259A2A0C11F745A74429FBABB8A53C -D40101CE27011FE51335D3417E41ED1A8D260EAAB7C3F118B426DF541FFBDA96C4FA9859 -66B99AAB27B4DBFD28304F386879C6DF62242B689DE14BEAA08BF07AE4A38B203B024F88 -808C5E227B6AE750142874E5E59B23AB9B36025B6D67EAE9B8DB60B9A04A388525D1F50D -C46F8172AD8DACEB870ABB56944F916B492DD6E9D296049973D661689E8A416014D4D2C2 -782EAB49362E9FBFD5BD6F0C95F243BE717535005F99A22FF28A7A02A5F4BA4B1F505449 -61ED383753ADD0D2952FA9313CAA827F3D8F8977C98D760E4BBDC134DFBC0A008230D337 -35A048B81A94A8CB7034DE777595158CBABDB648F1A2325655EB64B42C24D190C2979F9F -AB4C9DA55299AEADE3801F9956E3C62A77A16746073EBBD364AC634B37671C8F153B8EF7 -D9F110CEE184CE3394349EBFD88E43D15B309DAFF263F4BECF1C581FC4CE876B68D3F1C5 -EB2F001FBA2809FDC3F834833F39B74C9E5018C8A7CBEECDFCB121EDCE0282988BC5BF4D -156D91F53B4EF6B9FF7D95CF1B39B679F06190A10C3FFF40D461000E3F8E422AC042148F -E12B5A776BB1F15D44D41CED498A9AEFD2CAF59CDCDE5C4158B8CA1CBDF4FB5AE83D99B1 -A39770AA15397D85F77F42846B0893AE39A0F4612A62A7D963B767DFB1E92A0B73FC65CC -EDBAD8D74D2C24E08B2D551538DD954D94A80B92E897E8C10D1725988EAF003E9BABE962 -2C9C8D278A6BF1935574C80C6815BDF0BB7011FBEA53A59C0C45D1978A1D3E6A7BCC87F4 -2C5FDC7886044CE5798F06096AB7FB360316E1BFCE3E719A1EA906E0C5949E00DE7AED0D -E6C25832D30CE1867387C8254F51171A9037C8CBC6D339B4647E9077D605C13E30324180 -A433FF9F3A7BBC3B0B775A860F7BAB63D7538E2092F902F019D29FE8DD198EBD85DF0564 -D39C10DC176F698641996117778D7F899153CB26D568C057DA39FBE2D21ACF39E0756E16 -7FB5AF562F190A7B940A8F4BFF98AE156D74CE4C8CEAAB103FE6F06B7D578E5D7675DBA7 -27FCC0B96031ADF2D3F204EF9DF63D8A4263EBE46B74F1A2CB67D620FF5B2585A53C7CB0 -DA53F6F219B277BE9F8735014BDF61936C3377A6D1348D3C670A65CD057B32DBBFFFF5E4 -D830E9CA83BABE9298431F93884E2083D6ED6DA68A30C7372539DE05E8CC9DD8A748C810 -462687C6B9B75B305C3A31BC32A122365DEB55AF6F6D2BA9468247BC0853E7144E46AAE7 -E0D7C76E8BA15289ED307E0943F5E3A05F051AD2C2EBDC7E2BA46F91B4CA94308D1D2FF3 -FCAB4EDDF761FFCF83C23C979E4D318A51A26424D78E5B215EA33F04E1BE296A9693F065 -9309FF404423775875D73F230FCD5CFB1AEF0F6CE5674F865C300105791111C1AAFC98A1 -557123E1C34749937C8BDE11E41C21B1B0FC53E8C5D199D3289DE09C7D7A95EB23D5192B -AAA67A13DABCDDF6C48115036065984276B126F294D6BDDFB90BE9319F3A3D031A22BBC6 -05766A7BC934472D23812B37720AC3403189F34F2CAC2B674B04D3B3B46B6662B1C2489A -2964D8EE5EAAC87A8AC7208E5E87358DDBEF9EBB52B96102CDB82D8BCC5D8A404DA247FC -C304D7153187BB579C75F71DA411E4B0FA80D2131D11C6BD693F3AA001FB349FA11B5FB4 -9DDC4B2A6443A8932AC4813795934D61D38BAEB1847EE5D3A7D01708524B3933B442709E -CBF2D39460259D44CE01645BCBCDC2BB9588C855936C6100009D867FBDC902475BB43DA2 -F7A309AE56082F18E670A25BA12213EB7D9BF6679452CD4814353BC62C1ECD5E1A7C50EE -43277A1D5D124BA9F596E19A29C24C234B1102893D2BEEA07F22450E26BE882D0FDC2AEA -5457AFEAD360063AF6A079958A343F444DC6EE7126AB88ED079C0165CF95765CC52DBBB7 -3CBECD85BB4F1176C4608201A6E2D3FA69C439B4AB2A9D5441F519DDC85C35C2DEE504DF -5ED9E958F768E9FED68D18748C8521FD6163FFE0DECF1BA44B11A261A4997D13E045C255 -0CD95881B9BC5D65A7C4AF0DA73A637F4979A3B54B9857402738B1E9FF94CDC075F51817 -CDFE1DC677E938F4ADB9E4CE4DDF4F12EE6C72352175B8389F39F84181C189F1BA529E9D -8D84B7E36790C1F57CE2117811E986D00B58EEFF6C8121934AF2FC54D09C486A5D9CA8F7 -6887CF4D7FE4841F3222F0C4E4F7D92C014FB4D48DB83FA87C243D453915BD6BDF5278BF -1C16090730765D68AD17160744DFD19AC8A754915E669074D4F3A9A1F37F7D720B38D5E1 -5D734093944BA853010ED6C6CC7D5D885D6A1366B2FEE42E54718A2DC1BBD437830EF66E -A0F540524597090FC7C762F19C3946274500428C3C3AAD98D9611484C8CD302D64991438 -1F7E531BEC859E6D6624ADE92B17C4D88AE651E49658CD23840C404E1E2EEA4F56D6725F -E514D3AE47AB1127EA69CE677705C603CAEB0DA31233E15ACC5D78ECBB90DBA3878F19FF -F2A62395FE3B8EEDCCBA872A42334251BB515C34F513D2FB745033E903863C24A7F8A47F -0DE02964F1D3AA92E60BEC967BE17A207ACCC4512B8E8D62E767608FEC0D4F0C6D339364 -0332BFDAA278713788075972FE7B5799FCCA94BDE4C881CE667C4B7D10F1A4CE65766CC1 -F3486E0F23DC940A93B3D88EA329FAB54F531034113FC7970DC304A20FA97FFE7116C6D7 -1504BC0FED9A1C8E617AFED697DD3FA441CB5894D783512E1FFB859EA5686F64381EE1A3 -471572DA94B4D7AAC35E3E77EC8ABBB310D46A70C5AB691B050019B1408DB7D155AD3F75 -27E8FEF1F1492E8C96C96A0EAA70AEE119B244995F1DDAC5F9E1B4EDD07AA389382345EE -2873FF17B725037B66F7B5B3CB74237808E8A1E8FA6B597F418D62D174E716C0A857219C -DD489083E9086E5A3564A8D0925003BB0935792B38A458F451CD15D8824E457132B50F8F -1A486AE2AFAAB124EB8D387A4AD23B552803298F23AB33D96547E1A028FDEE361836B59B -879F544757214D635D0AD01C8B8D8FD61B852E3F6BFC9281C99D1F360032349FB484BF27 -256B591CAF48AE5A6A1117BFB824F3850E95E75AB6FF948233763934CB18CD290BAE9E53 -747FA478BDB6E343336F58D89E05BAE9B912D484171ED576DE30D6516D68FF80CC6BC36B -62CCBF407447126E8B3D6D07DF3C187AAB240B84B5D07CEF0CEE8AAD28DEE446F321C622 -0A7E0026C64802A9A006887A170FBCB19B4C29CE1D4E089F5193171CA3D3EBDC1A1286A0 -60C648D24BBBB8791BC400BFCAC653A673F4C3A59C44D364D408B72437C06DAD89512F6B -9526FF964C3B2646DA7E34E3DC95D2408ED3816C6177133287B88C896EA7D575D1389971 -2A9D3A2E689C003CE2D5DC4073ED052F37A3183BDCE5EB3B509385AC8268DDC54A33F8B6 -865FD8D63ED1C51B89B07DFCA39914F10AE7233C7A62EC9B83A8C6E3CFDA24528B1D1F80 -3C74A108E7239456B412EDCDDD5995A6E56535CC9D47E871B0CF8B36BED4818FDD112A70 -2704D417B79347BA3CF24A1B116937BDCCACF86D8D4C544AE863DA44A29C308F740F5DD2 -3FABD1DC281D722590624DAE38EB4A119F5F271C42169287D8E37D34EDAD684EA20CF29E -EF4B6BA4D65E41E9E8BD9EF2321C2453DD84C5AA056017E7F5321A3C11614D810D0095E0 -5DA9C4ED65463C672FF360E0104F58A79D7C399F058A9C6BC6298AE226E06F294787A1BB -0EF6E1AEF499BEE46F2AD81296667E2896098DC7535E1415E7BC0C3844E308807AD7E5ED -59EFB26E2E6E5FA00B7CB6B1A160DB111AA0072ECB249F30A29643BE8F51276A0DA7ECA6 -03136C0147C73658D218BAD2A6DD880C62186178E527901CA62511326630815850E0F4B3 -7D3EF6B96BACDC9EAE70FDCE411297A167780F749BF79652EC2BDD4E620CFB45B8AA9AC7 -9BFDDF782E3B3A6FA9A0B20F8CD7362AE18479685828245B6069F437171A4678C6C1547B -5E4E998C8835104327C75298AB50A6A0D2ECFCA02D466C08669A93BDCD3BB186F04770DC -6AB7C774D2258C4E8C54D56C4EC2FE59EB24697C8BACB485E4DC203630B052FE09D83C97 -781AAA7CDDDD22804591A689B563D318FF5D269ABFD3278C345F6028127C672C3D3D8168 -5739CD11FF84E88C3BF219A41AC1C1272BE1D130A8D01EC18A83906CBC0E02FB4F430026 -5FC5E19B6A5BF67379EA2AD989A1BE64B8BC230CCE5E6782514D465C736B904F42D18417 -EF0A985121A8B155C06E1D0ED8BB3EE89226D931C9A8A0F5E80882DA98C72E346DEA25CA -C3962B6C5879B6AEA1F91DE7FFF9453F98FF1FB2805B21994C0DB8DCCB8872273BD7D964 -EBA87F2FFBC46DB4FB8FDDB5840A162CD6F6BAF0377B43E5DC9DF9054B1AF843D5A4A38A -481EB2DCF93C088FB019F8209BDD37502B8190281BA5F0A91171AE14E313617E74B751AC -AB74070193E0F231497C20484851F0182889D77581BBE0B1539663F844854D59F93CB6EB -A5CC3D2B3FCCF8D6C3758F5F333033513DB561A9E318F599797BCF0FC43391DD600A91F0 -B478A983687DADDCF974419A58F98338D9FEF2036373B5CAE2CCBC0169413BEE50EA39E0 -AA6E922F751B981FCBAA8702428C7FEEC0BAA712989D5F1CB3692F5EE3A014F716D42CB1 -42FA136A7ED845F781C18C1ECA0B6B10699AFDE08BA05393E413BFCA01C7A097933F87CE -45D7A7339F2793483DFB43A26B277C5B5D5A3A51CDDD80D0D6C1FA7D16E03DA0F7D86E50 -85D4516BEB44D0AA911A7945B244CD4A83FEC04985877D15CAB67EC734B1749D837AAE24 -1832A1B555172307301CF5D25EF9DB48B9BB1979893FF637A3C3A86A6D1688F0B45A411E -C8C02AEFA1764F5BB2423707FAE1439295E75E365785FE9B9E5C485779D124604AA59F95 -B8A4025E3D8246CE7AEB3F659B0309C77B6D10FDB120F6A4DF76EE00EF3607EF9D22EBAD -0DBA789B86339482B98F91CB29598365A5E735EA4B7AB18AE1AA8AB8BFCB207C558BDEE6 -F6865D10C8B3487D342C1F6E74CC0B13B522BC054AD4EA9EDAEA215359465BB97CEB6F7C -657ABE5577BCDBA7DD3A61B2C99F552BB70479328AD21F95C8A1F98D019CB23B6EED8808 -658742B1AF408ECF70B36ACCD4F06E4D160EA52DEF62E9CED463FB758C6121724B6E31A3 -A097A7D21B0D5A021B28FC000C68F6A4126A5418EB129AA699D04482EEBE82AFE18A7D3D -0608E71F5899272A4E614E34005578746F6A9D082E29E2F03EF54E9F55D393AD28477E27 -C780AC02449FDFE3314490520FEBA7B38A16E94A302569CFF6958FCDC79561F3F93FC71E -14E780E4F1E9DA30A9B1CFF569368069B140F5B8E67EDA15D0F25404A32362327A0FEE9F -9AE430D517AA8465C72E9490C31153E3528F08843A100BEC4D4BFB6C5E87CA088D4D4C18 -2E398D02AD5D8007CA369A83881AC0C886E72D91A48EC085002017066262AD81925B365B -7E594F3DF58C55A9DD737F2069BF951DB68720AA4043BD6F039AB927F7149DDB7830AC67 -293A70B6906135DFF159B352BE8AE55F1D03AB3BF5642CE1B1A49F773FFA1FBFCFFF851B -3DA54CC2A5BCC6C2EB2BC5CD41676EB08B727526CBC01FC9C7A076A5342BAABD5341B6B7 -3ED8A27013ECA0861430BE51B07CED3522A6031EE04E74F985F10D3776A206BBA86FD199 -64B37F1A8998F4BCD2599A891C5A61C131B23D29788719C15728644886443D12492C87ED -8EDFEC9C5620F7AE2C5CAA568333C26C8866A2E2651408D2BA3B40B68875FE271283A331 -F8EACD13FAED2342A5A3A74A1E76B74283898D8B265E0FC9CD3597CFE85FB55B56AC02A7 -55298DAC4A7471FE68872B311B690E5BC0AFCAFC4CD7EBB5326E453BB07A94843935CB49 -095EE8C7AB1BDFB71011CE6A8AB7F51363DCB97AF77C5C1CF0996F7F1A33BA929E9D32F3 -FABF10FF45E9E53A4A80B808548BF1D70383418B57C986341796FC5E1309EED60AD85476 -A7FE1AB5AE38258D917F267ADA978D02FA7F44200954F8230FEAABC0D7ED444864C91AE4 -4D6BFCB7E09DB0014B6E11FE753C6CF12592156B7946465D1D51C8FDFF1671B9DF64FD18 -0680EBDFE37D5B19B60BAF8A1081C8107C0C207941025CCBADF11423B7F09356B7D2B25E -3C8386FA4F41617DE67D7BE0C3790F853CDCDF996CAE79A0D0113AE8293426662D18E2F2 -92452A9F2D9B3845FC5B9ED4088DB9CC86886D82FE7310F2A158BD57739A0A1C36A7EF21 -6167ADE2542E5124FDD3143D353122182A9AA36A530C96AEFA8ADACF50A5B0266B59E396 -AEA8DF4FBB2AD02EBF24B49D4BEBEA6F1555B5515FE3052CCE0C540D20A82D6EAEA1196D -5A2C029DFC79E48CE0448F7A9FD83C7F107B40E55383E9656321497CB2742756FBDC2646 -A850AFBB90C1573979B32A29CD3E1C7A3350C9E1727E884CA842E9C60601092595D44011 -BB4F24E8A505EEB5397445011750A059265CF4212B4A5EACF7CEF1E922722B365987886E -481215C980DAA2114E03DCC02D1BF8B29098F54733B3090E4DCFF294E01915AF5AA3889A -99F6656F8BB7DBB5844EE7A9FA0FDB8AE67A2634BCFF57B248772F9B5F2E9CF95410060E -22C51E6437EE48FECCF819B1655F052CE6C6EF2175A54652EBC6C38F7BF60799733741CB -D7E030198D32B9956AE908436200C6EFF6611568EF351402A3EF854B0736390F7A16B7A1 -50EDD6E39B2E0D42439FD75C1D0311C8C45138AEE49A7DA2F742AE3C21E19F6ABD62198B -6DC17A3A315AA746961425A18051A0C0C5653D40F9A6D3A542F430DFE71ADAA74586FA56 -9EB935247FBF47098C4D85417C0A3C6E567F7A65B7C23C1060AFD086186E394896D1DE26 -9244085D469240E8391ECD7B219A887F01853AEF9A3191AE70D8D11FB13C7578348599D1 -95186180E4AA0C3419322A318487A712CCC0EE9954C87A6FF2FB447278EA942C101E925C -95DF648D275C836F03A4D1FA85144C7D57622FAD6BEFDDDD7AE2E931D430E29885E83E81 -4C7DF4DFE157A423A163E1372999E34A0689EF8F66EAFA66BCE76DC6CD5F3317BC7801E7 -F090410D2AB40B640777C30476CF9BD7446A9860594FEA131D308D9AEF8F96B7B8731ADB -CAAA0FB8585DBBE770852E8A76A43FDF93FE9566F81A02C2AAB4014CD74CFC1682F33686 -418EE5FB80C2DC2A155F16292FB6B5C35B230038A91814B625EBEC0089B75E7F3019490C -32BE5B78620FEC427B756A3A8085E42ED93304D80108A5D957E479933173EDF77913E5AB -C5B84133CF6B09FEAAC3A41068883696A3E2FAA73FD401E4A5E58F3F7258207159970234 -FD586D1C34EAE89F2213B28F3597EEE1C0D11CA93310C8A294C88119600944A539795B41 -E332CFAC0E578B7E9E9CDB291FAC7B0CA3C125FD3D783E4D955DA04AF2EA8B5C97869104 -84FB27D05B95C8C8FA91C84AD9BE171106D0AF6AF582343250BA953452E1237EFB0142AE -5837EBB076D5C7B6F25AF4625465CC89B27977E6CB71AD1D4058AA871CF3FC749BC4B87D -D7F75D3D18E455C67705EBD876D9073D828D4D083ECD7925822732C07E1581B1FCE4A337 -EC7644EAFEE206C62C1A64E10F0F1603CFC09C98FC36E61A59E9DF4C1D410BA2B775C44E -91001A452798FFD0954AD15D9D20823B52740716F40354E503816CDF0EDD7B6B97879260 -1204972E0B4F8E783317388D31B2DAD3132653A0585F9EF80BA68093A79B773836CD6E62 -CEF409A9A4007D3D7760167F0719F5A12DACD27BF8E0903C75A2BF680048538EF924B616 -FADD681B2E850B2C6AF69E86C491CCB41F8F9FB000F76155B651133D09135EDE439B6A99 -D4B35A49E2AF4F82A369ADAA500C873732664D50879258A9C663196BC29FBBAF20A7FC9E -7DC8904DB9536C92E45F958AD46C067DEFC27FDCB71A7A1E2391FA6B6306B71ADBF3D6EB -1544F077E38D93C9ED11B2CE62D3E94064FE75DBA762BADF76E071BCC5507244670FAF79 -F5B0E11CD72FDF68DDD6C03E6D42E4D505F88554662BCD0CB4F5A0A33CAE7BF80854E715 -8B4E020F2D7517F8B5AAE67675E7518C6A14F00938F36E23DA2172719B351F0A19CE3691 -12DB35771C4EC37F61669D570932E14B82E3B419ADBF6D0E201587E0DC75A1DEE6262DC2 -6EFB9A02174CE7C7BA8E626ED0BB8732AA3618909F69F2D4147F3018494E22ABDC63C89E -DFEE86E6B21DA05163A32415E6142528918A6936F05948C14B2E34FB4694D5F664AA766C -5FEFBBA0F344FFA065F5394F621DB9E6427EA543BBAAF77515D7EEFC5186ED5F9EC74A97 -FD1663195D941CD67C91A5217C8D5C7F1BB848C6A3BD03A2BE6A48C1B2E8BE247D02C01D -B04A994F207D25D5FC46939095986DDDE77FCBF9698D3748D12888D33A7E429AE13C8194 -D624AE196D2F1F384F2B31801B2C3FF3217046A5E11890FE1D63DB4159CFAC405D657BA4 -E47734669D01E953B6702B972981C08A0B028F5655F7C8BD1DDFE145BA1D57129CB9D5E1 -8996C0A0E01285E799F4753CA5879F862A765B6927D7AE8FB474E8169708E1D30E2780A4 -F6893E46DA3F20CBA50BC6B8A310A9BB06713EB126961C97A9F2A4393D663E078026657C -AAC7E6C723215F0FBE58AF074418AE70EC0E710C97A1CF4A0FF853A8051F18BF4AA7DA5D -5B52CE39EB779B75843F14E7736363EB213F3DA581741C7D21D8DC268063C46E97FB0B2F -B525AEC2C6F2D25E0EC43F91225719B4087A92D3A44DF7B5333C64B92862755D5D9566C7 -FFAA3554AB50821AF913213B8738D8FBEB7CF5BDC7E8F191EB3B66A8AC1DD9EF0D5FB967 -B9B1833D8C67F0B6AB2A32F00D20FA51E841BFA6ED035779536EB6EEB30CB751C81D7270 -FF877E2A0EB624FC8CB8D40830B9FE2762FDA8F5A861A0006CE1397598A712DEB751647A -2E5AA196BD31465961D4CFB2F9E8C5C20BE1C92592B3E457CDD05B11DCEF03127B494B8E -4AAE645ED3D891973EE5D633A24B19B06B0F2389FD5ECE0FC1C5091B8334209AC3DE128F -8772D373142113CD296AE0DE58B844496A70FBBC89C09629E095EB1E36DB8E73155735C6 -A4029C1CB8D935F3B563F68AFB6D1DE6D40A59A1F7092466355C7C1A5C3792353FC4A598 -73E5DB876C029895CC933DA80DC11368BB19DEA413FAF2F7652AC6A18ADD92A7D647883A -4201773313B677A7A1D0F4985FC8714CD9632C8266BF7317E557E79CE1EAFF26C5E19F95 -698799264FC251C8382158ED39E613F3BE87660A5F1F2C6F7D9EC08A901E4800463E6498 -65F2FCFAB56F971730824AED3970830FDF3E57802A4CE2DF1EC509522D0FF75EE464A502 -D77A0E9095DEAA555B6EAB3506F2B13B817B60AA418891969AB75873FB0553874048C1F0 -0A9C61105A9215572B1343571CD14FF0AFA30B040AA95AF309F412692288FF9D941CB245 -5B8FE672B4E78D6FDD3AD9EFBE0EAC354C7AD246456CE0C8166441D72762B6518B6EA8F3 -15898649D17F406FC07C50F87F04C9DC12284D655F3A4A14A3D55E80E2D3D054828CE8A4 -2E33D9963903C2BD11AC757687014D2DED8D1238BEBB7260A96D973B062ECE3D429BEF7B -63B4394A2B1DE4F56D0729A7956030F8757762F13A90E211B7B245F3E968446F5AB19621 -5C0A0F6F13957C0584357FB760C68D41A89049B5FFC42A021B1AE9217BCFFFF0063877C9 -4E884FF624D80BFE56F79CA93EBD70844BD30D51D57E19634287881CEFF135EC18ED3873 -596C7C9656B31BE31655F2630934492EE1FC3E44B9607F1AD8F4E162C356A1383AE4E797 -0D2FD92A69282CD16663B2B9D199702FD3CA9B6CC7FB12A7A0C2713B3F5E81F844BEEB2D -F3EE1F31BB05BF57377B9356B776D84711164A49AD69C338D8AA3EAC2F616E735E5677FB -D54A8140DBA442BFC8CE397B2F7F200E9B8AE8417733F90B2ABD1C70F81259D944090B92 -845767E935B2BB7D5181EF5B3D50FC31585BAC37CFA267B966DE999D3B40B2023F132ED9 -C72F827C28D41751D67B98ED61FE3E611A4AD1AB2C45F303677C79A49F774F710004E604 -0AE91BEFC6C8DB58218637DE4923CDB315E941E5E124AFED06CBD0B75484B7B9DB3179FC -5759BCE19BE50D07541DDEDF00C0BFCB084FD3BDD10C4EEC22DB607D65C29A6D78178AC5 -AEF0CB466EAE31EEBFC7B25B2AE157C69BC0747EA3222297F4DD937E1523B9864B62A666 -A4ABB9B4B3A908DA0C37059E847AC1405D2E4246A3CB9AD3B39BF3BEF16D48F769B69422 -7D6743C49F6DBCBA1113DF16B64272848F092C34103B40DC3118AF1CAB1E743BE858404C -3A9831ACE27D3DE50EC75F982D9DC1B6E34BC678A07D214B0A22AA146AB298647927FA54 -222DA2AE878C8A0FCFDCBF90A76CCE2D6CD623818121598C31D0485C900827C91AB17ED8 -3DEE367788418FA250F9841DEBBC95114D82CFF93E8C6164C65CED77D5DDAB4F65FDF19A -26FDF57FC3AFB4F4D155B1AF747A668724F1E2FBCAB941987A17D4B455A74F4E5DB5BD62 -496B197DF439701DD993EB50F92D161ED2E37170EE2D1DFA169C2AA43752C765FAA87107 -3DE44D8BAA93E6511DC365B68157C81C8F3DAC8C624E58EB22CEEB668A058E23F3DAA93A -D05C5B1DF3DB0C88D6FD40113A851F1387E9E2EBD2460EB7FB642BDF4CEDF1B22DBC51B4 -2DD058AEF2CB32B20A30F1948A363458FE07B146012FC3842DE485E687408187A89B93E5 -FFBE019CEE53E8A46C3BD54D12D35DD09D638B7033F0E8B48CC29FC898128F2359AEF423 -192C75DFE9EFD8FB5CD2ACD71811F5B8BA259E9F4179CB1385F85C9B1CEDE79C47ABE400 -0ED992A100198FFBFA4ED40B9B55FD2053DC49A2ADCFF0D18FBF9964BB2976D676FE54E5 -5051BF7FE08C5C70E8AB9A363F98DF09D22AFCFC8290E828CFA5E965574043B310D9A570 -98EC92E2876DDADC2AB52B05564EEF2A64AE2327DBD80795618500D96F296E178CEB3042 -F1BC49CD8112A5A373D6A72A8248DF6D682245A134FCB990F9FAB1CFEE41DCCAB9CCA831 -2B833D6D21BDE04BB26F445093A8C7334F58F3B0FE626C0832DB7BE2EE788357695F3B49 -FDF2B8225E7ABB6FF7A51EA4F03F3F4CA1BE00F70D74416FFAC47C4A8480D12FDBDF2450 -5D53A882988C5747FD8729FFD263C88749AAD3FB70B064AF33BD21630FD5853FC8EEBC7D -91CF02EAD8C57CE136A4B223AF4BAF7D7C08BF31F1718318BBFA9D416594EBC59E8D0BF1 -A2AC0249835FC1C274065D9A28D0B8D751B9677FBE7D970771A8FD96700F00A13AF76158 -AB7437F5EC667D32D8287ECB8A1794383896EA4BD9AE047EBE471A9500E94C3B9EDD0AD8 -24C9D9DAFD1F058929D21244D81A276712454324322A3CFE36FE1CD8172F502F427322F8 -FC8ABF150BF749B132A9E93FCD99AE015F1D75D923F9743C23F0F2264ADE0BD0AA7C1C8A -4BDDEDE18EBA55BBC33B3C9E9204B1418D7B1CF592A5707805C13D62C284B991C817B643 -00FAB2E0457E59E07CAEBDEA55F1D8FC9F6938509E1A11168539B92705BCC03115D29137 -45D24D1533D6988DBDC21795FB59E25850B74A265C47FF6F7A548066FA6203C503BE4E7E -1590689F1A4F73B7B39AD4ED10D89ADA19673655EBE215CADBA0FBD85DF65326ADDA0305 -FFF9BE785E52F0797A345F8A49A58A704106EB220F88F27180B3630AA358BBEE6E27908D -512882ED69166A628B32F06FF47D9D05214A4C8728305DF287A48150F2652EFCB1B7CB95 -AD2746D2F4C10847800E9EBEF69188B770D583A079C79DA8D7FD9349E925E9A9A30F2D8B -35EE7115158B3B353AD7E4E4E740D93289F2CDBE6A75E6BCC8A0A3221CCE578D3A974521 -9C418768B4E332783174173ACAAC86FB61F81DCABA0F46FD3B90D46BBD8F6469C30DA380 -A5A356499394FD428F7DA46DABF232202A8A293B2DA79B4933D0790630A57DDB232E9E25 -4DA8C370F1B3EBBF9182C71EA3BB243DA9685B9B8C1DC22D73B3BE40AE56B08716D1F035 -586556DC0DFC07AAA66F5B3084B7BF87D0AF89BC6AF8CE1CB73B56A39515D44DFADEF15C -E018E31E7B4C61B109A6E105505AB97FB8CD2E53D37BAA3B1C2EC25DB055D87245A8BE47 -94A6E03B71A5F1D13B6E5A7E6C5594CAFC6E303CCC61E01516262F9BCAC1B745EE5B2AA8 -C0E8209C20A1EF19E93222C31B95E4B4FCD0F78F7821FE995494A98BD756FE546700A590 -FFB496FF6852E53470E1A5AB253464BDC12CFF3B5DACF8EBB0B99E822322F21999337A6E -5E849866939D87B2F16DA93B9F8CA7C83BDC49A4F8C5EA64E8F8A1C00E0BEA534C499C84 -4F39E38A06EAA1102A1DFC0E25643EF8A6245427D8E77EA2AC7B352463671EB6DE8571A3 -84D98E1B35C3213F13132FE76D03AA87E5918FE48CBCB8A2F3EA9B1886BB540095D97BD6 -188DA701888410081B8BF49C7043BD8C48E18A51042E92B542176964E292BEAA06E310C7 -FDBFB496D6B7BA5B07A1D36D516EC19C37E1DD06B9F6F85BF740D26FD0DFC09ABC3D4A11 -CEEC922B651C147BDC3124DECBABCC8986F5D48556CCC5AF38F7EAAED9D719B983DE7742 -67F8CEB3302B8CCA7DB832794C3C4F0156E72BED47BFA0F7E4B25E13C0222584601BA304 -FE38C5E96D3B5E709B6F5FBC623FC9BC36A4C4E8D82452D260F13186EBA95EE4DB5D4ACC -945D0A3C5C1800C1D3198D509F7B8ED0A0E33612E25B9344F1D53CD949CF9F65463B7C58 -4E12D78D3E6CF003F9A4185A37ABC6D5BD7F331CCC01540452A36524DBB34EC2FA260C07 -824D76439B0059A8127F940EFC1FF165005123C6B43C9700034D5AB9C7FA1AB62E9FD91D -ABDE5F3D5C03A771B0554ABE655545E133AB8C230517D51830492F29E86963AA55E9B79D -79013BB52D623E660A4D356C293233B79E7263ECE8F8B6EB3E56C82C2051111F49D45D12 -5148AB7554D601BEAA3037CDC84ABA8825658A09C008D19163FE5FD06D56D1A687EBB6CB -1C9812EE0E765F14077116182F67D3006048F8BE549CC71A354048520E66860A0D9350A8 -864ACEF55EF91E17EFEAB4D6266C9BAA1D6D3D309073C9DE287BC0619D7E37EAAC4B7CDA -D320D993B7B8F387FB039AA7E1F84AEF034E7845A1B1B5306AD8FDA2834B59F18E6F1A09 -66221CD9531258458E428EA237FCC45BCBB9C5DDE72061FEF2FDE731706A4C92E5B0B255 -49F60FD845C45D940B4C5A4F38740A40DA356A56B8D155477C04A26B747941180F6EEC05 -A5BA892A0D8E4638A812BC405E2775EC3A2D0E3C288D0DEBFF53582FCEAC6936C152B8F7 -6F9D556F2474BF5ACE2B63550FB94C36E29A8501CAA4C22FDCF908C62012639ACAA7619F -01BF96A552A662DB5664E1DB1A4FDC4E5E9050088D730C8E1F387CBF93619952DD8E23B1 -4A385AC6C222AEB44127DA14539A079EB16991F0CA2D851467828C23A4D524CD5AD92FF8 -0439F6F47D703E9BBAE227628420C2DE818A9D2A6BF085B5262E026C7A04ABE831065F31 -68772805AAA986AD811CB78F3FF8A0FA7A211127BDDA087C1459520F9420CB06AA4518BA -A8935A97BB88A62EC76AB2990D8D414392E31C68A91E9DA122ADC8AF3BF4CE550CB1D22E -B2DC916E735D19215C489BD7B62B842970214B0D809639706303AE7CA8E270ECE748D283 -A8370B4F6A37092EC768426FDAEADFADF8598591AFE55984ECAAD3177973A78EAD02CBC3 -F7DB13A7864EC1E7A68ECC54EDE88E7A62A4AEFA9DB238BAF1A22079F23930CBF7CBE82C -2B98E37F28A47054BD47B48637179F4C57164B26F4EE0B484FC8692AADB29EA0C770C789 -8FDC78DD58B009B4901A678305A0DA4E89B2152A596E13FAAA822DDEFCAA30BD2FFBB1A3 -5DC54BEB87BF96E4C3D25334D86761D7D78C50D71DD13BEC2830A96761CBDDBFADED0A3B -6A0EFC34F96CF540E238410D22EE85AFD0AF104A624D3F9EE5F04D9D8805D7BB502E0223 -AFD0CE95C2B32B30030AC7385BC898C282A5EA204957853640D4BF963C97540744F4D888 -72006B2239C9EB3390FE16B4C3415F6EC97827597FF791B3D1B3BEE6D0329604ADD0C131 -6B24B8544ABAD72B337F00B8FE300BB4EC7372EFE3AC8156328238B94E66E1EC7CAEF9B4 -D58DED07D9CC777719E2C973EDF779310890AF183F94254B2CA3277120A03222FAD58E4A -ED28AAB3DA49B5ACF246666A597BF2656CE2960FC95BC24CEAC5431F73074538B8715071 -FF284765EB54207CA22596B3BECAE73DFC68A4F9A287B8DE7DFC27D0F860771239436FB2 -587B07C1FCA6C74A020A819701431808AAB5B6291992D83DC28F2D943AD0DE2D94BEFBE8 -A15AFEB7057DD4A97B4C172CCCDB490E6F9FC265636A35A2DC556648B5F9F80D180FA320 -AC69A0A61A3954BCAD612FABC12D486A0F2FF0457073F61F2A74345B1ECA9DEDCF26EAD8 -D02D3F4678C7AA82907721A828984C6196464440B2255DB9171706819E0BCB7169EB6722 -912EBFDC6CD488FA34A5556F28D2B448A7187B1E15255202DC9DE4F609682B0B6D2F61E0 -4EFEF15CAE39FD3F6F7B32F226C759A17E6C611BBA79D93186C853BD59D73B19E514D770 -89CE29127F5B36F1C0D661597A6FBF85C15307F624630DB6564BC755145BD19088CBA598 -86B29328DA2452957E306EE08CD942AD6FE6697231EB43DBD8D37B4ADD0B4D8947A057B2 -1D9A133A7DEEB89C1D35B3F49F803700CAE8774A4F9BFD45CE309A4342E3B7DC36B6F76A -7B51A81B70E038E3E4999D6EE027DECBCA548FB5F4DE4C49981D4617133BB3E0919C4778 -B80894FF4437120F1035520C75F882591EFD511B6F47C166C7663EA2DEEE335DB1A3106A -5FE0C49565C2AAA0BE977DB611B07D38DC41E6DB8F959798286DC0CE835CE64459558D4A -20DF59F2E8A63E2DB701619617CE4DD55E82EB396D5D701B691533D0B20C3A0C20F5054F -72EDE3BDC2393ECED94EC52C25A755B58F4E2596702FCA68B64DC554DAC85CFD99478701 -BBF2A47966CF72E683B5934F0EA5DD86F35B1556026AF02BCADE75ED3C579CC1D9430956 -9A53EB8ACBBA2551B9BF06594F66229489319F5A5A94E51281FEF7BE86AF12D8A8A1CF43 -04ACD3B27D6B9A574F09E2C41D245D8873A78D1CDDF4CC88D96D9F714FEDE70ACA30B83A -797AD3DDA7D6E52A5AF906CAC560813DB2226BA5BBEA60932640ACEAA2E7B2D412068A2E -49FE781E2544FDF8C762D947871EAA0DCFC183676B5644AE02DB3CAFABFF140BBF755966 -C9BD319925746E320AFD5B157C55E3EDB4D0DC3FA112964D68BE2A5FF08E8B31BC9E510A -F6CAAFE84C0A103117913E2C9ED8FEFF96B941AC14AE07B1CEE2308E36F617DC33CCF32D -3A52F4F6561A784FF2C1144625133FA8E30F7A86E82F675F1EB56579077EF6AE086BC2C0 -B389CDB5C5999A1FF3E51BF766227A03DEFF391312065305E5C3BFA97FE7D5E2ABD0AA7F -609D8A0E524F99B416172F7A0D174196FB411F79A7CA6F8694DF4F5DC48BB58F39460131 -D47167AF47DD3A6AF1E12C75D947F4C130BAA07174DC577B49726123F34FE9C76411FE62 -8E354B43A5F54BE0F210C7523BF018DB36CAD6DB8063F14FC3FD1B4B69706D45E615C3E2 -9F4E1FF8943FA55F1B9B4411BD0DFFA260664CACF3C2C3D9CEEDC1274B71805FEA88C3EC -E5BBA17D17E6250494278450141FD4A514CE968C33093FE07E64F168388D141E52E46DFB -1E2A9F4BB5132C1E6FE25245FBBB3B1CB7CF24FE6A134382F9863D4683AD93338D3A6726 -BAC2C4174FCF4A523453EA28F2095CC1159AE0E0927380C93DE4B979E26D56881A2647FE -0C46D0B6B50B0CA3750D6974A8DE149E252ED68FE33B26E2F04F06FE6C3FEE1E7FD72C05 -135DA55508F10522A7A2D8AB07220E73283F978B50D75FF36E789094CBA1A8E342428B89 -3B9A664939AC711933A2A1C425291A9E95C396879EF54BB6F3DA82E88CA8C34E9CDC22F1 -BAF6588CD3C54DAF5A7873501EDA6A25B793F219D3D229F6A028D34A19A9ABEFF2AAE4B8 -E62A05421D9CC0F78E2709BEB6133A0708BC174F5D745A6CC53E6DEAD27A1E6CD77832E8 -87935BB8736AFA3736E4B4313D6D1B7EB464A02B0C6DC3BC7C84630C2E9DD020AF3F6694 -90BB8CF0185DF9239E0D27B20FBBA001DA7C30F0DAFC8AFBF45C02019E4AB0AAE458B083 -1051F65D0E398A75F52FC3D617A25CDC2EA1FACD7113E0EBA0262595AB5EF65C1D54CB71 -BD87CC35C9BB992E0A63ECB8A1448619148ADADB906DB75076E0DA42BC6501F6B6717C62 -71E3881CC2D6747D0A0BC7B6B982CDA89E2B9D9870C96A86D3A4E1FA0B04140131F302D4 -A36AB220399A6E551FB6051283E405556A1591E402FA9F04B87F1E3C2AD60DE3128EBAED -2CCDAC808AA1CC5E64052FBCDC1EC710A3551B3AD6E21D20FB112543EE0DE94DED4DD8C8 -6526F470C83B1DB3536D6DD8C8E021B7A9A82C23A31A6F09E15BFBBEE0A8971B3F471437 -F0873BC669016F219A728510C712415C515D3AE02BAD8467A1E0D911448C0CB280C70F26 -14BC2E52782C1CE5E79C783BF880D1B914E44FAD64E140666274D68560DECA2194D70377 -4EC76B35669FAC269409712901F0D3555B60175AC7799E31CAB70D06EA8D9C359C9DB9B6 -A3E02F6923C498617C041C28CD7E57486569429C3E4C89944E0EB150813854E3C2EEC4D7 -37E2DBB99287ECE4279F3E0D9D8EEFED11867F0E05E40DB8858CFC5DDBE873A174D756EF -5D5E0D5F251F0FC0BFA7F69EF8D20E34B1B3B5D45501DBDB453D82F56BC6271C281A8A1E -7D0D8C9B920256EF07F4AAC8FE2189485089F52D024BE36045E0BE613F0FFFE13D223B0B -2478A20B98E76A783A98E7AFC642AC9CB333D6D39AD4E08B2BDA75686951965AFEB5D211 -57CF3DC3B911A4E45144B3D9D4AA4CF13DA039CC95A9CC8DF44CF17F3D09A1823D65CD4B -29E2408B1C3FC6C1F3980378E1098255136F0D4BF90D0C4C042F1C86D40BB762E72C7EE1 -BC530755416A0DAC2B3DA0E7BEEBE7AEA9A39825EDEBD6CA316FEBB14C701BB7EA4F7800 -3DF2462E2E429FFC3EE8904D963A0017A606EA0E526EFF1E60BF825B2ED9CB42678B6F6C -E55A893A047A4E5E38F15349B777566334153DE574290C6043694C364A3CFFFD07180F5A -44CD991A0535D13C91FA1134BC457A455022614F3AFAB921A70603C47C96B5E466942AE5 -83621BA1544F2AABC4CF7C6E8B77F52FE39F5798E2FB9F180E3C86ABAC210C57A0226E38 -75885E3572BD47BE016C361E84754FCE64AC3345393F511C99BBCD70443D497D575BD81A -47373184CD09ECD9F4A55F1CB26E921A2B8BDDDBC8052EC0B8CC812CCC2353586B0451B4 -791EB68293CB3B4C41B46723D2F138D5BAA8AA4580A5660F0DD13F25BD665D4994908BBB -74182C783EDA6C5187C32B7D5DDACE8DB1571E7061A063AA56DEE4B0B6F5544437417E0F -5F07EEDA1263224E5E44B83CB057BF54725859FED215E5B528BEFCA470C8527F40A09AE0 -20CD42E31306D1E9095137CB6E7FA08191BBCD7176B87A372A97671B9CC090936EF7E4E7 -85F1C6B541387A701828AD82A958C34DBE426FB12A03AA3BA2C97535DA8526164DCC150B -67442F7D6765D16EBE7FAF904F42A8185DD30DE284916705D3D8826DF1D37E668F9669BB -343D3200509218C5F929E0DFAA7FE3B79646F62835C808BAC29CEF8CA6D8363F0AC7291F -E45A85DF8F0B9FC14C7182170AB1F51D9D9C33D8D98713CBF0931063EA95EBB031904EC5 -7FA914B7D7B254C3B178E174F807269B2BE5F340A3674FC03D7550017B70C0E53472442B -3FDD4D1D45437DBC5AD56D690D9098D9DCDB17AAE217F73B54BA5D965EE197EEC8823FE4 -783FB5A4693273C7142728AD3F78946C0A8B7D3714DEAFED570BA2A9DF9240B61ADA22AE -3F9B21FD1D73D4A474EA14EBFE6AC82B068D08EA2988E7C610EA5097B62DBECEDA5278F7 -27824E5BA9EA442B328C3B02E03C88511DA9C72A271027176EAC2C7B6392E9E99D8B42E1 -2CDD9991E43099C503DA5FB60E5D4F8FD3CB67FFAF46A1DD243D9DF13116880E727A9271 -BB778126C01AF95B75137A0E3831BFF257CA37DE0B3B4DF3C983D091F09519365B2B812A -0B6273D30B01515013C73AC3B8D9C4520B5267E734651E013B8002D09F3B5BA7984A588C -F6115DC9EB84C1C9AA0CBC9777D8923B3230E0A2963E08743E51CDEEDE33F7DDB10AFF69 -BAC8682A2B0885B8059661599B805B9684010A3B6DA56E23E265BC209158D3ABC69BD6C7 -6B13BA17F225D990CF0A42C1A37A5EC523FD80E60DD542322B42202D77F646FE34DB9AD7 -9908DF03C1C5C351E542294D245E1098989BCBEEED311FC5E7C8ADD52E52BF6F0F1331DD -7F874B30B0A16484EE328FEBB0CA559613500BFE6994EA8357ECAEDB310CEA3235A421E1 -85471BFDAA649E3CC9128A0409C454B3C951FFEFFE648F1ADAA14D5317929411AB7D78F2 -B888B63481346F415314E1967919783F8D143EC05B7BC2D5D9F7315F41F0331911FD0018 -44E301CEAC9579DC227E0DF9FE2D217AC8D7B014CCB01DE9AE852AD42FAEF07CD5CAACAC -324F3C00E330939FF4B5B677DA731FF712A6F8A10687D29A296B0E685A4F52F3009A4608 -8A935788703C71B584A8E855683278077851E1416171568CA50BCB4EBC8DE6C952FEC45D -37FC6EA2EE7E151A96452C332221961EAED2B6262431C4C7BFFDD59EAEB9E3DBB17C3EB7 -3D90F0F872289F8AC482B4913C0A05E698C91682C37503A38C841C25A8BA855E7C1CD3EF -5F1E025E58B2EB4599D76DEF57A60CF24E814B3166042F8084B08711D1C68DA4110BFA7D -E8D3FBBEB3DE32CD01E237A403F8581AC2A015106AD81FA0DF90301D6BD887631A83623B -4EEEBFEEDA012BD6C504B450A5F43137757C2EC7DB3662748B105F8B22EC030895E0F607 -5BBBF246422A7D0D6E8953CA66170A8947034CD6EE37EB7BBD0D9F02A538AA0F3D2D2076 -8C307F9558765FA715444282C823FFA3E95640778053A383886551D4F86D490FC156636E -A5A3BD258674262202F4F76746ADD02FE0DCCD540EBD60EAB42D01FE252DBEC93598D6E2 -0312F2F4704AB003FF956FDA5C2A88F716A4EEC93503FA913CA019456AD0A8F6368CF6E5 -AD1B7CE1BB20BF0CB453379DEB3423B0649A6380ED7D0B40768730D37A9A98B2339852AA -286809BC86757FAF3DD54C18C3CDE9E72FA874BE9D82655E0551DAF13FD665BD14DC7891 -12FCA109A1C73D4B0A7F230E2F9512D0DDC8029983A1984406A5F100567B88BA186329B5 -7A68539D43F67BE6263EFA278181688FA595ED3BC7C7483C4DCDDFFC01E641C231EBD842 -D21B48105397FC32D6A8D555015760029C2CAB13AC8D603CABF46867CABA01A99B95C92C -3C224E8F59B3B327A01AE685ACFE6D67F28FA6663F6E47466DD0A6665592546D08AB7C5C -EFD20D6D5115C775E033E0DAC75F2C6411D999DFB21172A8D0D3E427F768CF7535320DBB -6053BF3A17536AF6B2C00979FED18A593F71146F9DEA8B31639AE0586B24763DF3469507 -3D1172972B5E1CB82BC46A60ACB82FC66B05D9228C67F3FB25E2D91FD11B696C9FE505CB -9BD2B2D85D3A22595C338574978048050FD13A59C41B3B0CC2868DE4E017B53935793DAA -3F6DABDA50B06F8141511C3D5093069CD1ECADB90C42431B5188D912A5DF033B633AB3EE -67E4943935EA094071001B6F8FDFA00C0E8415358DDA77F2DDF4F7E2694CA6933C804849 -54A1DB8B5B6FE3A7A970DAFDDD1107FBC4C596C379881A6B148D21733CB2700FD9F4FDAA -6DC49C40A6675C0284FB931AB93CFDE9A94FFC23BF259230AE1724F22485864833541367 -D274CE18EC890E4376F48144950FBE566FD285330486F5F23BAD7AF0A636821A122A4970 -35D77B580B5862D776826AA3735AEAE9D5D7D04C4582778F9B0F713A906618632FB653EF -4FEA9BD993D11E0E51FF3A3DD50EFB462C4251A42D63863256FC819037BE597382C6BE60 -955D060340A268DCDA514793C845FF10EF0C72D6FF27BD1858B49D50516D48D6FD33AF71 -11CD37F5F7F0C4A4508BE16B80565557D025B529ABDAA2850E4EB6D8AA30ECF49B5D18CA -AB0BE944E0B95AA0BBE9F4CA91A56FBD41983A6703FA0FE415171CE8C11AF45004FAC49A -4346C206EBF58FFA74F22D21A1E069AC9DEBE6D36156C32E74A4ECD8BE2C0A6983D404C1 -07DE0A75C732AEA64C88389E15D474F8C0E7789B8707E2F46297012F4F51D07A10794D03 -195654BE0F7DF9A4F5F102C5A68CD37D129051620F807301FC8BD8252B4CEEE5EF78E803 -9D41B48CD3262419E9A4F93B678B9F471F4B221E7D165C1D2980CACA79F4E549D2ED61B5 -02E583516547A49E2804F1149855D77A0D86F3B1B429C56523FA773FA9452CD5B6340E64 -B04FDAE2E5B6B234D03E87E2FD39AFA134265000F7A9506F55505874D0B584C504DCD29E -CCCB8D71485AEC7BC34AB30453AE4E3B2720CBEB6A9C9FDD7FE7DD565902C6BF2118DA3E -95595C12A7744212827DF07AC5AA7B1E05D42FF38758A3C3105C5F0422030BB0102A9BEE -0E07E20AA089C118908BD7207E686EDC8FEC0580F7FDD106F202676424FE815EAB287182 -61FDE8A17F2662BDC02C0E109A020C57C8F37C4B606FA2AFB8C0993E2CD1A91AE5BBF801 -390AB8EB8841FEB2B066F565E497DECCC37DFDC2581DA9AE15E8C215DC41FC92AEB57757 -E92E18FBFE36E0E6AF6887671A9578C318C7FF50178B32CC9A046370946ABBE792708330 -D1C370012CFA2BF4A5DF75CF019ABD1882566333B0E637B9935426FB127699885121D83A -4DB8A43A648A459C83D623EFDF5A60F11ADD585EFF0579C91F8B5ACBE889D4993BA6FCBD -64318022C3310DB5CE4324954D78F06ACAA1FA4C8C4120DD41DC4EE2CCA72CA36FCC368C -A31323A17E4CFB07A0A02CA23F8518CE8ACE1548FD4B67F0A5C414C309DEE52E5327E09F -4B2A07EDAD8A309C54DBCFE3A59B9BFD3174BED78566F6642916B5B01CF4DDABF72BAB82 -60EB5945BFD987B96B80DF607C64747F5344A27DCBF4EB9797BA5D17B7635D0D936833F5 -0AD01CF4B9FFC273C05AD87745D79BA436590D9B50988311A06EAF7CE77B5492A542ED4D -129DEF268D2BB87D07DA19ABA6D4F78874A0A6960C9934670B9EDC47102EF929581A8698 -A9CD8F43E4F071577730D9D18AC416AB398124D9EBB91AB66A4CADBEDE5043EDF627CC88 -C68DED934ECCABBB9A7FC34DFB1B65ADD724BA67DAAEEBD04679816733D344635D997125 -7B2BA27D1F44A7D7E48F9C9A4A412030AF12FB89B15B07C3B18F9C6EB6AFED69D6A9951C -3C1563481B46E4AE5841D88BF8C64461CEE73A332AA07C89414B4380D0CFAD8D61C72E68 -6B34B0EA660EE0C8370A99398D9B0166F8A77FF24BE1AD496B0C0E8ED04734527A5A8C79 -64F2568C9B00E98F7165D0594080DFFF7CE5FF8C26097FAFEEE33307E282858726E675C2 -4B4C31AD2B5B1B855B73D553E77D3320E4D88BEFAB426B94EA33FC9AD8FA81B6636CD4BF -FC2D11BD1F52BC5BAA38C072AB771A9A107554A327EA10452F9C7624BC2DCD6DE2D43EB7 -0298DE357909FF66BE487285902388A024E120D587890FECE3A00376884947E1E6334BBD -79B4774980E8A110E7BB841F9289805FEED0DA0F4D4B8048F190DE68517EF34963FA1BC8 -F8C575012E01C280B647902BBC2B80365E9A66E28EC8698EAC50CFDF1C6D113827AFEB9A -45434209C921460BFF483BE373CAD65640FB3A8B7E5AC12CEAEDD5EE1B244FC42CCE85FE -4D34FB21BEF3EA9B959B6DB1624F05ACA4602052A78FF842BB1148ED529A460DCEFDAE01 -6A10B5B3C9D11ABD14C53020138A9624F0DFC3B1E445290EDCD7F2DBF4BE408EA8EC21D4 -4D9DB728B76DA63AF62EB7F89DC43144028D1098287566586F195B124B89799E3881AE23 -F89DD6610230B09D6B8BDE79BA206B87BCBC18DBE1BC155862D28CD742C38DF8CC906233 -09F933D073491984DA9D927635800B84A1C2350CD18D962DC9A2A235E2443F5EA72DA9F6 -45BE3240B03AB4D9D95C3B57CA05FE3A7011E12B182AAD81B426BB17D44D5C1EB10959DA -01563CA2260F6010ED7D37609ACF759EDF8C044860FBE3C89213394F03A309C04EE231EB -FD84191ECF14A020C7A4D7BF855213D927DBD921E2324BBABA6B7A06D69B4271C66F4FC7 -F15DD52ECEEB76C4C97A85CD59A38E1CDEE2F78354B0B71155227553FBBAE0EBF0D625EA -34B78125DABA3211CA9CF1D4AFA909080061588AF14CB97BC4DCC1E1A0BC04A40B107318 -1CAB643F064192A6074D3220EE050DE3A56D1558AC0F7DA0E2844EB48999EE9409F0F683 -92569D7E7DE78F070FA44C2E8ECDB09578598508EF3B97FA2B585A163EB540F2E8290244 -D60006EF558A5CCCB1D40CDED1CCEBD665A320CB82797F38DE80CF0DA15BB0E13B8CC180 -9D99437A5B25041EF68916C6E601B0432A2DB84C8DE1EBE4AD5A3EE34249E47CDA593424 -7C9E3F3251C59AEEB48BE773A6D775E6723F3B2AA55B2439CF841E1C729153B22550BD91 -F272DFD3EAA1336E94C8AEE4DEAA00C772BF05FFBE35BDE7AE2A0EAFC33A71DEC72B3179 -E4CE0DBFC083372451A7006B32357B94CD7975ADF21D5977D10444C80257874005F8A02D -317CA3C38DD0F156F191F88A8BCFE274976220F0D25BA30DC195F5AC0CA478FC1173A7CD -2A93B482916358E8B0ACEC25E51F975E210C895E1200FF2D29419EC300BB8284EACA5027 -69676CFA8099A110D1AA50B5A4523CBAF5FEEE90B605C5CADDFE233D235E008667D7C0C8 -B2BBEE796F1F78F4819A201131D4399FF2CC2D59B05F923780E775A9ECC284A68A2D76E3 -65E687530B96FC564DD173613D190EE8F1E6BAFC238FD9642D356E764860855820937E40 -44A41861BC40DCC84BD6F9969DEC343DC6F3F7C8FE9342793553B5C335CEF67084B9F1B7 -FDC790015B7F9D682EF547C986CBBC0606E0DE60E95AF386CF4A475902C58FC382C5A35A -2CAC908457D5B69C88E95BCCF40A9B12012DB3F548C3ED3A549BE0E5B0BD17B38022F2EF -2987ECC4A6EA46BBFAE4D6B330C3FA7DB68F0695F7A52C2E9BA1B97A6A2FB6ABA4B8EC07 -5E01D2C021D66FD6E47A4014E5AB39DAD64DA85D3171D7398BFF397E371C483283854453 -4E7815254A0612E9B79143E83555FFAB3438D5F56CC1B72BAD832D3F03F49675BFF38F9B -8F1A89D2E739F07B2FD36BFEE46B0F8E22EB6F23710D0BA81F3B421E9691306ED6D87F65 -4FA8C6ACAA3356D8AEF5BABD5F6E6231E64A772C550212A6EB17D9EFB987D124E63EB266 -72F2C1C00DF095C829BA7AE2EC7C7C26FEEEF5C7AF6DCB1C846F6B6DBF3F7AA0585F6396 -0A27CB026B55B06954B296E45841706AB1D655A5EE4B774A336B137EEBB2AF2F958123A3 -A9649E57BD61EAD0FD1B05C16C1AAD5AC103C0CB1BE0DA4BF4DF83A7F47814A64A11B90F -B0E449D75637E8C8366346E6839AE374FA3A2CCF4437F3F4C21B3649E8F25499556971F7 -210B267ABAF315E8B1D2120AD9D3110258BA296B3BA195931492AB8A28F1CCCB4AA607D4 -7DEE5BF92546FCACFF9D9243B8941D011F272431B2782CACBC99D9BEBC4CA43C90864DC8 -4C800605BDC071902BA524866FA1D98C709BF9200EA73C2FD8F41BEA226F37947CFE0B83 -1BD00F2237535653F63AAE9A6484A558FC74B7475EB0D895E62344F509D216A97B96B466 -24B8C4CDDE55B5E76D06AEBF9877562210AB2113912A2354E60C6986EB1077526250325B -B926BEACF55EB2D98858849EE63A44003D3FBDC186315D8AEF57F8F829EB61C4BAB6C9A6 -E3626F0F3D7E6BA066E31D3F322D060AB9990A619D26BF75C261C69F2B88A9C28C70007E -9B2C08AA5E8F73D00BC882F3680CC9A78E6D70DC8884A65D53E86B6A4030027F7D403CD5 -6106F3DAACACCBB4481C81FED3B7A711B04F016E18330367108EE6BD1A3121A9BD33EB35 -E824BFEE0D128D00208F3E1C860CC99AC8174444D75DF99CDEB40EB09C20355DCA68E13B -630DAFABCBB6BB51FA406C924F40FA40E3FD6DA0C673DF1A2F695E8EC2127D51B6F034EA -E96345AF0294778C6BDE553B2A9578927C484B51B4566B120F8A074C52318F06033716D2 -563658FCE1FC71C655D3319E3DAE16886B92DF451714283F5C1BC3FF960295B947D0D3ED -1A101F34565F24519FF5E7764E3C5F2304FC8F6F313CF6864E09FF079C93167E654A7FD2 -4F6550BB972F93C43FB9399A0E82D58A43B926F454F38447110891E0011904A776271E60 -FC7AD11E984AF84FB551AE9E7CB68466AF9AD82FAB71590A265A08A58C16046254ACB03E -98EFA92EF2EEC42B4733B1BD9FC767DFE45D4E74FE31B3EA3588746D5A6ED60F874E7C00 -88E2E423BF78909FCE19952A9BF46BAB57640CE2478015C7137D87D722254B3A70D848BB -177F0926A2E8DB72506A41C381B6C9D9F4B22700C5AF711F5EE5C7C1CA502483DEF489EA -0EE03CDD50292460C7352EA9B5B4A50FCA148F7FB3191432787A1D4EE5AA9080D95B810F -B13F5267F1486BF1A49740C61E0C6C885E3C5B9B28534CFE99F9C656CBC3500DFEA2C3C0 -68DF8B93243857CCB6D50EA01222C1CD2AC256063A27F29969BCCEB98B677F10FF3041A5 -D78B64EB9034C4D2B3EAB0BCBCC6C3A4E3F9F8EE0BC45A934C97F79E3ED5B9889285F535 -7B5AECE08D84E86C95B68CD40E4D747A33024028EB6D6CC22D05306803C5120BA4988696 -F91F4576E3BF631FE32273E3618F378FE44B56431230AD82B5F7FAD86941DFB3716D4598 -C9B3C3B92E0839F583D28577946992529A301525F1D784C6E8D21999972522D79AC7072E -DCE82D02F952750C4EF7BB486F202D22C5117C4AF3C61C182C177BD247A4F58A55764371 -235A5BC43A4BF5F2977EFB2B293246BB9A55B4E52C4CC35F4C5362395B69B56CB8E21F4F -230A12741F10EE5869AFF80FB230EDAE5BACC982A7B715287BE10A2C77CAB7DCB986463E -00C3CF475A746BAAF746FC1657BFA756A3EF1C5721A9E5129AF438C17CF2717AA26F3B55 -6E16EC7012EA595BE25CAC595AD380BDE9357F70CE740D44CED744EB001FA180E54CEA76 -A0F33436BEF0173CFBE3F450823F53702405E39AA9AE532ACB2D87F94B89385941573FE1 -B00E96F44433409EBC3B007A2BA87A026E9A99AB844F0826F837CEAF0ED515B75FE083EA -47AD5BCB8DCE6ADEB4DEBD9DDC83554336FB9B23FDBE3E9812E8D388DA8036B2EA0F0544 -5EE65BD22CEA0325423876C76D30F77443A1AD4B8640369327DCB70945C94E625CA480E5 -D18DB76FF293F7FB61730A67DEC184BFCB2CEC8A47476E40533B00EACA213C3A9162C02F -229EE91BAD96D2E7FC21930BA22596037E2BAA35AF874BDC4ABDC9DF92F2CA2CD38C5626 -4457D579CCA2C2D9A69E72B46BE5B19789934A526195CE74263C4E4EE29AA0F0897E1375 -F9914C3E39CC8E254031F58F1618565CAA96AFC2F8636856214A86A5BDC3B48F05FB5391 -797D5A8DFF2793D1C1346E54C7EE0E6170C82C5F826C58E46902D7AE72F4725410FC008A -D1DBFF2B0F6D269D5390F43663AF29E2138582F6B223C0C577428E2E320AD6E2D8EC8F9B -28F4358A71590309F5D75F86078B95A66DCDE939BB502BD0298E6690CC33832DAD2F7133 -EC7CBCF9EAE3134D91FDEB4BC8C98AE7C8020BF3B3D88D8F207880958F1DEFFD714A947C -1E2A6DBBBA6E150EBBB7576D612BAEEFBA83E85F20F4B5FD8CA126CE2E063A87005E4FC9 -4DF19C2EF01DBE2B45D5F255152BDB78BAA8506BA36190DD155AC40D4448F0DBB3A0C0AE -FBE24ADC1CC30F4E1412CBC6CD52DF405A4252F8557E8154730E483B8541E663E0BAE8C7 -816D95CA8B6D800446E4665EE726DBF0ED62395CBDE723ACFCF0EBA7D39697EF738A6F21 -CF591045F1CA5C3E68C2CD77143D7F694A7B9FE3348F70719B0F7D805E1BB83A1AC9F346 -1DA81E3167465C8ADDF6EB04F86193152EE00970D2066F79B191EE15E33606D83505C36F -9E8B05926BC156D236E865636E459EB06DC8A9AE6BF433511AAF8B2F37F0655488CD800D -BFC43897B1028A659F689618B15FBB801F303FE42402DA3F49CFDC8D03E5C28249400DC9 -44596A2BBF7F3BAD818203685C7C1B13C05CBB7E86EFB28B6C4D1C9D46DD08CA022E54C5 -4C6D84E0B15412F3BB3B7CFEA7A9A06BBCE4C69157ABBDD52FC5FACF0A23A53953C35191 -8379F3FF2F3BF089CF82158BD6E7013F5DC178EE34C55CB37A84C98C2F24A64B34978D95 -F82760C5382AEEC5761418A7D75704EF2EFA8EAD21B8EE44B87A8FFC59EAFE6B2CAA3D90 -CD2CD737421FEF85551E5E499847EF4B9D7D33F72A9B9E739CB294A16041EF1FAE98F726 -AA1460D1C782A2D3A717F925B4AE0E1A32FBA63A20692348F7BCA69DDF3FC0BF734930BE -518FC35FE0DE9F36E6C6AF15D770FB35B68AFC513969D9A0934131FB9A0A60B351E38659 -E3D6ED518CD1D9BFB40A16AC9E77CDEF94E5C3CF0FAE13076F4BCE2841C7EF7E0B364A1D -5B932335CE17861FEEE20D02237AA90A704EB6B74477BCA3B8BEBF8CE59E19E861832F0B -950FE683E1E5C05547F00BBD3478125768EBEADB91C6F3D2529FF871939CC7C10D0F07AF -58FCC9F8F9538870C3559DDF56BD94B5C1F239E44324C68F756B33989B482C45A7B78D76 -6E95E12F4E8853A430877E892A392C0228C567BBD42BE2E2FFA7F27578842D7B5D05B799 -C080B6E55B53D196FB2C4CFD7BF64115742FFC49465B2B62D80E877AA7E7D9D8811327C6 -6DB937B48FF75E410B5F639F02774678625F24CE25814E5718941D731B2F8F52A61CCEEF -66D7A63A4D74DA48992E4794B453734C9C3CB488DFBA825C094CD8B9729AD572DE4B4B7E -557644A0821BFDF2AEB7BF98C740C6F7BB79E0D80891BD9926DA4DAD346C785B381DF173 -23760CC55A8D050F73E8B8B751438037EFD9505DCFE058874FDE5AA5DEDF7B0B1978F714 -3F0981B964DB2F7A55B97C7ADF41DC95CA295C8DF2858BEFB21B94F5957715F982BCA5A8 -D6BD438C12C8E95ACC46E9720C7AF8A61A1D952F80E1D65769283FD18C2ADA03242F333C -527384FC8E5FC02B32B4802A8AFD6A0FBBD5678CAA927B5E970CAE60F72773BB4CE9E49A -0455728B49422E2AFCE32DE8528696E6ED42B350B80C39BE82CB53478FD8EA4B63DAE5AC -3ED27E83AFFCCC52E65675EED25001048297E293DADC529D37B5BFAD0C659292A7D89F81 -88A37651DED8312E33EB4F39EEBA2102712D108E8122F06AAC04528E3EC813EBE0D99EA5 -72E4EA566ABE4FF8FF53362FA3158FA52FC599728D97AA69A5C46FCBF2B0B75D2704F9E7 -CC7CDCCA951FE69E9C2B9B448D44E82D3DE480087E98D1A580354D4D0A8F893DFB7EE4D9 -30990BB3B886A2F0AE65B2F8C5FB109B5B7A69886E73E7883783FB030DA933B5853DDFDF -EC18E867FD17F24DF97CF72D95C7EC0897D20F2FAE74A9280DDAD0497CA6D099FA350C68 -1A46CCBD7B8E7AB3AD45658B8F8B3DAA18D6C5DF704A51DF6F2DB5F7FC218980B65BB446 -99569FF1D4081B16356114E4E72166A09ADF09827750DFB537E9F3CB07A29E2D4A435579 -8F9FCFA874A4772D04B7AF6306A75C68260ABCC1B2F59C447845735F8D9557A97635C2B5 -046B8AEC2815C5094D918D67638C10C7820BBD26EA458B076D5979E4DEE7DBD341097400 -2DED95CC963CA2D607FFA38BF2F6175E77ED9A8ECE8B81EDCD7FD6470E63E48A68C0BF40 -952AD9C1426B3FA70F59D03F317C1484FEEED313A9B21DD3410F3DAF2D664C8176FF63EE -2FF4D366A2E12AE43B34039BA38EF175253B582F457EE300E0F4AE056909C751F8E9F889 -EC08A1668980672230F7564C28C98BE3021A863086442F0D1B0169F98CA5460CFA959A93 -61E44F39FD8F5F1395C18B9DE0DABFDCB82717E34E836578901B33EC4CC2AF27E94609C6 -D78FDE2D2EE6D169036CAEE5530FC220D59A1BCE8DDDD67C2902E53E21493FF9DF4F06D6 -0787A3E6D31507E4A924BA17142C4421D2B87ADCC7A1D0861607A50C49E8359E0BCEEBDF -BF997E7988B54950D1B8104C504AF8B321D155FA250380D4753C739CC0C2866ACB76E1FB -D3A7CEB9C6DED0AEDCB16CB9C0FF78FC48A3B7B9CB117DDBB3F2EAFCA2A9462C3F125163 -6D130D50AC1C2E4381A5E89C22432DA5646E4D7191EB57F78AE5C8C63190C8A350D7A084 -54619FEADA6DEB239AC9CF577DE28BC967871FEECA21CBC24B7F5BC4656441B627A81771 -7B793E36D510ECD9835595B08C54504A35DCD31FB2354A2E3B9029FF9586BDDED0E8BBA6 -C0DBBEEF15BD4ABA2296F949104B44C7AF0FE063A14CC8498E52DA2497EBF940DE5F6AA3 -3788199C9ABC1A3EDE12C4CD6324EE6C6856BCF9C5B009C150A304BC37ED7581BEF3827B -ED0C87705C2EE399BBC1A2888BB0EB5BE6CE090C4EC75F44B77EC20C37D890E9225CA515 -0A3710734549550537F5E097610804FE488C0E67F063AE0B685D4AB5FF167D9462A87061 -3E240E17905E7A47119CEA30BB69011C3AAE24AF76EB189D7BCB06EE72CBB7C1225D366A -661A2DFF5F3E9E5C6AF1D81553146BE97DF02DCB92B690BE5C0D2C44E1A57FEC0BED0149 -9A6D08BCDC64AAC6568A1D3045616E470F23AEF55E642FDF155842FAFF49EFC7F6261F25 -662E6373E1A107326EE123240146DC3E8A7BE75E51FCB2931C8F42A6E76542B763192B1A -287CF88D28D0C897BECC7924801EC1D7B7B7E519DF69DFA0DADFDA635C9942F0AE4DA3AC -B6F1EFE8003E1192DE4EBB8C0656DC6BE46462C97C02B63B7A660B12B1E169416683BB75 -DD6AFD649F97018C8DBE0D4CA139D964A7FE98E7E86EC3F4E846C3DAE736F4C348D39E35 -C98D98B96E6A0436F5B5DD9ECA1DCCCA921879F11D42512810B55584A2F72607D20F801D -029534B9D3D7C2FA984005D00398FE7E549CE68EAA5B2B21D87EC383973C2D7A3A095293 -A510DF4F80074C4919883DF6091561EDD20B440E6FFDFAC0895B3D4EA594B7396B4B3AF3 -78559044AA7863D818DC89064CB7518D7448C749E66B56F9914E538EEFBAF56FE087CDDA -AA59C8A6146C282DF632571830B849A87E0A1089979BA0B38911386EC7834B8C3D212224 -D76CE946A6DE2B2C246A92CBB976736A586DAFE1B3D62DA86B7ED2C92D1B852FA2DA29E5 -7AE135B93A7110018E0968145A18CA917354614CB1937AD9EDE813A70B30CFB5AEBCA5ED -C158CF63704ACA8275356C4837B9CA53F4BFE2718FCD0F4502F90632E5F65FBB14C56351 -21B5A367A979E1515FB818FD72D9AE26CBDE09F79C244AE16E4AA13609878D0DC151915D -151AC0844AE2CD57426FC916E920ED93AD36F9412EEEDC7CBE6EDF7EE7DF16D52CE0AF4F -2E5470517F51B4D4DC734AE36A66D44BAB9531B8E2AA28A811F08F4283FAF1394E56FFC0 -9BC31790081146224C8A599F9209D59027843EC5C1DF4C9919B0513050868A107F9B48EA -8D68EDDC6947CBD4031CAEC69E35BA5F7F2CE967A9A645B064059A523A06E8BB5F33CBC2 -70D056A003D76AA7BA382CD149BE61990747C75F16D48EB550EB230CE7A87D8150AE1352 -C3A828660FEC741DF9A0F41677F8ACD0376724B7060B0DEA0478692B3E3EFBEC197768B0 -022B89CE385C383C478221B9128B577FEE85289F1AE5680F3F0BAA120916102059E3EB49 -74EE47955A35175C55EE172D41B79D47A1D69B679F08AE94B8CF805744C571B87A9B53DB -2C9F9573FE047343039413D96C6E757C9FEC200EDB3AFF4D330DABF5F2FD5A165C137BEA -4F975CB34D9B372E543A61C95408C284AF4ECB516028144A64CA94CD5B4282257E8820EF -1CE2CEFEF2B2254C7555950DBC6CE5E30176DBD5DB8DBCA2159961DCE778A703908A4E01 -BA33D7645C00261888C7A63D0893DB6EE0BC2165F002CE8B909264173D563EA04940844A -F99D5750540EA9AF7EE79B37173C4150F42CCD60053870250E45921EA215D6A318C232DF -9000542ED5479DCAB19B839D4F2BC2871F552FE440D7EAB59F1E46130D45E1322D1EB470 -AD5948C18BE73A0EC5028E37D6E7A0D2B0305683D244FC5E80207825FD8E587A74900042 -9C60722A87D9C0D96B32159A5E00120A9FB93A5F49014C86ADD51C4A1DE4D5120DC04763 -136663D080AE9A62F7136088200DC77777868075E545F8AFF504E55024DA59E61CC7D28F -0D2CF46A746EA11F9CC96E28A12F1C4E208D77BC61FC5F7C32CD6210AF8D5167D0781F33 -F55EB7C7BB8DCF35FEAEA7B268051C9BDE278D9AFDC8B1F832A96FEA08ADA9EEFD8B4D64 -525E223E0F8BE2D4492FF02DEFCE293DF9BC0B63FADFC0CF36D86408C198354D60810EC9 -A184885B1049D002D5250D46763042EF9466A3CC6D5D77F15DDED407743E5B0E66F07E2F -0D6B34DD74B03ABDD904746F47AC74EC694F2423AAD5AC1BA4D92CC812D14AD5BFBE7EED -E711C2FF2CA96229106E9B1EBCB7B247E9DF0D3497B50AFB597128670D3C37D33E8B3E81 -4CC5939FC944F0DA9F486517F19CF6DBBC50315F25BCDC9E2EC95BC5C32C3873FFBD02E1 -10C4EBDB28C5D812B259385DE0F27DCCEEF80D106CCF483FCCA045664F74BB6F3A93467B -F8CE0D96A004A1E0432B509E1E28CD71BEF3CC18FEB60DEC9C3C8B4C7DCDC14360C02604 -65A67941AF7445642F51288B5BBE76CBB54DCEBFE0FC2BB4F9DCEAD53743B355DBB7095C -4869B00D783D56AB252AD6242BAC1D7F71701B0BDCCA9788B29FEB31245E97BA0BBF6167 -570DE4DB44AB1823F301C2804D20BB08494685CEC27C481041C456C5D1024B7787385BA8 -F7799355810EA9BC21F6B14F7A4FC8F85276FFBEACADA152C746133E53A53F8788030D93 -5206C09FC2A130AAF5A6B28BF9F81A3AB72F910FFBBAAC14993777786D6F6B42FD005566 -B7D5C006BCC0DD10EC2D8EA90ED65F8EB52B488F5D5AD6AB2A46FF7C06B95523D79246CF -34576847ECC644C0A85F3D379DB1F97A246FE3B066D0A6F7B6BA63854EEAC4C82A92C3F4 -53A9A906DF74B5996B96D2A13A1F7EF9682D8F0669D4D241BA1012B13D69CE14263707E2 -22BBB0E36F19ADB165BEEAD76B323B55740716B85043EEF89D393EA418BFA7806FD23FAE -5D26CB811E5113DA77A37560F82AE3D2F4D8C4970AE092D0E56888D525D45563D0CB4DB3 -5317E01296570AB93CE8FBEE77BEB7E9DBDEE9F3208656C8B536F8E44F89203343DEF8D0 -C6CF20273522C4E2ED3AB104E4C98E0C773C991C89E16BAD8D6EF4D70EB69F9B9E7192D9 -36E057EEB0048168D2199D790379433974A70E9F418899D3822B0354596149DEF74FD653 -162778EC18B4AC9093ED9A6A3B3C76EEC9CDBF5A4A4ED23BF60E04E5D53A1CCE0360E178 -A682D70D86C5E5D8B4DB2BBCF7082558185084F8D8A22C96C7296DABE818F67FA9E5ECB6 -F5064065B7CFD19BADB214DAF76DC8EE0348E93849BCF1940962F297DB8181847B9FA9FA -6B443B870C7FFC99CAC69584C8CB64B01098EA4D3496EB66CB4A146766706945BE8AC9E5 -1F82AD6B2891A38D0065D37C2ABF340C05F8BEE47A35F3B01485CBD9B4C79D6DE4CE40C6 -E73806BA1CFEBA9C3A0816054A8A41B757375D6A0E013F96D8D168F0A18E44FCE3975699 -FAEE3089DA2C4C743E8F746C7CE589968319BF03874B6F577D2ADF4711B8BD42EB9A51C7 -256916C4258B3EE07BD2CF4431F1C835C2E1E86887E100703EAA07336E54673C3A3EB4F1 -B687442C6D4AEBF412398D1F1465B8FFDC4FEFD5ABD396EEA8FE981E585F3CA45798A874 -EC4D3D7D2BB31E4CD62898F6D6F27E87B2D2E8BB78BA524A54731D04E0A21C19C05C5F45 -357270669300949C580629390B2734F0F1A32C764E0BBCB8177DE0E5B8FE4E958E9651E8 -703C8AB58326FE0449A73AC645B2DE49E6FC099399003449124AEC31A8714834A8601652 -6198B6AEA7A2F0895EA9F9BBEB13311BB006F4F6452C8F23064057B7329D3B98C5C2ED39 -139FA2436C0B610542069B96D6A0027D4C3B79CC646C8E063C38C3EE4145236F955A60D7 -073D6B8DADBD102BE5EB88FEB9B889A0E7FDDE15B9F69F734EDC33F16BDCB9FB84481969 -6CA99D5D5BB5EA6B2C082EBAA52963C8454A0A1E475013829CBC977864B617A14DDDA328 -E086803BC06FEEBE32D8977F9A8376325B773199B29B1CB15CDFAE065B3A127D8D160E1C -472206B7E4497C9E91B5F487FAFF62724D86478741E6A2FF610256AB92AB688F2AB751DD -90D96090E98A2C94C59F0756709F828EDF55D4C7A56E329F3085A8F7CBC2765929BE87DF -11B087B08DA4D082594FB949640C24586FF1C8B505EDAF05C4BE22EF8574AADDC544C702 -C76D7A9096B206979CCF7AE4249552B38A2FA76F2A9E4EA55ECF7E7B4AC88F77B6FE203A -2D4780CAC541C94107DA1031658D2041ABBDA42FA36A744F55B1B79090B3FC71BA917778 -CCEA41B76A06564B753BA93BF518CDCC98192399E4960A870D13B48A5B18AAFBC7AC0527 -66F9727D135DB7FEB447986F1817A66EA426643E1D2A4127680EB0BE913BFBBF01BCC874 -92F6D772F4823ACB23F378CE68FCDD439A23947BF8AECFD88A8F8FF4E28526920B833CDA -DA3F234880E1CF5DCB0D1E333809B0BACE4D1A3CF36E122F5258E7B277125C9AC20AC18B -9323D1C8332E6CE51FF5C7CFD5201E85498BD05430993DD8E18A04C75200C6B883B0386A -8E81A4A6E3CC28E4D0744D8EAB410D60B93B82B64D387EE84A27DEF4115D554C338EB123 -40E9B6B62FAE4846FBE23DE6EFF018EA67317C8743F171AD6A008CC1190D6ACF47B5712E -607B1D6A6EBF3EC767F51A6D432CBE352E67FB4D976D852144289006679AAE4E5C582043 -3ED4A6F4DDB4F6056AF923B84B8436BDEBE43AA7FF0A84B71F469C7BF396E0EA95D31AE5 -23B41676AAAC68203F1214E08BDFA403EBDCFCBA37023A566A0BCF34D4237B6A86FAE988 -DDF9D5699021CFEFCF8BCC3862836220C39BCC82553FBA41585259B0494FA1FFD2C92C93 -C4380B885A55A0F4E829CE6EFFC72F6FE64B66E64A2E3B0E82043D164D0EFCBD3CE98D2B -8EC210F6570A60C92ED09E5B8BA6618BDA36F14BB1B1E6DCCEBE50E612A09660377A67D9 -3B19D79AC625693FAE271348044AD13EA26B4FE7D1520A814C2F7730537068C5C34984B5 -0B8BD7F836B957067E02A65B6D26456BE4334F180030082A26D89091E30D628BCA32307B -310C0078D3FCD2283D078740BDC955B4DE611BA1D09A04AE30EB30154C0573F459E75557 -A006418C7EA44ABAEF9382C182CC6AE260328551D722FF8D4B06D292E09215F79118A716 -77B0F6B4A7F15BAF61BBABDEFD83C92231DC7E4A491333DCE7B5D1FF92B6D79462D8B95C -E8300AE364B0D92F7C40797EBBC62F9847C796775385E343FDB02A0726FF6D5E118B8913 -F77E2DE8D7A93359530808B89BA7CE125C2DD1174D30F0EF295CFDC6E4B039283D23F235 -24D860B97851E7A59A8863959F75757E6F9F7BB8C5629675225CE1F9543F3EED0D931D2E -18A9206F709E5586CF19A965C5CDDE330517E19596DB1A817C3146433FB0220655949098 -0FF33A01F79C04CF7D46D80AEAE67F867DD572EFC12B469C9BE08D9ECCE54050A6331593 -4FBAFBD5E4F2348251582AA624E6743A0C8FA08FB3739A303D919A9796797642F6CD65D6 -7548C40C32912745452600D2093AD67A34D3219CB539CECB093009B13AA77CAE78AECB0D -A624DA455725B2707A8B27FB75411B96DD0F8F33A31CCA0D0DF08BB08679C6D2F06CF847 -23DDFCC89E54D68DBC2E8AF22D0E20F86317847D41BD78B463593DE423200FCEC1341B6B -A61B327CD89757825968B6D40BDCEB55BC00827EDF7994C12CFED6A4C16F5F3CE38747CC -8942C8CE454794209ADCE9A7D2608224AAAC684EE97DC956453071AAB23DAC8D28D1E2EA -13D28DAFF068BF11859F8E1B8E8C571EA30CCAD1333788647E250577D2E908F41ECA1B5C -1A2199B479F0D38731EFF6F8DDF3B86FD436D41F24306BE4D1771EF24B287EA32C5A60FC -BAD6655A20261020A3690E70DCAC494A6AF3214BAEED8C00CC86E861C4BA6F545F94194D -9FD1736A81A26ADB9BF05BBFED3157D6893014E87FCD8419D750AB2F51711D1D4FCCA860 -FFD22A121805E91AAE796708CF754C5030742FA9AE9CE22FD45089F532C769E906D2D74A -6C7DADF54ABB9F8CE74AA0E8B86F9CE77CA934DE33404BD07BE3CD88FF1D9C27DF034032 -554121F6214B95B17E1F8B2909C31B93E3BCD416DC76A4D150B7DC1A0D16B57A3E7207E5 -34BDF060F416E97B6C97AD7FC846F6A3CFDC92BAA822FCD90087A19C6C04BFB4BEEECF2C -E8B184E9D9A72005D2E2B306AB25E7708A36C3C6CE857244BAEEAED79DCC8420EE0DF1C7 -A3BAE477C4DC1EFD1CCDA761F230AC93BAD22F569758FAEA83B6FC12796C503856E171C2 -1B8DE2926E0000BD7BCB2087184865B43DA908765DB836C1397F86C4EF27C6B667D35B3E -ABE731CD32C0501DA20A26F086373E4CCA74922D3988B857A715B8C70F131A190A33D9D8 -C36E061A60E1B5C63C749AE965EBED843204279D515969A3A5A5C0616FBA3D7DCF19AA8F -B0B8FE4D5134EAD0CC503F0BBFA49E7C2110BDD4BE27DC7B67DD0F417AF8C33FEC671208 -9D5309074D1B15CD52FD2CF319D1A3B149D7A513AD9D7C0C1EF8CD2CD7031F082B27CFE3 -1CB2737CCA9492AEC194A92BB2E5FDF0A94A30836D1FDCB78D9AD2A3E4A289A7E58177B2 -9D92BA721571204A74441EDA8385B79E67E5AE5F52A2A181E8C22E3343A30AA03E2DF4AF -B65F91D82A7823D2A172196B613DB060917CB303C574522DFAD536167A501EC998004BBC -7DCFE97EE8AE4F169D604214B9746475C32B7E557223B20DE15E67DFBE2B4251DE61F732 -9BE3B01CA9D20CC06173FF97EF9C15C4109A1A6A321C4CFF59F448D7021A0A0E2ACBEB78 -C4C7417E652E46DB60BC50D79A8247146CCCD3D288F7DFDD1379154E6E67C3245B8D4F78 -394936ACA8A3BDD330219F916595035D95CF1AC043B3205981126CDB837EC4A69FD88C20 -EB20E8204E3C5388A84F25AC5E96F58BBD258326C4961CC39627359AC1BBD203C878FA14 -6466C407F206184AF3D5666E7A3D6A01A866523FB85A86CBC08C62ABA290248E9E23647E -4A3D39C6C1A4DB8EBFE9BE7D70B228A3D426D6F5F0B73EE30A462983D166782B02AC2B3D -CBF181470A396FC272782D83A2F6978586975FF35C955A2A15DDF14A0A152B91344856DE -24E10D9BCA853424AA1ECA78A8598A300F620C5D5DCAFC26E087A118219F6F17B1A468A8 -B3C2CA6E1113F428BFA8776F863D89B432CCD125F7E37002067D775FADA0365E6314B022 -E782134FCD614431D014018CE7E6A66092EE5113F3E94ABD5CC5EBB42B11DAA52D18C34C -3A8A973F1BB6AFA1C81BC36EED9595E5AC3ACBD580D6D499273CC5A04FF2FF51CBF886D2 -4A80DC14D0C7C69B04E77E3C0D9DF24D295128632562A1BACE9CB3D69332EB08490CBB94 -37A4CBEDA79BC03409C7EFC8B8C38072D37F9C2EEA32C59644EB148EA83C21534D28211B -E074DB78285632BE3DEBDE8524490B9CE18FD89374171B546D349828B5C2E9A497539CCE -B501FCD13C47F4C2C57E7B625963E7159A57A3C18FF6DE06B357E7D125574D6BC2A3B891 -A918E00AF3BBDF845E6E3BB21FFDC4F724085C73B147EC7C72AAFE2C7087133CF8759CE3 -5365425F272C61CF5F96B1490DEDE8E9FE77E6F7FAD03A79DF2E2A90E1A12263EE5E67B4 -4B1A7C1737E4B178FEE720652505F6C5AD062FBEAF7C8134E984B8FEEA448340FEE7E3B8 -54436EE0CF964B7F854AB52C1A7FC0CB455EA3B879034C34361FC56935B400E93022A073 -44F0552946915B6DF0464C8F7DA5EF0C6CC85A877BEAB9FFC4854252FC2D01C275E634B5 -2F4A439AD072ED4917A6132CEA7669CC1D91CFA66EBC689CCA482E9D5DAC4F2D4A138041 -82792ED95C8305E0BCD5B0D70C6E89F7F292FFF59D405B86A00765E0E2A42C18004366A4 -C9AA307E15395495BD16D691EB48649FC2E377B388B6F5A8D519D6CC18B4F2176FA9481A -BF4A0674FD8627F5A544C3954A4F51C234DD631301465BCFF18734190C48531D3C22A368 -3A8887D4C665D442C58CF05192C957A5B8D5246E925963FB22A4476E74122D5C5A45A64A -DDD5280D5BCE3DD52BA0C2C5BB01E25C6107BB785D48C5E37EC652343D5DF64124E0544E -58785F88A7677C2995B938923A3D31BFEBE629A0C0B10E89DC24AD5C5BB67CE96706620D -44122A38FE39966D83C60B29DCEACE2D5B7C62B8DD63A8C4933EC9C2DB8F0E1EA95C4325 -E6A392A6FA28BC9D8A4614B57D6454ACBE1D4855126AF4F741EA672C5DC8785B9510F1E7 -CD009ABC0DA119E418B9D1732893A71295FFB947382B621A35430765814A4D87BC9225F7 -C30315EE1C82AA20C6694A2BBAB918D6218A862B9606E868B7CE46ADD21F18FC192F3E53 -680F2300AF3404BDA02406D991FCBD977F993BE179ECE640101FF69DD7130AE252104759 -BE35F677641AA99B77998EC68F2C33A8BEB421CDD80A32C85187445EB30F882B11DAA52D -15208664CED636B5A8630DAC33A8F1A8ABF26A1E28B1E9C5A8BF20B535534D337780DF72 -2D36FB033EFAC9F460A030DBA78B9DA909984C36A8D3A206501585E2E7CFAEE68CFFA72F -3C55906EF2D704D8815FC8DA8CAD942581B20FE0532732DD02C2E7809FDD9EAE6CDE2B79 -F81DFFEDBF5B25B0F81E884877AD96AC10D4CDE1212BDF99DB3BE6B407AC12D6FF84909E -B43A9E47C76B6D10F728AC30B0AC9902AB6FC8F894FF1B8EC121C32DAB55C6A781D5AD57 -45F94D85EF8BCC8F2672EDA77E61499065D9C1C6CB105E0DA67E2562663B52D97CE325FD -4C0C6A01D33FB1D3DBE738088EB49F61BA3A7E70F567109226E247AFF09D9B0A2103C79B -33467BA06B94DB8BAC62F45935DBCBF027F1C7C36DD12E895077A646392EC61266C98961 -FAE84D5338D421424846807E904E1B276CACA31010E0B3E5F5A05E98B82A5576C060F452 -6CE73581B41C6BFB71867D47293EB5E120E0878CBD4F670B69EE75C203CACDA0B87CD4D8 -6A7FE930BE7BB0D0E004FC34C2A51B5304FE437BAE9F2A2615DD834E6D680A1EED495A87 -5362C820E355D56B2B5D2C70EF2756A992BABD7C94555961A2C39C5AFF95AE8B88DB2B33 -2D0F4551212BD258BD2D6C53A290657A3475E173AF1CC8A893337932D9B35FF9CD005B2E -7854D0997F23CB9D359D7462EC0827DAA520FAAB6B0A396695DFCA5758BFA64DDF4203ED -FE4F89457895CE06250121FD57536E08E898DC20F084890D65772A9E242F5A07A0CA75C9 -C3551E79784A8A3256455B6C88CDB8652ECB2A457D00B90E2C0DBAEEED508EE964DF1329 -B34B20E37D58D92B6AA15B5D5F56702C9EB9755025FC8FC393C430CCFA34180ED1BCF887 -05C6E3EFEE8A9D5C99EC0F48CBCC34F37FE10FDCC68B021E14A1D131FCF8D5C2F8FBF465 -8A60A554D418D590E03A268503D12C542393342599828553AD4589E8B0E6DFB2EC663AA3 -B6A37FB206C1B732C18A052A0F309DCA19DAE82D110FD3337A863206216B00317508BA1C -1859349EEEE49B9D25C897D29C4F28C3757D350B3000612D4C32AB5E072DC92700132514 -30C91CDE6C1035138C683763736103E836DB99ADC686EDE265182E8B02063D76441E6122 -F10EB88DC27F1273BEBC4219A5E6934C51E2A9FD36C7CAA59FC5A5D2049C0781FB48B30B -750640992D5CE69D1602543B81712E8514041B4991A115956C268DE747B0F136F8819023 -8D14DDE8DDEBB7E147057EFAB2D0F0002CCD0C6D997248A1AA973D284D6A04A3E009EEF4 -3F9E859CFB4833C7E485DF4786089D9061F6F4C1EC74BD179D01636788A88597B7F9742E -17C41DBEA3E371FC867274D265589AF7BEACF9748E7E21B73318BB6728F455EF9BB67165 -6C39614711B33B96FF3F74EAFFCE174F0CFD3704637E5CD8AAAA0127AC58C82CA7B20971 -670582631831E7E5EDB9A27C26C67165C891679515E0514E6D6CB7ADD9CAE98B9E578DA4 -7B521CE6E8A0AD1DE58A024F954A424B707C462C83F5B459D000E5195F45FC4DD186DDDE -4E305D1A2743BE9C41B337785B9D57EBEC790987B6E1D03EC686CD01C3E2E14D63E07AC8 -FBDF1D5D1B38A2BC1BFBAE604908BEA0990033F9F4FBBB8CAA310EA2C217EB5FDB8E0B08 -98F64639043595E8D09010D98F959A7BF315716FE1E05109992F33231C10B7296E284A87 -219767CAB7BC5DD096DC7E164E114FCB6CB16F078275B08936A7A036D17B96863A068423 -D4B72E67EA43483968214F6243E538AEFDD7B076B0B6F7CE98A914D2A2332751DA48BCC8 -0A950FD81DACC79DD6E3A2EC69B724FCB10CAAA58272FA64D625557153DC7C1683858F9C -00C98EC395D7A364E65B33A0A8FF31C7FC19CE7DFB5D77E2B5196C924039F2B4D4859C11 -F3E9D42760F5DDB4A3BC9B78C0CFD18F9B75F4756DDFE2D7C3C8C4A60E6ABD17A234CC78 -10A6AC5778570C86C63B27926FA00D01A204CB6E7EDDFA36476E7278B67789B17EAB6F9B -384465DC8EA130CFB75204A20E63D0A77F4F2148BF88AF8D86A7CC39FEFCEAFEB7CAF7B0 -65D7CFC437E55773A2F24A1F7156C4488FEE00627ECE1B4CD8F8536B91B477331073BEAC -A38423E177E3BD2F6E5E31673EEF7C4510D430BE12AEABD40D3E7116C4C91F47CF12E4DD -6500656EA37E109AB7F5982BEEBDE4C4E1AB125EB84B560F82716B4D672D13CB3D424596 -8B201C3B628AE15A0E35EDAE952720D3D7DC3C373E1589C1B94E758BA485AD155FB984F0 -7EE774778F52A84919E48959C071F7ADA4D5D64A81E8D5D792F9E8DE6C491EF9ED29EF53 -3CE191646D7EA108500A935EC3EC9B4092EDC5920FD07A5549EDA2F643175B7CC27F7AC1 -098BD65DEA60D6780634EAD4FA2117E74458703F9722C9BFAC8863D2BBF338EF586B4E34 -2583F1EE4907414A1FF2DD25BBD2F5F3B10EE054A6783DE20C414E7366BBB3068D0E3CCD -A8AC3FE053EE1B89F32EA80EAE51D9FE242D06752BECDEF0F9FCC48DD72BF764378C8628 -98B308C826837EEE3C1F745325F1D989D33650C5A11AB9F5C47C20993159CA359ABB6E14 -ABED7BD14F7AB1B604EA8179D2254BB6D2F9F08904B91C645844368329765045BC4B0EDD -D8A5256C878D64941DCF0EED82A61004E584A8BA9CF9ADF76F5CB0B2F26FA4A4E6499C45 -92ECBFBD4736242A8C64D6E692524B3E663CD47D0341637139F2029358BF07AB385466AC -BFBDA0A68E684D4132E529F4CA6E3017AB2EA78F4281C290E2EB2A948281C7C466AE758C -19FB86A7C335C50BC32E68FC5973E533DC14720A90E5AE57F8E8D87B0567F291C797A00A -B00F1488437F05B149E4CE5B182C5CF82C3B15097C269913088C9A493C976319BFB2C669 -553240D1025AB656ED019592AA7AA98DF352A6F0CD453FB20FDA9BC5E53B003528C1701A -94F06022EB7DC590D290D564DD37357DD75AFCA9704642DDA1E23E47FE3EAC9E6B5D22B8 -AA0912C8176CB668997D9B9946314647ECBAE379CC2E8A836F697E614CD975560278F0AE -74EA9A7C10F94564170B11426EB79670083D2F68E3336898E5D670AA4785929A2ECB553D -356F8AFD7B0F95E8AFE1947C638684800A8720AB299EF7538D6D56FB1B679FA5987BAC22 -A06F3716B089EA008B1DC55E3CD09A39F0A903B8EB764E5AA9C1AC0B5231C440F68D4E01 -C36BAFC2FF18F34087A5B90744D85B8DB03B3F8F3578E1605487328A11ED9C7E7AB8DB6B -580D7329026F14F24304B195893CC1D091D960730D2C45751109DE55DE39047015AA14B5 -C497C41867A5DA02E7091FB40E952E8ADDCB0117562A04E71739AE2F9F2CF315D510DD0A -063AEE64F428F29AF03B9436652EE54D68BB45FF0E3A373E5CDDC9AD707A989AEC860A32 -2AB8C2CBE68F36F2523B1145ADF788BDBE0F577AD7F5B082ADA4E4F798199883011BDDE0 -18783C3E8246D2829325798FD75CED42DE6FA551BAB1A8E0637BE3D487AF286EC8B42278 -14FF0E5BD8B32A0C524FF0A0C22C8735BF7145D82F6721E7774D2EAB4C28BCE0634A10CD -571490C14979ADB3126983F20925E30D7DE2AC03C146432D8B15DEFEF9504467604D9F02 -32F7E56163F09E9BE071FE10FC3CDB00F40004AF8B01239CE23B5F69E37B35D5DAFA76B7 -8576B031E3386C6099407C8042816A4EF9CE790110CF24C114EFDB9C8529A43C41168F10 -A17C2ACD6C4E299A9DE70657E70B16CEDF35EB41392648F09A02E1E4717400DE1A346671 -37A7CD6A6EBC5F48A19FF169A279F815BEAE49B489923AB6243E4C8AF35B4CA1EFBD8EA2 -D21211D869E0D3DA441860B6BC465EA8497507B8323CBC9B41AE6C774EFAA7224385FDA0 -CA5104978442A4279CA25C29401BBA1367CEF35A2BE9D24CADBD7BD9695BE9AF03BD8DA6 -A62111A9B59A24A4ACF6334807CABD977D251213079A7265437C822AE4893BF048B19907 -E997F038CBDD1FD0B412AA2817453698EF05EEF47AB03E9FA77751C57210969591876316 -C83D5052163EDC28DBACB472D2873919B63E9271310702DB9521E8C18020470A4DC60EC7 -A1007BC82BCCFABFA1F575011A9067817930AE0321659ABFCFB4CFD6EA7AA86AEC98D64A -1854B666D075107ADC85FCDC67D89C379741264E6554B7F60E19A5292D356E64538777EC -830B8F0931D34A61F9CFF3C37E187D99D5A2E7E876D1E8996F73FDCD7E614101F97B8BEC -A0744AC91DB473C0103B6820134BA545183483C05E1EF90B59B78305350080D2204D751C -C8AE8DD9462DD62F0FBCE507F6EF39AAD77024E89975AD12BF8F86130D9B76AC7BC4D4BA -BEB06B76BA3D77DAF45E769C732882DF011DD3E00845CC703EEDB8EDCAF7A6EF4FAB06ED -AAE69FA3A9436774577899367B202442BD6CD24377AAAB605114823C26D249CB0E130CF9 -60D8313DC983131AF766483BA063D7ABC0BC24EC06DA0720D4884F9421B9946AC15C30A2 -DFD1375F5CD56D83C8B94CA84D3467574641768C02ED50024DA171F856880506E3AA5840 -1E65B0B73B80BE8CAAC83A1012D1F244F4B99BB4BFF9F001FDA8F06946883B1F0657C3F0 -22900DC7E6EBF936A8D55CD5D0D66291E24240F8B997361BB943B5A9D36900ECE284CD7F -66047938301E2632D00CEC224B1811F43475B3EBD58006DE58DA2F91EBCE1833CC23C395 -C071663B9A91B8FF22C98D840700E3256087FE0A616FF9C2323FBE8CA67CEE432A2D2AC4 -D00407877B33CB35B83591CABBF8700623D58B8C745C6FD0CDB21A2C7B26BD8495AC72EC -A551C5B077D0EE92F5A67FBB4D438114D161566167535A3B8BD74EB10382D997C418428E -F88388B24D9D78C103572341D2BAF842DF6522087E28058CCC1A8A7858EAA41D1F588C55 -282E7AD9708396959DAD7EEA79291F5FA856A15E0DBA1758E9788685F3FE87AD15E29379 -8CA04AD209B10DE234315BC07132D32C82ED96B649EF7BD65B80A45FB3A48C5C3A994628 -118633137D02298916DA8E3EC7598B8FF27058EF911807A26F2189169D7D53A305F89659 -B6AD13AB05ED759A14FC3FA59F36902ABFDE6D02CA63BE37DE57EA0FB0ADE69626B8AFF2 -C4CE000A5AD361A7311FB0503F6C6EAF4E12E90DD26C2FF14CF944F1C7D370D1035DDDE5 -DDACF493116C4B10BEF55FD88CEBC22252BF641FE8E871D2A051F774A5D3D9921D1BA16B -26765180C16A4800F59B9A6B990340D78EF95CE32DC7F14F34A67FFA19474C8EA4641284 -DBA859874D070F5B345083E1AC095CA5348E0358FE7B10F3DB25027CA0C6F63D034974E4 -64ADDEF24654F73B0473208664323C568A2EE651373FB821BA60F3ED0844FB75754B1D3F -D47D3097CECD9D8AA2E3C12A286F3AE09EE3F27E136DCD543BC7BDD8F4E1831FB190FBCB -8B5EB2BB4C91830CDC404EF0F46DA4A9F41345181D0F74F39F36F5D1E2FB935D595E6331 -80AB43D32F82C5F339DEB75288209C1F7E006326239FAD725314A95ED40D51CC657E52C0 -CEC73AC090702C85B9F171C89B2C787F1E7B4EDAA41CFAA83E47CE0BDD74E9AD13E71539 -A19872ADC0B12C705E9B4B271016B208974D97623777A64FD6F4DC176B98B07F9BA07D8B -949DDE4A4236D3F19F360265D8E745845F2E6D74C1982803330033B524B6692E58EEB2E8 -D1A3EC8575839D85FD65EFBAB49938B9BFFCC0A23D8549BEFFC4FFD9B5644B205E17EFFB -A6D24813F3F490722DCC5401EC9BB107ABD77D11FDD60D882E20F1993F9F471BDE3DF47B -13D8BDC905A1EC61E9325D4F6CB62477FCF08BA409B7B1BADDDBD072A8FB38E26AC452FD -B77D07A223CCE2EF62F7F7365B8C9697413D77A188491448143F300B09DAC3F77EC6E287 -C372410597198B2E7AF074597B6AA4E86AEBB31E56BA401D0E6E94C40A4F6EEC7703C3EE -06EF6FF5DDFDFC2B7443D67C04D7311BCF21761DCEA797936EBA6098C91A973EAB0A9D6A -E81C1893C7CE1A8D2181DB792D20C29F3E6C5310DA2F4A25DECE6246ADE8B78C0593ED7C -62D5D6C89B6EA4AEA664A79DED2FC50F958F8B1C7B92942B4E58323F2BABCA0B77B79992 -4738A89BE91ACC5306B0B6E45D672069AEB3485A0B52E931993E600B2E65F969D17585B9 -23D1E5C75F44E2866DDAF942C6ED937C4B7BF2409F1BF6397FD27BB5DC7DD077F0F988AF -0677615675590C950D0F9A39EADB0FD85644D3996C41A5B45393BF9FD3EAA4435F9A99CC -5A35051000E4FB703F801E8B71115A0EA3BE19D5AACCF5B0833AA87FA7CD506C3131B6E0 -5B3B92A493B57268CA478EAB09E71B1DC304A329DC6E7453F4B3721CD13C2B670C19A764 -9CCB29BACB087E768F9A817E893A4A0A7EC4EE391DF074C947B2978A844D944A10E2229E -0BBD69B27AA210D58954353D1266F57823ECED7EAD0AB583F4F27CEDF3F92D1FCCF34BBD -ABD82B2BE6BF7F958EAB3F5921D8CEC898D7076524B12D68DB720BB81305F195EF87BA96 -264878A18F98FCB5136177EF743037D4F7141A15744FBA348614DEEAA97A3510FF277A18 -8081B35AB29A53ABCFF2AF1DA946971AA55A72022A6DD32A7F55C05EEC925CE21704A5F9 -C35D5CE2130C32A48EBB7C30EFC34419355761BCD0732AD4B351BD046C32805BB089A3EF -B013E4F54374E8AFEC10ECFFEE05982915D22E25A2158F5BEED6A95EC6005490FF895CA5 -DB459A2DB44108AC0A9602723619CC2E013155ABD1286C9CC50397CC7AD975A042833A03 -3C2F010A0208D2B5F7FCAC1F4661332E91F43507BC6C55396FFBA9E2965CCA72EA47E3D6 -A0EE5BA53A8DC8579A85383B394A043B26E15EBCE158D95F14C714793513A6E11C0B4FD9 -A02704707112AAB327416114A7E25F6487E6749A8BE860330104E85A2791DE3C98B6D6DA -8D9F251995C972404D1A0D4F044E828F03848565B821BA154D836BF8BCDE9B4F3968E32A -D031AEC5216746F5BB0C24B6EA06EC50E0AFB4BEB48CCE75B016708682FBC063DA14314E -37152516354E42C8A6AEABEC056F7D9B85CE992D20061F25C87125A9DEED6DBDEF357EA8 -68E970CC703B5C8E67F94C2084FED1C6FE0F9BC6D26D132D7A8AB5EAC1B2801ADA11C806 -1D005081A47B901204BFF62BBEC6E119C24E047088B44278CC47816306864CC85A242CC8 -0D2A4A10BACAA701E62980CBB93B59190E7ED184E280B0A20F8CA4749C6375EE133A0A79 -5215D020563EE1AF19A3C573BCF56533C2BE07D4669C21E22FD33530D408714E42371322 -E72A367B66EE7CF614BF7F4647E6FC1B9F9E18867CB630B159D965F6B4CE54BFAC489F10 -FD115E894741C99B40E2810CB37E6F9529CF01989C96E6242D67BDFAF52888F1AEBF1870 -AACAEEFED464733028168BA7FA51311F251B9EB544BB6BB6F5FA90A20BCA883E3804916A -C83A39F9381FEA3D8ADEEE8A62634D02F3C7FCD8F01268976A3B90C59BFB9AB1F7293C14 -48E00102EF69931EE40BC3FACCAC7014FD78DD06EB156C860DDFCD7963038197189A681A -AFD7B886C6E7E26C87D4293AE6B1B4E7884FEDEACC9A2B049119147417F3AEB87B33A413 -C4FBBE3D0E5FB7D61B114A85A9C6F4A95D123234A394615192765DD73865CE47E4E0402B -42D3A1410AA055B18FE654FEC978F28FDB9865B09227A98940613EB39D7B8E4CF55CBCE6 -C13A5ED3DE5F617B495CE502392AC8DCE6A7B8CC7AE9B37943DEF4E6D4015D3936DBE823 -79E1210BC38B20BECCAEEABA24BA09357AD20C0289D2DC03E4CBB007B8B49AC2F1A47CD0 -5037FA11C1E1F36ED2F1DED20FF9D5042D9F9300B5C79C1803A9CFD65D80BEFF3AFFE22D -A6A1A48AE94C7F647195C920B4FA1E025B960BF661D592FE4FEE71702A7093BCD4AC1510 -7CA7CD0BFF3E766CD241DD6059DB2EE8AC74EFDFE8EAAF57B8AF7AA57B41EDF431549CA5 -DEA22928192F8D1D14F3087C9653F3C8FADB30FB994C72FEFAF5AFA5EFFCEC3725285D25 -19B356ECF7F22D1C6101DBF3F476575476166E599DA264073283C19A8ACCEF9C0EE2C69D -D9F0FEE3E57CF25CF842D0D3CBA7204B63FF0C4FB0D364BFF2D43D04FAEA7BEAE5300B14 -319DEC628BE834B7F995DDB697963AC750576C154BA3B31C102BAB9BB93272D6799437AC -9CDD83275AA5A15164757D9D06F95CC444B756237352134AACD5BDA0C41FC0FD98DF9C74 -96D32139692846A141BEDA8E79E7279F1ACB7491ECBABD9FDD1AE69C61B22DCFDC81E440 -B2965F0D82C291D07806957E6D017B8EA7AF37F05F5331BBFEA70A3AB8B078C4F87F4D64 -CCB62D889852BAE9C0FED70BAEB159343A9F3E1F2BBFDE54D5E9353B39B65C16E2412234 -D4E7E1C96D282E1C8D1B38D9B9293FFCDB5EFD759D583C9EE63A407F08A6B212AAD91FA9 -FA501D1C725EA8B08AF2880F1BF0EB6CBF885B70953517189B8536EC2C7960C7E6D5CDE5 -22282682107CF85CB025FBFF2E88FDC5ED4EA44DF630359EDF17BCC33BAB47C302F193E6 -5EEE260DE65D388E935B2471A70A40B5DAAC06911ACD2E5BC9D2853A501EBFB39711151D -643E9E4F78CE0FE4678ACA19C3F7B45E4DE13696E35FDB7EB7AB60853A6CB942DB425AD5 -CCC11AD042773482E0DBEA11FB1D3810AD5DD26B175339603E4E8F32A14BF7E994ACD717 -AE314DC77EAB6061863F7DFE05D95FEAF8436FA218FC3F59EF8FCA198BE6CCAEB3D4F3CB -BAF8F585FE5997C4619EF19E53DC30BD017A67E318612FF82EA2553D060B7D406904327E -779B4980085565B8FD0D7B497FB4350AA989820067B13355329BFAD8D9281F0703A9049B -75DB584D5FC19F3015BC11EBFFC3BDE393117DEEAF11994DF5B62B5CAB0B16AE64DB714B -E1ACE83640FEC6AFB4D5A66D7DF0AE5DBF347EF96B535E8ED1839CB030703846EA3D2E78 -6721D7A3409C8C23E7B0A609525D8A675C88E069E4E39C4E06EC3CBF5D65F4FF176DCDF4 -2DE2AD6EFCF7D2EBFA8E3FFB2353676C39B167AF4BAE04624856DD334890E8446134DF7A -2435D76D4D76090E7B6914873A08688FAD94CD3CF36C10F983A211BC0A8B0276265CFB28 -A976E83092D7B210B997F392AB4B31AC6DD977276E3EA61B4095F5804ABA0E21D8681A5D -E660B5C095054FEB45E9CDEE557675F66C4380A89FCF51E51347BA633FF52CE6F3FD9596 -5B329DE8A88AEC6F101338F1E0ADFD99212B29B725A6C4997117FF445DE895963F2787B9 -0A892C0A22B2D244834CF54A73082597044AC27F5253BBD4B01C42A69B8DFE25299DF085 -8C545801C56453C0E3659CA5A6F4FA3622968F77EBD8E551C8B5FB354B8192F3978E4DE7 -52544D029EEC168734C623C3DBECF5B362328EEAB289EAC40B85EC5A36FA3F73CA1C9A61 -771E4B2DE1633636F3BFCECC3D70741DEDA306255AE27D4FDBB89B811BBFDEEF8867E490 -C1A731C51EBED996DF36340D570FE89004AE7FEB5F686E1129100685EE41086A245154C8 -1D80DC435DE1253923B72DE0C6B2EE3DDDDFE5C0CDE38F683E7CE4813425EB35F9AAD55D -3CD3E62314510DF6C2FC0EE94CC188DA028C82FD9BE6C8597B271FD0ECA5FA6AA0704A0E -9C1EA47EE0DAA990E98E4BCE43EC3ADDCDA75ABFFF6E6FB98AB71271A73C3DFDFAE883F3 -B37A0D2193BD185786280B4DC961470011902D56F511759FAA40308DCE49EA5DE8C073F5 -AB3A29630B93ED1D1EC77A97CB5B157F65B583A96D2D50FD6EE078CD6D7A7CC4A31DFE09 -23A866725740D3E39ABA8305BBE4D4196EFF98A37788B9E71EA6E120DF0E6B9F14BE583A -EF3F2058C22BAE7DC3B63BC150EA62ED03BC238C27E65DAFB0992DFE8C8F5879B75753E7 -375E76ED56BEDD1C983B9548818E6C2BB71E38BF3F771B65F84706D75FD761A14ADAAD2F -4BC97ACCC1191441BF0AF940FDF539F961C670AC4C8129C1DF1E479207F50D1E08478503 -409C4E9D165946571AC1CA1D7EF9D31546CA99C1AF6F7611E605A08EE2E49162EFE39E33 -726D6ECF05520DE13F634AAB828595C898678BD119D7F6BE976AE504AF22FCFAB6F930A0 -29E176F442504F3ABAAEF24723311428384D691A98DF4689C6930D8860FEF6E355163282 -700594922D73799A67D834F1551D7BE208615F590781651CEC7AB705EB278B3470D7371B -A90AC7F0FC6EA11A906030EADF328B63E21A135A4BE6C6C1670C9F795097749D994277D5 -3866BED00493512C771C973CFED9D7125A095FCC4ED15B97E3CF56398981A8ED0D26266E -5516FBE18D099AB62B457C6D8A1CACDBD04A3F64D4D95A6F65B7DB021DB83C43DFC24A27 -E772D8A805FDE4F4645178693D5CD29B7ED26821B4DD1AAB2D256693A99F612500A903C3 -65889A1266CEF14E112C91F2E2DF5B27A3D979E957C5F70C9AB7F64B88F2466ECA5DD0F4 -465D920F5E78A955878C261079CECD27783086379EC6BDA8CBAD8726167520DCEC08D65D -4A9BB2729462365F7E3B97E6432EC01F8833870F1877FAE22E893400A346BF8D8729727E -E7694035DDCEEF10B596B3CE9754E69560A1D8F61AE59FD3CFBD0D1CB94A14AA155C2CE5 -03D238912CA0DA82E700EED99544762C22B8CB36E4EE2C73738CF1721ADDF2091411F98F -2F7EB86C46E4DB9CF84EE208F6049F73B788BFE5B38328DB074752C8BF9B51327A7E40BE -F48A409C0B2377236D94327A0A1E36BF296A670F5E75AA2F4C0AC6815D20B635F02B6929 -D72C60CAAFBBA4DC377B5DD92E904EBC2BC2ABCBE404197C803F7878F33FAA8C66EA0062 -CBB1E24BE46D23AF9762C2050F85CF03084FDC271BC0910266FB693A4C5EE4057C2319D4 -3921EC66E5408A0D28DB2C094C92CE16A2A9802A3D075B12D15C0F4F4B603EA70D69D94C -102436EB6A835D4E9C0937298843750472396D20FD66A039871D21588EDF04E607E03A0F -E4671CF071D2A24DE7AF33D9C1E3124607854CCC014BB6980C4ACE3B73F1544846CBA010 -A86E003A464014699ADFC587294C8F64F80F1311F4E0B8CC1624B7CBABB7EDAC646C7351 -D67CDD61B352D8E21DFA5D802D5CBA52A364B019FA24579BA36A99414E3B018B8632031A -365F4A0E9E5CFEE1C936E546C11AC93A2B7EF433C2010FEB3B2F315D806F6D1F42FCDA3D -144DE40934AD30A14F3AA66539FD901C6A7A9173DD4B2EB6F0F546C43DB1BE141B1E3442 -E0E0DDDBFD1E6C582102C5D3CA9A856A7082530B3C84DAD4FE67C718D7AE874C0B59171E -2CB2F1BD37A1C4DBB3E767E0E844E6A189A828384D042D055A118DE26D9C5787CB81B102 -F8DDFE285F0D24E0CA87658F2DD9B553B1D52A37B0E0A1E18AAFE6EE4D0CA2E3CBBE5907 -16FB32D9030A6C60523FFCBEA0D682CFD92341BF5C533EB7084EB42EF42A0B6E7D172B14 -805780F54FDBEB03AFD73D2219C74CBC569573B5DA65CDF3CD11D8CD1E3E60DC1AFAF5C7 -417DC5C8BCCDF6E129DE171607901C35ED11B0299BF2104C08158EA843AE803B63CAB426 -842C3B4D93954728352468A44B6A02115782156AB7DE5FA01B7A2C7C3C69BD02999A4F89 -3600E0E79F60EBF221A40269A40904EC3DDE24A4FCCF92DCA20AF2614B11D85F2EF90015 -9C878BE4D889D1471E17AEBFDF34C29ABFBC8B1FE07BA33A5C6B51B3DA5887AF6C6EB0FA -A7F7AC8EE55FA82C66210012FF0EF781815EB18D1530008AD7EB0705E854B3FA44AA79C8 -EB7A91BC40EFD85DBB3AA61209C03D1C8D70A57AB608FC5EDA04465E8C6545DCF52C867D -6F2F5175EDF68957BA609B1A5E6F9FB15F628EA7F0D74186E278D45F89F981660029CDA0 -B1CAAEF12FDEF8C4686171A9FD08BB0226DB70C564766AF171C6D25A08C6669F71CE6749 -43F553CCBBDA80CD3C55F283F3068BC8070B96EA52D2853565E00DDD209166FD46C17B85 -604F4F4FBFAC1E7B3FBE13DFF9C2354E625FC87FB3EDE892C48BBF9D11A3FCDF65A29E76 -FCEBA941644FF4485A4E14E5749CAE0CA96819C9B637CFAE5B6CEB8BC390444763570362 -D8B397C3783EE5DFFD08EA0F09DDC3F1A29452B3287443D67C04D6ED1E61B2DB7921A52C -7D25073B58CBA2699AB8578FC49CA9D550D482F1BC7CD283BB8B02390DDEFDE7CFB447B3 -FE99D6FB4A225DF571790CFA6FF35BA51440BE6740510D7BF8CD55FE16E6F394FABBBFE7 -2D2070BF9CAFFD58FCA0A70BA2F898511477A950293A2197A3E8A7E3FE7AEFCA9DC6704C -0ACAF82C39784D0D800F52E775150D976F1BC9B9D91EA99E44FC9CC9EBC08DED6F939CB9 -86CE37724553657133AB4903D0950B235130395EFFC27F76466ACE37A323358C6F935EFB -E8109BDDCE9EA7B22F92DA7A5F5AC992B4FA798C0F670C0467A63FE7571F707053A11071 -F6BD8D93C1B32F1359A827222080AFF5940135A1DA02DFC6AE1113A93E5FC5BDE02F9739 -0FE65F8680B0999EF41AB024E35A88876DF86E413AAFBDDFAD693C0BCD4654FD8F5B9A51 -BEF91593357F8F16B7C59CF6DB3E5B6B5597B8F8EE953FDAB759EF5F42B8D7E0282CBCFD -DD13062501C683FD109D972DBAB823909E117A55B08E20776A79BA61CE6D84AD8995BE0D -4D2AD126F6C195AF54998FFB9131E1F3DFC61F6AAD217D0DC339BF8DCE17D074EF5537E4 -7EC63E4B707D0048543D939DCE6852DAF6DC1FCF95D689441B998C8A5EEFA7DFEB894B4A -90216B335464CA50BEAB87DBC6B3E23AEFD21DBA17B004D9BCD94357EDA82F2E388054DC -593050F7226E133A937F83462C4A91079B8E96029FA17A4162384ECF11F95D53F3984022 -B02C4C82A702F75C0C3F91FF94571981380466C8BCAB42C2D3A33C282E7E6F5A73EA38FC -7E296FCF8B1E4C24DB0E2F7F076F659EAED92DA4C9700B6746ECD85995746D648B9FCEB8 -FCF7DE89F299DF6A6D7DD11FAD78270D2F45D75FB0BE0FED1C1290B733212C1D1BFA80B5 -D17CAFD3F3FF5E504B3EA44727AF6F3F37DCED87DB486BAEFC2D7DD7DA55635F671895F0 -EE51D1102B1B491542C9F3CC8F1D1F14CAE5700DC1566B7B44ECDA0150ACB072820C480F -F92F348C108CE1F70BBB830CB9BC69A3F3E4E52D191BCC2BCE475734B38238725E3F3A01 -84AB62B13458F221C2C505587407B5623B23FE444ED5BEB0F37CA4265FEAEFA74CB365D7 -401CD4C247AF0DE67280316545EA659C2401A8D8F8279A8BEAB4FA83F9AFBFBA32794C7C -A7268F6BD3CEBC42895E3317C1E8ACC0D82735559AC7EA0378524E879BA243CD6F938C6A -6BA39385EE7944805C6E3D0CEC912D1D711D90459D032D0F29DDED3320E437A8809727F0 -E42B52CDF7B49A350D8DF3ACC7FA81AED6E290DC3D40BA6A7001ECE8222BFBF2E7D21AF5 -B5DDDE2E531A5042892CAF60BA4BADD60AD61E811BCD9D7608E00CEB90989E48DC676155 -EF3D790B8A4FC96A351DC301FEA7B959A8CB44F228B852CBCE8F9450E4D288E48C3A5D6C -616B9BE51F38E9ABE16CAE86549316ED8B58E9B0D81E7994BD83A314601CFEBB5413C580 -399D87BF9ADE8D90BB6CC68CC36972159CB55335D74EAAB882A1C3724A2707037E5098C2 -2A6655650DFBB2F87BAA1B3EFF8AC76397A226B95492C64E648FFCC08F8A552E333F1E65 -660AEEAFA3B0296CFC6B300D3C6FBDA01CEE297241588DB27E449C03F0386EDB5D4DACD1 -59BFE6C5915988099909AEFD10008CF1BE8EE8E9F1DCD980DCF0394503177FF49827A3B9 -D9FADC16F0890A6D330146809CB5F3823DB1F9FE042B95146D6880EEFD113174FE00681A -697ED8BCC6E6B61188903CB3CF5F6248EE181772F5F873B671812B8FA93C1089BBFEC5EF -0696EE1715FB37348E75AE88A096C1141D19E7AACC7A1DFB282D180E8A08A8C92610D2D4 -E3ABDEAB7DB34FA630A8F5151DF12269454146FF715DA88798240C01F82BCD3BCD81C558 -E6CA13767923803162A8EADC641182B71A205CBF91D93ABD4D194E327234F4FA56F4C496 -40BCDFCCB269A49F449929DE799A99D15460CB9C131CA83204DD513D68F10A07FDC0DCC4 -6B93F8D87EFDE4590E3FE360779B5082401493763FA73519E8CBCA4F815AD8A95BD10135 -3A1F379DBF7ABDACC2E5FD6CBD2AFE90044D86BCEE408AE8A32C89C224EB483256854C72 -E68653701EA2AB54C09F98A365FF042C4018A0DDACE380B54FE568F3C72FF16E73A594C0 -E9F3A228171F6EF548EEB0A2F52A1EF48CD81AE008B8251196854A03D4474EF064C3B9A8 -C92427F5C3297BFED28C85C235272303BBA92E37257868DA3D4CC651A8E8B007AB388337 -29587176479D1F6A95417EDC03D9AA5B6FC390DC64753B279206DF1037A26F38A56D8A5E -97DA5E3F416F12FA14484C939EBB24CCF60CE0CB682821439DBA8DD842E6AEF330609AD0 -756ED23585F99CA1BF6A9D1520682D939B38408BF49DE661E632FFE11A7B9286AF457698 -1F26E731E8576D259BE89AFD3E96A0872F1992FFC3D5687C5324822D09FE555153E1B03C -7C1FBDCF72E8B369BC26A0995C6B5F5C3F0B6505AF28033E46CCD32D396F1FCF2BBC314A -CAF1BB2CDCE7B5E89015E304E1ED36853C9B8C4550894C208398A4596EABD6A675EA1716 -2AD277A409A2809727CB0F7D02F74910093346FE37D14EE063F6D3B6EF9C682988ADFAD4 -75D07035999A7247440FC2DA98D5EF04D718281C8F36719ECF7701D2AEF8B845B983A1D8 -46AD41CE818E1427A23A2E5F842A4BE05A6E867653B6D4530E40B96288C1FB0C49F47CA0 -ED4CE1456C3582C385155F309A5EF60819E3E2EAAB741278811A9DFFBAB54762ABC5F045 -1841D0984BE8960BB21E8642071E442D5EB7491F2261C855151628787A4C699EDA1F05DD -C578A9CB506FE5308A90B3752D067DCE9E715F12F662C5303CB064B3F5FB46358CB4F803 -21D29935FC49B937C066A1AC82913863D01C1FA85156CD0869652350602D766CB27BE412 -1E50493C0AFAB232057614AF48CBD74C4685360FD02900F8780AA8F0827F2F7E0B0B0306 -80A4CF3969036081462D92FE2DDE06DB413B4E76550706B43AE982AE2467353B8059A32D -B35DC0D388D6264C573182970C2D0526A6F57AFB21DFC59D22F8D791A214F50D716428A4 -BD37D25A5958BFAE8DABA9E2438270B90440AC7DCD9D4D8A3AAE7E6F0D54FD15D1C8C1D2 -3E04E9BDA3CD2D97C1DE1E6499DD2B2C9D1B789D600EC6B2B9E24739D65D9C8114606645 -D8F2ED5178E3647DC8CE3827E53FFBDFD5948F7302AD1D70987FAF02E5FD03A1B9CCC6AF -C658B742C88DC2547B3A4EC4CC5414220EAE69E23F7BEC39DC476D24331422D0FF109416 -CDD40545F6802040ECE231B7840CD13B8611D88A25CD60BA268CEFFA145592ECF8CEC07D -A9846135D35E035CB55F46FD5B9AB7D60CCDE973A3A51AC2F0314471629CB80CE30E6ADD -71B6819EAE128437C1AA243E869CE668C8BCA434D5A1156A41581D27F3B52DD26BD4089C -A25EF40DF171EE2109A17BCBC93B05EAC8418F4E415B6AE72CD4211DAA97780F11A4FD11 -A96409AA6BF06A69E6ABF9D31FB157C698F9CD86DEDAB707BA74814C9C96BADB58EEAA87 -3B4D4BE0C4A6FEC42B9AA8A70F57DE8399EB5D574B132BCB2D3FBE7ABCB621BBC3E483E3 -378CEDBD2FC9B758AE746BE44EB4973581E0F402C1738FB987E7C7B32FA9E3DD3E822F7B -7B79A5D67E0E7C455ACBB780BC94AFB886122FEDE728272B619765C841DEEB915C501C9D -5E162E25835F660E33C017C88A2BC8D1E93D32CE0C43A83C17937B7E886810F774215EEC -57A17AFA1F89AAD6751ADE08A4EE4A6DE1208F3A35D927850042155EF6F44BBA6BABA143 -BD726F652D7F8EFB9EF14D281186F9A8BAE057F048D7914429B7BD0D95DECE36C48C6F17 -599FDC8F31FA2A0444C683962895C68AFF8B343B9CE4703A2761AC84B1B31946A7C8373E -A369BF33219296783C5A3465179E1BAFE1BF8443801C972CF6D28BADDA13F78986F6DA38 -8CE4453D5E7AC0CB518D5C889688F3E54C3C00BAFF896961357BE6B4B487064A9660E353 -E8CD453B5B828AC0F166B50E0C1CAD4CE97469403B22EB2C3FCA6A734706EF4CF7F9331B -53E13D0A5653473636154D94CCD625F8858B69ABC25762AE4FA1763BCEB2989CCCDD275E -ED8E95DC14500574276083F59BCA0A2BE8BB1A9A5510C63FB48939BB2ADE959B0342E759 -F556A6BEA0D78099719C9D4FB5D8741598522D483B77155C9030D252E28C2AD364C84364 -39A58ED8E27CCB1469CAAB4CD8B7293BFE89A7BB6B72C4EA5D7C29EBD5B2A9DD66BAE6F1 -9FA45E886E5A79B5FC7A65438695659213E0F4C7A6590911CA0C976668C7C2697C4F0A54 -4E3240D23DE40D53274415F5D6CA333CEE4E6E04EF7C42E84DC0B8F583F83185E1E1CA10 -D210AE0816DBFED7AA382EE1CE6EE1ED7B3F3AEB25DA4B1F3555F39BA2DA5B87B9F78B57 -9B65915E2440B09090E4E8FB0C342933AD8DC8BA3DE1340F00A037CBC4D1E775D3555532 -F828FBAD77499AD45D007BDE4AD065F462D727AAA69E314BFC1055C5FE9637676246DB67 -A6BBB7A78AAF4DD18611871835C218A45DD0852434ACCDEEC60AA4DC48D752FE4303AB75 -654E270D27E951410DC5354E85590305BD4B0631C90E369D992ACE973879CB962EC25EF8 -D01C2F4BC4155F409AA95E65B89D4D1AF4989B6BC3681E913CC4CD798AACE97678D4EB0F -131D6C2378314EFF41C585571F3901B0D7BBA1E30CD7ED9E4C706446D55B9E269FF75547 -AF498C716FC0A951DCEBC8BFCF05DB2375B79CC1EDC162ABA073F01C06C0D64E4D17A692 -98482F4B4C1747A08B78073D590F5291936AC3016D5C2CF84DD6D93CA7FBF9FC7C9BCD98 -4EC0E07F03D6E632100BC328068B2C9C8BAABBA4E0CBEEE49D37025FD0CD005FE50DE670 -F7BF621CBA9C4723F3D7A6D1BA5AECCEA901403C03B66F6F92D403E4D89C238D75946080 -404B79D35F8D5E0DCDFB0E22AEE8B6BC7D994D05B7AED76A40A22DF9339DE4CD937D54D1 -E09B6660992B6FBC6B36791D5AA53093E29C78BF59E0D137B06FEE0A553939725EC59380 -82954AEB8EE503154E8B56F4B45B6357402D78D1282BFFD0D38D8940F0B3AA1D48419ADC -33E11C96A48FF09E3A6CCBF7C88A0750868FD61D0BAA581E6A010BE41462FF3F71DE3B9D -6951D2771373AAB7360AB1A7EF6C04113553AA399FD21B02E1C90FD6FF8DB09B6F485CD2 -EEECFB5CE1C4E0F3675CD792BF28D726C065D5B8BEB92681072CBF17EFBA31BADD5AD401 -C3171B406ED57D757E59AE1C61AB425A580C179771334CDBB633428DDA41FFA7E6BA6668 -568930B3AAB9B51EA7E63845A2D50CDD60F8F60C3FAA5549626895644C1BC9DDAC415BF7 -96137F82FD0FBAA9F66269000CE1421BE1F617564FAC0CDD70AB2B2DDF5C804540182B4B -EA2608F4C00A220D73EA038B76AAE89BDB8B6496D3F8CFC7FA60701303795C1BA8EED486 -48BC6DBBE06A28E84D4151F85C790E5C6C7862B7B5E1ADAC6EF0C300B1AAE19F092A0D2A -160208C31B9D36A334511C10339995BBCB3C06D5A7E0658B6E7988FA3704C6E109EB3E60 -687983DEA045BCF7596F869A5FCF88A68982DA5FD4E26F72E758C60917094E7A0BB9E32C -B16880994E573A73F4CEE17243CFCBB4FD85F64A249B74454654E360DF55D6BBFE5DCBE9 -AEDFF628B1F054645AFF8DCB417683CAA103C4FB59E9FCDEC985F0CB8FE454B245C42F81 -BB62E1128B7581F1634D63FA0DB839B631A5C46A6AA19A0586FF8E1F36639B416C2E348C -2BC4A28C9A4BAA5274EAF37037C0E0B1F74715F5DC6040AA6BDF49175744A7B214F90355 -2CF60765D50B7A92B7CF05BE188C4934EC815F2F3C274D5DE6945E5A25631DD732EC10A5 -D1D5911919442FB0BA3B411A655B8E9B2937D2EE2B317A9F8656898B2BBA3C93BF7FF001 -FEEEB4701A01F6493C6AE310789AAAB18E543F822AE6389A95F8E07F6948D90DF226DC22 -3FF6584CF81705161648F245BF7A95ED126F084190D003824AF91827912987CC74BBD073 -5898D710810A4057B652E46548031A2473758D5157BE9F657D6AD6E598FD6EA797F66E6B -AADF37C84C671A8938BD6ABB7B9B3B793EC1B8A70C1284D8C31B180E68BFCA71428EE2FD -D10185264F9AE8049B64DC56132A74B609867D3B9D4815D1BBC83A6CDDE66504F2917544 -5FEB2E0203BE174203BF266862F83828A462BF880AB22EDB59CB180A8E0CC4259E4DEF1E -1F3114AF8C03DC00C7B1F39027EBCC62D308E1A99E9C0B4AF746DB1BFC872B10C8D1275A -93128F35E8883DBAE47AE1EEEC72ED408ADB618C32C9D780AFC63F1F4D3CA1784A0E483D -401BA2C3E2B8B9A13307028DC563727C72F97C2A7373F9B8B664782C69999D827E4EA508 -585A47401D5274B658CC683401DB1B0977A4214BF0E747116F3A2C06F75395A4A4A5D8D2 -68E17F8AE00E264098436DC1054456A72D426FF4DD84EF7AE9F4C49434CF6C9218E7B91C -EBA8EA88CBF22F4F2DBCA527FCD11EA79E4E5719E8FDBFF5ED895F5E640353DFD38F6D11 -BA785ADD90035A3D7BA68620F26CBEBAACC14E13C904F0FD147D0D6326D94B42748B7D72 -94BF4F97386309EBC593B8BB4AF0D09C2EC2C666CF0BC151CE7F7F763FEBF83F521CF115 -AE13A8C069F3188140C2E1208BCCF8D05A3A79FBBE8E58232A7438DE1EE565B56146C9AE -4DC0CA21A5F17B05229FE0373C3291266A413C382CFB63365ECD9F80DC6CFF7C37CDDB9A -98786B3130B61DDE400B3383D300974B9CA0BE9326C2843267B805D9C2BDB088156A7641 -704B203D0485852AB3017B851D63BB4876A3CA32AB30B87A3A9789D10DD76168B2FC0BE7 -2DC6037A9ED4315DFDAC2691ACBB975B777FA7460A851217B7328BA52876260F0E9A43E2 -962A80174051139EAAE4773184190EB46E72554267C0FD1B9388271B7DED405931F65479 -FCC4596027F11BEA64C684BCCA6896CBE3BA2CB2F71C1AA16B55F63D27CC239ADEF62E8F -090863B0659D8E41B45B65F91BA24BCCB6FF5F37A03320282156468CFE46F95612300B5D -1D811C58AE9DDD905174565900634F0E20AA6D7A15E43872300C876087B005CEFCDFBBD3 -10D23C04EA817DE15F350C4F90207637DDCD73BE0834A1651709EC3EBC1F7A73457ADED7 -68D88A2653796D132233C25030EC8E8159D128E2260D60F18097E68B95A56E3C590D4F0C -E778F72FB0A5E182264651B3B93BB5115BF14FB1D71AD9C9EF953344C4E7B04B16000DF7 -0D8500FB657C4D368B669D92638E0FB331EC3AFDC59E75730FACB442DFC31FD087174379 -B491511BC6727E4C31C2FF756C409508979DC47972A9C0369BB61A450BC888B21213DFCE -0FB400AAFE8B250112CFBDEE410B03F344E1C6E3A5743304D23BB7897D6DD6A052346AE1 -66C20F309083C0CC33B1B7D4909D8218AACB35134DF67F72752F697C4A6C568ABF2A6BA0 -6138D0DC6FF73066A5E9E559E0A25A0E4BAA0F0544D680C812E16F70CC0F3521491ED1F9 -747958D476519258AF9141DB94B1599F78D80AC9FB2AF393CC98B307DD3DBC5BE037C41A -CA0450771CD31D126F3577A82E0D32E1E114753962A635DFB27FA9BE95240B38D4B20E64 -651847E20DB85F80D062E80D1377EE0D6A751B5C5E5F89E6A9F09DA05C3BA03ADA1878EC -6EAA9FB0E3D4A8E707B0EF507256D60F76E25B61421A4DC14CAF733B03F43951CB3A4880 -7664484002BCC03695237E902217ED414DBC57A89802EBF93D4DF4ED83E5CCF8A79BA8C8 -92ACD02A4D1BC0BECB65C3D2CBFFB5B11CC143D37EE56A55338854EA43506FD200B7F350 -EC0DD9A283D0C46C5D3E728F920875DE6D3EAC17B025CFD20823D2C435C120D20F80F948 -6A37B71B68462D9C38AC003E66871047A6DDA56FD5CE319C209DDDE831FAC80D8C6BF498 -DC6B58592451BE41740BEA4766E0D71E540EF881A9110CA16E9ADF2ABD9FF296279AB2F5 -CFCFCF8020D42B01F4CEA91440C7634A4B901E5B2377D6F37174C692ADEF3337C616119C -AB1735338F2E3AE72B22DEF9735318CF8B69F23E110D8439365C67CABA3D2C16FC96FCD7 -5076AA46F4F5B0DCE6E2D5250E2026609A76C41410B8CF45DC8BCB815E45C07F0C248BAA -FE71A474EB9CAC749EDE8FED1AC13AEEB5549AC306B1ECF05DAE05E5A339ACCD9FC8E52A -4EDD4E2E5660CB8640D7DF392BF2CA1B0864C01472B4ED4A7649719276F3709FDF5B890B -6150DBEE2EF12390B63FAF9C65AE46AF648DA2CAA1AFEFA6982E07C63F810D044BB122DD -2AA67ED2E98BC3B7505BFAD72E05E228FEB9FFB56068FBBBA1E8193EF539DF257A1D3019 -3B2E42386E6017DEC0593454C76E13DAEC50FCB81BA6ECC997225B79DF89783784083F87 -BFB92457456F60D9424C93CEDD40D4D462359E7060282A5A54E3F8F54C86CF6740A8AE60 -C66DEF9B52513D70B64FB40671EB762780F36180F14724069D029D1B43DDB672A5A6A9C8 -9BBBB54CE48D4D25E61A670344B4D8DDC7E57ADADE6CA7A1BB5134276528D0450E5DA9C1 -B8DDE79D25D3DDF220204561E67855D168FD7ADD01F497AFD5D3E89DD83E069486F55B59 -B91823689873ABA14D5CEAC606FA8393F1B34582F871B6C4131B9C483A4BBED1CD69BA47 -37D050F57ADF9C806CECCDA795101376838E893016CC92DFEAD0699E6BE626FFFAC028E5 -462A1E7CA9AC3FD199B4C4FF894A3E695E18646BA33B900365CE6B810C7D53DFCBD7F8D0 -D6DF20F3B09ABD2C7E862A5C8280E55612343FB741297A6BB95FD9423C4E0602A8F8156E -365AB54540AD5449FEB3E4D13C94794F17A0BD06D9E26DC3833C87FAA477041D1394E0C5 -993507E130C4F60019FC0B4B74652B2BEF4A9603FDDB3A534001448A8F691C0A97267826 -1CDBCDF47FB4B0A7830B434F180625B451173BA129726834181EAEC346CDDF68F32A57D1 -5ECD44FEB77C2054908C6F6CD73DF94E4FEB47EAB786106F25CEC7020AC7BCE0C45F7935 -46E02937D310ADA5C46379838E266B25127413F0AAE1AC370E3C753C6A7539C8AE525CE8 -9BA7C49158D4205E10C054DF541B7472A0A6040E68897ED029F42E013E0B8EA547A7612B -157718C7ED485CFE6CF0500C88A0CA1C96A2320535EAAFEFA930325B59E551C8D57BBF90 -2A5A7785E69CA885CB7456ED7D063C93161B7F0AB5C4A33B19CD8F9260114B75BBA018E5 -CFD6EA1CA19DA6A157C632769EEA695B634311B4168E776F9B81AE354455AB0E9BB355BF -1AD45D85173062B1B2E66F2820512ECE3A912A5383AD544FD4B0269E30EE1D120EA034FE -5257DD2B857C4812CFCFF94EA3B8AD00E18C2AA887CD8E2801740C69E148DCEFB34B4897 -84D875555B9362A35304998FBA3FBFA98D6902DC326F0F407751DD3ED02C77F9B22D768D -B8C3BE360CED4964E0D413D9B288E403DC8E6D89EB0B68B4BD3959B151B45FA8BD1967B3 -70D20BC10CBBF7F626F1B4C3F125833567B9E88DA21EF2CA6C209DEC8EA977752467090C -0467D01B5B0EC2ABAD8596A3A342B120A7E3103B009E8BA2B95378DB329B917C95587A82 -EF5F72890BAAA37264BB4555F5C69D10A4E64A462ECA8B4A1BB166D88036BA071BC33DCE -3E79FC9F144BC2E446B720155812C06F10752D1391963AE98C4CB8B035C3C8E2F7CCC529 -ED8AC3A052DEFD0302D1F4D5A1BDA6B042C1D90CF84123DCE6A7C29B3AC8FEA16F07A210 -3B2C7098ACFE7FD92682FEDC1132EA886581B798496D59B5AA47CE3BF3A9C7CAC6345386 -F60ADD73B0D52642F4E87461B1C2792155D2123D0D7BA43904891ECB1573D871B973FD0B -52D76A445B55F960BCD3AC44BF762B7AE12DB4FBBB0409C102445C759E7738C4D3FE2BAF -B97DAEB3517F5FA545180AE55DD7D4A0BB03EECADD21902226EE99A7156689824D02FBFF -41FF30B9D94D14348BEAF7D3710725E9A8054DFFA2794D7D5A90482E9A49600885043C5B -E0E220ADE6CE0FA63C5826CADE8A8363440C47E6E7590CC8F5D445121E8F8B947D8DC4E5 -DB5301E89AEA62B903ABE3AADD4E93A49A83B0BEB040F7F2C320301042CC9D31CCCFFD70 -32DB766066FC83EE7109C6D8DA79610D5E1E94848556E4DE9FCF55DDF8BE524361A4D673 -6F09CB8AFF3347C41B9397538ECF26274DCE7A27E76301007A492E0C6BECDCA0B1C9D1E5 -345AA204F29F361FBAC0211BCB444F8D9B9637791F5D3B869A5117CCD73EC5124F1ECF23 -705209F4CA831C5AE5BE9EEEB390A8666BE40363642DABBE28D1E06182A95ED0F7D1177E -D3294B4C29D8D1FAAA210543C3850FBCBAC813C21AF5D62621623DA41A27F9DA0ED6B0C3 -A2AB61A913094FA2574C52FA1195521962C8D6B8DB2A10139A9C09AFAC133A8BBACF0A86 -01F38217602E70DB3651DBB083C791E7317694AD1F50FAE278155390264C32975838DE33 -CFB0ECA1B0BD993C2A02E1DC2F46293018DA3AE825AB81621894620054724C3A8D95ED48 -1E899F972E6537B21FFB8A4C55319D15A03ABE885C333BE19ADBC450D58C5DA2B76DA6E6 -2487A71FFD2A851F0551F17A00D165FFC44F204565FD24B0D11C2C21238F5D6F64277FDB -4D0704DD6271C69F4A5CE05258832BFBB7D303C00EBF68DEF694D77215084C74BD2D89C7 -8FCFA635F694723DC79E99D87F03ABD7A06BC1BD7643092790AE2D15D63D2C98288AD284 -7F48081116C31D98680BF2C03E4C2FE4DA45851E4FCB6FEEA80294ED5709A796716B134A -8EEE8ADE6C3709541E3D234F952B4B2ACD1422756B8765AAB9C32338736207BFD12DC05C -4D7496F1AC0797D5A3047F9449A8C5237C75EFFEB8E157B262A833BFFA03A26CA8AA1188 -84426DA94B43BD21B1028EB2A6A30F41179DA886DCBE99AAB28A1B329BFB743ABA0A2F4B -B4C400F1F3BD3C9A0109F63EE563AFBDC1591BF3CFDC863429A79F6E0A21A749A934EC7A -08541245B9F3CA401EADE0438C18B9FA2A78B618F38C611F6C053D2F6A0726CD20687DD3 -B09863DC0DBAF040D15DE51397DDEF2712F688D291B71DB3F59A7D87E2F44FFED1144981 -A11BB9824B1F4FB6C9A1CB11867A187796E5076C811A9E085EB5C202E0CDE461CA541CAC -D3FCDB4031FC78D7410C4D1DE558A5B697F03F9EED11F731678677448420B876AF142242 -574C740985FD2B6038AFCF1A81C4D89D00C73A09C93AFE68E5158B06B1E4A5122A371687 -93C5744583791291A8B8C2CCADC8C1BD233285F91C87566E36545ECBF3A8D5F9B3721292 -8BF2218F2242E3F19F91120CDF7D7B118392A4F3742911D47C4B6B2A61A7F79378DC8DB5 -9DB041A761DB0EFF44C948341C174E5C6660DD5D3E5517EEE0DD88A655F3F9524168CDB8 -AA2A506EED7498CD8A320E2FA42D10B1F16F8FAB5B5E85DEA6DA3005ADE58DB47E35C71A -C9527AEB0DB1B59D7DBD35A5E5C3643E17139FE1BAF662C7E88031D01A9BEAF71A18DC76 -F8AA4EE94C2575C438BCEDE9118D5124135A071E3DC0B103DB08D7277EB7E9BBCEE953F9 -77E01A009A031D4A204B87C0F0BB722508B76E4F4ECE45295A2FE89A1DCD981EBB4F9877 -246527356F2E8DDD3A67C8A39047F4DBD69B37112BDADAB6342FB6C522FA37CE74FD74B4 -D37D919B612C91586A2F1EC2E1AD95A5DA5F6FC0E260362765A262386FD8B9C27CE5FA84 -EF0B7CA9A77B1C41DDB5CB9450AB1366C00176A7D47DA6E4BDB2C1C548426B69987EEAE9 -66F4A937FA6597B2A1F2A690C3B467C57DC1A6E271B4B4FB7A60EFE602B5A2CDEA496F54 -073DF69EE58BD31963B17870B41EF97E852E286E1EF07D48FD2CEE44F51FBE8FAFE8B171 -82DF3D6343C85AAC1F58494274574A6231652AA194027CDDC257B942A7FA1E9002E9D75E -80EF552962CC5DD48735A14C8B81020C167319755636653041031E89BD815A299BEE48C1 -626BB77614622D88D310B0E19CB4A9E57C174BC369BF13C727FB452170D9E830ACCA78FC -F7F0148CA9BC1EAD7CA3BE325B60C676B3C5AAFF6FCA80FBB8737C7BDF51549439E06B38 -79D71DB53A757EC2C2D66FFE2CDD0C166E2981980AA2166112BDD1B14C19916A14403BBC -7E0FA36A3818F6B4D4711BADDA0B113F6EEE39916EC8952E6A7858BC65BB175488A6BB74 -6E78C5D7C565EB59ED211C5DDA7443653F6467C403F9725AE83953468488A6EA8237CA9D -538328329A8B23D3C96727A7BE68B59048E394D2BD3E9B5B97E6C88DB0D3B2CA42C1E845 -9B375667990B8B28CAE32BB63B8973E40533D1E5FCB26B2F680F985DF33F37AE6F32B9B4 -CDA270B0B060C8E511A0220EF06F0BE429D2B977A3782A086676AE58C244D74E364533D7 -467DDB36A7B93F27A9B729BB3F0087C01E6E38ABB26A2CCBD35F2AFA01C1A085535F4427 -521B968EF7DC76BA612329090FBCB6C99F73A61BF1B3D0975F2C7457666994C94C5E6FCD -4D4CCF29DA3E355CC64034655471885713804F44081F1F4C426670A0390BA6D2C25977A4 -91720310D0421B3D5FEB3C88BBD35B2D4132497904A74C3535A15B924023C464CD70D227 -F28490233A568AFE309F6908C0F369189803ABA18497C20B5E47D5D969DA3EFE03059316 -C0CC37688CC42783823A1618AA7C0AB924CF1D4B961CDA7DC6FAAD0E8F742D33ABC15730 -CF0E246173CD0A8F21466C9A4A9F86EE6ED508BCFA0E4AB5AB079F1EBA14D78E4B562F81 -4A1F870260F35D55D415CD2C10EDC209F23BD8A0A0ED6FB8EE11C30EBC2250559B02221F -7861C08C18BA12E748D7181EA7314E355E27EBBE1B3C00C69C549D4442998259D9966E9A -6C89F9D8796A0DA2745CE68C3D15368621F9AEDD74264565EFF245EC7D5E235D524D19A0 -6D1512B3A823AFE1944DEEE38E6C365D8EF2917C382A537FD94DEB1F7A959A69A3990033 -F48466A241B4B39E8AB9643677BF42BFA3080B8B389DC2BD74DD9CF7D2D466CAB7CC7EBD -33FDFC9CBBC0B2A0D3176B3D5D9C78B121705E9AC8DB4B76711A8D299D6EC76386C78241 -FBE1887604B50BDAA81187B0987D0B7A2108A32BAB0406AB8977F4EB25957E88F93D0CDC -E9121D49CD3FAB7EF4B4627A731C43E7198EBF05E662A2A81F46E0C55510B6D47A5363BF -63A34E483316B4FAB3BCBD0F190F554E8133E1F31745424E0B29C031D84F24A1250CC3DC -28384EEA40BDC069C457BD958A8D2ADDDE965903B436FE8BABA1D722F82B6BC781980B54 -86FC63E2F918716776F756BB91752A0F591F518CD941AD6453AC1D5ADB8016E17F0367EF -973A4F6DF74BDC2691457DB95EA4C5729031B8397663BD0C4388B8E514B279F0F003947F -9DEEA6E76F6C3D3BC3F64987B5AF5F7D520BC76119DD36265453DF598CFA741E9A404704 -4C2AE3E1E7472CC11BAA4D5A32304447DCE4A766DD19A50542BF90C3F1F93BA6669BCF83 -808634A13FD2AE46048C42A90A8D0768E3BEE2B902E564CF27FAE1AE71E5862A8554967B -1BC8FD84EDD3410EADF57CB3E4617B65B26A2B90CD6D47E7796217B51BA60D29D81F424A -4590B5A8FAB9B7404CD142CA01B5ECDACF659A4B4997BF1D1B6F9847D3BF5102CEB53754 -1410448BF07E8E49786A718F56FEE3966C4852147B9193233C8008A2D2DFB70448078B95 -81FA5F9CFBBABBBC5D7E6BED86C9E69E71FB53AC96FA096AA8E6E46B67BD96A58A18AC48 -854D5C6466329B0A9C7C910A0ADFEC02A784B3553FC43E4C2EA8E1382AB1D9C103CD1260 -E3709CD18400AF2936AF02BC37FC32054A73CBF36B98521FBCF62D4F25FC7E0F3989B25C -084FC5B84F16F1812B52D7AB115F0A80DA3D846A3DE4A83C512778B469CB887EDEA0FC37 -9581C927228B510F441071FC705C98024CC64E9BD21CD7DF90BAE4D271DCEB183FCBAE68 -DC78E977A8D23206CD3D7E3AEC0E8607E24A431C6E24F649370C897A65FECE2BD91C7D82 -F7A1CFA96AF95891FB8A2806CBBD2AF6DE7205E8E7269DD0E8703758F93D0BFE29CD178A -62BE495A0F7574EDF1679AC65A72C43131B63AA8507A225C447CB2D71E0974A1405E5CF2 -E13C7FE15F3FE046377500E9C4A1D0C2825E49B8AFFA5B54785B39D27D181B0AD38E0E1D -35C03186235676EB44E268F6308B17B45B2AA604CBBD05E33497F4788E969E01EC50A3E0 -F8A6CDD1CD8950505828E16F2B85AED36EAFC45D9466045D43AD9B3B3B2B92D5AE0A383C -4C0D8C27BBA70E4A6E7F4D134E4D684B9AD5BC57F19810F88F618F49C66DB98D76F950C5 -25AEDFFFF5641D0DA2532994BFA810022AEB15505DFEB561227DAF7FFC9B2E1578108ABD -66424877BAEC36FA8FCFCD8E23ABD236399F4AB2FCD5CB2DC84B80ECB9C6EEEE7271999D -37272C0F8D1A306814BA2D302F7A3D8C08EF5375B38450E852820875DD008B55CD50230F -9F1C513684B5A7E0BC1C992804AA638CBEDAB8D673556F9ABCAEA81059B0EDC0193FB823 -92E4D7B739E8B0053F84B7891434CDDF773E15DFD66122A300E0A561CBADBC15058310BC -C9E44582D513D63E90832C521CA6F7E6C70D3A9F461BC33908F1773575043419B5310F74 -1FC502C5E52D7CE3421D0BA35BFEFB54E477106DFA69677F822FEE85CFEAA54EDF1E641E -D5E73F733F3021A0CA6F5CD5EA5ED8C09B1F3B1CA953E92A4117839A678572DEADA59C50 -BF67C6367BB03CE4FBFEB71F652918939FF2B61C6A89E2278D42FB30BEAF2CE7E6ED6D59 -CC0B941DBB15F4BC70AF627817277ED59A95A3FA22FE35AAB686FF442237C1B4A9FDF6EF -62E4F90266EEDC96AF7F7D538DF26632B6189C2C74F62106734308EAF30D9A6E25A8FC26 -12180B467359D44B592BC4679DBE01856CE65D2E0FAC04DED5207CAF770198827720A708 -E0667AD7A3EE70879A25C40D468E307E01C4EA8B0FB67A854674010A90CC42CD6821F717 -19055EAB05AF9C9856C6FB31850960CDFF7CBA473C4098A45A1E15C533182D146B64D9D1 -BCC4EBE36F926B2D4BCA8737364CA448CEE8A27610425E06420404B99D7C2FF4E02A90F8 -583262933685471C74FC236671D814DE1F3016BBBEB1780E4DE6489CD71F5DC6DC2BCAD8 -D742B695074F28EB6A91DA6977D8BFEE0A7012DF751455F36459FDD63FE1D1317858A2A0 -EBCC845331CB6BC509661F464ABB2B3341D1AF150993D73D547DBE8E13A249B4CE85D9D8 -3F35B2B7AA450CE28CD22F826F69F7B1F7AC8D802D97FB20536ABDF8CD275E67C22674B3 -1C6B69C7C8410B93FA3FD167764F2DE0DB966B9BAE9168554D718E00A5017263D49F1CA3 -443F1C126EA11DE16A4D19BFC9BB8AC52A5471D755EBD49B535760254143E163B22940A8 -0F2AC318C264DCCEF794B02CE91CFFD152416C37AF6F7F1D151F4143FB808D10D635E811 -CBFEB3EF3C291F8CA480769FA0D3D80E1ABB4199DE5EDDFCF720D95B1F7E57B80D529A22 -49AE1E2DDCDD4CFB478E88CA5EDC7C4A97B7BF8D1DB4CF194227B699D1A5884FA7163E87 -7117F2A46897135F0202B6AD25EA7BE2AAFC933D1E3761F0DA9432A72BF4FA0755CF555B -7DC892A63879333E1D5C4614215138BD11967D5746163ADF35C13D81DDC09045989E9AFB -668CD3E34572836F7ED5981CE6ED895DBD5B7BB1AC7BD9A4A197FF9C400050A97F8684A5 -E9732512D1BA6C9F4EB27773CED4ED9E63DDE7DE003BA708798235CF66D0C7517AEDDBAB -F667F6AFC423511BC344A8CF07EB7C697072B9CDB4958C40685DD2C6317B20ED0CE5DF6C -204B8029D48783B1AE8EF5FABFFAFBB42BE9D26B4840C04FCF826CF6168DC1533BBD3452 -7D2AE02FF4237675F45ECF4C1994D45E0A15E6D03A3E399BF9B0821AACB73329636833A8 -B4937F8DF6DC557D20FB4C1A33D7E7A2411BF35BB0888ECBBAFC4F1DDDFDF71BCC627304 -C4F92B71BFF5D96A822DC9C71687C1FD37299C4BB76B7F2343741882ED86E05FDFD97CC8 -76EEEE402AC25F9B5945C48629A605632DB0E7D210CAE8C887718F10FF689AF3BC23E960 -A1872ADD99BDCB14CB388B4BED0C9730947ED47775DC9A2B028778ADD281B8A7107C7348 -FF35B6403BFBDBC3AEE99D2DF222D796BE4EEE6071ECA471DB5740647D136B49D2FA83EC -7C12E402BCBE75C7BE2CB2C058D041A3A390D60165866D1B84A5A21AD65E5B7313071ED0 -CF488AD4CB6D7BC4CE06B620262D4C3952BC443E10EEEF07FE3A1CC72F2921AFA14CE11A -40655EF499B2FEBAB39B530BB27682D3618705104D6A781ED1463EF6217F8DA8DB308E47 -2654FB4A1F5CB5A147B50FE10357E109DCFF49AC818F53621619B37A9FC57A5DAB97F829 -82D2A91D92888851F9C58DB754808668EA721894C859EBB4E09123B8E21AF0D4ED31092B -1E866C80FA135E73CB59677CD3E74925A82A6E8AB6A1E28E1735E2BBA3B79CC8D1D6531E -A41214CB887AA60C94B642AC36F9720A420E64F321A474FBB57576C2B0155450B51EB175 -D39DA3945AD41ACDB958DE15C25913F7C3D7C0AE3A6CB987835B26DEE2F92FB85E7B872F -1035CC7E7332A9418126BD493C892033FEB7A254B47623F8645C52D240C70F1FEDA77C1F -87A90806E9AAEF356EAC0758714EC5018B1B481B79B416A2D6DC92D7B22AE75894517C16 -C3DD09C667BBCBDD6C3D36AB00B636323B2B6116125F6319FB4C16A57764E8B879086C2D -F146DF03073509C72932A516FD7BF9F9B1936B643201F590D1D551C2C5D48BDC93785B5E -67F1E6EC0A5D14D59A190CF6894060C1953D2DB3C79F48844F7A0B0F0FDC3AEA8A53E33D -577B67E9213ABFB350929FEB36A97DE7658B441CBAB1F0E26B3FC5612202817A5C2F423A -AE4430703E9FEA99B861C4A8CC09F79AC6E6F53DCCEB0EE7847CBF73ECF35D4F5530082D -1AF3AC71BC3918496CE6AABC23D61A98D11BC6D7B40885FB6FF6AC67ECF47C6733390DCF -A88F9B9326B5D130874910D3E479ADA40777274C02847ACEF3AEE8E0DA0434C9B35859C0 -3D23BFCB376446EA2DE09F42AC3713F0673D7DE567E8A0A1B15A1DC88FC081530804B744 -2B0681289D586D9757631803ABE18DEAE727DBE5DC052A0A1F0E70480DA458FA96A010B9 -57E4D1CB0085713817AFEA72535EC98D71B4B9ECEBE04C51974D94F874B0E3E74D149C96 -BEB4CBDC17D81564C3C84A14F5130A08AC7B71F1A2B81CFF6682062EC4DC6D8E1BDC312E -ED6ACE315A2A28C772216C052947E079071314DD07BB321F1EC8322F00CE57D3B0E53E6A -7A2B9002F1ED47621CC255EAB1F3152D5CF2456764014A5DE60DD0CEBED98B584457377B -F67065F706978C6AA2914A68A942DF2B2742622007655BA8780AEF5086CE17B67B8B3AA7 -E432EAE81226FF8CEC95D0498BCC0FE737DEE690FEC30B80F8DD74F05B9B88794A54611B -C12F61CF8BBDD49F33C5690E1F03DE89937040BA0775FAEC6ED05026ECC6DC4D0A0EB441 -66ABCC55B3194DFC9213025725A8EA81A3290031FC365D3741922FA26E1499B93C2B59A4 -BC226A3F86FF1551DAB5F9F850ACD311DF36EE86E5B3EAA4579972223DAAF9E475F9BDA8 -4D95A89DBE06611D73BF0717D1FE0258086C1B97103CB62D8DCEA974B41388C00F176979 -E8EFBCF4FFE9144820AF24BCC47EE0597276455F92BD1FA21FE19E1D98E6E8D6BDD6AFAB -E61C7B650C109A61E1A3C6E92A6F2BD8C872A32DB437E2EFA5A19641608CF2D5E109952F -8B2D9C0F0B96322665B1698490E37E860900EC392CD42DD9AA6DE6F0E5A5EE7BCD34A538 -95D129885A10D9446993F5CFB6978DBA5B9BAB29773756B9867E4A2561AEA643414BA7E6 -00DA0932D0252E094EEFE73E2AB163397C2266CEC81ED1CB7724335E1FDE7CD753646810 -F94A631F2DCCED349080D4E9BA7E9585E3F52F77114012C081C806A447BA8AE735E406BC -532B46F55134817DC0B30496C6F5367A4DDB55FE033A236404D643C4C3DDF9D8DAC0F165 -C2B8BDA4194795FF0146830C21CC1E991300548E7A0A0B032BFBD828A960FCE987A5ACB5 -E2224DCCE6CEA1F7C6BE69248B6044ED317F1F3C028142B52DD60DDEA986214D93685E9A -F3A2D9F7899A614FB41BAE93640B9BD10CC3981505415BD61325AE4E2EDF73E7AFDBDA1A -D4DD09F759787DA42A474F1B6C134AA6FEE8CB1B5BE1E9AC6AA2D1E60F7FE74EB2FAE2A6 -BD8874F746D14A51F860741F5DCB208C461F8118A4741573CE37DFC57E8B6EEB1D369758 -7956D6255ABB0E047F04D5AF7E59DF62EE011BCB403ABE71C63490F9E3F28096149F866B -480EC82AB9BCF835EDB42F72B33526DC06CA515920C92FF73CA0C1A1F1F61FE8F373C486 -5DF775DAF6C7BE60F2DD4232B73801BE6BC491FA63205730E4974A531F1E75E74A9ACD2E -D4A9A9A45FEEA8414614B535372F94E55BF70152086AD2738807B85E0ABB2F5AF149C8C9 -9A9F38A6CF85E31358F8846145F428A89DA1C26DAFCFACAE7992CAC52BE50FBE0EE43CBB -2228490A00E9716E513C434DFDFC38263D773404743713BB490DE92A2C4F3E2E67032D40 -B31649A0672EB3E41079316EF1020DEE6DC23B95B093FBB87A0A88733645423F72CFCA9B -4B499F178EE31E5C8B8D432D5872CDC09713CF21DAAC84AFC235E8AF0F8DD6D6CE213937 -7314BABC357F9DDE5B3F2EF4843827A6F0D1DE9C8D0DB30E14F9C94FBA3A7726D6479706 -162D0071B70C19CF32BC2FD0113504C82EEC7669A66331267B4EB18C5F1902B6B2C78C3A -86E5AA1D2BEBB6AD05539A612C230DA216C24B40029A8CD96B8FF0FF000E816B6A7C4F70 -90E217124A1D6A78604D5A340C278BA9B16CD4B5518E0376B3C518E1493AFA9FDF83C36F -6F28785DEA18DD992EA6C2909ED188A31E933A0F5B521ED9C46E7A70BAD32D05AFDC381C -9EA3D56E2E8C48276A82F9EC08440D6468D0DE0577EA8D5171B678F3AC9F3BE2D5DC899A -4D945959C9990F334EEB92F34B88F256FFA564C591D5B18F79BCF9817E827BE4BA219423 -252095B90DB4347B2D54F2BE6D31B87B525D103680700F13CC1C0F72B0DCCFDC01F2E924 -B5E1442F21025659C39289B7B4AF03169F584C49D38EAC00B1910B823745054F00B322CD -174BE2AB28915D81A829B6C87486ED7EA4D44D6EDB6BD69C25112E0387FE9826C0F3F2BA -D1C6BE26E603730DF1C4CB227936404E138136082AD61492923E173484955187CE3DE172 -0FCDFE244D85D3C5716B7A4338A8130748567E0044D3D9DAD19A9785272819ADC5CC9876 -B764CA881499268F67D6FE0ED4C73D463BA920F27CC02D187573082A1793D228D2011E2F -59A15D7349B2EE7C9E7BE1AC231DCBE9DC98A2796F5FD4A5853B8BAF6F266520CEA0C42B -0AA848B977E9FBB93F77CC2F6224A339242BA2D7CC565373E3636DC0CFAD06B7C5C8FF10 -392C03A29675102DAA1E7BD4D45A2BCB6F6C73F8C3A6DA9D520F858EE0E4028FF39A7C8E -AD10A54E91112AD1A6BB7DFF7D3421533DE306FD859D5F750268EF950F4CBA3623B38703 -1FE153AB39B304EC57FC95710ADFFCAC53508224A7DFFF79AB8A24E4DF0846926EA4CDD5 -665E4F1734764B53C911EE8AB436EA08ABF1FC7BDFDD754D22C6CDD1D6EF1786C10688E2 -E2830A80A5AA37C08D1545C24EEA559618C927E4E5A1D6F83CE3CC7B100D4E04561B1BA3 -08A400644C6B49F4D5AA8EC1B5D769D16B28E1FB6DB45B118FD348D2A6F241766EC0BA04 -DD24F51F3F288D954D2C7E3B402361D6343C5A26F78D2C220E83D33662BB0CD33D84209F -7AED4D30489645AE647D045AB0BD56E20943BBC8642B2DCDDC09F955EFCD74F04337A15B -9DC924D48D1AF6AE222B76563139CC37966D32937FC5BA436843EB57761B9F052B0BE1F7 -132E40D0F0C783CC80B728B75FB600127673C0FFC2838A8B52AA3C957E978000314DC091 -9D1DE4DCF84280D7939ACCAAA46ED513080442D497C7CBB2EF36C43CB3BD66844691DB7B -2F1ACF8D9695E03F747E3C0CDC2105871F13D27C3FA07E30A27F5414960DC3A51AC1B569 -F30811EC03218F259BA3E4668F83F6670968C7DFB3E7CFF0D12CE126E4C27DE03595C823 -528C95F4B1C92AE796CD890EBE3DA9746B92A835817B6EAA2FCD276A77436225C44E89B3 -6A0066BB7AA1E94C3203AB45A6E2DAA5DEA3B0F0E068A251CBBF98D376CF76ECBEBCF3E2 -1F375D73BC558151341B01B27E16ABCD30F60FF9A91AF52808606625051C54ECFDD28E8C -90E211E0174A616C68BFC718DDF2656FA27BE3DF485F050BB57F96B7D1F6531CB2B73B46 -D21629F201D40C5A37B572428805651E2EC179424D8F5251A84384783A83D2C89B6833D6 -D0697FFEEEBFEA9C8CA21A627F50A1168EDE8C5E085B5930192973DD939E36F10AD90B9F -C02C0B116F922ABDB2A94213E4D9AB7903770FE69017FA7B28894A5CC4C66930FA7FE05D -35D664AFD098B8A76C9F2EF0A11E36B6D7362B62205AC9282D8082C15E1BA41E8A711DA1 -CFD28A83BEB3ACA3F7095FCE5880F18EE93F9EE03C706AF5547B198B4A08B9731A61141C -9A953B2A5A3DFEDA3545EAC5D7D8D556E72118187899AD1D13D51B44F1E422F4809BF42D -FF01E2F05B9BF68849A398CFC799771C1AFC256B7D333549A0A71FB7A8813D5028BB8F2F -397C1A68F22F3F1B9C2B7C2D4F4EB721E73D6E63BA651C802CE8E57F5CAE8C1F6C4AAEF7 -BFE00547D8344D7741BAE7BA30F21197146C8B31523C1C651420D130A2DBC055FD437CD4 -D92E7DD74D6F1A1027CC95CC028F44F2C5B95E72CD31F200B0A3584946E55B9A6A20163A -3EC73566552D848290C8EE0C821F08DC9F1AD94C9E94E8C5B865BEBE2047092AFCF291BC -EE941AF3156D6C8AE07E63B81F27937759F91A6C8795051BFC02164475850E295E6F40E8 -4DEC3874F6762DCDE08F738816A14E5D5423590D87B85F7E0E88EA234561903039FBC1F7 -70ED97405878F62A7AA078601FF5277CAAE4722171DF7954AF82DB007C56E59A7A59F133 -071E193E18D2D24EFBA31F3E598B9FDE11C0416579BA3AF70C8F7F0D069C3BF3FDCA150D -ECD1E82A3D7E1C11F13D37F27CA578A761A9E5EE2B425EAEB8298120429D457998BCD81E -81531F1F23CC05417FD802E9C1B7FA92F129CDB8F498C78F9B936FBDB2EBEE402AC25BF3 -CED327EACFFAFB1619E023F018E22F30FAB458228AFFC545AB15D66D4A0B08716E484F4C -FF688C67B70B3878ED20939A1EDFDF9D62FF19EBD66C9FEA31F18B6221208CF315DF5108 -CE58848845FE2386F9F916108102A8EEA1E6A4806535410FAC7AD182F6F317E0A864DA31 -35FB3C0802E830A039535E66BB3ADCEC299454B7966FEAA81861965F79C0578D5D48F3FE -5FBAD2239BBF5F107E5FF42EE8EF094D8586E8810522BAA1E231B4FBDD6CF6C62D3B36AA -8477D9273E95D66CF67F5061EB4E3EC2048518063703DFB7EFF5C2F5A3968FAA705225FE -9E088D592EEB980C54777F46BB385CD979BBFC34F3870583C13643D449A49D275E38FB4E -A31E0C69CC3CD31BD790FD0960EEE331BC1C7D47AEE5ECD11D6EF0FDAFFD1FA2C0F33C85 -31357F04EFCD25B6CA2E0800E7CC8B467D4EC22FCE69FA0F1245253B8B3E842C10276456 -ED5D4BA9B19B07B8AE60115D4F423228878C7E6461523A102F03E2C997C826B0E01A8C74 -737BBFCC420E2A864B051B219EB2F65AF711C8034EE858E8E41E93E80D519D7D5B78FDD0 -E4BC44CB9657C8DD9C37EB9ADC2E33E42B02DA3E069B9B20D7A727DE8070E17FB032C9C3 -4F5623EBABB58EE9097C85E0A2D93279EB7F6CCFB82CC798F06208D106AE7E811BB77F43 -E4F96EBDB0E29E9CC6CFFA79A00837A14A424A9E97B16F52CE9C0068C43523E286038ED8 -D91087DD7764B1DCC9FB73CB72A1AAFC3A09D353C64A8E3480D2C3E9D1F583E2437BC1C0 -529AE01639F1CB00AF09CFD84C38037DA70512DCB7242EA3BDADF8429ADEB743E5509292 -37BA921D7AEBE87A100E99B0D806D0AA4B3BA6740FBDAB5D1E0FE3716EE4957BDA0258F2 -70B527DFB9E2FE35FB0A6AB0FFB583B9529FB51BF336852ED0D4135E6408AD228714EA74 -D76CA630E0AE366233CD90CD586C9D8031173646A78B88F1F88B409110801D522DDE383E -93675E5993EC6C007C5ACF1AA8D0F10A85A144E189273AC6E135E986EBC2A85074D3C290 -1AD3BA21B44827EC7A55EFD8A429FDA1DAD0929E86FA7692CC46E7B312B441806598F2FD -6090A17540D1140AE17D9A96678347EFDF0B510A8BD31A07F26FDE43A5E012D76BB72FD8 -8A70CFE950A471C724288EA13FCF2A5A7A3D54B2D30BAAACDC818C588BDE628B30011DC2 -5CCFC66F6C7C5F780280D8E4C421A0C30749C2B33EB4AB3882CF161E116498C4204455C5 -B70C59800A0530493F63B843B3BCAAC5F025163431DF3FF39FF9330084D41A696DB77343 -7C3DBD4E794431B80E72838210F2BFDEA75DDE26997A6F28065DEAF13EB71B0B098C8209 -3121ECFE486A0CC366FD76927D530C3448FA16790C4A96F66274D5E7A71427AF984C5004 -620F3011223C4556D8D996A9415812F1868EC9744B1101FFD7876B0F0765CCA2E7BFCEFE -6AE75779A6AC7876D5435153A48C4B931D23F7AF10A71532249DD0BB4F52514EB90B98BA -7EFCB01C47BE21CF5C2C82827AECAB3666D9DB46D415C31870CC7934BA73C5736117F639 -45883151F82A1728E5E591DACEFFC0AEE8E0234EE158F45F8CE995953F2D52D0DB5D23F6 -E02079E115F3844925501E263EA3EA7C364DDB44BA125796D630202D46DE831E5FCA2BF2 -8709E4C2A8139444CB401254A0149E4DCBC69AE1438FDC782A6DD7D08134A27C1C32033D -B1707A8CB8F458B3FAC6643712117752FCBC008F2EEEA842035EDD4E50DFF848E20201AB -074E662074C5F57290E7FE6EC37D5C1C11EE8DCAD4BB3CFEF95193F16A3AC6CBE11EC609 -111C0C056856B5CBC8C5F59CE7FB37CD8F3B53FE0EE6DCAAF3C933B849FD60852EEADBEA -C506630B94EB9814AD4A9D31D2F355A3A176685CED59E6F2A6F61458311635006CCA9833 -BE5552DEA87A360F2FE23679A8C5E05A5A8C395FA909C7BC287C6587D2BA7C4C22DC3396 -0BCD0B32BA37DC1C1F59E730B8F1ED109E215993B16FA35C7859B8F8F299449CE26091CC -5E9A4893D1D1AC688865BEBC3805855B245A9E90F715B904B9761E3EFC7676E9DB688EAE -D6C5470282E8F065A2CF7CBE00FA66260F1AE895921852BBE6CCC06732EF7290620A1371 -3C98977827D534617AA33769F4A89CE899D29A6048516B0B9E764C4B7A668470CC188EBF -54D31E95714E4F85F3EEDD46DF34786702A088B30A31D55BBF6EC09153F5A170E28FC2C9 -F39EC3EC34BE68B1B13F39C7138B176B064210B8751043F03C35601891F31570D77B94FD -05420F77B5BBF0F15B62C06CD8E026D7402D53D5455D608D9A903482DF22066AA82B0927 -918EFC606CEA50534BBC94269A487505D937C2A0FA09DA28BA69A0B90EA305CA02332254 -5AABC58727B5169F010548A30B750484B8A6F33BFD0026BED604C56CE9CD713A05FD9816 -C1A8CF1FFE9A458AD7A3A0B0F4FD0E506608C58669AB9809DAE774920917406CA8E68F9B -E4C6B9D36C0A31494625FDF84661D20DB004C8E6C1CE34646992D7A2780AA7BD04B7C15D -8A696817A5D5F4A00D9C25E6695C383C273877B1F75544713AA173E9892ECFF80CF54382 -02A2513C677A4AF1C3BFF5B282C807A77F222ACF5AC497A36DF8BA7C537391827360220B -40F2AF6FCD3D3A9EB8847899F3FEEBCE598050D7CE593565F3CDDA813453B62983C0D90B -71BFE793AA1B2F0CE07F43C8D4DD8BF656EEF5C6C3CF0FE90C9891344FE3F4644ED8E98F -6C1E8C00726BC7B8D2AA8AD0681339EBD2B1BE983E36988BB22257DC27CE5E183AABA617 -D9AF549235E8EC30B37B85BC3F371764AED219FACE0CFEACF611FEFAB312466E6C02B341 -904ADF69B17706D8AB2EA734D8895813DF940ADD72547D373DCF82D1C484D7544B06AD93 -3C4D95655ACBF08429DC60D26DD8690BB9B865D0846FC0D32117612B8A8DA0D6955B38E6 -7B7EB2405F7177097ADD4CF54475866A52BB7FB9DBF8055D96586EC8C634DF0768B27E29 -92CA552A1E4B920C56DBF6E6C03A74745A0AF944DCE92093C8BAAED7B40F2185D776081F -5B3049BDF295D0C4EEC9E3CC12F9B19922A76724879D842C1851C16A9447296DDD5096FF -804D0DEA8530DC5D0AFAFFEEEC6B3057F16FADE808E85040E4275FA41A9B7770048508AC -6AAC18540E2D903789AEA54DE0AFD72E582F596734D44EE33A9A719620F0B17FF028CCC9 -A1DDC29D41D9714C27CCC48A06A49551D8F5754D8AAE52D92D31269C9696924D52A44EC3 -D483A0849738125FEE094ACDC8C09574D7FB5FDAAE0F44497115EF7C152453BF1B6EAD42 -44B784EB072BBBAAF2962F61879D74D8850B1C544ED2AD2483EC46F99CA7E5A281C38C40 -A5BFAB0500A37CADA0FA0DCD05838A4180C0DD8AABAE616FDA7CD77572EBAB61656158D2 -C27C2DA43871390F39B4D3E193CF95C19D2D2B8072857284405C68F5AE101A49F786502B -8040587DC7E2AD00DF02504FB119202E0FDFDE2DE00D4AFB2B67C8DAC5838050CF1C2D19 -C2D2F17FDA9BB90DA4F6DA74DCED5972E2F8221EA6A0AAE477190CF01D645D452F0E477D -436DFB6EFF88407904DD172E6CA5E132CBEDE212BEE43C446CEBBCC250D13467915BFAAC -24AE63D231CB519A0007AECCD201482201282B6C7BB3C4C45392D32D5E6F0A673FB8C27B -D70813CBB4285D3755BE80CA5EFF3B8CC0738C090F535004A14D6EEA4B56CDB2E70DD71F -98DB9A8041A2F80882BC5EA1AC8661C20632CA27198917A619646193B4A3EDD8CFA675EF -5F83AF3D18735EB811698BA7EB58563F0C706A2DC7D372369CE227DE737713C18948DC20 -5D9E574513D54ACF922CC559100D90AA3439E5B3D02E0ED2EA9005F75BF378CEFE680D93 -CDEA6ECCC4B3F43CA57B128FFD4ACF5020CA5258B2A03AB259EEE34B80590D44F58F3D18 -7190011DDC9B6FE1F5D9D8F1090EE4BDB4FB56272C579E33C7A3ED0AB39D96C1AA74E197 -7F30423B3E2AC868292F70B3DC9D2A1FEEE89FF3BBBB195E409C5F473BCDFE107769B6EF -E8371487FD8408D67313A1E0A6E2E448A0321C0FC931AFEABC4F648E4185DAC8DFA30D9A -87C0380046D38FBDBCA63BD498FF6F96FB141AC9D0CCF2D58971BDA0703CB600FEC9C22C -781DD3CF1D0604930CA0D8D9C35C247643892A82095F9F12196EBF4638132CC259278A69 -6BE54B1BA1B56DB1EE0F1C8FE42989AF69E38473B2A4317356A415E1FCCAB2463C80B5F9 -185D0B49D4188DE1B620BA6D108F3D3732BF34FAB723C1373FE6440296A18732444F56D2 -2E4666EB01FD9E25BB52F399EF53375C9280D7F6C3E774A8FE3EAA78EED6A94F85089E6C -FDDAAE0774DD926D148BFDA4563FDFFE56AEE78D03B9BADC66DF13351F3538D6220D5D3B -814D6F55C97A4509358DA25B47CB33923506BFE54ABC45FFCE8B35EC6EC9B5EF3AD16EBF -9FC871736AE364350BCE0C88152854A653BAC1ACA37600276DFBF99E9BB4B19E90A6F234 -A11071922039565046DB5A6912908CB86AD30FD7FE3660C06F05554A0C970AE20BB57E92 -448EBC532764FCCD1FD1F8B7E10FD0EA90E043C3064B246CF3E2299BCD5FCBB0B8BA8C1F -7A78688A0AE89D73DA9E7D94B20A3566F0870462FC72C6D7390CB82761F428AE82DDBB9B -DDEB99B653807E6257A2DB61EA8F4FB2C1D133EB3D8D6DDAD980E5DC555C4183B6F1C380 -B932C33ED0AF6426372558F6E01186A41CB25FB6CEA786229ACB9E61A133E138685C485F -505EEA8B5BCB465E5A697E2D6AFFDF040CCC78B8A7DD2F76EFCD0ECB1DB60B7F6996A75A -A0059F9458D34FB95925FFF126E616B6FF585B566CB41926564D8BD98D8353DF5725E722 -86E1B9D1DF3644A4C45E3318ED821CE90B2D0495E97C5033C8733756CD10C763C2BC5CD8 -0EE9043A531A0DE7DCE115224D0E272AD0CA70D3E206B070728E093BA13F03E8D419E50F -F85B3DAED2E7A581948541410B2469172006F0C24854049C0180D0DF6686E314757D9D4A -7F6D641D499DF6550A60ABA333DB90F4615BACB3C808FF6F58272CC252236B29FC67FFCA -5ED9063DF8100D915C5B8F10D7B1AD3E848E797F82E9B76786A4524AC083B09D91396DB9 -05F133D6E300AA5FFB1E1D161D00B4CBB09DFEB87CDA9527A23FD4591E2DF7E920A3F4F4 -26A7D3AB614E8D45DB0399550E166F01C4C4F660430642F813212E24C7CB24CBA11EBAA7 -B9F63BB00955F125A92658AFAC7044896843138F90299686F549A427A542B2588230C21A -09938ED97A7A6382FC70174F303673CE2AE93D8103F5E633298E1DA2C36908F6F6039FD8 -37747FDE7F714A66CD8871AEF65B8A68529FD63F87AF84F3AD411F820AE9BCB84A7EA4F4 -3838492DC675D80FD615CFC9D6EA741C6B91AB432C0CBFE06FFCC562D71C6440176F39F5 -3D810FD4D3810E22089724E8A7F53D295681C2E07334D656EA4D3F7AD037D3B9C760042F -86A0E2240343EFCAC8E2578DB30BECDF093CFBD0056110EF5834A1E683CD7D624B04AC43 -A663469E0D3AAEF64944EF7C43F8FBA221DC846E86A8866AC53384FD35D10FCF34EB7404 -BB38289451048BBBE520F6018C3F3B8F6FF3FDE4C5F33D89E44DBAF04AC4FC17A4196676 -F16B8A2F02FAC4B8933CE617FDF903113354619906A8637566B3E61FA8C849261A625CBD -87BA5F1EC6479E7B9423BA14D9CA0C68E11BEAF1D1E948DE44257986388E75DB6FD9AE41 -13C36EA637EBD0812F272EB8381437855C7B0F262728CC886BCB624437F8CA30F107427C -7D1103CB94B19CB2129FD2B388D62CAD6078EB7528810DC458907A14EA0CA0B0C28DABCD -988174387FC28FF98B7C9BCCEFA0407D138828621AF7815C13EC04F7FCAF82ACD3E8E773 -B886BBBE2C4F2818E39A2D7F964A29B9E977F53C7107EB586D628F85798E70489189808E -159E28A8D81FF9D642F3FA4FFDC2059947719184D1E83FD5EEAC7FEFD5DE2DFA8D808AAE -91FE63E94AAFAE17FEDDE11C1EE21085438581DE1F5EABB4FD2A2C3CE0010492612F5797 -163F19DCA534DDF49FB45D0381664FE5CDEF1CD0C319B6748AC4B8996DED871EECB3E223 -8E924F30CE315DEC278EB94C6206951B2D4E735463650B5020CA8CBC756618AE1D8781D7 -B22ADE2D20CF71A9ED08111EAAF4E3DB1F081CE992ED1F7BFFF2B883EFD95F51CE612CE5 -6588D7A8F342EFB74A989AAA55ABCE83A773333315FAF1AEF25CDC4F19FD2293A51AD64D -A070635BE2763AEC91BE2DC9F233D8968860E76352E6DA9F7E5EAF068E19CF1DDB22EB76 -FBE149738F247F4369273B6A901705B7DB396F662986D91803DE93D89B8312826CAF94A7 -80EB2EF254FD8F19710452E7EA41399D50177F4A8CD017EA2446C1295B6C1598BCF35060 -4288FB0A9C7CBE9D94E6517CECA11528D286CFBF0D621DA7D93C7D1029FE0C70F20ADA26 -E05A67C4E301A086770130934D6ADD3419070C6E2F0173AE4DA51F478DE9BBE3687D09A3 -A48D7FFCA601801BA38BB9D87F091DD410BD354C24C74E2E049407B8A3A98F90FFA8327A -6260CEEC0D9CFCB9BD04C3C08FEA15D0884A9017E239335985C85E17697F874DD3EDC192 -AB8542A11C8B5F50A2B737F27E9A4078D72ED0656D5AFD0EB04F76565CA2777930DC4B0E -62715FE6D2A8A78D8C0187FFF43BF6C434DBB5DB369F4045558E5F4F047554D4641D02DE -A9A78C9B3B64D32D3415CA488D399273879BB9BA3EB375F630F273DAB8EDC0B015A3728E -B55013B32BE513A0AC4769876686C9816035C2D199E955DF7A99CC07B680229F2E9C4302 -D5F7F4DD4B9C3BD69982E0DD8699EDC973E55A259376CBABBED36F28024A9EA504154EEF -B9F2C5649E7338C52CD19690D7BC56CD06D5882366EE32FE4B56D7703237F3D38A4D5C07 -F4B851534F597A1723BD364620757118169DFEA997B90D243990C23B6583EAA176021C29 -923483CC99E04537F611D02C44E99A05FA78A0EF13F05F695F38E3E631750BC0427F162D -96057F1A50A392131DD979868B617C037D26CB9A92F478C57E822C3E946B1A30388A3813 -39C0A4215EE9314A42BED741A0345B13D16F462E60E493EB57A775B3A01EBE558F8423B3 -047BCA02DCD80CD35A3AD41ACB26D75C92B1DEFF4CE5E8A8332AA185DF670FA87410E36C -D27F4064090E39970DE94F2A9476DFAA41225BB65C0103F5F2F277F932CB3B1F273464F3 -1C6E88064995D7C6DDA4C597ED8C8AA2174DD99D8769F818CBD824E04EB3458DD29A78B4 -1BACA60903E1BC1AC6527351EE55A550CF7BB448C3926E5AB461E374AAEBF86885B8D912 -23108CA0D5D57C333DFE6EAF41FB5C7071B83EDA33362E2090A76DF9832BB5DF1E3AAFFE -135801E3634415E1E8A561360B599DDC5F84F3DC12E3A4DA3E325A67DB748F6768D42289 -0520E9FCA4928178B888C4BB626D82D9B52DD2A8558BE9A3013B4492CD8F11CD4B8CA79D -771D9A9127EB7D3F8AC0E09CF86F94AE011B568EC3A12B6C8B930084C0982FF9400E5308 -23E79DE9CE44B754947CF6EB96BB9C9FA45869AEFC46A19F957B677E93E25D7CCECA4389 -35D70BC5C89EA5E2D1BC207365D7950B8227E70D4CBF3613A1ED87A7CF85485DAB70AC0F -3CD67859B72D6384000CA9B3831D32CC774B27AC9A2C21A4CAFD3493A2BFC37464066BA3 -4A4BB4BAFA36019452F8A580C4F27BB5D81BDFD8902B510FE95DDB23CC43AAF71E464CB1 -AA6120E3CC15775000BFD24AD031F000F787696A6A6FE9F2EB409B259E706BC64E2BB7A3 -286718CFDD3D1D2F3BBE7218949E69815A570AA59CE6545BC1A2036381515AD097A81D2F -51AC22395AECC7D208F77CA9ECF5F2C121A7854AEF87CD2170A1F9F7FE9657F2C5C77344 -F7F07A90FC698A63382D7E59D7EBC856553BC2C821A6664E3BFFF963C3671EB7CD32C9F5 -AAD7CF79F066B847C533DE4298824AF0DB3C96B780358DAD0F71CAA85AA876EE8C056864 -FC9F11FBAD9D966AC00667AE21F9DA3555D55D81283142FF4071541CEF9C87882323BC72 -454D5261D13BC65EC5113899474CFD4C05D13D8FCB5F3A49A4967B8C46817DA1E71F7EDF -3FC7375ADA580A715D37FB8D56B2A9EE3296D302AC10A9C5AF7DB8E92C39EFBDCF74D102 -C9939DB7F7C2293A9BF92E3A81C2A17B1C2048150935B977B85EB6AFBFA266ADF1D7CDE5 -8EEADD8B2D7D2EE4D9FF56CDD2CB1CBDBE229B03353D7370F9149ACBF086403B96B6E859 -952A34C0B58B4891E029FC505417DA6175CC8786CD4326548C65941E17587AAEF46006AA -01599C4D9C3D66BC8F7776B38822AABEC1D52E1B29702C498D6583AA9BC40F656DD6F74D -0528F562A31E90F620B7E96FAEA15F1F2F0B68FDDDB00D9FFCDB10635AA54C47AEB4FF60 -EB3E40FC4F82A0F73B8440023753309E443CA66CBB5C02CF7D77DDC5917078EDCF50BDEF -1341027323183AD881EEB8CE2CE4B983C611508E8911F098ED89DBF2ABBA49F1E7DDBE0D -6BFC1EE74A839F7CCCCF4A12339519C2EFDA56941A74044CF1B0222361ADF02CADA96F2B -94AF954304B3CB7635C2E7E6BABDAAD0CADF6127F63A07BE097E6C7FF598272D39D3EC65 -4EC2E9B795C1E6A65C50AC1D540130B16DB5D763B9923DAD3CC2D8DBA1D3D2158C01EF3D -0F41E368C49FE8AB6DE7774CEB1134B1FED9E8911F9C2F29B8A65D2F030B966444B96EA3 -48E804BB6343A01E2A5A4B3A39EDAC4EC5A8F9F8BCB4377B0A10820E5B5FCD84A1343A02 -CADC1D5EC78CEDA3EEBC08E795D41C30390EDDB0D6228C706CF39C2989618E1A2C86FE80 -32E093F244E65BBD5AE8EEB19AFA5EC0717D5A0365890E707DC35B2B56187314BC1EE8AA -F3CF2A8E90B5A04CC30BEA3E50101256E48D0DDAE0E8DE05D62DC3AF06655AE331010C67 -EF2377D07B7075866B905644D7003205A1D9380B56386E291962F5A8CC209C4D540CE82A -02B4E654BD66EDEF1DA488CF02B1F37ACA1566F5FF3E4A25E9DC0FBE6F1CCBF4315DB6EB -F3027B8751BA5BE3E68C3B428012CDD1F23ED25C9F09B53321698639D37C581873723846 -06606C0B4E522B57B592A205EA908633A20BBFE46689A9C749FCB2C1BA5D4B3EC7DBF4FA -C810240BD7D2CBF721EA3F824497D9B105348C6DF4E964AADFF293FB406A4678D7E1CD5D -24E189EAEA1CF128CAC24C3764922AC24104808451776ADDF427A8E1DE5227B82546F1CC -8FD56C60EA96726924AD39459785E481A86C59E43F2964C332FAF11BEB87EA9F7CB71920 -1E31DB06A94C12CFCFC4CB0E5925B81BD827842A8FF3021BCB63E9CE7BF8984006062267 -DB5F53DCFF1F1C08E053020257982E81CD41F6D55D6DC148CE7E1588146E2E7A721E0C63 -4451BA6D6B0BA5E1434EA112CBC5BC508BAC211A55498D30FEE9DA4BB5D39E19767CE082 -CE5E2737B404708070E8E6F325D8E9A705398C4D2704CD50AB6567411B18D49F2D55D690 -CBB1B4D50EF9893F8071E8423DEC6A6738A92E527446549C87D4BE374C6BAB141331BE47 -B0A1415937AF7A047BF16B2AEFAFEDF28D15B66C241E346884870E8F3ADCAE8A1403CC77 -1EBDBA2F12EC4BC01547238E69EEE4B08FBFAFC2E81CDE882C9D7558501B0BC04175CA89 -D1EA401ACD6AFC5AAC4128539AA1F3ABFA352F69A1322A7E505F68774598F26EF248F658 -D0EB1ED0278DC608903AE7D8DB3A2FFBB486057720D8F7B6039C2BD00FBD67B73E183EC0 -D539325173FE5D5F6443A6D98B967ADFF599124199825EC044717674D4EA3D0CB23058DF -D156708E37DA80BC192F0D51ACD25D144411F856E36B135403F818297025F27FBF7EEEED -1D964BD4F0BEA178AC1780B1FAC7D64C2BED556696F164B97CA0C400F8ECA0E508884249 -8F32B23F9AC97B52EC55580C0C7DF9EAA9B8DAAF266DC0A02C2F3AF10D756AFF097A7610 -9C299FDFFBAC8A6C3652285901A145DE49C093F4AC2BE72327C35E6F0756F18C9D219D28 -24230C2F226FB0E9E47291136B363658230009DD11F2A8F23BC2F90E7EBFB384E1BD8E75 -42295AE84096E3BCB7F7E7ECFB394FA8B2C9B4746455DB755A59613D085C34D07BCF89C7 -2EABB16DDBA4C2C09B48A5D21D75CD9529E4684F29479264C9DF6FF211B72559F0BE453C -C83C1FB4EAE42A8DBC18B2F0DA7DF4CEB2EA36129B469CB59D74C5A6897676B3855E9E28 -5F0BCD467538175CD6485237686CF42A046B714941BFC56FD1ABCDFD292B5368AE331149 -B401F69DD62B294FF941B1CCDDEC0DCD5507889C8310A6FB7D7F3A9F0713AF8E52A5077D -10ECCD6B5E24B260052A25E09C477D1F4A4710EF521C44F5765EF8DAEE3B7BA4E286D764 -59802F38D8E97D9A557963FCF5CE32A7DD5BF847703BC9314102928DA945BC4301440841 -94AB6BEB1EAF29A147BD1155D2A5E68517E4C347098D4D49AA10A359132C633B02E3AB33 -4BA68714EB41277EE78BDB1418DFC5A584F6541F3EC0EFC75E66263F61CF2DDDC5DE5648 -B14B8A275CAE0728A9B60FD75210FFB3EE02535815F68572A9C29DE316C7A6C991DA22B8 -08CD58C392DAA11A2390AD45CB6161063043C464DFEC11E8B068A0CF516E38BF736AA9FA -A03AE4EBC45C03A4064A4CF07B171499954D8F93A7598F3D51E953F91C7A70F35C88A384 -97839CB7F9CFCF788932B261AB359F8834660BB0CB5C69A4178BC3A6A98D6DB0C7C346F5 -E44ECE30B1C3E5EB4D203CED8B5DFB17F8211D672013A41F5760D90D593B7079D6F231D3 -03E9C3BFFFDF1E98B8F156BF47EF60F082FB02AB362582361B5274444E6C615A8ADAFA43 -71CBD86CAB86AA91D096EA244AF3C69C4A2F9D62A0F5BDB7649DEF309347F364469383E1 -4B72A52AB0B0DC030D8E785C81724959CD02E1BBDF43E6B92DCC1AB433576ED1F7B7157A -483C99F4662ECEE5116AFC2B28263AEAE6FC04C656B02E15D619275C7D79894320559E18 -B75EDEBFA7230375F5EB1A66DC3AFF798C6B67D05D8B49F28AEBB509364AFFA36EF12063 -8D958796CDB5409D5D3D8270B4E602A530EA46300695868F972A1E3764FD44BABAB416DB -AD0E3799FE67EA3A134F9841C79F89AF7FCF182A484627FC0A70A8528346E3C27F655232 -10ED76FDD4626CE3EC9F34F506F9A7F68C50B9434024B7C40A3D1ACE1E616694E442625B -FB49252EB156B12AACB84BB3985FBB8431A9BC0D1F071F7947ABC095FEB24EBDC9381FD4 -ED98028BE53D441AFA5534C9D27A3D21CCC2EA3B6A652E08CAD80B56751ECB06F18CC9B7 -CEC29919314FB5283AFE5A1951D3669B446F094550DAAD91C36CE3E5D30238C65D2E1D67 -5648C147047FDCF267AACDBBA50B1F9C7959C5F12DBB94B64FD02741211F297176F5F849 -412EDC12029643AE2AF2CAE8552C69A90BA2AB2DED3FC3D5D5E8987CB9B538FF90B693D4 -B842EF7D8AF1055F53FF8442AB5854E94BD016AD3F29CCE91F6D222C7E0D3EF3DE72AD41 -C2E179FC20B4E0E694E50082E944C77CA4D878BA6F19410FF616569C59E94AEC542AB9CE -BDBC0C9726DB1D56FE5B66463699266E4802B8572C7D2E45DAF827DC6FF7543A45A8B7FB -908AFA10A67EDA2CC08F677503D0D30D74BA3379234897DBAA955011163C4E0138858535 -1FFDBEB8804F00B6799ACE948E698EBBA5C391BA1D2FC74F20C448FC0BB8766BB3858B46 -2E06F751F2762A5B8DBC4D2B7B96FCB3EACB4757528964DC348C274F757178EB41BBDDE2 -E075E7F340C899F2253DA8D35B2C544792077D7CD7678698C2D8A3E36D440640FF920E74 -7036EE2E46227F170C5F311BA5D89C0EEEAE6BD2CD006C5D18BEEFD521894E5DD7E865A1 -B894E8D3E24AFC5A89D18773A7028DACEC61BDF9CFEA5FD37826AC0A7B51C7CFE3813A36 -8D62036C6B5CE16E56601864092F2997816C600AAF2DF34CB4832981CA5737A5EEE14F2C -08302588D473353CC126C39CB3F6829CF84358384005A577A7F8E9BEBBE001DCD4BE0538 -6490A8E7BBAB5DBB98B5548E478614B9CB730CFAA373114384BA850D00FC9B4DCFCB6B8C -A57D4288E62BDF5D36BBC888C6CF5F501BA8B6D8C5D69D5699D80AD979974F42420D114D -9BD3F2ED149514EF44BBB2746A00E3C633FFA966AD76B0AED0568E44B94C1F820869D86E -91A78A7C5DB8F454D313637FCD271D92FC20C9F578B21A969EC9B1C015D8FA455AB419B2 -B743CF348AE9BBF466F8FBD617E29374DD71A846A75441CC79C4B1030266EC8E46801E38 -CB9FAC30D2804203AE5CA81D0FAD237EC8D8EA6C544F8BA10B91C2D3A402E940D3092E16 -9D44A95F8292E2DA06C709302F69729A5C5042A009D319FC7049C50DA4653337A6BE5A22 -B325F1C64CAF8682D3D4904654D636DDA229F6F41FE01DFE8CCA48B171FAF8C099A92C28 -D3691CE8EAC30941176151B67198121ACCF7A6EF4FAB0843C385003036DA94117B66FFAA -0A6A8C007404A9C0781D60652E48D530A656B7E005C5053A8CB7483D1EECC4A85D907859 -982A74B1731BE0B8F4B1E91E4481A68057F9AEFD9438343C1229B0E676842A85641CF32E -364CE9EDBB8D4603CAF04A5B2111760E1E77370474393F89179413D5B9184938BB00DC79 -FA7602A1A591EAD89E9D7DE655378E10E301B4005D6B5BF682DF253B0D8A34004DE431B7 -C82C1741D9952B20F7312F6B44806226115791D0E38C6A5E855B2197DE0317858F25C62F -2177D7E6237CD2CCB630FBB13107B25EC2A75EEA8AFE6AE0642AF1F23D171E99AEECB731 -5034D2410795B40495BE25FC6EE051D78792D65BEF57BE88C0DD7A7C6221D0B7ABD88762 -9AB940664A7F4B6261069B5DBC95BDBFB9DEFC25D4DD38B184CEDFB2653553894B7EB379 -4CE19DAD9160266B97A32BFF96C0A1B7B6EC126F34DD8B242AE0FCCFB7DA22EA249A14C3 -E6208F2FF090AB21CE1EBA11D66D654B30CD73CA6B2258F67706792E63E52B1F9829313A -C0D6FDB303995546B77974C0B07F906944B68B50CBDD7DDA5DBEC4740FC6333D1E62984F -A9C13C623620B27680BCDEBEE51E3B5841643383374E04BC65E4CBFA38C91ABA62D7AF44 -C721491F6C78A9088DDE50BBFA9CDDA44E567D776559D3E11030CAEE6E5E7D07289CB58C -852AB6E55F52A6F5730A099C982DD11296E4E33CCF20BF6EBF16C1EF76785F13A1AF9EF1 -A52FF02C06A959B6839550F4FC30D277AD524E215E05B63A9C7B74E2FCACAEF3DE606002 -349C3FD26BA26FFDD6737BEC9C5DAB55F0A63AECC534DBDC2174490980A9AE98B00F6BE5 -2334C6090BDD9AA329F6A66F551B3E41A0DE3EC021C7916F521DB7CF1D5A6B7B9D72851D -285358554917F453CC15A1D73FD528AD12230892C6774001C56840F60EC5439F6F54F741 -96E6D3D74010F14A30DF85B16D23A7194634CDD9E4D2D74FA1ECB3DB09DE7D7FA438468E -D1AAA438A463FC988C4460B1C55FAAB585AA17837CE6597B162601010A04725655079C2B -627139B1A2AD607FC365CA845CE554AC4881BF87DA677B2B240AF10286A947D624EFC074 -1D7EDBF557FC7BF5409AFEEF4535C7A02D9F195B1A20D54C25BB918EC1DE3492D8301448 -81CC8EBA460A299805212312643D95AC08F93ADE8DA467C4286ABC575D17265D7B268809 -C055D44FBBC1672E34B73EC73F114FACCEF8817B3EACC68C88D07249769D0AFA2B797863 -B6ADDE44995C903A35A619EEDDB8F1D76E736C26EC4E8BBEB51B05DBDFD840C0DB53C766 -625664B8506BB1A66DE8A04041ED2F68663BD15E3B932234F37CFF8128E4B2AC1C191297 -D4202B56DE39AEC4006ABE003B7594062C26F206C124E1AD656B8598F190A335A0351034 -388C225B0B542D11E3CC96C0B72789349BBCD9C445C19265D32440F6248F2315A9024BBA -0CB6B71BD71DA2B06B57FB0483262A653161E6ACFB5E916C22B6DAE5847740A36A40A505 -668EFD5FB438F9F1779C02A19D2C14D6F1DB6B120C060D2ED8BDEE9733497FC9134A82E7 -42970EDA3F136E0740CCAA97EF05658BC1BC0F5855303168E2BCBBA37305459215393674 -3D51B4670061818712549FB6CC007C1F13B8C74A8AEB05B30D37E6587148A94CB7C1F27F -1B4B37D298DA91CAA996A180DB262FEE001AE974B819D288A619A8ECC8E442D4A2EE0D93 -B89A0FFB9A03EA573BB8D40676E9C67EAADAC5C0A807D7422AB90881515D4DE087893B8D -A0329DDA3C42689CAE4F29C791EF79B2965F6DBA3C25AB0CE23ACFCCBFAF41ED546B4A05 -0203147147ED047719FAE976A2B71A81A0EDC3DF0A3E03B4CB8208BD7AA6CD91151B1A31 -5AC3C27534D9D73F285CBC0F3D7E0C2CCE2DA1502BD04AE6789ABF17DC7CC9214C67F2E8 -5DE2A1A71AE65A91D7F139756A1A9F912D759CA02A433F0C44E12E8739C4C2BF217B8FF9 -55FB47DCC70B1790B3E906B9AEC41467E5E0E9CA0317BFD62F2A493EA5DF4103A385B56B -45290A56E816C06EBAEC8D38509777CEBB11CE12509834FB28FA7A19FAADE81BDBF0E427 -46EAD35477D51E467EFAFAC373E3E72012AC7AD85901AB832B8197A5EF7ACC5A9D6362DF -89CB52589A3CE810CBA525DC46E2C00680EB66CB4E20CC4872B5F6F9BE3636117140C3CA -545CC3926EE9005FFF15AB7848A95ACAB42E3B565AE93DC7A1CB80B2854EEE6F14422013 -D50C7BDD75E97822BA7C7D65FD383BDD5BE7DC9942888CB7C39CF56F17ECB0676B73D3A0 -2A37319899D89426DA1B299009379DB2C217DC43FC08F4A43E13BF8522A2275EBA64628A -78B877E2EFF40FBF2B5C628981B0E66643757F5F8412A5B48AF6CE0D230D57100D2F3446 -CA7C8EBF6F3EACC15C3115BA9BD61CF3D6309C18BECDE16EB18F6D008C5C5CA0FA426B52 -5CC0F33A5743D4FAC4830C4B7ADD35ED3BD7F7B072847D2D430DDF667A6FBE49A371BF0E -BBAD32173AB5928B86FE1F4E74116041E0F6E4F1041BFE588A17C7ECFF96EBCC224EF0E0 -8E3D8566BC221C1991BEE248920A4BF4E424FFD1BD34D1CA66F53DBD6A1AA33B33CE4EC3 -ECE8DF81BC73A54DC350A3939F07521808FD40C566B03124BC7300D28035F2162B76F6B7 -F7A26EFE392EBC35BD718DD1697BC9FA8214A1E137E28308F7C37854FCFC6BD031A851F5 -E54751C2C409A314A0AF104BC8D561A5A8E7C6B0BF4F1EDF9B42F577A9B9AA91D690DA70 -6BFD54903E6A1591588A845EAF9B49A8C5BF35B06AE495F4A8CA94D64163B2BC03482DA0 -BBA8B30CC65711C8B45AB4EBAF027958D578B94DCA70863767A0627B0751AD63EB628BED -CBD2C89DFC2A3BAAE500389F9D25F1EE6FAF3BD85B018296528A0B6049688B2CF7BB1941 -386D49D254EAA716D29051B9A5295E937F700C7D46872B6D593869A88576DAC22A2F8B3A -5076656122DD5178AA5FF49A84BBBE20DEE581FAAE017BDA5B7D4886BD8E90755D766EA4 -B2E825F73B8DCAFC4AA1A8263A179EC15E6E7EA656B1BBA6E19756324876082C9CBF9094 -CD62531D1BC54FFD2F9F9DEB6282DE12B66D570EE73905B0287CF19E628533EA058D5FCE -AB66B6DFADC6AF54995ACB056B8BF3AF89EB021073FA98A4B6803DF89CEAEA3874B09625 -67D46C4D830F0CCA68C7F24B20B94FF73A0D270D2247193214DE5E85775E15F5ABF0C88F -59931730842A814185AE10BCC62DC83846FE3031B140D6E0E05F4E5B6053F71781B10D05 -81904D48290FB4A157670B791271F7B1B32BDA4A71776B196767EA25D5A935CBE1626C6E -5B3D8E64F74F03DFC72FB5C63BF586540071EE17C883AE11F2D154EE9AC0B2F7F71D4D08 -CC170A9D5206AF1585BCC8AABC2C2C714DF83AD1FB773CBECCCC388E0D3769CDF84DE17A -83618678EF40D4171BAF7236BB081887A042DB575528027CDAC918086C6D8FF005639565 -F6676782F78AAA4EAD4ED8162A35E447C2D60A07E6222415B516C8FE60B9C0FD24E78996 -C1316D99AC6BF81AE6A7E53BDB0DF9AD231123474DC9A0105CBB4D98EC4ABB4F9BB4D3DF -9BEFC99537B06378E91C875FCE12910CA65C33C47F1D8A864D17D5C5B288D5BF6393C576 -ECB62660756C8746C2125A8434A5DEEF7480CBC48C21595A28BC9931AD897C754A87CC3F -608999E7FE39CE1F60C099357246117C8A074BC1E405EA7FAD3277CA45F5053C2EE050C4 -B93A1F85B90084A12D625DABAF2291ED36699134DB6BBF4AEAD7CFE27379AA6AA93B31A9 -AAAD3F8F998BA94D3CED13C1730326F08928C6A648CD010845C7CAB2B935ED2450239B20 -63D25104A1E9F4DC48BD8BDA6FEC274BE5807DD2355F6CDD587263837ABF3C8CF8466D3D -9C38D0302F1CE94C967BEF58E6B867C9FE138A7DAA9E7C791865A3E8BA65A254C7032E38 -FFAEAAAD4EE632983D975F167172AFD8FF70A1CF6C90C24B9C1C3E1CF51046BCA8C2F0C3 -D56B931C70848521756E221AECB2F0015B3476FB304B28C4B7966A3F693AC9E1C5D69C55 -8DE014A05981CC5E1AE6083A91594F0BF812B1348B5401E4170AC65CA29A7182073F0E18 -8BDFDA17EF3933750DE211D30CED8B11A1107DE4F12336FEEF5AFB522B2060BB745526FB -D06E42C1D4C7F529706078FF598EE48C9521793F53F770636FF6CE984FBBDA645DB8E631 -E041B10E43E836B1F8C58C4F2D4A7BDD4165FCD7B19243AC560E80A6FE7A3EB4FFDA465D -9ADF12EF99FD68D90139A58A53583CD9A0A574B8E0A604E84FCBDCCF67B8A2DE8D411996 -12EB00DBBB8448B80098B458B143C6D1CCEFA354EDD81B01BD6EE4A0ACF2AC0338BFE143 -06DF27EC691542D79715D36E06DE6D7C2D3C9C0A7DF0094CFF0B50FB21D67138DCB7D447 -B45EAC890C4C6E08852F9C00D6DFB9C60A24061A3014844C84BCCDB993E0B8206E5DCD85 -A97D0F1AA82F5AAC40B5D490BC1C60F05B33BFE6F6C07138A4BD1ED177C2FFD13278F53B -1B20218F1685385A604934223F259646450DEFF801D97C1D38E8621C612A4E49B9CC2279 -7DC683D7AFAFE54FFED9563E880B86C25982D6733EA3B8558461207C91F024640FEB1D2D -5A7F80D16FC694DDC1A59B7E30D1924ABA53497F37345B31D2429F6804AC66E9FCCCF4EB -9EE2BF2836E5B55F29D445762ADBF6BAA501E198FC7FDFA66F3474B116E9A77319AFB981 -7C2F4BE21CDCA0FCB65F07DCDB906AE92CC40B4A8E967D91A00E9110BC5E3289AEC2643C -02F77C6313DB7BCA506CB8BB3F3A434904BBBB46D7C724766DB3BB73422B659F7D5AD5FE -6DAD7B204230C92AEB30AE4E510478F620BE0E4D6AB477971A22A5C6AA66835513B1E2A2 -278BE747880EA3E1EFAD48ED0B7B5C320B833587A22D5C944F5ACA917C4C49FCA58CCF19 -BD800F5DD3246DFB9A772AEE6DB700127D07167F2D69CABC855BA8850571850D913A0606 -3DAB1EDBB6AEA9724368DABE65C57341467A58E819ACD98BCCCCC971E30F0488694579C6 -C4991EDEFF6DDD79693EA8BAD8AC9495D8884E5B09D163C7A0D343C031CB29F879CC5064 -B65AD297089E7AEC41026B5E055DC47A7C529ED28F3D27A191239D4E3EA911C84084B411 -13D7029A39E6C6A2E931727711F1F06B807841406515B7711A6B96E6AEF79E271C6E7D42 -7146AC3915D35E9C2D4C9E7C5689F7B0371BAADD037840BD034F4C411AB29B36D4314729 -E97666CCED8F1A5AFF6FA352AF6AD9D9343DA8E3F97A8C756B48675750D128A3862C19D9 -086B597EE751BB0D87A3B7A56866CB6AFD2CF8B1B322C9B2493D40BD5B89C4AD69F347D7 -26C22E0E39ECE377C995A611B54C0B2EE3B6CB16673F50779C212AF1AFB93DFB2C931A09 -39A1379C379E3F7327A687B5C4D8D909D3CCC5C3195935D8A09D5E5BFF12E61EFF4FC6E5 -F99A1460C5D1FBA82C84136BCD64D96AD968D6EC728DF4A85573E021734AC6C2100B6F67 -F4E648F5E284618A1868E773D9CC819AE8BB433FD388E971F211301B3ED077CC37FA4B58 -0B50F8BD2309D8E81936C050E3F0C8C7D81A80DA508533BF5FCAA977C17A572DD92CF1A6 -B7172AB4C66890E9F4FEC661AD629FA0FD23E9427C481408A637F9E649DDDC31668366C3 -692B524D9B4DA99938076EAB2343FEEA1560550B8E8CD18D3CB23BDB1AF30F60EFF18936 -46B26A09E5411F6C456917CFC6BF3F74B2079D0AA56935E672464F6444F2E17DB330F94D -FA7CFF92DB6C800B2311AB86A21658D431EA7C811E020538CA2335B9DFF550C077E83B29 -544FC63F5407B1C9CBC3E6E6259742EC85BAA006D2715D686619A94AC7EAE394915CA656 -B8DE89A462A85CA179C276B4F90C399167DF0D928518DA2A45B3125CD16AEFD65C85801F -BDA3D139B3B349AA86037B579B8FA94C713DBF1DB2A904652E89AA8281DD58D4CFE3434D -6C86F0BF7921486C9AE78F322DD841CB43AD7EEAFB5735DBF68D03DFD6640DEFBE22B305 -B33DE7C444D16D31C3EFBDC78547D77962EA985B734970BD6C4B729C7364348B1CC321A9 -46D096A078A45797F63B1734E968CA55B8E905160740F68676AD286C9F44E1A94D17F911 -0EF21F8EFCE27A76D1D7869FD19C5A9AC889675172335D312E8E1DF59ED55F8FC13D0E6D -9601039BAB9AEF7A4F3BA688E288A089B326E0B582384B9BD80A0BAFA1130E2034F95D21 -49DEA8E5F576EFE035C5E58CE82CCC0B3A95980097B2D4A80BE162C8E3760C3532697651 -2626F6C64864810E304D98D77F13BD535DD5BFCDAEFFFCEDC1CED370DB2EEF6D90E1F0F8 -D4C3FAEE71AD31B0F4798ACD68E1A5FD00A327846DE3AD55B0F493E534AE6E30D2DA7EDF -3F68459CA7192321B98C8DB02D3399F72A0216F822FB8D0B5B650B38586BF22197F78D31 -55B67843202DDEFF5B04D4230DB2FC50443C21C8C28E7AE0E399767E03BEE4590C4D47F9 -27210114B296F1E8263213544DA56D46BB179ADBA6DC415D6A46679A4A7494AE4B2F0812 -9C5D06F92D2D500F336304FE3454F07A2083D6B6BD5D5AB3D6F917F555C7F7124AAC6F38 -4262A051D865369A95DD8EB9DFE43DCBCE770D3C8BB6630AC2F8DAFCE58C5C4060BAC1B2 -EEBAE9E56AED8725DEBA7CE23DF18E1A52A5B87F39EF416565DA17A5BB6566A8129CFD77 -D3DA3E3583E6F59EAA14F7788C06D3492FC84F7C6BDA74C9FA885EBB7125E87760A1E848 -E9CAA638A813D6EBE8EA2A3E9ABA7DC8C392A066331D9EACDE6C6819AE12A85B096CBFE5 -29BA283C2CB73FC34472C5289914EF347AC8119139A3E6F0CFFB5772D5AB65B276C171EE -D565CF9B1E629AF962BBB00CD86FED8DCA3DA0BDE9ACB286C516114BDC1AE1AC41DD8453 -795253786205499EF2E971F3DFC51C72AC5225EF4E0D9DEA403F24002591D9F55276CC38 -0DCCFBEB33F7733A1DACEBF1AF33D55029C44364284F6CDC12ED12BBE809666607771634 -90828A6F10683FAC8C3C4DDF38A0CFD1D1FEDAFB7100FD9C02AC8796C7B3B2793D11C107 -DF10D22D9C294A3AD3897431EE593AB265D97450A6B2DC4917ADBF04B04F32F5802EE354 -4D3A95CDDE623A423213D0063B79F8F40EECC82F3C5985CD12B0A46F5AB9DD5175A9F3DA -06E40950ECD37DE39B5EA6205D9427EF43D5B0D090A62B669E437D0C31B6A03850EA8BCE -5D2D48C25EDA80913821DEE94881348DF1726A7D61ACD9520267B5C668F46B1660E87E27 -658B7D3C2F1C06ED70D97AB144D22A4CFF4A54D73F703A5AAFCB5AE2C7C5B33CAE3F0BD3 -29600C9BF8BAA060ACD3C4D5A72851A2A18AF29212B1E070EEFC452048CF312134436B5C -E91FBD2E526CF0A35F42C1D8092DA30270EFF9577ED231B303B472670B458C6B53B1C766 -09159D861584F0901E7C8DED964E9ADB0B424092B4B50C490BC8DF607EB9345C7AA94CEA -F430F8DD439472CBEBE11C26F9D7C7C5F8F04F6D3D97043E282CC848A1BFC73C095841C0 -ED64E7449BF4CD53A64F0B932C45B0770D6D18CCA6147E9F992A93275AC93D1B3B0F02B1 -9F117034AEA1F3F0F77D482A3DD8D5B2F69122E5B08C067D39A1C25D042D1EF4F47377AB -CE1C38418BD39E7400F10247FA13291E34BA3CE681CDBD28F3F14EEC90A21C76806DA1CB -25AB9B96031D1A472C1146004C4DF21E61E07087A8DB5C33DCEA85EBDE4587FB2FBCDC2C -5C6B92E61C72B067EB5F07233162AFD24FE6A2A9D0BD11F401610D5C5F91E46D36B2401D -A81BA2716D4AEDA19136E58A14F5A367942B70DED7DB1E0703609FB97F8C72C062934495 -DE54A6C45EE6C8B5F368F2817ACD4A10F14A846C1FF578084779649C4BD01D9CBA1E88E0 -1DB953307EE9BF10E6C17B020FCEEF709840DF73B4CE45D4C2583CF4B357C33DE67C8CFE -8FFE367E89759117EF10E08899F466D342E75083CAD4795950C026505BA8CDE648FEC333 -BC5842ABEDC3CFCD3B27E707D6EAC3D54FE7B9C964E28AE0FFC96A06802C5A8327FC2CBD -DBA565FE970FFE18008C9DAD42EA99FF7BCD0656362AFF37432A182C59988B0BF458C370 -725CF7D7F864747CDEFA9688FF6D2CDCB49052F349F9BAC9F8261B5FF65BCD2E531BA32F -7FD7D3F0E3042811B345E8676907FE71D4FA94437A3A42872285F010D909D468462942BA -696325E79D943D0E44992A20EA118ACF9CA5F1B20E52719854476111D6479B3842A9CEF7 -749437F57055B19C5FD6993F5737E8555B19161FEF7F3560C6FC498EE8148B6327EC40EF -7CABBF6B7A99D14A789F6F5431BA4714CDA494E29542EDDBB4A250ACAFB9802B6A3D8FE2 -1CAB7FA79D9682C1B1752DD2E671ED5E4574BFF967156A503753B65075653471F29E06BF -7342AB3284E9EAC6F14232F32C3B0266416738EB5A138DC33DB2FA3A74E649532B4BA7A9 -AD51E0278FE837ED68A9A5E40AA236314885AEC0DE2BB1811BCC18F0A75CBEF875D886AD -55A873B8D3FC81BA69DA0C68778CFC5F02C17A851EBACDCFC9A0682D514144CF47382163 -6B1A61CCD572575E6A81671DDAF8C442E4268041F8E03398A9EE0F63B352839BFC4D4720 -0F86CB77549091DAE5FEE2CEFB21F4B987496FB8F993E3CC18EA9CF06442403830E06738 -20BBF3E4690163AECDCF693BEACC77B5591FCE1D2DC11621BE67F9C439F7864BCF981F3B -8A9CC1F21424AB86102448FE45A42993737F7C09275C627CD601906B75CC9370AD491B59 -2777DD8683ACC7CC961D6CABAB46A2AA65D8FDA3E66DC5C75ECECD209FFBBB76263E036B -8F62EAD1B802D3662A23A28079CB47ABA48799F3DB0D7E46710675B2C434513E997D189E -0A9661186D9D623D5B47BB377E4B0CE197D80E9AEE04E55059C6292C52E00D0AD892FE67 -600AFA285DC92263DC1F15EEBCA803647789D4D420FFB53C0CE4A669B4B963D5F2FA6FFC -3B28AABD6D97AA2F92EA3FF8EDE7AB264CEB19062030F43D8438DA703B68D2615928E4F7 -9687B03BAD9F3447ADD3090BBE186FFD3E42CBA236104DD1D9A8E9357CAD999E889D313B -262A4232C5926869139EF1165172932601BA4CB406177E25E6150605DB931A70870F5BA5 -1DAB4D15D500B261F9D708174568422C714F30B696095757C66F7D2E6A5CFD146D90F21F -27F62393B532583B49558C8C6124F2F428794133E093D4FE09805FB2F18BED35D12CA321 -B79B0369E46FE3191F47B07D234866AD7EA52C50F4C0562597AD1F7D186060BE2339C324 -F154C2EDF64C7A40E8419E7542B8CA143E172E3C62471AC1F42342051B3FEA08368A31D2 -56A7D51FAE801A420FA30E5D479283A21B50AF52C6BB4196433D933FAEBE36EC577C59A9 -BF52F260443A622B637FD4F6BFD330F8DAE7E4374E16B8E98BE92E3404CA22763671CE0D -276981334084462B06763958C81E7D85C76223546F3ADA094E5597AC68967D96CD9E76B5 -0518144684C71739C488751FFFD3B9859E23DFAEBC15A0AAD8417416CD5B47656E8BA799 -BB2ADFA07B90E634895108D5F97BAB5B560F0608C1239F49967B34941B908AA695840FE8 -4519FA60763EF706ABAF2E0C7D407E5DF05807FCDACB17685226D6B5070522D4A6AAC8B8 -77891A1390386A074745E5F4875F625E9BBED05B54D04EB6A6D8352E7E4E47FB7EF432C0 -808D0C139EF7EF5220838D1CFA3A839B10B772D8F2A197E8FCD7EDFAB65B7234A7E1C0CE -D75C3120A58706A26004C2218744B095AF45009AD3036AEE08068311B20974C4A95C8CCD -4EC20B2B8B8EC4F2D6F9281968EB51ED0E377E3BEA2481810C3B0B289AE6A3EF50339AC3 -B7F06050B7705C260D942DFE3B104C13728A2140F9E137AE5E476FA67245FC92F1DFD28A -81CDE2EDB4978F971F668664658A674999A62287F74C8BCDF0C306C20FCE35EB1BB7318F -9D7BC39F215535A9796A7AE7D117A273DD5F1B0F5FC5F87863A817993C96CC2CC0FE3504 -44698065A0654D045BE4FAA60A218D260FB013868B18AD6DF01B793D298F0CE041671E71 -81893BB81310462FD1906C5F8137FF46937B206588D2715297D008E6AFB90DB28E3D64DE -73EFC4A6DDE7466A3D1BB402FC04AA80DF2BC39AFD30207230828FABCECFBED8E11598AD -CA43FE742EA8D1BA8CEBE4449495398E5DE432B8218E02A5340C854455069082EC8AA449 -63A13C0069F468BFC1D3D75D4458383E04268297EFAED1D02B91AE933DECE8DC3337DC99 -D7AD1DC4B999A3AD5E8953C7820BBE425470B21BB61ED6007F236467503327FF73979677 -918B34DBEBC181DB99526586BB6E9889DD810A0CA022C62FCA58F2D4D738A74BA24E2FA8 -29B80401DCB36889A4CA08B77377DEB0C4172DAE920E318DCE78DA14ABDB77EECFA5A1A2 -6FF51D6569AF1218C4256D4B4D206ABBFB1D2C7AC2102815EABF306CDE0615FBA775B5E3 -446A2095C406CC1BFC1BF4A53E65FFF0ED565B45AD332505AFE0F91C8569897834C06194 -6C745ED6618A60065F6E3B3B49A61BF3265F3BB1FCF8A25F4880DC771ABCE6BD03B48C77 -83BDC1CE678E423ADEFE9AB04D40097D8DB062DA0A248D1C81AC57FBCE032B232C6FD553 -8AC5AE7983412BC80D23EB71E4DC3B946FBFC4B98C4250BF8D57CC55D929B55C354A3F9D -1C5329F36B06CC099C2201E7FA501F75CC7D5579FFAF9F9C63C6DFEDE80B5387117EDB49 -9D3F1C72D650FC120FDFC8E42479469DBCD81AB244C316963CD6EA1C34DA43400C5A2B7F -E9F0B71EC4EA67255AAF6A2F49982441962CA30DCCDE6F7894520FD2B811619713D91DED -5D1FBCBB42B1368E7F8F4B8438C515B4661879D353096F880AE278905424DBE523DB7B41 -A5867878E478B85960607BD1C129E85249CA520BDAA479CFFCDA162E46DDE5EF6BED9684 -31F3289735FA2891C13C0C341159905F43BFA6412B6ACF04C2A11B87AD4B41A35385AB66 -68CF890B1E9A43598F03AE5A833A932E5C5A70E498C405CC56BD0BF1074EF1431980F575 -67D7C62291703308B41C4B94A99DB6F6F1F924E791025D5E2F56F3A0B60903FC0CC0B2DA -8CC5785C6FB239ABB091B7718A9BA16D5A33083289E8347CB56172FF037F6FE1A9F7EF4D -5D68E23A9A3B9F63C2045AE2B1758489AFBABE23DC1FB610B37DC573D2C0AAF544ACC904 -B69C7775244B1ADB77B51727FC66D02637CF2E9C596A05AB6BEB23295A093AA90DC3C3E8 -F17CEBB44AD7A8BFA8898D6BDA4F84DCA2A30FB5F0D151D8F6666690BC71002F31AF05EF -E033513CE82E8639B45CD235F24CDB7C7C3576149CE989FECDE2F51FC835CA9A023D889B -F6DAA3DB5A8AC49DEFF48266333B5B01130F954242A7D5A369CFE937D3AF1C4F2C64051E -59FC2AAA3871EA827C5B74C70C259FD4DC5DE81E2970519C433F1331D1D08F5DB9BBC9EE -80D1B7972C7F1514F7116E25DF3E382785504969CC0AB8DEF43F5F45676B2090DE9A775C -04B5A4613D38FA586F05753CC38A684BF33D2991F909CFE097F97696CA2C59CC20A6D89F -4710B1EF765EDC4D5A0B7BDD33D8E818D97C9A19848903D1684436488AA7E204F577BA24 -F1D1E0D39ACE2DCB56550281BB24BB686F605B7146660EBB47F8E329EA27F94319D795A3 -71D2D04F6B3DBC4A61D4A7A6B748A60B5D8F3586FF31AC143FB706770E4DAC9A6741EE88 -79870FD251625EE5E77853F6C5D2F621C26757FE64857FE4D0502F84C14825D9BEDAD55A -35C640D9999543CFA0467165E5AA8E50699A1C13589A862BD656A22A50EB6F479D5C79F4 -585212673DC2BA0DA86109FFA40F5FFA1F660F8C055D2E9B9668B2966DCDACF5F189D835 -C029F51B85111D9D48F507AE75A7BA53CA97B39A5287CA4709DBEB723E6D68BFCA745FCF -7DEA768DB0FE6140198D62E880E49E2997AB132521C94D259CFFAC9036B0F2C2E15E22AA -6151E9D4737FD36B9676450E6F7C9E7531FD2F4F307D6D548F37A3DCE2CA5A811EC19778 -12B37C5722AFE78E1425C2C1C06461C1508818C9536FC9117951719B8D431551B4793C81 -CA6938CB75BF746C247A9F48354B0A4BDFB2D6DF3E305218173503195BBBBDDA322153A8 -2085F0FB5ED657637791A4A7E1C1B23CE0F8AFA1ECAE76A3FBB3E6B7A2BDA2E2252B2E43 -4413F7B626AB00CB381737A2BC0837E33C3E25C63852B841E70722F7ECF6238890D63CCD -2C93F7A2CEF10AA710AFD333322F4907E87A12DEF07F5C7BE344E73CF12CB388BB6F049C -D9713EBD215989CEEA7473C00E40F79CC0038762139D9FE2B2BBB290C51A3B4B9090D039 -C22B1A620DC1C3128C0EAFF4C62A29AF0338C65B6730BDB7D5A6A7261C04816B7D11463A -935AA0D33802EC148CB8E7DF6B8FD0FB064BDEABD0DFC3AD5A80CDAE645B7FBBC59359EB -A0D70699CCB53887530C3AC4E796DDA9AA05F36CC0A6D0C2F616E761CDB1ECEC164974B5 -0C0D38697DF56BD7F7F1772771054F18E3F5EDEBCE00939E70A43766D0E99EADFEE152A2 -FEACA0BD0BDFEAD28E3437753ED58E345FC0D6F4E395667411D4246C460DA5D3BF2F5374 -EAEAE1DF1A76A592C4957BB9C4D406257388DE96591969B30D10DED2C5B647B66CC0BCF6 -146FEF353A20A3A2E40C1A7B7964033816D6A544399965E9C17FC44C524268B0228E209D -2276C1071535597E57EC3D9C4D8328CA914F54536B1F63C89325D6B26DAB4A5B1FB8260C -241331D1B55C91406537C5323ADD2E3CDDDC9E199CE067262690BFDCB5184E25795251EE -181E745001ADEAEE0A9442D57002D48D6B53E693C37E0BC64ADA28301235E9799D9D0AAA -B4A23F6D8B4EAA5AD3B6B40618330441F6A24E44B160715740198B551C2883CB17FAFFD0 -3B4CE68ACBE3F6B33E29987B5258C1F7DFB87DB89735F05AE7966FF1F2B6546AF2A56918 -3687B6DC7B1AD435DA0209B0AE7CA01A3A3359291B1435C0BF04BDBE2B8778E4EBEE35D3 -17EB5CC7A3F7C5B7743AE69B16A6B9C89491D121617C20CBFA52E93274E6BBC8C0E9924A -002CBDD7922F3437560E3747B93775FA549457CDCB2A9943AD403BF8AF05EB1CA0EE347E -E832C6A17A3A53EDD50EF553A0E8D6723D3DAACEB6F81CBDB5B78A5B207A98183C3650BE -A88F82AF734CE32FFB1118E54FBCBFA2C2705D65FD4A1B3A3734F188078A7B09738C3EE3 -A12FCE8B7221C3041224D324AD3C514EEE792E3D47B1E8DA34AC3E577163E7AAD2C85170 -7D630EDFF8403AA2720B09218E0013FACA789243FD76719860373949951B1907097E01F7 -2840CC3089FBF9A86B01E6E5A882444A3D167A302AEFFD3AA9463A68C7922104E365FEDB -9BE61D5EC0A3AC5722F2BCC5101BABC86333955964509096B6799F286BEE15441C3DCD84 -A846B35D0B027C48DDCBE123DD9D2DD6A4808F0B3F98BD4BE29E1001905D8606390EEB35 -396A3A981529655D67FF0539BD3E1FF2FABBA0D4393CA781FDE2864DA5D2A0FA6F78063C -03CA44F27436C3421683D242EF3952B8707863F6DE2E3C94ACFA9FC60EAF7C8D09BE2D27 -BAEAD24C01748E1EC790EF22AF24F1F7BF0AA1FACDFB5C8E0A9B3A1E9E53047E4E791D7B -9DBC38B9EE8EB0E5CAF79C84E81897A4B202C6A3F22438D9B043D982F605E5C73CB01CE9 -56E9DA66D7BB53F38BC43DD2962D6589AA47BA3E0AD6BB8E0557127CF8F6F83AAAA3597A -8B57BBCDEEB2223AA2EB36BC84C7BF53F3B7D9C221FE76629512D04EC454D92060750F55 -0E76BCBBFBF9566266A8D033931774C37CDBE5FA71FB43137E5592DD67945201E1D10467 -A3BC5C273DE16E64035C39E4A36D7AA7F4E8389A1FDBF891B00613396194EFDC5B77A9D0 -9AF9C1A4EAE52C87A096FDFF8699EB01E9EFD3F786A7D45AAF8D9D33B934CDFD85C495F2 -09009C628EE54F19A9F02CE631DDC692C3C56D2FF00B8F277A18D1F38A63C394C717A0A9 -0B01AD75390D853D63D0E0678C35022369BC8C985C8229C98CE6BFE1C40770461A5E26C7 -7A7AAB035D6AAA9B0394021020797E627E2E7D17B39FD2E7AC6FEB917A148FB996911869 -49A036A0E5B85D8BCC59570E4C689F2E802262ED26A13C18A57F99A74DA94491C5727246 -D3FA45A7964F212454E119A32738582CD4F5899ED604F76F0327CC1E5746A86CDADA7F97 -E11EBB6524AF8107F3A8F0B8E5F887B799DCF9F9481859EC4E5FF63AF0C294C2AF716EB1 -3EC7DCFB796E3CE4B4CDA1DD15186CDE479CE4EECD1FB27F5A05B69FBDF436EF246E8BD1 -A03FCEA5FB213D81F80D6ED7960896101E046D1101A7522F31AD1BF6C08C5ED8F6574F48 -2B6FFEBF34A2A157567F1B82BCE3A46C14A168B0F4658055BBBA2E9C29A4DF42764F95CE -0EE9645C6E0BFF33CBBF3436F7A4FAB4B2A5055FF1DCEC075431A99670E03248CBCAED63 -4457D0EFC6565472A356B1169775BF5156DDF85E03688FE2AA31A158A65A1D9AA4489CC5 -6FDA78AB85C35C42B1754180577244C5343C21E222DA72B8BFA097BB860E9F834B62AF9D -D50481FC4B1B9861A1C2A9F340237C949FF030096DC29FEB028A00A5AEE8507AA290848B -714C13145AB3F4EA42C8EBBE4A3CC737C487D0DA0CE29BEFBEEE34F5CBE03DC91E5E2053 -F114C70CBE94DEA1653A26DD4CD332F62AB71115DADB2C6B3339878B9997AC3AB5F5ADD4 -9F432AC706A5256DCC4592C30DF40C5C47A2FDC72851FBB0E4EEFDA227B72EAEA758DEA2 -341344315496A6F22D42FFC55B4E90821C251F0D8B5FD3E0802D04E10DCC31E5024D330B -25AD95CE31981E90BFECB17E786A10ABF9A19220DB82744A43BF5B4DE0FD8C54171EA498 -AD14E0972D6EA90B5CB9846354C855E2E13B369BCACBF8F1852CE60227AB27CC84B9D326 -68E851BCE4086558BA8106D9249C3785F3C59E43827307C87C72033501ED888E32325158 -879454289A07888F09EC7EF1D6F55B92363BC740E170085C4D16547007A66B6F0E1FDB4A -4FDE032A497377F8B309B5803CB7B450A246A0CAFDB2F8CEE254EC5F6BC7C1EA38BFDD79 -268969FE9DEB9FD896E40E479222BD480EA1AD9E5E0EF7780D3E48D62219E5518499D46E -DE92464609DCDD07B5C948792B71F1854C114259463E839A2DE74A11A7FD114EDE9329D9 -F1EE8BE5463AF8A04943BF77CF68B0F3CA2571D4BDC19B980F8919AFF6EC80758056F93C -76758F0AB6313052355085DF8F0BD62C7380AA3D32102F48F4F84C153295AB27F3F55694 -E3C6339B3E34166DB450373B9F326A1E108ECD95B0887A4CB8C54A811B398C0B37289C81 -676CD8D528C75437BB2DA5C83C0FCDA94588BD785E4F800E87FDE1F277AFBC3ED0C5680B -27DC483446A828114CC9B239D8D1C2D920CF149B097F9A78E35C0BAFA1B0AAE5730BA067 -B142087578ECDED1DD73E8541BACE5FB813E14483193467EF8585682295816C4E29E197E -ED404E94340398A95A470A9E06BAB7BE0F5FB22338A833F9157594C5030639AE0E69894D -49098CA950C39937BF17194797AAAB7E076A2087467A2D29683142D84B0810F1C603A95B -3A81C3225003834CC446ED0944654805AAA164B088489DE9F71701AF4DA42C675388EA82 -CB8368EB21003C19AA278FC474731F2D74A008F24792F651F110E23EFCAC719E2E9C0481 -10968EB515AC09006E062EBDCECDB6D93772EAB20D7C105DB828A891F2711DB786B575ED -484349390AB27A3A767D8092B7585C8CF32F5FDF2B9D78A27FB8E05C4C25D970602ACA43 -31FC692DC5C7F7C0FC5669DD8B150D7A4EB22218DFAA75E79263D106AE84AA8B573B722F -BAF6D7F79097AE4007A3E519C107AD00F63069BCA7314000DFF2B06E4A9DC82FD10B27FA -16775E13913364DA3020F7CDF748CFCEBB7117CC4251031F6795F4289C4A63088E985927 -B971471069135C4DC3BE1FC3912B02F933F26F72297FCBA9F21820493FB49A1A862991E6 -948A274C9C5954AA6BA752D4B4096C953E92D916369F9AD0DA5055521E3420ACAA45D436 -6D061135613BD328630FEDA1634FFCD8E2F23097218C2449520D986694B882081A791CB1 -78925494D19A7EC770AABFB956E69DAFCA7C72698AEB9DA304765F3D9E351022F02B0C37 -9E8897E597144B416A008212A0780DDFB9FC1D89063A05D216AFED272F8836E5356A8BCA -818D7F491044995DBB9574BFA5B9E346409B9C4F768B59F654E9D607F3D5A078F1F5C0DA -6EAA9123F369B3341B40BCBEF1EFD9D56DD82A15B550E105F03100B18C7647702879FE4C -7D61243D5688B2979BF250CB1E594B1A2B9212EB957DBD3D41C0029A06C9BBC302F6E969 -4E998A090296411D7871E35D9B367C1191A3F9A638BDE0784508A7B4475F768C24BCAB2B -AB375DA779894022D09EFC62788289D9E72B74F7C52F2AB389038D4BDD244E1CC79B01DF -79E905BF50CFF6A5C06E68FD894BB1CB7E513B33F34400DC38EF8EF6E39268635F66CF70 -D5EF4EBE5D4F36430233785252376CE73CC9E6F83BEF01F6D1C5AAECB6848CA50996581D -E069F69083ACF3090F29844580712073716A36392BB2FC1049EAA0E114976B098A344B66 -E0CCBDCE847B2D3B620DFFEF1ED2FC8FEB76D1766F76F3855F2C2DE7CF10F4DD4664B006 -2262CA279472C2FC0882A8F0B5A4DAE04D4293FA7E08D7639B3D7FCAEA1124A261BEA0C7 -560C6C52E61802C8502C66D4896EB0D8964E0ADE75283048DD0A1E243690D989A49FF16B -33740C7A49B820032167807CF695F91C55C0BA6D6AE7FC7368885C674B8BF30931870677 -03A60AD58F42F6766DBE60A74B2C2E7CBCE56EE68DD0D269FDF5765AA414157BC63F5CB9 -123E0532224DEDFEA2E668F3875AE4C5260F93398EF86BD5867E0E18B497FD85C4FF4A4A -3AADF54256544BCD7811B58134BFC41026132D8D30BF6903C2940157AF0568C9B6BB3009 -7577212F65BDEF06FF06760E38BD32AF61BCFA7E2324D68AB590F2E45A9761124928F6C5 -64BDDB6B51180CBF141F48EF9FF6DAAAFF2E379A2CCE80EC839A2EDB91827F9D1BA0AE40 -FD36DBA0E8ABCE564309F7DDAD96A5C7D87212F8D586F013ED189D6850322E4670CE2D07 -18CB688DAFCF1961FB0F4AFDA71382DE9CD976FC29B4CEBADDF073774D9B8AE9F2374C04 -F704860ACB17F8A16B4051EDBDA362CED1BE1BFD0700524188278DC8D6B22E0D585F26A7 -C4447076AE0998A76AECEB8454959F30BF5A4BEF1495D6549392AE39D97388B5AB14612A -D6472A6B625134E17B540AC0D514C1239ECCAE5C75C9F7ECFDDDF66320D00052D874E6AB -792FB1CF5F37BE8F34A14CFAF642917406C3C519EF56C92114E706BCA38731B52D68B9E1 -61BDADBD17A62D1074CBED9FC77F5558CD4970878E0349536745C3DDC0E6BB4CE878B2DF -361B4DCDC5FDEBE160168F4D0DC81436B008714A2EA3BB569961F07BCDAE095A44F578AE -6D0E6B5DC7CDD38FCC37177DF292411C89B4B64612C82029570C5A7B9B55F38E063BD3FD -E00421B42FA18751B624D59495604A52A0DE27FEBBF7689E0DEA085841050DEFB7C9FA52 -D3515731A1BD61D4BF5E82841B221EF88D921E1EFF65F731948CA481E500A46E84487BE4 -E3F9DAC68918F117B77A2B5B68181C914FB764CC5876D2A42CFE47F045F72E5E443B4921 -D0D63323C748984F622F00F63C886F404C671119FEC90A598084F85B4866A5C79E987C5D -BE5458A2A0FBCE0BA6ECB7433F9D75142DE04FBA357042FA9793BC9803E78E573A14E140 -BAE5E044DFB28D9BF672461BB3A3E50E1BFC83EDFC49A962DEA01047208F49C4CEC837A9 -D2318E35301D2B18DF1E8D828B58FCE8D5F1450E4CCF92BE5CA2B30516A4E585D6C83BF2 -80C7442A4F942584BCAF4C2CB5C2F56170817BF0535EBA87C75BDAA0190710A7E2D4029E -CC54559EE6424E26F0FF8E1C2D3D012B3FAC397B1A446918F1D299A19B7A28C4D7F146F0 -CA4E29B96D275B54C16B1AC37FAF498462C7BA8D2C11291175FD05A5B3E08290EED58ACF -680DB2202F229D7A69F982E644285FD1FAF320A0C88E35BEC245D249AFBCF6CAD552423B -EA2AB070F314FB9B3EE02ACDE1FFA602D19E1805F27D1AFCD58D6D227EA765E6630149C9 -59ABDC3067CC97A797C555FDC59B9E4DE3B0681898C970609B1B6B15A15A65EEE2DEECE7 -2BEFB1E2C7A2BE2B3FF19B2CCAE4937DA4B593A60FBE0E0DF3925043E677D44B5FF7B42F -73EB65150EC0533B294B675BD7D5CC6A7BB6A4F043FDF87940F8A8CD366BFC008273CDE7 -72EC15D7367371283EE5BC26CD6D46CE665661E16C691727CAB0833942367DE588BBF434 -06F4DD67988AD1C0D5C3D24DA8A833021F65E4E4393959434E03CCBBCC98699A8B1550E9 -C3192D3D3755F81C51E6CCF4C4E6575D9D4EA77261B987C8FC8CF67035D281D76041F70C -2B2FDC8FCD2719A93FBEEEDF54685031ED2E960D2CCF2B5DB0840B2554B1723A703C41CA -1E6169F96A1050CBA7A1554FF8A6D7E4BAB0B549664DB9B808FE7C5EA9ABA7B071E71125 -54D021BFF7345D1295333E876E28E14F2274CA0E5E4F3838B775890CC30909661D5B86CC -4F681967BC8B5B9169C6D8F1B30ACB914E1140C6A5AC5B6855EE83BF9F8C5AC875D93BA4 -1C62B9D44917BD3B46F65B23FA3044FE5A6F812DF1E77139253576ABA80A57B38D315E82 -CE42DBB3BEFA62E400A194B5F59DCBFE915D3B5DC010B4DB140127BBF0195434F5A43957 -881974EAA69CCEB2E588DA124EC3F7CD00F6BB81AC494088F061065C204A851B8890A5F4 -EBE9D680DEC34FC853FBC85E20E3D9DDA86549FE11396BE73B2978AA8A4C80BA94788D8E -D03D48C88C9E047CAB868D7DB3837EFD41267AFDF4808944506ED385295788CFBCBD89A9 -8DD84168F808E49BD346874FB281AC70FB138E100D914093C582E7C85F5EB6243A941DF8 -253B06BD01E8F75C693123BC20D17307B8E8839CDC5CD180FBBFAFFF702E0E9F6077237C -F81EBE9737C296BD5180F40EB79A41BDEB37FB0FCBE238F1B86F45D8F25B39FD7DD4DE88 -4F1D9659A27AA3F25CE066D8D84FC09932B8B2D3BC89941CADBA33F7AA87ADC13453C674 -E8AF9CF633ACC730085EC2A843949B9E5BED6AC3ACAEE21D620495A0DC04260AE555D15B -59143C29566D3331B26DD93469C682409BE8D37BC93424E115F7DCDC95EECD57953BBD28 -974F249FC98A73A384260A0568A69B382886A9AB09B6215E463319F8736865F700134E65 -1D78B9C819501DC01CE5C55A2D58F12D74988AF124CC6C7E213520C940F6F8CB4CDCA9A9 -DD2B569D06A967208EC37AD2F0BFBA7AB7DFE87AD7A5AF4B6E77E2C8F90C9A97D7EC58FD -2D7ADB97CB6AB5189AB4E5C29A1044887CBF775E09348A2FF946E9D7FAB0A13D7405937A -EA98600DF50B8FDB161DF14D091B58E925BF12EF3176F3EC504E1E75FB868CC46146389C -23DBFE0F908356283136F4A2A3AF2C197997302BB3E545907C3295AC0FD06D2069D602DD -052BFBEE41D7C926B303D4C1CB548EC9537A0F5FB5C31899FD160BD9EC390F2E0F6575AA -032A78BFB98714D731B0804898F148ADF072B3E714009932FC8ADB363B18B2B15627D3DB -B20DE94FE90B2CF68F85D7961E9035DE17AA5505254D50704903F28EF414D3CA13077AE5 -A0BEAF8F5E11FEF25C8484A34A1C39FA1E8CE92F42BEB83158BF26EB1944E6213E5B1531 -C7065B2F1449D3D444855727E691A501BE62F659322006FF9A22A5288260A785611791A4 -56E6915D344495E82303F067471E323B888A61ECFCEF90676C5F490A9DD6B6803C5789FC -A7B0B7A1C7EA4BDEF4463CD5304C626E8D714619CBDD4C4EAE61EA1D2386642DD4DC77CF -3351FA6ACEB1ECD55CE4308DFE9A09763EA427021D90972F2B8711A98C246FB448FB3FEB -9887A101F53321CE647B3B9CD077A31915269E6D049E48305F3B2E84351FA7C2394520FA -BD5EC8CDF9EFAA99573B1788E0C77FCA125F590C38939FDE67561BE1EB47575028ED1F4D -27A7094B0500824F6FEF2710FCC5768F506616AEAE73807BE2ED2E0DD4C1A337993C9A62 -C7601418A586D038E886E1E22843C38A9F34845DF71AEC30726E9AD413A84081F1E31A53 -73D5CFDF816D8F6CCD90C2B438BBF715F0EDE86DC31341A0899CC6374C573FCF2AF67A47 -5371828212D9AA17F18FF25801F83D0AE19A4712E24C2C024A7505A2FB269EB3E7DDF59E -7D95DAD916A5D35B7D16A82764DDBB3773CB0C6E3B1F2FDCC0553B26795C348B6C0DBFEA -E7CA7B74D90257D8AF4F9D4F3C776D858CFD230781D2D6F28CEB29BF4EC4D413DB9B47DE -E4B36F6CCE14C09A033D580D573C21B4A45DC172C0EA0DF41A0BD5CCCD6479166B30961E -A2094DF2262D9E81465ED2C66BBF8B28CC4A25CB7C259BEE2C2F0991614D161B25D4635B -C869B8008A2156BA56B48D6220DEBB6713A035003DEAA0160477F5BF7E336E90CCF67155 -0A55B6A015468E8A8FC8050C979178EBE2F7434E11E6A77E2F99A133F81FB87A75F42EC9 -AE9ED23A3DCB35312036CD819952BCA72525A39594C79C52568556C3A90E95C6E789A99B -04348DFF652C9A178C5F88EE957D2D037FBCF584AB699B276AC228DB743B4C4548EB54EC -38F6157163A870C35A4A7861ACC66118FD3EBAF43154C13A4FB8C52AFAF5F7FC67571D85 -F994E66BA3E8ADE5973138F61AFAC440C1EAD910FF8F79B11B73C697FF7D921266E48D51 -DA2FD0B438CCE7BFC1A1233FB8B5D812D8E18846B6401E9CB3A33C514693F19CC21A2500 -FCB0B0EF63EA74441BE9BB70477A63A641B639C54F93F4D4BB8E76D0E6F49D134FEC890A -B6E118D754ECDB3FBAD7FD4493AD9415ED13C05A0FFD949F3363CD400C5E2B547F1CD6FF -E503F2F4620579B69415F4BC356F943868F198B4243D250992B83BEBA3F07930F0F93366 -72AE171AD02B20606532EAA8F819AC8968430201EFF0FE42E8CAB1A10431FF0353827919 -847B2B20B0B60241ACD440C8917B4D0723D44A5FDBA7681E9541AB784B1A109473D3AAF2 -C035C27419CE30E5EE3C62F0EA884E4D4F164776DFF12D212629EA3AB2B103F000BE0A92 -298F4D73B79AF1929DF56280BAC6F03ED3F9DCFEF4B138F88758E14D4E90C95DBD9FFC40 -173E6F795689C812D24BB1791879326ABD3CD7FD2985FA950B73099AE1B86959E46C4709 -1278D31A41B159811140598A24861E34F2BF09ECE88BC36747DDD892AE3918C41A961D35 -28D8A8649E626FCDC9551E073855DBC34B57F6D198831CC189FE1C452FCAF8980998D621 -F31D2B9C7794DDC8B32FF3F8BE6934B03CE603020E7A37B51DB4E1FC33F625A8983B95C1 -853A1B1B4D4F4942562DB9A0FFAD4AD95A977DE81139687123317B757CE75ECDC8287609 -6D7797D50287BE38960290831474ACCE3F57676811A5DCEC78E91488C53167DA013E3797 -A9A8C05968C8888B2A55EF2032D66F6174B61CD24D0C62BC49250AE6D9B505371CB15160 -C591809EE7551D40D3CBF88D33F8A3A9412E6221D9E656D22083980999E405957E9D5A36 -64EF1F676EAAF5FA309D23C56C95541E7E51958358B436DC4CA542DF18398AB8E4D05FD2 -D24BC091DDD9F4F963A20791D88703056B5AAB84655B3739821EB288F1A1182F67154973 -AEE39C7E8CA894130CB0A9A811A1DE595BF12D04EA825F2A11A365CD1CA85D7C7F2DE801 -985F64094A9D168AE1F9CF287CE99031D0A1742DC08698572926219E0965501497C9D355 -6E9E32D23BD070BBBE905C512C864DCB8BD9E8AF46FF4CFDE9D86E8F34DECEDD99E8A745 -E72885340086FC17EBA499548D8C535CFAFB42D202DF4C91BF817BB786E577C7508CF99E -A088D9B070F5A5201D23CD76C9DFF960F0A77EE8CC94FB5CDB8707F8A7420B7FC2AA40D0 -6E04F60C595DD66DD436A4E2BD606121E423E0177B17E73CDC168DDB7806294A1A2DC177 -87C4296B2BB174D55D9255EC44CF850A68DA75BE1B577E8DC80B715876712DF29CBFB81E -80BE970CB01B9F8018C381EE021B57E01FD3A742CA387317883EB3F06FFA93E0473BDF27 -98D77D6B3A962CF9F42D181FB4AFE59DC053F2C059035649A646F22A927A4EFBA9E6D3A0 -2C7762AC72BC6827D49171F1F57C354FEE5E92E96A30156B8484BB3D9FE7A21B59008AB9 -9692940D35EDFC207A14D20D2FE364ED08F54A255D1F434B432F00C67863997266F64862 -D92AF31C3C7961692F6952157C8922AC8C8061E5CE8E4FE5E024C1324140354E9DC3A768 -B2092B0184FC1A46FAE459AFBC0069ED4C2CEE34ED7D756D65A7474B28FE5F56F6E69150 -6EA2272C75943E3CC9CE5FEB2346AA91136F5B306805EC51D6BC12E5D557F1F290E14CC6 -043CA5CD3D0EF095D4E62BF2068072ED630BF1451B8A35DB5783B6496DA31E98129FB96E -02175D288D2854C505E2403AC9AE94145AF6D327270DB865EFF70867894567B87FF7E5D0 -16848740741342E871BBD632ECF7673E1C3ED00255BB34A67D709E16EA1E0BD24F6510CC -C1097402E3994605B5CAD28A48DE6F37787A77488D8C62614F5FC3340E952066B61C9DE5 -1EAE3FBAD5D8B5AC64F8B261BBF06FC677A28EB58F4C8A08A136AF3FE387E24E6B100774 -24D077650EC787BC8498BE6D7A1DB54A690C768825ED63AC24E62E40D5CCB2AD05A2675B -301C895800F08F936C7175F6BB3A5CBB86536D5EF41B111F3EBAD9769324DA1D88C4E835 -223D976FBE5B9DA39161F6F3A7BA02031BC20EE1143E1FA73599CD30CD43F0552510F0A3 -67E8E0963D12B74C429E15BE22C0AAC2717AAF021D437A784CCFA60E8BE2ECBCD962B1BB -EC8CAD0439CDB73131D32363354CB9BBAE21B01A27830971D1D7B842E3145D5A400BAEE3 -76C639A3B5D2AD8D51B75F7FA86465DE401BB13FDE3407A093479B87B0E3B2BDF33E9569 -6501ABCD07786B1ECF72DA8083FA1D79873753B466A0423F1B504236B95C497F39F5D5A0 -0417B3D8AF9721E5F3B5ED2DFE47D9BD0930F4E9234F181CD24394891F7B554766BFEFE3 -CB4533E3D01DD656FBE2C170B82393C0F3BBCE9367C9D5735AF8317450C7F4B163CE95F2 -6F2F7DB25CD88EE9B01716DBF1FFDA7FF16D54EA39841BFD3EDAF3684D2298ED45C8486A -F5014230F331FCFB320D28D5A1A17D02D5593538946C8669B346F4693FADAC663FC608C6 -E091F481E1C39749D26AA37062D7D94115152B214506B91617E829833AE67807905C70A6 -8412293287EEB2286A27DC7D7B9AF75FD4E32DAA4641EFFA2A79A04DA0EFF958F411890C -A50246E5A1F53315ACE19B22C9C14B897272237374BDA4221E3FD18A7D4E26A09DE3D246 -D604FA90092F188E4D2C6C0144E6D49DE9BC8ED4561B9CD8EE8D308EAD97B6150056AC9B -9551CDC472A642A9DA02BAC20EC5B57698D68ABD0ABF1B0FB5231479D72CF429C39DB34E -A75AB17BA21AB31E9DE9E2584C2EEA8BDCA322F0D03291CEFFF011843BD70C43F49551B9 -B10DA24AFC0B79A87B6F493EF73E690A4A705DC8CDE5E2602EC6E99168357A69816EA5A4 -5945A242CC85BF5E7B665DB8276C11483E879A1F9A59E4FC8D6B700519ADD96909BC3EB0 -DDABA0BA75AE8809B6B802FA830E63583622109614A63B928AFE297D434A33BD0A12ED89 -0C15CAD72DBFA7EB5F30B12077EF47A6EC309ED1009141176F7932955588C053DF307C96 -B719564855ACC024859429DCF8DDFB3F7ADE1BD65C9B6A97BF5A56FAE58F41BE9ACC6AAA -B0356F58900CF66FBAB2E2439C031103D8600FCCB20D209DD510DFE90716F654C539D349 -99130FA43BABF53F8AE298F10CB073B797AA50E00FE9F88D9337CAC4DBB0FE101C28283E -6D4DB8FAE80B4A998525F647E7023AC5B9BAC987D5A9233541214BF0DCCE6C524BC1C56A -ED18B4F76F8010AEB8E1024082D22AB60BD9F338AF6228A09E7DFA8438F2ACC066D2CCD8 -853062A5818DA00F1747B6BAB166F40D7639DE8CA985C2808B0010608FC7923C7771F728 -FDAFB1F118E2640C2C42301C465F40817C13E20448F16AC7D42E39FBE359F744C12DC67E -99A4B92D9691E1F6D2096F11FE4F017A4C2B22E4C550DD25E3E31E8531CE8DE879451600 -4C9236E36E8009F5706C8BEE72F007538DA5918999B97C386DD6D62F7B433DD99B74B490 -263C2AA2D059D2DE95CC604A5442116DAE3264568FFE88A9B1E4801052084DC11101EB03 -E514E220E7BA851FDB7B5C8CF635B2496FF38CE6DAA23FEFE02C25B520473E5E07EB9354 -EC2CB7A7A75FEE158D51A7CBE8EC36DFCD038BC52E9FA6483A5F4815C132B2C40544B08D -8C8A80B1916609636C2B53FE27E2B4715852A6F035C139F9EFA33ABBA2550B8CEB8F9C0B -EF80BF543D1745FA88347997D01BEE8A8E2FD52FC40D3BFD3D438FCFA1CC5B4082ADB51A -5EBE54EE1C95DDAF8E5FF6FCC98C3336A292A0FA05CB5B48C122D6A3330898979AAD071A -4BAC19B03B03CBA077252506F8E68EBF004B962BB85B15A87FE5497E8F2E208117834E48 -62EBA7AEFBA9A8997F71142BD6F6550F3BB358738B182A9CDD411159DA92B0B3E49E4226 -627A196036ABEED57F176C72B30AE16C1C01B330577FE8FB0C0F7E09BF821BFB4F056A8C -B52D5797C0FA48A9625292440F76387FFF46837A2445688696830AF32EACB2B6096367EB -A8C8C42341D2F3EB5D5190D9F7241FB1EC16DF0D6D40FABACD1D7E99EEF4AD6118696165 -3354A8DE539F92DD3426A196A7DC33F92B170D57E48AA80902D9F31AC582A4B569D15C86 -A8E6FC94D75970BC6BCDF2C77318B1DBCC7E398B48FAC8D2E392E93CC37F0BE6186DD645 -EB077151C6F58EE8203B697010EFCA123FA904A4EA80388FFD88C126AF7F6656E66B5417 -8134B77DB4E0797C9213483E787939113C39215FB9F5B3B141512D962C500863C2F362C2 -3B73E9AB89571A003E413435A02FA3569228CC6C0D5EDED34373FC7EBDA1200537C1B72E -9FAEC2E74E5E6C3E13CEF1B8F332E7CE6CBDC4A17EB9CC265638AE57E28E34CE99CB44C4 -AF96FE97893390FF2583486F7D8B0B2D9B13A8DC0551E8AB85046C9E4091B6D5D5B193F8 -3EB3E2131A6EC9DCC9DE88F4B64E45AE7B5B6CF10D4F812C9C784BF65FD9E942951AD808 -FC9F010A0F45723593A354E578F8FEB67978485F40620C83EEF210B6678CF323437DDC88 -5436567D76EEF3A83448EA76A3306CDE9D5045FB2BCAC94A7A58B21C0166D5C4339566C4 -203535359326524E7AE47FD406959610B24FE98ACE978A82B5F644B112EF6A289C018244 -85AEF2D0C38178851D0D5A6612C861AB52B46597558EE8E588F95BC8D657B02AADE2AA25 -9BDDA214A736CB417F9564699D293A98C7A7615F47806B5424CD1FB7292AD1F2D7DF6837 -675AD97FDCFA6825F4E22A4C0930299B0CCF9BCC67806E4E6A8EEDF449D96634C19EAA00 -912240EADD63C8FB02A227B987A17964F5C867079495B383FAE560309FABE8BBA46C3F85 -E766A98E5B8A980DF3205AFEB8416B4610E6853409B658DE2A7A3C2C6A292FF33A46D9C0 -E34FABFD57E19C89A8F88D8C4798A96F4C8C3655808FF336C7DB56F52E0C6AC761DC0E0B -39E33065A02A8812D91AD303F3DA2C1D61913C76F1D2DE272503B223ED71DF65A5168433 -A7BB3C3547A7E6A5A190F200992B73151BB9EE0D8D55F9AAB9D2E73677D3AD16D20D553A -D7A7A1668B19F58E7BB9A5CF973A861645016DC2D07A39D5430D6D1644B88035B8575DDA -D2DB0E6C040FAD93BD0B8486715821F2D47814EBC7EACE1A5CB5D3A2E19352EEE008F258 -6192627BD0B3033199DACE43803176F7A19946985CF975DD1BB313DC58DDB80A2671637F -E89D6354DDE8F8825550F1F616DAFCE19CFA095A36BC49B8437C00DB2DFF9B82ED7226A8 -06020769A534706BD6180DDBEDEA953C98D639FBC8130732B42F0C512237F541ECD03603 -8EC9F5BEC45B45F87A324B60E13280A18A2F6F333C34CC254464F774DD53906B7FBC79C1 -CA8CABD58310D272CB49F4B3C83EF616A9743CE5C56BF52B00776EE469A45B18B8457CE9 -DEA7CD6378C87304224B578E213AD3D9E5FF6E642BEFBD59162DF73F0B631C8831132284 -39374839A1DBA4C4B4C4E30B7D411B5247F258F18A8723659A17A52F8194FD810318B32E -19DC9B355C028E98A36545D65073D0F8F4DFF0F9637C6F599C2F883B10FADE5077B49257 -F16D0ABC0DDD9356F6B10FCB64D6B6ED9888E0312B092DC9D154CE76AC14D14DB564EF77 -0EB48216D431D21672D50AA13307610DA45B3AC8FA46EE7F61D0C643E53B65CC659E91A6 -71BF448EF3FAD8D18794B383523AE67CE1903510BBE2B2D5CC5D29F3DAFF71A54E582E22 -420D62CD7CC8A4E093207432EE4FD0FA3B2E72E5E4E62B450C557BFD0A83C540C1FE9E80 -C62D150ACC0CBCE73BE88F13D7E4D9A3791C806B38D12315C043CC022AC8CD3C61331345 -5D19B2036306F132C074043CBFED8F1C1F60C74F074708D3755A6F28628B31C0D8068669 -C8BB86C6412F32C8D6772CFCEA101D1ECC32AEEBDBE423A7DE28BE36D54D61CED5FABCF2 -F0E731800ABB9B10E413129331BC441F80A6617F9A5E551CB4BF74893227C7D9DF21DC11 -6C7E796F8ADEB43D2D223B4647DC5D53E65786C5A0DE8F3CD5BC6662B051291E36D47414 -F94D999AD31C1D6916EB723436B41A72844806C0A8D4BA41A04F1848DF180A3C3E27D8BC -961FC8509CB3D4069B33C5E01F3C0B04D55AF2EC4CFC4DD7EEC9AC9426CC907DC70D9EC4 -E428D30D8B28A27EF202E3788C5D14B0AF13D750EB7A8C5C4E5141AB5A477BD660753B64 -EF5C871681283A0DA5AD98DB70A90D72BFDCA0E18450D3091EFAEBAD23EDECF3F016BCF3 -BFBF286FD52B5D38D3D02E8161F8485D3B9B78C485A196C5CA052DFF546E4CAAAA9F9F8D -925E6F4D842B599E1A482C92F8CC86789F192987C3750771A11076C35415FEA472B29595 -9A437980A15C2136D26C83DA0AD724B1E961251F80B9D751A89A004DBD66C2540F758AE9 -A8D9A87A40CEC4A048AD21AAB511A630EE7C6DB0BFC5516B18140B0FB30CCD128475CF08 -1B10D9E5DED0BE1ED477142BAE698358D9FE9090CF0DE3FFF6692A18E2AEFEE40CF40B0C -AC0CBFAFD61CA62667B8C6AF75F2C8C610189522E5C334C3EE4C5949629430D193846DB1 -3F2F49284722C3D93FA7553DB263182610D960D1154CE3E72E93D477003E26405DF8457E -919785328FD7A0EC5E75FEA4A69A4B83A0B1BF8A257C95DB99ACE02E4E1AB1C7381F70EE -AFF4424E5DBC89F8744C31CEF9E39CBE52AE7B222C3003ECE5CDB70CBC5705BF14A8DD96 -858B2D91BCD9048CF5499B557B47EC7EAD4F691D9C0ACB5AD0EDD67F18D0C60BCC5B26ED -977B54870AD334A5BC6FE43C10EFC67449DD1EE7E447AAEA62CBBD3708A5C53B50D9A422 -D90DED5D2DE9496DCBA55431336DD959C87DB3C827D74142F295A7FA2AFF3FF16B6B3A19 -1947BEB998BFBA0058C8A0C851E677368674FE190B2498042A1091F5DE30DF16380DD89D -0F8D076F0AEA1FC15F065FB5F094FD7DCB9BEA369B473A796441BB35C3F7D083CDBA9263 -3AECE8EE5EA3A475C84552463F714F38F73B83ACD3DC7FDC9731E55C25735B62EC439FD7 -421236A8ABF2E15F572D93F863CABB5104F2F71C5CD8360ED6A16F0EA6E20965EFFFAB3B -9AE5935C206A074C7C3A21F8B50E6E19950DC462F06515B3271974877B0C33B7D2F735C1 -06597443E2C5421CAE134AF0E035786DE9969914E2F0B8982F9496D64DBFE6DDD678B875 -9825EA82937D32C5D3DF19C9F35700C733C65D3AE498C2039D41BBDE6CE9D975E753A022 -67E5354D1739005A656DEA77ECEEAD9D8C3B85512D8BF6B1B5ABD84B6D05CAF87B254ACC -3F650BEA548DC6EF6B1467BEA6E424945B7A6656F5DBC695D3E5434E0B88E5BE68B5BDEA -9F91337F7A74A5E7AECF9EC30AA070AC66E8B1D8AA70408B0F11683BBDE539EE5DBF9D32 -9B1A1C8CC14407B0FD0BC4E282D2BB466E3CFCB7E2E375A0DD49FEC7A0ED1CB15EBCF2E7 -F96F1094AA840E618E69EC295ACE5999BE90F77C523822EF0C15585CD816D7918D2AB0DB -65CB72F1AB5CE5625C75B493E801D7A0DEE575BCF53E4F0BAA2290275470C5F6B49BCF03 -E4E8E31CE64D3A6A6C42ECE25B6BE2D2D8D8A821C4C727806944639CB4DC84777A2CE101 -8CE5EE0470D863ACDBA2B69B48EC7EBB23BC73760396F13BF6A60BB6D664D7B553C2AE9F -32EE16F06A114A3BC7289747FC6D85BA0332D23EC947B25D6C10750A83027A745C1737AF -E9BBDB080BEE663646BE3894B184F9B892CA8EF2B3AC255DD53388D87859F9EAF8BC82CD -B12EE266A079F78EA317C41C505CDFA41B1CDD8A63B884DE1EEFDA7B7DB1EF77D0E98742 -79C50B55DA61FF95BFA7076ADF6BD3586E2120666BBCC3E431CBB19963982E50B9B1F375 -55AD6DA4AB02B305E074972C7961D66C1D1327AB93813F7A7C6C860A81281795033C8AD2 -8FD44E1AF0668D8ED469DC184B612DAFC1529F3AE5D8420B703821A559D58D5C574C15F4 -9C6CB20FCA5AF432FAF63E73F23638129D3E80509C0BE0034458DDE29F5C88807FE1C90E -5BAC2CFD565D686945583260334165D27B08EF3C7839396EE421686BBFF67996E5FC31F7 -C4C96155412C4E51D5B6C97F6C47AE74BE984B347222CAD8B76EF218F34CB3BDCDBFF446 -C8E52F3E2A121903E260C844B093439194BD3078E158273B28A7674F0528C9306CD09C1F -8D612881D46B8D4AA4C33206EEF23F0DF150AB91D4EF3A55120E3CABF490A2FDC34F85DE -0B4C3E712D3DE425B3B0B5053CCF7729D8FF20207EE09D7ECA11A2685FD4AAE6275B9C0A -E26543A3F0C826FBAB318690FCB471623009FC751E656D31538951000A413132B4C95E2A -75C56BAD12A492F5F44C14016CE7751831A892BAF050422E459E71A614409DFF87BEAF8E -9D61471C279C9B2981C3A1D119678516111B965A060822114F9CDA77DF46059D434C6A0D -D4E57EACFDB4560FD29807C7160051BB778CDD807B3602F6CA02F699E8A42C7A6143B149 -2E78C8796116ACC803B5CEB308B9F8E9F11DCE649719618A9EF689919605EE6FA001E178 -4A008D1D5AA354777566B4F5D496ED915709E2FB39688745DFCC3AEB5D520B77C8066429 -6C67D95C50FB86B9DFBEBA2AD8234EA2C967A02B72DFA5BEA5BEB8DB4A30428FAC98FB5E -6FBECB93EABA637684F4A82447EC00D422DB058D521299658F7D392FC1B0130A9B995477 -7FC2011549660457BA46B01E4D7AD51D1829BBD0C80576E893816FF1355C006FD22876AE -654B0D851931E1BF3E80090B762846ADC7EFE333D7C6D529D6B50FA87347EB35438B18B6 -DAB4B45CD3202370F744013D15C01AF637A755734706E667AFF3A498F437465B45255BFE -C519F8BF9FC37A61707A8D70F26AC6C90C73AC9CBE1A2C7F9D607BFDC999B784C7D15BAD -C0CED80AEE87A20D3CD2C57834020350B4310B17E62B192D376EF6947C8EE477331DEA66 -CCF090F1787B19397BD8129449C47D5E03EEF8D4B8238105D626115DAE76062AB6A01E4A -874EE181607F505FAEB9F8743CC79A0C674B8E5BD9EB8D02A5653C8AD1E6CD5FCBE83D12 -A64399F646860E564F1E118C5F18ED59BE775F93A3CDD8F1D4630A48A43C0F2AC8DA9A45 -7562CC56B57A802A3F8543BED0A96363529DD39675BFF7DF6F532D190BFD5C6B8AB3988D -6D375A117DA0C00AA1C9AB60C5023D52793CAF943B7318DB12377D962E53DB536BE2A1B3 -0199D481CB100B3DFC30F3D01EC4EB8C9CA7CE497440C54A12F1EFA9B50ECF7C6AC073F5 -12AC731C94BD7C24209A1BD1340DD6CA5C787E42DC97E23B125B786D4AA2B149D05EA6AA -891AE6BA361D1A42665E123EFABCCE667BD894ED319B8CA398EB6A5E213F813FCC912F54 -205D51716450E1744CB2A5A8612EBDE46F35257AAE6D3AEC55D65E07C50736AB52295D2F -5FF8D43AF818B05071354B5A462DCA72E6A5E482A807802A1DC14132E50425E75C6CB612 -F558228B7659A6CC4F2BEE307FFA31A861D88C994C650DD0F1845A26EF0B8D975B9E2120 -D6C669DE20802B62F23867D708EE1FF1EA35CCD53F5CAEB8EDA12E12A58E9F90D150A692 -194564E1DBB173B1B3AE5795460A5D1204F1C02A960659A0C0063A7D5E7497A581B0972B -B235C90F7D2F89D6F1279AC5A0A15DCDC5B1391F5E5C94AA03320AFB4895AC4F31F28C29 -3D9F6790243F7070E0AE21864C7A42129AC0EEADAD9D11CD447C307ED64DB0BB41BC3BDE -C9EDA6638EFDBA140CA92B7AD459482B2F573E29B03381A23176CEC332BBD7219231554D -C5FE2C2C56676A137945671D5F55E080EF0306681C44B994A5FEB444A672512C424991FE -6D8D33D099D464B44C8365D37CCF13792CD726375A5DA9CFFB56A5628FD564DCC124D2DC -4FC1E2AC8C0CD8DBA8E27138B3B5DBF786AFF59096E52C999D6A26C5637F277FFEEF34F1 -841A3420594149463AF075107E62315AA0B2D78CCF9A72D1EB9CFD1E7900B0CF877BE2F1 -C7A0B60A1D995F2C5C37F7EDCD09998E7B7E3E2A2C90D4AF8F9DB1ED529B9C3DFA0531A4 -9359BD1C4BF3B82A095562D38C7F15C3FDAF09BC39B670A529B9B7EDA1683D2410856031 -5737EAEAD181EB46EC51BAB3FE026E532E65F7E76A368C7100DD7AE43F881B45DE624CAB -E5AEE7D7EAE8CE12230A0336A098760C71E0003321B6F512527AA59726B249BA92A18C1F -1508D2E3881C1E004B830F9F24A706153F4B4565AB16978D608184FE0FCF816F567911F0 -9BFB10C7FCFE2CDE6ABC0C83657809FB8BE214E5570ACA4CB31226DF4F590BC37EAC8226 -DDFD5DF293A15CEDA79699E59CE459F1BFC0B08DA76C1234F996BF4B2B345A18B1AEBC38 -C04218864D6A7ED071173DB25DC27B8FA8A6DA897D83085CDDD24B3F3F1CF936C74B61F8 -020620AA9114411700938AB9E9269C13F97723E29E86EB5F14D1E86D15E8C8D678EC3CFF -DA4577F97BE67A8D3F60F56CDF929524E00A400C35BF46F64134324791FCD6DFB72DA7E7 -8B7EAF388F8D3C860E8E295867BD9032E74239F627DC645D0F2E99C6F56E3DD919447CE5 -CD3126F491688A53F54FACAAE5A14C796CD964F693C8556103BF132E93E2D9816282CD3F -32B84CA3798DD4675F6CC06E0A26C443E8CC9AC465E57DBBEE15BB206798C8ABAE8BF0F5 -DF4F029FAD45DD95671892AA63338E63779E321AC933FA3FFC368412BD62387E45BF0808 -7C3594EA7E6628BF2921F2AD33C4A7AB22DD7EE3272150D07ED085C5EEF85F5CF78FC9B1 -468D9698273BCBF896DA6CD43E088F7AF97AD83BF300817D35F93D74FF285EB6ECB223C3 -9368103876A36B5D84C099136868530F1DCDA96B56560E6B0B18D2C66C7FED082850CA25 -E7947934A1B66176B5C332CB1DA71B6D49754A06873F8C37C2C64A16442F0D983F6B989D -8153F027A9C8FED72FBB1C2A7A56361BE460D85338E47D0DD878336B040E685C48993D7F -B6B12CEA753190E47BDE31F458FC098A286EE4EF94A0804EEF0324F92643B4EB5FF1767F -9D0A99B59B1CEAA7FCB5CF1AE8B5E70E3949B085287554E8BB456CBA6EAC53040C589860 -195605D082EBF7E46BC4A7D2284C6518D8F49D524712B15981CBEE064FF6BFAA6BE46386 -BB84F6C20D8D0EC6A18A6B74C30A4BCB0F2B81F100A6E78DC4EBA3E6B9788F424467BCCF -FD6C58F5DA79A9691CB6D74DCD537AA085D385318AD6EC7C2F04567BF97EC15A73E963F5 -37CE3F70338D0E3994E0C9412702FD7BAEEE2E7A35A65E57FECD397D3EE54C863E641E6E -AC90E91A8C0F00D839B5ED9D9B2D7D78088907ED499480BB50EB9EC1FC3608A8FC1A20D6 -0C1F86BB28318444201E7E9F0D812D71B125B467BFBACBEFE734A7635786A7AB03AECF40 -AC5A6262239EF8E0F538231D2ECCC1720CD40D56CDAF38AFC197BDB28AFC98F57FC9588A -F65EE7268ECB44AEC3F5DA1453F0B4021BDB7D7829043C2B1D55BDDCF4687FF7D5092824 -30AC8A512FCD528156758D24318A9CF77678F040D05FA800B1910B33B7E12213008CCE3D -B9A5E90F708B26AD23F82CF3088D030B0559A6598FCEA3392073693C64AD3BFEFF0A05C1 -C9BBADB073A756AF42D91F8D88F0839E32C317319AB514A6A24CED9082F6473E2B983EEA -6724C8D82ED94A9A2BC4F375DFD2C84CCF06F9EBEFC67D357441CD976F0CBAA0C8BC2DED -B2AD5B5CC894AA880A164B68E2F5031566D8785EB72CB183F23AABFED617A6A9B08F4B8A -203D029CC05C13537C2FD2C98FF701CBB7FCDCFFF2DD7C1B152D68FD70E9F15ABB7634A4 -CC1DD8BA1F5EE887060F223B792F7D204A338B8A3526841D45D872DF6DC3A9073E4A828F -B70D993043F881AA83A543EB448B726197AEAC9A78CD6456035E5DCACA540D559601B595 -580EAAB91811B756A069A6EBCB887120F245D9CC70C730BF1F7990D119BA7CB75B5278D9 -045BCACF83947457578586A93E32B03E95942B3C036A21DAF4C6F0C5852EB71499C3B9FD -EDF36F528E9A0124992798C4BCED2711E4A2BEDA7A7FEA0652962B4448818A141E81BDF1 -2F11F423BF5675CF46B506DBC8FF2C4695FD27FEC069DF0A43B7136791E0A3782FC4C296 -9E06336C4F6109809F6ED605A56D1330046925FB5F62032E0E4E2C3FED27427C8B766C2D -26738A0AC701E7FD89EA4C9136E5F82306DB83E2E9C2B0CFADCE967B2A8EBCEBD67544A1 -89614D6B61E9C77AA77E3E739C03D593E00B07EA925F6321FF5B8F3C0FDBC3948C6D649D -96529559EDDFF57ECA28B2C0FE35D90D010C10E6E1B826CA23415E17ED863ED5715E7B4C -075F0E1806E51DB91E55AC8B64DB7731E8A33C1E8F5C8FBE17309859E5DCB58D10D3F658 -05923AFEC306B4359EC6A6E8F9DE3500799B7C7B322204AE472ABC69EFC886C11DE790E3 -603304713B3312C9CFC76ED0E421E2A034CED3E88D53A8D80A3F28F2CCB9E3358B152EF4 -421447CAB89C002C355274B50ADBA185A44A746FA19D7D481F7CB902E73E4AD2A74A1CE6 -3D9978AC3BD8B0DFD03E09425481F63EE2CDAB4AE17CD75A3AB05F9246B3DDC3E0AF1D9E -CBB521D540C01CC26CA6F3AA5BB49C804D312BA93E92CF11F6BBAC18A0EF051C52C41191 -8C01263AB5901221AE0F1BA6C924B8F937B49985E6D5C17B54E39E649E6D023F0AA42BC1 -D75A384B05519BB0E4118DEB70D272542D60E64957B749BB76016A1D356C681227228948 -5D89E1CD945BF9DCB49A5B831C082755540A032087A2ED82D166E292303CB1180C49E739 -5E403D0C5E6931ED6E36B52FAFE37CDAE28183F15C8AFE3DCCFD9A48A4BC21669E4D3667 -0DF71C4E6087F5B3ED2FA7AE8B5AAEF2A27F063332527B09D712CA18521744D89F90E9D1 -3BCD7EB332AD7BA8055BB8A859C4C16591FC3CE1474E260A74E3160DE648F815383B0310 -DB2FB9A4587FE13A4E909A83594584CFD382F05EAF8654DF5B44E39496290A7EABC36381 -8978F6C05B5EB3838572EB0C64C1D81E9AA0906FCD84E62B68E2D3BA876D536E7794067C -9C2370FF2E2E46004062B260CBFC29CB5FA0219C2EC6C8AB8CC4418ED8FDDE6747F8EFA1 -76A6C6D1276845AEC38B41EAB3727BBA0462E2E809D76E0B5BCAC08FED585BA6E5D8D0AA -3A36FEE108F55C23879B62C0A425F176E3C8C9031BD8B3E1B6C3D8DC383FDE0E36B33901 -50296F6869A4FC7E095517136B547295D1DEBFA341EBAEF34A179B070EEB60AA91839D97 -AA51768827E4A1CD55C5303D1D99341537B13FACB6F490072D8139BBB060FA1A02C93D3E -08888E313859B439AF27A3E5E7709BDA43F851D13AB5B2EF395A931A99D0A2FD8C6088FB -33D318D8EE1F7C7EE2D2199A638E3858EEA06B3A167F69FA5AABEE4558773A75610E7E30 -F3062576A2A7FD3E9F08FDAE5F1931A7FAEF85496071AF8E16AEE74C0A756927E0720708 -7846DF0F9A7C5444D007729FB69042683DFD7DB0078199812F85FC9DFF1E45C77C104F91 -37787E3867D5AC37FD7E86D52AC67672D89F04782F980EE918C6152DFE7657C6798557CD -ABC854E81C980DE5AAD8E0BC259247F73B92572973D482BA7E4F619F50B0DC247ADD0997 -CE4E98A71E4A041F46CE605D32AD047D2E4260033C3FBF80525396507815EEF46960A904 -1B83CF32AFF7712BE97D636B4162190F2D13CACEC58BB25E89496122D23CFA6676E790CC -29F48483788C724531BB3EDBD557950162907B68541B51ED6DD74C06C2BFD5346CC819CC -8CD654F17C9E798168C90DDEEE78B6AE37709D35923AAC0EF066146D93C8179832E1A7F0 -44C4637E560853D227D3A14EA62E2428567E0CEBCAA3C43B0977DA30251BCB74E445E981 -6521CF8F1955A9BF920121E4FFD1E022FF42581269DAEEE779282512DD46BDA9F7BCCFEA -77886D52E0B6A9C64A37AE0564DD09B4868BD1C6860FBFBA2FF022C291AAF670DB7AC717 -D82F709B07DABA0158FA67C0BC0DE958FDA1A63ABD29864C005FFA7FDCF73AFFA597D16D -51A1E16FED7C1E8DB6972353AE498A9F1B0AC3B778675312C7F01A7533E1A53F31964A3D -372A140EAACBBF7EEF600F69D8C466905CC21CFD1D1EB70B2469788BCF405ED84412A5AD -04AE871A79DEE0797426510EA8F790993002857BF2BD33963EC10B329A596226AAD8745E -EEC9A84BDF4793293D941756C6A582D273467EE704A878C40A1F8E6F4130DBEE6E484582 -4B78AEA786EEDF2E119F0D563C969A64B29F13327C52D03A16CD690341B2E0CA3B622F15 -ECC91DE30A47C82390F5EC38D3A52C24D3F4ED18E8733C1635C25854F05C394686913404 -E6A11B597213B0D506EC7EF6B9A6F4755B5A71099AD0FC9FF11244D70A5B987603F59AC2 -A01F251D9CC39F24FB322ED3FE0A0014A412D7C9A94088C8C2FC99657219FC27B299FBC5 -4E08F729AA6C013BB76CD320B23DDE9D9D9B78A34E6424BA1EB1C95B5005A53F90D3A2FC -DED3AB361A9388D2EE3FF47F4F9BFB29A1375351FDA929DE5A89346D7BDE86588EA5F95C -CD052B256653437D4B9F98F82A4E9D860B9E6CF4616E80E743936059A3ECEE59298A2CA7 -D83610215D893D065D73A0079E6BA899593C2D46866E980DC125DDA38519F181E20B026F -86B1CC7ED4C00C954146B530CAA58C3C52BE08BCD25DE61A6D7F8BF7C7D1E325C4D2D610 -169CCA13C7AFFA18DD3907C06A0FFCC09C7033B9B721871E31E4A25DFF7FC74899E1886D -8F3BD163AD7C34FB6A948C0FF667D97C8E918D8E663490CC7BB6AAF3689689725C07569B -D17661CB0990AF49011A3C324CA124C4CF555C021041B7D301FAB7D36518B34771E424AD -B62E962D8B2C46863DB108E1316AC529A404741DCB27DF4A081965B96ECB7C4564550BE7 -78629AD19568AB733BA2A1599F585BF5132B5B5E59F51BCF1C284AC371799C898950667B -44E71E5FC7E221C927DA70742469E3BFC1813CF5EAE32F109A87BB258438A6B744D3D642 -5B3C42DC2C542A8382C3B7BE8A5C43DE7E4A123D4130D3ABF3E95568DE13C5A5421352A3 -5A083A98EE09EB0EC99C0C33EC688D2573E9969AE74329D3D6E925C568A5BE0811C333C3 -372551F2A32BD9E0FCE86D3D2E83379BD55634101F863DE3407564E3A1A73D8572341037 -A6E3AAFA61F7ACCAD510F7C17261408E8BCF0AA72436BCF21F69EF6D3128CDFF321A54BA -3014DBB6E3354197EA88BD4AB5EF052589E3635601EE76508DADC4E2DDD9B9710CD11963 -B8B611C5D089CF34D6DB9E94FA9696EBDFE31DA2AC089FB93B8F5CB31C301607F29494E7 -490278F0E378BFD712EA4AA99234E3205D0F4E0F0705F352B62574B884E571183CF1D44F -C911A617AA1F23AC0BBE3E088A84D04AC51349E3E92ED227268DCB4DDA76B2DE3B473331 -91087C2A70BC8B0554C3F21D5B5A303F6FD58CD4343F0EB68087715D0086C3938DFF43E6 -92F01DB8319C4C2DB1E2D0B41117431086D4C51B010420F52C94C4B2040FA0FF2ACC4A23 -8C44EDE007896F73FD591E491C9359598F5786978E481141D70BD1FF759CE62EDE7648C2 -9E1C59FA4F7F61A2ED8ADF9E4654F1BF161D7E19FD0CA8307993F2FCDB726E4C92412D6C -F260767375AD211B46CDF539D66B2CAD7410FEF73A289812B6DFE69F6E6F24A3E66653E6 -C1BC17BA415FDA7E4FD466433CF5AE80827D928EE9A2B4FFE178E37B01E8AF99A8A26490 -0AB2637E25B3B5F4CD857E7CDC2F589CCF52D546F217D9B48C894E11F57BCFD6B6CC54A9 -B2242A8A39FEC8578F3F7D9B726F977F78103E4C2429A3C9B96372F3622D7C6FAD2C660C -FC73A3BB8539853BB061AB6F1EF3E6447983CCC1131276693F0BC5C2938DDE7864776E92 -8C2AF847D27FACFB07656A2DCDA533FF094927D920E227E9618A47E949E20A61D97412BF -273AFB50BF67F54190D982231FEFD98ABB2676E59E106F5E3945BB9739A87DB7E0091FCE -97F86052A8C9E9A49753E66CC322C3051FA489096E2FA9C2E5DF52E439EED2B9D1A8D918 -E19A9C8F97FDC6B9A8982A1AFFAAC4E50899661D2BF6EE5EA6F1FF825114A1B3316BEC52 -EC64416C7161B920D7DE9C339DE346A2BE6792F82CBCFCE4FEE70F04DAAFE5FD13778B1E -D7F5F6BBC097FDCADD6808536570ACCCF31DEBCAAE581CE6D4C6364E58665C530026FD50 -1FC1B1414B0371D2BE2675E304B041C7E635DC98DEE3F1811EB0995FB3167480F31C8F8D -85E3B5F1054AB5B5721B7E8C3FFAFC18F50C8EB58A5CA56DDDF3FFBACE09BDCB27852DDE -9A1DB9A9C4A51092D145A41E07981235051BC56F9319F03FD37B28388FF4AD8007F98B67 -C7E8FA79B54EB9F249A0A383F7AB987B6EDF5508069528D49FA26659AF0203E73A13AD7B -3F64D294AFF49E42A76D493AEE50B099E049F8750AE058C2863FA2F4EF9EB18F6D2C11B5 -906194F7B480DBE6FE3D6610BD08AEE0078BBA1411B26DDF14B16A3DAEC2B18B29EDD557 -645FF36507654C2A86B7B2D18C5F886E8F02FA3092D35D4802AE25A6CDF17C469E85F67B -1964A75CF22A241F2580875F639ED480E7AAA04620C6C58B5C839F0B659D9D2AB6EE6E0C -80EEA564E9CF0F9F7F0E70410426047F0EE92451C92C483AE8F456FD95E21C7549392C5E -41018826DB42CE4709FEE1A86F6CF18A0DF73A96F8147AD819E5639F95E6CA508B9CD05F -D0BBCD49AA42A09A168987B7D8747E4D3CAFC699DC40EABBF633E2B6339A824058BDD026 -180BB7BBE9937EC7B87E853DE8308BEBA2D7B1156E0524DB6D983B9EA396B3BCB9A6E425 -8C55325437EFEC9AA659E57B07B838576B65B10A9B4A77304383D9540200A24ABE5663F7 -29C64D293498F678469024A1F552E508B49B610D3EF334279AE58F4BE914742752E9FE31 -1642DF1310E0E54CABB5CFF9CBC0A9FD8C81AC09D7762D9A989C2ECE1B24CED02D991D83 -1E6BBE94F7D981DC75EE82BE1AB6E1021046AB988E5147D3E037E447B1B38834F9FC48A3 -23A734D2DF86BF8313892964B6FD68CB8E4DC0B1EAAE8E85B137E34C22C8F6CF2A5DE4B4 -B914D13FE7C0E3B73AE8A998CD19BA81E3825ADBB97854B7B89C7FFD8E059340566B7348 -36E6FD18BA8B1B60EFD13DB954CF005A501D70673FA63F79FDFFC78571E075E0503A472D -A3AAADEE2A7EC2710E7E910C9B3866BEF6001C47235AF38A70553649D910DC9195389373 -A87A62E97BD65CCA58128204FAE813DEE989DC1E72D36AA9675A25ECF1B8FB2CA45DF4B0 -23887604842BD3626CC1DB5722382315912FBC9C383275F430A76AC081366D100F40E42B -7A4D3A3CDEC8C47E8C56C696A756EF3EC9B47CB9570EABDDD906EECC8F754C92B174562F -118BE4FF9E0E84E15BBE5323267155546449138A613D2767AD28F188442F1FD558F1D09D -2C296FEB0FD94EDFD259F9C0E11F255FA4C39DA709FF2AC75FC4259BAD43DD8B27127F04 -049683A5A26A38E27654DDFD99247AC366003DF016EFCF2D96C6B2F9858F21BCA07EB0ED -516C2BC8EE39B0C568FB5FD8886B21632AC942E7E02C7BB24E007A08E8F628D74EE676D6 - -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -{restore}if diff --git a/fonts/Monospace-Bold b/fonts/Monospace-Bold deleted file mode 100644 index 5474cd6d6..000000000 --- a/fonts/Monospace-Bold +++ /dev/null @@ -1,2354 +0,0 @@ -%!PS-AdobeFont-1.0: Monospace-Bold 1.15 -%%DocumentSuppliedResources: font Monospace-Bold -%%Title: Monospace-Bold -%Version: 1.15 -%%CreationDate: Thu Oct 27 10:50:21 2005 -%%Creator: mike -%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. -%Copyright: DejaVu changes are in public domain - -% Generated by FontForge 20051018 (http://fontforge.sf.net/) -%%EndComments - -FontDirectory/Monospace-Bold known{/Monospace-Bold findfont dup/UniqueID known{dup -/UniqueID get 4234665 eq exch/FontType get 1 eq and}{pop false}ifelse -{save true}{false}ifelse}{false}ifelse -11 dict begin -/FontType 1 def -/FontMatrix [0.000488281 0 0 0.000488281 0 0 ]readonly def -/FontName /Monospace-Bold def -/FontBBox {-141 -1034 1457 2154 }readonly def -/UniqueID 4234665 def -/PaintType 0 def -/FontInfo 11 dict dup begin - /version (1.15) readonly def - /Notice (Copyright \050c\051 2003 by Bitstream, Inc. All Rights Reserved.\012DejaVu changes are in public domain\012) readonly def -% Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. -% DejaVu changes are in public domain - /FullName (Monospace Bold) readonly def - /FamilyName (Monospace) readonly def - /Weight (Bold) readonly def - /FSType 0 def - /ItalicAngle 0 def - /isFixedPitch true def - /UnderlinePosition -221 def - /UnderlineThickness 246 def - /ascent 1556 def -end readonly def -/Encoding 256 array - 0 1 255 { 1 index exch /.notdef put} for -dup 32/space put -dup 33/exclam put -dup 34/quotedbl put -dup 35/numbersign put -dup 36/dollar put -dup 37/percent put -dup 38/ampersand put -dup 39/quotesingle put -dup 40/parenleft put -dup 41/parenright put -dup 42/asterisk put -dup 43/plus put -dup 44/comma put -dup 45/hyphen put -dup 46/period put -dup 47/slash put -dup 48/zero put -dup 49/one put -dup 50/two put -dup 51/three put -dup 52/four put -dup 53/five put -dup 54/six put -dup 55/seven put -dup 56/eight put -dup 57/nine put -dup 58/colon put -dup 59/semicolon put -dup 60/less put -dup 61/equal put -dup 62/greater put -dup 63/question put -dup 64/at put -dup 65/A put -dup 66/B put -dup 67/C put -dup 68/D put -dup 69/E put -dup 70/F put -dup 71/G put -dup 72/H put -dup 73/I put -dup 74/J put -dup 75/K put -dup 76/L put -dup 77/M put -dup 78/N put -dup 79/O put -dup 80/P put -dup 81/Q put -dup 82/R put -dup 83/S put -dup 84/T put -dup 85/U put -dup 86/V put -dup 87/W put -dup 88/X put -dup 89/Y put -dup 90/Z put -dup 91/bracketleft put -dup 92/backslash put -dup 93/bracketright put -dup 94/asciicircum put -dup 95/underscore put -dup 96/grave put -dup 97/a put -dup 98/b put -dup 99/c put -dup 100/d put -dup 101/e put -dup 102/f put -dup 103/g put -dup 104/h put -dup 105/i put -dup 106/j put -dup 107/k put -dup 108/l put -dup 109/m put -dup 110/n put -dup 111/o put -dup 112/p put -dup 113/q put -dup 114/r put -dup 115/s put -dup 116/t put -dup 117/u put -dup 118/v put -dup 119/w put -dup 120/x put -dup 121/y put -dup 122/z put -dup 123/braceleft put -dup 124/bar put -dup 125/braceright put -dup 126/asciitilde put -dup 160/nonbreakingspace put -dup 161/exclamdown put -dup 162/cent put -dup 163/sterling put -dup 164/currency put -dup 165/yen put -dup 166/brokenbar put -dup 167/section put -dup 168/dieresis put -dup 169/copyright put -dup 170/ordfeminine put -dup 171/guillemotleft put -dup 172/logicalnot put -dup 173/sfthyphen put -dup 174/registered put -dup 175/macron put -dup 176/degree put -dup 177/plusminus put -dup 178/twosuperior put -dup 179/threesuperior put -dup 180/acute put -dup 181/mu put -dup 182/paragraph put -dup 183/periodcentered put -dup 184/cedilla put -dup 185/onesuperior put -dup 186/ordmasculine put -dup 187/guillemotright put -dup 188/onequarter put -dup 189/onehalf put -dup 190/threequarters put -dup 191/questiondown put -dup 192/Agrave put -dup 193/Aacute put -dup 194/Acircumflex put -dup 195/Atilde put -dup 196/Adieresis put -dup 197/Aring put -dup 198/AE put -dup 199/Ccedilla put -dup 200/Egrave put -dup 201/Eacute put -dup 202/Ecircumflex put -dup 203/Edieresis put -dup 204/Igrave put -dup 205/Iacute put -dup 206/Icircumflex put -dup 207/Idieresis put -dup 208/Eth put -dup 209/Ntilde put -dup 210/Ograve put -dup 211/Oacute put -dup 212/Ocircumflex put -dup 213/Otilde put -dup 214/Odieresis put -dup 215/multiply put -dup 216/Oslash put -dup 217/Ugrave put -dup 218/Uacute put -dup 219/Ucircumflex put -dup 220/Udieresis put -dup 221/Yacute put -dup 222/Thorn put -dup 223/germandbls put -dup 224/agrave put -dup 225/aacute put -dup 226/acircumflex put -dup 227/atilde put -dup 228/adieresis put -dup 229/aring put -dup 230/ae put -dup 231/ccedilla put -dup 232/egrave put -dup 233/eacute put -dup 234/ecircumflex put -dup 235/edieresis put -dup 236/igrave put -dup 237/iacute put -dup 238/icircumflex put -dup 239/idieresis put -dup 240/eth put -dup 241/ntilde put -dup 242/ograve put -dup 243/oacute put -dup 244/ocircumflex put -dup 245/otilde put -dup 246/odieresis put -dup 247/divide put -dup 248/oslash put -dup 249/ugrave put -dup 250/uacute put -dup 251/ucircumflex put -dup 252/udieresis put -dup 253/yacute put -dup 254/thorn put -dup 255/ydieresis put -readonly def -currentdict end -currentfile eexec -11167FB533773667FB8D3EFE82119D83C5E325D3F9FA9CD7D01B1F3F3E52876279E4660D -B5D444F0B7CE226ED8DF687C9F94FD3D6282F90864241946A4B8E8575E48452B9C0794B0 -E485E0EE753D96B6C08DFAE68281203752A25CAF8EADA400FDB4F9AC57F07D7C3CED86D6 -7F5FCFCD9D4635282E9D92A5D9598F79FCB9FB1A677408CF7EDE532374FF6A6A9703662D -17B5D4F6CD9CF249432F8C76D70BD990DDA5FEBDB59A17FC8A068E1DCF23729F4CCF2C91 -59376F20EBE27AC7473D31BBE76EA67D9AC99ED58644032A828859BD9DDE391FC993707F -97CABF55422D4C37042F25E17BB78E63EABE7783BE0C56F59E74EFBE7783B90310E817D7 -A01D0AC31EA0C9B67EA7A3EAC553F3DCD76270BAFB428DC7AB7EE802E06EC54B705A5A6F -125250A008FA7375643EDFF171457F65345A08795AE0F1E5FAC5A9CCD3E258A9CF83382F -B3385DA7FEEB19F6D001A7B5A214115B01B441014E51A9BF8057017663645BCE7E2C6228 -940658CCE20121AE23DB19754C876CF1E7ABB40B2C949C0D45AEDCEF0165C46A0E720BD4 -6260D7AB7E8B5A77F64542DB42BB3C48EF0F9D026C8563478B4B80B60DE0005A3C61B5BE -DEF534F95EC79CDBCE5AE2CABEAE6289BE6D998B2E0B090DC31F890A264618C9E9473962 -3BCC88789A953C3C9BD07F5B1D7A1621B71A12FE379E85E6562D62C449F1EF7B467D126A -41D13410BF85D7735CB440A7363A7C9755F3BAA6554FDBF71FFBC2B9EC7EF2BCF0228D5A -98361A9F79AC87EB346D5AC82847C2FF02AAEAAB6C8272350A534C5BCBD678B28C6F7B97 -44BF3243F970909CBBE5E4116F2A1F56EF992D3EE51889C80FA54C5C9982BFD90C1ED83B -3D7A917C2588207D5A15D4316C408332591A8845B322124D17D41E10FABF2662439FC0FA -92B839F0A6AE2065D029FE012F75D7B4B0947202894211CD4786A74385DC0817DDC3A2FF -8EFD3EE4CE9F31AA40282C2A0E88D02ED77F991C910D3CC20F1A6C513E105A65117D6FF8 -B448255F66674BD2CD7B66EEA96CEE551D97B27E7B0BB692664DB358985F0DCB1E5FA9D7 -F92799971280852C5DB56F5E0788208521AB6B2589034B48624D393F005525342C7441E2 -67D1BD07BBF43C69DC7BEC5A47993AFF6F6A9747787AB8FF45BCDBE88FCF290DD28FB3D4 -2FB726AECC1832A03E970FEC71D7CA532B45C8C5BF64CEA9F6F9483D369EC9FC0D82E3C7 -A5863D816D35503EBDC1CE27C57258E0D773318E88B9006AA04541D8F14B4F23F7B3D23F -6B4E990457C5525DCA3B63EE75C3A53611FA30AEB04A33EAC156049E60651AE830726330 -C3530A1BE5F3CA8AB63BAD85DA0080A22FA54A6DE4AD3EE96BB9EC60D3EC4AEA7B5FC82F -8EC803B2C6198E5ABF9B67A82B24D8F5C672E6A825FE0481B1744DBC008B0B1110761F23 -ACF02284979F836FAC0BAA9216C35A5AB25B95197F282592E27C9FBD8D5EFB330B08A956 -B6079D05D4500F00518B164CECA074491CEFF09A99055371AD3D0A9F1DD2EF38B33A0FBF -6C83E4AB7584D24400671CD568DE38F6DAB1660578C65AFC0FB5AE268AB26D47F38CB9C7 -E48BD5A7D4F62199EF7180D923958A41F3FDCDB0A856375B3BBAF2C4C32752FB0B641240 -E50FD465CB53BEF09BB0D73D204B2064B3B6322A1D227E8D7B4FAB71BBD3E2FFC59712B1 -EEC12CFEAEAA8135895D705C6BD8DC5726A21888E25B675475D53431DE441B7177F41A30 -A216DC48B78D025AF5CFC53ECCF08C494EDDB4D460CADF0E325C81B932F4BE839E5B6F3A -3AF49B330AB3DD8637D9D0BD305C15D20FB84B14725D4269A78D316B2C2401698B125DEC -EFC2D7DC0206C6535846C435E5DDCD2294C5ECA8FE4C3342D032CDEC2398A43971E15CDC -CC308BA14659D338D478ED2C91DFEE282D221AF7150507F3F35054CBA77F7B68B102C7A3 -B0A94AAC5EB7ACC45F29A2B23A8BA397727E1533E78F84870A647D8D2F364F0A9D9CFB1A -F82AA4A2FA9D4A33E2F508BE63488D4505E4BF2B22029A24EBF8ED5BA75646FBA0B80D8E -B076A4028B10A89BA8735E03092071307C212B76BBAB410DD4783C8653F472A853105F4A -0900CD58BDAD0DE8967A8084D49E03CAE74D6724924E2D85411B0E712ED4410F59793490 -429E6271123A4A3B45BE180248BE5F2BF16BFECE9B005C9AF12523C38E6DEBAA9F1BF6D4 -AC2B193FEF981CD5E4ED3573521A82DDBDDBD61F43EFE8CF474FFE43D82DA07FD8A1A494 -6E8C187FC6C85663A05E65BE968841C923CC2AEDC5193F624FE2FA5B4F33232BC9361141 -60C54189960EDF10F1B44C91417CA26FB66E4A89B19AC2280C59CB7C3428A0251E34B5AB -90368B31EDDFAA2BA749EFBDB7C99EFB9C5E67E9C6C62438E73DEA816919881E804E3D8A -EF1D5108C4895E2E285618AD7DC3A42F1E28378335D46ECAD9B3058B165257BDDCEFD817 -350ED1B3E3ADF86C3BA4E9624C2E592A8216F4B2700BC88992913406E7DB2B5F5DF3174E -A6D7639B616AE160282DCFDC85CAE0C73F3E695B09EE0FF5752321EA51A914A7C89FD9FA -0E66B2F01EC9033EE9DBD246725CB36EEBD34EB3481FC21C4AD3AD26B394E858E3F4C3B9 -4CCF83497813A5CAA32C5FE41787FD97734992458BDDEA1A9CE2D7135A65B592B73FE851 -C2671A257B5518E2C008553432C6FA79BCA95000F31BF7F0AD101A30607D1D34987D89B0 -F3E1A190231908C2451B8FB0D18EC8F873AB09F1419D48B041A02BC4F819FA17E81C3289 -77EF1BCA4E86CDE766B795EC8A1B299F57DBB4C72660533C8A96AE701F9EFBF198FE4D5D -C66C3EAAB293D0D9D908236037C83A759F2156AAEA78B6AE37DF0AA85A5F89215171FC75 -3A323D43A3295A2462D8902458F15F6345815BECCD373E3EF4F0993F7D52AAD4E2030CB7 -2862D8FA6E6138B71ACC7D62E7261FBD56148C8DE661AE9844FE920ACC2503E278DF0B04 -F669145B9C8D435BD90C3DBA004C09B39227A5409965E6ED90E5082B923D69B0842FDB38 -0D742890F9A9FE4BB8F923FFED2581277AD8FB61E2F17BB90D1A7E4195D7EB3FF833FE3B -72E696C3DAE0A3A49918540BF1C6046FFF094E01680EA558415209926FBD70B3CB4B044F -DC5FC844150C311F9C1C031F4D5B99DEE4F72F2307B8EFF74735B1ED593465D0D7998E61 -DA4D497AF119FC332156B8D882B4005FC8850E4DA96B7AE93E1552AEDE068D0E2B266C45 -0753CD2DA48A059CEE49F1E86E2F77F701FB177FA32D5F93FE4D6A01275EEB54692AA6C8 -95EE530E862079535A543DE4067CD630A7D8CC83AB9E04377B8D3A05F23280A6E1D68356 -C76D531990EB15EA707C0E5BB5055F428997E2A731A4F7B5288E54B2C4B949833EC117F3 -0A0575603796041BE985C63F48CD55E76638E7E54BBCCC9D2C73ABE423C6A7159CCBF80C -8FD931FACC6D8257D9202645B3138E367E160CA3CF22E1C5ACE59AFC77BFDFC25A5D6DDF -E6C2F6B68D062D0490D05B05B55A7A0C6E56A52A2EADC106E3BB6410205CED012BB49DC3 -6EC89674C22C7D17E3A6AD10A2812095454DA4D44414F42A8678BEB35D372D3851EBC535 -888D9E937906CC0475986D2656E16D78B391E8E8D3E9C91D980D526C6470E79B728ACB9C -B9F63C6000B9E60AD76959F7B14F06B631778911EA9DB59D8B9BE7DECC68DEEF068032B9 -272227B91840B30B7506A3FD57306015EF686A174F48B734D9070498D2184773E7353A24 -51D3276238B8874FDEB7161D1A8506BEF79EC5245651C29B9251EE17F834D200E2219A3A -9CD838C9BB31182C00A52E06DA6EA4E446FCFB62C92284116E14C3D38973F1704D5EB2E7 -6E6F88F7444364046AB43C4D7D44A23FA47B5EA158949A3E1F15DE70F40812444C6F0F4D -A9940F2B3CD1B7B1450C1BFE7A6E111503CFA45FF012A6DED44CBA623FCEAF5262BBF810 -90A4FC1EE72D5EF3852987026F50770F7410E486F1D15D25888C8D88188647F8776CFBB0 -C7D4F02644BD13C84C592DCE82A56F08920B2FB13BAFB405154895458F55DEECAB846104 -7B157C02450E0E529A10559BD8CD9592FFBC923092C1EB0AAE96E5CE64A6D5B636988F69 -EF02E3F5B84451BA2F6CC360B647908FA940E844C3DAE8FAF73E9ED416D6B8A20660EAF0 -2C662828F3E137B0956B15AA9C129A312E753202D429FC734325F1F82A3D9058ADB87688 -4B979CAEFF660A8EF9191F4E0D2CCAE5E5458139A0AD0637319FF41CD7DE9877AB094F4A -3F27EC8F5C7D42B1D892B829E1DBBFA9295B8383B23658ED25DA227B9F625B89E26C854C -0130CEB1F82D24E53D5FCCE082433A4029B1B4A5905D25BA809EEA54895220DCAED1B2AE -879E7BEE3CFA3C71FFBC77AEF4A415C96F2CE40EF47E2080FB59AB00DB4E8D527D9E41D3 -8DE95CBE66EAC589F5831C4BF0BBE1455F4960FE388B84074DA43DF499BE3810C38A4BA1 -D23F3A6C331F09135931FF0A7D77160E3FC9CBF4937D5814A12848C17ED3F62FEE21B11E -43889F3947F67F66BE8DE7EFA954E2CF8BFFAA33DEE3F3C397FC572DDFD7E42578DC39AB -7CACDE5A30E25CB6D949E2C89B02E48F70CA2D0FBA47F19B72CCF99B4C71C69B1E1A381E -F620B2BF283FD34CE116F5C2DD1BB9DAF60BD431A6CD475ADA9F7490E17D5DB183763467 -0C167B8E958A4C476820EB53A778B9131FC7205BCA2EE3791B8FB54AB6996B82B65B8E60 -71529E0E3A721E6306EE6448EC9607C427F543EB8C6717D0BF598F619D36A3FD7C0E3DBB -E7B5D923DC8EF2BD288C55EF93640E4249E0E9E36E1FCC19CEC8619495B71D84236313E8 -C552ED0F230DBEE3C395269DE393EB34F630A5043B054154A47EE48BCFA1B3DF9D142315 -F1826809F0BADC495B2C7DC93D34155D843427BCF872288B49D2A0AB22AF861112C324F3 -4428FD31584D3B5E88ADD1EDD809DA66F90C756386198CA263562A95BAAA64B1CA36897C -1069CDE2D44EE87FC186A24C10C23B8F3DE59B41D1AD8E01EDF4C32EE70F053DAB84D24D -33A6024D7A86570D96B34892F8E299414E7084D99B3C3A89531A7861A39EAEAD9506B0C7 -017E3A730C91AF6857DECFCE2FFF482DB160369A16BD17456EB74258D2D39F7177998A85 -6694D74A57318BBE392EBBCD069FCC8EFB71AC1516E350FE4F936BECB2A8DC4280BF3A64 -27F1B741C4FD53AFB32EB78D9C06D74B5F71DD967E087F733D50655900E086D358B46C2E -8EA8CB494C0EBBCA4B0A9C74B48E0236F9CA651D73D2DB6FB1F1F6F7561194C8858F3FF4 -B3F46FED001DC472F71BD6E16EC1516605779FBC1FF81D6ED6996F955C001DB98BC8E7EF -16065AE3A00E7C65B4F080F78C5E0CBC9EF8D4E6A8A3E76258B31BD4F6766A4B00A37AA3 -E5BEC4C495D5B92E701B7423FF09FE895CA54F82D584942A93ADA1C7AC5576345DB685AC -6E04586E55C997FD31D13FAD4D2FEC0181A8A0BAD0CE863F9052735AE3F245F549B8F2C1 -A5486F65BC217A57D404832AE633EEEDE8806889AEACC54237FC2C493CABE98111D34EDA -6739E5CA8FA33EBD70757FDC1243E9F1D58D69796A7BE700CB9A39F69ED0D811D4D286D0 -80BCA0D9E78E54B63E640C53BD479106062953EDCD604D10F3FF50620AB8D1B79F1F873E -E47512F37296FA930C5FCECC28FC6025270DF4B2CBC428ABB88BA940AD55CCA0EBFDDF91 -3AE3271FBFA6DEE0B62D6B94F40053A11410D91A1CA9DB0E9947AB24EC592A9FF3F00FCE -F1C436A94332952DFD7825CFE35489E12C6A8A7521AA5B32B307A7BE5200E45E1FDC5588 -96F0A32E97E31CF40BBA08833E7D7EF78DDD5D48685B19943705D87E40C235C0EDCDC6E5 -93AEEB193C8957E5A05E17F4609FB3626BD14CB597362AA65699A50DF076A54FB1012403 -E32A3CD7761DFF0B3F41AAC0BD55C1148A24BBF31B4CA15608F12DA8F671D76E33E00AAE -450412798B7BF74C216E112883E9920B0EDD24701790AEB565D9BF4927BD3856493D6B56 -2C5A231DEFF338A986DEE08AE42A6FB978608C3B9A4A1D8E17164A08E2FDB5D1E1D38AA5 -5E2E4B4D2F5C0317ECE305DCBB207D7599943B1116A0AF9B917E1EE7FEDD285F249B212E -AA66724290030E1220C5E26EE5623636FB5897E0CE1E0DA00B8E716A963B4A9498E113A2 -C6E68B6D35503EFB27C4D82FE3B48A7005560DF04BC6AAA01EAA47070C81D60C40614920 -12654837A5317AF1D7F24404E050CDB6C3D1B1BA2480FC9940707A9984D507A3C078365D -30662300B4E28756F69F8B65F9212B4A0FE63448CAAB6331DA9E7DA65347370F03E51135 -591456D774040BDA4BF0D318161C082F69ED644E51EFE26EFC45CFA0391220B09BE1157C -3E4B55CF5203F2AFA61D7C0F6F281460A761987144ACA50A2834954890D9BC811B72D0D5 -FBE77F8D01496257522EC90143BDCBBC30EB08B9D15097E0AA0AC15F6F7FEEE91224BC4F -531A65905AE9337D97652775BD7C43740E29EB66AEDF91D658C2A2F9849A26457C8866F6 -F96D59E6721018ED0637D6126F08EF685174F130D9735CA45227B508B52FB7D9BCCA10D3 -BF16A889EEA13847DA7CAB63C73C0F068C3BBEA8E162295F884B7E28BA144E30450A823B -9025847C739B6EEAD71967F8DBCA0AC8FBBC2A7847BD7B957B8E44EC96CA2888B47F86DA -786EFEB0C741D7CB67CC25371E59148D4C3ED2C5349A1EBE6B9DC8744EBBA600856B22F5 -1832C41955FF582F4E0337809EEFC33FCDBF9C31723278A8D085F1404D16A573314F2876 -85C67FC651E691B1C12121B0E209E3E7A0FAC4272D58F16863202CC7594D0A6B10A4948B -1FEE719857ECEA0CFF0D0643154CE968A7E909A6CF9A9672B2159717E854044AA6A13F05 -A3581A47D624126498DF26635EA643734E2DD2A2EFF5D2F70BCDE6F39C9D54F0A1DC05D7 -8BE1C28495B0064C2A18A02859FD8B1F91DB7D29BBBE7401B1891CAEB5BE54468DBE8B76 -74C2257466643C14A9657C1E79627D8743C14B4CD25C03AE56AB0D1D5EF596474C7881FC -0706543A538D2017E48205664D7443834DE0344BB76CCBFB64824E753FEE37F39581FD32 -27AF8959D869EA87D806668DC29436C60A8C9DCE55349B7C992F821C28A28482843577A1 -44C905FED079A06273C7960BADCB5196F3C9E2DCC87C0B1E03C5B5CC64AFD58CC72DA649 -040DEBDA7ACDA5BE6DEB142FADDFD883DC4F004B7B7FC5A1A8A44AA9C4A6B3CC034D4F92 -CB6293FE7A3EAAADE9568655CC3CF1EF283B1ECD15EDA0A2E3CADE0C3148A5E449CD5D92 -557FC15E2A3B99F6CAB2DE4E3DDD038184E46F1914481C7E5B5A1862C899AAFC1A4965F0 -5C152968522019B3D635C2A67DA80CA60F264E6F75F419ACE6F48F32C5B6FEA7E340DB0C -5C25F7FA380B1A7D7F4534F0ADB02EA93B4901B581A9EE79D3710248F0A5E03BABC2A066 -5583642E51E78893B375950891A694ED7C18B2CE872619ABE151DC8710F5395E79E5FB02 -5F05A3BD9364756A54FB8B31C81C2285942F9FA6940BF3D676C16FBCCF34A433028A9A0B -18A39831E0F04F03D7A4465DAB80894AD108CCFD1F004013B9D619E0EB552DAA5BFE0EA5 -53FCC2D38EA0FAA38BC25AA6E954A2ABE35AEC8383E556D1067F2A8F4FEAF745DF55771A -95502B33A40807C7692BDA00A142A4EB394838F57880B4ADE4D21DA150CB60752D5A11E0 -A309F50D63AF0C59DB2D58EA0C827441997566E8AC0F39C354CE94175BBC62A265FCA7A1 -87B3BE75E83EC96FFFA43F6675D9374771E2AAB0FB1A14E9843F864852CDB0E23D30F1E2 -EF19FBBB4501D41F4878208E041A8B5C0A46B3352A2CD1F5BE78B3C89B58DE076CC603BF -04163F64660236214F9B029CBE96F0F4DE40C8919EE1FB5435FBDB25083FB3EBD505B0AB -CCDAE8CF4AEC0DA7D890621D68D0056FBCA5832892EBE9E2BB72A2BCBD224F1D3E8E7AB4 -771CAD9C6A4A0E40A6BFE15313E15EDED08DB8941E04094149B69FAAD438E8C7047C8A41 -ED0B10070C48F804C11FE88BCF655BA3636A4C7426584812DF512535225E8499D867F83C -86BD170854BE047A028889695FEE4E7FC63DBD109AE00664414FC96496F85DC4BB719BE6 -B7C5BC4D7289028A003CBDF447018981D0A8E11656A4D75D6F5145C5DE04CFD6234551DD -F89930E9267D1080FAE4F9C66B1BC736C7375B902FA53D9E8BCF2B5A7BC4B6341CD65F79 -9673CF52F26D649882A3A2EB1609DBF2D4A4F02DA65BB417EEEE635485BAD51E96EFD4A6 -BDF0861B1922D31BAE22AEBB9DF54E2C5ABA5B97ECCB069903B2AA28D790560A64E3B93C -E0D3FDC457944A22A390C874D655AEA7BEA5B305B1BCA2F13DC73F1E8DC7662E20FC276F -1D29E9D96E8EEF0E3B2B0FAEEF541CCAEBAF485019979872A72A8ABCF89071E28DF389D6 -8418B9EE2488F611AC58EBBC150F3E93AE1B3A1C5426EFC55B22E5A7D1DABF78E4C6D196 -757CA1120B657ACDD4EBD7276EBD4A67A7440B46FA59C59E2E6681FC2BBA58FC8A82804C -F8C4AC4032B09681B6CCA415C532B91CDF0B0400AA088C9044C3895F3BF46C611BA136EB -AF72086A9D2BC385201BBD78DF875CD8F7D67C0D4F26D3D9C6345C55FDCE9B26BAEA3963 -A7DB21622C3B3B3DD82DFC66FE74937EE3728FB20328B047463856F9BD4E1B1F0D088A3F -19408DF937A84D543A5BB17445979A37399586A368E99FC2542D8F401D0BF360CA619854 -EDD0BE31318865A20F221772253518E9E09BE9DF95901147411D4C0879D26D8F930E4B30 -3FFEBD5FBB076BD9BC5B0A4C99F0B85800F25994108428F98697DA6E7C14F1780BDECC94 -16B682AF9E92A7AA7DD0B33EB695DFF884D14BFED98D3D9F84E36ED4FB2DD86F1A42D8B4 -A2EAF46CA449E0ADD9BA067F2DE96897318BDB05A560BED7588999185585F81C9BAA0AA0 -9449C1BE1F14AA0C729E6B66622D18B8D5340B74BCD66B967E6F29365A5745012C881F6E -CB10CB82B46B7AC551B5ED79C41709AB70B4AB493C4BC6DA1CAE87011B5961A5FF4B0ACB -17A95F29D49FDE6830C3B2D170968738A8815149B242B4884161186079DD6A1217FE9CE7 -E60E7045A21B10138832AE5C880FD54FEC7B71974DC8704DEB006E01EF9F61F7FC22A117 -123D5A2EA6AC39CDFC6BBB6380404B8F98CCD1E4FF7CBBCACC4AA13F260C081D9AF5108E -518516A2C58B27CDF940B960FDD3D51AF3FA1BEAA90687FE8BD145E9984AD71187BE737B -6765F385FC7A58FA771C84759CA27F908038C2B7BDF81DDB6797A3EB4EB6E8ADD3FB9FF4 -E92692577747890EC0CF77796BCC291929FB27FA69F10AC7912D9A7E6FB84DE14D9D6D12 -115A8630F8CD3F26A86F291714B931D3822B8A07E9276659D5F36EFE72858A444557FE0A -3BDC70E9D52F941E790EE7B7454557B792002BB07AC33F10F2CD2E5E16E88018F6F79D54 -34E408572D30A3316C3F1BD36E1BA16A49C3623317C62ACCCFD869EA76921D729E70F2F4 -63FA8F0035EEDE8EAB1E7BEE4C389DF3BF6625DF10CBF19701381B68525BFE96C2CD919C -2922EE99525048392C1BCF26B3141B551E9DFE25A2D0E84348BC032C28ED8A118DB6A083 -B1AC44A0EC9184D101FCC6A9CC4F5F9756783376BCB2DC289982795796454835FDF5F325 -DB4DFE924D2C02458FEDED43FE8DAE2EC4BB61536CF755E7E920835455CCE84B5C0C791B -9CB6D494445F304B173628D8057F45E9860DC8DE045E351750C0E71B2B13F78AE4941AA2 -F3E2E8E05125DFE290AF817D87693AAB16345CF0CF6CBFF594371E9815A5F3360CD52D8F -095AE10808F33F86E07E4B8A2BB3486F93D04C88FCACC7907E359442D0CAFCC088657360 -6C54F56DDC5039A88396731AFC577DC3324A0D24AA9348245F660A496410E3286B81D6F8 -7999933D898C0FF0D3FCBA5F9D5CF3326B863E941236E31FEF86B7DEF1014D1C6CF86B92 -4FEBF9FDEBD3709805485B618DAD03D15B5C401B94B2F4500F2FBE72CFEC2A69164D6185 -DF5160441DF72FC509EB7C1C1322AA5658B09E1BCE9BC99763E7DE13057E836E57D24460 -DEFEA1CE7C2553BBE5F5CDCA7869B7153A0C5349A7D0B546F971FC63864BA7F00BFE51E3 -905A87F67398D568709D27E5A746970F72EF9C71ABE7CE96044ECF80352F712B605A6B10 -8426A06A27E13FD837C520096D15F9B1A44E6F955E3FACD91B643BF0EE74D3FD6E9A10CD -F05C01FBC7BEA26D8AE8565CB89BB2E52EC98A4F4898D146084CDF4E6509462D267CE81D -D7A0E6E2EFEAFA1BBF696803FD40F021716C2838C19D32F741FA334D228E2BD34DA2D561 -E6609CD823CE02EBB683A6F1EECD93C9103E5328143EFF6C9E05956969D2F25AC992FC76 -39B5C238FA4A3157B959B4AF11B6AA05823C015134836A6560EA7F07EC86117511E13B10 -75D0D2259D36E7B8065D930184C7DDB1AC2B42A566FEEA6927313BE91C7EAADA352D9E76 -43D467F94AD5ECAE37BC145278B4048AFDF432B2E2F219661CEE53E159490F1E0FB04DF6 -D42F4B322AC01E5732859AEC445D6E120091996DCE46602EFA8C01EB0E1D8BB6D0D12174 -E4990498577B86CCEF0EF5F7EE913A3A8D78EF9CE4F37B0BE1B5F40A4D0B00EADBD92C7A -5083E8D4B093D7BDA5B88E08D5DA4EBF7FBDEA06DFB8C5161A92548160163EB7AA97B603 -96D869524163EE546E1E35F764A4879D2DF056A5E77438D45D81F9356A4F8EA0D007E0B5 -DD2441879A48AEEDCB1A2F493C3E648EA138D4DC080022EC7A62E08373CF032F48C2F585 -0589F04122726500E8B29216CCCF6ABC2A04A726224F9B029A25DE8C5965A6ED3F6E3518 -B72C6A0A64802424E91DDBA855C20EC358F6FBD79C30CC6DA41C9C117B23139C150DDB33 -7FC090A907DCB0FA4DCF914E3CB53EDCF7DFB6D2A200F7C2E8401667D828605C64D9A62C -7360AECC44BC3951D2ABD75976528B0B98913A2741D0E160B48FC0458FF56DDAF4FCF5B0 -6A351BE0A90F851C44BEC636C0AC688226C8B0FD136F2B612BB66ACBA8FF149783F24B99 -A0FFBD405F655FE2DC577E01953716C44965782D86658859FA313876424484951448ED6C -E43106D4F8FAD95C3163A1AD47AB14DAEE015A257735B0B14BA8C1F807B54E54670BFB7E -9311D936086C6DDADE803F4E304B6E823A937E1A92C28C5A61D0FA1DA992DEF383ADC936 -E910075C9573B15ED356345ADF2EABFBBF8CB6D1D35DB404CB70DF440642562D8778E5E3 -1C547AA1DD408A97F44048AFF9317364BB3A8D35503CA5F0FA509CD0A20DE629DD243EDC -163402620ABBCC4E9D7E679A92E7FBC45CCD3923AEC1C20C8F15647B0E661F82C738FC61 -FB3C954B9097633B78D21C958491977377BA0FB845FA5357F3519572002CA6A88FCC39BD -CB51A2F2BA462905906DC5A76632708E41585A47368D650954826C722853A1B9364D3F21 -0A844A8AB86EF33C8176B76E891F2AEE7C1DD8C6B0A2B52CE2AB398533B6D862593D30BC -2BC3046C588E63E2C02F17A5336D7B03B8CDEE76F5B8A8AB32F431F9FD1FD85013779781 -274597F8B717CFA22066ED723769550D604ACA4772C711C672FA57A9A30E962E9ABBA798 -AC43517D02EC267E25CA09B5FF087C0498660A975A7BC1F726B9B0362E786A5E6DA97B9C -83C8B7BE172423C79CD95A2DAD481CAEF11924E4357833DF7692C22ECE4A7C92B6C84B8D -4E1332A9AC1C897DF2777C9A3C8AA4B77574A5BC296BD2BB4DB715609DEB685CE804B710 -D098CF51391D799C2F59017002C2F2018970BC614F4A4A246A49E795FC2627A5361A474C -4EEA15FD114C5E067D2F091A25E56A019A2DC6E00F9A3CEAE73F68C7387A2BA310AF9980 -8709635A5A2AFA101FBC0FF8AF9D7F7CC1E44FD2344BE0ED353D24E8624D464938BC13D4 -078B481D9B32937D75B52CFEDAC13FEA859123B76C50856986F05DAFA7AB1885ED53E88F -57CB20D166DA5B3723AF472A0C3BA1325015BE2097BA520E15E0CCE3FC8D3AEC37F3DED1 -671FDE5EF193849D5141B9956A68DC514D6A9FCD67AF25D8751AA32D114A58728CDF973B -05464EA3CA55ACBDBC0C2CE814CF10E8639273C33DAA263C217A8C6F1A8EB1BACCB6C7FF -E50DFE35E2919D0CDD7C099FE7313B8D610C90034EEF74908906ACE8631A193C5C6341DE -6A311DAC36AC2E9FA441E985249302F9273EFEA3FD5AC02111A0B697CBE2FF96B245D2B7 -0847404C184BFE1E3C883E66D90EA64C797597CDE06554DE22537638509E69D9E18030F9 -E2ACC66700F2429D8C5787837421EEB83B023FF531F48B40EBD3E58A13A0FDFB227C2A28 -C9A81C16A7554BD0831F68AEEC7A1E834BE1F90CC96D7E6C5B06A5EE89B231C183E2BAC8 -4840BE8EE0CD47E46517F6C46F27B3691E5D271781E612602AA935061867860C660E6BBE -E57583687BE3C61186D98BCF7EBC3A3AFB9B88C7C466DFA58BA37840A537F1206C522FA5 -DCD1C129B51AA8EBEA4F5883B7D1EAD667B178B56FE7D831DAF15C631F52197F7E92B34E -DD68CFC92859C49922404F21F4BBBE4643501E39AF897D93EC8B89FCAB6BB8912F42E805 -532691D4BBA96077BB351BB9070DC2D5C17D60374AA9C8CC6B6ACF929B77E252F71A6F61 -74FE8058A8DF23CFF45A046CF30031D87FBE2D408BDB0C9939FBF6F16CCA38D97AB8B19D -7278EF78814FA670EC235651A4703B229B50BA6B3EAEC8A22F41AF0CD01984238C34C2A7 -9E18A8E493F64F74EA3638FC4EF88B7D788648B4A2ABF02432988F9A3C871FCE7C59B339 -4E00539AB825DFDA2C420E378D1A20CD0FB6F060349ACBE266DB820841088A9FF50C2686 -F90561D8248881869D04A809E738761CD091B084610BA958A39CA3F19CBE38437DF0FE69 -D23264E56B4760044F11EC435631D06C6C7934427BAF1015C9BA4E370CFD16F1E892AC3D -7932504A52DC9D9576CDCE2C37AB393A55180156F6F583B753E117E42F6BA85A64155118 -2FE36FC5D5C4C80F88F8825E88CA9F5CEBA97FD8ACBFA3C87FC906F443361B71F6B2D875 -DEBFADDC1CF3EA8A7D099C30A4207CDCB3901C13FA35DA02FB95DD0E6EB587D46D739A27 -B2A325237F8D33B1413618E8FAF1C9C146581EA841E8B85174D1787BEBEE6E409FD6B64B -3B066F62CA10009B10FF02A9D708203C02EC1F3309653B617F053754EE9863EB202D7ED6 -F5E47D80B48D99040CD17B44646694D8BB68F39FD6EE4ED77606D35B4B668A16608AF657 -FEB98F826C291B26325B6EB8587CC3EDFF18FDC96C56241ED36A6115BAB6579D5CFEE016 -75D3E4F23ECEDE16AB09586B9F5A56511EAFE9BD38D5B36B0CA45F1992475C129798465D -0B7E94BE9B308E87794522507AC3AF7B29C91AE0C6ABEAB8989289F238509063C3E74CB9 -393F2934A5FA0EB173E2982F412875AB7F1ACBEBCFCEF7647203869322300D4C110D30EC -C61E846AD1FE42361F357830D5D6DE7DBCDA6154F8C5B6591EA2580F34C2C5422150BCC6 -E8076F510E571BF3633255677A1971CB0624BB1A6DE11FBE9CD1260FE400240C4C5CC59B -A1EC6CEE2E054995D33FB5ADC781D78A371A9116CD8F9DC09CFF2F3542BC1DC1B4E61D3A -7310C9674DC24DEC68073F4A979FFF96DAC759988735089B043BFCFDA203DA4F99D8E719 -1FDFDD18F3B53895F7AD46093B8A9D55CFD2E527A50F46DF23E0288FB8F61E2254DE6933 -DB7E78462CF03E7E454F6774415D3DF25926B9C7E48AE576B05FE164CDBFD3AF56FF9A94 -D0C08EB26C4514140BA55B503A52D98CEC90C721AC3D2E280288D0F73C2A5ACE87AD9798 -E15AED95526210EC6428D10C1422482799D1BF69DD623B1B16DE95592FCB6366B5E91C1A -3E03F6D086258AE19576E5E66F9E6A8C029E26FB7471ACE648E9A9FC74251ABF854772EE -B42D96D9C87EEB12785547AB30CFB71FE683C621CBE389225C1F0DD6CC7C24FB9E5AA117 -A4A9C83A78776C0198745A21B6E154A9D560BBA0D419092CF341F1606686D396C9F417CA -DBFAB2D360D2035196C85A204AC2F0F3B3EB17BD337E6E9D57BB414613A636E22E944FB2 -556D9046E9CCCFE0B82BF68E0148B17CABC0A926DF4885D2572D53435CF8CA462BBD9A53 -AE3673D6C6A7BB9E857B9E01CD95F2336EC1DB562088E8C2B4C6DA9F8E7F6506A6E69D06 -82785BEAFEE2B57C1BE191673F51C6E2DB711667E34518363119A27D7D3618AC791B920A -E66FDFEE50BFF094E587DF23A4C100EEA75AB4E1B3384F99966543D48A3FCAACFC76E5C2 -00DE81A2DF1C7D7E4FE1D8FF59FE187C6271A80B42C9CC854096BD3FCE15048E7AB421A0 -89C15E9574D535142E877C1D72BC5A1173D157A1B61768CD39FB88D574A1BC3C67BBFDE7 -02EE677084111B8ED795273745892D9260CED632285E633DE80F3DE62FBF73350D71D72B -84F5A18D3BD43386D05642FDF1FAB29CA63B82E1969679FAA6283160946E0E3C7B3519A3 -5D791580141D2F980023C39C122C2D102E4243502B517678C7A4E522753F91F4EAF73C75 -C644080E3509EDB077EE84E1DAFC06B25101FDF01F1FDEF68C326A6F67253E18A0336EFB -2375FA4F70A077A2D09471AFD31FF4DB23B1FFEFE8A0CE644E864BE68E05EE75192D65DE -9D14F9A385AA2B9C4E5BE385FF1E2C8C9ED1C9CF4D48AAE769AE7FD807280FE96EA290B7 -8DC5A9F78F89CE562183C8D8DF90E6AF14B20C0431617FBF64BA977EB5DC3BD63BF0B81C -AD3D586409EBB6211CCFC8CF02A74A30CB9B3D2BFA8F954E3F9590A664B16E4E3EE7092C -DE1D42C778AD283AA66B630DCD68C968B393C23CE8D76AA2A9B911AD24D3C73C02B2763A -088ED7A1CF3B4BD07C9A0DFF7B642708B13B8E9C32923FBF1531AFA279E162804C301BC2 -F69F4E24A05BC2D93BB622B5528D2263FEF2C8A4CC1D6F01C282FEF8A188484450FB1359 -DAE4530DDA82A2B5359165BEDF8FF28880034D8EAC5E7C03A8FDD59EEB8E2564B3889509 -27EDFD59C2CA931F4058C6406DB402B71CDD3EC21F2533903830DC407F814B86ED983E29 -991A94AF27C008B2B448972C6CB7FBC5C30D577774624318C371737D090F67F6C36FC195 -F7E2DB836CEE170DE9ABDB2D99FA06E340CB144F8E65A29F13DDB34D2D462B38C7CB6695 -09D77000F9044C659B941CDDE2CDD35D12D6FE94B502CE6C67824A695D42828E2D111AE0 -752383F579A86B38BFD3F173D34FD9937F11027F44748A8903342287B85AFB49BFE24240 -0049F4683217BD8974D21EF4E373EBE69221DE4FC036AD9CDE8D1986D16260F361255CDD -6357354CCC036EF8248802C5A9DD6BE470FD647A913409EB0AF9B629050604C166A70835 -3B78E1A2A179B3161553FDD55B036867914EFB8A9436F668860770DC512D8779E53883D4 -DCF5913BE9C0AA9D002788725BDDF0B5FDD0B3E49A4DB4F79E9D28FB4872CDE8999A0E62 -A6A7934A80F1DE7B84672A65513F4B1B845437DBA6DD1DF9ABF70DD356DE74C924213528 -F24124F153637EB9ECFE91AA71DB9A92C19B376F7E409F81BE121349E2D5173B821F018C -A19039FBD57F6F7012D5E4684D149E92FD9E1EA48F3037B162560E3F29C6AA8100C0A633 -D685733DBB08D30DE48A53E28A3D4776B715355EA7E690664BD3F1F77AED2343A05F748E -DB986519D8E92CB843BC8C62EB5F46E73D734D079464EBBC97693FB5A95FC3CD7EAD4A42 -AE6090F18938D286AAF8D0AD64C77E46822EEAFBB655A0995110AEA8C61C4F198EEB8E8C -CD40D1A4317508E96EF47F6C9F4E6D37D81F8296BEACA5FF63732C8FFB8798545E86539D -6FA3EFB324A89107534E638B54059790DAAF10234064B5C51B1B233F977777FFCF18AEEA -AC8E9691C9C4E5652B68D4BF4D262565AA53E2E639FA7DE00A6E8E81075DAE11D09DC355 -2DF890E2F4FB7BF42D94BEDD9FF9E708765DBB5E2D86984BB5E9FD3AA69529A7B4A547A1 -3E7DD7AF3DB740A8076FB06D05EDFE10D4F77467D4950E515CCA452D9FD9FB023B7F7AD7 -188060BC823B479ABE20DCA872E7028AB0F44C36DB113876703856A5C632AB2D5F6543D8 -98C9FC6EAD7609E3002A348619733FFB0C715F55842ECA2FA2A1B89DB93A3BA102504DC3 -BE1F54AAC59EC23E6EA3223912EAFC711DA3210451BB58AA7AB7F14B1621C61D9875C97F -D4DEF3435C6C8BF9BA8574E2D2CC43EA26E34C774953AA0790E650ADC9BF79D57D90F994 -C1EA2B452B4CC7A59463C7CD5675632250C7A51A13B494D7228EF4843C8C1A75E3E2DD33 -3B64FA9ABF7E79185E0CFE9E416B619BAB1F0E27524B1736A97629DB8A9723231E1BB587 -8F94C1A223CABA2435BFDCC4D2879FCCE344F6387E33DC32DD59D38388A7EB620A28153B -C3BD9BDC43B6918A64E00AC4B27B4BE4A1C7BBF0A6EAF2656E196F70526C7ADCE42B3A12 -DF7DF2DC001F96C1C9D6B74BBC11177772A906922EAA6D745CF0A63DEB2D8C0364D2BBB8 -0A0A2FDA0DCF6E4325742AE90BB62AEAC0DBF0962C8101216C67D0535E96A464BA2185CC -612AEB75F66FA580590C43D13C7C8C25B858F63AD20258BE0C77809A641A8F8A662B9C81 -0F4B3D1A53A80E062BF3F388A2AE1D4877BE988DEAFB3A5EE0743EE75CD07D7BD867606E -45AC6243C9C775429CED85E6E5CA20021C6603514D6A6B36C153CA063213F8894ADBE917 -891A1ECF868C64E7BCA2580A0180F6746F4B6016A5326D778EDBC993072DF8D6F78A53B0 -5CBDBD5EDA4C30CD8FA370F701F093A06904AFB9D82167C82E1D069047D37B9A437AD75D -9F7F6AB574925D167B6C4BEFEC85AD45CAE11BFC1396F5E6B39843E71660875105150AEE -F2290EFA830DF0B9817D30D52B75FCD43BD20D30ECCA85B20B32698600DD8A8D0BC107D0 -C77B43C87161B766C69F02E81D58DB7006C5D5660DDE997AB669060C70F8AC2FAC3E13E1 -BCBAAA34143320C795625287013C7EF306BAA36A61B9C71F91AEE7E543F4586A7D8BD432 -BE60AFE2EE0DDF5718B227784E7165C4D2C4610ABE9521854902526E553D0A0CBBC26EF6 -E109C7040C3E876F71581B2831BB782CED2D8ABA918859741B1F748E0B8F81B168C7AE91 -25957055231EF91B31C3C09E2FEFF6C1BA4CDAF73B07684306BDF5F735DE2980E24C91E0 -A96B53BF903A23A324E2C3DE3432762CC7995CF5435A07252D6B8053DFA0A02AAA0E52C8 -8AB643C591431E6D3271B7AA05C5B5EC445463AF4E13D37E419947E18F22EF9CDF1BD04E -2E7F106D231986C21CCF02D103253678E4F56EAE1078993E69B76D07F1DB6B7C91F2C754 -7D521E7FF0ED8DD23A6277AF86E4F67B1D9B4FEC627AA69470922186E477EF75A7D77EF9 -FC4A16ECF9A37597119B804C927377352CEF88AC515D6E914FC1EF5AEA7AF1F3D3802C82 -60305538E678EDDDFA87ACD3BAEF1A09F4F4AE1AC97CC0E7785F3DB18B6EEAE005FCFD6A -C2A611CB6F4D8671C08791B9FED03755A13B8AD33C3341CE9C4FA948103DC77EF727AE31 -0C00806D7639F922B967830BF717CACFAF26E2331C571CFE01B214ED596815C833CA2973 -1D3B159B691BE5722D8ECFC2FC07E0E2A12FA9E76AA3F13374310C58E8E7CB36C68DD1D4 -3E1EC626199B5B77D977E9786CD9102454834775BEE6EDAB046E7BF335BC4572544D9377 -D60C6C389934E35E40252BB891D295E8A64C12C3790DDB9AE563FBFAC83A3AE606116ABF -36E94DB1368234A61027B95C152985B30D67C03A99C6C6A6DCAB9AFF3A8B5766302685C2 -A6438B11F72D91D3B1D2DCD97832861DF613EF54D4858B02A73D37AFCB0BE38C44ECC588 -20F47EA30645B18817B79268694829B33EEB7990C52A4057BE22490C688ED1D4B0B8096E -F6E24114065FDA365D05F9804107459ABF86DB0E7F38378C018003F089E79764B45D087D -02DBDBE171A3F280F8BB673D13826CDCFC624AF331BA9732D81E16E522B551CFB43117A3 -D2FA42EE3159041494C5B94E66FC3D59C0AFCC0785C89F4810F772E72CF7133CC7C75A25 -BF0648BE3E0EDD3A724DDB9277D8956876F0718ED0FFF0D7CCE2A8CD683D2246EB26C7C5 -0EDA3D83BF795B55207FB1B8F9559D27194AA9B0DFB8900AC8227ECFB43EC08A7B325DDE -D23F0ABA4A1B771483E181383EE1AD282C1E69B5A9E652EB71934CB6065FFB8FBFDB8307 -785AF2FB59FBDC229974A8714C47302429B17F5B10492C7594D66BC8CE44A8C42755499A -F34DD4DF71DC73E2DDEB16DA14D446A0E0AEFAAFA47A5290E7ED5AB76C076B892156B159 -A5FD0E83D88CCCBEAE6395046A76559F8F33DBADD30F8D530A342297E4E6BC9E0A0C9F17 -60ECD67C3008E01E34E5F688377CF8B6DAC331FAF3974572242DB1850F972DAA8D73F9B4 -1A21CD8F3ACFAE89915EF1A2E369899F81826565A454B0E68C02625AD18E47742280439E -B28A956044CE0A1A6E71895528109927487B2E543BE901144FD3AFE5811E2D5937439E5E -29B6B5CDE26F27174D6DF8D026696953A6ACCB3E84AD623C1183484F38484C41E31D18FE -52BAF597742D38312C7F83A31DC53EF0FB87325CC73E13A9A8B467C07237D23FAD848035 -AE90BC164C363787E65E8E759BFB8A1D0E36205BD6F9B5D95788E2A8ADE9D6CD15E1437D -F89755AC4FA834643732D4F5AFB8B379C8A404EB2D5795FBA40A0344DDFE3E0BF2475616 -9AABA8F303DCD70653B3FC4F15565E9A3C53E2190F3F8EE18DF5C5E74A5EBA1375946280 -93BA397B914D8AF25792043641E70260C6DFFDDA2E09DEA65B3C58260635C4E3E0D4E384 -8D7CC744A7D0E00EFE5A4F35B392E536F2EEF714EC49168304DA679F87088CEECC5DDBA4 -EA30D04BDD075553947644E66E5D5F50643FFE8A48D3B16633CD2083F05755BD47B71767 -53983E6F4394FD61B4964F749977AE31C2D5C25C3C40D1B7E070C7A019EC00E3C55A3255 -EBC73C47F2A4BED7BF0387F9E494FA3E2327D76584727AD5E8198BD80A56B7EBA9B0D92A -D0310E640E53ACCD7DDD57F3A286A301FC3E1ACBE21A4E9C572BB15721A64648027EB8CA -13BE6FD4C97E304406554A623F3F9FC0F95497D97A325BBCB5735E2A67BAE21C6650F633 -05B25DA1E1DF9417597E09C8EAE3C3AFED656BE4A8021F5AFFCF55CCDED9BDCE2E7E195B -1BC94C800ED80960503D735684810117CDF144B739AA5F912E71530A244D4C9DD5BC1AA6 -4A6DBACBF7B11706973418E8C2E04CF96E21B56C41162C78FCE26B025FA9E920C9C7641A -1303D118AC0AFB7C87A371346C19944F5AB905B59AD125C892D213989989BCE2366CD210 -8A07518095BF0051EE471575E0189E41C7350F1DDC40526C34081730EDE9756CA029B128 -6C63DA99B0A4422DED67441301E7AC53A74190D24E9CC438FC2826339FF05E3B58F8FC83 -FB8F58B14DC842565BD87ADF791E8E4413030B60A484128B0A91F91EB8F69B90FAFEE2C8 -7326618D44D4845ED40A2DDA09B5CBE186E330D4BD84A49A28E3F5D1AA6B37773C12FEB6 -885436DA31DF8145CF2A993242E6F2177BC470F58DA16422C8BAF4FFAEBD8B0D4AD5D41C -A32147945C2158CB5113C64ABA334DA9EFE8A371332F1540E374E0AEBEAB6BDDFFD4545C -E156121E3348E6BC1D3120D4BA238EBBFE05AFA4FDFB3968494088F06109BD62AF8023B1 -1F8802FA6322E0F11C03C97C229C80C656EC7E96E4B5D7BC8040E0901BECB86D9A4A5C70 -52B867CB27F11307C4CF24BA0F56CF555DF0A8F247D5A98B1B04B19EE9B394B3FF9473B0 -2D943013C77EBEEF429D97B42BD8E25E251FD7BB352C3994DFF181324936F0AE8267CE8B -657D167E89F690B0079BB26351FC13A13F968BC5E99FD306DAFC454A5F1A7ED0F388CE57 -62AF1A627ED239CE9B4391FCA709030E0734D5D8E1F7F89B3BA991AB9D4AEA597C4B074A -69F44BC22323039A98347F49DF7A98BF48E617184A03E7276716DC5895B5628A004FCF5E -01C22F2304746521740C919F3BD418DE025AC898B104BF9D15DAFE189246D3FF215BE37C -E1134F41B0D0F0AD80719202E6E3691465AC0C9430C80028CBACD2B80A95A6C10F39A5F6 -12DD73AF2C3E4E0770FA137759F5ABFED0186BEAE50031C202975200B58CD5C7AF95E60A -DDB460008A52BB26F4847E6E290A2CCB1F984E97B899D7B63948411FB074178475CFC3DC -E212536D720C6F704C1458D45E5F2D7DA34903ECF51947DE98552CB2CC5705494121A96D -BABFF6E7B1CA155EC91D910DB288BA8DD87736EA60C2B5A35AD67E4C4B323F1CEFD5844F -1B6947FCC7A11305A1CF3CBE545C891CCB7A10F9685C9E2979F7DED90DD1D5C69B934635 -B1444A33B4CB56210DD269B7CE94BE1282EE7A2E2652CC743F33D25F1E83680DC05392F5 -31CE3343914C7E6C77D9A0AA13DA8E7A97B402924097FFF414076A8E055E76FEB93C4CBD -8841A560092F4ADCEAB9AD16D7EECD6696BB47AC93950A844B70386F77572A3766CF3AD2 -500DB126AD78931F8FA3D7DA41C1F3E8FC42CFAC03070E28707D0FCA1A6A837521BFC1C1 -86990ABEFB76BA56B8ED8475F19E3B6EB8AEB62EF86989559B76679FF475C79DEC1A0DD0 -FCFA1FE72E35E5A50086F49757FB1E65957488453EFEC4E973A48EEEA0F4D64054DC9667 -0AEF518AE6999EB2A61C1DC53795AD29A18F30369C3F4378B78DD76781E7B96C39D068E8 -819ACD8DDB59E4D0B60D42398E336838FAE48E164F7935EABCF60B8B6CDB887BA75245FB -F061E3756EBFC0ACA6E0FFE3CFE8D3F67FB75186DF4557165E1A492FD523C7343B1C2D37 -F05C4CEBC077B8DA778BE378F322AC5CC3B06C2A74687B0B3AF9D08D453753B5FC6E4289 -F362954B80C0E4DF1915E1719431244BF87E065B4A033E0B204E6072D006EB10DCB9F916 -0042925BB8A82EE47AB260686DF9EA59803AFD45C4D0B19234F6BE7913519D61B5E6250C -4E5BC6CF722B53B283F4D5E5D2AA7DE35B5C87FD62C9E9DFFD671BAE7E08E68E11710E80 -5448DE7D5D65F4AA2E27EF0FF16CA3E6569A53745123A9FD7F0DC8A57D1AAD7CAB961645 -F0BFA125101F21F64F0CEC860CE306F02FB0AF49F0C0C6D11B437FEA68992FAA2D6CDB42 -6686056F769470CDA1C158913715FDB4D4687D06545AC87BBD5283D8B9E1FD1B1B0F256D -7C675712C2A6622A179F5AC2ABCD06070A038068033D07E64E0C70DEAF9D61DB3F4EFEE9 -ACA908C30023FE3CB81597386872FB5D5557BD4461D513B6A62EFCBBD3062E67095F1DBB -3167E0338EAC1A52B38FED183AB520E882595FA77F561312F83C102B04486D2942CEE713 -92563D7E609E81354D6F8192CE3310890CFE69B41907B023C3451075383E4BCF6102A669 -4B0593D81EDC415CF7EE2C2803CE5810EDC28B09155F92CB20C139B43E07BFAB08978CD5 -65270BD77658B0D4259BBD9C3A2200B64F73ABE0D77CE6D491253C7590F98F3AA8AF8BD0 -5946A659EC1099D13E733C96A4D84405915B12D7A5399645D0C37C1944387D088FB083FD -22BDF34BB31B396F618C518DA593A9584F8ED6E9F299E72A6F0863B4A3C9F184B1AAFC98 -0CC313B225EE3384D2D814A4E96C744E0DC6A666114241DA125F1178D8F1D986B7D31548 -F9B6079DD38BDBC0AA94F135C44D8B7B6E9A0A0B63FB5BA59152E97F61515F49B906C9FD -42772EB4016B53417C5A2C8E881B0376656115231306FE3AEDEB6182220C2181DA354D5C -28E0D758C573C113542CB5346ABEA9B5BF0243146C186DC5AE0BD9505E5517A6224EA50C -315C9BCBF6707540621B95B9F0BCCA2DF5BF3E8021CE9DDD2A74B6DDB0E9F6DC8E3BFC11 -C0697E87E6C4C642D2172889DDF4C17FCD3E463B30D7A930E4B26BA7289702ED77F2AC66 -BC9ED957863A22905F0996D337CFAE61389D3C70ABE7444E8138BC1BC31F8E572C0CFAD6 -BE60B1AD639AD39BE03AD66728C1CE5B7F2DA53098008E10B82CC2BECEC7B45421F0BDA2 -183588B519182DD0C80B0EF409E2F34C38A7D205CACB19864507CCEF34C5B7A18B9FB51E -3AFBC0970A799FD34464F7AA8135C32914D4DBC466DE2922595EC4A255405D04139C0CD7 -F162674F39D8C01F1E6062B5C946F2F4F5E2F49ECDFE43D2642272377C5393E9717CE335 -11B8542FFF199FDA0867DDE128B387A39CAA79DAA1DA1388B88A5C921BED6709418DA595 -7C8D96831B6FFAB26238DD3D11181345B4AA07FEE3D76093BA5C069C9CFE9E823416B6ED -487308D542C84630AAEDDE0B59A256526169B820E56504014812661336692959ADEB6805 -C7091B7899F0EF46299C414925315D10A8C9652931AC7141FBD3DBB0C34476AB2808FF11 -9B10C17C796E67EF18A386F9E55E34E0D32701D1F77C78FB542D49C53337B9074D92DCC7 -0D4AE59389BF27E9CD453608A19855F6A976347AB95CEE2B07FFF6765F97E66978173C61 -61E38E6CC3BB2E278C61BDB601DB7835E9515D347F37A63EC6DADD2F72BCD46AA4FBC82E -EC40DC7ECB825867B98D6F457BE4502C98DA8756CB9285B7DD1C867B9FCCE8591EF331AF -44E38E3523AA39BF0922C6F59F1E9343AD34DD39DDF485FAC00B38EFF62E16CECB735ABF -903630A30396F2912163FA8B23E97F5B81E2B5B538C454967644E63B351B068EF4BA9B3E -70C65BF5BE8F0352F7C0E25EDB22716A632FD832D51AF2D26C880035D8017C02B0065DF8 -44E289E6D559125A31F76E256197DEEE1F2CE1D0BB7303A3CE177B692D3D0F8931A35048 -F86168DEEF39FEDD4860DBE06F21F21D35E8B982D299CC945E2C8E1D73D1891ACD1AE977 -9584F2F3E9B5621C6EEAFCF91E293996F35562C16AB5F35B6A0B55D9FA85FE3B08692C03 -E453B44C8E1438205A9F18DB136F954C7155DA1288BFB6927A4C308C86C682B78087FC5D -CD3976667B4CDFB90CF4E882B1C35D9515760DD4ECADABE73C3E9758E0A8A3B01BAA6A2F -091CFB987E893A722ED935642252512C3C3492FE736403EBFA8FD18FA9E9CC5B0E802E4A -CF77415626A072B3EA3C637D2F998B91B7A7274C2DB664F4A9D73595C2F47DD61E303403 -04E0DFCF9CF520E33AC7E0978B004641E5B6A88A0657F615C2FAC770AD1DF1E31BFF6E1B -8A32F32F0BE2A2649B9BF3F046D8ECF27A0AA62909D0A80262633733EFCB4C21A295120E -9B9D193A12073BB638C3BFE75AEAF1B3F43FBE3FBA8176DBFC8AB0CCD2E874DE912E3A7B -13421673D66744ACD888E2687051B8CBA461B90E7302963CC5DB88AE64303BE9BABD47BC -05A780E1545EB389973A5CF4CF9E53953DDD085E617213B10B3836101E98A0638C1CDCE7 -C9E0D9FE79D94FCA6472E2C9C9FAF3D7D9F260FC849EED1236AD5774045E52CB82B0F7A5 -FE589651B53D7E9FE4A8848A702D6D5D0A415337F6E8DC7148ECCF94B23AF1C11616158B -EB253C903DC963B61D2C27DDF6E13CDA799C54FF9762A1864E516B913C401713B8854414 -B4CA200EBFAA01F382C70F27589796D7EDD4A35334853B33347F231F24C1817657C93000 -2B59E0A2C4A9796822D5F7BFB3193DD9808398FDC53BC25F402AB126C1B2C83914888851 -037FF02EB53642AA0E6CCBF0ED5812527BB367DB4E67A6B8046DA7C215448808EAB80496 -FFADA52671C89E018CBC8D36CF78675E0A721FEE1112BF9C78D478024364E91CFE2468EF -B6A0BD9E1DA67863124D9F5F996EF1FED356C7FD2AA3DB3E3F6CA36262E896894FED244C -F3BFAD999C6F42F13D4AF617C03E29DD1F8ED75BD11F94B1BEA408ECFF117610EAFBF4FB -241AC338E6A8714A92F2A5AEDE86C493792743F648F2AF6E9A2C692A9669180F629947B2 -6474C03FB8B712031E24F7529143F432607D57E81CBB91A0DC6588EAD2DF8AB5C43C45EB -9DFA398AE8272E43503D987B36504181B2E9AF2357ECD3E6FDEC731B623D921F8D1D0A19 -027876125DC02D8FD29CD8521B36373D4498E2D2D9144C85BA8D5D9AF13BD5C8278F036D -ADADFACE6FFEFDADFB88D3CFF12B2CA14BBA16CA7267A4CAC32A0EDE215D7C0FC7EF3B6A -59A33CD5145E2D8E3530F94B5BECFF74357DBA205348FB22D4E3D40F77ACE73BF519CAE7 -5277729978A61B1B9B76E846EE15C8139B927EC9E2F8B684E0E5A30AF34A0027B9F2351A -B149CE2C8DC951CD54B4D6974E0BD74BA6C2F83BF680F0A01CB39D8B835C097E262A77D9 -55A699E86D30312427EDDD64EF7A3ABA1CCDEC22EFF658FBEB30B8FDF59A9C4185A55704 -530A1499CD700E1D6AD5DBDE3B662DAFEBDBB185C32C7E34406FA6B3878D5B564ACC5D9B -EDF6C7B42411081423FCD2BEB0AE7EE02272F547D551547A11F8CAF8D9F2CFD8FF3626E6 -3CCFFCF9277E6003911C54371677D671AB17424633B776DC98004EA4EA0917E085616ED1 -273E73F2FB891557CC5A9BB65FF704EE526EBF8B34359AF0381A61059E7B740D8069C128 -0F942C6410FE3ED272251F2653817FDDEF786B1F7BA9C6CE02C56C33D98E937EB303717A -1AA3FE1CE2D10A5D07F0E7DD4269F44488ED497E75C92657A2CBD792B9E3DEC8C073ED52 -661DC43A52A6A8218385FD37E1D7791E540F225AAA90480B69468660E05F5B826851F985 -8D127FF6ABA8E58C4F69961AD4896B4EAD41D14399A3F7588E04E63FC1435DBD45530015 -D9C5A1DE717D3923919C31B79898FF17D949F47D354CD81840DABDC5585E3ABF11E556F2 -9EFC55559AF05084F95A5900033AC0AA2FE370C49C71411B98B69DAD30D9D9F75DC90A04 -E59234156EB4B9DD2F923A2DF771818759BC86E763FF36898697F37343FE7197EF5ECCD5 -0933E2C446D7AD1AE945A87A3B7F62F8E14899729CEF06BCDBBF29D65ACA3EB4293CEF53 -501735F2DEE6CB331ADC94F27492130776C3E3B422975275C115A1E9882C6A4559A698D4 -46C5CBE11497CB48EE316810CE428A6A08BFFFB3D196DAD7BD4778F216055C79C325477C -92443E2978BE1EDFDE5836C722B96A070269D2D3A1438374BA6071FAD1FFC511BD8974A5 -803AFAA40E3509B10223D7924DF9215650E9F13E75293B799B4256B7DB4878F3936CFCBB -33D0A37E209A1E3EA8EE6A3455A84E28552DFD56BCCA0BFB10B7F7D25983D3865A9C617D -C85CECEF64CD8E470916B0111075DF6D051186CCCF48813C07E53D7DE553FA3B50B6F7D7 -EA60B3EF169527C6206D89C15436344E8C4AAA490C0D6F300D3A18EE3C50D30BE9ACB50D -5BAED6CA52732E7530C67CEFEC9ACE3659FF09897A62F22A6383F7B62289052485B2139C -48187D0FD3F64D65EF4E2678AB5133A09D448986C96C383FCA7E3518D91BD02A51BE54A2 -F7221ADC7317ECA49522C765BF38BE70EA692F063BEF59D5465E3D65DB466ECE7568BBB8 -526587C1A4FBCBA6D585509FC29F6223D68C4BA4AB48D83192EF4D323FCFCD2C399BA52F -776CF7CBC0F7B9F828A7441FC1540DF41FFE91718AC9CCE2EFD9D0E8D8FBCE8402B441A0 -AA2F95E4508D703E86875A48BC8C579A2CC0D3086B99290845A44B3E14B28D95246607D5 -ABD998C92B5CE660D40D31BBA97CAD73DB5ADA4613520BD4C4D19F34A9D3E57D66DB2090 -30CC7F57D5108AC7DF5F528C04A15B360C8CD1ACB78F090AC2518C1EA0D64F0DF393460E -25C7F07970E49ED6DAF204DD86A718DE11F8DEC66E247880CE1DF51FFD8A5797C63948A4 -80D37C43C508219F322B346B65ADB3A801FFB1033D409838FE05234432EFF0FE2127AB0B -EBC5890CB026BF94AAC5DD98E4153015B36D30B72E5192DD9D5EC6E8609423DDFF7339DE -5EAD4AE73019DFBF3BBD13FC154FCCE5F459FF033A826C7C4DE12ADE39CD85D3366B8CEA -64D4CC905F352424FE9120F447B75A51379885369A73600366055384C7BE79205D2B868A -1A6246C803C27D558DEE4EE108C013C6CFB8AC1016479E37C0FF0D4371ADE9EDBC986BE8 -A8861975C6761CF9DFB6F89244B2B447AA9E48E8EEBBFE1AD875AFE06D2BD72D0867FE65 -68D316B08DF35217AB5BC65200870036F850433BA2C26D1AF67C859E8DEA24AE44C6F303 -059B3AA2CC0F2DCBFA798E151627BB8CA785FEB783D59D10132725E44133655873FA414E -C6C9EB631DF1D0D3ABEF257BDFA9B1BBF6C17731195DB3B53EA289A0D3E63F41A330CBCE -863B1B6352A72A11F54C813595FA055BB5FF7F27735D4D3F5C87ED89FD18A4709B73CF8E -64F9793F12A0946B974A03C4BE4C1C2CEF752D57E323981438F021334D69737DB7B9A0CC -4CD5A93A3B9478DFEA4096D143BED8D3C4E19C7BE85436745B6BD0D54DE8DBCD1268E5AE -D92F8D23596A27B730088F4529D03E2C88966525D62C4A90D4869514362F605EBB9852AC -904758B83108A59E29BA45404380D86D51EC2567A3574A9C6889B22CC1C23063A782746A -02F43654B378E2C60A66F583FA666105EE8AC6C54C17AE79D0BDCAEFD951139FD96D45B8 -2F75F1928870A9876678588B6FF4B76F3062A0B895F8095ED27A8E620C2CA398EA161BF6 -9EEE9567D3C4CBE7ABC01D7AF30BFBB269CBBD0BCE7208BE1C94E95639E99337C56FBAF3 -AF87E956EBBBF2D87FFECC8B32220949A038C48BE761CAD77799F8191AC0975236C15458 -A7957630480517AC0F89026DC1B4AF3B005DA7DAEDBE41EA451D4B28516204427BACF5ED -968101E14C29396B7BBDAA67F10A602207F365E96CC6E050248C46BAE78348C4E016AB3F -1A1DB7E9BBDF6C8CD37615A12891667153DE23FC013ACBDE84E5E490FDBF9066C1CB00E0 -528714B54E71B5626E71D387B8FD41B21E2DD15CD595EEDD545A90E8F0D02388820B2A97 -527EF7DAA65732B6EE2F07E2936318FB75143DDE8F5FDE804346AEFF05637BF48A705A85 -B6F3863470ED141E118801AD9F47FB05BDC65AAF8F398BD3EB895C3AC5C94DB7CED1AE7D -1D7311DD67343AE0B5724A8827CC26E463AA76B00F4CD3168F1C92C64EAB1D001907B900 -6B1A12550668E688E2D0ED3355ED0271228CBBE4D56848F0B08EA24B00B5B20BAD06EE1B -C6606DAA509FDC41D2BE545F9FA650E8FBB0E78CC856A5331A8A6476FA3C44487B9F37AA -5DBDE9BE2A64C69CE8438170E2B40893AFFC0BE099EAB03E5034458D54BF9B64BEEF7167 -A25AEC8A1F7217E492E5674E4C8B343B9249B384BA88DCC4F8902FD4D535C0246E1609F5 -4285F84C2D4B489369576E74272255C329942F764CD4A51C730C99E7F5F8B7C52DD252C8 -500319E4CBE6C696C77CE1ED8BD05D22E4861CF9D156B95499B3718A47E5BEC9FD72E1DA -DBDBF137EFD6CF8BCE7D64A27B8C9BF6E24C929BF07F5A62BEC7BC760706D31B98DD8E87 -97559CF8E4357AC49FF6B47667228686A3AE789D68B059FBAB877F3F1BD00841A1F151E1 -EFA94F69BCF41D4F9DB5423430A2AD2BCD53BC87A5178F74EE469772FEFE1153C8454288 -31B12B8276E3E54162B64B393BBF23F1EAB4D1D385FFA5CB3C57809CAD0A453A10661D25 -685A9C56B41A53C3B1CE6E41418D8B8104A2BAF3667EC877C9B6269BCFCAACFAF695EAA6 -BF13891E52B4FBB7543F1BE26A867EE6B515DA051C3C7BA25BA135FC186D4379D9AB4949 -582692485409A5DC52BD6836D8CADC2A48A4F5B4FCDC69099C3EFC7166ED293A795DFDC7 -3FC01A91C9C15219723FEA15A4FAAC3511AE8D0DCCAA1FDDF7E2AF4CBA80E38FC6D2D8E5 -B9AFE27366ADFF0529348BE4E56484F0E31BFB7B9DA4F06626599FEAD323CA644677794F -541EC7888B181EB0AAED60E6F0E5FB4F2FE2564E2988D6441E58C2C0C1DE63CF65D625B1 -46FC422A0E0E77C43C8FA2CCD310B5694EC8CD1B9A3ABFFA25687D4013C0E5703094D5ED -37295E540A1B2B2E836FF73B23E8CDD190D1FC04DC6CB9D5947AA853F6748388D400B6FC -7DCCA73AFE6D1FBC61A7A3AEE4D24BA702A2F4493D484F19CDA1A850C95486E4E4D43F8A -A584D14F82AA0B3862E1FB06E941A90FEACC607D27AE58CF19399886879BAB287A429D5C -0C821C26C61F169F1B90CF77878968F56737041BE38776374546623553223E6E2A8682E7 -737528C915EBD41B263DF7E12E4A4C6967FAE40F90DA0D0410E0F22BDE01F018D63A8C23 -C157E72C6910157A63B33AAC9E5F3C58F771B8CD24F0E24C4EC17277C8B8DE5DDE52176F -A9740EAD3F62125BE32678C35005CD445EEAB9AA1E9A71FD11614426E171EE85F5D9A17C -536C87D58C5140A64B080966EC5A3E0AED8BACE84496BD019E6023AB562FBC1F28CBF296 -3FF98D715ACEF7BDDDFD65DB78CB3F0E16C440EE636A0D7C05CB97C085F7C5222ACC6305 -4DA8C3F7D950B0399B7250BCB66D0D520AB951530E728B4892779DF0FE56C9A27E279DD5 -02883DD2E2E4013D03491C52B21DCE600D68156106418DF5273C6F6FC9A3E1E9889DCE43 -17628702B21201E48D23A7E0EC5E1DAF104F3BA1F659B8FDCE301C3D7ACAE1B7CD6846BD -496B16BF6DAC876C117242B3088287DF82F260F960CF90849F515702F71EED275A40A579 -B0B8F707681B5FAB21A81FD992254AFC0D43E88D641445FDAE5D6874C4EC37B2BE38D5B4 -6DEB232B7100BCABA7ABBD53F5455EB07ECFA23B1703A2690869A8D0E60276830D7B4FAB -231FDF2784CC788CE61A4909B89C5B8A5791FC3160166BAB1BE25E57BFB2D162CFCF36D9 -CE524A56A15DC752BDEE0CFE605E5BA650ACCF0DE4286C70EDDFDF8527A02C3958B17C82 -1769E8EE3E46FCD93AFABBDAE4809836C56C242B0C6C63107AC6C3364B7C79BA5C62BF62 -EB6277B4F6905CB999C568AE118A690FCBDB37433DD2B360A7C66EB52DAEB0662D61DE6A -74637C6C8B373F9EF9A473486F3A4326ED5A442BD2566912C9531C5EA6BA89553FB67C16 -1933CA4D7FF5886F2F6B3ACEBF939B682968D4B0590B0D39A0871A78EF3885E47F892C16 -FE93101266B12AB988DB622F4E408C442937B56007334AE919983566CCF994B3084C0D42 -5EF94563A51CB142F0829F5398B647AAC6E0010DFCCCCC15BD0EA5A6CC90EF8F790980F1 -4C8A27B2792B3C83E1317CB932DB3B28F008D442D374AA75573F5A324D7C5D6DE8ABE5D2 -CF78A931DCCAD7831AC5A7A5D5DE80E475DB271F0CD21A47B1E7DB5233705ED0D421EC5A -2BEE73D5949400151866E065B28D6E1F6574E2D335BB542D16EDA5823886430390F9A0D2 -B937F7ABD1DA9E04894ABC066F8CF0B8BC196BC1465A378BA14D2284AE4DEA134DDD7440 -77DBA60CD0F9E478EAE5F7DC0D6309C9EA514D44C279700088581B29BC0136E2F4EA3E9B -64403DDB054736966C331AC20514637A3CAAD1B27C569045C444D48FFB63091B6D20CC67 -FA5034880794ACF58358861548044DACE9BF02B4A23925639B7A6A5DD4B6AEB2F18C1619 -DA2E4597905CF4A00ADA215FF258BF38FEE6923D67424DC1B05015C8D09DB1FB7F660C6D -E061FA2690AF2CA528AFDDEAEEBE6291D61955BE374DEBC8A915639DBC5382A17810993F -92E7EB5D2492E76F6142679171DB74170A6B390CBF7E13CD5307CF04D4C471BE0C7EFEEF -B36F609D765DAFF2E682983BB0CA6B70B713F1217C8F2272637C8AE97B3E15D5D451AAF0 -44FA166A93B277E334DB8EC58EA397CD013B53DE2D7944387712E80F086942728B9A4877 -C1193716F71ABCD563EA769AA555CA4C48FBAB634B1AACB77C7A576C4DEE78C5CCE3D3F6 -E483B076A4024292A35BC7080245E56B6D58926983C0D9C31206130B3B8AD5CCCF8A8659 -465C36D5C5FBEDD7B455EB4BAFF35AAAA12BEBFC6A7B40AA15B5B957625C37494177CBD3 -E3E59740FE558926927022C6411B9F07ED9BBC31AD206944E56146CA8BC0A9E8C9172C0C -0B7C46FCB490EBD02E86F69564B8030A3280E376839D680786A0A068DFCF0A3DA5048898 -69C9AF0362765CB583B785FE8C0FDCCE4F39527A7B73565CEC9E798FCE909941522819D4 -519A12043D35DCFA7D9188EDFEE780E04A868346C68A3ACE74B16641873B8985C1F0C263 -9BF63ED86CB556943932F9AC71096EC23E9584C8CEC8E95C52A493E4463B168BEB6F259E -71B2B22B53554E487A897256E37BD4C1D3B48DA9AA5C5CB8D5D85C61D6E1BE3A607BEF1A -A8ACD46A93FE3C07D0BB9EBBAAF0433C7E5C6D5040CF9F5AFFB1AD8104D1328005CC5B10 -A1993D3EEAF3C3BA4A0B1A260A72DDA6ABD5358DE5171F1DBAB667AC022F46D3BDE54809 -790CC4EA533392E6C039013D4B0FA21E36143CD9E708C89CB13E09D624551CF86BB79C3F -13868988903A7C5C744743FC8CC6B48219FBFFA584E016953F8CF342DCD69077D9387A34 -EEFAD0463AD98FCE21EE8342A3CC4B9CC10F6804EE9CAF70FD1C56CFEF02B7CF2D89CBAA -E45918EC9445AF3D1C43DFA501D9B3789314063A748A6907BEC153F294D6D046B9C76D01 -4CC021D3074C0A2D8E92B45EBF14C1C5AA39546A2362CB8A6FA0F5198AF84119260DA3D3 -A89AAF0A976B1D5A020ED16268C8F1908400DDB8E27F57DC2B00E3E4F0DF1777A934DD89 -311A8C7309C24A670A6A9E03C094B548D223C31521DD7FC2BEB3DEFAF7904EC0123FFBE5 -4E627D9AEF3AD29FBAC003520D0B165F3AE91AC94FD8F3FA9A6BF9FB81863D03BEF8506A -A74C7DC0B50BD327C6942905BD07FBD62E4C3B16A06070BDFBD80414CB9D5261A5F721CD -FC7D1F1A6811E1362F9372CBAA3C8DA63BB103B2C10BF6F2504306DB05835B80FB70BC39 -DEC4DB3ED1EC4C2B64CC907D751407B6B8379F449210D0BB68CA1C445ACEEBF9C31419B2 -C4C5B8780991D042AB3948A5C5C8005E0BE1859B13F8AE6D4AF62F00B415BE5BB641B964 -53F037C492B988D839B96AC0FE01DC0EA9E064FF06EFFEFA446F41AE8E44AE58355CBBE4 -57DBEE1EACEBE69E6686B687CFFE11DDF76C2EEEB6662B1A2A176BA63E8800A51160A6DB -886AC4C5868D17487273984BA2A47F39837F197D6A9B279D71157B6ECC2A72F83C1A5C45 -B17698F3183C00B6A61C732604E5520320309069628602318F4F68DF0BBC2BAC6E90D1DD -ADAA738EFDC3F63E8F24DEC44D41D2CA546AAB5A88FF61081C144DF568F35C21A887FBAD -C87166B58486340679B5F844DBDD772E9848400746A207BD04F470D2B2F14A36225FD693 -E1BC7CD6AA3BC7FE471C56B411B084FF8A67B0B42954C0915C7388BCC44DB2CBA0A70F4B -1692AC59029B8181D12F6A1F22170E04696799AECE8E6B4A96FE89B7A18A4B6684815BAB -D8D94F98302D44EA827914CFDE8CAC4CE48586630DDDE0FD1F9A57E8AB0EBD27F6A25186 -7986192B6D3F46C796247B1A220455A49745710E32F4D03B4F15636197C6F84967054365 -F7C0B1C20DADB63AA474551586EA5F055F8F3EBB1214ACB3128D4C6FA566C8E506DAD848 -6DC4A245D1977218241A5FC37AF7C03342EEEEEDB2EADED36EC0C43BA42F14E3E9601784 -5780F5C6E5262D96C0C50C87C9CE4E4666D1EF982FA7D4F99EB0A5EF4AB0456FEA1225A4 -E6873C1B6888ABEDCB0D84275EB400E73695564A15E338E00DC77981DE14FEFB40796373 -631102384B1A3C0EC239F19A2DEF2689F75F5D55E22AE9EA06A8A33424765D84E458AF21 -B8C99E6BBBE5517587FF76E7D02BC5AE43007F2228014951C93C50EE50EAB764BFC8A084 -86E97549CC9A8C53E442C8AF409C98382080D32974A105D60383E077138C34F887159B4D -5745F7B6443B446C5840BB92A3B0BC317EDB0CAC5310AEBF16285AD0C4DCDE6E27C0185E -9CA90D3086D6E11EB43E65F25F74377AE8BABC97E0D9ACFDC1339D0613600BF6E2F6FCBF -66A0AAAEBDF0E9B3241F57D08C17612666F8286FC17AD0CCC5AF7F355668E146C3FF61EC -07A85AD2A655DACD2CC58D5D0216CCE6F8621405AC7A4A160B6B2C9B6C5857D40A5BFABC -199AD07AE8BE3169A9182F81F80A094608F1C2B894A6CC33CE4DB65AC02E3528601A27B0 -FB7E14B2B97F6391B0CC8963A71C6794E74037CED7C0F2D9B7EA192C44A5C1EC78535F45 -A5A38F6C9E9E811B950B7D0B2BCC7AB21E8B10057E64A72CD86549B52D74C806C242FEAD -5751BBF62735377DF1C0582C89B0794D01FDA343EFA486AB2746A6780508206D0C42F020 -94F3B8ED6371412FD4CFF17DB123DD857DF02FEF68954C8A64FAE88C67351FFE15834360 -1F9DA7526CDD58BAFD5372A39BB7AF47A04BA972ED382B7CE3FDD92B98B9147EC77C5496 -773F33E58D6B9F48447D3BEB6B12CF2FA194EBD93B318014CA0EFE61E6299E097B394F88 -6D15B7DE6DBDD12A8B38C5D0F328FCA5798E951D950DED554353AFC64543CF6735456CA2 -72333B0797B4CF24D247BC76F9FD325A2044F01046343862E92591CF371C1A2F6118E36D -2AA1EECFFBE7115C525A722072311E353526224622B96265B29C10F6FA3E35B8B4AC8AB9 -084F74CA7C2E39C19361F97BADE96E7962B8356C92DCCE8B5AB85C48F569001F238D113E -8E0D83B793ABB238B8DBEDF30F33BE03ED480AE7672942C7F60FBB2B2ED85451DBEC08D6 -3F33AF72437E6598E90C52D62319A1F2018AAB1155506A96D4F2558004CAA6EC715D8EF5 -A34C7779ABAF2CC9A288DD88B96F0F3F1E45A6A7049348446526EF562DAB4EDDD8BB3030 -E913252DED80A8075C1C93E27509193CAEEDC132A3176490B03C53DACCC26417A5838515 -FD4A8093EAF7718341F9A6973474EBD66C63884BC78E318CF04B9D3449196110EB6BC018 -C1DB6CCBCA2ECD1016F1E884320B14B27BB8A15FB42E190C30E45965C32C21104F49FAA5 -B3F983C768BE7C909127C19EE6392D6E9E698D650CEFB7AE48B2442522D88C6D6FDA41DA -B8B3187F497DA1BDA3FDBC8B71A619063D9461393FFD5A072F237B7FAB49597636B7A41E -91DE676102B0FB2ECB4D5135C015B99419925667444BAB52923DE73287D3934DCB1BDE9E -72ECC4C55A55BB24A71B5A37960993BC88A0C66B82C2E2AD597EDAE4F74FE918106413E7 -233C832EAD1D2A2E515D734960730EDB2A8072D539E2C69CC5C9E569109B20670157AB44 -41BC249E8DAECBD9F2115663E7C88AD8C4067158B822CB278DBE410E8B1E3E79D4E20C6A -E8FBB5746390C823D5D818C3583A41A2D080DF439916FF23709C6E816F7DA9FCC60E5B6B -FD17813DC59636D33A2523AED576BCDFB0DC88725D6B6F286B2C3DD85E53D825DFAAC9A8 -8572519A254CB4435907A2A57EE96CE3078F80E24C0DB0FC3B047684460F5314B1EE091D -6CE4B884D06DEEBB7E1ADF4B44376699AEBD7A5F4AE19B5FF8022459E9E2D43117F4C1D7 -630028D14169FBCB72DDBE7E4BFB4B7EE1DCEEEB91623718BD1E5B9E16DD4F3ED2469BC3 -1BE0D51A530DE079DE096431EB3C624898333E4A271A79D33816881ECA7C355C1C0EDE72 -039E2800D050F507D05D8DC2A6F79C1E58D269B1CF397160A813A827B5D5060CE32B3454 -DBFD65339F3B75CEA60BE92A1848B7CA7EB730BFA278E8D549D3DC68E9EB32553FA32360 -4F516DCCC56EB0751383005BCA15849491D9A0BA4227295B88BD819FAE10216E1E2F7CCC -DE0FA17076C881DC4ED1E03F3004437849D059449BF180F4E5A547218D6CA90D235A179F -BE73FCDE7531099D073127D048B9D3050959CD6DB6FF19E57BB9F296536E33293F4856B8 -20A8E948E00F7FB3226F846EAB9F1A7DFCB11871E7B85C4A7BE6A023BDB2314FD77868FB -E02DA316769382443FDE43AD3979D243726923904918AB90A8405B0184189C7FD724DD7A -E4EA99A6E31C18B5A00448A8146A9897584A935118BBD8F7BA9EC471461E5D932434345B -630674C3ACD3C97E0A5C1E6FB286D9A3ECF40FA51AD7C1FF9992E0EFB3633F4FE8450FB2 -15947E2AA9E07D07A98723DFF9D31CF3C50C4796D98DEBE12BD475765D8AEA0180CCB73E -C33CC144FCE23D5D90282349CB17E9FA753A6B8D0F3FA480C5D6D4E11FB30393DC4A774A -6C568A6794F6C71DBB7A1E0D9F5BF8DAF1EC3CC18CB067FF86201124CA66FD8F7B884910 -DF8511ECA9F027A27CBD235BA14613E32213923BE966B04A79A6328431B07F762BD7AADB -CAC4E00EC767F91C3BDC7FB20329CBC2A91A98EF384CEAB49CE57F3A4D83C4A690E49D37 -BA278E9D39B92740923B3F3E5B8AA7743F2B8EFAA230C211884999091373843DBE82C2B2 -3FF81D8D7BDD75E9782C9F3BA1C587402A335ED42FE47F837366C61306807EB50BAB23F7 -196DD1080B0389BD1221115F17D9B51FC600C77D5B02D78F05ED65F895AD34CCEB36EFDD -8A3289F4AC4472CC5513E688B96053B6DB54198E0C0B51C3FA3723AB54F2615E0FD7B488 -B3DF35A895E558A05C100605A213129C0D8DF08C92A772450F2F1EE7806DF2B5C5DB82BC -4B72137716329403F9CCF85B592DDA02CD4FA4780D60E8B9BD7D079C59070046432F8A2D -8BCE7098D4A81E6933807B0D9EB617C2D8F7DC8E29A5C10030C93918378EC771EAC7FC78 -9BB4D5D1CB078D4B2F0F239039EF9F1B45D768CF1870089F76F54F86CF4BF7A443A1B333 -EBA476838752720F8ACF49C0147F62068606057E9E8F55D3C26BC0328216D6E55B9A18E8 -BD8FDC0AE1FBD60D1244AE9B060313ED36231A8610D0DB8BBF8B9D0C218082678F828853 -2BF2FCCB4E13251E1FB176AF17CFD1B4E74B195FD65493F74C9755562D91D83CDBBF8693 -161FD054345DC816F885596C6B5F423605D0DA925E27D8A44F6EC50E36C368B29AF9FA5F -7D634E4390814758A934E216DC092F352B49916F6F117EEC457AF1029FD0FA1B267BF519 -C85866DB602A67F6ADCB772EE699DF5FBE9799BD6B0CDFEBFAF2FFBA9E7D1C7A4E9A8D72 -B1730290E8EF082B6313E162E1C1EFFC7A404C28B4B3E4C9485041E941455CEC85C94BC6 -B727E5872EC049B0F6654CA3F21E107FFC105175C30BD172B8FEE93D16EB85F14DC911AA -E9CAB4579778040FCC18F15C35F5CB1DDAB8C393476B882571B1C81777835F011B5DC4D7 -91703453E60205ADB46E9F9049F980603DEFA613F14F370EC8729C5D365BC4D128C65114 -833F57FEAA89834597C2AAFCDB74C5CA0A35B6C380EB029CBCEF5B7BE1D253760653677A -78D18C6230986DA5EBC43888B7CD821C1EDC997A4A3574F695CFBECB60C7F07C5FC4B9CD -CC49ED481593019AB8400DAE0BCA31F101B5483B3DCC330631F1EC7F4E5D3EB5D6E38ABE -DE013DBDDD4FF6D9689C2F4F3E7D0F2FAD680B94B5375853A079678C3C2FD7CECE27C8F8 -7603BA3C73B1CA9CD33F9D114630E413F118161CE5C6B38C8C5827710231B9E8905FAD73 -DB3AC1FB0C7883FB8C0A96E05859265637903B41E662CC4D5FB36368E4400737C5F34F1F -465CB2065E90A9B453C7D2A3102CE69537616A15A462087234A358808EECECF2E1704E35 -0AF5A17DFC5D5E83798E98861B94A1170CB4DA8BCA63957EB1B7E0515CAAEC440A291161 -F6B81BA7DEC7270FD3F2C07B8629E1CE3FF15376660078185A05C41D4FBF99285413F001 -4CE1D20E4EB2EF6676D1AA2FA8A4DC9BD3AF6F664F9B4E4B3BCF606D14AEA0DBC253E9A8 -75AB27F3D5A7328850C2E90B6BDA2420E82BC0ADF07C005357514257694FD442A6E701EC -CC91B7E0845B17CC8F09892BA35CD5334DD73AA0424AE8A0E1CA52D2109E62EDE237177F -1B469CDCB95F1ED1934C09C1C71A9061D0C29059C00D7A6CC1DD2AA2DDC209164890161E -8B4532199F7A5503A4438B3769C9E1F8368764D4F5A5FC7CB397E27844ABC9F2498A6BBD -B6AA3C33125B52F692D2E4ED469E7B3ED78D60BA285131AA78F581FECEDADBFD2E7932A2 -D96A86944BC7D3F511558E3BFD8AE1250924162874186ED3D12210C79C044682F7BC3029 -D9A352D3533BD903F26A180686482129DE478F6A0FAD7DFCB9EF25F13260B9B0273645B6 -24583701E37773426743C9AD1569FCB3C69277C3958944EB211758D1787C86F9DB344713 -9F522EC5328337AA586BDE5B734EBC6F5F392F7BD9D6910F204C63E9529C9561FEEFF567 -800BCB0E900BB465DE21A576A809A13F3E4FB24A9223B41E52BC297040808840FC7FE337 -7B7B71A0318EFEA9A421FBCF3B797BE09579FC5559C3085163CCD30F2757E457A04923FF -DD33B439351FBA13AF5DF216A968D8F093540D70222A5F98CF9E6EE6FA6ABA02B3BFFFFF -1AD6B5A3E48298FDB66E69459C7E9646829B032E99DBC5B4C98731D868D14159E95224EA -9237CFDF32A20DA1A4CAFC0D55CB9DC4BAE3468A0A91EEACB9F6C76F677DC6BB83BABAC6 -7A7238F67F41F0A67EAE0578F56D3734C87304C0D3800E9B52DBCFF05F6EAA9440691225 -CAAB4C86856463B0E0ECE208CF4920871DB1EADA477879A4C64194DDC2325040FA104327 -FEE2F853DB4515C154B3B8A78419DC4B17C78F14BE6C7E8BB47388B11075474AEC54D6AA -C53AE725242BA69651DCDDBA6774C3DB95B947A044D009DE74575030C947F25274EB0A1D -331D25E53F231FE7C2B7817F44B6E98D0B845BD0A31DD9C8E3B6845CC80B259C0B850278 -5E0542CD65CDD0102FADBA33501C1251340F10AC63988FF53BAA60345A145455009B80E6 -D67C8722B22FBB74554A88B0284F641DA252B9A2556B5EC15DE1EB75C0F74CBEF4FF7CA9 -50B90497D23A935511F5B7EEA0B92BC686D71EA186B49B21E9183279379637F8BC3A3079 -3419AB94A6EAB55F602ED0D4EB20BF6AE82050C432FEA1EA3B5BF2A16B879E586C1130D6 -CD5682D7A1F51704EB03EEF129D7994D80183B70E3D60A5EE4CA8E21D4703605FC8E2CDC -03E1FD17A2B788FD74DA79A0942856C022E9ED417BE6F097328E22717AD8A4976A855FC1 -5B8CDCB66FCAD6E6D87021578F2A3D93CBA708390E849C1A96E234EB91F54F53299529BF -1BD1DC11722FB9DB27C98F2FB05D62DA1B7EA32CFEA033EF7C1C47B3FFCFD9A4BCBAEE4D -66C94E8488D397644A2735E9AC8E0A5B4C61504D43D85B27026F15059B0717A0E9C2A893 -FD1A0C53815951FE68958615A581D9F1C22DDB219C3C7213F20C496AA0D04E9B3957F71F -94A2A9E20FC1DE943A30D72E20E0DC0AD7D974164656FFA36F1940909464CA435D47546F -4E74ACC7817BB6842CF97FF285E4EABC7CFFC7A314983AD5DE3FA821AEBA7E95252B0524 -D423F8FE71FC1E4D8883876DAB19415FF39A330D8F1F2E9E728F2D47EA05397F8F6D4A17 -7BE4BE649DB34CD403FE663509DB51FA3DBB4F3DBF4C969DDE8E18CC54AEFDBB23E286F3 -EF0AD94165558C2E1E91854A7B2D547735A3BF9A4AD940C328709F99801FD5CE9EB34C2C -394BC530B2F79D6EB01FB151A20C03F64A76D6018699B09BABE16CCCFC516FE46A906633 -26E06B7BA28EE26134B52B96696BBA8A235103E8516FEDF892039A768C632C39CEDB3AAC -19D71D351AE1DBDC46ADA5D3D547084243A87FECF11DD3A99C79E08A17969322C177544A -A0A79990D1C52BDE6777A77DE02D9E9192A6D06D4B1D2FA19A95D1EB5B2F700A3D76D383 -D6D8E68D85759C829BA020BEA26587350B8BB4A22BB437999F0207B51E3C29508CE76AD0 -CF2FDDE225F0A1C2437E8607CD180CCE7A4975A535A9F1AE496A3A7D83A276C67BAA1981 -66BD3AACFA8CF66632E6D18D256F878143ED7EC542D7C29F16B0CE96D65201519B1A1C6F -941B4812CE4597C92727C2B1E3D41AB59F3B026C32230374B012491D5DC66E20871B0EFA -4A1989D8AB26B772A7BE6002E4FB4AF7F5DD5B0639FB0E59349A6AD7522240F19DEFAC33 -D0FD050E565E36E87C5CBF0D924A3EC16BCB31277F53770CDC95254C0B9DF1CBEA0D4386 -299D005AC2C1B4985DED85978FA75596D95488F9A16F77CD6572064B658D6FBB7F765CC3 -18C1032AB570E04589F6B56A67E0DA0D485062899BBB0E760E649B0485B13F76922AFF97 -59BF4651ABD8AE83EAB7544A2CF451E9BB18F0C4EEB431D46B65CC1B9049F243FE740FB0 -276059C3A80EAC689D5A511399334BBEFEE83FE0138D3F46FDE381EA63DD0A5AC4E36754 -BA7AC6784CF3A1428945483EC5DF805B846C2C758EEC2DF8A63B55EB7FC0762080071E10 -EEDAE6674E5539B69A6335C68F1FC10BF1F41157D082CB9376292CDD4362F14185D87F50 -369E7B562DD7F75DCBC86A5E8187192B61E3EC233F9E26230855498C1A580470CC20E233 -C8215A825640A89D8E21E4FC2A4EC8CE44778B4C96B217C0CDB6D2645FD5E4DC24D293C3 -84512BDF80C6B99FE14E429AB9C08E7AB2D752F44C1E826E91DF652505F6C84F050707B7 -9E222C6861D5302739CF4561C0A5FF82CCF7E7BB2B3F23360B8B0AFE8D3A272F6EAEB35F -5419938DA96A1EF1FB50DEFDB9C9895BAA791556F51D3BFDC373AC0FEE03560918977CB7 -851EDC56750C708883149FA8D939B5BC7F7035ED3E2F2CE7295765C0BC09FA3E18D350C9 -9B40E2810C1FD915C2AF3AF93855AEA12DBA06896A51C9B2443E2D9A9068FC76E353699C -B8A782C2126D7947101849809294F5763E150498F31BFE1D5D8AF704BB59176DA3DF2CF9 -0013ECB8E30250E5AF4152D892F4BE558D140613936DF6F9D43629B1594FBBA870B0FE5D -1BC168BC183C60BA2ACB3C9BE52F853AD4FC1B009801ADC0FB070C65084ECD3165874E91 -4915B5F188E4CC3BC03240CBE3224662D2B3AB7B3E177E6ED05C7EDC0E96600FF6527A4F -2A63179E47E74DD67A4D11BB1954DD479D7B66FA38BCBC85411B841D963417853482EDC6 -0753CBD2E0B0EA725170E33CF7B7F801BB348538360EF54A01CEB35AD465CFAF5ECA3EA0 -CE3DA1240E1C94A7F88375ABC46AFB407FED5EDBFDD79AF542956435D271EA685D9E8474 -ADBB88246355C959AE1408A5C4E9209FEF36253B0EA5DF070DF4BB364FFA3386A7FDA80C -046EE0F54552D258C3BF0C964718077914D4A43854FEB495FC4D421C2939978770ABD337 -3160C7D8C9D81F1F3ECF40D24885AD5F26805DFAFFBE9661031313540B02E71E1B9676F1 -5DA9BC5311178BE39B0FB98F3D7F1064B7E76FE3A15315E234C712AF8542E4E1CA1BC2E0 -8AE69382A34FAEFA2E0F67A6B62144B0C767A45C5DB57648171D43E8E07611E04E230C15 -5A16B786236833B51833EA22321EE4A3B2E273EA7D452957438428BBBBA25E31A5332106 -54AAB61F2302CE54F7B2A0128327D60ECDDE0E455FA05B16747F75D9A27638A174482ED5 -DD91C796158D9A20FB380971BC4E30FF0BC9B9556B4B53085044044AB9418C2144087A39 -3FF2988DAC87F5B872684A327B30E362978BB4903DE7A4C3967F62712B8EA2221CFE4BC8 -72E0EB73E63A06844ECC468DD8C9D2D774C3332553B9FFE6143545F214E3DCC512E15990 -9EA880363696C962E6912D26FEF0618B88BD1587CA13C3A82A423F19CF9347D55D005380 -3B1B91B352177813C3E20C5F04AB4B9A2AA11CD39E11125CEAC385C25299DE0B617D81AD -8091CE925DBF4675E7D70A515B83800F1115762A7E964FCAE0C61BEFEAE27CD77E39153B -DAA1C87FBAC70011B9A0F62A838A8122903AC09A39E53F56935778804BF3D025F664A9C4 -3E314ED0673FEA3ED9857079FC6A49A8B77617014A7054017601B5C6E75C8CD05F89C2DF -D8ED46914521C2D972BBE86480177A3A2B2DD174C77BE7FC9E0069568B392C124774A1D8 -DED4DB00F17024B55A5048A4F33C6EC5B0BB43EE3AAB650D9BE28160D4C0F128BE5FA21A -A29DC060CBDABAD9BDD6CE0B5A4B2051E038794AEA31C482C2B5586320652D940FC3D6A8 -012EBE0EABD7BC1491162F8FC1C40D07B904B5758515C1286DE71562A790E8A86B6D626D -6327F9C7EE4EAEF270D5A6081025B95DBB7F57C33B819CD417850311E3CA2899703649A2 -623255DF77C213A59602CB749F49A381C6101D27D7975ECB414D601B1F893AB8B8159410 -E92550514FE10C04C2D218C7B8EFAB3A007816C50B3CB724411558E8DC8520908C205239 -501DB6FF5B5CE1767C7EFAACE931987BE0797361B3565571F440FE447A168AB3360C3E36 -1E6DCF8F6482885ADEEED01DFA23F47C6B44E6268DAA6962225B10D37E57E20D9C55376B -9D6A880A90D535F91D3893FC09B5409F2D2A428BBBEF2D9DC4686BFF8A863A6CCAE5FCBC -5090B2B9841AD3205B0EFBFF72AABED459118C799C6B281B64500243BCF11D5531BB74F8 -A7F676670EA1342A41AC8FBCAF459C9D11D5673A0592AFF53ACD4B94904F7FB3759C59A2 -A7E5FC2126ABFB56535D0A6240CDB83223EDE4371D910931D7994AE05CDC24FD81FE8126 -5E40835FCED262A0DEE35F705E0668983D65A8CE7DB1177CA8B7BE0A73A99D4D3C44F401 -DD6CC8CC119FC36438F18A924D6DE1C2040D2BAFE336277A751D6D4D05A828AB3FB8BD48 -A7DE7C166360788AC8DD81662727B330D860166B2AE789181E4231B5AA3A205663024162 -C053F2213D30B5102B3C430F9B67E3FCE64FBA1BB617DE61D2A64FECEF8B6BE7D4074E75 -DD4AA701474CB17982EC4203E1754A19DE41874EE1818BD4F243869BEA6422CDAD1FDE4A -84A1410C9BC92A32525D6DC52EF3E90F5829CEA418542FCA02FDA62666386F628543CB04 -D08188E6B9B0092E6D00C6C75C5CA9436AD0597C741D4B2C63E585470994B5466C509B0F -D077B49D87DD6BBEAC8C6C4197B9C0789025B49BDD9534F42CCF987DF9B04B18D19F9343 -A91696E0E206F4DBDEB45D6D7697B49C4FF5584800CB512611EEC8415BFE1983BA96BB82 -3AC3E496D9D79C6426B97A1455E070695A27E407CCFCE7472F147EC95134B89BFFB87146 -982FB4756612EE55A782F303B54670333FC04E707FCB84D255B05D52AFAE8F473E8C4FF1 -F6E95EC1B820ACD2D3E980A1B778C4568693AFD446C6E416C48A45CBAD61564329C4ECB3 -A98B4ECFB3551D1F1C03717D29A5DB62C8F1B21D036714A94CE536D0E84E3E10800AB513 -91E05C62F2A9FFEB3A738E3262E1919FDF43EF49842F6EE5D309FDFFA0B74FF64262AB5E -813C8042B2F450A5CF7B547A8383039E7C14567EAFCE9644DAB0A54249EDCF4C24EFEF7B -B3EF129DF5A11E12A78FEBA6080680AF4476F4C0AFF6E8B27B07D6EBBF5B1FEB28341344 -3154B99A65CFE335224F382137E3AC87777A6719AC1CA6832B61AE8CD6A1931105707F0A -DDA25615B526EA2543F6FAFD00D70E4091B6D5D58C9CD62B19C70D7469F6FDCABAE2A517 -66C9B0DB0AB351973A4E2FDFF81DB1651DEDB905ACC447FAB2B2803E90DF264C96092528 -8211E23246BF45FD1AC67983A7FD5B371581B8BED06B9CF8E6AA6C4BC84771219E7404B5 -6DCD474D9B859D1891FC2231869763E6B8F0615D7AE7B83260DE84BA39D6D60F50BA70A9 -EA8FAC771A0F0A745932D00C1328806D938CAE671B94EEFF484E5FBE9A74A97CAD47358E -A3CE9F399407407FC199677DD7BB6B7B9B00AAE6EA1633EE18DDBD40FEFD138F8423B304 -4B9E9AB192B7C767D7D63AAC804F0D5309E0FE72A8259BF12DBE7A215B8FC8460C285C4E -26067E3C558163C1622617B082C6FC941F8563CF4ABECD0DBF79CD5DD86B492E3C46D0DA -BD16AC96ECD6B41212431FECB4EF59DC7DD3071CE030BD5DE690BCDDEA9A2594C50CF77D -53B223EEA513B40CEC7005C4F6B6DE2D3680EAFFB6FBE0DE70E7DB5C11F2BD4085C123A4 -73E5CA0785FE70E38E081B5971D4C390A87CF5DD83C8BD63C4307D22A1680792E27FC431 -8D403102A052645B4AAA9BEEE578CA28E2C15DFE12134BCCB2171C15A45C5D4D8ACC0EE4 -A2C8AF801D64D5979E52AC410A69277160104A386D747814F0DC0C178CCC2BB40E175992 -9D3F05ED411630ADFB8E4E57CD223E012F457A8A7C2BEF27BDFD41D3B39673ACEB92A48C -E3464A8720196A60E21C1736066FD19154C02D7BC22E821C76F4B89185FA39B48B00BB85 -AE14236DFF7E1EE1466C65A1B4B9453D8ACF727CDC0EA04D85E2A4F41976E4833C145444 -B0465FBCF96BEA9554304FBFBA4C39ED11F2E1D9588EAC200B31441889B081775BF75B6D -7AA3055C85ACFD57DCBDDC12257F565F1980DA3215AB29A2545B2FEB107C91A454DD3C32 -D7D620943472E7AEB5805E64EE7B1D3582A2DD74D439AF03C00478FC35EC9017F1A37B59 -A31A196CFBC38B4921A76E41E3A6E2C0E5059FC3848DEBAA378D87736B01C6710B5B0DAE -FB06D00BE44EE7C687DBF6CBAE699D88694891A95392324C6C49595C7113FD6D521A182E -FDB264432F3B661D4E86766A7DCA2E53F72F7FB78A0C436DF0D516EED141D796F3591226 -E617BAE549DFFAC4CFA0F555DF7DFAA525DA35DB699A892B09E654992F99F89CED6273C5 -9EB9C512BFA0465E61FDE63D312B1B2758E645893A19C82A81E5E0F5AE8E51621EAB69A4 -1D425F9F78B47ED5CEC857DA012E641D5C203532691F9177F4531EAE8E6A7D5A2B1B374B -B921CA70F41E7F32A8D83C54AE01DC76C88A96C1403FEB6942029A86B1306AB096F8A42C -2D7FE35C7E9F3DD494579CEF39755AAF7C74909CF5F7322C4FFB2C5A196658B7AB49056A -E3DCABCDFE40DB0912B5E15BBAE08B72D7AFA7D64265F4185401E6E723E151EACB8C7494 -819998FDEE918EE491E4F9D5F889378256F2F7858762A5E049A618ADF34DB73540486414 -1187E3CCF635097AFEE95F695F806BA1419D85C50FA033E4E9FCC155849677B3A20F6451 -D8E4E5AB1BFBD967B5F53C21A30EDF1286A0E19FC557598294586D5184D1CDF8BC83594E -17333A522E32233DAA8A6EB39A6330013C32A2E74F0EB6234B63D47A4C8D21E1618E5906 -5EB21FA9A926E01A78A60FBD71808A0B75F65786A9E3E08488FE89E433C287DED44763E4 -F317DAE0709D7D54EA969B751F4C62AC976693FCD366804E66B2BA8D955945B86D492E74 -F17C0484FA5C45D7F60DB0D4578C5725A88A9DEF8E5D31EA02411CAF6F703AF96F50FBBE -6739B57D4C1C318FE7D491C94565DEBC43078303D329E87078EF9B48D66C3E98ACCFEDC0 -A31761AF6854E5C4DAD36C809876D93C06D91416770CE8852B5E54AA22F6EF1A5BAD532B -E4F55FE7E2AB457F3242030F443975DFB0F2CDCDC1BFE629C8BAE7AF2D21C9BEB3EA10CD -E4EAC54AC081CD3C0AA161C52BFAC3A9E4F0FF77563D6FDDE73E44E926E1BDFAB4B1A11E -2B4A7E1D2CF9D6B9DE48D99DF99E0DA53F5A449B344AB2ABFB94BE9E60E6E9B328B58337 -A4D4BD60CBCE14C364A2A1D5C02410C2E8A98CFF3A48D23C752413A4FCCC5C044AC99451 -20B15B31CC5C7B5FC6D80866C1110B45F9B274326656CE6D74F3481B7D5DE8E5AA907509 -C15914FD27CE89F911641DFD588812A8292504EBDA5645E8C510F5E88EF44C573CE46D01 -EFBC6E3E1BE9600D77210B10330748F210F2CEE4841940A78AE1352654139757283F0FE8 -12040846B6B24F1D96EA06CEDF19F0E3359C8B30C3986C2E20F5801C7F74ACA621E8C4B2 -4C38B9888AE24013371F19C80165522AC90C40832C71E617E042ABFA071BAC4D87D91F86 -4209F5073D3E54A26FC2FC8F89DE3C1B121881665D48339FD2FE7B0ABEF5491941DD26D2 -B379900687DC8DAF6E35153F409DD58DA91742E93CFAFD431EDB7A32FF814048DCEF7459 -830CFFFCF958160B1B54525EFC46D8892C30561D0D7780625B0876D816A0099AF1EAE992 -AAB126289D55638559BBAF487E1A9E2F118B3D498C49767B28FA680BAE464632C94435FA -E32836F8093885A91F66CD5070B91558616853AB410AABF0DABCC02BB85344751A2B2911 -3847CBEDA65616487A853D9104D0E00012F179EEB06D9EC54CB50DCEE655CDEE79F89318 -F8212779CC310304A2F604402C8EB99DEDB3051CD1EC0D03309EBDB8C3B5A89E06C49957 -5E00904DA0106F87D58FAEEB8581EB47E982E29C5ABEEC747205A33C7B05A0CED74C3403 -0012BB647B5AB617AC8508E8A0F254E102406EF1EA86DC39CD9335FC8A5CCB1504757BC3 -AC11BCBE92800AED15E84FC3A6FD8BC6C27C4A13AD946DBC65E45B3C1F72D4D2C1793512 -9CAF2C6C238F1E57F428CA2CA51ED139015DD06B931A9FD41A8A759142F50D4A18D9E071 -3CC7607EF0337C7B401CC2E47F0DDE63B32BC1DF572F94991D1BF97F1BC17DCFAB95A834 -E34652C6BD93277754DBBB1DBAB6F0158CBB6E9304F9A1B5DBB370C3EEF6A0F937A0C7BF -789CBB57E308D2D3EC0A0F04BC3BAC016AE4CFEFD4A5F5FF9F2289460CC7E6FF27A7B421 -BA3BA86F2A48C2002C4C0379D90B50952B6A629ABEC22143A906752E0BB2DA15C36EF74E -DB102D691DECF27A7C252D866640FE74BB7BD351C4DB5C8E4956FD73CD6675FC53DCAFE2 -256AC5E46FEF1D0044B5A347682FAF71ED9CC08F231605BC342148E3CAD6A80ACEECC89F -767E814046DE67F5277CD737D09A62B499DFF7908242C6E5F17987573334AC66ABEE66D6 -1C61D14C3687DBEAA7BE38D248A7B8CC775C5B577305C3F41BAF7C7D64B43E7326133C2E -795F50EF42EB3F5817277E2690C8785064AB6BC61AB04F578549BF671D88E113DC704764 -91AC7787C2561DF6AE9F3BA5FA24F5F2C49B8B72833D030536BCF0AF10592FF37E223065 -ED6F4BF075F70A7D0ABA84CA427CCACF9A0CFE46A429FA64597C677C71A231C997AF401D -07FD7FD98F4A5826DAEC4D76B2E6A8DF68AB8EF09A0A6BD0097840364FBBBD4B93950A16 -CD68B07CDCE7C341AB8647A3338B1608D67CEA47D26EB1ACC0F94D928F2930C2CBEA594E -B773548213CF17642DF03784B9293BBB8BAB745893C2CA0F9450A337E448A282A285867E -0B0A2F5DD49A23D475709131946B03E8C2F7B2D21DD7F1EE583B22A73D81E5F72136802F -D917750E53E63031FFBA218DAF8B3DBEC561581706AED8A5CFB6593F5CC98BABB048587E -C9EE27EC04859B6C233474BA9FA8F8D909B17705C6F2BA0CEF169B46497E712C458354F9 -F0E1B72581F18BF74AE06CEEE0DC27FA684432625C579A29843D44973D4BCA13998DBEC3 -0375F1C05CCA91819C3F7C7F2A240B515AAA8403230F9367CF391F3538ED5BD391E70F24 -51B6CA9F969CCCBB58A05FB86E90BA4FDDAEDDA84A73CD40617486DF08FE7985A55F77A6 -B2CF450665F98F0D173D0DFA608A4E89CA6B7CF2F86134CA0B97FE3FA0856613C7E71D9A -4389BEBE6C1DDF23A7D617ECF980EB78AC5FE99665CEBDF1BB8C1CF29C345B94591CE29F -3E77AC66C3A9A1FB34526A1F335E71FC1AB62B4E8237E80CAA0265FDD418322B068FD4AB -0E603448CC61D57106F1BDDB5785AF5A18C211021FB6F91AEA6112BE9F34A75C6C428EE0 -8101FD9904EEF19996EDC2235F3CAE00B0FD20331597B63535D001A5A2951F4057C83A8C -04EC71AF466EB9EE31CAE51F453423FC327FCC256D71D4E2D956538C16231BC8E6A54FB2 -85E7D5A967CCDA56DEE48109FA4776F87466F0F62355CA0990097B2BF7F947C0198F13F6 -EA5321370A9CDDD612DEB3C91766A19B4228AD5A4D782D9C51BD3DDF268D53C24F6E4543 -52B2780CC5906D6D08A27AC49043FC1ADBFC07ECC113D815AF2BB5922E42776ADBAFA1D8 -E8608AEDDDA45E181521E5A8C39BFB2E9E72A7342D641574D84AAE3D23F114E2C675E50E -98C0C4D59107E15753F2E29B2EBAA4D40A0FCB785E0F20FE5EC3F4C42AF3445298625AD4 -656A42B95D3F3BA64495423BCE66806EAD119E6F949E5E0CB7D20D8B218FF77704BA5CCF -C6B96CDE2E22E2A1866F80C103C986D01BD96F2207438F8132ADF46C5E889C2752458D26 -050C2D2D9996A7E90414880A34BF4F6F7EA862ACC40E6446C8C64BA66314493C05D5552B -FFD967B26CAFB3238DFB04A14757FCF34B547F81448D5BE2C385775093FA69D2B5264954 -7552C28488251224E4571A0537F87370D575C6093047374077BCDD8315E40EADF2ED65B2 -9BE930D5A78E0E4F21ECB50582FE1501FF48EC392D1717D5037175395D726475E79B5EA6 -68150DA75B9FA24A530FEA3EB4D2E4D73A66C800452FA1053CCEFD77046B058693170362 -AA4EBD8C51C334C4C24AE69086BA5A9AB3E8540E0AC782324DF007DA127A7CC2EAAB55D7 -33201140FA9B632F11D41030ACEDF37F12D4E4801645CE624BA973671E41C1A11169592D -CC529462D2047E2A5D06FE543E5471D0A0FB591A9D3568D2B642C2DAF22BFAF136DC1635 -11611AE38717F04BCE872368BA82FF9256AAB0AAE93D52A286FC62802FFE2E8FF98414AD -A2E28D0C07D95FE5C9B025A9AAD8A355710C6085D45BCA501AFE400EE1F9B34545AECCE9 -8DF25A6C7330711288765392C4529746FACD974BD8CB996395FEB547A9D674F5E56D4841 -32A4B48D87A380C52E05C86083677D88696CD2CA221E676C8F950FEB61CC6CE37D055DDB -83089B0814A90EA5B3EDF692055D7DE2208F5F5151667ADD999A0301E9D2A017634D3C5F -8B645C726D0BEE71D4098E0739B44D565FF574FE93A250AAB0879413C38763AA3B294956 -BF0649C5495E92262A3EE9E3CDCEFD1DCED80221217ECCD09A04B2759C746D720C3E88E6 -22174A8E496228CE9BEB430557D8AC5A813670400BCF93AEE40CFC554A933EEABB239B80 -EE603F1617B3238E4EAF043699EC674D348997BD3105B8EFCD06E55F78AEA6AFE81EF9EC -836F4703650D803CD01DC38094F11CFF0B34734308908ED646E5B37BB9524C886DF94F83 -B2D470752A139E6A06ADAEB559E3D5A1F4EEB78F896AAE3D9836D4C7D4576877307821A0 -DCBC61D1318B937ADB53865F9F9B6B90659DC518108B81196CB6E81D676B1EAAF9B0F3F6 -FB499A99BCC7169E7F37E9808634E2A0CA9DF40F204F86FCD7BD135D177ADF005B5D9D9A -0690DAE940905664994FCA90777CB9B3C4591FC0881FD146A41E9EBE7B8F74DD407642F4 -5BD399C6EF5471E987E01A009F532C2E66305C890B0B582824B527ADEDF668456AF3776E -4634332C59C3133D8581D47EF6B45B636422CB5FA0B117FE1AE0361B93CAD6850624F353 -FD41296FE84391636A2EF92A3658E07B857DA4FC19889E760494957276BFF9543FEC23E5 -2A7C9174B581D299B52DD03AE726A95634C8BAC12F17B80B3B40BF98BE848CC4837C3CFE -FE2E3B64B5A8BDE695ED0BA15451AFC5F0576DB1E9E9F29F05D4DD02EC3AE44E15171CC5 -EC254176D86C83C062B7206966E7F0A8822816251C0AC4A746F661897E24D2A44AAE93E1 -259A4C582FA34DBD0B4952CEBD2753EDFCC37ED685FA00E67C455D03072C2A218647B582 -F58270B59936EFFE692E0F27DF5D73AEB8D2CE0970629D51B9EB91C0D2712CC3BC71640E -9ECA1D662FFA06E071D1E013695854792DDD672080A0AA42657C9664D6D850757DDBB167 -9FF6A837674A5DBF38B2A435C2AE04EB86D351FA0CB82F0D5F00A96D55976B44D6B6BF5A -75346A8CD71230B6A44268B73188A84C47F09EFD13CBEB51CCF7ECDE43A3BEC6933643A6 -68B023344E407CB2A6055EBD6E75A27B6FFEFBD095828A8C5B9A14FD78AF99BFCDFB0A27 -3313455D19B2036304167E9F8264FE47E1F5AC04EC94FFB3E1D6C90E1758758D2E811C7F -DF1EB0AF24EF89E907484BD07B8D825B98D99AEDF1FE0D67FC98A0159DD6492503B86C35 -FDBFA654E3CF4B00D0E4E50A77BAFC6D4CD69A668AB5D0436E9A2DA573E04EF308A6A928 -29F21A8419FF3B7689590D3787B3CDAC9B6A98FC0AC7B06DA9748F5765A25708C3E9DEB4 -1DF4EFD5BD9E0C1090BA956EB65087F5FA803CE15BD0FB4090EA9DA33F86512A67CF8775 -BA3C3D834FA4D6798CBE5D5439279DD0EE083DE2026B2EFE83C203C632193D30D390443F -A5D1D1288C2B7395BF91F3FA657BDD688A562EBBA50DF28EA5834DC1F9CE073B704D2DD8 -594620A53DA722209A6C4A9A906B552B562917A86373C43132B5997CCDFCFA398C35EAB2 -D275883CF4C5AF773B535BBA0CACB12ADBD2B3407C8F046F1D4F391EADA619AA2DB788A1 -93B7F6975889D7676AFB6EA09978E9590E75F7B106112D0B62063A21DC59110EA5E123A6 -51F2BB21FBD6C80083E5B3405835F9AB6DE5A7C579F8F7B006983B897E4C9224BA21EF0C -DB8546D2F477D280F554F98AABF7F6D7E890B327129F4D43E3BE119D1E9B1D42FA1A7F39 -0941803CC1752DF5A9198AC5AFC71DD6402095EE312A89D1466307F0353A610881A56891 -4EAF39DB13B984A78C1B9EF169EF8781DE0BE7B20698502E8F81BFC06DBF766B3CE28A43 -4801EB4FE9703BA5933AC6F0872CFFCDDADF1135D02714C30D5F54D36DF3415F416D66A7 -EA918A64E00AF9213CF9CFC63B200BBB4402E53DD95BC8B5AAC20E62964AA87173563396 -AFDEF06AC069AFBB08D6600AA3A61C23682551F73B2B7E4DD70392464C439FA6CEE41A1B -4EC280388A8DF86195788A9B766DCB0E1AD6AB7A1C66A1835D7AAA8FC92741104C6A5553 -C149A5BEB648BD3488C13494D9661FC8F9DD431E9EC1989CA9B35E67A2BC9FED7BC3E362 -6389B29B863DC77F8ED314B47B4B86C9E559A6E41366D47672D9E9314B192833D3752C70 -3A571CF80D6F165C660F42F58DB5CEF453943C7DD0D252476F678E44C6340B7E4D52C927 -5855FEA030BB191D34FBF80C039955C2AC6F0C38F6FFE281A52F13B62543DF45BBDEEC7B -A2CC3A125963D1524EFF639AFD013A472B336E43E9256C3EBC5910A05F641EA1ECB98857 -FDF7613E9A3790F9FBE16F8B1E9CAC2829EC0B651F00E1B6B56F0025ED82BFC5FE1D227E -3DC00ED525823F310A834A747ED0FB5F5DAB7EAB307D0906AECE8AEDC3808C53C3C9E954 -6771D79028ED61CE595EACA42B6ACB8C47B1417F1E88391C0CE35415C9FB29106F8EFF96 -82843119AF94F798D7079D40F21B94BB3061C2155A87075846A62B1E1292B465E946AE00 -A3EA7C2057244AC8C4D54A8618AD7B06A833E9C26BD2BF4A40CFC7F7D780DF4C31B0CBE7 -0657FBF4AEED88152E1FCA2956141559002CEA98E7299FD83BC9BF9CA0523697D9E188AB -2D883665C329A8A4803C8E66072DA31E615FF9254BA8CD94A5C6CA0EE7AAFF3108F48D79 -0523D58E98803CE03FC53E71DF394691240284E210C77595F292696975A206A43AA7FC7E -C0CEF778307863F56016C13EA6A26299FF417E0668692ABCD895E7CAF13A9C1BEE2B1E62 -0DF960006550CBCFCBBB006257051D7254425C49F840B8EE5A44A61E5AF465A3A831FC26 -A8A2062943955676AC4D5168EE2464067C056B1DCE6FE780108953F9FAFB6F89DC775E63 -6E3EBD3308468ED7B31CCB4D80142AE342D630B919584B2DD67E904A48C5CEEB65C1C84D -8D2964A4842E8C2A83129C91662137BE032B007A30A0A4D2B31ED3B1F44AD5275FF105BA -929ADE2B78FBE0F3F34E2E9A35568D96214AC1A347510E8E5EF0C9CCF08798C5B0C09DC7 -3FE817E2BD84AF14627A8210099509770C680C327ED697A255B28E81DF6B512060D47084 -B8AC21EF59C34AA36A9D14A093116EADC45F3F64AB297E114053081C8D6B135B36D25AF7 -7F2050648799554FE6BB50CB6E957E26A0C62788EB76901B438AA6422118463BCE7AB3F8 -C21E007C21A9434A0294650543B58F0925F664585BC875ACBFCF44F5BED0D8AFB0D8FD6E -215A03ECB350DA054FE30172E920C34E64AC011A655F5A782178DCB3F65FEFE0CAA68993 -DF30FAA2471396F6D74213C38A511773DC7E84A9831C2E8C4B51EFE3D8DD0674050B8DBC -F1E09ECA5BBCAB73780ACB37D46742594C6070EDC7F5C555FD50044208F6A26316F17B25 -1DDCC694443233702745485F3CA188CD3E1F833C99ED46EE525D31C6518A86B723E890CF -DE3A834170507C9F24F28A124DDC734BE002039E81148D73F8C86918DE78E07964001EFD -9A3EE31A0347EC258360D2CA6AEBE7EC4D5FE0A29D415DD78A13B8CB8DA84AC8E480FD48 -F4A9440EABFD6A1C4988A7D6FA7146CBC14FAEB8864C578A81D86C61C0D08AE6D50F5654 -DDCBD02D7D9D9AAA56C417D2A3C42AE47ED81350FF917E7D5D390D4BC8AB934353D902AD -98BBAE982ECABC933FD33310FEC3266BB373AF3B53D8880A8106253FA48D78899D0E6548 -A9EBCDED56B39BC0FA78BEA9A795BE60BD3D60C1DDF5375DE0800F1FD55AB46B49536F7B -5986E790A4FFAB8B81B7CEA21980D0634E7B2CC00D1D7A9A7C00A5CBAF65476A714ACE77 -99795EBC2A944A688BC40F2A23DF71B3826654EA7646D2338BF23E216A8EA59AE50DF2E1 -D6A05A86C25EDA267225592F695FFCEC993CFAE93452BB3F2C17470552564F2AB70AAC50 -D49ECC01A418903401B4BC6F3E0D3DAA9CD062AA1A8B93016BC008924F8AA7075ABDC5E0 -01A215A63EC8A8F1FF0E7F5A1102D2D5DBEEDE248904EE28590A4E48C98B4E97DCA69479 -08FEBD5BD880AA737D2A600A71D1CC35B20612F656EF4C125ECF75DC0E1BDB57BB09BB26 -332CD1B9AD52147CDD30D03EAAD4EDF4C7C2E4092C409701BBC8EC163E4C660EB018B0C3 -4D4844EBB910E0566DF844ED250624A6C8BAC481B32024FD4EABA3D4E8A67F83FA4E4927 -A15D64462B3004F5610EB847E9413CE174D64908B0464A144DB43FA1FC8356FBBC00D303 -74E22B3EBB141575D6EA036CF0B469597C57AAAC00F840EDF201E57C0D84929A34108847 -E90C97352CA858A6B1F76E1C772C1DA2A8362D02EC7C112E8755C7D720AC5A2BC528913B -37E0BDF15147DE30321647D8001FDCFA437709AF90ACF0E56196A9696C0054E67BC6630D -7D99F3092D8DFEF0C788715D9BC43788542693045A485D5231D731EA740BE448DBB72ABC -A34AA5B8B2A4EF6E91F61B0A8AD9666808888DD61A09CBF2FA30E812BF1B73EE2D387C6E -4821DA27733C60795C8EA0E806F74601EB9F3676284A37ECE9495CB87015F18DFB39B9E2 -93303261BE268AA644CC7793A6266C026A06BFDC3074E7A67C8F6B35729CE40D6C343C4B -95EB9C778F6D513CFAEBC5FBB8AC844D1982F300675B0920C098AB288D12423A3401B6BC -CE7725E619706B6241BE210CE68A5B3F068C7255C6A0959CCD3AA40627230F27057001DF -328A741F867833911AC3D24DBC1C79462012801A6E0897F2896AD1B5345F72BB639C799B -FB4C6EFCC57760C82015F6855099EF7C5DE59C5766BC6DD4F4A61110E8CD93BDD891A83F -D8DADC0AAF16032E8B02E69F1EF25EF7CA8C23815C38F7FEEC5E4A4F11BF1E0C2275FDE1 -B29CF45A585F47962E6137150F0AEAE31ABAE6DD3D66E54D8B7E6707445857348F6326A0 -9F403CAD72D93B038C91B7465347160DE4FB2F2F81B4BD24449CE03BA177C8E13B3D590E -A6F4C5CE396D238C642BAD4C5BD4C0B2EC8B935BF9D9A85F64D867799103E285264A5F53 -CBD2E0B0D69176ED284676494369C38711ABCC23E61961F6B46C576B407D273EE84E274A -E02EC5C8923ED2D5AE650450F5A1665CC148AA0FA6E26143BBAFA846E9263E49C9ABA1C9 -E4ACC9A7E6ED0865B42023F21A1F234F485C4F22B58925B336BF883906ECA1000F456773 -48250626716520CB2CA5DC9EED93F694A1CC6D7EE74CBDC660E3A033EEB0CCDADB32C5FE -9F5A4BB9BE18F13A6CC678213E631916E283D5B12DD6B9926279CAAF46A469CC3D4EF950 -D701A667C2BFE15292FC3A2ED9E1C916B90C9E25606ABF91FE44BBF18CB230EAEF6B0C30 -3E94C24F82957557840C11F4845C7F2C49337CB588FB9791EF1C40D4CA00CD5254426E84 -391C265D4B21E9FA474843065E306BF794BF3F798505285246B906CA4F343743C5539EFF -AFFF1F93CBC5DBCA989E64B2133EDC8DECB05FFE150469EC1433E3A3C0B49B7C14EF6069 -CCC488A1AC96C39203C010647ADC1BF32B69623D291608BBEEF2C5FDE603863C91029AE1 -B6287F8576F73922B5192BF1B226ADC2DD17D98B8D0558874DEBF7018C82A9E9AA9D89F7 -DE237D1DFDDE2BD43EFDCE2ADE67906EE2525A667883685DCF78BCBAE353486C96B3831F -C1E1C7DF12DDB8CF10895DABD16A1DFA87AF1FDF8F4A6DF019395D713269024BA721CA02 -C1E2E605BED8AB8C822CC84903A7E5BA090900F1A409F4B1D30F740325E4995A5C9FFDAB -1B8480D7B5B8CEE4F35206E13EC960650A2C1D0C4D7D7407A86E583EBA40267A67A8E87B -19D41649DDEBD7A73593AF94C2366CCC6F81BE9558CCC90CE95060ABA2BB508467640E6A -726ED96B571CE6F2AC68EC104D3C2D3AD54F8490DE638B77C93595E2B1A44B079F79B487 -B92C12B16B203F91DEC2E7183AE99D79DCE4BDE5B240767D52438DC5AED4ACC691683BB4 -3D2A1636C917B6E270F309D3B75D34FEBF8BA64B01FDDD848D52C30FFAEDE43EA21C9ECF -487A31ACC1B1405E615C9DB6A9B96BC45114E20FAD0CCA71B410BB14A39997E9653FB11A -666995E488B650EEA712FCA7206F5228061BD5BC385DAE9CF087449EF683F69F673F30C0 -33DDD590F086EDBC3A72F9B17F488E2B36A381141F355AA1AC81AD4C103101AF96259CE4 -30A0612CA3110A5953666DB362D982687010AB9B81A63256AF6E69AF6D8B3150FE860D29 -E0DE5D686096A3D523EB8CEB214DC73CDCF00D2E98BBC713C6D7883AFFA02188A5E8A8C1 -007EEE1B185AF14BF0D0E06BB144660A5891C8C7710B2B85CED49F14A5D5B028A8FB6464 -3CB3B42D1EC8C334D51A270A3A2D483B223C3D95C733D79A9EACD97F7BB32D28BB381D40 -399F0B9BF194521F189D37040DAFDC8723BF45FAD60D2527503894BCD4B0B746734915F4 -F5B04D4E5044631F40BC3758DCBBB2A2AB63D7B44EEED53991AFD2988E13A7A6C389641B -32819144DA32DDB3ED45873E6BA0604A9E682558C0BA2B139D29E4986037AD326BDF4079 -B6C071DC3607D52DA49F6BF8DCEF6F04C4AB860D660BC30E758518E16102642A190F89BF -D0078394DACB5052E74EFEDA5BC176A861D8C5D78C83A46B4D5230786068F12BCFE1E73E -4F7865D5B86144B26AA5490F229E6FF7CC5964AEB6631B08E2A4EBFCCEA10488CABAF2D1 -576155E6C862855CCF52C74834BE25DFABC0BC4FB7A1EA21B2AAAAE45D1455D844C6AC2C -C57D081149F6E40B1FE620B697424B85A7177F19BC63E93975A08CF009C4659EF47A3680 -488C43751FCD7D848FF55C472F02029253403CB04872EA4364DEE69934F6D049113FEBC0 -E3E5D978CB8A2423B9910E3901981DAB495C4F323C3E3036BA45B66BCEFB4DB5C7AE91B1 -7A4A956471BC552A1C109EF67D97069D3DD5663063262FF4270CEC1079BC4C4C2AF643C4 -FE0B5F3B39389C104D40B84035710A59AB041F67B5FE2E5D3CA3E720D1C7A3F104A74C05 -DAFEDF29777AD6FAFCEA4854B864DDFC878DAB7C42CE153FA01857AC1D5B1990EB73C82B -A01D3557E10D14742444761671084F1242C9D2EE9E211465F5F8F0333C77B123D6C03A92 -D0D8B91822D6E20DAD190F4D7A1FB12418D6FE63A2B1148CBE94328ACB42845E27928643 -444C3378FBBA83ADF56A3DF9ACF9C1F2A8F3F2F3814E26D9DE7494E2F709A57E373A594E -4F64FDFDA6BC3866E3F7BF58127F6337165826F3D20DCB22EE9D7DE5CC14D10DD3BEF093 -2B0D75E289E5A332700C2CC5EDC65CC61C592E19144A13A38E24B1FFF7F904CE261FB76A -31DE7360290C8B750D92E08A25DCBF3BE97529DD52F004AD59C6721FEF0EA46F1693C5D0 -992C517536B390C86F5E788995B35B6311E6EED72D15594717CF385DF042F8515455E808 -C54A0155E58D4277FFFE04CF0C16E1259F39E84292F592BF936FD50BE54ECAB54BD27CDC -4AFD246C35D901882765CFA13A381A4F888462CA5A775DBFCF37B864AADD8796ECB2E13B -4156BDA78E6E7308F3CA382B478A60C441B09483E6CCBD51E02E5664E8DEC087AAC030D1 -431A2301C1034BFE73EBB7F2744F689D09F424F22A48960C991526F7063B78EE26D0F997 -B917DBE51D7D291F54F1C22D3E9F9B8472CED7317B6E91F4BFD2E3623D6F3FD2401BA7CD -6F93918D2D629AB72C4060B6E72AAA295F0EAD79B0A7C651D5A9FE6348EFC9396664557C -0D5688F01962E8526CE7A55866CD56847F49BD43A674D6C22EA7EAC1A4D437D2A9BCFA53 -5361CD640DFE5189DEC2AF088359B13C6AE7027EA51DD1E757DFDA89A9BC23BBC1138839 -C549FEA71E42F497440214911982F115D3A9278D2119E0A17F0BB1F8A86B7A776C3EB940 -8819B2602C66C523FE07DC9AEB0E6D4AB6F39A308A6E8F755CFA0F41796159FC55B3A083 -F28494B4C0FC25322D17E6083E79394BA1F444CF84E5DD9D9721121277CAA3E0E380A7BF -93C2335695E2F34D05CC3C3FA3322A7C863A16A9A5AD4BF1C629BEBFC20FE361AA2C6CC4 -C0D3EAB00097D9D2344B8772B049CF951DCDB1C23C138B2D7DA551A22A53EA2F604D7BDE -8AB2D034ADB57A65DCA8CB55AC778F9649BBBAF8E7223096CDB9780455268FB9CD379AF1 -DDECC2F7C22A25683BA56EC7AC869150810D8A6A5B854A78DDA6C21C9FDBA227E26809CE -FD44A8E4593DFA5B9D170A19B9DC779F507FA0B28B5C8E3AC017005FDC519E8CB69B9385 -760AE1A8A111E763FB0C3B083BE1F083AA14DF9CC83142A1DFEE5312097BCD8DDD91F113 -0A3B920FEC7E9383B23F7A396BDF28BD1EBB48934BC490D133D594021C256B698BC4E93D -1E746522E485DD53C1B7980EDF066F7C7FF9F27FEC20ADDD1FEB09CFC81F2B0E0820B90F -FB40B66CEA152312DC5E7F8CF45AA0B45636859EA9DA112F76B714CD83CE2803D3BDBBC0 -A3FD5EAA7609A1E4A82DA08701A3AC0818DAD502DECE3A5C7D9B5D6DA50F8535AA1C3C91 -A9358EEBDDBDD94AAF1DDE610E9036E1D5E1F180D426A8B33B4E640BE49073C4B0C0639B -0A28D6E08D76DCFA2F4B409EA1EFF27437809073F29FED0E64506185022EB0A5F9A54BCF -ACB0F2BDD859222546338939F73C212749C36D6B0E9AF72EBD059C3838FAC738DFAA69B4 -FA87CFF491D877DFBAD90222DFE9564CDA37E5576BD66F635720F398EB6863C5143FDF5D -A4F07317547B86C5B335CE05755AAEEAA8A927933B252E82BEF3DE30DFDAC82D1354CB63 -028B03BF59AE93FF30771BC27B186C7A9F7AFA7525F719EC5EFAF2526524BAA29793D5ED -C1003A42ADC2A344D0E4210254F2DD33AC58649887FED4080AF18554646C01BF9BC54959 -D0C06E459CD818580444E37BD2852F44C8D6FA18F7DB6FC15174524EFDD0BC9867832DB2 -F837374BB8C9031A27B17A386E6D00BA61D49003665E1231D79E05EFF440E48FAEC9CCC3 -5985299B3FA94586B516C2317B1AC9C91005994A84466514D7EBD12AB998D4D99BA37C73 -EE3C723217B4D9BD5A0AAB12760886A8A99A4AAF038EE5626035CAAB42C6AD08EAD6CD2F -0FCF85C2CE2D6150A559250140D19610DDABB115D625C17455F928B55F762028E49E4769 -872B96F84031DA85ADE6F18D601F6D576C9CB68B8FF011B13DA0DDE4D6E35E5A3E6EEB73 -248161764FB3B122A4F40ACC83CFC073D4657C042248684EAC14C56615AB156BD549C964 -C8E5A5DD901BA9B583B4D176FAACDE48BA78601EC7BBDF45AC7319F7598A93B68088BC1F -B6B4F429609FDAAF3235BFEDF0AB25B6D2BC024B533E6E300165ADBE42C890F17B9FFF6E -45B5BAA3A14FB36D26E7DE60CE24F4893BE0E2CC7A780BEB1EAE0C6AA0EDCC3BF991E5B9 -A6F98F5F5428AFE21113C1D8DA34783DC47969B9669EC1F97EFD43FAAF5C02FDB722840C -108CBFEAC5E0BE99AB3E21CE4E622DFDF8C32250C10D68EB0B6788E5269479CC441B32AC -1FBFC5660164E498713F6A2809F1BFDD79E8340EBB90481932706B378FE8DE987D5BFA1C -B688817968E797903E558F8C7D0DEADA0B5F08D3D9D27C92E4DBE0F123261737DA41C264 -E59CBA14C0F60459CA59AC58D1A766EABC8E5CBCE3D94E1779099B56EBA27F5263DB950C -ECFF97261AC0BF39C4364FDE7BB1CF10DB8C3EF5763BB7976815D78C6F886ECC77F92BB4 -46D284D2948A94FA4E5E59D104858DD3ACEDD4088302B71E6A9DD709D47DF40DA7FF78EA -7A1E226F2C24E73D292B63100F1A6C98548019DE887E739A4DDB4E1D0676967C64723EF0 -F1CEDBA21FF8BA11539BA9F93E55FA54B3DA6B81C50899ADE4EF9369DADE1FA36E2A889A -A3C22215AB36718E57BC68FD115801B35CDCD592DB87FBDD9AB399896E4DF414835FCE3E -EE36D6ED5672E8113B19913958321650C8CCD69DA0D9D7E9C0607715534BA674118C8BB7 -CA7AF1A57328FA73270221F6A2D429D4424F1C13D8CD7C6FDE11B2A119C30EBBEB1DD394 -29B266261E39BDDD5F2446444A9AC581712FCA7B9073E1F4BE450445FC14EA0352D7633D -75C5C5F24DC0C99B888707A6E9DE9927EAAFF533868CC8ABF725EEB94A96699A0821DCEF -BB2A1DFD6D566446CF3CA7C80460C0772C5B7D47BA2D601D3EE74A5855AF4A35649D7DAF -0A87747B37F2B1BC2E13DA21A70EC7D78831B840EE91B89BC147C1A58DBA58FB3749F3CD -1216FF6DE2271EC85C84D07598EF77275ECECBAEC3C99F7686836A8480BA6BCC30B555A4 -0CD5506DEB52F16CC6B4F7FC8B2D8A508FE947505B6C4DE055A188D28FB639553C63D5DE -2FB330ADD822C7206651DC5E0C5259E6F3F489C0D57BCEC574BEB3E8CAD2BD4FAD239B9C -4E6C0F410805E831003F27A569B327A52A5B72446F83813FB2230FB670C2DAA0E36876E8 -82C612BA77B7C486DAB6B41AD9D41A5A8FA66E116F48F8A4573536008C9677D75EA140B2 -C11892F86AD1FC350E49C55069284311885787693154DC010F49927AAB51AD8C816BB00A -216DB9AC0739409ACEE53EFBE5429DC7FFCEB9F54909649F1CA3DAC3B450703DB8A4DD3B -170969E3381FBE10637C9E69A646C1E58EE791FA68E4350FA17BB704AC1C746591B940DE -618B5ECF8FE03DA7E6ECF7F208A004815161E7F680AA7EF1001D6E99526DCC4F9E8F7754 -A56EAF46E1E7CCA21E319FF7E44D531E4BB04B7138E6F6A522B58CCDBBF09EBB18287550 -66CC6E7D2660B9DAEE62164A62E49684BCB64D521F6062904D26D8DB101AE8733777CA16 -B20066E6E88C7BFB3C56156AECC89B449912B0C0F362C949FF0503D9C349003284CAF806 -952AE72AF962F13CAE5A87FDFCCEBB81F154487B260229A9904C44F027C776C4FA9BE776 -DD6D4FE4B8D8C9F52897F843CFD2B14BD3FDE0509659E8065F6790F2C95EC56FCFB366D4 -582422CC5011BDCD3466235BA9212F14F2FA0F377DF05784D75F45E5F863A27879B9BF1F -DDA7916CDA88995E2B52F93A7433CCA2173C1B3AFD83D736D4555A1BCDC83740E9E69A11 -9B5629B03F5A9D18047663D0A6154C4772AFBE9DB5DCC115263D91F95DF2CCA51A4A655B -FB0B99EA0BF628C0FFD5564E882303DE00B69D666F3FE93A2F2358E3BB4BF60B6F89A7F7 -9421015C3B64A82FA30A92D62B0D3564ED96AD8C228A30F4BBAEC782E3A01DF417CF9F5E -8B7BEBB8840BEC912AB7B35BE4EFF43E8891AC25F57DF8AECEFF1840C865A93FD1F6C3E5 -F0E48AFF008F52A23B5F3ED5612823AE23E084A84201F9BAAFA5C1D6670CA499BCD92FA3 -C51C0F5C2262941FFAAD5B4317068E78A1215B8F32E60E77196008D95FBE342426E61DB6 -7DF41434115C10B5E04DABD307EF04426DA652094C53EA304AE96BDD6DAC136E1B0913B4 -6874CECD3F1EC272BC4B5A3264A7C3D8881F2415165383BDAF1DCA39A1C53C3BD45E1665 -16EC26F583D1705592AA862D75CD754B66F0CC89EA5A06351BAB9FEF4A8B592D636C23A0 -7D82581D2E972AF42ECF8CFEFF5168695E998D8A756FBEA0FB03FF2FDBF1A3979767E0E2 -A15F041CF0870AC7105E8A2AF5FBB0E00F212C0430C407278400139624895C0B67AE7649 -207A1EE4A781EE6AF39E8C4A77FD75DB7992CB90D9AC239BED5A56105ADF5E224525B4EB -DE5D43734ED2BBBA28C8CDE0334C9393DF8CCA236FD8E15D5D970900F4DB12C02FA5E2A6 -837C40C097B24942820B116C7693B43F0870BEF05AEB81D73E2CC42E448712D37C22212C -280E111F738B765A74DF533182178E6CE806AAC22F5E270E1CFD406902C45BB6A58DE01A -9D75F874C698BD4A9EE40414A446B6E49C8D198583D4A0B51F8FFE1FB809B8E7EBA85242 -477A9C0AEE9DAA8F7E78A5B73DF068D38CE0A7B36D857862DC2CA4C0FAC20A0B9F7F6BCD -EEE7EC90079B59F46B7A354D1A8D6D4A71DF790E23C4E106EAEC1497DA2B5E36F3EB9E12 -4D049B5E3D92C68D388E1D9D8749E93D2AE063770EE9B9D9491E62223949D60B11AB8C97 -A87C3CD45D13D1B033272698389E80746211AC1E09ED156F7E3AAE2016B178CD4ACAB399 -0C849249133D5C2F855D55A31697C551581953F622621231DBF209EB003D04CFD33BC791 -7AA01C79C2AFCC2308263D0B886A9524FEF38FB01CC278A73A86B06A0467F6A8E57F488E -F20C22BCDDF368A4322F629D81680312B763585EADED366B810A95977066B421D630CAA9 -0A18AE200329931AF4A1F4DFA5830DB32425AB3B36A023ACD186B4F51AA3D021B44ECE3A -042C12DC54CEE0B038DA451724D8DA69CA2ECBC3C9E986263ACB791A659174BC940473FD -03CBD870A2079E225D78D7AA550A3F42FBC2F027F184F54903A1DEED269E6F2CEE48A7E0 -E9DE7018417C65A6DB9CC89A93B1297981530C330F7988161203354F17ED6184EC023C95 -584E45E8E88836C5263398540DCB7EEDDA5299BA8CDFC93E39287F425DB852EAC42A88CF -3145792AC6712403EB9BF1ADA24CC204F9757B4EFFACA94F74E5CB546569F0C21EA5DC63 -6A7C20A40C6FFF3B173D7C64DE1D6E47AAD74AEE3B27FF5E577CF3BABDAAF91BF166FE00 -65B36A224C4E83252D7820667A3D7A1EE57326683285F217FC893C374DE7F859DED7C50F -AD5A30931D50E568A12C43C746018C1C35306EAD324CB66B0F747BD24023CEBC636F21AA -B1A396FF13A2ED3321EA129F72CE2E2B9FA6E00CAB30CD5E8DBA1703962F33E9FB3CFB01 -E91BADEFD13500034B926A667F48ADC59A4CF6D07FD4E7EA96417B25B08FC1F284EF2B3A -D0A720A95E1AEB3834C453ABDB93F78CA55544597E02CFC6D818423FA15D5D7AA96D9EE7 -6FB33A9A708DF038B19E7ECF0E068B627C26E5A3C53DFDC0A9678C8AFC496078056F8902 -05A38FBA09155052F80832357B84CA86F3B9C399410FFED89BCAF4ACD808B6C7BE343571 -DD2E812C5CA964B8933141A33895804CA34F77074785B58913B2CCC2445B0D54F4D326EB -E5D8307C92E0AEBA068341A5A14D3AB5AA38D35C0C020F3AB33608BB9C7C28F7BD1022B1 -5ACAF78740EC7DB4AFA3F8917D5722CED290D5764E7FDEB6B0E9EE78A8E51F4F88FDB506 -87EAB486D0218B9DC1D29FACFB7BE25F4D85C1E8AF20B039E23F1E92C79FB13C7EEFAE44 -6567C47AAAC59487CA15B65D3D14CA2D8AC17A8F3ACD19C7B58C2BBCB22DC2F3DE7FF42C -A6EF389584E4F59CC35D84EF94F3ED5A604DF5CA83035B54817526302662BA6DB7202638 -B4BC47B6E907B0BC3FCF31D06943FF8E04C1344AE04F96583A8FE674A79615A76807E1F0 -FA1EDC93A9538ACBA48C054B4087CEED23E7B4F1750A7629C333102F38001A7A29DFA697 -A3DFAF60BB89908CD78AF393A469E54A41D31CBD35D2BD98E5C04DB8ABD7C6AF6A47F51E -2F9F4DB3CAD40A85C32ACEAD6C196981E16F90541929DFC9BDF8293ADDA1840EC116F3E1 -191AA907CC72F75FF0923BE2862199035CA1CD4C423171118BB8D250B5897EC9C2AB8C88 -D7FBB99AA99D6D194B33A9152E8C1750498EAAD12C4EB45C1604FB747BA3FCE8DA3EA4B9 -6861CAB69A1FD8D04011CDE1807BB405DFC1482CB2ED7D3AAA1F8714CC8163FD8F0B36BD -31AFCAEA934265898AA67B80877BDA58F3E701F78CF052AF02F08D3AA1FCE61EA12D53E7 -022B3824A1B700FDA87D31F3413929CC5D1D287B2B5C91F82D9F6DCBCB599D19B4220E27 -C3AAC4F0999C1723924CD7E9C06AFF56F27054FCD334BD9567217D5BB294CEDBCB77920E -A6FBA60BF77B255E5FBD2BAE7AA22D0AD45C8322A899C45D0B12B3EFEB4444B0CB284019 -33DADF209B797C0F2E77AEB82AE01F09E7897905A43ACB91D64BC3DFFA88A52F8FE2C901 -78A045A48573C28B02782D54B9BF615CB5FDD714342378CDE02AA661A18893B49723A650 -308A721D0D626460AF055C356B3503F6B4CAEA685B1495CF6AE66D14CA45996137D7E173 -7B1ADCC54A6F30E1E270F4507D9B4B10F647320ED3595D6C1B077C8DA047FE03665AE73E -68A82F78EF7C1DE60427BABED7396E6C412E44FC8D98AEA402C00A784D3A3FBC7793AA8C -C87A07101BBF6FA2C3178D93DBCF3E00C95F5C0E2ABEA7158330D7EADDECD7B5EE420BD1 -C4C40016AA88FAD7B44B6DCFD9729B136DD16F7B54470F0FBD3A671A13C5DA0A52258636 -1F2FF96985D9B5B582A1B0E51FF2A2BCB8EBB5018DE067019B6C3DE3A052440D893BE3DD -414D2FA37489D3E34FC6E97FF94D2A2CE6B460498B996D2E21E2EA92E937E68AA000BC8B -9349E5DFDA563D70EE336C181E9B12FCC65C40A2507685E03D2D4EFE013BA6D6B36D5D5F -03E7B0920B195FA23FA98993DBFC8F7DC4B7C6BC72C8280C78C150B99604C93323273001 -6078600837D5B179B1AF3FF5692963612F93A8BED3B2630E9EE9738B5F016B0D42D908F8 -9D67A5555DADA0529F1F0445FDDFB01953E264DD3AD489AC710CBDCADB39A99CFD9A0200 -2CE7F462BA691742EB31B0DBDF6F7F26FCEC9BE173A4D78CB40332EAD8A1793F70598EF7 -CDBEBC02F493DB8C654994F6150B43FB49CBB5E886A515828E25F83C8FE14E782C43E332 -B351A8E68094839AE4BE33E8D026CDCF79995EB0160FC1ED53C1835909A1F51407181A1D -82B529685DD92FE74A21862FEF7B2ED4962A360BA825B08E961380522CC75BAD11FB7F6B -15378AFC8BBE9521854926147E47A08D728CB679330AE15AB75213AE7793450108837607 -F592719EDC0420A2D9CCB8A9BD7D58D9C7E4775B753F2E928588DB470F6A23378968AE20 -380CF35131CA742AE80AB160434F7AA2A88B2FE42F54FBEDE83A99D5DDF22108250113B4 -34B8C3F8E46D57658C37E229B4791CDF9B2E2C5CB26A83F4B71739741EDF475222665072 -EEA39059AE36739F8CE47842BD9CCC13BABCF2888CB5AB13A12E83E3E1D0BB27C879D435 -684482F1ACBCA88855A0BA49E685B8EC66ADE40A153F64DD355CEFE3FA55F78E499A0303 -45CD4B0471B73FDDB5E5F3B7233F6204EEDE30D7DF03617F267636A4276F6EE6D065A405 -03081E2FD97C1738247526B2F1E374665F400980561ACA6BA65076EB0A23F4955268851A -3781AC4CE6687986945A3E0AFAC73DEDB76E2FA23BB33E094DF1FF05602E52A49E1B510B -5562EF0D58E45430AF43EEE073DDF0EC00614C0E2DF121C173E1ECE36B4D87D0FD9D13B2 -75A7C0C8F9B62B5032B77C8909097B3D4B7482A3623DD75BEF4EF27EDCD3E91F628DC448 -4E15D7D633B3415402E48B1B577EFAB6413CB65CBCA453F5EB78E778055798816D895A42 -22EBC77D51C992C56ECDB984D5DD94BFFD01E3EE1082F6D189E3A4D04D6FD2C206235A44 -2578CCBA9CF00D7D2CFC3BDB2D6CAC8AE35DD17F39E0AE8D0A84AA451789BF3C672F7F50 -CDE8F58C4AD3251B124722AC292A11FE426B0B51B2EE4EC7C65103F1128B54820C458E09 -7376F3295D30ACDD561EAD278082B7FDBF592F5261B0BA27A71B8474EC2815A8E62957FC -FEDA68BA3300AEBC9FCC1C5ED4ABFB2B91C08AAB32BBA60A669B9BAF89524FA6B3B63AA4 -6191B699D7DC81F8E21A990BBB3F906D4F93C3CADD734FE6BC866DE02D2EE1D119A71565 -752224235EB79D3668084A41D7CCB27C48595EA82BDED902BBD71818547D4E755DD372A5 -276B2EC7C66F730F79C111AB99493BF93BE7F252EDDF129D8F7B7DE6AB41E9F8861AB866 -51F4D928F6449852F6FDF2B84E2D8341D6E7CF35FFA7CFD875A02F83733D2F8EA7FD2448 -7A575976B07F5BC799DB0925F0D6967E0C18DD80906639AEB86B4098A732C969703C8DB6 -E9F1E849E75FC37714D4A745A08EA4B374CFEEEAB664116D809AC06A8B3FB1DF8F71BC8E -BB5AA0467A728A6446768BC45F128D5EE2596FA35BD65F90DBA5A78B5D02E2FA2EA43FCE -1D2987C8081EC335A63ADA5DE5F6A87020AECCF4ABE0D17D4AFFE79462708D14E3A5820B -BA2663912A5CEFBF01788B0BD19D08CA965E30C9B7FDD2B8156F23AF2653BA4D42E6AEEA -A4A812E561FC68A7316634CBDA855E683AFE67ADB8632345B8718289DA3D1F0B00234049 -08EBC15F22DEB99C37280695EAED4D3EDBC084D9FCE7214B85788B6DD81E5AC6B93B47A0 -4BD833CC79B0AA2D4FCC9707874F3C7149F5F751D1A52F59B014E604984C6B2CCF869B38 -A045E50B957DAA6EEE0A74305705DFF1D7EC14BA595E5EEFBE93903DD31B977525AFBCC5 -7C31113400041DADCB603614F882FD78B88D6931DC3FEDA881B6FE8081110CB885B8EEF4 -58DFD7D303B413024A16D40FBF7792785C2B5DBA567798CE9C99195EF294799EBA4CE802 -3D6B0B1C344C90002AB158D3617EACA713F48AB12C062E8BDD7D7C5EBCA6617547A915DA -48C5497DD8439BC2C304AA1ECB709867EAD1B4E37305A3FFB1A8E9D52462C769CE6928CD -CE5521F6C134C61F08832CD620385D38CDAD88BEB32B997D9C8EEFEA6F17135A47116412 -3EA3E64254752EAA4745350ADA708255901462AC021792ED74770B031C21C58A7F50A32F -ED93D45E5D9DCFC27891989CA4BB010E2DF384657530B1256ECFB2613F7FD59ED67E5288 -048E5994C2EB3DBE5D9E77536B967D7DFCC87376A5075C7CA33B7C36251001F0501137FB -62E0D60F991CE5E3992C3EA4DF89FE2B75048B35B95C5E6EDDC4130FEFF7586C58629AD0 -752666C8A3A1885096FB0ADA14524AAC57E72F66304EDF923F2547D6AFFC0823CB5A8EAC -CC46B4786B46D611FD42D633818CE9A23DED24AA2764AC6AE7884AFD1DE22A63AD5B105B -4042B44E44E8A5ECE975FFB6D14E1BF1924F4EFA0D0DAD4E2CA0F5B1473F6D9A7BFD42CA -966B065D46D3F97056CB9BBA064E62E6A1CE5836BE83371BA46B58BCADA103A2F0E72F68 -E361D46664551B3AD71FDCCC221DE21C3E78C33D597AF3E533EFCD4573E0C2EDE28FEB42 -6D9B7A423ED593E57D7D5FD7C5D97D0B8AA3C1B1F902E89201E28EA19D0D140F8DBB4BD1 -A62309913048A6A82494D26CBBF9DD4456109471043BEC23E4E3D52BC1A33BD7DA7CD67E -D13E738B1FCEAFF839598F54FACEA0EB1F7D3C5419C2BC588B16A1CCF8814C0AEAFE671D -DDB96353D32D1F86191490516C461A4666235CCDC5179B4324B7936E26916DA037699EE1 -622E25173E9E1286306E6034D667CF1510AD4789188F7D0772D2DB127665273683698804 -9B9EB1D8A2689D5C46B5B455492FD96281133AA54945D039BA684A89ADEDA43A9496F996 -EB442E2C020D4EABAC6750E320D8DDC7256BEADCEF54E609B20DF4A6E39CEED8B3D4CA98 -0FF47314CC3A3A3E978C4F8911D5AF92C7A0110902A8F5362DB47F19DBCFFB4789C90A34 -8CFA880D4CB23D284C57072C7880B016C2F4338288D32F641EFF0E1F2D04FBEC6D02C61E -B27A4146B19A5BCE213327C003B1DAC40740AA1E9FB73911F3777FD976F90FC42D91D5DB -7ABB08EB6A5E4D367DAB5B31347A726FE7F04854DBA180019823FDFB4A44479DC0F84952 -8BD0BFC0025117A8D6B36FA9F88A76DC36E4DF00A2E3D2BDC2FFBCFCA12E3F4CED77C1EA -B2AE53A27BE8D1E77A618343F6673CAD03754FC14543BBA5FA50E1D7A8DB2646042879E5 -0D1D259898D91048C8B8B0D421C3FAF3E875D7FA4D7EFA088B657442742D89D0923577C7 -7ACCC9D8319DE2640A2422AB011CC520245A59A1D86CCD5F9D5616A35BA2977AC7686BAA -AFE1A277F407594D6A60D5231EA34761A78C1AAED1A1A6AB100535435C615B8D89C4E078 -829B475470ADDC46331469053DA6B4DAB9F0B0344D97B744BBE1962200DA293864FD2936 -2A6F74DE71CA9A5A1A6E697CD643D33B89A7314A605E54CBE1CF0EC3AE3F11982EC3B0EB -5D9505D4BFC7402D6539038C6D5E0B27620F7FAC514CE55B230F9A7AD528ECBCFDCDCBA4 -AFBB51CBB1F892545F88C9C5AEE7D3B522ED35F53696EFA39D72B734086CF673DB0EC924 -556F1CBE7D12A8232E51F563E848D7C9170A2AB0AA5702DCF43AC2DA03403374BD85E3F0 -CBC2EC8D2A823A8ABFAD7FE39742DC1DA40DD0AA6E5E1CC84B3B80C909C2E6E01659194E -592493C1B1D39EBDA54FE9E501BC06D9F2D5B507B8A6A5A9A56DE260459DF378DB3C5348 -84C391C7BFBB36216286796C176220211850D52596BEDFF1455EB36F869D93F275BC2E02 -07CE5F8E5F07ABE7D6B59E6533462CED7C4288A61A5AA7E206986061233FFF0CCF6EF957 -D9FA5B99FB733BDBB3BA0C66508E483BAA1FD689D51B5175533DE2614ECE76F9BB8C5DE0 -DED71BB2F386E03D51CCAEAF84F0EFB290FCDF2C0219B1EC25CCCC33571E29739D8A0025 -FEDA1849B5EEE32D4DB59456B1CFCA8E8F7108003DBA2A20120DA0D7E3CE40FEA9193615 -2F1EE75A674D8C6624CB60E8A42B218AC9E41EBBB6771DB40D83262877AF2A369A20CF57 -BA61484D323FCFCAC034BBBCD8F92644830578DFA45421988048B1660C823CE8F291E099 -311CF62AE24CA332086F6C9CEE197DA96FD2EB0A8E49D2E7045AE7619916124FF5D85907 -DF15FB7951BE56AC6C10EC2A98AC525012A7A75F39B5A6DA63168608C5D1F8A4188F12B0 -F37049B2E1E70A225DCCE1432B0DC309215BC07A2D68A261664C3394CD4A800E30E77823 -E1D8D98B0002208B09873C0A3E6724B3A1A21C074232C400EFD5D526C213550F826EE84C -3FEAEADF6CCC9E7FEB9A91DE653D1F4CBAECF29E197FE8B9CE2201E39DBABB02299477F4 -791D5CBB3ABBB53077409E1C4D23E7E43B071E523414A00EB50E0A1BA6CA87896C9191EC -C6154FA8483509FCB65DB129EACF38D00481C70D5D4A1FA9A3B2E84B321222E1CEBAF617 -A8E7EDB4DF284FFC1429CDD667C52D8F2D79E97BBDEBFA0EBCD52A54C963797F9940942D -3D4D1E9962C34589D754761089F50A3BFE1F9F51C1F1F67560BBEDFD67680C61337F53D2 -7B2D18B4DE7DA691587FC93909CCC2BA2E853D4590936D3B989502BBBBD9929E370B59F5 -073D7EDA6875A191C5BBB8C0413CFF0444F16685442A6EB0F33EFFB569D3AB77151271B0 -B2C5E7078442F1568B5BEE33BDD450854289BFA1CCD81866AFA983921423678D8C9FB9A6 -D9E77A177CD5434BB12C4615DBC5A21317F9B6775EDE6E44A29AF506F119820B5197BD05 -207E0607F1083F0FA4F1E34E9EEC2AD41DF659EF2473724C7FE34AD74D33B15AC0877234 -224B88851D27BEC30033A417C61798F8C0C35123860ED2569A62BC7B2509CB0DF03E3A49 -9CA57311614D12AED1DC3FB1470726AD11CE5D420F4A94586435E7C18661CFF62BE322D9 -A395002F4DB83E37145BC240CB6E5FDCA11686656EECFB072B3422184AF75C8FAC2B6E7F -33C3BBCBBC8B894A05BE1B75BD64A3CCB485F7359C785C449AC4CA3EBF59496AAA7D0DAD -FF7BF3F8300AC6644BB4C8E7613C5A4C309EE67AF77701CC1DF39B0C01A296309FA6DF84 -3875E1A057BC7E5ECB644240AEC11AA4157F67136831E5449EDB5017C03509B78B35B016 -DB6C9DA02AFAA51337B3E6FC0091904D04B328D1D57F33CA77E5BDBD38AFA74A7444158B -20009EB4A2029AC86EF3076BFA6A97469DF182172D39D9BB16D5F15B526B61FBCA683306 -7097DF4ACCB7CFCABB675161A3EEC657E8A8DA7AB590CBB4EEE9999BD8BD3C2885E3C0DD -52E7850E680F9CC5048FE8B0BBB656CEDC82C07CB9FEF713BE8C5021CA593E445C034796 -B34DC2ACC85FD770DDBB7179F518BAC017B53293A52859A4220DFADC93FBD31F191E2467 -DEB59636682EA309C19F1C5FC8643D9D7BF9A9F928994D15BF645E83B37DDB833F0422FF -6422A9545FE2F0B2D959C8839BDA8F2D76E369AB05F324089853CE660EEFC774D714954F -EBDCD762E9490AB0B5CA9EF9B4DA51665C5CFE10AF8822C0831F80470467CF1F49B88E69 -4C75793F8BD37EEAB798D310F5115C5F5DF6D650D75981132E94140843F8440739AD7543 -82B6A4109CD818116DA0FAD8E0FB22903897A1D4C49284411F0BF018E880AEA118322543 -098F74BCA2C1EA19B2FED0C0D1D74329F4F23027D75C304C2BDC5355D5B5424F000090CE -EF554020B76DFF1EBF9EB929AC89CD76CD5D0E784207743F1C8C0B2275EF960766295992 -5C97D6D4EDFE071B4AFA15C5D9EB72A67C1FB72FC634337D827603AA7C37E62EB623F5C4 -5E23AB693ED30B6736149463A8A01AB28A087F8C80ABEDF20358899FC34F1B587B017B30 -99E8AA24D9054F66E79DDEC2AC82FBB0115923D68239EF1CCA2CE89E935EEE0C451301EE -075EE992B3183D0E149A65A12AC23DF90D4B05E79F8A0120123D972B919EC7DCA6F00711 -FAC4F842BE2B8384137E5858EC111C33348E85EBBC6C176169969F30841CE85A381EE1A5 -BAF76C017C559D955FCF8FF05A5CDB40E91AC7BD74CDCB519DCC657F3F3F54DCD402CF96 -FBB2C1EFAA5757CDEF80BC6575CE488E2DC246AE31A3E9634DF5337FAAE9259DEBB8C64B -5F190C04BED5616CADBA4C014A6290BA5D70D2619724A960D60989F52B79C09433DF6715 -54167E161E4A1455A02846FBD422E4270D03841B3B5888FB8399C1F9645B870ABD3F9199 -B8D81BEF3316A3004D07B378962BCB2A0D6531A948B59B7C46DECD179FD73C95D5EF6390 -A105F0B15BB743B0B7D0A23EB7F9065637B717840FB9A2F7FB7C5DB79DD08DD7E024BBDA -9453FCF5AE11747C590480EE6003F5330860DCB1219FA7458846C8F25B816BB245D50901 -F892E2489F34259C300EDD02B616FE650D5514AD5734B77C7BED0DC3E495C418B6A9EC0B -EC39E783C913F71D96E9B0A476CF3F2D0253F90BE85D186A823453B109C79AB859726BDF -85236314120C93F4D44B55EB5A0C11A2D4602149DC836A2F41AA9F096F4082E3B199BD2C -AA2653AE68087AA655B4113CBF54998BF44C8837E6DC8FDD599160C1B191C2B18AF7EDBC -2BCC5CEAD0E765C856E0A39E8E904A821DA88AB030ECBAF39CEB016FD34BCF6049F558B3 -EEE3C1EA53B87E7BC2CD8455209A708590ECBB9566A78262C6268FB2180C3C4825267A3F -BCAC25E204D05417C85E4C46BE30E4FC876D461967483D9ECC839024333A235C05E61545 -E52220B3E3CE601C4480A959F032244A1CF4204A36CA332EC0258A916D0E68B043F30949 -0DDBB75B000DDB359B315FC9BBDE10A42A3A7D6D506B21D1B48254F84FCA27774A98E249 -FCFCE9E96B7EB51D85A671987AD1F3B35C755667B64DA70EFAF67CE8B14A866AE04CA6E7 -EED0905E5FD17B98D75F91279E033C5FAE681AE10A17C818E79204D6AF3925D70AC627B3 -6B81D9D8D75232F308BE848BB67A87A561821201C796FDF6F39B031F5049490AE19E8DBE -A908EA44E378232A09032D368F1C22E1E7984FA82E14FE340911E786105AC959A5A52534 -C585F1A85C5DE7F78CDC5B43546C8CA3629906BC586B11DDDF157CF1031B182BA3D335A7 -A779F56FC0C037C2948DFD410B53FCDA94E73B53BB76C71B132405ECD8F0B4AB5262BA72 -230B7420F4E03F7BDA0162F59938DBE1220B5CEB12FF83C7C9606A67078C95075D827631 -1ACC893D484D548A52A547C96A30AE7A3B30FB715770CA5861556BEE0E9D8E837D385C7A -40D24B46DBB4A23A24ED5844F5ED69D58CFE897C8FB9555D41578C97234763E41E1E3062 -185FADD8A80EB9BF519D1A21C1EF6ED7D16F42F5F083046A63711E79E2B4646EFC2E656E -55355D7D3E6411B465B535043F9A6A57601D15F4B24D1AF71EB93A0C7C07C85FFC32871C -1DAF85DA374524B0554E196A18A149870C508BDC9FE22CEF54BEEDBC1820BF4B7DEFECA9 -062F3ADC6E93E560F7D37EF6AE086BFA66D02D82C8454FC5CEB362007AB53947B2A14059 -E449E45A379008271758E200F71807B3664771BFB9C46668BBE1A35AD7B208C9AE0CD84F -8ACFCCDEF782E5E6D3B21F236F004B41E7E6FDA292970F74127259DD470368EE2C17E7F3 -215DBF172A740F42F74BC74C8A5469974446122D11741EFE5CA3AC65D03154E425C85F6C -525B3CC38005CC7999643144C6BF34EE658BF922456FB08DA18CAF92332BA728EC95FAF5 -8BFF30FF9F1FF2BF14009A5E6B9536F6C5DF9CDA8C2F34842C8EC1FD510F878F1D3605F3 -47B6C95921C8700AFF9E75B7E2B404D13BF906CACB3A1B0529A3168C31C96ACC12723A00 -455229C1BAFE2DC474FC46E969F6A07CBC2D4C3D9C8C81D9BFD84A95756451670D128EBA -ED2CEF998B03950827D203804F46DD1F1CEBA6110E29A93DDD2C38E8D02769A9523842C8 -533F6EE2CA11FD585EA4FB551DED51FAC17FD30E0BAAC02D6206159911CA2BCB19CADDAA -4FA6F2911442CBE8A69FA4CF3CC4792CADFF5FB70D1A8441046F0103A36CDC7B8F82C115 -DDA815EF71DC8295D8BEE1D412DB942B2619D67A5C1F8B06DCC13BEDEC191D9E818E722B -ADE04C6C358A27D1EC9B5C0C198B9B235EB6DAE815C0561A8C29526AD3212B32A3D4FA35 -831008C5A9AD3B9A8D68903021B9513619868E2F8535DB856AFACC031B890ADE468A9903 -B716040C73E77CC57813869E1AD1FC706BC34DF7477FDFE9A0C21AD33C78AE789D829935 -51CF312B811250B8F6244A098EAABCB3A6EE2DCF7209F04AC039A4EF35867AF00F01657E -B517482EA86295127A388A8BF4B605ED4E13F03B2A3839990ACEF98156084F5BB2206344 -5941C560132D0349D52CB72C85B983DF6391B885C5C6048D5F74FBBF496C70FE021AA578 -280053474B6C1F9AEC55F6DA9DCCF3CAC7A7DEC6F743A81FA0DCF7621B484589330E3201 -8A1B7257F719BBD0161EC4ACAB731F2026B77298EFA4104EDBA6B299858184FD1D4C907D -B3A6D0192F8C7DF66D3B0C947AF0F91F7CB09320BC0D0B11CC026162450096809A8D1E8F -01A09E2D3C64E6C91E2B31AEC3F1607381714BAF0D00240FE58264BCFFDA303E87296DFF -1BF630DCF9AF3BDB5ECA30991897AED39EC4CF40070109746FBE9D6E5A24F70D8B2D050E -B63D55AC6D18153F3D5D04E10B704A2B47E7555627A84F394B3FFFB6AB7363A9DBBD11D9 -323050BE1C294A586CCBC043FF952C34582F4D4F8A9F6E71A246B47B7B87AFA9BDA0ACA3 -CC3ED5129B810A98883B1A449E5834344BCF7C09117052EC619C8512DDFC81A68CB6D179 -CB3D6F3BE24A1F29669B7C666A9A0C6148E54BAE665515F5490639C66BA808E40B615EBF -5B59D3CDEEA96951927E406F696745250F0A5A8B8850C3A3AA7F59CC3F18F3FC141DDECE -33CB43777CB6359B9015B27CCA83BB4EDA646BEBBEB1FE0BCD0E1114C0F983918DFF74B5 -57B7A614EC0FDB3D1FA926CC76D3B6F0527BADACC1C302DC6D4019E89EF7DD3195494638 -794543E29846DCA17B1724C3B2C09172B9402437E747F22F1C959AFD01C092E87ECC0CEF -C7C422538164E8E551775CB7660B90009EF7C910845385B97FFC2DD5E8DC1DD3C0B2128E -9553A042C74308F74DC7F04CA995F9B9870AD1E8F89382E9E9DE8600936F1E2180D59B2C -B8A3536BD7F2C47142C756D26411B6E5E34B03C49CFE87398C7334C786B729DA1F36028D -DD5A16009B6BCCA2DD6737C7C4C3CE7004B488B86507D095B567868A6ED59964EA34095A -DFE44C9FEB502977A1369EDBFBEDE949CF421C576859E181AE2CEABCE6C35A88F5050345 -FBAEE8E1FCD98F6DE17E66DAF5D5929046C074E8D85C4AFDC71367857E8A7B1AC3E526F1 -8B7DF5E90F2DCA4007344D0EE044E663D50BF80300A3F1F1DB03B14DF2CDA7A367F91A5D -AC834BE8E057EDCE5274252AB3FFC1D1DE90857EED51040A2FD881583184CDD2CDF4D629 -B907353B9F878AF4E46FD64C85360927664DAEB7371EEB887F5AEC4F76C6700824FC8E05 -53A785DE724528E12C1FA1A8D32059EAA3A99E6D481665DA762E6325A4310222D7DF3918 -E96FFB85B3C04D9E7CF4F3328FBC31F736E93559EEC6D60A878990E8108012A2785233E8 -2E57C735254C7B38E16C6C7E7179246054583C7299050C31496993555A1243826532B139 -71188CC8580B73C43CBFD1E8F23369F56EAE15FB0FA461BB771026722695A8F4C6BFFA3D -76BD2E85D3BBCF1F7F53D23639E39754A4D71B48F1A8C8A18C2004A05EBA0656E3E9884F -9FCC00D55514EE382FEDB40BA636BA174FE950F2B0BEBB9C926E77ED32B08ECB1F4D4499 -02387444393D3A97BD81109E56701374F13CC9774778ED60E3EAE3C78BB6E0B7ACC43B0E -5F29F3DF4610E97F86D7DE9CE585E2BC144E1193C123BDDBCFF83336625ADD90F1DEBBF9 -74CE0797BD5369D2E3C448BEF8AC728723EBF987B4F1CCCA1B3FF3C0CF8F0287E3F5430D -BC67542E10C560A28AB12B3513C1120D8975A6EE71DE0175AD8FB16C3DCE4B265DED2815 -F03C7FDD72E34A27215870758DB124A5D630723BAE250535FF92FFADB0ADA3C4D31D007F -562836EB114CB81FFE1E9F54756A3D1A8E3CE7DA8EAC4036555B6583937F6307017392F0 -FA28BE83A6C4AC9183B899DE736F86D05A91CCC5545B7AA2694841AA98ECC5712A76011C -9637D079BCD5295AE2999EC5C032F7ABEC0804E2A2510303EE071A9777E89E32804C51F6 -1458AF5736CFE2DCC50564CF3EFB629FDA6C39CCDBC5417AEAEDD0509A025B43A682B218 -8AD0D62B96ADD583B027B85C532A1F1C2CBDCCA5FD54A3ABA6EBEE74F2568BD9AC0E19BE -26C1C2436C4FF76B4F50F05A37A1A73A02D155C2DB4A849082AFDB1284F9566407CBF976 -F2D7C124BB538A0B26898CC818BFD9D34D41DA06677516C8D78B6C801B864DE2B7830E1F -868F33DA7E549639ACF55183CAEDFDEA0664AD59BBAF56FAE34AD40EAA21F539F916E41D -690419E36D2C268B7F72B86BE962AC175BED26F6411B70A92CCB9D7A27FF88929F0D13DA -90CC5948B6411F7B04586E283389D530C85CACF958D145C88A34E03781617B40171D3187 -430BB6102B6F1B2C9DE91D2D7BC2A8D5770736B9402415C966FF73EB321FE99505100C1E -47433619A68E08EBC593B85B638EFF1C484BAC03B045BE97A0E8AB48C929F3E801A3D057 -6415902C739C6F92B15E8AF8DA0DEC3450DF6AF7522ED6F316439B8C6FEF58F96BC9C096 -C6E5C9FA97C1524F6F4B84D614EA7B2217B7DFCA1AE90496066A04DDBBBEB49965526701 -3A7513B3453AD0543D475A82C2CDABEFBF7EE5FE95DF01DD6EB4E2F5B36E5AD98A5CB658 -87327AB12AB875E4D9D7CFD34C4F02325EC3E37553B4EE12DD5CE535B2F6C7651DC26A62 -CAED8B3A97A143029F3EF41678CAC2E5F2CC6EE9BD567FF58F32435045214B62BFB112F7 -14FD95F9BBB4F3B3FB620429E12CD2C52C55E483CCEEA72D524C4CF1D91E80F27ACAF36B -5BC7D386BFCF9D70D3CC730D5D2C9C75BAAEA9EE1FF093321AF65CCC73B6BA6F977249F6 -746D69E200645A4E40EAE0986FF0CF3F1B5572BF9536DCEA02B6925801D1C466129D45A2 -E927BDBF6D6F84C3548C78E70DAE806CAD180FC468F979685F845BB2311524539B1C7ACC -C9EF641183A100AB51C155E89961090E2349C601C6769CAC3B1C2537BE0CFD560B9B2369 -4E1B8E9083DF9261B17EF6475C0A42466B4DBC8C601CD82D6236729CB8C80FCB57E7AFA5 -D9D9B35F66E5B29251086BB760BE94831670D955DC8288817A9DBCF7A6ED48038596CD76 -BB2FA5541EF78AF5CE421CCFB286624BF3C98829323A7EE8CDDA3C5DE22044672C8D233A -C08521CA69962135FDDC8EA4139BCB13B64EC0DEA02C437BF522F41A8768ECC542D5EA8A -9F85417B598931410BC08259AF88E410B695A9A6EBD730853F2FDFE3FB00875F21E1EF5F -60D8D8F62E643A6F4D124FD84FD72FD21DCE57144CBEE5EED9C05796B3F59338903913F0 -CA0B073B074A44B1E1951353EE514CB41BF3D50DCFF683CD15836226EE9E73F55D4078F6 -5E3A288CF7F124ED183DDF2C0EDCA6C375160756DC3DC33757CBE85822FB2ADC859CA8CF -7CEAB1DF3A48E751A6604C3E4E53A9C9CB967813C3181D7E4C1DC954A26EA4B28E23E39D -C2564845970739B40AC5B267B4CC07C90E289EC9288AD379A7B684B97BFDB45F036BA95B -EEBB25A5BBFD3F0EFEE2ECDEEFADBEFE80BF2A8C01BA345B29DFA9B25B2D2234F358BB99 -2054FBDB728192CB5EAB19319257140E95B8F31E14BE579364136543A847989F4E410786 -A0A068E38A439250C3D61EBECB1AC741D529A5A74A546FF7BC9F2CEEB11CB98F4FA97BDA -C74A7EC4DE3948859D3091CE7D8992D2C094590B0AF2038429E30A6BF3C7533A900A4240 -E082BC40535E8A07E55E6FACA93FDCF4BE35823B30A2810DC991AEFE4320F927105101D8 -48A790904C823CBE8286DBC1D8E7CC50B1E5931640FBD0213B0FEB7AF7AC38CCC6B738CA -74B1FE58BF8B559A7D3AF0D2ABEF706671A977E737B5E49C4BBBE7B412FC8512C17661A8 -9827E24623F4428598A65FC5A79E77736EE2506E5A61DC3ED221F412AEF9FB3AFF6A79F2 -EF15CE24C810321A72FC6705FCFE24032801E3F61EC145D6A82C43DB8E5F9D20AE3FD7A6 -72477CEA2B6D04C24804AA1597A4A3E0B7E3E15D307D8A13D4311F4EA895199D208B23EF -DB35D975CA9D6D9A036F27FE597C41804A8B5EE10EBD4C16DD09C6228988A780CB315C53 -C2455FFAAB2D71FF87E67EE35A65AB2B8BCC351DCCD62BE2DC199B3574FCEDAD5809517B -8E3BB1B197078CD7F691B4D0474EA1F398AE3AF07263E8BD0842B8012EBE5F51CD5FF11C -35CBA2B275CAFC8D0B3D4FAD5B0931C03A3E0F79F31EED87ED8AE3C4F628FE1A1F2205B1 -55BAC7504D754C58BDC458A4B24F8A4E1401AD5B66E3547DCF9409C1C811CC2DF862062C -74A773A5B7686504B4C7396230D5F2F0A2BE098245EBA1758F20E0E5FE2C94E899AFB774 -4F29CF4D61334CDDD7C38BF479B0CC3DA8E67FB6D3150523C09A24286D86A9F4E1F5C2DC -CB18719F6087FD27EB5BBD9BEDE21B10C26BC38CD98952A128F4CF48F8651B97F6244F23 -E61EE0FBCB5D3BFD9C2E14792920066CA5E70449C4F13057DFD33A11B71C7991D29A7185 -CBDDFEDA7CFB85ABDB7F854F4342EA020DB708556762994759BBAD1E9F83E7F2961B017C -4EB56B73B37F019A8B91DF3EFEAEF75E016457A70AA33D31C9BCA76BA4B805646F8264A4 -6C15C2470F4903A99B0D0BF9B7B7D384F640FAE3DF6AC2ECB533DF89838B258D8128F5C9 -1DB7350B9BDF201455D5AAC7C08F39B643D8CCF26AF3563DBA05B5AE422388644CEC7ED2 -3EADA9060442A728F966D50989C477BD2E4BD4E206C8B014D2707DA596661CD7035B526B -61CBD0FE916D0D7B4B22ABD91B4902C44187E74D71647F7143FAC8E4E9907DBAFE15215B -6F20B82E09B29630E5F1CD15268481847192856F1BB23A00D7E6522090B3672286DCA1E3 -D2DE32FFC4C978F61180D497D9DF1C1CD48B1857CBD40EA172DA1438862A7A28F570B5B1 -73B53E1E81C6EC11A269001C6E6070CDD0156DE95E320F3B496036C1136F15EE35D79F2C -962280292A3678BC4DE5D1C2535F09571A5EFF5379BA71C9996B7003F27BE9C810C68D9E -8D55287AD3D1B570C57CCAFB53109C3EB5674920E6FE3AD170F783B1AF3BAC0BA5CA1598 -6218777F4EE1FD7738963D6DE1D8E1BF1353D5D96DE89C2DE3AD2015265D9077AEA8F26A -9A391A61A27CB0F9E8CE16A12D1C2128E8CB7AE0E861E3CB56769A07E812F1169A283C65 -A22F19881485367B098EF3B97BB9E41775BBE13F4E1560F2AA0FEBE4A31118F55142E590 -B51D5A0867B89F00D9D461D74DACADA920DB5452D80982761B357AFD2F613113854673B1 -3F0F1EAA566427323E2B35F2FED6339DC28170D90EF4F8E4E77506115BFB2FC891AAFAA6 -59611E9FC6F5384DC5096D54E09567BA8379C7D058CE8A3E203EA28DB122519E483A46D5 -F527919C4AA0F635F6F29C4AC9363EA96B0802002BD547E0C248AEFB8DAA0A75DAE5B8B2 -7C7B4716769521B4F3A8B68B0251CA46BA9B7FCD00B3D4A59002B249860669961FE8F4B6 -B594B68D781B24DEE41869F320C0CA419B596F3AE725B4089A388AC4F84A201392C1AE79 -D6AD6F13023E6412BF29DFBF33F00D8966E8C87FB883F97B1430DDD9EE0D0E8ECE00DACC -CDDE43F90351DC64D38EB3013CFCAC2792F613EB56CCF8553C3D9A4B2E9544058BCA3B86 -6F2E33A68CB60097D017252DF367F584DD224D38163B6BB1F5E8154C9590B8E3425FD89F -4575B5150F2C674CE5421E4930766BE7A55D1A01044D2FDA079E1E5CAD18F5F0B7897741 -EE1F4FAD109E503F44526746BB3B5C803047AAB46B1D2CE31F3E026853F52528C3CF6BBB -6BD36DFB524170B10BC85C070459CDD84D25C0EC712B5E8C8D1E6A736993351DA8261CA2 -81F4013542CB6BF8168AE8F04C55BD7EBFAE0EA6C3B45CD9698C7CD576793A1007E2B391 -0310CC96F4D2C5C0565CFF92468AAD585185BF6A19CA9D27D6E1440CD56CA0AD46F4D1DF -0DAD5F2A2C1D2B1ADD80030E38080DC4CCD773B7E7A74EE7F9A964BFAD960B2542E6EFB4 -64FFA0ED1C8828B8C266897C0F7AED40851746A573DBF08F602BCF9E1B339BE24BF35D0F -AE254E6D6170A224FB5225D8859F5C440F96359783D21940DE8553275485D0287DC71919 -A3D81FA8D8167DDA0F42E1CB15A19D673B896729B2A492531E9FB8811837318C24546170 -9F428D0E7B0A6C416FCA1B5B8849B86EB6ACB1B901E2D90E0939F3856934894315E3BDB8 -1DEEFF69B45C8C7871E73E6A20B64362FECA450D8BEA3878AAA0676BC8F9DFF37AFECA0C -C1096900829EF7DE769DCFA7FF9DF38C9C313829A5B9A7FF7707BC554F1B4FE54214371C -6681D624954BBBB90BA5AAA44175DC50C6BF1E8A618471C3D1D58471F2567084E503EFF8 -F4083B75F03B7848069ED9AD01AF51BC5A9C3F34E0EF36FFDD3D3DB350740A56231E8323 -60E8327F218D6E7F2490258F03B904CBC4763871F37E1B8C88D592876E0648184954B702 -CA5FF4851485BE6501DE9AF291D2D4A55CE425E405833285358EFB271ECA61CB37942EC9 -9D53EED6939D6E828C6B2E013E0ECE1A60736726F77775C299D6784E51B1863D304A9069 -F217C825FF94E4982C8B3CC30242232FA59A8274011712957B3F1DDF558CAF79DE460A9F -B15A2D1A3999EBCB3501BE97E719138CBFB37242A4883B3300E20CD21EDBBE0F0D8EDE3A -D6940338657BE43C6C04EA6C48BD51CE3D064B55EFC5DD632E1084BD01ADDF53C114D329 -438792E470EFAEEA5DFD2FC40553C736BF612A8AB8B0FFE6F16DE99FCA0A0B5026B2A50C -C15F0886047EBA1F115984B30050C579C1CA97D31BF4167448D89B3BC66EB4A099E4DE4A -89F186334430655C7A2709930DCF66404322FE8C1AEB3C7952A4DD19CB35C3F50802FD7E -E82D233FAE8EE5377A6211C0D55E5C188CC858D2A38990ED8B2E804FFD60DA6C477D90DE -24A93AE87BBA8558770C427EE99A8623F26EA053C077837CB691CD6BA6A22EE8C584594F -B5A8F2C75D5ADF7EBD927BD53B6F5809A0D6088C094EE056EAB006CB8C4BB2C035D57A55 -57C3BB319E4F0F9BA89129924EB53F7D349C0435A1ACFAABBFF97E9FEF3DB3DF03C21E47 -C5FBC852A8DD098CEA2C335CCDA04F2D2C9E7E38A327C7D78CCA84B96C432EA51C9A3CE2 -37BDEED3EA86D69716E5D60DAA77F31CADE9BB9FA1CFFB8A3A293A5B3FF9FEF03CF96BB7 -F259C3FC6EFC422FC55673819F3F4272A675B2ABCF8A4DB411090346889715D49FB199B9 -6AC6C2981257EA9211FA518AA5E582E35E0034AC42F607F587787EF3A6EA75C1C396FC99 -331D4DE3A906906D334CE8DCACAD9D6880B84BE0068ED1F365B9E7DF9D35E79412BAA94A -BDF0274B01E64B865E7D4532CD08516C8649BCFD7EE65685B27BD947156ECBBB358C110A -5D5767808E8D924F31464FD3BFBEB53FDE41411840C1B689963B2A5781467C9E44E681C3 -5CB292DFF210C75FB4014107B364F2D3B8D3394AFC8B14BA28585E1238DCD8395E05852F -C813E23F7A278E72C7463995EAB78999388E9F093C84F3FE3A164FACC9A0890FBE7CEAFB -0C988CC963B228D9939928E886095F772F12F8B05F4D66ABD8F3332BF5426002B905A049 -886BD5D9EBA35960612E1DFFC74FB5479E37A19A17BCB600E200FBD9437F1FF156028386 -FA46C79694EF0EDF059E63EEB766646DFFBF7385C0893EA15B3A1C982C051C49F4AF465C -A9E6E837C463F580B883A93C1E8BDD68EFE50FE6616A831DF101F184D2ACB6112A10720C -6D173FA6E5C494A271FE20AB7959234BA355301BF8276B34BD198A6F6415C094936BB323 -322CD5957A5BDF76EEC4EBAD015276DEF92868B49CA04FAB36BF6670CA237B4530BF5DE0 -B5774A3E67AAE1EFC2653CF7ACE86FDEB7C8D78B29D1B92170D47EAD57AC140DCB44DC34 -AF59FEBC88B667842227BAE500E6A1DBEBAB7750429B00703863C2D3B3BD0420D3660EBD -6C14592216F03A404E4E46458A9370BE3A92618924313DE6453AED7361D34CFB4369C789 -770D33E94993EDD582C6140423189EAF3CDD7A672D0DD00207B86A4D8FACE9976D83D81E -CECF00CE22D20B441038D424E3958FFFB7FF68D6214BFDA59085FA022DBA5C94071A3F72 -1221CE61C19B19542C3321030BF5CE4D8022B49573793EB824E9CB243D0E9EB6B89A34DC -744450FCDD335E607B45DDF26A57C7DBF83A8C0136ED272D908A0A469C9E61F3CE9EA255 -3D81B9E0B98F323928B0F44D62FF942276A4BF297FE225EDAE82A20680A011229F58DEA6 -9FCE234B22B2AEC35A208E23EC809A5F790F09E11FD738CF62168B1BC2F7DA9564B8D576 -11AAE9CA0094FBAA861B6114A66A4692291D5F4EDF5E230CA8E6526C55B62C8FCD46D435 -6407C7082BCA46845FB9A2865EE0CE8F860278152F0A849BDB8B85E481132797F49DD35B -247BBE4369FCB4A20FF77D6F791568CFD158CC1319F17868CEF028224D2AF3243EC6740C -93FE35E7372CF7E68F06DECC8160B7C04F7086F4A4FA66DB58100D6513000C4CC90BB363 -6BC1B6ADE24EA559EE3245CB74502FE440D7ED58AE19B182E0EB645D7BCC5D8CF1EC26BF -D8BAA713B6215595BF42FC097D5DAB7C030C522A694E027CF558BA7EBD711EA18249BDC3 -DF346537E5FF50755BF03D38A338EDF1974B21FD6E75548FB8E2CACD173F40EB5A9F15B2 -FFC720F0190ACEE2B6E5B040F7B89AB214DD89E1E8AA859BF436EE19C5DE800ABBEA049C -9B6FA77C93A833C02A11CE4E502D174403B582F617D388CD71407FA8C7060B9F3AE414B6 -63F4B524051CAEEFE1C919346B60DD19E9FEC14191B72DC49CF0FA248E568F6AD137EC5F -73BC3F3F79CFF305D88447E05B4BC7B25D20B5916787EB38D2BBA64411FE911BAF1C69F0 -FECE979BA0267D3A297E80FE07FB6F6330C3D4E9777C095B74DB138EA9BE483655FDC269 -A8759203B594DB7C9F6AB5909651C4A27B18E51CE5F695C2ACEE18DA6AE89A3BCFF95D65 -365BF11C14A5FB2BD261CF6ABA383FC467C81FFFD366672895BA37633C3A89739B397604 -0734CF9218B3710863906ED0002D0E756F66DDA0B38F40882E388DDAF61AA9EBCC87B0DB -E04F06F6CD3CA3F24EBC695C1CA0DFDE7DDA8864EDA643FB93E0AD976D5C1F36F65E7A0B -2B1767B0C302AC325B83FB1BB658381C387FBA199CD1C3EC7602CF0E19C96C10890DCEC5 -6166BD141F3061BB7A0654BEDC8DB922337942873A2F6E8E11FC291F8C16AF1A0C8221E9 -62106D02C4F575F4A9F61287E4C20D948E9E4CC7E74B99776EF3A27A0C2ADF127E60174E -4BFEA136B745DCA205A07EFBA484F7E0F76E5FA389DBEDDE4557C73C6B8BD6CFE9D0EF6E -E197EB8A5EB0468F5A80F6E71F9D65382067B3216C740744E671A533F046B48D61845500 -488CF8202A1E91176F97E50970BC00D58CFC9B1BAEC3435DE567CC6B5C601ED7BD437C25 -86E02997F7AFE95F1AD71CCEC4E9C2B9D8D17BDCB66A128122AC0E0CA37CE810AEBB216D -C4AB46AE69CB2AA97CAC99C1C6A5B112A1BC553658BFA93E931B4F28ECC6C0C43E18FCDA -5972FCB8882A86CA41349630542DAF536846B01DD5ADCC84FA4AE1CC58EC5B325C4EFFD4 -E32EC77120141D233E5C02CF7A52399AF39D64F4B9000B881F13070D85E8DB91DBD38A42 -08D5C6D8ED42A48272851DE276E5ACF698E6088343F852E0B139E724BBAE48A44EDD7A63 -B5772F61E178C2CBC38F728DC708FD792737E5A495FAA3335133C45CC887FCC94889DB5E -2DD34C1DC8B2901EF49320B2B8E7708A778A54A540CDF310ECAFE13653DAA2D6C9CAAA00 -7AAAC4D9CBD01F61F0E1D8F35C06019B1D6CCCEC5CD9A1A263CA630C8C14EC325F8E5718 -D4CC035FE652C2A2DCC53B7EB5AB33B43C7D1EDACA8F589C5966BD92DF8B62D56523BD33 -501CBFE506B9061B096C184C5504A61CD6B5E03A8338F5B16ECB0324A8785DF1EE193710 -B76D5301448B0C664F565ED0538257FCFBCB051683FC200D4AD675FC4CABAACBEF11BC38 -E95F474AF3FA7FB187E5876B1F04A26DAD7904E39F3D53A1D5FED70E523867C3E1A5B65D -BE0B1D6CA84EDEF3D0A24D042CA491D6BC39647EF390BA25E2F998ACE7386F8424E3E03D -6EAA815E717F835E3528069BC3A65CE58FDC49B602E0418A3972D9E5F6192AF89397AED8 -32CB25A607DDE31B69FB61164EA5633C019B3E4BC93078739879A2364CF42633C07D1BE2 -57AF2B07A1E5ED68B06BFB81CAC77F6D2EA4750266E8919E8911391688D4EADAB19B3E54 -4460DA693474250CA9A864C17B7BB5059C0D08B32400A51339C4ED7385D9C1DD1839D96C -8C0A6BE1CECD38544854E9698401E33EBF50C1DAAD1652D0EB978D8025D86E07C3DD64FC -92D362A13E173F1A5D015A43AC3CB57732C6A2A204B990635B607938D99422B450E54B7B -4CF6D22BE2F6B9E936611A0132538CD1D8AF62A260501B3696EFBB0EE006F658EFD8AFB4 -19C3C8957B3D9DA5F8758CCBD17734D80E2E207A58E8E97B2B9B78012FAA2C73CBE0061B -EB3F30CC034F7FE5D3251DA71BD8372BCC7F271B5DDF11167AB166C59F63B9923F043611 -52240DAC4CE6B15DD8FF9ED6F74FAB00A4D2D9F89BED255126AEC97ABE2D0C7D3947907B -0AF2FF6A641A43BFDE3126F54E213C03C54E01BE7DBA01F71E523FCAA4C02970BAFC51DE -EA7A8530D73D62B5F3F457AFB500C5734AF579603D2CAB9AE49281EED2CC8FF7101B4F45 -F619FE5FD48A83D934F6A0D394B07B1235AC8FA8F3DC3CCD9479D87398074DA6AFC3402F -21B31DE8621AAD29EFD4F9CAF0A9FA9D9A0D097625412B4FD723E1363E5729F40D8C02DF -8D222A48C23B2E25CDF4F69D283E006E0679F1BD904A9075FB0A8094C1BBC3400A2BEE5F -736CDCFE47991E539406DFC399BD0B76D3A5C8F91BC2BCD841E4AFBB521D46B8E0558F4F -A800637D47167FD2EF79F5251095FFA2F3BDB915015010FA689E4E87F921298735A30EAD -938B6BA40D4E58042A3065AB059C598A96DEE3AF09237FE8A6BE9CEF014AF36D91508C93 -F7A18393BC321C3A4110B160261477F6D9B6771DC8738D8259BC4FF1F2C1A657638CF4F5 -08AA9400D4AEF4ED4508BB30F35E38D968E008230DFE501A9612966F7E35B6D8DF26338D -B63BD1B88885992D8D3BC7EFCCD89622689192CF14C328C4E4DED3025E56F3E73FE2472A -144AF139106A197E00EDC57C2443686A234D214FEE4AA2E3EF978444D4A2BD1373423CE4 -E5F82099974FE66D53972F774F2BCE9003538CC59003D0DDAF9889FBF2519EA31F3A515F -8D2C0091937DCAD3FC757E18FBA1C37F8FCC69685E95932B3DE60F80837EAE690DCE306A -EB060698E560BD148CCCB42240665ABD523CB02FE18214AE45C44756E9D3A8183DED7506 -E560EDB4D43E3971712C3D23714B0F83D3BF19C7320FFEFD07E9E8CC573D97FED37FD3DA -5EE98331C70CEFDB6F6564D8EA0B985F1206239822A4644CF2D7ECDC63FC5D2014359891 -5916E41FB338545CECC1B9E37DBEFCED4A55DB485C86C56EA97DA572A2B74D2650C8C839 -1C57A1FC4F75913C8446846F26614E8C72080DE0FBC3FCF92864DF37F8A3C66109AA56BB -3CDD02BF5330C38BD39B081AFE90F775FA6C78BBFC51DC0FF37B9CAB4058888CB3D4DB26 -40D7224C0DBF9467C720CBB5F684B2A1CA8951B29182A3913EE398B8E77CB27868A439CF -9DD03BAA0B60DEF70FF776096D86E71394968B7D64CE289373BFC8BB2CC0BDF78E1178E3 -D6F5473427E7AB841223F963FBB2A5743A823367D9AC4A5ACD8BA483F5BB5AEA19B1E882 -670B74FF997E3321BE8A96D7C0435EB77A36F7AD6AD0C7B21F5C74895090908FCDDFA655 -628898D8FD6218A60C301D959265B430369C564E01CDCB05F42B520625FC0FA93F9736AC -7D5ABC70D1A25F6A6A95C1CF4A584B51E9CA9FBFC9F24EC4F2257B2AEBBD9581438668A9 -F84CE7E9919C84227D76B11B1BFB61788C69603F0106CE5FA226129EBAC295709495748D -7E1856EF2F1D5F19458B977506F64AA7E433E4E62662F10FFF43701F2A726C3F8CEB19CF -D467C3B4E835A99941C7E46101CE2C97683A17530F32808DE665326D6605984689241CD4 -5DDDBB5C964F3FCF7FD89D8B580D941B856613EB1A8E59052B296E8CAB02B561863B3671 -E0E73789B112F7DB5F0B2313B083D17166D05B65DCEE648210AB9D3F3DFFE60EC4649552 -2F101001B3FBAFE7BF2F0EDB70A95C572767FC1880F84A70DBEE39648A176BA8C7C87EDC -D424245F6F66C910AAC0C60E5078260A698AD823965D83268AC7A98EA0E7A23A7599470F -F6B2E6C6F32FD3714B210C775DFF039590A0A159BCD248E95CDE7A234CD8F64CCD5ED383 -D2E49F9FF4DB2BC7E7F8E1F45643BBA556CC2A8C7C0D32CCE2D17CE77C6C8B021AF086B5 -1F0649C7E2081705B2C0C57B205E8C6985C849B01EF956BD97F8862BE1B061733C8DECB3 -47F4AA8CCF7FADCC4C335D3917604DBA283DBC054C76199749C7748A48417624EAB6C930 -B403FCF33E8A48AE4D064E70CAF24F68AAF18D1F87E4A920E2796BAEEA34BD4F208C90AB -87D599E2A4A2427715819D7FD510ECBEA421E32FA9C3B672BB5329FF756B0E4B31C2B16C -ADB8ED6D90BF002B29D4B4F9AB7DB03B83EC9A165A3F1148A9C1958B8071F279440A019E -743A624CFD4166857D8DA38C230DBC91DEDCE97E006B242E14CF25EACDE17E7E2A6621F5 -662820DD295589E5BCFEBA6E737C3DEF3D3482D7737CDE224E3509858B999B66F6F365B7 -34C207A58FB6C0DCC099E1A50D95A7BA53E0E51EB4D6B55B681B37FDAC9543F143EE5B57 -292DE45AECC7F8528F70642A9ED6A987748EB0FCF8E4964131787205AAAE1D84B18E2736 -911C20659F9813B7F90F69F2B93360E2983CC40A3122DEA8263FAFD8DDCA7CDF12908042 -F5B2045B3AA8BB0336816C80F1C89F7141CB3C64C08E8879145B10696164E0872635D06C -186444A971B188D84C0B908CAA9D14DE8E69A758841AD6FA932A648E9694E399F234D090 -D365A315CEF4F66DB8E959A56FBEC35DF6A4E969A49FCAA95FA2797D401DC1B42BD82BE6 -5BDF85A7B8A3FDE93B698F10F675E8E0B7D2AB4B3DB8E0FA5D21184C9487BCDE17AB44BD -DDC9278A72C83EC2896B02DA5D91F2BF9FD44D56CB65B65DBE0D325427E6456E4046DB1C -5229F513A4EEEFC319A58334835FA5DDFB73D4C8E92C4A3A2F449939939E07BF9B3B2200 -1488481193B08870E0F077E47E7946186ACAEB9FA732474E2DA080AB573A4DD27BD99894 -F2EED2C80BC44C46596FB47502649BBD83744562DEC7224B1CC54CF28192D3C23956A7EA -96DBF54D85353CBBA1770E0FB58B6F1852409BCB1BDB61313C3C7C3A349591AEC393EAC1 -BD80E7CCB94C3604C5BA8B0828AF45182C683FF51D2D2C00570F6A172E2F9DEE877B03BB -45E866CD7E5A99E63B4141C4B12A21F62CFDD331137CD027F94DDF9F054C162D74FA1CC3 -94F404C707DA1F4BD2A8C1C762F243F14FC71E546EBB5733C43AB43FF23BA9C2CB9058CE -3F3808A129A03B6E13BF8DFFD23A1D02C839FB6ACDE2BAD2474EE64FF7AF05FB40E30A23 -6BE270B787D6FB1FFCC0C4D7625B13217071FE46C2DC56DA79F278C69E85D7856927D0FB -108EFF1E3AFBCB9CE54BE2F76DD439BB182D3DF1F2796DF6B5733959A950ECCFFE7E0B7C -6BDF71CCC7DA4FEB31D6FD79C506250FEDE21414A1A842747F350664CF53E6710808AD08 -A6FD26ABD8CC592F693BA372A5C0D0A6F4277A92553CC72CD6212865DA7D032D1904F1BF -668B0B37511CFBE3AAF595EFE422FB3007AE3022CEB6C87058941DDD0DBF6F9ABC5E8CC2 -6AF7BEFBC1F4B1A03636965919D070FAE1F7F9BF42FF16E9778708478A279DB9DDA512CD -B372E39B9C5C87CC7A6E55BAE1626E8AA3ED7BAB198149D33D8E79960DEE846CBD2ABA76 -1979C57754955E90D7533C0B38CE5851C926F0738CF4EF1BB2951DCEBAA0A0704870DD80 -FFDF92D2136C1F470FF5345C7A93F4DB72360B4DAE833E2614154FA43A2347FAF4ADEB0B -73C8FB0AE22A42F80B03C7207F75851AA036C76934BF67B10ED6A5B2000A2F300A9E1552 -FF9F4C66ED0FB34900CB8649CA50BE457B967184D0AE2BAAFFA2AF24881761BA01759D8B -EA601F2C09E5A15B1289A9BEB266392CF5CFF78EDDE664F3FD6B77A6C10BDAB1E57E4ADC -2EEA4F2897D2ECA99DBEDB2046C7E889EE2FB30F172EF290BD4E16FB68C14E88A58E3F70 -9895FC431776EC963284E03B6975ADB155128913F0A3C910E6D3F0AA11A1D6D67C0EF96C -145D63F6E629C61C934BE19A0EC8D5ECB08AB1305C5C53F41628E7AA2945D72A18F5CD78 -3DAEDA17DBC867BD813F81E2D828B09EE77EC5BD7943FAA62E9682214C65735152E0AFBC -E7808699369C181FAA4977771FD8D716DB2BEA0FA4CFDB606A2EE243E0F4B576A3C5FAE3 -8F67C4E29DC0D86EAEDBBA90803E2AB710F16BBE42748967150D969C2E07115A9B2A2507 -A87F7EBAC946F7178505BD9FB0E08D86DAAF88D8A5EDB321FC2E7915CB80E6C0C2B125EE -0FC6124990A00E685E157EC94D72CCE6169F852E0D19DDAFAD022C4DA4D19B979D33790A -E763E04F78D6449C7D3674A12D1C01BD73872284A3D7CE4B551CB80602FA4145DD2E4360 -1CDCF3D6567887A6B0A73B7E1B6BA01DC93C51E9FDA181B20835A75541320F1BA53EE871 -16D938FC03B909D4FC6558223DF057E3E6195C1E26D33B28AE7156B88D7B5A6A85ED8498 -48EF890A5402467A8B11E2DA4719C395D6F40E91535F1DE6C7FE1FA57705A8F1321E2D74 -69593D7E6FD067E07B51E7BCCB382B1B00B655116F3F382D990AFAF26347CC6FDA803727 -C1E13C6429D1F5D5E5D9D56EACCDB32E30AA10DDF5E0294E59123E4C2E020AF1D13A0F89 -99F30A49D8049E7D9B8676D2C13DD896FF4CB82995F6517462886B4D6DC37BE8B13D07BD -23CC78524F835DB22AAB29A1E6468E8607FE3C9E1B1CDA29B98623C87EF39A2DE0BE849C -438EEA208FAD0DF05BB478D8E54501EAB704ED405598D38D6A58628BFF784EE969725A1E -8BF897007D0D6F53025453714BE52FB6A5E4FFADE5563846F778B71FB0D225F8C9AE9985 -9CE14DF67AACCBFAC3AFACF1CC6FFB6BB517C87A382D1AC1615DFD97E52D3020E531B8D5 -C6318FB90D30C2CE9EB7EC0D2DD8FBC83A48BE41F22EFAB7B5CB7262E8BFC1196C69AA92 -EF1AA1D59DE9B1C55D5B7C0019D68F23323CEB4FA767550B090439C2D1867631A97CEF5E -7871494CBCD1EE56C0EBD4B2EC412EAFFD1783CF073E9B6575CE9642F704486C6CB319BB -19CD270D1EF9B63FE25255F6CD5D3B77B64FFF7B562742593E6DAB5EDC5E9E9467A1A478 -8BFE80F892B3DD660B1765B757CDF91B61E5AC7C7FA68857656473C32CDBCC21C3A0E812 -FBB939809D552C9394686F8CE36CFC3FE8994D26CF4917CF0F11E0DF8B806B5AC7B092A9 -255EA0364A9DF03B85D67BD2B4B4FABBC8161542814E432486F103F2DF6097DED715E2DB -B130A753D35EC68126DB76A2952575BAC3FABE2BE9FF73D18E60BA667575FE3327769770 -925F00FE13573F5050DE00CF24CD231CF619B2351371433DB15B1E97AFB39FDC4E07F1B8 -45449EF4CD86B3F0C0BA12D52A81D5386A9B3DDC62E588FA80D5A1E31FF503945EE0FCC6 -841AD3D4E56F9C801E84B01FE978E7684F451822423122221FDCF6702D48CD226DB839A0 -E095A31975298CF2FD71E6423F0FA5191D8BF7E27E6963A23F31131E68278485BBC5208B -6C5D2765BD053C47566A65DC4B173E1580183763326010D54652BCF7BF68FADE1E3B8B28 -E5C601E241431E665178E56C36AA1125B07D8E4E9627027D73CD5A664B40D82199E3622B -EB76FC104B2E5A6E009B4AEB180ADE287F763B73A6F8636C0CBAB936F79859941ADBA525 -72CC725A8834FB6247ACFDED0131BD5032ED40A04AB7C655AD7E954E4CEAB74524582D7C -142FEAEC28F549E36135C085A35DE07E782E72CA53BF7B2C8EE8C3D8346E2C2BA619924F -FD9E5FDF9564723BC0FBC215BA0F785532DEF5AE95939F027A62A402A7FECD77F064AF12 -9472A23D2118B569DE04888A8ACCFD6DA14E928A7C2FCE35531FF112F93202859771381D -6D161E6BCF5C6DE9B375DE8E983A64AE6AB75FD52D590B78C13885B46FBEFCABED5BAD69 -04C4624E71B29C4EF6B6C2564485210616C08A3C41C83BD947940BE454185EEB33B0F0D3 -680F9BEC8417063BF03100F3484678BD0F51869F3244EB71775D0397B8DB029D13A2A318 -2320FAC3561E7C994DF8F94EA306736B7059857552CBDA0E2DB4689A1572B509DC658E6F -5C7FDD812DBBFDDE644F980A58E05F14454F916D4458DB067719254EF77A887D71FA3385 -3D6A8D1FD29885E3F52C6E424EE0AC4E1E64180999A7266C896CC3140A3C59DE77DD941D -376EBFA09D7F3761704BAA2C738610F39E7FCA335BE7B36F9306795D5B2056C57FC42C84 -66BB9141ADE2ECD7A4ED5BF9251C3091D8B950B95CF07303B165A65A4CD198BFFA8DDB46 -1032A70916E66838CF2A76CF444ECBCB9ED23B3B32143C9A98A395E51CFC281106A7DAF3 -74AD4BDF3089EBE727C93E58025BD6C8D917065C4873A5DB3E90084716C5082F6CBAA4FC -E60176DA9B75DBC2DC5BEFDEAB261C915A7F68CD5F3296FA854324B661BE571A9CB98157 -9C6FE6A5EFFE43C9933EC292550619B794FEDB97CA0FBDADC4FC665D7955B43BD3B23A0F -1B76D78F7A1CED8FE598074469135890FE8789FADA3CFD4FB965A1FA62E55328EC450B3F -1E6B00FE274A494D25E94A2A95131D5E6C8DC6E27B65BEAFCE6095420696940A282C5AA5 -B9E66F243FA307C989352A1D557B83C5855C004D86A4BBEB11BE9F152693A77925B014E1 -6AD084959F78B2A136EA406231AB1509E43176B268B8EE14FBC281CE832FDC2475447A21 -49CD45645A78E4A0027060CAB18394DD5A3E7721B27AEB22C9E98AD563BB5FB2B0A0A759 -93F090DC2249F1CD8ED869E0316A2AD4EDB4C24B18B758AD2C746AA9E7544299C8170211 -6D591080B15C376BA8386FACF02BF9E84AB8C7470483A4D6921CA9A2F191A42BA49928BD -BA244CF5918E55F59E27D9CE90517F9485D91F1D5B02EC941BEB6AC9C7CE3E684E882D18 -7C9B3EC948A745932BBE4DAF8FA61A84FD7D1BE556891F8C339E63457FB447024A3EF140 -99E8FD37DB2AD623BA1476C883F62395E98C1B99F981F3FCE92A9DEE9D99627F5DA6753A -F46B1B69666048C981DE59BA35C0481FA33A17D511EEDD45D90AA7576573625F167C3BA4 -35B8FFEFBED92F368B92A0DC32975BB2C9C8B1A121CFC44075474B78B496E953D45B9762 -B2ECD85E0CE52B15510E80AE563235E400CBEAC6EDB602386FE1237ECF4D3C14C92280CF -F9768E60748AF4865981EDE419204FD2F18FC50E49245260BE2319DC1E624C2E59BFE1FB -CD04A3F5FAFD8D159E42B8E52E0B2279FA442E613AAE3DB6A1016579D3170F8F489E3793 -12A6E32F45128B15E01373AD0C1449D0E5F31D5DC50EED3EB856629EC2E51616F40C9DB2 -F4EB8BFC519F473A02BBF02FE0E8F86D0EBBDE611081C24B3ABE09239A9682D8D573580E -86D5FB31227823CABCA34D9BC918F38D9B3273223408871EE2D29133367C6048E0FCD93D -22144710814CEF24D9680041F020EC73546ABD22B6F521DADB8E1F6AD20AA8F33FDEDDAF -273CB366CC1F7FE33927075C911FC4D9D8175A7AA4E483C2F4AB658EBD523405F83F5CC7 -E328F3FFA5A66900508DE0682F4B4632880A3C807D606A2038F796B3A150F2202C538F3B -92DEAAE46528E1BA68E19E6FEB80CBF5155A91C16AA6FF5CA472B4444D0981D1D9F7C9E9 -FCCFF9E67FDFDD78AA2AB765E34C7BC29B2D8BB138AFFC8351FA98DA41C552F6C1479229 -5909A4EF7F4865E16BBE81EA742178C3E86B9D2B957DABD2D6A558921D4FC3429A30BA66 -13783DD39563547E9CD1FBAE6257DA11204DC8130C89C5B80541E0668752872C050A4320 -92BEE57ECC95266FB612532DD8D5465C938AE4979559CBFA8F2D7903E48CF9DEB397EA6F -31F274D48E8956D337310359199708CEA05DDD64CA417300ABA7EBE4CCB70DB7BB31FB45 -E2B9E0F15423FBB2EE5964278A536790F16ED4F9CE31F6DACE8C0FC489CA73D2457CF3CE -BB9BEBD0CFD2D1F11816BACCA5D4F9A84EDF8D7F09190C16F1B6D1766AF98A34E5A28693 -B555E507017C1B9A1B9D8D2F52E2899ECEBB6A341BDB98DB0885D97C5BB9D35EB6D18099 -594DA2A6257D5E4806D45CCA23CE2545697E3DF34B6E7558D080B030268AC56A576AEA44 -B4DA78A686340EA9B2249C58381347DE308439CBCB5988DB881340139156FFCA9A8961C6 -2004EB36FB0C77F8B762B388EAE846531CC38B75AEF785311A6F8AD5C0FDE8A61D89292D -AC55E1920923E91BBDBB40675A3D956163323406F2EAD0BC79E4E31C2C2B22B46D266657 -FD150611305CE08885360A76FF28F3DC837ACA58CAC71443120508A80F9F7086DAAC40A2 -9082706907B9751B19D67567FA243BB6595E1DF225DA36FC4F8D86712B1BEAA0D297AFB6 -D20AB0ECC8CAF709E991604552ADAD7F22F8F229527B60BCD4DD9786AA36A13328881677 -7E00F57F9E562B2CCF2D1F6F6968054D8C9B08FCA9E0DFA07C11BCDA281DE484968626FB -52B677BCAEF983444B24B0D959B66FBB9631AD4796C435888E09D90B1FE97274D8459A07 -9863D3DF6856A45BF8555999FD430FF9AF50FA060364A727503362129D627BCDDE83F679 -549FBE4258B08DF47BDC2BC161D5E61804588615C5CCC3CA6948C25DC854EDEF94A2315E -A89ADD8163BFEA9D72B430ADE3D9C17D69C9362D2827EEB15BFE3B8806A8CE373469DCA9 -13FE773C8B9DB720538BCC4D8D5481CA29661C00D1F5CAD55799F363AD2CD563EAAA70F0 -6E250629F63A0ACCD3AB2F89F579557B8299F1642663399DF9DEF3BEBE9F9FB3505E9581 -4D58D1335C9AB341F1928FB7553474865191AD7D8A89C8505B88C1C22BA7E3A88A512AEE -41B79569560C45B67497A6AED27FBBE40C8B2310157AED1078B9F352B79BCC93DDDE7803 -F479CAF0EB48AC801A0BB9EE972A258F110446154E8DF88DDC10523E8CA22A62285B6285 -E7B3A4AD23216701310C4152DCD1E39F771BF8305D35E0BD42432A0C03AF965756F25CE7 -0869B6DAFAFC69C8DB3631C918A7CB0A1A6E3248C5E1E665E926DAAFC9BED400CD4584AE -03DAEA56407CFFE84729215EEE16B10BF164B5AD7303A77423679FE14F6626C934A14587 -97A4ECA95603E5F4023CFA4262EA9E949CFF449EF9A82005B23631255E615B060E4BE2F5 -526E06676500DB126EA3D38E3562E1819BB68624010F5A984D446790AC8EBE11C5137500 -1814CCFDB10A27EB87382CF5788150D66B803F0833CD73063F2CDB1C2A56E12F8DF75310 -EDE85042D615FE028F68C668017A2A32594B89C428059DDE3FCDB18F9906C7E813DEA4EC -C3296C1A21BD4BD3C373E91E0D6B6582D99DF35F5091C09602547B864DFE966532EE4669 -49DEA26C0F7B42D8023F8EDA050D8482361EA43C52FFF4F54335284BEAC3F427B6C59058 -912C233525631F113FB15B888D5112759466A337C37A22346C6A4963E3CB53ACB141A59B -3BAF30349CA7D8827C2CEEB62EDBD851C2AD9BB8083DFBBF305ACE6868046BD93B59C2AC -75D6F3B1C243C6EF66533D2DADF52D81DF1397ADC532CE86363BAFD043F9B1B8E6B83547 -4E3BC3018912BE08A570BB4000BB13F249F38DF8C73906EE9ADC7D5630F04BECA0A86EB4 -52ABFECF46D03CBAF4BE02061EA50576A984FEDE9DE35DEDE1988DAF0A6308EC4B6BDFE2 -CB0C7198122C19F73CA7436955379985DDE2ECF851D83A425B4427A4A17AAC64D9E68691 -2645FEEA0A8A0F7A7C1CC0B3E96C519386EC14626AEF3E9E8718877DBDF45C9B8984F81C -99980A8F8F3C9618F34407CA7916D2C4741AB9B4F916763E1592BA2C2D5979E2256E2D17 -A77905EC38606C3645F1348E77ED501DCB783B8BF677E55415DF7373C47212BC59CB71A5 -4425410E29A19F74A9EA8AA508B19464BD0BD1958931B135DB014C6F358ACB880C189070 -E27188EDAA43009B515994E8F3481A9DFF6DB2D5D474F0957603B0A45A7E6ABA97640576 -11054B1ED7C692263C1B2BC424FC68615E9973A230849E771175432E48746AD8E3A15746 -1622190775BAF10F8BB66D2DF99170760B26DF8714BDF178334D0F90A615939C95DF51FF -D90B28F5BB67FA593ED31E035342E6F187DFAC21FEB26107E4ABC7F484AE11CAF85543EB -6FA887B4FEC65A760FA33E6AD078F420D4828B526B37B4AFCDF396459B6338896D7EE8DE -FA3E10C6087DD4E3F56CA302D955FABDF1EC04A5FE4F12CD40535879AF0AA992D40E53BE -2EFC1FD35E3DFA33EAFBBA4E851434334BD4551B4228BEB88C5F8D259864132E2B893C98 -2A9560ADB25C06487A75809CE201F001E426EAFDA88F9C7AC36F57B06B212F03AB8FD9D9 -6EB6122E968F3536977ABEF5E75AF5C9C30684D3D7833E3495F7F9BA021B5C4A1F76408F -B42837E068F91D9D2FB467802873702AF6216CFE60C42B1C8F70E7555AEFAE95B6D44C9B -967E68064CEED38C09BC1A3FC447FEA9902A26B6D5FCC8A42F47AD2FB2C4DAC61AA0ABFA -58515C45C912BACA7D3D32EB79DC14A4D8DAD9EC0CF8F4F213D3E109127FB7047D2DC47C -0DA7A5B790318A1E13163DB7DA71AD64BEC58BCF31A596DC90163B1C46C9175059B27DB2 -D858EB1AD055891E58C34233140240EDA5AD13695EC1FA606EC0CA9CD84293A75829B1DA -2DBB20D97F96D626D7E6D2332B664BF543849554B07ADAD02CF6DFA3BBA2D8D707810B0D -20BC441FCAD69B8D986480B1E191FF390FA02B76787CE41E3F779936A2EA8CC0167BA167 -E4E08204BB8F4D0CE908AFF57F1E9CEB3F00C1B863BF65443684BA425888ECA909B2A6AC -5436D996810370BE779C30D21941A101B2EBFD4F38DE2295CA0FD39AFEFC997377EFE1EA -C62A9347DE13284235061173CDBD0C97A06045EE97A193E79350B8762ADDDC2494A68628 -173A30563595266EE3AEAE1179EE7CCF47A7F9A84DA4B4120FF6B12FD8784BBB674404C9 -973DB36020A9A7EC459F263213846A56FB52BE79B8D1F52FD8EB086A761C665D94D01336 -D5029A5C9C7D7C1234BB170E90CBCF1AF8E5F5B21CCF7C11F9F2A28384B844B1F8F1E543 -393EA9DFDF15ABB11520408BA5242CE5B5AA7EDA7DD72D3D9B939AB2AA4257764929C8CF -5F6806A21D524DDBABA96FC46B942AA00F9485C1F071BC6C94E65A153045F88BACB20D69 -6EC1405D8880ED1456162625EF0EDA8ED6022F4E6BCB8800A23F762EA3853E45B4ADE7AD -4620E7CB83EB1CDBD40ABA6234EBE853B3378EBD4F077AF9E12E692995EE06D45CD4CAD5 -ECED7947A89DCE4A66F1B265BE66BCFAE487B41AC623ACDC6667018626CA450FA2E60512 -23B86144AC9A5169C29FFBAEEB9E1D65CDEF2A5BBD29DDA5021AB9F435C459A3809A5DD3 -6EDDD773C0530A1BE54910B014A6AFCC1D95E36A5C8C7D8DD1DD091D7B14E811D864B1E9 -41122A7867ADB016F949DFAE0BA06FBBBCE87C833C6B244AC48A7481C54FE756C2438B00 -9ABD319AF57D0F69874D274F96A12BD417E8CBA7E20FE608A73A88A935EFB77DBC198005 -1CFB9CBA94E196A412C45CAA4F890DD9334611CA1D8D6F6DFC3C180180F22683BB00B8B1 -0D78BF4D64DE288D2ECA95878C2BF266880E547D3826C5D1F3C6B4B0A3EF0345D8FA66C7 -EC77180BB59A6CA349687F18FF5FB5B10AFDD7A440E20F55650F258A10899BD9467DE2B2 -086D32150FF9242346A6546F9A1548436BEDD02049983A46A2CDB4BBA8BFA5F04D7BCD4D -35DEBB30496780236DBE224DA28218DF58037509FAAF6BE46DFE5A93C1F072F37D80FD97 -33FDCA1345C468C85CF501D4EE30D36EF5FD87837DDFBD703B8F6AC4AB3DCAAD7E7C5E54 -B6383A74F4533EB9FBA0BD8D1D1703590CE24FC3DA5E5BC929BB6EFAD09F02BBA5E30315 -2AB1CE32A6A2F61448A765D912A8DCD8A8E0003CC2BF739F4DBDB388320D990B9F00E04E -05AD6B650435F44CA9570D878D89CE782E06C68BA9024EB887C6FA18223F587338BDA034 -893624FB950E74209BBD763A9677FCDE1236B74CBCFDDBEDECB58DB1DC445BE8672ACEBB -05F0E677D133DDAD4607720462C63FD9409C29C75039A9EC34EF0BD89B3AC6045389A3E2 -136C9A6D502D335789CB74B7F369A6877C01CBA68278828D17C5B7C0DA4F385FA21DD8C4 -C68B9E17A35905DC4006DDD3D35186E31CFD74C26E7FDC450E6729F81FA36000E7EF2AE3 -9C4D80D9A94429DBBCCFC44A7044F424E90C5D156CE1696CFA2EA4742338359287297CAA -5D616C1F7C7E7E71CE9099028D6516FFAE321143EEA343250553B3249C2937C1797ABCEB -BFBBA9BDCCD5A15DFB20E3772660DBE2C410BAB6F4B1BBDC61AF96F88BF830C23564D4F8 -2FE22F6B22B63D06D1B40DDD976E19C8B361239546890888FAC5E7ACB15C4762C4871DEE -EF368A59B6BF8A359E29967FDC8A59E03E357D3B84843B20EAE12741CD9E2F2A3A32CFF9 -1DA33E881008CC686D03A1D55651986C00F7796559D4D8825AA811EE8810B921FE485D43 -1873E682B76E96ADF5A586B9C1C5A876AD507C51545009F09E2241835ABE9C6CBC76D88B -7BCA368487A11BD7654EA0B1EC5F8EFC9B587718C732037B875ABE9F5D44C82B29FEF550 -B80FC0FF7AF43A6CDDAD7A3E8024A09C04CC5570C1E91B97E7829AE7402C870E5496E8F4 -B12B0D9DD500DB6F8546F7C2F965387C37A701F2B43D236AFDD777537967741E88F7BEFC -9D9B3C7D6A86B1AB92919A48589CF276BB9F00DA2D7BE38F46C9E5B2365948E32A30D830 -0FA8980D7D7C6ED2252D9465EFF276856698108122833A0B3E774EFDF55A69070FBC7E53 -E955C4E02CA71323261353E8F5D1A4948ED41F4AD7E25585E6DFCF5553C9187632617F3F -9D2230A478E4BB63497500A3CD8AF78C780E700B14272AB399D2D2FD9979A9F422DD2B92 -8CDDFEED37A40A77F93A1BFB9ED9297B2BFCBF9FD40A44D2227F4C7EEE3066F1020EA335 -91BCB47A260B744919F0359E2AE3C619592C325474063675E5D85DAD5A00CC879EFE071E -68CA2CBD108FAB3849D312DDB823BBD18D7C3D61DE7A5E4AFEDB203D4056B43EE1D93CA5 -0BCC10AECAA08799E0888B637B6D122EFEDF40DEF30CA93485F424928F3CD6AC66D85035 -F8BEB418C560E00331294B1F57831C33F8ECBB2561837A5A0B0E5E2EA2DC3F72A1C09990 -11BD2F0A0916AD62A8DBA859AE63FD73491390CDE70B0C0B7D36354BAA08BD6014B790FB -33FB26BF6C2215E16379072959ACBEC5485642A7C7ADB0B826DF3390C36C9B28E724D2A5 -7F57EF0B1846B358669EDBBDA569EA1B28E9AFF2DB2A8DEFECDC073D954F3879175289ED -9F159376F3D1301EF514B47D3EDD5092C4618A80D20ED37D4EDFC8621CB7E4683AD8B2F5 -51D666B8F39C0CA193BE383B0DD31BD540408314871CDEB6117ECADF8E187D1D5ACF5239 -1F8B2B1C6E6F89A35022D0A2B8CE22B79B200AE116A4E9E097872CFCE5BFF8CE9DDE2E85 -087649207EBEEA22E07187C24404533EEDDDA851CA5E7C18657BAB75029DED2D381CF4AD -2D5D52A310EF4B8477008C11393D74B34F0FCA4026ED3C12C71941A6D77F501A649C8823 -2D9A1EA080561578DC7A1D591B8E922BA280977ACF3549A24125FBE9049C30CB9DC547E0 -766EEDD5C0210C248C4E7E435C81AF15B187F84C216BD842380436BC3467225938AAC1E1 -FF7CBC6E6C59BBD50767D3BCFE93564F1905AA38F1DDAE4A783E857D148289304F8DF194 -CCE5CFE440CEEDDC5F3CD1E1587F67DBC41DF3CB4F08AD19178CC4B77B1DA3CA02B6F40E -36984E0439E53877225B9F8576A9A2B57286D6F759A060956CD30B6E37473CBB55D76FA0 -2F4588E66305A1F40DACA56CBCD42883B960B6DE2F91DE519C80D8FBEDBE38024EC6F6FB -B6FBDD5323235130771153124CB95ABDF622F737A42078D8E81C9965B7324F231A072739 -5129FB30006987B2BB806D414672310FAAD37F3FD005EC54D6BD2170AAB9A21E52A9A7C8 -C6AF03F51488D34B06F22D93E72FA5BF7097918FF67DEF79A6D62CB216ADB114A01CDFF7 -DD387A0CC150E852D4D267187F6A6DD6B78C9E283C9D547DC6373A36F3252CC683CDE9D8 -EB7221146E8C54D1A90DE57003A0CA78440EBFBF35028112B431C508298BAB97DC45875C -D002FBC1E47BE8096D13D485E2604EEF44B0324B0F494D874A723D080A9A32B9668605E0 -18BDA773FFFE5566DDA289972B087D9E69268B2CC04CC1F22DEA738A2248F370328C7FE6 -D50DCC267BF736C8C3418626BACC805DC44F60A862413D4C76104D6AA64F813ED9766563 -3236CC8EB519A9C3A2D53D20658BD68463BFBB0B97A795A78280B0C05DFA3FAA5EC6E6E2 -879ED3817C5FFD07949528C3C60DC6A8F1C73B7B87975A101AD9097F694B7D3140B2EED4 -52E98F073ED4648992EE76954A712C1804DE95D1C1C98048E5ED790B3269BE49C7653292 -E69CB482E19611F24773F00E483B8541F7D1EF3CB9730F527FF6309EC105CDDC9BE9F9D9 -4C28B3520719E5AB1EACB85BFC4CA92ECE780476DFB3BA759550A261B675ED4E1C1325C2 -EAC510BCF993FA03281FFF75833EFDB168EAF8B2AB92AAB82B389E7086822363A74829F9 -FA36C1703081E55EAC5E6358866EAE8BC04C37770DC97392713F110C143B7CEEFFCDD84C -A6713C01B4AF3732DE935DCDC2223015E57FBF98DCC32ABA1A989176963124CD353DB3E1 -8998F5F322EBB591528544A4A4E0618076FB07540DADD6D00F8B66A60ED5496CBB703E59 -45EE138D7CD77C301CBF0814A7AEAC93127862431265081273C1E04B6C2B4DD0936D8F34 -98B2EDBF2E2E09397169EC99FB85AF23E929F4871EB8FED7AA77B2E22AD7AE6C86F15B07 -A01B8A1E3F8381CF2A7AA25FD49876DF2E0DB253DED331F7CC0A545BDFF42CACED8946D7 -9661F3A340952AE1CAC541F0F6E66682A22AEE604941AAFE270C3C2AF132C9925A01B35E -D770156A0AF4EF33B00DE099330D5A874F84A23621C6352DE80952305BF501442710DED6 -97682CB92BFFB645C2A48C49D47F8664BFDA17F5ED7A0F64CA28A05CA58F06A9296E6BFA -858B5A728B28E12C75D947DBDF779F738D67BE839FC0D80F3DECCF255898CB916E2BCFAD -74FE85DB8AA036791DEB28487B368F14F1FC79E54D4D94074F8FB530036B09CA8C44468A -A199990933422C6AAAD716F03358E8FCDE9DF706F0590037971AF1D705DCDB45085D8940 -31468CB922E90E44AAABFE7DB1D6D4BD37081491EF89F46FF4F7FEE501495112CF757202 -448FA93DCDA89464D7AABDDB7BEEFC9671BE5A929DE84677636F12F4BC22A59E22F57BE1 -E680B67FAA2F00FB39B6FC7A48E43DDAB93FE9DD75869375A874B7CD49D22C314D617848 -139D61022A79D94AE1FF9E07C7A7C3437709E09B92A8F33AEC386DD37374051F0387BBD5 -F366C3EA12F5AEA0569D15B22729E006748E900A17E5D4EDD52FCF4561925C7ECEE84B3C -F29BA83B03EC7ADE70040D898BD3EADCA66DF42045C795ADFCEDE3DFCDAFCC68391DF6BF -C9CF4A49A45550F6301B581D19B8A8F7CD9E06BE7A3C5358D6A319188A803E8A5CBF9877 -B8E53CBD98E3CF270330BE2BE853E5BEEC128633EBD5471D9E5AE1D67D28E17C752C5443 -E16B6E1AE341E83ED9B6CFCE88A12A7329525C0A3BD2D8AFEF72D727B3104F12BC874446 -FF1E5204DCFC9CE7F772855D63A2A8DE36D382346F8C43D7153B9BDA92AA04600267E704 -E9F43F3D625EE0EE228617C7ECFF39AE97806096BD66B914A43EEF2917100C2F0E1B2554 -C891D50C3A0037190C9AD8BB6563E004696DCE62881C1F6F8F05A96DDAF3F89CDBB780CF -6B7196124DC1730D05CF821CA85156F7EA996C7E3A44BE8D4EA29ECEB2E49CA7D676EA3C -874594DA4B8ED45B1568EACD8FF68963E24F2E05EAE0908D1E81165B872F3C6284181CD9 -A06996A7D247A1661D65DC5558E0CBFE14724BE1D44B08A1E06D880D87905E889AEB0ECE -71E3A9037621470305B423EE63C2BCB5B227B264A4CD5CF8573D8B320004D212B65A44E9 -A856A3631BA02C46868994BC9985F219C9DFCAD9591F2B76B34904DD221E7C9BD2DF06EA -B632E6CA2A24699AE6C9C6B4937A8293CA61D36F3193D888D5081E4CCB837D93438602EE -DB2D197BDBCD0A00534B493E250ADEBB1D79238C8F8076801EBE4A282C98750ED7BA28C5 -9B903A26553E03E5B1B99A2B1D13BB6624717357E3F368B65C8B2AB2606577E45345C971 -CE54702D072593814090A9EE9559DBB28B3A3F44328C33F652FF066F87F1B251EA5098F1 -1E970A3505B982A023147D7D8B077E626727B1AEFF6277BB306423D55070829D73895B67 -3E2E6F9A1F954B6EF69507E1BE86D6C594AE270D54C39B1645FDA847DC3D3267AC9E3190 -9A509C03DBFC0A063FE9FA2BDCF21199FF1397A93F13522702B339AF7E6CD121FC2E3D4A -22132ED26FB31F2EAB17B8DA9AEFD61386EA3EBB771A43B60EFFF3CA55238BE1A0852F8E -5B78DE572FF42616F1D4A64E40C722AF8E194464F506FB9A6F52E52ECDC7D31287373EDE -F46C5DEDA0CDAE20AD6C88D6315714304D8589D6A24DCD9A0491598AC69638C04A19C07D -CEEC1F8325317431B3892F270779A55F293085402C4B4085268AD69995186470A2E2A106 -44AEE77DBC20926ADA20F91B5BDCC0181BB34C18D1FB68A32808ACD569EA71E627FB5419 -EA3228DAE56414EA93250EA395BA750C60084D2BEDF6144E970B0C5C7CF40B05EDB70452 -7775F2D0A55E33BECD54B9F91807B097575929FA313EEA4B8EBA80F9499BE28AF2A3BF03 -CDFA19AFB30DAC150756F90B432083DF21C79616A054384D91F913520EC45133A30C84B1 -C1EFA0D1AA9B4FB33908CD93F76F6A8CD03F8714EB0E688DD3A5931BA940C68DA296B217 -BB6E1BA16FCC974E3E9F45A30B47EBC5CDCC6E2FC6AFDD826A1BB6851F68BB88C2879B21 -81BA06EB195D8775B8CA20B436B664BDEF465309FBFFAA48B0736069FD790DBA0047E4BE -7591F6B5849B2A1B891895EC40234269370FF1E66AF3D391300E07F7987D3B168C9F4770 -9AEA1367B53613F52EEAA64D8D296396EE3B6338B8479022B19A9992964200413F29C3C9 -9DDC50C2C61B92465E339B9A585CF0BD532B2F2F3B7BC3597AE2B89C686781AB7C1A2A44 -A6A897F1CEB49F63DB43D9DAC45F92880661E79D2C292CF910A3E75013D4D3EE05CC1A7F -7EFF6810E89660F47D06DF62507A067B1F37A100CA620992848EF811D2B0FFE0FB8A85AF -D58086E2BF8ABA3FF4435FCEFA66F460BB9919A7EF73B5FC511BB3D4C91BE3E90DDDF6B4 -4A2521451B568A167D4CAA98A2BC114B77B2184D15F98943660EC92BD6D0B5D79449FAE3 -089A4709F68872DCA3AC59ECC84A66EA19DB2FDFEDF7F8E57D90F6FB0E856931EE8EA3BE -8F3D692E4CBA21BFF24CC7DD3366D5F7E57A190F61502CBA9C274DEAED962E5EE3CE7B16 -2E34BA08806B7358D820009CB348B10F225EA9DCB92B0C0CCA4192C3437043132CA73E96 -6527062BA32227B2DA597C8E3E75436467F2D6895B5AAF1BCF55A02267E5FC21AAD0E8E7 -F2459C0B6EF0C372D72F697DD46475075C4172E50405703CD18C23A6D3E7ED6F526C3EDA -DC5AF40507AA9A76C86E8136CD695C955D7942553361E63FAAE9C23BF3A24F35F8F9B659 -90D7A6656AE186B1C596A8E3F69748427F0C09F5641F284B674F46CF3D0E2708419C1689 -F40A35DFACD95F8C6A1EE07E7AC8E9FAB58FEE8D52E81D486F5950685CD4EB36EBC16FA7 -C0F420D6ADE912042CD2AA3C60B2468A59DE0A5CDAD889180BF05405064ADE97876CE977 -D6F665803C8BE866AB0F1B08452A478408095AA3B8EB0FE8490AA682DD00CD3AD3592FBB -54CC977B46E3CE307E7D8EFBA586000BB17EB0F2EFD0B0EE61CE18ECD565DEE97E37CCFA -323BABB4D6354DA19CD9080C96D13A5E6AA1888B17970D7DA8D1B461822CD70CCCAB9F30 -D48F924C91DE9F3243FEABDE5C3C620CD32A5AEECD6BD20EF890F1457285ECFDBBD22BA3 -FAF661BA18BBC1E6EF81DAA2E2A7CBD7A058ADFF961B5A103D967C610530EB58E2D78DAA -17BEC7C9176EFE8EE633FC227BDA64E54A6533B6D56B787F5098C47824ACEECD50CF4C3F -172C3C7DAF7B6EC9FA8775C52609D08B073B784951D66C8AC33222604C634E99E99D28C8 -B45846715733EB3446CDDF659D1BE4B439CF32FC2841AD3DEC81A95B20B04790A669EE4A -A9B40DCB3BB6F0A68E5A2763A8CE7B72586CB6006FCB68C3EED89E54698EE5928F10F5D5 -616EDBF01C349C20E99261495735C1CAFF99E2B1FC986A36552A37D7B57C1D4EF460ED45 -FEF6967FAEDE8AE1B2C7AD835D31AC8160B760E7A36333B83843EE3F55BA19E2F6CD7D33 -9FF0657577CA58BAFA3AC0B7302E88871974DC65218E856338C81F00E4FB35F8DCCE6208 -D7F1BD45C3792D21C308A3CB7B50AFAD17EDFA027545355991E99C1EE99D85BBE5BBBCED -4E9C6334ACE88F82894B4B1F81F51DC6BBFB2621CF7ED7FAB3170A5DBF6F5E82BA316172 -60223D7049D20ECFED36DD022307D5ECEC358D4A8E7DE800F7D7C048FB265C96108B6D56 -EFBA19A79D37CA7DF37EA1F778B74CD5BE98A2B13BA7E69DE56365CAC9456A3C248D6828 -6BBAC51CFD6D73BED3BD7A7A7B9800B63D1A94882A52F322CC329F1BD691574732DCC32A -3425E83B88EEF053240D7C7C643A7FCB0DC7B452E1AF9131CB776D450EBEAC8F282B218F -D1540E4816E53C488F026A6934CD059DD5A09DB1DD8016815D066551BCFCD503CAE5FC7E -996E67351A6D681EB67D78F1174B3041096687912F43F6ABD7078C7792EC69A42ADB3F40 -95F326C049344123D0F93EF2D79DA7E77875AE9110F3E87FD87AD187B566DBB723E06877 -462C366B15BCBC0D244C2DA7D033E0BE800D3DEB29B295B6326AF0E5F151D50D6E1AFADA -88A3E0B990C1660004FE5B25F2BD607AC5A141ADCF984FD2EE49871B9BF5D5A1B3D96780 -B4E0AEEF7B4400AFBBDA0350A1586294FCFB5EC075978ECC7F6222AFBC50C6A0CA10DBD7 -8615D8128DE67FE07F2E3869900367476DA42C78AE359894BF443298166E7C935B310FF5 -E1BB2FA0677A947A7ECF0A89C3FBBD60D4D8104F220360D505EFA6AB9CE111C3137F6E51 -0616EA60ED8D1ADBB1B058BA22A6A76CCF8F0FBC04AAB81C6439F44D5659E937118995D9 -C299BC02E354FD4E62E10AE9D2D80CCC72780909F49E6732A61B131E7AAB8EC3D7EFC725 -A153D69D3204AD5F6A3AD6728C2B9E26D337E846A797A13CDB160D740D11FC38CCA2DB5D -E33074C7E5601C8573641E40BCEDD6B84CA7D15C1B86F42D4EC74C2CDAF65D5E22929717 -C6237AF09A0461AD9237F71C011BF36C00CC630E0C55D1B04D7D989EA011D282B77A4BC3 -C54B5440557303C245FAEC70FD1945A8556B8033269E6EA1C1DAAD39CF5A1BA9F6448684 -EC60E9809ED363B0134FD6F19F208FDB26A4A828EA42322550BD312044EAD339FD8DF100 -0E9F64428FF8C72C51FDAE3E7A69B6D0BFC9B2664D7864163ADF48D2F3EC3629063A39E0 -0B8B4DF52D2B855AC448BCFC2A3BED94D0CFC4A66FC6CB22D158C9B1FF632CE71DF9E1DB -CDDCB6AD62101DD1A776CA2A111B283E25D1CFD8B5F238E0FCB2008FC1DDA4EF6CC11C85 -96E38D6DC1CC624C11EFFF6DE5AD410B7773BA0C9C8B9E5F3B7C601222D810E921D55DF1 -575F452CEE78BAC9E306B0801234709349F8C7D603AA39CA94E878781D5355B6A534D5CA -06B774BA53AF73D36F60705629854BB39552ED6A4508A20633D2FDE04ADC59EFB86BCC91 -AABFC0BC1CC136BBD43D8934C54D3062D129F4AA3A37AAB7E870C6272D32D2E56D0F260A -75F6037AA30AE59A3A5C3417021026BA3DF9E6E55765F5B0933AECF62E28C342CE6C6687 -6FE4231A5AB35F194D7029849D8169BC54B94F34DCA13AFE4F5261102648C1FF98212831 -D76A892CB55AB502AAF52AD08635464A7C65AA6947F6CE69BE3C7984CD36057A31B2D8B1 -935122CC567A10025B6F4E305D40B600D3147961F914DFF15C07E6971A4B58E2D8F02F4D -54F50947094617BBDC1811AF2FFD72F5376BD65059737BE960D52C9B41F2FFFD1927F3CF -750FF71292AFE92B978F1A89EDB201F71D014FBC8D2758687039EEBF1ACFAB367C555381 -EA24C44F1E0EE7FAE39EBA4413FA3DE14F947FF5B3909323BD35193B6E2BEAB668B94A12 -40E61DC39EFB28634214B3A46CC0E00BD66D5B2D92B14A708098207C092B45351778E984 -E75DCC4AF44F9774821AE9FD16F44B733C611D708BA56895FD42150EC39E3A86E7253C70 -480114E55C14AB9F448CDE802540B710B1B22C0BF0CF557FE300A2BA25A0D841084A0178 -338EAE9D3DD9B19B062C76015CD0CE257D80DFDDF86C52FD7BDC4648EDF57FE1DD48C1C9 -AE6A3D17FC3CA05716E302BDF2F219B52E16CA97E63ACF67D27EBEC25BED0450B057D378 -9545B823DDCB91E9162D0B8BA526A918BA140A99E32287165394D51499E3CE10F75C9881 -BB3E3E6734B5380623496697FF66123076CAD8648A11D710988ABE094F9A11F4645E399B -91444EF95F0317E07B38A3D6FDA2241425A175F8495D25FA347425E419A78BFC62D17F92 -888986182D3DD448C236B84F46C7100EC23F321E73BF1839EF3500A0B147DA4B93CAB290 -CDEA0EC5567AD07078D426A98601D292966C172EEBCF61258B805CE42DEDCBF73995B8E1 -6580EE97FF610B938FCBC6D2DCC05D59E5D9F3BB90981F92C4545DEE34794CBD60FDCDFD -80449225D216246049948AF7B161D509D34F457F210116D1BDB10AFF53AEA6B51A49FB22 -FDF56471F610550D3133616E184B7D06539032DD560C4B5B54859C4232781326ADDF91C0 -98BFDC7B24A57BC4E69E97707CEA01F58D0E5B72919B202EB8852561D37FA219DE667986 -23D6CD0535C2CD0F642238D80452DF1482B1197076EA7CCDFC3C336B0FC883DE2FABB5DD -C80041A4104E575BFD65B4EED3BF9CDBDD4B83BCFC7295392850F8EB50C4D85DCF6AECB5 -C88F6EA597966AC63872251EDBF270A94512187EE6483D272D50B5E4B7F4556EB9B474E3 -85DC8A6152FEAB40CA34CCA515302C6FF2E66C42E731673962D2FE5320D577A67AF1B02C -A3697EA85E771565B97A476E388A5DA358B8A1D30DF2EF680288F20E3F5BAF340B44B7EB -5E531E569896FDD63DA9AE424B0CC244D99A0256488922A394F2E31FAAA47D95D90BCB0E -83429ED543041F2B8635F3033122F4E114096D497F6D993541A6CD7A6747232B88A3593A -71DDC13689EBB077B3552C366A4685B48DB7E9A0102F02A1C1A31662568DD1D4D3D95D9D -B2C491A04534833CA789145A6570F4B6E8FEEB77A9E9240FA9820695380C4A231D61A58E -F20C07FB1CE230170387CFA28C408D3251ACE1216FF77CA0D54A35591822489C0CF393B2 -4C26623EBC3A3A9C8DBCC5779A2EB09A8EE6F1EF3D97C107F9BF10252698367A16D05E84 -E0B41817D06814D26FF79AA87661C7C2D5487DE11BE2E4DDD7C926834DF8532652AC8DC4 -43FDD086A256005BFCD9C4D9F05D0EE9650FCA24327400BB5FD44F183227F62720787691 -75AF9CF033C19D7B4D2D52FEF89DC3BA145A1CF750AC8AA71EB65FA16FCB377F0492736F -33A408D699FA3A9472D422751E333B368FAB32C05E959591C3977F0A9B94E0EAC792E1DB -BC609E1315D59901672AE9A5ED9381FFB2864EDBF657D8EC8FE580409B0C8AF08892C00D -DA1D2D32CB52611060BFBDADCC73B272936A150A03EC52B4AB5A196C28394154DDBB879F -627E656510322DAF03F018E917A40C6C70371658095B7A9CA96575E976DE9D2E3719BE63 -33CE53FA1B970455CC734181CBDF92969555C42909B590908F43C81FBE180F043FF8EE57 -965D3B28C0FEBEEB075B2DE3444B117F6836E12234670651230446DFD71133C169B9D743 -1B26A1E5B251B4E7A170133FF9B403D3F345213A67C80EA3F48E12A2B564B97E5E570651 -070EA250C155D9F7F50D95BF852F1A337B152A2167BBA4F2E1FD348DEA9AC2B2DB341B06 -07422BAE29EFE1F7E1CC7EF9EB9C1CE879C0BC2B4D3E3BB126879C4BCC0F9219D89064CB -BB943487ADAD2E7A5E6A72FAC3C2002226C24462D7CAE7ABD0687F785028CC6E3C4F1026 -A994669C2320444BC35BC6CF8239FD0A4B4C663EEADF9FE60ED2E4ADD276680C5C84488E -2956D72DDD2A49BBC3367EB742CC9D69AE615CE4693636373743DE1FC06429C5D5F19E42 -A6285DF5394041362F5F43F219977A7B4101E8A3EF45502DD8E702D677423271333664ED -727310F0A2F12CB90332228BDA42FF040CA6359948EBBFEA768FE2E85F344E38A48A21DB -04C8C47CFC95B14DB8ADEA6A4994A366E8D46A4A1453880390130A157DA8B5D14B250893 -C3DDE306C62E466968F1EBFF0AB0224AC7F87B8746B816EC02F7FB710176EC2104662591 -4D2E5083ED6DDD42EB82AE75EFCA4B4017E00B80CF11CF347CF1D9A1F43C5A7E16A47CE1 -CF113A4ED121F109F763DE14B756E396C59E9412CB166FDED494706C7B9BB806387921A4 -C4A1FA6556D82F252E69C479D4314252A146F14A310B0D3861FAA13FBAEDABDE8B238342 -897C50E88A951A7C63670040DC49BEEC93CE42819BC79A5C974E968E523CDFF701B6A0C2 -C1E00D0A2C889BC270C0A94A58B8F44AE45AE3ACF02357A1A78AFE2E09755E0E48BE6221 -A06C91800234AE2E2687049E0372C8B0B2573BA6F044FB9827C1D6DD90234D91CC1BF4CC -FBF14E163DA400E2BE334A4D806B3A934CB6ED7674DE6267B3BA9BF4820C4D41FF661E7D -10E0EB3F7358BAD6C01B7E1EB1DEF5996678548E589A2FB993126E55BCD6BC1BB1F0D4C8 -1B1088A7688BF682E63D54F55CAF1C2EFA84B79974439C4F90B8D05DC7C300D450BFCA2C -240CE0D01156FF5EEA35C9542374BEEFFBFFB332E14526213ECF605DA61DDDE45AEED1B5 -C29217566ABCD452A266C8668369B6C4871FED4D830735A947A15BF41F0210235476E83B -EE843F80375DC95FD0D3D0480202033BCD2D83DEA1B0DBECB3D55EA6AFB96F5B6FC48B6A -7C1308346583BADC3B7AA668DD819F81E82747226FB67162B8F921790663FD7C0F7DBE63 -BFA878DA1434AE325EC02D786FECEC94696863A3235D048E80BD57857B7F0E6B84C2067D -F04AD7AF6AF06195B4FCD01D3257480979D79740D4A5EF82D2D5F6359890B1BDA818B8B7 -43620F6844689B7005B608ACC102444067FC7752EE4FCCCF24321872ED9437AF8D263AB4 -123213968A9801D2F9E902D540FBB430BFDE25C15A8185B42BBE510DF4E9F456286F28AD -DBEA5596EBDD910C7E375DD40500995C867C2E5BF9AAF54E57E730C3C1F199E78ADEA406 -8AF853A645C0DEDEC05C825DF25511FD40B0B6761547BB986AF1E878F905723580D7490D -026D2D7A49A2E553010593189A0980DFDB18122405110422806CE79E7088487F7FC5C80D -33217362356D42CCFFC9F51FC103A68A60E4CBFEEF0852C998FDF4A3CEED447A2D77A9D1 -16F88B6ED092FA4D25C59E731A03ECE98247E96B055EB4176B8BA5F795E6EE92F8DB0446 -540207D9FD913E00D20683128E3B99F3EFA0ABBB945606B30E0CAB0EB6B91D30EC381184 -E5046DD2DAD0A4B5D3C6ECCCFF402C1BF5B42E7AC1EB818BC76B92BDE97DB485A9E4660C -DC3F409129B5BD00E573E2B4DFE2E0113E288974DBF9AC6BEFE9CA8DD0F73C8443C906CC -4D21BC9ADFF2E9ACEFEF101A1087EC168EB9EDD54D55CF072F4DAADA363C28D9E2FE52EB -2A58F4BE72A494F370575246965A4C4670A7F4B47F118FE5BC17ADF7DDAA469EFD6A13D9 -8A148B02700D4D374EFA01E2C6502E6BE36F2FC25CFF1D6A4695110595BD358705674162 -54D33C3DDCBC891265EC7F0FC06BD7BDF70D7000328062F889C4BE68F4FAF0D2C2F5D8B5 -C61C40A3134433C222071270F466D9EEFAC22119C67A9EB2F626DF8CF62F028ED74CF733 -1181D642532801BFB127A1946362F2F8BC33B8651A565ABA0226943CA88FAA9F0D8CAD31 -7B7D2B0B0A5D10907355FEBAA4BFC717BBC99A604178B897CC8CD98A14531E9742FDF11F -8D17D2ED67DE68CF3E2DBC0FF6A23C876F3101DF942314DF0D06160643C4096C65B90E15 -4E2D0CC44AE46932068856CE3EBD03D8A74EE5BBFF74CCC54F0E1D3EB0756C29923686DA -2410B414A5CD43855C82BDAB7AE111E284FA77BACBCD412A438F59FA4006C11F4B45C502 -24F939A12289F846A43E1A5EF39DED94922AF63537D12EAE8E4641D5434BFD058FBF163E -586556CB1E13D15A5487091D9BD004C556CD533A25E40F97AEFB4AFA5A2079C87701E65C -96405AF89D0D7BB41FEC6C4AE2834F99B1426B47EEA08FF81B13AD5738DCF2013E45FF93 -38652EA8A36B8690ACF0997A1CC2501219AFBFCEEB79ADF018B5A55C8734924D5F6EA575 -F0DE17E3BB3AB11F8930DA1A8F3CACD9A0452145BA4F00BCBF072826F1B6F1B9FFEA2736 -7319B85F39FFA7EBA15305A338452211E2D011E566B2B5A822E478BE2852853A1A8D1270 -C9E5E6B80959DC2C1FA70F62765CB50154AE0FAABAF9BC997BFC4C54F63D4D2B948FAA26 -0ABAC11CF0677CA044B1783FB87D31B1960CB0B21024AD08580B0CD6BC4BE22BF8A144D9 -88063037F1D2F17552A15D47D21CFE1B88298BC7F715555783299A9FDD4D131F1645D195 -E6AC8EC0BBD1827548A0F971080AF1DC214CC3720969B735EB0858DEB89821FCBD047BEA -1F1F8B5F27C98785342D56C145D03A0469D92E932ADBF560D35D555893B0D2F795918DDB -D65386906E232A3545C916A9AA57403E5244686BD99006CBDA3E93BF9A22A2F172B58147 -4480A90190018CE07634573D67C93211A9577AAC8799CFE6FED8F9274D45ADA841A66CE1 -EB00BB0330615CF756DDF0D6B9DA2B59480E63F0A40DC2E635EBAE9C5ED7283188B89551 -96C155259DB91835ED78A3D3BF07EAF6CB3B3CF6F4C0633C764D8B76592FDE07B62D7DF6 -F5D16F26EAC7DD91E4296442225A5A02A2990B222BB8A1239B38F83A807F828683935682 -51A567B9F68558885FD32E58C4B22D467DC494F20A3428F68A18F0037E8CF4837FDD62D6 -EA3CB73E8ECDA81132256DD09F7CDE0CDCDBA85DF239F2671E0295031A3184F7A31F5F05 -A29A40534BB0E02C99089977172A469A12D331448D690EFA0E05099A960ECC3D9DCC4BE3 -1447F5D77CF9F59078307213D6666E6D9567AD8A341A10C93A6EE3C726FA3A730835E134 -C83E47BBFFB68A5B8ACA88414800FA1971F0B7162DF5EA90BCBDEC7B2C2916F4EB39FED7 -98DCE6D49E8D36A188A18596C02FA8F8B5B1C9C67BB8BB1369EC2FE51BD0E554F52517BD -5736CB8B581C4B083F891903EEC740B3F52F404BE51F26FBB90739620719C528DC56AA6F -185DE3A0145225AAF56C7B8B510F0B6C5BCE56F69DFC3AB39C5A9A6110C54B0C014BFED6 -06808B965E8B4CE61BC3CBE66BCB6AB0C53457E2EF94EAA1B05A3B9C459542579FC7FD69 -043E9A4A79E6688CF835BD981FF5935E7111EC2B4FFDFE1E05825BC54C55A06D737E1BF0 -5F332D6B958078B4F3BB7FB1952960F35C28AC9DE3B8A5443650A22DBD69F43F1008543F -AD0ADAFE7A2D4CC1158F6DFE38D5ED78CEA0E8B742D86AF575C3DD05E07339D95A52E7D0 -8F28B53F42E0EF55E488782D6DAC953C2B46C759D7AB0FD9D521B996B4F492C762250AEA -0371EDF1A6C892CC2AAE5E8CF85C9532294A7598152455F1229296BA051DD83CDC08920A -E0CDCD29814EFBFCD435FB171DC21C75B6765E2FEE6EBC57941C984E05C107F0B696839C -E94FF8D337BF520AB53FCA1CA456E5404EC1F05F71725E8545FE4DF3E612FC6C14403108 -2EDD3E5150943EF21E845230ED91BB60C95CA91F1389F299667673221A8680DE65D12BDB -1AFB6C7BE73520179FEAB41FF62A57B14FDE16CDE460F4FEFA016A555445C78CE88DD0EE -A01D49F22F4516E316BB4EB03E5C012291EA5A5314ADD2D16645075E84E50A11F7ADE384 -592EA0A2AFD06BF19D2AC55F9C7EF98FFE32747DBB496FE6A61F01BBF83E0AB9CAACBBA3 -3598EC42C422EE412EF1B1F1704E7E59F28C354F9F6F5B64E780EEE47370607120870DE6 -2623F01C4F8A46059E4DCDF4CCF5775F157DD756D45AE5AA6BD5EB415B04559796AB1270 -3CBAC585D4DE40AA03CF8DA7BA33D863EFAA0F7B990316A7351D9A533E2AB6576024DE45 -176D6823F31DC55A0CC29B5BDCFEC6C75F5D11D67BDFF15D083CA9CB9DF28DF02AE258EC -5611ED8D721FE60910CA5484A9F5DF3449F85D7F9900C61F4FB43617446E5E74E1849977 -0A0B686EBE371582B0F8B9D811F40D7B01296DD6D3DADFEB2FCE5DA4D93F97B38251626E -D3C9350AA320EB926688474DBBA786DF88FE9BB502AC65937890DF9BF4E1F20197F3CD40 -9B2F7766078FABDA9C535FE03BE36DF70FF23BA71CB322A9A18A88CE6ED79AB299A0B707 -6E180B8F282CEDE8551094B7D2AD13360CDD68E0F4B8488324C0ACE44BB04EF246B02BED -49DFA83A9C5219E88FF327CC0599177FCB71819B2EF4758D1D95911FEA16A6C50ED66FC4 -6B478A4DA493651F59A1F637C656AA6F8B11102EE41C33730E4BF7F400E6947A4F1E153E -2460624E874EB6BA5FDE3C2026964483783E1767F6E8AA12F646F3C47410F0040DD1207C -56F29EE16D2DD32C0FD73894A44E87E656D3582E3D615C6053E1B7B70E64279D617A958C -265B6BD1DE5F706ADF911D83972D46F929331C5BDAB2DCC47D10BA4D62D5B246F99A19F1 -E884117F99304249E8A87C6E6FA5083DC0F9E97626DA3E16AE4ED909D1B7E3A911B99E7D -9808528039AB0641948F10D793A2AEBC4686BD895773F143559DCFDCD6C09D4C1630E454 -0F112093F70B4C76C5D97D28E6FC8DFE2B2322E000404218CE03458E9196B95E63CD625E -61C03D7A4271A6A4AD5CB055F113D7F10C69E4F282B9D6EC5A60A901ED1EE9BAB97FD40D -33184163AA17A3F8EE9CADB38F047772FC8D39E3BFC7C9F5D0A3A277F7BB73C27516363C -BB23E8B0224234F7FC63206B19687CE91EE596D7F8921A5C7FB1CB746511BC9AEF5B6B74 -45CE95D7B58443C4FB4DCAB1F6819B94336058A708F936D38860AED70500373A4CC6A1CE -10F2BEF120E18CB10EF236457BD1529A5C6C2DBCBFB85F70F7DBDFCF25B9485E92C02108 -88CD2DD84215188B778BF35BF1381779ECC36974BCCBBC37D7999EDB9EC98C92D7C8BB3F -798BBEBDD852E320E3540C46C0371AF1CCC1F59D9C78A92F710C28A2B9707C8567A9AAE1 -1642EB8BFF1E9CE99B30A784DEAF11210C44EA275F137EBE69C197039E9D35A8E76C799A -E73B0D65EE4D1FD59E0E8B32030B6B4CE02E698F7090205E7B466C985ADEADB18CBCE64E -5074D90C4764823413CDA39DC16CE421D60F485FACA831FDC4EF6204894EB5B108734F3B -48E6AF64C0BF82E71AEC055DBD588D62AB4585555FCCF3982204397FB4BB4602B313EDB0 -B746734B8E6AF4FB59CA0457D45F6CA15966C3ADB050F7B83D75D43B2D54E8CF9604494B -7C712E0263E7154B31C205F51F1EFAE4FFBFCD5F522FD9E85AD6C6DEC091D7CD445F56F4 -A6D087280B252E7901A34EB4BA00206E4EDFD63FBDA45A17DFB1873BF8B6E82B4FCF7AB3 -CC1099EDE08FAE748854C9E468C9C8B8FFF239E366B4E8FC76048B0638F7FBB9DB80E711 -91F51D4CA50ABB65E361BE32D12605B10C8ACDCF2101D66928C9D95099C296B33651B44A -BF0EC9C0B7A6B686AC630264897CD3274A1E87AA8FD7182A124ACCE7CAFE4887E06A7B34 -FC7DF7973AEE69B8381047E2D254375C46BEBA1730FCC6FE4D6564DA9EA963D0B7D45475 -FBBB54BB12F389AE979D1F36E4FAE0EC7A1B2B7B86ECA42C85268E0953A461C8EE02C407 -FC387141C52866DB49D8BFCC065FD264E5F57423E3DBDF1270D2BB7DA6A860D22722E052 -3489A3A0B5F0E7E46DCBABBD89D3E4112A031B37576D35B95452B25B5CD04E18EF24FB0B -98A00B549599F3E924EBFC4FAEFCE504A1877F69375FFE7E9E7D2EE82CB2C80A87630A98 -88F13C26E568F5AF98F6D30A7C3E20695AFA9B2809FD646A8334AAC86B1020FE968085A5 -70ABD597C472F693F3EDCD5E88767D23293C1F64BA94029DA5921C251FBECA22F1BA47DA -142810A60CC9090E7996F3B09423D4D850C83F47B497E4C17718020B0DB9915933FD016A -D32B50CD62E6E20BC09646093ED3BA9F9D0AB09F5B6B01F69CC8F706B3CC3828B7794A67 -3F2C3CAD3A2EF13171C65111A9D34F0FBEA00FCD22C509FDD913C7DC144618BD743B3639 -1E4694442AA86AECC639CB1A857DEBB2D5DBBAC329C4E1AE4F095EBD6259D0EDC896A818 -829311503650962679D627D060C51C4A78E80BF764C7DF2121896E0B02E74B9E65CA2CD5 -5A6ABA7884C961B474FD4AB32172A6E070B29FBFBB424417D6D1F89F6A8BFCC880C82C9B -7C4F23739259076A57B3BEA79878839E3C0DA5FBC47A52B81724DBD303C58B027F1F1D43 -2DFE420EA7C773BC0884909AD03F7793F40878A46813EA207D855FD8D397DAE056F89394 -602DCB1174532DEDAA96C5907FB020BDB735AFEF6896EB193CB16A56A3274398A20A503D -B1B66729D094A21DD45E12511715FC962E0F3238630954BA513374FBCE28737B80CEF5B9 -802097BA8D3BF8BF5315838C014B08D9BBF849EB92459D04D0B735E487858E333E140CDF -71A6B463EBEFF3A86A5E1AB29902A14DB4C72DD9FDECB05F2EECDCC4314A600D6724FE39 -7478CFCC6478622A8441B88BBFF9AACE6FE02E7B96B09BAC4B90A65F04AA6126304339D7 -E450C24922FF6F3027FB0F6AE9C19BF3C633708255E1E9F06B8245485273A72DB47FF9F5 -E5AB05B1D8518691885AFB8DD3350D9305C4DB91FB120F666DEAC0AE0C64EB19106F386E -E8A848CBCC9091EC8FA9004353981D5C214D920A07B439E78EF98628E1C0CF014D54F271 -349676D7BB0E41418A67DB24F36B3D8953A73D18E95DA0645666B485DA0061B2D49480BD -C081AE8CE6C696BB8A7224E933FAECAEA2C09551F961556F7D1314A869D1E698DC887BFD -F0E57FE8459FB5B1EABC88F50FB6B3BE5B6DEED96854201D97A6A199F4C5E0929762832B -E47A897217131F32718E2FE87A2A5CAF8594242C504CF3C86C73B68C09B05DC02F428941 -F441110CEC6283 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -{restore}if diff --git a/fonts/Monospace-BoldOblique b/fonts/Monospace-BoldOblique deleted file mode 100644 index 880b52fb0..000000000 --- a/fonts/Monospace-BoldOblique +++ /dev/null @@ -1,2445 +0,0 @@ -%!PS-AdobeFont-1.0: Monospace-BoldOblique 1.15 -%%DocumentSuppliedResources: font Monospace-BoldOblique -%%Title: Monospace-BoldOblique -%Version: 1.15 -%%CreationDate: Thu Oct 27 10:50:21 2005 -%%Creator: mike -%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. -%Copyright: DejaVu changes are in public domain - -% Generated by FontForge 20051018 (http://fontforge.sf.net/) -%%EndComments - -FontDirectory/Monospace-BoldOblique known{/Monospace-BoldOblique findfont dup/UniqueID known{dup -/UniqueID get 4092906 eq exch/FontType get 1 eq and}{pop false}ifelse -{save true}{false}ifelse}{false}ifelse -11 dict begin -/FontType 1 def -/FontMatrix [0.000488281 0 0 0.000488281 0 0 ]readonly def -/FontName /Monospace-BoldOblique def -/FontBBox {-173 -1034 1654 2157 }readonly def -/UniqueID 4092906 def -/PaintType 0 def -/FontInfo 11 dict dup begin - /version (1.15) readonly def - /Notice (Copyright \050c\051 2003 by Bitstream, Inc. All Rights Reserved.\012DejaVu changes are in public domain\012) readonly def -% Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. -% DejaVu changes are in public domain - /FullName (Monospace Bold Oblique) readonly def - /FamilyName (Monospace) readonly def - /Weight (Bold) readonly def - /FSType 0 def - /ItalicAngle -11 def - /isFixedPitch true def - /UnderlinePosition -221 def - /UnderlineThickness 246 def - /ascent 1556 def -end readonly def -/Encoding 256 array - 0 1 255 { 1 index exch /.notdef put} for -dup 32/space put -dup 33/exclam put -dup 34/quotedbl put -dup 35/numbersign put -dup 36/dollar put -dup 37/percent put -dup 38/ampersand put -dup 39/quotesingle put -dup 40/parenleft put -dup 41/parenright put -dup 42/asterisk put -dup 43/plus put -dup 44/comma put -dup 45/hyphen put -dup 46/period put -dup 47/slash put -dup 48/zero put -dup 49/one put -dup 50/two put -dup 51/three put -dup 52/four put -dup 53/five put -dup 54/six put -dup 55/seven put -dup 56/eight put -dup 57/nine put -dup 58/colon put -dup 59/semicolon put -dup 60/less put -dup 61/equal put -dup 62/greater put -dup 63/question put -dup 64/at put -dup 65/A put -dup 66/B put -dup 67/C put -dup 68/D put -dup 69/E put -dup 70/F put -dup 71/G put -dup 72/H put -dup 73/I put -dup 74/J put -dup 75/K put -dup 76/L put -dup 77/M put -dup 78/N put -dup 79/O put -dup 80/P put -dup 81/Q put -dup 82/R put -dup 83/S put -dup 84/T put -dup 85/U put -dup 86/V put -dup 87/W put -dup 88/X put -dup 89/Y put -dup 90/Z put -dup 91/bracketleft put -dup 92/backslash put -dup 93/bracketright put -dup 94/asciicircum put -dup 95/underscore put -dup 96/grave put -dup 97/a put -dup 98/b put -dup 99/c put -dup 100/d put -dup 101/e put -dup 102/f put -dup 103/g put -dup 104/h put -dup 105/i put -dup 106/j put -dup 107/k put -dup 108/l put -dup 109/m put -dup 110/n put -dup 111/o put -dup 112/p put -dup 113/q put -dup 114/r put -dup 115/s put -dup 116/t put -dup 117/u put -dup 118/v put -dup 119/w put -dup 120/x put -dup 121/y put -dup 122/z put -dup 123/braceleft put -dup 124/bar put -dup 125/braceright put -dup 126/asciitilde put -dup 160/nonbreakingspace put -dup 161/exclamdown put -dup 162/cent put -dup 163/sterling put -dup 164/currency put -dup 165/yen put -dup 166/brokenbar put -dup 167/section put -dup 168/dieresis put -dup 169/copyright put -dup 170/ordfeminine put -dup 171/guillemotleft put -dup 172/logicalnot put -dup 173/sfthyphen put -dup 174/registered put -dup 175/macron put -dup 176/degree put -dup 177/plusminus put -dup 178/twosuperior put -dup 179/threesuperior put -dup 180/acute put -dup 181/mu put -dup 182/paragraph put -dup 183/periodcentered put -dup 184/cedilla put -dup 185/onesuperior put -dup 186/ordmasculine put -dup 187/guillemotright put -dup 188/onequarter put -dup 189/onehalf put -dup 190/threequarters put -dup 191/questiondown put -dup 192/Agrave put -dup 193/Aacute put -dup 194/Acircumflex put -dup 195/Atilde put -dup 196/Adieresis put -dup 197/Aring put -dup 198/AE put -dup 199/Ccedilla put -dup 200/Egrave put -dup 201/Eacute put -dup 202/Ecircumflex put -dup 203/Edieresis put -dup 204/Igrave put -dup 205/Iacute put -dup 206/Icircumflex put -dup 207/Idieresis put -dup 208/Eth put -dup 209/Ntilde put -dup 210/Ograve put -dup 211/Oacute put -dup 212/Ocircumflex put -dup 213/Otilde put -dup 214/Odieresis put -dup 215/multiply put -dup 216/Oslash put -dup 217/Ugrave put -dup 218/Uacute put -dup 219/Ucircumflex put -dup 220/Udieresis put -dup 221/Yacute put -dup 222/Thorn put -dup 223/germandbls put -dup 224/agrave put -dup 225/aacute put -dup 226/acircumflex put -dup 227/atilde put -dup 228/adieresis put -dup 229/aring put -dup 230/ae put -dup 231/ccedilla put -dup 232/egrave put -dup 233/eacute put -dup 234/ecircumflex put -dup 235/edieresis put -dup 236/igrave put -dup 237/iacute put -dup 238/icircumflex put -dup 239/idieresis put -dup 240/eth put -dup 241/ntilde put -dup 242/ograve put -dup 243/oacute put -dup 244/ocircumflex put -dup 245/otilde put -dup 246/odieresis put -dup 247/divide put -dup 248/oslash put -dup 249/ugrave put -dup 250/uacute put -dup 251/ucircumflex put -dup 252/udieresis put -dup 253/yacute put -dup 254/thorn put -dup 255/ydieresis put -readonly def -currentdict end -currentfile eexec -1CED864D422F76FD8FAEF6132F502482A3D8B4A45438351BEF76DE83DDF4E51528714B6A -2E0891A07E6A4C4AF06631204074926585455A5677B5DB36647E8D4B74F135293000FE37 -CEAC7E5D7112AD08238B10F0A7E8C6B22250EC0C3AE0CEC1B5D58D6CE79A5C9E8AA78533 -80CBA7928F215BFBAB9974AFFD4EAE72E2F13FA51DBB826B3345FF4EFECC42059C923D3D -744770EB5214390157686984CE97B7A323A282FB3942AC23170668648757127D1F629DE9 -F47CC4D8B96EB65B46A5F601947908C6623ED3C619000369C9E67729C539451F62FC5580 -9EE2C0DEDB3928CC0FDD6D955E88BDD03D1ACF344F28493FCB53D4FC1B863FA25220FE1A -1481C7750500555A9BD2D8D14147C9F8D44BF71EF40F09B0A188725D6B400C688671D7B5 -547DF767FF1075536B17074CB44E973ABC27A9494A2D5880537C8D53A2C7262E53EB25FF -C4C00E380FF2F8B0A0D33A03BD016174D197257B13A27D23E9EFE76CC0F6D8975A0015DA -DA093AA1B08F2BD290040DBD6674FF79F4718DA59796045B4D8091C39F6B407D5F2715C4 -E5CCF1F7A8909DC995C81CB305B02836E96488ABED0835D20FBD3507AEA8C9B51EB85BC7 -148CB611417A4A894FEB958C0CFC59F6359567D6A13A0D01A7AC80E9918450DE949D19BE -31C7FFE9CCB6A9980AC3CFE03409367CCF926A75F8CAF8C2BCE07AE51FA505E0EAEDB20C -4B530DFF7DABB79822CCAB90A5366E32840749B94EF996104D44B3E13E3EDA856C4CFD10 -3CE65A33CE8A22AFF27E081A93AEC929F7766C0F1F8C8A5414D3BB4C46F8E791D02C1710 -95FFE94019D62F166E3EDBD88B350E8211CFC504E546F14016DA01DFF478C25015A6530B -8D38CA3F7AF4DB3B8959EACC030207E8239C17E351E737F58960875256AE6BF5094C042B -F753341EDA79F533F602F673B803394FA140B5F9E0768413A9EA96961CA0002036751C33 -FEFB66DC4FF30585349AF7C9924B9C94E20DD44381028847816BE17FA4D554B30A78AF24 -11318819B1553C659F9866EAE2C775A9E06BB5E90AF8B32B1A7BB290EFFA41F5B5033C85 -401D3B85F125D61EE0B245E0FF52B1F46CA409A86A88A8E40CF38BB9940168BF936734B1 -F45EF8AFE5BDA9F613972D9F61EF5FE3F8D4D19690C2AFC60C3FC4681906BD2570945EC1 -8B6161A8A960546C23964E2B005EB85B4146C5EA93313E99557B8820C6690E945AE88661 -AAB10C0D47BD67CC00C03BA82A04407CD9B692351FBA25E75E4486A21D9A0542762D5A64 -F8B1B879A11EBFBCE426F221372C7DA133D7CC2B2C0F9E6F269B3DDD14A4167F184F76BB -F0A6AE68F88340051B93CCAC09BBCE3A674F684ADC4F2F5D121A3CDA013FD031637EADC3 -36D6EFF295A86B54867FCFE1F05BF5A73C737040BD3B1A0E924193B83B6BB378B2453D9A -A3D53B864E1EFA1822D4D2EAE2B310A42389ABF90F4D439E0DC7CF34E8B90439EE25C677 -00F9DD5CBFC6DD5681E3C79F26089F6D569E0F07CDBA2881D812766439FFC0894C0E191E -054AFA67FC1B1AAC7ACDC5B6D710F1D0D7D6EA32937FBD67CA71A1D5C5EF59A3C0D833C4 -5F78B126A88A81E73971B7E12AF16C4B23086F282FB309755696851DB9685FA9564AD878 -BB22CCFFF759CA65A594FFC2FAD61F774BB8450A09B08631B1E808E267E855F003A5B951 -D8B4BB325401E199F57345709782E2959757EAB5BE7AD6B5BFF17014E3A1A8382819CE75 -EAC4C68377FC032EC0D74603F25A2B1386F7FEEE876467D0DDEE2B2B9D03E25F32137D1B -4A8F90BBA322636C8571B6E215111579F95C346171C8BFE6777B081660877518D1B44917 -ECAEE307B68D51DF094AAD59DDA212747661AB31A9F31392C4EEDE462668675988A83172 -AD88BAFEEBBE500AFB2A4D9CDC985494CDB271AA0741C0709A2A4991B5EEC213F3BCF107 -E6EC214DEE85916ADD3440AA2A7D24F0645E254639EFD1AA093BAE93015A7FCCADE66817 -F4AFF9E5A10DC390AC33D707D8A8401F93D0318626FB23F8E6226B5C5230FAA6323C32AD -9F73A91ACC682BEF7AB3A99347316812A926E30DA8AD7CA702E52C73CC37D8A2F8D3D679 -D2F4F17419B85D061833B63DDCA501DB6E5FE81B5F8E601C59057D912CF9163D1DDB4237 -6D4CFAEDCF4E4F66600F71D7C31061A9846A0F153536DAD78AFC80AC89DFBB1CECE4D89A -DCC95F5E7E03A41A6BBDEAFB3372ACF32ED1D5DA6CF8A768812D69620806585686FF6658 -81AD1D1AB17E7282E6150A3EB40B400ECD78E202FA63A5508EC4D6FD78EC3998991D3829 -B4CAF3B7714AADF0AA04D5239F5BB40A7678938E493E6E58BA9AADAC797A8A7AFAF594E5 -82CE777C987C6E9B4EE421FD1E44B7C3DB349621789B8142C2773C049CD999E3BD26B634 -BC86CDCC6F930EAC04C71A25E8A2D1DE3539C8981723ABBFAF835B9615FA36A3D89E1502 -F46C09FE21AD93811C447461729A4283E1C865419A5437973C07F830FB3645906DE1EF79 -5A4D0DA6079B77C3D0CC1D1581EB24BD9644CBE0FF57D58295D3C1529F95B61F21B4480C -9B1FDD14B20A776EE20F18FDB5A595778724CD68D237057519E58622DB09E9F86D8FDC28 -1F5FC5BDA84BBB46836244A7510737F6FC411F39FC9A6EB3FCB5D9541C7B3410F60AA52E -FF65CD9C4D20B21CC0E16A7DF3800DABF3475105AFAF14D2CBFE8C4A0CB98910441699B4 -B7419F0F91E4E7E68F6AE3640B4E82A52856FEC5D51863D14CC9A7E54DFC3F18EA6FE05B -DDA764A8FFB62408BA412567BCD78692A562E309C2DBCD900AC231610AB97A7701B98440 -5EAB031BD3922A9B29AA0A38BA410AC99CCA246E324FA59BF265924EB41343043C2D8CCB -FFE1F6EE81437B8C256179A5A69D7C0BAE4F13C59D7356B0FC9878D14CC9F1882E68EFB5 -0B324F590A76A19F01520AFE617A6ED645A9BBB0D4AEF69A01099C2F7F93382700E3C7C1 -2862E5289B66EAAB1DBE13802C29D11452A82968592995686EB09AC67B64CAC41E9177B1 -1A21741097ED55CB5F383DCE927C5EE5FCC13B261589586DCB03ACF7E74C67606A71E235 -A335469B97FDB6DA8613437685ECE63BED792266DB50ECAFBF082DEFE04803CCCAC08B1F -47D3EEE82D635A9F97975EFD80A316371ADF86031250077B1CC0F403845FAA306ECCAC14 -A194E85663252D9FAEA449B2A2AC2C76EF828F9EEA8556CA4057EE0BEF356C1DCC76308F -05CD254A737EAFDF2912E74C38C3617EDAE3969A03B01AB3254C909B93979E6226E20D48 -69B44FE0F9D8002A02ED206544DD099567DDA0489BD957DC14818C7CC1264D405BCC9E9D -A31BA99C5A695E106794694B7FF847497FC8A7E961C57CE3959D71253007B8C2A6733FCC -B6E43863F782DC8D37C60A226D46AFB6176C9507C7837C1DD2E23559FA1377794CC32079 -90FD6E0EAB77096F8C4896081B5203495207EE8CFCE63AF48840778C1DE08A449953DF83 -D5EC0B82593EF1D059D2C5B9350F21AE58BAB03F57A4CCDD4D4CD8CAF475E0315CA8612A -C3E66CC597DFD5F4F53BC6788B84C1E2E8A8AD02FEE9D9D5F7471508D7E3F447F55EB1D9 -D54EE8207131F8FB5B2A394C0C08F35E8F93AC9E0D0F93A77C28F9FDE8990CAB8E3908FF -EB8DC0EFCC98F88315E0DA33B6C6B4B50B17661DE788C1A874BCD2407C3047DC79DD6650 -B6908207965CB5BF7E7B83A7030D30D3799F406C9875E3CFA9A42401CA2C7115B1446472 -4D38382EAD16C042B8F2B352F6A9FC7FBC2E488BE6A2D97FBC1E643FE4CDA2097253798A -D26DDBD706E4CBC5661BD87E5E488960F643A960E9DE3891163276B377FF96D9D2E93B81 -17DEC91E5D3BA80B14A699C56E8F48DA2EE0A8DFC2C981B106C70E0766CC379D97653EE5 -465EED2B6FEE0C1CD2F4776D30E08EEAFCC427D6420F516F9F0CB3C060659C4CADAAAD94 -40B3FF65406F49F4174C2B0C606A3B03A8BE0F7767139539BDC38B93965ED44BE4E2A53A -149EE0D512D37958A9BC369452B6A121DFA0BAAEC6E9F6E00533AD6EF857E662C7FF4AF4 -5B7732E3C5A037E3A752682EBA6976330FF3FC1CC6271EB7B2024D2B00386A8A5737F052 -F98A223E309E457645E4D1C91B59E827C451D0CF32DC3B3D725BF5E325F9D2CC1994C319 -2B4C1D05BDCB87122F41D6F72A762FA45509074D76A32974ED953C5257F9EA335152E96C -1EAD2DFC8B7A85B5DDA1975EA400EF5DEA8F43C82EF663D3E5E122D4EB1C67E7E16CEA46 -F12D63DFECB85A84C7B77637FD330F89503DB4B342124ADE972AA14D81F492A5695225D4 -39A6EDB80209D1A49A7B393D00C1B5429DEE9D81EE2E7570A5E244E6457612C61E3869BD -772FB5CCCE59811D7CF516105765ACE6B68061B1B411FE664C84A767F66238231C96159A -21C3CBFEDF73F3B56A25264CD5FCFE91C36977A683B369716D6525FDC97E5D2828F26961 -292D8D5F7279E6C0C87F89827B1ED97187E3EB9E3ED021F23DF98790F5095C6063E144B5 -34FB190D15B1DED675CF8CF5C8FDA3434844ED1BB8E1D93F43D5829E6603AB001D423EA8 -279972CCF3AFB4BF776483A41C607AF581B1031E6DA4D716B7876D7785FA7DA4C74DE445 -33EE4B832B5B27154617AE7C5E32F4CDBEFA77290FE45D80011C0E7BF5BDE91A63708F0A -FAC6D6AFF5FE1EEB23C187EF486BE3E8EB042616A4763634BE5B4CF31417D6B7A807A3F3 -C3A6F6C285A7C7BD46AB63CA1F9BBE01A4E8E98E4CB44D2F26CCB99A85402F0A474E531D -9675475FA6F06A7347FD8FA30BFA67ADACCECA881CF703E2E15D8585A9EFE607E311922B -D9F0F8B7715021C9A90986D4C0E681F024CD13CD38A34DC8415FB96E6DEBA849D1CFD157 -181439E3C004ACF2D5E7C40F2366A89977662CC8D0C0CE03E77F77696871B7BCF85DEF44 -9F1DFD9A9B4F68B870A1ACEAB20CD407A27C5B75533A08CDDF6D0C97650EC5FD4AC0208E -07C59FA798DFD38FB86AF3E71503F76634DFB15F6323927C87AFDFA9178D71391DC51E76 -75BC787B749BB53926B0BA5FDCFFB241AE27B036C586CCCCFA0896D78A63578A986E329B -DA9F0E5EB0C5C1DEF06FD3667910600941AA707EF6EA9ACCF721C8DCF7760BFA32E3D5CB -86E79CF66DE28D80CFF83950238BA7EAF551FC3A8E4EE0302C840E7FA11D2F1BBBEA8EEE -94C313EB4B47975CFDB214B3134711BCD1F2E3ABDF11E591E9EABFF57C226CA83B3DBAE9 -DD3FC6F2C3C4777E9B5479A7E904D0E1F7D36CDFF6B32323E4218F8CFD5EF467865B2636 -81FFD990E58EA69595D4D86F2122C52BBFB43650FA8145B1B6AF095541123E31E99B3981 -A701C47091FA0C752499D2754E3D6A2E3322730CFA4EABB60807FC81AB82D6A4C81949EE -75B45A30EFAD61F1984993AB44AE604BB045120D01CCC85B0EB54302E05AF8B5FAAEF675 -62057457ED730857620073F014DB40BDA7E41941A3FCB28A9EB2DA319C3193A90030F0CC -0DE63B94B68E7548B709AE50267036A770646EF39C64B31DB865D12A60E502DB4EB11C5F -F784708E3F670FEBB1888296C3753D690EB6D9ED17216471CD3C4D5FB8F3F6DA866E326C -58E8E892A3E6BF60ACD586D6CC8A0C984EB030E4C5E1883B78C4A04ABACD295FA292830F -2884504E35363BF69D7B2F16E43F5B94CF2CA934185C684B1F87108B58C0FA15F75F48AA -A03892283FD1FAB239D5A09BFA310E59F2244FEF8481E1494A263EC2E3D4CC5ABAE4E37B -D73F74559FF9B32EC960E5689C3E86033F1D20210FC448143FEF0C77809CF789F6B8A55C -F383BE3D85B82DEDFE4DC4480C508325A5D28216C097BEF9893103004E551D0516E05B33 -1408028C881732A82151E3572C279972EE0DA66503B2A7A7E450F1A4866B9FD0215B7BA4 -84C0E5B95276E6FCC43896D4222EC7ED7CA5A4D873D0E80523DA60CFED59C07C7704072B -8D988611AB4CE42D6F85CF336CD7FBDB4FD1B13BEF8D97BE6355EFBFC2F53E7D59E257B0 -F71B620746A03C7D7C5B2CCE57177F16490074171B8DC509297CD5E43B498F86C2BCB119 -8C408DC0DDC294DD2253FFC5B03DA71DBF93E8BF8E2AB316D852369AF766C92CB2C82CFF -4F9247BF252C7712AE3978F76F78AD8C9002426B3736257E92CED2337961A693797AD3A7 -3138CA2489CC0E2AF826E4DDEBBB1C1C2F07C6B98C721A0519A2CA6DBF7AA6CC5C1184AA -E5A05AD35274696A805327F95544D71747E356D5C1B83431FD8CE05F0378CA6BAA36E7F6 -8CCDA7246655D8866D21E21E63B23440457B8863118B7080AA83318B32D45756D17AAF29 -20A7DCA29679F76FEF9C33D543E54460506CF9254E16656E033D7558A09FE3BDAB6A283F -0A881A67E3FF025A92F37748527EC24A7337AAA5B6254A5F95FEE2380125D05A25A9BA64 -4E60FBC4C25C2AAC69CDAC16ED0D79188DEFF61692D56DD91481D11F6B6AF7C86CE24BA3 -761E2380974ED69FEBECB22EED4C4E244C635C52E0B162A79C948592CC6BFDDBCA26C8AD -D9A35E6EDC3D659EAFDE4C4F430133C337461E97D2460BB6C8C2550A500433C5F96EC312 -3044426764FD9EA134359F414F59105A3705DB72BB3199B0CF9240979119D7E0FC27BC13 -849501B45F654ED63F93B6D74590BDA5A019A93A397A59E9B8A41E5F61219F5884390F12 -321281D125799406F9E234F1133BEECAF2EA304AB4C313C902214FB7D7993723772C39CB -0127B4E82830DE0B9A7D60FB452F70F90ED4CD2D2628A132816ADED99B9F355D20313F71 -1B0586F2A20C90705BBE628F2C9720534FE780FF3EC15DE762EDFC86ECE91A1A9E530C54 -56A887921523806EFAB6E9E397838087921945D0EFDAD8EAD7D27E3C24B4BCEF2C8B92C9 -06A725065BB42F0DE1653DF32C802EE2EC33EBE5FFB0470AE8AEAEF3119ECA6FA4728AF2 -CEED07C5F5024A27EB62475A8254E8DD444685EBC545BCEFF63FBC285208350AF5065CDB -466FBAB8540D8679430793A202CDB44EEA4082A36797F4308F037F64739247389189E303 -F31A1AF0C1780FD9AADC74528533AC6EEACE64E043E09EC5BE365D706FBCB09338597286 -30962CBE409AEBA4142B80C11603B4276DF35E15E62CD9478711D2CC8454561B687C2463 -9F68BBE2659168C72BF87743E758D33649ABDF6A7A4F42F625B2F83A4F141CFFF14A661C -9DA1E1D045F6891F82EF2E548E11497164235049BD3E3CE707E99874DFCF2E912DC431F3 -7F9894E3C7BA894BF1677FA0F392BA9FB652BC93D898501C5E6B4E20FA8AC7CE6FDC9AC1 -D86723440BF06D420E78F5B32BEE9BE5DCAE455DF6EF63128622CD90C39B46CB9EE4F45D -72A5EB1512EDCB4DB7220E561160941421D6860979A039B9E5D5706126A3D65BB8F46740 -2332E34E1709298538D20F5BFD178A2AF0391E93672D1BDACAA87CAD9C13873C98B3BFE1 -D28D783690420FC7A88F50241EDF64BCAC2B64E2B0BEF2B5C646318674EAEB1A15D431D2 -1678A73D2165F9A356E648D47FB6B7B5A889391E194BF80550962C1E996DDE28AEBB2529 -6508102B534332948DE46D92DEA56C8D19A08FAD37A646BE88C0B6178F72FFA422F33D81 -D5C4F69504B96A0CC6FF3F4525E0F78BF4F1B27D7970FF1B2F9703952C823C0E99BBA0E6 -63E413EDA3C4ED453176723D3B91683DA70365774570A5E36C40CEFAF29BB91948820395 -B60D780E7EFF9BF0C7496905628CD5084A34D852EC665C81497DDAE2D38594C8556937E3 -FC505A281C3B582A9288EBC36E39B8A1148AE6B29B265016DBBEE8DDA7B0E9C7EFF37B87 -2E95507CCD7FEF306906F05B7FF2387A2AD253178616AFC3BE56667A9B1875C81D960245 -54B5B785D210EB8285BCA0D3462CB40CC8A7310567AB5C1ACFCF279EDC74DFC8863A0441 -897C6FC2C12B875832FC9CEAEF57543C65AE75987834B1C2ED9FCB266A9B8703C2F53E69 -3375F4BAC0C609D464FC164426B01930746D0C66516E02FA50A95B742A7117DD03D67414 -D40A0E37D0C9340181B3D689A09898DA6B4EBF8B9D022DEF18DCBB58D2AAE351488A28DF -8C01110345C31A7CCF136CAC367B7609DDF27B64326B1A93D69677314EB62E1603C7E522 -420000203B5A9014148875FFB716CDA3B0EE8558AB8A864DF11BD863A640FFE835E0D469 -F1587F32E5F329C2BAD5B2604B58204B7667397F349D4A5EC7D40F53AC32B5D493F8128C -295165B31A382D32383E1B45C12992EA246D677319AF5C09E2F540411404949A9825F62B -5A306FDE4A93720B5067B3433353F3473E078A92F433D8A3E7CDB486131A4EFBA06065A2 -97C4706E1C0049557496AAB1BEA12A9B7BC411608EF41ED6F3EF7288494B9B5B9728066A -F99B7AFDCF6C245C06FAB5FC1175D9816EB90FF3116A4040CD614F18ED3339C5828BC121 -550D55A8595E4E679F37A744926179453C7E27190D64F3284656CE7C0D334A7420275903 -F9C0889248ACDA0D646C1885FE98F4E2E9DA8353852DCDDC9A36DD4359723FBDD1FC3334 -E4F49C07F30DED223A031BB54AC966DA65C9979D32FA1F3E9B2F46EE773891A4CD8A9BD4 -EF1AF2763F1BB5A3F9067317D9B5BAB7C622F974A3DA0934EBA78E353E220C29FECF3541 -528AC86A4EE2F73AC9D38FEE530D517C00CF43377D607942F881613C9BE20B59D48AE852 -31E81B23EC531003D7505E6584FF64CE940DBF2DB3742B142A20B1C8B6AA07D9538D4E16 -B70AD1D7C07EE5BA566876C92F548A643A158096AE000A8C6E1948D46AF2FE91AA3587D9 -F39E0315C506F739461E8B73ADFD18B15285A15A6161491B7CD85F80C1C7240E35BA7FFA -40876F878B468DF1B50EC980FBC4C8C62BB16DC81A38A21ED69CD2AEA4A56B093BA9FC57 -1EEF14D429176852D4CB3762BA789C741EFC39C26606E93BD525C2850E99822BE0DA5CA8 -CB749B6A650ABE24C3667428E8DB1C790ACF96E0D4B48441B019D29D85AAD46F3FC6BB14 -8DC9DFFA73A5C6B041C48A60616850C31D1F648757E4ADD8AC4B6EACAA801A88D3043842 -6352AC493AD6D01C83BAA2B645217F62E167B30964B8493EBE3D5370EDECA3F75193416A -C763EC9318BB4A8651D858AFD090692FE0F3114698F8F7E729C5F0C20BE9EEF9E12AFA46 -8B77608629D6E5D5269898206BD5BB4D6BB72D97A959E793984D26012E4C5BF4B3D70C7F -43AB875FBC17E8CD19E0E56EE012782E73DC04B62B806142265938B4FB9B366B109921E5 -353E29F046F530734E2E312E953708B41884E50A0B4A7D2BA9A8132BE0FCF7FF5E37F0AE -7FB48513B73D346FCD60996A2ABC8659A8E93CF9A0E1135BBC4A438E71813F2C217744EA -4D42E3DB03AE3038CD53F8FEDDCDEDBAE5C69D7EBF6DD4A41A1510A12358D5DA5F98AC07 -DFB9C648B5A72AC100480E34D38B897E9390E223C1E057FC09AA828D2524CFEB0B36E2F4 -794FF8D66E9734AF0559123BB70725C1B466E5230C8BEDB01B073C10F4011D7C0F6F2814 -60A76371335A96AD7469C7C7012A3AF9E1BF900B64384B1FB1804CEA27DC37DCBB64B8EF -98BC8179AF176295DAE271D686E87D3B9DC68C138FB4F7E2FDD5962B35DC6FD46DD24242 -CC30107200FE6F7730D33F274B6E532FE791EBA9AA79E4049D3E406C74CE152AE8FD1BAA -96920AB1EB2CCEF4D3E3F58DD499C8458CAEC9FE7F1E91DFB25BEFB7EC37E53EA6A524F0 -6D22F8403643F13063D750BFE2CC05C32380A92172F9071F5B526764B3B98EA9246387A6 -09DB489CCAC4B35B07FCF17955B42ACEE5656DD90B6746EB8D11A8C43AAD98AE1EFF5751 -F313B455A66D646D83D4055FEF177C96DDB064BB5E6F880935CF01D146A8C792757F0CCC -25F3FF24869BA74D81DD1572901F099C6FEEC45992B8DBB77043A0527F628ABEE2DAEE4B -EAE37E89071761307BFE39AFF657DAC83DBAD2C5F602917213DB0C5D4A9604F37DF37C3C -49FF2FF5CB143505FCCB025002F292789FA6690B573DF46E2DD0DCCAF4F5E4369075E359 -5B999C19872053E9930701583E88627BCA93A11BF22CC6F45F440CE2FD768CD93B64ECD5 -4916B0764C459A2689A72E147AE9E66995BF88E4EB0DE2B9067D0FBAAA1658620F4B8F3C -5B469F5543F02D4DCFFBA5071BBA25C7D025C1635C5F5E2F72A850C3E5F63978689C3D55 -4F139D38F8F28E79D6C96AD77F03BB29A928F5C81FCAB3406BB16B427E26DD0394634FB1 -1134F07F316FAAEC79F04BAA0F2CC7D8BE3E76805500A40DB647A3AB774DD011C6D2D65F -03B4F2A45079ECE8831C28A4EB68F462561CF76650BD8000FB8971FF4ABD066FFA0C1E74 -6D21E35ACDE42E376A6C6488602674C537CDCF5F163101D4AEE68F0688E16337454C4CC6 -07D2BF89342B8F38438B6E4F142BC7496E17F12F7D241FE0653E8F1AA12BF5E2F91F6886 -20870CC5794A56888CC248E076DBC743CAB5B43D784D9C576755750C79F3116BAF053ED6 -659D9F02375AF7D017CE1DD368481271F3959A5F84F49B1D0C796F547A5DF8551908E48B -65E05E8DA081C69CFC95FD9889148A5594C1C839EC62D9D12A20B39D4163C193843F829E -6FA88926D80FBA23988EE8A69544A3B6D72D7B87716A963B4A9498E11893F19395D7DC37 -83FBE1AEDCB3ED86AFF660A4D3E25FA7F21848C1A8815334D443269EB21DBD8794A744B9 -7C9BA089AE6D1F3AC68615EC11DC1A6FDE19B1D732BE963890C6DE995CB4184614B3741B -A64842BA7486D4774D90FF43CAD4A6D8AB1BA46E0EB7A8812BB1D973F13DB24A043124FE -60C9C97151A8B582BDA433FFA3B9F734EEA35F1B86674150A50F75543D3BA208743F0978 -C6532B70CF70FD58BAE0B3EF4157279C6E9CA885CD1CEB3694A286993A238AFD737D34E0 -585C5396C21991883B928672AF8E7060F41EB9D955C2F3BBF7378E52964BB318920778EF -A1EF42EA6D8C53508A79C1DE7D85E0C9A292B820EF3FCF714BB533423A60BA1D5A084A35 -CE918A6867A12FD0C3B3BFD50BB025AA2B304EA290544A2758FACF6BC401A0391B070F24 -C3777E8D5DD438F24CCC919DA93C2D548A2279FAD56A845F4CE6A9912A77B202DCC77F45 -4A3B3BA11741E32D2D1C4F824978A078FEE972A6646FCB3843C655DB8FC065D66434DF6E -F46BBA42413CA88FAA9F0B2FFD2D753D6B891D8A6B75AE8189123A0DB91B971C00300F5B -CFC2387EAF61C367C981BFF3F0BFB148227E9A7DE7299DE595B027970CCBB78B0C524CC1 -DA29C98A769081FF8B2EAD1D01A97FB975C084784F33109CE38732F4B7BC2E89E38F7C22 -7E295B9D644CCDF0C3F899203C33DEEA916EE508679BC12117140BF786E118733EF50B94 -E8547E486E9BEEA26D42565201E05B4F7354989423115D89BEB2F1596F2458D7F248483D -7E1B4E359D679B0F4E1B2C73EC3C37373AEDC75723340A07B4BB35C820D69B0550BFE3B4 -24B44BF1C627C21EA62F4D81E59AE4FF9EE17315064544BA9908A49492439F5F4CA58F3B -82923CD1045F2A43449ED3BC3FE872A89A470857B1B0FFEB942D08B41E80EA5CD66FACE9 -94559A4A143270F8CCC95D2880C2206E0BA08216A85966E084F061B13887EEE5D335DEF2 -B872D0816C8923B106A629E90ABBC2016A819DB95E63CD4C7B56FE64A917915FB3E9E16A -E1E74DC608F123DC565D6AA5839F8FCEDCA33258DD1F2471C787E8DEF9FB417D33225428 -874680419E9DBB9479530B26C4385F3FBA517222155729798049856C640C8745A7212A4B -E7473EEF586E548BDD5ABFB34EFABE513FF7EC3E28CBD7521C8AB00FC7162D85E7D9515D -E56C53B4BC1FF18CAD6DCDF28317F32F5DC5A2D9F3B15616165F15D7757A05C4A7187384 -1261A65046B57EEFDB367EE48468EB4BEBD7A67368DF534C217E3CFB16F15CA97B986922 -B078C7B76E634EAC55BC29D2376AE295D49C9916F562ADD7823E23EC90CBE7395919DBB4 -6B5E21E56F9A5B204BF0662F68C49E9303623D847763A1AC888D00D7ABCF34C3401D2EE1 -59005343EE15EFB9D5A5A1D330A8D5EB442A1BB47C523A18F4733B76373FA37AF4234363 -03EC4BED56C72AB6316966E2FCB2363FF2D4CA597E68BCC3FE3F139C272C7454B85E9FD9 -E23D8B6A38159E91B587C2B5F01D75817B75315B989E85D71E52CA4F13497F8A11C207D0 -89FD55A01D3251D7553AF6BD067A65158DAA766E24AF513B5711A0AB231087315A3D97C1 -2B5E790F4488FDA7EDCD02DBC2FCE692DB6D56F16BBA576687769642F0169DC57DFD04F2 -FF63861E7C03F841F84AD6C096A57520694E536A26A19D977AF1DA8793C7434764FC12B5 -16BBCB418F59C91ED4BE658224960F0DB0C95879A591F94DC288FD475A32079D31E6C41E -808FA8D9968817012620E7F30F14B2C1C0A5BE47E647832CF3334F68F4CA0CF338223262 -1A0478FA29D7D90CFCF76D83F39E44A4A878000A6A252BDECE5DA448EEEF21A63695323E -9C69DAD5E67438DE4F7B20B6B0A035751A39FFBD912F4EFA1713546D0156C53BD3F3BFB3 -AD47F99BA96E0234178A7E980830ABDC6E8C5CE38CF0CC56570447291D422D9ACA5CD12D -D4444402FE14825BA95670755422399CE362805AFD38C923358F5DB8BF1078C3FC6AB6CA -E3B057B7760CD16F2EFADE9EA0D40D6296E4BDEB33AD023109148BAEB6307D20AD3F8A77 -F5063C8319ECF4E56586C12982AB630890FFB2158AD97B5AFDEC586DE615E8304FCA1C52 -0369FEBC2C9EEE9068A6DEAC05706FE7E024E8254C4CE5C7404DE853DAEA209E7D067F88 -571FEF20076CF19D6CACD0D29B43E04E132D40C0FEC8FD4FA9A7621BD18215BE346A0F5F -C6DC05175753865A2D987B947FEDE67B23FE2D3635C357633D57C90C41923F889541D703 -9399785BAA6EF2ADBFA1940227CFEF4448BA652201223FAC24CF955B98087C4CA2664263 -BE8746DFC29FA5DEA877AF83897FE2B068B061B5C05871FA675C449654E6AEAD3A8F896A -A3588948271FB7F9CD953144CD070DEF9F6CF516C8AD51B47B87766087329889670AB278 -9CF4A2552225A1C997BEE8C3D9FE338609022837E306282A21867ADCD56FA9763D34A547 -8C7C7570B19D04D6164EADCE146E617C85A122E9265746EF9A929CD2A9E341095C7E646D -95D437FD5BE233E352B27BD9A19D0FAE0FF524257DCDA23C6D5AADF460EE7358D4490D7B -9DBD68A72EBDF1D266BC974D7F56D3C89850C024CEE759D09214108D6916D34B407E62AD -89B402AC74F74EF4C0E96569977627C9BB63B6C6F536D1A9CB279B636EDE90A804F32254 -DC167ACDEAF8778B164E36ED23DB890438AEB44487E3355E536835BE443021621DCA9E4C -8C39A54F4B7C28716329997C1B0BE5CB5FFFC7E99724D5D8C829783D156155639D79DBF1 -FDBF3082B62BCD5A3A04BDD2D94BAFB7BB997ED0A6524DBB227EFB29BD49A240CBF7644B -AFA665795211AA5735F435336C88EEE7972E94505873F66EA6657AE8A1480119EC9896EC -EB6C9250F5BE682193B4CF0C9CBAF146D2A61C895BE6518CDEEA1E460EA8119433685E51 -87CC18A77BAFB8C8C411EEE0CC655631E7ECFDCE6C59B397C9D568D0EAF9C6C540E508AD -3CEC230FFC326F1D9570218D51591C335D89BED38711EDDACE3FDB2F667B1107EB410283 -61F09D4082975C1EC481504D446B0284D017F96B94FA8875B08B11CE175C1CDE5D0CC9BC -93202FF57BACADCAE11ED701021E7720B88A78AFDDD6D71409E4DE4EB766970C87E3D900 -76EAD2457BD9D819B99CC7B0AE137CC3E018F0EC1450E91D2ED5BDB94D86BB77BA4F291D -8DC1443FDD001C7EB25B09208B92FA8EA31CD9D0A6DB0059C0B4643D898CD15CDDCB211B -885155CCF420E1C62B867A923C1071D1B4495FC4914D957D3208D4C0EE082C898D74A063 -2B60AB2D9657B9F510BBE6A2B9AC95D1192350183541E598FCD52B811F4543A1CF25A85C -12F9B4E51CDBB6067286D7B6919EE8BEE3B3B6C55BA28AF9E7604D13148000CC0C1F2619 -DA17AFD8CE1DFE099B7039FE71D8F6439F0E046C72F76E2CE69E7D787C9AD548563517CB -72B57FBE712261D00FEC755C108E9020548F4B49D805FF248370459EB32985DFF1BFAA2C -E0EE93D945744965FD6945525C176FD953B5394E521DA5CE283F147FE0A538C74F326BA6 -60D9721EC2A777B3F9047EEE5535159EDA109AB7CD240520DB61BD088FC45F4A0EB42614 -4AFFD87C7C1DF28DA381BA980D2B144708F7E471230DE98BB691D78F4D8A72B8CB519474 -9D392D4CCD79A03DDFB93F8A8163BD07FECD4851EAF615A49607385852857FCE90F3E499 -3056B7E80244FA21F488EFB3341095E684F428574DDAF149AA105863626B4952129CC819 -06D28957E534DDB5C030E718CE15C9561A04BF18A0F3785CA6ADBB5E2CA74C9166D95FC5 -8537624A9B0663B9D4684E64D1C17BA9DE128EBE66E057FD3CE3B5C7AD929640C7B26B71 -48E82F21A36B86664317A1412DA80BDF4C867852BE5E650B772F6DA9919F32B96860783A -AB469C9C88A0BA958D3986121F396C4D2183D104DB5D0382A846DF7D40E195182CD24C79 -01C1A9E556EB8CCDE58C61E44E7E80F37568AB5858AB86FBFD0711552F0CEBC1F4A4FB1A -0D55986B73B49D49911008851EFB478C9E93BE7A1AD4E10FE0222432F64329B0B1577D3C -E603C0B50AEF8FDB39804ECF0B566C2757DF12F65F3AEFEDCAD98A6B9DE485E0E96F3974 -FC7B196065C86992DE0BA6D4CF123A0CDCB94CEEFB8420916000F18B643DCD6A48FA32D9 -F5FA37D93CDFAA1BE4D95FB3D597CAF2EE196814A3B2E30A494C70EA193DF6647D96DF61 -BFCE1C5043899E5D33176B746ED3F555AA0AC6A6057C0D1B2D283C33142114CE60DE0811 -A8816D22DDE6BC1854B6C8930A5FA6496769388FCF338446838C3FD937C391CE06946181 -83051E106A440443F143CCD973B24B9E5D27E384853212CA4AE98C16B49A4A311A7759D3 -41B4497DCE2627B7D6E4FFF124EDC45B2573371C034707AAC8CD3A3F9547534422428B11 -6F840382D0D36802DB6386A9E73B4E3E4D3BBC0FD636A9F21967B1D550D727CB401598DE -144B1E04B617FBBDE509F475F0F2181C0F0C6C3F49228D0859269839C52FC2018CDEBA3B -51108199DDC78BD12E55B48B557E07797FC27BD87D41FE591E26F284B3E80C3B6B4C227F -25562C846B64143CA3864C1974777D33EB196C29B3391D658208C62B8D0679C5A2380B4C -95CC97B4192EECE50BB950FA8387505E858D309FB172A852DE81ADE4F7B7D1AACEBFE2AD -6F0106EDED3D7EED9F3827929B54C17364D62141CF95137DBC1EE377FAEC39147CB344B0 -94AFBA1B7A0A82D41E1FC63DAB168534255D02890B465F496A2625CB78E683DF3B64060F -255876747A24DDC01E0074211C23F8E28DBD6A6A0FE90C42A35983A92EC58F0383124C88 -9FB29494FE686DA32A5140BFB5E34941EE0A436BC5777AC41D188069BAC81E7E5A76CD21 -3D5312E317771DBE5EC3A6A3DDE1BF1176C051E8949CD8AEA5B12D67B8EF50C3ACB62E11 -73B9C04AAD76EF38A14E2974394080439A18C0194676434BF803672E115B12401E2DB0AC -7DB89D1D784AECCCE8B0B1541D3494A3DD019EEE3600C839B16070F7373244891AA199D4 -5AE86ECC513C403991885AFB8DFE85B21C3290DE9277B6BE583EDF324C3DEDE193B1D568 -9977EF532122FE8592BE4B649B773685A6BB1EEB7C9A7B00F123A4DD784F52A0D0A88FC1 -292AAC4EED21D1669C7BF24448A28405A6D958F702620DF8DEDCD899B7D88D9E8FA886E3 -87E91ED91318B7C0FB7353FBA22DB282D8AE1EDE64EFE64DD31D2CEC0712454C66502976 -2944EEDCB22AE9D3ADA5D9AA6D49004F5FB72CD0C6594D7D51F56FD7DD5FEF94B0CF6CBA -C823B03E69EB1F5A067C384EEE3021A4EC292CE7A87CE3A068B51DA6C9BC7A5293553DF3 -21226509A3F95ABC67B047D344BA7595A2D6210E748968EAB2999E24CC2041D1FEB1B7D7 -CCDB4FD8E57E1DB84C47F072CF15CB9425FEB8CEBA0C6A7B807CCD6A640C2DA23990BACF -69E414FDE169EE9DCF25B85463CFB6B1212A980DF38301DD90961CA8B53AC3E6EE9FF9E1 -54A3DCA66C6644F75164B3DEF201C66BE4D54F108A27689C79B0384070151567A306DC4F -61E6A5400E74429CA8F6CD35DE63EE5D81D30EB252BC34D99255BBDD7333A73531B4176F -104318299AE0FC04EE26B4B3B70C39AE5D96A968229113A6C9605483A55AAE4E1B4FE4ED -C3E61E7E416F905BFC6E7B8B982919BDE420725B76E9F3D2C993DF2A9A71B62202595AB0 -A15C1DFE629AECF2BB6362843CC82646B95C88BB074CBD23361008B6A575B19E27A49D26 -CEF1C27B1DC89A9CFA5725E8C886D376166E813DFEC08ADEE5A31660B1882C4115D12B40 -2D62CB4CB1C938D07FCF89E61B352551AC0B0E37837EAF6AC464C58A79068B2C7FD4FC89 -D471C914D867EE903B948B64B0AB8E3F80CB1A70260E84418014FFDC90F20B07E7DF7751 -17432E151473F92B8D7FC93827D2A1F1A204EAB90CC4E493F962FEBD84B816359F4088D6 -3B9B33B4A2CCFCA49AE19EAD91C9A6D3079C1E0A167C874C16741F3A0243A88E45D1F144 -32B31A286B1112DDAB9E816DF3BBFAA348C75305099E610EB9CAEEE570506483383F3681 -C287B3ECC3CB25835A3594604EDC661BEB1E4EFCEDAD9E4B6B09587C4C2810550FA9CB99 -CF035064646F9DFECF48B98DB27A51B26EDBF083A7EA8BC696DE161CC10301FCEAB82E94 -FA5FB6707DA84B83D8007435F44B216B36EF71DA5E490ADE62D61DB7802070FEBEE23F42 -4BBF0521F693EA29A40ABE744C030FB428C52A4CABD3D5E43283958CF3924290884E1198 -E50DEA4BDA72BB3CF95A1FFC8508139A48AECE8FED2704BB2EB8851E3A7132DCD145203C -CA826F0453C71FC2581AAB287947A14425D928D75307080488E1A30224D933A090857214 -029F05EAC8F5724F146A5E5E6392DA33465082CF2FA942F83BDC6A6870C0585B1339679C -8619069983A6FD382142C46F2D63E4B129A62216936FFDCEB97A1C5A9575CCA5A1C421C7 -600AF4CF4640A41F6584D73B5B3AE1A8D98DCBB4F3AF7D2E7316588C1B3BD6FB3E1FA8CC -EC6C8A857374D1383B0C9D1D314A10EDECF095E3A4069E79A94DD59FE72639FB02413D68 -4FEB3ED14BA97F733516C88771DEC6C4F7AAC18160D7F1C85916ED3F69CC6181574D0C2F -AF7D3E1EFA05EB5084F4F9BF4DFC6A4DA0985918622D90860C8838C5B8EE35B059733381 -EA94BF0FFCEA70FC4EF0AF2BB2B5FC4BAEF9D0CEA3E8516323451D868F723D01E0B78749 -4A69738FB836BFEE328A0A4541A03012D44B4830F174B7E35B0A25086DF34532C428E41C -83F0814F0F0D52021F42037B4DF2A6759DAD05A346E019A0633745439D835620555BBA5E -136A950B9BB234C1B3450E58CACDD658FFFD69B8E87D4EAE015F5427452AE657736DE2E0 -D66DFF9E03E20E37B377AE912B90DF242285B89610A55386CB1BFD83652E6BA1DCA7D1AC -A79748D0C07475ACFC652460785F6D82D1EB593DCBCFF0157856D5799635FA3E129FC93C -71A23376E61DDE5014964C4554743312A14FBF83FE99739D6C9C45EA465A4B55EFE80045 -D1021AFDDA6E5E13925F3F69A19741615D56991688E0A794DB1534BB43F010A76D4E29C4 -ECD9A16A90A7588DA1C31500FD55E32B2ABA623524B1E4BD40259F5C746EA160C13416E9 -167D2A5507D8D484427C0C5153E0865241A7BE0C298ACB22E5A2BB24AC7F78DB58415206 -F1C435587D4ED941AB7335D0CFA0528409704BC8FDA106CEFD32B77F1D6A02DEE4B05FE7 -3DF87C5D95533B4983A7FD9C3FD2A3C109F9D1719C372B01073C33C5CDA6E20F91EE2F2D -AC11D4B111E070DD059698CF18553C4A9A8707046A420F9BC6A6C208906987F2F5883E1F -8EF30E5A9F78BD73AE6C563EB04FD51AC339900528D76C28AE2913FC28C4CF2F585876DA -472A01FE1934645BA0AEFD5102C2F36362DDFF6EE3B4A12B63CA06698F06A0F25487EE6A -28CEEC421948B856D0CD999682277ACB8EB94DD7D88F18FED1725C3F0A9545795ACA2B6E -9C44687395B6EF3B76806A500019CB2A70C07E571100B7FCF486E0D14340DEF49740B1E9 -65ED400EABD0F69E310CBCAE8714030F5776CFDB057AB354CC2F1053F84EB8008F455DC3 -9870CEB793F611999E33B32E64572D46CEB3E64E0881CA70C576E2FC07AC9349EBF26BC5 -6D4E84EA3C835070D0C52A41DF388C8FFC979174084133CCD6639B616A4A20DB37F2A437 -0EF7E9F11A14D28B18076E8321FA194D9070D1D8226B2911595E3567C156BB1624F63635 -24D1F3634A08E48178D1486C48243DF9156D63B32901417626676305F6ECF88998B46F1B -50AF077104C052E9A20EAE6924DE1DDBDC99FE3305F4BF802ACD8DEBAAF15A3F8879553C -B1F4B3D7839D6989775507FAC15DF1B0DC95F554B16E0DF685CBDBB41E4A852CF7DC8A96 -8DA449DD5966EED3F7802A7B12A95CEC94DAF052CADC2CA2D84D7A8FD9BD74F90F47991C -4FB5C5D9342C445E963AF1CAF3E5DF7AA4D483C9F8EF73CFE48C6A25889E3B5B71CA4E4B -0FF97995BC83939E986AD7F6B379CAD7FD04C46234D8F85A234A878939110DEBDEAE85DC -636BE2A646F64D9661844FFEF6D22FB15F5B38C129DDF372C3198992CB6C378E8C306739 -012DD4B486CC3148BA4498EA8C0149E59D4AF1E7A0C00E0F94D58CA91C0C4261F459A4B4 -2F8791E72A634D734A3F5DF66AF91FA8ECD4671C67ADDFFD2E2FD30FCC3EFBF0AEBCE786 -DC44B9316B000A73773D1C354964AA129D82722BE5C666D5DAAC7A087F1BDDEBE3FB9AA4 -CA53FB8684F87577A264E607053D5E321108EE9B8CE78600F1986C9F2510C8AE368BF871 -8C8AD6E2864E257E40602D3107ADF63FD9DA46BCDBDB77B5164C43C9F1D0A1E2A50C7C0F -7BC6B45BEC60EAF2FC74022B8F0463F39CBCCF2B38318C6EB370B7CC45AFB3C1350F2A4B -48629916CFF777829AE2904FA90C19C748BFC921ED3985BB03DFEC5E9E250321B75723CD -1AAFE40242C54B182846A979E80024A9E72029A7205F13157E57C5F40951623EF59EE581 -20E1C1F1EC93870BCDF45A74A731DC31CB5EE13F8C568E4C80C7D9ECE815610F215AE88F -7157CBCE990172AE920EBED45161194EF998C933252599CA45540855A0E4FEA0866C2D41 -8DA00464051D7C0E2E5932D7D80921BD7F6997C9FC550BDD83433D959768C0E35E8750BA -0AD159CC296B98CA650724BF9693E410AB6106B9D423AA2EE6A47DD102EAC9B74D66858E -FFA99A6422C9B5B2D466E817E8ABCD4E953A9DF9CBBFFE5748E6F47DCC8831566DCA5EB7 -26B68A5C1C575340F5D034E15209E7A6C5A3284F3720A5C197111539E4D3F4B3392D8F4F -C400E3CC89544B440BFB258003A6B7EBE045D625BB3166DF4869F2D8CF74EB7303F0AC40 -93C24843BBFCD9A617E2C7BD53572F0B61DF1BCF677B5439B97483C973AE56D0E206FAFC -1082F9B2D0D5F900F6575BD6E11FD0863577F4CB1277C1D156711DFFA1012EF22725D52D -0136939EF40B0F661853385E154C8660C3C472618E7115D705CD837DFB7C0EC85F8B0A59 -DD1564378A8CF2B03768B9CC5AD7ECA0DDDD4D405B0DACD6D13468C833DE9DC82271BC80 -E4A6357569407FB09C289458B2ED792D01A9BBC25ECADAA8F2955811145BD3D681834C23 -28C5E3760EA15AA03D3E0C4E67191EFA44E4A4928089E1224BFB0E79B5BA440E036007D5 -32CB8560DD157D60A5A690894208C9FCA54F32FBBF9C9BCB8A3A9ADCFCF2BCA1564290E9 -832C9E79304A223F60B7B58245E65D598EFC1FA06847E1AAAEC8BB3ACB454AB5EEB9265B -04589BB8FCB5F87576703AA3594B688F5001053D34F17FAE60486EA07E6CBAE2C6358DA6 -AA1E68A556A1E2B1B2DAEC2302FE04241CA53BAB74E4EF219ABB868FD624B519C70EAB34 -B5A953F17AEB07E867B4317B48B2DAC162B6A9EBFFF4910FFD8A96BDF6E501030928E380 -A6277590835C01A704FAF9C32907990804D0A1F70529C09742422B48586C8762D5E8871A -F91527187537526FA52601116969BCF7C4FF8A22446A184E9CAC17AF709489FA39D372A6 -6C3D580B183D1AFBD6A21736DE9A09F2968AE69FB587F4FBF7BF281DA926F6F55DB0430B -B45CFEBC493195A1B98F68A514C64483E30F22A7DAD69FA38ABC4B51110560DF23517214 -081F999A3F1D415D8993C940BC40C481F77402B51E7573801DBE672A8739BE239923B996 -23B97992EE35B62734095822B8331F69EEF8BD26FE6A6FCC0F6524CE9BEEFBF40D70DCAC -49BCA97837DD526C105AE9624303C120407740601B1808D28F311B42B2EC20E1FDABFF13 -2DC42A1EA01827AC85F44F4E24C9B72BC9EC17361053BFEEA913CA872A24FCAD6415C77E -59FBC9182B6E931C0580BAFE050432866D75828FBDC44889A794C63F0855E75CB056F36A -A4F5F72D64E5AC055EAC800972934F2534FBB67469E7E41FB8F5819D03ACCCDEE81EF213 -0E1A4FD88BC7074BFD5D83FEEC51C9D1AFA13EDAC699B3DE2595C88525891F2179D8A0A3 -650CC93EC86F1B79D135BCDF82E797480322E4115A5DF19F16DF7C2557D750347CBFF239 -979DBF0DD515FA7B9A12F57670103E579FE7E7A9E0608CA20D0CB3FD1862E99248035DF7 -008C5972B216D066B473085B42AE54AE3C4651E4961F412E7702535F351F4273A97414A5 -3FF91785AA3A90119E4B93B8BA0375207191A2EAF3600CBD3A2ECE12D8EAF640295AFFD8 -83A7779F6DDF812467E38DB5E6B5F1C1DF8B4A0B95BF02E5C5F896936CB4408BF19CB9F5 -58541953A868C07F1FEA9A3EE0CE28BA312C12336E4B1161A934DB4035DF951B428B0320 -5FCAF9201D34DCBA174888CA3EF9D8E708B7CCE5CC95ABA181B7D251BFD9D6B3D7358EDE -A8A32B7F85C3F2FAA6D2C8D08751CC807E719311621F76D554B7238E9BBE15F19A7102A3 -0F343CC0110F464BBE35CD3920EC3A3EAE89EEF21717ED7015359D47FD7BFD16CE001058 -0B6DCB1BBAC9FCB2EE435D6AF4284B0CFB140CFC4B7BAD83E8A5EDF7C27C3001225D1030 -0F48379F84B62D77D289B6F2CBAB0CB27B5B9F840EE86072FEE3A858A62753BB5550BE8B -A63CAA5AB5E3756451A79F6A65D6CAB3DB0FC739345392377CCA2661A58AF73837441681 -567C6E81C0C8944033A4F36D599CA915EFE4D03D95C245298D10FA0A5BC9E9569D84E13E -9653D44C827182AB29339203E578FB73FD1F1354142BF3D553A6720EA72318EE76E226D2 -AC788224721DD4522A247C18ECE489334991DCAE23D459656224ACD39B04DF5ED6A19375 -DA2C2113CB7B8696EB78522BAA320D94A6C04E9CCE17D07C833B6760173F99151D27C561 -61DFAF6BD81FC42872E3DC8BEF1472CD53E32271A997CEA4A057D8CB8DAE15FA7AB150C0 -D92A1A65CA400C436CA993854B8C18D78F1B593139F5F227ABB34E1590A37886467BB263 -14C735651C3245FBB4F620A013D98499BDCF3BFDD6F1923DD9701F295E50E4C3C74DCE02 -571B4F4CB40C06B325AE0D51CF1D9BA0892ED1DE29419E3B8D6BA907B54A96BB67C1EE59 -31E85906AD2C09A9A964401769446BBE07199EC8EA8E3947B5EC31AC7537F93C9CA4FCAD -771A110F2D3AC7CB6DBFBBC2855F2F360D8EBB53045AAB46D65D206F03E0F4C453FA6169 -1DD1171543A53B89A2353511525EA85A4A825F3BB6BBD2889CFB8696E89902EB0DDB58A2 -279D214EDD2E20E0DC1F06A02B09AE75B20DCD226D353ED6541007905383551B46C2802F -EEB4AB6DA75C2ABB220E8168268AA384B3D4F8D9CA591B6BADBC27E4CED9B4324B2C4C19 -80ED6D6F7792FFEA1BF7D9F4D5CF6E52120BBAD41C87C749C042EE247978B45A1B30DA2B -C2785D51B7E02482A095B8D8A3D2132F9C80ABA4508931AF7A99A07C0286144C4F666802 -A68D63210AD70C872F74D40F72547ABA3F4779DB29A4C86633E273B3DE4B5F52759E171F -C67D16C74D105780E2B85DAA2D13807660CAB1830AEB605CA7577743D01AB9D001A65C75 -95F576940C1D3E48C8F5FF569E6B17954E98284DAA7C062347F0C043D9B71AE0FE0554F1 -D2C8DDA86EE58CDB0D63C974812D902CA525FA81B3332E4A87A5261D6B3FF4FE11F44A1D -73804F9DEF69D93F195C05C8C16781252FB8DDE0C59687454BA4D7A3CF762DB5AD308A64 -6978CB14A6A8DC6570806D7016E3B7FC0FF01ADC1D983B8A720AA7882DC49442A7D94A6E -8F01E5DC1201D9D0747A7DE1500D7BAD256BB6992F5B5E1BEC1D88BA81C11F80F994653B -36586D1EA5B5F805B16438070875630DB4B42B0CD171B152FB6BA57E9A755F80F91AF208 -2832357ED13E723AEC166195D6D88DDDE42571059A5B8667D28F3CEEBF24002360F226B2 -9C6103C47D98A6A330FDB99A0326B702EEC1D3B8A118F98DDD07ADAF1B24470C8C465217 -172119E78D37FA0E679D3F4EB4BD103D821FD839127AF7A26042853B99C89049A7268D82 -DF8079A1D47144010BC562504310AEA3E2FE85D91CE43275B50FDA31256265A4C318E075 -2C7CC99FA1618BC3979A58399060CBD9C4C8C7D5455A63BBC4963336C5BC72ECB5245CB9 -FEB9D399E925F9C67EC1FFAF1B28A1071A58CAA3AF9ADAD934F4D1459FCCFB856644B2E6 -FA6FFE63D48676EEBFCFDC2CCD9EC64B71A30342D364A165AD365F82C9971C565291E1A4 -FB4A40806D264B5A3EA0EDD1DDD6972D5EE5A27D633D546EBD8D3B184D7740E519857AEA -F8E2108FA525B504780CA54567B09C188D5D960C2CB3AD7FF016955229DDD88BEAC3BB94 -C955A5A27029E2E76FDFCCFA2538DB7FDF8995A4A785630B22EB30AB37722535C95A432D -04B82EB054DD30227EEE30D77607A4C2BBFCB2F653CA8895DBEF75AEB36BC7A48DAAF131 -193DC36826ACB8F8F33048F223D6BB88DC9FF78BF729C07E70117D205D39EC03A0C89BDD -926E7CC6664ED8355F2EC41D9B3CA8B4B58A201BBE9535A5620FB6C100D97161F308B01F -5E9E22428400DC8F41D6CB367BA6E8CD890D0672E8506B4C6CB352AE06BAA26700E74856 -7FCBE12864C32480CA3A1CED87517146FEC7578E3DC027CF2A59A5A09A3CB76657362158 -5A1BD78D218EAC0B318D8C96F2594734AAFABDBB4C2B6927AD5299698366B1BAF03BCAB1 -E9BC91A11A33A1352BD8F7170AE64A116675C3ABB5840114D8E1208D851BA251C88A7764 -A90E769FA91AB807AC6777F777030BA02DED02C2C391B69282AAC1BD8B99F7F9BC778E98 -B2DAA85A3EF8E9DBDDB7887890B0B2310285DE0EDDB6B4628550AD5C2FCA48FEC21F1BDB -3C6384784EB6557DF3DBF585103EF3B0276C48154823C79224218011DAF0763BAB3A9CE8 -C412D7676245E96BDD47F2E79E126FFD8AD75139B3B37FB13DDEE30FFAE28F7327B859F3 -14E4514546B87FA7FD4FD545872FB0AE4F8AEAC3B882A23DAE3D98098BA60847B013CAC5 -6577FFE3D8A1FAE941DEDCCDC7101E7DFB0B17F0E11100A2947B73FD8A22341639966D6F -DAEFF59CF0508E01920C167369109507A6E7ECD9CCFC30F7AA87BA0C1C82BD959FF8C43F -234EC01C7E2B3AAF12F543FCF5C2A2077DF5E0E9E3A976F107BC8E8856427511FD5EA85A -BE944C72CBBB3DBF4C9870F2EF2FB3398449AED9E345A43E8A6B0A99EDAF4118C89A3612 -CA99B59D4BBF25800E147BCC6CC51D1B3239DBC3A15CE68ECE1F2CDD6D8732238A922C04 -AB8859F9255477B00DB497320B8017AC48BE9C10D2452A82BDCE5C37953D644D50761302 -FD40AF015C8FF79C82015EBD62EDEAF0C0AC637F54F436ACD2D0876390EF02E29A4E3B3F -59C7B3E1EDB64B75F0DAF5B401015114F226BC68E31187214A69EAE0261DD7DD59B033D9 -311A2F01E44FC47F13927C1C9921A5881F2172CAAC71B0FE038C1B6CE87B04EFA42DD4D3 -65F6249C359F8071BADA34F2BD0A2A2C7B6B8AFA6A1F765AF2A9E77942190D1929EFC2E5 -509B9066CFB90D5D2A4732088CFFCB20A56A3218B020F491688AFC95CF8240EE7B7C38AA -13CF17FDA80F40DBFD5F92D1185968B43A26D0E38D0C9F91E7226E5BDE34F083FA117E2A -EF3CA2FE14C63CF404CF833DFBC09E27D96F5A6C16FBDA79DCF00652DC6AB73C4F6548F2 -16C8B245B15D9B5B29746E53FAA0D95E4C0357A3BE36A6CD993AECB9A42828E934A36388 -FB546D8C9D3531EC7B729D44D8AB61975BC7135E5ED59FEE11F12CF5C9C59160DE698385 -778A751CC279F807DD68BD5CF994340A16FF47147F029468C24E6E7AB08C2C69E9A5C5B9 -8C62FF6197C8455BBDB7BE9D069BADCCBE86FEB495B52BF65CF17C4B1157210C98948036 -55444C22444519D8A72A2899C20138698BD646E94748B62C3CCEB35C56837BEF1BDE5B39 -AF2E40A4D73DD747F1429CB4A953F949B97D56DE8601E7F299C218FA0D367559A750802F -64DA3BC53F83A733B1379AA57CDB1D657C2EE623A9696CFB580CB63902F87B4786A55EA6 -2BDA6CF94FA9CA44F388138020463F5BEEA1E273BD5BED2E9B08B60558D6A2901929C23D -2E6A61351A5CFA65DF52819D002CF21CE650520436C9681C60D81582D5568A6A0536E236 -26A13B4CD55903D130BFD7EFF26E806768C8EEA16359FD842898B8DC539E3170D4FCF3B8 -72621BD4C65DFD9F7EDDC0B17BB478990673970D4D4A07C7170698D784360F7A6A53768E -D9B41AB73360FE08C21855615214C91BAEF2F6A5AB71CA45E4B52326EBFB99A0CD401A7E -2944424878194E14C2BF7D183EA1B4C0BF9A3B2157EDD6143E9E9B30891F1185C3E2942B -EC87C1EDE03B77FE7CE0D145C0D918D13EB28EE264DC78409D7FADFB03718C6DF7D50A71 -EB216B5735A990274C349119C8739E5505F23C7025A79F4A22FFCC532981D27A70B94A48 -CDEEDE1590A2A0FBE661ED24CEEEC4DFFADA11F6514A8D7C026D2D685B07F9DFAD07147F -C7EBD82D9A52AAB50D1B52945ADD441A5F3A6C809127457895402C1AA796582950808F4A -21BE6BD2FE25CB9576AE1640ECDE763FFCFFFDD8096C9AD89B8B2390A2275F224F2FFFEF -148E4E1F29DB6BEAE998065B0306535D588F901C3904FF47D1428DDF213BB0D9D558006B -B5F032CEC1BDF4F8997B304CE400EDB24EE46C97DA278E03B768C2A23C88878B9A79DA41 -68175815CD1336A71D57C6E07CC7B8596425C9F8214F0BC2D99400B9FD644C1F8CF0AD3B -795B074D9D9CF25C18D3847873744228A6AB058D5D213587F16740AB978CE10EC3274FB3 -DD411E0392432D67C9945091AA3D90F95C3AF2B808FFA37B6C6359EA023D1ACB7A007F4D -5AAD3D9EE2467F5FD642FF3AAB11451EDE32138525FD48DAC480E29A16561A7FAF95759D -F83FC7504396991BA3CE2072851D7B962FA387A40F62DA05B81B39CFA6123F5B2CF261B4 -C7A84DAF87238729FF71D6F3DCED7CC97CB9C373D6B150C035853167C49368F16E447A18 -0F7F9D4CC3978E3E6B5F3B4CC7FA3078883D4C8BAC0A94E9B69B7CCB94E6D5898EC61A06 -E5A960058E6A1696C0BE287F24869414CA8D16E761C120FF5116A19EBD39109B0E251664 -DB0A5722B4366151759BDBA4A74204893F585A940EB1BCC870873F6F4E08BC88A239F23F -FC51016CF6F8CA8830346363BBA0E1FF376EB66174CF31ED9AE04219301EBF61A1BB5E55 -A89EEC27A12666287AE6AEA4D45A3706FDED0A70326CB050B6D25FC56216F932C1294E54 -88E3C331627D85B34875E7B51E4E7AF724CDBABB1F14EB6F23088595F2BF26D88C04D4F2 -4B94D94DD47761AA0A9BF649B06F7A2D56D30FC432FB49B570A53280A341BAB378037DEF -7FDC3B284C83F7CEE6800CBA2E20844A4DF8F2F5400167D136F810A7A739195896E470F9 -5875E669A770691C885365FBBAD1BD8461B005DBDD60891F12D8D4C8D51C8605B3CFED8C -EFF997868478A6A9D642789127727FA231B4BADFF182AB67B8D19402633BCD4913957BE8 -8F95E11EFB60934E8F26BD79622385F5D1CC5F7F492BD69C8C4BE47D76EE6466880A1885 -F63C3F4C893032D90FA8CCAEF615340A8424B4B1752C9009DD1EE6E0A10A0BE83DCF2CF1 -E746AC5A62FB5809310D5F64A267028A7EF02493B6DF22012D036A19B4AE3A9ED9A5F9C1 -6EA82AFC6DF1DDD7E243B4464FDC28B63DF4CAB59A58949558B1C1B4DD96800A69D14E7F -9DA1E1FB6DDEF437C2D31493631E79A41AEF27721579C7B40AC30421726959CA6CFC3F65 -5B309D67F0D50DBD33DE84CCB5EEFDC4923A4200341A8B5F9541428A9B6B94CB973BE6A2 -F39DF0CC141B9CAC1D0F25FD087A176D68BF69C6D2BA5084B586B289B00346DADBB42774 -251ABF854004F12EE97092CBEC6BECA5B74F21DB1BB72C9BBD9C0E11CDB4F64F347FCBEE -AE58924610D8A5ECC6EEACAAD54B36117A2EA580B9D6FB9635EF4ECC1649D1AC8634CD74 -0D01BA7F6F2379AB2BE4425C02198E8E75FB46CC405F706C2E2CEE54582CC08A239A6DF9 -BBD208AD5AB256C5CA2230DDBBAB210FABE5D4582B22F0E66ADF21F4F755D8E16EB071A1 -3EB431CB00EBA9EE617E43AC2E0DF733151A82D3000DE349C9B9E44227CF001D50E6C62D -A792040A868EB92A635208145CF8C25F51B698BC3460273AE679D251A43D5D1ED8D5D759 -6743700F9B67ADF9E103EE9C2D1727808433DA9D16ABDAE228FB35FADED5D54816E066A1 -8EC29EF2242125D1687D60655B3EBBD8E6227D0CAEC0E0BDB7845914D063890125E568E3 -8B14160794781E8EB631115576CF5A7E9639B02A28CF363720067EB527988EA1D2DDA4DB -CD35790CD4F91A253D0A9814143492857A320088FB02B28ADE5CCB4BD7878682E2895B07 -7029BEA07B654A13EAC49FC3E9BE70BFEB73418204F9164A26E47632CB0FB20C643A3245 -4777AE40288C6942D4C0C88FAB77120BC73DEA4EF0AC703DFBBE9FE79796671938382F22 -8A9C5B45C48FA131C17BE362EBDEE57378738DBC29297A9B69A7854A6D702524A76573BF -F76434BE57EA370D43CCED36DD0223939D362102547E2B7896BEADA8F0B3243979B3B4B3 -4F43500473F7C712B5E3B25BBBCEDDD40797649305E5E7AF2B767CB21C93195FA3B2BFC1 -A5891A91CA879BDD643A4A3B384C7A55718BD872E01674336419D2B1EFCBD888FE8FE9EA -3F07C87A87BEF21E66F8B26D25841401C499B31DF68FF0491E660E40C79E5EC2312BBF1E -364F6177BDA9DA10DCB347E40C8F423B12700C4C47DA4B09A27CB14310C7EE8DBFA567DB -0BA6DF2499B5ECE65519504C42B6813E0B906ED94861EFEBD5281DC0531513893F7EBF2B -9F43022A81ACE291CA736570C6E099A8CCB59D8E7568AA5D18FBBA8986905D35E9B52D59 -1E36EC95612B25F371F2743890AA44974F54814A4BDCC23F5DC100B5584B09A746938953 -B5D519A50D3F1FCE6040918E3CA5E3DDCF5506055FF493A8AD4F8A081BC3524D88336AF1 -80888D96699045EE95F984547B4D9844C9B596CDFBAC8ADB0194B7141DAA0385470F2AD9 -F542FD1369E418C5B380CE40E2461D3B68E091021E21DDC50D96C5578D73B9E84227EA05 -8231936F4264834C133C58D71D347100684A1F3F5A5B461D669B92BD7A00745C98906EB3 -15ACF12D2E94B597940D85CA5B69506661133A6B11BC940ADB550FD9B3FC14499677212F -B6166E695839DCEA3F1442E2C9E32E28EFAD1678796946725A1C0C62A1EC5972933A8FA0 -D37AD1D8EFDCA892F53962F57906EDF22B55AAAA17562F2F876C0B5C85197FCD583E2A87 -6C28672FB7ACCB063154A1FFC37A33B104AA37C7417F46EE3D4B59BB4E4DDD58A2EFD829 -71275C35081723630CA67016C8BEB30A7441E0BC9A4973888F0A377D7A3ADDE25981BBB8 -036AA2D9B15B71D54A7BC6C8DF79E7D2D50E97F1DB6E796655F47B5E988653996F1D3885 -60BB63A3C364B5AD590A5DB33524282B3C6A7C228EFBFC222FA475FFF99E83EECDCC09C5 -406985D9B3C00199EE2A620A7F820D1DC40353E0A76B46DA672AE1CFE632FA3523C8B32E -2C0D7344DE9DEB24C7E311E981B216361C401B2C7E135028BA08D3B91D39099DEB9DBB2A -4050AD37B9B823815BC6AA107A3C7B935BF259D9FECE88232061E4796B425B5BAF4C5E8C -4E9190E159743D7F3E4AB2191B8EE8877D8936E5D324FB57E6936F8267C015CE6D04291B -200E1C964660503C96C4A4B782D09F4D3BA952B7EC7AD5B568D27E3A07B26486BC45F394 -128A011F68B0434829C59772C66A001A50FE3C5F2C4683BD81AD8C4B7F7A25127CDE5E2D -EC216243C2398A1551F8C1E37939FF94CEC8A9C1CBAC52BF6371DE25BE148EB39FCD9552 -3065F034E4F96B1C5D61120DC87D04E7DED973471C0A3FA1E1E6BE6E2F01DC0199399B87 -5EB88A3E4AA85EFC9D9F28B3DC52319D374AA64118E1383A8A577538C29859090DB65026 -4A866725524BEB3FBBBEF6AB74FE8F786D1FA8AD94BE90794AC7E72DB71DF74F577F169D -F3B310C2D69D729A2DD755AECBC0E463716BA5DCD4680D4D4F4164420F2B46DBCC60BE6D -A68DA2B2AF32608266241BDA6CF36E132D83D16092DFF4D138BED509909E250DFD9FAE30 -53BE12A825D3A91E404449013E219BC67A2B18E40D497125A2F39BD16824CA7D2A2E5173 -89D69D5D838BA27ABDA5012B426E58456B2399ECB1B4009CFDD6307F6D104647AAD6D083 -A562E7282007B3B2A0B6FB23F2EEBD0E7F643A9BC7075D893335DB246CCBD8A37DC6F1B9 -649AF15271717A769484B5531A1A7D99A43E90490F86C170193442D01EBF02842D349B7A -580D601534F1EA401D27D98455EC4A5800F4BF5893EE080441F6CD28226E4F6AEDDDB7EE -7CE77F2BB54FF006967504CCF02F4875EBA2448C00FF58DA77B50A4F4A007663B5B64B18 -702C96AA0E6F85410580F931BBF249E91AF47477EA284CD42572FEA81C462D7E0CB5F81D -EBB94225776D69B02F04D76B51BAF103B265139F85EBA00F47BACB0A1FAB9D39B648B5CF -06E58CF1CC43A431315953006CED0FF5701401B01CE4F335015EB6E41DE8D14F1B5C5757 -1371E7875B17C44B374184836C07D47F4FA44F8E49959BA63A4647F757B3837BD334D2A0 -423E620AC5E1C5B18C3A400A8CCB7119C3331812AD8863FC3A97B470293F83CFC37E8BDD -D2EEE4C5F88423740C93563603FCEC652CD447869112070497A5141CD7DC66F62EB445F2 -DAFE1378B286E730801959EC5FCED464E1BDB06D725970C08CA0ABB730C12C720E219519 -FEF20F96A1B0FA671565B45FCF41A40D5AFBAA092A09F72ED35FE94A98DCF5649F6AA3EB -FEE7ADE1E19B4429C4E1E76880C398246201CB067D8A734B23BD3118A8F5F7516E5B1452 -72CB0AD9F41ECD8FA61ED0CA87385B2B45B1BBA6CDBD7B9C9890F727BBAF5EA03273E387 -FBFE8D0143D1B215003C9EECFFC9970AD21B0A7E90F56E53B3409E102F89D95B3EC58DF1 -B1C8D48CCF22BEE22EDEDF25CA18A0461D2C582220ED664F198B93B388FD8CA9CAA6D8AC -95F10E458BE5480C767D6606675208E4C823FAD4A3B8E77915BD881C345B0A8C34F01B75 -2566AE58CF3BC97B215EAAA7189AD6BCE0A524C0998235A61713C538CBE9769E2350F670 -4BA790CF77CE5BABE376D5C2B2F9EB8D90B762BC59D9DEA5234ED14A949B002258212E36 -D5A22B4D847EA8C4171D74B78A5E225E3D956FE7F8B95FA133C50F864725C1B8F11C2D1B -3AA7D08C0745209E00B98BBE59E463D60C79122469F9ABB8A7CF777BD90999206C83F8CE -8C95C79993C20CA63CF556C821C8DD3D5124D2F293E5506D9CA515E026223D115DB59D8C -883FD825FA3EBB449524F1BE7811BE76856A063BAF9C09A3930417DB889B4DFC1563F688 -02F4AE1BA0EFE463FE884CFAFC0FECD0F4396B006B9230D9D3BBE6757318184EE7EB6FE7 -00E148C53CF3FB7DC90811F6D5CC8F9FFF975EC7DDA685B76D05C0320E7C3AB3479D00FA -927FB3E9E4363115D05E3D62AC3FD06310DFC6117117AD8BCF44233B05901E32D8A1BE67 -CA059C513BA968CA1EFE077CF8D651540EABC16EA1F61AB1D7F74F41EA52E1BAA0A19576 -5547168636187DE931C6F97C624391A212859C3A95F42DC367AACF13BBDD503FC1350FC2 -FC6259B290A18447FBF37284CE1F00DD81929B13F366C0C4FE86E834DFC7FBF5B4DE4D5A -33D014E3229A7957A112519134F0794825317A8D56EBA39ED15725CD940D974912D4A79D -C499D3B2DFD7FD67DC7E79F70A04D5AAF40FFA6A568AA4FE042FC2AE31E83F60671CAF60 -B8425E4F3959FADE3947B2DD3438C7B08D71A036B2ED959168D507274BC4C04BC9A9448C -0385531153595DF90BCCA1EDD889B3C9F3CE3FE63FC858AE51CACCA7160C3296038EDA20 -38625CE0DD5C236F6F18B3B41FB6D5953F18D5FD4F700A95B08BB10431090C652BFAD23B -D4A9211D0CF59E5C2D0AAC5708386D14F02858C820A191239D08E6121A77A83FE89BF056 -C42A6A56B55EA35DAD6696F64F3B702C21F4D97D87CB80ADF688E6F1094B00714820BA53 -65CD655C9DD5BC030FB2029972D15CA71610085A1A7CA47E290D5554413EB88B70D94881 -1BA89738DBC0C16EB47A3CB6190E191E67004BFBAB73A067501BD283CA816CAB52515721 -4CF005497DC884ED61CD5F5235EDFC207A0E8BE0696E7F93BC267C1CBD85BF4BFBDB755D -BEB88A7D4B978AC52B7D1AB8D828448F848EB6D2F839AE9F4BBF34E1BD5DE77FA93F23A9 -D111529C49A295893296D10F51BCF03327CF774BB1AC501BD8BCA58F3E82BEF79C39F434 -845435E9DADBEFA2AD5D79D8B0ADED3DAC9C1AD9E6A24B206C9DBBECD552B2E6DF97F864 -C8925A37EEF8718CD4D277949D389959D852977FCF96E2C46477CA973846DD65AF478490 -028CEF70A4290B22C4DD7514F1DB34820656EAABD1FCDB7A9BEE0C18E577D9F27CC50777 -D55B4EEA53E8F681F76D4791300A06C380E57B35FA48314BE3C4A70D1B73E743A2B264F7 -3E3C73CB25FD2D33D74064BA8803858C8353C1036E09EE4489433C92F43ACAE005051DF4 -A89628CD3B3EB9A569AE2DC5EB290715FB1028B2E32BA7BC4C48AF1FAFD94412BC7A036D -A31924EE68FEB3ED8DB8340154D5757AB86B7D5D37464D58A22B54E37FA9891FE1A54C01 -D7FA05BCED8CA937BBE67979068B177A777B2B315E6B1F77AB6930DE1372A95A0A1A01FE -C9405011F1F3AA2252EBA22A54C779661AFFD26FDFB10044D8B68277234762FA2ADF8EB6 -B53B75E663976FFBF7D43502184FA7CF047A8CDC2CF0220E542ED63EE9588C41E35496AC -39715683CED932BDAC827F5CCB9BE1D3BDDEE2D2C900AB23E2B54766DA16CC227E58E53F -788F5A8880B5FE8A7355DC73B6B26BF783F02E2CCD5F96794DCECAA0E7A603CAF330FF6B -D8D56153CB4272AACA3DCAA5932B7F754D23BE23B2282F6C2C59B2C1EE4410F342160BCA -093ED020E4EDD16C7E6E03FBDB06D510E6680A471E3B4E2C4319FC138B92A8EE4058A0D1 -8D7FCC51D9F16E9B74EC75CB482903BFD27C4A17654A6AD85D608558C6A717D47005A8DF -B52C28282EEF5B9F7DB1086D19021269438BA974CB8C34A8B85C5542519424FDA394E116 -61636091F18BA443113DB75E9FE5C5B8971E8749D15FAB20B90C10D3682102CCC30CFC3B -67DC2D519C96B9F607B6BAA01FBD8B78236BDCD6EC3536D15BB3A069272C646403BC64F6 -FD55E28988D01DBEEC75547D4D4A975761E5BDBD5E3D7601065C4F9657D3E492DB6A3558 -037943383B261335F01494978F46999DCD5584F7B5DEA427D20F20E29B1D80AEF1E279AB -F27AB8410172E203B3945F98FF87A2FEE2B89293BE2F5DBD88A200130143D79A5F8943A3 -D0895650BD6CC2FC5D5675B30B12B4E095F2475F7D8788EC9AA952FFC8DACB281EAEF931 -34A6F83920FF8E7C58441BE339ACCBBCD4C9BA4C8EB9A5F6A45614F991D9EB0A76B2C869 -944CBE0D6C0CA4C8BAD0B897328A4D354C60A31AD9EBC0F97835BF4CB7976BDB95152A1E -919144C60E884BC6E6857496C77C3C7AD9F52C53A9051238011D41F14687E5B3F666CCE4 -86D16F3CDFB9AEDE1CCB3452A68F5FD75FB96600750457E3C3FA6579BF938439AFC75386 -D1C0A1FE73AD6968DE195544F85CFC697793F1F66DE6CBD8137A918B2C24A99724C978F7 -46BF6AECA401F5D298CD1081970FA904F2E2CBB2D749526C2E14A43970B2B2CD28EE9178 -A58F60F7BE3F87967B4C1BEA2ED73DF6692862CE919E3B406480A69CAB794692D0FD1C6A -65FB1065BCB5AB47306164C0241A6177D8AD8E629C77F84A1AB5CA62B493C5C016AEA0C1 -E45AE05B54646CA6E134B776D09A11FE04953679CFF2777B01370F482CA655CBA8D1F91E -07D0106FE37E83267B5432ABB51D56C88EDC58A11D8D90FB5E82BC023C4521A6649B9388 -5BA6C0D139C3BDB8B0325CBC27AC4E8F673E53D84476E1632DD4A09E94D375B65B0FA682 -18609F5996F543A985FB6CA55D302D63F86F234F94C9A5A15B0333F722702682424DA956 -1E6614FFBF8A9293F5750E06BDBB05D3BF6F56865577FCC010643699D0AAD5633BE88939 -AE6324C36A7A5FD5F148162952C357C4FA5E8DCBAEEDD28D71A809ADFD563AB3C4CB790D -8FC41B81784B3E9C672A2F6A2230E90882EA374A579ED2BF72795E84B089635FC4F2B48C -D51C418BF26AA4939CFF22A0B37182836E70AC08C971EDFB46A31BA11480BB855D53A01F -5A0688B2CDB04B9C2CF22A63ABCDC965993AEE1DBE2BE79DA4D1BB595E24E87267FF1648 -D7F8E531B275C5499FD4202A948E2DD9FBC7CEF688566DBC53B886A2F9843F94CDECFC63 -78E6937D4CB278E11EE9E2957D8BA31145058010C98A752CF568AAD0FF5C4C67988868ED -19762F2F54D6D58A3747A6C5A052543ADAF50DE5AEC5DBFE6A2F78F08A50E5F65C328290 -B383524AD0A1A477A9815C8378DDC0CD7E8CDAF6F097E5DD40900B0DD7A7354A37B9D90E -7C4FFEBFD1DBFBE33B5EBCA7607243A53EA746FFB8CA2D88E73D2696281CB210E6D5A0D8 -46F669F24E3448DAF1DE413B6248564E718D903654ACEBCE09A7CA994306D924535F5792 -21C39D8E386B1573B9B7C26256419D8B52F4980018DCC0001DC87F590C378EC0DCBAB4B1 -8F362A7F64BD16DE2E647A4B0573D92F1300D5D8423A1FC658E708457646CA9585071B72 -E66A2D919AE292B460E816FDC8CCAD369EB90FBAF5BAC731FDE38CE2E45B755934264D8E -4EABBA7D6C0C91B4444BEC23D8FE44230223BD612D845BF57659A9594168655749D147AD -CD4182BA77EC41BA34595990446E1D093CA7264512C12DB9EDCC3A2E97B478DA4A2E7A81 -3CCE2592BB816CCED1196A40E76E4B0BD2EEEA1EA7BF331D497548FEE91A56C7C057C3CA -E25412546FAA9C1B8382F5F01004E506A0DF3BE419B38AA7196EFB6C9B469E49DD63572A -60FC9A5483CFB723FA04BAE4AD526E8C3B14E252750A79C13D07CC1A1A424B33586F7072 -F28D5C61DBE7F0EB9BF47110B4CB018190CF5BD564CE48B9775FEA3DC1FBB03206573E02 -C60969330F0DAC03A4EEF803D7F860C14C50D809EA5D5FB13001048D2CEC6B56C2423CAA -EA0FBBC4FDF550F0EA3D921F522A65CCB0E1F590106F163DE12D1410F35D72E7C6168D64 -829F8144C5B7CC9F902081954923AD742954477ADFDD4D321A593A41806C002B02D9DE03 -38DE6B6401408FB03D282489D23B6CD09A77EC31A7EBE000D54150B03A8610D0DB8BBF8B -9C7E94419C0E522521585F2B7C657CABEEEBA79F2C8FE57C86F593F805945E7DA313B826 -2DC421EFEBA8237EFCF9B054D12CBCD0A3BB32C4A5BAC3E8C105C32860E80FD83F095A20 -AA4497CB6F4A879E5F7AD6C2A8272E937A61BB95402F130A37261569D47A88D4ADB80A1B -1EE5FF03D8890B212E3508C408EF145C570FE2656ECAB9EF52657A04456B580344FD4F87 -2B5D5308DB567B1E957073892D8F83A2C8F93CCFC11D3965EA0B985B5521C997786CE86A -3D9E0A3407EC73E51BCBE2B53D11DD304F0B7469E34A5F6904F5B3807A62534D742DBD4D -3EED49B28F68BBAF5DB1E261ABD0C7739CC09A4779D5D2AB15ED9762FC6E72F78B71DFA3 -23C29D48F47E44A38D87168413E3F589B9470C79EF8A4EB6216F1F0F74FE2853E7EFF2EC -902018A4F6FAF4CFA75B646447DA90B8DD612A65ECD9504C751D331B3762DD369EB0D179 -CBB70EDADDF73E58919C65DE73497A87B4ACF06360FEE10E7593507C6663B0FD0308C95B -F21B9ADE7966A23FA4CD0648051F2CC20ADC25C8F983EC2DC97E2160BCC62CE3051273F6 -3D65913AFAC94E548B6BE0BECE2B704778A24C4348F128A4EF617A7F43AA327193B5BE44 -C2045CB1840DF5FB6CDCBE455EECA489E22F0FF715F4FD6D14A874031C58A8446730D0AE -D36887A4B33DC943FB6A9469AA781FB0E994AAE327A86408D63885662065330B6AC00AEA -FADA28C53CB4255EA1858ECD3869BD7A27EB5C9949530081E5E103DB50CB34534A4C63BB -78E91AC992D1D58F2D08E7706D25CE375CD041F049F762B4B20FA9052DB766881540D4FF -1BD7A4FB927F0A3ECD257938BE91A220D9FA4E00201CC64A1E9816E9D71E95931A5D018F -0AF2877F2737A7749BDF3C90A1694FB81EA9C970629EDEDB5EBF19A60EDA5D7419F3EC1C -A51FF1544B23800B0DDE96AD4E5E660AB20AA419182AC33ECE2A48675FB2D74770AAFDBD -6C300C6360B9B5FF14B7022BE140C05133BD0D848A605491C156D08EA88FD0C4D2334200 -B8437E6088DB32493099469000426A3CDCC627757C9DF0BFA4E9E0CD5D0C8F3E921B1E41 -48CB6D876F445CA4CB9FD7E7FFD4032B2A97EFB025B182A88CA72212186417A5C373B5A4 -3357E58EEAB3FD609C5DFDE96D4BA104C74D69AC17E20058D0B4E875A53F547DEACEBE20 -CF74242301FA39FA6FE6B0C22C5FBEF3DAE3B2727949C20CB8A1CA7A70C7A09E0BF76794 -BD67F51F3D3A1C2005E4DAA6CA87768747DB8A7ED1334F03D3C3EEBD796AF804DB774DBB -403B4B0F6820033CBC99BDDDBCCBBAF0FE7C56959608DA53BF83A56606CD524D3A80D591 -AEEA4658F0E252308551371D192F88F5D8D58D2B898C494FB23463837B8249B5EA5B1DA3 -12A1CCFDF4234C772102A6F0405227A48F6B216BEE7520409C77C77B8F962977F9DEC1FE -098EBC19A77E3B155DF2514D4E8087E0CE8D53B272735F463871AB02BEA13B9E402C2239 -73D2B968E55031BF9A929B6468599889CFC84ACC422439464277D86FC347D3681EF42838 -08CE24709A9A3ADF4621805A61E3AE1252051A00A8DE2ECE5DB8D6D415F2648E7FDF4219 -4F8A063187F64980D3216EA297178A6F87395F40DDF9DEC4D649D74736AEAFBA82E7D0C9 -05D44A8E2F02D356741C23DC37F482F54CE53DE8800BDDBCD170B8F089339C7CAFF13A4E -2D4C4EE33BAF718DAF51BDDA347FD8760F3297CC169112DFAFC9871CE42FF8C29D7A2168 -0C6E23A2FD776240694B44696F69D11454646066BD4B6ED7BF4CF3550BF0F32FCD0ED0BC -CE20286B8CB1645C308B74D0EF5CFF8927E1F2FAB0366BE55CD069AA7676E4592FD42342 -617A186D3C144D173DDF6E01F5E5E5A67A9648144BBD646BD3D76BE1AF70EEFBEF0361A0 -4BEFEB59E94AA5CE2400907C9FADCFC3633ABB62F24B0980093FEB72977CC3E44AEA7007 -B4721D8B35BA81A01C600FDFC070A29337FDD56DCBA7EF9DF7364E0230500F9B8A075625 -7B12FAA98EF15E011D6A6D02C84655D15AE62181FA4D0CE38A6FD6B2DE4F57B0B963095C -95536BD7A53D0FB7C1167F251A9C43DE263D68FAD27C6C10ADFB6D02BD1339CEE7DD6EC2 -FAA687A55AC07E279CCDD84F46A6DEEBBB380B1DE2897DC279C784A9E352683352B059B6 -15990972B53695F73097EE77081F23E15DA3B489A9B088C2D7C76B89948F31D68C3F3FC5 -0243D545C56B62CFBF55E1102D9C761E8A7B0F9A547F9B0935CD78E32AFCE9A451C2F455 -DF2DF4117955D9C9B30619FD8A9EF23827E70FF05B55511185288C06668B65BF67CD8C77 -CE1363B83499E455CDF30270842A22F23D101F7CE773BD709D2E9172B169E25C2AF2B64F -93DABC5C18CF61B30DE7ACF3B7D746EC1B725B90B767D24DB244DC37A42861250A52A287 -F2B7062AC268559A2C231F3A93E510527BDBC3DFC742B457D774C6FC8B023C02E783F2CB -C50C4D37DD81433BAE0A8A9CFA280E7008C47CD75E1A77242B5C1ADCAF70E3C0F870C126 -197091879369A7B31FEB8086E1733E377DF5AD77358D296D3C1CB2EB54B7DB9C8E5AB4E1 -005A775EFA44328FD755D84A064876CAA2E1016DA7DCC961F2101A8FCB699B73A23CB866 -51E728C07CB9EFF654EC83A5DAF21DCF2F777535680C32E4A88AA2D7D65F166B430CFE51 -9F252F51640D7443D75CCD2F5E8494D1210B3F5BEC029002C754BF6B506B5715601F5134 -B6D95060BAC8F6CFA2249FE4B5DA5B098873CCD2C5A6E983F6C62C3C0A9274899858AE7B -5364B4434187B91EFB705FAB6372E3A003D5361138EA6AC70C048E7E05E2F319AA81DE1A -8D1836CD2B049800B991CFEADF399960C02EAFA33CA1D987B161234EF3A67DC53B6FE467 -857D5897446EC2D4C5FE183320F28B74EF3900815A540EB68C325F038A564A23AE235D12 -A475030624FBEAB5A8A536D0011C89AD8557AA5307A5DD4E46AD91FA15B8D6A297DE7717 -0BC90F8C526B6B9496F1D4C83491DD2FDE4CCE06420D943C5104B0C56DC184D8293D9305 -9AD7C5F6251F7AE7C19BD13AC98FCCF587FA9A223082B43F04267535CBAF822F0DF7A642 -7370794C4CE3723238828BC3459A01D8B363A6B9342CB523A13CE1139525AF0C372F8AA9 -98A3E2962BF6728F815D33AA537B8E27ED9174ED4422ECA87BD9E0EFA86566C4314BCFCC -324D5FB4105E9A965CD258FB0A2B970FE0A21F951F3C86EDC5543B067E2CE337CDC04E30 -EE665A3725A4110E845D9025978D445DE6284A55197735A5C018D99CAAFE6597F3D58D37 -68EEAE6F5428AB3B23B5F2F9E8EFF5D6DDF1B4BEDC6D245E63F2E5DC0911E8CA2A9DB100 -CCC4EB9C54BEB0EEBB2E1027BFBD041DD39B27C151EA50EFCDA46F4273F74C85AA88B1A6 -7BA9A98C7C6D7C406D8B3F7892565B8856C77668B86A0BA9BF743C5884FB94CB729403E9 -28EA9C8ADB060911FC0E3DCB9B828FDC489FBC1F15FC2D75807EE98AFF5D841D88303A7E -4CB6DAEC1872D384214EC0E3039478DF79CBB7C12202F9F56F3206FE61B04AECBE1D7757 -0CB8A43D3E145B0ADA7CE219CBC99952BF54D734673632B68AEE6CDA8BA19BF7937100A5 -FA294B86F7439FB59E367CEED44FEA1F4CC2FBA570AC2C32FA6D9F67474BCA9318A84A31 -107CA7AE187454434340DB2F3A0B2B41E552EE49E828C20266B88BD04DBE61AC6FF59A8A -D065A704C18C315CE79A72B061A94558964300564DE5B41B0BA3A0493851A355ACB34BCE -7FA00DCDF05F3BB733C9C79BE3F83D6103171A648F81BB138B4996B606A7A8A997761548 -08F89BCC7C81BB14F916F8AECD873406778E51BB93E56C25DFEC6C3778AAD6B537E6F488 -D29898E17B5D38BE14ED70D79A62B9282DDF229114C0BF9830F2E18A4717C45BF1B29A76 -31B60D13A283C7F92EC4EA3D98D2331270030A14BF9A8E07D87E66BC034F830DEFFBB5D9 -9E95293C70571BBC4B65E1AA13DDC945815FA79746024F5751F8FFE718D97B8AF465BA54 -598EAD21B323C3CE47AF7BCBA58BCCCFFFA0FD2B463C85DE8D02378C86BA7D3F44C54165 -E00E64FDF7228570A6F94C2A1F8CC5D947A470552302D6B3850EF092D6923FFD39E01F7A -B0ACC7B6467877CC301A03136B93A57AC0949D62D3F3E63DFBAF695767877516DFA1CBAC -F68BED7E2AC83C1612F234CB12A368CEE9657C6519908C7B046494842013EF81A4986D38 -58EAAC69D84FF32CC5CCAE2E438DE88A426365EEE0FE9745DB5B7D494C3ADEE8C6C31EAC -CAEEFC174DE952E2D668BD28D621DF9C81BA0355E943BA3ADFF04721B586C659494D5A36 -985AF4AA408939371F448293A0C04CBE72C558E4DE12B36F823445A2267806836D265BC0 -8B279386DF1579512252A9CC6F69D83959FD3F1FC6057DBF5F28C644AD4862ADBF133C2D -5779D96F1EB234FE09E0FFC62EDE6D295F19F52A9A6124197CC250EBF77DECDD5F8B024A -D635E941AC0CB5CA59F6278FE2AE87F7A005A5A9FBDE7609B4DB903112DAB7B612969DF3 -F99F3D34D95467DCBA57E6755BC80C4D18EF9F440A2562DDED104A80D075F8D0C308B10C -E31B777B438DF32A77433152571170DD44AF096981632062E3F525ECB3697F3EDD316E15 -2E502A9B8B351710611DDB75B710D6CA9801ADFB57EEBE007527611D47C181C3BA7BADC3 -1210B9FAEF3608350D905791F025960862B0B06B4BFCCE7FD92EDA6D9B2FE67206ED53AD -E69BE630442EAB6BD2977E3BBFF487CB15A7127B40BFA161D8BA602AE211C8E3FCE684C0 -3E4B7E8148C2F61DD65E1D07355B37E62A6BFC70656B4C32FCDC5926EFE37AED5253F67F -DF9A556956D96848B81A6E11D005984DC36E99F1874803398FA37966B1A37B8282BF9093 -65A1B89C1E1CC37B02254B75C75D77A39F9D1DBFE7B79F70AD0DD6038D824A7DB8DBBD79 -B6A5302D5859D5925B79A210210103791C4212F579EE900CB3FAF002DB06E0ED6D5E74CB -71ED20AD85A257F1244C79A2B6E703DADBFFBFFD414C1EF6C7A7CC4B12F72811C0F0DFEA -A4DBCF715812A3E827C06AF347EE1D72F9FBE9BE3D061DB13CE123C71C8341C2F56762A4 -FD0C1CCCEF591D01E7608B097621C45DBCFA96348DA2F80839F0EB6026AF7C14E73E8506 -FC9C1F68C88CBEE385FC280F18D7817A8606FF3FDD506FABBCC72662B0DF81EE90727ED5 -90306DFE6119A9CBC84172C3D434DDE35039F91591837F903585245D0131DADCB710309C -596B7A8CF8839B2C347C2493234386F988A7066BE6B26F9EC504868915D71E1EB5E9AD4C -F2C5F71E761B50FCEB823CAD364F3E5F3B1D10BA4916D915ED0040A920C9C9ECF344E685 -2B805F4B1FC9062625BA815ABECC0EE80D708D0BD141681233E5A483FB2DE7DF9B13237B -649715BACEAB3F4BF6C6403F8460D190C77E4DAEF62F437361F6B9DA9B4787A68DEC88D4 -556111ACAB7C7BB5F2F1933291DF83425C10895A2B47330B661DDFA456F130D91EEE2A4E -F9AE28D45DCB80DB7322DD6D7E394D475AEE95D0DAC575AE569BF9D26CBA1CFEC9DF25CA -A1A701F60B297064A17CD878E101FD6A6F981905E50CD52A807B466465F0526BD502F249 -B8C4408C130D017E6238B5B5BFBFBA518BBF414E11E2D25926362F4EC5E83E6C26B19C04 -D68C4D6D891B10773EF156166D9CABB85F08A1C130D9D35351CC9E7E739460EAB51F3F8E -A011A2CB3354F759E9EB297219157F02BED05B78BCD8C73E3881C835A7D986A3877815FA -5ADB7713819D931FD05C53FC0C584C45763B6725094485EE3C48E246A1E8968C6DA8979A -2D12CF4A97A8822BA5A066F62333C313694562FBBD8ED26D32E8D09426D0AFE33BFF61CE -23F03ADFE9FFF17EC5063381102289356B1696475310DB04806487792F7EF42CCDB4B8F9 -9DE168D16AA56321F29B09EAEDAA9727CDE7DBBEB62F33EC6FF1E9A74696A7F4B15A2684 -968D5CF34F65E88601368BEA29104246000EF93B64098CBB9F26DB4EA1791C48E245109D -23F39C97F87BE05A31B4AEB6B7A8E49A4648F8A6AA3EB1B80E2A0014CC18A59B43441A81 -D78794CC162D367AC2E22C4985C0EC45B9E29F1D00EFCB898807DF65A3373208127922EE -E16DB24D335DA01050CED1BE9470624CCBBD978063F6C538F90CED1FF48A83E404FE5DD9 -2DC2DEDB2324409E78583E5C7874A9661480386FDC2FD62329D5BB33AE4B5ADE5FCB9BCD -B016857AE69032C019ACC0D16E07C92B252C2AD5E2AB2BC9A1BC074EB697D7842AC5F61F -6832A8942C6BB35E3802123DDF726304D74F10FE22E386C2AEEE158BEC56DBDD264A2321 -1A3D0B53183DB2F74A306D00758DF51ECAE68DD8944FAC719EF56190017CE10DA46066D8 -AA27F9D6B8BE4911E2FE16D77303A58EA4C184BA139F7D39C4B1BE8C72B8104D1FF671BB -DFB1C1F8E518CAD156D4ABB057B622287CEAEEB574F2C202462FE2575EA7D8CD820FB4C4 -B87F022D732D07DD009845BA831A6E2A248D5ADF9C179276905A494DD35E4F7E581141BF -AC76849B0F38B5A726049BFC2196C38B6EF6F7A0D38730CF3CF850A689553B7595070858 -97211A03A40B37BFB57363CCA5CDFB04E01759813DF0B67A693FADFD5692DBCBC543DC30 -65192915E654112AF3676DC58854D602C427315FDB2E0624D826BB60B5EBFB4CB190299F -930D0385629EAF0C0EB37F4C01C5C770BF1F0F825A2A4B6FE50D2DB566D5B7A819FAD0A0 -0E4A7E8686E9FA936C0315622C95735E251FAB0407814B0F2F848860B942A413C7F43239 -C413EFFB4B01C1CF1BB9AD882DF6A3B64B5B7C7F0EB4E707DC5012133AB2493E7C3A88DB -5D0A51394FC7D6E66ED529D16686537DE3FB1EA7116363C4F5945B344FDF031FDDECDACF -34F2458908AE0F62E2D200A9B147C1FBC1877FB41DF6979AFA02071312BEE01A786E5EE1 -FF1B4462913540CDB34B783D104BE4071888AAB52177898F5537712D8DA1B09BAA0F094E -8174BD25333D3043CEC70925961865785A6F81359B7A580D60134A293C8DF73F9896BD62 -809715A8C846915E7E636CEFD18125CDFF15E380A8901B0BD2B7CDFB80916D4839849795 -A7231BDBBFB9858A7834BAC1FF8B8365D9602985E8D8EDF33D04AF77E24525460278EF7F -03AFD42AEC3F4201F8C56C2F4885F0CE693EA5BF4F62A8CD61F3A7827A1C40FA52228ABC -8D19EE1089AB3E80336EF6070B9EB31781EB9C6F6E3BF3BAB61443BFB63C08BBADE7E842 -67C6A44128F33D7843DEBBA3BA7E723E91922C437D24A329E72547DE8ADE2C9676C2A078 -A12CAAEAE690A31FA18076FA77BCFD1EFB5762ACE44FDB97FB5219DCF9F542F87A959EA2 -F118162323B46DA8A0C116269D8301850EA28761CC0E5ED06ED48968EBBBACB891CE73FA -52B7C262C73DAE25843C00923D04893302DC2EA0EEC7A2CBBFD949A3B4135F5AEF66411D -CDE7856F7FDAA0E630C3BBD42305182E3475589B41461360EE1B72298D97825C499D9F49 -653AD3EACEDB5F9790BECB554A643AF9F1CD3455DD51E79FB0A6221C4FAF81BD822A1BE1 -AB8F8B18E4141787961546744132ECC7F19EB3E81863CB6B3FAB60D3963D6E6F106A2558 -589B07BA69CD18152F8A8B884BB24FF318A071CDC695F6D8DFF7D04E16F0AFE7BF2F03CE -F6977E0CA4B46C24E22FA22C0B9DA11EDE76B5B511B1DDB6CDE7C314EC86E2B79E1C4FE5 -357797A5EA3373FB14A212440F6CB0821AF449122D94828CC38E44AD6C7C7FA78B932192 -55ACF779D9634B75999314B31F79003E030054010133046C6CA9AF0FF33AEB9E7C63553F -F34203EEBF0E3F104453C1430A3642E79A4F5D708551C4751C9F4DF3862FA15814A10567 -69516410AA29695690A5DF3E7B407A2E5F05C8DB7AFA0132D5F43177388FCDB17B325990 -1AA479F19C138122AA2EC5674A7D41D85233345FAC3ECBEDE642BE5669128E17DDA2D86E -34088BB76C64685FF98F01D48175847E0F49E2404E9C5E9F9073F3796DC575468B53F9F7 -39F93EA3FDF18DAC9489FFBB9B18F150CED84E6A4241580023C622129B1A91A8079CA92B -1A8B26B955986833D3144BB4EA25866AD4B499247D44EF273ACB2F1637F195AE7E89541F -C6B70C8064F12B696A0C9BB09DED5F41E19914918F7F4834428A01350DDAFF763611C173 -12EB28618542E8EBF479BBF5B120E02ECCF7D3F9638979F0602194DC2512C682FC947B4C -CD5BE48F0CD4BAF3710BB42195ADC7DA9EAEC09E124D49E7CBAF579616DFAB94961998E1 -4EFD0128982A15580D1A2ACAFC740EAD92FAC43E7FEFB551EB9322A8EA302B573A6C4B90 -87041EEE1D7B60CF1E50A88F59EB46F1DE9F9760F21B8EB325E90B536AD68829FB965237 -5097A06AAC312372A7D3EA7134A53C253505997B4FB2BC25EC2ABC8BAFAEE96BEB6EE940 -A76AEDF4F00EDAE82434B3D5C8B854BFF71EC073A0DE2D98FDA384E4DDB1D84704BAB88E -DF057C84DE21A1F7C4FA509F1E22C7B8FF788DA95A7215DEE81784B7F47643CB85D08DAF -425E251EB72FE482CAB41D49389B323E66D27863D719D78C676EC91981B0E516C21942E4 -66804EED7E214B4EED83A1831D925019709A3EB1B2CE62491339DEA3A3890107CC5C486E -F7A861D7B023B2835A87F62008BCB96748B6037BE07D54A22AA4206C85BF24208016BFDF -EC4E68D8CA14CCFEC2CE496819159C153610C4521D312B8538FD3AEEC5FEB1021FE9595F -767ABEE99B952F0AF794FC4D7FB0BA7B8CD73B543ADF833989ECA557EF2FE9E80C786180 -FE2B6249F45440E94C98C00ED7B95EF5AED26A9058826EEFE0377F4CF786450929E290E1 -D89E70679A7BA87CB29FCBE1A79F24A2713D182F1BF990340FD0E00012A25801BC643A9D -DA70E046D123E7E64B884B0F8024639E055D6F7FAE5CC5108B68125C02EE9EC0C41368E5 -6F869A55ED15563BADF2F88086EAD3E67E8714AC03D2A12B7E99C2947D6422E5F11B74EA -2CC153B8409A2A03C0AE3AE784AB05475F3D086EBC28089DDCF12C8D4324A8659EDB40DD -5AE08B2752D196ADBD0E540590A414A6BC6931CD78CF0D78B23080B4D5C5D86B9E4E0EC5 -3D774845DF7C74D07F242655018AAA23E64165DD462F5D2A282B5165096732D55A3946BC -C00AEFA41085AB8F2B6BD34C065DA2C9C2999903FBF17E9E7E39E874981E9A850504F7D2 -A1B69C85F532C6749BC675FC181CA05F486858C0F22BFEC83F14D4754C3C42F0AE0ADB56 -9A48214A9DBB6D163E528E4DE29157A8E7089EFF2E2AA6AC85AAAE8925CA4A019DC38668 -418C964DDD2EE6F2B92BA48E10789DEC415FA94C81CB95093F71BA384081A7A01D3C2DBB -A934E37E27B4232C8A3802CAB57BE8BC899635B620F54FA5639EA9BFAA5294E57856664B -B3B3DFBE40DFA0E09A14ED2DBE9C47CB032A86D9482D29959E21FE32CEBAB87FBEA9D283 -7044E2161D62CCCF0A3E3195F874F78AE00DAC349EFCBA46A8419CE0A7788B1A2527DE7F -1908F9C67D4C59DFA016D21F61D3F29AA54763F81F2837C5D4DB2807F3E47EDF257588E8 -64FEDBD51B1C169035F1B64D80EE209C5A2315B961D33E4957E11A2225F0E8CA0BCC1E18 -9428EF1FC4BBFF887EDF1375E2768129D8558658D78D876F455FF4F0C65F35004AFBDEC0 -F99C007905DB17D92A64B5D1A390233820D41BEA0F2B732B12BAA6777E96A94F23CCFB02 -2AB8BF09CF9EE6960FFA056EBDB46B04B8F187D05CEB9CF0BA0F796BB494D5F511010E0E -14BE33E45C807F4FD23AB76B0F0E3969010DB86834D787B8E0F92689807033BEF513DED8 -EB3EADA76AEEAADBB191518A950F227A0ACBEDEB778F43FCB3A281F7B7C35F58BB1B3814 -49E40140D8059E950413B9CD3F93240629B030023DD6233C59ECA2035392E64869AF7FD9 -4116ED71B821F0AEE5A68CD691653C2D6DAAB8AFE466D5D7F1BC3ADD65C0AF0EAAAA1486 -DEF5F16684DFD78B7A41F7816CE8A787019D9ABD2F4E4253C9229A2DF73C22DF22B93A8E -4FFC4769448A3E00CF85A939424EC3856CBA520420BB7001372D2F703C5B36CCCFCC5BC0 -1619D9DC961BDB0D9A2FB18759149632141348364E794B15E7BC79420F0711382127B262 -292FBB7F4D0B37A7627E8EC5F5FC374B98B18FF02DB2F442D8DB5ED06F90C3BBB17D05A0 -5D7D11A6A7C2E62F15E7644ADDA44F1A3CC71B61645C7497C242DED8199E31DB0A247C08 -1739BBE040E7CC7299BF09DC0CE4CC6C59BA7D1867CD3CF518ED80959FD8B26748EBFE0F -DF816836E57738FEE205BE2941BF7F155FFF82EB877B7DEE42BAAF4BF2E2057453611C33 -B2FC235D7141ACBCF65F068F2A90A86B8D19B6A0D7223024B42CD6D71C04EE865279A1D1 -6A401D2393058EB9A16020EC8E69943F631333D3C08C9892F8FA620CACC3D1A4F411FB78 -A6CC30F441BE858EB8ED7A92164C59FAE8C5C6F275C2025FC60E326FC2F7CD6EC4612DC7 -1D58EC6E363D90BFD5A93F552F7C3A6DE059A13C14CA2C15D35E1E5E10775ADC9D925185 -1ECE6C1AD5BF430846F62165FB21A393838DC98C2501D598E83EE90B31378D4D92CFE8C9 -869538BA6614A71D3F29E455DDEF8321C2AD78CC2C0A832B3D0F1C09E3B5FA99B121C283 -0200791629A4094DE00EB9AEC55670263DEF10783A699D69BF861FEA783A51937E1BB83B -D96026CD631C7CC3C7EF3BB698700B307079EF2F28F52FC05FE409E020B5E044D1766C37 -55064E5B49FA1FCC37E6D8341525F9DC92B35455711091F1229AA39B397E9ED05EEE7797 -B9A9EFB8FC162EABECFD465756E8B747A3041355178430CB089E1CA3783DE19454F97E0B -3B24813D695BA962CE2046C8F2778B0A7808D046AC0713E1A6DAD26033D153421A24E667 -AA649DA942425C45875437F703E68F68AC5F5AF9B4E087FF4AB87DA00D174E090D834BB0 -14B00764C1CAA2AD4FA2B457858F2784BCA840C7A8BC929505056E3BF3FF533D94C9CE14 -76DA773403FC3F80E1A2335699A55079B6993B0FB187499392167930A874EB1954E6DA45 -C9591EEDC1E8247F237C8657B6FAD992B9426D584E116EBAD9B9F2214A8E850F541A208C -A8792F3980B4CF5E75970884DD7583FE277F82ADC1FF35E5F3FB216AB68C353B25F34C0C -F2C4A60B1E51EE88F7BA84FB1C23601FA2270049E573C05218BEEFD56DF0A648665DB6B7 -81C3B0B503202DC005B8F2F00430288086BC3B4D0625BA2966630F71DC0483FC43DC4AD4 -AFBEFCE65FB61CE89F07FF29B9A9007700503043B24CD9DD8BF9E4714CA99B9504BD7FBF -DAF7ADBAD4168CBEDD5EC802F2DFE773585C5162E564CF1C39BD04CDAA50C2032956EE47 -948EE6628F9EC006711877235813960C9926CBF2372B9329C3CCE4F4190FACCF33B25BE9 -BB4DDEB7E91E8D8ED843DF6F0352E51AE0670C4E0A91E78664D5F88F77F6B9EFFD25071A -F9BF35C2D572275E5FBC2461277DCB0DCE505C6DCDF913CE7A99DA563AC06E1C4B07D7BB -0A24BA8CDFEDD3C16107DA2195FF9677EB104C08C085D6364BCB745BDE0D313D93E318CD -F7929B299185C098642464F491E64EF9A2DC1DBC34153495AD62F886309CC6B6571D6177 -91D94AD5A337912569067DFA1311EA41D5455C24D3B60ED3E698E10978C10FFB9A7C2137 -92A6FC31939290392D8ACD3253593287DFFC13CC9D80870AF32A2B82AD21C49560FABC56 -48FE43EE74D71F0E6D8008100FDC812029C4F1FA3ABE01A4EE9D99A2FA574F93BBC6F17C -7301329B2363DF36FA029621D478A795F9D564EE356CEF0A1E60ED1DBF5FA08590D677D0 -9A1FFF7CF8D657D3D1CF2915BD56B44BCF420FF4A523162CA1791A56287BE773D74F7246 -F52C0D1E22AEA987241202665D0F5EA6391ABF31F16A5BE4353FFAAC2408A0680A33752C -D527145AE349CD781E339C8A9D87E5C0B1312F5B3C150FAFB4588ACC7D6357A5A3B4510A -556A7FAD44643F04BC6D42A23E83640091DC70FBE51B57A7E0EF1E2D6112624AA21136AA -A1B1C6DBC1D1515491F0EE3F9C4338B58E3D0603E1C12A0588118F9261139CE44B5183C2 -AEC863C7D7CAC0DD272FC5142FDD80FC668A6CE709CD7F297DEA655A767CB8A088474BDF -5EC4263121C7B3F154D8396B2470FF226A397257FE5D24EFBD3AE08CEB5CFE9194DC4C6C -147F24D3B36830FAB0AAF03DA1442C1E5E77951538CC9A022370A8C3E39273E4B8E3FB8D -28EE116FEB770A6F223CFFD7925C64CEDB8A7D66212CB443B2A0207EDF102672ADDF2084 -5C2D36FF281B33BD3408CF628D7637F1E92A5D2168DBB183BDF98D99E5A68D9995AE6123 -3675A1AE7BDBD80642E27D6271437F24D28884C90351E819D9785E556334E20EEAFCCDE9 -2929DF0BAC01FF12B56C2B4EED3E554F3ABC0096BC7E5D9409C923E9ABE6032B20784815 -DE1C1663D6EC86D7476A0E9698CD3B201F5F9CBFFBE604C4C2E823045473B0381B1968ED -20DC0D0EC89487B4FFF6F3F83A3D68EE78868FE5262235C3609C6756BE484D87923175F4 -80A084A25B5776FF76742A70F7A60D8B76C3E13409A38A258E3E334F66FEE4567A68BF1C -8CEC4A80CFA0361BF63B7A0D5A0819C85E1A9EC223C0569857D730688E6D177E4BEB8E31 -F873625E39573842035C5C6D66D923654A8FAD9421E1026987A9C825505DB5382184EFD3 -6C84BDA96B464796D72571760CADB46199643060A0552D8DF95A9E6C30787CBD2F57B0FA -D1FA43FBB1E488FBDAE8273BA4F191398652EC86743D32FD5708673AD1D39F62425934FC -AC949F047C873CB94E4A3CCE44A458EAF26953DE54F645CA7B35553204A0F5C7A32E92E5 -27785DE73A3E2A3A3FCB54EA4E395E73C5C89F64B77EE218F935AA4C42106A33C78D03A6 -90813236AEE3E50C2C44323B83401444174174DE4895D090CDB64274B70F557204C772E2 -D1C47C79C1EC238D5B345F7D9CBF27C6B98C5163E6D1D93F23F311DFD594658B903480F9 -A475D3A3D9BF909D042CD76AF8D574D71BA12EB33259C745D3FF5403E579F794EC95CA20 -9959A9CDF439138715101F9FFB3E867A2FEFC41EEE21AC816B7E48F340634714E98CFB91 -E97CDEC4C25CFF567676460102255E8BF37C8B4BFA821EF0165779094CC8ADEBE5778333 -9B9F4DC83DE0360DC52628543D41E0FC9EF2EA434DB9520C2CF5E74863D9BA197F8E7A97 -912643D24CD024E6468A188E0D1E903C48B9A996ECF5D9B64A64E026046E90F5C92CE2F1 -260BC6D4F298DA5A10B3620C4BEBB5C721B830ECC1DC8CDB86AAD6C20C9EB56DE6520D0E -29B6C3EB14A93D43B951CC2C690B277B426B84E4BBB4E1719278150A03C450A9FB44F6E9 -16DFC8986441969A50F06A4483EA651839C31E89A9E4644E96094DE5320CE79DA5499528 -AFDF9C150A4CB53A4EF9BAB6989BA5D0703A4F2F5D4CBC95719C0518DED3474F875DE58A -3A2C369EDF2BD851E5F2E0BCCD47A0452C8751E45DE47CC2C340EF4AB6F4F885B0C2C21C -8E8B252249C5B45EFA5B3E8A27CB39556A262F03A04639280ED71F8D01E12E4FF9D37C3D -3DF6164A4C300E495CEF60F368C4F5277FDC5B27E369483237780072A6709BB6B1E32F33 -53AEDF5A0B1A30EEEFFAEC01A0E9630E5A50BABC081DCF71997F181CC310023AED5BA74E -769DA4D3FA84951BA80EA57C39C805F1C4B42C7673403CDE1573E1641B76F1AE22E57954 -48B4C46AB50E3EA8B82FA89C9BEF737337168E18498C3653AC2BA51C757A15A8BE8B1675 -FCB325B5130E13C36A66E3056C8A0157DB84F7D6636EB06B83FE198579DF5135C77839D9 -548214B53BD51BFC1EBB8CF2E4B1ED77EAF56E953221F95D30D6F16DCF13A57664DB4DB2 -B45DBB6410A9963DEE6496DCADA35B5AEED478EC9297FCB64555373F4ABE73D92B97CDFC -0D83E4D2E80C6433533451BA99E9B2777492AB98DCB69C2AB9737E5A075FA29CB29307BD -315A4A67E7A5519B55CD6DC3E241AA0A067B0FFD337D72FB0B5B290982EE91CAC2504A02 -71315319A641ED197E14017EBCFF2B124E1D449C5A692BBD0E7486686DBEE2F15552583A -A52385CC9064ECC3873A1530112161BDE2008B484BB616459466E66985829F8415D83DB3 -4736B604DEB0E730A3ABA6D04ADE6666E303C40BA9B35FA5C753743239361A8AD23B80CD -AEEC9B8BF6CFE55D9EFAABE474D9BE5F06255EB903315DCD4E2D3469D08AE17F2813D7ED -F8B3B5D004347932D9B38955E27B786CCF0724784E0D545588B51460D9C2572C6E4C4B4F -9A01217FB8F2FBD0757BDC1882292CA04C24E7828D9A6F64B151A4EF2507C3D3EEB98F76 -77D041A5DCBED1BDB61B43034F4F6F5807953BE78631376E6D3AC14411587526E7DD2E68 -9D6241942A0C990123F2FB111F926A68B809DC5CA2CDED30262E71CFA275767F76D5514D -9B7A435A07670F011DDDDD31D8B944151A6A47C6EAF3AE44881252A078F261814A06492F -628BC815F32E0B889863A15409164250C9ECBFAE7A749AACEA6AAA3FBF9BBF40722DAE91 -167BFB833791D3426DF713F829F60F3F9638E1559B82C3704E048AC9879E4AF5C70C9641 -BBA5C04816B4EA6CDA7BE2DC728364587A5E7FFEB8DA7BDBFCB842FCEAF179244EC8B247 -7AB7337897FC0946AE494BC487510CA123CBFAB3B7EDCEE9DA82C37D55AAB651B887E6F0 -5A71F2331B1FF033A1D553186C786C224B1CA80D6693F4F6A948E338BE6CC540E86FEFED -280166B01B5B8F9B278A91E1BC632C3B06A4BC08530D8F1C89A6928E91B8E7C393C9AE2F -91F826E8AA3E11C72CBB0A552EA0261D5912A191127D351B12371E985C6DB66834869EBD -746F758FB0140C248852AECB41CC4972B6CEA24800F2528CFA99E667FD10EE57CF671099 -527AA11667321AE9277E4293811190986CEEFE93FB7C4A1F1A5884BD786B13F8B73A1A46 -19257501BEBE4E2A6BC3DF7BE7451D9364F00EF318111A8E4FC065022AF0EC88040267E7 -BA268C6FEFBA8AFB91120EFE066B8B23E40A0A0F209D3097881CC2B7141BDAF8FF7C5964 -4C029DDA226401B9B98C6A53AF6A93B39F6E3673A3054EEA3CF8CAFADAE0805018CFA969 -7E879B9C31521B340B288FC8910E5B6E061A027A4C69DA1BF038999D693108AFB70D0DBA -A90F3B2C073FE4251064E1FC887AD3708256487DA8EEE60795CF11DEAABF0CCD9CE8E372 -AD4CC8C8DC413B9D2019440173F6F83CC66ECA28C8029C1AB834DF7BF2AF0E0D86C66BA2 -6EF90A1761FBADC03C1FE598D954339A2970A5C9EC56236D9183E6155A511A272D005087 -14F8749B03A5A2B9DE2886B539F1A377FAB65ED3437D55988512B1B1C638015B0ECE68C5 -3AEC61020E34BD8E6AD7659399F0E1D8D23F5EE282BC764249B664D75FAFE67CB5A9DA4F -2094ECB30CB6B68D52AA665BBA751B446118C74148DF979A0FF173364D79202606AC2756 -8D41821B1E4D4175411CD766FCA1C25093E6CE9A37C2048755DB82D7448526B59766288C -9225108E8E86261B57C521991CDC273C0BD25EF4434670C80AF8DB7300F26A9701537DD3 -8FAD0BB2E9EB8F0FC9F2C8629BA97AA1980C39E9BE5740501BD4D57D71235C84C3EF6B4D -CA3D1EFCDF79B8D4EB7C29EC5AB15EC38B2104745E45235A1F37F19E921CB2213F1A91C1 -C392817E7D3AD3A6ED1EC8EE290CF5B1CFA2BF21DF8B9069F4496B7E80E7E96673B77EF3 -AD7B2FD6653510AB77BBF1AC8A07DDE48A8C2AD11EAF2CA95540A164C1B0834106FCED12 -E179477B185DF43148633CE3AF60539493D0C88173C0E63CB5A44790FE41C211966EE03D -424F492C2C87C04F0C28CAFEBEBEA7D11AC959E0C8A88776B4372E356C913943BFC88983 -1C8F95A399DFD02779301D05205EBB921C1F52AA522746CA533AC829EBF7235FBCB0AD82 -69A64B2C68748ED4843FB583151429A1E9537CB40960FFE9C9340CC11BEE00EC7005641E -964F4B0183C49262F3202EB6525EEC66CB68B27185B7DBE343FBFE8BBB34393DA1FBE929 -50702ABD341F45EEAF0EE66C848EAC04CFC854FC058A9418834B4F18E6D861AB31DC1C42 -DFA8D939921067BFF8815B708537A120CDB13E775802C57A0D0CCBC6ECD4CA0DDAD91F01 -97DDD9118990BD71A1CB241B88DDE7EA4F13236CBCD7CA64FC858CBF1E5A38C98C19E3AE -AC0B7B256BA7E15F0E49C84A437DF190A81D0E179B2AFD03A427F2F9AD83DD2A4EA893B5 -BCDA0F09C419FF0D0EE4A811886E2784800865CC8177D4E80FA005C014AD9B124D3D060B -526237FCAF98F23D1F7195F72CDE4E72B87FC4A872FA95441483FEC58EDE0C8B97909B95 -D5FF189C0D49053B187E0A1A8AB85DBB6D765EC78742E334378EDAD7F2FA77E9CED5F652 -295145D463126659E0F6BA982BDC32363FCEC79AAD13248135E6A28222BE0127D807306D -C94C817B649AC020B8B3DDB18CC5B05B83014A10DB5FB9AE6BE4A078FF056EF661B2F4BD -B422CD7E80AE9B6835330AFF67FF1024136EF097F4DD5344D37FD7562802B2A1713431D6 -FC1EFFEB21A02267D7F6B2552C97FBCD4BDE4214DB01C1376F07928CABFB1106B02FD2BA -BDC8C71D0278DCB64375613479FBD3D7D893D279A3FBE92BC92BD99B6FEF817344AC2DD6 -EEF172D3BB609E961180734E1B4C4F4B2D704BA4D1D3103BA4F62DAAD46DF7136070EB14 -549FE8C727CAF060D877D22E21F474F9627507EB1FE2A28534789407DB20FD6D6D9F5CB0 -7CCD392440EDA0E18E1A5EAA7B2C8BEB249A627EEA58DCA375DAE4EA816AEE7BE8BD92AC -AE63C97BA1DF13081EE64198B83926153C8AD6F1C86FA73986BFAA5F0EF5091A4B591BB3 -32ED4334E6D67A0288D390261E88FA39574FEB6F7B19B808DC87426BF13BFE2F76ED7103 -87A5283D27CEF752B20D831D8494A2E35DE7F68856AFB67B6EDC883C45840C6E83F1E9D9 -4E4351D50BB9A03B0F0B0527CCEED0081C96A029EF47F68A1BFB0A5DC673A0C8254216CB -D84693230437E107267B9244E2287BC6CBCDF73B24DB5B947D5738568471FA1FFAC537B2 -BF13C99D56230D49E12AAFDF51B03265A9A14529147FDE45C234282644C9BAD0C6892861 -029C9F27E4AE13F8278E135E89E81A7E552B11DCAD49507502B47B1580A6222672EE9C3D -A05B74A4719A849179B6C93BECD1F18FDC9CDB1EA52ADF96D29409B9B9DD63861A2C74F5 -1A99843FD141AC60A49FA6A134FF4C4328AA9D95BCE4B89B4BE4CFDC1DF3603DDB0D7DCD -E1A3FEC7059299A216BF88469B5C9B16C20680B14D414902E8A7D80E5429AA24D94EFDCF -500C1F1ED0F3853E2715598355B9440AFB9A8D06F6C038EBE0574B24E3A168E93833F462 -B24FA106DD40C967878248B2E1D58CB8E4646DE1F2B5BCF7FC02B4BC7DF7593737F583AF -03264E5C35FBF1227DEF2C4F6889C2F77C3B84638CB682645D0F2E99E0C4EF9ACEBB11CF -0F658F7D3163C488C6E642B5B03C1E40F69BC2293497374FB157F42111ED5B96E04040D1 -8C0020820B37A22DA38F4E21A64FFC24131CCA0F575529157E9A59EC6546004241A8F51E -9E85066AB22B72FA003CC868F965DFC34A2A0055FF86443CD3ABD3EDC30E9196C20629B2 -AF3A1A0C42C88C20449F889A39BDE45EEA0551AA0BF0E9641D7D1FE0F3C286C7EE34800C -20A72C954EEE657FB36E10ACDC18D165C8DEFEC48D154FBA121CF1066508A075A669612D -26B9309F2CD33B2109AE9E6B1EBD4391F7B66F625367766F8CF0B8BC2D201124CFD9920C -B61F71C4781B459ED271EED5937FBA4359FE1DDA7F3907ADD7C15ED021E7735985E6AA8E -F21011A13E5CED0B69877C636D293BB99AE7B9457E8C4B84C4EC695C5944622B5F47DEB5 -1F3D653C7ED73B53D16B504E761B8C105CBA84E45B408B415045310CFE8D693AAC924ED6 -C61A12C7B0CED04E630D8A04F8838F286E646960120FE35D0D13F9E273DB647A999F1580 -C1448CDA80B9489BB8E5E4507A7A5B5329A2E962EED597E4B7C4E6C72740EEB351A3364D -0B0689BC2658395E2B69A8FF0600EC50868404BAF6792A59983C6E372DDBEEA9953870AD -319849F018362B016EC38C0B7F947402449352CCCDE055068417434416F0475EC82A5441 -987A472F59AD152C56FE81F1501E88D0BA843083736F783C366CB18C8A787FCB60E6F8C4 -3B56BD458D9A42FBFFBE128C928DB06C7BF8F2C0FE209B25DBE0F28C1CBC8328C8E868E1 -F1DA76549F34B6FEC13E1400B2F9A66E00D89CAA99B2DDD6A0BFC73C09C7D774CC05629A -E23AF62DD1E58D3843EAE55452281A0DC2B31CFCE75A7FEAAB90041602CA5293EA58F8ED -C18635ED0234B9799A12388C2AA469FEE8CFE1B112F7BE610990CD51BB13D955CD02D571 -323F565D7BC240FE71E3A3A1B92BB9A1C7EC2EC6406F06AE7C0D14262319D389A7CD8D34 -D41313DE9B2336963A5EC892A8051BEEBED24ADCB1F0BBDE77C4E3AED1D777C0EF2F1AAB -DEE62B1967964C98CA08561EA234879DFB0F50BA067E1462CB63544786D56935ADCE3E7B -399B1B3D0098DC19E4EFC04922CCC28609390A7B163D66853C2C8FF94591CD1DF499DB82 -F0F6FB7FB6D3571735528F544C16786CFCC7FA10D28FFBDB6C455AF2A6E1F6BECC080B6B -EFAEA5D51607A260620EDD1DC6E8AAB588BFCAD39A98E028BD26DBCCB149D818E0B91BF0 -8AFB55C618FDEDC15ED7055521BC90689E61965FBF22172F584827852B6DCD8FD466953F -D16A806E20C5C96064F28BAC94F3A7818B18EAAD9BBDFA0FC302E663B989D97A76E925C1 -CD1307E43C97F88DD731AC971B862E99633A531788BDAA4847A1FD124660B00000007168 -72191B3F124402B990F3C379862AE823A3646762EF68A69D3AA91C56F50B10807C915447 -38AB8EB6C01618880F72A6C2DA6764158320CFBEFC9F23A0C1DB0AED395C70B28C4D47F9 -7C5018499E45AE5407C03CDFA41D02E18F7AE56346D872B03CD5FBDE0D0DBF11C1FD313D -E0A7856974BCBE0EB331CE51D190BFDE4C08BE9CFF6F2A32072454EBF4DDDD1E3B9CDE7F -9ED3B2C1C5C60A12813DD88D75CFA6A9CC4583764D40C7001764B69A739EC079E7ACA5C4 -1DDAD7D15C8807719EDCB3054D9DE3DA92912F019B50B62C8C4AE9488CD7D683565B2031 -DBE9E7573595ABA60602B6023C1D4DC8370A529873DFF92DE908CFBFAEE97B0273CE36AE -6C931F5282CD2341DAC0D6DC59A693FF4AE740E77322F8073471F6CB3CA99E7A530F5E82 -7E4C5185E015655F784855E4989F27CFB02AEFD20C3D0E9E4C1346ED248A6EBEE2BCEB80 -1B912CE4AE5475DCD5D0516397CC74589AD3D52E70A9DC423CAB42BE428CC2DFA56E2C9B -DB4F083F8A7B3B2B9063EAB3FC255A489707792141F87A2FCE77B89AF7099DAAE3EBBE9B -3655691A5538305B664C75DF2DCFCD53C87C38D9EDF8F7DF8A808851ED31E8348C77CA4F -3AEC6C2BE721FA3CE9D54B72B414A0992AC3A9DEFCF40579F59B0E30EE3A9B599772936D -5E5B921D5693FD702A30BDECC82AE6CC10132C2B6C697326CDB3201D35C4396887B5CD1F -1909A0C3A19BA71AAE02E8639B6AD1426866196F0F9F0DEAAF8BDC53720674296BD41161 -DAA21FA4534BA100FA41161734E310C6E88B8BACC050174028F4DF483785184B30AD1BD0 -2EEE2F93A187C5F48EB3ADB9D63AA4D52D76AB07B93CDA7F12F3C7D9E58DB297D2048375 -5E5C6D1B8F9C5C07A142E0A68177BD7AB073CFB934EF14D9616B15BA2B38AB4FA4B5877D -04F5308D74D642B46352FD84B4FFF058C282D308AD2AA99270964618A04C0E522AB7A4EA -123FEC9A47F13060E534C0C58C327B063D59CF96413E176031FB21F3AF9E3BF1BA6521EB -C71336E468A8FFD6AC2EEAED7ED016D2775AD2A7432534704B399BAD93E0A1FD5C8E6FDF -E8DE157ED4FBFA62C5F0D12DFE4C519713A76D6B2D35FFAC7C0B90ABAA8BEC8D2221FA39 -5685428736398AB87F9B73F7094E02A5019A360FB5E0A2857AB2439999377C9D4B1529B8 -D8DC1EE0B68D1A5AE1BE39949A8D53F9274D51650124E4BC873C07FF0786CA64EAE168E3 -B8E0210945249FA48059080232CBCB56A910E40D14A479F193BFBBD701384407A2DC56C9 -BEE9A4F3F011F02D0AE09C3F6EE0808336C70C6BD82525858EECB6521238C717469BE58B -6865E2E9867FC248A82B44142F5E825665F6780B03015A6CD2B1592F36B7F1C03D58DCE1 -9588FC260148D0DE42196BD052136CA1BD82BBC0AAAC6ADE4500B9F374DCE51779697BFE -670245D126066964B61D59864EB636C43D6ABA70429614DB400CAC2ED06D85D3E7C3D9DB -B5E2E7EAD6031B9798EDF30772FB9CA88F52D2A56C1CBA8F95202DA92870CA6EAD0358F2 -183C791783746255B2E87EA261A1D9C4B7B9B4174D412BDC01F4AC19DA76C423992291A0 -B0B85C1F62AAC83B253D8C251DDC43D921AE994E7122F7A49EDC473B0D9B71D8801A0D43 -B589E6C1395255D3515A637670589D6BF4CB75870D2BFF2491B7DF7EF95F04C0531C3C00 -6BA3CBFE26F52EB9D041DB138FEF272218451237E60685E66390659CB98F178E3BEB8834 -6B1E49C6D9EEE0677281D460E3AA55250A0D8D37DF9DDDE21F002A70E2F9A22F0AFAED24 -80C169B2BEF14DB7E75ED43E2317948F2F5F17A8A301E5DD65D1950AFFB85A1B4A26AA89 -104519AB57E70A3F506453128E1614BF850F371F29A9CA224B2B258C9830F3046D4F1C8D -3DCA9AAAC020617CEDB6FC6E1EDC69E17812FE92EA38C97ED91987A65C72FA48C353326C -DC7BD08632C96BF3C9A7C095391BCD9335E8F254E937A77855854EF20235319423D2DBC7 -DD2435B9EF9B9CE1046B95421A98E910196E802263650E5D2087E34E384ED7FABFB6DBDD -48342333407D7163A1B1031F841AD55FDBE7C1553CF17CF057652E243CDCFC8F86D8911C -C6DA2FA6BD522ED649C52DB102498790D6D55EF2AE27790595E8D8489EFC05F505566958 -33A31087D230F6041DEB7173D2BFFF6B59E643B532C2649D4902CA7FBD79F3347ED28EDE -D5EFC41B0B6CC97F6165806BABA7930768FE8E4B8313A5C9D69BF0B029CFF51B9470A22D -98A6257A6BC6B34F11536130A980D985E24F69E0846C395DA6C35C036940E609F9677B0D -EA2B923A92626EEC8E224E2BED76CBCCF6F2DC14CF8D90BDEC80E7088CA871846C68247D -C4912B6DBAD4C97A472C1FEB6B2B460929E374B23975046E6081E210116ECB0F3680D99F -E7BC4794EA19037638DFD2ABEB7365F2A7BDFA3C7766B3FF642F0639D897A3F0772EF880 -EAC10E1BA44C207039C64D2DE51AB6F71E703F36B24F9BCD0179853B815DBAB59057E8F4 -7C74B338BF128922C8057518CB7FA34AF8F590BDB76296E4258570F5CDCE24B4F9755C88 -F4F3CFAFFA1EF7EA5052A2C7D8A823D0A1EA7740A726FDD7B1D28D17B01A0EFCD601F20E -FEFB1688FBB375573F54EA1913230461B54B64174D7C99ED8A2DD269CB60B02050A2B300 -C0E7039663C388C4670BA295EC5BFAF496DFC11816ECFB433AB94380D1982DF52B362305 -289A0EA2205C91DAD93A6428491028D50A987C5501D0FEE5509196EFD2CD36D695B71289 -E2A4A96BB065C0D9242351C6A3732E49D51B5E472F9EF2524716B7478AB7460F43267CE5 -6B2DFBEE8D34E1BA79A57B175D8B9496BA2C806C2F6CDFDEB0DCCD0D813E79E766FB8548 -9087D61E7506F04102C2DCDE9B44EF10B38443F7207B707A265E1111FC0E411F04A64524 -3465AE5AD4FEC01561DFB4C1384B8FF54A0AEBBF189822B63ED986B8197B3B1085087B01 -B9EC606AF3C1CBEF701224ACAC1BAB4DE76FE28BC7F538DF318EBB3CDA0E9FB06214F497 -BC2926399C79CCC70A464C2B58D51A52BF06A5650D21929E4C2EE5AB624F5EFA25E64B63 -2ABBC3285A79C5576ABE016283D08E19246B77166612E83B2244A1BF5A7CAE45A691AA7D -BC31377285E78F094870584C23A2216453B9F0804BBF32FFDF810A2DEE41CB2743472A57 -D050F61E285D232C6EA0C2EAC1C0FECA0E489970C7B83D6F1D64B187BCBDF29815CAFF8B -8EC2AC2705DB255240A5A435A0B0AB6F2C9451C7E14FED26DA327D432A30B672CC7E0D99 -8653AEAA0DC7FB4161E604CEF7464934795E01C7CD625A2C7C4988CCD213C19CE963C6EC -F45078DD17A158FB2F9FD1241FE5FE0C45D05AF19E5C5D5AED76D297414EBF0E95E451F8 -B61EF47D7A80B240518FD2BD42C53B96BCB17F04B850CC889859887A2EBCA1499C10D034 -D545C5101EC917FD27B1F87B4460B8D5036A7072070ADB83573796D07A4C4C5348FA845E -C31C83BAAA79D880FC9965C08621C9BB6A982CACF2E9076CC88F14F4E2B1403A980AA310 -33CC1C16B108D3C390F95E87D6DA3FB4E9AEECA82F70424F82C243D0F0DB273FEFA8F57A -CB2994DF51CCD21C45A00F60EED00CB7C2CB6D131A57AD4CC98FA2BD0313E15AB964221A -6662B6319E305F2D2255741DA5465C9602E7AA3558B98B906B4AEC3AC8CBF877E51AE0A3 -CD1423A0AFD38716B0B74C7F492412AB575D9DA05634E20D34026A1E02B58806AE95378C -8018A42F273FE95E72C6E8BC54646FDC010E807B2E78AEE753E9A223B8B014CE464AB7BC -5C6FFB19A0687C0FD300BFA19FA2E9A65FD2A4BB8B5E6967289A70EB18821A32CA0751A5 -972A6F3E3054E10972F59A9DCDEFC5DB1E9FDD87003B98228BDDC733DF066CA5490A902F -2930EA9C937B586CDBD433532E6230F87773FFB354BDEEB778ACC289F3015C5158828790 -BD620956700DBDD6C2A9CC76FCA2868936D279495651B5798491478B1B77CE6656E8FB2A -69FDFCC2C8FE04C5C6AF6054C01678278164ACD9CB8C7BB41E0A4A4A3513283C38B03B6C -27E66FA995F58346B724189632494406D7B8E6CE243C5BF1CDE8C87AEB0E6F43C52D5D3D -4F3F9C876FB9ADA96302D73FD3DD51D82E1314024C5B1262CC009052C4E598A2B7D855B7 -BEF4FB97D65D8B26B69CA86C173CE21A159B3765FD48A6E978137FB2C7B9C4A39A94EB09 -A9825BCFB87EDB546D917F4BB3B618906C643280D3A33CC87311002B465D440C5FE3B8EA -1C3AFE1CBA90999683875070513E14D37D5AC6214D5E38748901D3740350CBABF87ACACA -FBE7CB2A97332D9BFED8B0A7EB95BCA79E8D4D6A80C1162A49C73961822A568D43BA71A4 -90E3571845A95B8AC2313098F7C3379DB959167CA17281F8FC7933F10BAF70A573981F5E -02810780D9780AE94EACC4F4A2D1BE14649E1B776175FB5EAF25DE613686161995472B24 -86AC004708550BCF2CE0CF3032A02BEA90E1163319C20894648844A936D39C7A266060A6 -093B59CBDD59E4FC67AF429BCBFB4037DEC87FD9CE0FC26D488C1987E0D6A79AB19A7601 -3C3286ADA28464BE78C5C591126978FE183EB480403432664318992C47600105BD1C223C -E78F8F5B3C1C56F298C28B700886B9E467E7ECBA6BFD0BCA114CC74CFE8252FD9FF4C39F -AD3071CC0E832A9F4BF89F9AE4FFA1FF02CE797052DDE080C175AE529C61B639D842BDBD -B8D349090DDA8F503C909349A69BDC6D972805B15D2E8D321E9296E3E0965E7BDB040FAD -CA90D1BE06E438AB653E7553EB43A4430E3AB1A43BEB97715FE97A8B76A7B5B1262DAA01 -DFF0259186017062090F6B9A35B9962DF2F7EB85B6D20A693B1D925DB4BF06996F60BDD4 -6C2381937E21B3299CF3BAA565727DFBFCD38BF24143D400CF99A7F3D09D17D5E1CBA49A -9C607D434EDDD31BC70D277CDDCC5CE03C001B53CB1D448A87DB676F6BE0681BF57F66C0 -43BA1BF6889DC9F054A544C4D498B74988D5DC13262AB95205386343ED6D3C077B058B57 -4C464D02E35DD342CF013B84CBA67538AE13A3F50BE444014ADF085E95D736139E1646AF -7C4A401E25B3511364DA040AEAFF801A664E71B0D2C6E46B510A97D5B75B2377E54BC7B8 -C4B368602743EB5856E4385C4FB3F364C54239B5794F69E39791CE5BD967BD03E212B8B6 -E14336AF3900878E5031993E3043B23376975A43CB032C9D9C1E485CF34F3A1F2055AEC7 -9A2D2E68CF82F1CA0DDF7200B9FE4172947540769AC5FA6AA53A87E6A79AE9CAC84C0FE5 -F0C0752F85329F95AB21AC314B7D32C538E70112C12A34DF2CE7127E5696F88CF65BD083 -5E57CF98FE8AE4873FD1EDC9F775E6920E87000CAF9C8B7FE3CA5A84A5AFE056CA8D5610 -69F8979E13055582F11FADFDE7BF60FA9EF36AEF0D85F29D94CE5C571574EE03FCE5E5BC -A5B2D3E4FA107FED636226B59D00CCE51BEB891DFE12F04BCEEC13606B051D5A50B08F93 -D0B3ECDE4EF0DE6E06829E559BB2AEBD02D0B7A1C505743ABBFE54A9682123C3695E86C7 -54465D3A60369CF9C3FA800658DC52000B8F6915A9F5549849EE092CFA885BD5FA96E6E3 -D04DE784BF6F17F333AC90FD8AFA98ED04F003E47A44893E943B6504791D21FFEE630A7D -026F82D0B903496D3E08DC35768EE6FF9AB617D29193A5FDF8A0976336297CA65BA71A1F -56E19EEBAF4AC438B9807AC1F4CB0DC9F740910E2BC32220D37A337FECB98301B0A203DB -739DC361838D4577296B9DF5E1DEF57DBFCA489801685288238CD8DA085C709663DE7F84 -127FC9E6C4FCDF327532C87635A6D7822D36583930BC9FA1746966A175670A2EE77D5FE5 -DB0F43189C37191F0ED80A333E8B117508E17C010FDDAA44820EF17FA9AFBDB754507F4E -1AC0D09A0FAFC80ADA11DA469995CD7FAF67CD8E29AB323C03B6A1DE80B684FC2AE84B46 -BFE4748300EF789A12A166FCD29ED3AED2FDC431BF9B3A450E2B15BDCE9F15C13E4C28FF -15E145C661B3EF6DF748C32129BD734087B8DF6A5C00B4765F2B518ED29FC53D283587F1 -2B62F177D14E3956A64C425AD811AE6833F2E095AC0F7BED54333095002EF33824F6A7C2 -3CD332BAEC7AB22642A5331A0C1656E3E2E4FA99825B5F1A04350BD96AD4E491F97E47C9 -F5FDEF0466EE0566D5F2ECBDC2C3B0DCA65728196BC139EDA445C7B5435E293F50C91CE5 -4FF3AB7112603BE44D41198C3A5BF2CA4BC460C0BD8D86073948C452AFD0A35CDF30CE1F -AB58276DC2A49CE15CB2C1EE44E0C3E07D73936CF675B1A40B1A2DA5C61BFE4E56C92FD7 -CFA03B2D6A9A108054AE303195132BBBCEAE17F83B7B9140BB11DC6D2A3B17A46CE4FD4E -0EEB5FDBF8028B1E7052C602C5E7BC63D6F6A9172032D538B495C3D8E3DB6FAFB0CEE41F -35884819BB65463B11378A7526B582A4D2EE1726615B66E8514B4173C47B399F86ADAF7F -E7F7C08A707A30AE31400B603A31951A7F617BC16E5905ADEA0197382CF2F799F8ABE8DA -134FC37C99767D4ADFD45502F189ECF7D08471186F4D29A054DED0C5AFA56A8AB3AD5F3C -71D784803E0237F41B764C6A91676BF4623E80803231960AF3B941EFD842235968071455 -F1BECCB46F437930B443A1C4F681AE595A7F7057496C5BF98FECFF07CE1B4E3653B7AF75 -2F647322BF2FD773C8C79B305EA2365EB878FEC55A277066560401CCA10AB996645BAE4E -728E34864C7F2F0ECECF66C0387B2DADBDA23EBC4C0B904C5D152C9856EA1FB76D10BFE0 -7213A87551081FDBEFC207AE33B860649D445724095B28D45354590E967DA4960814E184 -2ED400AA72982427E378092623D784272A07450265A89A88C13F0A71A03C4234EE525034 -2F5F28BAF685A2D8AD6C195B4CC3ED9DFC0E82910D692ADE7236347002251126C4CF7C82 -175624CC08445EC64357BE592FA06FFE3FB52720F4CCB0A78173F0BFE317F2C22EC52607 -C9479BFEDD6FF60EC8F1F613251BDDED25F2639E469B344B86ABF4BAA8A9E05C5AA49C91 -826B39636461E805364EA49E222129B12D357641D89411DC5081064473E78BE378BE642D -16B4CA3D926E508E5905AB84C588EF25E3AE064348C93A28880A02B0665C2486BB41BCBC -8CDB229607ECFD58E01D99D71BC1AE9DACE87D02D7567D570CE3BB7EBB5877A5E309B181 -0E75AB6AA6E2A72B9DAFDF89862C96141D72DAAA090F0EC8A239F1CB565C7B7523ADD890 -76109390815D4D128B26523BF36FFEEB3D1DEFB8C44460FE64C11F1183A99BBF9C5D7BAC -B644531BC4873EEF693B2E5401D764F0172127F873786FE8A95142DACBEE14E4B1E11E5E -13B3015B6344C9B27CAD49C457FFFDA86E0097D8533F76344AB561593CC09BDBC1758F07 -9F31AFC4BFCCFDC2D54B8FA7F1265E8AD350C44C940B8111B4A59D078423535205A22202 -92F892CC2A5AA50ABFA912D6FB0304EA164E191CCC659DA1E00B2DE5A6830B60D69AC9D3 -CEFEFC2CB0DC016B7FB41D5853A0BE141DC15CAE07A90E56187BAF3716B7A7CC839FB123 -69DCD8656F62C1E631FCED16D171A3521ACF60675FFD2911A20DFE45A57887984AE2C41C -A8C6C24A12445E167CAC1A3FAF610DDCC8649C6F6CF07AF89125C6F37C70B682BB77394D -F4F6E7A111A0ACA9CD25E1679891B3FE9FDB3EDDE1D3805DF7C42BC5FE4A6D91C7042F67 -6ECFE15B9A90AEA755B3E032C60A71554102A9FF4C2E9E467F0B7DB9CA0F2AC3CBC3CDFB -8DC2A7365807E409E75E89047415598A8720B25CD32FBC18C12EF6E1F9A193132C0DA8AB -134A567DE1BA0583E12BA2045A36C298ECC4F909510D29ACAE1EED825ADA28437F457BE1 -94FA7EA3ACD0119F438ED2A2A31BFC511BCC3CDBCDF34B6DE3DFC6F4836178D9BB35BF9A -C546AD2D1527D1B020D2A975E83848CC431CCDAB997A195E2AB6B3D5A8980D5824EDA901 -EDBD85AA2B82480CC76BA911F2D4F7E2675E69F4005412AB2E88861A7D925EBDE0799075 -F858F32B8BBEBE0F6138D4C8AEB2EA647046C533519867FCF286E04AB146CE6EF4080A8B -2026BDA70349038DE8C2B71B2B2834E57D4D486F95CAB49C4DDC2DD17D8C959101CD2DF3 -D9E4E9FEC4CC05B2490A90A30C898E8588CDEAC838565BD0B6B494F2DFA565A606789728 -0EAC877E47201EFF4329FE524BACE5E90E8525CA1F5206B83D1FBD284D1109651141B4F1 -CD1D1F5A0406B90E4FEB435BFFB60BEC00454F406B6CBCC3883F8D470226A8214207DA07 -76CEFA99D769166A8327F8543039B44FE297A1EC1611713846E67B20E0DF311F715E4CC0 -3D1AD8EE1D14FE0AA2D55D1C30F9C1F12C9D8BB8E5429FDC4247AD4718B634AE34213480 -45B9ABE0C2E231914402548748A388FFE3D5148DE9F9BE6CDC21DEE4B5F9FB0C3A52EE12 -A9B23D6815E76979C6266A811157E380AF6C7911D55DD522FB766932E2CD361406517268 -43C8C1EA841219D167757C201022045656A45FA93AEA1B404B16882F20BC30B36FC2DB62 -96DC200D567BA9B4D49366EC4D3AF556013DA5878F04B437257CCCD164EA4460E472DBFD -AF091AF1C2131C55FD31E7DE78BF0380C4B34C89528CE0A36ECEDEBFFB34DC33AF1006F7 -EAE6444F7F063BD1B1B9C88850B1997D3A24BD1650FF98744C9A0CD6F7246CE22A1A91AC -D1EA6FBD9237C32B80D6BF79B40A3E622E83DFF1366BC6B7B6295D5785BA00342C146BC2 -527FCF50B73C17B76D6B4B0B98BE03BAD8A67C7D547C866DB6FCAC78C69735F26DE9FE2C -D9504F5AF31727791158F17D129677F5F9BAEF97A1899A7DAEEA53E70EC6C822C3F893B7 -3A4C313551553E902E762BC58D8D1E9508D9D3355D5FC528DA87BC94DD9EE305ED737379 -CEAC96549D3E7E505A13F11EBBF0BEAD38601BE5BF68B1EBBC504F8D9B4219307F7DE93B -EA6B153F5BB35E2B50AE9309229698580334EA4590E06E41D834EF86DECDF64687DF0258 -6AB142A457531A9103D49D0D64FD583046A107210FF1FD544A8B07EA3DFCC04ED74BA498 -E927C72907E896B8E6C0C0FD016A42B6F45AD628761A78C405C51BC07DB9D90D54674B0C -62F43785115A94708879349142D612DACF210116A3EE5F0AE9EFFFB694C328C73EB4FA11 -56E38C4E25BFCF9F441C2B0A6752091DD9F9C2175495B973CCC0EBDCD43125CADBE4DFA9 -3E11EE051D6D46B0B8A8C4DD6443D392CB7801D131DD58696594B1FFA5DB9D70F46E1C7A -84B445E50922880FE987BF899BB603CA937D4DD3386C24D24AD31038CD9C5727AABF3DF3 -0FA105F554A39A091655147C8511B818A5932FA9B33C2B1DE319C5F704BD439ED6E1B8DD -FDBFFBBB038B350E1B8579A1B2F55B24FCAFCBB6905F24C82A3FCE3374F979405E69BD62 -6346E4531E130DA4358CC11FAC6E705228CD1D4BD865DE15F2C8629E77CE5152E3CE5207 -D42D9265A4F27C5FC3AF11712F1736F56CAE5DB347163DE798EA934C189E5FD6ADF49DD8 -4E9692559753CAE3584F3C43902F775B9534A4B541DF22DDDF723339562A5785E37CC808 -47E59091A5A339467B57F15902EBD2399B55A19E098ED661A475A559E465A502CA339B3C -64A55AA28D3DDF57133DE6FC6443B563A0D49F898E0CBF45E55748AEA9E7A215D26E07B2 -C8CEBD2D9D233D8E86D53D079691EA21DE11F9C4FE0D3C904C5FDCDF2301BE7C896C2FE1 -036C2B3D9EC21292BF87593E27BBDA40DB83CA23F65C56064816657C97DD53CFC7FB54E5 -353730E625C5B31F030BB0E1D09429E6C6496EBCB17C114667F9B8A31ED328AF0EE9E7F0 -1AD0E70AF25BF2BBE8F99A4AAE42A6466347CE5FECF91355D61A312C550AABF782CBF1CB -649FD914B4AB1EC2BBDC6EFD65621921858E9CEAD02447DAC2CCD4D9D880BCB1513A5AF0 -D931F417C1342554E7EFE9529B18CB931453AFA51E2830037D2DBA79C565EDF25A0A7059 -315E242D82F2A32DACB9D86C62658FFB7E5A11D00B59CF45B48C1682FE8FC4A4FA41746F -E6F734D86B7CA91C976D40B64601831546DF211405F1F44FB6B8FAD3E880B74B66A93783 -F12CBBA01B8D456A1BB0DB78EF455B230B53F95C4E7B13EAA9A8BD49F886CEDBD9066819 -085B30488B011B125737F16BB6B31908808E7B076BF88E2F23684929602C888BB3A51D29 -A3D8DF55B39A48E5115E686380452EC5784D09C44ACB5EB20ABF8DFA9DF66344BCFCF175 -A877296E511AC83765358D8C091B91A6C70AAEF9A66C2F36F6387D5795B60261381CAB7D -9A1EF15EE18683C485317692DC0CCC859F5DCF51C3930355BEE5592A9E5DEE4360E8151B -582E019C674501C0F27D1EEC05B1F55FE9F79C5FCA04AEC51BF01CF8BF5DEFA0C9DA4DF1 -0D923E6E56D35364023C84D9D71D68168A73ACA6A6CB8304C1A830C3CC7155D9C5141DBA -165A1C733FF5320A1D1028B7B543D2A1516071D0C02AC030E52BF79E464D8938294A7D92 -5874AE6FCB352EFD4790F6973A627FD2979C19FBF19D2870FAEB6BE729D34FED4C87264D -65FC15436A57DA96DC09C7CA864CEE0D98AE9C498F258C4599CC97A1B9095825760D06A5 -C53E257F54407EF4DEBE04606D65E3D09C01535736D3852089D8FC0D2CEB60BE19D959F0 -CE1858D5B4B72A953FDD1CAB16B1768236162A67C1B77CC4DF6393A480DA4223B65C9747 -67A08C86DD75BEBC418E370D5C2853523D68852E705A4BE611142EF56ED90583181D8559 -9AD285830BE0986BD8FABE86377F5529A5749A30C89A272711A694AE29E2700034B6B620 -5413F9BB288AA9B0BDE0E91CE8643E96C8A771FEFD1EFED94DF8D67CABBE928E3A845723 -BA2B85A2BF2BB4F784F2324040C42292BA0966DF1A495D7DA80B9B79F76D10F1A12D53E7 -A16B3175CBC39C1BE14A36CA1E3C7CABD9F8DA323243F0703C3BBABD48B1CD35BBF2755F -2508FD2D66FDDD1DC21D232CCDD7CA5E749A841F82EFF35249BD72B0820CC69FF176164E -EB3E885E1DA18762FCD40761FB5C91D692F2678BA2BC45CF1BECC0A8C28EFD62D1EE29BC -2CA29D922AF0A592E19AC004573F357ABCFA00916487664065D3864EFBC54AE0A70952EF -676B5087CDD43D9540C784DBAFA0C0ACB72E35CF6D82789E3352A16D379A4C26118C4B5B -8E5C7258B2B9082556A1B018085F19168CB7787CA06283382260FA3743D036EC4142DD7D -2654BF95651123718193310928CE49B532F6B26181B078228B97B4BACCD79F6A8DAF1004 -096284F2D45BA3BA14F1D0CAD558239BF696B1F2D6F6AA2D11693B497A7FF12BEB36F65C -C453320F8241820AFA96FB54E83DF38BEA9C7A004EE4965EB7104982F4D7847D397B9EA5 -9F93C61BD259C3BAA15323EDA020E35DD78B7FBE6D7CAFC5C34D9C8A60B079EA6A3123FF -B7352EA72DB9BF6C80E7D97AC188A9B8BEEE3C80819D35EDF1CE62AC4DA459EB208BFF41 -4A3EF9C4E3514F44EEDF60CB817EC66E3D698702B5DC889EE0C064A387C7487DD97B4EE1 -2792DAB796E4123E9D7F3191B22F2481A4602CFDE1E708EC6BFA63C771058B380EE6AD48 -2524F9F1FB75D470EC11226A138F4B9E5360AB443D5091B324271E8B251297D8236E3C5C -E92AB19E2005DB4A8BB12950E6A3C47C16229F300F8BDEB8A54211BA195589F6C8CE22C1 -A32B3610EF0E43458132703F86AB9CCAE7F99CD7DA69EEE32CB011EEED797C841ADED034 -4BE043DC76BC7E5F877620283E923259EC2100FB83832D104A256105EE8FA5742D7E252A -7539334AAACF79E4EFD98C32661AFCEEEB5A9CE44B2CEB765C6FC6B361E95CBAE60A8680 -D2741C9AC12B834BE5EE4F498B1FC7137BCDC32A225DBB86B1F342BE3FBB03A17624066D -2D652F7F7F8D431AE8DC401FA2FC64AC056A9F29DFFBDE1E07BA398624F3337B6001D1B4 -F54E9E67B059415D43144EA8DDECCB6B57022B678CE554EC7979BC4DE26BBDA16059A3F1 -16457844011864CEA021FC099B7FC141923CEE982E2915C6D0C28767027E139BBA2EB02D -49DD1B247EFC7A2A1504C4DCAF35305671CBB20B2BFEB0EAE475ED4AD53293B94A6E6AC8 -41FE1E9CACBADD1744428F6F992348A3B1D391CF65C86E2F1E57382D245C920C7CF3140D -6AF604F686019AF155ABC0B0BB9835FC49755277A5DF9E6F0A7B8E91EEE7A2287704D71B -64D4F6D0C927DF674B35A38E98CD7ED00B76966B2E44912BB1EB240C25AE3DE8E7668062 -55CFEBBE98D8A49657D1B230F8A9AFB157AB3BF74C8485F5A275B2C065797A9B3E1021DD -7FC20AF45DBB60346C53E3CEEE031619153CAE0CA4A3C25458D73EC46E8B7196CEFFAD73 -6243CD4F81D73A2A7D0C3F58DFDEACFD4330655FA5082CB75FAEA9B99D8BE6A0FFF920FA -9F8AA5CC2EFD3BD09C3B8A94BA03D1411D6AC5894A8402330D5564AF8E75AE549A11BD49 -E15B20F7879DAF938B09E430CE1B57EDD9346CA8AF022DE5548A4726D49E8DC439D7DE79 -7C006A7AA78B018A1D68E15AA83FAF97394FA4F0E1460DA5AA9710656AA1E294016F2F8F -D7B10DFCD2D10AB59308DE6108C3D44CA6B5B1A0A5408E6FDCBDE1B5CF86CD7A9F815146 -B9721F11ECF3EFF7640EAEE03D8D3B4B4F055C6EA18A7FF129F369A1FDEB7B71A3223890 -BCAE11DB2848941B6323221AD976E5986280844ECB67C4A1ACE6BC87517A2DDB2F928A01 -8727B99FDCF0D0CFF57A0BEB04C7DA62E41E9623AF0FA6EB651E0D1C9C72140CFF8A7A2B -BBA67EEF1AD2419BD5D399E09F2BAE43881E8AC834E46F6F1C96B6EB4DEEB32637DAFA37 -89C2BD92A4989F9AD822A6483D516A143EEF6DE93ACDFF3B118F8B80865EEA782EEF6DEF -D8E5E9252B378E3F09E770F38CF1A71A5CA9E872EEC7E1AB4AE8B4DCEA41630FD47B9602 -81A711304DDA075014AD733B83D5631276F636D4A470C1DB8F5B1E1AC5B005FE2B5B4D79 -346B39D86048D7066C0F5476FA7E8A8F7D48488F49507237719121AAE83EF6938AF31754 -5C848CE4E8A118A8093F5720CC4884D3886A5BEA6312782D229ECDC11D4AA1731A5B098E -DAFBB3EAF2C539FBFE55E96C1129EF344000D8DDD7C7CD53196B27AB252155A634FEA9D7 -971E3079ABD8F38DC7C166B5DC2D0B1C66D776BA678C5C57E8EFDD55EFA2F5B5FF8DADC6 -0F18A0026B3159C7FF28D5283E6835147CE4D5E5ECB6A8E537CDD7F8F7A0E7B6FC53292E -FE0F780D9B58293F527159A8440C09FD842877464711F7256DD732AB76D834EFD0C5557B -DE603FCF0E35B4025848595E585A7707A33F0693022B06FC2032659BA15DA56C183E51DE -A5A8921061E9ADC27AB380DCFC851ABBD9A51632F60EF08C2FCF84A86A89516D66DBB232 -A4EF10707682B9AF6A9B584766C8432FE43BD4D2111F81446E0D508817D6E6742261939E -36C71EE1945C10C1CF6FCA1236AE71A10957B57B1F8F69EDACBBB9898735D2071C073E43 -6585FE7EB0BC41E40DC59BCE6C311D84F9C41929DEE8317615033CE146B3C8DD7C1DFC28 -471226DCBB5A003FB6185793B313EACB67A443C60A2A7873EA4F13C0DEE9209D4829FBDE -5E93380F14C2F04448CCCE8C92A0494E4F5BE68792D35D019F1C4279D261579261B6A990 -6ED88C23D9D7993D36FB0F0ACC744B14FCA75D62AFBDBDDE020DB4EC979F9A816DB0AA8F -767A0CA4D561E00EE5917AA1FCCD701A8FA3BAC8AF96268B9E141D891F15B918882FBDF0 -4B611708AB3D464936D9AB17E781DE646C2BE7EBABF82F4D547F09719EB03FC702894480 -9E8C963D076BCF1DD1C29F3E6A57DDD550B4C50C940363F0015EC80F170B282BF9E9E8A8 -7E11B31975583D1B8678BE0F782DD2DA711A0EFDC5EFD9BCB47C4C458AE693207F67915B -388CF71C508BE8A2E3336692A068097AFC21A42DF45A12CCD4E6E005857D04328032A455 -070E65A5F1574DD06B48CB94508FC3DAB04FC0D777C24F1B8A32F5401919441A01C7FEA8 -90AB7C15FE2FCFE62713F42E9ADECCFA5114E46E8FE38448282A694BEC76034775C730DE -B2813ED4E2EB75C8D2CF9F6EAA42A82C5C711BE920E4497E4DC4F60ECD923B6F21FF8C9B -2AE3EB19CBB422FD027B4C8CC503F523E7B18DD1858D1DA08C9B0D0B9C9870D549436AE8 -D21746C86310CB94923304496CB2112D91AFEA2776A9CC7CD79D381AB7E251B6B13E8DCC -36DB7BDAB3AD9D22C7A9F6CEEE7C130E3753C4AFC946839697EFFDBC4005EACCDFEFC029 -9D259947810AFE57002A3FD3B9446977345BC5D5D53B6F9722C47DDA534BFF98C2433B0E -EA965E20ABEA481A9C81C612ED51CCC35A74CDB473AD0A5D2E42950AC1F66DE6393BC9B7 -B02B00441EF8CC421695854293874A7168496467FACB15062D50600824D18F65E3FB83DC -C5273D5743A84DB5CF9D38AAB1478BC6CC1F849ECDDD397DC56D1B1BA395684520D68729 -FF5132F4F7B48A17DD6FCC303871D6AA2F29CAEF2EF77E0C149829B9225746D43286D1D0 -940E765628810673F32809AE451309BDBAE942726E9A2D57711683B3C4D39F6DC393A20F -BF0A8F4F73E8A103B3D9B12572BA4B846A0A9EF3702546EB97A046264F067FDC72CCD091 -E357B618687BE9E5C7E667914F44EECBF3DA82C9464380981288AB2F9B058DB262EF5BB3 -0A4E0327AF77B82AAF49479A96A6CE7051D2277EEBF286FECA3B0CFB56E1A94B147620DF -BB6207691D8E751D5E468B36BD64C8220F2883A5DA60346EED5616F924660658111CE6A1 -0FE807C63FB67BECA2AC00D98C47B5F1CD6B9FCAA51848D97EAED90AFA582F925DB9DD91 -F77B73CE5BCFC0A8B21C4A75862B345ECD68545A4ED15FD4A3235429019E3C922537DFF6 -F0C2907B10D068D116EACC7E0C82EECD67C0A377E367500BAA0B47EE6444C4FA196C7DCB -F1B080A2531A96E2A874DDD02793E72C1D259C3004474DFC91F2BA21554D2DBA3E4613D6 -535691E6E4AC04940353EC25951DB2D4EB2FCE5D701249B835FFED7C78225A84A24D138F -631AB67295866BBBD000C1D5BD26B43EBBE4740716DA3D8293CE4E359792F7120811B32E -2B378B876D41E70631187CEF898EDE78C0A8986CA30889A8F53C2344384E3FEFFBE7AF07 -171E031BFA6536E2E6719D934F74B39169E1D912790256B06BAD12CC3AE588B2B2DF1C7B -ED6A3E99773C25BA78DAB1C8E902D65E4E55FA9005C4D80819AEB20723269B6C091AFEE9 -29D46C11C198A7BB0D4260EC9464156F655EB1D460DB7C72D932CA927D39EF98F35EB6DA -7F8143A443DA3D0E909E6B846DC2DFBED888DB41F2C03D9C9B61F31B2E8334DB7205FA8E -C2B94D71CCF61FDB51C66D8AF7A47417DEC7FFBD8A052779869E709F3B36BB74340E78D0 -3BED0A4618738C9D2C3C447C0D50BAFD176208820D1F314E21615B7A4397883F8D59E65E -80A814CB6E8FBA91B0C410A8B7E37188C1849AA206A66162902591AA90F18E0426C586AE -80F63CD8764DAB7FE811172A87AEE833E935F5F56AED5062E2B35F6077EA26AD8DBB1011 -745F36D936EE50A88144F211B37D8C169938EDBAF26E277DC7A921C0154317BB081A7537 -F0FC37CD6EBDB6F97130CCE08B85690E173D7158367C616412A63D0B8ABAEB47B1BE35D3 -23456EFCF7962953F630002DFEA23DF4672FEB5DA149B713FC91C94505596471E44D590C -54FC5D336DF319A98AA87DB9D313B9DB208DDAF46FD5469AF90F548E704DE24E3344B95D -6EED106864FAD4001FD8DE48DEB22C8AC3FAE18F7B176804DCE5AA2144A073FC9BFE4CAC -CD6CA534902429E28CBEECFA8D984A71E77B5662A1AD114F301F548F192B11ED7EB56BB3 -F8FE62001753FBF161D538878778501F917441F9C5DC3B39704BC1A234117157303EEB24 -EF453A1E05208A07B8AB22DA331527E0871EE7D713917E86C80D2FEC3B934E5B7540C672 -34D0FA0E4AEE6A5B1706F2F3AE147690A76815F5575A5C5B44682028A065FE8037E10526 -5F282058D027620C117A57CACB77AE153E8517134168668E79017166CC435DD24831DE0F -65872D49DF581C872FBD74E0E2502B9C0C741322E9CA72152E7DA26D84696366D3DB5C56 -943FE579F99CFE384EDEFEDFB30F7EF5ACFF5BB88327E5A63B796C7EA2461B21419592B3 -65DABD1DB63F6AFE1B959CD018163A48D82D0D36284F118263E9D2B8FA2E3104BAE034E1 -A1DEE263980EFDB385CD6D687D1092752D7E3A6C46D678BA2A2F3E208988AEF16EB2C67C -0C5DDFC85C6819746A034BE35F5C6DC967D64005E4104A7EC6C55CEE199CAD3F98D83A22 -E9A32D0B0F4E7DDC4BF81D77914EC3C3DA3AAF51424CE3B50AB293152EF0EC717F16815C -4ACCEA27FFF69DAD5AC1DD549C6CB01F23F3C5A3DA340CD914849991C554202076C37DBC -7FD48DF9DF23F5DDDBCEFE0114A2877C31385A184742AF5AB3007908A359240E9DBB0AC9 -501B7BAA815CC273D953E0D50802CAF8C00FCC054B10F0AB7C072C573FC4D3EF018754EA -32203E847125B73AD879F613804FFB9470CF39D0694155B3D5D500E3379A163C86CB1AD7 -85C3AD12B724AA4F203C212FC0FB7051CD0EEFA161920E515FC83EBE802800D1C851E085 -B069541D8E183032EE5FB6D8200376FF0FA5786796E7B33352601711A2323AB0F2CB64A9 -B71C936643B259BB73CAD6D04B33201FD772599DC49B9611533D53630A3C91A6DA4E3CFF -519BB469F2C23613B0D445D98377E8EEE6218E0CF7333EB5C4257AE30DC6F8FD35C5978D -4071F0D9464C260223902E3C76703BB2E3B3FDD9ACB3F6E43C3BBEDDDAA846A4893A6E6D -6E8D5AF8FD12DFCBEF1B5D8F537AEE87AD8AB3B486910F0013FA6239528F698F61B6A2FC -FA7CDF66B238222B989DD390A1647AFDB9AB7E287F5CD96B7E443C293B39C7C8A91A207D -E7F0A73A48387C9955747277BCA7E97EC37EF0741EDC541F9804C12F95F3325F2E80CCCE -0CA03C931C7FFFB7419BB3B2A3A67325DAE74C4D597C41E922B09ED70F411F7E29486C5A -3D94A857CC69502C6DFBB6E63780DC3908B989F01116B28CD8BA096CD0B09B3EF4AC8E64 -55FC7300CD8861EE2F1FEEFCC03D95FAE9DCA58000441A1D3419B77DA35E80CA40C0C49C -E1DAA21511AF32DDCCF3935CF78808330C469C4F12481571303335C945937C0080E56DF3 -ADAE10198495A9E04DA1AD8453A5C3B7D9E6E8A8F6F57BA249F0E9CCDFCD8D25C8E39BCE -2B158052D9112093EDB087E2DAAA0C835634BF21B6C767D7D622BFC669B78040109BD4E3 -673468377348A6EF3D0E6D1D7BE8A07BEAE0D72CC158FFD8904003E7D928F7F9B78097AB -A98804FF2BEEB62C695333EA76444009C03751DA71269219D0B30BE98C710803DC3C1159 -2CF0B2D8317B13358B3D96F2B79F801E303417DC8FFA4C1B5B246C5167410518BF7B122F -072E1C356BB87B6BAA4B36609C3CBC4FF578ABCB0A9B4241AC991354B9BE34E831FBDDA1 -D97665C37DD1AA4E2E2AF3D41D2E9561646C40D622883D790D6986C60A2E5B2D27D9370F -0F2E57DBCEBDB45A6244D1DDE4F64D30B94621B21EBDD2DD7F87E75E9BC4F47F1E94450F -AB7D3A2687C66FE4495A05AD81E2C0AB09B4814422272290A024FC55819E7DDB08666BB6 -FF9C9C4F1AB70697649197C550C48D221DD1BFFD20AD9B43F876F19CD818F3EBAD352B94 -03A050E79CA2A369363033508882A1B63D0755B43E01BBDFE55E7F6C171E1A6BB37365F5 -6241C6DF75D3E1B1364A655982D595C66A186310A5B2B3A4C99D39069337E0B7F3448D7E -E8AB0C5EF3AD79CD8D9C86C1E54392437C1077573076513C0DACCE6D16A3ECCED9C438BC -F7859B1ECB294B03260BA9D9890424DAA816587C4004FF0905C6026A04E130E3B59F1952 -02270BCEFD5B7CF306389D3F255EC17C85C6C53D597E11DB5C1E0902508F22044441EEA9 -A474CB66BC40D45A2E0DEF1C83FC4432E155567ED91D8A928D2986479F149E4AB3987D95 -93B419964BFCA0E042CCF7807B125F29E22A488BDB19285FCAB04AC29A564D599075B2E5 -B3CF0C6D53BCC23C1ED6A5206A6AE91E2F21AFDD4542D64A85F397B3CB0DC1F2A0C2AA87 -5C38974242DFB90B4CA67259D610BC8691037931C69D18242CF469FADC88CDC85FDEB881 -A431ADFD4071F3C856EE5BA0196D1A7F157887642EB50C8662ACF5BBD27C4038206FD907 -8AB7146AF5B02FBC3B84E61DC936C2B79F204C8765D6F366CE1DE4FAA944852EA71AA25E -BFD160E6286C927FC76EB19F4C5878B5D847FC5A941B8F2A1C7C38A0C310DDDB5D171E4D -0A1774ED965F237A5396E5A94F87367DB141DACB4448F67789C26DCE06FA01C92014ACD0 -1209D727E37A5C64067B2DC0F91530D8AAF59DE0D750B2A18BE91D7A3362EB026C438FAB -EB0AB75C8B2F4137D843BE8EF156CFA20563E291B34F19F97081D4E43F4A62DC72591D54 -289D839CD857540EFA38AE1A02A13EEE35A0A4A3576FF6AD5598A76B3E83FB67F5062FDA -4A2DA616282CEFC090E154EBEE481B906CC206AC6A5A9AA442265E95CA379785B96E76DC -D4095708AF8A65DC213E42581C59359F3B48EFE9F20AA85E04EBD4F8B4B8201607BC2CFF -FC71D43AB06A3D82E766054F2A54734A38A714058C7573B847C8A3A82304638F2579F037 -83B88E29709F5AED8F17F68BFED85C7589F5343D8A1B73935D693E70E49F67EBF2E85104 -F1A384F7D6BB00AB4067F816CB11C71C625136E073E4C98486A5972DF70B5537693FF55C -DA94FFF774F7C10120F4836B9E26941B8AD2E48B90D71ED129A48DB73DDC0E7CD569272F -33014FABEABE382BC029832CA1A7EEFBCBD24CB435B58703F1E9909FF7D30D37154F2D5A -29CFDBE1892DBAACC07E68544AD4A1E672DD620A5EA6F84B360D6B0C9D2A16600731892F -4BA194089DD0D829F7DDE7885C7FDB37B8DB601623B7B398070E617E2DB13AA6B7C7EDA1 -352570A133F0DD267E23EF4885DDD4B6A2EFAD3B55741CE7B36475A878228A200A49202D -13A9EC655051C1EC4FB61E9D3C1029D21C4B943A64479F82B247759FE49DBCD64EAD1605 -81159DDDF18584457D99949AF2F2EE4F2E3AED242C25919F51CB76A188867D5959D8AF10 -FCCC2DD8D2EBD266B751EDF244BB8284A4705E1A4649A050348AE54A048E515F29469FDD -B04A905C3B9C2B3744455C781BE4487DB56A085A9BDF8F8256FA4C1B37DFF3295F5418AE -C03ADCB277B3157A1DA2D7176E12B334A49E7CB311D6BEE45459160E34B024E8B68A1768 -E83A7B8D7E0D5167E4BC7EA55157A20C82EF009A2631CF53205E11B7D0E7675329822052 -C2FD7C1FA61D269A90B94A4F103E6FB3EF6B1B0304ECF573EEBB1A432F7AC539EB7D40CD -C2F67D1D3E87E6B66CC16B63E00EA442036DA83A7E3CC8F2946CA59FCC0C085D642DE6CF -7C8B642EE62B830ABCC7CDE13DEE8C11A4718ACE97C8D47BE41AF8DFB4A95D44EDD219FA -137541C53086519D6F32112A2507D37B2EB7D2FC10AE66CC5D5A2D6A4F8E6F084A95C923 -CB40B8437D3D51231B50C72DC5FEC25ADEAED8D72EA6FE59859CD3512F36A0A46D55607A -AA143A65CCA0203366C702554B905A093B2E845FD90002C689CFCFFF02586DBEBCB11688 -7FF863EA45DD0EED511F4CAF921015383CA0391E393A44419B34E82789A62502C19B3287 -DEF1F5B24C60F5677576902DCF76F00BC4D3A056875990D18BA69154154C76B2BAA38ACC -39C8C1D55892583B7C32CBE6411834223200F22B416709FCF635EA5016BC3CCAE42C68EF -AA30B0EE474890D25C9EB745915FB60F517600C7F380582C7BDF4B34FADC9C60CB139D03 -626F4DAC953F9446C02331E2804245F7AF2BABE7FD2636854AF0CC676792580B228AF541 -6172AFF0C2FD5730C2D71C9FA3E17D36F9AA4120E180D025B710EB9F95AD8AE31B66D872 -20F028D258A85409CDF37158F840C2F418A0470357AA99A825A9537D24BCEB415329EB6D -5D985445AB19B08ACFC1F58510119ED297B034334EEAEA319D0EF5F7DBE4836DF61041FE -071BCDF1644E9C2D924251049CEEB73548286CC1EA170F0895771CED237B33FA8EAF5571 -E22C890F0B552D319EDE4A59928F14FFDD911F08C17E939FC035D7AEEFCD77AB4A2E7C4D -91B25D75F5C6CE9122C27E0E4A033417F389CF8796EE0F55794001AD285C9285436E983C -94ACA66A8C8027689688D0FA18DB23BEEF57C73CE751FC6ED14FB4D9601080258B7D4885 -4CF3F9A8DC58E073B3D2961729AD90372490C0202095ABF65A8C95691D7A32DC000B6FB3 -EFE315D903FF04A6B366788B5A5FADA322BDC00BFE337DFEF5EA0B899E36CC226DCE1B75 -CC352F71064E7F05420E4C3D1102F55E082E04F1CDA182E5DFFB5EF1283E721CECC5978A -A1EFACAB70A21438B380BE3A972AF19381FCDFCC60FF173ABA8BC049D0D9F22DBD722FED -1711CCDF75C710D083B0F3A56338A7708DEA014BA01943086306885854CBBFB8E372AD75 -6A00B5CE723A2558D80EA8B34F987AF7828CC5457865D9299E3070077F8D04D94C569806 -97CCB42D01ECF928629FDDC07CF668E87ED8313BDAA0D5FD84B0B416FA83998B1ABC0B03 -A3E43B188B7D74287A1463CF2967C7FF64335B205A69E974789EF5741A6CA9A3B62FAE04 -37B957A01ADC30C6C1CEBFAA7044161B9A094377D57E4E990FEA040EE9E37414D70376A3 -66D16916752F4F51F45171892908A53A3F6EE0497A69CE4D4F4085B1BC10F65623456980 -DDCE8C933CAC5C779D518720F5B8F511C8FE4C53E23103A12B2FA4DD02938ECA2AE76C58 -000D38B2FA467C1E1A8A442F9EC4F02E0DABB0204F2AE527B6F7CC775DCD07DBD96C589A -B912F727B9B81FCDEC5B3761842E845FDB6CF3840CF0F183F2ECFD28A92BB4F5CCE7DE8A -ED8912F728E39646F57DDD2816BCB3BE81DBF41DB3D3837BDF55B60E083EEFCD1A012A38 -846E025EC9AF4CA745679C60F88F01E3AEE7B65599AB02836F7A1F192466F5F729483DD8 -7C2E1CC75A61F0D7171C85DB04073B9A319A2F2B76C632AF2ED220FD9D7A1F9010836070 -E0D864D1D31180C1B6E35B6CA08D7261CC843915F15F802B3613E14218DC9EB7548A5680 -C1A9E7A6AB73A75DB974B4359BC428F1CDD2BA5E7F4590DCD96F1C3BD35AAF8549463541 -2A28027140D352FD0D9EFD97CCE7A86729432B246EDBC0A54EDDD6E67636A6F908BA5BD5 -0A90F4F1365DEE1C1E8989C0AC6C4A64861096C1B1D3CFAE51DDDD96CC24C5C11275EC50 -5F8DBCB44E345EBEEAD458D458A177542F5EE64FEEACA55A61AF8738E6BF38A6C9B211DC -F7F2675EB86CF3711C97FF23FB5F5FEB1867467158BC75F7BF7414BA151937085005B8DA -A6D82F31DCA1007E8D3D317D13BDE2428072D2A3A2743EBD214348B15EC3504426FDF73E -3588BD1789A8FB8BCC1E1A021BF64D274EF0C9FAC95EB50E2D7A1768E82BDB5A4239DD1D -9DD8E1775D3BD4CC4C07523E74FA545D5D650E9BC87B80E41EAAAD235833D1CF3B6B9411 -4EC21687773049E082646C8F29641D858D9890B41FE8C54649F840A0B81166130722EFFC -A6446C5509D988E0B4A9AE8E8765E1DFEF579A6D658C4781BA3B3DACB899F0AC467B9C14 -C66C8930E9A8558C8A19AFD95FFF4A3DADD1DDF80245C2F5F91D23B39CAAF4D2BB1216F6 -4490CBDD7FEFED8406D62DDA4A4B0F0FD80487C9752A0948F74930FD47AAD59FFB8B5540 -DE795994B0B6F209699D1DBFE7B7A94DF25522C7BF57C77EE9530784756D2FD8D058B9F3 -BEE20B4BCD63C950F9A4A01F66680608D66AA87E2FE5FBCC265505325711299F6E8F54FD -1686C4B532C504753EA7BA292A91A0FEB9E5BD690F1FC1D1B16D3B9870CB2CD14F7454A0 -8F365FA3FF1F0A8A33F9476A7053BF19ADB66EE28825530115BF79F60AE108B28822EC6F -313C14E43C02FE8871307F481D8B00F0E7C847A3F239723F4003226EE84B31A72F19BE81 -CB986F92710E37B1F6F263403CBB97392DDC7550F03A1ED56165B3082314995D75A4588A -C4E503C6BFF1E642802E0C3F1058B45E370D3DEEC937533E1CCAB26BEA94E9F89F6C5DE7 -6701DA7753CD1FFE77A42B11765EC6F80520EE01878ACB37096CB9C091387AB3BD68205D -1CA6E5BDFFABB2550E6B942F65FA977D55A459DDBFE4E17581CC19FC3B589F976EC22F91 -8E95546F8A447EA621DC289B7B7D67CC9C246322B221E6EFF507C2DBD4A93E41C2F7AD94 -4BBBB57372F85E601FFB6984CA66A5B7E98650E84F498AF13C4B0EEB0038953B5A33DEA6 -9CAD47277A632B26BE464E87951E89B8E0C051BC34220EC245E6E31383B22980AC124D84 -3662E9A1C8663100520AEE44DA661F4307BE10122C14D706993A586C7400BA3C74F020B2 -047CCBE55A6DCCA5AD37AACF9ADC82A59060518FA39649A726CF23543CE91A1A1070FCFF -CA48C8C6A9B02CC28479D8F58040984250C0AA0F581DFC8A5F978EC3DEAD276FBF7722C0 -2C3E41D993368CC019110A5ABD10C1ACD5A5705160AF288A60BA2AFD20D22099265BD254 -28EDA9461AC8193680AD019787902636FF81AF8C0CFE7BF8C064850BAE2E652CAB330EAF -13508DC67B881361C4F29B45D9885BC4CE554493AB16F995A98D40B7DB137953488710E2 -03295B129EB42BE45B089F8F40D505380EC2EC7C1DDCA1940DB8678A1CA0232F3140FDC9 -C00FC77392237C66F9A0A8B88A7D7D7162F72A1319BB22E8DDF62DDE64C9796FEB38C360 -D00F5C94FB772344423AECC5B4491B100A2A93D716B57B5B44083101335682DC6BCAC0DC -B500EF88D04F4F955A1214F56508DFCE4299A8B5DDE9A997E431A55B0E8DB6CA1C332502 -200C5C5899731AF052BC28D2980C00DB0DAEA4CA5EAF199A5DBD0BF794AC18CBACC20981 -96FD0AC31CEB455C61991445EBE8AC899B9AE530847D5DF608D011437B2FB24E4A1C45F8 -05FE4FF8D4109B5394447D7C9FAE9F57EB904B7D6635C77377D84D628F0BB1898FD9DEB9 -3E82CC2ACF52553E9ADDEB1E275280C62E4E8AC9722C5E1CB54DE4C4DCCCE6166F7F70C1 -50747CE19775F12C19E4A81599CB9C57918A42BB0E9AA638429B13B606EFA7EE2FBD7632 -0275BA3CCEB743B7101BCDDB2CE5EDF843E8944E4D87E1BBEF47C9D5611E1805CA0F2850 -CF8A205D53F054DD143C3C90D9605C3B7AF045C553A6332D791209DE72E02C146312B25A -9A5F4AFDBCD83EB67685ACF487664FCF0CA5C455F5848E18A5ABCC174F55984E368335D7 -BC77BE4E2923147A111FC8CC57CBFD5BD87D09867347F01E11DA0780E4FDE4DDA54833CB -10ED212340A0180CDC5924F675AC6DAE629555524297FD133BBACC4F51BA326AB7D07DCE -2093D6DC8E6126DEDE9ECBA129DF931399C72CE690C0B119B117A14E3AFC18094DEF65C8 -4DE9705255D3D411BDC6958D872CBAB28C9586DA888066A2A00B05FB21B5DFE2B9B4C87A -A0C4D7B91EFC7E8076DC5817C35652903605B78FEBFF1B4783A170D8060FC151CE533755 -7B8B3B1EE083114F977201446CB8A5BFB5DDF0852365330CD5C82CFA9BB2DFA6BABDF675 -45586F4D28605BCCCD80BA8B59B501C629D6E6BD5D676665462D5DB2784C5D6D8A42B406 -11700F3A27FD143BC1EFD859F7705C795EEEA9FFE57E25AECCC5C7E270833AA9604C6248 -612C356B6D9937E3B770F3B4FD632A0D8778C5EE2CE62C4E780AF5CFAC1C7C564637044C -0C8C90B9BD886F9BDC287FA97D4B4F4E4E8D7816BB25DD740D8C9307B94DFC8E8E91F41A -189E20E2B438AFC4F42607744E8BF74F3106312D7480A71840D4994ECB0A7A088784AA68 -84BF4DA162D5C38A4EC6354D19F06313DF2D4167B57BD2E5F544490D711E4B97F8D5B68B -F4098D8C9F2D8B8256EA8CCE05D189DEF0E86938052C44D7DA68445A6AEB7AEFD865BC96 -592DD991DB7FF294AC7DD8241E23DE5C908046179B44B9E8A79472154E254D44BD9FFF4A -435B05DEB14C08377D2ABCB8A26F706A366335F2DBFBF5D59B9DA9C67CB396A17A40C874 -C28E4AB5E242B6AE244EF37D90C8699BF1F2D5F8CD1D3130C0CA72B7040991FA90B3C413 -699CEFA97113609A486483E2A72DDF26953094C4E2970A243DE23963F929C3CED76AB062 -8072F5AF6EE3F950DCF88F57F33CABA2C8E4598D4FA6AF46656512E180DEA02FE3BC8701 -C4EFD669BDB52129FEC53E6FC55499680208E6A874BE255EC21B8C75A9D0D8A2622A4CFA -7E6BB9E8986AD3EE513F341C595AB2A14784466170C4D6DC2E9BAC82B988CA2609FF4B01 -185CC5A2B639A028E4A378503F55C147E6F8B30CFE5380A7A07981C15BE3C7120257C67B -4B603314DC2B65A2E4036151713B934F460FBC1B052417B907F70FA06E2219F310E34443 -A17AD4524ADCD140341BF982EE4D8DE7D969AC5621129C600231B16E97B62B6F618CBBCB -638020E75A77DBE28CB0EC9E4221F5D573DEE815512CEBEA629E6761617E69BA730B1EE6 -14C96D5758E519783F0862FB4F5C10D444882A344972A91E12051B2B29DFEF503D8762AD -895871D7CD4CC8BE62E1315831FC25712EA1C4DAFE49CA332CCDB5AC2C2D67F6594D592D -221B7DE7E93261E9D34179DE194AB2F4F4DA9DF9EE3EFAFEA6F1193940AED5655FEFCEE9 -E38DB186C5B5DAC4B0AA13A89EA5E81303A681133ED154B164E3A1D416DF8623A38213E8 -049B876C7C22F625A57248C0B61E4DE518F982E11672AF1765984203B7B7A17C2CD7C7A3 -847B6FCE423541C14C6712572DBE3BB99D1144021286B4E3939560998BC16A6CB47F9905 -BD48B9E25D1B548F6AED304BAD2823E364DAC055423B76800ECDA7C554211DB47BD28200 -79FE362F799925A8BEC4B4770574290D0654CEC588933BE1845BE51FDA15760DAB3257C2 -67E89BA950E833DDF7D7FC37F54AFE1954B006E3C758ED7BF3B28217EF77FFE36196D8A0 -A81157CA87889D7239BCC205459C3A11B808545C8A256F97F3B7369EDD1CF5D916E71B0A -77BBC006A71865EB15837635FFAED75D3172D91BF820230392B102D1C6AE05F36AD0236C -90133DEAF1B0F7658B6121D1F2F293DBCC6524C89A3554827D44601BFAB910BB7C908B8A -7EB7E84221ADDE214CDEB6B74765F2E8148F013F4D6CFEC4C7BB344D82B176D665A98424 -CC385736C4E1D81808ED22869C8132E5EFBFCCDFD1DEF732C3604BB683E4728EB60386E4 -D03D08E76B36DB7D39F07F505FC13A336B7AFF4D9587D1EFA16105FFFEEEB8BC2406766A -D3742312A7DA69A7B666A178BE43DE659D46CFB1A0309EBEF7B886EA3B3B554EB7225644 -EEDCADBBA3978EA1EB59B35EEE61BF1396A61922DC59487016F66561EFCEA19F30295719 -156A8C9099F0C07B5C076DCEA85C4924ADB96095AF46C1F9BA08BFAD5A4DC49E95CAB635 -CF1DFAE9A1FDB81E27609EEBE67A9636AF703415EFBF5EF0EAF7C10B1B04F139E60FE96A -6BB3104555EF08139F1641575A227E86F0DF716C829AEB4BC5CA32128AE75286C6CE0147 -F4D6873FF3B94A6CA54F701B9494B380D65E691F988CF7C6D74BF67A42F169FE5AF96CDA -656683349FBD542386DB635D09CC032C6BD486D08ABCD17A69C7FBDB61378024D2866932 -47E834F7BE079A875D8243E46E1533BCD01EAD3BB390A727226935F1BB5A9A1C395C92FB -679D980E6E67EECF4DEB74D75C164D53DAA8AA3955A91C29F28AECFC65BA8D7572374DE4 -F35056460B36941E7E0BAB36B8C28E081A29D92526D2F19BE960DB6CB355003BEB9B3054 -2A56413F77FCFA28B73258A8F4D473C04F8876C2B32901F62FDCF97261B3CF09D0BD6087 -ADD051543706CDFEF061C5F909E6BACFB2DCA11F38DA994E7BE7373AC2877648A0628662 -00AEE5E012297FFFCF714986436209EAFF78C09FBD9C54160A4D4C0629FE3F85CE065438 -8A996B462D6F520EFEDF8EA2578FBD42753A2882BB3FFFE6F65A89D0A74E27F306BBED76 -1F35A13A1DBE04D998F5CD63054D98D5A209E82637FB48929F7C70C154F66B6E40DB0F74 -18C103D628A4BEB3BD0455D886D752D58009ACB9D52EEF4F119F22CE23AABF40C558BA77 -5363C68AEFA720A3B14576B1EFD95405666BDB2966B36C206DF8DC7C2797412602A7603E -C13F0F2FE5747134C666FC26974D7FE913158CBEDA9AD94535099E136A43B962A93F881D -880E205772643F2B60C8BCEC7E4612BF86F9C0FA3A2F13191C1A6C3D50B35D6E07F8ED98 -1B6D2F8DE15FD9709A8E541A0276CCA6542FF3B921CF5A5EB6FA0AFD68A952114C9A3F8E -3B3FF6CFB9EAAB6DBBC62F38461824B3D0831C5E560C6459E6453B629B95F9D2CD117AD6 -E038075BE1D25A833FCB17D3FF657B483AB6CB82FE2AF17EC4AF1FDCC3FD6942A0425826 -3DE038F6D17E3F79404D44819424A2A4C559D44241D5F577FD60A00990FC2D14C271DBA2 -177747C6DE94CBC7C9C72D0459752D7E9680CE0181DBB43180AF135BCEE65DEBE77C1687 -078AB912E9183A60EE6229F6B9ADBA395A5559739C3E29C8B0EB221A036BA888FABE661B -F4D4EE0B4B6D62C5A6C96EF3C57A8B104E14B9DF763CC16B81729D771B557C4CD2191384 -0B40201E52A80869810ACF32FF93C005CD90B15F8628832CC689542A4D4DE58B55B050B8 -3E246BF54510B53218A2C556758FCC89C07E5E7D892AB0B9264529368EF16CC4BD6348B9 -57F2D5AAA98E0F999D4D400E77CBE175D35F004A19AB64F00169769EFE8E7D287A7C024C -A1A0D3F915EFBB25CF9604BBDECDA184C0D81EEB197FFC04B2190687D6086DC57FC08F7F -2DA512C57A3B9CE44115F9A6A7434E203CAB798A8ED7A68D9DEC0919B0B7B334337B652C -34F200CA9C679806B47152B2325AA1D1275B62F78B8610CE4D37F7F7DDD281AE294B7DAB -508AFE5492C4A497DF7D37837D43ED2A3D91C04ABCA7B0F7414A451ED560D20B0164DB0F -227CC753A9CD526F8C57468912A3780F3E9A6D626405FB486F6945AED27C48661FE726AF -EDF3D69BC7ACF0CC657CFFD5347869D16AC4C6ED41F643C9BC981425125B563065DD7963 -22413E1EBADDAA6993AA9629CF048863BB3AAE34B44308D27C48B6F4F9E8E1CE6C471466 -678EE304328CCD8EF1DE777AE28EA758360EE7BE768332794871E18009B99351710E22F1 -83146E57B21C72EB728B83C9BC618904CC0094FDB26814C8667AFA12D26076575D26106B -1407B08EBAB89EEEE0CAF34616054550D610DB759C168E26C08557822B995606459FE74F -1D085225CF359A8092A9175FB03ECA2812D7467622F4F0132EB4B1DC6C40CC969842000C -3DDEDCDCFA0E8CA62B214E34F1051F468224AA8D0867170019FE82F745DB85ACE622A175 -E50A3A371D5580313E08E2BE5A6262A83CF8B6DF0A02F258F81C636D02F381AB20166A5C -AD53633533D61E534CFAB2899BFAC061ED7734EF53E7652C6D56186FC27D54991C8411CD -D2E9D048910765AF119118607413B556016B075BB4245947B9ECB4DE17C38172AF945904 -92630EF8789A3B7D973C9152A4EAA90AE6C984622AAC31DD7952553DB1289CD44C16A3F6 -7FCF7BB135F885F083A539D05DD1128322FBA172737E00842BD674AE3AD8CB68D95004F7 -0EB5E23E04182E56D4E9355FEF193B4606D4C3D6B9275521AC4EE52E7148DE5196E7F84E -A8E19C639D8D20F70EA1D413CE48295B47880A8535F8E0A626E913543AD381A8259FC5FA -593DBE84701260503BFDF27E719A99635B710F44EB5382AC3E6444E6B7C6D5931AD45866 -08F06FD25CFFC918DFB136AE01275EEA017BFD989D0236E7297EAE998B198FD2DCA030A3 -B851EF96074946664C4C12A680DF7A412475EF3E641DE2644A11F9FECF59332241712B76 -4E6F32AA42AB853E51078416EAE47704A0063CDE2E539A46DC16516C1E4680A8B1785BF6 -CFA86A558F74164390C3D35DB0CB7659910B6709393EBF9397920D1CA964859983FB49BF -7DF5472D866E654ED33A10B1726A5F3DA71B93CF1A21AD65ED51DEBE5625236470C49485 -AA53F0271E41C2A20553C67DC3388EB8C51EBF88E533B014FB9CCECD1CE071FEB8353D85 -E89DEDC7AC71C3873601B71CCC7BA3B5988DED9FF85CD350ED374EB8BBF2813854EACAE8 -3460EC71E78B7EFF1EDC8EB3E7AF2764C63760B38F6015B5299A1B1969251CF1E80B8E50 -4EC30439ABD13E9FE242520E37F523A1CE4008A75E490C2D5283F66FF5CEF6A97FE86B78 -4551D1B4BA916A12CD2BF1434FC74F43342297E4E6BC9E0A0C9F54ED31CDF86C93847E27 -B3C4DF7815D96E6DC9E88DF85BB7956FEC3DE7E867765E6986DCF54BE77F07AC3E36F27D -C4C0BCAE8CF485A549534819543CBBF33C6DC3B04766DBC4DBEEE029DF6D7AF91D1170E6 -1F7968397BBFA987A4C4BC74CE816AAC3646A02C8E216BF2CED3FBE06C98AD6C5168A570 -98AFDC8F3D4C59616DBA4D3DD61E7774F6583644B27E85A670EA442C9D575265A892A87D -07583509186E84C57EC343221FCB436F363AF502CB6CE631EC7711DBB3C37FCAD34D110E -B82FF2F7209B3F68EBCA22D918D3FE424215139DC75CA266904FD5F6D40269D39517051D -5B077D26B22F5D3F07CEB35444782EAC7DD819A401590F38571C148EBEA2E682E472DBFA -43103B2183117A9002D04D419A7DB18BE5365FE9F8E2F8498035A992ACC07EE86E1A2AAE -1258DC4B4C6F8D0D930B31FD0EEA876D0D726C7328DC4D5C76B6BEEE6190EB3B650F88D6 -45BC3FB7822F2DB69C2174C93E39A70320B47816BA3E8EA313BBF34C3EE729112A0C9254 -1D09C9BFDB31F939E8D03E31BD3263500F7B92E6072E1A418F7A70112C7C3609799A7203 -3A1809AAA623C58E93213D12DD3A8C37F3E156A7435A42D3AA20E62DC8D4D69BC694DB70 -533729E878603C0CFFEE8D5A4C1A7F29EB6E07799846CC096A8257643A9F85D5CC913E03 -E72C1030636E078D42761C2C3F0E1E84C205B4D8A3D17F63BE4D70ADC45F2DDF2B5121AA -A4AB3D909D1FE0179CF72BDEA0250B110CB4F74648535A1E9BE45A8844EB110F60C490AC -BAA48F32526582B619AF1DCEEA109B7DCCE048996547BE21D4DF519608B5ABDA68ABCDE7 -AADC339F5626E64C93110B21C112E12B5E75F15A8FF5B0DCDFE85A1E2F0968E721C242E0 -4B9543CE6D394F8D00B20A007EDA10672C511445DCD8470ED2413862E6809C15A2E9205D -E522936138B66C44D5BB9B20C908A6CC8D6F6DEDF3568E5EC6672107A24032130CB5D5CC -B8849075CC87FF04B7D8D5370E0294C87D20283B1E6D54679D4E73CBD1D7BE72B992E0C7 -0686C5BC456FC44BD468B6B1BB22D7DACC0FF36C94AC831D391CB9FCADE8F469A5F89414 -B22001501F06BA70414A074A4B7A6A0F2AA2AEA1DAE282C549ED6F656394D187E68940DD -EEAFD5414238578E2A5757134DA9B6730BEDDF727773B2EC1A17E4DEEEA30482475C93BC -484083883EAC5E0D7AA0DAC552FC82F99D6522FEFD818F8023B1F945FB86AB96713B3041 -03F2B5E3913A5D769D5033B2B23D69BB7F21E34B0E808A750A89885CDB2B65B490F7EE6F -DD0A636187F0271C9DA27274A01D4380A02BDECD5D7A5A1AE228C22532838CCA3750A8FF -48D831F27F3712E85B956F03F534D2A478F8F819EDE0071BF9132F78DC0F5B7D578FC0DA -B3BA0CAC5FD186610C32FF89D130E0AB9E9E2980D9069D4AF6EA32E2ABFFE99B09BF4FF6 -588E56A2A87DB9313742A901826BFD2C80526CA519010BC7290C8B3A9F47B917343D0698 -E17565724A7DB1207EBC6B16B449D9E8B67F7CF227AF62815C71E553F644B89ACC4B9EE3 -A8CB7073905DE06FB65E44E0A762AA5D3A109B5A9092658CFD43E64F634BC8C16945DE3C -267546354C88EA3C459AF00C4DA9214692BDA482D65130CB6ACAAA37CFAF3CB336090A42 -E7C67D0961B02F1B2C167726893D18FA3092EA8B2CD553480FCCBCE14BE635D0399225A5 -F65F995B463D640A43FBFD8892A6DD3E0B284455EACD55F2F973023DB12EC59EFAADE85F -55139137DD595514800B235421CCAC9B0CEF4701977406565B494E6AA763FDE3127B2695 -6F0E38CEE9988649FDC62BB0C46DA3D253ED787F2997F0285CF008F7E34586E304AC3AA4 -87316B18797A189483105B0B4F9C96BC191A337667B58678C725BCCC51A5DE3FC6564C2D -35432A453B0E92F550EE81A89AE84B79C3A0E22E6A23D0F2C263660AEE964EA461A40BE5 -8D2B1CEC1CD8342B764DF2A9901F20B0A7B44E5EAB40D3F0A0601794E5B42ECB812AE487 -4B96EFF33C2BA5801A2511B074F335AF4A530880F73F7A4344D22B2A9AAEC85B1D26C878 -201247E53901F4C41CEE45555EEBB174270919C0448DAC16160EB7AE2B09E96ABD9C09AE -B7A95C4B5226D8F3125DD27E6CF0CF6E2A0D5CD6BFB414ABBC6C4A382E5B7F34BF4BBFAB -013F885C4F224147075FDAACA41AF49F4D9034C22B0B9483DE0B075E641B5B3ABDAD073B -0374B79BF3A07FCD45C148C8374401B57421B9B57CCAA25D4C8CC7C9EC5BFAD5879CCC93 -665C1BE2826EBB24893C36F75F9617BE4A54E01FC7A2F52DC845C95AAB9505EE18E370CC -B5F6DFDD80DCDA36A05051C3478022A57E91F4A078F5B486F88C17763C285A2CDB6615BD -62544FBAC5F75939A9153D31ED2CB79ACA1FF6F2483EA35AA9CA0582C2F2DE156E8BEEB7 -EF12CF7453475E7460A3E92DC95BF6189CE2144B23D4FE778E29AD6120B5B93F441D6FFC -0310F8F22E39393A21F342A59688B6C11A66A3AF852AAA03C46A932587AA5D3685A3F4DF -B1B857FB12619686F7FC6C2430B9C24F1311DDBBCFC8FC294D84EF5E99FF22EF6BB4B2D2 -20B301EB713FA8C76EC566A253A5A7DD2323D70FF5B48F2CA57A9D3F94C737326D2CBBD2 -2D7FEE0100D039D28474A64372EEC52C616F800C2CC1B53BA93A18E153CB91E089EF0F12 -318E3A844F017EF68C496477D1EFBED61D215ABE6467563A625FC0563E2A113B6A58C7CA -75ABA028750E3444F6B19DBD850DA52880F3D8B765A8E9310A1F22502BF2ACD7A3E40191 -3A1D8B7B79BA0CD8D85225CC31474CBAF4479834FF184475C7FB6EACCDD0D5F1733FC56B -BFFEA34E08A0B7EC795FBCFD8149E900F00B6E207B6E9464880A5344C309FD2BBBC58D32 -68EF30C36BB5A5C892013E8832BA813AFE822D11B3E3ACFD02CA56421671DA938398F57D -11FD157449D3E423DB6A0A4EBCE845936F542BEB5B31406A6B5C8842783A5E19A6E8FDC7 -94D322239F4866F9EFD89CD88D9FF11C167AA63A9B6707DB1356D757C80623F10B31C661 -FE9D9F118208851FB3DDB8B0DD1937005B15D900B8B854C4571F3A9C1D0D67909E1AA591 -A59B2A45B5D8F481EF7B5DD6D4E6C8CD5FBA9C812F8BEB1C2A6E4BF8F51D7A507D6B6E18 -1991B5D4955FE3210612526CF495CDF2C3CD39A26F4BF6D98DD43C4D407D261C603B837F -E8E09B15F403D721FA990224D46FEA9D7931D4CAFE3181F21B3B47A1D3910913C3110A1A -45EE125EE773556E17EB3BC516E336B2C7733D8FE30FB7C22626BF7D94EDF00FD945EC44 -0D4570B85180A90BC46B280069BBF5B69A3DCEF13EF0F159B07FD5DE0289EAC807EFD6F8 -30A20CFE8DEF807947EC1442EDBC9C32701A9CE873748F33ABE5BBA35A85453DFAFC4CBA -2F01ADE4DECE86290C4DCDFD676DA97B69BAC7A8BD920C4345DDEC907CA183FBDDD2638E -D5432F9188CEA76B10E40260C4A8B559FBC422C41143432EC319E1727E8989EEF94B85A1 -8FE398A4928F6554DA075ECAF0A5B9305580853E010CB59142F847621234B4B7DAC52D86 -151E920633C2951731D4534A174CA7685E8F617EBA01DC1C756F91F8456DE200DD557AA6 -830A506DF674D90871943F822ABAC2867414D3B9D8D410E8BE29C00C7FBFA5B03858146B -DEEB557A662A30F1C858376DFADD19125C60CF5A73C1B4B0BA6B6218F1BAE096C21F004D -8716DBEC943156F291C61FA23F1FC37C20CA2CA6CD42A3A1223CC0DA7ECCC0D4C2604EF5 -796F53C1749E6B5E2E22F52A2BA077D324253BFAD6563AC2F6126B3F94E160D579BD0DE3 -8806C554406E63CC803A83D29E0DDE72B999D345E655899DD0E9873CA47C216C902A7443 -3F54D6D8BB3A716DFA65239FA2AF27DE88A97E521119041FC89312C4B23AC10861590A65 -871B7F0731BF11E3712182E7FD8AC4C94C366E93BE90243B0F5C29201E418CDF3DCD649F -0D9A0C1696B0EDCB31616DB976F4761FD47AFC1872CAE6802FB506DD67737DCC10A658C1 -DA0CD9A920A96E5CECB844A302FF0C312C5D7A8801203EFDED0049FF37E9887132A484C4 -1D332E72A6FCE3C3D48705D86F4187910AEAD72CED404526CDCE1B8A34C91FFE62BCC410 -64663903D557C5CEE087600C09E32C8EB537EA43F56C62E78DA50FD5F598C0FEC55BD912 -BADFA2F5DD75523FB189146F92B31FDF6BCDD1119867C6480B258FB96A916092301679EA -E82FE1D96EE14E382B00484A2F983FA5272B2B86280917EA80DA0449286CE2042B893755 -EC15ADDD93C432CD6989F9B6B8DE2A83A94F2B5FF22CC849DAB24A224DEA14A11BD68F10 -06FA67E62E6507B027F21A940F7E63A09BC9BC5299143AEA8B008665C9EB1F584D7070B2 -FD5B5E0C10FDE0AE740FC6C5FFBC1693FF4D2285D87392FEAC408409016980AAC25D93BA -3C3F5E1F432706E6122FE76519F584F96A552D58855495FE5F0F4919DF8285C668416523 -DA7F2703095BFB3621FE24F6F2C97C073FC5AED60F7A32CDDF72327A1A0D32D58BB98F97 -01FF1F6CE4ACB58F44090E39269DA552D9E242806BBBEE9B65A619728E863896C26AE155 -6CE6915DC42ADB2E3A386FC4CBE64EF8CDD835A84783991F9274DF20FB6B1FEC860E54AD -44F85774FD50E3B7817173C23DD46003BCE91605B7F861666F0774489635F4611060EA85 -8D66ADAA95B2BB066285F485B6CFC8FD3754B01CA01266D27BFD2712F4DECF25AB7FEDB2 -A4455070BB51804379A3D4D184E89B1D1BF94F870800CADAA95FB57B1227F0B691D253D4 -A85EFB1D8D182049259115AD8272544FBD0CD49E7A9F551E22F027272C60A1367CEA64CE -49A07AA8183B4B471D83072DF31DBD739B6F64158165F8941084E880C8CC46F06F3AC420 -B70E97D8A8B3DE6478633FBD016C258DDD12DE9062988CB9CEC82E21D9960971AFBFE9C8 -B2DB92E3F848653BF165A78118962E8DBE219E4FDCD68BA661541B0220B2AA0CAD74284C -8F28AC3E19638A0EB29903E703FC1145A0E9D33584455E5D1FA7BD6A733F8D8AA9AFF447 -583B0176258139CA3757A4FEA374425E9BE34B4683B392B6E334951FDF4E6047077B7011 -39F27A73FD2B4B115D8D408EA5E14636470794941040894AB66F19EFCFE812AB289C3315 -2EB58271E458B257F63715B3C05B454AAA50290F32AD47F089DABB1C480D92D69FF08211 -7C867A731F50E3EC9DA99D966AE570F584494A3A55EFA002D97D3A0EAD08DAD1494E57FD -61EF7BA94C4D0C3E85732A07994726452A69DB3C27DFAFEA6BD6A2D192264E6B4B846A30 -A6BB1625381511EE16BE4CD4D5C7CE332A8524AD748DE4ACC5E08F3167E99F63B785964D -B5871FCE8BB244F5DA0C7F00C5D198B13904D2B57A8399420AC2DF333B638F2A29B2E261 -D447F2AD9EA4F11128EDD65C6524A6B53412A7E92B1F3D7B4F7338A1CEB909357ADB0819 -57C48AD11E96AF967A60638E91B6FEEB4AD90C33F98AD1EA2B51F302B51D6D1ED82DBE81 -3DA68ECE9BD145FA28B7B6A5D6A9F7141439DFDA0E2D59530751F16B010326B54FCEEAEE -2E5644C6F693FECC5AFB1F64CCA65DE08A89584B90D0B6B5C5F4CF75F2C2B1CFD0D32B2B -F7101CE6BAEE7D0E845E975D44FDB3297D0944B9268E367A2608BF4BABFE4142B692CD16 -73AC17BBFB416A37580302558CAC6F7549CD60B75C9B5960A86E050612E9EE6DEAF19EE2 -6219E9C5D28AA076B3FA2504C1523269F093A0E00268E765CEF7DA0DF01AA3DAA12926B1 -A89D9BB8ABEA16CA2D2867790C7553E1E87F8CDA07810A4D94AEFFBC15FBF4D543BE0967 -B11D2FBD221D5BDDAF28718E4042000F5FBC07CD343FC7E6D9A94B8F6E9EB3B02D5BC584 -9AFA37ED5AEFAD28217ED06986DB0F51D4632CC5D1E2A49B950C3666815FB44BD4059294 -7401269A17539E88901FCE325629E59AD0CC15D6C3FF32D2497DC7A9797582D88C7F03CC -F2F230692DD463F4A471540737E6995FC32200E7BDAE53AC1465188312C2FB7B52ED98F9 -FE530B8F1CF8A6675FB9E603F58BE9CAC46585B6D305D888822806BC5FF084210489FB79 -2E511A939E01E69AD152624777EE98EA396DEC7D2C633290FBA60BBC153D9A0C1DC5A269 -740EF5CF4B2879A839932E1C8850D1EF95E8B5A0D719351EFC71D7AEEF92EF29D3C41D90 -86DDA4AAA9735908CFEB590E365B69B2D2FEF8193FB2CB24113859F3BD2E99F01F2B1B4E -080300193B5AB6F7711522EEC833D74A13F8686A6E585E7B6315FA28EA544B4EAE4EF62B -88B781FED5741046AC84484CDD1B670017F0D0D2F19D3EF24E984B14CD052E3B38553850 -6307817BA3938801B9E1D137447D979B5148AC1B822D49059EEB945AEC4DC1EBEC2FF6CD -DFB19A0370A02F9CAA30B6725A6CDCBCA72242B805E6559BFD292668FB5ECE523F0F44E0 -E75D483645B6988AFB0D5E8EC5688CB56B69A7B6A7F160ECC40894BAE45AD555571CC25B -A86E81C5931DC238346DACF3EA05C078D309693F1E812BA249D84F6AD605D073B22AC83A -F2749BF32A32C9115AC414D58A78D96A0F480C706266244B6A668486F54A16973E7A83B6 -36EB03E66507A277958C19D9AD4DE66BEE89B7463731F724DF5650CBE74EC300665131C4 -01BCC4D03891C6ABB61FADEDD7C83D56F35BAD5D731E0B3EA4F9C9A07FE5D3DCE21B5BAA -1C8E79B19E38CD61EB802B2C2F467D1A8129D45788B85C9F7B53232501ABC0768CF3830C -308A87783868ACC346DD0141702B517E5C07B5E29B238E55549F98EC3BBDB67EEC173ACB -0DD4B3550D958C7E777D39F9C21CAA5B51404C28DE12061DCA1CD427089D2AD99D23DF19 -B0729235CA955CBC5E4077A0FFBF3BB64ACF02204B706733BE9CB2EFBFDF21F62E4E7ED9 -34A78E626472A53747557AE2C209324D1F8278E31FF96305F0BB41DB5B165AED08AD9312 -F1FBF368E09C4A4004649E40D578DECB4A1F82EF4EAF76BD8CDA9C4C61EB1E187E7E319E -03EFEF18E4969C5DCAB53D8CF41AF5D4DB3D9CCBE23D1A126CB60B1864DEF1B702995622 -9BDFF2387711F1F06B807841406515B774B970666855333607B4DBEB4B670F6A452AD43D -FA2F83DF711AAEFD9FD74A307335AE574B4097AF88C2B4C928BDBF40F822BA98F7F8CBE6 -26DB9AF8DB0B6A309680C026E9FCAC9A541974056EEA1A0F9F71AF08237DC5FA78D8C38E -5E057DD2812E4591CA207000DD62CFF38CB97C8049B8CFDF0CE6BA900CCC85E02C758C1C -27B00DBC3FDDDE584457C872ED79218368C8D8F36079045A6B9AD62AAD7A53E2ABF1AA60 -4AB15BEEF2736FC7AABED55B17B8E665B58D03CC42F70EEA4AF5F1D82B4EA91ED721C498 -DE4DBFF06C3E58E0350BF931D27189680C68C68D73555F02B76F1A786B4FEAD6D6FF846E -370790C8529BEFE512A8AE178689A55C747FB7603D3F9A4BFC36FE91CF212CCC569CB895 -7680FD2D466A1C057C0022B4972841AE7746C47813AA324519B461AAACCAE87134DAA64F -093742B7B3B691274EA2148071E77E636AE14ECD0CC3C9CC7C18ADB23954FBE043DB23E4 -DA069CDD55E908173D71582A774B57793F5228274CA43C4EC01FE31CE14699656A9EB6AD -9468D7CA25467349B9F56CF2873A09467107F6B9C20147D2095B7294FCBB671EDF0B804D -76F6E1AA7CE9D7CF60CDF7F85AD1C410422A779B908F3E6F6C8571B6FC4F7F012FB99FEB -4292E9F354A3E9DAB81E22D4C75DA3BE9C8868BF2395D815D097010EF8A6A58CC91A6FBA -C59344E785465D4B91F7633D1718D16852CE793825CC4B422EC90C3216999A55400FE0F7 -CDC38A0F6360802991885FEB799FFDB3C1C87C0127CA781A22BFB9AA8A6D6E414DD2C31C -CA6304577E4D617A5388657632349D4F49D1582152E43683200FC465146137FF942F1888 -44975B7A2E508083B0261E8EACC54747310FFA32C00A0DF9B59F77A360349E259D9DB841 -47ED76941E8C8C6F053116A004C3998B7C84D94B60044480D048AB31F355B8F6768C189B -E4A024183988E8C3717BE19D29B4BAA4A94A3624C0DC4F8A7A99121DCC71EA32D2B8D6E3 -B4DAA6B632E8D64717D32CC76C1322BF2FA82D3C349E7FBFAC44BA0304E4AB4A8689D819 -CC3A0DD336BB7E45CA84991DE87CA3C615E3DDED468DC67E402BAFE01E096C61E0BE0645 -AD50A227015278116EAEBF7895E5513E4A811BB90E1D2E204F3E0E656B3F75D25008E84A -9FC4AE44628B7B38A484E23992C2C1EC229EE966480FCEEE199F0892689FA18B489F2C31 -F2F2196620809EF6E0524D99A86C627B053EA195870585D6B3C54C3B55C80E352482998A -2673772C4524BB4467A867FD953C07504C6154201CF96D422D0A3151342FC9C66DE45FD1 -29EEDFC9ADF67374A4C1CD2E76048EA9D4212A32F468E74007A6C3A8251DAAC735228DA0 -5C245346BFB1903F217D62F63087721672EC60B846652D9CE8AA2350919ACB2D8490C6B0 -5B63EC808D611BB1D7AC1CB102AD7350773DC8248384D1FCD72953CE507723529CD4202F -AAA080F519FABBFA48C620A1511A2FCDA8BA96E7784520AE0093AC58623AFCDAF0EEF6B2 -5DC8813512254752576AA9608DBADCA38F319EBF5164C1244FC3B6DF2523D8D8F19D23E3 -53C1C484FA52DA7B8D84D71100B076BC3082DDF29D6A14AE8BBC72B1626F882C1B98EB3D -F31DE2C5174A0AC1E5F2F82EB3CFA93EF6741473DA694CE020EAC6E1EF41636351E12946 -E3BA2B1D0246D059563F2BEDE7A67648AE6CA534F32E52FE7F4F2CC936F9EF70C8EF1597 -A073E36D237BD34A3CA8BAD7D01C54BA5012C690D680158A694D2CC0362B7FFB8A888A39 -F2CB418D7FDEC46B0E5F104A032581415B083A992D6E8CB4D0E9FA93ADDACCE7BA34D919 -9E579DC050DA9032B1C8ACE46D1E2D224556FC0FFDC35FED173D86FFFED1AAE13734D1DA -D2F06EDFC4FD311FC2279A79783B7C56928D5EA6F8FB4560776F99BABD3D228E8C62CCE6 -C06B7A122FC441CC5490C9085C8A469F524403B8ACF9A607651464467DE098CE068FC171 -55ED9489C819F31A3BA4E1EA3C728212D8C40CC1FDA9EC60AED881A93A411592719E4FFF -B035AA8F25B9DA96D536969496A96B05BACF2BF1C7BA6EC50759CE388EB3625683C753E0 -E3383877F4B2F74B1951730F51ACC3B0107B6DAE39AD2B17E78B4194F5C8D162CA37104A -E00F81F7E254B4D1104C01F404F41CEF92CBA628122589CED905CDE34196FE690EDE9CD9 -AEB0B9D7645D051E78CDDC34B58A64308A2CAE739A825F18525688E03E6138F5DA8D8898 -539F5E4BFC1C64DB496A16D9542674AD655EEA6DAB57AE3FD9058532AD0301CA47AD0B4C -6998716CEF388E0B2FAD6D14578958FFA3330E3759FB8EBC2C25C61EF372235135D2853F -CF308CF00441DEB973BB742C7CF4AB0C189B9FAB10C7969777928CC525D9C122781AEFEE -8B82537EB27D7B264F5CC973B096B13C688DA097128CA6467997A5401DCD797F08EBF73F -AFB5EFAE784C63F5D81CB073FA5DDA3B8F78FBCB37AD0CD54514F07C59B6FEDF0C86FC6C -C0C5E03D5B75B147D0EFE4A484A55555F7FB840BC2DDC488A1AE3C26A22A7975C57090C5 -D2A8E484E6E7831AA47BAD43DF7C1D5C92AFE866DCE8E0B81E5D36DAA24FEF28D44C5E67 -18B277E8CED636116EF9EFC5DD3F06241C40F23A6334BD4C7DB7523C565A669C19EF1578 -329B297AE7F4EB69E25EC5F9BA77635BDED28ED33E3D1FCC4EC257E4BAEBE188003E3AC6 -BB930837230D7625415B260E4CAA348690646BD20F33E1022E1926AC163A59CB3BAD761A -CF10756E27B6FF79801478D2B3F1CEA0B64835439C60AA4D861B7C4FF471A169482B751A -C64854226AD0E38528F72B72FD8472D83909464F26AD09804D05D3B6DFAAEFBF0D0AF345 -CE1BD364299B1646141C294AC917E55458DEAFDDF0A9734218D5F5685F0ADDEBE6231377 -006D9E3FB3FEC843050CE2050D818396BA57EBCBA3ACF483A42EAF1C434B35216305BBD3 -F9598DDE9BEE0B47A4B8984849063BA638D97AEF425CE3C5A82F3A4B2CCFCF9711B77599 -32D10869BA44FD4DE4D9EAA863C811DEBE27EB910C265492A45BAA73973E3D8849218608 -0B6285D62F797879D6E118341BBB8AA44D0FE79DD91FD58F988D53AD07C17AE0EDA91C84 -8F2E83031A8BE1569D1E7FF432BDC605E434CD52BDBD52BDFA689A6A52AA4204BBF90ED6 -5A206B03D55B8E275755DD2853D6D944AC74107C3160AD7E87324BE16F5B0D6FC37DC819 -8259AD5C06483BC15F983B4FA914BE907B9AE230E655EB1FBAE374EBFB84553420C34D61 -AB2523A8C838526A9C88A1467E0C27AE1C3DEC1B011D156C8D8C2AEA0B7ABDA324656AB1 -AC7D4F5CEC922426E9D5DCAD965E0D4D0C5F4A223230E157A22DDFA14FFECEB183168421 -CB6462B3109211D59D9F00AE30827E55F27C17A7248446A21F4107973B0BC987919E692E -1F76F7F540F7A4C440597B265290601FCCEF11BAAD4FAF3DDC4AE6218213F42F2BB253BC -E6B0EF2E6C3858988141C626DA7A65D7E48175E4DE032CF76619736AE7BBE01C026A3970 -EC79C5DFE931F076DB5F674C163E5367F03AE6E2E7271B273CE5EF0004D7AE89B63DB32C -0064FE4980ADCDE7357820F5943FF1B2AC49DBA19B2F124F15C7AEED84CA6F15C30A9A39 -3C7D492A0460E2000CDA313E9E420C5F5E47F959CC2329B6F8A1B7B818F0D44A2A176614 -D847F360F445A4168693257AE71D832577FD2E432EFF0E9322B3B4A404EE13501645466F -5CE3B19EA1016D089DF6F96E5377A68592B981E728FE3DFB2449C7F187B3DED6F5DB1D55 -14FAD8DC06D95B6B4377AD1F0BCF7B744EC490328CB734FB1A45506F9B6EA2B85E7CF093 -742CB10D1D5FB7664A9A7DA82C2C2DA07F43A95CDFD02B9EE4D954B2BBDA540689DE8A37 -62219CEDEDE4C78F7E314EB519996C0610ABD85C749012C63973AE84DE4BF8B6B1333024 -BB6E856DE3BED4C890DA1B7612689910607EBC32814DBBDBF179AC0E7C8C0A31B19775EA -14DDC7057CA38E53EE24A11CFF34A4E78672C14B215A8F7B70F3B6231E8C9E2206052580 -902E05AD3FFE970ED2228053898E3EE2605B4D4B364D463F0F3ADECA545BF39E0B14E0E3 -A7E5429E661A9718CC86D935E11FB2DC10FB436AAB75BE0AA27B8480AEA99AE6ACC68698 -7D69781BC4791A2A202B0289BADD16C29FD7A5C7C1146E51B4441F1BB5CBBB04D54C336D -B0AD62057F7F97AF8F7BFFAE47D1BD86D2936B8BABF25E91E41CD8917AAF282949F0D9EB -1D4ED2B89478BC159FD71E7207A65437B20D18144E4BEFA99C89983FBB71240EAAB20E62 -40E63F517EA139D1AC71946470F28E0BC26DFCFDD4533FA5BFC0C663F53C42BBFC16CB96 -8C0E61E2A6C4DB7B688ADD4E2F9D1010FA4B4E8E278236C66C7C1E5FE6B3EF982A970C22 -11006A98ABA967E7BCFA17176463E2509AA6218FE0A7CBEBD9F9151370FCC669EEA0AFA7 -265F498B879C4C94AD02327D680059C8F7A388260D1013DB99887C5BED8A68925C3D9E0D -56335F93A402BE584D1798266F41C5FF3C647DDD2C2D788A7A56C8278303C0E9F20F8595 -4F6B47B79B6CB9C6FC80AE76BABFEC2B750B5ECB267A6866AFC68A51F6FAC54B84B9FDE5 -54165EC7104F5626108754BF07116A75EDE93A35CBE84FE778DC3BD50A8421A959B512D7 -E7881889E5AD2DCAF9CEF64E86A98BF5384D4F341B53CED94D430F3DAEFB506EA693FA23 -6830EC178791B015ABE069A44CE20752334986A43EC06F8ED44B0796FA741F0B18BA5821 -10C4D7C3B9B681047FBCF17DCAE103ADA23C9D41955B2C0DF276D5DEAE83A941E8241B51 -DD9FAC40AE8FA3B9308470CCCE30E17C1C015019E1A69BE8A054194A1190B956F414D473 -DC5605BC7284C0025F01A715D7282736704B3E824BEC160772EA327572384DFFA650A292 -FEF417B2C4B395AF893BCA339134D3BDE3E4A8CE7D76E2556C59D7292003C5487DF76D55 -4549FE9977FDDE5460389F32D5663656528C257C2057EA3EB5D70D20F550824C71DE3212 -32A29241C8BE67ED9540B3F461A001C8F63898DCE28423A3F5CE806DEE0B50E8F5A76C86 -530491F67C48B8683996B6BBF6DBC1666BC6E9B2BF4624701A67B52F792333DC12CC6142 -B2568EBB0ADDD4F9F3443D45204B013E098E62C6ABE0FB14C2158574A7C0B24EDCFE3557 -2C5C30294889CDA3C7C1C67558AA3C05D012F516479DEFCAB7ADB890F9E96E9615634176 -5E8BDD3CA8E85DA76443A538AD530EAEB42E6876FC74AF2B6AC2526F64C8D323B5F5CFC3 -BAE26A4F30D4477EFBDF054BC83513705CE5830AF048CFEBFB4AADDF2E7483A4F1860D18 -7D318914C3622F4EA58942D5527484D2AF2D0AE2DF74A1975268F9ECE82E364F5A3B186E -39A4A10049D6358C044B6B05E9B90217D0A3BC0EBE473DF1A7CE2A4DA8D5648DE7BA58DF -0335B7A4C4DB44B2BC583DF0394BBF14541329B64142B6FF4E37F523DDAFD8C1067DBE8E -4770563B8AE958C26BB51920158795D0A4DE9DDD3C2874A572436749FF5535BDB59E8C83 -E421F605083516551E89A2FE34FB9B4AE55036A3D7ADC71F64281A3C54EAAC2670CB34E2 -AE94E71943719DDD21B8AA335EA3181896301B065FB0519AC8160BF9FE18957E5B72396E -240ED3A9779F04FBEDC858B2DFCA71863A17E73D53958AAC58CED0DD0026D562BE9F395B -49C12C0C29D4B84C28881D17B10F5026F8B208BAA6DA070F94110587A76E00282D3CC5BA -D88C3A9A714C063F8B325495644DCCEC332257733448C50A40DE95BA8E5AD73FBBE404AE -EA1B1F49DE4F9F1770B73ACB5E9CC4B5D1204A97335197B14DCB3DA403DA430EF0C2CB46 -E050B1E17FE0105A619BCAE09A33CA4DD54E84B8568299C1F2EB116C16D54DE40D9880D1 -B2FE45706CF0340CD591FB94B130BF0EEEB3F1EA675B032AA0A780F0E0E69A63E932E01F -43EB43DE97EF02CAD65BD2013569695789971D843DF14DEE9A32A1EF22BAAD4A4468AC40 -588EFF9BF91CE0C09C30DF0E2504AB95E85E70F6769679C12EC83204FF0C5CEC67A26CAE -748F530A80ED96E3C6D28F8F12F5B3A7A53B1BE5B096B0D186784402A3CC1D4EE4162128 -D0FF956979EF79DEEDB9732249CA150D159D1FF502E33E4A305F066A9617BCB637DEB999 -DE15A2DFCF9297E2E93F65D90A233B7F512882AB88439B26B9C672A08EC301262BD37164 -37191838D992F15154E96EA15454E4EE9E9D4C01CE2090120620F5E5A0849036975EDDE7 -9E207B17DFA344C8300D07BF024C89B9621F8FDA10A5032197BA4B6C127FC68C3D1397E2 -88219E9F151363321807084F8596DB0A24A8D6E41732C843C01843A9B4D9C1041D28C7F3 -F4DD289EAE019B6E8A3CA2952A8BFAAE3CFA6F0527BD3CC9544196A0DBBCAE1F095C3674 -B34358049CF212CD96530B9875DE99D93BFF4D87E544C7FF8E79F757ACBFC7DED0A8FB1B -4BD53D1E76FE95E930E3F329DF6310107223E4E576F38CECAEF561B5E95CAAEAD603B792 -F1B1BB7EBE2C73E7144AD8D50F0581AE74C9A811A52E986FB6E249F9290E515639900754 -C8FBF4ABD9F642970190D28CF4BEEFC7C39D1271DE2A357949A69BDC6D8343487BF6BD25 -1C1DBC1132B1FA6FDB4D3233ED570D9310F8C9DD92B7217EEDAE942A25DDD6D5C24BB4F3 -9809C658BCD0CE41C70709AB8899E4956D9615C1A2B1A627E47CCC17DA3454291667EE26 -AF97D99AECD1F7AAA7AEC910734786FC797D819AA8D539D10EE8DEF86E4499010310E241 -C9FCC7F3E2B0FCC692D9B2D8346717A5781E6AACF1A891E2E6E65225F35026AE348E0E16 -7475CE6A9A0C14FB588A483B9483AC475043907935061B48D03677ECFEB8377235E44F7F -581F02557B6F009E964A4C345494EF9EB4427ABF1D2DECCE71A87D55C57ED6E561CFB835 -8C8A38E387531A6D04AA87F5AA92D73B2DF8C972402001B9FA67DADE45F803540AD55272 -AAC3A49F23F910EBEE137F616544F86DC7E33CF672859A545677018279B5D1AB673640DB -4EB45C3049D2BAB6116D34B3CF6A88ADFCA5A657E93C32EF5912DBCE65C9527C068D03D5 -A23A29E934391FB4317CADA46B7CA8A4F0440CACC958028D20197C1F1C0D3CF39F107548 -5928CFC10177DC70FB5133A7ECC5C82C978858DC1CF44A53B4461E85B6591131B19806BE -EB57CF868D200A7F27567F124140D712AC0DF6D6FB8045671207AB0CA4735D4422EE8133 -3E0143072416E707CDEC20286F72E3070E374D79D95CE144AEEC86E6DC9001B991F15CDE -9EE7E8368B4BACF9DBA6E83848E5A3088C2858C71BB5841E990BEF89DE5ED42A6EF9F0B7 -8127DBF344A29104E9272D0ED77B5C32D245B17293C54F8D939E314350B42D95A3A2F4D7 -6FEC437F8CA935638E8558D7919ABD0DBD6323F83AF703B38E8445FDCACC8F1919D2BD4D -808D18FE28285B62FA958B34CFF05150BFC884F0A323F67CBEFB98B393607F500530A1BB -CD2E2C93D25EF97621F872091C13D1BACDCE7DF636FFA29B24C51111E7C10F0FBD250FD7 -0899B2D370B955A7B467F9C726CCA0C1B05938FAB3357BD97FFC32A78589BAD9B54CEB88 -E0C95CDF9387637A043394276D50FD4E6A6170DB7325B11EA2145BAD3643F51114332630 -229198CC4A68C207E61284CE848E0CB6F9F7FB24E72D5D0877F2697F39F7F9F713FE2360 -A199760E993836E477943388D08EF210C1C782E086639B507CA9CD5428FFF902EA82B280 -DD203279043B62ED9C93150CE5D365C3ABB3C353172273AFF2C75BCB68FADEC1964DAABA -777D83401AA12D8B5173796F691D8A2E9BE7FDA49421AB46A014EF1C566B78AA4889C684 -D45B5C9181DCD1B12D4BFCC354454B6A85C4FA25E74D55A1C6CCE8C4FB9ECAAF885BE22C -A5DBE8ECBCF909D4487E6C64DD9B489DF6BF4B1F2A38B7D18983B2E41696D55446FE1261 -11A0940EB96A23142770F5A17CD8D89E85C6CF269F6041B0F32467D1DE4C0335F543CC07 -492BD7BFD0209DFEEE502FEE06D2D0EA9A0F81CD36DBBFA8E386BF486338444DCA97AA8F -83FDC85A8A88A801854C22B3849467A660173E5E81C055E30CDC869B1BB9C367923A3491 -F51197DC9971B477FE060AAC5C91FF8D67677C3B08705254972D8CBB0DB05A10771844A8 -4391AC7B60179F20E345D2C9DFDFE1C42D947DB12F84F1CE05991AB56FE498345230BB3C -7F92A3AF86D20828D86E931BEBC818BE595D2E17D3F9E105E39649E89E13656F9461087A -36E1DB0DCD850BBCD07249227B65E494CE8C88BC106F7CEA5EFE48E482F66F5F6763A766 -0262501535FA5FC71CFA87BFDA2F8FD2BFF0553D2008EBF081BC56BBA010C00081EA5D80 -190C4FFD7A105FE500915F6F652A0A00FF97A7C825E8617077473C38B5D820C24F78E387 -A776A8904C265AE4CABF3D1845011DB66A4D732F842FFD7CA1F5FB53714D0EA9F43AD20D -280FEBA87134571F5405A57094243FB22E12635ADBF0D1900E93684D1D8B5EB04D9D01CE -A3CAD54C9B4666E336DC6EF82DA6915CEC1F11C89E249B0A5C460BE552BFB4AD545CEE0A -3A97B65EEBDE82FA1893442E7446C901C50838934D82DB73DB7780946506B966CA83A142 -5D1A82EA07C3941EB1942325E258A5F39BC9D7B8D84F7AC876C9E47B854BE1D40154A54A -DC42BBB5E5D318A6E8B2B985F2F87F5A2486F261CCB59F171111D04D29E38CCB692F21D4 -E5909148ABDA6CE4FCD577E3EB39D8199C63E1EE22443B0176D84D2EC501F16BD5B01826 -67DCD1C99DF0A8B3F27BEDD2917BB900484171D2AAA6E0B39FED994DEA6FBA6877EF4D94 -F552177A83541F4111D1EAFE83A5D102A011726403648B148DEFD8754E91E52BFA9A5F80 -273475A427EF5C5CA4D981A2D98AA00A4BEAA2779FF342B5EC0A452F860620B88AFBAE3E -1FFC666C05647B3E73CD54BF35FF47411585FC84CFD702FA116EBDEB396AF5D9C298C3CB -BD97E8EE08EAADB0C854F18D2AC5D08771ABBCE5B70895E8F04C3CCC49525BBA4407E081 -62A272E0F623578EF4502FE2DD325DD87021079967B1FD01B95E8A0CC6E65317D947B340 -7B42052106F27ECBF69B431C6D73F9CE9220BE91C38E1AA2F9779E128BDA6A76ADE5AB3E -B9744A6365A95368D5F7C9C297F5AF8C0E21B16FB8B8DDDE4AC3EE393BE599B2B3E3698D -38C84A69DA371E8C323EA53BB232F07A761473580CC3F0CBD5C73FFDAC3BAFBB1D9E7D77 -1CA641EFBB2A190E8DFCDAD040736BE41D29723711CE965926CA4A56C6E4C5FEE60C6634 -C3B3BBE74BB0ACB8BC0FF9C426679D863DC1745AC462037444B6631529D8A8BB22EF605E -53297B146FC90E7A751C5E151545E89281BCBC7271731E5B0362994090B2560A8E62858E -860FF9644008AD601B15FFD2BC3D25D06FA0D78F003AC39D89FE621C1E368BB9221E2C59 -15A56634D5EBB299635F48DFA2BD37431E224E38CED95C183604B9CC3C8B153434D6DBA9 -CA955106159337D2709025F848B5440990957B0F12D416F823A75EA2567DD02849BB9B98 -FD5F32844E8F24ABDE050C333DCD9C9E4DFFD97C22C0045740B6B3E94DD8964F1E601544 -4465655844C809A51B9658EFBBA085489139EBD2344E68FFCAF99BC6C50C68C0C03EC1E4 -0C378E68F1CD3A8C459D732377514B1CF1594627569C16F9441AB05F9B4D7B1A6AF79E5F -E62D1DAAF71234F31509DD947BF67EEBFA0FAD13B794D4292516AB84FB96F5DD8C6D65C6 -0B822B78E917D7BF5BA9F2A4C90D94625B0DD2E31AD0D12EB3AC5F882F72D07F88045B35 -55AF20B6AA3648EFD5CF73798F3CF86B139C909D1D253FDDCF78F0915EF8CEFF7FAD6CD3 -C784BB88B8F31D1DA52FC67500D064DE56C233C333CAFD866D102FAFA71A2B2FCD2715EB -47C5B65909EAFDC5250EDB78FDA4854EF0706F226C1191ED8E1ECD79A43BAF7154547059 -D567146000900625B22D3F7E356DFEBC00D4B6E6C1296A4E4038973B9156D5D748B6C0EF -0B82B459E24670C9A951629E57FA90935E710899C37A5310822E99AD7D7B32018DF94FF0 -E723CDFFDBA6BE5DE8FC147C794E9FBD12D3CC53C5E14A328F6FC6C6FA479A0E0F760253 -899B220E7ACFB537262764F994D680BD4A48F618E7FFE9E92FBB09ADA32A7656B14E53C6 -B43774A908AC61698B44B4FF91D6BBDA42D53DDF348CD277A2A07A0ED439FF4D94F769D7 -6FAFC6F19F7A307927FB233796CA701B40A1C3E93A98703802B5D41F8A57F0D699B7ADEF -AD6D130B06C3D34C8D2414A21C75D4FAD9EEF2791AAF7731033336E141E15CFBCD7C3923 -C663CB78D678F222738BB970C5ABDEC1C983D465F71D8189A9F1A031875460CB9E46FDEE -A4074549FDE7A01F209409850C6848DBD1C9EA058A28D224363CD796F106683166A00DF8 -F5239AE3288F9D0C14E05217849FA07DB6DE17148462C0AC9195FF3C20B76C452DC58273 -3B81BB7526C69124C4AEFC411FBC581C29E01494C28F40A9FA088AA7B727E5C6D8842122 -79BC38AF7593B2A53E8B0FAB585CEF88D5F497727EF2342F89EA4901DD5FC97AFC1BB805 -817AF7C8FB9E1055D8A2DE3DC09C09BB71A999CABB055C4E2600D91BD4A0A6FB2E9066DB -CDAD3FC26D0921B2B9ABDCF99D74CEEDAE954EE6AC80E6AF69EAD98BBF0F14788D973381 -5714B6C0BDA27CB3E7235065ECF910CF27DA939D6354D3CDB120FA8E0E1C28E48445BF7F -06CE9F6867641A9238175665ACA110E8908243CB693C60D369E1C12D39ADCB6350395F6E -7ACBB1FBA75E91D21C141394842D6D107CB412C754C0068DB283EEBF44046213B55C2BC2 -5E403DE803680684F0F5E2054548D3AA52D5EB1F4E8D32279697818359850B50DCAE5559 -B000B4D74C97AD069101159A5FC03C66FD88F44824E0D28681870E6FF118DB32ECD10A88 -1540C1B63BE33ED8EA640F50C47055797C2E6A04BE027BA3A2E8F9344FA48BE1EF0D3A58 -59F9CFF0FDFF085F78712C711D4AEDA295775AD416408D226C4DDDFED69F5FFDDBD3D6BB -590EFE0CBA5404FE99FC4AA90D53FD3CEA35AB8042784717D1EB67529B74825206798862 -08D744892CFE8944B9EDB4452072D39363878167C371C3BE4816955959F7773BB66AB794 -2A2EB43BA482610A388035F9542C3D321BF1B1FFE827812A6C9A2F22B17CE0D04BB34653 -02D0F9331F41370AEA4F1B09AC2AF71F588B250D4B777CE024E9280CFE9EB36D9CADCFBB -4C1BD4CCD1C035B15D736C6F49AC229909BC877036E6F584D4155E0D20AC99E41040AE3A -23A0645A1B3C8C9553840388140AC1B49585231B98797C1C19D483A6E69FF566E6DC0AEC -71807AC1F4D3DBEBB2F4A4F6576DBA8A0B1B8643C9BD1D97A912E90A737268F6A91E0A70 -FEE73DAEED851EDFC631701755AC7B2EA3EC8990EBFB3EEB64B75FF320BA84821750BE74 -F2F2C8097EE95B2402D6F4C31E1BB947A5F86168745F8BE621289CB65BB1AA299214F52F -80950D6AEE089AD94BA4D19B9767B4B3D3CA631DBC1B2A37B3BE026429532E717BCAEF7E -8BCE17D47F40F3665C00A0BD87BB6033CD56FA275BF4BD06CF4F2B0ED24A061064092815 -9D73667E820E4235F1C4E629610A1C260C43774831CD75A5375399644CA9C46BE2F516C6 -7B059743008E82085EC673CCCA702BF07B8A9F57BE338D2D0F8D2FF6090F3AA1BA20A9CF -C02EC2471992118F070FEFD45B3C0FC0B55162490FA9D9DD60A6732532F1AC45A4D5ADA8 -DAD9ED5D24080E2C94F6A30ACAB0F075A50EC19544623D14A5A9A783A61A75D6F6E6249B -7B4AD8EDDD1154ECCA8ACA427736DB27758A0D7AD3F79745FAEF53B171D96FC735281986 -C4214ED6754154011F4D0B1BF910142DA99D3BAFC74D8F2BFED52422BEAA5DE0BD18538F -1C8CA315FBE5510954227B90718FB84785E0ECD9243B7C991690D2A7ED913E5080A15D27 -927BF869EB1279474726B8317FBF9B77774B2A97C294D56D02C40087DAF596AC35C2BDBE -CE3CC534DC34CB2042F85F686F4FF4098890439464D56CD011FCB85BA87C6B51E9C0ABCC -EB9A96152F5137E6590DE02C9E9C24D133FF585394FC59779F64E1AEBED7A007A269482E -E8943604DD95A632EF16B0888DD6080EEDAFE8F386E05427DA25E6D15E38BAC599A57266 -C416F20DB2B81BFB7AF0F10223DF1E760C2B3EF6EC37AC447833E8220604CB3643CD2CE9 -53FD9E2D22F6053A7780F79DD161807B661E196C77DFED2AAA7ED10253943A7FA2C25602 -3586BF0508910EA8C688036557439C183A1E9B9165DC2BF055E58DDB25672E7E701B3CCA -056B592AE84DA9278C95328EEDECA8E7A4FB521D3646F3195D9A21517DF98B334AE2E201 -BC4D0D3162B6D0F53F801263DB7AB69F1D2998038804A2A8E96E588853D7BF448C3DED2F -CCB995EBD6520A2C6FED07E13EE3E546FFAC962C6C30F570B8BDE1ED758550150515C927 -2C6760A12A097D07A6A8AC10C5FBB66E29BF85A74AB804A6CC99FE01946620D14C3B8B6F -FEB0C74E4EA1A225D5B9B5DD45389FCFCBAE9D45AD3C7F3E875C0FAB231F7902B5C860F0 -2B4A13B39AE999E051B7B8D05BBED72B29ABF13ECC485FC1EBF0DCE452ECCFE6F230B2E6 -B778E45197B80EE42F4ED63DAAA570C4ABF8CE4B30AF7B694B70780F96BC9742F7F1D3CE -66AD5E473D8CD8002A436B078918949013B721329F9A931DF6F084FA5FB7C66BA81B6980 -0CC79452F5EE2991BFA84EA8689A5B7D20AEE04B0E5B0FFC03B8D8D1DF4F1D3FA29BD6F5 -433809C897B31F184AD02C8E9FEEFCA647EACE79EEA1DB444269C3F88EBB896B2A81995E -9030FD059C48589B1FECD0F98490152F1A1CCA7929F19951D345E342A805FE72B4A1B4BF -F2730AA22A41D1E07A890AA61F2B9B6607191C92D052A673B15FD49145611AF6754E4F32 -C12533BCF702626D7F1E44A7D7150640F09819CEAA1C0A2E2E8FCC3CB262CF29232A38B7 -F0EF66086AC8197B5226C5D69A6F57F16733BEC14D8E7A47509BE951DF1B810CCF6932FF -4DC57D208B13AB86C0E22569A6C11661C91711C35C61BDB6268C82E08AC53589A13FFB3C -F5EDBEC7E7A41CB81401DF66295606B544A9DF4924416423D6732B4631EB73266E370083 -16D0DA6106AC038C1406A5B6F8639BE3EE6C880F9DDE71085C6446F9F2815E2A6ADFCA93 -5A7BFDF4D5AFD5CC7C8C487D57B090A5CB7A7712E207FA7000E39CCB41AABB32923D5E1B -C8D7F2C05D9A3FFDAE5AB0BBA940A8A25114CE99B207FC2DB264D44472B188C5CB9F41C1 -913B880EF8108348BEB174712B2FC1192F37175C5060C9B1F63F729A4E94D0DA524E2DDC -ED8C1F460B782DC62F4C23C6C0FDDCFFA7E2F918CF417C2A4ADDDE53381F65E3DB52D291 -C72998809B59818B71BF922A04C053E2921679838CF482AC654E982A60D2C097C4A5B134 -34657AA08F5568536FFD2574AA4A88873C762371971480ABF1290A05AFDDF9C072DD721D -EF36CACA75F4AA4E28F965AC02A54735E167A7DABF06ABD1FB339E34848F1CEAE16D4744 -0107AD4A526B99C6396BDC4426B858BB7FE38037F46E180E3F8108C79E457904E0AA9BFF -6D3E9B2A89D3F40ACC279C87F0A1DA1245AC6E766F7FF56A7F7DB7352673036D8162CB5F -C666B6F2E944E19F78EF0B87EFAEFF4209A5F83A563A6954873F88B2CB402462804E2850 -C1C5379CF747707E54B6FE28163C31E581B5951E1A12169B1496CFFD8D862FE0126A0460 -7435B53E7E1453255BC1BF14B67D8275CE9DD068529E5314A28087EA792E841448B2720B -FCAC76DBA06A85D1FFA731D06757170CFA16D6758D5E371655C64747E1FBEFDA27115923 -C701004B5E38E32E4E9FFC294639B67A0A8BBB44D6050AD78A41747910AB112CC7D995CF -004B43B8C0AE28049672D0591392A2EF95A8021F2AB281DA86EC270D683060B8D9D6127A -CD4D5900209C117295822A9963D86D5B85D66E4502E5D2E03DF43DF5A162F502C454E971 -09A24B58B9BD864D5E11F8818811AAF0FE432527F897C7B9B1853DD7E73250BDC414A83A -85C6916FA701AB3B71AF0AA8429DB2A9F85BA74E49DDCAC5174C927F28C1970D0FCFF89B -ED30E83163D21EE4741659EBD12F2FDDC934E812ABF1A0A0CD1D2AF47DF045BF6C6CC15B -4E61D058650AAAB48CB9027757EBB21398C5899AB5876F13E23655A7AB3C19AB2D3BD7AE -55F808B6F4409012629F99A24FA15581F9EAB68177DD80DF8A78F0440E5FDDDE882A0976 -076F1B708C63FECE076193E53934681157F1EEAE0DB94A68289A3963775E0793C3FE3862 -9A6D3161E25A76A5CC1017884136E801A9EC1958AEAEEEB543BEE46B55FACAFC0A8B0814 -9121CFDAEDF975B4722D7EAC6768779DE79D4031D42622D3B2EC0A8DB5BB117DE455F37C -7E5A948088828127F042301446E89F67A6748440460844A5DACD816D728B00C725C771EA -647896AC27708EC7F9C858CD6E5264BA8DE4D1B2662CD161C0099FFA627070C7A228BE5B -F38052CFE6640BD91780ACB62158ED53E83CB21BB2DD3C2C40B70CAA21FCFF4BD6F07220 -67A644BE891798B0FCEB7FC5365ED584349903AE4BE36990F66113C3E3E2A12A2B822A5B -D334342AAA886A4C3460598A6D2C6C120369E27F5D8DC14D2C79C7B5215F0D6D0D7D7F69 -AD2A561C66C113DF9F60548A6725826E9C508BA07AAB59F3BFCC74D70D3D00546745392E -FDF15D348F0A5E36AD6C250CDD7D4AC53DD79991F36631371908BB9CDCF2089F4E37EF58 -E9A5AA78F3896AB9769C510A5965BFA79E40083388A56649126390F24312A4AC2D05C2B9 -A5CAA54F62628212354D6EFA8875F4B424732598FD8ADD1DA5459243D233D95F8840D51F -93847579566AE17644FCC7165E551BB9BFE7666E02F77CAE781D41D2EAD5388553E06363 -99653C07C45F603D6C017AC9DAAFA14339F25210A4A91DEC0DDED2501D38C15AD3371153 -CE2CB9E7A77DFA80BBAED85CD46D3495AF1D3BA9246885CCAB880908970E87B0BBAB6447 -A611956A2614BB89323FE3546868CD7C558C0BE2DF1F3649C0190BBDD38C8168DC698555 -2E913FA8BEC47F2ADA8211F4FC25EA75F5BF578FADF6707F051A0DDE5CC99C83DE55EAB3 -D81F40A05370B3609A9EE133982CAECB4108661833572E5360D31CB29916146F3D43C127 -E1DD71CA9413C462AEF379BAAC990E9C3BCF2C22E90F15AE7CF1DC3C52A44894E123881D -B6396ABA0C77AA2EA0BBD78C7312C9B9FC36271B058DAD3F57C44F57CB825908CB62B3A5 -CE1BA60AD20892AA2A559C53E8A883E9F9CBBA38D13E8E71A8C008861454A58087E729F1 -C50723854AE1F620D3E2D716697529BF345A269ADC240B8EB1593604E08A12E8C184EA2D -A26B206A5643EF0071D752A3D4982A507246F237880919ECE1538E34EFBB9D991129B948 -A0D37A10321F792A35C6602F5191D34100396E0E89C0CD41CF82D1A3E55FBF6575DC08EF -59485DDB2F33B1689738ECA78A59501F8A838D3BB960C025617D8C50855F31044D02F076 -8B5B1E6058737389AEC850E66C6F478F96C5C1D2F451841C30D6C1EFFC5B780D26A3BB24 -AA555A045DE634041EAE5F0572AB927AFA68877A77FF3AE277505B133BEF87C2899DD7CF -A9275F03B6B8461DD1791D0B0558E2E7A36295DAC3CAF878BC670E6B005FA34E78938F50 -DE3B75424769ADD07717737AB4E965A9565C1459C3197B545A64A5F22F7F3BC0A0641122 -85134DF7405EB961B367250242455D9896F92FD1B784AF5DF40C408B0F30A4689168029D -B522BFBE784FBCADE1D1301EACB5EB09DE63E20D5B313D2D04DE931862F08309633401FD -2117426434AB74A5A8480F6F9466E93FED5AF4DF1B3C81E5ED77DA855D1DCC9803DBFBEF -79994E045DCFA6FAF3BF1DEA57EB30FCFD0BE7A17855D82DEE77AD5F61C08DFF00958DFF -B5604F75DC8CC24623F582BCD220CDFE0D340A1C476D09289C5213DD812A0BAEAA492E8E -AF3436C2D490FB5104DF3139BA8D5DC7AF08BD1C9517206FCC738B626C3E29E590E2883C -30A4C745F59E54463086B20B76628FA4DD6E295144B43C87311DD11B559472034543C376 -65CD9B874ACEF7028F342E2B34CA04260ABF8C8E6193A64B94B6E1EA6DB6AC39FF3EC27D -A41A460DB7FB38555E272E1CDB792E682E887EB5C5AC5C0D4037C2BEE840A825AE864D34 -B205B65BA9E9B4D07A16FD1D285EB96E172E89A1024E5C0BEAAF1E37861ABE6767B98CDB -50C786E66AFC82AC474391C08F1FD549FAD7401F72E04B3A9A6C52C1B697E9D4E3E33122 -EEE5D0C72B03CCE96FC3D26966FC06C9BA4B7B838076796DC95CFA3FC222B3097C43BEE6 -251843EC7E8C81377481BA2C5F77C47C2BBC53FCBD8305C557C2FF07B9CEA70184E9DB31 -98CD10E6D6B9D3ECFF62AE429193DF88CF2A6548766C2DDAD04C3062D17BD5F4AE274043 -07735A6DD95F65E3CB850883474E57A0376F867507756D7FA74D0ABC7AC4ADD08E0AEF53 -39B613F64A33F92ED360B7C0A65F8F81290408D0B8752B7C03796629304BB83A455D51B7 -4C89ECDA38CBE83C5FFC54A7E5CAF3E2636865BEB3D6092CB7E4EFE6B13F710988F1B492 -9F4EA0676EA6B8495DF63F8BCFFCD47EE238221BA37F1C53B40A20D70347145DD5A04858 -4F1B55173B2808416CA7BDDA7775DC4F208742F7DE0382C97916342A192E47D3BE4454E6 -A2F80C8B72550D55E9B463299A2008334589CD4B5C19FD948BE6F9991EB7988F004E3BB4 -EDCFFD47BCF21276935650AACC3169B54109D8C02EE11D3B2670A7CD006DBC704EAD9F5D -3D1678C93199034AC92DD1959D25423A135441DAB773A78739663959C3AF3BE598102B4B -504DE19444E3BBACD584E15F6BB0D6AAC894FE5F86999096DF225232AA65B122511D3D0C -6AF2A7B25273CDCE5F4791416BD85DF4841C49ED8179DAA39FBE9E8A5D0A1BE58D67A0CD -CED550F9E02274A337EED7DFA9C3E23AB6AFF8F782AB4DBA173D8D0DF5A687070A4F8782 -DEFAC64D97487B10BB114338A16A081C64853076AB441E0598135A79028847D19229E650 -E96257DA27FA1C78F42302D996744BD5DDCAD26FD13F21B2D31ADD3878493ECDEDF6A257 -CA47BB5203286AD59910C8BE7604244C6E0041F3AC99029A5C61CF29A105FE4572BDBD01 -8B55B411B4CED2FB4F793F842CE40F2F8D07D8E10E79587970FD254F4106278DC7FC6E86 -6D7A1729C01D612A7FF65A63CF1C27CC79AA57699B0188285F474BA5BE90322DA6F653ED -3BD73542F9557352A042731F7448ECC6F931218E6B25ABC903E201F61BF1A7796135506A -DC2091CC49E8776202498C3C779C5A0DAA64C92D65FD3002E359062E1051FEC9DD47DDB2 -08AC3EC609544FC692BC2638E17AE95601E0153EEEAF7FF294CAB662116B455AEFA27744 -FA0AE2C7274442ED99491738BF4E832BD2991C59C2D94665FB6FE9EDD8BBD65EB2936F9F -8855722E84B50DD6EE83331138EF9779751C13E8757A54DDEE891507D2D00289B8667C6E -D9DF722391C9A4C7BBC146C735253EFC8E7B436134CEC60EE2ABC2F999EAF00352F141F6 -B3203DFD0FCEEF69B74CC180714A56B020B8832D291F17398E5B219300AB472699C5FFA8 -45878442020D780E1F2DD784AD116221769CB0C92A8B9864D646FC6DE853C19AFA0C9034 -6AAA5ECF81394BAB6F82035CF59E4CECA428E4D9513C5DE593D9B2A9EA127510CC68B5E8 -43A17803AC404DDDAC646E6E73C63C63001DA49CEDB5630B2E5A4231CD3F21DCABE8B3A0 -3ED509459FFFFB2457F1D5608E09448CA76E516407057805B82CAEE2B5FDF19BA480D93A -396EFE8199D04CF81E08E979C2C84EAEBC3CAD9DCF81189FF9A1ACF3FC19A88B30020EAD -5DE7A2EB7804FA0DA9BF71A339C3A304F51E47F11F9F0F754B04473A3ACADF6FFF079CD6 -C6F6B58A4BD5B340AADACEFDD5140B637EB3209BF8FB72B493643CFAF4900AAFC63A4EAF -D7B9A4A241ED10FC7CA1490304E2DDE4B22354B33253B41438CEDFA00E5146648B219E4C -E22D7BEA2EFA6A063DC8B1772371E3698C243C48CA4705352C3996DA94B1258B79C0B4D9 -63E69A95DD8318CBCB338354B91AF6852EE956A28F0DE835004D7F96C0E149DE50241951 -0621F7317209D1E1FD2172242E4B079FE328941BB0720194EFB48EAA04E59196EE8611D3 -325D1C12A3947C9E8453042F5F6F4B7B381BBDD7D927A8FABE70AE7282291265E7AEA516 -8E8D1BA24C71653323E26AA6344BC0D9F1717255E81D4C6A8B4AEE128C71F228D5775ED8 -257434AA754C770309C9FD1E8D1B69A12A78A726C80A9F74136FEE214D9EA87DD2E07F79 -53C78272BC75F22F54BA647413B5500051159EFC793BF1F44A6B8053414A331AE9AD43C2 -9AB2FDFA1107242078E6B581EA6DB98A73EDFB2AB8D733A91F8137C92E27ABB2ADBDF87D -E8B9086A12D3D9F7F5CD98D8393FD4D55F8FB26E849373C89C5FBE982C59A13FD4C655D0 -DD98A9056D4F4C36CF1611CE5B1931F38077D845F1D0CB9A32FA9E9560F3DE0D90B922E8 -EDCFF38CE0F00B53894EDE37276432C4786665233C4B72A2E770C1A6B137EBCD8275F64D -F1C19140C3A4186408993F112C44EAF2EB0D97FAD7503835AD56965D66B85B037984B561 -B125093AAECF14B8240026FD89389E6B1485C76EF24B838E1E67ACE175054E8EB18DAC7B -9FE59483EDB1EF741098E13D72AE7C263A8102336E6AA6492DF4C098FEF95D7B73F90CCD -3A77ECCD01816353DC819A90AEC7F58CB524B91D861D24DC8565ED19C3E44B91F6FB76C6 -E34B107A33EEA9BA30E8046DA880C4F6C7A5C3E58E45B4061E400F12F63219DB2DB438DE -57CB2ADEA50CE263FAAB683A5F993657C38A7301C8F0971A258465A2A03915341AF17D89 -B60A4A6E35153F4089E7394EBE36F3FA0E52D561C6954E60080A4CD4BC3DCB8C38E2F835 -A4F7EE9D8CC16A8FB6F205B4B9B9052517956A19D11038ABCBC28ADAED8AF15A274F634B -D4EE6FA279A872A087A53486CE9F0230F464B877E9CF8002765094E2E3B08F2F479F311A -A80699980FBD99914C09E6677161DACAE71884A21BB600BEB151D1698CBCB8F3C4CA9222 -8BEC63501DA8BD9819EB03006A427402FBC8C702E9F8CF2B0DCDC7BFCF0A5081A47BE7F6 -56366881FE8FB14E160E786A080B98A9CC17E0B52F93E31EAEAC7AF0FA0379C64F7EFC69 -5B80F3EBEB7745F3FABFCF0B4FA1AA56CFC3485B50C09783DE242F277D1054891CD9E78D -C67525BC2308F66F9CA11AA6AD31D48C3FE3FF0346ECD3648F803C50B86DAC19B0DD85DD -D09CA881CE34034530BBD51EB6075147CF0077AEC54690677B17334DE7DE56AFDFAA80A3 -D8F9700A9DB28A760C5DABFF102D5138EAD1E697D050D4BB9E6DDD28F0D2C669F0713049 -29534D421413BC278180F1172594DEE9DDBF4BACE639DBD04EA2497A4E72032C5C981038 -7749BA925E3E46CA02CCF1AC8C2931D1F538EED1B3B725C6C4AAC7D65DB7DFA4F86257D2 -69BA6B0CA4902214C3A37D0D2DD45E2427599F3C55FD813840A251F96DEF09C7E72D7007 -59A90A9F65B1DC63CB2020CEC0BCC6C54F428B8AEBC5FBA51EDEF53D88378F012C780D7F -A904DF1DA8B7148308BF2175B11B83281E132FB20AF80ACACB781EEB48894FE148F5FA96 -3AAECF094DB605BE46AE4EECDB1B8C1C64308F6F21239596B12DF0CFA846A09810F803BC -BA672B89004AD755D201D19CEBA6C99873EEDEC4929078513912D0815566BCBE3994F345 -68151B5B3375936A8825CA58392851D1A873DFC8BA308C58AC1F9EDBEAFAFDEE682C071A -BA64798C8486AF1510073C04773B4CDF2B77C3C4E3A3EC365FC4E08FC93B116F8F183947 -28029EE89EEC18724AC9D36A2BE1428D90F85557C4D2AD1442855DE6CF1D06C0BA192F79 -2D08D3AD3FB804AF6B68B3885556ADB4A4D11CC336B1B998344083129C66446868CB7657 -E8946E25AC33ADD0BD39D1D3396FA15B344B4BBA42C4F6265BA738A58FA31AFEA589A025 -428664B136A771A9B63606A6E63A29376255DDF52E89C2336454C3452110A4D0C73A27BD -D2A47D47744A3B9A4B84BC63349FF5C75A6CE2010E70B24A053C9BC8DB1089F4CB4047F0 -D102860A352BD4F0E9B2FE00C730CA3620434DBBB5180092CED4F7CBB8021E705F4C13BC -759B366A4D054B804EA3A8A9604674EC0DB26E93112CB244FEB1DA9CF920CB24DF6A0E7D -7F3B117B9E62ACAE126303EDFEACD893A8947CC822D84757FDD6460A0A344E31D1E8FE98 -FACAAFB39C49EEFDF56DD8014572563FBD5527097CC805E6B03066A81E6120337F83D1C7 -BAE66253655316248F0CE35FBD61A2372D7B8A1573D34211AD49C592716566EAFA3FFB23 -50B54A4FD1521FFB1DE011FCD82792B93D87788F8409AFD40C7448DF74CAB5343D62C534 -26F0120A12C601E35C4A17788FA6086B3B4C7C70F1043198C61E3EA717533971E8F78E56 -17C84A3B5EE522B4C7C33FB5F1B93089EE7EC6D3FA90EB7C886D04116C3C0947FC5F3B85 -45636538CBCAA1DDBA880A0D5A30FFFB07401B25CA5572D41426D4A6D98F3EE01AC1BFE6 -D40C58F4A2413631E59140F65AEBC0990A76BE20C2996D00053F353945CEC87AB8970B88 -20DF8527A018548EEBC55906E04B0A3A498877B2D1ABAEC069260F05541301AAFB158200 -DCD67355FC73930DD4B47DE9ED0501CE7E38823203CE6D714E5501DE6C9922187592236C -E424564D6FA776E1EABC1000B2A854D06860F6ED7668C4D5DB5CABF4E89D9E05166CDCBE -D679B2E1645790F968D0F12843561B95FC90B8CD75EE2D053CBAE61E215082E5609C1146 -32C8B81CF298E477C0427D4CC68E6FCDB88393BE8520CA93DF1E3B519980FB3523BB18B1 -99F1626457857CF7641AC66E257634B349B2D5A8728DD02A890391BF2EF8C6358E4BEFE1 -6A214068AA175A1E7FF734960FDDC28989AED8261D18B4D996372FDF4788AED732041886 -24521DBEB9985BECDA0A6CE64DEC42A2539CCD4F55323057B8AD70BBD5B05872B864FFFF -2D627668ACC1D8D1908C1E3E2C76D45DD2058C717C02D279B0AC4B2E526C657FF7C5DEB5 -3538D1B2116AAA957A6B16F0CF83430395996462F8183F71041D543C330183A941CC5E37 -8C348ADA81F946090676425EDD0EAD6EA996CBBDBF83B606D78B08684BBEBCFFED1D0875 -6CF352F872A71DFEB693608F24E3F4D663E53661B35A0BBEB3B630489FBEA39BCD26BB90 -0923FC711CDA89442435FE3A491FA23170B6223A577282C24FB7E895E2A0715D2B78F20F -F1F9B06AA9D754FBB32CBBBA06663C59B7A8B22E666B26F2B9D8C55179953581E756BEBB -82CB10E21A7F590C6569324ECC4C34DB4BFD9EFA84897068199ED8344A438A1FFA475534 -0EEB53B8E087515ABA25BA2B1414EE4F86E257387D4C0C7D010888AEF962069C57450925 -6C3F0625BFD6909356DD62C01875C69204C843E6BA873049D72ACEFBCD9106FD45B8E9B9 -8CED3AE42ADAE6A7BEFE925BF6421E88540D9E599CCBFB9E8DED2C5DE0B7AC4B331EAD42 -DEE8EDC35312B1062CAECCBC903CEB8F67897BEC2305B6C333FB766D92C6CDBD77CB4F31 -F63AE1C04A249361D2EF6E0BAAEB7FA3B87E0BE0E1E50C1F480AEE2DD2B6B4D7DD89A020 -8C9B43ED6F46F3883AB7E53869E3C2ED3DB0DBB1A05B1629E48B3D7F420F02FDA6B1CBB9 -3DEF237CDE1F7BD8C80AC7AE5388C30335378E0E374D0C41EB824BAF001A4C47C399F301 -13B442A2C1B27EC161CF528FC2B256579E3C96AD5F4575454449B3B5E1CBDB300A364C7E -6675B6B924B48E58A0629E729941C3830D23968002C56F84F53CF124E771FC83CCAA3363 -5A130FD70D9422B524BEBC6FFF2369A71DAABD932B9D4ABEE240F07A4DE04C280D9CDC39 -A52D9B09799279368965C40C32771BCBA0EA9BFD488BFC3D154B8E421391BC7081D27262 -B40B8B953C02432B8074CE466299EE8BA9A0BF0D47F797EB5A8300B1E80EB44EA0C0D51F -8577BBEFE06C2C31199B4B4483BDBC10B9821B7CBCCA73E4A96932ACB5DFA52B2F3F346A -444EED0B3B0E81E8B65867CAEC517B99B84F574AB31FFABC2E0DA312F12E549436538E9C -82417153110E8060C80101B8AB8955FBC6FCB64499BC6AA18EB6DFB9406304B2FA5A003A -650C15B78EF641381F9A474623E69167793F9896DC82AC4A01FE4E267E9713507AB69A60 -DA690E3F3031CB836256B21FC26BE0B340FBB84AFA550F7ED8C3D0DAB80AA2FEC258477D -6576F86E6D8FFB91F99917A1EFD4902BC12AECE66A5EBCC6585ADE4D96CDF5A78D10EED9 -4D543079A9F60B3650D17C81748189C5A1859982574E1E821E943AD2C59000D8CE586E64 -178DECF669143E9D12131FA2AB2516A3472C7B41DBE5E8D2812FC7DBBC2415055EC1EE77 -A1BC7FAEC22051FDFA79F47C5D511C3F55DEC0369CE994D574299A9E3AB915935C654D71 -F3FD4988F5265EB95349304260ACFB633722F5AE8F43D3EF4ED5A0D333AB72ED10C1BCDF -30A2C85CA9A4B10DF95613BB465C2757CD153E81A1CB4B6D6B7A723BF5FBDB791B38E900 -EE8CA0F36399A767FEEB1C239880F13643BFF60481776C3856A033436C14768B09134DD7 -2C79C88DB4A5E7AF3F76B4806DFA232841268CE4D3D6D8FCF5820EC52B713C9ECAF0320A -5E94C45E93A785D5F4DB8E5A1F43BB8AF4218EBC91BF88D10311EC6812F42BDAB8BA486E -77AB14763C2E489EED940D934AEB3840BDEDCB9307830202AD02B3E7E27E0358F8502DD0 -F01935DFA95F69B68F5CD4F90ED84AD59DEF5E62508CE3A5AF67B2FFE39D37C59E5251AB -5E26C96C0B08D593BDB3F7ED93F9BFAA609723BF87BA135847B8535611C5E4EA0BD324F8 -3B38289C3C5D54713A58DE72FADFB4B89E7F4C40261C1779B97CB9F9570530D5943A00EF -FE435F5541AA079CC0E8452EF366D9DC18B0A6A0454FF9AFF47957973F77B9806373C9A3 -D048558F532788AECECD659B8B2751958B3F454011DB88F3BEB0D50053DC70B0244AC1FD -20D70C444E1CB00399EC559D6A2513DBFC001689156FB89CCEDC3EA3C9B70BF2FDB3A1C0 -9CF814E7F1332B7C752DA6B2910663D3E0AB53E89A236ED66418A280FB4A561DF005B08F -885D58BEF1429418D81F67A00403D87E16519FACA45298D16ECD5CE1839D3BDBCD784710 -8622BCFBCE4C100602211E6762998BE4F6F211EB916468F587A4DCFCC2030FA5FCFE8018 -1299E339E35ECDC494D4314368270D837927C46EDC1299FA541480A07F085D583F2B9390 -EF3B4A2A8ECA8B28648D8132A0D5B37E353731056BAC85AE7491369809C4A06ED7B0CB7D -BB71404D67DCEADEF47603F7C1A3337AC93CA5510F022893466AF4C74C24428275C44E23 -0FFA5972C9D36359FCE3899A3D60EF63920F154DD39CCE56BA57E540C1A3497B3EFE96A5 -EEAEE028AC28D81A541F833A62C8F7AC492BF304C632A023C7A170F8B3ECAA4284CD01A5 -6F74B4A41F1FD464BF46C890325D17CF9C8ADB8AACDD9CCA20015374111DACDA8744BE20 -DD6C99E09B51AB2287016DD65383E8918B5557B78578CECCA7EAEFF8E9BE9E1B13A24613 -C953C5BB45BB74A5A935F32E708927D5FDC1805B5EB9745D35654E25BA50FBBD7DB58D7D -6F70E102C640B771CAF3C1C138AA9A828E79F377A1FC8913012E5547D3602B22B4C365DF -269CBE55BC4AA79FABC53F01EE7D809481DDD3EE602A7266B7280DAFDC68259CBA490414 -84E4EADF0F8E4CEA8A8CFF260B8F4C9C5A3F2ED699B4CC72DADF932F844E65C1BD385CC0 -F2EF81820D16CBD8CE2B27ACEC225FD1DB77723EA0F03B1CF07630B907C7494EB4CAA725 -18144B1E15B0B34E8F3890269BAFCAF6DF4EDF3861ECB5266C285085BF4E1C6FC0FBA7A2 -6504467B734692FC2C9797D1B6536FD42314CB0FBDC0B104EBCA6539F47A97E1C8974876 -9BF5EC71AF381DBAF9016B5A794EF38776FD9F811F31EB98010FB1FCBBF23A00794E2FC5 -9637254DF49FB9C0F459FDFA0AB0C8C040AD780D6CF3C9173472B8A6F041D3B30720C1C0 -324B977866A3F892FE9A12DE84A6F0D723ADC584A17C055F07F4BEC7486D6B064885E410 -B48509BBD815C3BC2D57F23515AC82551CE3D334424F3456944460013BC5B7B43AB19D7A -62C9C2431CAB250705DDA8CD0395FC754AF7E0B10BEC12EF69100A831CEB62F5C016142C -32B8A41F852F57BA1DF144C2A534C06559BA009A92E345305589796697EF28E097DC06FB -8465A9DBDE8F5C38BD9D0EFFC3712F9F070F1FD50BF691811F94E12F26D47AC350C01C96 -BDC13416E1272D457AD210AFD2822408337E8BA7E63FF468AE68983966BDE984F4894F2A -47E982E29C6855351180079ED4E9D53912764533F5EE35A93B31A4885855A31DCC719522 -8D266F9C539DF45036A97F920B717D08ECF274B66EBA30E223A49D67975E8962F617C107 -23261A6FA71061BF91EDC235B9288E4D856FF764A5E65AAA044865D0666523B24CA1AA3F -87A58577ADE42B6DD75960840BBE46C584818A5C7E4E0FC13D41E9E1062BF50260E86A39 -09C5C59BE2E8301ED90C22A42CD5DCC436AF0A0E8987853B1FBF316986DCF54BCE866D05 -1992116762A7E54B08DB4E6126604B30F6D304E3D1B8FC6E602E11D791648C024661CE90 -7A6808EEBC6E3E2C0CFF9A9C6DE679F7E0246CFAB927F1D1A642958267645432FD9861D4 -92DE7CD99824C0A7D93A27F279C0D9919E4D14BC0855F4B562447974B2ECD1171B848D17 -8216047A6834390D7704EB2D6B16EC16A478C69AAD1A4F766FDB6D609628AFFA7F34796D -0667AE68EAF4D3BF8C7316A99E5CAC797F0220A930B7F3005EC0C72A2A925DEFD27F2DE0 -8120030CD29A9F5553E5609363E34A9526327EB61AC707C48F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -{restore}if diff --git a/fonts/Monospace-Oblique b/fonts/Monospace-Oblique deleted file mode 100644 index 932292770..000000000 --- a/fonts/Monospace-Oblique +++ /dev/null @@ -1,2706 +0,0 @@ -%!PS-AdobeFont-1.0: Monospace-Oblique 1.15 -%%DocumentSuppliedResources: font Monospace-Oblique -%%Title: Monospace-Oblique -%Version: 1.15 -%%CreationDate: Thu Oct 27 10:50:21 2005 -%%Creator: mike -%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. -%Copyright: DejaVu changes are in public domain - -% Generated by FontForge 20051018 (http://fontforge.sf.net/) -%%EndComments - -FontDirectory/Monospace-Oblique known{/Monospace-Oblique findfont dup/UniqueID known{dup -/UniqueID get 4136343 eq exch/FontType get 1 eq and}{pop false}ifelse -{save true}{false}ifelse}{false}ifelse -11 dict begin -/FontType 1 def -/FontMatrix [0.000488281 0 0 0.000488281 0 0 ]readonly def -/FontName /Monospace-Oblique def -/FontBBox {-239 -1034 1512 2105 }readonly def -/UniqueID 4136343 def -/PaintType 0 def -/FontInfo 11 dict dup begin - /version (1.15) readonly def - /Notice (Copyright \050c\051 2003 by Bitstream, Inc. All Rights Reserved.\012DejaVu changes are in public domain\012) readonly def -% Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. -% DejaVu changes are in public domain - /FullName (Monospace Oblique) readonly def - /FamilyName (Monospace) readonly def - /Weight (Book) readonly def - /FSType 0 def - /ItalicAngle -11 def - /isFixedPitch true def - /UnderlinePosition -213 def - /UnderlineThickness 141 def - /ascent 1556 def -end readonly def -/Encoding 256 array - 0 1 255 { 1 index exch /.notdef put} for -dup 32/space put -dup 33/exclam put -dup 34/quotedbl put -dup 35/numbersign put -dup 36/dollar put -dup 37/percent put -dup 38/ampersand put -dup 39/quotesingle put -dup 40/parenleft put -dup 41/parenright put -dup 42/asterisk put -dup 43/plus put -dup 44/comma put -dup 45/hyphen put -dup 46/period put -dup 47/slash put -dup 48/zero put -dup 49/one put -dup 50/two put -dup 51/three put -dup 52/four put -dup 53/five put -dup 54/six put -dup 55/seven put -dup 56/eight put -dup 57/nine put -dup 58/colon put -dup 59/semicolon put -dup 60/less put -dup 61/equal put -dup 62/greater put -dup 63/question put -dup 64/at put -dup 65/A put -dup 66/B put -dup 67/C put -dup 68/D put -dup 69/E put -dup 70/F put -dup 71/G put -dup 72/H put -dup 73/I put -dup 74/J put -dup 75/K put -dup 76/L put -dup 77/M put -dup 78/N put -dup 79/O put -dup 80/P put -dup 81/Q put -dup 82/R put -dup 83/S put -dup 84/T put -dup 85/U put -dup 86/V put -dup 87/W put -dup 88/X put -dup 89/Y put -dup 90/Z put -dup 91/bracketleft put -dup 92/backslash put -dup 93/bracketright put -dup 94/asciicircum put -dup 95/underscore put -dup 96/grave put -dup 97/a put -dup 98/b put -dup 99/c put -dup 100/d put -dup 101/e put -dup 102/f put -dup 103/g put -dup 104/h put -dup 105/i put -dup 106/j put -dup 107/k put -dup 108/l put -dup 109/m put -dup 110/n put -dup 111/o put -dup 112/p put -dup 113/q put -dup 114/r put -dup 115/s put -dup 116/t put -dup 117/u put -dup 118/v put -dup 119/w put -dup 120/x put -dup 121/y put -dup 122/z put -dup 123/braceleft put -dup 124/bar put -dup 125/braceright put -dup 126/asciitilde put -dup 160/nonbreakingspace put -dup 161/exclamdown put -dup 162/cent put -dup 163/sterling put -dup 164/currency put -dup 165/yen put -dup 166/brokenbar put -dup 167/section put -dup 168/dieresis put -dup 169/copyright put -dup 170/ordfeminine put -dup 171/guillemotleft put -dup 172/logicalnot put -dup 173/sfthyphen put -dup 174/registered put -dup 175/macron put -dup 176/degree put -dup 177/plusminus put -dup 178/twosuperior put -dup 179/threesuperior put -dup 180/acute put -dup 181/mu put -dup 182/paragraph put -dup 183/periodcentered put -dup 184/cedilla put -dup 185/onesuperior put -dup 186/ordmasculine put -dup 187/guillemotright put -dup 188/onequarter put -dup 189/onehalf put -dup 190/threequarters put -dup 191/questiondown put -dup 192/Agrave put -dup 193/Aacute put -dup 194/Acircumflex put -dup 195/Atilde put -dup 196/Adieresis put -dup 197/Aring put -dup 198/AE put -dup 199/Ccedilla put -dup 200/Egrave put -dup 201/Eacute put -dup 202/Ecircumflex put -dup 203/Edieresis put -dup 204/Igrave put -dup 205/Iacute put -dup 206/Icircumflex put -dup 207/Idieresis put -dup 208/Eth put -dup 209/Ntilde put -dup 210/Ograve put -dup 211/Oacute put -dup 212/Ocircumflex put -dup 213/Otilde put -dup 214/Odieresis put -dup 215/multiply put -dup 216/Oslash put -dup 217/Ugrave put -dup 218/Uacute put -dup 219/Ucircumflex put -dup 220/Udieresis put -dup 221/Yacute put -dup 222/Thorn put -dup 223/germandbls put -dup 224/agrave put -dup 225/aacute put -dup 226/acircumflex put -dup 227/atilde put -dup 228/adieresis put -dup 229/aring put -dup 230/ae put -dup 231/ccedilla put -dup 232/egrave put -dup 233/eacute put -dup 234/ecircumflex put -dup 235/edieresis put -dup 236/igrave put -dup 237/iacute put -dup 238/icircumflex put -dup 239/idieresis put -dup 240/eth put -dup 241/ntilde put -dup 242/ograve put -dup 243/oacute put -dup 244/ocircumflex put -dup 245/otilde put -dup 246/odieresis put -dup 247/divide put -dup 248/oslash put -dup 249/ugrave put -dup 250/uacute put -dup 251/ucircumflex put -dup 252/udieresis put -dup 253/yacute put -dup 254/thorn put -dup 255/ydieresis put -readonly def -currentdict end -currentfile eexec -12D37711F3EF58D4B0160CA0E8A8B30BEAB80C582DE4028394F513096550F71FA11E0919 -505AD6B7CD35BB9BC351DECCB83DC12688E510CD157D892C101B29A3F7371CD20D496932 -3EB249027679D3DB7582D953F033C85D9B05B2E5B9E3F8CC14BCEA62C23DCEDB24A737CE -0B749199BDC0ED14B3F80C24B773C7D94E0C32CB6CABC70B74F04C589AE25F78DAF2C485 -03C9800E9816B03D596C6E3855892618845E5102FF46233B460979463BD7A820DDD6835A -95C220225DFE27AA6BB31E99C60F679AC7C5A3363C40EF4C555EB47B0B8DB21ABCDD571D -28DE4719336D102E1E7D1EDCC5B3B0E60354D35EB856F234AB60D3C84342CB01D8747F93 -73140C128A546250AD327045F7903E144A248D16DBC150EBAAE66ED529E3E69214BF4A15 -12C2CA07FCF9A1CA5DD6D5A3577FF552FCE29E2CE9236A470FD258273428609693228B91 -5420FBA3ECF0A2406B4484196374D33A6C4ECFB322185AB88BAE99CB4FF8147A0C4D3274 -29B1B69D3985E21294AC5BF3777F72FD8986BCFF6374642612A36E01B5F19A4C313C684F -B4A10E6D366CE685E4D566655263E514862031506A3B886388753592B0F9A5D61EE9C644 -3E5E6BCD8E4FB03ECBF8955C142520D0F71F7E4DC8C45E335345B990BE35EEF99170556D -05A25CFF99E21151C7C1407675D515921EDD3FA3B98A58FBD14CDF1AB6AEFF424587D2F3 -CCBAA445F12ACC21F1AFB0EBA2D9D9EFED2C77A01C7B4FF0042E9BF457442297D0989DE2 -DC27042B646D45A9BCB9D9B80AAD373DC283EF83A52BBC4FF0B2E17194CF18618BEB8CCB -BA24F7B836924BAF4DA12D018EB41F3307ED0F6B29C51B20D92FE58C27CF5E7D8A3386EB -04685234F0D2D1704EFDE3C72CAEE80A17BFC25C4ECE7DA8A4F9044856A19794E13B9199 -279CDE03A30495084E75DB7C213CEA250A5DE3A17D168335FEF9BE57291A770F53502F9F -78ADC6BAA3223B013B120789D9672B286D7713F8AE9802A4424B889344D6D06B280F60AC -A1A81A0D8ED436C84543D86A866C981A4A8ABD3488FE907F39B32311E4C2EE313AE91061 -A1FE81235477F816259BA0D0151DCB3F28B2F59518B09E249369379B19E5DFC19EE63BEA -CBB0636880CB367BB50ACF4767E2A9E9BD7F0339D4128C54E622D4C39C5FB383438B4A73 -9BC3A717D1E3F8A8CE7AC4FB789C7531FCDF82C32E4C8591C3D707E6CEB702C2D210627C -558FB139108437B8E9D99B2F8532F76709E821391A07BB1A9305F62EE8F9E1EA1844FFAC -C5205E5428D155457F451A8177E75D61195BC5A9F564297E4C36C9D3F730D1ECDF921096 -C42A26E66BFDB9AE5682CE255B0DF1265A763798CAEA7A3138CAE6A7F6711899EE2FE701 -D825DF705F2BA8D8C6A6FC077C7F63C35D0CC5A183A03EEDB7A81D71092717E60CCD03D9 -D7EA295AE3407BFA22C26CF4D7689B46CB49FFCDC43F3BF5B3A49E53387FF86B4267B880 -361199FE0B20B7955DE33F541FFFA0DAD7917CD64ABBABF977ED46127DBCFCB179757EB8 -BC08D07CA46AAF440882C7ACC9B93C575C363FA81F381CCBA6B3ED329D349D8D7E3E1884 -8327A19CA6C83DDC89005AB7D6725D11AC8BD6F2C7CE8B10131F7A82484D03A3C6D854AD -4E173EC6852F0E46D46F6B85B2641AE69CA53069AE2B330F57223C297E09358F7DE81F08 -CAE980A507F685FB2156714E7E9E88D88FBCAACF86ED25335647B1238F31BDD5D820EE43 -821F5CF2F7D9A67586D99E9D4931AAA7C2D32FAEE392CD9FA4DB8F69D76C3BBB48A10CAF -BA3E78F64701913B414845FE6A5F78A24CF5CD29097FE21032C5FFB34F107F51B3D8C848 -2100FE54272E0E17B79419FC0AC8966CCB7AFCF723A8F721B06CC80CE0B07B92DFD20E93 -BF01ED0C72F6385A49524A7AF5EDF658FCEA7475FC6CA315926826FAD3A90FEB182B6651 -B1966E20F7300D288DB7A53402D5D8D0A748E3C0D21B9DD078FE8560B40C06B2A7037659 -A8603518F2A67C62BBD9A29F452723A8EFE6CFA2C356EDFACDC8AE936533498DB168588B -6B96C1FA3A2740E3BAF4470783C49202FB9D1A9A9DC3B375F1187CC1DFECBC616584EE00 -BD76FE39C6EF0B7A7ED422042C1EBD392A51BB458F920DC197915A74CE8E6635EAA0A772 -426427212311ADCEFEE54E075B8E03ABF3D4F7939D35809F0B6AAFFD9C08562B9E6BF8CB -B6E3303A1B3851920EEA8EA61B081D22A585403C8D25E645987434DA4A16E57A585B4097 -3FE63FF99E2BB9B860DEC906F8FC183A6C57570859D7E381A6CEDCECFD566DD50CA67801 -ACC6151D9C6D7D5A3A19C5A283EF37F1F418A469BA10E45EBAB0432A366C1549CB402F12 -DD99AC7F802EB9D2B56899BEEB60C65C6B22EEB9A00C680E94E8B190B1C3A395B6535C3A -3831D857819FC23F840B273D3133F1BF243EDCF846D8E308E04F6A38B5C73502F34C6680 -0AF88F2E920E39CE4C31DB700CE6A2777048E4B2509EDD822FB0036D888B86ADD2A01C8C -AD1EDAF950AA9EE999B4EECA0DBF02064602085C18FFF27707F09511AF5611DC76220CF9 -FA55BB850E7F4359A9B597ED3E3298B765D9AEA76484DCC7338551FAA0F1BB8CA3D0A628 -5BA8BD8E8342155B682CD6C8FBE6631D627C4616E80114385D6B52E2C827D5E7A2C1CDE2 -B32BF8686B1E6A3E8689D1C2191C6C3E9697633E65521500EC357746647364248682F2CC -37AE635B876025B85622049F99B824C32D060CC599FD4CDD9BB51530FAE7EA750DFB07AC -A3226EA764D547F7158AD27B0187FB701626E7364C72377402A88754F1D3B5842031E319 -9DC3FAB04D7A3C1FF486AC03EDE9CB78A5E911F56B06635ADF5867E64C2871317AA8B298 -3F0FEB5251C244D589A8C9BE5A9C6382F9B409CE2D4F19AF79FDD4157C326A43EC78BC27 -FA5384398C5F927955B2B67EE653CC6EFDCAF7C23C0D08B8C3DC41CB5844E057EE1A277F -8DC7FA99594391BA6DFF30FC9FEA550E58F39934675E587698AF82F00F428AC930567362 -B401C42AA7B9B4FEC9443E9AF5FB3E999A94ED088D97CB11E6955BC9E561D59EE34BA1ED -A6C9217EF560D154BA8F19865CB8C913F12986A48DE78E9D284C0885C8B69DB0CB47560F -D88FC212B29C91E004D18376A09A184ED29866DC4A179293A52A1BA548E6F8439B326A16 -2FA0CE6AED75A05FA30EF09A72CFE06124BDF8016C638725770D529A0163954177D45382 -3A74FD8E44B3773EA1280431E880CD2398A944C4D045AE91138244E0BC15343D6AD7225C -20406C0AA1A4257FB281C2FC949CC3D215F827F782F9F4BD121F67794A8F13F19FEA800B -6C7240E804D6FBACC9A2CDB6E7D24F6C61E89CB47C94D8E961ACB9355A12B42486447C02 -7AF9D7B1C4F0E4CAA8E28BE31684D721083208D76482B9BE451A4F0426F5DA9A2413D98F -CA9BFC29E1A8680172ECF33C7218D796D6447FB643974250FE831F4D5F0ED8ACD2B0E9E8 -DC6479E203625F2C5D62F96244773D954ED8F9B4D74A0D8426A9A61176EE6AA0DB4BB3FD -8E0F9F49119F2F2F1EDFAF9FCE35316F718A3DBCD0DA416574C87366E3321DAE1798F437 -7FF418523E807C3D80C80A5057F16781ED3CDE4EA1AF173093712B3F76DA73D0FE64E273 -C4309D9BF5CB0308A3BFCDC1D7BF1830D22C77414BEAF5868006615536737E20C438265E -74B43F267E748B834FB03691FE68D944561F1DEB1CA295E442C6EBC274B6D9A0D4C2BCC6 -5D6401049EBC97F0F7A5678389267B0D6C10757954FAD66FEB12875BF4349BBC775A0804 -00E25D70A165C7ABE5F5F4427DBE548C9701E20CE28356478DFFA5F08C30FC08228CD6F3 -C6B030734A683BC5196F3D29C43E80F96D4EE3DD54785633987F385340098B5498A7DC1E -07D42614FE6F1BA7068B0677345C695A494BBF150C8E4F91EAD66E387856CB09986439A4 -03A2EA248EDD1D00A4D490B9DC4BD11E36E155EBCA715B513D991A19548B417539B36308 -0D7E8E3ADECC1073EAF675C90D5897E13CA0AAAB196E8A48F867F0F71E5E5E24C36D5492 -E476ED92090842D327E4682E483F082FF71BD290542C19242F596801E9B67386498D3855 -BD5AFDF1A0A6AC211B38278F7ABDEB586EE5FD5ED91382EED8677D8A1792B270A46812DC -BA8A1379D5E5B7413CD43C6CB3E447E49F35CF2E7BC2E99229286B2A636F83C16BECF6E8 -63E23449DB08CD8FDF0F5F8EDE5A410131B866B55C6BBA8528C17072EAA042662D855A3E -5D164BA81ECD230EEFBD2A37F823D410469B05F3198B56400B89B6637BEDE2A19465F240 -338ABE767699529CECBBAEF4879AC00A6639589927A1CA91298FD051FF15223EC94FBB3C -1C61D1611D05E59ED9BE06C0C9DB3C311CDA93CFD321508D1187007207A02EE50F422383 -DCE98954FF609844A8AE9C29B56C1AAC1238D45FA35A3DA527E3FB618CAEC32EE156BFB6 -2E8F66F6FCA7EA0B9BCF0A144A05FD8FE25BFF681E3AE6784D6A670FA08776299E0ADA1B -A972D1E35CE0BDA9F06F8A8B96C8750CF25E24F69A0A49C65F7A9716FA4C5F3CEF3512F7 -AC82BE0C5F21A6876F73880FC7CEA205B4286929ED2513D38A5695208A5CD4DE401B214A -BE67DA7B8B2C63F5B06BB039D7294DC883723FB83F736A5EE8A02C9F968FCFE5556E52D7 -9E070ED53CF85FE574F52C9446E61BC83DDE8C5AB547B08E19561E6F4B84D422DE6DF197 -3B2572006AAE0CC1F19E342389DF278FF04BDC5CBE51E27FA51D696B123DA5B342648532 -FAD98EBE03894533AFE4BECE638CA5785DDC9D7ECEB71E59B01285978563920DBF542794 -6B13DF1BD0C0D349B77290CE840C17E9F71A7E34F3EF3472AB04E9DEC00BC4C258F522AB -15C73CF78CCB3A83D7A2047FA52A4C7196C4E750C14D77EBF5C799702BB84B646BF7F9A1 -2A6D27166F7AC9B7A2D6B6062627331C8435A64C04096FEEF7867334828680E41990E319 -334217DE53F32DD9FE73537D000A5493EBC0B5282FC1D72E0DFEEB51694F6B2DF87F3E80 -858DADF97EA3E4A864AC9AF980B1BA0159E7E046EF395143D2C2AAC26A0FC3A8F1ADB37B -6E3AF132D51D9ACBABDB4244AD14C837A30C3B9CA47CEA267845DFD9FD5A0522BB50BC0B -CADD7730E893A06E8F175DF29B4092EDAE7CB28F8FD389C14EACC8FFDC815355B9FB564A -F8C33D5871ECFC0CD0E33A0AAFD6F7323A3FD696B4EE641249BFDF82EAC73D0D823A5BC0 -EC34C42269F5699F129273CC384C8A17BEDC4BA4E384BE7D6213EB49FFFC5C98FBE27877 -85F64405CA64B5F2C10470B82BC1471F59C8EEEC668D88CF0441451E275328E3903A54D9 -216F0F70F63DCE071BA66B31E59EF5731CC778455222D441C0809C690AA9E70AEB6546AB -6B6D27A66004E67813F7509A3F2B2FFD717A77FBE48A7480FE4F2E0E9DF61D378D817928 -926F8F202341E945DDD9F747F6AA931A9369326C3AEECFAE75D289691683E6635E215E10 -9C76807AA3B71450BDEAC4AC8A55F7B6B7933745E2F3F2F3049CE858B10E17F8C236B247 -FAC04A7C3E6298C1A2036E14EE164AE8478FA4AE6F24A9E542D3D2B450E4EDEE099AA693 -16E89A308123CC5DF3E4822A5B57C7FEC21271BFA0168C3309ADF2DABEA0610FB18ABF69 -5622E7A1C371B3EC501D52A1DFB94AC84E30A500449867BEFCB5A07DC54A2F961F296DF4 -9829E92B8E0928315D60103EAF984847A6FF6185F8C1EEAC3A114F7588AD864F3A16B94E -3AE4E0738E13B6190AF3A27427DEA99F8A6491CF60C2F8F5C8A524CDDFC5AF2F7304DF82 -DD8E2F273DC82A9F0F7812297C485AE2B330DBE5B0C2E91922484FAC56649226FE104F57 -E88622612FD6CC084725C3C717D6B04432D13EC9DD5BDE98FA56EBFD2C7FC973AB611168 -C43379538659B695DEC62E8D58BEFCF44F9F0F52273D998C6BD8766BF4B26E479DA21563 -04B1248C80C58E7A9609B64934AD07C1945F03AD258D32D4D47B6C1A95D44B135F380A64 -C7ACDDD22D510DCD056A38C8400F21900F1692BF2210F6B161EB8C6E7702291C0CD2123F -6EDA46B95BAB323A99784F32A3FAADE6599CAF43F3CF39D43776A205B6024F6DCB27349E -C394FD27D389C1CED32138732AF2EDD4215A8E81A058BDF9797E0EE81D13B7773897EEAA -B71BF9D0D6D913DC0887442A470D5878766BC30C065E64456A88F88F754C3B6CC402BD8F -BE60B69F6CF942EC531A6768887DC1D6C08A690109E86D08D9470B9A684D751101A2821E -48805AD36D0E6D3BFF33FFC4994645AD2B599188B30649ADF04EF349B934E99E3D767C6F -95DB404233259FFA5BF4CD809B4E08F51653D72C2C24B7419B49585672244128A45AF33A -82BF11CF4B402B322D7DD20410A85B28CD32DBBCBAD192079514ED52996086747DEDB275 -8C8CD1F05B82B0BB80F5A0BD1C7A2F726B29F6D8DBDC9E199C494A8682D3A12F3430388E -845B4878CF87871AC6914DCE0E7AC20407F04B3A41EA5EE88C23AB19D61E5446ECA0CD77 -0D6992CA5DFEE0265BF81AD4EAF93BD5C068D1A0FB1704499AC8F16E26754ABBF318E528 -D7B12C0CE352E4FB67A1F6DBAF06C9EE5C0A04A926EB75A2E76E1050CF4300721B0F130C -E912C53166696D93B131CE8D487FE3B5A8450EC7A8961479FBF29E63DA9B03E79F2FE5C7 -14B57DAAB035A0D2A6A9BB5FED68F49C58360E5E974709D12AAD0680E1C0145526CE2C88 -36FC489C50D8D3FC5C0AE2C517030391268B306D231A9BB1E881928727235C693FC86B6F -A9A62D337FCD128CFE1BCACDABE9F384B90C10DF4967A447D53828F62E753D639E4432AF -361F680C212BFB50065241FD8403C80D5FD3F57A60643D586449C76238BAD444D1282943 -FBF39869CCADCDCD0815A484C494FA16930F3636FE854A1530277D1232303C0A86365066 -89FFD5E3C5AC028CDD18A3FB360C8973AEE50FA93127D6C7B3F323689F3075CEB2017BF8 -BF827381B96044E245DA2A845A536E053A1D5B540A8A27745547FF27CC9368EEACA827C7 -A47E56107A68B58A4ADC9B4A56C69C16A061F50C79A7034D317FA0F61A123D749AE3A140 -4D8A29EF631D5F925C8116256B40B81EAA31C326F4902BF46D68C5D6930EC624F3F50587 -9CB9DE9740CA93D36B8C84FF21E7E2AE48FAB457A8973106BA5A4A9D35D19AEAB1AE1E2E -8794C96BEA993A03C1CAC00697D95BF3287D7B14701DF8EF79683F2771A444D334E7074E -0B1602CC3D08293FCC6815946798BA56470783A0BCEEF3BBAE34D9ADDD47EC0E23E63505 -67965078615B540448EFE238DF5F70F1439123534B37B01D7189DFB6B21E783474B476F1 -9857F50753D49ACB4EA73BAFD9727E3EDB0ABD056CA73046DD3743451C0C2E54AC8646A9 -C1E269B570605A92E28FF146F6C9E49FEBC2B0D1946D673064640F610FC762ECBF415845 -E80463295D0EC0F6CDD35852CC9126E08DA99B91A75CF7EBD86466AE0C381E87E9D99BEA -1F6D35F3603AF79212C5146712B20727A4CA38A6CD684B5503BA1C18590EDF890902448D -ED527E7EB9A15623500BDA827261BEC6E0AFC5D644DD384BA6B3BBA29EF93FEAC2BA6C56 -82AAD04CA8FEC95DC915B8566A268801A7242DACB08C0A47122DFE37EFE10B721CF410A0 -471163142D46D3FEA4282739312E53BF815FA207F0DDFD7200FE6F7730D33F25ECCCE770 -2765D198251988F9D85E4828719243D6275E563E439F7F7162BDCC0BE33CF25EDA87DB8B -D51D0B64335C358ADAE488D997D3ED523C3187A50D1E287E00552844DC66F3417D145635 -3984699130F9B7E860359DE4B14195307288A8EED3BE2AE04339CE84BC1C1D02861C32BA -47C050474FA44D746FB2BCC7A1469C9246DF0725F6B854FA1AB68D68E96228E2CB7834E8 -01684DDB14552974A23ECA2254EF2B6D195650ABF1E2BD69B2BBE1BF520CA77E748C0152 -FC5665C36AEBD0002190FA221DD3115ECAF905114FA7222822523711E48DC71EF5FF7BC0 -9BF1C3DEA0283B5868357DBBFF7B4C6F91C47F941B40F03259AD826AE6FF057EF4B07B9A -058C4B7BDF58C6FE1D71FE9F5E96ACEDF8DB833A4CBE46BDF8009F0FBECA3314AFBB162F -0545C10E45F1F697A2B895849DE0EA02F2770349317E43BE527A3B1D808785CA305E06F6 -84935F0E7AA4E015A8A4FF3E8F7E6E5472D161EA42B964F48D1450F9E52D5CB33C5D84B1 -4138225527E6680BB40D7E73B2CB4BEC73EEF10629E9C614DDF422DCE8E4B6F64DFC4ECC -3C48660A9E1983F4A84E4EB254D5EDA7E1A6736D98D878502A6320CC661E4F47418B4D4A -9D0DD2A9733C000A0AD41583095DFF2D1AFDCF6ECF69C85E5C9BB3F202BDDFB142E6C18E -60B07D7EA40340938542A5EA036B354AB35FA8FA0B9391765A8C498B85F454AEC3F177F6 -8A122FFC8976D4AC99A370B3B7D706EB1BD36B3AE5D51C9482FFADA8DC7584795E8696F2 -81A0F0E3E9912BEA16AA15597B801EE5571F4BD4FB95052049A663FFF72DF8FC6FA0CBFD -A15889F230C5AA3B25F4DA1500DC0302010956C520A7F73E1A7A938E895784C05399030B -D4452FF0BA27AC1563BFF0BA19B2C5427E2E6B8A06BBAB6137DB007FC4692267B0D10ED3 -1C0341AAA6F3BF586940AACD797830468685029B2284346296F1500FE92FABCDAB796F35 -46274B8A69AEA68FBC6E1EBAE3957865D7DC284EA7A6CED43CFC91B1CFA4038F413DFB36 -491FBDB1902914D92F2E45BCE9EBCC1484C97058783BA2C17F42B57A180C0F4E35B71090 -CB0A51F6AAD0A5B01E9AA7B8E69FA463B54A124AC05B01A942526B070244A2ECB6DBA5F8 -01DB459733371F92936CDFB4F35F7DC4ACDFE02A4002186F98A1000FA168B6B409D152ED -D5BE9141CBE10E0EA1C17687E011FFA488E8D9DA7D75E847770AD67132F8DBA4DAB8E567 -54CE8BD5B72DEA699E2EDB0BC2868B71E012E631C747F23F5C221BE43E034DE187BDD469 -E712F4FFFF09597BDEA4E71E76693FC639F758606E99774C1FEDBB5F121AB9B0240D1AF3 -86B28EB0024E13C0CCB25457F4996665A9F68682995960BBBB9622C70E1910C36BF19E5D -AE05BA5AA16E07F1E26F00C5009F6D5BF8B2AB9A3A34ABCC391B1EED111BB98B0A357D67 -91EDB58EA4B24336B4C0CD8994CD552E29288AB0A7FBF948891C41639412F0F2B70FC00D -2C509270C53B5EA1306176290600581E0E7A793FF3C6A085B9C627F941E36C4D6D31154F -6CD00209EFB60C1AAE01636B10484C673C58881FF8B54AA1EDAACC309F1C72C434247C7D -ACA423249AFFC2ED1E53D1B862FB553E583C4694C99B6116AE9F6BAF64D2B512C9C624FD -EAD7A00D757B5526D4AC98137C875D0E0E051ACBDE4996DF3B4D5719114C22D5DCF02A06 -4DBF81847FB12C931C2D8F6E9C557666DD6AF7B28E7E763DA7BE334EB3FB89DC1D5D8F12 -6ABFCDB56CE31A41E098375CD932B9ED53E5DCFD6A943A983F071F8B6EC1C35DAC748BFD -32B8FAA674B8F902B433BF12F554D391B56A3C8E36B6AADCD9489CFF80136FC575D7E64A -957656B2C4FC270F23AD3790BCC95E85894C61108A9EDA8EC4D22E9846ABE07A528583E3 -3084991834D424B8D52EA04CF93C1275FBAF578710888BAB0E447C395F0988035DBF6B79 -D65169437CD509EFFF8D61A333C909BAD589AA1069281E3DD8A266D4809471F65218DFB9 -9CF1D4A6C4C07B0A508DE36F53D506B25268058512AADAD9E9EEA08EE51C0B12977CC9DA -DC195E944C659D2E847FA471A403D3069BCFAC82479AD29FCBEF4EF6C93EDEE4F0C0E44A -34F25718B7158938A3A9CE183D707D4F789A5BD28F331C23B3290AFC5E4504794654A814 -BCD943F786F603E24C01E81C1E8577047C3E85BB4D861278CE2E7E32193D1849A9A310C8 -419214AB037971D051A9355EADEE4F56DECF0B20C0AE7A396797480EE47FF822F96DFDB2 -39122A3C8F8A83B8B3E105B3950C8E5703BFC5E591437422FD417A71797DCD2872FDD9FF -28EFB8E20B2EC948F0D4EB1C67E7E16CEA436DEDE1B17E0C4A11F1E91D3CE839DEC8390A -FF3C58953D098B24597766D01BD59A89ADA6F1040482EBA4157EF2FE71B220551809013A -B5B47CFFA33546A676DFF72EC6D1A04D82750805E38EAEDFAD935833B94133FD5FF8A58A -5A01CD5715627E74E0856D1F8455F6379F2E8256CE604480CA874DBA0D06E190833A8015 -7BB75CA24E95175821FE790DF854F15E7EDE318E0C0171FAC8BEB5390B47D5814E4D1F13 -0FDCA640E0FDB9D0A5068E98158FE775AF2D0C7D9136087E00E07B67AFC8FF6DD8FD9CCE -ECA3ABCD3DD58DF9F14C032941B13E01BF6EA44844D52FBC037A47BD94310EC47A1F7B54 -B6BC07C7092D8946CF949C654EC1AA520804F8531C1534BFA935FAAD3B9D7EC925BB0C4E -2C7E8E205C09104B8FDD7F8AE970107E94EC5C2D5A7F28DD7C0BD6C911CCAD24CC303D5F -0C6C9A4A585247D5EBE57AC01E7D8E3A384DAE4803718C1C81D3035324BDCA7BB452A030 -89FDFEB64728A25EACA1F4AB96A6749C4BFD6DF72102371863F719D55825AE83673701D7 -C5139567073180C72C6CF38A0CBEBDDB043D2B412BFC25A08CBB18FDA0AE80554DC1082D -E4D70908AA0C667073F0CEC5655C947CDBE6C501B1E38BE843A5A8CB02312EB04CB098F0 -638ECBF704DEB82CB1AE8CFB27B368D95A72757162884704BC4A74DC7ECCCFD1842D8957 -BB1AF1B020A97A149AAC0E0BA7699703E9879E49F122A838BC7465161E9C4C62E02B38AA -396C1E65209428DC112B08AA731031B4198BF48048132ACA9B40FAAC94A236BD16BEB9C6 -83A511F57E22ECE0C6C63C0A3C5366FBC488DD3CCB19CA471ECD0B895B644C2735C8D008 -945C02FB39F91ED4D633C151251CAE4E82B18B55D978E6A7DAFD6F4D5497EFC807AE9AC4 -2BB5E96A8630756DD2EF1A7529AAB9DC1CD2A98C9F70ECC97D8D1F920A5EDAB809C7BEAD -04B8E0C3266E1C2601FCDC61B73007294ED1176FA5C5E94075A95BABC2589B04B2DC6A7F -2A244975EB7CED7636A6216A7CEBE34CE405D1C2BBDCF3D30D0B65AB3F92357B9AF56455 -2F36A611924DBC9C90AEF0F6DA64EBB58510AA8AD7BC633B8340A942721C69B39A01A69C -28E44C520708800484B236420555098D369EAF3A1251B128881C6A71F464B0DC77B9D1B0 -68B476024784DF5B722667126F0ED991F123124FEEF22BEE19DA1869CA12E0C94229BBA5 -B2CDCDE1BAD1DD53B2A713C4EFBDE270F0C8AB7F9AA27FA800DB025FA10B2FDBFE4B8A98 -A1283CDCF35BDB1A6291884C494FC6224B965B55742FC5DAC852C0D014CBE5D8E64406AA -5845853F669A1667A543E64D5F86444D0CC1C4F796B0F51C0BBEFC8A7195C72566851BFD -01D5A7F44A707448E67D202D89994F2BDA312FF16B5287D1D13E4FF8CA905D012B2DCC06 -42DD1A85636EE7981F13C099535D935C1A1FF5218CB190A58BAB01C2F502323676ED3AC6 -AA4485008B7D142EB15455355811F1FE8B7FBBE5D93534A4936308067A6F6C1D80F6A287 -696606946C8D61C244DFFFA6FAB178513EC0F1724B24B3F26F1725471AE031FF8E15109E -A992D90EFDEDF8796BE5C16425E1E1391680C229067BA9C69CDC20077C02364C6E62EEA2 -CC5A7EFAE6A9493FB1FCC5C93228AB5DBDA8A2BF8161FEC4492B02B4F29CE42BA9C5ACB6 -8708C055BA56CF6210662112EBAF899E62CDB2EB8A685EFBD1BE151B4F2CCA5DEBB90B5E -55FEC92DAABBFAF7C3778BA79A59B131682568FD96640F3794EB7C57A508DDEA025C7120 -89F193118946022A9024289B2FD5D6FBB8B8413B0DF5F65227DC12E99B7B657F846D798B -F5E74A3DCFFF1B9E1EADBE5A22268846CB5749B22A96CB7C2A7E1BF47E9E8F5FF7354314 -3112230BA9E8A3218442BB7DDA51AB8641BCC1A4F6D25B53A4ECDC171F1B384C6546F6D8 -7239CF09E6C8573BD593FBA1ED2C42443F6090EA7A5F4AF4781270BFD801F57F42A7C51B -AA65AFCADED310E6F29FFF5D641C2807B8CC4DF05D45CA5BB072F73E5A7364851C7DEFF5 -270D676F9F86E425D14171E3862B7FAAC43E181CE165BF319EF549BC8B5C3D3EC51017B5 -8FCC9817F9E527D8DD01F33C9B99A98F675312D26BB76FA0DFF8B239A1CC7AD1A5AA9333 -8AC724B6A4C9B5CADFBFF718A5593C51E476468BBCF2E5E77A151DD9DA236E5765CC545B -AD8D10D62B238BB574D665D0A6CEC479D1719D587C1362C2AF7C04793B2A7B20C297D5AC -0F96F6019E1648B603AD04F8817F6A6F5E568A775850DEE71372303059B137BB129580D7 -D10134DECD6D801AA62089EF6A573DE96E0958552DE214E3615A306B798B6D68314DBF57 -4305E2B09CE8816EA4515CD6D2FECD2EA452FC01F62464E73FA7006117556487B6F58197 -5EE9CA6DCA4480FB0B9450FA07B5FED7528ECC235BD8D3A24CA63382B0DDCADAC78384D1 -E5A6EA0646E3655E6C86C323CEED8F76A53677A70AC54CCFB97A3713E5209E1A0F9B6863 -289A62261BAD054A7A495C3D0F883735284B7ED4A624C39C8A03B93FA9BB91BB396C0E4F -E3A173A5100CC25ACD1E3967588C56F6F3E70AA6E9F5621E4B9F3A25C0ED1B89054EE11B -ED849B16F521BD9A143D0B29796D66BD57B4011EC290045DDE9C4800C2D0D1DE24501859 -50DEDB737635EDE2D1559E0BA7C0B361BBAC80FCE4E4B35746B8865813930ABAA5BEB288 -1D820EDA6A683CA4A94EECDB1BD0415D0586C844C66736751640C5E8055C6093FED9F84D -EADE6273926A863D231C9B461B41EFEB4D945D529AF5BF494858A5E5E0A0BF1B179B697A -F25A3E29991DA1DE79DF293961AB7CA49846941E82FC59B1C06B9BE8BA005138F6979DF2 -7909F57060DE9028ED61B1EDC811A60090CDEBD7781D628BAF2C540FC7B4783BB1763630 -96B50637075013D726F9D0EFA2ACF762929C06075D5992B5E386496B381858B6AB040CEC -184571C870023678728ED7332630969C86BF521693DE56D09D6D8B0B37511C7D714E9932 -6DD501DC3AF262A1837BEB8AE03DC161F61251A615103EFFFBA7757615F60F7AF5DFEE44 -5F9E832E4794299721776D643A4395D21F905685BA9038521F05E3C3E5BD1D3EF9C229CA -695BCA0132C4A64A71334D9E76C48F6F4D5901CBD9DAEBE194071FB0FE7D2C5C395DF93A -C1C64AA36EEDF18B1CA6E2B510E52A35091AE7673924F36F7AAEB981B9957A3EF3123C5E -05AFF67CDB142D00CD16E03754BF6C68CFA2D734333AD69B3A3296EC597C8B76CC3232AB -45ECC8B2C90253A7001485D49E6310FDB5DAD3E7EEB4305BE7DF36342C4B1E11E0945B5D -EB63198EE676FEB7D3382D0CA6EC11E11E8130AA9740FA070EB518CEAD8C85D8BE693FC7 -15B31D6CEB164254D322B7032075DE964C94AD8B28BA58A3A30EA9DE79234F4DE0CCE216 -DC09F22CFFC1E740B082DF65F10F9D9D173E1F4A996F16D5DDE396179B4CE389A555C3BF -BA3B9059418EE567C4DC661C151F9EBD8F2E006288A6CF3B86D8F260E15E77682FE2976F -14D4E69ECE6B15C1042EBDABA1D24D9758EC60EA675421D5556C26A83CAC3B003F8426F7 -98195AF444EE55CA608A69408D69B7B103FE873A1CBDE862A7F7C4B27E778D4ECEB1F596 -C4796B37DDA26AE61A4579506AC65F72BE3D01C2BFC79556913780F541E26E5316F6A56B -5C92DABA9B7B9A9E80BDD4FF1D3F27559F83021D89CE8497F665F2CF2FED3805F8CA7D36 -355E41188F853B192CC64320849EA08D09BC87D24DEFFA9196F75F00893DF4A069BB4340 -A9A451102003DC8FEDDDE6B648EE1675851310D15FE319BFD1E411DAC0402698598396EC -9B01FAA040F37D13D65D9F88120D6212C7BE51B98FECC29CBEFBA669EF8B73A39EF24D86 -8C692FBD3C55724FCC7BA3912B87998A4E50566ED69BB2742FCD60FD3BAD55EBFAAA0E9C -8BB15FD2BB7BD82D65E722297E9173E09D8C228A76755A3611170CE15924D3F2BC9FFDDE -B0F2CDFC4CE44B6507B03916E334B4FE336473D0DAD959DBF3B11684D09C67872EB406DC -E8AADD34D2A0FE88056B2184D2B07825749A3131CFBA4A6885CF4D84D914DEA0A4DEBD54 -F35F031C2B4C18D2C0E5DA80463FC86645A3B63209C53BD98B394398E506D8E34F0637C6 -BD702B6BAB0E45F12EA06112EDD4983034410D96D3EF907D32C71AD4953A8C90FB289510 -70AD7E985BE69AB6D180E110FDF29770905DDEC7DF995FF72724A275CE8CE825B9322B9E -B301DD7E90A6075123279F9EA89333E39457333EBDFC5F07AB1563003D0E766A010F2342 -A5E210C256CA182DF768439CCBFC43477E25E15BFDB3A224BC1C9D67B0A0EE160B7142B3 -58330DC30E49446C18969AB491CBEAA64AE611F587A3A7F7BD3B206CD034D0EFDC12C992 -4FC9F60EB7A7B7BDD94E900C5A58AAC8C17B3588A95D614197E1D5D1013888DCBD84F7C2 -51DDBDB5E1EE146350A94679DBE6A67BD7EFF924C402C23DB55C00664754CC9E4D3B1422 -16AEB7A712CE85947C4680102B651F83DFE71428028B258E722D827C2C347CE087C741CD -F0846675E34D56EF99E21854CA02AE9BF9B41B34E58A1D5144A6E9D698172FC2D8E8DC49 -098B77980978D67285DA23F821896D3ACFE7ACB6FD5DD87AE6D07F5FDE7AA553A869E594 -BC2EBEA2E0ABDD5E747FCF0F7D1381F9E121E97B11456F80215AC688AC777CFB9419D95C -DAB35AF315C5C83114FF51BD583F17EC51A911F255521B3DE63C5B0A016EDB98722E0B15 -FE68117B4406CAE3F29DF6CC813569882C169070F6F499DAD42E1ED6DEDBFD464D352B53 -0BB28FE2554FAFDD48FFB9E1A433E94681A5B9DB2AA285BC5CDA48C1BF7AE7999E5A6678 -D9ABB9A68BD4A60756C13ED1975E2107F6D1FC4FCB2E18FC25E68DD2E53A623D15B95541 -31F1DD74E82AF748119B40F6E4E703DEE1856BACBBFF672DF548327A95F3B52DD40105C3 -604A24047CD989DDDBBCCA27D28F3BCD681CD55AFAA1CC5F29B39FE1D6B59FBADAE71196 -CD83F5329C9B969A5BA06BA67AFC193C4BDA78A275C64E2D82F373EDB713498ACCA9FE26 -9FC4736828D55A98AB9FE487AF40164FC38085F9DE01332E3710F22EA52DA9CAA28DDB5E -3AA72EE9444F818DB13EAEE426543DAD3C78D48B513DFF77C18555DA53B33B04C8887199 -7B2C9E86E12E94AF3F379D196532D2CDB84741211A584B7560DEBA3C53CC78E240186671 -8D295EA11162384F00A727EA4B7EE6527DD7DFBBF5966FB4372A35BD2FA7BB7A6FCFE23D -AAB6570FA52506E3EF532E7E7930298FFBE47D48641C0E26D1BA636AEDCDE13DDFB3C822 -DC32C43759F016752DE8F256DF5B57EC3C623C05037F1E41C38C66D18A27610CA8BC0E5E -FE4FA49EB0E287E855990B9C83A103A1151727B192496B318A0730AC902D7C4B154155A9 -47AEF1B7255276631566EE5B995D9596517E42DE25FFC666FC0703336FCFCAA2B97031EF -9B95FD714ACB1A47A249DA377A6EC9338558939C6327B90B77249CFB4CE6FC947BF1E88F -17F20A194DDD37657E8D5BC31F624B6976A0078063FF707BADEF04391782C6660BCA4623 -17BC929F6411D2351B9DD2F67CE4BE04D251829BA6E5ABE574FB3D3D8D2858AC7B87F3E9 -951F0FAD71060D85DD3BF22DF505778932D2C7CEE2BD318C0E9601D085FD258C6ABC091F -EC3F44C639B2852EBB31BA5522AF78BEDDBBC52E804D5DDF23DD119B951551695BE44C23 -5DCD52729FE0FD451F9CEF413EE55AF45128E35BB451D654496CF1C8C2BEA6C95F87040D -928EE96A22AA91E8166577727896E7A26EA5298620E50832956DC5B4B95986C69079A1B6 -8F64DDDCC518AAEC30D9E908BEA76C19D54388435012C2F8ABAC88BD1F82A1083F729569 -0A4076112B601F35B1E104720EB73D88E0E62CC0FE278EAF5BE953AD8D44604C35D05A14 -7123538297A5B80677AE45EBE1620302B8248F2B0CCFA068CBF76C863CDCEDF677AFEF18 -F4934012F795C9CD39EED5915DDAD4F640BF75DC91CE77E4B449703C1FBED867745F67C9 -BC48C987BCE8B838D35930735744DB987AA4E8EDC83236D764D1237028F6AE8A6CCCA003 -692C28CD708F1C9F4B0468140AECAEEDC465455D8C69159ED0AD0D0B004A8B51ADFDEB3D -82220B8D2DBCC5E1CC0F550E44B83FA668B30044A2E9978A810D4EF995490065DCFDEE41 -E94DAA51D26F13EB8218220FCB1F0F32D5B5C15E715A4FCC605B2F8800F44B82633A83DE -FA4C3430104CE6650AF07AB2668E751DA4845205FD29B7B03F46B51DEDC3B6DB3E534E15 -AA0B33BD6E0D2C5F8442EF326828B9A3188EB15DB04F301A98E00710AC5CFBFB9B2B99BD -5AED103DE636341AB7B03E24016228C0DD81EC95D5A8B8EE1C44944858784C024BE6C8FB -D038801D2423D09711C5FAAB0E16C87D307B53FA9F874E6FBF1004E47C6A6907DF86BA73 -9DAAD79101866EF02234D746C72BC60A69F7BFC111C5C26B87440D836432E283EB0CB8A9 -39ACB06AF4FF3857EEC12A1BD1189514CD518060FC75DDB601F545CCC37676ABE3EDD86A -7FA54DA5C33D42861E585D05EFD8B41D42F7A9A904F48FD96E30EF9C74433B35B1EC9F3F -15607376F04695749F917ACA32779CE1CD986051E43C2EE748542E4C7CD50E3C30DD46B7 -C6F809D1051F977E7D351C67403B913BE5273A97429416656D83C0BE7C08CBEF00BB4651 -D0D5CE1E8885A32CBC72DD26CAB330BE9845425E048B1EE1AC7591F0F0CC9F73E1EBF665 -76591E3DD449304DAFDFB6A44C7BC4DCD9202AA223C9128A961792E3C0DFDA3515BCABBA -78F38651862266E779C228C596BBF3903F097765DA142C99E5185BE9DE2F01AFFF441965 -198BD1FBE9BB8D61BA6C685BEBCBD4381C20F71F8DEBEFF62D7946B04C7D357E54ECAF48 -A49EEF2ED25179C1C3FD45268363FA20D07A84D60484C712A43D224C57551FBDAF4973BE -EC02A16076184E3108DCADFA44B93710DB3388E633AFA06AFEC76802F05EFAE2CFC74A5B -AF3600A46B026AB514EFBB7184C75BD39FE9427F6F0F9D2435BE1B26BBD4816A72B8AB67 -DA7A6960F5A7A0E7FB1F83DCA6E3E8E8F1BB11E22D378FA743B7791E981D117A2E8126A0 -F3CF5C9B0C35BAF8B66211813FE63B029E2A3913CAAC2603AA4AC900EB8428FDF58DE83C -D998B69BCB6ABB67FAB1647806FE19FD695372D671EA0B6566719938456CC79D265C9791 -725AD53DF396BFA79E945F4AD42DEE0C69C995EE8DC3D8E85BF383DA9C1256AB133CECC2 -49A3BCBF384F53AD50B3A58606F4A92D68DF6C072E66997978A92EF5124DFAC8B3938E60 -94C0FAF7556D0F75925FE99AB3E80FEA8042A977931E75635051DC896059C30D7ADC38E8 -90131D3472CE1BBBBABF231728199245250B618AA5F830D20C8B1117E4406C97F59A9A76 -205946764DECECD486D1C217242CF8C58263535485E89344DEFAB9D94079EC177AF6DC31 -051EA610E81026B7569A061E99309A04CC3977C9BBA45E88B6AAEBF585B5C79E42548C23 -060E0E103CE6EA0897B43EAA35366DEFC5B1E5E673424D707F05C770F31218BF56855627 -8C9F75A113F5DB640C2EDB7F9D3138A5C314243030CE2BC58F4EFC9B546E407A1764118F -F9D2208C6219D088CD8A214CBC0C1DF55772A04DFABD89E08F7C98455E8A5F1F82BA749C -7C5C5E6CEDABDB9B3F6E1D717ED97A50D0906BD4682D9A529B3530F29113A35D5681980B -8D099BAC264E382DCFAB0419F3313453A080795E7CF66860ECCB8782191F4CB0EB2D2965 -F14D28EB35DBF1C95437674D84C1C331F4EE99C8DECD6946069B3A4A7DEEE0E48E817AF3 -08C28DF99E67A4413655CEB10BECCB27448530B1688517F0C5DBDB97A17C6F12C6AFBF55 -AB5AC791F5363E56AFDC38DAB07B7A47B9FBEA91427847C5EC1D584FF56E6F2735FCEC80 -DEB8D89F90090A11819D08591A37EC3948E36AFD44237CAB16533CFB51B50E1EBFC4A6D7 -BFA520FDA738662AE6C0214DBB2723FBFFC986E9DD47A493FC0090575CCDDD6C38EAA038 -3858C077F57E1DFDA8DA95C9A18D9432DA2C86DE069CB675D9C8189EF01C567CE476E0B5 -31FE688044569D34362235F894E746E6306C03E76E615571D9CE6FB31D63BF1DAF29AB76 -27C0D02D7760EFE583C8C2FAD4AF0A90AE91642F2F20725858CBC2FABB5A5A36F19A3C6E -455DDEBAF968A90312E83193605CE8E5454E396C2C59557EFA1BE1E0F8A0AADD060F77E3 -C642635484956025266155DE24655C44BB0B4D07099D81760DD0823EB9EBABBA27A559F4 -8803E6999B782A4D91C388B46E1EBA6E8BF7CE9080F46B539A507F5DD17AAA05D05A551C -B57918F3AF43390187E3765548F4E5A3360A95C80DD6AE1B26E1F90B8391A3872ECFBA2A -087415ABEBB9119CAA1D411EF7E0F0737AB30979A30B2ECBC8EA42F38B41421CFC94BFB1 -FD30BAEB6AE340D043A15138AC4A7FB12CC0AB80547DA81D91166B09CB56A5504C048DF4 -D4E1E7083B5EF010A38F4BD375A3918D25B05026FFEF87AC25AB554EE74AEED323B4AE63 -0F1320CC97909D2819A8EB0A90AB5F1147DD888AEC5D42C8C5F2B2728A80AE8673831189 -D76571F665756C2C01AD4F936EE0E607C27FA9B8E38BA5C67B52E7A50E09AFB2D0610A00 -863C59F7A1BF14A5D3FF8954CBBC3D13F709B433822DB8CA2E64BA1FDA4F9478A5AF24FC -A4427F49F39EBEDD3BA9DF9B2ACE9FCB01BCC9153A7DE685AC5284427B0C573A6E5D9013 -86834552B2356F11011083B65724EF7F8C7D7CA259E0C03793B9EEEDA5B6DA8376E72EB8 -033A415DE664EA5CF53B88655FC02AE5E530C6A90F443F740444956B60F6ED760294DBC1 -9F492DB3A5D4E532D0DBD9EE8139092D3E89D7CA7490400FA4EBE56334B1A17C9826AEB7 -74749C9193FBEE0414C7E7877E26B8274283F14A14AC7CA27139CBB8CB89A6D38DA283DD -3D421153DB2D917391215433E356E64E4A07F6D82EED542FBEDAFD11D0BD4EF3041C6865 -2ACBB1FE71C6B7B3850FF45176850FFD64D18D4D55BA5E74D037D3CDFC62563CE2929233 -1E42E636DEBE14DE81804C1A15903CFBE782409A1E8684819BE6AD86F1C0EABC03F4CCA3 -A959E0B6C57F02D29062A6F0E3E5978C4726C01F607307C16F5F64460E81042B8E2F6524 -EA16F9BC21AE861DEE4013959FBA74E40B750AEAD9607FF6D15D96F6C28F4E9398C70CF4 -1B654A2A337FC8AEC523F27F6C5F0DA4B2D4A3758A0DAC65BF2167DEA823C3D108D3661C -CC47D80C948444701335BC4DF8A8A8E433776FBBBDF0C97E985DA1311451CC85AF9E5BD2 -FFF576BC8E4A79C92A00678761D47D093A26796DE0316A80BA5CE0BB69E188F4C38E7BEE -45C8DE646991071844CBB503847613EC82BCD6950F44D64D8117B52E3A63402C09931410 -D7A1AA9A04F9815D52C3BB9FBC829F9DFA76ACD77BC751475979D82275B709AF02783A64 -A633CD8F213DDE9216664C22E9F9AE3370B282E9098B86D4FDE991FB9D16D04C0C7F5262 -D539102F6529D73F20D1996061515A8F1219B228502590166332AE7D27CC822ACCF92861 -5091818F53CE6A7F1C5A68CCC3D6C7BFC81167C3C2294C9591B71CEFFC88A245E16484DD -1080375D15B6A3BBDE47CD198D0BE312AE1F5F6EF6DE4A2CA38A717D7104466509C8593B -FA6B5DB6DF788C6952A28E25CA9E20D636EF9E84FE3CE4D3A4647464F79111A610A1AF84 -E0BD4B8F7BA06C3AF012C74C91DEC0C597E6F4C19546D258D9E53E7943D6694EE85C74B4 -93276817411892299BC02A2CFB065F5655DD87E69743313801CAF098FA1C56841174EF0D -4A7F27B2E91762069656895B9FCC9434434ED722BB9A532606688F303D0C514B31D179CB -DED0DFF008F09184FA548FE7C276989AF46C9C63000814F90372A1295717CE87B2D9EA55 -34C0A4D467A0F6A32482B8139AC4240E3569476BD4F8D5CA5CD62F28BD2FD820602FB678 -69D696EEFFF2C173D2C7EBA377390670908EA07A7E90BA16790314AA8A923B234C8ADA37 -25888BC9A631A4A5B308378369C29B79966AB44E3F4DF846B0438C31B6143C9C3A003C86 -A2119FC5FC1509BACEE7A9A1EF43945214A1E37879CABF18B7A18E8BFF45E9C5E7CF05C1 -81F2BF236310B0AC2B1D45E0F6E3961AFA34CD8597914B6D503F7F5BB964B7DDF195A95B -FD5F3FE49340767491F213D849B3299AE439801B84A2718489868599F29DB6849A5471D9 -043C6B4BCB4AAA48DC6CA3DCDBE782D3113463400F09399DB804AA81FAEA98C6C7FF513E -1CEFDDD822C4A5ED4F0EC1AD96EBC6A713BB82FAD69C3E914AE2CE2AD2DE8FA301364658 -0987D4836813D3DF7BA9A77601FE3DD487408794D7167D6297BB19C8ECA466D56F130AB5 -E0ACE40D575558A8221EF634AA1D43CB10B8CB8ABE6EB2EBF97C8ECBCA498BD740A73DF4 -0CDE64C2C0F2D1468C01047ECC2320A9FB6D965C83A2CC768323CD1FF3590D6DE86AAA5A -4ADF258AFA132E8D8C04AA614E11D26466CD9F265AAE7D8F3629857C73946C1CDE7EE21E -15C1ABC4A1F591DC1CBC14B66269525A664419D0C9AA2C4713790AF5E23B566EE38D0530 -886A48F041B8B009C5522B55E63813023C763C68545AEF0FBDF2674C94219D0233EE3D3D -165B31C9BD4B9F27649B860D935D77557035BDF4238B499C5CEE68E946454034E4841914 -987B718F237862C350178B8FCBFDDDE9E184B3EA11240ACAA8AB1880410F42E0C66D7A2F -CD1DF1A3E421353590D9880F7A5A0065314D2E892D45090526A1378ED18A694F6820EDAA -5599C2EAA34954D28B021848397DADFB07F7529EE0C975F5AEB815D91BB7CEACD2888F3C -9EB8BFC41EEF2883618CCBAA18890E36B6CD9973E0A0665387DDD9829DABD9DE59C20652 -6608C3FE3D5033C33DF477762D37F080E3CC292D9E18348B2200956458F0CE0987B39876 -733331F948C4F15C818AEB8F829C03DA8BE6EEB40AF79A1686AB9A289FFA67BE3A42C396 -D5D24246959921707E84C9D4BA448BD725D6DDF0F735C9ACA2FF7CC28B75A81100CB2B6E -05B75DECBC1204C68ADD1B324CD24F99E5ADF9DD3A41CDF704184E27303DA98C72037B29 -276445BE607B12363036C6EA298E2B47890FE0C3948DD0AA3D0FAC17ADA775F58FCC520C -3B289ABB6315218DD1D5A6F36198EF93C58096B8A4A97D6B49278A7E41E0ED9C9D28186C -C8B5D8DC860505D94B5BE90D1765C154C43238EEFD91F5A385B6FCDD19272F1E9E3E50D3 -83C523509B45D8A166727E8022861AB6D8A8DA71EF875A19362015DA1672CAB7E9D80E0F -93A00867BF6A4B2894CBC866BD744013E8FED49596E6D0CE6D18D5CF56CFFB2BBC53FCBD -9F2B1D7221A7F5B539AA962F74E002DFDB8A1425A881DA6D62DB3E1E43CD9C20C4B8C0BE -FCE4B01FADC43B7406529B30BDD270098761F3BEC88EA6AC40C5143AFF3B926512F2D560 -F381B90202556D8E3AAE54712179B1C33131D52A4423676F83EEB850FD9D3281F4E092C4 -A3B402DEA3D01774B5BC9AA527D7E2A28EA9E6097064DF15F9A0F5B1AAE25ABA18689AC4 -2F1E2F1BEFF552DC96BFF8798FCD5877FB4F4B5082AF6D3F24293C7D34344959BA691E53 -8575D64484F2B36F1223DBC2A9959793C29DAC7C28E334775A1081818099D1CA68B693D9 -ED1D3163BEE2611E01B87E8B443A0D8AD12F251752E7850C29F2A535971E4BF055EF7322 -652B71CDFA987F4A51269AE8783EBD530F6180AD15739754EADD4811134E25FF8D2C6FC8 -9FB63D240BA9E80CFAEA02523BAE484EEF08045792885AD55A5D77F4A6645001DF9A596C -877DF33EBA8E728567A4C4FE3D848C7C16E8A3B156AFFBCCAE51E668656929F9D061648B -27093B54604B900461B0E9ECF73718C3B5FB199592BC7C59466F041BA9963920E2174F59 -7F943A02728D5B7FF69735757F5071904A2F6FA79DFD8F35E96DD4F92ECAF58A184CD6F3 -C05E50A25BE5E77BB2856AF8C71C69BDB8EFCC82EE65BA7841387E9CD655FDCA5707DD67 -26B96EF73B36B83362698C5945C75AAFDBBDA1ECA470512B7E11CAC4FFA3C3C66A07BFB0 -1F927E762871045195410E088ECB16884172E616721D58A5F51B5CC0AD3B3858180E1A36 -76CE2B46D4D91D06B146F81BED26358E5301AFD2DBB78D60F9F1A6185B50BF7A18CD41C1 -DD9065950F64ACDE99EBDCA136676247E455813438395B2D3FFEB24A2DE4D8D742EBADC7 -CEA283AD867A1239C224B59D55BEB159D6E4F5E588AD01DD7D398AD7BA539E6F82F8AAAF -9F5F1A7444DEDCBFD014548440DF870D701E9485467492E832E235FDC1AA087952B7126A -017E73A40F8CF1EB23E9BE25B942B2CAD61746F5277B807FFCD1C99CE3B2EC69FE5A648E -92A04C71CDB188935DCFC4D261DCD29215431D80A7979C571CB7E1CCBB7E3627DDCE9717 -148CA0E8BD7F7F22BE4ECF15E8B6CF1B0B98D55A3285DC2819172495EFE082B32E72FD3A -91986A13CCEDC5D832C77A4B559175C53EEE61089B4580FC39F34997A4DF83E427FE668C -3D89C417FE22308176F895549F6E5BCE6EB9AC04675AA645BFB2D81A22CB7B30CA206A3F -01B9FDABC7055B295236A79DF2522E4BB918AB2643351186D695E56E61CFF970A4118686 -E85A4D2E34C515D0203848CD2E92566F38E1D0DA886DC2BBDABF5B3D7B4BDEC68C5FE6C1 -8EA7E92F5470CA95AA5CDDB9936632E9DDDBC7FDDB86D4E96CCE3E8C579874BEED51CBE4 -D861D6657AE53192DB369EA930F87A9CD2FD7F9361D7CD884062870D4149126AC714B191 -1AC77CAFDD1C48686AC3474BDB9ED4B73EF67193714A392C4B273E919AFFA7EFBE7C690C -82E547D56C79ACC4935BAD6C4F333FB5774FE84084EB940DD7E002410132F4A84894E2E7 -4661DC6CA73050FF3BFC04AA8959E9C91D2EABD7447839F3B32E1ACF1482E6DB7ECF37BB -EE26C27AC90BDAFE91F8D92534DAE644CFC38E2A2C540A3868B0E16A6DDB60B02628A94D -5702C1EC2211AFC1A9F7E888B90263734588B6FA7BD2CFFF5B56F91A70633C1353885C24 -8C5FDF9CA938673645E3D320D7C5566F4CF7C9C6E86C9945386A16FCB72D342D936B0E30 -6EBECF12E4F45A6CEC4947A71D674128FB0F72C198E4F4227CF98E2F3CDB7E7AB55AE127 -1C2A39C526CDDFB66A183B6589505CA7F5EE98C400A6C760441B01000F2ECE968EBA5DE5 -102C3974AD4716D7789E07AA39A3458740D9F55D5B35DC0B557CBA9661B6588B37F63173 -7579616AB866890E1AF0B90399F1F7E95E18703E6F723E70B2C00B6640EBB44353DC5A25 -D007F285A25B3241BD80CF83C220ADB9288AE09FA0DBACA187671CAE9C04B61AFA10337E -75FE9FF0A4BF03605D0FFE41DEEB2F2DB93CF868CC7155DE51819D14FE17986BD187DA95 -96C1904E8AECA0F6DEEE83C9D8CEBEF4C0D13D5D5A13E6F3839CF955A6AAE6F7F5DE124F -0174F811324CDDBFF0247214BA4A343959EECD37D67EAB103B4B9CBDE0FB77ECD1AC24A2 -C9FDB80D0C07AFE58C4839CF9D4CE6B78A1173AE2F05C51F17827754A8EF22B5FA54F3E5 -9ADD2A1103F898664DE8ACDB89929B04776F51E241134E9A77F071CA83DEF1E04EF457C7 -56A29D540B3ED164BAE4BA2C56967BCF5BA142CF8640CD829A952063BF1D9714AD903999 -F3B59167E2B440BA083635B6A11A652E94AA1135F9E00B0BEB10B533811FEBC64C7107EE -7A2B4CEB6D019A305F633A9229121A9E1097C289129181CA5EDFDB7F9EAC133C6025FEB9 -9C9BBA2BFA67603A7790A146174C061889EC6A77DAE40C6C4E002263203BD6BD05D3699C -7C21644A24D562DB3C2CEBDABD3DA2F607458CD4EDB1FF6F9275F767B8FF38AF5DDEA7FD -A18A1CC091BEDABC7C1A959031009969572A97AC1C6836F3C24F6960ADB94D89C5FFEE9B -3391C4671A09EA87B8675CE4D3C473E3B8A750671BC95439E75243100CCD0E0873A6A218 -C8E574583C968E46EC6115266614DCF130AF7F2CB1DB978B409846735D7B29F1F8042921 -7C32639EBF476E5B0EF1367F65F0600DD11C0142BA2386FB01479DED4F8AB419AB5A82DD -66295577726A4C30D92A8972B72D0EC338487B630E86FD7984A97502583B27F5D1BA3A0A -8236ED3B99EF2AFC4018CF8EA12D89158A04353B33FAB1E638F1817E72E8B6AD3C58A86E -0DF708B6F1EAB273E746FDA3A8013271F16D3F0DBA72A07FB48CA2E0815F5635EEF35FBF -27DF180FE2F9522E57CB690E4DF7BAB0C4F07D34BB8984D569340061B64C6D1B5B5E2090 -31A81A794634F445055CAFCE9E72BC0724EE4C9CE1F94D461E9619B3CFB47B5C404D15E0 -3C61B1F11D23808893679372E8BF24AA8D6D443F9A29C2908331F799593CBFD1AC2EAD9D -855295E0B486E8AD72F570B3D768D775D4EDE2B9E48FAB6EF2C3A72F458D8B2DC2D534A8 -55FC77ACB99BDA7B5FD432D848815D327BE30A97556203F1C4276993E1A83329E62E8288 -7ABC85C17622A83B380B8E0C381376DA627C5852F0A031B80E22273170CA4D1367B183FA -169F6EA37C541C3E4EC299A8F34835D56AAE798E69B233309FFA71761469CC4736E2D627 -073DB92380000DA1B9D6353AD27DB894F3DCA36918E7CA103B60B1AEC505D6BA9B22A92F -BD69B9B2EFFD277157AEBE234B579E82D829D06DC06E67A4AF366F76D9321CFEF7DB3167 -3024556E61DD0FF006848A044D80407DDD75F123B155681F47C15283A44286FAE9549D8E -49477A38347F5AC9940F511E0222BDF46263DE6DBE16990D0975C2279487BCAA41177833 -C54F854836CD22346F409021DD7424D157B2E6DC9CD664EABD2B5352B1326C1C046D6E91 -306E84D44B798DFACAFABCF352426442DA14795EE6EE5A1E451238E946943534A0E4D53F -5CFF56D8AA689FE7E45D8974C5CE1D4DD9608AA42A873D0A0257D8766E7DEE544C350556 -5E58D358F0AB8DC7038795861DDADC8B0387D823F3AB985FFAE915019CE53B91A2666F39 -73143D04434D1B572ACF9B335F0B921E1E49428DA8AB0BD8D09B351C8BCA247A86FF7253 -4EF78A5150BA14BDBA2D535D5A46017518104E810EC678C9202699159CD05060C1C9A5DF -7421F17177B9141550BC2B2D9F2BC5DA1346AF811667AA0F5DDE7F690B366F6FC9C3A488 -B88D827C24ADE4AF85A5D5CEC82BED8485EFADAB9D9CBFA07A879A9D6141EBCB10028BDB -83DC99174B710E444714AA5D275073EFD6C542654E303D4F61826E7C505FDECB175C31F3 -455A2E835D12123392DB79B22ADCB30658228C0142B6D271FEACA94A186539740AEE942D -11F4B10B00C6DA85D934FDA37B37332E61C66AB95EBB5473308E3F2E33F220CF1960202E -5A2A81C85E8E831D4A48A7A9CB178A3F59AEFC408EC69D76722CE9FE89F5B7F1A31C7606 -32EAFE6DB673C6E76B0E472B2F0844506A481EAB5479CF0C559F02718F76D41F78B2CED2 -19D72BD4D9CFA3F99F1B8869E0A8AE58F40DCFBEB1B8FDB98032C3430E7402B9B1A93141 -74557B5A1CA485CFCF20D6830140FE0FFDE105A08DDB301E2109E5E371C2EB2568481443 -51F989472D19D12AB51C7F23AD18B592118EBB0945747EBD9F4DABE0C8EF4F3B8AAF5FA0 -34B3FDB56EC249523B1A3C32BC4A6719AE510FB82BE0CC27D6D4FA2A806941EA8E3CDEB8 -A30F91078D22260FFD25E57D8B3BF7A743031731EB7396D5E9A949039FB9ED19E38D5C5C -644696E3EC29B78591F522484829BD1A58FA3595AB26E0566838DA3ECD428D905824B697 -3FBF19090E11E99B789B61C0BC97C86C7FFB32FAB5C7FE00EECB9C8C126C55C959A6B06B -C709F0923589F9E540E746AC6949DE143744799EBEF6761AB9DA2E06127C18617324286C -874740B4B5F82DEC59585397A4B75A5FCE31AB26478A7BF1AEE14AF3098F589C1FB7C010 -ADF80512E936F57CDE3B8E244B00A80054664EF33B5BA3E4FF2F43DE74496A57C0F13B65 -A60A2F4CE599BB104E72EDBF9BEDE7B943F9404760B7A79AC38AC19086516CB33AF7F962 -0157DAD4D4AA68B8C96A66AC15C526A1711081F56738F3238EF37EF609BEB0792D41941F -6F1C7D95E0391CFF720A51755979EBE6323C653EDAF0808644E41FACCC09C29E1A210B10 -881AA79E4D9714F33A96735C3B2D0B13EE6272BD4D157E7FADE7F6BE9825E5655E80A018 -5EB33917002B5342002CE5D24859B6EA11E571FBD6F1F753974F965E7B5A8E0B3BAA8AC4 -A6C6D56EC55E44BC9D42C8A9AA29249B420DADF448F6DE76D1DC62763D5B01A4030A7D78 -28BBF81417BB287B267F64F8676174097E43E99785609F9C542ED5D29121D5626A9C7461 -5B145C86C2AEE98A127B25A990D9D73987958DF6831FC937B06AEFEEE14583B91590C768 -7A9FC1CEA0EAAD6F29FFAE96F8ADAA658DE66B8567E8A9E56D866B8A9A08C3D389B3373A -AF2D0AABBAD35D8F3AAD5D04B69CD31F7BE8ACFF96CE6DB8C42E9F842E4254EB34C2DB18 -F0BD1D6EFF4ECDDCB5E77E92CE64F20260E68903EA705FBACBDAAC6CDD7FB431948F1504 -876DCAE96AA501F25FC5707CAE2DA29E995B6C4BC6CE6C641CED312FA02000D9057627ED -14D531443C740E7CA081652087E0360C095652A1CC56A27B7FA61B3420ABACDAF14E02AC -C80FD7B412A97CE4F33DAD5C747EF14281EBEFD492468839338802E42FBF554DA46DDE16 -88D26DB26DD3613986E9D28D14D4BAF9F739F93E8EC34A2BBA207294D8212D2CFE560918 -A72DDF5A537C4571281DAB8743A487D8C370D67C0EFD1698BFAB848E86D24DA2D213712B -BA731CA3F76B657051083119FDA759A58F8CEF458085052FB1440D6938E438774FF94EF8 -896FB0AC6A92DAEA2E7C00BD76000C5BA8BAB7E5282952B4F16BB9AE8265F8637118A4FB -F229CA87AE41C6ACDF9F8D318D6C3028A70BBB245DFB2E1137E3BE90284B26E8FF4CF77D -66231F1BAFF98284128D08E8FA4FA75981A22F45CC026B1906FAB73C2FC219D3F7253831 -17A24392036B26AEBF3495F3300F63AFB9F0FA950673F5584FB20CDB57EB0E947F31DD76 -945838D69875CD1A4E7D2AF5382044DFDE866E37CCE23F3D06B1F5A941FD06CC0550D64F -312A9D6A655414490AB1B1FD54E34748E1D408782FCF8FA6A611232CC7218B4A0EB93CD2 -09876191651777FB56BE434096B02918A658A7403E45F59A1CDDAC1BA53DD186DB8E35A6 -4078C11DC0DE5165205CBE612FF365C193BA540F5C6CDCAD0255E361622E94607400A330 -BCFABF835275473D4C7767015963CE0FB7DC88B4AEB660FBE4F86039E51DEA6DB4DD229F -73D4A0A322C6D349A4C8BB304B96B32DC129DDF372FC424D1815C4EC51C9B0743D6831E2 -6BB5E28E89DAFC8845F00E47992877FD57EE0C02A76FBE2FDE8802A176E8A03509AE57D2 -0CE44217026FE28F2E06435ABF13D27875C5B4C6057DB1E1F70163C1011972A9C0DECED7 -6C8B547B8202977D802062E4189713D7F579093F4B9A72C69516F1179DC3512584977589 -461AC3D1BE8BE1C05867EF6FDC26E3B82D9CF9D159DC0CC1F9D6F94166A60E6CB9FF3FA6 -0D2B136FB725DE769BC3A8B64722456F049421CB7F863A357B318A979C3513C9065F5CA5 -93022DF125C9DBFBB822B1F84936DC5314F17DDF2960FEE70CA3E7289409EA5AE6F15DA6 -0E407C6262D41D52C864705B7DD26AF2CB813689E24E9673686ACB1970FB41CAA49378F4 -31C53F3A08AC7AF4D13F7FA81B6C3F71FF999380205C74E1B29B5A4FBD349783DF613FE7 -E2CBC7AA7B424965C42EF2CA80C60E0EC6F7665BB3CBC009F0F5C6D4E8ED5CFEF0E5DB9E -3DC006C98706723B2BEC309ED20CF1CDC60D66BB478B87E8947419ABD499CCE74F80FE97 -89041D176C3BEDC9EEF152024E3678134EDF755D8C247E3332F7ECE95E649E73A54C5BAD -228A629F5F6C8EF48935C8591910230DC5D04C395325F0C211BEC315F26F84AE8DE9DC91 -A9B5796CA0ABCD4774CC3DE12C39C2FC257165DD8A7E458E87CB67B6A487F10C351C4881 -0A636E4109845E0C664C47A2E11F9C99BD72570B26E854B4BCBB49F4011CB2CA4464FA72 -6DD8C1F05C69527991D634487D48BC554A80DC32B334D3BF6D65F1AC32D0E764825C8760 -8B6317DCDC713644DA60322D68CE38FAB781D24E14B19E711BCDB629AF7DB032CC9C4393 -195992B6ED1AF8B84AA21B5E3BB12EBA01DAB58DCC2E9549747FD222454D0327C66D62E2 -7EEA7AD48B09DE56F0968E271E59E8965E16862B7968A14078BBA821C2A4487F877E3932 -1D56C51B010AFB2844BB7E4AA57E3AECEAF7213B1C70F6EB993706C4F2A613257027370F -CCA30A862ADC2D07E4619A8F753B13B94C275A14403C97CC131A924EEDF78933502A8E93 -344E91F5A238B236B228DC9FB65C60F8888DCA6B8A1EA897530D193537FF73E8DC70B3EC -4CE290AAAABFAC0EB4C9534C7F3EDE90E840A1CE7975204FE70B52ED5576B0956E62EE25 -7857BB5DEF2AFD8D46228E9625C5C0FE48311A07CA246ADFD9BA1435340914455C0CAA4E -92914E7AF31E25438AA05FA2656094BB31855A27BCDC45683EFF1291934C3C115D8CF919 -7A245EFEFE3F7FDEC037ECDFE70737A4D961CA634AE153B01F03B1A9F72B602A8358D258 -E03E54AF79090DB322ECE0CE33377E42E5373F443E851550E5D44F06C1C513173CD04D47 -9A9E70C9774780821872EFC100F5F5F34A1E0754E037F6F5917EF5126E5F12D46BDDC038 -2D11C217839C1DFE8D34BE69124B3934B22B4E8225BFCB2F265E197474B9349BAF2C1FCA -352EF3F4AFAF1074DDB24E8A70218C83DA835CC97F6C55B6FC10C199BC9EE1033F6F2890 -FEFC3998D9F2941E350297F56B377A0EB5BA47A8195331A7CF3BFE934A97B88F18A38551 -3EA97201C200B5419E83D8AE47D6D6F3E864CFCA8A874DEEA5CADECD31CECFD46771E9FA -7B24F3509E6B0B04F8C4C1C8E27DB0F2F9E0A422988B2D525670841C73E5D11F4B1DF7AE -9AE2D8A3B5C354446C86862C687A3C21CA35FF2E962FB591310B8C0213A914278B65C7C2 -83E1CC558F6091BF4B159428BA249CDC3395D72E1D5E998C88F379A5C0DBFFE5833349FD -5C61034AC1EEA717B26646D9024C3D8763F3B33E60A5BADFB514937B9AEA89009F5F6779 -8D5D92AB0CB3D57FB123DD852BA04E3C0AE9D8021F0735B69289822FE2727140AD5B911E -376B13EAFACC44BB0F0A8DB9079DF3F3720779B5BF1C02CE47463281F6E496AB7695291F -26C2E02A026A104C8EC76E0DE5D7272A3B83A947E3568DD72E8B2DA7869D1FF74F6E6C0C -70CF5EB3D5D650498D267117C37DD3FB5870C84FB972E5C52DC3E0CCE6FA398D4807F1ED -F253D014AFFE0C5EF86A8E431D1EB82D6D223809BCEA39DAF9AC1CD37243CF73E0635BB6 -6B8887C9C2B2C740F8373237B52A89E589D811C40C5170A7B7ADC6C5643F76C4D5031862 -961B7E211127BD0F716CAC04C4F8D8D0958FCF4D420947354D495BAB0C0D2D76030FA004 -910DC71A861857B1B073C6CC56691822B8749EC78741ED8EB2FE26F37E1F9A3B36947EAD -661BA045810DAE798DAB615C0FA2B242209D8EE04BA06A78FDA985402076CB3A893E5364 -2C998BBA5F530C8944EEBCCF46B9BA42AA25E0D859953A948E85A8022C68EBD496553B68 -2555030C9336F53FE11C84168F19533F5AA4BA9C94FD120491D55C1D3FAB459F80F70034 -48F1AAAD448969D1DDC31D65619CD33070EC9BBF9B4A53C180015AB0D807744FB32AC68A -DFD7986E082D57C22EAD0C5352E86911E8088BF50E5F9E1D70241959CD3C18145B258B50 -261CC153E7CAB9BD1E723209024540E123C2333D5A5C4C45ACA1358790816CC30F3D9BBD -8453E76263FC425F7C2E41F79B402DD79552BE2C837B3048BD534F90B3AE2CB1F15A559E -C00F1E783101866534B0039C433AF1DEA08C4CBAB477327EB3A56AD0F7AF75CDEE8D96A8 -0BF499251B400B85B4D157DB4E54184AEC11547522A187287E945DBC7E31CE99E8499737 -2675C3059133BAE517DC46AE28E735C72E31B30AAF58CE26BAD1FC878E54A72D0C44F980 -4C9D5D93947A846B01F61AD1325CFA2DE62664F181557BCB92050CD697A26133B06D6C6B -2B2CDF60CE774CC5EF0CE86EA4E4879ECFE1C9B03E3EC73E35D53F5A1DC2AC8105953D02 -277742EE13CC39195503F2F5C8C29CDA7E4D54AD44DF4BAF5006FB9C081A938A5B51EDF0 -A20A005D40125960D589531F23CBA7C55CCF78C72DDBC8E9D84BC2A0C95DC0134FC564CD -B08777FFD70A0EF725693F54E8C46CD77A5B9FDC91E83AD010DBA9802E3E140943706AA9 -2FE69EC2474E61FBFDDECD7FA0641290E709A9145D8ABF5DC42285CD98CEC24BA9A7345E -BAF82D4461F027FD8C609CDC0EFDB7696CDB4116EBB91F0FD74676DD5E5C880CC9531A26 -D0256575BC551C3CB40BC4382B30302AB0B891201F818BFDF6D4BC88DA3E4CCCD97DFA0B -C01A7FD9BF8DAA71C8D18B08E213AA8FC7ED8E3172F80615EB510FCD5AC5D508047BE71E -5C0E2F8E200E2BB4A8BD0C4ACE1D5CDFBBF09C74516F09AD40BB4DCB48310BD33D28B81F -B6D0D04144E925C43A7CEE48D7772344EEBCF29D226ACACF8E693C74A0C11DA4177FB477 -6148575C305615CC381612776C6C6ADF8A92408F434717F365CD54EC0507D77032A1EEB6 -6478EC198AAE86D1DD2719CB3AB7A34757C07DAC27ED8A2EE44C55EB3F7074DBC98738E6 -175EBE6393151DF9EEBFFA3B8F5CACE947311B9CAA3C9BD0FB3B359EB30A910D2128D437 -E9216956AE6574F55D25E0E5D8A8E0C96293CBE723960A373ECE00A392D78456EFD6E287 -D57562DB3BC3D2A7E767ABEA1D7231C4888B7F7DA7DB7ADF3EDDA0815CFF72C4A40E6CB1 -2D55239788BCDC55F9F4FA9772782128F15E16E71F33F6C5B75BE8DEF23D8B4E0DFD8173 -879DB3411147841801D556A6390538919D7D2608F5140F564EADF2DC08DF0AD03F8C126F -FC49829551BFBF7EF652359414F56CBB309705B39D719A5DACD7401D6AB251FCC278936F -5A0DAE9A899AB62B9A33FCF22092DA0984A4BBC5C90C6F0448D48BF510E9FC8C9B67C447 -1271E9ABCCBB65A4D92DD146C910AC34752CE16939378F0030039D7DC4187B66257475C6 -AB2E3883693090DF350A42D3ABEDE7E84B3EE9187FF09775889B28DF0C1F289AA28E9EFC -ECE418B40D7AE3EBDA065B2C1B0AFEC58B67199E52E33FA3A305708BE5A2B5C88795617C -DA1EF1314095D09920B6EAC7FFE58978DEDDA2F17E598278DA325949A4C14C5C0EB76029 -1E325DA7F4DD83F453B6DC912C790EEFF754F69B308DAE37ED42DEE308EFE13437599F15 -406532D885197F621DD87FEEFFBC70BD47AB8FA0FAE972242FBA4F7A7F09D01628F87645 -1D3A6B885B11F74B42C8FDE4DC02F0E677F0A7132B751720464BC97DE5BD08EE4170E7F5 -036BEEF0824340EAB34A358635B8279825717994AE76928D15502BBAC200294388F53B1B -C01EDEBC38390B986B27E68AEF3C05883E851BF71A6EC8A3DA59A3767D40005DD98704CB -EE22059B92062B96273D77BA9BCDC6D856102AC322CED73033E6E86DE0CF2B015570C46F -9BB93DD4979472A4BB5DF56ACA2F9636B6A11253421FA471BB93A5561874B43C99BC2EDF -333511242334B62A0BD58E9161260561B9CB3CED25518A3CF7691ABFA61980BD4E5B6FA0 -7ABB135421400F7086EB0C4FF44E220A7FE7D92A159BFC63E4D01700E719D56BB6F440E4 -142852FFBE5ECC6B6A1A66D20C7F07A5AE5909685A3A71922C7AB0D1C18A27BB6E6044CB -B8D2C5A86785378EF5CC4167479142722523E12132F03E5D408F69CDAAFA5C55FB6E8AF5 -8EFB0D41B8448A2E30C66C99B5524AF66BC0F8C5BDEF2B8F0877C5E316ADE6BF0FC19DDA -AF9F915CF3119AED62D21C33DCE3F7EFAFF5A7B0CDC005CE387D4B16C6030F751DF94863 -99BC7E769FAF52EAD494C8154AF2CA80A6982C7F5B2206D9D4B39B6E61956ADFC144723F -99BA540F0C9D1DE18921A04A3206DECFF8D04C727FC9E88DEA9C056E2179B22AD2607017 -9A901B66146D0951DDFD1B9E384EB181D7945A4F83F2A06EB41A2459903FB0AC43CBCA77 -1F62A2E9727007042980C7FF98F349CE0CDCFF6F3447C3AF2712CA82D6828DB71C48A1EE -E331572A4591BD9D3FA077E2F29D0DCF9C68CFE2B6A71FBAFB0E02C241582E09E3C848B2 -CB8AB75D633C42598FA07F85D5EC3F577079CF2F0E68162E66D83176EF3B23291D741AA5 -77D747220835A8B966049F3AA22CFC0D6B1F55EBB917EF80B50487FF81BA7ADDB90CC430 -CAD43AD6199CF4CDE68193659F7E4860F259EB99B56C0E62390597DE3E05983AD165982B -E8305FF7E77363A9CE624FBC98626C21F6723F61352E036656B96277E783D4E6BD0EDF58 -5611C8D7BB3132B9E7C21B65B6EC5E3BF908677F6A5C5DD76BB16CDE31232CF2DD3F437B -BCBA6901A99D9692EF82FF0F8CDF49DAB5A947DC27007F604C3D2CA84455F9F30A75BA00 -71B9C36D21B4080D1C9CD31712527B8A6B5D6C39C29690E92E036D49E186D640E2F45673 -789BE4F96524657EC01BBF37F792212AC8688FCB572D26D10ECB727A316DD79CAD673E6D -2897D77D5EA7723E541C0BD23F4CD3DC2A5B9E2EFA15A024E825CDCC81CCB5B588CE4B18 -1D6E90D3EC7CCD947D371B98CC18A30C33E90EB7A5C180A6D500758CADE6787D5E89779A -067C2DEC491D78466EFC113586C71C5B7E2697685BF5AF1C6806BD2FD63DD7A5202F3C50 -93EC7D2C129E0C3A8CC8950CCB2901894B1233AB3F71CA25E34BED65930899A695EBBC51 -2F28FE435C99ACDB6CFBF1836CFC762BA9FEF40EC118CA6B8ED46BBF94082D4CB52FA712 -397BC0C630D77283AF633364F319FBCCDF6756304CB60B8A14AC86F62AC180AADBCAC4E0 -077C3299BD7486A05378F35430E5E1FB84A01A7C4A0B48DCD72BA02699B8087B5858C7FD -A52A85F08BD02409CE14EF70619E0D344612BA9971C830A0FA719F6EA5F3ADDB460C1430 -4A987565651FC9D13B307E48B7BDD9EC6CE1459E6062C2267D20D5D17992A4B84027B410 -36DDBAA9670152215FA62B5054356BDFFFA7F623EDDFE2BB20A935AED52A2EC844973BB6 -BEB38FBD1D4B21B9D802569D6255049FD9175DAFB66E7FB6E30170D872BDD64BAA1B16FE -81AC65EE9053D339A0C009DC5364D958ABF3E87D38A4E9ADCE9037BF4FC62E8D3D1812EA -8028CCA0852526736660713DA8E3B4C0CF2940659E8BB23F3B553D4FCD40EDE971697C27 -E41F2A6C0C29139B2209D091003326D69A2F081AC4B7F61BE46AC6662574D463DB86338F -40BC2640EF0CAC42C1DEE896C41DC6DC5A86B1A0E5CED10D826660947B11AA1E9AA44692 -E63082D4527C7CF7ABCD388E7ADC0C1EA3E4845469B19505F5E5FD66B65C50F9AB02BBAA -73B8EAB789D7F226365500A2E9ECD9A220BE7BE3D04635E9C95CC1196749F6B07151AD92 -12ECA4122683808000AD54E24730571C9BACE4A563029DB9B921CFD536954CE064DA5D1B -B49D74C55D08B1753124965A402A52188F44A14D9C28449C665266E999D7605E719175C7 -6070B3A4A28B6ED3513322386B2B65689A4B65788A6BD0A869468B4F3544C6E6E6ECE246 -506B988CC39625ED5148E0F620482A198DFD8CDDECC485F003B7A752B1B46B00DE60FE76 -D86911A37A0C26EE72968C5783CDB1744192EFD434CE8BF0B1C45DCF7226F120E85C800D -0C97EFC7159B9CC14EE505042F371750E32F98485337BB26D4BB702BEDA217CAF9F0863D -733B2406270DA91A556BEA4D620A8155258DB0DC3C11EBCE82561957B2AC8204DDA993E7 -58CCEFA6989442B696635B7D29AAAE8E14396E72F838E305E79F25B5AD19D4310A368419 -E3F773930F2D6BAF2C8DAC2F2C7F3420594BD9E1AC2D6CD7A185F7F673984ED76D18B836 -388084525C12BAB5BFA4844121E86E4C747B283ACA5C61E672679AE73940CB44ACB61CD7 -18DC458AA1CFB314A0769445D0D06EBA26549A4EE1AF27005D27ADDADE65EF1FC6EE7BDC -CFA6881D20F2B22972FC4357BF445008069FC6AE550B2D9BA16D565667364E1800167E33 -0A36ED921DDF850A3F993F0B00B1C378004CB008A631D30FD498D676AC38783DE7103FE4 -F314BA9168C19B0FC49363EE43704A9A119B360B5203EDAA03E7DEE736D7E6E94CB80CA6 -42C856E2AF8D68315141E7E9E9F63B48A9F3AEE965F0B62483F3C5AF47CF61DC4EEDBAA9 -F70846E660A7FED078BD46445CE45ED58C63AC224AAC16885D3F4E3F94F0779E180693E8 -B4A15469CEB06D6ADBC5DEFD221406A8C48B95A72303F54DA54B745B504DFC5F522CE50A -EDC0D27842FDE517791D8389ABF07F352EA4A752D4DB20B50CDEF5CEF9C6C8EF510FEE9B -F1737412D9CDE528A66B37A4BB9272BF9C8292BAC9EC2F66E730C3D038E981638C503993 -FF43DDA2C59AD94337CA7B45FE8C270334D4B330682344E372B08A09BF9AFCA47B68656C -1428369C660EFF4392C79DA407B29373D09D4EA1157A8A8D1D81D38034DE3E7272DB3525 -4547B81EA3B0E2C89E60992C4E95D17968EEFA64BF116B4A9A2C0C0B242DF6A571CCBBB7 -6A58E80D84D48D18C5B2F75CA84A7B7AACAEB5548F2A13D95C8918C4EA6C8087F866DF76 -46538BDCF0B13A918A64E00AEDC53F222D8BA4AA75D90121FC69AA03E8B07E1FD92A67B5 -02B9BC301225181043E987D5930FC2E3C77553BE300959CD767FF441D019828837680A8D -DBAE996F1B3739EEBCA8CAE9AEDCE3E3784EDDCFA86EC38BD460F979CFF0347BBBD36DEA -F8DB645DC277536BF8F1BA745EB4A2127CA7B71253C6539A31299156F12E07E5C9591C45 -0C0E804503F8F4520C9FA55A490F6C827004FE2413123851B780FF78743B72C9E1499B81 -77773A6788D1101D8551E12C46BFAAC185F7B6C9916796B3A351DBACF4A69A515EA1F765 -67B5A62DD9D6FBDC9574F8CC8DD20EC6AF803477B8C78497EA757DB04EEDB5F3522B1CF2 -E4EDCF923B14A6E4AAC3413D841EB5ECBA4116CE6549E55BDCA1DA667AE75F9626998ECB -5D82C4D207BF45C16A728847E952E8200194A04288336F8FC2AAD5FEDD5D17287B77882C -42E5F956B9DEEFD55ECDD8354C0CA47BC0164B2294C4B2DED139084B4C1213B74CF02E17 -C4B43FFC034A2051CFAE1CF99D72492C567A750C704AB26AEEAD7A06D3D98616FDB0C0E3 -34D99387EBB43874FC89A225720BDFE02090EFFF13CAA7EAD31827B6DE1E98E450DAADD1 -515D7A65B28AF7057C7B26720025A8918D1A6810F2147D64230FF7925FB42A7AE373C210 -5C99311C02EA1B33361D538B7742BC02B68E238BB4B62A4785B27F071D3F1AF43BEDEE81 -F7717E213F352B861562C314EA8E03B8EDF986E488A1664547CFE7A59DB4B657FAFD0DAE -15ED435D89355108E44135142B60C2FFBEDF32F28DF01F02F2DE4C3C40E95CB0D8D64E23 -672A423743DDBDD3AED5E910E634C9BAA69C8F6B33C8D0DEBF5FA56D7E6D51E7EC3A8DE7 -14DA3A104DDF5FBF10EEFDF85520ED2B71F11EB46ED74F70BA58146EF447CF88E92D99BF -681D3DC3DB4AD32D0915FD7C458D3AE35A060C59FD3A8B0B7E99A3A7F8978CBF381A6235 -D7534A4D11472936DBFDCD33844B8E36205089FABA95BDADBB0B55F9C8814E5F283413A7 -08CC3D15F487E170DD7DFE8C471FE85C06383D444F65298EBA6FC3761D7F8D6F18916A16 -EA794043EFFCB72B5837672E8999904EEA79EBE0D3464CB48E9AEDCDDD2FD9CF7C111C57 -2C280A48DC5B83052ABEF370DC98EDB610EA5E43C5A9A8BBFCF10917003E4E25943534A0 -E4D281F2CF61C6E7C0C10AAEBF23B7CAB563CE25555B82462A71A2D0C511390117AFC3D9 -3C948C1F37F052C17EC23E87B3B43B4E874A723DBD01DC97602F498A1993D8E6A5AF7426 -9E487DF83C45F7F9DE891963DDC7099951AD3E59AC9E5586AFB026A66E6FF8B3A9DDBC51 -79E697BA2B46BC285AD67722E8087F813B774AA31E66BBD187AD9876315619C33138DA8D -834BC729A8948E617CD7A4B802D0F7FB484807D09CD337097462B9690533562506B7DC80 -7CE404B4A1C2899535B13540A75DD666E1ED18CF75D95A3FEB472B7A596A007455682108 -01948D18DF7E008D8086552D5F472341BEC1A3E2856B445C0099339B9FE2ACDCBFF172FC -5BFA8A63067E9EAF13AC8D6F0FEAB24FF4E326A252BAE6F48175927E7D45F2A84CCC0AAA -1400A922DFBB601E2129A649464C417901D7EE4B66B91A6DF5B787F9B6B758E2DDF58724 -37F4658116E04EFACCADA54863E874F314AC25C4D10858A2EAF9687A4C45AAFB755251B0 -E2A298855AA83D44F254C832073A4E065694BF538C63CCC8CB0C3AE89663E24906614A15 -2DB4E4EC5FCB83A229285C1CE0B52954FB21A166142D8F82B60997DD39ABEDB4D3A8680B -8BED2755297909B1D66724FF4B556FE99D26C655F7BF055A529562F4B1DFD7A16166CF1F -75606228E96A320CAD4C2589BC86C4940FE50CDFE12BD5EB50A5A2B0223A6358FE07FCD6 -C791193E83A8B66766BA2F2E3D15E3275C27ADF65E2088D058082ACD6B7AA272B26967F1 -7606DA71E7CA51EBF5662FB025419DC26D155113947B966933287A14F066AC40D7028A08 -07130DA33A7DFA24144A05BFFB1D979252E83F21A493F7149C33D7508523CD56C09F3963 -322C64BC63B8CCCD8FE84E0DB44917107B6567579983BE44F73C9E524F44956C93D85975 -E4531A3DC0FA9CDB9916DA0432E4EF9C48FC9FC482BC9744F6D818889C4B5D0B766D2243 -B50B9EA3F0D20DE6A86F7D0C0F4B58E3B526C2DD36E01BCBC6EB8364B15909C335D8FCA4 -7845F72F203AE4FE8F9D0FD1F1364DEBF7EF7CB08D6BFA764A7E79B9D76A412D879D2709 -0F4D54A848C5EFD424C553A5CE0486D29AC6F2C6B372DFE8DF265097F184F2B88CB3C690 -052719F268460D78153B97D77F824C82B466DAFF2630CB263115406B8B91C9FE8E9AE54C -A2C96C85789610964525453B9D902ACFE6EB379887C72B472189B9E7CD6033F2E57E9C90 -206E218B9834ED77760A12FA0A5A6F86D2C226E1DDA31A5CF2D0EFBC4AA20242D662A869 -CC6A8C5E4B3732A9985A2BC6DEF9A1FE49309CF5557695B66955CBC49938FF605AB6F57D -CC7D570CC84A8F10C50D2DEC2BF6746CA9F256725BA75D273325E24D04AAF0F2DD9AA3F5 -F282773B5CB4B5DB26ABE691245BE7A3FF07C4AF6817725B03419F1B72068A5EA81870C9 -93E040F4BC52C454FD43AC24E3A7B909582F2AB3584FA66031EABC8CEEDB7DE30D3FA311 -A41DAC1CC909AEA330FCFA89BEF8D0D5217172BE25BCB3DC180DAAC52B9A95E588ABEE17 -105E3DA435AD2698CF07035DD5C19C8DCD58480CCD20C1FF529D37B5BF95716DD5B36F74 -B58FE28847962E7C3E2ADD93C91B529C48233EADBC2668AF421CEAFC5D8C65DFCB6493E0 -5A86E7A5CDAC1CB839DF0E099E67A2F8A7CB966BE497C573A5506AB4944AF2FD770F5834 -ED14B897BBAD1F3218007AB429C3250F7EB284AA16149DE1E6B6B540B5AEC33C4BE0A12A -11C3D63B8574C6B2B4155629FC9C13EFADB572BF35C2939226A90310A067B4F47A8719B6 -63035EC0FA87AB6FE5515F1B1419C12F06BF3D49393481B7F45534B71FED5E1B8F8B6480 -28AED0652F5C7FC254C25858EDCC0B92C6E6145A8DECF4CC54C822A6EA80F62122A58FD3 -1BFC6FBD5DE46F258D4215FC361C0B8BA50E3D63E7423EBD6EBDEF07696D25A6FB25F44A -5D747225006F4AEEE6EC177CEAC8DDB0A7D9F536BC69B59A5AC650AF57F92798785D44E5 -79EE905CB999C568B7DB553BD63184F22E59FFBE661535B35770A1EFB0F6530B455DFC54 -1A4CA7E19136D9F3ED1A7C8F58752296CF5232C45902E6129AF4380E677A74D06E2A3A01 -9C72A32A8555E52F5113112FBC4A2A42BCE68F7F5484D650CD206B0787C1875E7BF15183 -3FCE25FFA474F67497605D6C6517BFF948E873E4AC2BDB6995045E489D6310C22F6B4582 -906FB0A5484C4BBCE8FA61D80E4277EF0D37D09B869C0A174B97BB3E127776A0FFA4D941 -B0BC194C78F189369E13D86645749416506452668810DFB0B4011A40E60CBF7CFA855CA0 -F36C517B959FD11587B9C6C6EDA0FA01FEBDA786B36F3E21948F878D6DCAFA94E10509FF -5F8DDF25EEE7CB8E058F0BE6FB4DA87C28F225763AEB26BA7BFD8A52467F096A759F4379 -C150E63BBE70940EBD573424ED3559B16F83D22068E16633D95A0267E18EF9391B9199B5 -80A91B7A74BBF60CF13E4EF71AD3FFF9ED5604D73BD0C5A15812A439A3FE6641F2DE8B52 -EF0BC70B7693FEA9CA49F93525D29B037AA40A33FC2199C3F29139FA63408048F29B7F3C -6EB0CCEAF6C51D4AD842A315257AEFFEE6D5A02C9A56A144B0AB2837402ECDFE10B85F84 -88A87D9512E0FDA5CA64AB541E1BE99C9B89EFE7D3F17874F7593FDFBDE867653562CFA9 -C06BC81560883D1F051CFB128310229768A77E87DAD9A45810446E4E116341AAA3D4B332 -68322B7DC8984E41EAA6826393C2319424202AFF4928CEFDC24D7EFF4B64533FBC25164C -E0083FC7DBF81E663C4E1746A7A7E4D7C0EC4CB4D9FD396508D6A96CD400C85212F522CA -F4F6290CC2843E2B632571FAE0ADFD99A7E3F9831B0EE07340BF0C7D6EDF95DEDAD7D492 -DCD83D871ECE63ADC0A50C3E76E5157D3872E0F78E036B3A36459E78484C9307B3DCB831 -A99D9411C1CF4EAE117D651BE3BC04C2AB067E512F0F89A566F275DBBEB231DB42A0A197 -C301F33F4E65EFDDAEF015999BBC1FB75E1F6A7925D3E2075E98E314BCC10C94877F0B0A -007708984B326817A532F7AAE87E026AA715FE64373BBEBAE99A0F83CD0C77173DB845C1 -028F25015FC3DA0488676715D3EC8D1149A90AE16F418218404CC465D4EE8BEDEEE36F47 -DFDC27D07FB5F4EC0BB8DB4601DCFD54A2BE85A9476000D20181311F5B6F4111CFE1A850 -DAC7C23D30B674627F1A852FAC1F0437D18E6B3CE4FC7911FE7255390E0739D2A83DEAC7 -02185389034889A8A437BF74BFC3A5BA6BB8735A8FEC009D55492F7D43C5C6F92E469260 -4723A88723FD31B20AFBD42C150EE51108B05E8F7027ED40735A1D63931FD3CD5833FA1E -C77980CFA0F7A8C47164639255AD00AEC0764BAEB2045025B7C6536309CC9A38291A1F6C -141D1A42F33BAF14C5844C13E8AFF8A7CB4AEC72E6039A60CC67F03DB21AAF2976BDA0A3 -9D92A848D743DAAA36C288ECBDFB46D53E958762B1FD0F570F40154838506B656A081473 -18FF01FFBE5D17C131949F5489E4C74EED3369A496D05E0C9256EE92D3424E95A30485F9 -A00B0595FDBF84B03BC9672A4816D2D290AD1DF00E54C668DFE765D9EC28815477D7FB69 -781C0A050660946AB8AB1E29EE5ECB2C1A272591CC48EDBB5EBF26D765E24F5CF4BF43ED -17E5BBB55C55DAF106C46E4D8241E4AA01AF7CCF79176FB4BEE78D5299C313E2DC300237 -D1E149743E16081CF124BBCD7D9325125C9C9AAD57E86A94D18CF62D4E0785F820A9B7F9 -E3AE3FAF0F7DB0262BE9BA917540B8CD3421643A01CB26F81555B05DA466F1136A7F3E80 -3461C2F063ABF750BC814579689D3CAA094035CA96298F7F264C6546143DA15C6E085DB5 -2065E8ECACDEB3ED4FC0D1AA4B01E3ED36211DE438DD1B3712EC858D66BD3779C96D4994 -234A8FD8C1340CA9EA51A2750A6B0C65EE1C54C321F4D060F7F5F07B49C9528AE0A1D45B -5549FD72B0A15BF903B1F70B92458817DB0FD9F1731E82885835A717B0A1304BC067338B -1638D51E99D5C23872D4CE5097B89635C3BF28D6D2FC96BBD80C26BEA1968B8A59C278A9 -8BA49B1E59E3584E54DA5998C5E70AF167DAE2710F7656169647D2781AD1C27766703FC9 -6C08A0739EC521182A77410F2E2A788B47C745B4B0A2313F49AC8802EA461F04F3D54FE5 -58D2B21E9348C19FF519939154AA3ED07E24D3C15971F380551408C897D618749CB38BAF -625434B73061407AC05E0D7B0885791153FC0AD5C3275C03F528FCEA3BE91D9CA9C3B402 -3C931D467854D68DDBC0FBAF70D38365C0C76344472A876E74C04CEA12DAB0A55E776BAB -CAEEFE1CB7E834BEE48DBC155599C4A0BC00E6B8746D7D0B9CDBABC463D8E2688F46F126 -520ACADDFAE65101EDA0F523C6B9503D8FD1A5B9F0B6DBF0C286358D92FDE66720F5AF47 -CA87A0B6E04E46BFBF21EBD5CDEA194B6425B5ECF81518178E0259E386F5F852C6870E7E -034582EC658F59C2E07428737B36B77B9AD3BD6D28EB1742453C5D4867FE879805A80331 -C6E52C0557E5D036DB1EE67E7274AF769DEBEB23121AD503E3023A8515FD5ADEA11AA020 -2BCFE0AE826A09874CCE19AD2A2A188C7331127751342E542258D3996DABBA1B6DF80323 -5B6A223DE4F193B862224F807F99C0749994F0C72CC784AF11C411D34D649FDA1C77CB0D -BE519001F9E757BD8035A0C9AEA86609B71A4622D5C78589502CD2DD58709544A76526F1 -603F205AACDCB62EEF46D9042A2C9E76B887826827C6F22D73760CDCDD0FBEB827BD2E1C -3B5B0726A08DD2AEB614FFFD02C36F9E8B404160C909B70414BC8DE600A5D56479B83015 -9B8E61AADC8C8AA077816ECB6317A9B16D30DD8D4499FFAEE87CE97F72453A37D187D91F -A0C29A65A8F9C88ED22CF19CC0B40324449CA4E7751D77A0D76669AD420216EBDA92CFFC -50454E7EDDC5C4DAF66B67675B576ED2C90EDD9F8182589ACEF1B034D2F848D0CBFAF84E -38B7C42D2670D0A5E382FA11AD3F2FD6BC79EA02C074644F35842D1DAEF70507A361A0DA -03F5517B789C5684461F698F2FB20A7801CA9EE12981B5A793A481F48E33B596832AE4EB -7AF3681CC464F6895127CF10D14477611CF8AA88D0F6888225DBE342A708BD62EED4FF31 -CCC1ADB38DAB151C94E9A1554980B3C077683DCC0513ED4C55D57BBBA0ADB8A5E79A1B4A -BE43C703948452C44F1734F1C433797315C644A8E76D13DDF5E0296143F61FAD14E16ADE -97BC12ACC5DDEE482231A9E9145E69D63CFE889A1BEE0907362C60ABF581EA8541E36ECB -30457098E7DA18D6FFD57901AEB7913C59AF691D1A1FD3DF485F7EE669A5915EABA6456F -955F2D2F7D56CE0E349EA743B3F44ED555AAEB7F2A71711E08FB67B9738928AB842F6111 -2B9126C7474753CFB458EBF75D817175179B3FA956F1D998C52FC9CEC7217440889D0481 -CB91C8A8D1D1C6967964C7DCE3D9EB0BE6598DA5708DBDEE4EDF76CE91E128732A8CF56E -C8BA08828E9B270A818F98FABCA757BF3C3855C6DB448F7A4A6853522F7541D46AF3818D -B905D64847078757E0110C0BE6AF4BFF722FBAF5D8A4138BFFF94C7678A10F9FD850998D -B710D5BBF763B8A70491CA4D53124CB95A953B080CC31174646AD474BBF5BDF057A1186D -B083E6E762C669E935A02D60EC62FB71B6990D25BE44E949C85D1582611D826197E8F617 -CF2FC506489E59CB380E2ECA368916347B1E1B59DC1AC765676B904A63D7F8CCB1F7E2B9 -B8290B30E53B28F6FBF55D191BFBCB51F3BDDA71C7A9B1152F686191B0AD05FEDD3FC37D -42AFD7B3021D255DB7A00E6C2B3E714BAF7E61BFE8B7A88BD5B6EDE4C1DCADCC30565AFA -1E2458F35E44CB6F7228BA384CC1B7A64CE912998D42572F45A30B2C4F919BB21F66E1AE -6C787773E419E1AC1AD41A3DDC044C1BEC45CA2D0382A11C1543683F9DE1302FEB0C9DF1 -8BF8B9F0272132E1CFEB54E38A8B90C3F5630A3EF083C73C4E83BF0C312F09D5352F41CA -7C8EBF842E7F46F3D97C4AB03040640B95D465D50789EFD68A12F1A450AF35844A7A2302 -3F25728A85EEA2D9D124C4B04AFA44205E110CF923A4D713552FFAEDAECFED8898AFF89D -BB682A961D1F815C3F978B9C190006959D4330D772C884F6B0C77B2D1FF722DD86448C76 -A68AF642A08994966D3C2836D7063A59B168AABF47179CDD6D6F902C601A89FEF38E5A69 -9753828649B3470B5A03A2B58AA910B758ADCD5739611894DAE786D5AA005A5826DBFE38 -8B0F4105BC76C0437FEE9CA6C861FFB1EEF6620B7562B44AA0D29D1DBFE7B7954971087F -E8D291A0DB5E4CB0512B104EA6044CB75C099716AABCB5EC89B14BD18F5D1A73E9A8DF5C -A593BDA22FA28D8837519C38432667684C7C23594AEA6B39E3A819B72A00652C205B02B6 -F8127CA0C7381B8D433B86E6DDAE2ED9482345792276F4604A9208AD8CABAE8B0A0BD0D2 -7D0D5955C20C6E4425E295F5AF9FCA7DF682FBDD5B8B107B5FDBCBB0D751B2D2BDA99314 -A9CC66F9E92FF5048E5A6AE2B8B03611C7000B0903491DA44123CCBBC67B1D4086C22ACD -08599534BC98EDEE0A73117ED20679CF3D9ED1506774C67526D9AF3DEC36B9FF799479DC -52A70429F79C8878509E8DFB756BDA3D76B31B9BBD77DAD3956B1D951C157F02EDF252E8 -D02AD799A9DED7B38B352FD0841B96DAB3A3562F68178448DD8F1F5FE40438933F97530D -0E6C918C571B921F9F7B054B798CA04426237F4085044F7395D0E4FE3CAB961348D11912 -E5FC311138A82F470FF3C8DF00B1B0563BE81C25AB58E95CC392203F9668BF187DF43482 -BCEA0456394E31DA0819AB3E71FB8E02FDD90E05A39D0D5B4EF919E958B862C3A96A1275 -F66C689964B85C4C60A9E6D44EC9900B85245C8CAC2847882497A97043255228B8C29529 -12EA890FF254BD8C584126DAD1B2AC1AACF528564883F0C15C41A8749EE4AEF5FB514940 -060D3397DDAB08DB2113F942B03375B4A2AAAF9501734C17DC220BC97E367C2160982356 -2ED3C739164B659C480317952AFF044A4550DF79113B4F7FDBEC7B332EDFCAB7DA5B4AA1 -469479B4490EA5462191AD1B336DB782BF7A2CBFD7D4B885E2083110511FDE57459457D6 -68D29B1E31E734B30E4EE6AC28E8D74A2DEDD48BA964776BECDED8A86934A88D60A85279 -9E9C65EE342F2555ACCC0E47202CE451274D76C6FAA943BDDB5C35855499141FA589F452 -C5F424280D5863C7ED7544701C4B0660AC835D58905E458947DC5C220540D1FEBB4F18BF -7649596ED3C3F8D76CD146E5B5995F406CDC2F8D1D0D7CD4FD1BFF5907BBA5AD0B475F85 -D4C75829E57476F12E1315742C875008A96A06A76627DD694E1EFC09D05159B101C8613B -F0FA5E027B1C7F089D07B48BAFB047E4A75B101B417F82FF32BAAB877D7798A2DFA48A40 -85C47A5DA67FF503552D60295D5C61803C2700879C685494886505DB291413B22C7CDD3E -9C36F74A88E53FD9AE6E4AD73025C80555094DD7D1A171A1F85833A390793DCC86DC25B3 -1BF605ED87669F1D4D44FE035636746A80865E4320BAB50B42B6A6037B1A7134AA8B42F6 -4A85B58C318E600D80E892B337786190C009CDA82D95786A6F723408E1F79C330221E753 -F1A30D90450D9FCE6539A7E4B2AD69557746FDE8E4E6207FDC9068C400244A0CBF276F84 -A2286A98A9B4A60457D3C1C2B1FFBEBBA67DA76E0B3D1027B914755CA8152E1CA4542714 -9F709EE182D12B9D653D960F7242567EFE61643037028C97B19D96BE9F5EDA4230A329B2 -78CA496D0C8894CF6FF8A410AA93EBD0F54CDA812CB5935DAC06DC7968F1FD4DA26B621B -CB0C9FDD45A51E5043E501E17A042CC421E80413C5861941796E1F0213C02A968CB5CF10 -EEA25AA24095839B12D6C260D99B5C42B65C40824D408464B30D6F9E02E8686294CEA8A9 -39AF573CFFCAE51DFCF51D229D3753F144CBB1ACFE9253F5E36CB4199CB5768E6E1CE224 -396923C6E1C9B1ACDAD64CE0DF19C102CCBE2F7D206EEE22350016B1DFD13EC06891C41A -353318C8744A912692209F590799C99741F3656DE0110C310E8F460C3B94C7F5EC4598D3 -786D7C297707C6CA9CD9AA80A18141C9937EA927FFD3586CA76ECA5E5335DF22CB4AFBC1 -8DAAA401CA2CB71E1E97BAA78CA4D1AB912028138B9901EEAA6E17263C540958263A509C -1E3C266138BC36DFB2B82E145C794AF0606D7B9724E40BD70E3B83D7B32E32E0BE470279 -C05473C3649009D96F47300ED3668B9F140E65746CEE1DEEE623734F93E1C309B3F5E5BA -EFA93C4E96DDB8E14DB661CC2D23995A845F8916079EB740DF80158A8740C15DE4B367F8 -85B1755C69254BEB14DBDEDA5279C0A4BD93D43B940AC1AB933C20EC96B8B833DAB56BD9 -15C46666D22E72B629E97EB44CD41B441F6E079E40FA868F3D74CE320D23402BED7C4A49 -4468869683DD4BF0C4B59BECAD9706D091FF749B749DFCCADAAA2907457760A7A2269285 -F31D4D815E0AF703CF9A0D671F4637881245B134D4E25A8DFB7E58F7DD06912E6FB27CB4 -1B137208E30C0BF65FC3C078E9AD98BA6A46E3D29F035FB6A430964B84D9CE91A03F6719 -614D8F12760A8EEA1999780E00AD8FEE24095D7FEF3BD669042F0D03010814916A66401A -3183CC41D8EA4423A97EFD187FC1D832146031D4837294C35EE6E1E0E8ABE8F68CEFB5D5 -97C10241B7D8D83F281221F1B84FBA400A586364C58E1B611CE0E2092E0734FA0EA881F4 -2A8E82E9B02C0A5BBB21940EB06554D01940FE87BD2BC7D03032646D583028436B495E6C -A8F58566A946BD076D693177F13DF96B3A43C1650085A23D199A4773C717DE2A19BD8C46 -C0D6487698620D89A1A07FA0205D14870AA43C6ABFA2599A84AB5CDD18A66F6540320B28 -A1A9904402F62213DD74DEF28E2260842BA1F5ECC26C2450352EC67BC2C956C325B1F996 -4051364A7592346F0C28DD2C52BA5123691B47B857284B4862961504778C8B5E06ABD1C6 -F37E2343C185BCB458D42DA166D9479F8E529BFAB0AC782010BE8E526F5E4C17BF9A6BDA -F8BD46522BB6A877C54ECCE890C389FCC576B605B65C7D17A483FDA2C826A6E8F27915FC -9E006666AD30D11B31AEF6DD8BB9FCEFB655F4D7DB73767FE1FACFE15CEF7FB27C3ACFE3 -4E761F9BACEDC1CDEC22B0F50619FF7AED2689F2EE768CB0BAFB857680B15D9CE8AB0A24 -36450529F86FE3A7CCCCFF0287092F18AD672F424DB6EDFD50AE8EDD481022EA1FFD016E -E3B4BC8583BCFB45436471B5B4340892F390E061E0F28B4019812B0CC299C3D70151F87F -15018D49097A50B1EB5B90A736ECBD060A802A30632C2A681FF14E1ED5AC77726CC1B76D -378180CBEC15DEBD4CA283F2441B1E02CF8CC7D91A212EF2E0B1F194C196D731EF43A420 -2E0A1BAE1C3C1F060688BCEC9C24B07984F8EC84242EF6660E7966DAED4AD845FC859DB0 -71F1EA8C7E9E5235058EC9C42ABB815C699A883344E95504F9C5F6BF340DF54AB9BDD438 -B8D63DEA04CBBCE565E3D78B71C6E2C04D4E1EA83DDB824C8AE8E9CC621CC1C75906F900 -D2152DF36AE9390162C3DDDD20E79F9402FFF7A1D66377037D2A5E8F9E0889F55C711DB6 -38AFACC568A1B4E4EA06E3A3B749DF4026A0EFD2AD56BD458D9A5837F046F81ADB9C1872 -71238A54CDB3290187DB1504008362EFBB553C0167B5B58DDD5DD0788B4806D02AFDACB7 -78DC36578DB5486BFF8FA27ED2705587C3B0A471DC74A47479EF2B7F0D35A77D9683CCCA -F64C5E79F57F96DA3EE6666053089561CC89A0AD22E9DDD5AAE38F6ABDA3476E5BF7EA15 -B4D782E42F6B1E778C9CD33436D1B2B72FE8B01E18E01C6558816D0ADE36FDF34B8D8F2A -A15E028CE59BD9DE568683CFCB8ED3CFA289CDF4525A46BB7B0A91A62491A09821633CE5 -C54994009761A3E6DD30D61612EF66F49E190A2EF1D189D75C9EAEF9CD21E505F9CF63B9 -5B399B25C2808CED1FC3F6BCD950156394711567792045A8C90A10A193650379B5F44F80 -B9D3C265064754B0390963D2A060AAD443CF6C377C6DD81E4B313D94CD22DE546C56CE4F -06FFB5C4D703D1CEB9E9957ACDA546D0B327450F212252B3686FA87442CA18B2B0D2C1E0 -F91CCD54AD769C78D4E719BBC32554B6F486ACC1EFF4C8A3DEC5C359821715C2B64C2CD8 -43D25F4899375AD2011C3A89914CBEA23970C20ABFC55AC3318BB03FE1B061CC5E1C6BCF -B4E5A9488F08845DC4B03A79CCD15CA393BFF66051555DA32B68BE66DB340662F445782E -EEBEE5CFDB73AE4F9864435B828D168F17B59E9ED6B1E4DBBEBED2075911DFEECF1D97F2 -C57D0D5EB64FCDF7BD4F2F390F0182C997AEA6B3D5C5AB9CA14A3928F6358CCE901D205A -ED5C22BC9838128C8631B69B02787A956865F15EBDB937DFBEBAC70381767AA7EF592146 -BE4EC825A96C8695E9DF2490962D6A9F877E260A19362995C03E00B44DAE22F3E1AFFECC -ECF056319ABDD8009FE30466EAD5BFF178E43BEE8445C0F3A4CFADC000CB29A66736B803 -46E6BBA25CB8EDADED812DE0D7962C2C05A0DAFFE6AE2604F628F823659537651DEE00FF -795ABFB6C2FAA5E2531A36DD12AA069E8E0EAD1C6737FAA3B412F97E6D5DAB28460AB7E8 -160E0656C551452575ED47630A545FDFBB6763F61CC4BE7BD81AFD6861AEF0B34044B583 -836311C2BD2F0A5C74A455962A1991DC75DFF5BD46265C8805FCABE04238795013F09F40 -D2F2F7C5D12F251752D938DC7C9BE00E5F7506E51E0EC4A7AED0FFBE5353DD0A6FC560E8 -3FEEEEAF01316D5386633AE96A5609FBA122684608F90C54E9E3C1700ACD31686FAF7BA4 -84AE837057BB3FBEB1B6C9AEE7412A74C5EC366F682BAE51CA425FB274D17C41D0DA1632 -751E2D58CB0837549DD2296065176FEE15365363284E0F4778575C464110F5CFB186E92C -B488958079B3DDF229F4448C19B24023C1EE9F226EED46316480F01DAE2D4A5EA42A3DB3 -85E3668A3CDFDAAB384BD79DF85A103A8E09561B4E826D3079658295512DDCDB7AC7ED56 -0966855109359E217E44805FB55FCC926CBBD27D34D5D1339D9306CEB6BF3468616AF144 -765C64DBCFA2BE91F92AD7DB47DC92CCB3297AA99593851BBD29C07E7011584945C5F390 -E048B582367C97BEDC1B31BBB1D2D8C038C05DD28E3915D6E35ECA809B335190DAB354AD -3D3EF2A5E3FFC5D8F0F7A87A8EE9C6F9E07154919054DCE87D8FFE62E279CC05A4DA0BD8 -B933A49F7FEFD11E241DC1E4786B73D15FABD2915541B9019AF06EA28A1DB0FC3ADDE1B8 -A370187BC285F66D544A23184D17E346CDD21C0B1ADAD499D78EE0258279A8FBB802EB50 -887CE8290DE6F29AB3F6D0884BF63AC982A21682CCA88BBA82A237F39AC8D1EC827CBB72 -559AF2F5E640B1E43AF7448258469187427A600608E5FFCFB50D3406D453D30B830D0B44 -B7BBDBF0A5F00A33A4BA6429C9D3460BD6DCA861970E123E67CDC85ED1A304FCD0C18B1B -19CA443F0B85423F4EA44E0A31DCD363CF59630319D2ABA44E822902062C4194D1B4A04D -DF98F54946C5769EDEA86028E88DADC98D785521AB79728C029FE0515C9BB6DBDCA26033 -1B28F70CE1445AEDCC0E267903013BA6F98A564E6FB70FAD1343200A4E3AFF261381434F -4C8E3DCC87F1482C99E9E2EFC4A0D7352DAC825045D1CB8E102D9FF018467759C808D863 -55C4D25B3D1097317FDD11BA90BED164B5204A40110751287F19926A82FDC6E8216584CF -CB1B805BA9237ADA8D5BED21A89F6628495EE78DBBEC0163316E7301AAF1315E00302F64 -D22A33EE587C3116003CFBE41718A07DC7CE295DF8D7CDF05245C46893759E0F2DD35507 -CCA29752106D0CF2DBC8CCF6ABA8826EA7B0455585B26DCBCF0F598A7DBA8FBF04879EE1 -82637DB44C1FD37E7A74481A333CBEFE4B413D8AB6A3F4DFFC471A611CC70C55618499B6 -5EF14ABA68839AB4656971DF193FBC70467BEB52171F3E140FF40BA1C77BF02500842784 -4A06AD4F0ADE586113BB339DDA9FA72FD99DA3B1FCD26D25E79B28069013D8FBF48897D5 -2B92448BECA722F486F3EF5C751FD6DFD0560987137C75E466FF9F2002B7CE576A9282B1 -ED5450AF132C858CC092E7CE3CEBF5C78E3DE84D130CB8E1C9A9D08495FA3918969D06A7 -8D10750170BC3ADBB4628BFFAEDB8F47A2197D95DB975DDE5FEB8FD97AAA479AEEC667A4 -8DC0D8D44C02F7B7497A394944AB7094F3396623AE275B60F32AE74A3ED40FAC1B465F26 -6A8FE9162EA850F4DE855DC492315E3DB9390000F84363328D4891009B8F10AB08F1E4FF -DFCD0B78719F59B0FEF3F2D7990F388EAFEB85C6F8383D3E50F3317EDD0B44AB566F798F -F7B1CF7C9CD522350CD1D92E56061D508E66FAB2756999B57075108DC7A0AAB4D77849E1 -00B8B7B5690763983245CE5B96853F7E1E90D5807B02C0E44FB50170AD7AFC8CA8229AD7 -941453154232B97C0CFFB5D710DD5B4AF78146FAEB62DC9E73F72BCD539713B683311ACB -BFBC5533E9800939175CDC5634FEF7D7BD135D6347EE83118C6FECD86799534165E063CA -5461B7AB4002D1972C22665FE8F75B4A6E7CD2D868311ACC98E29AED65A9DD734A55E7D9 -43A4F53D0602F79E2EEFD38BA394581DF5895435A9E8FA35DBF89F3F7E00E09EC5858D12 -6D0993DC87BB9331168488F7B12BA780D07450007F067B824CD0D7F0FCD3EF8D5DABA99E -BFD130AC89B20F0E2BFD4F8256D1B4041F90E3E145DF48A61BBE573394B2E70CF92F274F -4639A6910E6E6945DA69476BA89E1CE00241213B739E1C9A0A9B352DE885B04A47B10BFA -4A040533606F2585F78DAC66EA103984E5484A06D583AEE68BD0D8415B0F6CE4505E571F -3A21899D8CE43837035AECF430D1AB85A8AB0080BB31D421FC1818C32CC591417CBB595A -7FB281122ACC1742E7A7B6807AE5AF3F98C94B85ABC8FE8482F5CD9F7A0A18DA819D2A8E -A1841FB1255E3F4DCD1FC2BD3E182A45AFF9E888D7B3D49F4C5272722BF9CFBA654CEE4B -09C0C9897B4495BB6D38B00F0E4CF7891D61CE6542FD8F84C2590C62C47E967790F812E5 -D0DC81571ED64FB311336B154421EDCE032F253098D7360F2079719047F9A47F2AE63CA8 -DFBF90423BCC6630F75CA70936096BBB9719034946F340464563DCA8ED94EAC3837C497A -50315ABFF0CEDC6CB3B7B1C30A8442648734645999BA94AB7EAA67798AB5407CB484344B -86204DBB56D3627091D3709FAAE6CA20AB5733F556C40059E56B42DAF823CD0F5139B240 -7CB44AF4DDC58EB2499525536E01363B4E1A36331838E88C6F0BCF423F70DAA9ED12B5FC -98C606C301616A1DCE9DAB545FA0ECDD8B967DFD1C1F096D242CB1368A7075BF72E12B91 -A953923276693A46023276B9BCD24108A524C40026E305427EFBA8D9A8C87D1AEEEA0AA9 -F4BD27476FACEB36ACE046FD8A5AFE4123B6944DA5E7BBE7C4F608EB0DA74DF816ED7453 -6DD277F8E59F65AEA8541DA98E492DFD48504D645345E957129E2A60FC5BAB29BFFE74E6 -4D66EF0BEBA0B02A78BDFF4CDA36A04C20AD552AA92BB75D52A78745C7B47F7D399C17FD -C56C1588083E04035263D46D90144165184F0E630A4FB68874E4C715A3708E84A8C08142 -988557DE1FE684AEA24BED59A1AF602A04F7E916FECB96D2D2149E71642AAFE15B0E399D -3C66A5944B4B0BA234670AE5D78380041161A606B33BD1B38D9F53A592D3C021F6636731 -6110C7E4DF35E8BB85F649E568ADFF1736A1B27E5B13AFF8C4504230D877FDE932AEFC2F -F9E0BFC61BFA1541A6F2C6F53A22311DBA8A8067D67EC1A240E27F85FC0D46C4DD2F519D -7B72897EA5B38704848B4834AE19C7BD5E19E5C65BE109EB9B02CB0376E603B1B6BD18A3 -CF63B906F8BA66BB52B1BCAAFE70BD7A2A184424DC53C91582F47173486998947B074A87 -B49FB5148B6FF3FB34FCCD25CF2940042E7E90EF0E9DA4B520F123CFDABD3B3CD2DD8CA8 -039F6CB5E379D17FF8C3E7F9F597A25201332F0062A0E6A06CA14750DA000B4570B4B3D4 -859038CCA94E63854AD5DF2AEB672F92D99F6E5B03A8A174D64695141A12F8D6E0BAD839 -D104B24B2B02F83B30910AAE4978C9558D256F12A120EFCC8BBC9FE8122DA3BB72C7A77A -F47200C9C18DC6560B9D3B82AACB581A4F3735B4D2D215CCA7046DFCB3468917E96B6A67 -865B57BD51428A0221225C3A79D3D129B52497ED727331C1924340B127752929C29EEF01 -677C812CC6AEFCBFF1E3D24594D430E0164B6B933EC66A7FD00B4E701657F6766A186BCB -872F32AB18CEEBD3E14574AA775B3A73B3BA7BE94916FEA42716105E6326C21A59B62AD1 -681A9672934A3EE224B4E634B6B4DA3EF82969768B243092A98BCEAD10097659B9264DC7 -E83CA911201CF43984F4384DDD10F5E7741F78F3013591AE7541965489C0CE0B2C78228E -2148182930C04ACA997CB303C5C096147E25E0773262E62A8FBB81351EE809D416F63B48 -615E95245EFAE2FE041D10F0755A3FBED883200C13537A1FC5B1CA14BB847C8BA1049B6F -7CFD9784512E4D2582198F8594B4B689772DAA8EC2AC7969E3B20DAF8A17D36C91F1A5E7 -4FA921F611BFEE1982F590D8BC0613CA86B0338CA0F5FA6107B9CABEE94D143C98DAC455 -F64B2D213C5F3CE2F7430673D5E2224765ED4341D8FD04864F8861369ABE41DB25207682 -C81BFE06C3513FA019456A976CD751B29F4E65C7853DC7E5AA99539926284A316DAAC56F -64767BC4BEDACCE77C7D8C774F0896034ECF9B9E418203D94B94018D126ED69E431D792B -89FAD0AD799A0660B1282C226C03EA2E2EAD24432912D2D405A7A5130525AB9A4C6BE1B3 -CCF9094EE61401F04BAE9CDE3CFB0A0A1D33054F993EF6A6A8F1E026E744F19F19F8DD45 -01199F97E79F711C1C219532B448CCEDB409AA0EA129135C1791AF1BE7FECC1C9B1D89E0 -906EC96620278EF044C18228F5CBB67DBB36C7BD10DA5378224949CB6B2EDFAC66404F22 -42AF5508383B90080331ED71451BB59A8A2B91E05365884DDA3A23C9BA8A043C9A5E399E -5A4350138459B562729D850CAF38D18C4DD8B6F9D8D69402099C0791C82FD8F1937B1F8B -05E3D4E22DF453D2E8CE4248BB5A61CAC9E36908DD9049CA1EAA4E7773D54F9BF82D4447 -010C37DC6CB5A199B0BCA9AA3743592E651B69D1D4BD2563135944545A1DD8CA0B1928A4 -93361DEE737C834868A6CC2B6BA3A44E198D1EC12123BB95103C8699B4B76D7062ECADF3 -13FC6AFB6D364ACEE2091991D4045CA2A5E33C7BBFC82149C437FC423ABDEDD7E4BCA0F7 -BD1ACA371A129F11735758E0E88F453DB813998F91CDC3428B5D8FFDBAC983213F9C35C9 -C6B5B1DA85C0F0FF0089BFFE9269AA245A8F8BA47E373D2AEAF9F492835B1A3B3AD9AD49 -076B2DA90C516B95C8D603B758D285B811C97A3B28BD0DFD924F4F4A6C6B1C1E0F7E51EB -582914400A9B2610D008D43D9623BFA18A64B6160A72606CEF0A31DF88C7ECB3327A0F48 -3B0DBF54F1A02BD3DF36AADE1A65D4ABBCFC72149DA3992CFBF54D1DA3DAC66DB428DF19 -90F4C7923A23EFAB36FEA4B00661289D7FB382ACFBB03C6C82B58A46701FB75E36E1C697 -7026DF6B66554C2C36397230657BFF069FD03DFF9128A2240EBE1B838512F48F1482991D -E0AD6B6590DDB2052564F6798C1BB88C06D53C4D4C76A4BB1C35355468B3C71547D76010 -C8902F5DF9C07A43E99230DA6CC708BEEF6D3E976C07404DE4A1C7BBF11CEAD519AA6006 -EEFD89D2CC4351FC3E72415E8965B1785AD0E29EE59032F6D0487941940FD8EB73B9CE70 -704AE65D7C3E7E30FC066DAFAF38E2A19025F628E7FE6054694D7AD21ADA5B747E54AD1D -4DD57BFCADCDAD35E795A23BAA5171B8081EC9803B8FE6242AB1B421A20C6CD6A107572C -9DA40E22D64E0D053972699180A9B5062CF460A715CF99CFDA1861BA3876047D969CD8F5 -889104DC3CD6A91E6765BD2CCF49F21BAABCCCC6984D5DDC1F872F85A45D42C490352D53 -70695AA4420AC5E6A0CE1C5B72186FD1FDFC64CB7680ABAFFB390C494FDA8852E6523BB8 -E184A625027F79620D9712D570AA5E2DE15863B222F7F5880DCB462BBEC2B5198E005DD1 -17B6867C218FD965BEC790161999B8D27E7694909828261593BE4DCE97FE5868285EEDEF -EAB74A5707DC3C7824C1D4B170F729D9E04A3891E2C90FBA545FBB6F8883C60ADAEFD251 -6453F30B02B63D0438F927ADD8CABC0F78290C5D0433A1C611E4754BB72DB7A96364D9AB -8B698A63CFABED083D9DB7B3934DA6FED9C162D33BC52D95F98632C93A8B6611C5C3CFAD -B32DE2F520ACC68788CEB420269963C96B341D7702F7830FAE6CE78D23A99258FCBC3955 -9EA5748F18B560FBB1557019420217FC3FF9E1F98FA219728C74FFB024771CAB8A1675AB -F57B229870ABE51416A8D5906D27EBF989A3F4C6A94E0B9CC383C5F161B0079868B17D03 -2C992D39EEF4FF295EE6331E26022D098D1753BC6F949C0FA5567C8CBB382A92D13881F8 -734E4AFD1E7157D9ED6DE9EE7DA0B8A08F54B7C8121D9D4A5805373016BE8DAA8B2C20A2 -CCC748F20209A63A4A7988AAC44D829241E0033FE88CD314A751EA836287DB68B32C9F5D -0808946D8706556B3E597F70857C9C1ABC8728E256E9A34CA4D88D08A12AD64C1344E0A6 -7FCAF84A2E338B6734319ABB816F50BFAF49009AD63FCF1C9A4C7889485D7D6A3804A5C3 -52534EEE795E391609D1B6500321D29935FC49B937C061D556BBA407DF6A79C3372E1B91 -9539E5C21B816C060642188482BA31D8F3C4CAF759F7710E269235EB9F47C2699CB14C6E -0CB2DBA8CA246D4F8A4D95B4452A4AA20FED42E66C415FF1FB74BBB434FFF1831BECD82B -23B04ED0C66B5E1CCE3E166EC586CDB122D6FBDCDE2444230D932261DA28CA59BA47B23C -461E0EF7AD3E03C501EDD54727F14196906C9413FEA8E2DDB9C7B955B3A7B83D91DA4BD0 -2C7FD4A96FD70634E2069AD2189A546F0B4FCF0DCB00C0E5F3527A3F0FCAD178C8D2BC4F -4ABEB2250B4EEFBA149604B1A3D2178279E28B7E91E859E110510CD6C87D52E74CAF03AE -69A5D08D4F6A45B3DA591EC6198259C39E4ABA9D417336E18E0E07CFC28C84B466F034AF -A8541DDCFA4038288A6BA7A2503AA194DBAEBF3DEEF9BE93EFCDC351442B48AA8C0C9B67 -EAB4F75821E1FD55E60757D11BA394F8F336242890254F43F598650EE6EE730FA54E7EE7 -AF00FF3F55703D39B2623C7657E4CBB969AA8D7CE187C0119E485E391F57A6A42B2EBEB8 -F22B0F46012D822C8EC9ED9FB4085AE3C5FD36A9628B07B1A963337BA95E1EE89FD3ACBE -4921FAC06134DDBF72062F31B1D351020C16B886A36CA9D5EEAA6470CF5044C7B6710392 -1577D9D5CC9E49A36C30ADF473FE06CAF00A5DDB44475F74152D2E520A1975CD1C0A15F6 -A47893FEC6BC00E1A44E8F6A1651D39BEE76E67C83B735872BECCCF0F907207778C4664E -85C7D637FD201814BBC7D1C6200038B17F75E08B23F4AD0737259F9C07C47556FAE21B18 -1A110F056B1A612375A511FDAD2C291CF389622FD073F292ED09953B11E2A6626E6A4CDB -8B50B8F9C7147114DF64C9FD8CD2E064CD9A3EB95555FB2B8D6E8A4BCDDC54E97E9F0B5D -D3815077F6A825F924FCA5821E78BBB3E493F77CC71FCB3A5D9092453A0084AFA1ECF49C -384A274B9B2CE36C0B1413C473D041B4BE0080B561F7A03F5A1641A6FCD1959506EFE270 -88ACA5283BF1D38901F2E071BBA4B2E35BB79D9CE9CD3B776C7348EE014D21BE0421CBE0 -4026C044120006AE1816528B353850C3577F4A0CD8BBABA169DE487AFBDA975B850736F9 -1345BE2B5ED8D94DC2505B8D6218F3167050BFE7E723008CA3C29E3244509D0893C580F9 -4FAE8F724DEB1EE280AE8993C9502E9F40477FBAAE9C3F9DFD0A78FC38D537FC0BD23851 -8499DD3CC9E583C292D200B9A082008E52604EE8AABDF15DB108C8D5A693CD829C8812F1 -0CE53781E50A9D234AB33BE6693C3FB59B921DB35FDD87A393F137D0CE119CE835138F18 -7F2338E0AED3D973652DBB79D7761D39B8A819BCED55B483BEA6B5E971E06475D03E2B9B -B3B9D6677636111D4725EE36A077BE72347358A1EF91E5FFB77A0ED25542DD3FE9D7BC18 -596E2DF47A12A43F324444FE90226A63DC1CD5F265CD7EF81FE20A592D5A181B7AA251A8 -0CFDCDFA15B8A43A88F6889D2EDF93093DF25CC232BD1DB179536A1E3C46274F7F36A443 -86A764B04DFA73FF34D7BCF86C0A5122EA5332CA1D797DCCE9BDC7C8516BF80532BBDCEE -A7C2A883683CC3CBBF1E96490C2B7D21DA99A3D6A0ED78252B12E1C97CE41D2B837E948E -94BAB7BD87C929D8FAED67A8FAC5AF8E73F2518428646B0A70387CF9DF41DF0F4B5E7A5E -786909F6FF0CB78649EC9F653FE445B4D588370E86EFDCB1EDAAD1D2601725EDD7CB78E7 -E815A4B76528F51FB88CF25A44B187001C63988B6E32531DD4E961DF683D794C0AE3DF76 -D0C29D5A279E668E08501979650610050BE7FAA5B67B93E47C807D22B26CE24B9BEB46F5 -B09C4A4683ECE59E931850DFB86108AD5937DA19A2132BC076AEFADF3AE07F65451E7A69 -5A583E0741864156E31C4DB9795ED7BCEDEEAE6ACD259FBDEFD4B4F4F187726A7A247974 -7B22593130F566D3DFD71E500EDCA19CD8B7B7FB5EBAD025660F5D8B3F24A224D741BB9E -84942742D9D88E771B721E72859DF2CFFE2B288EABC083FAA26D815BA98A7A9F701395A9 -7A8058CDC1CF51740E293F51B6F0D61666A365235AE1296E1C9485A0043F651DF417CB94 -E53A1D79AA96CD5D8AFA0637EDC6CDAA761FD5F4E712745FAA66F74E7CA9D4C7929884D5 -32E12C92625B882AE1B60E0BFCB317DA1704F8A9337A42A8BE38DBDDEDC1E6FA9EB01F4C -FB0BA8A2B29D02D9DBE63D2D592348A645747C55A939E94753887A853D3DBE03C0BF8BB6 -C4892B94415E60C3B7927B3B7BDCF56B45189044192DD6CF8FD192C5929C1741B6E53FE0 -7B4CD9EF8409287D791BE417165B54D5FFEF0F742984E18340AA54EC8D3E0D7A479F269D -B8FBD0671C09E265CBE33A64CA9BF752D334803C09D32EA7EB774C32EC2E2D8706173E56 -C6A9690179F2191453DA57206855397146877BC55A562AF975C3715AA39F85C39A681FBE -F83A7377E88E569732533A5EA193CCB76318E9D6ADD7400BB9CFF14D698C4179033570C6 -D00D70E5EEF63015399E5F49C4DEBF22666D76B6D60F801D023FF4EE8D63A1DC0709481D -491F88979DC7AF7260BC0EE1CAD6A7A3EB0CE78C93865884383489F457F2AC5CE0C832F3 -F4B81820F37DDDB712560F066ED63777198E3491EBF087DA503CD59812FB082ED11E072C -1C1482D879AE9F461ABBD5D4BE7D8B50D50C55DDF9C49D64FF968207614A85DF8DD56502 -809FA54B200F7DD9A6D4262AD7F0CF61F87A69DEE18A9B8C67F1CC152A8509E64211A064 -F39F3CCE5894A8EC0E23C9A557DF5FD50E2A5CAA3338C1781D04CB638A47C7A5A6FF8230 -1867BFD856A6BF11BA8DF56963D17291AA202C991F7EC97B501F79CEEAE44474806A06C4 -00BA8E8C5AC49448ED4C248327E2CD223B9199ADA618FF99F8DB84065C36A8205F5D3356 -C690D972B139D97449C080821798A70E55801EB4532D0EA1C05DC635932D1848310C063E -05BB58B016A99FDD3102CF2BF2AFC5C6FAD3C031FA24F9BDAAC454529565E4EB52F838EB -D4A61A32FFB3A5768F3B1135629AFFB808AA85788B3BA755AA51A6580803B6CE45D94581 -849CF2FA75442E759F1A544237938E831F504BF6408034B034009BD82E623AA31B66D128 -2741C8692C56E3F251BE3D582C32A9B770D5DB3E9DA9BF50A527B37DD41C425623F3B787 -7186F26937B3E04E291EE805DCEDDFA214158DFE50A3ACCD0DABAB73F5F51BFCA200C466 -B9A786E7CFF65F4B24C29D39A844A6F6D6BE41C298C2BCCC5CBDBF3C3B731121F834E230 -C8AA3BF6E2C40EBFFF4723BC0B2AC407B93DBEBEDD49CD639EEC65777A5B6F94B8DC1C59 -05040D8E4B205068BDBD5F812058D4D8BC2E16114D22D81701D36665CEC878D148AE79B0 -F67957B5505708ED3D98FA55BAB6FD20E2C8BA1C326F514AF29CE979DF66BF1F71A579C2 -EEAA176A3632CE7F136885EF3D530C15DDB59C28CC8E820F55E31667E8D8555DF76807CE -3B37007E37A06AB32A21B2DD297C72785A88AD6F45784224D29241B013663073D8E1F7C1 -DD2BF95BF7C74B8743B31EF48655049EAD7BB13B87E648BF938059202183DD2970BCE1ED -3018733F8E5B7EF9255A29ACF581426DDB9224858BB380AC7BFFA1DC8D2589A83FAF5ACB -A4985D845B3F635046887AA62327FE0B0F020239E9FC7477821F7BD43EA2EBF1DC9CCF32 -FF6111507BF24557126C3BEAF30DCAFA051E3E9C26882BC3F4915F54AF9965505D89D11A -562EA74783739F0C788D0BE3547F16F9BD13F96D861B2DAB90A4BD23043D588D9B583C8E -15E9530D006DB4F17E0B4EA0A851397C4B781D707F98179B6E212A6FD87E2509B6AE4CF9 -EEEC87747374BB2144CE2E7A70B0F2C03A69493F9DD476675AF200F15EBEA4F7770001F5 -461B9079488E9FC1FE2EBC86DFE8CA2D2ACA5F746804F639228E813C8A1D1680F0A12499 -CE56678DFCF24FFC05C80F78989CDFB4F0CDA8E66428511E9BB0ACB8EC04161CC575AEA7 -522A229C75815C78B3248031DE073E0C5E538BD886F85555AA2E0A0456C2933A95E83AF7 -D16C8F8DA487452AC84487EC764A1A2EB1CC754F517FAD18C7F76769E67E3363D8881823 -6949A35827574BD65623CD4FE89C0F11AC2E050584CA49DEF1C513A8F7690652F963447E -DC79D866F8C42EC7F3092DF52EBCF6E64D19E44CE1403BBC3A29C56CAFA903D315D42058 -A01E6124B82F1093A3027891C49FF06C8C1638563F92BA051AA5F750FF5F6108F6C0071C -E9CA1CC669841592DE89A5383CEA9207C9DEF1A4FD137847A80630FECCE16A6454F4E857 -80A9B166DCFC50AD94E332CBC546CBC0A39507C8205050473351C6263B33FD705594E654 -06B19A80DBDD061D12BB89775D6BF4933B3FBF3BAF6B287A32EA01ED2B5B33C48715EF5F -4650C9B92EEDE15F46DC093FDE463578EB377697703D7ED7C0E576001487567316B333E9 -CCD75BCBA59E69E1AB62F39D0546EE67FD4C1339A93E01951F0C2A38A994406406D2C64B -D719DAF35CBB25BBC68E6DA6016ED0AD7E1930CB951C1CC22A8D82E144969FF25FF153F5 -D7A7A6608471BC31ED1F4B4E6E58173FDD83FCAC6FA079FE172CAB3BF667C0FAA4827244 -1445223D78002593602829313EEB37EF4EF8C96129E96484E36328213B9DD5F55B731167 -FA55DBCE903768321B2F375FF1323016F7A8C0B401BF8E2A983EBAC57AA4CE5668BBE152 -E1BAF5615559760ADAAFBBF1EA43703AAC9A74F21383017152EA311AC3D3F8762E1D8918 -887A0BD9E880D3C052A48B4EDEE667370097EFDE700B49D0A19F32AA3B43C9B58A3EC400 -DED3BA2829B90F54D8F0B3BECED9136941272DC0332FDDEAABBE38A0F8BE05287CB0D281 -DF55F4E8AB705B54DD026BC09E5831A64C728D9895D21E1FBD24D198ECD475CEEA216726 -E8BB15D4F8E946B5B097CC9C89E79470F0DEE451DB14D96C994DAFB07A0221BD48F79587 -DFC722BE7B360A93B98B42443494076BA779417DA3C17BFBE69B4B547A3EFAC6552E4D4B -9B03D51C863CCB46A8ED112C0B19608879DEAC918544B43B4199B2C0DA7B318FF13E0CF8 -47612E7279C334F681AC44CEBAB0D6E141506AB98322FE9F41430E69FA2F482CEFD68F3B -1280C9B6EA383C053F9474397E8800A6DB961655D18ABB68600F570C2D02E4750622174D -6A9AB48B05DDB2D56D74DAA537A642E1FBB63E55FDCD54615D08EAC22EF484FADB9862C8 -6FE2E6C300A367EECFE4337110796C21F60F9CA9D034917B1C98FA45EC79DA8DCDB216E4 -A3DD97F0C51F7828743AA768F2E442D2264DE35D7F191AE874B856C8473ECFF241A46AA3 -C2261E74BAEC485E0602ACDF8FF0A0077E84E6C8330951209C87E117DC57D6018E7D4EDB -E79E6F59C75D8D030B442B65B3513F74610B98C40E3C2D500D41ACECA44257F8E24B0B19 -4B6C8E20C51E61AE4F633F8586B52CF2D9438958C52F7DB15B499E69FE3BDC8E983CC34F -80B57FE1279254A228E7286CE78E771BF9436154847370D7DAEA0D995D9D7FC2F0637731 -29E076BF10576E480C1D82C29648A2AD8CD36814C67045E4A67737C22B5B5EA48387D991 -E35B8DB9695290D7CA13B1106C6FFE40A6EFF1DAF1A841F3A5F75B68D441687872E91EAD -4AE10D047756DECBFBE4F87262C2008D4ABEE51A0641AA309631D7E54258182E56901E59 -D1F6C7F15E8D3FB2CA70AE578B2CA08C65FFE542A479407F98D06F398DF54DCC16FBE30C -67FDD4A3227238EED53CFE2AE0088A1E2F9AA08917947C4CF795D3E464D55987C4DFD14E -EEE7C9EABC34C4F4C77B56C8E486BC35E38DCAB4E7FA1746C5854175AF400460BF82BDE3 -C9E066F4ABA7E1DAF6C04035AB86B1289E3702FF3DFE4FA431238AE487D486150A1C52D1 -047B1663D12962B478BB1E4B750FAA1E2A09ACE4AE89058F3E2B928167FEF099922EA552 -6435952A7ACECF1650B319BB3BB8734F9F54696B556BEA7EEC47E4A77D81280415E02DC2 -3F4D9A73F44AAA9646671EFEA5549FCC9A5915239DDA6E1C872F742B28A203AA88401DB7 -00C36DD78CEA2A9293E8768D5C59721D16A41000A2E1B230DFAF4A1BAC797DDB85BCC5A5 -A38BE413D0270D7259289AD4788D1D9769234BAE6CBA1DF835601A76CFA75C005C0EB325 -6A100B43C0AC0D0051084902D68F0517C91EA5F4161961644230055C97947D5756C62F12 -C550E113B2A88EC56345C965D81EDC09F62AE036C18AAD798250E5A0A07E607F3E2D0ED7 -B889CC2961339149DA012D74F290574735CF2706FAFF605861571D78FB92A8CDDC84C83C -BEBFC000D43211962C578111F8FB8E8506EB1871A518CC7313242FA11F8D51BFC3797637 -F5E1AC8EC1435B36D98BF1BF34C960C6CE650D5115A7A244ED7489BDB7F6514BE25372F0 -9E3F378CF95A0E462C0E0E1B4E84696F1977059079AA626D0F441D2CE7F4B52A49B14FA1 -19762B9FF8966772E936F0C6BBB0B24F7846FA1109562BB57A995AB8DA48C9EDD5E90FC3 -4C51EE9DFF7A2D4AC959320FE10B800C83E9B83FC89FA220F965DB0495A4EB5EB1AA21DE -5EB75C0CC0619C9C38F942CD525ABD40EAC721322D47D7117D750325AECC9A021D1A12D9 -D439AFC0425F9046622EA9F34FE1FAE58C428311D62DF1FACA2127AA627E91F5063FE47D -F727DEE5B989E1D4A89B900FA7A9CE3259A3A86D966609FC254CBE319DBF40FCB0515567 -A54AFDCA6CB575C49E893A136D1680BA06CD3C427E1D1DD707AEF67C44B89A4CCC1F40BD -64820463144AFF0DB7CF78F08BEC8C7DB7356EBE85A0DFFAD4D3DFA0F7F4AD70E7A5B49D -9E51D73AF08C7B65B9914071A837733C0819ED07223BCEC52D623D29CFC3463233DA8E44 -02C013306E90993BB54CD78043BFCE18E490443AB6D7567FDBB9C5ED761968B39DD21669 -EC5DBB5DC7205B279B3095460CEE2273600AD169C649D846A1DB9E6524A7FD5D9EA9C9F1 -A02CBF4D9874ABDDCCE5F70F7B3F408F6186A0CBF83EC8A342D7CCC022C55BCB472D5896 -069976044EE83A88622CB1C774EA75B34DE55D618E7D22D50ADD05328B59F9AA9B683EBF -4741311B7C07541228ED36A71F9175F4D0EFE9C11B0AAA03403F1BD623F43B4E8C8A9E5D -8D2B43F240C89DECE40B79C64DF6FDA815F08D51BACDD7D6932B73F74A3486993CDA0834 -3812F920486140EE379675C07291435631EEB4E03CB5DAB603EFE0545CF4130F9D7D421D -5114A4FEE9E4B2897BC6D232ADB685C55EDF8C2A8C47814A38B8C7BF34FB777360449448 -90946A15CDE17EF60BA40E77DAF5BECFDCA9A09FFCB93D0010A161BFDD40EBF7605EBA0A -50C3BFC9B8A48CFB895FA52EDDD86221D6EBEB0E9A3D8D0F80B88DA1B8099DCDD7703C53 -0C90F979DA5A2CF528B610B5645087D2CCF5D8F639E420AACF09F97231C3250DEFF28978 -43F44E473AEE74810B77D8449877E45AB5A30E29A4E98CD78F57A47A195C3CE22A5BDED9 -1B3C576D10D7467B3940542E70A7DFC92F4876E384131982D7680FE05A5812C80621EFC0 -A2F0BEA16B3D4D9C07B8AC4A540C803246CE437DA13FE610EF3211F81CB7801C642279E4 -9CF563ADD932DE6ECA45918DDBE97DA17B443C7BA15FCF39D91F9C4501B03E56B9F6DD75 -F3A47EFA6B7D9702EDF6C79C9183F37DFC805E5689F27B53D5487767B276AA037A210C02 -AE23A2C4C89E6CCDD49FF5FC857B2E8B8A9976C238456D000DBD35B00A9401657DF88913 -BE616D0800945CE1404968E78028B727B6DB6547F5155F4C5E0C97C3FEC8882EDFEF555E -98E76A3BEEBE09DBCDA40C2C35BC1A8C7A6B7812AFCB1468D527F723C947F56B9B1B4A45 -BC11CE5C3CA9D950E4729A242866E226A66E3D8F71D9AE73F0F8740E2974CAD28FE613C6 -B67BDFAEC416CF799EABCA17EC183A0FC013A16EA73B5156AD203C2D07898D20AC23D03E -C5E4534F153440C72D3DB5DAB3EF1AF626472D039892379A39E894B10BE22EB8296E209A -8C823E4999F6BF0A1D3CD90825C752A98AA190A2E19266329A49014C772510AFB6B85D23 -FC3811B1BE5CACAB09B5D46E3813DDFF41B8ABBF8E8ECC2CB14D48632DA2E5F5F748E14A -8877B8E5F2E2621014B93A7AF3113E3A8B3BCDDB1CAB7E7FEDEB79E1825E27151E7C74B4 -CBCB8B40A82F1F333AD206F18835FA8EE49BAF6E22E851DF09857DD303CA2CCDABE607FA -78740F70DD481DBD1EE04F730B5A3762082B1B47E69F39201D42A8E21F0F48CB5EF716F2 -4E3B4B20E53CAC08BF494E71495B4E95E46B6AC1802F01DBCFA8DBD1A3ED82894A5DC263 -700908A3AB700075586F3F3406496A1DBF40121744A9A1C51D3E135CBDBB5BA68D3BABA6 -21AAAB308EF3B0287A32AB2E584FECA9A3E00E0A3A7C038C225C51788C3D13232240EADD -63C8FB02A0471517FFC82E8E2AF6AC526F0A3DEE7726821ED3627638AD691FD4B240B9FF -613B72C089D11C22C610F9B9E244EDC11BFEBEB5B1C5E4B4A4362683363B14FCFFD748AD -339C432D31744B43591ED1DAC1721A9FAB9DA2B016070D89914C0EDDA9EFC894440C8B4F -3CE96EC4DEFCC4C57AF0DF67C40575095323A5D73D671D2A716A787DDC6837A6AF455F6E -B524888B98EE8E8F48FC9443899D3CC6FCF6EA214CF462BE414302FA0B39C1DB687B5186 -EC46781405BED3DD98FA23D796D197E9CA2287D4494E876F8AE61898792E3794AF5B3901 -815FBC50E7876043D1F14E61A6F998617EB751C113739F035F4E9DA35DD53DBAAA91056D -1EEC865258540B185DF50A01862EED02EE626051FBAE63DF6D94666EFAF4ECE522CC8066 -EBEC91734715C3919932E28169F49981D7316E982C287F716FFA8D61B939F8A47899D57A -C3D845FFDB0F21BBF2AFB9980EB0D4E180B4A22A902299FCA5B157AF5DDACDF2C9DD3E58 -2AEC6BBC869919860893B9FCFA4881FF8AD0D10066CCA51A0B63D478D1DD7BFDED04DF2F -58186AF02494A6EEE99FB66AF9F3B7C6A9E1BBA52AF2FA10596044F7A9D4B0CB337AD6AC -5BF8CDBB69390F7536B977311C6C9127F26DEE4378A17CC931587F77F14DDEAD5DDEE1E8 -B57FCBE1382D9529880BEE3DF9FDDC6A3F9C6056988E5FDD101A54459F6932133871851C -4871EF219571A1FC43A42BF14E8B029D8AD6EF458B59057FD6BA634ABA8D6C11EEF4BCD9 -402F47D4739BDDF22948A9D5E7754F621D27565CFC92BEBD62555B12BEE04955923A9E8D -6B0C3D336E8345FBDD40B8E7C9A43DB83A895EEDDE6211EB1360FB016A9DC23F5055839A -9A71775D8A45056735F14F87600916F187A53C323C86CDE455356176FB014584B4A04126 -3FA11150B2DEA71B44BB130243973600B3A9204C13304853D33A15CCC111C0F08360DA8A -A2C615A72FC79C1B128D04ABA0E92A138CBFB37253EE80A18BC9D92B5845E895A7DC4060 -41AB37F3D4827254BAC860D6EDE8C5912D8DAE2F943A4430269FC9F9894024C73C90D77F -0FC81E16F618BF7DFC1AF1CB2EC0972F62B30F5B37747A8AE2C7A2C7C34595B8F1DF513B -973BE2F1ED822FD4BD7D5B07BDDA6006019700257B103BA495F9148012C4CDB2C3180DE0 -B395BCACDE2FFFBC1C64DA5D7ED1738B68AE483E5007EF90C9A770D73988849F2D2D6EC7 -734422A7D0BD41042988E4F215A81B4D2545A2C84A1CB218825221D3E33D5D5A2DA7E91F -90B275B9F73571286905C58ACE35E0FCAEA9A9BAC32784C8CFF609B09114D6836AE6315E -4943E9AFAE0905E0516603C5CC2C54C364CDF9282DB7BA8DFE921D7B4833C48A8045A60E -ADFE47F9E1818BC4F97657007DEEAB9DCA84280E3014EEBF7D4D0D1DBFEDB072B20CC4C2 -BDC4414DA5070757F4EB8F65B1DC1D8C934F9BC20F516A9C6295724DCAB93A9CFB0D75CE -A6237E7F225DB1CBAA18C679E2C6F0121FC59D090E5DED3306F50DD0F92D5D9FA2003095 -CE6C5157C569F3E5FC02D4F3FA115B9B294C74CF95DDED62CF1E5490A6FBC97065247D4E -23D1E39B0EFEC6663C27674AFCEFBEA9E482909EF6B6B8E3AAB9FC169B0DCC8449B50A08 -221406F001A4D140579FA9338C675DAD54E854CF359452C07D07EC05F28301D94FCB46DA -0D0F5502DB24BBA0364EFF694A7F4E86FEB6845CD59493BCDE8BBC61A30FA209B890F097 -5600D91FD896E6E0DD0626B4BCA3487AE1C577320E0C251AEDCB44910510CE89CCFAAFAA -CB88770FA29636576011B67C6FBEA6A310AD45A006100C4473E844ED4DDF69341BDB9FC8 -3D37F678B9F7A2BEF245F823186C56AB3667795C79EC85D68B9A34E9779E29889E67DF20 -26B22D42C423C1425A678D8868543E96DFF0EA75C3666B0EC85A015B7048F5ADD08EFB1D -B674AF6D008808168A8EF8EAA7D43F942043F3508D6AAE60CAC9C9950B81C5ED863B6653 -0C98AEBE1942E63CBA37FA6E02DA11AB27F8579BBA5220635D424AE097A88C830B3D42BD -6B7D89F6F40F63B362E5215373F943ECEF08666D86D2D3AF045EDA7F9F796A5522608F6E -3FAD8953F166C11FD0688B127AC306770C934311A4890C48ED4EA8D12D04C5E2FF9B6DE1 -5253DFA7627F3600C89884B2B3861B364FEB31805A1D91B95D2DAAE9D16538DDCB94EBC1 -23F63ADE7C1B9D48E526EAEC0FFD822160DE068723170F5B753B5C10A0A79CD09ABF1E96 -A8811EB377BA65F37ECBC966A054A65FBE686C3BE9FA4573BF86865A5D997FFB690841A1 -F273016436C3D76351BAE06BA745BF00F27428B1113B5351567C9B254948D8A91F6927DA -381F993B0F941458CE5F5189091A65B5D90FEF01051919863C47FB4EB11D18CCF8E5C8AB -3E518A0923BF4AA13F83BB3FE88A4C3D680B7FD65D649E0159C6C9151FE7959E77699105 -B8E4E1B10C0C5B56C400325D32EB5716BD0FB13AFC7A424222B970A894C7D33BABF63B59 -EF13538F526CEA62F5856F1BB23A00D7E65220E5241D7EBCD0F84C44ED3EB468DA011023 -4358E69CB5AD8C0B53F2AC1D014358CA2C2A3C901AC5B2850DF73455D690D3944BB641E6 -995053A40D4A513425BE0A17D619DF7ED39076E9FF9163282CBABEB14BF7E4A49A5D93C8 -69B9F57C9D86AAD074633AA533F5734F2B98B0CFF7ACD4726BB1CB239032FBA59B3D0FEB -3F3C169C667807380CAF379766B5984B4CD3D71975B62EBEFF09056E62917083E35CAFD5 -6FEB1C7A89658F46733CDA47E99797EFB6E48332D24C1B9766F92D4D4AC4EF17CF6418BB -CD0694C26CD6B5421AFFDC33764719826667B6F88E604F982049D286A35B5EC47E07605C -A8D53448C6A436B183BAD32E8138CF289C5D0ECAE1A2818BC3CAFA0B02C9097BDF043F15 -8625F6B756D85C81A4B42865A4AF790BE63EB95C72BE08598898E801FABABC845EBBA1B4 -4D4ED41CFF1CD460612F8C2B249B1A206656B2CFC3910C57465343DCA6DF0DCDA3F6DE56 -8D6AD6F83DDFEE9DE523EC0BC45138BB80B7315D894B27D73C4C1DC582BBA0A8917E2E10 -F94369E0A956F61EE11CBB2B45ED6027D448538B36C471D2D3BB6BAF447B60F6023F55A3 -24A5C71573438FBF1A7B40A746A73F5E1B51FA3F38DC9A2806BCA0B8B6817B1A265826B3 -27D425929BDEAC8136A91329B43EAB1AF325960D105915D185E0522CAEF00A15A2014F6D -E29C3093AFF98028F5061818F8783B37FD1881ED44D6516EFBADD5D6B500D5502BFE6A5D -908A07BABD50514A1484901A51AF83C338624298070D04C1DC09D03E565C7D25726E37AC -1D1A9F5DB891126F9944BFA1080C7906A263BA892363087DFCBF6B92D9AF9CA1D7781A99 -9DD794B3385C18AD819D9558CEEBC46F9097E9B6CE6A00F1BD43C98730CB80D48937D0D7 -36862809C16C794C4435B41DFC392291E699EBE1AA54537375B6FBB27F1230B77A0A05F9 -2BFA166CDB8B180036DB3F48E4851A538C628C8D5D9CD556317A0CF0E6C28183E07249E6 -D6D47F35F1C3220596EF0CC1F0580ACB2B029B5A5B0C10DAEAD5D3F698CFEC641F16D80C -0225611726C1D8C4482A00038BEC8E0B9EF7263C32DF0F80E01473C41307FD9C10742079 -9F2E0486F5C937EBFA48B7B61DBA9094AFF525790B61C3858F76685675BC6ABD1B9E9A8C -A17C98CF85E49D6CB5A6B7CEE52D67EC249CC2681F802C06FFC639BF3A0EEF23AE39AF5D -C3E77F63D07EC30E4B3E06F74E707DBDE5B6DC0DC1A9DB02ECA2FBA6C87CDF278EA55812 -40495E2C138BE9CD3AE2A1A427151A5EE3CDCE28421B137B1427CC48EEE8EC1355B48FB2 -86F40371EB9DCAA5E163C65967FFD4FBDF7B358463D00AB081ECE83596C2EA2F3CBBD847 -6D6EEFF31FD8A0E3CF4B6362BE42331CC2737891CFA525B1CE62F2FA4B1F2FCBA54D0452 -B77579DD1C56DDDD6DFB2DCB816B47FEFE0E84D3A19FEAD6290FBF751BAA095C068334BD -77F0F04DEB6443DA99E84D250849045DBE0ED267F2789B475127E6C57059359EB08AA04D -3FCEE5B1E61EAFD90B19668647CC52FE842FB9D5A58E3E50E4CD7A2EBF1FC9DDF4CA4B0D -29AAAFC8344627C9BC74C49BD24774EB0CC6DA70B3F3BEE134F298528373CA8B96121B31 -2C5D02525A1166E8A644D04194DF8E1D9323FE92DAC4833CF0E08C716716069AAC65A421 -142B305E97E668A32B397244555BB14653C18384550BB417C05EC9343BE28E62845ECB49 -AE6AFD50A5619CD1F5779FE6AE1C2A2C10420F0E9426AF4614FE2E6E925214E0ED5C6133 -E9E44ABC962770A4E598E8D4300F9C93CC152C5067FFAE77FE9A171A5E463D1E9E5A332A -564281F49055D0A99F49A20368EA7C75285EF8215FC37FA69A66101EE4E2E32A1A2AA753 -8EE3FAE3D4C31F96C34A74677BC9221FB904F777F69D2B85825E09C8BEBC973E4AE85EFD -123507D5D428372188270978D9C7ACEE75DB5D1F1E2988832870B7EE4F5366DE20237EF3 -E526DC33E2A4FA186A43325779EE8253D76DD1C4FB007F1A2B8E0272334A5956C488ACB1 -1D09C8399B4181B626636F6EFED9A5086BDA64AFA3677A48D13464C2E0813421D96B08F5 -F3B7D2CBF5B2875A1C217F4677B026B21A07A8C61140B1A91D552A1947952448D7492460 -FCFAB5A22A7E9BFC577ADAFEE42FB8C0EAD717071E54493AA7BFAE960641332AFF9AD94F -9FA05A94FD5CB6014FBC8D274ABD58DE566F621672550D2453ED92AC8E317D6D28F5A443 -D211A3A65005F8A18006D2EC7749AC8F57FA4142BDD1D62EB99A2C4A2EA448AD5DECCAD8 -7B54EE483B40CE76CE2CC0239B0B50C8AF29E007A10FADC1863D9844B2380052383F333A -29A7168871919497C878D7DDFE5D22667C51FFF6C2926B3D219D3A3C02EDF6A9FAD14E90 -90D293156E00F6292F11808EF0E73CA26147998707EA4ABFF7B77A5E29ABACC005EF74DA -D402BB1AACE7CDFA12F93421506980C275BACC61B292DD800E07E1D640A187E73A0B682F -0005D5BD5F6E53171C376B1573B9F1FEF247AC3494D828991A9050C2B85870A9C2E08C14 -A92632C3553AFE16C771A3FF2DE42949E1AD0665A0BAC07C8B1C9622873C54DCAC6D642C -1F050F2CF566713BC4C09E28AD0E7CC6986CDCF68D5D8DAA0B20B6310E4198A1B95BB262 -7B1816093B84234255C361928DB4BC5AC3A67A487C540394E833E3D879B3C96ABD4ECC4C -95FE7718D1D6443C84458B694AD25EF8824F947569C001931C133D999D6DB574698BB17C -B86246A3559E4E4EFC079D0BC9FBE3A8668DF9311E7EFFE4316B47C4982168D69331CEFB -AB51A1BE03A6C2CCCCAFE7BFA2A836AB5819FC8E18E33C4CA59955247D0EF9AF810141E7 -B60D58D38A2A5F4686C1FBCC929A2601EEED2A4A4DE9AC90F726F1D1A16BDCCFF5280A6D -52B626B3D927E606189991FF548FAC99C1DAC6B894B4BAA370678060B1D6CE7D1F74E251 -920D7279E493017DFB862ACA5BA417A9A975E4D6736C2DEA7418CC1A07DD3812BBBE56C6 -F3CE5DBC16353009E547376D99F03FE9A087C29A1161F2629D00206C219300B1D09F4BF2 -AD8475A269466201C57EDB25D8A458E4FF1424FDF09B1879F5AC6512952D56EA719263D6 -F8BD77D3B5C04A2D9E27EEF0FF3F42484F667DD1B3E483C45DA8057AF1C3746820D7C663 -5C363BCBF2106DC618AA1F46C34E9562F33EE3D392A6072FA236BDFED8D8FFE526694AAD -A68AF0ED535F0E1E2CE19ECABC2FC66ACB07E44FDFF7111639117086B1876725BEA99E8B -D0CD8055DB154A8A7BE4165118C104A5C1B2629B4C948EF51A68C7A3B5ED70C2AB40F0A7 -53B75AF07F4248699B03A7654C366AA3A25121D8590E787FA902D5E29516BAD7C842C649 -41EB1350B2BAC0E28946943E0D5C227326D7B1C3939FA481245B19E7959B770DB9355DE2 -E5B6FB5F66E273BB9CC91527F87F35E95AAD29D867A0D35E9E6B1BE8F1EAA06FDEF2BF33 -E694D4747D525AFFF997EC367C1E1D0B55C2146BBE47581FF99824269E43B795FB02F80F -83B1BB3222C6A48B9651325E4A6274BE9047DABB7FC9F85751DC9239E82CBC5ECA22358C -8EB9DA76B9CBF92894268C49CDE4F67B6299CB46FAF1A8E42FD584BA74C47767613325EC -95CBE6A43BEA5FF97C7C2195E970504893EAC878AAEC0CC2E86CCEC442DB62FA15C4BEBF -35D8AD91711A689415A84DA6AD6D1E2646E363D143FFCE360B3E9D282A84559B1202AFC8 -41A603E80631FA5F1914411B13811ECAB8CEF64906B0361F5F558A22026F46FC88A389CD -E0B23523E884686C7D4D9FEB4C3D66BC410E2111A73988E73CE96CC26A9ABAF3C860D8F2 -658FD13A44F3DA9B5E53E348FA51B64299FCBF16D16E07CFD4C5446614FFAED07FFE9E25 -A10696029806CE3E23582A1FFC5B83185A0411E8353BE08D7AC131E2BC7B7A8EA6B36653 -82B2C4C217CA8A09ABADE43A7A5249643758B7FD0CEAB8A9AD8E8ADF1A9D13C2E5EAEBE6 -D29ED3734EDF200A92E19490CF4E42DFEA28AFEEA7FEBCBEC1645C6A101B51303BAFB113 -8D90761074D935F9F553787C1F653FFA3DE1A8808D185F38D57DB5E1B16C1EE5B1385C4F -3C9FAD7CB2460DEAD9DEB549303502AFF17660B9330D162C891F1039B68ED4682BE6BC89 -7800F158A24B07539CA9CFC6324D52054527406D915BC0932F1D7A86E2FD1F649386CA6C -6E27C50CB7A63862D606CDFC3ED8C6328A756AFB01865C264FA74B586E5A6D34CA48CC74 -24B5EE73BEACE92A3A4D97BFBAE51EDC60643B8FCF024EF05E263C0BF15AC37665BE3428 -86F6B507B63463EB2DBBB5B2EC5CA4F227F9D5CB0124BDCE2C0AB3D4358273910E916D43 -6FF95985D564BB420489DD1A0919C8100EA03EC5702A9925C68C86B4972C118B04016533 -BD9726054B7B563BEBBCD62CCC5A08F133ED0554872DE4188F1F15D52CB5592B1E35A319 -C6E5EFBC10CEC89E9DD78884E18FBCC408378351B276FB389136ABAC62515C1F5C3D3755 -3E0FF12DC19621DC4E6C148FC4F56F8FE32CDF567DA11F80ABB91D224D4AA7ECDA2A5035 -9825F25B2150EE449C101935B44549EB3E6830D551C551E1501D7CE5B3968B770016F605 -8F0CD392393DE4576167DF1061732E9F7A42464610BF841387941487AB1BDF04AD40EA13 -90A50F076215B6DBA43231647418BDBFD39FB143D43E0B8912F36348FC7A1CA96DEA49AF -416D8A6CE75EA49395667E19CABC2B8D43543A488B130A2D85386518D86987BDF99A26D8 -B4EE1E29A4BBB8AD0AD4A27B346FB5F9E8E5F180F0D5748FD98A64715954A3125A749A43 -EA2B18CD4DAD93656B8FD9CE27E5EED5BBC369C060BBB43B4038ACFEAE8D437A354CC373 -66B2715885DDE1BE0F5DCF688E5AFE08E163264DAC1BCCFE9666B01970F2F16B47772ECF -751055380EF0002FC3877CD3F89FB0D9E018A6541FB71AA3F6CE602C4DE2920386F01185 -E2CF256CD8F8EB24F460270B6CB8982C46CA5E58566ACF504EED68FEB0255B6D58B33687 -551FACECF40487D58D4DB520A1BF372DD3B66710DF6224E9B6D2EC15B31EB4E41A6CFD53 -42E3FF218807059B0EC60B96CA5F9F4CEBDB3ADA79C16624824F479F5FFF981B0E109BCF -8C15D2254FF75BCDBDD4AFFB96CEA4968C38611FC2204054673FA7AF01DADAF779AE58E6 -8600044320439E79D45D56352B704E5F12E56ED1788E0817DB76B80F134C9752F0082CC1 -D4205003C0B2E73BD54138B10E0A16CB57A0ECBD17DED50FCDF7BDD848576E87868A911C -C5F0B1C36BFDDCE813366DED05732C46C9DADA44D71E94C3C4A5030EF7061684CA509C70 -8A242B8A39D649530F379E81A1F5B4456A452038BE180E35889AB052D14823392AEE2379 -FF3564A86A2F50AFF40962F665F3C005CFF6992FB85040E6601D20135D7227F05892F344 -2578C821EE1F00E68E0475C0266FE10458A18634B226AF224A80FA07A1E3A29FF6AD2838 -CCCCEE4E5E9035220AE9F53C02DCA89F00418FDF632653C5C64BEED2209ED102489720BB -D735B06159B60BB162997140BB6AA99CD063B94A7DE5098A8CEE9A1AC5ECCB0E0D12D399 -27FF2FF621919638D4205E39DEED766108D63938FAB0DB2B2C9D1BDFCB14517C7E98369A -7BD3E31ACCCCEAFB954D92A22209C9E825CB38C9B5A529823B0A85BAC2605864B022BE5B -B8DAA6312E8DEFE04593F4E8D0284DBBA42CDFB7C189F280FF48B79891EEF4FCF59A413B -7CFAA37EF7A154DF78808E4AB8CDA33FC51F6E389227BA952469AD2D7BAC328342467482 -FE311D122B9AFE8A16E9B6F5551CBEE36A3EADD5FE7A524A556F3D7AB3217FD8C574DF32 -083E0D1EA61A8E01E3BE1392BD2955486E289C3E1727FE71C50D1B50E4B7D945C5555851 -AFE225EAC181B0EA541AF40AE45309B4BE2DE1BC9B36E0B7849D0844330F3850572B3869 -FCA1BFDA818FFE1CB7095423D611D85890BDAC15318028FE9F3033D1DCAD9381B9237247 -D65829AB81AFB878C7EF54CBB6CA38526AFFF404662434D7714FD8A5D0800C8FCDF69A5B -A6938079F41D08E80746259C7D7D24E149E2C55424223CCC1AB2008545CB8C5B51CEB8FE -DAC374E94A7836030F536F34A55352ED405D9C31AC2F82FF072B9B885968D534C9792F45 -1BC48E942D28CFF06246597246776530F72392C98D29CCDDBD9063EC24D559437B844430 -0D2D742E08C0126F4116198C72AD9D95E83A534A6D353FE873038825687C3AB0281600CD -FB2558D70450E14684F610E144A7568C471334FBEDE0CBFE913297A657321182AFD4045B -D5D205551C6F9B904781B32529C2AB0FE1DEE6269CF6009203027C9425262CA5AF2EB250 -493B9C1018F2907DCC656816D57FE4C987CBE7F7F1BF0EAF8AA40E23B456093B3DA29C21 -5CC7F911ABD9ED34866EAEA9E1E7998C4126CB3B44F7A8075C37640E0AABFF1B9B0EF003 -96A9CA8999EFEC2FDE533584B5F49BB4DB1E121B581E12F2392E7ABBCEB56B35E8D0E507 -980457C24100377B95668B167C6E5388760883BB173A6993A88104A3E08747F1B75F553E -65E448C8188A3942182FEF0593BDFDAD67691E125012714A0B4A61F5E918980E1A167A32 -D7CC3D46435CF3F2A84458F309661A2095792F79D1CA6378DF864A308E162F1D8B35CA85 -98045B55B19BFB7D18C05B0216F5A7B75167E7866537F3F8F6BFCEC95B946B4AB1B0B015 -E45ACFBA6F4E24FFBD0FC639591A95337ACD84FCA6A164857EAFFF41D00138A582E321A1 -D6205B3E73E2A55882FD873FDAD0F9D205D47F75055FA3863E5210EF6A56F8D12397E3BD -EDBBF54C8A328E62E03BE58D301B285E398A7AC55F6E08493099CCF7A70E79CA81E275BC -86805E22DC3126C98916CC09B06CCCEEC5B66469CCB92AA21B71A49A2596076818B17ADB -301590C5CA8635CFB881832F8621E6C15EF5D59F20F75098FBC0A7E79690CB5CB3F746FD -D8B0A8B92AC145E9303ACF6FC91820119325FF5D8BEDA62446311A73D89739E628B907DD -AD9B8CB60E076AC1092DE241A56495D0C1A5EBC43888BB8DD087BD6CDF38E1DE93630923 -CD7F57AF1604A42B70D2E073935E66025F44ABB3E8B620E065810AE1D2415D7A58175D06 -B7CB4C211499F9F9EC43B92C3E93DCDF03699D731DD288C1651A62A25AA9BAEB1B79AC89 -974C233D6ABEE67B4729A746A700348845A42953CD858ED53F385288ED83EC2B54C2F416 -3D4E2E5011485D9293567429D4BA52F1F4CCCD80BA8B59B501C629AE567F24C3AAFEAA0B -4612ECA7694CBDFF876C3B9B5391D6EC38DD10166C3CF3CFEB02DAF1EDFB661899D3EBC2 -556EAD791F18381618D14F7B7B115A35DC0E8E282B8D1B4C9E68B09E9C8589837660444C -89E477BA7BD0CDB39EA9FADEA33A9990458A06660A30EDB737BD11627B68DF9445A34D4E -4993BA9E24CEDF0FD6955CECA5C9C79A340AB31096FCE9FFD84B2F49C8D504F55F413860 -7BC83217782E1A269E662DE79C67506F14AF71EF7302282256C1894AFA5DEADE51BF4222 -F2D0F1F4FC1EA7E128D7645E07941187D5CF65EC19667F2D204222C6958BF58525124ECC -17C02EFB44881DBFC89A8D5D73A05295B71AD83BD9C54ACF1FF0C542D13DD9CD6957078B -FC5F8A0BA938AB3466F44919BD38C5A0B14E899208598792AC43F532D41C6B8C4393DBE4 -472B5339C02B620F6D49C0B0BA93BEAC6373539881206C1F8E5A0F4241D0116737C4EE62 -575A47D79F1DE2569516D24FCEE9B7829CD545FE71D3DAE6FCE4BD780437E597F5849135 -D69B7E51E2D6A83FD3A8E67FDB1825D2A56E4BD7D6ABC291D052997EEDFF0DD618211607 -1D1CE4B60708315358C989BDE51C97FF5F2B2141893287F822D6AE440A811FEB93E0E600 -AF51552FE111FA4AB014A89EF562FA552A8CFA6E5CFBE95D81B7E50C04BE883DA4E460E0 -83438DF33E15F8D759FCB651B18357B40094736416124FF1D59B4B7BE4940CC5875676CA -EE4A30F059BC59596E693595CC889B2627B3392C5EB267863CB753908FEF7712BA9ADC4B -E47B18FE8807AFF106669E8EED7E0DC5AEB3DA3FFD8AD8D8B841626B800B5B82292D8A56 -D5E9FA394EB1686C441CE523407401BB4044C4C5BC448888BF122AC6D703AD6333EABC52 -C999312CB3E16FE4FF2FC8859D8662CCD6E35DA8B02BD22E776020C3BDD774E9A24EB72F -7231F1B9B3A096E4A47AF15B4AAE20946F8358BCAB1D5E3FF566D361508DE82D46038A28 -BC879A9E75016FE30A8AFBCB1F2ABDECB4ABA14CAA2323A5DA6C57A712EC6CAFB1FEDF0C -235E50B30127F62CF88E77362F6CCA0810E29B35EE5B7BB29920BAF6FFAB5EB3FF5377CD -A310FBD9AF79001E8583748164CD7C4138DCBA043B67CA3993C385B9F054585517E4F73C -C5F63F46F78235501F636BA4BB41BD0CA9BCEF79F0CFBFA446E09EF8C6B915AD718CA59D -B97A78CEA2195C968842C94B36EBA1F3DADE4872E3FD7542D6E477EE9343CE5F801BAE59 -CBE5A2F66DA2177389308B526493A523A9496C7C928F021542A1D6676CB3207979AFD6CE -2E4B37B3E3621312782607BE9F9598D470564F6C3E502FA2067C1DB36C0928D7491F5119 -72EA2A488D3A4A0BAAAFC021FC89DEBE05D7E992122A5887ABD7C88AAF0B12E3A0E6457D -E7BDDDAE5C4449AD3D0EBC9B0BA6C5A72C2EF5048238A8595B33F570FE36F1C9A3ADC38A -1EC604428BECD165520FE81172BBD2DC01EE2A923F88DF8A6CD992DE1875FE3C122B42A8 -2F4CD38D5336DE782586385878CEF7124AF8454C75E92B4AA8786F40B0414497A099F755 -F1BA0AB892066BBE83E472880AD336EA7012100B03D06E9BC9904651AA7F93B107EFF61F -6A2F7CA20240BF1D3E83B3256398CBECC74F8882E40B3E10C0535ED23A8214E19464082A -DDF3F590F9CBB75F06820A1DAF1DBBA19CA4D57B7CDB841980BE2E879E8D83E74FBB3EF9 -7D644DFCA51DAD4F342534160CF07F8822082DF31D8A6282711D849DA3F583B32ACB48E3 -0C130028571B9565E61BBF8253E97435F60AC0C91934C5A3FFECA5155B25455D59C18CF4 -66AE7A467EB5799BF2488B1568340F368267625F1ACB7FA34A8E582B0528FDFF256154C2 -F4F2D0F61A03D13A58E01548646D6B4659B4613E83476159E8E597546BD1F7902FD0DFB1 -71390A36A8389E25388391BAE75567201CD1A6225F774AF5E3132222EB969BCE588E1E18 -15BC60934C8E132627D342B1F7D780F9B5DC657A975387202EE08E957F3D123B4C115F71 -CA9CD0A5ED37C7626C8596E9A4DA7FF5A114A85E545F89C3694F3FB28A5224CA6F930538 -9B76D686F13C370887F75F88F50C98974857520DD8806736D034C188403234F1CEC012A1 -17F9DC0B03346D88401DFEA09A28944CBDF75E79EC6B26F204CD6D4F7CF02FB3066E7085 -BC35AD0CF7CF47AF38524C05B13E51A8BECD2B4EB4E9AA3A7FBF08A1E71A61B2ABBBB10B -714A0E46FFDF3FFEE96BAE962C10B8FD824E700E3ED94FBB1E03AECF77CDF572F623ABF6 -9D1AF511F65408CCCF16BFB2F1A0895D5CF069A78A3ABF523D4053F8A4F6DA0F3C6247A4 -5F2F6F21C964B50EF4615BF41283B6C655E55397A6FBC23249D306151A4E5F57C26AB256 -345B45B3D81AB1AA64C80F09C6000ADE9948C42E03356C0377EE74E17281985B8ACBC958 -EB9289159091E36937DF725063C434D30DADEDC3007066C7302D0B12F8CCCDBAFC57BB30 -261918964E42F08D1345D4018BB1E84E31B0F57210033C0EF479D1ED0AD35CB7178B173C -6AF59A4824FE5FAA88AA847FF999B3152F7C12F7258F7C5DA155B8BC0F166D9B6AD20188 -3154BFCC9E3B9B267FF8831BFB906C6CBA7D05842E95129D60B562678A322B94BC988601 -E8E32A6C507F02005BB1CB8B220A6903B4F621ECA9FA513FA4ABA25D107A39ADD5D32593 -5D8875831F02E4556E6EF278C01E8A7FFFFCD1D5EB4689A2DD86D291F473120B984218F7 -DBCFD434EAB3EF19D1A67F4EE9D239FBC0BAE239D0C634D29950EEB6FC06F0481A10B225 -7B80E1F0395CCE4C4291A54A5154FF1B0896D2E0CAF112D0E534F014FCD73082FE9E8A67 -ED23FDD4F7C37651FDBEDF999D44D9BD7D57EF6038598BCE94ACC2B6C0BCE60433F834E3 -524E3FA6028B6D5DE7631B10A2BB1C77BAEE351FC7373C175D3878502C2DC5D40596ED3D -8940052DCDC8EBE7F1853D85B06AF9114FD739E558F0FCA26F3817A990605F9C9807F900 -A18C71248300BCFD22D7857C390431356FA4BF993357647D9A094763D668B7908CA93E2E -EAB15E34E48B1EAF8082C6FCBA7DA5E9848B33BC59D6B50C9CB5108F3C356A45A854338D -81881FC425875EC59D361ED95CE99FD7A279A807671C8141A000A5419E8B9549F3617114 -6077CAF18A152CD041F94E113DEE2932F1AD09D55359B7B39F4771F15521DE58C311D143 -AFA24A92D36037968DED5FA71402B34442F9820F31D1C608124C2B50EED276FD06CB04B2 -3D0579FAC4ACD7C674EC5E6527AA352E38B35B14FD647E645CBE09C5D3EBC76D35D02820 -C91A1E422057E99A86EFC9845EBD5735B8F61A957B44C33F7CA9502E08F39E24111E73DD -7C5BF59212BE06698913B89C221944A9E539B1E79038B3E2D2FC40DC4D9115256D8BEED0 -343FFE190D6242A3054711C86A20E0C4DFE2C270375DBD1009A6ED640D505F25F475E0A4 -DBC0D9840A68F2E657C1AD8AAD7A260AD74DFBDB32B2C6CCA9A49361755DFBC09935041C -BC531A5924CF763C29DBE8F169BBE77A261B1DFBF1504A04CE7C3EFBC0E36DB1CD256AB7 -F40C272E2C3C217779A2D45E1A33E504A32183552ECB71EB562040C03D276A91590A286D -2A90E7A292B21AC7FC70082F18903E2B3246A66D95C47F7FA0099524F38018566485DDE1 -4FBB810C07BBBC487546F0C2BB295D1BEC35D797B0A6AE0616ED8465BBF239A46FEFE3F2 -E20F85E3E383C16D6F97044B6E4E80DB26953D609F8AE0FDDC92A41FF2A7EA7744585B51 -27F7D1D756487DF4D75289DC3FB822A16E1A8063D5BD6B2D7201DBF78BF4A34FD17D8133 -F8662DD9704ABE347C405D6111474E69C5F22552E4C6EBAB4A6537B46FA2EFADB55485BE -A4359C8BE0B2A696BB946E89A5AB3EC81AB9B584E6EC841BCF4192EF82EFCEA357C90039 -3AD2705B9BEBC894E42369F7CDB749E1A174EE4CB77454CE86BAB1B631899C547321C9EE -0499149D87F3FF59D13335D54177268569DE1AD675BCDB9281C21ADADDF54B32E62B3EA1 -2FC565A670778959ACB4C4A36B6FEB86B174D3FFB0B2617B2A84EA37BA5B4DAE6B7F1DA7 -36C01E446799F135BD5573B086D61B5D902097E93C9460E586BC8C5FB863507F7938B02D -90EE19C51E00DEFF3764A3483F52777644D3F20C0B99A8807F25FD6080373B09C68B45A7 -BEA9F0731DE751BDF4147C690A9E767DB679A8F51849D094DC1E8209EF159084231610F4 -187ED2875D1E93A2C977C3F1C86614B60F81B31CFCF2086E91C3A09456F376DF76F6F4C5 -6F6D96CA852C7B749255150C5C16453A84B9FADBBF40273B18FF8E61F309B649BE8C8BE3 -75F739C6CABCC9FF39CFAB9997E77507A7EE5D521C769F6A9A03472C51AF83D6682700F3 -9D1114A04992A23768D8547D668A9C1302DFE2A2011E3B0A101ECA1A41A79C2AD80DA863 -CBC5D77DB3FDA136ABFA30603EFB15F99F848F18B2B55D3038E7E7F6B691350D3C0D6766 -4D0849BFE0CE481B1B732326AB02CE44BB2C15122A57D42264349E72BD47BE006DACE8F2 -A0ADAC696138227F9ECFFABC0466C2EB581211CC0A24061CDB43FBF37A4E8BA1434A35E0 -2AF6B5914D493F64328F8590CDCD38169368F805D5B64AC0F4B996ADA8879157AA0EE3EA -605553CAEFB6D31B01F66016C64F7188556D66F185A29164AAB1ADFC1FFE71934CEC127B -147F36AF98AA9A7877A7188EE0160EE26705D1AD9B5F86D8B6BEE71C1BA240FC2A903D65 -0C3C69CCCDDF00222CB01141C0F03958D9BD5524D8C31D4554073E2DB0169849487244D2 -2A28987A82DDAA0CD060C8A8740F1A11509152B4602A6D0DDC4456849FE5E402F9ED88E1 -DDF8E5AD854B5FC77575AD955C95BD033D69F4A2D2EA6B6EF587EB16ED3E0F52E7578FC7 -F22324AFB86353B1EA4C51179440F2CC64A37A92BDE6A88B24104CB8EC78C660A40E43E0 -27E0EB69D813A3C29C9C3614E6408532FA474CF9FC5AD498F8335DF4A04BAD633110405E -EE6A5E40D6BD7E23337B1B623735BC3130720DFD1FD1A86C4A90145EE483728278C48E5A -CCC333FBE140DDBE0A28168D6B2BDB902491E0340DC052C28FEBB140B85BF1FC4DC35582 -1752E935381556DFE0A1439A0BC810F9527331CA35508E3D0A451B3D285D37A25F1F949B -9C9ED1BEF8289E5AA1A3BA045CA7CB647F1C1A528D85938E04ACB1E7F08F5ED3D18C9E86 -7AB607E8BACF757C98BB71878979DE3862927977A0CE431174DF24872B21988D6AD35B07 -42C01ECC82FD805CBF22BA02CF596876EE1E135254A8BB6DAEEBB2BFF9911EFD7C3A25B8 -55B95EDAAB6F25A31BB29BDF2B0FC3E0F4479DD96BEF601E4DF77A459B73B69A9C55A87C -D63851038A7ABCC475BBA0365C4CEF17A742D1371131397AA139032620E16D89B3BB7A1F -7B018BDC6EC29A8FC02D6C6E943EC1B1A718DB6AC51BD7C5FDCBF2BF792CF9ADCE89D130 -DC5C200FE8625BB13A02F45E06A53B7D186838EEC83906E8298CF83CF5A28EBA36D67F56 -64EC006E350266F7D2C81ED295F572CAA52FCBCA9B605E421DF4E9393D1E775838992B7F -63BA394188312C75E64F9BF0217E6E31905945D27BACA0693E0660563A0BE2868E22A604 -C901BD00FD8E9088C4255B2583EEC2417AF39CBDB672845EF9BE24901D270059E7EF3C99 -0BDCED89538A8CCFA5A0BEBBEB671720576DD349566E591ED760FBFFEAD66148F05D37E2 -0833FDE02A4E85F2CE08B0E03DCEF68D454E135F8F07BF93724E0B7E0FE769A0AAC5B513 -F4A763347B10B50B88792E1CB3E6E948B75A8835DBCF188436153A2C2B44CB18D8996FEA -75324C8973D1F0E4A3942E2A05E43B3C4AA46EF7B54039542193CF76CAF775DFB15B31F0 -41AD173F8821FDDBD7275618B37F2693A29C9A990B7BDE96FC532242929F81B1B61025CA -717236C5D41ABD690EC853317D21B20C2CD6E9701202305CC34F5855934E03F1F58A0D32 -D73602B07ABB1904173E09D799769D7127B665537FD6FCBE10E725CF814B83475FB8E443 -027F490BB8488157A4208D031ED3992E2E0EE89C5E19AE11B16E95452F86B04C3E233A13 -02B300C9A21E2D920B49DB479AD034860B77C8C1279EF314FB4073B6077625270113848F -BFA4C6D1CC72D3DD8DAB5298D5A5BAF7E832FB36B13875D241286EB56495FA62909539F8 -9D043095F5B32E10F59B8204F0C598FCD78FBAE872D833662FE913E595E3A2073A41CB74 -5AF21AF5790DFC9D3CB011FEEC385B5DCED039630C8BEDF0790C235CF0174F3DF205DFC9 -A621B1A32351499845F888DCA445879AF5871EDD1572FB6B07B52A583A288434502D0333 -FF418B95580F4DE9B2F5BA2906F074AC91F566E5E394AA7695A161D01DEC146BFDE0448D -E6DD22D7A3C0BE7D02A29EBE15AD1F302299D673379CA3C2E500C573B8F81E0ADE5F59CB -BB8E0B5EDFFE4797C763D4FF7CE0117EE17E80CAC2A3EE7840C03867DC19B51885FC6ACB -FC0EC204489CD1A6ECACA8112FC1603C254E40049812D1BA5C561C1224BA56B97FD66DFF -C43D96FDD510AC6DF46A9C7AB22FDD5E9318C4A5F598E34A3E60989577333E2CF7AF6129 -FAEF2704C1C3B997691E484675D62AFCD81F86A6EF5FA4DAE7D4F690BDA5E35D0C3EAB49 -A377A2A0B6019DDDD8E293738FA7503120A91AE095F613B3F925BB4D433A67090AD6AA88 -37979DC1DBE9FD46CAB54F1D9AB5B9E20CEB07AA93346801BF8EE52977FE36EB1CC51587 -FE57ADAB168CF8A7B95665F65FEC3F3EA5920401402D8D22A3D4000DDCB5D06C5A901430 -865872360B37C1277EA4C31B32C16C9EDCC6162049204A9A028943915A7753F72452ABB9 -901712C494B0E175E27B99F6F34A232A826ABDA15D82D4FD0AD88BA50545A5D9A4E3A90F -51987EBFFF48CC52D8E7FBF1121DEDE46BCC71F7F3941EE02897013189FD60D9F41C2F3D -86A0C693DACAA72D68404118DBE5524D07B1D2EFFA1F54EF0D0205FDECE28BB1080F2112 -AD17E04A000C581BDBA02571C412DBC9BDF10FBFDE1CB328239362BB008ED70FE062B84C -E93030327374F47D62D4740DFD23B3F1FBAEEC619ED18446690E0339D2BCCDCFE3DA5D5A -215224657F8CB4587553B7344A4CCA78DF1D955679F3C308317D8EC48269D5E1A9917E0C -46BD6D7284BA185DEC43E31CE9B148CF708C722AB59CE7429617978F678E7B42B6DAFE8D -CA1690208AF9541B8EF5C8057A459A6D6BB3F0410DD1DAAE469A71B7A416CACE53E775AD -CA8787E88CEE3F57834B13D46A5DC1215DDFF7668A9CEC79FBBA1964F794F71D7BC2567B -10AAA3EFBC22781C66B3C89B7973748CC35978F844A5EE16CDD95BD4AF3C6C63C79577A1 -20B893398A583BDEFC646E917250AFE307E1FB053C3A8EFB26CD4F65D58DAE816549C502 -DCEFE24A4DDED6ABC44FDFBEA9A92B2F78F20710997E683F8D9BDB7C603A9204CD90E932 -7ADF5B551419354EF67AFF7225026D2703874F841A034FBCB33267D8794C1C1BB9B26F16 -04BBCEE30D6D2BA30AB3F8E03E0DB4D57190A570686C420FA4775B5F8D984C4C7505DF4D -309ED3BF16BB32B62241928BB3D978E10CEEC6AA72A00F786AC72F6ADC5E1BF1A234B6E2 -06FD0F6DB21BBB5D0D800BC43197CEBAE8AF770BBFAD4E41488AE5A8283EBD2E58BB4BC4 -5DBAE530D05418381BB610F5AD1AC375681618A7913CEFDB93815EAD3006729FD89DF4B2 -39E5DE1DCCB4BEC942EDBFCCC34C46704F5B31BEECC45558BD2E2DF554E6130112161BDA -86C779B47D9E79EE1A6C41A722F1C8710C5470F02B98B6A102A962E456827E7A8E9C2527 -5F9EF9B0D3420A3CF1F96B798CE32F47C076A1973AA532ED91B44B6627D5ECDB94E488CC -A0E54247BD99B1035769E7DCBC91BA655EBC0576E42738B7BAF5F7A19EFFFB78E0DD567B -51C9064ACCF00AA9D6AA5F8EE73AC3FDDC1F501DC67D9257629C767B9AE582A1BBEE8C0C -1B4BA4D5830FDC6C3A3D164EC1B30B8EA721ECDE61AECAF5DEDE7CE02F336A22E302D711 -AC6B83152A1B41C67A5D3EF767153F5FB882D0448B39B8507ECEEA86CE74EAACC8AC3E78 -E20FB23FD92C81D2EBD9014530F0AEED1595039D94AD48CCA8BE1C77233A9AC19CAF5A45 -CE5E96C5B2A962E8DC39339A2B10975C18C5B6162226221AD8BB4307F64E2B2C4F01FDF3 -1A6DC4966C9D6D2E3D5E92F0D21DF7779E35404C97B632DFF66716FBF8993294CA6B09BA -8F7F840DAC99DF3D75413A0F417416C7FEC264D6CC58355B1290692666A47E47F0BA3CFF -5DBC8EE2F4FA068D8059C1CF153C65BAEEC4F8196600B9D5C09DA14C8D5F87D88FC7DFEF -B797D33E292D4A6201AC0DFA4B50285805501F3AF1E2A48C3493FE2DB06589B0C045B0BE -5A2C5601F2F4644E6FBA9263BAEC6008760AD7833187540BDE0DA3EC762393EA778DF052 -BB978B708C7A2DAC5D62B2B4BC6EDA8DE77E548366C34411463BF5DACFAB701D0F64E937 -F5188E46151F8D47932243856F3727904404BD99EFC5F0AC5DD895CFD4067B7F338E2DF2 -BA69A84D26FCA6DA0ADF101669B9B502DA75D202F863D2AB8F821937F180352211F24835 -707B5D821DD71A74E4B9562370F2C61A228FA42F12983E32C15B13AF9F2D59CFE9FFE1D2 -4412F40E1BC6D90E8D943DFB8D5A36EFBDC7836025D6193A8B7AFDBA1EC3455F2EC95A6C -BCADD64C7D41322C98479EFF511BD4BD70C06EAED0DEFFA2790649282EDCC5F3ECFBB70E -7D62E1184DF3A46B154DD1AED7BA74CA7841DE08B4DB92DCF4F1C2EA54738F2BBD8A7B70 -0EC21D05AC8650A7F1802EF604A9DE97E8BCA273D26D97972ED752E3E9CA7D3FC11AF401 -D01398DEF5206AA94D0A79DE65F02C3E9A02C2DEAA900017DB7C0AD39F93BC2EB27F2E64 -3BF0FA8AE458C73B62B7709AB58D8AF25511B5C3FFDC5F45C4DF09400AB5E69054AB6BAE -57D427BFC6A6A65DCAC262E99797304D660B672E72BF8BEC5FCFD074A5D1E949634D1DDD -3399A80D693E3494DE56E1D0CCDD217FC6C6A2F4D6ECB7E3636E438ACD4E6B7166B27342 -2298824C5C547423EEBAA5FAFF2FF810A73C2BCC057F7FA1E96F21D665D377F727CA2FB8 -93307ADB216DB69824B72312242DE1105C4D7B048476E64C71F4C4659F084916660CD035 -85B922CB2EB7FE0E940A7A122313A85E0AAAA7A2699B4D1227D8A2F8F59B8FA5F6CFB63B -7ED2F9AAEFB6A71D186815A0CE5816A787E25288A9CCBCFA886423F776DE6C09B17858FF -CDBB8A52CD54BDDA98CE2BBE25849A2B4B113B6B7044431419512A00CBC8E5703E5A4A1F -954BABB0CA465884524BD70CE67D6FC9E2BD7E0615DF712866788A17AF26D842CEDC9EEB -B0A3061963958B9140BE41E74B7893265FAA57FE53140658DC931F0B897D0E857AE3A337 -F04D884ABE8D8E1DF1632DCFC2BB65E4BB2791B215957D5EDAD04A4D1F4372414D26CD68 -3CD89B893EF0CA895C2D36FF87A1CFB2E9F1A628CD59432046022B3E44BF2B5D5DE76F51 -5165FC2EBB07FBB23F262C07066D215DC73EDF780FFBC54502E57C69DDFC77D9896D3824 -D4749482FDBDEB40058FBF293BBEDC8C7AAFACCBEB160334D29AA7F61F34B929F020F8FF -17CE610B0E0D1823DF605B2E145C9E78AF8396E4AFB267C7679ACB0B7BCA258F7AEFBDA5 -E49F3C3A17F0290F9DC6C5F51F193E2DB779CF8081C733BA0D7FFBB9EA3A2FE3ABFB4782 -B2510CA124ADFE0BFBA82C46A0BFC430C2CFBFE41DC3DFC070FA9DB38F0D33982127C8CF -74AF1001B096849C8A518B6CA05445858EF78DE8B3B6F3019CEC8E10775EF9842DCB56AF -982AB270C89644AA55B486BCD8616B440105FA6C34298422C994EF6C30C1574ADEBC0F43 -85029231FF5FA84AAEFAD31442120059A7A1D24BB44D14844A039F366ABCA742A6279402 -7B53DD4431B167F07AC0EFC75ED8545431371D5FEEF2E51649D1AC862FD5E8C18ED86FC9 -9639B861D2B502A2B5F75062891ACAD88D39729CE2CB515DF3C49413A974476A515E3F15 -E071A6A82D5A51036FABDCFF62659D0B54DC1B9E68945E87A4CFC0E4D285D23BD9583126 -4D2B4E4515A7B34F83A077F848306AD71CDB2B5E6F701DF84AC82CE1096B987E2DA09727 -CBD0DACE976AB94EE6B133C09B787C80F275DA36605CF5955FC706A332E3140B43AF9C02 -9C23C489C5C15F77F076C6A21DF7B91E9249E93854406CDCF2EAA68DEA68BABDF5AFB702 -CD9457BC4FDEC0251834A5FE1EBC40D1C8F21C3C56B2558E1EBA3AFD3E0B53AC7793E078 -73F8A219C6057DBF6BC066367D953F44EBCE2704D2258344AD65CA865CAC50085E5E321F -B66E4404028E313876B65E5CCE58DDECD17DE76874030B63B267639147EBDA692745AE09 -775C4CC4C0B44469A01BA55B87913D834952541CC527D6D24238A5CAA83CDEAC1D7B5449 -7B6F9F57E0AEBCC7EE2DF0CECCFFC7FDB46DE41FA6E6D41AEC58E9A2CF359F9762ADC653 -5C52FE93E9FFE3225887009B596AC2B29336E0EEFF29738D4181D339F0FBEF72D29C750D -FE1318CA42C5393D639E7650AB689225BCE2072C88526B9AF5B970CAAB8331D89B888345 -BC5E839314B671E70CD895F56D945E8584A7A956EF105BCEC436117D4BDB3791A741B7BB -5B2F0033241EC02B40B75BBAA4C99D5F48FB370569C6E42B8747476E405B9D683D2FAADC -7C4A02FCB91C654F47C80AFFEE61D2310619E72C36695090BBBBFB5E0B7169B96BDBC9EC -4E8AD00B36B4FBB0B849CC04675277733D2FEF6A6EE9C83BE4900D02B95B516DD10A53FF -4431B3BE8C68AE823BA121DBC6C22470BEAE5AF5441CA8208D3DBBC3C444704E7644F8C6 -11B0890325648B2EC17FBAE41012E7D49566E5016D94336D4C701DE2805AA001E79C9032 -C64838049D8D065A171C11F06BE58A478B9299B3A517C73CE84EF38D07F291EDE3535CB8 -D769308C2252C63839CCAC3BC9E8A24E871D90398F3187E3557E40A24FB1C61FCA55BB70 -5EC3B1ADE33F0C6340338B197654B373EF588D43E710869321FCCE8A00596981C49B185C -DA92F64E0A65CD32D9448491EEEF78E4F410806EF4D6DC5F7804E99B87E640CFC46B6975 -AD18A05C470D233D23A20B4F85E8E008301D9763C4CB53A6CB6F380A439DDF64E4F69367 -446A0B57A0E98A6ADD0CF0CAEEC82BDEA2D130AA246EA0E4FA2E8DBB4459D5FFDFD7798F -842CA8BC7458DDAE4C28FF65568617C25E0CE82CE644B3F6445C7408E257FA1791199F5E -711023E5BC7E5AB961E867B06B83418954EF9A59EAC6566D572B4E97B5C6750A49636929 -562C6E0E2737F5B9BC06EBEF9FE62D9CF4FA509A42D192482B878757B319F886FA9EEF7A -563DE61A0BABBD76B9A9FC2009A9049FC6662C32434B6C8F4E410C2F5A146EB951D25138 -47D03A64A453B748A14D2A2FC9AE56A9585F1E6725ECFAAB26E99418F8F2F944AFFF32D8 -AFED5E292F40728B8804D91737AA9CDC05485F9F7031841B12F431355EA522C674101B83 -09CF71D8D27477286DC05428F7E8443EC7E4471CF97ABB18753524A79A1B331CAB1E3FE3 -6D19BFE3724777670FA07CAA0A501E1B5524E62C15D0B888414300EAB0DEA137D43A0B70 -FB6563163E0AE68D160B96B4A71817DCBD24BDD8FAD76ED2ACF5E0CE1DBB5AD9A1AD4B98 -997987FBB15346F93053314D53CF4BA6A9FC6B3EEC4E5DE20393D00A6D69FD55B98E3045 -C27469B46C39C40B0F5BF53DC1142AF67212F469FE7F7334A39CF19443C1243FAF6B05AD -1FDC50457F06D14F119EC724269EAC946793DA2CFF0C1AE736320C5F01B51F2780277D4F -A77680C81BCB7FA34A8F4F63F07CC619DB4BA4AE94420E532E6D06558D8B0D9299DF88E5 -479F1C82178C7FDB90830CEAB719A0EC4DA5E66DE2D4B97F11113E0DDA557353222E6329 -8F21D925AEE6FAF6121AD7F2E7F805F88901E53E353152729A737C197937EF857257BC70 -0890EABC66A8DDD6F4636DF744612B2E744BCA5D376D2CE87993132742B66FEA1AA5A4D1 -0A5DB79DC3EC04D88B5B5CCC988AD647B7719AFF1F2FDC55B7DD113655F19E6D47D2CFD7 -B2BDF4FD564A6798D3696B5BAD5F7A3E8609B9D9D0DDC4F32F2798052ECF1EF3793B16C1 -F489004AB008CA729064EA7193D2AAFFA934AC2DE6CB00FFC86A54B11426A97A5E161899 -4DD7FD85144308CC4C376272E86849BDB4351A9CB9BAC62C53FF3D06580CD2CAC229FDAC -CF8BABD15E1D7D81A2388597FCF2508AF5F8D189B5E5A86441E73002DCE94CF0DD953575 -470ED6D6AD57F62FAB4EEA0EE65C5C2FFB9FCFD5F850DEF261314A155A18AAD1B47EAB24 -FB7C0408B1C3DC80C6FF2D6CAA3348BF792803DDBD9258C694FA9A4FEB1D3BE1E22562D9 -46D3BF713B8ECC1532BACC2ACA978761621A122252F5CF0A658C06EFFD96B39B7EAA7C0C -E691FFE170A91871B6DED3BAB734E733ADC503B5AF97D595247FA80B81AF8ED77F99B192 -0731917779642446DA30FC7DD5A5661F9268302D2B812D750A3F144C89038A6F573B0C62 -EC227C3C5970D8EA34781CF49E56E1ADF0743CE23940279CCDD27AFB7BB7B740F579D9FA -B7BF912D52F35DFAA22B7D182C022E2FAB7BD0D90F7B6A03D0D6EBA225C70E07CC00F2A4 -599DC63A9218C17AB08927C0AFE57C6D3F0E7E2240A8E0C3CC6CD9854BE51B7F69040BB4 -ADEF206D2110DD52D5746D0085D583E67DF440125C26EB27BB8EC054A2AFEAAAB3139B53 -653E4C82D085D35BE137B6E30FA4C81EB3F968B12B2F4DB0AC653BB3E13BCBD9994C47DD -99727A7BB5908BFAACCA7EDEC566AB58DEE6B4CA521699CB6C3C7460440A522145347A0B -9B572D96702B497B8F9C3EE612B3445781F3FA7AAC78DA64950EFAF975623382BB6FF724 -3B1078C354E6F4CFE12BB8F374100D8E9033460B5911D4A18BAEE611272EB961EDABF97F -F350744757DA2435292D03C54CBA103EB72626EC2680077B5DA99E248BC7581F791F157D -0F0A359070827288F6961A8B42F98C948AAEE02CA29166EBED6F41CC2B14274CC8CBE8BE -70EACDEF5DED806EBEF4FDB794A1A9EF45E6BB01183CC4058DD5D6BF33CB6A195DC97AAB -72DAAA73A8922281DAEFEE6EFBE9E66F1B4C6D5A72830D9CBDAF7CC287ABB0753DBA936A -B515518C6C121E52BD84359EC983A7DEC5E395DBECDD837788A01387CA0CA84F6984A9DA -4D93CB543AA1101AF32021F2D2530300C6A16C7B27FC6D98E8E192AD089E9D10F10243A0 -1403222518D2B80A79360F81472FBAAFF0348BD16D8AD6888CF4971C2B61A8DA0A469009 -45F508DF6DE8F7A061EE437A227887D1C24BF05EA03A0B79CED06821B6A53F8275C885E9 -F5891E8DFFE67F22BDFE05507F478C90D8A90424097FA970E2B5C88820520C79AD9B539A -A10EF6701499CB72F33021E5066D86EF1B2AEE8165CAC5A97E3C20E24229C072A41B515D -3B1AD941352CA33927D63A7B0065AA432994EF31520C80F4FA3E68CA9CA548AAD31A64E8 -D383F59BFEBC0288E76332EDF7DCEDBABB3E068DF02D19FD7D0FDAD1BE7EF4947524554E -EA87550C141BF3EA6A20FF4834D2044AC7733FFCBF34EE678ACA19A3A8FE3D943C2B3505 -242111C2B6307A00989A20E8CB7E4267AECDC4E6F5F9CD70568C5AA8A4E899E404C7CEED -9989C788AFE029340B6A3D6376476181D19844598ED5CCF1AD2CF4A676FBFD17C0EF5BE4 -66CBA814647C2E0B5A2D85F3D3C8C16242848ACC70063D67918F800424305F2140A76BE5 -AC8A5CE0E32E26618F308EA578CDCB1CFED7CD12AFEABC6F6A236BE927BD11AD0A961943 -56C174C7881373770078D3D9BDF23CB838C5D64F923EC5831B791D5604931A8834AA6D95 -A79FC44C7DFC090CBBCB177A42A22E6897CE9376D17FE945E1E813AA473CC1530A7A834D -0EC298E73517624640BB35203A089D9483D047A87CA2646DBD18EB02BB9F0EE711FA83BB -BE07B54F1B7AFF9F36575BA99F81F75326F59D9EE26D4E4F642004285B6BAF192396F4C7 -731C5504593DF687B274EF80F27105F4569AF2EF4C5C5E88D476A73EC4444ABAD8E9AB3F -950C9CF21BD78ACE310C328F988CF22A7EC165E724DDA3F25D403B28A1B61F668C013524 -32458C657E8FA6CBD2E6E91106AF5B9C8EE170FD1FB323404E4101CC134FE8F0887AEEF2 -3013CCFDFFDCFD5FF60897B720A00204E8544F51735C976EC497BDDC085BD209F756C77E -296716650CC169558746490D024BD14FA54EB4E0CB75E8E91FA2E256F3DB4844308C7998 -A0EFE04FC6B14B73A43AE16D586C6683520A82286BA58D24ECEC212CDD93D2810EB4856B -13D432AA6CDF05600A12C7FEAF7B990E9E8CBB8AAE023FCBDF953180AF6913D0DE5B8660 -E23AC2B170320467ADC89CD584E9A366F063ACDFD5FD44E5BAB3B7167254ECFB222AB3FF -2187E43CBA6FB705317EE5DAA8D9F5DB83957CD64508A61EDA6B5D5BDEEFB2C6214DD059 -8AF10A03A486022A8DB111374E8442CA13D467BE84BB1001E7B9DBCAF50F767330FD3F62 -A310CDF232600D7DFAD998A0EA10EFFC49A702347E6C23BE9027C2BDE2E9A14CD55788CB -0C8B4891930AE2BB346CAC0A2CA7C904D2343316A6F4202E22D4E448049B18EBE76FE3D9 -7EC95EC99264B6F938108A36CDC5C4D7DB364F89E9371EABC18B1CE08CE519BB2C4973DC -4C0ECA366D8C6CC07A2DD320B997D5987297B330703D2A2DFE33EFAE86200B750D1A2D2F -762E43A94523A2136492B440F6551374F3591FCE4D37F7C192C592133B3315D3435A9DF0 -F2F3F621ADCDF53F9CEB8E7B332E701AFFF13641C88DF71858352BA45506D267877FDD8E -BEE4E80EBF692631C7C7133012E4CA6082B90533BE3082C34084385CD16C7A4B7123EDFB -66EE5F20C2C66226542B98B437C6925E7CB65C02F4C659DAB78FC4ED155C312DBCD5BC7A -F588D049D52655E57D3964D3BB713C6F7B33296292BB6273D626EFDB0CC6E0D346F8383F -315C275FC9FE745C9CC2416F3E1B896CE9D4621E0B1798959434E380E5672C9301474FE5 -C50B8344DC9BAD4ED7A57F965ECB1F9DBE601D2967701D4C083529B6DE730D9940D03381 -EFCD0F2E5632CD6948F1C7D3B624A248786D69E581B916263DF67B7AD6C34F034B3F48E4 -D26F64BBAD4B57E5E3E4B11BBE3EADF529E0473547DFA0781ABACA0F03AEAE3C14884A2B -47AEFD5174D2A5F45530A8C9A0B7C66DCA9CCB84AD031574B6D3FC3E6F1B0D794D061CC3 -3FBF13B5CFC934C0561396DC77DC2AA6FE3AB54B6215EE21A65582A8A9585AFA2CAF8194 -B3B887EA4C7F71696F93642371258BDD862C0CF23B819B194777DA8503A584CB26B849F9 -5CF461F3321BBCCBCA5DFCB054837FB3C288ACC2F394158F2263A8D4956ED155081F1A93 -B5180BFB3B694BFFD214C63D1CC0AC82521BA89EFE47A573D8FADF7C7B31CC98ACB47E9A -517CD04C18F8A8116592704192274FA9D817D49AFF1BF2EDA8273B04A86E308F51336DA5 -FC70705D6142F000986593A7BBD524A4A03F5A1831E7434B0700B89EC3D45BFC3CBE0841 -06E053FB46BED0AE359A76CFB808CCB22DE78B1A88415AC79249BA9F9BC5BE2C3041DAE1 -9F6B46545F534821E0BF703A6AC49F4DF2D24A4A90AED84C71F87799BCC37ED9FEADEF35 -97ABB6D731757C04C00002C40F34DA0F35E39F6330A1651F89C321627DF1D1289C1C6782 -35D205CDBDE6BE95F64A2510AD7CE06D51BFB98E7AEAAAD4E2AC15E631BF136E4082B01E -409BD78C495C88D3B62E3112B7B72268C4B1BF55E4FF2EB726ACD3A99148B0D0DC516294 -1E9B8C97C861AD1551703D9B1B17D1613F8BA6917B319BC2910728C5B46EF2CF9E1A06E3 -645C52A5D4F72494C1C18F858D211D2EE721FE457969D9A9BAECB4A0058780025142153E -9B94CF1B20B717D5F9AC5BA9271B4CD61628402FC3883ED1D43BB2EE931614D871E7814E -5ECC895E6CD9BB8A27F55004E7BB3E4A09B1D9C5D6B49140BA231B867F68F3A3C9981BF3 -9D9BCDDDB6330C8329FD52B1F1B6A7E392AD3EAA4D8E63BF3A895365FFAF54F297126CA6 -3FC07DB3763E7D2B79D2974BD0A380AAB25DB48F06BED0CD275640E5759C966A22E2437C -11E92131BDDA040BAEDA876D8861FC551F32591621A14BE6EEA790B77752FA636B8A627F -51428CD373F2ECC19DC714100A200E098E262FCDDCA6328A18B060219FF495AD46AB95DB -2E33D5A697E5D25CB5F0FCF988D62C9AC53E415735BF0DFFDEE23ECA22528B3D66DFF37C -77EDA16945BC694775901CFA106809ED3B59312B4A1023AB13738FF47921A0601D0A56A7 -4FB9F6B73F1564EFA5F2A31DB04365A577A1D9DF9FFFE6A4692E2ABF7DA3876BA90B7FB3 -168962EB38E03DC5E06E1633947848968BD649CE9B3064CDD5F88477195EDD4018F60FB3 -D2BA8190C9B2165FB5DB5AD79240CFBA8D4B2DC061F5392759EA162CE0FBDAB3D8EC991D -3238D835F27F6440F50942305538B3EB8B4C9CB46ADC7A0DEF82807C277B9CDAEB65B874 -1E3CCA532A619367426CAAFADE5756F0C22E6FBA7CA826E663ED6716308482C957703BA0 -FD4322B105202352E9091B44793A849E17B9D4931D7E4FFBAAFF32D1705FF5D82A878139 -0B5CBB1E5E00A02E80C299CC3C9612FFC9AE200C4F4B919E958039D4628480A7A0279EAA -DD0D28BD5E1D07BC18D66FA86EC9843665066045DC5DEE15146D9B4CEC6B0CA6EC946967 -3A464C46BCFF5451383B65B62D348907887BDD77931996B56645F118E9392215662998D8 -51AE73BC084FF9931D22E5012F6D18ABF618DFB01CFCBFE1A2C53B61B84D3B85A5D04196 -FC8A0E507A87560ECB8E2DB3CA84A2C97AFEE1005F6A44E00E3924527B1FCB8A3954C746 -D6F0E4266940814355AB8B57D3AB85A89EFFD1E384FD8E832E6A846D6B8DAF0C99C3803C -F9BC1CC4A1B611DB8B3B3F1763F6BB877952ADE48CD9BEDEF049137CC2F0D859CB4EB075 -2A1E581D835921533C868480469430E3AE90B9C965B4130B20E22A060A182827628CFA56 -FBED3BE7A4C078E939BD9F79D1A51017DB08B27472B813B5D94CE9CEDCEF61AD4AC1DFA2 -37261EB3360CAA70EB0AEBB1777928B2199791EB0F4E0DA70F0A59DDB0B7FBD49AEF255C -BF51C0F35AE0A242100AB96E0A2B51F82D5413FA7AA2C603F913066AB8AC55FD474829EE -82E5DBC360130AF5FAE5EE9159B5E09ECE9678DE75A50F49EA5C24FEA536658D48417F7B -5DC4737FAF73D41EA93B3889B9FE272D79788E337120691A76D0820E24F5657DF5CF2BA4 -BCE1799E533A991BC20CC52CEF9142186FBFB77E214A4311A243CFB5AD566995DE9CF7C4 -06D4235FA3ADE98D6C6CF3DAA3AF13106D38C4FBA7DD764FA38225DC7C41BEA8E87F6013 -8D320F004E832F52EE5D716F21C47ED0BE801523BB94D9691B393704380A58722C70E0CB -F70EAAF9B5CABA0D298A0152E246CF19A63DDFCE9D45E691EBD404B4EF6F14B3AB70329C -286C3CF24CED4D7591E4FC548ECB3B7864677028CD1073C949F6E334E528D62EB1EF23CD -E94DBB71E289FD419A9D51579BEE2F1E66C0EDBD29A32859F1E5CAB29264EC3D6AD03E0B -7BCA83FE20945CA48A4BF76C1F89B747DDD06BD000373561D123AB04AF26D1A785AB792A -95ECEA3DC6F5E36A143204A17492A6C3C9F974D73919F4830BC2ADF839B83753C3C58011 -BA6975CEE5655357AA6981C18EAB50DD25E4956D2912BDC0B401BF8E3E719D34D4543E00 -6570D7F59EE1E6E683B53B0DB9A8DD3C188FBF57C719C8E1A35EB957151D5CA1208DC55F -F81AE455B267013FE1515015206F1DA5E7F9F56C1F0A2FE55C1724CDE3E00C9FD055F198 -ED0E75DABCBCA26D558C90BEBAEF6F67D9DBE1758FA9C67FD49528CFA39AA21A4CB6D797 -C5E81AAAEADA6E7EC773F9C5ED0D2B0E722BBC8D449F5692E6FD2E90EB3673648EC34907 -8D99E469FEC7D6F63606E607BF946C78C1347CE1CF45DF42036AF0DEBA6AB19ECF358DD8 -C691742D3A0FB495C0947C3528B0AF579C16598750E475F169C1A36E8DCB33D2151CBE14 -52496F4F9414BC8EFFEB38D22714D2388B56035A4D431EF4D07D126CA898324F2BE44E42 -BDD930AD74363F011B2EA953CA48A7065C5E21B0B0E9C87FEDCFCA17AB6DEE77B167F31F -6E157B289EDC38F47D836250303B7A6662825E184A464B3B6BAF6A31627EEC2E932E617B -16806DAF25E7A6CEB17E89C602FBB0191592BDC0244293F46E0E698281FA9B697EA945FD -9063410A495A75AF971B7F50331D3FE964B3B2E7C6EA890198D4AB7D515F58936D7104AB -67013017B699EB3F3DF5F49744076536B951160156CB7F9D64B035C6BF0C3119ABACE506 -F15605840976E567A1ABA8B94B3B956A2982806AA50413B5F89514E0B065A6710FCF6173 -5C91FA417686324F69A98BD4EF2B0EB1A3CE20DEBAF35E592CFC68CB3F1640B91D20D415 -08DFC28FC3AD0143A8EB9BCDCD2D2BB45844D387845FEC9A6C9E26F495573F7435B6C62E -93DAC158FFDB41A137F5DAF1F8FA134C26A1A40BCB646E26A513C76A6EB07B559522863A -6373062B7C033FB23364CD9540C146CC7D0C1F33A137E5BE097F7FDE6281EB9B9C2F8203 -6DC40494242533C561CF736393C54CA3306FB4974FD76685D26BFA885CAF41AEE3B4230F -DF98BA4EC7646D3F25A8A337C557E4AD260C6246EECDBCF0BED340BFAE2A0BE007640D51 -A583D0747A5F354406DF9D3544CEE1A8E45E0C3ED5B5727171DE29E75ED1E06E4B878C08 -1EA5AF1FBC2CEEF821380656867929E482C13FE6D3FCECA67CC16450E0BDDC5996D7B281 -7E15F29F94780F3E4561A3F0D53DCAD7295D68013E2A12F73E2887F500C5C40497802B5C -69FE8CA2F4EBEC94CEF708EB00D4E44C73741A432687036ADDD9021FC35ED215E742BA4C -D8093F29B90132352A60AA49F1A6351C80D63BFCDD2C4E136F18D605FC406EEBD81FF609 -F396669F082D83B9E1C9573A21C8BFF715FA8401CD7B5DF1BB56C709A32AA27DA08F2BFC -4CC9D74491D7452C51C19D585407E97414FF616B8EB4FDB31672B93EF09B1478907D3B22 -8AFC23A38B48E0B1AEED91089548C135CF3BE546F737BBDAF3A3DB727B8AEED13A2CE344 -56ECCE70D653AEBF7B71EAC15074263FB58C10985830EAEE832E65609A6651374DFFB88A -CFD2FA6BB43ACAE247BBD826E54B6F6AB6DDFF4A51F5DCA90062BD3E033AC713FB95862B -540B9EF93991984FB86936A0841FD6491989B55980D917A53663A63952B9CCB826ADAB9B -DC71EAE0BD3B580E767F7CDAD1E0EE09C9A5F015610FF572B4778D19260E5C5154AEB615 -F494F6905F04B1420E9C4531A7F6A8840E79A83AA20DC7BC86C9F51B0D10F6F0DA001852 -FDFFB7E60D675CEEAD92F73756A91D67A760145DC0EF8565833F84C50D0E17A3A1F33676 -E467012444D09186160B317F0D6063194E46E5A484CEF017C919D3E063AE2E79171D937B -1536CA40EC4E4C71FB24CC038B20CE25504189986C5195E7C89D71DA60F40C8E34BD62EE -44018745746F174D3E30E8F2AC3CB4165474B456A8E4BD62244C4698B6C18630122561F4 -6A5776B7961FE532C7DCCED058CDF95197466C2D6B5ADCC3A2BB6487B5DFFF6E95612798 -18FB8D213AF93B346458431C42C697F3E98EF51A234B8D717718B7EC360F181BCCA72A74 -C99FC0BE536FBC7F71B32AC4F85035EAC720C49C03CAC855FA49D1BEEF2799B86D21F3DE -5F3BA47568811A2909D19CB06A3B62A285744DDAD31745AC58AB7D9BBFDAFF5E86EF4806 -5BA5BA3E78F6B85DED5261177F0B7D20B03ED496B3957A34A4ED1D493FF084653D014BE4 -1DEA598AD3EE6907A53828B49DF06C3BF1CEF5AB6946BF2E56D646077AFA325482FF16F7 -93656A895E24CB4263E382CDE6D67C5506FA7E0BD0B20BDFE0766803BC9DF615E456FCA4 -8BC2E2AD6E4348414F748F031E23854AE6FC92650A55DE479AFAD409836481881C04729F -DC49DF2D9FC46D2BFB3B68DA59CED1280D0A97C7BFFFEBFC72E9BBED16C24B734343C111 -4A999791D052352ED194974774876A84B7B9339B85E6566B1C721A535A378AF89D834374 -78DAA191261D4C83E12F372EB245CBB39AF956E9A28289BDA6399BD2390618BCF9AC4EDD -18CAA6EA6AF116C9560FA860C615467195720014657D4767D70F6817979FEED7A181CCAB -AF11554132B382423713EA8F05092EB14DFF6F06E1A813BBC84091E76038D6E3DA10DCFF -81E750DAAA2BF7BB75C4B1A3347DC8436E47D1B9780DA48842492B86E7D9DD848E1E8F62 -4BA0B054DBBE5328F208952E19707BDC6012F04A475D47D8C7EB6A64C2AFAE3A363CAD97 -936DF3D6347D8CF1862818495A6836AE1343272EB8F34BB4C3F9B0A631E922C920446DA8 -34E9C2F3551BF71677176A1F414188645F43BAD39FBC3453265C05EAF83C3F8B85CB80B4 -B3B5AC99B901E6E2C9A1C065848A814033FA6D5551954D4B36BE89E01C1CD16949005298 -CDA21D4BA36577A9784DAA57DFDFD0621EAEE192200CD5932A18442B6E925280A7B52D2E -8C7116DC0CAE26B92A9A81B5B6B62836E3857CD38F2F5AB075E642760C0B442725756915 -413B2636001AC3D87FBFABC43D6EDD8D111B01942EB7FA47D71AA4520026FB22834DF914 -791FDB207DF0897D89A0057B2BA1DBDDDDE182DD14C85EF10D35F6ED8CD2398171EE25C7 -9C54D90C059A566A0936B8716CA905803FBD950BC4595D9F4CB59C37574AAE4055D5B472 -DE1E6DD3A7C58CED64FFE344AF8B8698F8F1D2FBFEAAEA7F136EA0044472CDE262C7FC8A -0416A868086A5A9A2669B7C6B97482C570FB3192255D5DA008C9E13D1F5A4A3EDB7A5C35 -F71797DAC5B5F32A5C03C429198D56BC5B8BBFBF890C6A29A4DF397B2863B75FFD8DA751 -95F747DFC65379BA575CFE55A02C589CC8E62B8A8623FCC135E90ABD9900782B42378CA2 -C55BFCEED08EBCACB61C53C5678787DC29D2455EC3A379C1ECA2707DD3E8C008E26C42E6 -C48C8E3B9E0F667C541B963313F4FEF02BD67EFEFC63A1A0093A95F15FD139398A4CAC17 -83471AC10E3598688E1A6E261AE763A28C58E8A5B9CE4DD7B8971764340B9862AF36C89D -F6708F535653BA9CE2711624A646B1D1BE8AB250275A1718841830BFABA2A900AD276D4D -592A5D7164C6A7B00A62B08C7F27ACBC78C91E91298AA4B56D090B0A8546549B2BD2E3BB -6FB39B6CDC7EBFB5798FC9589DD707C01842E40FFD597F2BB1B3EE4408F9D38600804C82 -2ABEEDAD6AA6EA75BAEF32E3C33CDA01847303D9C142140FA1B6E71E2BD3C78F5ABEC001 -66B2D689A8C4B0A7A1C32F3AB9DE8CEB7D20B59524656606DB340F4B7727FB35D2176112 -F91C3AABAC27DE231F74AEE1F6CDB49E2844F40F5F01FC9E96465FAD1D10E1A921D81F9B -3F13CF82DC97DEE3462F58797B21E6DE4279A153669FE49D78CFEA9835D5A85ADE360B6B -4EBA9BB8E9FF8AFD2287EE69877FC6C5593A69114EB174AD40F150282B1939D8A3BCFDF9 -74A8864679AFA7619D7EF1F347AD39E2899DDA9EA99E112D15E809E899A2294CC42F4EC1 -251631ED566907E1947F95ED61DD306F67BE79407AF36F34DAECABF7057555BDBE1DF645 -433F5DC42894C3CCF54D21C17B64FBDDB881A2C27765017B51BFA8147BF24157E7CE1314 -79D5C001348767CF1E82A9A43BECDF2F173A42292C8145FDB705CCEFD9ED6CC945A4CB6F -6DAF4DDECB1DEBB0ABD084011D033F0A06F66D9E2C40DACDC790BD663A2436F50B3A91BB -27B40F6B05B4D84169CA16CA7C7E609957A918BD60284C78DA035DC6215AA76115F0FAF5 -4C90315EB8A8F3FF25734F79300F0E676D06836B5FD19BED6CC7DF74548575820A735D25 -89F676D0129D8A44EB47AC1B673657EFDCE874541E2179437B9393978525FBB93A1CDB32 -1D1E47B3B6FDE0924CAD789284CE6F18837E89CD0E1739CEDA90AF44ADA49DB336934144 -D8BED19D5090A3E79B6A96E303A45E0DF44E795A08E1B5612BD05BE52E0508D60E5979ED -B9BB44EB5851737FD5660B71661FC76DB3F9347FD7CFDD2E9C23AC26F805AD8E70A52F73 -B11DE295E3285A08BBEDFBD62C67A540400A01D6FD969896C8D5C46C7093646E530824E2 -C9DFF21E870EEF04CABCB2F62EAC60C1B62CE5403A1B5620DF7A3065B44C7D28366AC821 -86E49974DBA9CAD1249E3EDD876981C595BAC7D05F18D6430F31B96879DFE16021590211 -9F228B03E1378D8E9F7080D517F8C668CC27A9A60F74134827F37CC38C65E577D1DCEEDF -2A207906E90A51A72AC31C4431BBB18242DE354DCAF50978E619E8A06CA801937B522396 -AD588A1FDEB567116CDFF51876FA3640027CE40CBE18D9423F05EDA77E876433F496FF70 -0D89FD7B47B848C5336C80A5EC644FEDB3F4A9EA02AA43A6EEFCDD27762051D2DE2DA02F -A03CD491478948B3039FD532751EA70F56C254893A034971CA7F65BFF5662D4A61AF91BF -752BAB772A556644F711EEF61958DA954494C50941CE83C6B7B6B2859AE7E9754FABA903 -35437EFE4C7B2B36B99251E0C8122A16E4F9C883DC4CD72B5E2A854622B73E6E3C4DA098 -1B208CBCEF104F5777F2BAF65746B7EC51F3C51AD38A12089E4971BAED178A9302F20DC4 -88CEDEB2CD8BF9607912EBF7B0BFC3F226228C96C0C128C498FA351081022E47F62EFB15 -23545AA028A8CE0F56C85BE3186D6811E4B86B31EE3234C595D34164B27D40295D2C2DC8 -1BED866C6A0405C4742CDF5A2563524C93AB0D350CD8B3DF7D219379F302A3A1C12E0954 -09698ACDAC5A2A89B7F54C846A0378E44E923CFFDE69B53F62FC661571E22880B065261C -B0929D4E234503B81FCD8771685310EF5CFCB2210073EE65770F445B93EACC6DE6556C80 -59794A7499C2402066996593653192CE60E4907FED614060F4A9F68F0B949C33A7D5672C -60317CC5AD98FF3301C2176E6CEAB2EF6ACEF60B6FB96F553CD8CCB05C2B1EED6044CB83 -40DF43DB21B567EF0A5657704E4DE711FC3EA7933BAEE7744234A369326D1B0BDE34A8C7 -2E328F30FE150DFD111D75122F29CED31C666793100CC8B69A17CFE330BCA55848B86397 -F9DD4950D6DF2B4486E26AA8FFB58445EBB14BBCCA683F3DCF2AC64025ECA14151D278C2 -977A9E046EAA361E658451DF157386033AD47B48C674EBCCDB79B8032A7D8FC01C8AD15F -E1B9A410C5D4B51E20AC8E8DDAC4BF6020A2751114FB024A96B95E3053F38A3E9444CF7C -C666B514EFDCCC3E167CA0B5F8095EB8D4060937718F6D8705A15B3E515201D9CB804467 -25B98EA469785969D46E24F05EA3AFDB074901774745286056761846B80553F0D3460CF8 -29C7794E4A360D3C731448086638214DC101591F4531543E9DB6BBEB1B91DF1FB3D1C4EF -B13058C4B339935CFB4660CDB385C473BF7ABA5B5BC69083FEA6A17C6D04B23E9437C8ED -14C680DFC74453C4FF2A6BEED2BB7DE8B346EA2DEAE4435DF08305BCE245ED67E41DBBF2 -96E3E10562A55D667D3F9CD286FDC42624B4BAF764E3C3378C8135A99F314C1CAC47B3B2 -E1FB39499594B223CC03EAC5F75BA3D91D892883D2843B29397BE6E06842D48B75DF75E5 -480F6501AF694E0E76D228DF52219C15E7F33267A9D1C3515308EF73D3DB303FCB9497AB -FA1236E8DBE95DE4EC90A9592CE96949D0DC55EF858A18DD37AF76A51EB3B98BDE0ED83E -7F4C6297245315E685559B4AA1D37E47053657E710D0AA3CCD41ECCCECC286BD133B64A2 -E8583148702FA532121E1E7B058BA1D24E7DF660A9E130BB8BE6DD87D005CEBAB1C8E87C -34C3EA39378893ED7752DC543535761B4A237ABD04B53080196D79D692DE2E53B7167B6D -76DA2279335AC5BF986E1AEADD9EE3A100756B15353BECE08FA788CAB5F63BC7AD58C442 -4AB03866AE0E18D4DC71BDF4B58A79C75D616933A31BD5BC14A2743E4A1EB88D90DB1854 -F132A946B090E2A092F71CD84239403C0CAFE30A7900061AF680F855DA5E91B023830B93 -48050178113D7831EFB051CA8534A3FA88222FB85D1A1E9D99936C49DE0A1DD7C8383F29 -B9B2EE1CD7064488D60C7E76F4F2DB018A4B9C95CCBE2F9CD7DEDE9501BEAA9C0D08C590 -1F9211AEF3AAC99DEFBD5F9C431EAA31798BD7D3A3A5604892F44CB3B736E8F8F79202B1 -6E9ED3ED418EF08539CD3DD9E624BADD761A44835AC95D5D07F7D67B93EB70AD8E86E0EB -5AC1D4263F51E84583E424D0444B673747A8B353A780A6F8549F11A4962641A47CB1C3E3 -C4A241D244BA92AB05E6BA17BE0D6DC648C1F9D5F88EC20E103D1589D0E86D2B27CC077D -810BD20514BE94853BCCFEF33D7655EE94DB8559BE3FC78C539E70F84E20534E7A5D6930 -A02889A4A82BA058888AB3EC75769BF961283481CF006D73FFA088EE019BB4AA990FC858 -621437BFB2D79C49157B5757CDC8EEAAD540E02BE1404EEBDC0B7BF094B80789D03B5F7F -5756535B392A64F9617ED0856A7D167A78032855ADF1E672851A439D9DF57967EFC56D44 -FCC6D878C31CE7904C70433721C4E981F2643C08D96E4753850A4F427FA3D984E00832BD -53437FDAB0A491C81CD6CF81D8BF5247E01CAD335A6DC9A69962B5830DEE96B57C9B08A0 -A5F401CC9CE286D3FB2B24F8E77508E4182551B4EE7B8139B80B805B64923ACE685CD576 -BF57A5F538B3F03C38B7DDFDE686B8F79271F8E4E909960D6D36523D4A217E4036AD4C84 -1E228DEC38AD432162211F5BA65FE03E0796A29EB8A8C4DB9BEA37E5C15A4AFF900A3456 -723DD6CB1F8BE7C5372A815691A92B5F1DD97BFC89FA5EBCDCC61AE4EF0245684ED4FC18 -7631D4292A94C9E3BBA81159E3688CAF6FC988236FAD971D774B54626DA436D10BD42A1E -86036DB36914728E66B8EEA3B432126A5C1F0FF3928557A3D7583BE21007D81D40D8359D -83075211A8366B16613E1B40EB840DFCCED4063CF06117963EF200E0FC0A558B1B69DED6 -08A00C25C68AA7EA0D902047A0981330DB2788E994E2196FED97CE2E777C0213532CB19C -A28B07792F57F19433A14D1E6506958E8B6483D3651A1EA10D988C541CDA715DE138B612 -76926F9793C603B1836E4E9A4DE110A69D60E0F9BB0D5DB9F4B67209EFBE8D69D4C20B15 -0640052CD4367DDCE4722A87E9914B7DF541DEFA52278ECEB60572E0CC31AFC6C30ADEF7 -5898DB0B4A5D00F169688EC5212983AD3DCA6604CD2B3FD4A351EB4661F025716B2DCA8A -F52CE6D269979C1F7E7942F583B2CB678F8DC52CB250C603D48B206D5547816C220AF203 -609BFE7B53CE4C88178C95A4E8F2F8B4BACB1CA5EF4CC1E76347AA958F2789D441AA1193 -C56ED7B27A0099B3EEBAC6AA6302891D3F16A913D980522CDDD8E3303437EC9AFBC4858E -D3DD92E3E329B34B344718E4950DE3829812896AA20A9480582570DC88FD7F4AC2F46B24 -CDDD8EC6BE4862DE1412F427B698B83AF5A0EA767778564F3C3CA40EA60281099297E104 -E46E308BBF5EF23CCA84F9D6A6F773157582EE0F1BC477274999637E199E269DAD3D67BF -D3EBBE840CD906E73A31EC7EB044E41F6B72367F6EABF54DA9F1664A1664338E202105FE -E7F071026D12CEDC2D86D581C496B400D58CFCBB7B2A551BDABAFAC1125090DDDEFD4F55 -55B21AC1F6E5DDAE6700935C521AE129F886598539C41D07FE2680F25442BC29BDE2902A -07FEEEB0A14E4F0201483BDD99D4142194BA2FB991F76B35D0DC31526A417212E5151E31 -60F3AD665ED99E0C7E50A43F58B2D6A8A075A96DFAFEA84C12EAD776CC6A3445771DE987 -DD0775A8DA30A1D0B92ED1D1A8B3E0133198B33C58A9E79943083C1EF44C0AE8A12D3BF6 -7CE1EF00C97E220DF31245B47F4720DA1F1B66A11A1AECBC9183C654DCEE7A16D47A3503 -74458A7303ECAC951588D2DEFE51919ACE2093697639CF60467FE9E43DC30B9FD53D4C22 -DB1F7B81EC206548C1E6E6B6CFE038764C4702F62CC23C38AFBC762D24E7625804867B40 -1626B14B8E45C6D9641B591D868FBADB07FCBE00C193F2F13F174648665CDA538E8977FE -E8B54B74CD4F84BDF7A1D2D1E64539F146D3D116BEBBAAEA5FED99C5DE42526EEFBB78CB -F8AAEC9F769B94FEF470C60E0B2F79C7F99D8C9C7C32A68302B352496255FB3785F74B43 -B4A173961F9018930515E6D1A57897420C404F32B3A0E2CDBBF8B53DCCDA0F0954BF6F80 -2638FBACAE414DB6C63F60ABFF719EAC3831C7D5AE46AAA7BECE1B71875D46504E61C29A -3AFA16498509FC57DF4B4BF40CD4D8D59399EEF835D97EEF06B373F6E006EC22FC61BD13 -99EB69F248D991725232C1C5BBFFEBF0477A08BDD42F32FA43C5F5C06C2BF639E1C86F0D -8E49B70E134B038781A1E85AE2A16FD1364479A5A46EEB1191390F469D0C573079523D1E -F2B049171F9345AC5FAD682E4CAE51E1717FB19F8AAED47B7572EFD188806BD9FAE5AB42 -37683C9797DEB62E1FD9DD5CD1D477918D19D004AE0334E7F6A705C4B6D01FEDD05DA5FA -063F81B6C6842D81A774C04531F708045021B8F11243E2C3F3EF7FAF5BA95C117B9DD6E1 -AABBC678F5046CBB55FB58849B6500A1A9593AB0BE9E2CD823FD35F60A485C3DDA2A36E4 -D13984CFFDC0992E39CBE5CD18076A92820D874E2576C83A6B02384D33F07DF51788BBF8 -27DD031A3520EAA36248860261133BAB4441635E255AE14B59B37B35CACB94688809FC1E -DFAD40EB2307B2E0B8303BD47A15F736F58A4B7D8ACC44141E5E7D85D24B6CD12591633B -7A005A49120406ED1CE82835C70426862D94F10BE0A51C894074506444BC899136DCE869 -D20F94E6E1D67F579E94D83DBD0B2230E55B90E01088DDA3748DEB1A7FBEB2D9D5625149 -06F512CAB6655C97060CE906ABD62996B2F1EFB10585C49EB019986CD391C1250C9E290F -435A19B3035A30B415C614D64E396E5AF2970E36BB508E4AA4A030C9A38ED4D04B967E2C -F5BDFC66833DCC48BC43772864DC29337040BC9AFBBA5E6272CEB78222394AF8362D32AF -C1AA0E3359A4DCF2A98F14C1876631E2C98E8E29C41655F970963592C4BA3D028420B197 -559C882A42896CA2FCAE8919352A02C39BF565A6841E3B181234E3750125F983E415A065 -137F3C67B80FBF6390B53BEDBD3ABF8E11C807C89B1420C37C790BAFFDE9EFFDE9092673 -DFC748B14ADE1A7B9883C545C0C145DA0D404571F94F4A161F7A747EFC311D1F52C33CF5 -993D987161F2AF52920FE97AEFC3651767C8750FDB45920C972401A337517BB88B3B65EC -B1E6A67B6B0728E3A1E46B1FDCBBE1D3757D715F91AE74F3740D2329944246FFC50665A3 -87B472AB71CA71539C2D15C56AEE7951666BB869FDDB6D91FB4F90A00163E7F1F4634472 -46DC61B4B08ED312157BA05105B93F0F8DE781CFB59480E1B8596A3354C8783CEF52EFDC -74C9D143C16088448B8A9CBBCEC59900B16961E845CC92AAF400943EEDFE174CB3E465DA -6D92240D8CEED8557EC7631EA9D2B4F0758CDD9847D703A5623FC1C96D321482243A6E9C -853FA07459B8DF72F6D6CADDE4D92A8B110566984A4B8678B8CC8FF4B2F4665030FC2B47 -A0102CBB3D8F4E0C40D761D05BF4B9A684FCE51A5F750093AE65299413225E64BB20D6C3 -E287D934DD3040DEFDA92AFBA6E79483DF64FE3CB9B265F7CDDB2F5DEA767D5967CF0393 -B7405BE70F810DEF309C5D2EE786DBD819EA4A4253125AEA8DDE8F9AC42AB35E11773CC8 -434462261939FE3EE8F30383450E3C6CBB033FC839332F6B6092E724274A89C86BB4ECCE -2FF70EF35268E9EFD66F1A75222BAA8CC9F9F4BB4943CB28207C633004F31E0721FA48B7 -D1E9D10A0694EF6A58A1F01EAA6BE615F2B1BAC49B9CC0A77FE251B7CF5611ACB1A0BD53 -8ABF1BE4F584AABB038F4FE84606BD96CF25FE9146651587023F868B13557E4153F2FAE2 -070BE3D081C4CC5410E803F04FC2284EDEE54DD387DD61F0B3C2A1815B35DBE6FFE337D0 -7C50DFF344C2A4D9921DC7FD0FBA8CA06FB07CED571BE57E89C3E429B40F0D8EDE7B522A -32AF6249D1EB966D27A5424495A82F15DBC8FC90B8619C0363AFA45C26D60FBB408606D9 -A37B385582513B61641595F7328A1EC830E90BB7C8B186552E2F645E2F09553BAA432558 -DEAEDDD0591CA23F19E6B9D2143F0CFC9550A43DE70F69A66A89C4E505E02FDF77C87E3F -A3768B12B7B7137C5DF761978563CC1C81AF9B7721D1E21A7E18CFD583EE4BC928E75AE8 -3F4DEF7A587D0AF30DE0CF4D74872360DB3BCD6529906995C1294DB90C93B44EBFB95527 -3D0B704C529EE441EA8E1EE2E3B03B7BA50CEC0C34AC176EB56AADB692EE9A53C215AB0C -5736A3A4EC7E37F2ED5E4BDC7B82D0E35E06915E068FD974F225E70461D780906A7B7831 -AA07687C177FE71B84A4136C7A6BF2FE6408A9C7049795C49326069BF24244430A960ABC -ACE67533486D6D5C6CA89D71904C5C48D02969628A2184F6B36C5FFB64A671116196BBE7 -4FA57CA9CC66378C0CF086FBDF05DFA609BCED01EF21DB027551B888242BDD941C302340 -0C2622E8557A0E12DDF981313D1F5953B57835592C8828C102C16EC39D06B63F31C373A2 -5077672A1134EFE0D4437E8F38AB373B214EB5F2BE1F6D80A07E1AA296AB7F974EE1DD76 -EED4B86A3CBA0E3C9D9F1A12F5E58913054D4557C2CC1C2C147196C7CB1435CC90C5D7CB -D2379FE287CE562D9B7660E157E175ECCE8AA94B1173665484D19D65A9B191D4C09D43B7 -90D1DA313C09025020B2315B0112B8E059E01525EE0AF0189CE06A307801725A26B2B3D1 -F0A1BFA9056E1D7DF67B1A8E82946D5328AAB07A9D90E21F5163B1E3DD6D789068C8A1DB -553FCEA69C14609A69805B3333EB608E4744C58C454DE66723A7794D09DEF7C6C981DDF8 -1B84B3E498D055ECEB6E8372D331861437AA69AE7D9A0932F4E71B9930D6F2DC38161257 -A32B87A7D37D200A5B9B5B257C0C9833BF04F91496BBAE83E9AE742362D8E74E0A4AE5CA -029B5CA078EA6D8F00B1ABB84A08FF1C03BA539128A42166D06E09FA8AE71B74A216ECCC -82DB316C9589BC68456F8ECD9B4BEF1E12506D537B6BE4CBB15C969B05D2F220B6E2678F -4F2D497DFB72D8F9584FBF0D363547F84E1B28FEA0C869A090FADD5B90E36B88326F6589 -BCFD8FDAB3993532F04949DB9EC2D2F2F1360E2E75AE76A6796A2E7AFED4DAB1B7B10D54 -33AB4C76331AABAE0D3ACAAA62C1BC3F72662EC71B76568BF3450B45C2D09BECB562A49D -3428A9DEED6D956CE1AFD83D90A0FC021957B45B8C03CDE0579EDADAB4BA570B29809545 -3A1D56FB60FCF22C038803ED3908D09A5E4E3EACD180A6D355FD7EB96B05305E841DED98 -07F75F133A6CA5D3415D0376504634B8DC2AC7A5BB53F9A3A032A878DFFA224FAD7A22B6 -9416767480B814D12E7D316D07AE8AA5117C04503B2E194F5CE94EFEE005DA30AD9114C8 -BA99323CF76547C24D607E40B62C51D86B672675E6F0730ABDC9B7B186D7EFDC4BEE86A6 -6456C4074BAF42818B46DB83D70FC8D1CA702CBB672B38BF0E776B52755468462B2EA034 -DA32113FC26E122261018D3A125D174D301FF7B16B57A406CD70110AD35710C2B67B7330 -CEC7B6B33770572AA9227AC52B0D6C6D0E25515C5844FD5D24140E01F3A4099BE114B94F -DB65580BAB585F3561FC997C5DFC1A27A5AB4CC6DAB5DF46F3D575316C81A2049089FCD4 -1E4740F4D16EEB08F117EEED488A6A9DE20B498CB60E48EB5A0839134B9F102BFBBBA982 -74ECB5679EBC7CD178B6F179ED979AE8E9A41763A97B4E14A7AB6A2C1A446615786CA3FA -32BAC716808B486702635502AA9F336C101A6E6A5F3033F5A92E13B9DFEEA4E7E98422E3 -3D051264262DAF41BDE94B43E0A375A42C59702EF2C43445C5EC7B6002BDE7C342F52AC3 -A5844A0EE75F5670C8B80AEBDDB2FE3D28BD6961037C0C54BE5ED708F683D1494DDFBCDC -976AB35442BB049A5ABAD1246996AB4E56CB0DC9596EE6ED06D02BB2DF9A7C9CD5B07BDB -7AD345607291736909E194D93DC68A1C612945A264A81603A9D0DFD5435DDB97F42957BC -AB7D6B400E2943A3F455918135E6EFFB0AA5E9C3509860CB5727363AC596CA1D08979225 -814CBD4A22CB979E1A6F6B9BD0359E782E852F51DAB107EFB2C2F1CE5D69D5471704572B -65A8B8B45305088AF7FA401348962022C952067504E39F3E879025FBE8E5ADD940B6D4D1 -737101C3999B9C6F58B259219AF84F1C146AE2DDF02C492FB5F582E739F1D1A3A0752CBD -5C401C91BFA7BE13F936DDA112AD87ACFAA7DF7CDB341443967E8CE3091F024329934DA6 -AE431187CF6C1955744518EDEFA73ED94EF60764C59EC21CBB08EA73512314A7E0658DCD -B61CDF37259EDE297DDDD7022DF5174DE5FA5216E566D1AF3249DE12E3A4EEF90A125EB0 -5633B85E3A12463693D5E2D6C01F5353761DE77FC8BDEF35FE0432E1CE3254F0F50A1B77 -C2245BB6DAA558E893F89AD98296C328D37C816CA808943AC488BC0090A4DB29DB0EAE82 -C89337A7C3FD1B4000202C42489974411B7B63D69BCB12E7EE7173E51D1DA17D7C82E6D9 -F810E76A97A9F118F1989B9DF448249BA2AD095A9698BB74D744C9ABCADAD6260E069C9C -73B05D41228C475C1207FB4AA8A14562FDC889D6870F5D045073F18D8716944B52A7F9C5 -0005002C0D1032B7F3ED2F60E9B27D056D1BF9AE3B1C9B4AE9A76EFAB3EB926376080C14 -5100DBBA2FAFB47E119443AAC33CD4A49DBB8C0E8629C56B8427AA94A6E076EDD6A16574 -336E6AC1D23E04E9BDA3CD2C926604C4E8170A3B9599FBFA9D3C8BD6192020E0296968C2 -EFA8C621C0FB0AFD399FD8E14CCDD94D5C6406D6B1A2564507BC818467322EDC55C3A3EE -E343DC08142264D205F542C023F8C82CAFAF6DC194E2016202247696F03CAD55224FDBCB -0E8DD2C9DC53F5BA9DAB23C033C788CBA2382EEA7390EE61A9672345EE2749CCA136632B -34AA12A5FC16974E9EB835A5598ADA0898BA5C87757D5EADAB5D0F71E4B75B8B1D711128 -E277A973EC136CAFFEF269A28B00881991B33CC8C5DF618B95C049CD97D746978B6C3AC0 -CB9EF6A51BD9702D0C14AB484DA4AC2400BDC557CD5E57A2421ADEC7F2326370E6F5D5C2 -9DAC782AB9255D0F4D0C98E7F9E0D7D31B114B1BD18AA2510E4F4A97582A15F170C12EFE -80842C1D3FB9C74F40DDCC8517FB123EDCA605305E841DDB1E5AD5448DD4972A20045021 -196CC951B8C99E3F000CF984252686EBBDE5DA0593C8514F131FA94949AAE1AED3E780CB -0504CFAD74171757769C8B2F51D54DBDE3EEB48E75486B4A75E4431F8BCD1A985C4484BB -1B5CA35F1BFE7B3A7C41A42B66756A229A7A5A0DA6B7A5084EEF6B8AC804C17F1E88E5C3 -D0C1D55BD687A9803A1AA74A60C0360873B37C79B09A1B823C3C8AA322BFA2E9B77701D2 -BD815C11DF5C55C393B73F98B73A500EEE6CBDC9E4F5405C73C3B635D6D0CA58BB47D41B -25149C3962190A1CB6FE7A8D6D4E26A205733F42BE8A2B0A8B4573C92CC98FDD07318671 -F3D3D5C7C757DD5AC7350F64E70381D190A05C674AAA796DE36886AA50955B422BF5995B -6F8EAD32715151456AEF2AD3D16FA3120B0E95D817F9CCCF7B2A55D529272B1E1BC060B9 -9F6342A1229DD8EC1DDFE9B59DBDF216006E98EC1AA5A1F55EA3D7EDCE63ADE2D4A3BE57 -E45A1FFFC04D1C9F1466583BB2AD58AF695DB3DC075327144B35BC40EADC993BF3BB97EC -A3F7756324E46DC6F4A13CE5266433C90FDEF6F46D38A9CE9DBD993B941AABE630ACA87B -B14EE46C977EAF512A769611F269A17D6A7889F28F4D38CB9F20580F6F4F5324FBF8F6B4 -F6C101ED306407463004171F3C8EEC70B9A2FBAFE213D1450F9E368E56183F4449780F4C -20171C3354E3AFD7D31B9CD7979F57FE545B06F40AB613B5B91D21D9E50B7B01E057F02D -DE24F4720972007D62736223D8C3C442CA0BBC8F31D29387399CEEC87700982A394A11CC -C73E118113558A4D44BA30924C4310F7C83F2C6D3FF570FCB031C12322CBD38CF98053AF -BEC2E7DA168EAB3B646713AD5C3FB0CAC7BE1D7CC779FDBEDA2FB78CADFB0EDE7BC13C17 -531C20EFA0C63BC58AA447545EB89FE0271198D71AE26924F939A063521C082560D97EE9 -6130A6F6EB7CB75BADBA1A8A00736860986EC623DA35F8210E26B843345B941C0C0B262E -B8EEB95482CB4EB437431E541F1C2820699258B1D17229E1DC8D7B170742CA64773F8062 -330A53950E929080661E588C1E4B85B5235130D50876837EF131D3F01CB0508954F39838 -ED8A7F38E5E7AEC8A74FC71EFE42E03E01B3CE075AC305B223B03944F9C39193A9EB6334 -FE05EFB242FECDEB2CFB62E0852B8AE333A92B8CD54F33318B1B22A8FBE47619A40D2CE1 -226735134BD860754D2804FC482441D48F1239B2D53E0ABD6FA1D556E4551203DDC5C79A -F0169D0306F1BD451D9FAF5A200FAC1C833CD3E72E37AF7D95860D2D04A1FCAE8EDCC522 -255D759C135B7812CBD0A6EA9BDCC084E528A533B79FE9CE5BA00E86448CA798C6CA5B05 -5EF88EEB8EB276D2E84524D64468EA6D25F062CE4D47C1E15CD734BBD04308FF67DA439D -577A00E4824EBFCB2EA5A00B55655157AFA0DA8FBBBC520A39B37D9FAE15A2CC90DE8B11 -9F69965BD22F20B63A3DC8C71A15510F85AC76F3248D2E5593266D9874E3C099649F78A1 -85F07DC3D9C1CA1FB2FCDF2808945571904E3E37A00EAF493BFDF11E9B6D4DD951C76EB9 -9BA671641E4A3FFA7C16F3AF41ECE3EDAEB91B0D8065D2324856C13B02C6666AE0DE50A2 -EB8380E0CF9665C3005EBFBC1AC075D05713A70CDD5590E7B9A54CDAA5F5BD2463AE744A -A12F29C1C2D241712C3A80DC860C4BE572905586FCF974241213D073D3AFE446608B31B9 -E4F368D5627A50E0D55F22899B18E8BBD1DC96EA7EE8411650950B38E5E977E25A210070 -B8BCD0C109AAA5E1D838AFB35A25B0C32267672D34D5E1F139DFC10AE6D23F14B07190A6 -0DA8E6522D3050EACCE19A9D1C762BFF247CADBD1D1F172C006DB745A3F4D05D33957DFB -471AE4ACE69B8AE49D8257B8B88D36865C0301D3DBF8114850A2B05D2A8121B3335DD399 -067962216367A8E8CC834D69BF7E16D06B4C7F602F908DA3903FEAC017228C976741A421 -C49048140D1B8D484153AB948A01CD7113C0AB9BD5466F8A26557E9F984BEA514EBE72E8 -C38FAB5F634EAB033C960539945FFDCF63E1DF47A8C6BF4460F6DB6778BE2D90B90BAEF4 -6AADCACBC8D1DE9BA3E9D4A2A8EB70F5CC3F02ECF6D76BCFDCAB9BBD36DF52DF860D64E1 -F0958B74361BA4298D792AF1D119905FE6D3067BFA8146CE1633D5C4658847F3F9E18143 -F1AB4D35C953AA5105FF94FC0C345E478B5B1D4584CA7BC050A31740EDE0FAC5EFA57126 -2CDAE360AB92ACBFD23807A0394160A8EF0B0F320CE3685040D091289DBCE3454B1ED51C -83D8EDB2C86C71805DDBD584BB61E88A673ECD1535F5891EF7695F182F783B59ECBB0DA0 -B445D7AB5DF5C9BD042929611182301813145BAAC4D54644E93BC8FD2CEDE0207B5D60ED -FF95CE7CC60DA632FEA04F8BC518E4A5197BBE065062556EADE480A86B8A2E0C9F1BF739 -1102D97C4D6A33B05C2EC5F457306266572C06274ABA9EEDB8F3C4E405EB5F132AB3E947 -CFF44017C6D8B79980DDEB698BB03BEB0C864A0766EDE34FED65FA889C5F149736CB7640 -B13BDA9CC6D5BF72FBC3009CB4FF5A877CA3E973A2A08FF25B212B8665DC4D6630B6EB48 -0D6E1E8DCA6F34AC6EAA482A4C6AD1763E17665BDE15BC08806A3FF8BE68584C8EABDFB1 -1E415329EFD07459890671D21872E0B0CB2EE1577B4A9283F224E3D0CA7106ED0C91FFFB -4A3B8CBDB5E528C8D95D19741F16DF780F6D49FF6815351D0F0D92A0CD72FD14A19E1DB9 -97C3CC11BD6FB2AEB5281951D508A3EAAAFBB048B87AFC7CAB9BBE1D1C407D52978B6AC4 -6136E779209453BC2A6A86C198D1DFD8818526715228EBB5F411E1554004F48FDDD2607B -E0D3979B82E35B78985FAC19CC95022D1F0AB9358CFE21C27BAB89AE4B03CD35565BC65B -E6E25BBC43F5298B14000AC0867BAE57BCBC40E938C304F37D9AC390A90BB5ACC906599E -789066315EEC0C15FDEC2F6E637A3082C85B2ED6BCFD621F033396CF1B7330D97265F873 -C92A64271C6CD63635758B05C10F67831EE579EF0B4AEAC245BC87541C1E7561E24B5E01 -B323E220BF1170BE5A4319684883C910556AB899372CF97C572D1AA86A34D826D6D4A048 -AE28B9D3E63A00A6CD36A5C4472E1B7840FD3B09A16190BB63588E98921E17D4180AA540 -56457195934F082F0C0F7D104E9271FB8E7D0CECCD395BCFF6539B76EC3FDBB1363A56ED -366E8F9DD48A9349E4DD8A78C5B683E8365F3D0B4F2F8DE3D70B0B8825667406898EFF52 -A957499AE83E6FD2037CBDBE6B9265B0CB7323F86AD386F7A65CBFA93DD00255BBA82F96 -34A80487F68BC69000869F6CBDD217096BBE6BD9179DEEBE12422C308CE023854FBC077B -BF1B820172633D8F70B26A302EE6B64258FE46DA73AB8C384756200C95A5623D0F2A41E4 -7EE54394A784941A06F082C737B9C6C5855C5F11729D6777E38A6B5F061C8E324CD2469C -37B564AED2568502B980A054BA7007E8D9ED7733D3956BF5A3AD62C262CFA0BA9BFE0772 -7B67909D59A0084BBB85DE630245D514D86A920891417AB9FBC93863498E04E1DB27EC92 -6F5455BF6A5D09BB6C4968E10A177CA4B057E7D360F4646C986BDC5FB0C7ADA94D69F257 -96A37E10F1C62FE65D66790A0599D0A20ACD87AE4ECAD36C45678542E8D8E364DA954F9E -E832D403BAD839441AA6F7118FD8C18B5C36F20EA984755E672FD1C2DECC0F6764711C3E -7F6710BB8C7911BBDDB001B9CCBDD363B8CD618CF15ED57B63E5436047E7FB5BAE45D062 -D2EDEC99D9335118AC31D73AC1770FD0E5618608C7F42507753B5115520D4E220339B3B8 -AC54C83451996E8A489FA86B1E6C990A5000614688D4C29AD6EF8010131BEC1AD2670F9C -DBAC78485175F999CDFFB8572F30648EB8F49548850B6CBED30114EFB970C8A58E814239 -CB0C1A855ECB24E0E38A6F4AC9EA5D255A9EE180F41213F8168F03E4F646411AB5B4AFFB -B17C2533092A51313D3556E734FA0970E0760CE24A573A511EDF00457F348C5E465C1AF1 -198BCBA0CA6DB414B66EBF68E557E2EA72E80D7615B3A3017214BF1525A6CCCD1BBB3925 -C42E13E162797DC077B2674BCA2265F48F72407B24CA2002C2DBD2DAEFE4D0BF1B1D682E -40B74BAD6C4B69328848F208D5ECA1A49B6F59E89B306FC5C47E6C007A5B0E5380538B38 -1DAAB61199AF1857C9D0649570534B486FB5144D9588547716F848A8015C8C2D21995D4C -860802DFB07E4DF45E09C7D7FD5EE824CE4128ADF624250D69ACC87A0A10F647E7575DF1 -E7ADE6B0BCF063411797D563441EBCFB213F200A4CE96623BD6CF127727364E0450EFE99 -288E9A3B1FA4A1E776C9BC581931B72749EF0DF7D786F898CEB10158B705BD15B6A9ADC9 -9C7E2E3624905EC361BEEBA65E43FEDA49EB8F8A85187973C5D19FB54BDDCD79E42E2C08 -130865F10D7D600246548D33303B617CD6F81E0A11F4BC23DA3B167E5B2FBDA8BE051C49 -536C4B0940C61A954418AFAD8B0B19D85DEB12B1219DE27FF75797D0DA16F00F80AC113D -F19AE8BF86FCBB602F3BC696611935FDCB61F05EE17FDC36E0B1087187F80D5C3EAE1B17 -DC1BA5817CBA5C3CBAB6BD6455AA2C3B44B57494B8BD08859C1213B24A62755F7CCA048F -63F3F430CCEB00BBF39343F25AD4B6C62039A3F7B943344F86312E7566620694B77C5B69 -2AB977A7331B5F38D883F9B7C4F89E4A66F725E0EBD8E988AB9AAECF32D31C75A3E6849C -32E4F06196DB937008FFA15DA36CA90BECBE909AEF6CA20E2315C82BA27385D08720E1FC -BD5652AE843BE5F3D457B7F488E7AFDDDCD29BDF7ACEDF1075ED819674E47D0FC92DB7FE -0AFDE6D58685F855FFDF52CE51B9C2720A82712A4B7BD96DE3EA95CD1635ECF7663C1D54 -A885A6AE72D84462639C52F987138050CBF73A5504F66D1430DFACF226FF12069A80ABDD -0141CC2E05524BAC464CA4C59AF2912A2A4EA112F8C8A0BC4C908BD6C0BBA0123110F3E9 -CE3A216081892A19AC53FAD507E34110EFC7D4699A98849C5502F9DCD4418FA81EAC9481 -E4C20B4F46BE4DD134FFB03E47D6547D6540E1EA036167460F2922629E01ED36553AF423 -0050BBA670A4B74790B213D70D7ED543F9787E8920551C4703DB62110EF2E30DF12E91F6 -8AE86C3C6F9EB3043C162C0A0CFF7D4FA90CFDA5278D2B47D265D06CC33FCDDFDF3C68D3 -6BEDCBABB491F89962A46F90923C51EFEACB39FA22A36CDDEA38855682F126AEBEC06558 -94CE26C769392D71F1C4CBC34E3A4565EE74D67AB272327B457D346B756322FCA806938F -BFB118244CE3B164ABB58135A96B7E1211220995376CD058DDBC291AEFEE79A41501AA17 -BE5200BA08E047BF985A97A8DCC1640E279DD35938B57C186918F163012A4C947D665449 -5CAC149C96F6A40502ACF8BE05D671777DCD218EF7FFF41AF93A80418A2AB81FA89120BC -91A462F034E8801E1251BC3327321C7C0652ED3B26CB8B6CADF42AE3D97A8DB1A732E452 -FF187A97A2E03372667F91825FF3CC861B4122A1A0A3F4564323209DCB8FD2A886E95F58 -1539C74E4F5A0EC5B63DFB416F3859B46DCDBE7D724DACA0C5B6483FEABF3F36D6B13D2A -49DACF1EAC4FA6C7B161A22CD876F5D511C2C2FC96C8B3AE53311E2D9468874BBB9E6B4B -D18C5DA32F4E00923F59D2FC2079BD4BEDFA9E960249C650EADF2937CF7E339FD103CF71 -AF2549D4E9763E75A84744E73F70B669B6808258677265A9C2A48D95CF90D1E1585B4B60 -D19CA105909FE1D0EBCF533562ED6953C71C3CBD9CC474B6F6418A87C6B608E9D62CD3B4 -15565A14EAA18B23199A1521B101314B38A6662F5EE6390C9DEB538F5AF1BCC84DC9CA33 -E2D403FB1FB1A2E12D485D534F1A8A27447B5F9F13ECE527F7CD3CD9144AC5F137637659 -8199D0EE633CCD95797F4D55447D3105AA87498F1FC8B8750A440C46ABF820EF499F9D5A -2818FFC414EEABC029AD6F961CA43BF94BFAEEDB8962A6124A192E1343E16A5E20204016 -B5175FF8252310B60F276148849E8556BBBD44CB9E59F5992AC845CDB2BC3B33BD7F0816 -2C36B7D91BD17A37F77A7938A5209FE92DEAD16A595E91917F6E49ECAD8C7B01F1565089 -815BAD961827931E718DF2B1F9743B938ACA21B648916FA76C5C99BFAC1DA9526A8F8793 -733B8CB1123A12E1FAEFE75332D850FB7F296539E76031DDEA6851EA00D97F7B83945C3E -5C29D9B7F31B9A7B541B7640C17347CB2E39C15FDCF8C8B8ECE605239020783F333064E9 -ABBF3236976CC021E852C2D1C1A95D6DFD5746E076D14E75D2D31D0E93260802D9B4B846 -865DDE6FD59150562F6EF062B5DFE7C136978FB4A84ECB6AD463E199CB6ED2A9EDD7CBED -D8BB618DA4E68319C7F194C0DEE2AF19A36943837505AA05FCFA86550C704A7EF74227D6 -58BFB33945D1E1FF102C91F6378D54AF74F1CEB81BEE7A848B8C933E4F9AB1D6914D9010 -9FF6C47194AFE0004A7245ABA2CE53A6C0B8636FB445E1D27E631618DCEE6E1FAFA19B28 -A3FF71FE46241F832D43FA786CAA4B5125821F13BA3023B54DC4E59CBB027C1720432DED -5D53E05E2E830F53F6CEFFA0F17394A13EDC3ED8EE8493523394C5C73CA15C428E481D73 -FD4BAC226F9B923A1BC380535B19161F12034CC22DB93B335E1D603F8FAFF5BAF4410A02 -C8D0391C8B118EFBE289DD957956EF0CAC55D68F2069FF4D24ADE54DC83286E790F7EC12 -2EA9CE466BDD9175E8D50EF54A5219997A440C689634B35CB4C440327CD35CB05AE77E39 -87D742854CEC4E4784D4C1B06340295D19C1944BCF826E96FF84B4C80E173892B6DEAB45 -DFC0BF6CE1142215881A64D73D10AE8BB835CAFEED23A7810FB3FA4E8D811809BECD7062 -2C9C6CE8725C331F42F991BC35674C0E451EB19887FF4792D738D4E22E4BB897C03E79BA -7F79F5CBFC2FB014BB58DEFF61A4AF62F3029F6829CF1DF5BD69FB1C73C68E36F2B3B1B2 -30B1D436D6DCA96563DA655E275ABB2AFD15D313D000D8E3F0D3461421D52B2A22623249 -E155D6276A5E6E0B5746C1BAB10B628092CD035976220A0121A3D16BC6B6F222511DA119 -E245943C5E7D68E32308EFD355CA3438436A5942292295282CB1FCDAE8B7A3AD3CB39CCC -5A6DDC8FC771700383C268F4D676E9DBDC33C14688F23179089396251728AF49BE24D02A -7CA4B1AA3CC148FB87E7C87EE41FE22723009FE89BD2DC689DDC9F034931ED7802B014F1 -C20D8F53EC110CDF35B8360FB1C58C9AA0F366260F36D21232E89FA1314476FFBA7F3AB8 -935147AF814D3BFF97635B11AB9EA47F6EF5952ABE438B536CF0FF25848F7480DFF36F43 -7CE6BD8701F4394A80E4D62731086ADAEEC41E6017A8AB72F890E9ED036C13BE24A7F2D0 -ABF1999B865B61349C501A9024FD08A319FB8E5DBA6E7283E8FC0BE48B9672CECD1F1091 -23A155914F163FD67AA466048A46DE447257D86C493B90178F37A23D66D192E552E46CB8 -E3C6D39B4CF574DF2C38CA6C74D0881E6E5C068766AC2898185BB326890F530984F3F31F -57F80C0220E2CDC14CE937420869C037B4C197C44B59FF91FAD5DAA875A7802A293679A8 -2AF31176B3DBDCA9FB5BF5C40038E7F119C61B7554F35DA79D942B9BE756497B3C9B7A19 -E5BCFFFD7BDD046EED61780D4CC5A7F8E3A78B7B2414212870BA0D27FF3C01B2AB030EEB -8F036B48673D6AB3460BB45939214BAB345B8D1FD6D2CDD3CAB37376244A7AC0FA3DF861 -60A193EE77CCCA93B2D984FA9CF07A54E9207EE127EF5B877A561216609567F9BD907BB2 -11A7383579FAB14FFACCFCC0E260DDCE27377C32FC039FF52A5D8059E7D4CFC880B0D634 -51482FC24A8E711B3D962A0926F4A0FBDF29036E0499FE6F5D115B7A95A059D6FCC36C87 -03DB34BB67B65F511637D91C428EED31371E9E9A00FA82BAC36AE2FDD0ADAD995E0E96FB -C909C5AC04BB213EBB5865A2CCE6942DD92EC73AF8C7D554A4B32910C7CE57EE79D11ACB -26D7CADECC469CF16953A50DDB0FF9A909F0382FC342CB38E2F3D8EDD0DC5919433386D1 -14B708E1AE5F01C2F08B8C8741D67BD1F02B4934A76D79B095AF43B68958BDE13D0F570B -71128A40A050BFF9C5D944C09A4B5D8AD0758B497771699B4E577436B15E31EF7D804663 -F768B9F5C9829EFFD5B479E1A0813E49D48705EFCCBCB2B23A7F0C39DAC69E7E35D7F4BA -770945D9F36A39D251B6CB76C88AD374E177B0F9D703865A69CEB6C0157419E781888F73 -47D0D641C43FF3521C3F380E26ADA5237ADE8C5FEEC8AF046C1B46903941181D958F16D1 -908D95A62869DE2DFD0AAC4D7441238B2ED50CDF729B10961883EC733F806C587C2D8F7D -B205AA3E7F6E34D5A2A2003E8CFDD22A63DAC1B04A11D77A6830CED7D9DA87BBD9E8D278 -275D1626D31054A23E9283FEC3D634BA1544AC5AD0E28DBD03C5CABF697DEAAE65D6167D -0E2EC4BC6C3B91581AC32B45F7ABA1B825848552D1413D1B5111168959A23F54C5B8E5E1 -B49C4096D5F546388E1279891E01D1FFDF63940F7AA520570B408C9C2CDA7F5A4B058919 -53B35D7523EA69927469DC90F6D8E15782204AE32885DC6BE6107D5EEFB29F69FBFECE44 -70CEFB37D0093844BE3ED424EFF064CF724A54B6B720ED020E70ADAC6716787FEEA1F22C -84A5E59BC6A643A29F50E3B76E6658D5BD8CA3554EA68CBFACD0CA0882B8E3389EE7945B -AC71B219233EE299C4C8FFB3BEB77BD483DE2A89DE4E697FA3A057EC47448CB99A7F1696 -00BBE4735D36408548405A8D4CE4209445DD0C4FFAA271ADCD14DDAA1598D44247156649 -1009AFC9B40874D4499857EF50BA7038F25A2159AAF9AC535EE1BC83E515D1439057F042 -C62DCB063AF8F014090AC771CC83DDFFFE0336CD4F14E3B6397E7AA442FF3C385A5A4B59 -2080801CC0BD5EA5F608A7936BD16248E3CAA7B49A475BEC9720EE44A06921A93375F344 -013752C467DB023F3F01FA7F427121DE5C4AFF495A06932C52FAA62C043B22ADA265BC90 -61B7702F9E44E326B54A423A472D23817F6135E05C1DDE477A9E27F42F5555E8FC22060B -D53ECBCA45C31C09BACC68EEA5126EE5E73502F2CF42BC5916B95590B778D556C4DB817B -2780787590B62405840D01F6B5301260E1EF0856219246C2CA7FBFB307FA728241E9A08F -F8FE0F6E708228172358EB98895B3C3C7FBAB501BEA9911A6C6769456E491C89B2FBD751 -C9339E174850B679B47118416AF8E849438FA52C4E2A0D1D8AB94385FED3747F9A8E78E5 -47FA728DA9C44F5D2296072A8ED789FAFFD237802988A20A8C16F78A50D2AB87A2BF8EC2 -8503F757AC6E9E556686A37D84D7B9DD81345E70D212D3D83E7D074A2BD9191D05205B27 -56E74664E1C3169AA601EE6276EB238E3EB9586C37ED4089E5C7AF97021FDADB6AAAF8ED -54CF169A574A7A6066EA74B3A255CFE9B6FDC2EABF4915325BEC03173370C41B71A65C08 -C4C809A78F52E89A27514E2771572235B8CE4E21229953786A90542924444BF56C163D41 -BCBDA2BD5981499D1BBFC7F7FDCD4EBAE43341EE9EBC04A5B3E86ABAACEE27AAAAEEA722 -63298EF83E19321B7CF9B1FAE2520159C2731E6023FBDDC81296BD2303788705D7A6FF72 -5ACD9365879F3742C0A375E23B124F85E2E533F958EDD9CEF05698E4F7E2C035EE665851 -E1B9B324D381BECE9AE126892F2B51826E44B80DF026FED2832BE1414CDC410B142E9248 -380FB3EF59A1CB8944C21E3B8F0450293E6FCE004AC4B002989C877AC2648964D137D881 -7C37A778E0EB56D243F6606A883875808323739C0B55B5F82C5BBC389566B7C24604D9E1 -9070CD37A2199B77BD81C6C0E4317AA361CD7F3D4CB2EEACF59D09FCB317C2E5656DD9EE -54D8D9C2FE364E21FDCC38F9FBE33457A70B75A4F9BE1DF8B6577B9E103F2276B77BDCA6 -0AB499915F331113F04C81F9572AFD95245AD3573A195D9CD1AF7D26FAB028F7A821DE62 -8132A99E8B39D4597457CBA2281394CF68069397BFB22BCF992989D8AFAFF25129A9F9CE -040FCB4752291D822EBD224DAC909194EAA4A07FC65F1EDC6C2D376190875FB8D2D19820 -7F71663705D83FE18CCAB848C11C5E112193D753B6A2BD9183054AE6021629E7927E4064 -9CEB4114C9B59F9827B98A70052FB67B5C45360C9C272DCD0C7DAC2A515707F6B63B2718 -B53B84441A28F777122D848B490C796185AD91E8474267D48B36DA7E3A7F70FC0F9319D3 -F937FD90AB3859794AC608FB96E283ED974159234761B8A114C8856FA00353C44D5C3976 -54488B0CFDBBC5A243595E2950E2ADFF06568551EC636B7D18FC1E68130F6623EB109415 -5F58F46A636EB98B30DE84A313ED1ED0EC0C8032B21ECFD11F2292A31E24E702D4723F50 -632F9D91DFF52142CFE2749A16B5B81F0ECEF869A7486191A3A910AE94C24471231B733D -FD6645C3856F341C0E1ECC17432635133CF66336D3C2C4F103C3EFE59FC7E45545A0A5A0 -CA19C0DBBF2B8CD3CBB482CD5BA7EBCA2CD5AC9E0C201FA4ACE28F00EB491ECEC3871AA9 -C0A303D585F94FCE1365117A59BD2644CE990F0A04239ED4B52CB5A0639BE554A2FFB03A -B9BC1E6C7989680B41BE26D2B01EFFE47819E737BBDB28868E0CEA2FFE4C7300B82E3016 -3BEEAA5EC834B2A2509BE99FCA5B087861C63EE1F84AACFA6FD77543D91C9C2E525BE531 -C02FF04A1F50C50B1F9CA7157F8A7787DD417868E48A035904BDA647EACC821F0ABB4053 -F19B502075211F1E1BD2714EE43D1AE7E19F8D13354D331E1935BB1246544EFA1DE7390F -7A561A6CC3F48C222A9C6C0B3A89714A16B3F61B6E26E3238FD641D431C7F6EC8005ECB3 -113C00A96AD8842746CF3D457F0F951D90C797716C3E8A08059207DBBB40D9095D8074E1 -069E36841ECC7EBF2081F293C194A044F5FD536D0F3B6551AD3CEA2FB84A5A32E20E34E2 -CDC9AF5E6839C3521EBECE2F4B39788F313FAB6D0F089BE45A7F4FB021D15C2661BA55F8 -691E8A9E5AE18FA617E5AC262F24962132E051BA7DDBBD3C5E7B3256ED5BBF7A670E0091 -B3AA0F6860559521C858CE6FC640029FD9D5FE03D1CC485A27080DE3BA08A36DDF87C81E -CE731AF1CE3F87FB19F91E324FF044110AE7C39110F9787C7F69E9C09FFBE37BA8B3DD17 -9B1EA5E176D6562DAC43992B8B5AED68898B6D56189426727100A36D92E2CB96672F58EE -EF30E90EC2569CEE9DA1B590F16B88E5E55FAEE2477E36E9CECA4D4DD9E969FC0D27CB94 -B5C3E738635D3C9AB4A0191CB553399EBB25D1D43DDA545A732B66DCF18A913EB214AAE9 -A408BC1E04449C07E114142FC22AC8639359B2413F3ADF5303088B00DBCD6AAF1ED46964 -F749F420207CE7CB3A27A4C260E174E17C6892695B3167B65271C232F1C67BCAD83B0216 -278FAD19834B58E7E1A2813EAB45DAC586EDEF11FF9CFC828811CC290C4EA40017A4BBD8 -889D5373B0002C0DCE55B2EABAB80E58B4341F386781264AD72C9B251255C0983AEB350B -03410B4C7E7E2ABE655E3A7AAB548D49C1EC489006EF4167BE2EA41CAD999E4CD6328ED0 -726C61B51EDF0952909C38480A6E801ADC241B50A972D31C7AC63BEB3746172F1CAFFA20 -D6E1009B9B1E79308ED3CD70D3F2975B0D241D8CDFD191A934E83E0BF3A938E19B3C461F -566B19516C068AD6BA4DF7CB37EA8343DB1ECD5CAEE329432E15147CE61AC4EEC2866463 -557C05CD59FCE1659245B7D8AB628F2ED8B24F6AD0B1AD37797FC20C098445EA1F43E3B3 -388550D0AFD24C74AAB269C1FE7596CF8F010D665111305ECFDEF52E89C240510D5D83F8 -FFC38DD47A537F55F7F79CB460F36812A1E3C26E8A7DD6131DA076BFA93D6C03E6E4C279 -D720B41A9CCD6A58EE1BD43A3035CDCE464BDC7CEBD79B867F30B0D15400B897A5ED7324 -A4A75568BD1211D036A5710F23C7A2E1D3F7E45C929FDA7ED13EFBEC7604427BCF853F92 -D954E627D0ED842663CFB64A2A6358C86F80FFB6A955C17B04B096D76B03DA9660D93004 -C44AAB74C40F99C702BBF33C4FE471ED4E6A0ABF3B15B340708D5D16FAB80D1E51F7D1A3 -8C7AC19A871C5D47963CE3CB961AF75A47C09B7AE97A3EB1C16D64D12A0798D5CAB48F68 -0E6B2DD1F7BCF7FD97719CBD7FCA4BC1CF31640675AB798F7A7CCD4E4A109E0E00A806F5 -8888F7A7091A9B7CFD350599C9AA0E7F679AB200035F48A57172C499737631A4F442F3A1 -BF5A3E5A2B77E02B66768DB9E76AE46E403E0E4BFBC1F14256ECD89BDF623F266389DF28 -AAC38991DDD4743F4A3B8EAEA45BF38EEFD1B7D3998B9B8542E78EB9FEFCB9D256EA8EA7 -6B56BA2A4849598F03483C59ED550D3508D12B35E4B82C2703883BBAFC0885BAE8B1440C -D2E368939FFE45BFEB172FCC597F19B089FC567332C97C3567C9DA05A3B99DADAB2BA61E -B9CFC9C1407322118C7B7BE2686FB5DBF0D31C5116F2F232AC8C3B6B1ED3E36AE2E9A638 -1E714212A76D2733DCF8F2BA8C1BB345A8B3D98162EE87C308539AEC3EC8EDA6CFDC423F -BDF208A89A906314950C1877A12E14C1DCBE5033474850128DFECB859E33F6EE578BB384 -DDC252AF788BD61E95E5375D134D6457B0A4690D7239440FF37E9F67CF10D1EE312653A0 -22702614C537EE7FFC677F630A079A98139EAA23FA2764B1D37CF5360002711890C12374 -CE980C83FF11E102C7AC31E4D96862CD3B8A77FB59FB8F3932750F21929B00912332196F -D9AABC0E4703C7BBB695FB1EC820CB6F69B9869FB819DD43AB4000BF70FA0320B5D3D2DF -8801021F0B0A45EEBCA8BFE6B616DCA4641358A4A18CFC749B17058929CAEFE146183C73 -BFD0BC668BE2EB8CC7003FBFC5F79373DAA86E4D9B65953031DCED7595D7779FA985FB1F -176161B955D22591CD434DA21E63FD9DF743B49B16A5ABE84E74293B1CE2BB4E2481770C -9B90A6641984001AF9E6DFB280D37922ED6A77D3C92F9E0F82B4CEC5FE92CFDCDF708EA3 -47EE98261C07F434E88A2042877D47C813992A1DBED99A6898288156CA26C7E473988BE2 -F5EC8DDD0FEE7D552832B69523330C12C6F0A307CDA286454EEBEB0B236AF69390B6FD9D -3546DE7015FBA1D36B08769D5DF07FFCC8AAAC31825F0F515813221E1D467F126CB9BDCD -E95DF5C7D64FF789BDB3A3339130A974D96606CBB812C8AEE855F29C5BDD9BA49FBDD481 -14DB68A228B685F35B5C33A9CE2CA9E0C30690831780284D6A75C9F9D86CC5A492EA5264 -09E1A2736EABD5FEF257F027B7363F8BF39519DB2940A1DFF0B3DCEC5CFBEE09633B4DF2 -6C29184ABEC66BB894F685BCF2AAF1301B1AB15398050C86A84E87491489F15FD2907D7D -ADD73C36FD0F7A40E021077CDD8AAA237DC9CB5E13C00EB7E91353BC58E0B8870BB319F5 -074B651F0D5179AABF87D023AFE75B3AA68D62FB959A5B6EFEA8D204C09F72B038A8C5D0 -9977F1457ED158E3BB57CE63EC2EE4577DE42F9D91AA5ADF0460374A36C972C33616D040 -2D8C1257C018B736CAD8BC182ECF63CEA524C8B3835E9CBF7618D930717C9DF018778787 -B5BD608E6DDE644B3CEC092A232B66420872C1412751FE7A72D604B7C01CB200506DD521 -F45DAE82F0C7CD4AB3B8E2E1B5A9B3D13546DA5A45A3195DC9A550D428882299614F9E8D -47E1674C7A95FE4B8E5EDA9D9499614A78DC322870B32E916C14088CFA3A76BA4F7CE4B6 -5C979130800F2F2D998F48DC5A2EC1CD18496402265677FD28F48CB38145EBDB30D2BBFF -15CA9FAEC6802D7BDC7F1A281DB9A6553B7D3F757A1FAA6AB91C0D31757FBE705EFE4C71 -AB0749AEFFE6768B35A0AC03636F4757B38C2F4C0A78EAA3557473913AC1AD37B72E79FB -75E2DA3A4A7AA867032A952D519BC5FC9BB684D0F21A661DEBE79B1C1513A16D8E32EB13 -E8DBB3F132C87ECE0972BF63001E8B9DC6C3F445191D536F8983B142BD94DD8F41C8756E -EFDB106BDEE3224FA448DAC03ACA80AE79B7DA40347D3C3A643B915C51BFCB861438C546 -1A59FB26B538BDFBB8D7DE77955A8FE6016F770BAB928D277CD4C2B3FD3839FE75308F21 -826B36084E485927C5DB75AA7B6133F468C71D218307B40CFE1BB6AD24E3C2240EE17084 -AF6C1E0D83CCE1699FDDB4763BC15F722D0383F5F4638785268FC439EB0A8C6B5AF7B938 -957DD111A83BA935CCF13A9DCBCAC9188CA67EDF1A6D18A34C956DE87418EA5E4796E59B -D981015C8D276CF4D8884AE423314AD62781108BA767131E08302A926C44B858B792DC52 -FBD6D15B5E9C4CABAA159FB5BCA5CAD068A5A718613598B518D015D3B6C43A01A5540849 -EC15F399A1DDEA9BDC47B409B10067FCCDA5932FD02BEF518433D8E7C83BA8567A2248DC -2271BB39F07414DF7655BCA33FA7811592168ABD559F49EC0F7968E87130093E607C2F1F -087154DA681D1C92C1B5EB87BFFF15C7DB4F8E319E42BDEC5B95A2F816BFC0A0CE997CB8 -BCCEA3DF23280D4C922482CA09EDA8C31F9C5FD9C22480DE591A3649A29F0293F976F366 -7A66D3923D6BEBD0C1A1F06C11C2C4207B2981E91DF0C0ABC84CE8B7B23B4837C51E2A94 -A7E3AB209AB5B99D40F39B1DE342502818A23235455B56BDCED3ACD910CD92E9E71DEF41 -0E3A01D9B7156F9DE0FC8916AB29D79F5B093C1CDD19CC1FDD6FFBD050ED563CA3C60022 -404A2E53E9EA3186A3177A57FB4B726DAFA37A4FD45D2C191E3E771C0CDA22EFAD7915B2 -15CCBD2A35E04CDF4779FE80B980ADE2D2E71B8F936D905AD7382B08C43A3ED6BBC5578C -80417621C7A3A87079ADF2B635671C36A1F57B971FF2918E14E80549150AB492D9709508 -ED98B983A9D40188F93847967A10FD16DFFE2C1276EACD959435C36899210DBEA62023A7 -ED706126E4E5E005B7608F078E3F0A42E87C84B37215F883E0F078127D47C4B362CEE951 -69F92B2887F67A3F1D02BEBF0277BA479264E7AD5E1087F613330246606F4907D3BA39C4 -644B7F9BC608BAC3107D9C66FF7CD9E9D624703055DFE0262E96B17BF017579001A7EE29 -4F4217B697CD9A397D35D8CB781D9FE282D9082D273AB082CCD017D7843E1AE3A41613F1 -F69AE113E8A993C83FFDBEDEFA92A9101B54D1AFB5BC7B41F3AB3C610E60AC17861E45B7 -34D7706BF6971921CF0E5344DC613EB31AB4E31775D990CEC15AF459BE474959EB24CABD -ED3B7D6A6540AA81B806D326D7614808FA2039A6675AC11F4E90EED294E867A84116FB5D -89BEB45F738B1275BBB4106108FB19D6EA4CA71E3B0C2BEA1EAC19D27EB928EBACA9DD62 -75865C4B86025B626202116190ECF58F149257C62C70EEEC110B540C636BBF747801A21F -B32A82CCF24062325AEB3B5DFEDD49AE625635C34CC330A93F1029F3A3A731537A0BF076 -C938773406C1670F4976AD1AAA5D3629EFE797A1133A683FBEC7DB8C480B32CA888ABB6F -049CDD5D65EAB1E23EABAEF26756618BF3CBA5D62286C938D3F6F20C731DB6044B89AF92 -F58FE18DC156E0F0D7A548C6D838F57899D7A693A6D158E5B9A19D4CCE4CE574FA1F9570 -7092879FA2C3F4AC5F223E3E0A174B97BB2CBC7815A20FF509B43D6EA17D515BDD9B3CF9 -4827C88EB2AC1FD13192752DB92070FBF319E4DD93EC6C9287108E248BC3F814CF3F85A4 -F6EEDCF1B78BBEE9987BB0767968894F13E299C79F50E052B7627584F1C78BC8EA588B4C -FB6C1204AAD2D47B42955EEE8563913BDC8167B5E82B48F3243F218E8832BCEED22BEEB6 -1B434A2AA2E93CB5654868F0A7E049852EE328F6A555AE92CB23702AE1B71B5E6EDF1BDE -ED68CA1E96EDD0A9B214C02A429479FE612C312D8B8BBE3DFD711D25D816709B78125476 -4AC1676AEB53B4CE261AD842C485829A8DBB25956041C5BBACB27B75F0659622F2791718 -110991560C261EC4834C976182843A56DC1918191840DFE95A5FA00624A6C24228805545 -4E7EDDCC9CA865B10991C4B73BBC16BBF6F0F4D4058FE9163BAC69EFB2A3269FE9F2A092 -BE8F9D59D9AD9F434998B44AB3892EA4360C38BFB150DA95EEEBA94B419D9D126410188B -475E794541F41D5C9D12D96BEDA86DF04640E6D766F0276BA1D0EE6E3B47A758D8D2D6DA -90B97B6ACFFA7D7BFEDF0BF7101F32248C7C72560F770D52AFCDC8F285846E00F5B0A83F -346B85D71DD49927304D228E2BE7980904A813AD23D5EE752D210FA2EBF72200914C8AA8 -ACD6B586437EAC4287C0D3C569E1969E71797949592DD7E1A65096819C7F3ED6218F1D0E -6FAFF3597787C9AF1C875E66878D55C64B2140B873C14F9D344E80F6E1434D0814B3C55C -7FF47038B2DD9104B7E836E0804B3E4042F5E1627E4C871AF0C42B498BD34475CDFD89CE -72E8D6DEAE27C84CBC4270348B684D5DB84C025A0CDD01F010F345ED7C75251990AC320B -AFF49806BAC46C8E87895DAD7D223A89AACBC9745439B6FB5B8603010AB29F2F9D3EB3D8 -24E2471720BC1ED2EE9BB61682AD6328D642B131780AB02A598BA9806C8327C43E1880D8 -37C5CDEB36BFD7812569F2FCBDF7B68934689238D59AB7D111FBF5BAD7DB4E85148373C9 -6016A50269968F2DB4824C1BA985C6FF1AC4BBB99F57232795F390BEA26222E79BB218A2 -23E68505A11925BCB27A403E5D27C9FB0EAFB29B7B6396CC58431D267FDB5DA11A64662A -EF150E3C268732F5EAC6C2FDF28FA507531ECAEBD55F4B0AB89D8F4C4CD41EAA211EDFD6 -65091948FF530681FBE7919E476C4DBE1397C51E4AA2C4BA1F0BBA3ED714E766E2638ECE -21B08E93C2EE29FB886C75B9436D2ADEB232736CFB5BAEED34EB47FF78CE41C6444377DE -8B7970BB19E9B52F5422305F14BB7AF0BF98F46D1D1E17B13E679C99112388F39827338E -E36498823D40CAB56D7C2749AAFF144D3F89A703F2F416C34592AAA4C6C30A96F3287868 -CE6F6EAA22A55E06F5D353F441E62A851A138B6E26631EF586EFA6952D428AF7D71901A9 -7E5BA59D462E10388C233E191AEEA380D9E2E23579C4345DB63F7691D0378F950B9CD2C2 -C0C17A8CF6144A7E81CDB3A5DAF7F2AE6A5F92E6910CA0D7A50569EA890FF71DD49D5012 -BD3FA623A1331BDE94EA4D2CD2C538AF787632B6339925FD6CBFD8ECBA7CC464B31DFFCA -F79AB027945A2C1E9C058ED8F0F3221A0353961BB2B2EA75876B74EDDDAFB7ABFEA39F38 -36A8E19C9372D3CD704A19B301BAD2801B16BEFF75BCADC90D2EEA514A199105FDAB37EC -8A75B14E67B638CAF1ADFBAF70D38355A66B513BFEDBBA2CC6981C25E364297C873C908E -A288D930A8A18AF24C38B92F520DB5A41D708A438BC39356730D028198A08AD3430237FB -8EC675CE19EAF97C06CDF706B138EAD722EAD2C7C6108A4C474210CE38A7A4EB0FF573DA -59B024BED3579A7C870AFF17EB284527030EAD8F515D18EE490FD5D32545527F38BE7B7D -CE9C1D1283B1771AAD8953E6D89EBC068E1C42C8431D6EC365F736652C4D74C627BC0689 -A3F273D9D9D94FF32CC504AADE91D4E17105EBA804952F566F0849A34B4E150223E5ED27 -786FD43209CC4F4EE8F4DB98D2C1DB336AE17E745DD8EB3D95A9984A632475430B0E80AE -49A5118C73F0E060C7AC98A8F03E9E7BCA9492AE7D5CED0AA5F177E5EA1F6FFB5AA43A13 -76C8FAD9344ECD8E6B64EDA15AA52B37DDE5AEF3242C236D2C5B401000EE78D62A889665 -2553636E765463181099C47679428ED39AD2F77F8F35DC07A726666751D8DF804635DB17 -C4A81D61036E8CE9CE5E441226584EC469082C6C765909DCE05DD9C9D932F295EB587B37 -C7C32818BA4126B809ED89CEC7F14494720018DC93BC5F2635B5F1ADECFC9B4D2B028FFE -AC248B2663FCD7A43E5468B43FA11E3BC439A5B519DFCDDE7403AB81F0771A7D85BCDF08 -B2C1DF316723EBCB4FBCEAA61454F48D6A354FCAA92E58757D9CE79F92166468522C00BC -FFD765E0F3BCCE1C41E1717BDAD21746C86310CB9490510FCE6DB36CAD377215650FD82B -9E3FD5E1188EB4D87A216B9B475DF5B634C39C87DD4B89EBF8DD52E7850E680F9CC7E610 -774D1F96C682B067FDC4456954D74B9D1FF2C18CCB9FB0C059517D174974D58D3376C32A -53A2F6C1E6844152C3EB1E954A095D9EFCF72158B0C58A1B55EB29741FFD07F55030A9EC -945C351CEE57273FBD4ECFDA6EB2A4FC374E1763B50648C68678B5FB5CDA2DA8D87EC85F -738F2C2F2DFD4F93E44CD2BC2BB5B8103073EC603487DB06311F97BBFBACF934E3524EC4 -3006CC8A613AD9DDADE1023D0044F0C27F577900A62888C75FCA2B1F7DC59683028FE95F -78039BACCF4E9710D3594B1205B5B08AAB01B04827A82516467C561E80484C2AF83781E0 -F947645951BC5CA167AADE20C8AE192CF9F800C409971D09BD173FE2FB130D8C543F4B57 -D7170BF0146B6138A12D9B04B717CB244E68A023E96E30918A1CBBC4A17EB994398BD47D -CE04656333D38F705EE4ED3A75E569A68409CBD18DF1FD537ABAE8E5D4E67D45FE12CD4B -5ADE49AA221D208F8C0C93FA8D659A01F2B9AC7869AAB3A69C1DC5B48FB8A91039BBA6E8 -3FE9985115B0B304F0E5293FFE5BC54CC84840EF951EAE7E4A1F0D4D1231E0A2F505F54B -9CC2E373991495EED14DCF911DB949E4FA0016D5DD8D1126BE6A149AACD3B51F26347320 -A064FA81697B41AA19D5EBB8500022559BBCFFEA94E6F6F5C8755D9B669418107341FB18 -6855A75AAB2D1FBCCD70DE7120277E9B9D8C9BAE1CED962255F61D28EE29C001D0758578 -0B24E2F7B0CD7EBE33EE42A55A217C5832730B414D5109844A5E9934CA865AD2AE9127C7 -CAC28FE451C17A44C8C79395762EB7747B2DD7780DA0B2145CD2732B2D62724271FE4B5D -96B882BF2C73F1E2BB9D700B83CE16AE2D6AB9726E12B09872EA940C1FADFEF125F89D09 -1FE5580E48ABF5493F9D8CC50CCCE629D6F8ACAF3998943225C5D2D795A1A10E2C1AC6D8 -B057F4A8225F0B24E4D6410F4A38D75D14601250E427EBFDD43AAF5E5C1EE0CCDB6D4504 -E3F854ED2EF4E8BDFA1F7422AB86B17896E6D3D0B14B81C515B489C3BE5B471461D6901D -B39949A0B137BF9AF0C3A8124BB3FB4C1DC43A9ECCC48DB999E5FEB94B60DF942AE440AA -4E69A70EEE8860EE2CE8570ABFA7519AC16AA1991540596881033B01CDB54E4DB401430B -20696CD808C73AEBB6E61A5C41C96D7FC338E6E92A112ABF427C6E0EB23E278B3E5967BE -13998C6786382093F74E2B067D428E9877F44DF94F6FEC76109987F3D7F13CE7C4C24648 -61128BB2C51BC858F4B87C3B3938698B4CE4CEAC0A73D872D5A43269B11B95D85FDB1F49 -545527BB2AA699944776B9A623DF59DB1B3035A6177A713667D78F7457C950D2664BA6DB -1076009612A6806B24AB931A8466BE6EED4BC7776F1AB926213490BDA0F8E65E84B960D2 -625E6FC88744371574FC22DE9CAC8E37D0F0BEDACE16C034A588888EBA681CB89FB9D2E5 -3F04BAE4629739F91C372321D3F2653E4D24439E6B8AAFD71184436B86AA3D9C0B170A54 -728385BF8B6ECCDB25ED1D3363837400E80789F16FC73CD235568FE7F51385693E41555A -F53AB56069EBF4F2B5D0C7859E988DCCAA37F0AD98EB34169D3E9BF7C664BE123640569D -89F1C34BACC3B967853750B3627FD055A2AE8B2BBD6DDC2F6AC54BC7FF5122A540D0D200 -FF8FCF17DFD821E8034BFFEC18E1CD7DF35D4E1D80614347D92743B7CBE2910AD330A5B1 -C1D5DC95379F601A289069159AC6183E283257AB2C97C8BB3D6500B012BC6A9F47B0A57F -2639AAD56552486847B304AD088CB8AEB07D032C4C275029A69563E350F3D64A67A7B88D -561AB9C9DE1FC593DFC448FAD9E42063AF99A70DC8EFDB928FEFF2225FA1DE159DE073E6 -3A55D312B9B1810B375E116D79617D0F348EB2184E8A150E94223C792193E1A096646EE2 -A0D82C33EBB19E422988824963C50BAAA8598B9D51DB4149A366F621852EF0B17B4A41A2 -3436A438D8E65735F6B4D1E2EF89A12E4002AC8E585BC407EE6F34CD2D7046E042C463EE -EBC4971A00B9A5F29102455E787BC66620D627385BAA3812F6B0BCF03AF1728064E1A8B7 -D7F5574C5DC22F5C0472CBD0E351F430823302827B31BF2338D85F80DDCCD3EA5E49B9A8 -8B8BBE6B0132C8198DA4436F609C27D13E7E561F05E783F04630B3EC03272F33E3F08419 -D5B4C16B386DCA42D17E89D7ACF46F6F4A79BBA082700F7F98327F2C7E62D8B1E6BFAF8C -212819FB632C3DCB4AC92A8A0F94F350FB0BE0C89503CD0A52B3AE4817C2CA7193563FE9 -20CC6F4E24C116AB47AF0E3313702E1E96BD9817C1297C30FC7178314E401E4CB3847ACB -1CBB1A672D928C1945E6629F626F66A679E9E39263C3A6804BA6A7D18F0CD0F1E01FEAFA -7786ECD7026C94DD0310F20E8BF525CF5EB072E1EE59E66FDBF54880401F7F66A4C5D019 -297B0EF4C6D3478BFE76B93FACE72F5CDEFFABEBD78DD06E377787E873CB76C7F5130748 -E42599B216AF2254DDFC5AA8146EA01E76FFA094DD65EBF264C301F1311A53E86082E20A -9B5E98CADFA0A10BE2A96CA3D0A33104911C1EF4CAE7E4E7CE3F6A765952D3E72E914DEB -FC50474634A05EC92FA59914A798E42044484FB6F7E3E5D1AF45828422B971D5E7B91601 -848A2624DC276C47F14441338E47FF6F1741A38939A8B75ADC8702F0553ACD787BD49F4C -D4D2CA40759C000A619BE27C2923D72438EB49D684DBBE48DBC67AF1935C9833B9E25252 -1E2869C7E808FC1ACD822659AC94F94FF2E11174FB7A7D199EDE962C61672D9F5D2C93F1 -BC99052FB782D94B08617E3C7BF232D9EDD6FD466A2ED7E55318F6E789E4A09F636B91E9 -6EE41F556224A8108BE1CFB2A83A57BA6C8995B6F7A5BE1D454A18CBF2E71FFC4D23A3B4 -9A202FEFF154CCE053BFABCC83CE4FE091E31B4759761F3D535348EF85AE276108592DCA -9A84E1EA28786F871636712C1B85B412DFE705AC768AC8F5B65BD49CE921CDDB5C4D41DF -BB2A7F14263AD2295F25ACFBF3F621D19437F0DDCB174280EA65836E9DCE638364E04085 -29F239946EB500E4455E7B79A412EB03C72D7D18A1EFC6A5C86AA2987C43E3987A5EF3F4 -F35712C790EB5137ABC92B2DAE1CD4E06E21B0DC03E2503687BA0DB73A4DDDEFB41C3BF5 -199ED14731480556C59F1127993C587517CC2406EFA6529122D90D9A9E4C1400B97B5DA0 -3A17AC4C5E238267969046365CA9ADE8D7C76746091704DF72709098602891ED11EE7AF8 -FD7B26DDE5E9CBD0BAB0E2E8C2B6BD49F2FF4CD016EE88B55F087152E7B2E4F67D081FAB -847050548D26D0FE5365833D2A4791018284552C1F40D9ECE2605A3BE0EE2ED5DECE4D4D -A8D5D81ED6101786D8AF3E5EBEB78FBECD7D3B471FF8C6900E12D0F45671D44DA582421F -9BBD5759CDCC9FEE1991520E8F84BB8ACA4A370237E4C4FF92BE8EE6C307DFC47078E167 -DA4C7B2740B9A429012F4BB8519507F2A18F51BDD82168B9576E29531A5B26CD7B0FD7DB -6E346CAB301B33CEBEE1F3D61D73B7D6145F89985653445FA519F91597A0F984DADE3094 -7109124D39A2A7E6D1CFDAF96A73FA0849075111F1ABC010A6871CC05709441C20CEF9B9 -A9AD1A8B1C207D0FE1E7D9D238D0A65EDAFE0BB3802D68CBF0B4CC151A8B330DD04E07DE -C3329735761D7FDE1ACC1B0E86566891E6AE571EB4936A3BC13A3684A52CAF7B7BD84C73 -C68F436156F5A1F05A1898FEAD0F35CF7778CC824139B47484C71C4EE3625F86D1B12317 -7620B46984D92F7C1D38D392F8981CA76FD1678CFDD43FA5F2A5B5F92FEDFF593F699866 -F063DA7E0AD329FF3C45A2236A3F7A6D420E3A66B2BE1BFBF1CC584BE3B68BA2714DB085 -1B803EB1A075C6B1495099C0A5CC7C51369BE2A79E23D793BCD72A8BD7DEC3E180ABF90D -D5D4137A796716083BBDD2C75EAEE01531EABFBD93F8D442525DD798E799D7EA30AB15BD -9A20FE527E524FD7D6BD01884C12044BD7E81DE8293F50F63201D31838FDC0C7B20EEB93 -2372EA2F80F325EBE41BFC037B9FFB5150E421E2E785B5DDB910C3569DCE72A9441AA858 -D0325B3BF2FB3FE83A3D558A63AED58F48C5ACD609D5E1B048A6B519E061E601F4387F03 -7049B8CD97F402EED07DF88A9FB133E9DE42A205727495050C9C6B9D346E0B159C704A3B -99F4F4A11A7B530F48BA5EFE0C6141F6F973C844BD43119D3AF52E22D2C6B615E53FB90B -E1683719BC94124D51559326EDCFE600F75B0427CCE88D215A5B57F6DC59F504F2A7AC5B -2B90F94AD673C8872A03DCDEB8712634E1BA3CB2E227ED6535160B62FABBC22B7FBA8174 -70E62F61792B40AAA5454010B2B008FB1DB7C11038CB98C8CD5401C95DB173A4AFD3CC0F -7E5F19B6DFDC8BDF118786ECE351307B0E4C30233C0177781085FA1B2C5D1EF51BF9490B -B6D1CD1C18F0782098F9E484F9420D635C79D6AC0740B7AE70BBBFEAF8B8958BD921D2A9 -798546BDD7858F810FEB5D84CF411AA3827A50420FE741BC3812CDE1865F4A2EF6A25A4C -ED7EB24CCD38095AFE425D3B0A90539A1CD93DE3F35B020D047EFCE7E1C5C18633B419A2 -1167ACFD3CC3EE0629C0717AE994F151BEFF9EF0AF6E0F14358FBFBA8B61D669ADA8C47C -AA03859AD7E8C07FC39514A8A85E5C5D02B5DDB48725BC15B70AB80FF7F563D481106810 -D8DF1EE07EAF9DB56374124F654CCB454E3C7B0BB490E0D9CB50460E1857C32C95021954 -35C010736A65A00FC28A348ECD4B494F5FEF4D236FBCB951535C546F248F0BAA11F372DD -67F838667C2657A7ABC4631530F275D7A5ED73DEC263A1749630C251ED3F5B9708876730 -0ED8DBD0F588D874267EE87E8486B700B58DE87DA46980B752B5EAA853699AE65D50A6D5 -1A41D217244B8BC5C39D98272731E8D605EEABE0E6E487BC89F5962D2423DAF0C580D424 -719EBA7E9FC3C8C49AA2ED9BF1B679C51EC07D7C4F4401DA63B66AF7061BAE89C443718E -EEA6FBD03E21DDAD5A1B2C251FF101AADE3FF3243F71CA14F19F71E3CB8689BE24E506C3 -C2E9BF2ADC82BFDBAD0C07082B75EAE1ECD31A8B90B9A582FEC64B65A8DF81E54B867EEB -E71C191443897E25FAC6EDE419F11912D284F8819AF00617BB03330055E5C49023BD472E -B32FE903E2C3A3BD9452389DA13CB1E4662ABFE88ABCA6DF0E55878CADFE425B8BF42313 -9107696719E947249B70C02251E24CBB3F3E027245651181113F3C2DDA0FF61B1243B6C4 -CDB870D3E05B7DA867C1853A6F8E53CDDD654831048A6F58EEDE299A70E0C18C02600DA3 -7D1507535286BD1C167BF37F925C8468967709EDBF94DFE0BFCFF11F0B715C77BF1FF7D7 -0BD8258DBDEE61ED4785F85DF2C52157FEC3C01282226FCC96E0ED8CDC8874A209E54A9C -0E8EDA0887E0561CE0B3ECBAB1019F39132E6DA0FE6761379C4424EFC66C36EB4AD7D125 -B88A0A7C19ABABD4A60FBDF0CC1414A77837EB57609D6E4C5DA8A37D18B05B4F755776FC -1930C15DFA2B545D8DCC65B7C8C4A3B9A8DBFC8C64CF90C1047828084070516FF3897E5C -CD223CA4E5DE09834C960D0483F48156CB48B73EB3387A01208AC9991949027675AB9AAF -B3D1AE8791DDA72EEA9053C50218F89B65935D6E40979F583456658C00C593034A067B3F -5B9F7177E6032F1F6BC96AD544F8B98472724D7F48C91D08B4CE91B5EE736A22996CD971 -34E2D4221E0891CA4C8708A6059DB1C48350106A304F7000A1D165D44CCD6F6EE7EA5434 -4F5506C13BA5D12A04548D75D266E0A027DE905EB4DF15ECA1CDFA1D4EE0B9D650AFF4A6 -3ED6A0AD78D63938669B505CD5B799DDB4A3BAD89CAB921F18D26DC9B581B0E28EA395A2 -349B5909107EE11E9CC364961A335C913A34094E63C9163E45A5FF43D3B58E5101E8E2F0 -AFCE604BC96F676F942301846A6F3C54AF5A4D60F37B7A4C3BE982FDEE76F0B8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -{restore}if diff --git a/locale/ppdc.pot b/locale/ppdc.pot deleted file mode 100644 index e69de29bb..000000000 diff --git a/packaging/cups.list.in b/packaging/cups.list.in index 3bd9b1c25..c901371db 100644 --- a/packaging/cups.list.in +++ b/packaging/cups.list.in @@ -280,10 +280,6 @@ f 0500 root sys $SERVERBIN/backend/lpd backend/lpd f 0500 root sys $SERVERBIN/backend/dnssd backend/dnssd l 0700 root sys $SERVERBIN/backend/mdns dnssd %endif -%system !darwin -f 0555 root sys $SERVERBIN/backend/parallel backend/parallel -%system all -f 0555 root sys $SERVERBIN/backend/serial backend/serial f 0555 root sys $SERVERBIN/backend/snmp backend/snmp f 0555 root sys $SERVERBIN/backend/socket backend/socket f 0555 root sys $SERVERBIN/backend/usb backend/usb @@ -299,27 +295,14 @@ f 0555 root sys $SERVERBIN/daemon/cups-driverd scheduler/cups-driverd f 0555 root sys $SERVERBIN/daemon/cups-polld scheduler/cups-polld d 0755 root sys $SERVERBIN/driver - d 0755 root sys $SERVERBIN/filter - -f 0555 root sys $SERVERBIN/filter/bannertops filter/bannertops -f 0555 root sys $SERVERBIN/filter/commandtoespcx driver/commandtoescpx -f 0555 root sys $SERVERBIN/filter/commandtopclx driver/commandtopclx f 0555 root sys $SERVERBIN/filter/commandtops filter/commandtops f 0555 root sys $SERVERBIN/filter/gziptoany filter/gziptoany -%if IMGFILTERS -f 0555 root sys $SERVERBIN/filter/imagetops filter/imagetops -f 0555 root sys $SERVERBIN/filter/imagetoraster filter/imagetoraster -%endif -%if PDFTOPS -f 0555 root sys $SERVERBIN/filter/pdftops filter/pdftops -%endif f 0555 root sys $SERVERBIN/filter/pstops filter/pstops -f 0555 root sys $SERVERBIN/filter/rastertoespcx driver/rastertoescpx f 0555 root sys $SERVERBIN/filter/rastertolabel filter/rastertolabel l 0755 root sys $SERVERBIN/filter/rastertodymo rastertolabel f 0555 root sys $SERVERBIN/filter/rastertoepson filter/rastertoepson f 0555 root sys $SERVERBIN/filter/rastertohp filter/rastertohp -f 0555 root sys $SERVERBIN/filter/rastertopclx driver/rastertopclx f 0555 root sys $SERVERBIN/filter/rastertopwg filter/rastertopwg -f 0555 root sys $SERVERBIN/filter/texttops filter/texttops d 0755 root sys $SERVERBIN/notifier - f 0555 root sys $SERVERBIN/notifier/mailto notifier/mailto diff --git a/packaging/cups.spec.in b/packaging/cups.spec.in index 5a0230540..6eb682395 100644 --- a/packaging/cups.spec.in +++ b/packaging/cups.spec.in @@ -18,16 +18,11 @@ # Conditional build options (--with name/--without name): # # dbus - Enable/disable DBUS support (default = enable) -# php - Enable/disable PHP support (default = enable) %{!?_with_dbus: %{!?_without_dbus: %define _with_dbus --with-dbus}} %{?_with_dbus: %define _dbus --enable-dbus} %{!?_with_dbus: %define _dbus --disable-dbus} -%{!?_with_php: %{!?_without_php: %define _with_php --with-php}} -%{?_with_php: %define _php --with-php} -%{!?_with_php: %define _php --without-php} - %{!?_with_static: %{!?_without_static: %define _without_static --without-static}} %{?_with_static: %define _static --enable-static} %{!?_with_static: %define _static --disable-static} @@ -70,13 +65,6 @@ Summary: CUPS - LPD support Group: System Environment/Daemons Requires: %{name} = %{epoch}:%{version} xinetd -%if %{?_with_php:1}%{!?_with_php:0} -%package php -Summary: CUPS - PHP support -Group: Development/Languages -Requires: %{name}-libs = %{epoch}:%{version} -%endif - %description CUPS is the standards-based, open source printing system developed by Apple Inc. for Mac OS® X and other UNIX®-like operating systems. @@ -90,17 +78,12 @@ This package provides the CUPS shared libraries. %description lpd This package provides LPD client support. -%if %{?_with_php:1}%{!?_with_php:0} -%description php -This package provides PHP support for CUPS. -%endif - %prep %setup %build CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_OPT_FLAGS" \ - ./configure %{_dbus} %{_php} %{_static} + ./configure %{_dbus} %{_static} # If we got this far, all prerequisite libraries must be here. make @@ -194,8 +177,6 @@ rm -rf $RPM_BUILD_ROOT %attr(0700,root,root) /usr/lib/cups/backend/ipp /usr/lib/cups/backend/ipps %attr(0700,root,root) /usr/lib/cups/backend/lpd -/usr/lib/cups/backend/parallel -/usr/lib/cups/backend/serial /usr/lib/cups/backend/snmp /usr/lib/cups/backend/socket /usr/lib/cups/backend/usb @@ -364,12 +345,6 @@ rm -rf $RPM_BUILD_ROOT %dir /usr/share/man/man8 /usr/share/man/man8/cups-lpd.8.gz -%if %{?_with_php:1}%{!?_with_php:0} -%files php -# PHP -/usr/lib*/php* -%endif - # # End of "$Id: cups.spec.in 7718 2008-07-10 23:04:22Z mike $". diff --git a/ppdc/Dependencies b/ppdc/Dependencies index 8d49d5843..ef9bd5a8e 100644 --- a/ppdc/Dependencies +++ b/ppdc/Dependencies @@ -154,8 +154,7 @@ ppdc-source.o: ../cups/cups.h ../cups/pwg-private.h ../cups/http-private.h ppdc-source.o: ../cups/http.h ../cups/md5-private.h ../cups/ipp-private.h ppdc-source.o: ../cups/ipp.h ../cups/language-private.h ../cups/transcode.h ppdc-source.o: ../cups/thread-private.h ../cups/raster.h ../cups/ppd.h -ppdc-source.o: ../data/epson.h ../data/escp.h ../data/hp.h ../data/label.h -ppdc-source.o: ../data/pcl.h +ppdc-source.o: ../data/epson.h ../data/hp.h ../data/label.h ppdc-string.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h ppdc-string.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h ppdc-string.o: ../cups/ipp.h ../cups/http.h ../cups/array.h diff --git a/ppdc/libcupsppdc.exp b/ppdc/libcupsppdc.exp deleted file mode 100644 index e69de29bb..000000000 diff --git a/ppdc/ppdc-source.cxx b/ppdc/ppdc-source.cxx index 43084498b..2e4934a63 100644 --- a/ppdc/ppdc-source.cxx +++ b/ppdc/ppdc-source.cxx @@ -66,10 +66,8 @@ #include #include #include "data/epson.h" -#include "data/escp.h" #include "data/hp.h" #include "data/label.h" -#include "data/pcl.h" #ifndef WIN32 # include #endif // !WIN32 @@ -3541,64 +3539,6 @@ ppdcSource::write_file(const char *f) // I - File to write { switch (d->type) { - case PPDC_DRIVER_ESCP : - cupsFilePuts(fp, " ModelNumber ("); - - if (d->model_number & ESCP_DOTMATRIX) - cupsFilePuts(fp, " $ESCP_DOTMATRIX"); - if (d->model_number & ESCP_MICROWEAVE) - cupsFilePuts(fp, " $ESCP_MICROWEAVE"); - if (d->model_number & ESCP_STAGGER) - cupsFilePuts(fp, " $ESCP_STAGGER"); - if (d->model_number & ESCP_ESCK) - cupsFilePuts(fp, " $ESCP_ESCK"); - if (d->model_number & ESCP_EXT_UNITS) - cupsFilePuts(fp, " $ESCP_EXT_UNITS"); - if (d->model_number & ESCP_EXT_MARGINS) - cupsFilePuts(fp, " $ESCP_EXT_MARGINS"); - if (d->model_number & ESCP_USB) - cupsFilePuts(fp, " $ESCP_USB"); - if (d->model_number & ESCP_PAGE_SIZE) - cupsFilePuts(fp, " $ESCP_PAGE_SIZE"); - if (d->model_number & ESCP_RASTER_ESCI) - cupsFilePuts(fp, " $ESCP_RASTER_ESCI"); - if (d->model_number & ESCP_REMOTE) - cupsFilePuts(fp, " $ESCP_REMOTE"); - - cupsFilePuts(fp, ")\n"); - break; - - case PPDC_DRIVER_PCL : - cupsFilePuts(fp, " ModelNumber ("); - - if (d->model_number & PCL_PAPER_SIZE) - cupsFilePuts(fp, " $PCL_PAPER_SIZE"); - if (d->model_number & PCL_INKJET) - cupsFilePuts(fp, " $PCL_INKJET"); - if (d->model_number & PCL_RASTER_END_COLOR) - cupsFilePuts(fp, " $PCL_RASTER_END_COLOR"); - if (d->model_number & PCL_RASTER_CID) - cupsFilePuts(fp, " $PCL_RASTER_CID"); - if (d->model_number & PCL_RASTER_CRD) - cupsFilePuts(fp, " $PCL_RASTER_CRD"); - if (d->model_number & PCL_RASTER_SIMPLE) - cupsFilePuts(fp, " $PCL_RASTER_SIMPLE"); - if (d->model_number & PCL_RASTER_RGB24) - cupsFilePuts(fp, " $PCL_RASTER_RGB24"); - if (d->model_number & PCL_PJL) - cupsFilePuts(fp, " $PCL_PJL"); - if (d->model_number & PCL_PJL_PAPERWIDTH) - cupsFilePuts(fp, " $PCL_PJL_PAPERWIDTH"); - if (d->model_number & PCL_PJL_HPGL2) - cupsFilePuts(fp, " $PCL_PJL_HPGL2"); - if (d->model_number & PCL_PJL_PCL3GUI) - cupsFilePuts(fp, " $PCL_PJL_PCL3GUI"); - if (d->model_number & PCL_PJL_RESOLUTION) - cupsFilePuts(fp, " $PCL_PJL_RESOLUTION"); - - cupsFilePuts(fp, ")\n"); - break; - case PPDC_DRIVER_LABEL : cupsFilePuts(fp, " ModelNumber "); diff --git a/ppdc/sample.drv b/ppdc/sample.drv index 9410cd787..1af2a6847 100644 --- a/ppdc/sample.drv +++ b/ppdc/sample.drv @@ -112,7 +112,7 @@ #media "w576h468/8.00x6.50\"" 576 468 // Common stuff for all drivers... -Attribute "cupsVersion" "" "1.5" +Attribute "cupsVersion" "" "1.6" Attribute "FileSystem" "" "False" Attribute "LandscapeOrientation" "" "Plus90" Attribute "TTRasterizer" "" "Type42" diff --git a/scheduler/client.c b/scheduler/client.c index 162822b00..9ee65ab74 100644 --- a/scheduler/client.c +++ b/scheduler/client.c @@ -3179,9 +3179,10 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ return (1); # elif defined(HAVE_GNUTLS) - int error; /* Error code */ + int status; /* Error code */ gnutls_certificate_server_credentials *credentials; /* TLS credentials */ + const char *priority; /* Priority string */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "encrypt_client(con=%p(%d))", con, @@ -3222,18 +3223,14 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ gnutls_init(&con->http.tls, GNUTLS_SERVER); gnutls_set_default_priority(con->http.tls); - gnutls_credentials_set(con->http.tls, GNUTLS_CRD_CERTIFICATE, *credentials); - gnutls_transport_set_ptr(con->http.tls, (gnutls_transport_ptr)HTTP(con)); - gnutls_transport_set_pull_function(con->http.tls, _httpReadGNUTLS); - gnutls_transport_set_push_function(con->http.tls, _httpWriteGNUTLS); - - error = gnutls_handshake(con->http.tls); - - if (error != GNUTLS_E_SUCCESS) + status = gnutls_priority_set_direct(con->http.tls, + "NORMAL:-VERS-TLS-ALL:+VERS-TLS1.0:" + "+VERS-SSL3.0:%COMPAT", &priority); + if (status != GNUTLS_E_SUCCESS) { cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to encrypt connection from %s - %s", - con->http.hostname, gnutls_strerror(error)); + "Unable to encrypt connection from %s - %s (%s)", + con->http.hostname, gnutls_strerror(status), priority); gnutls_deinit(con->http.tls); gnutls_certificate_free_credentials(*credentials); @@ -3242,6 +3239,27 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ return (0); } + gnutls_credentials_set(con->http.tls, GNUTLS_CRD_CERTIFICATE, *credentials); + gnutls_transport_set_ptr(con->http.tls, (gnutls_transport_ptr)HTTP(con)); + gnutls_transport_set_pull_function(con->http.tls, _httpReadGNUTLS); + gnutls_transport_set_push_function(con->http.tls, _httpWriteGNUTLS); + + while ((status = gnutls_handshake(con->http.tls)) != GNUTLS_E_SUCCESS) + { + if (gnutls_error_is_fatal(status)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to encrypt connection from %s - %s", + con->http.hostname, gnutls_strerror(status)); + + gnutls_deinit(con->http.tls); + gnutls_certificate_free_credentials(*credentials); + con->http.tls = NULL; + free(credentials); + return (0); + } + } + cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.", con->http.hostname); @@ -3282,9 +3300,6 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ if (!error) error = SSLSetIOFuncs(con->http.tls, _httpReadCDSA, _httpWriteCDSA); - if (!error) - error = SSLSetProtocolVersionEnabled(con->http.tls, kSSLProtocol2, false); - if (!error) error = SSLSetConnection(con->http.tls, HTTP(con)); diff --git a/scheduler/conf.c b/scheduler/conf.c index f83d3de26..2d30822b9 100644 --- a/scheduler/conf.c +++ b/scheduler/conf.c @@ -496,7 +496,7 @@ cupsdReadConfiguration(void) cupsdSetString(&DataDir, CUPS_DATADIR); cupsdSetString(&DocumentRoot, CUPS_DOCROOT); cupsdSetString(&AccessLog, CUPS_LOGDIR "/access_log"); - cupsdSetString(&ErrorLog, CUPS_LOGDIR "/error_log"); + cupsdClearString(&ErrorLog); cupsdSetString(&PageLog, CUPS_LOGDIR "/page_log"); cupsdSetString(&PageLogFormat, "%p %u %j %T %P %C %{job-billing} " @@ -718,6 +718,9 @@ cupsdReadConfiguration(void) if (!status) return (0); + if (!ErrorLog) + cupsdSetString(&ErrorLog, CUPS_LOGDIR "/error_log"); + RunUser = getuid(); cupsdLogMessage(CUPSD_LOG_INFO, "Remote access is %s.", diff --git a/scheduler/cups-driverd.cxx b/scheduler/cups-driverd.cxx index b4a3035a8..c8865dbde 100644 --- a/scheduler/cups-driverd.cxx +++ b/scheduler/cups-driverd.cxx @@ -1411,9 +1411,7 @@ load_drv(const char *filename, /* I - Actual filename */ * Add a dummy entry for the file... */ - httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "drv", "", "", 0, - "/%s", name); - add_ppd(name, uri, "", "", "", "", "", "", mtime, size, 0, + add_ppd(name, name, "", "", "", "", "", "", mtime, size, 0, PPD_TYPE_DRV, "drv"); ChangedPPD = 1; diff --git a/scheduler/cups-exec.c b/scheduler/cups-exec.c index 0081fb4c2..f6c5d66b3 100644 --- a/scheduler/cups-exec.c +++ b/scheduler/cups-exec.c @@ -27,8 +27,10 @@ #include #include #ifdef HAVE_SANDBOX_H -# define __APPLE_API_PRIVATE # include +# ifndef SANDBOX_NAMED_EXTERNAL +# define SANDBOX_NAMED_EXTERNAL 0x0003 +# endif /* !SANDBOX_NAMED_EXTERNAL */ #endif /* HAVE_SANDBOX_H */ diff --git a/scheduler/cupsd.order b/scheduler/cupsd.order deleted file mode 100644 index e69de29bb..000000000 diff --git a/scheduler/job.c b/scheduler/job.c index 08e2f0200..fdd09f0a0 100644 --- a/scheduler/job.c +++ b/scheduler/job.c @@ -2910,7 +2910,6 @@ finalize_job(cupsd_job_t *job, /* I - Job */ int exit_code; /* Exit code from backend */ - /* * Convert the status to an exit code. Due to the way the W* macros are * implemented on MacOS X (bug?), we have to store the exit status in a @@ -3163,7 +3162,9 @@ finalize_job(cupsd_job_t *job, /* I - Job */ if (job->history) { - if (job->status) + if (job->status && + (job->state_value == IPP_JOB_ABORTED || + job->state_value == IPP_JOB_STOPPED)) dump_job_history(job); else free_job_history(job); diff --git a/scheduler/log.c b/scheduler/log.c index de7b5458f..c5dff9754 100644 --- a/scheduler/log.c +++ b/scheduler/log.c @@ -516,15 +516,12 @@ cupsdLogMessage(int level, /* I - Log level */ * See if we want to log this message... */ - if (TestConfigFile) + if (TestConfigFile || (level <= LogLevel && !ErrorLog)) { - if (level <= CUPSD_LOG_WARN) - { - va_start(ap, message); - vfprintf(stderr, message, ap); - putc('\n', stderr); - va_end(ap); - } + va_start(ap, message); + vfprintf(stderr, message, ap); + putc('\n', stderr); + va_end(ap); return (1); } diff --git a/scripting/perl/CUPS.pm b/scripting/perl/CUPS.pm deleted file mode 100644 index 5f2ed5f14..000000000 --- a/scripting/perl/CUPS.pm +++ /dev/null @@ -1,144 +0,0 @@ -package CUPS; - -use 5.006; -use strict; -use warnings; -use Carp; - -require Exporter; -require DynaLoader; -use AutoLoader; - -our @ISA = qw(Exporter DynaLoader); - -# Items to export into callers namespace by default. Note: do not export -# names by default without a very good reason. Use EXPORT_OK instead. -# Do not simply export all your public functions/methods/constants. - -# This allows declaration use CUPS ':all'; -# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK -# will save memory. -our %EXPORT_TAGS = ( 'all' => [ qw( - CUPS_DATE_ANY - CUPS_VERSION - HTTP_MAX_BUFFER - HTTP_MAX_HOST - HTTP_MAX_URI - HTTP_MAX_VALUE - IPP_MAX_NAME - IPP_MAX_VALUES - IPP_PORT - PPD_MAX_LINE - PPD_MAX_NAME - PPD_MAX_TEXT - PPD_VERSION -) ] ); - -our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); - -our @EXPORT = qw( - CUPS_DATE_ANY - CUPS_VERSION - HTTP_MAX_BUFFER - HTTP_MAX_HOST - HTTP_MAX_URI - HTTP_MAX_VALUE - IPP_MAX_NAME - IPP_MAX_VALUES - IPP_PORT - PPD_MAX_LINE - PPD_MAX_NAME - PPD_MAX_TEXT - PPD_VERSION -); -our $VERSION = '1.2'; - -sub AUTOLOAD { - # This AUTOLOAD is used to 'autoload' constants from the constant() - # XS function. If a constant is not found then control is passed - # to the AUTOLOAD in AutoLoader. - - my $constname; - our $AUTOLOAD; - ($constname = $AUTOLOAD) =~ s/.*:://; - croak "& not defined" if $constname eq 'constant'; - my $val = constant($constname, @_ ? $_[0] : 0); - if ($! != 0) { - if ($! =~ /Invalid/ || $!{EINVAL}) { - $AutoLoader::AUTOLOAD = $AUTOLOAD; - goto &AutoLoader::AUTOLOAD; - } - else { - croak "Your vendor has not defined CUPS macro $constname"; - } - } - { - no strict 'refs'; - # Fixed between 5.005_53 and 5.005_61 - if ($] >= 5.00561) { - *$AUTOLOAD = sub () { $val }; - } - else { - *$AUTOLOAD = sub { $val }; - } - } - goto &$AUTOLOAD; -} - -bootstrap CUPS $VERSION; - -# Preloaded methods go here. - -# Autoload methods go after =cut, and are processed by the autosplit program. - -1; -__END__ -# Below is stub documentation for your module. You better edit it! - -=head1 NAME - -CUPS - Perl extension for blah blah blah - -=head1 SYNOPSIS - - use CUPS; - blah blah blah - -=head1 DESCRIPTION - -Stub documentation for CUPS, created by h2xs. It looks like the -author of the extension was negligent enough to leave the stub -unedited. - -Blah blah blah. - -=head2 EXPORT - -None by default. - -=head2 Exportable constants - - CUPS_DATE_ANY - CUPS_VERSION - HTTP_MAX_BUFFER - HTTP_MAX_HOST - HTTP_MAX_URI - HTTP_MAX_VALUE - IPP_MAX_NAME - IPP_MAX_VALUES - IPP_PORT - PPD_MAX_LINE - PPD_MAX_NAME - PPD_MAX_TEXT - PPD_VERSION - - -=head1 AUTHOR - -A. U. Thor, Ea.u.thor@a.galaxy.far.far.awayE - -=head1 SEE ALSO - -L. - -=cut diff --git a/scripting/perl/CUPS.xs b/scripting/perl/CUPS.xs deleted file mode 100644 index efaf6dc7a..000000000 --- a/scripting/perl/CUPS.xs +++ /dev/null @@ -1,270 +0,0 @@ -#include "EXTERN.h" -#include "perl.h" -#include "XSUB.h" - -#include -#include -#include -#include -#include - -static int -not_here(char *s) -{ - croak("%s not implemented on this architecture", s); - return -1; -} - -static double -constant_PPD_M(char *name, int len, int arg) -{ - if (5 + 3 >= len ) { - errno = EINVAL; - return 0; - } - switch (name[5 + 3]) { - case 'L': - if (strEQ(name + 5, "AX_LINE")) { /* PPD_M removed */ -#ifdef PPD_MAX_LINE - return PPD_MAX_LINE; -#else - goto not_there; -#endif - } - case 'N': - if (strEQ(name + 5, "AX_NAME")) { /* PPD_M removed */ -#ifdef PPD_MAX_NAME - return PPD_MAX_NAME; -#else - goto not_there; -#endif - } - case 'T': - if (strEQ(name + 5, "AX_TEXT")) { /* PPD_M removed */ -#ifdef PPD_MAX_TEXT - return PPD_MAX_TEXT; -#else - goto not_there; -#endif - } - } - errno = EINVAL; - return 0; - -not_there: - errno = ENOENT; - return 0; -} - -static double -constant_P(char *name, int len, int arg) -{ - if (1 + 3 >= len ) { - errno = EINVAL; - return 0; - } - switch (name[1 + 3]) { - case 'M': - if (!strnEQ(name + 1,"PD_", 3)) - break; - return constant_PPD_M(name, len, arg); - case 'V': - if (strEQ(name + 1, "PD_VERSION")) { /* P removed */ -#ifdef PPD_VERSION - return PPD_VERSION; -#else - goto not_there; -#endif - } - } - errno = EINVAL; - return 0; - -not_there: - errno = ENOENT; - return 0; -} - -static double -constant_H(char *name, int len, int arg) -{ - if (1 + 8 >= len ) { - errno = EINVAL; - return 0; - } - switch (name[1 + 8]) { - case 'B': - if (strEQ(name + 1, "TTP_MAX_BUFFER")) { /* H removed */ -#ifdef HTTP_MAX_BUFFER - return HTTP_MAX_BUFFER; -#else - goto not_there; -#endif - } - case 'H': - if (strEQ(name + 1, "TTP_MAX_HOST")) { /* H removed */ -#ifdef HTTP_MAX_HOST - return HTTP_MAX_HOST; -#else - goto not_there; -#endif - } - case 'U': - if (strEQ(name + 1, "TTP_MAX_URI")) { /* H removed */ -#ifdef HTTP_MAX_URI - return HTTP_MAX_URI; -#else - goto not_there; -#endif - } - case 'V': - if (strEQ(name + 1, "TTP_MAX_VALUE")) { /* H removed */ -#ifdef HTTP_MAX_VALUE - return HTTP_MAX_VALUE; -#else - goto not_there; -#endif - } - } - errno = EINVAL; - return 0; - -not_there: - errno = ENOENT; - return 0; -} - -static double -constant_IPP_M(char *name, int len, int arg) -{ - if (5 + 3 >= len ) { - errno = EINVAL; - return 0; - } - switch (name[5 + 3]) { - case 'N': - if (strEQ(name + 5, "AX_NAME")) { /* IPP_M removed */ -#ifdef IPP_MAX_NAME - return IPP_MAX_NAME; -#else - goto not_there; -#endif - } - case 'V': - if (strEQ(name + 5, "AX_VALUES")) { /* IPP_M removed */ -#ifdef IPP_MAX_VALUES - return IPP_MAX_VALUES; -#else - goto not_there; -#endif - } - } - errno = EINVAL; - return 0; - -not_there: - errno = ENOENT; - return 0; -} - -static double -constant_I(char *name, int len, int arg) -{ - if (1 + 3 >= len ) { - errno = EINVAL; - return 0; - } - switch (name[1 + 3]) { - case 'M': - if (!strnEQ(name + 1,"PP_", 3)) - break; - return constant_IPP_M(name, len, arg); - case 'P': - if (strEQ(name + 1, "PP_PORT")) { /* I removed */ -#ifdef IPP_PORT - return IPP_PORT; -#else - goto not_there; -#endif - } - } - errno = EINVAL; - return 0; - -not_there: - errno = ENOENT; - return 0; -} - -static double -constant_C(char *name, int len, int arg) -{ - if (1 + 4 >= len ) { - errno = EINVAL; - return 0; - } - switch (name[1 + 4]) { - case 'D': - if (strEQ(name + 1, "UPS_DATE_ANY")) { /* C removed */ -#ifdef CUPS_DATE_ANY - return CUPS_DATE_ANY; -#else - goto not_there; -#endif - } - case 'V': - if (strEQ(name + 1, "UPS_VERSION")) { /* C removed */ -#ifdef CUPS_VERSION - return CUPS_VERSION; -#else - goto not_there; -#endif - } - } - errno = EINVAL; - return 0; - -not_there: - errno = ENOENT; - return 0; -} - -static double -constant(char *name, int len, int arg) -{ - errno = 0; - switch (name[0 + 0]) { - case 'C': - return constant_C(name, len, arg); - case 'H': - return constant_H(name, len, arg); - case 'I': - return constant_I(name, len, arg); - case 'P': - return constant_P(name, len, arg); - } - errno = EINVAL; - return 0; - -not_there: - errno = ENOENT; - return 0; -} - - -MODULE = CUPS PACKAGE = CUPS - - -double -constant(sv,arg) - PREINIT: - STRLEN len; - INPUT: - SV * sv - char * s = SvPV(sv, len); - int arg - CODE: - RETVAL = constant(s,len,arg); - OUTPUT: - RETVAL - diff --git a/scripting/perl/Makefile.PL b/scripting/perl/Makefile.PL deleted file mode 100644 index f5e4bdd27..000000000 --- a/scripting/perl/Makefile.PL +++ /dev/null @@ -1,17 +0,0 @@ -use ExtUtils::MakeMaker; -# See lib/ExtUtils/MakeMaker.pm for details of how to influence -# the contents of the Makefile that is written. -WriteMakefile( - 'NAME' => 'CUPS', - 'VERSION_FROM' => 'CUPS.pm', # finds $VERSION - 'PREREQ_PM' => {}, # e.g., Module::Name => 1.1 - ($] >= 5.005 ? ## Add these new keywords supported since 5.005 - (ABSTRACT_FROM => 'CUPS.pm', # retrieve abstract from module - AUTHOR => 'A. U. Thor ') : ()), - 'LIBS' => ['-lcups '], # e.g., '-lm' - 'DEFINE' => '', # e.g., '-DHAVE_SOMETHING' - # Insert -I. if you add *.h files later: - 'INC' => '', # e.g., '-I/usr/include/other' - # Un-comment this if you add C files to link with later: - # 'OBJECT' => '$(O_FILES)', # link all the C files too -); diff --git a/scripting/perl/README b/scripting/perl/README deleted file mode 100644 index 1605c7798..000000000 --- a/scripting/perl/README +++ /dev/null @@ -1,35 +0,0 @@ -CUPS version 1.2 -================ - -The README is used to introduce the module and provide instructions on -how to install the module, any machine dependencies it may have (for -example C compilers and installed libraries) and any other information -that should be provided before the module is installed. - -A README file is required for CPAN modules since CPAN extracts the -README file from a module distribution so that people browsing the -archive can use it get an idea of the modules uses. It is usually a -good idea to provide version information here so that people can -decide whether fixes for the module are worth downloading. - -INSTALLATION - -To install this module type the following: - - perl Makefile.PL - make - make test - make install - -DEPENDENCIES - -This module requires these other modules and libraries: - - blah blah blah - -COPYRIGHT AND LICENCE - -Put the correct copyright and licence information here. - -Copyright (C) 2002 A. U. Thor blah blah blah - diff --git a/scripting/perl/test.pl b/scripting/perl/test.pl deleted file mode 100644 index acf31916b..000000000 --- a/scripting/perl/test.pl +++ /dev/null @@ -1,17 +0,0 @@ -# Before `make install' is performed this script should be runnable with -# `make test'. After `make install' it should work as `perl test.pl' - -######################### - -# change 'tests => 1' to 'tests => last_test_to_print'; - -use Test; -BEGIN { plan tests => 1 }; -use CUPS; -ok(1); # If we made it this far, we're ok. - -######################### - -# Insert your test code below, the Test module is use()ed here so read -# its man page ( perldoc Test ) for help writing this test script. - diff --git a/scripting/php/Dependencies b/scripting/php/Dependencies deleted file mode 100644 index d3c60c70f..000000000 --- a/scripting/php/Dependencies +++ /dev/null @@ -1,7 +0,0 @@ -# DO NOT DELETE THIS LINE -- make depend depends on it. - -phpcups.o: ../../cups/string-private.h ../../config.h phpcups.h -phpcups.o: ../../cups/cups.h ../../cups/file.h ../../cups/versioning.h -phpcups.o: ../../cups/ipp.h ../../cups/http.h ../../cups/array.h -phpcups.o: ../../cups/language.h ../../cups/language.h -phpcups.o: ../../cups/debug-private.h diff --git a/scripting/php/Makefile b/scripting/php/Makefile deleted file mode 100644 index a10f4f49c..000000000 --- a/scripting/php/Makefile +++ /dev/null @@ -1,153 +0,0 @@ -# -# "$Id: Makefile 3572 2003-04-08 19:56:25Z mike $" -# -# PHP Makefile for CUPS. -# -# Copyright 2007-2011 by Apple Inc. -# Copyright 1997-2007 by Easy Software Products, all rights reserved. -# -# These coded instructions, statements, and computer programs are the -# property of Apple Inc. and are protected by Federal copyright -# law. Distribution and use rights are outlined in the file "LICENSE.txt" -# which should have been included with this file. If this file is -# file is missing or damaged, see the license at "http://www.cups.org/". -# - -include ../../Makedefs - - -# -# Where to install and how to compile the PHP module... -# - -PHPDIR = $(BUILDROOT)`$(PHPCONFIG) --extension-dir` -OPTIONS = $(PHPOPTIONS) - - -# -# Object files... -# - -OBJS = phpcups.o - - -# -# Targets in this directory... -# - -PHPCUPS = phpcups.so - - -# -# Make all targets... -# - -all: $(PHPCUPS) - - -# -# Make library targets... -# - -libs: - - -# -# Make unit tests... -# - -unittests: - - -# -# Remove object and target files... -# - -clean: - $(RM) $(OBJS) $(PHPCUPS) - - -# -# Update dependencies (without system header dependencies...) -# - -depend: - makedepend -Y -I../.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1 - - -# -# Install all targets... -# - -install: all install-data install-headers install-libs install-exec - - -# -# Install data files... -# - -install-data: - - -# -# Install programs... -# - -install-exec: - echo Installing $(PHPCUPS) in $(PHPDIR) - $(INSTALL_DIR) $(PHPDIR) - $(INSTALL_LIB) $(PHPCUPS) $(PHPDIR) - if test "x$(SYMROOT)" != x; then \ - $(INSTALL_DIR) $(SYMROOT); \ - cp $(PHPCUPS) $(SYMROOT); \ - fi - - -# -# Install headers... -# - -install-headers: - - -# -# Install libraries... -# - -install-libs: - - -# -# Uninstall object and target files... -# - -uninstall: - $(RM) $(PHPDIR)/$(PHPCUPS) - -$(RMDIR) $(PHPDIR) - - -# -# phpcups.so -# - -phpcups.so: $(OBJS) ../../Makedefs - echo Linking $@... - if test `uname` = Darwin; then \ - DSOFLAGS="-bundle -flat_namespace -undefined suppress $(RC_CFLAGS)"; \ - else \ - DSOFLAGS="$(DSOFLAGS)"; \ - fi; \ - echo $(DSO) $$DSOFLAGS $(ARCHFLAGS) -o $@ $(OBJS) -L../../cups $(LIBS); \ - $(DSO) $$DSOFLAGS $(ARCHFLAGS) -o $@ $(OBJS) -L../../cups $(LIBS) - - -# -# Dependencies... -# - -include Dependencies - - -# -# End of "$Id: Makefile 3572 2003-04-08 19:56:25Z mike $". -# diff --git a/scripting/php/README b/scripting/php/README deleted file mode 100644 index e4ab27d84..000000000 --- a/scripting/php/README +++ /dev/null @@ -1,157 +0,0 @@ -README - 02/25/2006 -------------------- - -INTRODUCTION - - This directory contains a dynamically loadable CUPS extension - module for PHP 4 and 5. The CUPS 1.2 module has been - substantially updated to provide an API more consistent with - the C API and is NOT compatible with the CUPS 1.1 module. - - -COMPILING AND INSTALLING - - Run "make" to compile the PHP CUPS extension: - - make - - To install it, type: - - make install - - -RESOURCES AND SUPPORT - - Questions should be reported to the CUPS newsgroups/mailing - lists at: - - http://www.cups.org/newsgroups.php - - Bug reports and enhancement requests can be submitted via the - form at: - - http://www.cups.org/str.php - - -QUICK REFERENCE DOCUMENTATION - - In lieu of actual documentation, the following definitions - can be used as a quick reference to the supported functions: - - - CUPS_CANCEL_JOB - - Cancels a job on the named destination: - - bool cups_cancel_job(string dest, int id) - - The return value is TRUE on success and FALSE on failure. - - Example: - - if (!cups_cancel_job("myprinter", 123)) - print("Unable to cancel job: " . cups_last_error_string() . "\n"); - - - CUPS_GET_DESTS - - Gets a list of available destinations: - - array cups_get_dests() - - The return value is an array of objects with the following - properties: - - name The name of the printer or class - instance The instance of the printer or class - is_default TRUE if the printer or class is the default destination - options Associative array of options and their values - - Example: - - $dest = cups_get_dests(); - - - CUPS_GET_JOBS - - Gets a list of jobs: - - array cups_get_jobs(string dest, bool myjobs, int completed) - - The "dest" string can be blank for jobs on all destinations. - Pass TRUE for "myjobs" to only get jobs for the current user. - The "completed" argument can be 0 for pending jobs, 1 for - completed jobs, and -1 for all jobs. - - The return value is an array of objects with the following - properties: - - id The job ID - dest Printer or class name - title Title/job name - user User the submitted the job - format Document format - state Job state - size Size in kilobytes - priority Priority (1-100) - completed_time Time the job was completed - creation_time Time the job was created - processing_time Time the job was processed - - Example: - - $jobs = cups_get_jobs("", FALSE, -1); - - - CUPS_LAST_ERROR - - Returns the IPP status code for the most recent request: - - int cups_last_error() - - Example: - - $error = cups_last_error(); - - - CUPS_LAST_ERROR_STRING - - Returns the IPP status-message string for the most recent request: - - string cups_last_error_string() - - Example: - - $message = cups_last_error_string(); - - - CUPS_PRINT_FILE - - Prints a single file to a printer or class: - - int cups_print_file(string dest, string filename, string title, - array options) - - The return value is the job ID or 0 if there was an error. - - Example: - - $options = array("name" => "value", "name2" => "value2"); - $id = cups_print_file("dest", "filename", "title", $options); - - - CUPS_PRINT_FILES - - Prints one or more files to a printer or class: - - int cups_print_files(string dest, array files, string title, - array options); - - The return value is the job ID or 0 if there was an error. - - Example: - - $files = array("file1", "file2", "file3"); - $options = array("name" => "value", "name2" => "value2"); - $id = cups_print_file("dest", $files, "title", $options); - diff --git a/scripting/php/phpcups.c b/scripting/php/phpcups.c deleted file mode 100644 index e1fb4d4c9..000000000 --- a/scripting/php/phpcups.c +++ /dev/null @@ -1,487 +0,0 @@ -/* - * "$Id: phpcups.c 7624 2008-06-09 15:55:04Z mike $" - * - * Printing utilities for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1997-2007 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * cups_convert_options() - Convert a PHP options array to a CUPS options array. - * zm_startup_phpcups() - Initialize the CUPS module. - * zif_cups_cancel_job() - Cancel a job. - * zif_cups_get_dests() - Get a list of printers and classes. - * zif_cups_get_jobs() - Get a list of jobs. - * zif_cups_last_error() - Return the last IPP status code. - * zif_cups_last_error_string() - Return the last IPP status - * zif_cups_print_file() - Print a single file. - * zif_cups_print_files() - Print multiple files. - */ - -/* - * Include necessary headers... - */ - -#include -#include "php.h" -#include "php_ini.h" -#include "ext/standard/info.h" -#include "phpcups.h" - - -/* - * PHP function list... - */ - -function_entry phpcups_functions[] = -{ - PHP_FE(cups_cancel_job, NULL) - PHP_FE(cups_get_dests, NULL) - PHP_FE(cups_get_jobs, NULL) - PHP_FE(cups_last_error, NULL) - PHP_FE(cups_last_error_string, NULL) - PHP_FE(cups_print_file, NULL) - PHP_FE(cups_print_files, NULL) - {NULL, NULL, NULL} -}; - - -/* - * PHP module info... - */ - -zend_module_entry phpcups_module_entry = -{ - STANDARD_MODULE_HEADER, - "phpcups", - phpcups_functions, - PHP_MINIT(phpcups), - NULL, - NULL, - NULL, - NULL, - CUPS_SVERSION, - STANDARD_MODULE_PROPERTIES -}; - - -ZEND_GET_MODULE(phpcups) - - -/* - * 'cups_convert_options()' - Convert a PHP options array to a CUPS options array. - */ - -static int /* O - Number of options */ -cups_convert_options( - zval *optionsobj, /* I - Options array object */ - cups_option_t **options) /* O - Options */ -{ - int num_options; /* Number of options */ - HashTable *ht; /* Option array hash table */ - Bucket *current; /* Current element in array */ - zval *value; /* Current value in array */ - char temp[255]; /* String value for numbers */ - - - ht = Z_ARRVAL_P(optionsobj); - num_options = 0; - - for (current = ht->pListHead; current; current = current->pListNext) - { - value = (zval *)current->pDataPtr; - - switch (Z_TYPE_P(value)) - { - case IS_LONG : - sprintf(temp, "%ld", Z_LVAL_P(value)); - num_options = cupsAddOption(current->arKey, temp, num_options, - options); - break; - - case IS_DOUBLE : - sprintf(temp, "%g", Z_DVAL_P(value)); - num_options = cupsAddOption(current->arKey, temp, num_options, - options); - break; - - case IS_BOOL : - num_options = cupsAddOption(current->arKey, - Z_BVAL_P(value) ? "true" : "false", - num_options, options); - break; - - case IS_STRING : - num_options = cupsAddOption(current->arKey, Z_STRVAL_P(value), - num_options, options); - break; - } - } - - return (num_options); -} - - -/* - * 'zm_startup_phpcups()' - Initialize the CUPS module. - */ - -PHP_MINIT_FUNCTION(phpcups) -{ - REGISTER_LONG_CONSTANT("CUPS_PRINTER_LOCAL", CUPS_PRINTER_LOCAL, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_CLASS", CUPS_PRINTER_CLASS, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_REMOTE", CUPS_PRINTER_REMOTE, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_BW", CUPS_PRINTER_BW, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_COLOR", CUPS_PRINTER_COLOR, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_DUPLEX", CUPS_PRINTER_DUPLEX, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_STAPLE", CUPS_PRINTER_STAPLE, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_COPIES", CUPS_PRINTER_COPIES, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_COLLATE", CUPS_PRINTER_COLLATE, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_PUNCH", CUPS_PRINTER_PUNCH, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_COVER", CUPS_PRINTER_COVER, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_BIND", CUPS_PRINTER_BIND, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_SORT", CUPS_PRINTER_SORT, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_SMALL", CUPS_PRINTER_SMALL, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_MEDIUM", CUPS_PRINTER_MEDIUM, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_LARGE", CUPS_PRINTER_LARGE, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_VARIABLE", CUPS_PRINTER_VARIABLE, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_IMPLICIT", CUPS_PRINTER_IMPLICIT, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_DEFAULT", CUPS_PRINTER_DEFAULT, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_FAX", CUPS_PRINTER_FAX, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_REJECTING", CUPS_PRINTER_REJECTING, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_DELETE", CUPS_PRINTER_DELETE, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_NOT_SHARED", CUPS_PRINTER_NOT_SHARED, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_AUTHENTICATED", CUPS_PRINTER_AUTHENTICATED, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_COMMANDS", CUPS_PRINTER_COMMANDS, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_DISCOVERED", CUPS_PRINTER_DISCOVERED, CONST_CS); - REGISTER_LONG_CONSTANT("CUPS_PRINTER_OPTIONS", CUPS_PRINTER_OPTIONS, CONST_CS); - - REGISTER_LONG_CONSTANT("IPP_OK", IPP_OK, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_OK_SUBST", IPP_OK_SUBST, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_OK_CONFLICT", IPP_OK_CONFLICT, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_OK_IGNORED_SUBSCRIPTIONS", IPP_OK_IGNORED_SUBSCRIPTIONS, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_OK_IGNORED_NOTIFICATIONS", IPP_OK_IGNORED_NOTIFICATIONS, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_OK_TOO_MANY_EVENTS", IPP_OK_TOO_MANY_EVENTS, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_OK_BUT_CANCEL_SUBSCRIPTION", IPP_OK_BUT_CANCEL_SUBSCRIPTION, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_OK_EVENTS_COMPLETE", IPP_OK_EVENTS_COMPLETE, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_REDIRECTION_OTHER_SITE", IPP_REDIRECTION_OTHER_SITE, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_BAD_REQUEST", IPP_BAD_REQUEST, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_FORBIDDEN", IPP_FORBIDDEN, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_NOT_AUTHENTICATED", IPP_NOT_AUTHENTICATED, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_NOT_AUTHORIZED", IPP_NOT_AUTHORIZED, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_NOT_POSSIBLE", IPP_NOT_POSSIBLE, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_TIMEOUT", IPP_TIMEOUT, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_NOT_FOUND", IPP_NOT_FOUND, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_GONE", IPP_GONE, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_REQUEST_ENTITY", IPP_REQUEST_ENTITY, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_REQUEST_VALUE", IPP_REQUEST_VALUE, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_DOCUMENT_FORMAT", IPP_DOCUMENT_FORMAT, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_ATTRIBUTES", IPP_ATTRIBUTES, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_URI_SCHEME", IPP_URI_SCHEME, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_CHARSET", IPP_CHARSET, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_CONFLICT", IPP_CONFLICT, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_COMPRESSION_NOT_SUPPORTED", IPP_COMPRESSION_NOT_SUPPORTED, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_COMPRESSION_ERROR", IPP_COMPRESSION_ERROR, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_DOCUMENT_FORMAT_ERROR", IPP_DOCUMENT_FORMAT_ERROR, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_DOCUMENT_ACCESS_ERROR", IPP_DOCUMENT_ACCESS_ERROR, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_ATTRIBUTES_NOT_SETTABLE", IPP_ATTRIBUTES_NOT_SETTABLE, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_IGNORED_ALL_SUBSCRIPTIONS", IPP_IGNORED_ALL_SUBSCRIPTIONS, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_TOO_MANY_SUBSCRIPTIONS", IPP_TOO_MANY_SUBSCRIPTIONS, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_IGNORED_ALL_NOTIFICATIONS", IPP_IGNORED_ALL_NOTIFICATIONS, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_PRINT_SUPPORT_FILE_NOT_FOUND", IPP_PRINT_SUPPORT_FILE_NOT_FOUND, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_INTERNAL_ERROR", IPP_INTERNAL_ERROR, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_OPERATION_NOT_SUPPORTED", IPP_OPERATION_NOT_SUPPORTED, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_SERVICE_UNAVAILABLE", IPP_SERVICE_UNAVAILABLE, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_VERSION_NOT_SUPPORTED", IPP_VERSION_NOT_SUPPORTED, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_DEVICE_ERROR", IPP_DEVICE_ERROR, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_TEMPORARY_ERROR", IPP_TEMPORARY_ERROR, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_NOT_ACCEPTING", IPP_NOT_ACCEPTING, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_PRINTER_BUSY", IPP_PRINTER_BUSY, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_ERROR_JOB_CANCELLED", IPP_ERROR_JOB_CANCELLED, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_MULTIPLE_JOBS_NOT_SUPPORTED", IPP_MULTIPLE_JOBS_NOT_SUPPORTED, CONST_CS); - REGISTER_LONG_CONSTANT("IPP_PRINTER_IS_DEACTIVATED", IPP_PRINTER_IS_DEACTIVATED, CONST_CS); - - return (SUCCESS); -} - -/* - * 'zif_cups_cancel_job()' - Cancel a job. - */ - -PHP_FUNCTION(cups_cancel_job) -{ - char *dest; /* Destination */ - int dest_len, /* Length of destination */ - id; /* Job ID */ - - - if (ZEND_NUM_ARGS() != 2 || - zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &dest, &dest_len, &id)) - { - WRONG_PARAM_COUNT; - } - - RETURN_LONG(cupsCancelJob(dest, id)); -} - - -/* - * 'zif_cups_get_dests()' - Get a list of printers and classes. - */ - -PHP_FUNCTION(cups_get_dests) -{ - int i, j, /* Looping vars */ - num_dests; /* Number of destinations */ - cups_dest_t *dests, /* Destinations */ - *dest; /* Current destination */ - cups_option_t *option; /* Current option */ - zval *destobj, /* Destination object */ - *optionsobj; /* Options object */ - - - if (ZEND_NUM_ARGS() != 0) - { - WRONG_PARAM_COUNT; - } - - if ((num_dests = cupsGetDests(&dests)) <= 0) - { - RETURN_NULL(); - } - - if (array_init(return_value) == SUCCESS) - { - for (i = 0, dest = dests; i < num_dests; i ++, dest ++) - { - MAKE_STD_ZVAL(destobj); - - if (object_init(destobj) == SUCCESS) - { - /* - * Add properties to the destination for each of the cups_dest_t - * members... - */ - - add_property_string(destobj, "name", dest->name, 1); - add_property_string(destobj, "instance", - dest->instance ? dest->instance : "", 1); - add_property_long(destobj, "is_default", dest->is_default); - - /* - * Create an associative array for the options... - */ - - MAKE_STD_ZVAL(optionsobj); - - if (array_init(optionsobj) == SUCCESS) - { - for (j = 0, option = dest->options; - j < dest->num_options; - j ++, option ++) - add_assoc_string(optionsobj, option->name, option->value, 1); - - add_property_zval(destobj, "options", optionsobj); - } - - add_index_zval(return_value, i, destobj); - } - } - } - - cupsFreeDests(num_dests, dests); -} - - -/* - * 'zif_cups_get_jobs()' - Get a list of jobs. - */ - -PHP_FUNCTION(cups_get_jobs) -{ - char *dest; /* Destination */ - int dest_len, /* Length of destination */ - myjobs, /* Only show my jobs? */ - completed; /* Show completed jobs? */ - int i, /* Looping var */ - num_jobs; /* Number of jobs */ - cups_job_t *jobs, /* Jobs */ - *job; /* Current job */ - zval *jobobj; /* Job object */ - - - - - if (ZEND_NUM_ARGS() != 3 || - zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sll", &dest, &dest_len, &myjobs, &completed)) - { - WRONG_PARAM_COUNT; - } - - if (!*dest) - dest = NULL; - - if ((num_jobs = cupsGetJobs(&jobs, dest, myjobs, completed)) <= 0) - { - RETURN_NULL(); - } - - if (array_init(return_value) == SUCCESS) - { - for (i = 0, job = jobs; i < num_jobs; i ++, job ++) - { - MAKE_STD_ZVAL(jobobj); - - if (object_init(jobobj) == SUCCESS) - { - /* - * Add properties to the job for each of the cups_job_t - * members... - */ - - add_property_long(jobobj, "id", job->id); - add_property_string(jobobj, "dest", job->dest, 1); - add_property_string(jobobj, "title", job->title, 1); - add_property_string(jobobj, "user", job->user, 1); - add_property_string(jobobj, "format", job->format, 1); - add_property_long(jobobj, "state", job->state); - add_property_long(jobobj, "size", job->size); - add_property_long(jobobj, "priority", job->priority); - add_property_long(jobobj, "completed_time", job->completed_time); - add_property_long(jobobj, "creation_time", job->creation_time); - add_property_long(jobobj, "processing_time", job->processing_time); - - add_index_zval(return_value, i, jobobj); - } - } - } - - cupsFreeJobs(num_jobs, jobs); -} - - -/* - * 'zif_cups_last_error()' - Return the last IPP status code. - */ - -PHP_FUNCTION(cups_last_error) -{ - if (ZEND_NUM_ARGS() != 0) - { - WRONG_PARAM_COUNT; - } - - RETURN_LONG(cupsLastError()); -} - - -/* - * 'zif_cups_last_error_string()' - Return the last IPP status-message. - */ - -PHP_FUNCTION(cups_last_error_string) -{ - if (ZEND_NUM_ARGS() != 0) - { - WRONG_PARAM_COUNT; - } - - RETURN_STRING((char *)cupsLastErrorString(), 1); -} - - -/* - * 'zif_cups_print_file()' - Print a single file. - */ - -PHP_FUNCTION(cups_print_file) -{ - char *dest; /* Destination */ - int dest_len; /* Length of destination */ - char *filename; /* Filename */ - int filename_len; /* Length of filename */ - char *title; /* Title */ - int title_len; /* Length of title */ - zval *optionsobj; /* Array of options */ - int num_options; /* Number of options */ - cups_option_t *options; /* Options */ - int id; /* Job ID */ - - - if (ZEND_NUM_ARGS() != 4 || - zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sssa", &dest, &dest_len, - &filename, &filename_len, - &title, &title_len, &optionsobj)) - { - WRONG_PARAM_COUNT; - } - - num_options = cups_convert_options(optionsobj, &options); - - id = cupsPrintFile(dest, filename, title, num_options, options); - - cupsFreeOptions(num_options, options); - - RETURN_LONG(id); -} - - -/* - * 'zif_cups_print_files()' - Print multiple files. - */ - -PHP_FUNCTION(cups_print_files) -{ - char *dest; /* Destination */ - int dest_len; /* Length of destination */ - zval *filesobj; /* Files array */ - int num_files; /* Number of files */ - const char *files[1000]; /* Files */ - char *title; /* Title */ - int title_len; /* Length of title */ - zval *optionsobj; /* Array of options */ - int num_options; /* Number of options */ - cups_option_t *options; /* Options */ - HashTable *ht2; /* Option array hash table */ - Bucket *current; /* Current element in array */ - int id; /* Job ID */ - - - if (ZEND_NUM_ARGS() != 4 || - zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sasa", &dest, &dest_len, &filesobj, - &title, &title_len, &optionsobj)) - { - WRONG_PARAM_COUNT; - } - - ht2 = Z_ARRVAL_P(filesobj); - num_files = 0; - - for (current = ht2->pListHead; current; current = current->pListNext) - { - files[num_files ++] = Z_STRVAL_P(((zval *)current->pDataPtr)); - - if (num_files >= (int)(sizeof(files) / sizeof(files[0]))) - break; - } - - num_options = cups_convert_options(optionsobj, &options); - - id = cupsPrintFiles(dest, num_files, files, title, num_options, options); - - cupsFreeOptions(num_options, options); - - RETURN_LONG(id); -} - - -/* - * End of "$Id: phpcups.c 7624 2008-06-09 15:55:04Z mike $". - */ diff --git a/scripting/php/phpcups.h b/scripting/php/phpcups.h deleted file mode 100644 index e46012dbc..000000000 --- a/scripting/php/phpcups.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * "$Id: phpcups.h 6649 2007-07-11 21:46:42Z mike $" - * - * PHP module include file for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - */ - -#ifndef PHPCUPS_H -# define PHPCUPS_H - -/* - * Include necessary headers... - */ - -# include -# include -# include -# include -# include -# if defined(WIN32) || defined(__EMX__) -# include -# else -# include -# endif /* WIN32 || __EMX__ */ - - -/* - * Zend definitions... - */ - -extern zend_module_entry phpcups_module_entry; -# define phpext_phpcups_ptr &phpcups_module_entry - -# ifdef PHP_WIN32 -# define PHP_PHPCUPS_API __declspec(dllexport) -# else -# define PHP_PHPCUPS_API -# endif - -# ifdef ZTS -# include "TSRM.h" -# endif - -PHP_MINIT_FUNCTION(phpcups); - -PHP_FUNCTION(cups_cancel_job); -PHP_FUNCTION(cups_get_dests); -PHP_FUNCTION(cups_get_jobs); -PHP_FUNCTION(cups_last_error); -PHP_FUNCTION(cups_last_error_string); -PHP_FUNCTION(cups_print_file); -PHP_FUNCTION(cups_print_files); - -#endif /* !PHPCUPS_H */ - - -/* - * End of "$Id: phpcups.h 6649 2007-07-11 21:46:42Z mike $". - */ diff --git a/scripting/php/phpcups.php b/scripting/php/phpcups.php deleted file mode 100755 index 0fe57190e..000000000 --- a/scripting/php/phpcups.php +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/php -f - "100", - "page-label" => "testfile.jpg"))); - -print("cups_print_files(\"test\", array(\"../../test/testfile.jpg\", " - ."\"../../test/testfile.ps\"), \"testfiles\", ...):\n"); -print_r(cups_print_files("test", array("../../test/testfile.jpg", - "../../test/testfile.ps"), - "testfiles", - array("scaling" => "100", - "page-label" => "testfile.jpg"))); - -// -// End of "$Id: phpcups.php 3603 2003-04-11 18:42:52Z mike $". -// -?> diff --git a/systemv/cupstestppd.c b/systemv/cupstestppd.c index 2acc0f25f..3dfa7bf5f 100644 --- a/systemv/cupstestppd.c +++ b/systemv/cupstestppd.c @@ -439,13 +439,29 @@ main(int argc, /* I - Number of command-line args */ attr->value) ppdversion = (int)(10 * _cupsStrScand(attr->value, NULL, loc) + 0.5); - for (j = 0; j < ppd->num_filters; j ++) - if (strstr(ppd->filters[j], "application/vnd.cups-raster")) - { - if (!test_raster(ppd, verbose)) - errors ++; - break; + if ((attr = ppdFindAttr(ppd, "cupsFilter2", NULL)) != NULL) + { + do + { + if (strstr(attr->value, "application/vnd.cups-raster")) + { + if (!test_raster(ppd, verbose)) + errors ++; + break; + } } + while ((attr = ppdFindNextAttr(ppd, "cupsFilter2", NULL)) != NULL); + } + else + { + for (j = 0; j < ppd->num_filters; j ++) + if (strstr(ppd->filters[j], "application/vnd.cups-raster")) + { + if (!test_raster(ppd, verbose)) + errors ++; + break; + } + } /* * Look for default keywords with no matching option... @@ -2309,6 +2325,8 @@ check_filters(ppd_file_t *ppd, /* I - PPD file */ const char *ptr; /* Pointer into string */ char super[16], /* Super-type for filter */ type[256], /* Type for filter */ + dstsuper[16], /* Destination super-type for filter */ + dsttype[256], /* Destination type for filter */ program[1024], /* Program/filter name */ pathprog[1024]; /* Complete path to program/filter */ int cost; /* Cost of filter */ @@ -2322,9 +2340,26 @@ check_filters(ppd_file_t *ppd, /* I - PPD file */ * cupsFilter */ - for (i = 0; i < ppd->num_filters; i ++) + for (attr = ppdFindAttr(ppd, "cupsFilter", NULL); + attr; + attr = ppdFindNextAttr(ppd, "cupsFilter", NULL)) { - if (sscanf(ppd->filters[i], "%15[^/]/%255s%d%*[ \t]%1023[^\n]", super, type, + if (strcmp(attr->name, "cupsFilter")) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad spelling of %s - should be %s."), + prefix, attr->name, "cupsFilter"); + + if (!warn) + errors ++; + } + + if (!attr->value || + sscanf(attr->value, "%15[^/]/%255s%d%*[ \t]%1023[^\n]", super, type, &cost, program) != 4) { if (!warn && !errors && !verbose) @@ -2387,6 +2422,102 @@ check_filters(ppd_file_t *ppd, /* I - PPD file */ } } + /* + * cupsFilter2 + */ + + for (attr = ppdFindAttr(ppd, "cupsFilter2", NULL); + attr; + attr = ppdFindNextAttr(ppd, "cupsFilter2", NULL)) + { + if (strcmp(attr->name, "cupsFilter2")) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad spelling of %s - should be %s."), + prefix, attr->name, "cupsFilter2"); + + if (!warn) + errors ++; + } + + if (!attr->value || + sscanf(attr->value, "%15[^/]/%255s%*[ \t]%15[^/]/%255s%d%*[ \t]%1023[^\n]", + super, type, dstsuper, dsttype, &cost, program) != 6) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad cupsFilter2 value \"%s\"."), + prefix, ppd->filters[i]); + + if (!warn) + errors ++; + } + else if (strcmp(program, "-")) + { + if (strncmp(program, "maxsize(", 8) && + (ptr = strchr(program + 8, ')')) != NULL) + { + ptr ++; + while (_cups_isspace(*ptr)) + ptr ++; + + _cups_strcpy(program, ptr); + } + + if (program[0] == '/') + snprintf(pathprog, sizeof(pathprog), "%s%s", root, program); + else + { + if ((ptr = getenv("CUPS_SERVERBIN")) == NULL) + ptr = CUPS_SERVERBIN; + + if (*ptr == '/' || !*root) + snprintf(pathprog, sizeof(pathprog), "%s%s/filter/%s", root, ptr, + program); + else + snprintf(pathprog, sizeof(pathprog), "%s/%s/filter/%s", root, ptr, + program); + } + + if (stat(pathprog, &fileinfo)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, _(" %s Missing %s file \"%s\"."), + prefix, "cupsFilter2", pathprog); + + if (!warn) + errors ++; + } + else if (fileinfo.st_uid != 0 || + (fileinfo.st_mode & MODE_WRITE) || + (fileinfo.st_mode & MODE_MASK) != MODE_PROGRAM) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad permissions on %s file \"%s\"."), + prefix, "cupsFilter2", pathprog); + + if (!warn) + errors ++; + } + else + errors = valid_path("cupsFilter2", pathprog, errors, verbose, warn); + } + } + /* * cupsPreFilter */ diff --git a/templates/maintenance.tmpl b/templates/maintenance.tmpl deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/ipptool.c b/test/ipptool.c index 81c663d5a..5fdcd09a7 100644 --- a/test/ipptool.c +++ b/test/ipptool.c @@ -660,7 +660,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */ vars->family)) == NULL) { print_fatal_error("Unable to connect to %s on port %d - %s", vars->hostname, - vars->port, strerror(errno)); + vars->port, cupsLastErrorString()); pass = 0; goto test_exit; } @@ -668,7 +668,7 @@ do_tests(_cups_vars_t *vars, /* I - Variables */ if (httpReconnect(http)) { print_fatal_error("Unable to connect to %s on port %d - %s", vars->hostname, - vars->port, strerror(errno)); + vars->port, cupsLastErrorString()); pass = 0; goto test_exit; } @@ -3251,18 +3251,17 @@ get_variable(_cups_vars_t *vars, /* I - Variables */ static char * /* O - ISO 8601 date/time string */ iso_date(ipp_uchar_t *date) /* I - IPP (RFC 1903) date/time value */ { - unsigned year = (date[0] << 8) + date[1]; - /* Year */ + time_t utctime; /* UTC time since 1970 */ + struct tm *utcdate; /* UTC date/time */ static char buffer[255]; /* String buffer */ - if (date[9] == 0 && date[10] == 0) - snprintf(buffer, sizeof(buffer), "%04u-%02u-%02uT%02u:%02u:%02uZ", - year, date[2], date[3], date[4], date[5], date[6]); - else - snprintf(buffer, sizeof(buffer), "%04u-%02u-%02uT%02u:%02u:%02u%c%02u%02u", - year, date[2], date[3], date[4], date[5], date[6], - date[8], date[9], date[10]); + utctime = ippDateToTime(date); + utcdate = gmtime(&utctime); + + 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); } @@ -3823,6 +3822,69 @@ print_xml_string(const char *element, /* I - Element name or NULL */ fputs("<", stdout); else if (*s == '>') fputs(">", stdout); + else if ((*s & 0xe0) == 0xc0) + { + /* + * Validate UTF-8 two-byte sequence... + */ + + if ((s[1] & 0xc0) != 0x80) + { + putchar('?'); + s ++; + } + else + { + putchar(*s++); + putchar(*s); + } + } + else if ((*s & 0xf0) == 0xe0) + { + /* + * Validate UTF-8 three-byte sequence... + */ + + if ((s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80) + { + putchar('?'); + s += 2; + } + else + { + putchar(*s++); + putchar(*s++); + putchar(*s); + } + } + else if ((*s & 0xf8) == 0xf0) + { + /* + * Validate UTF-8 four-byte sequence... + */ + + if ((s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80 || + (s[3] & 0xc0) != 0x80) + { + putchar('?'); + s += 3; + } + else + { + putchar(*s++); + putchar(*s++); + putchar(*s++); + putchar(*s); + } + } + else if ((*s & 0x80) || (*s < ' ' && !isspace(*s & 255))) + { + /* + * Invalid control character... + */ + + putchar('?'); + } else putchar(*s); diff --git a/test/run-stp-tests.sh b/test/run-stp-tests.sh index 62ca08a1c..fa943fc95 100755 --- a/test/run-stp-tests.sh +++ b/test/run-stp-tests.sh @@ -250,9 +250,7 @@ ln -s $root/backend/http /tmp/cups-$user/bin/backend ln -s $root/backend/ipp /tmp/cups-$user/bin/backend ln -s $root/backend/lpd /tmp/cups-$user/bin/backend ln -s $root/backend/mdns /tmp/cups-$user/bin/backend -ln -s $root/backend/parallel /tmp/cups-$user/bin/backend ln -s $root/backend/pseudo /tmp/cups-$user/bin/backend -ln -s $root/backend/serial /tmp/cups-$user/bin/backend ln -s $root/backend/snmp /tmp/cups-$user/bin/backend ln -s $root/backend/socket /tmp/cups-$user/bin/backend ln -s $root/backend/usb /tmp/cups-$user/bin/backend @@ -260,16 +258,13 @@ ln -s $root/cgi-bin /tmp/cups-$user/bin ln -s $root/monitor /tmp/cups-$user/bin ln -s $root/notifier /tmp/cups-$user/bin ln -s $root/scheduler /tmp/cups-$user/bin/daemon -ln -s $root/filter/bannertops /tmp/cups-$user/bin/filter ln -s $root/filter/commandtops /tmp/cups-$user/bin/filter ln -s $root/filter/gziptoany /tmp/cups-$user/bin/filter -ln -s $root/filter/hpgltops /tmp/cups-$user/bin/filter ln -s $root/filter/pstops /tmp/cups-$user/bin/filter ln -s $root/filter/rastertoepson /tmp/cups-$user/bin/filter ln -s $root/filter/rastertohp /tmp/cups-$user/bin/filter ln -s $root/filter/rastertolabel /tmp/cups-$user/bin/filter ln -s $root/filter/rastertopwg /tmp/cups-$user/bin/filter -ln -s $root/filter/texttops /tmp/cups-$user/bin/filter ln -s $root/data/classified /tmp/cups-$user/share/banners ln -s $root/data/confidential /tmp/cups-$user/share/banners @@ -277,10 +272,7 @@ ln -s $root/data/secret /tmp/cups-$user/share/banners ln -s $root/data/standard /tmp/cups-$user/share/banners ln -s $root/data/topsecret /tmp/cups-$user/share/banners ln -s $root/data/unclassified /tmp/cups-$user/share/banners -ln -s $root/data /tmp/cups-$user/share/charmaps -ln -s $root/data /tmp/cups-$user/share/charsets ln -s $root/data /tmp/cups-$user/share -ln -s $root/fonts /tmp/cups-$user/share ln -s $root/ppdc/sample.drv /tmp/cups-$user/share/drv ln -s $root/conf/mime.types /tmp/cups-$user/share/mime ln -s $root/conf/mime.convs /tmp/cups-$user/share/mime @@ -288,14 +280,6 @@ ln -s $root/data/*.h /tmp/cups-$user/share/ppdc ln -s $root/data/*.defs /tmp/cups-$user/share/ppdc ln -s $root/templates /tmp/cups-$user/share -if test -f $root/filter/imagetops; then - ln -s $root/filter/imagetops /tmp/cups-$user/bin/filter -fi - -if test -f $root/filter/imagetoraster; then - ln -s $root/filter/imagetoraster /tmp/cups-$user/bin/filter -fi - # # Mac OS X filters and configuration files... # @@ -320,7 +304,13 @@ if test `uname` = Darwin; then ln -s /usr/share/cups/mime/apple.* /tmp/cups-$user/share/mime fi else - ln -s $root/filter/pdftops /tmp/cups-$user/bin/filter + ln -s /usr/lib/cups/filter/bannertops /tmp/cups-$user/bin/filter + ln -s /usr/lib/cups/filter/imagetops /tmp/cups-$user/bin/filter + ln -s /usr/lib/cups/filter/imagetoraster /tmp/cups-$user/bin/filter + ln -s /usr/lib/cups/filter/pdftops /tmp/cups-$user/bin/filter + ln -s /usr/lib/cups/filter/texttops /tmp/cups-$user/bin/filter + + ln -s /usr/share/cups/mime/legacy.convs /tmp/cups-$user/share/mime fi # @@ -553,7 +543,7 @@ done # date=`date "+%Y-%m-%d"` -strfile=/tmp/cups-$user/cups-str-1.5-$date-$user.html +strfile=/tmp/cups-$user/cups-str-1.6-$date-$user.html rm -f $strfile cat str-header.html >$strfile diff --git a/test/str-header.html b/test/str-header.html index 84f0d9b73..f9204bbe9 100644 --- a/test/str-header.html +++ b/test/str-header.html @@ -1,8 +1,8 @@ - - + + CUPS 1.5 Software Test Report