http://apple.doit.wisc.edu/mirrors/amug/linux/linuxppc/sources/tarballs/xscreensaver...
authorZygo Blaxell <zblaxell@hungrycats.org>
Mon, 2 Mar 2009 05:42:34 +0000 (00:42 -0500)
committerZygo Blaxell <zblaxell@hungrycats.org>
Mon, 2 Mar 2009 05:42:34 +0000 (00:42 -0500)
-rw-r--r-- 1 zblaxell zblaxell 1096554 May 11  1999 xscreensaver-3.12.tar.gz
05e6cd8efe68b24d507581bb11a7c6adf958028c  xscreensaver-3.12.tar.gz

48 files changed:
README
config.h.in
configure
configure.in
driver/Makefile.in
driver/XScreenSaver.ad.in
driver/XScreenSaver_ad.h
driver/demo.c
driver/lock.c
driver/passwd-pam.c
driver/passwd-pwent.c
driver/passwd.c
driver/prefs.c
driver/prefs.h
driver/setuid.c
driver/splash.c
driver/stderr.c
driver/subprocs.c
driver/test-passwd.c
driver/timers.c
driver/windows.c
driver/xscreensaver-command.c
driver/xscreensaver-command.man
driver/xscreensaver-demo.man
driver/xscreensaver.c
driver/xscreensaver.h
driver/xscreensaver.man
hacks/flag.c
hacks/glx/Makefile.in
hacks/glx/pipes.c
hacks/glx/pulsar.c
hacks/glx/xlock-gl.c
hacks/images/matrix.xpm
hacks/phosphor.c
hacks/screenhack.c
hacks/sonar.c
hacks/xjack.c
hacks/xlockmoreI.h
hacks/xmatrix.c
utils/Makefile.in
utils/compile_axp.com
utils/compile_decc.com
utils/version.h
utils/visual-gl.c [new file with mode: 0644]
utils/visual.c
utils/visual.h
xscreensaver.lsm
xscreensaver.spec

diff --git a/README b/README
index 417e248a26821e8165e3088f190f2c556f4afa91..9599795b3456f82ba357bae963d4cda9049a5b24 100644 (file)
--- a/README
+++ b/README
@@ -58,7 +58,7 @@ locking mode, when the proper password is typed.)
 
 It is trivially easy to add new display modes to xscreensaver: any program
 which can be invoked in such a way that it draws on the root window of the
-screen can be used as a screensaver.  You just change a resource setting --
+screen can be used as a screensaver.  You just change a config file --
 there's no need to recompile or reinstall anything.
 
                               ============
@@ -77,6 +77,46 @@ http://www.jwz.org/xscreensaver/.
 
                               ============
 
+Changes since 3.11:   * Made it so that you can't scroll the screen while the
+                        lock dialog is up (with XFree86 virtual viewports.)
+                      * Fixed a bug in `flag' that caused bob's chin to get cut
+                        off after a few iterations.
+Changes since 3.10:   * Made `xjack' be black-on-white-ish, so that it looks
+                        less like a computer screen and more like the
+                        typewritten paper it's supposed to be.
+                      * New version of `pulsar'.
+                      * Fixed Solaris compilation problem in `phosphor'.
+                      * Made xscreensaver notice XFree86's virtual root window
+                        hack, so that if the X server's root window is larger
+                        than the monitor's displayable resolution, the screen
+                        saver will limit itself to the area that actually
+                        appears on the screen.
+                      * Made the xscreensaver daemon do a better job of
+                        picking the visual class that should be used for GL
+                        programs.  Less user intervention should be needed
+                        now: you can use the logical visual name `GL' instead
+                        of having to figure out by hand which one to use.
+                      * Oops, the visual was defaulting to "best" instead of
+                        "default", because the .xscreensaver file was not being
+                        loaded quite early enough.
+                      * Made configure figure out how to build icmp ping
+                        support into the `sonar' hack automatically.
+                      * Made warnings about not being able to read shadow
+                        passwords not be printed if compiled with PAM support.
+                      * Improved PAM startup diagnostics.
+                      * Worked around the Solaris PAM bug that was causing
+                        crashes there, so now PAM is turned on by default.
+                      * Made configure detect the number of arguments that
+                        pam_strerror() takes, since on Linux, this apparently
+                        changed between 2.0 and 2.2, sigh.
+                      * Made the /proc/interrupts kludge look for "PS/2 Mouse"
+                        as well as "keyboard".
+                      * Made xscreensaver notice when there has been a sudden
+                        large jump in wall-clock time, and if so, lock right
+                        away, instead of waiting for "lockTimeout" to expire
+                        first.  (Laptops need this for safer recovery from
+                        ``hibernation.'')
+                      * Added `-throttle' option to `xscreensaver-command'.
 Changes since 3.09:   * Added `phosphor', `xmatrix', and `pulsar' hacks.
                       * Fixed a bug in the color allocator that sometimes
                         caused `starfish' to fall back to monochrome.
index 5707bd8c0ac99bb22f4763852a94dbc0b9bbae27..1d5cd07a1c5f0fd3a3afd15510f1cd4c09707285 100644 (file)
  */
 #undef HAVE_DPMS_EXTENSION
 
+/*  Define this if you have the functions XF86VidModeGetModeLine() and
+ *  XF86VidModeGetViewPort(), in support of virtual desktops where the
+ *  X server's root window is bigger than the actual screen.  This is
+ *  an XFree86 thing, and probably doesn't exist elsewhere.  (It's
+ *  available if the file /usr/include/X11/extensions/xf86vmode.h exists.)
+ */
+#undef HAVE_XF86VMODE
+
 /*  Define this if you have a Linux-like /proc/interrupts file which can be
  *  examined to determine when keyboard activity has occurred.
  */
  */
 #undef HAVE_GLBINDTEXTURE
 
+/*  Define this if the `xscreensaver' process itself (the driver process)
+    should be linked against GL.  Most systems won't want this (in particular,
+    if you're using Linux and/or Mesa, you don't want this) but SGI systems
+    do want this.  It may also be useful on other systems that have serious
+    GL support -- you only need this if you have a lot of different visuals,
+    not all of which work with GL programs.
+ */
+#undef DAEMON_USE_GL
+
 /*  Define this if you have the X Shared Memory Extension.
  */
 #undef HAVE_XSHM_EXTENSION
  */
 #define PAM_SERVICE_NAME "xscreensaver"
 
+/* Define if you have PAM and pam_strerror() requires two arguments.  */
+#undef PAM_STRERROR_TWO_ARGS
+
 /*  Define this if your system uses `shadow' passwords, that is, the passwords
  *  live in /etc/shadow instead of /etc/passwd, and one reads them with
  *  getspnam() instead of getpwnam().  (Note that SCO systems do some random
- *  other thing; others might as well.  See the ifdefs in driver/passwd.c if
- *  you're having trouble related to reading passwords.)
+ *  other thing; others might as well.  See the ifdefs in driver/passwd-pwent.c
+ *  if you're having trouble related to reading passwords.)
  */
 #undef HAVE_SHADOW_PASSWD
 
     VT_UNLOCKSWITCH ioctls.  If this is defined, then when the screen is
     locked, switching to another virtual terminal will also be prevented.
     That is, the whole console will be locked, rather than just the VT on
-    which X is running.
+    which X is running.  (Well, that's the theory anyway -- in practice,
+    I haven't yet figured out how to make that work.)
  */
 #undef HAVE_VT_LOCKSWITCH
 
    This is necessary at least on SCO OpenServer 5, due to a Unix kernel bug.
  */
 #undef USE_SIGACTION
+
+/* Define this if you do pings with a `struct icmp' and  a `icmp_id' slot.
+ */
+#undef HAVE_ICMP
+
+/* Define this if you do pings with a `struct icmphdr' and a `un.echo.id' slot.
+ */
+#undef HAVE_ICMPHDR
index 5d61f180ad3f110a752a3164d55d24bc4fa8d145..412bc5edb8ff31f1ffad8a104446243a3f69de13 100755 (executable)
--- a/configure
+++ b/configure
@@ -60,6 +60,10 @@ ac_help="$ac_help
   --with-dpms-ext         Include support for the DPMS server extension,
                           if possible (this is the default).
   --without-dpms-ext      Do not compile in support for this extension."
+ac_help="$ac_help
+  --with-xf86vmode-ext    Include support for XFree86 virtual screens, if
+                          possible (this is the default).
+  --without-xf86vmode-ext Do not compile in support for this extension."
 ac_help="$ac_help
   --with-proc-interrupts  Include support for consulting the /proc/interrupts
                           file to notice keyboard activity, if possible.
@@ -662,7 +666,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
 fi
 
 echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:677: checking host system type" >&5
+echo "configure:681: checking host system type" >&5
 
 host_alias=$host
 case "$host_alias" in
@@ -686,7 +690,7 @@ echo "$ac_t""$host" 1>&6
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:701: checking for $ac_word" >&5
+echo "configure:705: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -716,7 +720,7 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:731: checking for $ac_word" >&5
+echo "configure:735: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -767,7 +771,7 @@ fi
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:782: checking for $ac_word" >&5
+echo "configure:786: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -799,7 +803,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:814: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:818: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -810,12 +814,12 @@ cross_compiling=$ac_cv_prog_cc_cross
 
 cat > conftest.$ac_ext << EOF
 
-#line 825 "configure"
+#line 829 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:830: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:834: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -841,12 +845,12 @@ if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:856: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:860: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:861: checking whether we are using GNU C" >&5
+echo "configure:865: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -855,7 +859,7 @@ else
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:870: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:874: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -874,7 +878,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:889: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:893: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -908,7 +912,7 @@ fi
 
 if test -z "$GCC"; then
   echo $ac_n "checking how to request ANSI compilation""... $ac_c" 1>&6
-echo "configure:923: checking how to request ANSI compilation" >&5
+echo "configure:927: checking how to request ANSI compilation" >&5
   case "$host" in
     *-hpux*)
       echo "$ac_t""HPUX: adding -Ae" 1>&6
@@ -932,16 +936,16 @@ fi
 
 
 echo $ac_n "checking whether the compiler works on ANSI C""... $ac_c" 1>&6
-echo "configure:947: checking whether the compiler works on ANSI C" >&5
+echo "configure:951: checking whether the compiler works on ANSI C" >&5
 if test "$cross_compiling" = yes; then
   { echo "configure: error: Couldn't build even a trivial ANSI C program: check CC." 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 952 "configure"
+#line 956 "configure"
 #include "confdefs.h"
  main(int ac, char **av) { return 0; } 
 EOF
-if { (eval echo configure:956: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:960: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   echo "$ac_t""yes" 1>&6
 else
@@ -990,7 +994,7 @@ esac
 
 
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1005: checking how to run the C preprocessor" >&5
+echo "configure:1009: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -1005,13 +1009,13 @@ else
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 1020 "configure"
+#line 1024 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1026: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1030: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -1022,13 +1026,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 1037 "configure"
+#line 1041 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1043: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1047: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -1039,13 +1043,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -nologo -E"
   cat > conftest.$ac_ext <<EOF
-#line 1054 "configure"
+#line 1058 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1060: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1064: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -1081,7 +1085,7 @@ echo "$ac_t""$CPP" 1>&6
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1096: checking for a BSD compatible install" >&5
+echo "configure:1100: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1135,7 +1139,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 INSTALL_DIRS='${INSTALL} -d'
    echo $ac_n "checking whether \"\${INSTALL} -d\" creates intermediate directories""... $ac_c" 1>&6
-echo "configure:1150: checking whether \"\${INSTALL} -d\" creates intermediate directories" >&5
+echo "configure:1154: checking whether \"\${INSTALL} -d\" creates intermediate directories" >&5
    rm -rf conftestdir
    if mkdir conftestdir; then
       cd conftestdir >&-
@@ -1146,7 +1150,7 @@ echo "configure:1150: checking whether \"\${INSTALL} -d\" creates intermediate d
       else
         echo "$ac_t""no" 1>&6
         echo $ac_n "checking whether \"mkdir -p\" creates intermediate directories""... $ac_c" 1>&6
-echo "configure:1161: checking whether \"mkdir -p\" creates intermediate directories" >&5
+echo "configure:1165: checking whether \"mkdir -p\" creates intermediate directories" >&5
         rm -rf dir1
         mkdir -p dir1/dir2 >&- 2>&-
         if test -d dir1/dir2/. ; then
@@ -1161,7 +1165,7 @@ echo "configure:1161: checking whether \"mkdir -p\" creates intermediate directo
    fi
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:1176: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:1180: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1189,12 +1193,12 @@ fi
 
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:1204: checking for working const" >&5
+echo "configure:1208: checking for working const" >&5
 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1209 "configure"
+#line 1213 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -1243,7 +1247,7 @@ ccp = (char const *const *) p;
 
 ; return 0; }
 EOF
-if { (eval echo configure:1258: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1262: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -1264,21 +1268,21 @@ EOF
 fi
 
 echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:1279: checking for inline" >&5
+echo "configure:1283: checking for inline" >&5
 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_cv_c_inline=no
 for ac_kw in inline __inline__ __inline; do
   cat > conftest.$ac_ext <<EOF
-#line 1286 "configure"
+#line 1290 "configure"
 #include "confdefs.h"
 
 int main() {
 } $ac_kw foo() {
 ; return 0; }
 EOF
-if { (eval echo configure:1293: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1297: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_inline=$ac_kw; break
 else
@@ -1305,12 +1309,12 @@ esac
 
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:1320: checking for ANSI C header files" >&5
+echo "configure:1324: checking for ANSI C header files" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1325 "configure"
+#line 1329 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -1318,7 +1322,7 @@ else
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1333: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1337: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1335,7 +1339,7 @@ rm -f conftest*
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1350 "configure"
+#line 1354 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -1353,7 +1357,7 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1368 "configure"
+#line 1372 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -1374,7 +1378,7 @@ if test "$cross_compiling" = yes; then
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 1389 "configure"
+#line 1393 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -1385,7 +1389,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
 exit (0); }
 
 EOF
-if { (eval echo configure:1400: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1404: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -1409,12 +1413,12 @@ EOF
 fi
 
 echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:1424: checking whether time.h and sys/time.h may both be included" >&5
+echo "configure:1428: checking whether time.h and sys/time.h may both be included" >&5
 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1429 "configure"
+#line 1433 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/time.h>
@@ -1423,7 +1427,7 @@ int main() {
 struct tm *tp;
 ; return 0; }
 EOF
-if { (eval echo configure:1438: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1442: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_time=yes
 else
@@ -1444,12 +1448,12 @@ EOF
 fi
 
 echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:1459: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo "configure:1463: checking for sys/wait.h that is POSIX.1 compatible" >&5
 if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1464 "configure"
+#line 1468 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/wait.h>
@@ -1465,7 +1469,7 @@ wait (&s);
 s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
 ; return 0; }
 EOF
-if { (eval echo configure:1480: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1484: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_sys_wait_h=yes
 else
@@ -1490,12 +1494,12 @@ for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
-echo "configure:1505: checking for $ac_hdr that defines DIR" >&5
+echo "configure:1509: checking for $ac_hdr that defines DIR" >&5
 if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1510 "configure"
+#line 1514 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <$ac_hdr>
@@ -1503,7 +1507,7 @@ int main() {
 DIR *dirp = 0;
 ; return 0; }
 EOF
-if { (eval echo configure:1518: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1522: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_header_dirent_$ac_safe=yes"
 else
@@ -1528,7 +1532,7 @@ done
 # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
 if test $ac_header_dirent = dirent.h; then
 echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
-echo "configure:1543: checking for opendir in -ldir" >&5
+echo "configure:1547: checking for opendir in -ldir" >&5
 ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1536,7 +1540,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldir  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1551 "configure"
+#line 1555 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1547,7 +1551,7 @@ int main() {
 opendir()
 ; return 0; }
 EOF
-if { (eval echo configure:1562: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1566: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1569,7 +1573,7 @@ fi
 
 else
 echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
-echo "configure:1584: checking for opendir in -lx" >&5
+echo "configure:1588: checking for opendir in -lx" >&5
 ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1577,7 +1581,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lx  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1592 "configure"
+#line 1596 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1588,7 +1592,7 @@ int main() {
 opendir()
 ; return 0; }
 EOF
-if { (eval echo configure:1603: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1607: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1612,12 +1616,12 @@ fi
 
 
 echo $ac_n "checking for mode_t""... $ac_c" 1>&6
-echo "configure:1627: checking for mode_t" >&5
+echo "configure:1631: checking for mode_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1632 "configure"
+#line 1636 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -1645,12 +1649,12 @@ EOF
 fi
 
 echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:1660: checking for pid_t" >&5
+echo "configure:1664: checking for pid_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1665 "configure"
+#line 1669 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -1678,12 +1682,12 @@ EOF
 fi
 
 echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:1693: checking for size_t" >&5
+echo "configure:1697: checking for size_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1698 "configure"
+#line 1702 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -1711,12 +1715,12 @@ EOF
 fi
 
 echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
-echo "configure:1726: checking return type of signal handlers" >&5
+echo "configure:1730: checking return type of signal handlers" >&5
 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1731 "configure"
+#line 1735 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -1733,7 +1737,7 @@ int main() {
 int i;
 ; return 0; }
 EOF
-if { (eval echo configure:1748: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1752: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_type_signal=void
 else
@@ -1753,12 +1757,12 @@ EOF
 
 
 echo $ac_n "checking how to call gettimeofday""... $ac_c" 1>&6
-echo "configure:1768: checking how to call gettimeofday" >&5
+echo "configure:1772: checking how to call gettimeofday" >&5
 if eval "test \"`echo '$''{'ac_cv_gettimeofday_args'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1773 "configure"
+#line 1777 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
                  #include <sys/time.h>
@@ -1767,7 +1771,7 @@ struct timeval tv; struct timezone tzp;
                  gettimeofday(&tv, &tzp);
 ; return 0; }
 EOF
-if { (eval echo configure:1782: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1786: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_gettimeofday_args=2
 else
@@ -1775,7 +1779,7 @@ else
   cat conftest.$ac_ext >&5
   rm -rf conftest*
   cat > conftest.$ac_ext <<EOF
-#line 1790 "configure"
+#line 1794 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
                                  #include <sys/time.h>
@@ -1783,7 +1787,7 @@ int main() {
 struct timeval tv; gettimeofday(&tv);
 ; return 0; }
 EOF
-if { (eval echo configure:1798: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1802: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_gettimeofday_args=1
 else
@@ -1823,12 +1827,12 @@ fi
 for ac_func in select fcntl uname nice setpriority getcwd getwd putenv
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1838: checking for $ac_func" >&5
+echo "configure:1842: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1843 "configure"
+#line 1847 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -1851,7 +1855,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1866: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1870: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -1878,12 +1882,12 @@ done
 for ac_func in sigaction syslog
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1893: checking for $ac_func" >&5
+echo "configure:1897: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1898 "configure"
+#line 1902 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -1906,7 +1910,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1921: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1925: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -1935,17 +1939,17 @@ for ac_hdr in unistd.h crypt.h sys/select.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1950: checking for $ac_hdr" >&5
+echo "configure:1954: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1955 "configure"
+#line 1959 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1960: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1964: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2007,7 +2011,7 @@ HACKDIR=`echo "${HACKDIR}" | sed 's@/$@@;s@//*@/@g'`
 # Uses ac_ vars as temps to allow command line to override cache and checks.
 # --without-x overrides everything else, but does not touch the cache.
 echo $ac_n "checking for X""... $ac_c" 1>&6
-echo "configure:2022: checking for X" >&5
+echo "configure:2026: checking for X" >&5
 
 # Check whether --with-x or --without-x was given.
 if test "${with_x+set}" = set; then
@@ -2069,12 +2073,12 @@ if test "$ac_x_includes" = NO; then
 
   # First, try using that file with no special directory specified.
 cat > conftest.$ac_ext <<EOF
-#line 2084 "configure"
+#line 2088 "configure"
 #include "confdefs.h"
 #include <$x_direct_test_include>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2089: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2093: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2143,14 +2147,14 @@ if test "$ac_x_libraries" = NO; then
   ac_save_LIBS="$LIBS"
   LIBS="-l$x_direct_test_library $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2158 "configure"
+#line 2162 "configure"
 #include "confdefs.h"
 
 int main() {
 ${x_direct_test_function}()
 ; return 0; }
 EOF
-if { (eval echo configure:2165: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2169: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   LIBS="$ac_save_LIBS"
 # We can link X programs with no special library path.
@@ -2256,17 +2260,17 @@ else
     case "`(uname -sr) 2>/dev/null`" in
     "SunOS 5"*)
       echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
-echo "configure:2271: checking whether -R must be followed by a space" >&5
+echo "configure:2275: checking whether -R must be followed by a space" >&5
       ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
       cat > conftest.$ac_ext <<EOF
-#line 2274 "configure"
+#line 2278 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2281: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2285: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_R_nospace=yes
 else
@@ -2282,14 +2286,14 @@ rm -f conftest*
       else
        LIBS="$ac_xsave_LIBS -R $x_libraries"
        cat > conftest.$ac_ext <<EOF
-#line 2297 "configure"
+#line 2301 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2304: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2308: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_R_space=yes
 else
@@ -2321,7 +2325,7 @@ rm -f conftest*
     # libraries were built with DECnet support.  And karl@cs.umb.edu says
     # the Alpha needs dnet_stub (dnet does not exist).
     echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
-echo "configure:2336: checking for dnet_ntoa in -ldnet" >&5
+echo "configure:2340: checking for dnet_ntoa in -ldnet" >&5
 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2329,7 +2333,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2344 "configure"
+#line 2348 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2340,7 +2344,7 @@ int main() {
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:2355: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2359: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2362,7 +2366,7 @@ fi
 
     if test $ac_cv_lib_dnet_dnet_ntoa = no; then
       echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
-echo "configure:2377: checking for dnet_ntoa in -ldnet_stub" >&5
+echo "configure:2381: checking for dnet_ntoa in -ldnet_stub" >&5
 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2370,7 +2374,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet_stub  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2385 "configure"
+#line 2389 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2381,7 +2385,7 @@ int main() {
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:2396: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2400: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2410,12 +2414,12 @@ fi
     # The nsl library prevents programs from opening the X display
     # on Irix 5.2, according to dickey@clark.net.
     echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:2425: checking for gethostbyname" >&5
+echo "configure:2429: checking for gethostbyname" >&5
 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2430 "configure"
+#line 2434 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char gethostbyname(); below.  */
@@ -2438,7 +2442,7 @@ gethostbyname();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2453: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2457: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_gethostbyname=yes"
 else
@@ -2459,7 +2463,7 @@ fi
 
     if test $ac_cv_func_gethostbyname = no; then
       echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:2474: checking for gethostbyname in -lnsl" >&5
+echo "configure:2478: checking for gethostbyname in -lnsl" >&5
 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2467,7 +2471,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2482 "configure"
+#line 2486 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2478,7 +2482,7 @@ int main() {
 gethostbyname()
 ; return 0; }
 EOF
-if { (eval echo configure:2493: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2497: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2508,12 +2512,12 @@ fi
     # -lsocket must be given before -lnsl if both are needed.
     # We assume that if connect needs -lnsl, so does gethostbyname.
     echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:2523: checking for connect" >&5
+echo "configure:2527: checking for connect" >&5
 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2528 "configure"
+#line 2532 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char connect(); below.  */
@@ -2536,7 +2540,7 @@ connect();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2551: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2555: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_connect=yes"
 else
@@ -2557,7 +2561,7 @@ fi
 
     if test $ac_cv_func_connect = no; then
       echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
-echo "configure:2572: checking for connect in -lsocket" >&5
+echo "configure:2576: checking for connect in -lsocket" >&5
 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2565,7 +2569,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2580 "configure"
+#line 2584 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2576,7 +2580,7 @@ int main() {
 connect()
 ; return 0; }
 EOF
-if { (eval echo configure:2591: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2595: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2600,12 +2604,12 @@ fi
 
     # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
     echo $ac_n "checking for remove""... $ac_c" 1>&6
-echo "configure:2615: checking for remove" >&5
+echo "configure:2619: checking for remove" >&5
 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2620 "configure"
+#line 2624 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char remove(); below.  */
@@ -2628,7 +2632,7 @@ remove();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2643: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2647: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_remove=yes"
 else
@@ -2649,7 +2653,7 @@ fi
 
     if test $ac_cv_func_remove = no; then
       echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
-echo "configure:2664: checking for remove in -lposix" >&5
+echo "configure:2668: checking for remove in -lposix" >&5
 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2657,7 +2661,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lposix  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2672 "configure"
+#line 2676 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2668,7 +2672,7 @@ int main() {
 remove()
 ; return 0; }
 EOF
-if { (eval echo configure:2683: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2687: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2692,12 +2696,12 @@ fi
 
     # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
     echo $ac_n "checking for shmat""... $ac_c" 1>&6
-echo "configure:2707: checking for shmat" >&5
+echo "configure:2711: checking for shmat" >&5
 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2712 "configure"
+#line 2716 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char shmat(); below.  */
@@ -2720,7 +2724,7 @@ shmat();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2735: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2739: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_shmat=yes"
 else
@@ -2741,7 +2745,7 @@ fi
 
     if test $ac_cv_func_shmat = no; then
       echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
-echo "configure:2756: checking for shmat in -lipc" >&5
+echo "configure:2760: checking for shmat in -lipc" >&5
 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2749,7 +2753,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lipc  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2764 "configure"
+#line 2768 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2760,7 +2764,7 @@ int main() {
 shmat()
 ; return 0; }
 EOF
-if { (eval echo configure:2775: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2779: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2793,7 +2797,7 @@ fi
   # libraries we check for below, so use a different variable.
   #  --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
   echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
-echo "configure:2808: checking for IceConnectionNumber in -lICE" >&5
+echo "configure:2812: checking for IceConnectionNumber in -lICE" >&5
 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2801,7 +2805,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lICE $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2816 "configure"
+#line 2820 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2812,7 +2816,7 @@ int main() {
 IceConnectionNumber()
 ; return 0; }
 EOF
-if { (eval echo configure:2827: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2831: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2854,7 +2858,7 @@ fi
 
 
     echo $ac_n "checking for X app-defaults directory""... $ac_c" 1>&6
-echo "configure:2869: checking for X app-defaults directory" >&5
+echo "configure:2873: checking for X app-defaults directory" >&5
 if eval "test \"`echo '$''{'ac_cv_x_app_defaults'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3001,7 +3005,7 @@ APPDEFAULTS=$ac_x_app_defaults
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 3016 "configure"
+#line 3020 "configure"
 #include "confdefs.h"
 #include <X11/XHPlib.h>
 EOF
@@ -3022,7 +3026,7 @@ rm -f conftest*
 # Check for the availability of the XPointer typedef, and define it otherwise.
 #
 echo $ac_n "checking for XPointer""... $ac_c" 1>&6
-echo "configure:3037: checking for XPointer" >&5
+echo "configure:3041: checking for XPointer" >&5
 if eval "test \"`echo '$''{'ac_cv_xpointer'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3033,14 +3037,14 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 3048 "configure"
+#line 3052 "configure"
 #include "confdefs.h"
 #include <X11/Xlib.h>
 int main() {
 XPointer foo = (XPointer) 0;
 ; return 0; }
 EOF
-if { (eval echo configure:3055: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3059: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_xpointer=yes
 else
@@ -3174,7 +3178,7 @@ case "$host" in
 
       # Some versions of Slowlaris Motif require -lgen.  But not all.  Why?
       echo $ac_n "checking for regcmp in -lgen""... $ac_c" 1>&6
-echo "configure:3189: checking for regcmp in -lgen" >&5
+echo "configure:3193: checking for regcmp in -lgen" >&5
 ac_lib_var=`echo gen'_'regcmp | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3182,7 +3186,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lgen  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3197 "configure"
+#line 3201 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3193,7 +3197,7 @@ int main() {
 regcmp()
 ; return 0; }
 EOF
-if { (eval echo configure:3208: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3212: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3230,17 +3234,17 @@ have_xmu=no
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/Xmu/Error.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/Xmu/Error.h""... $ac_c" 1>&6
-echo "configure:3245: checking for X11/Xmu/Error.h" >&5
+echo "configure:3249: checking for X11/Xmu/Error.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3250 "configure"
+#line 3254 "configure"
 #include "confdefs.h"
 #include <X11/Xmu/Error.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3255: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3259: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3285,7 +3289,7 @@ if test "$have_xmu" = yes ; then
   case "$host" in
     *-sunos4*)
     echo $ac_n "checking for the SunOS 4.1.x _get_wmShellWidgetClass bug""... $ac_c" 1>&6
-echo "configure:3300: checking for the SunOS 4.1.x _get_wmShellWidgetClass bug" >&5
+echo "configure:3304: checking for the SunOS 4.1.x _get_wmShellWidgetClass bug" >&5
 if eval "test \"`echo '$''{'ac_cv_sunos_xmu_bug'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3298,14 +3302,14 @@ else
                    # with X libraries because we know it's SunOS.
                    LDFLAGS="$LDFLAGS -lXmu -lXt -lX11 -lXext -lm"
                    cat > conftest.$ac_ext <<EOF
-#line 3313 "configure"
+#line 3317 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3320: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3324: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_sunos_xmu_bug=no
 else
@@ -3321,21 +3325,21 @@ fi
 echo "$ac_t""$ac_cv_sunos_xmu_bug" 1>&6
     if test "$ac_cv_sunos_xmu_bug" = yes ; then
       echo $ac_n "checking whether the compiler understands -static""... $ac_c" 1>&6
-echo "configure:3336: checking whether the compiler understands -static" >&5
+echo "configure:3340: checking whether the compiler understands -static" >&5
 if eval "test \"`echo '$''{'ac_cv_ld_static'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_save_LDFLAGS="$LDFLAGS"
                      LDFLAGS="$LDFLAGS -static"
                      cat > conftest.$ac_ext <<EOF
-#line 3343 "configure"
+#line 3347 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3350: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3354: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_ld_static=yes
 else
@@ -3380,7 +3384,7 @@ fi
 
     /*)
      echo $ac_n "checking for SGI SCREEN_SAVER headers""... $ac_c" 1>&6
-echo "configure:3395: checking for SGI SCREEN_SAVER headers" >&5
+echo "configure:3399: checking for SGI SCREEN_SAVER headers" >&5
      d=$with_sgi/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -3390,7 +3394,7 @@ echo "configure:3395: checking for SGI SCREEN_SAVER headers" >&5
      fi
 
      echo $ac_n "checking for SGI SCREEN_SAVER libs""... $ac_c" 1>&6
-echo "configure:3405: checking for SGI SCREEN_SAVER libs" >&5
+echo "configure:3409: checking for SGI SCREEN_SAVER libs" >&5
      d=$with_sgi/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -3428,17 +3432,17 @@ if test "$with_sgi" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/XScreenSaver.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/XScreenSaver.h""... $ac_c" 1>&6
-echo "configure:3443: checking for X11/extensions/XScreenSaver.h" >&5
+echo "configure:3447: checking for X11/extensions/XScreenSaver.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3448 "configure"
+#line 3452 "configure"
 #include "confdefs.h"
 #include <X11/extensions/XScreenSaver.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3453: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3457: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3491,7 +3495,7 @@ fi
 
     /*)
      echo $ac_n "checking for MIT-SCREEN-SAVER headers""... $ac_c" 1>&6
-echo "configure:3506: checking for MIT-SCREEN-SAVER headers" >&5
+echo "configure:3510: checking for MIT-SCREEN-SAVER headers" >&5
      d=$with_mit/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -3501,7 +3505,7 @@ echo "configure:3506: checking for MIT-SCREEN-SAVER headers" >&5
      fi
 
      echo $ac_n "checking for MIT-SCREEN-SAVER libs""... $ac_c" 1>&6
-echo "configure:3516: checking for MIT-SCREEN-SAVER libs" >&5
+echo "configure:3520: checking for MIT-SCREEN-SAVER libs" >&5
      d=$with_mit/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -3540,17 +3544,17 @@ if test "$have_sgi" != yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/scrnsaver.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/scrnsaver.h""... $ac_c" 1>&6
-echo "configure:3555: checking for X11/extensions/scrnsaver.h" >&5
+echo "configure:3559: checking for X11/extensions/scrnsaver.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3560 "configure"
+#line 3564 "configure"
 #include "confdefs.h"
 #include <X11/extensions/scrnsaver.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3565: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3569: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3594,7 +3598,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS"
 
   echo $ac_n "checking for XScreenSaverRegister in -lXext""... $ac_c" 1>&6
-echo "configure:3609: checking for XScreenSaverRegister in -lXext" >&5
+echo "configure:3613: checking for XScreenSaverRegister in -lXext" >&5
 ac_lib_var=`echo Xext'_'XScreenSaverRegister | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3602,7 +3606,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3617 "configure"
+#line 3621 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3613,7 +3617,7 @@ int main() {
 XScreenSaverRegister()
 ; return 0; }
 EOF
-if { (eval echo configure:3628: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3632: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3664,7 +3668,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS"
 
   echo $ac_n "checking for XScreenSaverRegister in -lXExExt""... $ac_c" 1>&6
-echo "configure:3679: checking for XScreenSaverRegister in -lXExExt" >&5
+echo "configure:3683: checking for XScreenSaverRegister in -lXExExt" >&5
 ac_lib_var=`echo XExExt'_'XScreenSaverRegister | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3672,7 +3676,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXExExt -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3687 "configure"
+#line 3691 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3683,7 +3687,7 @@ int main() {
 XScreenSaverRegister()
 ; return 0; }
 EOF
-if { (eval echo configure:3698: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3702: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3729,7 +3733,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS"
 
   echo $ac_n "checking for XScreenSaverRegister in -lXss""... $ac_c" 1>&6
-echo "configure:3744: checking for XScreenSaverRegister in -lXss" >&5
+echo "configure:3748: checking for XScreenSaverRegister in -lXss" >&5
 ac_lib_var=`echo Xss'_'XScreenSaverRegister | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3737,7 +3741,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXss -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3752 "configure"
+#line 3756 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3748,7 +3752,7 @@ int main() {
 XScreenSaverRegister()
 ; return 0; }
 EOF
-if { (eval echo configure:3763: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3767: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3808,7 +3812,7 @@ fi
 
     /*)
      echo $ac_n "checking for XIDLE headers""... $ac_c" 1>&6
-echo "configure:3823: checking for XIDLE headers" >&5
+echo "configure:3827: checking for XIDLE headers" >&5
      d=$with_xidle/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -3818,7 +3822,7 @@ echo "configure:3823: checking for XIDLE headers" >&5
      fi
 
      echo $ac_n "checking for XIDLE libs""... $ac_c" 1>&6
-echo "configure:3833: checking for XIDLE libs" >&5
+echo "configure:3837: checking for XIDLE libs" >&5
      d=$with_xidle/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -3856,17 +3860,17 @@ if test "$with_xidle" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/xidle.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/xidle.h""... $ac_c" 1>&6
-echo "configure:3871: checking for X11/extensions/xidle.h" >&5
+echo "configure:3875: checking for X11/extensions/xidle.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3876 "configure"
+#line 3880 "configure"
 #include "confdefs.h"
 #include <X11/extensions/xidle.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3881: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3885: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3918,7 +3922,7 @@ fi
 
     /*)
      echo $ac_n "checking for XSHM headers""... $ac_c" 1>&6
-echo "configure:3933: checking for XSHM headers" >&5
+echo "configure:3937: checking for XSHM headers" >&5
      d=$with_xshm/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -3928,7 +3932,7 @@ echo "configure:3933: checking for XSHM headers" >&5
      fi
 
      echo $ac_n "checking for XSHM libs""... $ac_c" 1>&6
-echo "configure:3943: checking for XSHM libs" >&5
+echo "configure:3947: checking for XSHM libs" >&5
      d=$with_xshm/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -3968,17 +3972,17 @@ if test "$with_xshm" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/XShm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/XShm.h""... $ac_c" 1>&6
-echo "configure:3983: checking for X11/extensions/XShm.h" >&5
+echo "configure:3987: checking for X11/extensions/XShm.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3988 "configure"
+#line 3992 "configure"
 #include "confdefs.h"
 #include <X11/extensions/XShm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3993: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3997: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4012,17 +4016,17 @@ fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "sys/ipc.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/ipc.h""... $ac_c" 1>&6
-echo "configure:4027: checking for sys/ipc.h" >&5
+echo "configure:4031: checking for sys/ipc.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4032 "configure"
+#line 4036 "configure"
 #include "confdefs.h"
 #include <sys/ipc.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4037: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4041: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4057,17 +4061,17 @@ fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "sys/shm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/shm.h""... $ac_c" 1>&6
-echo "configure:4072: checking for sys/shm.h" >&5
+echo "configure:4076: checking for sys/shm.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4077 "configure"
+#line 4081 "configure"
 #include "confdefs.h"
 #include <sys/shm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4082: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4086: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4116,7 +4120,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS"
 
   echo $ac_n "checking for XShmQueryExtension in -lXextSam""... $ac_c" 1>&6
-echo "configure:4131: checking for XShmQueryExtension in -lXextSam" >&5
+echo "configure:4135: checking for XShmQueryExtension in -lXextSam" >&5
 ac_lib_var=`echo XextSam'_'XShmQueryExtension | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4124,7 +4128,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXextSam -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4139 "configure"
+#line 4143 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4135,7 +4139,7 @@ int main() {
 XShmQueryExtension()
 ; return 0; }
 EOF
-if { (eval echo configure:4150: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4154: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4194,7 +4198,7 @@ fi
 
     /*)
      echo $ac_n "checking for DOUBLE-BUFFER headers""... $ac_c" 1>&6
-echo "configure:4209: checking for DOUBLE-BUFFER headers" >&5
+echo "configure:4213: checking for DOUBLE-BUFFER headers" >&5
      d=$with_xdbe/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -4204,7 +4208,7 @@ echo "configure:4209: checking for DOUBLE-BUFFER headers" >&5
      fi
 
      echo $ac_n "checking for DOUBLE-BUFFER libs""... $ac_c" 1>&6
-echo "configure:4219: checking for DOUBLE-BUFFER libs" >&5
+echo "configure:4223: checking for DOUBLE-BUFFER libs" >&5
      d=$with_xdbe/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -4243,17 +4247,17 @@ if test "$with_xdbe" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/Xdbe.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/Xdbe.h""... $ac_c" 1>&6
-echo "configure:4258: checking for X11/extensions/Xdbe.h" >&5
+echo "configure:4262: checking for X11/extensions/Xdbe.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4263 "configure"
+#line 4267 "configure"
 #include "confdefs.h"
 #include <X11/extensions/Xdbe.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4268: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4272: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4308,7 +4312,7 @@ fi
 
     /*)
      echo $ac_n "checking for SGI-VIDEO-CONTROL headers""... $ac_c" 1>&6
-echo "configure:4323: checking for SGI-VIDEO-CONTROL headers" >&5
+echo "configure:4327: checking for SGI-VIDEO-CONTROL headers" >&5
      d=$with_sgivc/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -4318,7 +4322,7 @@ echo "configure:4323: checking for SGI-VIDEO-CONTROL headers" >&5
      fi
 
      echo $ac_n "checking for SGI-VIDEO-CONTROL libs""... $ac_c" 1>&6
-echo "configure:4333: checking for SGI-VIDEO-CONTROL libs" >&5
+echo "configure:4337: checking for SGI-VIDEO-CONTROL libs" >&5
      d=$with_sgivc/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -4358,17 +4362,17 @@ if test "$with_sgivc" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/XSGIvc.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/XSGIvc.h""... $ac_c" 1>&6
-echo "configure:4373: checking for X11/extensions/XSGIvc.h" >&5
+echo "configure:4377: checking for X11/extensions/XSGIvc.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4378 "configure"
+#line 4382 "configure"
 #include "confdefs.h"
 #include <X11/extensions/XSGIvc.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4383: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4387: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4411,7 +4415,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS"
 
   echo $ac_n "checking for XSGIvcQueryGammaMap in -lXsgivc""... $ac_c" 1>&6
-echo "configure:4426: checking for XSGIvcQueryGammaMap in -lXsgivc" >&5
+echo "configure:4430: checking for XSGIvcQueryGammaMap in -lXsgivc" >&5
 ac_lib_var=`echo Xsgivc'_'XSGIvcQueryGammaMap | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4419,7 +4423,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXsgivc -lXext -lX11 $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4434 "configure"
+#line 4438 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4430,7 +4434,7 @@ int main() {
 XSGIvcQueryGammaMap()
 ; return 0; }
 EOF
-if { (eval echo configure:4445: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4449: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4488,7 +4492,7 @@ fi
 
     /*)
      echo $ac_n "checking for DPMS headers""... $ac_c" 1>&6
-echo "configure:4503: checking for DPMS headers" >&5
+echo "configure:4507: checking for DPMS headers" >&5
      d=$with_dpms/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -4498,7 +4502,7 @@ echo "configure:4503: checking for DPMS headers" >&5
      fi
 
      echo $ac_n "checking for DPMS libs""... $ac_c" 1>&6
-echo "configure:4513: checking for DPMS libs" >&5
+echo "configure:4517: checking for DPMS libs" >&5
      d=$with_dpms/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -4538,17 +4542,17 @@ if test "$with_dpms" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/dpms.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/dpms.h""... $ac_c" 1>&6
-echo "configure:4553: checking for X11/extensions/dpms.h" >&5
+echo "configure:4557: checking for X11/extensions/dpms.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4558 "configure"
+#line 4562 "configure"
 #include "confdefs.h"
 #include <X11/extensions/dpms.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4563: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4567: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4591,7 +4595,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS"
 
   echo $ac_n "checking for DPMSInfo in -lXdpms""... $ac_c" 1>&6
-echo "configure:4606: checking for DPMSInfo in -lXdpms" >&5
+echo "configure:4610: checking for DPMSInfo in -lXdpms" >&5
 ac_lib_var=`echo Xdpms'_'DPMSInfo | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4599,7 +4603,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXdpms -lXext -lX11 $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4614 "configure"
+#line 4618 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4610,7 +4614,7 @@ int main() {
 DPMSInfo()
 ; return 0; }
 EOF
-if { (eval echo configure:4625: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4629: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4648,6 +4652,186 @@ elif test "$with_dpms" != no; then
 fi
 
 
+# Check for the XF86VMODE server extension header.
+#
+have_xf86vmode=no
+with_xf86vmode_req=unspecified
+# Check whether --with-xf86vmode-ext or --without-xf86vmode-ext was given.
+if test "${with_xf86vmode_ext+set}" = set; then
+  withval="$with_xf86vmode_ext"
+  with_xf86vmode="$withval"; with_xf86vmode_req="$withval"
+else
+  with_xf86vmode=yes
+fi
+
+
+
+   case "$with_xf86vmode" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for xf86vmode headers""... $ac_c" 1>&6
+echo "configure:4687: checking for xf86vmode headers" >&5
+     d=$with_xf86vmode/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for xf86vmode libs""... $ac_c" 1>&6
+echo "configure:4697: checking for xf86vmode libs" >&5
+     d=$with_xf86vmode/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_xf86vmode_req="yes"
+     with_xf86vmode=$with_xf86vmode_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-xf86vmode-ext must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+
+   # why is this necessary?
+   # if we don't do this, then "./configure --with-motif=/usr/local/lesstif"
+   # behaves as if "--with-zippy=/usr/local/lesstif" was also present!
+   withval=
+  
+
+if test "$with_xf86vmode" = yes; then
+
+  # first check for xf86vmode.h
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "X11/extensions/xf86vmode.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/extensions/xf86vmode.h""... $ac_c" 1>&6
+echo "configure:4737: checking for X11/extensions/xf86vmode.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 4742 "configure"
+#include "confdefs.h"
+#include <X11/extensions/xf86vmode.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:4747: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xf86vmode=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+
+  # if that succeeded, then check for the -lXxf86vm
+  if test "$have_xf86vmode" = yes; then
+    have_xf86vmode=no
+    
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS"
+
+  echo $ac_n "checking for XF86VidModeGetViewPort in -lXxf86vm""... $ac_c" 1>&6
+echo "configure:4790: checking for XF86VidModeGetViewPort in -lXxf86vm" >&5
+ac_lib_var=`echo Xxf86vm'_'XF86VidModeGetViewPort | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lXxf86vm -lXext -lX11 $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4798 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char XF86VidModeGetViewPort();
+
+int main() {
+XF86VidModeGetViewPort()
+; return 0; }
+EOF
+if { (eval echo configure:4809: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xf86vmode=yes; SAVER_LIBS="$SAVER_LIBS -lXxf86vm"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+  fi
+
+  # if that succeeded, then we've really got it.
+  if test "$have_xf86vmode" = yes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_XF86VMODE 1
+EOF
+
+  fi
+
+elif test "$with_xf86vmode" != no; then
+  echo "error: must be yes or no: --with-xf86vmode-ext=$with_xf86vmode"
+  exit 1
+fi
+
+
 # Check for /proc/interrupts
 #
 have_proc_interrupts=no
@@ -4664,7 +4848,7 @@ fi
 if test "$with_proc_interrupts" = yes; then
 
    echo $ac_n "checking whether /proc/interrupts contains keyboard data""... $ac_c" 1>&6
-echo "configure:4679: checking whether /proc/interrupts contains keyboard data" >&5
+echo "configure:4863: checking whether /proc/interrupts contains keyboard data" >&5
    if eval "test \"`echo '$''{'ac_cv_have_proc_interrupts'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4717,7 +4901,7 @@ fi
 
     /*)
      echo $ac_n "checking for Motif headers""... $ac_c" 1>&6
-echo "configure:4732: checking for Motif headers" >&5
+echo "configure:4916: checking for Motif headers" >&5
      d=$with_motif/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -4727,7 +4911,7 @@ echo "configure:4732: checking for Motif headers" >&5
      fi
 
      echo $ac_n "checking for Motif libs""... $ac_c" 1>&6
-echo "configure:4742: checking for Motif libs" >&5
+echo "configure:4926: checking for Motif libs" >&5
      d=$with_motif/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -4772,7 +4956,7 @@ fi
 
     /*)
      echo $ac_n "checking for Athena headers""... $ac_c" 1>&6
-echo "configure:4787: checking for Athena headers" >&5
+echo "configure:4971: checking for Athena headers" >&5
      d=$with_athena/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -4782,7 +4966,7 @@ echo "configure:4787: checking for Athena headers" >&5
      fi
 
      echo $ac_n "checking for Athena libs""... $ac_c" 1>&6
-echo "configure:4797: checking for Athena libs" >&5
+echo "configure:4981: checking for Athena libs" >&5
      d=$with_athena/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -4845,17 +5029,17 @@ check_motif() {
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "Xm/Xm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for Xm/Xm.h""... $ac_c" 1>&6
-echo "configure:4860: checking for Xm/Xm.h" >&5
+echo "configure:5044: checking for Xm/Xm.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4865 "configure"
+#line 5049 "configure"
 #include "confdefs.h"
 #include <Xm/Xm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4870: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5054: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4895,17 +5079,17 @@ check_athena() {
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/Xaw/Dialog.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/Xaw/Dialog.h""... $ac_c" 1>&6
-echo "configure:4910: checking for X11/Xaw/Dialog.h" >&5
+echo "configure:5094: checking for X11/Xaw/Dialog.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4915 "configure"
+#line 5099 "configure"
 #include "confdefs.h"
 #include <X11/Xaw/Dialog.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4920: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5104: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4945,7 +5129,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS"
 
   echo $ac_n "checking for Xaw3dComputeTopShadowRGB in -lXaw3d""... $ac_c" 1>&6
-echo "configure:4960: checking for Xaw3dComputeTopShadowRGB in -lXaw3d" >&5
+echo "configure:5144: checking for Xaw3dComputeTopShadowRGB in -lXaw3d" >&5
 ac_lib_var=`echo Xaw3d'_'Xaw3dComputeTopShadowRGB | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4953,7 +5137,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXaw3d -lXt -lXmu -lXext -lX11 $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4968 "configure"
+#line 5152 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4964,7 +5148,7 @@ int main() {
 Xaw3dComputeTopShadowRGB()
 ; return 0; }
 EOF
-if { (eval echo configure:4979: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5163: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5041,7 +5225,7 @@ fi
 # XawViewportSetCoordinates in Viewport.h (R3 (or R4?) don't.)
 if test "$have_athena" = yes ; then
   echo $ac_n "checking for XawViewportSetCoordinates in Viewport.h""... $ac_c" 1>&6
-echo "configure:5056: checking for XawViewportSetCoordinates in Viewport.h" >&5
+echo "configure:5240: checking for XawViewportSetCoordinates in Viewport.h" >&5
 if eval "test \"`echo '$''{'ac_cv_have_XawViewportSetCoordinates'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5053,7 +5237,7 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 5068 "configure"
+#line 5252 "configure"
 #include "confdefs.h"
 #include <X11/Xaw/Viewport.h>
 EOF
@@ -5082,7 +5266,7 @@ fi
 have_lesstif=no
 if test "$have_motif" = yes ; then
   echo $ac_n "checking whether Motif is really LessTif""... $ac_c" 1>&6
-echo "configure:5097: checking whether Motif is really LessTif" >&5
+echo "configure:5281: checking whether Motif is really LessTif" >&5
 if eval "test \"`echo '$''{'ac_cv_have_lesstif'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5093,14 +5277,14 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 5108 "configure"
+#line 5292 "configure"
 #include "confdefs.h"
 #include <Xm/Xm.h>
 int main() {
 long vers = LesstifVersion;
 ; return 0; }
 EOF
-if { (eval echo configure:5115: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5299: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_have_lesstif=yes
 else
@@ -5128,7 +5312,7 @@ if test "$have_lesstif" = yes ; then
   ltv=unknown
   echo unknown > conftest-lt
   echo $ac_n "checking LessTif version number""... $ac_c" 1>&6
-echo "configure:5143: checking LessTif version number" >&5
+echo "configure:5327: checking LessTif version number" >&5
 if eval "test \"`echo '$''{'ac_cv_lesstif_version_string'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5143,7 +5327,7 @@ else
                     ac_cv_lesstif_version_string=unknown
 else
   cat > conftest.$ac_ext <<EOF
-#line 5158 "configure"
+#line 5342 "configure"
 #include "confdefs.h"
 #include <stdio.h>
                     #include <Xm/Xm.h>
@@ -5156,7 +5340,7 @@ else
                       exit(0);
                     }
 EOF
-if { (eval echo configure:5171: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:5355: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ltv=`cat conftest-lt`
                     ac_cv_lesstif_version=`echo $ltv | sed 's/ .*//'`
@@ -5186,7 +5370,7 @@ if test "$have_motif" = yes ; then
   mtv=unknown
   echo unknown > conftest-mt
   echo $ac_n "checking Motif version number""... $ac_c" 1>&6
-echo "configure:5201: checking Motif version number" >&5
+echo "configure:5385: checking Motif version number" >&5
 if eval "test \"`echo '$''{'ac_cv_motif_version_string'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5201,7 +5385,7 @@ else
                     ac_cv_motif_version_string=unknown
 else
   cat > conftest.$ac_ext <<EOF
-#line 5216 "configure"
+#line 5400 "configure"
 #include "confdefs.h"
 #include <stdio.h>
                     #include <Xm/Xm.h>
@@ -5214,7 +5398,7 @@ else
                       exit(0);
                     }
 EOF
-if { (eval echo configure:5229: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:5413: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   mtv=`cat conftest-mt`
                     ac_cv_motif_version=`echo $mtv | sed 's/ .*//'`
@@ -5252,7 +5436,7 @@ fi
 motif_requires_xpm=no
 if test "$have_motif" = yes ; then
    echo $ac_n "checking whether Motif requires XPM""... $ac_c" 1>&6
-echo "configure:5267: checking whether Motif requires XPM" >&5
+echo "configure:5451: checking whether Motif requires XPM" >&5
    if test "$motif_version" -ge 2000; then
      motif_requires_xpm=yes
      echo "$ac_t""maybe" 1>&6
@@ -5287,7 +5471,7 @@ if test "$have_motif" = yes ; then
   LDFLAGS="$LDFLAGS $X_LIBS"
 
   echo $ac_n "checking for XpQueryExtension in -lXp""... $ac_c" 1>&6
-echo "configure:5302: checking for XpQueryExtension in -lXp" >&5
+echo "configure:5486: checking for XpQueryExtension in -lXp" >&5
 ac_lib_var=`echo Xp'_'XpQueryExtension | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5295,7 +5479,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXp -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5310 "configure"
+#line 5494 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5306,7 +5490,7 @@ int main() {
 XpQueryExtension()
 ; return 0; }
 EOF
-if { (eval echo configure:5321: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5505: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5353,7 +5537,7 @@ if test "$have_motif" = yes ; then
   LDFLAGS="$LDFLAGS $X_LIBS"
 
   echo $ac_n "checking for _Xsetlocale in -lXintl""... $ac_c" 1>&6
-echo "configure:5368: checking for _Xsetlocale in -lXintl" >&5
+echo "configure:5552: checking for _Xsetlocale in -lXintl" >&5
 ac_lib_var=`echo Xintl'_'_Xsetlocale | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5361,7 +5545,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXintl -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5376 "configure"
+#line 5560 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5372,7 +5556,7 @@ int main() {
 _Xsetlocale()
 ; return 0; }
 EOF
-if { (eval echo configure:5387: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5571: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5421,7 +5605,7 @@ fi
 
     /*)
      echo $ac_n "checking for XPM headers""... $ac_c" 1>&6
-echo "configure:5436: checking for XPM headers" >&5
+echo "configure:5620: checking for XPM headers" >&5
      d=$with_xpm/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -5431,7 +5615,7 @@ echo "configure:5436: checking for XPM headers" >&5
      fi
 
      echo $ac_n "checking for XPM libs""... $ac_c" 1>&6
-echo "configure:5446: checking for XPM libs" >&5
+echo "configure:5630: checking for XPM libs" >&5
      d=$with_xpm/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -5469,17 +5653,17 @@ if test "$with_xpm" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/xpm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/xpm.h""... $ac_c" 1>&6
-echo "configure:5484: checking for X11/xpm.h" >&5
+echo "configure:5668: checking for X11/xpm.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5489 "configure"
+#line 5673 "configure"
 #include "confdefs.h"
 #include <X11/xpm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5494: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5678: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5542,7 +5726,7 @@ fi
 
     /*)
      echo $ac_n "checking for GL headers""... $ac_c" 1>&6
-echo "configure:5557: checking for GL headers" >&5
+echo "configure:5741: checking for GL headers" >&5
      d=$with_gl/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -5552,7 +5736,7 @@ echo "configure:5557: checking for GL headers" >&5
      fi
 
      echo $ac_n "checking for GL libs""... $ac_c" 1>&6
-echo "configure:5567: checking for GL libs" >&5
+echo "configure:5751: checking for GL libs" >&5
      d=$with_gl/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -5593,17 +5777,17 @@ if test "$with_gl" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "GL/gl.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for GL/gl.h""... $ac_c" 1>&6
-echo "configure:5608: checking for GL/gl.h" >&5
+echo "configure:5792: checking for GL/gl.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5613 "configure"
+#line 5797 "configure"
 #include "confdefs.h"
 #include <GL/gl.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5618: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5802: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5634,17 +5818,17 @@ fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "GL/glx.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for GL/glx.h""... $ac_c" 1>&6
-echo "configure:5649: checking for GL/glx.h" >&5
+echo "configure:5833: checking for GL/glx.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5654 "configure"
+#line 5838 "configure"
 #include "confdefs.h"
 #include <GL/glx.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5659: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5843: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5681,7 +5865,7 @@ EOF
     # to link against.
     #
     echo $ac_n "checking whether GL is really MesaGL""... $ac_c" 1>&6
-echo "configure:5696: checking whether GL is really MesaGL" >&5
+echo "configure:5880: checking whether GL is really MesaGL" >&5
     if eval "test \"`echo '$''{'ac_cv_have_mesa_gl'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5693,7 +5877,7 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 5708 "configure"
+#line 5892 "configure"
 #include "confdefs.h"
 #include <GL/glx.h>
 EOF
@@ -5734,12 +5918,12 @@ EOF
       unset ac_cv_mesagl_version_string
 
       echo $ac_n "checking MesaGL version number""... $ac_c" 1>&6
-echo "configure:5749: checking MesaGL version number" >&5
+echo "configure:5933: checking MesaGL version number" >&5
       if eval "test \"`echo '$''{'ac_cv_mesagl_version_string'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5754 "configure"
+#line 5938 "configure"
 #include "confdefs.h"
 #include <GL/gl.h>
 configure: MESA_MAJOR_VERSION MESA_MINOR_VERSION
@@ -5792,7 +5976,7 @@ fi
     if test "$ac_have_mesa_gl" = yes; then
 
       echo $ac_n "checking for pthread_create in -lpthread""... $ac_c" 1>&6
-echo "configure:5807: checking for pthread_create in -lpthread" >&5
+echo "configure:5991: checking for pthread_create in -lpthread" >&5
 ac_lib_var=`echo pthread'_'pthread_create | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5800,7 +5984,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lpthread  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5815 "configure"
+#line 5999 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5811,7 +5995,7 @@ int main() {
 pthread_create()
 ; return 0; }
 EOF
-if { (eval echo configure:5826: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6010: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5849,7 +6033,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS"
 
   echo $ac_n "checking for gl_get_thread_context in -l$gl_lib_1""... $ac_c" 1>&6
-echo "configure:5864: checking for gl_get_thread_context in -l$gl_lib_1" >&5
+echo "configure:6048: checking for gl_get_thread_context in -l$gl_lib_1" >&5
 ac_lib_var=`echo $gl_lib_1'_'gl_get_thread_context | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5857,7 +6041,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-l$gl_lib_1 $GL_LIBS -lpthread -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5872 "configure"
+#line 6056 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5868,7 +6052,7 @@ int main() {
 gl_get_thread_context()
 ; return 0; }
 EOF
-if { (eval echo configure:5883: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6067: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5916,7 +6100,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS"
 
   echo $ac_n "checking for glBindTexture in -l$gl_lib_1""... $ac_c" 1>&6
-echo "configure:5931: checking for glBindTexture in -l$gl_lib_1" >&5
+echo "configure:6115: checking for glBindTexture in -l$gl_lib_1" >&5
 ac_lib_var=`echo $gl_lib_1'_'glBindTexture | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5924,7 +6108,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5939 "configure"
+#line 6123 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5935,7 +6119,7 @@ int main() {
 glBindTexture()
 ; return 0; }
 EOF
-if { (eval echo configure:5950: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6134: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5961,6 +6145,31 @@ fi
   CPPFLAGS="$ac_save_CPPFLAGS"
   LDFLAGS="$ac_save_LDFLAGS"
 
+
+    # Check whether the `xscreensaver' executable should link against GL.
+    # See comments in utils/visual-gl.c for why this is sometimes necessary.
+    #
+    echo $ac_n "checking whether drastic GL measures must be taken""... $ac_c" 1>&6
+echo "configure:6165: checking whether drastic GL measures must be taken" >&5
+    case "$host" in
+      *-sgi*)
+        echo "$ac_t""yes -- hello, SGI." 1>&6
+        cat >> confdefs.h <<\EOF
+#define DAEMON_USE_GL 1
+EOF
+
+        SAVER_GL_SRCS='$(UTILS_SRC)/visual-gl.c'
+        SAVER_GL_OBJS='$(UTILS_BIN)/visual-gl.o'
+        SAVER_GL_LIBS="$GL_LIBS"
+      ;;
+      *)
+        echo "$ac_t""no -- non-SGI." 1>&6
+        SAVER_GL_SRCS=''
+        SAVER_GL_OBJS=''
+        SAVER_GL_LIBS=''
+      ;;
+    esac
+
   fi
 
 elif test "$with_gl" != no; then
@@ -5989,7 +6198,7 @@ fi
 
     /*)
      echo $ac_n "checking for XReadDisplay headers""... $ac_c" 1>&6
-echo "configure:6004: checking for XReadDisplay headers" >&5
+echo "configure:6213: checking for XReadDisplay headers" >&5
      d=$with_readdisplay/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -5999,7 +6208,7 @@ echo "configure:6004: checking for XReadDisplay headers" >&5
      fi
 
      echo $ac_n "checking for XReadDisplay libs""... $ac_c" 1>&6
-echo "configure:6014: checking for XReadDisplay libs" >&5
+echo "configure:6223: checking for XReadDisplay libs" >&5
      d=$with_readdisplay/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -6037,17 +6246,17 @@ if test "$with_readdisplay" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/readdisplay.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/readdisplay.h""... $ac_c" 1>&6
-echo "configure:6052: checking for X11/extensions/readdisplay.h" >&5
+echo "configure:6261: checking for X11/extensions/readdisplay.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6057 "configure"
+#line 6266 "configure"
 #include "confdefs.h"
 #include <X11/extensions/readdisplay.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6062: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6271: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6098,7 +6307,7 @@ fi
 
     /*)
      echo $ac_n "checking for Iris Video headers""... $ac_c" 1>&6
-echo "configure:6113: checking for Iris Video headers" >&5
+echo "configure:6322: checking for Iris Video headers" >&5
      d=$with_sgivideo/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -6108,7 +6317,7 @@ echo "configure:6113: checking for Iris Video headers" >&5
      fi
 
      echo $ac_n "checking for Iris Video libs""... $ac_c" 1>&6
-echo "configure:6123: checking for Iris Video libs" >&5
+echo "configure:6332: checking for Iris Video libs" >&5
      d=$with_sgivideo/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -6146,17 +6355,17 @@ if test "$with_sgivideo" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "dmedia/vl.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for dmedia/vl.h""... $ac_c" 1>&6
-echo "configure:6161: checking for dmedia/vl.h" >&5
+echo "configure:6370: checking for dmedia/vl.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6166 "configure"
+#line 6375 "configure"
 #include "confdefs.h"
 #include <dmedia/vl.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6171: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6380: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6181,7 +6390,7 @@ fi
   if test "$have_sgivideo" = yes; then
     have_sgivideo=no
     echo $ac_n "checking for vlOpenVideo in -lvl""... $ac_c" 1>&6
-echo "configure:6196: checking for vlOpenVideo in -lvl" >&5
+echo "configure:6405: checking for vlOpenVideo in -lvl" >&5
 ac_lib_var=`echo vl'_'vlOpenVideo | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -6189,7 +6398,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lvl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 6204 "configure"
+#line 6413 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6200,7 +6409,7 @@ int main() {
 vlOpenVideo()
 ; return 0; }
 EOF
-if { (eval echo configure:6215: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6424: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6268,7 +6477,7 @@ if test -n "$with_zippy_req" ; then
   case "$with_zippy_req" in
     /*)
       echo $ac_n "checking for $with_zippy_req""... $ac_c" 1>&6
-echo "configure:6283: checking for $with_zippy_req" >&5
+echo "configure:6492: checking for $with_zippy_req" >&5
       if test -x "$with_zippy_req" ; then
         echo "$ac_t""yes" 1>&6
       else
@@ -6282,7 +6491,7 @@ echo "configure:6283: checking for $with_zippy_req" >&5
       # Extract the first word of "$with_zippy_req", so it can be a program name with args.
 set dummy $with_zippy_req; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6297: checking for $ac_word" >&5
+echo "configure:6506: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_zip2'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6332,7 +6541,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6347: checking for $ac_word" >&5
+echo "configure:6556: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_emacs_exe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6366,7 +6575,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6381: checking for $ac_word" >&5
+echo "configure:6590: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_xemacs_exe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6401,7 +6610,7 @@ done
 
   if test -n "$emacs_exe" ; then
     echo $ac_n "checking for emacs yow""... $ac_c" 1>&6
-echo "configure:6416: checking for emacs yow" >&5
+echo "configure:6625: checking for emacs yow" >&5
     #
     # get emacs to tell us where the libexec directory is.
     #
@@ -6423,7 +6632,7 @@ echo "configure:6416: checking for emacs yow" >&5
 
   if test -z "$ac_cv_zippy_program" ; then
     echo $ac_n "checking for xemacs yow""... $ac_c" 1>&6
-echo "configure:6438: checking for xemacs yow" >&5
+echo "configure:6647: checking for xemacs yow" >&5
     if test -n "$xemacs_exe" ; then
       #
       # get xemacs to tell us where the libexec directory is.
@@ -6482,7 +6691,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6497: checking for $ac_word" >&5
+echo "configure:6706: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_fortune'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6518,7 +6727,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6533: checking for $ac_word" >&5
+echo "configure:6742: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_fortune'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6617,12 +6826,12 @@ fi
 if test "$enable_vt_locking" = yes; then
 
   echo $ac_n "checking for the VT_LOCKSWITCH ioctl""... $ac_c" 1>&6
-echo "configure:6632: checking for the VT_LOCKSWITCH ioctl" >&5
+echo "configure:6841: checking for the VT_LOCKSWITCH ioctl" >&5
   if eval "test \"`echo '$''{'ac_cv_vt_lockswitch'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6637 "configure"
+#line 6846 "configure"
 #include "confdefs.h"
 #include <fcntl.h>
                    #include <sys/ioctl.h>
@@ -6631,7 +6840,7 @@ int main() {
 int x = VT_LOCKSWITCH; int y = VT_UNLOCKSWITCH;
 ; return 0; }
 EOF
-if { (eval echo configure:6646: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6855: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_vt_lockswitch=yes
 else
@@ -6685,7 +6894,7 @@ fi
 
     /*)
      echo $ac_n "checking for Kerberos headers""... $ac_c" 1>&6
-echo "configure:6700: checking for Kerberos headers" >&5
+echo "configure:6909: checking for Kerberos headers" >&5
      d=$with_kerberos/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -6695,7 +6904,7 @@ echo "configure:6700: checking for Kerberos headers" >&5
      fi
 
      echo $ac_n "checking for Kerberos libs""... $ac_c" 1>&6
-echo "configure:6710: checking for Kerberos libs" >&5
+echo "configure:6919: checking for Kerberos libs" >&5
      d=$with_kerberos/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -6726,7 +6935,7 @@ echo "configure:6710: checking for Kerberos libs" >&5
 
   if test "$with_kerberos" = yes; then
     echo $ac_n "checking for Kerberos""... $ac_c" 1>&6
-echo "configure:6741: checking for Kerberos" >&5
+echo "configure:6950: checking for Kerberos" >&5
 if eval "test \"`echo '$''{'ac_cv_kerberos'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6737,14 +6946,14 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 6752 "configure"
+#line 6961 "configure"
 #include "confdefs.h"
 #include <krb.h>
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:6759: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6968: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_kerberos=yes
 else
@@ -6768,12 +6977,12 @@ EOF
       # from Tim Showalter <tjs+@andrew.cmu.edu>
       PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes"
       echo $ac_n "checking for res_search""... $ac_c" 1>&6
-echo "configure:6783: checking for res_search" >&5
+echo "configure:6992: checking for res_search" >&5
 if eval "test \"`echo '$''{'ac_cv_func_res_search'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6788 "configure"
+#line 6997 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char res_search(); below.  */
@@ -6796,7 +7005,7 @@ res_search();
 
 ; return 0; }
 EOF
-if { (eval echo configure:6811: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7020: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_res_search=yes"
 else
@@ -6814,7 +7023,7 @@ if eval "test \"`echo '$ac_cv_func_'res_search`\" = yes"; then
 else
   echo "$ac_t""no" 1>&6
 echo $ac_n "checking for res_search in -lresolv""... $ac_c" 1>&6
-echo "configure:6829: checking for res_search in -lresolv" >&5
+echo "configure:7038: checking for res_search in -lresolv" >&5
 ac_lib_var=`echo resolv'_'res_search | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -6822,7 +7031,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lresolv  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 6837 "configure"
+#line 7046 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6833,7 +7042,7 @@ int main() {
 res_search()
 ; return 0; }
 EOF
-if { (eval echo configure:6848: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7057: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6870,11 +7079,9 @@ if test "${with_pam+set}" = set; then
   withval="$with_pam"
   with_pam="$withval"; with_pam_req="$withval"
 else
-  with_pam=no
+  with_pam=yes
 fi
 
-#### Leave PAM off by default for now, since it's buggy on Solaris
-#### (and probably Linux, but it's so hard to tell...)
 
   
    case "$with_pam" in
@@ -6883,7 +7090,7 @@ fi
 
     /*)
      echo $ac_n "checking for PAM headers""... $ac_c" 1>&6
-echo "configure:6898: checking for PAM headers" >&5
+echo "configure:7105: checking for PAM headers" >&5
      d=$with_pam/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -6893,7 +7100,7 @@ echo "configure:6898: checking for PAM headers" >&5
      fi
 
      echo $ac_n "checking for PAM libs""... $ac_c" 1>&6
-echo "configure:6908: checking for PAM libs" >&5
+echo "configure:7115: checking for PAM libs" >&5
      d=$with_pam/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -6924,7 +7131,7 @@ echo "configure:6908: checking for PAM libs" >&5
 
   if test "$with_pam" = yes; then
     echo $ac_n "checking for PAM""... $ac_c" 1>&6
-echo "configure:6939: checking for PAM" >&5
+echo "configure:7146: checking for PAM" >&5
 if eval "test \"`echo '$''{'ac_cv_pam'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6935,14 +7142,14 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 6950 "configure"
+#line 7157 "configure"
 #include "confdefs.h"
 #include <security/pam_appl.h>
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:6957: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7164: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_pam=yes
 else
@@ -6963,6 +7170,69 @@ echo "$ac_t""$ac_cv_pam" 1>&6
 EOF
 
          PASSWD_LIBS="${PASSWD_LIBS} -lpam -ldl"
+
+
+          echo $ac_n "checking how to call pam_strerror""... $ac_c" 1>&6
+echo "configure:7188: checking how to call pam_strerror" >&5
+          if eval "test \"`echo '$''{'ac_cv_pam_strerror_args'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 7193 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+                            #include <stdlib.h>
+                            #include <security/pam_appl.h>
+int main() {
+pam_handle_t *pamh = 0;
+                            char *s = pam_strerror(pamh, PAM_SUCCESS);
+; return 0; }
+EOF
+if { (eval echo configure:7203: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_pam_strerror_args=2
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat > conftest.$ac_ext <<EOF
+#line 7211 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+                                            #include <stdlib.h>
+                                            #include <security/pam_appl.h>
+int main() {
+char *s =
+                                             pam_strerror(PAM_SUCCESS);
+; return 0; }
+EOF
+if { (eval echo configure:7221: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_pam_strerror_args=1
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_pam_strerror_args=0
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+            ac_cv_pam_strerror_args=$ac_pam_strerror_args
+fi
+
+          ac_pam_strerror_args=$ac_cv_pam_strerror_args
+          if test "$ac_pam_strerror_args" = 1 ; then
+            echo "$ac_t""one argument" 1>&6
+          elif test "$ac_pam_strerror_args" = 2 ; then
+            cat >> confdefs.h <<\EOF
+#define PAM_STRERROR_TWO_ARGS 1
+EOF
+
+            echo "$ac_t""two arguments" 1>&6
+          else
+            echo "$ac_t""unknown" 1>&6
+          fi
     fi
   elif test "$with_pam" != no; then
        echo "error: must be yes or no: --with-pam=$with_pam"
@@ -6988,7 +7258,7 @@ fi
 
     /*)
      echo $ac_n "checking for shadow password headers""... $ac_c" 1>&6
-echo "configure:7003: checking for shadow password headers" >&5
+echo "configure:7273: checking for shadow password headers" >&5
      d=$with_shadow/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -6998,7 +7268,7 @@ echo "configure:7003: checking for shadow password headers" >&5
      fi
 
      echo $ac_n "checking for shadow password libs""... $ac_c" 1>&6
-echo "configure:7013: checking for shadow password libs" >&5
+echo "configure:7283: checking for shadow password libs" >&5
      d=$with_shadow/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -7039,7 +7309,7 @@ echo "configure:7013: checking for shadow password libs" >&5
   #
   if test "$pwent_cruft_done" = no ; then
     echo $ac_n "checking for Sun-style shadow passwords""... $ac_c" 1>&6
-echo "configure:7054: checking for Sun-style shadow passwords" >&5
+echo "configure:7324: checking for Sun-style shadow passwords" >&5
 if eval "test \"`echo '$''{'ac_cv_sun_adjunct'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7050,7 +7320,7 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 7065 "configure"
+#line 7335 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
                                      #include <unistd.h>
@@ -7063,7 +7333,7 @@ struct passwd_adjunct *p = getpwanam("nobody");
                         const char *pw = p->pwa_passwd;
 ; return 0; }
 EOF
-if { (eval echo configure:7078: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7348: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_sun_adjunct=yes
 else
@@ -7092,7 +7362,7 @@ EOF
   #
   if test "$pwent_cruft_done" = no ; then
     echo $ac_n "checking for DEC-style shadow passwords""... $ac_c" 1>&6
-echo "configure:7107: checking for DEC-style shadow passwords" >&5
+echo "configure:7377: checking for DEC-style shadow passwords" >&5
 if eval "test \"`echo '$''{'ac_cv_enhanced_passwd'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7103,7 +7373,7 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 7118 "configure"
+#line 7388 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
                                      #include <unistd.h>
@@ -7120,7 +7390,7 @@ struct pr_passwd *p;
                         pw = p->ufld.fd_encrypt;
 ; return 0; }
 EOF
-if { (eval echo configure:7135: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7405: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_enhanced_passwd=yes
 else
@@ -7146,7 +7416,7 @@ EOF
       # On SCO, getprpwnam() is in -lprot (which uses nap() from -lx)
       # (I'm told it needs -lcurses too, but I don't understand why.)
       echo $ac_n "checking for getprpwnam in -lprot""... $ac_c" 1>&6
-echo "configure:7161: checking for getprpwnam in -lprot" >&5
+echo "configure:7431: checking for getprpwnam in -lprot" >&5
 ac_lib_var=`echo prot'_'getprpwnam | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7154,7 +7424,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lprot -lx $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7169 "configure"
+#line 7439 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7165,7 +7435,7 @@ int main() {
 getprpwnam()
 ; return 0; }
 EOF
-if { (eval echo configure:7180: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7450: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7185,7 +7455,7 @@ else
   echo "$ac_t""no" 1>&6
 # On DEC, getprpwnam() is in -lsecurity
                    echo $ac_n "checking for getprpwnam in -lsecurity""... $ac_c" 1>&6
-echo "configure:7200: checking for getprpwnam in -lsecurity" >&5
+echo "configure:7470: checking for getprpwnam in -lsecurity" >&5
 ac_lib_var=`echo security'_'getprpwnam | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7193,7 +7463,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lsecurity  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7208 "configure"
+#line 7478 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7204,7 +7474,7 @@ int main() {
 getprpwnam()
 ; return 0; }
 EOF
-if { (eval echo configure:7219: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7489: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7233,7 +7503,7 @@ fi
   #
   if test "$pwent_cruft_done" = no ; then
     echo $ac_n "checking for HP-style shadow passwords""... $ac_c" 1>&6
-echo "configure:7248: checking for HP-style shadow passwords" >&5
+echo "configure:7518: checking for HP-style shadow passwords" >&5
 if eval "test \"`echo '$''{'ac_cv_hpux_passwd'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7244,7 +7514,7 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 7259 "configure"
+#line 7529 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
                                      #include <unistd.h>
@@ -7257,7 +7527,7 @@ struct s_passwd *p = getspwnam("nobody");
                         const char *pw = p->pw_passwd;
 ; return 0; }
 EOF
-if { (eval echo configure:7272: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7542: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_hpux_passwd=yes
 else
@@ -7282,7 +7552,7 @@ EOF
 
       # on HPUX, bigcrypt is in -lsec
       echo $ac_n "checking for bigcrypt in -lsec""... $ac_c" 1>&6
-echo "configure:7297: checking for bigcrypt in -lsec" >&5
+echo "configure:7567: checking for bigcrypt in -lsec" >&5
 ac_lib_var=`echo sec'_'bigcrypt | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7290,7 +7560,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lsec  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7305 "configure"
+#line 7575 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7301,7 +7571,7 @@ int main() {
 bigcrypt()
 ; return 0; }
 EOF
-if { (eval echo configure:7316: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7586: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7328,7 +7598,7 @@ fi
   #
   if test "$pwent_cruft_done" = no ; then
     echo $ac_n "checking for generic shadow passwords""... $ac_c" 1>&6
-echo "configure:7343: checking for generic shadow passwords" >&5
+echo "configure:7613: checking for generic shadow passwords" >&5
 if eval "test \"`echo '$''{'ac_cv_shadow'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7339,7 +7609,7 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 7354 "configure"
+#line 7624 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
                                      #include <unistd.h>
@@ -7351,7 +7621,7 @@ struct spwd *p = getspnam("nobody");
                         const char *pw = p->sp_pwdp;
 ; return 0; }
 EOF
-if { (eval echo configure:7366: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7636: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_shadow=yes
 else
@@ -7377,7 +7647,7 @@ EOF
       # On some systems (UnixWare 2.1), getspnam() is in -lgen instead of -lc.
       have_getspnam=no
       echo $ac_n "checking for getspnam in -lc""... $ac_c" 1>&6
-echo "configure:7392: checking for getspnam in -lc" >&5
+echo "configure:7662: checking for getspnam in -lc" >&5
 ac_lib_var=`echo c'_'getspnam | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7385,7 +7655,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lc  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7400 "configure"
+#line 7670 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7396,7 +7666,7 @@ int main() {
 getspnam()
 ; return 0; }
 EOF
-if { (eval echo configure:7411: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7681: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7418,7 +7688,7 @@ fi
 
       if test "$have_getspnam" = no ; then
         echo $ac_n "checking for getspnam in -lgen""... $ac_c" 1>&6
-echo "configure:7433: checking for getspnam in -lgen" >&5
+echo "configure:7703: checking for getspnam in -lgen" >&5
 ac_lib_var=`echo gen'_'getspnam | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7426,7 +7696,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lgen  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7441 "configure"
+#line 7711 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7437,7 +7707,7 @@ int main() {
 getspnam()
 ; return 0; }
 EOF
-if { (eval echo configure:7452: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7722: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7468,7 +7738,7 @@ fi
   #
   if test "$pwent_cruft_done" = no ; then
     echo $ac_n "checking for FreeBSD-style shadow passwords""... $ac_c" 1>&6
-echo "configure:7483: checking for FreeBSD-style shadow passwords" >&5
+echo "configure:7753: checking for FreeBSD-style shadow passwords" >&5
 if eval "test \"`echo '$''{'ac_cv_master_passwd'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7489,7 +7759,7 @@ echo "$ac_t""$ac_cv_master_passwd" 1>&6
   # On some systems (UnixWare 2.1), crypt() is in -lcrypt instead of -lc.
   have_crypt=no
   echo $ac_n "checking for crypt in -lc""... $ac_c" 1>&6
-echo "configure:7504: checking for crypt in -lc" >&5
+echo "configure:7774: checking for crypt in -lc" >&5
 ac_lib_var=`echo c'_'crypt | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7497,7 +7767,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lc  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7512 "configure"
+#line 7782 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7508,7 +7778,7 @@ int main() {
 crypt()
 ; return 0; }
 EOF
-if { (eval echo configure:7523: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7793: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7530,7 +7800,7 @@ fi
 
   if test "$have_crypt" = no ; then
     echo $ac_n "checking for crypt in -lcrypt""... $ac_c" 1>&6
-echo "configure:7545: checking for crypt in -lcrypt" >&5
+echo "configure:7815: checking for crypt in -lcrypt" >&5
 ac_lib_var=`echo crypt'_'crypt | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7538,7 +7808,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lcrypt  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7553 "configure"
+#line 7823 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7549,7 +7819,7 @@ int main() {
 crypt()
 ; return 0; }
 EOF
-if { (eval echo configure:7564: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7834: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7587,6 +7857,138 @@ fi
 fi
 
 
+# for the "sonar" hack -- check how to ping.
+#
+echo $ac_n "checking for struct icmp""... $ac_c" 1>&6
+echo "configure:7875: checking for struct icmp" >&5
+if eval "test \"`echo '$''{'ac_cv_have_icmp'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 7880 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+                  #include <stdio.h>
+                  #include <math.h>
+                  #include <unistd.h>
+                  #include <limits.h>
+                  #include <signal.h>
+                  #include <fcntl.h>
+                  #include <sys/types.h>
+                  #include <sys/time.h>
+                  #include <sys/ipc.h>
+                  #include <sys/shm.h>
+                  #include <sys/socket.h>
+                  #include <netinet/in_systm.h>
+                  #include <netinet/in.h>
+                  #include <netinet/ip.h>
+                  #include <netinet/ip_icmp.h>
+                  #include <netinet/udp.h>
+                  #include <arpa/inet.h>
+                  #include <netdb.h>
+int main() {
+struct icmp i;
+                  struct sockaddr s;
+                  struct sockaddr_in si;
+                  struct ip ip;
+                  i.icmp_type = ICMP_ECHO;
+                  i.icmp_code = 0;
+                  i.icmp_cksum = 0;
+                  i.icmp_id = 0;
+                  i.icmp_seq = 0;
+                  si.sin_family = AF_INET;
+                  ip.ip_hl = 0;
+; return 0; }
+EOF
+if { (eval echo configure:7915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_have_icmp=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_have_icmp=no
+fi
+rm -f conftest*
+fi
+
+ac_have_icmp=$ac_cv_have_icmp
+echo "$ac_t""$ac_cv_have_icmp" 1>&6
+
+echo $ac_n "checking for struct icmphdr""... $ac_c" 1>&6
+echo "configure:7931: checking for struct icmphdr" >&5
+if eval "test \"`echo '$''{'ac_cv_have_icmphdr'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 7936 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+                  #include <stdio.h>
+                  #include <math.h>
+                  #include <unistd.h>
+                  #include <limits.h>
+                  #include <signal.h>
+                  #include <fcntl.h>
+                  #include <sys/types.h>
+                  #include <sys/time.h>
+                  #include <sys/ipc.h>
+                  #include <sys/shm.h>
+                  #include <sys/socket.h>
+                  #include <netinet/in_systm.h>
+                  #include <netinet/in.h>
+                  #include <netinet/ip.h>
+                  #include <netinet/ip_icmp.h>
+                  #include <netinet/udp.h>
+                  #include <arpa/inet.h>
+                  #include <netdb.h>
+int main() {
+struct icmphdr i;
+                  struct sockaddr s;
+                  struct sockaddr_in si;
+                  struct ip ip;
+                  i.type = ICMP_ECHO;
+                  i.code = 0;
+                  i.cksum = 0;
+                  i.un.echo.id = 0;
+                  i.un.echo.sequence = 0;
+                  si.sin_family = AF_INET;
+                  ip.ip_hl = 0;
+; return 0; }
+EOF
+if { (eval echo configure:7971: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_have_icmphdr=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_have_icmphdr=no
+fi
+rm -f conftest*
+fi
+
+ac_have_icmphdr=$ac_cv_have_icmphdr
+echo "$ac_t""$ac_cv_have_icmphdr" 1>&6
+
+if test "$ac_have_icmp" = yes ; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ICMP 1
+EOF
+
+fi
+if test "$ac_have_icmphdr" = yes ; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ICMPHDR 1
+EOF
+
+fi
+
+
+
+########################## end of tests.
+
+
 if test \! -z "$includedir" ; then 
   INCLUDES="-I$includedir"
 fi
@@ -7655,9 +8057,10 @@ fi
 tab='  '
 if test "$have_gl" = yes; then
   GL_EXES='$(GL_EXES)'
-  GL_KLUDGE=${tab}
+  GL_MEN='$(GL_MEN)'
+  GL_KLUDGE="${tab}  "
 else
-  GL_KLUDGE='  -'${tab}
+  GL_KLUDGE="  -${tab}  "
 fi
 
 
@@ -7687,6 +8090,10 @@ fi
 
 
 
+
+
+
+
 
 
 
@@ -7769,6 +8176,10 @@ if test "$with_dpms_req" = yes -a "$have_dpms" = no ; then
   warn 'The DPMS extension was requested, but was not found.'
 fi
 
+if test "$with_xf86vmode_req" = yes -a "$have_xf86vmode" = no ; then
+  warn 'The XF86VMODE extension was requested, but was not found.'
+fi
+
 if test "$have_motif" = no -a "$have_athena" = no ; then
   warnL "Neither Motif nor Athena widgets seem to be available;"
   warn2 "the \`xscreensaver-demo' program requires one or the"
@@ -8073,9 +8484,13 @@ s%@PASSWD_SRCS@%$PASSWD_SRCS%g
 s%@PASSWD_OBJS@%$PASSWD_OBJS%g
 s%@XMU_SRCS@%$XMU_SRCS%g
 s%@XMU_OBJS@%$XMU_OBJS%g
+s%@SAVER_GL_SRCS@%$SAVER_GL_SRCS%g
+s%@SAVER_GL_OBJS@%$SAVER_GL_OBJS%g
+s%@SAVER_GL_LIBS@%$SAVER_GL_LIBS%g
 s%@LOCK_SRCS@%$LOCK_SRCS%g
 s%@LOCK_OBJS@%$LOCK_OBJS%g
 s%@GL_EXES@%$GL_EXES%g
+s%@GL_MEN@%$GL_MEN%g
 s%@GL_KLUDGE@%$GL_KLUDGE%g
 s%@HACKDIR@%$HACKDIR%g
 s%@APPDEFAULTS@%$APPDEFAULTS%g
index 75a8fe321785428a76d7c25d05815aee43202f25..3de83e0970d25cb6dfa1d899d1fb6a3f51477192 100644 (file)
@@ -874,6 +874,43 @@ elif test "$with_dpms" != no; then
 fi
 
 
+# Check for the XF86VMODE server extension header.
+#
+have_xf86vmode=no
+with_xf86vmode_req=unspecified
+AC_ARG_WITH(xf86vmode-ext,
+[  --with-xf86vmode-ext    Include support for XFree86 virtual screens, if
+                          possible (this is the default).
+  --without-xf86vmode-ext Do not compile in support for this extension.],
+  [with_xf86vmode="$withval"; with_xf86vmode_req="$withval"],
+  [with_xf86vmode=yes])
+
+HANDLE_X_PATH_ARG(with_xf86vmode, --with-xf86vmode-ext, xf86vmode)
+
+if test "$with_xf86vmode" = yes; then
+
+  # first check for xf86vmode.h
+  AC_CHECK_X_HEADER(X11/extensions/xf86vmode.h, [have_xf86vmode=yes])
+
+  # if that succeeded, then check for the -lXxf86vm
+  if test "$have_xf86vmode" = yes; then
+    have_xf86vmode=no
+    AC_CHECK_X_LIB(Xxf86vm, XF86VidModeGetViewPort,
+                 [have_xf86vmode=yes; SAVER_LIBS="$SAVER_LIBS -lXxf86vm"], [],
+                 -lXext -lX11)
+  fi
+
+  # if that succeeded, then we've really got it.
+  if test "$have_xf86vmode" = yes; then
+    AC_DEFINE(HAVE_XF86VMODE)
+  fi
+
+elif test "$with_xf86vmode" != no; then
+  echo "error: must be yes or no: --with-xf86vmode-ext=$with_xf86vmode"
+  exit 1
+fi
+
+
 # Check for /proc/interrupts
 #
 have_proc_interrupts=no
@@ -1329,6 +1366,27 @@ EOF
     AC_CHECK_X_LIB($gl_lib_1, glBindTexture, [AC_DEFINE(HAVE_GLBINDTEXTURE)],
                   [], $GL_LIBS -lX11 -lXext -lm)
 
+
+    # Check whether the `xscreensaver' executable should link against GL.
+    # See comments in utils/visual-gl.c for why this is sometimes necessary.
+    #
+    AC_MSG_CHECKING(whether drastic GL measures must be taken)
+    case "$host" in
+      *-sgi*)
+        AC_MSG_RESULT([yes -- hello, SGI.])
+        AC_DEFINE(DAEMON_USE_GL)
+        SAVER_GL_SRCS='$(UTILS_SRC)/visual-gl.c'
+        SAVER_GL_OBJS='$(UTILS_BIN)/visual-gl.o'
+        SAVER_GL_LIBS="$GL_LIBS"
+      ;;
+      *)
+        AC_MSG_RESULT([no -- non-SGI.])
+        SAVER_GL_SRCS=''
+        SAVER_GL_OBJS=''
+        SAVER_GL_LIBS=''
+      ;;
+    esac
+
   fi
 
 elif test "$with_gl" != no; then
@@ -1654,9 +1712,7 @@ if test "$enable_locking" = yes; then
 [  --with-pam              Include support for PAM (Pluggable Authentication
                           Modules) if possible (this is the default.)
   --without-pam           Do not compile in support for PAM.],
-  [with_pam="$withval"; with_pam_req="$withval"],[with_pam=no])
-#### Leave PAM off by default for now, since it's buggy on Solaris
-#### (and probably Linux, but it's so hard to tell...)
+  [with_pam="$withval"; with_pam_req="$withval"],[with_pam=yes])
 
   HANDLE_X_PATH_ARG(with_pam, --with-pam, PAM)
 
@@ -1669,6 +1725,33 @@ if test "$enable_locking" = yes; then
          have_pam=yes
          AC_DEFINE(HAVE_PAM)
          PASSWD_LIBS="${PASSWD_LIBS} -lpam -ldl"
+
+
+          AC_MSG_CHECKING(how to call pam_strerror)
+          AC_CACHE_VAL(ac_cv_pam_strerror_args,
+           [AC_TRY_COMPILE([#include <stdio.h>
+                            #include <stdlib.h>
+                            #include <security/pam_appl.h>],
+                           [pam_handle_t *pamh = 0;
+                            char *s = pam_strerror(pamh, PAM_SUCCESS);],
+                           [ac_pam_strerror_args=2],
+                           [AC_TRY_COMPILE([#include <stdio.h>
+                                            #include <stdlib.h>
+                                            #include <security/pam_appl.h>],
+                                           [char *s =
+                                             pam_strerror(PAM_SUCCESS);],
+                                           [ac_pam_strerror_args=1],
+                                           [ac_pam_strerror_args=0])])
+            ac_cv_pam_strerror_args=$ac_pam_strerror_args])
+          ac_pam_strerror_args=$ac_cv_pam_strerror_args
+          if test "$ac_pam_strerror_args" = 1 ; then
+            AC_MSG_RESULT(one argument)
+          elif test "$ac_pam_strerror_args" = 2 ; then
+            AC_DEFINE(PAM_STRERROR_TWO_ARGS)
+            AC_MSG_RESULT(two arguments)
+          else
+            AC_MSG_RESULT(unknown)
+          fi
     fi
   elif test "$with_pam" != no; then
        echo "error: must be yes or no: --with-pam=$with_pam"
@@ -1849,6 +1932,94 @@ if test "$enable_locking" = yes; then
 fi
 
 
+# for the "sonar" hack -- check how to ping.
+#
+AC_MSG_CHECKING(for struct icmp)
+AC_CACHE_VAL(ac_cv_have_icmp,
+ [AC_TRY_COMPILE([#include <stdlib.h>
+                  #include <stdio.h>
+                  #include <math.h>
+                  #include <unistd.h>
+                  #include <limits.h>
+                  #include <signal.h>
+                  #include <fcntl.h>
+                  #include <sys/types.h>
+                  #include <sys/time.h>
+                  #include <sys/ipc.h>
+                  #include <sys/shm.h>
+                  #include <sys/socket.h>
+                  #include <netinet/in_systm.h>
+                  #include <netinet/in.h>
+                  #include <netinet/ip.h>
+                  #include <netinet/ip_icmp.h>
+                  #include <netinet/udp.h>
+                  #include <arpa/inet.h>
+                  #include <netdb.h>],
+                 [struct icmp i;
+                  struct sockaddr s;
+                  struct sockaddr_in si;
+                  struct ip ip;
+                  i.icmp_type = ICMP_ECHO;
+                  i.icmp_code = 0;
+                  i.icmp_cksum = 0;
+                  i.icmp_id = 0;
+                  i.icmp_seq = 0;
+                  si.sin_family = AF_INET;
+                  ip.ip_hl = 0;],
+                 [ac_cv_have_icmp=yes],
+                 [ac_cv_have_icmp=no])])
+ac_have_icmp=$ac_cv_have_icmp
+AC_MSG_RESULT($ac_cv_have_icmp)
+
+AC_MSG_CHECKING(for struct icmphdr)
+AC_CACHE_VAL(ac_cv_have_icmphdr,
+ [AC_TRY_COMPILE([#include <stdlib.h>
+                  #include <stdio.h>
+                  #include <math.h>
+                  #include <unistd.h>
+                  #include <limits.h>
+                  #include <signal.h>
+                  #include <fcntl.h>
+                  #include <sys/types.h>
+                  #include <sys/time.h>
+                  #include <sys/ipc.h>
+                  #include <sys/shm.h>
+                  #include <sys/socket.h>
+                  #include <netinet/in_systm.h>
+                  #include <netinet/in.h>
+                  #include <netinet/ip.h>
+                  #include <netinet/ip_icmp.h>
+                  #include <netinet/udp.h>
+                  #include <arpa/inet.h>
+                  #include <netdb.h>],
+                 [struct icmphdr i;
+                  struct sockaddr s;
+                  struct sockaddr_in si;
+                  struct ip ip;
+                  i.type = ICMP_ECHO;
+                  i.code = 0;
+                  i.cksum = 0;
+                  i.un.echo.id = 0;
+                  i.un.echo.sequence = 0;
+                  si.sin_family = AF_INET;
+                  ip.ip_hl = 0;],
+                 [ac_cv_have_icmphdr=yes],
+                 [ac_cv_have_icmphdr=no])])
+ac_have_icmphdr=$ac_cv_have_icmphdr
+AC_MSG_RESULT($ac_cv_have_icmphdr)
+
+if test "$ac_have_icmp" = yes ; then
+  AC_DEFINE(HAVE_ICMP)
+fi
+if test "$ac_have_icmphdr" = yes ; then
+  AC_DEFINE(HAVE_ICMPHDR)
+fi
+
+
+
+########################## end of tests.
+
+
 if test \! -z "$includedir" ; then 
   INCLUDES="-I$includedir"
 fi
@@ -1911,9 +2082,10 @@ fi
 tab='  '
 if test "$have_gl" = yes; then
   GL_EXES='$(GL_EXES)'
-  GL_KLUDGE=${tab}
+  GL_MEN='$(GL_MEN)'
+  GL_KLUDGE="${tab}  "
 else
-  GL_KLUDGE='  -'${tab}
+  GL_KLUDGE="  -${tab}  "
 fi
 
 AC_SUBST(INCLUDES)
@@ -1937,9 +2109,13 @@ AC_SUBST(PASSWD_SRCS)
 AC_SUBST(PASSWD_OBJS)
 AC_SUBST(XMU_SRCS)
 AC_SUBST(XMU_OBJS)
+AC_SUBST(SAVER_GL_SRCS)
+AC_SUBST(SAVER_GL_OBJS)
+AC_SUBST(SAVER_GL_LIBS)
 AC_SUBST(LOCK_SRCS)
 AC_SUBST(LOCK_OBJS)
 AC_SUBST(GL_EXES)
+AC_SUBST(GL_MEN)
 AC_SUBST(GL_KLUDGE)
 AC_SUBST(HACKDIR)
 AC_SUBST(APPDEFAULTS)
@@ -2025,6 +2201,10 @@ if test "$with_dpms_req" = yes -a "$have_dpms" = no ; then
   warn 'The DPMS extension was requested, but was not found.'
 fi
 
+if test "$with_xf86vmode_req" = yes -a "$have_xf86vmode" = no ; then
+  warn 'The XF86VMODE extension was requested, but was not found.'
+fi
+
 if test "$have_motif" = no -a "$have_athena" = no ; then
   warnL "Neither Motif nor Athena widgets seem to be available;"
   warn2 "the \`xscreensaver-demo' program requires one or the"
index 0187e2172b6773762c86a92fe2f4858bb6dcc191..68a676fb34c75c63af72ca1474b9c419a5fa4824 100644 (file)
@@ -94,6 +94,13 @@ PASSWD_LIBS  = @PASSWD_LIBS@
 LOCK_SRCS      = @LOCK_SRCS@
 LOCK_OBJS      = @LOCK_OBJS@
 
+XMU_SRCS       = @XMU_SRCS@
+XMU_OBJS       = @XMU_OBJS@
+
+GL_SRCS                = @SAVER_GL_SRCS@
+GL_OBJS                = @SAVER_GL_OBJS@
+GL_LIBS                = @SAVER_GL_LIBS@
+
 DEMO_UTIL_SRCS = $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \
                  $(UTILS_SRC)/visual.c
 DEMO_UTIL_OBJS = $(UTILS_BIN)/resources.o $(UTILS_BIN)/usleep.o \
@@ -114,9 +121,9 @@ SAVER_OBJS_1        = xscreensaver.o windows.o timers.o subprocs.o \
                  xset.o splash.o setuid.o stderr.o
 
 SAVER_SRCS     = $(SAVER_SRCS_1) prefs.c $(LOCK_SRCS) \
-                 $(SAVER_UTIL_SRCS) @XMU_SRCS@
+                 $(SAVER_UTIL_SRCS) $(GL_SRCS) $(XMU_SRCS)
 SAVER_OBJS     = $(SAVER_OBJS_1) prefs.o $(LOCK_OBJS) \
-                 $(SAVER_UTIL_OBJS) @XMU_OBJS@
+                 $(SAVER_UTIL_OBJS) $(GL_OBJS) $(XMU_OBJS)
 
 CMD_SRCS       = remote.c xscreensaver-command.c
 CMD_OBJS       = remote.o xscreensaver-command.o
@@ -129,7 +136,7 @@ DEMO_SRCS   = $(DEMO_SRCS_1) remote.c \
 DEMO_OBJS      = $(DEMO_OBJS_1) remote.o \
                  $(TOOLKIT_OBJS) $(DEMO_UTIL_OBJS)
 
-SAVER_LIBS     = $(LIBS) $(X_LIBS) @SAVER_LIBS@ \
+SAVER_LIBS     = $(LIBS) $(X_LIBS) @SAVER_LIBS@ $(GL_LIBS) \
                  $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) \
                  $(PASSWD_LIBS)
 
index cc35ca4a413b1104613e32e0276669c01823f066..b820738737e25165e89bef6a716ea2053e2e607f 100644 (file)
@@ -4,8 +4,8 @@
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
-!                              version 3.10
-!                                27-Apr-99
+!                              version 3.12
+!                                10-May-99
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
@@ -32,6 +32,7 @@
 *fadeTicks:            20
 *splash:               True
 *splashDuration:       5
+*visualID:             default
 
 *captureStderr:        True
 *overlayTextForeground:        #FFFF00
 ! colormaps, but others prefer 24-bit windows, that also can be arranged
 ! (in this case, by using "PseudoColor:" versus "TrueColor:".)
 !
+! Some of the screenhacks are written using OpenGL.  OpenGL programs are
+! a bit different than normal X programs, in that they prefer visuals that
+! are *half* as deep as the screen.  You can tell xscreensaver to select a
+! good visual for a GL program by using the magic visual name "GL".
+!
 ! All programs must be launched in such a way that they draw on the root
 ! window; they should not be spawned in the background with "&".  If shell
 ! metacharacters are used, they must be understandable to `sh', not `csh'
 ! (the $SHELL variable is not consulted, for unfortunate but good reasons.)
 !
-! Be sure to check out Demo Mode: run the command `xscreensaver-command -demo'
-! and it will cause the running XScreenSaver program to pop up a dialog box
-! that lets you try out the following programs interactively.  See the man
-! pages for details.
+! Be sure to check out Demo Mode: run the `xscreensaver-demo' program to
+! edit the current list of programs interactively, try out the various modes,
+! and change other parameters.  See the man page for details.
 !
 *programs:     qix -root -solid -delay 0 -segments 100                 \n\
                attraction -root -mode balls                            \n\
   PseudoColor: qix -root -count 5 -solid -transparent -linear            \
                        -segments 250 -size 100                         \n\
                                                                          \
-@GL_KLUDGE@    gears -root                                             \n\
-@GL_KLUDGE@    superquadrics -root                                     \n\
-@GL_KLUDGE@    morph3d -root                                           \n\
-@GL_KLUDGE@    cage -root                                              \n\
-@GL_KLUDGE@    moebius -root                                           \n\
-@GL_KLUDGE@    stairs -root                                            \n\
-@GL_KLUDGE@    pipes -root                                             \n\
-@GL_KLUDGE@    sproingies -root                                        \n\
-@GL_KLUDGE@    rubik -root                                             \n\
-@GL_KLUDGE@    atlantis -root                                          \n\
-@GL_KLUDGE@    lament -root                                            \n\
-@GL_KLUDGE@    bubble3d -root                                          \n\
-@GL_KLUDGE@    glplanet -root                                          \n\
-@GL_KLUDGE@    pulsar -root                                            \n
+@GL_KLUDGE@ GL:        gears -root                                             \n\
+@GL_KLUDGE@ GL:        superquadrics -root                                     \n\
+@GL_KLUDGE@ GL:        morph3d -root                                           \n\
+@GL_KLUDGE@ GL:        cage -root                                              \n\
+@GL_KLUDGE@ GL:        moebius -root                                           \n\
+@GL_KLUDGE@ GL:        stairs -root                                            \n\
+@GL_KLUDGE@ GL:        pipes -root                                             \n\
+@GL_KLUDGE@ GL:        sproingies -root                                        \n\
+@GL_KLUDGE@ GL:        rubik -root                                             \n\
+@GL_KLUDGE@ GL:        atlantis -root                                          \n\
+@GL_KLUDGE@ GL:        lament -root                                            \n\
+@GL_KLUDGE@ GL:        bubble3d -root                                          \n\
+@GL_KLUDGE@ GL:        glplanet -root                                          \n\
+@GL_KLUDGE@ GL:        pulsar -root                                            \n\
+  -       GL:  pulsar -root -texture -mipmap -texture_quality            \
+                      -light -fog                                      \n
  
 
-! A few of the hacks require OpenGL, and will only be built if you have it.
-! If your vendor doesn't provide real OpenGL, you might want to consider
-! building MesaGL, which is a free implementation -- GL is way cool.
-!
-! Note that those hacks (gears, superquadratics, morph3d, cage, moebius,
-! stairs, pipes, sproingies, and rubik) tend to work best on a visual *half*
-! as deep as the depth of the screen, since that way, they can do
-! double-buffering -- try it and see, but you will probably find that you
-! should specify the deepest visual that is half as deep as the screen.
-!
-! For example, on a screen that supports both 24-bit TrueColor and 12-bit
-! PseudoColor, the 12-bit visual will probably work best (this is true of
-! base-model SGI Indys: the 0x29 visual is the one you want.)  Oddly, on SGI
-! O2s, (machines that have serious hardware support for GL) the 12-bit
-! PseudoColor visual looks awful (you get a black and white, flickery image.)
-! On these machines, the visual you want turns out to be 0x31 -- this is but
-! one of the eight 15-bit TrueColor visuals (yes, 8, and yes, 15) that O2s
-! provide.  This is the only visual that works properly -- as far as xdpyinfo
-! is concerned, all of the 15-bit TrueColor visuals are identical, but some
-! flicker like mad, and some have deeply weird artifacts (hidden surfaces
-! show through!)  I suppose these other visuals must be tied to some arcane
-! hardware feature...  Your mileage, therefore, may vary dramatically.
-!
 ! Some other programs that you might want to track down (these work as
 ! XScreenSaver helpers, but are not distributed with it):
 !
index 0178752289600f139216242742b22ac2e6e7bb52..66a777b28dcb94e7e19c87b711444edb7d501c46 100644 (file)
@@ -13,6 +13,7 @@
 "*fadeTicks:           20",
 "*splash:              True",
 "*splashDuration:      5",
+"*visualID:            default",
 "*captureStderr:       True",
 "*overlayTextForeground:       #FFFF00",
 "*overlayTextBackground:       #000000",
   PseudoColor: qix -root -count 5 -solid -transparent -linear            \
                        -segments 250 -size 100                         \\n\
                                                                          \
-               gears -root                                             \\n\
-               superquadrics -root                                     \\n\
-               morph3d -root                                           \\n\
-               cage -root                                              \\n\
-               moebius -root                                           \\n\
-               stairs -root                                            \\n\
-               pipes -root                                             \\n\
-               sproingies -root                                        \\n\
-               rubik -root                                             \\n\
-               atlantis -root                                          \\n\
-               lament -root                                            \\n\
-               bubble3d -root                                          \\n\
-               glplanet -root                                          \\n\
-               pulsar -root                                            \\n",
+          GL:  gears -root                                             \\n\
+          GL:  superquadrics -root                                     \\n\
+          GL:  morph3d -root                                           \\n\
+          GL:  cage -root                                              \\n\
+          GL:  moebius -root                                           \\n\
+          GL:  stairs -root                                            \\n\
+          GL:  pipes -root                                             \\n\
+          GL:  sproingies -root                                        \\n\
+          GL:  rubik -root                                             \\n\
+          GL:  atlantis -root                                          \\n\
+          GL:  lament -root                                            \\n\
+          GL:  bubble3d -root                                          \\n\
+          GL:  glplanet -root                                          \\n\
+          GL:  pulsar -root                                            \\n\
+  -       GL:  pulsar -root -texture -mipmap -texture_quality            \
+                      -light -fog                                      \\n",
 " ",
 "XScreenSaver.pointerPollTime:         5",
 "XScreenSaver.initialDelay:            0",
index 76e8917d6843797325700804f0cfa9d6884f7fe9..10b246e8cb3fc59176753c0aec2c7fca4e49e25b 100644 (file)
@@ -1268,7 +1268,6 @@ main (int argc, char **argv)
   short_version [4] = 0;
 
   p->db = db;
-  p->fading_possible_p = True;
   load_init_file (p);
   *p2 = *p;
 
index 8a00b3ba154869df0ed8c0a25fb5d513ea0e4f51..4ca3d51344527b526f85eb3facb063be2a0af43a 100644 (file)
 # include <syslog.h>
 #endif /* HAVE_SYSLOG */
 
+#ifdef HAVE_XF86VMODE
+# include <X11/extensions/xf86vmode.h>
+#endif /* HAVE_XF86VMODE */
+
 #ifdef _VROOT_H_
 ERROR!  You must not include vroot.h in this file.
 #endif
@@ -103,8 +107,15 @@ struct passwd_dialog_data {
   Pixmap save_under;
 };
 
+static void draw_passwd_window (saver_info *si);
+static void update_passwd_window (saver_info *si, const char *printed_passwd,
+                                 float ratio);
+static void destroy_passwd_window (saver_info *si);
+static void undo_vp_motion (saver_info *si);
+static void set_vp_mode_switch_locked (saver_info *si, Bool locked_p);
 
-void
+
+static void
 make_passwd_window (saver_info *si)
 {
   struct passwd *p = getpwuid (getuid ());
@@ -298,13 +309,13 @@ make_passwd_window (saver_info *si)
   attrmask |= CWEventMask; attrs.event_mask = ExposureMask|KeyPressMask;
 
   {
-    Dimension w = WidthOfScreen(screen);
-    Dimension h = HeightOfScreen(screen);
+    int x, y, w, h;
+    get_screen_viewport (si->default_screen, &x, &y, &w, &h, False);
     if (si->prefs.debug_p) w /= 2;
-    pw->x = ((w + pw->width) / 2) - pw->width;
-    pw->y = ((h + pw->height) / 2) - pw->height;
-    if (pw->x < 0) pw->x = 0;
-    if (pw->y < 0) pw->y = 0;
+    pw->x = x + ((w + pw->width) / 2) - pw->width;
+    pw->y = y + ((h + pw->height) / 2) - pw->height;
+    if (pw->x < x) pw->x = x;
+    if (pw->y < y) pw->y = y;
   }
 
   pw->border_width = get_integer_resource ("passwd.borderWidth",
@@ -347,6 +358,10 @@ make_passwd_window (saver_info *si)
   XMapRaised (si->dpy, si->passwd_dialog);
   XSync (si->dpy, False);
 
+  move_mouse_grab (si, si->passwd_dialog, si->screens[0].cursor);
+  undo_vp_motion (si);
+  set_vp_mode_switch_locked (si, True);
+
   si->pw_data = pw;
 
   draw_passwd_window (si);
@@ -550,6 +565,7 @@ update_passwd_window (saver_info *si, const char *printed_passwd, float ratio)
   XGCValues gcv;
   GC gc1, gc2;
   int x, y;
+  XRectangle rects[1];
 
   pw->ratio = ratio;
   gcv.foreground = pw->passwd_foreground;
@@ -567,22 +583,34 @@ update_passwd_window (saver_info *si, const char *printed_passwd, float ratio)
 
   /* the "password" text field
    */
+  rects[0].x =  pw->passwd_field_x;
+  rects[0].y =  pw->passwd_field_y;
+  rects[0].width = pw->passwd_field_width;
+  rects[0].height = pw->passwd_field_height;
+
   XFillRectangle (si->dpy, si->passwd_dialog, gc2,
-                 pw->passwd_field_x, pw->passwd_field_y,
-                 pw->passwd_field_width, pw->passwd_field_height);
+                  rects[0].x, rects[0].y, rects[0].width, rects[0].height);
+
+  XSetClipRectangles (si->dpy, gc1, 0, 0, rects, 1, Unsorted);
+
   XDrawString (si->dpy, si->passwd_dialog, gc1,
-              pw->passwd_field_x + pw->shadow_width,
-              pw->passwd_field_y + (pw->passwd_font->ascent +
-                                    pw->passwd_font->descent),
-              pw->passwd_string, strlen(pw->passwd_string));
+               rects[0].x + pw->shadow_width,
+               rects[0].y + (pw->passwd_font->ascent +
+                             pw->passwd_font->descent),
+               pw->passwd_string, strlen(pw->passwd_string));
+
+  XSetClipMask (si->dpy, gc1, None);
 
   /* The I-beam
    */
   if (pw->i_beam != 0)
     {
-      x = (pw->passwd_field_x + pw->shadow_width +
+      x = (rects[0].x + pw->shadow_width +
           string_width (pw->passwd_font, pw->passwd_string));
-      y = pw->passwd_field_y + pw->shadow_width;
+      y = rects[0].y + pw->shadow_width;
+
+      if (x > rects[0].x + rects[0].width - 1)
+        x = rects[0].x + rects[0].width - 1;
       XDrawLine (si->dpy, si->passwd_dialog, gc1, 
                 x, y, x, y + pw->passwd_font->ascent);
     }
@@ -626,6 +654,10 @@ destroy_passwd_window (saver_info *si)
   if (pw->timer)
     XtRemoveTimeOut (pw->timer);
 
+  move_mouse_grab (si, RootWindowOfScreen(si->screens[0].screen),
+                   si->screens[0].cursor);
+  set_vp_mode_switch_locked (si, False);
+
   if (si->passwd_dialog)
     {
       XDestroyWindow (si->dpy, si->passwd_dialog);
@@ -683,6 +715,72 @@ destroy_passwd_window (saver_info *si)
   si->pw_data = 0;
 }
 
+static void
+undo_vp_motion (saver_info *si)
+{
+#ifdef HAVE_XF86VMODE
+  saver_preferences *p = &si->prefs;
+  int screen = 0;  /* always screen 0 */
+  saver_screen_info *ssi = &si->screens[screen];
+  int event, error, x, y;
+  Bool status;
+
+  if (ssi->blank_vp_x == -1 && ssi->blank_vp_y == -1)
+    return;
+  if (!XF86VidModeQueryExtension (si->dpy, &event, &error))
+    return;
+  if (!XF86VidModeGetViewPort (si->dpy, 0, &x, &y))
+    return;
+  if (ssi->blank_vp_x == x && ssi->blank_vp_y == y)
+    return;
+    
+  /* We're going to move the viewport.  The mouse has just been grabbed on
+     (and constrained to, thus warped to) the password window, so it is no
+     longer near the edge of the screen.  However, wait a bit anyway, just
+     to make sure the server drains its last motion event, so that the
+     screen doesn't continue to scroll after we've reset the viewport.
+   */
+  XSync (si->dpy, False);
+  usleep (250);  /* 1/4 second */
+  XSync (si->dpy, False);
+
+  status = XF86VidModeSetViewPort (si->dpy, screen,
+                                   ssi->blank_vp_x, ssi->blank_vp_y);
+
+  if (!status)
+    fprintf (stderr, "%s: unable to move vp from (%d,%d) back to (%d,%d)!\n",
+             blurb(), x, y, ssi->blank_vp_x, ssi->blank_vp_y);
+  else if (p->verbose_p)
+    fprintf (stderr, "%s: vp moved to (%d,%d); moved it back to (%d,%d).\n",
+             blurb(), x, y, ssi->blank_vp_x, ssi->blank_vp_y);
+
+#endif /* HAVE_XF86VMODE */
+}
+
+
+static void
+set_vp_mode_switch_locked (saver_info *si, Bool locked_p)
+{
+#ifdef HAVE_XF86VMODE
+  saver_preferences *p = &si->prefs;
+  int screen = 0;  /* always screen 0 */
+  int event, error;
+  Bool status;
+
+  if (!XF86VidModeQueryExtension (si->dpy, &event, &error))
+    return;
+  status = XF86VidModeLockModeSwitch (si->dpy, screen, locked_p);
+
+  if (!status)
+    fprintf (stderr, "%s: unable to %s vp switching!\n",
+             blurb(), (locked_p ? "lock" : "unlock"));
+  else if (p->verbose_p)
+    fprintf (stderr, "%s: %s vp switching.\n",
+             blurb(), (locked_p ? "locked" : "unlocked"));
+#endif /* HAVE_XF86VMODE */
+}
+
+
 \f
 /* Interactions
  */
index e29ff9c71fa6745f793f79e61cdd43739933edd0..0d14e262313ea8471661d85632d71f78860c110e 100644 (file)
  * documentation.  No representations are made about the suitability of this
  * software for any purpose.  It is provided "as is" without express or 
  * implied warranty.
+ *
+ * Some PAM resources:
+ *
+ *    PAM home page:
+ *    http://www.us.kernel.org/pub/linux/libs/pam/
+ *
+ *    PAM FAQ:
+ *    http://www.us.kernel.org/pub/linux/libs/pam/FAQ
+ *
+ *    PAM Application Developers' Guide:
+ *    http://www.us.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam_appl.html
+ *
+ *    PAM Mailing list archives:
+ *    http://www.linuxhq.com/lnxlists/linux-pam/
+ *
+ *    Compatibility notes, especially between Linux and Solaris:
+ *    http://www.contrib.andrew.cmu.edu/u/shadow/pam.html
+ *
+ *    The Open Group's PAM API documentation:
+ *    http://www.opengroup.org/onlinepubs/8329799/pam_start.htm
  */
 
 #ifdef HAVE_CONFIG_H
@@ -63,9 +83,23 @@ struct pam_closure {
    /* We handle delays ourself.*/
    /* Don't set this to 0 (Linux bug workaround.) */
 # define PAM_NO_DELAY(pamh) pam_fail_delay ((pamh), 1)
-# else  /* !HAVE_PAM_FAIL_DELAY */
+#else  /* !HAVE_PAM_FAIL_DELAY */
 # define PAM_NO_DELAY(pamh) /* */
-# endif /* !HAVE_PAM_FAIL_DELAY */
+#endif /* !HAVE_PAM_FAIL_DELAY */
+
+
+/* On SunOS 5.6, and on Linux with PAM 0.64, pam_strerror() takes two args.
+   On some other Linux systems with some other version of PAM (e.g.,
+   whichever Debian release comes with a 2.2.5 kernel) it takes one arg.
+   I can't tell which is more "recent" or "correct" behavior, so configure
+   figures out which is in use for us.  Shoot me!
+ */
+#ifdef PAM_STRERROR_TWO_ARGS
+# define PAM_STRERROR(pamh, status) pam_strerror((pamh), (status))
+#else  /* !PAM_STRERROR_TWO_ARGS */
+# define PAM_STRERROR(pamh, status) pam_strerror((status))
+#endif /* !PAM_STRERROR_TWO_ARGS */
+
 
 /* PAM sucks in that there is no way to tell whether a particular service
    is configured at all.  That is, there is no way to tell the difference
@@ -113,6 +147,13 @@ struct pam_closure {
  */
 
 
+/* On SunOS 5.6, the `pam_conv.appdata_ptr' slot seems to be ignored, and
+   the `closure' argument to pc.conv always comes in as random garbage.
+   So we get around this by using a global variable instead.  Shoot me!
+ */
+static void *suns_pam_implementation_blows = 0;
+
+
 /* This can be called at any time, and says whether the typed password
    belongs to either the logged in user (real uid, not effective); or
    to root.
@@ -139,6 +180,10 @@ pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
   pc.conv = &pam_conversation;
   pc.appdata_ptr = (void *) &c;
 
+  /* On SunOS 5.6, the `appdata_ptr' slot seems to be ignored, and the
+     `closure' argument to pc.conv always comes in as random garbage. */
+  suns_pam_implementation_blows = (void *) &c;
+
 
   /* Initialize PAM.
    */
@@ -146,7 +191,7 @@ pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
   if (verbose_p)
     fprintf (stderr, "%s: pam_start (\"%s\", \"%s\", ...) ==> %d (%s)\n",
              blurb(), service, c.user,
-             status, pam_strerror (pamh, status));
+             status, PAM_STRERROR (pamh, status));
   if (status != PAM_SUCCESS) goto DONE;
 
   /* #### We should set PAM_TTY to the display we're using, but we
@@ -159,7 +204,7 @@ pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
     status = pam_set_item (pamh, PAM_TTY, strdup(tty));
     if (verbose_p)
       fprintf (stderr, "%s:   pam_set_item (p, PAM_TTY, \"%s\") ==> %d (%s)\n",
-               blurb(), tty, status, pam_strerror(pamh, status));
+               blurb(), tty, status, PAM_STRERROR(pamh, status));
   }
 
   /* Try to authenticate as the current user.
@@ -168,7 +213,7 @@ pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
   status = pam_authenticate (pamh, 0);
   if (verbose_p)
     fprintf (stderr, "%s:   pam_authenticate (...) ==> %d (%s)\n",
-             blurb(), status, pam_strerror(pamh, status));
+             blurb(), status, PAM_STRERROR(pamh, status));
   if (status == PAM_SUCCESS)  /* Win! */
     goto DONE;
 
@@ -178,14 +223,14 @@ pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
   status = pam_set_item (pamh, PAM_USER, strdup(c.user));
   if (verbose_p)
     fprintf (stderr, "%s:   pam_set_item(p, PAM_USER, \"%s\") ==> %d (%s)\n",
-             blurb(), c.user, status, pam_strerror(pamh, status));
+             blurb(), c.user, status, PAM_STRERROR(pamh, status));
   if (status != PAM_SUCCESS) goto DONE;
 
   PAM_NO_DELAY(pamh);
   status = pam_authenticate (pamh, 0);
   if (verbose_p)
     fprintf (stderr, "%s:   pam_authenticate (...) ==> %d (%s)\n",
-             blurb(), status, pam_strerror(pamh, status));
+             blurb(), status, PAM_STRERROR(pamh, status));
 
  DONE:
   if (user) free (user);
@@ -203,22 +248,60 @@ pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
 
 
 Bool 
-pam_lock_init (int argc, char **argv, Bool verbose_p)
+pam_priv_init (int argc, char **argv, Bool verbose_p)
 {
   /* We have nothing to do at init-time.
      However, we might as well do some error checking.
      If "/etc/pam.d" exists and is a directory, but "/etc/pam.d/xlock"
      does not exist, warn that PAM probably isn't going to work.
+
+     This is a priv-init instead of a non-priv init in case the directory
+     is unreadable or something (don't know if that actually happens.)
    */
-  const char  dir[] = "/etc/pam.d";
-  const char file[] = "/etc/pam.d/" PAM_SERVICE_NAME;
+  const char   dir[] = "/etc/pam.d";
+  const char  file[] = "/etc/pam.d/" PAM_SERVICE_NAME;
+  const char file2[] = "/etc/pam.conf";
   struct stat st;
+
   if (stat (dir, &st) == 0 && st.st_mode & S_IFDIR)
-    if (stat (file, &st) != 0)
+    {
+      if (stat (file, &st) != 0)
+        fprintf (stderr,
+                 "%s: warning: %s does not exist.\n"
+                 "%s: password authentication via PAM is unlikely to work.\n",
+                 blurb(), file, blurb());
+    }
+  else if (stat (file2, &st) == 0)
+    {
+      FILE *f = fopen (file2, "r");
+      if (f)
+        {
+          Bool ok = False;
+          char buf[255];
+          while (fgets (buf, sizeof(buf), f))
+            if (strstr (buf, PAM_SERVICE_NAME))
+              {
+                ok = True;
+                break;
+              }
+          fclose (f);
+          if (!ok)
+            {
+              fprintf (stderr,
+                  "%s: warning: %s does not list the `%s' service.\n"
+                  "%s: password authentication via PAM is unlikely to work.\n",
+                       blurb(), file2, PAM_SERVICE_NAME, blurb());
+            }
+        }
+      /* else warn about file2 existing but being unreadable? */
+    }
+  else
+    {
       fprintf (stderr,
-               "%s: warning: %s does not exist.\n"
+               "%s: warning: neither %s nor %s exist.\n"
                "%s: password authentication via PAM is unlikely to work.\n",
-               blurb(), file, blurb());
+               blurb(), file2, file, blurb());
+    }
 
   /* Return true anyway, just in case. */
   return True;
@@ -249,6 +332,10 @@ pam_conversation (int nmsgs,
   struct pam_response *reply = 0;
   struct pam_closure *c = (struct pam_closure *) closure;
 
+  /* On SunOS 5.6, the `closure' argument always comes in as random garbage. */
+  c = (struct pam_closure *) suns_pam_implementation_blows;
+
+
   reply = (struct pam_response *) calloc (nmsgs, sizeof (*reply));
   if (!reply) return PAM_CONV_ERR;
        
index 5bfaec9ec860fa32cc6b53c7d18b02bac01842af..a2d5e0c8ac301fa600959591bf57a99c071c2dc9 100644 (file)
@@ -195,9 +195,15 @@ get_encrypted_passwd(const char *user)
        *s = 0;
     }
 
+#ifndef HAVE_PAM
+  /* We only issue this warning if not compiled with support for PAM.
+     If we're using PAM, it's not unheard of that normal pwent passwords
+     would be unavailable. */
+
   if (!result)
     fprintf (stderr, "%s: couldn't get password of \"%s\"\n",
             blurb(), (user ? user : "(null)"));
+#endif /* !HAVE_PAM */
 
   return result;
 }
index 1847d1be1f7cddce077ccc22ffdfc35c0787a96c..b55334c936aad2c53157de05298cfece5c0feeee 100644 (file)
@@ -51,7 +51,7 @@ extern Bool kerberos_lock_init (int argc, char **argv, Bool verbose_p);
 extern Bool kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
 #endif
 #ifdef HAVE_PAM
-extern Bool pam_lock_init (int argc, char **argv, Bool verbose_p);
+extern Bool pam_priv_init (int argc, char **argv, Bool verbose_p);
 extern Bool pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
 #endif
 extern Bool pwent_lock_init (int argc, char **argv, Bool verbose_p);
@@ -70,7 +70,7 @@ struct auth_methods methods[] = {
                         False, False },
 # endif
 # ifdef HAVE_PAM
-  { "PAM",              pam_lock_init, 0, pam_passwd_valid_p, 
+  { "PAM",              0, pam_priv_init, pam_passwd_valid_p, 
                         False, False },
 # endif
   { "normal",           pwent_lock_init, pwent_priv_init, pwent_passwd_valid_p,
@@ -111,7 +111,11 @@ lock_init (int argc, char **argv, Bool verbose_p)
       if (!methods[i].priv_initted_p)  /* Bail if lock_priv_init failed. */
         continue;
 
-      methods[i].initted_p = methods[i].init (argc, argv, verbose_p);
+      if (!methods[i].init)
+        methods[i].initted_p = True;
+      else
+        methods[i].initted_p = methods[i].init (argc, argv, verbose_p);
+
       if (methods[i].initted_p)
         any_ok = True;
       else if (verbose_p)
@@ -136,7 +140,7 @@ passwd_valid_p (const char *typed_passwd, Bool verbose_p)
              an earlier authentication method fails and a later one succeeds,
              something screwy is probably going on.)
            */
-          if (verbose_p)
+          if (verbose_p && i > 0)
             {
               for (j = 0; j < i; j++)
                 if (methods[j].initted_p)
index e191314292ad6aaa599d17099f4082b74b8992f5..cdf957961696a919868ac0184582054114d1e430 100644 (file)
@@ -808,15 +808,7 @@ load_init_file (saver_preferences *p)
     p->fade_p = False;
   if (! p->fade_p) p->unfade_p = False;
 
-  if (p->verbose_p && !p->fading_possible_p && (p->fade_p || p->unfade_p))
-    {
-      fprintf (stderr, "%s: there are no PseudoColor or GrayScale visuals.\n",
-              blurb());
-      fprintf (stderr, "%s: ignoring the request for fading/unfading.\n",
-              blurb());
-    }
-
-  p->watchdog_timeout = p->cycle;
+  p->watchdog_timeout = p->cycle * 0.6;
   if (p->watchdog_timeout < 30000) p->watchdog_timeout = 30000;          /* 30 secs */
   if (p->watchdog_timeout > 3600000) p->watchdog_timeout = 3600000; /*  1 hr */
 
index 55ffef35ffa9b1577819c4944b3ed54837e81319..62c768d9bd4ad14ed3f66d2ce76407c2424837b8 100644 (file)
@@ -40,12 +40,6 @@ struct saver_preferences {
   Bool unfade_p;               /* whether to fade from black, if possible */
   int fade_seconds;            /* how long that should take */
   int fade_ticks;              /* how many ticks should be used */
-  Bool fading_possible_p;      /* Whether fading to/from black is possible.
-                                  (This isn't strictly a preference, as it
-                                  can only be known by querying the display;
-                                  the caller of the prefs code may fill this
-                                  in if it knows/cares, and warnings will be
-                                  issued.) */
 
   Bool install_cmap_p;         /* whether we should use our own colormap
                                   when using the screen's default visual. */
index 1323565b775f0151508ababc37cc1351668ccb13..83ad494e364edacfcb998ba30f578d1b62a7785b 100644 (file)
@@ -14,8 +14,6 @@
 # include "config.h"
 #endif
 
-#ifndef NO_SETUID /* whole file */
-
 #include <X11/Xlib.h>          /* not used for much... */
 
 /* This file doesn't need the Xt headers, so stub these types out... */
@@ -35,7 +33,6 @@
 #include <pwd.h>               /* for getpwnam() and struct passwd */
 #include <grp.h>               /* for getgrgid() and struct group */
 
-
 static const char *
 uid_gid_string (uid_t uid, gid_t gid)
 {
@@ -310,10 +307,3 @@ hack_uid (saver_info *si)
       }
   }
 }
-
-#else  /* !NO_SETUID */
-
-void hack_uid (saver_info *si) { }
-void describe_uids (saver_info *si, FILE *out) { }
-
-#endif /* NO_SETUID */
index 8f6fb011249ad9fd72dee71aeaf4b896ac051cd9..fabd8824d0a15828d9d1f82acf8d19bafdc548be 100644 (file)
@@ -343,13 +343,13 @@ make_splash_dialog (saver_info *si)
   attrs.event_mask = (ExposureMask | ButtonPressMask | ButtonReleaseMask);
 
   {
-    Dimension w = WidthOfScreen(screen);
-    Dimension h = HeightOfScreen(screen);
+    int sx, sy, w, h;
+    get_screen_viewport (si->default_screen, &sx, &sy, &w, &h, False);
     if (si->prefs.debug_p) w /= 2;
-    x = ((w + sp->width) / 2) - sp->width;
-    y = ((h + sp->height) / 2) - sp->height;
-    if (x < 0) x = 0;
-    if (y < 0) y = 0;
+    x = sx + (((w + sp->width)  / 2) - sp->width);
+    y = sy + (((h + sp->height) / 2) - sp->height);
+    if (x < sx) x = sx;
+    if (y < sy) y = sy;
   }
 
   bw = get_integer_resource ("splash.borderWidth", "Dialog.BorderWidth");
index 4258f874c5328319df5d886f934dc4d65d58b249..fafb1e5851906fc2538a4aa0f4b72773f47e39f6 100644 (file)
@@ -163,15 +163,17 @@ print_stderr_1 (saver_screen_info *ssi, char *string)
              ssi->stderr_text_y = 0;
 #else
              int offset = ssi->stderr_line_height * 5;
+              XWindowAttributes xgwa;
+              XGetWindowAttributes (dpy, window, &xgwa);
+
              XCopyArea (dpy, window, window, ssi->stderr_gc,
                         0, v_border + offset,
-                        WidthOfScreen (screen),
-                        (HeightOfScreen (screen) - v_border - v_border
-                         - offset),
+                        xgwa.width,
+                        (xgwa.height - v_border - v_border - offset),
                         0, v_border);
              XClearArea (dpy, window,
-                         0, HeightOfScreen (screen) - v_border - offset,
-                         WidthOfScreen (screen), offset, False);
+                         0, xgwa.height - v_border - offset,
+                         xgwa.width, offset, False);
              ssi->stderr_text_y -= offset;
 #endif
            }
@@ -202,7 +204,9 @@ make_stderr_overlay_window (saver_screen_info *ssi)
     {
       int depth = visual_depth (ssi->screen, visual);
       XSetWindowAttributes attrs;
+      XWindowAttributes xgwa;
       unsigned long attrmask;
+      XGetWindowAttributes (si->dpy, ssi->screensaver_window, &xgwa);
 
       if (si->prefs.debug_p)
        fprintf(real_stderr,
@@ -224,7 +228,7 @@ make_stderr_overlay_window (saver_screen_info *ssi)
 
       ssi->stderr_overlay_window =
        XCreateWindow(si->dpy, ssi->screensaver_window, 0, 0,
-                     WidthOfScreen(ssi->screen), HeightOfScreen(ssi->screen),
+                     xgwa.width, xgwa.height,
                      0, depth, InputOutput, visual, attrmask, &attrs);
       XMapRaised(si->dpy, ssi->stderr_overlay_window);
     }
index 8b6187d9a1b6732cfb17ee13c895e3c570df625c..53dd884e9e56d81e944818fe79ecfd3975db545e 100644 (file)
@@ -248,6 +248,17 @@ exec_screenhack (saver_info *si, const char *command)
   Bool hairy_p = !!strpbrk (command, "*?$&!<>[];`'\\\"=");
   /* note: = is in the above because of the sh syntax "FOO=bar cmd". */
 
+  if (getuid() == (uid_t) 0 || geteuid() == (uid_t) 0)
+    {
+      /* If you're thinking of commenting this out, think again.
+         If you do so, you will open a security hole.  Mail jwz
+         so that he may enlighten you as to the error of your ways.
+       */
+      fprintf (stderr, "%s: we're still running as root!  Disaster!\n",
+               blurb());
+      saver_exit (si, 1, 0);
+    }
+
   if (p->verbose_p)
     fprintf (stderr, "%s: spawning \"%s\" in pid %lu%s.\n",
             blurb(), command, (unsigned long) getpid (),
index 9d35812279f62de2f59c448997589be7fde85a40..dfb7da25c22f55977d1b956b10477c0b2bee575e 100644 (file)
@@ -22,6 +22,8 @@
 
 #include <stdio.h>
 #include <ctype.h>
+#include <pwd.h>
+
 #include <X11/Xlib.h>
 #include <X11/Xatom.h>
 #include <X11/Intrinsic.h>
@@ -44,11 +46,11 @@ void monitor_power_on (saver_info *si) {}
 Bool monitor_powered_on_p (saver_info *si) { return True; }
 void initialize_screensaver_window (saver_info *si) {}
 void raise_window (saver_info *si, Bool i, Bool b, Bool d) {}
-void blank_screen (saver_info *si) {}
+Bool blank_screen (saver_info *si) {return False;}
 void unblank_screen (saver_info *si) {}
 Bool select_visual (saver_screen_info *ssi, const char *v) { return False; }
 Bool window_exists_p (Display *dpy, Window window) {return True;}
-void start_notice_events_timer (saver_info *si, Window w, Bool) {}
+void start_notice_events_timer (saver_info *si, Window w, Bool b) {}
 Bool handle_clientmessage (saver_info *si, XEvent *e, Bool u) { return False; }
 int BadWindow_ehandler (Display *dpy, XErrorEvent *error) { exit(1); }
 const char *signal_name(int signal) { return "???"; }
@@ -58,6 +60,18 @@ void saver_exit (saver_info *si, int status, const char *core) { exit(status);}
 const char *blurb(void) { return progname; }
 Atom XA_SCREENSAVER, XA_DEMO, XA_PREFS;
 
+void
+get_screen_viewport (saver_screen_info *ssi,
+                     int *x_ret, int *y_ret,
+                     int *w_ret, int *h_ret,
+                     Bool verbose_p)
+{
+  *x_ret = 0;
+  *y_ret = 0;
+  *w_ret = WidthOfScreen (ssi->screen);
+  *h_ret = HeightOfScreen (ssi->screen);
+}
+
 
 void
 idle_timer (XtPointer closure, XtIntervalId *id)
@@ -79,7 +93,7 @@ static char *fallback[] = {
 int
 main (int argc, char **argv)
 {
-  Widget toplevel_shell;
+  Widget toplevel_shell = 0;
   saver_screen_info ssip;
   saver_info sip;
   saver_info *si = &sip;
@@ -99,22 +113,25 @@ main (int argc, char **argv)
   si->version = (char *) malloc (5);
   memcpy (si->version, screensaver_id + 17, 4);
   progname = argv[0];
-
-# ifdef SCO
-  set_auth_parameters(argc, argv);
-# endif /* SCO */
+  {
+    char *s = strrchr(progname, '/');
+    if (*s) strcpy (progname, s+1);
+  }
 
   /* before hack_uid() for proper permissions */
-  if (! lock_init (argc, argv, True))
+  lock_priv_init (argc, argv, True);
+
+  hack_uid (si);
+
+  if (! lock_init (argc, argv, si->prefs.verbose_p))
     {
       si->locking_disabled_p = True;
       si->nolock_reason = "error getting password";
     }
 
-  hack_uid (si);
-
   progclass = "XScreenSaver";
 
+#if (WHICH != 2)
   toplevel_shell = XtAppInitialize (&si->app, progclass, 0, 0,
                                    &argc, argv, fallback,
                                    0, 0);
@@ -137,6 +154,10 @@ main (int argc, char **argv)
 
   load_init_file (&si->prefs);
 
+#endif /* (WHICH != 2) */
+
+  p->verbose_p = True;
+
   while (1)
     {
 #if WHICH == 0
@@ -163,6 +184,24 @@ main (int argc, char **argv)
        XSync (si->dpy, False);
        sleep (1);
       }
+#elif WHICH == 2
+      {
+        char *pass;
+        char buf[255];
+        struct passwd *p = getpwuid (getuid ());
+        printf ("\n%s: %s's password: ", progname, p->pw_name);
+
+        pass = fgets (buf, sizeof(buf)-1, stdin);
+        if (!pass || !*pass)
+          exit (0);
+        if (pass[strlen(pass)-1] == '\n')
+          pass[strlen(pass)-1] = 0;
+
+        if (passwd_valid_p (pass, True))
+          printf ("%s: Ok!\n", progname);
+        else
+          printf ("%s: Wrong!\n", progname);
+      }
 #endif
     }
 }
index 5f1bd418fc3b82ec53c6925d71a73181a6b971f4..ef5d54331707332d30f1da63947d640ae3ddffa4 100644 (file)
@@ -54,6 +54,8 @@
 static Bool proc_interrupts_activity_p (saver_info *si);
 #endif /* HAVE_PROC_INTERRUPTS */
 
+static void check_for_clock_skew (saver_info *si);
+
 
 void
 idle_timer (XtPointer closure, XtIntervalId *id)
@@ -213,6 +215,16 @@ cycle_timer (XtPointer closure, XtIntervalId *id)
   saver_info *si = (saver_info *) closure;
   saver_preferences *p = &si->prefs;
   Time how_long = p->cycle;
+
+  if (si->selection_mode > 0 &&
+      screenhack_running_p (si))
+    /* If we're in "SELECT n" mode, the cycle timer going off will just
+       restart this same hack again.  There's not much point in doing this
+       every 5 or 10 minutes, but on the other hand, leaving one hack running
+       for days is probably not a great idea, since they tend to leak and/or
+       crash.  So, restart the thing once an hour. */
+    how_long = 1000 * 60 * 60;
+
   if (si->dbox_up_p)
     {
       if (p->verbose_p)
@@ -226,8 +238,18 @@ cycle_timer (XtPointer closure, XtIntervalId *id)
       if (p->verbose_p)
        fprintf (stderr, "%s: changing graphics hacks.\n", blurb());
       kill_screenhack (si);
-      spawn_screenhack (si, False);
+
+      if (!si->throttled_p)
+        spawn_screenhack (si, False);
+      else
+        {
+          raise_window (si, True, True, False);
+          if (p->verbose_p)
+            fprintf (stderr, "%s: not launching new hack (throttled.)\n",
+                     blurb());
+        }
     }
+
   si->cycle_id = XtAppAddTimeOut (si->app, how_long, cycle_timer,
                                  (XtPointer) si);
 
@@ -246,7 +268,7 @@ activate_lock_timer (XtPointer closure, XtIntervalId *id)
   saver_preferences *p = &si->prefs;
 
   if (p->verbose_p)
-    fprintf (stderr, "%s: timed out; activating lock\n", blurb());
+    fprintf (stderr, "%s: timed out; activating lock.\n", blurb());
   si->locked_p = True;
 
 #ifdef HAVE_XHPDISABLERESET
@@ -362,11 +384,61 @@ check_pointer_timer (XtPointer closure, XtIntervalId *id)
     }
 #endif /* HAVE_PROC_INTERRUPTS */
 
+
   if (active_p)
     reset_timers (si);
+
+  check_for_clock_skew (si);
+}
+
+
+/* An unfortunate situation is this: the saver is not active, because the
+   user has been typing.  The machine is a laptop.  The user closes the lid
+   and suspends it.  The CPU halts.  Some hours later, the user opens the
+   lid.  At this point, Xt's timers will fire, and xscreensaver will blank
+   the screen.
+
+   So far so good -- well, not really, but it's the best that we can do,
+   since the OS doesn't send us a signal *before* shutdown -- but if the
+   user had delayed locking (lockTimeout > 0) then we should start off
+   in the locked state, rather than only locking N minutes from when the
+   lid was opened.  Also, eschewing fading is probably a good idea, to
+   clamp down as soon as possible.
+
+   We only do this when we'd be polling the mouse position anyway.
+   This amounts to an assumption that machines with APM support also
+   have /proc/interrupts.
+ */
+static void
+check_for_clock_skew (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  time_t now = time ((time_t *) 0);
+  long shift = now - si->last_wall_clock_time;
+
+#ifdef DEBUG_TIMERS
+  if (p->verbose_p)
+    fprintf (stderr, "%s: checking wall clock (%d).\n", blurb(),
+             (si->last_wall_clock_time == 0 ? 0 : shift));
+#endif /* DEBUG_TIMERS */
+
+  if (si->last_wall_clock_time != 0 &&
+      shift > (p->timeout / 1000))
+    {
+      if (p->verbose_p)
+        fprintf (stderr, "%s: wall clock has jumped by %d:%02d:%02d!\n",
+                 blurb(),
+                 (shift / (60 * 60)), ((shift / 60) % 60), (shift % 60));
+
+      si->emergency_lock_p = True;
+      idle_timer ((XtPointer) si, 0);
+    }
+
+  si->last_wall_clock_time = now;
 }
 
 
+
 static void
 dispatch_event (saver_info *si, XEvent *event)
 {
@@ -512,6 +584,12 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
                 /* Look, we've been idle long enough.  We're done. */
                 goto DONE;
               }
+            else if (si->emergency_lock_p)
+              {
+                /* Oops, the wall clock has jumped far into the future, so
+                   we need to lock down in a hurry! */
+                goto DONE;
+              }
             else
               {
                 /* The event went off, but it turns out that the user has not
@@ -774,11 +852,11 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
 
    Thanks to Nat Friedman <nat@nat.org> for figuring out all of this crap.
 
-   Note that this only checks for lines with "keyboard" in them.  Perhaps we
-   should also be checking for lines with "PS/2 Mouse" in them.  But that
-   would obviously fail to work for regular serial mice, and obviously just
-   using COM1 would be bad news (turn off the screensaver because the modem
-   is active, yum.)
+   Note that this only checks for lines with "keyboard" or "PS/2 Mouse" in
+   them.  If you have a serial mouse, it won't detect that, it will only detect
+   keyboard activity.  That's because there's no way to tell the difference
+   between a serial mouse and a general serial port, and it would be somewhat
+   unfortunate to have the screensaver turn off when the modem on COM1 burped.
  */
 
 
@@ -816,8 +894,11 @@ proc_interrupts_activity_p (saver_info *si)
   static FILE *f0 = 0;
   FILE *f1 = 0;
   int fd;
-  static char last_line[255] = { 0, };
-  char new_line[sizeof(last_line)];
+  static char last_kbd_line[255] = { 0, };
+  static char last_ptr_line[255] = { 0, };
+  char new_line[sizeof(last_kbd_line)];
+  Bool got_kbd = False, kbd_diff = False;
+  Bool got_ptr = False, ptr_diff = False;
 
   if (!f0)
     {
@@ -867,17 +948,35 @@ proc_interrupts_activity_p (saver_info *si)
   /* Now read through the pseudo-file until we find the "keyboard" line. */
 
   while (fgets (new_line, sizeof(new_line)-1, f1))
-    if (strstr (new_line, "keyboard"))
-      {
-        Bool diff = (*last_line &&
-                     !!strcmp (new_line, last_line));
-        strcpy (last_line, new_line);  /* save this line for next time */
-        fclose (f1);
-        return diff;
-      }
+    {
+      if (!got_kbd && strstr (new_line, "keyboard"))
+        {
+          kbd_diff = (*last_kbd_line && !!strcmp (new_line, last_kbd_line));
+          strcpy (last_kbd_line, new_line);
+          got_kbd = True;
+        }
+      else if (!got_ptr && strstr (new_line, "PS/2 Mouse"))
+        {
+          ptr_diff = (*last_ptr_line && !!strcmp (new_line, last_ptr_line));
+          strcpy (last_ptr_line, new_line);
+          got_ptr = True;
+        }
+
+      if (got_kbd && got_ptr)
+        break;
+    }
+
+  if (got_kbd || got_ptr)
+    {
+      fclose (f1);
+      return (kbd_diff || ptr_diff);
+    }
 
-  /* If we got here, we didn't find a "keyboard" line in the file at all. */
-  fprintf (stderr, "%s: no keyboard data in %s?\n", blurb(), PROC_INTERRUPTS);
+
+  /* If we got here, we didn't find either a "keyboard" or a "PS/2 Mouse"
+     line in the file at all. */
+  fprintf (stderr, "%s: no keyboard or mouse data in %s?\n",
+           blurb(), PROC_INTERRUPTS);
 
  FAIL:
   if (f1)
@@ -920,15 +1019,26 @@ watchdog_timer (XtPointer closure, XtIntervalId *id)
 
   if (si->screen_blanked_p)
     {
-      Bool running_p = screenhack_running_p(si);
+      Bool running_p = screenhack_running_p (si);
 
+      if (si->dbox_up_p)
+        {
 #ifdef DEBUG_TIMERS
-      if (si->prefs.verbose_p)
-       fprintf (stderr, "%s: watchdog timer raising %sscreen.\n",
-                blurb(), (running_p ? "" : "and clearing "));
+          if (si->prefs.verbose_p)
+            fprintf (stderr, "%s: dialog box is up: not raising screen.\n",
+                     blurb());
+#endif /* DEBUG_TIMERS */
+        }
+      else
+        {
+#ifdef DEBUG_TIMERS
+          if (si->prefs.verbose_p)
+            fprintf (stderr, "%s: watchdog timer raising %sscreen.\n",
+                     blurb(), (running_p ? "" : "and clearing "));
 #endif /* DEBUG_TIMERS */
 
-      raise_window (si, True, True, running_p);
+          raise_window (si, True, True, running_p);
+        }
 
       if (!monitor_powered_on_p (si))
        {
@@ -938,6 +1048,12 @@ watchdog_timer (XtPointer closure, XtIntervalId *id)
                     "killing running hacks.\n", blurb());
          kill_screenhack (si);
        }
+
+      /* Re-schedule this timer.  The watchdog timer defaults to a bit less
+         than the hack cycle period, but is never longer than one hour.
+       */
+      si->watchdog_id = 0;
+      reset_watchdog_timer (si, True);
     }
 }
 
index 4945202a1f228690bb8b4abe2e6b0f6ffe0659bb..a61788ba3510df0ebd07680a5b0c8afda8fe4180 100644 (file)
@@ -41,6 +41,9 @@
 # include <X11/extensions/scrnsaver.h>
 #endif /* HAVE_MIT_SAVER_EXTENSION */
 
+#ifdef HAVE_XF86VMODE
+# include <X11/extensions/xf86vmode.h>
+#endif /* HAVE_XF86VMODE */
 
 #ifdef HAVE_XHPDISABLERESET
 # include <X11/XHPlib.h>
@@ -136,7 +139,7 @@ grab_mouse (saver_info *si, Window w, Cursor cursor)
 {
   saver_preferences *p = &si->prefs;
   int status = XGrabPointer (si->dpy, w, True, ALL_POINTER_EVENTS,
-                            GrabModeAsync, GrabModeAsync, None,
+                            GrabModeAsync, GrabModeAsync, w,
                             cursor, CurrentTime);
   if (status == GrabSuccess)
     si->mouse_grab_window = w;
@@ -210,6 +213,50 @@ ungrab_keyboard_and_mouse (saver_info *si)
 }
 
 
+int
+move_mouse_grab (saver_info *si, Window to, Cursor cursor)
+{
+  Window old = si->mouse_grab_window;
+
+  if (old == 0)
+    return grab_mouse (si, to, cursor);
+  else
+    {
+      saver_preferences *p = &si->prefs;
+      int status;
+
+      XSync (si->dpy, False);
+      XGrabServer (si->dpy);                   /* ############ DANGER! */
+      XSync (si->dpy, False);
+
+      if (p->verbose_p)
+        fprintf(stderr, "%s: grabbing server...\n", blurb());
+
+      ungrab_mouse (si);
+      status = grab_mouse (si, to, cursor);
+
+      if (status != GrabSuccess)   /* Augh! */
+        {
+          sleep (1);               /* Note dramatic evil of sleeping
+                                      with server grabbed. */
+          XSync (si->dpy, False);
+          status = grab_mouse (si, to, cursor);
+        }
+
+      if (status != GrabSuccess)   /* Augh!  Try to get the old one back... */
+        grab_mouse (si, to, cursor);
+
+      XUngrabServer (si->dpy);
+      XSync (si->dpy, False);                  /* ###### (danger over) */
+
+      if (p->verbose_p)
+        fprintf(stderr, "%s: ungrabbing server.\n", blurb());
+
+      return status;
+    }
+}
+
+
 /* Prints an error message to stderr and returns True if there is another
    xscreensaver running already.  Silently returns False otherwise. */
 Bool
@@ -757,6 +804,106 @@ store_saver_id (saver_screen_info *ssi)
 }
 
 
+/* Returns the area of the screen which the xscreensaver window should cover.
+   Normally this is the whole screen, but if the X server's root window is
+   actually larger than the monitor's displayable area, then we want to
+   operate in the currently-visible portion of the desktop instead.
+ */
+void
+get_screen_viewport (saver_screen_info *ssi,
+                     int *x_ret, int *y_ret,
+                     int *w_ret, int *h_ret,
+                     Bool verbose_p)
+{
+  int w = WidthOfScreen (ssi->screen);
+  int h = HeightOfScreen (ssi->screen);
+
+#ifdef HAVE_XF86VMODE
+  saver_info *si = ssi->global;
+  int screen_no = screen_number (ssi->screen);
+  int event, error;
+  int dot;
+  XF86VidModeModeLine ml;
+  int x, y;
+
+  if (XF86VidModeQueryExtension (si->dpy, &event, &error) &&
+      XF86VidModeGetModeLine (si->dpy, screen_no, &dot, &ml) &&
+      XF86VidModeGetViewPort (si->dpy, screen_no, &x, &y))
+    {
+      char msg[512];
+      *x_ret = x;
+      *y_ret = y;
+      *w_ret = ml.hdisplay;
+      *h_ret = ml.vdisplay;
+
+      if (*x_ret == 0 && *y_ret == 0 && *w_ret == w && *h_ret == h)
+        /* There is no viewport -- the screen does not scroll. */
+        return;
+
+      sprintf (msg, "%s: vp is %dx%d+%d+%d",
+               blurb(), *w_ret, *h_ret, *x_ret, *y_ret);
+
+
+      /* Apparently, though the server stores the X position in increments of
+         1 pixel, it will only make changes to the *display* in some other
+         increment.  With XF86_SVGA on a Thinkpad, the display only updates
+         in multiples of 8 pixels when in 8-bit mode, and in multiples of 4
+         pixels in 16-bit mode.  I don't know what it does in 24- and 32-bit
+         mode, because I don't have enough video memory to find out.
+
+         I consider it a bug that XF86VidModeGetViewPort() is telling me the
+         server's *target* scroll position rather than the server's *actual*
+         scroll position.  David Dawes agrees, and says they may fix this in
+         XFree86 4.0, but it's notrivial.
+
+         He also confirms that this behavior is server-dependent, so the
+         actual scroll position cannot be reliably determined by the client.
+         So... that means the only solution is to provide a ``sandbox''
+         around the blackout window -- we make the window be up to N pixels
+         larger than the viewport on both the left and right sides.  That
+         means some part of the outer edges of each hack might not be
+         visible, but screw it.
+
+         I'm going to guess that 16 pixels is enough, and that the Y dimension
+         doesn't have this problem.
+
+         The drawback of doing this, of course, is that some of the screenhacks
+         will still look pretty stupid -- for example, "slidescreen" will cut
+         off the left and right edges of the grid, etc.
+      */
+# define FUDGE 16
+      if (x > 0 && x < w - ml.hdisplay)  /* not at left edge or right edge */
+        {
+          /* Round X position down to next lower multiple of FUDGE.
+             Increase width by 2*FUDGE in case some server rounds up.
+           */
+          *x_ret = ((x - 1) / FUDGE) * FUDGE;
+          *w_ret += (FUDGE * 2);
+        }
+# undef FUDGE
+
+      if (*x_ret != x ||
+          *y_ret != y ||
+          *w_ret != ml.hdisplay ||
+          *h_ret != ml.vdisplay)
+        sprintf (msg + strlen(msg), "; fudged to %dx%d+%d+%d",
+                 *w_ret, *h_ret, *x_ret, *y_ret);
+
+      if (verbose_p)
+        fprintf (stderr, "%s.\n", msg);
+
+      return;
+    }
+
+#endif /* HAVE_XF86VMODE */
+
+  *x_ret = 0;
+  *y_ret = 0;
+  *w_ret = w;
+  *h_ret = h;
+}
+
+
 static void
 initialize_screensaver_window_1 (saver_screen_info *ssi)
 {
@@ -772,10 +919,12 @@ initialize_screensaver_window_1 (saver_screen_info *ssi)
   XColor black;
   XSetWindowAttributes attrs;
   unsigned long attrmask;
-  int width = WidthOfScreen (ssi->screen);
-  int height = HeightOfScreen (ssi->screen);
+  int x, y, width, height;
   static Bool printed_visual_info = False;  /* only print the message once. */
 
+  get_screen_viewport (si->default_screen, &x, &y, &width, &height,
+                       (p->verbose_p && !si->screen_blanked_p));
+
   black.red = black.green = black.blue = 0;
 
   if (ssi->cmap == DefaultColormapOfScreen (ssi->screen))
@@ -905,8 +1054,8 @@ initialize_screensaver_window_1 (saver_screen_info *ssi)
     {
       XWindowChanges changes;
       unsigned int changesmask = CWX|CWY|CWWidth|CWHeight|CWBorderWidth;
-      changes.x = 0;
-      changes.y = 0;
+      changes.x = x;
+      changes.y = y;
       changes.width = width;
       changes.height = height;
       changes.border_width = 0;
@@ -919,9 +1068,11 @@ initialize_screensaver_window_1 (saver_screen_info *ssi)
   else
     {
       ssi->screensaver_window =
-       XCreateWindow (si->dpy, RootWindowOfScreen (ssi->screen), 0, 0,
-                      width, height, 0, ssi->current_depth, InputOutput,
+       XCreateWindow (si->dpy, RootWindowOfScreen (ssi->screen),
+                       x, y, width, height,
+                       0, ssi->current_depth, InputOutput,
                       ssi->current_visual, attrmask, &attrs);
+
       reset_stderr (ssi);
       store_activate_time(si, True);
       if (p->verbose_p)
@@ -972,10 +1123,15 @@ raise_window (saver_info *si,
   if (si->demoing_p)
     inhibit_fade = True;
 
-  initialize_screensaver_window (si);
+  if (si->emergency_lock_p)
+    inhibit_fade = True;
+
+  if (!dont_clear)
+    initialize_screensaver_window (si);
+
   reset_watchdog_timer (si, True);
 
-  if (p->fade_p && p->fading_possible_p && !inhibit_fade)
+  if (p->fade_p && si->fading_possible_p && !inhibit_fade)
     {
       Window *current_windows = (Window *)
        calloc(sizeof(Window), si->nscreens);
@@ -1098,6 +1254,17 @@ blank_screen (saver_info *si)
       store_vroot_property (si->dpy,
                            ssi->screensaver_window,
                            ssi->screensaver_window);
+
+#ifdef HAVE_XF86VMODE
+      {
+        int ev, er;
+        if (!XF86VidModeQueryExtension (si->dpy, &ev, &er) ||
+            !XF86VidModeGetViewPort (si->dpy, i,
+                                     &ssi->blank_vp_x,
+                                     &ssi->blank_vp_y))
+          ssi->blank_vp_x = ssi->blank_vp_y = -1;
+      }
+#endif /* HAVE_XF86VMODE */
     }
   store_activate_time (si, si->screen_blanked_p);
   raise_window (si, False, False, False);
@@ -1116,6 +1283,7 @@ blank_screen (saver_info *si)
 #endif
 
   si->screen_blanked_p = True;
+  si->last_wall_clock_time = 0;
 
   return True;
 }
@@ -1124,7 +1292,7 @@ void
 unblank_screen (saver_info *si)
 {
   saver_preferences *p = &si->prefs;
-  Bool unfade_p = (p->fading_possible_p && p->unfade_p);
+  Bool unfade_p = (si->fading_possible_p && p->unfade_p);
   int i;
 
   monitor_power_on (si);
@@ -1248,6 +1416,7 @@ unblank_screen (saver_info *si)
     XUnmapWindow (si->dpy, si->screens[i].screensaver_window);
 
   si->screen_blanked_p = False;
+  si->last_wall_clock_time = 0;
 }
 
 
@@ -1278,7 +1447,7 @@ select_visual (saver_screen_info *ssi, const char *visual_name)
   saver_preferences *p = &si->prefs;
   Bool install_cmap_p = p->install_cmap_p;
   Bool was_installed_p = (ssi->cmap != DefaultColormapOfScreen(ssi->screen));
-  Visual *new_v;
+  Visual *new_v = 0;
   Bool got_it;
 
   if (visual_name && *visual_name)
@@ -1293,7 +1462,18 @@ select_visual (saver_screen_info *ssi, const char *visual_name)
          visual_name = "default";
          install_cmap_p = False;
        }
-      new_v = get_visual (ssi->screen, visual_name, True, False);
+#ifdef DAEMON_USE_GL
+      else if (!strcmp(visual_name, "gl") ||
+               !strcmp(visual_name, "GL"))
+        {
+          new_v = get_gl_visual (ssi->screen);
+          if (!new_v && p->verbose_p)
+            fprintf (stderr, "%s: no GL visuals.\n", progname);
+        }
+#endif /* DAEMON_USE_GL */
+
+      if (!new_v)
+        new_v = get_visual (ssi->screen, visual_name, True, False);
     }
   else
     {
index 7c745831974c6b96917d5644879a55488b6c423f..cc169d2792d3ea6384b2b8e1cf5a4cd6d77dad14 100644 (file)
@@ -44,7 +44,7 @@ Atom XA_VROOT;
 Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE;
 Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_TIME, XA_SELECT, XA_DEMO;
 static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV, XA_EXIT;
-static Atom XA_RESTART, XA_PREFS, XA_LOCK;
+static Atom XA_RESTART, XA_PREFS, XA_LOCK, XA_THROTTLE, XA_UNTHROTTLE;
 
 static char *screensaver_version;
 static char *usage = "\n\
@@ -101,7 +101,16 @@ usage: %s -<option>\n\
 \n\
   -lock         Tells the running xscreensaver process to lock the screen\n\
                 immediately.  This is like -activate, but forces locking as\n\
-                well, even if locking is not the default.\n\
+                well, even if locking is not the default.  If the saver is\n\
+                already active, this causes it to be locked as well.\n\
+\n\
+  -throttle     Temporarily switch to ``blank screen'' mode, and don't run\n\
+                any display modes at all, until the screensaver is next\n\
+                de-activated.  This is useful if you're using a machine\n\
+                remotely, and you find that some display modes are using too\n\
+                much CPU.\n\
+\n\
+  -unthrottle   Turn `-throttle' off and resume normal behavior.\n\
 \n\
   -version      Prints the version of xscreensaver that is currently running\n\
                 on the display -- that is, the actual version number of the\n\
@@ -156,6 +165,8 @@ main (int argc, char **argv)
       else if (!strncmp (s, "-preferences",L)) cmd = &XA_PREFS;
       else if (!strncmp (s, "-prefs",L))       cmd = &XA_PREFS;
       else if (!strncmp (s, "-lock", L))       cmd = &XA_LOCK;
+      else if (!strncmp (s, "-throttle", L))   cmd = &XA_THROTTLE;
+      else if (!strncmp (s, "-unthrottle", L)) cmd = &XA_UNTHROTTLE;
       else if (!strncmp (s, "-version", L))    cmd = &XA_SCREENSAVER_VERSION;
       else if (!strncmp (s, "-time", L))       cmd = &XA_SCREENSAVER_TIME;
       else USAGE ();
@@ -256,6 +267,8 @@ main (int argc, char **argv)
   XA_DEMO = XInternAtom (dpy, "DEMO", False);
   XA_PREFS = XInternAtom (dpy, "PREFS", False);
   XA_LOCK = XInternAtom (dpy, "LOCK", False);
+  XA_THROTTLE = XInternAtom (dpy, "THROTTLE", False);
+  XA_UNTHROTTLE = XInternAtom (dpy, "UNTHROTTLE", False);
 
   XSync (dpy, 0);
 
index 88d09d29297620c6cb15c1bb427d8f8f538476ff..a7b2ee58c7613ae84c3fea6b77bc8b69da895864 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "27-Apr-99 (3.10)" "X Version 11"
+.TH XScreenSaver 1 "10-May-99 (3.12)" "X Version 11"
 .SH NAME
 xscreensaver-command - control a running xscreensaver process
 .SH SYNOPSIS
@@ -28,6 +28,8 @@ xscreensaver-command - control a running xscreensaver process
 [\-exit] \
 [\-restart] \
 [\-lock] \
+[\-throttle] \
+[\-unthrottle] \
 [\-version] \
 [\-time]
 .SH DESCRIPTION
@@ -133,6 +135,21 @@ running as you.  See
 .BR xscreensaver (1)
 for details.
 .TP 8
+.B \-throttle
+Temporarily switch to ``blank screen'' mode, and don't run any display modes
+at all, until the screensaver is next de-activated.  This is useful if you're
+using a machine remotely, and you find that some display modes are using too
+much CPU.  
+
+(If you want to do this \fIpermanently\fP, that is, you want the screen saver
+to only blank the screen and not run demos at all, then set the \fIprograms\fP
+resource to an empty list:  See
+.BR xscreensaver (1)
+for details.)
+.TP 8
+.B \-unthrottle
+Turn `-throttle' mode off and resume normal behavior.
+.TP 8
 .B \-version
 Prints the version of xscreensaver that is currently running on the display:
 that is, the actual version number of the running xscreensaver background 
index 01adfdcff2f24e1cd53d760f354524fc54247944..696a39a9fa5d40cb4ab4a747202cea994e9b3c8c 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "27-Apr-99 (3.10)" "X Version 11"
+.TH XScreenSaver 1 "10-May-99 (3.12)" "X Version 11"
 .SH NAME
 xscreensaver-demo - interactively control the background xscreensaver daemon
 .SH SYNOPSIS
index 4460c19df6125b9c358df07e4a3a179bb06f98e4..1eecf4ca73abce315bcc5f92b352dbeb662f83b2 100644 (file)
@@ -163,6 +163,7 @@ XrmDatabase db = 0;
 static Atom XA_SCREENSAVER_RESPONSE;
 static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV;
 static Atom XA_EXIT, XA_RESTART, XA_LOCK, XA_SELECT;
+static Atom XA_THROTTLE, XA_UNTHROTTLE;
 Atom XA_DEMO, XA_PREFS;
 
 \f
@@ -424,9 +425,7 @@ privileged_initialization (saver_info *si, int *argc, char **argv)
   lock_priv_init (*argc, argv, si->prefs.verbose_p);
 #endif /* NO_LOCKING */
 
-#ifndef NO_SETUID
   hack_uid (si);
-#endif /* NO_SETUID */
 }
 
 
@@ -449,9 +448,7 @@ lock_initialization (saver_info *si, int *argc, char **argv)
     }
 #endif /* NO_LOCKING */
 
-#ifndef NO_SETUID
   hack_uid (si);
-#endif /* NO_SETUID */
 }
 
 
@@ -498,6 +495,8 @@ connect_to_server (saver_info *si, int *argc, char **argv)
   XA_DEMO = XInternAtom (si->dpy, "DEMO", False);
   XA_PREFS = XInternAtom (si->dpy, "PREFS", False);
   XA_LOCK = XInternAtom (si->dpy, "LOCK", False);
+  XA_THROTTLE = XInternAtom (si->dpy, "THROTTLE", False);
+  XA_UNTHROTTLE = XInternAtom (si->dpy, "UNTHROTTLE", False);
 
   return toplevel_shell;
 }
@@ -702,7 +701,7 @@ initialize_per_screen_info (saver_info *si, Widget toplevel_shell)
        }
     }
 
-  si->prefs.fading_possible_p = found_any_writable_cells;
+  si->fading_possible_p = found_any_writable_cells;
 }
 
 
@@ -881,6 +880,7 @@ main_loop (saver_info *si)
 
   while (1)
     {
+      Bool was_locked = False;
       sleep_until_idle (si, True);
 
       if (p->verbose_p)
@@ -916,31 +916,57 @@ main_loop (saver_info *si)
         }
 
       kill_screenhack (si);
-      spawn_screenhack (si, True);
+
+      if (!si->throttled_p)
+        spawn_screenhack (si, True);
+      else if (p->verbose_p)
+        fprintf (stderr, "%s: not launching hack (throttled.)\n", blurb());
 
       /* Don't start the cycle timer in demo mode. */
       if (!si->demoing_p && p->cycle)
-       si->cycle_id = XtAppAddTimeOut (si->app, p->cycle, cycle_timer,
+       si->cycle_id = XtAppAddTimeOut (si->app,
+                                        (si->selection_mode
+                                         /* see comment in cycle_timer() */
+                                         ? 1000 * 60 * 60
+                                         : p->cycle),
+                                        cycle_timer,
                                        (XtPointer) si);
 
 
 #ifndef NO_LOCKING
-      if (!si->demoing_p &&            /* if not going into demo mode */
-         p->lock_p &&                  /* and locking is enabled */
-         !si->locking_disabled_p &&    /* and locking is possible */
-         p->lock_timeout == 0)         /* and locking is not timer-deferred */
-       si->locked_p = True;            /* then lock right now. */
-
-      /* locked_p might be true already because of the above, or because of
-        the LOCK ClientMessage.  But if not, and if we're supposed to lock
-        after some time, set up a timer to do so.
-       */
-      if (p->lock_p &&
-         !si->locked_p &&
-         p->lock_timeout > 0)
-       si->lock_id = XtAppAddTimeOut (si->app, p->lock_timeout,
-                                      activate_lock_timer,
-                                      (XtPointer) si);
+      {
+        Time lock_timeout = p->lock_timeout;
+
+        if (si->emergency_lock_p && p->lock_p && lock_timeout)
+          {
+            int secs = p->lock_timeout / 1000;
+            if (p->verbose_p)
+              fprintf (stderr,
+                     "%s: locking now, instead of waiting for %d:%02d:%02d.\n",
+                       blurb(),
+                       (secs / (60 * 60)), ((secs / 60) % 60), (secs % 60));
+            lock_timeout = 0;
+          }
+
+        si->emergency_lock_p = False;
+
+        if (!si->demoing_p &&           /* if not going into demo mode */
+            p->lock_p &&                /* and locking is enabled */
+            !si->locking_disabled_p &&  /* and locking is possible */
+            lock_timeout == 0)          /* and locking is not timer-deferred */
+          si->locked_p = True;          /* then lock right now. */
+
+        /* locked_p might be true already because of the above, or because of
+           the LOCK ClientMessage.  But if not, and if we're supposed to lock
+           after some time, set up a timer to do so.
+        */
+        if (p->lock_p &&
+            !si->locked_p &&
+            lock_timeout > 0)
+          si->lock_id = XtAppAddTimeOut (si->app, lock_timeout,
+                                         activate_lock_timer,
+                                         (XtPointer) si);
+      }
 #endif /* !NO_LOCKING */
 
 
@@ -956,6 +982,7 @@ main_loop (saver_info *si)
            saver_screen_info *ssi = si->default_screen;
            if (si->locking_disabled_p) abort ();
 
+            was_locked = True;
            si->dbox_up_p = True;
            suspend_screenhack (si, True);
            XUndefineCursor (si->dpy, ssi->screensaver_window);
@@ -980,9 +1007,20 @@ main_loop (saver_info *si)
       unblank_screen (si);
 
       si->locked_p = False;
+      si->emergency_lock_p = False;
       si->demoing_p = 0;
       si->selection_mode = 0;
 
+      /* If we're throttled, and the user has explicitly unlocked the screen,
+         then unthrottle.  If we weren't locked, then don't unthrottle
+         automatically, because someone might have just bumped the desk... */
+      if (was_locked)
+        {
+          if (si->throttled_p && p->verbose_p)
+            fprintf (stderr, "%s: unthrottled.\n", blurb());
+          si->throttled_p = False;
+        }
+
       if (si->cycle_id)
        {
          XtRemoveTimeOut (si->cycle_id);
@@ -1025,13 +1063,20 @@ main (int argc, char **argv)
   process_command_line (si, &argc, argv);
   print_banner (si);
 
-  initialize_per_screen_info (si, shell);  /* also sets p->fading_possible_p */
+  load_init_file (p);  /* must be before initialize_per_screen_info() */
+  initialize_per_screen_info (si, shell); /* also sets si->fading_possible_p */
+
+  /* We can only issue this warnings now. */
+  if (p->verbose_p && !si->fading_possible_p && (p->fade_p || p->unfade_p))
+    fprintf (stderr,
+             "%s: there are no PseudoColor or GrayScale visuals.\n"
+             "%s: ignoring the request for fading/unfading.\n",
+             blurb(), blurb());
 
   for (i = 0; i < si->nscreens; i++)
     if (ensure_no_screensaver_running (si->dpy, si->screens[i].screen))
       exit (1);
 
-  load_init_file (p);
   lock_initialization (si, &argc, argv);
 
   if (p->xsync_p) XSynchronize (si->dpy, True);
@@ -1081,6 +1126,7 @@ clientmessage_response (saver_info *si, Window w, Bool error,
 Bool
 handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
 {
+  saver_preferences *p = &si->prefs;
   Atom type = 0;
   Window window = event->xclient.window;
 
@@ -1113,6 +1159,11 @@ handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
                                 "activating.");
          si->selection_mode = 0;
          si->demoing_p = False;
+
+          if (si->throttled_p && p->verbose_p)
+            fprintf (stderr, "%s: unthrottled.\n", blurb());
+         si->throttled_p = False;
+
          if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
            {
              XForceScreenSaver (si->dpy, ScreenSaverActive);
@@ -1131,6 +1182,10 @@ handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
     {
       if (! until_idle_p)
        {
+          if (si->throttled_p && p->verbose_p)
+            fprintf (stderr, "%s: unthrottled.\n", blurb());
+         si->throttled_p = False;
+
          clientmessage_response(si, window, False,
                                 "DEACTIVATE ClientMessage received.",
                                 "deactivating.");
@@ -1157,6 +1212,11 @@ handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
                                 "cycling.");
          si->selection_mode = 0;       /* 0 means randomize when its time. */
          si->demoing_p = False;
+
+          if (si->throttled_p && p->verbose_p)
+            fprintf (stderr, "%s: unthrottled.\n", blurb());
+         si->throttled_p = False;
+
          if (si->cycle_id)
            XtRemoveTimeOut (si->cycle_id);
          si->cycle_id = 0;
@@ -1177,6 +1237,10 @@ handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
       si->selection_mode = (type == XA_NEXT ? -1 : -2);
       si->demoing_p = False;
 
+      if (si->throttled_p && p->verbose_p)
+        fprintf (stderr, "%s: unthrottled.\n", blurb());
+      si->throttled_p = False;
+
       if (! until_idle_p)
        {
          if (si->cycle_id)
@@ -1201,6 +1265,10 @@ handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
       si->selection_mode = which;
       si->demoing_p = False;
 
+      if (si->throttled_p && p->verbose_p)
+        fprintf (stderr, "%s: unthrottled.\n", blurb());
+      si->throttled_p = False;
+
       if (! until_idle_p)
        {
          if (si->cycle_id)
@@ -1249,6 +1317,10 @@ handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
              XSync (si->dpy, False);
            }
 
+          fflush (stdout);
+          fflush (stderr);
+          if (real_stdout) fflush (real_stdout);
+          if (real_stderr) fflush (real_stderr);
          /* make sure error message shows up before exit. */
          if (real_stderr && stderr != real_stderr)
            dup2 (fileno(real_stderr), fileno(stderr));
@@ -1282,6 +1354,10 @@ handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
              si->selection_mode = which;
              si->demoing_p = True;
 
+              if (si->throttled_p && p->verbose_p)
+                fprintf (stderr, "%s: unthrottled.\n", blurb());
+              si->throttled_p = False;
+
              return True;
            }
 
@@ -1351,6 +1427,58 @@ handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
        }
 #endif /* !NO_LOCKING */
     }
+  else if (type == XA_THROTTLE)
+    {
+      if (si->throttled_p)
+       clientmessage_response (si, window, True,
+                                "THROTTLE ClientMessage received, but "
+                                "already throttled.",
+                                "already throttled.");
+      else
+       {
+         char buf [255];
+         char *response = "throttled.";
+         si->throttled_p = True;
+         si->selection_mode = 0;
+         si->demoing_p = False;
+         sprintf (buf, "THROTTLE ClientMessage received; %s", response);
+         clientmessage_response (si, window, False, buf, response);
+
+          if (! until_idle_p)
+            {
+              if (si->cycle_id)
+                XtRemoveTimeOut (si->cycle_id);
+              si->cycle_id = 0;
+              cycle_timer ((XtPointer) si, 0);
+            }
+       }
+    }
+  else if (type == XA_UNTHROTTLE)
+    {
+      if (! si->throttled_p)
+       clientmessage_response (si, window, True,
+                                "UNTHROTTLE ClientMessage received, but "
+                                "not throttled.",
+                                "not throttled.");
+      else
+       {
+         char buf [255];
+         char *response = "unthrottled.";
+         si->throttled_p = False;
+         si->selection_mode = 0;
+         si->demoing_p = False;
+         sprintf (buf, "UNTHROTTLE ClientMessage received; %s", response);
+         clientmessage_response (si, window, False, buf, response);
+
+          if (! until_idle_p)
+            {
+              if (si->cycle_id)
+                XtRemoveTimeOut (si->cycle_id);
+              si->cycle_id = 0;
+              cycle_timer ((XtPointer) si, 0);
+            }
+       }
+    }
   else
     {
       char buf [1024];
@@ -1386,16 +1514,17 @@ analyze_display (saver_info *si)
 {
   int i, j;
   static const char *exts[][2] = {
-    { "SCREEN_SAVER",     "SGI Screen-Saver" },
-    { "SCREEN-SAVER",     "SGI Screen-Saver" },
-    { "MIT-SCREEN-SAVER",  "MIT Screen-Saver" },
-    { "XIDLE",            "XIdle" },
-    { "SGI-VIDEO-CONTROL", "SGI Video-Control" },
-    { "READDISPLAY",      "SGI Read-Display" },
-    { "MIT-SHM",          "Shared Memory" },
-    { "DOUBLE-BUFFER",    "Double-Buffering" },
-    { "DPMS",             "Power Management" },
-    { "GLX",              "GLX" }
+    { "SCREEN_SAVER",             "SGI Screen-Saver" },
+    { "SCREEN-SAVER",            "SGI Screen-Saver" },
+    { "MIT-SCREEN-SAVER",         "MIT Screen-Saver" },
+    { "XIDLE",                   "XIdle" },
+    { "SGI-VIDEO-CONTROL",        "SGI Video-Control" },
+    { "READDISPLAY",             "SGI Read-Display" },
+    { "MIT-SHM",                 "Shared Memory" },
+    { "DOUBLE-BUFFER",           "Double-Buffering" },
+    { "DPMS",                    "Power Management" },
+    { "GLX",                     "GLX" },
+    { "XFree86-VidModeExtension", "XF86 Video-Mode" }
   };
 
   fprintf (stderr, "%s: running on display \"%s\"\n", blurb(),
index 7a61d166b2d306bf69e27af82ae6f31ba3f7942d..75b4ab42d9e5c53604ff95416e36e5afebbc250a 100644 (file)
@@ -84,6 +84,9 @@ struct saver_info {
   Bool screen_blanked_p;       /* Whether the saver is currently active. */
   Window mouse_grab_window;    /* Window holding our mouse grab */
   Window keyboard_grab_window; /* Window holding our keyboard grab */
+  Bool fading_possible_p;      /* Whether fading to/from black is possible. */
+  Bool throttled_p;             /* Whether we should temporarily just blank
+                                   the screen, not run hacks. */
 
 
   /* =======================================================================
@@ -135,8 +138,14 @@ struct saver_info {
   XtIntervalId check_pointer_timer_id; /* `prefs.pointer_timeout' */
 
   time_t last_activity_time;              /* Used only when no server exts. */
+  time_t last_wall_clock_time;             /* Used to detect laptop suspend. */
   saver_screen_info *last_activity_screen;
 
+  Bool emergency_lock_p;        /* Set when the wall clock has jumped
+                                   (presumably due to laptop suspend) and we
+                                   need to lock down right away instead of
+                                   waiting for the lock timer to go off. */
+
 
   /* =======================================================================
      remote control
@@ -193,6 +202,13 @@ struct saver_screen_info {
                                   real root window. */
   unsigned long black_pixel;   /* Black, allocated from `cmap'. */
 
+  int blank_vp_x, blank_vp_y;   /* Where the virtual-scrolling viewport was
+                                   when the screen went blank.  We need to
+                                   prevent the X server from letting the mouse
+                                   bump the edges to scroll while the screen
+                                   is locked, so we reset to this when it has
+                                   moved, and the lock dialog is up... */
+
 # ifdef HAVE_MIT_SAVER_EXTENSION
   Window server_mit_saver_window;
 # endif
@@ -273,6 +289,12 @@ extern void raise_window (saver_info *si,
 extern Bool blank_screen (saver_info *si);
 extern void unblank_screen (saver_info *si);
 
+extern void get_screen_viewport (saver_screen_info *ssi,
+                                 int *x_ret, int *y_ret,
+                                 int *w_ret, int *h_ret,
+                                 Bool verbose_p);
+
+
 /* =======================================================================
    locking
    ======================================================================= */
@@ -282,14 +304,10 @@ extern Bool unlock_p (saver_info *si);
 extern Bool lock_priv_init (int argc, char **argv, Bool verbose_p);
 extern Bool lock_init (int argc, char **argv, Bool verbose_p);
 extern Bool passwd_valid_p (const char *typed_passwd, Bool verbose_p);
+#endif /* NO_LOCKING */
 
-extern void make_passwd_window (saver_info *si);
-extern void draw_passwd_window (saver_info *si);
-extern void update_passwd_window (saver_info *si, const char *printed_passwd,
-                                 float ratio);
-extern void destroy_passwd_window (saver_info *si);
+extern int move_mouse_grab (saver_info *si, Window to, Cursor cursor);
 
-#endif /* NO_LOCKING */
 
 /* =======================================================================
    runtime privileges
index 9c468f75728f6c97e7a1edace6c2802fb264f7da..36f3a8b510352ef5353869be60d33565bae975c1 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "27-Apr-99 (3.10)" "X Version 11"
+.TH XScreenSaver 1 "10-May-99 (3.12)" "X Version 11"
 .SH NAME
 xscreensaver - graphics hack and screen locker, launched when the user is idle
 .SH SYNOPSIS
@@ -190,6 +190,10 @@ one plane (that is, it's not monochrome.)
 .B color
 Use the best of the color visuals, if there are any.
 .TP 8
+.B GL
+Use the visual that is best for OpenGL programs.  (OpenGL programs have
+somewhat different requirements than other X programs.)
+.TP 8
 .I class
 where \fIclass\fP is one of \fBStaticGray\fP, \fBStaticColor\fP, 
 \fBTrueColor\fP, \fBGrayScale\fP, \fBPseudoColor\fP, or \fBDirectColor\fP.
@@ -1122,39 +1126,6 @@ If you're running Irix 6.3, you might find that your monitor is powering down
 after an hour or two even if you've told it not to.  This is fixed by SGI
 patches 2447 and 2537.
 .TP 8
-.B OpenGL Programs and Visuals
-Some of the graphics demos included with xscreensaver make use of the 
-OpenGL (or MesaGL) 3D library, if it is available.  It is possible (even 
-likely) that \fIxscreensaver\fP's notion of the ``\fIbest\fP'' visual is 
-not quite right for these GL programs.  
-
-The odd thing about GL programs is that, unlike normal X11 programs, they
-tend to work best on a visual \fIhalf\fP as deep as the depth of the screen,
-since that way, they can do double-buffering.  Try it and see, but you will
-probably find that, for these particular programs, you should specify the
-deepest visual that is half as deep as the screen.  (See the discussion
-of the \fBprograms\fP resource in the \fIConfiguration\fP section, above.)
-
-For example, on a screen that supports both 24-bit TrueColor and 12-bit
-PseudoColor visuals, the 12-bit visual will probably work best (this is true
-of base-model SGI Indys: the 0x29 visual is the one you want.)  
-
-Oddly, on SGI O2s (machines that have serious hardware support for GL), the
-12-bit PseudoColor visual looks awful (you get a black and white, flickery
-image.)  On these machines, the visual you want turns out to be 0x31.
-However, 0x31 is but \fIone\fP of the \fIeight\fP 15-bit TrueColor visuals
-(yes, 8, and yes, 15) that the O2 X server provides.  This is the only visual
-that works properly: as far as
-.BR xdpyinfo (1)
-is concerned, all of the 15-bit TrueColor visuals are identical, but some
-flicker like mad, and some have deeply weird artifacts (such as hidden 
-surfaces that show through, as if depth worked backwards!)  
-
-I suppose these other visuals must be tied to some arcane hardware feature...
-If anyone would care to explain it to me, that would be great.
-
-Your mileage, therefore, may vary dramatically.
-.TP 8
 .B MesaGL and Voodoo Cards
 If you have a 3Dfx/Voodoo card, the default settings for xscreensaver will
 run the GL-based graphics demos in such a way that they will not take 
@@ -1245,20 +1216,30 @@ http://www.jwz.org/xscreensaver/
 .BR bouboule (1),
 .BR braid (1),
 .BR bsod (1),
+.BR bubble3d (1),
 .BR bubbles (1),
 .BR cage (1),
+.BR compass (1),
 .BR coral (1),
+.BR critical (1),
+.BR crystal (1),
 .BR cynosure (1),
 .BR decayscreen (1),
 .BR deco (1),
+.BR deluxe (1),
+.BR demon (1),
+.BR discrete (1),
+.BR distort (1),
 .BR drift (1),
 .BR epicycle (1),
 .BR fadeplot (1),
 .BR flag (1),
 .BR flame (1),
+.BR flow (1),
 .BR forest (1),
 .BR galaxy (1),
 .BR gears (1),
+.BR glplanet (1),
 .BR goop (1),
 .BR grav (1),
 .BR greynetic (1),
@@ -1272,11 +1253,14 @@ http://www.jwz.org/xscreensaver/
 .BR jigsaw (1),
 .BR julia (1),
 .BR kaleidescope (1),
+.BR kumppa (1),
+.BR lament (1),
 .BR laser (1),
 .BR lightning (1),
 .BR lisa (1),
 .BR lissie (1),
 .BR lmorph (1),
+.BR loop (1),
 .BR maze (1),
 .BR moebius (1),
 .BR moire (1),
@@ -1286,8 +1270,11 @@ http://www.jwz.org/xscreensaver/
 .BR munch (1),
 .BR noseguy (1),
 .BR pedal (1),
+.BR penetrate (1),
 .BR penrose (1),
+.BR phosphor (1),
 .BR pipes (1),
+.BR pulsar (1),
 .BR pyro (1),
 .BR qix (1),
 .BR rd-bomb (1),
@@ -1298,20 +1285,27 @@ http://www.jwz.org/xscreensaver/
 .BR sierpinski (1),
 .BR slidescreen (1),
 .BR slip (1),
+.BR sonar (1),
 .BR sphere (1),
 .BR spiral (1),
+.BR spotlight (1),
 .BR sproingies (1),
+.BR squiral (1),
 .BR stairs (1),
 .BR starfish (1),
 .BR strange (1),
 .BR superquadrics (1),
 .BR swirl (1),
+.BR t3d (1),
 .BR triangle (1),
 .BR truchet (1),
 .BR vines (1),
+.BR wander (1),
 .BR worm (1),
+.BR xflame (1),
 .BR xjack (1),
 .BR xlyap (1),
+.BR xmatrix (1),
 .BR xroger (1),
 .BR bongo (1),
 .BR ico (1),
index f34ead3e8cb90d24aac2e0ddc255fea687de0a94..c633cdcd9ea448681345451445468d9f2339b200 100644 (file)
@@ -436,8 +436,10 @@ make_flag_bits(ModeInfo *mi)
        }
   else
        {
+      char *bits = (char *) malloc (sizeof(bob_bits));
+      memcpy (bits, bob_bits, sizeof(bob_bits));
          fp->image = XCreateImage (dpy, MI_VISUAL(mi), 1, XYBitmap, 0,
-                                                               (char *) bob_bits, bob_width, bob_height,
+                                                               bits, bob_width, bob_height,
                                                                8, 0);
          fp->image->byte_order = LSBFirst;
          fp->image->bitmap_bit_order = LSBFirst;
@@ -539,6 +541,9 @@ init_flag(ModeInfo * mi)
        XClearWindow(display, MI_WINDOW(mi));
 }
 
+void release_flag(ModeInfo * mi);
+
+
 void
 draw_flag(ModeInfo * mi)
 {
@@ -570,7 +575,10 @@ draw_flag(ModeInfo * mi)
        XFlush(display);
        fp->timer++;
        if ((MI_CYCLES(mi) > 0) && (fp->timer >= MI_CYCLES(mi)))
+      {
+        release_flag(mi);
                init_flag(mi);
+      }
 }
 
 void
index cd0820023cb153ee4248f19676f85024ae864c92..b5291acc776f044aa7c064a3a285f4021b3565bf 100644 (file)
@@ -54,10 +54,12 @@ INCLUDES    = -I$(srcdir) -I$(UTILS_SRC) -I$(HACK_SRC) -I../.. @INCLUDES@
 
 UTIL_SRCS      = $(UTILS_SRC)/colors.c $(UTILS_SRC)/hsv.c \
                  $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \
-                 $(UTILS_SRC)/visual.c $(UTILS_SRC)/yarandom.c
+                 $(UTILS_SRC)/visual.c $(UTILS_SRC)/visual-gl.c \
+                 $(UTILS_SRC)/yarandom.c
 UTIL_OBJS      = $(UTILS_SRC)/colors.o $(UTILS_SRC)/hsv.o \
                  $(UTILS_SRC)/resources.o $(UTILS_SRC)/usleep.o \
-                 $(UTILS_SRC)/visual.o $(UTILS_SRC)/yarandom.o
+                 $(UTILS_SRC)/visual.o $(UTILS_SRC)/visual-gl.o \
+                  $(UTILS_SRC)/yarandom.o
 
 SRCS           = atlantis.c b_draw.c b_lockglue.c b_sphere.c bubble3d.c \
                  buildlwo.c cage.c dolphin.c gears.c lament.c moebius.c \
@@ -79,11 +81,13 @@ EXES                = @GL_EXES@
 
 HACK_OBJS      = screenhack-gl.o xlock-gl.o $(HACK_BIN)/xlockmore.o \
                  $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \
-                 $(UTILS_BIN)/usleep.o $(UTILS_BIN)/yarandom.o \
-                 $(UTILS_BIN)/hsv.o $(UTILS_BIN)/colors.o
+                 $(UTILS_BIN)/visual-gl.o $(UTILS_BIN)/usleep.o \
+                 $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/hsv.o \
+                 $(UTILS_BIN)/colors.o
 
 HDRS           = atlantis.h bubble3d.h buildlwo.h e_textures.h xpm-ximage.h
-MEN            = lament.man
+GL_MEN         = lament.man
+MEN            = @GL_MEN@
 EXTRAS         = README Makefile.in
 
 TARFILES       = $(SRCS) $(HDRS) $(MEN) $(EXTRAS)
@@ -182,6 +186,7 @@ $(UTILS_BIN)/hsv.o:         $(UTILS_SRC)/hsv.c
 $(UTILS_BIN)/resources.o:      $(UTILS_SRC)/resources.c
 $(UTILS_BIN)/usleep.o:         $(UTILS_SRC)/usleep.c
 $(UTILS_BIN)/visual.o:         $(UTILS_SRC)/visual.c
+$(UTILS_BIN)/visual-gl.o:      $(UTILS_SRC)/visual-gl.c
 $(UTILS_BIN)/yarandom.o:       $(UTILS_SRC)/yarandom.c
 
 $(UTIL_OBJS):
index 85d06f3a417e71ea5025bdefed0706d88b7be97a..926b7e332e4c769d6584bd559d3e0426479ee670 100644 (file)
@@ -61,8 +61,7 @@ static const char sccsid[] = "@(#)pipes.c     4.07 97/11/24 xlockmore";
                                        "*size:                 500     \n"                     \
                                        "*fisheye:              True    \n"                     \
                                        "*tightturns:   False   \n"                     \
-                                       "*rotatepipes:  True    \n"                     \
-                                       "*noBuffer:             True    \n"
+                                       "*rotatepipes:  True    \n"
 # include "xlockmore.h"                                /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
 # include "xlock.h"                                    /* from the xlockmore distribution */
index b7a8e43346b096abc4c50e3a6bcea23d36c09ca2..8c70a7e068288f1b6f7f00f356d0c2b621974951 100644 (file)
 
  * Revision History:
  * 4-Apr-1999:  dek@cgl.ucsf.edu  Created module "pulsar"
+ * 27-Apr-1999:  dek@cgl.ucsf.edu  Submitted module "pulsar"
+ * 4-May-1999:  jwz@jwz.org  Added module "pulsar"
+ * 4-May-1999:  dek@cgl.ucsf.edu  Submitted module "pulsar" updates
  *
+ * Notes:
+ * The pulsar screensaver draws a number of rotating, pulsing rectangles
+ * on your screen.  Depending on the options you choose, you can set a number
+ * of interesting OpenGL parameters, including alpha blending, depth testing, fog,
+ * lighting, texturing, mipmapping, bilinear filtering, and line antialiasing.  
+ * Additionally, there is a "frames per second" meter which gives an estimate of
+ * the speed of your graphics card.  
+ *
+ * Example command-line switches:
+ * Only draw a single quad, and don't fill it (boring but fast)
+ * pulsar -wire -quads 1 -fps
+ *
+ * Only try this with hardware graphics acceleration (PPro 200 w/ a Voodoo 2 runs great)
+ * pulsar -quads 10 -texture -mipmap -texture_quality -light -fog -fps
+ *                                                                 
  */
 
 #include <math.h> 
@@ -36,6 +54,7 @@
 # define screensaver_opts                              xlockmore_opts
 #define        DEFAULTS                        "*light:                        False   \n" \
                                         "*wire:                                False   \n" \
+                                        "*quads:                       5       \n" \
                                         "*blend:                       True    \n" \
                                         "*fog:                         False   \n" \
                                         "*antialias:           False   \n" \
@@ -44,6 +63,7 @@
                                         "*mipmap:                      False   \n" \
                                         "*fps:                         False   \n" \
                                         "*doDepth:                     False   \n" \
+                                                                               "*image:                        BUILTIN \n"
 
 # include "xlockmore.h"                                /* from the xscreensaver distribution */
 #else /* !STANDALONE */
 #define checkImageWidth 64
 #define checkImageHeight 64
 
-char *Textures[] = {
-  "./test.ppm4",
-};
-
-typedef struct {
-    int sizeX, sizeY;
-    GLubyte *data;
-} PPMImage;
-
 /* Functions for handling the frames per second timer */
 #include "GL/glx.h"
 
@@ -96,43 +107,42 @@ typedef struct {
 #define SAMPLE_FRAMES 10
 #endif
 
-static GLint base;
-static int FrameCounter = 0;
-static double oldtime=-1., newtime=-1.;
-static char FPSstring[1024]="FPS: NONE"; 
-
-static float x_pos=0, y_pos=0;
-
-#define FONT "-*-courier-medium-r-normal-*-240-*"
-
-
-
-#define NUM_TRIANGLES 5
-static float scale_x=1, scale_y=1, scale_z=1;
-static int frame = 0;
-struct triangle
-{
-  GLfloat tx, ty, tz;
-  GLfloat rx, ry, rz;
-
-  GLfloat dtx, dty, dtz;
-  GLfloat drx, dry, drz;
-
-};
-struct triangle triangles[NUM_TRIANGLES];
-GLint tri_list;
-
-
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #define WIDTH 800
 #define HEIGHT 600
 
-int global_width=WIDTH, global_height=HEIGHT;
+#define NUM_QUADS 5
+#define DEF_NUM_QUADS  "5"
+#define DEF_LIGHT              "False"
+#define DEF_WIRE               "False"
+#define DEF_BLEND      "True"
+#define DEF_FOG                "False"
+#define DEF_ANTIALIAS   "False"
+#define DEF_TEXTURE    "False"
+#define DEF_TEXTURE_QUALITY   "False"
+#define DEF_MIPMAP     "False"
+#define DEF_FPS                "False"
+#define DEF_DO_DEPTH   "False"
+#define DEF_IMAGE      "BUILTIN"
+
+static int num_quads;
+static int do_light;
+static int do_wire;
+static int do_blend;
+static int do_fog;
+static int do_antialias;
+static int do_texture;
+static int do_texture_quality;
+static int do_mipmap;
+static int do_fps;
+static int do_depth;
+static char *which_image;
 
 
 static XrmOptionDescRec opts[] = {
+  {"-quads",   ".pulsar.quads",   XrmoptionSepArg, (caddr_t) NULL },
   {"-light",   ".pulsar.light",   XrmoptionNoArg, (caddr_t) "true" },
   {"+light",   ".pulsar.light",   XrmoptionNoArg, (caddr_t) "false" },
   {"-wire",   ".pulsar.wire",   XrmoptionNoArg, (caddr_t) "true" },
@@ -153,31 +163,12 @@ static XrmOptionDescRec opts[] = {
   {"+fps",   ".pulsar.fps",   XrmoptionNoArg, (caddr_t) "false" },
   {"-do_depth",   ".pulsar.doDepth",   XrmoptionNoArg, (caddr_t) "true" },
   {"+do_depth",   ".pulsar.doDepth",   XrmoptionNoArg, (caddr_t) "false" },
+  {"-image",   ".pulsar.image",  XrmoptionSepArg, (caddr_t) NULL },
 };
 
-#define DEF_LIGHT  "False"
-#define DEF_WIRE   "False"
-#define DEF_BLEND   "True"
-#define DEF_FOG   "False"
-#define DEF_ANTIALIAS   "False"
-#define DEF_TEXTURE   "False"
-#define DEF_TEXTURE_QUALITY   "False"
-#define DEF_MIPMAP   "False"
-#define DEF_FPS   "False"
-#define DEF_DO_DEPTH   "False"
-
-static int do_light;
-static int do_wire;
-static int do_blend;
-static int do_fog;
-static int do_antialias;
-static int do_texture;
-static int do_texture_quality;
-static int do_mipmap;
-static int do_fps;
-static int do_depth;
 
 static argtype vars[] = {
+  {(caddr_t *) &num_quads, "quads", "Quads", DEF_NUM_QUADS, t_Int},
   {(caddr_t *) &do_light,    "light",   "Light",   DEF_LIGHT,   t_Bool},
   {(caddr_t *) &do_wire,    "wire",   "Wire",   DEF_WIRE,   t_Bool},
   {(caddr_t *) &do_blend,    "blend",   "Blend",   DEF_BLEND,   t_Bool},
@@ -188,10 +179,27 @@ static argtype vars[] = {
   {(caddr_t *) &do_mipmap,    "mipmap",   "Mipmap",   DEF_MIPMAP,   t_Bool},
   {(caddr_t *) &do_fps,    "fps",   "fps",   DEF_FPS,   t_Bool},
   {(caddr_t *) &do_depth,    "doDepth",   "DoDepth",   DEF_DO_DEPTH,   t_Bool},
+  {(caddr_t *) &which_image, "image",   "Image",   DEF_IMAGE,   t_String},
 };
 
 
-ModeSpecOpt screensaver_opts = {countof(opts), opts, countof(vars), vars, NULL};
+static OptionStruct desc[] =
+{
+       {"-quads num", "how many quads to draw"},
+       {"-/+ light", "whether to do enable lighting (slower)"},
+       {"-/+ wire", "whether to do use wireframe instead of filled (faster)"},
+       {"-/+ blend", "whether to do enable blending (slower)"},
+       {"-/+ fog", "whether to do enable fog (?)"},
+       {"-/+ antialias", "whether to do enable antialiased lines (slower)"},
+       {"-/+ texture", "whether to do enable texturing (much slower)"},
+       {"-/+ texture_quality", "whether to do enable linear/mipmap filtering (much much slower)"},
+       {"-/+ mipmap", "whether to do enable mipmaps (much slower)"},
+       {"-/+ fps", "whether to do enable frames per second meter (?)"},
+       {"-/+ depth", "whether to do enable depth buffer checking (slower)"},
+       {"-image <filename>", "texture image to load (PPM, PPM4, TIFF(?), XPM(?))"},
+};
+
+ModeSpecOpt screensaver_opts = {countof(opts), opts, countof(vars), vars, desc};
 
 #ifdef USE_MODULES
 ModStruct   screensaver_description =
@@ -212,6 +220,47 @@ typedef struct {
 
 static screensaverstruct *Screensaver = NULL;
 
+struct quad
+{
+  GLfloat tx, ty, tz;
+  GLfloat rx, ry, rz;
+
+  GLfloat dtx, dty, dtz;
+  GLfloat drx, dry, drz;
+
+};
+
+int global_width=WIDTH, global_height=HEIGHT;
+
+
+static GLint base;
+static int FrameCounter = 0;
+static double oldtime=-1., newtime=-1.;
+static char FPSstring[1024]="FPS: NONE"; 
+
+static float x_pos=0, y_pos=0;
+
+#define FONT "-*-courier-medium-r-normal-*-240-*"
+GLint quad_list;
+
+static float scale_x=1, scale_y=1, scale_z=1;
+static int frame = 0;
+
+static GLenum errCode;
+static const GLubyte *errString;
+
+struct quad *quads;
+
+int checkError(int line, char *file)
+{
+  if((errCode = glGetError()) != GL_NO_ERROR) {
+    errString = (char *)gluErrorString(errCode);
+    fprintf(stderr, "OpenGL error: %s detected at line %d in file %s\n", errString, line, file);
+    exit(1);
+  }
+  return 0;
+}
+
 
 void FPS_Setup(void)
 {
@@ -266,7 +315,10 @@ void PrintString(float x, float y, char *string)
   glRasterPos2f( x, y);
   len = (int) strlen(string);
   for (i = 0; i < len; i++) {
-    glCallList(base+string[i]);
+       if (glIsList(base+string[i]))
+         glCallList(base+string[i]);
+       else
+         fprintf(stderr, "%d+string[%d] is not a display list!\n", base, i);
   }
 
   /* clean up after our state changes */
@@ -367,12 +419,12 @@ uint32 *LoadTIFF(char *filename, int *width, int *height, int *format)
 }
 #endif
 
-
 /* Load a modified version of PPM format with an extra byte for alpha */
 GLubyte *LoadPPM4(const char *filename, int *width, int *height, int *format)
 {
   char buff[1024];
-  PPMImage *result;
+  GLubyte *data;
+  int sizeX, sizeY;
   FILE *fp;
   int maxval;
 
@@ -385,7 +437,7 @@ GLubyte *LoadPPM4(const char *filename, int *width, int *height, int *format)
 
   if (!fgets(buff, sizeof(buff), fp))
     {
-      perror(filename);
+      perror("Unable to read header filename\n");
       return  Generate_Image(width, height, format);
     }
 
@@ -395,20 +447,13 @@ GLubyte *LoadPPM4(const char *filename, int *width, int *height, int *format)
       return  Generate_Image(width, height, format);
     }
 
-  result = malloc(sizeof(PPMImage));
-  if (!result)
-    {
-      fprintf(stderr, "Unable to allocate memory\n");
-      return  Generate_Image(width, height, format);
-    }
-
   do
     {
       fgets(buff, sizeof(buff), fp);
     }
   while (buff[0] == '#');
     
-  if (sscanf(buff, "%d %d", &result->sizeX, &result->sizeY) != 2)
+  if (sscanf(buff, "%d %d", &sizeX, &sizeY) != 2)
     {
       fprintf(stderr, "Error loading image `%s'\n", filename);
       return  Generate_Image(width, height, format);
@@ -423,14 +468,14 @@ GLubyte *LoadPPM4(const char *filename, int *width, int *height, int *format)
   while (fgetc(fp) != '\n')
     ;
 
-  result->data = (GLubyte *)malloc(4 * result->sizeX * result->sizeY);
-  if (!result)
+  data = (GLubyte *)malloc(4 * sizeX * sizeY);
+  if (data == NULL)
     {
       fprintf(stderr, "Unable to allocate memory\n");
-      exit(1);
+         exit(1);
     }
 
-  if (fread(result->data, 4 * result->sizeX, result->sizeY, fp) != result->sizeY)
+  if (fread(data, 4 * sizeX, sizeY, fp) != sizeY)
     {
       fprintf(stderr, "Error loading image `%s'\n", filename);
       return  Generate_Image(width, height, format);
@@ -438,17 +483,18 @@ GLubyte *LoadPPM4(const char *filename, int *width, int *height, int *format)
 
   fclose(fp);
 
-  *width = result->sizeX;
-  *height = result->sizeY;
+  *width = sizeX;
+  *height = sizeY;
   *format = GL_RGBA;
-  return result->data;
+  return data;
 }
 
 /* Load a plain PPM image */
 GLubyte *LoadPPM(const char *filename, int *width, int *height, int *format)
 {
   char buff[1024];
-  PPMImage *result;
+  GLubyte *data;
+  GLint sizeX, sizeY;
   FILE *fp;
   int maxval;
 
@@ -471,20 +517,13 @@ GLubyte *LoadPPM(const char *filename, int *width, int *height, int *format)
       return  Generate_Image(width, height, format);
     }
 
-  result = malloc(sizeof(PPMImage));
-  if (!result)
-    {
-      fprintf(stderr, "Unable to allocate memory\n");
-      return  Generate_Image(width, height, format);
-    }
-
   do
     {
       fgets(buff, sizeof(buff), fp);
     }
   while (buff[0] == '#');
     
-  if (sscanf(buff, "%d %d", &result->sizeX, &result->sizeY) != 2)
+  if (sscanf(buff, "%d %d", &sizeX, &sizeY) != 2)
     {
       fprintf(stderr, "Error loading image `%s'\n", filename);
       return  Generate_Image(width, height, format);
@@ -499,14 +538,14 @@ GLubyte *LoadPPM(const char *filename, int *width, int *height, int *format)
   while (fgetc(fp) != '\n')
     ;
 
-  result->data = (GLubyte *)malloc(3 * result->sizeX * result->sizeY);
-  if (!result)
+  data = (GLubyte *)malloc(3 * sizeX * sizeY);
+  if (data == NULL)
     {
       fprintf(stderr, "Unable to allocate memory\n");
-      return  Generate_Image(width, height, format);
+         exit(1);
     }
 
-  if (fread(result->data, 3 * result->sizeX, result->sizeY, fp) != result->sizeY)
+  if (fread(data, 3 * sizeX, sizeY, fp) != sizeY)
     {
       fprintf(stderr, "Error loading image `%s'\n", filename);
       return  Generate_Image(width, height, format);
@@ -514,10 +553,10 @@ GLubyte *LoadPPM(const char *filename, int *width, int *height, int *format)
 
   fclose(fp);
 
-  *width = result->sizeX;
-  *height = result->sizeY;
+  *width = sizeX;
+  *height = sizeY;
   *format = GL_RGB;
-  return result->data;
+  return data;
 }
 
 /* Create a texture in OpenGL.  First an image is loaded 
@@ -529,9 +568,9 @@ void Create_Texture(char *filename)
   GLint a;
   int format;
 
-  fprintf(stdout, "Loading texture '%s'\n", filename);
-
-  if ( !strncmp((filename+strlen(filename)-3), "ppm", 3))
+  if ( !strncmp(filename, "BUILTIN", 7))
+    image = Generate_Image(&width, &height, &format);
+  else if ( !strncmp((filename+strlen(filename)-3), "ppm", 3))
     image = LoadPPM(filename, &width, &height, &format);
   else if ( !strncmp((filename+strlen(filename)-4), "ppm4", 4))
     image = LoadPPM4(filename, &width, &height, &format);
@@ -549,18 +588,22 @@ void Create_Texture(char *filename)
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+  /* perhaps we can edge a bit more speed at the expense of quality */
+  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
 
   if (do_texture_quality) {
+       /* with texture_quality, the min and mag filters look *much* nice but are *much* slower */
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
-       glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
   }
   else {
+       /* default is to do it quick and dirty */
+       /* if you have mipmaps turned on, but not texture quality, nothing will happen! */
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-       glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
   }
 
+  /* mipmaps make the image look much nicer */
   if (do_mipmap)
        a=gluBuild2DMipmaps(GL_TEXTURE_2D, format, width, height, format, GL_UNSIGNED_BYTE, image);
   else 
@@ -579,13 +622,12 @@ void resetProjection(void) {
 }
 
 
-void GenerateTriangle(void)
+void GenerateQuad(void)
 {
   int i;
 
-  tri_list = glGenLists(1);
-  glNewList(tri_list,GL_COMPILE);
-/*    glBegin(GL_TRIANGLES); */
+  quad_list = glGenLists(1);
+  glNewList(quad_list,GL_COMPILE);
   glBegin(GL_QUADS);
   glColor4f(1,0,0,.4); glNormal3f(0,0,1);  glTexCoord2f(0,0); glVertex2f(-1, -1);
   glColor4f(0,1,0,.4); glNormal3f(0,0,1);  glTexCoord2f(0,1); glVertex2f(-1,  1);
@@ -594,18 +636,20 @@ void GenerateTriangle(void)
   glEnd();
   glEndList();
 
-  for (i=0; i < NUM_TRIANGLES; i++)
+
+  quads = (struct quad *) malloc(sizeof(struct quad) * num_quads);
+  for (i=0; i < num_quads; i++)
     {
-      triangles[i].rx = 0.;
-      triangles[i].ry = 0.;
-      triangles[i].rz = 0.;
-      triangles[i].tx = 0.;
-      triangles[i].ty = 0.;
-      triangles[i].tz = -10;
-
-      triangles[i].drx = drand48() * 5.;
-      triangles[i].dry = drand48() * 5.;
-      triangles[i].drz = 0;
+      quads[i].rx = 0.;
+      quads[i].ry = 0.;
+      quads[i].rz = 0.;
+      quads[i].tx = 0.;
+      quads[i].ty = 0.;
+      quads[i].tz = -10;
+
+      quads[i].drx = drand48() * 5.;
+      quads[i].dry = drand48() * 5.;
+      quads[i].drz = 0;
     }
 }
 
@@ -659,29 +703,27 @@ void initializeGL(GLsizei width, GLsizei height)
        
 
   if (do_texture)
-       {
-         Create_Texture(Textures[0]); 
-       }
+         Create_Texture(which_image); 
 
-  GenerateTriangle();
+  GenerateQuad();
 }
-void drawTriangles(void) {
+void drawQuads(void) {
   int i;
-  for (i=0; i < NUM_TRIANGLES; i++)
+  for (i=0; i < num_quads; i++)
     {
       glPushMatrix();
-      glTranslatef(triangles[i].tx,0,0);
-      glTranslatef(0,triangles[i].ty,0);
-      glTranslatef(0,0,triangles[i].tz);
-      glRotatef(triangles[i].rx, 1,0,0);
-      glRotatef(triangles[i].ry, 0,1,0);
-      glRotatef(triangles[i].rz, 0,0,1);
-      glCallList(tri_list);
+      glTranslatef(quads[i].tx,0,0);
+      glTranslatef(0,quads[i].ty,0);
+      glTranslatef(0,0,quads[i].tz);
+      glRotatef(quads[i].rx, 1,0,0);
+      glRotatef(quads[i].ry, 0,1,0);
+      glRotatef(quads[i].rz, 0,0,1);
+      glCallList(quad_list);
       glPopMatrix();
 
-      triangles[i].rx += triangles[i].drx;
-      triangles[i].ry += triangles[i].dry;
-      triangles[i].rz += triangles[i].drz;
+      quads[i].rx += quads[i].drx;
+      quads[i].ry += quads[i].dry;
+      quads[i].rz += quads[i].drz;
 
     }
 }
@@ -689,6 +731,7 @@ void drawTriangles(void) {
 GLvoid drawScene(GLvoid) 
 {
 
+  checkError(__LINE__, __FILE__);
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
   /* we have to do this here because the FPS meter turns these 3 features off!! */
@@ -709,15 +752,22 @@ GLvoid drawScene(GLvoid)
   }
 
   resetProjection();
+
+  /* use XYZ scaling factors to change the size of the pulsar */
   glScalef(scale_x, scale_y, scale_z);
-  drawTriangles();
-  
+  drawQuads();
+
+  /* update the scaling factors- cyclic */
   scale_x = cos(frame/360.)*10.;
   scale_y = sin(frame/360.)*10.;
   scale_z = 1;
 
+  /* increment frame-counter */
   frame++;
-  DoFPS();
+
+  if (do_fps)
+       DoFPS();
+  checkError(__LINE__, __FILE__);
 }
 
 
@@ -777,6 +827,7 @@ void release_screensaver(ModeInfo * mi)
        (void) free((void *) Screensaver);
        Screensaver = NULL;
   }
+  free(quads);
   FreeAllGL(mi);
 }
 #endif
index 828128617a052a824b97ee15bc34cb05373b359b..0256cf0b7c9f0b0f1fde0e6778ae14672a8d0ce1 100644 (file)
@@ -1,5 +1,5 @@
-/* xlock-gc.c --- xscreensaver compatibility layer for xlockmore GL modules.
- * xscreensaver, Copyright (c) 1997, 1998 Jamie Zawinski <jwz@jwz.org>
+/* xlock-gl.c --- xscreensaver compatibility layer for xlockmore GL modules.
+ * xscreensaver, Copyright (c) 1997, 1998, 1999 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -97,84 +97,3 @@ init_GL(ModeInfo * mi)
     return ptr;
   }
 }
-
-
-Visual *
-get_gl_visual (Screen *screen, char *name, char *class)
-{
-  char *string = get_string_resource (name, class);
-  XVisualInfo *vi = 0;
-  Bool done_once = False;
-
- AGAIN:
-  if (!string || !*string ||
-      !strcmp (string, "best") ||
-      !strcmp (string, "color") ||
-      !strcmp (string, "default"))
-    {
-      Display *dpy = DisplayOfScreen (screen);
-      int screen_num = screen_number (screen);
-      int attrs[20];
-      int i = 0;
-      Bool dbuf_p = !get_boolean_resource ("noBuffer", "NoBuffer");
-
-      done_once = True;
-
-      attrs[i++] = GLX_RGBA;
-      attrs[i++] = GLX_RED_SIZE;   attrs[i++] = 1;
-      attrs[i++] = GLX_GREEN_SIZE; attrs[i++] = 1;
-      attrs[i++] = GLX_BLUE_SIZE;  attrs[i++] = 1;
-      attrs[i++] = GLX_DEPTH_SIZE; attrs[i++] = 1;
-      if (dbuf_p)
-       attrs[i++] = GLX_DOUBLEBUFFER;
-      attrs[i++] = 0;
-
-      vi = glXChooseVisual (dpy, screen_num, attrs);
-      if (vi) goto DONE;
-
-      /* Try without double-buffering. */
-      attrs[i - 1] = 0;
-      vi = glXChooseVisual (dpy, screen_num, attrs);
-      if (vi) goto DONE;
-
-      /* Try mono. */
-      i = 0;
-      if (dbuf_p)
-       attrs[i++] = GLX_DOUBLEBUFFER;
-      attrs[i++] = 0;
-      vi = glXChooseVisual (dpy, screen_num, attrs);
-      if (vi) goto DONE;
-
-      /* Try mono without double-buffering. */
-      attrs[0] = 0;
-      vi = glXChooseVisual (dpy, screen_num, attrs);
-    }
-
- DONE:
-  {
-    Visual *v;
-    if (vi)
-      {
-       v = vi->visual;
-       XFree (vi);
-      }
-    else
-      {
-       v = get_visual (screen, string, False, True);
-       if (!v)
-         {
-           if (done_once)
-             v = DefaultVisualOfScreen (screen);
-           else
-             {
-               free (string);
-               string = 0;
-               goto AGAIN;
-             }
-         }
-      }
-
-    free (string);
-    return v;
-  }
-}
index f740ad7cdc0d7c7dbb5b1cc88e226a7189044362..0aab685bf89b5cb0b49f907b112510d7e08f7d3e 100644 (file)
 static char * matrix[] = {
 "56 837 64 1",
 ".     c #000000",
-"+     c #178618",
-"@     c #26C227",
-"#     c #114410",
-"$     c #7AEB7A",
-"%     c #5AC254",
-"&     c #136314",
-"*     c #1AA614",
-"=     c #52DB51",
-"-     c #127410",
-";     c #169614",
-">     c #062604",
-",     c #32D634",
-"'     c #145417",
-")     c #B2F6B0",
-"!     c #42A244",
-"~     c #62E75C",
-"{     c #2F832F",
-"]     c #3AC237",
-"^     c #246624",
-"/     c #2B7729",
-"(     c #0C360E",
-"_     c #92F294",
-":     c #4CB34A",
-"<     c #298B27",
-"[     c #0E4E0C",
-"}     c #62DE64",
-"|     c #3B9439",
-"1     c #1D5E1D",
-"2     c #26B529",
-"3     c #CCFDD1",
-"4     c #73E774",
-"5     c #32CB34",
-"6     c #021804",
-"7     c #4ED64C",
-"8     c #7AF67C",
-"9     c #2E9A34",
-"0     c #26CB24",
-"a     c #166E14",
+"+     c #020E04",
+"@     c #021804",
+"#     c #062604",
+"$     c #0B3008",
+"%     c #021E04",
+"&     c #114410",
+"*     c #0C360E",
+"=     c #0D3E0E",
+"-     c #0E4E0C",
+";     c #1F561E",
+">     c #145417",
+",     c #136314",
+"'     c #1D5E1D",
+")     c #1C4E1C",
+"!     c #127410",
+"~     c #269624",
+"{     c #1AA614",
+"]     c #169614",
+"^     c #26B529",
+"/     c #178618",
+"(     c #246624",
+"_     c #2F832F",
+":     c #2B7729",
+"<     c #368B34",
+"[     c #3B9439",
+"}     c #298B27",
+"|     c #3AC237",
+"1     c #42D73C",
+"2     c #62DA61",
+"3     c #32D634",
+"4     c #88E688",
+"5     c #1E751C",
+"6     c #4CB34A",
+"7     c #44AB42",
+"8     c #42A244",
+"9     c #26C227",
+"0     c #FFFFFF",
+"a     c #40CC44",
 "b     c #52BB54",
-"c     c #5ED05C",
-"d     c #36B634",
-"e     c #0B3008",
-"f     c #44AB42",
-"g     c #020E04",
-"h     c #8AEC8C",
-"i     c #1E751C",
-"j     c #2AA62C",
-"k     c #42D73C",
-"l     c #286E26",
-"m     c #1F561E",
-"n     c #368B34",
-"o     c #40CC44",
-"p     c #3E9C3C",
-"q     c #0D3E0E",
-"r     c #66E264",
-"s     c #76EE74",
-"t     c #269624",
-"u     c #A1F2A1",
-"v     c #1C4E1C",
-"w     c #3EDE3C",
-"x     c #5ACA5C",
-"y     c #52E24C",
-"z     c #021E04",
-"........................................................",
-"...........gggggg......................gggggg...........",
-"........gggg6gggggg.................g6g6>6666gg.........",
-".......g666>>>e>z66gg..............g66>eee#e>z66g.......",
-"......g6>>>>(>((ezz6g.............66eeeq[q[[#e>66.......",
-".....g6e#m'''&&1[v#e>gg..........6z[-t*;;**2;+-[e6g.....",
-"....g6>v^{{///n|{^1#(6g.........g>e<]k7,]===7]*i[6g.....",
-"...gzze^|:f!|!::!n/^q>6g.......g>zq@}h44rrhh4=o2&ezg....",
-"...g>>[/|b!|nnp!p|n/m>6g.......6e#-o}_4}==r44}=kt#z6....",
-"..g6e[m{:%!{^l/{n!:|1(>6g.....gz[+t7hu4k@5]k=4h}2[ezg...",
-".ggzqml|fxp/''''{!c:/q>gg....gg>&j]}hur5;;;;k4)ho&e6g...",
-"..g6#^/pbx|a[[[[/f}:/#>>g.....6>i2]4hur@++++]4)$o-qe6...",
-".gz>m/npfbnl[#[#l!x:{'(e6....gzqto=44_=@++++54uh7;[q6...",
-".g6em{|!!f{a[[[#/|xf{1#>6g...gzqjk}444w@+++-]}u$7ji#>g..",
-".gze^n!fff{1q#[#l|%:{^v(6g...6z#2=r4$4k2--+-]ruh72+[zg..",
-".g6e^n!!!p{&[[qq/|b:n^m(zg...g>#d=444r,2++--5}uh=2t[>g..",
-".g6(l|:!!p{'q##ql!%:|^1q6g...gz[]}h44r,*----]4uh}]j&>g..",
-".66e^|f!pp/&[[##/|%:|lmq6g...6>#dr44~r0*++--]}uh}]t&>g..",
-".66(mnpf!fn&[[##/|%:{mv(6g...6z[j=r44$=2++--5ru$=j+[>g..",
-".g6e1/n!:bn^[[[[lpbf{mq>6g...gzqjo=44_w@++++]}u47t&q6g..",
-".ggemln!:b9^[[#[l|%!/v(>g....gzqt]=4h_=@++++@ru4o+'e6...",
-".gg>#ml|:x!i['''/!%:/#e>6....g6e-j]}huy0+;;;54uh,-[ez...",
-"..g6([mp%}f/''1^{fx!/q>gg.....g>[+jy_)$,;;2274u4o&e6g...",
-"..g6e(v{%cfi'&&lnfc:/e>6g.....g6q&+7u)40;22@=4)h][e6g...",
-"...g>(#l!bp{a//{n|!/1e6g.......6e[-o4h~k@@0k7}47jq>6....",
-"...g6ze1/nn{<{n|n/l1#66g.......g6eqjo==7k=y}=kbj-z6g....",
-"....gz>q1l{npp!pn^#(e6g.........g>e&j]k=rr4472-'q>g.....",
-"....gg6(#mm^ll//^vq>6gg.........g66'-tjd]]]od+&q>gg.....",
-".....gg6e(##vvvvq(>6g............gg>q[--<<+<-[e6z.......",
-".......g666>>zz>z6g6...............g6>zeeeee>z6z........",
-"........ggg66zg66gg.................ggz6z>66zgg.........",
-"........................................................",
-"............g.g.........................g.g.............",
-"..........gg66g6gg....................g6>z666g..........",
-".........g6z>e>z6gg..................gzze#q>z6g.........",
-"........g6>(qe(e>zgg................g>e[&[[qe>6g........",
-".......g66vlnll^mv#eg..............g6>+]=5]2t+i[6.......",
-".......g6>^|%:|{/l^ve..............6>edruhr7k]d<#.......",
-".......66>{%8}%!nn/^q..............6zq7u3)u4}7]d&.......",
-"......g6>(/x8c!{/^mqe.............gze#ou3)4oodjiq.......",
-"......g6>({b8%|mmvve6.............g>e[7u3u}j9<iq>.......",
-"......g6een%8b/#q>>6g.............g>q[7u3_o-&qe>g.......",
-"......g6>(nb_:/qee6gg.............gzq[7u3ho&[qz6g.......",
-"......gz>(nb8:{q(>z6..............g>e'7u3hk&[e>z........",
-"......g6een%8b/qe>g6..............g>q[=u3ho&[e66........",
-"......g6een%8b/q>>zg..............gzq[7u3h5&qe>g........",
-"......66>enb8:/ee6gg..............zze[=u3ho[qzzg........",
-"......g6e(n%8:/q>>6...............g>qv7u3ho&qe6.........",
-".....g6>>enb_:/qe66..............g6eq[=u3$]&q>6.........",
-"......g6eqnx8b/(>>gg..............z>q&7u3hk[qe6g........",
-".....g6>eenb8b/qe>6g.............g6eq[=u3hk&qe6g........",
-".....g6>eqnx8b/qe>gg.............g>e[&7u3h0&[e6g........",
-".....gg>eq{%8b/(ee6g.............g6e[&=u3_o[[q>g........",
-".....gzzeqnx8:/(e>6g.............g>eq&cu3ho&q(zg........",
-".....gzee#{%sb{((>6g.............g>q[-=u3_k&[e>6........",
-".....6ge#mn:c!{&#q>6.............66[-97h)4k*-&e6........",
-".....g6qv^{f%!{^'q>zg............gz&<d=4u47];&qzg.......",
-".....ggqmln|f|{lm#e6g............g6&j]7}4}7]ji#>g.......",
-"......geqvm^/^mvqe66..............gq&<jdo]9{&q>6........",
-".......gze(q#qqee6g................6eqv&i&&q#>g.........",
-"........gg6g6gg6g...................g6666666g...........",
-".........gggggg......................ggg6gg.............",
-"...........ggggg.......................ggggg............",
-"........ggg6zgg6gg..................gg6z>zz66g..........",
-".......g6z>e(e>e>6gg...............g>>eq[q#qez6g........",
-".....gg6>eeqqqqqeezgg............g6>e[[&&&&&[q>6g.......",
-".....g6>##vv#v[[#q(>6g...........g6q&-++++++-&[qzg......",
-"....gz>m/n{ll^^^^^/1qg..........g>eto=7@]@22@]oj'6......",
-"...gg>el|%!|{{{{n||{v>g........g6e[]ru4}kk7k7}r7<eg.....",
-"...gzeq{bc%pn{nn|!b|m>g........g>q&7h)u4==7=r4h}jeg.....",
-"...g>qv{bc:|/l^l{|fnm>g........gq&+=h)$=55@]7}h=9e6.....",
-"...gev^|bcp{&&'m^np{m>g........6[+d}_u4k2**;]=r7teg.....",
-"..g6qm^|bx|l'[[#m/|{v6g.......gz&t]}hu}5;++-jo}7<>g.....",
-"..ggev^|bc!i[[##vm^me6g.......g6'+d}_u4@++a-+jd9'zg.....",
-"..g6e#m|:c!/[[#(####>g........g6[ij}h)45++-&-ii&eg......",
-"...g(#m|bc!i[[#q(e>6gg.........6[ij}h)40;+-&[qe>zg......",
-"...6e(v{!%p<a'[qee>zg..........6q[+74ur,@*+&[(ezz.......",
-"...g6e(/|f!n{a1(qe>6gg.........gz[&]}$r=,@*&&qe>gg......",
-"..g6zee^n|!!p{&#q>>66g........gz>q[2=r44r,*-&qe>6g......",
-"...g6>e'l{n9!{i'vq>>gg.........g>e[;@ky=~,0*+&qe6g......",
-"...66>e[1l{|f|</&[(e6g.........6>e[+j@kr~rw02+[q>6......",
-"...gz>(#['itpp9|/1q>>6g........gzq[-+;5w4~=y0*&qe6g.....",
-"..g6eeq['1lt|ppp{^'#e6g.......gzq[-+;*5wy~~~k@;-[z6.....",
-"...ge#m1&-{{{t9!p<{^#>6........6#-;*20,,kwy~~=,2-ez.....",
-"...6qv1ll{iii<pffp|/m>zg.......z&<2]@,500wr4~r}ktqzg....",
-"...6(m1i{{<{{tpf!f!<megg.......z'tj5k=wk,wr$$44=tqzg....",
-"...ge#m/np9||!f:ff!n'egg.......6qit]=ryyr~4$$44=tq6g....",
-"...ge(v/n!f!ff:f:!p{m>6........g#&<o}444$4hhh447tqz.....",
-"...g>(q^n!!!!p!!p||lv>g........ge[-d=4444444r}}o+e6.....",
-"....g>evm^lll/ll^^^v(6g.........6eq+9d]]d5]]]dd<'zg.....",
-".....g6>e(q(#q#qq((e6g...........6>e[v&&-&-&&[[(zg......",
-"......gg66>>>>>>66ggg.............g66zeeeeeezz6zg.......",
-"........gg.6gg6g6gg.................ggg6666zzgg.........",
-"..........gg6ggg......................gg6ggg............",
-"........g666>>>6gg..................6z>>eeezzg..........",
-"......g6z>e(qee(ezgg..............g6>e#[&[[[(>6g........",
-".....gg6eeq#####ee6gg............gz>q[&-----[qz6g.......",
-"....ggzqm1mmm11mvq(>g...........gzz&;jjtjjjj+&[e6.......",
-"....gz>m{pn/l//n/^m#>g..........g>q97~=o5ok=odtiqg......",
-"...g6>(/fx:p{n|!|{/mqg.........g6e[o4uhrk=}4r759v6......",
-"...g6e#nbc:|{||!|n/^q6.........g>#-=_)hr,=r4r=kd&6......",
-"...ge(vn:cfnl/{n{//mq6.........gq&{7h)47@o777o]9&>......",
-"...gevm|:c!/11lllllm(g.........6[+j}h)45*2@]o]]9'6......",
-"..g6qv^|:x|l'1mm^^^m(g........gz&<2}hur5;jjjdddt[g......",
-"..gg(#vnfxfn^a1mvv#(>g........g6[-t=hu4=@@*t+<i'eg......",
-"..g6>ev{fxf|</m#qeezg.........g6e[+74u$}k5j-a[qeg.......",
-"..g6>e#{!xbpn{m#ee6gg.........g>q[-k$u$4=5j-[qz6g.......",
-"..gzeqvn!x:f|{^#qe66g.........gzq&+k4uh~rk2-&qzzg.......",
-"..g6e#'n!%:f9{^mq>gg..........z>[-t=$uh4yk@t&q6g........",
-"..gzq[mnfx:!|{lm#(zgg.........g>&+j=$uh4r7]t-[>zg.......",
-".g66v^/|!:pn/^1[qez6g........g6z+20}4h~75@j+&q>6g.......",
-"..g>m/n|ppn/&'vqe>>ggg........ze9]=}rr=,2;+&[(e66g......",
-"..6>mnpp!9{&'[qq(>ez6g........zej=r~~y,2;+-&[qq>6g......",
-"..g>m/nppp{a[[[['1mveg........getorrrr,@++++;jj+[6......",
-"..g6vl{n!!{^'1'1l{n/v6g.......6>+]7}r4k@;***@k}o+>g.....",
-"..gzqml|p:n-''&l{!b|1>g.......g>&j]=4hk@;*2]74_rjeg.....",
-"...gq#m/n!n/&ll{{np{m6g........6[ito=~=02@@k7}}79zg.....",
-"...g>e#1/{{{/{{{n{{^q6g........ge[ijo=k,ok77777d&>g.....",
-"....66e#1ll{nnn|nlmv(gg.........6>#-j]]7===r=]j+[zg.....",
-"....g6gqvm^^///llmvq>6..........g66&+jd@]oo]]j<&e6......",
-".....g6>(q#vvvmmvq(egg...........g6e[&i++ttt{&[#6g......",
-".......gg6>>>e>>>6ggg..............g6>eeqqqeez6gg.......",
-"........ggg6g66666g.................gg66zz>>zzg.........",
-"...........gggggg.g....................gggggg.g.........",
-"..........g.g.........................g.g...............",
-"........g6g66gg.....................66zz66g.............",
-"......g66e>>e66gg.................g6>qe#q>zgg...........",
-"......g6e>((ee>6g.................g>qq[[[qe>6...........",
-".....g6>#[milmq>66...............g6q-+*@5t&ez6..........",
-".....66qvm{n!{1(e6gg.............6>&+jo}r,j[q>6g........",
-"....g6>v^l!%c!l((e6g............g6e+25~u)$5&[qzg........",
-"....g6z[^{p:cfn&[ezzg...........g>e+dk4h)4k2+[>>6.......",
-"....6z>'a{!:xfp{a[>z6g..........6>q;@krhusrk@+q>6g......",
-"....6>em^{|:b:!p{1(e6g..........zeqt2kr$_h4r,*[q>6......",
-"....g>>ml<|fbbf!n^[qe6g.........6eqt5ky4h$$$=@+&qzg.....",
-"...gzz(&/<9fffffp{im(>6g.......g>e[*5w=~$s4~rk5;&e>g....",
-"...gz>('/<9pfff!f9{/[e6g.......g>q[*0wy~~~$$~==5+qz6....",
-"...gzeq1/t|jffj:ppp{1(>6g......gzq&j5wyr~s~44~}7j&ezg...",
-"...g>e[a{|!!dfp!p!f|l'(zg......ge[+@ky~~4~~r~~4y];&eg...",
-"...g>q[^|!j::j!<!f:p{1#e6......zq&+@y~~ss~~wr$$4,j-qz...",
-"..g6e#&i9f:::f!<9:%!n^v(6g....gz#-*5=~sss~~w=sh4=2+[>g..",
-"..ggq'1n!b]xxdj!f!f!{^'ez.....g6&t2=~__uus~~~4h47@t[z...",
-"...6q1l!bcxccb:j::dp{lm(6......6&j]~huuuu_s~$$$r7]9'z...",
-"..g6qm/pbxcxcx:d!!p|{lmqz.....g>&jo~_uu)uuss~4r}7]t&>...",
-"...gq[1{!dbdbj|<{{llmvq>g......z[+*k~$$s$~ykw,]@j+&qg...",
-"...6>e#l{ppp!<{&1''[qe>6g......6e[-]kr~~4w52*;;+&[q6g...",
-"...g6>>'^{{n|i1#((e>>z6g.......g>eq;@kk==52-&'qqe>zg....",
-"....6ze[^i{{{^[e(>>z6g..........6eq+25ok=@+[[qqzzg......",
-"....g6zqm^a//1#e>zzggg..........g6z19d@o]j-qe>>6gg......",
-".....g6qvm^^lmq666g..............6>&+jdd]t&>z6g.........",
-".....gge(##vvqe6gg...............g6#'ii++&qzgg..........",
-".......g>e>e>>gg...................6eqqq#egg............",
-".........6ggg........................6ggg...............",
-"........................................................",
-"........................................................",
-"........gg6g6g6ggg..................gg666666gg..........",
-"......g6>>ee(e(e>6g...............g>e#q[[[[[qz6.........",
-".....ggeq#vvv'vvq(z6g............g6q&i++<t++&[>zg.......",
-".....6>(vm111m1^v#e6g............6e'<tj2jjjd<i#>6.......",
-"....gzevmll{{nnn{^v#>g..........6e#+joook==}kd+&eg......",
-"....6>q1/nnnn!fb|{mveg..........6q&j]===r4$hr7j+[g......",
-"....zeq^{|p!pbxcb|/m(6..........>q&d7r~4rhu)_}o9'z......",
-"....ge(v^/{n{|:bfn/m#6g.........6q[td]k=krhh$=oj&>g.....",
-"....6ze#m1aii<|f|n/1q6g.........ze#-;2@00w=$rk]j&6g.....",
-"...g6>e(#['1&i{|n{lm#gg........g6eq&-+;**0kyykoj-6g.....",
-"...gg>>#'1ai/|9fp{/1qzg........gzeq-;2@0,wy4rkoj&>g.....",
-"...g6>('a{{|t!fbfn/mqgg........gze[;@,,=y$$h$=oj&6g.....",
-"...g>>(m/n!f:bxx:|/mqzg........6>q[jo=4sshuuh}o9&>g.....",
-"..g6e([/|!!!f!f:|{^veg........g6q&+0=$4~~4$hrk2+[6......",
-"..ggev1<!%fp{nnn/1vq>g........gz[+j=$h4r=k==o2+&eg......",
-"..6z#1l!bxftii^1mvee6g........6>-*5r_)4w5@@2t{[#zg......",
-"..g>#l{!:x!{a&1'#q>6gg........gei]74hu4,@2*;-&q>6g......",
-"..6>'/n!:fnl1''[q(ezgg........6et]=4$hy5*;;+&[q>6g......",
-"..gzm{pp|!{&[##qe>>z6.........ze97~rrr,2+--&[qezz.......",
-"..g>m/np||{&[q##qqe>g.........geto}rr=k*+---&&[e6.......",
-"..gg#m/{|p{a'&&^^m^m(g........g6ij],r4,@;**22jdt'g......",
-"..66(#m{|p{^'1l/{{{l#g........z6'-jo}r7@;*]o777]i6......",
-"...geq[ln!{^'^/nn{|/#6.........zq&+]=4w@;@0===}oi6......",
-"...g6e(ml{/ial{n/{lm(g.........g>q&*]7o5@o7=77]j'g......",
-"....66>#'^l//{{n/^m#eg..........6>e-t2]oo777odjiqg......",
-"....ggze#'^/{{/{/m#(6g..........g6z[-;2o7o77]9iv>g......",
-".....g6>eq#vmm^mv#e>6............gzeq&i;tjjj<iqe6.......",
-"......gg6>eeqq((ee6...............g6>eq[&&v'qq>g........",
-"........gg66g666ggg.................g666zz>>6gg.........",
-"..........ggggggg.....................ggggggg...........",
-"........................................................",
-".......gg>>>ezg6gg.................g6eqeqe66gg..........",
-".......eq#vmmvq>6gg................q&i<9j+&#>6g.........",
-"......gqml//{^vqe>6gg.............g&9]5o7d+&qezgg.......",
-"......g#ml/{n/^[#e66g.............6&j]o7=]2+-[>>g.......",
-".....gg(vm^//{{/^'(>6g...........gg'{tdo7k7,2;[qzg......",
-".....ggz(#m^/{p!n&#(>6g..........g6e[-j25k}4=2-[e>g.....",
-".....gz>e(mm^n!:p/'#(6g..........gzeq[;j@74hr5;-[z6.....",
-".....66>eq['&/<!|nn^[ezg.........z>e[&+;25wrr==@+q>6....",
-"....g66eeq['&^{t|pf{^(z6........g6>q[&+;*@,wy~$=2[>6....",
-"....gg>>e([''aa{9fb!^q>6g.......gzeq[&+;;@@ky4h4]&q>g...",
-"....6zev^liii<<pf%c:/qe6g.......6>q+2@000wwr4_)h5&qzg...",
-"...g6>q^n!p||pffbx4b{[>>g......g>q&d=4rryr~$_u)_,+qe6...",
-"..gg>e#{!x:f!f:bxrsxn[e>6.....gge[-,4uh4~4shu)3u=+qe6...",
-"..g6(v1nf:f9+|9pdxrb{[e>gg....gz[+27$h4ywyy~$))u,+[e6g..",
-"..g6#^l|f:|{aii{|fc:{q(>6g....g>i2o}$hrk205,=$)hk-[e6g..",
-"..6>m/||f!na1''&/!%!i#(>gg....zeto}r4$k@****,4_4@-[#zg..",
-"..g>m/p|!!{&'''&+p%!{qe>gg....gejorr44k2;;;*,ru$o-qe6g..",
-"..g>m{|p|p{a['''/pxfi#ez6.....6e97}r}~,@+;;;5ru40-[z6...",
-"..g>m{p|||l&'[[[{9x!/qe6g.....6ej7rr}}52;+;+,ru$]&q>6...",
-"..g>vln|||{&[''&{!%!iq>zg.....ge<o==rr02+;**,4u40&q>g...",
-"..ggqmlnp!na'&&^{!%!l(>zg.....g6&t]=~$=@;*2@k4u4][e>g...",
-"..g6e(v/!b|l'&//|!b|1ezg......g6q&+o4h=0*25o=4hr2[z6....",
-"...g>(#l|!n/'li{{|!n1>6g.......6e[i]}$=5*@5k7r4=j#6g....",
-"...g6eevl{lill{{{/lmqz6g.......gzq[<]ko@]5k77o]9&zzg....",
-"....g6>(v1^///{{lm#(>gg.........g6e&+jdoooo7]j-[e6g.....",
-"....gggeq#1^//l/mv>66gg.........g66(&-jdo]ooj-q>>gg.....",
-".....gg6>(q#vvvvqez6g............gg>q[&-<++{&q>6g.......",
-".......g66>e>>e>>6gg...............g6>eqqqqqe66g........",
-".........ggg6g6ggg...................gg66666zg..........",
-"...........ggg.g.......................ggg.g............",
-"........................................................",
-"......g6>e>eee(e>e>>6g............gze(#[[[[[#qqezg......",
-".....g6eqvmmmvvmvvvq>6g..........g>[&+<tt<+t+++&qzg.....",
-"....g6e#m1^lll^l1^mmqe6g........g>#ij22]@]@]ddjt&#>g....",
-"....6>(m/n/{{//{l{l^vq>g........6e[9o=77oooooood<&e6....",
-"....g>q/!%f|nnnnn||n^vq>........6e&oru4r=====rr=d+&e....",
-"....>e#nb4xf||nn|!:|/m#e........e#i=u3u4ry==r4hr]jiq....",
-"....6e#|%4x:|||n||p|/m#>........zqi}u)uhy}y=}r4}o9iq....",
-"....g>(/!x:p<{/l///^mv(>........6ev74uh~wko@]oo]ji'e....",
-"....66(^|:p|{aa'vmm##(eg........zz[d}h~},@@;;tti^'q6....",
-"....66e1n!n{{l1#qq((ee>g........z>qj=4==k@*-&&&[[qe6....",
-"....g66v^/n9p{&q#eee>66.........g6>+do==r,2-a[qqe>6.....",
-".....66qv^{|:{^qqe>66g...........6>&<27rh72&&[ez6g......",
-".....g6>q#/|b|&qee>6g............g6(&+or_w@&[qe>z.......",
-"......g>e#ln!nl[qe>66.............geq-]7$7@+&[e66.......",
-"......ggzem{|n^1ve>6g.............g6e(j7}=@*+[e>g.......",
-".......66>m/|{l1vq>6g..............6>eto}7]j+&e>g.......",
-".......gz>qm^//{^#>zg..............g>e&j]]kk@-e>6.......",
-"........g6eqvln|/m>z6g..............g>q&+]7rote>6g......",
-"........g6zee1n:nm>>gg..............g6eq[2=h=*qe6g......",
-".........g6>emn!n/q(>g...............gzeqj=$=]-[eg......",
-".........g6>>m/!n/^veg...............gzeeto4y]d<#6......",
-"..........g6>vl|n//mq6................gze+]}=7]j&6......",
-"..........gg6qm///{lqg................gg>^9ooo7]&6......",
-"...........ggeqv^/{lvg.................g6q&<do7]i6......",
-"............gg>evl|/#6..................g6eq<]}ki6......",
-".............gg6qmlm(g...................g6>^9]jmg......",
-"...............ge(#(>......................gqvive.......",
-".................gg..........................gg.........",
-"........................................................",
-"........................................................",
-"........................................................",
-"...........ggggggg.....................ggg6ggg..........",
-".........ggg66z6g6gg.................g66z>z>666g........",
-".......ggze(qqq#eez6g..............g6>#[&&&-[qez6.......",
-"......g6>e#v11m1m#(ezgg...........g6eq-<jjjjt-[q>6g.....",
-".....gg6eqm^////l1qqe6g..........g6>#&t2ook5]j-&qz6.....",
-".....g6qm^ll////ii/1#>6g.........gz&j]]oo55o00oj-ez6....",
-"....gg>m{|n{l/il{np{1(z6........g6et7}=k@555k=~7j[>6....",
-"....gz>l|%p{laiinfx!iq>6g.......g>e]}_rk@@@@=4u45&q>g...",
-"....g6e/fx!{iiii<fx!l#e6g.......gzqo$u4k0000w4u$]&qz6...",
-"....g>e/:cf<^aaa|fx:{q>>6.......6e#oh)4k@@@@w$u4,-qez...",
-"....6>e{:}ftaaa&<fcf{[ez6g......6e[7h)sw@@@@,$uh,+qe6g..",
-"...gg>(lfx!9/{{{pb%:{[e>6g.....gze[]$u4w,0,,~su4,+[e>g..",
-"...gg>(l|:f!fjfd:]x!i'e>gg.....g6e[]}$$~~~4$s_u45+[e6g..",
-"...g6e(m/|fdbxcccxxf/[#>zg.....g>q[jor~s_uu)uuu$0+&q>g..",
-"...g6>em{n:%cxcccxbf+#(e6g.....g>e[j5}$_uuuuuu_~,+[q>g..",
-"...gz>(l{ff:xbb::bx!{'(>zg.....gzq[@=~4su__$$_u$,;&qz6..",
-"...gzee/pb]b%dfjfdx!{'#e66.....g>q[5~s___$~~~$u~,;&qz6..",
-"...gz>qipb:]bf9<p:bf{1#e6g.....g>q&5rh$_s~yw~$_4k*-[zg..",
-"...gze(/!xfp9<{i<9fp{&[(6g.....g>q&5$u$ryw,0k=$rk2+[>g..",
-"...g6zq/fxf<iia-/<!9{^m(>g.....gze&o4u~w00@@,w4rk@;&e6..",
-"...gz>q{:x!{''&'i<|n{^&qz6.....g>e&7hu4,****0,==k]j&>6..",
-"...gz>e/!cpia'&'in:!{^m(6g.....gzq[]4)r02**;5yh472;'zg..",
-"....6ze/!x!{&1&'ip%:{mv(gg......6>[o$u4,2**;0ruh7j+'6g..",
-"....66e/!%!/&''[/px:n1#e6.......z>q]4u~02*;+54uh=jiqz...",
-"....ggzm/|{/aa&&/n!n^#e6g.......g6>to}7o@@22574=di[>g...",
-"....gg6qm^ll/ll^///lve>6........gg>&9d@]0]@]5oo]<[e6....",
-"......g>e(m^l///l^mv(66g..........ge[&td]o]o]dj+[>6g....",
-"......ggz>qv1mmmm#v(>6g...........gzzq&+jt9jtii'e6g.....",
-".......g66>eq((((e>>.g.............gz>e#&''[[qqegg......",
-"...........6g6g6gggg..................g66>6>66gg........",
-"............gggggg......................gggggg..........",
-"..........gg6666ggg...................gg666zggg.........",
-"........gggg66666ggg................ggz6>>>>>z6g........",
-".......gg6eqv#vv#(e>gg.............g6>q&ii++-[qe6g......",
-"......g6z>#m^^^^1#q(z6g...........66>e-t@dddji&[e6g.....",
-".....g66eevl////l1[q(6gg.........g6>q[+@oooo]*+&[>6g....",
-"....g6zqm^ll///lll/^v(z6........gz>&t@]]o5o@5oo2+[e6....",
-"....g6>v{|{{/l^^/n|n1qe6g.......gzqtk==k55@@]=r=2&q>g...",
-"...g6z(^|:!nii&&{!:!lv(>g......gzz[drhr=5@22k~h4o+[q6...",
-"...g6>(lp:|{l^&1lnf|{'#e6g.....g6q[5rhr,@2**5=4rot-q6g..",
-"...gze(/pb|i&&''anpn/^'e6g.....g>q[o~_}52*;;@=r=o2t[>g..",
-"...g6e(l!b|i''''^/n|/^mqzg.....z>q&54_=0;;;;25}=k]j&z6..",
-"..g6>(#{!xpi'&'[a{||{l1qz6....g6e[-o4ur0**;;@kr=k]j&>6..",
-"...6z>q{fxp+'&''a{!|{l1q>g.....6eqak$uy,;**;@k~rk@j&eg..",
-"..g6eeq<:x!/'&1&i{!p{lmq6g....g6qq-kh)~,****0krr7]j&>6..",
-"...6ze#{:c:ti-ia{p:p{^vezg.....ze[a7$usw000@krh4k2+[>g..",
-"...6>>q<bc%dp|t|pfb!/m#e6g.....6eq-k_)_s~ywyr4h4oj-q6g..",
-"...gzeq{b}cbf::fbbx!{v(zg......g>q&kh)u_4s_4__u$k+[eg...",
-"...g6>q/fxx%b::p!ff|^qe6g......gzq&o$uu_hhs44$$}d&#>g...",
-"...g6>>^n!fbbf|{{{/^ve66.......gzeq2=44h_~},o7o]+[z6....",
-"....6>e'inpf:p+''mv#e>gg........6eq;5=~4hr,*;;+-#ezg....",
-"....gg>#1i|!b9{1'q(e>66g........g6eij5=4h=k*;-&qq>6g....",
-".....66(#'{t!|{i^[(e>ggg.........6>[-tky$rw52+&(e6gg....",
-".....g6>e(^nf!pni'(>zzg..........g6e[&d=44r=5;[q>>g.....",
-"......g6>>m/p|||{1qe6gg...........g6eq*or}r}o*&q>zg.....",
-".......66>qml/{n/1m#e6.............z>e^t]o7=o2;iq6......",
-"........gzeeqm^//llmeg..............gzq[&t2oo]]9[6......",
-".........gg6zqml^/lm#6...............gzze&9]]o]j&6......",
-"..........g66eqvvvvq>g................g6>q1<{<{&eg......",
-"...........ggg6>>e>6g..................gg6>e(qe>g.......",
-"..............ggg.g.......................6gggg.........",
-"........................................................",
-"........................................................",
-"........................................................",
-"........................................................",
-".............gggg........................gg6g...........",
-"...........gg6ee>g.....................g6z#qe6..........",
-"..........6>(#ml'#gg..................6q[ij]t&6g........",
-"..........>(v^{|/v6g..................e'+d7ro<z6........",
-".........geqv/|:n1>6g................g#&<orh=jez6.......",
-".........g>(vlp%|mez6................gevi]ru}jq>6.......",
-".........g6>(l|%|le>zg...............gzq'b}ur][e>6......",
-"........g66>e^px|lq>z6..............zz>e#]rur]&(>6......",
-"........ggz>(^|:|l'q>6g.............g6>q[d}$}5;&q66.....",
-"......ggzz>eem{!n/^v(z6...........gg>zeq[*747o2+&>6.....",
-"......g66>>((1l|{{l1qzgg..........gzzeq[[jo}=7]j&z6g....",
-".....g6ee##vvml//{/lv>6g.........66#[--++*]ook7]+e6g....",
-"....666qm1m111m^/{|/'>6gg.......6zz&tj**j*j257}ot#>6g...",
-"...g6z>v^/l^l&'[l{!{1(>6g......g>>q+2k5@]2;+@k47j[e6g...",
-"..g6>q#m/{i^m''#^{!n^q>6gg....g6q&-joo]2*;;+274=2&e>6g..",
-".ggzqm^l/{/&''[[a/!n1qe>6g...gzz&t2]ok52;;++@kr=2&qez6..",
-".gz>vl/{{{^1[[[v^{!n^q(>z6g..gze+]]kk7@*++++2k4=2-[q>zg.",
-".g6em{||n</&1''&{|:p<^m[qe>..g>[j7r}=k52***2,}hrk@t+&[e.",
-".geq/pb!|{{/^i{{|:%b!pnl^v(g.zq&o4h4y=k0@@,krhuh4r=o2+[6",
-"g6e#nbcb!{{{{npf:%cxxxb|/^#zg>qi=_)h~k7,k=r$hu)uuuhrodi>",
-".6e#/:xp{{/ii{n|!!::::p|/mqz.>q-7hu4=o55]k7}r4hhhh4}oj&z",
-".g>q^n!{^m1''m^1l/////l^1v(g.6e&d747@tj;tj2d]]oooo]dj<'6",
-".6>evl/m'(eee(e(qq#q#####qeg.zeqt]]j+&[[['[[^&i&iiiii&#g",
-".g6>qm1#(ee>>e>z>>e>e>e((e6..g>e19ji[qqeeqeeeq#eq(q''q>.",
-"..g6e(qe>66z6g6z6z666z66666...g>#'&[e>>>z6>z>zz>z>>z>>6.",
-"....g6zg66gggggggg6ggg6g........g>zz66gggggggg6gzg6g....",
-".......................g...........................g....",
-"........................................................",
-"........................................................",
-"..........g66gg.......................66>6g.............",
-"........g6>eqe6g....................g6e[&q>g............",
-".......ggz(#mq>gg..................g6>'it&q6g...........",
-".......6(qvm^vq6gg.................>[&+jd<'66g..........",
-"......gev1l/{^#>6gg...............g[<j]k72-ez6g.........",
-"......gvl{n||/'>>zgg..............gi]c7}}o;qe>6g........",
-"......g(^/n||/^vqe6gg.............g&d7=}}od+&qz6g.......",
-"......g(#ml/nn{/&#ezgg............g'i9]o==kk2-q>6g......",
-".......g>(ml/np!{1>>6g.............6evt]7=}47jqe66......",
-".......gg6#m/{!fn^#(>zg............g6>ijo74h=d-[q>6.....",
-".......g66(#m^/n/{/^#e>g...........g6>[itd]=kko2iqeg....",
-"........g6>(qvm^/n!{^q>6............66e[^+j2o74=2&qz....",
-"........gg6>e(#v/|:!/#(>g...........g6zeq[-<o}hroi[eg...",
-"........gg6zeeq#l|bp/ve6g...........ggzeq[&+]}h4]+[>g...",
-".........g6>eeq[l|:!/vq>g............66eq[&+@}_4o<&eg...",
-".........g66>e##^|:p/ve>g............g>zq[a-]}h4]+[eg...",
-"........gg>e(vml//n/mq>g............ggeq[+*]]7=o9&q6....",
-"........g6>e[^/n{lmmq>zg............g>([+2o=7]jt&q>g....",
-"........66(#vlnp{^qe>66.............6z[-+]=47d&'e6z.....",
-".......g6ev^{{/{^v(>zgg............6>q<d7777]+[e>6g.....",
-".......ze(^npn/mvee66g.............>#&d=47oj{[qzzg......",
-"......g>(v/!%p^(e>ggg.............ge&i74urd[qe6gg.......",
-"......g(v^/|p/m(zz6g..............g'<do}}o9[e>zg........",
-"......gq^{/llmq66gg...............g&d7ob]t&>zgg.........",
-".....ggv/|/m((e6g................gg<o}k9&'qzz...........",
-".......qm/m#(>ggg..................&j]9i'e6gg...........",
-".......>(vee6zg....................e'<[qz>g.............",
-"........gggggg......................g6gggg..............",
-"..........g...........................g.................",
-"........................................................",
-"........................................................",
-"........................................................",
-".........ggg6g6g6g...................gg666666g..........",
-".......gg6gz6z>z6g6gg..............g666>>>e>>666g.......",
-".....ggz>((q#####(e>6g...........gg>#[[&-----&#ezg......",
-".....g6eqmmm1^^l^m#(eggg........gg6[&ttjj2@b2t-&#6gg....",
-"...g66>qm^ll/{nn{l1vqzgg.......g6>e&t]]]o7==7]j+&e6g....",
-"..gg>e#m^llll{npn{l1vq(>g.....gge[-t2@]]]k=4=k]j+&[e6...",
-"..g6qml^l/^&1/p:pn{ll1v(6g....6>&9]]b5@2*or$4=,]]j+[zg..",
-".g6>mln{/l^'[/|bf|{{/l^#>6g..gzeto77k]2;+5}_4r=koodie>g.",
-"gg6e1{|{/l1'[/p%:p{{{{lv(>g.gg>#j7}75@j;+5ru$}kkkko<[e6.",
-".6e(^n|{1''#ql|bp{all//1#(eg.zq&d=}k2;;a-5}h4k@5]o@j-&qg",
-"g>e#l||{mqq##a|bp{1&/{/^1#ezgeq-]}roj----@=_}k*257k@ti[>",
-"g>e#/|!l'qqq#^n!|/&al//l^mq6ze[io}$];&&&&@=4r5*@55o]dj&z",
-"6eqvlpf{'q(qq'/|n{/{/ll//lv>6q&{5}$o;&&&&*o==koo5@]oo]<e",
-".e#m{|!l&(q(([^l{{|{ill{|nm>g#-97r$5*'&&[+2ok=yk5@@7y=9#",
-"6e#v/pf/1q(qe['1/{p|i&^{|n1(6qito}$k*&[&[+;25=~y52@xr=j[",
-".zev/|f{'#qeq(['lnp|{ll/n{vegeqior47*--[&&+;574}75]k77<q",
-".g>(lp:n^[#(((q#anf!nl//{/v>.6e'brh=2+-[[[&-@7$475@o7o<e",
-".6ge^|!{l'#q(e(qmn!!n{l//l#>.z6qd}47];--[[[&j=44=oooo]ie",
-".gg>v^{ll^1''#qq'l{{nn{l^v(g.g6e<do]]2*t;-&&;]77==7]2t'6",
-"..gge#vm^l^1^'#e#m1/{pnl##>6..gzqi<9d]djd;-[-;25=rybi&e6",
-"...gg>eqm//ll1[e(##m{!|^(>gg...g6eqij]o]]j+[&-ij74}d&ezg",
-"...ggg>(#vvvvq(ee((vm^^#>gg....gg6e[i<<<+&vqq[[ij]die6g.",
-".....g66eeeeeeee>>>e(qqe6g.......g6>(#[q[[#qeqeqv&&q6g..",
-".......gggg6g6z>6666gggg...........gg66666eez6>66zgg....",
-"..........ggggg6gggggg................gggg6zgggggg......",
-"...............g...........................g............",
-"........................................................",
-"........................................................",
-"........................................................",
-".........gg.g........................gg.g...............",
-"..ggg6g66g6g6g6ggg............gg666z66z6666ggg..........",
-".gg>>>ez6zzz>z6666gg.........g6eeqq>>>>>e>>>z66g........",
-".z>eeeq(ee>>e>e>>z6ggg.......>e[#[&[qqqqqqqee>z6gg......",
-"g>#vmm''['1^^^'[###(>6g.....gq-<tt;;;;*2@2;+---[qzg.....",
-"6qm^^/ll^i{||{ll111vq>6g....6&td]oo]@5k=}=o]2jj+&qzg....",
-"6#^/{{nn{{pf%fp/{/l^#e>g....>id]777=7krhu4roooodi#e6....",
-"g(vm^l^lal|f%!{^^11vqez6....6'<*2@@525=4u4k@2jj<&q>6....",
-"6ee#['&&1&{!bp{1''[#e>6g....zq[i+;**22k$h~k*;;+-[q>g....",
-"g>>ee(#[[&{fbpi[#q((e>6gg...6eeq[&-++*,~_r0;-&&[qe>6g...",
-">ev'''['1&<!x!/''[#qeee6g...e[+;;;+;*2k$ur,;;+-&[qq6g...",
-"(vll^''&1a<:%j<&'&[[q((6g...[<]o2***2@,4u~w2**;+-&[>g...",
-"(^np{l&a-ipfcf<a&'1'[#ee6...']7},@2@@@~hu4,@2**;+-[qz...",
-"em/{ll11^-p:cfna^11'v#(>g...q9o7]@*2@@ysu$=@2**;+-&e6...",
-"e#ml111^al|:xf<^&1[m[#(>g...#ij]jj*2@@~hu4,22j;t+i'eg...",
-"6(#vv['1&ln:x!{&&m'v##(>g...>vi<+;t*2@=hu$k22;;+i-[eg...",
-"g>eq#v['m&n!x!{1''##q(egg...ge[1-++;j*=$u4,*;;i-&[#zg...",
-".66>e((q['{!%|/##qee>>6g.....6>e#'&&+;,4u}]--&[qeezg....",
-"..gg66>ee(/|b|1q(>>6gg........g6>ze[[&o}_}2&[qe>6g......",
-"....66z>eelpb|1e(>>6g...........6zzeq[]}_=2[[ee66.......",
-".....g6>>(l|:n&(>>g6g............gzeq[]}h=2[qe6zg.......",
-".....g.>>>l|:n1(>>6g.............ggzeq@}_=j[qe6g........",
-"......g6>e^|bn1(ezgg..............g>eqdrhk2[q>zg........",
-"......gg6>^|%|lqe>6g..............g6zedrur@&[ezg........",
-".......gz>^|%|/vq>g................g>edrur5<&eg.........",
-".......gg61|%|/vq>g................g6>jru}]<&qg.........",
-"........g6vm{^v(e6g.................g6ij7d<&q6g.........",
-".........ge(q(e>6g...................gqv^&qe>g..........",
-"...........6g6gg......................g6666g............",
-"............gg.g........................gg.g............",
-"........................................................",
-"...........gg..........................gz...............",
-"........g6e(qeg.....................6zq'&#6.............",
-".......6>e#vm#>....................ze'i{j&e.............",
-".......ge(v^lme....................6#v<d]9v.............",
-".......6>em/|^(g...................6eq9orj&g............",
-".......g6em{!/#g...................gz#974kig............",
-".......ggem|:/vgg..................g6#j}ho<6g...........",
-".......gz6mn:{v6g..................g>>9=h7<6g...........",
-".......gzem|:/vgg..................gz#j}ho<66...........",
-".......6g>mn:{mzgg.................6ze9}$7t>gg..........",
-".......66>m|:/m66g.................6>ej}h79>6g..........",
-".......66e^{b{v>gg.................6>qj=h7<e6g..........",
-".......66em|:{m>6g.................6>qj}h7te>g..........",
-".......g6em|:nm>zg.................6>#j}h=tez6..........",
-".......66em|:{m>>6g................6>qj}h=jee6g.........",
-".......66>^nb{1>>6g................6>ed}h7*qe>g.........",
-".......g6>m|:{me>6g................g>ej}h7jqe>6.........",
-".......g6>^/:n1e>z6g...............g>ej7h=j[qz6g........",
-".......gg6mnp{^q(>gg...............g6>j=472&[(6g........",
-"........6zvl|{l^vezg................6>{]}7]2+[>6........",
-"........6g#m^//{l#e6g...............6z&9]o77]iq6g.......",
-".........geqv/|:{1>6g................6#&+]}h7jq>6.......",
-".........g6e(m/|/1#e6................g>q^joroj&qz.......",
-"..........g6e#m^1mvq>.................6z#&9dj9<&e.......",
-"...........gg>e(#mmv>..................g6eq'itj<q.......",
-"............gg6>(#m#e...................gz>e'i9i#.......",
-"..............gg6e(eg.....................g6z#'q6.......",
-".................gg..........................g6.........",
-"........................................................",
-"........................................................",
-"........................................................",
-"............g.ggg.g.....................g.ggg.g.........",
-"........ggg6g6gg66g6ggg.............gg666z666z666gg.....",
-".......gggz6z>>>>z>6z6gg...........gg6>>>eeee>e>>z6g....",
-"......g>eqqq#q#(#q##qqez6g........ge[&&&-&-&----&&[e6g..",
-".....ggqm^^^1^&^&&^&1'v(6g.......g6&t2d222222222*t+[>g..",
-"....g66v^{{{{{{{{{{{//1#>6g.....gz>+]7,7k,ko,7okk52-qzg.",
-"....g6>m{nn/{/{/{/{{<{{'ezg.....6>et7}77ook,okkkk=5;q>6.",
-"....66>^|!p{aiiaiii{||n1(>6g....6zqd=4=k@@@0@00,=~=j&e6g",
-"...gz>(l|bt{aaaaaiii9fp^#e6g...g>e[]r_y,@@@@@00,y4r@-q>g",
-"...gz>q/!:p{ai&iii+npdpaqe6g...6>q&]4hrw0@@0@00w~4~@-q>6",
-"..g6>(#/p:!9n<<<<<<9f:fi#ez6..g6e[a,~$~=,w,wwwwy~s4@-[>z",
-"..g6>([{|f!p!|9p!f!j::p+[>>g..g6q&+5r$~~~yyy~~~~ss~0+qe6",
-"..g6(v'{!:dfjf!jfjf:fd!/[(>6..gz[+;k~4s~~~~~~~~s$$4,+[ez",
-"..g>v^{np!p!!!f!fd:::!pl&q>6..6e+]7}~~~~~~~~~s$444r5*-(z",
-"..gzmnp!!!jppj9ffd:d!f9i1[(6..gej74~4~~}~~~~~sss~~y@*+[z",
-"..6>^|f!p!9!!p!jf:bd!9{l1v(g..zed}44~~y~~y~~~$ss~yk5j+[z",
-"..6zv^{n9p9|99p9!dxdf<{&[(e6..6>+dk==~yy=yyy~sus~w,2+&#6",
-"..gge#'ltp9||<|9fbcb!i&'q>6g..g6[i;5w~=yywyy48u_~52;&q6g",
-"...6zeq&{p|<t<t<f:cb9/'#e>gg...zzq&2k~ywwwww~$)sy0;-qe6g",
-"...gz>(l|f9<n{/+t!ffn/1#ezg....z>q[@=syww,,,wr$4=52-q>g.",
-"...gg>(a|bp<i+ii{<9n{/^#>6g....g6e[@~4~w0000,wy=k]2-q>g.",
-"...gz>>l|b|/-iaaii{///lv>g.....gzeq]rh=,00@@0@,oko]+eg..",
-"....66e^|!9{iaaa&^&111v(6g......z>(2=$y,0@@@@222jj+[>g..",
-"....g6>1{!n{{/il1'v##qe>g.......g>ej74=k,0@@2;+--&[eg...",
-".....66vl{n{{{la^[e(>66g.........zz<]==kkk5@2+[[#>6g....",
-".....g6#^l{{|n{l1#e>z6g..........g>-jo7=r=ko*-qez>6.....",
-".....g6eq'/|fn{l1#>66g...........g6#&;]}4}o]j-ezzg......",
-"......g6eelp%fnl'(>gg.............g>q']ru$=]t&e6g.......",
-"......gg6em/n{^'#e66..............gg>q9o}7dt-qz6........",
-".......ggz(vmmq(e6g................g6>v{jti[q>g.........",
-".........g6z>>z6gg...................6z>eezz6g..........",
-"........................................................",
-"........................................................",
-"...............g.g.........................g.g..........",
-".............gg>ze>>g....................g6eeqqe6.......",
-"...........gg>>(qqvq>g.................g6eq[&&+&eg......",
-".........gg6ze(qvmmveg...............g66>q[&<9j<[6......",
-"......gggz6>>q'^^^lm(6g...........gg6>>eq&;22d]t'6g.....",
-"....gg6gz>>>('l/{//1#6g.........gg66>eeq[;]oko]j->6.....",
-"...gg6z>>e(qq1{pn{l1#>66.......gg>>eqq[&&*kr=7oj-ez6....",
-"..g6e#'m'1''1l{p|nn/mezg......6>[it;;*;**57rr==otq>6....",
-".6z(m/n{{n{//{<pp!fn1(z6g....6z'9o====kookwy~44=2[>6g...",
-".6e#/!%:::!p9|nnp:bpl(>6g....>#io4uh$h4~y==wrh_4@&e>g...",
-".6>q^|f!::!f!p|<p!bpl#(6g....ze&d}44hh4~~~=wrrh}]-[>6...",
-".66>v^/n|!fpp9<{|np|l1#e6....zzq<do=}444~y=,w}~}ojiq6...",
-"..g6eqvln|!!f9{-{<n{/l1q6g....gzq&<]=r~~4yk0kk=ko]j&zg..",
-"..g6zeqm/np!:|{ail////m#6g....gzeq&jo=}4syw@55koo]ji>g..",
-"...gg>evm^nj:p/1&11^l/lv>6g....g6eq+j@=~h}5***j2]o]+#zg.",
-"...ggg>eq[/pb|i[[[#v^/lm(>g....gg6e[&+]~hr0+++-;do]t'eg.",
-"....ggz>>ql|:nl[#((#m/lv(>g.....g6>eq&]rh}@+-&[ij]]{'e6.",
-".....g6z>>m{nnl1'#((#vq(>g.......g6zeqto}=]2;-[[/<&'e6..",
-"......g6z>v^//{/^[>ee>>6g.........gz>e+2oookd+qqq#e>g...",
-".......gg6e#^^/{lve>6zgg...........g6z'+2]ok]+qe>z6g....",
-"........g6ee#ml/lv#(>6g.............g6q[ij]o]t-'ezg.....",
-".........g6>emm/lmm#egg..............g6e({jo]jti#6g.....",
-"..........gggqm/l^m#e6g...............gz6&jo]djiq6g.....",
-"...........gg>#vvmmv(g.................gge&<<99{'z......",
-"............gg>eq#m#(>g.................g6eq&i9ive6.....",
-"...............ge(v#(66...................ggq'<i'>6.....",
-"................ge(e>6......................6q[qez......",
-".................6ggg........................z66g.......",
-"........................................................",
-"........................................................",
-"...........gggggg......................gggggg...........",
-"........ggggggg6gg..................g6g6666>6g..........",
-".......6eqee>(vm#e6g...............z#&qqe[+9i[zg........",
-"......ge#m#qev^{^q>6g.............6#iti&q+d72&e>g.......",
-".....g6qm^mqq1{|/me66g...........g6&t];-&*7}otqz>g......",
-"....g66vl{l'qln:{1ee>gg.........66><]7];-@=h=*[qe6g.....",
-"...g66>mnp{^[lnb|a#>>6gg.......gz>(j=472+5}hr@-qez6g....",
-"...g6>e^|:ni1{!b|iqqe>6g.......gze#d}h=5*k4_r@-&qezg....",
-".g6z>ee/|:ni1{!xp+[q(>z6g....g>>eq[5rh=@*kru~0+-[qe6g...",
-".g>e>eq/!:p/at!xp{'[qeegg....6eqq[&]rhr,@w~uy,;+&qq6g...",
-"g6e((eq/p:9/a<fx!+'[(eezgg..g>[[[[&5~hy,@wsu~,*+&[qe6g..",
-"6(v111mnfxft/!dx:<i&&[q(zg..z[<jj*j=4u~,,~sus,02*+&[>g..",
-"6#l{/llpbxf!tf%}%p/ia1&(>6g.6i]7o55r_us~w~_)_~,0@2*&qzg.",
-">mn||n|!bcbfpdxcx:9t{{^vezg.ej=r}==4_)h4rsu)u4www5]+#>g.",
-"6v^////!:x:f<!%xd!{{i^1q>6g.6<dooo]~hus~w~_us~k,52j&q>g.",
-"ge#vmmmndbp<+9:x:9i^&'#ez6..gqi<ttj=$_4w,y4usy@@2;-[z6..",
-".gg>>(q/pb9{a<pdp<a1#qe>gg...g6eq[&o4hy,@w~s~k@*-&qezg..",
-".ggg>>(lpbn-1i9f9{a'[(>66g...gg6e#&]rh=@*0y~y,@*+[q>6g..",
-"..g6ze>l|:ni&a{|n{/^[(e6g.....g6zq(]rhy0*0kr==]@+[q>6...",
-"...g66e^|:{^[^i{{<ni'e>z6......gzzqd}h7@+25,kk=@;[ezz...",
-"....g6>^{:{^['&l/{nl'e>6g.......g>ed=$72+;2@,7=o;[e>g...",
-"....g66mn:{m##''^{|{1qezg.......gzzj=h7j--;t@7r7*&qz6...",
-".....gzmn!/mqqqqm{|n^(e>6g.......g>j=4oj&&&&j,}=2&qe6g..",
-".....g6m{!/meee(vl|{^#e>gg.......gz974ot[[[[{]r7d-[e6g..",
-"......gvl|^#>>>>qmmm1m#(6g........g<]}d-eeee&tjjj;i[>6..",
-".......#^{mq>6>6>(q#m^mq>6........gid79&eze>e[&itd9&e6..",
-".......(mlv(6g6g66ze#^mqegg........v9]<vz666zz>#idj&#6g.",
-".......>(#(66gggggg>eqqe6g.........e'i[>6ggggg6e#&&#6g..",
-"........g66g....g.gg6>6g............666g....g.gg>e>6....",
-"........................................................",
-"........................................................",
-"...........ggg.........................ggg..............",
-"........gg6>>>6gg...................gg>eqezgg...........",
-".......gg6ev^#(ggg.................g66[<di[66g..........",
-".....gg66>m/nlv>6g6g.............g6z>eto=]+ez66g........",
-"....g6z>>em{!/meez6gg...........g6>eeqj=rktq#>>6g.......",
-"...g66>>eql|:{&qee>6gg.........6>zeq[&]}h=2&[qez6g......",
-"..66>eeqqq/pb|^(qeeezgg.......66eq[&&a5rh}@&&[qq>6g.....",
-".g6>e###['{p%p/'[qq(ez6g.....6ze[---+;k4u}5;+--[qe6g....",
-"gz>q1/{{i^|:c!{aa/i1mqe6....g>e&*o,,0@=hu$,@@002t&[z....",
-"g>(v/f:p|{pb}bp{{|p{lm#>g...ge&+k4hr=wrh)hr,7=r=]tiqg...",
-"6e(1|b}bpt:%cbf<pp:!{^vqg...>q&j=u)h~w$_)_~wr4h47d<[6...",
-"ge([n:%!<{9%cdp/<|!|{^m(g...6q&+=hu4w,~_)sr5krrr7dt'6...",
-"6e(#n:%!{i9fxf<a/n|n/^me6...6q[+7hu~k@=$u4w@,=r=odt[6...",
-"g>(#{!%9i&|fxf{'a{|n/^m(g...6e[-k4_y02w4u~k*@,}=odt'6...",
-"6>eq{fxp{a9bcf<i{n!n/^m(6...6e[ak$uyw0=su$,5,=4=kdt'6...",
-"6>eq{f%dn{!bcbp{npf|{^v(g...zeq-ohu$=w~_)h~,=r4r7d<'6...",
-"g>>({:x:ptfx}bf{pf:!{^v(6...6eq&khu$r=$u)_4=r$hr=d+v6...",
-"gz>e^n!|{/p:cf|/{{!n/mveg...g>e[@}$}k5~hu$}57=4=oj+#g...",
-"g6>em/nl^&nfxf{1l///mv(>g...g6e(t5752*7$u4k*@]7oj<&eg...",
-".g6>(v1[[#l!bn^[v1^^vv(z.....6ze&<j++-]4_}@+<jdjtive....",
-".gg6eqv#((l|:|^qqvv#q(>z.....g6zq&+-&&]}h}2&-+ti&'ez....",
-"..gg>>e(((lpb{^qeq((e6g.......ggeq[[[']r_72&[&v'q>z.....",
-"....g66z>e^nb{mee>6gg...........g6z>e(d}_7jq(e>66.......",
-".....gg66>m{!{vz6z6g.............g6>>e9747<ez>6g........",
-".......666v/|l#>6gg................z6z<]}b-ez6g.........",
-"........gg#m{m#g6g..................ggij7j&66g..........",
-"..........(v^veg.g...................g'<d<#g.g..........",
-"..........6eqeg.......................z#&qz.............",
-"...........ggg.........................g6g..............",
-"........................................................",
-"........................................................",
-"...............gggggg......................gggggg.......",
-".............g6>>>666gg..................gzqqez>z6g.....",
-"............g>(#qe(e>66g................ge'i&[[#ez>g....",
-"............ge#mm#q((eeg................6#ijt-&&[#q6....",
-"...........6g#1/l1[##(e6g..............z6&jk]j+--&qzg...",
-"..........g6>v/pn/1'[#q>g.............g>e+or752;+-&eg...",
-"..........66>mnf|n^^1'q>g.............6zej7hrk@@jt&#6...",
-".........g6>>^n:!|{/1'qe6............g6eq2=h4}k5j;&q6...",
-".........gg>em{p||n{^#e>g............gze[j,rrr=k2-[e6...",
-".........gze('ln9!fn^#e66............zzq[;5==r4=@-q>6...",
-"........g6>(#&l<9pf|&#ez6g..........gzq[-25wy~$=2-qe6g..",
-"........gge#m/n!!ffn^[e>gg..........g6q-t5=~~~4=@+[e6g..",
-"........g6e'^{pdfp!<l[qegg..........g6[;2krs44~=]+&q6g..",
-"........66q'l{!%ffp{i'qezg..........6>&;d=4_$~rw@;&[>g..",
-".......g66e[1{pbf!9{l'[e6g.........g6z[+*,rh4~=w5;+[>6..",
-".......g6>eq[{!bdp<<i1[q>6.........g>eq-+k~_s~wk5*+&e6..",
-"......g66z(([a9::!n{i1'qz6g.......gz>e[&+@yh4~=,52;&e6g.",
-".....6g6>e(q#/|bfj!n{l1#egg......6zzeq[&-5yhs~~=,]*-q6g.",
-"...gg6z>>e(q[-<f:!f!<{^#e6g....gg6>eqq&-+@w$44~~=k@-#zg.",
-"...gg6>z(eqq[it!ffd!9{iv>6g....gz>ee[[&-+0w~$$sryk5+qzg.",
-".g6>(q#[''&aln|!f!!pn/1#z6g..g>e[&-+;;2@@=y4~~$~=]j-e>g.",
-".g>evml^l/{{p|9|p!!|l^[qz6g..6e[+j@]@@k=r~y}~~4=52+&z6g.",
-".z(q1/{{{n|!:f!9p||n^[(e6g...z[&jo777=}$h44=rrr=@+&q>6..",
-".6>(v^////{nn{/li/{i^1#e66...ze'<doooo7777o555o52j-[6z..",
-".g6ev1lllll^^m&m'1'1^mm(zg...6>q+j]]]]@2dj*t;j;j2jt&zg..",
-".g66qmm1mmv(e(e(eee(1l1#g....g6>&tjjjj+&[[[[q[[&j]j&z...",
-"..gge#vvv[q(e>>>ez>e#vveg.....g6'&+<<+&[qe(eqee[i<<qg...",
-"...g6>ee((>>6z6g6z6zee>6.......g>e[q[[qe>>zz>>6>q[e>....",
-".....ggg6666g6g6gggg.g...........gg66666zzg6gggg.g......",
-"........................................................",
-"........................................................",
-"...........gggg........................gggg.............",
-".........g6>e>>6gg...................gzq[qez6g..........",
-".......g6ge#vvq(>6g................g66#i<+&[ezg.........",
-"......ggz>#mlmvq(>gg..............g6>ei9]j+&[e6g........",
-"....gg6z>>m/n/1qe>z6g...........g6>>eq;o=oja[e>zg.......",
-"...g6>>>qe^|:n1#eee6g6.........g6eeq[[2}h=2-[[q>66......",
-"..gg6eeeq#/px|/qq(eezgg.......g6>q[[&-]4ur5-&[[q>6g.....",
-".g6>#1l^11nbc:na&'[#qe>6.....gzeij]2*2}h)h7@**+-&[qz....",
-".geq^n!n{{f%rbp{{/l^1mqeg....6q&d=4}kk$u)h4,k5]d*<&#g...",
-".>evn:xb!|bc4xbj||{{l^meg....e[+=huh4r_))uh~r==7]dt[6...",
-"g6eqnbx:p|f%cx:ppnn/lmveg...g>#i=_uhr=4u)uh~r==o]j<#g...",
-".6eq/f%!{in!b!!p|{ll1vq>g....zq&74u4k0=~s$~~yw5]j+&qg...",
-".6>(/!%n/'-<|9nt{{^mv(>6.....ze']4u=o*0ky==wko2j+[q6....",
-"g66(/!:ni1a/{t|9{i1'q(>6....g>>'o4h=@*@5kwy=k52;&[ez....",
-".66el!:n^&&ai{9!{^'#e>66.....6z[]4$=@*2@0ky~7@;-[e>z....",
-".66e^|!ni'&'&/|:|a#q>>6g.....6>qd}$=0*2**,}h=@-&qe6g....",
-".66e^|!na1&'&/n:na#(ez6g.....6>qd}4k@*2**0=h=@-[q>>g....",
-".g6>m/|/{/aa&{n!nl[q>>gg.....g6q9o}7o0@@2k=~=]+&qe6g....",
-".g66v^/{{{{/l{nn{1'#(6zg.....g6><do7kk,05,=},2;-[z>g....",
-"..g6q^l/nn{{i{{n/^'v(>gg......gz&j]o=}7k5kk7]];+[e66....",
-"..g6eqv/|fnn/i^1^/l^mqezg.....gz'i{o}4}7]5@d2]]dt&#>g...",
-"...g6eqlpb!n/^m[mlnl^m#>g......g>q&orh4=o2t+j]=o2tiqg...",
-"....66>l|%pn/m#ev^n{lm#eg.......6>e]ru4=oj-[+]=7]9iqg...",
-"....ggzv^{lmm#(>qv^mmvq>g.......g6>i]7bjt-'e&<djt+&q6...",
-".....ggz###((e>6ze(qqq(>g........g6e&iiv'qezeq[^&&'eg...",
-".......gg6g6gg6z6gg6eeezg..........6g>6666zz6z66#v#>g...",
-".........gggg6gggggg6>6g.............gggg6gggggg>ezg....",
-"....................ggg.........................ggg.....",
-"........................................................",
-"........................................................",
-"........................................................",
-"........................................................",
-"......gg6g6g6g6g6ggg..............g66666666666gg........",
-"....gg66z6>>z>z6z666gg..........g666>>ee>e>>>z>z6g......",
-"...g6z>>>e>>>>>e>e>>z6g........g6>qeqqeqeqqqeqee>zg.....",
-"..gg(v1'#(#e(ee>q#'v#e>6......g6[+j;-&&[[q[q&-;+-[qz....",
-"..g>vl{/&'[qqeqq[1/^m#q>g.....ge<]752;+&&[&&+jo]ti&eg...",
-".gg>^np{^&'[q#(('/n{l1#>6....gze2=47@*;+&-&&*5=7]j-q6...",
-".g6>^|!ni''[(###&lnnlmv(g....g6qd}4=@*;+&---*5==]j<[6...",
-".gz>^|!nl'[[##qq&lnn/^m(6g...gz#d}4=@*++-a&-*@==]2t'zg..",
-".g6e^|!{^&[[##q#'/{n/^mqzg...g>qd}4,@*++----*o=7,dt&>g..",
-".g6e^|!na[[q####1/n{/^1q6g...gz#d}$7@;+--a--*5==k@j&>g..",
-".g6(^|fn^&[#qq##'i|n{lmqzg...g>[]}4=@*+a&&--*5=7o@j&z6..",
-".66e^|!<a[[qq#q#'/n{/lmqzg...6zqd}4k@;+-&a&-*,==o]ja>g..",
-".6ze^|!n^&[[qqq#&i|n{l1q6g...z>[d}4k@*++&-&-*5y=5]j&zg..",
-".g6e^|f{a[[qqqqq1in{/^1q>g...g>q]}$k2;+-'&-a*5==o@j&e6..",
-".g6e^|!{^[[#q(qq&/|n{l1q66...g>qd}4k@;+-&&&a*,y=k]j&>6..",
-".g6e^|fni&&[[['[a{|n{^m#6g...g>q]}4=@2*;++;+@,}=k]*&>g..",
-".g6e^|!|{l-a&&&^/nf|{l1qzg...g6qd}$},0@@*222o=4r7@j&>6..",
-".g6>^|f||{{/{//{n!:!nlmqzg...g>ed}$r==k,o5ok=4h47]t&>g..",
-"..g>mn!pn{//lllln|!p{lmq6g....6ej=4r=ko555]5=r4rk]t&zg..",
-"..g>mn|{l^11m'1&l{pn/1m(gg....6ej=r752j*tt**@7r=o2t'6g..",
-"..gzm/|/1[#(qeq('^n//mm(6.....g>9or]j+-&&[&&;]=7ojtvz...",
-"...6vl{^v(((e>ee#mll1m#eg......6<]7d+&[[qqq[-j]]jjiqg...",
-"...ge#v#ee>>z>>e(#vv#ve>g......gqi<i[qeeeeeq[-{+ii[eg...",
-"....g>>>666zz66zz>ee>>>.........6eqezz>zz>zz>q(#qeeg....",
-"......ggggggggg6g6666g6...........gggggggggz66>6>z6.....",
-"........g.g......ggg................g.g......ggg........",
-"........................................................",
-"........................................................",
-"........................................................",
-".......gggggggggg..................gggg6ggggg...........",
-".....ggg666z66ggg6ggg............gg6>>>>>z66666gg.......",
-"....g6>>>>>ee>e>>z6gg6g.........6>eeeeeq#eqee>z666g.....",
-"...gze(ee(ee((e(>>e>z6zg.......g>q[[[[[[&[[[qq#e>>z6....",
-"...6>#[[[[[[[#[##qqq(e>66g.....6q-+++++++-+---&&[[ez6g..",
-"...6#l{{{{/iaa-iiii^&^mq>6g....>-]7k,,0@@@00@@5@22t&#zg.",
-"..g>^nf!ff|n{nn9||||n{lmq>6...ged=h4$$~w,k=yy}}}=7o9&#6.",
-"..g>^|b:bbf!n9!f!!!!||{1qeg...ged}hhh_4~=y~$~444r}7j&q6.",
-"..g6v^{n!!p!9p!:pn{//l^ve>6...gz<d7}r4r~y4~4r=k5o]di#e6.",
-"...geqvl{99pp!ff9{1mmvvq6g.....g#1<]7=y~~r~s=,2*jt+&>g..",
-"...gg>evl{|<|j::|i'###q>gg.....g6e(;5k==y~4_y@;---&e6g..",
-"....66>#'^i{{9!bpi[#qee6g.......z>e&t255ky$hr0+-&[#zg...",
-"....gg6e([''&npb|i[(e>>gg.......gz>q&+;*2,~_r5+&[qezg...",
-".....g66>e([[{9%pl((ezzg.........g6>eq&++krhr@&[qz>g....",
-"......g66eeq#^p:naqee66g..........g6>q[&-@rh=@&[q>6g....",
-".......g66>eq1n:n^(e>zg............g6>e[&2=hk2&qqzz.....",
-"........g6>>(1{p{&ee>6g.............gzee[j747*[qe6g.....",
-".........g6z>[/|{1#eezg..............g>zq;]}7*-[q>6.....",
-"..........gz>vl{l^[q>66...............g>e+]7]2+&qz6.....",
-"..........g66qm/lmm#(6g...............g6>^j]]jj-[66.....",
-"...........ggevm1^^mqe6g...............g6#+jj2dt&#zg....",
-"............6>(#v^l^vqe6................6e[i<2od<&#>....",
-".............ggz#^{lm#(6.................g6>id7]jivz....",
-".............g6g(ml^mq(z.................g66vt]dt&'>....",
-"..............g6>(#v((e6..................g6e'ii&v#z....",
-"................gg6>>>>6....................g6>eeeez....",
-"..................gg66gg......................gg>z6g....",
-"....................g6g.........................gzg.....",
-"........................................................",
-"........................................................",
-"........................................................",
-".........gg6g66gzg66ggg..............6g66z66z6z66gg.....",
-".......g66>#v((>(q##(>6g...........g6z#&+&[e[&i-&qzg....",
-"......gg>evm/1#>#^l^1v(>g.........g6e#+joj-qi2odji&eg...",
-"......g6eq^n!/1qm{pnl1#>g.........g>q&d=4oj&*or}ojiq6...",
-".....66eeql|f{1#m{!|{^'(zg.......6>q[&]}4=*-j74}od;[>g..",
-"....gz>(q#lnbn^#^{|n{^mq6g......6>#[&i]}_=@-2kr=kdt&z6..",
-"....ze(qqv/|%ni'1{|n{lm#>6g.....>qv&-<oru}5;*k}=,]j-ezg.",
-"....6(#vvm{f%!/'/{p|n{^ve6g.....>[i-+t74u45*5k~==k@+[zg.",
-"....eqvm^^|:xf|i{p!!|{{m#e6.....q&{j2]}hu4y5kr$$y=oj-#>.",
-"....e#ml/np%x:!<|fb:fp|lvq>g....#ij]]=4u)h~ky4sh44y]{&eg",
-"....e#mll{pbcbp{9!::!!nl'q>....gqi9]ox4h)h4ky4$h44=];&e.",
-"....6eq#m^n:xf|l<9!fpn/mqe6.....>q&itd=hu4y5ky4$}=oj&q>.",
-"....gg>e(#/!%p/&/n!|n/lve66.....g6qq&io4ur,*,k~=yo]+'>6.",
-".....6g>eel|%pi&a{9|{l^#>6g......66eq[]}u}5*@ky=k52-e>g.",
-".....g66e(lp:|l[a{pn{/^#>6g......gz>q[]rhr5;@kryk5d-e6g.",
-"......g6e>l|%|/[^{9|{im#>gg.......gzqq]}u}5+2k=rk5jie6g.",
-"......g6zel|bni[a/|n{l1q>6.......ggze(]}h}@;@,y=k@j&ez..",
-"......gg>>^|%|i[&{|{{/m#6g........gzeqdrur0+2,}=k5j-z6..",
-"......g66e^|b|l'&{9n/l1qz6........g6>qd}hr@;2,==o]j&>6..",
-".......66>^nb|l[&{n|{^mq6g.........6zed}hr@+*k}=,@j&>g..",
-".......g6>^|%|{&lnpn{l1qzg.........g>edrur,25=~}7]j&>g..",
-".......gg>^!%!nl{pf|{lme6g.........g6e24u475kr$r7]t[>g..",
-".......g66^px:|{n!:!{^m(6..........gz>d4uhr7=rh47dt'6...",
-"........ggv/|{l^//|{lm#eg...........g6<o}7]2o7=7]j-q6...",
-"........gg(m^mvqm^l^mvq>g...........ggv9dj{-td]29+&eg...",
-".........gg>eeez(qvvq(>6.............g6eq#(e[&{+^'q6....",
-"..........gg6666eeqee>>g..............g6>z>>q[&[qeeg....",
-"...........g6gggg6>>6gg................gzgg66>eezzg.....",
-".................g.g.........................g.g........",
-"........................................................",
-"........................................................",
-"...g6>>>e>>6gzg6g6ggg..........gzeqqqeez6z6666ggg.......",
-"..6>qm1m##q(>>eee>6gggg.......ze&;j;+-&[eq#[qq>66gg.....",
-".6>em/{/l1[q(qq#q(eez6g6g....ze[jo7]]*+&[&&-&[q#ez66g...",
-".6eql|!n{l1[(#vm'v((e>zggg...z#^]}4}752+&-+;;+&[qe>66g..",
-".g>(m/|{{/^i&^^il//^^mv#(>6..6e'jor7k5@@2@@5]5o]2;<-'q6.",
-".g6evl////{{{<{{{|fpn{/1m#>g.g>q{]o]o5k,7k7k=r$r=7]jti#g",
-".g6>#m^l/i{!!!|pfbxxf!|{l1(6.g>e-;d@55k~44}}4huuh4r7]j'6",
-"..z6qv'^i{||!|{{|!::!nn/mveg..z>&+*@5k==rrkk}$hh4}7oj{qg",
-".g66e#'&/{tn!n/&{|!!n{lmvqzg.gzz#-;25wwrrk52k=4r=7bj+^eg",
-"..gz>e[1+nn|9/a[1{nn{lmve>6g..6>q[-2,=y=yk@+2k==7]ji[e>g",
-"..6zeq[^{|9n|/1[1^////^v>>g...6zq&+@7=y==5*+*@ko552+qez.",
-"..66(v1/n!||{i1q[m^1/llvez6g..z>&+j0=~yyk5*-+t22o]]+q>6g",
-"..6zq'^{|!pn{l&q##[ml{lme6g...6>&;2kr4~==5*a-a+j@7ot[>6.",
-"..66#^/{9|9|{a'q((qml{/mez6...zzi@okyry=k@;&&&&;]=]tqzz.",
-"..g>1{pn{/{{{^'qq((m/|{m(6g...gej7r=,5kkk@;&&&&;or=j[66.",
-"..6>lpf|i&^l{^'qq((m/!|1e66...zq]rh}5*@]72;&&[[t7rrj[z6.",
-"..g>^p:{1'&/{a[(((qm{!|^e6g...gedrh72;2o72+&[&&;74rd[>g.",
-"..gg#^/mv#^n|/'q(qqm/fp1(zg...g6idoj<-2k}k;&[&&t74~j'>g.",
-"...geqv#qq^nf{1(qeqm{f|^egg....6q&i-&&d=47*&&[&97$rd(zg.",
-"....gze>>e^|!n&####^/!|^e6g.....6eqq([2}4=*--a-2x4}d#6g.",
-"....ggzz>>m/|n/^//{{||/v>g......g6z>eq9or=o@]o77}}o<q6..",
-"......g6z>vln||p|!!p|/l#>6........gz>e<]=rrrr444}7]iez..",
-".......gg6qm/n|!::%!|lmq6g.........g66&jo=r4h$u4}]9&zg..",
-"........ggeqvm//{/{{mvq>g...........g6#^<jooo777j{&eg...",
-"..........ze(qvmmmmm#(e6g.............z#[&<99jj<i'#>g...",
-"...........gzze((((e>gg................6>e#''vvqe6g.....",
-"............g66>>>>z6g..................g6>eeeee6gg.....",
-".............gg6ggggg....................g6666zgg.......",
-"................g...........................g...........",
-"........................................................",
-"........................................................",
-".........gggg........................gggg...............",
-".......6eqqee>ggggg666gg...........z[&&[qe6ggg66zz6g....",
-"......gevmvv#qe6666>eqeg..........g#<jt<i&#z>z>e#'#6....",
-"......gq1l^mm#(zz>>eeq(>g.........g&j]djj-[>>eq[[&'(g...",
-"......g(^llllm#e(q#m^l1#>g........6^j]b]]t-q[&itd]jieg..",
-"......6qml/{{^'e#v1^/|{meg........6&9]oc7];[-+jdo}79q6..",
-".....ggqml{{|/1q[m^/|!|^ezg......g6^j]k=}5*&+;2kr$}d[>g.",
-".....gg(#m/|!{1#ml{{nnlm(6g......gz[i9o}4k2-t]7x==ot'zg.",
-"......6e(v/|:n^[1/nn//1#(6g.......6q&+]rh=@+20}=ooji'>g.",
-".....ggze(/|%pi'^{!|lmvqe>g......gzz#&5r_r@;@74}]j<&qe6.",
-".....g6zeql|:p<i{{n{^vqe>g.......g6eq&@}h~w0kk}7d+&[e6..",
-".....g6>>elnff|||{{lm#(>6g.......gzeq[@=4$r==w,]t-[ezg..",
-".....g6>eq&{p!f:|nl^qe>ggg.......g6q[&2k~44sr752-qezgg..",
-".....gz>eqln!f:%!nlm#>>6g........6ze[&@7~$s_$k@t-qezg...",
-"....g66e(q&{|dbx:{1'#e6zg.......gz>q[&2kr4hu4k2;-qz>g...",
-"...ggz>>q#a{p:xc:t1[ee>gg......gg>eq&-@,~hu)h=*+[q(zg...",
-"...g6eq['1/{9!:%!nlm[>>6g......g>[&+;25ky4s_4=5*+qe6g...",
-"..gzqvm/n|p|p9|9ppp{1e>6g.....g>&+j57}rrr=ry~rr7j[e>6...",
-"..g>#m/|:%!!nn/ln!:!l#>z6g....zeij]rhu$~==o@=4h4]-qz6g..",
-"..6evl{|!:!|{/1m/n:|/#(>6g....6q<]7r4h4==52j]yh}5i[(zg..",
-"..g>vl{{nnllm'[#m^ll^mvq>>g...6e<]77==]]j;+-9d]]dj<&#eg.",
-"..g>vl{/l^m#(qeeqqvmm^mvqe6...ge{]7]]dt-[&[[&&<t9dj+&qz.",
-"...6#^/mm#qe>>>>>zeqvmmvqe6....zid7jti&[eeeeeeq&<jp+&#>.",
-"...ge#m#((e66z6g666>(#qezzg....gqi<i'[#>z>>66z>e'&&#e>g.",
-"....g6z>66gggggggg6g66666g......6>eez66ggggggg6gz>>>6g..",
-"........gggg.........g..............gggg.........g......",
-"........................................................",
-"........................................................",
-"........................................................",
-"........................................................",
-"........................................................",
-"...g66>6ggg....................gzzez6gg.................",
-"..gg>(ee>6g...................g6([[qe66.................",
-".g>eq#vqeez6g................6eq&i+-[qe6g...............",
-"6e#'^lll1'q>gg..............6#it2]o]j;&q6g..............",
-"g#^/{n|{/lm(6gg.............6ido7=}kkdt[>6g.............",
-"6v1/n|!nn/1q>6gg............6id]=r4}=7*&e6gg............",
-"ge#mln|nnn^[>>6ggggg6>>g6...g#i9]=}===d+qez6ggggzee66...",
-"g6eq^/|||nl[(>zzggg6>e>>zg..gz#&do}r}}]+[e>>666>eqqe>6..",
-".g6em//||p/'e>>zzzz>e#qe>6g..6>#to7=r~o;[qe>>>zq'-&[e6g.",
-".66z#^/|f:n^q(e>e(qmm/m#>g...66ei2]}4h=2&[qqq[&+j]jie6..",
-".g66#vl|fx|&qee>(vm^/n/veg...g6>-t@}hur2&[qq[+tdo=]<qg..",
-"..gze#m|bc!^#qe((m^ln|{m>g....6z[-jrhuy@-&[[&tdo=r=teg..",
-"..g6eqv/p%pi'[q([m///l^(6g....g6#&+k4ur5;+&[+jooo]d&>6..",
-"....>>q/|!n/&'#em^{/^m#e6g.....geq&]}$}52;-[;d7od9i#6g..",
-"...g66>1{!|{l&[(mln/mqe>g......g6zq*7ryk02+&;]=]j&qeg...",
-"....gzev^{n|pi'q#m^m#e>gg.......z>q<d77}r@;&itd9i'ezg...",
-"....ggzq'^{p:n&q##v#e>6g........g6z&;2k4$y2&--<-qe6z....",
-".....66>e#{!cplq((>e666g.........z>q[ik4)r@&&[qq>>6g....",
-"......gzeq^n!nl1[qe>>g6g..........g>[&d=4=5*+&qeez6g....",
-"......gg6ev^//{{l#(>>6gg..........g6>q+d]o7,@+[ee66g....",
-".......g66>qvl{p/m>e6zgg...........g>>q&+]7ro;qq>>6g....",
-"........6z>eqml{/^m#e>6g............6ze[&j]7o2;-[ezg....",
-".........g6>>#m^lll^#>66.............g>eqit]]]]2-q>z....",
-"..........g66eq#^/|/1q>z..............g6zq&a27}oj&e>....",
-"...........gg>e(v^/lmq(6g..............g6e#&{dkb;&[zg...",
-"............gg6e(#mvmv#eg...............g6z('it<t<i#g...",
-"..............ggz>eq#mv>g.................g6ze#&it+#6...",
-"...............gggg>(v#eg..................gg66#[<iqg...",
-"................g.gg>e>g....................g.g6eqe6....",
-".....................gg..........................gg.....",
+"c     c #3E9C3C",
+"d     c #5AC254",
+"e     c #286E26",
+"f     c #32CB34",
+"g     c #5ACA5C",
+"h     c #5ED05C",
+"i     c #2AA62C",
+"j     c #166E14",
+"k     c #62DE64",
+"l     c #3EDE3C",
+"m     c #36B634",
+"n     c #D9F9D8",
+"o     c #26CB24",
+"p     c #2E9A34",
+"q     c #66E561",
+"r     c #9DD89F",
+"s     c #7AF67C",
+"t     c #E8FEEA",
+"u     c #92F294",
+"v     c #D8F3D8",
+"w     c #76EE74",
+"x     c #73E774",
+"y     c #66E264",
+"z     c #D7F2D8",
+"........................................................",
+"...........++++++......................++++++...........",
+"........++++@++++++.................+@+@#@@@@++.........",
+".......+@@@###$#%@@++..............+@@#$$$&$#%@@+.......",
+"......+@####*#**$%%@+.............@@$$$=-=--&$#@@.......",
+".....+@$&;>>>,,'-)&$#++..........@%-!~{]]{{^]/!-$@+.....",
+"....+@#)(__:::<[_('&*@+.........+#$}|123|4442|{5-@+.....",
+"...+%%$([678[8668<:(=#@+.......+#%=90000000004a^,$%+....",
+"...+##-:[b8[<<c8c[<:;#@+.......@$&!a000044000041~&%@....",
+"..+@$-;_6d8_(e:_<86['*#@+.....+%-/~200019f|14000^-$%+...",
+".++%=;e[7gc:>>>>_8h6:=#++....++#,i|0000f]]]]1000a,$@+...",
+"..+@&(:cbg[j----:7k6:&##+.....@#5^|00009////|000a!=$@...",
+".+%#;:<c7b<e-&-&e8g6_>*$@....+%=~a400049////f0002]-=@...",
+".+@$;_[887_j---&:[g7_'&#@+...+%=i10000l9///!|0002i5&#+..",
+".+%$(<8777_'=&-&e[d6_()*@+...@%&^400001^!!/!|0002^/-%+..",
+".+@$(<888c_,--==:[b6<(;*%+...+#&m400003^//!!f0004^~-#+..",
+".+@*e[688c_>=&&=e8d6[('=@+...+%-|000003{!!!!|0000|i,#+..",
+".@@$([78cc:,--&&:[d6[e;=@+...@#&m000n0o{//!!|0000|~,#+..",
+".@@*;<c787<,--&&:[d6_;)*@+...@%-i400004^//!!f0004i/-#+..",
+".+@$':<86b<(----ecb7_;=#@+...+%=ia4000l9////|0002~,=@+..",
+".++$;e<86bp(--&-e[d8:)*#+....+%=~|400049////9000a/>$@...",
+".++#&;e[6g85->>>:8d6:&$#@....+@$!i|000qo/]]]f0003!-$%...",
+"..+@*-;cdk7:>>'(_7g8:=#++.....+#-/iq0003]]^^2000a,$@+...",
+"..+@$*)_dh75>,,e<7h6:$#@+.....+@=,/2000o]^^94000|-$@+...",
+"...+#*&e8bc_j::_<[8:'$@+.......@$-!a00n199o12002i=#@....",
+"...+@%$':<<_}_<[<:e'&@@+.......+@$=ia44214q041ri!%@+....",
+"....+%#='e_<cc8c<(&*$@+.........+#$,i|1400002^!>=#+.....",
+"....++@*&;;(ee::()=#@++.........+@@>!~im|||am/,=#++.....",
+".....++@$*&&))))=*#@+............++#=-!!}}/}!-$@%.......",
+".......+@@@##%%#%@+@...............+@#%$$$$$#%@%........",
+"........+++@@%+@@++.................++%@%#@@%++.........",
+"........................................................",
+"............+.+.........................+.+.............",
+"..........++@@+@++....................+@#%@@@+..........",
+".........+@%#$#%@++..................+%%$&=#%@+.........",
+"........+@#*=$*$#%++................+#$-,--=$#@+........",
+".......+@@)e<ee(;)&$+..............+@#/|4f|^~/5-@.......",
+".......+@#([d6[_:e()$..............@#$m000021|m}&.......",
+".......@@#_dskd8<<:(=..............@%=20t00002|m,.......",
+"......+@#*:gsh8_:(;=$.............+%$&a0t00aami5=.......",
+"......+@#*_bsd[;;))$@.............+#$-20t00ip}5=#.......",
+"......+@$$<dsb:&=##@+.............+#=-20t0a!,=$#+.......",
+"......+@#*<bu6:=$$@++.............+%=-20t0a,-=%@+.......",
+"......+%#*<bs6_=*#%@..............+#$>20t01,-$#%........",
+"......+@$$<dsb:=$#+@..............+#=-40t0a,-$@@........",
+"......+@$$<dsb:=##%+..............+%=-20t0f,=$#+........",
+"......@@#$<bs6:$$@++..............%%$-40t0a-=%%+........",
+"......+@$*<ds6:=##@...............+#=)20t0a,=$@.........",
+".....+@##$<bu6:=$@@..............+@$=-40t0|,=#@.........",
+"......+@$=<gsb:*##++..............%#=,20t01-=$@+........",
+".....+@#$$<bsb:=$#@+.............+@$=-40t01,=$@+........",
+".....+@#$=<gsb:=$#++.............+#$-,20t0o,-$@+........",
+".....++#$=_dsb:*$$@+.............+@$-,40t0a--=#+........",
+".....+%%$=<gs6:*$#@+.............+#$=,v0t0a,=*%+........",
+".....+%$$&_dwb_**#@+.............+#=-!40t01,-$#@........",
+".....@+$&;<6h8_,&=#@.............@@-!p20001{!,$@........",
+".....+@=)(_7d8_(>=#%+............+%,}m40002|],=%+.......",
+".....++=;e<[7[_e;&$@+............+@,i|20002|i5&#+.......",
+"......+$=);(:(;)=$@@..............+=,}ima|p_,=#@........",
+".......+%$*=&==$$@+................@$=),5,,=&#+.........",
+"........++@+@++@+...................+@@@@@@@+...........",
+".........++++++......................+++@++.............",
+"...........+++++.......................+++++............",
+"........+++@%++@++..................++@%#%%@@+..........",
+".......+@%#$*$#$#@++...............+##$=-=&=$%@+........",
+".....++@#$$=====$$%++............+@#$--,,,,,-=#@+.......",
+".....+@#&&))&)--&=*#@+...........+@=,!//////!,-=%+......",
+"....+%#;:<_ee(((((:'=+..........+#$~a429|9^^9|ai>@......",
+"...++#$e[d8[____<[[_)#+........+@$-|000011212002}$+.....",
+"...+%$=_bhdc<_<<[8b[;#+........+#=,2000044240000i$+.....",
+"...+#=)_bh6[:e(e_[7<;#+........+=,/40004ff9|2004p$@.....",
+"...+$)([bhc_,,>;(<c_;#+........@-/m00001^{{]|402~$+.....",
+"..+@=;([bg[e>--&;:[_)@+.......+%,~|0000f]//!ia02}#+.....",
+"..++$)([bh85--&&);(;$@+.......+@>/m00009//j!/imp>%+.....",
+"..+@$&;[6h8:--&*&&&&#+........+@-5i0000f//!,!55,$+......",
+"...+*&;[bh85--&=*$#@++.........@-5i0000o]/!,-=$#%+......",
+"...@$*)_8dc}j>-=$$#%+..........@=-/200039{/,-*$%%.......",
+"...+@$*:[78<_j'*=$#@++.........+%-,|000439{,,=$#++......",
+"..+@%$$(<[88c_,&=##@@+........+%#=-^400003{!,=$#@+......",
+"...+@#$>e_<p8_5>)=##++.........+#$-]91q4n3o{/,=$@+......",
+"...@@#$-'e_[7[}:,-*$@+.........@#$-/i910n0lo^/-=#@......",
+"...+%#*&->5~ccp[:'=##@+........+%=-!/]fl0n4qo{,=$@+.....",
+"..+@$$=->'e~[ccc_(>&$@+.......+%=-!/]{flqnnn19]!-%@.....",
+"...+$&;',!___~p8c}_(&#@........@&!]{^o331lqnn43^!$%.....",
+"...@=)'ee_555}c77c[:;#%+.......%,}^|93fool00n001~=%+....",
+"...@*;'5__}__~c7878};$++.......%>~if14l13l000004~=%+....",
+"...+$&;:<cp[[876778<>$++.......@=5~|40qq0n000004~=@+....",
+"...+$*):<878776768c_;#@........+&,}a000000000002~=%.....",
+"...+#*=(<8888c88c[[e)#+........+$-!m40000000000a/$@.....",
+"....+#$);(eee:ee((()*@+.........@$=/pm||mf|||mm}>%+.....",
+".....+@#$*=*&=&==**$@+...........@#$-),,!,!,,--*%+......",
+"......++@@######@@+++.............+@@%$$$$$$%%@%+.......",
+"........++.@++@+@++.................+++@@@@%%++.........",
+"..........++@+++......................++@+++............",
+"........+@@@###@++..................@%##$$$%%+..........",
+"......+@%#$*=$$*$%++..............+@#$&-,---*#@+........",
+".....++@$$=&&&&&$$@++............+%#=-,!!!!!-=%@+.......",
+"....++%=;';;;'';)=*#+...........+%%,]ii~iiii/,-$@.......",
+"....+%#;_c<:e::<:(;&#+..........+#=p2n4afa14am~5=+......",
+"...+@#*:7g6c_<[8[_:;=+.........+@$-a0000140002fp)@......",
+"...+@$&<bh6[_[[8[<:(=@.........+#&!400003400041m,@......",
+"...+$*)<6h7<e:_<_::;=@.........+=,_200029a222a|p,#......",
+"...+$);[6h8:''eeeee;*+.........@-/i0000f{^9|a||p>@......",
+"..+@=)([6g[e>';;(((;*+........+%,}^0000f]iiimmm~-+......",
+"..++*&)<7g7<(j';))&*#+........+@-!~4000499{~/}5>$+......",
+"..+@#$)_7g7[}:;&=$$%+.........+@$-/200001fi!j-=$+.......",
+"..+@#$&_8gbc<_;&$$@++.........+#=-!100004fi!-=%@+.......",
+"..+%$=)<8g67[_(&=$@@+.........+%=,/1000n01^!,=%%+.......",
+"..+@$&><8d67p_(;=#++..........%#-!~40000q19~,=@+........",
+"..+%=-;<7g68[_e;&*%++.........+#,/i4000002|~!-#%+.......",
+".+@@)(:[86c<:('-=$%@+........+@%/^o000n2f9i/,=#@+.......",
+"..+#;:<[cc<:,>)=$##+++........%$p|400043^]/,-*$@@+......",
+"..@#;<cc8p_,>-==*#$%@+........%$i40nnq3^]/!,-==#@+......",
+"..+#;:<ccc_j---->';)$+........+$~a000039////]ii/-@......",
+"..+@)e_<88_(>'>'e_<:)@+.......@#/|200019]{{{910a/#+.....",
+"..+%=;e[c6<!>>,e_8b['#+.......+#,i|40019]{^|2000i$+.....",
+"...+=&;:<8<:,ee__<c_;@+........@-5~a4n4o^9912002p%+.....",
+"...+#$&':___:___<__(=@+........+$-5ia413a122222m,#+.....",
+"....@@$&'ee_<<<[<e;)*++.........@#&!i||244404|i/-%+.....",
+"....+@+=);((:::ee;)=#@..........+@@,/im9|aa||i},$@......",
+".....+@#*=&)));;)=*$++...........+@$-,5//~~~_,-&@+......",
+".......++@###$###@+++..............+@#$$===$$%@++.......",
+"........+++@+@@@@@+.................++@@%%##%%+.........",
+"...........++++++.+....................++++++.+.........",
+"..........+.+.........................+.+...............",
+"........+@+@@++.....................@@%%@@+.............",
+"......+@@$##$@@++.................+@#=$&=#%++...........",
+"......+@$#**$$#@+.................+#==---=$#@...........",
+".....+@#&-;5e;=#@@...............+@=!/{9f~,$%@..........",
+".....@@=);_<8_'*$@++.............@#,/ia003i-=#@+........",
+"....+@#)(e8dh8e**$@+............+@$/^fn000f,-=%+........",
+"....+@%-(_c6h7<,-$%%+...........+#$/m100001^/-##@.......",
+"....@%#>j_86g7c_j-#%@+..........@#=]910000019/=#@+......",
+"....@#$;(_[6b68c_'*$@+..........%$=~^10000003{-=#@......",
+"....+##;e}[7bb78<(-=$@+.........@$=~f1q0000049/,=%+.....",
+"...+%%*,:}p77777c_5;*#@+.......+#$-{fl4n000n01f],$#+....",
+"...+%#*>:}pc77787p_:-$@+.......+#=-{olqnnn00n44f/=%@....",
+"...+%$=':~[i77i6ccc_'*#@+......+%=,iflq0n0n00n02i,$%+...",
+"...+#$-j_[88m7c8c87[e>*%+......+$-/91qnn0nn0nn0q|],$+...",
+"...+#=-([8i66i8}876c_'&$@......%=,/9qnn00nnl00003i!=%...",
+"..+@$&,5p766678}p6d8<()*@+....+%&!{f4n000nnl40004^/-#+..",
+"..++=>'<8b|ggmi87878_(>$%.....+@,~^4n00000nnn00029~-%...",
+"...@='e8bhghhb6i66mc_e;*@......@,i|n0000000n00002|p>%...",
+"..+@=;:cbghghg6m88c[_e;=%.....+#,ian00000000n0002|~,#...",
+"...+=-'_8mbmbi[}__ee;)=#+......%-/{1n0000nq1l3|9i/,=+...",
+"...@#$&e_ccc8}_,'>>-=$#@+......@$-!|10nn0lf^{]]/,-=@+...",
+"...+@##>(__<[5'&**$##%@+.......+#$=]91144f^!,>==$#%+....",
+"....@%$-(5___(-$*##%@+..........@$=/^fa149/--==%%+......",
+"....+@%=;(j::'&$#%%+++..........+@%'pm9a|i!=$##@++......",
+".....+@=);((e;=@@@+..............@#,/imm|~,#%@+.........",
+".....++$*&&))=$@++...............+@&>55//,=%++..........",
+".......+#$#$##++...................@$===&$++............",
+".........@+++........................@+++...............",
+"........................................................",
+"........................................................",
+"........++@+@+@+++..................++@@@@@@++..........",
+"......+@##$$*$*$#@+...............+#$&=-----=%@.........",
+".....++$=&)))>))=*%@+............+@=,5//}~//,-#%+.......",
+".....@#*);''';'()&$@+............@$>}~i^iiim}5&#@.......",
+"....+%$);ee__<<<_()&#+..........@$&/iaaa14401m/,$+......",
+"....@#=':<<<<87b[_;)$+..........@=,i|444000002i/-+......",
+"....%$=(_[c8cbghb[:;*@..........#=,m20n0000000ap>%......",
+"....+$*)(:_<_[6b7<:;&@+.........@=-~m|14100004ai,#+.....",
+"....@%$&;'j55}[7[<:'=@+.........%$&!]^9ool4001|i,@+.....",
+"...+@#$*&->',5_[<_e;&++........+@$=,!/]{{o1qq1ai!@+.....",
+"...++##&>'j5:[p7c_:'=%+........+%$=!]^9o3lq001ai,#+.....",
+"...+@#*>j__[~87b7<:;=++........+%$-]9334q00004ai,@+.....",
+"...+##*;:<876bgg6[:;=%+........@#=-ia400000000ap,#+.....",
+"..+@$*-:[8887876[_()$+........+@=,/o400nn00001^/-@......",
+"..++$)'}8d7c_<<<:')=#+........+%-/i400004144a^/,$+......",
+"..@%&'e8bg7~55(';)$$@+........@#!{f0000lf99^~_-&%+......",
+"..+#&e_86g8_j,'>&=#@++........+$5|2000039^{]!,=#@+......",
+"..@#>:<867<e'>>-=*$%++........@$~|4000qf{]]/,-=#@+......",
+"..+%;_cc[8_,-&&=$##%@.........%$p2n0003^/!!,-=$%%.......",
+"..+#;:<c[[_,-=&&==$#+.........+$~a00041{/!!!,,-$@.......",
+"..++&;:_[c_j>,,((;(;*+........+@5i|30039]{{^^im~>+......",
+"..@@*&;_[c_(>'e:___e&+........%@>!ia0029]{|a222|5@......",
+"...+$=-e<8_(>(:<<_[:&@.........%=,/|40l9]9o4440a5@......",
+"...+@$*;e_:5je_<:_e;*+.........+#=,{|2af9a2422|i>+......",
+"....@@#&>(e::__<:(;&$+..........@#$!~^|aa222ami5=+......",
+"....++%$&>(:__:_:;&*@+..........+@%-!]^a2a22|p5)#+......",
+".....+@#$=&);;(;)&$#@............+%$=,5]~iii}5=$@.......",
+"......++@#$$==**$$@...............+@#$=-,,)>==#+........",
+"........++@@+@@@+++.................+@@@%%##@++.........",
+"..........+++++++.....................+++++++...........",
+"........................................................",
+".......++###$%+@++.................+@$=$=$@@++..........",
+".......$=&);;)=#@++................=,5}pi/,&#@+.........",
+"......+=;e::_()=$#@++.............+,p|fa2m/,=$%++.......",
+"......+&;e:_<:(-&$@@+.............@,i|a24|^/!-##+.......",
+".....++*);(::__:(>*#@+...........++>_~ma2123^]-=%+......",
+".....++%*&;(:_c8<,&*#@+..........+@$-!i^f1004^!-$#+.....",
+".....+%#$*;;(<86c:>&*@+..........+%$=-]i92000f]!-%@.....",
+".....@@#$=->,:}8[<<(-$%+.........%#$-,/]^fl00449/=#@....",
+"....+@@$$=->,(_~[c7_(*%@........+@#=-,/]{93lqn04^-#@....",
+"....++##$*->>jj_p7b8(=#@+.......+%$=-,/]]991q000|,=#+...",
+"....@%$)(e555}}c7dh6:=$@+.......@#=/^9oooll00000f,=%+...",
+"...+@#=(<8c[[c77bgxb_-##+......+#=,m4000q0n000003/=$@...",
+"..++#$&_8g67876bgywg<-$#@.....++$-!30000n00000t04/=$@...",
+"..+@*)'<767p/[pcmgyb_-$#++....+%-/^2000qlqqn00003/-$@+..",
+"..+@&(e[76[_j55_[7h6_=*#@+....+#5^a00001^of340001!-$@+..",
+"..@#;:[[78<j'>>,:8d85&*#++....%$~a000019{{{{30009!-&%+..",
+"..+#;:c[88_,>>>,/cd8_=$#++....+$ia00001^]]]{3000a!=$@+..",
+"..+#;_[c[c_j->>>:cg75&$%@.....@$p2000n39/]]]f000o!-%@...",
+"..+#;_c[[[e,>---_pg8:=$@+.....@$i20000f^]/]/3000|,=#@...",
+"..+#)e<[[[_,->>,_8d85=#%+.....+$}a4400o^/]{{3000o,=#+...",
+"..++=;e<c8<j>,,(_8d8e*#%+.....+@,~|4n049]{^91000|-$#+...",
+"..+@$*):8b[e>,::[8b['$%+......+@=,/a004o{^fa4000^-%@....",
+"...+#*&e[8<:>e5__[8<'#@+.......@$-5|004f{9f12004i&@+....",
+"...+@$$)e_e5ee___:e;=%@+.......+%=-}|1a9|f122a|p,%%+....",
+"....+@#*)'(:::__e;&*#++.........+@$,/imaaaa2|i!-$@+.....",
+"....+++$=&'(::e:;)#@@++.........+@@*,!ima|aai!=##++.....",
+".....++@#*=&))))=$%@+............++#=-,!}//_,=#@+.......",
+".......+@@#$##$##@++...............+@#$=====$@@+........",
+".........+++@+@+++...................++@@@@@%+..........",
+"...........+++.+.......................+++.+............",
+"........................................................",
+"......+@#$#$$$*$#$##@+............+%$*&-----&==$%+......",
+".....+@$=);;;));)))=#@+..........+#-,/}~~}/~///,=%+.....",
+"....+@$&;'(eee(e'(;;=$@+........+#&5i^^|9|9|mmi~,&#+....",
+"....@#*;:<:__::_e_e()=#+........@$-pa422aaaaaaam},$@....",
+"....+#=:8d7[<<<<<[[<()=#........@$,a000044444004m/,$....",
+"....#$&<bxg7[[<<[86[:;&$........$&540t000q440000|i5=....",
+"....@$&[dxg6[[[<[[c[:;&#........%=500000q0q40000ap5=....",
+"....+#*:8g6c}_:e:::(;)*#........@$)2000nl1a9|aa|i5>$....",
+"....@@*([6c[_jj>);;&&*$+........%%-m00n0399]]~~5(>=@....",
+"....@@$'<8<__e'&==**$$#+........%#=i404419{!,,,--=$@....",
+"....+@@)(:<pc_,=&$$$#@@.........+@#/ma4403^!j-==$#@.....",
+".....@@=)(_[6_(==$#@@+...........@#,}^2002^,,-$%@+......",
+".....+@#=&:[b[,=$$#@+............+@*,/a00l9,-=$#%.......",
+"......+#$&e<8<e-=$#@@.............+$=!|2029/,-$@@.......",
+"......++%$;_[<(')$#@+.............+@$*i2049{/-$#+.......",
+".......@@#;:[_e')=#@+..............@#$~a02|i/,$#+.......",
+".......+%#=;(::_(&#%+..............+#$,i||119!$#@.......",
+"........+@$=)e<[:;#%@+..............+#=,/|20a~$#@+......",
+"........+@%$$'<6<;##++..............+@$=-^404{=$@+......",
+".........+@#$;<8<:=*#+...............+%$=i404|!-$+......",
+".........+@##;:8<:()$+...............+%$$~a0q|m}&@......",
+"..........+@#)e[<::;=@................+%$/|042|i,@......",
+"..........++@=;:::_e=+................++#(paaa2|,@......",
+"...........++$=)(:_e)+.................+@=,}ma2|5@......",
+"............++#$)e[:&@..................+@$=}|015@......",
+".............++@=;e;*+...................+@#(p|i;+......",
+"...............+$*&*#......................+=)5)$.......",
+".................++..........................++.........",
+"........................................................",
+"........................................................",
+"........................................................",
+"...........+++++++.....................+++@+++..........",
+".........+++@@%@+@++.................+@@%#%#@@@+........",
+".......++%$*===&$$%@+..............+@#&-,,,!-=$%@.......",
+"......+@#$&)'';';&*$%++...........+@$=!}iiii~!-=#@+.....",
+".....++@$=;(::::e'==$@+..........+@#&,~^aa1f|i!,=%@.....",
+".....+@=;(ee::::55:'&#@+.........+%,i||aaffaooai!$%@....",
+"....++#;_[<_e:5e_<c_'*%@........+@$~20419fff14n2i-#@....",
+"....+%#e[dc_ej55<7g85=#@+.......+#$|000199994000f,=#+...",
+"....+@$:7g8_5555}7g8e&$@+.......+%=a0001ooool000|,=%@...",
+"....+#$:6h7}(jjj[7g6_=##@.......@$&a00019999l0003!=$%...",
+"....@#$_6k7~jjj,}7h7_-$%@+......@$-2000l999930003/=$@+..",
+"...++#*e7g8p:___cbd6_-$#@+.....+%$-|000l3o33n0003/-$#+..",
+"...++#*e[6787i7m6|g85>$#++.....+@$-|000nnn000000f/-$@+..",
+"...+@$*;:[7mbghhhgg7:-&#%+.....+#=-ia0n000000000o/,=#+..",
+"...+@#$;_<6dhghhhgb7/&*$@+.....+#$-if0000000000n3/-=#+..",
+"...+%#*e_776gbb66bg8_>*#%+.....+%=-94n00000000003],=%@..",
+"...+%$$:cb|bdm7i7mg8_>&$@@.....+#=-fn00000nnn00n3],=%@..",
+"...+%#=5cb6|b7p}c6b7_'&$@+.....+#=,f00000nqln0001{!-%+..",
+"...+%$*:8g7cp}_5}p7c_,-*@+.....+#=,f0000ql3o14001^/-#+..",
+"...+@%=:7g7}55j!:}8p_(;*#+.....+%$,a00nloo993l0019],$@..",
+"...+%#=_6g8_>>,>5}[<_(,=%@.....+#$,20003{{{{o3441|i,#@..",
+"...+%#$:8hc5j>,>5<68_(;*@+.....+%=-|000o^{{]fq002^]>%+..",
+"....@%$:8g8_,',>5cd6_;)*++......@#-a0003^{{]o0002i/>@+..",
+"....@@$:8d8:,>>-:cg6<'&$@.......%#=|00no^{]/f0004i5=%...",
+"....++%;:[_:jj,,:<8<(&$@+.......+@#~a02a99^^f204m5-#+...",
+"....++@=;(ee:ee(:::e)$#@........++#,pm9|o|9|faa|}-$@....",
+"......+#$*;(e:::e(;)*@@+..........+$-,~m|a|a|mi/-#@+....",
+"......++%#=)';;;;&)*#@+...........+%%=,/i~pi~55>$@+.....",
+".......+@@#$=****$##.+.............+%#$&,>>--==$++......",
+"...........@+@+@++++..................+@@#@#@@++........",
+"............++++++......................++++++..........",
+"..........++@@@@+++...................++@@@%+++.........",
+"........++++@@@@@+++................++%@#####%@+........",
+".......++@$=)&))&*$#++.............+@#=,55//!-=$@+......",
+"......+@%#&;(((('&=*%@+...........@@#$!~9mmmi5,-$@+.....",
+".....+@@$$)e::::e'-=*@++.........+@#=-/9aaaa|{/,-#@+....",
+"....+@%=;(ee:::eee:()*%@........+%#,~9||afa9faa^/-$@....",
+"....+@#)_[__:e((:<[<'=$@+.......+%=~1441ff99|404^,=#+...",
+"...+@%*([68<55,,_868e)*#+......+%%-m0004f9^^1n00a/-=@...",
+"...+@#*ec6[_e(,'e<7[_>&$@+.....+@=-f00039^{{f400a~!=@+..",
+"...+%$*:cb[5,,>>j<c<:(>$@+.....+#=-an00f^{]]9404a^~-#+..",
+"...+@$*e8b[5>>>>(:<[:(;=%+.....%#=,f004o]]]]^f041|i,%@..",
+"..+@#*&_8gc5>,>-j_[[_e'=%@....+@$-!a000o{{]]91041|i,#@..",
+"...@%#=_7gc/>,>>j_8[_e'=#+.....@$=j100q3]{{]91n019i,$+..",
+"..+@$$=}6g8:>,',5_8c_e;=@+....+@==!100n3{{{{o1002|i,#@..",
+"...@%$&_6h6~5!5j_c6c_()$%+.....%$-j2000looo910001^/-#+..",
+"...@##=}bhdmc[~[c7b8:;&$@+.....@$=!10000nqlq0000ai!=@+..",
+"...+%$=_bkhb7667bbg8_)*%+......+#=,10000000000001/-$+...",
+"...+@#=:7ggdb66c877[(=$@+......+%=,a000000000000m,&#+...",
+"...+@##(<87bb7[___:()$@@.......+%$=^40000n03a2a|/-%@....",
+"....@#$>5<c76c/>>;)&$#++........@$=]f4n0003{]]/!&$%+....",
+"....++#&'5[8bp_'>=*$#@@+........+@$5if40041{]!,==#@+....",
+".....@@*&>_~8[_5(-*$#+++.........@#-!~1q00lf^/,*$@++....",
+".....+@#$*(<78c<5>*#%%+..........+@$-,m40004f]-=##+.....",
+"......+@##;:c[[[_'=$@++...........+@$={a0000a{,=#%+.....",
+".......@@#=;e:_<:';&$@.............%#$(~|a24a^]5=@......",
+"........+%$$=;(::ee;$+..............+%=-,~^aa||p-@......",
+".........++@%=;e(:e;&@...............+%%$,p||a|i,@......",
+"..........+@@$=))))=#+................+@#='}_}_,$+......",
+"...........+++@##$#@+..................++@#$*=$#+.......",
+"..............+++.+.......................@++++.........",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+".............++++........................++@+...........",
+"...........++@$$#+.....................+@%&=$@..........",
+"..........@#*&;e>&++..................@=-5i|~,@+........",
+"..........#*)(_[:)@+..................$>/m20a}%@........",
+".........+$=):[6<'#@+................+&,}a004i$%@.......",
+".........+#*)ecd[;$%@................+$)5|000i=#@.......",
+".........+@#*e[d[e$#%+...............+%=>r000|-$#@......",
+"........+@@#$(cg[e=#%@..............%%#$&|000|,*#@......",
+"........++%#*([6[e>=#@+.............+@#=-m000f],=@@.....",
+"......++%%#$$;_8<:()*%@...........++#%$=-{202a^/,#@.....",
+"......+@@##**'e[__e'=%++..........+%%$=--ia042|i,%@+....",
+".....+@$$&&));e::_:e)#@+.........@@&-!!//{|aa12|/$@+....",
+"....@@@=;';''';(:_[:>#@++.......@%%,~i{{i{i^f20a~&#@+...",
+"...+@%#)(:e(e,>-e_8_'*#@+......+##=/^1f9|^]/9102i-$@+...",
+"..+@#=&;:_5(;>>&(_8<(=#@++....+@=,!iaa|^{]]/^204^,$#@+..",
+".++%=;(e:_:,>>--j:8<'=$#@+...+%%,~^|a1f^]]//9104^,=$%@..",
+".+%#)e:___('---)(_8<(=*#%@+..+%$/||1129{////^104^!-=#%+.",
+".+@$;_[[<}:,'>>,_[6c}(;-=$#..+#-i20041f^{{{^300019~/,-$.",
+".+$=:cb8[__:(5__[6db8c<e()*+.%=,a000q41o99310000004a^/-@",
+"+@$&<bhb8____<c76dhgggb[:(&%+#=54000n123140000000000am5#",
+".@$&:6gc__:55_<[886666c[:;=%.#=!20004aff|12000000000ai,%",
+".+#=(<8_(;'>>;('e:::::e(')*+.@$,m2029~i]~i^m||aaaa|mi}>@",
+".@#$)e:;>*$$$*$*==&=&&&&&=$+.%$=~||i/,--->--(,5,55555,&+",
+".+@#=;'&*$$##$#%##$#$#$**$@..+#$'pi5-==$$=$$$=&$=*=>>=#.",
+"..+@$*=$#@@%@+@%@%@@@%@@@@@...+#&>,-$###%@#%#%%#%##%##@.",
+"....+@%+@@++++++++@+++@+........+#%%@@++++++++@+%+@+....",
+".......................+...........................+....",
+"........................................................",
+"........................................................",
+"..........+@@++.......................@@#@+.............",
+"........+@#$=$@+....................+@$-,=#+............",
+".......++%*&;=#++..................+@#>5~,=@+...........",
+".......@*=);()=@++.................#-,/im}>@@+..........",
+"......+$)'e:_(&#@++...............+-}i|12^!$%@+.........",
+"......+)e_<[[:>##%++..............+5|v200a]=$#@+........",
+"......+*(:<[[:()=$@++.............+,m2400am/,=%@+.......",
+"......+*&;e:<<_:,&$%++............+>5p|a4411^!=#@+......",
+".......+#*;e:<c8_'##@+.............@$)~|24002i=$@@......",
+".......++@&;:_87<(&*#%+............+@#5ia2004m!-=#@.....",
+".......+@@*&;(:<:_:(&$#+...........+@#-5~m|411a^5=$+....",
+"........+@#*=);(:<8_(=#@............@@$-(/i^a204^,=%....",
+"........++@#$*&):[68:&*#+...........+@%$=-!}a000a5-$+...",
+"........++@%$$=&e[bc:)$@+...........++%$=-,/|000|/-#+...",
+".........+@#$$=-e[68:)=#+............@@$=-,/9000a},$+...",
+".........+@@#$&&([6c:)$#+............+#%=-j!|000|/-$+...",
+"........++#$*);e::<:;=#+............++$=-/{||24ap,=@....",
+"........+@#$-(:<_e;;=#%+............+#*-/^a42|i~,=#+....",
+"........@@*&)e<c_(=$#@@.............@%-!/|402m,>$@%.....",
+".......+@$)(__:_()*#%++............@#=}m2222|/-$#@+.....",
+".......%$*(<c<:;)$$@@+.............#&,m402ai_-=%%+......",
+"......+#*):8dc(*$#+++.............+$,52000m-=$@++.......",
+"......+*)(:[c:;*%%@+..............+>}ma00ap-$#%+........",
+"......+=(_:ee;=@@++...............+,m2ar|~,#%++.........",
+".....++):[:;**$@+................++}a01p,>=%%...........",
+".......=;:;&*#+++..................,i|p5>$@++...........",
+".......#*)$$@%+....................$>}-=%#+.............",
+"........++++++......................+@++++..............",
+"..........+...........................+.................",
+"........................................................",
+"........................................................",
+"........................................................",
+".........+++@+@+@+...................++@@@@@@+..........",
+".......++@+%@%#%@+@++..............+@@@###$##@@@+.......",
+".....++%#**=&&&&&*$#@+...........++#&--,!!!!!,&$%+......",
+".....+@$=;;;'((e(;&*$+++........++@-,~~ii^9r^~!,&@++....",
+"...+@@#=;(ee:_<<_e')=%++.......+@#$,~|||a2442|i/,$@+....",
+"..++#$&;(eeee_<c<_e')=*#+.....++$-!~^9|||14041|i/,-$@...",
+"..+@=;e(e:(,':c6c<_ee')*@+....@#,p||rf9^{a00043||i/-%+..",
+".+@#;e<_:e(>-:[b7[__:e(&#@+..+%$~a221|^]/f000041aam5$#+.",
+"++@$'_[_:e'>-:cd6c____e)*#+.++#&i202f9i]/f00001111a}-$@.",
+".@$*(<[_'>>&=e[bc_jee::'&*$+.%=,m401^]]j!f00019f|a9i!,=+",
+"+#$&e[[_;==&&j[bc_',:_:('&$%+$=!|00ai!!!!94001{^f219~5-#",
+"+#$&:[8e>===&(<8[:,je::e(;=@%$-5a00|],,,,9400f{9ffa|mi,%",
+"@$=)ec7_>=*==>:[<_:_:ee::e)#@=,_f00a],,,,{a441aaf9|aa|}$",
+".$&;_[8e,*=**-(e__[_5ee_[<;#+&!p200f{>,,-/^a14q1f992q4p&",
+"@$&):c7:'=*=$->':_c[5,(_[<'*@=5~a001{,-,-/]^f4nqf^9z04i-",
+".%$):[7_>&=$=*->e<c[_ee:<_)$+$=5a002{!!-,,/]f2002f|122}=",
+".+#*ec6<(-&***=&j<78<e::_:)#.@$>r004^/!---,!92002f9a2a}$",
+".@+$([8_e>&=*$*=;<88<_e::e&#.%@=m002|]!!---,i4004aaaa|5$",
+".++#)(_ee('>>&==>e__<<_e()*+.+@$}ma||^{~]!,,]|22442|^~>@",
+"..++$&);(e('(>&$&;':_c<e&&#@..+%=5}pm|mim]!-!]^f40qr5,$@",
+"...++#$=;::ee'-$*&&;_8[(*#++...+@$=5i|a||i/-,!5i200m,$%+",
+"...+++#*&))))=*$$**);((&#++....++@$-5}}}/,)==--5i|m5$@+.",
+".....+@@$$$$$$$$###$*==$@+.......+@#*&-=--&=$=$=),,=@+..",
+".......++++@+@%#@@@@++++...........++@@@@@$$%@#@@%++....",
+"..........+++++@++++++................++++@%++++++......",
+"...............+...........................+............",
+"........................................................",
+"........................................................",
+"........................................................",
+".........++.+........................++.+...............",
+"..+++@+@@+@+@+@+++............++@@@%@@%@@@@+++..........",
+".++###$%@%%%#%@@@@++.........+@$$==#####$###%@@+........",
+".%#$$$=*$$##$#$##%@+++.......#$-&-,-=======$$#%@++......",
+"+#&);;>>->'(((>-&&&*#@+.....+=!}~~]]]]{^9^]/!!!-=%+.....",
+"@=;((:ee(5_[[_ee''')=#@+....@,~m|aa|9f1404a|^ii/,=%+....",
+"@&(:__<<__c7d7c:_:e(&$#+....#5m|22242100000aaaam5&$@....",
+"+*);(e(eje[7d8_(('')=$%@....@>}{^99f^f400019^ii},=#@....",
+"@$$&->,,',_8bc_'>>-&$#@+....%=-5/]{{^^100n1{]]/!-=#+....",
+"+##$$*&--,_7bc5-&=**$#@++...@$$=-,!//{3n00o]!,,-=$#@+...",
+"#$)>>>->',}8g8:>>-&=$$$@+...$-/]]]/]{^10003]]/!,-==@+...",
+"*)ee(>>,'j}6di},>,--=**@+...-}|a^{{{^9300nl^{{]/!,-#+...",
+"*(<c_e,j!5c7h7}j,>'>-&$$@...>|2039^999n00039^{{]/!-=%...",
+"$;:_ee''(!c6h7<j(''>)&*#+...=pa2|9{^99q00049^{{]/!,$@...",
+"$&;e'''(je[6g7}(,'-;-&*#+...&5i|ii{^99n0003^^i]~/5>$+...",
+"@*&))->',e<6g8_,,;>)&&*#+...#)5}/]~{^940001^^]]/5!-$+...",
+"+#$=&)->;,<8g8_'>>&&=*$++...+$-'!//]i{40003{]]5!,-&%+...",
+".@@#$**=->_8d[:&&=$$##@+.....@#$&>,,/]3000|!!,-=$$%+....",
+"..++@@#$$*:[b['=*##@++........+@#%$--,a000^,-=$#@+......",
+"....@@%#$$ecb['$*##@+...........@%%$=-|004^--$$@@.......",
+".....+@##*e[6<,*##+@+............+%$=-|004^-=$@%+.......",
+".....+.###e[6<'*##@+.............++%$=9004i-=$@+........",
+"......+@#$([b<'*$%++..............+#$=m001^-=#%+........",
+"......++@#([d[e=$#@+..............+@%$m0009,-$%+........",
+".......+%#([d[:)=#+................+#$m000f},$+.........",
+".......++@'[d[:)=#+................+@#i000|},=+.........",
+"........+@);_()*$@+.................+@5i2m},=@+.........",
+".........+$*=*$#@+...................+=)(,=$#+..........",
+"...........@+@++......................+@@@@+............",
+"............++.+........................++.+............",
+"........................................................",
+"...........++..........................+%...............",
+"........+@$*=$+.....................@%=>,&@.............",
+".......@#$&);&#....................%$>5_i,$.............",
+".......+$*)(e;$....................@&)}m|p).............",
+".......@#$;:[(*+...................@$=pa0i,+............",
+".......+@$;_8:&+...................+%&p2015+............",
+".......++$;[6:)++..................+@&i00a}@+...........",
+".......+%@;<6_)@+..................+##p402}@+...........",
+".......+%$;[6:)++..................+%&i00a}@@...........",
+".......@+#;<6_;%++.................@%$p002~#++..........",
+".......@@#;[6:;@@+.................@#$i002p#@+..........",
+".......@@$(_b_)#++.................@#=i402}$@+..........",
+".......@@$;[6_;#@+.................@#=i002~$#+..........",
+".......+@$;[6<;#%+.................@#&i004~$%@..........",
+".......@@$;[6_;##@+................@#=i004i$$@+.........",
+".......@@#(<b_'##@+................@#$m002{=$#+.........",
+".......+@#;[6_;$#@+................+#$i002i=$#@.........",
+".......+@#(:6<'$#%@+...............+#$i204i-=%@+........",
+".......++@;<c_(=*#++...............+@#i402^,-*@+........",
+"........@%)e[_e()$%+................@#_|02|^/-#@........",
+"........@+&;(::_e&$@+...............@%,p|a22|5=@+.......",
+".........+$=):[6_'#@+................@&,/|002i=#@.......",
+".........+@$*;:[:'&$@................+#=(ia0ai,=%.......",
+"..........+@$&;(';)=#.................@%&,pmip},$.......",
+"...........++#$*&;;)#..................+@$=>5~i}=.......",
+"............++@#*&;&$...................+%#$>5p5&.......",
+"..............++@$*$+.....................+@%&>=@.......",
+".................++..........................+@.........",
+"........................................................",
+"........................................................",
+"........................................................",
+"............+.+++.+.....................+.+++.+.........",
+"........+++@+@++@@+@+++.............++@@@%@@@%@@@++.....",
+".......+++%@%####%#@%@++...........++@###$$$$#$##%@+....",
+"......+#$===&=&*&=&&==$%@+........+$-,,,!,!,!!!!,,-$@+..",
+".....++=;((('(,(,,(,'>)*@+.......+@,~^m^^^^^^^^^{~/-#+..",
+"....+@@)(___________::'&#@+.....+%#/|232131a32a11f^!=%+.",
+"....+@#;_<<:_:_:_:__}__>$%+.....@#$~2022aa13a11114f]=#@.",
+"....@@#([8c_j55j555_[[<'*#@+....@%=m4041999o9oo34n4i,$@+",
+"...+%#*e[b~_jjjjj555p7c(&$@+...+#$-|00q399999oo3q009!=#+",
+"...+%#=:86c_j5,555/<cmcj=$@+...@#=,|000lo99o9ooln0n9!=#@",
+"..+@#*&:c68p<}}}}}}p7675&$%@..+@$-j3n0n43l3llllqn009!-#%",
+"..+@#*-_[78c8[pc878i66c/-##+..+@=,/f00nnnqqqnnnn00no/=$@",
+"..+@*)>_86m7i78i7i767m8:-*#@..+%-/]1n00nnnnnnnn00003/-$%",
+"..+#)(_<c8c888787m6668ce,=#@..@$/|20nnnnnnnnn000000f{!*%",
+"..+%;<c888iccip77m6m87p5'-*@..+$i20n0nn0nnnnn000nnq9{/-%",
+"..@#([78c8p88c8i76bm8p_e')*+..%$m000nnqnnqnnn000nq1fi/-%",
+"..@%)(_<pcp[ppcp8mgm7}_,-*$@..@#/m144nqq4qqqn000nl3^/,&@",
+"..++$&>e~cp[[}[p7bhb85,>=#@+..+@-5]fln4qqlqq0000nf^],=@+",
+"...@%$=,_c[}~}~}76hbp:>&$#++...%%=,^1nqllllln000qo]!=$@+",
+"...+%#*e[7p}<_:/~877<:'&$%+....%#=-940qll333l0004f^!=#+.",
+"...++#*j[bc}5/55_}p<_:(&#@+....+@$-9n0nloooo3lq41|^!=#+.",
+"...+%##e[b[:!5jj55_:::e)#+.....+%$=|0043oo99o93a1a|/$+..",
+"....@@$([8p_5jjj,(,''')*@+......%#*^40q3o9999^^^ii/-#+..",
+"....+@#'_8<__:5e'>)&&=$#+.......+#$i20413o99^]/!!,-$+...",
+".....@@)e_<___ej(-$*#@@+.........%%}|44111f9^/--&#@+....",
+".....+@&(e__[<_e'&$#%@+..........+#!ia24041a{!=$%#@.....",
+".....+@$=>:[7<_e'&#@@+...........+@&,]|000a|i!$%%+......",
+"......+@$$ecd7<e>*#++.............+#=>|0004|~,$@+.......",
+"......++@$;:<_(>&$@@..............++#=pa02m~!=%@........",
+".......++%*);;=*$@+................+@#)_i~5-=#+.........",
+".........+@%##%@++...................@%#$$%%@+..........",
+"........................................................",
+"........................................................",
+"...............+.+.........................+.+..........",
+".............++#%$##+....................+@$$==$@.......",
+"...........++##*==)=#+.................+@$=-,,/,$+......",
+".........++@%$*=);;)$+...............+@@#=-,}pi}-@......",
+"......+++%@##=>(((e;*@+...........++@##$=,]^^m|~>@+.....",
+"....++@+%###*>e:_::'&@+.........++@@#$$=-]|a1a|i!#@.....",
+"...++@%##$*=='_c<_e'&#@@.......++##$==-,,{1042ai!$%@....",
+"..+@$&>;>'>>'e_c[<<:;$%+......@#-5~]]{]{{f20044a~=#@....",
+".@%*;:<__<_::_}cc87<'*%@+....@%>pa44441aa1lqn004^-#@+...",
+".@$&:8d6668cp[<<c6bce*#@+....#&5a000000nq44l00009,$#+...",
+".@#=([7866878c[}c8bce&*@+....%$,m000000nnn4l0000|!-#@...",
+".@@#)(:<[87ccp}_[<c[e'&$@....%%=}ma40000nq43l0n0ai5=@...",
+"..+@$=)e<[887p_!_}<_:e'=@+....+%=,}|40nn0q1o1141a|i,%+..",
+"..+@%$=;:<c86[_j5e::::;&@+....+%$=,ia4000ql9ff1aa|i5#+..",
+"...++#$);(<i6c:',''(e:e)#@+....+@$=/i94n00f{{{i^|a|/&%+.",
+"...+++#$=-:cb[5---&)(:e;*#+....++@$-,/|n00o///!]ma|~>$+.",
+"....++%##=e[6<e-&**&;:e)*#+.....+@#$=,|0009/!,-5i||_>$@.",
+".....+@%##;_<<e'>&**&)=*#+.......+@%$=~a04|^]!--:},>$@..",
+"......+@%#)(::_:(-#$$##@+.........+%#$/^aaa1m/===&$#+...",
+".......++@$&((:_e)$#@%++...........+@%>/^|a1|/=$#%@+....",
+"........+@$$&;e:e)&*#@+.............+@=-5i|a|~!>$%+.....",
+".........+@#$;;:e;;&$++..............+@$*_ia|i~5&@+.....",
+"..........+++=;:e(;&$@+...............+%@,ia|mi5=@+.....",
+"...........++#&));;)*+.................++$,}}pp_>%......",
+"............++#$=&;&*#+.................+@$=,5p5)$@.....",
+"...............+$*)&*@@...................++=>}5>#@.....",
+"................+$*$#@......................@=-=$%......",
+".................@+++........................%@@+.......",
+"........................................................",
+"........................................................",
+"...........++++++......................++++++...........",
+"........+++++++@++..................+@+@@@@#@+..........",
+".......@$=$$#*);&$@+...............%&,==$-/p5-%+........",
+"......+$&;&=$)(_(=#@+.............@&5~5,=/m2^,$#+.......",
+".....+@=;(;=='_[:;$@@+...........+@,~|]!,{20a~=%#+......",
+"....+@@)e_e>=e<6_'$$#++.........@@#}|2|]!9404{-=$@+.....",
+"...+@@#;<c_(-e<b[j&##@++.......+%#*i402^/f0009!=$%@+....",
+"...+@#$([6<5'_8b[5==$#@+.......+%$&m004f{10009!,=$%+....",
+".+@%#$$:[6<5'_8gc/-=*#%@+....+##$=-f0049{100no/!-=$@+...",
+".+#$#$=:86c:j~8gc_>-=$$++....@$==-,|00039ln0q3]/,==@+...",
+"+@$**$=:c6p:j}7g8/>-*$$%++..+#----,fn0q39l00n3{/,-=$@+..",
+"@*)''';<7g7~:8mg6}5,,-=*%+..%-}ii{i400n33n0003o^{/,-#+..",
+"@&e_:eecbg78~7dkdc:5j',*#@+.@5|2aff0000nln000n3o9^{,=%+.",
+"#;<[[<[8bhb7cmghg6p~__()$%+.$i4004400000000000lllf|/&#+.",
+"@)(::::86g67}8dgm8__5('=#@+.@}maaa|n000nln000n13f^i,=#+.",
+"+$&);;;<mbc}/p6g6p5(,>&$%@..+=5}~~i4000l3q000q99^]!-%@..",
+".++##*=:cbp_j}cmc}j'&=$#++...+@$=-,a00q39ln0n19{!,=$%+..",
+".+++##*ecb<!'5p7p_j>-*#@@+...++@$&,|0049{oqnq39{/-=#@+..",
+"..+@%$#e[6<5,j_[<_:(-*$@+.....+@%=*|00qo{o1044|9/-=#@...",
+"...+@@$([6_(-(5__}<5>$#%@......+%%=m0029/^f31149]-$%%...",
+"....+@#(_6_(->,e:_<e>$#@+.......+#$m402^/]^9324a]-$#+...",
+"....+@@;<6_;&&>>(_[_'=$%+.......+%%i402i!!]~9202{,=%@...",
+".....+%;<8:;====;_[<(*$#@+.......+#i40ai,,,,i304^,=$@+..",
+".....+@;_8:;$$$*)e[_(&$#++.......+%p20a~----_|02m!-$@+..",
+"......+)e[(&####=;;;';&*@+........+}|0m!$$$$,~iii]5-#@..",
+".......&(_;=#@#@#*=&;(;=#@........+5m2p,$%$#$-,5~mp,$@..",
+".......*;e)*@+@+@@%$&(;=$++........)p|})%@@@%%#&5mi,&@+.",
+".......#*&*@@++++++#$==$@+.........$>5-#@+++++@$&,,&@+..",
+"........+@@+....+.++@#@+............@@@+....+.++#$#@....",
+"........................................................",
+"........................................................",
+"...........+++.........................+++..............",
+"........++@###@++...................++#$=$%++...........",
+".......++@$)(&*+++.................+@@-}m5-@@+..........",
+".....++@@#;:<e)#@+@+.............+@%#$~a4|/$%@@+........",
+"....+@%##$;_8:;$$%@++...........+@#$$=i401~=&##@+.......",
+"...+@@##$=e[6_,=$$#@++.........@#%$=-,|004^,-=$%@+......",
+"..@@#$$===:cb[(*=$$$%++.......@@$=-,,jf0009,,-==#@+.....",
+".+@#$&&&->_cdc:>-==*$%@+.....@%$-!!!/]1000f]/!!-=$@+....",
+"+%#=':__5([6h8_jj:5';=$@....+#$,{a33o94000399oo^~,-%....",
+"+#*):76c[_cbkbc__[c_e;&#+...+$,/10004l0000032404|~5=+...",
+"@$*'[bkbc~6dhb7}cc68_()=+...#=,i4000nl0000nl00002m}-@...",
+"+$*-<6d8}_pdhmc:}[8[_(;*+...@=,/4000l3n0000f10002m~>@...",
+"@$*&<6d8_5p7g7}j:<[<:(;$@...@=-/200n194000l93404am~-@...",
+"+#*&_8dp5,[7g7_>j_[<:(;*+...@$-!100qo^l00n1{9304am~>@...",
+"@#$=_7gc_jpbh7}5_<8<:(;*@...@$-j100qlo40003f34041m~>@...",
+"@#$=_7dm<_8bhbc_<c7[_()*+...%$=!a0004ln000n340002m}>@...",
+"+##*_6g6c~7gkb7_c768_()*@...@$=,10000400000400004m/)@...",
+"+%#$(<8[_:c6h7[:__8<:;)$+...+#$-90001fn0000f2404ai/&+...",
+"+@#$;:<e(,<7g7_'e:::;)*#+...+@$*~f2f^{20001{9|2ai},$+...",
+".+@#*)'--&e8b<(-)'(())*%.....@%$,}i//!|0009/}imi~5)$....",
+".++@$=)&**e[6[(==))&=*#%.....+@%=,/!,,|000^,!/~5,>$%....",
+"..++##$***ecb_(=$=**$@+.......++$=--->|002^,-,)>=#%.....",
+"....+@@%#$(<b_;$$#@++...........+@%#$*m002i=*$#@@.......",
+".....++@@#;_8_)%@%@+.............+@##$p202}$%#@+........",
+".......@@@):[e&#@++................%@%}|0r!$%@+.........",
+"........++&;_;&+@+..................++5i2i,@@+..........",
+"..........*)()$+.+...................+>}m}&+.+..........",
+"..........@$=$+.......................%&,=%.............",
+"...........+++.........................+@+..............",
+"........................................................",
+"........................................................",
+"...............++++++......................++++++.......",
+".............+@###@@@++..................+%==$%#%@+.....",
+"............+#*&=$*$#@@+................+$>5,--&$%#+....",
+"............+$&;;&=**$$+................@&5i~!,,-&=@....",
+"...........@+&':e'-&&*$@+..............%@,i1|i/!!,=%+...",
+"..........+@#):c<:'>-&=#+.............+#$/a02f^]/!,$+...",
+"..........@@#;<7[<(('>=#+.............@%$i200199i~,&@...",
+".........+@##(<68[_:'>=$@............+@$=^40001fi],=@...",
+".........++#$;_c[[<_(&$#+............+%$-i300041^!-$@...",
+".........+%$*>e<p87<(&$@@............%%=-]f440049!=#@...",
+"........+@#*&,e}pc7[,&$%@+..........+%=-!^flqn04^!=$@+..",
+"........++$&;:<8877<(-$#++..........+@=!~f4nnn049/-$@+..",
+"........+@$>(_cm7c8}e-=$++..........+@-]^10000n4|/,=@+..",
+"........@@=>e_8d77c_5>=$%+..........@#,]m4000n0l9],-#+..",
+".......+@@$-'_cb78p_e>-$@+.........+@%-/{3000n4lf]/-#@..",
+".......+@#$=-_8bmc}}5'-=#@.........+#$=!/1n00nl1f{/,$@..",
+"......+@@%**-jp668<_5'>=%@+.......+%#$-,/9q00n43f^],$@+.",
+".....@+@#$*=&:[b7i8<_e'&$++......@%%$=-,!fq00nn43|{!=@+.",
+"...++@%##$*=-!}76878}_(&$@+....++@#$==,!/9l000nn419!&%+.",
+"...++@#%*$==-5~877m8p_5)#@+....+%#$$--,!/oln0000q1f/=%+.",
+".+@#*=&->>,je<[8788c<:'&%@+..+#$-,!/]]^994q0nn0n4|i!$#+.",
+".+#$);e(e:__c[p[c88[e(-=%@+..@$-/i9|99140nq0nn04f^/,%@+.",
+".%*=':___<[8678pc[[<(-*$@+...%-,ia222400000400049/,=#@..",
+".@#*)(::::_<<_:e5:_5('&$@@...%$>}maaaa2222afffaf^i!-@%..",
+".+@$)'eeeee((;,;>'>'(;;*%+...@#=/i||||9^mi{~]i]i^i~,%+..",
+".+@@=;;';;)*$*$*$$$*'e'&+....+@#,~iiii/,----=--,i|i,%...",
+"..++$&)))-=*$###$%#$&))$+.....+@>,/}}/,-=$*$=$$-5}}=+...",
+"...+@#$$**##@%@+@%@%$$#@.......+#$-=--=$##%%##@#=-$#....",
+".....+++@@@@+@+@++++.+...........++@@@@@%%+@++++.+......",
+"........................................................",
+"........................................................",
+"...........++++........................++++.............",
+".........+@#$##@++...................+%=-=$%@+..........",
+".......+@+$&))=*#@+................+@@&5}/,-$%+.........",
+"......++%#&;e;)=*#++..............+@#$5p|i/,-$@+........",
+"....++@%##;:<:'=$#%@+...........+@##$=]a4aij-$#%+.......",
+"...+@###=$([6<'&$$$@+@.........+@$$=--^004^!--=#@@......",
+"..++@$$$=&:cg[:==*$$%++.......+@#=--,!|000f!,--=#@+.....",
+".+@#&'e(''<bh6<j,>-&=$#@.....+%$5i|^{^000029{{/!,-=%....",
+".+$=(<8<__7dybc__:e(';=$+....@=,m400110000031f|m{},&+...",
+".#$)<6gb8[bhxgbi[[__e(;$+....$-/40000000000n0442|m~-@...",
+"+@$=<bg6c[7dhg6cc<<:e;)$+...+#&540000400000n044a|i}&+...",
+".@$=:7d8_5<8b88c[_ee')=#+....%=,20001o4n00nnqlf|i/,=+...",
+".@#*:8d<:>!}[p<~__(;)*#@.....%$>|004a{o1q44l1a^i/-=@....",
+"+@@*:86<5'j:_~[p_5'>=*#@....+##>a0049{9f1lq41f^],-$%....",
+".@@$e86<(,,j5_p8_(>&$#@@.....@%-|0049{^9o1qn29]!-$#%....",
+".@@$([8<5>,>,:[6[j&=##@+.....@#=m004o{^{{30049!,=$@+....",
+".@@$([8<j',>,:<6<j&*$%@+.....@#=m0019{^{{o4049!-=##+....",
+".+@#;:[:_:jj,_<8<e-=##++.....+@=pa02ao99^14n4|/,=$@+....",
+".+@@)(:____:e_<<_'>&*@%+.....+@#}ma2113of3403^]!-%#+....",
+"..+@=(e:<<__5__<:(>)*#++......+%,i|a4021f112||]/-$@@....",
+"..+@$=):[7<<:5('(:e(;=$%+.....+%>5_a0002|f9m^||m~,&#+...",
+"...+@$=ecb8<:(;-;e<e(;&#+......+#=,a0004a^~/i|4a^~5=+...",
+"....@@#e[dc<:;&$)(<_e;&$+.......@#$|0004ai!-/|42|p5=+...",
+"....++%)(_e;;&*#=)(;;)=#+.......+@#5|2ri~!>$,}mi~/,=@...",
+".....++%&&&**$#@%$*===*#+........+@$,55)>=$%$=-(,,>$+...",
+".......++@+@++@%@++@$$$%+..........@+#@@@@%%@%@@&)&#+...",
+".........++++@++++++@#@+.............++++@++++++#$%+....",
+"....................+++.........................+++.....",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"......++@+@+@+@+@+++..............+@@@@@@@@@@@++........",
+"....++@@%@##%#%@%@@@++..........+@@@##$$#$###%#%@+......",
+"...+@%###$#####$#$##%@+........+@#=$==$=$===$=$$#%+.....",
+"..++*)'>&*&$*$$#=&>)&$#@......+@-/i]!,,--=-=,!]/!-=%....",
+"..+#)e_:,>-==$==-':(;&=#+.....+$}|2f^]/,,-,,/ia|~5,$+...",
+".++#(<c_(,>-=&**>:<_e'&#@....+%$^4029{]/,!,,{f42|i!=@...",
+".+@#([8<5>>-*&&&,e<<e;)*+....+@=m0049{]/,!!!{f44|i}-@...",
+".+%#([8<e>--&&==,e<<:(;*@+...+%&m0049{//!j,!{944|^~>%+..",
+".+@$([8_(,--&&=&>:_<:(;=%+...+#=m0039{//!!!!{a423m~,#+..",
+".+@$([8<j--=&&&&':<_:('=@+...+%&m0029]/!!j!!{f4419i,#+..",
+".+@*([7<(,-&==&&>5[<_e;=%+...+#-|0049{/j,,!!{f42a9i,%@..",
+".@@$([8}j--==&=&>:<_:e;=%+...@%=m0019]/!,j,!{344a|ij#+..",
+".@%$([8<(,--===&,5[<_e'=@+...%#-m0019{//,!,!{fq4f|i,%+..",
+".+@$([7_j--====='5<_:('=#+...+#=|001^]/!>,!j{f44a9i,$@..",
+".+@$([8_(--&=*==,:[<_e'=@@...+#=m0019]/!,,,j{3q41|i,#@..",
+".+@$([7<5,,--->-j_[<_(;&@+...+#=|0049^{]//]/93041|{,#+..",
+".+@$([8[_e!j,,,(:<7[_e'=%+...+@=m0003o99{^^^a40029i,#@..",
+".+@#([7[[__:_::_<868<e;=%+...+#$m0004413afa140002|~,#+..",
+"..+#;<8c<_::eeee<[8c_e;=@+....@$i40041afff|f40001|~,%+..",
+"..+#;<[_e('';>',e_c<:';*++....@$i402f^i{~~{{9204a^~>@+..",
+"..+%;:[:'-&*=$=*>(<::;;*@.....+#pa0|i/!,,-,,]|42ai~)%...",
+"...@)e_()***$#$$&;ee';&$+......@}|2m/,--===-!i||ii5=+...",
+"...+$&)&$$##%##$*&))&)$#+......+=5}5-=$$$$$=-!_/55-$+...",
+"....+###@@@%%@@%%#$$###.........@$=$%%#%%#%%#=*&=$$+....",
+"......+++++++++@+@@@@+@...........+++++++++%@@#@#%@.....",
+"........+.+......+++................+.+......+++........",
+"........................................................",
+"........................................................",
+"........................................................",
+".......++++++++++..................++++@+++++...........",
+".....+++@@@%@@+++@+++............++@#####%@@@@@++.......",
+"....+@#####$$#$##%@++@+.........@#$$$$$=&$=$$#%@@@+.....",
+"...+%$*$$*$$**$*##$#%@%+.......+#=------,---==&$##%@....",
+"...@#&-------&-&&===*$#@@+.....@=!///////!/!!!,,--$%@+..",
+"...@&e____:5jj!5555(,(;=#@+....#!|2133o999oo99f9^^~,&%+.",
+"..+#(<7877[<_<<p[[[[<_e;=#@...+$m40000nl314qq00042ap,&@.",
+"..+#([b6bb78<p878888[[_'=$+...+$m000000n4qn0n000002i,=@.",
+"..+@)(_<88c8pc86c<_::e()$#@...+%}m20000nq0n0041fa|m5&$@.",
+"...+$=)e_ppcc877p_';;))=@+.....+&'}|24qnn0n043^{i~/,#+..",
+"...++#$)e_[}[i66[5>&&&=#++.....+@$*]f144qn00q9]!!!,$@+..",
+"....@@#&>(5__p8bc5-&=$$@+.......%#$,~^ff1q000o/!,-&%+...",
+"....++@$*->>,<cb[5-*$##++.......+%#=,/]{^3n00f/,-=$%+...",
+".....+@@#$*--_pdce**$%%+.........+@#$=,//10009,-=%#+....",
+"......+@@$$=&(c6<j=$$@@+..........+@#=-,!90049,-=#@+....",
+".......+@@#$='<6<(*$#%+............+@#$-,^401^,==%%.....",
+"........+@##*'_c_,$$#@+.............+%$$-i202{-=$@+.....",
+".........+@%#-:[_'&$$%+..............+#%=]|02{!-=#@.....",
+"..........+%#)e_e(-=#@@...............+#$/|2|^/,=%@.....",
+"..........+@@=;:e;;&*@+...............+@#(i||ii!-@@.....",
+"...........++$);'((;=$@+...............+@&/ii^m~,&%+....",
+"............@#*&)(e()=$@................@$-5}^am},&#....",
+".............++%&(_e;&*@.................+@#5m2|i5)%....",
+".............+@+*;e(;=*%.................+@@)~|m~,>#....",
+"..............+@#*&)**$@..................+@$>55,)&%....",
+"................++@####@....................+@#$$$$%....",
+"..................++@@++......................++#%@+....",
+"....................+@+.........................+%+.....",
+"........................................................",
+"........................................................",
+"........................................................",
+".........++@+@@+%+@@+++..............@+@@%@@%@%@@++.....",
+".......+@@#&)**#*=&&*#@+...........+@%&,/,-$-,5!,=%+....",
+"......++#$);:'&#&(e(')*#+.........+@$&/iai!=5^ami5,$+...",
+"......+@$=(<8:'=;_c<e'&#+.........+#=,m40ai,{a00ai5=@...",
+".....@@$$=e[7_'&;_8[_(>*%+.......@#=-,|004{!i200am]-#+..",
+"....+%#*=&e<b<(&(_[<_(;=@+......@#&-,5|0049!^1041m~,%@..",
+"....%$*==):[d<5>'_[<_e;&#@+.....#=),!}a000f]{1043|i!$%+.",
+"....@*&));_7d8:>:_c[<_()$@+.....#-5!/~2000f{f1n4419/-%+.",
+"....$=);(([6g7[5_c88[__;&$@.....=,_i^|0000qf1000q4ai!&#.",
+"....$&;e:<cdg68}[7b67c[e)=#+....&5i||40000n1q00000q|_,$+",
+"....$&;ee_cbhbc_p86688<e>=#....+=5p|az000001q000004|],$.",
+"....@$=&;(<6g7[e}p87c<:;=$@.....#=,5~m4000qf1q0004ai,=#.",
+"....++#$*&:8dc:,:<8[<:e)$@@.....+@==,5a0003{31n4qa|/>#@.",
+".....@+#$$e[dc5,j_p[_e(&#@+......@@$=-|000f{91q41f^!$#+.",
+".....+@@$*ec6[e-j_c<_:(&#@+......+%#=-|000f]910q1fm!$@+.",
+"......+@$#e[d[:-(_p[_5;&#++.......+%==|000f/^1401fi5$@+.",
+"......+@%$e[b<5-j:[<_e'=#@.......++%$*|0009]93q419i,$%..",
+"......++##([d[5-,_[__:;&@+........+%$=m000o/^3041fi!%@..",
+"......+@@$([b[e>,_p<:e'=%@........+@#=m0009]^344a|i,#@..",
+".......@@#(<b[e-,_<[_(;=@+.........@%$m0009/{10439i,#+..",
+".......+@#([d[_,e<c<_e'=%+.........+#$m0003^f4n02|i,#+..",
+".......++#(8d8<e_c7[_e;$@+.........+@$^0002f10002|~-#+..",
+".......+@@(cg6[_<868_(;*@..........+%#m0000240002m~>@...",
+"........++):[_e(::[_e;&$+...........+@}a02|^a242|i!=@...",
+"........++*;(;)=;(e(;)=#+...........++)pmi_!~m|^p/,$+...",
+".........++#$$$%*=))=*#@.............+@$=&*$-,_/(>=@....",
+"..........++@@@@$$=$$##+..............+@#%##=-,-=$$+....",
+"...........+@++++@##@++................+%++@@#$$%%+.....",
+".................+.+.........................+.+........",
+"........................................................",
+"........................................................",
+"...+@###$##@+%+@+@+++..........+%$===$$%@%@@@@+++.......",
+"..@#=;';&&=*##$$$#@++++.......%$,]i]/!,-$=&-==#@@++.....",
+".@#$;:_:e'-=*==&=*$$%@+@+....%$-ia2||{/,-,,!,-=&$%@@+...",
+".@$=e[8<_e'-*&);>)**$#%+++...%&(|0002f^/,!/]]/,-=$#@@+..",
+".+#*;:[__:(5,((5e::((;)&*#@..@$>ia021f99^99f|fa|^]}!>=@.",
+".+@$)e::::___}___[7c<_:';&#+.+#=_|a|af132121400042|i~5&+",
+".+@#&;(e:5_888[c7bgg78[_e'*@.+#$!]m9ff1n000000000002|i>@",
+"..%@=)>(5_[[8[__[8668<<:;)$+..%#,/{9f14400110000002ai_=+",
+".+@@$&>,:_~<8<:,_[88<_e;)=%+.+%%&!]^fll001f^140042ri/($+",
+"..+%#$-'/<<[p:j-'_<<_e;)$#@+..@#=-!^34q4q19/^1442|i5-$#+",
+"..@%$=-(_[p<[:'-'(::::()##+...@%=,/924q44f{/{91aff^/=$%.",
+"..@@*)':<8[[_5'=-;(':ee)$%@+..%#,/io4nqq1f{!/~^^a||/=#@+",
+"..@%=>(_[8c<_e,=&&-;e_e;$@+...@#,]^100n44f{j!j/i92a~-#@.",
+"..@@&(:_p[p[_j>=**=;e_:;$%@...%%59a1q0q419],,,,]|4|~=%%.",
+"..+#'_c<_:___(>==**;:[_;*@+...+$i2043f1119],,,,]a04i-@@.",
+"..@#ec7[5,(e_(>==**;:8['$@@...%=|000f{9|2^],,--~200i-%@.",
+"..+#(c6_'>,:_j-***=;_8[($@+...+$m002^]^a2^/,-,,]200m-#+.",
+"..++&(:;)&(<[:>=*==;:7c'*%+...+@5mai}!^101],-,,~20ni>#+.",
+"...+$=)&==(<7_'*=$=;_7[($++....@=,5!,,m402{,,-,p200m*%+.",
+"....+%$##$([8<,&&&&(:8[($@+.....@$==*-^004{!!j!^z00m&@+.",
+"....++%%##;:[<:(::__[[:)#+......+@%#$=pa04a9|a2200a}=@..",
+"......+@%#)e<[[c[88c[:e&#@........+%#$}|4000000002|5$%..",
+".......++@=;:<[866d8[e;=@+.........+@@,ia40000000|p,%+..",
+"........++$=);::_:__;)=#+...........+@&(}iaaa222i_,$+...",
+"..........%$*=);;;;;&*$@+.............%&-,}ppii}5>&#+...",
+"...........+%%$****$#++................@#$&>>))=$@+.....",
+"............+@@####%@+..................+@#$$$$$@++.....",
+".............++@+++++....................+@@@@%++.......",
+"................+...........................+...........",
+"........................................................",
+"........................................................",
+".........++++........................++++...............",
+".......@$==$$#+++++@@@++...........%-,,-=$@+++@@%%@+....",
+"......+$);))&=$@@@@#$=$+..........+&}i~}5,&%#%#$&>&@....",
+"......+='e(;;&*%%##$$=*#+.........+,i|mii!-##$=--,>*+...",
+"......+*(eeee;&$*=&;(e'&#+........@(i|r||~!=-,5~m|i5$+..",
+"......@=;e:__(>$&)'(:[_;$+........@,p|av2|]-!/ima02p=@..",
+".....++=;e__[:'=-;(:[8[($%+......+@(i|140f{,/]^1000m-#+.",
+".....++*&;:[8_'&;e__<<e;*@+......+%-5pa001^!~|2z44a~>%+.",
+"......@$*):[6<(-':<<::'&*@+.......@=,/|0049/^o04aai5>#+.",
+".....++%$*:[dc5>(_8[e;)=$#+......+%%&,f0009]9200|i},=$@.",
+".....+@%$=e[6c}5__<_()=$#+.......+@$=,900nlo1102m/,-$@..",
+".....+@##$e<77[[[__e;&*#@+.......+%$=-9400044l3|~!-$%+..",
+".....+@#$=,_c876[<e(=$#+++.......+@=-,^1n00002f^!=$%++..",
+".....+%#$=e<876d8<e;&##@+........@%$-,92n000019~!=$%+...",
+"....+@@$*=,_[mbg6_'>&$@%+.......+%#=-,^1000001^]!=%#+...",
+"...++%##=&j_c6gh6~'-$$#++......++#$=,!93n00004{/-=*%+...",
+"...+@$=->':_p86d8<e;-##@+......+#-,/]^f1q00004f{/=$@+...",
+"..+%=);:<[c[cp[pccc_'$#@+.....+#,/if2000040qn002i-$#@...",
+"..+#&;:[6d88<<:e<868e&#%@+....%$5i|0000n44a94000|!=%@+..",
+"..@$)e_[868[_:';:<6[:&*#@+....@=}|2000044f^i|q00f5-*%+..",
+"..+#)e__<<ee;>-&;(ee(;)=##+...@$}|2244||i]/!pm||mi},&$+.",
+"..+#)e_:e(;&*=$$==);;(;)=$@...+$_|2||m~!-,--,,}~pmi/,=%.",
+"...@&(:;;&=$#####%$=);;)=$@....%5m2i~5,-$$$$$$=,}ic/,&#.",
+"...+$&;&**$@@%@+@@@#*&=$%%+....+=5}5>-&#%##@@%#$>,,&$#+.",
+"....+@%#@@++++++++@+@@@@@+......@#$$%@@+++++++@+%###@+..",
+"........++++.........+..............++++.........+......",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"...+@@#@+++....................+%%$%@++.................",
+"..++#*$$#@+...................+@*--=$@@.................",
+".+#$=&)=$$%@+................@$=,5/!-=$@+...............",
+"@$&>(eee'>=#++..............@&5~^|a|i],=@+..............",
+"+&(:_<[_:e;*@++.............@5ma24011m~-#@+.............",
+"@)':<[8<<:'=#@++............@5m|400042{,$@++............",
+"+$&;e<[<<<(-##@+++++@##+@...+&5p|40444m/=$%@++++%$$@@...",
+"+@$=(:[[[<e-*#%%+++@#$##%+..+%&,ma0000|/-$##@@@#$==$#@..",
+".+@$;::[[c:>$##%%%%#$&=$#@+..@#&~a240na]-=$###%=>!,-$@+.",
+".@@%&(:[76<(=*$#$*=;;:;&#+...@@$5^|0004^,-===-,/i|i5$@..",
+".+@@&)e[7g[,=$$#*);(:<:)$+...+@#!~90000^,-==-/~ma4|}=+..",
+"..+%$&;[bh8(&=$**;(e<[_;#+....@%-!i000q9!,--,~ma404~$+..",
+"..+@$=):cdc5>-=*-;:::e(*@+....+@&,/1000f]/,-/iaaa|m,#@..",
+"....##=:[8<:,>&$;(_:(;&$@+.....+$=,|000f^]!-]m2amp5&@+..",
+"...+@@#'_8[_e,-*;e<:;=$#+......+@%={20q1o^/,]|4|i,=$+...",
+"....+%$)(_<[c5>=&;(;&$#++.......%#=}m22009],5~mp5>$%+...",
+"....++%=>(_c6<,=&&)&$#@+........+@%,]^100q^,!!}!=$@%....",
+".....@@#$&_8hce=**#$@@@+.........%#=-510009,,-==##@+....",
+"......+%$=(<8<e'-=$##+@+..........+#-,m404f{/,=$$%@+....",
+"......++@$)(::__e&*##@++..........+@#=/m|a239/-$$@@+....",
+".......+@@#=)e_c:;#$@%++...........+##=,/|20a]==##@+....",
+"........@%#$=;e_:(;&$#@+............@%$-,i|2a^]!-$%+....",
+".........+@##&;(eee(&#@@.............+#$=5~||||^!=#%....",
+"..........+@@$=&(:[:'=#%..............+@%=,j^20ai,$#....",
+"...........++#$*)(:e;=*@+..............+@$&,_m1r],-%+...",
+"............++@$*&;);)&$+...............+@%*>5~}~}5&+...",
+"..............++%#$=&;)#+.................+@%$&,5~/&@...",
+"...............++++#*)&$+..................++@@&-}5=+...",
+"................+.++#$#+....................+.+@$=$@....",
+".....................++..........................++.....",
 "........................................................"};
index c575bb2aebc460dbee8aecdc08806aa0144705be..4aced864ab85865c7964a5c858d9e8d724030886 100644 (file)
@@ -793,8 +793,8 @@ screenhack (Display *dpy, Window window)
       XSync (dpy, False);
       screenhack_handle_events (dpy);
 
-      if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput|XtIMSignal))
-        XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput|XtIMSignal);
+      if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
+        XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
 
       if (delay) usleep (delay);
     }
index eb9d7185e0058dd0cd3e3e1c042d8a94f26d1fcb..8a882fcd7b4ddd41426d673f79d387822241abc2 100644 (file)
@@ -161,10 +161,6 @@ MapNotify_event_p (Display *dpy, XEvent *event, XPointer window)
 }
 
 
-#ifdef USE_GL
-extern Visual *get_gl_visual (Screen *, const char *, const char *);
-#endif
-
 #ifdef XLOCKMORE
 extern void pre_merge_options (void);
 #endif
@@ -237,6 +233,34 @@ screenhack_handle_events (Display *dpy)
 }
 
 
+static Visual *
+pick_visual (Screen *screen)
+{
+#ifdef USE_GL
+  /* If we're linking against GL (that is, this is the version of screenhack.o
+     that the GL hacks will use, which is different from the one that the
+     non-GL hacks will use) then try to pick the "best" visual by interrogating
+     the GL library instead of by asking Xlib.  GL knows better.
+   */
+  Visual *v = 0;
+  char *string = get_string_resource ("visualID", "VisualID");
+
+  if (!string || !*string ||
+      !strcmp (string, "gl") ||
+      !strcmp (string, "best") ||
+      !strcmp (string, "color") ||
+      !strcmp (string, "default"))
+    v = get_gl_visual (screen);                /* from ../utils/visual-gl.c */
+
+  if (string)
+    free (string);
+  if (v)
+    return v;
+#endif /* USE_GL */
+
+  return get_visual_resource (screen, "visualID", "VisualID", False);
+}
+
 
 int
 main (int argc, char **argv)
@@ -364,12 +388,7 @@ main (int argc, char **argv)
     {
       Boolean def_visual_p;
       Screen *screen = XtScreen (toplevel);
-
-#ifdef USE_GL
-      visual = get_gl_visual (screen, "visualID", "VisualID");
-#else
-      visual = get_visual_resource (screen, "visualID", "VisualID", False);
-#endif
+      visual = pick_visual (screen);
 
       if (toplevel->core.width <= 0)
        toplevel->core.width = 600;
index 4b3aae08652d3cb9a5d0cc590d9e6efd1ecfeb39..5f6510ccce553baec7a6674ad8ee3e1785ae84c5 100644 (file)
@@ -37,7 +37,7 @@
  * software for any purpose.  It is provided "as is" without express or 
  * implied warranty.
  *
- * $Revision: 1.7 $
+ * $Revision: 1.9 $
  *
  * Version 1.0 April 27, 1998.
  * - Initial version
  * - Now need to define HAVE_PING to compile in the ping stuff.
  */
 
-/* Define one of these, as appropriate.  
-   We should make configure detect this, one of these days.
+/* These are computed by configure now:
+   #define HAVE_ICMP
+   #define HAVE_ICMPHDR
  */
-/* #define HAVE_ICMP */
-/* #define HAVE_ICMPHDR */
 
 
 /* Include Files */
 #include <stdio.h>
 #include <math.h>
 
+#include "screenhack.h"
+#include "colors.h"
+#include "hsv.h"
+
 #if defined(HAVE_ICMP) || defined(HAVE_ICMPHDR)
 # include <unistd.h>
 # include <limits.h>
 # include <netdb.h>
 #endif /* HAVE_ICMP || HAVE_ICMPHDR */
 
-#include "screenhack.h"
-#include "colors.h"
-#include "hsv.h"
-
-#include <X11/extensions/XShm.h>
-
 
 /* Defines */
 
@@ -351,7 +348,7 @@ newBogie(char *name, int distance, int tick, int ttl)
     /* Allocate a bogie and initialize it */
 
     if ((new = (Bogie *) calloc(1, sizeof(Bogie))) == NULL) {
-       fprintf(stderr, "Out of Memory\n");
+       fprintf(stderr, "%s: Out of Memory\n", progname);
        return NULL;
     }
     new->name = name;
@@ -449,7 +446,8 @@ lookupHost(ping_target *target)
 
        struct hostent *hent = gethostbyname(target->name);
        if (hent == NULL) {
-           fprintf(stderr, "Could not resolve host %s\n", target->name);
+           fprintf(stderr, "%s: could not resolve host %s\n",
+                    progname, target->name);
            return 0;
        }
        memcpy(&iaddr->sin_addr, hent->h_addr_list[0],
@@ -482,11 +480,11 @@ newHost(char *name)
     /* Create the target */
 
     if ((target = calloc(1, sizeof(ping_target))) == NULL) {
-       fprintf(stderr, "Out of Memory\n");
+       fprintf(stderr, "%s: Out of Memory\n", progname);
        goto target_init_error;
     }
     if ((target->name = strdup(name)) == NULL) {
-       fprintf(stderr, "Out of Memory\n");
+       fprintf(stderr, "%s: Out of Memory\n", progname);
        goto target_init_error;
     }
 
@@ -534,7 +532,7 @@ readPingHostsFile(char *fname)
     /* Make sure we in fact have a file to process */
 
     if ((fname == NULL) || (fname[0] == '\0')) {
-       fprintf(stderr, "Invalid ping host file name\n");
+       fprintf(stderr, "%s: invalid ping host file name\n", progname);
        return NULL;
     }
 
@@ -542,7 +540,7 @@ readPingHostsFile(char *fname)
 
     if ((fp = fopen(fname, "r")) == NULL) {
        char msg[1024];
-       sprintf(msg, "Unable to open host file %s", fname);
+       sprintf(msg, "%s: unable to open host file %s", progname, fname);
        perror(msg);
        return NULL;
     }
@@ -660,14 +658,14 @@ subnetHostsList(void)
     /* Get our hostname */
 
     if (gethostname(hostname, BUFSIZ)) {
-       fprintf(stderr, "Unable to get local hostname\n");
+       fprintf(stderr, "%s: unable to get local hostname\n", progname);
        return NULL;
     }
 
     /* Get our IP address and convert it to a string */
 
     if ((hent = gethostbyname(hostname)) == NULL) {
-       fprintf(stderr, "Unable to lookup our IP address\n");
+       fprintf(stderr, "%s: unable to lookup our IP address\n", progname);
        return NULL;
     }
     strcpy(address, inet_ntoa(*((struct in_addr *)hent->h_addr_list[0])));
@@ -675,7 +673,7 @@ subnetHostsList(void)
     /* Get a pointer to the last "." in the string */
 
     if ((p = strrchr(address, '.')) == NULL) {
-       fprintf(stderr, "Can't parse IP address %s\n", address);
+       fprintf(stderr, "%s: can't parse IP address %s\n", progname, address);
        return NULL;
     }
     p++;
@@ -716,14 +714,16 @@ init_ping(void)
     /* Create the ping info structure */
 
     if ((pi = (ping_info *) calloc(1, sizeof(ping_info))) == NULL) {
-       fprintf(stderr, "Out of memory\n");
+       fprintf(stderr, "%s: Out of memory\n", progname);
        goto ping_init_error;
     }
 
     /* Create the ICMP socket and turn off SUID */
 
     if ((pi->icmpsock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
-       perror("Can't create ICMP socket");
+       char msg[1024];
+       sprintf(msg, "%s: can't create ICMP socket", progname);
+       perror(msg);
        fprintf(stderr,
          "%s: this program must be setuid to root for `ping mode' to work.\n",
                 progname);
@@ -762,14 +762,14 @@ init_ping(void)
 
        /* Unknown source */
 
-       fprintf(stderr, "Illegal pingSource: %s\n", src);
+       fprintf(stderr, "%s: illegal pingSource: %s\n", progname, src);
        goto ping_init_error;
     }
 
     /* Make sure there is something to ping */
 
     if (pi->targets == NULL) {
-       fprintf(stderr, "Nothing to ping");
+       fprintf(stderr, "%s: nothing to ping", progname);
        goto ping_init_error;
     }
 
@@ -843,7 +843,7 @@ sendping(ping_info *pi, ping_target *pt)
                         &pt->address, sizeof(pt->address))) !=  pcktsiz) {
 #if 0
         char errbuf[BUFSIZ];
-        sprintf(errbuf, "Error sending ping to %s", pt->name);
+        sprintf(errbuf, "%s: error sending ping to %s", progname, pt->name);
        perror(errbuf);
 #endif
     }
@@ -956,7 +956,9 @@ getping(sonar_info *si, ping_info *pi, int ttl)
     sa.sa_flags = 0;
     sa.sa_handler = sigcatcher;
     if (sigaction(SIGALRM, &sa, 0) == -1) {
-       perror("Unable to trap sigalarm");
+       char msg[1024];
+       sprintf(msg, "%s: unable to trap SIGALRM", progname);
+       perror(msg);
        exit(1);
     }
 
@@ -1003,7 +1005,7 @@ getping(sonar_info *si, ping_info *pi, int ttl)
             strdup((char *) &packet[iphdrlen + 
                                    + sizeof(struct ICMP)
                                    + sizeof(struct timeval)])) == NULL) {
-           fprintf(stderr, "Out of memory\n");
+           fprintf(stderr, "%s: Out of memory\n", progname);
            return bl;
        }
 
@@ -1126,7 +1128,7 @@ init_sim(void)
     /* Create the simulation info structure */
 
     if ((si = (sim_info *) calloc(1, sizeof(sim_info))) == NULL) {
-       fprintf(stderr, "Out of memory\n");
+       fprintf(stderr, "%s: Out of memory\n", progname);
        return NULL;
     }
 
@@ -1136,7 +1138,7 @@ init_sim(void)
     if ((si->teamA = (sim_target *)calloc(si->numA, sizeof(sim_target)))
        == NULL) {
        free(si);
-       fprintf(stderr, "Out of Memory\n");
+       fprintf(stderr, "%s: Out of Memory\n", progname);
        return NULL;
     }
     si->teamAID = get_string_resource("teamAName", "TeamAName");
@@ -1144,7 +1146,7 @@ init_sim(void)
        if ((si->teamA[i].name = (char *) malloc(strlen(si->teamAID) + 4))
            == NULL) {
            free(si);
-           fprintf(stderr, "Out of Memory\n");
+           fprintf(stderr, "%s: Out of Memory\n", progname);
            return NULL;
        }
        sprintf(si->teamA[i].name, "%s%03d", si->teamAID, i+1);
@@ -1158,7 +1160,7 @@ init_sim(void)
     if ((si->teamB = (sim_target *)calloc(si->numB, sizeof(sim_target)))
        == NULL) {
        free(si);
-       fprintf(stderr, "Out of Memory\n");
+       fprintf(stderr, "%s: Out of Memory\n", progname);
        return NULL;
     }
     si->teamBID = get_string_resource("teamBName", "TeamBName");
@@ -1166,7 +1168,7 @@ init_sim(void)
        if ((si->teamB[i].name = (char *) malloc(strlen(si->teamBID) + 4))
            == NULL) {
            free(si);
-           fprintf(stderr, "Out of Memory\n");
+           fprintf(stderr, "%s: Out of Memory\n", progname);
            return NULL;
        }
        sprintf(si->teamB[i].name, "%s%03d", si->teamBID, i+1);
@@ -1206,7 +1208,7 @@ init_sonar(Display *dpy, Window win)
     /* Create the Sonar information structure */
 
     if ((si = (sonar_info *) calloc(1, sizeof(sonar_info))) == NULL) {
-       fprintf(stderr, "Out of memory\n");
+       fprintf(stderr, "%s: Out of memory\n", progname);
        return NULL;
     }
 
@@ -1233,7 +1235,7 @@ init_sonar(Display *dpy, Window win)
     if (((si->font = XLoadQueryFont(dpy, get_string_resource ("font", "Font")))
         == NULL) &&
        ((si->font = XLoadQueryFont(dpy, "fixed")) == NULL)) {
-       fprintf(stderr, "Can't load an appropriate font\n");
+       fprintf(stderr, "%s: can't load an appropriate font\n", progname);
        return NULL;
     }
 
@@ -1685,7 +1687,7 @@ screenhack(Display *dpy, Window win)
        if ((sensor_info = (void *) init_sim()) == NULL)
            exit(1);
     } else {
-       fprintf(stderr, "Unsupported Sonar mode: %s\n", mode);
+       fprintf(stderr, "%s: unsupported Sonar mode: %s\n", progname, mode);
        fprintf(stderr,
                 "\tCurrently supported modes are `ping' and `simulation'\n");
        exit(1);
index 4f50635bb161322aff18a849df7493fec348c2d4..623103c0e3f5c8e47dd3eb3f74279a8058c7ae71 100644 (file)
@@ -23,8 +23,8 @@
 char *progclass = "XJack";
 
 char *defaults [] = {
-  ".background:                black",
-  ".foreground:                #00EE00",
+  ".background:                #FFF0B4",
+  ".foreground:                #000000",
   "XJack.font:         -*-courier-medium-r-*-*-*-240-*-*-m-*-*-*",
   "*delay:             50000",
   0
@@ -40,6 +40,8 @@ void
 screenhack (Display *dpy, Window window)
 {
   static const char *source = "All work and no play makes Jack a dull boy.  ";
+  /* If you're here because you're thinking about making the above string be
+     customizable, then you don't get the joke.  You loser. */
   const char *s = source;
   int columns, rows;           /* characters */
   int left, right;             /* characters */
@@ -154,25 +156,38 @@ screenhack (Display *dpy, Window window)
 
              while (lines > 0)
                {
-                 XCopyArea (dpy, window, window, gc,
-                            0, hspace + line_height,
-                            xgwa.width,
-                            xgwa.height - vspace - vspace - line_height,
-                            0, vspace);
-                 XClearArea (dpy, window,
-                             0, xgwa.height - vspace - line_height,
-                             xgwa.width,
-                             line_height + vspace + vspace,
-                             False);
-                 XClearArea (dpy, window, 0, 0, xgwa.width, vspace, False);
-                 /* See? It's OK. He saw it on the television. */
-                 XClearArea (dpy, window, 0, 0, hspace, xgwa.height, False);
-                 XClearArea (dpy, window, xgwa.width - vspace, 0,
-                             hspace, xgwa.height, False);
+                  int i;
+                  int inc = line_height / 7;
+                  int pix_delay = delay / 1000;
+                  if (inc <= 0) inc = 1;
+                  for (i = 0; i < line_height; i += inc)
+                    {
+                      if (i > line_height)
+                        i = line_height;
+                      XCopyArea (dpy, window, window, gc,
+                                 0, inc,
+                                 xgwa.width, xgwa.height - inc,
+                                 0, 0);
+                      XSync (dpy, False);
+                      if (pix_delay) usleep (pix_delay);
+                    }
                  y--;
                  lines--;
-                 XSync (dpy, False);
-                 if (delay) usleep (delay * 10);
+
+                  /* See? It's OK. He saw it on the television. */
+                  XClearArea (dpy, window,
+                              0, xgwa.height - vspace - line_height,
+                              xgwa.width, line_height + vspace + vspace,
+                              False);
+                  XSync (dpy, False);
+
+                  XGetWindowAttributes (dpy, window, &xgwa);
+                  columns = (xgwa.width - hspace - hspace) / char_width;
+                  rows = (xgwa.height - vspace - vspace) / line_height;
+                  if (y > rows) y = rows-1;
+                  if (x > columns) x = columns-2;
+
+                  if (delay) usleep (delay);
                }
              if (y < 0) y = 0;
            }
index 3629804c52565a34683b5a670ff8429d8483ea86..2813c754a7c8b79587b157cae39a06ffcaf5c976 100644 (file)
@@ -109,8 +109,4 @@ extern void xlockmore_screenhack (Display *dpy, Window window,
                                  void (*hack_draw) (ModeInfo *),
                                  void (*hack_free) (ModeInfo *));
 
-#ifdef USE_GL
-extern Visual *get_gl_visual (Screen *screen, char *name, char *class);
-#endif
-
 #endif /* __XLOCKMORE_INTERNAL_H__ */
index 38d9af14c117bac7ecff2a1bb4ac65a8f1708c86..a6afef8e76bd88f171542d4e5128b8d4031548d8 100644 (file)
@@ -409,7 +409,7 @@ char *defaults [] = {
   ".foreground:                   green",
   "*delay:                10000",
   "*insert:               both",
-  "*density:              85",
+  "*density:              75",
   0
 };
 
index 826cfedeaf8dfbb328c53774121c79321fc16d26..071cc94df4ea8837821fad5fea76fc13e0e6b98b 100644 (file)
@@ -101,11 +101,11 @@ X_CFLAGS  = @X_CFLAGS@
 INCLUDES       = -I$(srcdir) -I.. @INCLUDES@
 
 SRCS           = alpha.c colors.c fade.c grabscreen.c hsv.c overlay.c \
-                 resources.c spline.c usleep.c visual.c xmu.c xroger.c \
-                 yarandom.c erase.c sgivideo.c xshm.c xdbe.c
+                 resources.c spline.c usleep.c visual.c visual-gl.c xmu.c \
+                 xroger.c yarandom.c erase.c sgivideo.c xshm.c xdbe.c
 OBJS           = alpha.o colors.o fade.o grabscreen.o hsv.o overlay.o \
-                 resources.o spline.o usleep.o visual.o xmu.o xroger.o \
-                 yarandom.o erase.o sgivideo.o xshm.o xdbe.o
+                 resources.o spline.o usleep.o visual.o visual-gl.o xmu.o \
+                 xroger.o yarandom.o erase.o sgivideo.o xshm.o xdbe.o
 HDRS           = alpha.h colors.h fade.h grabscreen.h hsv.h resources.h \
                  spline.h usleep.h utils.h version.h visual.h vroot.h xmu.h \
                  yarandom.h erase.h sgivideo.h xshm.h xdbe.h
@@ -248,6 +248,9 @@ visual.o: $(srcdir)/utils.h
 visual.o: ../config.h
 visual.o: $(srcdir)/resources.h
 visual.o: $(srcdir)/visual.h
+visual-gl.o: $(srcdir)/utils.h
+visual-gl.o: ../config.h
+visual-gl.o: $(srcdir)/visual.h
 xmu.o: ../config.h
 xroger.o: $(srcdir)/utils.h
 xroger.o: ../config.h
index 1ca686b69700116e5c147088fe5d348d5ddcf57c..78fa5f487386ec53b6d56bd60e11765233f8a654 100644 (file)
@@ -9,6 +9,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) RESOURCES.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SGIVIDEO.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SPLINE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) USLEEP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL-GL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-GTOD.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-STRDUP.C
index f2b6c2c919c265c24dd3aaa489e3f4ebdc128a1d..731076755ce06446486ddcdf0f0654b3bd7b3b9e 100644 (file)
@@ -9,6 +9,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) RESOURCES.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SGIVIDEO.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SPLINE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) USLEEP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL-GL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-GTOD.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-STRDUP.C
index ddd415786ab1e6daf7be623cfb05734c15c25a28..f81d45d347a661311ab3a8dcfedeff184094a6f8 100644 (file)
@@ -1,2 +1,2 @@
 static const char screensaver_id[] =
-       "@(#)xscreensaver 3.10 (27-Apr-99), by Jamie Zawinski (jwz@jwz.org)";
+       "@(#)xscreensaver 3.12 (10-May-99), by Jamie Zawinski (jwz@jwz.org)";
diff --git a/utils/visual-gl.c b/utils/visual-gl.c
new file mode 100644 (file)
index 0000000..fb83fe4
--- /dev/null
@@ -0,0 +1,99 @@
+/* xscreensaver, Copyright (c) 1999 by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* This file contains code for picking the best visual for GL programs by
+   actually asking the GL library to figure it out for us.  The code in
+   visual.c might do a good job of this on most systems, but not, in
+   particular, on SGIs.
+
+   Why?  Because with the SGI O2 X server is weird.
+
+   GL programs tend to work best on a visual that is *half* as deep as the
+   depth of the screen, since that way, they can do double-buffering.  So
+   generally, if the screen is 24 bits deep, but a 12-bit TrueColor visual
+   is available, then that's the visual you should use.
+
+   But on the server that runs on the O2 (a machine that has serious hardware
+   support for GL) the 12-bit PseudoColor visual looks awful (you get a black
+   and white, flickery image.)  On these machines, the visual you want turns
+   out to be 0x31 -- this is but one of the eight 15-bit TrueColor visuals
+   (yes, 8, and yes, 15) that O2s provide.  This is the only visual that works
+   properly -- as far as `xdpyinfo' is concerned, all of the 15-bit TrueColor
+   visuals are identical, but some flicker like mad, and some have deeply
+   weird artifacts (hidden surfaces show through!)  I suppose these other
+   visuals must be tied to some arcane hardware feature...
+
+   So the bottom line is, there exists information about visuals which is
+   available to GL, but which is not available via Xlib calls.  So the only
+   way to know which visual to use (other than impirically) is to actually
+   call GLX routines.
+ */
+
+#include "utils.h"
+#include "visual.h"
+
+#ifdef HAVE_GL
+# include <GL/gl.h>
+# include <GL/glx.h>
+#endif /* HAVE_GL */
+
+Visual *
+get_gl_visual (Screen *screen)
+{
+#ifdef HAVE_GL
+  XVisualInfo *vi = 0;
+  Display *dpy = DisplayOfScreen (screen);
+  int screen_num = screen_number (screen);
+  int attrs[20];
+  int i = 0;
+
+  attrs[i++] = GLX_RGBA;
+  attrs[i++] = GLX_RED_SIZE;     attrs[i++] = 1;
+  attrs[i++] = GLX_GREEN_SIZE;   attrs[i++] = 1;
+  attrs[i++] = GLX_BLUE_SIZE;    attrs[i++] = 1;
+  attrs[i++] = GLX_DEPTH_SIZE;   attrs[i++] = 1;
+  attrs[i++] = GLX_DOUBLEBUFFER;
+  attrs[i++] = 0;
+
+  vi = glXChooseVisual (dpy, screen_num, attrs);
+
+  if (!vi)                             /* Try without double-buffering. */
+    {
+      attrs[i-1] = 0;
+      vi = glXChooseVisual (dpy, screen_num, attrs);
+    }
+
+  if (!vi)                             /* Try mono. */
+    {
+      i = 0;
+      attrs[i++] = GLX_DOUBLEBUFFER;
+      attrs[i++] = 0;
+      vi = glXChooseVisual (dpy, screen_num, attrs);
+    }
+
+  if (!vi)                             /* Try mono without double-buffer. */
+    {
+      attrs[0] = 0;
+      vi = glXChooseVisual (dpy, screen_num, attrs);
+    }
+
+  if (!vi)
+    return 0;
+  else
+    {
+      Visual *v = vi->visual;
+      XFree (vi);
+      return v;
+    }
+#else  /* !HAVE_GL */
+  return 0;
+#endif /* !HAVE_GL */
+}
index a570bcc4342e9653bf70efe53bdc8e0043610b99..195ef79db8ff1a5092d8c40ccbfbf6beb4afffd4 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998
+/* xscreensaver, Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998, 1999
  *  by Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -35,6 +35,7 @@ extern char *progname;
 static Visual *pick_best_visual (Screen *, Bool, Bool);
 static Visual *pick_mono_visual (Screen *);
 static Visual *pick_best_visual_of_class (Screen *, int);
+static Visual *pick_best_gl_visual (Screen *);
 static Visual *id_to_visual (Screen *, int);
 static Visual *id_to_visual (Screen *screen, int id);
 
@@ -44,7 +45,8 @@ static Visual *id_to_visual (Screen *screen, int id);
 #define MONO_VISUAL    -3
 #define GRAY_VISUAL    -4
 #define COLOR_VISUAL   -5
-#define SPECIFIC_VISUAL        -6
+#define GL_VISUAL      -6
+#define SPECIFIC_VISUAL        -7
 
 Visual *
 get_visual (Screen *screen, const char *string, Bool prefer_writable_cells,
@@ -68,6 +70,7 @@ get_visual (Screen *screen, const char *string, Bool prefer_writable_cells,
   else if (!strcmp (v, "gray"))                  vclass = GRAY_VISUAL;
   else if (!strcmp (v, "grey"))                  vclass = GRAY_VISUAL;
   else if (!strcmp (v, "color"))                 vclass = COLOR_VISUAL;
+  else if (!strcmp (v, "gl"))                    vclass = GL_VISUAL;
   else if (!strcmp (v, "staticgray"))            vclass = StaticGray;
   else if (!strcmp (v, "staticcolor"))           vclass = StaticColor;
   else if (!strcmp (v, "truecolor"))             vclass = TrueColor;
@@ -126,6 +129,14 @@ get_visual (Screen *screen, const char *string, Bool prefer_writable_cells,
       if (!result && verbose_p)
        fprintf (stderr, "%s: no color visuals.\n", progname);
     }
+  else if (vclass == GL_VISUAL)
+    {
+      Visual *visual = pick_best_gl_visual (screen);
+      if (visual)
+       result = visual;
+      else if (verbose_p)
+       fprintf (stderr, "%s: no visual suitable for GL.\n", progname, v);
+    }
   else if (vclass == SPECIFIC_VISUAL)
     {
       result = id_to_visual (screen, id);
@@ -267,6 +278,65 @@ pick_best_visual_of_class (Screen *screen, int visual_class)
     return 0;
 }
 
+static Visual *
+pick_best_gl_visual (Screen *screen)
+{
+  /* The best visual for GL is a TrueColor visual that is half as deep as
+     the screen.  If such a thing doesn't exist, then TrueColor is best.
+     Failing that, the deepest available color visual is best.
+
+     Compare this function to get_gl_visual() in visual-gl.c.
+     This function tries to find the best GL visual using Xlib calls,
+     whereas that function does the same thing using GLX calls.
+   */
+  Display *dpy = DisplayOfScreen (screen);
+  XVisualInfo vi_in, *vi_out;
+  int out_count;
+  Visual *result = 0;
+
+  int ndepths = 0;
+  int *depths = XListDepths (dpy, screen_number (screen), &ndepths);
+  int screen_depth = depths[ndepths];
+  XFree (depths);
+
+  vi_in.class = TrueColor;
+  vi_in.screen = screen_number (screen);
+  vi_in.depth = screen_depth / 2;
+  vi_out = XGetVisualInfo (dpy, (VisualClassMask | VisualScreenMask |
+                                 VisualDepthMask),
+                          &vi_in, &out_count);
+  if (out_count > 0)
+    result = vi_out[0].visual;
+
+  if (vi_out)
+    XFree ((char *) vi_out);
+
+  if (!result && screen_depth > 24)
+    {
+      /* If it's a 32-deep screen and we didn't find a depth-16 visual,
+         see if there's a depth-12 visual. */
+      vi_in.class = TrueColor;
+      vi_in.screen = screen_number (screen);
+      vi_in.depth = 12;
+      vi_out = XGetVisualInfo (dpy, (VisualClassMask | VisualScreenMask |
+                                     VisualDepthMask),
+                               &vi_in, &out_count);
+      if (out_count > 0)
+        result = vi_out[0].visual;
+    }
+
+  if (result)
+    /* No half-depth TrueColor?  Ok, try for any TrueColor (the deepest.) */
+    result = pick_best_visual_of_class (screen, TrueColor);
+
+  if (!result)
+    /* No TrueColor?  Ok, try for anything. */
+    result = pick_best_visual (screen, False, False);
+
+  return result;
+}
+
+
 static Visual *
 id_to_visual (Screen *screen, int id)
 {
index 2a0b3534e691d1ffea812b3fc86ff86006338cf9..dd45708ea0643b89adb20d67fbfd6da86554b970 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1993-1998 by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1993-1999 by Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -24,4 +24,6 @@ extern void describe_visual (FILE *f, Screen *, Visual *, Bool private_cmap_p);
 extern Visual *get_overlay_visual (Screen *, unsigned long *pixel_return);
 extern Bool has_writable_cells (Screen *screen, Visual *visual);
 
+Visual *get_gl_visual (Screen *screen);
+
 #endif /* __VISUAL_H__ */
index 12e7a5b03be6fa6a1b2787d448f09914613b52c1..c2ba77d72681e236bbf2404e271ac36091253a3b 100644 (file)
@@ -1,7 +1,7 @@
 Begin3
 Title:          xscreensaver
-Version:        3.10
-Entered-date:   27APR99
+Version:        3.12
+Entered-date:   10MAY99
 Description:    A modular screen saver and locker for the X Window System.
                 Highly customizable: allows the use of any program that
                 can draw on the root window as a display mode.
@@ -10,16 +10,16 @@ Keywords:       screen saver, screen lock, lock, xlock, X11
 Author:         jwz@jwz.org (Jamie Zawinski)
 Maintained-by:  jwz@jwz.org (Jamie Zawinski)
 Primary-site:   http://www.jwz.org/xscreensaver/
-                1081K xscreensaver-3.10.tar.gz
-                30K  xscreensaver.README
+                1094K xscreensaver-3.12.tar.gz
+                32K  xscreensaver.README
                 1K   xscreensaver.lsm
 Alternate-site: sunsite.unc.edu /pub/Linux/X11/screensavers/
-                1081K xscreensaver-3.10.tar.gz
-                30K  xscreensaver.README
+                1094K xscreensaver-3.12.tar.gz
+                32K  xscreensaver.README
                 1K   xscreensaver.lsm
 Alternate-site: ftp.x.org /contrib/applications/
-                1081K xscreensaver-3.10.tar.gz
-                30K  xscreensaver.README
+                1094K xscreensaver-3.12.tar.gz
+                32K  xscreensaver.README
                 1K   xscreensaver.lsm
 Platforms:      Linux, Irix, SunOS, Solaris, HPUX, AIX, FreeBSD, NetBSD,
                 BSDI, SCO, OSF1, Ultrix, VMS.
index c7b265c29a9dc05800cf686e990c21ac64b67635..610bda51782772ec44b9cebd53c1694e1930e8b1 100644 (file)
@@ -1,7 +1,7 @@
 Name: xscreensaver
 Summary: X screen saver and locker
 Vendor: Jamie Zawinski <jwz@jwz.org>
-Version: 3.10
+Version: 3.12
 Release: 1
 URL: http://www.jwz.org/xscreensaver/
 Source: xscreensaver-%{version}.tar.gz