summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore79
-rw-r--r--AUTHORS23
-rw-r--r--COPYING165
-rw-r--r--Makefile.am55
-rw-r--r--Makefile.bsd-wrapper61
-rw-r--r--README50
-rw-r--r--config/GiveConsole14
-rw-r--r--config/Makefile.am62
-rw-r--r--config/OpenBSD_15bpp.xpm6613
-rw-r--r--config/OpenBSD_1bpp.xpm181
-rw-r--r--config/OpenBSD_4bpp.xpm192
-rw-r--r--config/OpenBSD_8bpp.xpm307
-rw-r--r--config/README10
-rw-r--r--config/TakeConsole11
-rw-r--r--config/Xaccess98
-rw-r--r--config/Xreset.cpp5
-rw-r--r--config/Xresources.cpp147
-rw-r--r--config/Xservers.fs10
-rw-r--r--config/Xservers.ws.cpp12
-rw-r--r--config/Xsession.cpp111
-rw-r--r--config/Xsetup_08
-rw-r--r--config/Xstartup.cpp10
-rw-r--r--config/Xwilling11
-rw-r--r--config/xdm-config.cpp44
-rw-r--r--config/xorg-bw.xpm264
-rw-r--r--config/xorg.xpm701
-rw-r--r--configure.ac446
-rw-r--r--cpprules.in26
-rw-r--r--greeter/Login.c2099
-rw-r--r--greeter/Login.h227
-rw-r--r--greeter/LoginP.h192
-rw-r--r--greeter/Makefile.am26
-rw-r--r--greeter/greet.c394
-rw-r--r--greeter/verify.c213
-rw-r--r--include/Makefile.am6
-rw-r--r--include/dm.h403
-rw-r--r--include/dm_auth.h99
-rw-r--r--include/dm_error.h46
-rw-r--r--include/dm_socket.h45
-rw-r--r--include/greet.h207
-rw-r--r--m4/ax_define_dir.m449
-rw-r--r--man/Makefile.am43
-rw-r--r--man/xdm.man1466
-rw-r--r--xdm/Makefile.am56
-rw-r--r--xdm/auth.c1025
-rw-r--r--xdm/dm.c740
-rw-r--r--xdm/dpylist.c248
-rw-r--r--xdm/error.c136
-rw-r--r--xdm/file.c249
-rw-r--r--xdm/genauth.c116
-rw-r--r--xdm/mitauth.c93
-rw-r--r--xdm/netaddr.c239
-rw-r--r--xdm/protodpy.c164
-rw-r--r--xdm/reset.c113
-rw-r--r--xdm/resource.c512
-rw-r--r--xdm/server.c337
-rw-r--r--xdm/session.c657
-rw-r--r--xdm/util.c273
-rw-r--r--xdm/xdmauth.c284
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
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..c5bd36b
--- /dev/null
+++ b/AUTHORS
@@ -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
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..f72efe4
--- /dev/null
+++ b/COPYING
@@ -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>
diff --git a/README b/README
new file mode 100644
index 0000000..b3eaf7b
--- /dev/null
+++ b/README
@@ -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) */