diff options
67 files changed, 7236 insertions, 509 deletions
diff --git a/lib/libXpm/COPYING b/lib/libXpm/COPYING index 585af0b8f..1fcb5a676 100644 --- a/lib/libXpm/COPYING +++ b/lib/libXpm/COPYING @@ -68,3 +68,23 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Lorens Younes. +Copyright (c) 2023, Oracle and/or its affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/lib/libXpm/ChangeLog b/lib/libXpm/ChangeLog index 9562fa7d6..46076254e 100644 --- a/lib/libXpm/ChangeLog +++ b/lib/libXpm/ChangeLog @@ -1,3 +1,356 @@ +commit f131de92d6c4e2f62934e85b012287276ecf009c +Author: Matt Turner <mattst88@gmail.com> +Date: Mon Apr 17 15:22:35 2023 -0400 + + libXpm 3.5.16 + + Signed-off-by: Matt Turner <mattst88@gmail.com> + +commit 8b9c4e4c5d278409dc41d19f0c8a8940403cd5c7 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Mon Mar 27 18:21:12 2023 -0700 + + xpmReadRgbNames: constify filename argument + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit fd620b4f6c59674090b956a9d9e188a1250a4663 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Mon Mar 27 18:15:41 2023 -0700 + + test: Add simple test cases for functions in src/rgb.c + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit e01d691aa684d0d1247f772b7c537ec3254bb9bc +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Mon Mar 27 18:03:13 2023 -0700 + + test: Use PACKAGE_BUGREPORT instead of hard-coded URL's + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 92030dd4c221e8043521ae4dc9d32d50e6ff44c4 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Sun Feb 12 13:22:57 2023 -0800 + + parse.c: remove unused function xstrlcpy() + + parse.c:74:1: warning: unused function 'xstrlcpy' [-Wunused-function] + xstrlcpy(char *dst, const char *src, size_t dstsize) + ^ + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 8e0e63519069bed43b3bf1ce1f11fd0cd516d3e4 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Sun Feb 12 10:51:46 2023 -0800 + + parse.c: Wrap FREE_CIDX definition in do { ... } while(0) + + Makes it match the definition in create.c and eliminates + clang warnings: + + create.c:2409:13: warning: empty expression statement has no effect; + remove unnecessary ';' to silence this warning [-Wextra-semi-stmt] + FREE_CIDX; + ^ + create.c:2440:17: warning: empty expression statement has no effect; + remove unnecessary ';' to silence this warning [-Wextra-semi-stmt] + FREE_CIDX; + ^ + create.c:2444:13: warning: empty expression statement has no effect; + remove unnecessary ';' to silence this warning [-Wextra-semi-stmt] + FREE_CIDX; + ^ + create.c:2449:15: warning: empty expression statement has no effect; + remove unnecessary ';' to silence this warning [-Wextra-semi-stmt] + FREE_CIDX; + ^ + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 25616112983cd3f8bfe5379771b5bfd63b3c3621 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Sun Feb 12 09:23:09 2023 -0800 + + XpmCreateDataFromXpmImage: Fix misleading indentation + + CrDatFrI.c: In function ‘XpmCreateDataFromXpmImage’: + CrDatFrI.c:245:13: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation] + 245 | if (header[l]) + | ^~ + In file included from CrDatFrI.c:40: + XpmI.h:80:22: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’ + 80 | #define XpmFree(ptr) free(ptr) + | ^~~~ + CrDatFrI.c:247:17: note: in expansion of macro ‘XpmFree’ + 247 | XpmFree(header); + | ^~~~~~~ + CrDatFrI.c: In function ‘CreateColors’: + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 45d8f4f20665c77dd1924b78559fb2494a77ad7a +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Sun Feb 12 09:20:44 2023 -0800 + + Require LT_INIT from libtool 2 instead of deprecated AC_PROG_LIBTOOL + + AC_PROG_LIBTOOL was replaced by LT_INIT in libtool 2 in 2008, + so it's time to rely on it. + + configure.ac:14: warning: The macro `AC_PROG_LIBTOOL' is obsolete. + configure.ac:14: You should run autoupdate. + m4/libtool.m4:100: AC_PROG_LIBTOOL is expanded from... + configure.ac:14: the top level + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit c52082c6e4811958dd741d67e1178b4e36a09923 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Sun Feb 5 12:14:43 2023 -0800 + + open-zfile: Make compress & uncompress commands optional + + If compress is not found, we disable writing to .Z files, + but leave the rest of the compression code active. + + If uncompress is not found, we use gzip to read .Z files. + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 77e3b389eb92b8d8f94f5b83c1d3d7cd4db5b037 +Author: Peter Hutterer <peter.hutterer@who-t.net> +Date: Mon Jan 23 19:57:28 2023 +1000 + + Fix a memleak in ParsePixels error code path + + In this particular error path we have already allocated cidx[0..256] + with 256 instances of fresh and juicy memory. Freeing that is annoying, + but luckily there's a helpful FREE_CIDX macro that does exactly that. + + Fixes f80fa6a: + Fix CVE-2022-44617: Runaway loop with width of 0 and enormous height + + Found by covscan + + Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> + +commit 71d7149cb356b96cc83e2ec95d06df4022039e2c +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Thu Jan 19 12:16:26 2023 -0800 + + configure: correct error message to suggest --disable-open-zfile + + When one of the compression helper programs is not found, the message + suggesting how to compile without it should say --disable-open-zfile, + not --disable-stat-zfile. + + Fixes: 515294b ("Fix CVE-2022-4883: compression commands depend on $PATH") + Closes: #4 + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 9bc32a1a9c788eed2982d3fd35f2295a95af3817 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Thu Jan 19 12:06:38 2023 -0800 + + gitlab CI: build with each of --enable-open-zfile & --disable-open-zfile + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit d9cbea1c6bc2b7f2c11964da0d437130bed82279 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Tue Jan 17 18:41:32 2023 -0800 + + test: skip compressed file tests when --disable-open-zfile is used + + Reported-by: T.J. Townsend + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit ddd8339e262cbb7b25993599299ad40e0c95ccf6 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Tue Jan 17 08:19:26 2023 -0800 + + libXpm 3.5.15 + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 8178eb0834d82242e1edbc7d4fb0d1b397569c68 +Author: Peter Hutterer <peter.hutterer@who-t.net> +Date: Mon Jan 16 19:44:52 2023 +1000 + + Use gzip -d instead of gunzip + + GNU gunzip [1] is a shell script that exec's `gzip -d`. Even if we call + /usr/bin/gunzip with the correct built-in path, the actual gzip call + will use whichever gzip it finds first, making our patch pointless. + + Fix this by explicitly calling gzip -d instead. + + https://git.savannah.gnu.org/cgit/gzip.git/tree/gunzip.in + + [Part of the fix for CVE-2022-4883] + Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> + +commit c5ab17bcc34914c0b0707d2135dbebe9a367c5f0 +Author: Matthieu Herrb <matthieu@herrb.eu> +Date: Thu Jan 12 15:05:39 2023 +1000 + + Prevent a double free in the error code path + + xpmParseDataAndCreate() calls XDestroyImage() in the error path. + Reproducible with sxpm "zero-width.xpm", that file is in the test/ + directory. + + The same approach is needed in the bytes_per_line == 0 condition though + here it just plugs a memory leak. + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 515294bb8023a45ff916696d0a14308ff4f3a376 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Fri Jan 6 12:50:48 2023 -0800 + + Fix CVE-2022-4883: compression commands depend on $PATH + + By default, on all platforms except MinGW, libXpm will detect if a + filename ends in .Z or .gz, and will when reading such a file fork off + an uncompress or gunzip command to read from via a pipe, and when + writing such a file will fork off a compress or gzip command to write + to via a pipe. + + In libXpm 3.5.14 or older these are run via execlp(), relying on $PATH + to find the commands. If libXpm is called from a program running with + raised privileges, such as via setuid, then a malicious user could set + $PATH to include programs of their choosing to be run with those + privileges. + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit f80fa6ae47ad4a5beacb287c0030c9913b046643 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Sat Jan 7 12:44:28 2023 -0800 + + Fix CVE-2022-44617: Runaway loop with width of 0 and enormous height + + When reading XPM images from a file with libXpm 3.5.14 or older, if a + image has a width of 0 and a very large height, the ParsePixels() function + will loop over the entire height calling getc() and ungetc() repeatedly, + or in some circumstances, may loop seemingly forever, which may cause a + denial of service to the calling program when given a small crafted XPM + file to parse. + + Closes: #2 + + Reported-by: Martin Ettl <ettl.martin78@googlemail.com> + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit f7fbbb92f6d383b21dd1587c3703a5de37c625b5 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Tue Jan 3 17:23:58 2023 -0800 + + test: add test cases for CVE-2022-44617 (zero-width w/enormous height) + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit a3a7c6dcc3b629d765014816c566c63165c63ca8 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Sat Dec 17 12:23:45 2022 -0800 + + Fix CVE-2022-46285: Infinite loop on unclosed comments + + When reading XPM images from a file with libXpm 3.5.14 or older, if a + comment in the file is not closed (i.e. a C-style comment starts with + "/*" and is missing the closing "*/"), the ParseComment() function will + loop forever calling getc() to try to read the rest of the comment, + failing to notice that it has returned EOF, which may cause a denial of + service to the calling program. + + Reported-by: Marco Ivaldi <raptor@0xdeadbeef.info> + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit f7a167a48a950b89b91f5123a0ec8d9a7cb97495 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Sat Dec 17 12:18:24 2022 -0800 + + test: add test case for CVE-2022-46285 (unclosed comments) + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 0ff2c6af823ce7712c06150c43c9b403846a035f +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Sat Jan 7 15:43:20 2023 -0800 + + cxpm: getc/ungetc wrappers should not adjust position when c == EOF + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 501494c6c68a84114fdd0b44d4b67ef9cde776c9 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Sat Jan 7 13:39:56 2023 -0800 + + test: Add unit tests using glib framework + + Includes rudimentary tests for XpmReadFileToXpmImage, XpmReadFileToData, + XpmReadFileToBuffer, XpmCreateXpmImageFromData, XpmCreateXpmImageFromBuffer, + XpmWriteFileFromXpmImage, XpmWriteFileFromData, XpmWriteFileFromBuffer, + XpmAttributesSize, XpmGetErrorString, XpmLibraryVersion + + Includes test cases for CVE-2004-0687 + + Tests .Z and .gz files if --enable-open-zfile is active + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 4841039e5385f264d12757903894f47c64f59361 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Thu Jan 5 15:42:36 2023 -0800 + + configure: add --disable-open-zfile instead of requiring -DNO_ZPIPE + + Documents the two compression options in the README, makes their + configure options reflect the interdependency of their implementation, + and makes the configure script report their configuration. + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit aef0c8dd129838ac35b3cf8a7cdf04c7fd67dff1 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Sun Jan 1 14:19:17 2023 -0800 + + man pages: Apply standard man page style/formatting + + Function & macro names in bold, argument names in italics. + + In the man page body, bold function names followed by plain () + for functions defined in this page, plain (3) for functions defined + in other man pages. + + New paragraphs start with .PP, not just a blank line. + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 5d55a0be3f8a8d3e53c65c286878fc3224fce135 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Sun Jan 1 10:48:01 2023 -0800 + + man pages: Replace "See Also" entries with more useful ones + + "See Also" entries in man pages should list other man pages to + look at, not the alternate names for the current man page. + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 392cb8fb444ae632176829076f412cb4029dbdbc +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Sun Jan 1 10:21:38 2023 -0800 + + man pages: Fix typos and other minor editing + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + commit 08bc174f28af028b6ebaa9edeccd3ff56c396e92 Author: Alan Coopersmith <alan.coopersmith@oracle.com> Date: Sat Nov 19 12:23:53 2022 -0800 @@ -331,7 +684,7 @@ Date: Tue Dec 6 22:31:53 2016 +0100 Reviewed-by: Matthieu Herrb <matthieu@herrb.eu> commit 42ca8d956276bc00bec09e410d76daf053ae35f9 -Author: Jörg Sonnenberger <joerg@NetBSD.org> +Author: Jörg Sonnenberger <joerg@NetBSD.org> Date: Wed Mar 19 09:26:37 2014 +0100 Fix abs() usage. @@ -1235,13 +1588,13 @@ Date: Thu Jun 9 13:42:36 2005 +0000 Use $(top_srcdir)/src instead of $(top_builddir)/src in INCLUDES commit 769751fba3e32f49272d19799929e1ad5a3d2cd0 -Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk> +Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk> Date: Thu May 19 17:09:13 2005 +0000 Add $(top_builddir)/include to INCLUDES commit 2cc1896c61eef5739bb6a8ffa89e58ba5c175a05 -Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk> +Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk> Date: Thu May 19 15:02:48 2005 +0000 - Add build system for lib/Xpm @@ -1249,7 +1602,7 @@ Date: Thu May 19 15:02:48 2005 +0000 - Conditionally include config.h in xc/extras/Xpm commit cf0d69c7ace679f27f105c582760b9be14923aba -Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk> +Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk> Date: Thu May 19 14:37:53 2005 +0000 Thu May 19 10:36:54 2005 Søren Sandmann <sandmann@redhat.com> @@ -1313,9 +1666,6 @@ Date: Tue Sep 21 17:57:35 2004 +0000 Removed inclusion of unnecessary kernel header on Linux. This may fail in an -ansi environment. -Notes: - Fixes CVE-2004-0687 (integer overflows) and CVE-2004-0688 (stack overflows) - commit 2773a7214e282f6f673483f5233b880505947c3f Author: Egbert Eich <eich@suse.de> Date: Fri Apr 23 18:42:32 2004 +0000 diff --git a/lib/libXpm/Makefile.am b/lib/libXpm/Makefile.am index 8ce7a90e8..235ee1fa5 100644 --- a/lib/libXpm/Makefile.am +++ b/lib/libXpm/Makefile.am @@ -1,7 +1,7 @@ # Daniel Stone disowns all copyright on this file; no warranty is given as to its # suitability or otherwise. -SUBDIRS = doc include man src sxpm cxpm +SUBDIRS = doc include man src sxpm cxpm test ACLOCAL_AMFLAGS = -I m4 diff --git a/lib/libXpm/Makefile.bsd-wrapper b/lib/libXpm/Makefile.bsd-wrapper index 31c69ff2e..da436a522 100644 --- a/lib/libXpm/Makefile.bsd-wrapper +++ b/lib/libXpm/Makefile.bsd-wrapper @@ -1,5 +1,7 @@ -# $OpenBSD: Makefile.bsd-wrapper,v 1.3 2013/08/13 07:07:17 guenther Exp $ +# $OpenBSD: Makefile.bsd-wrapper,v 1.4 2023/05/07 16:07:42 matthieu Exp $ SHARED_LIBS= Xpm 9.0 +CONFIGURE_ARGS += --disable-unit-tests + .include <bsd.xorg.mk> diff --git a/lib/libXpm/Makefile.in b/lib/libXpm/Makefile.in index 7e6ea28ce..652c8178c 100644 --- a/lib/libXpm/Makefile.in +++ b/lib/libXpm/Makefile.in @@ -58,7 +58,7 @@ DIST_COMMON = $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/xpm.pc.in $(top_srcdir)/configure AUTHORS COPYING \ ChangeLog INSTALL compile config.guess config.sub depcomp \ - install-sh ltmain.sh missing + install-sh ltmain.sh missing tap-driver.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_define_dir.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -214,6 +214,8 @@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILE_MAN_DIR = @FILE_MAN_DIR@ FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_CMD = @INSTALL_CMD@ @@ -265,11 +267,11 @@ STRIP = @STRIP@ SXPM_CFLAGS = @SXPM_CFLAGS@ SXPM_LIBS = @SXPM_LIBS@ VERSION = @VERSION@ +XORG_MALLOC_DEBUG_ENV = @XORG_MALLOC_DEBUG_ENV@ XORG_MAN_PAGE = @XORG_MAN_PAGE@ XPM_CFLAGS = @XPM_CFLAGS@ XPM_LIBS = @XPM_LIBS@ XPM_PATH_COMPRESS = @XPM_PATH_COMPRESS@ -XPM_PATH_GUNZIP = @XPM_PATH_GUNZIP@ XPM_PATH_GZIP = @XPM_PATH_GZIP@ XPM_PATH_UNCOMPRESS = @XPM_PATH_UNCOMPRESS@ abs_builddir = @abs_builddir@ @@ -325,7 +327,7 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUBDIRS = doc include man src sxpm cxpm +SUBDIRS = doc include man src sxpm cxpm test ACLOCAL_AMFLAGS = -I m4 pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = xpm.pc diff --git a/lib/libXpm/README.md b/lib/libXpm/README.md index adc83c8d6..5410b821e 100644 --- a/lib/libXpm/README.md +++ b/lib/libXpm/README.md @@ -16,3 +16,30 @@ For patch submission instructions, see: https://www.x.org/wiki/Development/Documentation/SubmittingPatches +------------------------------------------------------------------------------ + +libXpm supports two optional features to handle compressed pixmap files. + +--enable-open-zfile makes libXpm recognize file names ending in .Z and .gz +and open a pipe to the appropriate command to compress the file when writing +and uncompress the file when reading. This is enabled by default on platforms +other than MinGW and can be disabled by passing the --disable-open-zfile flag +to the configure script. + +--enable-stat-zfile make libXpm search for a file name with .Z or .gz added +if it can't find the file it was asked to open. It relies on the +--enable-open-zfile feature to open the file, and is enabled by default +when --enable-open-zfile is enabled, and can be disabled by passing the +--disable-stat-zfile flag to the configure script. + +All of these commands will be executed with whatever userid & privileges the +function is called with, relying on the caller to ensure the correct euid, +egid, etc. are set before calling. + +To reduce risk, the paths to these commands are now set at configure time to +the first version found in the PATH used to run configure, and do not depend +on the PATH environment variable set at runtime. + +To specify paths to be used for these commands instead of searching $PATH, pass +the XPM_PATH_COMPRESS, XPM_PATH_UNCOMPRESS, and XPM_PATH_GZIP +variables to the configure command. diff --git a/lib/libXpm/aclocal.m4 b/lib/libXpm/aclocal.m4 index 40096e82e..937a6b848 100644 --- a/lib/libXpm/aclocal.m4 +++ b/lib/libXpm/aclocal.m4 @@ -1324,7 +1324,7 @@ m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) dnl xorg-macros.m4. Generated from xorg-macros.m4.in xorgversion.m4 by configure. dnl -dnl Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. +dnl Copyright (c) 2005, 2023, Oracle and/or its affiliates. dnl dnl Permission is hereby granted, free of charge, to any person obtaining a dnl copy of this software and associated documentation files (the "Software"), @@ -1361,7 +1361,7 @@ dnl DEALINGS IN THE SOFTWARE. # See the "minimum version" comment for each macro you use to see what # version you require. m4_defun([XORG_MACROS_VERSION],[ -m4_define([vers_have], [1.19.2]) +m4_define([vers_have], [1.20.0]) m4_define([maj_have], m4_substr(vers_have, 0, m4_index(vers_have, [.]))) m4_define([maj_needed], m4_substr([$1], 0, m4_index([$1], [.]))) m4_if(m4_cmp(maj_have, maj_needed), 0,, @@ -1382,7 +1382,7 @@ AM_MAINTAINER_MODE # such as man pages and config files AC_DEFUN([XORG_PROG_RAWCPP],[ AC_REQUIRE([AC_PROG_CPP]) -AC_PATH_PROGS(RAWCPP, [cpp], [${CPP}], +AC_PATH_TOOL(RAWCPP, [cpp], [${CPP}], [$PATH:/bin:/usr/bin:/usr/lib:/usr/libexec:/usr/ccs/lib:/usr/ccs/lbin:/lib]) # Check for flag to avoid builtin definitions - assumes unix is predefined, @@ -1692,7 +1692,7 @@ AC_SUBST(MAKE_HTML) # Documentation tools are not always available on all platforms and sometimes # not at the appropriate level. This macro enables a module to test for the # presence of the tool and obtain it's path in separate variables. Coupled with -# the --with-xmlto option, it allows maximum flexibilty in making decisions +# the --with-xmlto option, it allows maximum flexibility in making decisions # as whether or not to use the xmlto package. When DEFAULT is not specified, # --with-xmlto assumes 'auto'. # @@ -1906,7 +1906,7 @@ AM_CONDITIONAL([HAVE_PERL], [test "$have_perl" = yes]) # Documentation tools are not always available on all platforms and sometimes # not at the appropriate level. This macro enables a module to test for the # presence of the tool and obtain it's path in separate variables. Coupled with -# the --with-asciidoc option, it allows maximum flexibilty in making decisions +# the --with-asciidoc option, it allows maximum flexibility in making decisions # as whether or not to use the asciidoc package. When DEFAULT is not specified, # --with-asciidoc assumes 'auto'. # @@ -1976,7 +1976,7 @@ AM_CONDITIONAL([HAVE_ASCIIDOC], [test "$have_asciidoc" = yes]) # Documentation tools are not always available on all platforms and sometimes # not at the appropriate level. This macro enables a module to test for the # presence of the tool and obtain it's path in separate variables. Coupled with -# the --with-doxygen option, it allows maximum flexibilty in making decisions +# the --with-doxygen option, it allows maximum flexibility in making decisions # as whether or not to use the doxygen package. When DEFAULT is not specified, # --with-doxygen assumes 'auto'. # @@ -2060,7 +2060,7 @@ AM_CONDITIONAL([HAVE_DOXYGEN], [test "$have_doxygen" = yes]) # Documentation tools are not always available on all platforms and sometimes # not at the appropriate level. This macro enables a module to test for the # presence of the tool and obtain it's path in separate variables. Coupled with -# the --with-groff option, it allows maximum flexibilty in making decisions +# the --with-groff option, it allows maximum flexibility in making decisions # as whether or not to use the groff package. When DEFAULT is not specified, # --with-groff assumes 'auto'. # @@ -2168,7 +2168,7 @@ AM_CONDITIONAL([HAVE_GROFF_HTML], [test "$have_groff_html" = yes]) # Documentation tools are not always available on all platforms and sometimes # not at the appropriate level. This macro enables a module to test for the # presence of the tool and obtain it's path in separate variables. Coupled with -# the --with-fop option, it allows maximum flexibilty in making decisions +# the --with-fop option, it allows maximum flexibility in making decisions # as whether or not to use the fop package. When DEFAULT is not specified, # --with-fop assumes 'auto'. # @@ -2262,7 +2262,7 @@ AC_SUBST([M4], [$ac_cv_path_M4]) # Documentation tools are not always available on all platforms and sometimes # not at the appropriate level. This macro enables a module to test for the # presence of the tool and obtain it's path in separate variables. Coupled with -# the --with-ps2pdf option, it allows maximum flexibilty in making decisions +# the --with-ps2pdf option, it allows maximum flexibility in making decisions # as whether or not to use the ps2pdf package. When DEFAULT is not specified, # --with-ps2pdf assumes 'auto'. # @@ -2317,7 +2317,7 @@ AM_CONDITIONAL([HAVE_PS2PDF], [test "$have_ps2pdf" = yes]) # not at the appropriate level. This macro enables a builder to skip all # documentation targets except traditional man pages. # Combined with the specific tool checking macros XORG_WITH_*, it provides -# maximum flexibilty in controlling documentation building. +# maximum flexibility in controlling documentation building. # Refer to: # XORG_WITH_XMLTO --with-xmlto # XORG_WITH_ASCIIDOC --with-asciidoc @@ -2350,7 +2350,7 @@ AC_MSG_RESULT([$build_docs]) # # This macro enables a builder to skip all developer documentation. # Combined with the specific tool checking macros XORG_WITH_*, it provides -# maximum flexibilty in controlling documentation building. +# maximum flexibility in controlling documentation building. # Refer to: # XORG_WITH_XMLTO --with-xmlto # XORG_WITH_ASCIIDOC --with-asciidoc @@ -2383,7 +2383,7 @@ AC_MSG_RESULT([$build_devel_docs]) # # This macro enables a builder to skip all functional specification targets. # Combined with the specific tool checking macros XORG_WITH_*, it provides -# maximum flexibilty in controlling documentation building. +# maximum flexibility in controlling documentation building. # Refer to: # XORG_WITH_XMLTO --with-xmlto # XORG_WITH_ASCIIDOC --with-asciidoc @@ -2858,7 +2858,11 @@ AM_CONDITIONAL(MAKE_LINT_LIB, [test x$make_lint_lib != xno]) AC_DEFUN([XORG_COMPILER_BRAND], [ AC_LANG_CASE( [C], [ - AC_REQUIRE([AC_PROG_CC_C99]) + dnl autoconf-2.70 folded AC_PROG_CC_C99 into AC_PROG_CC + dnl and complains that AC_PROG_CC_C99 is obsolete + m4_version_prereq([2.70], + [AC_REQUIRE([AC_PROG_CC])], + [AC_REQUIRE([AC_PROG_CC_C99])]) ], [C++], [ AC_REQUIRE([AC_PROG_CXX]) @@ -2874,7 +2878,7 @@ AC_CHECK_DECL([__SUNPRO_C], [SUNCC="yes"], [SUNCC="no"]) # Minimum version: 1.16.0 # # Test if the compiler works when passed the given flag as a command line argument. -# If it succeeds, the flag is appeneded to the given variable. If not, it tries the +# If it succeeds, the flag is appended to the given variable. If not, it tries the # next flag in the list until there are no more options. # # Note that this does not guarantee that the compiler supports the flag as some @@ -2890,7 +2894,11 @@ AC_LANG_COMPILER_REQUIRE AC_LANG_CASE( [C], [ - AC_REQUIRE([AC_PROG_CC_C99]) + dnl autoconf-2.70 folded AC_PROG_CC_C99 into AC_PROG_CC + dnl and complains that AC_PROG_CC_C99 is obsolete + m4_version_prereq([2.70], + [AC_REQUIRE([AC_PROG_CC])], + [AC_REQUIRE([AC_PROG_CC_C99])]) define([PREFIX], [C]) define([CACHE_PREFIX], [cc]) define([COMPILER], [$CC]) @@ -3021,7 +3029,7 @@ XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wuninitialized]) XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wshadow]) XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wmissing-noreturn]) XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wmissing-format-attribute]) -# XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wredundant-decls]) +XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wredundant-decls]) XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wlogical-op]) # These are currently disabled because they are noisy. They will be enabled @@ -3031,7 +3039,7 @@ XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wlogical-op]) # XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wcast-align]) # XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wcast-qual]) -# Turn some warnings into errors, so we don't accidently get successful builds +# Turn some warnings into errors, so we don't accidentally get successful builds # when there are problems that should be fixed. if test "x$SELECTIVE_WERROR" = "xyes" ; then @@ -3140,23 +3148,35 @@ AC_SUBST([BASE_]PREFIX[FLAGS]) AC_LANG_CASE([C], AC_SUBST([CWARNFLAGS])) ]) # XORG_STRICT_OPTION +# XORG_DEFAULT_NOCODE_OPTIONS +# --------------------------- +# Minimum version: 1.20.0 +# +# Defines default options for X.Org modules which don't compile code, +# such as fonts, bitmaps, cursors, and docs. +# +AC_DEFUN([XORG_DEFAULT_NOCODE_OPTIONS], [ +AC_REQUIRE([AC_PROG_INSTALL]) +XORG_RELEASE_VERSION +XORG_CHANGELOG +XORG_INSTALL +XORG_MANPAGE_SECTIONS +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])], + [AC_SUBST([AM_DEFAULT_VERBOSITY], [1])]) +]) # XORG_DEFAULT_NOCODE_OPTIONS + # XORG_DEFAULT_OPTIONS # -------------------- # Minimum version: 1.3.0 # -# Defines default options for X.Org modules. +# Defines default options for X.Org modules which compile code. # AC_DEFUN([XORG_DEFAULT_OPTIONS], [ AC_REQUIRE([AC_PROG_INSTALL]) XORG_COMPILER_FLAGS XORG_CWARNFLAGS XORG_STRICT_OPTION -XORG_RELEASE_VERSION -XORG_CHANGELOG -XORG_INSTALL -XORG_MANPAGE_SECTIONS -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])], - [AC_SUBST([AM_DEFAULT_VERBOSITY], [1])]) +XORG_DEFAULT_NOCODE_OPTIONS ]) # XORG_DEFAULT_OPTIONS # XORG_INSTALL() diff --git a/lib/libXpm/config.h.in b/lib/libXpm/config.h.in index 2d8713dc2..557923c94 100644 --- a/lib/libXpm/config.h.in +++ b/lib/libXpm/config.h.in @@ -79,6 +79,9 @@ /* Patch version of this package */ #undef PACKAGE_VERSION_PATCHLEVEL +/* Define to 1 to automatically look for files with .Z & .gz extensions */ +#undef STAT_ZFILE + /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS @@ -91,9 +94,6 @@ /* Path to compress */ #undef XPM_PATH_COMPRESS -/* Path to gunzip */ -#undef XPM_PATH_GUNZIP - /* Path to gzip */ #undef XPM_PATH_GZIP diff --git a/lib/libXpm/configure b/lib/libXpm/configure index 55cede5f7..6603bff28 100644 --- a/lib/libXpm/configure +++ b/lib/libXpm/configure @@ -1,8 +1,8 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for libXpm 3.5.14. +# Generated by GNU Autoconf 2.69 for libXpm 3.5.16. # -# Report bugs to <https://gitlab.freedesktop.org/xorg/lib/libxpm/-/issues>. +# Report bugs to <https://gitlab.freedesktop.org/xorg/lib/libxpm/-/issues/>. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -275,7 +275,7 @@ fi $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: https://gitlab.freedesktop.org/xorg/lib/libxpm/-/issues +$0: https://gitlab.freedesktop.org/xorg/lib/libxpm/-/issues/ $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do @@ -591,9 +591,9 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='libXpm' PACKAGE_TARNAME='libXpm' -PACKAGE_VERSION='3.5.14' -PACKAGE_STRING='libXpm 3.5.14' -PACKAGE_BUGREPORT='https://gitlab.freedesktop.org/xorg/lib/libxpm/-/issues' +PACKAGE_VERSION='3.5.16' +PACKAGE_STRING='libXpm 3.5.16' +PACKAGE_BUGREPORT='https://gitlab.freedesktop.org/xorg/lib/libxpm/-/issues/' PACKAGE_URL='' ac_unique_file="Makefile.am" @@ -637,10 +637,18 @@ ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS -XPM_PATH_GUNZIP -XPM_PATH_GZIP +HAVE_GLIB_FALSE +HAVE_GLIB_TRUE +GLIB_LIBS +GLIB_CFLAGS +ENABLE_UNIT_TESTS_FALSE +ENABLE_UNIT_TESTS_TRUE +XORG_MALLOC_DEBUG_ENV XPM_PATH_UNCOMPRESS XPM_PATH_COMPRESS +XPM_PATH_GZIP +COMPRESSED_PIXMAPS_FALSE +COMPRESSED_PIXMAPS_TRUE USE_GETTEXT_FALSE USE_GETTEXT_TRUE LOCALEDIR @@ -804,6 +812,10 @@ enable_selective_werror enable_strict_compilation enable_silent_rules with_localedir +enable_open_zfile +enable_stat_zfile +enable_unit_tests +with_glib ' ac_precious_vars='build_alias host_alias @@ -820,7 +832,10 @@ PKG_CONFIG_LIBDIR XPM_CFLAGS XPM_LIBS SXPM_CFLAGS -SXPM_LIBS' +SXPM_LIBS +XORG_MALLOC_DEBUG_ENV +GLIB_CFLAGS +GLIB_LIBS' # Initialize some variables set by options. @@ -1371,7 +1386,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures libXpm 3.5.14 to adapt to many kinds of systems. +\`configure' configures libXpm 3.5.16 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1442,7 +1457,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libXpm 3.5.14:";; + short | recursive ) echo "Configuration of libXpm 3.5.16:";; esac cat <<\_ACEOF @@ -1470,6 +1485,11 @@ Optional Features: errors (default: disabled) --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") + --enable-open-zfile Search for files with .Z & .gz extensions + automatically [default=auto] + --enable-stat-zfile Search for files with .Z & .gz extensions + automatically [default=auto] + --enable-unit-tests Enable building unit test cases (default: auto) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -1481,6 +1501,7 @@ Optional Packages: (or the compiler's sysroot if not specified). --with-localedir=<path> Path to install message files in (default: datadir/locale) + --with-glib Use GLib library for unit testing (default: auto) Some influential environment variables: CC C compiler command @@ -1500,11 +1521,15 @@ Some influential environment variables: XPM_LIBS linker flags for XPM, overriding pkg-config SXPM_CFLAGS C compiler flags for SXPM, overriding pkg-config SXPM_LIBS linker flags for SXPM, overriding pkg-config + XORG_MALLOC_DEBUG_ENV + Environment variables to enable memory checking in tests + GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config + GLIB_LIBS linker flags for GLIB, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. -Report bugs to <https://gitlab.freedesktop.org/xorg/lib/libxpm/-/issues>. +Report bugs to <https://gitlab.freedesktop.org/xorg/lib/libxpm/-/issues/>. _ACEOF ac_status=$? fi @@ -1567,7 +1592,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libXpm configure 3.5.14 +libXpm configure 3.5.16 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1891,7 +1916,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libXpm $as_me 3.5.14, which was +It was created by libXpm $as_me 3.5.16, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2721,7 +2746,7 @@ fi # Define the identity of the package. PACKAGE='libXpm' - VERSION='3.5.14' + VERSION='3.5.16' cat >>confdefs.h <<_ACEOF @@ -11332,7 +11357,7 @@ CC="$lt_save_CC" -# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS +# Require X.Org macros 1.16 or later for XORG_MEMORY_CHECK_FLAGS @@ -13588,7 +13613,124 @@ $as_echo "$supported" >&6; } fi -# XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wredundant-decls]) + + + + + + + + + + + + + +xorg_testset_save_CFLAGS="$CFLAGS" + +if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then + CFLAGS="$CFLAGS -Werror=unknown-warning-option" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5 +$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } +if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int i; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + xorg_cv_cc_flag_unknown_warning_option=yes +else + xorg_cv_cc_flag_unknown_warning_option=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5 +$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; } + xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option + CFLAGS="$xorg_testset_save_CFLAGS" +fi + +if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then + if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then + CFLAGS="$CFLAGS -Werror=unknown-warning-option" + fi + CFLAGS="$CFLAGS -Werror=unused-command-line-argument" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5 +$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } +if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int i; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + xorg_cv_cc_flag_unused_command_line_argument=yes +else + xorg_cv_cc_flag_unused_command_line_argument=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5 +$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; } + xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument + CFLAGS="$xorg_testset_save_CFLAGS" +fi + +found="no" + + if test $found = "no" ; then + if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then + CFLAGS="$CFLAGS -Werror=unknown-warning-option" + fi + + if test "x$xorg_testset_cc_unused_command_line_argument" = "xyes" ; then + CFLAGS="$CFLAGS -Werror=unused-command-line-argument" + fi + + CFLAGS="$CFLAGS -Wredundant-decls" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Wredundant-decls" >&5 +$as_echo_n "checking if $CC supports -Wredundant-decls... " >&6; } + cacheid=xorg_cv_cc_flag__Wredundant_decls + if eval \${$cacheid+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int i; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval $cacheid=yes +else + eval $cacheid=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + + + CFLAGS="$xorg_testset_save_CFLAGS" + + eval supported=\$$cacheid + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5 +$as_echo "$supported" >&6; } + if test "$supported" = "yes" ; then + BASE_CFLAGS="$BASE_CFLAGS -Wredundant-decls" + found="yes" + fi + fi + + @@ -13715,7 +13857,7 @@ $as_echo "$supported" >&6; } # XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wcast-align]) # XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wcast-qual]) -# Turn some warnings into errors, so we don't accidently get successful builds +# Turn some warnings into errors, so we don't accidentally get successful builds # when there are problems that should be fixed. if test "x$SELECTIVE_WERROR" = "xyes" ; then @@ -17387,6 +17529,8 @@ fi + + cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION_MAJOR `echo $PACKAGE_VERSION | cut -d . -f 1` _ACEOF @@ -17589,6 +17733,7 @@ AM_BACKSLASH='\' + # Checks for library functions for ac_func in strlcat do : @@ -17892,24 +18037,49 @@ fi +# Optional feature: When a filename ending in .Z or .gz is requested, +# open a pipe to a newly forked compress/uncompress/gzip command to +# handle it. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to handle compressed pixmaps" >&5 +$as_echo_n "checking whether to handle compressed pixmaps... " >&6; } case $host_os in - *mingw*) + *mingw*) zpipe_default="no" ;; + *) zpipe_default="yes" ;; +esac +# Check whether --enable-open-zfile was given. +if test "${enable_open_zfile+set}" = set; then : + enableval=$enable_open_zfile; OPEN_ZFILE=$enableval +else + OPEN_ZFILE=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $OPEN_ZFILE" >&5 +$as_echo "$OPEN_ZFILE" >&6; } + if test "x$OPEN_ZFILE" = "xyes"; then + COMPRESSED_PIXMAPS_TRUE= + COMPRESSED_PIXMAPS_FALSE='#' +else + COMPRESSED_PIXMAPS_TRUE='#' + COMPRESSED_PIXMAPS_FALSE= +fi + +if test x$OPEN_ZFILE = xno ; then $as_echo "#define NO_ZPIPE 1" >>confdefs.h - ;; - *) +else + # gzip is absolutely required for the compressed file handling code -# Extract the first word of "compress", so it can be a program name with args. -set dummy compress; ac_word=$2 +# Extract the first word of "gzip", so it can be a program name with args. +set dummy gzip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_XPM_PATH_COMPRESS+:} false; then : +if ${ac_cv_path_XPM_PATH_GZIP+:} false; then : $as_echo_n "(cached) " >&6 else - case $XPM_PATH_COMPRESS in + case $XPM_PATH_GZIP in [\\/]* | ?:[\\/]*) - ac_cv_path_XPM_PATH_COMPRESS="$XPM_PATH_COMPRESS" # Let the user override the test with a path. + ac_cv_path_XPM_PATH_GZIP="$XPM_PATH_GZIP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -17919,7 +18089,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_XPM_PATH_COMPRESS="$as_dir/$ac_word$ac_exec_ext" + ac_cv_path_XPM_PATH_GZIP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -17930,36 +18100,40 @@ IFS=$as_save_IFS ;; esac fi -XPM_PATH_COMPRESS=$ac_cv_path_XPM_PATH_COMPRESS -if test -n "$XPM_PATH_COMPRESS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XPM_PATH_COMPRESS" >&5 -$as_echo "$XPM_PATH_COMPRESS" >&6; } +XPM_PATH_GZIP=$ac_cv_path_XPM_PATH_GZIP +if test -n "$XPM_PATH_GZIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XPM_PATH_GZIP" >&5 +$as_echo "$XPM_PATH_GZIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -if test "x$XPM_PATH_COMPRESS" = "x"; then : - as_fn_error $? "compress not found, set XPM_PATH_COMPRESS or use --disable-stat-zfile" "$LINENO" 5 -fi +if test "x$XPM_PATH_GZIP" = "x"; then : + as_fn_error $? "gzip not found, set XPM_PATH_GZIP or use --disable-open-zfile" "$LINENO" 5 +else cat >>confdefs.h <<_ACEOF -#define XPM_PATH_COMPRESS "$XPM_PATH_COMPRESS" +#define XPM_PATH_GZIP "$XPM_PATH_GZIP" _ACEOF +fi -# Extract the first word of "uncompress", so it can be a program name with args. -set dummy uncompress; ac_word=$2 + # if compress is not found, we disable writing to .Z files, + # but leave the rest of the compression code active + +# Extract the first word of "compress", so it can be a program name with args. +set dummy compress; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_XPM_PATH_UNCOMPRESS+:} false; then : +if ${ac_cv_path_XPM_PATH_COMPRESS+:} false; then : $as_echo_n "(cached) " >&6 else - case $XPM_PATH_UNCOMPRESS in + case $XPM_PATH_COMPRESS in [\\/]* | ?:[\\/]*) - ac_cv_path_XPM_PATH_UNCOMPRESS="$XPM_PATH_UNCOMPRESS" # Let the user override the test with a path. + ac_cv_path_XPM_PATH_COMPRESS="$XPM_PATH_COMPRESS" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -17969,7 +18143,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_XPM_PATH_UNCOMPRESS="$as_dir/$ac_word$ac_exec_ext" + ac_cv_path_XPM_PATH_COMPRESS="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -17980,36 +18154,39 @@ IFS=$as_save_IFS ;; esac fi -XPM_PATH_UNCOMPRESS=$ac_cv_path_XPM_PATH_UNCOMPRESS -if test -n "$XPM_PATH_UNCOMPRESS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XPM_PATH_UNCOMPRESS" >&5 -$as_echo "$XPM_PATH_UNCOMPRESS" >&6; } +XPM_PATH_COMPRESS=$ac_cv_path_XPM_PATH_COMPRESS +if test -n "$XPM_PATH_COMPRESS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XPM_PATH_COMPRESS" >&5 +$as_echo "$XPM_PATH_COMPRESS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -if test "x$XPM_PATH_UNCOMPRESS" = "x"; then : - as_fn_error $? "uncompress not found, set XPM_PATH_UNCOMPRESS or use --disable-stat-zfile" "$LINENO" 5 -fi +if test "x$XPM_PATH_COMPRESS" = "x"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: compress not found, disabling writing of .Z files" >&5 +$as_echo "$as_me: WARNING: compress not found, disabling writing of .Z files" >&2;} +else cat >>confdefs.h <<_ACEOF -#define XPM_PATH_UNCOMPRESS "$XPM_PATH_UNCOMPRESS" +#define XPM_PATH_COMPRESS "$XPM_PATH_COMPRESS" _ACEOF +fi + # if uncompress is not found, we use gzip to read .Z files -# Extract the first word of "gzip", so it can be a program name with args. -set dummy gzip; ac_word=$2 +# Extract the first word of "uncompress", so it can be a program name with args. +set dummy uncompress; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_XPM_PATH_GZIP+:} false; then : +if ${ac_cv_path_XPM_PATH_UNCOMPRESS+:} false; then : $as_echo_n "(cached) " >&6 else - case $XPM_PATH_GZIP in + case $XPM_PATH_UNCOMPRESS in [\\/]* | ?:[\\/]*) - ac_cv_path_XPM_PATH_GZIP="$XPM_PATH_GZIP" # Let the user override the test with a path. + ac_cv_path_XPM_PATH_UNCOMPRESS="$XPM_PATH_UNCOMPRESS" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -18019,7 +18196,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_XPM_PATH_GZIP="$as_dir/$ac_word$ac_exec_ext" + ac_cv_path_XPM_PATH_UNCOMPRESS="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -18030,91 +18207,350 @@ IFS=$as_save_IFS ;; esac fi -XPM_PATH_GZIP=$ac_cv_path_XPM_PATH_GZIP -if test -n "$XPM_PATH_GZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XPM_PATH_GZIP" >&5 -$as_echo "$XPM_PATH_GZIP" >&6; } +XPM_PATH_UNCOMPRESS=$ac_cv_path_XPM_PATH_UNCOMPRESS +if test -n "$XPM_PATH_UNCOMPRESS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XPM_PATH_UNCOMPRESS" >&5 +$as_echo "$XPM_PATH_UNCOMPRESS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -if test "x$XPM_PATH_GZIP" = "x"; then : - as_fn_error $? "gzip not found, set XPM_PATH_GZIP or use --disable-stat-zfile" "$LINENO" 5 -fi +if test "x$XPM_PATH_UNCOMPRESS" = "x"; then : + +else cat >>confdefs.h <<_ACEOF -#define XPM_PATH_GZIP "$XPM_PATH_GZIP" +#define XPM_PATH_UNCOMPRESS "$XPM_PATH_UNCOMPRESS" _ACEOF +fi -# Extract the first word of "gunzip", so it can be a program name with args. -set dummy gunzip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_XPM_PATH_GUNZIP+:} false; then : + for ac_func in closefrom close_range +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + break +fi +done + +fi + +# Optional feature: When ___.xpm is requested, also look for ___.xpm.Z & .gz +# Replaces ZFILEDEF = -DSTAT_ZFILE in old Imakefile +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to search for compressed pixmaps" >&5 +$as_echo_n "checking whether to search for compressed pixmaps... " >&6; } +# Check whether --enable-stat-zfile was given. +if test "${enable_stat_zfile+set}" = set; then : + enableval=$enable_stat_zfile; STAT_ZFILE=$enableval +else + STAT_ZFILE=$OPEN_ZFILE +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $STAT_ZFILE" >&5 +$as_echo "$STAT_ZFILE" >&6; } +if test x$STAT_ZFILE = xyes ; then + +$as_echo "#define STAT_ZFILE 1" >>confdefs.h + +fi + +# --enable-unit-tests + + + + + + +# Check for different types of support on different platforms +case $host_os in + solaris*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for umem_alloc in -lumem" >&5 +$as_echo_n "checking for umem_alloc in -lumem... " >&6; } +if ${ac_cv_lib_umem_umem_alloc+:} false; then : $as_echo_n "(cached) " >&6 else - case $XPM_PATH_GUNZIP in - [\\/]* | ?:[\\/]*) - ac_cv_path_XPM_PATH_GUNZIP="$XPM_PATH_GUNZIP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_XPM_PATH_GUNZIP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + ac_check_lib_save_LIBS=$LIBS +LIBS="-lumem $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - ;; +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char umem_alloc (); +int +main () +{ +return umem_alloc (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_umem_umem_alloc=yes +else + ac_cv_lib_umem_umem_alloc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_umem_umem_alloc" >&5 +$as_echo "$ac_cv_lib_umem_umem_alloc" >&6; } +if test "x$ac_cv_lib_umem_umem_alloc" = xyes; then : + malloc_debug_env='LD_PRELOAD=libumem.so UMEM_DEBUG=default' +fi + + ;; + *-gnu*) # GNU libc - Value is used as a single byte bit pattern, + # both directly and inverted, so should not be 0 or 255. + malloc_debug_env='MALLOC_PERTURB_=15' + ;; + darwin*) + malloc_debug_env='MallocPreScribble=1 MallocScribble=1 DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib' + ;; + *bsd*) + malloc_debug_env='MallocPreScribble=1 MallocScribble=1' + ;; esac + +# User supplied flags override default flags +if test "x$XORG_MALLOC_DEBUG_ENV" != "x"; then + malloc_debug_env="$XORG_MALLOC_DEBUG_ENV" fi -XPM_PATH_GUNZIP=$ac_cv_path_XPM_PATH_GUNZIP -if test -n "$XPM_PATH_GUNZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XPM_PATH_GUNZIP" >&5 -$as_echo "$XPM_PATH_GUNZIP" >&6; } + +XORG_MALLOC_DEBUG_ENV=$malloc_debug_env + + + + + + + +# Check whether --enable-unit-tests was given. +if test "${enable_unit_tests+set}" = set; then : + enableval=$enable_unit_tests; enable_unit_tests=$enableval else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + enable_unit_tests=auto +fi + + + if test "x$enable_unit_tests" != xno; then + ENABLE_UNIT_TESTS_TRUE= + ENABLE_UNIT_TESTS_FALSE='#' +else + ENABLE_UNIT_TESTS_TRUE='#' + ENABLE_UNIT_TESTS_FALSE= +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build unit test cases" >&5 +$as_echo_n "checking whether to build unit test cases... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_unit_tests" >&5 +$as_echo "$enable_unit_tests" >&6; } + + + + + +# Check whether --with-glib was given. +if test "${with_glib+set}" = set; then : + withval=$with_glib; with_glib=$withval +else + with_glib=auto +fi + + + +have_glib=no +# Do not probe GLib if user explicitly disabled unit testing +if test "x$enable_unit_tests" != x"no"; then + # Do not probe GLib if user explicitly disabled it + if test "x$with_glib" != x"no"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glib-2.0 >= 2.46" >&5 +$as_echo_n "checking for glib-2.0 >= 2.46... " >&6; } + +if test -n "$GLIB_CFLAGS"; then + pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.46\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.46") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.46" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GLIB_LIBS"; then + pkg_cv_GLIB_LIBS="$GLIB_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.46\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.46") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.46" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no fi + if test $_pkg_short_errors_supported = yes; then + GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.46" 2>&1` + else + GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.46" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GLIB_PKG_ERRORS" >&5 + have_glib=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_glib=no +else + GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS + GLIB_LIBS=$pkg_cv_GLIB_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_glib=yes +fi + fi +fi -if test "x$XPM_PATH_GUNZIP" = "x"; then : - as_fn_error $? "gunzip not found, set XPM_PATH_GUNZIP or use --disable-stat-zfile" "$LINENO" 5 +# Not having GLib when unit testing has been explicitly requested is an error +if test "x$enable_unit_tests" = x"yes"; then + if test "x$have_glib" = x"no"; then + as_fn_error $? "--enable-unit-tests=yes specified but glib-2.0 not found" "$LINENO" 5 + fi fi -cat >>confdefs.h <<_ACEOF -#define XPM_PATH_GUNZIP "$XPM_PATH_GUNZIP" -_ACEOF +# Having unit testing disabled when GLib has been explicitly requested is an error +if test "x$enable_unit_tests" = x"no"; then + if test "x$with_glib" = x"yes"; then + as_fn_error $? "--enable-unit-tests=yes specified but glib-2.0 not found" "$LINENO" 5 + fi +fi +# Not having GLib when it has been explicitly requested is an error +if test "x$with_glib" = x"yes"; then + if test "x$have_glib" = x"no"; then + as_fn_error $? "--with-glib=yes specified but glib-2.0 not found" "$LINENO" 5 + fi +fi - for ac_func in closefrom close_range -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 + if test "$have_glib" = yes; then + HAVE_GLIB_TRUE= + HAVE_GLIB_FALSE='#' +else + HAVE_GLIB_TRUE='#' + HAVE_GLIB_FALSE= +fi + + + + + + + +# Check for different types of support on different platforms +case $host_os in + solaris*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for umem_alloc in -lumem" >&5 +$as_echo_n "checking for umem_alloc in -lumem... " >&6; } +if ${ac_cv_lib_umem_umem_alloc+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lumem $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char umem_alloc (); +int +main () +{ +return umem_alloc (); + ; + return 0; +} _ACEOF - break +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_umem_umem_alloc=yes +else + ac_cv_lib_umem_umem_alloc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_umem_umem_alloc" >&5 +$as_echo "$ac_cv_lib_umem_umem_alloc" >&6; } +if test "x$ac_cv_lib_umem_umem_alloc" = xyes; then : + malloc_debug_env='LD_PRELOAD=libumem.so UMEM_DEBUG=default' fi -done ;; + *-gnu*) # GNU libc - Value is used as a single byte bit pattern, + # both directly and inverted, so should not be 0 or 255. + malloc_debug_env='MALLOC_PERTURB_=15' + ;; + darwin*) + malloc_debug_env='MallocPreScribble=1 MallocScribble=1 DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib' + ;; + *bsd*) + malloc_debug_env='MallocPreScribble=1 MallocScribble=1' + ;; esac -ac_config_files="$ac_config_files Makefile doc/Makefile include/Makefile man/Makefile src/Makefile sxpm/Makefile cxpm/Makefile xpm.pc" +# User supplied flags override default flags +if test "x$XORG_MALLOC_DEBUG_ENV" != "x"; then + malloc_debug_env="$XORG_MALLOC_DEBUG_ENV" +fi + +XORG_MALLOC_DEBUG_ENV=$malloc_debug_env + + + +ac_config_files="$ac_config_files Makefile doc/Makefile include/Makefile man/Makefile src/Makefile sxpm/Makefile cxpm/Makefile test/Makefile xpm.pc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -18261,6 +18697,18 @@ if test -z "${USE_GETTEXT_TRUE}" && test -z "${USE_GETTEXT_FALSE}"; then as_fn_error $? "conditional \"USE_GETTEXT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${COMPRESSED_PIXMAPS_TRUE}" && test -z "${COMPRESSED_PIXMAPS_FALSE}"; then + as_fn_error $? "conditional \"COMPRESSED_PIXMAPS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_UNIT_TESTS_TRUE}" && test -z "${ENABLE_UNIT_TESTS_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_UNIT_TESTS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_GLIB_TRUE}" && test -z "${HAVE_GLIB_FALSE}"; then + as_fn_error $? "conditional \"HAVE_GLIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 @@ -18658,7 +19106,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libXpm $as_me 3.5.14, which was +This file was extended by libXpm $as_me 3.5.16, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -18718,13 +19166,13 @@ $config_headers Configuration commands: $config_commands -Report bugs to <https://gitlab.freedesktop.org/xorg/lib/libxpm/-/issues>." +Report bugs to <https://gitlab.freedesktop.org/xorg/lib/libxpm/-/issues/>." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -libXpm config.status 3.5.14 +libXpm config.status 3.5.16 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -19140,6 +19588,7 @@ do "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "sxpm/Makefile") CONFIG_FILES="$CONFIG_FILES sxpm/Makefile" ;; "cxpm/Makefile") CONFIG_FILES="$CONFIG_FILES cxpm/Makefile" ;; + "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; "xpm.pc") CONFIG_FILES="$CONFIG_FILES xpm.pc" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; diff --git a/lib/libXpm/configure.ac b/lib/libXpm/configure.ac index 3a4edb396..a69daaf0b 100644 --- a/lib/libXpm/configure.ac +++ b/lib/libXpm/configure.ac @@ -1,8 +1,8 @@ # Initialize Autoconf AC_PREREQ([2.60]) -AC_INIT([libXpm], [3.5.14], - [https://gitlab.freedesktop.org/xorg/lib/libxpm/-/issues], [libXpm]) +AC_INIT([libXpm], [3.5.16], + [https://gitlab.freedesktop.org/xorg/lib/libxpm/-/issues/], [libXpm]) AC_CONFIG_SRCDIR([Makefile.am]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_MACRO_DIR([m4]) @@ -11,12 +11,12 @@ AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE([foreign dist-xz]) # Initialize libtool -AC_PROG_LIBTOOL +LT_INIT -# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS +# Require X.Org macros 1.16 or later for XORG_MEMORY_CHECK_FLAGS m4_ifndef([XORG_MACROS_VERSION], - [m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])]) -XORG_MACROS_VERSION(1.8) + [m4_fatal([must install xorg-macros 1.16 or later before running autoconf/autogen])]) +XORG_MACROS_VERSION(1.16) XORG_DEFAULT_OPTIONS # Checks for library functions @@ -52,23 +52,58 @@ AM_CONDITIONAL(USE_GETTEXT, test "x$USE_GETTEXT" = "xyes") dnl Helper macro to find absolute path to program and add a #define for it AC_DEFUN([XPM_PATH_PROG],[ AC_PATH_PROG([$1], [$2], []) -AS_IF([test "x$$1" = "x"], - [AC_MSG_ERROR([$2 not found, set $1 or use --disable-stat-zfile])]) -AC_DEFINE_UNQUOTED([$1], ["$$1"], [Path to $2]) +AS_IF([test "x$$1" = "x"], [$3], + [AC_DEFINE_UNQUOTED([$1], ["$$1"], [Path to $2])]) ]) dnl End of AC_DEFUN([XPM_PATH_PROG]... +# Optional feature: When a filename ending in .Z or .gz is requested, +# open a pipe to a newly forked compress/uncompress/gzip command to +# handle it. +AC_MSG_CHECKING([whether to handle compressed pixmaps]) case $host_os in - *mingw*) - AC_DEFINE(NO_ZPIPE, 1, [Define to 1 to disable decompression via pipes]) - ;; - *) - XPM_PATH_PROG([XPM_PATH_COMPRESS], [compress]) - XPM_PATH_PROG([XPM_PATH_UNCOMPRESS], [uncompress]) - XPM_PATH_PROG([XPM_PATH_GZIP], [gzip]) - XPM_PATH_PROG([XPM_PATH_GUNZIP], [gunzip]) - AC_CHECK_FUNCS([closefrom close_range], [break]) - ;; + *mingw*) zpipe_default="no" ;; + *) zpipe_default="yes" ;; esac +AC_ARG_ENABLE(open-zfile, + AS_HELP_STRING([--enable-open-zfile], + [Search for files with .Z & .gz extensions automatically @<:@default=auto@:>@]), + [OPEN_ZFILE=$enableval], [OPEN_ZFILE=yes]) +AC_MSG_RESULT([$OPEN_ZFILE]) +AM_CONDITIONAL(COMPRESSED_PIXMAPS, test "x$OPEN_ZFILE" = "xyes") +if test x$OPEN_ZFILE = xno ; then + AC_DEFINE(NO_ZPIPE, 1, [Define to 1 to disable decompression via pipes]) +else + # gzip is absolutely required for the compressed file handling code + XPM_PATH_PROG([XPM_PATH_GZIP], [gzip], + [AC_MSG_ERROR([gzip not found, set XPM_PATH_GZIP or use --disable-open-zfile])]) + + # if compress is not found, we disable writing to .Z files, + # but leave the rest of the compression code active + XPM_PATH_PROG([XPM_PATH_COMPRESS], [compress], + [AC_MSG_WARN([compress not found, disabling writing of .Z files])]) + # if uncompress is not found, we use gzip to read .Z files + XPM_PATH_PROG([XPM_PATH_UNCOMPRESS], [uncompress]) + + AC_CHECK_FUNCS([closefrom close_range], [break]) +fi + +# Optional feature: When ___.xpm is requested, also look for ___.xpm.Z & .gz +# Replaces ZFILEDEF = -DSTAT_ZFILE in old Imakefile +AC_MSG_CHECKING([whether to search for compressed pixmaps]) +AC_ARG_ENABLE(stat-zfile, + AS_HELP_STRING([--enable-stat-zfile], + [Search for files with .Z & .gz extensions automatically @<:@default=auto@:>@]), + [STAT_ZFILE=$enableval], [STAT_ZFILE=$OPEN_ZFILE]) +AC_MSG_RESULT([$STAT_ZFILE]) +if test x$STAT_ZFILE = xyes ; then + AC_DEFINE(STAT_ZFILE, 1, [Define to 1 to automatically look for files with .Z & .gz extensions]) +fi + +# --enable-unit-tests +AC_REQUIRE_AUX_FILE([tap-driver.sh]) +XORG_ENABLE_UNIT_TESTS +XORG_WITH_GLIB([2.46]) +XORG_MEMORY_CHECK_FLAGS AC_CONFIG_FILES([Makefile doc/Makefile @@ -77,5 +112,6 @@ AC_CONFIG_FILES([Makefile src/Makefile sxpm/Makefile cxpm/Makefile + test/Makefile xpm.pc]) AC_OUTPUT diff --git a/lib/libXpm/cxpm/Makefile.in b/lib/libXpm/cxpm/Makefile.in index 0d43c2ade..151a9bef2 100644 --- a/lib/libXpm/cxpm/Makefile.in +++ b/lib/libXpm/cxpm/Makefile.in @@ -156,6 +156,8 @@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILE_MAN_DIR = @FILE_MAN_DIR@ FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_CMD = @INSTALL_CMD@ @@ -207,11 +209,11 @@ STRIP = @STRIP@ SXPM_CFLAGS = @SXPM_CFLAGS@ SXPM_LIBS = @SXPM_LIBS@ VERSION = @VERSION@ +XORG_MALLOC_DEBUG_ENV = @XORG_MALLOC_DEBUG_ENV@ XORG_MAN_PAGE = @XORG_MAN_PAGE@ XPM_CFLAGS = @XPM_CFLAGS@ XPM_LIBS = @XPM_LIBS@ XPM_PATH_COMPRESS = @XPM_PATH_COMPRESS@ -XPM_PATH_GUNZIP = @XPM_PATH_GUNZIP@ XPM_PATH_GZIP = @XPM_PATH_GZIP@ XPM_PATH_UNCOMPRESS = @XPM_PATH_UNCOMPRESS@ abs_builddir = @abs_builddir@ diff --git a/lib/libXpm/cxpm/cxpm.c b/lib/libXpm/cxpm/cxpm.c index 8b8af9abf..94865e0b3 100644 --- a/lib/libXpm/cxpm/cxpm.c +++ b/lib/libXpm/cxpm/cxpm.c @@ -61,7 +61,7 @@ sGetc(xpmData *data, FILE *file) if (c == '\n') { data->lineNum++; data->charNum = 0; - } else { + } else if (c != EOF) { data->charNum++; } return c; @@ -74,7 +74,7 @@ sUngetc(xpmData *data, int c, FILE *file) if (c == '\n') { data->lineNum--; data->charNum = 0; - } else { + } else if (c != EOF) { data->charNum--; } } diff --git a/lib/libXpm/doc/Makefile.in b/lib/libXpm/doc/Makefile.in index 690619d84..21b41c5fc 100644 --- a/lib/libXpm/doc/Makefile.in +++ b/lib/libXpm/doc/Makefile.in @@ -118,6 +118,8 @@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILE_MAN_DIR = @FILE_MAN_DIR@ FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_CMD = @INSTALL_CMD@ @@ -169,11 +171,11 @@ STRIP = @STRIP@ SXPM_CFLAGS = @SXPM_CFLAGS@ SXPM_LIBS = @SXPM_LIBS@ VERSION = @VERSION@ +XORG_MALLOC_DEBUG_ENV = @XORG_MALLOC_DEBUG_ENV@ XORG_MAN_PAGE = @XORG_MAN_PAGE@ XPM_CFLAGS = @XPM_CFLAGS@ XPM_LIBS = @XPM_LIBS@ XPM_PATH_COMPRESS = @XPM_PATH_COMPRESS@ -XPM_PATH_GUNZIP = @XPM_PATH_GUNZIP@ XPM_PATH_GZIP = @XPM_PATH_GZIP@ XPM_PATH_UNCOMPRESS = @XPM_PATH_UNCOMPRESS@ abs_builddir = @abs_builddir@ diff --git a/lib/libXpm/include/Makefile.in b/lib/libXpm/include/Makefile.in index f30a58a9a..0bfa408c7 100644 --- a/lib/libXpm/include/Makefile.in +++ b/lib/libXpm/include/Makefile.in @@ -151,6 +151,8 @@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILE_MAN_DIR = @FILE_MAN_DIR@ FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_CMD = @INSTALL_CMD@ @@ -202,11 +204,11 @@ STRIP = @STRIP@ SXPM_CFLAGS = @SXPM_CFLAGS@ SXPM_LIBS = @SXPM_LIBS@ VERSION = @VERSION@ +XORG_MALLOC_DEBUG_ENV = @XORG_MALLOC_DEBUG_ENV@ XORG_MAN_PAGE = @XORG_MAN_PAGE@ XPM_CFLAGS = @XPM_CFLAGS@ XPM_LIBS = @XPM_LIBS@ XPM_PATH_COMPRESS = @XPM_PATH_COMPRESS@ -XPM_PATH_GUNZIP = @XPM_PATH_GUNZIP@ XPM_PATH_GZIP = @XPM_PATH_GZIP@ XPM_PATH_UNCOMPRESS = @XPM_PATH_UNCOMPRESS@ abs_builddir = @abs_builddir@ diff --git a/lib/libXpm/man/Makefile.in b/lib/libXpm/man/Makefile.in index d87c8788a..79481588b 100644 --- a/lib/libXpm/man/Makefile.in +++ b/lib/libXpm/man/Makefile.in @@ -171,6 +171,8 @@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILE_MAN_DIR = @FILE_MAN_DIR@ FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_CMD = @INSTALL_CMD@ @@ -222,11 +224,11 @@ STRIP = @STRIP@ SXPM_CFLAGS = @SXPM_CFLAGS@ SXPM_LIBS = @SXPM_LIBS@ VERSION = @VERSION@ +XORG_MALLOC_DEBUG_ENV = @XORG_MALLOC_DEBUG_ENV@ XORG_MAN_PAGE = @XORG_MAN_PAGE@ XPM_CFLAGS = @XPM_CFLAGS@ XPM_LIBS = @XPM_LIBS@ XPM_PATH_COMPRESS = @XPM_PATH_COMPRESS@ -XPM_PATH_GUNZIP = @XPM_PATH_GUNZIP@ XPM_PATH_GZIP = @XPM_PATH_GZIP@ XPM_PATH_UNCOMPRESS = @XPM_PATH_UNCOMPRESS@ abs_builddir = @abs_builddir@ diff --git a/lib/libXpm/man/XpmCreateBuffer.man b/lib/libXpm/man/XpmCreateBuffer.man index b1b02f60a..2e72a96f0 100644 --- a/lib/libXpm/man/XpmCreateBuffer.man +++ b/lib/libXpm/man/XpmCreateBuffer.man @@ -24,15 +24,20 @@ .hw XImage .TH XpmCreateBuffer __libmansuffix__ __xorgversion__ "libXpm functions" .SH NAME -XpmCreateBuffer \- create an Xpm-Buffer +XpmCreateBuffer \- create an XPM Buffer .SH SYNOPSIS +.nf .HP -int XpmCreateBufferFromImage(Display *display, char **buffer_return, XImage *image, XImage *shapeimage, XpmAttributes *attributes); +.BI "int XpmCreateBufferFromImage(Display *" display " , char **" buffer_return , +.BI "XImage *" image ", XImage *" shapeimage ", XpmAttributes *" attributes ); .HP -int XpmCreateBufferFromPixmap(Display *display, char **buffer_return, Pixmap pixmap, Pixmap shapemask, XpmAttributes *attributes); +.BI "int XpmCreateBufferFromPixmap(Display *" display ", char **" buffer_return , +.BI "Pixmap " pixmap ", Pixmap " shapemask ", XpmAttributes *" attributes ); .HP -int XpmCreateBufferFromXpmImage(char **buffer_return, XpmImage *image, XpmInfo *info); +.BI "int XpmCreateBufferFromXpmImage(char **" buffer_return ", XpmImage *" image , +.BI "XpmInfo *" info ); +.fi .SH ARGUMENTS @@ -52,30 +57,72 @@ Specifies the location of a structure to get possible information (or NULL). .SH DESCRIPTION .SS XpmCreateBufferFromPixmap -XpmCreateBufferFromPixmap creates an XPM buffer from a Pixmap. -The XpmCreateBufferFromPixmap function works as XpmWriteFileFromPixmap(), it just calls -XpmCreateBufferFromImage instead of XpmWriteFileFromImage. Once again, the caller should free the buffer using -XpmFree when finished. - -As a convenience, the XpmReadFileToBuffer and XpmWriteFileFromBuffer functions -are provided to copy a file to a buffer -and to write a file from a buffer. Thus for instance one may decide to use XpmReadFileToBuffer, -XpmCreatePixmapFromBuffer, and XpmFree instead of XpmReadFileToPixmap. On some systems this may lead to a -performance improvement, since the parsing will be performed in memory, but it uses more memory. +.PP +.BR XpmCreateBufferFromPixmap () +creates an XPM buffer from a Pixmap. +The +.BR XpmCreateBufferFromPixmap () +function works as +.BR XpmWriteFileFromPixmap (__libmansuffix__), +it just calls +.BR XpmCreateBufferFromImage () +instead of +.BR XpmWriteFileFromImage (__libmansuffix__). +Once again, the caller should free the buffer using +.BR XpmFree (__libmansuffix__) +when finished. +.PP +As a convenience, the +.BR XpmReadFileToBuffer (__libmansuffix__) +and +.BR XpmWriteFileFromBuffer (__libmansuffix__) +functions are provided to copy a file to a buffer +and to write a file from a buffer. Thus for instance one may decide to use +.BR XpmCreateBufferFromPixmap (), +.BR XpmWriteFileFromBuffer (__libmansuffix__), +and +.BR XpmFree (__libmansuffix__) +instead of +.BR XpmWriteFileFromPixmap (__libmansuffix__). +On some systems this may lead to a performance improvement, since the +processing will be performed in memory, but it uses more memory. .SS XpmCreateBufferFromImage -The XpmCreateBufferFromImage function works as XpmWriteFileFromImage(), it just writes to a malloc’ed buffer instead of to a file. -The caller should free the buffer using XpmFree when finished. +.PP +The +.BR XpmCreateBufferFromImage () +function works as +.BR XpmWriteFileFromImage (__libmansuffix__), +it just writes to a malloc’ed buffer instead of to a file. +The caller should free the buffer using +.BR XpmFree (__libmansuffix__) +when finished. .SS XpmCreateBufferFromXpmImage. -To create an XPM buffer from an XpmImage, use XpmCreateBufferFromXpmImage. -The XpmCreateBufferFromXpmImage function writes out the givenimage to a single block malloc’ed buffer inXPM format. -If insufficient working storage is allocated, it returns XpmNoMemory, and returns XpmSuccess on success. -If the passed XpmInfo structure pointer is not NULL, XpmCreateBufferFromXpmImage looks for the following -attributes: XpmComments, XpmExtensions, and XpmHotspot, and writes the related information out as well. -The caller should free the buffer using XpmFree when finished. +.PP +To create an XPM buffer from an XpmImage, use +.BR XpmCreateBufferFromXpmImage (). +The +.BR XpmCreateBufferFromXpmImage () +function writes out the given image to a single block malloc’ed buffer +in XPM format. +If insufficient working storage is allocated, it returns +.BR XpmNoMemory, +and returns +.B XpmSuccess +on success. +If the passed XpmInfo structure pointer is not NULL, +.BR XpmCreateBufferFromXpmImage () +looks for the following attributes: XpmComments, XpmExtensions, and XpmHotspot, +and writes the related information out as well. +The caller should free the buffer using +.BR XpmFree (__libmansuffix__) +when finished. .SH "SEE ALSO" -.BR XpmCreateBufferFromImage(__libmansuffix__) , -.BR XpmCreateBufferFromPixmap(__libmansuffix__) , -.BR XpmCreateBufferFromXpmImage(__libmansuffix__) +.ad l +.nh +.BR XpmFree (__libmansuffix__), +.BR XpmWriteFileFromBuffer (__libmansuffix__), +.BR XpmWriteFileFromImage (__libmansuffix__), +.BR XpmWriteFileFromPixmap (__libmansuffix__) diff --git a/lib/libXpm/man/XpmCreateData.man b/lib/libXpm/man/XpmCreateData.man index a4f332bad..97d7b14b3 100644 --- a/lib/libXpm/man/XpmCreateData.man +++ b/lib/libXpm/man/XpmCreateData.man @@ -27,12 +27,17 @@ XpmCreateData \- create an Data structure .SH SYNOPSIS +.nf .HP -int XpmCreateDataFromImage(Display *display, char ***data_return, XImage *image, XImage *shapeimage, XpmAttributes *attributes); +.BI "int XpmCreateDataFromImage(Display *" display ", char ***" data_return , +.BI "XImage *" image ", XImage *" shapeimage ", XpmAttributes *" attributes ); .HP -int XpmCreateDataFromPixmap(Display *display, char ***data_return, Pixmap pixmap, Pixmap shapemask, XpmAttributes *attributes); +.BI "int XpmCreateDataFromPixmap(Display *" display ", char ***" data_return , +.BI "Pixmap " pixmap ", Pixmap " shapemask ", XpmAttributes *" attributes ); .HP -int XpmCreateDataFromXpmImage(char ***data_return, XpmImage *image, XpmInfo *info); +.BI "int XpmCreateDataFromXpmImage(char ***" data_return ", XpmImage *" image , +.BI "XpmInfo *" info ); +.fi .SH ARGUMENTS @@ -53,27 +58,58 @@ Specifies the image .SH DESCRIPTION .SS XpmCreateDataFromImage -In some cases, one may want to create an XPM data from an XImage, to do so use XpmCreateDataFromImage. -The XpmCreateDataFromImage function exactly works as XpmWriteFileFromImage() does and returns the same way. +.PP +In some cases, one may want to create an XPM data from an XImage, to do so use +.BR XpmCreateDataFromImage (). +The +.BR XpmCreateDataFromImage () +function exactly works as +.BR XpmWriteFileFromImage (__libmansuffix__) +does and returns the same way. It just writes to a single block malloc’ed data instead of to a file. -It is the caller’s responsibility to free the data, using XpmFree when finished. +It is the caller’s responsibility to free the data, using +.BR XpmFree (__libmansuffix__) +when finished. .SS XpmCreateDataFromPixmap -XpmCreateDataFromPixmap creates an XPM data from a Pixmap. -The XpmCreateDataFromPixmap function uses XGetImage to get from the given pixmaps -the related X images which are passed to XpmCreateDataFromImage. -Then it destroys the created images using XDestroyImage. -XpmCreateDataFromPixmap returns the same errors as XpmCreateDataFromImage. +.PP +.BR XpmCreateDataFromPixmap () +creates an XPM data from a Pixmap. +The +.BR XpmCreateDataFromPixmap () +function uses +.BR XGetImage (__libmansuffix__) +to get from the given pixmaps +the related X images which are passed to +.BR XpmCreateDataFromImage (). +Then it destroys the created images using +.BR XDestroyImage (__libmansuffix__). +.BR XpmCreateDataFromPixmap () +returns the same errors as +.BR XpmCreateDataFromImage (). .SS XpmCreateDataFromXpmImage -XpmCreateDataFromXpmImage creates an XPM data from an XmImage. -The XpmCreateDataFromXpmImage function writes out the given image to a single block malloc’ed data in XPM format. -If insufficient working storage is allocated, it returns XpmNoMemory, and returns XpmSuccess on success. -If the passed XpmInfo structure pointer is not NULL, XpmCreateDataFromXpmImage looks for the following attributes: +.PP +.BR XpmCreateDataFromXpmImage () +creates an XPM data from an XpmImage. +The +.BR XpmCreateDataFromXpmImage () +function writes out the given image to a single block malloc’ed data in XPM format. +If insufficient working storage is allocated, it returns +.BR XpmNoMemory , +and returns +.B XpmSuccess +on success. +If the passed XpmInfo structure pointer is not NULL, +.BR XpmCreateDataFromXpmImage () +looks for the following attributes: XpmExtensions, and XpmHotspot, and writes the related information out as well. -It is the caller’s responsibility to free the data, using XpmFree when finished. +It is the caller’s responsibility to free the data, using +.BR XpmFree (__libmansuffix__) +when finished. .SH "SEE ALSO" -.BR XpmCreateDataFromImage(__libmansuffix__) , -.BR XpmCreateDataFromPixmap(__libmansuffix__) , -.BR XpmCreateDataFromXpmImage(__libmansuffix__) +.ad l +.nh +.BR XpmFree (__libmansuffix__), +.BR XpmWriteFileFromImage (__libmansuffix__) diff --git a/lib/libXpm/man/XpmCreateImage.man b/lib/libXpm/man/XpmCreateImage.man index fc68dbbf9..c87644793 100644 --- a/lib/libXpm/man/XpmCreateImage.man +++ b/lib/libXpm/man/XpmCreateImage.man @@ -24,14 +24,22 @@ .hw XImage .TH XpmCreateImage __libmansuffix__ __xorgversion__ "libXpm functions" .SH NAME -XpmCreateImage \- create an Xpm-image +XpmCreateImage \- create an XImage from an XPM .SH SYNOPSIS +.nf .HP -int XpmCreateImageFromData(Display *display, char **data, XImage **image_return, XImage **shapeimage_return, XpmAttributes *attributes); +.BI "int XpmCreateImageFromData(Display *" display ", char **" data , +.BI "XImage **" image_return ", XImage **" shapeimage_return , +.BI "XpmAttributes *" attributes ); .HP -int XpmCreateImageFromBuffer(Display *display, char *buffer, XImage **image_return, XImage **shapeimage_return, XpmAttributes *attributes); +.BI "int XpmCreateImageFromBuffer(Display *" display ", char *" buffer , +.BI "XImage **" image_return ", XImage **" shapeimage_return , +.BI "XpmAttributes *" attributes ); .HP -int XpmCreateImageFromXpmImage(Display *display, XpmImage *image, XImage *image_return, XImage *shapeimage_return, XpmAttributes *attributes); +.BI "int XpmCreateImageFromXpmImage(Display *" display ", XpmImage *" image , +.BI "XImage *" image_return ", XImage *" shapeimage_return , +.BI "XpmAttributes *" attributes ); +.fi .SH ARGUMENTS @@ -51,31 +59,56 @@ Specifies the shape mask image which is created if any. .SH DESCRIPTION .SS XpmCreateImageFromData -To create an XImage from an XPM data, use XpmCreateImageFromData. - -The XpmCreateImageFromData function allows you to include in your C program an XPM file which was -written out by functions such as XpmWriteFileFromImage or XpmWriteFileFromPixmap without reading in the file. -XpmCreateImageFromData exactly works as XpmReadFileToImage() does and returns the same way. +.PP +To create an XImage from an XPM data, use +.BR XpmCreateImageFromData (). +.PP +The +.BR XpmCreateImageFromData () +function allows you to include in your C program an XPM file which was +written out by functions such as +.BR XpmWriteFileFromImage (__libmansuffix__) +or +.BR XpmWriteFileFromPixmap (__libmansuffix__) +without reading in the file. +.BR XpmCreateImageFromData () +exactly works as +.BR XpmReadFileToImage (__libmansuffix__) +does and returns the same way. It just reads data instead of a file. -Here again, it is the caller’s responsibility to free the returned images, the colors -and possibly the data returned into the XpmAttributes structure. +Here again, it is the caller’s responsibility to free the returned images, +the colors and possibly the data returned into the XpmAttributes structure. .SS XpmCreateImageFromBuffer -To create an XImage from an XPM buffer, use XpmCreateImageFromBuffer. -The XpmCreateImageFromBuffer function works the same way as XpmReadFileToImage(), +.PP +To create an XImage from an XPM buffer, use +.BR XpmCreateImageFromBuffer (). +The +.BR XpmCreateImageFromBuffer() +function works the same way as +.BR XpmReadFileToImage (__libmansuffix__), it just parses the buffer instead of the file. -Be aware that the feature provided on some systems by XpmReadFileToImage +Be aware that the feature provided on some systems by +.BR XpmReadFileToImage (__libmansuffix__) to deal with compressed files is not available here. .SS XpmCreateImageFromXpmImage -To create an XImage from an XpmImage, use XpmCreateImageFromXpmImage. -From the given XpmImage and XpmAttributes if not NULL, XpmCreateImageFromXpmImage allocates colors -and creates X images following the same mechanism as XpmReadFileToImage(). -When finished the caller must free the images using XDestroyImage, -the colors using XFreeColors, and possibly the -data returned into the XpmAttributes using XpmFreeAttributes(). +.PP +To create an XImage from an XpmImage, use +.BR XpmCreateImageFromXpmImage (). +From the given XpmImage and XpmAttributes if not NULL, +.BR XpmCreateImageFromXpmImage () +allocates colors and creates X images following the same mechanism as +.BR XpmReadFileToImage (__libmansuffix__). +When finished the caller must free the images using +.BR XDestroyImage (__libmansuffix__), +the colors using +.BR XFreeColors (__libmansuffix__), +and possibly the data returned into the XpmAttributes using +.BR XpmFreeAttributes (__libmansuffix__). .SH "SEE ALSO" -.BR XpmCreateImageFromBuffer(__libmansuffix__) , -.BR XpmCreateImageFromData(__libmansuffix__) , -.BR XpmCreateImageFromXpmImage(__libmansuffix__) +.ad l +.nh +.BR XpmFreeAttributes (__libmansuffix__), +.BR XpmReadFileToImage (__libmansuffix__) diff --git a/lib/libXpm/man/XpmCreatePixmap.man b/lib/libXpm/man/XpmCreatePixmap.man index 5088f1eb7..19fe4cb15 100644 --- a/lib/libXpm/man/XpmCreatePixmap.man +++ b/lib/libXpm/man/XpmCreatePixmap.man @@ -26,12 +26,20 @@ .SH NAME XpmCreatePixmap \- create a pixmap .SH SYNOPSIS +.nf .HP -int XpmCreatePixmapFromData(Display *display, Drawable d, char **data, Pixmap *pixmap_return, Pixmap *shapemask_return, XpmAttributes *attributes); +.BI "int XpmCreatePixmapFromData(Display *" display ", Drawable " d , +.BI "char **" data ", Pixmap *" pixmap_return ", Pixmap *" shapemask_return , +.BI "XpmAttributes *" attributes ); .HP -int XpmCreatePixmapFromBuffer(Display *display, Drawable d, char *buffer, Pixmap *pixmap_return, Pixmap *shapemask_return, XpmAttributes *attributes); +.BI "int XpmCreatePixmapFromBuffer(Display *" display ", Drawable " d , +.BI "char *" buffer ", Pixmap *" pixmap_return ", Pixmap *" shapemask_return , +.BI "XpmAttributes *" attributes ); .HP -int XpmCreatePixmapFromXpmImage(Display *display, Drawable d, XpmImage *image, Pixmap *pixmap_return, Pixmap *shapemask_return, XpmAttributes *attributes); +.BI "int XpmCreatePixmapFromXpmImage(Display *" display ", Drawable " d , +.BI "XpmImage *" image ", Pixmap *" pixmap_return ", Pixmap *" shapemask_return , +.BI "XpmAttributes *" attributes ); +.fi .SH ARGUMENTS @@ -52,27 +60,65 @@ Specifies the XpmImage. .SH DESCRIPTION .SS XpmCreatePixmapFromData -To create a Pixmap from an XPM data, use XpmCreatePixmapFromData. -The XpmCreatePixmapFromData function creates X images using XpmCreateImageFromData() and -thus returns the same errors. In addition on success it then creates the related pixmaps, using XPutImage, -which are returned to pixmap_return and shapemask_return if not NULL, and finally destroys the created images using XDestroyImage. -Do not forget to free the returned pixmaps, the colors, and possibly the data returned into the XpmAttributes structure when done. +.PP +To create a Pixmap from an XPM data, use +.BR XpmCreatePixmapFromData (). +The +.BR XpmCreatePixmapFromData () +function creates X images using +.BR XpmCreateImageFromData (__libmansuffix__) +and thus returns the same errors. +In addition on success it then creates the related pixmaps, using +.BR XPutImage (__libmansuffix__), +which are returned to +.I pixmap_return +and +.I shapemask_return +if not NULL, and finally destroys the created images using +.BR XDestroyImage (__libmansuffix__). +Do not forget to free the returned pixmaps, the colors, and possibly the data +returned into the XpmAttributes structure when done. .SS XpmCreatePixmapFromBuffer -To create a Pixmap from an XPM buffer, use XpmCreatePixmapFromBuffer. -The XpmCreatePixmapFromBuffer function works the same way as XpmReadFileToPixmap (), -it just calls XpmCreateImageFromBuffer instead of XpmReadFileToImage. +.PP +To create a Pixmap from an XPM buffer, use +.BR XpmCreatePixmapFromBuffer (). +The +.BR XpmCreatePixmapFromBuffer () +function works the same way as +.BR XpmReadFileToPixmap (__libmansuffix__), +it just calls +.BR XpmCreateImageFromBuffer (__libmansuffix__) +instead of +.BR XpmReadFileToImage (__libmansuffix__). .SS XpmCreatePixmapFromXpmImage -XpmCreatePixmapFromXpmImage creates X images calling XpmCreateImageFromXpmImage () with -the given XpmImage and XpmAttributes, then it creates the related pixmaps which are returned topixmap_return -and shapemask_return using XPutImage. -Finally it destroys the X images with XDestroyImage. -When finished the caller must free the pixmaps using XFreePixmap, the colors using XFreeColors or the application -equivalent function when the standard Xlib functions are not used, and possibly the data returned into the -XpmAttributes using XpmFreeAttributes. +.PP +.BR XpmCreatePixmapFromXpmImage () +creates X images calling +.BR XpmCreateImageFromXpmImage (__libmansuffix__) +with the given XpmImage and XpmAttributes, then it creates the related pixmaps +which are returned to +.I pixmap_return +and +.I shapemask_return +using +.BR XPutImage (__libmansuffix__). +Finally it destroys the X images with +.BR XDestroyImage (__libmansuffix__). +When finished the caller must free the pixmaps using +.BR XFreePixmap (__libmansuffix__), +the colors using +.BR XFreeColors (__libmansuffix__) +or the application equivalent function when the standard Xlib functions are not +used, and possibly the data returned into the XpmAttributes using +.BR XpmFreeAttributes (__libmansuffix__). .SH "SEE ALSO" -.BR XpmCreatePixmapFromBuffer(__libmansuffix__) , -.BR XpmCreatePixmapFromData(__libmansuffix__) , -.BR XpmCreatePixmapFromXpmImage(__libmansuffix__) +.ad l +.nh +.BR XpmCreateImageFromData (__libmansuffix__), +.BR XpmCreateImageFromXpmImage (__libmansuffix__), +.BR XpmFreeAttributes (__libmansuffix__), +.BR XpmReadFileToPixmap (__libmansuffix__) + diff --git a/lib/libXpm/man/XpmCreateXpmImage.man b/lib/libXpm/man/XpmCreateXpmImage.man index 6be7cd0f2..93147f550 100644 --- a/lib/libXpm/man/XpmCreateXpmImage.man +++ b/lib/libXpm/man/XpmCreateXpmImage.man @@ -26,15 +26,22 @@ .SH NAME XpmCreateXpmImage \- create an Xpm image .SH SYNOPSIS - +.nf .HP -int XpmCreateXpmImageFromData(char **data, XpmImage *image, XpmInfo *info); +.BI "int XpmCreateXpmImageFromData(char **" data ", XpmImage *" image , +.BI "XpmInfo *" info ); .HP -int XpmCreateXpmImageFromBuffer(char *buffer, XpmImage *image, XpmInfo *info); +.BI "int XpmCreateXpmImageFromBuffer(char *" buffer ", XpmImage *" image , +.BI "XpmInfo *" info ); .HP -int XpmCreateXpmImageFromImage(Display *display, XImage *image, XImage *shapeimage, XpmImage *xpmimage, XpmAttributes *attributes); +.BI "int XpmCreateXpmImageFromImage(Display *" display , +.BI "XImage *" image ", XImage *" shapeimage , +.BI "XpmImage *" xpmimage ", XpmAttributes *" attributes ); .HP -int XpmCreateXpmImageFromPixmap(Display *display, Pixmap *pixmap, Pixmap *shapemask, XpmImage *xpmimage, XpmAttributes *attributes); +.BI "int XpmCreateXpmImageFromPixmap(Display *" display , +.BI "Pixmap *" pixmap ", Pixmap *" shapemask , +.BI "XpmImage *" xpmimage ", XpmAttributes *" attributes ); +.fi .SH ARGUMENTS @@ -47,61 +54,96 @@ Specifies the location of an XpmInfo structure to get and store information (or .IP \fIdisplay\fP li Specifies the connection to the X server. .IP \fIimage\fP li -Specifies the image which is created. +Specifies the X image used as the source. .IP \fIshapeimage\fP li -Specifies the shape mask image which is created if any. +Specifies the shape mask image, if any. .IP \fIxpmimage\fP li -Specifies the location of an XpmImage structure. +Specifies the XPM image which is created. .IP \fIattributes\fP li Specifies the location of a structure containing information (or NULL). .SH DESCRIPTION .SS XpmCreateXpmImageFromBuffer -To create an XpmImage from an XPM buffer, use XpmCreateXpmImageFromBuffer. -The XpmCreateXpmImageFromBuffer function reads the given buffer to fill in the given XpmImage structure. -If the buffer does not contain valid XPM data, it returns XpmFileInvalid. -If insufficient working storage is allocated, it returns XpmNoMemory, and returns XpmSuccess on success. -If the passed XpmInfo structure pointer is not NULL, XpmCreateXpmImageFromBuffer looks for the following attributes: -XpmReturnComments and XpmReturnExtensions, and sets possibly the XpmHotspot attribute when returning. +.PP +To create an XpmImage from an XPM buffer, use +.BR XpmCreateXpmImageFromBuffer (). +The +.BR XpmCreateXpmImageFromBuffer () +function reads the given buffer to fill in the given XpmImage structure. +If the buffer does not contain valid XPM data, it returns +.BR XpmFileInvalid . +If insufficient working storage is allocated, it returns +.BR XpmNoMemory . +On success it returns +.BR XpmSuccess . +If the passed XpmInfo structure pointer is not NULL, +.BR XpmCreateXpmImageFromBuffer () +looks for the following attributes: XpmReturnComments and XpmReturnExtensions, +and sets possibly the XpmHotspot attribute when returning. As specified in the table (page 28), if the data related to the attributes XpmReturnComments and XpmReturnExtensions cannot be returned as requested because of insufficient memory storage, -XpmCreateXpmImageFromBuffer will change the valuemask to mention this and will try to continue. +.BR XpmCreateXpmImageFromBuffer () +will change the valuemask to mention this and will try to continue. So the caller should check on this before accessing requested data. - -Note: The valuemask of the passed XpmInfo structure must be set to some valid value, -at least zero, otherwise unpredictable errors can occur. +.PP +Note: The valuemask of the passed XpmInfo structure must be set to some valid +value, at least zero, otherwise unpredictable errors can occur. .SS XpmCreateXpmImageFromData -To create an XpmImage from an XPM data, use XpmCreateXpmImageFromData. -XpmCreateXpmImageFromData fills in the given XpmImage structure from the given data. If the data does not -contain validXPM data, it returns XpmFileInvalid. If insufficient working storage is allocated, it returns -XpmNoMemory, on success it returns XpmSuccess. -If the passed XpmInfo structure pointer is not NULL, XpmCreateXpmImageFromData looks for the following attributes: +.PP +To create an XpmImage from an XPM data, use +.BR XpmCreateXpmImageFromData (). +.BR XpmCreateXpmImageFromData () +fills in the given XpmImage structure from the given data. If the data does not +contain valid XPM data, it returns +.BR XpmFileInvalid . +If insufficient working storage is allocated, it returns +.BR XpmNoMemory . +On success it returns +.BR XpmSuccess. +If the passed XpmInfo structure pointer is not NULL, +.BR XpmCreateXpmImageFromData () +looks for the following attributes: XpmReturnExtensions, and sets possibly the XpmHotspot attribute when returning. As specified in the table (page 28), if the data related to the attribute XpmReturnExtensions cannot be returned as requested because of -insufficient memory storage, XpmCreateXpmImageFromData will change the valuemask to mention this and will -try to continue. +insufficient memory storage, +.BR XpmCreateXpmImageFromData () +will change the valuemask to mention this and will try to continue. So the caller should check on this before accessing requested data. - -Note: The valuemask of the passed XpmInfo structure must be set to some valid value, at least zero, -otherwise unpredictable errors can occur. +.PP +Note: The valuemask of the passed XpmInfo structure must be set to some valid +value, at least zero, otherwise unpredictable errors can occur. .SS XpmCreateXpmImageFromImage -To create an XpmImage from an XImage, use XpmCreateXpmImageFromImage. -From the given X images and XpmAttributes if not NULL, XpmCreateXpmImageFromImage creates an -XpmImage following the same mechanism as XpmWriteFileFromImage. +.PP +To create an XpmImage from an XImage, use +.BR XpmCreateXpmImageFromImage (). +From the given X images and XpmAttributes if not NULL, +.BR XpmCreateXpmImageFromImage () +creates an XpmImage following the same mechanism as +.BR XpmWriteFileFromImage (__libmansuffix__). .SS XpmCreateXpmImageFromPixmap -To create an XpmImage from a Pixmap, use XpmCreateXpmImageFromPixmap. -From the given pixmaps and XpmAttributes if not NULL, XpmCreateXpmImageFromPixmap gets the related XImages -by calling XGetImage, then it gives them to XpmCreateXpmImageFromImage() to create an -XpmImage which is returned to xpmimage. -Finally it destroys the created X images using XDestroyImage. +.PP +To create an XpmImage from a Pixmap, use +.BR XpmCreateXpmImageFromPixmap (). +From the given pixmaps and XpmAttributes if not NULL, +.BR XpmCreateXpmImageFromPixmap () +gets the related XImages by calling XGetImage, then it gives them to +.BR XpmCreateXpmImageFromImage () +to create an XpmImage which is returned to +.IR xpmimage . +Finally it destroys the created X images using +.BR XDestroyImage (__libmansuffix__). .SH "SEE ALSO" -.BR XpmCreateXpmImageFromBuffer(__libmansuffix__) , -.BR XpmCreateXpmImageFromData(__libmansuffix__) , -.BR XpmCreateXpmImageFromImage(__libmansuffix__) , -.BR XpmCreateXpmImageFromPixmap(__libmansuffix__) +.ad l +.nh +.BR XpmFreeXpmImage (__libmansuffix__), +.BR XpmReadFileToBuffer (__libmansuffix__), +.BR XpmReadFileToData (__libmansuffix__), +.BR XpmReadFileToImage (__libmansuffix__), +.BR XpmReadFileToPixmap (__libmansuffix__), +.BR XpmWriteFileFromImage (__libmansuffix__) diff --git a/lib/libXpm/man/XpmMisc.man b/lib/libXpm/man/XpmMisc.man index f8cfc93cb..769a9b840 100644 --- a/lib/libXpm/man/XpmMisc.man +++ b/lib/libXpm/man/XpmMisc.man @@ -26,24 +26,24 @@ .SH NAME XpmMisc \- xpm misc functions to free used memory and handle errors .SH SYNOPSIS - +.nf .HP -int XpmFreeXpmImage(XpmImage *image); +.BI "int XpmFreeXpmImage(XpmImage *" image ); .HP -int XpmFreeXpmInfo(XpmInfo *info); +.BI "int XpmFreeXpmInfo(XpmInfo *" info ); .HP -int XpmFreeAttributes(XpmAttributes *attributes); +.BI "int XpmFreeAttributes(XpmAttributes *" attributes ); .HP -int XpmAttributesSize(); +.B "int XpmAttributesSize(void);" .HP -int XpmFreeExtensions(XpmExtension *extensions, int nextensions); +.BI "int XpmFreeExtensions(XpmExtension *" extensions ", int " nextensions ); .HP -int XpmFree(char *ptr); +.BI "int XpmFree(char *" ptr ); .HP -char *XpmGetErrorString(int errorcode); +.BI "char *XpmGetErrorString(int " errorcode ); .HP -int XpmLibraryVersion(); - +.B "int XpmLibraryVersion(void);" +.fi .SH ARGUMENTS .IP \fIimage\fP li @@ -62,46 +62,91 @@ Specifies the number of extensions Specifies the structure to free .SH DESCRIPTION +.PP +To free possible data stored into an XpmImage structure use +.BR XpmFreeXpmImage (). +The +.BR XpmFreeXpmImage () +function frees the structure members which are not NULL, +but not the structure itself. +.PP +To free possible data stored into an XpmInfo structure use +.BR XpmFreeXpmInfo(). +.PP +To free data possibly stored into an array of XpmExtension use +.BR XpmFreeExtensions (). +.PP +To free any data allocated by an XPM function use the +.BR XpmFree () +function. +The current distribution of the XPM library uses the standard memory allocation +functions and thus +.BR XpmFree () +is nothing else than a define to the standard +.BR free (__libmansuffix__). +However since these functions may be redefined in specific environments +it is wise to use +.BR XpmFree () +.PP +To free possible data stored into an XpmAttributes structure use +.BR XpmFreeAttributes (). +The +.BR XpmFreeAttributes () +function frees the structure members which have been malloc’ed +such as the pixels list. +.PP +To dynamically allocate an XpmAttributes structure use the +.BR XpmAttributesSize () +function. +The +.BR XpmAttributesSize () +function provides applications using dynamic libraries with a safe way to +allocate and then refer to an XpmAttributes structure, disregarding whether +the XpmAttributes structure size has changed or not since compiled. +.PP +To get data when building an error message, one can use +.BR XpmGetErrorString (). +.BR XpmGetErrorString () +returns a string related to the given XPM error code. +.PP +The +.BR XpmLibraryVersion () +function can be used when one needs to figure out which version of the library +is in use. +The value returned by +.BR XpmLibraryVersion () +can be compared to the value of +.B XpmIncludeVersion +which is defined in the header file "xpm.h". +These numbers are computed with the following formula: -To free possible data stored into an XpmImage structure use XpmFreeXpmImage. -The XpmFreeXpmImage function frees the structure members which are not NULL, but not the structure itself. -To free possible data stored into an XpmInfo structure use XpmFreeXpmInfo. - -To free data possibly stored into an array of XpmExtension use XpmFreeExtensions. - -To free any data allocated by an XPM function use the XpmFree function. -The current distribution of the XPM library uses the standard memory allocation functions and thus -XpmFree is nothing else than a define to the standard free. -However since these functions may be redefined in specific environments it is wise to use XpmFree. - -To free possible data stored into an XpmAttributes structure use XpmFreeAttributes. -The XpmFreeAttributes function frees the structure members which have been malloc’ed such as the pixels list. - -To dynamically allocate an XpmAttributes structure use the XpmAttributesSize function. -The XpmAttributesSize function provides application using dynamic libraries with a safe way to allocate and then -refer to an XpmAttributes structure, disregarding whether the XpmAttributes structure size has changed or not since -compiled. -To get data when building an error message, one can use XpmGetErrorString. -XpmGetErrorString returns a string related to the given XPM error code. - -The XpmLibraryVersion function can be used when one needs to figure out which version of the library is in use. -The value returned by XpmLibraryVersion can be compared to the value of XpmIncludeVersion which is defined -in the header file "xpm.h". These numbers are computed with the following formula: .nf (XpmFormat * 100 + XpmVersion) * 100 + XpmRevision .fi -Where XpmFormat is the version number of the format, XpmVersion is the library version number (which changes -only if the API changes), and XpmRevision is the library minor version number. -The XpmFreeExtensions function frees all data stored in every extension and the array itself. -Note that XpmFreeAttributes call this function and thus most of the time it should not need to be explicitly called. +where +.B XpmFormat +is the version number of the format, +.B XpmVersion +is the library version number (which changes only if the API changes), and +.B XpmRevision +is the library minor version number. +.PP +The +.BR XpmFreeExtensions () +function frees all data stored in every extension and the array itself. +Note that +.BR XpmFreeAttributes () +calls this function and thus most of the time it should not need to be +explicitly called. .SH "SEE ALSO" -.BR XpmLibraryVersion(__libmansuffix__) , -.BR XpmGetErrorString(__libmansuffix__) , -.BR XpmFree(__libmansuffix__) , -.BR XpmFreeExtensions(__libmansuffix__) , -.BR XpmAttributesSize(__libmansuffix__) , -.BR XpmFreeAttributes(__libmansuffix__) , -.BR XpmFreeXpmImage(__libmansuffix__) , -.BR XpmFreeXpmInfo(__libmansuffix__) +.ad l +.nh +.BR XpmCreateBuffer (__libmansuffix__), +.BR XpmCreateData (__libmansuffix__), +.BR XpmCreateImage (__libmansuffix__), +.BR XpmCreatePixmap (__libmansuffix__), +.BR XpmCreateXpmImage (__libmansuffix__), +.BR XpmRead (__libmansuffix__), +.BR XpmWrite (__libmansuffix__) diff --git a/lib/libXpm/man/XpmRead.man b/lib/libXpm/man/XpmRead.man index 49b08443f..5843bd7bb 100644 --- a/lib/libXpm/man/XpmRead.man +++ b/lib/libXpm/man/XpmRead.man @@ -27,16 +27,23 @@ XpmRead \- read an XPM file .SH SYNOPSIS +.nf .HP -int XpmReadFileToImage(Display *display, char *filename, XImage **image_return, XImage **shapeimage_return, XpmAttributes *attributes); +.BI "int XpmReadFileToImage(Display *" display ", char *" filename , +.BI "XImage **" image_return ", XImage **" shapeimage_return , +.BI "XpmAttributes *" attributes ); .HP -int XpmReadFileToPixmap(Display *display, Drawable d, char *filename, Pixmap *pixmap_return, Pixmap *shapemask_return, XpmAttributes *attributes); +.BI "int XpmReadFileToPixmap(Display *" display ", Drawable " d ", char *" filename , +.BI "Pixmap *" pixmap_return ", Pixmap *" shapemask_return , +.BI "XpmAttributes *" attributes ); .HP -int XpmReadFileToXpmImage(char *filename, XpmImage *image, XpmInfo *info); +.BI "int XpmReadFileToXpmImage(char *" filename ", XpmImage *" image , +.BI "XpmInfo *" info ); .HP -int XpmReadFileToBuffer(char *filename, char **buffer_return); +.BI "int XpmReadFileToBuffer(char *" filename ", char **" buffer_return ); .HP -int XpmReadFileToData(char *filename, char ***data_return); +.BI "int XpmReadFileToData(char *" filename ", char ***" data_return ); +.fi .SH ARGUMENTS .IP \fIdisplay\fP li @@ -60,103 +67,209 @@ Specifies the location of a structure to store possible information (or NULL). .SH DESCRIPTION .SS XpmReadFileToImage -The XpmReadFileToImage function reads in a file in the XPM format. -If the file cannot be opened it returns XpmOpenFailed. -If the file can be opened but does not contain valid XPM data, it returns XpmFileInvalid. -If insufficient working storage is allocated, it returns XpmNoMemory. -If the passed XpmAttributes structure pointer is not NULL, XpmReadFileToImage looks for the following attributes: +.PP +The +.BR XpmReadFileToImage () +function reads in a file in the XPM format. +If the file cannot be opened it returns +.BR XpmOpenFailed . +If the file can be opened but does not contain valid XPM data, it returns +.BR XpmFileInvalid . +If insufficient working storage is allocated, it returns +.BR XpmNoMemory . +If the passed XpmAttributes structure pointer is not NULL, +.BR XpmReadFileToImage () +looks for the following attributes: XpmVisual, XpmColormap, XpmDepth, XpmColorSymbols, XpmExactColors, XpmCloseness, -XpmRGBCloseness, XpmAllocCloseColors ,XpmReturnPixels, XpmReturnAllocPixels, XpmAllocColor, +XpmRGBCloseness, XpmAllocCloseColors, XpmReturnPixels, XpmReturnAllocPixels, XpmAllocColor, XpmFreeColors, XpmColorClosure, XpmReturnExtensions, XpmReturnColorTable, XpmBitmapFormat, sets the XpmSize, the XpmCharsPerPixel, and possibly the XpmHotspot attributes when returning. -As a backward compatibility feature, XpmReadFileToImage also looks for the XpmReturnInfos attributes. -As specified in the table (page 12), if the data related to the attributes XpmReturnExtensions, -XpmReturnColorTable, and XpmReturnInfos cannot be returned as requested because of insufficient -memory storage, XpmReadFileToImage will change the valuemask to -mention this and will try to continue. +As a backward compatibility feature, +.BR XpmReadFileToImage () +also looks for the XpmReturnInfos attributes. +As specified in the table (page 12), if the data related to the attributes +XpmReturnExtensions, XpmReturnColorTable, and XpmReturnInfos +cannot be returned as requested because of insufficient memory storage, +.BR XpmReadFileToImage () +will change the valuemask to mention this and will try to continue. So the caller should check on this before accessing this data. - -Note: The valuemask of the passed XpmAttributes must be set to some valid value, at least zero, otherwise -unpredictable errors can occur. -XpmReadFileToImage allocates colors, as read from the file or possibly overridden as specified in the -XpmColorSymbols attributes. -The colors are allocated using the color settings for the visual specified by the XpmColorKey -attribute, which has the value XPM_MONO, XPM_GRAY4, XPM_GRAY,or XPM_COLOR. -If the XpmColor-Key attribute is not set it is determined by examining the type of visual. -If no default value exists for the specified visual, it first looks for other defaults nearer to the monochrome visual type +.PP +Note: The valuemask of the passed XpmAttributes must be set to some valid value, +at least zero, otherwise unpredictable errors can occur. +.PP +.BR XpmReadFileToImage () +allocates colors, as read from the file or possibly overridden as specified in +the XpmColorSymbols attributes. +The colors are allocated using the color settings for the visual specified by +the XpmColorKey +attribute, which has the value XPM_MONO, XPM_GRAY4, XPM_GRAY, or XPM_COLOR. +If the XpmColorKey attribute is not set it is determined by examining the type +of visual. +If no default value exists for the specified visual, it first looks for +other defaults nearer to the monochrome visual type and secondly nearer to the color visual type. If the color which is found is not valid (cannot be parsed), it looks for another default one according to the same algorithm. -If allocating a color fails, and the closeness attribute is set, it tries to find a color already in the colormap that is closest +If allocating a color fails, and the closeness attribute is set, it tries to +find a color already in the colormap that is closest to the desired color, and uses that. -If the alloc_close_colors attribute is set to False, the found close color is not allocated but it is used anyway. -This is especially useful for applications which use a private colormap containing read/write cells and have -complete control over the colormap. -On the other hand, since in such a case there is no guarantee that the color pixel will not change any time, +If the alloc_close_colors attribute is set to False, the found close color is +not allocated but it is used anyway. +This is especially useful for applications which use a private colormap +containing read/write cells and have complete control over the colormap. +On the other hand, since in such a case there is no guarantee that the color +pixel will not change any time, this should be avoided when using the default colormap. -If no color can be found that is within closeness of the Red, Green and Blue components of the desired color, +If no color can be found that is within closeness of the Red, Green, and Blue +components of the desired color, it reverts to trying other default values as explained above. For finer control over the closeness requirements of a particular icon, -the red_closeness, green_closeness, and blue_closeness attributes may be used instead of the more general -closeness attribute. - -The RGB components are integers within the range 0 (black) to 65535 (white). A closeness of less than 10000, -for example, will cause only quite close colors to be matched, while a closeness of more than 50000 will +the red_closeness, green_closeness, and blue_closeness attributes may be +used instead of the more general closeness attribute. +.PP +The RGB components are integers within the range 0 (black) to 65535 (white). +A closeness of less than 10000, for example, will cause only quite close colors +to be matched, while a closeness of more than 50000 will allow quite dissimilar colors to match. -Specifying a closeness of more than 65535 will allow any color to match, thus forcing the icon -to be drawn in color no matter how bad the colormap is. +Specifying a closeness of more than 65535 will allow any color to match, +thus forcing the icon to be drawn in color no matter how bad the colormap is. The value 40000 seems to be about right for many situations -requiring reasonable but not perfect matches. With this setting the color must only be within the same general area of +requiring reasonable but not perfect matches. +With this setting the color must only be within the same general area of the RGB cube as the desired color. -If the exactColors attribute is set it then returns XpmColorError, otherwise it creates the images and returns XpmSuccess. -If no color is found, and no close color exists or is wanted, and all visuals have been exhausted, -XpmColorFailed is returned. - -XpmReadFileToImage returns the created image to image_return if not NULL and possibly the -created shapemask to shapeimage_return if not NULL and the color None is used. -If required it stores into the XpmAttributes structure the list of the used pixels. -When the image depth is one, the image format is either as specified by the bitmap_format attribute if set or ZPixmap. +If the exactColors attribute is set it then returns +.BR XpmColorError , +otherwise it creates the images and returns +.BR XpmSuccess . +If no color is found, and no close color exists or is wanted, +and all visuals have been exhausted, +.B XpmColorFailed +is returned. +.PP +.BR XpmReadFileToImage () +returns the created image to +.I image_return +if not NULL and possibly the created shapemask to +.I shapeimage_return +if not NULL and the color None is used. +If required it stores into the XpmAttributes structure the list of the +used pixels. +When the image depth is one, the image format is either as specified by +the bitmap_format attribute if set or ZPixmap. When the depth is different from one the image format is always ZPixmap. -When finished the caller must free the images using XDestroyImage, the allocated colors using -XFreeColors or the application equivalent function when the standard Xlib functions are not used, -and possibly the data returned into the XpmAttributes using XpmFreeAttributes (page 25). -In addition, on systems which support such features XpmReadFileToImage deals with compressed files by forking -an uncompress or gzip process and reading from the piped result. It assumes that the specified file is +When finished the caller must free the images using +.BR XDestroyImage (__libmansuffix__), +the allocated colors using +.BR XFreeColors (__libmansuffix__) +or the application equivalent function +when the standard Xlib functions are not used, +and possibly the data returned into the XpmAttributes using +.BR XpmFreeAttributes (__libmansuffix__). +In addition, on systems which support such features +.BR XpmReadFileToImage () +deals with compressed files by forking an uncompress or gzip process and +reading from the piped result. It assumes that the specified file is compressed if the given file name ends by ’.Z’ or ’.gz’. -In case the file name does not end so, XpmReadFileToImage looks for the given file name assuming it is not a compressed file. -And if instead of a file name NULL is passed to XpmReadFileToImage, it reads from the standard input. +In case the file name does not end so, +.BR XpmReadFileToImage () +looks for the given file name assuming it is not a compressed file. +And if instead of a file name NULL is passed to +.BR XpmReadFileToImage (), +it reads from the standard input. .SS XpmReadFileToPixmap -The XpmReadFileToPixmap function creates X images using XpmReadFileToImage and thus returns the same errors. -In addition on success it then creates the related pixmaps, using XPutImage, -which are returned to pixmap_return and shapemask_return if not NULL, and finally destroys the created images using XDestroyImage. -When finished the caller must free the pixmaps using XFreePixmap, the allocated colors using XFreeColors or the -application equivalent function when the standard Xlib functions are not used, and possibly the data returned into the -XpmAttributes using XpmFreeAttributes. +The +.BR XpmReadFileToPixmap () +function creates X images using +.BR XpmReadFileToImage () +and thus returns the same errors. +In addition on success it then creates the related pixmaps, using +.BR XPutImage (__libmansuffix__), +which are returned to +.I pixmap_return +and +.I shapemask_return +if not NULL, and finally destroys the created images using +.BR XDestroyImage (__libmansuffix__). +When finished the caller must free the pixmaps using +.BR XFreePixmap (__libmansuffix__), +the allocated colors using +.BR XFreeColors (__libmansuffix__) +or the application equivalent function when the standard Xlib functions +are not used, and possibly the data returned into the XpmAttributes using +.BR XpmFreeAttributes (__libmansuffix__). .SS XpmReadFileToBuffer -XpmReadFileToBuffer allocates and fills a buffer from a file. -XpmReadFileToBuffer returns XpmOpenFailed if it cannot open the file, returns XpmNoMemory if insufficient -working storage is allocated, and XpmSuccess otherwise. The allocated buffer returned by XpmReadFileToBuffer -should be freed with XpmFree when done. +.PP +.BR XpmReadFileToBuffer () +allocates and fills a buffer from a file. +.BR XpmReadFileToBuffer () +returns +.B XpmOpenFailed +if it cannot open the file, returns +.B XpmNoMemory +if insufficient working storage is allocated, and +.B XpmSuccess +otherwise. The allocated buffer returned by +.BR XpmReadFileToBuffer () +should be freed with +.BR XpmFree (__libmansuffix__) +when done. +.PP +As a convenience, the +.BR XpmReadFileToBuffer () +and +.BR XpmWriteFileFromBuffer (__libmansuffix__) +are provided to copy a file to a buffer and to write a file from a buffer. +Thus for instance one may decide to use +.BR XpmReadFileToBuffer (), +.BR XpmCreatePixmapFromBuffer (__libmansuffix__), +and +.BR XpmFree (__libmansuffix__) +instead of +.BR XpmReadFileToPixmap (). +On some systems this may lead to a performance improvement, +since the parsing will be performed in memory, but it uses more memory. .SS XpmReadFileToData -XpmReadFileToData returns XpmOpenFailed if it cannot open the file, -XpmNoMemory if insufficient working storage is allocated, -XpmFileInvalid if this is not a validXPM file, and XpmSuccess otherwise. -The allocated data returned by XpmReadFileToData should be freed with XpmFree when done. +.PP +.BR XpmReadFileToData () +returns +.B XpmOpenFailed +if it cannot open the file, +.B XpmNoMemory +if insufficient working storage is allocated, +.B XpmFileInvalid +if this is not a valid XPM file, and +.B XpmSuccess +otherwise. +The allocated data returned by +.BR XpmReadFileToData () +should be freed with +.BR XpmFree (__libmansuffix__) +when done. .SS XpmReadFileToXpmImage -The XpmReadFileToXpmImage function reads in a file in the XPM format. -If the file cannot be opened it returns XpmOpenFailed. -If the file can be opened but does not contain valid XPMdata, -it returns XpmFileInvalid. -If insufficient working storage is allocated, it returns XpmNoMemory. -On success it fills in the given XpmImage structure and returns XpmSuccess. +.PP +The +.BR XpmReadFileToXpmImage () +function reads in a file in the XPM format. +If the file cannot be opened it returns +.BR XpmOpenFailed . +If the file can be opened but does not contain valid XPM data, it returns +.BR XpmFileInvalid . +If insufficient working storage is allocated, it returns +.BR XpmNoMemory . +On success it fills in the given XpmImage structure and returns +.BR XpmSuccess . .SH "SEE ALSO" -.BR XpmReadFileToImage(__libmansuffix__) , -.BR XpmReadFileToPixmap(__libmansuffix__) , -.BR XpmReadFileToBuffer(__libmansuffix__) , -.BR XpmReadFileToData(__libmansuffix__) -.BR XpmReadFileToXpmImage(__libmansuffix__) +.ad l +.nh +.BR XpmCreateBuffer (__libmansuffix__), +.BR XpmCreateData (__libmansuffix__), +.BR XpmCreateImage (__libmansuffix__), +.BR XpmCreatePixmap (__libmansuffix__), +.BR XpmCreateXpmImage (__libmansuffix__), +.BR XpmFreeAttributes (__libmansuffix__), +.BR XpmWrite (__libmansuffix__) diff --git a/lib/libXpm/man/XpmWrite.man b/lib/libXpm/man/XpmWrite.man index cba91c169..9d2ff95de 100644 --- a/lib/libXpm/man/XpmWrite.man +++ b/lib/libXpm/man/XpmWrite.man @@ -27,19 +27,23 @@ XpmWrite \- write an XPM file .SH SYNOPSIS +.nf .HP -int XpmWriteFileFromPixmap(Display *display, char *filename, Pixmap pixmap, Pixmap shapemask, XpmAttributes *attributes); +.BI "int XpmWriteFileFromPixmap(Display *" display ", char *" filename , +.BI "Pixmap " pixmap ", Pixmap " shapemask ", XpmAttributes *" attributes ); .HP -int XpmWriteFileFromImage(Display *display, char *filename, XImage *image, XImage *shapeimage, XpmAttributes *attributes); +.BI "int XpmWriteFileFromImage(Display *" display " , char *" filename , +.BI "XImage *"image ", XImage *" shapeimage ", XpmAttributes *" attributes ); .HP -int XpmWriteFileFromData(char *filename, char **data); +.BI "int XpmWriteFileFromData(char *" filename ", char **" data ); .HP -int XpmWriteFileFromXpmImage(char *filename, XpmImage *image, XImage *shapeimage, XpmInfo *info); +.BI "int XpmWriteFileFromXpmImage(char *" filename ", XpmImage *" image , +.BI "XImage *" shapeimage ", XpmInfo *" info ); .HP -int XpmWriteFileFromBuffer(char *filename, char *buffer); +.BI "int XpmWriteFileFromBuffer(char *" filename ", char *" buffer ); +.fi .SH ARGUMENTS - .IP \fIdisplay\fP li Specifies the connection to the X server. .IP \fIfilename\fP li @@ -61,67 +65,132 @@ Specifies the buffer to read. .SH DESCRIPTION .SS XpmWriteFileFromImage - -The XpmWriteFileFromImage function writes an image and its possible shapeimage out to a file in the XPM format. -If the file cannot be opened, it returns XpmOpenFailed. -If insufficient working storage is allocated, it returns XpmNoMemory. -If no error occurs then it returns XpmSuccess. +.PP +The +.BR XpmWriteFileFromImage () +function writes an +.I image and its possible +.I shapeimage +out to a file in the XPM format. +If the file cannot be opened, it returns +.BR XpmOpenFailed . +If insufficient working storage is allocated, it returns +.BR XpmNoMemory . +If no error occurs then it returns +.BR XpmSuccess . If the passed XpmAttributes structure pointer is not NULL, -XpmWriteFileFromImage looks for the following attributes: +.BR XpmWriteFileFromImage () +looks for the following attributes: XpmColormap, XpmHotspot, XpmCharsPerPixel, XpmRgbFilename, and XpmExtensions. -As a backward compatibility feature, XpmWriteFileFromImage also looks for the XpmInfos attributes. -If the filename contains an extension such as “.xpm”, in order to get a valid C variable name, the dot character is +As a backward compatibility feature, +.BR XpmWriteFileFromImage () +also looks for the XpmInfos attributes. +If the filename contains an extension such as “.xpm”, in order to get a valid C +variable name, the dot character is replaced by an underscore ’_’ when writing out. As a backward compatibility feature, if the XpmInfos attributes are defined it writes out possible stored information such as comments, color defaults and symbol. -Finally, if the XpmRgbFilenameattribute is defined, XpmWriteFileFromImage searches for color names in +Finally, if the XpmRgbFilenameattribute is defined, +.BR XpmWriteFileFromImage () +searches for color names in this file and if found writes them out instead of the rgb values. - -In addition on systems which support such features if the given file name ends by ’.Z’ or ’.gz’ -it is assumed to be a compressed file. Then, XpmWriteFileFromImage writes to a pipedcompress or gzip process. -And if instead of a file name NULL is passed to XpmWriteFileFromImage, it writes to the standard output. +.PP +In addition on systems which support such features if the given file name ends +by ’.Z’ or ’.gz’ it is assumed to be a compressed file. Then, +.BR XpmWriteFileFromImage () +writes to a piped compress or gzip process. +And if instead of a file name, NULL is passed to +.BR XpmWriteFileFromImage (), +it writes to the standard output. .SS XpmWriteFileFromPixmap -To write out a Pixmap to an XPM file, use XpmWriteFileFromPixmap. - +.PP +To write out a Pixmap to an XPM file, use +.BR XpmWriteFileFromPixmap (). +.PP If the passed XpmAttributes structure pointer is not NULL, -XpmWriteFileFromPixmap looks for the following attributes: XpmSize. +.BR XpmWriteFileFromPixmap () +looks for the following attributes: XpmSize. If they are not defined it performs an XGetGeometry operation. -Then it uses XGetImage to get from the given pixmaps the related X images which are passed to XpmWriteFileFromImage. -Finally XpmWriteFileFromPixmap destroys the created images using XDestroyImage. -The XpmWriteFileFromPixmap function returns the same errors as XpmWriteFileFromImage. +Then it uses XGetImage to get from the given pixmaps the related X images which are passed to +.BR XpmWriteFileFromImage (). +Finally +.BR XpmWriteFileFromPixmap () +destroys the created images using XDestroyImage. +The +.BR XpmWriteFileFromPixmap () +function returns the same errors as +.BR XpmWriteFileFromImage (). .SS XpmWriteFileFromData -XpmWriteFileFromData writes an XPM data array to an XPM file. - -XpmWriteFileToData returns XpmOpenFailed if it cannot open the file, -XpmFileInvalid if this is not a valid XPM data, and XpmSuccess otherwise. +.PP +.BR XpmWriteFileFromData () +writes an XPM data array to an XPM file. +.PP +.BR XpmWriteFileToData () +returns +.B XpmOpenFailed +if it cannot open the file, +.B XpmFileInvalid +if this is not a valid XPM data, and +.B XpmSuccess +otherwise. .SS XpmWriteFileFromXpmImage -To write out an XpmImage to an XPM file, use XpmWriteFileFromXpmImage. -The XpmWriteFileFromXpmImage function writes an image out to a file in the XPM format. -If the file cannot be opened, it returns XpmOpenFailed. -If insufficient working storage is allocated, it returns XpmNoMemory. -If no error occurs then it returns XpmSuccess. -If the passed XpmInfo structure pointer is not NULL, XpmWriteFileFromXpmImage looks for the following attributes: -XpmComments, XpmExtensions, and XpmHotspot, and writes the related information out as well. -In addition on systems which support such features if the given file name ends by ’.Z’ or ’.gz’ it is assumed to be a -compressed file. Then, XpmWriteFileFromXpmImage writes to a piped compress or gzip process. And if instead -of a file name NULL is passed to XpmWriteFileFromXpmImage, it writes to the standard output. +.PP +To write out an XpmImage to an XPM file, use +.BR XpmWriteFileFromXpmImage (). +The +.BR XpmWriteFileFromXpmImage () +function writes an image out to a file in the XPM format. +If the file cannot be opened, it returns +.BR XpmOpenFailed . +If insufficient working storage is allocated, it returns +.BR XpmNoMemory . +If no error occurs then it returns +.BR XpmSuccess . +If the passed XpmInfo structure pointer is not NULL, +.BR XpmWriteFileFromXpmImage() +looks for the following attributes: +XpmComments, XpmExtensions, and XpmHotspot, +and writes the related information out as well. +In addition on systems which support such features if the given file name ends +by ’.Z’ or ’.gz’ it is assumed to be a compressed file. Then, +.BR XpmWriteFileFromXpmImage () +writes to a piped compress or gzip process. +And if instead of a file name, NULL is passed to +.BR XpmWriteFileFromXpmImage (), +it writes to the standard output. .SS XpmWriteFileFromBuffer -XpmWriteFileFromBuffer writes a XPM-buffer to a file. -XpmWriteFileFromBuffer returns XpmOpenFailed if it cannot open the file, and XpmSuccess otherwise. - -As a convenience, the XpmReadFileToBuffer and XpmWriteFileFromBuffer are provided to copy a -file to a buffer and to write a file from a buffer. -Thus for instance one may decide to use XpmReadFileToBuffer, XpmCreatePixmapFromBuffer, and XpmFree -instead of XpmReadFileToPixmap. On some systems this may lead to a performance improvement, +.PP +.BR XpmWriteFileFromBuffer () +writes a XPM buffer to a file. +.BR XpmWriteFileFromBuffer () +returns +.B XpmOpenFailed +if it cannot open the file, and +.B XpmSuccess +otherwise. +.PP +As a convenience, the +.BR XpmReadFileToBuffer () +and +.BR XpmWriteFileFromBuffer () +functions +are provided to copy a file to a buffer and to write a file from a buffer. +Thus for instance one may decide to use +.BR XpmCreateBufferFromPixmap (), +.BR XpmWriteFileFromBuffer (), +and +.BR XpmFree () +instead of +.BR XpmWriteFileFromPixmap (). +On some systems this may lead to a performance improvement, since the parsing will be performed in memory, but it uses more memory. + .SH "SEE ALSO" -.BR XpmWriteFileFromData(__libmansuffix__) , -.BR XpmWriteFileFromPixmap(__libmansuffix__) , -.BR XpmWriteFileFromImage(__libmansuffix__) , -.BR XpmWriteFileFromXpmImage(__libmansuffix__) , -.BR XpmWriteFileFromBuffer(__libmansuffix__) +.ad l +.nh +.BR XpmRead (__libmansuffix__) diff --git a/lib/libXpm/src/CrDatFrI.c b/lib/libXpm/src/CrDatFrI.c index 542662fbb..adb4786d1 100644 --- a/lib/libXpm/src/CrDatFrI.c +++ b/lib/libXpm/src/CrDatFrI.c @@ -241,10 +241,11 @@ XpmCreateDataFromXpmImage( /* exit point, free only locally allocated variables */ exit: if (header) { - for (l = 0; l < header_nlines; l++) + for (l = 0; l < header_nlines; l++) { if (header[l]) XpmFree(header[l]); - XpmFree(header); + } + XpmFree(header); } return(ErrorStatus); } diff --git a/lib/libXpm/src/Makefile.in b/lib/libXpm/src/Makefile.in index 57e551683..426c430d9 100644 --- a/lib/libXpm/src/Makefile.in +++ b/lib/libXpm/src/Makefile.in @@ -191,6 +191,8 @@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILE_MAN_DIR = @FILE_MAN_DIR@ FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_CMD = @INSTALL_CMD@ @@ -242,11 +244,11 @@ STRIP = @STRIP@ SXPM_CFLAGS = @SXPM_CFLAGS@ SXPM_LIBS = @SXPM_LIBS@ VERSION = @VERSION@ +XORG_MALLOC_DEBUG_ENV = @XORG_MALLOC_DEBUG_ENV@ XORG_MAN_PAGE = @XORG_MAN_PAGE@ XPM_CFLAGS = @XPM_CFLAGS@ XPM_LIBS = @XPM_LIBS@ XPM_PATH_COMPRESS = @XPM_PATH_COMPRESS@ -XPM_PATH_GUNZIP = @XPM_PATH_GUNZIP@ XPM_PATH_GZIP = @XPM_PATH_GZIP@ XPM_PATH_UNCOMPRESS = @XPM_PATH_UNCOMPRESS@ abs_builddir = @abs_builddir@ diff --git a/lib/libXpm/src/RdFToI.c b/lib/libXpm/src/RdFToI.c index a91d33795..a16af887e 100644 --- a/lib/libXpm/src/RdFToI.c +++ b/lib/libXpm/src/RdFToI.c @@ -246,12 +246,16 @@ OpenReadFile( if ( ext && !strcmp(ext, ".Z") ) { mdata->type = XPMPIPE; +#ifdef XPM_PATH_UNCOMPRESS mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_UNCOMPRESS, "-c", "r"); +#else + mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_GZIP, "-dqc", "r"); +#endif } else if ( ext && !strcmp(ext, ".gz") ) { mdata->type = XPMPIPE; - mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_GUNZIP, "-qc", "r"); + mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_GZIP, "-dqc", "r"); } else #endif /* z-files */ diff --git a/lib/libXpm/src/WrFFrI.c b/lib/libXpm/src/WrFFrI.c index d59098f02..234197aae 100644 --- a/lib/libXpm/src/WrFFrI.c +++ b/lib/libXpm/src/WrFFrI.c @@ -342,7 +342,11 @@ OpenWriteFile( #ifndef NO_ZPIPE len = strlen(filename); if (len > 2 && !strcmp(".Z", filename + (len - 2))) { +#ifdef XPM_PATH_COMPRESS mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_COMPRESS, NULL, "w"); +#else + mdata->stream.file = NULL; +#endif mdata->type = XPMPIPE; } else if (len > 3 && !strcmp(".gz", filename + (len - 3))) { mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_GZIP, "-q", "w"); diff --git a/lib/libXpm/src/XpmI.h b/lib/libXpm/src/XpmI.h index 4360ad3b9..70da79e03 100644 --- a/lib/libXpm/src/XpmI.h +++ b/lib/libXpm/src/XpmI.h @@ -254,7 +254,7 @@ FUNC(xpmParseExtensions, int, (xpmData *data, XpmExtension **extensions, /* RGB utility */ -FUNC(xpmReadRgbNames, int, (char *rgb_fname, xpmRgbName *rgbn)); +FUNC(xpmReadRgbNames, int, (const char *rgb_fname, xpmRgbName *rgbn)); FUNC(xpmGetRgbName, char *, (xpmRgbName *rgbn, int rgbn_max, int red, int green, int blue)); FUNC(xpmFreeRgbNames, void, (xpmRgbName *rgbn, int rgbn_max)); diff --git a/lib/libXpm/src/create.c b/lib/libXpm/src/create.c index 8d9de0f74..4921c7dd7 100644 --- a/lib/libXpm/src/create.c +++ b/lib/libXpm/src/create.c @@ -998,8 +998,11 @@ CreateXImage( return XpmNoMemory; } /* now that bytes_per_line must have been set properly alloc data */ - if((*image_return)->bytes_per_line == 0 || height == 0) + if((*image_return)->bytes_per_line == 0 || height == 0) { + XDestroyImage(*image_return); + *image_return = NULL; return XpmNoMemory; + } (*image_return)->data = (char *) XpmMalloc((*image_return)->bytes_per_line * height); @@ -2389,8 +2392,8 @@ ParseAndPutPixels( { /* free all allocated pointers at all exits */ -#define FREE_CIDX {int f; for (f = 0; f < 256; f++) \ -if (cidx[f]) XpmFree(cidx[f]);} +#define FREE_CIDX do {int f; for (f = 0; f < 256; f++) \ +if (cidx[f]) XpmFree(cidx[f]);} while(0) /* array of pointers malloced by need */ unsigned short *cidx[256]; diff --git a/lib/libXpm/src/parse.c b/lib/libXpm/src/parse.c index 64f51ba6a..ab65f506f 100644 --- a/lib/libXpm/src/parse.c +++ b/lib/libXpm/src/parse.c @@ -66,25 +66,6 @@ xstrlcat(char *dst, const char *src, size_t dstsize) #endif } -/** - * like strlcpy() but returns true on success and false if the string got - * truncated. - */ -static inline Bool -xstrlcpy(char *dst, const char *src, size_t dstsize) -{ -#if defined(HAS_STRLCAT) || defined(HAVE_STRLCAT) - return strlcpy(dst, src, dstsize) < dstsize; -#else - if (strlen(src) < dstsize) { - strcpy(dst, src); - return True; - } else { - return False; - } -#endif -} - LFUNC(ParsePixels, int, (xpmData *data, unsigned int width, unsigned int height, unsigned int ncolors, unsigned int cpp, XpmColor *colorTable, @@ -524,6 +505,7 @@ do \ for (y = 0; y < height; y++) { ErrorStatus = xpmNextString(data); if (ErrorStatus != XpmSuccess) { + FREE_CIDX; XpmFree(iptr2); return (ErrorStatus); } diff --git a/lib/libXpm/src/rgb.c b/lib/libXpm/src/rgb.c index 729898d36..5c350eb3b 100644 --- a/lib/libXpm/src/rgb.c +++ b/lib/libXpm/src/rgb.c @@ -57,7 +57,7 @@ */ int xpmReadRgbNames( - char *rgb_fname, + const char *rgb_fname, xpmRgbName rgbn[]) { FILE *rgbf; @@ -162,7 +162,7 @@ xpmFreeRgbNames( int xpmReadRgbNames( - char *rgb_fname, + const char *rgb_fname, xpmRgbName rgbn[]) { /* diff --git a/lib/libXpm/sxpm/Makefile.in b/lib/libXpm/sxpm/Makefile.in index e0881703a..1f252c12e 100644 --- a/lib/libXpm/sxpm/Makefile.in +++ b/lib/libXpm/sxpm/Makefile.in @@ -160,6 +160,8 @@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILE_MAN_DIR = @FILE_MAN_DIR@ FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_CMD = @INSTALL_CMD@ @@ -211,11 +213,11 @@ STRIP = @STRIP@ SXPM_CFLAGS = @SXPM_CFLAGS@ SXPM_LIBS = @SXPM_LIBS@ VERSION = @VERSION@ +XORG_MALLOC_DEBUG_ENV = @XORG_MALLOC_DEBUG_ENV@ XORG_MAN_PAGE = @XORG_MAN_PAGE@ XPM_CFLAGS = @XPM_CFLAGS@ XPM_LIBS = @XPM_LIBS@ XPM_PATH_COMPRESS = @XPM_PATH_COMPRESS@ -XPM_PATH_GUNZIP = @XPM_PATH_GUNZIP@ XPM_PATH_GZIP = @XPM_PATH_GZIP@ XPM_PATH_UNCOMPRESS = @XPM_PATH_UNCOMPRESS@ abs_builddir = @abs_builddir@ diff --git a/lib/libXpm/tap-driver.sh b/lib/libXpm/tap-driver.sh new file mode 100755 index 000000000..259ca0dd7 --- /dev/null +++ b/lib/libXpm/tap-driver.sh @@ -0,0 +1,652 @@ +#! /bin/sh +# Copyright (C) 2011-2012 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to <bug-automake@gnu.org> or send patches to +# <automake-patches@gnu.org>. + +scriptversion=2011-12-27.17; # UTC + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +me=tap-driver.sh + +fatal () +{ + echo "$me: fatal: $*" >&2 + exit 1 +} + +usage_error () +{ + echo "$me: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <<END +Usage: + tap-driver.sh --test-name=NAME --log-file=PATH --trs-file=PATH + [--expect-failure={yes|no}] [--color-tests={yes|no}] + [--enable-hard-errors={yes|no}] [--ignore-exit] + [--diagnostic-string=STRING] [--merge|--no-merge] + [--comments|--no-comments] [--] TEST-COMMAND +The \`--test-name', \`--log-file' and \`--trs-file' options are mandatory. +END +} + +# TODO: better error handling in option parsing (in particular, ensure +# TODO: $log_file, $trs_file and $test_name are defined). +test_name= # Used for reporting. +log_file= # Where to save the result and output of the test script. +trs_file= # Where to save the metadata of the test run. +expect_failure=0 +color_tests=0 +merge=0 +ignore_exit=0 +comments=0 +diag_string='#' +while test $# -gt 0; do + case $1 in + --help) print_usage; exit $?;; + --version) echo "$me $scriptversion"; exit $?;; + --test-name) test_name=$2; shift;; + --log-file) log_file=$2; shift;; + --trs-file) trs_file=$2; shift;; + --color-tests) color_tests=$2; shift;; + --expect-failure) expect_failure=$2; shift;; + --enable-hard-errors) shift;; # No-op. + --merge) merge=1;; + --no-merge) merge=0;; + --ignore-exit) ignore_exit=1;; + --comments) comments=1;; + --no-comments) comments=0;; + --diagnostic-string) diag_string=$2; shift;; + --) shift; break;; + -*) usage_error "invalid option: '$1'";; + esac + shift +done + +test $# -gt 0 || usage_error "missing test command" + +case $expect_failure in + yes) expect_failure=1;; + *) expect_failure=0;; +esac + +if test $color_tests = yes; then + init_colors=' + color_map["red"]="[0;31m" # Red. + color_map["grn"]="[0;32m" # Green. + color_map["lgn"]="[1;32m" # Light green. + color_map["blu"]="[1;34m" # Blue. + color_map["mgn"]="[0;35m" # Magenta. + color_map["std"]="[m" # No color. + color_for_result["ERROR"] = "mgn" + color_for_result["PASS"] = "grn" + color_for_result["XPASS"] = "red" + color_for_result["FAIL"] = "red" + color_for_result["XFAIL"] = "lgn" + color_for_result["SKIP"] = "blu"' +else + init_colors='' +fi + +# :; is there to work around a bug in bash 3.2 (and earlier) which +# does not always set '$?' properly on redirection failure. +# See the Autoconf manual for more details. +:;{ + ( + # Ignore common signals (in this subshell only!), to avoid potential + # problems with Korn shells. Some Korn shells are known to propagate + # to themselves signals that have killed a child process they were + # waiting for; this is done at least for SIGINT (and usually only for + # it, in truth). Without the `trap' below, such a behaviour could + # cause a premature exit in the current subshell, e.g., in case the + # test command it runs gets terminated by a SIGINT. Thus, the awk + # script we are piping into would never seen the exit status it + # expects on its last input line (which is displayed below by the + # last `echo $?' statement), and would thus die reporting an internal + # error. + # For more information, see the Autoconf manual and the threads: + # <http://lists.gnu.org/archive/html/bug-autoconf/2011-09/msg00004.html> + # <http://mail.opensolaris.org/pipermail/ksh93-integration-discuss/2009-February/004121.html> + trap : 1 3 2 13 15 + if test $merge -gt 0; then + exec 2>&1 + else + exec 2>&3 + fi + "$@" + echo $? + ) | LC_ALL=C ${AM_TAP_AWK-awk} \ + -v me="$me" \ + -v test_script_name="$test_name" \ + -v log_file="$log_file" \ + -v trs_file="$trs_file" \ + -v expect_failure="$expect_failure" \ + -v merge="$merge" \ + -v ignore_exit="$ignore_exit" \ + -v comments="$comments" \ + -v diag_string="$diag_string" \ +' +# FIXME: the usages of "cat >&3" below could be optimized when using +# FIXME: GNU awk, and/on on systems that supports /dev/fd/. + +# Implementation note: in what follows, `result_obj` will be an +# associative array that (partly) simulates a TAP result object +# from the `TAP::Parser` perl module. + +## ----------- ## +## FUNCTIONS ## +## ----------- ## + +function fatal(msg) +{ + print me ": " msg | "cat >&2" + exit 1 +} + +function abort(where) +{ + fatal("internal error " where) +} + +# Convert a boolean to a "yes"/"no" string. +function yn(bool) +{ + return bool ? "yes" : "no"; +} + +function add_test_result(result) +{ + if (!test_results_index) + test_results_index = 0 + test_results_list[test_results_index] = result + test_results_index += 1 + test_results_seen[result] = 1; +} + +# Whether the test script should be re-run by "make recheck". +function must_recheck() +{ + for (k in test_results_seen) + if (k != "XFAIL" && k != "PASS" && k != "SKIP") + return 1 + return 0 +} + +# Whether the content of the log file associated to this test should +# be copied into the "global" test-suite.log. +function copy_in_global_log() +{ + for (k in test_results_seen) + if (k != "PASS") + return 1 + return 0 +} + +# FIXME: this can certainly be improved ... +function get_global_test_result() +{ + if ("ERROR" in test_results_seen) + return "ERROR" + if ("FAIL" in test_results_seen || "XPASS" in test_results_seen) + return "FAIL" + all_skipped = 1 + for (k in test_results_seen) + if (k != "SKIP") + all_skipped = 0 + if (all_skipped) + return "SKIP" + return "PASS"; +} + +function stringify_result_obj(result_obj) +{ + if (result_obj["is_unplanned"] || result_obj["number"] != testno) + return "ERROR" + + if (plan_seen == LATE_PLAN) + return "ERROR" + + if (result_obj["directive"] == "TODO") + return result_obj["is_ok"] ? "XPASS" : "XFAIL" + + if (result_obj["directive"] == "SKIP") + return result_obj["is_ok"] ? "SKIP" : COOKED_FAIL; + + if (length(result_obj["directive"])) + abort("in function stringify_result_obj()") + + return result_obj["is_ok"] ? COOKED_PASS : COOKED_FAIL +} + +function decorate_result(result) +{ + color_name = color_for_result[result] + if (color_name) + return color_map[color_name] "" result "" color_map["std"] + # If we are not using colorized output, or if we do not know how + # to colorize the given result, we should return it unchanged. + return result +} + +function report(result, details) +{ + if (result ~ /^(X?(PASS|FAIL)|SKIP|ERROR)/) + { + msg = ": " test_script_name + add_test_result(result) + } + else if (result == "#") + { + msg = " " test_script_name ":" + } + else + { + abort("in function report()") + } + if (length(details)) + msg = msg " " details + # Output on console might be colorized. + print decorate_result(result) msg + # Log the result in the log file too, to help debugging (this is + # especially true when said result is a TAP error or "Bail out!"). + print result msg | "cat >&3"; +} + +function testsuite_error(error_message) +{ + report("ERROR", "- " error_message) +} + +function handle_tap_result() +{ + details = result_obj["number"]; + if (length(result_obj["description"])) + details = details " " result_obj["description"] + + if (plan_seen == LATE_PLAN) + { + details = details " # AFTER LATE PLAN"; + } + else if (result_obj["is_unplanned"]) + { + details = details " # UNPLANNED"; + } + else if (result_obj["number"] != testno) + { + details = sprintf("%s # OUT-OF-ORDER (expecting %d)", + details, testno); + } + else if (result_obj["directive"]) + { + details = details " # " result_obj["directive"]; + if (length(result_obj["explanation"])) + details = details " " result_obj["explanation"] + } + + report(stringify_result_obj(result_obj), details) +} + +# `skip_reason` should be empty whenever planned > 0. +function handle_tap_plan(planned, skip_reason) +{ + planned += 0 # Avoid getting confused if, say, `planned` is "00" + if (length(skip_reason) && planned > 0) + abort("in function handle_tap_plan()") + if (plan_seen) + { + # Error, only one plan per stream is acceptable. + testsuite_error("multiple test plans") + return; + } + planned_tests = planned + # The TAP plan can come before or after *all* the TAP results; we speak + # respectively of an "early" or a "late" plan. If we see the plan line + # after at least one TAP result has been seen, assume we have a late + # plan; in this case, any further test result seen after the plan will + # be flagged as an error. + plan_seen = (testno >= 1 ? LATE_PLAN : EARLY_PLAN) + # If testno > 0, we have an error ("too many tests run") that will be + # automatically dealt with later, so do not worry about it here. If + # $plan_seen is true, we have an error due to a repeated plan, and that + # has already been dealt with above. Otherwise, we have a valid "plan + # with SKIP" specification, and should report it as a particular kind + # of SKIP result. + if (planned == 0 && testno == 0) + { + if (length(skip_reason)) + skip_reason = "- " skip_reason; + report("SKIP", skip_reason); + } +} + +function extract_tap_comment(line) +{ + if (index(line, diag_string) == 1) + { + # Strip leading `diag_string` from `line`. + line = substr(line, length(diag_string) + 1) + # And strip any leading and trailing whitespace left. + sub("^[ \t]*", "", line) + sub("[ \t]*$", "", line) + # Return what is left (if any). + return line; + } + return ""; +} + +# When this function is called, we know that line is a TAP result line, +# so that it matches the (perl) RE "^(not )?ok\b". +function setup_result_obj(line) +{ + # Get the result, and remove it from the line. + result_obj["is_ok"] = (substr(line, 1, 2) == "ok" ? 1 : 0) + sub("^(not )?ok[ \t]*", "", line) + + # If the result has an explicit number, get it and strip it; otherwise, + # automatically assing the next progresive number to it. + if (line ~ /^[0-9]+$/ || line ~ /^[0-9]+[^a-zA-Z0-9_]/) + { + match(line, "^[0-9]+") + # The final `+ 0` is to normalize numbers with leading zeros. + result_obj["number"] = substr(line, 1, RLENGTH) + 0 + line = substr(line, RLENGTH + 1) + } + else + { + result_obj["number"] = testno + } + + if (plan_seen == LATE_PLAN) + # No further test results are acceptable after a "late" TAP plan + # has been seen. + result_obj["is_unplanned"] = 1 + else if (plan_seen && testno > planned_tests) + result_obj["is_unplanned"] = 1 + else + result_obj["is_unplanned"] = 0 + + # Strip trailing and leading whitespace. + sub("^[ \t]*", "", line) + sub("[ \t]*$", "", line) + + # This will have to be corrected if we have a "TODO"/"SKIP" directive. + result_obj["description"] = line + result_obj["directive"] = "" + result_obj["explanation"] = "" + + if (index(line, "#") == 0) + return # No possible directive, nothing more to do. + + # Directives are case-insensitive. + rx = "[ \t]*#[ \t]*([tT][oO][dD][oO]|[sS][kK][iI][pP])[ \t]*" + + # See whether we have the directive, and if yes, where. + pos = match(line, rx "$") + if (!pos) + pos = match(line, rx "[^a-zA-Z0-9_]") + + # If there was no TAP directive, we have nothing more to do. + if (!pos) + return + + # Let`s now see if the TAP directive has been escaped. For example: + # escaped: ok \# SKIP + # not escaped: ok \\# SKIP + # escaped: ok \\\\\# SKIP + # not escaped: ok \ # SKIP + if (substr(line, pos, 1) == "#") + { + bslash_count = 0 + for (i = pos; i > 1 && substr(line, i - 1, 1) == "\\"; i--) + bslash_count += 1 + if (bslash_count % 2) + return # Directive was escaped. + } + + # Strip the directive and its explanation (if any) from the test + # description. + result_obj["description"] = substr(line, 1, pos - 1) + # Now remove the test description from the line, that has been dealt + # with already. + line = substr(line, pos) + # Strip the directive, and save its value (normalized to upper case). + sub("^[ \t]*#[ \t]*", "", line) + result_obj["directive"] = toupper(substr(line, 1, 4)) + line = substr(line, 5) + # Now get the explanation for the directive (if any), with leading + # and trailing whitespace removed. + sub("^[ \t]*", "", line) + sub("[ \t]*$", "", line) + result_obj["explanation"] = line +} + +function get_test_exit_message(status) +{ + if (status == 0) + return "" + if (status !~ /^[1-9][0-9]*$/) + abort("getting exit status") + if (status < 127) + exit_details = "" + else if (status == 127) + exit_details = " (command not found?)" + else if (status >= 128 && status <= 255) + exit_details = sprintf(" (terminated by signal %d?)", status - 128) + else if (status > 256 && status <= 384) + # We used to report an "abnormal termination" here, but some Korn + # shells, when a child process die due to signal number n, can leave + # in $? an exit status of 256+n instead of the more standard 128+n. + # Apparently, both behaviours are allowed by POSIX (2008), so be + # prepared to handle them both. See also Austing Group report ID + # 0000051 <http://www.austingroupbugs.net/view.php?id=51> + exit_details = sprintf(" (terminated by signal %d?)", status - 256) + else + # Never seen in practice. + exit_details = " (abnormal termination)" + return sprintf("exited with status %d%s", status, exit_details) +} + +function write_test_results() +{ + print ":global-test-result: " get_global_test_result() > trs_file + print ":recheck: " yn(must_recheck()) > trs_file + print ":copy-in-global-log: " yn(copy_in_global_log()) > trs_file + for (i = 0; i < test_results_index; i += 1) + print ":test-result: " test_results_list[i] > trs_file + close(trs_file); +} + +BEGIN { + +## ------- ## +## SETUP ## +## ------- ## + +'"$init_colors"' + +# Properly initialized once the TAP plan is seen. +planned_tests = 0 + +COOKED_PASS = expect_failure ? "XPASS": "PASS"; +COOKED_FAIL = expect_failure ? "XFAIL": "FAIL"; + +# Enumeration-like constants to remember which kind of plan (if any) +# has been seen. It is important that NO_PLAN evaluates "false" as +# a boolean. +NO_PLAN = 0 +EARLY_PLAN = 1 +LATE_PLAN = 2 + +testno = 0 # Number of test results seen so far. +bailed_out = 0 # Whether a "Bail out!" directive has been seen. + +# Whether the TAP plan has been seen or not, and if yes, which kind +# it is ("early" is seen before any test result, "late" otherwise). +plan_seen = NO_PLAN + +## --------- ## +## PARSING ## +## --------- ## + +is_first_read = 1 + +while (1) + { + # Involutions required so that we are able to read the exit status + # from the last input line. + st = getline + if (st < 0) # I/O error. + fatal("I/O error while reading from input stream") + else if (st == 0) # End-of-input + { + if (is_first_read) + abort("in input loop: only one input line") + break + } + if (is_first_read) + { + is_first_read = 0 + nextline = $0 + continue + } + else + { + curline = nextline + nextline = $0 + $0 = curline + } + # Copy any input line verbatim into the log file. + print | "cat >&3" + # Parsing of TAP input should stop after a "Bail out!" directive. + if (bailed_out) + continue + + # TAP test result. + if ($0 ~ /^(not )?ok$/ || $0 ~ /^(not )?ok[^a-zA-Z0-9_]/) + { + testno += 1 + setup_result_obj($0) + handle_tap_result() + } + # TAP plan (normal or "SKIP" without explanation). + else if ($0 ~ /^1\.\.[0-9]+[ \t]*$/) + { + # The next two lines will put the number of planned tests in $0. + sub("^1\\.\\.", "") + sub("[^0-9]*$", "") + handle_tap_plan($0, "") + continue + } + # TAP "SKIP" plan, with an explanation. + else if ($0 ~ /^1\.\.0+[ \t]*#/) + { + # The next lines will put the skip explanation in $0, stripping + # any leading and trailing whitespace. This is a little more + # tricky in truth, since we want to also strip a potential leading + # "SKIP" string from the message. + sub("^[^#]*#[ \t]*(SKIP[: \t][ \t]*)?", "") + sub("[ \t]*$", ""); + handle_tap_plan(0, $0) + } + # "Bail out!" magic. + # Older versions of prove and TAP::Harness (e.g., 3.17) did not + # recognize a "Bail out!" directive when preceded by leading + # whitespace, but more modern versions (e.g., 3.23) do. So we + # emulate the latter, "more modern" behaviour. + else if ($0 ~ /^[ \t]*Bail out!/) + { + bailed_out = 1 + # Get the bailout message (if any), with leading and trailing + # whitespace stripped. The message remains stored in `$0`. + sub("^[ \t]*Bail out![ \t]*", ""); + sub("[ \t]*$", ""); + # Format the error message for the + bailout_message = "Bail out!" + if (length($0)) + bailout_message = bailout_message " " $0 + testsuite_error(bailout_message) + } + # Maybe we have too look for dianogtic comments too. + else if (comments != 0) + { + comment = extract_tap_comment($0); + if (length(comment)) + report("#", comment); + } + } + +## -------- ## +## FINISH ## +## -------- ## + +# A "Bail out!" directive should cause us to ignore any following TAP +# error, as well as a non-zero exit status from the TAP producer. +if (!bailed_out) + { + if (!plan_seen) + { + testsuite_error("missing test plan") + } + else if (planned_tests != testno) + { + bad_amount = testno > planned_tests ? "many" : "few" + testsuite_error(sprintf("too %s tests run (expected %d, got %d)", + bad_amount, planned_tests, testno)) + } + if (!ignore_exit) + { + # Fetch exit status from the last line. + exit_message = get_test_exit_message(nextline) + if (exit_message) + testsuite_error(exit_message) + } + } + +write_test_results() + +exit 0 + +} # End of "BEGIN" block. +' + +# TODO: document that we consume the file descriptor 3 :-( +} 3>"$log_file" + +test $? -eq 0 || fatal "I/O or internal error" + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/lib/libXpm/test-driver b/lib/libXpm/test-driver new file mode 100644 index 000000000..be73b80ad --- /dev/null +++ b/lib/libXpm/test-driver @@ -0,0 +1,153 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 2011-2021 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to <bug-automake@gnu.org> or send patches to +# <automake-patches@gnu.org>. + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <<END +Usage: + test-driver --test-name NAME --log-file PATH --trs-file PATH + [--expect-failure {yes|no}] [--color-tests {yes|no}] + [--enable-hard-errors {yes|no}] [--] + TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS] + +The '--test-name', '--log-file' and '--trs-file' options are mandatory. +See the GNU Automake documentation for information. +END +} + +test_name= # Used for reporting. +log_file= # Where to save the output of the test script. +trs_file= # Where to save the metadata of the test run. +expect_failure=no +color_tests=no +enable_hard_errors=yes +while test $# -gt 0; do + case $1 in + --help) print_usage; exit $?;; + --version) echo "test-driver $scriptversion"; exit $?;; + --test-name) test_name=$2; shift;; + --log-file) log_file=$2; shift;; + --trs-file) trs_file=$2; shift;; + --color-tests) color_tests=$2; shift;; + --expect-failure) expect_failure=$2; shift;; + --enable-hard-errors) enable_hard_errors=$2; shift;; + --) shift; break;; + -*) usage_error "invalid option: '$1'";; + *) break;; + esac + shift +done + +missing_opts= +test x"$test_name" = x && missing_opts="$missing_opts --test-name" +test x"$log_file" = x && missing_opts="$missing_opts --log-file" +test x"$trs_file" = x && missing_opts="$missing_opts --trs-file" +if test x"$missing_opts" != x; then + usage_error "the following mandatory options are missing:$missing_opts" +fi + +if test $# -eq 0; then + usage_error "missing argument" +fi + +if test $color_tests = yes; then + # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'. + red='[0;31m' # Red. + grn='[0;32m' # Green. + lgn='[1;32m' # Light green. + blu='[1;34m' # Blue. + mgn='[0;35m' # Magenta. + std='[m' # No color. +else + red= grn= lgn= blu= mgn= std= +fi + +do_exit='rm -f $log_file $trs_file; (exit $st); exit $st' +trap "st=129; $do_exit" 1 +trap "st=130; $do_exit" 2 +trap "st=141; $do_exit" 13 +trap "st=143; $do_exit" 15 + +# Test script is run here. We create the file first, then append to it, +# to ameliorate tests themselves also writing to the log file. Our tests +# don't, but others can (automake bug#35762). +: >"$log_file" +"$@" >>"$log_file" 2>&1 +estatus=$? + +if test $enable_hard_errors = no && test $estatus -eq 99; then + tweaked_estatus=1 +else + tweaked_estatus=$estatus +fi + +case $tweaked_estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report the test outcome and exit status in the logs, so that one can +# know whether the test passed or failed simply by looking at the '.log' +# file, without the need of also peaking into the corresponding '.trs' +# file (automake bug#11814). +echo "$res $test_name (exit status: $estatus)" >>"$log_file" + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/lib/libXpm/test/CompareXpmImage.h b/lib/libXpm/test/CompareXpmImage.h new file mode 100644 index 000000000..2a901b193 --- /dev/null +++ b/lib/libXpm/test/CompareXpmImage.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include <glib.h> + +static void +CompareXpmImage(const XpmImage *a, const XpmImage *b) +{ +#if 0 + const size_t datasize = sizeof(unsigned int) * a->width * a->height; +#endif + +#define CompareUintFields(f) g_assert_cmpuint(a->f, ==, b->f) + + CompareUintFields(width); + CompareUintFields(height); + CompareUintFields(cpp); + CompareUintFields(ncolors); + +/* this assumes the same character encoding and color ordering, which is only + true in our crafted test cases, not for matching images in the real world */ + for (unsigned int i = 0; i < a->ncolors; i++) + { +#define CompareStringFields(f) \ + g_assert_cmpstr(a->colorTable[i].f, ==, b->colorTable[i].f) + + CompareStringFields(string); + CompareStringFields(symbolic); + CompareStringFields(m_color); + CompareStringFields(g4_color); + CompareStringFields(g_color); + CompareStringFields(c_color); + } + +#if 0 /* this currently fails in image comparison - needs debugging */ + for (size_t i = 0; i < datasize; i++) + { + CompareUintFields(data[i]); + } +#endif +} diff --git a/lib/libXpm/test/Makefile.am b/lib/libXpm/test/Makefile.am new file mode 100644 index 000000000..70f5c9e3c --- /dev/null +++ b/lib/libXpm/test/Makefile.am @@ -0,0 +1,103 @@ +# +# Copyright (c) 2023, Oracle and/or its affiliates. +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice (including the next +# paragraph) shall be included in all copies or substantial portions of the +# Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +if ENABLE_UNIT_TESTS +if HAVE_GLIB +check_PROGRAMS = XpmCreate XpmMisc XpmRead XpmWrite rgb + +TESTS=$(check_PROGRAMS) + +AM_CFLAGS = $(CWARNFLAGS) $(XPM_CFLAGS) $(GLIB_CFLAGS) +AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include +LDADD= $(top_builddir)/src/libXpm.la $(GLIB_LIBS) + +TESTS_ENVIRONMENT = $(MALLOC_DEBUG_ENV) +TESTS_ENVIRONMENT += G_TEST_SRCDIR="$(abs_srcdir)" +TESTS_ENVIRONMENT += G_TEST_BUILDDIR="$(abs_builddir)" + +XpmCreate_SOURCES = XpmCreate.c TestAllFiles.h +XpmMisc_SOURCES = XpmMisc.c +XpmRead_SOURCES = XpmRead.c TestAllFiles.h +XpmWrite_SOURCES = XpmWrite.c CompareXpmImage.h TestAllFiles.h + +rgb_SOURCES = rgb.c +rgb_CPPFLAGS = -I$(top_srcdir)/include/X11 + +LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \ + $(top_srcdir)/tap-driver.sh +LOG_COMPILER = $(srcdir)/tap-test + +if COMPRESSED_PIXMAPS +$(check_PROGRAMS): pixmaps/.generated + +pixmaps/.generated: + -rm -rf pixmaps/good/generated pixmaps/invalid/generated pixmaps/.generated + $(MKDIR_P) pixmaps/good/generated pixmaps/invalid/generated \ + pixmaps/no-mem/generated + cp $(srcdir)/pixmaps/good/*.xpm pixmaps/good/generated + gzip -f pixmaps/good/generated/*.xpm + cp $(srcdir)/pixmaps/good/*.xpm pixmaps/good/generated + compress -f pixmaps/good/generated/*.xpm + cp $(srcdir)/pixmaps/invalid/*.xpm pixmaps/invalid/generated + gzip -f pixmaps/invalid/generated/*.xpm + cp $(srcdir)/pixmaps/invalid/*.xpm pixmaps/invalid/generated + compress -f pixmaps/invalid/generated/*.xpm + cp $(srcdir)/pixmaps/no-mem/*.xpm pixmaps/no-mem/generated + gzip -f pixmaps/no-mem/generated/*.xpm + cp $(srcdir)/pixmaps/no-mem/*.xpm pixmaps/no-mem/generated + compress -f pixmaps/no-mem/generated/*.xpm + touch $@ + +clean-local: + -rm -rf pixmaps/*/generated pixmaps/.generated +endif COMPRESSED_PIXMAPS + +endif HAVE_GLIB +endif ENABLE_UNIT_TESTS + +EXTRA_DIST = \ + pixmaps/good/BlueCurves.xpm \ + pixmaps/good/Dimple.xpm \ + pixmaps/good/Dolphins.xpm \ + pixmaps/good/Miniweave.xpm \ + pixmaps/good/Squares.xpm \ + pixmaps/good/Swirl.xpm \ + pixmaps/good/Utah-teapot.xpm \ + pixmaps/good/chromesphere.xpm \ + pixmaps/good/plaid-v1.xpm \ + pixmaps/good/plaid-v2.xpm \ + pixmaps/good/plaid-v3.xpm \ + pixmaps/good/plaid-lisp.xpm \ + pixmaps/good/xorg-bw.xpm \ + pixmaps/good/xorg.xpm \ + pixmaps/invalid/CVE-2016-10164-poc.xpm.gz.gz.gz \ + pixmaps/invalid/doom.xpm \ + pixmaps/invalid/doom2.xpm \ + pixmaps/invalid/invalid-type.xpm \ + pixmaps/invalid/no-contents.xpm \ + pixmaps/invalid/unending-comment-c.xpm \ + pixmaps/invalid/zero-width.xpm \ + pixmaps/invalid/zero-width-v1.xpm \ + pixmaps/no-mem/oversize.xpm \ + rgb.txt \ + tap-test diff --git a/lib/libXpm/test/Makefile.in b/lib/libXpm/test/Makefile.in new file mode 100644 index 000000000..f87301895 --- /dev/null +++ b/lib/libXpm/test/Makefile.in @@ -0,0 +1,834 @@ +# Makefile.in generated by automake 1.12.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2012 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Copyright (c) 2023, Oracle and/or its affiliates. +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice (including the next +# paragraph) shall be included in all copies or substantial portions of the +# Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@check_PROGRAMS = \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ XpmCreate$(EXEEXT) \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ XpmMisc$(EXEEXT) \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ XpmRead$(EXEEXT) \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ XpmWrite$(EXEEXT) \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ rgb$(EXEEXT) +subdir = test +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_define_dir.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__XpmCreate_SOURCES_DIST = XpmCreate.c TestAllFiles.h +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@am_XpmCreate_OBJECTS = \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ XpmCreate.$(OBJEXT) +XpmCreate_OBJECTS = $(am_XpmCreate_OBJECTS) +XpmCreate_LDADD = $(LDADD) +am__DEPENDENCIES_1 = +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@XpmCreate_DEPENDENCIES = $(top_builddir)/src/libXpm.la \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +am__XpmMisc_SOURCES_DIST = XpmMisc.c +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@am_XpmMisc_OBJECTS = \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ XpmMisc.$(OBJEXT) +XpmMisc_OBJECTS = $(am_XpmMisc_OBJECTS) +XpmMisc_LDADD = $(LDADD) +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@XpmMisc_DEPENDENCIES = $(top_builddir)/src/libXpm.la \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1) +am__XpmRead_SOURCES_DIST = XpmRead.c TestAllFiles.h +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@am_XpmRead_OBJECTS = \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ XpmRead.$(OBJEXT) +XpmRead_OBJECTS = $(am_XpmRead_OBJECTS) +XpmRead_LDADD = $(LDADD) +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@XpmRead_DEPENDENCIES = $(top_builddir)/src/libXpm.la \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1) +am__XpmWrite_SOURCES_DIST = XpmWrite.c CompareXpmImage.h \ + TestAllFiles.h +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@am_XpmWrite_OBJECTS = \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ XpmWrite.$(OBJEXT) +XpmWrite_OBJECTS = $(am_XpmWrite_OBJECTS) +XpmWrite_LDADD = $(LDADD) +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@XpmWrite_DEPENDENCIES = $(top_builddir)/src/libXpm.la \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1) +am__rgb_SOURCES_DIST = rgb.c +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@am_rgb_OBJECTS = \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ rgb-rgb.$(OBJEXT) +rgb_OBJECTS = $(am_rgb_OBJECTS) +rgb_LDADD = $(LDADD) +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@rgb_DEPENDENCIES = $(top_builddir)/src/libXpm.la \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(XpmCreate_SOURCES) $(XpmMisc_SOURCES) $(XpmRead_SOURCES) \ + $(XpmWrite_SOURCES) $(rgb_SOURCES) +DIST_SOURCES = $(am__XpmCreate_SOURCES_DIST) \ + $(am__XpmMisc_SOURCES_DIST) $(am__XpmRead_SOURCES_DIST) \ + $(am__XpmWrite_SOURCES_DIST) $(am__rgb_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = $(am__tty_colors_dummy) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ADMIN_MAN_DIR = @ADMIN_MAN_DIR@ +ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +APP_MAN_DIR = @APP_MAN_DIR@ +APP_MAN_SUFFIX = @APP_MAN_SUFFIX@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BASE_CFLAGS = @BASE_CFLAGS@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHANGELOG_CMD = @CHANGELOG_CMD@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CWARNFLAGS = @CWARNFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DRIVER_MAN_DIR = @DRIVER_MAN_DIR@ +DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILE_MAN_DIR = @FILE_MAN_DIR@ +FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_CMD = @INSTALL_CMD@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_MAN_DIR = @LIB_MAN_DIR@ +LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAN_SUBSTS = @MAN_SUBSTS@ +MISC_MAN_DIR = @MISC_MAN_DIR@ +MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRICT_CFLAGS = @STRICT_CFLAGS@ +STRIP = @STRIP@ +SXPM_CFLAGS = @SXPM_CFLAGS@ +SXPM_LIBS = @SXPM_LIBS@ +VERSION = @VERSION@ +XORG_MALLOC_DEBUG_ENV = @XORG_MALLOC_DEBUG_ENV@ +XORG_MAN_PAGE = @XORG_MAN_PAGE@ +XPM_CFLAGS = @XPM_CFLAGS@ +XPM_LIBS = @XPM_LIBS@ +XPM_PATH_COMPRESS = @XPM_PATH_COMPRESS@ +XPM_PATH_GZIP = @XPM_PATH_GZIP@ +XPM_PATH_UNCOMPRESS = @XPM_PATH_UNCOMPRESS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@TESTS = $(check_PROGRAMS) +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@AM_CFLAGS = $(CWARNFLAGS) $(XPM_CFLAGS) $(GLIB_CFLAGS) +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@LDADD = $(top_builddir)/src/libXpm.la $(GLIB_LIBS) +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@TESTS_ENVIRONMENT = \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ $(MALLOC_DEBUG_ENV) \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ G_TEST_SRCDIR="$(abs_srcdir)" \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ G_TEST_BUILDDIR="$(abs_builddir)" +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@XpmCreate_SOURCES = XpmCreate.c TestAllFiles.h +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@XpmMisc_SOURCES = XpmMisc.c +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@XpmRead_SOURCES = XpmRead.c TestAllFiles.h +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@XpmWrite_SOURCES = XpmWrite.c CompareXpmImage.h TestAllFiles.h +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@rgb_SOURCES = rgb.c +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@rgb_CPPFLAGS = -I$(top_srcdir)/include/X11 +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \ +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ $(top_srcdir)/tap-driver.sh + +@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@LOG_COMPILER = $(srcdir)/tap-test +EXTRA_DIST = \ + pixmaps/good/BlueCurves.xpm \ + pixmaps/good/Dimple.xpm \ + pixmaps/good/Dolphins.xpm \ + pixmaps/good/Miniweave.xpm \ + pixmaps/good/Squares.xpm \ + pixmaps/good/Swirl.xpm \ + pixmaps/good/Utah-teapot.xpm \ + pixmaps/good/chromesphere.xpm \ + pixmaps/good/plaid-v1.xpm \ + pixmaps/good/plaid-v2.xpm \ + pixmaps/good/plaid-v3.xpm \ + pixmaps/good/plaid-lisp.xpm \ + pixmaps/good/xorg-bw.xpm \ + pixmaps/good/xorg.xpm \ + pixmaps/invalid/CVE-2016-10164-poc.xpm.gz.gz.gz \ + pixmaps/invalid/doom.xpm \ + pixmaps/invalid/doom2.xpm \ + pixmaps/invalid/invalid-type.xpm \ + pixmaps/invalid/no-contents.xpm \ + pixmaps/invalid/unending-comment-c.xpm \ + pixmaps/invalid/zero-width.xpm \ + pixmaps/invalid/zero-width-v1.xpm \ + pixmaps/no-mem/oversize.xpm \ + rgb.txt \ + tap-test + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign test/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +XpmCreate$(EXEEXT): $(XpmCreate_OBJECTS) $(XpmCreate_DEPENDENCIES) $(EXTRA_XpmCreate_DEPENDENCIES) + @rm -f XpmCreate$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(XpmCreate_OBJECTS) $(XpmCreate_LDADD) $(LIBS) +XpmMisc$(EXEEXT): $(XpmMisc_OBJECTS) $(XpmMisc_DEPENDENCIES) $(EXTRA_XpmMisc_DEPENDENCIES) + @rm -f XpmMisc$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(XpmMisc_OBJECTS) $(XpmMisc_LDADD) $(LIBS) +XpmRead$(EXEEXT): $(XpmRead_OBJECTS) $(XpmRead_DEPENDENCIES) $(EXTRA_XpmRead_DEPENDENCIES) + @rm -f XpmRead$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(XpmRead_OBJECTS) $(XpmRead_LDADD) $(LIBS) +XpmWrite$(EXEEXT): $(XpmWrite_OBJECTS) $(XpmWrite_DEPENDENCIES) $(EXTRA_XpmWrite_DEPENDENCIES) + @rm -f XpmWrite$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(XpmWrite_OBJECTS) $(XpmWrite_LDADD) $(LIBS) +rgb$(EXEEXT): $(rgb_OBJECTS) $(rgb_DEPENDENCIES) $(EXTRA_rgb_DEPENDENCIES) + @rm -f rgb$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(rgb_OBJECTS) $(rgb_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XpmCreate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XpmMisc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XpmRead.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XpmWrite.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rgb-rgb.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +rgb-rgb.o: rgb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(rgb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rgb-rgb.o -MD -MP -MF $(DEPDIR)/rgb-rgb.Tpo -c -o rgb-rgb.o `test -f 'rgb.c' || echo '$(srcdir)/'`rgb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rgb-rgb.Tpo $(DEPDIR)/rgb-rgb.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rgb.c' object='rgb-rgb.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(rgb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rgb-rgb.o `test -f 'rgb.c' || echo '$(srcdir)/'`rgb.c + +rgb-rgb.obj: rgb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(rgb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rgb-rgb.obj -MD -MP -MF $(DEPDIR)/rgb-rgb.Tpo -c -o rgb-rgb.obj `if test -f 'rgb.c'; then $(CYGPATH_W) 'rgb.c'; else $(CYGPATH_W) '$(srcdir)/rgb.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rgb-rgb.Tpo $(DEPDIR)/rgb-rgb.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rgb.c' object='rgb-rgb.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(rgb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rgb-rgb.obj `if test -f 'rgb.c'; then $(CYGPATH_W) 'rgb.c'; else $(CYGPATH_W) '$(srcdir)/rgb.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +cscopelist: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + fi; \ + echo "$${col}$$dashes$${std}"; \ + echo "$${col}$$banner$${std}"; \ + test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ + test -z "$$report" || echo "$${col}$$report$${std}"; \ + echo "$${col}$$dashes$${std}"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +@COMPRESSED_PIXMAPS_FALSE@clean-local: +@ENABLE_UNIT_TESTS_FALSE@clean-local: +@HAVE_GLIB_FALSE@clean-local: +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool clean-local \ + cscopelist ctags distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@$(check_PROGRAMS): pixmaps/.generated + +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@pixmaps/.generated: +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ -rm -rf pixmaps/good/generated pixmaps/invalid/generated pixmaps/.generated +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ $(MKDIR_P) pixmaps/good/generated pixmaps/invalid/generated \ +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ pixmaps/no-mem/generated +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ cp $(srcdir)/pixmaps/good/*.xpm pixmaps/good/generated +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ gzip -f pixmaps/good/generated/*.xpm +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ cp $(srcdir)/pixmaps/good/*.xpm pixmaps/good/generated +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ compress -f pixmaps/good/generated/*.xpm +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ cp $(srcdir)/pixmaps/invalid/*.xpm pixmaps/invalid/generated +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ gzip -f pixmaps/invalid/generated/*.xpm +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ cp $(srcdir)/pixmaps/invalid/*.xpm pixmaps/invalid/generated +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ compress -f pixmaps/invalid/generated/*.xpm +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ cp $(srcdir)/pixmaps/no-mem/*.xpm pixmaps/no-mem/generated +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ gzip -f pixmaps/no-mem/generated/*.xpm +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ cp $(srcdir)/pixmaps/no-mem/*.xpm pixmaps/no-mem/generated +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ compress -f pixmaps/no-mem/generated/*.xpm +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ touch $@ + +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@clean-local: +@COMPRESSED_PIXMAPS_TRUE@@ENABLE_UNIT_TESTS_TRUE@@HAVE_GLIB_TRUE@ -rm -rf pixmaps/*/generated pixmaps/.generated + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/lib/libXpm/test/TestAllFiles.h b/lib/libXpm/test/TestAllFiles.h new file mode 100644 index 000000000..505b2a32c --- /dev/null +++ b/lib/libXpm/test/TestAllFiles.h @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include <glib.h> + +#include <errno.h> +#include <limits.h> +#include <setjmp.h> +#include <signal.h> +#include <stdlib.h> +#include <unistd.h> + +#include "config.h" + +#define DEFAULT_TIMEOUT 10 /* maximum seconds for each file */ + +static sigjmp_buf jump_env; + +static void sigalrm (int sig) +{ + siglongjmp(jump_env, 1); +} + +typedef int (*testfilefunc)(const gchar *filepath); + +/* + * Test all files in a given subdir of either the build or source directory + */ +static void +TestAllFilesByType(GTestFileType file_type, gboolean compressed, + const char *subdir, int expected, testfilefunc testfunc) +{ + const gchar *datadir_path, *filename; + GDir *datadir; + GError *err = NULL; + int timeout = DEFAULT_TIMEOUT; + char *timeout_env; + + GPatternSpec *xpm_pattern = g_pattern_spec_new("*.xpm"); +#ifndef NO_ZPIPE + GPatternSpec *z_pattern = compressed ? g_pattern_spec_new("*.xpm.Z") : NULL; + GPatternSpec *gz_pattern = compressed ? g_pattern_spec_new("*.xpm.gz") : NULL; +#endif + + /* Allow override when debugging tests */ + timeout_env = getenv("XPM_TEST_TIMEOUT"); + if (timeout_env != NULL) { + int from_env = atoi(timeout_env); + + if (from_env >= 0) + timeout = from_env; + } + + datadir_path = g_test_get_filename(file_type, "pixmaps", subdir, + (file_type == G_TEST_BUILT) ? "generated" : NULL, NULL); + g_assert_nonnull(datadir_path); + g_test_message("Reading files from %s", datadir_path); + + datadir = g_dir_open(datadir_path, 0, &err); + g_assert_no_error(err); + + errno = 0; + while ((filename = g_dir_read_name(datadir)) != NULL) { + + if (!g_pattern_match_string(xpm_pattern, filename)) { +#ifndef NO_ZPIPE + if (!compressed || + (!g_pattern_match_string(z_pattern, filename) && + !g_pattern_match_string(gz_pattern, filename))) +#endif + { + g_test_message("skipping \"%s\"", filename); + continue; + } + } + + /* + * Assumes the test function should complete in less than "timeout" + * seconds and fails if they don't, in order to catch runaway loops. + */ + if (timeout > 0) { + struct sigaction sa = { + .sa_handler = sigalrm, + .sa_flags = SA_RESTART + }; + sigemptyset (&sa.sa_mask); + sigaction(SIGALRM, &sa, NULL); + } + + if (sigsetjmp(jump_env, 1) == 0) { + int status; + gchar *filepath; + + filepath = g_build_filename(datadir_path, filename, NULL); + + g_test_message("testing \"%s\", should return %d", + filename, expected); + if (timeout > 0) + alarm(timeout); + status = testfunc(filepath); + g_assert_cmpint(status, ==, expected); + + if (timeout > 0) { + status = alarm(0); /* cancel alarm */ + g_test_message("%d seconds left on %d second timer", + status, timeout); + } + + g_free(filepath); + } + else { + g_test_message("timed out reading %s", filename); + g_assertion_message(G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, + "test timed out"); + } + + errno = 0; + } + // g_assert_cmpint(errno, ==, 0); - not sure why this sometimes fails + + g_dir_close(datadir); +} + +/* + * Test all non-compressed files in a given subdir + */ +static void +TestAllNormalFiles(const char *subdir, int expected, testfilefunc testfunc) +{ + TestAllFilesByType(G_TEST_DIST, FALSE, subdir, expected, testfunc); +} + +/* + * Test all compressed files in a given subdir + */ +static void +TestAllCompressedFiles(const char *subdir, int expected, testfilefunc testfunc) +{ +#ifdef NO_ZPIPE + g_test_message("compression disabled, skipping compressed file tests"); +#else + TestAllFilesByType(G_TEST_BUILT, TRUE, subdir, expected, testfunc); +#endif +} diff --git a/lib/libXpm/test/XpmCreate.c b/lib/libXpm/test/XpmCreate.c new file mode 100644 index 000000000..78bfd297b --- /dev/null +++ b/lib/libXpm/test/XpmCreate.c @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include <X11/xpm.h> +#include <glib.h> + +#include "TestAllFiles.h" + + +/* + * XpmCreateXpmImageFromData - parse an XPM from data strings + * + * Todo: + * - actually check the returned info/image + * - check with data other than read from XPM files + */ +static int +TestCreateXpmImageFromData(const gchar *filepath) +{ + char **data = NULL; + int status; + + status = XpmReadFileToData(filepath, &data); + + if (status == XpmSuccess) { + XpmImage image; + XpmInfo info; + + g_assert_nonnull(data); + + status = XpmCreateXpmImageFromData(data, &image, &info); + g_assert_cmpint(status, ==, XpmSuccess); + + XpmFreeXpmImage(&image); + XpmFreeXpmInfo(&info); + XpmFree(data); + } + + return status; +} + +static void +test_XpmCreateXpmImageFromData(void) +{ + TestAllNormalFiles("good", XpmSuccess, TestCreateXpmImageFromData); + TestAllNormalFiles("invalid", XpmFileInvalid, TestCreateXpmImageFromData); + TestAllNormalFiles("no-mem", XpmNoMemory, TestCreateXpmImageFromData); + /* XpmReadFileToData calls XpmReadFileToXpmImage so it + supports compressed files */ + TestAllCompressedFiles("good", XpmSuccess, TestCreateXpmImageFromData); + TestAllCompressedFiles("invalid", XpmFileInvalid, TestCreateXpmImageFromData); + TestAllCompressedFiles("no-mem", XpmNoMemory, TestCreateXpmImageFromData); +} + + +/* + * XpmCreateXpmImageFromBuffer - parse an XPM from data strings + * + * Todo: + * - actually check the returned info/image + * - check with data other than read from XPM files + */ +static int +TestCreateXpmImageFromBuffer(const gchar *filepath) +{ + char *buffer = NULL; + XpmImage image; + XpmInfo info; + int status; + + status = XpmReadFileToBuffer(filepath, &buffer); + g_assert_cmpint(status, ==, XpmSuccess); + + status = XpmCreateXpmImageFromBuffer(buffer, &image, &info); + + if (status == XpmSuccess) { + XpmFreeXpmImage(&image); + XpmFreeXpmInfo(&info); + } + + XpmFree(buffer); + + return status; +} + +static void +test_XpmCreateXpmImageFromBuffer(void) +{ + TestAllNormalFiles("good", XpmSuccess, TestCreateXpmImageFromBuffer); + TestAllNormalFiles("invalid", XpmFileInvalid, TestCreateXpmImageFromBuffer); + TestAllNormalFiles("no-mem", XpmNoMemory, TestCreateXpmImageFromBuffer); + /* XpmReadFileToBuffer does not support compressed files */ +} + +int +main(int argc, char** argv) +{ + g_test_init(&argc, &argv, NULL); + g_test_bug_base(PACKAGE_BUGREPORT); + + g_test_add_func("/XpmCreate/XpmCreateXpmImageFromData", + test_XpmCreateXpmImageFromData); + g_test_add_func("/XpmCreate/XpmCreateXpmImageFromBuffer", + test_XpmCreateXpmImageFromBuffer); + + return g_test_run(); +} diff --git a/lib/libXpm/test/XpmMisc.c b/lib/libXpm/test/XpmMisc.c new file mode 100644 index 000000000..ef53c840c --- /dev/null +++ b/lib/libXpm/test/XpmMisc.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include <X11/xpm.h> +#include <glib.h> + +/* + * XpmAttributesSize - report size of XpmAttributes structure + */ + +static void +test_XpmAttributesSize(void) +{ + int size = XpmAttributesSize(); + g_assert_cmpint(size, ==, sizeof(XpmAttributes)); +} + +/* + * XpmGetErrorString - return string describing error code + */ + +static void +test_XpmGetErrorString(void) +{ + const char *es; + +#define TestErrorString(num, str) \ + es = XpmGetErrorString(num); \ + g_assert_nonnull(es); \ + g_assert_cmpstr(es, ==, str) + + TestErrorString(XpmColorError, "XpmColorError"); + TestErrorString(XpmSuccess, "XpmSuccess"); + TestErrorString(XpmOpenFailed, "XpmOpenFailed"); + TestErrorString(XpmFileInvalid, "XpmFileInvalid"); + TestErrorString(XpmNoMemory, "XpmNoMemory"); + TestErrorString(XpmColorFailed, "XpmColorFailed"); + TestErrorString(128, "Invalid XpmError"); + TestErrorString(-42, "Invalid XpmError"); + +#undef TestErrorString +} + +/* + * XpmLibraryVersion - report version of library + */ + +static void +test_XpmLibraryVersion(void) +{ + int version = XpmLibraryVersion(); + g_assert_cmpint(version, ==, XpmIncludeVersion); +} + +int +main(int argc, char** argv) +{ + g_test_init(&argc, &argv, NULL); + g_test_bug_base(PACKAGE_BUGREPORT); + + g_test_add_func("/XpmMisc/XpmAttributesSize", + test_XpmAttributesSize); + g_test_add_func("/XpmMisc/XpmGetErrorString", + test_XpmGetErrorString); + g_test_add_func("/XpmMisc/XpmLibraryVersion", + test_XpmLibraryVersion); + + return g_test_run(); +} diff --git a/lib/libXpm/test/XpmRead.c b/lib/libXpm/test/XpmRead.c new file mode 100644 index 000000000..df7a826f6 --- /dev/null +++ b/lib/libXpm/test/XpmRead.c @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include <X11/xpm.h> +#include <glib.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> + +#include "TestAllFiles.h" + +#ifndef g_assert_no_errno /* defined in glib 2.66 & later */ +#define g_assert_no_errno(n) g_assert_cmpint(n, >=, 0) +#endif + +/* + * XpmReadFileToXpmImage - Read XPM files without requiring an X Display + * + * Todo: actually check the returned image/info. + */ +static int +TestReadFileToXpmImage(const gchar *filepath) +{ + XpmImage image; + XpmInfo info; + int status; + + status = XpmReadFileToXpmImage(filepath, &image, &info); + + if (status == XpmSuccess) { + XpmFreeXpmImage(&image); + XpmFreeXpmInfo(&info); + } + + return status; +} + +static void +test_XpmReadFileToXpmImage(void) +{ + int status; + + status = TestReadFileToXpmImage("no-such-file.xpm"); + g_assert_cmpint(status, ==, XpmOpenFailed); + + TestAllNormalFiles("good", XpmSuccess, TestReadFileToXpmImage); + TestAllNormalFiles("invalid", XpmFileInvalid, TestReadFileToXpmImage); + TestAllNormalFiles("no-mem", XpmNoMemory, TestReadFileToXpmImage); + /* XpmReadFileToXpmImage supports compressed files */ + TestAllCompressedFiles("good", XpmSuccess, TestReadFileToXpmImage); + TestAllCompressedFiles("invalid", XpmFileInvalid, TestReadFileToXpmImage); + TestAllCompressedFiles("no-mem", XpmNoMemory, TestReadFileToXpmImage); +} + +/* + * XpmReadFileToData - wrapper around XpmReadFileToXpmImage that + * converts the image into a list of strings. + * + * Todo: actually check the returned data. + */ +static int +TestReadFileToData(const gchar *filepath) +{ + char **data = NULL; + int status; + + status = XpmReadFileToData(filepath, &data); + + if (status == XpmSuccess) { + XpmImage image; + XpmInfo info; + + g_assert_nonnull(data); + + status = XpmCreateXpmImageFromData(data, &image, &info); + g_assert_cmpint(status, ==, XpmSuccess); + + XpmFreeXpmImage(&image); + XpmFreeXpmInfo(&info); + XpmFree(data); + } + + return status; +} + +static void +test_XpmReadFileToData(void) +{ + int status; + + status = TestReadFileToData("no-such-file.xpm"); + g_assert_cmpint(status, ==, XpmOpenFailed); + + TestAllNormalFiles("good", XpmSuccess, TestReadFileToData); + TestAllNormalFiles("invalid", XpmFileInvalid, TestReadFileToData); + TestAllNormalFiles("no-mem", XpmNoMemory, TestReadFileToData); + /* XpmReadFileToData calls XpmReadFileToXpmImage so it + supports compressed files */ + TestAllCompressedFiles("good", XpmSuccess, TestReadFileToData); + TestAllCompressedFiles("invalid", XpmFileInvalid, TestReadFileToData); + TestAllCompressedFiles("no-mem", XpmNoMemory, TestReadFileToData); +} + + +/* + * XpmReadFileToBuffer - helper function that just reads the file + * into memory and doesn't try to parse it. + */ +static int +TestReadFileToBuffer(const gchar *filepath) +{ + char *buffer = NULL; + int status; + + status = XpmReadFileToBuffer(filepath, &buffer); + + if (status == XpmSuccess) { + char readbuf[8192]; + char *b = buffer; + int fd; + ssize_t rd; + + g_assert_nonnull(buffer); + + /* Read file ourselves and verify the data matches */ + g_assert_no_errno(fd = open(filepath, O_RDONLY)); + while ((rd = read(fd, readbuf, sizeof(readbuf))) > 0) { + g_assert_cmpmem(b, rd, readbuf, rd); + b += rd; + } + /* Verify a nil terminator was added to the end */ + g_assert_cmpint(b[0], ==, '\0'); + g_assert_no_errno(close(fd)); + + XpmFree(buffer); + } + + return status; +} + +static void +test_XpmReadFileToBuffer(void) +{ + int status; + + status = TestReadFileToBuffer("no-such-file.xpm"); + g_assert_cmpint(status, ==, XpmOpenFailed); + + TestAllNormalFiles("good", XpmSuccess, TestReadFileToBuffer); + /* Since this test just reads the file from disk without parsing, + we expect Success even from files with bad fields in. */ + TestAllNormalFiles("invalid", XpmSuccess, TestReadFileToBuffer); + TestAllNormalFiles("no-mem", XpmSuccess, TestReadFileToBuffer); + /* XpmReadFileToBuffer does not support compressed files */ +} + +int +main(int argc, char** argv) +{ + g_test_init(&argc, &argv, NULL); + g_test_bug_base(PACKAGE_BUGREPORT); + + g_test_add_func("/XpmRead/XpmReadFileToXpmImage", + test_XpmReadFileToXpmImage); + g_test_add_func("/XpmRead/XpmReadFileToData", + test_XpmReadFileToData); + g_test_add_func("/XpmRead/XpmReadFileToBuffer", + test_XpmReadFileToBuffer); + + return g_test_run(); +} diff --git a/lib/libXpm/test/XpmWrite.c b/lib/libXpm/test/XpmWrite.c new file mode 100644 index 000000000..49b5b2132 --- /dev/null +++ b/lib/libXpm/test/XpmWrite.c @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include <X11/xpm.h> + +#include <glib.h> +#include <glib/gstdio.h> + +#include <stdio.h> +#include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> + +#include "TestAllFiles.h" +#include "CompareXpmImage.h" + +#ifndef g_assert_no_errno /* defined in glib 2.66 & later */ +#define g_assert_no_errno(n) g_assert_cmpint(n, >=, 0) +#endif + +/* + * Check if a filename ends in ".Z" or ".gz" + */ +static inline gboolean +is_compressed(const char *filepath) +{ + const char *ext = strrchr(filepath, '.'); + + if ((ext != NULL) && + (((ext[1] == 'Z') && (ext[2] == 0)) || + ((ext[1] == 'g') && (ext[2] == 'z') && (ext[3] == 0)))) { + return TRUE; + } + + return FALSE; +} + +/* + * If a filename ends in ".Z" or ".gz", remove that extension to avoid + * confusing libXpm into applying compression when not desired. + */ +static inline void +strip_compress_ext(char *filepath) +{ + char *ext = strrchr(filepath, '.'); + + if ((ext != NULL) && + (((ext[1] == 'Z') && (ext[2] == 0)) || + ((ext[1] == 'g') && (ext[2] == 'z') && (ext[3] == 0)))) { + *ext = '\0'; + } +} + +/* + * XpmWriteFileFromXpmImage - Write XPM files without requiring an X Display + */ +static void +test_WFFXI_helper(const gchar *newfilepath, XpmImage *imageA, XpmInfo *infoA) +{ + XpmImage imageB; + XpmInfo infoB; + int status; + + g_test_message("...writing %s", newfilepath); + + status = XpmWriteFileFromXpmImage(newfilepath, imageA, infoA); + g_assert_cmpint(status, ==, XpmSuccess); + + if (is_compressed(newfilepath)) { + /* Wait a moment for the compression command to finish writing, + * since OpenWriteFile() does a double fork so we can't just wait + * for the child command to exit. + */ + usleep(10000); + } + + status = XpmReadFileToXpmImage(newfilepath, &imageB, &infoB); + g_assert_cmpint(status, ==, XpmSuccess); + + CompareXpmImage(imageA, &imageB); + XpmFreeXpmImage(&imageB); + XpmFreeXpmInfo(&infoB); + + status = remove(newfilepath); + g_assert_no_errno(status); + +} + +static int +TestWriteFileFromXpmImage(const gchar *filepath) +{ + XpmImage imageA; + XpmInfo infoA; + int status; + gchar *testdir, *filename, *newfilepath; + GError *err = NULL; + +#ifndef NO_ZPIPE + gchar *cmpfilepath; +#endif + + status = XpmReadFileToXpmImage(filepath, &imageA, &infoA); + g_assert_cmpint(status, ==, XpmSuccess); + + testdir = g_dir_make_tmp("XpmWrite-test-XXXXXX", &err); + g_assert_no_error(err); + + filename = g_path_get_basename(filepath); + strip_compress_ext(filename); + newfilepath = g_build_filename(testdir, filename, NULL); + + test_WFFXI_helper(newfilepath, &imageA, &infoA); + +#ifndef NO_ZPIPE + cmpfilepath = g_strdup_printf("%s.gz", newfilepath); + test_WFFXI_helper(cmpfilepath, &imageA, &infoA); + g_free(cmpfilepath); + +#ifdef XPM_PATH_COMPRESS + cmpfilepath = g_strdup_printf("%s.Z", newfilepath); + test_WFFXI_helper(cmpfilepath, &imageA, &infoA); + g_free(cmpfilepath); +#endif +#endif + + XpmFreeXpmImage(&imageA); + XpmFreeXpmInfo(&infoA); + + g_assert_no_errno(g_rmdir(testdir)); + + g_free(newfilepath); + g_free(filename); + g_free(testdir); + + return status; +} + +static void +test_XpmWriteFileFromXpmImage(void) +{ + /* Todo: verify trying to write to an unwritable file fails */ + + TestAllNormalFiles("good", XpmSuccess, TestWriteFileFromXpmImage); + /* XpmReadFileToXpmImage supports compressed files */ + TestAllCompressedFiles("good", XpmSuccess, TestWriteFileFromXpmImage); +} + +/* + * XpmWriteFileFromData - wrapper around XpmWriteFileFromXpmImage that + * converts the image into a list of strings. + */ +static void +test_WFFXD_helper(const gchar *newfilepath, char **dataA) +{ + char **dataB; + int status; + + g_test_message("...writing %s", newfilepath); + + status = XpmWriteFileFromData(newfilepath, dataA); + g_assert_cmpint(status, ==, XpmSuccess); + + if (is_compressed(newfilepath)) { + /* Wait a moment for the compression command to finish writing, + * since OpenWriteFile() does a double fork so we can't just wait + * for the child command to exit. + */ + usleep(10000); + } + + status = XpmReadFileToData(newfilepath, &dataB); + g_assert_cmpint(status, ==, XpmSuccess); + + /* Todo: compare data fields */ + XpmFree(dataB); + + status = remove(newfilepath); + g_assert_no_errno(status); + +} + +static int +TestWriteFileFromData(const gchar *filepath) +{ + char **data = NULL; + int status; + gchar *testdir, *filename, *newfilepath; + GError *err = NULL; + +#ifndef NO_ZPIPE + gchar *cmpfilepath; +#endif + + status = XpmReadFileToData(filepath, &data); + g_assert_cmpint(status, ==, XpmSuccess); + + testdir = g_dir_make_tmp("XpmWrite-test-XXXXXX", &err); + g_assert_no_error(err); + + filename = g_path_get_basename(filepath); + strip_compress_ext(filename); + newfilepath = g_build_filename(testdir, filename, NULL); + + test_WFFXD_helper(newfilepath, data); + +#ifndef NO_ZPIPE + cmpfilepath = g_strdup_printf("%s.gz", newfilepath); + test_WFFXD_helper(cmpfilepath, data); + g_free(cmpfilepath); + +#ifdef XPM_PATH_COMPRESS + cmpfilepath = g_strdup_printf("%s.Z", newfilepath); + test_WFFXD_helper(cmpfilepath, data); + g_free(cmpfilepath); +#endif +#endif + + XpmFree(data); + + g_assert_no_errno(g_rmdir(testdir)); + + g_free(newfilepath); + g_free(filename); + g_free(testdir); + + return status; +} + +static void +test_XpmWriteFileFromData(void) +{ + /* Todo - verify trying to write to an unwritable file fails */ + + TestAllNormalFiles("good", XpmSuccess, TestWriteFileFromData); + /* XpmReadFileToData calls XpmReadFileToXpmImage so it + supports compressed files */ + TestAllCompressedFiles("good", XpmSuccess, TestWriteFileFromData); +} + +/* + * XpmWriteFileFromBuffer - helper function to write files & read them back in + * XpmWriteFileFromBuffer() does not support compressed files. + */ +static int +TestWriteFileFromBuffer(const gchar *filepath) +{ + char *buffer = NULL; + gchar *testdir, *filename, *newfilepath; + GError *err = NULL; + int status; + + status = XpmReadFileToBuffer(filepath, &buffer); + g_assert_cmpint(status, ==, XpmSuccess); + g_assert_nonnull(buffer); + + testdir = g_dir_make_tmp("XpmWrite-test-XXXXXX", &err); + g_assert_no_error(err); + + filename = g_path_get_basename(filepath); + strip_compress_ext(filename); + newfilepath = g_build_filename(testdir, filename, NULL); + g_test_message("...writing %s", newfilepath); + + status = XpmWriteFileFromBuffer(newfilepath, buffer); + g_assert_cmpint(status, ==, XpmSuccess); + + if (status == XpmSuccess) { + char readbuf[8192]; + char *b = buffer; + int fd; + ssize_t rd; + + /* Read file ourselves and verify the data matches */ + g_assert_no_errno(fd = open(newfilepath, O_RDONLY)); + while ((rd = read(fd, readbuf, sizeof(readbuf))) > 0) { + g_assert_cmpmem(b, rd, readbuf, rd); + b += rd; + } + /* Verify we're at the end of the buffer */ + g_assert_cmpint(b[0], ==, '\0'); + + g_assert_no_errno(close(fd)); + g_assert_no_errno(remove(newfilepath)); + } + XpmFree(buffer); + + g_assert_no_errno(g_rmdir(testdir)); + + g_free(newfilepath); + g_free(filename); + g_free(testdir); + + return status; +} + +static void +test_XpmWriteFileFromBuffer(void) +{ + /* Todo: verify trying to write to an unwritable file fails */ + + TestAllNormalFiles("good", XpmSuccess, TestWriteFileFromBuffer); + /* XpmReadFileToBuffer does not support compressed files */ +} + +int +main(int argc, char** argv) +{ + g_test_init(&argc, &argv, NULL); + g_test_bug_base(PACKAGE_BUGREPORT); + + + g_test_add_func("/XpmRead/XpmWriteFileFromXpmImage", + test_XpmWriteFileFromXpmImage); + g_test_add_func("/XpmRead/XpmWriteFileFromData", + test_XpmWriteFileFromData); + g_test_add_func("/XpmRead/XpmWriteFileFromBuffer", + test_XpmWriteFileFromBuffer); + + return g_test_run(); +} diff --git a/lib/libXpm/test/pixmaps/good/BlueCurves.xpm b/lib/libXpm/test/pixmaps/good/BlueCurves.xpm new file mode 100644 index 000000000..b5909b3e5 --- /dev/null +++ b/lib/libXpm/test/pixmaps/good/BlueCurves.xpm @@ -0,0 +1,122 @@ +/* XPM */ +/* + * Copyright (c) 2004, 2006, Oracle and/or its affiliates. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +static char *suncurve_big_blue[] = { +/* width height num_colors chars_per_pixel */ +" 32 80 12 1", +/* colors */ +". c #567c9a", +"# c #5b82a0", +"a c #5f87a4", +"b c #678eab", +"c c #6990ad", +"d c #628ba7", +"e c #4e7593", +"f c #517997", +"g c #5e86a4", +"h c #5a819f", +"i c #658daa", +"j c #6a92ae", +/* pixels */ +"jjjjjjjjjjjjjjjjj#gggggg.#jjjjjj", +"jjjjjjjjjjjjjjjjjh#gggggh.jjjjjj", +"jjjjjjjjjjjjjjjjjhhgggggg.djjjjj", +"jjjjjjjjjjjjjjjjjhhhgggggggjjjjj", +"jjjjjjjjjjjjjjjjjhhh#gggddhjjjjj", +"jjjjjjjjjjjjjjjjjhhhh#ggib.jjjjj", +"jjjjjjjjjjjjjjjjjhhhhhggcjhijjjj", +"jjjjjjjjjjjjjjjjjhhhhh#djj#djjjj", +"jjjjjjjjjjjjjjjjjhhhhhhbjjgajjjj", +"jjjjjjjjjjjjjjjjjhhhhhaicjagjjjj", +"jjjjjjjjjjjjjjjjjhhhh#iibjd#jjjj", +"jjjjjjjjjjjjjjjjjhhh#diiici#jjjj", +"jjjjjjjjjjjjjjjjjhhhdiiiibi#jjjj", +"jjjjjjjjjjjjjjjjjhhaiiiiiii#jjjj", +"jjjjjjjjjjjjjjjjchgiiiiiiid#jjjj", +"jjjjjjjjjjjjjjjc.giiiiiiiighjjjj", +"jjjjjjjjjjjjjjj.fiiiiiiiii#hjjjj", +"jjjjjjjjjjjjjj#fhiiiiiiiiih#jjjj", +"jjjjjjjjjjjjjgfhhiiiiiiiii.gcjjj", +"jjjjjjjjjjjjdf.hhiiiiiiiiifdcjjj", +"jjjjjjjjjjjcf.hhhiiiiiiiia.ibjjj", +"jjjjjjjjjjjhfhhhhiiiiiiiihhiijjj", +"jjjjjjjjjjafhhhhhiiiiiiiifdiijjj", +"jjjjjjjjjbf.hhhhhiiiiiii#.iiicjj", +"jjjjjjjjj#.hhhhhhiiiiiiifgiiicjj", +"jjjjjjjjifhhhhhhhiiiiiih.iiiibjj", +"jjjjjjjjh.hhhhhhhiiiiiafaiiiibjj", +"jjjjjjjbfhhhhhhhhiiiii.hiiiiibjj", +"jjjjjjjg.#hhhhhhhiiiih.iiiiiibjj", +"jjjjjjc.#hhhhhhhhiiigfdiiiiiibjj", +"jjjjjjdfahhhhhhhhiiafaiiiiiiiijj", +"jjjjjcg.ghhhhhhhhidfgiiiiiiiiijj", +"jjjjjbh#ghhhhhhhhdfhiiiiiiiiiijj", +"jjjjji.a#hhhhhhhh.hiiiiiiiiiiijj", +"jjjjcifihhhhhhhhhhiiiiiiiiiiibjj", +"jjjjba.ihhhhhhhhhiiiiiiiiiiiibjj", +"jjjjbahihhhhhhhhhiiiiiiiiiiiibjj", +"jjjjih#ihhhhhhhhhiiiiiiiiiiiicjj", +"jjjcihgihhhhhhhhhiiiiiiiiiiiicjj", +"jjjci.aihhhhhhhhhiiiiiiiiiiiijjj", +"jjjbi.aihhhhhhhhhiiiiiiiiiiibjjj", +"jjjbi.ai#hhhhhhhhiiiiiiiiiiicjjj", +"jjjbi.aighhhhhhhhiiiiiiiiiiijjjj", +"jjjbi.aighhhhhhhhiiiiiiiiiibjjjj", +"jjjii.gidhhhhhhhhiiiiiiiiiijjjjj", +"jjjiih#idhhhhhhhhiiiiiiiiibjjjjj", +"jjjii#hii#hhhhhhhiiiiiiiiijjjjjj", +"jjjiia.iiahhhhhhhiiiiiiiicjjjjjj", +"jjjiiafiidhhhhhhhiiiiiiibjjjjjjj", +"jjjiiifdiighhhhhhiiiiiiijjjjjjjj", +"jjjiii.aiidhhhhhhiiiiiicjjjjjjjj", +"jjjbiihhiiiahhhhhiiiiicjjjjjjjjj", +"jjjbiia.iiii#hhhhiiiibjjjjjjjjjj", +"jjjbiiifdiiidhhhhiiibjjjjjjjjjjj", +"jjjbiiihhiiiiahhhiibjjjjjjjjjjjj", +"jjjciiidfiiiiighhibjjjjjjjjjjjjj", +"jjjciiii.#iiiii#hicjjjjjjjjjjjjj", +"jjjjiiiiafiiiiid#cjjjjjjjjjjjjjj", +"jjjjbiiii.hiiiiidcjjjjjjjjjjjjjj", +"jjjjbiiiidfdiiiiiacjjjjjjjjjjjjj", +"jjjjciiiiih.iiiiigdjjjjjjjjjjjjj", +"jjjjjiiiiii.#iiiiggdjjjjjjjjjjjj", +"jjjjjbiiiiidfaiiigggbjjjjjjjjjjj", +"jjjjjciiiiiigfiiigggacjjjjjjjjjj", +"jjjjjjbiiiiiih.iiggggdjjjjjjjjjj", +"jjjjjjciiiiiii.higggggcjjjjjjjjj", +"jjjjjjjiiiiiiidfggggggdjjjjjjjjj", +"jjjjjjjciiiiiiiafhgggggcjjjjjjjj", +"jjjjjjjjbiiiiiiige#ggggdjjjjjjjj", +"jjjjjjjjciiiiiiii.egggggjjjjjjjj", +"jjjjjjjjjbiiiiiiigffggggbjjjjjjj", +"jjjjjjjjjjiiiiiiigge.gggijjjjjjj", +"jjjjjjjjjjciiiiiigghehggdjjjjjjj", +"jjjjjjjjjjjbiiiiiggg.egggjjjjjjj", +"jjjjjjjjjjjjbiiiiggggf.ggcjjjjjj", +"jjjjjjjjjjjjjiiiigggg#e#gbjjjjjj", +"jjjjjjjjjjjjjciiiggggg.fgbjjjjjj", +"jjjjjjjjjjjjjjciiggggggehbjjjjjj", +"jjjjjjjjjjjjjjjbigggggg.fijjjjjj", +"jjjjjjjjjjjjjjjjbgggggggedjjjjjj" +}; diff --git a/lib/libXpm/test/pixmaps/good/Dimple.xpm b/lib/libXpm/test/pixmaps/good/Dimple.xpm new file mode 100644 index 000000000..5601df125 --- /dev/null +++ b/lib/libXpm/test/pixmaps/good/Dimple.xpm @@ -0,0 +1,79 @@ +/* XPM */ +/* + * Copyright (c) 1993, 1995, Oracle and/or its affiliates. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +static char * Dimple_pm[] = { +/* width height ncolors cpp [x_hot y_hot] */ +"48 48 3 1 0 0", +/* colors */ +" s background m black c #949494949494", +". s topShadowColor m white c #bdbdbdbdbdbd", +"X s bottomShadowColor m black c #636363636363", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" . ", +" ... ", +" ... ", +" . X ", +" X ", +" XX ", +" XX ", +" XXXX ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" . ", +" ... ", +" ... ", +" . X ", +" X ", +" XX ", +" XX ", +" XXXX ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/lib/libXpm/test/pixmaps/good/Dolphins.xpm b/lib/libXpm/test/pixmaps/good/Dolphins.xpm new file mode 100644 index 000000000..a491dfb94 --- /dev/null +++ b/lib/libXpm/test/pixmaps/good/Dolphins.xpm @@ -0,0 +1,94 @@ +/* XPM */ +/* + * Copyright (c) 1993, 1995, Oracle and/or its affiliates. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +static char * Dolphins_pm[] = { +/* width height ncolors cpp [x_hot y_hot] */ +"64 64 2 1 0 0", +/* colors */ +" s background m black c #949494949494", +". s topShadowColor m white c #bdbdbdbdbdbd", +/* pixels */ +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . ... . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . ... . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . ....... . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . ........... . . . . . . . . . . . . . . . . . ", +" . . . . . . . . ............... . . . . . . . . . . . . . . . .", +". . . . . . . . ................. . . . . . . . . . . . . . . . ", +" . . . . . . . ................... . . . . . . . . . . . . . . .", +". . . . . . . ..................... . . . . . . . . . . . . . . ", +" . . . . . . ...... ... . . . . . . . . . . . . . .", +". . . . . . ..... . ..... . . . . . . . . . . . . . . . . . . ", +" . . . . . .... . . . .. . . . . . . . . . . . . . . . . . . .", +". . . . . .... . . . ... . . . . . . . . . . . . . . . . . . . ", +" . . . . .... . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . .... . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . ... . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . .... . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . ... . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . . . . ... . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . ..... . . . . . . . . . . . .", +". . . . . . . . . . . . . . . . ....... . . . ... . . . . . . . ", +" . . . . . . . . . . . . . . . ........... . . ... . . . . . . .", +". . . . . . . . . . . . . . . . ................ . . . . . ", +" . . . . . . . . . . . . . . . . . . .................. . . . .", +". . . . . . . . . . . . . . . . . . . .................... . . ", +" . . . . . . . . . . . . . . . . . . . .................... . .", +". . . . . . . . . . . . . . . . . . . . .................. . ", +" . . . . . . . . . . . . . . . . . . . . . ................. .", +". . . . . . . . . . . . . . . . . . . . . . ... . ", +" . . . . . . . . . . . . . . . . . . . . . . . . ..... . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . ... . . . . . .", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "}; diff --git a/lib/libXpm/test/pixmaps/good/Miniweave.xpm b/lib/libXpm/test/pixmaps/good/Miniweave.xpm new file mode 100644 index 000000000..492cec6c6 --- /dev/null +++ b/lib/libXpm/test/pixmaps/good/Miniweave.xpm @@ -0,0 +1,63 @@ +/* XPM */ +/* + * Copyright (c) 1993, 1995, Oracle and/or its affiliates. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +static char * Miniweave_pm[] = { +/* width height ncolors cpp [x_hot y_hot] */ +"32 32 2 1 0 0", +/* colors */ +" s selectColor m white c #737373737373", +". s background m black c #949494949494", +/* pixels */ +" .. .. .. .. .. .. .. ..", +".... ..... ..... ..... .", +"..... ..... ..... ..... ", +" .. .. .. .. .. .. .. .. ", +".. .. .. .. .. .. .. .. ", +". ..... ..... ..... ....", +" ..... ..... ..... .....", +" .. .. .. .. .. .. .. .. ", +" .. .. .. .. .. .. .. ..", +".... ..... ..... ..... .", +"..... ..... ..... ..... ", +" .. .. .. .. .. .. .. .. ", +".. .. .. .. .. .. .. .. ", +". ..... ..... ..... ....", +" ..... ..... ..... .....", +" .. .. .. .. .. .. .. .. ", +" .. .. .. .. .. .. .. ..", +".... ..... ..... ..... .", +"..... ..... ..... ..... ", +" .. .. .. .. .. .. .. .. ", +".. .. .. .. .. .. .. .. ", +". ..... ..... ..... ....", +" ..... ..... ..... .....", +" .. .. .. .. .. .. .. .. ", +" .. .. .. .. .. .. .. ..", +".... ..... ..... ..... .", +"..... ..... ..... ..... ", +" .. .. .. .. .. .. .. .. ", +".. .. .. .. .. .. .. .. ", +". ..... ..... ..... ....", +" ..... ..... ..... .....", +" .. .. .. .. .. .. .. ..."}; diff --git a/lib/libXpm/test/pixmaps/good/Squares.xpm b/lib/libXpm/test/pixmaps/good/Squares.xpm new file mode 100644 index 000000000..6a8cd8725 --- /dev/null +++ b/lib/libXpm/test/pixmaps/good/Squares.xpm @@ -0,0 +1,62 @@ +/* XPM */ +/* + * Copyright (c) 1993, 1995, Oracle and/or its affiliates. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +static char * Squares_pm[] = { +/* width height ncolors cpp [x_hot y_hot] */ +"32 32 2 1 0 0", +/* colors */ +" s bottomShadowColor m black c #636363636363", +". s selectColor m white c #737373737373", +/* pixels */ +" . . ", +" . ...... . ", +"... . . ...", +" . . ", +" . . ", +" ...... . . ", +" . . ...... ", +" . . ", +" . . ", +" . . ...... ", +" ...... . . ", +" . . ", +" . . ", +" ...... . . ", +" . . ...... ", +" . . ", +" . . ", +" ...... . . ", +" . . ...... ", +" . . ", +" . . ", +" . . ...... ", +" ...... . . ", +" . . ", +" . . ", +" ...... . . ", +" . . ...... ", +" . . ", +" . . ", +"... . . ...", +" . ...... . ", +" . . "}; diff --git a/lib/libXpm/test/pixmaps/good/Swirl.xpm b/lib/libXpm/test/pixmaps/good/Swirl.xpm new file mode 100644 index 000000000..f9b15ee2d --- /dev/null +++ b/lib/libXpm/test/pixmaps/good/Swirl.xpm @@ -0,0 +1,62 @@ +/* XPM */ +/* + * Copyright (c) 1993, 1995, Oracle and/or its affiliates. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +static char * Swirl_pm[] = { +/* width height ncolors cpp [x_hot y_hot] */ +"32 32 2 1 0 0", +/* colors */ +" s topShadowColor m white c #bdbdbdbdbdbd", +". s background m black c #949494949494", +/* pixels */ +" . ... .", +" .. ", +" . . ", +" . . ... .. ", +" .... . . ... ... ", +" .... ........... ", +". .... ........ .", +"...... ..... . . . ..", +" ... ......... . ", +" ......... . . ", +" . ... . . . .. . . ", +" . . .. . . .. . . ", +".. ... . ..", +". ... .... ....", +" . ....... . ..", +". .. . .... . . ", +" .. .. . . . ", +". . .... .", +" . . ........ .. . ", +" ............ ... . .. . . ", +". ...... ... . . . . . . .", +" ....... ", +" ..... . .. . . .. .. ...", +" ....... .... .. ....", +" . ....... .... .", +". . . . ... . .. .. . ", +"...... . . .. .. ...... ", +" .. ... ... ......... ", +" . . . ... ... ", +" ..... .. .. ... ... ", +". ..... .. .. .. .. ..", +".... . . .... .. ."}; diff --git a/lib/libXpm/test/pixmaps/good/Utah-teapot.xpm b/lib/libXpm/test/pixmaps/good/Utah-teapot.xpm new file mode 100644 index 000000000..e200f9752 --- /dev/null +++ b/lib/libXpm/test/pixmaps/good/Utah-teapot.xpm @@ -0,0 +1,407 @@ +/* XPM */ +/* Conversion to XPM of image from + * https://commons.wikimedia.org/wiki/File:Utah_teapot_simple_2.png + * which is licensed CC BY-SA 3.0: + * https://creativecommons.org/licenses/by-sa/3.0/deed.en + */ +static const char *Utah_teapot[] = { +/* columns rows colors chars-per-pixel */ +"320 212 184 2 ", +" c #040405", +". c #070709", +"X c #0B0B0D", +"o c #0F0F12", +"O c #121215", +"+ c #161619", +"@ c #1A1A1D", +"# c #1E1E22", +"$ c #212126", +"% c #25252A", +"& c #29292E", +"* c #28272D", +"= c #2D2D33", +"- c #2F2F38", +"; c #302F36", +": c #313136", +"> c #34343B", +", c #38383F", +"< c #38373E", +"1 c #373741", +"2 c #383741", +"3 c #3B3B43", +"4 c #3E3E49", +"5 c #403F46", +"6 c #404047", +"7 c #43434C", +"8 c #49494F", +"9 c #48474F", +"0 c #464652", +"q c #4B4B54", +"w c #4D4D5A", +"e c #484755", +"r c #504F5A", +"t c #4F505A", +"y c #505056", +"u c #53535C", +"i c #58585F", +"p c #58575D", +"a c #555562", +"s c #5B5B64", +"d c #5C5C6B", +"f c #585768", +"g c #5F5F70", +"h c #605F67", +"j c #605F69", +"k c #5F6069", +"l c #616167", +"z c #63636C", +"x c #68686F", +"c c #646473", +"v c #686770", +"b c #696971", +"n c #6D6D75", +"m c #6B6B74", +"M c #676779", +"N c #68677A", +"B c #6B6B7C", +"V c #706F78", +"C c #6F707D", +"Z c #707077", +"A c #717179", +"S c #73737C", +"D c #78777E", +"F c #78787F", +"G c #6E6E81", +"H c #706F83", +"J c #737384", +"K c #787782", +"L c #7D7D86", +"P c #7B7B84", +"I c #767689", +"U c #78778B", +"Y c #7B7B8B", +"T c #7E7E91", +"R c #807F89", +"E c #808087", +"W c #80808A", +"Q c #83838C", +"! c #88888F", +"~ c #858592", +"^ c #888793", +"/ c #8C8C94", +"( c #878799", +") c #8D8D9A", +"_ c #878893", +"` c #908F97", +"' c #8F9097", +"] c #8F9099", +"[ c #909097", +"{ c #93939C", +"} c #98979F", +"| c #98989F", +" . c #8F8FA1", +".. c #908FA0", +"X. c #9595A2", +"o. c #9E9EA6", +"O. c #9B9BA4", +"+. c #9797A8", +"@. c #9D9DAA", +"#. c #9897A4", +"$. c #9F9FB0", +"%. c #A09FA7", +"&. c #A09FAD", +"*. c #9FA0AB", +"=. c #A0A0A7", +"-. c #A3A3AB", +";. c #A3A3AA", +":. c #A1A1A9", +">. c #A4A3AB", +",. c #A4A4AB", +"<. c #A4A4AC", +"1. c #A5A5AC", +"2. c #A5A5AD", +"3. c #A5A4AC", +"4. c #A6A5AD", +"5. c #A6A6AD", +"6. c #A6A6AE", +"7. c #A7A7AE", +"8. c #A7A7AF", +"9. c #A7A6AE", +"0. c #A4A4AC", +"q. c #A8A7AF", +"w. c #A8A7AF", +"e. c #A8A8AF", +"r. c #A8A8AF", +"t. c #A5A5B2", +"y. c #A8A7B0", +"u. c #A8A8B0", +"i. c #A9A8B0", +"p. c #A9A9B0", +"a. c #A9A9B1", +"s. c #AAA9B1", +"d. c #AAAAB1", +"f. c #AAAAB2", +"g. c #ABAAB2", +"h. c #ABABB2", +"j. c #ABABB3", +"k. c #ACABB3", +"l. c #ACACB3", +"z. c #ACACB4", +"x. c #ADACB4", +"c. c #ADADB4", +"v. c #ADADB5", +"b. c #AEADB5", +"n. c #AEAEB5", +"m. c #AFAFB5", +"M. c #AEAEB6", +"N. c #AFAFB6", +"B. c #ACACB4", +"V. c #AEAEB9", +"C. c #B0AFB7", +"Z. c #B0AFB9", +"A. c #B0B0B7", +"S. c #B1B1B8", +"D. c #B3B3BB", +"F. c #B5B5BD", +"G. c #B3B3BB", +"H. c #B8B7BF", +"J. c #B8B8BF", +"K. c #AFAFC0", +"L. c #B6B6C1", +"P. c #B8B7C1", +"I. c #BBBBC4", +"U. c #BEBEC9", +"Y. c #C0BFC7", +"T. c #C0BFC9", +"R. c #C0C0C7", +"E. c #C3C3CC", +"W. c #C6C6D1", +"Q. c #C8C7D1", +"!. c #CBCBD4", +"~. c #CECED9", +"^. c #D0CFDA", +"/. c #D3D2DC", +"(. c #D6D6E1", +"). c #D8D7E2", +"_. c #DADAE4", +"`. c #DEDEE9", +"'. c #E0DFEA", +"]. c #E3E3ED", +"[. c #E6E6F1", +"{. c #E8E7F2", +"}. c #EAEAF4", +"|. c #EEEEF8", +/* pixels */ +"a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.e.e.e.e.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.a.a.2.2.2.2.2.2.2.2.a.a.2.2.2.2.2.2.2.2.2.a.e.e.2.2.2.2.e.e.e.e.e.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.,.,.,.,.,.,.,.,.,.>.>.:.:.:.:.:.:.:.:.:.:.:.:.", +"a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.a.a.a.a.a.a.a.t.2.a.a.a.a.a.a.e.2.a.a.a.a.a.a.a.a.2.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.e.e.e.e.q.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.a.a.2.2.2.2.2.2.2.2.a.a.2.2.2.2.a.2.2.2.a.a.a.a.2.2.2.2.a.a.a.e.e.e.2.2.2.2.e.e.e.e.2.2.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.,.,.,.,.,.,.,.,.,.,.,.,.>.>.:.:.:.:.", +"a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.t.2.a.a.a.a.a.a.e.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.2.a.a.a.a.a.e.a.q.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.a.a.e.e.q.q.2.2.2.2.a.a.2.2.2.2.2.2.2.2.a.a.2.2.a.a.a.a.2.2.2.2.a.2.2.2.2.2.a.a.a.a.2.2.2.2.2.2.2.2.a.e.2.e.e.e.e.2.e.2.2.2.e.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.,.,.,.2.,.,.,.,.,.,.,.", +"a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.a.a.e.e.q.q.2.2.2.2.a.a.2.2.2.a.a.a.2.2.2.2.2.2.2.2.2.e.e.a.2.2.2.2.2.2.2.2.2.2.e.e.2.2.2.2.e.q.2.2.2.2.e.e.e.2.2.2.2.e.e.e.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.,.,.,.", +"a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.e.e.q.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.a.a.a.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.e.e.e.e.e.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.e.e.e.e.q.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.a.a.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.t.t.e.e.e.e.2.2.q.2.e.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.a.a.a.a.a.e.e.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.a.a.e.e.e.e.a.e.q.q.2.2.2.2.2.a.2.2.2.2.2.2.a.a.a.a.2.2.2.2.a.a.2.a.2.2.2.e.e.e.2.2.2.e.a.a.e.2.2.2.e.2.2.2.e.e.e.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.a.a.a.a.e.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.e.a.e.e.q.q.2.2.a.a.a.a.e.e.e.e.e.a.a.a.2.2.2.e.e.e.2.2.2.2.a.a.2.2.2.2.2.2.2.2.2.a.a.a.2.2.2.2.2.2.e.e.e.e.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.e.e.e.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.a.a.2.2.2.2.2.e.2.2.e.e.e.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"a.a.a.a.z.a.a.a.k.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.e.e.e.q.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.a.a.2.2.2.2.2.2.2.a.2.2.2.2.q.2.2.2.2.a.a.a.a.e.e.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"a.a.l.k.z.z.a.a.a.a.a.a.a.a.l.l.a.a.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.a.a.a.a.a.a.a.e.e.e.e.e.e.e.e.e.e.q.2.2.2.2.a.a.a.a.2.2.2.2.2.2.a.a.2.2.2.2.2.2.2.e.2.2.a.a.a.a.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"a.a.z.z.z.z.a.a.a.l.a.a.a.a.z.z.z.z.z.z.a.l.a.a.k.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.a.a.a.q.q.2.2.2.2.a.a.a.a.2.2.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.e.e.a.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"a.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.z.z.z.z.z.z.z.z.a.a.a.a.a.a.l.a.a.l.a.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.e.e.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.a.a.e.2.2.2.2.2.2.e.e.2.2.2.e.e.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"a.l.z.z.z.z.a.a.a.a.a.z.a.a.a.a.a.a.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.l.z.a.a.a.a.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.e.q.q.2.2.2.2.2.2.a.2.2.2.a.q.e.2.2.2.2.2.2.e.e.2.2.2.2.e.a.2.2.q.2.2.2.2.2.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"k.k.z.z.z.z.a.a.a.a.z.z.z.z.a.a.a.a.a.a.a.a.z.z.a.a.a.a.a.a.a.a.a.l.l.l.a.a.a.a.z.l.a.a.a.l.l.l.a.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.e.q.2.2.2.2.2.2.2.2.2.q.e.e.e.2.2.2.2.e.2.2.2.a.a.a.q.2.e.q.q.2.2.2.2.e.q.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.l.k.a.z.z.z.z.z.z.a.a.a.a.a.a.z.a.a.a.a.a.a.a.a.a.k.k.l.l.a.a.a.a.z.z.a.a.a.a.z.z.a.l.l.l.a.a.a.l.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.e.q.2.q.e.e.e.2.2.2.2.2.2.2.2.a.a.a.e.2.e.e.q.2.2.2.e.e.e.2.2.2.2.2.2.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.k.a.a.a.a.a.a.a.a.a.a.a.a.a.z.z.a.z.z.z.a.a.a.a.a.a.z.z.a.a.a.a.a.a.a.a.a.a.a.z.z.z.a.a.a.a.a.a.l.l.l.l.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.e.e.e.e.e.e.e.q.2.2.2.2.2.2.2.2.2.2.2.2.a.a.e.2.2.2.a.2.2.a.a.a.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.a.a.a.a.z.z.a.z.z.z.a.a.a.a.a.z.z.z.a.a.a.a.a.a.a.a.a.a.l.z.z.z.a.a.a.a.z.a.z.a.z.z.z.z.a.a.a.a.z.z.a.a.l.l.a.a.a.a.k.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.2.2.2.2.2.2.t.2.2.2.2.2.2.2.2.a.a.a.2.2.2.2.2.e.2.2.2.2.e.e.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.k.z.a.a.z.z.a.a.a.a.a.a.z.z.a.a.a.a.z.z.a.a.a.a.a.a.z.z.a.a.z.z.z.z.a.a.a.a.a.a.a.a.k.l.z.z.a.a.a.a.a.a.z.a.z.z.a.a.l.l.a.a.a.a.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.q.2.2.2.2.2.2.2.2.2.2.a.2.2.2.2.a.a.a.e.a.2.2.2.2.2.2.e.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.k.z.z.z.z.a.a.z.z.a.a.a.a.a.a.z.z.a.a.z.z.z.z.a.a.a.a.a.a.a.a.k.z.z.z.a.a.a.a.a.a.a.a.z.z.l.a.z.z.a.a.a.a.z.z.a.a.a.a.l.l.l.l.l.a.a.a.a.k.k.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.2.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.2.e.2.2.2.2.2.a.2.2.2.a.a.a.a.e.a.2.2.2.2.2.2.a.2.2.e.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.k.k.a.a.a.a.a.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.z.a.a.a.z.z.l.l.a.a.a.a.z.l.a.a.a.a.a.z.z.z.z.z.k.a.a.a.a.a.a.a.z.a.a.a.z.z.l.l.l.a.a.a.a.a.a.a.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.2.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.2.2.2.2.2.2.2.2.2.2.a.a.e.2.2.2.2.2.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.k.k.a.a.a.a.a.a.a.a.a.a.z.z.z.l.l.l.a.a.a.a.z.l.a.a.a.a.a.a.a.z.z.z.k.a.a.a.a.a.a.a.z.a.a.a.z.z.z.z.z.z.a.a.a.a.a.a.z.z.z.a.l.a.a.l.l.l.l.l.k.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.q.q.2.2.2.2.2.2.a.a.e.2.2.2.q.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.z.k.a.l.a.z.z.a.a.a.a.a.a.a.a.a.a.a.a.z.z.a.a.a.a.a.a.z.z.z.a.a.a.z.a.z.z.a.a.a.a.a.a.a.z.z.z.a.a.a.a.l.a.z.z.a.a.a.a.l.a.a.a.a.a.a.a.a.a.l.l.k.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.l.z.k.l.a.a.a.l.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.a.a.2.2.2.2.a.a.a.a.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.k.k.a.a.a.a.z.z.a.a.a.a.z.z.z.z.z.z.a.a.a.a.l.a.a.a.a.a.a.a.a.z.z.z.a.a.a.a.a.a.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.z.z.z.z.z.z.a.a.a.l.l.l.l.l.a.a.a.l.l.a.k.l.a.a.a.a.z.z.a.a.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.a.a.a.a.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.k.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.z.a.a.a.a.z.z.a.a.a.a.z.z.a.a.z.z.z.z.z.z.z.z.z.z.a.a.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.q.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.k.k.a.a.a.a.a.a.a.a.a.z.z.z.z.a.a.a.a.a.a.a.a.a.l.a.z.a.z.z.z.a.a.a.a.a.a.a.a.z.z.z.z.z.z.z.z.a.a.a.a.a.z.z.z.a.a.a.a.a.k.a.z.a.a.a.a.a.a.z.z.z.z.a.a.l.l.a.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.z.z.z.z.z.z.a.a.a.a.a.a.z.z.z.z.a.a.z.z.a.a.a.a.a.a.a.a.a.a.z.z.a.l.a.a.a.a.a.a.a.a.z.z.a.a.a.a.l.z.z.a.z.z.a.a.a.a.a.a.z.a.a.a.a.a.a.a.l.l.z.z.a.a.k.k.a.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.z.z.z.z.a.a.z.z.z.l.a.a.a.a.a.a.a.a.a.z.a.a.a.a.a.a.a.a.a.a.z.a.z.a.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.k.l.l.z.z.a.a.a.a.a.k.z.a.a.k.a.k.l.k.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.l.a.a.a.a.a.a.a.a.a.a.a.z.z.z.a.z.a.z.z.z.z.z.a.z.a.a.a.a.a.a.a.a.a.a.a.a.a.z.z.a.a.z.z.z.l.a.a.a.a.z.z.z.a.a.a.a.a.l.l.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.z.z.S.S.F.F.F.F.F.F.F.F.F.S.S.z.l.a.a.a.a.a.a.a.a.a.a.a.a.z.z.z.z.a.a.k.l.z.z.a.a.z.z.a.a.a.a.a.a.z.k.z.z.a.a.z.a.a.a.z.z.a.a.a.a.h.h.z.h.a.a.a.a.z.a.z.z.a.a.a.a.l.k.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.S.F.S.a.:.{ / L S A n n n A S L / { :.z.F.F.z.a.a.z.z.l.z.z.l.l.k.z.a.a.a.a.a.l.z.z.l.l.z.z.z.z.a.a.a.a.z.z.z.z.a.a.a.a.h.h.h.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.S.S.O.P s 9 2 > : = = & = = = * * & = = > 7 s L ,.F.z.a.z.z.z.z.z.z.a.a.a.a.z.a.a.a.a.a.a.a.z.z.z.z.a.a.a.z.z.z.z.z.a.a.a.a.h.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.S.#.l 2 : > > 2 2 3 3 3 3 2 2 , 2 2 , > > : = & * > z :.z.a.a.a.a.z.z.z.a.a.a.z.z.z.z.z.z.a.a.a.z.z.z.z.z.z.z.a.a.l.l.a.a.a.a.l.l.a.a.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.S.{ 3 2 6 9 9 9 7 6 6 6 6 6 6 6 6 6 6 3 3 3 3 3 3 2 > % , O.z.a.a.a.z.z.z.a.a.a.z.z.z.z.a.z.a.a.a.z.z.z.z.z.z.z.a.a.z.z.a.a.a.a.z.a.a.a.a.l.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.q 6 y y y y y y y y q q q q q q q q q 8 9 9 6 6 3 3 3 $ y D.a.a.l.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.z.z.z.z.a.a.a.a.z.z.a.z.a.a.z.z.a.a.a.a.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.z.a.p 2 q s b n b x x l l s s s s s i i p y y q q 9 6 , = o 6 S.a.a.a.l.z.a.a.a.a.a.a.a.a.a.a.a.a.a.z.z.z.a.a.a.a.a.a.z.z.z.z.a.a.z.z.a.a.a.a.z.z.l.a.a.a.k.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.l.l.l.l.z./ x q q p x L W W W W W L P P S n b s p q 6 : % $ @ # : P S.a.a.a.a.a.a.z.z.z.a.a.a.a.a.a.a.a.a.a.z.z.z.z.a.a.a.a.a.a.z.z.z.a.z.l.a.a.a.a.a.z.l.k.k.a.z.z.z.a.l.a.a.a.l.k.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.", +"l.l.l.l.a.a.a.z.z.z.z.z.a.a.a.a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.l.a.z.O.b A x l b L A d s f s a t q 0 6 2 : = * % $ * & > 2 q :.z.a.a.a.a.a.z.z.z.z.a.z.a.a.a.a.a.a.a.a.z.z.z.z.a.a.a.a.z.a.z.z.z.a.z.l.a.a.a.a.a.a.l.k.a.k.z.z.a.a.z.z.a.a.a.a.l.l.l.l.l.l.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.,.,.,.,.>.:.:.:.:.:.:.", +"l.z.z.z.a.a.a.a.l.z.z.z.a.a.a.a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.a.S.x 6 p s c P Q n s a p w q 9 9 3 2 > > : : : : ; = # S S.a.a.a.z.a.a.a.a.z.z.z.z.z.z.a.a.a.a.a.a.a.a.z.a.a.a.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.k.z.z.z.l.a.a.a.a.a.a.a.a.z.z.z.z.a.a.l.a.a.a.a.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.,.,.,.,.,.:.:.:.:.", +"a.z.z.z.a.a.a.a.a.z.z.z.a.k.l.l.l.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.z.a.y 2 q q a b b s q 9 3 2 2 > : = = = = = & & & @ s D.a.k.l.l.l.l.l.k.k.z.z.z.z.z.z.z.l.a.a.a.a.a.a.z.z.a.a.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.z.z.z.a.a.a.a.a.a.a.a.a.a.l.a.a.a.a.a.a.a.a.a.a.a.a.a.l.l.l.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.,.,.,.,.,.:.:.", +"a.a.a.a.a.a.a.a.k.l.l.l.l.l.l.l.l.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.S.2.9 > 6 9 y s l s y q 6 3 2 > : : = = = & & @ q A.z.l.l.l.l.z.l.l.l.l.l.l.l.l.l.l.l.l.k.k.a.a.a.a.k.l.l.l.z.z.k.a.a.a.a.a.a.a.a.a.a.a.z.l.a.a.z.a.a.a.a.a.a.a.a.z.z.z.a.a.a.a.a.a.a.k.z.z.z.z.z.z.z.z.z.z.a.l.l.l.a.a.a.a.l.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.2.e.a.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.,.,.,.,.,.", +"l.l.l.l.l.l.l.l.l.l.l.l.l.l.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.S.:.6 , 6 q p j s p q 7 3 , > : : = = & & @ 6 z.z.l.z.z.l.z.z.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.z.z.z.z.z.z.l.l.l.l.l.l.k.a.a.a.a.z.z.z.a.z.z.a.a.a.a.a.a.a.a.a.z.a.a.a.a.a.a.a.a.z.z.z.z.a.a.a.z.z.z.a.l.z.z.a.a.a.a.l.l.a.a.a.l.l.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.a.e.2.2.2.2.2.2.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.,.,.,.", +"l.l.l.l.z.l.l.l.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.A.A.A.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.S.#.3 2 9 q s l p 9 2 > = = = = = & * @ , a.z.a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.z.z.z.z.z.z.a.a.a.a.a.a.a.a.z.z.a.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.z.a.a.z.z.a.a.a.a.a.a.a.a.a.a.z.z.a.a.l.l.a.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.a.a.2.a.a.2.2.a.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.,.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.A.A.C.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.F./ > 6 q q b s 9 2 : = & * * % % # & :.S.a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.k.k.a.a.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.z.z.z.a.a.a.a.a.a.a.a.l.l.z.a.z.z.z.z.l.a.a.l.l.a.a.a.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.a.a.a.a.a.a.2.a.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.k.a.a.a.F.A > q 9 b b 9 2 = & % % $ $ % # Q F.a.a.a.a.a.a.a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.k.z.z.a.a.a.a.a.a.a.a.z.z.l.a.a.a.a.a.a.a.z.z.z.z.a.a.a.z.a.a.a.a.z.z.z.z.z.z.z.z.l.a.a.a.a.a.a.a.a.a.l.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.2.2.2.2.2.2.2.e.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.C.A.A.A.C.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.A.C.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.z.z.z.z.z.z.z.S.S.S.S.S.S.S.F.y 3 9 x b 9 , = & % $ $ % @ i I.z.S.S.S.S.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.k.k.a.a.z.z.a.a.a.a.a.a.a.a.z.z.z.z.a.a.a.z.a.a.a.a.a.a.z.z.a.z.z.z.l.a.a.a.z.z.a.a.a.a.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.2.2.2.2.2.2.a.e.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.S.A.A.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.S.S.S.S.A.A.A.A.A.C.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.z.z.z.z.S.S.F.F.F.S.S.S.z.a.2.-.:.O.#.{ { / / { l > 9 x x 6 > : = * % % % @ A { / { { { #.O.O.:.,.2.a.z.z.z.S.S.S.S.S.S.z.z.a.a.a.a.a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.z.z.z.l.k.a.a.z.z.a.z.z.z.a.a.a.a.z.z.z.z.a.a.a.a.a.a.a.a.z.z.a.a.a.a.z.z.z.z.a.l.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.2.2.2.2.a.a.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.A.S.A.z.z.z.A.A.A.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.C.S.S.S.S.S.S.S.S.S.S.S.A.A.A.A.C.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.z.z.S.D.F.F.D.S.a.:.#.[ Q P A x l s p y q 8 9 6 3 3 2 2 2 > 6 9 6 z l 6 2 > : & % % % & 6 6 9 q y p s s l x c n A S P L W / / { #.O.2.a.z.S.S.S.z.z.z.a.a.a.a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.z.z.z.z.z.a.a.a.a.a.z.z.z.z.z.a.a.a.a.a.a.a.z.z.a.a.a.a.z.a.z.z.k.l.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.2.e.a.a.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.S.S.z.z.z.z.z.z.A.C.z.z.z.z.z.z.z.z.z.z.C.A.z.z.z.z.z.z.z.z.z.z.S.S.z.z.z.z.z.z.z.z.z.A.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.S.F.F.F.S.a.O.' L m s y 9 3 > : = = * $ $ $ $ $ $ $ $ $ $ $ $ $ % % : , , u y 0 6 2 : = $ @ @ + $ & & & & & = = : : : 2 3 6 9 q p s x n n n n Z S L / { O.2.z.S.S.S.z.z.a.a.l.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.k.k.a.a.a.a.a.a.a.a.a.a.a.z.z.a.a.a.a.a.a.a.z.a.a.a.a.z.z.a.a.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.2.2.2.2.2.2.2.2.a.e.2.2.2.2.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.S.S.S.z.z.z.z.C.S.A.z.z.A.A.A.A.z.z.A.A.A.S.z.z.z.z.S.z.z.z.z.z.z.S.z.S.z.z.z.z.z.z.S.S.z.z.z.S.S.A.z.z.A.A.A.A.C.z.z.z.z.z.z.z.z.z.z.z.z.z.S.F.F.S.0.[ P l q 3 : & % $ $ # # @ @ + + + + @ $ % & = : > 2 3 6 9 9 9 q 6 = 3 8 x j w q 4 1 = % @ @ @ + = 6 6 5 3 , > > : = = & & % % * & = > 3 7 8 q 8 9 9 q y i x S Q { 2.z.F.F.S.z.a.l.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.k.a.a.a.a.a.z.z.a.a.a.a.a.a.a.a.a.a.a.z.z.a.a.a.k.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.q.2.2.2.2.2.2.2.2.e.2.2.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.A.z.A.C.z.z.A.A.S.S.z.z.z.z.S.A.S.S.z.z.S.S.S.S.z.z.z.z.S.S.S.z.S.S.S.S.z.z.z.z.S.S.S.S.S.S.z.z.z.z.z.z.z.z.S.S.S.S.z.z.S.S.z.S.S.z.S.A.A.A.A.A.z.z.z.F.P.S.O.W l 8 > % # # # # # + O O O + @ $ & : , 3 9 q q q y y y u u u p p y y t 9 9 y p p s q 6 2 : = & * = = % $ & : 2 6 6 6 3 3 3 3 3 2 2 , > > : = & % % % * = = : > , , > , 6 8 i n Q :.S.F.S.z.a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.z.z.a.a.a.a.a.a.a.a.a.a.z.z.z.a.a.a.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.q.2.2.2.2.a.a.a.2.2.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.A.A.A.A.z.z.A.S.S.S.z.z.z.z.S.S.S.S.z.z.S.S.S.S.z.z.z.z.S.S.A.z.S.S.S.S.A.A.A.A.S.S.S.S.S.S.S.z.z.z.z.z.z.z.S.S.S.S.z.z.S.S.z.z.z.z.A.S.S.S.z.z.F.F.z.{ x 9 = % # # $ $ $ + O X O @ & > 3 9 q q q q 0 9 9 6 6 6 7 9 9 9 9 0 q y p p y q y q 6 9 q 9 6 2 > = = & = = = : = = = = = = = = & & & & & & & = = = : : : : : = & $ $ $ & : : : & % & = > 8 m { z.F.S.a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.k.k.a.a.a.a.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.2.2.2.a.a.a.2.2.2.2.2.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.S.S.S.z.S.S.S.z.z.z.z.z.S.S.S.z.z.z.z.z.z.z.z.z.z.S.z.z.z.z.z.S.S.z.S.S.S.S.S.S.S.S.S.S.S.A.A.A.C.C.z.z.S.S.S.z.z.z.z.S.z.z.z.z.z.z.A.z.z.F.F.#.b 3 * $ # $ @ + + + + + $ = 3 q q q q 9 9 6 6 6 6 6 6 6 9 9 9 9 9 9 q q r p s s s s s y q q w u q q 9 3 3 2 , 2 2 3 3 3 3 2 > : : = = = = = = = & & & * % % % * & & = = = = = & % % = & $ @ # # @ @ % 6 m O.F.S.a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.2.2.2.2.2.2.a.e.e.2.2.2.", +"z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.S.S.z.S.S.S.z.A.A.A.A.A.S.S.A.A.A.A.C.C.C.C.C.C.C.C.C.z.C.C.S.S.A.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.A.A.A.C.S.z.z.z.z.z.z.z.S.F.{ u = # $ $ @ o . + & > 3 q q q q 9 7 6 6 9 9 9 9 9 9 9 9 q q q q q q q y u p s s s d z l p y y p a p u w q 9 9 6 3 3 6 9 9 7 6 3 2 > > > : : : : : : = = = = = & & & & & * * & = = = = : : = # . X O + @ @ & i { F.z.a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.2.2.2.2.2.e.e.2.2.2.2.", +"A.A.A.A.z.z.z.C.z.z.C.z.C.C.A.C.z.z.z.z.z.z.z.z.C.A.A.A.z.z.z.S.A.A.S.S.A.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.A.A.z.F.:.s % @ $ @ O . X & q y w q q 9 9 9 9 9 8 q q q q q q q q q q q q q w y y u p p a s s s d s s s s d d d d s s u q q 9 6 6 9 9 6 6 3 3 2 , > > > > > > > > > : : : : = = = = = = & & * & & = = > = @ . . X + @ @ & s 2.D.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.2.2.2.2.e.e.e.2.2.2.2.", +"A.A.A.A.z.z.z.A.z.z.A.A.A.A.A.A.A.A.A.z.z.z.A.A.A.A.S.S.z.z.z.S.C.A.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.z.F./ 3 # O + O X . + , y p q q q q q q q q q q q q q q q q q q q q q q y y u u u p p p a s s s s u y s d z z d s a p p y q q 7 3 6 9 9 7 6 3 3 3 2 2 , , > > > > > > > > > > > : : : = = = = = = = = = = : = $ X . . + + $ % 3 { F.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.z.z.a.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.2.2.2.a.2.e.a.a.2.2.2.2.", +"z.z.S.S.z.z.z.z.z.S.z.z.z.z.z.z.z.z.z.z.z.z.S.S.z.z.z.z.z.A.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.z.F.) 2 $ + O + + . : p s y q q q q q q q q q q q q q q q q q q q q y y y y y u u u u u u u p p p p q q s d l s p u u y w y y q q 6 3 9 9 7 6 6 4 3 3 2 2 2 2 , , , , > > > > > > > > > : : : : : : : = = = = = : = + X + O O & = = { F.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.z.z.z.z.z.z.A.S.S.S.S.S.S.S.S.A.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.q.2.2.2.2.2.a.a.e.e.q.q.2.2.2.2.", +"z.S.S.S.z.z.z.z.S.S.A.A.z.z.z.z.z.z.z.z.z.z.S.S.z.z.C.A.A.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.z.F.#.6 > @ O O o X 9 d p u y y y y y y y y y w w w w w y y y r w y y y y y y y y y y u u u u u u u q q p s p a u y w q q q q q q q 9 3 6 9 7 6 6 6 6 3 3 3 3 3 2 2 2 2 , , > > > > > > > > > : : : : : : : : : : : : > $ . O o + = % : 2.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.z.S.G.F.S.S.z.e.,.:.O.#.#.{ { / / / / / / { { O.a.z.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.2.2.2.2.2.2.a.a.e.e.e.2.2.2.2.2.", +"A.A.S.S.A.A.A.A.S.S.S.A.S.S.A.A.A.A.A.A.A.S.S.S.A.A.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.z.s 4 3 O O O X q d s s s p p a p p u y y y y u u u y u u y y y y y y y y y y y y y y y y y y y y q y s y y s a y y w q q q q 0 q q 6 6 9 9 6 6 6 6 6 6 3 3 3 3 3 3 2 2 2 , , , , , > > > > > > > > : : : : : > > > : > & X O o $ : # p S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.z.F.z.{ W A x s p s s d d z c B P P S x s p q 6 3 2 3 / z.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.q.2.2.2.a.a.a.q.2.2.2.2.2.2.2.", +"S.S.S.A.A.A.A.A.S.S.S.S.S.S.S.A.A.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.F.W 2 q q % X X 3 s s d l d s s s a a p u u u u p p p p p p p u u u y y u y y y y y y y w w w w y q q s p w p s p y w q q q q q q 9 q 9 3 6 9 6 6 6 6 6 6 6 6 3 3 3 3 3 2 2 2 2 2 2 2 , , > > > > > > > > > > > > > > > : 2 # O O % = * $ Q F.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.z.F.:.Z 9 : % * # @ # # % > 0 w w z L W S x p q 6 3 2 6 b ,.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.q.2.2.2.a.a.2.2.2.2.e.2.2.2.", +"S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.V.S.a.s 2 q y q % X q p d z x z l l s s s s s s s a a p p p p p p u u y y y u u y y y y w w q q y y w q y a w y p s u w w q q q q q q q 9 q 9 3 9 9 6 6 6 6 6 6 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 , , , , < > , , > > > > > > > : X % : = * # q a.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.z.z.S 3 3 q p p p p p s s i s x c x z d a w q w y q y m | S.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.2.2.2.e.e.e.2.2.2.e.e.e.2.", +"S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.D./ q 6 q w p p > # 3 y d c c c x x z z d s s s s s s s s s a a a p p u y y y u y y y y y y y w y y q u s y w y a s u w q q q q q q q q 6 9 q 7 6 9 9 6 6 6 6 6 6 6 6 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 , , , > > > > = + & > : = * # : / F.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.S.2.y 2 p b S L Q / / ~ Q Y J c d a u w y u p p q u A | A.A.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.2.t.e.e.2.2.2.e.e.e.e.", +"S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.D.a.K 9 7 q w p s d p 9 9 p l b b c c b c c z z l d d s s s s s s s s s a a u u u u y y y y y y y y q w s p y y p s s u y w q q q q q q q 9 7 q q 6 6 9 9 6 6 6 6 6 6 6 6 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 , , > > : : 2 2 > = & % # & l a.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.D.O.9 6 z K Q / Q J B c d f w w y p s s s s u 8 q x #.S.A.a.a.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.2.2.e.e.2.2.", +"S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.D.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.D.F.S.S.S.F.F.D.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.F.{ b q 7 q w u s s d z s p p s z b b b b b b c c c z z l d s s s s s s s s a a a p p y u u u y y y q s s w y u s d s u y w w q q q q q q 9 9 q q 9 3 9 9 9 9 9 9 9 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 3 3 3 3 2 > < , 3 3 2 > : = & % # % 9 / F.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.S.} 3 9 x P ~ ~ S d d d f w q s b b l k p y 9 8 x { S.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.2.2.2.2.2.2.", +"S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.D.F.S.S.S.S.S.S.S.S.S.D.D.D.S.S.S.S.S.S.S.S.S.S.D.S.D.S.S.S.D.F.D.S.S.D.S.S.S.S.S.S.F.F.D.S.S.S.S.S.S.S.D.a.L s 9 0 q q u a s d z c c c d s s s z c b B n b b b c c x z z l l d d s s s s s s s s p p p p u u u a d a u a l s p u y y w q q q q q q 0 q q q 9 6 8 q 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 7 6 6 6 6 3 3 3 3 3 6 6 6 3 3 > : = & % $ # # > x z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.S.>.6 9 x K W L b d c d a q q s n x s s u q 8 x { S.S.a.a.a.a.a.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.2.2.2.2.2.2.", +"S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.D.D.D.D.S.S.S.S.D.D.S.D.S.S.S.S.S.S.S.D.F.F.S.S.S.S.F.D.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.F.F.S.S.S.S.S.S.S.S.F.#.B q 9 q q q y p a s z c b b B S S B b c z z c c b n n n B b b c c x x x x z l l d d d s s s s s s s s s d l z l s s a a u u u y y w q q q q q q q q q q q q q q q q q q q q q q q q q q q 9 9 9 9 7 6 6 6 6 6 7 7 7 7 6 6 6 3 3 , : = = * % $ # # * q { S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.q 3 l S L S c c c f u q w l n x s i y 8 q Q S.C.a.a.z.a.a.a.a.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.2.2.2.2.", +"S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.D.D.D.F.F.S.S.S.S.D.F.F.F.F.F.S.S.S.S.G.G.F.S.S.S.S.S.D.F.F.F.P.P.P.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.F.F.F.F.F.F.F.F.F.F.G.F.z.~ s 9 0 q q q w u p s s z c b B S K L L L L P K A b b c b b b b b n n b b b b b b c c c x x z z l l l d d s s d d s d s s s s s a p p p u y y y y y y y y y y y w w y w q q q q q q q q q q 9 9 9 9 q q q q q q 8 9 7 6 6 6 3 2 > : = = & * % $ # # # , b z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.F.b : p b P S d c c f w q q s b x s s y 8 u { S.a.a.k.z.z.z.z.a.a.a.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.2.2.2.", +"S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.D.D.D.S.S.S.F.D.F.D.D.D.D.F.F.F.F.F.F.F.S.S.S.S.S.F.P.P.I.I.P.F.S.a.2.O.{ / / W L S A n b x x l s s s s a p p u u y y y y y q y q s K q 9 0 q q q w u p a s s l z c b B K P Q ~ ~ ( / / / ~ ~ L P K S B n b b b b c b b b b b b c c c c c c c c x x z z z z l l d d d s s s s s s s a a a a p p p u y y y y q q q q q q w y y y y p p y y q q q 9 9 6 6 6 3 3 2 > > : = = & & * % % $ # # & q { S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.S.| > 9 s B B d c c f w q q s x x l s u 8 l :.S.a.l.l.k.z.z.z.z.a.a.a.a.a.a.a.a.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.2.2.", +"S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.D.S.S.S.S.D.D.S.S.S.S.S.S.S.F.F.F.F.F.F.F.F.F.F.F.S.S.F.P.I.P.S.,.{ W K b d p t q q 0 9 9 0 0 0 q q q q q q q q w w w q q q q q q q q q q 0 9 w d 9 0 0 q q q w u p a a a s s d z c n S K L Q ~ ( ) ] { #.#.#.#.X.{ ) / ( ~ Q L P K S A B b b b c c c x x x x x x x z l l d d d d s s s s s s s s s s s s s s s s d s s l l l l k k k s s a p y q q q 9 9 6 6 3 3 3 3 , > : : = = = = = & * % % $ $ # $ 3 n z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.S.p > q x B d c c f u q e u x x l s i 8 Z z.z.a.a.a.a.a.a.a.a.a.z.z.z.a.a.a.a.a.a.a.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.", +"S.S.S.S.S.S.D.D.S.D.S.S.S.S.S.S.D.D.S.S.S.S.F.F.D.D.D.D.F.F.F.F.F.F.F.F.F.F.F.S.S.F.P.P.z.{ L x a w q q w u a s s d z z z c c b b b b b b b b b b b b b b b c b b b c c x x x x B a 7 0 0 q q q y u p a a a s s d z z c b n S K L Q ~ _ ) { X.#.#.+.@.@.@.@.@.0.0.0.@.@.@.#.#.#.#.X.{ ) ) / / / ~ ~ ~ ~ Q Q Q L L L L L L L L P P P P P P P P P K S K S B n b c z s s p p u w q q 9 9 6 6 6 3 3 3 2 , > > > : = = = = = = & & % % % $ # # = y { S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.D./ = 6 y n c d c f a q 0 q s x l s i q m S.z.a.l.l.k.a.a.a.a.a.a.z.z.z.a.l.a.l.l.a.a.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.", +"S.S.S.S.D.D.D.F.D.D.F.F.S.S.S.S.D.F.F.D.S.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.S.F.I.S./ b p q w a s z b n B A S S S K K K P P P P P P L Y P P P L L L L L L Q Q W Q L L L L L L L L z 7 9 q q q w y p a a a a s d l z x c c c b B S K P Q ~ ) #.#.+.+.+.+.+.+.@.@.@.@.@.@.@.0.0.0.0.@.@.@.@.@.+.+.#.#.#.#.#.{ X.{ { ) ) ( / / ~ ~ Q Q L P P K K A B b b c l s s a p y q q q q 9 6 6 6 3 3 3 3 3 2 2 , > > > > : ; = = = = = & & * % % $ $ # % 6 S S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.h.D.p = 9 s B f c d f w e 7 p l l l s q l a.z.a.l.l.l.l.l.k.a.a.a.a.z.z.a.a.z.z.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.", +"D.D.D.D.D.D.F.F.F.F.F.F.F.D.S.S.F.F.F.D.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.I.z.L s q p l b S K P P L Q ~ / ) { X.#.#.@.@.@.@.@.@.@.@.@.@.+.#.+.#.#.#.#.#.#.#.#.#.#.#.#.{ { { { / B q 0 q q q y y p a a a s s d z z c c b b b B S K P ~ { 0.a.V.a.t.@.#.{ ) ) ) ( ( ( ( ( ( ( ( ~ ~ ~ ( ( ~ ~ ~ ~ Q Y L Y P K K K S B B B B B B b c z z z d s s s a a p y w w q q 9 7 6 6 6 3 3 3 3 3 3 3 3 2 2 2 , < > > : : : = = = = = & & * * % % $ # # : p O.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.S.#.: , q b c d c s w q 4 q s l l s y i :.z.a.z.l.l.l.l.l.l.k.a.a.z.z.z.a.a.z.z.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.", +"F.F.F.F.D.D.D.D.D.D.D.D.D.D.D.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.G.P.F.Q u w d b K L Q ^ ) #.@.0.a.a.a.a.a.t.t.@.@.+.X.) ( ( ~ Y Y Y I J J J J G B B B B B B B M c c c c B ( L w 9 q q w y u p a s s s s s z z c c b b n B S P L ) @.t.V.L.G.@.X.( ~ Y J J J J J J G G G G G G G G B B B B B B B B B M M M c c c g g d d f f f f a a u w w w q e q e 0 0 0 7 4 4 3 3 2 3 3 3 3 3 3 3 3 3 2 2 , 2 > > : : : : : = = = & & & * % % $ # # * 6 P S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.F.x % 3 y B d c f a q 7 6 p s l l i y #.S.a.z.z.z.z.l.l.l.l.l.l.a.a.a.a.a.a.a.a.a.a.z.z.a.a.a.a.l.l.l.a.a.a.a.a.a.a.a.a.a.a.e.a.a.a.a.a.a.a.", +"F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.S.P.a.l q d S Y ~ ) #.t.V.V.V.a.$.+. .( ~ Y J G B M c c c c d d c c c c c c c c c c c c c c c c c c c c z c ~ ( s 9 q q y y u a a s s s s d z z c b b b B A K P ~ { @.t.V.L.V.+...( ~ Y J J J J J J J J I I I I J J J G G G B B B B B M M c c c c g d d d f f f f f a a a u w w q e q e 0 0 7 4 4 3 3 2 3 3 3 3 3 3 3 3 3 3 2 2 2 , > > : : : : = = = = & & & * % % $ # # > s :.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.3 : 6 l b d d f w 0 3 q s l l s q Q G.a.z.z.z.z.z.z.z.l.l.l.l.k.a.a.a.a.a.a.a.a.a.z.z.a.a.a.a.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.P.:.u u B Y ( +.a.V.V.t.+.) ( U J G B B J J Y Y ~ ( / ] { #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.{ { { { ) ) ) / / Y J ( c 0 q w y u p a a s s s s d z x c b b b B S K L ~ { @.V.L.P.V.+.X.( T I J J J J J J J J J J J J J J G G G G G B B B M M M c c c g d d d d f f f f f f a u w w w w e e e 0 0 7 4 4 3 3 2 3 3 3 3 3 3 3 3 3 3 2 2 2 2 > > > : : = = = = = = & & * % % $ # # = 8 W S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.F.! * 9 6 b z d f u q 4 6 p s l l y x z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.k.a.a.a.a.l.a.z.z.a.a.a.l.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.P.z.y a S ~ #.a.V.t.X.( Y I J J Y ( ) #.@.@.@.@.#.{ ) / ~ W L P P K S A B B B b c c c c c c c c c c c b z L ) J ( J q q y u p a a s s s s l z z x c b b n S S K Q ( { t.G.P.P.G.@.) ( Y J J J J J J J J J J J J J J J G G G G B B B B M M M c c c g d d d d f f f f f f a r w w w w e e 0 0 0 0 7 4 3 3 3 2 2 3 3 3 3 3 3 3 3 2 2 2 , 2 > > : : : : = = = = & & * % % $ # # $ 2 l 2.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.F.s * q q b f d f w 0 3 q i s l s y { S.a.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.a.z.z.z.z.a.a.a.l.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.J.F.F.F.F.F.F.F.F.F.F.P.c u B ~ #.V.V.X.( Y J I ~ #.@.0.@.#./ L A b z d s s d l l x x b b b n n Z A n n A B n Z n n b x x l i l S { Y ~ L q q u u a a a s s s d z z x c c c b B S J P Q ( @.a.L.P.P.G.@.( ~ Y J J J J J J J J J J J J J J G G G G G G B B B M M M c c c g d d d d f f f f f f f a w w w w q e 0 0 0 0 7 7 4 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 , 2 > > : : : : = = = = & & * % % % $ # # = q Q S.z.C.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.2.2 : q s c d f u q 4 3 u i l l u S S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.z.z.z.a.a.a.a.a.a.a.a.a.l.l.l.l.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.P.P.J.J.F.F.F.F.F.F.P.F.I.) q c P ( a.V.( T I ~ #.@.0.#.Q B d p a l b S L / { { O.:.2.a.a.z.z.S.S.S.D.F.F.F.F.F.F.F.F.F.F.F.P.2.B L B ~ ( Y Y q w u u a a s s s s d z x c c c b b B S K L ~ { 0.V.G.P.P.V.X.( Y Y J J J J J J J J I I I J J J G J G G G B B B B B M M c c c g d d d d f f f f f f a w w w w w w e 0 0 0 0 7 7 4 4 3 3 3 3 3 3 3 3 3 3 3 2 2 2 , , , > > : : : : = = = = & & % % % $ # # % 6 x a.S.A.A.A.A.C.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.D.! * 3 p x d d f w 7 1 9 p s l s s ,.A.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.z.z.z.z.l.k.a.a.z.a.a.a.l.l.l.l.l.l.h.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"F.F.F.F.F.F.F.F.F.F.F.F.H.J.J.F.H.F.F.F.P.P.P.P.F.F.J.F.P.P.P.P.F.z u B Y #.K.T G B / #./ L v y q p n Q #.2.S.F.P.P.P.P.I.I.P.P.P.P.P.P.P.P.P.H.F.F.F.F.F.F.F.F.F.F.P./ B B Y J X.Y Q y w y u p a s s s s l z c c c b b b B S J L / #.t.Z.P.L.P.t.X.( Y I J J J J J J J J J I I J J J J J G G B B B B B M M c M c c g g d d d d f f f f f a u w w w w w e 0 0 0 0 7 4 4 3 3 2 2 3 3 3 3 3 3 3 3 2 2 2 , , > > > > : : : = = = = & & * % % $ $ # # > y / F.z.z.z.A.A.A.A.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.D.l % 9 s x f d a q 4 1 q i l l u L D.a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.z.l.l.l.z.z.z.z.a.a.a.a.l.l.h.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"F.F.F.F.F.F.F.F.F.F.F.F.J.J.J.F.H.J.H.F.P.P.P.F.F.F.J.J.J.P.F.I.*.q s b Y t.Y M J { / P x q q x / 2.F.P.P.P.P.P.F.F.F.F.F.F.F.F.F.F.F.F.J.J.J.J.F.F.F.J.H.F.F.F.F.P.a.L c w Y S ) ( Y u w y u a a s s s d z x c c c b b b B S P Q ) #.a.G.P.L.G.+.) ( Y J J J J J J J J J I I I I I J J J G G G B B B B M M c c c c g g d d d d f f f f f a u w w w w w q 0 0 0 0 7 4 4 4 3 2 1 3 3 3 3 3 3 2 3 3 2 2 , , , > > > : : : = = = = = & * % % % $ # # % 9 n z.S.z.S.S.S.S.A.z.z.z.A.A.A.C.z.z.z.z.z.z.z.z.z.z.z.z.S.2.3 = q s d f f w 0 2 3 p s l s s =.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.z.z.z.z.z.a.a.a.a.l.l.a.a.a.k.k.a.a.a.a.a.a.a.a.a.a.a.", +"F.F.F.F.F.F.F.J.F.F.F.F.J.J.J.P.P.P.P.P.P.P.J.J.J.J.H.H.F.F.F.I./ 0 s k ( T c P #./ A a 9 l / S.P.P.P.F.J.J.J.P.P.J.H.F.J.J.J.J.P.P.P.P.F.F.F.J.F.F.F.F.F.F.F.F.F.P.{ P s 4 P S Q ( Y u y u p a s s s d d z c c c c b b n S K P ~ { @.V.G.L.I.V.#.) ( Y J J J J J J J J I I I I I I J J J G G G B B B B M M c c c c c g d d d d f f f f f a a w w w w w q e 0 0 0 0 7 4 3 3 1 1 1 3 3 3 3 3 2 2 2 2 2 2 , , , > > > : : : = = = = & & * % % $ # # # > s { S.z.z.z.S.S.S.z.z.z.z.z.z.z.z.A.A.z.z.z.z.z.z.z.z.z.F./ % > q z s f a q 6 > 9 s s l p S S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.a.a.a.a.a.z.z.z.z.a.a.a.a.l.l.l.a.a.a.a.a.a.a.a.a.a.a.", +"F.F.F.F.F.J.J.J.J.F.F.F.J.J.P.P.P.J.J.J.J.J.J.J.J.J.F.F.F.F.F.P.L q p c Y B B { ~ n s 3 l O.I.P.F.F.F.P.J.J.J.J.F.F.F.F.J.J.J.J.J.P.P.J.F.F.F.J.F.F.F.F.J.J.H.F.P.z.~ S q 4 A P J ) Y p y u p a s s s d d z c c c b b b B S P L / #.0.V.P.I.P.t.#.( ( Y J J J J J J J J I I I I I I J J J G G G B B B B M M c c c c c g d d d d f f f f f a a w w w w w q e 0 0 0 7 4 4 3 3 3 1 2 3 3 3 3 2 2 2 2 2 2 , , , < > > > > : : : = = = > = * % % $ # # # & q P S.z.z.z.S.S.S.z.z.z.z.z.z.z.z.A.A.A.z.z.z.z.z.z.z.z.D.l $ 3 y d f f w 0 3 > y s l s p { S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.k.a.a.a.a.a.a.a.a.z.z.l.a.a.a.a.l.l.l.a.a.a.a.a.a.a.a.a.a.a.", +"F.F.F.F.J.J.J.J.J.J.J.P.P.P.P.P.P.P.P.P.P.P.P.P.P.J.J.J.J.J.P.F.L q q b B c L / A b q y { I.F.J.P.P.P.P.P.P.P.P.P.P.J.J.J.F.J.J.J.F.F.F.F.F.J.J.P.P.F.F.J.J.J.F.P.O.L z 9 4 c Q K ) Y a y u a s s s s d z x x c c b b b B S K L ) #.0.G.I.P.a.@.X.( ~ I J J J J J J J J J J J J J J J J G G G G B B B B M M c c c c c g d d d d f f f f f a a u w w w w q e 0 0 0 7 4 4 3 3 2 1 1 3 3 3 3 3 3 3 2 2 2 , , < < > > > > > : = = = = q 3 & % % % $ # # $ 3 l =.S.z.C.z.S.S.z.S.z.z.z.z.A.A.A.A.z.z.A.A.A.A.z.z.S.:., & 6 s s s f w 7 > 3 i s l s b z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.k.a.a.a.a.a.a.a.z.z.a.a.a.l.l.l.a.a.a.a.a.a.a.a.a.a.a.a.", +"F.J.J.J.J.J.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.S./ z u c c K { W n s 9 b F.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.J.J.H.F.J.J.P.P.F.F.F.J.J.P.F.) P p 7 6 d ~ P ) ~ d w p a s s s s d z x c c b b b b B S P Q ) +.a.L.I.G.t.@. .( Y J J J J J J J J J J J J J J I J J J G G G B B B B M M M c c c c g d d d d d d f f f f a u w w w w q e 0 0 0 7 7 4 3 3 3 1 > 2 3 3 3 3 3 2 2 2 2 , , < < > > > > > : : = = : p w 3 & % % $ # # # : y W D.z.A.A.S.S.S.S.z.z.z.z.S.S.S.S.z.z.A.A.A.A.z.z.F.P $ > 9 s a f a q 4 > 8 s l l p ! D.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.k.a.a.a.a.z.z.a.a.a.a.l.l.a.a.a.a.a.a.a.a.a.a.a.a.", +"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.z.) ~ L Q / ) ) P a : : E I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.J.J.F.F.F.P.a._ B q 9 7 p Q J ) Y s y p a s s s s l x x x b c b b B S K L Q ) @.V.P.I.V.@.+.X.~ I I J J J J J J J I I I J J I I J J J J G G B B B B B M M M c c c g d d d d d d f f f f a u w w w w q q e 0 0 7 7 4 4 3 3 1 1 > 3 3 3 3 3 3 3 2 2 2 , > < > > > > > : : = = > s d w 2 % % % $ # # * 9 b a.S.A.A.A.A.A.A.A.A.A.S.S.S.z.z.z.z.S.S.z.z.z.z.A.q # 3 q s a d u 0 2 > y s z s s =.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.z.z.z.z.l.k.a.a.z.l.a.a.l.l.a.a.a.l.k.a.a.a.a.a.a.a.a.a.", +"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.I.z.{ #.@.a.@.) / A w > % Q I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.J.J.F.F.F.P.#.Q s 7 9 9 y Q K ) Y s y a a s s s d z x c c b b b b B S P L ~ { 0.G.I.I.a.@.#.) Y Y Y J J J J J J I I I J J I I I J J J J G G B B B B B M M M c c c c g d d d d d f f f f a u w w w w w q e 0 0 7 7 4 4 3 3 1 1 > 2 3 2 2 3 2 2 2 2 2 , > > > > > > > : : : = > y l d q = % % $ # # $ , s { F.z.S.S.S.S.A.A.A.A.S.S.S.A.C.z.z.S.S.z.z.z.F./ % = 3 y a f f w 7 > 3 s s l s n z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.z.z.l.l.l.l.l.k.z.a.a.a.a.l.l.a.l.l.l.l.a.k.a.a.a.a.a.a.", +"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.z.#.:.I.W.0.) Q b u 3 % W I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.F.P.z.) P w 7 9 9 w Y B ( Y s u a a s s s d z x c c c b b B B S P Q / #.t.G.I.L.a.@.#.( Y Y Y I J J J J J I I I I I I I I J J J J G G B B B B B M M c c c c g d d d d d d f f f f f u w w w w q e q 0 0 0 7 7 4 4 3 3 2 1 2 3 3 2 3 2 2 2 2 2 > > > > > > > > : : : = > 9 u x s 3 = % $ # # # = q S z.S.S.S.S.S.S.S.S.S.S.S.S.A.A.A.A.S.C.z.z.z.S.p @ > 6 p u f a q 3 > q s s l s ! F.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.z.z.z.z.a.a.l.l.a.a.a.a.a.a.h.l.a.a.k.a.a.a.", +"P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.I.z.#.0.U.~.a.{ L z a 9 % P I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.J.I.:./ b 9 9 9 9 w P B ) Y p p a s s s s d z x c c b b b B S K P Q ) #.a.P.I.P.a.+.X.( Y Y U J J J J J I I I I I I I I I I J J J G G B B B B B M M c c c c c g d d d d d f f f f f a w w w w w e e 0 0 0 7 7 4 4 3 3 2 > 2 3 3 3 3 3 2 2 2 , < > > > > > > > > : : = : 3 9 s z 9 2 % $ # # # % 6 l O.F.A.S.S.S.S.S.S.S.S.S.S.S.S.A.A.A.A.A.z.F./ @ $ , 9 p u f u 0 2 > y s l l h =.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.z.z.z.a.a.l.l.a.a.a.l.k.a.a.a.a.a.a.h.a.a.", +"I.I.I.I.P.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.I.S.O.0.L.!.a.#.L s u q $ m I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.F.{ Q s 6 9 9 0 u L B { J u p a f s s s l x x c c b b b B S K Y / { @.V.I.P.V.t.+. .( Y Y I I J J J J I I I I I I U I I I J J J G G G B B B M M c c c c c c g g d d d d f f f f a a w w w w w e e 0 0 0 7 7 4 3 3 3 2 1 > 3 3 3 2 2 3 2 2 , , , , > > > > > : : : = = : 4 q l y 3 : $ $ # # # > p Q F.A.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.A.A.A.7 o = 2 q w a f w 7 > 2 s s l s n A.C.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.z.a.a.a.l.a.a.a.a.a.a.a.a.l.l.l.a.k.a.a.", +"I.I.I.I.P.P.I.I.I.I.I.I.P.P.I.I.P.I.I.I.I.I.I.I.I.I.I.I.I.P.I.F.@.t.P.W.V.#.L a w q % p F.I.P.P.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.J.I.a.) P q 7 9 0 9 s Y S X.B u a a s s s d z x x c c c b b B S P R / #.t.G.I.V.a.t.+.) ~ Y I I I J J J I I I I I I I I I I I J J J G G B B B B B M c c c c c c g g g d d d d f f f a a u w w w w q e 0 0 7 7 7 4 3 3 3 2 1 > > 3 3 3 2 3 2 , , , , , > > > > > : > : : = = 1 4 u s 6 2 & $ # # # = q n a.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.z.P.Z o $ : 3 y w f f w 4 : 7 s l l s W F.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.z.l.l.a.l.a.a.a.a.a.a.a.a.l.l.l.a.a.a.a.", +"I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.I.P.P.I.I.I.I.I.I.I.I.I.I.I.I.I.P.:.a.G.E.G.#.L y q p = 3 2.R.P.P.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.O./ b 7 9 9 0 9 z L K X.b y a a s s d d z c c c c c b b B K P Q ) @.a.P.I.V.a.$.+.) ~ Y Y Y I J J J I I I I I I U U I I I J J J J G B B B B N M M c c c c c c c g d d d d f f f f a u w w w q e e 0 0 7 7 7 4 4 3 3 2 1 > > 2 3 2 2 2 2 , , , , , > > > > > > : : : = = = 3 0 d q 3 > % # # # % 6 s { F.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.z.P.| @ + = > 9 q w f t 0 3 > q s l l s | S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.l.a.a.a.a.a.l.l.a.a.l.l.l.k.a.a.", +"I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.:.t.G.U.I.@.L y 0 a , % / R.P.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.F.{ ~ s 6 9 9 q 9 c K P { z y a a s s s d z c c c c c b b B K L ~ { 0.V.P.I.V.a.@.+.( Y Y Y Y I J J I I I I I I I U U I I I J J J J G G B B B M M M c c c c c c c g g g d f f f f f a u u w w q e e 0 0 7 7 7 4 4 3 3 3 1 > > 2 3 2 2 2 , , , , , , > > > > > > : : : = = = > 4 u s 6 2 : # # # # > i L S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.z.F.>.= O % : 3 q q w f w 7 > 2 p s l l x a.A.z.C.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.k.a.a.a.a.a.l.a.l.l.l.l.a.a.a.", +"I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.t.t.G.U.U.2./ p 4 a 9 @ s R.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.I.t.) P w 7 9 9 q 0 S B Q ( a u a a s s d d z c c c c b b b B K Q / #.t.G.I.I.V.a.@.#.( Y Y Y U I J I I I I I I I U Y U I I I I J J J G B B B B M M M M c c c c c c c g d d d d f f a a u u w w w q e 0 0 0 7 7 7 4 4 3 3 1 > > > 2 2 2 2 , , , > > > > > > > > > : : : : = = = 1 0 s q 3 > * # # # = y b 2.F.S.S.S.S.S.S.S.S.S.S.S.S.z.F.l.: X $ = > 9 q 7 f a w 4 > 9 s s l s F D.z.A.A.A.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.a.a.z.a.a.a.a.l.l.a.a.l.l.l.l.a.a.", +"I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.R.V.0.V.I.U.a.{ p > u y % = A.R.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.#./ B 0 7 9 9 q q L B ( Y y p a a s s d l z c c c c b b b B K Q ) +.t.P.I.G.V.a.@. .( Y Y Y I I I I I I I Y Y I Y Y U I I I J J G G G G B B B M M M M c c c c c c c g g d d d f f a a t u w w w q e 0 0 0 7 7 7 4 4 3 3 3 > > > 2 3 2 2 , , , > > > > > > > > > : : : : = = = = 3 u a 9 2 : % # # & 9 l / F.S.S.S.S.S.S.S.S.S.S.S.z.P.2.> O $ = : 3 q 9 q f a 0 3 > y s l l s / F.z.A.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.a.a.a.a.a.z.z.a.a.a.a.l.l.a.a.l.l.l.l.a.a.", +"I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.R.F.@.a.P.U.V.#.s : q p , O E E.P.I.I.I.I.I.I.I.I.I.I.I.P.P.P.I.I.I.I.I.I.P.P.P.P.P.P.P.I.S.{ ~ z 9 9 9 0 0 a Y b { K y a a s s s d z z x c c c b b B S P Q X.@.a.L.V.V.V.t.+.( ~ Y Y I I I I I I I Y Y Y Y Y U I I I J J J G G G G B B B B M M M c c c c c c c g d d d d f f a a a u w w w q e 0 0 0 7 7 7 4 4 3 3 2 1 > > : 1 2 2 , , , > > > > > > > > : : : : : = = = & : q s q 4 > = # # % 3 s S S.S.S.S.S.S.S.S.S.S.z.D.I.Q # o $ * : > 6 q 7 t a w 7 > 3 s l l x l :.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.a.a.a.a.z.z.z.a.z.l.l.a.a.a.l.l.a.a.a.a.l.a.a.a.", +"I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.0.t.G.U.P.0.c : 6 a 9 + 3 R.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.I.I.I.I.I.I.I.I.I.I.P.P.P.I.a.) L s 7 9 9 0 0 n Y S ) z y a a s s s d z z x c c c b b B K P ~ #.t.V.V.V.V.t.$.X.( ~ Y Y I I I I I I U Y Y Y Y Y U I I J J J J G G G B B B B M M M M M c c c c c g g d d d f f f f a a u w w w q e 0 0 0 0 7 7 6 4 3 3 3 2 > > > 2 2 2 , , , , > > > > > > > : : : : : : = = = = 3 p p 9 2 : * # % , p b :.F.S.S.S.S.S.A.z.D.I.e.s X O $ % : : 3 q q 0 a u q 4 > q s l l l Z A.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.a.a.a.a.z.a.a.z.l.a.a.a.a.l.l.a.a.a.a.a.a.a.a.", +"R.R.Y.Y.I.I.I.I.I.I.I.I.I.I.I.I.R.T.U.U.U.U.I.I.I.I.U.U.U.I.I.I.R.z.0.G.U.U.V.L 3 1 u y = O { E.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.I.O.) P p 6 0 0 0 q L S Q ~ u u a a s s s d z z z c c c b b B K L / #.t.a.V.V.V.a.@.) ( ~ Y Y I I I I I Y Y Y U U Y U U U I I J J H G G G B B B B M M M c c c c c c c g g d d f f f f a a u t w w w q e 0 0 0 0 7 7 6 4 3 3 3 2 1 > > 2 2 2 2 2 2 > > > > > > > > : : : : : : = = = & : q s q 6 2 : % # : y x / F.z.S.z.z.S.J.I.a.x @ . @ % % : > 2 9 q 0 w a a 0 1 1 p s l x s W S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.l.l.l.l.a.l.l.l.l.l.l.l.l.a.a.a.a.a.a.a.a.a.a.a.a.", +"R.R.R.R.U.R.U.U.U.U.R.R.R.R.R.R.R.R.U.U.U.U.I.I.I.I.R.U.U.U.I.I.R.P.:.z.L.U.V.#.s - q a 6 O 8 E.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.F.{ / S w 7 0 0 0 y b B ~ B w p a s s s s d z z z z z c b b B K Q / O.t.t.V.V.a.$.+.( ( T Y Y I I I I I Y Y Y U U Y U Y U I J J J J G G G B B B B M M M M c c M c c c g g d d f f f f a a w w w w w q e 0 0 0 7 7 7 7 4 4 3 3 2 1 > > : 2 2 2 2 , > > > > > > > > : : : : : : = = = & = 4 s p q 6 , = # & q l P S.S.F.P.I.A./ i # + # % & : > 2 9 q q e a a w 7 > 9 s l x x s { S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.l.l.l.k.z.a.a.a.a.l.l.l.l.l.l.l.a.a.a.a.l.l.k.a.a.a.a.a.", +"R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.U.U.U.U.U.R.2.t.L.U.P.t.S > 3 s q = o { E.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.I.a.{ Q c q 9 0 0 q w s J Y s y p a s s s s d z z z z z c b n A P Q ( @.t.t.V.V.a.@.X.( ( Y Y I I I I I I I U U U Y Y Y U U I I J J J G G B B B B B B B M M c M c c c c g d d d f f f f a a a u w w w q e 0 0 0 0 7 7 4 4 4 3 3 2 2 > > : : 2 , , , > > > > > > > > : : : : : : = = = = * > u s q 9 3 > & * 7 s A 2.z.#.W i & O O $ $ % = : > , 9 q y q w a a q 3 2 p s x x l x a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.l.l.k.l.l.a.a.a.a.l.l.k.a.l.l.a.a.k.a.k.a.a.a.a.a.a.a.", +"R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.U.I.R.S.0.V.I.I.V./ 7 : w a 3 O 3 R.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.:.{ L s 9 9 0 9 q a b B b y u p a s s s s d z z z z z c b B S P Q { 0.0.a.V.V.t.+.) ( ~ Y I I I I I I I Y Y Y U Y Y Y U I I J J J G G G B B B B B B B M M c M M c c c g d d d f f f f a a a u w w w q e 0 0 0 7 7 7 4 4 4 4 3 3 2 > > > - > 2 , , > > > > > > > > > : : : : ; = = = = & = 7 s p q 6 2 : = , p s 6 = # O O @ $ $ $ % : > , , 2 6 q p a w a a w 7 2 q s l x x h S S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.a.a.l.l.a.a.a.a.l.l.a.a.h.a.a.a.l.l.a.a.a.a.a.a.a.a.", +"R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.U.0.t.L.U.P.t.c > 3 s q = X ! Q.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.#.) K s 9 9 0 q u d B c d q u a a s s s s d l z z z z c b B S P Q { #.0.V.V.V.@.#.) T Y Y I I I I I I Y Y Y Y Y Y U U U I I J J J J G G B B B B B B B M M M M M c c c d d d f f f f f a a u w w w w w e e 0 0 0 7 7 7 4 4 4 3 3 2 > > : : = > , < > > > > : > > : : : : : : : = = = = & & 3 w s y 9 3 > ; = : = $ $ % & & & * & : , 3 6 8 6 9 y s s q a a u q 4 2 p s b x x s / D.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.a.l.l.l.a.l.a.a.a.a.a.a.a.a.a.a.a.l.l.l.k.a.a.a.a.a.a.a.a.", +"R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.I.E.S.@.V.I.I.V.) 0 : w s 3 @ & P.R.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.C.X.) S s 9 0 9 w s z c c p w u a a s s s s d d z z z x c b B J L / { #.t.V.V.a.@.X.( Y Y Y I I I I I Y Y Y Y Y Y Y Y Y U I I J J J J G G G B B B B B B M M M M M c c g d d d f f f f f a a a w w w w q e e 0 0 0 7 7 7 4 4 4 3 3 2 1 > : : = : < > > > > > > > > > : : : : : : = = = = = * : 0 s a q 6 3 > : = : : : > : : > , 3 6 7 8 q p s l x x w w f a w 0 2 9 s x b x x x 2.A.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.l.z.l.k.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"R.E.E.E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.0.t.L.I.P.t.b > 3 s q : X s !.I.Y.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.R.u.#./ S a 7 0 0 p s d c d q y u p a s s s s d d z z z z c b B K W ) #.+.a.V.V.a.#.) ~ Y Y I I I I I Y Y Y Y Y Y Y Y Y U I I I J J J J G G B B B B B B B M M M M M c c c g d d f f f f f a a a w w w w w q e 0 0 0 7 7 7 4 4 4 3 3 2 1 > > : : = > > > > > > > > : : : : : : = : = = = = & * & 4 y s y 9 3 > > > : > , , , 3 6 7 8 8 y u s l b b x p 0 a a a q 4 3 p l b x x l S S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.l.z.z.z.a.a.a.a.a.a.a.a.a.l.l.a.a.k.a.a.a.a.a.a.a.a.a.a.a.", +"R.R.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.F.@.V.L.L.V.{ q : q s 6 % O { Q.I.R.R.R.Y.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.0.#.~ B u 7 9 q s s d B a q y u p a s a s s d d l z z z c b B K Q ) #.@.a.V.V.t.#.( ~ Y Y I J J I I Y Y Y Y Y Y Y Y Y U I I I J J J J G G B B B B B B B M M B M M c c c d d f f f s f a a a a w w w w w q e 0 0 0 0 7 7 4 4 4 4 3 2 1 > > > : ; : > > > > > > > : : : : : = = = = = = = & & * > q p p q 6 2 , > > 2 6 7 7 8 8 q y i s l x n Z b s 0 u a a w 0 3 q s x b x x s / D.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.z.z.z.a.a.a.a.a.a.a.a.l.l.l.h.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"E.E.E.E.E.E.E.E.E.E.R.R.R.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.t.0.G.L.L.a.S 2 1 f u 2 + % F.R.I.I.R.R.R.R.R.I.I.I.I.I.I.I.I.I.I.I.I.I.P.#.#.~ b w 9 0 p s d z B u q y u u a s a a s d d d z z z c c B K Q / X.0.a.V.a.@.X.( T Y J I I I I I I U Y Y Y Y Y Y Y Y I I I I J J J G G G B B B B B M M M B M c c c c d d d f f f f f a a u w w w w w q e 0 0 0 7 7 7 7 4 4 4 3 1 1 1 > > : : - > > > : : : > : : : : : = = = = = = = & & * * 4 y p q 6 3 3 , , 7 q q q y u s l x x n A A n s 0 w a a w q 4 7 s x b b x l l ,.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.k.a.a.a.a.a.a.a.a.a.a.l.l.l.l.a.a.a.a.a.l.l.l.l.k.a.a.a.a.", +"E.E.E.E.E.E.E.E.E.E.E.E.R.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.I.:.a.P.L.G.@.a > 7 d q : X 9 Q.I.I.I.R.R.R.R.I.I.I.U.R.I.I.I.I.I.I.I.R.G.#.#.~ b q 7 q s s d c c q w y u u p a a a s s d d l z z z c B P Q / #.t.a.a.t.#.( ~ Y Y J J J I I I U Y Y Y Y Y T Y Y Y I I I I J J G G G G B B B B B M M M M M M c c c d d d f f f f f a a u w w w w w q e 0 0 0 7 7 7 7 4 4 4 3 1 2 1 > > : : - = : > : : : : : : : : : : = = = = = = & & % $ > 0 y y 9 6 6 3 3 q p i s l x m n n A A A b s e w a a u w 7 4 p x b b x x s S S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.l.l.l.l.k.a.a.a.a.a.a.a.l.l.l.l.a.a.a.a.l.l.l.l.l.l.a.a.a.a.", +"E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.E.E.E.E.R.E.E.R.R.R.R.R.R.R.R.R.E.S.@.V.P.P.V.~ 7 > w s 6 & . x !.I.R.R.I.R.R.I.I.U.U.R.U.R.R.I.I.I.I.R.a.#.{ ~ b q 7 p d f c B a q y y u u p a a a s s d d l d d z c B K L / #.0.t.t.@.X.( Y Y J J J J J I I U Y Y Y Y T T T Y Y I I I J J J G G G B B B B B B B M M M M M c c c g d d d f f f f a a u w w w w w q e 0 0 7 7 7 7 7 4 4 4 3 1 2 1 > > : : - = = : : : : : : : : : : = = = = = = = & * % $ = 4 q y q 9 6 6 3 i n n Z A A S S S A n z w q a a a u w 0 4 p x b n x l z s { D.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.a.a.a.z.z.z.l.a.a.a.l.l.l.l.a.l.a.a.a.a.a.a.", +"E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.E.E.R.R.E.E.E.E.E.E.E.E.R.R.R.R.E.a.0.G.P.G.a.S 2 1 s p 3 $ X W !.I.R.R.R.R.R.R.U.U.I.I.R.R.R.R.R.R.R.:.#.{ Q B q 0 d d z B s 9 q y t y u p a a a s s s d d d l z b A K L ) #.@.t.@.+.) ~ Y Y J J J J J I I Y Y Y Y T T T Y Y I I I I J J J G G G B B B B B B B B M M c c c c c g d d d f f f f a a u w w w w w q e 0 0 7 7 7 6 4 4 4 4 3 1 3 1 > > : : : - = = : : : : : : : : : = = = = = & & & * % % % 2 4 q q 0 9 9 6 s P S S S A Z Z n c s w w a a a w w q 4 y x b b b l l s x l.A.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.z.z.l.a.a.a.l.l.l.l.a.a.a.a.a.a.a.a.", +"E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.E.R.0.t.L.P.V.0.d > 3 d q > # + { !.I.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.I.@.#.{ Q B u w z z c B q q q w w y y u p a a s s s s d d l z b B K Y ) #.@.$.@.#.) ~ Y J J J J J J J I Y Y Y Y T T Y Y U U I I I J J J G G B B B B B N B B B M M M M c c c g d d f f f f f a a w w w w w w q e 0 0 7 7 7 4 4 4 4 4 3 3 2 1 1 > : : : - = = : : : : : : = ; = = = = = = & & & * % % $ : 3 6 0 0 9 9 9 s S A A A n b x s w w a f a a w w w 4 q x n n n x l l s Q D.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.z.a.a.a.a.a.a.a.a.a.a.a.a.k.a.a.a.", +"E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.E.P.@.a.L.L.V.#.u > 0 l q > @ # O.!.I.R.R.R.R.R.R.R.R.R.R.R.R.R.R.P.#.#.#.Q S s s z c B d 9 q q q t y u u a a a s s s s d d l z c b J T ) #.@.@.+.X.( Y Y J J J J J J J I Y Y Y Y Y Y Y Y U U I I I I J J G G B B B B B B B B B M M M M c c c g d f f f f f f a a u w w w w w q e 0 0 7 7 7 6 4 4 4 4 3 3 3 1 1 > > : : - = = = : : : : : = = = = = = = = & & & * % % $ = 4 3 6 6 7 9 6 p B b b c l a w w a f f a w w w w 7 w b n n m b l l l s :.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.l.l.z.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.E.F.@.V.L.L.V.) q > q d 8 > @ # O.!.I.R.R.R.R.R.R.R.R.R.R.R.I.R.V.#.#.#.Q S s d c b B y 0 q q q w u u u p p p s s s s s d l x c b S Q { #.#.#.X.( Q Y J J J J J J J J J I I I I I U Y Y U U I I I I J J G G B B B B B B B B B B c c c c c g d d d f f f f a a a w w w w w q q e 0 0 7 7 7 4 4 4 4 3 3 3 3 2 1 > > : : - = = = : : : : : = = = = = = = = & * % % % % % % 2 4 3 3 6 6 6 q d s a w w w a f f f a w w w q 7 u n B n b b l l l s S S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.a.a.l.k.a.a.a.a.a.a.a.a.a.a.a.a.", +"Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.E.S.:.V.L.G.V.~ 0 > y s 9 > @ @ { !.I.R.R.R.R.R.R.R.R.R.R.U.R.a.#.#.#.~ b s z b B c 0 q q q q q w u u u u p s s s s s d d z c B K ~ ) X.#.X.) ~ Y Y J J J J J J J J J J I I I I Y Y Y U U I I I I J J G G B B B B B B B B B B c c c c c g d d f f f f f a a a w w w w q q e e 0 0 7 7 7 4 4 4 4 3 3 3 3 3 1 > > > : : = = = = : : : = = = = = = = = & & * % % % % % % : 4 3 3 3 3 3 7 w w w w a f f a a w w w w e 7 a A A n b b x s l d s O.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.e.", +"Q.Q.E.E.E.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.E.S.0.V.G.G.a.Q 0 1 a s q > # + ! ~.I.R.R.R.R.R.R.R.R.R.R.R.2.+.+.#.~ d d c B J a 9 q q q q q q w u u u u a s s s s s d z c b K ~ ) { X. .( ~ Y J J J J J J J J J J J I I I I I Y Y Y I I I I J J J J G B B B B B B B B B B c c c g g g d d f f f f f a a u w w w w w q q e 0 0 7 7 7 4 4 4 4 4 3 3 3 3 1 > > > : : - = = = = : ; = = = = = = & & & * % % % % % % $ * 3 4 4 3 3 1 4 a a f f f a w w w w w q e w z S A n n n x l s l p P F.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.k.a.a.a.a.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.2.2.2.2.2.2.2.2.", +"Q.Q.Q.E.E.E.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.Q.S.:.a.V.V.V.Y 7 2 a s q 2 $ O Z Q.E.I.R.R.R.R.R.R.R.R.R.@.@.@.{ s s z B B B q q q q q q q q q w u u u a a s s s s d d z b J Y / ) ) ) ( Q Y J J J G J J J J J J J J I I I I I Y Y U I I J J J J J G B B B B B B B B B M c c c g g d d d f f f f f a a u u w w w w q q e 0 0 7 7 6 4 4 4 4 3 3 3 3 3 2 > > > : : - = = = = = = = = = = = & & & * % % % % % % % % % : 3 4 4 3 3 4 a a a a w w w q w w q w d S K A n n n v l s s s k 2.A.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.e.e.e.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.S.@.a.V.V.a.Y 7 2 a s q 3 % O q I.!.I.R.R.R.R.R.R.R.I.@.@.0.P y z c S J d 9 q q q q q q q q q w u u p a a s s s d d z c S Y ~ / ( / ~ Y J J J J G G J G G J J J J J I I I I Y U I J J J J J G G G B B B B B B B B M c c c c g g d d d f f f f f a a a u w w w w q e 0 0 0 7 7 7 4 4 4 4 3 3 3 3 3 2 1 > > > : : = = = = = = = = = = & & & & % % % % % % % % % $ : 1 3 3 3 1 3 w w w q w w q w q w u n P S B n n n b l s s l p Q F.l.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.l.l.l.k.a.a.a.a.a.a.a.a.a.a.a.e.e.a.e.e.e.e.2.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.,.,.,.,.,.,.>.", +"Q.Q.E.E.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.E.S.@.t.V.V.V.~ 0 2 a l y 6 = O = #.!.R.I.R.R.R.R.R.P.O.0.+.s d c B B ~ p 9 q q q q q q q q q q w y u p a a a s f d z c S J Y ~ ~ ~ Y Y J J B B G J G B G J J J J J J J I I U I I J J J J J G G G B B B B B B B B M c c c c g g d d d f f f f f a a a u w w w q q e 0 0 0 7 7 7 4 4 4 4 3 3 3 3 3 2 2 > > > > : = = = = = = = = = = & & * % % % % % % % % % % $ : 3 2 3 3 1 1 0 e q w w w q w s b S K A B n n n x l s s s s x z.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.a.a.a.a.a.a.a.a.a.a.a.a.e.e.e.q.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.,.,.,.,.,.:.:.,.,.:.:.:.:.:.:.:.:.:.:.:.:.", +"E.E.E.E.E.E.E.E.E.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.E.F.#.0.a.a.V.) w 1 u z u 9 > # O x R.Q.I.I.R.T.R.F.#.a.P a z c B J ~ p 0 0 q q q q q q q q q q w y p p a a s s d z b B J P Y Y Y P J J B B B B B B G G J J J J J J J I I I I J J J J G G G G G B B B B B B B M c c c c c g g d d d f f f a a a a a u w w w w q e 0 0 0 7 7 7 4 4 4 4 3 3 3 3 2 2 2 1 > > > : = = = = = = = = = = * % % % % % % % % % % % % $ = q 3 1 2 2 2 0 w w w w u z S P P S A B n n b x s s s s s p { S.l.z.l.l.l.k.a.k.a.a.a.a.a.a.a.e.e.e.e.q.e.2.2.e.e.2.2.2.2.2.2.,.,.,.,.,.,.,.,.:.,.:.:.,.:.:.:.:.:.:.:.:.:.:.:.=.=.=.=.:.:.=.=.=.=.=.=.", +"E.Q.Q.Q.Q.Q.E.Q.E.E.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.P.#.@.t.t.a.#.s 1 w x s q 3 & o > { !.E.I.U.E.z.@.{ u z c S B ( L b w 0 q q q q q q q q q q w w u u p a s f d c b B C K Y Y J K J B B B B B B B G G J J J J J J J I I I I J J J J G G G G G B B B B B B B M c c c c c g g d d f f f f a a a a a u w w w w q q 0 0 0 7 7 7 7 4 4 4 3 3 3 3 3 2 2 1 1 > > : = = = = = = = = = * % % % % % % % % % % % % $ % , q q 4 1 1 1 0 w a z B K P K S B n n n b l s s s s s s y Q S.a.a.a.a.a.a.a.a.a.a.e.e.e.e.2.2.2.2.2.2.2.2.2.2.2.2.,.,.,.:.,.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.=.=.=.=.=.=.=.=.=.=.O.*.*.=.=.=.O.O.=.=.O.=.", +"E.E.Q.Q.Q.Q.E.E.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.I.@.#.t.t.a.0.b 3 0 x d q 9 > # O y z.~.E.R.V.#.d s c B J Y X.Q K z w 0 q q q q q q q q q w w w w u a s s d z c B B J K J J J B B B B B B B B G G J J J J J J J J J J I J J J J G G G B B B B B B B B B c c c c c c c d d f f f f a f a a a a u w w w w q q e 0 0 7 7 7 7 4 4 3 3 3 3 3 3 3 2 1 1 > > : - - - = = = = * % % % % % % % % % % % % % $ * : 7 y y q 9 9 3 s K P L P S A B n n b c l s p p p p p s y S z.e.a.a.e.e.e.2.2.2.e.q.2.2.2.2.2.2.2.,.,.,.,.,.:.:.,.:.:.:.:.:.:.:.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.O.O.O.%.%.O.O.=.=.=.=.O.O.O.O.=.=.=.=.", +"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.E.E.2.#.0.0.t.t.L 0 4 d c a q 9 , @ $ x z.~.P.b u c c S B X.{ ) Q J c u q q q q q q q q w w w w w u a s s d z c b B S S J J B B B B B B B B B G G G J J J J J I J J J I J J J J G G G G B G B B M M c c c c c c c c c d f f f f f f f a a a a a w w w w q q e 0 0 7 7 7 7 4 4 3 3 3 3 3 3 3 2 1 1 > > : - - = = = = = * % % % % % % % % % % % % $ = 6 q q y y y u y q b L S A n b b b v x d s p p p p u y p y x a.e.2.2.2.2.2.2.2.2.2.,.,.,.,.>.:.:.:.:.:.:.:.:.:.:.:.:.=.=.=.=.=.O.O.*.=.*.*.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.", +"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.Q.S.{ #.2.0.t.{ s 3 a B z u y q , $ = n { w l c S J ~ @.#.{ ) ~ L S s y q q q q q q w w w w t a a f s d d z c B B B B B B B B B B B B B B G G G J J J J J J J J J I J J J J G G G G B B B B B M c c c c c c c c g d f s f f f f a a a a a t w w w q q q e 0 0 0 7 7 7 6 4 3 3 3 3 3 3 3 2 1 1 1 > : : - - = = = = * % % % % % % % % % % % & : 6 q q y p i y y y q s A b b b x x l s p u p p p u y y u y i O.e.,.2.,.,.,.:.:.:.:.:.:.:.:.:.:.=.=.=.=.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.", +"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.Q.I.O.{ 0.0.0.0.S 7 q B n s u y q 4 = 3 s z B K J +.0.+.#.#.{ ) Q K B s q q q q q q q q w w u a a s d d z c c B B B B B B B B B B B B B B G G J J J J J J J J J I J J J J J G G G B B B B M M c c c c c c g d d d d f f f f f a a a a a w w w w q q q e 0 0 0 7 7 7 6 4 3 3 3 3 3 3 3 3 2 1 > > > : : - = = = = * % % % % % % % % $ * : 2 7 q q y p p s s w y q p x l l s s s p y u p p p y y y y q s | 2.:.:.:.:.:.:.=.=.=.=.=.=.=.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.#.#.#.O.O.O.O.O.O.O.O.#.#.#.#.O.#.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.", +"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.Q.Q.a.) #.0.0.t.) s 0 z J b s y w q 0 z c J B ) a.t.t.@.#.#.#.] ( Q J c w q q q q w w w w u a a s d d d z c c B B b b b B B B B B B B B B G J J J J J J J J J I J J J J H G G G G B B B B c c c c c c c c d d d d d f s f f f a a a a w w w q q q q e 0 0 0 7 7 7 4 4 4 3 3 3 3 3 3 2 2 1 > > > : : - = = = = * % % % % % % % % = 6 9 q q y p p s s x z q q q q s p y y y y y y u y y y y y y 8 x O.:.O.=.=.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.O.O.O.O.O.O.O.O.O.#.O.", +"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.Q.P.{ { @.@.0.@.K w a B K b s u w z K S Y t.V.V.a.t.0.@.@.@.X.) ( ~ S z y q q q w w w u a a s d d d z c c c c c c c c B B c B B B B B G J J J J G J J J J J J J J J J J G G G B B B B c c c c c c c d d d g d d f f f f f a a a a w w w w q q e e 0 0 0 7 7 7 4 4 3 3 3 3 3 3 3 3 2 2 > > > > : : = = = = * * % % % % % = 3 q q y p p p s s s x x b p 9 9 9 w y y y y y y y y y y y y y 8 m O.O.O.O.O.#.#.#.#.#.#.#.#.#.#.#.| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | #.#.#.#.#.| #.| | #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", +"Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.Q.E.e.) #.0.@.0.{ b w f S K b a c J B { a.V.V.V.V.V.a.t.0.0.+.X.{ ) Q B b z f w q y a a f s d d d d c c c c c c c c M B c c B B B B G J J J G G J J J J J J J J J J J J J G B B B B c c c c c c c d d g c g g d f f s f f a a a w w w w q q e e 0 0 0 0 7 7 4 4 3 3 3 3 3 3 3 2 2 2 1 > > > : : - = = = = * % % % : 2 7 q q p s s s s s l x b b b b 9 6 6 q y y y y y y y q q q y 8 8 S O.#.| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | #.#.#.#.#.", +"!.!.!.!.!.!.!.!.Q.Q.Q.Q.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.!.I.#.] #.@.@.@./ c a d B B B B ~ @.V.V.V.V.G.G.G.V.a.a.a.t.0.0.#.) / Q Y z q w u u f d d d d d z c c c c c c c M M c c B B B B G G J J G J J J J J J J J J J J J J G G B B B B c c c c c c c c g g c g d d f f f f f f a a u w w w w q q e 0 0 0 0 7 7 7 4 3 3 3 3 3 3 2 2 2 2 1 > > > : : = = = = * % & : 2 7 q y p s s s s s s l x b b b b m p 3 6 q y y y y q q q q q q 7 i Q O.{ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ", +"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.Q.Q.S.{ { #.@.@.#.Q z f d c K ) t.V.V.V.V.G.L.L.P.L.V.V.V.V.V.V.t.#.#.#./ S B c d s s d d z z z c c c c c c c c c c c B B B B B G J J J J J J J I I I I J J J G J G B B B B B M M c c c c c c d d c g d d d f f f f f a a a w w w w q q q e 0 0 0 0 7 7 4 4 3 3 3 3 3 2 2 2 1 1 > > > : : = = = = = > 6 q q y y p s s s d l l z z c b b b b x x 9 2 q q q q q q q q q 7 q S { #.{ { { { { { { { { } | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ", +"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.!.E.a.{ { #.#.#.{ Q c f Y #.a.a.V.V.G.G.L.P.P.L.L.P.P.L.L.P.P.G.L.L.G.@.{ ) / Y c z d d d d c c c c c c c c c c c B B B B B G J J J J G H J I I I J G J G G J G G B B B B B M M c c c c c c g c c g d d f f f f f f a u w w w w q q q q 0 0 0 0 7 7 4 3 3 3 3 3 3 3 2 2 2 1 > : : - : > 2 2 6 q q y y p s s s s l l x x x b b b b b b x x l s 2 6 8 8 8 q q 8 7 8 x / | { { { { { { { { { { { { { { { { { { { { { { { { { { { | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ", +"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.U.0.{ { #.#.#.{ Q L +.a.a.V.V.V.L.P.L.L.L.L.U.U.U.I.L.I.U.U.U.W.U.V.a.t.a.X.( Y Y J B c c d g c c c c c c c B B B B B B G G G G B B J I I J J J G G G G G G B B B B B B B B M c c c c c c c g d d d f f f f a a w w w w q q q q q e e 0 0 7 7 4 3 3 3 3 3 3 3 3 1 1 1 1 > 2 6 q q q y p s s s s s l l l z x b b b n n b b b b x x l s l 9 3 7 7 9 7 6 7 s W | { [ { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { | | | | | | | | | | | | | | | | | | | | | | | | | | | | | #.#.#.| | | | | | | | | | ", +"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.I.0.] { #.#.{ Y @.a.a.V.V.V.G.L.P.L.L.L.U.U.U.U.U.U.U.U.U.U.W.W.W.W.W.U.U.U.L.@.@.{ ~ P J B c c c c c c c B B B B B G J J G B B G J J J J J J J J G G G B B B B B B B B B c c c c c c c g d d d d f f f u w w w w q q q w q q q e 0 0 7 4 4 3 3 3 3 3 3 3 3 3 6 7 q y u a s s s s d l l l l z x x b b B B B B n b b b c x l l s s s u 3 6 3 6 y b Q { { [ { { { [ { { { [ { { { [ [ [ [ { { { { { { { [ [ [ { { { { { { { { { { { { { { { { { { { { { { } | | | | | | | | | | | | | | | | | | | | #.| #.| | | | | | | | | | ", +"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.I.:.) { #.~ #.0.t.a.V.V.G.L.L.L.L.L.U.U.U.U.U.U.U.U.U.U.U.E.Q.W.!.~.~.~.~.!.!.Q.U.L.t.@.{ Q J Y S c c B B B B B B G G G G G G J G J J J J J J G G G B B B M M B B B B M c c c c c c g d d d f f f f u w w w w q q q w q q e e 0 0 0 7 7 q 7 6 4 7 y p p p p a s d d s d l l l l z c b b b n n B A A A A n b b x x x l l s s s s i 3 8 s P / { { / ' [ [ [ [ [ [ { [ [ [ [ [ [ [ [ [ [ [ [ [ { { [ [ [ [ [ [ { [ { { { { [ [ { { { { { { { { { { { { { { { { { { { { { { | } { { { { | | { { { { | } { { { { | | | | | | ", +"~.~.~.~./.~.!.!.!.!.!.!.!.!.!.!.~.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.I.:.) L { @.@.0.a.V.V.L.L.P.L.L.L.U.U.U.U.U.U.U.U.U.U.U.W.W.W.W.W.W.!.~.~.~.!.~.W.U.I.G.a.L.t.X.) X.X.~ J J J J G G G G G G G J J J J J J G G G G B M M M M c c c c c c c c d d d d d d d d f f w w w w q q q w w w w w w w a s s s s d s s d z z x x z z z z z z z z x b b n n A S A A A A S A B b c x x x z l l s s s i s y x ! [ [ / / / / / / / / / / / / / [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ { { { { [ [ [ [ { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { | | { { { { { | { | | | ", +"/././.~.!.!.!.!././.~.~.!.!.!.~./././.~.!.!.!.!./.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.!.U.O./ #.#.@.0.t.a.V.V.L.L.L.L.L.U.U.U.U.U.U.W.U.U.W.W.W.W.W.W.W.Q.Q.Q.W.W.W.W.W.E.U.U.U.L.L.G.V.V.t.0.@.+.#.( ( ( ( ( Y I I I Y I I I J G G G B B N B B B B M M M c g d c B b B B b c z z d f a u w a s s s s d s s s s d l z x c x c b b b c c c b b b b n B A B B S S S S S S S A A A B n b c x x z l l s s s i u u y s [ / / ! / / / / / / / / / / / / / / / / / / / / / [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ { { [ [ [ { [ [ { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { | | { { | | | | { { ", +"/./././.~.~.~.~././././.!.!.~.~././././.!.!.!.!./.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.E.E.E.E.Q.:./ #.#.@.0.0.t.a.V.V.V.L.L.L.U.U.U.U.U.U.E.U.W.W.W.W.W.W.W.W.W.W.W.W.W.U.U.U.U.I.I.L.L.L.L.V.V.V.V.V.a.t.t.t.t.@.+.X.X.#.#.X.{ ( ( ~ ~ Y Y J J L Y Y P J J J B b c B S B B B B B K K P S c b B S S A n B b c c z z z x c b A S S S K S S S S K K S K K K K K K S S S S S S A A A A n b x l l l s s s s s p u u u q D / ! / ! ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / [ [ / [ [ [ [ [ [ [ [ [ [ [ [ { [ [ { { { { { [ { { [ [ { [ { { { { { { { { { { { { { { { { | | { { { { ", +"/./././././././.~./././.~./././././././.~.~././././.~.~.!.!.!.!.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.E.E.E.R.R.I.I.I.P.I.D./ { #.#.@.@.0.t.t.a.a.a.V.V.L.L.U.U.U.U.U.U.U.U.U.U.U.U.W.W.W.W.W.W.W.W.U.U.U.U.U.U.U.U.U.U.L.I.U.U.L.L.L.L.L.L.L.V.V.V.V.V.V.t.t.0.@.@.#.X.#.#.#.X.) ) ( ) / Q Y P P Y P P L ~ / / ( L Y Y ~ ~ ~ Q Q Q L L P S K K K P P P L L L P P P L L L P P P P P K K S K S S S S S S S A b x l s s s s s s s i p p u y q u / / / / ! ! ! ! / ! ! ! ! / / / / ! ! ! / / / / / / / / / / / / / / / / / / / / [ [ [ [ [ [ / / / / / / / / / / [ ` [ [ [ [ [ [ [ [ [ [ [ [ [ [ { { { { { { { { [ { { { { { { { { { { { ", +"/./././././././././././././././././././././././././././././.~.!././././././././.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.E.E.R.R.R.I.I.I.I.I.P.P.P.P.P.I.:./ #.#.#.@.@.0.t.t.t.t.a.a.V.V.V.L.L.L.L.L.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.I.I.L.L.L.L.L.L.G.V.V.V.V.V.V.a.a.t.t.t.@.@.@.@.@.+.+.+.#.#.#.#.#.{ X.X.{ { ) ) ( / / / / / ( ( ~ ~ ~ ~ ~ Q Q Q Q W W W W W W Q Q L L L L P P P P P K K K K K K S S S A A n x s s s s s s s a a p p p p u y 8 A Q W Q Q Q ! ! / ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! / / / / / / / / / / / / / / / / / / / / / / ` / / / / / / / / / / / / [ [ / / / / / / [ [ [ [ [ [ [ [ [ { [ [ [ [ [ [ { { { { { { { { { { ", +"/././././././././././././././././././././././././././././././.~././.~.~.~.~.~.!.^.~.~.~.~.~.~.~.~.!.!.!.!.Q.Q.E.E.R.R.I.I.I.I.I.I.I.I.P.P.P.P.J.F.F.F.D./ ) #.#.+.+.0.0.0.t.t.t.t.a.a.a.V.V.V.V.V.L.L.L.L.L.I.U.I.U.U.U.U.U.U.U.U.I.I.U.I.I.L.I.L.L.L.L.L.L.L.L.G.G.G.V.V.V.V.V.V.V.a.a.t.t.t.0.0.*.@.@.@.+.+.#.#.#.#.#.#.#.#.X.X.{ { ) ) ) ) ) ( ( / / / / ~ ~ ~ ~ ~ Q ~ Q Q Q Q W L L L L L P P P P P P P K K K S S A A B n n c d s s s s s a s s p p p p u u u q s E P L L L L E E W Q Q Q ! ! ! ! ! ! ! ! ! ! ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / [ [ [ [ [ [ [ / / [ [ [ [ [ [ [ [ / ` [ [ [ [ [ [ [ [ { { { { ", +"/././././././././././././././././././././././././././././././././././././.~.~.~././.~.^.~.!.!.!.!.Q.Q.E.E.R.R.R.R.R.I.I.I.I.I.I.I.P.P.J.J.F.F.D.S.S.S.D.e./ { #.#.#.@.0.0.0.0.t.t.t.a.a.a.a.V.V.V.V.V.V.V.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.V.V.V.V.V.V.V.V.V.V.V.a.a.t.t.t.t.0.0.0.@.@.@.+.+.#.#.#.#.#.#.#.#.#.#.{ { { ] ) ) ) ) ( ( / / / / ~ ~ ~ Q Q Q Q W L L L L L L L L P P P P P P K S S A B n n n n b x s s s s s s p p p p p p p u y y q y F P P P P P P P P P P L L E W W Q Q Q ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! / ! ! ! / / / / / / / / / / / / / / / / / / / / / / / / / / / [ / / / / [ [ [ [ [ [ / / / / { { [ [ [ [ [ [ [ { ", +"/./././././././././././././././././././././././././././././././././././././././././.!.!.!.Q.Q.E.E.E.R.R.R.R.R.R.R.R.I.I.I.I.P.P.P.J.J.F.F.F.F.F.D.S.S.S.F.:./ { #.#.@.@.@.@.0.0.t.t.t.a.a.a.a.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.K.L.L.L.L.L.L.L.L.L.L.G.L.L.V.V.V.V.V.V.V.V.V.V.a.f.a.a.t.t.t.t.0.0.*.@.@.@.+.+.#.#.#.#.#.#.#.#.#.X.X.{ { { ) ) ) ) / / / / / ~ ~ ~ ~ Q Q Q Q Q W W L L L L L P P P P K S S A A B n n n n n n b d s s s s s p p p p p p p u y y y q q Z P F F F P P F P P P P P P P P P L L E E W Q Q Q Q Q Q Q Q Q ! ! ! ! ! ! ! ! / / ! ! ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / [ [ [ [ [ [ / / / [ / [ ` [ [ [ [ [ ", +"/./././././././././././././././././././././././././././././././././././././.~.!.!.!.Q.Q.E.E.E.R.E.R.R.R.R.R.R.R.I.I.I.I.P.P.P.P.P.J.J.J.F.F.F.F.F.D.S.D.S.D.{ ^ ) #.#.+.@.@.@.0.t.t.t.t.t.a.a.a.a.a.V.V.V.V.V.a.a.V.a.a.a.a.a.t.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.a.a.a.a.t.t.t.t.0.@.@.@.@.@.#.#.#.#.#.#.#.#.X.X.{ { { { ) ) ) ( ( / / / / / / ~ ~ ~ ~ Q Q Q Q W W L L L P P K K K S S S A A A B n n b n n b z s s s s s p a p p p u p p u u y q q 8 l P S S F F F F F F F F P P P P P P P P P P L L E E W Q Q Q Q Q ! ! ! ! ! ! ! ! ! ! ! ! ! ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / [ [ [ [ [ / / / [ / [ / / / / [ [ ", +"/./././././././././././././././././././././././././././././././././././.!.!.!.Q.Q.Q.E.E.E.E.E.R.R.R.R.R.R.I.I.I.I.I.P.P.P.P.P.J.J.J.F.F.F.F.F.F.F.F.D.D.S.D.z./ / ) #.#.#.#.+.@.@.0.0.t.0.t.t.t.t.a.a.a.a.a.a.a.a.t.a.a.a.a.a.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.@.@.@.@.@.@.+.+.#.#.#.#.#.#.#.#.#.X.{ { ) ) ) ) ) ) ( / / / / ( ~ ~ ~ Q Q Q Q L L L L P P P P P K K S S S S S A C B B n n n b n b z s s s s s s s p p p p p p y y y y q q 8 p D S S S S S S F S S F F F F F F F P P P P P P P P P P P L E W Q Q ! ! ! ! ! ! ! ! ! ! ! ! ! / / / / ! ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / [ [ [ [ [ / / / / [ [ [ / ", +"/././././././././././././././././././././././././././././././././.~.!.!.Q.Q.E.E.E.E.E.E.R.R.R.R.R.R.I.I.I.I.P.P.I.P.P.P.P.P.P.P.J.J.J.F.F.F.F.F.F.F.F.D.D.S.S.a.~ / { #.#.#.+.@.@.@.@.0.0.0.0.t.t.t.t.t.t.t.t.t.t.0.t.t.t.t.0.0.0.0.@.@.@.@.@.+.@.+.+.@.+.+.#.#.+.#.#.+.#.#.#.#.#.#.#.#.#.#.#.X.{ { { ) ) ) ) ) ) ) ) / / ( ~ ~ ~ ~ Q Q Q Q Y L L L L L L L P P P P P P K K K K K K S S S S A B n n n n b b b b x s s s s s p p p p p p y y y y y y q q q 9 y S S S S S S S S S S S F F F F F F F F F F P F P P P P P P P P P L L E W Q Q Q ! Q Q Q ! ! ! ! ! ! ! ! ! ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / [ / / / / [ [ / / ", +"/./././././././././././././././././././././././././././././.^.!.!.!.Q.Q.E.E.E.E.E.E.E.R.R.R.R.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.J.F.F.F.J.F.F.F.F.F.F.S.S.S.z.S.:.Q ) { #.#.#.#.+.@.@.@.0.0.0.0.t.t.t.t.t.t.t.t.t.0.t.0.0.0.@.@.@.@.@.@.+.+.+.#.#.#.#.#.#.#.#.#.#.#.#.#.X.X.X.X.X.{ ) ) ) ) ) ) ) ) ) ( / / / / ~ ~ ~ ~ ~ Q Q Q Q L L L L L L L Y P P P P P P P P P P K K K K S S S S S S A B B n n b b b b x s s a a p p p p y u y y y y y y q y q q q 9 8 n S S S S S S S S S S S S F F F F S F F F F F F F F F F P P P P P P P P L L E W W Q Q Q Q Q Q ! Q Q ! ! ! ! ! ! ! / / / / / ! ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / [ [ [ [ ", +").)./././.)./././././.(.(.(././././././././././././././.!.!.!.Q.Q.Q.Q.E.E.E.E.E.E.E.R.R.R.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.J.F.F.F.J.F.F.F.F.F.S.S.S.S.S.z.S.#.Q ) { #.#.#.#.+.+.@.@.@.@.0.@.0.0.t.0.0.0.t.0.0.0.0.0.@.@.@.@.@.@.@.@.+.+.+.#.#.#.#.#.#.#.#.#.X.X.X.X.{ { { ) ) ) ) ) ) ) ) ( ( / / _ ( ~ ~ ~ ~ ~ Q Q Q T L L L L L L P P P P P P P P K K K K K K K K S S S S S S A B B n n n b n b x s s s a p p u u y y y y y y y q q q q q q q 9 7 m S Z A S S S S S S S S S S S S F S S S S S D F F F F F F P P P P P P P P P P P L E E W W Q Q Q Q Q Q Q Q Q Q ! ! ! ! ! ! / / ! ! ! ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / [ [ ", +").).).)./.).).).).).).)./././././././././././././.~.!.!.!.!.Q.Q.Q.E.E.E.E.E.E.R.R.R.U.U.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.J.F.F.F.F.F.F.S.S.S.S.S.S.z.l.a.a.{ Q ) { #.#.#.#.#.#.@.@.@.*.@.@.0.0.0.0.0.0.0.0.0.0.@.@.@.@.@.@.@.@.+.+.+.#.#.#.#.#.#.#.#.#.X.X.X.{ { { { ) { ) ) ) ( ( ( ( ( / / ~ ~ ~ ~ ~ ~ Q Q Q Q Q L L L L P P P P P P P K K K K K K K K K K K S S S S S A A B n n n b b b x s s s s p p p u y y y y y y t q q q q q q 8 q 7 7 x A n Z Z Z Z Z Z Z Z A A A S S A S S S S S S S S S F F F F F F F P P P P P P P P P P P L L E W W Q Q Q Q Q Q Q Q Q ! ! ! ! ! ! ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / ", +").).).).).).).).).).).).).).).).(.(././././././.!.!.!.!.!.Q.Q.Q.E.E.E.E.E.E.R.R.R.R.U.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.J.J.J.F.D.S.S.S.S.S.z.l.a.2.2.2.#.~ ) { #.#.#.#.#.@.@.@.@.@.@.@.@.0.0.0.@.@.@.@.@.@.@.@.@.@.@.@.@.+.+.+.#.#.#.#.#.#.#.#.#.#.#.X.X.{ { { ) ) ) ) ) ( ( ( / / / ~ ~ ~ ~ ~ ~ Q Q Q Q Q Y L L L Y P P P P J K K K P K K K K K K K K S S S S S A A B B n n b x l s s s s s p p p p y y y y y w q q q q q q q q 8 6 8 x A n n n Z Z Z Z Z Z Z Z Z Z Z Z A A A S A A S S S S F F F F F F F F F F P P P P P P P P P P L L E E W W Q Q Q Q Q Q Q Q Q Q Q ! ! ! ! / / / ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / / ", +").).).).).).).).).).).).).).).).)././././././.!.!.!.!.!.!.Q.Q.Q.Q.Q.E.E.E.R.R.R.R.R.R.U.R.I.I.I.I.I.I.I.I.I.I.P.I.I.I.I.P.P.P.P.P.P.P.P.J.F.F.F.F.F.D.D.D.z.z.a.a.2.:.,.{ ~ ) { #.#.#.#.@.@.@.+.+.@.@.@.@.*.0.@.@.@.@.@.@.@.@.@.@.@.@.@.+.#.#.#.#.#.#.#.#.#.#.X.X.X.X.X.{ { { { ) ) ) ) ) ) / / / / ~ ~ ~ ~ ~ Q Q Q Q Q Q L L L L L P P P P P J K P P K K K K K K K S S S S S A A A B B b z d s s s s a a p p p u y y y y w q q q q q q q 8 8 8 6 8 x n m m n m n n n Z Z Z Z Z Z Z Z Z A Z A A S S S S S S S F F F F S F F F F F F F P P F F P P P P P P L R E E Q Q Q Q Q Q Q Q Q Q Q Q ! ! ! ! / / ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / ", +"_.`.`.`.).).).).).).).).).).).).)./././././.~.~.!.!.!.Q.Q.Q.Q.Q.Q.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.I.P.P.J.F.F.F.S.S.S.S.A.z.a.a.2.,.:.O.=.#.) ) { #.#.#.#.@.@.+.@.@.@.+.@.@.@.@.@.@.@.@.@.@.@.@.@.@.+.+.#.#.#.#.#.#.#.#.#.#.#.X.X.{ { { { ) ) ) ) ) ) ) ) ( / / / / / ~ ~ ~ ~ ~ Q Q Q W Q L L L L L P P P P P P K P P K K K K S K S S S S S S A A n b c l s s s a a p p p u p y y y y y q q q q q q q q 8 8 9 6 q x x x x x x x x x b b b m m n n Z Z Z Z Z S S S S S S S S S S S D S S S S S F F F F F F F F F F P P P P P L L E E W W Q Q Q Q Q Q Q Q Q Q ! ! ! ! / ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / ", +"`.`.`.`.`._.).)._._._._._._.).)././././././.!.!.!.!.!.Q.Q.Q.Q.Q.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.R.R.R.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.J.F.F.D.S.S.S.S.A.A.z.z.z.z.l.a.e.2.:.:.O.{ / { { #.#.#.#.#.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.+.#.#.#.#.#.#.#.#.#.#.X.X.X.{ { { { ) ) ) ) ) ) ) ) ( / / / / / / ~ ~ ~ ~ ~ ~ Q Q Q Q Q Q L L L P P P P P P P P K K K K K K K S S S S S S A B b b x z l s s s a p p p p u y y y y y q q q q q q q q 8 9 7 6 6 u x x x x x x x x x x x x x x x x b b m n Z Z A A S S S S S S S S S S F S S S S D F F F F F F P P F F P P P P P P P E E W W W Q Q Q Q Q Q Q Q Q ! ! ! ! ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / ", +"`.`.`.`.`.`._._.`.`.`.`.`.`.)././././././././.!.!.!.!.!.Q.Q.E.E.E.E.R.E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.I.I.I.I.I.I.I.I.I.I.I.P.P.P.F.F.D.D.D.S.S.S.S.S.S.A.A.z.z.z.z.z.l.a.a.e.2.#./ ) { { #.#.#.+.#.#.#.#.#.@.@.#.#.#.#.+.+.+.#.#.#.#.#.#.#.#.#.#.#.X.X.{ { { { { ) ) ) ) ) ) ) ) / / / / / / / / ~ ~ ~ ~ ~ ~ Q Q Q Q Q L L L L P P P P P P P P K K K K K K K S S S S C n b c x l l d s s a a a p p u y y y t q q q q q q q q 8 8 8 9 7 6 6 s x l l x x x x x x x x x x x x x b b b m m m m n Z Z Z Z Z A A S S S S S S S S F S D S F F F F F F F P P P P P P P P L L E W W W W Q Q Q Q Q Q Q Q Q ! ! ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / ", +"`.`.`.`.`.`.`.`.`.`.`.`.`.).)./././././././.~.!.!.!.Q.Q.Q.E.E.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.U.I.I.I.I.I.I.I.I.I.I.I.P.J.F.F.F.F.S.S.S.S.S.S.S.S.S.A.z.z.z.C.z.z.z.z.A.2./ ] { #.#.#.@.@.+.#.#.#.#.+.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.X.X.{ { { ) { { ) ) ) ) ) ) / / / / / / / / / / ~ ~ ~ ~ ~ Q Q Q Q Q L L L L L P P P P P P P K K K K K K K S S B n b c x z l d s s s s a p p y y y y y q q q q q q q q q q q q 8 8 9 3 7 s x l l l l l l l l l x x x x x x x x b b b m b b m n Z Z Z A A A A A A S S S S S S S S S S S S F S S F F F F F P P P P P P L L E E W W Q Q Q Q Q Q Q Q Q ! ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / ", +"`.`.`.`.`.`.`.`.`.`.`.`._.)././././././././.~.!.!.Q.Q.Q.E.E.E.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.R.U.R.R.R.R.U.I.I.I.I.I.I.I.I.I.I.I.P.P.P.J.F.F.F.F.F.F.S.D.S.S.S.S.S.S.S.A.A.z.z.z.z.S.,./ { #.#.#.+.@.#.#.#.#.#.#.#.+.#.#.#.#.#.#.#.#.#.#.X.X.{ { { { { ] ) ) ) ) ) ) ( ( ( / / / / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Q Q Q Q Q Y L L L L P P P P K K K K K S K S S S S A B m b b c z l l d s s s s s p p p u y y y w w q q q q q q q q q 8 8 8 9 9 3 7 l l l l l l l l l l x x x x x x x x x x b b b m b m n Z Z A A A A A A A A A S S S S S S S S S S S S S S S S S S S S S D F F P P P P L E E E W W W Q Q Q Q Q Q Q ! ! ! ! ! ! ! ! ! ! / / / ! ! ! ! / / / ! ! ! / / / / / ", +"`.`.`.`.`.`.`.`.`.`.`.`.`.)./././././././.!.!.!.!.Q.Q.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.R.R.R.U.U.R.R.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.J.J.J.F.F.F.F.F.F.F.F.F.S.S.S.S.S.S.S.A.A.z.S.O.P { #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.X.{ { { { { { { ) ) ) ) ) / / / / / / ~ ~ ~ ~ ~ ~ ~ Q ~ ~ Q Q Q Q W L L L L Y P P P K K K S S S S S S A B B n b b c c x z k d s s s s s s p p p u u y y y q q q q q q q q q 8 9 9 9 7 7 3 3 l l l l l l l l l l x x x x x x x x x x b b b m m n Z Z Z Z Z A A A A A A A A S S S S S A S S S S S S S S S S S S S S F F S F F P P P P L L L E W W W Q Q Q Q Q ! ! ! ! ! ! ! ! ! ! ! / / ! ! ! ! / / / / ! ! / / / / / / ", +"`.].].`.`.`.`.`.`.`.`.`.`.`.)././././././.!.!.!.!.!.Q.Q.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.R.R.U.U.U.I.R.R.U.I.I.I.I.I.I.I.P.P.P.P.P.P.J.J.F.F.F.F.F.F.F.F.F.F.F.F.S.S.S.S.D.F.P.P.#.P / #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.X.{ { { { { { { { ) ) ) ) ) ) ) / / / / / / / ~ ~ ~ ~ ~ ~ Q Q Q Q Q Q L L L P P P K K S S S A B B B n b b b b b b x z l d s s s s s a s p p y u y y q q q q q q q q q q 8 9 9 9 7 7 7 , , s x x x l l l l l x l x x x x x x x x b m m m n n n Z Z Z Z Z Z Z A A A A A A A A A S S A A S A S S S S S S S S S S S S S F S S F F P P P L L L L W W W Q Q Q Q Q ! ! ! ! ! ! ! ! ! ! ! ! ! ! Q ! ! / / / / / / / / / / / / ", +"].'.].].].].].].'.`.`.`.`.`.`.)./././././.~.!.!.!.!.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.R.R.U.I.I.I.R.U.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.F.F.F.F.F.F.F.F.F.F.F.F.F.S.F.P.I.P.P.I.2.L L ) #.#.#.{ #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.X.X.X.{ { { { ) ) ) ) ) ) ) ) ) ( / / / / / ( ~ ~ ~ ~ ~ ~ Q Q Q Q Q Q L L P P K S S S A B n b b b c c x x x c x z l d s s s s a p p p p y y y y q q q q q q q q q q 8 8 8 9 9 9 7 3 > 6 s x x x x x l l l l x x x x x x x x x b m m m n Z Z Z Z Z Z Z Z A A A A A A A A A S S A A A A S S S S S S S S S S S S S S S S S S F F F P P L L L E E W Q Q Q Q ! ! ! ! ! ! ! ! ! ! ! / / / / / / / / / / / ' / [ [ [ { { { { ", +"].].].].].].].].].].].].].].].`.)././././././.!.!.!.!.!.Q.Q.E.E.E.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.R.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.F.F.F.F.F.F.F.F.F.F.F.F.F.S.F.P.I.I.P.P.P.I.P.#.Q W ) #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.X.{ { { { ) ) ) ) ) ) ) ) ) ) ( / / / / / ( ( ~ ~ ~ ~ ~ ~ Q Q Q Q W L P K K S C B B n b b c c x x z z l l z z l d d s s s a p p p u u y y y q q q q q q q q q q 8 8 9 8 9 7 6 3 , 3 u x x x x x x x x x l x x x x x x x x x x x x x b m m m n n n n Z n n Z Z Z Z Z Z Z A A A Z A A A A A A S S S S S S S S S S S S S S F F P F P P P L E E W Q Q Q Q ! ! ! ! ! / / / / / / / / / / / / [ [ [ { { { { { { { { { { { { ", +"].].].].].].].].].].].].].].`.`.`.).)./././././.!.!.!.!.!.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.R.R.U.U.R.R.R.R.U.U.I.I.I.I.P.P.P.P.P.P.P.P.P.J.F.F.F.F.F.F.F.F.F.P.I.I.I.I.I.I.I.I.I.R.J.:./ ~ ) { #.#.#.#.#.#.#.#.#.#.#.#.#.#.X.X.X.{ { ) ) ) ) ) ) ) ) ) ) ) ( / / / / / / ( ~ ~ ~ ~ ~ Q Q L L L P K K S A B b b b b c c x z z l l d d l l l s d s s s a p p u u u y y q q q q q q q q q q q 8 9 7 7 6 , , , 7 p x b x x x x x x x x x x l x x x x x x x x x x x x b b b m m n n n n n n n n Z Z Z Z Z Z Z Z Z A A S A A S S S S S S S S S S S S F F F F P P P P L L E W W Q Q Q ! / / / / / / / / / [ [ { { { { { { { { { { { { { { { { | | | | } } ", +"].].].].].].].].].].].].].].`.`.`.`.).).)././././.!.!.!.!.!.!.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.U.I.I.I.I.I.I.P.P.P.P.P.P.P.P.F.F.F.F.F.F.P.I.I.I.R.R.U.R.R.R.U.I.I.R.I.V.@.{ ) ) { X.#.#.#.#.#.#.#.#.#.#.{ { { { { ) { ) ) ) ) ) ) ) ) / / / _ ( ~ ~ ~ ~ ~ Q Q Q Q L L P P P K S S A B n b b b c c z z z l d l d d d d d s s s s s a p u y y y w q q q q q q q q q q 8 9 3 2 , , 2 7 y s x x x l x x x x x x x x x x x l l l x x x x x x x x x b b b m n n n n n n n n Z Z Z Z Z Z Z Z A A A S S S S S S S S S S S S S S S S F F F F P P P L L E Q Q Q ! / / / ` { { { { { { { { { { { { { } { { #.#.#.#.#.#.#.O.#.#.O.O.O.O.O.O.", +"].].].].].].].].].].].].].].].`.`.`.`.`._.).)././././.~.!.!.!.!.!.!.Q.Q.Q.E.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.R.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.I.R.R.I.U.U.U.U.U.R.U.I.I.I.P.I.I.R.I.F.a.@.#.{ ) / / / ) ) { { { ) ) { { ) ) ) ) ) ) ) ( / / ( / ~ ~ ~ Q Q Q Q Q Y L L L L L P K K S S A B B b b b b c x z z l l l d d d d d s s s s s s s a p u y y q q q q q q 8 9 7 6 3 2 , , 2 6 q u s x x x l l l l l l l x x x x l x x x x l l l x x x x x x x x b b b m n n n Z Z Z Z Z Z A A A A Z A A A S S S S S S S S S S S S S S S S S S F P P P L L W Q Q / / / / [ { { { { { { { | | #.#.#.#.#.#.O.O.O.O.O.O.O.O.O.=.=.=.=.O.O.O.O.O.O.O.O.", +"].].].].].].].].].].].].].].].`.`.`.`.`.`.`._.).)./././././.~.!.!.!.!.!.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.R.Y.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.I.R.Y.Y.U.U.U.U.R.R.R.R.R.I.I.I.I.P.P.I.U.R.R.I.P.S.t.#.) / ~ ~ ~ ~ ~ ~ ~ / / / / / / ( ( ~ ~ Q Q Q Q Q Q W L L L L L P P P P P K S S A B B n b c c c x x z l l s s s s s s s s s s s s s a p p u y q q q 8 8 9 6 3 3 2 2 3 6 8 q p s l x x l l l l l l l l l l l l z x l l x x x x l l l x l x x x x x b b b m n n n Z Z Z Z Z A A A A A A A A A S S S S S S S S S S S S F F P P P L E E W Q Q Q ! / / ` { { { } #.O.O.O.O.O.O.O.O.=.=.%.=.:.:.:.:.:.:.:.=.=.=.=.=.=.=.*.=.O.O.O.O.O.O.O.O.", +"].].].].].].].].].].].].].].].].].`.`.`.`.`.`.`.`.).)././././.~.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.I.I.I.I.I.I.P.P.P.P.P.P.P.P.I.R.R.R.U.U.U.U.U.U.U.U.R.R.R.R.U.I.I.I.I.I.I.I.U.R.E.E.R.I.P.V.2.#.{ / Q L P P P P P P P P P P P P P L P P P P P K K K K K K S S S S B m b b c z l l l d s s s s a a a p a s s p p y y q q q q 9 6 6 3 3 3 5 6 6 6 9 q y i s l x x x l l l l l l l l l x x x x x x x x x x x x x x x b x x x x x x x b b m n n n n Z Z A A A A A A Z A A A A A A A A S S S S F P P L L W W Q Q Q / / / / / [ { { { { | #.O.O.O.=.=.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.=.=.=.:.O.O.O.O.O.O.O.O.O.O.O.O.", +"].].].].].].].].].].].].].].].].].].].`.`.`.`.`.`.`.`._.)./././././.~.~.~.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.I.I.I.I.I.I.P.P.P.P.P.P.I.R.R.R.R.R.R.R.U.U.U.U.U.R.U.R.R.R.R.U.R.U.U.U.U.U.I.I.I.I.U.R.R.R.U.I.P.G.a.2.#.{ / Q L P K S A n n b b b b b b b b b b b b c c x x l l d s s s p u y y y q q q q q q q q 9 9 6 6 6 6 3 3 6 6 7 9 8 q q y p s s l l x x x l l l l l l l l l l l l x x x x x x b b b b b b b b b b b b b m x x b b n m n n n Z Z n n n Z Z Z Z A A A S S F F P P L E W Q Q ! / / / / [ { { { { { { { { { { | | #.O.O.O.O.O.=.=.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.=.=.=.:.O.O.O.O.O.O.O.O.O.O.O.O.", +"[.[.].].[.[.].].].].].].].].].].].].].].].`.`.`.`.`.`.`.`._.).)./././././.~.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.R.R.R.R.R.R.R.R.T.I.I.I.I.P.P.P.P.P.P.I.R.R.R.R.R.R.R.U.U.U.U.U.U.U.R.R.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.P.I.I.I.I.I.I.I.P.F.S.z.a.0.O.#.{ / Q W L P S B n b c x z l s s s s p y y y q q q q q q q q q q q q q q y y u p p s s s l x x b b b b b x x x x x x x x x x x x x x x x x x x x x x x x b b m n n n n n n n n n n n n n Z b b b b m n Z A A S F P P L W W Q Q / / / / [ [ { { { { { { { { { { { { { { { { { { { { | | #.#.#.O.O.O.O.=.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.=.=.:.:.=.=.O.O.O.O.O.O.O.O.O.O.", +"[.[.[.{.[.[.[.].].].].].].].].].].].].].].].].].`.`.`.`.`.`.`._.).).)./././././././.~.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.R.R.R.R.R.R.R.R.R.I.I.I.P.P.P.P.P.I.R.R.R.R.U.U.U.I.I.I.I.U.U.U.U.U.U.I.I.I.I.I.U.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.F.F.F.F.F.G.G.F.F.F.F.F.G.S.V.z.a.t.2.:.@.#.#.{ { ] / / / Q Q L P P K S S A A A A A A A A A A A A A A A A A n n n n m b b b b b b b b b b b m b b b b b b b b b b b b b b b m n n n n A A A A S S S F P P L L W Q Q E W Q Q / / / / / [ [ [ { { { { { { { { { { { { { { { { { { { { { { { { { { { { | #.#.O.O.O.O.O.=.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.=.:.:.:.=.O.O.O.O.O.O.O.O.O.O.", +"{.{.{.[.{.{.{.[.[.[.].].].].].].].].].].].].].].].].`.`.`.`.`.`.`.`.).).).).(./././././.~.~.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.E.E.E.E.E.R.E.R.R.R.R.R.R.R.I.I.I.P.P.P.I.R.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.I.P.P.P.P.F.F.F.F.F.F.F.F.F.G.S.S.S.S.V.V.V.z.z.z.z.a.a.a.a.a.a.a.a.a.2.2.2.0.:.:.*.O.#.#.{ { ) / / / ! Q Q Q W W W L L L L L L L L L L L P P P P P P P P P P P L L P P P P P P L L L L E E W W W Q Q Q Q Q / / / / / / / [ { { { { { { { [ / [ [ { { { { { { { [ [ [ [ { { { { { { { { { { { { { { { { { { { { { | #.#.O.O.O.O.=.:.:.:.:.:.:.:.:.,.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.=.=.=.=.=.=.=.O.O.O.O.", +"{.{.{.{.{.{.{.{.{.{.[.[.[.].].].].].].].].].].].].].].].].].`.`.`.`.`.`._._.).).).).)././././././.~.~.~.!.!.!.!.!.!.Q.Q.E.E.E.E.E.E.E.E.E.E.R.R.R.R.I.I.P.I.R.R.T.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.F.F.F.F.F.F.F.F.F.F.G.G.G.S.S.S.S.V.V.V.V.z.z.a.a.a.a.t.t.t.t.2.2.2.2.2.2.2.2.2.:.:.:.:.@.O.O.#.#.{ { { { { { { { { { { { { { { { { { { { { { { ' / / / / / / { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { / [ { { { { { { { { { { { { { { { { { { { { { { { | | | | #.#.#.O.O.O.O.O.:.:.:.:.,.2.2.2.2.2.,.,.,.>.,.,.:.:.:.:.:.:.:.:.:.:.:.:.:.:.2.2.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.=.=.=.=.O.O.O.O.", +"{.{.{.{.{.{.{.{.{.{.{.{.[.[.[.[.].].].].].].].].].].].].].].].].].].`.`.`.`.`.`._._.).).).).).(./././././././.^.~.!.!.!.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.R.R.E.E.E.E.R.R.R.U.U.U.R.U.U.U.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.F.F.F.F.F.F.F.F.F.G.G.S.S.S.S.S.V.V.V.z.z.z.a.a.a.a.a.t.t.t.2.2.2.2.2.2.2.2.0.:.:.:.:.*.O.O.O.#.#.#.{ { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { #.{ { { { { { { { { { { { { { { { { { { | | { | | #.#.#.#.#.O.O.=.:.:.:.:.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.,.,.,.>.:.,.,.,.,.>.:.:.:.2.2.,.,.:.:.:.:.:.2.:.:.:.:.:.:.:.:.:.:.:.=.=.=.O.O.O.O.", +"{.{.{.{.{.{.{.{.{.{.{.{.[.[.{.[.[.[.[.].].].[.[.].].].].].].].].].].].].].].].`.'.`.`.`._._.).).).).).).)././././././.~.~.!.!.!.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.Q.!.Q.Q.Q.Q.E.E.E.R.R.R.U.U.U.U.U.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.F.F.F.F.F.F.F.F.G.S.S.S.S.V.V.z.z.z.z.z.a.a.a.a.a.a.a.a.a.t.2.2.2.2.2.2.2.2.0.0.:.:.:.O.O.O.O.#.#.#.#.#.#.| { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { } { | | { { { { { { { { | | | | #.#.#.#.#.O.{ { | | | | #.#.#.#.#.#.#.#.#.#.| | #.#.#.#.O.O.O.=.:.:.:.:.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.,.,.,.,.,.,.>.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.=.", +"}.}.{.{.{.{.{.{.{.{.{.{.{.[.[.{.[.[.[.[.[.].].].].].].].].].].].].].].].].].].].].].].].].`.`.`.`._._.).).).).(.(././././././.~.~.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.!.!.!.Q.Q.E.E.E.E.E.E.R.R.R.R.U.U.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.F.F.F.F.G.G.G.G.S.S.S.S.V.V.V.V.z.z.a.a.a.a.a.a.a.a.a.a.2.2.2.2.2.2.2.0.:.:.:.:.@.O.O.O.O.O.#.#.#.#.#.{ } } { { { } { { { { | | } #.#.#.#.| #.#.#.#.#.#.#.#.| #.#.#.#.#.#.#.#.#.O.O.#.#.#.#.#.#.#.#.O.O.O.O.O.O.O.O.=.:.O.#.#.#.#.#.O.#.#.#.#.#.#.#.O.O.O.O.O.%.:.:.:.,.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.", +"}.}.}.}.}.}.{.{.{.{.{.{.{.{.{.{.[.[.[.{.[.[.[.[.].].].].].].].].].].].].].].].].].].].].].].].].].].].'.`.`._._._.).).).).).).(.(./././.~.~.!.!.!.!.!.!././././.~.~.~.!.Q.Q.E.E.E.E.E.E.R.R.R.R.U.U.U.U.U.I.I.I.I.I.I.P.I.P.P.P.P.P.P.P.P.F.F.F.G.G.S.S.G.S.S.S.S.S.S.S.V.V.z.z.z.z.z.z.z.z.a.a.a.a.2.2.2.2.2.2.2.2.2.2.0.0.:.:.:.O.O.O.O.O.#.#.#.#.#.} } { | #.#.#.#.#.#.O.O.O.O.O.#.#.#.O.O.O.#.#.O.O.O.O.O.O.O.O.O.O.=.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.:.:.:.:.:.:.:.O.O.O.O.O.O.O.O.=.O.:.:.:.:.2.2.2.2.2.t.t.e.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.", +"|.|.}.}.}.}.}.{.}.{.{.{.{.{.{.{.{.{.[.[.[.[.[.[.[.[.].].[.[.].].].].].].].].].].].].].].].].].].].].].].].].].`.'.'.`.`.`.`._._._._._._.)././.(.(.)./././././././././././.~.~.!.!.Q.Q.E.E.E.E.R.R.R.R.R.U.U.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.F.F.F.F.G.S.S.S.S.S.S.S.S.S.V.V.V.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.2.2.2.2.2.2.2.0.:.:.:.=.*.=.O.O.O.O.#.#.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.@.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.0.0.2.2.,.:.2.2.2.:.:.:.:.:.2.2.2.2.2.a.a.a.a.a.a.a.a.a.a.a.t.e.e.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.:.:.:.:.:.:.:.:.:.:.:.:.:.2.2.:.:.:.:.", +"|.|.|.|.|.|.|.}.}.}.}.{.{.{.{.{.{.{.{.{.[.[.{.{.[.[.[.].[.[.[.[.].].].].].].].].].].].].].].].].].].].].].].].].'.'.'.'.`.`.`.`.`.`.`._._.`.'.].].`._._.`.`._._.).).(.(./././././././.!.!.!.Q.Q.E.E.E.E.E.R.R.U.U.I.I.I.P.I.P.P.P.P.P.P.P.F.F.F.F.F.F.F.G.S.S.S.S.S.S.S.V.V.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.t.t.2.2.2.>.:.:.:.:.:.:.=.O.O.O.O.O.O.O.O.O.O.*.*.=.=.O.@.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.0.2.2.2.2.e.e.2.t.t.a.a.a.a.a.a.z.z.a.a.z.a.a.a.a.k.l.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.u.2.2.2.2.2.2.t.t.t.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.>.2.:.:.:.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"|.|.|.|.|.|.}.|.|.}.}.}.}.}.}.}.{.{.{.{.{.{.[.{.[.[.[.[.[.].].].[.].].].].].].].].].].].].].].].].].].].].'.].].].'.`.`.`.`.`.`.`.`.`.`.].].].].].].`.`.].].].`.`.`.`._._._.).).(.(.(.(.(./././.~.!.!.Q.Q.Q.E.E.E.E.E.R.U.I.I.I.I.I.P.P.P.P.P.P.P.P.F.F.F.F.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.V.V.V.V.z.V.V.z.z.z.z.z.a.a.a.a.a.a.a.a.2.2.2.2.2.2.0.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.0.2.2.2.2.2.2.2.2.2.2.2.2.t.a.a.a.a.z.z.z.z.z.z.z.V.z.V.S.S.S.S.S.S.S.z.z.V.S.V.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.2.2.2.t.2.2.2.2.2.2.2.2.t.t.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +"|.|.|.|.|.|.|.|.|.|.}.}.}.}.}.}.}.}.{.{.{.{.{.{.{.[.[.[.[.[.[.[.[.[.[.].].].].].].].].].].].].].].].].].].].'.`.].].`.`.`.`.`.`.`.`.].[.].].].].].].].].].].].].].].].].`.`.`.`._.`._._._._._._.).(.(./././.~.!.!.!.!.Q.Q.Q.Q.E.E.E.R.R.R.U.U.U.I.I.I.P.P.P.P.P.P.P.P.P.F.F.F.F.F.F.G.S.G.G.S.S.S.S.S.S.V.C.V.V.z.z.z.z.z.a.a.a.a.a.a.y.u.t.t.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.t.a.a.a.a.a.a.z.z.z.z.z.V.S.S.S.S.S.S.G.G.G.G.F.F.G.F.G.G.G.S.S.S.S.S.G.G.G.V.z.S.S.S.S.S.V.z.z.a.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.y.t.t.t.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.t.a.2.y.e.2.2.2.a.a.2.2.t.2.a.a.a.a.a.a.", +"|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.}.}.}.{.{.{.{.{.{.{.[.[.{.[.[.[.[.[.[.].].].].].].].].].].].].].].].].].].].`.`.`.].`.`.`.`.`.`.`.].].].].].[.].].].].].].].].].].].].].].].].].].].].].].].`.`.`.`.`.`._._._.).).(././././.~.~.~.!.!.!.!.!.!.Q.Q.Q.E.E.E.E.E.E.E.R.R.R.T.U.U.U.I.I.I.P.P.P.P.P.P.F.F.F.F.F.F.F.F.G.G.S.S.S.S.S.S.S.V.V.V.V.V.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.V.V.S.S.S.S.S.S.S.G.G.G.F.F.F.F.F.F.P.P.P.F.F.F.P.F.P.F.F.F.F.F.F.F.F.G.G.G.G.G.D.F.F.F.F.S.z.S.S.S.S.S.S.S.S.V.z.z.z.z.z.z.a.a.a.a.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.t.t.y.t.a.a.a.a.a.a.a.a.a.z.a.", +"|.|.|.|.|.|.|.}.|.|.|.}.}.}.}.}.}.}.}.{.{.{.{.{.{.{.[.[.[.[.[.[.[.].].].].].].].].].].].].].].].].].].].`.`.`.`.`.`.`.`.`.`.].[.[.].].].].[.].].].].].`.].].].].].].].].].].].].].].].].].].].].].].`.`.`.`.`.`.`.`.`._._.).(.(././././././.~.~.~.!.!.!.!.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.R.R.R.R.R.T.U.U.U.I.I.I.U.I.I.I.I.I.I.I.I.I.P.P.P.P.P.F.F.F.F.F.F.F.F.F.F.F.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.S.S.S.S.S.S.S.S.S.S.S.S.S.z.z.z.z.z.z.z.z.z.z.a.a.a.a.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.z.z.", +"|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.}.}.}.{.{.{.{.{.{.{.{.{.{.[.[.[.[.[.[.[.[.].].].].].].].].].].].].].].].].].].].`.`.`.`.].].[.[.[.[.].].].].].].].].].`.].].].].].].].].].].].].].].].].].`.`.`.].`.`.`.`.`.`.`.`.`.`.`.`.`.`._._._.).).(.(.(./././././././././.~.~.~.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.R.R.R.R.R.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.F.F.P.P.F.F.F.F.P.F.F.F.S.S.S.S.S.S.S.S.S.S.S.S.S.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.z.z.z.z.z.z.a.a.a.a.a.a.z.a.a.a.a.a.a.a.a.a.a.a.a.a.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.l.l.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.z.", +"|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.}.}.{.{.{.{.{.{.{.{.{.{.{.[.[.[.].[.[.].].].].].].].].].].].].].].].`.].].].`.`.`.].].[.[.[.[.[.[.[.[.[.[.].].].].].`.].].].].].].].].].].].].].].].].].`.`.`.].`.`.`.`.`.`.`.`.`.`.`.`.`._._._._._._._._.).).(.(././././././././././././././.^.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.U.U.U.U.U.I.I.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.F.S.G.G.F.G.G.G.G.G.G.G.G.S.F.F.S.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.", +"|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.}.}.}.{.{.{.{.{.{.{.{.{.[.[.[.[.[.].].].].].].].].].].].].].].].].].].'.].].].`.`.].[.[.[.[.[.[.[.[.[.[.[.].].].].].].`.].].].].].].].].].].].].].].].].].].`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`._._._._._._._._.).).).).(.(.(.(.(./././././././././.~.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.R.E.E.R.R.R.R.R.T.U.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.F.G.G.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.S.V.V.V.z.A.A.V.z.V.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.V.z.V.V.V.V.V.V.V.z.V.V.z.V.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.", +"|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.}.}.}.{.{.{.{.{.{.{.{.{.[.[.[.[.[.].].].].].].].].].].].].].].].].].].`.'.].].].].{.[.[.[.[.[.[.[.[.[.].].].].].].].].].`.].].].].].].].].].].].].].].].].].].`.`.`.`.`.`.`.`.`.`.`.`.`.`._._._._._._._._.).).).).).(.(.(.(.(.(.(.(.(.(././././././././.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.F.G.F.F.P.F.F.F.F.P.P.F.F.F.F.F.F.F.F.F.S.S.S.S.V.V.V.V.V.z.z.z.z.z.z.V.V.V.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.V.z.z.V.V.V.S.S.S.S.S.S.S.V.V.V.V.V.V.V.V.V.C.S.V.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.", +"|.|.|.|.|.|.|.|.}.}.}.}.}.}.}.}.}.}.}.{.{.{.{.{.{.{.[.[.[.[.[.[.[.].].].].].].].].].].].].].].].].].].`.].`.].[.{.[.[.[.[.[.[.[.[.].].].].].].].].].].].`.`.].].].].].].].].].].].].].].].].].`.`.`.`.`.`.`.`.`.`._.`.`._._._._._._._._._._.).).).).).(.(.(.(.(.(.(.(.(./././././././././././././.~.~.~.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.R.R.R.T.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.F.F.F.P.P.P.P.P.P.P.P.P.P.P.F.P.F.F.F.F.F.S.S.S.S.S.S.S.S.S.S.V.V.V.z.z.V.z.z.S.S.V.V.V.V.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.V.V.V.V.V.V.C.V.z.z.z.V.V.z.z.z.z.z.z.z.z.z.z.", +"|.|.|.|.|.|.|.|.}.}.}.}.}.}.}.}.}.}.{.{.{.{.{.{.{.[.[.[.[.[.[.].[.[.].].].].].].].].].].].].].].].].].`.].].{.[.[.[.[.[.[.[.[.[.].].].].].].`.`.].].].].`.`.`.].].].].].].].].].].].].].].].`.`.`.`.`.`.`.`.`.`._._.`.`._._._._._._._._._._.).).).).).(.(.(.(.(.(.(.(.(./././././././././././././././././.~.~.~.~.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.E.R.R.R.R.R.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.F.F.F.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.F.F.F.P.P.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.G.F.G.G.G.S.S.S.G.G.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.V.V.S.V.V.A.V.V.z.z.V.V.V.z.z.z.z.z.z.z.z.z.", +"|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.}.}.{.{.{.{.{.{.{.[.[.[.[.[.[.].[.[.].].].].].].].].].].].].].].].].`.].[.{.{.[.[.[.[.{.{.[.].].].].].].`.`._._.`.].].].].`.`.`.].].].].].].].].].].].].`.`.`.`.`.`.`.`.`.`.`.`._._._.`._._._._._._._._._._._.).).).).(.(.(.(.(.(.(.(.(.(././././././././././././././././.~.~.~.~.~.~.~.~.~.!.!.~.~.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.E.E.Q.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.R.U.U.U.U.U.U.U.I.I.U.U.U.U.I.I.I.I.I.I.I.I.P.P.F.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.I.P.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.G.F.F.F.G.G.G.S.S.G.G.G.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.C.V.V.V.V.V.V.V.V.A.V.V.z.V.V.z.z.z.z.z.z.z.", +"|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.}.}.{.{.{.{.{.{.[.[.[.[.[.[.[.].[.[.].].].].].].].].].].].].].].].`.].[.{.{.{.{.{.{.{.{.[.].].].].].`.`.`.`._._.`.].].].].`.`.`.`.`.].].].].].].].].].].`.`.`.`.`.`.`.`.`.`.`.`.`._._.`._._._._._._._._._.).).).).).(.(.(.(.(.(.(.(.(.(.(././././././././././././.~./././.~.~.~.~.~.~.~.~.~.!.!.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.Q.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.U.U.I.P.P.P.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.G.G.G.S.S.G.G.G.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.C.V.V.V.V.V.V.S.S.S.z.z.V.z.z.z.z.z.z.a.", +"|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.}.}.{.{.{.{.{.{.[.[.[.[.[.[.].].].].].].].].].].].].].].].].].].].].{.{.{.{.{.{.{.{.[.].].].].].`.`.`._._._._.`.`.`.`.].].`._._.`._.`.`.`.].].].].].].].].].].].`.`.`.`.`.`.`.`.`._.`.`._._._._._._._._._.).).).).).(.(.(.(.(.(.(.(.(./.(././././././././././././././././.~.~.~.~.~.~.~.~.~.!.!.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.U.I.I.I.I.I.P.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.G.G.G.G.G.G.G.S.G.S.S.S.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.V.V.V.V.V.V.V.z.A.z.z.V.V.V.z.z.z.z.a.", +"|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.}.}.{.{.{.{.{.{.[.[.[.[.[.[.[.].].].].].].].].].].].].].].].].].].[.{.{.{.{.{.{.{.{.[.].].].].`.`.`.`.`._._._._._.`.`.`.].].]._.`._._._._._.`.].].].].].].].'.].].].].`.`.`.`.`.`.`.`.`.`.`._._._._._._._._.).).).).).(.(.(.(.(.(.(.(././.(././././././././././././.~.^./.^.~.~.~.~.~.~.~.~.~.~.!.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.!.Q.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.U.I.I.I.I.I.I.I.I.I.U.I.I.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.G.G.G.G.G.G.G.G.S.S.S.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.C.V.V.V.V.V.V.A.A.z.z.z.z.z.z.z.z.z.z.", +"|.|.|.|.|.|.|.|.|.}.}.}.}.}.{.{.{.{.{.{.{.[.[.[.[.[.[.[.].].].].].].].].].].].].].].].].].].].[.}.{.{.{.{.{.{.{.[.].].].].`.`.`._._._._._._._._.`.`.`.`.`.].`.`.`._._._._._._.`.`.`.].].].].`.`.].].`.`.`.`.`.`.`.`.`.`.`.`._._._._._._._.).).).).).(.(.(.(.(.(.(.(././././././././././././././././././././.~.~.~.~.~.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.U.I.I.I.I.I.I.I.I.I.I.I.I.I.U.U.U.U.U.I.I.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.G.G.G.G.G.G.G.G.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.V.V.V.V.V.V.V.z.z.z.z.z.z.z.z.z.z.z.", +"|.|.|.|.|.|.|.|.}.}.}.}.}.}.{.{.{.{.{.{.[.[.[.[.[.[.].].].].].].].].].].].].].].].].].].].].[.}.{.{.{.{.}.}.{.].].].].].`.`.`.`._._._._._._._._.`.`.`.`.`.`.`.`.`._._._._._._._._._._.`.`.`.`.`.].].`.`.`.`.`.`.`.`.`.`.`.`._._._._._._._._.).).).).(.(.(.(.(.(.(.(./././././././././././././././././.~.^.^.~.~.~.~.~.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.R.R.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.U.U.U.U.U.U.I.U.I.U.U.I.I.I.I.I.I.I.I.I.I.I.I.P.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.G.G.G.G.G.G.G.G.G.G.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.V.C.V.V.V.z.z.z.z.z.z.z.z.z.z.z.z.", +"|.|.|.|.|.}.}.}.}.}.}.}.}.{.{.{.{.{.{.{.[.[.[.[.[.[.[.[.].[.].].].].].].].].].].].].].].].[.}.{.}.{.}.}.}.[.].].].].`.`.`.`.`.`.`._._._._._._.)._.`.`.`.`.`.`.`._._._._._._._._._.).).).(._._.`.`.'.`.`.`.`.`.`.`.`.`.`.`.`.`._._._._._._._._._.).).).).(.(.(.(.(.(.(.(./././././././././././././././.~.~.~./.~.~.~.~.~.~.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.R.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.G.G.G.G.G.G.G.G.S.S.S.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.V.V.V.V.V.z.z.z.z.z.z.z.z.z.z.z.z.z.a.", +"|.|.|.|.}.}.}.}.}.}.}.}.}.{.{.{.{.{.{.{.[.[.[.[.[.[.[.[.].].].].].].].].].].].].].].].].[.}.}.}.}.}.}.}.[.].].].].`.`.`.`.`.`.`.`._._._._._._.).`.`.`.`.`.`.`.`._._._._._._._._._.).).).(.).(.(.)._._.`.`.`.`.`.`.`.`.`.`.`.`.`._._._._._._._._.).).).).).(.(.(.(.(.(.(.(.(./././././././././././././././.^././.~.~.~.~.~.~.~.~.~.~.~.~.!.!.~.~.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.R.R.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.F.F.F.F.F.F.F.F.F.F.F.F.F.F.G.G.G.G.G.G.G.G.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.V.V.V.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.", +"|.|.|.|.|.|.}.}.}.}.}.}.{.{.{.{.{.{.{.[.[.[.[.[.[.].[.].[.].].].].].].].].].].].].].].[.}.}.}.}.}.}.}.[.].].].].`.`.`.`.`.`.`.`._._._._._._.).)._.`.`.`.`.`.`.`._._._._._._._._._._.).).).).(.(.(.(.(.(.(.).(.)._._.`.`.`.`.`.`._._._._._._._._._.).).).(.(.(.(.(.(.(.(.(.(./././.(././././././././././././.~./././.^.~.~.~.~.~.~.~.~.~.!.!.!.~.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.R.R.U.U.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.P.F.F.F.F.F.F.F.F.F.F.F.F.G.G.G.G.G.G.G.S.S.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.V.S.S.V.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.", +"|.|.|.|.|.|.|.}.}.}.}.}.{.{.{.{.{.{.[.[.[.[.[.[.[.].[.[.[.].].].].].].].].].].].].].[.}.}.}.}.}.}.}.[.].].].].`.`.`.`._.`.`.`._._._._._._.).).)._.`.`.`.`.`.`.`.`._._._._._._._._._.).).).).).(.(.(.(.(.(.(.(.(.(.(.(.(.).)._._._._._._._._._._._._.).).).(.(.(.(.(.(.(.(.(./././.(./././././././././././././.^././.~.~.~.~.~.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.!.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.R.R.R.R.U.U.U.U.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.P.F.F.F.F.F.F.F.F.F.F.G.G.G.G.G.G.G.S.S.S.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.C.V.V.S.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.", +"|.|.|.}.|.|.}.}.}.}.}.}.{.{.{.{.{.{.[.[.[.[.[.[.[.].].].].].].].].].].].].].].].].[.}.}.}.}.}.}.}.[.].].].].`.`.`.`.`._._.`.`._._._._._._.).).)._.`.`.`.`.`.`.`.`._._._._._._._._._.).).).).).).(.(.(.(.(.(.(.(.(.(.(.(./.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./././././././././././././././././././.~.~.~.~.~.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.R.E.E.R.R.R.U.U.U.U.U.U.U.U.U.I.I.I.I.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.F.F.F.F.F.F.F.F.F.G.G.G.G.G.G.G.G.G.G.G.S.S.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.V.V.V.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.", +"|.|.}.}.|.|.}.}.}.}.}.}.{.{.{.{.{.{.[.[.[.[.[.[.[.].].].].].].].].].].].].].].].].}.}.}.}.}.}.}.[.].].].].].`.`.`.`.`.`._._.`._._._._._._.).).).).`.`.`.`.`.`.`.`._._._._._._._._._.).).).).).).(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./.(.(././././././././././././././././././././././././././././././././././.~.~.~.~.~.~.~.~.~.~.!.~.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.E.R.R.R.R.U.U.U.U.U.U.U.U.U.U.I.I.I.U.I.I.I.I.I.I.I.I.I.I.I.I.I.U.I.I.I.I.I.I.I.I.I.I.P.P.I.I.I.I.I.I.I.I.I.I.I.I.P.F.F.F.F.F.F.F.F.F.G.G.G.G.G.G.G.G.G.G.G.S.S.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.V.V.V.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.", +"|.|.}.}.|.|.}.}.}.}.}.}.{.{.{.{.{.[.[.[.[.[.[.[.].].].].].].].].].].].].].].].].}.}.}.}.}.}.}.[.].].].].].`.`.`.`.`._.`.`.`._._._._._._._.).).).)._.`.`.`.`.`.`.`._._._._._._._._._.).).).).).).(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./././././././././././././././././././././././././././.~.~.~.~.~.~.~.~.~.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.R.R.E.R.R.R.R.R.U.U.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.I.P.I.I.I.I.I.I.I.I.I.I.I.P.P.F.F.F.F.F.F.F.G.G.G.G.G.G.G.G.S.S.S.S.G.S.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.C.S.S.V.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"|.|.}.}.}.}.}.}.}.}.}.}.{.{.{.{.{.[.[.[.[.[.[.].].].].].].].].].].].].].].].].[.}.}.}.}.}.}.[.].].].].].`.`.`.`.`.`._.`.`.`._._._._._._._.).).).)._.`.`.`._._.`._.`._._._._._._._._.).).).).).).(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(././././././././././././././././././././././.~./././.~.~.~.~.~.~.~.~.~.~.~.~.!.~.~.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.R.R.E.R.R.R.R.U.U.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.U.I.I.I.I.I.I.I.I.I.I.P.I.I.I.P.I.I.I.I.I.I.I.I.I.P.P.F.F.F.F.F.F.F.G.G.G.G.G.G.G.G.S.S.S.S.G.S.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"|.|.|.}.}.}.}.}.}.}.}.{.{.{.{.{.[.[.[.[.[.[.[.[.[.[.].].].].].].].].].].].].].}.}.}.}.}.}.[.].].].].].`.`.`.`.`.`.`.`.`.`._._._._._._._.).).).).).).`.`._._._.`.`.`._._._._._._._.).).).).).).).).(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(././././././././././././././././././././././.~././.~.~.~.~.~.~.~.~.~.~.~.~.~.!.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.U.R.R.R.U.R.U.U.U.U.U.U.U.U.I.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.U.U.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.I.I.I.I.I.I.P.I.P.F.F.F.F.F.G.G.G.G.G.G.G.G.G.G.S.S.G.G.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.C.V.V.V.V.S.V.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +"|.|.}.}.}.}.}.}.}.}.{.{.{.{.{.{.[.[.[.[.[.[.[.[.[.].].].].].].].].].].].].].}.}.}.}.}.}.{.].].].].].].`.`.`.`.`.`.`.`.`._._._._._._._.).).).).).).(.`.`._._._._._._.`._._._._._._.).).).).).).).).(.(.(.(.(.(.(.).).).(.(.(.(.(.(.(././././././././././././././././././././././././.~.~.~.~.~.~.~.~.~.~.!.~.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.!.Q.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.R.R.U.U.R.R.T.R.R.U.U.U.U.U.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.U.U.U.U.U.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.I.I.I.I.I.I.P.F.F.F.F.F.G.G.G.G.G.G.G.G.G.G.S.S.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.V.V.V.V.V.V.V.V.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.y.", +"|.}.}.}.}.}.}.}.{.{.{.{.{.{.{.{.[.[.[.[.[.[.].].].].].].].].].].].].].].].[.}.}.}.}.}.}.].].].].].].`.`.`.`._._.`.`.`._._._._._._._._.).).).).).).)._._._._._._._._._._._._._._._.).).).).).).).(.(.(.(.(.(.(.(.(.).).).(.(.(.(.(.(.(.(././././././././././././././././././././.~.~.~.~.~.~.~.~.~.~.~.!.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.Q.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.R.U.R.R.R.R.R.U.U.U.U.U.U.U.U.U.U.U.I.U.I.I.I.I.I.I.I.I.I.I.I.I.I.U.U.U.U.U.U.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.I.P.P.P.P.P.P.F.F.F.G.G.G.G.G.G.S.S.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.C.V.V.V.V.V.V.V.V.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.y.t.", +"}.}.}.}.}.}.}.{.{.{.{.{.{.{.{.{.[.[.[.[.[.[.].].].].].].].].].].].].].].].}.}.}.}.}.}.[.].].].].`.`.`.`.`._._._.`._._._._.).).)._.).).).).).).).).(._._._._._._._._._._._._._._.).).).).).).(.(.(.(.(.(.(.(.(.(.).).).).).(.(.(.(.(.(.(././././././././././././././././././././.^.~.~.~.~.~.~.~.~.~.~.!.~.~.~.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.U.U.U.U.U.U.U.U.U.I.I.I.U.I.I.I.I.I.I.U.I.I.I.I.I.I.U.I.U.U.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.F.G.G.G.G.G.G.G.S.S.G.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.C.V.V.C.V.V.V.V.V.V.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.t.t.t.", +"}.}.}.}.}.}.{.}.{.{.{.{.{.[.[.[.[.[.[.[.[.[.].].].].].].].].].].].].].].[.}.}.}.}.}.[.].].].].'.`.`.`.`.`.`.`._._._._._._._._.).).).).).).).).(.(.(.)._._._._._._._._._._.).).).).).).).).(.(.(.(.(.(.(.(.(.).).).).).).).(.(.(.(.(.(././././././././././././././././././././.~.~.~.~.~.~.~.~.~.~.~.!.!.!.~.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.U.U.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.F.G.G.G.G.G.G.G.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.C.V.V.V.V.V.V.V.V.V.V.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.t.t.2.2.", +"}.}.}.}.}.{.{.}.{.{.{.{.[.[.[.[.[.[.].[.[.[.].].].].].].].].].].].].].].}.}.}.}.}.[.].].].].].`.`.`.`.`.`._._._._.)._._._.).).).).).).).).(.(.(.(.(.(._._._._._._._._._._.).).).).).).).(.(.(.(.(.(.(.(.(.(.).).).).).).).(.(.(./.(./././././././././././././././.~././././.~.~.~.~.~.~.~.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.R.E.E.E.R.R.T.R.R.U.U.U.U.U.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.F.F.P.P.P.P.F.G.G.S.S.S.G.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.V.V.V.V.V.V.V.V.V.V.V.V.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.t.2.2.2.", +"{.{.{.{.{.{.}.{.{.{.[.{.[.[.[.[.[.].].].].].].].].].].].].].].].].].].[.}.}.}.}.}.].].].].].`.`.`.`.`.`._._._._.).).)._.).).).).).).).).(.).).(.(.(./.)._._._._._.)._._._.).).).).).(.(.(.(.(.(.(.(.(.(.(.(.(.).(.).).).).(.(.(./.(././././././././././././././.~.~.~./.~.~.~.~.~.~.~.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.R.R.E.R.R.R.U.R.R.U.U.U.U.U.U.U.U.U.U.I.U.U.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.I.I.P.I.I.I.P.P.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.F.F.F.F.P.F.F.G.G.G.S.G.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.V.V.V.V.V.V.V.V.z.z.z.V.V.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.t.t.t.2.2.2.2.", +"{.{.{.{.{.{.{.{.[.[.[.{.[.[.[.[.].].].].].].].].].].].].].].].].].].].{.}.}.}.}.[.].].].].`.`.`.`.`._._._._._._.).).).).).).).).).(.(.(.).(.(.(./././.(._.).).).).).)._._.).(.(.(.(.).(.(.(.(.(.(.(.(.(.(.(.(.(.(.).).(.(.(.(.(././././././././././././././.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.Q.E.E.E.E.E.E.E.E.E.E.E.E.R.R.E.R.R.R.R.R.U.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.I.I.I.I.I.I.P.P.P.P.P.F.F.F.F.F.F.F.F.G.G.G.G.G.G.G.S.S.S.S.S.S.S.S.S.S.S.S.V.V.V.V.V.V.V.V.V.V.V.V.z.z.V.V.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.t.t.2.2.2.2.2.2.2.", +"[.[.[.[.[.[.{.[.[.[.[.[.[.[.].].].].].].].].].].].].].].].].].].`.`.].{.}.}.}.{.].].].].].`.`._.`._._._._._._._.).).).).).).).).(.).).(.(.(.(.(././././.).).).).).).).)._.).(.(.(.(.(.(.(.(.(.(.(.(.(.(././.(.(.(.).).).(.(.(.(./././././././././././././././.~././.~.~.~.~.~.~.~.~.~.~.~.~.!.!.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.U.U.R.U.U.U.R.U.U.U.U.U.I.I.U.U.I.I.I.I.I.I.I.I.I.U.I.I.I.I.P.P.P.P.P.F.P.P.P.P.P.P.P.P.P.P.P.I.I.I.I.P.P.P.P.F.F.F.F.G.G.F.G.S.S.G.S.S.S.S.S.S.S.S.S.S.S.S.S.S.C.V.V.V.V.V.V.V.C.z.z.V.V.V.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.y.t.t.t.2.2.2.2.2.2.2.2.", +"[.[.[.[.[.[.[.[.[.[.[.[.].].].].].].].].].].].].].].].].].].].`.`.`.].{.}.}.}.].].].`.`.`.`.`._._._._._._._._.).).).).).).).).).(.(.(.(.(.(.(.(././././.(.).).).).)._._._._.(.(.(.(.(.(.(.(.(.(.(.(.(.(././.(.(.(.(.).).).(.(.(.(././././././././././././././.~./.~.~.~.~.~.~.~.~.~.~.~.~.~.!.!.~.~.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.U.U.R.U.U.U.R.U.U.U.U.I.I.I.U.U.I.I.I.I.I.I.I.I.I.U.I.I.I.I.P.P.P.P.F.F.P.F.P.P.F.F.F.P.P.P.P.I.I.I.I.P.P.P.P.F.F.F.F.G.G.G.G.G.S.S.S.S.S.S.S.S.S.S.S.V.S.V.V.V.V.z.V.V.z.z.z.z.z.z.V.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.t.t.t.t.2.2.2.2.2.2.2.2.2.", +"[.[.].].].].].[.[.].[.].].].].].].].].].].].].].].].].].`.`.`.`.`.].].[.}.}.[.].].].`.`.`.`._._._._.).)._.).).).).).).).).).).).(.(.(.(././.(.(././././.(.).).).).(._._.)._.(.(.(.(.(.(.(.(.(.(.(.(././././.(.(.(.(.(.).).).(.(.(././././././././.~././././././.~.~.~.~.~.~.~.~.~.~.~.~.~.!.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.Q.E.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.U.U.U.U.U.U.U.U.I.I.I.U.I.I.I.I.I.I.I.I.I.U.I.I.I.P.P.P.P.P.P.F.F.F.F.P.F.F.F.F.F.F.P.P.P.P.P.I.P.P.P.P.P.F.F.F.G.G.G.G.S.S.S.S.S.S.S.S.S.V.V.V.V.V.V.z.z.z.z.V.V.V.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.t.t.2.2.2.2.2.2.2.2.", +"].].].].].].].].].].[.].].].].].].].].].].].].].].].].'.`.`.`.`.`.].[.[.}.[.].].].`.`.`.`._._._._.).).).).).).).).(.(.(.(.(.(.(.(.(./././././././././././.(.(.(.(.(.).).(._.(.(.(.(.(.(.(.(.(.(.(././././././.(.(.(.(.).).).).(.(././././././././.~.~.^./././.~.~.~.~.~.~.~.~.~.~.~.~.~.~.!.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.R.R.R.R.R.T.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.U.I.I.P.P.P.P.P.P.P.F.F.F.F.F.F.F.F.F.F.F.F.F.F.P.P.P.I.P.P.P.P.F.F.G.G.G.G.S.S.S.S.S.S.S.V.V.V.V.V.V.V.z.z.z.z.z.z.V.V.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.e.2.t.t.2.2.2.2.2.2.2.2.", +"].].].].].].].].].].].].].].].].].].].].].].`.`.].`.`.`.`.`.`.`.`.].[.[.[.].].].`.`.`.`.`._._._.).).).).).).).(.(.(.(.(.(.(.(././.(.(././././././././././.(.(.(.(.(.(.).(.).(.(.(.(.(.(.(.(.(.(./././././.(.(./.(.(.(.(.(.(.(.(.(./././././././././././././.^.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.Q.Q.E.E.E.E.E.E.E.E.E.E.E.R.R.E.R.R.R.R.R.T.U.U.U.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.F.F.F.F.F.F.F.F.F.F.G.G.G.F.F.F.P.P.P.P.F.F.F.G.G.G.G.S.S.S.S.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.t.2.2.2.2.2.2.2.2.2.2.", +"].].].].].].].].].].].].].].].].].].].].`.`.`.`.`.`.`.`.`.`.`.`.`.].].[.].].].`.`.`.`._._._._._.).).).).).(.(.(.(.(.(.(.(./././././././././././././././././.(.(.(.(.(.(.(.(.(./././././.(./././././././././././././.(.(.(.(.(.(.(././././././.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.!.!.!.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.W.E.E.E.E.E.E.E.E.E.E.R.R.U.U.R.R.R.R.R.U.U.U.U.U.U.U.U.I.I.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.P.F.F.F.F.F.F.F.F.G.G.G.G.G.G.S.S.G.F.F.P.P.P.P.F.F.G.G.G.G.S.S.S.V.V.V.V.V.V.V.V.z.z.V.V.z.z.V.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.t.t.t.2.2.2.2.2.2.2.2.", +"].].].].].].].].].].].].].].].].].].].].`.`.`.`.`.`.`.`.`.`.`.`.`.`.].].].].].`.`.`.`._._.)._.).).).).).(.(.(.(.(.(.(.(./././././././././././././././././././././././.(.(.(.(./.(.(././././././././././././././././././.(.(.(.(././././././.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.U.U.R.R.R.U.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.F.F.F.F.F.F.F.F.G.G.G.G.G.G.S.G.G.G.G.F.F.P.P.P.F.F.G.G.G.G.S.S.V.V.V.V.V.V.V.V.z.z.z.V.V.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.z.a.a.a.a.a.a.a.a.a.a.a.a.a.t.t.t.t.e.2.2.2.2.2.2.2.", +"].].].].].].].].].].].].].].].].].].`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.].].].].`.`.`.`._._.).).).).).(.(.(.(.(.(.(.(././././././././././././././././././././././././././.(.(.(.(./././././././././././././././././././././././././.(./././.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.R.U.U.R.U.U.U.U.U.U.U.U.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.P.P.P.P.P.F.F.F.F.F.F.F.G.G.G.G.G.G.G.G.G.G.G.G.S.G.F.P.P.P.F.F.G.G.G.G.S.S.V.V.V.V.V.V.z.z.z.z.z.V.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.t.t.t.t.2.2.2.2.2.2.2.2.2.2." +}; diff --git a/lib/libXpm/test/pixmaps/good/chromesphere.xpm b/lib/libXpm/test/pixmaps/good/chromesphere.xpm new file mode 100644 index 000000000..10f430b12 --- /dev/null +++ b/lib/libXpm/test/pixmaps/good/chromesphere.xpm @@ -0,0 +1,362 @@ +/* XPM */ +/* Chrome texture from flyingtoasters module of xscreensaver + * + * flyingtoasters, Copyright (c) 2003-2006 Jamie Zawinski <jwz@jwz.org> + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ +static char * chromesphere_xpm[] = { +"256 256 91 1", +" c None", +". c #7774CC", +"+ c #BBBAC6", +"@ c #F1E89C", +"# c #E1D89D", +"$ c #9E9DB2", +"% c #AFBCEA", +"& c #ACABB5", +"* c #DDD8B4", +"= c #CEC2D8", +"- c #9CADEC", +"; c #EBE8B9", +"> c #92A1EA", +", c #D3D2DB", +"' c #A0AEE6", +") c #E3F7F6", +"! c #E6D4ED", +"~ c #E7E7CF", +"{ c #C7C2D7", +"] c #E4CC86", +"^ c #CBB699", +"/ c #A2A1E1", +"( c #B6C7F3", +"_ c #DDDEE3", +": c #D1C5E0", +"< c #B08F81", +"[ c #EFF2E8", +"} c #ADAEDC", +"| c #C3D4F6", +"1 c #E0C68A", +"2 c #E1CBF1", +"3 c #E0E3E7", +"4 c #9FA1D3", +"5 c #8183B7", +"6 c #B3B2BF", +"7 c #D1CCE5", +"8 c #E8E8E2", +"9 c #9A95AE", +"0 c #D9CCA2", +"a c #C8C4EA", +"b c #DBBF8E", +"c c #CED7E0", +"d c #BCA192", +"e c #C3C0B6", +"f c #A8B1ED", +"g c #A6A4B4", +"h c #C2BDD3", +"i c #C9CED8", +"j c #898CDA", +"k c #C8C8D6", +"l c #CFD4F6", +"m c #D0C6D8", +"n c #BCBCE7", +"o c #EEEEEA", +"p c #CCCBC9", +"q c #AEADBD", +"r c #B7B6D9", +"s c #9D93DA", +"t c #DACBE7", +"u c #E7DDED", +"v c #D8D8DC", +"w c #8D90BE", +"x c #C7C6CA", +"y c #ABA1E7", +"z c #C6C5F2", +"A c #D7D6CA", +"B c #DAD8E7", +"C c #F6F9E8", +"D c #BBB3EB", +"E c #DAD6F1", +"F c #C8C8E6", +"G c #D6D2E8", +"H c #D1CCF0", +"I c #DAC6ED", +"J c #D3B291", +"K c #E9E7EE", +"L c #CFCDD6", +"M c #C5CEF5", +"N c #CEC0BE", +"O c #D9E7F9", +"P c #B7B6C2", +"Q c #D1AD8B", +"R c #C1C0CB", +"S c #DFDECA", +"T c #C8C2E6", +"U c #A5A4C4", +"V c #B8AFE6", +"W c #C5BCE8", +"X c #D9DEF2", +"Y c #D2C5EA", +"Z c #F0DA91", +"PPPPP++++R+RRRRR{xxxpppLLLL,,,,,,,,,,77:FTWWWWWWTTTTWTTTTTTTYaYYaHYaHaaTTWWDDDVVyyy/sy}VDWa77vBvBBvvvvvv,A,,,,LLLLLLLLpppppppkpxkkxxxxRRRR+++++PPPPPPPPP666666666666666666666666PP++hhhhhh{h===:m:m:Y:YYYYYYYYYY=Y=Y=:====={{{hNhh++PPP66qqq&&&&&&qq&qqqqqqqq666", +"66PP+PP+++e+eRexx{xxkpkppLLL,,,,,,v,7G7FTTTWWWTTWWWWTWWTTTTTTYzaHYzHaYYTWWnWWDV}VyysyyyVWTYFGGvv___Bvv,,v,,,LLLLLLppppkpkkkkkixkpkxxxRxRR+R+++P+PPPP66666666666666666666666P6666PPP++hNhN===hTT==m:::Y:Y=Y=Y====YYY:Y:Y=={T===hhhNh++P66qqq&&&&&&&&&&&&qqqq66qq6", +"PPPPP+P++++++RReRxxxxpkLi,L,,,,,,,,vL77:TWWhWWWTTTTWTTWTTWTTTTYTz7aYFzazTWDDDDVVyyyysyyVDWa77GBvvv_vvvv,Av,,,,,,iLLLiLpkkipkpkpxkxxxxRx+R+++++PP666PP6PP6666qqqqqqqqqqqq66666666PP++hhNhhhh===T:::77:7YYYI=I=IY=I===I=:===={h=NhNh++PPP666q&&g&&g&qq&qqqq6qq66q6", +"66PP+P++++eReRRRx{xxppLppp,p,,,,,,G,,G7F{TWWWWWWWWWTWTTYWTWYTzYTHzYFHYYTTWWWDVVVVyysyyyVnTaFGvBBSuvvvGv,,,,Ap,Lp,LppppppikpixixxxkxxxxRRRRR+++PPPP6P6P666666666666666666666P6666PPP+hhhhW==hh==F:7::Y::YI=YIWIWY=I=Y=:=Y=={=TNWNhhe++P666qq&&qg&q&&&&&&qqqq6qq66", +"6P66P^P+e+++ReRexxxxkppLLL,,,A,,,,,,G77YTTWDWWWWWWWTWWWTYYWTYWYTYHHTzzYTTWWWDDVyVyysyyVVDWT:7BBvB_vuvAvAv,,,Lp,p,LLpLkppppkipxkxxxxRRReRR++e++PPP6P6P6P6666666666666666666666666PP+e+hhNNh=======::7Y7YY=IY=III=I=I=I=::===={hhhNh+^++P6q6q&&q&&&&&&&&&q&qqq6qq6", +"P66PPP+++++e+RRRRRxxxppLLp,,,,Av,,,,,7FkTWrWrDDhWWWWWWWWWWaWWaTTzYzYYYzTTTDDWVVVVyyysyyVDTT7G,Bv_vvvBvv,,A,,,,LLLLpLkLpkkpxkxixixxRxxxRRRR++++PPP6P6PP6PP666666666666666666P66666PPehhhWhh=W=T::Fm7m7YYYWIWIWIWIY=I=::Y===={===hhN++PP6666q&&&&g&&&&&&&&&&6qq666", +"6P6PPPPPe+e+RRexxRxxxppiLpp,,,,,G,,G,77TWWWDWWDWWWWWWWWWTWWaWWWYaYFzFYzTWTWrDVVVyyyssyyVrWT7GBB___v_vvvv,,,,,p,p,LLLipppkixipixxix(eRRxeRR++R+PPPP6P6P666666666666666666666666666PP++NhN=h={={m==:=Yt:YYII=II=II=I=I=I=:=T=={=NhNh++++^6qq6&&&&&&&&&&&&q&&6666q6", +"66P6PP+++++e+RRRRxxpkxppLLA,,,,v,,,,,7:mW=rWDDrDWDWWWWWWWWYWWWzWTzzYzFYYTWWWDVVVVyyysyyVDTTY7Gvv___vBvv,AA,,p,p,LLpLpipkxpixxxixxxixRe(RR+R++++PPP6PP6P6666666666666666666666^66PPPh+hhhN{==T=T::::::tYY==IW=IW=Y=I=I=Y===={=Whhhhe+PP666q6&&&&&&&d&&&qd&&&&6q66", +"P66PP6PPe+++eRRxRxxxpkpLLLLLA,,,vv,L,7aFWWDDDDWDWWDWWWWWWWWYWWYaYTzYzzTzWWDWDDVVyyyysyyVDWz7GvB_SB_vvvvv,cA,,,pipLippkipkpiiixxxiexe(eeeR++++P+PPP66666P666666666666666666^66q666^PhhNhhhhh====F=YtYYYIIIIIII=II=Y=Y=I=Y=m==m=N=hhNP++P666&&&d&g&&&&&&&qqq&d6&6q", +"666PPPPPP+e+ReRRxRxkxppp,,p,,,,v7,G,777WWWDVDDDWVWWWWWWWWzWWYWWWWYTTaYzYTTWWDVVVVyyysyyVDWT77GBB___Bvvv,A,,,p,LLLLpLppkpixxxxiixxxxxe(eRR+e+++PPPPP6P6P6666666666&66&666qq666P66PPPP+hhN===h=T:=Y:::II==IWIWIWYYII=I:==:=={m{hNhNhh++^P6666q&qg&&gg&&&&&&qqqqqq6", +"66P6PP+P+++eRReRx{xxxpppp,,L,,,v,,,,GF:WWDDVVVDDDDDWWWWWWWWWWWzWWzYaTTTzWWWWDVVVyyyssyyVDWT77Bv_!vSBvvvvG,,,L,L,pppLpppkipxixxxixxxexeRRe%+++P+PPP666666666&^&&6P66^qq&P666666666P+hhNhhh==h={:=Y:I:YIYY=IIIII=Y=I=I=I=Im=T==WNhhhh+++P66&6&&q&&&&&&&&&&&qq&qq66", +"666PPPPP+++++RRxexxkpkppi,LA,,v,,vG,L7FWW^DVVVDDDWDWDWWWWWWWWWWWaWzWzYTTYWDDWVVVyyyyssyVrWT7GGvv__!_vv,,A,A,,,,LLLpkpkppppixpixxixiRxe(e+e++++PPPP6P666666666PP66666PPP666666666PPPP+hhh=hh====mI::tII=II=IWIWIWI=:Y:=:==m==={WNNhe++PP6666q&&&&g&&g&&d&&&qq66qq", +"6666PP+PePe+e+RRRxxxpppLp,,,A,,,G,,G77FWDDVVVVVDDDDWWWWWWWDWWWWWzWYWaaazTTWWDDVVVyyysyyyDWT7Gvuv__vSB_vAv,,,pppLLpLLppxkkxxixxiexRx(eeeeR+e++P+PP6P66666666&6&6&6&6&6666q^666666PPehhhNNh====:=:=I:YYIYY=YI=III=II=I:=Im=={===Nhhhh^+P^66&qq&&g&g&&g&&&&&&q&&qqq", +"6666PP+PP++R+eRRxRxxkxppA,,,,,,,GG,77a=WWVVVVVVVDDDDDWDWWWWWWWWWWzWzWYWTWWWDWDVVyyyyssyVDWT77Gv___BuvvBA,,,,A,,LLLpkkpkpxixxixxxixxxe(Re%++++PPPPP6666P666P66666666666666666^666P+Pehhhh=={T{:m:::ItIIYI=II=I=IYIYI=IY==Ym={kTNWNhh+++P6666q&&&g&&g&g&&d&&q&q666", +"6666PPP++++e+ReRxxxxpkpppp,A,A,,,G,,7FWWDVVVyVVVDDDWWWDWDWDDWWWWWWWYWzWYWWWWDDVVVyysysyyrWW7GBBv__vv_vBvA,,L,L,pLLLLpipkxipxixiexxxxReeRe++++P+PP6P66666666&666&6&666666q666q6666P+h+NNhh=={T=::Y::YYI=IYY=II=I=I=Y:=I===:==={=Nhhh++P+P66&&&d&g&&g&g&&&&&q&&6&q", +"6666PPPPe++eR+ReRRxxxppp,,,,,GA,G,,77Y=WDVdVyVVVVDDVDWDWWWWDWDWWWWzWzWTWTWDWWDDVyyysssyVDWT7GvuBSu__vvvvAA,,,,LLLpLkpppixxxixxxixx(xe(e%e+ePePPPP6P6666666666&66666&66666666P666P+++hhh={=h==:=LI:IIIIYYYIYY=IYYYI=I:=Y=:Tm={=hhhNh+++P^666qqqg&g&&g&g&&d&&qqqq6", +"66666PP6P+++eRRRxxxxkkipipL,,,vv,G,,LaWWVDVyVyVVVDDDWWWWDDWDDWDWWWWWWWzWWWWWDDVDVyyyyssyVDT:7G_uB_S!vvvv,,,LpLpLLiLpkkkipxxiixxxxxexeeeeR%++PPPPPP66P66666666666666&&666q666666^6P++hhhNW=h=T=Y:YIt:YI=IYIIYYII=IY:ImIm=m{=={=N=hhhh++P666&q&&&&&&g&&gg&&&&&&qqq", +"&&666PP+P++++eRRRR{xpppLL,,,,v,G,,,77Y=DDVyVdyVVVVDDDVWWWWWWDWDDWWWWWaWaWWWWWDVVVyysysyyVWW7GvvB_vuvuvvvAA,A,,,pipikppixxixxxxixxie(Rx%ee+ePe+PP6PP66P6&66&66&6&6&666&66^66666P6PP++hhNh=h===:=:t:YtII=II=YI=YIYI=I====:=m{{={hNNhNe+++P666q&&&g&g&&g&&gg&&&qqqq", +"66666PPP++e++ReRxxxxpppLL,p,,,v,GGL77TWWVVyVyyVyVVVDWDWDWDWDWDDWDWWWWWWWWWWWDDDVyyyyssyyVnWF7BB__B_vvvvv,c,,LpiLLippkpiixipxixxxe(xxeeee%e%+PPPPPP66P6666^&66&6&66666666q66666P66P+hhRhh=W==T:::YIYYYIYYIIYIIYYII:III:::=m={N{hhhhh+hP+P66qq&&&&dgg&g&&&g&&&&q6q", +"666666PP+P++e+ReRRRxkpp,pL,,,,,G,GGLY=WDVVyyVyVVVVVDDDWDWDDWDDDDWWWWWWWWWWWWWDVVVyyysssyVDT7GG_u___vBvvvAA,,,LLpppikixxxixxixxiiexxxe(Reee+ePePP6PP66P66666&66666&6&6q666^66666PPP++hWNhN=hT:=:mIYttYYII=YI=YII::I==m:=mm{==h=hNNW^e++P6^666&&g&&&&g&g&gqd&&qqqq", +"66666PPPP+e+eRRRxxxxxppL,,A,A,,G,GL77=WDVyyyyyVyVVVDDDWDWDDDWDWDDWWWWWWWWWDWWDWVVyyyssyyVDT7GvB_3___!Av,,,,,,pppkpkpixixxixxiexxxxxeRee%+++PPPPPPP666666&66&666^&66&6666q6666666^++heh{h=T==::Y7YI:II:YYIYYIYYYI::I=ImI=m=====Nhhhhh++^P6q6&&&&ggg&g&g&&&g&&&&qq", +"&6666PPPP++R++eRRx{pppipLL,,,v,G,GG7Y=WVVVyyyyVyVVDDDDWWDWDDDDDDWDWDDnWWDWWDWDDVVyyysssyVWW:7vu_Su_vBv,vA,,LLLipipixxxxixxxixixxx(ie(Ree++PePPP6P6P6666666666&&&6&^66q66666666PP6PPhhNh=h=={F::mtYttYYIIYIIYIYI:II:::===mm={hNWNhNh+e++P6666&&&&gggggg&gg&&&&qqq", +"&&66666P+P++eRRRexxxkpLLLL,,,,,,G,G7:WWVVyydyyyVyVVVDWDDDDDDDDDDDDWWDWWWWWWWWDDVyyyysssyVDT77GB___S_vvv,A,,p,pppkpxixxxxixxxeixxxeexxeRe(eP%Pe6P66P6666&&66&66666&6&6666666^666PP++h+hh=h===:FY:YYYI:YYYIYIYIYYY::I=I::=={==hhhNhhh++++P666&&&&&&g&g&g&&g&d&&qqq", +"666666PPP++++eRRRRxkpppiA,,,,v,,tL77TIWVVyyyyyyyVVVDDDWWDWDDDVDVDWDDWDWDDWWDWWDVDyyyssssVnWFGB__u__vBvvv,,,,LLkpixxxxiexxxxp(exxx(xe(R+e+ePePPP6e6666P66^6&66666&6&66666666666P6PP+hhN{h=W===:::IIttIYIYIIYI=I:IImI::=::mm={==hhhW^+R+P^6666&&&gggg&dggg&g&&&&&q", +"&&66666PePe+eRRRx{xxxpppL,,,,,GAGGLtTWDVVyyyyyyVyVVDDDDDDDVVDVVDDDDDWDDWDWDWWDDVVyyssssyyDWY7Eu3_u__vv,,,,,pLipkiipkxxxixx(xxx(exxexeeR%e+PPPPP6P6P6666&&666&6&P666&6666666666P6PP^hhh=h={Tm::t:Y:Y:I:I:IIIIII:IIm:Im=m={k{{{Nhh+Rhr++++66&&&dq&&ggggg&g&&&&&&qq", +"&6&6666PP+++++exexxkppLL,,,,,,,,G77:IWDVyyysydyyVVVDDWDWDDVVVVVDDDDDDWDDWDWDWDDVVVysssssVDW7GBB_3__vvvvA,,L,i,kpxxkkxx(xxxxxexxxxe(e(ee+e%e+PePPP666P6666&666666&66&66q^6666666PP++Rh=h=====F:=7tIIYtIYIYIYYI:tImImI:m={m={NhhNh++Ph+P+6^66&&&&gggggg&g&ggg&&&&&", +"q66666PPP+e+eR+xRxxxLpLLL,,,,G,,G,77WWDVyy<ysyyydVVVWDVDDDVVVVVVDDDDDDDDWDWDWDDVyyyyssssVDW77Bu___uvvGAc,Ai,ppipkkkxkxxxxxxxxx(exRxeRR%e+ePPPPPPPP66666666&6&6&P&6^q6&6qq666666^P++RhNhW==T=:YY:tYt:t:tIYIIYI:IIImmtm:m{{{{{ehhhPhPP+++66666&&&&ggggggg&&g&&&&&q", +"&&&6666P+P+++eRRx{{pkp,p,,,,,,,,G77IWWQVyysysyyyyVVVDDWDVDVVVyVVVDDDDWDDDDDWWWDVVyyssjssyDnY,BBu3_BvvvA,,p,ipipkkxkxxxxx(kxxxxxx(RRRee+e%e+PePPP6P6666666&6666666q&6666P66^666P6PP++hh{=h{=:m7:t:tYIYt:YI:IIIIImIIm::===m=hNhh^Nr^+PPPP+P6qq&&&gg&ggg&ggg&gg&&q&", +"q6&6666PPPe++R+RexxpppLLL,,,G,G,v7tYWDDVyyysyyyyVyVVVDDDVVVVVVVVVVDDDDDDWDDWDDDVVyysssjsyDWHGB__u3vvvvv,c,pippkpkxkxxxRxxxRRkxxxexRR(eR+e+++PPPPP6P6&666666&66&666q666666q6666P6P+RRhh={===::Y:tYIt:ItIIIYI=ItIIImIImmm{{{hhh++PPrPPV^D6P^66qq&&g&gggggggg&&&&&q", +"&&6666PP+PPe+eRRxxxxppLLA,,,,,,GG77WIWVVyyssysyyVyVVDDDDVVVVVyVVVDDDDDDDDDDWWDDVVyyssjsyyVWFGB_3___vv,,ALLi,ixikxx(xxRxxRxxRRxRxRRxeRe(e%e++PePPP666666&66666666&66&66666P66666PPP+h{hh===Fm:77:YtYYtYt:IIIIImItmIm::==={=hNhh^+PV^P6qP6P666&&&d&ggggggg&g&g&&&&", +"q&&6666PPeP+eRReRRxxpiLL,,,,,,G,G77YWDVyyy<ssyyyyVdVVWDDDVVVVVVVDDDWDWDWWDWWWWVVVyysssjsyVWYvEu3uSuvvv,A,,ppipxxxxxxx(xxR(xRR(ex(eRRRRee++++PPPPPPP6&66666&6&666&6666d66666P666PP++ehNWh==m:::7YYItYtYtYIYItIIIIImItmmm={Nhhh+r+P6q6P6P66666q&&&&ggggggdgg&g&&&&", +"&&6&666PPP++++RRxxxxppLpL,,,,,G,G7YIWDWdysys<yyyyyVVVDDDVVVVVVVDDDWDWDWDWWDWWWDDVyysssssyVW7GB____vvv,A,,ipiikxkkxxRRRRxeRRxxRxRe(RRRe(eeeePePPPP6666&6666666666^66q6666666666P6P++h{h==={T::7Yt:t:IYtItIItImtmtmIm::m==h{hh+^D^66666q6666666&&gg&gggggggg&&g&g&", +"q&666666P+e+exRRR{xxpp,,LA,,G,G,G7:WWWVyyy<sssyyyVVVVDDDDVVVVVVVDDDWDWDWDWWWWWWDVVysss.syVWaGB333__vvv,L,iippkxxxxxxxxRR(eRRRRRxRexR(ee(e(e%ePPe6P6666&6&6&&6&&&&&666q66666666PPP+hhNhW===::YI:tIItIIYIIIYIIIIItttmtmmxx{h++hr6q6qqqq6qq666&q&&&ggggggggggg&&&&&", +"&&&&66P6++P+R+eRxxkkpLLL,,,,G,,,G7YIWDVyysss<syyyVyDDDWDDDVVVVDDDDDWWWWWWWWWWWWWVVdsssssyVWYGBuuu__vv,,,L,pkkkkxxR(xRRexRxxRRRxRxRxxxxe(ee+ePePPP6P66666666&66666666666q^6666666P+hhhh====:::YttYtYIYtYYIIYtItIItmtmmk={hNh++PP66qqq&6&&&66&6&&&&&gggggggggg&g&&", +"q&6&6666++++eRReRxppppLLL,,,,GG,G7YWWDVyysssss<yyVVVWDWDWDDDDVDDWWWWWWWWWWWIWIWDWVyyssssyVWYGB333Svvv,,,Liikikx(xRRxx(+R++RRR+RRx(exR(exxe(e+PPPe666666&66&6&6666&^q666q666666PPP+ehNWW==:=I:YItIItIIttYIIYIItIItmImmk={R++PPPqqqq&&&&&&&&6&&&&d&ggg$gggggg&&g&&", +"&&&6666PP+++eRRRx{xxpL,,,,,G,,,,7tWIWJVdy<s<ssyyyVVDDDWWDWDDDDDDDWDWWWWWYWYWWWIWDQVysssssVnaG_u3_u_v,,,L,LpixkxxRxxRReRxRRRRRRRRRRxxxxexx(eeeePP6PP6666&66&666&&q66666666666^666PPhhhNW=====IYtYItYtIIIIIIIttItttI7:=={Nhh+PV^6qd&&Q&&&qd6&&&&&&ggggggggggggg&gg", +"q&&&6666+P+e%eRexxkppiL,,,,,G,G,77YWDDVyssssssyyyVVWWWWWDDWDDDDDWWWWWTTWTWWYYYWWDVVyysysyVWTHBu33SBvA,,LLkppkxxxxRRRxR+xRRRRRRRxxxRkxki(xex(+++PP66666&P&66&6666&q666666666q66P^PhhN=====I=:I:tYIIYIYItIIIYItIIILILmm={Nh++P6q&6qq&gq&&q&qq&6&&&&ggg$gggggg&&&&&", +"&&66666PP+P+eRRxRxpppp,p,,,,G,GL7TIWWVVyysss<syyVVDDDWWWWWDWWDDDWWWWYWYWYYYYTIIWWVVyysyyyVDYGB333__vc,,LiLkkkxxxRxxxRe(+RRRRRRRRxe(xxxxxixe(eePePPP66666&66&666666^6666q^66PPP6PP+hhNW====I=:IYtIIttttIttIItIttImIIm:x{hh+^6Vq&&&&q&&&&&&&&&&&&&&ggg$d$gggggg&g&", +"q&&&6666PePe%eRRxxxkLL,LL,,,G,,,7YTWDDyy<s<ssyyyVVDWWWWWWWWDWDWWWWWTYWYzWzYYzYWWWDVyyyysyVDaGEu3uSBv,,,Liiipkxx(RR+xR+eRRRRRRRRR(xxxkxixxixe(e+PP66666&666&6&6&6&qqq666qq666666PPheh==W=I=II:tYttIIIItIIt2It:IttILIm={hN+rP66dq&g&&&&d&&&q&q&&&g&ggg$gg$gg&g&g&g", +"&&66&6P6PPPe%eRxxRpLpp,L,,,,,,G77YIWDQVyssssssdyVDDWTWTWWWWWWWDWWTWWzYzYHYzYYYIIWWDyyyyyyVnY7u3_K_SvA,LLLpkxkxRRRR(+RRRR+R++(Rxxxxxxixxiixpxee+ePPP6666&66&66&6q666^6666P666PPP^PhhNW=N===m:I:tIIttttIItIIttttIItm7mm=NhhPV6q}d&&&&g&&&d&&&&&&&&ggggggggggggg&g&", +"&&&6666PPP++eeRRxxkpLL,A,,,GLG,G7=WWWVyyy<s<syyVVVWWWTYWWWWWWDWWWWYYzYzzzYHFHYYWWDDVyVVVVDDYHE333_Bv,cLp7kkkxkxxxRRRRR+R+RR+e+RRRkxxkixxipix(ee+PP6P66&66&6&66666666qqP6666666PP+hhh==WI=I:YIYtHIIIIttIttIIItttttmI=k{hhPP66&&&U&g&g&g&g&&&&&&&&&gg$$ggggggg&&&&", +"&&&&&66PPP++RRRxxxipp,,L,,,Gv,G7YWIDWVVyyssysyyVVDWWYWYYYWWWWWWWWzYzYYYYYHHHHHIIIWVVyyVDDDWa7Buu3__vv,,LpikkxxxRRRRRRe%e%R+RRxRxxxxpipipiippi(e+ePP66666666&666&6666P66^66PP666P++{N=====::IYIIIItItIIttIIttIttItImm==hh^P6q&&&&&&g&g&&&g&&&&&&g&&ggg$$gggg&ggg&", +"q&66666PPPe++eRxxxiLLpA,,,,,t,777TWWDVyyyysyyyyVVWWWYazYzYWWWWWWWWYzYzHHHHHHHHHYWDDVVVDDWWTHHB333uBvG,L7kikxkR(eRRRRRRR+eRRR+(Rxxkixipiiipiipexe%PPP66&6&6&6&66&66666666666P66PP+hhh====YI:IYYtIIHIttIIH2t22tItttmmm=NhPP66&&&g&g&&ggg&&g&&&&&&g&gg$gg$gggg&&&&&", +"&&&&666P+PPeRexxxppLL,,,A,GGcGG7YIWWDQVdyys<yyVVVWWWzYYzYzYYWWWWWzzYHHHHHHGGGHIYIWWDVDWWWTTYGuuu3__vv,LkpxkxRxRRRRRR++R++R+ReRxxxxxppiipipipi(ee+eP6666666&66&66666666PP66P666PP+hx{====::YtIIYttIIIHttItIttt2tttt:=kNh+P6q&&&g&g&g&&&gg&ggd&&&&g&gg$$ggggggg&g&", +"&&&6&66PP++eRRRxxpLL,,ALvGvGG,G7TWWWVDVyyyyyyyVVDWWTYzYYzTzazYzzWYYzHHGHHHtGElHYWWWDDWWTYYFH7B338uSv,,,LikxxxxxRRR%RR+RR+RRRRRxxkiiiipipppppipxee%P6P6&66&6&66q6&66P6666666P66Ph+NhW====IY:tYtIIItIIIt2I2t22ttItItL=hhhP6qq&g&g&g&ggg&&g&&&&g&&&&&ggg$$gggggg&&&", +"&&6&666P+++RxRxxppp,L,,,GvG,E77YYIWWWVVVdyyyyyVDWWTTFHHHYYTYWWTWzzYHHGtGGEEEEGtHIWWWWWYYHHHHGBK333BBv,LLkizxxRRxRRR++R+%R+RRR(Rxxxppipppipppxi(ee+ePP666666&6&6&6666P666^6P6PPP++h{T=WY==IYItYIHHIIItII2tItt2tttttI==hW^6qq&&&&&g&g&&gg&gg&g&&&&g&ggggg$ggg&&g&&", +"q&66&P6P+e++exxxpiL,A,A,,vGGB77:TWWWDDQVyyydyVVDDTYYzHYFHYzzYYYYzYYHHGGGGGGEEEGHYWWWYWYHHGGGEBuKK3_Bv,LLkixRxxRRRRRR+R+eRRRRRxxkxkxpipxxxxxxipxxe%e6P6666&6&6q66666666666666^6P+hh{=:Y==I:YItIIIIIIIttIt2tIt2tttmtm=Nh+V6qq&&&g&g&gg&g&g&g&&&&&&&ggggggggggg&g&&", +"&&&P&6PP++eRxxxxppLL,,vAGG,GG77HWIWWWDVVQyyyyVVWWWTYHHHHHHYHzazWYzHHHHEGEEXEEGEHYTWWYHlHBEBBBuu3K3_B,,LLikxx(RRRRR+R+%e%+RRxRxxkxiippixxixxxxip(ee+PPP66666q&6q6q666PP6666666PP+hh{T=W=Y=IYHItHtIItIIttItt222tIttIt=Nh^D^q&&&&g&g&g&g&g&g&g&g&&&g&ggg$$gggggg&&&", +"q6&P6PePeeRRRxkkpL,LA,GvvBGGGHYYYWWWDWDVVyyVyVVDWaFH7GGHHHYHYYHzYzHHGGEEEEE!X!GtIWWYHHEEuuuu333K333_v,,LkkkRxx(eRRRRR+eRRR+(Rx(pxxiixxxee(exixiex%ePP6666&6&66&6q66666PPPPP66PP+h={=:YYYYIYYYIIIIIIIII2III2t22tttmm=hh+66Vq&dU&dU&gg&g&gg&g&g&&&&g&$ggggggggggqq", +"6&666PP++RRRxxkppi,A,,vvGGB7HHzYTIWIWDWVVVVyVVDWTTYHHHGGHHHzHYzYHHHHG2EEuEuXuXEHHYzYHEEuX3KK3KKK83_Bvc,LLikkxRRe%RR+RRR+RRRRRRxkxpxxxe(xexeexpxieee++66666&6&6q666666P66PPPPP6P+Nh===Y=:IYIIIIYIIIII2I22I222t2Gtttm=Nh+PPqV&q&Ug&&g&gggg&ggg&&&&&g&$gg$g$ggg&&qq", +"66P6PPP+eRRxxxii,p,Av,GvvGB77HYYYTWWWWDDVVyVVVWWYza7GlGGGGGHHHHzYHHtEG!EuEXuEEEHHHYlGBX33K3KKKK8K83vv,,,kkkxxR(eRRR+R+R+RRRRxxxkkixxxeeee(e(exxeie(ePP666666&66q6q666PP66P6PPP++{h{==YY==I=IYIIYIIII22I2II222t!ttpI=Nh+^P6qq&q&&gg&g&g&ggg&gg&&&&&&g$ggggggg&&&6", +"666PPP++(eRxxipLL,,,,vAGGG77HYzYYIWIWWWJVVVVVDWWTYHHGGGGGGHHHHHHHHHlGEXXu3uu3uEGHzHGEuKKKKoKKooo833_vAcLLikxRxRRRR+Re%RRRRRRRRxixkxe(RR+e+ee(xx(ie%ePP666&666&6q6666P66P6PPPPPPhh==Y==I=IIIIIIIIIIIII2222222tttttmm=NW+PD^6q&&&g&&gggggggggg&&&&&&&gg$$gggg&&&66", +"6PPPPe+Pee(pxxi,,,AvGvBvGGtt7YYYYYIYWWWDDVVVVDWWz7HHGEEEGEGHHHHHYHtGGE!Xu33uXuEGHHGE33Ko[o[[oooo8K3_Bvc,iikkRxxRR(e+RR+RR(RxxxxkkkxReR++++e+eexexxee%+P66P66&66666666PPP6P6PPP+h{{==YYIYYYYYYIIIIIIIIII22I22!tGttmm=NhN++V6Vqd&dgg&gggggggggg&&&&&g&$gg$g&g&&&q6", +"66PP+P+ReexxipipL,G,vBBGGG7HYFHzYYTIIWWWWVVVDWWTTHHGGEBEEEEEEHtHHHlEEEXu33uXuEEGGEGuuKoo[[[[oooKK833_v,,Lkkkk(RRx+RRRRRReRxRzxkxkxRRR++++++e%eRex(ReePPP66666&6&6666PPPPP6PP+P+{h=T===IWIIWIIYIIIIIIIII222222!2ttt:m={W^hP^6VqU&&gdggggdggg&g&g&&&g&g$gggg&&&666", +"PPPP+eP+RRxxxpi,,,AGvGvG7G77HYHYYYYTWIWDWDVDDWWYa7HEEBuBEBEEEGlGHtGEEuEuuK333uEGHEX3KKo[C[[[ooooKK3_vvc,,ikkxxxRRRRRRRRRRRxRxxkkxxRR+%PPP%P++e%exexR%+PP6P66666P66P666P6PPPP+++{{==TIYIIIIIWIWIIIIIII2II22222G2tttmmmNRhhPPP66&&g&ggggggggggg&&&&&&gggggg&&q&q66", +"6PP+P++RRRxxxpipL,,vGvG,G7YaaHYzHYYIWIWWWWDDDWWa7HGGEXEuXuEEEEGGGGGEEXuuK3u3uEEGGEuKo[[[[[[oooKK88K33vv,LLikxxxe(Re%R+RRRRR(Rxkx(RR++PP6PP+P+e+(xRxee++P6PP6666666P6PP6PPPPP+P+RT=Y=WITIWIIIIIWIIIIII2I2222G!2!ttLtmmkxhNhhP+qq&&g&gggggggggggg&&&&gggggg&qqq66P", +"6PP+P+++RRRxkpiL,,,vG,t7Y7YYazHYFYYYYYWIDWDWWWYTHHGEEuXuBuBBEEEEGEGEEu333KKu3uEGGEuKo[C[[[[ooooK8K33_vv,,Likkx(RxxRRRRRR(RRxxkkxxxR++PPPP6PPP+P+e(e(e++PPP6P66666q666PPP+PPP+P+h{{=YY=IIIWIIIWIIIIIIII2I2222!2!tttLmmmm=NhhPPqqg&g&gggggg$ggggg&&&g&g&g&&&&6q666", +"66PPPPP+RRRxxxpLLA,tG777FFzYTYYzzYzYYTYWWWWDWTzHHGEEBXuX3XuXuBEEEGEEXXuuKK33EEGGGuKooC[C[[o[KK8K8K83_Bvc,LLkkxxRRRRe(RxRRxxxxkkxR+++PP6666PP+P++ReRe%e%PPP6PP666666PP66PPPPP+P+hh==Y=YYYIIWIIIIIIIIIII2I22222!2!AttttmmmhNW^PPqqgggggg$g$gggg&g&&&&&gg&g&&qq6q66", +"666P+P+++RRRxxiLL,,L,L7=T=TTTWWYzYzYYWYTYWTWWWYz7HGuBuuu33uuXuEEEEEuBu33KuKuuEEGEuKoo[[[[[o[oK8o3K333Bv,,Lipkkxxxx(eRRRRRRRxkkkxRRePP66&6&66PPP++RRReR+ePPPP666P6666PPP6PPPP+P+Rh=T=Y=IYYIIIIIIIJIIII2I222!22!22!tttttmt=={h+Pqq&gggggg$g$ggggg&&&&g&&g&&&&qqq66", +"qq66PPP++RRxxxpLLLLL7YTTTWTWWzaWazYzzYYWYWWWWzYHGEEBX33uK33uuXuEuBEEu3uKKK33EEGEE3KoCC[[oooKoo8388K8__Bcc,LkkxzRRRRRRRxRRx(Rkkkxe%+P66666&6&PPPP++e(e++%PPPPPP666P6P66P+PPPPPPPR{{=YI=YIIWIIIIIIIIIII2II2222!!!!2G!2AttmL==N+P6&&g&g$g$g$g$g$gg&g&&g&&g&&&&qqqqq", +"6q66PPPP+R+RRxkLLLt:FTWWTWWWWWaWYWzYYzYYYWYzYzY77EEBu333KKK3u3uXuXBEE33KuKuuXEGEuKKo[[oooooKO888O33K3_Bv,cLkkxxxxxxxRR(RRxxxkk(xRePP6&qqq6q666PPPP+RRR+eP+PPPP6P6666PP6PPP66PP+h{k==YYYIIIIIIIIIIIIIII22I22!2!!!!!!t!tttL==Wh^V&&ggggg$$g$g$ggg&&&&&&&&&'&&&q&&q", +"q6666PP++RR(xxkxL7F:=WWWWWWWYWWaTzYzzYYzYzWYTHHHEGXuXuKKKK33333uEuXuuuK3KK3X!EGGuKo[C[[o[Koo8O8K33833_Bvc,,LkkFRxRRRxRRxxR(xxxRRR+PP6qqqqqq&6qP6%P++(e++%+PPPPP6PP6PP6P6VPP6PPPhN={:=YY=IIIII2III2IIIII22222!2!G!2!!2!!2ttmNhP6qgg&$$d$g$g$$gggg&&&&&&&&&&q&&qqq", +"qq6PPPPP+R+RRkkmkmFWTWWDWWWWTYTYHYYHHFHHHHaYzH77GEEBu33KKKKKK333uuX3X3KuKu3uEGGEuKo[[[[o[oKo8838333833Bv,,,iikkRkxzRxxRRxRxxkkxR+%P6qq&&'&qqq66qPP+Pee%++PP+PPPP6P66PPPP66666PP+{mk=::I=YYIIII222II2IIII222!!2!!!!!!!!!tt0Y=N+^6&ggg$$$g$g$$g$&g&&&&'&&&&&&&&&&q", +"q6qqPPPPR+Rxxxpk=kWWWWDWWTYTYY7FHHHHHGHHHYHHHHHEGEBu3uuKKKKKKKK333uuuuKK33uEEGtEuoo[C[oKoOo883833333K__vvc,,kkxzxxx(xRxkRxRxkkRe++P6q'&&&&qqq&66P6+++eee+%P+P+PPP6PPPP66666666PRh{m:===ImIIIIII222I2III22222!!!!!!!!!!t!!tt==WPqdggg$g$$$$$$$ggg&&6&&&6&&&&&&&qq", +"&666+P+++RRRxkkkW=WWDWWWTTHH7H77GGGGGGGGGHHHHGGEEBBEKK3KoooKKKK33333K3K3KuuEEGHu3o[[[[[KoK8K8333333383_Bv,L,iikxxxRRxRR(RkRkkx(R++Pq&g&&g&gqqq666PPP+R++PPPPP%PPPP6P6P6666qq66Ph{Nm=::=mm=IIII22222222I22222!!!!!!!!!!!2G2tmNheq&&gg$g$$g$g$gggg&&&6&6&&&g&g&&&&", +"qq666P++RRRxx{TW=DWDDWWYT7H7G,GvcEEEEEEEEEtHHGGBEXE3u3KKKKoKoKKKKK33uKKu3uXEEGEuKo[C[[oooKK8333u3u3_3u3_Ac,LLkikkxx(R(xRkRxxkxRe%P%6qU&&'U&qqqq66P6P%++PePPPPP+PPPP6666666q6q66RhhT{{={{=mNIIII2222222222222!!!!!!!!!!!!!AtI=NP6&g$g$$$$$$$$$$gg&&66&6qq&&g&&&&q", +"qq6PPP++Rx{{{{{WW+DNW=Y777GGGvGGBvEBBBBXEBEEGEEBu_B3u3KKKoooooKKKKuKK3Ku3uXuGGEuK[C[[ooKooO8K33S3u3_33_Bvc,,,kkkx(RxRRxRxzRxxxxR+P6q&'&g&&Uqqq6666PPPe++++PP6P++PP+P66q6qq6q66Phhh=h==={{m==NII2I22222222222!2!!u!!!u!!!!!GtmNh6&&$g$$$$$$$$ggggg&6&66&q&g&gg&&q", +"q666P++RRe{{{WWWDWWW=:77,G,BvBB_vB__uuXuEEBEEEBuBuXu33KKoKooooooKKKKKK33BXGGGGGKoo[C[[ooKK838333S3___3__vv,,LLikxxxRx(RxRRxxzRR++%6q&&U&U&&qqq6q666PP+++++PP6P++++P666666&qqq6P+{{{{RRhNhN==INI2222222222222!!!!!u!u!!!!!!!ttN+^&gg$g$$$$$$$$$gg&&66q6qq&&g&U&&&", +"qq6PPP+R{x{{{WhWhW=:77L7,c,vvvB____3Xu3u3uBEEBBuXuuuu3KKKKoooooKKKKKKKuuuEGHHGEKo[C[[[KooK83K333B__3_33_vv,,iLikkx(RRRR(R{xxx(xRPP6q&'&&UU&&qqqq666PP%e+%+PPP6P+++P6qq6&&6&qq6P+hRh{{RR{hh==m:II22222222222!2!!!!u!!!!!*!!AttNhP&&$g$$$$$$$$$g$gg&&6666q&&&&&gqq", +"q666P+RRRh{hhWWWWT7LLL,v,,B,vvvvvB___333uXBuXu3Xu3333KKKKoKoooo[ooKKKuEXGHHYHHEKo[CC[ooK8K88333S3BSv_____v,,,ikkxxRRRxxRRRRxxRRR+P6q&&U&&&'&q6qq666PP++ee+PPPPP++++P66q6q&&qqqP++RRRRhRRhehN==0I22!2!22!2!2!!!!!u!uuu!!!!!!AtLeP&gg$g$$$$$$$$$ggg&qq666q&&g&gqqq", +"66PP++h{{{WWrW+=mkLL,,,,,,,,vGvvvvvvu_3333uBEu3uXu3Ku3KKKKooooooKoKKKuEGGHzWWIEKo[Co[[oK8K3K333__v_Bv_3__v,,,ikkxx(R++RRRRRRxxxR%PP'g'&UU&&&qqq6q666+P+%e++PP6P+++PPqqq&&qqq666+hR++R++++hhhNTmm22!2!!2!2!!!!!u!u!!!uu!!!!!G2mN+6gg$$$$$$$$$$$$gg&&666qq&'g&&&&q", +"q66P++RR{hhWWWWTk7L,L,,,LL,L,,,,AvvvBB_uK3XuuXuu3uK33K3KKKKKoKoKoKK3XBlHTzWWWz2Ko[[CoooK888333____Av_S___vc,LLiFxxe(RR(RRRR(xRRe%PP6&&U&&g&'qqqq6666P+++RR+PPPPPPP+P66q&&&&qqqPP++Rh++++++RhhNmm222!2!!2!2!!!!!!u!u!!!u!u!u!!Le^&ggg$$$$$$$$$g$gg&q66666&&&gg&qq", +"6PP++hhh=WWWW{mFkiiLLLL,,,,L,,,,,,AcvB__uKK3u3K3KKKKu3KKKKKKoKoKKKKuEGHTWWDDDzGKo[[CoooO8K3333~vB_vvvB__3vvc,ikkxRRR+%+RRR{Rx(xRe+Pqq&'&U&&&qq6'6666PP+++R+++6PP+rPP6q&qq&&&qq66PhR+++PP+Phhh==m0I!2!!!!!!!!uuu!u!uu!!u!!!!!AtN+&&$$g$g$$$$$$$$gg&qPP66q&&&q&&qq", +"6PP+hhNWWWhWWTkmkppiLLLL,L,,LL,L,,,,vv__333X3u3KKK3KK3uK3KKKKKKKK3uXG7WWnDV}VWHuooC[oo8883~~u_S3_v_vAvvv_vv,LLixx(RRRRR%RRR(xxRe(+%6q&&&'&&qqq6q6666PP++%RR+++PPPPPPPq&Uq&U&666PPP++hh+PP+Ph+hNIm22!2!!!!!!!!!!u!u!!uu!uuuu!!txe&&g$g$$$$$$$$g$gg&qPPPq6q&&&&&qq", +"6P++hNWhWhWhmkk7kLpiLL,iLLL,,L,L,,,,c,vB_u3u3u3KKKKKK33uu3u3KK33KuEGYTDVy}yyyWHuo[[[oo83833333__Svvvcv_v3_vcLpkxRRR+++++nR+RxR(ex++P6'&&&qq'qq6q6666PP%+eRRR+PP66P6666q&Uq&gqq6PPPPPPPP6P6PP^Wh=Nt2!!!!!!!u!u!!u!uu!!!!!u!u!!!xe6&g$g$$$$$$$$$$gg&qPPP66&&&Uqq6q", +"6P++hWNWWWW{TTpxkkkpiiLLLiiki,iLiiLLLvvBB333u3KKKKKKK3u3uu3uuuu3EEGHWDVyysss/DHuoo[[o88K33_S3S__Bvvvvvv__vv,,kkxRRR+%+%+++RRRxke(e%P6qqqqqqq6'666666PP++++Rn++Pr66Pr6qqq&q&q&qq666P+PPPP66VDP+hNmm22!!!!!!!!!uu!u!!uuuuuuuuuutxe&&d$g$$$$$$$g$$gg&qP+P6q&&&qqqq6", +"6P+hhNWhWW=hmxkpkpkLLkkipLLLpLipLL,,i,cvBBu333KKKKKKuKu3XuXXXEuEEEHWD}yssjj5sVWEKC[oo8833~3____SX_vvvvvv__vAipk(R+%e++++%+%RR(xxieRRPP666666666666%6PP+++R(eh++P6VqP666q&U&&&qq66PPPPPV66666PPWNNmt2!!!!u!!!!!!!!!!!u!!uuuuuu!te6ggggg$$$$$$$$g$g&qP+P6qq&&&qq66", +"VP+hhhWNWW=kkmkkkkLkpiLkkkikLkLLLiiLLL7vvBXu3uK3KKKKKu3uXBEEEXEEEaWrVyyss...jyWGo[[ooo3~33_S___3_vvcAv___vv,ixxRRe+%+++++P++RRRxx(x%RR%Pf6666Pf6P66P+++R+RRRRh+6P666666qqqqU&q6666PPP666&qqq66+hNmt2!!!!2!2!!!!!!!u!!!u!!uuuu!0ePggg$g$$g$$$$$$gg&q++P66q&&q&qq6", +"6P+hNW=WW=={xkkkLkLkkpkkLpLiLikiLpiLL,LGvB_u33KKKKKKK3XuBuEGGHHHHTDDrVyysj...sDHKo[o883__3___S_S__vvvv____c,ixxRRR+++%PP%PP++(x(xpxxR%+++P%6PPPPP6+PP%++RhRkxhRP6q6r66r6qq&&&&qq666666qq&&qqqVP+h=pt2222tt02!!!!Z!!Z!!uu!uuuuutxP&&ggg$g$$$$g$g$g&q%+P6qq&&qqq66", +"+Phhh=WNWW{mkkmkkLiLLkkpkkkkkLLpkL7i,kLL,vBXK3uKKKKKKK3uXEEGEGGHThTWWDDVysj..s}Yu[[o8833S_ScS_X_vv_cvvv_3vv,kxxRR+%+P++PPPP%+PRxxiixxxe%R+P+%P%PPPP++P++RRxzxRhPP6666P66}qq&U&q6q6q6q6qq&Ud&qqP+h=pLt20tpI:0t02!!!!!!Z!!uuuuu!Aee&&ggg$$$$$$$$gg&&6P+Pqqqq&&q6q6", +"PPh{{WW==mppmkpiiLLkLikkkkLikkkLFkkkLiL7,vv_uK33KKKoKKK3uBBEEGHYaYY::=WWDVss.jyD!K[[8K_3SXSv_vS__v_vvvv33_A,ikxR+R++++%Pr%P++RR(kiiikkkxRRR+e+++%+++++h+RRRxkRR+r66PrPP6qqq&Uq&q6qqqqqq&&&gg&&6P^==tLLINN{m7LG!t!!!!!!!!!uuuK!GxeP6ggg$gg$$g$$gg&&66PP6qqqq&&q66", +"P+Rh{{T={kkkpkkLLi,LkppkkkkLkiLkkkk7kki,,c__333KKKKKo[KKK3BuEGEHYFH7HIIWIWysssyDloCo833__v__v___vvvvv__S3_v,px(RR+++++++++++%+Rxkiikikki(xxRRRR+++++Rn+RRRxxkxRR+PP6PPr6P}&&&qqqqVqqq&qgUgggg&qV+h=NmNhhP+hNmtLAt02t2!!!!!uuuu!xee^&&&$gg$g$g$g&q666qqqqq&&&&qq6", +"P+R{kTT:m7LkLLkiLLiLkkipkkkLkkiLkLkkLkkiL,vB_uX_K8KKo[[oKKuXuEE7YHH7GHIYWWDVyyVV=K[[K33S_vvS_vSS_vvvvv_333v,ixxxRRR+R+h+r+%++RR(xLLi,ikLpkk(RRRRhhRhRRhRRxzxkkRh+r6PPP+PP6q&U&&qqqqq&&qgggggggqq^hNh=hP6q6+hNmLtt2t*t02!!!uKuu!pxeP6&&gg$g$ggg&'66qqq&&&&U&&qqq6", +"++RRkmT:mmLpppL7kiLiLkLkkkkkkkkkkkkkkkLL,,v_B____3KKo[[[[KKu3_El7HGEH7HIIWWVVVDDTu[o83_S_S_v______Svv__33__ALkkRxRR+n+h+R+R+++R{xki,LpikkkppkkkxxRRRhRxR(RxkixkR+%666PrPr6q}&&qqqqqqU&gUggg$ggUqq+hh^Dqdg&6+emmpmLt2G20!!!uuuuutxeeP&&g&gg$ggg66q6qU&&&U&q&qq666", +"+Rh{kmF:777LkkpipiLLLkkpkkkkkkkkkmkLkk7kL,BBBBBB__33KKo[CoKK3uBG7GGEG7HTY=DVVDW{FBoo88__v_3S_S__vvcvAv_3~__ccpkx(xxRRRRhRnR(RRRkkLL7L7ikikkiikkkkxx(xRxRxxkkkkkx++P6r6%6+r6q&}qqqqqq&q&&UggggggqV6PP6&g$$g&q+NNmmmt0tttt0!!Kuuu!LxxeP&&ggggg&&PP6q&&UUq&&&q}q6PP", +"++R{kL777LLkikkkkpki,LLkiLiLpkpkkkkkmkkL,cvBvvvBB_uu3oo[[CoK33BEGEEEGHtTYWVVyVWW7Boo833SSv____SvvvvvvS_33S3v,ikpxxxxxxRx(xxRRzkkkFi,LLLLpFp7LLiilikxxkxkzxxkxkkxR%P%PPPP6P}6qq666qqU&UUgggU$$gggqqVqqgUgggggqre=NmmILLtt2!!uuuuu!pxee6&&&g&&P+P}&&UgU&U}q&&6666P", +"hRR{kmL7m7LpipkkkLLL,L,LkLkkkkLkkLkkLLLLGBvBG,cvGvB_u3o[C[[oK3BvcBBBBHHTWWVyyy+W7E8o83S__vS_S____Svvv__~83~vAciikkkkkkxxx(kk(xxFLL7,7LLL7LkL,GG,,,Lkkkkkkxkkxxx(xR6P66%P6%666}6r6V66q&&UggggU$gg&q&gUgg$$$ggg6h{N=xmmLpLt02!uuuuuLpeeP6&&&66r+6&UUgUU&Ugqqq6rPr+", +"RRxk7k7L7L7LpkiLL,,,cc,,,7LLLkkp7kkLFLGccvBc,c7,GBBB_uKo[C[KK_uBEBuB_EHYWVyssyVD:K[8833S_____Svvvvvv__333333_A,LLiiiiikkkkikikii,GcGcGGL,i,7iL,,,c,ci,iikkxzxxRxRe%PP66PPP6PPPPP666qqq&&gUU$g$UgU&q&gg$$$g$ggg6+Rh=NLmmmtI2!uuuuu!tpxe++++hhh6qU&gUg&U&q}666PP++", +"RRk{kpLmp7p7LLi,L,,Gvvv,,,iF,LLkL7i,,,GBEBB,7,L,L,Bv__3o[[CoK_B_uu3uBG7:WDy5.s$Wv[Co83SS_S3___vA_vScvS3~383S_vvv,,,L,,,,ii,L,LG,vBBBBcBcG,c,c7LGGvBv,,iLikkxxkxkxR++6666}Pr6%PP+P66rqqUUqggUggUgUgU&Uggg$$$gggqPR+{NmmmmLm02uKuuuu!tmxehNN{=hV&UgggUgU&q&q}6rP+h", +"hxxkLkkiLikkiL7Lc,cvvvBBBBBvGcG,,,G,cBBBXvE,LL,LG,vBvuKo[ooK3uBu3KK3uB,7hVs..5y7K[[o833S__S_SS_SvvAv3_3K8K88333_Svcvvv,,v,cvcBBBBB_BBBBBvvB,G,,,,c,,iL,,LiikkxR(x%R%P%66%6PP+++++rP6qqqU&U&UgUgUgUgUgU$$$$$$gg&6PRhRNNmmppm2!uuKu!!Attttmmmh+&ggUgUgU&UUqqq6P++R", +"hRkkkLLiLLLkiLLLLL,,GB_3XBBBvvBcBvBB_33u3Bc,LF,,,,vvv_uKC[[K3_Bu3KKKuBGmWys..5D!8ooo~3S_S_3_vvAvvvSv3S388oo8888~K3SB__vvBBBB______3333__BBBvBLiL7,LLiLi,,,iikkxxxRRP6P666666%++Rh+Pr6Vqq&UgUgUg$gU$U$gU$$$$$UgU&6+hh{NN=mpmm0!uuKuu!!tLtttmh6q&4ggggU&qUqqq66r+h", +"xkkkLkk7kikk7iiLL,L,,cvBv_BvEBB____3__333BBGi,iL,7vv__3oooo3uBXKKo883uGIDs...y:3[oo8833333S_S_vS_S_S3388[[[[CC[[o8883383333K33333333K3K3K33XEcGLL,G,LLLiiL,Liixkxx(RP%Pfq66PP%RRhhP66qqqU&Uggy$4$9$9$$$U4$4$$$gq6P+RhRN{Nmmm2!!uuuuu!v!!,tI+6UgggUgUgUgUU&}q6P+R", +"xkikLLkLLLLkkkiiF,i,L,LcBcBBX_u3KK3KK3K33Bv7iLL,,Gvvv_3o[[ouBu_K[CooKuv7Vs5.<VtoCo[o~~~~333vSvA_S_S3~3o8oCCCCCCCCC[oo88388K8333KKKK3KKKKK333_Ec,F,iL7,L7L7i,kikxkxxRPPP66f6P+PRRRh+r6V&q&&yg$g$$9w9999$4gg$$U$gUq++hhhN{x=NNt*!uuuuu!uu!St=+6Ug4&UgUgUgU&&q6rP+h", +"RkkLLi,Li,kkkL7LLkLF,i,7,BcvBBX33KK3KKKK3Xvc,,,,,,Bv_3Ko[KuEEBK[CCC[8Ku2QyssyWB8[Co888~S~3S_S_S33~38~88[[CCCCCCC[o883888KK33K3K333KKKKKKK33_Bv7L,L7iLFFikkkkLkkkkk(RRP%666qP6%+Rkx{++6VqUggg4$99www5jww9$4&UgUgg&V++hNh{N{m=N!!uKuuuuu!u!tmW6q&&ggUgUgUgyqqq6P+R", +"kiL,G,cGLG,,ikiiLLL77k,LLGvBcEBX33KKKoKKK_Bv,,,cvGvuSuKKo3E,B_K[CCCC[KBHDVVVVhB8Co[oo~8~_S3SO~3~3o~3888o[CCCCCCCKo88_333K333___3K3KKooKOK3KuBB,7,GG,,Lkk{{{kkFkiiiixR+P66f66P++nR{Rh+P66&Ug$$s9w55555www94gUU$$ggPPh+hNh{e{NI!!uuuuuuK!!!tmN+6&&UUU&UU&Ugq66r+hR", +"k7,7c,G,c,LLL,7LFkikLLFi,,cvBBXuu3KKoKooK3_Bvc,,vvBB_833uGF7BKCCCCCCCoKGYI=hhL,K[[[[oo8~S_SS3~3~~3333~8ooCCCCCC88_vBS_Bvvvvv_Bu333OK3X_uBBBBcLLiFikFkk{RRRhhRkxkkkk(R%r666f6r+++++++rqVq&gy$$99w5555555ww9$U&U$$&VD^WhhN{N==0!uuKuKuuuu!vt7TW{}qU&UUUU&}66rr+hRk", +"LLG7GGGGcccciiiiLLLkiLLF7LGBBBXXXKKoo[[ooK3BBBvGvuSu_3KEFh{BKoCCCCCCC[K!vGGG7LLu[[C[oo3~3S3~8o833SSS388o[CCCC[o333vAv,A,G,,LcvB33KuX_BBBEBBGcLFkkiiFkRnRrrr+nRRzkkkkR+Pqqq66rP%6}P6r66qqygg$9ww55555555ww9$U&4$$$6PP+N+hk=L2!uuuKKKuu!!tmh+PqqqUUUgUqUq6VP+hRxkk", +"7L7777L,,,,v,LLL7L7,7L7LLL7cB_B_3XKK[KKKKKuBvBu_BB_BBBGpWhBKoCCCCCCCCCo88K8_vGLS[CC[[~83~8~oo8~~Sv_~~~ooCCCCCo83SvA,,,LkiLkLkLGEBX_XBBBBcEvvGLLkFk7iFx++P%++%rRxkikx(+%Pf6P%P+6q}q}q6}qqqUU$9w5555.55555ww$UU$$s$qD+h===0t!KKKKuu!!INNhPqq&UUUU$U$U$UUUUqqr+Rhkk", +"L77777t7G7G,B,,,i7FLFkiF,,LcB___KKKooKO3uBBGGGGB____vvL7,KKo[[CCCCCCCCC[[oo;3uvB[CCC[;8~ooo~[~333~S88oooCCC[[88Svv,Lpkkpkkkxki,vB___BBcEBEEvc7Fk{kkiMkn+rPrP+++%Rkkxx++PP66+rr6q&U&'q6q}qUU$9w55..5.5555w9$4g$$$9V^WNN:tuK;KKK!!I^Vq&&&UgU$U$s$$$$$$U$UUqq6rhhkk", +"7L7:aYYYFL77H7F7FF7F7F:FFFGG___uXOKXEXu3K3_BGL7Lvv_vBuBu8oKoKooCCCCCCC[[CCC[8_,tSCCCC[[[;[[o8~~~S~8~o;o[oooo883vvAiikkpkkkRkkpkvvu3_XBBBBBBEEv77kFk7Lix++r++%nRRR(xTRR%Prf6rPq'UU'&U&}6qq&U$9<555.5..555w9$UUs$sgDhmGuKoooKu!INV&gg$s9y$$$4$$$$s$$44UUUq}66P+h{k", +"777YaTaTFFaF7YzTFTkTFFFk7TFYGEXuXuEzWHE3KKK3E7L7GB_3_33KoK88K~KoC[CCC[[[[CC[~vpP6m3[CCCC[C[[~~3~88o~ooo;o~3SvvAAiLpppkk{kx{{{kF,B_3_BBBBX_BXEBG,FikiF7|knRnRR+n+Rxz(R{R++r6rf&&U4$U'U&}}qVgU$ww55.5555559$4$g$dVNtuo8oC[ou!!^6g$9s99$99$$$4$4$4$$/$UUUU}qr6r+nRk", +"k:a7aYYTT=a:a7Y77FaF:FFTFTDrVnDWWzDyDHEKoo[oKKBBB_3u838K88~S~S~K;[ooo;o@[CC[8vtD9&ev;CCCCC[oo~~8;[[[;[~o8~3SSvA,,iikkkR{R{RxkkLGv__B__B__33B,EEEcl7iiiL,ikkzRRR(xxkx(Rnrr}6q}qUU$UUU4Uq6PD&$$9w<555.555wwUUUUPh2;oCCoKKu!I^qU999ww9w9s$$$$$g4$44UUUUUUUUq}6+h{kk", +"F:aYFT:YY7aYaFY777777:FFFFWWVyyyy/syDHEK[[[oKKK3uS~88833Su_uSuS8~oo;~~~~[CCCCCCKuKK[CCCCCC@[[[[[o;[[o;o~SSvAcpppppipxkRxRRRRkkk,BB__B_X3uKKXaFBBEc77iMilBciiFz{TziFk{RRr%q}q}&UU4UUUUUU}hR6U$$ww5555559$$4gUVm!ooooKu!0hP&y$99wwwww999s$UDr6V&&U&UUqUq}UVP+nhRTk", +"mF:TTa7kHYY7:YaYFGG7F777mFFWWWWDVyyyDH3K[[[o883833_3~3~_SvS_SvS3~;3vSvS~;CCCCCC[[CCCCCCCCC[[[;;[;[[~~~SSSAAppxxexxRRh+n+Rn+hh{kFL,vEBB3KooK3EFE33BBl,7LGcHiFFxzkkFkFFzR+r6UUUUUU4$U'&}}+nnqg$99995<w5w$$4$$ΝoKKK*!T^y$99s$9w99w9>$$UVh{7m:===WWhn+rPhrhrPnh{{", +"=YYYYaH7777FaYTYF7l7lHHHaa7FzYzYHWVyDH3K[[oK888833~_u~uSvvAvSSSS3SSSv*S~~o[CCCCCCCCCCCCCCC@C;o~~~;~o~S_AcppRxe++++R++++++++r+kkFkii,GB3o[Co[oKuXK3XcE,M7c7,i7FFFF:TFFFTn6}}UU'U}UU&66rhRrUU49www59ww9www>w$r!KK!Zuutp+y$sw9$s4s$9$99$U6{mL7L777GL7L:::{{+rr+R+h{", +":F:aF7777G777HFHF77G77GGGGHHHHGHEHYVVHuKoo[ooo8~u3uS3_SAAAAvAcASSSSvSS*So;@@CCCCCCCCCCCCCC[;;~~3~~~S3SSpixxe++++RRRRxRR+(+%R+nRRkkkFMX3Ko[ooCoKKoK3Bl,7c7G77MH7F=TWWWWkTrq}UU4UU}rrnxik%&4$ww5w555wwwwwww99Nuu!t2*!Lh6g9Uq}}U$>94444yrhkk:ptLtGtG7t777:T{+hhWR{k", +"YYY:YLGcG,GE,G7GHHHG,7,cEllLlGBEBGHWDzB3Kooooo88~3~_~_3v,Ac,A,AAvAAAASSSoo[CCCCCCCCCCCCCC@C;~~S~SSSSScAAiex+++++exxkixkxxxRR+RRnRRkkiGXKoooooooKKK3BiG7lL777LHGFTTWnnrn(r}}&UUU'&6%RzkR6U$www55555www55wwwsqu!*m0ImNhhm7hhRq4$$$$$4U&rh=L:mtG!!tttttY7YY=WT{TFTF", +"TYaHGGBGc,ccEEBBlG7l7lHHHYH77EXXBXElTzEuKK[[[[[83S3S3~3SAAA,ppp,AAAASS*;[[@@CCCCCCCCC@@@CC;[o~~~AAv*pipppee++PeRxxii,iiikx(x(RRFiilGvX3KKK3uKK33XXXBGccLFMFFFLMHTYTWWWWnn+nfr}}}}rhRFFn}-$ww555w55w5ww5jww$VN=mG!S!GuK,r6r+&4wws9sUUr{W{{mmm!2!2!ttIIIY=FTFTTTT=", +"WTYHGEvGBGGvEX_XBBGHHzWDnWFHGEEXuXuEHzHEK8[[[[[o8~38~3SSA,,pApppAS*SSSS;CCCCCC@C@C@C@@[C@[[C@[SpSSScpppppe++eeRxxiAAA*Aipxxxkkzk7lvX33K3uEEEEuu3XEll7GliaFMFFFFkz7MRr}6}r%nhn6rr=FF7Fk+}&>$ww5555wwwww5ww9$$46tKo[Kt6y$$yqnU$s>w$$4Wtm==m7tt!!!222tIII=WI=TYYYWY", +"WWHH7,77LL7,,GGGLlHFDVyVDDWzHHEEXuXX_kkE3Koo[C[88~3~o8~SSS*ApAiAAS~~~~o@C@@@@C@C@CCC;**;;@[;[;A*SS**ppxeeee++exxAiAAAAAckxx(xkkxzRxF,llElEEllEXXXBcG,l77klGFkFTRkzk%Pf&'U}rnDWT=YYF{{nnr'$>wwww555wwwwwjjjsw96G!!AhU9$s$4}F}$$$>s$$rGGtttILtGt=t2E2IIIII=YYWYWWW", +"WWWt777FFFFM7liM7FFTWWnDzWWzHHlE3u33KGF73Kooo[C;8~3~[o~~SScAiA0c*;Co;o;[CC@C@@@@C@@@[;~;~;;;;SSS;SAAppeeee+eeepxppAAvvAAkxRxx(kR+nRRFGFznDWHMHHE3EBl7iFFFccFz(nn(hznrf&4U}qrhWTYI:Th+r6&'$4>w55555wwwwj5555js}qqh{U9sws4}T,i}U4U44}+tuu!,tm=WWrr=tttIIYIYWWWWWWD", +"WWTaYH7HFFFFMFF7aTTaMHHHHHzYXEBEXKKKK3LG38o[[[[[oo~~~3~3~SS*AcA,;[o@[C@C@C@)@)[;@C;[;;~;[;[[;;S~;***#iiexe+(eppppp,,pAAxkRR++kkxnRRFizn}}ynnnWzlEXXElGl,MEXizRn+n%r6}'/4'}}rWYT=:YYF{r}f&4$>>wwwjww>www5555jww9VW}$>ww$4$&FclFP'UqD{mmt!2YNW+6}nYYtYtIIIIWIWWWWW", +"WYYHFaaYzTTTTzTYzzHHHzTzMMaHHGX33Koo[KBv38o[C;Coo;o~~S~~~SSAp*p*S;;[@CCCCC@;;@@[@;@[@[;;@C@C@~SS~SS*i#ipxeeeiAAppep0pAApxR(+Rx(xRRF7ET}y}DWnnWzGEEXXBEllcBXGikznRn%r'&44U6rWTFF7777777{rfq-gU>w>wU44>jjj5j5jww4}Usjjj55jj$/$sU6F}}rh==WN!!t+DD+T7::7ttIYIWIWJIDW", +"zYFYYYTTzzWWWDDDTzFHMzzaaHMzllX3u33KK[K33~o~oo;oo8~~SSSS~SS*A0AA**S;;@@@[;;;;S@)@CCC[@[;@[;;;#S**#c**p#p0pppiA**i0LALA_SAAiiiikkkiiGG}/yDzHHHMEXBlEEllGlElGclFHMi(knnn%VfznnnnnT{T::77FRrqUU'U-44U>j555..jw9sU}4jj....5jjwswjs46}6{xt22!!uutI::7t27t7YWIIWWIWWIW", +"aHHHFYzWTzWWnVnzEElGEizTnWzHElcXuBXK88K33~~8o;o~ooSSSSSSS~~~AAAA*A*S#;C@@;;**S;@C@C@@;@;@@;;;****p0ep0i#c0*i#S~SSSv*SSSS_SS_A,LiL,XE}5synHXXEGlllXlllM7FFFHHlHHHElMkFR(kznfU4U'}'nTY7tFrVf}}}f6''/w5......j4zWs5.......w>sjjwss4q7_vuuuuu!u!!!2!G!ttt:T=WIIWIWI=", +"FHFaazTzazznWDHGX3XXEXEllEllcEGlEBEXK333K38oo[C;C[~S~SAAA*S~~**SS**SS;;;;;;S###[@@;*#;@[;;;S#A0p00p#0p#i*eeeexpA~;~~SSS~3~3vAvvv~3{$sDHHlllBXcGllHllMH7MMFHllznzMFz(nn+n(n'4/-U4/UnHYY7{n6f&'}44>jjj.....jUz%>5.......jwj5jjjs$y=GuvmtA!!!!u!!!!2ttt7YTYW=YYYTTT", +"aaH7HaYzzzWnnnHHlEXXElEllEXEXlGllGEE33B=V99gSu;[[[;v~SSAA*S;;~*SSS**S;;;*;##**;@S###;[C@@;#**0A0*p#p#pe0epeP6&epSS~S~3*cp~~S_SSS33uBBBXcl7lElllHMMFH|lMlGHzTzzVs}zTnnnz{nr'//'f>44nzY::Wrrf}}-4$>wjjjjjj>%nU$j5.....5jj55j5jw$nEuEt7WVqrG!G!77H222ttHYTHYYzYaaFz", +"FHFFFFzzznDnnzHHMllllXlEEEXHzznnWTGGah6VUD:_u~o;;S*S~SAAp*~;;;#S;***0*#S@S@S@;;00;@C@@@;@S##0#*####p#0c00i06&&PexpePq$$$+RkkP+vBSB,GG,cAMiMlMFzznzzzFlEHzzHzHHHTDDDnnnzznrD}/}'/-yrYzaTzn'}U'/>4'->>>->>>//>j>jjjj>>jj5jjj>w/nEHV//9s/nFrq}q}qDhWIItHY7HHHHHzTTa", +"MHHHHFaWn%nnnn(zzzMMFlllXHnVVzWT+ncE_BGB_K8o;~;SSvAA*AA#S;;[@;;;;S#*0A##;@#@;@@@;##@@@@####*#*#S#*##p00#e&g&&Q$g+eh&$9g&s55swPEEBvLkkRRFkFMLMFnn%n%zFMlMHHHlHlllXHWVDWzHHTznDVfVfrnzaTznV'U/'U-''f-->%%4>wwjjw>>>->>->jjjjj>nz'swws>w}/4UVW=WW=tt7TttYYHGHHHTWWT", +"HHMMMHHzznnnDzHzMzzMllHMHzV/VlXKKK33_38K8~~88KAAASA*S~;~;@[@)@;;@;**0*##@;@;@;;@;@@@@@;#*#*##;##c#p##0eee0e^pp^0exp0tN=NmuSu~pAAv,vizTT(xMilFM(zzMlllMlHlHMYMHzGlEzzHHlHzWWnnrr(TzHWD}f%z}4/////'U-U>Ufr>s>s>>>>>4'F(>jjjjs>jj5jj4nf/s}ntGu!!2!2GtITtYYtYHYYYYYY", +"lHHHFHHHMn%z%zMHllHMMll(n%nnzlXOKoo33K8333vv,NLpAS;;;S;;;;@@@@C@;;;#;#;;@;@@@@@@@@C@C@@@###*########ieP$9w$^e^e0xb*~SAAAS*AAA0,*v,vvv,zzFMFMFFzMFMlXEl|lHzMHEHzzzzzHMzHzHzzzzzWTzTWD}}}z%f-/>-/''U-4-->'}'%n%(%>>$>->j5.5j>s>ysyTzaEH}rHG!EEEHzWGGTnWTTHa7lHHHHH", +"MFFzMz(zzMMMH(z%n%zzMlEXlHXMFMEBXuoK~_SSSvve&9Nm0A~SS;S;;;;@[@@@;@#@@@#@@@@@@@C@@@@@@@@@##0^&6#@##0gwd&^^e0ep#S@SS*0p0pNxxpAvSAvvA,,,GkFiFFFMMlHXElllMzMnnDDfnzMHzzzWYnzzHYznnzzazznDDn%%f-/-/-/'ffr'}ffDVUU-'>wjjjjjj5j>%n'rFMBuuElT+nFHEW}U/}DnnDDnDrnz(HMHHHH", +"FMMzzzzz(Hl|MMMzz%(zMMMMllHlHFlBlcK883vS3SvBuAAAPNSS#;;;;;S#@;@#;@C@@@@@@@@@@@@@@@@#@@##@@#0##000eg&1]#1e&^e@@;@;@[@;;*0pA0AASuSSAA,_vLFkiMkMl|MEllll(fnD%DD%zHMHlMMlHznzMzTzzzHMFF((fff''f'--/-f%fff}}fnzf/>4>>->>5jj>j>%lXMr'rlEHzzzzz(nD'/>>'f%%/-'f%Dff%(nz(", +"%zz((z(MM((zMM||z(zn(%MllXlXXlclvG38o~3SvLep,3S*SSSSS#S;;@;#@[@@##@@C@@@@@@@@##@@@@@@@##@##@#]#0#]1^000@]##00#@;@@@S;SS00p0A*S~SSSAvAvi733BcllElXHXXXXMllMMzMlMlllHllMMlHMzMFFMFFMFznnfff'''/'-f(''f/}}nzFn}U'4>>>>>((%'(f--/>>>44>44--4>>>>///>>>>>//>>->'ff%fn", +"%(Mz(MMMz((MzMlM(((M((M|lXXXXXlE3X3_v3SA,,,Am0eex0S#*#S#@;@@@@####Z#Z@@@@@@@#^1]@@@@#@@#@ZZ##@#@@@]]#]#@@@Z##Z;@@;@@ZS*pApA0GAt*vSSS_Bv,c3BcMllllMlXXllXXl(n(HMll|MMl|lclMz|MMMMFM((((%%ff------%M(rfTFcXc|(z(|c%(-(|((MM('-->>>>>>->-->>>ff-f-%%((%%%%%%%%(%(M(", +"((((|(((MFMMl|llllcMM|XcXXXKOcBB33_vAAvA!AeeeL0p0A*#*#@S##*###0]]##]ZZ@Z@@@]]###]Z#Z]ZZ]#]]ZZZ]]######Z#@@ZZ@@#*Z;@SSZS*00t0S0*uSuSA_Sv,,cX_clclcXXXcc|||llMlX||M|||MM||MMMM(MMM(zz(|(%%(((((%%%f'(|XXXXM%fff%((%%%%%%f'->>-->>----%-----%-%((%%%%(%%%%(M(((|||M", +"XXc||XXOOXOOOOOOO|X|XOOXOOXcO3XX333S_SL,AA!AAAtA*0!#0*0000b0^bb010]]1b1b]1]]]]]11]111bb1111bbJb]]bb111111bNb^b01211IbNbmpmpNN=L0L*SSvSv,c_X_XcXXOXXOOOOOXOOOXOX|XXXcccX|ccXX||ccc||||||((|||||(||i((((|((((((((|(|((||||%(%(%%%(((|((||||||||||c|||||||||ccXcXXX", +"))))O)O)O))))))))))))O)O)Oo)8333~vvv_v,LLL,0NNmNNNNNNJN^JPQJqQ&dddddQddddd<dd<d<<d<<d<<d<d<d<d<dd<ddddQddQddQVQ^^JJ^^NN^N^Nxpmt0tAtAAvBAvX_3OOO))O)))))))))))O)))))))))))))O))O)O)O)O)O)OOOO)O)O)O)OOO)O)OOO)OOOOOO)OOO)O)O)OOO)OOOOO)O)OOOO)O)OO)OO)O)))))O))Oo", +")))))))))))))))))))))))))))oOo3333vv,,A0L0=mxNN^^N^QPJVdQqdddddddd<d<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ddddddd&QdVQQV^+^e^NexNm0ptAAvvS_O3~oOK)))))C)))))))))))))))))))))))))))))))))))))))))))))))))O))))))))))))))))O))O))))))))O);)))))))))))))))))))))))))", +"XOOOOOOOOOOOOO)))O))OOOOO3O8O3_B3_vuv_vAAAL0NN,0t0mmNNNNNbNN^^^J^^J^JbJJJQQQQQQQQQJQQQQQQQJQQQQQQQbJJbbb^^^^^N^bNNbNmbN00pm0x00AG0ALSSv__Sc_OXXXX3OOOOO))))OOO)OOOOOOO)OOOOXOOOOcOOcO|O|ccOcOSOOccOc||||||c||||||c|Oc||||O|||(|||||c||O|||||||c|ccc|XXXXXXOXcXOO", +"|X||(|O|O|XXX|ccOXX||O|||XOX_ccBSv_vSA,*A*AA0AA0*!ZZ!]0]001bNbNb^]]]]]]1]]]]]Z]]]]]]]bb]]b]]]1]]]b1]]1]]0bbbbbbI]#0]000200*t0L**StA*,SvS_cS_OccXO3XOOOXXXXXOOO|||O||||X|||||||||||cO||(|(|||((||(|(((((((((((((((((((((((%(((-(%((%((||||(((||||||||||||||XX|XX|", +"(((|(|(|||||||||(|O||||||cXXccv33SvvASA,SA0xe*tA]u*#0Z*10Z*Z]Z#]#Z]]]]ZZZZ]1]Z]]]]Z]]]]]]]Z]]]]Z]]]]]ZZZZ]#ZuZZZZZZ@S#0000*0*#u*SS~SSS3SicXS__XcXXXXX|||||||||||(|||(||||(|((||(((||||%((-%(((-%-%(||cOc(%%(%%(((%(-((%-->>-------%(%---%-%((|(%(%%(-'(((|||||||", +"%(((((((||(((((((((||||||(Mc3XBB33S,,pALmApmA0NN^0ZSZ;ZuZ0ZZZZZZZ@Z]]ZZZZZZZZ@Z]Z@ZZZ@@@ZZZ@@@ZZZ]]ZZ@ZZ]##Z@@Z;Z**##0*uZ0!0t#;**Su*AAAAiicccX|iM(cXXlc|X|||||||||((M|||((|||((||(i||(|(%%%---%%-%(%(|cOc|'--(O|(%-|(||(--->>-->->------------%((((((%((((((((%(", +"%%(MM((((%(|M|(((((||||MMlcXBcccvvS3S~SS,,0pLpee0SZ;;Z@@;@~Z#Z@#Z#@@@@@@@ZZZ]Qd1@@@@ZZZ@Z@Z]]]ZZZZZb1##]@]01bb@@@uZ#*ZS*****0*SS;*~SS_vvAcAiOXXc7l(l|l|cXX(|(M(||l((MFl|||(|||(x(((x(%%%%-%----%%%--&'%|cc(%((6'%--%c(-(->->->>>>>>--->>>>----->>>>w>>---f%-%%%%", +"(M((MMzzM%zMMXlMM((MM||M(llclL,,ivv_88_8,+eA*SSSSo;o@SZu@@;Z*Z@@]0#@@@@@@@@@@Z@Z@@@@@@ZZZ]ZZZ]Z#]00^Q0####0;S#@@@@#Z*;;Z~SSALA*S;oSASALpi,cv_iXcXXXXlX(((MMM(lll|zznzMHzi|kMi(R(R(x((((%-%-----%-''>>>&'P%&->>-->>w>'('->->-%%-(-->>>>->>>w>>->>>>>>->>-----ff-%", +"zzzzzz(MHllzfnM(((((MMHH|MXli,lBBc_~3A+eev*SSS*p^0~ZS;;ZS#;Z#;@@@@@@@@@@@@@Z@Z@@@@@Z@Z@@#]#]#]#]e0^g^###0e^&e;;@;@;;@;;*00p00AASSSAA_vv,FxiiikllFllllMHfDDD}}DMMHMWzzYzWzlFzzz(n((kx(%%---------''%%----e(-->>w>>w55www>----(%%|cOc|c|||(--->-'((---%%%%%%%%(%(%", +"MFMzznzzMHMzznnnV}DzzlMllllMFGXHm_88A{tpxxPx+q6epS~SS#;;@@;;@@@Z@@C@@@@@@@@@Z@@@@@Z@@@ZZ@@#1g$^###1&<5d000e10##SZ;SZA0NxeeppxAAAA0tm{xkxzR(x(|lllcMllH(zz(DDDD(zHzznzWzzzFMnnznnTzF(r%%(%''-->>--&''''-'%--$-->w5j>5>ww>>(>%(|c);cc6P+i*|6-g>'(%%'f'%%%n(n((MzzM", +"HlHMzMznnz%znz(znD(HMHlnnTF7l7BBK88~88Sc,R}&9qmR^*S#S#S@[@@@;@@@@@@@@@@@@@@@@@@@@@@@@@@@#####1^0##@##^$99<$6^ex*;;S**#x0pepepAApx,pxxFkikRh(kFFF7HllllHMzz(nMlHM(znWWYYYzYzznnzzTzznf6%(i'U-g>$-''-g>g-''-%'(%>>jw>>55.5ww>>--6(iic|+ciGvBikxr}6%n(znWWTzlHHzzHH", +"HHHMHHzznnn(nzzMlHznzVrfyfVnB_3AA3~~3vSSS_A,+xA*S~S**S;@C@@;@;@@@##ZZ#Z@@@@@@@@@@@@@@@@@@#############e^&g<&6^^e^e^x*SS*~~SS*A*pApLxkiLMk(RFzFz(RzzzzMHMlllHllEHFllznzzYzzzWnn%n(WMF%}'r(%4>>>-'%U--$>'6>$>g-->>>-|(>j55w>>ww55>6M%}4}FHG!EBGBE2HTYYzHHHHHHHHzYH", +"MHlHzzzzzznzzzzzzWMMMMHWDs/zE33838~~vS~~~~~;;~**A*A#S;;@;;;@@[@@@@#####@@@@@@@@@@@@@@@@@@######0####0000^e0#ee#*A^eppee6Pe+A3~AppSSL{kkx(Rn(R(zzz(TnnzMHlHlllXlllElHnWzzzzzn(DVfDrWMFRnnnrU4444-%6-4q%%>>wwwww>>>--%>>j>w>-->5jj'U>s>'VhHEHGE!!!GEtHtIIIYHHHHHzY", +"MFFHzznnzz(zz(nnnnHlHFMzn}VzzEXK3B_u3u3~~~o~uSALpAA*SS;;;;;C@@C@;####0##@@@@@@@@@@#Z@@@@@####00##0####ee0ee&&66^xe+Np6$9gP+w5wPmS3vALkxhRRn+nTzTnnnnnTFHlHEHMGEXEHzWnnnnzznnDff}'/'VzzHMnf'4>4444'U4f%&$>w>jw>>>>->>wjj>5>>xX%>jjj>'}Us/D}UVnHHt2!2tIIIHHHYHYHYY", +"HHzzazWWnzWzzzzMzWzHMHzz(y}rDyWynGLi6rkB~~o8~S;~A0pA*0A*S;@;;@;;;*##00###@@@@@@@@@#@@@@@####0#0#######00##0e^^&+e^eeqg9w9gq6P6{+evAA,v7iF7MF,Fznznnz(zMMEllHHzHzWDDDWnWzznDy-/y'y//(FhDTTn}rn'/>//>$>>ww-%wwjwwww>>jj55w55w${cR&44s/}MTUV}}Uyrt2GtttHYYIttHHHYHH", +"HHTTWzznDnnzzMMlGEHHHHHHEXMHMHHWk77+V}y}TG3u~o~;~~**AA0p0S;;;;SS#ce0p###@####@#####@@@@###@###e###;##p0ee###*AP^ep0S*AApeq&mAtLLLA,AvcBcc7iFFFFT(zzzFzMHGHlHHzHWDyVnznnnn%D/'fy/-/4THTIYrrnnf'4>wjjj5j5j>%(fw5...555j55.5jw>&lK!H7ny/DGu!tHEGtG!!tHtHHHHHGHHHHzH", +"aaHzHYzWznnzzHHElEElHHlHXllH7G7GHl_XBn9..5s9P~[;[~~~SA,0p*S;S;*###p#c#;##@#@####@@##@@@@@#####e#ie#i#p#eeepp0ePP+L*SSSS~SSS*AAAAvS333v7F7l77ilG7FiMilMFlFHFHFHHMDWzzT(nnnrn}/>/>/>Un7YHYnfn}UU'/>wj5.....9r%>5.......j>j55j>j$D27kxL,7!!uuu!u!!!EHYYzYzzFzHHMFHa", +"7aHHzHHHzDDWzHHBXXBll7llHHlGlGiiGGvBBB3mN7v,3o~)C;);S*Ai0p;S#**c#c####S;;#*#####;;;#*;;)#@##ce#e0eee0eieeeeeeee0p0A~S;S;SSSS,ALALASS,hs.sVzFFccGGBEBEGFFFFFMlllEllHMaTnr%n%DU4$s'}DTHY7Wn}'}4/'}'>w......5$n(>5......5j>jj>jw4}tu!!uKuuuu!!G!!!!!tTWWannTFTYYaF7", +"HHFYzzazHWWWzHEEEEE,7l77M7kMGl7l,B_3_3K33K8o[;;;C;SSSA*AA*S;;**#c#|#c#SS;#c#c#c#;;;;#0#;;;;@##i#e#epe0i0p0p0p0A*S~S*SSSS~~SAppppLki,cEBWjw/VzHl7llcBcGlFFFlHHMHFlHiFFnDrffnz%rVnDrWFt7t{r}}}'&'44->j..5.jjj$>>j5......jwwj5>>4qnt!!!uKuu!utGtu!!G7mWTY=W=YYYzYHH", +"HHFaTTaWznDDWzHElll7FkFFTnTF7GGGcXK3883K_3S3~~[[[~SAcAAA*S;)*c#c#c0#c@S;;;#*#c#;;))@;c###)@;;##i0ie0ee#e#pi*0AAAASSSAAA,S~SA,pkkkxR{k77GW//ynWzFFHBEBH7lM7li7MGFFzkzT%V}}}'D(FMzRnWm77:nr}}}U>$w>$>>j55.5jjww->>55....5>www9444}r==II!uut7{=:G!!Et7t7tITYTTYzTF7", +"zaazYzazWWWDDWzH77kMkFFkFFFF,lcEBu3KK33Su~3~_~~~~3S*A*cSSS#c#i#i#|#c#S;;;);S;**;@@)@)@O##@O;S####i#c#epi0exppA0ApA,ppxNxpvALxxRkkhnRhkkFTV/yyVDnTTFllclG7MFFF7FFh%rrr}}//UUfrTTzFFY77Tnr}44//sjj5wwj>j5555jwww-->j>>jj5>Rn%%'4U}6W^N2!!7TPV6:7T=t77YIIIYIYYTYTTa", +"FFaazTzWWnzWWnWFM7FkFkTFFTRzFEcB_33K_3_3333~3SO~~3ScSSS3SSc*pip#c0#c;;;)@;;;;S;S;@)@C@)@)#;#O#Sc##c#c#ippepexpppppxeee{exLLe++PrRR+(hRkkzWV}VfWnnnFGBE,cG7FFiMkRnrrr6}}U//}U}rRFY7t7{hrf&4444w555jjwwj55..jw>>&(>wjw>>%Rl7PU$4U}nWtu!t:hrrqD=thW7t7tttIIYYYWYTT:", +":F7FYHazzTTWTTTaFFFzFFFzRzTFl7GBKKoKB,__~8~3~~~8~3~ScSSS~S*c0ipc#cS*;)@)));O;SS;@C@)@);;;;;;;;;#c##c#c0epeexeeexxpixeRexxLpR+rPP%RRP%%rnTFnyy/rTnz7lBlG,MFkMHkznnrrnnnrVUUU}qr{TF7Ytkn+r}'$>wjj555j>wjj5w5j9%ixi%>>ww9UktU$44s$4&Hu!!Gt==DPVh:tt2t2t2IIIIYYY=TYY", +"77kiF:F7FFFTTTTTFFFFFFFFTzklEiBXKKKB7,u3K388ooo88~3~SSO~SSc0cpp#S;S;;;)@C@)@cS;S;;)@)@;S;O;;);S;;SS#c0ppexeeeeeexxppxxexpLLkR+%PP%+rPrr%RFHz7zzFl7GBBc7ikFkilkxn+nnRznr}}U}}rn{TWF:777FRrq$9wwwjjwwwwwjww>$$RX[[A6w$w>$+r$s99>$shGtm2!ttt=hh=t22222222IIIIYYTYYH", +"L777kFkFF77FFFTnhn{TTnRnTFFFFFX3333Fkl_uKK88[8~88~~3~~SSS*c#pie|*O;~;;;@;;;;#SSSS;@@);;S;;O#;O;SO;S#c0pppeee+++eeeixxxpxxiikxR+6r+%+%r+nkFiki7,GlBBXcGiFFkFkFRnRRzFFknr}}}VDnhrPV6rhmFkr}U>wwjj5jjwww5jww$r++p!uSSc%$94V4w>wwww$hWPPNtGt!!22!!!!!222IIIYYYIYYYHt", +"lGi7i7k7kkL77FFWDDDDWnTTTz7F7GBXBXGzWE333Koo[[o~3888[~ScSccipii#c;);~SSSS~OSSOS;S;~)@;SO;S;;O;SS;SSccpepeee+ePPP+eipxipppiiixR%Prr+++RFFi7,H,GG7cX3BG7,iFiMkR(+n+TFYFWWrr+hn6}}&U}}6nxx%q49w5w55wwwww55ww4R7=mtpR&rxz6&UU9wwww9>UDqVPWt!uuu!u!!2!222IHIIIYWIWIH7", +"7GGGG77LGG7BE77WWDDDDDDWzYF7BXEB_GaWaGB3K8K[[8~O~O~~~OSSc#c#ipppi*~~~~S;S;O;;;O;);;;);;;c#O;S;;c;c#c#ipixiee+PP++++exxppxpiikR++6%+nnklBGGGcEBBXu3XBEc,FikkFkFRF{77FWWWWWhn}}444UU}qr(xxr&>wwwww5wwwwwww94tu2N=:hq$$4r&&'>99www9$gy&&6Nm!u!u!!!!!2ItIIY=YIIITHH7", +",,G,ccG,G,GvBG7FThrDDrDWFHlGEBBEEHzTYEB3K8ooo33SS3~_O~ScSc*ippppi*S~S~SO;;);O;);;));;);ciS;;);O;OScc*i0xxxeeP++P+++RRxxxipixkR%+r+nRRxMiGGEBX_33Ku3BBEB7lkFkFFFFF7tFWhW{Th+UU$$$$4q}6+RF(64$wwwwwwwwwww9$U7uuttp7h}$$$>4g$>99w9s4Uq&VVNm2!!!!!!2!!tY==YY==TYYYHt", +"7,G7G77L7,,GBG77YYTWWDWz7l7GEcEGGFWzHE_33oK88~333_S~3ScAiipiepeppcSOSSS~O;;););)C@C));)SSO;););;;;#iiiipix+ee+++++R++RxxRxx(R++rrr+%hnR{FiGBBKK3KK33uBBEi,kFkkkF:7F:kTTTThr}U4$444$U'U}PhF+'$>wwww9w9w$44U^!u~u!!ph}$www9$99>w9$$UU6PhNm0!2!!2tttt:::==W=YT=YYt7", +"7iLL,77,77L7LG77i7FkTWWT77,GGGG7HTnzHEBKKooK33v3_S3_~cAAppiipeippAA*SSSS;););)@C[CC@C[@;S);)@);O~SSc0*i0ieee+e++P+e+R+RRRRRP+rPrPr6r++nRFFGEXKKKKK333XBBiliiMkFkFmF=FT{h{hrqU444U4$$4g&UP(R6$9wwwww9w4$4U$}=!KKKu!m+q$9www9w99>94$U}h{ktt,tttttmmmkhhh{h=W=YYYY:", +":77777L7FFFLG7FH77Y:TFTTai77L7lFzrW7lB3KooK8K_vAv_v_*cipppppixpipiccccSc;);;[;[C[CCCC)C[);C);;~~ScS*ci*ccxixRee+++P%+PP%+%66q6}q6}6PnRx{FLcBuKoKKKXGEBEGGi,LLFFk{Whk{FRh+++}&&U&U4$4U4Uqq+%&>$9www5w5w94U4d6N!KoKKuLkP&$$w9w9ww9w99gr{{LpmmpppLmkk{hr++h+hhTFY:7", +":F7:77:7:TF7777a7FL77:TaTFii77HaWnWGBuO8oo833_vccAvvc,pxxpxixppiApAAAcc*S~[~[[[CCCCCCCCCCCC@[~SSSScSScSSAiixxeRR+P6PP66P66q'g&&}&}rr+RzkF7lBX3KK3HHGBc,L,li7,iFRRRnhh{n++r+q}q'qU4gU&UUq}6qg$9w5555555w9$$$UdWIuKoooKGxq99wwwwwww9w$4q6V6PPDPrhr+hh+r+%P+hh{7:YY", +"::T77Y7aTFFFF777777L7kFakF7FaHFWDW7E_338KoK83Bv,,cAA*ippxpipippAAippcAccS~~~;@CCCC@CCCCCCCC)~~OScSScSSSSA*iiixR+e%P6%66}q&qU&'q}6r+nR(ii77G,GXX3X77GGL7ikkilikRn+r+++hhn+r6q&q}&&g4U&'&qq6qg$9955555555w$4Ug$$dN2!uooKuL+g$99wwwww99$$$$U$ggU&&&UUq6Pr+nhRx7F7:Y", +"Y7YFTF=Y:::L7F7F7F77FmkTkTF:zHWDDTluKKKKO8K3Kvvv,cvcvcpixppipipc*cpp0iAAc~oo8[CCCCCCCCCCCCCC[~~S3Sc~333SccAiixxRR++66qqq}qq&q}66%h(R{kFl,i7iLGGEBlcBGkkxkkk77nPr66rrP%+++r6}'&q'q&&U&&qq}q&4$ww555.555ww$U4$$$$V^NI!uooKuxPg99999$ww$9$$$$y$UygUUU&}&rRxxzkmF::Y", +"F:F:Y=FFFFF77777F:kTFk{TWTWTYWDyDzGX33KKKK833_vAGvvvAiixipiAiAccSAAiAiicA388;[CCCCCCCCCCCCC[[[~~3~3S3~OS~SS*ciixRRR++PrPP6rrPr+++hhRRkpM,li7iiii,,LLkFRh{kFk{+%6666P++h+%6q&Uq66}&U&&}qqq&Ug$9w55555555w9g&$99$&V+^NI!KKK~!N&$99$9$$9$s$99$g$gUUUUUU&&6nhkkF:7F:", +"YYaFaTY:77F7k7k7kFTWhWWhWhnnWDyyVYEuKKKK8O33_B_vvv_X_AiipipiipSA_vcAAA,AA~~[[[CCCCCCCC[[[[CC[[[8~8~o~8~S333_AAiiixxRR%++%+%+Rn+nnnRnnRFkG,lkFkFiL7kik{Rnhkk++r+rr6%PrR+++r}&}&}PP6q}666}q&Ug$ww555.555ww9g&$$9$gqD+^WN2uKKKK!p+&$9999$9$$s99$$$gUggU&'6+Rhmk7YY:", +"HFYY:YFaFkm77k7k:kTkWWnWDVVVyys/rzXXKKOKK33__3B___vvvAiippiiAic_SvAi,i,cSSoo;[CCCCCCC[[CCCC[[o8o8)8o[)888~~~3_SAcciikxhRR+R+Rn+++n+nRx{,i,iikiiLkkk{RRhRRk{hr6PP+++rRRxn+6}&U&q6V66Prr6q&'ggg9<5555555ww4&UU$$$Ud6VW^NN2uuKKKuB7kr&U$U$99$$$s$$$$UUU&qPP+kk:777:", +"77FTF=:::Fkk7kmkF{T{WrDVyyyyssssWYEXKKoKKK33_3____3_vvAiciipAiA_3S_AAA,AS8o[o[CCC[[[CC[CC[[[ooo~o~o8oo~[8o8o8~3Sv_v,iixRRnR+n+%+rP+%+R(GcGliFLFiikk{RRnRhRRhPrr+r%RRR(R++rq}&'q6Prr++6r6&&gg$$ww55555599g&Ug$$yqV&V^DWN=!!uKKuuu!t:hDg&U$9$$$9$U$ggU&q6+h{km7:7Y", +"77m7:77F7777k:kkk{hWhrrVVVyyyssyDHEXKoKoK3u___3__3_3__AA,A,cpc,v333vAAv__~oo[C[CC[ooo[;oCCC[[o8~3~8~8o~883o8888~3__cLFxxRR+%++P6rr6+r{ki,,iLikikkkRRhRRRR{RR++++RRRRxRx(++}q&&qP6PRn+P6&'gg$$$$w<5599w$$ggg$gg&qq66D^W^I]!uuuKuuKuutthhVqU$$$$$$$$g&'6+R{kLL77t7", +"77L7k7LL77k7k7kmkThWrWrrWhTWWWyyWMB3KoK8K33___33_S_3__vA,c,A,Avv~383vvvS3~ooo[CCCo~u!Suoo[[[oo~33~3~8O~83~88oo8833SB,ikx%RR++%P6}P}n+RFil,iLikkkkk{Rn+nRxxRRhhhR(x(x(RRR+P6}&}qqrP+hr66&&ggg$$$9999w9$$g$$g$g&qVP6PP+W+=I!uKuKuuu!uttmmer6&yg$$UgUg&q%+Rkk7,777t", +"Lk7p7L77L7LFpkmk:kkT===:Y7GtHtDDnHEuOKoo33B_Bvvv__S333_vv,AccAv333K~33S3_8;ooo[oKuW&qhtu[[[[o88~33_S3S_333O888oo83_vcikxxR+++PrP+r+rRzkGvEc,i,,LkkxxRRRzRkkkxxRRxxxxxk(RR%Pq'qqP6++PPqqUg&ggg$$$9999$$g$g4$&g&q6P++NDNWN2uuuKuuuuu!LmhP66q&$g$g$U&U&q6PRxkL7L777", +"LLLLL,,,,7LLkkkkk:kkLML,GBX_BGaWTHE3KKKK33BvGvB,v__333S_vA,AAvv_8~K8883~3K8oo~ut=DyjsNv~o[[[oo83S__A__v_S33388Ko883vALikz(RR%Rrr+++RRkicBBvEccBcLFkkkkxkxkkxzkkxxkkkxRkR+PP6q6q66rPP66q&gUgggg$g$$$$$g$$$ggU&VP6^WhhNN==2uuuuu!!!!!0=6qgUgggg$UggU&qq6P+RRkL7pLp", +"LFiLiLiikikkkkkkkkkLk7i,cB_BXBEHYGEu3KK3_B,7777cvGB__33__BvvvvS33K88888388ooouAL{PVyTuo[oooo8883~_vAcAvv__338Oo8[88_v,LpkR(RRnRRnnRkki,vBcB_u_3BGLkkkxxzxxx(xxxkkkkkRxxR++PP6q6666r66q&q&ggggg$ggg$g$ggg$gg&qPPh+hNNhNN2!uuu!!!!*!2Y^V&g$$U$$g$$ggU&qq66+RRkk7kL", +"LkkkkLLLkkkRxxx{kkkLkLLGvB_B3_BGHEEXuXBEHFFkiG,GcLGvBK~___vv_vBu3~8o[oo88888o8_B,YW=Bo[[o~~8838K3S_A,,,,vS3383o8o88__cc,ipkkx(RRR{{FL,,cGvBX3X3_B,LiFkxRRxxxx(xkkkkkxRxR+P66666666P666q'&&g&ggggg&ggg$$g$ggqPDNhhNW===m!uuuu!!!22!tth&gg$$$g$U$$$gU&U&q6+RRRxkkk", +"xkkkkkkkx{Rkkkxkkkkkki,,vvv3B3KBXEEuXuBHFFTa77,GGG77,B33K___vSS3338o[[ooo8ooo8K_BGYGKCC[8833S33333_A,,,,Avv_333KK883_Bv,LiikkLiFiki,,,,,vv__u3BBB7kkkRhRxkkxRxxkkkkxR(x+PrP6r666q6666&q&'&g&ggg&&&&&gg$g&&qD^hh{N{mmmI!uuuu!!0Im0ptI^q$$$$$$$$g$$$$U&qqqP+RRRRxk", +"kkx{R{x{Rx{{xxzxkkkLkL,,vvv3_3K3uXBuEEEHWFFFF7GGG,77kGBKK3___3_3~388oC[[[oo~o8Kuv77uK[[[8~_S__333S3vA,pi,cAvv_O38KKK3_vc,Lc,L7,,GG,GGvG,vBB_B_Bc,,kkRRRhR{xkkxkkkxRxhRxRPP666666666}66qq&&&gggg&&6P6&g$gg&Ph{{N{{mmmt0!uKuu!IINhNkmm=Vgg$$$g$$g4gggg&qq6P+RRRRxx", +"RRRRRRRR(xRxxxxkkkkk,,Accvvv_KKK3uuX3BH7777GBvcB,GGkTT7B3KK8_S33388oo[CCo[8o883BB,Gu[[Co833vvvS333_SvAi,,,cA___33O8K33__vBvBBBBEcBc,vcvB,cvBBvv,ikkRRRnRxkkkkkxxkRxRxRR++rPPr666qqP66&&&&&&gg&&&PRRPPqgg&6+mN=mmmpmt2!uuu!2tNh+66PR=N6gg$g$$$$$$gU&U&&66P+RRRR{R", +"RRh++R++RRRRRzxxkLik,,vvAvv__3KKKOuXuXEEEvvvvBvE,,77ThTHu8KKK33K888oo[[Co[o8K33B777u[ooo833SAAGSS333vA,,p,,cAv333338K8K33___3__uBBBBBG,,,c,v,G,Lkk{RhRRRzkkxkk(RxRRRxRRrPP6666}qqq6q6qq&&g&ggg&66eRR+6qq6h{pLptpIttt*uuuu!20{+P6qqPhNDdU$$$g$$g$gUg&Uq66++h+RhRR", +"xRRR+++++RR(xxxkkkL,L,,,cvvB_OK3KK333_BBc,,,,v,vBGE7YWrW,338K88KK88K[[CooK883uBGGHG3oo8888_vv,vAvv3v3_AcA,cvv__333K3KK8KKK33uu_B_BvB,vc,7L,,,,kLkkRRRRRxkkkxRRRnRxR(RRR+PrPr66q&&&qq&q&&&g&gg&&6+Rx{{hPP+{mmtLt0tAt!!uKuut:{NP6qqqq6hhqg$$$$$$$$g4&&qqq6+%RR+RRR", +"RR+++R+R+RRRxRkkppi,c,Avcvv___333KKKK3BBv,,,L,GvvBv,GFWWWtXK8K88oooo[[[oK33_Bv,G77BKoo88833_v,LvvvS_S_vAvAv_v__333K38KoKKKKK3_3X__BvB,,,Lkikiikk{x{RxxzkikxxRRR+R(ekxR++P666q6&&U&&qq&'&&gggg&&6+k:tt=NWNtLtLtttttt!uuuu!0mh+6q&&&&&qP6gg$$$ggUgggU&q6PPP+R%RRRR", +"RRRR++++++++nx{kpiL,,,,,vv_vu333KuK33u_B,Lii,,,,vvBcG7FTWFGuK8Kooooooo[KuuBEE7777LB3o888333vv,A,AAvvvvvvv_vv__333333O88KKK3vBv,G,,c,LLLikikikkkkxRRzRxkkxxRR++++RhRx(R+PP66P6q&gUU&&&&&&'g&gg&6+h=LLttI=mLtttt,!A!!!uuu!t=h+Pq&g&g&&qPrq$$$$$$$ggg&&qq6P+R+R+RxR", +"x(RRRR++++RR+xRxki,i,i,,cA____u_33uu_BvLi77iii,,cvBBvG7FWa7_KK[ooKoooooKBEB7G7FF7FEK[o833~S_vv,,i,cvvv__v___3_33u33_3OK33B_c,,,,iLLL7i7kxkxzkxRxRRRxkkkxRRh++++++RRRR++66666qq&&ggU&&&&&&&&&&q6hNmt!G2ttt!A!A2A2!v!uuuuutNh66qqg&gggg&6qg$$$$$$gg&Uq66PPPR+RR+(R", +"xRx(xRRR+R+RRRxxppp,,,,,vvv_BB_33_33_BGLikkk7,7LGvvBBEGHTYHE38ooo[o[oKK3B777TWTTW7BKoo~3__3vvAc,,,cAcA,cvAvvvSuv_B_BvBv_Bv,LLkkkkkkkkkxkRRRxxR(RRRRRRxxnR+++PPP+++RRx+P666}qq&Uggg&qqq&&&&&q66PhNIL!2u!!!t!!!!v!!!!!uuu!LhP6q&g&ggggggqqgg$$gggU&g&&6qPP+++RRx{x", +"xRxexxRRRRRxRxxki,ii,,A,cvv___B____u_v,7kpkkki,,,,cB_XBEHz:G3Ko[oooo[KKuE7WWWDDWW7BKoK8S3___vvcA,L,L,,,AccAvvvvvvvvvvvvvv,Lkkk{{{xxxR{RxRRRR(RRRnRRRnh++++P6PPP+++RRR%66q66qq&gggg&&q666&&&&6P+W=It!!!!!!!G!!!!u!uuuuu!!mP6&&Uggggggggg&qgg$$$ggU&&qq66PP++RRxkx", +"xxRxkRxxRxxRxxki,,AAiAccvcvvvv_vu_vvB,,pkkkkiLiLL,v_v_3XHHFGBKKo[[[[KK3XGanrDDDDrHuKo883_S_vvvA,,Ai,iiiL,,,vcvvvv,,v,,,LLkxxkRhRRhhnRh+%R%+RRRRRRhhRR++PP666P6PP+++++PP666qq&UggggUqq66666q66DhNmL!2!!!!u!!!!!!!!!!uu!utNPq&g&Uggg$$$$ggUgggg$g$&U&&qq66++Rh{k{k", +"Rxxxxxx(xxxxxii,,cAc,,AvAcvvvvvvv__vvGLkkkkkiLLL7,cv_333EHHHE3Ko[oo[oKuBGYD}yyyyVTXKo88_____Acvc,,LLLLppL,LL,cc,,,LL,LiikkRhRRh++R+R++++++R++RRRR+++++PP666q6q6P++++RPP6666q&&ggg&&q66%6q66V^WN=It!!!2!!!!!u!u*!!!!uu!!LNqq&gggg$g$$$$gg&ggggggg&&U&q666++R{{m{{", +"RRRRRxexRRxxkppLc,,L,,,i,,,,c,AvvvvvvLLkxkpkkFii,L,vB33uuBHGGuKooooKK3uBGYDyy$yyyTE8o8~3_S_vvvvA,,,iLLiikp,,,,,,,,,LkiikkRRRhR+%+++++R++%+P%RR%RRR+PP66qqqqqq666P++++P666Pq'&Ug&Ug&q6PP666V+PWNmtt22!!2!!!u!!!!u!!!u!!!mh&gggg$$$$$$$$$gggggg$g&&&&&qq6P+hN{mxx{", +"+RRRRxRxRx(xkiLLLLipkkppkpiLLLLvvvvGALkkxxkkpLik,,vvB383XBEGHE3KooooK3uElYWyssssyWGKoK8__vcAcvcvc,,ipLpiikL,,,,LLiiLkk{{RR%++%++P%P+rPP+PP++RRRR%PP6qqqqqqqq&qqqP++++P6P66qq&&&g&Uq6PPP+PP^+WN::t2!22!2!!!!u!!!!!u!uu!tmP&ggg$$$$99999$gg&g&g&gU&&&&&6&6+{====RR", +"++RRe(RRReRxxxipikxkxxkxkkkpii,L,vGvLLkkkxkpkk7LLL,v_33KKBGHGuuKKoKKKuXGHzDysjjssDH3o833__vvGv,vA,,,,iLLpLiLLLLiLLLkk{xRRR++PPPPPP66r6P6P%P+%R++6%66'&&'&&&qqq666++PPP6rPP6&&&U&&&q6PPW^+W+NW==tt22!!222!!!!!!!u!!!!!!L{P&gg$g$$$9$9$$$$&g&g&g&&&&&&&q6Phh==mhhR", +"+++++eRRRRRRxxxxxxRRRRhxxxxxkkLLLA,v,Lkxxkkkpkii,L,,B3KKKuBGGXu3KKKKKXBEHaWys.5jsVTu8K~__vvvAv,,cA,p,piLLLi,,,,iLLikx{Rn+rPPrP6}66666666PP++++%P66qqq&ggg&U&&&qqPP%P666PPP6qq&q&&&q6rhhWhhW^==tt222222!22!!!u!!!!!!!*2tN6&g$$$$9$9$99$ggg&&g&g&U&&&&&qqPhN==m{R+", +"P+++RRRRRRRRRkxxxRRxRRRh{xR{kpiL,,c,ikk{xxkxkpLLL,cvv33KK3XGGGXuKKK33uBG7TWyy...jyWE3K8_S_vc,,,,A,i,i,LiiikkkiiLiikk{RR++Pr666666f6'66fqPPP%++P6&&&g'g&Ug4&U&qq6P++PP66PP666qqq&&&6P+hNWNW=Y:mtt22!22222!!!!!u!!u!!!!Am+qgg$$$$$$999$9$$&gg&&&gqg&&&qq6PhW==WN+R", +"PPP+P++RRRRxRR{xx(RRxRxRRxRxxxkpLL,L,kkxk{kkkkiiLL,vv3K8K3uGGGXuu3KKuXEEHTWVyj..5yDt3K83__vvcc,,cAA,,,,LL,iLpLkpkpkkxRn+%PP66r6qqq6qqq66P%PP+P6'&&ggg$ggggggU&qq6P+6P66PP666qqqqqqqP+h=====:IItt!222222!2!!!!!!!!u!A!tx+q&g$$9$9$9$9$$gg&&ggg&&&&&&&&q6+Nh==hh+P", +"+PP+++++RRxRx(xRRRRR+RRRRhxR{xkpi,,,iikkxxkkkkLL,,,v_3KKo3EEEGGX33u3uuBHHYDVs<...sVzuoo3_vvvA,,,,c,ip,i,LLLiLkLkkkkkxR+++Pf66'66qqqq'qq6P6P%+P6'UgggggUg$gU&&&&6P6P6666P66q6q66q6q6P+W{==Y=I:It222222222!!!!!!!u!!!2LmNP&g$$$$9$$999$$$$&gg&&Ug&U&&&q66+h==W=h++", +"PPPP++R+R+xRRRxRRRRRx+RRR+RRRxkxpi,LLikxkxkkpkkiL,,B_38KKKX!EGGEuXu3EBBHHYWVys....yWG3K83Svvvc,,,AAc,,piiLLkikkkkkkxxRR+PPP66qqqqqqqqq666P+P+6&&gg4$$$$g$g$gU&q&PPP6q66666q666666qPPhN=Y:tItII22I2222222!2!!!!!!!vGAtxh6&g$$$$99$$$9$$g&&&ggg&g&&g&&&66h+=W=Whr+", +"PPP+P+++RRRxxRRxRRRR+RRRRRRRRRkkkLL,LkxkxxkkkkLL,,cvXKKKK3uXEGHEXuXXuBEHHWIDys<..jsDY383K3_vA,,,i,A,p,i,LLkLpkkxpkkzRR+PP%66'6qq'&&&&'&'P6+P%6&ggg$g>$$$$$g$&&qqP6Pq666q6q66666q6P6PhWm=IY:It2II22I22222!!2!!!2!!!ttmN+&gg$$$9$9$99$$$gg&$gg&&&&&&&&&6PrNW=WNh+P", +"P6PPPP+PR+RRxRRxRRRRRRRRRR(RxRRxi,i,,ikxkxkkpkkL,,vB38ooKKXEGGtGEEuXXEEHHTWDVys..ssVWu3K33_vvcAc,,,cL,LLL,i7LkkkkkxxkRn+PP666qqq&&'&&666PPPP6&&gg$$$$$$$$gg$&&&q666q6q66qq666P+P6PP+N{m:YtIIIIII2II22222!!2!2!0GAGtLxhP&&g$$$$$9$$$$$g$ggggggUg&&&q&q66+hN===WhP", +"PPPP+P+++R+RRxxRRRRRRR+RRRRxRRxxkp,i,LikxkkpkLLi,Gv_3KKKK3uBEGGGEEEuEEGHYYWDys<sjssyDHu383_vcv,,,,,,,,,i,kLkikkxxkkkxR+P%P6666qq&&g&&&66P6PP6&'g$$$$$$$$$g$gU&q66666q66q6q66666PPP++h{FmY:YIII2I2I2222!2!!!2t2ttttLm{^&&gg$$$$9$99$$$gg$ggggg&&U&g&q&6V+hW==NWhP", +"PPPPPP+++R+RRR(exRR%eRRRRRRRxRRxki,,,iiikkpiiL,Lvv__33KKKK3uEHHGEEEBEEGHYaWDDyss.syVDFEKK33vvv,,,,,,Li,L,iLLLkk{RkkkxRR+PP%q6'&&'&&&6&666P666&gg$$$$$$$$$$ggg&&q%P6qqq6qqqqq666PPPPe{=m:YYYIIII2II222222!2!!0tL0tpm{hPq&gg$$$$$9$$$$ggg&g$gg$&&gq&&&&66^WNW==Wh+", +"PPPP+PP+++RRRRe(+RRRRR+RRRRxhRxRppi,A,LpiikkpiL,,B_uK8oKK3uBEEHGHEEEBGlHYWIWDysssyyVDT73[8__c,c,i,,,c,i,LLLkikRkx{RkkR+P+Pq66&&&&&&'6'666P66q&&g$$$$$$$$$$ggU&q66666qq&6qq66666PPP++hxm7IYttIII2II222222!!2tttmmm==e+q&ggg$$$9$$$$$$gggggg$gggg&&gq&&q6PhhmWh=h+", +"++PPPP++++RRRRRexRR+RRRRRRRRxRxRkpi,,,ppLLLL,,,AvB333K83K33BEGHGGGEEEGHHYaWDDVyssyyDWk7BoK3vvA,c,,,,c,,iLiL7kkxRzxkkkR++PP66&'6&&&&&6&666P66qg'$g$$w$$$$$$ggg&&6P66q6qq&qq&q666666PeR{mm:YYtIIIII22222!2!!!GtpmNx{N+Pq&g$$$$$$$$$$ggggggg$$g$ggU&gg&&&6+hhm==hWh", +"++P+PP+PR++RRxRR+RRRRRRRRRRRRRRxxp,iAciLLi,ii,,cB__3K3KK33XuEGHHHGGGEHGFHTIWDVysyyVDWYHXK3_Bv,v,,,,,,,L7,LikkkxxRRkxk(RPP%6666&'&'&&6'66PP66&&gg$$$$$$$$$$gg&qq6P666qq&&qqq666q6P6PP+=T::YtIII2I2I22222!2!tttmxxhh+P6&&ggg$$$$$$$$$ggggggg$ggg&&&&&d&&qPhh{W=Nhh", +"++++P++++R+R+x(exRRRRRRRR(eR(RRxxk,,Ac,,,p,i,Acv_u33KK33Kuu_BGHHHHGGE7GzYYWWWVyyyyDWTY7BK83_vv,,,,,,v,,i,LLikkkxxTxkxRR+PP666&q&&&6&66P66P66'&gg$$$$w$$$$$g$&&q6P6q6q&&&&q&&66q6666P+{{m::IIIII2I22222!!2!G,tm{e+PP6&&ggg$$$$$$$g$$gggg$$$$$g$g&&g&U&&qVNh===W=h", +"++PP+P+P++RReRRR+RRRRRRRx+xRRxxRkpi,A,,,,i,,cAvB__K3KKK33X3EBGtHHGG77GHYzTIWWVVyyVDWTaHXK33vvv,c,,,,,,,L7LikixzRR{kkkx+e%+'6666&'&&'&6%6PP66&&&g$$$$$$$$g$gg&qq6P66qq&&&&&&&q66q66P6Ph{=m:mIIIIII2222222!!GtLkN+PPq&&g&ggg$$$$$$g$gggggg$g$$gg&gU&g&&qdPPh{W{=hh", +"e+++++++e+RRRRxRRRRRRRRRRRxxRRxxxkLLcAA,A,,AABv_u33K8833KuXuBGHHYHHGHHHHTaWWWDVVVVWWYTYBK83_vvv,,,,,cL,i,LLkkkxxxRkkkx(++PPP6'&66&6666666P66&&&g$$$$$w$$$ggU&q6PP66qq&&&&q&q&6666666Ph{=m:::II2I22222!22t!ttL=N+66g&&ggg$$g$$$$$g$ggggg$$$$$$gg&&&ggg&66+h{W===N", +"RePP+++R%eRRRRRRRRRRRRRRxxxRRxxRkk,,,c,A,,,,vv__338K3K33_uXBEEHYaYHHGHHaYYWIWDVyVDWWzaHBK33_vvGci,,,,ci,7LiLkx(RRxxkxxe+e%PP6P&66&666PP6P6PP&'g&g$$$$$$$$$&U&q6PP66qq&&&&q&&6q6q66P66R{{{=LttI2I222222!G!t!t:=N+6&&&ggggg$g$$d$g$ggggg$$g$$$$$g&gg&&&&q6PhhhWW=h", +"hRe+e+++eRReRexR(eRR(eRRRRx(RRkxkxL,,AvcAAvvB__33KK83333uB_BEGH7z7H7HHHTzYWWWDWVVVWWWWHBK33_vvvB,,,G,GL,iLiikxxRRRkkkxxR%+P+6P6666&66666P6P6&&&gg$$$$$$$ggg&&6P%PPqq&&&&&&q&&&6q6&666+e=k=mmttItI2t2At2t!tttL=hPP&g&ggg$g$g$$$$$g$gggg$$$$$$ggg&&g&g&&q6Phh==W==", +"h+e+P+e%ee(e(exee(Re+xe(RRxex(xxxpLLvvvvvvvv_Su338K3K3u_BXEEGGHaYaYHHYYzYzYIWWDVVVWDWWTu8K3__BvcB,cc,,,L,L7kkkkxR(xkx(xe+eP%6%66666666P666PP&&&&g$$$$$$$$gU&&PP6PPq&&'g&&&&6&6&666666Ph{=Tm:mLttttt222G2ttttt=h^6&&gggg$g$g$g$$g$ggggg$$$$$$$gggg&&g&&&&6+hNW==W", +"{hReR+eReReee(exRexRRRxxxRxxRxxkkpL,,vvvBv__u33K8383K3u_uBBEGlHaTaa7HFYzYzaWWWDVVVDDDWHXKK3__vv,cG,,c,,iikLikkRxRRxkxxxRe%++P66666666%P6PP6P6&&ggg$$$$g$gg&&qP+++6qqg&&&&&&&&6&&66666++h=x7:tIttt2tt!t!t!ttLtNh+P&&&ggggg$$g$g$ggggg$g$$$$$$$g&&g&&&g&&q6+hhW=W=", +"{R+++Re%e(Rxexex(RRxRRRRe(xRxRxkLLLLvABvvuSu33KKKKKK3__uBBBEE7HYTa7aYHHYzYYYYWDVyVDDDWH3o33__BBvGv,vGc,GLLLkkkx{RRxxxxi(eeePPP%6666P6P66P6P666&&gggg$g$gg&&q6+++P6q&&&&&&&&&6&666&q66P+h{=mpILtttt!tt2t2ttttImh^6&gdgggggg$$$g$g$gggg$$$$$$$$ggg&g&&qdq&6Phh==WW", +"T{RR+RReeee(ex(exxxRkxxxR{xxxxxkkL,,vvB_vB3_3KK8K~3uuuBBBBEGGHHaTTHFYzYzYzzYWWWVyVVVVDH3oK3__vvvvv,,,c,,iiLkkkxx(Rx(xxxe(%+%PPP66666P6P6PP666&'&&&g$$ggg$&&66+++6q&&&g&&&q&&&&&&66&6q6PhN{m7Imtttttttttttttptm{hP&&&gggg$gg$g$ggggg$$g$9$$$$$g&g&&&U&qqq6PhhhWW=", +"W{RRRe%e(xeexexxxRxx(xRRxxxxx{kkpL,,vvuv_3_u3K33K3____BBBEGGGHFYWTzzHHzYzYYzYDDVyyyyyWt3o33___vBcBvv,,,,7LkikkRRRRRkkxieeee+P%PPPPP6P6P66PPPPP&&&&&gg$ggg&q6P+++Pq&g&&&&&q&q&6&6&q6&66P+{{mmLtttttt2Gt!tttttm={^P6&&gdg&g$g$g$gggggg$$$$$$$$ggg&g&&&g&&&66+hN=WW", +"W={RRee+eeR(exxxx(xexxxxRxxkkxkLLL,,vvvBuS3u3KuKuu_BBBBBEGGHGHHzWWYTYHYYzazWYDDyyyyyyWG3oK33_BvBvvcvv,,iL,kkkkxRxxxkxkxi(e%ePPPPP666P6P6PPP6P666&&&g&ggg&&66++++6&&&'g&&&&&&&&&6&&q6q6P+N{mmLmtLtttt2ttttttmtmxR+6&g&gg$ggg$g$dggg$g$$<$9$$$$gggq&&&&&&q&6^hh=W=", +"W={RRx+RRxexxxxxexxxRxxxx(xxkkikLL,vBBv_B_u3uu3u__u_BBBEGGGGHHYYWTzYzzzzYYzYWWVysysyVWtK[883_3_BvB,v,c,,,LpkkxxxRRRkxiieee+e+e%PP%66P6P6PP%PP666&&&gg&gg&&6P++++6&&&g&&&&&6&&&6&q66&666+he==mtttttLttt!ttIttm=NeP^&&&g&g$gggggggggg$$9$9$9$9ggg&U&&&&&qqq66+hW==", +"WW=NhRxRRRxxxxxxxxxxxkxkxxxkxpip,,,vB_B__3_333uu_BBBEGvG7HHGHHzTWWzzYYHTzTWWDDVsssssVWG3oK33___vvvvcv,,iLiikkxRRRxxkxxx(e(e%Pe6P6PP6P6P6P6PPP66666&&&g&&&6P%+e%P&&&&g&&&&&&q&q66q&6&6&P+NhxmmtmtLtttttttttmmmm={eP&&&ggggggggg&ggg$g$$999$$$$$gg&&&&&&&q66P+hNWW", +"W==WRx+RexRRRxxxxxxx(xxxxxixkpppL,AvBvuB_u3uuuXBBBBBGGG7GGHHHaHTWTWYTzTzYWzWWVysjjssVzE3oK33__B___vA,c,,,LpkkxxR(RRxxiixeeee+++P6P66P6P6PPPPPP%66&6&&&'&&6P++e+Pq&&&g&'&&&qq&&&6&6&6&q6Ph{=mmILttLLtLtttt2ttm=mR^P^&&&g&gggggggggg$$$$$9$$$$$gg&&U&&&&&&6qPPhhhW", +"WW=WNxxxRxxxxxxkixixxxxxxxxixki,LAvB_BBuv_3__u_BBBGvG7G7777YHaTTWWWzaTTWzWWDDVysj.ssVTEKoKKK_3BvBvBvAc,i,iikxx(eexxkkxxx(e%P+++PP6P6P6PPPPPPPPPPP66&6&6&6PPe+++6&&&&g&g&&&&qq&qq6&6&666PhN{=mmmIttttttIImtmttmN{R+6&&&ggg&ggg&ggg$$$$9$99$$$$$gg&q&&&&qqq6P+hh=W", +"WWWTW{RRxxxxxxxxxxxixixixixpipi,A,vv___B__uX__EBEGGGGGGGH7HFYYYWWWWWWWWTWWWDVyss..jyVYE3oo33______vBA,,,LLkkxxRRRRxxxixxee(e++PPPP666P66%PPP%PPP666666666P++e+%P&&&&g&&&&&&qqqq6d&&6&66P+hNmmtmtLtLtY0tttIImmmkeee^&&&&&gd&ggg&ggd$$$9$9$$9$$g$g&&&q&qq&66P+hNhT", +"WWNWWkxxRxxxkxixiixixixixxixiiL,AvB_uv__u_uBBBBBBG77GH777Y7FFazWWWWWzWWWWDDDyys..<.yDYEKoKKK33_____vvc,,iLikkxRRRRx(xkixRRe++%PPPP6PP6P6P6PPPPPPPPP666666P+e(+P6&&g&&g&&&&q&&&q666&6&&6PNh{=mtmImtIttItIttLImmm{he+P^&&g&gg&&gggg$$$9$$9$$$$$g$gdUqqd6q66666+h=W", +"WWWWT{{xxxxxxxxixxpxixixixpip,,,,v_vB_BB_XuX_BEBGGGG77HH7HzHYazWWWWWWWWDWDVVyy<...syDYE3oo333_____vvvA,,LipkxxxRxxxpkxxx(e(ee++PPP66P6P6PPPPPPPP+PPP666P+%+ee+P&&&g&&&&&&&qqqqq&6q&6&q6P+hNmmmmttLttttmtIImItmmmxPeP&&&&&&&g&&ggg$$$9$9$$$$$$$gg&qqq6q&&66PPPhNW", +"=WWWWTTkxkkkkxkxpipxpxxpxppip,,AvvS___uBu_BuBEBGG77GGG7HaHYzYazWnnDDDDDDVVVyyss...syWYEKKoK333____Xvvvc,LLikxR(RRxkkikkxxee+%+PPP66P66PPPPPPPPPPPPP++PePe+e+ePP&&&g&g&&g&&&&&q&&&6&66&66+h{=mtmtmtmmttIttttmIm==Ne+P^&&&&&g&&ggg$$$$9$$9$$$<$$$gg&qqq6666^P+++{{", +"hNWWWWT{xkkpiiipipiippiikppp,L,vv___uBXu3u_BBEBGGGG777H77aYHzYWzWDDDDDDVVyyss<....syWHEK[883333__v__vA,,,ipkxxRRxRkkpixke(e+e+%PP%6P6PPPPPPPPPPPP++P++PPe+Re%P6&&&&'g&&&&&q&6&6&&6&6&66PPRhNmmtmtIttImtImtmILIm=k^ePe^&&&&&&g&gg$$$$9$9$$$$$$gg$g&&q6q6666PP+hR{", +"==WW==T{kkkkpxpppipLpppppi,L,,,vv_Bv_u_B3BBBEBBGGGl7H77H7HaYaHTWWWDDDVVVVyyys.<..<sVDtE3oKK333__3vvvcv,,LLikxxxRxxkxkikxRRe++P+PPPP666PPPPPPPPPPPP+++e%ee(e+e66&&g&g&g&&g&&&&&&&q&&6&&66Pe{{mmtmtLILImtImttmIm==mheePP6^&&&g&ggg$$$9$9$9$$$$$$gggg&q&666PP++eRh{", +"W=W=WWTmkppkpLipLpLiiiLippLL,AAvvu___BB3BXuBBGGcG777G7H7H77FHzTzTWDVyVyyyyss<.<..ssVWHEKoK383333____BAcL,LkkxRRxRxkkkkkke(e%e+PPP6%6P6PPPPPPPPPPP+P+Pe++e%e+P66&g&&&&&&&qd6&&q&q&Qq6&66PPhR{=m=LImtmItItttmttIm==N+eeP6&&&&g&ggg$$9$9$9$$$$$$g$gggdq&&666+P++RR{", +"{=WWWWW=FkL7LLL,LLLLLpLLLL,,,vB__S_B_uBuXB_BBEGEGGG7G7H7HaH:YYYYzWWDVyyyyysss.<.<ssVWHBKoKK8333S____cvALiiikkx(xRkkkipkxRxe++PPPPP66PP66PPPP%6PPP%P++%eeeee%+P&&&&&&g&&qq&q&qqq&6&&&6&66Ph{{mmmtmIttmtmIImImmm:===e+Pe66&&&&ggg$$$$9$$9$$$$$$$$gg&g&666PP+++eRR{", +"====WWTWk:FpLL,p,,p,,,,,,,,,AvAB__u_BXu_BuBBBBBGGGlGGH7H7H7HFFYzTWWVDyyyys<s<<.s.syVWHBKooK3~3_33___vc,,,LkkxRRRkxpikkkx(Re++P+6PP6P66P6PP66PP6PPPPP+e%e(+e+P66&g&&&&&&&&&q&&q&&&q6&6&66P+e{{mtmttImtmItmtIttI===N+eeP6^&&&&ggg$$$$$9$9$$$$$$g$ggg&gd666+++e+RRR", +"k==WWW=WF7kLLL,,,,,L,A,,A,,,vB_u___BBXuXBBBEBGGv7GG7GGH7G77HHHYHYTTWDVyyysssss<sssyDYHB3KK8K3K3_3v_vvvcL,iikkxxxkxxkipkxeRR%e+PPPPP6PP6%6PPP6PP6PPPePe++ee+PP6&&&&&&g&&&&g6&q&6&qq&q6&6PPh{{mmmmmtmIttItmtmmtmm===h+PPP&&&g&ggg$$$9$$9$9$$$$$g$ggg&&&q66PP+eRR{x", +"=:===WWT=F7kLL,,A,,AA,,,,,vAvvv__3B_uXBu__BBBBGGEGGlGHGGHHG7777aHTYWDVVyyys<ssssssyVaHuKooK8K333_3__vc,,LLkkxxxRxkpikkkx(Re++P+PPP6P6666P6PPPPPPPPP6+++%P++P6&&&g'&&&&q&&&qdqqq&qqq&6&66P+hN=mtmtImtImImImItmI==Nh+^e&e&&&g&ggg$$$$9$$$<$$$$g$g$gggg&666P+e+eRR{", +"kk=TWWW===Y77LLL,,,,AAAAAAvv__u_u_BBB_BBBBEBBBGGGGGGGHGGG7GHHH7H7HT=WDVVyyysys<ssyyDYHX3KKKK8383___BvAc,,iikxx(xkkkpiixxxeR%ePPPPPP6PP66PPPP6PPPPPP%P+++eP%66&&&g&&g&&&&&qq&q&qq&&&qq6&6PhRh==mmtLImIt:IIImmIm===N{+P66&&&&ggg$$$$$$9$$$$$$$$$g$gg&g&&6^6Pe+Rxxx", +"k::===WWW=:m7LL,AAAAvvvvvvvBv_B_BX_BuBBBuBBGBGBvGGGGGBGGGG7GGGH77HY=IDVVVVyyyyyysyVDWHEKoooK8333_3__vA,,LLkkkxxkxpipipxxRRe+eP%PP66P66PPPPPPP66PPPPPPPPPPeP66'&&&&&&&q&&&&&q&&q&6qQ&qq&66+R{{mImImImt:tImIImtmm=h{e+e6^&&&&ggg$$$$9$$$$$$$$$dg$gggg&&&q6P+++eR{x", +"kk:=WWWIW=Y=tLL7,vvvvvvv_S_____3uB_B_XuBBEBBBGGBGEEBGGcGGEG7HGHH7HHYWWWVVyVVyyyyyyyWYtE3KKKK33K3_3v_vc,,,iikxxxkxkipiixxRxR+PPPPPPP6P66P66666PP6P6PPePP+PP66&&&&&&g&&&&&&&&&&q&&6&q&6&6q^PN{=mmmtmtmI:tImImmmm=mhhe+P66&&&gggg$$$$$$$$$$$d$$$$ggggdg&&&66+e+Rexx", +"mk7:I=WWW==mt7G,vGvvvvv_vvvu___uBXEBEEEBBBGGBBGGBvGGGGGEEGGEEGGGGHHYIWWWJVVyVyyyyyVDzlu3oooKK3~_3_3vvAA,LLpkkxxxxppppixiRR++eP%PP66PP6P6%6P6PPPP6PP6PPPPPPP6&&&&&&&&&&&&&q&q&&q&&q&6&6qq6+Rh{=ImItIIII::ImIIm=xN=he6e66&&g&gg$$$$$$$9$$$$$$$gd$gggg&g&&6P6+++Rxp", +"mkm:===W=WWY7m7LG,vvvvvvBBvvu_BuBuBBBBEBBBBG,BvGEBEBEBGvGBGGGEGEGHHtYYWWDDDJVVyVyVVDYHEuKK8K83K33___vc,i,iikxxkkkpi,iixxR(e+%PPPPP66P66P66P66P6PPPPPPPPP66&6&&&g&&'&&&&&&&&&q&&6&q&qq6&6P+hN{{mmmtmtmItII=ImI=={=hRP66&&&&gggg$$$$$$$$$$$g$gg$ggggg&g&q&PPeeRRRx", +"pm7:I=WIWWT=:777,GGBBvv______u__BEBEBBBBGGGBEGGBGBvBBBBGBGGGEGEGGEGHIIIWWWDVDVVyVyVDzGE3Koo8KK333___vAc,LLkkkkkxiippiiixeeeeeP+PP6666666P6P666P66P6P6P6P6P&6&&&&&&&&&&&qdq&&&&q&&&6&qq666+R{==ImtmtmI:::=I=mmmxNhN+Pe6&&g&gg$g$$$$$$$$$$$g$$gggggggg&&&66PP+RRxx", +"xkk=Y=WWW==WY777Gv,BBBvBv_BBB__uBBEBGBGBBvGvBBGBvGEGBGBEvEvEBGEEGGGHHYWIWWWDWVDVVVVWYHE3KKoKK88333v_vAc,LLipkkkxpipippxx(eR+PPPPP6P6PP6P66P6P66PP6P66PP66&6&'&&&&g&&&&&q&&&qq&Q&q&6&6q&PP+R{={=:tmI:I:IIII=Im==={eeP66&&&gggg$$$$$$$$$$$g$g$g$ggg&&g&&&66PP+eRxx", +"kmm:YIIIWW=T:m77,,GGvBvuvB__uBB_BBEGBGBGGGBGGGBGBBvBBBBvEvEBEEGGGGGGHHIWIWIWDWDVVVVDaHXuKoKo8KK33_3_vA,i,Lkkkkkkkppiiiixe(ee++PP%6P66P6P6P6P66P6666P666666&&&&&&&&&&&&&&&qd&&&&q&&Q&6&&6PPeh==mmImtt:I::::m::m{{hh^P&^&&&gggg$gg$$$g$g$$d$g$ggggggg&&&666P+++RRx", +"xkkm=YWWIWWTTY777GGGBGvBB!vBBuBBuGBGEGBGBGBBB,BBBBBBBBEBEBBEvEEEEEGGHHHYTWWWWWDDDVDWYHE33KooKK833__vvvA,,iipiixipi,,pxxxRe%eP+PPP666P666P666P6&666666666&6&6&&&&&&U&&&&&&q&q&q&&q&qq6&66P+NhN=::t:ItmtIImI:m=m=Nhh++6&&&&ggg$g$$ggg$$g$g$gd$ggdgg&&g&&&666P+eeRx", +"xkLmI==WIW=WTYYI77GGGGBvBBBuBBBBEGGGGEGEGBGGGBBBBBBB_BBBBBEBEBBBEEEGEGHHIIWIWWWWDDDWYHXuKKoK8KKK33__BcAi,,ppxppppLppixiexe%eePPP66%66P666P66PP666666&66666&6&'&&&&&&&&&&&&&&&qq&&&6&6q&6P+h{{==:mI:mIm:::m:::={heePe66&&&ggg$g$g$g$g$$g$$$ggg$gg&&g&&&6&6P+P+RRR", +"{xk=:YIW=WYWWT:777GtvGB!BBEBBBuGEGGGGGGGGGGvGvBBBBBB__BBEBEBEBEBEEEGBG7HHIYTYWWWDWDWzHGu3KKo8K3u3___vvAcLpiipikipL,,,pxxxRe%PP+PP666666%&P66%66666&P6&666&&&6&&&&&&&&&&&q&&&q&6&&&6&&6666+hNT=::ItI:IIImYm:mm==hhRP66&&&dgggggg$ggg$ggggggggggggg&&&&&666PP++eR{", +"x{mk==IWYW=WTWT=7t7GtGGBBBEuEEEGBGttGGGGGGBGBBBvBBBBBB__BBBBBBBBBBEEGGEGHHYYIWYWWWDWYHEu3KKKoK383__vvcA,c,pkppippLpipxie(eeeePPPPP6P666P666666666666&666666&&q&&&&g&&&q&&&qq&&qq&&6q6&66P+hNh===t:mtm:::7::=T={T^Pe6^&&&&gg$g$gg$ggg$d$g$ggggggg&g&d&&&&6PP+++RR", +"x{x:===YW=WT=TYTY777GGGGBEBEBGEG2,G7tGtBG,G,G,EBBBBBuBBBBuBBBBBEBBEEEGGGHHHYYYWWWWWWYHGE3KKK8o3K3_3_vv,,,pipkipkiLL,pkxxe(e%PPe6P6P66666P6P6666666666666&6&6&&q&&q&&&&q&&q&&q&&&qqqdqqQqP+h{==:=ImIItImIm:m===h{hP+6&&&&ggggggg$gg$ggggg$gggg&gd&g&&&&66666P+eeR", +"exxmYY=Y=WTTW=WTFYY77tGGGGG!GBGBG77GGtGGGGGBBBvBBBBBBuB__BBuB___BBBBEEEGGHHHzYYYWWWTzlEXuKKKoKK333_vvcA,Liipipipp,,Lixixee+eePPPP6P6PPP6P6PP6P66666666666q&6q&&&&&&&&&q&dqqqqqq&&6qqqq666+R{{=m::mI:mI::Y:Tm=={Ne^6e&&&&gggg$ggg$ggg$g$gggggggg&g&g&&6&&6PPP++RR", +"{{xmm====TWYWTWYTa7777GGGEBGGGGGGHt7GGtGGGGGBBBBBBBBB_BBB_B_BuBu_uBBBEEEEGHHHHzYzzWaTtGBuKK8K8K33___vAc,,ppLiLipLL,,,pxxR(e%PPe6PP66P66P6P66P666P6P666&66&qq&&q&&&&&q&&q&&&q&&6&q&6qqq66PPhN{=::ImIIItmtmm=:{=hhh+P&&6&&gggggggggg$gggggggggg&g&&&&&&6666^PP++eR", +"Rxmk=YYT==WYW=WWWYTYt7ttGGGEGGttH7H7HHGGGGvGGBvBBB_BBBBBuBBBXB_XB__BBEBBEGGGHHHzYWWWTHGBX3KKooK333_vvcAc,,iLLp,,pp,ppxixeeeeP%PPPPP6PPPP6P6P6666P6PP6666666'q&&q&gq&&&&&qq&Q&&&&&q&qqq66P+hh==:mmImmtI::Y:F===TNePP^&&&&ggggggggg$gggggggggg&g&gg&&&&&6666PPP+RR", +"R{{xT==WY==W=W=TWTTY777t7tttGGGG777GGG77GGGvGGBBBB_Xu_XB__Bu_uBuBBuB_uBBBEGGHHHzYzaTTHEEuuKK8K8K~_3vvv,A,,ippLpi,L,,ipxxx(e+ePPPPP66P6P6PPPPPPP6P6P66P666&&6&q&qq&q&q&&&qq&&&qq6&666&666^+hhN====Im:=I=I:===={hhR+P&&&&ggggggggggggggggggggggg&&g&&&&&6666PPe+eR", +"eRxkmFmYTTW=WYWWY=TTY7t7H7lGHHHt777777GGG7BGBvBBBuBBBBuXBu_BXB_XuXBuBBuuEEEEGHHHzYWTaHGBB33K88K333_S_vA,,,,,Lp,,piLLiixxeee%ePeP%6P66P6PP6P6PP6P6P6P666666&q&&q&q&&qqqqq&&&q&qd&&&&&6&q66+{{{==:=ImII=I::::={{NePeP6&&&&g&ggggggggggggggg&gg&g&g&d&&&6666PPP++RR", +"{{{xmkk=YY=WWYTWWTTTY:7t7tH777HH7H7t7tGGv7GGBBBvBB_u_BBuBB_Bu___B_X_XX_XuEEEEtHYzYYzTHGEBu3K88K83u_vvvA,p,pp,pL,,,,,ppixR(e+P%PP6PP6P6P6PP6PPPP6P6P6PP&P66&6&&qq&&q&&&&&q6&&&qqq&&&d6qq6PPeh===:::::ImImIm:={{hh+P6&&&&&gggggggggggggdgggggggg&&&&&&&&66PPPPP+eR", +"RR{{kTFTTW==YWWYTW=W=TT:7YtHH777t7777,77GGB,GBBBB_BBB__BXuB_XuBuXu_uuuXuXuEEGEHHYzaYTYHGuXKK88K~33__vvAA,L,pLp,pA,,,,ixpe%eePePePPP6PP6P66P6PPPPP6P66P6666&6&q&&q&qqqq&&&q&qq&6&6q6q6q66P+h{h====ImImI:::====heePe6^&&&&g&gggggggggggggggggdg&gg&&&&&6&6PPPe+eRR", +"he{{{==T:YWW=YW=WYWYTYYTHa77YYYY777777G7GGBGGvBBEB__BBuB__BuB_B_XBBXBBuXXuuEEEGHHYzYFHHGBu3KKKK33S_SvvcA,L,,,L,pLLpLppxxxxe%ePP6P6PPPPPPPPPPP6P6PPP6P6P666&6&qq&&&q&&qqq&&q&6&&&6&qqqq666he{===Y==:Im:I=I====hhRPP6&&&&gggggggggg&g&gggg&gg&g&&&g&&&&6666P6P++eR", +"{{{{k{kT==WT=WYWTWYTWWTYa:YYHHF7aYH7H77GGG,BBBBBB_EuX_B_Bu_B_XuBu_uBXuXuuXXuEEGHHzYzYYHGBBuKK8KK33_v_vA,,,,Lp,L,,A,,,ixx(eee%ePPPPPPPPP6%eP6ePPPPPP6P66P&66&q&&&6&q&&&&q&6&&&&&6&666q666PPhNh===ImI=ImI=:===={e+PP6&&&&&g&ggg&ggggggg&gg&ggg&g&&&&6&66666PPP++RR", +"Re{Nk{m{TY=WWW==TTWYYWTYaaaFTYaYa:Y77777GGGGGvBBBBBBBuBXBu_uBXuBBB_B__X_uuXuEXGHHYYzFHHGEBX3KKKK3u3v_AvA,,,A,,,,,,,pippxe(eePPe6PPPe6PPPe&Pe6%PPPPPPP6P66&6&&q&&&&Q&&q&q&&&&q6&&&&&6dqq6P+h{====:=I=ImI=I====hhePP6&&&g&g&g&g$&ggggg&gg&gg&g&&g&&&&&&66^6PPPP+eR", +"RxRk{=TkT=W=YYWYWTT=WYWWTY:TYaYa:aHIH77GGGvGBBBBB_Bu__BuX_XBuB___XuX_uXu3XuXu!EGlHzYYzHHEBuu38K833_vvcA,A,,,p,,p,A,,iixpeee%e%e6e%PPPPP6P%6PPeP6ePPPP666P6&q6&q&&&&&6&Q&q&6&&6d666q6q666P+hNW==Y=:mImI=I===hNhePP6^&&&g&&ggg&gg&gg&$&g&dgg&&gg&&&&&66&&66PP+e+RR", +"Rx{{x====T=WWW=WYWYWYYYYTTTTaTYzYaF77t777GGGGBBBBBBBBuBuBu__uBXuEBBuBuXu3333XEEGHHHzYzHHEE_u3K83333SBvA,,,,,,,A,,,,A,ppx(xeePPP%66e6e6PPe6e%PPPe%PPPPP66&P6&q&6qq6&q&&&&&qdq&qq&&6&6qq666+R{h==Y::::m:m::=m{hNReP6&&&&&&g&&gg&ggg&g&g&g&&gg&&&&&&&&&6666PPPP++eR", +"xRx{{mk:W=WYTYW==W=TWTTTTTTTTTTTYT7YY777G,GGBBBBBBBB______B_XuBBBB_BuXuXuuuuEuEGGHYHaY7HGEBuK3K~33_BSvcA,ApA,,,,,A,,pipxee(eePePe6%6e%ePP6PP%eP6ePePPPP6P&66&6&q&&6q&qq&qqq&qqq6qq6d6666P+Nh======:77t::====x+eP6e6&&&&&gd&&gg&gdggg&ggg&&&&&&&&^&&6&666PPP+e+RR", +"xRxx{=TmT=W=WW=WTTTYW=WWTTTTTTTTYTYFHt777GGGGBBBBB_BBXBuBuB___B__BX__3u33333uEEEGH7HaaHHGEBB3K33KS3v_vAc,A,,,,,,,A,c,ppx(ee%ePPPPPe6666PePPe6e6%PPPPPP666&66dq&6&q&qqq6&66q66&&&6&6qq6dPP+hh===YYY=Ymm7mm==={RePP6&&&&&&&gg&g&&gg&&&g&ggg&gd&&&&&&&66&P6^PPPe+eR", +"Rx{{xmmW==W=YWYWYW=W=WYTTWTWTTTTTYa7:H7GG,GGBGBBBBBB_u____XuBB_BB_uXuXuXuXuuXuBEGGFYaY:7HEBuuKK333_3BvvvAcA,AAAAcA,Aiixxe(ee%e%ePPPePeP%6ePPPPePePP+PPP6P6qqq6&qq&6&6q&6&&6&&&6&qq&q66666+eW=W==Y=::mt:m=={hRePe6^&&&&&&&&g&g&&&g&g&g&gg&&g&&&&&666&6&66PPP+++RR", +"RxR{{{m{T:WWT=W=WTTTT=W=YWYTWTWTTTTFY777GGGGBBGBBBuBB_Xu__B_BuBBEBBBB3u3u333uXEEGHHHaza77EEB_u3K~u_3SvvAG,A,,,,,,A,,,ppxxeeeePPPPe%Pe%6e6Pe%ePePPPe6+PP6666q&6&&qq&q&q&6&&6&6&666&66qqq66h{h===WY::Ymmmm===NhR+PP&&&&&&&&g&g&g&g&g&g&d&gg&&&&&&&&&66^66PPPPPeeRR", +"xRxxxmm===T=WWYWYWYW=WYWWTWWTWTWWTYY77t77,GGGBBBBBBBuBB__u_B_BBBBBuXuX3X333uXuBEGHHHYT:HHGEBu3u3333_v_vvvv,,vAGvA,AApppie(e%eePP6ePPPePePPPePP%ePP+PPPPP66666&&66d6q&&6d&6&qd6&6&66q6666P+hh=W=Y=::7:::mm=hhe++PP^&&&&&&&&&g&gg&g&g&&&g&&&g&&&&&&66&&66PPP++++RR", +"xx{{{{=TTT=TYW=TW=TWYWTYTTTTTWTTTTaaY77HGGGGGvBBBBXB_uBXBB_BuX_BXBBXBuuuu33uuEXGE7YFYzF77HEBu333KSu3vvvvAvv,cvA,v,,c,pixxxee%e%ePe%ePPe%Pe%Peee%ePP+PPP6^&6&6&&&6&&6&q6qq&6qqq&6dq666&666+eh==W=T:m:7::m=m=Nhee666&^&&&&&&d&&&&dg&g&g&g&g&&g&&&6&&666666PPeP+eRe", +"RRxxx=k=T=W=W=WYWT=WWYWWWTWWWTWWTTY:F7777,GGBGBBBBBBBXuu__BBBEuBBBBBuX33uK33XuEEGHHHF:TaHGGBBuu3333___vvvvA,vGvv,vA,ppxx(e(ePe%e6e%eePPePPe%6%ePe+PePPP66^66&&6&&&6&6&&&6q&q&6qq66&66666P+h{W====F::=7:=m=hhR6eP66&&&&&&&&g&&&g&&&g&&g&g&&&&&&6d6666666PPP+Pe+RR"}; diff --git a/lib/libXpm/test/pixmaps/good/plaid-lisp.xpm b/lib/libXpm/test/pixmaps/good/plaid-lisp.xpm new file mode 100644 index 000000000..b4b3ade6f --- /dev/null +++ b/lib/libXpm/test/pixmaps/good/plaid-lisp.xpm @@ -0,0 +1,39 @@ +; XPM2 Lisp +(setq plaid ( +; plaid pixmap +; width height ncolors chars_per_pixel +"22 22 4 2 0 0 XPMEXT", +; colors +" c red m white s light_color ", +"Y c green m black s lines_in_mix ", +"+ c yellow m white s lines_in_dark ", +"x m black s dark_color ", +; pixels +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +"Y Y Y Y Y x Y Y Y Y Y + x + x + x + x + x + ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +"x x x x x x x x x x x x x x x x x x x x x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x " +"XPMEXT ext1 data1", +"XPMEXT ext2" +"data2_1", +"data2_2", +"XPMENDEXT" +)) diff --git a/lib/libXpm/test/pixmaps/good/plaid-v1.xpm b/lib/libXpm/test/pixmaps/good/plaid-v1.xpm new file mode 100644 index 000000000..922a95728 --- /dev/null +++ b/lib/libXpm/test/pixmaps/good/plaid-v1.xpm @@ -0,0 +1,37 @@ +#define PLAID_format 1 +#define PLAID_width 22 +#define PLAID_height 22 +#define PLAID_ncolors 4 +#define PLAID_chars_per_pixel 2 + +static char *PLAID_colors[] = { +" ", "red", +"Y ", "green", +"+ ", "yellow", +"x ", "black" +}; + +static char *PLAID_pixels[] = { +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +"Y Y Y Y Y x Y Y Y Y Y + x + x + x + x + x + ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +"x x x x x x x x x x x x x x x x x x x x x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x " +}; diff --git a/lib/libXpm/test/pixmaps/good/plaid-v2.xpm b/lib/libXpm/test/pixmaps/good/plaid-v2.xpm new file mode 100644 index 000000000..758ec3f1f --- /dev/null +++ b/lib/libXpm/test/pixmaps/good/plaid-v2.xpm @@ -0,0 +1,30 @@ +! XPM2 +22 22 4 1 +! colors +. c red m white s light_color +Y c green m black s lines_in_mix ++ c yellow m white s lines_in_dark +x m black s dark_color +! pixels +x.x.xxx.x.xxxxxx+xxxxx +.x.x.x.x.x.xxxxxxxxxxx +x.x.xxx.x.xxxxxx+xxxxx +.x.x.x.x.x.xxxxxxxxxxx +x.x.xxx.x.xxxxxx+xxxxx +YYYYYxYYYYY+x+x+x+x+x+ +x.x.xxx.x.xxxxxx+xxxxx +.x.x.x.x.x.xxxxxxxxxxx +x.x.xxx.x.xxxxxx+xxxxx +.x.x.x.x.x.xxxxxxxxxxx +x.x.xxx.x.xxxxxx+xxxxx +.....x.....x.x.xYx.x.x +.....x......x.x.Y.x.x. +.....x.....x.x.xYx.x.x +.....x......x.x.Y.x.x. +.....x.....x.x.xYx.x.x +xxxxxxxxxxxxxxxxxxxxxx +.....x.....x.x.xYx.x.x +.....x......x.x.Y.x.x. +.....x.....x.x.xYx.x.x +.....x......x.x.Y.x.x. +.....x.....x.x.xYx.x.x diff --git a/lib/libXpm/test/pixmaps/good/plaid-v3.xpm b/lib/libXpm/test/pixmaps/good/plaid-v3.xpm new file mode 100644 index 000000000..0e27400c3 --- /dev/null +++ b/lib/libXpm/test/pixmaps/good/plaid-v3.xpm @@ -0,0 +1,39 @@ +/* XPM */ +static char * plaid[] = { +/* plaid pixmap + * width height ncolors chars_per_pixel */ +"22 22 4 2 0 0 XPMEXT", +/* colors */ +" c red m white s light_color ", +"Y c green m black s lines_in_mix ", +"+ c yellow m white s lines_in_dark ", +"x m black s dark_color ", +/* pixels */ +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +"Y Y Y Y Y x Y Y Y Y Y + x + x + x + x + x + ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +"x x x x x x x x x x x x x x x x x x x x x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x " +"XPMEXT ext1 data1", +"XPMEXT ext2" +"data2_1", +"data2_2", +"XPMENDEXT" +}; diff --git a/lib/libXpm/test/pixmaps/good/xorg-bw.xpm b/lib/libXpm/test/pixmaps/good/xorg-bw.xpm new file mode 100644 index 000000000..1353918c0 --- /dev/null +++ b/lib/libXpm/test/pixmaps/good/xorg-bw.xpm @@ -0,0 +1,264 @@ +/* XPM */ +static char * xorg_new_site_background_26mar_200_bw_xpm[] = { +"114 200 61 1", +" c None", +". c #000000", +"+ c #FFFFFF", +"@ c #FDFDFD", +"# c #4E4E4E", +"$ c #F5F5F5", +"% c #2F2F2F", +"& c #FEFEFE", +"* c #F7F7F7", +"= c #F9F9F9", +"- c #F6F6F6", +"; c #8E8E8E", +"> c #FBFBFB", +", c #AFAFAF", +"' c #FCFCFC", +") c #FAFAFA", +"! c #F2F2F2", +"~ c #F4F4F4", +"{ c #F3F3F3", +"] c #6E6E6E", +"^ c #F0F0F0", +"/ c #F8F8F8", +"( c #F1F1F1", +"_ c #CFCFCF", +": c #101010", +"< c #F9FAFA", +"[ c #6E7073", +"} c #FEFEFF", +"| c #F3F7FB", +"1 c #F6F8FA", +"2 c #F0F2F3", +"3 c #FDFEFE", +"4 c #F3F5F7", +"5 c #F9FBFD", +"6 c #F6F9FC", +"7 c #F9FAFB", +"8 c #CFD3D9", +"9 c #F2F2F3", +"0 c #FAFBFC", +"a c #AFB0B2", +"b c #F5F8FB", +"c c #F7F9FB", +"d c #8E9195", +"e c #F4F6F8", +"f c #FDFDFE", +"g c #F5F6F7", +"h c #F8FAFD", +"i c #F2F4F6", +"j c #F1F0F0", +"k c #FBFCFD", +"l c #FCFDFE", +"m c #F0F1F2", +"n c #6E7071", +"o c #F3F4F6", +"p c #F0F4F9", +"q c #F3F4F7", +"r c #FCFCFD", +"s c #F1F2F4", +"t c #AFB1B6", +"u c #CFD1D3", +"v c #F5F7F9", +".........................++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++...........", +"..........................++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++............", +"..........................@++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#............", +"...........................++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.............", +"............................++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..............", +"............................$++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++...............", +".............................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%...............", +"..............................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&................", +"...............................++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.................", +"...............................*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..................", +"................................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++...................", +".................................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@...................", +"..................................++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++....................", +"..................................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.....................", +"...................................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++......................", +"....................................+++++++++++++++++++++++++++++++++++++++++++++++++++++++=......................", +"....................................-++++++++++++++++++++++++++++++++++++++++++++++++++++++.......................", +".....................................+++++++++++++++++++++++++++++++++++++++++++++++++++++........................", +"......................................+++++++++++++++++++++++++++++++++++++++++++++++++++.........................", +".......................................+++++++++++++++++++++++++++++++++++++++++++++++++..........................", +".......................................&++++++++++++++++++++++++++++++++++++++++++++++++..........................", +"........................................+++++++++++++++++++++++++++++++++++++++++++++++...........................", +".........................................+++++++++++++++++++++++++++++++++++++++++++++............................", +".........................................;+++++++++++++++++++++++++++++++++++++++++++.............................", +"..........................................++++++++++++++++++++++++++++++++++++++++++>.............................", +"...........................................+++++++++++++++++++++++++++++++++++++++++..............................", +"............................................+++++++++++++++++++++++++++++++++++++++...............................", +"............................................,+++++++++++++++++++++++++++++++++++++................................", +".............................................++++++++++++++++++++++++++++++++++++'................................", +"..............................................+++++++++++++++++++++++++++++++++++.................................", +"..............................................%+++++++++++++++++++++++++++++++++.................................+", +"...............................................@+++++++++++++++++++++++++++++++.................................++", +"................................................++++++++++++++++++++++++++++++)................................+++", +".................................................+++++++++++++++++++++++++++++................................*+++", +".................................................!+++++++++++++++++++++++++++.................................++++", +"..................................................++++++++++++++++++++++++++.................................+++++", +"...................................................++++++++++++++++++++++++~................................++++++", +"....................................................+++++++++++++++++++++++................................'++++++", +"....................................................{+++++++++++++++++++++................................]+++++++", +".....................................................++++++++++++++++++++.................................++++++++", +"......................................................++++++++++++++++++.................................+++++++++", +"......................................................^+++++++++++++++++................................&+++++++++", +".......................................................&+++++++++++++++................................;++++++++++", +"........................................................++++++++++++++.................................+++++++++++", +".........................................................++++++++++++.................................++++++++++++", +".........................................................=++++++++++=................................&++++++++++++", +"..........................................................++++++++++................................^+++++++++++++", +"...........................................................++++++++.................................++++++++++++++", +"............................................................++++++.................................+++++++++++++++", +"............................................................-++++=................................++++++++++++++++", +"............................................................/+++&................................(++++++++++++++++", +"...........................................................$++++.................................+++++++++++++++++", +"...........................................................++++.................................++++++++++++++++++", +"..........................................................++++^................................+++++++++++++++++++", +".........................................................++++&................................@+++++++++++++++++++", +"........................................................*++++................................~++++++++++++++++++++", +"........................................................++++.................................+++++++++++++++++++++", +".......................................................++++,................................++++++++++++++++++++++", +"......................................................++++)................................+++++++++++++++++++++++", +".....................................................+++++................................-+++++++++++++++++++++++", +".....................................................++++.................................++++++++++++++++++++++++", +"....................................................++++.................................+++++++++++++++++++++++++", +"...................................................+++++................................++++++++++++++++++++++++++", +"..................................................+++++................................-++++++++++++++++++++++++++", +".................................................~++++.................................+++++++++++++++++++++++++++", +".................................................++++.................................++++++++++++++++++++++++++++", +"................................................++++$................................+++++++++++++++++++++++++++++", +"...............................................+++++................................*+++++++++++++++++++++++++++++", +"..............................................>++++.................................++++++++++++++++++++++++++++++", +"..............................................++++.................................+++++++++++++++++++++++++++++++", +".............................................++++~................................++++++++++++++++++++++++++++++++", +"............................................++++'................................+++++++++++++++++++++++++++++++++", +"...........................................&++++................................]+++++++++++++++++++++++++++++++++", +"...........................................++++.................................++++++++++++++++++++++++++++++++++", +"..........................................++++#................................+++++++++++++++++++++++++++++++++++", +".........................................++++>.................................+++++++++++++++++++++++++++++++++++", +"........................................&++++...................................++++++++++++++++++++++++++++++++++", +".......................................;++++.....................................+++++++++++++++++++++++++++++++++", +".......................................++++......................................'++++++++++++++++++++++++++++++++", +"......................................++++*.......................................++++++++++++++++++++++++++++++++", +".....................................+++++.........................................+++++++++++++++++++++++++++++++", +"....................................>++++...........................................++++++++++++++++++++++++++++++", +"....................................++++............................................)+++++++++++++++++++++++++++++", +"...................................++++@.............................................+++++++++++++++++++++++++++++", +"..................................+++++...............................................++++++++++++++++++++++++++++", +".................................&++++................................................^+++++++++++++++++++++++++++", +"................................;++++..................................................+++++++++++++++++++++++++++", +"................................++++(...................................................++++++++++++++++++++++++++", +"...............................++++).....................................................+++++++++++++++++++++++++", +"..............................+++++......................................................'++++++++++++++++++++++++", +".............................^++++........................................................++++++++++++++++++++++++", +".............................++++_.........................................................+++++++++++++++++++++++", +"............................++++)...........................................................++++++++++++++++++++++", +"...........................+++++............................................................'+++++++++++++++++++++", +"..........................~++++..............................................................+++++++++++++++++++++", +"..........................++++................................................................++++++++++++++++++++", +".........................++++/................................................................^+++++++++++++++++++", +"........................+++++..................................................................+++++++++++++++++++", +".......................-++++....................................................................++++++++++++++++++", +".......................++++......................................................................+++++++++++++++++", +"......................++++{......................................................................(++++++++++++++++", +".....................+++++........................................................................++++++++++++++++", +"....................+++++..........................................................................+++++++++++++++", +"...................:++++...........................................................................;++++++++++++++", +"...................++++]............................................................................++++++++++++++", +"..................+++++..............................................................................+++++++++++++", +".................+++++................................................................................++++++++++++", +"................*++++.................................................................................-+++++++++++", +"................++++]..................................................................................+++++++++++", +"...............++++*....................................................................................++++++++++", +"..............+++++......................................................................................+++++++++", +".............=++++.......................................................................................*++++++++", +".............++++.........................................................................................++++++++", +"............++++*..........................................................................................+++++++", +"...........++++/...........................................................................................!++++++", +"..........>++++.............................................................................................++++++", +"..........+++++$.............................................................................................+++++", +".........+++++++;.............................................................................................++++", +"........+++++++++.............................................................................................=+++", +".......@++++++++++.............................................................................................+++", +"......!+++++++++++&.............................................................................................++", +"......+++++++++++++..............................................................................................+", +".....+++++++++++++++.............................................................................................)", +"....+++++++++++++++++.............................................................................................", +"...{+++++++++++++++++)............................................................................................", +"...+++++++++++++++++++............................................................................................", +"..+++++++++++++++++++++...........................................................................................", +".++++++++++++<++++++++++..........................................................................................", +"&++++++++++++[.+++++++++^.........................................................................................", +"+++++++++++++}.%+++++++++.........................................................................................", +"++++++++++++++|.1+++++++++........................................................................................", +"+++++++++++++++..++++++++++.......................................................................................", +"++++++++++++++++..+++++++++.......................................................................................", +"++++++++++++++++|.2+++++++++......................................................................................", +"+++++++++++++++++..}+++++++++.....................................................................................", +"+++++++++++++++++3..+++++++++>....................................................................................", +"++++++++++++++++++...+++++++++....................................................................................", +"+++++++++++++++++++..4+++++++++...................................................................................", +"+++++++++++++++++++5..+++++++++'..................................................................................", +"++++++++++++++++++++...+++++++++_.................................................................................", +"+++++++++++++++++++++...+++++++++.................................................................................", +"+++++++++++++++++++++6..7+++++++++................................................................................", +"++++++++++++++++++++++...+++++++++@...............................................................................", +"+++++++++++++++++++++++...++++++++++..............................................................................", +"+++++++++++++++++++++++8..9++++++++++.............................................................................", +"++++++++++++++++++++++++...0+++++++++.............................................................................", +"+++++++++++++++++++++++++...++++++++++............................................................................", +"+++++++++++++++++++++++++....++++++++++...........................................................................", +"++++++++++++++++++++++++++...a+++++++++=..........................................................................", +"++++++++++++++++++++++++++b...c+++++++++..........................................................................", +"+++++++++++++++++++++++++++....++++++++++.........................................................................", +"++++++++++++++++++++++++++++....++++++++++........................................................................", +"++++++++++++++++++++++++++++d...e+++++++++(.......................................................................", +"+++++++++++++++++++++++++++++....f+++++++++.......................................................................", +"++++++++++++++++++++++++++++++....++++++++++......................................................................", +"++++++++++++++++++++++++++++++.....++++++++++.....................................................................", +"+++++++++++++++++++++++++++++++....g+++++++++.....................................................................", +"+++++++++++++++++++++++++++++++h....++++++++++....................................................................", +"++++++++++++++++++++++++++++++++.....++++++++++...................................................................", +"+++++++++++++++++++++++++++++++++.....+++++++++!..................................................................", +"+++++++++++++++++++++++++++++++++6....i+++++++++..................................................................", +"++++++++++++++++++++++++++++++++++.....++++++++++.................................................................", +"++++++++++++++++++++++++++++++++++3.....++++++++++................................................................", +"+++++++++++++++++++++++++++++++++++.....j+++++++++................................................................", +"++++++++++++++++++++++++++++++++++++.....k+++++++++...............................................................", +"++++++++++++++++++++++++++++++++++++l.....++++++++++..............................................................", +"+++++++++++++++++++++++++++++++++++++......+++++++++~.............................................................", +"++++++++++++++++++++++++++++++++++++++.....m+++++++++.............................................................", +"++++++++++++++++++++++++++++++++++++++8.....l+++++++++............................................................", +"+++++++++++++++++++++++++++++++++++++++......+++++++++)...........................................................", +"++++++++++++++++++++++++++++++++++++++++......+++++++++#..........................................................", +"++++++++++++++++++++++++++++++++++++++++......n+++++++++..........................................................", +"+++++++++++++++++++++++++++++++++++++++++......++++++++++.........................................................", +"++++++++++++++++++++++++++++++++++++++++++......+++++++++)........................................................", +"++++++++++++++++++++++++++++++++++++++++++.......+++++++++........................................................", +"+++++++++++++++++++++++++++++++++++++++++++......o+++++++++.......................................................", +"+++++++++++++++++++++++++++++++++++++++++++5......3+++++++++......................................................", +"++++++++++++++++++++++++++++++++++++++++++++.......+++++++++(.....................................................", +"+++++++++++++++++++++++++++++++++++++++++++++.......+++++++++.....................................................", +"+++++++++++++++++++++++++++++++++++++++++++++p......q+++++++++....................................................", +"++++++++++++++++++++++++++++++++++++++++++++++.......+++++++++*...................................................", +"++++++++++++++++++++++++++++++++++++++++++++++3.......+++++++++...................................................", +"+++++++++++++++++++++++++++++++++++++++++++++++........+++++++++..................................................", +"++++++++++++++++++++++++++++++++++++++++++++++++.......&+++++++++.................................................", +"++++++++++++++++++++++++++++++++++++++++++++++++5.......+++++++++.................................................", +"+++++++++++++++++++++++++++++++++++++++++++++++++........++++++++*................................................", +"++++++++++++++++++++++++++++++++++++++++++++++++++.......,++++++++................................................", +"++++++++++++++++++++++++++++++++++++++++++++++++++d.......r++++++++...............................................", +"+++++++++++++++++++++++++++++++++++++++++++++++++++........++++++++'..............................................", +"++++++++++++++++++++++++++++++++++++++++++++++++++++........++++++++..............................................", +"++++++++++++++++++++++++++++++++++++++++++++++++++++........s++++++++.............................................", +"+++++++++++++++++++++++++++++++++++++++++++++++++++++........+++++++++............................................", +"+++++++++++++++++++++++++++++++++++++++++++++++++++++t........+++++++++...........................................", +"++++++++++++++++++++++++++++++++++++++++++++++++++++++.........++++++++...........................................", +"++++++++++++++++++++++++++++++++++++++++++++++++++++++.........u++++++++..........................................", +"++++++++++++++++++++++++++++++++++++++++++++++++++++++..........+++++++++.........................................", +"++++++++++++++++++++++++++++++++++++++++++++++++++++++...........+++++++++........................................", +"+++++++++++++++++++++++++++++++++++++++++++++++++++++r............++++++++........................................", +"+++++++++++++++++++++++++++++++++++++++++++++++++++++.............v++++++++.......................................", +"++++++++++++++++++++++++++++++++++++++++++++++++++++...............}++++++++......................................"}; diff --git a/lib/libXpm/test/pixmaps/good/xorg.xpm b/lib/libXpm/test/pixmaps/good/xorg.xpm new file mode 100644 index 000000000..d83d5c6a9 --- /dev/null +++ b/lib/libXpm/test/pixmaps/good/xorg.xpm @@ -0,0 +1,701 @@ +/* XPM */ +static char * xorg_new_site_background_26mar_200_xpm[] = { +"114 200 498 2", +" c None", +". c #000000", +"+ c #0D0D0D", +"@ c #B9B9B9", +"# c #FAFAFA", +"$ c #9D9D9D", +"% c #030303", +"& c #222222", +"* c #E1E1E1", +"= c #D3D3D3", +"- c #0E0E0E", +"; c #454545", +"> c #F7F7F7", +", c #F9F9F9", +"' c #E5E5E5", +") c #2F2F2F", +"! c #969696", +"~ c #686868", +"{ c #0F0F0F", +"] c #C4C4C4", +"^ c #999999", +"/ c #040404", +"( c #373737", +"_ c #EEEEEE", +": c #F8F8F8", +"< c #C0C0C0", +"[ c #0B0B0B", +"} c #646464", +"| c #E4E4E4", +"1 c #202020", +"2 c #010101", +"3 c #9E9E9E", +"4 c #F6F6F6", +"5 c #565656", +"6 c #151515", +"7 c #D7D7D7", +"8 c #8A8A8A", +"9 c #BDBDBD", +"0 c #868686", +"a c #DEDEDE", +"b c #262626", +"c c #BBBBBB", +"d c #F4F4F4", +"e c #414141", +"f c #272727", +"g c #DCDCDC", +"h c #F5F5F5", +"i c #7C7C7C", +"j c #4D4D4D", +"k c #A5A5A5", +"l c #CDCDCD", +"m c #131313", +"n c #C5C5C5", +"o c #3A3A3A", +"p c #3D3D3D", +"q c #EAEAEA", +"r c #F3F3F3", +"s c #636363", +"t c #6C6C6C", +"u c #A0A0A0", +"v c #A7A7A7", +"w c #F2F2F2", +"x c #C8C8C8", +"y c #111111", +"z c #282828", +"A c #F0F0F0", +"B c #F1F1F1", +"C c #5F5F5F", +"D c #818181", +"E c #8E8E8E", +"F c #020202", +"G c #B1B1B1", +"H c #C3C3C3", +"I c #080808", +"J c #DFDFDF", +"K c #D9D9D9", +"L c #575757", +"M c #EFEFEF", +"N c #EBEBEB", +"O c #4C4C4C", +"P c #7F7F7F", +"Q c #101010", +"R c #C7C7C7", +"S c #AFAFAF", +"T c #070707", +"U c #D5D5D5", +"V c #181818", +"W c #6E6E6E", +"X c #EDEDED", +"Y c #484848", +"Z c #5C5C5C", +"` c #717171", +" . c #303030", +".. c #191919", +"+. c #ECECEC", +"@. c #585858", +"#. c #CFCFCF", +"$. c #1E1E1E", +"%. c #848484", +"&. c #E6E6E6", +"*. c #353535", +"=. c #666666", +"-. c #090909", +";. c #B0B0B0", +">. c #404040", +",. c #E3E3E3", +"'. c #2D2D2D", +"). c #959595", +"!. c #5E5E5E", +"~. c #E9E9E9", +"{. c #E8E8E8", +"]. c #555555", +"^. c #474747", +"/. c #DDDDDD", +"(. c #8F8F8F", +"_. c #242424", +":. c #747474", +"<. c #E7E7E7", +"[. c #B7B7B7", +"}. c #0C0C0C", +"|. c #050505", +"1. c #A6A6A6", +"2. c #CCCCCC", +"3. c #1F1F1F", +"4. c #D8D8D8", +"5. c #515151", +"6. c #5A5A5A", +"7. c #7E7E7E", +"8. c #898989", +"9. c #B3B3B3", +"0. c #B5B5B5", +"a. c #C9C9C9", +"b. c #1D1D1D", +"c. c #8C8C8C", +"d. c #3F3F3F", +"e. c #E2E2E2", +"f. c #6F6F6F", +"g. c #393939", +"h. c #D6D6D6", +"i. c #A4A4A4", +"j. c #121212", +"k. c #161616", +"l. c #C2C2C2", +"m. c #383838", +"n. c #3B3B3B", +"o. c #545454", +"p. c #DADADA", +"q. c #E0E0E0", +"r. c #626262", +"s. c #3C3C3C", +"t. c #D4D4D4", +"u. c #363636", +"v. c #8D8D8D", +"w. c #1C1C1C", +"x. c #BEBEBE", +"y. c #171717", +"z. c #D1D1D1", +"A. c #2B2B2B", +"B. c #737373", +"C. c #696969", +"D. c #505050", +"E. c #838383", +"F. c #2C2C2C", +"G. c #1A1A1A", +"H. c #ACACAC", +"I. c #A8A8A8", +"J. c #A9A9A9", +"K. c #767676", +"L. c #DBDBDB", +"M. c #4B4B4B", +"N. c #D2D2D2", +"O. c #C1C1C1", +"P. c #B8B8B8", +"Q. c #0A0A0A", +"R. c #929292", +"S. c #858585", +"T. c #313131", +"U. c #D0D0D0", +"V. c #CECECE", +"W. c #919191", +"X. c #B6B6B6", +"Y. c #333333", +"Z. c #656565", +"`. c #616161", +" + c #444444", +".+ c #343434", +"++ c #8B8B8B", +"@+ c #A3A3A3", +"#+ c #CACACA", +"$+ c #232323", +"%+ c #7A7A7A", +"&+ c #525252", +"*+ c #7B7B7B", +"=+ c #9F9F9F", +"-+ c #212121", +";+ c #3E3E3E", +">+ c #4A4A4A", +",+ c #BFBFBF", +"'+ c #ADADAD", +")+ c #CBCBCB", +"!+ c #C6C6C6", +"~+ c #909090", +"{+ c #757575", +"]+ c #5D5D5D", +"^+ c #A2A2A2", +"/+ c #7D7D7D", +"(+ c #BCBCBC", +"_+ c #252525", +":+ c #464646", +"<+ c #292929", +"[+ c #888888", +"}+ c #1B1B1B", +"|+ c #B2B2B2", +"1+ c #777777", +"2+ c #A1A1A1", +"3+ c #ABABAB", +"4+ c #323232", +"5+ c #606060", +"6+ c #AAAAAA", +"7+ c #9B9B9B", +"8+ c #B4B4B4", +"9+ c #6B6B6B", +"0+ c #5B5B5B", +"a+ c #424242", +"b+ c #808080", +"c+ c #BABABA", +"d+ c #939393", +"e+ c #707070", +"f+ c #494949", +"g+ c #060606", +"h+ c #797979", +"i+ c #AEAEAE", +"j+ c #141414", +"k+ c #535353", +"l+ c #4F4F4F", +"m+ c #2A2A2A", +"n+ c #828282", +"o+ c #949494", +"p+ c #989898", +"q+ c #727272", +"r+ c #858586", +"s+ c #9C9C9C", +"t+ c #8F9499", +"u+ c #7E7C79", +"v+ c #A4A5A5", +"w+ c #807F7F", +"x+ c #818283", +"y+ c #9A9FA3", +"z+ c #827D78", +"A+ c #8D8F91", +"B+ c #8B9198", +"C+ c #897765", +"D+ c #827A72", +"E+ c #999DA1", +"F+ c #A8815A", +"G+ c #828485", +"H+ c #7A848F", +"I+ c #BD8852", +"J+ c #959696", +"K+ c #9FA0A0", +"L+ c #98836D", +"M+ c #9B7F62", +"N+ c #868F99", +"O+ c #DB954B", +"P+ c #807871", +"Q+ c #7A8087", +"R+ c #E09648", +"S+ c #858688", +"T+ c #999C9E", +"U+ c #A58869", +"V+ c #B68753", +"W+ c #85909B", +"X+ c #E1994D", +"Y+ c #8F7C69", +"Z+ c #7C7F83", +"`+ c #F19F46", +" @ c #807E7D", +".@ c #94989B", +"+@ c #B28C62", +"@@ c #DF974A", +"#@ c #868788", +"$@ c #7B8692", +"%@ c #F6A145", +"&@ c #AB835A", +"*@ c #9A9A9A", +"=@ c #2E2E2E", +"-@ c #86807A", +";@ c #F7A245", +">@ c #8B7D6D", +",@ c #8D9298", +"'@ c #D19655", +")@ c #E79B49", +"!@ c #788089", +"~@ c #C59054", +"{@ c #8C8D8F", +"]@ c #979797", +"^@ c #AA8965", +"/@ c #F7A346", +"(@ c #A58662", +"_@ c #7D8791", +":@ c #E19C4F", +"<@ c #F5A246", +"[@ c #837E79", +"}@ c #84807C", +"|@ c #E59D4A", +"1@ c #828487", +"2@ c #8B8E92", +"3@ c #C39159", +"4@ c #F7A446", +"5@ c #C09059", +"6@ c #898C8E", +"7@ c #7B838D", +"8@ c #F2A248", +"9@ c #9C8368", +"0@ c #968571", +"a@ c #EFA248", +"b@ c #827E79", +"c@ c #858A91", +"d@ c #D39854", +"e@ c #F7A547", +"f@ c #E39D4D", +"g@ c #7B8084", +"h@ c #F4A448", +"i@ c #B98E5C", +"j@ c #8A8B8C", +"k@ c #9B866F", +"l@ c #F7A647", +"m@ c #9D8568", +"n@ c #7C848D", +"o@ c #E39F4F", +"p@ c #F8A647", +"q@ c #837F79", +"r@ c #7C7F82", +"s@ c #DF9D4E", +"t@ c #818284", +"u@ c #8A8C8E", +"v@ c #BD9260", +"w@ c #F8A747", +"x@ c #BD915B", +"y@ c #73808E", +"z@ c #E7A14E", +"A@ c #F7A748", +"B@ c #93826F", +"C@ c #80807F", +"D@ c #F8A748", +"E@ c #F0A54B", +"F@ c #817F7C", +"G@ c #878A8E", +"H@ c #B18F67", +"I@ c #F8A848", +"J@ c #E19F4F", +"K@ c #808284", +"L@ c #747E8A", +"M@ c #F7A848", +"N@ c #B79060", +"O@ c #878787", +"P@ c #898A8A", +"Q@ c #8C8379", +"R@ c #F5A849", +"S@ c #96846F", +"T@ c #7D838B", +"U@ c #DD9E53", +"V@ c #F8A948", +"W@ c #EEA54B", +"X@ c #787D84", +"Y@ c #CF9957", +"Z@ c #828384", +"`@ c #868789", +" # c #A88D6B", +".# c #F8A949", +"+# c #F8AA49", +"@# c #A38A6C", +"## c #797F87", +"$# c #EDA54C", +"%# c #F7AA49", +"&# c #88827A", +"*# c #8A837A", +"=# c #E8A34F", +"-# c #7F8081", +";# c #7D8287", +"># c #C49760", +",# c #F9AB49", +"'# c #CA995C", +")# c #4E4E4E", +"!# c #747C87", +"~# c #F5A84B", +"{# c #A38C6E", +"]# c #948676", +"^# c #F6AA4A", +"/# c #84817D", +"(# c #767E87", +"_# c #D09C5B", +":# c #F9AC49", +"<# c #E3A353", +"[# c #7A7E82", +"}# c #F8AB49", +"|# c #F9AC4A", +"1# c #C49860", +"2# c #B09169", +"3# c #9B8A73", +"4# c #747B85", +"5# c #F1A94D", +"6# c #F9AD4A", +"7# c #F4AB4C", +"8# c #86827D", +"9# c #676767", +"0# c #7D7F81", +"a# c #E6A652", +"b# c #7E7F80", +"c# c #7C7E80", +"d# c #BD9664", +"e# c #C29962", +"f# c #7E7F7F", +"g# c #757B84", +"h# c #F3AB4C", +"i# c #F9AE4A", +"j# c #9A8A75", +"k# c #8A837B", +"l# c #F9AE4B", +"m# c #EFAA50", +"n# c #81807F", +"o# c #767A80", +"p# c #C69A61", +"q# c #E1A656", +"r# c #6D7886", +"s# c #F9AF4B", +"t# c #C29B64", +"u# c #7A7B7B", +"v# c #A58E70", +"w# c #FAAF4B", +"x# c #90877A", +"y# c #717881", +"z# c #DEA457", +"A# c #F2AD4F", +"B# c #7C7E81", +"C# c #FAB04B", +"D# c #D5A25D", +"E# c #7C7D7D", +"F# c #787878", +"G# c #757779", +"H# c #AF926C", +"I# c #B7976C", +"J# c #F2AC4F", +"K# c #FAB04C", +"L# c #FAB14C", +"M# c #91887B", +"N# c #8B847C", +"O# c #F1AE51", +"P# c #71767C", +"Q# c #D4A25D", +"R# c #D7A45E", +"S# c #7C7C7D", +"T# c #757A81", +"U# c #F9B04B", +"V# c #BC9B6C", +"W# c #9B8B76", +"X# c #FAB24C", +"Y# c #8E877D", +"Z# c #6C737B", +"`# c #D9A45B", +" $ c #EAAC56", +".$ c #7B7C7E", +"+$ c #595959", +"@$ c #7F7F80", +"#$ c #C9A065", +"$$ c #6F7379", +"%$ c #E3A858", +"&$ c #FAB34D", +"*$ c #A29177", +"=$ c #9A8C77", +"-$ c #F8B24E", +";$ c #87847F", +">$ c #FAB34C", +",$ c #EAAD57", +"'$ c #787A7D", +")$ c #948A7C", +"!$ c #FAB44D", +"~$ c #CCA267", +"{$ c #BE9D6F", +"]$ c #FBB44D", +"^$ c #A29179", +"/$ c #7B7B7C", +"($ c #E4AB5A", +"_$ c #F5B251", +":$ c #838280", +"<$ c #6D6D6D", +"[$ c #B79B74", +"}$ c #E4AD5C", +"|$ c #76787A", +"1$ c #A0927E", +"2$ c #EEAD52", +"3$ c #ECAC52", +"4$ c #ECAD52", +"5$ c #ECAD53", +"6$ c #ECAE53", +"7$ c #ECAF53", +"8$ c #EDAF53", +"9$ c #B89A70", +". . . . . . . . . . . . . . . . . . . . . . . + @ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # $ % . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . & * # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # = - . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . ; > , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ' ) . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . ! , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ~ . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . { ] , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ^ / . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . ( _ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : < [ . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . } : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : | 1 . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 4 5 . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 7 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 8 . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; _ 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 9 [ . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 a b . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + c 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 d e . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . f g h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h i . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . j h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h k . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . $ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d l m . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - n d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d _ o . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p q r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r s . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r u . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / v w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w x y . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 7 w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w g z . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . j A B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B C . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B E F . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . F G A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A H I . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . z J A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A K b . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M N O . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Q R _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ S T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ) a _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ U V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q Y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Z ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I k X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X ` . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .K ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..K +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . m n +.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @.q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.#.$.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . $ +.+.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . %.N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N &.*.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . =.N N N ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -.;.q q q q q q q q q q q q q q q q q q q q q q q q q q q q q t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . >.,.q q q ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . '.a q q q q q q q q q q q q q q q q q q q q q q q q q q q ).. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 R q q q q ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.9 - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / u ~.~.~.~.~.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 u ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.J .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D ~.~.~.~.~.~.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . V ] {.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.].. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ^.' {.{.{.{.{.{.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ( /.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.(.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _.7 {.{.{.{.{.{.{.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.[.}.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . |.1.<.<.<.<.<.<.<.<.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I k &.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . %.&.&.&.&.&.&.&.&.&.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.5.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L ' &.&.&.&.&.&.&.&.&.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.| ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 7.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . f U ' ' ' ' ' ' ' ' ' ' ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.' ' ' ' ' ' ' ' ' ' ' ' ' ' 9.|.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Q 0.' ' ' ' ' ' ' ' ' ' ' ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I S | | | | | | | | | | | | a.b.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c.| | | | | | | | | | | | ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . *.a ,.,.,.,.,.,.,.,.,.,.a d.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.e.,.,.,.,.,.,.,.,.,.,.,.,.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . s ,.,.,.,.,.,.,.,.,.,.f.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . g.h.,.,.,.,.,.,.,.,.,.,.,.,.,.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i.e.e.e.e.e.e.e.e.3 / . . . . . . . . . . . . . . . . . . . . . . . . . . . . . j.n e.e.e.e.e.e.e.e.e.e.e.e.e.e.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . k.l.e.e.e.e.e.e.n m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |.$ e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . m.K * * * * g n.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ~ * * * * * * * * * * * * * * * * ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o.p.q.q.q.J r.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . s.t.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . u.7 q.q.q.q.v.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . w.R q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Q x.J J J J x.y.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . / k J J J J J J J J J J J J J J J J J J ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % ! a a a a z.A.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.a a a a a a a a a a a a a a a a a a a ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C.a a a a /.O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D.g a a a a a a a a a a a a a a a a a a a ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o h././././.E.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . F.= /./././././././././././././././././././.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . G.< g g g g H.-.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . -.I.g g g g g g g g g g g g g g g g g g g g g ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % J.g g g g l f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 g g g g g g g g g g g g g g g g g g g g g g ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . K.L.L.L.L.7 ^.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . M.p.p.p.p.p.C.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .N.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b.O.p.p.p.p.i./ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 P.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Q.H.K K K K c V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . R.K K K K K K K K K K K K K K K K K K K K K K K K K ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . S.4.4.4.4.4.; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . r.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D.4.4.4.4.4.t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T.U.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . '.V.7 7 7 7 W.F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . y.@ 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + S h.h.h.h.X.- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -.u h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 h.h.h.h.V.Y.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . f.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Z.U U U U U `.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +V.U U U U U U U U U U U U U U U U U U U U U U U U U U U U U ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .+z.t.t.t.t.++F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . G.l.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b.9 t.t.t.t.k }.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Q.@+t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W.= = = = #+$+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . %+= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C.N.N.N.N.U.&+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . &+N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; U.z.z.z.z.*+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b O.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..x.z.z.z.z.H.y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [ v z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Q.=+U.U.U.U.< -+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 %+U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :.#.#.#.#.2.;+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . j #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . >+V.#.#.#.#.` . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . %.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . f ,+V.V.V.V.^ / . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . { H.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [ '+l l l l c 3.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . u.)+l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % D 2.2.2.2.!+n.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C 2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C 2.2.2.2.2.@.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 8 2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . u.x )+)+)+)+R.F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . k.@ )+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 S #+#+#+#+J.y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ;+!+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ~+#+#+#+#+x m.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . {+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ]+a.a.a.a.a.]+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . y ^+a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . s.R x x x x /+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b (+x x x x x x x x x x x x x x x x x x x x x x x x x x x ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _+@ R R R R i.-.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :+R R R R R R R R R R R R R R R R R R R R R R R R R R R ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / ).R R R R (+<+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [+R R R R R R R R R R R R R R R R R R R R R R R R R R ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ` !+!+!+!+l.Y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . m 1.!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . >.n n n n n W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . g.H n n n n n n n n n n n n n n n n n n n n n n n n ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . <+P.] ] ] ] W.-.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . Q @+] ] ] ] P.}+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |.v.] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . %+H H H H ,+:+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..|+H H H H H H H H H H H H H H H H H H H H H H ", +". . . . . . . . . . . . . . . . . . . . . . . . . . ].l.l.l.l.l.} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; < l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.", +". . . . . . . . . . . . . . . . . . . . . . . . . _.@ O.O.O.O.++F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1+O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.", +". . . . . . . . . . . . . . . . . . . . . . . . y 2+< < < < 3+... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Q u < < < < < < < < < < < < < < < < < < < < ", +". . . . . . . . . . . . . . . . . . . . . . . I 0 < < < < c 4+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . <+0.< < < < < < < < < < < < < < < < < < < ", +". . . . . . . . . . . . . . . . . . . . . . . 5+,+,+,+,+,+5+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . >+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+", +". . . . . . . . . . . . . . . . . . . . . . Y.[.x.x.x.x.S.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 [+x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.", +". . . . . . . . . . . . . . . . . . . . . 6 6+9 9 9 9 7++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . j.^+9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +". . . . . . . . . . . . . . . . . . . . I [+9 9 9 9 8+'.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9.9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ", +". . . . . . . . . . . . . . . . . . . . 9+(+(+(+(+(+>+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+", +". . . . . . . . . . . . . . . . . . . a+c c c c c b+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I E c c c c c c c c c c c c c c c ", +". . . . . . . . . . . . . . . . . . 1 6+c+c+c+c+! }.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..'+c+c+c+c+c+c+c+c+c+c+c+c+c+c+", +". . . . . . . . . . . . . . . . . |.d+@ @ @ @ 3+-+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . >+@ @ @ @ @ @ @ @ @ @ @ @ @ @ ", +". . . . . . . . . . . . . . . . . ~ @ @ @ @ @ Y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e+@ @ @ @ @ @ @ @ @ @ @ @ @ ", +". . . . . . . . . . . . . . . . f+P.P.P.P.P.t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T d+P.P.P.P.P.P.P.P.P.P.P.P.", +". . . . . . . . . . . . . . . ) G [.[.[.[.~+g+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . f G [.[.[.[.[.[.[.[.[.[.[.", +". . . . . . . . . . . . . . [ ).X.X.X.X.I.3.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.X.X.X.X.X.X.X.X.X.X.X.", +". . . . . . . . . . . . . 2 h+X.X.X.X.;.s.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / %.X.X.X.X.X.X.X.X.X.X.", +". . . . . . . . . . . . . j 0.0.0.0.0.!.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 u 0.0.0.0.0.0.0.0.0.", +". . . . . . . . . . . . .+;.8+8+8+8+7.g+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ) i+8+8+8+8+8+8+8+8+", +". . . . . . . . . . . ..=+9.9.9.9.i.j+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C 9.9.9.9.9.9.9.9.", +". . . . . . . . . . / 7.|+|+|+|+H.m.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Q.[+|+|+|+|+|+|+|+", +". . . . . . . . . . C G G G G H.k+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . w.I.G G G G G G ", +". . . . . . . . . ) i+G G G G c.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . l+G G G G G G ", +". . . . . . . . }+=+;.;.;.;.;.J.a+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . f.;.;.;.;.;.", +". . . . . . . - 8.S S S S S S S @+$+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . }.v.S S S S ", +". . . . . . . ~ i+i+i+i+i+i+i+i+i+E g+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . m+6+i+i+i+", +". . . . . . d.H.'+'+'+'+'+'+'+'+'+'+@.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . k+'+'+'+", +". . . . . m+i.'+'+'+'+'+'+'+'+'+'+'+H..+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % n+'+'+", +". . . . { o+H.H.H.H.H.H.H.H.H.H.H.H.H.o+j.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..p+H.", +". . . % q+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+*+2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .+I.", +". . . M.6+6+6+6+6+6+6+6+6+6+6+6+6+6+6+6+6+D.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . `.", +". . F.2+J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.1.$+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Q.", +". y d+J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.v.-.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"/ *+I.I.I.I.I.I.I.I.I.I.I.v I.I.I.I.I.I.I.I.I.} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"k+v v v v v v v v v v v v r+s+v v v v v v v v v u.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"k 1.1.1.1.1.1.1.1.1.1.1.1.t+u+i.1.1.1.1.1.1.1.1.s+G.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"k k k k k k k k k k k k k v+w+x+k k k k k k k k k S.% . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"i.i.i.i.i.i.i.i.i.i.i.i.i.i.y+z+A+i.i.i.i.i.i.i.i.i.].. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.B+C+$ i.i.i.i.i.i.i.i.i.A.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+w+D+@+@+@+@+@+@+@+@+@+(.}.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+E+F+G+^+^+^+^+^+^+^+^+^+` . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+H+I+J+2+2+2+2+2+2+2+2+2+f+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"u u u u u u u u u u u u u u u u u K+L+M+7+u u u u u u u u $ }+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"u u u u u u u u u u u u u u u u u u N+O+P+u u u u u u u u u n+g+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+Q+R+S+=+=+=+=+=+=+=+=+=+5+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 T+U+V+W.3 3 3 3 3 3 3 3 s+*.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ W+X+Y+s+$ $ $ $ $ $ $ $ d+j+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+Z+`+ @s+s+s+s+s+s+s+s+s+*+F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+.@+@@@#@7+7+7+7+7+7+7+7+7+l+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+$@%@&@d+7+7+7+7+7+7+7+7+*@=@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@-@;@>@p+*@*@*@*@*@*@*@*@*@r.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ,@'@)@b+^ ^ ^ ^ ^ ^ ^ ^ ^ ^ s.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+!@;@~@{@p+p+p+p+p+p+p+p+p+++y.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@]@! ^@/@(@o+]@]@]@]@]@]@]@]@]@q+F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! _@:@<@[@! ! ! ! ! ! ! ! ! ! Y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! }@/@|@1@! ! ! ! ! ! ! ! ! R.b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +").).).).).).).).).).).).).).).).).).).).).).).).).).2@3@4@5@6@).).).).).).).).).P j.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+7@8@4@9@d+o+o+o+o+o+o+o+o+o+5+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+0@4@a@b@d+d+d+d+d+d+d+d+d+d+m.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.c@d@e@f@G+R.R.R.R.R.R.R.R.R.8 3.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.g@h@e@i@j@R.R.R.R.R.R.R.R.R.K./ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.k@e@l@m@(.W.W.W.W.W.W.W.W.W.j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+~+n@o@p@h@q@~+~+~+~+~+~+~+~+~+~+A.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.r@p@p@s@t@(.(.(.(.(.(.(.(.(.1+[ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E u@v@p@w@x@8 E E E E E E E E E `.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.y@z@w@A@B@c.v.v.v.v.v.v.v.v.v.d.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.C@D@D@E@F@v.v.v.v.v.v.v.v.v.0 }+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.G@H@D@I@J@K@c.c.c.c.c.c.c.c.c.f.I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++L@M@I@I@N@O@++++++++++++++++++l+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 P@Q@I@I@R@S@8 8 8 8 8 8 8 8 8 8 4+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.T@U@V@V@W@w+8.8.8.8.8.8.8.8.8.h+{ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.X@V@V@V@Y@Z@8.8.8.8.8.8.8.8.8.r.F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+`@ #V@.#+#@#O@[+[+[+[+[+[+[+[+[+o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@##$#+#+#%#&#O@O@O@O@O@O@O@O@O@D w.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 *#+#+#+#=#-#0 0 0 0 0 0 0 0 0 q++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.;#>#+#+#,#'#Z@S.S.S.S.S.S.S.S.S.)#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.!#~#,#,#,#{#%.%.%.%.%.%.%.%.%.D ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.]#,#,#,#^#/#%.%.%.%.%.%.%.%.%.%+- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.(#_#,#,#:#<#r@E.E.E.E.E.E.E.E.E.@.F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+[#}#:#|#|#1#D n+n+n+n+n+n+n+n+n+>.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D 2#|#|#|#|#3#D D D D D D D D D 7.-+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+b+4#5#|#|#6#7#8#b+b+b+b+b+b+b+b+b+9#-.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P 0#|#6#6#6#a#b#P P P P P P P P P 5.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P c#d#6#6#6#6#e#f#P P P P P P P P P T.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.g#h#6#6#i#i#j#7.7.7.7.7.7.7.7.7.1+j+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+k#6#6#i#l#m#n#/+/+/+/+/+/+/+/+/+!./ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i o#p#i#i#l#l#q#c#i i i i i i i i i ;+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+r#i#l#l#s#s#t#i *+*+*+*+*+*+*+*+1+$.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+u#v#l#l#s#s#w#x#*+*+*+*+*+*+*+*+*+~ Q.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+y#z#s#s#s#w#A#n#%+%+%+%+%+%+%+%+%+o.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+B#s#s#w#w#C#D#E#h+h+h+h+h+h+h+h+h+F.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#G#H#w#w#C#C#C#I#%+F#F#F#F#F#F#F#F#C.k.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+y#J#C#C#C#K#L#M#1+1+1+1+1+1+1+1+B.O T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+N#C#C#C#K#L#O#P 1+1+1+1+1+1+1+1+r.'.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.P#Q#C#K#L#L#L#R#S#K.K.K.K.K.K.K.K.f+G.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+T#U#K#L#L#L#L#V#1+{+{+{+{+{+{+{+:.F.g+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +":.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.W#L#L#L#L#X#X#Y#:.:.:.:.:.:.:.:.~ y.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.Z#`#L#L#X#X#X# $.$B.B.B.B.B.B.B.B.+$Q.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.@$L#L#X#X#X#X##$1+B.B.B.B.B.B.B.B.;+|.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+$$%$X#X#X#X#X#&$*$B.q+q+q+q+q+q+q+q+b.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` =$X#X#X#X#&$&$-$;$` ` ` ` ` ` ` ` =.-.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+@$X#X#X#>$&$&$&$,$'$e+e+e+e+e+e+e+e++$F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+e+)$X#X#X#&$&$&$&$!$~$1+e+e+e+e+e+e+e+e+n.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.` {$X#X#>$&$&$&$!$]$]$^$` f.f.f.f.f.f.f.f.}+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W /$($X#X#&$&$&$&$!$]$]$_$:$W W W W W W W W Z.}.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<${+[$X#X#&$&$&$&$!$]$]$]$]$}$|$<$<$<$<$<$<$<$<$l+/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +"t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t {+1$2$3$4$5$5$5$5$6$6$6$6$7$8$9$` t t t t t t t t >.F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "}; diff --git a/lib/libXpm/test/pixmaps/invalid/doom.xpm b/lib/libXpm/test/pixmaps/invalid/doom.xpm new file mode 100644 index 000000000..a3f7847eb --- /dev/null +++ b/lib/libXpm/test/pixmaps/invalid/doom.xpm @@ -0,0 +1,8 @@ +#define doom_format 1 +#define doom_width 1 +#define doom_height 1 +#define doom_ncolors 1 +#define doom_chars_per_pixel 1 +static char* doom_colors[] = { +"A", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +} ; diff --git a/lib/libXpm/test/pixmaps/invalid/doom2.xpm b/lib/libXpm/test/pixmaps/invalid/doom2.xpm new file mode 100644 index 000000000..55ab0f316 --- /dev/null +++ b/lib/libXpm/test/pixmaps/invalid/doom2.xpm @@ -0,0 +1,11 @@ +#define doom_format 1 +#define doom_width 1 +#define doom_height 1 +#define doom_ncolors 1 +#define doom_chars_per_pixel 10000 +static char* doom_colors[] = { + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "#FFFFFF" +}; +static char* doom_pixels[] = { + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +}; diff --git a/lib/libXpm/test/pixmaps/invalid/invalid-type.xpm b/lib/libXpm/test/pixmaps/invalid/invalid-type.xpm new file mode 100644 index 000000000..9237928ba --- /dev/null +++ b/lib/libXpm/test/pixmaps/invalid/invalid-type.xpm @@ -0,0 +1,34 @@ +/* XPM2 invalid type name */ +static char * plaid[] = { +/* plaid pixmap + * width height ncolors chars_per_pixel */ +"22 22 4 2 0 0", +/* colors */ +" c red m white s light_color ", +"Y c green m black s lines_in_mix ", +"+ c yellow m white s lines_in_dark ", +"x m black s dark_color ", +/* pixels */ +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +"Y Y Y Y Y x Y Y Y Y Y + x + x + x + x + x + ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +"x x x x x x x x x x x x x x x x x x x x x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x " +}; diff --git a/lib/libXpm/test/pixmaps/invalid/no-contents.xpm b/lib/libXpm/test/pixmaps/invalid/no-contents.xpm new file mode 100644 index 000000000..449df308c --- /dev/null +++ b/lib/libXpm/test/pixmaps/invalid/no-contents.xpm @@ -0,0 +1,2 @@ +/* XPM */ +/* Body intentionally left blank */ diff --git a/lib/libXpm/test/pixmaps/invalid/unending-comment-c.xpm b/lib/libXpm/test/pixmaps/invalid/unending-comment-c.xpm new file mode 100644 index 000000000..c6056c66b --- /dev/null +++ b/lib/libXpm/test/pixmaps/invalid/unending-comment-c.xpm @@ -0,0 +1,30 @@ +/* XPM */ +static char * sample_xpm[] = { +"15 19 6 1", +" c None", +". c #FFFFFF", +"+ c #000000", +"@ c #99FFCC", +"# c #66CCCC", +"$ c #339966", +/* This is the comment that never ends, it just goes on and on again... + Based on test case provided by Marco Ivaldi for CVE-2022-46285 +".+++++++++++++.", +"+@@@@@@@@@@@@#+", +"+@###########$+", +"+@###....####$+", +"+@##......###$+", +"+@#...$$...##$+", +"+@#..$$##..$#$+", +"+@##$$##...$#$+", +"+@#####...$$#$+", +"+@####...$$##$+", +"+@####..$$###$+", +"+@####..$####$+", +"+@#####$$####$+", +"+@####..#####$+", +"+@####..$####$+", +"+@#####$$####$+", +"+@###########$+", +"+#$$$$$$$$$$$$+", +".+++++++++++++."}; diff --git a/lib/libXpm/test/pixmaps/invalid/zero-width-v1.xpm b/lib/libXpm/test/pixmaps/invalid/zero-width-v1.xpm new file mode 100644 index 000000000..9b403ca73 --- /dev/null +++ b/lib/libXpm/test/pixmaps/invalid/zero-width-v1.xpm @@ -0,0 +1,37 @@ +#define PLAID_format 1 +#define PLAID_width 0 +#define PLAID_height 4294967293 +#define PLAID_ncolors 4 +#define PLAID_chars_per_pixel 2 + +static char *PLAID_colors[] = { +" ", "red", +"Y ", "green", +"+ ", "yellow", +"x ", "black" +}; + +static char *PLAID_pixels[] = { +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +"Y Y Y Y Y x Y Y Y Y Y + x + x + x + x + x + ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +"x x x x x x x x x x x x x x x x x x x x x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x " +}; diff --git a/lib/libXpm/test/pixmaps/invalid/zero-width.xpm b/lib/libXpm/test/pixmaps/invalid/zero-width.xpm new file mode 100644 index 000000000..78f367b5e --- /dev/null +++ b/lib/libXpm/test/pixmaps/invalid/zero-width.xpm @@ -0,0 +1,35 @@ +/* XPM */ +static char * plaid[] = { +/* plaid pixmap + * width height ncolors chars_per_pixel */ +"0 4294967293 4 2 ", /*cxpm hang*/ +/*"41474 31474 4 2 ",*/ /*ego ctrl all memory*/ +/* colors */ +" c red m white s light_color ", +"Y c green m black s lines_in_mix ", +"+ c yellow m white s lines_in_dark ", +"x m black s dark_color ", +/* pixels */ +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +"Y Y Y Y Y x Y Y Y Y Y + x + x + x + x + x + ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +"x x x x x x x x x x x x x x x x x x x x x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x " +} ; diff --git a/lib/libXpm/test/pixmaps/no-mem/oversize.xpm b/lib/libXpm/test/pixmaps/no-mem/oversize.xpm new file mode 100644 index 000000000..e19f9f3ba --- /dev/null +++ b/lib/libXpm/test/pixmaps/no-mem/oversize.xpm @@ -0,0 +1,39 @@ +/* XPM */ +static char * plaid[] = { +/* plaid pixmap + * width height ncolors chars_per_pixel */ +"4294967292 4294967292 4 2 0 0 XPMEXT", +/* colors */ +" c red m white s light_color ", +"Y c green m black s lines_in_mix ", +"+ c yellow m white s lines_in_dark ", +"x m black s dark_color ", +/* pixels */ +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +"Y Y Y Y Y x Y Y Y Y Y + x + x + x + x + x + ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x x x x x x x x x x x x x ", +"x x x x x x x x x x x x + x x x x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +"x x x x x x x x x x x x x x x x x x x x x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x ", +" x x x Y x x ", +" x x x x Y x x x " +"XPMEXT ext1 data1", +"XPMEXT ext2" +"data2_1", +"data2_2", +"XPMENDEXT" +}; diff --git a/lib/libXpm/test/rgb.c b/lib/libXpm/test/rgb.c new file mode 100644 index 000000000..a5ad58304 --- /dev/null +++ b/lib/libXpm/test/rgb.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include "../src/XpmI.h" +#include <glib.h> + +/* + * xpmReadRgbNames - reads a rgb text file + */ + +struct rgbData { + int r, g, b; + const char *name; +}; + +/* Changes here must match those in rgb.txt file */ +static const struct rgbData testdata[] = { + { 255, 255, 255, "white" }, + { 0, 0, 0, "black" }, + { 255, 0, 0, "red" }, + { 0, 255, 0, "green" }, + { 0, 0, 255, "blue" }, + { 0, 50, 98, "berkeleyblue" }, /* names get lowercased */ + { 253, 181, 21, "californiagold" } +}; +#define NUM_RGB (sizeof(testdata) / sizeof(testdata[0])) + +static void +test_xpmReadRgbNames(void) +{ + const gchar *filename; + xpmRgbName rgbn[MAX_RGBNAMES]; + int rgbn_max; + + /* Verify NULL is returned if file can't be read */ + rgbn_max = xpmReadRgbNames("non-existent-file.txt", rgbn); + g_assert_cmpint(rgbn_max, ==, 0); + + /* Verify our test file is read properly & contains expected data */ + filename = g_test_get_filename(G_TEST_DIST, "rgb.txt", NULL); + rgbn_max = xpmReadRgbNames(filename, rgbn); + g_assert_cmpint(rgbn_max, ==, NUM_RGB); + + for (unsigned int i = 0; i < NUM_RGB; i++) { + int r = testdata[i].r * 257; + int g = testdata[i].g * 257; + int b = testdata[i].b * 257; + char *name = xpmGetRgbName(rgbn, rgbn_max, r, g, b); + + g_assert_cmpstr(name, ==, testdata[i].name); + } + + g_assert_null(xpmGetRgbName(rgbn, rgbn_max, 11, 11, 11)); + + xpmFreeRgbNames(rgbn, rgbn_max); +} + + +int +main(int argc, char** argv) +{ + g_test_init(&argc, &argv, NULL); + g_test_bug_base(PACKAGE_BUGREPORT); + + g_test_add_func("/rgb/xpmReadRgbNames", + test_xpmReadRgbNames); + + return g_test_run(); +} diff --git a/lib/libXpm/test/rgb.txt b/lib/libXpm/test/rgb.txt new file mode 100644 index 000000000..0fbf580e6 --- /dev/null +++ b/lib/libXpm/test/rgb.txt @@ -0,0 +1,8 @@ +# Test data for rgb.c - changes here likely require changes to that code +255 255 255 white + 0 0 0 black +255 0 0 red + 0 255 0 green + 0 0 255 blue + 0 50 98 BerkeleyBlue +253 181 21 CaliforniaGold diff --git a/lib/libXpm/test/tap-test b/lib/libXpm/test/tap-test new file mode 100644 index 000000000..99a6d9705 --- /dev/null +++ b/lib/libXpm/test/tap-test @@ -0,0 +1,2 @@ +#! /bin/sh +"$1" -k --tap |