diff options
author | Matthieu Herrb <matthieu@herrb.eu> | 2015-12-24 17:25:15 +0100 |
---|---|---|
committer | Matthieu Herrb <matthieu@herrb.eu> | 2015-12-24 17:25:15 +0100 |
commit | cec06325ba15fc490a5df2d215fc80030534cf07 (patch) | |
tree | 5bf538bf45d040f3a614bc4dcadfc89411974302 |
Start of a new reduced version of xdm.
Removed support for non BSD systems and for XDMCP.
59 files changed, 20473 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c51052d --- /dev/null +++ b/.gitignore @@ -0,0 +1,79 @@ +# +# X.Org module default exclusion patterns +# The next section if for module specific patterns +# +# Do not edit the following section +# GNU Build System (Autotools) +aclocal.m4 +autom4te.cache/ +autoscan.log +ChangeLog +compile +config.guess +config.h +config.h.in +config.log +config-ml.in +config.py +config.status +config.status.lineno +config.sub +configure +configure.scan +depcomp +.deps/ +INSTALL +install-sh +.libs/ +libtool +libtool.m4 +ltmain.sh +lt~obsolete.m4 +ltoptions.m4 +ltsugar.m4 +ltversion.m4 +Makefile +Makefile.in +mdate-sh +missing +mkinstalldirs +*.pc +py-compile +stamp-h? +symlink-tree +texinfo.tex +ylwrap + +# Do not edit the following section +# Edit Compile Debug Document Distribute +*~ +*.[0-9] +*.[0-9]x +*.bak +*.bin +core +*.dll +*.exe +*-ISO*.bdf +*-JIS*.bdf +*-KOI8*.bdf +*.kld +*.ko +*.ko.cmd +*.lai +*.l[oa] +*.[oa] +*.obj +*.patch +*.so +*.pcf.gz +*.pdb +*.tar.bz2 +*.tar.gz +# +# Add & Override patterns for xdm +# +# Edit the following section as needed +# For example, !report.pc overrides *.pc. See 'man gitignore' +# +xdm.service @@ -0,0 +1,23 @@ +Original authors credited in source files: + + Keith Packard, MIT X Consortium + Jim Fulton, MIT X Consortium + Stephen Gildea, The Open Group + +Later enhancements: + + Alan Coopersmith, Sun Microsystems: + IPv6 support, Solaris authentication enhancements, + PAM conversation rewrite + + Amit Margalit, Caolan McNamara, Ivan Griffin, Matthieu Herrb: + 3D decoration & XPM pixmap display in login widget + + Dmitry Yu. Bolkhovityanov: + Xinerama support + + Matthieu Herrb & OpenBSD Team: + "allowRootLogin", OpenBSD authentication enhancements + + Werner Fink, SuSE: + PAM support @@ -0,0 +1,165 @@ +Copyright (c) 2002, 2006, 2009, 2010, Oracle and/or its affiliates. +All rights reserved. + +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. + + ------------------------------------------------------------ + +Copyright 1988, 1989, 1990, 1991, 1994, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + + ------------------------------------------------------------ + +Copyright 1988, 1990, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 +OPEN GROUP 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. + +Except as contained in this notice, the name of a copyright holder shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the copyright holder. + + ------------------------------------------------------------ + +Copyright 1998 by Thomas E. Dickey <dickey@clark.net> + + All Rights Reserved + +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 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 ABOVE LISTED COPYRIGHT HOLDER(S) 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. + +Except as contained in this notice, the name(s) of the above copyright +holders shall not be used in advertising or otherwise to promote the +sale, use or other dealings in this Software without prior written +authorization. + + ------------------------------------------------------------ + +md5 code in genauth.c implements something close to the MD5 message-digest +algorithm. This code is based on code written by Colin Plumb in 1993, +no copyright is claimed. +This code is in the public domain; do with it what you wish. + + ------------------------------------------------------------ + +Copyright Theodore Ts'o, 1994, 1995, 1996, 1997, 1998, 1999. All +rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, and the entire permission notice in its entirety, + including the disclaimer of warranties. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + + ------------------------------------------------------------ + +Copyright (c) 1995,1999 Theo de Raadt. All rights reserved. +Copyright (c) 2001-2002 Damien Miller. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..2f7be52 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,55 @@ +# +# Copyright 2005 Red Hat, Inc. +# +# 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, and that the name of Red Hat not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Red Hat makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +SUBDIRS = config greeter include man xdm + +ACLOCAL_AMFLAGS = -I m4 + +# This ensures distcheck is performed in a location where user has write access +DISTCHECK_CONFIGURE_FLAGS = \ + --with-appdefaultdir=\$${datadir}/X11/app-defaults + +if LINT +ALL_LINT_FLAGS=$(LINT_FLAGS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) + +lint: + $(LINT) $(ALL_LINT_FLAGS) $(xdm_CFLAGS) $(xdm_SOURCES) $(xdm_LIBS) + (cd xdm && $(MAKE) $(AM_MAKEFLAGS) lint) + (cd xdmshell && $(MAKE) $(AM_MAKEFLAGS) lint) + (cd greeter && $(MAKE) $(AM_MAKEFLAGS) lint) + (cd chooser && $(MAKE) $(AM_MAKEFLAGS) lint) +endif LINT + +CLEANFILES = xdm.service +EXTRA_DIST = xdm.service.in + +MAINTAINERCLEANFILES = ChangeLog INSTALL + +.PHONY: ChangeLog INSTALL + +INSTALL: + $(INSTALL_CMD) + +ChangeLog: + $(CHANGELOG_CMD) + +dist-hook: ChangeLog INSTALL diff --git a/Makefile.bsd-wrapper b/Makefile.bsd-wrapper new file mode 100644 index 0000000..9fd4c29 --- /dev/null +++ b/Makefile.bsd-wrapper @@ -0,0 +1,61 @@ +# $OpenBSD: Makefile.bsd-wrapper,v 1.22 2015/03/15 19:09:22 matthieu Exp $ +.include <bsd.own.mk> + +XDMCONFIGDIR=/etc/X11/xdm +PIXMAPDIR=$(XDMCONFIGDIR)/pixmaps + +.if ${MACHINE} == i386 || ${MACHINE} == amd64 || ${MACHINE} == macppc +DEFAULT_VT= --with-default-vt=vt05 +.endif +.if ${MACHINE_ARCH} == arm +DEFAULT_VT= --with-default-vt=vt02 +.endif + +CONFIGURE_ARGS= --enable-privsep \ + --enable-bsdauth \ + $(DEFAULT_VT) \ + --disable-ipv6 \ + --with-authdir=$(XDMCONFIGDIR) \ + --with-xdmlibdir=$(XDMCONFIGDIR) \ + --with-pixmapdir=$(PIXMAPDIR) \ + --with-bw-pixmap=OpenBSD_1bpp.xpm \ + --with-color-pixmap=OpenBSD_15bpp.xpm + +# avoid clobbering installed config files +realinstall: + exec ${MAKE} ${_lt_libs} install-strip \ + INSTALL_DATA=: \ + INSTALL_SCRIPT=: + +XDMCONFIGFILES= \ + xdm-config Xresources Xservers Xaccess +XDMCONFIGSCRIPTS= \ + Xsession GiveConsole TakeConsole Xsetup_0 Xstartup Xreset Xwilling + +afterinstall: + $(INSTALL_DATA) ${.CURDIR}/config/OpenBSD_1bpp.xpm $(DESTDIR)$(PIXMAPDIR) + $(INSTALL_DATA) ${.CURDIR}/config/OpenBSD_4bpp.xpm $(DESTDIR)$(PIXMAPDIR) + $(INSTALL_DATA) ${.CURDIR}/config/OpenBSD_8bpp.xpm $(DESTDIR)$(PIXMAPDIR) + $(INSTALL_DATA) ${.CURDIR}/config/OpenBSD_15bpp.xpm $(DESTDIR)$(PIXMAPDIR) + cd man ; $(INSTALL_DATA) xdm.1 $(DESTDIR)$(MANDIR)1/ + @cd config ; for f in $(XDMCONFIGFILES); do \ + if ! test -f $(DESTDIR)$(XDMCONFIGDIR)/$$f ; then \ + if test -f $$f; then d=; else d="$(.CURDIR)/config/"; fi; \ + echo "$(INSTALL_DATA) $$d$$f $(DESTDIR)$(XDMCONFIGDIR)"; \ + $(INSTALL_DATA) $$d$$f $(DESTDIR)$(XDMCONFIGDIR) ;\ + else \ + echo "not overwriting $(DESTDIR)$(XDMCONFIGDIR)/$$f" ;\ + fi \ + done + @cd config ; for f in $(XDMCONFIGSCRIPTS); do \ + if ! test -f $(DESTDIR)$(XDMCONFIGDIR)/$$f ; then \ + if test -f $$f; then d=; else d="$(.CURDIR)/config/"; fi; \ + echo "$(INSTALL) $$f $(DESTDIR)$(XDMCONFIGDIR)"; \ + $(INSTALL) $$d$$f $(DESTDIR)$(XDMCONFIGDIR) ;\ + else \ + echo "not overwriting $(DESTDIR)$(XDMCONFIGDIR)/$$f" ;\ + fi \ + done + + +.include <bsd.xorg.mk> @@ -0,0 +1,50 @@ +The default installation settings of xdm match those used for most platforms +in the previous X.Org releases: + +Scripts & modules: $(libdir)/X11/xdm (aka $(prefix)/lib/X11/xdm) +Configuration files: $(libdir)/X11/xdm +Pixmap files: $(libdir)/X11/xdm/pixmaps +Log files: /var/log +Process id/lock files: /var/run +xauth cookie files: /var/lib/xdm + +These may be overridden with the following options to configure: +Loadable modules: --with-xdmlibdir +Scripts: --with-xdmscriptdir (or --with-xdmlibdir) +Configuration files: --with-xdmconfigdir (or --with-xdmlibdir) +Pixmap files: --with-xdmpixmapdir (or --with-xdmlibdir) +Log files: --with-logdir +Process id/lock files: --with-piddir +xauth cookie files: --with-authdir + +For instance, some packagers/sites may prefer: + --with-xdmconfigdir=/etc/X11/xdm + --with-xdmlibdir=$(prefix)/lib/xdm + --with-xdmscriptdir=/etc/X11/xdm + + ---------------------------------------------------------------- + +All questions regarding this software should be directed at the +Xorg mailing list: + + http://lists.freedesktop.org/mailman/listinfo/xorg + +Please submit bug reports to the Xorg bugzilla: + + https://bugs.freedesktop.org/enter_bug.cgi?product=xorg + +The master development code repository can be found at: + + git://anongit.freedesktop.org/git/xorg/app/xdm + + http://cgit.freedesktop.org/xorg/app/xdm + +For patch submission instructions, see: + + http://www.x.org/wiki/Development/Documentation/SubmittingPatches + +For more information on the git code manager, see: + + http://wiki.x.org/wiki/GitPage + +$Id: README,v 1.3 2010/03/28 09:33:02 matthieu Exp $ diff --git a/config/GiveConsole b/config/GiveConsole new file mode 100644 index 0000000..cc07003 --- /dev/null +++ b/config/GiveConsole @@ -0,0 +1,14 @@ +#!/bin/sh +# Assign ownership of the console to the invoking user +# $OpenBSD: GiveConsole,v 1.5 2015/01/25 21:51:20 jca Exp $ +# +# By convention, both xconsole and xterm -C check that the +# console is owned by the invoking user and is readable before attaching +# the console output. This way a random user can invoke xterm -C without +# causing serious grief. +# +chown $USER /dev/console +if [ -c /dev/drm0 ]; then + chown $USER /dev/drm0 +fi +/usr/X11R6/bin/sessreg -a -l $DISPLAY -u none -x /etc/X11/xdm/Xservers $USER diff --git a/config/Makefile.am b/config/Makefile.am new file mode 100644 index 0000000..30e22ea --- /dev/null +++ b/config/Makefile.am @@ -0,0 +1,62 @@ +# + +include $(top_srcdir)/cpprules.in + +xdmscriptdir = $(XDMSCRIPTDIR) +xdmconfigdir = $(XDMCONFIGDIR) + +dist_xdmconfig_DATA = \ + Xaccess + +xdmconfig_DATA = \ + xdm-config \ + Xresources \ + Xservers + +xdmscript_SCRIPTS = \ + Xreset \ + Xsession \ + Xstartup + +dist_xdmscript_SCRIPTS = \ + GiveConsole \ + TakeConsole \ + Xsetup_0 \ + Xwilling + +pixmapdir = $(XDM_PIXMAPDIR) + +dist_pixmap_DATA = xorg-bw.xpm xorg.xpm + +BUILT_SOURCES = Xservers.ws xdm-config Xreset Xresources Xsession Xstartup + +CLEANFILES = $(BUILT_SOURCES) Xservers + +EXTRA_DIST = Xservers.ws.cpp Xservers.fs \ + xdm-config.cpp Xreset.cpp Xresources.cpp Xsession.cpp Xstartup.cpp + +Xservers: Xservers.$(SERVERSTYPE) + ln -s Xservers.$(SERVERSTYPE) Xservers + +# Defines used when cpp'ing config files to replace settings in the files + +#if USE_XPM +XPMDEFINES = -DXPM -DBITMAPDIR=$(XDM_PIXMAPDIR) -DXDM_PIXMAP=$(XDM_PIXMAP) \ + -DXDM_BWPIXMAP=$(XDM_BWPIXMAP) +#endif + +#if HAVE_MKTEMP_COMMAND +MKTEMP_DEFINES = -DMKTEMP_COMMAND=$(MKTEMP_COMMAND) +#endif + +CPP_FILES_FLAGS = -DBINDIR="$(bindir)" -DDEFAULTVT="$(DEFAULTVT)" \ + -DUTMP_FILE="$(UTMP_FILE)" -DWTMP_FILE="$(WTMP_FILE)" \ + -DXDMDIR="$(XDMLIBDIR)" -DXDMLOGDIR="$(XDMLOGDIR)" \ + -DXDMXAUTHDIR="$(XDMXAUTHDIR)" \ + -DXDMPIDDIR="$(XDMPIDDIR)" -DXDMCONFIGDIR="$(XDMCONFIGDIR)" \ + -DXDMSCRIPTDIR="$(XDMSCRIPTDIR)" -DSU="$(SU)" \ + -DCHOOSERPATH="$(XDMLIBDIR)/chooser" $(XPMDEFINES) \ + -DSHELL_CMD="$(SHELL_CMD)" $(MKTEMP_DEFINES) + +Xservers.ws: $(srcdir)/Xservers.ws.cpp + $(AM_V_GEN)$(RAWCPP) $(RAWCPPFLAGS) $(CPP_FILES_FLAGS) < $(srcdir)/Xservers.ws.cpp | $(CPP_SED_MAGIC) > $@ diff --git a/config/OpenBSD_15bpp.xpm b/config/OpenBSD_15bpp.xpm new file mode 100644 index 0000000..4d479ae --- /dev/null +++ b/config/OpenBSD_15bpp.xpm @@ -0,0 +1,6613 @@ +/* XPM */ +/* $OpenBSD: OpenBSD_15bpp.xpm,v 1.21 2015/06/26 16:18:26 mikeb Exp $ */ +static char *OpenBSD_15bpp[] = { +"240 175 6434 2", +" c none", +". c #4C6AA8", +"+ c #4A66A0", +"@ c #476096", +"# c #476095", +"$ c #48639A", +"% c #4B67A3", +"& c #4F6FB1", +"* c #5070B3", +"= c #4F70B2", +"- c #5071B3", +"; c #4B67A2", +"> c #486298", +", c #455B8D", +"' c #435988", +") c #455C8E", +"! c #476197", +"~ c #4C69A6", +"{ c #4A659F", +"] c #476094", +"^ c #49649C", +"/ c #3D4D73", +"( c #3B4A6D", +"_ c #3B496B", +": c #3D4D72", +"< c #4F6FB0", +"[ c #465E91", +"} c #3C4B6F", +"| c #31384C", +"1 c #2C2D39", +"2 c #2C2C37", +"3 c #2C2D38", +"4 c #343C53", +"5 c #3E4E75", +"6 c #49639B", +"7 c #455D8F", +"8 c #353D56", +"9 c #2F3343", +"0 c #28252A", +"a c #272428", +"b c #29282F", +"c c #2D2F3C", +"d c #333A50", +"e c #394565", +"f c #445A8A", +"g c #384361", +"h c #343B53", +"i c #333B52", +"j c #333B51", +"k c #384462", +"l c #3C4C70", +"m c #415581", +"n c #49649D", +"o c #3D4E74", +"p c #2D2E3B", +"q c #29272E", +"r c #252021", +"s c #28252B", +"t c #2E3140", +"u c #353E57", +"v c #3A4768", +"w c #272327", +"x c #333A51", +"y c #36405C", +"z c #394667", +"A c #3F5179", +"B c #455C8F", +"C c #4C6AA7", +"D c #2B2A34", +"E c #455C8D", +"F c #445B8C", +"G c #32394F", +"H c #262123", +"I c #231F21", +"J c #201C21", +"K c #292830", +"L c #394666", +"M c #3A4767", +"N c #2E303E", +"O c #26262B", +"P c #211D21", +"Q c #1F1B22", +"R c #1D1A22", +"S c #1F1B21", +"T c #211C21", +"U c #221D21", +"V c #2E3141", +"W c #3F517A", +"X c #4B68A3", +"Y c #211F21", +"Z c #1D1F21", +"` c #1F1F21", +" . c #201F21", +".. c #212021", +"+. c #242123", +"@. c #2A2A33", +"#. c #303546", +"$. c #3D4C72", +"%. c #4E6DAD", +"&. c #232021", +"*. c #222021", +"=. c #26252B", +"-. c #415480", +";. c #36405B", +">. c #262121", +",. c #332B20", +"'. c #68501B", +"). c #6A521B", +"!. c #2F2720", +"~. c #201B22", +"{. c #303446", +"]. c #191722", +"^. c #2E2620", +"/. c #3E331F", +"(. c #5C491C", +"_. c #A37F17", +":. c #B08A17", +"<. c #D5B312", +"[. c #B69315", +"}. c #9B7618", +"|. c #634D1C", +"1. c #272121", +"2. c #181722", +"3. c #252122", +"4. c #2F3242", +"5. c #40547F", +"6. c #3E2321", +"7. c #592721", +"8. c #542621", +"9. c #4D2621", +"0. c #4C2621", +"a. c #4F2621", +"b. c #552721", +"c. c #552621", +"d. c #502621", +"e. c #4A2521", +"f. c #372221", +"g. c #2E2121", +"h. c #1C1F21", +"i. c #171D21", +"j. c #2A2A32", +"k. c #40537D", +"l. c #4B68A4", +"m. c #2F3344", +"n. c #3B2321", +"o. c #612721", +"p. c #B13322", +"q. c #D33A23", +"r. c #E33E23", +"s. c #EE4423", +"t. c #DC3D23", +"u. c #D03823", +"v. c #9D2F22", +"w. c #382321", +"x. c #1A1F21", +"y. c #7E2B22", +"z. c #F24623", +"A. c #612822", +"B. c #572721", +"C. c #522621", +"D. c #432521", +"E. c #3D2321", +"F. c #302221", +"G. c #262021", +"H. c #191D21", +"I. c #181D21", +"J. c #2B2B35", +"K. c #4D6BA8", +"L. c #342C20", +"M. c #DBBB11", +"N. c #F0D80D", +"O. c #EED50D", +"P. c #E3C60F", +"Q. c #46371F", +"R. c #2A2931", +"S. c #B99514", +"T. c #F4DD0C", +"U. c #FDEC09", +"V. c #FAE70A", +"W. c #FAE60A", +"X. c #FDED08", +"Y. c #FEEF08", +"Z. c #F0D60D", +"`. c #9E7E18", +" + c #2C2520", +".+ c #313649", +"++ c #4E6DAC", +"@+ c #3F527C", +"#+ c #2B2C36", +"$+ c #1B1822", +"%+ c #52411C", +"&+ c #AB8917", +"*+ c #E6CA0F", +"=+ c #FBEA0A", +"-+ c #FFF804", +";+ c #FFF207", +">+ c #F6E10B", +",+ c #FCEA09", +"'+ c #FFF406", +")+ c #FFF705", +"!+ c #FBE70A", +"~+ c #DCC010", +"{+ c #967219", +"]+ c #415582", +"^+ c #3A486A", +"/+ c #BD3423", +"(+ c #F94A25", +"_+ c #FD4D25", +":+ c #FF5225", +"<+ c #FE4F25", +"[+ c #FE5025", +"}+ c #FA4A25", +"|+ c #FB4C25", +"1+ c #FF5025", +"2+ c #F64723", +"3+ c #F04323", +"4+ c #E23E23", +"5+ c #BB3423", +"6+ c #742A22", +"7+ c #322221", +"8+ c #151D21", +"9+ c #36415C", +"0+ c #1B1F21", +"a+ c #492522", +"b+ c #C03423", +"c+ c #F54723", +"d+ c #FD4F25", +"e+ c #F24423", +"f+ c #E43E23", +"g+ c #E03D23", +"h+ c #E74023", +"i+ c #F44623", +"j+ c #F34623", +"k+ c #CE3823", +"l+ c #C33623", +"m+ c #FF5425", +"n+ c #7C2B22", +"o+ c #EC4123", +"p+ c #E64023", +"q+ c #A63023", +"r+ c #642822", +"s+ c #2F2121", +"t+ c #131D21", +"u+ c #435886", +"v+ c #465F93", +"w+ c #1C1922", +"x+ c #5E491B", +"y+ c #FFF307", +"z+ c #FFF407", +"A+ c #FFF605", +"B+ c #F1D80D", +"C+ c #425683", +"D+ c #85631A", +"E+ c #F7E20B", +"F+ c #C5A313", +"G+ c #5A471C", +"H+ c #57441C", +"I+ c #AA8717", +"J+ c #FBE909", +"K+ c #FFF506", +"L+ c #E9CF0E", +"M+ c #372C1F", +"N+ c #1F1C22", +"O+ c #221F21", +"P+ c #1A1822", +"Q+ c #5C471C", +"R+ c #D9BA11", +"S+ c #FFF606", +"T+ c #FDEE08", +"U+ c #D7B711", +"V+ c #876819", +"W+ c #50401D", +"X+ c #3B321F", +"Y+ c #A47F18", +"Z+ c #F5E00B", +"`+ c #E7CA10", +" @ c #55431D", +".@ c #1C1A21", +"+@ c #3E4F76", +"@@ c #5A2722", +"#@ c #782B22", +"$@ c #D83A23", +"%@ c #AD3222", +"&@ c #6A2A22", +"*@ c #9B2F22", +"=@ c #E23D23", +"-@ c #EA4123", +";@ c #A03022", +">@ c #6B2821", +",@ c #F44625", +"'@ c #F04425", +")@ c #902E22", +"!@ c #3A2321", +"~@ c #141D21", +"{@ c #0E1C21", +"]@ c #432321", +"^@ c #962F22", +"/@ c #E73E23", +"(@ c #4D2521", +"_@ c #662A22", +":@ c #A73022", +"<@ c #F84925", +"[@ c #E94025", +"}@ c #832C22", +"|@ c #872C22", +"1@ c #A93022", +"2@ c #D53822", +"3@ c #F94925", +"4@ c #E84023", +"5@ c #AB3223", +"6@ c #4E6EAF", +"7@ c #3E4F77", +"8@ c #B39015", +"9@ c #BA9615", +"0@ c #4D6BAA", +"a@ c #171423", +"b@ c #937119", +"c@ c #FEF208", +"d@ c #BD9A15", +"e@ c #101022", +"f@ c #111123", +"g@ c #906F19", +"h@ c #E8CC0F", +"i@ c #2B2C37", +"j@ c #4D6CAA", +"k@ c #486299", +"l@ c #1D1A21", +"m@ c #2A2321", +"n@ c #C3A014", +"o@ c #FBE90A", +"p@ c #F4DE0C", +"q@ c #1C1A22", +"r@ c #141322", +"s@ c #1B1922", +"t@ c #131223", +"u@ c #4D3E1D", +"v@ c #F9E60B", +"w@ c #FFF306", +"x@ c #6D541B", +"y@ c #282021", +"z@ c #DD3B23", +"A@ c #121D21", +"B@ c #CA3722", +"C@ c #FC4D25", +"D@ c #D33823", +"E@ c #282121", +"F@ c #5F2722", +"G@ c #F74725", +"H@ c #2B2121", +"I@ c #B73322", +"J@ c #7F2B22", +"K@ c #131C21", +"L@ c #AA3222", +"M@ c #712A22", +"N@ c #0E1B21", +"O@ c #121C21", +"P@ c #DA3B23", +"Q@ c #EE4323", +"R@ c #4F6EAF", +"S@ c #251F21", +"T@ c #EACE0F", +"U@ c #FEEE09", +"V@ c #47381D", +"W@ c #47381F", +"X@ c #F8E40B", +"Y@ c #FFF505", +"Z@ c #FBE809", +"`@ c #171522", +" # c #2A2320", +".# c #F9E50A", +"+# c #1D1B22", +"@# c #59461C", +"## c #EFD60D", +"$# c #44371D", +"%# c #272326", +"&# c #C1A014", +"*# c #415682", +"=# c #262326", +"-# c #1F2021", +";# c #CB3823", +"># c #402321", +",# c #A43022", +"'# c #D93B23", +")# c #262224", +"!# c #A13022", +"~# c #472521", +"{# c #C03422", +"]# c #C23422", +"^# c #384463", +"/# c #28262C", +"(# c #302820", +"_# c #FCEB0A", +":# c #FDED09", +"<# c #FBE80A", +"[# c #FBEA09", +"}# c #E9CC0F", +"|# c #394564", +"1# c #37425F", +"2# c #B99515", +"3# c #E2C410", +"4# c #DABA11", +"5# c #181522", +"6# c #425784", +"7# c #2B2B36", +"8# c #7C5E1A", +"9# c #FAE80A", +"0# c #43361F", +"a# c #3E5078", +"b# c #765A1A", +"c# c #E0C111", +"d# c #4A659E", +"e# c #4E6EAE", +"f# c #4C69A5", +"g# c #486197", +"h# c #CD3823", +"i# c #141C21", +"j# c #712A21", +"k# c #D53B23", +"l# c #272429", +"m# c #6D2A22", +"n# c #343C54", +"o# c #37415D", +"p# c #2A2932", +"q# c #DF3D23", +"r# c #D33A22", +"s# c #425684", +"t# c #967418", +"u# c #85661A", +"v# c #41341F", +"w# c #4A3B1D", +"x# c #4C3D1D", +"y# c #445A8B", +"z# c #A07C17", +"A# c #131322", +"B# c #D5B511", +"C# c #2D303E", +"D# c #936F19", +"E# c #FDEF08", +"F# c #FEF007", +"G# c #7F611A", +"H# c #252022", +"I# c #3C4C71", +"J# c #6D551B", +"K# c #FFF107", +"L# c #FCEA0A", +"M# c #5E4A1C", +"N# c #353F59", +"O# c #353E58", +"P# c #32384C", +"Q# c #29272D", +"R# c #2D2F3D", +"S# c #28262B", +"T# c #303648", +"U# c #4D6CAB", +"V# c #3E5077", +"W# c #252326", +"X# c #242225", +"Y# c #2C2E3A", +"Z# c #37425E", +"`# c #111C21", +" $ c #EE4325", +".$ c #AE3222", +"+$ c #F74925", +"@$ c #412321", +"#$ c #303547", +"$$ c #382221", +"%$ c #F54623", +"&$ c #425785", +"*$ c #2F3445", +"=$ c #632821", +"-$ c #F94923", +";$ c #1B1D21", +">$ c #384563", +",$ c #E1C311", +"'$ c #2F2820", +")$ c #3D3320", +"!$ c #E2C510", +"~$ c #A98517", +"{$ c #465D90", +"]$ c #68501C", +"^$ c #FCEB09", +"/$ c #CBAA13", +"($ c #745A1B", +"_$ c #906D19", +":$ c #151422", +"<$ c #201C22", +"[$ c #3A4869", +"}$ c #25242A", +"|$ c #232026", +"1$ c #4D6BA9", +"2$ c #362221", +"3$ c #101C21", +"4$ c #CA3723", +"5$ c #F14325", +"6$ c #642722", +"7$ c #AA3022", +"8$ c #40537E", +"9$ c #40527C", +"0$ c #272220", +"a$ c #201D21", +"b$ c #2B2521", +"c$ c #282221", +"d$ c #262225", +"e$ c #4A669F", +"f$ c #D8B911", +"g$ c #E0C310", +"h$ c #1B1A22", +"i$ c #2B2620", +"j$ c #F9E40B", +"k$ c #F2DA0C", +"l$ c #1D1B21", +"m$ c #3D3220", +"n$ c #F5E00C", +"o$ c #3D331F", +"p$ c #32384D", +"q$ c #475F94", +"r$ c #AE8A17", +"s$ c #BD9A14", +"t$ c #151323", +"u$ c #302A20", +"v$ c #372E1F", +"w$ c #44371F", +"x$ c #55441C", +"y$ c #715A1B", +"z$ c #4F3E1D", +"A$ c #362C1F", +"B$ c #68521B", +"C$ c #B18E17", +"D$ c #C2A014", +"E$ c #B18E15", +"F$ c #7F631A", +"G$ c #342B20", +"H$ c #3D321F", +"I$ c #A78317", +"J$ c #CAA913", +"K$ c #B08C15", +"L$ c #72591B", +"M$ c #302720", +"N$ c #131323", +"O$ c #2C2620", +"P$ c #362C20", +"Q$ c #46381D", +"R$ c #7A5F1A", +"S$ c #967419", +"T$ c #5F4A1B", +"U$ c #CDAB13", +"V$ c #C6A614", +"W$ c #957218", +"X$ c #1C1D21", +"Y$ c #C43622", +"Z$ c #B63322", +"`$ c #FC4C25", +" % c #2F2221", +".% c #28262D", +"+% c #332221", +"@% c #782A22", +"#% c #982F22", +"$% c #B33323", +"%% c #FEF207", +"&% c #FEEE08", +"*% c #F6E10C", +"=% c #D6B711", +"-% c #9E7C18", +";% c #151322", +">% c #9D7A19", +",% c #F0D70D", +"'% c #B99615", +")% c #F5DE0C", +"!% c #E0C210", +"~% c #D7B712", +"{% c #C3A013", +"]% c #6A501B", +"^% c #D7B912", +"/% c #DCBD11", +"(% c #EACE0E", +"_% c #FFF008", +":% c #3A301F", +"<% c #896819", +"[% c #F0D90C", +"}% c #F0D90D", +"|% c #54431D", +"1% c #50401C", +"2% c #F5DF0C", +"3% c #EAD20E", +"4% c #BB9815", +"5% c #D6B612", +"6% c #E5C710", +"7% c #EED40E", +"8% c #FFF904", +"9% c #E5C810", +"0% c #E2C710", +"a% c #E4C510", +"b% c #282220", +"c% c #662821", +"d% c #F94A23", +"e% c #402322", +"f% c #E74025", +"g% c #A33022", +"h% c #462322", +"i% c #F04423", +"j% c #374360", +"k% c #BD9B14", +"l% c #FFF108", +"m% c #E6CB0F", +"n% c #876619", +"o% c #343D55", +"p% c #445989", +"q% c #F0D50E", +"r% c #F3E00B", +"s% c #D2B113", +"t% c #141223", +"u% c #896A19", +"v% c #FEF107", +"w% c #F7E20C", +"x% c #1D1921", +"y% c #9B7818", +"z% c #9D7A18", +"A% c #F3DD0C", +"B% c #D7B911", +"C% c #FFF805", +"D% c #372E20", +"E% c #C6A314", +"F% c #F9E60A", +"G% c #F3DB0D", +"H% c #7C5F1A", +"I% c #B79515", +"J% c #EED50E", +"K% c #322A20", +"L% c #F2DA0D", +"M% c #FFF206", +"N% c #0F0F23", +"O% c #AB8717", +"P% c #FFF007", +"Q% c #181F21", +"R% c #ED4123", +"S% c #FA4A23", +"T% c #C93723", +"U% c #272021", +"V% c #EB4123", +"W% c #D53A23", +"X% c #221F22", +"Y% c #DEBE11", +"Z% c #3C4B6E", +"`% c #31374B", +" & c #664F1C", +".& c #A98317", +"+& c #0B0C25", +"@& c #D0AE12", +"#& c #1D1922", +"$& c #5F4C1C", +"%& c #FDEB09", +"&& c #7A5E1A", +"*& c #272221", +"=& c #8A6819", +"-& c #F8E30B", +";& c #8A6B19", +">& c #ECD10E", +",& c #121123", +"'& c #0D0E23", +")& c #916F19", +"!& c #FEF008", +"~& c #FDEB08", +"{& c #3A2F20", +"]& c #F5DF0B", +"^& c #F3DA0D", +"/& c #C6A313", +"(& c #ECD20E", +"_& c #83641A", +":& c #9D7C18", +"<& c #9A2E22", +"[& c #C63623", +"}& c #412521", +"|& c #ED4125", +"1& c #B03222", +"2& c #363F59", +"3& c #E44023", +"4& c #71551B", +"5& c #FCEC09", +"6& c #72571B", +"7& c #634D1B", +"8& c #3F527B", +"9& c #131222", +"0& c #BE9B14", +"a& c #F9E40A", +"b& c #1A1722", +"c& c #0E0F23", +"d& c #FEF108", +"e& c #BE9D14", +"f& c #A17E18", +"g& c #C6A413", +"h& c #473A1D", +"i& c #101023", +"j& c #C4A114", +"k& c #BC9815", +"l& c #B59115", +"m& c #151423", +"n& c #FDEC08", +"o& c #E53E23", +"p& c #B23222", +"q& c #F64725", +"r& c #892C22", +"s& c #E03E23", +"t& c #765A1B", +"u& c #1B1921", +"v& c #3B4A6E", +"w& c #382F20", +"x& c #E8CB0F", +"y& c #D5B512", +"z& c #3B496C", +"A& c #231F22", +"B& c #CCAA13", +"C& c #201D22", +"D& c #EBD00F", +"E& c #8A6A19", +"F& c #CFAE13", +"G& c #F2D90C", +"H& c #E4C610", +"I& c #F7E10B", +"J& c #D2B112", +"K& c #8C6B19", +"L& c #B29015", +"M& c #3B2221", +"N& c #5F2822", +"O& c #912E22", +"P& c #E13D23", +"Q& c #762A22", +"R& c #2B2122", +"S& c #BE3423", +"T& c #A63022", +"U& c #E13E23", +"V& c #812C22", +"W& c #71571B", +"X& c #856619", +"Y& c #AA8517", +"Z& c #CAAA13", +"`& c #E4C910", +" * c #CBA913", +".* c #D0B013", +"+* c #F4DC0C", +"@* c #6F551B", +"#* c #EFD50E", +"$* c #282321", +"%* c #181523", +"&* c #C09D14", +"** c #AB8915", +"=* c #DDBD11", +"-* c #E4C710", +";* c #D1B112", +">* c #BB3422", +",* c #4C2522", +"'* c #BB3322", +")* c #8C2C22", +"!* c #55441D", +"~* c #B18C15", +"{* c #987618", +"]* c #D6B512", +"^* c #6D521B", +"/* c #1F1A22", +"(* c #382F1F", +"_* c #221D22", +":* c #71571A", +"<* c #916F18", +"[* c #191822", +"}* c #E6C90F", +"|* c #5E4A1B", +"1* c #E6C910", +"2* c #493A1D", +"3* c #EDD30E", +"4* c #765C1A", +"5* c #B63323", +"6* c #202021", +"7* c #EA4023", +"8* c #FB4A25", +"9* c #F14423", +"0* c #DDBD10", +"a* c #EAD00E", +"b* c #3D3020", +"c* c #0E0E25", +"d* c #2E2720", +"e* c #CDAE13", +"f* c #EBCE0F", +"g* c #F8E20B", +"h* c #473A1F", +"i* c #F9E70A", +"j* c #765C1B", +"k* c #362B1F", +"l* c #E6C70F", +"m* c #C1A013", +"n* c #A98717", +"o* c #A07C18", +"p* c #664F1B", +"q* c #F3DB0C", +"r* c #462521", +"s* c #F34425", +"t* c #812B22", +"u* c #2A2021", +"v* c #486198", +"w* c #DABB11", +"x* c #D8B711", +"y* c #B69115", +"z* c #8A6A18", +"A* c #231D21", +"B* c #C19E14", +"C* c #C8A614", +"D* c #221C21", +"E* c #F6E00C", +"F* c #C7A414", +"G* c #B59117", +"H* c #C4A314", +"I* c #141222", +"J* c #614C1C", +"K* c #FDF008", +"L* c #F5DD0C", +"M* c #FFF704", +"N* c #F6E00B", +"O* c #E1C310", +"P* c #A07E17", +"Q* c #141323", +"R* c #DCBC11", +"S* c #191723", +"T* c #C8A713", +"U* c #9D7A17", +"V* c #C03623", +"W* c #9B2F23", +"X* c #DD3D23", +"Y* c #EB4323", +"Z* c #303548", +"`* c #B23323", +" = c #BD3422", +".= c #303445", +"+= c #362E20", +"@= c #FFF405", +"#= c #201B21", +"$= c #EED40D", +"%= c #6A541B", +"&= c #C3A114", +"*= c #54431C", +"== c #E7CA0F", +"-= c #614C1B", +";= c #2C2621", +">= c #F8E30C", +",= c #F8E40A", +"'= c #B59514", +")= c #7E6119", +"!= c #455D90", +"~= c #BC3423", +"{= c #E63E23", +"]= c #592622", +"^= c #442521", +"/= c #C23623", +"(= c #B93322", +"_= c #E94123", +":= c #2E3241", +"<= c #A37F18", +"[= c #1C1921", +"}= c #906F18", +"|= c #785E1A", +"1= c #A48117", +"2= c #EFD80D", +"3= c #C7A413", +"4= c #9E7A18", +"5= c #CEAB13", +"6= c #85641A", +"7= c #C4A014", +"8= c #8A2C22", +"9= c #D93A23", +"0= c #3F5079", +"a= c #762B22", +"b= c #6B2A22", +"c= c #0E0E23", +"d= c #B99614", +"e= c #7E611A", +"f= c #C7A713", +"g= c #A78517", +"h= c #3A2F1F", +"i= c #9D7818", +"j= c #332A20", +"k= c #31374A", +"l= c #A68317", +"m= c #F4DD0D", +"n= c #987418", +"o= c #906B19", +"p= c #FAE909", +"q= c #2A2221", +"r= c #59471D", +"s= c #957118", +"t= c #C9A713", +"u= c #FA4C25", +"v= c #662822", +"w= c #542622", +"x= c #F54725", +"y= c #492521", +"z= c #AB3222", +"A= c #D7B612", +"B= c #DCBE11", +"C= c #FFF905", +"D= c #6B521B", +"E= c #2B2321", +"F= c #644D1C", +"G= c #FBED09", +"H= c #FCEE08", +"I= c #E1C211", +"J= c #43361D", +"K= c #D9B711", +"L= c #2E2621", +"M= c #8C6A19", +"N= c #8E6B19", +"O= c #E4C70F", +"P= c #211C22", +"Q= c #E0C110", +"R= c #E7CB0F", +"S= c #D43A23", +"T= c #3D2221", +"U= c #F24425", +"V= c #1A1D21", +"W= c #37415E", +"X= c #465E92", +"Y= c #CC3823", +"Z= c #762A21", +"`= c #7E5F1A", +" - c #C8A613", +".- c #FCEE09", +"+- c #F7E40B", +"@- c #BE9B15", +"#- c #FEED08", +"$- c #81641A", +"%- c #252328", +"&- c #A68118", +"*- c #252121", +"=- c #1A1922", +"-- c #E3C610", +";- c #FCEC08", +">- c #9A7618", +",- c #AA8518", +"'- c #171422", +")- c #9A7818", +"!- c #D9B911", +"~- c #FBEC09", +"{- c #F04325", +"]- c #E84123", +"^- c #9D3023", +"/- c #27272D", +"(- c #252429", +"_- c #D53823", +":- c #EF4323", +"<- c #9A2F22", +"[- c #B53322", +"}- c #F84A25", +"|- c #5A2721", +"1- c #F1D90D", +"2- c #2F2721", +"3- c #A68318", +"4- c #282320", +"5- c #AD8917", +"6- c #DFC210", +"7- c #E1C410", +"8- c #D2B212", +"9- c #C8A913", +"0- c #A67F17", +"a- c #A78118", +"b- c #E9CD0F", +"c- c #F7E10C", +"d- c #4D3D1D", +"e- c #302121", +"f- c #442321", +"g- c #552722", +"h- c #B73423", +"i- c #D13822", +"j- c #E63E25", +"k- c #982E22", +"l- c #9B2E22", +"m- c #8C2E22", +"n- c #DC3B23", +"o- c #E54023", +"p- c #F7E30B", +"q- c #C5A414", +"r- c #1F1A21", +"s- c #BD9B15", +"t- c #DFC211", +"u- c #CEAB12", +"v- c #ECD20F", +"w- c #F6E30B", +"x- c #6B541B", +"y- c #E5C70F", +"z- c #DCBD10", +"A- c #B13222", +"B- c #F84923", +"C- c #A93222", +"D- c #F44725", +"E- c #CB3723", +"F- c #C43423", +"G- c #CC3723", +"H- c #E64025", +"I- c #EBD00E", +"J- c #C19D14", +"K- c #43371F", +"L- c #EFD60E", +"M- c #DDC111", +"N- c #F2D90D", +"O- c #DDBE10", +"P- c #C29E14", +"Q- c #D7BA11", +"R- c #CEB012", +"S- c #C3A413", +"T- c #C3A314", +"U- c #BC9814", +"V- c #5E491C", +"W- c #5E2721", +"X- c #722A22", +"Y- c #4D2622", +"Z- c #C13622", +"`- c #EA4125", +" ; c #F34625", +".; c #F24625", +"+; c #DA3A23", +"@; c #B73422", +"#; c #2C2121", +"$; c #852C22", +"%; c #962E22", +"&; c #632822", +"*; c #72591A", +"=; c #5F4A1C", +"-; c #211D22", +";; c #B08C17", +">; c #CCAD13", +",; c #151722", +"'; c #0E1023", +"); c #1F1D21", +"!; c #2E2820", +"~; c #3B331F", +"{; c #3A321F", +"]; c #322B20", +"^; c #1D1C21", +"/; c #101223", +"(; c #121322", +"_; c #1A1A22", +":; c #171722", +"<; c #1C1B21", +"[; c #101122", +"}; c #232121", +"|; c #0D0F23", +"1; c #151522", +"2; c #111322", +"3; c #111223", +"4; c #191922", +"5; c #0F1123", +"6; c #181822", +"7; c #131422", +"8; c #1B1B21", +"9; c #0D1023", +"0; c #2D303D", +"a; c #2A1F21", +"b; c #281D22", +"c; c #261C22", +"d; c #271C22", +"e; c #2B1F21", +"f; c #52411D", +"g; c #2B1F22", +"h; c #2B2021", +"i; c #2C2021", +"j; c #2A1F22", +"k; c #2A2121", +"l; c #D83B23", +"m; c #ED4323", +"n; c #522721", +"o; c #EF4325", +"p; c #EF4425", +"q; c #F14625", +"r; c #EBCF0E", +"s; c #1C1C21", +"t; c #342221", +"u; c #917119", +"v; c #1F1C21", +"w; c #322820", +"x; c #FFF507", +"y; c #937219", +"z; c #171822", +"A; c #E6CE0E", +"B; c #E3C510", +"C; c #E5C90F", +"D; c #4A67A1", +"E; c #363F5A", +"F; c #31466F", +"G; c #1D2840", +"H; c #4A69A7", +"I; c #22304C", +"J; c #04060A", +"K; c #446098", +"L; c #4E6FB0", +"M; c #1A243A", +"N; c #000000", +"O; c #364C79", +"P; c #4B69A8", +"Q; c #151E2F", +"R; c #2E4168", +"S; c #4967A4", +"T; c #4C6CAC", +"U; c #4D6DAD", +"V; c #4866A3", +"W; c #131B2A", +"X; c #2B3D61", +"Y; c #4B6AA9", +"Z; c #1D2942", +"`; c #202D47", +" > c #4C6BAB", +".> c #30436B", +"+> c #172134", +"@> c #405B91", +"#> c #45629C", +"$> c #121822", +"%> c #090802", +"&> c #2A3A5C", +"*> c #4F70B3", +"=> c #273757", +"-> c #2F4269", +";> c #263656", +">> c #293A5C", +",> c #3D568A", +"'> c #191917", +")> c #2A2409", +"!> c #24314A", +"~> c #3E588C", +"{> c #020204", +"]> c #0E1420", +"^> c #435F98", +"/> c #182236", +"(> c #2E4167", +"_> c #4765A0", +":> c #354A77", +"<> c #28240F", +"[> c #584914", +"}> c #212A3A", +"|> c #4D6DAE", +"1> c #45619B", +"2> c #30446D", +"3> c #4865A1", +"4> c #1F2C47", +"5> c #2B3C60", +"6> c #101724", +"7> c #253453", +"8> c #4E6EB0", +"9> c #2D3F65", +"0> c #110F05", +"a> c #181916", +"b> c #3A5283", +"c> c #182135", +"d> c #233250", +"e> c #273758", +"f> c #443A11", +"g> c #73601D", +"h> c #1C222A", +"i> c #2F436B", +"j> c #111826", +"k> c #446099", +"l> c #405A90", +"m> c #040609", +"n> c #374E7C", +"o> c #47649F", +"p> c #243351", +"q> c #0D0B04", +"r> c #191A1A", +"s> c #415B91", +"t> c #212F4A", +"u> c #344974", +"v> c #211C0A", +"w> c #2A230C", +"x> c #23314E", +"y> c #2C3E64", +"z> c #0F1521", +"A> c #141C2D", +"B> c #6A5A1D", +"C> c #97802A", +"D> c #181B1D", +"E> c #192338", +"F> c #1C273F", +"G> c #010102", +"H> c #2D4066", +"I> c #1B273D", +"J> c #1F2C46", +"K> c #31456D", +"L> c #202D48", +"M> c #3D5689", +"N> c #222117", +"O> c #433914", +"P> c #232C3C", +"Q> c #111725", +"R> c #28395A", +"S> c #3C5588", +"T> c #1E1A0B", +"U> c #3C3513", +"V> c #151C28", +"W> c #334872", +"X> c #06090E", +"Y> c #38507F", +"Z> c #05070B", +"`> c #917C2B", +" , c #B89E36", +"., c #100F09", +"+, c #425E95", +"@, c #040508", +"#, c #121826", +"$, c #110F04", +"%, c #111004", +"&, c #384F7E", +"*, c #202E49", +"=, c #131B2C", +"-, c #161F31", +";, c #1E283B", +">, c #4C4218", +",, c #25210C", +"', c #0D121D", +"), c #4866A2", +"!, c #262414", +"~, c #685D24", +"{, c #16150E", +"], c #3A5282", +"^, c #010101", +"/, c #141C2C", +"(, c #344A76", +"_, c #121928", +":, c #0D0B03", +"<, c #BCA239", +"[, c #EFCE49", +"}, c #2F290E", +"|, c #172033", +"1, c #1C273E", +"2, c #0D1015", +"3, c #2F280C", +"4, c #1F1A07", +"5, c #030407", +"6, c #0A0A03", +"7, c #050502", +"8, c #23324F", +"9, c #4B431A", +"0, c #88772E", +"a, c #151613", +"b, c #2F426A", +"c, c #364D7A", +"d, c #4764A0", +"e, c #25261B", +"f, c #A49139", +"g, c #473F19", +"h, c #1E2B44", +"i, c #384E7D", +"j, c #010203", +"k, c #695B23", +"l, c #F2D34F", +"m, c #FFE353", +"n, c #9A8631", +"o, c #060503", +"p, c #080B12", +"q, c #4A68A6", +"r, c #395080", +"s, c #0F0F0D", +"t, c #4E4214", +"u, c #141106", +"v, c #0A0F17", +"w, c #211F13", +"x, c #473E17", +"y, c #1D2532", +"z, c #1B180A", +"A, c #C6B044", +"B, c #645923", +"C, c #293A5D", +"D, c #3F5A8F", +"E, c #18180F", +"F, c #C1AD45", +"G, c #8A7B32", +"H, c #1A253B", +"I, c #050501", +"J, c #29250E", +"K, c #786B29", +"L, c #E6CB4E", +"M, c #FADC54", +"N, c #F3D551", +"O, c #EED14F", +"P, c #83732C", +"Q, c #383012", +"R, c #121006", +"S, c #030201", +"T, c #110F06", +"U, c #61531C", +"V, c #0C0A04", +"W, c #435F97", +"X, c #090D14", +"Y, c #334772", +"Z, c #030301", +"`, c #1A2437", +" ' c #625821", +".' c #29240E", +"+' c #3B5384", +"@' c #8C7D31", +"#' c #EAD758", +"$' c #615624", +"%' c #100F07", +"&' c #080B0F", +"*' c #0E0B05", +"=' c #BAAD48", +"-' c #C5BA4C", +";' c #0F0D05", +">' c #29250F", +",' c #695F28", +"'' c #80732E", +")' c #A4933B", +"!' c #E4CC52", +"~' c #FCE35A", +"{' c #F7DA56", +"]' c #F0D453", +"^' c #EFD353", +"/' c #F2D653", +"(' c #FCDF55", +"_' c #EFD250", +":' c #C0A93F", +"<' c #927F2F", +"[' c #665B21", +"}' c #383213", +"|' c #0A0903", +"1' c #191607", +"2' c #806E26", +"3' c #111827", +"4' c #06080D", +"5' c #30446C", +"6' c #0D0A03", +"7' c #191404", +"8' c #374D7A", +"9' c #2A3B5F", +"0' c #473E19", +"a' c #81722D", +"b' c #1D232D", +"c' c #0B1019", +"d' c #655B26", +"e' c #F9E560", +"f' c #FBE25F", +"g' c #BDAB48", +"h' c #6E642B", +"i' c #332D13", +"j' c #231F0D", +"k' c #24200E", +"l' c #322D14", +"m' c #645C27", +"n' c #6F662B", +"o' c #131008", +"p' c #AEA145", +"q' c #EADB5D", +"r' c #241F0D", +"s' c #6A5F28", +"t' c #FFEE63", +"u' c #FFED63", +"v' c #FFE861", +"w' c #FADF5D", +"x' c #F2D859", +"y' c #F1D657", +"z' c #F0D555", +"A' c #F0D454", +"B' c #F6D955", +"C' c #FEE056", +"D' c #FFE156", +"E' c #FFE456", +"F' c #DCC54A", +"G' c #2E290F", +"H' c #4A3F17", +"I' c #A89134", +"J' c #415C93", +"K' c #060707", +"L' c #5F4D11", +"M' c #322A11", +"N' c #435E96", +"O' c #1B180C", +"P' c #C0AB46", +"Q' c #413A19", +"R' c #030508", +"S' c #6D622A", +"T' c #F8DF5F", +"U' c #FAE160", +"V' c #FFE864", +"W' c #FFE964", +"X' c #EAD35B", +"Y' c #D4C154", +"Z' c #D6C355", +"`' c #EBD55D", +" ) c #FFF168", +".) c #D4C254", +"+) c #161409", +"@) c #A99D44", +"#) c #FFF86C", +"$) c #51491F", +"%) c #282510", +"&) c #E7D35A", +"*) c #FBE261", +"=) c #F1DA5D", +"-) c #F1D95D", +";) c #F2DB5D", +">) c #FDE25F", +",) c #F7DD5C", +"') c #F1D759", +")) c #F1D757", +"!) c #F1D556", +"~) c #EFD455", +"{) c #EED252", +"]) c #FFE359", +"^) c #C1A942", +"/) c #131106", +"() c #9D8932", +"_) c #AA9337", +":) c #141206", +"<) c #0F0C04", +"[) c #05080C", +"}) c #5C4A13", +"|) c #AF8E22", +"1) c #2A2E32", +"2) c #4D6CAC", +"3) c #3F598D", +"4) c #3D578A", +"5) c #070A10", +"6) c #7C702F", +"7) c #958739", +"8) c #3C5486", +"9) c #0E131F", +"0) c #080803", +"a) c #AE9E45", +"b) c #FFE965", +"c) c #F5DD61", +"d) c #F2DC60", +"e) c #F4DD61", +"f) c #FCE465", +"g) c #FFEA67", +"h) c #FBE465", +"i) c #FFE967", +"j) c #B9A94B", +"k) c #0E0C06", +"l) c #B1A347", +"m) c #FFFF72", +"n) c #A89A44", +"o) c #AE9F45", +"p) c #FEE764", +"q) c #F3DD60", +"r) c #F4DD60", +"s) c #F4DD5F", +"t) c #E4CE59", +"u) c #EBD45A", +"v) c #F5DC5D", +"w) c #F2DA5C", +"x) c #F3D95C", +"y) c #F2D85A", +"z) c #F2D858", +"A) c #F0D557", +"B) c #FFE75D", +"C) c #84762F", +"D) c #161408", +"E) c #E2C74C", +"F) c #A59037", +"G) c #695C22", +"H) c #AD9A38", +"I) c #4E4418", +"J) c #100D05", +"K) c #0F1623", +"L) c #3D320E", +"M) c #DFB932", +"N) c #8F751E", +"O) c #253350", +"P) c #46639D", +"Q) c #263554", +"R) c #2E4269", +"S) c #1B263C", +"T) c #1A160A", +"U) c #CBBA4F", +"V) c #46401C", +"W) c #07090F", +"X) c #080C13", +"Y) c #6A602A", +"Z) c #F5E263", +"`) c #FCE766", +" ! c #F4DF64", +".! c #F5E064", +"+! c #F4DF65", +"@! c #FFEB6A", +"#! c #AEA249", +"$! c #131107", +"%! c #C5B753", +"&! c #FFFB71", +"*! c #F3E065", +"=! c #363217", +"-! c #635A29", +";! c #FBE867", +">! c #F5E063", +",! c #FDE666", +"'! c #EBD65E", +")! c #786E30", +"!! c #BDAC4B", +"~! c #FEE865", +"{! c #F4DC5F", +"]! c #F3DB5E", +"^! c #F3DB5D", +"/! c #F7DB5C", +"(! c #FDE55F", +"_! c #4A441C", +":! c #4B431B", +"<! c #FADF58", +"[! c #AE9A3D", +"}! c #7D6E29", +"|! c #FFF45C", +"1! c #F0D14D", +"2! c #AD9737", +"3! c #4F4518", +"4! c #4E4114", +"5! c #E0BB37", +"6! c #FFDD40", +"7! c #655317", +"8! c #3D5688", +"9! c #030405", +"0! c #28385A", +"a! c #080C12", +"b! c #222F4C", +"c! c #B5A749", +"d! c #B4A74A", +"e! c #2A2812", +"f! c #9D9141", +"g! c #ECDB62", +"h! c #FDE868", +"i! c #F6E065", +"j! c #F6E166", +"k! c #FDE96A", +"l! c #FDE869", +"m! c #F4E066", +"n! c #F5E268", +"o! c #F6E368", +"p! c #FFEE6E", +"q! c #978C41", +"r! c #373318", +"s! c #F4E368", +"t! c #FDED6C", +"u! c #FFF470", +"v! c #706830", +"w! c #22210F", +"x! c #EEDD64", +"y! c #FAE366", +"z! c #FFEE6B", +"A! c #D4C357", +"B! c #373116", +"C! c #AB9D46", +"D! c #FFEF69", +"E! c #F5DE62", +"F! c #F1D95E", +"G! c #FFEE66", +"H! c #B9A948", +"I! c #2C2710", +"J! c #BDA945", +"K! c #FFED61", +"L! c #B5A141", +"M! c #6F6226", +"N! c #FFE457", +"O! c #FBDB53", +"P! c #FEDD52", +"Q! c #E8C949", +"R! c #C5AB3D", +"S! c #AA9133", +"T! c #A68E30", +"U! c #E0BD3E", +"V! c #F7CF41", +"W! c #F7D03F", +"X! c #68571A", +"Y! c #010103", +"Z! c #2C3E63", +"`! c #69622C", +" ~ c #F4EA6A", +".~ c #4F4921", +"+~ c #3E3A1B", +"@~ c #F6E669", +"#~ c #FFF36E", +"$~ c #F4E067", +"%~ c #F7E468", +"&~ c #F4E469", +"*~ c #AB9F49", +"=~ c #CFC55B", +"-~ c #FFF270", +";~ c #F5E168", +">~ c #F6E469", +",~ c #F8E669", +"'~ c #F8EF6E", +")~ c #6E6831", +"!~ c #787134", +"~~ c #FFFA74", +"{~ c #F6E268", +"]~ c #FEF06F", +"^~ c #D8CA5D", +"/~ c #252210", +"(~ c #A89D48", +"_~ c #FFF06E", +":~ c #C7B855", +"<~ c #25220F", +"[~ c #A79B46", +"}~ c #FFEF6D", +"|~ c #F6E265", +"1~ c #F4E063", +"2~ c #F3DC62", +"3~ c #FCE865", +"4~ c #F0E363", +"5~ c #4B451D", +"6~ c #7C7130", +"7~ c #FFEB64", +"8~ c #FEE661", +"9~ c #C8B54A", +"0~ c #100E06", +"a~ c #6E6126", +"b~ c #FFE45A", +"c~ c #EFD351", +"d~ c #EFD150", +"e~ c #F5D650", +"f~ c #FBDA50", +"g~ c #FEDA4E", +"h~ c #FAD74B", +"i~ c #FFDB4A", +"j~ c #C2A536", +"k~ c #5F5019", +"l~ c #261F0A", +"m~ c #28395B", +"n~ c #405A8F", +"o~ c #3B5385", +"p~ c #22304D", +"q~ c #0B0C0B", +"r~ c #1D1A0C", +"s~ c #EEE166", +"t~ c #CEC95C", +"u~ c #100D06", +"v~ c #827A39", +"w~ c #F9E66B", +"x~ c #F7E66B", +"y~ c #FBF171", +"z~ c #7D7737", +"A~ c #524E25", +"B~ c #F7EA6E", +"C~ c #FCED70", +"D~ c #F5E56A", +"E~ c #FFEE6F", +"F~ c #D7CD60", +"G~ c #3E3C1C", +"H~ c #D6CA5E", +"I~ c #FEF170", +"J~ c #F4E46B", +"K~ c #F7E46A", +"L~ c #FFFC75", +"M~ c #847F3B", +"N~ c #4B4621", +"O~ c #FAEB6D", +"P~ c #FFF672", +"Q~ c #B8AD4F", +"R~ c #080703", +"S~ c #938B3F", +"T~ c #F7E368", +"U~ c #F5E065", +"V~ c #F9E366", +"W~ c #F7E566", +"X~ c #928C3E", +"Y~ c #7C7232", +"Z~ c #EEDC5F", +"`~ c #FBE463", +" { c #FCE462", +".{ c #D3C052", +"+{ c #1A180A", +"@{ c #6E6128", +"#{ c #FFE85E", +"${ c #F1D553", +"%{ c #EED150", +"&{ c #F3D54F", +"*{ c #EDCD49", +"={ c #EFCD48", +"-{ c #EECC45", +";{ c #8B7628", +">{ c #1D1808", +",{ c #010100", +"'{ c #101725", +"){ c #4865A2", +"!{ c #373317", +"~{ c #A69C47", +"{{ c #292511", +"]{ c #978F42", +"^{ c #FFFF79", +"/{ c #7D7536", +"({ c #1A180B", +"_{ c #C3BC57", +":{ c #FFFB76", +"<{ c #F8E76D", +"[{ c #FFF675", +"}{ c #B4A950", +"|{ c #9B9547", +"1{ c #FFFF7B", +"2{ c #F8E86E", +"3{ c #FFF676", +"4{ c #ADA74F", +"5{ c #726C33", +"6{ c #FFF274", +"7{ c #F7E66E", +"8{ c #F7E76E", +"9{ c #F7E66D", +"0{ c #F9EA6F", +"a{ c #EDE06A", +"b{ c #8E863F", +"c{ c #EBDB66", +"d{ c #FFFC77", +"e{ c #A19746", +"f{ c #746E33", +"g{ c #FDEC6D", +"h{ c #FBE76A", +"i{ c #F6E167", +"j{ c #FCE96A", +"k{ c #D1C057", +"l{ c #A59845", +"m{ c #EFDD63", +"n{ c #FDE866", +"o{ c #F3DC60", +"p{ c #FDE563", +"q{ c #E3CE59", +"r{ c #282410", +"s{ c #5C5322", +"t{ c #FFE75F", +"u{ c #F3D958", +"v{ c #F1D455", +"w{ c #FADD57", +"x{ c #C0A841", +"y{ c #998633", +"z{ c #ECCD4B", +"A{ c #EFCD49", +"B{ c #F5D148", +"C{ c #DDBD3E", +"D{ c #73621F", +"E{ c #171305", +"F{ c #070703", +"G{ c #151D2F", +"H{ c #324771", +"I{ c #131B2B", +"J{ c #3F391A", +"K{ c #CBC65C", +"L{ c #373217", +"M{ c #5A5227", +"N{ c #FFFC76", +"O{ c #F5EF70", +"P{ c #575227", +"Q{ c #342F17", +"R{ c #E6E26C", +"S{ c #FFF877", +"T{ c #FFF576", +"U{ c #CFC35E", +"V{ c #3D391B", +"W{ c #E4DC6B", +"X{ c #FFF778", +"Y{ c #FBEC73", +"Z{ c #E4D868", +"`{ c #E9DC6A", +" ] c #FCED73", +".] c #F8E970", +"+] c #F7E870", +"@] c #FBEB72", +"#] c #FFF174", +"$] c #FCEC70", +"%] c #FBEF72", +"&] c #837C3C", +"*] c #1F1C0D", +"=] c #69622E", +"-] c #EBDE68", +";] c #FDEB6E", +">] c #F6E369", +",] c #F5E269", +"'] c #F8E46A", +")] c #FFEA6B", +"!] c #F8E266", +"~] c #F4DF63", +"{] c #FEE867", +"]] c #E4D05B", +"^] c #1E1B0C", +"/] c #403B19", +"(] c #F8E05F", +"_] c #F7DE5C", +":] c #F6DB5A", +"<] c #FDE35C", +"[] c #4F451C", +"}] c #6D6025", +"|] c #FCDD55", +"1] c #ECCE4D", +"2] c #ECCC4B", +"3] c #EDCB48", +"4] c #F1CE47", +"5] c #FAD547", +"6] c #BFA435", +"7] c #5A4B17", +"8] c #12161A", +"9] c #040301", +"0] c #101623", +"a] c #364C7A", +"b] c #221E0D", +"c] c #554D22", +"d] c #17150A", +"e] c #484520", +"f] c #D6CA5D", +"g] c #FDF472", +"h] c #555126", +"i] c #484320", +"j] c #FFF072", +"k] c #FFF876", +"l] c #E0DC69", +"m] c #535127", +"n] c #5D5A2B", +"o] c #E9E06D", +"p] c #FFFB79", +"q] c #E0D869", +"r] c #2E2D16", +"s] c #807B3C", +"t] c #FFFB7C", +"u] c #FCED74", +"v] c #FFF075", +"w] c #FEF175", +"x] c #F8E973", +"y] c #F9EA73", +"z] c #F9EA72", +"A] c #F8E972", +"B] c #F8E871", +"C] c #FFF677", +"D] c #D8D266", +"E] c #4F4B24", +"F] c #8B8640", +"G] c #534F25", +"H] c #BCB254", +"I] c #FFF172", +"J] c #F8E66B", +"K] c #F6E56B", +"L] c #F6E56A", +"M] c #F5E267", +"N] c #F5E066", +"O] c #FEE868", +"P] c #EBD760", +"Q] c #373417", +"R] c #3C3617", +"S] c #EAD55C", +"T] c #FCE361", +"U] c #FFE460", +"V] c #9C8D3A", +"W] c #1A170A", +"X] c #B9A441", +"Y] c #FCDD56", +"Z] c #EED050", +"`] c #EDCF4E", +" ^ c #EDCE4C", +".^ c #EBCA48", +"+^ c #EAC945", +"@^ c #FFE44C", +"#^ c #E4C13E", +"$^ c #211C09", +"%^ c #2A230A", +"&^ c #31280B", +"*^ c #1F2D48", +"=^ c #171A1C", +"-^ c #9C903F", +";^ c #BDAF4E", +">^ c #47411D", +",^ c #24200F", +"'^ c #857D3A", +")^ c #F0E56B", +"!^ c #F7E36B", +"~^ c #FDF575", +"{^ c #87823D", +"]^ c #413E1E", +"^^ c #FBEF73", +"/^ c #FDEC72", +"(^ c #FFF879", +"_^ c #EEEC72", +":^ c #6E6B35", +"<^ c #908A44", +"[^ c #FAF578", +"}^ c #F3ED75", +"|^ c #666030", +"1^ c #242311", +"2^ c #484422", +"3^ c #D3CE66", +"4^ c #FFF97C", +"5^ c #FAEA75", +"6^ c #F9EA74", +"7^ c #FAEC75", +"8^ c #FAEA74", +"9^ c #FAEB73", +"0^ c #FFFC7C", +"a^ c #B5AC55", +"b^ c #302F17", +"c^ c #C5C25F", +"d^ c #454320", +"e^ c #8A823E", +"f^ c #FAE970", +"g^ c #F8E66E", +"h^ c #F6E76C", +"i^ c #F7E56A", +"j^ c #F6E46A", +"k^ c #F7E367", +"l^ c #F8E466", +"m^ c #C6B852", +"n^ c #B8A84B", +"o^ c #EED85F", +"p^ c #FFF369", +"q^ c #C0B04B", +"r^ c #0D0B06", +"s^ c #393315", +"t^ c #F1D858", +"u^ c #F6D956", +"v^ c #F0D452", +"w^ c #EED04E", +"x^ c #EBCC4B", +"y^ c #F3D14B", +"z^ c #F9D549", +"A^ c #837026", +"B^ c #2C240B", +"C^ c #806B20", +"D^ c #2B240A", +"E^ c #334974", +"F^ c #151D30", +"G^ c #4C6BAA", +"H^ c #0C111B", +"I^ c #1E1A0A", +"J^ c #5F5320", +"K^ c #1A1A10", +"L^ c #1D2A42", +"M^ c #48421D", +"N^ c #FAE86A", +"O^ c #E8E068", +"P^ c #D0C65B", +"Q^ c #DDD362", +"R^ c #FFF271", +"S^ c #FFF071", +"T^ c #F7E56D", +"U^ c #FFF376", +"V^ c #B9AE54", +"W^ c #3C381C", +"X^ c #EEE470", +"Y^ c #FFF277", +"Z^ c #F8E872", +"`^ c #FFF579", +" / c #F9F178", +"./ c #D1C864", +"+/ c #F8EA75", +"@/ c #FEF87B", +"#/ c #867F40", +"$/ c #5F5C2F", +"%/ c #6B6835", +"&/ c #615D2F", +"*/ c #F1EF79", +"=/ c #FEF27A", +"-/ c #FAEC77", +";/ c #FAED77", +">/ c #FAEC76", +",/ c #FCEF76", +"'/ c #FFFC7D", +")/ c #8D8542", +"!/ c #2B2A15", +"~/ c #E3E06F", +"{/ c #5D5B2D", +"]/ c #5F5A2C", +"^/ c #F7F376", +"// c #F8E86F", +"(/ c #F6E66C", +"_/ c #FFEF6B", +":/ c #FFED6A", +"</ c #FDED69", +"[/ c #E3D75E", +"}/ c #383516", +"|/ c #857732", +"1/ c #F2D658", +"2/ c #F1D555", +"3/ c #F0D352", +"4/ c #EDD04F", +"5/ c #FADB52", +"6/ c #FCDF51", +"7/ c #706224", +"8/ c #1E1908", +"9/ c #B19733", +"0/ c #7C6922", +"a/ c #030406", +"b/ c #44619A", +"c/ c #020306", +"d/ c #354B78", +"e/ c #131518", +"f/ c #756729", +"g/ c #B9A643", +"h/ c #47401C", +"i/ c #0A0805", +"j/ c #C2B453", +"k/ c #FFF572", +"l/ c #FFF372", +"m/ c #FBE96F", +"n/ c #F7E66F", +"o/ c #F8E870", +"p/ c #F8E971", +"q/ c #FFF578", +"r/ c #B9AE55", +"s/ c #312E16", +"t/ c #E8E06F", +"u/ c #FFF67B", +"v/ c #F9EA75", +"w/ c #FFF279", +"x/ c #FFF77D", +"y/ c #FFFB7E", +"z/ c #AEAB55", +"A/ c #625F30", +"B/ c #A59F51", +"C/ c #262412", +"D/ c #B9B75C", +"E/ c #FFFF81", +"F/ c #FBEF78", +"G/ c #FBEF79", +"H/ c #FBED78", +"I/ c #FBED77", +"J/ c #FBEC77", +"K/ c #FBF97D", +"L/ c #696734", +"M/ c #3E3A1C", +"N/ c #FDFC82", +"O/ c #8A8847", +"P/ c #322E17", +"Q/ c #E9E570", +"R/ c #F8E76E", +"S/ c #F7E66C", +"T/ c #F6E36A", +"U/ c #FAE668", +"V/ c #FFF56E", +"W/ c #6D642D", +"X/ c #0F0E07", +"Y/ c #141308", +"Z/ c #A79841", +"`/ c #FFEB63", +" ( c #F1D658", +".( c #F3D756", +"+( c #FEE559", +"@( c #DAC24A", +"#( c #5C511E", +"$( c #2E280F", +"%( c #B7A038", +"&( c #EED348", +"*( c #3E3512", +"=( c #403510", +"-( c #3F3411", +";( c #000001", +">( c #425D94", +",( c #101624", +"'( c #334773", +")( c #877934", +"!( c #E3CF56", +"~( c #6E662B", +"{( c #101319", +"]( c #A79C49", +"^( c #FFF170", +"/( c #FAEA70", +"(( c #FEF074", +"_( c #FAEB72", +":( c #D2C663", +"<( c #6C6733", +"[( c #EFE672", +"}( c #FFF37B", +"|( c #F9EB76", +"1( c #FBEE78", +"2( c #FBED79", +"3( c #FFFC80", +"4( c #CDCA66", +"5( c #534F29", +"6( c #CAC566", +"7( c #636031", +"8( c #403E1F", +"9( c #ECE876", +"0( c #FFFA7F", +"a( c #FBEF7A", +"b( c #FBEE79", +"c( c #ECEC79", +"d( c #484724", +"e( c #6F6935", +"f( c #FFFF85", +"g( c #E3DD6F", +"h( c #333118", +"i( c #ADA854", +"j( c #FDED74", +"k( c #FBEC72", +"l( c #F8E56B", +"m( c #FFF471", +"n( c #ABA049", +"o( c #18140A", +"p( c #6F662E", +"q( c #302D13", +"r( c #B9A94A", +"s( c #E9D054", +"t( c #9A8B37", +"u( c #353012", +"v( c #483F18", +"w( c #C9AF41", +"x( c #FFEF56", +"y( c #C6AC3D", +"z( c #131005", +"A( c #A2892C", +"B( c #CDAE37", +"C( c #191506", +"D( c #080601", +"E( c #080602", +"F( c #2C3E65", +"G( c #050504", +"H( c #817531", +"I( c #F5F168", +"J( c #A59B44", +"K( c #1D1A0E", +"L( c #18150A", +"M( c #CEC05A", +"N( c #F9EA71", +"O( c #EFE16C", +"P( c #EDE56F", +"Q( c #FFF477", +"R( c #FBEC75", +"S( c #FAEB75", +"T( c #FAED76", +"U( c #F7EC76", +"V( c #FBEE7A", +"W( c #FFFB80", +"X( c #DAD56D", +"Y( c #58542B", +"Z( c #BEBD65", +"`( c #DDDA73", +" _ c #1A190D", +"._ c #807C40", +"+_ c #FFFF86", +"@_ c #FCF27C", +"#_ c #FBF07B", +"$_ c #FCF07B", +"%_ c #FDF17B", +"&_ c #FFFD81", +"*_ c #C6C162", +"=_ c #4F4C26", +"-_ c #DCD96D", +";_ c #FFF67C", +">_ c #FFFF80", +",_ c #74723A", +"'_ c #4F4A25", +")_ c #F3EE78", +"!_ c #FDEF77", +"~_ c #F2E670", +"{_ c #EEE06E", +"]_ c #FFF976", +"^_ c #D2CE60", +"/_ c #1D190C", +"(_ c #6C672E", +"__ c #BCB150", +":_ c #332E15", +"<_ c #D2BF55", +"[_ c #FFE765", +"}_ c #FBE363", +"|_ c #E4CE58", +"1_ c #685E28", +"2_ c #4B431C", +"3_ c #B09E3E", +"4_ c #F3D753", +"5_ c #FBDC54", +"6_ c #FFE253", +"7_ c #8E7B2C", +"8_ c #201B0A", +"9_ c #CFB13B", +"0_ c #FFE149", +"a_ c #8B7524", +"b_ c #070603", +"c_ c #0F1522", +"d_ c #050402", +"e_ c #332907", +"f_ c #5C490E", +"g_ c #171204", +"h_ c #030303", +"i_ c #796E30", +"j_ c #FCF66F", +"k_ c #CFCA5A", +"l_ c #5D5527", +"m_ c #0A0D10", +"n_ c #0C0E0C", +"o_ c #9B9245", +"p_ c #FDEC70", +"q_ c #F9E970", +"r_ c #FFF779", +"s_ c #C4BD5C", +"t_ c #514C26", +"u_ c #BEBB5D", +"v_ c #FFFF82", +"w_ c #FCEE76", +"x_ c #FEF079", +"y_ c #FAEF79", +"z_ c #FBEF7B", +"A_ c #FFFA81", +"B_ c #E2E074", +"C_ c #5F5C31", +"D_ c #AFAB58", +"E_ c #FFFF8C", +"F_ c #8D8D49", +"G_ c #18180D", +"H_ c #9B994F", +"I_ c #FCF17D", +"J_ c #FCF07C", +"K_ c #FDF47D", +"L_ c #FFFB81", +"M_ c #FFF47E", +"N_ c #F9F67F", +"O_ c #8D8B47", +"P_ c #888545", +"Q_ c #FFFF84", +"R_ c #FEF47C", +"S_ c #DED66D", +"T_ c #8C8643", +"U_ c #E7DB6E", +"V_ c #FFF47A", +"W_ c #969148", +"X_ c #A69B4D", +"Y_ c #FFF678", +"Z_ c #F9E971", +"`_ c #FFF977", +" : c #E8E06A", +".: c #403C1D", +"+: c #383418", +"@: c #E4E06B", +"#: c #AAA54C", +"$: c #2C2912", +"%: c #E1CF5C", +"&: c #FFE867", +"*: c #F8E162", +"=: c #DEC857", +"-: c #C8B54D", +";: c #F3DA5A", +">: c #FFE55E", +",: c #F2D656", +"': c #F7D955", +"): c #F1D350", +"!: c #463D17", +"~: c #504518", +"{: c #F5D24A", +"]: c #F3CF45", +"^: c #F5CE42", +"/: c #76631F", +"(: c #0A0904", +"_: c #0A0902", +":: c #322809", +"<: c #9B7A18", +"[: c #A58419", +"}: c #362B08", +"|: c #746C31", +"1: c #F9F570", +"2: c #FCF06F", +"3: c #8A813D", +"4: c #2A2712", +"5: c #151509", +"6: c #908740", +"7: c #DEDD6B", +"8: c #FFFD7B", +"9: c #FFFA79", +"0: c #FFFF7E", +"a: c #E4E16F", +"b: c #2B2914", +"c: c #2A2A15", +"d: c #CAC462", +"e: c #FEF47B", +"f: c #FCF17C", +"g: c #FCF07D", +"h: c #FFFB82", +"i: c #E2E076", +"j: c #656235", +"k: c #B2AE5A", +"l: c #FFFF89", +"m: c #827F42", +"n: c #58562D", +"o: c #FAF27E", +"p: c #FEF37F", +"q: c #FFF881", +"r: c #E2DD73", +"s: c #C3BD62", +"t: c #F8EE7C", +"u: c #F9F27D", +"v: c #C1BB61", +"w: c #DCD46E", +"x: c #FEF87F", +"y: c #FFF67E", +"z: c #FFF77F", +"A: c #FAED78", +"B: c #E8E673", +"C: c #3E3B1E", +"D: c #928B45", +"E: c #FFFD7E", +"F: c #FAEA73", +"G: c #FDF075", +"H: c #DFDB6A", +"I: c #65612E", +"J: c #464220", +"K: c #D7CE61", +"L: c #FFFF7D", +"M: c #908B41", +"N: c #ECDA62", +"O: c #FCE668", +"P: c #F3DD62", +"Q: c #FFE763", +"R: c #F7DE5E", +"S: c #F0D659", +"T: c #F0D657", +"U: c #FDE058", +"V: c #DDC34C", +"W: c #2C270E", +"X: c #816F28", +"Y: c #FFDF50", +"Z: c #E9C745", +"`: c #F0CC44", +" < c #ECC63F", +".< c #927925", +"+< c #655318", +"@< c #6E5B18", +"#< c #91771E", +"$< c #E2B528", +"%< c #DEB024", +"&< c #392E09", +"*< c #192439", +"=< c #354B77", +"-< c #70672F", +";< c #EEE96C", +">< c #FFFF7A", +",< c #D5CD61", +"'< c #65602E", +")< c #131309", +"!< c #2E2915", +"~< c #8F8D45", +"{< c #D0CC64", +"]< c #F4F077", +"^< c #FFFF83", +"/< c #A4A04E", +"(< c #242312", +"_< c #BAB85F", +":< c #FFF77E", +"<< c #FCF17E", +"[< c #FFFD84", +"}< c #DEDC73", +"|< c #6C6A38", +"1< c #BFBF65", +"2< c #FFFF87", +"3< c #FEF580", +"4< c #FFFC83", +"5< c #EAE779", +"6< c #FAF17E", +"7< c #FDF27E", +"8< c #FFFF88", +"9< c #BABA62", +"0< c #3E3B1F", +"a< c #D5D36E", +"b< c #FFFB83", +"c< c #FFFA82", +"d< c #FFF880", +"e< c #FBF17B", +"f< c #FDF17C", +"g< c #C1BF61", +"h< c #0D0C06", +"i< c #A29E4F", +"j< c #FBEC74", +"k< c #FDEF76", +"l< c #B0A651", +"m< c #817B3D", +"n< c #F2E970", +"o< c #FFF273", +"p< c #FFFE77", +"q< c #7E7A39", +"r< c #4B4520", +"s< c #F2E66A", +"t< c #F9E468", +"u< c #F4DE62", +"v< c #F1DB5F", +"w< c #F2DB5E", +"x< c #F3DA5C", +"y< c #FFE35B", +"z< c #C9B146", +"A< c #27230D", +"B< c #9E8A33", +"C< c #FFDF52", +"D< c #EAC947", +"E< c #EAC843", +"F< c #EFCA41", +"G< c #F8D040", +"H< c #F7CD3C", +"I< c #FACD38", +"J< c #FECF34", +"K< c #EDC12D", +"L< c #493B0D", +"M< c #090C14", +"N< c #3A5284", +"O< c #3A5384", +"P< c #2C3E62", +"Q< c #68622E", +"R< c #FBF474", +"S< c #FFFC79", +"T< c #F9F075", +"U< c #C2C35F", +"V< c #706D36", +"W< c #312D16", +"X< c #292714", +"Y< c #5B582D", +"Z< c #D1CD67", +"`< c #F9F986", +" [ c #666434", +".[ c #A19D52", +"+[ c #FCEF7C", +"@[ c #FCF27E", +"#[ c #FCF27F", +"$[ c #FCF37F", +"%[ c #FFFC84", +"&[ c #8C8A48", +"*[ c #E1E277", +"=[ c #FFFD86", +"-[ c #FCF17F", +";[ c #FEF681", +">[ c #FFFD85", +",[ c #FDF480", +"'[ c #FDF27F", +")[ c #FFFF8A", +"![ c #94924E", +"~[ c #020101", +"{[ c #A4A154", +"][ c #FFFE84", +"^[ c #FDF37F", +"/[ c #FCF27D", +"([ c #FBF07C", +"_[ c #FEF57D", +":[ c #75743B", +"<[ c #B1AC56", +"[[ c #F9EB75", +"}[ c #F0E671", +"|[ c #FFF275", +"1[ c #F7E56E", +"2[ c #7C7739", +"3[ c #534C23", +"4[ c #F3EB6D", +"5[ c #F9E569", +"6[ c #F5E166", +"7[ c #F5DF64", +"8[ c #F4DE61", +"9[ c #F3DA5B", +"0[ c #FFE45E", +"a[ c #BCA644", +"b[ c #302B11", +"c[ c #BBA43E", +"d[ c #FEDE53", +"e[ c #ECCB49", +"f[ c #ECCA46", +"g[ c #EBC842", +"h[ c #EAC540", +"i[ c #E9C33B", +"j[ c #E4BD36", +"k[ c #FFD839", +"l[ c #AC8C24", +"m[ c #0E131E", +"n[ c #192438", +"o[ c #344A77", +"p[ c #827B3B", +"q[ c #FFF777", +"r[ c #FFF577", +"s[ c #D7D068", +"t[ c #A19B4F", +"u[ c #999149", +"v[ c #D5CB67", +"w[ c #FFFD87", +"x[ c #E5DF73", +"y[ c #333119", +"z[ c #0C0B05", +"A[ c #121109", +"B[ c #666535", +"C[ c #E6E578", +"D[ c #FFF982", +"E[ c #FDF47F", +"F[ c #FFF882", +"G[ c #EFE87A", +"H[ c #E2DB73", +"I[ c #FCF682", +"J[ c #FEF682", +"K[ c #FDF481", +"L[ c #FCF381", +"M[ c #FCF380", +"N[ c #FDF381", +"O[ c #FFFA84", +"P[ c #F8F581", +"Q[ c #605E32", +"R[ c #020301", +"S[ c #6A6836", +"T[ c #FAF983", +"U[ c #A8A656", +"V[ c #3C381D", +"W[ c #58542C", +"X[ c #ABA654", +"Y[ c #FFFD80", +"Z[ c #FBEE77", +"`[ c #FFF379", +" } c #F9E973", +".} c #FFFF7C", +"+} c #7B7739", +"@} c #6F6931", +"#} c #F7F06F", +"$} c #F4E064", +"%} c #F3DC5F", +"&} c #F4DB5D", +"*} c #FFE560", +"=} c #B3A043", +"-} c #3D3616", +";} c #D4BB48", +">} c #FBDC53", +",} c #EBC843", +"'} c #F2CB40", +")} c #B7982E", +"!} c #89701E", +"~} c #4D3F11", +"{} c #110F08", +"]} c #B4AC54", +"^} c #FCED75", +"/} c #FEF078", +"(} c #FFFA7D", +"_} c #FFFD7F", +":} c #FFFA7E", +"<} c #FEF27C", +"[} c #B6B55D", +"}} c #282614", +"|} c #6D6B39", +"1} c #2F2E19", +"2} c #303019", +"3} c #9E9D53", +"4} c #D6D26E", +"5} c #E5E076", +"6} c #F8F27F", +"7} c #FEF984", +"8} c #E1DC74", +"9} c #C7C468", +"0} c #FFFA85", +"a} c #FFFB85", +"b} c #FEF581", +"c} c #FDF482", +"d} c #FDF582", +"e} c #C8C76B", +"f} c #3C3B20", +"g} c #716E3A", +"h} c #52502A", +"i} c #EFEC7E", +"j} c #FEF680", +"k} c #FCF47F", +"l} c #A8A758", +"m} c #2F2E18", +"n} c #9F9C54", +"o} c #B6B360", +"p} c #E4E274", +"q} c #FEF87E", +"r} c #FAEC74", +"s} c #83823F", +"t} c #787337", +"u} c #F7F272", +"v} c #F7E56B", +"w} c #F9E76B", +"x} c #F9E668", +"y} c #FBE260", +"z} c #C2AF49", +"A} c #877931", +"B} c #EDD153", +"C} c #F4D752", +"D} c #EDD04E", +"E} c #EFCF4B", +"F} c #EAC844", +"G} c #F6D042", +"H} c #D7B537", +"I} c #3E330F", +"J} c #020201", +"K} c #415C92", +"L} c #121A29", +"M} c #080704", +"N} c #191A13", +"O} c #1C2534", +"P} c #334873", +"Q} c #C3C160", +"R} c #FAEB76", +"S} c #FCF079", +"T} c #FCF17B", +"U} c #FDF37E", +"V} c #74733C", +"W} c #898548", +"X} c #E4E47F", +"Y} c #72703C", +"Z} c #262514", +"`} c #1E1C10", +" | c #524F2A", +".| c #DDDA75", +"+| c #FFFF8E", +"@| c #A1A055", +"#| c #201F10", +"$| c #BEBD67", +"%| c #FFFF8D", +"&| c #FFF784", +"*| c #FEFE8D", +"=| c #7D7B44", +"-| c #302E19", +";| c #E2E07D", +">| c #57562F", +",| c #989751", +"'| c #EFEA7B", +")| c #686535", +"!| c #878546", +"~| c #FEFD92", +"{| c #CFCE6F", +"]| c #252312", +"^| c #A29F52", +"/| c #FAE974", +"(| c #ACA652", +"_| c #837B3B", +":| c #F5ED71", +"<| c #F7E96D", +"[| c #EBD864", +"}| c #F6E267", +"|| c #F6E165", +"1| c #F3DE60", +"2| c #F1DA5C", +"3| c #F7D952", +"4| c #F1D24D", +"5| c #EAC949", +"6| c #ECC946", +"7| c #EECB43", +"8| c #FDD542", +"9| c #7A661F", +"0| c #324670", +"a| c #182337", +"b| c #7D7231", +"c| c #9F953F", +"d| c #15171B", +"e| c #0D131C", +"f| c #343218", +"g| c #6C6830", +"h| c #736E35", +"i| c #555228", +"j| c #141309", +"k| c #4C4925", +"l| c #EDEC77", +"m| c #FFF97E", +"n| c #EDEB7B", +"o| c #454223", +"p| c #C6C46A", +"q| c #DEDB72", +"r| c #C7C367", +"s| c #D0CC6B", +"t| c #F5EF80", +"u| c #C2C269", +"v| c #2F2F1A", +"w| c #D9D978", +"x| c #FFFF90", +"y| c #FDF583", +"z| c #FFFB87", +"A| c #F8F787", +"B| c #5A5930", +"C| c #7F7C42", +"D| c #FFFF96", +"E| c #9E9D57", +"F| c #37361D", +"G| c #DAD975", +"H| c #FFFE87", +"I| c #FDF380", +"J| c #F5F17E", +"K| c #F2EE7C", +"L| c #77753D", +"M| c #A8A455", +"N| c #FDF27C", +"O| c #FBED76", +"P| c #F3E370", +"Q| c #ECDF6D", +"R| c #FFF375", +"S| c #F4EA6F", +"T| c #A39947", +"U| c #FFF571", +"V| c #F4DD5E", +"W| c #F5DB5C", +"X| c #F5DA59", +"Y| c #E6CB4F", +"Z| c #83712A", +"`| c #D5B843", +" 1 c #F2D049", +".1 c #FDD645", +"+1 c #C6A633", +"@1 c #201C08", +"#1 c #2E2912", +"$1 c #B7A949", +"%1 c #F3E463", +"&1 c #A79F47", +"*1 c #7B7234", +"=1 c #645C2B", +"-1 c #645D2B", +";1 c #8E873F", +">1 c #E3D866", +",1 c #FFFA7A", +"'1 c #FBF376", +")1 c #C6C261", +"!1 c #616131", +"~1 c #858242", +"{1 c #FCF97F", +"]1 c #FEF37C", +"^1 c #FFFE88", +"/1 c #77743E", +"(1 c #5B5930", +"_1 c #FEF683", +":1 c #DBDA75", +"<1 c #37341D", +"[1 c #3F3E22", +"}1 c #605F33", +"|1 c #D6D675", +"11 c #FFFC86", +"21 c #FDF483", +"31 c #FEF785", +"41 c #FEF886", +"51 c #BFBC65", +"61 c #D9D572", +"71 c #FFFD8A", +"81 c #F1EC7E", +"91 c #92914F", +"01 c #C3BF68", +"a1 c #FEFD88", +"b1 c #FFF782", +"c1 c #FFF681", +"d1 c #FDF781", +"e1 c #FFF479", +"f1 c #FBFB7B", +"g1 c #86823E", +"h1 c #211E0E", +"i1 c #D3CC5F", +"j1 c #F4DF66", +"k1 c #F3DD61", +"l1 c #FCE661", +"m1 c #FFE961", +"n1 c #4B421B", +"o1 c #8D7E30", +"p1 c #F0D24D", +"q1 c #EECE4A", +"r1 c #F0CC43", +"s1 c #FAD342", +"t1 c #67551A", +"u1 c #141108", +"v1 c #B6AD4D", +"w1 c #FFFF73", +"x1 c #FFF773", +"y1 c #FDEE72", +"z1 c #F9E872", +"A1 c #FFFE80", +"B1 c #FEFC81", +"C1 c #615C2E", +"D1 c #57532A", +"E1 c #F0EB77", +"F1 c #FFF87F", +"G1 c #FCF37E", +"H1 c #DBD874", +"I1 c #52502B", +"J1 c #E3E279", +"K1 c #FFFC88", +"L1 c #E3E27A", +"M1 c #615F33", +"N1 c #CFCD70", +"O1 c #807E47", +"P1 c #4E4D2A", +"Q1 c #9D9B55", +"R1 c #E6E179", +"S1 c #FEF986", +"T1 c #FEF685", +"U1 c #FFF886", +"V1 c #FFFA86", +"W1 c #FCF583", +"X1 c #FCF481", +"Y1 c #FCF581", +"Z1 c #FBF27D", +"`1 c #FBF17D", +" 2 c #FDF079", +".2 c #FEFA7C", +"+2 c #C7C461", +"@2 c #6F6C35", +"#2 c #0A0A05", +"$2 c #615D2C", +"%2 c #FFF875", +"&2 c #FAE66B", +"*2 c #F5E167", +"=2 c #F4DF62", +"-2 c #FFEE67", +";2 c #EDDC5F", +">2 c #857731", +",2 c #040302", +"'2 c #070602", +")2 c #E2CC4F", +"!2 c #FBDE54", +"~2 c #ECCB48", +"{2 c #E8C643", +"]2 c #FFDA45", +"^2 c #AC902C", +"/2 c #1E1B0D", +"(2 c #D4C358", +"_2 c #FFED6E", +":2 c #F8E66C", +"<2 c #F9EB73", +"[2 c #FFF87D", +"}2 c #E3DD70", +"|2 c #CCC565", +"12 c #F6EC79", +"22 c #FEF37D", +"32 c #FFFB84", +"42 c #FEF582", +"52 c #FFF581", +"62 c #F9F885", +"72 c #828045", +"82 c #989753", +"92 c #FFFF8F", +"02 c #FEF583", +"a2 c #FFFB86", +"b2 c #EAEA82", +"c2 c #5F5D32", +"d2 c #B3B263", +"e2 c #FFFF99", +"f2 c #B3B363", +"g2 c #666436", +"h2 c #CBC76C", +"i2 c #FFFE8A", +"j2 c #FDF886", +"k2 c #FEF786", +"l2 c #FEF885", +"m2 c #FDF785", +"n2 c #FEF684", +"o2 c #FFF785", +"p2 c #FDF684", +"q2 c #FDF584", +"r2 c #FEF884", +"s2 c #FEF783", +"t2 c #FBF17C", +"u2 c #F6ED79", +"v2 c #BBBB5F", +"w2 c #626131", +"x2 c #1E1C0E", +"y2 c #333018", +"z2 c #343118", +"A2 c #C5BC5A", +"B2 c #F5E36A", +"C2 c #F6E269", +"D2 c #FFF26C", +"E2 c #DFD05B", +"F2 c #48401A", +"G2 c #17160A", +"H2 c #353116", +"I2 c #7C6E2A", +"J2 c #FCDC54", +"K2 c #F0D04E", +"L2 c #EDCB4A", +"M2 c #E9C945", +"N2 c #F7D145", +"O2 c #D5B338", +"P2 c #251F09", +"Q2 c #141D2E", +"R2 c #4C4620", +"S2 c #F2E469", +"T2 c #FBEA6E", +"U2 c #F6E56D", +"V2 c #FAEE78", +"W2 c #F3EC7C", +"X2 c #ECE87B", +"Y2 c #FCF984", +"Z2 c #9E9C53", +"`2 c #8B894A", +" 3 c #EDED86", +".3 c #55532C", +"+3 c #87874B", +"@3 c #FFFF95", +"#3 c #F5F383", +"$3 c #F8F383", +"%3 c #F9F284", +"&3 c #FEF784", +"*3 c #F9F484", +"=3 c #FAF483", +"-3 c #FDF682", +";3 c #FFF780", +">3 c #EAE274", +",3 c #928E48", +"'3 c #7E793D", +")3 c #ABAA56", +"!3 c #ABA855", +"~3 c #676230", +"{3 c #F8ED73", +"]3 c #FBE970", +"^3 c #F6E56C", +"/3 c #FFF36F", +"(3 c #C7BA52", +"_3 c #2B2710", +":3 c #504E28", +"<3 c #C8C767", +"[3 c #E2DF74", +"}3 c #080702", +"|3 c #A99639", +"13 c #FFE557", +"23 c #EDCD4A", +"33 c #ECCB47", +"43 c #ECC943", +"53 c #F6CF42", +"63 c #564716", +"73 c #283859", +"83 c #263655", +"93 c #1D2941", +"03 c #999043", +"a3 c #F8E76F", +"b3 c #FEEF77", +"c3 c #FFF078", +"d3 c #EAE87D", +"e3 c #636133", +"f3 c #7B7A42", +"g3 c #F9F985", +"h3 c #DAD572", +"i3 c #DDDA74", +"j3 c #FFFA87", +"k3 c #F1F088", +"l3 c #5D5C32", +"m3 c #818147", +"n3 c #FFFD89", +"o3 c #FCF685", +"p3 c #FBF584", +"q3 c #F8F283", +"r3 c #F8F07C", +"s3 c #F3F07B", +"t3 c #FFFE7F", +"u3 c #7F7A3D", +"v3 c #6F6A34", +"w3 c #F9E96F", +"x3 c #F7E56C", +"y3 c #CBC259", +"z3 c #636436", +"A3 c #EFEE81", +"B3 c #F1EF7A", +"C3 c #4E4B27", +"D3 c #221D0A", +"E3 c #CEB746", +"F3 c #FADA51", +"G3 c #E9C845", +"H3 c #F9D445", +"I3 c #AA8E2C", +"J3 c #0D131E", +"K3 c #020305", +"L3 c #FCEB71", +"M3 c #F8EA72", +"N3 c #EBE06F", +"O3 c #F2E974", +"P3 c #FFF47C", +"Q3 c #FCFC8B", +"R3 c #9E9E55", +"S3 c #101008", +"T3 c #5B5A30", +"U3 c #E5E57D", +"V3 c #FBF989", +"W3 c #BEBA66", +"X3 c #BCBA66", +"Y3 c #FDF683", +"Z3 c #EDE674", +"`3 c #4B4724", +" 4 c #A6A050", +".4 c #F7E770", +"+4 c #E5DC67", +"@4 c #333016", +"#4 c #656435", +"$4 c #F8F88A", +"%4 c #E7E372", +"&4 c #2C2B14", +"*4 c #F5D751", +"=4 c #F2D24C", +"-4 c #F2CE45", +";4 c #D7B73A", +">4 c #201B09", +",4 c #0A0E17", +"'4 c #344A75", +")4 c #2A3B5E", +"!4 c #010000", +"~4 c #787237", +"{4 c #FFFD79", +"]4 c #ABA754", +"^4 c #312F17", +"/4 c #97944B", +"(4 c #E9E576", +"_4 c #FAF77F", +":4 c #FFFC82", +"<4 c #FFF781", +"[4 c #FDF580", +"}4 c #FFF783", +"|4 c #787742", +"14 c #35341C", +"24 c #BBBA67", +"34 c #FAF98C", +"44 c #FFF885", +"54 c #FEF985", +"64 c #FCF887", +"74 c #FBF17E", +"84 c #FFF37D", +"94 c #E1DD71", +"04 c #78743B", +"a4 c #E1DB6D", +"b4 c #FFF177", +"c4 c #F8E772", +"d4 c #FFF175", +"e4 c #F0E66D", +"f4 c #464520", +"g4 c #4D4821", +"h4 c #F2EE78", +"i4 c #FFFE89", +"j4 c #C4B854", +"k4 c #1C1909", +"l4 c #7E6E2A", +"m4 c #FFDE52", +"n4 c #EDCC48", +"o4 c #EECA45", +"p4 c #E6C43E", +"q4 c #372F0F", +"r4 c #1D1603", +"s4 c #2A2004", +"t4 c #100E07", +"u4 c #B5AD52", +"v4 c #EDE474", +"w4 c #4D4C27", +"x4 c #232312", +"y4 c #6C6836", +"z4 c #9D994F", +"A4 c #DEDD74", +"B4 c #FAFA87", +"C4 c #FFFF8B", +"D4 c #E2E079", +"E4 c #272715", +"F4 c #040403", +"G4 c #403F22", +"H4 c #706F3D", +"I4 c #AEAC60", +"J4 c #E0E07A", +"K4 c #FDFA87", +"L4 c #FFF987", +"M4 c #FAEF7A", +"N4 c #F3E876", +"O4 c #FBEA76", +"P4 c #7B783B", +"Q4 c #0D0A04", +"R4 c #C9B951", +"S4 c #FDF27D", +"T4 c #FFEF6A", +"U4 c #937D2A", +"V4 c #C2AA40", +"W4 c #FFE251", +"X4 c #ECC945", +"Y4 c #EECA42", +"Z4 c #4A3F15", +"`4 c #493B0C", +" 5 c #D0B73C", +".5 c #414021", +"+5 c #374D7B", +"@5 c #262411", +"#5 c #EEE06A", +"$5 c #FAEB74", +"%5 c #FFF47B", +"&5 c #F4F27B", +"*5 c #898746", +"=5 c #1E1D0F", +"-5 c #2C2A16", +";5 c #636234", +">5 c #8F8E4B", +",5 c #B3B25D", +"'5 c #CBCA6E", +")5 c #CACA6E", +"!5 c #BDBD65", +"~5 c #E9E57B", +"{5 c #A4A35A", +"]5 c #292716", +"^5 c #969452", +"/5 c #66663B", +"(5 c #302F19", +"_5 c #72713D", +":5 c #ECED81", +"<5 c #FBEB76", +"[5 c #FFFE7E", +"}5 c #B7B358", +"|5 c #151309", +"15 c #7A6317", +"25 c #FFE357", +"35 c #FFF476", +"45 c #FFEE5F", +"55 c #FACE36", +"65 c #55420A", +"75 c #423B17", +"85 c #EACB4A", +"95 c #F8D74B", +"05 c #F2CE44", +"a5 c #574917", +"b5 c #302910", +"c5 c #FFF776", +"d5 c #DDDC7D", +"e5 c #38371F", +"f5 c #030203", +"g5 c #151D2E", +"h5 c #0B0F16", +"i5 c #FAE871", +"j5 c #C5C466", +"k5 c #2D2C17", +"l5 c #040402", +"m5 c #3F3E20", +"n5 c #434224", +"o5 c #1F1D10", +"p5 c #1C1A0E", +"q5 c #2D2B16", +"r5 c #302F18", +"s5 c #33321A", +"t5 c #C3BF67", +"u5 c #484727", +"v5 c #5F5D34", +"w5 c #FFFF97", +"x5 c #E5E37C", +"y5 c #D1D072", +"z5 c #F1EF83", +"A5 c #F9F67B", +"B5 c #52512C", +"C5 c #3C2C04", +"D5 c #F3C124", +"E5 c #FED440", +"F5 c #ECD75C", +"G5 c #E0D867", +"H5 c #D4D36B", +"I5 c #C9C867", +"J5 c #B9B75D", +"K5 c #ACA64E", +"L5 c #A89C40", +"M5 c #A08825", +"N5 c #C09914", +"O5 c #060400", +"P5 c #84722B", +"Q5 c #FFE150", +"R5 c #FAD649", +"S5 c #5C4E19", +"T5 c #322B0F", +"U5 c #FFF371", +"V5 c #FFFF9D", +"W5 c #C7C770", +"X5 c #202012", +"Y5 c #2E2A11", +"Z5 c #605825", +"`5 c #2F2C15", +" 6 c #0A0B0A", +".6 c #B8B154", +"+6 c #FFFC7E", +"@6 c #FEF27B", +"#6 c #FAEE79", +"$6 c #FDF37C", +"%6 c #D4D473", +"&6 c #424221", +"*6 c #C4C469", +"=6 c #CECD74", +"-6 c #B9B764", +";6 c #AAAA5D", +">6 c #AEAE5F", +",6 c #C7C76E", +"'6 c #F1EE80", +")6 c #FEFA85", +"!6 c #B5B362", +"~6 c #34331B", +"{6 c #E4E37E", +"]6 c #FFFF92", +"^6 c #D5D369", +"/6 c #2E2B16", +"(6 c #58450A", +"_6 c #907214", +":6 c #534106", +"<6 c #382F08", +"[6 c #2B2A14", +"}6 c #252313", +"|6 c #131209", +"16 c #090805", +"26 c #0D0C08", +"36 c #161713", +"46 c #292414", +"56 c #291E00", +"66 c #030200", +"76 c #1D1909", +"86 c #CAAE3D", +"96 c #FFE14E", +"06 c #66561D", +"a6 c #171203", +"b6 c #B9A238", +"c6 c #EAE06E", +"d6 c #FFFC78", +"e6 c #A79637", +"f6 c #110D04", +"g6 c #212E49", +"h6 c #121108", +"i6 c #4C451D", +"j6 c #7F7634", +"k6 c #958F40", +"l6 c #5B5627", +"m6 c #0D0D0C", +"n6 c #5F5B2B", +"o6 c #8B8943", +"p6 c #A09C4C", +"q6 c #BFBD5D", +"r6 c #D9D76B", +"s6 c #E8E574", +"t6 c #F8EE79", +"u6 c #DEDF77", +"v6 c #39381F", +"w6 c #3C3A1F", +"x6 c #EEEE84", +"y6 c #FFFF94", +"z6 c #F0EF82", +"A6 c #3F3D21", +"B6 c #A8A85F", +"C6 c #FDF786", +"D6 c #AEAA55", +"E6 c #0C0A01", +"F6 c #3F4350", +"G6 c #6C6E77", +"H6 c #7C7D87", +"I6 c #8D8E96", +"J6 c #97979E", +"K6 c #99999E", +"L6 c #A0A0A4", +"M6 c #ACADB1", +"N6 c #C2C4CA", +"O6 c #B2B5BF", +"P6 c #31343D", +"Q6 c #62551E", +"R6 c #F4D449", +"S6 c #716020", +"T6 c #000002", +"U6 c #100B00", +"V6 c #2D2504", +"W6 c #544813", +"X6 c #6C5915", +"Y6 c #191303", +"Z6 c #201D0D", +"`6 c #8D833B", +" 7 c #E4DA63", +".7 c #C9BF59", +"+7 c #7F7638", +"@7 c #423E1E", +"#7 c #282512", +"$7 c #121008", +"%7 c #1F1E0E", +"&7 c #323118", +"*7 c #5B5A2E", +"=7 c #CCC465", +"-7 c #FFF67F", +";7 c #DCDC76", +">7 c #2C2A17", +",7 c #656335", +"'7 c #FDFD88", +")7 c #FFF884", +"!7 c #F7F787", +"~7 c #7D7B43", +"{7 c #908E4F", +"]7 c #FEF987", +"^7 c #FEF37E", +"/7 c #FFFE81", +"(7 c #ABA755", +"_7 c #4B4825", +":7 c #1E1E0D", +"<7 c #191B1B", +"[7 c #CCCCCE", +"}7 c #FFFFFF", +"|7 c #F9F9F9", +"17 c #DFDFDF", +"27 c #F6F5F5", +"37 c #B4B5B8", +"47 c #0C0B0A", +"57 c #7A6925", +"67 c #C9AF40", +"77 c #F2CF48", +"87 c #645418", +"97 c #2F333A", +"07 c #A6A9B2", +"a7 c #999CA5", +"b7 c #46464E", +"c7 c #070604", +"d7 c #3A3619", +"e7 c #C6BB57", +"f7 c #FCFA76", +"g7 c #F4EC71", +"h7 c #E7DB6A", +"i7 c #DDD066", +"j7 c #D4C862", +"k7 c #D2C763", +"l7 c #D3C864", +"m7 c #DED86E", +"n7 c #F5EB78", +"o7 c #CAC86B", +"p7 c #1C1A0F", +"q7 c #B5B460", +"r7 c #F7F585", +"s7 c #F6F284", +"t7 c #FCF785", +"u7 c #F1E474", +"v7 c #F0F07D", +"w7 c #6F6F32", +"x7 c #1F1F1C", +"y7 c #D3D4D4", +"z7 c #F6F6F6", +"A7 c #7A7A79", +"B7 c #1E1E1E", +"C7 c #434343", +"D7 c #D5D5D5", +"E7 c #DDDDDF", +"F7 c #232428", +"G7 c #7B6A1F", +"H7 c #FFE555", +"I7 c #FAD74C", +"J7 c #574913", +"K7 c #32343C", +"L7 c #DBDBDB", +"M7 c #E8E8E9", +"N7 c #B4B5B6", +"O7 c #19191B", +"P7 c #3B5485", +"Q7 c #1B190B", +"R7 c #807939", +"S7 c #F7F374", +"T7 c #FFFE7A", +"U7 c #FFF67D", +"V7 c #FCF280", +"W7 c #6C6B3A", +"X7 c #797740", +"Y7 c #FEFE8A", +"Z7 c #FFF683", +"`7 c #FEF887", +" 8 c #F9F585", +".8 c #EAE981", +"+8 c #D8D875", +"@8 c #B8B764", +"#8 c #E8E57D", +"$8 c #FEF07B", +"%8 c #8B8840", +"&8 c #1B1B16", +"*8 c #C4C4C3", +"=8 c #FFFFFE", +"-8 c #C7C7C8", +";8 c #797979", +">8 c #D5D6D7", +",8 c #282A33", +"'8 c #5D5016", +")8 c #FBDB51", +"!8 c #FCDA4D", +"~8 c #5D501A", +"{8 c #060709", +"]8 c #171717", +"^8 c #373737", +"/8 c #A5A5A5", +"(8 c #545454", +"_8 c #0B0F18", +":8 c #64602D", +"<8 c #EADE6C", +"[8 c #FFF97A", +"}8 c #FBEB75", +"|8 c #D3D272", +"18 c #7B7841", +"28 c #F3F082", +"38 c #FFF986", +"48 c #C6C36A", +"58 c #33311A", +"68 c #5A5A33", +"78 c #8B894D", +"88 c #E3E07A", +"98 c #FFFE8C", +"08 c #B3B057", +"a8 c #1D1C0C", +"b8 c #A5A5A4", +"c8 c #C0C0C0", +"d8 c #6E6E6E", +"e8 c #D6D6D6", +"f8 c #282B35", +"g8 c #534815", +"h8 c #F8D950", +"i8 c #FBDA4E", +"j8 c #5B4E1C", +"k8 c #020202", +"l8 c #999999", +"m8 c #7E7E7E", +"n8 c #4D4A24", +"o8 c #E3DD6D", +"p8 c #E2E176", +"q8 c #EFE87B", +"r8 c #FEF883", +"s8 c #FBF482", +"t8 c #C5C066", +"u8 c #F4F081", +"v8 c #FFFC89", +"w8 c #EEED84", +"x8 c #6C6A3C", +"y8 c #737341", +"z8 c #F7F78B", +"A8 c #DAD46D", +"B8 c #B4B15A", +"C8 c #7E7B3F", +"D8 c #19190A", +"E8 c #61625F", +"F8 c #E8E8E4", +"G8 c #EEEEEE", +"H8 c #6E6E6D", +"I8 c #242424", +"J8 c #404040", +"K8 c #C6C6C5", +"L8 c #E0E0E0", +"M8 c #252832", +"N8 c #504614", +"O8 c #F7D850", +"P8 c #FCDA4E", +"Q8 c #564A18", +"R8 c #08080A", +"S8 c #4E4E4F", +"T8 c #666666", +"U8 c #DADADA", +"V8 c #858585", +"W8 c #090D15", +"X8 c #0A0A09", +"Y8 c #100C02", +"Z8 c #0D0A02", +"`8 c #090B0C", +" 9 c #1C2840", +".9 c #151E30", +"+9 c #4B4925", +"@9 c #E8E875", +"#9 c #FEF17C", +"$9 c #F4F584", +"%9 c #91914C", +"&9 c #3F3D1F", +"*9 c #C5C369", +"=9 c #FFF582", +"-9 c #FFFF91", +";9 c #BFBF6A", +">9 c #B4B160", +",9 c #F8F687", +"'9 c #EDED88", +")9 c #5D5D32", +"!9 c #A09E56", +"~9 c #CBC566", +"{9 c #79753B", +"]9 c #4F4C25", +"^9 c #2E2D14", +"/9 c #1A1A11", +"(9 c #424345", +"_9 c #8C8D8D", +":9 c #DADAD8", +"<9 c #F0F0F0", +"[9 c #CBCBCB", +"}9 c #DEDEDE", +"|9 c #DDDDDE", +"19 c #171824", +"29 c #594D17", +"39 c #F9DB52", +"49 c #584B18", +"59 c #0F0F10", +"69 c #BABABB", +"79 c #F8F8F8", +"89 c #828282", +"99 c #020304", +"09 c #243352", +"a9 c #0D121E", +"b9 c #020100", +"c9 c #3A2E0A", +"d9 c #826715", +"e9 c #9F7D17", +"f9 c #AA871A", +"g9 c #AB891B", +"h9 c #A6871F", +"i9 c #9C8021", +"j9 c #7A641D", +"k9 c #24200C", +"l9 c #0D0D06", +"m9 c #736F36", +"n9 c #514E25", +"o9 c #625E2F", +"p9 c #F6F57C", +"q9 c #FEF77E", +"r9 c #3F3F22", +"s9 c #777741", +"t9 c #EAEB7F", +"u9 c #D8D775", +"v9 c #A1A158", +"w9 c #75733E", +"x9 c #5D5C31", +"y9 c #53522C", +"z9 c #50502C", +"A9 c #B5B464", +"B9 c #FDFC8A", +"C9 c #FEFA87", +"D9 c #C8C36A", +"E9 c #FEFB88", +"F9 c #FDF581", +"G9 c #F6F27B", +"H9 c #E6E172", +"I9 c #C6C160", +"J9 c #A19A48", +"K9 c #625C26", +"L9 c #1C1B09", +"M9 c #27282A", +"N9 c #6D6D6D", +"O9 c #CFCFCE", +"P9 c #BABBBD", +"Q9 c #030408", +"R9 c #706322", +"S9 c #FEDD54", +"T9 c #FCDA50", +"U9 c #5E511C", +"V9 c #7C7C7D", +"W9 c #F8F8F7", +"X9 c #5A5A5B", +"Y9 c #0D131F", +"Z9 c #130F04", +"`9 c #B9941D", +" 0 c #FECA28", +".0 c #F1BF24", +"+0 c #F6C528", +"@0 c #FACA2F", +"#0 c #F9CC35", +"$0 c #F6CB39", +"%0 c #CAA933", +"&0 c #67561C", +"*0 c #15181B", +"=0 c #736D34", +"-0 c #FEFB7A", +";0 c #EDED75", +">0 c #807C3E", +",0 c #95924A", +"'0 c #E2DD72", +")0 c #1C1B0E", +"!0 c #3A391E", +"~0 c #A3A257", +"{0 c #E6E279", +"]0 c #7C7B42", +"^0 c #232313", +"/0 c #090804", +"(0 c #33331C", +"_0 c #656437", +":0 c #7D7A42", +"<0 c #CBCB6E", +"[0 c #FDF784", +"}0 c #FFFA80", +"|0 c #C3BC56", +"10 c #5E5924", +"20 c #0B0A00", +"30 c #202025", +"40 c #A7A8A8", +"50 c #F7F7F7", +"60 c #646568", +"70 c #988634", +"80 c #6C5D21", +"90 c #BFC0C2", +"00 c #191816", +"a0 c #362B07", +"b0 c #221C06", +"c0 c #1E2A43", +"d0 c #060401", +"e0 c #5A470D", +"f0 c #E5B522", +"g0 c #FBC726", +"h0 c #F1BF23", +"i0 c #E8B927", +"j0 c #D9B02A", +"k0 c #DDB530", +"l0 c #EBC336", +"m0 c #F8CF3F", +"n0 c #F6D244", +"o0 c #A89030", +"p0 c #1D1B11", +"q0 c #080804", +"r0 c #CBBF5C", +"s0 c #FFF77A", +"t0 c #FDFC7E", +"u0 c #8B8944", +"v0 c #4A4623", +"w0 c #DDDB72", +"x0 c #898745", +"y0 c #15140B", +"z0 c #9E9B54", +"A0 c #F5F586", +"B0 c #F2ED7F", +"C0 c #A7A75A", +"D0 c #5C5A31", +"E0 c #202011", +"F0 c #3A391F", +"G0 c #B2B164", +"H0 c #FEF277", +"I0 c #F6F473", +"J0 c #C0B753", +"K0 c #35310F", +"L0 c #0D0D0E", +"M0 c #A8A8A8", +"N0 c #C5C5C5", +"O0 c #080809", +"P0 c #332D11", +"Q0 c #DEC44E", +"R0 c #FBDE55", +"S0 c #FBDB50", +"T0 c #A28B31", +"U0 c #404043", +"V0 c #EBEBEC", +"W0 c #4C4F59", +"X0 c #413101", +"Y0 c #E1BD2B", +"Z0 c #C4A022", +"`0 c #1F1805", +" a c #5D490E", +".a c #917317", +"+a c #715810", +"@a c #604C10", +"#a c #816919", +"$a c #BC9B29", +"%a c #E7BF36", +"&a c #EAC33B", +"*a c #F0CC42", +"=a c #FED84A", +"-a c #C2A73C", +";a c #383112", +">a c #2E2C15", +",a c #E4DB69", +"'a c #F9E873", +")a c #FEF87C", +"!a c #D9D169", +"~a c #EBE173", +"{a c #DDD66D", +"]a c #BFBA60", +"^a c #ACA959", +"/a c #74733D", +"(a c #3D3C21", +"_a c #8E8A49", +":a c #F8F788", +"<a c #DDDD78", +"[a c #A5A35A", +"}a c #444325", +"|a c #6E6C3C", +"1a c #EDEB81", +"2a c #FBF27E", +"3a c #F9EC76", +"4a c #FCED71", +"5a c #FFF973", +"6a c #E7DE65", +"7a c #57501F", +"8a c #1B1B1C", +"9a c #A4A4A6", +"0a c #454648", +"aa c #9C8E39", +"ba c #FFEB5D", +"ca c #F6D64F", +"da c #E3C445", +"ea c #27220A", +"fa c #131316", +"ga c #38393F", +"ha c #29220D", +"ia c #C39F25", +"ja c #FDD032", +"ka c #FAC72A", +"la c #755C11", +"ma c #281F06", +"na c #9B7B18", +"oa c #C69F22", +"pa c #E5B92C", +"qa c #EEC333", +"ra c #F0C738", +"sa c #F0C93D", +"ta c #F0CB42", +"ua c #F0CD47", +"va c #FFDC4F", +"wa c #CBB241", +"xa c #3C3514", +"ya c #0A0E16", +"za c #534E26", +"Aa c #F0E96F", +"Ba c #FDEF78", +"Ca c #FFF57B", +"Da c #FFF57C", +"Ea c #FFF980", +"Fa c #FFFD83", +"Ga c #FFFE85", +"Ha c #F6F381", +"Ia c #A4A256", +"Ja c #888546", +"Ka c #F4F180", +"La c #D0D176", +"Ma c #39381D", +"Na c #8D8C4C", +"Oa c #FBF380", +"Pa c #F9EC75", +"Qa c #FFF771", +"Ra c #D9CF5D", +"Sa c #25210E", +"Ta c #06070A", +"Ua c #E3CD53", +"Va c #FADE57", +"Wa c #EBCE4E", +"Xa c #F9D850", +"Ya c #F2D64C", +"Za c #4F4317", +"`a c #3A2D0B", +" b c #D8B12F", +".b c #F6C830", +"+b c #F4C32A", +"@b c #C0981D", +"#b c #231B06", +"$b c #B7921C", +"%b c #EDBF29", +"&b c #E7BB2B", +"*b c #E3BA31", +"=b c #E6BF36", +"-b c #E6C13A", +";b c #EBC740", +">b c #EECB46", +",b c #EBCB48", +"'b c #FEE353", +")b c #D9C049", +"!b c #403715", +"~b c #6A6431", +"{b c #F8EE72", +"]b c #FEEF74", +"^b c #FAEB77", +"/b c #FDF97E", +"(b c #F7EF7B", +"_b c #FDF17D", +":b c #FEF47F", +"<b c #FEF482", +"[b c #DCD978", +"}b c #CCC96E", +"|b c #FBF381", +"1b c #FBF27F", +"2b c #FBEF7E", +"3b c #FAED79", +"4b c #F5E46B", +"5b c #F5E067", +"6b c #FFF26D", +"7b c #877E38", +"8b c #1E1B0B", +"9b c #C9B54C", +"0b c #FEE55C", +"ab c #ECD051", +"bb c #F8D952", +"cb c #67581F", +"db c #1B1908", +"eb c #27260C", +"fb c #181808", +"gb c #1E1605", +"hb c #806718", +"ib c #E2B727", +"jb c #FBC826", +"kb c #775D11", +"lb c #131A2A", +"mb c #100D02", +"nb c #52420E", +"ob c #7F6818", +"pb c #80691C", +"qb c #7E681E", +"rb c #7D6820", +"sb c #816D22", +"tb c #CBAD3B", +"ub c #F0CF4A", +"vb c #FDDE55", +"wb c #E2CA50", +"xb c #49411A", +"yb c #6B6430", +"zb c #F7EE72", +"Ab c #FEEE74", +"Bb c #F6F47B", +"Cb c #8A8745", +"Db c #C8C264", +"Eb c #FEF481", +"Fb c #FBF37F", +"Gb c #FAEE7A", +"Hb c #F8EA73", +"Ib c #F7E76D", +"Jb c #F4E167", +"Kb c #FBE868", +"Lb c #DFCF5B", +"Mb c #151409", +"Nb c #544D20", +"Ob c #F2D657", +"Pb c #F5D855", +"Qb c #F6D752", +"Rb c #60521E", +"Sb c #474917", +"Tb c #BBBA3C", +"Ub c #D8D744", +"Vb c #D8D745", +"Wb c #BFBF3E", +"Xb c #676822", +"Yb c #090A04", +"Zb c #493A0B", +"`b c #E2B422", +" c c #C59C1D", +".c c #130E02", +"+c c #4968A5", +"@c c #745F17", +"#c c #C2A52A", +"$c c #B19328", +"%c c #B1942D", +"&c c #AE932F", +"*c c #D2B43D", +"=c c #ECCE4B", +"-c c #FEE359", +";c c #DECB51", +">c c #605925", +",c c #3C3719", +"'c c #6B6330", +")c c #F2E96F", +"!c c #FFEE73", +"~c c #D5D36A", +"{c c #3D3B1E", +"]c c #FFF985", +"^c c #FBF580", +"/c c #F9F07A", +"(c c #F5E368", +"_c c #F8E565", +":c c #3D3A18", +"<c c #4B441C", +"[c c #F5D857", +"}c c #FFEE5D", +"|c c #938032", +"1c c #302F0E", +"2c c #D6D645", +"3c c #FFFF56", +"4c c #FFFF51", +"5c c #FFFF53", +"6c c #ABAC38", +"7c c #101307", +"8c c #735A10", +"9c c #EDBD24", +"0c c #4B3B0B", +"ac c #473B0F", +"bc c #E1BC31", +"cc c #FFD73C", +"dc c #F7CF3F", +"ec c #FBD445", +"fc c #F1CF46", +"gc c #EDCF4C", +"hc c #EFD252", +"ic c #FEE45C", +"jc c #F4DD5C", +"kc c #8B7D36", +"lc c #4D451E", +"mc c #4F4820", +"nc c #72692F", +"oc c #D6D463", +"pc c #7E7938", +"qc c #665E2D", +"rc c #F7F275", +"sc c #EBE571", +"tc c #99984B", +"uc c #353219", +"vc c #36361C", +"wc c #C6C766", +"xc c #F9F483", +"yc c #E5E179", +"zc c #F9F383", +"Ac c #D0D173", +"Bc c #A5A158", +"Cc c #F9F584", +"Dc c #FFFB89", +"Ec c #F7E76F", +"Fc c #F9E566", +"Gc c #4D461E", +"Hc c #302B12", +"Ic c #EBD358", +"Jc c #FFEC5F", +"Kc c #C9B247", +"Lc c #312C11", +"Mc c #ACAD37", +"Nc c #FFFF54", +"Oc c #FDF54C", +"Pc c #FCF44B", +"Qc c #FDF64C", +"Rc c #FEF84C", +"Sc c #FFFB4E", +"Tc c #6B6C23", +"Uc c #2E2206", +"Vc c #F2C125", +"Wc c #A68419", +"Xc c #080701", +"Yc c #5B4A13", +"Zc c #ECC336", +"`c c #F0C83C", +" d c #E8C43F", +".d c #EBC945", +"+d c #ECCA47", +"@d c #EDCE4B", +"#d c #FBE15D", +"$d c #FFE762", +"%d c #EBDB5F", +"&d c #ECDE63", +"*d c #FCEA6A", +"=d c #A29D49", +"-d c #7B7336", +";d c #D4D266", +">d c #9E9D4D", +",d c #39371B", +"'d c #414121", +")d c #D8D26C", +"!d c #FFFE82", +"~d c #FFF57F", +"{d c #FFFE8D", +"]d c #B9B864", +"^d c #5D5930", +"/d c #E7E67E", +"(d c #BBBB6A", +"_d c #51512D", +":d c #B5B467", +"<d c #FCF480", +"[d c #FBF480", +"}d c #FAF07B", +"|d c #F9EE78", +"1d c #F7E565", +"2d c #4A431D", +"3d c #312B12", +"4d c #F3DC5B", +"5d c #F7E35B", +"6d c #53481E", +"7d c #68671E", +"8d c #FDFD50", +"9d c #FCF34C", +"0d c #FFF74D", +"ad c #FEF84D", +"bd c #F7F14B", +"cd c #FBF34A", +"dd c #969630", +"ed c #D2A71F", +"fd c #E5B823", +"gd c #302707", +"hd c #907822", +"id c #FBD23F", +"jd c #F4CE42", +"kd c #F2CF47", +"ld c #F3D049", +"md c #F0CF4B", +"nd c #F0D353", +"od c #F1D656", +"pd c #F1D859", +"qd c #F7DF5F", +"rd c #FCE563", +"sd c #FCE767", +"td c #F9E568", +"ud c #F9E86A", +"vd c #EDDD66", +"wd c #C9BE5A", +"xd c #595628", +"yd c #3A381B", +"zd c #424021", +"Ad c #3B391C", +"Bd c #232010", +"Cd c #76733B", +"Dd c #E8E476", +"Ed c #FEF780", +"Fd c #72723E", +"Gd c #3A381E", +"Hd c #EBEB80", +"Id c #88874B", +"Jd c #1D1C10", +"Kd c #646339", +"Ld c #D5D375", +"Md c #FFFD88", +"Nd c #FCF580", +"Od c #FBF57F", +"Pd c #FBF37E", +"Qd c #FAF17C", +"Rd c #F8EE78", +"Sd c #FCEF78", +"Td c #F6E76D", +"Ud c #F6E46B", +"Vd c #F5E165", +"Wd c #3F3B1A", +"Xd c #4D461D", +"Yd c #FEE760", +"Zd c #74652B", +"`d c #4C4C17", +" e c #EBEC4A", +".e c #FFFF50", +"+e c #FDF44C", +"@e c #FFFC4F", +"#e c #F6F44D", +"$e c #A19E32", +"%e c #BBB839", +"&e c #FEFD4E", +"*e c #FFFF52", +"=e c #939330", +"-e c #191305", +";e c #D0A51F", +">e c #F4C225", +",e c #5C480E", +"'e c #31456E", +")e c #201B07", +"!e c #BE9F30", +"~e c #E2BE3C", +"{e c #D1B23D", +"]e c #D6B63F", +"^e c #F3DA5D", +"/e c #F3DB5F", +"(e c #F4DD63", +"_e c #F9E76C", +":e c #FDEB6F", +"<e c #D7CB60", +"[e c #D9CC64", +"}e c #F4EB73", +"|e c #F5EE76", +"1e c #E7DF70", +"2e c #AAA755", +"3e c #636434", +"4e c #4E4C28", +"5e c #F5EE7B", +"6e c #FFF580", +"7e c #959350", +"8e c #FEFE88", +"9e c #F6F587", +"0e c #D8D676", +"ae c #88894C", +"be c #A8A55A", +"ce c #FBF686", +"de c #FFFB88", +"ee c #FCF683", +"fe c #F9EE79", +"ge c #F7E972", +"he c #F6E66E", +"ie c #F9E466", +"je c #E7D35D", +"ke c #24210F", +"le c #6E642A", +"me c #918338", +"ne c #373511", +"oe c #C3C53D", +"pe c #FEF64D", +"qe c #F9F950", +"re c #757425", +"se c #E8E74A", +"te c #FFFF4E", +"ue c #6B6B23", +"ve c #302305", +"we c #E8B722", +"xe c #F3C125", +"ye c #796113", +"ze c #2E260C", +"Ae c #7E6B22", +"Be c #847226", +"Ce c #907C2B", +"De c #D2B743", +"Ee c #F6D851", +"Fe c #F4E065", +"Ge c #FFEF72", +"He c #FDEE74", +"Ie c #FEEE76", +"Je c #FFFC81", +"Ke c #B0AA57", +"Le c #A3A154", +"Me c #F7EC7B", +"Ne c #312F19", +"Oe c #424123", +"Pe c #EDED82", +"Qe c #FEF584", +"Re c #FEFB8B", +"Se c #FAF484", +"Te c #FCF582", +"Ue c #FBF47F", +"Ve c #FBF47E", +"We c #F8EB75", +"Xe c #F7E970", +"Ye c #F6E66D", +"Ze c #F3DF67", +"`e c #B9AC4B", +" f c #121009", +".f c #231E0D", +"+f c #2E2C0E", +"@f c #BDBE3E", +"#f c #FFFF4F", +"$f c #E7E64A", +"%f c #86872A", +"&f c #4F4E18", +"*f c #D7D745", +"=f c #FFFD51", +"-f c #FFFE50", +";f c #EBEB4A", +">f c #2D2E0F", +",f c #55410A", +"'f c #EDBC23", +")f c #F2BF25", +"!f c #AD8A1B", +"~f c #1B263D", +"{f c #050301", +"]f c #907D28", +"^f c #D1B93D", +"/f c #CEB53E", +"(f c #DBBE45", +"_f c #EBCE4D", +":f c #F2D95C", +"<f c #FBEA6D", +"[f c #F9E972", +"}f c #FCED77", +"|f c #FDEF79", +"1f c #FFFE83", +"2f c #ECEB7C", +"3f c #3C3B1F", +"4f c #252413", +"5f c #D4D371", +"6f c #FBF786", +"7f c #FBF37D", +"8f c #FBF27C", +"9f c #FAEC78", +"0f c #F8EB74", +"af c #F6E26A", +"bf c #FFF06B", +"cf c #766E30", +"df c #212109", +"ef c #C1BF3C", +"ff c #FAF850", +"gf c #EFEE4A", +"hf c #E0E047", +"if c #ABAB36", +"jf c #3B3913", +"kf c #5D5C1D", +"lf c #EAEA4B", +"mf c #FFFB4F", +"nf c #82832A", +"of c #9D7B17", +"pf c #EABA24", +"qf c #EEBD24", +"rf c #CBA11F", +"sf c #2B2206", +"tf c #3F598E", +"uf c #2A240C", +"vf c #A78F2F", +"wf c #B79B36", +"xf c #CEB33F", +"yf c #EBCD4C", +"zf c #F1D352", +"Af c #F0D455", +"Bf c #F2D758", +"Cf c #F2D95B", +"Df c #F7E369", +"Ef c #FDEC6E", +"Ff c #FAE96E", +"Gf c #FAEA72", +"Hf c #FAEE77", +"If c #F8EA76", +"Jf c #FBF07A", +"Kf c #E9E97D", +"Lf c #484525", +"Mf c #222111", +"Nf c #C5C66C", +"Of c #92904E", +"Pf c #BAB864", +"Qf c #FEFC8B", +"Rf c #FBF988", +"Sf c #E2DF7C", +"Tf c #D4D274", +"Uf c #D4D375", +"Vf c #DEDC79", +"Wf c #E4E27C", +"Xf c #F2EF83", +"Yf c #FCFA8A", +"Zf c #E7E47E", +"`f c #BFBD68", +" g c #EDE77E", +".g c #FCF482", +"+g c #FAEF7B", +"@g c #F9ED79", +"#g c #F8EC75", +"$g c #F7E86F", +"%g c #F4E168", +"&g c #FDEB69", +"*g c #EEDB62", +"=g c #302B14", +"-g c #24240A", +";g c #595719", +">g c #514E16", +",g c #464415", +"'g c #28280A", +")g c #8E8D2D", +"!g c #FFFF57", +"~g c #FDFE53", +"{g c #A8A735", +"]g c #0D0E05", +"^g c #55420C", +"/g c #E3B322", +"(g c #E5B523", +"_g c #EDBC24", +":g c #CEA31F", +"<g c #312607", +"[g c #030302", +"}g c #897627", +"|g c #F7D248", +"1g c #EFD04D", +"2g c #F2D85B", +"3g c #FEEE6E", +"4g c #91883F", +"5g c #BBB053", +"6g c #FDF173", +"7g c #FFF377", +"8g c #C8BF5D", +"9g c #81793D", +"0g c #EAE170", +"ag c #FFFD82", +"bg c #E2E277", +"cg c #282715", +"dg c #DCDB7B", +"eg c #FFFF9A", +"fg c #F3F182", +"gg c #CCCC70", +"hg c #C3C26A", +"ig c #C0C06A", +"jg c #D4D575", +"kg c #FAF683", +"lg c #BBBA68", +"mg c #BCBC69", +"ng c #EBE77E", +"og c #A19D56", +"pg c #5A5831", +"qg c #36331C", +"rg c #59562B", +"sg c #5E5B2F", +"tg c #39371D", +"ug c #32311A", +"vg c #616236", +"wg c #747341", +"xg c #7C7C45", +"yg c #737442", +"zg c #4D4D2D", +"Ag c #7E7436", +"Bg c #EDE87A", +"Cg c #FBF280", +"Dg c #FCF07E", +"Eg c #F9EE7A", +"Fg c #F8EC77", +"Gg c #F8EA74", +"Hg c #FFF870", +"Ig c #B3A84B", +"Jg c #0E0D06", +"Kg c #2D2D14", +"Lg c #60602D", +"Mg c #696932", +"Ng c #615F2C", +"Og c #5F5D2A", +"Pg c #22220A", +"Qg c #6F6D22", +"Rg c #6C6C20", +"Sg c #4E4F17", +"Tg c #111105", +"Ug c #0B0801", +"Vg c #BD971D", +"Wg c #E2B322", +"Xg c #EEBC24", +"Yg c #CFA41F", +"Zg c #322707", +"`g c #241E0A", +" h c #DFBE41", +".h c #F4D24A", +"+h c #ECCE4C", +"@h c #F2DA5D", +"#h c #FDEB6C", +"$h c #998F41", +"%h c #CCC05A", +"&h c #7D7639", +"*h c #3F3C1F", +"=h c #F8F178", +"-h c #FFF97F", +";h c #E8E677", +">h c #464423", +",h c #2D2C16", +"'h c #D2CF6C", +")h c #DDDB78", +"!h c #18160C", +"~h c #15130B", +"{h c #434021", +"]h c #D7D474", +"^h c #FAFA92", +"/h c #5D5C33", +"(h c #8F8E4D", +"_h c #FDFC8E", +":h c #E3E37E", +"<h c #504F2C", +"[h c #060604", +"}h c #221F10", +"|h c #8E8C46", +"1h c #C7C564", +"2h c #A39F51", +"3h c #8A8543", +"4h c #5D592C", +"5h c #3C391B", +"6h c #322E15", +"7h c #312D13", +"8h c #403816", +"9h c #816515", +"0h c #E0C040", +"ah c #FFFC8A", +"bh c #F8EB76", +"ch c #FCE86A", +"dh c #F5E868", +"eh c #544E22", +"fh c #757534", +"gh c #FFFF76", +"hh c #FFFE70", +"ih c #F9F86F", +"jh c #D3D362", +"kh c #343419", +"lh c #61612C", +"mh c #66642E", +"nh c #080805", +"oh c #171001", +"ph c #C19A1D", +"qh c #EFBD24", +"rh c #E1B222", +"sh c #CEA41F", +"th c #2A2207", +"uh c #161102", +"vh c #362A09", +"wh c #040200", +"xh c #806F25", +"yh c #FFDD4D", +"zh c #F4D654", +"Ah c #F3DE64", +"Bh c #FEEF6D", +"Ch c #AEA24B", +"Dh c #A09646", +"Eh c #FEF473", +"Fh c #E1DA69", +"Gh c #3A361B", +"Hh c #97954A", +"Ih c #FFFF7F", +"Jh c #FFF97D", +"Kh c #D7D76D", +"Lh c #504F29", +"Mh c #201F0F", +"Nh c #17150B", +"Oh c #3B3C1F", +"Ph c #7B7A41", +"Qh c #9D9C54", +"Rh c #B6B25F", +"Sh c #CBC66C", +"Th c #F5F58B", +"Uh c #89884A", +"Vh c #76743F", +"Wh c #FBFB92", +"Xh c #FFFF93", +"Yh c #FFFE8E", +"Zh c #E2E27F", +"`h c #474827", +" i c #3A371C", +".i c #DAD76E", +"+i c #F5F27C", +"@i c #E5E271", +"#i c #DED364", +"$i c #DCCA57", +"%i c #E4C64B", +"&i c #EFC538", +"*i c #F6C72D", +"=i c #FFEC6A", +"-i c #FDFB8B", +";i c #F9EC77", +">i c #F8E771", +",i c #F8E770", +"'i c #FAE96F", +")i c #FFF671", +"!i c #AFA148", +"~i c #090803", +"{i c #060502", +"]i c #4D4C23", +"^i c #FAF971", +"/i c #FFFF70", +"(i c #FFFC6E", +"_i c #FFFD6F", +":i c #FFFE6F", +"<i c #9D9C46", +"[i c #45421E", +"}i c #F4F470", +"|i c #FAFA77", +"1i c #82833D", +"2i c #B48E1A", +"3i c #F0BE24", +"4i c #F2BF24", +"5i c #B48D1B", +"6i c #070601", +"7i c #4C3E11", +"8i c #DCC646", +"9i c #7B7330", +"0i c #211B09", +"ai c #CAB03E", +"bi c #FEE654", +"ci c #EED04F", +"di c #E1C74D", +"ei c #EFD454", +"fi c #6B642E", +"gi c #3F3A1B", +"hi c #F1EF77", +"ii c #797437", +"ji c #454221", +"ki c #F9F479", +"li c #F1E975", +"mi c #4A4824", +"ni c #201E10", +"oi c #666234", +"pi c #868445", +"qi c #A6A555", +"ri c #D3D06D", +"si c #F0F082", +"ti c #FDFD8A", +"ui c #ADAB60", +"vi c #0A0804", +"wi c #424024", +"xi c #7C7943", +"yi c #87864A", +"zi c #CDCD70", +"Ai c #FDF887", +"Bi c #909051", +"Ci c #C7C363", +"Di c #FFF684", +"Ei c #FEE35E", +"Fi c #C9A124", +"Gi c #74611D", +"Hi c #878548", +"Ii c #EEEB80", +"Ji c #ECE87A", +"Ki c #A6A254", +"Li c #EAE676", +"Mi c #FEF37B", +"Ni c #F5E36B", +"Oi c #FFED6D", +"Pi c #EFE066", +"Qi c #423D1B", +"Ri c #423A19", +"Si c #B1AC4A", +"Ti c #423C1A", +"Ui c #21210E", +"Vi c #E1E163", +"Wi c #FDF66C", +"Xi c #FDF76C", +"Yi c #FDF76B", +"Zi c #D1CE5B", +"`i c #67652D", +" j c #DCDC63", +".j c #202010", +"+j c #876911", +"@j c #EFBE24", +"#j c #E7B723", +"$j c #F0BF25", +"%j c #775E12", +"&j c #857830", +"*j c #FFFD74", +"=j c #F8F37C", +"-j c #60541D", +";j c #BFA73B", +">j c #9E8933", +",j c #C6AE43", +"'j c #F9DB57", +")j c #F3D859", +"!j c #FFF570", +"~j c #736A31", +"{j c #3C381B", +"]j c #AFA750", +"^j c #4B4723", +"/j c #C6C15E", +"(j c #FFFE7C", +"_j c #FDEE75", +":j c #EEE371", +"<j c #97914A", +"[j c #A19C4F", +"}j c #DDD86E", +"|j c #FEFC83", +"1j c #FEFC85", +"2j c #FFF682", +"3j c #DAD774", +"4j c #32301A", +"5j c #464524", +"6j c #676536", +"7j c #EBE67D", +"8j c #E0E07D", +"9j c #36351E", +"0j c #838040", +"aj c #FCE966", +"bj c #AF9736", +"cj c #3A3212", +"dj c #404227", +"ej c #91904F", +"fj c #F1EE81", +"gj c #FCF786", +"hj c #F8F180", +"ij c #E1DB72", +"jj c #DFDD73", +"kj c #726E3A", +"lj c #DCDA6F", +"mj c #F9E870", +"nj c #FAE96C", +"oj c #776F32", +"pj c #D8CB58", +"qj c #FFFF6E", +"rj c #A79640", +"sj c #A8A74A", +"tj c #FFFF74", +"uj c #FDF66B", +"vj c #E2DD61", +"wj c #6B682E", +"xj c #F4F26A", +"yj c #595B2C", +"zj c #493807", +"Aj c #E2B221", +"Bj c #E9B923", +"Cj c #513F0B", +"Dj c #050503", +"Ej c #BBB253", +"Fj c #CDCC70", +"Gj c #746424", +"Hj c #E6D04C", +"Ij c #F4D652", +"Jj c #E6CB51", +"Kj c #F3D85A", +"Lj c #F2DC5F", +"Mj c #F4DC62", +"Nj c #A39A47", +"Oj c #111007", +"Pj c #7B793A", +"Qj c #EAE872", +"Rj c #FBEC76", +"Sj c #FFFC7F", +"Tj c #F3EE79", +"Uj c #FEF27D", +"Vj c #F0EA7C", +"Wj c #E4E078", +"Xj c #979653", +"Yj c #2B2813", +"Zj c #E9E071", +"`j c #FFFA83", +" k c #FDF783", +".k c #ECEB75", +"+k c #827E38", +"@k c #2C2915", +"#k c #9B9B5A", +"$k c #FDFD8E", +"%k c #FAF584", +"&k c #FFFC85", +"*k c #F1EF7F", +"=k c #696737", +"-k c #868444", +";k c #635F31", +">k c #D2CB69", +",k c #F9EB74", +"'k c #F9E66C", +")k c #FFF974", +"!k c #B7B152", +"~k c #9A8D3D", +"{k c #FFF068", +"]k c #FCE261", +"^k c #EBD357", +"/k c #383013", +"(k c #5A5A29", +"_k c #FDF96D", +":k c #FFFA6D", +"<k c #EFEB67", +"[k c #B2AE4C", +"}k c #FCF76C", +"|k c #FFF96D", +"1k c #FFFF75", +"2k c #939342", +"3k c #130F03", +"4k c #BA921B", +"5k c #F4C124", +"6k c #2C2104", +"7k c #2A2813", +"8k c #DCD96A", +"9k c #FCFC8E", +"0k c #7F7F46", +"ak c #050401", +"bk c #8D7C2C", +"ck c #F3E252", +"dk c #9B8833", +"ek c #B6A13F", +"fk c #F4D757", +"gk c #F4D959", +"hk c #F9E063", +"ik c #EEE969", +"jk c #8D893F", +"kk c #0E0C05", +"lk c #3D381B", +"mk c #363218", +"nk c #898541", +"ok c #EFEC73", +"pk c #FFF278", +"qk c #FBE975", +"rk c #A9A252", +"sk c #857E41", +"tk c #FEF47E", +"uk c #B2AE5D", +"vk c #ADA95B", +"wk c #FFFC87", +"xk c #615F35", +"yk c #060402", +"zk c #B3AF53", +"Ak c #DFDD77", +"Bk c #474320", +"Ck c #C5C471", +"Dk c #FFF981", +"Ek c #504F28", +"Fk c #18180B", +"Gk c #B4AE59", +"Hk c #FFF774", +"Ik c #DED362", +"Jk c #2B2512", +"Kk c #6D682E", +"Lk c #FCEC67", +"Mk c #F9DF60", +"Nk c #F3DB5C", +"Ok c #FDE75E", +"Pk c #796B2B", +"Qk c #282812", +"Rk c #EDEA67", +"Sk c #FEF86C", +"Tk c #FFFC6F", +"Uk c #FEF76C", +"Vk c #929140", +"Wk c #010302", +"Xk c #A17D16", +"Yk c #FDC826", +"Zk c #C0991D", +"`k c #554E23", +" l c #F8F172", +".l c #ECEB84", +"+l c #32311C", +"@l c #253554", +"#l c #241F0B", +"$l c #8B762B", +"%l c #AA9437", +"&l c #E1C64C", +"*l c #F4D756", +"=l c #F2D75A", +"-l c #FCE662", +";l c #E5D35C", +">l c #6A612A", +",l c #141209", +"'l c #A7A04A", +")l c #C5C25D", +"!l c #6B6731", +"~l c #292612", +"{l c #6D6833", +"]l c #F0E672", +"^l c #EEE975", +"/l c #232211", +"(l c #54512A", +"_l c #FAF989", +":l c #4C4C29", +"<l c #605D32", +"[l c #D1D073", +"}l c #17170E", +"|l c #655A27", +"1l c #FAF272", +"2l c #FEF67C", +"3l c #E7E67D", +"4l c #3B391F", +"5l c #393921", +"6l c #DCDD82", +"7l c #FFFF98", +"8l c #FBF685", +"9l c #F2EE80", +"0l c #F3EE7F", +"al c #DDDC72", +"bl c #484725", +"cl c #A19A4D", +"dl c #FFF87C", +"el c #FEF070", +"fl c #ECE269", +"gl c #4A4621", +"hl c #E5D860", +"il c #FDED68", +"jl c #F4DA5A", +"kl c #FFE55D", +"ll c #AA953B", +"ml c #1C1B0C", +"nl c #C2C258", +"ol c #FDF86C", +"pl c #FEF96D", +"ql c #777937", +"rl c #0D0A01", +"sl c #C0971B", +"tl c #F3C025", +"ul c #67510F", +"vl c #8B7425", +"wl c #FFEE65", +"xl c #E1DC77", +"yl c #C5C46B", +"zl c #E3E27C", +"Al c #C4BE5E", +"Bl c #2B2610", +"Cl c #86752A", +"Dl c #FFE654", +"El c #F6D852", +"Fl c #F3D654", +"Gl c #F2D757", +"Hl c #F2D759", +"Il c #FFEC64", +"Jl c #C5B54F", +"Kl c #141208", +"Ll c #FFFD77", +"Ml c #FFFD78", +"Nl c #CCC45D", +"Ol c #A1984A", +"Pl c #EEE16F", +"Ql c #7B793C", +"Rl c #A7A453", +"Sl c #D7D674", +"Tl c #858245", +"Ul c #E4E481", +"Vl c #404328", +"Wl c #2E270C", +"Xl c #E7D255", +"Yl c #FFF06F", +"Zl c #FDEF7A", +"`l c #F8F384", +" m c #F4F487", +".m c #605F34", +"+m c #1C1B10", +"@m c #DFDF7C", +"#m c #F9F78E", +"$m c #F3F185", +"%m c #979651", +"&m c #F3EE80", +"*m c #FEFA88", +"=m c #868245", +"-m c #BEBB63", +";m c #FCEF7A", +">m c #FFFB7F", +",m c #DDD76D", +"'m c #E5DA6C", +")m c #FAEA6F", +"!m c #EFE369", +"~m c #5F592A", +"{m c #CABB55", +"]m c #FFF16B", +"^m c #FEE15B", +"/m c #CEB547", +"(m c #191508", +"_m c #8A8A40", +":m c #FFFD6E", +"<m c #F7F66C", +"[m c #42431F", +"}m c #3E2F06", +"|m c #CCA31F", +"1m c #110D02", +"2m c #1E1704", +"3m c #9D7C17", +"4m c #BFA236", +"5m c #F5E669", +"6m c #DED366", +"7m c #80793D", +"8m c #A09847", +"9m c #F2DF5A", +"0m c #C5A62F", +"am c #291F05", +"bm c #46629D", +"cm c #806F28", +"dm c #FDDC50", +"em c #F8D951", +"fm c #ECD050", +"gm c #EACF53", +"hm c #F5DB5A", +"im c #928539", +"jm c #131924", +"km c #13130B", +"lm c #D8C85E", +"mm c #FFEF71", +"nm c #FFF574", +"om c #BFBA5C", +"pm c #111008", +"qm c #5F5E30", +"rm c #F6F47D", +"sm c #FEF882", +"tm c #272514", +"um c #D8D873", +"vm c #FFF583", +"wm c #CDCD72", +"xm c #31321E", +"ym c #130F01", +"zm c #B99B2D", +"Am c #FBDD55", +"Bm c #F6E266", +"Cm c #EEE26E", +"Dm c #E3DA70", +"Em c #E5DF76", +"Fm c #E8E57C", +"Gm c #F5F182", +"Hm c #8C8B4B", +"Im c #111009", +"Jm c #BEBD6A", +"Km c #ACA95B", +"Lm c #56532F", +"Mm c #6E6D3D", +"Nm c #DCDC79", +"Om c #E4E27B", +"Pm c #676435", +"Qm c #A8A55B", +"Rm c #FFF272", +"Sm c #9A9044", +"Tm c #4C4720", +"Um c #CABC55", +"Vm c #FFEF6C", +"Wm c #F5DE61", +"Xm c #F1D758", +"Ym c #F7DB57", +"Zm c #F2D954", +"`m c #4F4419", +" n c #2B2B13", +".n c #DBDB65", +"+n c #FFFE74", +"@n c #CBCB5C", +"#n c #11130B", +"$n c #775B0F", +"%n c #F6C425", +"&n c #67530F", +"*n c #0C0902", +"=n c #302605", +"-n c #392D08", +";n c #B69B30", +">n c #FDDD4E", +",n c #B29D39", +"'n c #A0892D", +")n c #7C6619", +"!n c #665311", +"~n c #1B1503", +"{n c #395180", +"]n c #352C0F", +"^n c #E3CD4A", +"/n c #DFC649", +"(n c #A28E36", +"_n c #E9CF51", +":n c #FEE25C", +"<n c #E7D057", +"[n c #413B19", +"}n c #807938", +"|n c #F6E36C", +"1n c #FFF073", +"2n c #F4ED73", +"3n c #434120", +"4n c #1D1B0E", +"5n c #E5DC6E", +"6n c #F5F07B", +"7n c #DFD76F", +"8n c #F4EB78", +"9n c #FEF47D", +"0n c #FDF17E", +"an c #B8B660", +"bn c #999752", +"cn c #959451", +"dn c #1E2013", +"en c #0E0900", +"fn c #B28C19", +"gn c #CEA627", +"hn c #CBAF40", +"in c #CBBD58", +"jn c #D5CB64", +"kn c #ECE577", +"ln c #FDF681", +"mn c #F9F382", +"nn c #F6F385", +"on c #C2BF67", +"pn c #AFAD5D", +"qn c #1E1E10", +"rn c #7D7D45", +"sn c #9F9F5A", +"tn c #C3C36E", +"un c #FAFA85", +"vn c #BBB964", +"wn c #524F2B", +"xn c #38381E", +"yn c #71703A", +"zn c #FDFB85", +"An c #FDEE76", +"Bn c #F9E86C", +"Cn c #D8C95E", +"Dn c #E9D862", +"En c #FFEE6C", +"Fn c #F0D553", +"Gn c #86853D", +"Hn c #FFFF78", +"In c #FEF86D", +"Jn c #FFFA6C", +"Kn c #FBFA73", +"Ln c #60622F", +"Mn c #0D0901", +"Nn c #9A7B17", +"On c #231A03", +"Pn c #47390E", +"Qn c #382E0C", +"Rn c #251D06", +"Sn c #130E00", +"Tn c #141105", +"Un c #93812E", +"Vn c #96842F", +"Wn c #CFB544", +"Xn c #F3D754", +"Yn c #FFE95D", +"Zn c #B5A242", +"`n c #0B0C10", +" o c #C9BD58", +".o c #FFF473", +"+o c #FFFA77", +"@o c #8F8841", +"#o c #B1AB55", +"$o c #F7F57D", +"%o c #BCB55A", +"&o c #706E37", +"*o c #6E6B36", +"=o c #E1DD70", +"-o c #E4E277", +";o c #3D3C1F", +">o c #54532D", +",o c #FBFA88", +"'o c #FCFB8C", +")o c #9A9854", +"!o c #120A00", +"~o c #BE971C", +"{o c #F7C224", +"]o c #C19A1E", +"^o c #E5C138", +"/o c #B9A33E", +"(o c #AA9C45", +"_o c #C7BA59", +":o c #EBE375", +"<o c #ECE778", +"[o c #D5D16F", +"}o c #94904C", +"|o c #585830", +"1o c #F7F688", +"2o c #D9D776", +"3o c #B9B662", +"4o c #F7F484", +"5o c #ACA75A", +"6o c #D6D273", +"7o c #C8C76E", +"8o c #76743E", +"9o c #E6E47B", +"0o c #AEAC5D", +"ao c #9D9850", +"bo c #F4E772", +"co c #F9EA70", +"do c #FBE86A", +"eo c #F6D954", +"fo c #F1D24F", +"go c #6E6024", +"ho c #21210F", +"io c #C0C055", +"jo c #FCFC72", +"ko c #ECEC6C", +"lo c #757839", +"mo c #0B0903", +"no c #9B7B16", +"oo c #BA941C", +"po c #1D1704", +"qo c #5A4D1B", +"ro c #DCBF45", +"so c #FBDE56", +"to c #EDD554", +"uo c #534A1D", +"vo c #615A2A", +"wo c #DCD765", +"xo c #272511", +"yo c #504D25", +"zo c #B3B058", +"Ao c #4F4C27", +"Bo c #2A2914", +"Co c #8D8C46", +"Do c #F4EF79", +"Eo c #FDF47C", +"Fo c #FEF57F", +"Go c #FDFB86", +"Ho c #646233", +"Io c #424121", +"Jo c #F6F487", +"Ko c #EAE984", +"Lo c #C0BF64", +"Mo c #898748", +"No c #686537", +"Oo c #272818", +"Po c #322606", +"Qo c #BB9114", +"Ro c #927213", +"So c #AE891A", +"To c #BD961E", +"Uo c #977F28", +"Vo c #928031", +"Wo c #EFE060", +"Xo c #F4EF6E", +"Yo c #B4AA53", +"Zo c #C6C161", +"`o c #6C6A35", +" p c #DEDF7C", +".p c #FAFA89", +"+p c #807D44", +"@p c #615F34", +"#p c #807F48", +"$p c #4E4B29", +"%p c #EEEE83", +"&p c #FFF680", +"*p c #7B7A40", +"=p c #A39E53", +"-p c #FFF57A", +";p c #D0C862", +">p c #8C8541", +",p c #F5E266", +"'p c #F6E163", +")p c #FFE966", +"!p c #FFE257", +"~p c #AC9638", +"{p c #040401", +"]p c #1D1E0E", +"^p c #909144", +"/p c #C2C259", +"(p c #ADAE4E", +"_p c #747535", +":p c #232614", +"<p c #171303", +"[p c #9A7A16", +"}p c #C7A01F", +"|p c #271F06", +"1p c #AC9333", +"2p c #FFE350", +"3p c #F9DA51", +"4p c #FCE357", +"5p c #776929", +"6p c #292712", +"7p c #CBC25A", +"8p c #716D33", +"9p c #15150B", +"0p c #5B582B", +"ap c #D8D66A", +"bp c #FDF27A", +"cp c #9E9B50", +"dp c #1B190D", +"ep c #9D9B51", +"fp c #A5A456", +"gp c #4B4926", +"hp c #403E20", +"ip c #6A6837", +"jp c #DBDB76", +"kp c #8C8D4D", +"lp c #120F05", +"mp c #140F00", +"np c #231700", +"op c #48380C", +"pp c #554918", +"qp c #B4A43F", +"rp c #837A32", +"sp c #3B3819", +"tp c #363417", +"up c #D4D476", +"vp c #E9E982", +"wp c #53522D", +"xp c #C1C16B", +"yp c #FFF983", +"zp c #E3DF75", +"Ap c #D5CE6A", +"Bp c #FCF47D", +"Cp c #E8E073", +"Dp c #AFA955", +"Ep c #E5DF70", +"Fp c #FFF87B", +"Gp c #C5BD5D", +"Hp c #ECE16C", +"Ip c #FBEB6F", +"Jp c #F8E365", +"Kp c #EEDA5E", +"Lp c #C1AF4C", +"Mp c #E0C954", +"Np c #F6DC5B", +"Op c #F0D556", +"Pp c #F4D854", +"Qp c #F5D952", +"Rp c #594D1C", +"Sp c #907C2A", +"Tp c #8A7526", +"Up c #261F09", +"Vp c #0E0D05", +"Wp c #4A3A0A", +"Xp c #CEA41E", +"Yp c #C69F1E", +"Zp c #2C2207", +"`p c #98812B", +" q c #FFEA51", +".q c #F8D74E", +"+q c #7F702A", +"@q c #332E16", +"#q c #18160A", +"$q c #0A0905", +"%q c #7D793B", +"&q c #FBF275", +"*q c #FBEA75", +"=q c #FCEE78", +"-q c #C2BE61", +";q c #0E0D07", +">q c #464424", +",q c #5E5D30", +"'q c #8A8C49", +")q c #D6D36E", +"!q c #DBDB78", +"~q c #9C9C56", +"{q c #6D6E3F", +"]q c #424326", +"^q c #12140C", +"/q c #6E6D3C", +"(q c #E1DF7E", +"_q c #6B6B3A", +":q c #F5F587", +"<q c #FEF97F", +"[q c #E1DC6F", +"}q c #5C592D", +"|q c #474423", +"1q c #D2CC66", +"2q c #E0D868", +"3q c #D2C65F", +"4q c #FFF171", +"5q c #FFEC68", +"6q c #CEBD52", +"7q c #2D2A13", +"8q c #A7963E", +"9q c #FFEB60", +"0q c #EED253", +"aq c #F8DB54", +"bq c #181508", +"cq c #9D872F", +"dq c #FFDF4B", +"eq c #FED644", +"fq c #D5B235", +"gq c #987D22", +"hq c #876D1B", +"iq c #92761B", +"jq c #BF9921", +"kq c #FFCE29", +"lq c #CAA01E", +"mq c #786622", +"nq c #C4AE3C", +"oq c #67591F", +"pq c #B7B75D", +"qq c #1A180D", +"rq c #1F1F10", +"sq c #676735", +"tq c #AFAD59", +"uq c #F9F886", +"vq c #C2C36C", +"wq c #9E9D54", +"xq c #626136", +"yq c #19190E", +"zq c #76753E", +"Aq c #C2C06E", +"Bq c #F3F186", +"Cq c #F8F181", +"Dq c #FEFD86", +"Eq c #ADA95A", +"Fq c #A6A156", +"Gq c #FDF280", +"Hq c #F1F078", +"Iq c #6F6E36", +"Jq c #433F1F", +"Kq c #D2CF66", +"Lq c #F5F37A", +"Mq c #635F2D", +"Nq c #AFA74F", +"Oq c #F3E068", +"Pq c #FBE96A", +"Qq c #FEEB6A", +"Rq c #F5E163", +"Sq c #FDE765", +"Tq c #DBC756", +"Uq c #675D26", +"Vq c #FEE75D", +"Wq c #F2D553", +"Xq c #F8D852", +"Yq c #716325", +"Zq c #322B0E", +"`q c #F7D449", +" r c #F3CE44", +".r c #E0BD3B", +"+r c #D8B335", +"@r c #F8CD38", +"#r c #FACD35", +"$r c #FBCC2F", +"%r c #FFD02C", +"&r c #B8921D", +"*r c #251E06", +"=r c #1F1A09", +"-r c #201A09", +";r c #0C101A", +">r c #E9E36A", +",r c #FFF97B", +"'r c #DBD86C", +")r c #494623", +"!r c #655E2F", +"~r c #D4D069", +"{r c #F6F17F", +"]r c #CCC869", +"^r c #E2DD74", +"/r c #E7E684", +"(r c #D6D575", +"_r c #FFFFA0", +":r c #9F9D57", +"<r c #827E42", +"[r c #F2F081", +"}r c #F4F080", +"|r c #8D8A4A", +"1r c #8B8A4B", +"2r c #F2EE7F", +"3r c #FAF784", +"4r c #EDE678", +"5r c #CFCD6B", +"6r c #F3EA78", +"7r c #878541", +"8r c #86843E", +"9r c #777134", +"0r c #F7E168", +"ar c #E9D761", +"br c #EAD860", +"cr c #FFED67", +"dr c #FEEA63", +"er c #928537", +"fr c #221E0C", +"gr c #CCB446", +"hr c #FDE156", +"ir c #F0D04D", +"jr c #4C4319", +"kr c #776723", +"lr c #F9D548", +"mr c #F8D143", +"nr c #D6B436", +"or c #604F16", +"pr c #C5A22A", +"qr c #EEC230", +"rr c #F0C22B", +"sr c #AE8B1D", +"tr c #212F4B", +"ur c #8D843D", +"vr c #FFFF77", +"wr c #F9E96D", +"xr c #FBF076", +"yr c #EADC6D", +"zr c #CEC462", +"Ar c #F8F67C", +"Br c #CEC965", +"Cr c #ABA454", +"Dr c #EBEB7C", +"Er c #706D3A", +"Fr c #ABA959", +"Gr c #FFF984", +"Hr c #F3F388", +"Ir c #6E6C39", +"Jr c #A6A55C", +"Kr c #ABAB60", +"Lr c #4D4926", +"Mr c #FCFA86", +"Nr c #FAFA88", +"Or c #6E6C3A", +"Pr c #1D1C0F", +"Qr c #D2D272", +"Rr c #FEF781", +"Sr c #C3C064", +"Tr c #D9D771", +"Ur c #9B9B51", +"Vr c #504D27", +"Wr c #FAE872", +"Xr c #FDF277", +"Yr c #F9F276", +"Zr c #7F7A3A", +"`r c #585528", +" s c #544E24", +".s c #FFEF6E", +"+s c #FEF36E", +"@s c #9C8E41", +"#s c #393417", +"$s c #574F23", +"%s c #C3B04B", +"&s c #FFF566", +"*s c #ECDC5B", +"=s c #383114", +"-s c #776828", +";s c #FFE255", +">s c #EFD14C", +",s c #B29937", +"'s c #D8BA40", +")s c #F0C93F", +"!s c #F1C73A", +"~s c #504212", +"{s c #9E8220", +"]s c #FFD432", +"^s c #997B1B", +"/s c #181304", +"(s c #243350", +"_s c #2F2D16", +":s c #D3C55B", +"<s c #FFF370", +"[s c #F8E76C", +"}s c #F9E871", +"|s c #898543", +"1s c #7B763B", +"2s c #FCEF79", +"3s c #ECED7E", +"4s c #605F32", +"5s c #90904B", +"6s c #F7F789", +"7s c #807E44", +"8s c #54522B", +"9s c #73703D", +"0s c #B2B25F", +"as c #DEDE7A", +"bs c #AAA95D", +"cs c #F2F082", +"ds c #77763F", +"es c #E4DF75", +"fs c #9E9B51", +"gs c #4B4A27", +"hs c #AEAD5B", +"is c #868646", +"js c #5B582E", +"ks c #FCF47E", +"ls c #FBEB71", +"ms c #FFF374", +"ns c #FAEF72", +"os c #635E2C", +"ps c #EFDF66", +"qs c #FEEF6C", +"rs c #E5D05C", +"ss c #615926", +"ts c #2D2810", +"us c #70672A", +"vs c #E8D355", +"ws c #9A8A37", +"xs c #483E17", +"ys c #E6CB4B", +"zs c #F9D84F", +"As c #F7D347", +"Bs c #F1CB41", +"Cs c #E8C13B", +"Ds c #FFD43B", +"Es c #8A711F", +"Fs c #705B16", +"Gs c #A2831D", +"Hs c #161103", +"Is c #161F32", +"Js c #5B5426", +"Ks c #F3E86B", +"Ls c #FDED6F", +"Ms c #F7E46C", +"Ns c #F8EF76", +"Os c #F0F07E", +"Ps c #5F5D31", +"Qs c #7B7D41", +"Rs c #F9F883", +"Ss c #C6C568", +"Ts c #E3E17A", +"Us c #918F4D", +"Vs c #9F9E54", +"Ws c #959550", +"Xs c #7F7B41", +"Ys c #71703B", +"Zs c #292815", +"`s c #E9E778", +" t c #F8F785", +".t c #B1B25F", +"+t c #ADAA59", +"@t c #9C9952", +"#t c #8E8C47", +"$t c #FEEF78", +"%t c #F7EA70", +"&t c #F6E76E", +"*t c #FFEE70", +"=t c #F1E96D", +"-t c #545025", +";t c #BEB551", +">t c #FFF46D", +",t c #FFEA65", +"'t c #F8EA63", +")t c #B9A744", +"!t c #2D2710", +"~t c #968634", +"{t c #4C431A", +"]t c #A28D32", +"^t c #FCD94D", +"/t c #EFCC46", +"(t c #D7B63B", +"_t c #DAB739", +":t c #F4CA3B", +"<t c #FFD239", +"[t c #C3A028", +"}t c #271E08", +"|t c #0D121C", +"1t c #867D39", +"2t c #FAE86D", +"3t c #FDEC74", +"4t c #ECE06D", +"5t c #AAA351", +"6t c #FFFA7C", +"7t c #E8E676", +"8t c #524D28", +"9t c #96954E", +"0t c #EFEE7F", +"at c #7C7B41", +"bt c #615D31", +"ct c #E1DF76", +"dt c #B7B25D", +"et c #878446", +"ft c #C5C66A", +"gt c #2B2915", +"ht c #ACA757", +"it c #B0AF5A", +"jt c #1D1B0F", +"kt c #33301A", +"lt c #B0AB56", +"mt c #968D44", +"nt c #9C9345", +"ot c #EDDE65", +"pt c #655E2B", +"qt c #807534", +"rt c #F7E061", +"st c #F2D95D", +"tt c #FFEA60", +"ut c #E6D052", +"vt c #5E5220", +"wt c #EDCA46", +"xt c #FAD546", +"yt c #836E23", +"zt c #2D250C", +"At c #8E7521", +"Bt c #E0B730", +"Ct c #FACB31", +"Dt c #5D4B11", +"Et c #19202D", +"Ft c #050604", +"Gt c #AB9F4A", +"Ht c #F6E46D", +"It c #C9C05D", +"Jt c #332F17", +"Kt c #DBD167", +"Lt c #FFF87E", +"Mt c #DDDA6F", +"Nt c #423D1F", +"Ot c #B8B45E", +"Pt c #6A6938", +"Qt c #E6E478", +"Rt c #FAEF7C", +"St c #FDF680", +"Tt c #FEF480", +"Ut c #1E1B0E", +"Vt c #413F20", +"Wt c #F0EF7E", +"Xt c #FEFD82", +"Yt c #827F40", +"Zt c #A19C4E", +"`t c #FCEC71", +" u c #FFFA76", +".u c #65602D", +"+u c #6C652E", +"@u c #F8E76B", +"#u c #FCE769", +"$u c #EBD961", +"%u c #CDBB51", +"&u c #F6DE5F", +"*u c #F2D95A", +"=u c #EFD557", +"-u c #EDD255", +";u c #FDE158", +">u c #F3D752", +",u c #746626", +"'u c #C7A939", +")u c #FCD545", +"!u c #E1BC39", +"~u c #947B23", +"{u c #1C1707", +"]u c #32290B", +"^u c #856B19", +"/u c #A1801C", +"(u c #211A06", +"_u c #2D3F64", +":u c #312913", +"<u c #937017", +"[u c #3A2B07", +"}u c #16150A", +"|u c #B8AE50", +"1u c #FFFB74", +"2u c #F8E46B", +"3u c #6D6A33", +"4u c #433F1E", +"5u c #FAF075", +"6u c #FEEE75", +"7u c #F5F079", +"8u c #E9E070", +"9u c #C6C263", +"0u c #B1AD59", +"au c #59572D", +"bu c #525029", +"cu c #F7F783", +"du c #FBEE7B", +"eu c #FBEF7C", +"fu c #F3EC7A", +"gu c #58532B", +"hu c #92904B", +"iu c #6E6935", +"ju c #FEF076", +"ku c #EADE6D", +"lu c #9E994B", +"mu c #E4D968", +"nu c #FFF475", +"ou c #F9E66D", +"pu c #FFFA75", +"qu c #756F34", +"ru c #5D5628", +"su c #F1E166", +"tu c #FAE364", +"uu c #FEE863", +"vu c #C7AF45", +"wu c #F3D552", +"xu c #FDDD50", +"yu c #837128", +"zu c #E7C13C", +"Au c #F7CE3C", +"Bu c #FFD83C", +"Cu c #80691B", +"Du c #332809", +"Eu c #1E1805", +"Fu c #55410D", +"Gu c #EFB624", +"Hu c #C8981D", +"Iu c #110C00", +"Ju c #201E0F", +"Ku c #C0B452", +"Lu c #FEF673", +"Mu c #D4CA5E", +"Nu c #1D1B0C", +"Ou c #807B3B", +"Pu c #FEFA77", +"Qu c #FFFB7B", +"Ru c #D4D168", +"Su c #57552B", +"Tu c #AAA051", +"Uu c #B0A854", +"Vu c #18170C", +"Wu c #2F2D17", +"Xu c #4F4D27", +"Yu c #E9E97A", +"Zu c #FEF67F", +"`u c #F3EB78", +" v c #96904A", +".v c #DCD76F", +"+v c #FDF07B", +"@v c #E2DF72", +"#v c #E5DE73", +"$v c #FFF27B", +"%v c #FBF078", +"&v c #F0E471", +"*v c #FBEB73", +"=v c #EEE36F", +"-v c #413E1D", +";v c #545328", +">v c #F4ED70", +",v c #FDEE6F", +"'v c #837938", +")v c #504922", +"!v c #FAE467", +"~v c #F4D855", +"{v c #938132", +"]v c #CDB343", +"^v c #F6D850", +"/v c #F3D14A", +"(v c #FEDA4B", +"_v c #917B28", +":v c #110E05", +"<v c #B89A2E", +"[v c #F2C939", +"}v c #F9CB36", +"|v c #AD8C22", +"1v c #0C111C", +"2v c #7A5D12", +"3v c #F1B824", +"4v c #D8A320", +"5v c #292006", +"6v c #B3A74C", +"7v c #88833D", +"8v c #C0B556", +"9v c #FFF573", +"0v c #BBB558", +"av c #232110", +"bv c #E1DC6D", +"cv c #A49C4E", +"dv c #CCC965", +"ev c #F9F880", +"fv c #676434", +"gv c #494724", +"hv c #E6E474", +"iv c #FEF77F", +"jv c #FCEF7B", +"kv c #DED66E", +"lv c #EFEA78", +"mv c #F7EC78", +"nv c #FCF57B", +"ov c #FFF178", +"pv c #FFF478", +"qv c #FDF076", +"rv c #FEEF75", +"sv c #CFC85F", +"tv c #363318", +"uv c #6A652F", +"vv c #FCF270", +"wv c #FFFE76", +"xv c #A09745", +"yv c #E5D35E", +"zv c #F1D554", +"Av c #FADB54", +"Bv c #81702C", +"Cv c #6E6123", +"Dv c #FFDE50", +"Ev c #EAC846", +"Fv c #F3CF46", +"Gv c #F5CF41", +"Hv c #B6982E", +"Iv c #CEAB31", +"Jv c #F6CA37", +"Kv c #E7BC30", +"Lv c #504010", +"Mv c #0E121B", +"Nv c #B2881B", +"Ov c #AC831A", +"Pv c #3A2C09", +"Qv c #171E29", +"Rv c #2A3C5F", +"Sv c #1F1E0D", +"Tv c #757134", +"Uv c #2D2A14", +"Vv c #E0D162", +"Wv c #FFEF70", +"Xv c #BBB758", +"Yv c #4B4822", +"Zv c #EDE971", +"`v c #FBF478", +" w c #757037", +".w c #0D0B05", +"+w c #ADAA54", +"@w c #E5DB6D", +"#w c #F5E774", +"$w c #DBD46C", +"%w c #19170C", +"&w c #98924A", +"*w c #DAD86E", +"=w c #3E3C1E", +"-w c #FFF77C", +";w c #D4CC66", +">w c #746E38", +",w c #E7DC6B", +"'w c #B1A752", +")w c #FAEA71", +"!w c #FFF975", +"~w c #CFC65D", +"{w c #38371A", +"]w c #766E32", +"^w c #FFFC73", +"/w c #CEC759", +"(w c #504A20", +"_w c #DECB59", +":w c #F9E161", +"<w c #F3DA5E", +"[w c #F0D351", +"}w c #F8D851", +"|w c #A38D35", +"1w c #3A3211", +"2w c #ECC947", +"3w c #F5D047", +"4w c #E7C33F", +"5w c #ECC63C", +"6w c #F0C536", +"7w c #F2C532", +"8w c #7D6519", +"9w c #1C263B", +"0w c #5E480F", +"aw c #957116", +"bw c #1F1C13", +"cw c #524C22", +"dw c #F4E86B", +"ew c #BBB254", +"fw c #100F08", +"gw c #3D3A1B", +"hw c #E6E16B", +"iw c #FFFA78", +"jw c #FDEC73", +"kw c #EAE06D", +"lw c #3D3A1D", +"mw c #7A7539", +"nw c #F3EC75", +"ow c #A69F4F", +"pw c #DCD369", +"qw c #FFF37A", +"rw c #706A35", +"sw c #7B773C", +"tw c #1D1A0D", +"uw c #D1CE66", +"vw c #FEF178", +"ww c #F7EF77", +"xw c #666332", +"yw c #4C4B25", +"zw c #EFEB74", +"Aw c #FDF97A", +"Bw c #85803E", +"Cw c #45411F", +"Dw c #FBEA70", +"Ew c #F7E569", +"Fw c #FFFB75", +"Gw c #BBB051", +"Hw c #8F8A3F", +"Iw c #F7EA68", +"Jw c #4C461F", +"Kw c #C5B34D", +"Lw c #F3D95B", +"Mw c #F8DD59", +"Nw c #F2D34D", +"Ow c #D5B942", +"Pw c #B79C35", +"Qw c #FFD846", +"Rw c #E8C23C", +"Sw c #E7C039", +"Tw c #E9C135", +"Uw c #FACD34", +"Vw c #A58521", +"Ww c #090702", +"Xw c #182030", +"Yw c #1F1B0F", +"Zw c #61490E", +"`w c #2B2820", +" x c #AC9F48", +".x c #C8BB56", +"+x c #19170A", +"@x c #151208", +"#x c #C3BB58", +"$x c #FFFE78", +"%x c #F2E36D", +"&x c #D1C760", +"*x c #F8EB72", +"=x c #F6EC74", +"-x c #868140", +";x c #BDB859", +">x c #98944A", +",x c #4D4925", +"'x c #FBF77B", +")x c #E9E874", +"!x c #726D36", +"~x c #C8C25F", +"{x c #1C1A0D", +"]x c #A39F4D", +"^x c #F9F476", +"/x c #514D25", +"(x c #585428", +"_x c #F7E467", +":x c #9E9343", +"<x c #B1A246", +"[x c #6D642B", +"}x c #AA9941", +"|x c #FEE660", +"1x c #ECD357", +"2x c #D9C14E", +"3x c #E9CE51", +"4x c #FADD55", +"5x c #F4D651", +"6x c #F0D04B", +"7x c #65561D", +"8x c #69581C", +"9x c #FCD342", +"0x c #E6BF37", +"ax c #F7CA36", +"bx c #C09C26", +"cx c #1E1906", +"dx c #3D2F09", +"ex c #A77F19", +"fx c #2A2007", +"gx c #151B28", +"hx c #36321B", +"ix c #EEE264", +"jx c #DBCD5C", +"kx c #2E2C13", +"lx c #FAE76C", +"mx c #F9E86E", +"nx c #FBEA71", +"ox c #726D35", +"px c #847F3D", +"qx c #FAEE74", +"rx c #FCEC74", +"sx c #FFF378", +"tx c #CAC361", +"ux c #343319", +"vx c #E3DB6C", +"wx c #B7B257", +"xx c #39351B", +"yx c #D8D268", +"zx c #FFF87A", +"Ax c #FCF576", +"Bx c #62602F", +"Cx c #EEE66F", +"Dx c #FBF072", +"Ex c #45401F", +"Fx c #7C7737", +"Gx c #FFF874", +"Hx c #F5E26A", +"Ix c #FCE666", +"Jx c #F8E766", +"Kx c #5C5325", +"Lx c #363215", +"Mx c #696029", +"Nx c #867932", +"Ox c #FDE75F", +"Px c #E8CF53", +"Qx c #766829", +"Rx c #433B17", +"Sx c #AC9739", +"Tx c #F6D54D", +"Ux c #EBCA47", +"Vx c #9A832C", +"Wx c #2A240B", +"Xx c #D2AF33", +"Yx c #F3C93A", +"Zx c #F5C936", +"`x c #D6AE2C", +" y c #30270A", +".y c #A37D18", +"+y c #FFC326", +"@y c #725710", +"#y c #776B2F", +"$y c #E6D85D", +"%y c #443F1B", +"&y c #B4B051", +"*y c #FAE66A", +"=y c #F5E169", +"-y c #F6E36B", +";y c #5E592A", +">y c #F1E76F", +",y c #FCEC73", +"'y c #FBEA72", +")y c #DBCF65", +"!y c #EADC6C", +"~y c #F3EE73", +"{y c #444220", +"]y c #8F8842", +"^y c #635E2D", +"/y c #6B6832", +"(y c #FFF074", +"_y c #FFFD7A", +":y c #D0CC61", +"<y c #19170B", +"[y c #A09848", +"}y c #F5EA6D", +"|y c #9F9645", +"1y c #F7E268", +"2y c #F3DD63", +"3y c #FAE363", +"4y c #FFF76A", +"5y c #DECD57", +"6y c #2D2911", +"7y c #121007", +"8y c #403817", +"9y c #EED455", +"0y c #FCDF58", +"ay c #D7BD48", +"by c #756826", +"cy c #403714", +"dy c #827129", +"ey c #F1CE48", +"fy c #FCD749", +"gy c #F9D344", +"hy c #C4A635", +"iy c #201A08", +"jy c #957C23", +"ky c #FFE23D", +"ly c #D6AF2D", +"my c #46390E", +"ny c #070501", +"oy c #4B390B", +"py c #8E6B15", +"qy c #AF851A", +"ry c #4B380B", +"sy c #10151E", +"ty c #222930", +"uy c #9D8F3D", +"vy c #645B27", +"wy c #040505", +"xy c #3D391A", +"yy c #B3A74B", +"zy c #FFF06C", +"Ay c #FEED6D", +"By c #FFFB77", +"Cy c #89813D", +"Dy c #383519", +"Ey c #E4D867", +"Fy c #FCEC72", +"Gy c #D0C960", +"Hy c #635F2E", +"Iy c #D3C760", +"Jy c #272512", +"Ky c #252311", +"Ly c #B1AA51", +"My c #E3DE6C", +"Ny c #ECDE6A", +"Oy c #FCEE71", +"Py c #FDEE70", +"Qy c #FCF673", +"Ry c #4A4521", +"Sy c #585427", +"Ty c #E1D964", +"Uy c #3A3518", +"Vy c #B7AA4E", +"Wy c #FCED6C", +"Xy c #FEEA6A", +"Yy c #F8E467", +"Zy c #F4DE64", +"`y c #F5DF62", +" z c #F9E162", +".z c #C8B44F", +"+z c #B6A245", +"@z c #FFF165", +"#z c #948437", +"$z c #171308", +"%z c #DAC04C", +"&z c #F9DC55", +"*z c #FADA52", +"=z c #FFEA55", +"-z c #C6AD3E", +";z c #2C260D", +">z c #574A1A", +",z c #DDBB3E", +"'z c #FFD844", +")z c #F1C83D", +"!z c #534414", +"~z c #544512", +"{z c #CEB12E", +"]z c #4B3E0E", +"^z c #42310A", +"/z c #695010", +"(z c #554F26", +"_z c #6C6329", +":z c #101621", +"<z c #7A7033", +"[z c #F2E467", +"}z c #8E843F", +"|z c #131108", +"1z c #D4C65C", +"2z c #FDEE71", +"3z c #F1EA6E", +"4z c #66602D", +"5z c #F9F272", +"6z c #6D6731", +"7z c #373419", +"8z c #F0EC72", +"9z c #A09A48", +"0z c #9D9546", +"az c #FFF474", +"bz c #FFEA6D", +"cz c #989344", +"dz c #2E2B13", +"ez c #B0A64C", +"fz c #C6B552", +"gz c #92853D", +"hz c #A09443", +"iz c #FFF06A", +"jz c #F7DE60", +"kz c #FFEA63", +"lz c #7B712F", +"mz c #383214", +"nz c #F2DA5A", +"oz c #EFE05B", +"pz c #413A17", +"qz c #BCA43F", +"rz c #FDDD53", +"sz c #EBCD4B", +"tz c #EBCB49", +"uz c #FFE24E", +"vz c #B89D36", +"wz c #070701", +"xz c #30280D", +"yz c #C4A331", +"zz c #FFE140", +"Az c #BA9B2B", +"Bz c #2A2309", +"Cz c #231C07", +"Dz c #14191F", +"Ez c #060501", +"Fz c #181F30", +"Gz c #2E2810", +"Hz c #22282E", +"Iz c #4D471F", +"Jz c #CBC155", +"Kz c #FBE668", +"Lz c #FFF670", +"Mz c #787135", +"Nz c #C9BB56", +"Oz c #FDEF6F", +"Pz c #8B823D", +"Qz c #3A371B", +"Rz c #DCD162", +"Sz c #7E7838", +"Tz c #867F3C", +"Uz c #B8B052", +"Vz c #494420", +"Wz c #D1C65C", +"Xz c #FEF270", +"Yz c #C5B654", +"Zz c #979042", +"`z c #E4D963", +" A c #49441F", +".A c #534C22", +"+A c #3C3718", +"@A c #DBCB5B", +"#A c #B4AA4B", +"$A c #3F3918", +"%A c #BBAB4B", +"&A c #F6DD5D", +"*A c #FCE65F", +"=A c #6A6128", +"-A c #3E3716", +";A c #FFEF5E", +">A c #B19E3E", +",A c #9C8732", +"'A c #FFDF51", +")A c #EBCA46", +"!A c #EDCA44", +"~A c #FAD445", +"{A c #63541B", +"]A c #B49629", +"^A c #FED236", +"/A c #4B3E0F", +"(A c #030506", +"_A c #1E1D0C", +":A c #978D3F", +"<A c #E5D45D", +"[A c #FFEC69", +"}A c #FFF66E", +"|A c #E1D360", +"1A c #010200", +"2A c #CBBC56", +"3A c #DACC5D", +"4A c #1F1B0C", +"5A c #877F3A", +"6A c #F7E36A", +"7A c #EAD964", +"8A c #8B823C", +"9A c #FFF46F", +"0A c #F8E469", +"aA c #1B1509", +"bA c #E5DD64", +"cA c #847F3A", +"dA c #343014", +"eA c #857934", +"fA c #D8C453", +"gA c #FEE561", +"hA c #F8E05B", +"iA c #605524", +"jA c #443C18", +"kA c #F8DA55", +"lA c #F6D853", +"mA c #F4D750", +"nA c #5C4F1E", +"oA c #766625", +"pA c #FAD84C", +"qA c #FBD341", +"rA c #B99A2E", +"sA c #1E1806", +"tA c #BB9824", +"uA c #B18E20", +"vA c #18150D", +"wA c #030100", +"xA c #2F2B13", +"yA c #998D3E", +"zA c #ECDD61", +"AA c #827836", +"BA c #0B0B05", +"CA c #CEBE55", +"DA c #89803A", +"EA c #D7CC5C", +"FA c #FFF26E", +"GA c #FCE869", +"HA c #DDCE5D", +"IA c #93883E", +"JA c #F3E066", +"KA c #F9E567", +"LA c #635B29", +"MA c #3E3A1A", +"NA c #EBDC63", +"OA c #FDE969", +"PA c #5E5827", +"QA c #342D15", +"RA c #F3E966", +"SA c #B0A649", +"TA c #030101", +"UA c #2F2B12", +"VA c #EFD75C", +"WA c #E6D359", +"XA c #302C12", +"YA c #645925", +"ZA c #FAE55E", +"`A c #FBE15A", +" B c #F8DE58", +".B c #5F5422", +"+B c #433A17", +"@B c #F7D752", +"#B c #F2D24E", +"$B c #F4D44D", +"%B c #D6B943", +"&B c #857229", +"*B c #E8C544", +"=B c #EFCB43", +"-B c #EAC63F", +";B c #EAC43C", +">B c #FED33E", +",B c #DCB633", +"'B c #241D08", +")B c #221B06", +"!B c #BC951F", +"~B c #6E5711", +"{B c #1F2B45", +"]B c #3C5587", +"^B c #523E0C", +"/B c #A67F19", +"(B c #342807", +"_B c #2C2812", +":B c #0E0E06", +"<B c #D6C456", +"[B c #DDD05C", +"}B c #8A8239", +"|B c #FFF46C", +"1B c #F4DE63", +"2B c #FEEB69", +"3B c #F3DE62", +"4B c #AFA248", +"5B c #A29542", +"6B c #FEE866", +"7B c #FFEB67", +"8B c #DECE5B", +"9B c #262310", +"0B c #635927", +"aB c #DAC856", +"bB c #1C190B", +"cB c #E1CB55", +"dB c #F6DC5C", +"eB c #FFE860", +"fB c #B29F41", +"gB c #1D1A0B", +"hB c #A9973C", +"iB c #FFE55A", +"jB c #FADD56", +"kB c #5E5320", +"lB c #433A16", +"mB c #F2D14D", +"nB c #EFCD47", +"oB c #E5C443", +"pB c #E8C440", +"qB c #EEC83F", +"rB c #F4CC3E", +"sB c #FACF3C", +"tB c #DDB632", +"uB c #070502", +"vB c #2E4268", +"wB c #392C09", +"xB c #806614", +"yB c #1F1A08", +"zB c #6A5110", +"AB c #FCBF26", +"BB c #997517", +"CB c #080B11", +"DB c #172034", +"EB c #0F0F06", +"FB c #DCC857", +"GB c #96883B", +"HB c #FFF76B", +"IB c #FBE564", +"JB c #F2DB5F", +"KB c #FFEB66", +"LB c #D8C757", +"MB c #211F0E", +"NB c #554E22", +"OB c #FAE463", +"PB c #BEAC4A", +"QB c #94883A", +"RB c #FFEF65", +"SB c #FBE35F", +"TB c #443E1A", +"UB c #342E13", +"VB c #E5CE54", +"WB c #F4DA58", +"XB c #FFE65C", +"YB c #544B1D", +"ZB c #3B3414", +"`B c #F2D551", +" C c #6B5D23", +".C c #E8C744", +"+C c #EAC842", +"@C c #F7D144", +"#C c #FED542", +"$C c #F6CD3D", +"%C c #BE9E2F", +"&C c #826B1E", +"*C c #32280A", +"=C c #42340A", +"-C c #55430D", +";C c #141925", +">C c #846514", +",C c #E3AE22", +"'C c #4A390B", +")C c #06080E", +"!C c #DDC955", +"~C c #595122", +"{C c #B09F44", +"]C c #CEBC51", +"^C c #F5DF5F", +"/C c #FFF268", +"(C c #FFEB65", +"_C c #FAE261", +":C c #F1DA5E", +"<C c #E2CC58", +"[C c #2A2510", +"}C c #ECD65B", +"|C c #988738", +"1C c #131007", +"2C c #C3B44B", +"3C c #F9DE5A", +"4C c #8B7C32", +"5C c #9D8B38", +"6C c #FDE05A", +"7C c #F0D354", +"8C c #EFD352", +"9C c #FFE258", +"0C c #A99439", +"aC c #BEA63D", +"bC c #FFE453", +"cC c #7C6B27", +"dC c #2F280E", +"eC c #DDBD41", +"fC c #FBD648", +"gC c #F8D244", +"hC c #EFC83D", +"iC c #C2A230", +"jC c #806A1F", +"kC c #181406", +"lC c #121418", +"mC c #4F3F0C", +"nC c #231C06", +"oC c #977317", +"pC c #806213", +"qC c #06080A", +"rC c #383218", +"sC c #BFAC47", +"tC c #0C0B04", +"uC c #26220E", +"vC c #5A5122", +"wC c #A2943E", +"xC c #DCCC56", +"yC c #FFEC63", +"zC c #FFEA62", +"AC c #FFE35F", +"BC c #E3CA54", +"CC c #2C2811", +"DC c #B6A444", +"EC c #FEF364", +"FC c #76682B", +"GC c #211D0B", +"HC c #D4C24E", +"IC c #F0D355", +"JC c #ECD053", +"KC c #EDD252", +"LC c #EFD251", +"MC c #ECD04F", +"NC c #F9DA52", +"OC c #D9BD46", +"PC c #231E0B", +"QC c #514619", +"RC c #FFE250", +"SC c #877329", +"TC c #2B250D", +"UC c #E2C03F", +"VC c #FFDF47", +"WC c #E0BD3A", +"XC c #AA8F2B", +"YC c #5C4B16", +"ZC c #161306", +"`C c #17140A", +" D c #52410D", +".D c #141411", +"+D c #191D22", +"@D c #7F6013", +"#D c #241B06", +"$D c #655925", +"%D c #322D12", +"&D c #4F481E", +"*D c #77692C", +"=D c #B8A543", +"-D c #EED356", +";D c #FFF162", +">D c #E0CB52", +",D c #29240F", +"'D c #5B5121", +")D c #FBE95E", +"!D c #675C24", +"~D c #352E11", +"{D c #EBCF51", +"]D c #F6D854", +"^D c #EDD04D", +"/D c #EFD14D", +"(D c #FAD94E", +"_D c #F6D44B", +":D c #423914", +"<D c #DABA3E", +"[D c #A88F30", +"}D c #161307", +"|D c #67581B", +"1D c #645419", +"2D c #352C0D", +"3D c #0E0B03", +"4D c #1E1604", +"5D c #5A450D", +"6D c #0F0B03", +"7D c #251E07", +"8D c #0C0A02", +"9D c #1C190F", +"0D c #3D2E09", +"aD c #181D28", +"bD c #726426", +"cD c #383113", +"dD c #151308", +"eD c #7A6E2B", +"fD c #786C2A", +"gD c #2F2910", +"hD c #E8D151", +"iD c #5B5420", +"jD c #53481B", +"kD c #FFEA59", +"lD c #FFE657", +"mD c #FDDC53", +"nD c #FDDC52", +"oD c #FEDD51", +"pD c #FFDD50", +"qD c #F2D04A", +"rD c #F0CF49", +"sD c #DBBF43", +"tD c #3B3412", +"uD c #A58C2D", +"vD c #C0A433", +"wD c #050302", +"xD c #1C1604", +"yD c #B88C1B", +"zD c #CA9A1E", +"AD c #251C05", +"BD c #1A2333", +"CD c #4C4219", +"DD c #0A0701", +"ED c #040300", +"FD c #060606", +"GD c #221E0B", +"HD c #C5AE42", +"ID c #4F451A", +"JD c #2E270E", +"KD c #A59337", +"LD c #BBA53D", +"MD c #C0A63C", +"ND c #B69E39", +"OD c #9E8831", +"PD c #7E6D28", +"QD c #63561F", +"RD c #4C4117", +"SD c #413713", +"TD c #070805", +"UD c #625219", +"VD c #C5A631", +"WD c #120E04", +"XD c #A47E19", +"YD c #DFAA21", +"ZD c #43330A", +"`D c #10141B", +" E c #101622", +".E c #826314", +"+E c #AD841B", +"@E c #382B08", +"#E c #395181", +"$E c #171507", +"%E c #A08A32", +"&E c #413814", +"*E c #12151C", +"=E c #0E0C04", +"-E c #AD8F28", +";E c #41360F", +">E c #181408", +",E c #A07A18", +"'E c #090909", +")E c #987517", +"!E c #DCA821", +"~E c #372B08", +"{E c #13110A", +"]E c #736323", +"^E c #2A2511", +"/E c #120C02", +"(E c #6B500F", +"_E c #886713", +":E c #6A500F", +"<E c #131212", +"[E c #856C1C", +"}E c #655214", +"|E c #263555", +"1E c #29210D", +"2E c #906E16", +"3E c #392B09", +"4E c #8A6A15", +"5E c #B98C1B", +"6E c #101315", +"7E c #473C15", +"8E c #252722", +"9E c #211907", +"0E c #C9981D", +"aE c #FBBE25", +"bE c #C8981E", +"cE c #192236", +"dE c #665113", +"eE c #7F6718", +"fE c #28200C", +"gE c #302407", +"hE c #1E2A42", +"iE c #876714", +"jE c #9C7717", +"kE c #121925", +"lE c #1D1807", +"mE c #222834", +"nE c #0B0F15", +"oE c #7F6012", +"pE c #EBB323", +"qE c #9C7818", +"rE c #16191C", +"sE c #3E310B", +"tE c #8A6E17", +"uE c #111415", +"vE c #0A0E14", +"wE c #182134", +"xE c #7B5D12", +"yE c #6B5110", +"zE c #1E2B43", +"AE c #312506", +"BE c #DAA521", +"CE c #8E6C15", +"DE c #1C1A14", +"EE c #665010", +"FE c #2D250E", +"GE c #55400C", +"HE c #27200B", +"IE c #12110D", +"JE c #A47D18", +"KE c #6F5412", +"LE c #1D1706", +"ME c #150F03", +"NE c #0C0F17", +"OE c #191E28", +"PE c #5E470E", +"QE c #3F3214", +"RE c #070A0E", +"SE c #283758", +"TE c #120D03", +"UE c #141515", +" ", +" ", +" ", +" ", +" ", +" ", +" . + @ # # $ % & * = = = = = = = = = = = = = = = = - ; > , ' ' ' ) ! ~ { ' ' ' ] & * = = = = = = = = = = = = = = = ^ / ( ( ( ( ( ( ( ( ( ( ( _ : @ < [ } | 1 2 3 3 1 4 5 6 ", +" = 7 ( 8 9 3 0 0 a b c d e f = ^ g h i i i i i i i i i i i i i i i j 4 k l m n ~ o 8 p q r r r r r s t u v 2 r r r w d h i i i i i i i i i i i i i i x y z A B C # D r r r r r r r r r r r r r r q E F G H r r I J J J I r r K L . ", +" + M N O P Q R S J T J Q R Q U a V W & X V r Y Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z ` . ...+.@.#.$.%. < _ 2 &. .` ...*.&.*... .` .*.*...&.r r ` Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z ` .Y *.=.1 i -.%. ;.r &.U I I I I I I I I I I &.>.r 9 / 0 r J J U ,.'.).).!.T ~.P r {.% ", +" ~ k 0 I ].].^./.(._.:.<.[.}.|./.1.2.J 3.4.# 5.r &.6.7.8.9.0.0.0.0.0.0.0.0.a.b.c.d.e.6.f.g.h.i. .r j.k.= l.m.r h. .n.o.p.q.r.s.t.u.v.c.w.r x.y.z.A.Z a.B.a.0.0.0.0.0.0.0.0.0.a.C.C.9.D.E.F.G.H.I. .H J.o K. K.V J L.M.N.O.O.O.O.O.O.O.O.N.P.Q.Q R. } r I 2./.S.T.U.V.W.X.Y.Z.`. +R r .+++ ", +" = @+#+r $+].%+&+*+=+-+;+V.>+,+'+)+!+~+{+r ].r 0 ]+ ^+r ../+(+_+:+<+<+<+<+<+<+<+[+:+}+|+1+1+2+3+4+5+6+7+8+*.r 9+& . 4.&.0+a+b+c+:+d+e+f+g+h+i+[+1+j+k+l+j+m+n+G.o+|+1+1+<+<+<+<+<+<+<+:+:+_+d+:+_+2+p+u.q+r+s+t+..G.1 u+ v+0 w+x+y+z+y+y+y+y+y+y+y+y+A+B+S I u C+3.&.R D+E+A+X.F+G+H+I+J+z+K+L+M+N+r / - ", +" C u r O+P+Q+R+V.S+A+T+U+V+W+X+(.Y+Z+'+A+y+`+ @.@r 0 u+ +@r r 6.@@#@$@_+_+_+_+_+_+_+}+%@r+&@*@=@d+[+<+:+_+-@;@&.*.r u d r Z >@,@1+<+'@)@!@~@{@h.]@^@/@[+1+1+d+:+y.H.(@_@:@<@d+_+_+_+_+_+_+[@v.}@|@1@2@3@1+1+:+}+4@5@s+x.r H k 6@ 7@r J 8@K+;+;+;+;+;+;+;+;+;+;+9@2.r ' 0@c r a@b@c@K+'+d@e@w+Q f@g@;+;+A+h@r r i@j@ ", +" k@t r l@m@n@o@S+'+K+p@).q@r@s@Q ].t@u@v@w@;+S+v@x@w+r K ; > q r .0+8+y@j+d+_+_+_+_+d+z@i.H.H.A@O+B@<+_+C@_+1+d+D@E@Y r r .F@G@[+_+<@d.~@Z r r *.h.t+H@I@|+d+_+:+J@8+h.H.K@L@<+_+_+_+_+_+C@M@N@i.8+O@Y C.P@_+_+d+1+d+Q@n+` .r ;.= R@i I S@T@K+w@w@w@w@w@w@w@w@'+U@V@P 3 j@ 5.H s@W@X@Y@'+Z@G+`@H w I #.#;+;+;+V++#r # ", +" > D O+].@###y+'+;+K+N.$#`@P r w R.%#r ].&#;+;+;+K+v@H+P+r k *#1 b =#r -#k+<+_+_+_+_+<+;#..r r r H.>#z.<+_+_+_+d+[+,#i.r *.I -@[+_+<+'#Y &.)#p c i@a r ` H.!#C@_+:+J@i.r r ` ~#<+_+_+_+_+_+C@&@ .r r r *.h.&.{#<+_+_+_+<+_+]#H@ .r ^# X /#I (#_#:#<#J+J+J+J+J+J+J+[#}#J r |# 1#I s@2#A+;+'+W.H+].a J.I r 3#'+;+y+4#5#r 6# ", +" n 7#U q@8#9#K+;+;+z+E+0#w+r r h ' X a#)#J b#;+;+;+;+S+c#Q U D ~ = X # ) d# l.v+) B ^ e# C ^ ) B B { = R@f#v+[ e# K.g#E ) @ 0@ + u r *.h#<+_+_+_+_+<+h#*.r q R.r i#f+1+_+_+_+_+1+h+7+ .x.j#(+d+_+<+k#Y &.l#m ) | r &. .k+<+:+J@i.r r ` e.<+_+_+_+_+_+C@m# .r n#o#p#r ` G.q#1+_+_+_+_+<+r#` ..)#s# ) r S t#,+u#v#w#w#w#w#w#w#w#x#,.I 3.y# * j U m@3#K+;+;+y+z#A#r r I r R+'+;+y+B#5#r *# ", +" . C#S@q@D#E#'+;+;+;+F#G#P+>.H#I# ~ K J J#K#;+;+;+z+L#M#P+H N#+@^#O#P#c Q#=#i@j R#S#=#%#J.T#} U# 0@V#O#V J.=#W#%#2 P#l e# $ f F C+5 e y .+C#S#l#P#o 1#4.b X#=#q 9 ^+%. _ r *.h#<+_+_+_+_+<+h#*.r Y#Z#3.`#r.1+_+_+_+_+<+ $E.` ~@.$d+_+_+_++$@$h.r =##$+@%. 9+r .$$%$:+J@i.r r ` e.<+_+_+_+_+_+C@m# .r &$ k@*$G.8+=$-$<+_+_+_+_+_+:@;$&.N ~ >$r 2.,$E+s@w++#Q Q Q Q Q Q Q P r T#++ * h P '$T@'+;+;+K+T.)$R r I >.!$'+;+;+~$q@r {$ ", +" * ;.r .@]$^$'+;+;+;+K+/$q@I r _ d#w J ($;+;+;+;+;+A+_$:$O+U J ~.R s@s@J r r Q s@<$P J q@S r 1 ) . [$7#I Q s@Q P I J w+J r N G b a }$|$T J R s@w+P r r r P s@Q O+U R J r T#1$_ r *.h#<+_+_+_+_+<+h#*.r Y#1#H#`#4+1+_+_+_+_+[+-@2$` 3$4$:+_+_+_+<+5$6$Z h. .r J.k y#m.r 0+7$m+y.i.r r ` e.<+_+_+_+_+_+C@m# .r 8$ l.J.r I.P@<+_+_+_+C@[++$e.h.r 9$ Y#U 0$E+c#a$b$c$I Q s@J r r d$C#1#e$ * h O+r f$S+;+;+;+'+g$,.h$J i$j$y+'+k$(#I R.C ", +" C+r l$m$v@z+;+;+;+K+n$o$q@r p$e# q$r +#r$;+;+;+;+;+A+s$t$R I u$v$w$x$y$~$z$r@A$B$C$D$E$F$G$q@r b v+ s#@.r P+s@H$(.I$J$U+K$L$M$w+r >.S N$~.O+O$P$Q$W+R$S$!.U 2.c$T$&+U$V$W$,.+#G.j _ r *.h#<+_+_+_+_+<+h#*.r K 3 *.X$h+1+_+_+_+_+:+Y$x.&.t+Z$<+_+_+_+_+<+`$P@F@ %i.0+r 0 .%r ..+%@%2$..r r ` e.<+_+_+_+_+_+C@m# .r 8$ I#r H.#%|+_+_+_+_+_+1+$%` &.d # l#s@).^$%%&%*%B+=%-%@# +;%U H#G %. v r `@>%K+;+;+;+;+y+,%@#q@'%K+K+)%z$R r |#- ", +" U#Y#O++#!%'+;+;+;+;+'+2#:$r s ] I#r w+~%y+;+;+;+;+K+{%]%^%/%(%##X@_%)+=+:%<%[%w@K+'+K+K+}%|%q@r P#l.v G.U a@1%n@T.S+;+2%:#A+'+3%G+w+S Q$4%R+5%6%7%.#&%8%9%1.:$).0%;+K+'+'+A+a%b%P 0 *$r *.h#<+_+_+_+_+<+h#*.r r r O@c%d%<+_+_+_+:+4@e%Z r H.|@|+_+_+_+_+_+_+<+_+f%g%a.~@x.&.r r &. .&.r r r ` e.<+_+_+_+_+_+C@m# .r 8$ l.)#Y h%3@d+_+_+_+_+d+i%s+*.7#j%%#f@k%y+;+;+y+y+'+K+l%m%n%U R >.o%++ p%d$Q G$q%A+;+;+;+;+z+,+R+J+r%s%m$R r t l. ", +" l H#t%u%v%y+;+;+;+K+w%/.x%r Z# * {.r R 2%'+;+;+;+;+)+y%z%A%U.K+K+'+;+;+B%F+;+C%K+;+;+;+;+A+2%D%~.=#R#r R b$E%F%K+)+G%H%O$I%F#y+)+J%K%r@'.L%w%A+K+'+w@y+M%u#N%O%T+8%'+;+;+;+z+P%V+a@H#3.r *.h#<+_+_+_+_+<+;#h.Z h.Q%@@R%[+_+_+[+S%T%E.;$G.r *.U%V%<+_+_+_+_+_+_+_+[+[+i+W%#@ .h.*.r r r 0 .+0 ` e.<+_+_+_+_+_+C@m# .r 8$ < 4.r Z ,@d+_+_+_+_+_+`$>#Y H 0 X%].3#A+;+;+;+;+;+;+;+K+;+Y%P$w+r Z% e#`%r 2. &=+'+;+;+;+;+y+S+y+.&+&S G.R.^ ", +" %.4.J m@(%S+;+;+;+;+y+@&r@r s 6 K.=##&$&%&y+;+;+;+;+y+&&s@*&=&%&w@;+;+K#L%z+O.<%g@-&'+;+;+;+A+;&Q r r ].0#>&K+'+K+>+z$,&'&)&!&y+w@~&|%$+c$(#{&]&;+;+;+K+^&K%/&%%(&_&!$y+;+;+y+;+:&N$r r r *.h#<+_+_+_+_+d+4+<&5+[&[@(+d+_+C@Q@$%}&h.Z G.3.R#G.Z e.+$<+_+_+_+_+_+_+_+_+<+[+|+|&1&7+Z *.r 2&] .%` e.<+_+_+_+_+_+C@m# .r 8$ * O#r Z 3&d+_+_+_+_+_+_+6+ .r r s@u@.#A+y+;+;+;+;+;+;+;+w@Y@T@^.T Q#^ k@Q#r s@4&F%'+;+;+;+;+;+;+5&I%h$J w ( ", +" , a ].6&y+;+;+;+;+y+&%7&R r G 8&r 9&0&;+;+;+;+;+'+a&1%b&c&W$d&y+;+;+y+;+e&R q@f@f&y+;+;+;+'+g&T G.s@h&G%'+;+y+Y.n%t@S@i&j&K+;+'+V.x#q@I S #!+;+;+;+'+k&z%Y.l&I m&2#y+;+;+w@n&&&2.r H#r *.h#<+_+_+_+_+_+(+,@,@<@_+:+<+_+<@o&p&7.1.8+&.3.| w r h.c.V%[+<+_+_+_+_+_+_+_+_+d+<+_+q&r& ...l#G Q#` e.<+_+_+_+_+_+C@m# .r 8$ - 1#r ` s&d+_+_+_+_+_+_+y. .r r 5#t&W.5&X.K#K+A+'+;+;+;+;+;+'+0&u&r v&- : r r P+w&x&M%y+;+;+;+;+y+'+y&H#T =#, ", +" z&&.A&B&K+;+;+;+;+w@T.C&r r [ m.P r D&K+;+;+;+;+S+!%+#P P+y&S+;+;+;+y+j&s@I r t@E&;+;+;+;+'+F&U <$P$G&z+;+;+'+H&].r s@w$I&'+;+S+J&N+U r S K&;+;+;+'+a&D$,+L&2.I <$T.y+;+;+K+2%K%<$a i@r *.h#<+_+_+_+_+d+W%6.M&N&O&k+<@<+_+d+<+`$P&Q&` Y r w H r 0+R&S&q&1+d+_+_+_+_+_+_+_+_+_+<+_+T&h.*.r r ` e.<+_+_+_+_+_+C@m# .r 8$ - L r ` U&d+_+_+_+_+_+_+V& .r r O+!.x#W&X&Y&Z&`&<#K+'+;+;+;+y+[#X+U m.e# e$t >.J 2.1% *Y.;+'+;+;+;+;+;+'+.*N+r *$6@ ", +" %.`%U (#+*y+;+;+;+;+y+0&R r #+e# [ a `@@*U.z+;+;+;+w@!&)&t@R v#T.'+;+;+'+#*$*U r I %*&*)+;+;+;+'+**R Q =*K+;+;+;+&%T$R l$X%-*K+;+'+7%P$w+r r `@6%w@;+;+;+!+o@;*:$I P+K&P%;+;+;+z+y&9&r R.1#r *.h#<+_+_+_+_+<+;#h. .h.8+K@r+i+<+_+_+_+1+_+>*S@Y 3.H r G...I.,*'*q&<+d+_+_+_+_+_+_+_+C@<+C@)*` &.r ` e.<+_+_+_+_+_+C@m# .r 8$ * u r ` s&d+_+_+_+_+_+_+a...r S#r O+R P+].r@N%Q !*~*X@'+;+;+;+K#{*w+w C 6@`%r w+H$]*[#C%/%^*O.K+;+;+;+;+;+K#G#/*r ] ", +" X 1 P (*P%;+;+;+;+;+;+|%J r L o#I ].g&A+;+;+;+;+K+7%_*U 5#:*K#;+;+;+Y@<*[*r r T O$}*K+;+;+;+'+|*c&_&K#z+;+;+y+1*A#S 2*D&z+K+;+h@P$s@>.r J G$.#'+;+;+;+Y@3*r l$I ].}*K+;+;+;+Y.4*q@r u Z%r *.h#<+_+_+_+_+<+h#*.r H#r &.8+n+|+_+_+_+_+<+[+5*6*&.` ` r r &.0+Z >#O&7*8*d+<+_+_+_+_+_+C@[+9*7+..r ` e.<+_+_+_+_+_+C@m# .r 8$ * O#r 0+'@d+_+_+_+_+_+3@7+..r m _ 4.R.b 0 =#r U 2.b&v#0*y+;+;+;+@&`@r C ]+r Q v$a*A+)+Z+b*c*d*e*w@;+;+;+;+K+f*:$r >$ ", +" d#q T @#;+;+;+;+;+y+g*K%P 3.) k@R.q@h*i*'+;+;+;+;+&%j*q@I <$n@A+;+;+K+T.H$R r r R z$T+;+;+;+'+2%k*U l*A+;+;+;+w@z%%+m*Y.-+;+2%n*I J r r r r@o*F#y+;+;+y+X.).5#r 5#p*[#'+;+;+w@q*R r H#, z&r *.h#<+_+_+_+_+<+h#*.r b N#.%r 0+f%d+_+_+_+_+_+}+6.*.r*>#r r H r &.` ...a.h#s*<+<+_+_+_+_+_+<+t* .r ` e.<+_+_+_+_+_+C@m# .r 8$ & V &.r q&d+_+_+_+_+<+U&u**.K ~ %.; l.v*k@( *$l#I l$I w*w@;+y+]*`@r ( 8&m.O+&.x*S+;+;+y*t@r S 5#I%y+;+;+;+'+W.w#R .+ ", +" d#q J z*;+;+;+;+;+'+c#0$A*2 % = O#r q@B*K+;+;+;+;+z+C*P+r D*K%E*y+;+;+A+F*m&I r r Q G*'+;+;+;+A+H*I*J*K*;+;+;+;+y+L*;+M*N*O*P*m@`@r r #+b &.Q*R*A+;+;+;+w@4#S*r I 5#T*A+;+;+;+z+U*Q r p#- Z%r *.h#<+_+_+_+_+<+h#*.r #+e#v&r ` V*d+_+_+_+_+_+_+W*&.X*Y*U%&.)#>$Z*r r r ..~@2$`*j+<+C@_+_+_+d+ = .r ` e.<+_+_+_+_+_+C@m# .r 8$ f#w ` A.(+d+_+_+_+_+[+)@h.r P#e$l `%3 N o%A * f .=r w++=L*@=;+U$5#r r r r Q w#T+;+y+o@x##=r r O+X%$=w@;+;+w@U.R$].3 ", +" d#q J %=;+;+;+;+;+K+&=P I j R@ m H S *=U.;+;+;+;+S+==b%P r J -=;+;+;+'+^$x@`@r r I ;=>=;+;+;+K+,=w$t@~$S+;+;+;+w@F%/%'=)=V@Q r@T U I r 1 b s@z$X@'+;+;+;+,+H$P r +#H$+*K+;+;+w@v@(*J I a G G r *.h#<+_+_+_+_+<+h#*.r J.e#!=r ` ~=d+_+_+_+_+_+_+~=&.{=1+]= .r a#%.E o#/#r G. .A@^=p+1+_+_+_+d+/= .r ` e.<+_+_+_+_+_+C@m# .r 8$ I#r 8+(=d+_+_+_+_+1+_=s+-#r |#x r O+J T O+r :=s# U##.S@Q*g&)+l%<=P+J Q Q P S E&K+;+'+X@q@r )#| r [=}=K#;+;+w@%&|=].0 ", +" { b P w&^$;+;+;+;+A+1=s@r ;. > K J r >&'+;+;+;+S+2=X+s@r r R 3=y+;+;+K+Z.P U r G.5#I+;+;+;+y+y+I+t$r 5%'+;+;+;+K+F+S ].:$q@U O+J P$O$r r r t%4=K+;+;+;+'+5=q@r r P+6=y+;+;+;+S+7=.@l@r I r 3.r *.h#<+_+_+_+_+<+h#*.r J.& 7 r ` /+d+_+_+_+_+_+d+8=&.f+:+9=x.r w k@ ~ 0=t )#r `#a=}+d+_+_+[+:@ .r ` e.<+_+_+_+_+_+C@m# .r -. ! b Z %Q@[+_+_+_+<+}+b=H.r 1 `%r U >./.X+1.P+O+d$^#e#L r c=d=C%:#o$<$e=f=g=h=P+i='+;+'+g*5#r l#v*a O+j=!&;+;+'+V.u@R .= ", +" ++k=I >.Y%A+K#;+;+A+l=s@r o# q$J.U r@&*;+;+;+;+Y@B+0#s@r r r <$m=y+;+;+w@T*N$r G.q@G$I&'+;+;+K+!%Q U r U+'+;+;+;+A+n=r@I r r U %*o=p=D$l@r P q=O*K+;+;+;+Y.r=R r I r U+K+;+;+y+T+-=c&s=t=K%T r r *.;#<+_+_+_+_+<+h#*.r #+6 o#G.H.P@d+_+_+_+C@<+<@$$G.r.:+u=v=i.r @.{$ u+w 0+w=x=<+_+_+C@C. .r ` y=<+_+_+_+_+_+C@m# .r +@d#-.J.&.t+L@d+d+_+C@<+d+z=i.r r d j.U 1.A=;+&%B= &s@q@r p#/#U w+x*C=w*q@F*w@z+'+L%H$D='+;+'+F%O$U w ' p#O+E=!&;+;+'+L%U I u ", +" / r s@F=G='+;+;+K+y&I I c ' f _ q O+].}.H='+K#y+'+I=J=+#G.r r S @#X.y+;+y+n&@#S r C&s@K='+;+;+K+H&L=O+r u&z%S+;+;+;+K+B#l$I r T Q*M=H=%%N=~.r R J=,+w@;+;+Y@O=m@P=r Y K%X@w@;+;+A+Q=t@]%v%R=b$P=r r *.S=<+_+_+_+_+<+T%*.r 0 R#r Z T=q&d+_+_+_+<+C@v.0+y@r.1+<+U=]@V=r s W=8$X=F } 0 8+M@}+d+_+1+Y=*.&.r ` (@<+_+_+_+_+_+C@b= .r 7#@.r &.8+Z=<@<+_+_+[+<@!#h.r r 4 &$3.R `=A+;+;+Y@T+ -^.2.I I Q*(..-+-^.G+T+'+;+;+K+@-G$j$'+w@#-$-].H R#)#P 2*_%;+;+y+**P+r m ", +" f#2 I ].O%v%'+;+;+=+/.u&O+%-%-U J .@&-T+'+;+K+^$G**-w+G.H 2 H#Q*t=w@;+;+w@]&=-P S <$&*%%y+y+K+--m@q@r r w+%+[#'+;+;+;+;->-[=l$(*C*E#'+,-'-r r S )-K+;+;+;+w@t#:$r r P h=;+;+;+;+S+!-y%~-n$d*$+&. . .Y {-_+_+_+_+_+d+]-Y ` . .0+2$o&<+_+_+d+<+u=^-0+Z u*r.1+_+[+'@9.0+ .*.&./-(-*.h.Y _-[+_+1+:-E.Z *. .V=<-<+_+_+_+_+_+C@Q&;$ . . .` H@[-}-<+_+d+<+h+|-8+&.r c K.u+r Q y%K+;+;+;+'+'+1--%2-m@y%v@i*|*c&_&)+;+;+;+'+H&P=3-y+z+'+R*5#S U T `@e&;+;+'+==4-&.@.C ", +" +@r P s@5-n&K+'+z+3*0#>.J J m@w#6-y+A+'+:#7-G+P+J r w k.{.U O+,%K+;+;+w@F%0#!.(*8-w@K+'+X.9-c$R r H =#I s@0-v%K+y+K#w@!&F%X@T+S+&%a-P+U r r O+b-'+y+y+K+c-0#s@r r P h=w@;+;+;+;+;+z+T.d-$+*-e-6.8.D@_+_+_+_+_+_+d+_+5+c.f-=$[-q&:+1+[+C@(+P@g-Z ..Y u*r.1+[+1+1+(+h-]@g... .*.H@n.i-<+1+d+j-]@h.G.f.6.k-<@d+_+_+_+_+_+<+U=l-m-m-*@n-(+1+:+C@3@o-r&G.0+&.r t n q$a ~.0#p-A+'+;+;+;+'+;+X.&%F#O.d-P+].-=Y.K+;+;+A+q-r-s@0&Y.A+;+s-j=m@^.)&:#A+%%t-K%S r : ", +" _ H I [=G+h@^$S+C%&%3#u-@&v-y+-+Y.w-w*J*R J I )#4.F f#Q#2.x-,+'+;+;+w@T+&%T.&%-+S+o@y-).$+U r @.' f a I $+4=T.;+)+A+A+C%)+X.x&).2.I r r U {&^$;+K#K#Y@z-5#I 0 J.I O$T@K+C%)+A+o@R*,.S r *.A-B-<+_+C@C@C@C@C@C@C@C@_+d+d+d+u=<@,@R%g+C-D.` Y &.r Y u*h+:+-@h+D-C@m+d+V%E-F-G-H-C@m+8*Q@%@&...*.+%4+}+<+_+C@C@C@C@C@C@C@_+d+d+d+(+}-,@|&g+z=~#` ` *.r q k * N#r w+(.(&5&'+)+)+S+K#=+I-f&>.J r O+P=J-%%C%K+,%K-q@I ].&&==<#y+^$L-F%w@^$J%4=_*J H y ", +" 0@@+L z W=)#r r s@R x@9@M->&E+E+-&N-O-P-u%v#`@R r r r =#a# +@H Q*n@S+;+;+M%o@u%B*-*--Q-[.p*P+s@r r r p ( L s r r 5#j=y%R-Q=3#w*[.b#q@w+>.r r r O+o${*y%>-y%4=*=l@r S#i@r P v$K$S-T-U-V-5#J r r &.W-<-O&O&O&O&O&O&O&O&O&O&O&O&O&O&X-A.y=y@O@H...r r r r ..y@E-P&&.I.Y-m-Z-'#`- ;.; ;_=+;@;y.#;I.&.r &.H@$;%;O&O&O&O&O&O&O&O&O&O&O&O&O&&@&;]@U%O@H...r r r r @.M v L L M T#r >.s@I *;5-&=&=4%S$=;R `@I r r r -;O+=&S-;;H$R r r G.s@5#V->-j&>;j&1=).Q ].r r )#8 v +@~ ", +" ) *$r *...........*.a$,;';);!;~;{;~;];^;/;(;_;Y ........r /#W=*$T m@==S+;+;+K+R*P+t%O+*.=-';:; .*...................*.<;[;A#Y };h$|;1;a$..........*.^;(;2;2;2;3;4;*.........*.<;5;|;|;';6;Y *.......H.O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@8+I.x.Z ................*.7+g. . .H.A@`#Y s+!@f.w.#; .{@~@Z ........ .~@O@O@O@O@O@O@O@O@O@O@O@O@O@O@i.i.x.Z ................................*.);1;5;|;|;';(;6;a$*.........*.a$7;|;5;8;*.......*.Y 6;2;|;|;9;/;:;);..........&.r 0;# ", +" t r &.E@s+g.g.g.g.g.g.g.g.a;b;c;c;c;d;e;g.g.g.g.g.g.g.F.U%r r r P+f;J+w@;+;+A+b@b&Y A*g;h;g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.i;j;j;h;g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.E@E@g.g.g.g.#;k;y@G.U%U%E@H@g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.F.u*&.r N ", +" b 6*E.l;-@h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+h+]-h+}& .r r $+_.A+;+;+'+V.f;P+6*[-m;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+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+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+-@'#]@Z r r ", +" b h.n;o;p;o;o;o;o;o;o;o;o;o;o;o;o;o;o;o;o;o;o;o;o;o;q;X*f.6*r U >.r;z+;+;+A+H&>.s;t;W%.;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;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;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;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; ;4$y@..r r ", +" p &.k;n.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.w.g.r r O+Q u;K#;+;+;+A+!%I v;U%f.w.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.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.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.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.!@g.*.r r %# ", +" &$Y#&.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` Y J w;&*J%z+)+A+A+A+)+x;>+3#y;z;` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ..r r r Y# ", +" % ;./#H )#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#%#r P=j=J$A;H&!$!$!$!$!$B;C;m%z%P+r r d$)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#c ) ", +" X=' f f f f f f f f f f f f f f f f f f f f f F `%r I Q*N%N%N%N%N%N%N%N%N%N%].>.r 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 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 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 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 l. ", +" k@b r r r r r r r r r r r r r r D D; ", +" [ n#p$p$p$p$p$p$p$p$p$p$p$`%E;! ", +" F;G;H; ", +" I;J;K; ", +" L;M;N;O; ", +" P;Q;N;R; ", +" = S;T; U;T; V;W;N;X; ", +" Y;Z;`; > - .>+>@> #>$>%>&>- ", +" *>=>N;-> - ;>N;>> *>= ,>'>)>!>= - - U;= ", +" ~>{>]>^> - >>N;/>U; U;(>_> :><>[>}>|> 1>2>3> |>4>5>U; ", +" _>6>N;7>- 8>H;& 9>0>a>b> *>c>d> *>e>f>g>h>S; i>j>k> l>N;m>n> H;o> ", +" 6@p>q>r>s> #>t>s> u>v>w>x>& y>z>Y; S;A>B>C>D>1> |>E>F>8> e>N;G>H> L;I>J>- ", +" T;K>L>~> M>N>O>P>|> H;Q>R>= S>T>U>V>o> W>X>n> Y>Z>`> ,.,n> +,@,4> 8>#,$,%,y> *> &,N;*,- ", +" V;=,N;-,Y; U;;,>,,,.> 7>',), @>!,~,{,], O;^,/,(,_,:,<,[,},|,V;y>N;1,U;o>2,3,4,>> = >>Y> & c>5,b> ", +" L;t>6,7,&, 8,9,0,a,(, b,N;c, d,e,f,g,h,|>i,j,N;Z>N;k,l,m,n,o,j>p,N;A>q,r,s,t,u,*, Y;v,H> ,>Z>A>6@ ", +" n>w,x,y,Y; (>z,A,B,p,X;1>L;C,N;Q>D,r,E,F,G,@,H,_,^,I,J,K,L,M,N,O,P,Q,R,S,5,J>+>T,U,V,+>8> W,X,Y, H;+>Z,;> ", +" T;`, '.'n> +'p,@'#'$'%'v,M;v,N;N;X>&'*'='-';'>',''')'!'~'{']'^'/'('_':'<'['}'|'1'2'o,3'), r,4'5' = R>6'7'8' ", +" 9'0'a'b'P; s>c'd'e'f'g'h'i'j'k'l'm'n'o'p'q'r's't'u'v'w'x'y'y'y'z'A'B'C'D'E'F'G'H'I'N;5,p>J'1,N;>> y>K'L'M'N' ", +" K>O'P'Q'e> 2>R'S'T'U'V'W'X'Y'Z'`' ).)+)@)#)$)%)&)*)=)-);)>),)')x'))!)~){)])^)/)()_)N;:)<)[)^,N;7> U;X;4'})|)1)2) ", +" L; & O;3) 4)5)6)7)5)i,8)9)0)a)b)c)d)e)f)g)g)h)i)j)k)l)m)n)k)o)p)q)r)s)t)u)v)w)x)y)z)A)B)C)D)E)F)N;G)H)I)J)N;K)F;I;N;L)M)N)O) T;i,P) ", +" U;Q)R)8> & S)_, > L;E>T)U)V)W)X)N;Y)Z)`) !.!.! ! ! !+!@!#!$!%!&!*!=!-!;!>!,!'!)!!!~!{!]!^!w)/!(!_!:!<![!N;}!|!1!2!3!1'G>N;4!5!6!7!e> - 7>[)8! ", +" 8>/>9!0! 4)a!b!|> O;J;c!d!N;e!f!g!h!i!j!k!l!m!n!n!o!p!q!r!s!t!u!v!w!x!y!z!A!B!C!D!E!r)r)F!G!H!I!J!K!L!N;M!N!O!P!Q!R!S!T!U!V!W!X!;> Y;I;{>0!8>& - ", +" #>z>Y!Z! R>N;e>8>N'p,`! ~.~+~@~#~$~%~&~*~=~-~;~>~,~'~)~!~~~{~]~^~/~(~_~_~:~<~[~}~|~1~2~3~4~5~6~7~8~9~0~a~b~c~d~e~f~g~h~i~j~k~l~6>->/>N;m~ Z!4>T; ", +" n~c'{>X;6@ o~N;G>`;p~q~r~s~t~u~v~~~w~x~y~z~A~B~C~D~E~F~G~H~I~J~K~L~M~N~O~P~Q~R~S~_~T~U~V~W~X~Y~Z~`~ {.{+{@{#{${^'%{&{1!*{={-{;{>{,{{>N;E> &,5,'{ > ", +" i,J;N;8,q, ){3'N;N;!{~{{{]{^{/{({_{:{<{[{}{N;|{1{2{3{4{5{6{7{8{9{0{a{b{c{d{e{N;f{g{h{i{j{k{l{m{n{o{p{q{r{s{t{u{v{w{x{y{l,z{A{B{C{D{E{{>H>N'9)^,(, ", +" H>N;F{G{H{d,& 1>I{N;J{K{-~L{M{N{O{P{Q{R{S{T{U{7,V{W{X{Y{Z{`{ ].].].]+]@]#]$]%]&]*]=]-];]>],]'])]!] !~]{]]]^]/](]_]:]<][]}]|]1]2]3]4]5]6]7]8]',9]0]3> ", +" q,a]N' H;/>b]c]d]W;p>+>N;e]f]~~g]h]i]j]k]l]m]n]o]p]q]r]N;s]t]u]v]w]x]y]y]y]z]A]B]C]D]E]F]G]H]I]J]K]L],]{~M]N]O]P]Q]R]S]T]U]V]W]X]Y]Z]`] ^.^+^@^#^$^%^&^x>6@ |>8> H;8> ", +" 8>*^^,9)F;& n~=^-^;^>^,^L{'^)^P~!^~^{^]^^^/^(^_^:^<^[^}^|^1^2^3^4^5^6^7^7^7^7^8^9^8^0^a^b^c^d^e^T{f^g^h^i^L]j^{~k^l^m^n^o^p^q^r^s^t^u^v^_'w^x^y^z^A^B^C^D^E^ _>X;4>P) O;F^u> ", +" G^H^I^J^K^p> > *>L^M^N^O^P^Q^R^S^T^7{U^V^W^X^Y^Z^`^ /./+/@/#/$/%/&/*/=/-/;/;/>/>/>/7^,/'/)/!/~/{/]/^/Y{////9{(/K]>~n!M]_/:/</[/}/N;|/v'1/2/3/4/5/6/7/8/9/0/N;M;&,R>6>a/C, > b/x>4'c/&, ", +" = d/e/f/g/h/H,D, X;i/j/~~k/l/m/n/o/p/q/r/s/t/u/v/v/w/x/-/y/z/A/B/C/D/E/F/G/G/H/H/I/J/w/K/L/M/N/O/P/Q/U^z]z]o///R/S/K]T/M]U/V/W/X/Y/Z/`/') (.(+(@(#($(%(&(*(=(-(X>;(X>W> >(p>,(N;c/i>= ", +" '(s,)(!(~({(W>T; H>^,](^(9{9{/(((_(z]Y^:(<([(}(|(I/I/1(2(3(4(5(6(7(8(9(0(a(a(G/a(G/b(x/c(d(e(f(g(h(i(t]9^z]j(k(.]8{9{x~l(m(n(o(p(q(r(b)-),)s(t(u(v(w(x(y(z(A(B(C(;(Z! P;,>e>c'D(E(^,>>= ", +" F(G(H(I(J(K(1,J'){I>L(M(I]//N(O(P(Q(R(S(T(U(;/;/1(G/G/a(V(W(X(Y(Z(`( _._+_@_#_a($_%_a(&_*_=_-_;_>_,_'_)_!_,/~_{__(//8{S/]_^_/_(___:_<_[_}_|_1_2_3_4_5_6_7_8_9_0_a_b_p>n~C,c_5,d_e_f_g_p~8> ", +" 9'h_i_j_k_l_m_c_n_o_k]p_q_r_s_t_u_v_w_-/x_y_G/a(a(z_#_V(A_B_C_D_E_F_G_H_A_I_J_K_L_M_N_O_P_Q_H/R_S_T_U_V_y/W_X_Y__(Z_`_ :.:+:@:#:$:%:&:*:=:-:;:>:,:':):!:~:{:]:^:/:(:R'N;_:::<:[:}:L^2) ", +" >(,>( e>9]|:1:2:3:4:5:6:7:8:9:0:a:b:c:d:v_e:2(a(#_#_f:f:J_g:h:i:j:k:l:+_m:n:o:p:q:r:s:t:u:v:w:x:z_V(y:z:A:y/B:C:D:E:F:G:H:I:J:K:L:M:!{N:O:P:*:Q:R:S:T:U:V:W:X:Y:Z:`: <.<+<@<#<$<%<&<-,S; ", +" Y;*<p,=<H;x>5,-<;<><,<'<)<!<~<{<]<^</<7,(<_<f(:<V(#_f:<<I_I_<<[<}<|<1<2<3<4<5<6<7<8<9<0<a<b<c<d<f:#_e<$_f<$_Q_g<h<i<>_j<k<l<m<n<o<p<q<r<s<t<U~u<v<w<x<')y<z<A<B<C<D<E<F<G<H<I<J<K<L<M<3) ", +" |>N<O<L; d,H,;(*<P<',N;Q<R<S<T<U<V<W<X<Y<Z<`< [N; _.[+_h:+[I_@[#[$[<<%[a<&[*[=[-[;[>[,['[)[![~[{[][^[@[$[/[I_/[([_[][:[N;<[>_S([[}[`^|[1[><2[3[4[5[6[7[8[s)]!9[0[a[b[c[d[e[f[g[h[i[j[k[l[E(5> ", +" V;m[X)n[o[- T;J>N;[)[)N;Z,p[q[r[L:t]s[t[u[v[w[x[y[z[A[B[C[)[4<D[E[$[F[2<G[H[I[J[K[L[M[N[O[P[Q[R[S[T[3<$[$[$[@[@[p:2<U[V[W[X[Y[Z[T(`[!_ }Z^.}+}@}#}']{~6[$}8[%}&}*}=}-};}>}z{e[f[,}'})}!}~}X>N' ", +" 8>R)p,G>Z>4>o~|> H;_,N;N;N;N;{}]}(^^}/}(}_}:}<}a(2<[}}}|}1}2}3}4}5}6}7}8}9}0}a}b}c}d}d}d}K[)[e}f}g}h}i}F[,[,[$[$[j}k}l}m}n}o}&/p}q}I/-/S(r}B]0:s}t}u}v}w}x}U~ !e){!y}z}A}B}C}D}E}3]F}G}H}I}J}E>U; |>K}s>8> ", +" 3)L}^,M}N}O}P}W,o>#>&,z>N;N;N;N;N;K(Q}E/R}-/S}%_T}#_U}2<V}W}X}Y}Z}`} |.|+|@|#|$|%|d}d}d}d}d}&|*|=|-|;|>|,|)[,[K[K[$[c<'|)|!|~|{|]|^|Q_T}F/;/-//|t](|_|:|p_<|[|}|||~]1|]!2|;:,:^'3|4|5|6|7|8|9|N;-,0|H>8,W;X)m~= ", +" P)a|^,b|c|W<d|e|c'm>o,f|g|h|i|j|N;k|l|m|b(#_#_#_/[<<b<n|o|p|+|q|r|s|t|)[u|o,v|w|x|&|y|y|c}z|A|B|C|D|E|F|G|H|c}K[K[K[I|J|;[4<K|L|M|L_N|a(1(;/;/O|P|Q|R|S|z~T|U|}|.!u<q)V|W|X|y<Y|Z|`| 1F}.1+1@1;(^,N;m>/>+'2) ", +" _>E>#1$1%1&1*1=1-1;1>1`_,1'1)1!1N;~1{1]1#_f:I_<<$[U}^1/1(1%|=[2<H|_1l::1<1[1}1|1x|11c}213141516171819101a1b}d}d}K[K[b1c1$[,[d1E[f:#_#_a(1(;/8^e1>_f1g1h1i1k/j16[ !k1]!l1m1J!n1o1p1q1+^r1s1t1,{;(|,d/|> ", +" 3>a|u1v1w1u!k/x1]_y1o/z1j<A1B1C1D1E1F1I_I_I_$[#[G1%[H1I1J1K1N[y|y|w[L1M1N1O1P1Q1R1S13131T1)[w[y|U1E_V1W1y|d}d}d}c}d}K[X1Y1,[p:$[Z1`1#_2( 2>_.2+2@2#2$2%2&2,]*2$}=2-2;2>2,2'2)2!22]~2{2]2^2<)4'1> ", +" _>c>/2(2_2T/:27{B]z]<2|(S([2}2|21222@[@[@[3<3242526272829202y|y|a2b2c2d2e2f2g2h2i2U141j2k2l241m2n2o2n2p2y|q2q2y|p2y|n2_1r2s2K[,['[t2N|u2v2w2x2y2z2A23{B2K]C2U~D2E2F2G2H29]I2J2K2L2M2N2O2P2m>S> ", +" |>Y; H;Q2R2S2T2U2.]z]z]S(>/V2H/0(&_f:g:@[$[;[W2X2)[=[Y2Z2`292y|02n2K1 3.3+3@3+|#3$3S1S1$3%3S14141414141413131p2p2&3&331l2l2*3=3&3-3K[<<;3>3,3'3)3!3~3{3]39{^3>]/3(3_3:3<3[3:^}3|3132333435363N;73 ", +" >(h,L^83i>93~[03%2a3.] }b3c3R}b(a(V(T}<<@[$[@[w[d3e3f3g3)[h3i3j3p2n231z|k3l3m3x|n2n3j34141o3p3414141414141414141313131314141j2q3=34131p2K[7<r3s3t3f(u3v3(^w3//x3-~y3H2z3A3+|E_B3C3D3E3F3e[G3H3I3:,J38! ", +" 2),>7>M<K35,N;=1]_L3M3^}N3O3m|P3<}N|/[@[$[$[,[y|Q3R3S3T3U3%|8<&|313131U1V3W3X3E_31414141414141414141414141414141414141414141414141414131Y3I|^[y:;_Z3`3 4r_A].4o<+4@4#4$4E_k2318<%4&4!:*4=4D<-4;4>4N;,4'4- ", +" L;_>)4Z>!4~4{4Z_Z^t]]4^4/4(4_4:4%[<4;[[4K[N[}4*||4N;142434%|)[44313154K164S14141414141414141414141414141414141414141414141414141414131d},[74849404a4b4c4d4e4f4g4h4i4414141m2v_j4k4l4m4n4o4p4q4r4s45,X;*> ", +" b!t4u49:B]y]/}v4w4,2x4y4z4A4B4l:C4)[C4C4E_D4E4F4G4H4I4J4K4414141L4L4414141414141414141414141414141414141414141414141414141414141&3d}$[f:M4N4H/O4r}8:P4Q4R4y/n2k2k241m2S4T4U40>V4W4X4Y4Z4`4 5.5[)=< ", +" ),+5c,_> |>H,@5#5((A]$5R}%5&5*5=5N;N;-5;5>5,5'5)5!5~592{5]5^5/5(5_5:5C44141414141414141414141414141414141414141414141414141414141414141414131p2K[#[I_]11(<5[5}5|5152535f(E_9292)[8:45556575859505a5b5c5d5e5c_^> ", +" d>f5z[g5W>_> _>h5I:3{i5 }8^R};/F12<j5k5l5m5n5o5p5q5r5s5t5%|%|u5v5w5x5y5z5K14141414141414141414141414141414141414141414141414141414141414141414141l2n2X1@[t2V2%5A5B5C5D5E5F5G5H5I5J5K5L5M5N55-O5P5Q5R5S5T5U5V5W5X5S) > ", +" 4>~[Y5Z5`5=,I;'4Z! 6.6Q_0:0:+6[2@6#6$62<%6&6s5*6=6-6;6>6,6'6)6E_!6~6{6]6E_j3k24141414141414141414141414141414141414141414141414141414141414141414141j2m2_1I|@[#6Y[^6/6(6_6:6<6G'[6}6|616263646566676869606a6b6c6d6e6f6:> ", +" N'g6h6i6j6k6l6m6J;;(n6o6p6q6r6s6t6T}z_'[C4u6v6w6x6y69292%|j3n211z6A6B6]6n241414141414141414141414141414141414141414141414141414141414141414141414141C6o3l2d}M[f:v_D6t4E6 6F6G6H6I6J6K6L6M6N6O6P6N;J}Q6R6S6T6U6V6W6X6Y6c_P) ", +" |>K>c'Z6`6 7.7+7@7#7$7t4%7&7*7=7-7S4<<7<E_;7>7,7'7)7d}y|T131U1!7~7{7]6414141414141414141414141414141414141]7S1414141414141414141414141414141414141414141&3d}^7/7(7_7:7<7[7}7}7}7}7}7|71727}73747576777879707a7b7N;Z,N;Y, ", +" P)`;c7d7e7f7g7h7i7j7k7l7m7n7f:<<@[#[M[)[o7p7q7)[y|m2313131S1r7s7%|%|]7k241414141414141414141414141S1t7C64141414141414141414141414141414141414141414131Y3k}@_u7v7w7x7y7}7}7}7}7z7A7B7C7D7E7F7G7H7I7J7K7L7M7N7O7;(X,P7 ", +" U;2>c'Q7R7S7T7U^u/x/[2U7N|T}I_@[#[V7J[l:W7X7Y7Z731313141`7 8.8+8@8#87141414141414141414141414141]7414141414141414141414141414141414141414141414141l2n2N[I_$8f(%8&8*8}7=8=8}7-8B7N;N;;8>8,8'8)8!8~8{8]8^8/8(85)r,*> ", +" ~>_8N;:8<8[8}8>/1(#_#_I_J_c1f(b1N[8<|8182844n244j338C448586878889841414141414141414141414141]7`7414141414141414141414141414141414141414141414141&3K[@[N|+_08a8b8}7}7}7}7c8]8N;N;d8e8f8g8h8i8j8N;N;k8l8m8v,W, ", +" o>~>&,0|Z!E^b>1> = P7Y>K;V;2)- S;W;N;N;n8o8+6>/H/#_#_I_a}8<p8q8r8}4s8t8u8i4v8+|i4t771w8x8y8z871k241414141414141414141414141]7j241414141414141414141414141414141414141414141414131_1;[A8B8C8D8E8F8}7}7}7G8H8I8J8K8L8M8N8O8P8Q8R8S8T8U8V8X)W, ", +" >(;>I{W8X8<)Y8Z8`83'K>T; *>9'v,a!L} 9I;.95,N;N;N;+9@9y/H/b(#9l:$9%9&9*9C4=9C4y6-9%|x|;9>9,9z|+|'9)9!9-9L4414141414141414141414141414141S1414141414141414141414141414141414141414141414131&3D[~9{9]9^9/9(9_9:9}7}7<9[9}9}7|9192939i849596979}789999>- ", +" #>09a9b9c9d9e9f9g9h9i9j9k9M;4) G^r,830]N;N;N;N;l9m9n9N;o9p9q9z:+_,5r9b_s9t9K1l:u9v9w9x9y9z9A9B9C941+||1D9E9j341414141414141414141414141414141414141414141414141414141414141414141414141414131p2F9j}G9H9I9J9K9L9M9N9O9}7}7}7}7P9Q9R9S9T9U9k8V9}7W9X9N;Z>-> ", +" 6@O;Y9N;;(Z9`9 0.0.0+0@0#0$0%0&0*0E^|> _>i>9)N;N;=0-0;0>0b_,0f('0*5)0!0~08<)[{0]0^0/0(0_0:0<0C4j3414154C4i43141414141414141414141m2414141414141414141414141414141414141414141414141414141414131[0I[b}q:}0+6t]T<|010203040}7}75060N;70N!f~80N;S8}79000a0b04'r, ", +" c0[)c'6>Z>d0e0f0g0h0i0j0k0l0m0n0o0p0J>S; J'_,q0r08:s0t0u0v0w0x07,y0z0A0l:O[B0C0D0E0F0G0@3-9V14141414141L44141414141414141414141C641414141414141414141414141414141414141414141414141414141413131y|K[74V(b(O|H0(^I0J0K0L0M0}7N0O0P0Q0R0S0T0N;U0V0W0X0Y0Z0`0K)V; ", +" y>Y,o>),~> 9N; a.a+a@a#a$a%a&a*a=a-a;aI{~> H;A>>a,aR|'ae1)a!a~a{a]a^a/a(a_aY2=[n3:a<a[a}a|a1ai241414141414141414141414141414141414141414141414141414141414141C64141414141414141414141414141414131p2F92az_b(3a6^B]4a5a6a7a8a9a0aN;aabaw^cadaeafagahaiajakala^,)4 ", +" - H;93N;manaoapaqarasatauavawaxaya:>= +'5)zaAav]y]S(BaCaDaEaFaGaHaIaJaKaa2Z7V1l:x|LaMaNa%|j34141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141l2p2d}Oa74z_;/Pap/T^j^QaRaSaTaN;-}UaVaWaXaYaZaN;N;`a b.b+b@ba6v,N' ", +" Y;*<#b$b%b&b*b=b-b;b>b,b'b)b!b99C,P; *>c0N;~b{b]by]S(^bx//b(b_b7<:b+_8<<b21y|y|n2l2E_[b}bK4j3414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141[0y||b1b2b3b3aA]7{4b5b6b7bN;8b9b0babbb ^cbdbebebfbgbhbibjbkbj,y> ", +" P)lbmbnbobpbqbrbsbtbubz{vbwbxbj,G;1>H;5'a/N;ybzbAbZ^R(A1BbCbDbb<U}$[V7Ebd}y|c}y|n231n298%|S1414141z|U14141414141414141414141414141414141414141414141414141414141414141414141414141414141414141&3d}FbZ1`1Gb;/HbIbK]JbKbLbMbNb*}ObPbQbRbSbTbUbVbWbXbYbZb`b c.cI{+c ", +" J'',N;@c#c$c%c&c*c[,=c_'-c;c>cN;j>+>4'=!,c'c)c!cs0Q_~c+9{cq|4<7<$[M[K[K[]cl:n2n23131&331414138E_i2o3U1414141414141414141414141414141414141414141414141414141414141414141414141414141414141l2p2^c2ae</cM4V2 }8{K](c6[_c:c<cW|[c}c|c1c2c3c4c4c5c5c6c7c8c9c0cK3-> ", +" b>X>acbcccdcecfc,bgc%{hcicjckclcmcncocpcqcrcE/sctcucvcwcQ_f<<<@[M[N[s2xcyczc&|3131314141U1x|AcBcCcDc41414141414141414141414141414141414141414141414141414141414141414141414141414141414131y|$[1b`1M4#6A:y]EcK](c6[FcGcHcIcJcKcLcMcNcOcPcQcRcSc3cTcUcVcWcXcI>2) ", +" Z!;(YcZc`c d.d+d@d%{]'~)#d$d%d&d*d><=d-d;d>d,d9]'d)dd<!d~d@[@[M[I|{d]d^d/dz|31313141U171(d_d:dx|S141414141414141414141414141414141414141414141414141414141414141414141414141414141414131y|<d[d2a}d|dI/ }8{K](c6[1d2d3d4d5d6d7d8dSc9d0dadbdcd5cddg_edfdgdJ3N' ", +" & 4>Z,hdidjdkdldmdO,ndodpdqdrdsdtdudvdwdxd _h(ydzdAdBdCdDdEd@[#[J[y6FdGdHdV1313131413898IdJdKdLdMdL4414141414141414141414141414141414141414141414141414141414141414141414141414141414131Y3NdOdPdQdRdSdHbTdUdn!Vd1dWdXdYdZd`d e.e+e@e#e$e%e&e*e=e-e;e>e,e^,'e ", +" K}]>)e!e~e{e]eQ!_'ndody)^e/e(e+!*2_e:e<e[e}e|e1e2e3ej|4e5e6e,[+|$|p77e8e&|3131314141389e0eaebecede4141414141414141414141C6m241414141414141414141414141j2t7314141414141414141414141l2[0ee<d[dPd`1feI/geheUdn!iejekelemeneoe*epe4cqeddresete*euevewexeyeN;4>|> ", +" u>j,zeAeBeCeDeEe3/!)y)w)%}u<FeM]j^x~GeR|HeIe`[JeGaKeLeMe:bl:L1NeOePew[Qe31313131K1z|V1E_x|Re41414141414141414141414141]7`741413841414141414141414141C6Seo34141414141414141414131m2p2TeUeVeZ1t2b(WeXeYej^Zez!`e f.f+f@f3c#f*e$f%f&f*f=f-f;f>f,f'f)f!f6'-,P; ", +" H;~f{f]f^f/f(f_f3/!)y):f%}u<Fe*2,]<fw3.4[fR(w/}f|f3(1fS48<2f3f4f5fl:21c}023131j3n36f4141l23841414141U1n3%|+|+|%|%|C471v8dedeC4C4L441414141414141414141C641414141414141414141l231p2y|TePd7f8f#_9f0fXeYeafN]bfcfN;dfefffgfhfifjfkflf#fmfNcnf'2ofpfqfrfsf]>tf ", +" ^>,4ufvfwfxfyfzfAfBfCf]!u<Fe6[DfEfFf+]Gfk<HfIf1(JfV(2<KfLfMfNf]6%|+|92E_V154+|OfPfQfL44141414131i4+|RfSfTfUfVfWfXfYfE_%|%|Zf`f gC9414141414141414141414141414141414141414131[0Y3c}.gk}t2+g@g#gM3$gK]%g&g*g=gN;-g;g>g,g'gN;N;)g!g*e~g{g]g^g/g(g_g:g<ga/W;7>b/ ", +" 0![g}g|g[,1g%{A't^2g^!r)~]}|3g4g5g6g7g8g9g0gu/b(agbg+9cgdgegfggghgigjgkg-9lgcgmg%|`7414141o2E_ngogpgqgrgsgtgugu5vgwgxgygzgAgBgn341414141414141414141414141C6m241414141&3[0y|X1|bCgDgEgFgGgy]B]9{>~j1HgIgJgN;KgLgMgMgNgOgKgPgQgRgSgTgUgVg>eWgXgYgZgN;N;N;G;L; ", +" +c/,`g h.h+h_']'y'x'@hr)~]j!#h$h%h6{r[&h*h=h}(-h;h>h,h'h)h~7Ma=5!h~h{h]h^h/h(h_hL441414131%|:h<h[h}h|h1h1h2h3h4h5h6h7h8h9h0h=[ah4141414141414141414141414141C6C6m24141p2y|K[3<#[`13bbhx]A]B]q_S/B2chdhehN;N;fhghw1m)hhihjhkhN;lhmhnhohphqhrhqhshthuhvhwhW)+, ", +" F;G>xhyh2]):zhodx'@h%}u<AhBhChDhEhFhGhHhIhJhKh.5N;F0LhMhNhOhPhQhRhShThUhVhWhXhC4L44131YhZh`hN; i.i+_8<8<8<f(+i@i#i$i%i&i*i=i-iz|414141414141414141414141414141o34131y|K[I|k}t2z_;iA]>i,ia3'iS/,])i!i~i{iN;]i^i/i(i_i:i^{<i[i}i|i1imb2i3iWg4i5i6i7i8i9iN;x> ", +" V;c_0iaibicidieiz)Cf%}8[~]Qafigihiiijikit]limiN;nioipiqirisitiC4E_]6uiviwixiyiziAi38V1XhBiN;%'CiC4Dip2314444O[h:u/_2EiyhFiGiHiIide41C641414141414141414141414141l2p242%[JiKiLiMiv/B],ia3a38{NiOiPiQiRiSiTiUiVi:iWiXiYi/iZi`i_igh j.j+j@j#j$j%jN;&j*j=jT3W8^> ", +" .>N;-j;j>j,j'j)jCf]!q)~]!j~j{j]j^j/j(j_j:j<j[j}j|j1j+_f(322j=98<3j(a4j4e5jn56j7jK1%|8j9jN;0j+_&|3141414141T1N[$_|[ajbjcjdjejfjde4141t7gjC641414141414141414141s2&3hjijjjkjljCa|(p/mjq_Ec^3nj)ioj<~pjqjrjT,sjtjujXiXi_ivjwjxj/im)yjzjAj_gBjCjDjEj+_x|Fjy0x>L; ", +" S;v,b9GjHjIjJjA)Kj^eLjMjtjNjOjN;PjQjX{q/Rj[2Sj&_TjUj7<#[E[K[K[&|VjWjz|l:l:z|*3p2o2-9XjN;YjZj`j31414141414131 kGa.k+k@k#k$k%|L4k241S1S1%ko34141414141414141l231d}&k*k=k-k;k>ku/R},kZ_.]8{'k)k!k/2~k{k]k^k/k(ktj_kXiXi:k<k[k}k|k1k2k3k4k5kWg6k7k8k)[de9k0k99e>H;= 1>P; ", +" 8>x>akbkckdkekfkgkx)%}hkikjkkk&4lkmknkokpkqkx/rkskEatk@[$[,[K[c}]cE_ukvkV1]cU131wk+|xkykzkSj42314141414141l2E_AkBk[1Ck]6i2l24141414141S14141414141k2k241K1j3Y3K[,[Dkj5EkFkGkJhS(<2z].]U2HkIkJkKkLkMkNkOkPkQkRk/iWiXiXiSkTk#)Uk1kVkWkXkYkZkO5`k lH|ahy6.l+l99E>p>Q>@l ", +" 3)5)#l$l%l&l*l))=l-l;l>l,lZ,'l)l!l~l{l]lm|^l/l(l^<22I_$[$[E[I|=[_l:l<l^1]cn2&3y6[l}l|l1l2lX1444141413838%|3l4l5l6l7ll:8l41414131314141414141T1U1^1]c389l0ls2,[<<_b+_alblcldly]Z_p/Ibelflgll'hlil-)jlklllmlnl1kujXiXiolplXi#)1kqlrlsltlulwhvlwlA_xlylzlAlBlN;N;N;g6 ", +" 2)1,N;ClDlElFlGlHlIlJlKlj>a!@}LlMlNlOlPlSjQl9]Rl1fV(I_@[$[$[I|E_Sl!hTlE_n2&|92UlVlWlXlYlZlc1W1k241U1p2`l m.m+m@m#m$m%mt5Md44313131313141p2p238&myc*mu8=m-m^1@[@[#_;m>m,m'mw_9^p/a3)m!m~mr~{m]m]!w)x'^m/m(m_m^{plXiXiXiXiWi:m<m[m}m3i|m1m2m3m4m5m6m7m8m9m0mamN;j>bm ", +" - 0!N;cmdmemfmgmhm7~imjmK}X;kmlmmmnmT{E:ompmqmrmMiy:S4`1@[#[sm`<|}tmum)[vm92wmxmymzmAmBmCmDmEm38U1i2FmGmHmImJmegKmLmMmNmMdo2T1o2o231n2p2y|21)[OmPmQmy5blri32g:f:a(a(I/dl`[8^y].]R/RmSmTmUmVmWm]!:fXmYmZm`m n.n+nXiXiXiXiujtj@n#n$n%n&nN;*n=n-n;n>n,n'n)n!n~n4'{n ", +" O;a/]n^n/n(n_n:n<n[nC, W,5)}nk/|n1n2n3n4n5n^<6n7n8n9nI_0nl:anb_bnx|0}v8cndnenfngnhnCfinjnknlnmnnnonpnqnrn92y6sn4ntn-9l2n3v8V1a1m221y|y|y|[0unvnwnxnynznS4f:#_a(1(;/RjAny]Z_EcIbBnCnDnEn~]Lj^!y)!)FnN!_)N;GnHn_iSkInJnm)KnLnMn;eNnak_,1,j,N;OnPnQnRnSnN;,4O;- ", +" k>]>TnUnVnWnXnYnZn`nS> & 93({ o.o+o@oJg#o$o%o&o*o=oJeJ_%[-o;o>o,o+|'o)o;(!o~o{o]o^o/o(o_o4^:o<o[o}o#||o1oz|i22o3oA0714o5o6o7o8o9o^1y|d}d}c}b1%|0o)<ao][J_T}f:b(;/;/bhboz]co8{S/j^dok!.!=2s)w)Xm2/eofogoN;hoioghtjm)jokolomonooopoH^n~|>E^~f_,3'3'3'Q;x>n~ ", +" G^I>N;qoroO8sotouo_,o> tf[)vo1{woxoyozoAoBoCoDoEoV(FoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo`oN;v6 pE_31n2deC43844.p+p@p#p$p%p^121d}d}d},[&p)[*p=pDkz_]1E/[2-/-p;p>p{3//IbK]>~,p+!'p)p(]')y'2/!p~pN;{i{p]p^p/p(p_p:p<p[p}p|pM<], - *>*>*>= *> ", +" Z!N;1p2p3p4p5pN;e> 8>+>6p7p8pN;9pk)0pap>_bp9f;mQ_cpdpepfpgphpipt5jpkp+:lpmpnpopppqprpsptpN;~6up92o231n2Qen2p2y|Mdvpwp(5xp92b}d}K[K[K[$[@[ypzpApBp_[CpDpEpt3FpGpglHpIpK]>]M]VdJpKpLpMpNpOpPpQpRpR,SpTpUp9]Y/VpuhWpXpYpZp4'O; ", +" &,j,`p q.q+qz[W8N' *,(:@q#qN;$q%q&q,1*q[[=q+_-q;qN;>q,q'q)q8<2<8<E_!q~q{q]q^qN;N;N;N;|6/q(qE__102Qe44]cy|21y|U1%|_qw6:qw[K[d}K[,[$[<<@[g:;3z:V(<q[q}q|q1qE/2qi]3q4qB2n!j1Fe5q6q7q8q9q0qaqc[bqcqdqeqfqgqhqiqjqkqlq<g4'P} ", +" &,{>mqnqoqN;W)F; +c]>N;N;N;N;~4S<|[z16^}fdlpqqqrqsqtqQ_)[[<FoG1'[52%|x|+|uqvqwqxqyqzqAqXhBqCq_121}4C4)[Di21y|o2DqEqFq)[b}GqM[k}@[F[+_tkJ_z_#_#_H/u/HqIqJqKqLqMqNqx1OqPqQqRqSqTqj'UqVqWqXqYqZq`q r.r+r@r#r$r%r&r*r5):> ", +" 6@p~^,=r-rN;;r'4- - e>;(N;N;N;r<>ro<a3A][f,r'r)r!r~r:4+_9na(g:@[@[3<{r]r^rO[a2%|]6/rQ[(r_r:r<r[r0})6}r|r1r2ra2<by|-3kg3r;[M[=[O[<<Ed4r5r6r9na(a(b(;/R}u/>_7rr!^68r9r)k0rarbrcrb)drerfrgrhrirjrkrlrmrnrorprqrrrsr7'a!u> ", +" U;b,a/N;N;Z>tr>( ~>[)N;5)c_a/urvrwrU2Ecp/xryrzrArBrCrU7;m#_f:I_<<D[DrErFrl:'[I|GrHrIrJrKrLr48MrY3a}NrOrPrQr%|>[42N[GrypI|RrSrTr+_+_UrVr:oEab(1(;/-/7^WrXrYrZrG~`r s.s+s@s#s$s%s&s*s=s-s;s>s,s'sr1)s!s~s{s]s^s/sM<+5 ", +" P;E>Z>X,a|83,>|> K;j>j,(sl>S;83_s:s<s[s7{//}sj<e1t3|s1s:}2sz_#_#_f:F[3s4s5sl:#[2j8<6s7s8s9s0sE_J[K[K[i4aszdbscsdsesyp,[$[$[32fsgshsE_isjsksP31(;/>/>/$5y]lsmsnsosl5+:psqsrsa)sstsusvswsxsyszsldAsBsCsDsEsFsGsHsN;R'O; ", +" U;c,n>k>|>*> >IsR'0|= H;=,JsKsLsMs8{//p/F:Ns'_T_(}Z[a(z_#_e<-7OsPsQs8<D[RsSsTsUsF{Vs92b1,[K[K[K[92WsXsYsZs`sq:$[@[$[S4 t.tr]+t@t#t_}$t>/>/>/9^z]z]%t&t*t=t-t+);t>t*:,t't)t!tI!~t{t]t^t/t(t_t:t<t[t}tmo|tM<N;'{k> ", +" F;]>+' H,N;1t^(2t^38{Ec3t4t@k5t6tS(;/G/1(V(F17t8t9t920tatbtctdtet32F[#[$[$[$[<<l:ftgto,ht4<^[@[@[I_f:]1f(itjtktltA1I/O|w_$5M3k(3{mtntJ]Ylotptqt</rtstjlttutvt{iakH'wtxtytztAtBtCtDta/+'P)d>a/lb), ", +" k>k> P;Et*nFtGtQax~(/HtT{ItJtKte1R}>/R};_x/LtMtNtOtzlY<PtQtb<RtStj}@[Tt#[#[$[@[+_TrUtVtWtq:@[I_f:f:#_#_MiXtYtN;Ztv_S(^}0^7gn/`t u.u+u@utd#u$u%u]!&u*u=u-u;u>u,ul5*''u)u!u~u{u]u^u/u(u_u 0|X)IsP) ", +" Y>:u<u[u}u|u1ui^2u]_3u4u5u6uz]5^+67u8uJh9uy[0uaubucu[<dutk^7euS4Q_c<g:I_I_d<fuguhuQ_tkf:#_a(a(a(a(1(u/^liu5t4^jukulumunuoupuqurusux}Ahtuuu;)2gx'~)vuwuO8xuyu'2Z4zuAuBuCuN;N;DuEuG{U; M>a|P7 ", +" U;4>FuGuHuIuJuKum(LuMuNuOuPumj_(QuRuSuTuA1UuVuWuXuYuagb(Jfz_z_Zu`u v.vag$_#_+v&_@v#vN|$_a(T}$vb(V2V2;/R}`[%v&v*vG:=v-v;v>v,v~~'v)vN:!vu<%}@hCf')Ob~v{v]v^v/v(v_v:v<v[v}v|vakW;C,5)!47> L;|> ", +" N'1v2v3v4v5vN;^]6vL:7v,28v9vco.}0vav]9bvE:cvN;}hdv2<|fb(G/a(a(N|evfvgvhvivjvy:kvlvJeb(a(2smvnv;_R}>/S(ovpvqvrvB]B]y1svtvuvvvwvxvR2yvtuo{]!x)')y'zvAvBvCvDvEvFvGvHvIvJvKvLvMv,> 4)I>E>*> ", +" H{:vNvOvPvQvRvL>SvTvUv+)VvWv]_Xvj|YvZv,1`v w.w+wIh@w#wBa;/A:V29f-h$w%w&wSjJe*w=wrk!d;/A:-w;w>wRu+6$5ju,w'wY{)wEc$g<{!w~w{w]w^w/w(w_w:w<wx)y)T:A'[w}w|w1w2w3w4w5wH<6w7w8wN;J> G^3>- ", +" P;9w0wawbw=>), P;I;a/N;cwdwHkewfwgwhwiwjwkwlwmw[5nwowpwqw>/>/-/>/}fy/=_rwy/v_swtwuwy/R}>/vwwwxwywzwQ(AwBwCwR|DwU2S/j^EwFwGw/_HwIwJwKwT]Lw,)Mw2/{)O,NwOwO>PwQwRwSwTwUwVwD(WwXw){ ", +" S>YwZw`wP7 - 7>[g x1k.x+x@x#x$x9{0{%x&x*x7g=x-x;xpvR(7^>/>/S(E:>x,x'x)xP/!x[5,/7^7^6^0^~x{x]x.}^x/x(x]_(/K]L]>]n!_xV/:x(:<x[x}x|x1x2x3x4x5x+h6x={7x8x9x&a0xaxbxcxdxexfx@l ", +" @lakgxD, 0|hxixjxkx,2TvR^lxK]Ibmxj]f^nxp]oxpxqxrx9^y]$5sx6ttxuxvxwxxxyxzxy]9^9^ }G:AxBxJqCxDxExFxGxHxj^>]M],pFeIxJxKxLxMxNxOxPxQxRxSx6_TxUx5]VxWxXxYxZx`x yD(.y+y@y4'{n ", +" tf[)c'K} tr#y$y%yN;h6&yvr*y=yUdv}-y9{2{^{ii;y>y,yo/'yC])y!y~y{y]y^y/y>_(yo/q_q_.]n/_y:y<y[y}ylk|y)i1y*26[U~1~2y3y4y5y6y7y8y9y0yaybycydyeyfygyhyiyjykylymyN;nyoypyqyrysyJ' ", +" L;+>99&, S;tyuyvylbc>wyxyyyzyAy;~T/j^L]x~ByCyDyEyFyn/`_GyHyIy.}n]JyKyLyMyNyOy8{//R/U2PyQyRySyTyUyVyWyXyYyZy~]`y z.z+z@z#zN;$z%z&z*z=z-z;z>z,z'z)z!z~z{z]z5,-,S)9)a/^z/z1mI{#> ", +" k>W8;> F;(z_z:zb/Y;P},47y<z[z#~i{;~>]K~!w}z|z1z:e2z3zN~4z5z u6zN;7z8z9z0zazmx^3K]4bbz1{czdzez,cfzgzhziz>!o{jzkzlzmznzozpzb_qzrzsztzuzvzwzxzyzzzAzBzCza!(,H;|>^>Y>x>DzEzN;I{1> ", +" +co~T; S;FzGzHzD, l>c>^,IzJzD2Kz6[t<LzMzl5Nz3gOzPzQzRzl/k/Szd_TzIhUzVzWzXz>]>]g{YzZz`z A.A+A@A#A$A%A-2=)&A*A=A-A,:;A>Akk,A'A~2)A!A~A{AN;P2]A^A/A5)O; 8>N'(,+>N;L}@> ", +" 3)(AK3O; #>lbN;_A:A<A[A}A|A=!1A2AQa3A4A5Avr6Am(]{^]^~x17Amk8A9A0ABm#~1taAbAcAd_dAKp#)eAdAfAgANphAiAjAkAlAmAnAoApAf[E< dqArAf6N;sAtAuAvAo~ H;h,N;g6|> ", +" :>N;a|P; 4>nywAl5xAyAzAAA,{BACA&!DAk'EAFA*!GAHAIAJAKAFALAMANAKz!vOAPAQARASATAUAVA7~WAXAYAZA`A B.B+B@B#B$B%B&B*B=B-B;B>B,B'BN;{>)B!B~B/>Y; Y;&,k>- ", +" D,{B]B {B^B/B(BN;d__B#qN;:B<B[B_B}B|B1B~] !ie2BU~3BD24BOj5B6B7B8B9B0B )aBD)bBcBdBeBfBgBhBiBjBkBlBcamB,bnBoBpBqBrBsBtB7!uB_,vBIswBxByBi, ", +" *>G;zBABBBakCBDB4'N;EBFBGBk'8[HBIBWmJBd)8[r)q)KBLBMBNBOB-2PBz[QBRBSBTBUBVBWB.(XBYBZB`Bd[ CU>23 1.C+C@C#C$C%C&C*CW)p>1> 1>3'=C-C;CS; ", +" |>M;>C,C'C)CO; n>lb|5!C~CbB{C]C^C/C(C_C{!:C-)Q:<C[C#q}Cwl|C1C2C9q3C4C5C6C7C8C9C0C/)aCbCcCdCeCfCgC]2hCiCjCkCX>c>i, ~>lCmCnCR> ", +" H;|,oCpCqC'e F;rCsCz,Z>tCuCvCwCxCf'yCzC,)ACBCCCN;DCECFCGCHCXBICJCKCv^LCMCNCOCPCQCRCSCTCUCVCWCXCYCZCN;N;7>Y; (,`C D.Dn> ", +" N'+D@D#D>>- _u$Df/j>b>=<09a!R~%D&D*D=D-D;D>D,DN;'D)D!D~DY|jB{D]D5x^D/D1!(D_D:DWw<D[D}D|D1D2D3DN;4D5D6D;> & >>7D8D+>6@ ", +" r,9D0DaDS; 8,bDcDx> *>&,X)N;N;N;dD=seDfDu,N;gDhDiDjDkDlDmDnDoDpDP8qDrDsDtDN;uDvDwD^,a/N;N;xDyDzDADS) > |>@lE>H{= ", +" b,S,wyb> Y;BDCD1C'4 h,!4DDEDN;N;N;FD99N;GDHDIDJDKDLDMDNDODPDQDRDSD;zTD^,UDVDWDL>]BR;_,E{XDYDZD3'bm L;T;- ", +" - 83N;c>Y; J'`DR~ EP; u>{8.E+E@EN;G{,>#EE>$E%E&EZ>*E.Dz(=EEzEz,{N;j,A>F;8,P2-E;EvB S;9'>E,EoC'E8) ", +" P;|,5,+' >(',N;X; D,a!)E!E~E99u> 8){E]E^E(>8>b>'{/E(E_E:Emb~fP; K;<E[E}E|E - _u1E2E3E9> ", +" 3>K)L^L; U;0|trP) ),',4E5ED(M;G^ _>6E7E8EN' b,9E0EaEbEl~O; L;cEdEeEc>+c *>9>fEgEhE|> ", +" |>:>tf |>=,iEjEK3E^ = kElEmE|> N'nEoEpEqErEJ' - >>sEtEuE3) RvK3vEK; ", +" L;wExEyE6>S; H,!4zE (sAEBECEIsP; ~>DEEEFE{n & 83N;L>|> ", +" - `;GEHEvB R;N;{B ,>IEJEKEC,- 2)hE#bLE0| 2)t>a/~> ", +" (sMENES; o~a/.> Y;OEPEQE{n {n4'RE+' P;t>o~ ", +" 8,N;E> N'@lS; SETEUE~> = k>K;& 6@6@ ", +" h,N;vB - - +,@,J3#> ", +" x>5)k> T;G{0]S; ", +" d,=<T; *>x>c'q, ", +" +5*,T; ", +" ", +" ", +" ", +" ", +" "}; diff --git a/config/OpenBSD_1bpp.xpm b/config/OpenBSD_1bpp.xpm new file mode 100644 index 0000000..0748119 --- /dev/null +++ b/config/OpenBSD_1bpp.xpm @@ -0,0 +1,181 @@ +/* XPM */ +/* $OpenBSD: OpenBSD_1bpp.xpm,v 1.19 2015/06/23 04:07:12 deraadt Exp $ */ +static char *OpenBSD_1bpp[] = { +"240 175 2 1", +" c #FFFFFF", +". c #000000", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"....................................................................................................................................................................................................... ............. ..........", +"....................... .......................................................................... ................. .... ... ....................... ........... ........", +".................... .. ....................................................................... ........... .... ... .................. .......... .... .......", +".................. ....... ........................................................................ ...... ........ ......... ...... ....... .............. ......... ...... ......", +"................ ......... ....................................................................... ....... ...... ........... ...... ........ ............. ......... ...... ......", +"............... ........... ........................................................................ ....... .... ............ ...... ......... ........... ......... ....... ......", +".............. ............ ....................................................................... ....... .... ............. ...... .......... ........... .................... ...... ......", +"............. ............. ....................................................................... ....... .... ............ ...... .......... ......... .................... ..... ......", +"............ ............. ....................................................................... ....... .... ............ ...... ........... ........ .................... .... .......", +"........... .............. .............. ................ .............. ...... ......... ....... .... ................. ........... ........ ............... .. ........", +".......... ............. . . ........... .... ... ....... ....... ..... .............. ........... ...... ............. .........", +".......... .............. .. . ........ .. ... .. ....... ...... ....... ............ ............ ...... ............. ..........", +"......... .............. .... .. ...... ... ..... .. .. ....... .. .......... .......... ............ ...... ............. .........", +"......... .............. .... .... .... .... ..... . ... ....... ............ ........ ............ ...... ............. ........", +"........ .............. .... ...... ... ..... ...... .... ....... ..... .......... ...... ............ .......... ............ .......", +"........ .............. .... ...... .... .... ...... .... ........ ....... .......... ...... ............ ............. .......... . ......", +"........ .............. .... ...... ... .... ...... ..... ........ ........ ........... ..... ............ ............... ......... ... ......", +"........ .............. ..... ....... ... .. ........ ..... ........ ........ .............. .... ........... ................. ........ ..... .....", +"........ ............. .... ...... .. .......... ..... ......... ........ .. ............ .... ........... .................. ........ ..... .....", +"........ ............. ..... ...... ... ............ ...... ......... ......... .. ............. .... ........... ................... ........ ...... .....", +"........ ............. ...... ....... ... ............... ..... .......... ........ .. .............. .... ........... .................... ........ ....... .....", +"........ ............ ...... ...... .... ........ ...... ..... .......... ........ ... .............. .... .......... ........ ......... .. .. ...... .....", +"......... ........... ....... ..... ..... ....... ..... ...... .. ...... ........ ... ............. ..... ......... ......... ....... . . ...... ......", +"......... .......... ........ ...... ...... ...... ...... ...... .. ....... ....... .... ............ ...... ........ ......... ..... .. . ...... ......", +".......... ........ .......... ..... ....... .. ..... ...... ....... ..... ..... .......... ...... ....... ............ ... .. ..... .......", +"........... ..... ........... .. .......... ....... ....... ..... ....... ...... ..... .............. ...... .... .. ........", +"............. ............. ............. ........ ........ ...... ........... .. ....... .................... ........ ...... ..........", +"...................................... .....................................................................................................................................................................................................", +"..................................... .....................................................................................................................................................................................................", +"..................................... .....................................................................................................................................................................................................", +"..................................... ......................................................................................................................................................................................................", +".... ...... .... .....", +".................................... ......................................................................................................................................................................................................", +"................................. ...................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"............................................................................................................................... ................................................................................................................", +".............................................................................................................................. ................................................................................................................", +"....................................................................................................... ...................... ................................................................................................................", +"....................................................................................................... ............ ......... ................................................................................................................", +"........................................................................................................ ........... ........ ...............................................................................................................", +"........................................................................................................ .......... ..... ............................................................................................................", +"................................................................................................ ....... ......... . .. ......................................................................................................", +"................................................................................................. ...... . .. . ............ .........................................................................................", +"................................................................................................. ...... . .. . ........... .........................................................................................", +".................................................................................................. ..... .. . .. . ..... .........................................................................................", +".................................................................................................. .... .. .. . . . .. .........................................................................................", +".................................................................................................. . . . . .. . ...........................................................................................", +".................................................................................................. .. . . . . . . ...........................................................................................", +"................................................................................................... . .. . . .........................................................................................", +"................................................................................................ . . .. ... .. .. .......................................................................................", +"............................................................................................... . .. .. ... .. . ......................................................................................", +"........................................................................................ ..... . . ... . . .. ......................................................................................", +"........................................................................................ .. ... .. . ... .. ....................................................................................", +".............................................................................. .......... .. . .. .. .. .. .. ....................................................................................", +"............................................................................... ......... .. . . . ... .. .. ..................................................................................", +"............................................................................... ....... . . . .. . .. . ..................................................................................", +"................................................................................. ..... . .. . . . . ....... ........................................................................", +"................................................................................. .... .. . . . .. . .. ..... .........................................................................", +"................................................................................... ... .. . . . .. .. ..........................................................................", +".................................................................................... ... .. . . .. .. ...........................................................................", +".................................................................................... . .... .. .. .. . ...........................................................................", +"..................................................................................... .... ... .... .. . .............................................................................", +"...................................................................................... . ... . . . . . ............................................................................", +"....................................................................................... .. . .. . . ............................................................................", +"......................................................................... ...... .... . .. . . . .. ...........................................................................", +".......................................................................... .. .. . . .. .. ...........................................................................", +"........................................................................... . . . .. .. ... ...........................................................................", +"............................................................................ . . ... . .. .. ..........................................................................", +"............................................................................ . . . .. .. ..........................................................................", +"............................................................................. . . .. .. . ..........................................................................", +"............................................................................. .. . .. . ..........................................................................", +"............................................................................. .. ... .. .. .........................................................................", +"............................................................................ ..... .... .. .. . ......................................................................", +"............................................................................ ....... . .. .. . . .....................................................................", +"............................................................................ ... .... . .. .......... . ....................................................................", +"............................................................................ .. . ................. .. ....................................................................", +"...................................................................... ........ .. . .... ... .........................................................................", +"....................................................................... ...... . . ... .. .. . .....................................................................", +"......................................................................... .. . .. .. ... ....................................................................", +".......................................................................... . . .. .. ... ....................................................................", +"........................................................................... .. .. .. ... ....................................................................", +"............................................................................. .... .. .. ... ....................................................................", +"............................................................................. . ..... .. .. ....................................................................", +".................................................. .................. .. ... ..... .... .. .. ....................................................................", +"................................................. ............... .. .. ... ... .. .. .....................................................................", +".................................................. ............. . ... ... ... .. .. . ..................................................................", +"...................................................... ............ .. . .... .... .................................................................", +".................................................... ........... . .... ... ................................................................", +".................................................... ......... .. ...... ................................................................", +"....................................................... ........ .. . .. ................................................................", +"...................................................... ..... . .. . . .. ...............................................................", +"....................................................... .. . .. . . . ...............................................................", +"........................................................ . ... . . .. ..............................................................", +"......................................................... ........ . .. . .. ..............................................................", +"......................................................... .. .. .. . . . ..............................................................", +"........................................................... .. ... . .. .............................................................", +".......................................................... . .. .. .. .............................................................", +"........................................................... . . . .......... .. .............................................................", +"........................................................... . . . . .............. .... .......... .............................................................", +"............................................................ . . ..... . ... ...... ... ....... .............................................................", +"............................................................. . .. ....... . ... .... . .. .. ..........................................................", +"............................................................. . . .... .. ... .. . . .. .. .........................................................", +".............................................................. . . . ..... .. ... . .. . .. .........................................................", +"............................................................... ... ... .. .. .. . . ........................................................", +"............................................................... ..... . .. .. .. . . .. .......................................................", +"................................................................ .... .. .. . .. .. .. . . .. ......................................................", +"................................................................ .... .. .. . .. . . .. . ... .....................................................", +"................................................................ .... .. .. .. .. . . . . .. ..... .......................................................", +"................................................................ ...... . .. ... .. ... .. .. .................................................................", +"................................................................ ...... .. . . ... . . . ... .. ..................................................................", +"................................................................. ....... .. .. .. ... ... . .. . . .... ... ..................................................................", +"................................................................. ........ .... .. ... ....... ..... .. . ... ...... ....................................................................", +"................................................................. .............. ..... .......... .. .. . .. .. ....................................................................", +"................................................................. ............... ... .. . . .. . ......................................................................", +"................................................................................ . . . . . .......................................................................", +"................................................................................ . . . .. .. . .. . ........................................................................", +"................................................................................ . . . . . . . . ... ... . . .........................................................................", +"................................................................................. . . .. . .. . . .. .. .. ...........................................................................", +".................................................................................. . . . . .. .. .. .... . ..........................................................................", +".................................................................................. .. . .. .. .. .. .. ..........................................................................", +"................................................................................ .. . . . . . . .. .............................................................................", +"................................................................................ .. . . .. .. . . .............................................................................", +"................................................................................ .. .. .. ... . . . .............................................................................", +"............................................................................... ..... . .. .. . . . . . . ..............................................................................", +"............................................................................... ......... .. . . .. .. . . . . ...............................................................................", +"......................................................................................... ... . .. . . .. . .. .. .. .............................................................................", +"......................................................................................... .. . . . .. . .... . .. ............................................................................", +"........................................................................................ ... . . . . . ... . .. .... ............................................................................", +"........................................................................................ .... .. . . . .. . .. .. . ...... ...........................................................................", +"....................................................................................... ....... .. . ... . .. . . .. .. .....................................................................................", +"................................................................................................ .. . .. . . . . . . .. ....................................................................................", +"................................................................................................. .. . . . .. ... .. .. .. ... ....................................................................................", +".................................................................................................... ... .. .. .. .. .. .. . .... ....................................................................................", +"......................................................................................................... . . .. .. . .. ..... ...................................................................................", +"................................................................................................ ....... . . . .. .. .. ...........................................................................................", +"................................................................................................ ....... .. .. .. .. . . .............................................................................................", +"................................................................................................ ........ .... .. .. .. . ...............................................................................................", +"................................................................................................ ................ .. .. .. . ..................................................................................................", +".................................................................................................................... ... .. .. ...... .............................................................................................", +".......................................................................................................................... .. ..... ...... .............................................................................................", +".......................................................................................................................... ............... ....... ............................................................................................", +"................................................................................................................. ....... ............... ........ ............................................................................................", +"................................................................................................................. ....... ...... ............................................................................................................", +"................................................................................................................. ............... ............................................................................................................", +"................................................................................................................. ................ ............................................................................................................", +".................................................................................................................................. .............................................................................................................", +".................................................................................................................................. .............................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................"}; diff --git a/config/OpenBSD_4bpp.xpm b/config/OpenBSD_4bpp.xpm new file mode 100644 index 0000000..0497dc0 --- /dev/null +++ b/config/OpenBSD_4bpp.xpm @@ -0,0 +1,192 @@ +/* XPM */ +/* $OpenBSD: OpenBSD_4bpp.xpm,v 1.21 2015/06/28 09:09:07 matthieu Exp $ */ +static char *OpenBSD_4bpp[] = { +"240 175 13 1", +" c None", +". c #None", +"+ c #FEF886", +"@ c #EAEAEB", +"# c #5272B6", +"$ c #425887", +"% c #2D3852", +"& c #F9E90A", +"* c #EDDA5E", +"= c #AA9738", +"- c #675224", +"; c #211D1C", +"> c #F34825", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +".............................$$$$...........................................................................................................$$$$$$$....$$$$.....................................$$$$$$$$$$$$$$$$........$$%%%%%%%$$.............", +"........................$$%%%;;;;%%%$.................................................................$%%%%%%%%%%%%%%%%%%%%$$$...........$%%;;;;;;;%%%%;;;;%%%%%%%%%%%%%%%%%%%$$...............$;;;;;;;;;;;;;;;;$.....$%;;;;;;;;;;;%............", +"......................%%;;;;;;;;;;;;;%$...............................................................%;;;;;;;;;;;;;;;;;;;;;;;%$.......$%;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%%$............%;;;;;;;;;;;;;;;;%....$;;;;;;---;;;;;%...........", +"....................%;;;;;;-=====-;;;;;%$............................................................$;;;--;;;;;;;;;;--;;;;;;;;;;$....%;;;;->>>>>>--;;;->-;;-;;;;;;;;;;;--;;;;;;;;;;$..........%;;&&&&&&&&&&&&-;;...$;;;;=&&&&&&&=;;;%..........", +"..................$%;;;-=&&&&&&&&&&&=;;;;$...........................................................%;;>>>>>>>>>>>>>>>>>>>>>-;;;;%..%;;;>>>>>>>>>>>>>>>>-;>>>>>>>>>>>>>>>>>>>>--;;;;%$.......$;;-&&&&&&&&&&&&;;%..$;;;-&&&=--=&&&&;;;$.........", +".................%;;;-&&&&&&--;-=&&&&&-;;;$..........................................................$;;;-->>>>>>>>>>--->>>>>>>-;;;%%;;->>>>-;;;;;->>>>>>-;;-->>>>>>>>>---->>>>>>>-;;;;%......$;;=&&&&&&&&&&&=;;$..%;;=&&&=;;;;-&&&&;;%.........", +"...............$%;;;=&&&&&-;;;;;;-&&&&&-;;;..........................................................$;;;;;;>>>>>>>>;;;;;>>>>>>>>;;;;;->>>>;;;;;;;;;>>>>>-;;;;->>>>>>>-;;;;;->>>>>>>-;;;%.....%;;&&&&&&&&&&&&-;%..$;;-&&&&-;;;;;&&&&-;;$........", +"..............$;;;-&&&&&&;;;;;;;;;=&&&&&-;;%..........................................................$%;;;;>>>>>>>>;;;;;;>>>>>>>-;;;;>>>>>;;;%%%;;;;->>>-;;;;;>>>>>>>-;;;;;;;>>>>>>>>;;;%....;;;&&&&&&&&&&&&;;%..%;;=&&&&-;;;;;&&&&&;;$........", +".............$%;;-&&&&&&;;;;%$.$;;-&&&&&&;;;......$$...$$$$..............$$$$..............$$....$$$$....%;;>>>>>>>>;;;;;;>>>>>>>>;;;->>>>>;;;$..$%;;;>>>-;;;;;>>>>>>>-;;%%;;;;>>>>>>>>;;;$..$;;=&-;--------;;;$..%;;&&&&&=;;;;;&&&&&;;$........", +".............%;;-&&&&&&-;;;$....;;-&&&&&&-;;%$%%%%;;%%%;;;;%$.........$%%;;;;%%$..$$$$$%%%%;;%$%%;;;;%%..$;;>>>>>>>>;;%%;;>>>>>>>>;;;>>>>>>;;;;%$..%;;;>>-;;;;;>>>>>>>-;;$.$%;;->>>>>>>-;;%..%;;&&;;;;;;;;;;;;%...%;;&&&&&&;;;;;&&&&=;;$........", +"............%;;-&&&&&&=;;;$.....;;-&&&&&&-;;;;;;;;;;;;;;;;;;;%$.....%%;;;;;;;;;;%%;;;;;;;;;;;;;;;;;;;;;%.$;;>>>>>>>>;;%%;;>>>>>>>>;;;>>>>>>>-;;;;;%$%;;->-;;;;;>>>>>>>-;;$...;;;>>>>>>>>;;;$.%;;&&;;;;;;;;;;%%....%;;&&&&&&&;;;;&&&&;;;.........", +"...........$;;;&&&&&&&;;;%.....$;;=&&&&&&=;;;;;;--=-;;-===-;;;;$..$;;;;;-==&=-;;;;;;;;;;---=;;;;-====;;;%$;;>>>>>>>>;;;%;;>>>>>>>>;;;>>>>>>>>>-;;;;;;;;;-;;;;;;>>>>>>>-;;$...$;;->>>>>>>>;;%$;;-&&&&&&=-;;;;%.....%;;=&&&&&&&-;=&&&-;;%.........", +"...........%;;&&&&&&&=;;;$.....$;;&&&&&&&=-&&&&&&&&;-&&&&&&&-;;%.%;;;-=&&&&&&&&-;;-=&&&&&&&&;;-&&&&&&&;;;%;;>>>>>>>>;;;;;->>>>>>>;;;;->>>>>>>>>>-;;;;;;;;;;;;;;>>>>>>>-;;$....;;;>>>>>>>>;;%%;;=&&&&&&&&&-;;;%....$;;;&&&&&&&&&&&=;;;%..........", +"..........$;;-&&&&&&&;;;%......%;;&&&&&&&==&&&&&&&&=&&&&&&&&&;;;%;;;=&&&&-;=&&&&;;-&&&&&&&&-;=&&&&&&&&-;;;;;>>>>>>>>;;;;->>>>>>>;;;;;;>>>>>>>>>>>>>-;;;;;;;%;;;>>>>>>>-;;$....%;;>>>>>>>>;;;;;;&&&&&&&&&&&&;;;$....%;;-&&&&&&&&&=;;;;$..........", +"..........%;;&&&&&&&=;;;$......;;-&&&&&&&-;;-&&&&&&&&--&&&&&&-;;;;;&&&&&-;;-&&&&-;;;;&&&&&&;=&&-&&&&&&=;;;;;>>>>>>>>->>>>>>>>>;;;;;%;;;>>>>>>>>>>>>>>>;;;;%$;;;>>>>>>>-;;$....%;;>>>>>>>>-;;;;-&&&&&&&&&&&&&;;;$...$;;;-&&&&&&&&&=;;;$..........", +".........$;;-&&&&&&&-;;%......$;;=&&&&&&&-;;=&&&&&&=;;;=&&&&&=;;;-&&&&&-;;;=&&&&-;;;;&&&&&==&=;;=&&&&&-;;;;;>>>>>>>>>>>>>>>>>>-;;;;%;;;->>>>>>>>>>>>>>>-;;;%;;;>>>>>>>-;;$....%;;>>>>>>>>-;;;;-&&&&&&&&&&&&&=;;$....$;;;;&&&&&&&&&&;;;$.........", +".........$;;=&&&&&&&;;;$......%;;&&&&&&&&;;;&&&&&&=;;;;-&&&&&=;;;&&&&&&;;;;&&&&=;;;;-&&&&&=&=;;;&&&&&&;;;%;;>>>>>>>>;;-->>>>>>>>-;;;;;;;;>>>>>>>>>>>>>>>-;;;;;;>>>>>>>-;;$....%;;>>>>>>>>-;;;;;---==&&&&&&&&&;;%....%;;;-=&&&&&&&&&=;;%.........", +".........%;;&&&&&&&=;;%......$;;-&&&&&&&-;;;&&&&&&;;;;;=&&&&&=;;&&&&&&-;;;&&&&&;;;;;&&&&&&&=;;;-&&&&&&;;;%;;>>>>>>>>;;;;;->>>>>>>>;;;;;;;;;>>>>>>>>>>>>>>-;;;;;>>>>>>>-;;$....%;;>>>>>>>>;;;;;;;;;;;;-=&&&&&&=;;...%;;;&&&&-&&&&&&&&-;;$........", +".........%;;&&&&&&&-;;%......%;;=&&&&&&&;;;-&&&&&-;;;;;&&&&&&-;-&&&&&&;;-&&&&&;;;;;;&&&&&&&;;;;&&&&&&-;;%$;;>>>>>>>>;;;;;;->>>>>>>>;;;;;;;;;;->>>>>>>>>>>>;;;;;>>>>>>>-;;$....%;;>>>>>>>>;;;$$%;;;;;;;;;&&&&&=;;..$;;;&&&&;;;=&&&&&&&;;%........", +".........;;-&&&&&&&;;;$.....$;;-&&&&&&&-;;;=&&&&&;;;;;-&&&&&&;;&&&&&&=-=&&&&=;;;;;;=&&&&&&-;;;-&&&&&&;;;$$;;>>>>>>>>;;;%;;;>>>>>>>>;;;;;;;;;;;;;>>>>>>>>>>-;;;;>>>>>>>-;;$....%;;>>>>>>>>;;;.....$$$%;;;;&&&&&;;$$%;;&&&&=;;;;=&&&&&&-;%........", +".........;;-&&&&&&&;;%......%;;=&&&&&&=;;;;&&&&&=;;;;;=&&&&&=;-&&&&&&&&&&&=;;;;%;;;&&&&&&&;;;;=&&&&&=;;;.$;;>>>>>>>>;;%.$;;>>>>>>>>-;>>;;;%%;;;;;;>>>>>>>>>;;;;>>>>>>>-;;$....;;->>>>>>>-;;%.$%%%%$..$%;;;&&&=;;;;;;-&&&&-;;;;;&&&&&&-;%........", +".........;;-&&&&&&=;;%.....$;;-&&&&&&&;;;;-&&&&&-;;;;;&&&&&&;;=&&&&&&&=--;;;;;;%;;-&&&&&&;;;;;&&&&&&;;;;%%;;>>>>>>>>;;;.$;;>>>>>>>>>;>>-;;$.$%;;;;;;>>>>>>>;;;;>>>>>>>-;;$...$;;>>>>>>>>;;;%%;;;;;;%$..%;;=&&=;;;;;;-&&&&;;;%;;-&&&&&-;;........", +".........;;;&&&&&&=;;%....$;;;&&&&&&&;;;;;=&&&&&;;;;;=&&&&&=;;&&&&&&=;;;;;;;;;;;;;=&&&&&=;;;;-&&&&&=;;;;;;;;>>>>>>>>;;;.$;;>>>>>>>>-;>>>;;;$...$%;;;->>>>>-;;;;>>>>>>>-;;$..$;;;>>>>>>>-;;%%;;;;;;;;;%.%;;=&&;;-==;;=&&&&;;;$;;;&&&&&-;%........", +".........%;;&&&&&&=;;%...$;;;=&&&&&&;;;;;;&&&&&=;;;;;&&&&&&;;;&&&&&&=;;;;;;-&=;;;;&&&&&&-;;;;&&&&&&-;==;;;;;>>>>>>>>;;%$%;;>>>>>>>>;;>>>-;;;$....$;;->>>>>-;;;;>>>>>>>-;;$.$;;;->>>>>>-;;;%;;;&&&&-;;;;;;;&&&;=&&&&;-&&&&;;;$;;;&&&&&;;%........", +".........$;;-&&&&&&;;%$$$;;;=&&&&&&;;;;;;-&&&&&-;;;;&&&&&&;;;;=&&&&&&;;;;;-&&-;;;;&&&&&&;;;;;&&&&&&;-&&;;;;;>>>>>>>>;;;%;;;>>>>>>>-;;>>>>;;;;%$$$$;;->>>>>;;;;;>>>>>>>-;;%;;;;->>>>>>-;;;%$;;-&&&&&=;;;;;-&&;-&&&&&=;&&&&-;;%;;-&&&&=;;$........", +"..........%;;=&&&&&;;;;;;;;=&&&&&=;;;;%;;=&&&&&;;;;=&&&&&;;;;;-&&&&&&=;;;=&&=;;;;=&&&&&=;;;;;&&&&&&=&&;;;;;;>>>>>>>>;;;;;;>>>>>>>-;;;>>>>>;;;;;;;;;;>>>>>;;;;;->>>>>>>-;;;;;;>>>>>>>-;;;%.$;;=&&&&&&&=;;=&&-;-&&&&&&;=&&&&;;;;;=&&&&;;;.........", +"..........$;;;=&&&&&;;;;;-&&&&&&-;;;;$%;;&&&&&&;;;=&&&&=;;;;;;;=&&&&&&&&&&&=;;;;;&&&&&&;;;;;;&&&&&&&&-;;;;->>>>>>>>>>-;->>>>>>>>-;;;;>>>>>>>;;;;;;;>>>>>;;;;;->>>>>>>>>---->>>>>>>-;;;;%$.$;;;&&&&&&&&&&&&-;;-&&&&&=;;=&&&=;;;-&&&&;;;$.........", +"...........$;;;-&&&&&&==&&&&&&-;;;;%$.;;-&&&&&&&&&&&&&-;;;;$$;;;=&&&&&&&&&-;;;;;;&&&&&&;;;;;;&&&&&&&;;;;>>>>>>>>>>>>>>>>>>>>>-;;;;;;;>>>>>>>>>>>>>>>>>>;;;;>>>>>>>>>>>>>>>>>>>>-;;;;;;%....%;;-&&&&&&&&&=;;;;;=&&&&;;;;-&&&&&&&&&=;;;%..........", +"........$%%%;;;;;-=&&&&&&&=-;;;;;;;$.$;;=&&&&&-=&&&=-;;;;;%$%;;;;;==&&&=-;;;;;;;;=====-;;;%;;;====-;;;;;------------------;;;;;;;;;;;>>;;;->>>>>>>>>-;;;;;;-----------------;;;;;;;;;;%%%%%%;;;;-=====-;;;;;;;;-==;;;;;;;-=====-;;;;;%%$........", +"......$%;;;;;;;;;;;;;;;;;;;;;;;;;;;;%%;;&&&&&&;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%$......", +"......%;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-&&&&&=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%......", +"......;;;>>>>>>>>>>>>>>>>>>>>>>>>>;;;;;=&&&&&-;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;;;;......", +"......;;->>>>>>>>>>>>>>>>>>>>>>>>>;;;;;&&&&&&;;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;;;;......", +"......%;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-&&&&&&;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;......", +"......$%;;;;;;;;;;;;;;;;;;;;;;;;;;;;=&&&&&&&&&&=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%......", +"........%;;;;;;;;;;;;;;;;;;;;;;;;;;;=&&&&&&&&&&=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%$......", +".........$$$$$$$$$$$$$$$$$$$$$$$$%;;;;;;;;;;;;;;;;%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$........", +".................................$;;;;;;;;;;;;;;;;..............................................................................................................................................................................................", +"..................................$%%%%%%%%%%%%%%$..............................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"..............................................................................................................................$%................................................................................................................", +"..............................................................................................................................%;$...............................................................................................................", +"..............................................................................................................................;;$...............................................................................................................", +"..............................................................................................................................;;%...............................................................................................................", +"...................................................................................................#$.......................#$;;%...............................................................................................................", +"...................................................................................................#%%............$;$.........;;%...............................................................................................................", +"....................................................................................................%;$...........%;%#.......$;;%...............................................................................................................", +"....................................................................................................$;;$#.........%;;#..%$#..$;-;...$$$#.%%.....................................................................................................", +".....................................................................................................;;%..........%;;$.#;%...%;-;$..$;$#$;;$............#$......................................................................................", +".....................................................................................................%;;$...#$%$..$;;%..%;.#$;-=;.#.;;##%;;%............;%#.....................................................................................", +"..............................................................................................$%$#...$;;%#...#;%#.$;;;$#$;$.$;==;$.$;%#.;;;%...........$;%......................................................................................", +".............................................................................................$;;;#....;-;$...#%;$.$;-;$.$;;$;;=&;;$%;;.$;;;%...%$......;;$......................................................................................", +"............................................................................................##%;;$....%--;$...$;$#$;=-%.$;;;;-&&=;;;;;$$;-;%...;%.....$;;.......................................................................................", +"..............................................................................................$;-;....%;=-;%$.%;;$$;=-;;;;;;-&&*&-;;;;%;;-;;.#$;$.....;;%.......................................................................................", +"...............................................................................................;-;$...$;=&-;;;;;;;;;==;;--=&+&*&&&&==-;;;-;;$#$;$....%;;$.......................................................................................", +"...............................................................................................%--;...$;-++=-;;;;--;=+;-+++++&&&*&&+++=;-=;;%$;;%...%;-;$.......................................................................................", +"...............................................................................................$;=;%..$;-+++++==++=;=+-;+++++++++&*&&+=;==;;;;;;%..%;-=;#.......................................................................................", +"...........................................................................................$$..$;-=;$$;;=+++++++++=;=+=;=++++&++++++&+-;&=;-=-;;;$%;;&-%....$$..................................................................................", +"..................................................................................%$.......;;#..;;=-;;;-++++++++++=;=++;-++++-=+++++++--+=;-+&=-;;;-&&-%#..%;$..................................................................................", +"..................................................................................;;%......$;%..$;==;;=+++++++++++=;+++-;+++=;=++++++=;=+=;-+&&&====&*-%..%;%...................................................................................", +".................................................................................#$;;%......%;%.$;-+-;+++++==+++++--+++=;=++=;=++++++--++=;-+&*&&&&&=-;;$;;%.%%.................................................................................", +".................................................................................##$;;%.....$;;%%;;+=;-++++--++++=;=++++=-++=;=+++++=-+++=;-+&&&&*&*&-;;;;;.$;;.................................................................................", +"..................................................................................##$;;%$#..$;;;;=;=+-;=+++=;=+++=-++++++=++=;-++++==++++&;-++&+==&&&&=-;;%$;;$.................................................................................", +".....................................................................................%;;;$$#$;;;=+;-++-;+++=;;++++++++++++++-;-+++++++++++;;++++--&&*&&&=-;;;;$#................................................................................", +"...........................................................................#$$$.......;;-;;%;;-=++--+++--+++;;-+++++++++++++-=-=++++++++++;;+++=;=+&&&*&&&;;;%#.................................................................................", +"............................................................................%;;$.....#$;==-;;-++++=-++++-=++-;-=+++++++++++=;=-=++++++++++==++=;;+&&*&&&*-;-;$.#$%%$......$;$...................................................................", +"............................................................................;;-;%.....#%-++=++++++=;+++++=++=---+++++++++++=;+--++++++++++++++;;-++&&&*&-;=-;;$%;;%##...$%;;$...................................................................", +"............................................................................$;-=-;$#...%;=++++++++=;++++++++=-=;=++++++++++-;+=;+++++++++++++-;;=++&*+=-;=&;;;;;;$....$%;;;$....................................................................", +".............................................................................$;-&-;$..#%;=++++++++=-++++++++=-=-;++++++++++--++;=+++++++++++=;-;=+++&=;-=+=;==;;%...$%;;;;%.....................................................................", +"..............................................................................%;-+=;;$$;;=+++++++++++++++++++-=+;-++++++++=-+++--++++++++++=;-=;=++&--=&&&=;=&-;%$%;;;;-;%......................................................................", +"...............................................................................%;-+=-;;;=++++=-=+++++++++++++-=+=;=+++++++==++++=+++==+++++;;+=;+++==++&*&--&&&-;;;;;==;%#......................................................................", +".............................................................................$$#%;-++=;;=+++++;;=++++++++++++-=++=-++++=++=+++++++++;=++++--=+=;+++++++&+=;-&*&&=---&=;;$#......................................................................", +".............................................................................;;$#%;-++=-;;==++=;;=+++++++++++-=+++++++=;+++++++++++=;=+++=-+++--+++++++++=;=&&&*&&&&&-;.#.......................................................................", +"....................................................................$$......#$;;;%;;-+++=-;;-=+-;;=++++++++++=++++++++=;=++++++++++-;=++++++++--+++++++++=;=&*&&&*&*=;%.........................................................................", +"...................................................................$;;;$.....##%;;;;;-+++++===++;;;-++++++++++++++++++-;-+++++++++=;-=++++++++--+++++++++=;=&&&&&&=--;$#........................................................................", +"..................................................................##$;;;%$......;;;;;;=+++++++++=;-;;=+++++=+++++++++=;--++++++++=;==-++++++++=-+++++++++=-&*&*&*&=;;;#...$$#...................................................................", +".....................................................................$;;;;;$$$$$;;;;;;;=+++++++++-=+-;;-++=;=++++++++-;+-=+++++++-=++;=+++++++=-+++++++++++&&&&&&&&-;;$%%;;%....................................................................", +".....................................................................#$;;-=;;;;;;;---;;-++++++++++-=++==++=;;++++++++--+=;+++++++++++-=+++++++++++-=+++++++++&-=&*&=;;;;;;$#....................................................................", +".....................................................................##.;;=+=---=++++=-;=+++++++++--+++++++;;-+++++++=+++==++++++++++++++++++++++=;=++++++++=-=&*&&&-;;;$.......................................................................", +"........................................................................$;;=+++++++++++--++++++++++-+++++++-+=-=+++++++++++++++++++++++++++++++=-;-++++++++-;;&&&&*&=;;$........................................................................", +"..........................................................................;;=+++++++++++=++++++++++==++++++-=+=-=++++++++++++++++++++++++++++=-;;;=+++++++-;;;-*&&&&=;;$........................................................................", +"...........................................................................;-++++++++++++++++++++++==++++++-=++++++++++++++++++++++++++++++++=-==-++++++=;-=+-;=+*&*&-;%........................................................................", +"......................................................................$%%%$%;=+++++++++++++++++--++++++++++-=+++++++++++++++++++++++++++++++++++--+++++=;-++++-;=&&&&=;;$.......................................................................", +".....................................................................##$%;;;;-+++++++++++++++++=;-+++++++++==+++++++++++++++++++++++++++++++++++-=+++++;-++++++;-&&*&=;;;$......................................................................", +"........................................................................#$%;;-++++=;=+++++++++++-;;=++++++++++++++++++++++++++++++++++++++++++++-+++++--+++++++=;-&&&&;;;;%.....................................................................", +".........................................................................##%;=+++++-;;-=+++++++++;;--=+++++++++++++++++++++++++++++++++++++++++++++++-;=++++++++=;=&*&--=-;$....................................................................", +"..................................................................$$$$#....;;+++++++=;;;;-=====++=;=-;-+++++++++++++++++++++++++++++++++++++++++++++=;-+++++++++&-;&&&-;++;;$#..................................................................", +".................................................................#%;;;$$#.$;-++++++++=;;;-;;;;;=++--++++++++++++++++++++++++++++++++++++++++++++++++-;&&+++=======;-&*-;++=;;#..................................................................", +"..................................................................%;;-;;%$%;=++++++++++-;=+====+++=;++++++++++++++++++++++++++++++++++++++++++++++++;---;;;;;;;;;;;;=&-;=++=;$..................................................................", +".................................................................#$%;--=-;;;-===++++++++;;+++++++++;=++++++++++++++++++++++++++++++++++++++++++++++=;;;%.$####@@@%;;-&-;;;--;;$.................................................................", +"..................................................................##$;;=+=--;;;;;-=++++++;-++++++++-=++++++++++++++++++++++++++++++++++++++++++++++=-;;@@@@@@@@@@@;-=&-%##%;;;$.................................................................", +".....................................................................$%;;=++++===++++++++=;=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-;@@@@@@$;%@@;-+&-%@@@;;;$.................................................................", +"....................................................................##.$;;-+++++++++++++++--++++++++++=++++++++++++++++++++++++++++++++++++++++++++++=;@@@@@@;;;$@;-&&-;;%.$;$..................................................................", +".......................................................................#$;;-+++++++++++++++-+++++++=;-=++++++++++++++++++++++++++++++++++++++++++++++=;#@@@@@;;;.@;-&*-;;;#$;$..................................................................", +"..................................................$$$$%$$$#.......$$$$#.$;;;-++++++++++++++=++++++++--++++++++++++++++++++++++++++++++++++++++++++++=-;$@@@@@$;%@@;-&&-;%$@#;$#.................................................................", +"................................................$%;;;;;;;;$.......%;;;%%;;;;;-+++++++=;=+++++++==++++-=++++++++++++++++++++++++++++++++++++++++++++=--;;%#@@@@@@@@;-&&-;@@@$;%#.................................................................", +".............................................#$%;;;-=====-;;$......$%;;;;;;--;-++++=;;-++++=----=+++++=+++++++++++++++++++++++++++++++++++++++++++++++==-;;$@@@@@@;-*&-;$@@$;;$.................................................................", +".............................................$;;;;=&&&&&&&=-;$......#$$;;;-++-;=++=;;=+++-;;;--=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++=-;;#@@@$;=+&-;%@@;;;;$................................................................", +"............................................%;;;;;-&*&&==&&&=;%$#....#.$;;=+++=-+=;;=++++=-;;=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=;;#@@;;=&&=;%@$;&=;;$#..............................................................", +"............................................%$$.$%;-----=*&&&=;;$#....##;;++++++++==-;=+++++=--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-;#%;=+&*&;;%;=&&-;%#..............................................................", +"................................................##%;;==&&&&*&&=;;$.....$;-+++++++++++==+++++++;=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=;;;;&+&&&-;;;=*&=;;$..............................................................", +"..................................................#;;=&*&*&&&*&=;;%....%;-+++++++++++++++++++++=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=;;=+&*&-;;;;;-&&-;%#.............................................................", +"...................................................$;;------=&&&&-;%$#$;;-++++++==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;-+&&&--=&&=-;-&=;;$#............................................................", +"..................................................##.;;-=====&*&+&-;;;;;;-+++++-;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;-+&+=;&+++++=;-&-;$.............................................................", +".....................................................$;-&&&&&&&&&++=---+--+++=;;=+++++++++++++++++++=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-;&+=;=+&&&&&+-;&=;;.............................................................", +"......................................................%;-*&*&*&&*&++++++=-+=;;-+++++++++=-++++++++=-=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-;++--+&&*&*&+=;=&;;$............................................................", +".......................................................%;-&&&&&*&&+++++++=-;;;-;;-++++++-;++++++++=;-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;-+--&+&+&==&+=;=&-;$............................................................", +".......................................................$;;=&==&&&&++++++++=++++=-;-++++=;=++++++++++==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++;-=;=+&+&=-&&+-;&*-;%............................................................", +"......................................................##$;;--==&*&+++++++++++++++==++++;-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=;;;=+++&=-&++&;-&&=;;............................................................", +".........................................................;;====&&&++++++++++++++++++++;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-;;=&&&=;-&+&+-;=*&=;;$...........................................................", +".........................................................$;;===&*&+++++++++++++++++++-;=++++++++==+++++++++++++++++++++=++++++++++++++++++++++++++++++++++++++;;;---;;;=+++=;-&&&=;;;%$#........................................................", +"........................................................##%;-&*&&&+++++++==++=-+++++-;+++===+++=;=++++++++=-;--;;-------+++++++++++++++++++++++++++++++++++++=;;;-----;;---;;=&&*=;;;;%#........................................................", +"...........................................................;;=&&*&&++++++==++-;++++-;++-;;;;-++-=++++++++-;;=====-;;;;-&+++++++++++++++++++++++++++++++++++++-;;-++++++;;--;;=*&&=;;;;;$........................................................", +"...........................................................$;-&&&&&++++++==++;=+++-;;-;;;-===+=-++++++++-;;+++++++++=&&&++++++++++++++++++++++++++++++++++++=;;;-++++++=-++=;=&&&=;-&-;%#.......................................................", +"...........................................................$;;=+&*&++++++-;+--+++-;;-==++++++=;--=+++++=;;=+++++++++++&=-=++++++++++++++++++++++=+++++++++++-;=;;++++++=-+++;-&&*-;-++-;$#......................................................", +"...........................................................#$;-===+++++++-;=-=+++==++++++++++;;----++++;;=++++++++++++=;-=++++++++++++++++++++++-++++++++++-;=+=;=++++++-+++--&&&-;=+++;%#......................................................", +"............................................................$;;-&&&&+++++=;;-+++++++++++++++++++++++++=;;++++++++++++-;=++++++++++++++++++++++-=-=++++++++=;=++&;-++++++=+++=;=*&;;++++-;%.#$...................................................", +"............................................................#%;=&==&+++++=;;;;=++++==+++++++++==++++++-;=+++++++++++-;=+++++++++++++++++++++++=-;=++++++++;-++++-;++++++++++=;=&=;-+++++;;;%;%..................................................", +".............................................................$;;-=&*&+++-;;==-;-+++;-+++++++++--++++++;-+++++++++++;;+++++++++++++++++++++++++++-=+++++++-;+++++=;=+++++++++-;=&-;-+++=+=;;;;%#.................................................", +"............................................................##;;-+&&&++=;;;-++==++-;=+++++++++;=+++++-;&++++++++++-;+++==+++++++++++++++==++++++++++++++-;=+++++=;=+++++++++-;&=;;==++-=+=;;;$#.................................................", +".............................................................#%;-&&*&++=;.%;=++++=;-+++++++++-;+++++;;=&+++++++++=;=+=--+++++++++++++-=+-++++++++++++++=-=++++++&-;++++++++=;-&-;;;;=&==--;;$#..................................................", +"..............................................................$;;*&=&+&;%.$;-++++-;+++++++++=;=+++=;;===+==++++==;-++=;=+++++++++++++=-;-++++++++++++++=++++++&&+=;=+++++++-;==;;;;;;-;;;;;$....................................................", +"..............................................................$;;===&+=;$.#%;=++=;=+=--+++++;-+++=;;=&=&===++++=;-++++=+++=+=-++++++++=;=+++++++++++++++++++++&*&-;;=+++++-;==;;..$;;;;;;%$.....................................................", +"..............................................................#;;-=&+&-;$#.$;-++;-=-;=+++++--++==-;;=-====++==-;;+++++++++--=-+++++++++-=+++++++==+++++++++++&&+=;;;;===-;;==;;$....#######.....................................................", +"..............................................................#%;=&&+-;%#.##;;=-;;;-++++++=;==-;-=+=;;;;--=-;;;;+++++++++++-;=++++++++++++++=+++=-++++++++=&+*&&-;=-;;;;;-==;;$.................................................................", +"...............................................................$;=&*-;;$...#%;;;;;-++++++=;;--=++++++=--;;;;;;-++++++++++++-;+++++++++++++++--=++-=++++++=;=+&&=;=&&==--=&=;;$..................................................................", +"...............................................................$;-=-;;$##..$;;;;;-++++++=;;-=+++++++++++==-;-=+++++++++++++==++++++++++++++++--=+-=++++++=;-+&&-;&*&=&&&&=;;$...................................................................", +"...............................................................%;;;;;$....#%;;;;-+++++++--++++++++++=++++++-++==++++==++++++++++++++=+++++++++=;+=-+++++++=;=+*--&&=-=*&=;;$....................................................................", +"..............................................................$;;;;%$....#$;;;;;=+++++++=+==++++++++-=+++++-==-=++++-;+++++++++=+++=-++++++++++-;--++=;-=++;-+&==*&&-=&=;;$.....................................................................", +".............................................................;;;;%$##...#$;;%$.%;=++++++++=-++++++++-=+++++---=++++++-=+-++++++=-=+=-+++++++++++-;;+++=-;-&=-&&&&&&&--=;;;$.....................................................................", +".............................................................$$$#........;;$.#..;-++++++++-=++++++++--+++=+=;=+++++++=--;+++++++=;===++++++++++++-;=++++=;;=-=&*==&*=;;;;;;$#...................................................................", +"........................................................................$;$.....;;=+++++++;=++++++++-=++--+==++++++++=;;=++++++++=;;=++++++++==+++--+++++&-;;-&&-;-&&-;$$%;;$#..................................................................", +"........................................................................$$.....#;;;=+++++=;+++++++++-=+--+++++++++++++;-++++++++++=;=++++++++--++++=+++&&+&-;;=&&=;;-=;%#.$;;$..................................................................", +"........................................................................##.....$;-;;=++++--++++++++=;=--++++++++++++++-=+++++++++++-=+++=++++--++++++++&=&*&-;-&*&-;;;;;...$;$#.................................................................", +"...............................................................................%-&=;;=++=;-+++++-=+=;;-++++++++=++++++++++++++++++++++++--+++--+++++++&&==&&&=;=&&=;;%;;%.......................................................................", +"..............................................................................$;-&=;;;=+=;=+++=;-++=;;=++++++++--+++++++++++++++++++++++=;-++=-++++++&*&--&*&&==&*-;$.$;;.......................................................................", +"..............................................................................$;==;;%%;-;;+++=;-+++-;=++++++++++;=+++;=++++=-+++++=++++++=;-+=-=++++&&&&=;&&&*&&&-;%...#$.......................................................................", +"..............................................................................;--;%.##%;;-++=;;++++;-++=++++++++--++-;=+++++--+++=-+++++++=;=+-=++++*&&*=;=*&&&*=;;;$...##......................................................................", +".............................................................................$;-;$....#%;=+=;;=++++=+++==+++++++=-++;-++++++=;=++--++++++++=;=-=+&=&&&*&&--&&&&=;;=;%#..........................................................................", +".............................................................................%;;$#.....$;+=;;-+++++++++-=+++++++=;+=;++++++++--++--+++++++++-;--+&-;=&&&&=;=&*=;;=&-;$..........................................................................", +"...........................................................................#$;;$#......%-+-;;=+++++++++--++++++++-=--++++++++=;=+;=+++++++++&;;;&+=-;-&*&=;=&=-;;--=-;$.........................................................................", +"...........................................................................#;;$##....#$;=-;;;;=++++++++=;++++=-=+-;;=+++++++++--+;=+++++++==+=;;=&&+=;-=&&--=-;;;;;;-;;$........................................................................", +"...........................................................................$;%........$--;$#$;;-+++++++=;=+++--++-;;+==+++++++=;=;===+++++-;++;;=&*&&=;;=*=;;;$.#$$%;;;;........................................................................", +"..........................................................................#.$........$;;;....$;;-=+++++-;=++=;+++-;=+=-=++++==+--;==;=++++-;&+=;=&&&*&-;;=&-;$..##..$$;;;$#.....................................................................", +"......................................................................................;;$...#..;;;=++++;;=+=;=+++=;=++;=++++=;+=;;++-;=+++--&&&--&*&&&=;;;==;$.....##.#%;%......................................................................", +".....................................................................................$;;.......%;;;;=+-;;=+=;=++++=+++-;++++-;+=;;++&;-+++-;&*&=-&&&*&=;;;;=-;..........$$......................................................................", +".....................................................................................$%$.......%-=;;;;;;;=+;=+++++++++=;=++&;-+=;;&++=;=++-;&&&*&&*&&=-;;%;;-;$..........##.....................................................................", +"...............................................................................................%-&-;;;;;;==;++++++++++=;-++=;=++-;&+&+-;&&-;&*&&&&&=-;;%..$;;-;$#...............................................................................", +"...............................................................................................;-&-;$.$;;=-;==++++++++&;;++=;=++==+&&+=;=&-;=&&&*=-;;;$..##.;-;%................................................................................", +"..............................................................................................#;--;$...$;=;;;;-==+++++&;;=+-;=+&&&&&*&=;-&-;&&&=-;;;%.......$;-;$...............................................................................", +"..............................................................................................$;-;%....%--;$$%;;;--=&+&;;-+-;&+&*&*&&&&;;==;--;;;;-;%#.......%;;;...............................................................................", +".............................................................................................#$;;;$#...%-;%...$;;;;;;--;;;&--++&&&&&*&=;;==;;;;;;==;;.........%;$...............................................................................", +"..............................................................................................$;;$#....;-;$....%;;;;;;;;;;=-;=====---;;;;-=;%$%;;==;;$..........................................................................................", +"..............................................................................................%;;....#$;;;.....$;-=;;;$$;;=;;;;;;;;;;;;$%;=;%...%;=-;$#.........................................................................................", +"..............................................................................................;;$.....$;;%.....$;-=;;$..$;-;%#$;;---;;#.$;--%#...%;-;%..........................................................................................", +".............................................................................................$;%.....##$%$#....$;-=;;...$;-;$#.$;=&=;$.##;--;$#..#%;;%..........................................................................................", +"............................................................................................##$$........##....##;-=;$...#;;;#..$;-&=;$..#%;-;$....#%;;$.........................................................................................", +"...............................................................................................##..............#;--;$...#;;%#..#%;=-;#..#$;-;$#....#%;%#........................................................................................", +"................................................................................................................%-;%#....%;%....$;=-%#...#%;;$.......%;$#.......................................................................................", +"................................................................................................................%;;$#....$;$.....;-;$.....$;;$........%$........................................................................................", +"................................................................................................................%;;#.....$%$.....%;;$......$$...................................................................................................", +"................................................................................................................%;%#.....###....#$;;$......##...................................................................................................", +"................................................................................................................%;$#.............#;;............................................................................................................", +"................................................................................................................$$#..............#%;$#..........................................................................................................", +"...............................................................................................................##.................$%#...........................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................"}; diff --git a/config/OpenBSD_8bpp.xpm b/config/OpenBSD_8bpp.xpm new file mode 100644 index 0000000..1f3f731 --- /dev/null +++ b/config/OpenBSD_8bpp.xpm @@ -0,0 +1,307 @@ +/* XPM */ +/* $OpenBSD: OpenBSD_8bpp.xpm,v 1.21 2015/06/28 09:09:08 matthieu Exp $ */ +static char *OpenBSD_8bpp[] = { +"240 175 128 2", +" c None", +". c None", +"+ c #FEF886", +"@ c #221E22", +"# c #262226", +"$ c #2A272C", +"% c #1E1A22", +"& c #1A1622", +"* c #0E0E22", +"= c #141422", +"- c #1A1A22", +"; c #2C2C36", +"> c #1E1E22", +", c #26262A", +"' c #828284", +") c #686869", +"! c #2F3343", +"~ c #47484C", +"{ c #202229", +"] c #A8A9AC", +"^ c #0E121C", +"/ c #313C57", +"( c #5272B6", +"_ c #3C517F", +": c #445A8B", +"< c #36476D", +"[ c #1F2C46", +"} c #4E6EAF", +"| c #253453", +"1 c #4B69A6", +"2 c #46629A", +"3 c #1A2439", +"4 c #5272B2", +"5 c #171F2F", +"6 c #0A0D13", +"7 c #0E1522", +"8 c #4E72B2", +"9 c #121A29", +"0 c #202837", +"a c #07090B", +"b c #1A1E22", +"c c #141E22", +"d c #D1D2D2", +"e c #FEFC73", +"f c #FEFC7D", +"g c #FEFE82", +"h c #FAFA81", +"i c #FEFE86", +"j c #F5F484", +"k c #FAFA88", +"l c #FEFE8C", +"m c #F8F78B", +"n c #EFEF87", +"o c #FEFE93", +"p c #FEFE9C", +"q c #FEFEFD", +"r c #FEFA06", +"s c #FEF606", +"t c #FDFA50", +"u c #F5F37B", +"v c #D5D16C", +"w c #FEFA82", +"x c #F0ED7E", +"y c #FEFA86", +"z c #DFDD76", +"A c #E7E57D", +"B c #FEF206", +"C c #EEE973", +"D c #C5C062", +"E c #FDEC0A", +"F c #FEF472", +"G c #8E8840", +"H c #A39C4B", +"I c #E8DF6B", +"J c #FAEF7A", +"K c #B3AD57", +"L c #FEF37D", +"M c #FEF582", +"N c #FEF686", +"O c #F8E30B", +"P c #7A7437", +"Q c #66612F", +"R c #232110", +"S c #FAEC74", +"T c #514D26", +"U c #EDD30E", +"V c #FEEC68", +"W c #F7E66C", +"X c #DAC550", +"Y c #F8E161", +"Z c #E7D45D", +"` c #2E2A13", +" . c #DDBD13", +".. c #C4AD3F", +"+. c #F5DA56", +"@. c #39341A", +"#. c #EDCE4A", +"$. c #453D1C", +"%. c #C5A118", +"&. c #F9D240", +"*. c #AF8E21", +"=. c #EBBE2E", +"-. c #382D0B", +";. c #261F08", +">. c #80671C", +",. c #110E05", +"'. c #1B170A", +"). c #191815", +"!. c #9A791C", +"~. c #68541A", +"{. c #564618", +"]. c #342C21", +"^. c #FE5226", +"/. c #FA4E26", +"(. c #FA4A22", +"_. c #FE4E26", +":. c #FA4A26", +"<. c #F64A26", +"[. c #F44625", +"}. c #E94224", +"|. c #C93822", +"1. c #942E22", +"2. c #5A2722", +"3. c #382222", +"4. c #2D2222", +"5. c #262222", +"6. c #222222", +"7. c #030303", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 2 2 2 1 } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 . . . . . . . . . . . . . . . . . . 1 2 : : : : : 2 1 . . 2 : : : 2 } . 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 . . . . . . . . . . . . . . . . . . . . 2 < < < < < < < < < < < < < < 2 . . . . . . . } : < ! ; ; ; ; ; / _ 2 . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . 8 : < / ! ; , , # $ ; / < : 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 < / / / / / / / / / / / / / / / / / / < < _ 2 . . . . . . . . . . 1 _ / ; $ 5.5.5.5.5., ! / < ; 5.5.5.# / / / / / / / / / / / / / / / / / / < _ : 1 . . . . . . . . . . . . . . 2 ; 5.5.5.5.5.5.5.5.5.5.5.5.5.5.$ : . . . . . : / 5.5.5.@ @ @ @ @ 5.5.$ < 1 . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . 1 < ! , @ % % % @ @ @ % % % @ # ! _ } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 ! 5.@ > > > > > > > > > > > > > > > > @ @ @ 5.; ! < } . . . . . } < ; @ @ > @ @ @ @ @ @ @ > @ @ @ @ @ 5.5.> > > > > > > > > > > > > > > > > @ @ @ , ; / _ } . . . . . . . . . . . / 5.@ @ @ @ @ @ @ @ @ @ @ @ @ 5.5.! . . . . < , 5.@ @ @ ].~.~.~.4.@ % @ 5.! 1 . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . 1 < , @ & & 4.@.{.!.*. .*.!.~.@.5.& @ 5.! 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ 5.@ 3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.3.4.> b @ 5.; _ 8 . . 1 ! 5.> @ 3.2.|.|.}.}.}.|.1.2.3.5.b 1.[.2.> 2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.3.4.5.b b @ 5.; _ 1 . . . . . . . . 1 ! @ ]. .U U U U U U U U U U .$.% $ . . . < 5.@ & @.%.O E O O E B U !.4.% 5.! } . . . . . . . . . ", +". . . . . . . . . . . . . . . . . 8 _ ; 5.& & {.*.U E r B O O E s s O .!.5.& 5., _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < 5.@ |.:._.^._._._._._._._.^.^.:./.^.^.[.[.}.|.2.4.c @ 5./ } 1 ! @ b 2.|.[.^._.[.}.}.}.[.^.^.[.|.|.[.^.1.5.}./.^.^._._._._._._._.^.^._._.^._.[.}.|.1.2.4.c @ 5.; : . . . . . . . 2 , % {.B s B B B B B B B B s U % @ / . . _ 5.@ % >.O s E %.{.{.*.E s s U ].% 5.< . . . . . . . . . ", +". . . . . . . . . . . . . . . . 1 / 5.@ & {. .O s s E .>.{.@.{.!.O s s B U {.% 5., : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ 5.5.3.2.1.|._._._._._._._.:.1.2.2.1.}._.^._.^._.}.1.@ @ 5./ / 5.> 2.[.^._.[.1.3.c c > 3.1.}.^.^.^._.^.1.b 2.2.1.:._._._._._._._.}.1.1.1.1.|.:.^.^.^.:.}.1.4.b 5.5.< } . . . . . _ 5.@ *.s B B B B B B B B B B %.& 5.: . 1 ; 5.= !.B s s %.* % % * !.B B s U 5.5.; 1 . . . . . . . . ", +". . . . . . . . . . . . . . . 2 ! 5.% 4.%.E s s s O ~.% = - % & = $.O B B s O ~.% 5.$ 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 $ 5.@ b c 5.[._._._._._._.}.b b b c @ |._._./._.^._.|.5.@ 5.5.@ 2.[.^._.:.2.c > 5.5.@ > c 4.|./._._.^.1.c > b c 1._._._._._._./.2.7 b c c @ 2.}._._._.^._.}.1.> @ 5./ 8 . . . } / @ @ U s B B B B B B B B s E $.@ ; 1 . _ 5.- $.O s s E {.& 5.# @ 4.O B B B >.% 5.2 . . . . . . . . ", +". . . . . . . . . . . . . . 2 ; @ & {.U B s B s U $.& @ 5.# $ # 5.& %.B B B s O {.& 5.< . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ ; $ # 5.> |._._._._._._.|.@ 5.5.5.b 3.[._._._._._.^.1.b 5.@ @ }.^._._.|.@ @ # ; ; ; # 5.> b 1./._.^.1.b 5.5.> 3._._._._._._./.2.@ 5.5.5.@ > @ |._._._._._._.|.4.@ 5.< . . . 1 $ @ ].E E E E E E E E E E E U @ 5.< . . / @ - *.s B s O {.& # ; @ 5. .s B B .& 5.: . . . . . . . . ", +". . . . . . . . . . . . . 2 ; @ % >.E s B B s O $.% 5.5./ : 1 _ # @ ~.B B B B s .% @ ; 1 . . . 8 1 2 : 2 . 1 2 : : 2 } . . . . . . . . . . . . 1 2 : : : 2 8 . . . . . . . . . . } 1 2 : } . . 1 2 : : 2 1 . . 1 / 5.@ |._._._._._._.|.@ 5.$ $ 5.c }.^._._._._.^.}.4.@ b 2.:._._._.|.@ @ , _ . . : ! 5.@ @ |._.^.1.b 5.5.> 2._._._._._._./.2.@ 5./ / ; 5.> 5.}.^._._._._._.|.> @ # : . . : 5.% !.E >.@.$.$.$.$.$.$.$.$.].@ 5.: . . / @ 4. .s B B B !.= 5.5.@ 5. .s B B .& 5._ . . . . . . . . ", +". . . . . . . . . . . . 1 ! @ % !.E s B B B B >.& 5.5.< . . . 1 $ @ ~.B B B B s E {.& 5./ _ < / ! ; $ # ; / ! , # # ; ! < } . . . . . . . 1 _ / ! ; # # # ; ! < } . 2 : : _ _ < / ! ! , , ! _ / ! $ # # $ ! < } . < 5.@ |._._._._._._.|.@ 5.; / 5.c }.^._._._._._.}.3.> c 1._._._._.<.3.> 5.# ! _ } . / 5.@ 3.[.^.1.b 5.5.> 2._._._._._._./.2.@ 5.: . 2 ! 5.c 2.(._._._._._._.1.b @ ! 1 . < 5.& .O - % % % % % % % % % @ 5.! } . . / @ ].U s B B s O @.% 5.@ 5. .s B B *.% 5.: . . . . . . . . ", +". . . . . . . . . . . . / 5.% ~.E s B B B s %.% @ 5.< . . . . 2 # @ ~.B B B B B s !.= @ @ @ % % - - @ 5.5.% - @ @ @ % % 5.; : . . . . 1 < ; @ % - % @ @ @ % @ 5.! / $ # , # @ @ % - % @ 5.5.5.@ - % @ @ % @ 5.! 1 < 5.@ |._._._._._._.|.@ 5.; / 5.c }.^._._._._.^.}.3.> c |.^._._._._.[.2.> > @ 5.; < : ! 5.b 1.^.1.b 5.5.> 2._._._._._._./.2.@ 5._ . . 1 ; 5.b }._._._._./.^.<.2.> 5._ . ; @ 5.O .@ 4.5.@ % - @ 5.5.# ! / 2 . . . / @ 5. .s B B B s .].- @ 4.O B s U ].@ $ 1 . . . . . . . . ", +". . . . . . . . . . . _ 5.% @.O s B B B s O @.% 5./ } . . . . 2 5.% *.B B B B B s %.= % @ ].].$.{.~.*.$.= ].~.*.%.*.>.].% 5.$ 2 . . : ; 5.& - @.{.*.%. .*.~.4.% 5.5.% = % @ 4.].$.{.>.!.4.@ & 5.{.*.%.%.!.].% 5./ < 5.@ |._._._._._._.|.@ 5.$ ; @ > }.^._._._._.^.|.b @ c |._._._._._._./.}.2.4.b b 5., $ 5.@ 3.1.3.@ 5.5.> 2._._._._._._./.2.@ 5._ . . . < 5.b 1./._._._._._.^.|.> @ / 2 , - ~.E B E O U .!.{.4.= @ 5./ } . . . . < 5.& !.s B B B B B U {.% %.s s O $.% 5.< . . . . . . . . . ", +". . . . . . . . . . } ; @ % .s B B B B s *.= 5., 2 . . . . . < 5.% .B B B B B s %.~. . .U U O B s E @.>.U B s s s s U {.% 5.! 1 < 5.@ = {.%.O s B O E s s U {.% % $.%. . . .U O E r U 5.= ~. .B s s s s .5.@ , ! 5.@ |._._._._._._.|.@ 5.5.5.c 2.(._._._._.^.}.3.> 5.b 1./._._._._._._._._.}.1.2.c b @ 5.5.@ @ @ 5.5.5.> 2._._._._._._./.2.@ 5._ . . . 1 # @ 3.:._._._._._._.[.4.@ ; / # * %.B B B B B s s B U >.@ % 5./ } . . . : # % ].U s B B B B s E .E O .@.% 5.! 1 . . . . . . . . . ", +". . . . . . . . . . < 5.= >.B B B B B s O @.% 5./ . . . . . . ! 5.% O s B B B B s !.!.O E s s s B B .%.B r s B B B B s O ].% # ! 5.% 4.%.O s s O >.4.*.B B s U ].= ~.U O s s s B B B >.* *.E r s B B B s B >.= 5.5.5.@ |._._._._._._.|.> > > b 2.}.^._._.^.(.|.3.b 5.5.@ 5.}._._._._._._._._.^.^.[.|.1.@ > @ 5.5.5., ! , > 2._._._._._._./.2.@ 5._ . . . } ! 5.> [._._._._._._./.3.@ 5., @ & .s B B B B B B B s B .].% 5.< . . . } ! 5.& ~.E s B B B B B s B *.* % 5.$ 2 . . . . . . . . . . ", +". . . . . . . . . } ! @ 4.U s B B B B B %.= 5., 2 . . . . . 1 # % {.E B B B B B B >.- 5.>.E B B B B U s U >.!.O s B B B s >.% 5.5.& $.U s s s O $.= * !.B B B E {.& 5.].].O B B B s U ].%.B U >. .B B B B B !.= 5.5.5.@ |._._._._._._.}.1.|.|.}.:._._./.}.|.3.> > 5.5.! 5.> 2.<._._._._._._._._._._.^./.}.|.4.> @ 5./ 2 $ > 2._._._._._._./.2.@ 5._ . . . . / 5.> }._._._._._._._.2.@ 5.5.- $.O s B B B B B B B B B s U 4.@ $ 2 . . . 2 $ 5.- ~.O s B B B B B B E *.- @ # < . . . . . . . . . . ", +". . . . . . . . . : # & ~.B B B B B B E ~.% 5./ . . . . . . _ 5.= %.B B B B B s O {.& * !.B B B B B B %.% % * !.B B B B s %.@ 5.- $.O s B B B >.= @ * %.s B s O $.% @ % 4.O B B B s %.!.B *.@ = *.B B B B E >.& 5.5.5.@ |._._._._._._.:.[.[.:._.^._._.:.}.|.2.5.c @ 5.! # 5.> 2.}.^._._._._._._._._._._._._.[.1.@ @ , / $ > 2._._._._._._./.2.@ 5._ . . . . / 5.> }._._._._._._._.1.@ 5.5.& ~.O E E B s s s B B B B B s %.- 5.< . . . . < 5.5.& ].U B B B B B B B s .5.@ # : . . . . . . . . . ", +". . . . . . . . . < @ @ %.s B B B B B O @ 5.5.: . . . . . . ! @ 5.U s B B B B s .% @ & .s B B B B %.- @ 5.= >.B B B B s %.@ @ ].U s B B s .& 5.- $.O s B s .% @ 5.% >.B B B s O %.E *.& @ @ O B B B s O ].@ # ; 5.@ |._._._._._._.|.3.3.2.1.|.:._._._._./.}.2.> @ 5.# 5.5.b 4.|.[.^._._._._._._._._._._._._.1.> @ 5.5.> 2._._._._._._./.2.@ 5._ . . . . < 5.> }._._._._._._._.1.@ 5.5.@ 4.$.~.>.*.%.U E s s B B B B E @.@ ! } . . 2 ! 5.@ & {.%.B B s B B B B B s .% 5.! } . . . . . . . . ", +". . . . . . . . } ! @ ].O B B B B B B %.% 5.; } . . . . . : # & ~.E s B B B B B !.= % @.O s B B s U 5.@ 5.@ & %.s B B B s *.% % .s B B B E {.% % @ .s B s U ].% 5.5.& .B B B B O E .= @ & >.B B B B s .= 5.$ / 5.@ |._._._._._._.|.> @ > c c 2.[._._._._.^._.|.@ @ 5.5.5.5.@ b 2.|.[._._._._._._._._._./._./.1.> @ 5.> 2._._._._._._./.2.@ 5._ . . . . / 5.> }._._._._._._._.2.@ 5., 5.@ % & & = * % {.*.O s B B B B !.% # 1 . } ! 5.% @. .E r .~.U s B B B B B B >.% 5.2 . . . . . . . . ", +". . . . . . . . 1 ; @ ].B B B B B B B {.@ 5.< . . . . . . / @ & %.s B B B B s U @ @ & ~.B B B B s !.& 5.5.@ 4.U s B B B s {.* >.B s B B B U = % $.U s s B U ].- 5.5.@ ].O s B B B s U 5.% @ & U s B B B B >.% 5./ < 5.@ |._._._._._._.|.@ 5.5.5.@ c 1./._._._._._.^.|.@ @ > > 5.5.@ b > 3.1.}.:._._._._._._._./.^.[.4.@ 5.> 2._._._._._._./.2.@ 5._ . . . . / 5.b [._._._._._._.:.4.@ 5._ < ! $ $ , # 5.@ & & @. .B B B B %.& 5.1 . _ 5.% ].U s s O @.* 4.%.B B B B B s U = 5.< . . . . . . . . ", +". . . . . . . . 2 $ @ {.B B B B B B O ].@ 5.: . . . . . 2 $ % $.O s B B B B E >.% @ @ %.s B B s O @.% 5.5.% $.E B B B s O ].@ U s B B B B !.{.%.B r B O *.@ @ 5.5.5.= !.B B B B B E ~.& 5.& ~.E s B B B O % 5.5.: < 5.@ |._._._._._._.|.@ 5.$ / $ 5.b }._._._._._._.:.3.@ 3.3.5.5.5.5.@ > @ @ 2.|.[._._._._._._._._.1.@ 5.> 2._._._._._._./.2.@ 5._ . . . } ! @ 5.[._._._._._._.}.4.@ $ 1 . } 1 1 2 2 < ! , @ % @ .B B B .& 5.< _ ! @ @ .s B B *.= 5.% & *.B B B B s O $.% ! . . . . . . . . ", +". . . . . . . . 2 $ @ >.B B B B B s .5.@ ; 1 . . . . 8 / 5.% %.s B B B B s %.& 5.@ ].O B B B s %.= @ 5.5.% *.s B B B s %.= ~.B B B B B B O B s O .!.4.& 5.5.; $ @ = .s B B B B .& 5.@ & %.s B B B s !.% 5.; . < 5.@ |._._._._._._.|.@ 5.; } < 5.> |._._._._._._._.1.@ }.}.5.@ # < ! 5.5.5.@ c 3.|.[._./._._._._.|.@ 5.> 2._._._._._._./.2.@ 5._ . . . 1 # > 2.:._._._._._.^.1.> 5.! 2 < ! ; ! / _ . . : ! 5.% ].O s B %.& 5.5.5.5.% $.E B B E $.% 5.5.@ @ U B B B B E >.& ; . . . . . . . . ", +". . . . . . . . 2 $ @ ~.B B B B B s %.@ @ / } . . . . _ 5.% {.E B B B B s U 5.@ 5.@ ~.B B B s E ~.& 5.5.@ 4.O B B B s O $.= *.s B B B B O .*.>.$.% = @ @ @ 5.; $ - $.O s B B B E @.@ 5.% @.O s B B B O ].@ @ # / / 5.@ |._._._._._._.|.@ 5.; } : 5.> |._._._._._._._.|.@ }.^.2.@ 5._ } : / $ 5.5.@ c 3.}.^._._._._.|.@ 5.> 2._._._._._._./.2.@ 5._ . . . < 5.c |._._._._._.^.}.4.> 5.< / 5.@ @ @ @ 5.! : . } ! @ = %.s B !.& @ % % @ % >.s B s O % 5.# ! 5.% !.B B B B E >.& , . . . . . . . . ", +". . . . . . . . 2 $ @ ].E B B B B s !.- 5./ . . . . 2 $ @ 5.U s B B B s U @.- 5.5.% %.B B B s U @ @ 5.5.& *.B B B B B *.= 5. .s B B B s %.% & = % @ @ @ ].4.5.5.5.= !.s B B B s %.% 5.5.& >.B B B B s %.% % 5.@ 5.5.5.@ |._._._._._._.|.@ 5.; } : 5.> |._._._._._._._.1.@ }.^.|.b 5.# 2 . . 1 _ ! # 5.c 2.:._._._.^.1.@ 5.> 2._._._._._._./.2.@ 5._ . . 2 $ > 4.}.^._._._._.:.2.b 5.; ! 5.@ 5.@.@.5.& @ # < } < 5.* %.r E @.@ >.%.*.].& !.s B s O & 5., 2 # @ ].B B B s O $.% ! . . . . . . . . ", +". . . . . . . . } ! @ 5. .s B B B s !.- 5./ . . . 2 ; @ = %.B B B B s U $.- 5.5.5.@ O B B B B %.= 5.5.% ].O s B B s .% @ 5. .s B B B s !.= @ 5.5.@ & >.E %.% 5.@ 4. .s B B B B {.% 5.@ 5. .s B B B E ~.* !.%.].@ 5.5.@ |._._._._._._.|.@ 5.; 2 / 5.b }._._._._./._.:.3.5.}.^./.2.b 5.; : . . . . : # b 2.[._._._./.2.@ 5.> 2._._._._._._./.2.@ 5._ 2 _ ; @ c 1._._._./._._.1.b 5.5./ ; @ 5. .B E .~.- % 5.; $ @ % .r .% %.B s s U @.~.s B s O 4.@ # : ; @ 4.B B B s U @ @ / . . . . . . . . ", +". . . . . . . . . < 5.- ~.E s B B s .@ @ ; : : < $ @ & !.E s B B s .$.% 5.5.5.% {.E B B B E {.% 5.@ - .s B B s .4.@ 5.- !.s B B B s .% @ 5.@ = >.E B >.% 5.% $.E B B B s .4.@ 5.@ ].O B B B s .= ~.B U 4.@ 5.5.@ |._._._._._._.|.@ 5., ! 5.> 3.[._._._._._./.1.b 5.}.^._.[.3.b 5., / _ : : < , c 2.:._._.^.|.@ @ 5.> 2._._._._._._./.2.@ 5.; ; 5.@ c 2.:._._._.^.:.1.> 5.5./ : 5.% >.s B B s E %.4.& @ @ = {.E O 4.{.E s B B s %.].O s B E >.& 5.! # @ $.B B B B *.& 5._ . . . . . . . . ", +". . . . . . . . . 1 ; @ & *.B s B B E @.- @ # # @ @ % !.E s B s E *.5.% 5.5.; 5.= %.B B B B O - @ % @ %.B B B s .4.% 5.5.% {.E s B B B E !.% % ].%.E s *.= 5.5.% !.s B B B B !.= 5.5.@ ].B B B B s .!.E O 4.& @ @ @ @ [._._._._._._.}.@ > @ @ b 3.}._._._._._./.1.b > 4.}.^._.^.[.2.b @ @ @ $ , @ > @ |.^._.^.[.3.> @ @ b 1._._._._._._./.2.b @ @ @ > 4.|.:._._._._.}.2.c @ 5.; 1 : 5.% !.s B B B s s U !.4.4.!.O O {.* >.s B B B s .@ !.B s s .& % @ @ & %.B B s U 5.@ ; 1 . . . . . . . . ", +". . . . . . . . . . _ 5.@ - *.E s s s U $.5.@ @ 4.$. .B s s E .{.& @ 5.# _ ! @ @ U s B B B O $.4.]. .B s s E %.5.% 5.5.# @ - !.B s B B B B O O E s E !.& @ 5.5.@ U s B B s O $.- 5.5.@ ].B B B B B B s O $.& 5.4.3.2.|._._._._._._._._.|.2.3.2.|.[.^.^.^./.:.}.2.> @ @ 4.}.^.^.^.^.:.|.3.4.@ @ @ 4.3.|._.^._.}.3.> 5.3.3.1.:._._._._._._._.[.1.1.1.1.}.:.^.^./.:.}.1.5.b @ 5.! 2 . 2 # % $.O s s B B B s B E E B U $.& & ~.B s B B s %.% - %.B s B %.].4.4.!.E s B .].% 5.< . . . . . . . . . ", +". . . . . . . . . . . < 5.@ % {.U E s r E .%.%.U B r B O .~.% @ @ # ! : 1 $ & ~.E s B B B E E O E r s E .~.& @ 5.; : : # @ & !.O B s s s r s E U ~.& @ 5.5.@ ].E B B B s .& @ , ; @ 4.U s r s s E .].% 5.@ |.(._._././././././././._._._._./.:.[.}.}.1.3.> @ @ 5.@ 4.}.^.}.}.[./.^._.}.|.|.|.}./.^.:.}.1.@ @ @ 3.}.:._._./././././././._._._._.:.:.[.}.}.1.3.> > @ 5.$ < . . . . / 5.% {.U E s s s s B E U !.5.@ 5.@ @ %.B r s U $.% @ & >.U E B E U O B E U !.@ @ 5./ . . . . . . . . . . ", +". . . . . . . 1 _ < < / # 5.5.- % ~.%. .U O O O U .%.>.@.& % 5.5.5.# _ . _ 5.= %.s B B B E >.%. . . .*.~.& - 5.5.5.; < < , 5.5.& ].!.%. . . .*.~.% % 5.5.5.5.@ @.!.!.!.!.!.{.% 5., ; 5.@ ].*.%.%.%.{.& @ 5.5.@ 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.2.2.5.c b @ 5.5.5.5.@ 5.|.}.@ b 2.1.|.|.}.[.[.[.}.}.|.1.4.b @ 5.@ 4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.2.3.5.c b @ 5.5.5.5.; < < < < < ! 5.5.- @ ~.*.%.%.%.!.{.% & @ 5.5.5.@ @ >.%.*.@.% 5.5.5.- & {.!.%.%.%.!.~.% & 5.5.# / < _ 1 . . . . . . . ", +". . . . . . : ! 5.@ @ @ @ @ @ @ @ = * > 4.@.@.@.].% 7 = - @ @ @ @ @ 5.$ / ! @ 4.U s B B s .& = @ @ - * & @ @ @ @ @ @ @ @ @ @ @ @ % * = @ 6.- * = @ @ @ @ @ @ @ % = = = = = - @ @ @ @ @ @ % * * * * & @ @ @ @ @ b c c c c c c c c c c c c c c c c b b > @ @ @ @ @ @ @ @ @ 4.4.@ @ b c c @ 4.3.3.3.4.@ c c > @ @ @ @ @ c c c c c c c c c c c c c c c b b b > @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ > = * * * * = & @ @ @ @ @ @ @ @ = * * - @ @ @ @ @ @ & = * * * 7 & > @ @ @ @ @ @ 5.! 2 . . . . . . ", +". . . . . . ! 5.@ 5.4.4.4.4.4.4.4.4.4.4.5.@ @ @ @ 4.4.4.4.4.4.4.4.4.5.5.5.5.& {.E B B B s !.& @ @ 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.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.5.4.4.4.4.4.4.5.5.5.5.5.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.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.@ 5.! . . . . . . ", +". . . . . . $ @ 3.|.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.3.@ 5.5.& !.s B B s O {.& @ |.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.|.3.> 5.5.. . . . . . ", +". . . . . . $ > 2.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.}.3.@ 5.@ 5.U s B B s .5.% 3.|.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.|.5.@ 5.5.. . . . . . ", +". . . . . . ; @ 4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.5.5.@ % !.B B B B s .@ % 5.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.@ 5.5.# . . . . . . ", +". . . . . . : ; @ > > > > > > > > > > > > > > > > > > > > > > > > @ @ ].%.U s s s s s s s O .!.& > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > @ 5.5.5.; . . . . . . ", +". . . . . . . 1 / $ 5.# # # # # # # # # # # # # # # # # # # # # # 5.@ ].%.U . . . . . . .U U !.& 5.5.# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ; : . . . . . . ", +". . . . . . . . . : : : : : : : : : : : : : : : : : : : : : : : : ! 5.@ = * * * * * * * * * * & 5.5./ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1 . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 $ 5.5.5.5.5.5.5.5.5.5.5.5.5.5.; 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : / / / / / / / / / / / / ! / 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < [ 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [ a 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } 3 7._ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 5 7.< . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1 } . . . . . . . . . . . . } } . . . . . . . . . 1 9 7./ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 [ [ } . . . . . . . . . . . < 5 : . . . . . . . . 2 = 7./ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 7.< . . . . . . . . . . . | 7./ . . . 8 . . . . : ).;.[ 8 . . . . . . . } 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : 7.7 2 . . . . . . . . . . / 7.3 } . } < 2 . . . < R {.0 } . . 2 < 1 . } [ / } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 7 7.| . . . . . } 1 } . . < ,.)._ . . 3 | . . . | $.>.{ 1 . . < 9 2 . : 7.a _ . . . . . . . . . . . . 1 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } | ,.).: . . . . 2 [ : . . < ;.;.| } . / 7 1 . 1 5 ~.!.- 2 . } 3 3 } . | 7.7.< . . . . . . . . . . . } 3 [ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } < [ : . . . . : R $.0 } . . . 1 7 | 8 . _ '.@.9 2 . < a _ . _ a !...,._ . 2 7.[ . } 9 ,.,./ . . . . . . . . . . . _ 7.[ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 9 7.5 1 . . . } 0 $.R < . . . . | ^ 1 . : R Q '._ . _ 7.9 < 9 ,...#.` 5 1 / 7.3 } 2 6 ` './ . . 8 / _ . . . . . } 3 7._ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } [ ,.7._ . . . . | $.P ).< . . . < 7._ . 2 5.H $.[ } _ 7.7.a 7.~.#.+.G 7.9 6 7.5 1 _ 6 {.,.[ . . 1 6 < . . . . . : a 5 } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ R $.0 1 . . . < '...~.6 / 2 } / 7.7 : _ '...P 7.3 9 7.7.R >.#.+.+.#.P -.,.7.7.[ 5 ,.~.,.5 } . 2 6 < . . . . 1 5 7.| . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } 3 ~.R _ . . . _ 6 G Z ~.,.6 3 6 7.7.a a ,.....,.R Q P H #.Y +.+.+.+.+.#...G ~.@.a '.>.7.9 1 . _ a < . . . 8 | ,.'._ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / $.P { 1 . . : ^ Q Y Y ..Q ` R R ` Q Q ,.H Z R Q V V V Y +.+.+.+.+.+.+.+.+.Y X ` $.*.7.7.| : 3 7./ . . . / a {.` 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < '...$.| . . < 7.Q Y Y V V Z X X Z V X '.H F T R Z Y +.+.+.Y Y +.+.+.+.+.#.Y ..,.G H 7.,.,.a 7.7.| . } / a {.*.; } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } . . . . . . . } _ : . . : a P G a _ _ ^ 7.H V Y Y Y Y V V Y V K ,.H e H ,.H V Y Y Y Z Z Y +.+.+.+.+.Y P '.X H 7.~.H {.,.7.7 < [ 7.-.=.!.| . . . } _ 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } | < } . . . . . } 3 9 } . } 3 '.X $.a 6 7.Q Y V Y Y Y Y Y Y Y V H ,.D e Y @.Q V Y V Z P ..V Y +.+.+.+.Y $.$.+.H 7.>.t #.H {.'.7.7.{.=.&.~.| . . . | a : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } 3 7.| . . . . . . : 6 [ } . _ a K K 7.` H Z V Y Y V V Y W W W V G @.W V F Q R I Y V X @.H V Y Y Y +.V ..` ..V ..7.Q Y +.+.#...*.*.=.&.&.~.| . 1 [ 7.| } } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 7 7./ . . . . . . | 7.| } 2 6 Q W T $.W F Y W W H D F W W W S Q P e W F X R H F F D R H V Y Y Y V Y $.P V Y ..,.Q Y #.#.+.+.+.&.&...~.;.7 < 3 7.| . / [ } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : ^ 7./ } . . . . _ 7.7.[ | a '.I D ,.P e W W F P T W S W F v $.X F W W e G T W F K 7.G F W Y Y W G P Z Y Y X '.Q Y +.+.#.+.#.#.#.#.!.'.7.7.7.3 . _ 7.7 } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ a 7.| 1 . . . 1 9 7.7.@.H R G f P '.D e W F K 7.H f W F K P F W W W W I G I e H 7.P V W Y V X H Y V Y Y Z R T Y +.+.+...G #.#.#.#.X >.'.7.< 2 ^ 7.< . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < 7.7.5 < 2 } 2 9 7.$.D F @.T e S T @.I e F D 7.@.I L S I I S W W W W S F S S P R Q I V W W W V Y Y Y V Z '.$.Y Y +.Y {.Q +.#.#.#.#.&...{.^ ^ 7.7 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 _ 2 . . . . . . 1 3 R T '.9 | 5 7.$.X e F T $.F e I T Q I f I ` 7.P f S F F S S S S S S S F v T G T K F W W W W W W Y V Z @.@.Z Y Y G '...+.#.#.#.#.#.+.=.;.;.-.| } . . . } } . . . . . . . 1 } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } [ 7.^ < } . . . . . : - G K $.R @.P W F W F G $.S S f C Q G u C Q R $.v f S S S S S S S S S f K ` D $.G F S W W W W W W W Y D K Z V ..,.@.+.+.+.#.#.#.#.&.>.;.>.;.< . . 2 / [ 2 . . . . . . _ 5 < . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 ^ '.~.).| } . . . . . [ $.W I D Z F F W W F K @.C F S L J v S f G Q Q Q x L S S S S S S S S f G ` I Q Q u S W W W W W W W W V V V Z @.7.P V +.+.+.#.+.+.Q '.*.>.7.3 _ | 7 7./ } . . . . 2 | a 7._ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 _ ^ >...$.3 : . . . . / a K e F F W W W S L K ` I L S S L L S f K Q H R K g J J J J J S S L f Q $.g G ` C F S S W W W W W W W W F Q ,.,.H V +.+.+.Y X ~.` ..#.@.@.@.a 7.a < . . . . 2 | 7 7.7.< 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < 6 P Z Q ^ < } . . < 7.H F W W S F S S F D Q C L S S S J J g v T D Q $.C f J J J J J J L x T Q i I @.K f S S S S W W W W W F H '.Q ` K V +.Y Z G -.$...t ..,.*...'.7./ . . 1 : | ^ 7.7.7./ 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / 7.P V H '.3 : 1 3 '.D F W S I C F S S S S S S J J J J J w v T D z '.P i L J J J L J g D T z L g P T u J S C I S W W W e v '.Q K ` X V Y Z Q $.H +.+.+.!.'...+.!.7.| : / 7 7.7.-.{.,.| } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / 7.P F X T 6 7 a H e S S L D T D g S S J J J J J J J J w z Q K l G '.H w L J L w L h G G g J L v G I L f G H L S S e I $.@.I H ` Z V Y X ..+.Y +.+.#.$.{.#.#.&.>.a 7.7.,.-.!.!.-.[ } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } < 2 . | 7.P F F G ` '.G I f f f I ` ` D g L J J J J L L J L w z Q K i i G T L L w z D J J D v w J J L M J f C $.G f S F I Q $.v f G @.Z V Y Y V Y +.+.+.X ` >.+.#.#.#.!.~.~.!.=. .-.5 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 3 6 < 1 | 7.Q C f v Q ,.` G v u g H 7.R D i L J J L L L L L g z Q D i M g A J L i D $.v w w w L J J J L J g D ,.H g S S K P C F e P $.W W Y Y Y +.+.+.Y ..R G +.#.#.#.&.&.&.&.=.$.6 : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } _ _ } . . . . . . 2 3 7.3 / ^ 7.Q F f S D P ` ` Q v k Q 7.'.H i w J L L L L L g v G z i L M i M L l G 7.H g L L L L L L J L g P 7.K g S S C L F W f P T W W Y Y Y Y +.+.Y ..` ..+.#.#.#.#.=.=.&.*.7./ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 ^ 6 3 < . . . . . . } [ 7.a a 7.7.P F F f f v H H v i z @.,.,.Q A l g w L L w i x z M M M M M M w j Q 7.Q h M L L L L L L i K @.T K g J S L J S S f P Q F W W Y Y Y Y +.Y H @.X +.#.#.#.#.&.*.>.{.a 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } < 6 7.a [ _ } . . . . 1 9 7.7.7.7.,.K f S J f f f L J i K ` Q ` ` H v z u + z D y y M M M M M M l D @.P T x w M M L L M L K ` H K Q z f S S S S S f G P S W W W Y Y Y Y Y ..P #.+.#.#.#.#.&...-.7.3 } . . } : : } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : 9 7.7.).3 < 2 2 2 _ 7 7.7.7.7.7.'.D g S S J L J J L i P G A P R R T z l H R D l M M M M M + l P ` A T H l M M M L w x Q G o v R H g J J S S S f K P S S W Z Y Y Y Y +.+.+.+.+.+.#.#.#.#.&.>.7.5 < < | 9 6 | 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 7.P H ` ).^ ^ a 7.@.Q P T ,.7.T C f J J J J L L w x $.D l z D v x l D 7.` z o + M M M y k Q P o H @.z i M M M M M u M g x P H w L J J S S S W I F W P H F Y Y Y Y Y +.+.Y #.P X #.#.&...;.7.7.7.a 3 _ } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 ` K Y H P Q Q G I e f F D Q 7.G h L J L L L L L i P Q l i i i M i z @.$.Q v o i M M + + D v l x G D i M M M M M M M L M M L L J J J J S S L g f G R v F Y Y Y Y +.Y V ..$.G #.#.#.#.&.~.7.7.5 _ } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 3 ,.K e F F F e S W S S g g Q T C w L L L L L L g z T A i M M M i A Q v G T H A + + + N l i M + l y M M M M M M M M M M M L L L L J J J g f D P a Q e W W Y Y Y V Z P 7.7.X +.#.#.#.&.*.,.a 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 '.X V W W W S S S S S f z D J L L L L M w M M k G H l M M M y A Q K p K Q D l + + + + + + + N + N N M M M M N M N M + M M M L J L J D Q '.@.@.D F W W W Y F Z $.'.@.7.P +.#.#.#.&...;.a _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } 1 . . 1 5 T W W W W S S S S J J f g L L L L M x A l i + H G l M M N i n T G o l j j + + j j + + + + + + + + + N N + + + + + j M + M M L M C G P K K Q S S W W W F D ` T D z Q 7.H Y #.#.#.&.{.7.| . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 [ [ | < [ 7.G e W W S J J S J J J J L L L L i A Q P k l v z y N N + y n Q G o N i y + + N M + + + + + + + + + + + + + + + + j M + + N M L J u f i P Q f W W W F D @.Q x l l x T ;...+.#.#.&.*.,.^ : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } : | 6 7.7.7.Q e S S S I C f L L L L L L L M M l H ,.Q A l i + + + + + k D D l + + + + + + + + + + + + + + + + + + + + + + + + + + + + M M L L L C T H L S W F I @.Q m l + + i I ` $.+.#.#.#...'.7.6 < . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } 2 / a 7.P f S S f K ` H C h g g M M M M M M l P 7.@.D m l l + + + + i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M M L L z P I F S F C $.T x i + + + + g D '.P +.#.#.#.-.'.;.7./ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [ ,.K f S S J C T 7.R Q H z k i l l l l l z ` 7.$.P K z y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M L L J C J S S f P ,.D f N + + + + L V !.,...+.#.#.$.$...$.a < . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 _ _ 2 . . . . } 3 R I F S S S L u G R 7.7.` Q G K v v D A l H ` H Q ` P x l + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N M L L L J S f K '.>.Y F i l l l l f V &.{.$.#.+.#.{.` F z @.7 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 7.,.5 < 2 . . 2 6 Q F S S S S S w i D ` 7.$.$.R '.` ` @.D l l T Q o A v n i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N M L J J L u T -.=.&.Z I v D K K H *.%.*.7.P +.&.{.` F p D R 3 } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [ 7.` ~.` 9 [ < / a K g f f f f L J L i v $.@.D v D K K D x y l K @.A o l y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M M L J g v ` {.!.{.-.` ` R ,.a ,.).R ;.7.'...+.~.,...I e H ,.< . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 [ ,.$.P G T a a 7.Q G H D v C J J J L l z @.@.n o l l l y N i x $.K o N + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N + M M L g K ,.,.a ~ ) ' ' ] ] ] ] d ] ! 7.7.~.#.~.7.,.;.{.~.'.7 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } < ^ R G Z D P $.R ,.,.R @.Q D M L L L l z ` Q i + M M N + + m P G o + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M L g K T R ).d q q q q q q d q q ] a >...#.~.; ] ] ~ 7.7.7.< . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 [ 7.@.D e S I v v v v z S L L L L M l D '.K l M + + + + + j j l l + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M L L C x P > d q q q q q ' > ~ d d { >.Y +.{.! d q ] ).7.6 _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } < ^ '.P u f F L L f L L J L L L L M i Q P l M + + + + + j A z D A l + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N M L L i G ).d q q q q d > 7.7.' d ; ~.+.+.~.a ).! ] ~ a _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : 6 7.Q I f S S J J J L J M i M M i v P j + N + y + l D @.Q G z l + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M L L i K '.] q q q q d ).7.7.) d ; {.+.+.{.7.7.7.] ' 6 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 : _ < / < _ 2 . . . . . . . 8 _ _ 2 1 } . 1 9 7.7.T I f S J J J L y i z x w M M D j i i l i + l n Q P m l + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M M v K P '.) d q q q q ) # ~ d d 0 {.+.+.{.a ~ ) d ' 6 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 | 9 6 a ,.,.,.a 9 < } . . . . . . / 6 6 9 [ [ 5 7.7.7.7.T C f J J L i j G $.D l M l o o l o D K k y l n Q H o + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + w D P T ` ).~ ' d q q q d d q d & {.+.+.{.6 ] q q ' 7.< . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 | ^ 7.-.>.!.*.*.*.!.>.R 3 : . . . . . 1 _ | 7 7.7.7.7.,.P T 7.Q u L M i K $.7.P x i i z H P Q T T K l y + l v D y y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N M M u I D H Q '., ) d q q q q ] 7.Q +.+.~.7.' q q ) 7.a < . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } _ ^ 7.7.,.*.=.=.=.=.&.&.&...~.).< } . . . . . . 2 < ^ 7.7.P f C P 7.G i z G '.@.H i l A P R a @.Q P v l y + + + l i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M M w w f f S D ~.,.@ ] q q q ) 7.G Y +.~.7.~ q d ).-.;.a _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [ a ^ 7 a 7.{.=.=.=.=.=.=.=.&.&.*.).[ 1 . . . . . . . : 9 a D f L f G T z G 7.'.H j i w x K Q R @.K o o y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M M L J J S F f F K -.6 ] q d a ` X +.+.*.7.~ q ~ -.=.%.'.7 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / < 2 1 : [ 7.{.!.~.{.>.*.=.=.#.&...-.9 : . . . . . . 1 5 ` I F S L f v C v D K P $.G + i i m z H $.P x l + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N M L J J S S S S e I T - ] ~ 7.G V #.+.X ;.^ ! ;.%.&.=.~.7./ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 [ 7.;.!.%.=.=.=.&.#.#.+...@.6 < 8 . . . . _ a T C F S S J L L w g i j H G j y M y i o v @.G l y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N M M L J S S S W W F Z R a 7.@.X +.#.+.#.{.7.7.-.=.=.=.%.,.6 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 3 ;.*.=.=.=.=.=.#.#.#.+.X @.7./ 1 . . . [ 7.Q S S S S S L f J L L L i i M M M M N + l z v y y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M M L J J S S W W Y F G 7.'...Y #.+.#.~.'.R R '.'.>.=.=.>.7./ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 9 ,.{.>.>.>.>.>...#.#.+.X $.7.[ 2 1 < 7.7.Q S S S S g u G D w L L L M M M M M N + N l l + + + + y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M L L L J S S W W Y V Z '.T Y +.+.+.~.$...X X ..Q a $.=.%.,.9 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : ^ 7.>.%.*.*.*...#.#.#.Y X Q 7.9 5 a @.@.Q C S L g v T $.z g L L M M M + i N N + + + + + + + l l N + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N M L J J J J S W W W Y Y @.$.+.+.V G ` X t t t t t ..,.~.=.$.7.< . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ a $.=.&.&.&.#.#.#.#.#.Y +.G {.T Q v P Q u g C H @.@.D g L L L M M M j A j + + + + + + + o v H j y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M L L L J J J S W W W Y W {.` Z V ..` ..t t t t t t t Q ;.=.*.7.3 } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / 7.{.=.&.#.#.#.#.#.+.+.Y V Z I V f H P v H @.7.$.v w g L L L M M l D Q A y + + + + + l D T K o + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M M M L J J S S W W W Y Y $.` +.Y {.Q t t t t t t t t G ,.%.=.-.^ 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } [ 7.!.&.&.#.#.#.#.+.+.+.Y Y V W W I D T '.@.@.$.@.R P A M L L M o P @.x y + + + + + l G ).Q v i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M M L L J J J S W W W Y Y $.{.Y Q {.t t t t t H ..t t G '.%.=.{.7.< . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : 7 '...=.....#.#.+.+.+.+.Y Y Y Y W S v v S S I K Q ,.T u M M l D '.H i + + + + + + + j z G K N y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M M M L L J S S W W W Y Z R Q G @...t t t t G P +.t t Q ;.=.=.>.7.[ } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < 7.` >.>.!...+.+.+.+.+.Y Y Y W W W F F S S L g i K H J L i A ` $.x i M + + + + i y y l o l + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M N + + + + + + + + + + + + N M L L L J J S W W W Y V K ,.R ` ..t t t +.G {.X t t +.` {.=.=.*.,.5 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 3 7.!.....X #.+.+.+.+.Y Y Y Y W W W W S S L S J g g L i x @.R v i M M M + + y i + + + + + + + + + + i l l l l l l l i y y l l + + + + + + + + + + + + + + + + + + + + + + + + N M M L L L J J S W W W Y V P 7.;...t t #...@.~.+.t t t P 7.!.=.=.%.;.7 : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 6 ;.*.....#.+.+.+.+.+.Y Y Y W V W W S S J S J J J i A T R D o l l l l y + l G D l + + + + + + i l k z v v z A n k l l l A D A y + + + + + + + + + + + + + + + + + + + + + + M M M L J J J S S W W W V Z ` 7.;.~.{.$.;.7.7.G t t t H ,.{.=.=.=.%.-.7.9 | 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 7.!.&.#.#.#.+.+.+.+.Y Y Y V G K F F D P I L J g z T ` z p j v D D v M o D ` D l + + + + + l A H Q @.T Q @.@.T Q P P P T P x i + + + + + + + + + + + + + + + + + + + + + M M M L L J S S S S W W Y F K ,.7.` Q Q Q Q Q ` ;.>.Q {.,.,.%.=.=.=.%.-.7.7.7.[ } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 9 ;.X #.#.#.+.+.+.+.Y Y Y V G D F F P $.J L w A $.` v z P @.R '.'.$.v o Q G l + + + + + l A T 7.R G D D H G Q @.` ` @.>.X i l + + + + + + + + + + + + + + + + + + + N M M M L L J S S S S S W W V W T 7.7.P e e e e F v @.7.Q Q a ,.%.=. .=.%.;.,.-.7.a 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < 7.>.+.#.#.+.+.+.+.Y Y Y V H H F I @.H g f v $.7.@.T R '.@.P H K D m G P o o l + + + l A T 7.@.v i i i i i u I Z X X =.=.V l y + + + + + + + + + + + + + + + N + + M M M L J J S S W W W W W W F H 7.7.7.T e e e e e f H $.F e G ,.*.=.=.=.*.7.$.X P 7.| . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 7 ;...+.#.X +.+.+.Y Y Y F Q $.u P $.u f C T 7.R Q G H v x l l l o K a $.P G v + + y o G 7.,.D l N N + + + w w L V Y +.%.>.G x y + + + + + + + + + + + + + + + + N M g A H C L S S W W W W W V I $.$.K $.R I e F F F e X Q e e I R >.=.=.=.>.7.P e u Q 6 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < 7.~...G ..+.+.+.+.Y Y F P @.K T D f S C G H z g i i i w M M i z $.@.T $.$.Q A i l z @.7.G i + + + + + + N M J F V *.@.$.G x y + + + + + + + + + + + + + + + M + j z z P z L S S W S W W W F P R X e H ,.H e F F F e Z Q V e e Q -. .=.=.{.7.K i o v '.| } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 6 7.>.#.+.#.+.+.+.Y Y e H ,.7.P C L L S f f g u L L L L M M + x z y i i y j N + o H 7.` I w + + + + + + + M i C P ` H l l + + + + + M N + + + + + + + + + + M i x Q G Q v L S S S W W W e K '.G V Y Z @.Q e e F F e C K F e e G ,.*.=.=.;.` v l y l P 7.| 1 8 2 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } | 7.!.+.G ..+.+.+.Y Y C G ,.` @.@.G C L S L H G w L L L M M M + l K K y + + + i l Q 7.K f M + + + + + + + l z $.$.D o l + + + + + + + + + + + + + + + i y M M M w D T '.K f S S S W W F Z ` Q V Y +.Y P ` C e F F F F e F F e G 7.!.=.%.7.T S i l o n ].7.3 | 7 | . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : a ;.P H X +.+.+.Y Z Q ,.7.H D Q ` Q C f C R T g L L L L L M i k T Q i + N + o v '.Q F L M + + + + + + l A @.@.z p i N + + + + + + + + + + N + i + + x x M M L L i z T H f S S S W F I T ` Z V +.+.Y H '.D e F F F F e F F e P ,.%.=.~.7.!.V w z D A D ` 7.7.7.[ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } 3 7.P Y +.+.+.+.V ..,.9 6 Q e e D H I f P 7.H g J L L L L M l v '.G l N + l A $.` Z F J M M + + + N j j Q ).z m j H D i + + + + + + + N N + x A y j G D i L L J J f v I S S S W S I Q '.D V +.+.+.Y ..'.G f e F F F F F e F $.-.=.%.,.'.!...W v P H +...;.7.9 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 7.>.+.+.#.#.+.V G 9 : / ,.X F F F f D ,.Q u L L L L L L w k Q R z l M l v ].,.*.+.Y I z z + + l A j G ,.D p K T P z i + N + + + N N M M l A Q K v T v w L L J J S f L S S W W F G T D V Y +.+.+.+.+.{.` v e F F F F F e D ,.>.=.~.7.,.-.-.*.+.H *.>.~.'.a _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ 7.-.#.X G #.Y Z $./ . 2 a P F W F S $.'.I g u z S L L L i K 7.H o y i H R ,.*.%...+.D v C M j j D K R P l o H '.D o + i i y i + M M M M + k D T @.P y L L J J J S S S S S W W W X Z V Y Y +.+.+.+.Y H 7.G e e F F e e e Q ,.%.!.7.9 3 7.7.;.$.-.;.,.7.6 _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 7 ,.G G ..+.Y ..6 _ . } [ '.D F e G ,.K u K P Q z g J g z $.T k l l H 7.,.%.=.%.=...H D f C C v G R T m y l z K j l j K v D P A i M M M M M l K ,.H g J J L J S S S C S S W W W W V Y Y Y +.+.+.+.#.Q 7.R D e e e e C P ,.!.*.'.^ : } < 3 9 9 9 9 5 | : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 3 7.{.X +.+.+.{.9 2 . . : a Q f v R T K T ` G u L J L y Q $.j n D G Q ` -.*.!.*.%.!.G Y S K D Q 7.@.z l + N y l + + k P Q G T n i M M M M M M l P H w J L g f S L D G S W W W W Y Y Y V Y +.+.+.Y H 7.7.7.R G D K P R ,.!.%.;.6 _ . . . . . . . 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / 7.*.+.+.Y >.7.| . . . } 5 ` D P 7.'.,.Q v g L J J g H '.H H T $.Q D z G @.,.,.;.$.{...P @.@.7.@.v l + + N M N N M i A T ` D l M M M M M L L w z v L L I K I f f D T I S W W W Y Y Z ..X +.+.+.+.{.,.!.!.;.7.,.,.,.$.%.%.;.a _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ 7.!.t +.P ,.6 2 . . . . [ a ` '.7.a P F f S S J i D ,.7.$.Q G v i i i l z H P $.,.7.7.7.7.,.P z l M M M + + M M M + l Q @.j i M M M M L L L L M M J w z Q $.v g I $.D F W W Y Y V X ` H V #.+...'.G +.&...!.>.!.%.&.%.-.a < . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ 7.>...~.7.a < . . . . 1 7 7.7.7.7.P f F S S S f K '.R Q K g l g L L L M l o l k D H Q '.P D o j j M M M l l N M M + i K H l M L M L L w i L J J J J J L u P $.v u Q K F W V V Y V X R Q Y +.+.Q ` &.&.=.=.&.&.&.&.*.;.a < . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } | 7.'.'.7.^ < . . . . . | 7.7.7.7.$.I F W S S f v T Q v g i L J L L L M u D z w y l o A Q v p H G x y y x G G x y M M M M h M M i w L M C v C L J J J S S L g G @.v G P e W Z Z V V V G R ..+.#.$.>.&.&...~.%.=.=.*.'.6 < . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } < 7.7.7.a [ 2 . . . . . : a 7.a 7 7.G e W W W S J I D u v K L J J L L L w x P K i L M + j P K K T D y M y k P '.v l i M M + w M M D v i i H T C w J J S S S S J J P $.T T F F G @.T ..V Z @.>.+.#.*.X #.&.&.{.!.&.!.'.6 _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 3 a 6 3 | : } . . . . . 2 9 7.| : 1 | ` X F W W W S S L f G P f J J J J L w x Q G i L M i m P T P K l M M M i z $.K j P z w M L L w H T K l G Q L L J S S S S S S F S Q 7.@.I V Z H Q ` Q Z G $.#.+.#.&.#.=.&.>.~.!.,.7.7._ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } _ _ 2 } . . . . . . . } 5 7.< 8 . . 1 9 T W S W W W S S S T G f J J J J J M x Q P i w h D A G 7.H l M M M M M l H P P ` A w L L L L j K ` K H G f J S S S S S S S W F C T '.K F Y V V ..` ` G $.*.+.#...=.&.&.%.;.,.^ 6 7.7 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < 7 _ . . . . . 3 7.P F W W W W S I ` H f S S J J J w A T H l x P Q z K G w w L L L L L i D ` 7.K g L L L L L L i K '.@.K g S S S S S S F G H W F I Q P V Y +.+.V #.~.7.7.$.#.&.>.` !.=.&.{.7._ 2 | 7.9 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 . . . . . 1 5 ,.7.H F W W W F D ` v L S S S L L f z $.K A Q Q A w J M M L M L L L L i v '.$.x w L L L L J J L g G 7.H g S S f F W S e Q Q W W V Z X +.Y +.+.Z Y +.>.7.,...&.=.!.'.-.>.!.;./ . . < 6 5 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ ` !.-.'.K e W W e Q $.S S S S f u I f D @.K T T j g J L L J L g w L L L w x T G g L L J J J J J J L C Q H f F I H I F W e P T Y W Y Y V +.+.+.+...+.+.+.>.7.$.=.&.&.>.7.7.-.'.5 } . . : 3 _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } [ {.=.%.,.R K F F v '.P e W S f v T H g K '.` T A g J J J J M x G v g J J J g z z L J J J L J J J S S L J C S F C $.T S S e P T Z W Y Y +.+.+.+.+.G ..+.#.+.!.,.*.&.&.*.7.9 / a 7.| . . . } } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 ^ >.=.%.;.7.'.K f G 7.K F S f K R T I f H 7.R D i J J J J J L h Q T A M J L v C g J J J J L L S S S L L J S S S S D @.Q F e H T Z Y Y +.+.+.+.+.+.P Q +.#.#.&.*...&.=.{.^ : . : 3 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < ,.*.*.-.5 / [ R P ` '.Z F e K ,.T C f J P ,.K g I S J S J J J w v '.H f g v $.H g S J L v P v f S F I K S S W W W e D @.P e D T X Y +.+.+.+.+.#.+.*.-.#.&.#.#.&.=.=.>.7.[ . . . 1 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 3 {.!.R | 1 . 1 [ 7.7.T W F K ,.@.I e S I @.P f C H v L S S S S S f T P f g P '.v f S S J J Q T C F f G $.F S W W W W e K '.G W T ..Y +.Y +.+.#.#.#.X $...&.=.=.=.&.*.7.7.5 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ R {.4._ . . . . . | 7.H e D '.,.D e W W W D S F S G D L S S S S S f H T L C ` P f S S S S f D '.H f F T T e W W W W W W F H a H Q H Y Z X #.+.+.#.#.#.~.~.&.=.=.&.%.'.-.!.;.| . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 7.9 : . . . . . . < @.I Z ` 7.P F W W W W F S S f P G S S S S S L f D @.I K @.v f S S S S F F Q $.C S $.P e W W W W Y Y V W T @.Q P Y #.>.$.H +.+.#.&.!.;...&.&...` 7.!.=.~.a _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : a ^ : . . . . . . . [ P Z $.7.,.K e W W W W W W W f P Q C S W S F v I C $.G Q Q g F W S S W W f v '.H W @.H F W Y Y Y Y Y Y F X ` ,.@.+.+.X >.@.P #.&.&...'.!.&...$.7.7.$.>.*.$.^ : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } 5 7._ . . . . . . . 1 0 G Q 9 3 7.@.K V V W W W W W e G @.I S W e D Q v f Q R R K I I S W W W W S F $.T Z @.K V V W Y Y Y Y ....V G 7.'.X +.+.Y ..` {.X &.&.{.{...$.7.5 3 ^ 7.-.~.,.9 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 6 | . . . . . . . . < T Q 7 2 1 < 6 ,.P W F Y W W W e G ,.X S S C T Q F e Q 7.@.C H H F W W W W V f G ` K @.D G H V Y Y Y V P @.+.+.$.7...+.#.#.+...7.` ..&.*.;.;.6 < 1 } 2 _ | = 7.7.9 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 _ } . . . . . . . 1 5 ` , : . . . : 3 7.T D F W Y W F P 7.D V F G @.v F F P 7.G g K $.D F W W V D G Z $.T @.X K @.K V +.Y Y Q @.+.V H ,.G +.#.#.#.&.~.7.;.*.&.$.a _ . . . . . } 2 < 5 7.9 : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : 7.7._ . . . . . 2 9 7.'.G Z V F Z @.7.D F X '.G e W F G '.X F Z @.G F W Y F P '.I G 7.` Z F P ` X Y +.Y ~.$.+.+.+.{.>.+.#.#.#.&.*.,.7.'.*.*.'._ . . . . . . . . 1 [ 7.[ } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < 7.3 1 . . . . . . [ 7.7.7.` G I P 7.,.X e G R X F Y V Z G Y W F Q @.I W W V Q ` W K 7.` Z V Z ` ~.Y Y +.~.$.+.#.#.X >.#.#.#.=.&.=.;.7.7.;.*.~.3 1 . . . . . . . . 1 _ 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : [ _ . . . . . . . [ {.!.-.7.7.` '.7.,.X Z ` G F Y Y Y Y V Y Y F H ,.H V V Z R Q V X '.'.X +.V H '.H Y +.~.$.+.#.#.#.#.#.#.&.&.=.~.7.9 < 5 -.>.'._ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [ ~.=.!.7.6 5 a 7.,.X G R Y F Y Y Y Y Y Y Y V X R T Y V ..,.G V Y $.` Z +.+.Y {.@.+.+.~.@.#.#.#.#.&.&.&...>.-.a | 2 . 2 9 -.{.9 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } 3 >.=.$.a _ . _ 9 '.X T '.H X Y V V Y Y +.+.V Z ` '.Z V G ,...V +.G G Y +.#.Y H ,...+.>.` X &.&.&.#...>.'.a 3 _ . . . . : ^ {.;.| . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 5 !.>.a < . . . < @...'.a ,.R T H X Y V V Y Y X ` 7...V P ;.X Y +.#.#.+.#.#.+.X ;.{.+.>.` =.&.=.*.{.,.7.7.| 1 . . . . . . < '.{.)._ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 b >.;./ . . . . / ~.>.9 _ < | 6 7.` {.P ..+.V X R 7.T Y Q -.#.+.#.+.+.#.#.#.+.#.$.7.X *.'.~.~.-.,.7.'.{.,.| . . . . . . . } / ;.,.5 } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ '.-.b 1 . . . . | Q @.| . . . _ 6 7.7.7.,.@.P P ,.7.` #.T {.Y Y +.+.+.+.+.#.#.X @.7.*...7.7.7.7.7.'.*.%.;.3 } . . . . . . . } | 3 < 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < 7.7._ . . . . 1 3 $.,.< . . . . [ 7.7.7.7.7.7.7.7.7.;...{.` H ......G >.~.$.@.` a 7.~...,.[ _ < 9 '.!. .-.9 2 . . . . . . . . } } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 7.3 1 . . . . : ^ 7.7 1 . . . . < a >.*.-.7.5 : _ 3 '.G $.a ^ ).,.,.7.7.7.7.7.5 < | ;.*.-.< . . 1 / '.!.!.a _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 5 7._ . . . . . 2 ^ 7./ . . . . . : 6 !. .-.7.< . . _ ,.>.` < } _ 7 ,.~.>.~.,.3 1 . 2 ).>.~.| . . . . / ;.!.-.< . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 7 [ } . . . . . } < [ 2 . . . . . 1 ^ >.*.7.3 1 . . 2 ^ $.5.2 . . < '.%.=.%.;._ . . } 3 ~.>.3 1 . . . . < ;.;.[ } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } < : . . . . . . . . . . . . . . . } 9 >.!.7.< . . . 8 9 '.0 } . . 2 6 >.=.!.- : . . . / -.>.^ : . . . . . / 7.6 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } 5 >.~.7 1 . . . . 3 7.[ . . . . | -.%.>.5 1 . . . : ).~.` _ . . . . . } | 7.[ } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [ {.;.< . . . . . < 7.[ . . . . : ,.!.~./ . . . . } [ ;.'.< . . . . . . } [ 7.: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | ,.6 1 . . . . . _ 7.< . . . . 1 b {.@._ . . . . . _ a a _ . . . . . . . 1 [ _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 7.3 . . . . . . 2 | 1 . . . . . | ,.).: . . . . . 8 2 2 } . . . . . . . . } } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [ 7.< . . . . . . . . . . . . . . 2 7.^ 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | a 2 . . . . . . . . . . . . . . } 5 7 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 < } . . . . . . . . . . . . . . . | ^ 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ [ } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "}; diff --git a/config/README b/config/README new file mode 100644 index 0000000..04922e5 --- /dev/null +++ b/config/README @@ -0,0 +1,10 @@ + +Xdm Sample Configuration + +This directory contains a collection of files which describe a sample +configuration of xdm. Choose between the sample Xservers.* files; copy the +appropriate one to "$(XDMDIR)/Xservers" along with the other +files in this directory. + +Only a few of the many configuration parameters which xdm can be tuned with +are set in this sample, read the xdm manual page for a complete description. diff --git a/config/TakeConsole b/config/TakeConsole new file mode 100644 index 0000000..2581b4c --- /dev/null +++ b/config/TakeConsole @@ -0,0 +1,11 @@ +#!/bin/sh +# Reassign ownership of the console to root, this should disallow +# assignment of console output to any random users's xterm +# $OpenBSD: TakeConsole,v 1.5 2015/01/25 21:51:20 jca Exp $ +# +chmod 622 /dev/console +chown root /dev/console +if [ -c /dev/drm0 ]; then + chown root /dev/drm0 +fi +/usr/X11R6/bin/sessreg -d -l $DISPLAY -u /var/run/utmp -x /etc/X11/xdm/Xservers $USER diff --git a/config/Xaccess b/config/Xaccess new file mode 100644 index 0000000..c843888 --- /dev/null +++ b/config/Xaccess @@ -0,0 +1,98 @@ +# +# Access control file for XDMCP connections +# +# To control Direct and Broadcast access: +# +# pattern +# +# To control Indirect queries: +# +# pattern list of hostnames and/or macros ... +# +# To use the chooser: +# +# pattern CHOOSER BROADCAST +# +# or +# +# pattern CHOOSER list of hostnames and/or macros ... +# +# To define macros: +# +# %name list of hosts ... +# +# To control which addresses xdm listens for requests on: +# +# LISTEN address [list of multicast groups ... ] +# +# The first form tells xdm which displays to respond to itself. +# The second form tells xdm to forward indirect queries from hosts matching +# the specified pattern to the indicated list of hosts. +# The third form tells xdm to handle indirect queries using the chooser; +# the chooser is directed to send its own queries out via the broadcast +# address and display the results on the terminal. +# The fourth form is similar to the third, except instead of using the +# broadcast address, it sends DirectQuerys to each of the hosts in the list +# The fifth form tells xdm which addresses to listen for incoming connections +# on. If present, xdm will only listen for connections on the specified +# interfaces and/or multicast groups. +# +# In all cases, xdm uses the first entry which matches the terminal; +# for IndirectQuery messages only entries with right hand sides can +# match, for Direct and Broadcast Query messages, only entries without +# right hand sides can match. +# + +#* #any host can get a login window + +# +# To hardwire a specific terminal to a specific host, you can +# leave the terminal sending indirect queries to this host, and +# use an entry of the form: +# + +#terminal-a host-a + + +# +# The nicest way to run the chooser is to just ask it to broadcast +# requests to the network - that way new hosts show up automatically. +# Sometimes, however, the chooser can't figure out how to broadcast, +# so this may not work in all environments. +# + +#* CHOOSER BROADCAST #any indirect host can get a chooser + +# +# If you'd prefer to configure the set of hosts each terminal sees, +# then just uncomment these lines (and comment the CHOOSER line above) +# and edit the %hostlist line as appropriate +# + +#%hostlist host-a host-b + +#* CHOOSER %hostlist # + +# +# If you have a machine with multiple network interfaces or IP addresses +# you can control which interfaces accept XDMCP packets by listing a LISTEN +# line for each interface you want to listen on. You can additionally list +# one or more multicast groups after each address to listen on those groups +# on that address. +# +# If no LISTEN is specified, the default is the same as "LISTEN *" - listen on +# all unicast interfaces, but not for multicast packets. If any LISTEN lines +# are specified, then only the listed interfaces will be listened on. +# +# IANA has assigned FF0X:0:0:0:0:0:0:12B as the permanently assigned +# multicast addresses for XDMCP, where X in the prefix may be replaced +# by any valid scope identifier, such as 1 for Node-Local, 2 for Link-Local, +# 5 for Site-Local, and so on. The default is equivalent to the example shown +# here using the Link-Local version to most closely match the old IPv4 subnet +# broadcast behavior. +# +# LISTEN * ff02:0:0:0:0:0:0:12b + +# This example shows listening for multicast on all scopes up to site-local +# +# LISTEN * ff01:0:0:0:0:0:0:12b ff02:0:0:0:0:0:0:12b ff03:0:0:0:0:0:0:12b ff04:0:0:0:0:0:0:12b ff05:0:0:0:0:0:0:12b diff --git a/config/Xreset.cpp b/config/Xreset.cpp new file mode 100644 index 0000000..321cd89 --- /dev/null +++ b/config/Xreset.cpp @@ -0,0 +1,5 @@ +XCOMM!/bin/sh +XCOMM Deregister a login. (Derived from TakeConsole as follows:) +XCOMM +BINDIR/sessreg -d -w WTMP_FILE -u UTMP_FILE \ + -x XDMCONFIGDIR/Xservers -l $DISPLAY -h "" $USER diff --git a/config/Xresources.cpp b/config/Xresources.cpp new file mode 100644 index 0000000..6a7bb74 --- /dev/null +++ b/config/Xresources.cpp @@ -0,0 +1,147 @@ +! $OpenBSD: Xresources.cpp,v 1.13 2015/03/16 20:41:21 matthieu Exp $ +! +! +! +! +! + + +#define BS \ /* cpp can be trickier than m4 */ +#define NLBS \n\ /* don't remove these comments */ +xlogin*login.translations: #override BS + Ctrl<Key>R: abort-display()NLBS + <Key>F1: set-session-argument(failsafe) finish-field()NLBS + <Key>Left: move-backward-character()NLBS + <Key>Right: move-forward-character()NLBS + <Key>Home: move-to-begining()NLBS + <Key>End: move-to-end()NLBS + Ctrl<Key>KP_Enter: set-session-argument(failsafe) finish-field()NLBS + <Key>KP_Enter: set-session-argument() finish-field()NLBS + Ctrl<Key>Return: set-session-argument(failsafe) finish-field()NLBS + <Key>Return: set-session-argument() finish-field() + +xlogin*greeting: CLIENTHOST +xlogin*namePrompt: \040\040\040\040\040\040\040Login: +xlogin*fail: Login incorrect or forbidden + +XHASHif WIDTH > 800 +xlogin*greetFont: -adobe-helvetica-bold-o-normal--24-240-75-75-p-138-iso8859-1 +xlogin*font: -adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1 +xlogin*promptFont: -adobe-helvetica-bold-r-normal--18-180-75-75-p-103-iso8859-1 +xlogin*failFont: -adobe-helvetica-bold-r-normal--18-180-75-75-p-103-iso8859-1 +xlogin*greetFace: DejaVu Sans Condensed-22:bold:italic:dpi=75 +xlogin*face: DejaVu Sans Condensed-16:dpi=75 +xlogin*promptFace: DejaVu Sans Condensed-16:bold:dpi=75 +xlogin*failFace: DejaVu Sans Condensed-16:bold:dpi=75 +XHASHelse +xlogin*greetFont: -adobe-helvetica-bold-o-normal--17-120-100-100-p-92-iso8859-1 +xlogin*font: -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1 +xlogin*promptFont: -adobe-helvetica-bold-r-normal--12-120-75-75-p-70-iso8859-1 +xlogin*failFont: -adobe-helvetica-bold-o-normal--14-140-75-75-p-82-iso8859-1 +xlogin*greetFace: DejaVu Sans Condensed-18:bold:italic:dpi=75 +xlogin*face: DejaVu Sans Condensed-12:dpi=75 +xlogin*promptFace: DejaVu Sans Condensed-12:bold:dpi=75 +xlogin*failFace: DejaVu Sans Condensed-12:bold:dpi=75 +XHASHendif + +XHASHif !(defined(bpp1) || defined(bpp4) || defined(bpp8) || defined(bpp15)) +XHASH if PLANES < 4 +XHASH ifndef bpp1 +XHASH define bpp1 +XHASH endif +XHASH else +XHASH if PLANES > 4 +XHASH if PLANES > 8 +XHASH ifndef bpp15 +XHASH define bpp15 +XHASH endif +XHASH else +XHASH ifndef bpp8 +XHASH define bpp8 +XHASH endif bpp8 +XHASH endif +XHASH else +XHASH ifndef bpp4 +XHASH define bpp4 +XHASH endif +XHASH endif +XHASH endif +XHASHendif //**/* If manual override */**// + +XHASHifndef bpp1 +xlogin*borderWidth: 1 +xlogin*frameWidth: 2 +xlogin*innerFramesWidth: 0 + +xlogin.Login.sepWidth: 0 + +! top/left border +xlogin*hiColor: #667788 + +! bottom/right border +xlogin*shdColor: #667788 + +! 'Welcome to..' text color +xlogin*greetColor: #fef886 +XHASHif defined(bpp4) || defined(bpp8) || defined(bpp15) +! flood fill +xlogin*background: #798a99 +xlogin*inpColor: #99aab9 +XHASHendif +xlogin*failColor: #aa0000 + +! 'Login:' and 'Password:' +*Foreground: #eeeeff + +! border/shadow +*Background: #000000 +XHASHelse +xlogin*borderWidth: 3 +xlogin*frameWidth: 5 +xlogin*innerFramesWidth: 1 +xlogin*shdColor: white +xlogin*hiColor: white +xlogin*greetColor: white +xlogin*background: black +xlogin*failColor: white +xlogin*promptColor: white +*Foreground: white +*Background: black +XHASHendif +XHASHifdef bpp1 +xlogin*logoFileName: BITMAPDIR/**//OpenBSD_1bpp.xpm +XHASHendif +XHASHifdef bpp4 +xlogin*logoFileName: BITMAPDIR/**//OpenBSD_4bpp.xpm +XHASHendif +XHASHifdef bpp8 +xlogin*logoFileName: BITMAPDIR/**//OpenBSD_8bpp.xpm +XHASHendif +XHASHifdef bpp15 +xlogin*logoFileName: BITMAPDIR/**//OpenBSD_15bpp.xpm +XHASHendif + +xlogin*useShape: true +xlogin*logoPadding: 10 + +! uncomment to disable logins +! xlogin.Login.allowRootLogin: false + +XConsole*background: black +XConsole*foreground: white +XConsole*borderWidth: 2 +XConsole*borderColor: grey +XConsole.text.geometry: 480x130 +XConsole.verbose: true +XConsole*iconic: true +XConsole*font: fixed + +Chooser*geometry: 640x480 +Chooser*allowShellResize: false +Chooser*viewport.forceBars: true + +Chooser*label.font: -adobe-helvetica-bold-o-normal--24-*-p-*-iso8859-1 +Chooser*label.label: XDMCP Host Menu from CLIENTHOST +Chooser*label.foreground: black +Chooser*list.font: lucidasanstypewriter-12 +Chooser*Command.font: -adobe-helvetica-medium-r-normal--18-*-p-*-iso8859-1 diff --git a/config/Xservers.fs b/config/Xservers.fs new file mode 100644 index 0000000..d478cb9 --- /dev/null +++ b/config/Xservers.fs @@ -0,0 +1,10 @@ +# +# Xservers file, fileserver prototype (any machine without a display) +# +# Put X terminals which don't support XDMCP in this file; you will +# want to leave those terminals on and connected to the network, else +# xdm will have a tougher time managing them. +# +# Each line should look like: +# +# XterminalName:0 foreign diff --git a/config/Xservers.ws.cpp b/config/Xservers.ws.cpp new file mode 100644 index 0000000..b6089ef --- /dev/null +++ b/config/Xservers.ws.cpp @@ -0,0 +1,12 @@ +XCOMM +XCOMM Xservers file, workstation prototype +XCOMM +XCOMM This file should contain an entry to start the server on the +XCOMM local display; if you have more than one display (not screen), +XCOMM you can add entries to the list (one per line). If you also +XCOMM have some X terminals connected which do not support XDMCP, +XCOMM you can add them here as well. Each X terminal line should +XCOMM look like: +XCOMM XTerminalName:0 foreign +XCOMM +:0 local BINDIR/X :0 DEFAULTVT diff --git a/config/Xsession.cpp b/config/Xsession.cpp new file mode 100644 index 0000000..4bac5e3 --- /dev/null +++ b/config/Xsession.cpp @@ -0,0 +1,111 @@ +XCOMM!SHELL_CMD +XCOMM +XCOMM $OpenBSD: Xsession.cpp,v 1.14 2015/10/17 08:25:11 matthieu Exp $ + +XCOMM redirect errors to a file in user's home directory if we can + +errfile="$HOME/.xsession-errors" +if ( umask 077 && cp /dev/null "$errfile" 2> /dev/null ) +then + exec > "$errfile" 2>&1 +else +#ifdef MKTEMP_COMMAND + mktemp=MKTEMP_COMMAND + for errfile in "${TMPDIR-/tmp}/xses-$USER" "/tmp/xses-$USER" + do + if ef="$( umask 077 && $mktemp "$errfile.XXXXXX" 2> /dev/null)" + then + exec > "$ef" 2>&1 + mv "$ef" "$errfile" 2> /dev/null + break + fi + done +#else +XCOMM Since this system doesn't have a mktemp command to allow secure +XCOMM creation of files in shared directories, no fallback error log +XCOMM is being used. See https://bugs.freedesktop.org/show_bug.cgi?id=5898 +XCOMM +XCOMM for errfile in "${TMPDIR-/tmp}/xses-$USER" "/tmp/xses-$USER" +XCOMM do +XCOMM if ( umask 077 && cp /dev/null "$errfile" 2> /dev/null ) +XCOMM then +XCOMM exec > "$errfile" 2>&1 +XCOMM break +XCOMM fi +XCOMM done + + exec > /dev/null 2>&1 + +#endif +fi + +XCOMM if we have private ssh key(s), start ssh-agent and add the key(s) +id1=$HOME/.ssh/identity +id2=$HOME/.ssh/id_dsa +id3=$HOME/.ssh/id_rsa +id4=$HOME/.ssh/id_ecdsa +id5=$HOME/.ssh/id_ed25519 +if [ -z "$SSH_AGENT_PID" ]; +then + if [ -x /usr/bin/ssh-agent ] && [ -f $id1 -o -f $id2 -o -f $id3 -o -f $id4 -o -f $id5 ]; + then + eval `ssh-agent -s` + ssh-add < /dev/null + fi +fi + +do_exit() { + if [ "$SSH_AGENT_PID" ]; then + ssh-add -D < /dev/null + eval `ssh-agent -s -k` + fi + exit +} + +case $# in +1) + case $1 in + failsafe) + BINDIR/xterm -geometry 80x24-0-0 + do_exit + ;; + esac +esac + +XCOMM The startup script is not intended to have arguments. + +startup=$HOME/.xsession +resources=$HOME/.Xresources + +if [ -s "$startup" ]; then + if [ -x "$startup" ]; then + "$startup" + else + /bin/sh "$startup" + fi +else + if [ -f "$resources" ]; then + BINDIR/xrdb -load "$resources" + fi +#if defined(__SCO__) || defined(__UNIXWARE__) + [ -r /etc/default/xdesktops ] && { + . /etc/default/xdesktops + } + + [ -r /etc/default/xdm ] && { + . /etc/default/xdm + } + + XCOMM Allow the user to over-ride the system default desktop + [ -r $HOME/.xdmdesktop ] && { + . $HOME/.xdmdesktop + } + + [ -n "$XDESKTOP" ] && { + exec `eval $XDESKTOP` + } +#endif + BINDIR/xterm & + BINDIR/fvwm +fi +do_exit diff --git a/config/Xsetup_0 b/config/Xsetup_0 new file mode 100644 index 0000000..a24818c --- /dev/null +++ b/config/Xsetup_0 @@ -0,0 +1,8 @@ +#!/bin/sh +# $OpenBSD: Xsetup_0,v 1.3 2010/03/28 09:33:02 matthieu Exp $ +if [ "$DISPLAY" = ":0" -o "$DISPLAY" = ":0.0" ] +then + xconsole -geometry 480x130-0-0 -daemon -notify -verbose -fn fixed -exitOnFail +fi + +#sxpm OpenBSD.xpm & diff --git a/config/Xstartup.cpp b/config/Xstartup.cpp new file mode 100644 index 0000000..1bc8dcc --- /dev/null +++ b/config/Xstartup.cpp @@ -0,0 +1,10 @@ +XCOMM!/bin/sh +XCOMM +XCOMM $OpenBSD: Xstartup.cpp,v 1.5 2011/11/15 20:53:45 matthieu Exp $ +XCOMM +if [ -f /etc/nologin ]; then + /usr/X11R6/bin/xmessage -file /etc/nologin -timeout 30 -center + exit 1 +fi +exec BINDIR/sessreg -a -w WTMP_FILE -u UTMP_FILE \ + -x XDMCONFIGDIR/Xservers -l $DISPLAY -h "" $USER diff --git a/config/Xwilling b/config/Xwilling new file mode 100644 index 0000000..7d5d0ad --- /dev/null +++ b/config/Xwilling @@ -0,0 +1,11 @@ +#!/bin/sh +# + +# The output of this script is displayed in the chooser window. +# (instead of "Willing to manage") + +load="`uptime|sed -e 's/^.*load[^0-9]*//'`" +nrusers="`who|cut -c 1-8|sort -u|wc -l|sed 's/^[ ]*//'`" +s=""; [ "$nrusers" != 1 ] && s=s + +echo "${nrusers} user${s}, load: ${load}" diff --git a/config/xdm-config.cpp b/config/xdm-config.cpp new file mode 100644 index 0000000..24702a3 --- /dev/null +++ b/config/xdm-config.cpp @@ -0,0 +1,44 @@ +! $OpenBSD: xdm-config.cpp,v 1.5 2012/10/07 15:55:28 matthieu Exp $ +! +! +! +! +! +#ifndef XDMCONFIGDIR +#define XDMCONFIGDIR XDMDIR +#endif +#ifndef XDMSCRIPTDIR +#define XDMSCRIPTDIR XDMDIR +#endif +DisplayManager.authDir: XDMXAUTHDIR +DisplayManager.errorLogFile: XDMLOGDIR/xdm.log +DisplayManager.pidFile: XDMPIDDIR/xdm.pid +DisplayManager.keyFile: XDMCONFIGDIR/xdm-keys +DisplayManager.servers: XDMCONFIGDIR/Xservers +DisplayManager.accessFile: XDMCONFIGDIR/Xaccess +DisplayManager*resources: XDMCONFIGDIR/Xresources +DisplayManager.willing: SU nobody -s /bin/sh XDMSCRIPTDIR/Xwilling +! All displays should use authorization, but we cannot be sure +! X terminals may not be configured that way, so they will require +! individual resource settings. +DisplayManager*authorize: true +! +DisplayManager*chooser: CHOOSERPATH +DisplayManager*startup: XDMSCRIPTDIR/Xstartup +DisplayManager*session: XDMSCRIPTDIR/Xsession +DisplayManager*reset: XDMSCRIPTDIR/Xreset +DisplayManager*authComplain: true +! The following three resources set up display :0 as the console. +DisplayManager._0.setup: XDMSCRIPTDIR/Xsetup_0 +DisplayManager._0.startup: XDMSCRIPTDIR/GiveConsole +DisplayManager._0.reset: XDMSCRIPTDIR/TakeConsole +#if HAS_DES_AUTH == YES +DisplayManager.*.authName: MIT-MAGIC-COOKIE-1 +#endif +#ifdef XPM +DisplayManager*loginmoveInterval: 10 +#endif /* XPM */ +! +! SECURITY: do not listen for XDMCP or Chooser requests +! Comment out this line if you want to manage X terminals with xdm +DisplayManager.requestPort: 0 diff --git a/config/xorg-bw.xpm b/config/xorg-bw.xpm new file mode 100644 index 0000000..1353918 --- /dev/null +++ b/config/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/config/xorg.xpm b/config/xorg.xpm new file mode 100644 index 0000000..d83d5c6 --- /dev/null +++ b/config/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/configure.ac b/configure.ac new file mode 100644 index 0000000..0ca31a4 --- /dev/null +++ b/configure.ac @@ -0,0 +1,446 @@ +dnl Copyright 2005 Red Hat, Inc. +dnl +dnl Permission to use, copy, modify, distribute, and sell this software and its +dnl documentation for any purpose is hereby granted without fee, provided that +dnl the above copyright notice appear in all copies and that both that +dnl copyright notice and this permission notice appear in supporting +dnl documentation, and that the name of Red Hat not be used in +dnl advertising or publicity pertaining to distribution of the software without +dnl specific, written prior permission. Red Hat makes no +dnl representations about the suitability of this software for any purpose. It +dnl is provided "as is" without express or implied warranty. +dnl +dnl RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +dnl INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +dnl EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR +dnl CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +dnl DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +dnl TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +dnl PERFORMANCE OF THIS SOFTWARE. +dnl +dnl Process this file with autoconf to create configure. + +# Initialize Autoconf +AC_PREREQ([2.60]) +AC_INIT([opendm], [0.1], + [https://xenocara.org], [opendm]) +AC_USE_SYSTEM_EXTENSIONS +AC_CONFIG_SRCDIR([Makefile.am]) +AC_CONFIG_MACRO_DIR([m4]) +AC_CONFIG_HEADERS(config.h) + +# Initialize Automake +AM_INIT_AUTOMAKE([foreign dist-bzip2]) +AM_MAINTAINER_MODE + +# Initialize libtool +AC_DISABLE_STATIC +AC_PROG_LIBTOOL + +# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS +m4_ifndef([XORG_MACROS_VERSION], + [m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])]) +XORG_MACROS_VERSION(1.8) +XORG_DEFAULT_OPTIONS +XORG_PROG_RAWCPP +XORG_WITH_LINT + +# Checks for programs. +# Check for mktemp to prevent security issue noted in Xorg bug #5898 +# See https://bugs.freedesktop.org/show_bug.cgi?id=5898 for details. +AC_PATH_PROG(MKTEMP_COMMAND, mktemp) +AM_CONDITIONAL(HAVE_MKTEMP_COMMAND, test x$MKTEMP_COMMAND != x) + +# Checks for typedefs, structures, and compiler characteristics. +AC_TYPE_SIGNAL + +# Check for system library functions +# Required system libraries have been searched for and are listed in $LIBS +AC_FUNC_FORK +AC_CHECK_FUNCS([sigaction setproctitle setusercontext \ + mkstemp getifaddrs getspnam arc4random]) + +XDM_CFLAGS="$XDM_CFLAGS" +GREETER_CFLAGS="$GREETER_CFLAGS" +CHOOSER_CFLAGS="$CHOOSER_CFLAGS" + +# Find needed libraries for TCP sockets (pre-pended in $LIBS) +XTRANS_CONNECTION_FLAGS + + + + +# FIXME: Find better test for which OS'es use su -m - for now, just try to +# mirror the Imakefile setting of: +# if defined(OpenBSDArchitecture) || defined(NetBSDArchitecture) || defined(FreeBSDArchitecture) || defined(DarwinArchitecture) + + +case $host_os in + linux*|gnu*|*-gnu) + SU="su" + ;; + darwin*) + SU="su -m" + ;; + *bsd*|dragonfly*) + SU="su -m" + ;; + solaris*|sysv4*) + SU="su" + ;; + *) + SU="su" + ;; +esac +AC_SUBST(SU) + +# +# Privsep +# +AC_ARG_ENABLE(privsep, + AC_HELP_STRING([--enable-privsep], + [Build support for X server privilege separation (default is NO)]), + [ENABLE_PRIVSEP="$enableval"], [ENABLE_PRIVSEP="no"]) +if test x$ENABLE_PRIVSEP = xyes ; then + AC_DEFINE(X_PRIVSEP, 1, [Use X server privilege separation]) +fi + +# +# BSD auth +AC_ARG_ENABLE(bsdauth, + AC_HELP_STRING([--enable-bsdauth], + [Build support for BSD authentification (default is NO)]), + [ENABLE_BSDAUTH="$enableval"], [ENABLE_BSDAUTH="no"]) +if test x$ENABLE_BSDAUTH = xyes ; then + AC_DEFINE(USE_BSDAUTH, 1, [Use BSD authentification]) +fi + +# Figure out where everything goes in the filesystem + +AC_ARG_WITH(xdmlibdir, + AS_HELP_STRING([--with-xdmlibdir=<pathname>], + [specify directory for xdm scripts and modules (default=${libdir}/X11/xdm)]), + [XDMLIBDIR="$withval"], [XDMLIBDIR="${libdir}/X11/xdm"]) +AC_SUBST(XDMLIBDIR) + +AC_ARG_WITH(xdmconfigdir, + AS_HELP_STRING([--with-xdmconfigdir=<pathname>], + [specify directory for xdm config files (default is same as xdmlibdir)]), + [XDMCONFIGDIR="$withval"], [XDMCONFIGDIR="${XDMLIBDIR}"]) +AC_SUBST(XDMCONFIGDIR) + +AC_ARG_WITH(xdmscriptdir, + AS_HELP_STRING([--with-xdmscriptdir=<pathname>], + [specify directory for xdm scripts (default is same as xdmlibdir)]), + [XDMSCRIPTDIR="$withval"], [XDMSCRIPTDIR="${XDMLIBDIR}"]) +AC_SUBST(XDMSCRIPTDIR) + +AC_ARG_WITH(logdir, + AS_HELP_STRING([--with-logdir=<pathname>], + [specify directory for xdm log files (default=/var/log)]), + [XDMLOGDIR="$withval"], [XDMLOGDIR="/var/log"]) +AC_SUBST(XDMLOGDIR) + +AC_ARG_WITH(piddir, + AS_HELP_STRING([--with-piddir=<pathname>], + [specify directory for xdm pid files (default=/var/run)]), + [XDMPIDDIR="$withval"], [XDMPIDDIR="/var/run"]) +AC_SUBST(XDMPIDDIR) + +AC_ARG_WITH(default-vt, + AS_HELP_STRING([--with-default-vt=<vtname>], + [specify default vt to start xdm on (default=none)]), + [DEFAULTVT="$withval"], [[DEFAULTVT=""]]) +AC_SUBST(DEFAULTVT) + +AC_ARG_WITH(config-type, + AS_HELP_STRING([--with-config-type={ws|fs}], + [default config file type to use - workstation (ws) or fileserver (fs) (default=ws)]), + [SERVERSTYPE="$withval"], [SERVERSTYPE="ws"]) +AC_SUBST(SERVERSTYPE) + +# Ideally we'd just pull out UTMP_FILE & WTMP_FILE from <utmp.h> +# but that's not easy to do in autoconf +AC_ARG_WITH(utmp_file, + AS_HELP_STRING([--with-utmp-file=<pathname>], + [specify file to pass to sessreg -u for current logins]), + [UTMP_FILE="$withval"]) +if test "x$UTMP_FILE" = "xyes" ; then + AC_MSG_ERROR([path was not specified to --with-utmp-file]) +fi +if test "x$UTMP_FILE" = "x" ; then + for UTMP_FILE in /var/adm/utmpx /var/run/utmp /var/log/utmp /var/adm/utmp /usr/adm/utmp /etc/utmp ; do + AC_CHECK_FILE([$UTMP_FILE], [break], [UTMP_FILE=""]) + done + if test "x$UTMP_FILE" = "x" ; then + UTMP_FILE="/var/run/utmp" + fi +fi +AC_MSG_CHECKING([for path to file listing current logins for sessreg]) +AC_MSG_RESULT([$UTMP_FILE]) +AC_SUBST(UTMP_FILE) + +AC_ARG_WITH(wtmp_file, + AS_HELP_STRING([--with-wtmp-file=<pathname>], + [specify file to pass to sessreg -w for login history]), + [WTMP_FILE="$withval"]) +if test "x$WTMP_FILE" = "xyes" ; then + AC_MSG_ERROR([path was not specified to --with-wtmp-file]) +fi +if test "x$WTMP_FILE" = "x" ; then + for WTMP_FILE in /var/adm/wtmpx /var/log/wtmp /var/adm/wtmp /usr/adm/wtmp /etc/wtmp ; do + AC_CHECK_FILE([$WTMP_FILE], [break], [WTMP_FILE=""]) + done + if test "x$WTMP_FILE" = "x" ; then + WTMP_FILE="/var/log/wtmp" + fi +fi +AC_MSG_CHECKING([for path to file listing login history for sessreg]) +AC_MSG_RESULT([$WTMP_FILE]) +AC_SUBST(WTMP_FILE) + +case $host_os in + *sco*|*solaris*) + SHELL_CMD="/bin/ksh" ;; + *) SHELL_CMD="/bin/sh" ;; +esac +AC_SUBST(SHELL_CMD) + +# Checks for pkg-config packages + +PKG_CHECK_MODULES(XDM, xmu x11 xau) + +PKG_CHECK_EXISTS(xinerama, [ + AC_DEFINE([USE_XINERAMA], 1, + [Define to 1 to use XINERAMA in greeter & chooser]) + PKG_CHECK_MODULES(XINERAMA, xinerama) + CHOOSER_CFLAGS="$CHOOSER_CFLAGS $XINERAMA_CFLAGS" + CHOOSER_LIBS="$CHOOSER_LIBS $XINERAMA_LIBS" + GREETER_CFLAGS="$GREETER_CFLAGS $XINERAMA_CFLAGS" + GREETER_LIBS="$GREETER_LIBS $XINERAMA_LIBS" +]) + +# Xft text drawing for the greeter screen +AC_ARG_WITH(xft, + AS_HELP_STRING([--with-xft], + [Use Xft to draw text (default is YES if installed)]), + [USE_XFT="$withval"], + PKG_CHECK_EXISTS(xft xrender, [USE_XFT="yes"], [USE_XFT="no"])) + +if test "x$USE_XFT" = "xyes" ; then + PKG_CHECK_MODULES(XFT, xft xrender) + GREETER_CFLAGS="$GREETER_CFLAGS $XFT_CFLAGS" + GREETER_LIBS="$GREETER_LIBS $XFT_LIBS" + AC_DEFINE([USE_XFT], 1, + [Define to 1 to use Xft for text on greeter screen]) +fi + +# XPM logos for the greeter screen +AC_ARG_ENABLE(xpm-logos, + AS_HELP_STRING([--enable-xpm-logos], + [Display xpm logos in greeter (default is YES)]), + [USE_XPM="$enableval"], + PKG_CHECK_EXISTS(xpm, [USE_XPM="yes"], [USE_XPM="no"])) +if test "x$USE_XPM" = "xyes" ; then + PKG_CHECK_MODULES(XPM, xpm) + GREETER_CFLAGS="$GREETER_CFLAGS $XPM_CFLAGS" + GREETER_LIBS="$GREETER_LIBS $XPM_LIBS" + AC_DEFINE([XPM], 1, + [Define to 1 to display XPM logos on greeter screen]) +fi +AM_CONDITIONAL(USE_XPM, test "x$USE_XPM" = "xyes") + +AC_ARG_WITH(color-pixmap, + AS_HELP_STRING([--with-color-pixmap=<filename>], + [specify xpm file to use as color logo (default=xorg.xpm)]), + [XDM_PIXMAP="$withval"], [XDM_PIXMAP="xorg.xpm"]) +AC_ARG_WITH(bw-pixmap, + AS_HELP_STRING([--with-bw-pixmap=<filename>], + [specify xpm file to use as black-and-white logo (default=xorg-bw.xpm)]), + [XDM_BWPIXMAP="$withval"], [XDM_BWPIXMAP="xorg-bw.xpm"]) +AC_ARG_WITH(pixmapdir, + AS_HELP_STRING([--with-pixmapdir=<pathname>], + [specify directory for xpm files (default=xdmlibdir/pixmaps)]), + [XDM_PIXMAPDIR="$withval"], + [XDM_PIXMAPDIR='${XDMLIBDIR}/pixmaps']) + +AC_SUBST(XDM_PIXMAP) +AC_SUBST(XDM_BWPIXMAP) +AC_SUBST(XDM_PIXMAPDIR) + +# Packages used by multiple programs + +PKG_CHECK_MODULES(XDM_TOOLKIT, xaw7) +PKG_CHECK_MODULES(DMCP, xdmcp) +PKG_CHECK_MODULES(XLIB, x11) +PKG_CHECK_MODULES(AUTH, xau) + +# +# Greeter +# +STATIC_GREETER_CFLAGS="-DGREET_USER_STATIC" + + +PKG_CHECK_MODULES(XDMGREET, xt >= 1.0 x11 xext) + +XDMGREET_CFLAGS="$XDMGREET_CFLAGS $XDM_TOOLKIT_CFLAGS $DMCP_CFLAGS $XLIB_CFLAGS $GREETER_CFLAGS $AUTH_CFLAGS" +XDMGREET_LIBS="$XDMGREET_LIBS $XDM_TOOLKIT_LIBS $DMCP_LIBS $GREETER_LIBS" + +# +# XDM +# + +XDM_CFLAGS="$XDM_CFLAGS $DMCP_CFLAGS $XLIB_CFLAGS $AUTH_CFLAGS $STATIC_GREETER_CFLAGS" +XDM_LIBS="$XDM_LIBS $DMCP_LIBS" + +AC_CHECK_LIB(Xdmcp, XdmcpWrap, [xdmauth="yes"], [xdmauth="no"], [$DMCP_LIBS]) + +AC_ARG_ENABLE(xdm-auth, + AS_HELP_STRING([--enable-xdm-auth], + [Support XDM-AUTHENTICATION-1 and XDM-AUTHORIZATION-1 (default: auto)]), + [xdmauth_enable="$enableval"], [xdmauth_enable="auto"]) +if test "x$xdmauth_enable" = "xyes" -a "x$xdmauth" = "xno" ; then + AC_MSG_ERROR([XDM-AUTH support requested, but XdmcpWrap not found in libXdmcp.]) +fi + +AM_CONDITIONAL(HAS_XDM_AUTH, test x$xdmauth = xyes -a x$xdmauth_enable != xno) + +AC_SUBST(XDM_CFLAGS) +AC_SUBST(XDM_LIBS) + + +# Defaults for X session - should probably be configure --with-* flags +# Currently just trying to mirror what defaults were set in Imake + +# -DDEF_SERVER_LINE=":0 local $(DEF_SERVER) :0" +if test -z "$DEF_SERVER" ; then + DEF_SERVER="${bindir}/X" +fi +if test -z "$DEF_SERVER_LINE" ; then + DEF_SERVER_LINE=":0 local ${DEF_SERVER} :0" +fi +AX_DEFINE_DIR(DEF_SERVER_LINE, DEF_SERVER_LINE, + [Define to default Xserver file entry for local X server]) + +# -DXRDB_PROGRAM="$(BINDIR)/xrdb" +AC_ARG_WITH(xrdb, AS_HELP_STRING([--with-xrdb=path], + [Use path for xrdb (default: bindir/xrdb)]), + [XRDB=$withval], [XRDB=${bindir}/xrdb]) +AX_DEFINE_DIR(XRDB_PROGRAM, XRDB, + [Define to pathname for xrdb program]) + +# -DDEF_SESSION="$(BINDIR)/xterm -ls" +AC_ARG_WITH(default-session, AS_HELP_STRING([--with-default-session=command], + [Use command for default session (default: bindir/xterm -ls)]), + [DEF_SESSION=$withval], [DEF_SESSION="${bindir}/xterm -ls"]) +AX_DEFINE_DIR(DEF_SESSION, DEF_SESSION, + [Define to default command to start X session]) + +# -DDEF_USER_PATH="$(DEF_USER_PATH)" +# Default values taken from DefaultUserPath setting in the +# old Imake *.cf files for each platform +if test -z "$DEF_USER_PATH" ; then + case $host_os in + dragonfly*) + DEF_USER_PATH="/bin:/usr/bin:/sbin:/usr/sbin:${bindir}:/usr/local/bin" + ;; + freebsd*) + DEF_USER_PATH="/bin:/usr/bin:/sbin:/usr/sbin:${bindir}:/usr/gnu/bin:/usr/local/bin" + ;; + netbsd*) + DEF_USER_PATH="/bin:/usr/bin:/usr/pkg/bin:/usr/local/bin:${bindir}" + ;; + openbsd*) + DEF_USER_PATH="/bin:/usr/bin:/sbin:/usr/sbin:${bindir}:/usr/local/bin:/usr/local/sbin" + ;; + bsdi*) + DEF_USER_PATH="/bin:/usr/bin:/usr/local/bin:${bindir}" + ;; + solaris*) + DEF_USER_PATH="/usr/bin:${bindir}" + ;; + *) + DEF_USER_PATH="/bin:/usr/bin:${bindir}:/usr/ucb" + ;; + esac +fi +AX_DEFINE_DIR(DEF_USER_PATH, DEF_USER_PATH, + [Define to default PATH environment variable for user sessions]) + +# -DDEF_SYSTEM_PATH="$(DEF_SYSTEM_PATH)" +# Default values taken from DefaultSystemPath setting in the +# old Imake *.cf files for each platform +if test -z "$DEF_SYSTEM_PATH" ; then + case $host_os in + freebsd*|dragonfly*) + DEF_SYSTEM_PATH="/bin:/usr/bin:/sbin:/usr/sbin:${bindir}" + ;; + netbsd*|openbsd*|bsdi*) + DEF_SYSTEM_PATH="/sbin:/usr/sbin:/bin:/usr/bin:${bindir}" + ;; + solaris*) + DEF_SYSTEM_PATH="/sbin:/usr/sbin:/usr/bin:${bindir}" + ;; + *) + DEF_SYSTEM_PATH="/etc:/bin:/usr/bin:${bindir}:/usr/ucb" + ;; + esac +fi +AX_DEFINE_DIR(DEF_SYSTEM_PATH, DEF_SYSTEM_PATH, + [Define to default PATH environment variable for system commands]) + +# -DDEF_SYSTEM_SHELL="$(BOURNE_SHELL)" +if test -z "$BOURNE_SHELL" ; then + BOURNE_SHELL=/bin/sh +fi +AX_DEFINE_DIR(DEF_SYSTEM_SHELL, BOURNE_SHELL, + [Define to default shell]) + +# -DDEF_FAILSAFE_CLIENT="$(BINDIR)/xterm" + +AX_DEFINE_DIR(DEF_FAILSAFE_CLIENT, bindir/xterm, + [Define to default command to start failsafe X session]) + +# -DDEF_XDM_CONFIG="$(XDMDIR)/xdm-config" + +AX_DEFINE_DIR(DEF_XDM_CONFIG, XDMCONFIGDIR/xdm-config, + [Define to pathname of default xdm-config file]) + +# -DDEF_CHOOSER="$(CHOOSERPATH)" + +AX_DEFINE_DIR(DEF_CHOOSER, XDMLIBDIR/chooser, + [Define to pathname of where chooser binary is installed]) + +# -DDEF_AUTH_DIR="$(XDMDIR)" + +AC_ARG_WITH(authdir, + AS_HELP_STRING([--with-authdir=<pathname>], + [specify directory for X auth files (default=/var/lib/xdm)]), + [XDMXAUTHDIR="$withval"], [XDMXAUTHDIR="/var/lib/xdm"]) +AC_SUBST(XDMXAUTHDIR) + +AX_DEFINE_DIR(DEF_AUTH_DIR, XDMXAUTHDIR, + [Define to pathname where authentication cookie files should be stored]) + +# -DDEF_GREETER_LIB="$(XDMDIR)/libXdmGreet.so" + +AX_DEFINE_DIR(DEF_GREETER_LIB, XDMLIBDIR/libXdmGreet.so, + [Define to pathname where greeter shared object is installed (if used)]) + +PKG_CHECK_MODULES(APPDEFS, xt) +xt_appdefaultdir=`$PKG_CONFIG --variable=appdefaultdir xt` +AC_ARG_WITH(appdefaultdir, + AS_HELP_STRING([--with-appdefaultdir=<pathname>], + [specify directory for app-defaults files (default is autodetected)]), + [appdefaultdir="$withval"], [appdefaultdir="${xt_appdefaultdir}"]) +AC_SUBST(appdefaultdir) + +AC_SUBST(MKTEMP_COMMAND) + +AC_CONFIG_FILES([Makefile + config/Makefile + greeter/Makefile + include/Makefile + man/Makefile + xdm/Makefile]) +AC_OUTPUT diff --git a/cpprules.in b/cpprules.in new file mode 100644 index 0000000..c6daca3 --- /dev/null +++ b/cpprules.in @@ -0,0 +1,26 @@ +# -*- Makefile -*- +# Rules for generating files using the C pre-processor +# (Replaces CppFileTarget from Imake) + +SED = sed + +SUFFIXES = .cpp + +WCHAR32_FLAGS = -DWCHAR32=@WCHAR32@ + +# Translate XCOMM into pound sign with sed, rather than passing -DXCOMM=XCOMM +# to cpp, because that trick does not work on all ANSI C preprocessors. +# Delete line numbers from the cpp output (-P is not portable, I guess). +# Allow XCOMM to be preceded by whitespace and provide a means of generating +# output lines with trailing backslashes. +# Allow XHASH to always be substituted, even in cases where XCOMM isn't. + +CPP_SED_MAGIC = $(SED) -e '/^\# *[0-9][0-9]* *.*$$/d' \ + -e '/^\#line *[0-9][0-9]* *.*$$/d' \ + -e '/^[ ]*XCOMM$$/s/XCOMM/\#/' \ + -e '/^[ ]*XCOMM[^a-zA-Z0-9_]/s/XCOMM/\#/' \ + -e '/^[ ]*XHASH/s/XHASH/\#/' \ + -e '/\@\@$$/s/\@\@$$/\\/' + +.cpp: + $(AM_V_GEN)$(RAWCPP) $(RAWCPPFLAGS) $(CPP_FILES_FLAGS) < $< | $(CPP_SED_MAGIC) > $@ diff --git a/greeter/Login.c b/greeter/Login.c new file mode 100644 index 0000000..6a99050 --- /dev/null +++ b/greeter/Login.c @@ -0,0 +1,2099 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ +/* + * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * + * 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. + */ + + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * Login.c + */ + +#include <X11/IntrinsicP.h> +#include <X11/StringDefs.h> +#include <X11/keysym.h> +#include <X11/DECkeysym.h> +#include <X11/Xfuncs.h> + +#include <stdio.h> +#include <ctype.h> +#include <time.h> +#include <string.h> + +#include "dm.h" +#include "dm_error.h" +#include "greet.h" +#include "LoginP.h" + +#ifdef XPM +# include <sys/stat.h> +# include <unistd.h> +# include <X11/Xlib.h> +# include <X11/xpm.h> +# include <X11/extensions/shape.h> +#endif /* XPM */ + +#include <X11/cursorfont.h> + +#ifdef USE_XINERAMA +# include <X11/extensions/Xinerama.h> +#endif + +#ifdef USE_XFT +# include <X11/extensions/Xrender.h> +#endif + +#ifndef DEBUG +# define XDM_ASSERT(a) /* do nothing */ +#else +# if defined(__STDC__) && __STDC_VERSION__ - 0 >= 199901L +# define XDM_ASSERT(a) if (!(a)) { \ + Debug("Assertion failed in %s() at file %s line %d\n", \ + __func__, __FILE__, __LINE__); } +# else +# define XDM_ASSERT(a) if (!(a)) { \ + Debug("Assertion failed at file %s line %d\n", __FILE__, __LINE__); } +# endif +#endif + +static void RedrawFail (LoginWidget w); +static void ResetLogin (LoginWidget w); +static void failTimeout (XtPointer client_data, XtIntervalId * id); +static void EraseCursor (LoginWidget w); +static void XorCursor (LoginWidget w); + +#define offset(field) XtOffsetOf(LoginRec, login.field) +#define goffset(field) XtOffsetOf(WidgetRec, core.field) + + +static XtResource resources[] = { + {XtNwidth, XtCWidth, XtRDimension, sizeof(Dimension), + goffset(width), XtRImmediate, (XtPointer) 0}, + {XtNheight, XtCHeight, XtRDimension, sizeof(Dimension), + goffset(height), XtRImmediate, (XtPointer) 0}, + {XtNx, XtCX, XtRPosition, sizeof (Position), + goffset(x), XtRImmediate, (XtPointer) -1}, + {XtNy, XtCY, XtRPosition, sizeof (Position), + goffset(y), XtRImmediate, (XtPointer) -1}, +#ifndef USE_XFT + {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), + offset(textpixel), XtRString, XtDefaultForeground}, + {XtNpromptColor, XtCForeground, XtRPixel, sizeof(Pixel), + offset(promptpixel), XtRString, XtDefaultForeground}, + {XtNgreetColor, XtCForeground, XtRPixel, sizeof(Pixel), + offset(greetpixel), XtRString, XtDefaultForeground}, + {XtNfailColor, XtCForeground, XtRPixel, sizeof (Pixel), + offset(failpixel), XtRString, XtDefaultForeground}, +#endif + +#ifdef DANCING +/* added by Caolan McNamara */ + {XtNlastEventTime, XtCLastEventTime, XtRInt , sizeof (int), + offset(lastEventTime), XtRImmediate, (XtPointer)0}, +/* end (caolan) */ +#endif /* DANCING */ + +#ifdef XPM +/* added by Ivan Griffin (ivan.griffin@ul.ie) */ + {XtNlogoFileName, XtCLogoFileName, XtRString, sizeof(char*), + offset(logoFileName), XtRImmediate, (XtPointer)0}, + {XtNuseShape, XtCUseShape, XtRBoolean, sizeof(Boolean), + offset(useShape), XtRImmediate, (XtPointer) True}, + {XtNlogoPadding, XtCLogoPadding, XtRInt, sizeof(int), + offset(logoPadding), XtRImmediate, (XtPointer) 5}, +/* end (ivan) */ +#endif /* XPM */ + +/* added by Amit Margalit */ + {XtNhiColor, XtCForeground, XtRPixel, sizeof (Pixel), + offset(hipixel), XtRString, XtDefaultForeground}, + {XtNshdColor, XtCForeground, XtRPixel, sizeof (Pixel), + offset(shdpixel), XtRString, XtDefaultForeground}, + {XtNinpColor, XtCForeground, XtRPixel, sizeof (Pixel), + offset(inppixel), XtRString, XtDefaultBackground}, + {XtNframeWidth, XtCFrameWidth, XtRInt, sizeof(int), + offset(outframewidth), XtRImmediate, (XtPointer) 1}, + {XtNinnerFramesWidth, XtCFrameWidth, XtRInt, sizeof(int), + offset(inframeswidth), XtRImmediate, (XtPointer) 1}, + {XtNsepWidth, XtCFrameWidth, XtRInt, sizeof(int), + offset(sepwidth), XtRImmediate, (XtPointer) 1}, +/* end (amit) */ + +#ifndef USE_XFT + {XtNfont, XtCFont, XtRFontStruct, sizeof (XFontStruct *), + offset (textFont), XtRString, "*-new century schoolbook-medium-r-normal-*-180-*"}, + {XtNpromptFont, XtCFont, XtRFontStruct, sizeof (XFontStruct *), + offset (promptFont), XtRString, "*-new century schoolbook-bold-r-normal-*-180-*"}, + {XtNgreetFont, XtCFont, XtRFontStruct, sizeof (XFontStruct *), + offset (greetFont), XtRString, "*-new century schoolbook-bold-i-normal-*-240-*"}, + {XtNfailFont, XtCFont, XtRFontStruct, sizeof (XFontStruct *), + offset (failFont), XtRString, "*-new century schoolbook-bold-r-normal-*-180-*"}, +#else /* USE_XFT */ + {XtNface, XtCFace, XtRXftFont, sizeof (XftFont *), + offset (textFace), XtRString, "Serif-18"}, + {XtNpromptFace, XtCFace, XtRXftFont, sizeof (XftFont *), + offset (promptFace), XtRString, "Serif-18:bold"}, + {XtNgreetFace, XtCFace, XtRXftFont, sizeof (XftFont *), + offset (greetFace), XtRString, "Serif-24:italic"}, + {XtNfailFace, XtCFace, XtRXftFont, sizeof (XftFont *), + offset (failFace), XtRString, "Serif-18:bold"}, + {XtNforeground, XtCForeground, XtRXftColor, sizeof(XftColor), + offset(textcolor), XtRString, XtDefaultForeground}, + {XtNpromptColor, XtCForeground, XtRXftColor, sizeof(XftColor), + offset(promptcolor), XtRString, XtDefaultForeground}, + {XtNgreetColor, XtCForeground, XtRXftColor, sizeof(XftColor), + offset(greetcolor), XtRString, XtDefaultForeground}, + {XtNfailColor, XtCForeground, XtRXftColor, sizeof (XftColor), + offset(failcolor), XtRString, XtDefaultForeground}, +#endif + {XtNgreeting, XtCGreeting, XtRString, sizeof (char *), + offset(greeting), XtRString, "X Window System"}, + {XtNunsecureGreeting, XtCGreeting, XtRString, sizeof (char *), + offset(unsecure_greet), XtRString, "This is an unsecure session"}, + {XtNnamePrompt, XtCNamePrompt, XtRString, sizeof (char *), + offset(namePrompt), XtRString, "Login: "}, + {XtNpasswdPrompt, XtCPasswdPrompt, XtRString, sizeof (char *), + offset(passwdPrompt), XtRString, "Password: "}, + {XtNfail, XtCFail, XtRString, sizeof (char *), + offset(failMsg), XtRString, + "Login incorrect or forbidden by policy" + }, + {XtNchangePasswdMessage, XtCChangePasswdMessage, XtRString, + sizeof (char *), offset(passwdChangeMsg), XtRString, + (XtPointer) "Password Change Required" }, + {XtNfailTimeout, XtCFailTimeout, XtRInt, sizeof (int), + offset(failTimeout), XtRImmediate, (XtPointer) 10}, + {XtNnotifyDone, XtCCallback, XtRFunction, sizeof (XtPointer), + offset(notify_done), XtRFunction, (XtPointer) 0}, + {XtNsessionArgument, XtCSessionArgument, XtRString, sizeof (char *), + offset(sessionArg), XtRString, (XtPointer) 0 }, + {XtNsecureSession, XtCSecureSession, XtRBoolean, sizeof (Boolean), + offset(secure_session), XtRImmediate, (XtPointer) False }, + {XtNallowAccess, XtCAllowAccess, XtRBoolean, sizeof (Boolean), + offset(allow_access), XtRImmediate, (XtPointer) False }, + {XtNallowNullPasswd, XtCAllowNullPasswd, XtRBoolean, sizeof (Boolean), + offset(allow_null_passwd), XtRImmediate, (XtPointer) False}, + {XtNallowRootLogin, XtCAllowRootLogin, XtRBoolean, sizeof(Boolean), + offset(allow_root_login), XtRImmediate, (XtPointer) True}, + {XtNechoPasswd, XtCEchoPasswd, XtRBoolean, sizeof(Boolean), + offset(echo_passwd), XtRImmediate, (XtPointer) False}, + {XtNechoPasswdChar, XtCEchoPasswdChar, XtRString, sizeof (char *), + offset(echo_passwd_char), XtRString, (XtPointer) "*" } +}; + +#undef offset +#undef goffset + +#ifdef USE_XFT +# define F_MAX_WIDTH(f) ((w)->login.f##Face->max_advance_width) +# define F_ASCENT(f) ((w)->login.f##Face->ascent) +# define F_DESCENT(f) ((w)->login.f##Face->descent) +#else +# define F_MAX_WIDTH(f) ((w)->login.f##Font->max_bounds.width) +# define F_ASCENT(f) ((w)->login.f##Font->max_bounds.ascent) +# define F_DESCENT(f) ((w)->login.f##Font->max_bounds.descent) +#endif + +#define TEXT_X_INC(w) F_MAX_WIDTH(text) +#define TEXT_Y_INC(w) (F_ASCENT(text) + F_DESCENT(text)) + +#define PROMPT_X_INC(w) F_MAX_WIDTH(prompt) +#define PROMPT_Y_INC(w) (F_ASCENT(prompt) + F_DESCENT(prompt)) + +#define GREET_X_INC(w) F_MAX_WIDTH(greet) +#define GREET_Y_INC(w) (F_ASCENT(greet) + F_DESCENT(greet)) + +#define FAIL_X_INC(w) F_MAX_WIDTH(fail) +#define FAIL_Y_INC(w) (F_ASCENT(fail) + F_DESCENT(fail)) + +#define Y_INC(w) max (TEXT_Y_INC(w), PROMPT_Y_INC(w)) + + +#define PROMPT_TEXT(w,n) ((w)->login.prompts[n].promptText) +#define DEF_PROMPT_TEXT(w,n) ((w)->login.prompts[n].defaultPrompt) +#define VALUE_TEXT(w,n) ((w)->login.prompts[n].valueText) +#define VALUE_TEXT_MAX(w,n) ((w)->login.prompts[n].valueTextMax) +#define VALUE_SHOW_START(w,n) ((w)->login.prompts[n].valueShownStart) +#define VALUE_SHOW_END(w,n) ((w)->login.prompts[n].valueShownEnd) +#define PROMPT_STATE(w,n) ((w)->login.prompts[n].state) +#define PROMPT_CURSOR(w,n) ((w)->login.prompts[n].cursor) + +#define CUR_PROMPT_CURSOR(w) PROMPT_CURSOR(w,w->login.activePrompt) + +#define CUR_PROMPT_TEXT(w, n) (PROMPT_TEXT(w,n) != NULL ? \ + PROMPT_TEXT(w,n) : DEF_PROMPT_TEXT(w,n)) + +#ifdef USE_XFT + +# define TEXT_COLOR(f) (w->login.f##color.pixel) + +# define TEXT_WIDTH(f, m, l) XmuXftTextWidth(XtDisplay (w), \ + w->login.f##Face, (FcChar8 *) m, l) +static int +XmuXftTextWidth(Display *dpy, XftFont *font, FcChar8 *string, int len); + +# define DRAW_STRING(f, x, y, m, l) \ + /* Debug("DRAW_STRING(%s, %d, %d, %s, %d)\n", #f, x, y, m, l); */ \ + XftDrawString8 (w->login.draw, &w->login.f##color, w->login.f##Face, \ + x, y, (FcChar8 *) m, l) + +#else + +# define TEXT_COLOR(f) (w->login.f##pixel) + +# define TEXT_WIDTH(f, m, l) (XTextWidth (w->login.f##Font, m, l)) + +# define DRAW_STRING(f, x, y, m, l) \ + XDrawString (XtDisplay (w), XtWindow (w), w->login.f##GC, x, y, m, l) + +#endif + + +#define STRING_WIDTH(f, s) TEXT_WIDTH (f, s, strlen(s)) + +/* Padded width of logo image, if compiled with XPM support */ +#ifdef XPM +# define LOGO_W(w) ((w)->login.logoWidth + ((w)->login.logoPadding * 2)) +#else +# define LOGO_W(w) 0 +#endif + +#define TEXT_PROMPT_W(w, m) (STRING_WIDTH(prompt, m) + w->login.inframeswidth) + +#define DEF_PROMPT_W(w,n) TEXT_PROMPT_W(w, w->login.prompts[n].defaultPrompt) +#define CUR_PROMPT_W(w,n) (max(MAX_DEF_PROMPT_W(w), PROMPT_TEXT(w,n) ? \ + TEXT_PROMPT_W(w, PROMPT_TEXT(w,n)) : 0)) + +#define MAX_DEF_PROMPT_W(w) (max(DEF_PROMPT_W(w,0), DEF_PROMPT_W(w,1))) + +#define GREETING(w) ((w)->login.secure_session && !(w)->login.allow_access ?\ + (w)->login.greeting : (w)->login.unsecure_greet) +#define GREET_X(w) ((int)((w->core.width - \ + STRING_WIDTH (greet, GREETING(w))) / 2)) +#define GREET_Y(w) (GREETING(w)[0] ? 2 * GREET_Y_INC (w) : 0) +#define GREET_W(w) (max (STRING_WIDTH (greet, w->login.greeting), \ + STRING_WIDTH (greet, w->login.unsecure_greet)) \ + + LOGO_W(w)) + +#define PROMPT_X(w) (2 * PROMPT_X_INC(w)) +#define PROMPT_Y(w,n) ((GREET_Y(w) + GREET_Y_INC(w) +\ + F_ASCENT(greet) + Y_INC(w)) + \ + (n * PROMPT_SPACE_Y(w))) +#define PROMPT_W(w) (w->core.width - (2 * TEXT_X_INC(w))) +#define PROMPT_H(w) (5 * Y_INC(w) / 4) +#define VALUE_X(w,n) (PROMPT_X(w) + CUR_PROMPT_W(w,n)) +#define CURSOR_W 5 +#define MAX_VALUE_W(w,n) (PROMPT_W(w) - VALUE_X (w,n) - CURSOR_W - 1 - \ + (w->login.inframeswidth * 2) - LOGO_W(w)) +#define PROMPT_SPACE_Y(w) (10 * Y_INC(w) / 5) + +#define ERROR_X(w,m) ((int)(w->core.width - LOGO_W(w) - STRING_WIDTH (fail, m)) / 2) +#define FAIL_X(w) ERROR_X(w, w->login.fail) +#define FAIL_Y(w) (PROMPT_Y(w,1) + 2 * FAIL_Y_INC (w) + F_ASCENT(fail)) + +#define ERROR_W(w,m) (STRING_WIDTH (fail, m) + LOGO_W(w)) + +#define FAIL_W(w) max(ERROR_W(w, w->login.failMsg), \ + ERROR_W(w, w->login.passwdChangeMsg)) + +#define PAD_X(w) (2 * (PROMPT_X(w) + max (GREET_X_INC(w), FAIL_X_INC(w)))) + +#define PAD_Y(w) (max (max (Y_INC(w), GREET_Y_INC(w)),\ + FAIL_Y_INC(w))) + +#ifndef max +static inline int max (int a, int b) { return a > b ? a : b; } +#endif + +static void +realizeValue (LoginWidget w, int cursor, int promptNum, GC gc) +{ + loginPromptState state = PROMPT_STATE(w, promptNum); + char *text = VALUE_TEXT(w, promptNum); + int x, y, height, width, curoff; + + XDM_ASSERT(promptNum >= 0 && promptNum <= LAST_PROMPT); + + /* replace all password characters with asterisks */ + if ((state == LOGIN_PROMPT_ECHO_OFF) && (w->login.echo_passwd == True)) + { + Cardinal length = strlen(text); + Cardinal i = 0; + + text = XtMalloc(length + 1); + + if (text == NULL) + { + LogOutOfMem("realizeValue"); + return; + } + + while (i < length) + { + text[i++] = w->login.echo_passwd_char[0]; + } + + text[i] = 0; + } + + x = VALUE_X (w,promptNum); + y = PROMPT_Y (w,promptNum); + + height = PROMPT_H(w) - (w->login.inframeswidth * 2); + width = MAX_VALUE_W(w,promptNum); + + if (cursor > VALUE_SHOW_START(w, promptNum)) + curoff = TEXT_WIDTH (text, text, cursor); + else + curoff = 0; + + + if (gc == w->login.bgGC) { + if (curoff < width) { + XFillRectangle (XtDisplay (w), XtWindow (w), gc, + x + curoff, y - TEXT_Y_INC(w), + width - curoff, height); + } + } else if ((state == LOGIN_PROMPT_ECHO_ON) || (state == LOGIN_TEXT_INFO) || + ((state == LOGIN_PROMPT_ECHO_OFF) && (w->login.echo_passwd == True))) + { + int offset = max(cursor, VALUE_SHOW_START(w, promptNum)); + int textlen = strlen (text + offset); + + if (TEXT_WIDTH (text, text + offset, textlen) > (width - curoff)) { + /* Recalculate amount of text that can fit in field */ + offset = VALUE_SHOW_START(w, promptNum); + textlen = strlen (text + offset); + + while ((textlen > 0) && + (TEXT_WIDTH (text, text + offset, textlen) > width)) + { + if (offset < PROMPT_CURSOR(w, promptNum)) { + offset++; + } + textlen--; + } + + VALUE_SHOW_START(w, promptNum) = offset; + VALUE_SHOW_END(w, promptNum) = offset + textlen; + + /* Erase old string */ + XFillRectangle (XtDisplay (w), XtWindow (w), w->login.bgGC, + x, y - TEXT_Y_INC(w), width, height); + + DRAW_STRING(text, x, y, text + offset, textlen); + } else { + DRAW_STRING(text, x + curoff, y, text + offset, textlen); + } + } + /* free memory */ + if ((state == LOGIN_PROMPT_ECHO_OFF) && (w->login.echo_passwd == True)) + { + XtFree(text); + } +} + +static void +EraseValue (LoginWidget w, int cursor, int promptNum) +{ + realizeValue(w, cursor, promptNum, w->login.bgGC); +} + +static void +DrawValue (LoginWidget w, int cursor, int promptNum) +{ + realizeValue(w, cursor, promptNum, w->login.textGC); +#ifdef DANCING + /*as good a place as any Caolan begin*/ + w->login.lastEventTime = time(NULL); + /*as good a place as any Caolan end*/ +#endif /* DANCING */ +} + +static void +realizeCursor (LoginWidget w, GC gc) +{ + int x, y; + int height, width; + + if (w->login.state != PROMPTING) { + return; + } + + x = VALUE_X (w, w->login.activePrompt); + y = PROMPT_Y (w, w->login.activePrompt); + height = (F_ASCENT(text) + F_DESCENT(text)); + width = 1; + + switch (PROMPT_STATE(w, w->login.activePrompt)) { + case LOGIN_PROMPT_NOT_SHOWN: + case LOGIN_TEXT_INFO: + return; + case LOGIN_PROMPT_ECHO_ON: + if (CUR_PROMPT_CURSOR(w) > 0) { + x += TEXT_WIDTH (text, + VALUE_TEXT(w, w->login.activePrompt) + + VALUE_SHOW_START(w, w->login.activePrompt), + PROMPT_CURSOR(w, w->login.activePrompt) + - VALUE_SHOW_START(w, w->login.activePrompt) ); + } + break; + case LOGIN_PROMPT_ECHO_OFF: + if (w->login.echo_passwd == True) { + if (w->login.echo_passwd_char[0] != 0) { + int len = PROMPT_CURSOR(w, w->login.activePrompt) - + VALUE_SHOW_START(w, w->login.activePrompt); + + x += len*TEXT_WIDTH(text, w->login.echo_passwd_char, 1); + } else { + /* Move cursor one pixel per character to give some feedback + without giving away the password length */ + if (PROMPT_CURSOR(w, w->login.activePrompt) < + MAX_VALUE_W(w, w->login.activePrompt)) + x += PROMPT_CURSOR(w, w->login.activePrompt); + else + x += MAX_VALUE_W(w, w->login.activePrompt); + } + } + break; + } + + XFillRectangle (XtDisplay (w), XtWindow (w), gc, + x, y+1 - F_ASCENT(text), width, height-1); + XDrawPoint (XtDisplay (w), XtWindow (w), gc, + x-1 , y - F_ASCENT(text)); + XDrawPoint (XtDisplay (w), XtWindow (w), gc, + x+1 , y - F_ASCENT(text)); + XDrawPoint (XtDisplay (w), XtWindow (w), gc, + x-1 , y - F_ASCENT(text)+height); + XDrawPoint (XtDisplay (w), XtWindow (w), gc, + x+1 , y - F_ASCENT(text)+height); + XDrawPoint (XtDisplay (w), XtWindow (w), gc, + x-2 , y - F_ASCENT(text)); + XDrawPoint (XtDisplay (w), XtWindow (w), gc, + x+2 , y - F_ASCENT(text)); + XDrawPoint (XtDisplay (w), XtWindow (w), gc, + x-2 , y - F_ASCENT(text)+height); + XDrawPoint (XtDisplay (w), XtWindow (w), gc, + x+2 , y - F_ASCENT(text)+height); + + XFlush (XtDisplay(w)); +} + +static void +EraseFail (LoginWidget w) +{ +#ifdef USE_XFT + w->login.failUp = 0; + RedrawFail(w); +#else + XSetForeground (XtDisplay (w), w->login.failGC, + w->core.background_pixel); + RedrawFail(w); + w->login.failUp = 0; + XSetForeground (XtDisplay (w), w->login.failGC, + TEXT_COLOR(fail)); +#endif +} + +static void +XorCursor (LoginWidget w) +{ + realizeCursor (w, w->login.xorGC); +} + +static void +RemoveFail (LoginWidget w) +{ + if (w->login.failUp) + EraseFail (w); +} + +static void +EraseCursor (LoginWidget w) +{ + realizeCursor (w, w->login.bgGC); +} + +/*ARGSUSED*/ +static void failTimeout (XtPointer client_data, XtIntervalId * id) +{ + LoginWidget w = (LoginWidget)client_data; + + Debug ("failTimeout\n"); + w->login.interval_id = 0; + EraseFail (w); +} + +_X_INTERNAL +void +DrawFail (Widget ctx) +{ + LoginWidget w; + + w = (LoginWidget) ctx; + XorCursor (w); + ResetLogin (w); + XorCursor (w); + ErrorMessage(ctx, w->login.failMsg, True); +} + +static void +RedrawFail (LoginWidget w) +{ + int x = FAIL_X(w); + int y = FAIL_Y(w); + int maxw = w->core.width - PAD_X(w); + +#ifndef USE_XFT + if (w->login.failUp) +#endif + { + Debug("RedrawFail('%s', %d)\n", w->login.fail, w->login.failUp); + if (ERROR_W(w, w->login.fail) > maxw) { + /* Too long to fit on one line, break into multiple lines */ + char *tempCopy = strdup(w->login.fail); + if (tempCopy != NULL) { + char *start, *next; + char lastspace = ' '; + + y = PROMPT_Y(w,LAST_PROMPT) + (2 * PROMPT_Y_INC(w)); + + for (start = next = tempCopy; start != NULL ; start = next) { + /* search for longest string broken by whitespace that + will fit on a single line */ + do { + if (next != start) { + *next = lastspace; + } + for (next = next + 1; + (*next != '\0') && !isspace(*next) ; next++) + { + /* this loop intentionally left blank */ + } + if (*next != '\0') { + lastspace = *next; + *next = '\0'; + } else { + next = NULL; + } + } while ((next != NULL) && ERROR_W(w, start) < maxw); + + x = ERROR_X(w, start); +#ifdef USE_XFT + if (w->login.failUp == 0) { + XClearArea(XtDisplay(w), XtWindow(w), x, y - F_ASCENT(fail), + ERROR_W(w, start), FAIL_Y_INC(w), False); + } else +#endif + DRAW_STRING (fail, x, y, start, strlen(start)); + + if (next != NULL) { + next++; + y += FAIL_Y_INC(w); + } + } + free(tempCopy); + return; + } + /* if strdup failed, fall through to draw all at once, even + though we know it can't all fit */ + LogOutOfMem("RedrawFail"); + } + +#ifdef USE_XFT + if (w->login.failUp == 0) { + XClearArea(XtDisplay(w), XtWindow(w), x, y - F_ASCENT(fail), + ERROR_W(w, w->login.fail), FAIL_Y_INC(w), False); + } else +#endif + DRAW_STRING (fail, x, y, w->login.fail, strlen (w->login.fail)); + } +} + +_X_INTERNAL +void +ErrorMessage(Widget ctx, const char *message, Bool timeout) +{ + LoginWidget w = (LoginWidget) ctx; + +/* Debug("ErrorMessage: %s\n", message); */ + if (w->login.interval_id != 0) { + XtRemoveTimeOut(w->login.interval_id); + w->login.interval_id = 0; + } + RemoveFail(w); + if (w->login.fail != w->login.failMsg) + free(w->login.fail); + w->login.fail = strdup(message); + if (w->login.fail == NULL) + w->login.fail = (char *) w->login.failMsg; + w->login.failUp = 1; + RedrawFail (w); + if (timeout && (w->login.failTimeout > 0)) { + Debug ("failTimeout: %d\n", w->login.failTimeout); + w->login.interval_id = + XtAppAddTimeOut(XtWidgetToApplicationContext ((Widget)w), + w->login.failTimeout * 1000, + failTimeout, (XtPointer) w); + } +} + +_X_INTERNAL +void +ShowChangePasswdMessage(Widget ctx) +{ + LoginWidget w = (LoginWidget) ctx; + + ErrorMessage(ctx, w->login.passwdChangeMsg, False); +} + +static void +draw_it (LoginWidget w) +{ + int p; + int i; + int gr_line_x, gr_line_y, gr_line_w; + + EraseCursor (w); + + /* draw window borders */ + for(i=1;i<=(w->login.outframewidth);i++) + { + XDrawLine(XtDisplay (w), XtWindow (w), w->login.hiGC, + i-1,i-1,w->core.width-i,i-1); + XDrawLine(XtDisplay (w), XtWindow (w), w->login.hiGC, + i-1,i-1,i-1,w->core.height-i); + XDrawLine(XtDisplay (w), XtWindow (w), w->login.shdGC, + w->core.width-i,i-1,w->core.width-i,w->core.height-i); + XDrawLine(XtDisplay (w), XtWindow (w), w->login.shdGC, + i-1,w->core.height-i,w->core.width-i,w->core.height-i); + } + + /* make separator line */ + gr_line_x = w->login.outframewidth; + gr_line_y = GREET_Y(w) + GREET_Y_INC(w); + gr_line_w = w->core.width - 2*(w->login.outframewidth); + +#ifdef XPM + gr_line_x += w->login.logoPadding; + gr_line_w -= w->login.logoWidth + (3 * (w->login.logoPadding)); +#endif /* XPM */ + + for(i=1;i<=(w->login.sepwidth);i++) + { + XDrawLine(XtDisplay (w), XtWindow (w), w->login.shdGC, + gr_line_x, gr_line_y + i-1, + gr_line_x+gr_line_w, gr_line_y + i-1); + XDrawLine(XtDisplay (w), XtWindow (w), w->login.hiGC, + gr_line_x, gr_line_y + 2*(w->login.inframeswidth) -i, + gr_line_x+gr_line_w, gr_line_y + 2*(w->login.inframeswidth) -i); + } + + for (p = 0; p < NUM_PROMPTS ; p++) + { + int in_frame_x = VALUE_X(w,p) - w->login.inframeswidth - 3; + int in_frame_y + = PROMPT_Y(w,p) - w->login.inframeswidth - 1 - TEXT_Y_INC(w); + + int in_width = PROMPT_W(w) - VALUE_X(w,p) - LOGO_W(w); + int in_height = PROMPT_H(w) + w->login.inframeswidth + 2; + + GC topLeftGC, botRightGC, inpGC; + + if ((PROMPT_STATE(w, p) == LOGIN_PROMPT_ECHO_ON) || + (PROMPT_STATE(w, p) == LOGIN_PROMPT_ECHO_OFF)) { + topLeftGC = w->login.shdGC; + botRightGC = w->login.hiGC; + inpGC = w->login.inpGC; + } else { + topLeftGC = botRightGC = inpGC = w->login.bgGC; + } + + /* draw borders of editboxes */ + for (i=1; i<=(w->login.inframeswidth); i++) + { + /* Make top/left sides */ + XDrawLine(XtDisplay (w), XtWindow (w), topLeftGC, + in_frame_x + i-1, in_frame_y + i-1, + in_frame_x + in_width-i, in_frame_y + i-1); + + XDrawLine(XtDisplay (w), XtWindow (w), topLeftGC, + in_frame_x + i-1, in_frame_y + i-1, + in_frame_x + i-1, in_frame_y + in_height-i); + + /* Make bottom/right sides */ + XDrawLine(XtDisplay (w), XtWindow (w), botRightGC, + in_frame_x + in_width-i, in_frame_y + i-1, + in_frame_x + in_width-i, in_frame_y + in_height-i); + + XDrawLine(XtDisplay (w), XtWindow (w), botRightGC, + in_frame_x + i-1, in_frame_y + in_height-i, + in_frame_x + in_width-i, in_frame_y + in_height-i); + } + XFillRectangle(XtDisplay (w), XtWindow (w), inpGC, + in_frame_x + w->login.inframeswidth, + in_frame_y + w->login.inframeswidth, + in_width - 2*w->login.inframeswidth, + in_height - 2*w->login.inframeswidth); + } + + if (GREETING(w)[0]) { + int gx = GREET_X(w); + +#ifdef XPM + gx -= ((w->login.logoWidth/2) + w->login.logoPadding); +#endif + DRAW_STRING (greet, gx, GREET_Y(w), GREETING(w), strlen (GREETING(w))); + } + for (p = 0; p < NUM_PROMPTS ; p++) { + if (PROMPT_STATE(w, p) != LOGIN_PROMPT_NOT_SHOWN) { + DRAW_STRING (prompt, PROMPT_X(w), PROMPT_Y(w,p), + CUR_PROMPT_TEXT(w,p), strlen (CUR_PROMPT_TEXT(w,p))); + DrawValue (w, 0, p); + } + } + RedrawFail (w); + XorCursor (w); + XSetInputFocus (XtDisplay (w), XtWindow (w), + RevertToPointerRoot, CurrentTime); +} + +/* Returns 0 on success, -1 on failure */ +_X_INTERNAL +int +SetPrompt (Widget ctx, int promptNum, const char *message, + loginPromptState state, Boolean minimumTime) +{ + LoginWidget w = (LoginWidget) ctx; + char *prompt; + int messageLen, e; + const char *stateNames[4] = { + "LOGIN_PROMPT_NOT_SHOWN", "LOGIN_PROMPT_ECHO_ON", + "LOGIN_PROMPT_ECHO_OFF", "LOGIN_TEXT_INFO" }; + loginPromptState priorState; + + Debug("SetPrompt(%d, %s, %s(%d))\n", promptNum, + message ? message : "<NULL>", stateNames[state], state); + + XDM_ASSERT(promptNum >= 0 && promptNum <= LAST_PROMPT); + + if (PROMPT_TEXT(w, promptNum) != NULL) { + XtFree(PROMPT_TEXT(w, promptNum)); + PROMPT_TEXT(w, promptNum) = NULL; + } + + priorState = PROMPT_STATE(w, promptNum); + PROMPT_STATE(w, promptNum) = state; + + if (state == LOGIN_PROMPT_NOT_SHOWN) { + return 0; + } + + if (message == NULL) { + message = DEF_PROMPT_TEXT(w, promptNum); + } + + messageLen = strlen(message); + + prompt = XtMalloc(messageLen + 3); + if (prompt == NULL) { + LogOutOfMem ("SetPrompt"); + return -1; + } + + strncpy(prompt, message, messageLen); + + /* Make sure text prompts have at least two spaces at end */ + e = messageLen; + + if (!isspace(message[messageLen - 2])) { + prompt[e] = ' '; + e++; + } + if (!isspace(message[messageLen - 1])) { + prompt[e] = ' '; + e++; + } + prompt[e] = '\0'; + + PROMPT_TEXT(w, promptNum) = prompt; + + if (w->login.state == INITIALIZING) { + return 0; + } + + if ((priorState == LOGIN_TEXT_INFO) && (w->login.msgTimeout != 0)) { + time_t now = time(NULL); + int timeleft = w->login.msgTimeout - now; + + if (timeleft > 0) { + sleep(timeleft); + } + w->login.msgTimeout = 0; + } + + if (state == LOGIN_TEXT_INFO) { + if (minimumTime) { + time_t now = time(NULL); + w->login.msgTimeout = now + w->login.failTimeout; + } + w->login.state = SHOW_MESSAGE; + } else { + w->login.activePrompt = promptNum; + w->login.state = PROMPTING; + } + + PROMPT_CURSOR(w, promptNum) = 0; + XClearArea (XtDisplay(w), XtWindow(w), 0, 0, 0, 0, FALSE); + draw_it(w); + return 0; +} + +_X_INTERNAL +const char * +GetPrompt(Widget ctx, int promptNum) +{ + LoginWidget w = (LoginWidget) ctx; + + XDM_ASSERT(promptNum >= 0 && promptNum <= LAST_PROMPT); + + return CUR_PROMPT_TEXT(w,promptNum); +} + +_X_INTERNAL +int +SetValue(Widget ctx, int promptNum, char *value) +{ + LoginWidget w = (LoginWidget) ctx; + + XDM_ASSERT(promptNum >= 0 && promptNum <= LAST_PROMPT); + + if ((promptNum < 0) || (promptNum > LAST_PROMPT)) + return -1; + + XDM_ASSERT(VALUE_TEXT(w, promptNum) != NULL); + + if (VALUE_TEXT(w, promptNum) == NULL) + return -1; + + if (value == NULL) { + bzero(VALUE_TEXT(w, promptNum), VALUE_TEXT_MAX(w, promptNum)); + } else { + strncpy(VALUE_TEXT(w, promptNum), value, VALUE_TEXT_MAX(w, promptNum)); + VALUE_TEXT(w, promptNum)[VALUE_TEXT_MAX(w, promptNum)] = '\0'; + } + + VALUE_SHOW_START(w, promptNum) = 0; + VALUE_SHOW_END(w, promptNum) = 0; + PROMPT_CURSOR(w, promptNum) = 0; + + return 0; +} + +_X_INTERNAL +const char * +GetValue(Widget ctx, int promptNum) +{ + LoginWidget w = (LoginWidget) ctx; + + XDM_ASSERT(promptNum >= 0 && promptNum <= LAST_PROMPT); + + if ((promptNum < 0) || (promptNum > LAST_PROMPT)) + return NULL; + + XDM_ASSERT(VALUE_TEXT(w, promptNum) != NULL); + + return VALUE_TEXT(w, promptNum); +} + + +static void +realizeDeleteChar (LoginWidget ctx) +{ + if (ctx->login.state == PROMPTING) { + int promptNum = ctx->login.activePrompt; + int redrawFrom = PROMPT_CURSOR(ctx, promptNum); + + if (PROMPT_CURSOR(ctx,promptNum) < (int)strlen(VALUE_TEXT(ctx,promptNum))) { + if (redrawFrom < VALUE_SHOW_START(ctx, ctx->login.activePrompt)) { + redrawFrom = 0; + EraseValue (ctx, redrawFrom, promptNum); + VALUE_SHOW_START(ctx, ctx->login.activePrompt) + = PROMPT_CURSOR(ctx,promptNum); + } else { + EraseValue (ctx, redrawFrom, promptNum); + } + strcpy(VALUE_TEXT(ctx, promptNum) + PROMPT_CURSOR(ctx, promptNum), + VALUE_TEXT(ctx, promptNum) + PROMPT_CURSOR(ctx, promptNum) + 1); + DrawValue (ctx, redrawFrom, promptNum); + } + } +} + +/*ARGSUSED*/ +static void +DeleteBackwardChar (Widget ctxw, XEvent *event, String *params, Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + + RemoveFail (ctx); + + if (ctx->login.state != PROMPTING) { + return; + } + + XorCursor (ctx); + if (CUR_PROMPT_CURSOR(ctx) > 0) { + CUR_PROMPT_CURSOR(ctx) -= 1; + realizeDeleteChar(ctx); + } + XorCursor (ctx); +} + +/*ARGSUSED*/ +static void +DeleteForwardChar (Widget ctxw, XEvent *event, String *params, Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + + RemoveFail (ctx); + + if (ctx->login.state != PROMPTING) { + return; + } + + XorCursor (ctx); + realizeDeleteChar(ctx); + XorCursor (ctx); +} + +/*ARGSUSED*/ +static void +MoveBackwardChar ( + Widget ctxw, + XEvent *event, + String *params, + Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + + RemoveFail (ctx); + + if (ctx->login.state != PROMPTING) { + return; + } + + XorCursor (ctx); + if (CUR_PROMPT_CURSOR(ctx) > 0) + CUR_PROMPT_CURSOR(ctx) -= 1; + if (CUR_PROMPT_CURSOR(ctx) < VALUE_SHOW_START(ctx, ctx->login.activePrompt)) { + EraseValue(ctx, 0, ctx->login.activePrompt); + VALUE_SHOW_START(ctx, ctx->login.activePrompt) + = CUR_PROMPT_CURSOR(ctx); + DrawValue(ctx, 0, ctx->login.activePrompt); + } + XorCursor (ctx); +} + +/*ARGSUSED*/ +static void +MoveForwardChar ( + Widget ctxw, + XEvent *event, + String *params, + Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + + RemoveFail (ctx); + + if (ctx->login.state != PROMPTING) { + return; + } + + XorCursor (ctx); + if (CUR_PROMPT_CURSOR(ctx) < + (int)strlen(VALUE_TEXT(ctx,ctx->login.activePrompt))) { + CUR_PROMPT_CURSOR(ctx) += 1; + if (VALUE_SHOW_END(ctx, ctx->login.activePrompt) + < CUR_PROMPT_CURSOR(ctx)) { + EraseValue(ctx, 0, ctx->login.activePrompt); + DrawValue(ctx, 0, ctx->login.activePrompt); + } + } + XorCursor (ctx); +} + +/*ARGSUSED*/ +static void +MoveToBegining ( + Widget ctxw, + XEvent *event, + String *params, + Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + + RemoveFail (ctx); + + if (ctx->login.state != PROMPTING) { + return; + } + + XorCursor (ctx); + CUR_PROMPT_CURSOR(ctx) = 0; + if (VALUE_SHOW_START(ctx, ctx->login.activePrompt) > 0) { + EraseValue(ctx, 0, ctx->login.activePrompt); + VALUE_SHOW_START(ctx, ctx->login.activePrompt) = 0; + DrawValue(ctx, 0, ctx->login.activePrompt); + } + XorCursor (ctx); +} + +/*ARGSUSED*/ +static void +MoveToEnd ( + Widget ctxw, + XEvent *event, + String *params, + Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + + RemoveFail (ctx); + + if (ctx->login.state != PROMPTING) { + return; + } + + XorCursor (ctx); + CUR_PROMPT_CURSOR(ctx) = strlen (VALUE_TEXT(ctx, ctx->login.activePrompt)); + if (VALUE_SHOW_END(ctx, ctx->login.activePrompt) < CUR_PROMPT_CURSOR(ctx)) { + EraseValue(ctx, 0, ctx->login.activePrompt); + DrawValue(ctx, 0, ctx->login.activePrompt); + } + XorCursor (ctx); +} + +/*ARGSUSED*/ +static void +EraseToEndOfLine ( + Widget ctxw, + XEvent *event, + String *params, + Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + + RemoveFail (ctx); + + if (ctx->login.state != PROMPTING) { + return; + } + + XorCursor (ctx); + EraseValue (ctx, CUR_PROMPT_CURSOR(ctx), ctx->login.activePrompt); + bzero(VALUE_TEXT(ctx, ctx->login.activePrompt) + + CUR_PROMPT_CURSOR(ctx), + VALUE_TEXT_MAX(ctx, ctx->login.activePrompt) - + CUR_PROMPT_CURSOR(ctx)); + XorCursor (ctx); +} + +/*ARGSUSED*/ +static void +EraseLine ( + Widget ctxw, + XEvent *event, + String *params, + Cardinal *num_params) +{ + MoveToBegining (ctxw, event, params, num_params); + EraseToEndOfLine (ctxw, event, params, num_params); +} + +/*ARGSUSED*/ +static void +FinishField ( + Widget ctxw, + XEvent *event, + String *params, + Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + int promptNum = ctx->login.activePrompt; + int nextPrompt; + + RemoveFail (ctx); + + if (ctx->login.state != PROMPTING) { + return; + } + + XorCursor (ctx); + + for (nextPrompt = promptNum + 1; nextPrompt <= LAST_PROMPT; nextPrompt++) { + if ((PROMPT_STATE(ctx, nextPrompt) == LOGIN_PROMPT_ECHO_ON) || + (PROMPT_STATE(ctx, nextPrompt) == LOGIN_PROMPT_ECHO_OFF)) { + ctx->login.activePrompt = nextPrompt; + break; + } + } + if (nextPrompt > LAST_PROMPT) { + ctx->login.state = DONE; + (*ctx->login.notify_done) (ctx, &ctx->login.data, NOTIFY_OK); + Debug("FinishField #%d: now DONE\n", promptNum); + } else { + Debug("FinishField #%d: %d next\n", promptNum, nextPrompt); + } + + XorCursor (ctx); +} + +/*ARGSUSED*/ +static void +TabField(Widget ctxw, XEvent *event, String *params, Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + int promptNum = ctx->login.activePrompt; + int nextPrompt; + + RemoveFail (ctx); + + if (ctx->login.state != PROMPTING) { + return; + } + + XorCursor (ctx); + + for (nextPrompt = promptNum + 1; nextPrompt != promptNum; nextPrompt++) { + if (nextPrompt > LAST_PROMPT) { + nextPrompt = 0; + } + + if ((PROMPT_STATE(ctx, nextPrompt) == LOGIN_PROMPT_ECHO_ON) || + (PROMPT_STATE(ctx, nextPrompt) == LOGIN_PROMPT_ECHO_OFF)) { + ctx->login.activePrompt = nextPrompt; + break; + } + } + XorCursor (ctx); +} + +/*ARGSUSED*/ +static void +AllowAccess ( + Widget ctxw, + XEvent *event, + String *params, + Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + Arg arglist[1]; + Boolean allow; + + RemoveFail (ctx); + XtSetArg (arglist[0], XtNallowAccess, (char *) &allow); + XtGetValues ((Widget) ctx, arglist, 1); + XtSetArg (arglist[0], XtNallowAccess, !allow); + XtSetValues ((Widget) ctx, arglist, 1); +} + +/*ARGSUSED*/ +static void +SetSessionArgument ( + Widget ctxw, + XEvent *event, + String *params, + Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + + RemoveFail (ctx); + if (ctx->login.sessionArg) + XtFree (ctx->login.sessionArg); + ctx->login.sessionArg = NULL; + if (*num_params > 0) { + ctx->login.sessionArg = XtMalloc (strlen (params[0]) + 1); + if (ctx->login.sessionArg) + strcpy (ctx->login.sessionArg, params[0]); + else + LogOutOfMem ("set session argument"); + } +} + +/*ARGSUSED*/ +static void +RestartSession ( + Widget ctxw, + XEvent *event, + String *params, + Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + + XorCursor (ctx); + RemoveFail (ctx); + ctx->login.state = DONE; + (*ctx->login.notify_done) (ctx, &ctx->login.data, NOTIFY_RESTART); + XorCursor (ctx); +} + +/*ARGSUSED*/ +static void +AbortSession ( + Widget ctxw, + XEvent *event, + String *params, + Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + + XorCursor (ctx); + RemoveFail (ctx); + ctx->login.state = DONE; + (*ctx->login.notify_done) (ctx, &ctx->login.data, NOTIFY_ABORT); + XorCursor (ctx); +} + +/*ARGSUSED*/ +static void +AbortDisplay ( + Widget ctxw, + XEvent *event, + String *params, + Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + + XorCursor (ctx); + RemoveFail (ctx); + ctx->login.state = DONE; + (*ctx->login.notify_done) (ctx, &ctx->login.data, NOTIFY_ABORT_DISPLAY); + XorCursor (ctx); +} + +static void +ResetLogin (LoginWidget w) +{ + int i; + + for (i = 0; i < NUM_PROMPTS ; i++) { + EraseValue(w, 0, i); + bzero(VALUE_TEXT(w, i), VALUE_TEXT_MAX(w, i)); + VALUE_SHOW_START(w, i) = 0; + PROMPT_CURSOR(w, i) = 0; + } + w->login.state = PROMPTING; + w->login.activePrompt = 0; +} + +static void +InitI18N(Widget ctxw) +{ + LoginWidget ctx = (LoginWidget)ctxw; + XIM xim = (XIM) NULL; + char *p; + + ctx->login.xic = (XIC) NULL; + + if ((p = XSetLocaleModifiers("@im=none")) != NULL && *p) + xim = XOpenIM(XtDisplay(ctx), NULL, NULL, NULL); + + if (!xim) { + LogError("Failed to open input method\n"); + return; + } + + ctx->login.xic = XCreateIC(xim, + XNInputStyle, (XIMPreeditNothing|XIMStatusNothing), + XNClientWindow, ctx->core.window, + XNFocusWindow, ctx->core.window, NULL); + + if (!ctx->login.xic) { + LogError("Failed to create input context\n"); + XCloseIM(xim); + } + return; +} + +/* ARGSUSED */ +static void +InsertChar ( + Widget ctxw, + XEvent *event, + String *params, + Cardinal *num_params) +{ + LoginWidget ctx = (LoginWidget)ctxw; + + char strbuf[128]; + int len, promptNum = ctx->login.activePrompt; + KeySym keysym = 0; + + if (ctx->login.xic) { + static Status status; + len = XmbLookupString(ctx->login.xic, &event->xkey, strbuf, + sizeof (strbuf), &keysym, &status); + } else { + static XComposeStatus compose_status = {NULL, 0}; + len = XLookupString (&event->xkey, strbuf, sizeof (strbuf), + &keysym, &compose_status); + } + strbuf[len] = '\0'; + + /* + * Note: You can override this default key handling + * by the settings in the translation table + * loginActionsTable at the end of this file. + */ + switch (keysym) { + case XK_Return: + case XK_KP_Enter: + case XK_Linefeed: + case XK_Execute: + FinishField(ctxw, event, params, num_params); + return; + case XK_BackSpace: + DeleteBackwardChar(ctxw, event, params, num_params); + return; + case XK_Delete: + case XK_KP_Delete: + case DXK_Remove: + /* Sorry, it's not a telex machine, it's a terminal */ + DeleteForwardChar(ctxw, event, params, num_params); + return; + case XK_Left: + case XK_KP_Left: + MoveBackwardChar(ctxw, event, params, num_params); + return; + case XK_Right: + case XK_KP_Right: + MoveForwardChar(ctxw, event, params, num_params); + return; + case XK_End: + case XK_KP_End: + MoveToEnd(ctxw, event, params, num_params); + return; + case XK_Home: + case XK_KP_Home: + MoveToBegining(ctxw, event, params, num_params); + return; + default: + if (len == 0) { + if (!IsModifierKey(keysym)) /* it's not a modifier */ + XBell(XtDisplay(ctxw), 60); + return; + } else + break; + } + + if (ctx->login.state == PROMPTING) { + if ((len + (int)strlen(VALUE_TEXT(ctx, promptNum)) >= + (VALUE_TEXT_MAX(ctx,promptNum) - 1))) { + len = VALUE_TEXT_MAX(ctx,promptNum) - + strlen(VALUE_TEXT(ctx, promptNum)) - 2; + } + } + EraseCursor (ctx); + RemoveFail (ctx); + if (len != 0) + { + if (ctx->login.state == PROMPTING) { + EraseValue (ctx, PROMPT_CURSOR(ctx, promptNum), promptNum); + memmove(VALUE_TEXT(ctx, promptNum) + PROMPT_CURSOR(ctx, promptNum) + len, + VALUE_TEXT(ctx, promptNum) + PROMPT_CURSOR(ctx, promptNum), + strlen (VALUE_TEXT(ctx, promptNum) + PROMPT_CURSOR(ctx, promptNum))+1); + memmove(VALUE_TEXT(ctx, promptNum) + PROMPT_CURSOR(ctx, promptNum), + strbuf, len); + DrawValue (ctx, PROMPT_CURSOR(ctx, promptNum), promptNum); + PROMPT_CURSOR(ctx, promptNum) += len; + } + } + XorCursor (ctx); +} + + +/**** Copied from xclock.c - original author: Keith Packard ****/ +#ifdef USE_XFT +static XtConvertArgRec xftColorConvertArgs[] = { + {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen), + sizeof(Screen *)}, + {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.colormap), + sizeof(Colormap)} +}; + +# define donestr(type, value, tstr) \ + { \ + if (toVal->addr != NULL) { \ + if (toVal->size < sizeof(type)) { \ + toVal->size = sizeof(type); \ + XtDisplayStringConversionWarning(dpy, \ + (char*) fromVal->addr, tstr); \ + return False; \ + } \ + *(type*)(toVal->addr) = (value); \ + } \ + else { \ + static type static_val; \ + static_val = (value); \ + toVal->addr = (XPointer)&static_val; \ + } \ + toVal->size = sizeof(type); \ + return True; \ + } + +static void +XmuFreeXftColor (XtAppContext app, XrmValuePtr toVal, XtPointer closure, + XrmValuePtr args, Cardinal *num_args) +{ + Screen *screen; + Colormap colormap; + XftColor *color; + + if (*num_args != 2) + { + XtAppErrorMsg (app, + "freeXftColor", "wrongParameters", + "XtToolkitError", + "Freeing an XftColor requires screen and colormap arguments", + (String *) NULL, (Cardinal *)NULL); + return; + } + + screen = *((Screen **) args[0].addr); + colormap = *((Colormap *) args[1].addr); + color = (XftColor *) toVal->addr; + XftColorFree (DisplayOfScreen (screen), + DefaultVisual (DisplayOfScreen (screen), + XScreenNumberOfScreen (screen)), + colormap, color); +} + +static Boolean +XmuCvtStringToXftColor(Display *dpy, + XrmValue *args, Cardinal *num_args, + XrmValue *fromVal, XrmValue *toVal, + XtPointer *converter_data) +{ + char *spec; + XRenderColor renderColor; + XftColor xftColor; + Screen *screen; + Colormap colormap; + + if (*num_args != 2) + { + XtAppErrorMsg (XtDisplayToApplicationContext (dpy), + "cvtStringToXftColor", "wrongParameters", + "XtToolkitError", + "String to render color conversion needs screen and colormap arguments", + (String *) NULL, (Cardinal *)NULL); + return False; + } + + screen = *((Screen **) args[0].addr); + colormap = *((Colormap *) args[1].addr); + + spec = (char *) fromVal->addr; + if (strcasecmp (spec, XtDefaultForeground) == 0) + { + renderColor.red = 0; + renderColor.green = 0; + renderColor.blue = 0; + renderColor.alpha = 0xffff; + } + else if (strcasecmp (spec, XtDefaultBackground) == 0) + { + renderColor.red = 0xffff; + renderColor.green = 0xffff; + renderColor.blue = 0xffff; + renderColor.alpha = 0xffff; + } + else if (!XRenderParseColor (dpy, spec, &renderColor)) + return False; + if (!XftColorAllocValue (dpy, + DefaultVisual (dpy, + XScreenNumberOfScreen (screen)), + colormap, + &renderColor, + &xftColor)) + return False; + + donestr (XftColor, xftColor, XtRXftColor); +} + +static void +XmuFreeXftFont (XtAppContext app, XrmValuePtr toVal, XtPointer closure, + XrmValuePtr args, Cardinal *num_args) +{ + Screen *screen; + XftFont *font; + + if (*num_args != 1) + { + XtAppErrorMsg (app, + "freeXftFont", "wrongParameters", + "XtToolkitError", + "Freeing an XftFont requires screen argument", + (String *) NULL, (Cardinal *)NULL); + return; + } + + screen = *((Screen **) args[0].addr); + font = *((XftFont **) toVal->addr); + if (font) + XftFontClose (DisplayOfScreen (screen), font); +} + +static Boolean +XmuCvtStringToXftFont(Display *dpy, + XrmValue *args, Cardinal *num_args, + XrmValue *fromVal, XrmValue *toVal, + XtPointer *converter_data) +{ + char *name; + XftFont *font; + Screen *screen; + + if (*num_args != 1) + { + XtAppErrorMsg (XtDisplayToApplicationContext (dpy), + "cvtStringToXftFont", "wrongParameters", + "XtToolkitError", + "String to XftFont conversion needs screen argument", + (String *) NULL, (Cardinal *)NULL); + return False; + } + + screen = *((Screen **) args[0].addr); + name = (char *) fromVal->addr; + + font = XftFontOpenName (dpy, + XScreenNumberOfScreen (screen), + name); + if (font) + { + donestr (XftFont *, font, XtRXftFont); + } + XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRXftFont); + return False; +} + +static XtConvertArgRec xftFontConvertArgs[] = { + {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen), + sizeof(Screen *)}, +}; + + +static int +XmuXftTextWidth(Display *dpy, XftFont *font, FcChar8 *string, int len) +{ + XGlyphInfo extents; + + XftTextExtents8 (dpy, font, string, len, &extents); + + return extents.xOff; +} + +#endif /* USE_XFT */ + +static void +ClassInitialize(void) +{ +#ifdef USE_XFT + XtSetTypeConverter (XtRString, XtRXftColor, + XmuCvtStringToXftColor, + xftColorConvertArgs, XtNumber(xftColorConvertArgs), + XtCacheByDisplay, XmuFreeXftColor); + XtSetTypeConverter (XtRString, XtRXftFont, + XmuCvtStringToXftFont, + xftFontConvertArgs, XtNumber(xftFontConvertArgs), + XtCacheByDisplay, XmuFreeXftFont); +#endif /* USE_XFT */ +} +/**** End of portion borrowed from xclock ****/ + +/* ARGSUSED */ +static void Initialize ( + Widget greq, + Widget gnew, + ArgList args, + Cardinal *num_args) +{ + LoginWidget w = (LoginWidget)gnew; + XtGCMask valuemask, xvaluemask; + XGCValues myXGCV; + Arg position[2]; + Position x, y; +#ifdef USE_XINERAMA + XineramaScreenInfo *screens; + int s_num; +#endif + int rv = 0; + + myXGCV.foreground = w->login.hipixel; + myXGCV.background = w->core.background_pixel; + valuemask = GCForeground | GCBackground; + w->login.hiGC = XtGetGC(gnew, valuemask, &myXGCV); + + myXGCV.foreground = w->login.shdpixel; + myXGCV.background = w->core.background_pixel; + valuemask = GCForeground | GCBackground; + w->login.shdGC = XtGetGC(gnew, valuemask, &myXGCV); + + myXGCV.foreground = w->login.inppixel; + myXGCV.background = w->core.background_pixel; + valuemask = GCForeground | GCBackground; + w->login.inpGC = XtGetGC(gnew, valuemask, &myXGCV); + + myXGCV.foreground = TEXT_COLOR(text); + myXGCV.background = w->core.background_pixel; + valuemask = GCForeground | GCBackground; +#ifndef USE_XFT + if (w->login.textFont) { + myXGCV.font = w->login.textFont->fid; + valuemask |= GCFont; + } +#endif + w->login.textGC = XtGetGC(gnew, valuemask, &myXGCV); + myXGCV.foreground = w->login.inppixel; + w->login.bgGC = XtGetGC(gnew, valuemask, &myXGCV); + + myXGCV.foreground = TEXT_COLOR(text) ^ w->login.inppixel; + myXGCV.function = GXxor; + xvaluemask = valuemask | GCFunction; + w->login.xorGC = XtGetGC (gnew, xvaluemask, &myXGCV); + +#ifndef USE_XFT + /* + * Note that the second argument is a GCid -- QueryFont accepts a GCid and + * returns the curently contained font. + */ + + if (w->login.textFont == NULL) + w->login.textFont = XQueryFont (XtDisplay (w), + XGContextFromGC (XDefaultGCOfScreen (XtScreen (w)))); + + xvaluemask = valuemask; + if (w->login.promptFont == NULL) + w->login.promptFont = w->login.textFont; + else + xvaluemask |= GCFont; + + myXGCV.foreground = TEXT_COLOR(prompt); + myXGCV.font = w->login.promptFont->fid; + w->login.promptGC = XtGetGC (gnew, xvaluemask, &myXGCV); + + xvaluemask = valuemask; + if (w->login.greetFont == NULL) + w->login.greetFont = w->login.textFont; + else + xvaluemask |= GCFont; + + myXGCV.foreground = TEXT_COLOR(greet); + myXGCV.font = w->login.greetFont->fid; + w->login.greetGC = XtGetGC (gnew, xvaluemask, &myXGCV); + + xvaluemask = valuemask; + if (w->login.failFont == NULL) + w->login.failFont = w->login.textFont; + else + xvaluemask |= GCFont; + myXGCV.foreground = TEXT_COLOR(fail); + myXGCV.font = w->login.failFont->fid; + w->login.failGC = XtGetGC (gnew, xvaluemask, &myXGCV); +#endif /* USE_XFT */ + +#ifdef XPM + w->login.logoValid = False; + + if (NULL != w->login.logoFileName) + { + XpmAttributes myAttributes = { 0 }; + Window tmpWindow = { 0 }; + struct stat myBuffer = { 0 }; + unsigned int myPixmapDepth = 0; + + if (0 != stat(w->login.logoFileName, &myBuffer)) + { + LogError("Unable to stat() pixmap file %s\n", + w->login.logoFileName); + w->login.logoValid = False; + goto SkipXpmLoad; + } + + myAttributes.valuemask |= XpmReturnPixels; + myAttributes.valuemask |= XpmReturnExtensions; + + rv = XpmReadFileToPixmap(XtDisplay(w), /* display */ + RootWindowOfScreen(XtScreen(w)), /* window */ + w->login.logoFileName, /* XPM filename */ + &(w->login.logoPixmap), /* pixmap */ + &(w->login.logoMask), /* pixmap mask */ + &myAttributes); /* XPM attributes */ + + if ( rv < 0 ) + { + LogError("Cannot load xpm file %s: %s.\n", w->login.logoFileName, + XpmGetErrorString(rv)); + goto SkipXpmLoad; + } + + w->login.logoValid = True; + + XGetGeometry(XtDisplay(w), w->login.logoPixmap, + &tmpWindow, + &(w->login.logoX), + &(w->login.logoY), + &(w->login.logoWidth), + &(w->login.logoHeight), + &(w->login.logoBorderWidth), + &myPixmapDepth); + } else { + w->login.logoX = 0; + w->login.logoY = 0; + w->login.logoWidth = 0; + w->login.logoHeight = 0; + w->login.logoBorderWidth = 0; + } + + +SkipXpmLoad: +#endif /* XPM */ + w->login.data.name[0] = '\0'; + w->login.data.passwd[0] = '\0'; + w->login.state = INITIALIZING; + w->login.activePrompt = LOGIN_PROMPT_USERNAME; + w->login.failUp = 0; + w->login.fail = (char *) w->login.failMsg; + + /* Set prompt defaults */ + PROMPT_TEXT(w, LOGIN_PROMPT_USERNAME) = NULL; + DEF_PROMPT_TEXT(w, LOGIN_PROMPT_USERNAME) = w->login.namePrompt; + VALUE_TEXT(w, LOGIN_PROMPT_USERNAME) = w->login.data.name; + VALUE_TEXT_MAX(w, LOGIN_PROMPT_USERNAME) = sizeof(w->login.data.name); + VALUE_SHOW_START(w, LOGIN_PROMPT_USERNAME) = 0; + + PROMPT_TEXT(w, LOGIN_PROMPT_PASSWORD) = NULL; + DEF_PROMPT_TEXT(w, LOGIN_PROMPT_PASSWORD) = w->login.passwdPrompt; + VALUE_TEXT(w, LOGIN_PROMPT_PASSWORD) = w->login.data.passwd; + VALUE_TEXT_MAX(w, LOGIN_PROMPT_PASSWORD) = sizeof(w->login.data.passwd); + VALUE_SHOW_START(w, LOGIN_PROMPT_PASSWORD) = 0; + + SetPrompt(gnew, LOGIN_PROMPT_PASSWORD, NULL, LOGIN_PROMPT_ECHO_OFF, False); + SetPrompt(gnew, LOGIN_PROMPT_USERNAME, NULL, LOGIN_PROMPT_ECHO_ON, False); + + if (w->core.width == 0) + w->core.width = max (GREET_W(w), FAIL_W(w)) + PAD_X(w); + if (w->core.height == 0) { + int fy = FAIL_Y(w); + int pady = PAD_Y(w); + +#ifndef XPM + w->core.height = fy + pady; /* for stupid compilers */ +#else +/* w->core.height = fy + pady; * for stupid compilers */ + + w->core.height = max(fy + pady, + (w->login.logoHeight + (2*w->login.logoPadding)) + pady); + +#endif /* XPM */ + } +#ifdef USE_XINERAMA + if ( + XineramaIsActive(XtDisplay(w)) && + (screens = XineramaQueryScreens(XtDisplay(w), &s_num)) != NULL + ) + { + if ((x = w->core.x) == -1) + x = screens[0].x_org + (int)(screens[0].width - w->core.width) / 2; + if ((y = w->core.y) == -1) + y = screens[0].y_org + (int)(screens[0].height - w->core.height) / 3; + + XFree(screens); + } + else +#endif + { + if ((x = w->core.x) == -1) + x = (int)(XWidthOfScreen (XtScreen (w)) - w->core.width) / 2; + if ((y = w->core.y) == -1) + y = (int)(XHeightOfScreen (XtScreen (w)) - w->core.height) / 3; + } + XtSetArg (position[0], XtNx, x); + XtSetArg (position[1], XtNy, y); + XtSetValues (XtParent (w), position, (Cardinal) 2); + + w->login.state = PROMPTING; +} + + +static void Realize ( + Widget gw, + XtValueMask *valueMask, + XSetWindowAttributes *attrs) +{ + LoginWidget w = (LoginWidget) gw; + Cursor cursor; + + XtCreateWindow( gw, (unsigned)InputOutput, (Visual *)CopyFromParent, + *valueMask, attrs ); + InitI18N(gw); + +#ifdef USE_XFT + w->login.draw = XftDrawCreate (XtDisplay (w), XtWindow(w), + DefaultVisual (XtDisplay (w), DefaultScreen(XtDisplay (w))), + w->core.colormap); + +#endif + + cursor = XCreateFontCursor(XtDisplay(gw), XC_left_ptr); + XDefineCursor(XtDisplay(gw), DefaultRootWindow(XtDisplay(gw)), cursor); + +#ifdef XPM + /* + * Check if Pixmap was valid + */ + if (True == w->login.logoValid) + { + /* + * Create pixmap window + */ + { + XSetWindowAttributes windowAttributes = { + .background_pixel = w->core.background_pixel, + .background_pixmap = None + }; + + w->login.logoWindow = XCreateWindow(XtDisplay(w), + XtWindow(w), + w->core.width - w->login.outframewidth - + w->login.logoWidth - w->login.logoPadding, + (w->core.height - w->login.logoHeight) /2, + w->login.logoWidth, w->login.logoHeight, 0, + CopyFromParent, InputOutput, CopyFromParent, + CWBackPixel | CWBackPixmap, &windowAttributes); + } + + /* + * check if we can use shape extension + */ + if (True == w->login.useShape) + { + int foo, bar; + + if (XShapeQueryExtension(XtDisplay(w), &foo, &bar) == TRUE) + { + XShapeCombineMask(XtDisplay(w), w->login.logoWindow, + ShapeBounding, w->login.logoX, w->login.logoY, + w->login.logoMask, ShapeSet); + } + } + + XSetWindowBackgroundPixmap(XtDisplay(w), w->login.logoWindow, + w->login.logoPixmap); + XMapWindow(XtDisplay(w), w->login.logoWindow); + } +#endif /* XPM */ +} + +static void Destroy (Widget gw) +{ + LoginWidget w = (LoginWidget)gw; + bzero (w->login.data.name, NAME_LEN); + bzero (w->login.data.passwd, PASSWORD_LEN); + + if (PROMPT_TEXT(w,0) != NULL) + XtFree(PROMPT_TEXT(w,0)); + if (PROMPT_TEXT(w,1) != NULL) + XtFree(PROMPT_TEXT(w,1)); + +#ifdef USE_XFT + if (w->login.draw) { + XftDrawDestroy(w->login.draw); + w->login.draw = NULL; + } +#endif + + XtReleaseGC(gw, w->login.textGC); + XtReleaseGC(gw, w->login.bgGC); + XtReleaseGC(gw, w->login.xorGC); +#ifndef USE_XFT + XtReleaseGC(gw, w->login.promptGC); + XtReleaseGC(gw, w->login.greetGC); + XtReleaseGC(gw, w->login.failGC); +#endif + XtReleaseGC(gw, w->login.hiGC); + XtReleaseGC(gw, w->login.shdGC); + XtReleaseGC(gw, w->login.inpGC); + +#ifdef XPM + if (True == w->login.logoValid) + { + if (w->login.logoPixmap != 0) + XFreePixmap(XtDisplay(w), w->login.logoPixmap); + + if (w->login.logoMask != 0) + XFreePixmap(XtDisplay(w), w->login.logoMask); + } +#endif /* XPM */ +} + +/* ARGSUSED */ +static void Redisplay( + Widget gw, + XEvent *event, + Region region) +{ + draw_it ((LoginWidget) gw); +} + +/*ARGSUSED*/ +static Boolean SetValues ( + Widget current, + Widget request, + Widget new, + ArgList args, + Cardinal *num_args) +{ + LoginWidget currentL, newL; + + currentL = (LoginWidget) current; + newL = (LoginWidget) new; + if (GREETING (currentL) != GREETING (newL)) + return True; + return False; +} + +static +char defaultLoginTranslations [] = +"Ctrl<Key>H: delete-previous-character() \n" +"Ctrl<Key>D: delete-character() \n" +"Ctrl<Key>B: move-backward-character() \n" +"Ctrl<Key>F: move-forward-character() \n" +"Ctrl<Key>A: move-to-begining() \n" +"Ctrl<Key>E: move-to-end() \n" +"Ctrl<Key>K: erase-to-end-of-line() \n" +"Ctrl<Key>U: erase-line() \n" +"Ctrl<Key>X: erase-line() \n" +"Ctrl<Key>C: restart-session() \n" +"Ctrl<Key>\\\\: abort-session() \n" +":Ctrl<Key>plus: allow-all-access() \n" +"<Key>BackSpace: delete-previous-character() \n" +#ifdef linux +"<Key>Delete: delete-character() \n" +#else +"<Key>Delete: delete-previous-character() \n" +#endif +"<Key>Return: finish-field() \n" +"<Key>Tab: tab-field() \n" +"<KeyPress>: insert-char()" +; + +static +XtActionsRec loginActionsTable [] = { + {"delete-previous-character", DeleteBackwardChar}, + {"delete-character", DeleteForwardChar}, + {"move-backward-character", MoveBackwardChar}, + {"move-forward-character", MoveForwardChar}, + {"move-to-begining", MoveToBegining}, + {"move-to-end", MoveToEnd}, + {"erase-to-end-of-line", EraseToEndOfLine}, + {"erase-line", EraseLine}, + {"finish-field", FinishField}, + {"tab-field", TabField}, + {"abort-session", AbortSession}, + {"abort-display", AbortDisplay}, + {"restart-session", RestartSession}, + {"insert-char", InsertChar}, + {"set-session-argument", SetSessionArgument}, + {"allow-all-access", AllowAccess}, +}; + +LoginClassRec loginClassRec = { + { /* core fields */ + /* superclass */ &widgetClassRec, + /* class_name */ "Login", + /* size */ sizeof(LoginRec), + /* class_initialize */ ClassInitialize, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* realize */ Realize, + /* actions */ loginActionsTable, + /* num_actions */ XtNumber (loginActionsTable), + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ Destroy, + /* resize */ NULL, + /* expose */ Redisplay, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ defaultLoginTranslations, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + } +}; + +WidgetClass loginWidgetClass = (WidgetClass) &loginClassRec; diff --git a/greeter/Login.h b/greeter/Login.h new file mode 100644 index 0000000..6af3369 --- /dev/null +++ b/greeter/Login.h @@ -0,0 +1,227 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ +/* + * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * + * 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. + */ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + */ + + +#ifndef _XtLogin_h +# define _XtLogin_h + +/*********************************************************************** + * + * Login Widget + * + ***********************************************************************/ + +/* Parameters: + + Name Class RepType Default Value + ---- ----- ------- ------------- + background Background pixel White + border BorderColor pixel Black + borderWidth BorderWidth int 1 + foreground Foreground Pixel Black + height Height int 120 + mappedWhenManaged MappedWhenManaged Boolean True + width Width int 120 + x Position int 0 + y Position int 0 + +*/ + +# define XtNgreeting "greeting" +# define XtNunsecureGreeting "unsecureGreeting" +# define XtNnamePrompt "namePrompt" +# define XtNpasswdPrompt "passwdPrompt" +# define XtNfail "fail" +# define XtNnotifyDone "notifyDone" +# define XtNpromptColor "promptColor" +# define XtNgreetColor "greetColor" +# define XtNfailColor "failColor" +# define XtNpromptFont "promptFont" +# define XtNgreetFont "greetFont" +# define XtNfailFont "failFont" +# define XtNpromptFace "promptFace" +# define XtNgreetFace "greetFace" +# define XtNfailFace "failFace" +# define XtNfailTimeout "failTimeout" +# define XtNsessionArgument "sessionArgument" +# define XtNsecureSession "secureSession" +# define XtNallowAccess "allowAccess" +# define XtNallowNullPasswd "allowNullPasswd" +# define XtNallowRootLogin "allowRootLogin" +# define XtNechoPasswd "echoPasswd" +# define XtNechoPasswdChar "echoPasswdChar" + +# define XtNface "face" +# define XtCFace "Face" +# define XtRXftFont "XftFont" +# define XtRXftColor "XftColor" + +/* added by Amit Margalit Oct 1996 */ +# define XtNhiColor "hiColor" +# define XtNshdColor "shdColor" +# define XtNinpColor "inpColor" +# define XtNframeWidth "frameWidth" +# define XtCFrameWidth "FrameWidth" +# define XtNinnerFramesWidth "innerFramesWidth" +# define XtNsepWidth "sepWidth" + +# ifdef DANCING +/* caolan begin */ +# define XtNlastEventTime "lastEventTime" +# define XtCLastEventTime "LastEventTime" +/* caolan end */ +# endif /* DANCING */ + +# ifdef XPM +# define XtNuseShape "useShape" +# define XtCUseShape "UseShape" +# define XtNlogoFileName "logoFileName" +# define XtCLogoFileName "LogoFileName" +# define XtNlogoPadding "logoPadding" +# define XtCLogoPadding "LogoPadding" +# endif /* XPM */ + +# define XtCGreeting "Greeting" +# define XtCNamePrompt "NamePrompt" +# define XtCPasswdPrompt "PasswdPrompt" +# define XtCFail "Fail" +# define XtCFailTimeout "FailTimeout" +# define XtCSessionArgument "SessionArgument" +# define XtCSecureSession "SecureSession" +# define XtCAllowAccess "AllowAccess" +# define XtCAllowNullPasswd "AllowNullPasswd" +# define XtCAllowRootLogin "AllowRootLogin" +# define XtCEchoPasswd "EchoPasswd" +# define XtCEchoPasswdChar "EchoPasswdChar" + +# define XtNchangePasswdMessage "changePasswdMessage" +# define XtCChangePasswdMessage "ChangePasswdMessage" + +/* notifyDone interface definition */ + +# ifdef __OpenBSD__ +# include <sys/param.h> +# endif + +# include <pwd.h> +# include <limits.h> + +# ifdef USE_PAM +# define NAME_LEN PAM_MAX_RESP_SIZE +# define PASSWORD_LEN PAM_MAX_RESP_SIZE +# endif + +/* Defined to be in <limits.h> by SUSv2 */ +# if !defined(PASSWORD_LEN) && defined(PASS_MAX) +# define PASSWORD_LEN PASS_MAX +# endif + +/* _PW_NAME_LEN is found in <pwd.h> on OpenBSD > 2.8 (200012) */ +# if !defined(NAME_LEN) && defined(_PW_NAME_LEN) +# define NAME_LEN (_PW_NAME_LEN + 2) +# endif + +/* _PASSWORD_LEN appears to come from 4.4BSD-Lite <pwd.h> */ +# if !defined(PASSWORD_LEN) && defined(_PASSWORD_LEN) +# define PASSWORD_LEN (_PASSWORD_LEN + 2) +# endif + +/* Fallbacks if no other definition found */ +# ifndef NAME_LEN +# define NAME_LEN 32 +# endif + +# ifndef PASSWORD_LEN +# define PASSWORD_LEN 32 +# endif + +typedef struct _LoginData { + char name[NAME_LEN], passwd[PASSWORD_LEN]; +} LoginData; + +# define NOTIFY_OK 0 +# define NOTIFY_ABORT 1 +# define NOTIFY_RESTART 2 +# define NOTIFY_ABORT_DISPLAY 3 + +typedef struct _LoginRec *LoginWidget; /* completely defined in LoginPrivate.h */ +typedef struct _LoginClassRec *LoginWidgetClass; /* completely defined in LoginPrivate.h */ + +extern WidgetClass loginWidgetClass; + +extern void ErrorMessage(Widget ctx, const char *message, Bool timeout); +extern void ShowChangePasswdMessage(Widget ctx); + +typedef enum { + LOGIN_PROMPT_NOT_SHOWN, /* Neither prompt nor input shown */ + LOGIN_PROMPT_ECHO_ON, /* Both prompt and input shown */ + LOGIN_PROMPT_ECHO_OFF, /* Prompt shown, input accepted but not + shown (bullets may be shown instead) */ + LOGIN_TEXT_INFO /* Prompt shown, no input area */ +} loginPromptState; + +/* Default prompt meanings for simple username/password auth systems */ +# define LOGIN_PROMPT_USERNAME 0 +# define LOGIN_PROMPT_PASSWORD 1 + +extern int SetPrompt(Widget ctx, int promptId, const char *message, + loginPromptState state, Boolean minimumTime); +extern const char *GetPrompt(Widget ctx, int promptId); + +extern int SetValue(Widget ctx, int promptId, char *value); +extern const char *GetValue(Widget ctx, int promptId); + +#endif /* _XtLogin_h */ +/* DON'T ADD STUFF AFTER THIS #endif */ diff --git a/greeter/LoginP.h b/greeter/LoginP.h new file mode 100644 index 0000000..57ed182 --- /dev/null +++ b/greeter/LoginP.h @@ -0,0 +1,192 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ +/* + * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * + * 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. + */ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + */ + +#ifndef _LoginP_h +# define _LoginP_h + +# include "Login.h" +# include <X11/IntrinsicP.h> +# include <X11/CoreP.h> +# include <X11/Xlib.h> +# ifdef USE_XFT +# include <X11/Xft/Xft.h> +# endif + +# define INITIALIZING 0 +# define PROMPTING 1 +# define SHOW_MESSAGE 2 +# define DONE 3 + +typedef void (*LoginFunc)(LoginWidget, LoginData *, int); + +typedef struct { + char * promptText; /* Prompt displayed */ + const char * defaultPrompt; /* Default text for prompt */ + char * valueText; /* Value entered for prompt */ + size_t valueTextMax; /* Size of valueText buffer */ + int valueShownStart;/* Amount of string shown if too */ + int valueShownEnd; /* long to fit in field */ + int cursor; /* current cursor position */ + loginPromptState state; +} loginPromptData; + +# define NUM_PROMPTS 2 /* Currently only 2 prompt fields supported */ +# define LAST_PROMPT (NUM_PROMPTS - 1) + +/* New fields for the login widget instance record */ +typedef struct { +# ifndef USE_XFT + Pixel textpixel; /* foreground pixel */ + Pixel promptpixel; /* prompt pixel */ + Pixel greetpixel; /* greeting pixel */ + Pixel failpixel; /* failure pixel */ +# endif + Pixel hipixel; /* frame hilite pixel */ + Pixel shdpixel; /* shadow frame pixel */ + Pixel inppixel; /* input field bg pixel */ + GC textGC; /* pointer to GraphicsContext */ + GC bgGC; /* pointer to GraphicsContext */ + GC xorGC; /* pointer to GraphicsContext */ +# ifndef USE_XFT + GC promptGC; + GC greetGC; + GC failGC; +# endif + GC hiGC; /* for hilight part of frame */ + GC shdGC; /* for shaded part of frame */ + GC inpGC; /* for input field of frame */ + char *greeting; /* greeting */ + char *unsecure_greet;/* message displayed when insecure */ + char *namePrompt; /* name prompt */ + char *passwdPrompt; /* password prompt */ + char *failMsg; /* failure message */ + char *fail; /* current error message */ + char *passwdChangeMsg; /* message when passwd expires */ +# ifndef USE_XFT + XFontStruct *textFont; /* font for text */ + XFontStruct *promptFont; /* font for prompts */ + XFontStruct *greetFont; /* font for greeting */ + XFontStruct *failFont; /* font for failure message */ +# endif /* USE_XFT */ + int state; /* state */ + int activePrompt; /* which prompt is active */ + int failUp; /* failure message displayed */ + LoginData data; /* name/passwd */ + char *sessionArg; /* argument passed to session */ + LoginFunc notify_done; /* proc to call when done */ + int failTimeout; /* seconds til drop fail msg */ + XtIntervalId interval_id; /* drop fail message note */ + Boolean secure_session; /* session is secured */ + Boolean allow_access; /* disable access control on login */ + Boolean allow_null_passwd; /* allow null password on login */ + Boolean allow_root_login; /* allow root login */ + /* option to display characters such as asterisks, i.e. '**...' + for no-echo prompts like passwords */ + Boolean echo_passwd; + char * echo_passwd_char; + XIC xic; /* input method of input context */ + loginPromptData prompts[NUM_PROMPTS]; + time_t msgTimeout; + +# ifdef DANCING + /*caolan begin*/ + int lastEventTime; + /*caolan end*/ +# endif /* DANCING */ + + int outframewidth; /* outer frame thickness */ + int inframeswidth; /* inner frames thickness */ + int sepwidth; /* width of separator line */ + +# ifdef XPM + char *logoFileName; + unsigned int logoWidth, logoHeight, logoPadding, logoBorderWidth; + int logoX, logoY; + Window logoWindow; + Boolean useShape, logoValid; + Pixmap logoPixmap, logoMask; +# endif /* XPM */ +# ifdef USE_XFT + XftDraw *draw; + XftFont *textFace; /* font for text */ + XftFont *promptFace; /* font for prompts */ + XftFont *greetFace; /* font for greeting */ + XftFont *failFace; /* font for failure message */ + XftColor textcolor; /* foreground color */ + XftColor promptcolor; /* prompt color */ + XftColor greetcolor; /* greeting color */ + XftColor failcolor; /* failure color */ +# endif + } LoginPart; + +/* Full instance record declaration */ +typedef struct _LoginRec { + CorePart core; + LoginPart login; + } LoginRec; + +/* New fields for the Login widget class record */ +typedef struct {int dummy;} LoginClassPart; + +/* Full class record declaration. */ +typedef struct _LoginClassRec { + CoreClassPart core_class; + LoginClassPart login_class; + } LoginClassRec; + +/* Class pointer. */ +extern LoginClassRec loginClassRec; + +#endif /* _LoginP_h */ diff --git a/greeter/Makefile.am b/greeter/Makefile.am new file mode 100644 index 0000000..bee262d --- /dev/null +++ b/greeter/Makefile.am @@ -0,0 +1,26 @@ +xdmlibdir = $(XDMLIBDIR) + +noinst_LTLIBRARIES = libXdmGreet.la + +libXdmGreet_la_SOURCES = \ + Login.c \ + Login.h \ + LoginP.h \ + greet.c \ + verify.c + +libXdmGreet_la_LIBADD = $(XDMGREET_LIBS) + +AM_CPPFLAGS = -I$(top_srcdir)/include +AM_CFLAGS = $(CWARNFLAGS) $(XDMGREET_CFLAGS) + +libXdmGreet_la_LDFLAGS = -static + +if LINT +ALL_LINT_FLAGS=$(LINT_FLAGS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) + +lint: + $(LINT) $(ALL_LINT_FLAGS) $(libXdmGreet_la_SOURCES) + +endif LINT diff --git a/greeter/greet.c b/greeter/greet.c new file mode 100644 index 0000000..e82a904 --- /dev/null +++ b/greeter/greet.c @@ -0,0 +1,394 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ +/* + * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * + * 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. + */ + + +/* + * xdm - display manager daemon + * Author: Keith Packard, X Consortium + * + * widget to get username/password + * + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <X11/Intrinsic.h> +#include <X11/StringDefs.h> +#include <X11/Shell.h> +#include <X11/XKBlib.h> + +# include <X11/extensions/Xinerama.h> + +#include "dm.h" +#include "dm_error.h" +#include "greet.h" +#include "LoginP.h" + +#include <syslog.h> +#ifndef LOG_AUTHPRIV +# define LOG_AUTHPRIV LOG_AUTH +#endif +#ifndef LOG_PID +# define LOG_PID 0 +#endif + +#include <string.h> + +static int done, code; +static char name[NAME_LEN], password[PASSWORD_LEN]; +static Widget toplevel; +static Widget login; +static XtAppContext context; +static XtIntervalId pingTimeout; + +/*ARGSUSED*/ +static void +GreetPingServer ( + XtPointer closure, + XtIntervalId *intervalId) +{ + struct display *d; + + d = (struct display *) closure; + if (!PingServer (d, XtDisplay (toplevel))) + SessionPingFailed (d); + pingTimeout = XtAppAddTimeOut (context, d->pingInterval * 60 * 1000, + GreetPingServer, (closure)); +} + +/*ARGSUSED*/ +static void +GreetDone ( + Widget w, + LoginData *data, + int status) +{ + Debug ("GreetDone: %s, (password is %d long)\n", + data->name, strlen (data->passwd)); + switch (status) { + case NOTIFY_OK: + strncpy (name, data->name, sizeof(name)); + name[sizeof(name)-1] = '\0'; + strncpy (password, data->passwd, sizeof(password)); + password[sizeof(password)-1] = '\0'; + code = 0; + done = 1; + break; + case NOTIFY_ABORT: + Debug ("RESERVER_DISPLAY\n"); + code = RESERVER_DISPLAY; + done = 1; + break; + case NOTIFY_RESTART: + Debug ("REMANAGE_DISPLAY\n"); + code = REMANAGE_DISPLAY; + done = 1; + break; + case NOTIFY_ABORT_DISPLAY: + Debug ("UNMANAGE_DISPLAY\n"); + code = UNMANAGE_DISPLAY; + done = 1; + break; + } + if (done) { + bzero (data->name, NAME_LEN); + bzero (data->passwd, PASSWORD_LEN); + } +} + +static Display * +InitGreet (struct display *d) +{ + Arg arglist[10]; + int i; + static int argc; + Screen *scrn; + static char *argv[] = { "xlogin", NULL }; + Display *dpy; + XineramaScreenInfo *screens; + int s_num; + + Debug ("greet %s\n", d->name); + argc = 1; + XtToolkitInitialize (); + context = XtCreateApplicationContext(); + dpy = XtOpenDisplay (context, d->name, "xlogin", "Xlogin", NULL, 0, + &argc, argv); + + if (!dpy) + return NULL; + + { + int opcode, evbase, errbase, majret, minret; + unsigned int value = XkbPCF_GrabsUseXKBStateMask; + if (XkbQueryExtension (dpy, &opcode, &evbase, &errbase, &majret, &minret)) { + if (!XkbSetPerClientControls (dpy, XkbPCF_GrabsUseXKBStateMask, &value)) + LogError ("%s\n", "SetPerClientControls failed"); + } + } + RegisterCloseOnFork (ConnectionNumber (dpy)); + + SecureDisplay (d, dpy); + + i = 0; + scrn = XDefaultScreenOfDisplay(dpy); + XtSetArg(arglist[i], XtNscreen, scrn); i++; + XtSetArg(arglist[i], XtNargc, argc); i++; + XtSetArg(arglist[i], XtNargv, argv); i++; + + toplevel = XtAppCreateShell ((String) NULL, "Xlogin", + applicationShellWidgetClass, dpy, arglist, i); + + i = 0; + XtSetArg (arglist[i], XtNnotifyDone, (XtPointer)GreetDone); i++; + if (!d->authorize || d->authorizations || !d->authComplain) + { + XtSetArg (arglist[i], XtNsecureSession, True); i++; + } + login = XtCreateManagedWidget ("login", loginWidgetClass, toplevel, + arglist, i); + XtRealizeWidget (toplevel); + + if ( + XineramaIsActive(dpy) && + (screens = XineramaQueryScreens(dpy, &s_num)) != NULL + ) + { + XWarpPointer(dpy, None, XRootWindowOfScreen (scrn), + 0, 0, 0, 0, + screens[0].x_org + screens[0].width / 2, + screens[0].y_org + screens[0].height / 2); + + XFree(screens); + } + else + XWarpPointer(dpy, None, XRootWindowOfScreen (scrn), + 0, 0, 0, 0, + XWidthOfScreen(scrn) / 2, + XHeightOfScreen(scrn) / 2); + + if (d->pingInterval) + { + pingTimeout = XtAppAddTimeOut (context, d->pingInterval * 60 * 1000, + GreetPingServer, (XtPointer) d); + } + return dpy; +} + +static void +CloseGreet (struct display *d) +{ + Boolean allow; + Arg arglist[1]; + Display *dpy = XtDisplay(toplevel); + + if (pingTimeout) + { + XtRemoveTimeOut (pingTimeout); + pingTimeout = 0; + } + UnsecureDisplay (d, dpy); + XtSetArg (arglist[0], XtNallowAccess, (char *) &allow); + XtGetValues (login, arglist, 1); + if (allow) + { + Debug ("Disabling access control\n"); + XSetAccessControl (dpy, DisableAccess); + } + XtDestroyWidget (toplevel); + toplevel = NULL; + login = NULL; /* child of toplevel, which we just destroyed */ + ClearCloseOnFork (XConnectionNumber (dpy)); + XCloseDisplay (dpy); + Debug ("Greet connection closed\n"); +} + +#define WHITESPACE 0 +#define ARGUMENT 1 + +static int +Greet (struct display *d, struct greet_info *greet) +{ + XEvent event; + Arg arglist[1]; + + XtSetArg (arglist[0], XtNallowAccess, False); + XtSetValues (login, arglist, 1); + + Debug ("dispatching %s\n", d->name); + done = 0; + while (!done) { + XtAppNextEvent (context, &event); + switch (event.type) { + case MappingNotify: + XRefreshKeyboardMapping(&event.xmapping); + break; + default: + XtDispatchEvent (&event); + break; + } + } + XFlush (XtDisplay (toplevel)); + Debug ("Done dispatch %s\n", d->name); + if (code == 0) + { + char *ptr; + unsigned int c,state = WHITESPACE; + + /* + * Process the name string to get rid of white spaces. + */ + for (ptr = name; state == WHITESPACE; ptr++) + { + c = (unsigned int)(*ptr); + if (c == ' ') + continue; + + state = ARGUMENT; + break; + } + + greet->name = ptr; + greet->password = password; + XtSetArg (arglist[0], XtNsessionArgument, (char *) &(greet->string)); + XtGetValues (login, arglist, 1); + Debug ("sessionArgument: %s\n", greet->string ? greet->string : "<NULL>"); + } + return code; +} + + +static void +FailedLogin (struct display *d, const char *username) +{ + if (username == NULL) + username = "username unavailable"; + + syslog(LOG_AUTHPRIV|LOG_NOTICE, + "LOGIN FAILURE ON %s, %s", + d->name, username); + DrawFail (login); +} + +_X_EXPORT +greet_user_rtn GreetUser( + struct display *d, + Display ** dpy, + struct verify_info *verify, + struct greet_info *greet, + struct dlfuncs *dlfuncs) +{ + int i; + Arg arglist[2]; + + *dpy = InitGreet (d); + /* + * Run the setup script - note this usually will not work when + * the server is grabbed, so we don't even bother trying. + */ + if (!d->grabServer) + SetupDisplay (d); + if (!*dpy) { + LogError ("Cannot reopen display %s for greet window\n", d->name); + exit (RESERVER_DISPLAY); + } + + XtSetArg (arglist[0], XtNallowNullPasswd, + (char *) &(greet->allow_null_passwd)); + XtSetArg (arglist[1], XtNallowRootLogin, + (char *) &(greet->allow_root_login)); + XtGetValues (login, arglist, 2); + + for (;;) { + /* + * Greet user, requesting name/password + */ + code = Greet (d, greet); + if (code != 0) + { + CloseGreet (d); + SessionExit (d, code, FALSE); + } + /* + * Verify user + */ + if (Verify (d, greet, verify)) + break; + else + { + FailedLogin (d, greet->name); + bzero (greet->name, strlen(greet->name)); + bzero (greet->password, strlen(greet->password)); + } + } + DeleteXloginResources (d, *dpy); + CloseGreet (d); + Debug ("Greet loop finished %d\n", getpid()); + /* + * Run system-wide initialization file + */ + if (source (verify->systemEnviron, d->startup) != 0) + { + Debug ("Startup program %s exited with non-zero status\n", + d->startup); + SessionExit (d, OBEYSESS_DISPLAY, FALSE); + } + /* + * for user-based authorization schemes, + * add the user to the server's allowed "hosts" list. + */ + for (i = 0; i < d->authNum; i++) + { + } + + return Greet_Success; +} diff --git a/greeter/verify.c b/greeter/verify.c new file mode 100644 index 0000000..ef34456 --- /dev/null +++ b/greeter/verify.c @@ -0,0 +1,213 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * verify.c + * + * typical unix verification routine. + */ + +#include "dm.h" +#include "dm_error.h" + +#include <pwd.h> + +#include <login_cap.h> +#include <stdarg.h> +#include <bsd_auth.h> + +#include "greet.h" + +static const char *envvars[] = { + "TZ", /* SYSV and SVR4, but never hurts */ + NULL +}; + +static char ** +userEnv (struct display *d, int useSystemPath, char *user, char *home, char *shell) +{ + char **env; + const char **envvar; + const char *str; + + env = defaultEnv (); + env = setEnv (env, "DISPLAY", d->name); + env = setEnv (env, "HOME", home); + env = setEnv (env, "LOGNAME", user); /* POSIX, System V */ + env = setEnv (env, "USER", user); /* BSD */ + env = setEnv (env, "PATH", useSystemPath ? d->systemPath : d->userPath); + env = setEnv (env, "SHELL", shell); + for (envvar = envvars; *envvar; envvar++) + { + str = getenv(*envvar); + if (str) + env = setEnv (env, *envvar, str); + } + return env; +} + +_X_INTERNAL +int +Verify (struct display *d, struct greet_info *greet, struct verify_info *verify) +{ + struct passwd *p; + login_cap_t *lc; + auth_session_t *as; + char *style, *shell, *home, *s, **argv; + char path[MAXPATHLEN]; + int authok; + size_t passwd_len; + + /* User may have specified an authentication style. */ + if ((style = strchr(greet->name, ':')) != NULL) + *style++ = '\0'; + + Debug ("Verify %s, style %s ...\n", greet->name, + style ? style : "default"); + + p = getpwnam (greet->name); + endpwent(); + + if (!p || strlen (greet->name) == 0) { + Debug("getpwnam() failed.\n"); + bzero(greet->password, strlen(greet->password)); + return 0; + } + + if ((lc = login_getclass(p->pw_class)) == NULL) { + Debug("login_getclass() failed.\n"); + bzero(greet->password, strlen(greet->password)); + return 0; + } + if ((style = login_getstyle(lc, style, "xdm")) == NULL) { + Debug("login_getstyle() failed.\n"); + bzero(greet->password, strlen(greet->password)); + return 0; + } + if ((as = auth_open()) == NULL) { + Debug("auth_open() failed.\n"); + login_close(lc); + bzero(greet->password, strlen(greet->password)); + return 0; + } + if (auth_setoption(as, "login", "yes") == -1) { + Debug("auth_setoption() failed.\n"); + login_close(lc); + bzero(greet->password, strlen(greet->password)); + return 0; + } + passwd_len = strlen(greet->password); + /* Set up state for no challenge, just check a response. */ + auth_setstate(as, 0); + auth_setdata(as, "", 1); + auth_setdata(as, greet->password, passwd_len + 1); + /* wipe password now, otherwise it'll be copied fork() in auth_call */ + bzero(greet->password, passwd_len); + /* Build path of the auth script and call it */ + snprintf(path, sizeof(path), _PATH_AUTHPROG "%s", style); + auth_call(as, path, style, "-s", "response", greet->name, + lc->lc_class, (void *)NULL); + authok = auth_getstate(as); + + if ((authok & AUTH_ALLOW) == 0) { + Debug("password verify failed\n"); + bzero(greet->password, passwd_len); + auth_close(as); + login_close(lc); + return 0; + } + /* Run the approval script */ + if (!auth_approval(as, lc, greet->name, "auth-xdm")) { + Debug("login not approved\n"); + bzero(greet->password, passwd_len); + auth_close(as); + login_close(lc); + return 0; + } + auth_close(as); + login_close(lc); + /* Check empty passwords against allowNullPasswd */ + if (!greet->allow_null_passwd && passwd_len == 0) { + Debug("empty password not allowed\n"); + return 0; + } + /* Only accept root logins if allowRootLogin resource is set */ + if (p->pw_uid == 0 && !greet->allow_root_login) { + Debug("root logins not allowed\n"); + bzero(greet->password, passwd_len); + return 0; + } + + /* + * Shell must be in /etc/shells + */ + for (;;) { + s = getusershell(); + if (s == NULL) { + /* did not found the shell in /etc/shells + -> failure */ + Debug("shell not in /etc/shells\n"); + bzero(greet->password, passwd_len); + endusershell(); + return 0; + } + if (strcmp(s, p->pw_shell) == 0) { + /* found the shell in /etc/shells */ + endusershell(); + break; + } + } + + Debug ("verify succeeded\n"); + /* The password is passed to StartClient() for use by user-based + authorization schemes. It is zeroed there. */ + verify->uid = p->pw_uid; + verify->gid = p->pw_gid; + home = p->pw_dir; + shell = p->pw_shell; + argv = NULL; + if (d->session) + argv = parseArgs (argv, d->session); + if (greet->string) + argv = parseArgs (argv, greet->string); + if (!argv) + argv = parseArgs (argv, "xsession"); + verify->argv = argv; + verify->userEnviron = userEnv (d, p->pw_uid == 0, + greet->name, home, shell); + Debug ("user environment:\n"); + printEnv (verify->userEnviron); + verify->systemEnviron = systemEnv (d, greet->name, home); + Debug ("system environment:\n"); + printEnv (verify->systemEnviron); + Debug ("end of environments\n"); + return 1; +} diff --git a/include/Makefile.am b/include/Makefile.am new file mode 100644 index 0000000..88ed7b6 --- /dev/null +++ b/include/Makefile.am @@ -0,0 +1,6 @@ +noinst_HEADERS = \ + dm.h \ + dm_auth.h \ + dm_error.h \ + dm_socket.h \ + greet.h diff --git a/include/dm.h b/include/dm.h new file mode 100644 index 0000000..e038e08 --- /dev/null +++ b/include/dm.h @@ -0,0 +1,403 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * dm.h + * + * public interfaces for greet/verify functionality + */ + +#ifndef _DM_H_ +# define _DM_H_ 1 + +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif + +# include <X11/Xos.h> +# include <X11/Xfuncs.h> +# include <X11/Xfuncproto.h> +# include <X11/Xmd.h> +# include <X11/Xauth.h> +# include <X11/Intrinsic.h> + +# if defined(X_POSIX_C_SOURCE) +# define _POSIX_C_SOURCE X_POSIX_C_SOURCE +# include <setjmp.h> +# include <limits.h> +# undef _POSIX_C_SOURCE +# else +# include <setjmp.h> +# include <limits.h> +# endif +# include <time.h> +# define Time_t time_t + + +# include <X11/Xdmcp.h> + + +# ifdef _POSIX_SOURCE +# include <sys/wait.h> +# else +# define _POSIX_SOURCE +# include <sys/wait.h> +# undef _POSIX_SOURCE +# endif +# define waitCode(w) (WIFEXITED(w) ? WEXITSTATUS(w) : 0) +# define waitSig(w) (WIFSIGNALED(w) ? WTERMSIG(w) : 0) +# define waitCore(w) 0 /* not in POSIX. so what? */ +typedef int waitType; + +# include <sys/param.h> +# include <login_cap.h> +# include <pwd.h> +# include <bsd_auth.h> + +# define waitCompose(sig,core,code) ((sig) * 256 + (core) * 128 + (code)) +# define waitVal(w) waitCompose(waitSig(w), waitCore(w), waitCode(w)) + +typedef enum displayStatus { running, notRunning, zombie, phoenix } DisplayStatus; + + +/* + * local - server runs on local host + * foreign - server runs on remote host + * permanent - session restarted when it exits + * transient - session not restarted when it exits + * fromFile - started via entry in servers file + * fromXDMCP - started with XDMCP + */ + +typedef struct displayType { + unsigned int location:1; + unsigned int lifetime:1; + unsigned int origin:1; +} DisplayType; + +# define Local 1 +# define Foreign 0 + +# define Permanent 1 +# define Transient 0 + +# define FromFile 1 +# define FromXDMCP 0 + +extern DisplayType parseDisplayType (char *string, int *usedDefault); + +typedef enum fileState { NewEntry, OldEntry, MissingEntry } FileState; + +struct display { + struct display *next; + /* Xservers file / XDMCP information */ + char *name; /* DISPLAY name */ + char *class; /* display class (may be NULL) */ + DisplayType displayType; /* method to handle with */ + char **argv; /* program name and arguments */ + + /* display state */ + DisplayStatus status; /* current status */ + pid_t pid; /* process id of child */ + pid_t serverPid; /* process id of server (-1 if none) */ + FileState state; /* state during HUP processing */ + int startTries; /* current start try */ + Time_t lastReserv; /* time of last reserver crash */ + int reservTries; /* current reserver try */ + /* server management resources */ + int serverAttempts; /* number of attempts at running X */ + int openDelay; /* open delay time */ + int openRepeat; /* open attempts to make */ + int openTimeout; /* abort open attempt timeout */ + int startAttempts; /* number of attempts at starting */ + int reservAttempts; /* allowed start-IO error sequences */ + int pingInterval; /* interval between XSync */ + int pingTimeout; /* timeout for XSync */ + int terminateServer;/* restart for each session */ + int grabServer; /* keep server grabbed for Login */ + int grabTimeout; /* time to wait for grab */ + int resetSignal; /* signal to reset server */ + int termSignal; /* signal to terminate server */ + int resetForAuth; /* server reads auth file at reset */ + char *keymaps; /* binary compat with DEC */ + char *greeterLib; /* greeter shared library name */ + + /* session resources */ + char *resources; /* resource file */ + char *xrdb; /* xrdb program */ + char *setup; /* Xsetup program */ + char *startup; /* Xstartup program */ + char *reset; /* Xreset program */ + char *session; /* Xsession program */ + char *userPath; /* path set for session */ + char *systemPath; /* path set for startup/reset */ + char *systemShell; /* interpreter for startup/reset */ + char *failsafeClient;/* a client to start when the session fails */ + char *chooser; /* chooser program */ + + /* authorization resources */ + int authorize; /* enable authorization */ + char **authNames; /* authorization protocol names */ + unsigned short *authNameLens; /* authorization protocol name lens */ + char *clientAuthFile;/* client specified auth file */ + char *userAuthDir; /* backup directory for tickets */ + int authComplain; /* complain when no auth for XDMCP */ + + /* information potentially derived from resources */ + int authNameNum; /* number of protocol names */ + Xauth **authorizations;/* authorization data */ + int authNum; /* number of authorizations */ + char *authFile; /* file to store authorization in */ + + int version; /* to keep dynamic greeter clued in */ + /* add new fields only after here. And preferably at the end. */ + + /* Hack for making "Willing to manage" configurable */ + char *willing; /* "Willing to manage" program */ + Display *dpy; /* Display */ + char *windowPath; /* path to server "window" */ +}; + + +# define PROTO_TIMEOUT (30 * 60) /* 30 minutes should be long enough */ +# define XDM_BROKEN_INTERVAL (120) /* server crashing more than once within */ + /* two minutes is assumed to be broken! */ +struct protoDisplay { + struct protoDisplay *next; + XdmcpNetaddr address; /* UDP address */ + int addrlen; /* UDP address length */ + unsigned long date; /* creation date */ + CARD16 displayNumber; + CARD16 connectionType; + ARRAY8 connectionAddress; + CARD32 sessionID; + Xauth *fileAuthorization; + Xauth *xdmcpAuthorization; + ARRAY8 authenticationName; + ARRAY8 authenticationData; + XdmAuthKeyRec key; +}; + +struct greet_info { + char *name; /* user name */ + char *password; /* user password */ + char *string; /* random string */ + char *passwd; /* binary compat with DEC */ + int version; /* for dynamic greeter to see */ + /* add new fields below this line, and preferably at the end */ + Boolean allow_null_passwd; /* allow null password on login */ + Boolean allow_root_login; /* allow direct root login */ +}; + +typedef void (*ChooserFunc)(CARD16 connectionType, ARRAY8Ptr addr, char *closure); +typedef void (*ListenFunc)(ARRAY8Ptr addr, void **closure); + +struct verify_info { + int uid; /* user id */ + int gid; /* group id */ + char **argv; /* arguments to session */ + char **userEnviron; /* environment for session */ + char **systemEnviron;/* environment for startup/reset */ + int version; /* for dynamic greeter to see */ + /* add new fields below this line, and preferably at the end */ +}; + +/* display manager exit status definitions */ + +# define OBEYSESS_DISPLAY 0 /* obey multipleSessions resource */ +# define REMANAGE_DISPLAY 1 /* force remanage */ +# define UNMANAGE_DISPLAY 2 /* force deletion */ +# define RESERVER_DISPLAY 3 /* force server termination */ +# define OPENFAILED_DISPLAY 4 /* XOpenDisplay failed, retry */ + +# ifndef TRUE +# define TRUE 1 +# define FALSE 0 +# endif + +extern char *config; + +extern char *servers; +extern int request_port; +extern int debugLevel; +extern char *errorLogFile; +extern int daemonMode; +extern char *pidFile; +extern int lockPidFile; +extern char *authDir; +extern int autoRescan; +extern int removeDomainname; +extern char *keyFile; +extern char *accessFile; +extern char **exportList; +# if !defined(HAVE_ARC4RANDOM) +extern char *randomFile; +extern char *prngdSocket; +extern int prngdPort; +# endif + +extern char *greeterLib; +extern char *willing; +extern int choiceTimeout; /* chooser choice timeout */ + +extern struct display *FindDisplayByName (char *name), + *FindDisplayBySessionID (CARD32 sessionID), + *FindDisplayByAddress (XdmcpNetaddr addr, int addrlen, CARD16 displayNumber), + *FindDisplayByPid (pid_t pid), + *FindDisplayByServerPid (pid_t serverPid), + *NewDisplay (char *name, char *class); + +extern struct protoDisplay *FindProtoDisplay ( + XdmcpNetaddr address, + int addrlen, + CARD16 displayNumber); +extern struct protoDisplay *NewProtoDisplay ( + XdmcpNetaddr address, + int addrlen, + CARD16 displayNumber, + CARD16 connectionType, + ARRAY8Ptr connectionAddress, + CARD32 sessionID); + +/* in Login.c */ +extern void DrawFail (Widget ctx); + +/* in chooser.c */ +extern void RunChooser (struct display *d); + +/* in dm.c */ +extern void CloseOnFork (void); +extern void RegisterCloseOnFork (int fd); +extern void StartDisplay (struct display *d); +# ifndef HAVE_SETPROCTITLE +extern void SetTitle (char *name, ...); +# endif + +/* in dpylist.c */ +extern int AnyDisplaysLeft (void); +extern void ForEachDisplay (void (*f)(struct display *)); +extern void RemoveDisplay (struct display *old); + +/* in file.c */ +extern void ParseDisplay (char *source, DisplayType *acceptableTypes, int numAcceptable); + +/* in netaddr.c */ +extern char *NetaddrAddress(XdmcpNetaddr netaddrp, int *lenp); +extern char *NetaddrPort(XdmcpNetaddr netaddrp, int *lenp); +extern int ConvertAddr (XdmcpNetaddr saddr, int *len, char **addr); +extern int NetaddrFamily (XdmcpNetaddr netaddrp); +extern int addressEqual (XdmcpNetaddr a1, int len1, XdmcpNetaddr a2, int len2); + + +/* in protodpy.c */ +extern void DisposeProtoDisplay(struct protoDisplay *pdpy); + +/* in reset.c */ +extern void pseudoReset (Display *dpy); + +/* in resource.c */ +extern void InitResources (int argc, char **argv); +extern void LoadDMResources (void); +extern void LoadServerResources (struct display *d); +extern void LoadSessionResources (struct display *d); +extern void ReinitResources (void); + +/* in session.c */ +extern char **defaultEnv (void); +extern char **systemEnv (struct display *d, char *user, char *home); +extern int PingServer(struct display *d, Display *alternateDpy); +extern int source (char **environ, char *file); +extern void ClearCloseOnFork (int fd); +extern void DeleteXloginResources (struct display *d, Display *dpy); +extern void LoadXloginResources (struct display *d); +extern void ManageSession (struct display *d); +extern void SecureDisplay (struct display *d, Display *dpy); +extern void SessionExit (struct display *d, int status, int removeAuth); +extern void SessionPingFailed (struct display *d); +extern void SetupDisplay (struct display *d); +extern void UnsecureDisplay (struct display *d, Display *dpy); +extern void execute(char **argv, char **environ); + +/* server.c */ +extern const char *_SysErrorMsg (int n); +extern int StartServer (struct display *d); +extern int WaitForServer (struct display *d); +extern void ResetServer (struct display *d); + +/* in util.c */ +extern char *localHostname (void); +extern char **parseArgs (char **argv, const char *string); +extern char **setEnv (char **e, const char *name, const char *value); +extern char **putEnv(const char *string, char **env); +extern char *getEnv (char **e, const char *name); +extern void CleanUpChild (void); +extern void freeArgs (char **argv); +extern void freeEnv (char **env); +extern void printEnv (char **e); + +/* in verify.c */ +extern int Verify (struct display *d, struct greet_info *greet, struct verify_info *verify); + +/* in xdmcp.c */ + +extern void StopDisplay (struct display *d); +extern void WaitForChild (void); + +/* + * CloseOnFork flags + */ + +# define CLOSE_ALWAYS 0 +# define LEAVE_FOR_DISPLAY 1 + +# include <stdlib.h> + +# define SIGVAL RETSIGTYPE + +# if defined(X_NOT_POSIX) || defined(__UNIXOS2__) || defined(__NetBSD__) && defined(__sparc__) +# if defined(SYSV) || defined(__UNIXOS2__) +# define SIGNALS_RESET_WHEN_CAUGHT +# define UNRELIABLE_SIGNALS +# endif +# define Setjmp(e) setjmp(e) +# define Longjmp(e,v) longjmp(e,v) +# define Jmp_buf jmp_buf +# else +# define Setjmp(e) sigsetjmp(e,1) +# define Longjmp(e,v) siglongjmp(e,v) +# define Jmp_buf sigjmp_buf +# endif + +typedef SIGVAL (*SIGFUNC)(int); + +SIGVAL (*Signal(int, SIGFUNC Handler))(int); + +#endif /* _DM_H_ */ diff --git a/include/dm_auth.h b/include/dm_auth.h new file mode 100644 index 0000000..d475f77 --- /dev/null +++ b/include/dm_auth.h @@ -0,0 +1,99 @@ +/************************************************************ + +Copyright 1998 by Thomas E. Dickey <dickey@clark.net> + + All Rights Reserved + +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 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 ABOVE LISTED COPYRIGHT HOLDER(S) 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. + +Except as contained in this notice, the name(s) of the above copyright +holders shall not be used in advertising or otherwise to promote the +sale, use or other dealings in this Software without prior written +authorization. + +********************************************************/ + +#ifndef _DM_AUTH_H_ +# define _DM_AUTH_H_ 1 + +# include "dm.h" /* for struct display */ + +extern void MitInitAuth (unsigned short name_len, char *name); +extern Xauth *MitGetAuth (unsigned short namelen, char *name); + +# ifdef HASXDMAUTH +extern void XdmInitAuth (unsigned short name_len, char *name); +extern Xauth *XdmGetAuth (unsigned short namelen, char *name); +# ifdef XDMCP +extern void XdmGetXdmcpAuth ( + struct protoDisplay *pdpy, + unsigned short authorizationNameLen, + char *authorizationName); +extern int XdmCheckAuthentication (struct protoDisplay *pdpy, + ARRAY8Ptr displayID, ARRAY8Ptr authenticationName, + ARRAY8Ptr authenticationData); +# else +# define XdmGetXdmcpAuth NULL +# endif +# endif + +# ifdef SECURE_RPC +extern void SecureRPCInitAuth (unsigned short name_len, char *name); +extern Xauth *SecureRPCGetAuth (unsigned short namelen, char *name); +# endif + +# ifdef K5AUTH +extern void Krb5InitAuth (unsigned short name_len, char *name); +extern Xauth *Krb5GetAuth (unsigned short namelen, char *name); +# endif + +/* auth.c */ +extern int ValidAuthorization (unsigned short name_length, char *name); + + +# ifdef XDMCP + +extern void +SetProtoDisplayAuthorization ( + struct protoDisplay *pdpy, + unsigned short authorizationNameLen, + char *authorizationName); + +# endif /* XDMCP */ + +extern int SaveServerAuthorizations (struct display *d, Xauth **auths, int count); +extern void CleanUpFileName (char *src, char *dst, int len); +extern void RemoveUserAuthorization (struct display *d, struct verify_info *verify); +extern void SetAuthorization (struct display *d); +extern void SetLocalAuthorization (struct display *d); +extern void SetUserAuthorization (struct display *d, struct verify_info *verify); + +/* genauth.c */ +extern int GenerateAuthData (char *auth, int len); +# if !defined(HAVE_ARC4RANDOM) +extern void AddPreGetEntropy (void); +extern void AddOtherEntropy (void); +extern void AddTimerEntropy (void); +# endif + +/* prngc.c */ +extern int get_prngd_bytes(char *, int, unsigned short, char *); + +#endif /* _DM_AUTH_H_ */ diff --git a/include/dm_error.h b/include/dm_error.h new file mode 100644 index 0000000..e8a92ef --- /dev/null +++ b/include/dm_error.h @@ -0,0 +1,46 @@ +/************************************************************ + +Copyright 1998 by Thomas E. Dickey <dickey@clark.net> + + All Rights Reserved + +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 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 ABOVE LISTED COPYRIGHT HOLDER(S) 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. + +Except as contained in this notice, the name(s) of the above copyright +holders shall not be used in advertising or otherwise to promote the +sale, use or other dealings in this Software without prior written +authorization. + +********************************************************/ + + +#ifndef _DM_ERROR_H_ +# define _DM_ERROR_H_ 1 + +extern void Debug (const char * fmt, ...) _X_ATTRIBUTE_PRINTF(1,2); +extern void InitErrorLog (void); +extern void LogAppend (const char * fmt, ...) _X_ATTRIBUTE_PRINTF(1,2); +extern void LogError (const char * fmt, ...) _X_ATTRIBUTE_PRINTF(1,2); +extern void LogInfo (const char * fmt, ...) _X_ATTRIBUTE_PRINTF(1,2); +extern void LogOutOfMem (const char * fmt, ...) _X_ATTRIBUTE_PRINTF(1,2); +extern void LogPanic (const char * fmt, ...) _X_ATTRIBUTE_PRINTF(1,2); + + +#endif /* _DM_ERROR_H_ */ diff --git a/include/dm_socket.h b/include/dm_socket.h new file mode 100644 index 0000000..f04517a --- /dev/null +++ b/include/dm_socket.h @@ -0,0 +1,45 @@ +/************************************************************ + +Copyright 1998 by Thomas E. Dickey <dickey@clark.net> + + All Rights Reserved + +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 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 ABOVE LISTED COPYRIGHT HOLDER(S) 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. + +Except as contained in this notice, the name(s) of the above copyright +holders shall not be used in advertising or otherwise to promote the +sale, use or other dealings in this Software without prior written +authorization. + +********************************************************/ + +#ifndef _DM_SOCKET_H_ +# define _DM_SOCKET_H_ 1 + +# include <X11/Xmd.h> +# include <X11/Xdmcp.h> + +# include <sys/socket.h> +# include <netinet/in.h> + +/* ugly, but we need this after socket.h */ +extern ARRAY8Ptr Accept (struct sockaddr *from, int fromlen, CARD16 displayNumber); + +#endif /* _DM_SOCKET_H_ */ diff --git a/include/greet.h b/include/greet.h new file mode 100644 index 0000000..81f4537 --- /dev/null +++ b/include/greet.h @@ -0,0 +1,207 @@ +/* + +Copyright 1994, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * greet.h - interface to xdm's dynamically-loadable modular greeter + */ +#include <pwd.h> +#include <X11/Xlib.h> + +/* + * Do this rather than break a build over a const-mismatch + */ +#if defined(__linux__) || defined(CSRG_BASED) || (defined(sun) && defined(SVR4)) +# define CRYPT_ARGS const char *s1, const char *s2 +# define GETSPNAM_ARGS const char *name +# define GETPWNAM_ARGS const char *name +#else +# define CRYPT_ARGS /*unknown*/ +# define GETSPNAM_ARGS /*unknown*/ +# define GETPWNAM_ARGS /*unknown*/ +#endif + +#if defined(__FreeBSD__) || defined(__bsdi__) || defined(__osf__) +# define SETGRENT_TYPE int +#else +# define SETGRENT_TYPE void +#endif + +struct dlfuncs { + int (*_PingServer)(struct display *d, Display *alternateDpy); + void (*_SessionPingFailed)(struct display *d); + void (*_Debug)(const char * fmt, ...); + void (*_RegisterCloseOnFork)(int fd); + void (*_SecureDisplay)(struct display *d, Display *dpy); + void (*_UnsecureDisplay)(struct display *d, Display *dpy); + void (*_ClearCloseOnFork)(int fd); + void (*_SetupDisplay)(struct display *d); + void (*_LogError)(const char * fmt, ...); + void (*_SessionExit)(struct display *d, int status, int removeAuth); + void (*_DeleteXloginResources)(struct display *d, Display *dpy); + int (*_source)(char **environ, char *file); + char **(*_defaultEnv)(void); + char **(*_setEnv)(char **e, const char *name, const char *value); + char **(*_putEnv)(const char *string, char **env); + char **(*_parseArgs)(char **argv, const char *string); + void (*_printEnv)(char **e); + char **(*_systemEnv)(struct display *d, char *user, char *home); + void (*_LogOutOfMem)(const char * fmt, ...); + SETGRENT_TYPE (*_setgrent)(void); /* no longer used */ + struct group *(*_getgrent)(void); /* no longer used */ + void (*_endgrent)(void); /* no longer used */ + struct passwd *(*_getpwnam)(GETPWNAM_ARGS); + void (*_endpwent)(void); + char *(*_crypt)(CRYPT_ARGS); +}; + +/* + * Return values for GreetUser(); + * Values must be explictly defined because the greet library + * may come from a different vendor. + * Negative values indicate an error. + */ +typedef enum { + Greet_Session_Over = 0, /* session managed and over */ + Greet_Success = 1, /* greet succeeded, session not managed */ + Greet_Failure = -1 /* greet failed */ +} greet_user_rtn; + +/* + * GreetUser can either handle the user's session or allow xdm to do it. + * The return or exit status of GreetUser indicates to xdm whether it + * should start a session. + * + * GreetUser is passed the xdm struct display pointer, a pointer to a + * Display, and pointers to greet and verify structs. If it expectes xdm + * to run the session, it fills in the Display pointer and the fields + * of the greet and verify structs. + * + * The verify struct includes the uid, gid, arguments to run the session, + * environment for the session, and environment for startup/reset. + * + * The greet struct includes the user's name and password but these are + * really only needed if xdm is compiled with a user-based authorization + * option such as SECURE_RPC or K5AUTH. + */ + +extern greet_user_rtn GreetUser(struct display *, Display **, + struct verify_info *, struct greet_info *, struct dlfuncs *); + +typedef greet_user_rtn (*GreetUserProc)(struct display *, Display **, + struct verify_info *, struct greet_info *, struct dlfuncs *dlfcns); + +#ifdef GREET_LIB +/* + * The greeter uses some symbols from the main xdm executable. Since some + * dynamic linkers are broken, we need to fix things up so that the symbols + * are referenced indirectly through function pointers. The definitions + * here, are used to hold the pointers to the functions in the main xdm + * executable. The pointers are filled in when the GreetUser function is + * called, with the pointer values passed as a paramter. + */ + +extern int (*__xdm_PingServer)(struct display *d, Display *alternateDpy); +extern void (*__xdm_SessionPingFailed)(struct display *d); +extern void (*__xdm_Debug)(const char * fmt, ...); +extern void (*__xdm_RegisterCloseOnFork)(int fd); +extern void (*__xdm_SecureDisplay)(struct display *d, Display *dpy); +extern void (*__xdm_UnsecureDisplay)(struct display *d, Display *dpy); +extern void (*__xdm_ClearCloseOnFork)(int fd); +extern void (*__xdm_SetupDisplay)(struct display *d); +extern void (*__xdm_LogError)(const char * fmt, ...); +extern void (*__xdm_SessionExit)(struct display *d, int status, int removeAuth); +extern void (*__xdm_DeleteXloginResources)(struct display *d, Display *dpy); +extern int (*__xdm_source)(char **environ, char *file); +extern char **(*__xdm_defaultEnv)(void); +extern char **(*__xdm_setEnv)(char **e, const char *name, const char *value); +extern char **(*__xdm_putEnv)(const char *string, char **env); +extern char **(*__xdm_parseArgs)(char **argv, const char *string); +extern void (*__xdm_printEnv)(char **e); +extern char **(*__xdm_systemEnv)(struct display *d, char *user, char *home); +extern void (*__xdm_LogOutOfMem)(const char * fmt, ...); +extern void (*__xdm_setgrent)(void); +extern struct group *(*__xdm_getgrent)(void); +extern void (*__xdm_endgrent)(void); +# ifdef HAVE_GETSPNAM +extern struct spwd *(*__xdm_getspnam)(GETSPNAM_ARGS); +# ifndef QNX4 +extern void (*__xdm_endspent)(void); +# endif /* QNX4 doesn't use endspent */ +# endif +extern struct passwd *(*__xdm_getpwnam)(GETPWNAM_ARGS); +# if defined(linux) || defined(__GLIBC__) +extern void (*__xdm_endpwent)(void); +# endif +extern char *(*__xdm_crypt)(CRYPT_ARGS); +# ifdef USE_PAM +extern pam_handle_t **(*__xdm_thepamhp)(void); +# endif + +/* + * Force the shared library to call through the function pointer + * initialized during the initial call into the library. + */ + +# define PingServer (*__xdm_PingServer) +# define SessionPingFailed (*__xdm_SessionPingFailed) +# define Debug (*__xdm_Debug) +# define RegisterCloseOnFork (*__xdm_RegisterCloseOnFork) +# define SecureDisplay (*__xdm_SecureDisplay) +# define UnsecureDisplay (*__xdm_UnsecureDisplay) +# define ClearCloseOnFork (*__xdm_ClearCloseOnFork) +# define SetupDisplay (*__xdm_SetupDisplay) +# define LogError (*__xdm_LogError) +# define SessionExit (*__xdm_SessionExit) +# define DeleteXloginResources (*__xdm_DeleteXloginResources) +# define source (*__xdm_source) +# define defaultEnv (*__xdm_defaultEnv) +# define setEnv (*__xdm_setEnv) +# define putEnv (*__xdm_putEnv) +# define parseArgs (*__xdm_parseArgs) +# define printEnv (*__xdm_printEnv) +# define systemEnv (*__xdm_systemEnv) +# define LogOutOfMem (*__xdm_LogOutOfMem) +# define setgrent (*__xdm_setgrent) +# define getgrent (*__xdm_getgrent) +# define endgrent (*__xdm_endgrent) +# ifdef HAVE_GETSPNAM +# define getspnam (*__xdm_getspnam) +# ifndef QNX4 +# define endspent (*__xdm_endspent) +# endif /* QNX4 doesn't use endspent */ +# endif +# define getpwnam (*__xdm_getpwnam) +# if defined(linux) || defined(__GLIBC__) +# define endpwent (*__xdm_endpwent) +# endif +# define crypt (*__xdm_crypt) +# ifdef USE_PAM +# define thepamhp (*__xdm_thepamhp) +# endif + +#endif /* GREET_LIB */ diff --git a/m4/ax_define_dir.m4 b/m4/ax_define_dir.m4 new file mode 100644 index 0000000..b74d155 --- /dev/null +++ b/m4/ax_define_dir.m4 @@ -0,0 +1,49 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_define_dir.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_DEFINE_DIR(VARNAME, DIR [, DESCRIPTION]) +# +# DESCRIPTION +# +# This macro sets VARNAME to the expansion of the DIR variable, taking +# care of fixing up ${prefix} and such. +# +# VARNAME is then offered as both an output variable and a C preprocessor +# symbol. +# +# Example: +# +# AX_DEFINE_DIR([DATADIR], [datadir], [Where data are placed to.]) +# +# LICENSE +# +# Copyright (c) 2008 Stepan Kasal <kasal@ucw.cz> +# Copyright (c) 2008 Andreas Schwab <schwab@suse.de> +# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> +# Copyright (c) 2008 Alexandre Oliva +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 6 + +AU_ALIAS([AC_DEFINE_DIR], [AX_DEFINE_DIR]) +AC_DEFUN([AX_DEFINE_DIR], [ + prefix_NONE= + exec_prefix_NONE= + test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix + test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix +dnl In Autoconf 2.60, ${datadir} refers to ${datarootdir}, which in turn +dnl refers to ${prefix}. Thus we have to use `eval' twice. + eval ax_define_dir="\"[$]$2\"" + eval ax_define_dir="\"$ax_define_dir\"" + AC_SUBST($1, "$ax_define_dir") + AC_DEFINE_UNQUOTED($1, "$ax_define_dir", [$3]) + test "$prefix_NONE" && prefix=NONE + test "$exec_prefix_NONE" && exec_prefix=NONE +]) diff --git a/man/Makefile.am b/man/Makefile.am new file mode 100644 index 0000000..914ef67 --- /dev/null +++ b/man/Makefile.am @@ -0,0 +1,43 @@ +# +# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# +# 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. +# + +appmandir = $(APP_MAN_DIR) +appman_PRE = xdm.man +appman_DATA = $(appman_PRE:man=$(APP_MAN_SUFFIX)) + +EXTRA_DIST = $(appman_PRE) $(xdmlman_PRE) +CLEANFILES = $(appman_DATA) $(xdmlman_DATA) $(noinst_DATA) +SUFFIXES = .$(APP_MAN_SUFFIX) .man + +# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure +MAN_SUBSTS += -e 's|CHOOSERPATH|$(XDMLIBDIR)/chooser|g' \ + -e 's|XDMLOGDIR|$(XDMLOGDIR)|g' \ + -e 's|XDMDIR|$(XDMCONFIGDIR)|g' \ + -e 's|BINDIR|$(bindir)|g' \ + -e 's|XDMPIDDIR|$(XDMPIDDIR)|g' \ + -e 's|XDMXAUTHDIR|$(XDMXAUTHDIR)|g' \ + -e 's|DEF_USER_PATH|$(DEF_USER_PATH)|g' \ + -e 's|DEF_SYSTEM_PATH|$(DEF_SYSTEM_PATH)|g' + +.man.$(APP_MAN_SUFFIX): + $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@ diff --git a/man/xdm.man b/man/xdm.man new file mode 100644 index 0000000..9590c1a --- /dev/null +++ b/man/xdm.man @@ -0,0 +1,1466 @@ +.\" Copyright 1988, 1994, 1998 The Open Group +.\" +.\" 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. +.\" +.\" The above copyright notice and this permission notice 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 OPEN GROUP 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. +.\" +.\" Except as contained in this notice, the name of The Open Group shall +.\" not be used in advertising or otherwise to promote the sale, use or +.\" other dealings in this Software without prior written authorization +.\" from The Open Group. +.\" +.\" +.TH XDM 1 __xorgversion__ +.SH NAME +xdm \- X Display Manager with support for XDMCP, host chooser +.SH SYNOPSIS +.B xdm +[ +.B \-config +.I configuration_file +] [ +.B \-nodaemon +] [ +.B \-debug +.I debug_level +] [ +.B \-error +.I error_log_file +] [ +.B \-resources +.I resource_file +] [ +.B \-server +.I server_entry +] [ +.B \-session +.I session_program +] +.SH DESCRIPTION +.I Xdm +manages a collection of X displays, which may be on the local host +or remote servers. The design of +.I xdm +was guided by the needs of X terminals as well as The Open Group standard +XDMCP, the \fIX Display Manager Control Protocol\fP. +.I Xdm +provides services similar to those provided by \fIinit\fP, \fIgetty\fP +and \fIlogin\fP on character terminals: prompting for login name and password, +authenticating the user, and running a ``session.'' +.PP +A ``session'' is defined by the lifetime of a particular process; in the +traditional character-based terminal world, it is the user's login shell. +In the +.I xdm +context, it is an arbitrary session manager. This is because in a windowing +environment, a user's login shell process does not necessarily have any +terminal-like interface with which to connect. +When a real session manager is not available, a window manager or terminal +emulator is typically used as the ``session manager,'' meaning that +termination of this process terminates the user's session. +.PP +When the session is terminated, \fIxdm\fP +resets the X server and (optionally) restarts the whole process. +.PP +When \fIxdm\fP receives an Indirect query via XDMCP, it can run a +\fIchooser\fP process to +perform an XDMCP BroadcastQuery (or an XDMCP Query to specified hosts) +on behalf of the display and +offer a menu of possible hosts that offer XDMCP display management. +This feature is useful with X terminals that do not offer a host +menu themselves. +.PP +.I Xdm +can be configured to ignore BroadcastQuery messages from selected hosts. +This is useful when you don't want the host to appear in menus produced +by +.I chooser +or X terminals themselves. +.PP +Because +.I xdm +provides the first interface that users will see, it is designed to be +simple to use and easy to customize to the needs of a particular site. +.I Xdm +has many options, most of which have reasonable defaults. Browse through the +various sections of this manual, +picking and choosing the things you want to change. +Pay particular attention to the +.B "Session Program" +section, which will describe how to +set up the style of session desired. +.SH "OVERVIEW" +\fIxdm\fP is highly configurable, and most of its behavior can be +controlled by resource files and shell scripts. The names of these +files themselves are resources read from the file \fIxdm-config\fP or +the file named by the \fB\-config\fP option. +.PP +\fIxdm\fP offers display management two different ways. It can manage +X servers running on the local machine and specified in +\fIXservers\fP, and it can manage remote X servers (typically X +terminals) using XDMCP (the XDM Control Protocol) +as specified in the \fIXaccess\fP file. +.PP +The resources of the X clients run by \fIxdm\fP outside the user's +session, including \fIxdm\fP's own login window, can be +affected by setting resources in the \fIXresources\fP file. +.PP +For X terminals that do not offer a menu of hosts to get display +management from, \fIxdm\fP can collect willing hosts and run the +\fIchooser\fP program to offer the user a menu. +For X displays attached to a host, this step is typically not used, as +the local host does the display management. +.PP +After resetting the X server, \fIxdm\fP runs the \fIXsetup\fP script +to assist in setting up the screen the user sees along with the +\fIxlogin\fP widget. +.PP +The \fIxlogin\fP widget, which \fIxdm\fP presents, +offers the familiar login and password prompts. +.PP +After the user logs in, \fIxdm\fP runs the \fIXstartup\fP script as +root. +.PP +Then \fIxdm\fP runs the \fIXsession\fP script as the user. This +system session file may do some additional startup and typically runs +the \fI.xsession\fP script in the user's home directory. +When the \fIXsession\fP script exits, the session is over. +.PP +At the end of the session, the \fIXreset\fP script is run to clean up, +the X server is reset, and the cycle starts over. +.PP +The file \fI XDMLOGDIR/xdm.log\fP will contain error +messages from +.I xdm +and anything output to stderr by \fIXsetup, Xstartup, Xsession\fP +or \fIXreset\fP. +When you have trouble getting +.I xdm +working, check this file to see if +.I xdm +has any clues to the trouble. +.SH OPTIONS +.PP +All of these options, except \fB\-config\fP itself, +specify values that can also be specified in the configuration file +as resources. +.IP "\fB\-config\fP \fIconfiguration_file\fP" +Names the configuration file, which specifies resources to control +the behavior of +.I xdm. +.I XDMDIR/xdm-config +is the default. +See the section \fBConfiguration File\fP. +.IP "\fB\-nodaemon\fP" +Specifies ``false'' as the value for the \fBDisplayManager.daemonMode\fP +resource. +This suppresses the normal daemon behavior, which is for +.I xdm +to close all file descriptors, disassociate itself from +the controlling terminal, and put +itself in the background when it first starts up. +.IP "\fB\-debug\fP \fIdebug_level\fP" +Specifies the numeric value for the \fBDisplayManager.debugLevel\fP +resource. A non-zero value causes +.I xdm +to print lots of debugging statements to the terminal; it also disables the +\fBDisplayManager.daemonMode\fP resource, forcing +.I xdm +to run synchronously. To interpret these debugging messages, a copy +of the source code for +.I xdm +is almost a necessity. No attempt has been +made to rationalize or standardize the output. +.IP "\fB\-error\fP \fIerror_log_file\fP" +Specifies the value for the \fBDisplayManager.errorLogFile\fP resource. +This file contains errors from +.I xdm +as well as anything written to stderr by the various scripts and programs +run during the progress of the session. +.IP "\fB\-resources\fP \fIresource_file\fP" +Specifies the value for the \fBDisplayManager*resources\fP resource. This file +is loaded using +.IR xrdb (__appmansuffix__) +to specify configuration parameters for the +authentication widget. +.IP "\fB\-server\fP \fIserver_entry\fP" +Specifies the value for the \fBDisplayManager.servers\fP resource. +See the section +.B "Local Server Specification" +for a description of this resource. +.IP "\fB\-udpPort\fP \fIport_number\fP" +Specifies the value for the \fBDisplayManager.requestPort\fP resource. This +sets the port-number which +.I xdm +will monitor for XDMCP requests. If set to 0, xdm will not listen +for XDMCP or Chooser requests. As XDMCP uses the registered well-known +UDP port 177, this resource should not be changed to a value other than 0, +except for debugging. +.IP "\fB\-session\fP \fIsession_program\fP" +Specifies the value for the \fBDisplayManager*session\fP resource. This +indicates the program to run as the session after the user has logged in. +.IP "\fB\-xrm\fP \fIresource_specification\fP" +Allows an arbitrary resource to be specified, as in most +X Toolkit applications. +.SH RESOURCES +At many stages the actions of +.I xdm +can be controlled through the use of its configuration file, which is in the +X resource format. +Some resources modify the behavior of +.I xdm +on all displays, +while others modify its behavior on a single display. Where actions relate +to a specific display, +the display name is inserted into the resource name between +``DisplayManager'' and the final resource name segment. +.PP +For local displays, the resource name and class are as read from the +\fIXservers\fP file. +.PP +For remote displays, the resource name is what the network address of +the display resolves to. See the \fBremoveDomain\fP resource. The +name must match exactly; \fIxdm\fP is not aware of +all the network aliases that might reach a given display. +If the name resolve fails, the address is +used. The resource class is as sent by the display in the XDMCP +Manage request. +.PP +Because the resource +manager uses colons to separate the name of the resource from its value and +dots to separate resource name parts, +.I xdm +substitutes underscores for both dots and colons when generating the resource +name. +For example, \fBDisplayManager.expo_x_org_0.startup\fP is the name of the +resource which defines the startup shell file for the ``expo.x.org:0'' display. +.\" +.IP "\fBDisplayManager.servers\fP" +This resource either specifies a file name full of server entries, one per +line (if the value starts with a slash), or a single server entry. +See the section \fBLocal Server Specification\fP for the details. +.IP "\fBDisplayManager.requestPort\fP" +This indicates the UDP port number which +.I xdm +uses to listen for incoming XDMCP requests. Unless you need to debug the +system, leave this with its default value of 177. +.IP "\fBDisplayManager.errorLogFile\fP" +Error output is normally directed at the system console. To redirect it, +set this resource to a file name. A method to send these messages to +.I syslog +should be developed for systems which support it; however, the +wide variety of interfaces precludes any system-independent +implementation. This file also contains any output directed to stderr +by the \fIXsetup, Xstartup, Xsession\fP and \fIXreset\fP files, +so it will contain descriptions +of problems in those scripts as well. +.IP "\fBDisplayManager.debugLevel\fP" +If the integer value of this resource is greater than zero, +reams of +debugging information will be printed. It also disables daemon mode, which +would redirect the information into the bit-bucket, and +allows non-root users to run +.I xdm, +which would normally not be useful. +.IP "\fBDisplayManager.daemonMode\fP" +Normally, +.I xdm +attempts to make itself into a daemon process unassociated with any terminal. +This is +accomplished by forking and leaving the parent process to exit, then closing +file descriptors and releasing the controlling terminal. In some +environments this is not desired (in particular, when debugging). Setting +this resource to ``false'' will disable this feature. +.IP "\fBDisplayManager.pidFile\fP" +The filename specified will be created to contain an ASCII +representation of the process-id of the main +.I xdm +process. +.I Xdm +also uses file locking on this file +to attempt to eliminate multiple daemons running on +the same machine, which would cause quite a bit of havoc. +.IP "\fBDisplayManager.lockPidFile\fP" +This is the resource which controls whether +.I xdm +uses file locking to keep multiple display managers from running amok. +On System V, this +uses the \fIlockf\fP library call, while on BSD it uses \fIflock.\fP +.IP "\fBDisplayManager.authDir\fP" +This names a directory under which +.I xdm +stores authorization files while initializing the session. The +default value is \fI XDMXAUTHDIR.\fP +Can be overridden for specific displays by +DisplayManager.\fIDISPLAY\fP.authFile. +.IP \fBDisplayManager.autoRescan\fP +This boolean controls whether +.I xdm +rescans the configuration, servers, access control and authentication keys +files after a session terminates and the files have changed. By default it +is ``true.'' You can force +.I xdm +to reread these files by sending a SIGHUP to the main process. +.IP "\fBDisplayManager.removeDomainname\fP" +When computing the display name for XDMCP clients, the name resolver will +typically create a fully qualified host name for the terminal. As this is +sometimes confusing, +.I xdm +will remove the domain name portion of the host name if it is the same as the +domain name of the local host when this variable is set. By default the +value is ``true.'' +.IP "\fBDisplayManager.keyFile\fP" +XDM-AUTHENTICATION-1 style XDMCP authentication requires that a private key +be shared between +.I xdm +and the terminal. This resource specifies the file containing those +values. Each entry in the file consists of a display name and the shared +key. By default, +.I xdm +does not include support for XDM-AUTHENTICATION-1, as it requires DES which +is not generally distributable because of United States export restrictions. +.IP \fBDisplayManager.accessFile\fP +To prevent unauthorized XDMCP service and to allow forwarding of XDMCP +IndirectQuery requests, this file contains a database of hostnames which are +either allowed direct access to this machine, or have a list of hosts to +which queries should be forwarded to. The format of this file is described +in the section +.B "XDMCP Access Control." +.IP \fBDisplayManager.exportList\fP +A list of additional environment variables, separated by white space, +to pass on to the \fIXsetup\fP, +\fIXstartup\fP, \fIXsession\fP, and \fIXreset\fP programs. +.\" The command "if 'x.A'x' .ig" causes everything up to .. to be ignored +.\" if A is replaced by an empty string in the sed processing, otherwise +.\" it will be output as normal. +.if !'x.ARC4_RANDOM'x.' .ig +.IP \fBDisplayManager.randomFile\fP +A file to checksum to generate the seed of authorization keys. +This should be a file that changes frequently. +The default is \fI/dev/mem\fP. +.. +.if 'x.DEV_RANDOM'x.' .ig +.IP \fBDisplayManager.randomDevice\fP +A file to read 8 bytes from to generate the seed of authorization keys. +The default is \fI DEV_RANDOM \fP. If this file cannot be read, or if a +read blocks for more than 5 seconds, xdm falls back to using a checksum +of \fBDisplayManager.randomFile\fP to generate the seed. +.. +.if !'x.ARC4_RANDOM'x.' .ig +.IP \fBDisplayManager.prngdSocket\fP +.IP \fBDisplayManager.prngPort\fP +A UNIX domain socket name or a TCP socket port number on local host on +which a Pseudo-Random Number Generator Daemon, like EGD +(http://egd.sourceforge.net) is listening, in order to generate the +autorization keys. Either a non null port or a valid socket name must +be specified. The default is to use the Unix-domain socket +\fI/tmp/entropy\fP. +.PP +On systems that don't have such a daemon, a fall-back entropy +gathering system, based on various log file contents hashed by the MD5 +algorithm is used instead. +.. +.IP \fBDisplayManager.greeterLib\fP +On systems that support a dynamically-loadable greeter library, the +name of the library. The default is +\fI DEF_GREETER_LIB\fP. +.IP \fBDisplayManager.choiceTimeout\fP +Number of seconds to wait for display to respond after user has +selected a host from the chooser. If the display sends an XDMCP +IndirectQuery within this time, the request is forwarded to the chosen +host. Otherwise, it is assumed to be from a new session and the +chooser is offered again. +Default is 15. +.IP \fBDisplayManager.sourceAddress\fP +Use the numeric IP address of the incoming connection on multihomed hosts +instead of the host name. This is to avoid trying to connect on the wrong +interface which might be down at this time. +.IP \fBDisplayManager.willing\fP +This specifies a program which is run (as) root when an an XDMCP +BroadcastQuery is received and this host is configured to offer XDMCP +display management. The output of this program may be displayed on a chooser +window. If no program is specified, the string \fIWilling to manage\fP is +sent. +.PP +.\" +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.resources\fP" +This resource specifies the name of the file to be loaded by \fIxrdb\fP +as the resource database onto the root window of screen 0 of the display. +The \fIXsetup\fP program, the Login widget, and \fIchooser\fP will use +the resources set in this file. +This resource data base is loaded just before the authentication procedure +is started, so it can control the appearance of the login window. See the +section +.B "Authentication Widget," +which describes the various +resources that are appropriate to place in this file. +There is no default value for this resource, but +\fI XDMDIR/Xresources\fP +is the conventional name. +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.chooser\fP" +Specifies the program run to offer a host menu for Indirect queries +redirected to the special host name CHOOSER. +\fI CHOOSERPATH \fP is the default. +See the sections \fBXDMCP Access Control\fP and \fBChooser\fP. +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.xrdb\fP" +Specifies the program used to load the resources. By default, +.I xdm +uses \fI BINDIR/xrdb\fP. +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.cpp\fP" +This specifies the name of the C preprocessor which is used by \fIxrdb\fP. +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.setup\fP" +This specifies a program which is run (as root) before offering the +Login window. This may be used to change the appearance of the screen +around the Login window or to put up other windows (e.g., you may want +to run \fIxconsole\fP here). +By default, no program is run. The conventional name for a +file used here is \fIXsetup\fP. +See the section \fBSetup Program.\fP +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.startup\fP" +This specifies a program which is run (as root) after the authentication +process succeeds. By default, no program is run. The conventional name for a +file used here is \fIXstartup\fP. +See the section \fBStartup Program.\fP +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.session\fP" +This specifies the session to be executed (not running as root). +By default, \fI BINDIR/xterm\fP is +run. The conventional name is \fIXsession\fP. +See the section +.B "Session Program." +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.reset\fP" +This specifies a program which is run (as root) after the session terminates. +By default, no program is run. +The conventional name is \fIXreset\fP. +See the section +.B "Reset Program." +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.openDelay\fP" +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.openRepeat\fP" +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.openTimeout\fP" +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.startAttempts\fP" +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.reservAttempts\fP" +These numeric resources control the behavior of +.I xdm +when attempting to open intransigent servers. \fBopenDelay\fP is +the length of the +pause in seconds between successive attempts, \fBopenRepeat\fP is the +number of attempts to make, \fBopenTimeout\fP is the amount of time +to wait while actually +attempting the open (i.e., the maximum time spent in the +.IR connect (2) +system call) and \fBstartAttempts\fP is the number of times this +entire process is done before giving up on the server. +After \fBopenRepeat\fP attempts have been made, or +if \fBopenTimeout\fP seconds elapse in any particular attempt, +.I xdm +terminates and restarts the server, attempting to connect again. +This process is repeated \fBstartAttempts\fP times, at which point +the display is declared dead and disabled. Although +this behavior may seem arbitrary, it has been empirically developed and +works quite well on most systems. The bound \fBreservAttempts\fP +is the number of times a successful connect is allowed to be followed +by a fatal error. When reached, the display is disabled. +The default values are +\fBopenDelay\fP: 15, \fBopenRepeat\fP: 5, \fBopenTimeout\fP: 120, +\fBstartAttempts\fP: 4 and \fBreservAttempts\fP: 2. +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.pingInterval\fP" +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.pingTimeout\fP" +To discover when remote displays disappear, +.I xdm +occasionally pings them, using an X connection and \fIXSync\fP +calls. \fBpingInterval\fP specifies the time (in minutes) between each +ping attempt, \fBpingTimeout\fP specifies the maximum amount of time (in +minutes) to wait for the terminal to respond to the request. If the +terminal does not respond, the session is declared dead and terminated. By +default, both are set to 5 minutes. If you frequently use X terminals which +can become isolated from the managing host, you may wish to increase this +value. The only worry is that sessions will continue to exist after the +terminal has been accidentally disabled. +.I xdm +will not ping local displays. Although it would seem harmless, it is +unpleasant when the workstation session is terminated as a result of the +server hanging for NFS service and not responding to the ping. +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.terminateServer\fP" +This boolean resource specifies whether the X server should be terminated +when a session terminates (instead of resetting it). This option can be +used when the server tends to grow without bound over time, in order to limit +the amount of time the server is run. The default value is ``false.'' +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.userPath\fP" +.I Xdm +sets the PATH environment variable for the session to this value. It should +be a colon separated list of directories; see +.IR sh (__appmansuffix__) +for a full description. +The default value is ``DEF_USER_PATH''. +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.systemPath\fP" +.I Xdm +sets the PATH environment variable for the startup and reset scripts to the +value of this resource. The default for this resource is ``DEF_SYSTEM_PATH''. +Note the absence of ``.'' from this entry. This is a good practice to +follow for root; it avoids many common Trojan Horse system penetration +schemes. +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.systemShell\fP" +.I Xdm +sets the SHELL environment variable for the startup and reset scripts to the +value of this resource. It is \fI/bin/sh\fP by default. +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.failsafeClient\fP" +If the default session fails to execute, +.I xdm +will fall back to this program. This program is executed with no +arguments, but executes using the same environment variables as +the session would have had (see the section \fBSession Program\fP). +By default, \fI BINDIR/xterm\fP is used. +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.grabServer\fP" +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.grabTimeout\fP" +To improve security, +.I xdm +grabs the server and keyboard while reading the login name and password. +The +\fBgrabServer\fP resource specifies if the server should be held for the +duration of the name/password reading. When ``false,'' the server is ungrabbed +after the keyboard grab succeeds, otherwise the server is grabbed until just +before the session begins. The default is ``false.'' +The \fBgrabTimeout\fP resource specifies the maximum time +.I xdm +will wait for the grab to succeed. The grab may fail if some other +client has the server grabbed, or possibly if the network latencies +are very high. This resource has a default value of 3 seconds; you +should be cautious when raising it, as a user can be spoofed by a +look-alike window on the display. If the grab fails, +.I xdm +kills and restarts the server (if possible) and the session. +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.authorize\fP" +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.authName\fP" +\fBauthorize\fP is a boolean resource which controls whether +.I xdm +generates and uses authorization for the local server connections. If +authorization is used, \fBauthName\fP is a list +of authorization mechanisms to use, separated by white space. +XDMCP connections dynamically specify which +authorization mechanisms are supported, so +\fBauthName\fP is ignored in this case. When \fBauthorize\fP is set for a +display and authorization is not available, the user is informed by having a +different message displayed in the login widget. By default, \fBauthorize\fP +is ``true,'' \fBauthName\fP is ``MIT-MAGIC-COOKIE-1,'' or, if +XDM-AUTHORIZATION-1 is available, ``XDM-AUTHORIZATION-1\0MIT-MAGIC-COOKIE-1.'' +.IP \fBDisplayManager.\fP\fIDISPLAY\fP\fB.authFile\fP +This file is used to communicate the authorization data from +.I xdm +to the server, using the \fB\-auth\fP server command line option. +It should be +kept in a directory which is not world-writable as it could easily be +removed, disabling the authorization mechanism in the server. +If not specified, a name is generated from DisplayManager.authDir and +the name of the display. +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.authComplain\fP" +If set to ``false,'' disables the use of the \fBunsecureGreeting\fP +in the login window. +See the section \fBAuthentication Widget.\fP +The default is ``true.'' +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.resetSignal\fP" +The number of the signal \fIxdm\fP sends to reset the server. +See the section \fBControlling the Server.\fP +The default is 1 (SIGHUP). +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.termSignal\fP" +The number of the signal \fIxdm\fP sends to terminate the server. +See the section \fBControlling the Server.\fP +The default is 15 (SIGTERM). +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.resetForAuth\fP" +The original implementation of authorization in the sample server reread the +authorization file at server reset time, instead of when checking the +initial connection. As +.I xdm +generates the authorization information just before connecting to the +display, an old server would not get up-to-date authorization information. +This resource causes +.I xdm +to send SIGHUP to the server after setting up the file, causing an +additional server reset to occur, during which time the new authorization +information will be read. +The default is ``false,'' which will work for all MIT servers. +.IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.userAuthDir\fP" +When +.I xdm +is unable to write to the usual user authorization file ($HOME/.Xauthority), +it creates a unique file name in this directory and points the environment +variable XAUTHORITY at the created file. It uses \fI/tmp\fP by default. +.SH "CONFIGURATION FILE" +First, the +.I xdm +configuration file should be set up. +Make a directory (usually \fI XDMDIR\fP) to contain all +of the relevant files. +.LP +Here is a reasonable configuration file, which could be +named \fIxdm-config\fP: +.nf + +.ta .5i 4i + + DisplayManager.servers: XDMDIR/Xservers + DisplayManager.errorLogFile: XDMLOGDIR/xdm.log + DisplayManager*resources: XDMDIR/Xresources + DisplayManager*startup: XDMDIR/Xstartup + DisplayManager*session: XDMDIR/Xsession + DisplayManager.pidFile: XDMPIDDIR/xdm-pid + DisplayManager._0.authorize: true + DisplayManager*authorize: false + +.fi +.PP +Note that this file mostly contains references to other files. Note also +that some of the resources are specified with ``*'' separating the +components. These resources can be made unique for each different display, +by replacing the ``*'' with the display-name, but normally this is not very +useful. See the \fBResources\fP section for a complete discussion. +.SH "XDMCP ACCESS CONTROL" +.PP +The database file specified by the \fBDisplayManager.accessFile\fP provides +information which +.I xdm +uses to control access from displays requesting XDMCP service. This file +contains three types of entries: entries which control the response to +Direct and Broadcast queries, entries which control the response to +Indirect queries, and macro definitions. +.PP +The format of the Direct entries is simple, either a host name or a +pattern, which is distinguished from a host name by the inclusion of +one or more meta characters (`*' matches any sequence of 0 or more +characters, and `?' matches any single character) which are compared against +the host name of the display device. +If the entry is a host name, all comparisons are done using +network addresses, so any name which converts to the correct network address +may be used. +For patterns, only canonical host names are used +in the comparison, so ensure that you do not attempt to match +aliases. +Preceding either a host name or a pattern with a `!' character +causes hosts which +match that entry to be excluded. +.PP +To only respond to Direct queries for a host or pattern, +it can be followed by the optional ``NOBROADCAST'' keyword. +This can be used to prevent an xdm server from appearing on +menus based on Broadcast queries. +.PP +An Indirect entry also contains a host name or pattern, +but follows it with a list of +host names or macros to which indirect queries should be sent. +.PP +A macro definition contains a macro name and a list of host names and +other macros that +the macro expands to. To distinguish macros from hostnames, macro +names start with a `%' character. Macros may be nested. +.PP +Indirect entries +may also specify to have \fIxdm\fP run \fIchooser\fP to offer a menu +of hosts to connect to. See the section \fBChooser\fP. +.PP +When checking access for a particular display host, each entry is scanned in +turn and the first matching entry determines the response. Direct and +Broadcast +entries are ignored when scanning for an Indirect entry and vice-versa. +.PP +Blank lines are ignored, `#' is treated as a comment +delimiter causing the rest of that line to be ignored, +and `\e\fInewline\fP' +causes the newline to be ignored, allowing indirect host lists to span +multiple lines. +.PP +Here is an example Xaccess file: +.LP +.ta 2i 4i +.nf +# +# Xaccess \- XDMCP access control file +# + +# +# Direct/Broadcast query entries +# + +!xtra.lcs.mit.edu # disallow direct/broadcast service for xtra +bambi.ogi.edu # allow access from this particular display +*.lcs.mit.edu # allow access from any display in LCS + +*.deshaw.com NOBROADCAST # allow only direct access +*.gw.com # allow direct and broadcast + +# +# Indirect query entries +# + +%HOSTS expo.lcs.mit.edu xenon.lcs.mit.edu \\ + excess.lcs.mit.edu kanga.lcs.mit.edu + +extract.lcs.mit.edu xenon.lcs.mit.edu #force extract to contact xenon +!xtra.lcs.mit.edu dummy #disallow indirect access +*.lcs.mit.edu %HOSTS #all others get to choose +.fi +.PP +If compiled with IPv6 support, multicast address groups may also be included +in the list of addresses indirect queries are set to. Multicast addresses +may be followed by an optional / character and hop count. If no hop count is +specified, the multicast hop count defaults to 1, keeping the packet on the +local network. For IPv4 multicasting, the hop count is used as the TTL. +.PP +Examples: +.LP +.ta 2.1i 4.5i +.nf +rincewind.sample.net ff02::1 #IPv6 Multicast to ff02::1 +\& #with a hop count of 1 +ponder.sample.net CHOOSER 239.192.1.1/16 #Offer a menu of hosts +\& #who respond to IPv4 Multicast +\& # to 239.192.1.1 with a TTL of 16 +.fi +.SH CHOOSER +.PP +For X terminals that do not offer a host menu for use with Broadcast +or Indirect queries, the \fIchooser\fP program can do this for them. +In the \fIXaccess\fP file, specify ``CHOOSER'' as the first entry in +the Indirect host list. \fIChooser\fP will send a Query request to +each of the remaining host names in the list and offer a menu of all +the hosts that respond. +.PP +The list may consist of the word ``BROADCAST,'' in which case +\fIchooser\fP will send a Broadcast instead, again offering a menu of +all hosts that respond. Note that on some operating systems, UDP +packets cannot be broadcast, so this feature will not work. +.PP +Example \fIXaccess\fP file using \fIchooser\fP: + +.nf +extract.lcs.mit.edu CHOOSER %HOSTS #offer a menu of these hosts +xtra.lcs.mit.edu CHOOSER BROADCAST #offer a menu of all hosts +.fi +.PP +The program to use for \fIchooser\fP is specified by the +\fBDisplayManager.\fP\fIDISPLAY\fP\fB.chooser\fP resource. For more +flexibility at this step, the chooser could be a shell script. +\fIChooser\fP is the session manager here; it is run instead of a +child \fIxdm\fP to manage the display. +.PP +Resources for this program +can be put into the file named by +\fBDisplayManager.\fP\fIDISPLAY\fP\fB.resources\fP. +.PP +When the user selects a host, \fIchooser\fP prints the host chosen, +which is read by the parent \fIxdm\fP, and exits. +\fIxdm\fP closes its connection to the X server, and the server resets +and sends another \fBIndirect\fP XDMCP request. +\fIxdm\fP remembers the user's choice (for +\fBDisplayManager.choiceTimeout\fP seconds) and forwards the request +to the chosen host, which starts a session on that display. +.\" +.SH LISTEN +The following configuration directive is also defined for the Xaccess +configuration file: +.IP "\fBLISTEN\fP \fIinterface\fP \fI[list of multicast group addresses]\fP" +\fIinterface\fP may be a hostname or IP address representing a +network interface on this machine, or the wildcard * to represent all +available network interfaces. +.PP +If one or more LISTEN lines are specified, xdm only listens for XDMCP +connections on the specified interfaces. If multicast group addresses +are listed on a listen line, xdm joins the multicast groups on the +given interface. +.PP +If no LISTEN lines are given, the original behavior of listening on +all interfaces is preserved for backwards compatibility. +Additionally, if no LISTEN is specified, xdm joins the default XDMCP +IPv6 multicast group, when compiled with IPv6 support. +.PP +To disable listening for XDMCP connections altogther, a line of LISTEN +with no addresses may be specified, or the previously supported method +of setting DisplayManager.requestPort to 0 may be used. +.PP +Examples: +.ta 2i 4i +.nf +LISTEN * ff02::1 # Listen on all interfaces and to the +\& # ff02::1 IPv6 multicast group. +LISTEN 10.11.12.13 # Listen only on this interface, as long +\& # as no other listen directives appear in +\& # file. +.fi +.SH "IPv6 MULTICAST ADDRESS SPECIFICATION" +.PP +The Internet Assigned Numbers Authority has has assigned +ff0\fIX\fP:0:0:0:0:0:0:12b as the permanently assigned range of +multicast addresses for XDMCP. The \fIX\fP in the prefix may be replaced +by any valid scope identifier, such as 1 for Interface-Local, 2 for Link-Local, +5 for Site-Local, and so on. (See IETF RFC 4291 or its replacement for +further details and scope definitions.) xdm defaults to listening on the +Link-Local scope address ff02:0:0:0:0:0:0:12b to most closely match the +old IPv4 subnet broadcast behavior. +.SH "LOCAL SERVER SPECIFICATION" +.PP +The resource \fBDisplayManager.servers\fP gives a server specification +or, if the values starts with a slash (/), the name of a file +containing server specifications, one per line. +.PP +Each specification +indicates a display which should constantly be managed and which is +not using XDMCP. +This method is used typically for local servers only. If the resource +or the file named by the resource is empty, \fIxdm\fP will offer XDMCP +service only. +.PP +Each specification consists of at least three parts: a display +name, a display class, a display type, and (for local servers) a command +line to start the server. A typical entry for local display number 0 would +be: +.nf + + :0 Digital-QV local BINDIR/X :0 + +.fi +The display types are: +.ta 1i +.nf + +local local display: \fIxdm\fP must run the server +foreign remote display: \fIxdm\fP opens an X connection to a running server + +.fi +.PP +The display name must be something that can be passed in the \fB\-display\fP +option to an X program. This string is used to generate the display-specific +resource names, so be careful to match the +names (e.g., use ``:0 Sun-CG3 local BINDIR/X :0'' instead of +``localhost:0 Sun-CG3 local BINDIR/X :0'' +if your other resources are specified as +``DisplayManager._0.session''). The display class portion is also used in the +display-specific resources, as the class of the resource. This is +useful if you have a large collection of similar displays (such as a corral of +X terminals) and would like to set resources for groups of them. When using +XDMCP, the display is required to specify the display class, so the manual +for your particular X terminal should document the display class +string for your device. If it doesn't, you can run +.I xdm +in debug mode and +look at the resource strings which it generates for that device, which will +include the class string. +.PP +When \fIxdm\fP starts a session, it sets up authorization data for the +server. For local servers, \fIxdm\fP passes +``\fB\-auth\fP \fIfilename\fP'' on the server's command line to point +it at its authorization data. +For XDMCP servers, \fIxdm\fP passes the +authorization data to the server via the \fBAccept\fP XDMCP request. +.SH RESOURCES FILE +The \fIXresources\fP file is +loaded onto the display as a resource database using +.I xrdb. +As the authentication +widget reads this database before starting up, it usually contains +parameters for that widget: +.nf +.ta .5i 1i + + xlogin*login.translations: #override\\ + Ctrl<Key>R: abort-display()\\n\\ + <Key>F1: set-session-argument(failsafe) finish-field()\\n\\ + <Key>Return: set-session-argument() finish-field() + xlogin*borderWidth: 3 + xlogin*greeting: CLIENTHOST +\& #ifdef COLOR + xlogin*greetColor: CadetBlue + xlogin*failColor: red +\& #endif + +.fi +.PP +Please note the translations entry; it specifies +a few new translations for the widget which allow users to escape from the +default session (and avoid troubles that may occur in it). Note that if +\&#override is not specified, the default translations are removed and replaced +by the new value, not a very useful result as some of the default translations +are quite useful (such as ``<Key>: insert-char ()'' which responds to normal +typing). +.PP +This file may also contain resources for the setup program and \fIchooser\fP. +.SH "SETUP PROGRAM" +The \fIXsetup\fP file is run after +the server is reset, but before the Login window is offered. +The file is typically a shell script. +It is run as root, so should be careful about security. +This is the place to change the root background or bring up other +windows that should appear on the screen along with the Login widget. +.PP +In addition to any specified by \fBDisplayManager.exportList\fP, +the following environment variables are passed: +.nf +.ta .5i 2i + + DISPLAY the associated display name + PATH the value of \fBDisplayManager.\fP\fIDISPLAY\fP\fB.systemPath\fP + SHELL the value of \fBDisplayManager.\fP\fIDISPLAY\fP\fB.systemShell\fP + XAUTHORITY may be set to an authority file +.fi +.PP +Note that since \fIxdm\fP grabs the keyboard, any other windows will not be +able to receive keyboard input. They will be able to interact with +the mouse, however; beware of potential security holes here. +If \fBDisplayManager.\fP\fIDISPLAY\fP\fB.grabServer\fP is set, +\fIXsetup\fP will not be able to connect +to the display at all. +Resources for this program +can be put into the file named by +\fBDisplayManager.\fP\fIDISPLAY\fP\fB.resources\fP. +.PP +Here is a sample \fIXsetup\fP script: +.nf + +\& #!/bin/sh +\& # Xsetup_0 \- setup script for one workstation + xcmsdb < XDMDIR/monitors/alex.0 + xconsole\0\-geometry\0480x130\-0\-0\0\-notify\0\-verbose\0\-exitOnFail & + +.fi +.SH "AUTHENTICATION WIDGET" +The authentication widget prompts the user for the username, password, and/or +other required authentication data from the keyboard. Nearly every imaginable +parameter can be controlled with a resource. Resources for this widget +should be put into the file named by +\fBDisplayManager.\fP\fIDISPLAY\fP\fB.resources\fP. All of these have reasonable +default values, so it is not necessary to specify any of them. +.PP +The resource file is loaded with +.IR xrdb (__appmansuffix__) +so it may use the substitutions defined by that program such as CLIENTHOST +for the client hostname in the login message, or C pre-processor #ifdef +statements to produce different displays depending on color depth or other +variables. +.PP +.I Xdm +can be compiled with support for the +.IR Xft (__libmansuffix__) +library for font rendering. If this support is present, font faces are +specified using the resources with names ending in ``face'' in the +fontconfig face format described in the +.I Font Names +section of +.IR fonts.conf (__filemansuffix__). +If not, then fonts are specified using the resources with names ending +in ``font'' in the traditional +.I X Logical Font Description +format described in the +.I Font Names +section of +.IR X (__miscmansuffix__). +.IP "\fBxlogin.Login.width, xlogin.Login.height, xlogin.Login.x, xlogin.Login.y\fP" +The geometry of the Login widget is normally computed automatically. If you +wish to position it elsewhere, specify each of these resources. +.IP "\fBxlogin.Login.foreground\fP" +The color used to display the input typed by the user. +.IP "\fBxlogin.Login.face\fP" +The face used to display the input typed by the user when built with Xft +support. The default is ``Serif-18''. +.IP "\fBxlogin.Login.font\fP" +The font used to display the input typed by the user when not built with Xft +support. +.IP "\fBxlogin.Login.greeting\fP" +A string which identifies this window. +The default is ``X Window System.'' +.IP "\fBxlogin.Login.unsecureGreeting\fP" +When X authorization is requested in the configuration file for this +display and none is in use, this greeting replaces the standard +greeting. The default is ``This is an unsecure session'' +.IP "\fBxlogin.Login.greetFace\fP" +The face used to display the greeting when built with Xft support. +The default is ``Serif-24:italic''. +.IP "\fBxlogin.Login.greetFont\fP" +The font used to display the greeting when not built with Xft support. +.IP "\fBxlogin.Login.greetColor\fP" +The color used to display the greeting. +.IP "\fBxlogin.Login.namePrompt\fP" +The string displayed to prompt for a user name. +.I Xrdb +strips trailing white space from resource values, so to add spaces at +the end of the prompt (usually a nice thing), add spaces escaped with +backslashes. The default is ``Login: '' +.IP "\fBxlogin.Login.passwdPrompt\fP" +The string displayed to prompt for a password, when not using an authentication +system such as PAM that provides its own prompts. +The default is ``Password: '' +.IP "\fBxlogin.Login.promptFace\fP" +The face used to display prompts when built with Xft support. +The default is ``Serif-18:bold''. +.IP "\fBxlogin.Login.promptFont\fP" +The font used to display prompts when not built with Xft support. +.IP "\fBxlogin.Login.promptColor\fP" +The color used to display prompts. +.IP "\fBxlogin.Login.changePasswdMessage\fP" +A message which is displayed when the users password has expired. +The default is ``Password Change Required'' +.IP "\fBxlogin.Login.fail\fP" +A message which is displayed when the authentication fails, when not using an +authentication system such as PAM that provides its own prompts. +The default is ``Login incorrect'' +.IP "\fBxlogin.Login.failFace\fP" +The face used to display the failure message when built with Xft support. +The default is ``Serif-18:bold''. +.IP "\fBxlogin.Login.failFont\fP" +The font used to display the failure message when not built with Xft support. +.IP "\fBxlogin.Login.failColor\fP" +The color used to display the failure message. +.IP "\fBxlogin.Login.failTimeout\fP" +The number of seconds that the failure message is displayed. +The default is 10. +.IP "\fBxlogin.Login.logoFileName\fP" +Name of an XPM format pixmap to display in the greeter window, if built with +XPM support. The default is no pixmap. +.IP "\fBxlogin.Login.logoPadding\fP" +Number of pixels of space between the logo pixmap and other elements of the +greeter window, if the pixmap is displayed. +The default is 5. +.IP "\fBxlogin.Login.useShape\fP" +If set to ``true'', when built with XPM support, attempt to use the +X Non-Rectangular Window Shape Extension to set the window shape. +The default is ``true''. +.IP "\fBxlogin.Login.hiColor\fP, \fBxlogin.Login.shdColor\fP" +Raised appearance bezels may be drawn around +the greeter frame and text input boxes by setting these resources. hiColor +is the highlight color, used on the top and left sides of the frame, and the +bottom and right sides of text input areas. shdColor is the shadow color, +used on the bottom and right sides of the frame, and the top and left sides +of text input areas. +The default for both is the foreground color, providing a flat appearance. +.IP "\fBxlogin.Login.frameWidth\fP" +frameWidth is the width in pixels of the area +around the greeter frame drawn in hiColor and shdColor. +.IP "\fBxlogin.Login.innerFramesWidth\fP" +innerFramesWidth is the width in pixels of the +area around text input areas drawn in hiColor and shdColor. +.IP "\fBxlogin.Login.sepWidth\fP" +sepWidth is the width in pixels of the +bezeled line between the greeting and input areas +drawn in hiColor and shdColor. +.IP "\fBxlogin.Login.allowRootLogin\fP" +If set to ``false'', don't allow root (and any other user with uid = 0) to +log in directly. +The default is ``true''. +This setting is only checked by some of the authentication backends at this +time. +.IP "\fBxlogin.Login.allowNullPasswd\fP" +If set to ``true'', allow an otherwise failing password match to succeed +if the account does not require a password at all. +The default is ``false'', so only users that have passwords assigned can +log in. +.IP "\fBxlogin.Login.echoPasswd\fP" +If set to ``true'', a placeholder character (echoPasswdChar) will be shown +for fields normally set to not echo, such as password input. +The default is ``false''. +.IP "\fBxlogin.Login.echoPasswdChar\fP" +Character to display if echoPasswd is true. The default is ``*''. +If set to an empty value, the cursor will advance for each character input, +but no text will be drawn. +.IP "\fBxlogin.Login.translations\fP" +This specifies the translations used for the login widget. Refer to the X +Toolkit documentation for a complete discussion on translations. The default +translation table is: +.nf +.ta .5i 2i + + Ctrl<Key>H: delete-previous-character() \\n\\ + Ctrl<Key>D: delete-character() \\n\\ + Ctrl<Key>B: move-backward-character() \\n\\ + Ctrl<Key>F: move-forward-character() \\n\\ + Ctrl<Key>A: move-to-begining() \\n\\ + Ctrl<Key>E: move-to-end() \\n\\ + Ctrl<Key>K: erase-to-end-of-line() \\n\\ + Ctrl<Key>U: erase-line() \\n\\ + Ctrl<Key>X: erase-line() \\n\\ + Ctrl<Key>C: restart-session() \\n\\ + Ctrl<Key>\\\\: abort-session() \\n\\ + <Key>BackSpace: delete-previous-character() \\n\\ + <Key>Delete: delete-previous-character() \\n\\ + <Key>Return: finish-field() \\n\\ + <Key>: insert-char() \\ + +.fi +.PP +The actions which are supported by the widget are: +.IP "delete-previous-character" +Erases the character before the cursor. +.IP "delete-character" +Erases the character after the cursor. +.IP "move-backward-character" +Moves the cursor backward. +.IP "move-forward-character" +Moves the cursor forward. +.IP "move-to-begining" +(Apologies about the spelling error.) +Moves the cursor to the beginning of the editable text. +.IP "move-to-end" +Moves the cursor to the end of the editable text. +.IP "erase-to-end-of-line" +Erases all text after the cursor. +.IP "erase-line" +Erases the entire text. +.IP "finish-field" +If the cursor is in the name field, proceeds to the password field; if the +cursor is in the password field, checks the current name/password pair. If +the name/password pair is valid, \fIxdm\fP +starts the session. Otherwise the failure message is displayed and +the user is prompted again. +.IP "abort-session" +Terminates and restarts the server. +.IP "abort-display" +Terminates the server, disabling it. This action +is not accessible in the default configuration. +There are various reasons to stop \fIxdm\fP on a system console, such as +when shutting the system down, when using \fIxdmshell\fP, +to start another type of server, or to generally access the console. +Sending \fIxdm\fP a SIGHUP will restart the display. See the section +\fBControlling XDM\fP. +.IP "restart-session" +Resets the X server and starts a new session. This can be used when +the resources have been changed and you want to test them or when +the screen has been overwritten with system messages. +.IP "insert-char" +Inserts the character typed. +.IP "set-session-argument" +Specifies a single word argument which is passed to the session at startup. +See the section \fBSession Program\fP. +.IP "allow-all-access" +Disables access control in the server. This can be used when +the .Xauthority file cannot be created by +.I xdm. +Be very careful using this; +it might be better to disconnect the machine from the network +before doing this. +.PP +On some systems (OpenBSD) the user's shell must be listed in +.I /etc/shells +to allow login through xdm. The normal password and account expiration +dates are enforced too. +.SH "STARTUP PROGRAM" +.PP +The \fIXstartup\fP program is run as +root when the user logs in. +It is typically a shell script. +Since it is run as root, \fIXstartup\fP should be +very careful about security. This is the place to put commands which add +entries to \fIutmp\fP or \fIwtmp\fP files, +(the \fIsessreg\fP program may be useful here), +mount users' home directories from file servers, +or abort the session if logins are not +allowed. +.PP +In addition to any specified by \fBDisplayManager.exportList\fP, +the following environment variables are passed: +.nf +.ta .5i 2i + + DISPLAY the associated display name + HOME the initial working directory of the user + LOGNAME the user name + USER the user name + PATH the value of \fBDisplayManager.\fP\fIDISPLAY\fP\fB.systemPath\fP + SHELL the value of \fBDisplayManager.\fP\fIDISPLAY\fP\fB.systemShell\fP + XAUTHORITY may be set to an authority file + WINDOWPATH may be set to the "window path" leading to the X server + +.fi +.PP +No arguments are passed to the script. +.I Xdm +waits until this script exits before starting the user session. If the +exit value of this script is non-zero, +.I xdm +discontinues the session and starts another authentication +cycle. +.PP +The sample \fIXstartup\fP file shown here prevents login while the +file \fI/etc/nologin\fP +exists. +Thus this is not a complete example, but +simply a demonstration of the available functionality. +.PP +Here is a sample \fIXstartup\fP script: +.nf +.ta .5i 1i + +\& #!/bin/sh +\& # +\& # Xstartup +\& # +\& # This program is run as root after the user is verified +\& # + if [ \-f /etc/nologin ]; then + xmessage\0\-file /etc/nologin\0\-timeout 30\0\-center + exit 1 + fi + sessreg\0\-a\0\-l $DISPLAY\0\-x XDMDIR/Xservers $LOGNAME + XDMDIR/GiveConsole + exit 0 +.fi +.SH "SESSION PROGRAM" +.PP +The \fIXsession\fP program is the command which is run as the user's session. +It is run with +the permissions of the authorized user. +.PP +In addition to any specified by \fBDisplayManager.exportList\fP, +the following environment variables are passed: +.nf +.ta .5i 2i + + DISPLAY the associated display name + HOME the initial working directory of the user + LOGNAME the user name + USER the user name + PATH the value of \fBDisplayManager.\fP\fIDISPLAY\fP\fB.userPath\fP + SHELL the user's default shell (from \fIgetpwnam\fP) + XAUTHORITY may be set to a non-standard authority file + KRB5CCNAME may be set to a Kerberos credentials cache name + WINDOWPATH may be set to the "window path" leading to the X server + +.fi +.PP +At most installations, \fIXsession\fP should look in $HOME for +a file \fI\.xsession,\fP +which contains commands that each user would like to use as a session. +\fIXsession\fP should also +implement a system default session if no user-specified session exists. +.PP +An argument may be passed to this program from the authentication widget +using the `set-session-argument' action. This can be used to select +different styles of session. One good use of this feature is to allow +the user to escape from the ordinary session when it fails. This +allows users to repair their own \fI.xsession\fP if it fails, +without requiring administrative intervention. +The example following +demonstrates this feature. +.PP +This example recognizes +the special +``failsafe'' mode, specified in the translations +in the \fIXresources\fP file, to provide an escape +from the ordinary session. It also requires that the .xsession file +be executable so we don't have to guess what shell it wants to use. +.nf +.ta .5i 1i 1.5i + +\& #!/bin/sh +\& # +\& # Xsession +\& # +\& # This is the program that is run as the client +\& # for the display manager. + + case $# in + 1) + case $1 in + failsafe) + exec xterm \-geometry 80x24\-0\-0 + ;; + esac + esac + + startup=$HOME/.xsession + resources=$HOME/.Xresources + + if [ \-f "$startup" ]; then + exec "$startup" + else + if [ \-f "$resources" ]; then + xrdb \-load "$resources" + fi + twm & + xman \-geometry +10\-10 & + exec xterm \-geometry 80x24+10+10 \-ls + fi + +.fi +.PP +The user's \fI.xsession\fP file might look something like this +example. Don't forget that the file must have execute permission. +.nf +\& #! /bin/csh +\& # no \-f in the previous line so .cshrc gets run to set $PATH + twm & + xrdb \-merge "$HOME/.Xresources" + emacs \-geometry +0+50 & + xbiff \-geometry \-430+5 & + xterm \-geometry \-0+50 -ls +.fi +.SH "RESET PROGRAM" +.PP +Symmetrical with \fIXstartup\fP, +the \fIXreset\fP script is run after the user session has +terminated. Run as root, it should contain commands that undo +the effects of commands in \fIXstartup,\fP updating entries +in \fIutmp\fP or \fIwtmp\fP files, +or unmounting directories from file servers. The environment +variables that were passed to \fIXstartup\fP are also +passed to \fIXreset\fP. +.PP +A sample \fIXreset\fP script: +.nf +.ta .5i 1i +\& #!/bin/sh +\& # +\& # Xreset +\& # +\& # This program is run as root after the session ends +\& # + sessreg\0\-d\0\-l $DISPLAY\0\-x XDMDIR/Xservers $LOGNAME + XDMDIR/TakeConsole + exit 0 +.fi +.SH "CONTROLLING THE SERVER" +.I Xdm +controls local servers using POSIX signals. SIGHUP is expected to reset the +server, closing all client connections and performing other cleanup +duties. SIGTERM is expected to terminate the server. +If these signals do not perform the expected actions, +the resources \fBDisplayManager.\fP\fIDISPLAY\fP\fB.resetSignal\fP and +\fBDisplayManager.\fP\fIDISPLAY\fP\fB.termSignal\fP can specify alternate signals. +.PP +To control remote terminals not using XDMCP, +.I xdm +searches the window hierarchy on the display and uses the protocol request +KillClient in an attempt to clean up the terminal for the next session. This +may not actually kill all of the clients, as only those which have created +windows will be noticed. XDMCP provides a more sure mechanism; when +.I xdm +closes its initial connection, the session is over and the terminal is +required to close all other connections. +.SH "CONTROLLING XDM" +.PP +.I Xdm +responds to two signals: SIGHUP and SIGTERM. When sent a SIGHUP, +.I xdm +rereads the configuration file, the access control file, and the servers +file. For the servers file, it notices if entries have been added or +removed. If a new entry has been added, +.I xdm +starts a session on the associated display. Entries which have been removed +are disabled immediately, meaning that any session in progress will be +terminated without notice and no new session will be started. +.PP +When sent a SIGTERM, +.I xdm +terminates all sessions in progress and exits. This can be used when +shutting down the system. +.PP +.I Xdm +attempts to mark its various sub-processes for +.IR ps (__appmansuffix__) +by editing the +command line argument list in place. Because +.I xdm +can't allocate additional +space for this task, it is useful to start +.I xdm +with a reasonably long +command line (using the full path name should be enough). +Each process which is +servicing a display is marked \fB\-\fP\fIdisplay.\fP +.SH "ADDITIONAL LOCAL DISPLAYS" +.PP +To add an additional local display, add a line for it to the +\fIXservers\fP file. +(See the section \fBLocal Server Specification\fP.) +.PP +Examine the display-specific resources in \fIxdm-config\fP +(e.g., \fBDisplayManager._0.authorize\fP) +and consider which of them should be copied for the new display. +The default \fIxdm-config\fP has all the appropriate lines for +displays \fB:0\fP and \fB:1\fP. +.SH "OTHER POSSIBILITIES" +.PP +You can use \fIxdm\fP +to run a single session at a time, using the 4.3 \fIinit\fP +options or other suitable daemon by specifying the server on the command +line: +.nf +.ta .5i + + xdm \-server \(lq:0 SUN-3/60CG4 local BINDIR/X :0\(rq + +.fi +.PP +Or, you might have a file server and a collection of X terminals. The +configuration for this is identical to the sample above, +except the \fIXservers\fP file would look like +.nf +.ta .5i + + extol:0 VISUAL-19 foreign + exalt:0 NCD-19 foreign + explode:0 NCR-TOWERVIEW3000 foreign + +.fi +.PP +This directs +.I xdm +to manage sessions on all three of these terminals. See the section +\fBControlling Xdm\fP for a description of using signals to enable +and disable these terminals in a manner reminiscent of +.IR init (__adminmansuffix__). +.SH LIMITATIONS +One thing that +.I xdm +isn't very good at doing is coexisting with other window systems. To use +multiple window systems on the same hardware, you'll probably be more +interested in +.I xinit. +.SH FILES +.TP 20 +.I XDMDIR/xdm-config +the default configuration file +.TP 20 +.I $HOME/.Xauthority +user authorization file where \fIxdm\fP stores keys for clients to read +.TP 20 +.I CHOOSERPATH +the default chooser +.TP 20 +.I BINDIR/xrdb +the default resource database loader +.TP 20 +.I BINDIR/X +the default server +.TP 20 +.I BINDIR/xterm +the default session program and failsafe client +.TP 20 +.I XDMXAUTHDIR/A<display>\-<suffix> +the default place for authorization files +.TP 20 +.I /tmp/K5C<display> +Kerberos credentials cache +.SH "SEE ALSO" +.IR X (__miscmansuffix__), +.IR xinit (__appmansuffix__), +.IR xauth (__appmansuffix__), +.IR xrdb (__appmansuffix__), +.IR Xsecurity (__miscmansuffix__), +.IR sessreg (__appmansuffix__), +.IR Xserver (__appmansuffix__), +.\" .IR chooser (__appmansuffix__), \" except that there isn't a manual for it yet +.IR xdmshell (__appmansuffix__), +.IR fonts.conf (__filemansuffix__). +.br +.I "X Display Manager Control Protocol" +.br +.RI "IETF RFC 4291: " "IP Version 6 Addressing Architecture" . +.SH AUTHOR +Keith Packard, MIT X Consortium diff --git a/xdm/Makefile.am b/xdm/Makefile.am new file mode 100644 index 0000000..d38b198 --- /dev/null +++ b/xdm/Makefile.am @@ -0,0 +1,56 @@ +# +# Copyright 2005 Red Hat, Inc. +# +# 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, and that the name of Red Hat not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Red Hat makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +bin_PROGRAMS = xdm + +AM_CPPFLAGS = -I$(top_srcdir)/include +AM_CFLAGS = $(CWARNFLAGS) $(XDM_CFLAGS) + +AM_LDFLAGS = $(XDM_LIBS) + +LDADD = ../greeter/libXdmGreet.la + +xdm_SOURCES = \ + auth.c \ + dm.c \ + dpylist.c \ + error.c \ + file.c \ + genauth.c \ + mitauth.c \ + netaddr.c \ + reset.c \ + resource.c \ + server.c \ + session.c \ + util.c \ + xdmauth.c + +AM_CFLAGS += -DHASXDMAUTH + +if LINT +ALL_LINT_FLAGS=$(LINT_FLAGS) $(DEFS) $(DEFAULT_INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) + +lint: + $(LINT) $(ALL_LINT_FLAGS) $(xdm_SOURCES) $(XDM_LIBS) + +endif LINT diff --git a/xdm/auth.c b/xdm/auth.c new file mode 100644 index 0000000..b725461 --- /dev/null +++ b/xdm/auth.c @@ -0,0 +1,1025 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * auth.c + * + * maintain the authorization generation daemon + */ + +#include <X11/X.h> +#include <X11/Xlibint.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include "dm.h" +#include "dm_auth.h" +#include "dm_error.h" +#ifdef X_PRIVSEP +#include <pwd.h> +#endif + +#include <errno.h> + +#include <sys/ioctl.h> + +#if defined(TCPCONN) +# include "dm_socket.h" +# include <netinet/in.h> +#endif + + +struct AuthProtocol { + unsigned short name_length; + const char *name; + void (*InitAuth)(unsigned short len, char *name); + Xauth *(*GetAuth)(unsigned short len, char *name); + void (*GetXdmcpAuth)( + struct protoDisplay *pdpy, + unsigned short authorizationNameLen, + char *authorizationName); + int inited; +}; + +static struct AuthProtocol AuthProtocols[] = { +{ (unsigned short) 18, "MIT-MAGIC-COOKIE-1", + MitInitAuth, MitGetAuth, NULL +}, +{ (unsigned short) 19, "XDM-AUTHORIZATION-1", + XdmInitAuth, XdmGetAuth, XdmGetXdmcpAuth, +}, +}; + +#define NUM_AUTHORIZATION (sizeof (AuthProtocols) / sizeof (AuthProtocols[0])) + +static struct AuthProtocol * +findProtocol (unsigned short name_length, char *name) +{ + int i; + + for (i = 0; i < NUM_AUTHORIZATION; i++) + if (AuthProtocols[i].name_length == name_length && + memcmp(AuthProtocols[i].name, name, name_length) == 0) + { + return &AuthProtocols[i]; + } + return (struct AuthProtocol *) 0; +} + +int +ValidAuthorization (unsigned short name_length, char *name) +{ + if (findProtocol (name_length, name)) + return TRUE; + return FALSE; +} + +static Xauth * +GenerateAuthorization (unsigned short name_length, char *name) +{ + struct AuthProtocol *a; + Xauth *auth = NULL; + int i; + + Debug ("GenerateAuthorization %*.*s\n", + name_length, name_length, name); + a = findProtocol (name_length, name); + if (a) + { + if (!a->inited) + { + (*a->InitAuth) (name_length, name); + a->inited = TRUE; + } + auth = (*a->GetAuth) (name_length, name); + if (auth) + { + Debug ("Got %p (%d %*.*s) ", auth, + auth->name_length, auth->name_length, + auth->name_length, auth->name); + for (i = 0; i < (int)auth->data_length; i++) + Debug (" %02x", auth->data[i] & 0xff); + Debug ("\n"); + } + else + Debug ("Got (null)\n"); + } + else + { + Debug ("Unknown authorization %*.*s\n", name_length, name_length, name); + } + return auth; +} + +void +CleanUpFileName (char *src, char *dst, int len) +{ + while (*src) { + if (--len <= 0) + break; + switch (*src & 0x7f) + { + case '/': + *dst++ = '_'; + break; + case '-': + *dst++ = '.'; + break; + default: + *dst++ = (*src & 0x7f); + } + ++src; + } + *dst = '\0'; +} + +/* Checks to see if specified directory exists, makes it if not + * Returns: 0 if already exists, 1 if created, < 0 if error occured + */ +static int +CheckServerAuthDir (const char *path, struct stat *statb, int mode) +{ + int r = stat(path, statb); + + if (r != 0) { + if (errno == ENOENT) { + r = mkdir(path, mode); + if (r < 0) { + LogError ("cannot make authentication directory %s: %s\n", + path, _SysErrorMsg (errno)); + } else { + r = 1; + } + } else { + LogError ("cannot access authentication directory %s: %s\n", + path, _SysErrorMsg (errno)); + } + } else { /* Directory already exists */ + if (!S_ISDIR(statb->st_mode)) { + LogError ("cannot make authentication directory %s: %s\n", + path, "file with that name already exists"); + return -1; + } + } + + return r; +} + +static char authdir1[] = "authdir"; +static char authdir2[] = "authfiles"; + +static int +MakeServerAuthFile (struct display *d, FILE ** file, uid_t uid, gid_t gid) +{ + int len; +#ifdef MAXNAMELEN +# define NAMELEN MAXNAMELEN +#else +# define NAMELEN 255 +#endif + char cleanname[NAMELEN]; + int r; + int fd; + struct stat statb; + + *file = NULL; + + if (!d->authFile) { + if (d->clientAuthFile && *d->clientAuthFile) { + d->authFile = strdup(d->clientAuthFile); + if (!d->authFile) + return FALSE; + } else { + CleanUpFileName (d->name, cleanname, NAMELEN - 8); + + /* Make authDir if it doesn't already exist */ + r = CheckServerAuthDir(authDir, &statb, 0755); + if (r < 0) { + return FALSE; + } + + len = strlen (authDir) + strlen (authdir1) + strlen (authdir2) + + strlen (cleanname) + 14; + d->authFile = malloc (len); + if (!d->authFile) + return FALSE; + + snprintf (d->authFile, len, "%s/%s", authDir, authdir1); + r = CheckServerAuthDir(d->authFile, &statb, 0700); + if (r == 0) { + if (statb.st_uid != uid) + (void) chown(d->authFile, uid, statb.st_gid); + if ((statb.st_mode & 0077) != 0) + (void) chmod(d->authFile, statb.st_mode & 0700); + } else if (r < 0) { + free (d->authFile); + d->authFile = NULL; + return FALSE; + } else { + (void) chown(d->authFile, uid, gid); + } + + snprintf (d->authFile, len, "%s/%s/%s", + authDir, authdir1, authdir2); + r = CheckServerAuthDir(d->authFile, &statb, 0700); + if (r < 0) { + free (d->authFile); + d->authFile = NULL; + return FALSE; + } else { + (void) chown(d->authFile, uid, gid); + } + snprintf (d->authFile, len, "%s/%s/%s/A%s-XXXXXX", + authDir, authdir1, authdir2, cleanname); + fd = mkstemp (d->authFile); + if (fd < 0) { + LogError ("cannot make authentication file %s: %s\n", + d->authFile, _SysErrorMsg (errno)); + free (d->authFile); + d->authFile = NULL; + return FALSE; + } + + *file = fdopen(fd, "w"); + if (!*file) + (void) close (fd); + return TRUE; + } + } + + (void) unlink (d->authFile); + *file = fopen (d->authFile, "w"); + return TRUE; +} + +int +SaveServerAuthorizations ( + struct display *d, + Xauth **auths, + int count) +{ + FILE *auth_file; + mode_t mask; + int ret; + int i; + const char dummy_auth[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" + "XXXXXXXXXXXXXXXXX"; /* 64 "X"s */ + int err = 0; + uid_t uid; + gid_t gid; +#ifdef X_PRIVSEP + struct passwd *x11; + + /* Give read capability to group _x11 */ + x11 = getpwnam("_x11"); + if (x11 == NULL) { + LogError("Can't find _x11 user\n"); + uid = getuid(); + gid = getgid(); + } else { + uid = x11->pw_uid; + gid = x11->pw_gid; + } +#else + uid = getuid(); + gid = getgid(); +#endif + + + + mask = umask (0077); + ret = MakeServerAuthFile(d, &auth_file, uid, gid); + umask (mask); + if (!ret) + return FALSE; + if (!auth_file) { + LogError ("cannot open server authorization file %s: %s\n", + d->authFile, _SysErrorMsg (errno)); + ret = FALSE; + } + else + { + fchown(fileno(auth_file), uid, gid); + Debug ("File: %s auth: %p\n", d->authFile, auths); + ret = TRUE; + if (count == 0) + { + /* + * This is a crude hack to determine whether we really can + * write to the auth file even if we don't have real data + * to write right now. + */ + + /* + * Write garbage data to file to provoke ENOSPC and other + * errors. + */ + (void) fprintf (auth_file, "%s", dummy_auth); + (void) fflush (auth_file); + if (ferror (auth_file)) + { + err = errno; + ret = FALSE; + } + /* + * Rewind so that the garbage data is overwritten later. + */ + rewind(auth_file); + } + for (i = 0; i < count; i++) + { + /* + * User-based auths may not have data until + * a user logs in. In which case don't write + * to the auth file so xrdb and setup programs don't fail. + */ + if (auths[i]->data_length > 0) + if (!XauWriteAuth (auth_file, auths[i])) + { + Debug ("XauWriteAuth() failed\n"); + } + (void) fflush (auth_file); + if (ferror (auth_file)) + { + err = errno; + ret = FALSE; + } + } + /* + * XXX: This is not elegant, but stdio has no truncation function. + */ + if (ftruncate(fileno(auth_file), ftell(auth_file))) + { + Debug ("ftruncate() failed\n"); + } + fclose (auth_file); + + } + if (ret == FALSE) + { + LogError ("Cannot write to server authorization file %s%s%s\n", + d->authFile, + err ? ": " : "", + err ? _SysErrorMsg (errno) : ""); + free (d->authFile); + d->authFile = NULL; + } + return ret; +} + +void +SetLocalAuthorization (struct display *d) +{ + Xauth *auth, **auths; + int i, j; + + if (d->authorizations) + { + for (i = 0; i < d->authNum; i++) + XauDisposeAuth (d->authorizations[i]); + free (d->authorizations); + d->authorizations = (Xauth **) NULL; + d->authNum = 0; + } + if (!d->authNames) + return; + for (i = 0; d->authNames[i]; i++) + ; + d->authNameNum = i; + free (d->authNameLens); + d->authNameLens = malloc (d->authNameNum * sizeof (unsigned short)); + if (!d->authNameLens) + return; + for (i = 0; i < d->authNameNum; i++) + d->authNameLens[i] = strlen (d->authNames[i]); + auths = malloc (d->authNameNum * sizeof (Xauth *)); + if (!auths) + return; + j = 0; + for (i = 0; i < d->authNameNum; i++) + { + auth = GenerateAuthorization (d->authNameLens[i], d->authNames[i]); + if (auth) + auths[j++] = auth; + } + if (SaveServerAuthorizations (d, auths, j)) + { + d->authorizations = auths; + d->authNum = j; + } + else + { + for (i = 0; i < j; i++) + XauDisposeAuth (auths[i]); + free (auths); + } +} + +/* + * Set the authorization to use for xdm's initial connection + * to the X server. Cannot use user-based authorizations + * because no one has logged in yet, so we don't have any + * user credentials. + * Well, actually we could use SUN-DES-1 because we tell the server + * to allow root in. This is bogus and should be fixed. + */ +void +SetAuthorization (struct display *d) +{ + register Xauth **auth = d->authorizations; + int i; + + for (i = 0; i < d->authNum; i++) + { + if (auth[i]->name_length == 9 && + memcmp(auth[i]->name, "SUN-DES-1", 9) == 0) + continue; + if (auth[i]->name_length == 14 && + memcmp(auth[i]->name, "MIT-KERBEROS-5", 14) == 0) + continue; + XSetAuthorization (auth[i]->name, (int) auth[i]->name_length, + auth[i]->data, (int) auth[i]->data_length); + } +} + +static int +openFiles (char *name, char *new_name, FILE **oldp, FILE **newp) +{ + mode_t mask; + int newfd; + + strcpy (new_name, name); + strcat (new_name, "-n"); + /* + * Set safe umask for file creation operations. + */ + mask = umask (0077); + /* + * Unlink the authorization file we intend to create, and then open + * it with O_CREAT | O_EXCL to avoid race-based symlink attacks. + */ + (void) unlink (new_name); + newfd = open (new_name, O_WRONLY | O_CREAT | O_EXCL, 0600); + if (newfd >= 0) + *newp = fdopen (newfd, "w"); + else + { + LogError ("Cannot create file %s: %s\n", new_name, + _SysErrorMsg (errno)); + *newp = NULL; + } + /* + * There are no more attempts to create files after this point; + * restore the original umask. + */ + (void) umask (mask); + if (!*newp) { + Debug ("can't open new file %s\n", new_name); + return 0; + } + if (!*oldp) + *oldp = fopen (name, "r"); + Debug ("opens succeeded %s %s\n", name, new_name); + return 1; +} + +static int +binaryEqual (char *a, char *b, unsigned short len) +{ + while (len-- > 0) + if (*a++ != *b++) + return FALSE; + return TRUE; +} + +static void +dumpBytes (unsigned short len, char *data) +{ + unsigned short i; + + Debug ("%d: ", len); + for (i = 0; i < len; i++) + Debug ("%02x ", data[i] & 0377); + Debug ("\n"); +} + +static void +dumpAuth (Xauth *auth) +{ + Debug ("family: %d\n", auth->family); + Debug ("addr: "); + dumpBytes (auth->address_length, auth->address); + Debug ("number: "); + dumpBytes (auth->number_length, auth->number); + Debug ("name: "); + dumpBytes (auth->name_length, auth->name); + Debug ("data: "); + dumpBytes (auth->data_length, auth->data); +} + +struct addrList { + unsigned short family; + unsigned short address_length; + char *address; + unsigned short number_length; + char *number; + unsigned short name_length; + char *name; + struct addrList *next; +}; + +static struct addrList *addrs; + +static void +initAddrs (void) +{ + addrs = NULL; +} + +static void +doneAddrs (void) +{ + struct addrList *a, *n; + for (a = addrs; a; a = n) { + n = a->next; + free (a->address); + free (a->number); + free (a); + } +} + +static int checkEntry (Xauth *auth); + +static void +saveEntry (Xauth *auth) +{ + struct addrList *new; + + new = malloc (sizeof (struct addrList)); + if (!new) { + LogOutOfMem ("saveEntry"); + return; + } + if ((new->address_length = auth->address_length) > 0) { + new->address = malloc (auth->address_length); + if (!new->address) { + LogOutOfMem ("saveEntry"); + free (new); + return; + } + memmove( new->address, auth->address, (int) auth->address_length); + } else + new->address = NULL; + if ((new->number_length = auth->number_length) > 0) { + new->number = malloc (auth->number_length); + if (!new->number) { + LogOutOfMem ("saveEntry"); + free (new->address); + free (new); + return; + } + memmove( new->number, auth->number, (int) auth->number_length); + } else + new->number = NULL; + if ((new->name_length = auth->name_length) > 0) { + new->name = malloc (auth->name_length); + if (!new->name) { + LogOutOfMem ("saveEntry"); + free (new->number); + free (new->address); + free (new); + return; + } + memmove( new->name, auth->name, (int) auth->name_length); + } else + new->name = NULL; + new->family = auth->family; + new->next = addrs; + addrs = new; +} + +static int +checkEntry (Xauth *auth) +{ + struct addrList *a; + + for (a = addrs; a; a = a->next) { + if (a->family == auth->family && + a->address_length == auth->address_length && + binaryEqual (a->address, auth->address, auth->address_length) && + a->number_length == auth->number_length && + binaryEqual (a->number, auth->number, auth->number_length) && + a->name_length == auth->name_length && + binaryEqual (a->name, auth->name, auth->name_length)) + { + return 1; + } + } + return 0; +} + +static int doWrite; + +static void +writeAuth (FILE *file, Xauth *auth) +{ + if (debugLevel >= 15) { /* normally too verbose */ + Debug ("writeAuth: doWrite = %d\n", doWrite); + dumpAuth (auth); /* does Debug only */ + } + if (doWrite) + XauWriteAuth (file, auth); +} + +static void +writeAddr ( + int family, + int addr_length, + char *addr, + FILE *file, + Xauth *auth) +{ + auth->family = (unsigned short) family; + auth->address_length = addr_length; + auth->address = addr; + Debug ("writeAddr: writing and saving an entry\n"); + writeAuth (file, auth); + saveEntry (auth); +} + +static void +DefineLocal (FILE *file, Xauth *auth) +{ + char displayname[100]; + int len = _XGetHostname (displayname, sizeof(displayname)); + +/* Make sure this produces the same string as _XGetHostname in lib/X/XlibInt.c. + * Otherwise, Xau will not be able to find your cookies in the Xauthority file. + * + * Note: POSIX says that the ``nodename'' member of utsname does _not_ have + * to have sufficient information for interfacing to the network, + * and so, you may be better off using gethostname (if it exists). + */ + + writeAddr (FamilyLocal, len, displayname, file, auth); +} + +# include <ifaddrs.h> + +static void +DefineSelf(int fd, FILE *file, Xauth *auth) +{ + struct ifaddrs *ifap, *ifr; + char *addr; + int family, len; + + Debug("DefineSelf\n"); + if (getifaddrs(&ifap) < 0) + return; + for (ifr = ifap; ifr != NULL; ifr = ifr->ifa_next) { + len = sizeof(*(ifr->ifa_addr)); + family = ConvertAddr((XdmcpNetaddr)(ifr->ifa_addr), &len, &addr); + if (family == -1 || family == FamilyLocal) + continue; + /* + * don't write out 'localhost' entries, as + * they may conflict with other local entries. + * DefineLocal will always be called to add + * the local entry anyway, so this one can + * be tossed. + */ + if (family == FamilyInternet && len == 4 && addr[0] == 127) + { + Debug ("Skipping localhost address\n"); + continue; + } + if(family == FamilyInternet6) { + if (IN6_IS_ADDR_LOOPBACK(((struct in6_addr *)addr))) { + Debug ("Skipping IPv6 localhost address\n"); + continue; + } + /* Also skip XDM-AUTHORIZATION-1 */ + if (auth->name_length == 19 && + strcmp(auth->name, "XDM-AUTHORIZATION-1") == 0) { + Debug ("Skipping IPv6 XDM-AUTHORIZATION-1\n"); + continue; + } + } + writeAddr(family, len, addr, file, auth); + } + freeifaddrs(ifap); + Debug("DefineSelf done\n"); +} + +static void +setAuthNumber (Xauth *auth, char *name) +{ + char *colon; + char *dot, *number; + + Debug ("setAuthNumber %s\n", name); + colon = strrchr(name, ':'); + if (colon) { + ++colon; + dot = strchr(colon, '.'); + if (dot) + auth->number_length = dot - colon; + else + auth->number_length = strlen (colon); + number = malloc (auth->number_length + 1); + if (number) { + strncpy (number, colon, auth->number_length); + number[auth->number_length] = '\0'; + } else { + LogOutOfMem ("setAuthNumber"); + auth->number_length = 0; + } + auth->number = number; + Debug ("setAuthNumber: %s\n", number); + } +} + +static void +writeLocalAuth (FILE *file, Xauth *auth, char *name) +{ + int fd; + + Debug ("writeLocalAuth: %s %.*s\n", name, auth->name_length, auth->name); + setAuthNumber (auth, name); +#ifdef TCPCONN + fd = socket (AF_INET6, SOCK_STREAM, 0); + if (fd < 0) + fd = socket (AF_INET, SOCK_STREAM, 0); + DefineSelf (fd, file, auth); + close (fd); +#endif + DefineLocal (file, auth); +} + + +void +SetUserAuthorization (struct display *d, struct verify_info *verify) +{ + FILE *old = NULL, *new; + char home_name[1024], backup_name[1024], new_name[1024]; + char *name = NULL; + char *home; + char *envname = NULL; + int lockStatus; + Xauth *entry, **auths; + int setenv = 0; + struct stat statb; + int i; + int magicCookie; + int data_len; + int fd; + + Debug ("SetUserAuthorization\n"); + auths = d->authorizations; + if (auths) { + home = getEnv (verify->userEnviron, "HOME"); + lockStatus = LOCK_ERROR; + if (home) { + snprintf (home_name, sizeof(home_name), "%s/.Xauthority", home); + Debug ("XauLockAuth %s\n", home_name); + lockStatus = XauLockAuth (home_name, 1, 2, 10); + Debug ("Lock is %d\n", lockStatus); + if (lockStatus == LOCK_SUCCESS) { + if (openFiles (home_name, new_name, &old, &new) + && (old != NULL) && (new != NULL)) { + name = home_name; + setenv = 0; + } else { + Debug ("openFiles failed\n"); + XauUnlockAuth (home_name); + lockStatus = LOCK_ERROR; + if (old != NULL) { + (void) fclose (old); + old = NULL; + } + if (new != NULL) + (void) fclose (new); + } + } + } + if (lockStatus != LOCK_SUCCESS) { + snprintf (backup_name, sizeof(backup_name), + "%s/.XauthXXXXXX", d->userAuthDir); + fd = mkstemp (backup_name); + if (fd >= 0) { + old = fdopen (fd, "r"); + if (old == NULL) + (void) close(fd); + } + + if (old != NULL) + { + lockStatus = XauLockAuth (backup_name, 1, 2, 10); + Debug ("backup lock is %d\n", lockStatus); + if (lockStatus == LOCK_SUCCESS) { + if (openFiles (backup_name, new_name, &old, &new) + && (old != NULL) && (new != NULL)) { + name = backup_name; + setenv = 1; + } else { + XauUnlockAuth (backup_name); + lockStatus = LOCK_ERROR; + if (old != NULL) { + (void) fclose (old); + old = NULL; + } + if (new != NULL) + (void) fclose (new); + } + } else { + (void) fclose (old); + } + } + } + if (lockStatus != LOCK_SUCCESS) { + Debug ("can't lock auth file %s or backup %s\n", + home_name, backup_name); + LogError ("can't lock authorization file %s or backup %s\n", + home_name, backup_name); + return; + } + initAddrs (); + doWrite = 1; + Debug ("%d authorization protocols for %s\n", d->authNum, d->name); + /* + * Write MIT-MAGIC-COOKIE-1 authorization first, so that + * R4 clients which only knew that, and used the first + * matching entry will continue to function + */ + magicCookie = -1; + for (i = 0; i < d->authNum; i++) + { + if (auths[i]->name_length == 18 && + !strncmp (auths[i]->name, "MIT-MAGIC-COOKIE-1", 18)) + { + magicCookie = i; + if (d->displayType.location == Local) + writeLocalAuth (new, auths[i], d->name); + break; + } + } + /* now write other authorizations */ + for (i = 0; i < d->authNum; i++) + { + if (i != magicCookie) + { + data_len = auths[i]->data_length; + /* client will just use default Kerberos cache, so don't + * even write cache info into the authority file. + */ + if (auths[i]->name_length == 14 && + !strncmp (auths[i]->name, "MIT-KERBEROS-5", 14)) + auths[i]->data_length = 0; + if (d->displayType.location == Local) + writeLocalAuth (new, auths[i], d->name); + auths[i]->data_length = data_len; + } + } + if (old) { + if (fstat (fileno (old), &statb) != -1) + chmod (new_name, (int) (statb.st_mode & 0777)); + /*SUPPRESS 560*/ + while ((entry = XauReadAuth (old))) { + if (!checkEntry (entry)) + { + Debug ("Writing an entry\n"); + writeAuth (new, entry); + } + XauDisposeAuth (entry); + } + fclose (old); + } + doneAddrs (); + fclose (new); + if (unlink (name) == -1) + if (errno != ENOENT) + LogError ("cannot remove old authorization file %s: %s\n", + name, _SysErrorMsg (errno)); + envname = name; + if (link (new_name, name) == -1) { + LogError ("cannot link temporary authorization file %s to old " + "location %s: %s\n", new_name, name, + _SysErrorMsg (errno)); + setenv = 1; + envname = new_name; + } else { + Debug ("authorization file %s successfully updated\n", name); + if (unlink (new_name)) + if (errno != ENOENT) + LogError ("cannot remove new authorization file %s:" + " %s\n", new_name, _SysErrorMsg (errno)); + } + if (setenv) { + verify->userEnviron = setEnv (verify->userEnviron, + "XAUTHORITY", envname); + verify->systemEnviron = setEnv (verify->systemEnviron, + "XAUTHORITY", envname); + } + XauUnlockAuth (name); + if (envname) + chown (envname, verify->uid, verify->gid); + } + Debug ("done SetUserAuthorization\n"); +} + +void +RemoveUserAuthorization (struct display *d, struct verify_info *verify) +{ + char *home; + Xauth **auths, *entry; + char name[1024], new_name[1024]; + int lockStatus; + FILE *old, *new; + struct stat statb; + int i; + + if (!(auths = d->authorizations)) + return; + home = getEnv (verify->userEnviron, "HOME"); + if (!home) + return; + Debug ("RemoveUserAuthorization\n"); + snprintf(name, sizeof(name), "%s/.Xauthority", home); + Debug ("XauLockAuth %s\n", name); + lockStatus = XauLockAuth (name, 1, 2, 10); + Debug ("Lock is %d\n", lockStatus); + if (lockStatus != LOCK_SUCCESS) + return; + old = NULL; + if (openFiles (name, new_name, &old, &new)) + { + initAddrs (); + doWrite = 0; + for (i = 0; i < d->authNum; i++) + { + if (d->displayType.location == Local) + writeLocalAuth (new, auths[i], d->name); + } + doWrite = 1; + if (old) { + if (fstat (fileno (old), &statb) != -1) + chmod (new_name, (int) (statb.st_mode & 0777)); + /*SUPPRESS 560*/ + while ((entry = XauReadAuth (old))) { + if (!checkEntry (entry)) + { + Debug ("Writing an entry\n"); + writeAuth (new, entry); + } + XauDisposeAuth (entry); + } + fclose (old); + } + doneAddrs (); + fclose (new); + if (unlink (name) == -1) + if (errno != ENOENT) + LogError ("cannot remove new authorization file %s: %s\n", + name, _SysErrorMsg (errno)); + if (link (new_name, name) == -1) { + LogError ("cannot link temporary authorization file %s to old " + "location %s: %s\n", new_name, name, + _SysErrorMsg (errno)); + } else { + Debug ("authorization file %s successfully updated\n", name); + if (unlink (new_name)) + if (errno != ENOENT) + LogError ("cannot remove new authorization file %s:" + " %s\n", new_name, _SysErrorMsg (errno)); + } + } + XauUnlockAuth (name); +} diff --git a/xdm/dm.c b/xdm/dm.c new file mode 100644 index 0000000..b333086 --- /dev/null +++ b/xdm/dm.c @@ -0,0 +1,740 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * display manager + */ + +#include "dm.h" +#include "dm_auth.h" +#include "dm_error.h" + +#include <stdio.h> +#ifdef X_POSIX_C_SOURCE +# define _POSIX_C_SOURCE X_POSIX_C_SOURCE +# include <signal.h> +# undef _POSIX_C_SOURCE +#else +# if defined(X_NOT_POSIX) || defined(_POSIX_SOURCE) +# include <signal.h> +# else +# define _POSIX_SOURCE +# include <signal.h> +# undef _POSIX_SOURCE +# endif +#endif + +#include <sys/stat.h> +#include <errno.h> +#include <X11/Xfuncproto.h> +#include <X11/Xatom.h> +#include <stdarg.h> +#include <stdint.h> + +#include <unistd.h> + +#include <syslog.h> + +static SIGVAL StopAll (int n), RescanNotify (int n); +static void RescanServers (void); +static void RestartDisplay (struct display *d, int forceReserver); +static void ScanServers (void); +static void SetAccessFileTime (void); +static void SetConfigFileTime (void); +static void StartDisplays (void); + +volatile int Rescan; +static long ServersModTime, ConfigModTime, AccessFileModTime; + +int nofork_session = 0; + +static SIGVAL ChildNotify (int n); + +static pid_t parent_pid = -1; /* PID of parent xdm process */ + +int +main (int argc, char **argv) +{ + mode_t oldumask; + char cmdbuf[1024]; + + /* make sure at least world write access is disabled */ + if (((oldumask = umask(022)) & 002) == 002) + (void) umask (oldumask); + + /* + * Step 1 - load configuration parameters + */ + InitResources (argc, argv); + SetConfigFileTime (); + LoadDMResources (); + /* + * Only allow root to run in non-debug mode to avoid problems + */ + if (debugLevel == 0 && getuid() != 0) + { + fprintf (stderr, "Only root wants to run %s\n", argv[0]); + exit (1); + } + if (debugLevel == 0 && daemonMode) { + if (daemon (0, 0) < 0) { + /* error */ + LogError("daemon() failed, %s\n", _SysErrorMsg (errno)); + exit(1); + } + } + if (debugLevel == 0) + InitErrorLog (); + if (debugLevel >= 10) + nofork_session = 1; + LogInfo ("Starting\n"); + + if (nofork_session == 0) { + /* Clean up any old Authorization files */ + /* AUD: all good? */ + snprintf(cmdbuf, sizeof(cmdbuf), "/bin/rm -f %s/authdir/authfiles/A*", authDir); + system(cmdbuf); + } + parent_pid = getpid (); + (void) Signal (SIGTERM, StopAll); + (void) Signal (SIGINT, StopAll); + /* + * Step 2 - Read Xservers and set up + * the socket. + * + * Keep a sub-daemon running + * for each entry + */ + SetAccessFileTime (); + ScanServers (); + StartDisplays (); + (void) Signal (SIGHUP, RescanNotify); + (void) Signal (SIGCHLD, ChildNotify); + Debug ("startup successful; entering main loop\n"); + while (AnyDisplaysLeft ()) + { + if (Rescan) + { + RescanServers (); + Rescan = 0; + } + WaitForChild (); + } + Debug ("Nothing left to do, exiting\n"); + LogInfo ("Exiting\n"); + exit(0); + /*NOTREACHED*/ +} + +/* ARGSUSED */ +static SIGVAL +RescanNotify (int n) +{ + int olderrno = errno; + + Debug ("Caught SIGHUP\n"); + Rescan = 1; + errno = olderrno; +} + +static void +ScanServers (void) +{ + char lineBuf[10240]; + int len; + FILE *serversFile; + struct stat statb; + static DisplayType acceptableTypes[] = + { { Local, Permanent, FromFile }, + { Foreign, Permanent, FromFile }, + }; + +#define NumTypes (sizeof (acceptableTypes) / sizeof (acceptableTypes[0])) + + if (servers[0] == '/') + { + serversFile = fopen (servers, "r"); + if (serversFile == NULL) + { + LogError ("cannot access servers file %s\n", servers); + return; + } + if (ServersModTime == 0) + { + fstat (fileno (serversFile), &statb); + ServersModTime = statb.st_mtime; + } + while (fgets (lineBuf, sizeof (lineBuf)-1, serversFile)) + { + len = strlen (lineBuf); + if (lineBuf[len-1] == '\n') + lineBuf[len-1] = '\0'; + ParseDisplay (lineBuf, acceptableTypes, NumTypes); + } + fclose (serversFile); + } + else + { + ParseDisplay (servers, acceptableTypes, NumTypes); + } +} + +static void +MarkDisplay (struct display *d) +{ + d->state = MissingEntry; +} + +static void +RescanServers (void) +{ + Debug ("rescanning servers\n"); + LogInfo ("Rescanning both config and servers files\n"); + ForEachDisplay (MarkDisplay); + SetConfigFileTime (); + ReinitResources (); + LoadDMResources (); + ScanServers (); + SetAccessFileTime (); + StartDisplays (); +} + +static void +SetConfigFileTime (void) +{ + struct stat statb; + + if (stat (config, &statb) != -1) + ConfigModTime = statb.st_mtime; +} + +static void +SetAccessFileTime (void) +{ + struct stat statb; + + if (stat (accessFile, &statb) != -1) + AccessFileModTime = statb.st_mtime; +} + +static void +RescanIfMod (void) +{ + struct stat statb; + + if (config && stat (config, &statb) != -1) + { + if (statb.st_mtime != ConfigModTime) + { + Debug ("Config file %s has changed, rereading\n", config); + LogInfo ("Rereading configuration file %s\n", config); + ConfigModTime = statb.st_mtime; + ReinitResources (); + LoadDMResources (); + } + } + if (servers[0] == '/' && stat(servers, &statb) != -1) + { + if (statb.st_mtime != ServersModTime) + { + Debug ("Servers file %s has changed, rescanning\n", servers); + LogInfo ("Rereading servers file %s\n", servers); + ServersModTime = statb.st_mtime; + ForEachDisplay (MarkDisplay); + ScanServers (); + } + } +} + +/* + * catch a SIGTERM, kill all displays and exit + */ + +/* ARGSUSED */ +static SIGVAL +StopAll (int n) +{ + int olderrno = errno; + + if (parent_pid != getpid()) + { + /* + * We are a child xdm process that was killed by the + * master xdm before we were able to return from fork() + * and remove this signal handler. + * + * See defect XWSog08655 for more information. + */ + Debug ("Child xdm caught SIGTERM before it removed that signal.\n"); + (void) Signal (n, SIG_DFL); + kill (getpid(), SIGTERM); + errno = olderrno; + return; + } + Debug ("Shutting down entire manager\n"); + LogInfo ("Shutting down\n"); + ForEachDisplay (StopDisplay); + errno = olderrno; +} + +/* + * notice that a child has died and may need another + * sub-daemon started + */ + +int ChildReady; + +/* ARGSUSED */ +static SIGVAL +ChildNotify (int n) +{ + int olderrno = errno; + + ChildReady = 1; + errno = olderrno; +} + +void +WaitForChild (void) +{ + pid_t pid; + struct display *d; + waitType status; + sigset_t mask, omask; + + sigemptyset(&mask); + sigaddset(&mask, SIGCHLD); + sigaddset(&mask, SIGHUP); + sigprocmask(SIG_BLOCK, &mask, &omask); + Debug ("signals blocked\n"); + if (!ChildReady && !Rescan) + sigsuspend(&omask); + ChildReady = 0; + sigprocmask(SIG_SETMASK, &omask, (sigset_t *)NULL); + while ((pid = waitpid (-1, &status, WNOHANG)) > 0) + { + Debug ("Manager wait returns pid: %d sig %d core %d code %d\n", + pid, waitSig(status), waitCore(status), waitCode(status)); + if (autoRescan) + RescanIfMod (); + /* SUPPRESS 560 */ + if ((d = FindDisplayByPid (pid))) { + d->pid = -1; + switch (waitVal (status)) { + case UNMANAGE_DISPLAY: + Debug ("Display exited with UNMANAGE_DISPLAY\n"); + StopDisplay (d); + break; + case OBEYSESS_DISPLAY: + d->startTries = 0; + d->reservTries = 0; + Debug ("Display exited with OBEYSESS_DISPLAY\n"); + if (d->displayType.lifetime != Permanent || + d->status == zombie) + StopDisplay (d); + else + RestartDisplay (d, FALSE); + break; + case OPENFAILED_DISPLAY: + Debug ("Display exited with OPENFAILED_DISPLAY, try %d of %d\n", + d->startTries, d->startAttempts); + LogError ("Display %s cannot be opened\n", d->name); + /* + * no display connection was ever made, tell the + * terminal that the open attempt failed + */ + if (d->displayType.origin == FromXDMCP || + d->status == zombie || + ++d->startTries >= d->startAttempts) + { + LogError ("Display %s is being disabled\n", d->name); + StopDisplay (d); + } + else + { + RestartDisplay (d, TRUE); + } + break; + case RESERVER_DISPLAY: + d->startTries = 0; + Debug ("Display exited with RESERVER_DISPLAY\n"); + if (d->displayType.origin == FromXDMCP || d->status == zombie) + StopDisplay(d); + else { + Time_t now; + int crash; + + time(&now); + crash = d->lastReserv && + ((now - d->lastReserv) < XDM_BROKEN_INTERVAL); + Debug("time %lli %lli try %i of %i%s\n", + (long long)now, (long long)d->lastReserv, + d->reservTries, d->reservAttempts, + crash ? " crash" : ""); + + if (!crash) + d->reservTries = 0; + + if (crash && ++d->reservTries >= d->reservAttempts) { + const char *msg = + "Server crash frequency too high: stopping display"; + Debug("%s %s\n", msg, d->name); + LogError("%s %s\n", msg, d->name); + /* For a local X server either: + * 1. The server exit was returned by waitpid(). So + * serverPid==-1 => StopDisplay() calls RemoveDisplay() + * + * 2. The server is in zombie state or still running. So + * serverPid>1 => StopDisplay() + * a. sets status=zombie, + * b. kills the server. + * The next waitpid() returns this zombie server pid + * and the 'case zombie:' below then calls + * RemoveDisplay(). + */ + StopDisplay(d); + } else { + RestartDisplay(d, TRUE); + } + d->lastReserv = now; + } + break; + case waitCompose (SIGTERM,0,0): + Debug ("Display exited on SIGTERM, try %d of %d\n", + d->startTries, d->startAttempts); + if (d->displayType.origin == FromXDMCP || + d->status == zombie || + ++d->startTries >= d->startAttempts) + { + /* + * During normal xdm shutdown, killed local X servers + * can be zombies; this is not an error. + */ + if (d->status == zombie && + (d->startTries < d->startAttempts)) + LogInfo ("display %s is being disabled\n", d->name); + else + LogError ("display %s is being disabled\n", d->name); + StopDisplay(d); + } else + RestartDisplay (d, TRUE); + break; + case REMANAGE_DISPLAY: + d->startTries = 0; + Debug ("Display exited with REMANAGE_DISPLAY\n"); + /* + * XDMCP will restart the session if the display + * requests it + */ + if (d->displayType.origin == FromXDMCP || d->status == zombie) + StopDisplay(d); + else + RestartDisplay (d, FALSE); + break; + default: + Debug ("Display exited with unknown status %d\n", waitVal(status)); + LogError ("Unknown session exit code %d from process %d\n", + waitVal (status), pid); + StopDisplay (d); + break; + } + } + /* SUPPRESS 560 */ + else if ((d = FindDisplayByServerPid (pid))) + { + d->serverPid = -1; + switch (d->status) + { + case zombie: + Debug ("Zombie server reaped, removing display %s\n", d->name); + RemoveDisplay (d); + break; + case phoenix: + Debug ("Phoenix server arises, restarting display %s\n", d->name); + d->status = notRunning; + break; + case running: + Debug ("Server for display %s terminated unexpectedly, status %d %d\n", d->name, waitVal (status), status); + LogError ("Server for display %s terminated unexpectedly: %d\n", d->name, waitVal (status)); + if (d->pid != -1) + { + Debug ("Terminating session pid %d\n", d->pid); + kill (d->pid, SIGTERM); + } + break; + case notRunning: + Debug ("Server exited for notRunning session on display %s\n", d->name); + break; + } + } + else + { + Debug ("Unknown child termination, status %d\n", waitVal (status)); + } + } + StartDisplays (); +} + +static void +CheckDisplayStatus (struct display *d) +{ + if (d->displayType.origin == FromFile) + { + switch (d->state) { + case MissingEntry: + StopDisplay (d); + break; + case NewEntry: + d->state = OldEntry; + case OldEntry: + if (d->status == notRunning) + StartDisplay (d); + break; + } + } +} + +static void +StartDisplays (void) +{ + ForEachDisplay (CheckDisplayStatus); +} + +static void +SetWindowPath(struct display *d) +{ + /* setting WINDOWPATH for clients */ + Atom prop; + Atom actualtype; + int actualformat; + unsigned long nitems; + unsigned long bytes_after; + unsigned char *buf; + const char *windowpath; + char *newwindowpath; + unsigned long num; + + prop = XInternAtom(d->dpy, "XFree86_VT", False); + if (prop == None) { + fprintf(stderr, "no XFree86_VT atom\n"); + return; + } + if (XGetWindowProperty(d->dpy, DefaultRootWindow(d->dpy), prop, 0, 1, + False, AnyPropertyType, &actualtype, &actualformat, + &nitems, &bytes_after, &buf)) { + fprintf(stderr, "no XFree86_VT property\n"); + return; + } + if (nitems != 1) { + fprintf(stderr, "%lu items in XFree86_VT property!\n", nitems); + XFree(buf); + return; + } + switch (actualtype) { + case XA_CARDINAL: + case XA_INTEGER: + case XA_WINDOW: + switch (actualformat) { + case 8: + num = (*(uint8_t *)(void *)buf); + break; + case 16: + num = (*(uint16_t *)(void *)buf); + break; + case 32: + num = (*(uint32_t *)(void *)buf); + break; + default: + fprintf(stderr, "format %d in XFree86_VT property!\n", actualformat); + XFree(buf); + return; + } + break; + default: + fprintf(stderr, "type %lx in XFree86_VT property!\n", actualtype); + XFree(buf); + return; + } + XFree(buf); + windowpath = getenv("WINDOWPATH"); + if (!windowpath) { + asprintf(&newwindowpath, "%lu", num); + } else { + asprintf(&newwindowpath, "%s:%lu", windowpath, num); + } + free(d->windowPath); + d->windowPath = newwindowpath; +} + +void +StartDisplay (struct display *d) +{ + pid_t pid; + + Debug ("StartDisplay %s\n", d->name); + LogInfo ("Starting X server on %s\n", d->name); + LoadServerResources (d); + if (d->displayType.location == Local) + { + /* don't bother pinging local displays; we'll + * certainly notice when they exit + */ + d->pingInterval = 0; + if (d->authorize) + { + Debug ("SetLocalAuthorization %s, auth %s\n", + d->name, d->authNames[0]); + SetLocalAuthorization (d); + /* + * reset the server after writing the authorization information + * to make it read the file (for compatibility with old + * servers which read auth file only on reset instead of + * at first connection) + */ + if (d->serverPid != -1 && d->resetForAuth && d->resetSignal) + kill (d->serverPid, d->resetSignal); + } + if (d->serverPid == -1 && !StartServer (d)) + { + LogError ("Server for display %s can't be started, session disabled\n", d->name); + RemoveDisplay (d); + return; + } + } + else + { + /* this will only happen when using XDMCP */ + if (d->authorizations) + SaveServerAuthorizations (d, d->authorizations, d->authNum); + } + if (!nofork_session) + pid = fork (); + else + pid = 0; + switch (pid) + { + case 0: + if (!nofork_session) { + CleanUpChild (); + (void) Signal (SIGPIPE, SIG_IGN); + } + openlog("xdm", LOG_PID, LOG_AUTHPRIV); + LoadSessionResources (d); + SetAuthorization (d); + if (!WaitForServer (d)) + exit (OPENFAILED_DISPLAY); + SetWindowPath(d); + if (pledge("stdio rpath cpath wpath fattr proc dns inet unix exec prot_exec getpw id", NULL) != 0) + exit(OPENFAILED_DISPLAY); + ManageSession (d); + exit (REMANAGE_DISPLAY); + case -1: + break; + default: + Debug ("pid: %d\n", pid); + d->pid = pid; + d->status = running; + break; + } +} + + +/* + * transition from running to zombie or deleted + */ + +void +StopDisplay (struct display *d) +{ + if (d->serverPid != -1) + d->status = zombie; /* be careful about race conditions */ + if (d->pid != -1) + kill (d->pid, SIGTERM); + if (d->serverPid != -1) + kill (d->serverPid, d->termSignal); + else + RemoveDisplay (d); +} + +/* + * transition from running to phoenix or notRunning + */ + +static void +RestartDisplay (struct display *d, int forceReserver) +{ + if (d->serverPid != -1 && (forceReserver || d->terminateServer)) + { + kill (d->serverPid, d->termSignal); + d->status = phoenix; + } + else + { + d->status = notRunning; + } +} + +static fd_set CloseMask; +static int max; + +void +RegisterCloseOnFork (int fd) +{ + FD_SET (fd, &CloseMask); + if (fd > max) + max = fd; +} + +void +ClearCloseOnFork (int fd) +{ + FD_CLR (fd, &CloseMask); + if (fd == max) { + while (--fd >= 0) + if (FD_ISSET (fd, &CloseMask)) + break; + max = fd; + } +} + +void +CloseOnFork (void) +{ + int fd; + + for (fd = 0; fd <= max; fd++) + if (FD_ISSET (fd, &CloseMask)) + { + close (fd); + } + FD_ZERO (&CloseMask); + max = 0; +} diff --git a/xdm/dpylist.c b/xdm/dpylist.c new file mode 100644 index 0000000..5caaaf8 --- /dev/null +++ b/xdm/dpylist.c @@ -0,0 +1,248 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * a simple linked list of known displays + */ + +#include "dm.h" +#include "dm_error.h" + +static struct display *displays; + +int +AnyDisplaysLeft (void) +{ + return displays != (struct display *) 0; +} + +void +ForEachDisplay (void (*f)(struct display *)) +{ + struct display *d, *next; + + for (d = displays; d; d = next) { + next = d->next; + (*f) (d); + } +} + +struct display * +FindDisplayByName (char *name) +{ + struct display *d; + + for (d = displays; d; d = d->next) + if (!strcmp (name, d->name)) + return d; + return NULL; +} + +struct display * +FindDisplayByPid (pid_t pid) +{ + struct display *d; + + for (d = displays; d; d = d->next) + if (pid == d->pid) + return d; + return NULL; +} + +struct display * +FindDisplayByServerPid (pid_t serverPid) +{ + struct display *d; + + for (d = displays; d; d = d->next) + if (serverPid == d->serverPid) + return d; + return NULL; +} + +#ifdef XDMCP + +struct display * +FindDisplayBySessionID (CARD32 sessionID) +{ + struct display *d; + + for (d = displays; d; d = d->next) + if (sessionID == d->sessionID) + return d; + return NULL; +} + +struct display * +FindDisplayByAddress (XdmcpNetaddr addr, int addrlen, CARD16 displayNumber) +{ + struct display *d; + + for (d = displays; d; d = d->next) + if (d->displayType.origin == FromXDMCP && + d->displayNumber == displayNumber && + addressEqual (d->from, d->fromlen, addr, addrlen)) + { + return d; + } + return NULL; +} + +#endif /* XDMCP */ + +void +RemoveDisplay (struct display *old) +{ + struct display *d, *p; + char **x; + int i; + + p = NULL; + for (d = displays; d; d = d->next) { + if (d == old) { + if (p) + p->next = d->next; + else + displays = d->next; + free (d->name); + free (d->class); + for (x = d->argv; x && *x; x++) + free (*x); + free (d->argv); + free (d->resources); + free (d->xrdb); + free (d->setup); + free (d->startup); + free (d->reset); + free (d->session); + free (d->userPath); + free (d->systemPath); + free (d->systemShell); + free (d->failsafeClient); + free (d->chooser); + if (d->authorizations) + { + for (i = 0; i < d->authNum; i++) + XauDisposeAuth (d->authorizations[i]); + free (d->authorizations); + } + free (d->clientAuthFile); + if (d->authFile) + (void) unlink (d->authFile); + free (d->authFile); + free (d->userAuthDir); + for (x = d->authNames; x && *x; x++) + free (*x); + free (d->authNames); + free (d->authNameLens); + free (d->windowPath); + free (d); + break; + } + p = d; + } +} + +struct display * +NewDisplay (char *name, char *class) +{ + struct display *d; + + d = calloc (1, sizeof (struct display)); + if (!d) { + LogOutOfMem ("NewDisplay"); + return NULL; + } + d->next = displays; + d->name = strdup (name); + if (!d->name) { + LogOutOfMem ("NewDisplay"); + free (d); + return NULL; + } + if (class) + { + d->class = strdup (class); + if (!d->class) { + LogOutOfMem ("NewDisplay"); + free (d->name); + free (d); + return NULL; + } + } + else + { + d->class = NULL; + } + /* initialize every field to avoid possible problems */ + d->argv = NULL; + d->status = notRunning; + d->pid = -1; + d->serverPid = -1; + d->state = NewEntry; + d->resources = NULL; + d->xrdb = NULL; + d->setup = NULL; + d->startup = NULL; + d->reset = NULL; + d->session = NULL; + d->userPath = NULL; + d->systemPath = NULL; + d->systemShell = NULL; + d->failsafeClient = NULL; + d->chooser = NULL; + d->authorize = FALSE; + d->authorizations = NULL; + d->authNum = 0; + d->authNameNum = 0; + d->clientAuthFile = NULL; + d->authFile = NULL; + d->userAuthDir = NULL; + d->authNames = NULL; + d->authNameLens = NULL; + d->authComplain = 1; + d->openDelay = 0; + d->openRepeat = 0; + d->openTimeout = 0; + d->startAttempts = 0; + d->startTries = 0; + d->lastReserv = 0; + d->reservAttempts = 0; + d->reservTries = 0; + d->terminateServer = 0; + d->grabTimeout = 0; + d->version = 1; /* registered with The Open Group */ + d->willing = NULL; + d->dpy = NULL; + d->windowPath = NULL; + displays = d; + return d; +} diff --git a/xdm/error.c b/xdm/error.c new file mode 100644 index 0000000..af32ad5 --- /dev/null +++ b/xdm/error.c @@ -0,0 +1,136 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * error.c + * + * Log display manager errors to a file as + * we generally do not have a terminal to talk to + */ + +#include <stdio.h> +#include <stdarg.h> + +#include "dm.h" +#include "dm_error.h" + +/* This function does the actual log message writes. */ +static inline void _X_ATTRIBUTE_PRINTF(1,0) +LogVWrite(const char *fmt, va_list args) +{ + char buf[1024]; + int len; + + len = vsnprintf (buf, sizeof(buf), fmt, args); + if (len >= sizeof(buf)) { + len = sizeof(buf) - 1; + } + write(STDERR_FILENO, buf, len); +} + +#define LogVarArgsWrite(fmt) \ + do { \ + va_list args; \ + va_start(args, fmt); \ + LogVWrite(fmt, args); \ + va_end(args); \ + } while(0) + +#define LogHeader(type) \ + LogAppend("xdm %s (pid %ld): ", type, (long)getpid()) + +/* Append more text to the log without a new header, right after + having called LogInfo or LogError */ +void +LogAppend(const char * fmt, ...) +{ + LogVarArgsWrite(fmt); +} + +void +LogInfo(const char * fmt, ...) +{ + LogHeader("info"); + LogVarArgsWrite(fmt); +} + +void +LogError (const char * fmt, ...) +{ + LogHeader("error"); + LogVarArgsWrite(fmt); +} + +void +LogPanic (const char * fmt, ...) +{ + LogHeader("panic"); + LogVarArgsWrite(fmt); + _exit (1); +} + +void +LogOutOfMem (const char * fmt, ...) +{ + fprintf (stderr, "xdm: out of memory in routine "); + { + va_list args; + va_start(args, fmt); + vfprintf (stderr, fmt, args); + va_end(args); + } + fflush (stderr); +} + +void +Debug (const char * fmt, ...) +{ + if (debugLevel > 0) + { + LogVarArgsWrite(fmt); + } +} + +void +InitErrorLog (void) +{ + int i; + if (errorLogFile[0]) { + i = creat (errorLogFile, 0666); + if (i != -1) { + if (i != STDERR_FILENO) { + dup2 (i, STDERR_FILENO); + close (i); + } + } else + LogError ("Cannot open errorLogFile %s\n", errorLogFile); + } +} diff --git a/xdm/file.c b/xdm/file.c new file mode 100644 index 0000000..7b7f3d3 --- /dev/null +++ b/xdm/file.c @@ -0,0 +1,249 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * file.c + */ + +#include "dm.h" +#include "dm_error.h" + +#include <ctype.h> + +static int +DisplayTypeMatch (DisplayType d1, DisplayType d2) +{ + return d1.location == d2.location && + d1.lifetime == d2.lifetime && + d1.origin == d2.origin; +} + +static void +freeFileArgs (char **args) +{ + char **a; + + for (a = args; *a; a++) + free (*a); + free (args); +} + +static char ** +splitIntoWords (char *s) +{ + char **args, **newargs; + char *wordStart; + int nargs; + + args = NULL; + nargs = 0; + while (*s) + { + while (*s && isspace (*s)) + ++s; + if (!*s || *s == '#') + break; + wordStart = s; + while (*s && *s != '#' && !isspace (*s)) + ++s; + if (!args) + { + args = malloc (2 * sizeof (char *)); + if (!args) + return NULL; + } + else + { + newargs = realloc ((char *) args, (nargs+2)*sizeof (char *)); + if (!newargs) + { + freeFileArgs (args); + return NULL; + } + args = newargs; + } + args[nargs] = malloc (s - wordStart + 1); + if (!args[nargs]) + { + freeFileArgs (args); + return NULL; + } + strncpy (args[nargs], wordStart, s - wordStart); + args[nargs][s-wordStart] = '\0'; + ++nargs; + args[nargs] = NULL; + } + return args; +} + +static char ** +copyArgs (char **args) +{ + char **a, **new, **n; + + for (a = args; *a; a++) + /* SUPPRESS 530 */ + ; + new = malloc ((a - args + 1) * sizeof (char *)); + if (!new) + return NULL; + n = new; + a = args; + /* SUPPRESS 560 */ + while ((*n++ = *a++)) + /* SUPPRESS 530 */ + ; + return new; +} + +static void +freeSomeArgs (char **args, int n) +{ + char **a; + + a = args; + while (n--) + free (*a++); + free (args); +} + +void +ParseDisplay (char *source, DisplayType *acceptableTypes, int numAcceptable) +{ + char **args, **argv, **a; + char *name, *class, *type; + struct display *d; + int usedDefault; + DisplayType displayType; + + args = splitIntoWords (source); + if (!args) + return; + if (!args[0]) + { + LogError ("Missing display name in servers file\n"); + freeFileArgs (args); + return; + } + name = args[0]; + if (!args[1]) + { + LogError ("Missing display type for %s\n", args[0]); + freeFileArgs (args); + return; + } + displayType = parseDisplayType (args[1], &usedDefault); + class = NULL; + type = args[1]; + argv = args + 2; + /* + * extended syntax; if the second argument doesn't + * exactly match a legal display type and the third + * argument does, use the second argument as the + * display class string + */ + if (usedDefault && args[2]) + { + displayType = parseDisplayType (args[2], &usedDefault); + if (!usedDefault) + { + class = args[1]; + type = args[2]; + argv = args + 3; + } + } + while (numAcceptable) + { + if (DisplayTypeMatch (*acceptableTypes, displayType)) + break; + --numAcceptable; + ++acceptableTypes; + } + if (!numAcceptable) + { + LogError ("Unacceptable display type %s for display %s\n", + type, name); + } + d = FindDisplayByName (name); + if (d) + { + d->state = OldEntry; + if (class && strcmp (d->class, class)) + { + char *newclass; + + newclass = strdup (class); + if (newclass) + { + free (d->class); + d->class = newclass; + } + } + Debug ("Found existing display: %s %s %s", d->name, d->class , type); + freeFileArgs (d->argv); + } + else + { + d = NewDisplay (name, class); + Debug ("Found new display: %s %s %s", + d->name, d->class ? d->class : "", type); + } + d->displayType = displayType; + d->argv = copyArgs (argv); + for (a = d->argv; a && *a; a++) + Debug (" %s", *a); + Debug ("\n"); + freeSomeArgs (args, argv - args); +} + +static struct displayMatch { + const char *name; + DisplayType type; +} displayTypes[] = { + { "local", { Local, Permanent, FromFile } }, + { "foreign", { Foreign, Permanent, FromFile } }, + { NULL, { Local, Permanent, FromFile } }, +}; + +DisplayType +parseDisplayType (char *string, int *usedDefault) +{ + struct displayMatch *d; + + for (d = displayTypes; d->name; d++) + if (!strcmp (d->name, string)) + { + *usedDefault = 0; + return d->type; + } + *usedDefault = 1; + return d->type; +} diff --git a/xdm/genauth.c b/xdm/genauth.c new file mode 100644 index 0000000..86315f1 --- /dev/null +++ b/xdm/genauth.c @@ -0,0 +1,116 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + */ + +#include <X11/Xauth.h> +#include <X11/Xos.h> + +#include "dm.h" +#include "dm_auth.h" +#include "dm_error.h" + +#include <errno.h> + +#include <time.h> +#define Time_t time_t + +static unsigned char key[8]; + +typedef unsigned char auth_cblock[8]; /* block size */ + +typedef struct auth_ks_struct { auth_cblock _; } auth_wrapper_schedule[16]; + +extern int _XdmcpAuthSetup(unsigned char *, auth_wrapper_schedule); +extern int _XdmcpAuthDoIt(unsigned char *, unsigned char *, + auth_wrapper_schedule, int); +extern void _XdmcpWrapperToOddParity(unsigned char *, unsigned char *); + +static void +longtochars (long l, unsigned char *c) +{ + c[0] = (l >> 24) & 0xff; + c[1] = (l >> 16) & 0xff; + c[2] = (l >> 8) & 0xff; + c[3] = l & 0xff; +} + +static void +InitXdmcpWrapper (void) +{ + CARD32 sum[4]; + + sum[0] = arc4random(); + sum[1] = arc4random(); + *(u_char *)sum = 0; + + _XdmcpWrapperToOddParity((unsigned char *)sum, key); +} + + +int +GenerateAuthData (char *auth, int len) +{ + int i, bit; + auth_wrapper_schedule schedule; + unsigned char data[8]; + static int xdmcpAuthInited; + long ldata[2]; + +# ifdef ITIMER_REAL + struct timeval now; + + X_GETTIMEOFDAY (&now); + ldata[0] = now.tv_usec; + ldata[1] = now.tv_sec; +# else + ldata[0] = time ((long *) 0); + ldata[1] = getpid (); +# endif + + longtochars (ldata[0], data+0); + longtochars (ldata[1], data+4); + if (!xdmcpAuthInited) + { + InitXdmcpWrapper (); + xdmcpAuthInited = 1; + } + _XdmcpAuthSetup (key, schedule); + for (i = 0; i < len; i++) { + auth[i] = 0; + for (bit = 1; bit < 256; bit <<= 1) { + _XdmcpAuthDoIt (data, data, schedule, 1); + if ((data[0] + data[1]) & 0x4) + auth[i] |= bit; + } + } + return 1; +} diff --git a/xdm/mitauth.c b/xdm/mitauth.c new file mode 100644 index 0000000..d100798 --- /dev/null +++ b/xdm/mitauth.c @@ -0,0 +1,93 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * mitauth + * + * generate authorization keys + * for MIT-MAGIC-COOKIE-1 type authorization + */ + +#include <X11/Xos.h> + +#include "dm.h" +#include "dm_auth.h" + +#define AUTH_DATA_LEN 16 /* bytes of authorization data */ +static char auth_name[256]; + +void +MitInitAuth (unsigned short name_len, char *name) +{ + if (name_len > 256) + name_len = 256; + memmove( auth_name, name, name_len); +} + +Xauth * +MitGetAuth (unsigned short namelen, char *name) +{ + Xauth *new; + new = malloc (sizeof (Xauth)); + + if (!new) + return (Xauth *) 0; + new->family = FamilyWild; + new->address_length = 0; + new->address = NULL; + new->number_length = 0; + new->number = NULL; + + new->data = malloc (AUTH_DATA_LEN); + if (!new->data) + { + free (new); + return (Xauth *) 0; + } + new->name = malloc (namelen); + if (!new->name) + { + free (new->data); + free (new); + return (Xauth *) 0; + } + memmove( (char *)new->name, name, namelen); + new->name_length = namelen; + if (!GenerateAuthData (new->data, AUTH_DATA_LEN)) + { + free (new->name); + free (new->data); + free (new); + return (Xauth *) 0; + } + new->data_length = AUTH_DATA_LEN; + return new; +} diff --git a/xdm/netaddr.c b/xdm/netaddr.c new file mode 100644 index 0000000..ad2bff0 --- /dev/null +++ b/xdm/netaddr.c @@ -0,0 +1,239 @@ +/* + +Copyright 1991, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - X display manager + * + * netaddr.c - Interpretation of XdmcpNetaddr object. + */ + +#include "dm.h" +#include "dm_error.h" + +#include <X11/X.h> /* FamilyInternet, etc. */ + + +# include "dm_socket.h" + +# ifdef UNIXCONN +# ifndef X_NO_SYS_UN +# include <sys/un.h> /* struct sockaddr_un */ +# endif +# endif +# ifdef DNETCONN +# include <netdnet/dn.h> /* struct sockaddr_dn */ +# endif + +/* given an XdmcpNetaddr, returns the socket protocol family used, + e.g., AF_INET */ + +int NetaddrFamily(XdmcpNetaddr netaddrp) +{ +# ifdef STREAMSCONN + short family = *(short *)netaddrp; + return family; +# else + return ((struct sockaddr *)netaddrp)->sa_family; +# endif +} + + +/* given an XdmcpNetaddr, returns a pointer to the TCP/UDP port used + and sets *lenp to the length of the address + or 0 if not using TCP or UDP. */ + +char * NetaddrPort(XdmcpNetaddr netaddrp, int *lenp) +{ +# ifdef STREAMSCONN + *lenp = 2; + return netaddrp+2; +# else + switch (NetaddrFamily(netaddrp)) + { + case AF_INET: + *lenp = 2; + return (char *)&(((struct sockaddr_in *)netaddrp)->sin_port); + case AF_INET6: + *lenp = 2; + return (char *)&(((struct sockaddr_in6 *)netaddrp)->sin6_port); + default: + *lenp = 0; + return NULL; + } +# endif +} + + +/* given an XdmcpNetaddr, returns a pointer to the network address + and sets *lenp to the length of the address */ + +char * NetaddrAddress(XdmcpNetaddr netaddrp, int *lenp) +{ +# ifdef STREAMSCONN + *lenp = 4; + return netaddrp+4; +# else + switch (NetaddrFamily(netaddrp)) { +# ifdef UNIXCONN + case AF_UNIX: + *lenp = strlen(((struct sockaddr_un *)netaddrp)->sun_path); + return (char *) (((struct sockaddr_un *)netaddrp)->sun_path); +# endif +# ifdef TCPCONN + case AF_INET: + *lenp = sizeof (struct in_addr); + return (char *) &(((struct sockaddr_in *)netaddrp)->sin_addr); + case AF_INET6: + { + struct in6_addr *a = &(((struct sockaddr_in6 *)netaddrp)->sin6_addr); + if (IN6_IS_ADDR_V4MAPPED(a)) { + *lenp = sizeof (struct in_addr); + return ((char *) &(a->s6_addr))+12; + } else { + *lenp = sizeof (struct in6_addr); + return (char *) &(a->s6_addr); + } + } +# endif + default: + *lenp = 0; + return NULL; + } +# endif /* STREAMSCONN else */ +} + + +/* given an XdmcpNetaddr, sets *addr to the network address used and + sets *len to the number of bytes in addr. + Returns the X protocol family used, e.g., FamilyInternet */ + +int ConvertAddr (XdmcpNetaddr saddr, int *len, char **addr) +{ + int retval; + + if ((len == NULL) || (saddr == NULL)) + return -1; + *addr = NetaddrAddress(saddr, len); +# ifdef STREAMSCONN + /* kludge */ + if (NetaddrFamily(saddr) == 2) + retval = FamilyInternet; +# else + switch (NetaddrFamily(saddr)) + { +# ifdef AF_UNSPEC + case AF_UNSPEC: + retval = FamilyLocal; + break; +# endif +# ifdef AF_UNIX + case AF_UNIX: + retval = FamilyLocal; + break; +# endif +# ifdef TCPCONN + case AF_INET: + retval = FamilyInternet; + break; + case AF_INET6: + if (*len == sizeof(struct in_addr)) + retval = FamilyInternet; + else + retval = FamilyInternet6; + break; +# endif + default: + retval = -1; + break; + } +# endif /* STREAMSCONN else */ + Debug ("ConvertAddr returning %d for family %d\n", retval, + NetaddrFamily(saddr)); + return retval; +} + +int +addressEqual (XdmcpNetaddr a1, int len1, XdmcpNetaddr a2, int len2) +{ + int partlen1, partlen2; + char *part1, *part2; + + if (len1 != len2) + { + return FALSE; + } + if (NetaddrFamily(a1) != NetaddrFamily(a2)) + { + return FALSE; + } + part1 = NetaddrPort(a1, &partlen1); + part2 = NetaddrPort(a2, &partlen2); + if (partlen1 != partlen2 || memcmp(part1, part2, partlen1) != 0) + { + return FALSE; + } + part1 = NetaddrAddress(a1, &partlen1); + part2 = NetaddrAddress(a2, &partlen2); + if (partlen1 != partlen2 || memcmp(part1, part2, partlen1) != 0) + { + return FALSE; + } + return TRUE; +} + +# ifdef DEBUG +/*ARGSUSED*/ +void +PrintSockAddr (struct sockaddr *a, int len) +{ + unsigned char *t, *p; + + Debug ("family %d, ", a->sa_family); + switch (a->sa_family) { + case AF_INET: + + p = (unsigned char *) &((struct sockaddr_in *) a)->sin_port; + t = (unsigned char *) &((struct sockaddr_in *) a)->sin_addr; + + Debug ("port %d, host %d.%d.%d.%d\n", + (p[0] << 8) + p[1], t[0], t[1], t[2], t[3]); + break; + case AF_INET6: + { + char astr[INET6_ADDRSTRLEN] = ""; + + inet_ntop(a->sa_family, &((struct sockaddr_in6 *) a)->sin6_addr, + astr, sizeof(astr)); + p = (unsigned char *) &((struct sockaddr_in6 *) a)->sin6_port; + + Debug ("port %d, host %s\n", (p[0] << 8) + p[1], astr); + break; + } + } +} +# endif diff --git a/xdm/protodpy.c b/xdm/protodpy.c new file mode 100644 index 0000000..b655e6f --- /dev/null +++ b/xdm/protodpy.c @@ -0,0 +1,164 @@ +/* + * +Copyright 1989, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 +OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + * + * Author: Keith Packard, MIT X Consortium + */ + +/* + * protodpy.c + * + * manage a collection of proto-displays. These are displays for + * which sessionID's have been generated, but no session has been + * started. + */ + +#include "dm.h" +#include "dm_error.h" + +#ifdef XDMCP + +# include <sys/types.h> +# include <time.h> +# define Time_t time_t + +static struct protoDisplay *protoDisplays; + +# ifdef DEBUG +static +PrintProtoDisplay (struct protoDisplay *pdpy) +{ + Debug ("ProtoDisplay 0x%x\n", pdpy); + Debug ("\taddress: "); + PrintSockAddr (pdpy->address, pdpy->addrlen); + Debug ("\tdate %d (%d from now)\n", pdpy->date, time(0) - pdpy->date); + Debug ("\tdisplay Number %d\n", pdpy->displayNumber); + Debug ("\tsessionID %d\n", pdpy->sessionID); +} +# endif + +struct protoDisplay * +FindProtoDisplay ( + XdmcpNetaddr address, + int addrlen, + CARD16 displayNumber) +{ + struct protoDisplay *pdpy; + + Debug ("FindProtoDisplay\n"); + for (pdpy = protoDisplays; pdpy; pdpy=pdpy->next) + { + if (pdpy->displayNumber == displayNumber && + addressEqual (address, addrlen, pdpy->address, pdpy->addrlen)) + { + return pdpy; + } + } + return (struct protoDisplay *) 0; +} + +static void +TimeoutProtoDisplays (Time_t now) +{ + struct protoDisplay *pdpy, *next; + + for (pdpy = protoDisplays; pdpy; pdpy = next) + { + next = pdpy->next; + if (pdpy->date < now - PROTO_TIMEOUT) + DisposeProtoDisplay (pdpy); + } +} + +struct protoDisplay * +NewProtoDisplay ( + XdmcpNetaddr address, + int addrlen, + CARD16 displayNumber, + CARD16 connectionType, + ARRAY8Ptr connectionAddress, + CARD32 sessionID) +{ + struct protoDisplay *pdpy; + Time_t date; + + Debug ("NewProtoDisplay\n"); + time (&date); + TimeoutProtoDisplays (date); + pdpy = malloc (sizeof *pdpy); + if (!pdpy) + return NULL; + pdpy->address = malloc (addrlen); + if (!pdpy->address) + { + free (pdpy); + return NULL; + } + pdpy->addrlen = addrlen; + memmove( pdpy->address, address, addrlen); + pdpy->displayNumber = displayNumber; + pdpy->connectionType = connectionType; + pdpy->date = date; + if (!XdmcpCopyARRAY8 (connectionAddress, &pdpy->connectionAddress)) + { + free (pdpy->address); + free (pdpy); + return NULL; + } + pdpy->sessionID = sessionID; + pdpy->fileAuthorization = (Xauth *) NULL; + pdpy->xdmcpAuthorization = (Xauth *) NULL; + pdpy->next = protoDisplays; + protoDisplays = pdpy; + return pdpy; +} + +void +DisposeProtoDisplay (struct protoDisplay *pdpy) +{ + struct protoDisplay *p, *prev; + + prev = NULL; + for (p = protoDisplays; p; p=p->next) + { + if (p == pdpy) + break; + prev = p; + } + if (!p) + return; + if (prev) + prev->next = pdpy->next; + else + protoDisplays = pdpy->next; + bzero(&pdpy->key, sizeof(pdpy->key)); + if (pdpy->fileAuthorization) + XauDisposeAuth (pdpy->fileAuthorization); + if (pdpy->xdmcpAuthorization) + XauDisposeAuth (pdpy->xdmcpAuthorization); + XdmcpDisposeARRAY8 (&pdpy->connectionAddress); + free (pdpy->address); + free (pdpy); +} + +#endif /* XDMCP */ diff --git a/xdm/reset.c b/xdm/reset.c new file mode 100644 index 0000000..a1b0504 --- /dev/null +++ b/xdm/reset.c @@ -0,0 +1,113 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * pseudoReset -- pretend to reset the server by killing all clients + * with windows. It will reset the server most of the time, unless + * a client remains connected with no windows. + */ + +#include "dm.h" +#include "dm_error.h" + +#include <X11/Xlib.h> +#include <signal.h> + +/*ARGSUSED*/ +static int +ignoreErrors (Display *dpy, XErrorEvent *event) +{ + Debug ("ignoring error\n"); + return 0; +} + +/* + * this is mostly bogus -- but quite useful. I wish the protocol + * had some way of enumerating and identifying clients, that way + * this code wouldn't have to be this kludgy. + */ + +static void +killWindows (Display *dpy, Window window) +{ + Window root, parent, *children; + int child; + unsigned int nchildren = 0; + + while (XQueryTree (dpy, window, &root, &parent, &children, &nchildren) + && nchildren > 0) + { + for (child = 0; child < nchildren; child++) { + Debug ("XKillClient 0x%lx\n", (unsigned long)children[child]); + XKillClient (dpy, children[child]); + } + XFree ((char *)children); + } +} + +static Jmp_buf resetJmp; + +/* ARGSUSED */ +static SIGVAL +abortReset (int n) +{ + Longjmp (resetJmp, 1); +} + +/* + * this display connection better not have any windows... + */ + +void +pseudoReset (Display *dpy) +{ + Window root; + int screen; + + if (Setjmp (resetJmp)) { + LogError ("pseudoReset timeout\n"); + } else { + (void) Signal (SIGALRM, abortReset); + (void) alarm (30); + XSetErrorHandler (ignoreErrors); + for (screen = 0; screen < ScreenCount (dpy); screen++) { + Debug ("pseudoReset screen %d\n", screen); + root = RootWindow (dpy, screen); + killWindows (dpy, root); + } + Debug ("before XSync\n"); + XSync (dpy, False); + (void) alarm (0); + } + Signal (SIGALRM, SIG_DFL); + XSetErrorHandler ((XErrorHandler)0 ); + Debug ("pseudoReset done\n"); +} diff --git a/xdm/resource.c b/xdm/resource.c new file mode 100644 index 0000000..83901a2 --- /dev/null +++ b/xdm/resource.c @@ -0,0 +1,512 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * resource.c + */ + +#include "dm.h" +#include "dm_error.h" + +#include <X11/Intrinsic.h> +#include <X11/Xmu/CharSet.h> + +char *config; + +char *servers; +int request_port; +int debugLevel; +char *errorLogFile; +int daemonMode; +char *pidFile; +int lockPidFile; +int sourceAddress; +char *authDir; +int autoRescan; +int removeDomainname; +char *keyFile; +char *accessFile; +char **exportList; +#if !defined(HAVE_ARC4RANDOM) +char *randomFile; +#endif +#ifdef DEV_RANDOM +char *randomDevice; +#endif +#if !defined(HAVE_ARC4RANDOM) +char *prngdSocket; +int prngdPort; +#endif + +char *greeterLib; +char *willing; +int choiceTimeout; /* chooser choice timeout */ + +#define DM_STRING 0 +#define DM_INT 1 +#define DM_BOOL 2 +#define DM_ARGV 3 + +/* + * The following constants are supposed to be set in Makefile or config.h + * from parameters set in configure. DO NOT CHANGE THESE DEFINITIONS! + */ +#ifndef DEF_SERVER_LINE +# define DEF_SERVER_LINE ":0 local /usr/bin/X11/X :0" +#endif +#ifndef XRDB_PROGRAM +# define XRDB_PROGRAM "/usr/bin/X11/xrdb" +#endif +#ifndef DEF_SESSION +# define DEF_SESSION "/usr/bin/X11/xterm -ls" +#endif +#ifndef DEF_USER_PATH +# define DEF_USER_PATH ":/bin:/usr/bin:/usr/bin/X11:/usr/ucb" +#endif +#ifndef DEF_SYSTEM_PATH +# define DEF_SYSTEM_PATH "/etc:/bin:/usr/bin:/usr/bin/X11:/usr/ucb" +#endif +#ifndef DEF_SYSTEM_SHELL +# define DEF_SYSTEM_SHELL "/bin/sh" +#endif +#ifndef DEF_FAILSAFE_CLIENT +# define DEF_FAILSAFE_CLIENT "/usr/bin/X11/xterm" +#endif +#ifndef DEF_XDM_CONFIG +# define DEF_XDM_CONFIG "/usr/lib/X11/xdm/xdm-config" +#endif +#ifndef DEF_CHOOSER +# define DEF_CHOOSER "/usr/lib/X11/xdm/chooser" +#endif +#ifndef DEF_AUTH_NAME +# ifdef HASXDMAUTH +# define DEF_AUTH_NAME "XDM-AUTHORIZATION-1 MIT-MAGIC-COOKIE-1" +# else +# define DEF_AUTH_NAME "MIT-MAGIC-COOKIE-1" +# endif +#endif +#ifndef DEF_AUTH_DIR +# define DEF_AUTH_DIR "/usr/lib/X11/xdm" +#endif +#ifndef DEF_USER_AUTH_DIR +# define DEF_USER_AUTH_DIR "/tmp" +#endif +#ifndef DEF_KEY_FILE +# define DEF_KEY_FILE "" +#endif +#ifndef DEF_ACCESS_FILE +# define DEF_ACCESS_FILE "" +#endif +#ifndef DEF_RANDOM_FILE +# define DEF_RANDOM_FILE "/dev/mem" +#endif +#ifdef __SCO__ +# define DEF_PRNGD_SOCKET "/etc/egd-pool" +#else +# ifndef DEF_PRNGD_SOCKET +# define DEF_PRNGD_SOCKET "/tmp/entropy" +# endif +#endif +#ifndef DEF_PRNGD_PORT +# define DEF_PRNGD_PORT "0" +#endif +#ifndef DEF_GREETER_LIB +# define DEF_GREETER_LIB "/usr/lib/X11/xdm/libXdmGreet.so" +#endif + +#define DEF_UDP_PORT "177" /* registered XDMCP port, dont change */ + +struct dmResources { + const char *name, *class; + int type; + char **dm_value; + const char *default_value; +} DmResources[] = { +{ "servers", "Servers", DM_STRING, &servers, + DEF_SERVER_LINE} , +{ "requestPort","RequestPort", DM_INT, (char **) &request_port, + DEF_UDP_PORT} , +{ "debugLevel", "DebugLevel", DM_INT, (char **) &debugLevel, + "0"} , +{ "errorLogFile","ErrorLogFile", DM_STRING, &errorLogFile, + ""} , +{ "daemonMode", "DaemonMode", DM_BOOL, (char **) &daemonMode, + "true"} , +{ "pidFile", "PidFile", DM_STRING, &pidFile, + ""} , +{ "lockPidFile","LockPidFile", DM_BOOL, (char **) &lockPidFile, + "true"} , +{ "authDir", "authDir", DM_STRING, &authDir, + DEF_AUTH_DIR} , +{ "autoRescan", "AutoRescan", DM_BOOL, (char **) &autoRescan, + "true"} , +{ "removeDomainname","RemoveDomainname",DM_BOOL,(char **) &removeDomainname, + "true"} , +{ "keyFile", "KeyFile", DM_STRING, &keyFile, + DEF_KEY_FILE} , +{ "accessFile", "AccessFile", DM_STRING, &accessFile, + DEF_ACCESS_FILE} , +{ "exportList", "ExportList", DM_ARGV, (char **) &exportList, + ""} , +#if !defined(HAVE_ARC4RANDOM) +{ "randomFile", "RandomFile", DM_STRING, &randomFile, + DEF_RANDOM_FILE} , +{ "prngdSocket", "PrngdSocket", DM_STRING, &prngdSocket, + DEF_PRNGD_SOCKET}, +{ "prngdPort", "PrngdPort", DM_INT, (char **) &prngdPort, + DEF_PRNGD_PORT}, +#endif +#ifdef DEV_RANDOM +{ "randomDevice", "RandomDevice", DM_STRING, &randomDevice, + DEV_RANDOM} , +#endif +{ "greeterLib", "GreeterLib", DM_STRING, &greeterLib, + DEF_GREETER_LIB} , +{ "choiceTimeout","ChoiceTimeout",DM_INT, (char **) &choiceTimeout, + "15"} , +{ "sourceAddress","SourceAddress",DM_BOOL, (char **) &sourceAddress, + "false"} , +{ "willing", "Willing", DM_STRING, &willing, + ""} , +}; + +#define NUM_DM_RESOURCES (sizeof DmResources / sizeof DmResources[0]) + +#define boffset(f) XtOffsetOf(struct display, f) + +struct displayResource { + const char *name, *class; + int type; + int offset; + const char *default_value; +}; + +/* resources for managing the server */ + +struct displayResource serverResources[] = { +{ "serverAttempts","ServerAttempts",DM_INT, boffset(serverAttempts), + "1" }, +{ "openDelay", "OpenDelay", DM_INT, boffset(openDelay), + "15" }, +{ "openRepeat", "OpenRepeat", DM_INT, boffset(openRepeat), + "5" }, +{ "openTimeout","OpenTimeout", DM_INT, boffset(openTimeout), + "120" }, +{ "startAttempts","StartAttempts",DM_INT, boffset(startAttempts), + "4" }, +{ "reservAttempts","ReservAttempts",DM_INT, boffset(reservAttempts), + "2" }, +{ "pingInterval","PingInterval",DM_INT, boffset(pingInterval), + "5" }, +{ "pingTimeout","PingTimeout", DM_INT, boffset(pingTimeout), + "5" }, +{ "terminateServer","TerminateServer",DM_BOOL, boffset(terminateServer), + "false" }, +{ "grabServer", "GrabServer", DM_BOOL, boffset(grabServer), + "false" }, +{ "grabTimeout","GrabTimeout", DM_INT, boffset(grabTimeout), + "3" }, +{ "resetSignal","Signal", DM_INT, boffset(resetSignal), + "1" }, /* SIGHUP */ +{ "termSignal", "Signal", DM_INT, boffset(termSignal), + "15" }, /* SIGTERM */ +{ "resetForAuth","ResetForAuth",DM_BOOL, boffset(resetForAuth), + "false" }, +{ "authorize", "Authorize", DM_BOOL, boffset(authorize), + "true" }, +{ "authComplain","AuthComplain",DM_BOOL, boffset(authComplain), + "true" }, +{ "authName", "AuthName", DM_ARGV, boffset(authNames), + DEF_AUTH_NAME }, +{ "authFile", "AuthFile", DM_STRING, boffset(clientAuthFile), + "" }, +}; + +#define NUM_SERVER_RESOURCES (sizeof serverResources/\ + sizeof serverResources[0]) + +/* resources which control the session behaviour */ + +struct displayResource sessionResources[] = { +{ "resources", "Resources", DM_STRING, boffset(resources), + "" }, +{ "xrdb", "Xrdb", DM_STRING, boffset(xrdb), + XRDB_PROGRAM }, +{ "setup", "Setup", DM_STRING, boffset(setup), + "" }, +{ "startup", "Startup", DM_STRING, boffset(startup), + "" }, +{ "reset", "Reset", DM_STRING, boffset(reset), + "" }, +{ "session", "Session", DM_STRING, boffset(session), + DEF_SESSION }, +{ "userPath", "Path", DM_STRING, boffset(userPath), + DEF_USER_PATH }, +{ "systemPath", "Path", DM_STRING, boffset(systemPath), + DEF_SYSTEM_PATH }, +{ "systemShell","Shell", DM_STRING, boffset(systemShell), + DEF_SYSTEM_SHELL }, +{ "failsafeClient","FailsafeClient", DM_STRING, boffset(failsafeClient), + DEF_FAILSAFE_CLIENT }, +{ "userAuthDir","UserAuthDir", DM_STRING, boffset(userAuthDir), + DEF_USER_AUTH_DIR }, +{ "chooser", "Chooser", DM_STRING, boffset(chooser), + DEF_CHOOSER }, +}; + +#define NUM_SESSION_RESOURCES (sizeof sessionResources/\ + sizeof sessionResources[0]) + +XrmDatabase DmResourceDB; + +static void +GetResource ( + const char *name, + const char *class, + int valueType, + char **valuep, + const char *default_value) +{ + char *type; + XrmValue value; + const char *string; + char *new_string; + char str_buf[50]; + int len; + + if (DmResourceDB && XrmGetResource (DmResourceDB, + name, class, + &type, &value)) + { + string = value.addr; + len = value.size; + } + else + { + string = default_value; + len = strlen (string); + } + + Debug ("%s/%s value %*.*s\n", name, class, len, len, string); + + if (valueType == DM_STRING && *valuep) + { + if (strlen (*valuep) == len && !strncmp (*valuep, string, len)) + return; + else + free (*valuep); + } + + switch (valueType) { + case DM_STRING: + new_string = malloc ((unsigned) (len+1)); + if (!new_string) { + LogOutOfMem ("GetResource"); + return; + } + strncpy (new_string, string, len); + new_string[len] = '\0'; + *(valuep) = new_string; + break; + case DM_INT: + strncpy (str_buf, string, sizeof (str_buf)); + str_buf[sizeof (str_buf)-1] = '\0'; + *((int *) valuep) = atoi (str_buf); + break; + case DM_BOOL: + strncpy (str_buf, string, sizeof (str_buf)); + str_buf[sizeof (str_buf)-1] = '\0'; + XmuCopyISOLatin1Lowered (str_buf, str_buf); + if (!strcmp (str_buf, "true") || + !strcmp (str_buf, "on") || + !strcmp (str_buf, "yes")) + *((int *) valuep) = 1; + else if (!strcmp (str_buf, "false") || + !strcmp (str_buf, "off") || + !strcmp (str_buf, "no")) + *((int *) valuep) = 0; + break; + case DM_ARGV: + freeArgs (*(char ***) valuep); + *((char ***) valuep) = parseArgs ((char **) 0, string); + break; + } +} + +XrmOptionDescRec configTable [] = { +{"-server", NULL, XrmoptionSkipArg, (caddr_t) NULL }, +{"-udpPort", NULL, XrmoptionSkipArg, (caddr_t) NULL }, +{"-error", NULL, XrmoptionSkipArg, (caddr_t) NULL }, +{"-resources", NULL, XrmoptionSkipArg, (caddr_t) NULL }, +{"-session", NULL, XrmoptionSkipArg, (caddr_t) NULL }, +{"-debug", NULL, XrmoptionSkipArg, (caddr_t) NULL }, +{"-xrm", NULL, XrmoptionSkipArg, (caddr_t) NULL }, +{"-config", ".configFile", XrmoptionSepArg, (caddr_t) NULL } +}; + +XrmOptionDescRec optionTable [] = { +{"-server", ".servers", XrmoptionSepArg, (caddr_t) NULL }, +{"-udpPort", ".requestPort", XrmoptionSepArg, (caddr_t) NULL }, +{"-error", ".errorLogFile", XrmoptionSepArg, (caddr_t) NULL }, +{"-resources", "*resources", XrmoptionSepArg, (caddr_t) NULL }, +{"-session", "*session", XrmoptionSepArg, (caddr_t) NULL }, +{"-debug", "*debugLevel", XrmoptionSepArg, (caddr_t) NULL }, +{"-xrm", NULL, XrmoptionResArg, (caddr_t) NULL }, +{"-daemon", ".daemonMode", XrmoptionNoArg, "true" }, +{"-nodaemon", ".daemonMode", XrmoptionNoArg, "false" } +}; + +static int originalArgc; +static char **originalArgv; + +void +InitResources (int argc, char **argv) +{ + XrmInitialize (); + originalArgc = argc; + originalArgv = argv; + ReinitResources (); +} + +void +ReinitResources (void) +{ + int argc; + char **a; + char **argv; + XrmDatabase newDB; + + argv = malloc ((originalArgc + 1) * sizeof (char *)); + if (!argv) + LogPanic ("no space for argument realloc\n"); + for (argc = 0; argc < originalArgc; argc++) + argv[argc] = originalArgv[argc]; + argv[argc] = NULL; + if (DmResourceDB) + XrmDestroyDatabase (DmResourceDB); + DmResourceDB = XrmGetStringDatabase (""); + /* pre-parse the command line to get the -config option, if any */ + XrmParseCommand (&DmResourceDB, configTable, + sizeof (configTable) / sizeof (configTable[0]), + "DisplayManager", &argc, argv); + GetResource ("DisplayManager.configFile", "DisplayManager.ConfigFile", + DM_STRING, &config, DEF_XDM_CONFIG); + newDB = XrmGetFileDatabase ( config ); + if (newDB) + { + if (DmResourceDB) + XrmDestroyDatabase (DmResourceDB); + DmResourceDB = newDB; + } + else if (argc != originalArgc) + LogError ("Can't open configuration file %s\n", config ); + XrmParseCommand (&DmResourceDB, optionTable, + sizeof (optionTable) / sizeof (optionTable[0]), + "DisplayManager", &argc, argv); + if (argc > 1) + { + LogError ("extra arguments on command line:"); + for (a = argv + 1; *a; a++) + LogAppend (" \"%s\"", *a); + LogAppend ("\n"); + } + free (argv); +} + +void +LoadDMResources (void) +{ + int i; + char name[1024], class[1024]; + + for (i = 0; i < NUM_DM_RESOURCES; i++) { + snprintf (name, sizeof(name), "DisplayManager.%s", DmResources[i].name); + snprintf (class, sizeof(class), "DisplayManager.%s", DmResources[i].class); + GetResource (name, class, DmResources[i].type, + (char **) DmResources[i].dm_value, + DmResources[i].default_value); + } +} + +static void +CleanUpName (char *src, char *dst, int len) +{ + while (*src) { + if (--len <= 0) + break; + switch (*src) + { + case ':': + case '.': + *dst++ = '_'; + break; + default: + *dst++ = *src; + } + ++src; + } + *dst = '\0'; +} + +static void +LoadDisplayResources ( + struct display *d, + struct displayResource *resources, + int numResources) +{ + int i; + char name[1024], class[1024]; + char dpyName[512], dpyClass[512]; + + CleanUpName (d->name, dpyName, sizeof (dpyName)); + CleanUpName (d->class ? d->class : d->name, dpyClass, sizeof (dpyClass)); + for (i = 0; i < numResources; i++) { + snprintf (name, sizeof(name), "DisplayManager.%s.%s", + dpyName, resources[i].name); + snprintf (class, sizeof(class), "DisplayManager.%s.%s", + dpyClass, resources[i].class); + GetResource (name, class, resources[i].type, + (char **) (((char *) d) + resources[i].offset), + resources[i].default_value); + } +} + +void +LoadServerResources (struct display *d) +{ + LoadDisplayResources (d, serverResources, NUM_SERVER_RESOURCES); +} + +void +LoadSessionResources (struct display *d) +{ + LoadDisplayResources (d, sessionResources, NUM_SESSION_RESOURCES); +} diff --git a/xdm/server.c b/xdm/server.c new file mode 100644 index 0000000..c645753 --- /dev/null +++ b/xdm/server.c @@ -0,0 +1,337 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * server.c - manage the X server + */ + +#include "dm.h" +#include "dm_error.h" +#include "dm_socket.h" + +#include <X11/Xlib.h> +#include <X11/Xos.h> +#include <stdio.h> +#include <signal.h> +#include <errno.h> +#include <sys/socket.h> + +static int receivedUsr1; + +static int serverPause (unsigned t, pid_t serverPid); + +/* ARGSUSED */ +static SIGVAL +CatchUsr1 (int n) +{ + int olderrno = errno; + + Debug ("display manager caught SIGUSR1\n"); + ++receivedUsr1; + errno = olderrno; +} + +const char *_SysErrorMsg (int n) +{ + const char *s = strerror(n); + return (s ? s : "unknown error"); +} + +static int +StartServerOnce (struct display *d) +{ + char **f; + char **argv; + char arg[1024]; + pid_t pid; + + Debug ("StartServer for %s\n", d->name); + receivedUsr1 = 0; + (void) Signal (SIGUSR1, CatchUsr1); + argv = d->argv; + switch (pid = fork ()) { + case 0: + CleanUpChild (); + if (d->authFile) { + snprintf (arg, sizeof(arg), "-auth %s", d->authFile); + argv = parseArgs (argv, arg); + } + if (!argv) { + LogError ("StartServer: no arguments\n"); + sleep ((unsigned) d->openDelay); + exit (UNMANAGE_DISPLAY); + } + for (f = argv; *f; f++) + Debug ("'%s' ", *f); + Debug ("\n"); + /* + * give the server SIGUSR1 ignored, + * it will notice that and send SIGUSR1 + * when ready + */ + (void) Signal (SIGUSR1, SIG_IGN); + (void) execv (argv[0], argv); + LogError ("server %s cannot be executed\n", + argv[0]); + sleep ((unsigned) d->openDelay); + exit (REMANAGE_DISPLAY); + case -1: + LogError ("fork failed, sleeping\n"); + return 0; + default: + break; + } + Debug ("Server Started %d\n", pid); + d->serverPid = pid; + if (serverPause ((unsigned) d->openDelay, pid)) + return FALSE; + return TRUE; +} + +int +StartServer (struct display *d) +{ + int i; + int ret = FALSE; + + i = 0; + while (d->serverAttempts == 0 || i < d->serverAttempts) + { + if ((ret = StartServerOnce (d)) == TRUE) + break; + sleep (d->openDelay); + i++; + } + return ret; +} + +/* + * sleep for t seconds, return 1 if the server is dead when + * the sleep finishes, 0 else + */ + +static Jmp_buf pauseAbort; +static int serverPauseRet; + +/* ARGSUSED */ +static SIGVAL +serverPauseAbort (int n) +{ + Longjmp (pauseAbort, 1); +} + +/* ARGSUSED */ +static SIGVAL +serverPauseUsr1 (int n) +{ + Debug ("display manager paused til SIGUSR1\n"); + ++receivedUsr1; + Longjmp (pauseAbort, 1); +} + +static int +serverPause (unsigned t, pid_t serverPid) +{ + pid_t pid; + + serverPauseRet = 0; + if (!Setjmp (pauseAbort)) { + (void) Signal (SIGALRM, serverPauseAbort); + (void) Signal (SIGUSR1, serverPauseUsr1); + if (!receivedUsr1) + (void) alarm (t); + else + Debug ("Already received USR1\n"); + for (;;) { + /* + * wait() is unsafe. Other Xserver or xdm processes may + * exit at this time and this will remove the wait status. + * This means the main loop will not restart the display. + */ + if (!receivedUsr1) + pid = waitpid (serverPid, (int *) 0, 0); + else + pid = waitpid (serverPid, (int *) 0, WNOHANG); + + if (pid == serverPid || + (pid == -1 && errno == ECHILD)) + { + Debug ("Server dead\n"); + serverPauseRet = 1; + break; + } + + if (pid == 0) { + Debug ("Server alive and kicking\n"); + break; + } + } + } + (void) alarm ((unsigned) 0); + (void) Signal (SIGALRM, SIG_DFL); + (void) Signal (SIGUSR1, CatchUsr1); + if (serverPauseRet) { + Debug ("Server died\n"); + LogError ("server unexpectedly died\n"); + } + return serverPauseRet; +} + + +/* + * this code is complicated by some TCP failings. On + * many systems, the connect will occasionally hang forever, + * this trouble is avoided by setting up a timeout to Longjmp + * out of the connect (possibly leaving piles of garbage around + * inside Xlib) and give up, terminating the server. + */ + +static Jmp_buf openAbort; + +/* ARGSUSED */ +static SIGVAL +abortOpen (int n) +{ + Longjmp (openAbort, 1); +} + + +static int +openErrorHandler (Display *dpy) +{ + LogError ("IO Error in XOpenDisplay\n"); + exit (OPENFAILED_DISPLAY); + /*NOTREACHED*/ + return(0); +} + +int +WaitForServer (struct display *d) +{ + static int i; + + for (i = 0; i < (d->openRepeat > 0 ? d->openRepeat : 1); i++) { + (void) Signal (SIGALRM, abortOpen); + (void) alarm ((unsigned) d->openTimeout); + if (!Setjmp (openAbort)) { + Debug ("Before XOpenDisplay(%s)\n", d->name); + errno = 0; + (void) XSetIOErrorHandler (openErrorHandler); + d->dpy = XOpenDisplay (d->name); + (void) alarm ((unsigned) 0); + (void) Signal (SIGALRM, SIG_DFL); + (void) XSetIOErrorHandler ((int (*)(Display *)) 0); + Debug ("After XOpenDisplay(%s)\n", d->name); + if (d->dpy) { + RegisterCloseOnFork (ConnectionNumber (d->dpy)); + (void) fcntl (ConnectionNumber (d->dpy), F_SETFD, 0); + return 1; + } else { + Debug ("OpenDisplay failed %d (%s) on \"%s\"\n", + errno, strerror (errno), d->name); + } + Debug ("waiting for server to start %d\n", i); + sleep ((unsigned) d->openDelay); + } else { + Debug ("hung in open, aborting\n"); + LogError ("Hung in XOpenDisplay(%s), aborting\n", d->name); + (void) Signal (SIGALRM, SIG_DFL); + break; + } + } + Debug ("giving up on server\n"); + LogError ("server open failed for %s, giving up\n", d->name); + return 0; +} + +void +ResetServer (struct display *d) +{ + if (d->dpy && d->displayType.origin != FromXDMCP) + pseudoReset (d->dpy); +} + +static Jmp_buf pingTime; + +static void +PingLost (void) +{ + Longjmp (pingTime, 1); +} + +/* ARGSUSED */ +static int +PingLostIOErr (Display *dpy) +{ + PingLost(); + return 0; +} + +/* ARGSUSED */ +static SIGVAL +PingLostSig (int n) +{ + PingLost(); +} + +int +PingServer (struct display *d, Display *alternateDpy) +{ + int (*oldError)(Display *); + SIGVAL (*oldSig)(int); + int oldAlarm; + static Display *aDpy; + + aDpy = (alternateDpy != NULL ? alternateDpy : d->dpy); + oldError = XSetIOErrorHandler (PingLostIOErr); + oldAlarm = alarm (0); + oldSig = Signal (SIGALRM, PingLostSig); + (void) alarm (d->pingTimeout * 60); + if (!Setjmp (pingTime)) + { + Debug ("Ping server\n"); + XSync (aDpy, 0); + } + else + { + Debug ("Server dead\n"); + (void) alarm (0); + (void) Signal (SIGALRM, SIG_DFL); + XSetIOErrorHandler (oldError); + return 0; + } + (void) alarm (0); + (void) Signal (SIGALRM, oldSig); + (void) alarm (oldAlarm); + Debug ("Server alive\n"); + XSetIOErrorHandler (oldError); + return 1; +} diff --git a/xdm/session.c b/xdm/session.c new file mode 100644 index 0000000..6edb010 --- /dev/null +++ b/xdm/session.c @@ -0,0 +1,657 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * session.c + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "dm.h" +#include "dm_auth.h" +#include "dm_error.h" +#include "greet.h" + +#include <X11/Xlib.h> +#include <signal.h> +#include <X11/Xatom.h> +#include <X11/Xmu/Error.h> +#include <errno.h> +#include <stdio.h> +#include <ctype.h> +#include <sys/types.h> +#include <grp.h> /* for initgroups */ + +static int runAndWait (char **args, char **environ); + +#include <pwd.h> +#include <unistd.h> + + +static struct dlfuncs dlfuncs = { + PingServer, + SessionPingFailed, + Debug, + RegisterCloseOnFork, + SecureDisplay, + UnsecureDisplay, + ClearCloseOnFork, + SetupDisplay, + LogError, + SessionExit, + DeleteXloginResources, + source, + defaultEnv, + setEnv, + putEnv, + parseArgs, + printEnv, + systemEnv, + LogOutOfMem, + setgrent, + getgrent, + endgrent, + getpwnam, + endpwent, + crypt, + }; + +static Bool StartClient( + struct verify_info *verify, + struct display *d, + pid_t *pidp, + char *name, + char *passwd); + +static pid_t clientPid; +static struct greet_info greet; +static struct verify_info verify; + +static Jmp_buf abortSession; + +/* ARGSUSED */ +static SIGVAL +catchTerm (int n) +{ + Longjmp (abortSession, 1); +} + +static Jmp_buf pingTime; + +/* ARGSUSED */ +static SIGVAL +catchAlrm (int n) +{ + Longjmp (pingTime, 1); +} + +static Jmp_buf tenaciousClient; + +/* ARGSUSED */ +static SIGVAL +waitAbort (int n) +{ + Longjmp (tenaciousClient, 1); +} + +#if defined(_POSIX_SOURCE) || defined(SYSV) || defined(SVR4) +# define killpg(pgrp, sig) kill(-(pgrp), sig) +#endif + +static void +AbortClient (pid_t pid) +{ + int sig = SIGTERM; + volatile int i; + pid_t retId; + + for (i = 0; i < 4; i++) { + if (killpg (pid, sig) == -1) { + switch (errno) { + case EPERM: + LogError ("xdm can't kill client\n"); + case EINVAL: + case ESRCH: + return; + } + } + if (!Setjmp (tenaciousClient)) { + (void) Signal (SIGALRM, waitAbort); + (void) alarm ((unsigned) 10); + retId = wait ((waitType *) 0); + (void) alarm ((unsigned) 0); + (void) Signal (SIGALRM, SIG_DFL); + if (retId == pid) + break; + } else + (void) Signal (SIGALRM, SIG_DFL); + sig = SIGKILL; + } +} + +void +SessionPingFailed (struct display *d) +{ + if (clientPid > 1) { + AbortClient (clientPid); + source (verify.systemEnviron, d->reset); + } + SessionExit (d, RESERVER_DISPLAY, TRUE); +} + +/* + * We need our own error handlers because we can't be sure what exit code Xlib + * will use, and our Xlib does exit(1) which matches REMANAGE_DISPLAY, which + * can cause a race condition leaving the display wedged. We need to use + * RESERVER_DISPLAY for IO errors, to ensure that the manager waits for the + * server to terminate. For other X errors, we should give up. + */ + +/*ARGSUSED*/ +static int +IOErrorHandler (Display *dpy) +{ + LogError ("fatal IO error %d (%s)\n", errno, _SysErrorMsg(errno)); + exit(RESERVER_DISPLAY); + /*NOTREACHED*/ + return 0; +} + +static int +ErrorHandler(Display *dpy, XErrorEvent *event) +{ + LogError ("X error\n"); + if (XmuPrintDefaultErrorMessage (dpy, event, stderr) == 0) return 0; + exit(UNMANAGE_DISPLAY); + /*NOTREACHED*/ +} + +void +ManageSession (struct display *d) +{ + static pid_t pid = 0; + Display *dpy; + greet_user_rtn greet_stat; + static GreetUserProc greet_user_proc = NULL; + + Debug ("ManageSession %s\n", d->name); + (void)XSetIOErrorHandler(IOErrorHandler); + (void)XSetErrorHandler(ErrorHandler); + setproctitle("%s", d->name); + + /* + * Load system default Resources + */ + LoadXloginResources (d); + + greet_user_proc = GreetUser; + + /* tell the possibly dynamically loaded greeter function + * what data structure formats to expect. + * These version numbers are registered with The Open Group. */ + verify.version = 1; + greet.version = 1; + greet_stat = (*greet_user_proc)(d, &dpy, &verify, &greet, &dlfuncs); + + if (greet_stat == Greet_Success) { + clientPid = 0; + if (!Setjmp (abortSession)) { + (void) Signal (SIGTERM, catchTerm); + /* + * Start the clients, changing uid/groups + * setting up environment and running the session + */ + if (StartClient (&verify, d, &clientPid, greet.name, greet.password)) { + Debug ("Client Started\n"); + + /* + * Wait for session to end, + */ + for (;;) { + if (d->pingInterval) { + if (!Setjmp (pingTime)) { + (void) Signal (SIGALRM, catchAlrm); + (void) alarm (d->pingInterval * 60); + pid = wait ((waitType *) 0); + (void) alarm (0); + } else { + (void) alarm (0); + if (!PingServer (d, (Display *) NULL)) + SessionPingFailed (d); + } + } else { + pid = wait ((waitType *) 0); + } + if (pid == clientPid) + break; + } + } else { + LogError ("session start failed\n"); + } + } else { + /* + * when terminating the session, nuke + * the child and then run the reset script + */ + AbortClient (clientPid); + } + } + /* + * run system-wide reset file + */ + Debug ("Source reset program %s\n", d->reset); + source (verify.systemEnviron, d->reset); + SessionExit (d, OBEYSESS_DISPLAY, TRUE); +} + +void +LoadXloginResources (struct display *d) +{ + char **args; + char **env = NULL; + + if (d->resources[0] && access (d->resources, 4) == 0) { + env = systemEnv (d, (char *) 0, (char *) 0); + args = parseArgs ((char **) 0, d->xrdb); + args = parseArgs (args, d->resources); + Debug ("Loading resource file: %s\n", d->resources); + (void) runAndWait (args, env); + freeArgs (args); + freeEnv (env); + } +} + +void +SetupDisplay (struct display *d) +{ + char **env = NULL; + + if (d->setup && d->setup[0]) { + env = systemEnv (d, (char *) 0, (char *) 0); + (void) source (env, d->setup); + freeEnv (env); + } +} + +/*ARGSUSED*/ +void +DeleteXloginResources (struct display *d, Display *dpy) +{ + int i; + Atom prop = XInternAtom(dpy, "SCREEN_RESOURCES", True); + + XDeleteProperty(dpy, RootWindow (dpy, 0), XA_RESOURCE_MANAGER); + if (prop) { + for (i = ScreenCount(dpy); --i >= 0; ) + XDeleteProperty(dpy, RootWindow (dpy, i), prop); + } +} + +static Jmp_buf syncJump; + +/* ARGSUSED */ +static SIGVAL +syncTimeout (int n) +{ + Longjmp (syncJump, 1); +} + +void +SecureDisplay (struct display *d, Display *dpy) +{ + Debug ("SecureDisplay %s\n", d->name); + (void) Signal (SIGALRM, syncTimeout); + if (Setjmp (syncJump)) { + LogError ("WARNING: display %s could not be secured\n", + d->name); + SessionExit (d, RESERVER_DISPLAY, FALSE); + } + (void) alarm ((unsigned) d->grabTimeout); + Debug ("Before XGrabServer %s\n", d->name); + XGrabServer (dpy); + if (XGrabKeyboard (dpy, DefaultRootWindow (dpy), True, GrabModeAsync, + GrabModeAsync, CurrentTime) != GrabSuccess) { + (void) alarm (0); + (void) Signal (SIGALRM, SIG_DFL); + LogError ("WARNING: keyboard on display %s could not be secured\n", + d->name); + SessionExit (d, RESERVER_DISPLAY, FALSE); + } + Debug ("XGrabKeyboard succeeded %s\n", d->name); + (void) alarm (0); + (void) Signal (SIGALRM, SIG_DFL); + pseudoReset (dpy); + if (!d->grabServer) { + XUngrabServer (dpy); + XSync (dpy, 0); + } + Debug ("done secure %s\n", d->name); +} + +void +UnsecureDisplay (struct display *d, Display *dpy) +{ + Debug ("Unsecure display %s\n", d->name); + if (d->grabServer) { + XUngrabServer (dpy); + XSync (dpy, 0); + } +} + +void +SessionExit (struct display *d, int status, int removeAuth) +{ + + /* make sure the server gets reset after the session is over */ + if (d->serverPid >= 2 && d->resetSignal) + kill (d->serverPid, d->resetSignal); + else + ResetServer (d); + if (removeAuth) { + if (setgid (verify.gid) == -1) { + LogError( "SessionExit: setgid: %s\n", strerror(errno)); + exit(status); + } + if (setuid (verify.uid) == -1) { + LogError( "SessionExit: setuid: %s\n", strerror(errno)); + exit(status); + } + RemoveUserAuthorization (d, &verify); + } + Debug ("Display %s exiting with status %d\n", d->name, status); + exit (status); +} + +static Bool +StartClient ( + struct verify_info *verify, + struct display *d, + pid_t *pidp, + char *name, + char *passwd) +{ + char **f, *home; + char *failsafeArgv[2]; + pid_t pid; +#ifdef HAVE_SETUSERCONTEXT + struct passwd* pwd; +#endif + + if (pledge("stdio rpath wpath cpath fattr proc getpw id exec dns unix inet", NULL) != 0) + exit(25); + + if (verify->argv) { + Debug ("StartSession %s: ", verify->argv[0]); + for (f = verify->argv; *f; f++) + Debug ("%s ", *f); + Debug ("; "); + } + if (verify->userEnviron) { + for (f = verify->userEnviron; *f; f++) + Debug ("%s ", *f); + Debug ("\n"); + } + switch (pid = fork ()) { + case 0: + CleanUpChild (); + + + /* + * Set the user's credentials: uid, gid, groups, + * environment variables, resource limits, and umask. + */ + pwd = getpwnam(name); + if (pwd) { + if (setusercontext(NULL, pwd, pwd->pw_uid, LOGIN_SETALL) < 0) { + LogError ("setusercontext for \"%s\" failed: %s\n", + name, _SysErrorMsg (errno)); + return (0); + } + endpwent(); + } else { + LogError ("getpwnam for \"%s\" failed: %s\n", + name, _SysErrorMsg (errno)); + return (0); + } + + if (d->windowPath) + verify->userEnviron = setEnv(verify->userEnviron, "WINDOWPATH", d->windowPath); + + if (passwd != NULL) + bzero(passwd, strlen(passwd)); + + SetUserAuthorization (d, verify); + home = getEnv (verify->userEnviron, "HOME"); + if (home) + if (chdir (home) == -1) { + LogError ("user \"%s\": cannot chdir to home \"%s\" (err %d), using \"/\"\n", + getEnv (verify->userEnviron, "USER"), home, errno); + chdir ("/"); + verify->userEnviron = setEnv(verify->userEnviron, "HOME", "/"); + } + if (verify->argv) { + LogInfo ("executing session %s\n", verify->argv[0]); + execute (verify->argv, verify->userEnviron); + LogError ("Session \"%s\" execution failed (err %d)\n", verify->argv[0], errno); + } else { + LogError ("Session has no command/arguments\n"); + } + failsafeArgv[0] = d->failsafeClient; + failsafeArgv[1] = NULL; + execute (failsafeArgv, verify->userEnviron); + exit (1); + case -1: + if (passwd != NULL) + bzero(passwd, strlen(passwd)); + Debug ("StartSession, fork failed\n"); + LogError ("can't start session on \"%s\", fork failed: %s\n", + d->name, _SysErrorMsg (errno)); + return 0; + default: + if (passwd != NULL) + bzero(passwd, strlen(passwd)); + Debug ("StartSession, fork succeeded %d\n", pid); + *pidp = pid; + return 1; + } +} + +int +source (char **environ, char *file) +{ + char **args, *args_safe[2]; + int ret = 0; + FILE *f; + + if (file && file[0]) { + f = fopen (file, "r"); + if (!f) + LogInfo ("not sourcing %s (%s)\n", file, _SysErrorMsg (errno)); + else { + fclose (f); + LogInfo ("sourcing %s\n", file); + args = parseArgs ((char **) 0, file); + if (!args) { + args = args_safe; + args[0] = file; + args[1] = NULL; + } + ret = runAndWait (args, environ); + freeArgs (args); + } + } else + Debug ("source() given null pointer in file argument\n"); + return ret; +} + +static int +runAndWait (char **args, char **environ) +{ + pid_t pid; + waitType result; + + switch (pid = fork ()) { + case 0: + CleanUpChild (); + execute (args, environ); + LogError ("can't execute \"%s\" (err %d)\n", args[0], errno); + exit (1); + case -1: + Debug ("fork failed\n"); + LogError ("can't fork to execute \"%s\" (err %d)\n", args[0], errno); + return 1; + default: + while (wait (&result) != pid) + /* SUPPRESS 530 */ + ; + break; + } + return waitVal (result); +} + +void +execute (char **argv, char **environ) +{ + int err; + /* give /dev/null as stdin */ + (void) close (0); + open ("/dev/null", O_RDONLY); + /* make stdout follow stderr to the log file */ + dup2 (2,1); + Debug ("attempting to execve() %s\n", argv[0]); + execve (argv[0], argv, environ); + err = errno; + Debug ("execve() of %s failed: %s\n", argv[0], _SysErrorMsg (errno)); + /* + * In case this is a shell script which hasn't been + * made executable (or this is a SYSV box), do + * a reasonable thing + */ + if (err != ENOENT) { + char program[1024], *e, *p, *optarg; + FILE *f; + char **newargv, **av; + int argc; + + /* + * emulate BSD kernel behaviour -- read + * the first line; check if it starts + * with "#!", in which case it uses + * the rest of the line as the name of + * program to run. Else use "/bin/sh". + */ + f = fopen (argv[0], "r"); + if (!f) + return; + if (fgets (program, sizeof (program) - 1, f) == NULL) { + fclose (f); + return; + } + fclose (f); + e = program + strlen (program) - 1; + if (*e == '\n') + *e = '\0'; + if (!strncmp (program, "#!", 2)) { + p = program + 2; + while (*p && isspace (*p)) + ++p; + optarg = p; + while (*optarg && !isspace (*optarg)) + ++optarg; + if (*optarg) { + *optarg = '\0'; + do + ++optarg; + while (*optarg && isspace (*optarg)); + } else + optarg = NULL; + } else { + p = "/bin/sh"; + optarg = NULL; + } + Debug ("Shell script execution: %s (optarg %s)\n", + p, optarg ? optarg : "(null)"); + for (av = argv, argc = 0; *av; av++, argc++) + /* SUPPRESS 530 */ + ; + newargv = malloc ((argc + (optarg ? 3 : 2)) * sizeof (char *)); + if (!newargv) + return; + av = newargv; + *av++ = p; + if (optarg) + *av++ = optarg; + /* SUPPRESS 560 */ + while ((*av++ = *argv++)) + /* SUPPRESS 530 */ + ; + Debug ("Attempting to execve() %s\n", newargv[0]); + execve (newargv[0], newargv, environ); + } +} + +char ** +defaultEnv (void) +{ + char **env, **exp, *value; + + env = NULL; + for (exp = exportList; exp && *exp; ++exp) { + value = getenv (*exp); + if (value) + env = setEnv (env, *exp, value); + } + return env; +} + +char ** +systemEnv (struct display *d, char *user, char *home) +{ + char **env; + + env = defaultEnv (); + env = setEnv (env, "DISPLAY", d->name); + if (home) + env = setEnv (env, "HOME", home); + if (user) { + env = setEnv (env, "USER", user); + env = setEnv (env, "LOGNAME", user); + } + env = setEnv (env, "PATH", d->systemPath); + env = setEnv (env, "SHELL", d->systemShell); + if (d->authFile) + env = setEnv (env, "XAUTHORITY", d->authFile); + if (d->windowPath) + env = setEnv (env, "WINDOWPATH", d->windowPath); + return env; +} diff --git a/xdm/util.c b/xdm/util.c new file mode 100644 index 0000000..0cf876e --- /dev/null +++ b/xdm/util.c @@ -0,0 +1,273 @@ +/* + +Copyright 1989, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * util.c + * + * various utility routines + */ + +#include "dm.h" +#include "dm_error.h" + +#include <X11/Xmu/SysUtil.h> /* for XmuGetHostname */ + +#ifdef X_POSIX_C_SOURCE +# define _POSIX_C_SOURCE X_POSIX_C_SOURCE +# include <signal.h> +# undef _POSIX_C_SOURCE +#else +# define _POSIX_SOURCE +# include <signal.h> +# undef _POSIX_SOURCE +#endif + + + +void +printEnv (char **e) +{ + while (*e) + Debug ("%s\n", *e++); +} + +static char * +makeEnv (const char *name, const char *value) +{ + char *result; + + asprintf(&result, "%s=%s", name, value); + + if (!result) { + LogOutOfMem ("makeEnv"); + return NULL; + } + return result; +} + +char * +getEnv (char **e, const char *name) +{ + int l = strlen (name); + + if (!e) return NULL; + + while (*e) { + if ((int)strlen (*e) > l && !strncmp (*e, name, l) && + (*e)[l] == '=') + return (*e) + l + 1; + ++e; + } + return NULL; +} + +char ** +setEnv (char **e, const char *name, const char *value) +{ + char **new, **old; + char *newe; + int envsize; + int l; + + l = strlen (name); + newe = makeEnv (name, value); + if (!newe) { + LogOutOfMem ("setEnv"); + return e; + } + if (e) { + for (old = e; *old; old++) + if ((int)strlen (*old) > l && !strncmp (*old, name, l) && (*old)[l] == '=') + break; + if (*old) { + free (*old); + *old = newe; + return e; + } + envsize = old - e; + new = realloc ((char *) e, + (unsigned) ((envsize + 2) * sizeof (char *))); + } else { + envsize = 0; + new = malloc (2 * sizeof (char *)); + } + if (!new) { + LogOutOfMem ("setEnv"); + free (newe); + return e; + } + new[envsize] = newe; + new[envsize+1] = NULL; + return new; +} + +char ** +putEnv(const char *string, char **env) +{ + char *v, *b, *n; + int nl; + + if ((b = strchr(string, '=')) == NULL) + return NULL; + v = b + 1; + + nl = b - string; + if ((n = malloc(nl + 1)) == NULL) + { + LogOutOfMem ("putAllEnv"); + return NULL; + } + + strncpy(n, string,nl + 1); + n[nl] = 0; + + env = setEnv(env,n,v); + free(n); + return env; +} + +void +freeEnv (char **env) +{ + char **e; + + if (env) + { + for (e = env; *e; e++) + free (*e); + free (env); + } +} + +#define isblank(c) ((c) == ' ' || c == '\t') + +char ** +parseArgs (char **argv, const char *string) +{ + const char *word; + char *save; + char **newargv; + int i; + + i = 0; + while (argv && argv[i]) + ++i; + if (!argv) { + argv = malloc (sizeof (char *)); + if (!argv) { + LogOutOfMem ("parseArgs"); + return NULL; + } + } + word = string; + for (;;) { + if (!*string || isblank (*string)) { + if (word != string) { + newargv = realloc ((char *) argv, + (unsigned) ((i + 2) * sizeof (char *))); + save = malloc ((unsigned) (string - word + 1)); + if (!newargv || !save) { + LogOutOfMem ("parseArgs"); + free (argv); + free (newargv); + free (save); + return NULL; + } else { + argv = newargv; + } + argv[i] = strncpy (save, word, string-word); + argv[i][string-word] = '\0'; + i++; + } + if (!*string) + break; + word = string + 1; + } + ++string; + } + argv[i] = NULL; + return argv; +} + +void +freeArgs (char **argv) +{ + char **a; + + if (!argv) + return; + + for (a = argv; *a; a++) + free (*a); + free (argv); +} + +void +CleanUpChild (void) +{ + setsid(); +#ifdef SIGCHLD + (void) Signal (SIGCHLD, SIG_DFL); +#endif + (void) Signal (SIGTERM, SIG_DFL); + (void) Signal (SIGPIPE, SIG_DFL); + (void) Signal (SIGALRM, SIG_DFL); + (void) Signal (SIGHUP, SIG_DFL); + CloseOnFork (); +} + +static char localHostbuf[256]; +static int gotLocalHostname; + +char * +localHostname (void) +{ + if (!gotLocalHostname) + { + XmuGetHostname (localHostbuf, sizeof (localHostbuf) - 1); + gotLocalHostname = 1; + } + return localHostbuf; +} + +SIGVAL (*Signal (int sig, SIGFUNC handler))(int) +{ +#ifdef HAVE_SIGACTION + struct sigaction sigact, osigact; + sigact.sa_handler = handler; + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; + sigaction(sig, &sigact, &osigact); + return osigact.sa_handler; +#else /* __UNIXOS2__ */ + return signal(sig, handler); +#endif +} diff --git a/xdm/xdmauth.c b/xdm/xdmauth.c new file mode 100644 index 0000000..b3c1c16 --- /dev/null +++ b/xdm/xdmauth.c @@ -0,0 +1,284 @@ +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * xdmauth + * + * generate authorization data for XDM-AUTHORIZATION-1 as per XDMCP spec + */ + +#include "dm.h" +#include "dm_auth.h" +#include "dm_error.h" + +#ifdef HASXDMAUTH + +static char auth_name[256]; +static int auth_name_len; + +static void +XdmPrintDataHex (const char *s, const char *a, int l) +{ + int i; + + Debug ("%s", s); + for (i = 0; i < l; i++) + Debug (" %02x", a[i] & 0xff); + Debug ("\n"); +} + +# ifdef XDMCP +static void +XdmPrintArray8Hex (const char *s, ARRAY8Ptr a) +{ + XdmPrintDataHex (s, (char *) a->data, a->length); +} +# endif + +void +XdmInitAuth (unsigned short name_len, char *name) +{ + if (name_len > 256) + name_len = 256; + auth_name_len = name_len; + memmove( auth_name, name, name_len); +} + +/* + * Generate authorization for XDM-AUTHORIZATION-1 + * + * When being used with XDMCP, 8 bytes are generated for the session key + * (sigma), as the random number (rho) is already shared between xdm and + * the server. Otherwise, we'll prepend a random number to pass in the file + * between xdm and the server (16 bytes total) + */ + +static Xauth * +XdmGetAuthHelper (unsigned short namelen, char *name, int includeRho) +{ + Xauth *new; + new = malloc (sizeof (Xauth)); + + if (!new) + return (Xauth *) 0; + new->family = FamilyWild; + new->address_length = 0; + new->address = NULL; + new->number_length = 0; + new->number = NULL; + if (includeRho) + new->data_length = 16; + else + new->data_length = 8; + + new->data = malloc (new->data_length); + if (!new->data) + { + free (new); + return (Xauth *) 0; + } + new->name = malloc (namelen); + if (!new->name) + { + free (new->data); + free (new); + return (Xauth *) 0; + } + memmove( (char *)new->name, name, namelen); + new->name_length = namelen; + if (!GenerateAuthData ((char *)new->data, new->data_length)) + { + free (new->name); + free (new->data); + free (new); + return (Xauth *) 0; + } + /* + * set the first byte of the session key to zero as it + * is a DES key and only uses 56 bits + */ + ((char *)new->data)[new->data_length - 8] = '\0'; + XdmPrintDataHex ("Local server auth", (char *)new->data, new->data_length); + return new; +} + +Xauth * +XdmGetAuth (unsigned short namelen, char *name) +{ + return XdmGetAuthHelper (namelen, name, TRUE); +} + +# ifdef XDMCP + +void +XdmGetXdmcpAuth (struct protoDisplay *pdpy, + unsigned short authorizationNameLen, char *authorizationName) +{ + Xauth *fileauth, *xdmcpauth; + + if (pdpy->fileAuthorization && pdpy->xdmcpAuthorization) + return; + xdmcpauth = XdmGetAuthHelper (authorizationNameLen, authorizationName, FALSE); + if (!xdmcpauth) + return; + fileauth = malloc (sizeof (Xauth)); + if (!fileauth) + { + XauDisposeAuth(xdmcpauth); + return; + } + /* build the file auth from the XDMCP auth */ + *fileauth = *xdmcpauth; + fileauth->name = malloc (xdmcpauth->name_length); + fileauth->data = malloc (16); + fileauth->data_length = 16; + if (!fileauth->name || !fileauth->data) + { + XauDisposeAuth (xdmcpauth); + free (fileauth->name); + free (fileauth->data); + free (fileauth); + return; + } + /* + * for the file authorization, prepend the random number (rho) + * which is simply the number we've been passing back and + * forth via XDMCP + */ + memmove( fileauth->name, xdmcpauth->name, xdmcpauth->name_length); + memmove( fileauth->data, pdpy->authenticationData.data, 8); + memmove( fileauth->data + 8, xdmcpauth->data, 8); + XdmPrintDataHex ("Accept packet auth", xdmcpauth->data, xdmcpauth->data_length); + XdmPrintDataHex ("Auth file auth", fileauth->data, fileauth->data_length); + /* encrypt the session key for its trip back to the server */ + XdmcpWrap ((unsigned char *)xdmcpauth->data, (unsigned char *)&pdpy->key, + (unsigned char *)xdmcpauth->data, 8); + pdpy->fileAuthorization = fileauth; + pdpy->xdmcpAuthorization = xdmcpauth; +} + +# define atox(c) ('0' <= c && c <= '9' ? c - '0' : \ + 'a' <= c && c <= 'f' ? c - 'a' + 10 : \ + 'A' <= c && c <= 'F' ? c - 'A' + 10 : -1) + +static int +HexToBinary(char *key) +{ + char *out, *in; + int top, bottom; + + in = key + 2; + out= key; + while (in[0] && in[1]) + { + top = atox(in[0]); + if (top == -1) + return 0; + bottom = atox(in[1]); + if (bottom == -1) + return 0; + *out++ = (top << 4) | bottom; + in += 2; + } + if (in[0]) + return 0; + *out++ = '\0'; + return 1; +} + +/* + * Search the Keys file for the entry matching this display. This + * routine accepts either plain ascii strings for keys, or hex-encoded numbers + */ + +static int +XdmGetKey(struct protoDisplay *pdpy, ARRAY8Ptr displayID) +{ + FILE *keys; + char line[1024], id[1024], key[1024]; + int keylen; + + Debug ("Lookup key for %*.*s\n", displayID->length, displayID->length, displayID->data); + keys = fopen (keyFile, "r"); + if (!keys) + return FALSE; + while (fgets (line, sizeof (line) - 1, keys)) + { + if (line[0] == '#' || sscanf (line, "%s %s", id, key) != 2) + continue; + bzero(line, sizeof(line)); + Debug ("Key entry for \"%s\" %ld bytes\n", id, strlen(key)); + if (strlen (id) == displayID->length && + !strncmp (id, (char *)displayID->data, displayID->length)) + { + if (!strncmp (key, "0x", 2) || !strncmp (key, "0X", 2)) + if (!HexToBinary (key)) + break; + keylen = strlen (key); + while (keylen < 7) + key[keylen++] = '\0'; + pdpy->key.data[0] = '\0'; + memmove( pdpy->key.data + 1, key, 7); + bzero(key, sizeof(key)); + fclose (keys); + return TRUE; + } + } + bzero(line, sizeof(line)); + bzero(key, sizeof(key)); + fclose (keys); + return FALSE; +} + +/*ARGSUSED*/ +int +XdmCheckAuthentication(struct protoDisplay *pdpy, ARRAY8Ptr displayID, + ARRAY8Ptr authenticationName, ARRAY8Ptr authenticationData) +{ + XdmAuthKeyPtr incoming; + + if (!XdmGetKey (pdpy, displayID)) + return FALSE; + if (authenticationData->length != 8) + return FALSE; + XdmcpUnwrap (authenticationData->data, (unsigned char *)&pdpy->key, + authenticationData->data, 8); + XdmPrintArray8Hex ("Request packet auth", authenticationData); + if (!XdmcpCopyARRAY8(authenticationData, &pdpy->authenticationData)) + return FALSE; + incoming = (XdmAuthKeyPtr) authenticationData->data; + XdmcpIncrementKey (incoming); + XdmcpWrap (authenticationData->data, (unsigned char *)&pdpy->key, + authenticationData->data, 8); + return TRUE; +} + +# endif /* XDMCP */ +#endif /* HASXDMAUTH (covering the entire file) */ |