http://ftp.ksu.edu.tw/FTP/FreeBSD/distfiles/xscreensaver-4.23.tar.gz
authorZygo Blaxell <zblaxell@hungrycats.org>
Mon, 2 Mar 2009 05:43:34 +0000 (00:43 -0500)
committerZygo Blaxell <zblaxell@faye.furryterror.org>
Fri, 8 Feb 2013 17:54:29 +0000 (12:54 -0500)
-rw-r--r-- 1 zblaxell zblaxell 4939070 Oct 22  2005 xscreensaver-4.23.tar.gz
b7d3f0b4a94d879a2450a268ae941b92ca4fc39e  xscreensaver-4.23.tar.gz

93 files changed:
README
configure
configure.in
driver/XScreenSaver.ad.in
driver/XScreenSaver_ad.h
driver/demo-Gtk.c
driver/lock.c
driver/prefs.c
driver/remote.c
driver/setuid.c
driver/subprocs.c
driver/timers.c
driver/windows.c
driver/xscreensaver-command.c
driver/xscreensaver-demo.glade2
driver/xscreensaver-getimage-desktop
driver/xscreensaver-getimage.c
driver/xscreensaver-text
driver/xscreensaver.c
driver/xscreensaver.man
hacks/Makefile.in
hacks/ant.man [deleted file]
hacks/apple2-main.c
hacks/celtic.c [new file with mode: 0644]
hacks/celtic.man [new file with mode: 0644]
hacks/compile_axp.com
hacks/compile_decc.com
hacks/config/README
hacks/config/ant.xml
hacks/config/boxed.xml
hacks/config/celtic.xml [new file with mode: 0644]
hacks/config/cosmos.xml
hacks/config/cube21.xml [new file with mode: 0644]
hacks/config/glhanoi.xml [new file with mode: 0644]
hacks/config/hyperball.xml
hacks/config/hypercube.xml
hacks/config/hypertorus.xml
hacks/config/interaggregate.xml
hacks/config/jigglypuff.xml
hacks/config/juggler3d.xml [new file with mode: 0644]
hacks/config/polyhedra.xml
hacks/config/ripples.xml
hacks/config/squiral.xml
hacks/config/tangram.xml
hacks/config/timetunnel.xml [new file with mode: 0644]
hacks/config/whirlwindwarp.xml
hacks/config/whirlygig.xml
hacks/config/xmountains.xml
hacks/glx/Makefile.in
hacks/glx/antmaze.c
hacks/glx/boxed.c
hacks/glx/crackberg.c
hacks/glx/cube21-tex.h [new file with mode: 0644]
hacks/glx/cube21.c [new file with mode: 0644]
hacks/glx/cube21.man [new file with mode: 0644]
hacks/glx/gears.c
hacks/glx/glhanoi.c [new file with mode: 0644]
hacks/glx/glhanoi.man [new file with mode: 0644]
hacks/glx/gltrackball.c
hacks/glx/gltrackball.h
hacks/glx/grab-ximage.c
hacks/glx/hypertorus.c
hacks/glx/hypertorus.man
hacks/glx/juggler3d.c [new file with mode: 0644]
hacks/glx/juggler3d.man [new file with mode: 0644]
hacks/glx/molecule.c
hacks/glx/polytopes.c
hacks/glx/polytopes.man
hacks/glx/tangram.c
hacks/glx/tangram.man
hacks/glx/tangram_shapes.c
hacks/glx/timetunnel.c [new file with mode: 0644]
hacks/glx/timetunnel.man [new file with mode: 0644]
hacks/glx/xpm-ximage.c
hacks/images/timetunnel0.xpm [new file with mode: 0644]
hacks/images/timetunnel1.xpm [new file with mode: 0644]
hacks/images/timetunnel2.xpm [new file with mode: 0644]
hacks/images/tunnelstar.xpm [new file with mode: 0644]
hacks/interaggregate.c
hacks/noseguy.c
hacks/noseguy.man
hacks/ripples.c
hacks/ripples.man
hacks/sonar.c
hacks/spotlight.c
hacks/webcollage
hacks/webcollage-helper.c
hacks/whirlygig.man
hacks/xlyap.c
po/POTFILES.in
setup.com
utils/version.h
xscreensaver.spec

diff --git a/README b/README
index beac235b174825362409a12ee30eb955eca4e8ed..0df5d6857e5a7e14e7d16cc272f802f72cfc24be 100644 (file)
--- a/README
+++ b/README
@@ -65,7 +65,7 @@ there's no need to recompile or reinstall anything.
 Along with the xscreensaver daemon itself, this package also includes
 numerous graphics hacks for use as screensavers.  There is nothing
 magic about these: they are just programs that draw on the root window.
 Along with the xscreensaver daemon itself, this package also includes
 numerous graphics hacks for use as screensavers.  There is nothing
 magic about these: they are just programs that draw on the root window.
-More than 190 such programs are included.  For details, see the
+More than 200 such programs are included.  For details, see the
 xscreensaver web page, or the enclosed manual pages.
 
 The latest version of xscreensaver is always available on the web at
 xscreensaver web page, or the enclosed manual pages.
 
 The latest version of xscreensaver is always available on the web at
@@ -76,6 +76,25 @@ the XScreenSaver FAQ about that: http://www.jwz.org/xscreensaver/faq.html
 
                               ============
 
 
                               ============
 
+Changes since 4.22:   * New hacks, `glhanoi', `cube21', `timetunnel',
+                        `juggler3d', and `celtic'.
+                      * New versions of `tangram', `webcollage', `hypertorus',
+                        `polytopes', and `ripples'.
+                      * `sonar' is now quiet about unresolvable hosts.
+                      * Minor corrections to BASIC code in `apple2'.
+                      * xscreensaver-demo now provides an RPM clue when none
+                        of the hacks seem to be installed.
+                      * Don't install `ant' by default, since there is some
+                        Java tool of that name, which was causing confusion.
+                        And also it's boring.
+                      * Made screen grabbing work again on MacOS 10.4.2.
+                      * No longer prints bogus warnings about ClientMessages
+                        intended for the window manager.
+                      * Ignore unprintable characters in passwd entry field.
+                      * Fixed yet another cross-host-display image-loading
+                        endian problem.
+                      * `xscreensaver-command -watch' and `-time' now work
+                        on 64-bit machines.
 Changes since 4.21:   * Fixed a bug in the new mouse-motion code that caused
                         the screen to never blank on multi-head non-Xinerama
                         systems.  Oops.
 Changes since 4.21:   * Fixed a bug in the new mouse-motion code that caused
                         the screen to never blank on multi-head non-Xinerama
                         systems.  Oops.
index 9873d74b8e52092117cba40d67cda11d34faed23..4238a72e9575c18e03812fddb21f878210ff0f75 100755 (executable)
--- a/configure
+++ b/configure
@@ -7167,6 +7167,15 @@ echo "$as_me:$LINENO: result: $ac_macosx" >&5
 echo "${ECHO_T}$ac_macosx" >&6
 
 
 echo "${ECHO_T}$ac_macosx" >&6
 
 
+if test "$ac_macosx" = yes; then
+  if test -n "$GCC"; then
+    # Without these, every link against libGL gets a bunch of useless warnings.
+    osx_crud="-bind_at_load -multiply_defined suppress"
+    echo "$as_me:$LINENO: result: adding \"$osx_crud\" to LDFLAGS" >&5
+echo "${ECHO_T}adding \"$osx_crud\" to LDFLAGS" >&6
+     LDFLAGS="$LDFLAGS $osx_crud"
+  fi
+fi
 
 ###############################################################################
 #
 
 ###############################################################################
 #
@@ -14387,7 +14396,6 @@ echo $ECHO_N "checking for $login_manager_tmp... $ECHO_C" >&6
       if test -x "$login_manager_tmp" ; then
         echo "$as_me:$LINENO: result: yes" >&5
 echo "${ECHO_T}yes" >&6
       if test -x "$login_manager_tmp" ; then
         echo "$as_me:$LINENO: result: yes" >&5
 echo "${ECHO_T}yes" >&6
-        with_login_manager="$login_manager_tmp"
       else
         echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6
       else
         echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6
@@ -14695,6 +14703,7 @@ fi
 echo "$as_me:$LINENO: result: $ac_cv_gtk_config_libs" >&5
 echo "${ECHO_T}$ac_cv_gtk_config_libs" >&6
   fi
 echo "$as_me:$LINENO: result: $ac_cv_gtk_config_libs" >&5
 echo "${ECHO_T}$ac_cv_gtk_config_libs" >&6
   fi
+
   ac_gtk_config_cflags=$ac_cv_gtk_config_cflags
   ac_gtk_config_libs=$ac_cv_gtk_config_libs
 
   ac_gtk_config_cflags=$ac_cv_gtk_config_cflags
   ac_gtk_config_libs=$ac_cv_gtk_config_libs
 
@@ -16112,7 +16121,7 @@ if test "${ac_cv_mesagl_version_string+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat > conftest.$ac_ext <<EOF
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 16119 "configure"
+#line 16128 "configure"
 #include "confdefs.h"
 #include <GL/gl.h>
 #ifndef MESA_MAJOR_VERSION
 #include "confdefs.h"
 #include <GL/gl.h>
 #ifndef MESA_MAJOR_VERSION
@@ -16983,6 +16992,7 @@ fi
 echo "$as_me:$LINENO: result: $ac_cv_gdk_pixbuf_config_libs" >&5
 echo "${ECHO_T}$ac_cv_gdk_pixbuf_config_libs" >&6
   fi
 echo "$as_me:$LINENO: result: $ac_cv_gdk_pixbuf_config_libs" >&5
 echo "${ECHO_T}$ac_cv_gdk_pixbuf_config_libs" >&6
   fi
+
   ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags
   ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs
 
   ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags
   ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs
 
@@ -18378,6 +18388,7 @@ echo "$as_me:$LINENO: result: $ac_cv_lib_util_forkpty" >&5
 echo "${ECHO_T}$ac_cv_lib_util_forkpty" >&6
 if test $ac_cv_lib_util_forkpty = yes; then
   PTY_LIBS="-lutil"
 echo "${ECHO_T}$ac_cv_lib_util_forkpty" >&6
 if test $ac_cv_lib_util_forkpty = yes; then
   PTY_LIBS="-lutil"
+                ac_have_forkpty=yes
                 cat >>confdefs.h <<\_ACEOF
 #define HAVE_FORKPTY 1
 _ACEOF
                 cat >>confdefs.h <<\_ACEOF
 #define HAVE_FORKPTY 1
 _ACEOF
 #  LIBS="$ac_save_LIBS"
 
 
 #  LIBS="$ac_save_LIBS"
 
 
+if test "$ac_have_forkpty" != yes ; then
+  # we don't need (or have) -lutil on MacOS 10.4.2...
+
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  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 $X_EXTRA_LIBS"
+
+  echo "$as_me:$LINENO: checking for forkpty in -lc" >&5
+echo $ECHO_N "checking for forkpty in -lc... $ECHO_C" >&6
+if test "${ac_cv_lib_c_forkpty+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char forkpty ();
+int
+main ()
+{
+forkpty ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_c_forkpty=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_c_forkpty=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_c_forkpty" >&5
+echo "${ECHO_T}$ac_cv_lib_c_forkpty" >&6
+if test $ac_cv_lib_c_forkpty = yes; then
+  PTY_LIBS=""
+                  cat >>confdefs.h <<\_ACEOF
+#define HAVE_FORKPTY 1
+_ACEOF
+
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+
+fi
 
 ###############################################################################
 #
 
 ###############################################################################
 #
index 7889de45e9d4af2f13b630688f2caa84773db59c..fbde9f84753f8824420dd3b979fb0eac0df80b1b 100644 (file)
@@ -1144,6 +1144,14 @@ AC_MSG_CHECKING(whether this is MacOS X)
 AC_MSG_RESULT($ac_macosx)
 
 
 AC_MSG_RESULT($ac_macosx)
 
 
+if test "$ac_macosx" = yes; then
+  if test -n "$GCC"; then
+    # Without these, every link against libGL gets a bunch of useless warnings.
+    osx_crud="-bind_at_load -multiply_defined suppress"
+    AC_MSG_RESULT(adding "$osx_crud" to LDFLAGS)
+     LDFLAGS="$LDFLAGS $osx_crud"
+  fi
+fi
 
 ###############################################################################
 #
 
 ###############################################################################
 #
@@ -2260,7 +2268,6 @@ if test -n "$with_login_manager_req" ; then
       AC_MSG_CHECKING([for $login_manager_tmp])
       if test -x "$login_manager_tmp" ; then
         AC_MSG_RESULT(yes)
       AC_MSG_CHECKING([for $login_manager_tmp])
       if test -x "$login_manager_tmp" ; then
         AC_MSG_RESULT(yes)
-        with_login_manager="$login_manager_tmp"
       else
         AC_MSG_RESULT(no)
         with_login_manager=""
       else
         AC_MSG_RESULT(no)
         with_login_manager=""
@@ -2420,6 +2427,7 @@ if test "$with_gtk" = yes; then
     AC_CACHE_CHECK([for Gtk libs], ac_cv_gtk_config_libs,
                    [ac_cv_gtk_config_libs=`$pkg_config --libs $pkgs`])
   fi
     AC_CACHE_CHECK([for Gtk libs], ac_cv_gtk_config_libs,
                    [ac_cv_gtk_config_libs=`$pkg_config --libs $pkgs`])
   fi
+
   ac_gtk_config_cflags=$ac_cv_gtk_config_cflags
   ac_gtk_config_libs=$ac_cv_gtk_config_libs
 
   ac_gtk_config_cflags=$ac_cv_gtk_config_cflags
   ac_gtk_config_libs=$ac_cv_gtk_config_libs
 
@@ -2955,6 +2963,7 @@ if test "$with_gdk_pixbuf" = yes; then
     AC_CACHE_CHECK([for gdk-pixbuf libs], ac_cv_gdk_pixbuf_config_libs,
                [ac_cv_gdk_pixbuf_config_libs=`$pkg_config --libs $pkgs`])
   fi
     AC_CACHE_CHECK([for gdk-pixbuf libs], ac_cv_gdk_pixbuf_config_libs,
                [ac_cv_gdk_pixbuf_config_libs=`$pkg_config --libs $pkgs`])
   fi
+
   ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags
   ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs
 
   ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags
   ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs
 
@@ -3107,8 +3116,15 @@ PTY_LIBS=
 AC_CHECK_HEADERS(pty.h util.h)
 AC_CHECK_X_LIB(util, forkpty,
                [PTY_LIBS="-lutil"
 AC_CHECK_HEADERS(pty.h util.h)
 AC_CHECK_X_LIB(util, forkpty,
                [PTY_LIBS="-lutil"
+                ac_have_forkpty=yes
                 AC_DEFINE(HAVE_FORKPTY)])
 
                 AC_DEFINE(HAVE_FORKPTY)])
 
+if test "$ac_have_forkpty" != yes ; then
+  # we don't need (or have) -lutil on MacOS 10.4.2...
+  AC_CHECK_X_LIB(c, forkpty,
+                 [PTY_LIBS=""
+                  AC_DEFINE(HAVE_FORKPTY)])
+fi
 
 ###############################################################################
 #
 
 ###############################################################################
 #
index 807892d81afa1407de8b83746f26998cee30a2f3..6f608c30cf78cce8a995a8ff234e8861109addc8 100644 (file)
@@ -4,8 +4,8 @@
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
-!                              version 4.22
-!                              22-Jun-2005
+!                              version 4.23
+!                              21-Oct-2005
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
@@ -226,7 +226,6 @@ GetViewPortIsFullOfLies: False
                                triangle -root -delay 1                     \n\
 -                              worm -root                                  \n\
 -                              rotor -root                                 \n\
                                triangle -root -delay 1                     \n\
 -                              worm -root                                  \n\
 -                              rotor -root                                 \n\
--                              ant -root                                   \n\
 -                              demon -root                                 \n\
 -                              loop -root                                  \n\
 -                              vines -root                                 \n\
 -                              demon -root                                 \n\
 -                              loop -root                                  \n\
 -                              vines -root                                 \n\
@@ -318,6 +317,7 @@ GetViewPortIsFullOfLies: False
                                fireworkx -root                             \n\
                                fiberlamp -root                             \n\
                                boxfit -root                                \n\
                                fireworkx -root                             \n\
                                fiberlamp -root                             \n\
                                boxfit -root                                \n\
+                               celtic -root                                \n\
 - default-n:                   webcollage -root                            \n\
 - default-n:  "WebCollage (whacked)"                                         \
                                webcollage -root -filter                      \
 - default-n:                   webcollage -root                            \n\
 - default-n:  "WebCollage (whacked)"                                         \
                                webcollage -root -filter                      \
@@ -401,6 +401,10 @@ GetViewPortIsFullOfLies: False
 @GL_KLUDGE@ GL:                        tangram -root                               \n\
 @GL_KLUDGE@ GL:                        crackberg -root -flat -lit -crack             \
                                 -color random                              \n\
 @GL_KLUDGE@ GL:                        tangram -root                               \n\
 @GL_KLUDGE@ GL:                        crackberg -root -flat -lit -crack             \
                                 -color random                              \n\
+@GL_KLUDGE@ GL:                        glhanoi -root                               \n\
+@GL_KLUDGE@ GL:                        cube21 -root -colormode six                 \n\
+@GL_KLUDGE@ GL:                        timetunnel -root                            \n\
+@GL_KLUDGE@ GL:                        juggler3d -root                             \n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \n\
 - default-n:                   xearth -nofork -nostars -ncolors 50           \
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \n\
 - default-n:                   xearth -nofork -nostars -ncolors 50           \
@@ -543,6 +547,7 @@ XScreenSaver.bourneShell:           /bin/sh
 *hacks.memscroller.name:    MemScroller
 *hacks.boxfit.name:         BoxFit
 *hacks.fliptext.name:       FlipText
 *hacks.memscroller.name:    MemScroller
 *hacks.boxfit.name:         BoxFit
 *hacks.fliptext.name:       FlipText
+*hacks.glhanoi.name:        GLHanoi
 
 ! obsolete, but still used by xscreensaver-demo-Xm.
 *hacks.documentation.isInstalled: True
 
 ! obsolete, but still used by xscreensaver-demo-Xm.
 *hacks.documentation.isInstalled: True
index 663c37e0a36f158d0ecedc111aefdaf64e6bbaee..c05ccf843fe278fb53d0437d6d3406f5f672ee57 100644 (file)
                                triangle -root -delay 1                     \\n\
 -                              worm -root                                  \\n\
 -                              rotor -root                                 \\n\
                                triangle -root -delay 1                     \\n\
 -                              worm -root                                  \\n\
 -                              rotor -root                                 \\n\
--                              ant -root                                   \\n\
 -                              demon -root                                 \\n\
 -                              loop -root                                  \\n\
 -                              vines -root                                 \\n\
 -                              demon -root                                 \\n\
 -                              loop -root                                  \\n\
 -                              vines -root                                 \\n\
                                fireworkx -root                             \\n\
                                fiberlamp -root                             \\n\
                                boxfit -root                                \\n\
                                fireworkx -root                             \\n\
                                fiberlamp -root                             \\n\
                                boxfit -root                                \\n\
+                               celtic -root                                \\n\
 - default-n:                   webcollage -root                            \\n\
 - default-n:  \"WebCollage (whacked)\"                                       \
                                webcollage -root -filter                      \
 - default-n:                   webcollage -root                            \\n\
 - default-n:  \"WebCollage (whacked)\"                                       \
                                webcollage -root -filter                      \
           GL:                  tangram -root                               \\n\
           GL:                  crackberg -root -flat -lit -crack             \
                                 -color random                              \\n\
           GL:                  tangram -root                               \\n\
           GL:                  crackberg -root -flat -lit -crack             \
                                 -color random                              \\n\
+          GL:                  glhanoi -root                               \\n\
+          GL:                  cube21 -root -colormode six                 \\n\
+          GL:                  timetunnel -root                            \\n\
+          GL:                  juggler3d -root                             \\n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \\n\
 - default-n:                   xearth -nofork -nostars -ncolors 50           \
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \\n\
 - default-n:                   xearth -nofork -nostars -ncolors 50           \
 "*hacks.memscroller.name:    MemScroller",
 "*hacks.boxfit.name:         BoxFit",
 "*hacks.fliptext.name:       FlipText",
 "*hacks.memscroller.name:    MemScroller",
 "*hacks.boxfit.name:         BoxFit",
 "*hacks.fliptext.name:       FlipText",
+"*hacks.glhanoi.name:        GLHanoi",
 "*hacks.documentation.isInstalled: True",
 "*hacks.documentation.isInstalled: True",
index 7d1ca042db190f04a2fa74c380a88431cd27349d..4a6f3cf169a57630372dfc9b39f1a87727341b56 100644 (file)
@@ -190,6 +190,7 @@ typedef struct {
   int *list_elt_to_hack_number;        /* table for sorting the hack list */
   int *hack_number_to_list_elt;        /* the inverse table */
   Bool *hacks_available_p;     /* whether hacks are on $PATH */
   int *list_elt_to_hack_number;        /* table for sorting the hack list */
   int *hack_number_to_list_elt;        /* the inverse table */
   Bool *hacks_available_p;     /* whether hacks are on $PATH */
+  int total_available;         /* how many are on $PATH */
   int list_count;              /* how many items are in the list: this may be
                                    less than p->screenhacks_count, if some are
                                    suppressed. */
   int list_count;              /* how many items are in the list: this may be
                                    less than p->screenhacks_count, if some are
                                    suppressed. */
@@ -645,7 +646,6 @@ run_hack (state *s, int list_elt, Bool report_errors_p)
                 strcpy (buf, "Unknown error!");
               warning_dialog (s->toplevel_widget, buf, False, 100);
             }
                 strcpy (buf, "Unknown error!");
               warning_dialog (s->toplevel_widget, buf, False, 100);
             }
-          if (err) free (err);
         }
       else
         {
         }
       else
         {
@@ -845,7 +845,8 @@ doc_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
            p->load_url_command,
            p->help_url, p->help_url, p->help_url, p->help_url);
   strcat (help_command, " ) &");
            p->load_url_command,
            p->help_url, p->help_url, p->help_url, p->help_url);
   strcat (help_command, " ) &");
-  system (help_command);
+  if (system (help_command) < 0)
+    fprintf (stderr, "%s: fork error\n", blurb());
   free (help_command);
 }
 
   free (help_command);
 }
 
@@ -889,7 +890,8 @@ restart_menu_cb (GtkWidget *widget, gpointer user_data)
   flush_dialog_changes_and_save (s);
   xscreensaver_command (GDK_DISPLAY(), XA_EXIT, 0, False, NULL);
   sleep (1);
   flush_dialog_changes_and_save (s);
   xscreensaver_command (GDK_DISPLAY(), XA_EXIT, 0, False, NULL);
   sleep (1);
-  system ("xscreensaver -nosplash &");
+  if (system ("xscreensaver -nosplash &") < 0)
+    fprintf (stderr, "%s: fork error\n", blurb());
 
   await_xscreensaver (s);
 }
 
   await_xscreensaver (s);
 }
@@ -1051,7 +1053,8 @@ manual_cb (GtkButton *button, gpointer user_data)
                cmd,
                name2, name2, name2, name2);
       strcat (cmd2, " ) &");
                cmd,
                name2, name2, name2, name2);
       strcat (cmd2, " ) &");
-      system (cmd2);
+      if (system (cmd2) < 0)
+        fprintf (stderr, "%s: fork error\n", blurb());
       free (cmd2);
     }
   else
       free (cmd2);
     }
   else
@@ -1080,9 +1083,11 @@ force_list_select_item (state *s, GtkWidget *list, int list_elt, Bool scroll_p)
 #ifdef HAVE_GTK2
   model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
   STFU g_assert (model);
 #ifdef HAVE_GTK2
   model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
   STFU g_assert (model);
-  gtk_tree_model_iter_nth_child (model, &iter, NULL, list_elt);
-  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list));
-  gtk_tree_selection_select_iter (selection, &iter);
+  if (gtk_tree_model_iter_nth_child (model, &iter, NULL, list_elt))
+    {
+      selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list));
+      gtk_tree_selection_select_iter (selection, &iter);
+    }
 #else  /* !HAVE_GTK2 */
   gtk_list_select_item (GTK_LIST (list), list_elt);
 #endif /* !HAVE_GTK2 */
 #else  /* !HAVE_GTK2 */
   gtk_list_select_item (GTK_LIST (list), list_elt);
 #endif /* !HAVE_GTK2 */
@@ -3315,13 +3320,16 @@ initialize_sort_map (state *s)
     calloc (sizeof(int), p->screenhacks_count + 1);
   s->hacks_available_p = (Bool *)
     calloc (sizeof(Bool), p->screenhacks_count + 1);
     calloc (sizeof(int), p->screenhacks_count + 1);
   s->hacks_available_p = (Bool *)
     calloc (sizeof(Bool), p->screenhacks_count + 1);
+  s->total_available = 0;
 
   /* Check which hacks actually exist on $PATH
    */
   for (i = 0; i < p->screenhacks_count; i++)
     {
       screenhack *hack = p->screenhacks[i];
 
   /* Check which hacks actually exist on $PATH
    */
   for (i = 0; i < p->screenhacks_count; i++)
     {
       screenhack *hack = p->screenhacks[i];
-      s->hacks_available_p[i] = on_path_p (hack->command);
+      int on = on_path_p (hack->command) ? 1 : 0;
+      s->hacks_available_p[i] = on;
+      s->total_available += on;
     }
 
   /* Initialize list->hack table to unsorted mapping, omitting nonexistent
     }
 
   /* Initialize list->hack table to unsorted mapping, omitting nonexistent
@@ -3473,11 +3481,14 @@ clear_preview_window (state *s)
     Bool available_p = (hack_number >= 0
                         ? s->hacks_available_p [hack_number]
                         : True);
     Bool available_p = (hack_number >= 0
                         ? s->hacks_available_p [hack_number]
                         : True);
+    Bool nothing_p = (s->total_available < 5);
+
 #ifdef HAVE_GTK2
     GtkWidget *notebook = name_to_widget (s, "preview_notebook");
     gtk_notebook_set_page (GTK_NOTEBOOK (notebook),
                           (s->running_preview_error_p
 #ifdef HAVE_GTK2
     GtkWidget *notebook = name_to_widget (s, "preview_notebook");
     gtk_notebook_set_page (GTK_NOTEBOOK (notebook),
                           (s->running_preview_error_p
-                            ? (available_p ? 1 : 2)
+                            ? (available_p ? 1 :
+                               nothing_p ? 3 : 2)
                             : 0));
 #else /* !HAVE_GTK2 */
     if (s->running_preview_error_p)
                             : 0));
 #else /* !HAVE_GTK2 */
     if (s->running_preview_error_p)
@@ -3718,7 +3729,8 @@ get_best_gl_visual (state *s)
         close (out);  /* don't need this one */
 
         *buf = 0;
         close (out);  /* don't need this one */
 
         *buf = 0;
-        fgets (buf, sizeof(buf)-1, f);
+        if (!fgets (buf, sizeof(buf)-1, f))
+          *buf = 0;
         fclose (f);
 
         /* Wait for the child to die. */
         fclose (f);
 
         /* Wait for the child to die. */
index 169880b1b6a993f7ead31e3206406a7150241d00..65162a591a2752214b3b86583fa22aca4d69b4e4 100644 (file)
@@ -17,6 +17,7 @@
 # include "config.h"
 #endif
 
 # include "config.h"
 #endif
 
+#include <ctype.h>
 #include <X11/Intrinsic.h>
 #include <X11/cursorfont.h>
 #include <X11/Xos.h>           /* for time() */
 #include <X11/Intrinsic.h>
 #include <X11/cursorfont.h>
 #include <X11/Xos.h>           /* for time() */
@@ -1424,14 +1425,25 @@ handle_passwd_key (saver_info *si, XKeyEvent *event)
       break;
 
     default:
       break;
 
     default:
-      i = strlen (typed_passwd);
-      if (i >= pw_size-1)
-       XBell (si->dpy, 0);
+      /* Though technically the only illegal characters in Unix passwords
+         are LF and NUL, most GUI programs (e.g., GDM) use regular text-entry
+         fields that only let you type printable characters.  So, people
+         who use funky characters in their passwords are already broken.
+         We follow that precedent.
+       */
+      if (isprint ((unsigned char) *s))
+        {
+          i = strlen (typed_passwd);
+          if (i >= pw_size-1)
+            XBell (si->dpy, 0);
+          else
+            {
+              typed_passwd [i] = *s;
+              typed_passwd [i+1] = 0;
+            }
+        }
       else
       else
-       {
-         typed_passwd [i] = *s;
-         typed_passwd [i+1] = 0;
-       }
+        XBell (si->dpy, 0);
       break;
     }
 
       break;
     }
 
index d34d2935083470d59a65e78b99ce3c1a178ff819..1ef9a276fee115c8e2c37186c22d18041c14656e 100644 (file)
@@ -86,7 +86,14 @@ chase_symlinks (const char *file)
 # ifdef HAVE_REALPATH
   if (file)
     {
 # ifdef HAVE_REALPATH
   if (file)
     {
-      char buf [2048];
+# ifndef PATH_MAX
+#  ifdef MAXPATHLEN
+#   define PATH_MAX MAXPATHLEN
+#  else
+#   define PATH_MAX 2048
+#  endif
+# endif
+      char buf[PATH_MAX];
       if (realpath (file, buf))
         return strdup (buf);
 
       if (realpath (file, buf))
         return strdup (buf);
 
@@ -1576,11 +1583,15 @@ stop_the_insanity (saver_preferences *p)
       p->dpms_off < 10 * 1000)
     p->dpms_off      = 4 * 60 * 60 * 1000;                      /* 4 hours */
 
       p->dpms_off < 10 * 1000)
     p->dpms_off      = 4 * 60 * 60 * 1000;                      /* 4 hours */
 
-  /* standby may not be greater than suspend.
-     suspend may not be greater than off.
+  /* suspend may not be greater than off, unless off is 0.
+     standby may not be greater than suspend, unless suspend is 0.
    */
    */
-  if (p->dpms_standby > p->dpms_suspend) p->dpms_standby = p->dpms_suspend;
-  if (p->dpms_suspend > p->dpms_off)     p->dpms_suspend = p->dpms_off;
+  if (p->dpms_off != 0 &&
+      p->dpms_suspend > p->dpms_off)
+    p->dpms_suspend = p->dpms_off;
+  if (p->dpms_suspend != 0 &&
+      p->dpms_standby > p->dpms_suspend)
+    p->dpms_standby = p->dpms_suspend;
 
 
   if (p->dpms_standby == 0 &&     /* if *all* are 0, then DPMS is disabled */
 
 
   if (p->dpms_standby == 0 &&     /* if *all* are 0, then DPMS is disabled */
@@ -1589,6 +1600,9 @@ stop_the_insanity (saver_preferences *p)
     p->dpms_enabled_p = False;
 
 
     p->dpms_enabled_p = False;
 
 
+  /* Set watchdog timeout to about half of the cycle timeout, but
+     don't let it be faster than 1/2 minute or slower than 1 minute.
+   */
   p->watchdog_timeout = p->cycle * 0.6;
   if (p->watchdog_timeout < 27000) p->watchdog_timeout = 27000;          /* 27 secs */
   if (p->watchdog_timeout > 57000) p->watchdog_timeout = 57000;   /* 57 secs */
   p->watchdog_timeout = p->cycle * 0.6;
   if (p->watchdog_timeout < 27000) p->watchdog_timeout = 27000;          /* 27 secs */
   if (p->watchdog_timeout > 57000) p->watchdog_timeout = 57000;   /* 57 secs */
index d56d5e9fd20ff2f5f205a2e29f20f22f841d8c42..6039324f190e870b613508dee91e85667f01c95e 100644 (file)
@@ -1,5 +1,4 @@
-/* xscreensaver-command, Copyright (c) 1991-1998
- *  by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver-command, Copyright (c) 1991-2005 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
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -201,7 +200,6 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg,
           else
             fprintf (stderr, "%s: %s\n", progname, err);
 
           else
             fprintf (stderr, "%s: %s\n", progname, err);
 
-          if (v) free (v);
           status = -1;
           goto DONE;
        }
           status = -1;
           goto DONE;
        }
index 74d8318b8ea1860b7119949f5b2b861c77e69592..86d3535afd3f04730c2cb415c99277fdd80ee605 100644 (file)
@@ -97,7 +97,7 @@ setgroups_needed_p (uid_t target_group)
   if (n < 0)
     {
       char buf [1024];
   if (n < 0)
     {
       char buf [1024];
-      sprintf (buf, "%s: getgroups(%d, ...)", blurb(), sizeof(groups)-1);
+      sprintf (buf, "%s: getgroups(%ld, ...)", blurb(), (long)sizeof(groups)-1);
       perror (buf);
       return 1;
     }
       perror (buf);
       return 1;
     }
index ffabe483f3b2936697e7262dc3749156c39a3ea8..01329d0effb0426a26b27ba3042e5e8e978510c6 100644 (file)
@@ -71,6 +71,59 @@ extern int kill (pid_t, int);                /* signal() is in sys/signal.h... */
 extern saver_info *global_si_kludge;   /* I hate C so much... */
 
 
 extern saver_info *global_si_kludge;   /* I hate C so much... */
 
 
+/* Used when printing error/debugging messages from signal handlers.
+ */
+static const char *
+no_malloc_number_to_string (long num)
+{
+  static char string[128] = "";
+  int num_digits;
+  Bool negative_p = False;
+
+  num_digits = 0;
+
+  if (num == 0)
+    return "0";
+
+  if (num < 0)
+    {
+      negative_p = True;
+      num = -num;
+    }
+
+  while ((num > 0) && (num_digits < sizeof(string - 1)))
+    {
+      int digit;
+      digit = (int) num % 10;
+      num_digits++;
+      string[sizeof(string) - 1 - num_digits] = digit + '0';
+      num /= 10;
+    }
+
+  if (negative_p)
+    {
+      num_digits++;
+      string[sizeof(string) - 1 - num_digits] = '-';
+    }
+
+  return string + sizeof(string) - 1 - num_digits;
+}
+
+/* Like write(), but runs strlen() on the arg to get the length. */
+static int
+write_string (int fd, const char *str)
+{
+  return write (fd, str, strlen (str));
+}
+
+static int
+write_long (int fd, long n)
+{
+  const char *str = no_malloc_number_to_string (n);
+  return write_string (fd, str);
+}
+
+
 /* RLIMIT_AS (called RLIMIT_VMEM on some systems) controls the maximum size
    of a process's address space, i.e., the maximal brk(2) and mmap(2) values.
    Setting this lets you put a cap on how much memory a process can allocate.
 /* RLIMIT_AS (called RLIMIT_VMEM on some systems) controls the maximum size
    of a process's address space, i.e., the maximal brk(2) and mmap(2) values.
    Setting this lets you put a cap on how much memory a process can allocate.
@@ -412,8 +465,19 @@ sigchld_handler (int sig)
   saver_info *si = global_si_kludge;   /* I hate C so much... */
 
   if (si->prefs.debug_p)
   saver_info *si = global_si_kludge;   /* I hate C so much... */
 
   if (si->prefs.debug_p)
-    fprintf(stderr, "%s: got SIGCHLD%s\n", blurb(),
+    {
+      /* Don't call fprintf() from signal handlers, as it might malloc.
+      fprintf(stderr, "%s: got SIGCHLD%s\n", blurb(),
            (block_sigchld_handler ? " (blocked)" : ""));
            (block_sigchld_handler ? " (blocked)" : ""));
+      */
+      write_string (STDERR_FILENO, blurb());
+      write_string (STDERR_FILENO, ": got SIGCHLD");
+
+      if (block_sigchld_handler)
+        write_string (STDERR_FILENO, " (blocked)\n");
+      else
+        write_string (STDERR_FILENO, "\n");
+    }
 
   if (block_sigchld_handler < 0)
     abort();
 
   if (block_sigchld_handler < 0)
     abort();
@@ -430,6 +494,7 @@ sigchld_handler (int sig)
 
 
 #ifndef VMS
 
 
 #ifndef VMS
+
 static void
 await_dying_children (saver_info *si)
 {
 static void
 await_dying_children (saver_info *si)
 {
@@ -444,11 +509,29 @@ await_dying_children (saver_info *si)
       if (si->prefs.debug_p)
        {
          if (kid < 0 && errno)
       if (si->prefs.debug_p)
        {
          if (kid < 0 && errno)
-           fprintf (stderr, "%s: waitpid(-1) ==> %ld (%d)\n", blurb(),
-                    (long) kid, errno);
-         else
-           fprintf (stderr, "%s: waitpid(-1) ==> %ld\n", blurb(),
-                    (long) kid);
+            {
+              /* Don't call fprintf() from signal handlers, as it might malloc.
+             fprintf (stderr, "%s: waitpid(-1) ==> %ld (%d)\n", blurb(),
+                      (long) kid, errno);
+               */
+              write_string (STDERR_FILENO, blurb());
+              write_string (STDERR_FILENO, ": waitpid(-1) ==> ");
+              write_long   (STDERR_FILENO, (long) kid);
+              write_string (STDERR_FILENO, " (");
+              write_long   (STDERR_FILENO, (long) errno);
+              write_string (STDERR_FILENO, ")\n");
+            }
+          else
+            {
+              /* Don't call fprintf() from signal handlers, as it might malloc.
+              fprintf (stderr, "%s: waitpid(-1) ==> %ld\n", blurb(),
+                       (long) kid);
+               */
+              write_string (STDERR_FILENO, blurb());
+              write_string (STDERR_FILENO, ": waitpid(-1) ==> ");
+              write_long   (STDERR_FILENO, (long) kid);
+              write_string (STDERR_FILENO, "\n");
+            }
        }
 
       /* 0 means no more children to reap.
        }
 
       /* 0 means no more children to reap.
@@ -488,12 +571,38 @@ describe_dead_child (saver_info *si, pid_t kid, int wait_status)
       if (!job ||
          (exit_status != 0 &&
           (p->verbose_p || job->status != job_killed)))
       if (!job ||
          (exit_status != 0 &&
           (p->verbose_p || job->status != job_killed)))
-       fprintf (stderr,
-                "%s: %d: child pid %lu (%s) exited abnormally (code %d).\n",
-                blurb(), screen_no, (unsigned long) kid, name, exit_status);
+        {
+          /* Don't call fprintf() from signal handlers, as it might malloc.
+         fprintf (stderr,
+                  "%s: %d: child pid %lu (%s) exited abnormally (code %d).\n",
+                  blurb(), screen_no, (unsigned long) kid, name, exit_status);
+           */
+          write_string (STDERR_FILENO, blurb());
+          write_string (STDERR_FILENO, ": ");
+          write_long   (STDERR_FILENO, (long) screen_no);
+          write_string (STDERR_FILENO, ": child pid ");
+          write_long   (STDERR_FILENO, (long) kid);
+          write_string (STDERR_FILENO, " (");
+          write_string (STDERR_FILENO, name);
+          write_string (STDERR_FILENO, ") exited abnormally (code ");
+          write_long   (STDERR_FILENO, (long) exit_status);
+          write_string (STDERR_FILENO, ").\n"); 
+        }
       else if (p->verbose_p)
       else if (p->verbose_p)
-       fprintf (stderr, "%s: %d: child pid %lu (%s) exited normally.\n",
-                blurb(), screen_no, (unsigned long) kid, name);
+        {
+          /* Don't call fprintf() from signal handlers, as it might malloc.
+         fprintf (stderr, "%s: %d: child pid %lu (%s) exited normally.\n",
+                  blurb(), screen_no, (unsigned long) kid, name);
+           */
+          write_string (STDERR_FILENO, blurb());
+          write_string (STDERR_FILENO, ": ");
+          write_long   (STDERR_FILENO, (long) screen_no);
+          write_string (STDERR_FILENO, ": child pid ");
+          write_long   (STDERR_FILENO, (long) kid);
+          write_string (STDERR_FILENO, " (");
+          write_string (STDERR_FILENO, name);
+          write_string (STDERR_FILENO, ") exited normally.\n");
+        }
 
       if (job)
        job->status = job_dead;
 
       if (job)
        job->status = job_dead;
@@ -504,9 +613,23 @@ describe_dead_child (saver_info *si, pid_t kid, int wait_status)
          !job ||
          job->status != job_killed ||
          WTERMSIG (wait_status) != SIGTERM)
          !job ||
          job->status != job_killed ||
          WTERMSIG (wait_status) != SIGTERM)
-       fprintf (stderr, "%s: %d: child pid %lu (%s) terminated with %s.\n",
-                blurb(), screen_no, (unsigned long) kid, name,
-                signal_name (WTERMSIG(wait_status)));
+        {
+          /* Don't call fprintf() from signal handlers, as it might malloc.
+         fprintf (stderr, "%s: %d: child pid %lu (%s) terminated with %s.\n",
+                  blurb(), screen_no, (unsigned long) kid, name,
+                  signal_name (WTERMSIG(wait_status)));
+           */
+          write_string (STDERR_FILENO, blurb());
+          write_string (STDERR_FILENO, ": ");
+          write_long   (STDERR_FILENO, (long) screen_no);
+          write_string (STDERR_FILENO, ": child pid ");
+          write_long   (STDERR_FILENO, (long) kid);
+          write_string (STDERR_FILENO, " (");
+          write_string (STDERR_FILENO, name);
+          write_string (STDERR_FILENO, ") terminated with signal ");
+          write_long   (STDERR_FILENO, WTERMSIG(wait_status));
+          write_string (STDERR_FILENO, ".\n");
+        }
 
       if (job)
        job->status = job_dead;
 
       if (job)
        job->status = job_dead;
@@ -514,17 +637,41 @@ describe_dead_child (saver_info *si, pid_t kid, int wait_status)
   else if (WIFSTOPPED (wait_status))
     {
       if (p->verbose_p)
   else if (WIFSTOPPED (wait_status))
     {
       if (p->verbose_p)
-       fprintf (stderr, "%s: child pid %lu (%s) stopped with %s.\n",
-                blurb(), (unsigned long) kid, name,
-                signal_name (WSTOPSIG (wait_status)));
+        {
+          /* Don't call fprintf() from signal handlers, as it might malloc.
+         fprintf (stderr, "%s: child pid %lu (%s) stopped with %s.\n",
+                  blurb(), (unsigned long) kid, name,
+                  signal_name (WSTOPSIG (wait_status)));
+           */
+          write_string (STDERR_FILENO, blurb());
+          write_string (STDERR_FILENO, ": ");
+          write_long   (STDERR_FILENO, (long) screen_no);
+          write_string (STDERR_FILENO, ": child pid ");
+          write_long   (STDERR_FILENO, (long) kid);
+          write_string (STDERR_FILENO, " (");
+          write_string (STDERR_FILENO, name);
+          write_string (STDERR_FILENO, ") stopped with signal ");
+          write_long   (STDERR_FILENO, WSTOPSIG(wait_status));
+          write_string (STDERR_FILENO, ".\n");
+        }
 
       if (job)
        job->status = job_stopped;
     }
   else
     {
 
       if (job)
        job->status = job_stopped;
     }
   else
     {
+      /* Don't call fprintf() from signal handlers, as it might malloc.
       fprintf (stderr, "%s: child pid %lu (%s) died in a mysterious way!",
               blurb(), (unsigned long) kid, name);
       fprintf (stderr, "%s: child pid %lu (%s) died in a mysterious way!",
               blurb(), (unsigned long) kid, name);
+       */
+      write_string (STDERR_FILENO, blurb());
+      write_string (STDERR_FILENO, ": ");
+      write_long   (STDERR_FILENO, (long) screen_no);
+      write_string (STDERR_FILENO, ": child pid ");
+      write_long   (STDERR_FILENO, (long) kid);
+      write_string (STDERR_FILENO, " (");
+      write_string (STDERR_FILENO, name);
+      write_string (STDERR_FILENO, ") died in a mysterious way!");
       if (job)
        job->status = job_dead;
     }
       if (job)
        job->status = job_dead;
     }
@@ -637,7 +784,8 @@ print_path_error (const char *program)
       fprintf (stderr, "\n");
       *path = 0;
 # if defined(HAVE_GETCWD)
       fprintf (stderr, "\n");
       *path = 0;
 # if defined(HAVE_GETCWD)
-      getcwd (path, sizeof(path));
+      if (! getcwd (path, sizeof(path)))
+        *path = 0;
 # elif defined(HAVE_GETWD)
       getwd (path);
 # endif
 # elif defined(HAVE_GETWD)
       getwd (path);
 # endif
@@ -1090,7 +1238,8 @@ get_best_gl_visual (saver_screen_info *ssi)
         close (out);  /* don't need this one */
 
         *buf = 0;
         close (out);  /* don't need this one */
 
         *buf = 0;
-        fgets (buf, sizeof(buf)-1, f);
+        if (! fgets (buf, sizeof(buf)-1, f))
+          *buf = 0;
         fclose (f);
 
         /* Wait for the child to die. */
         fclose (f);
 
         /* Wait for the child to die. */
index 1f4321425bcc07617aad44f4e025c3dcb4d721d6..f64190bc923580f91856e45320836062902a33f5 100644 (file)
@@ -331,6 +331,16 @@ reset_timers (saver_info *si)
   if (si->cycle_id) abort ();  /* no cycle timer when inactive */
 
   si->last_activity_time = time ((time_t *) 0);
   if (si->cycle_id) abort ();  /* no cycle timer when inactive */
 
   si->last_activity_time = time ((time_t *) 0);
+
+  /* This will (hopefully, supposedly) tell the server to re-set its
+     DPMS timer.  Without this, the -deactivate clientmessage would
+     prevent xscreensaver from blanking, but would not prevent the
+     monitor from powering down. */
+  XForceScreenSaver (si->dpy, ScreenSaverReset);
+
+  /* And if the monitor is already powered off, turn it on.
+     You'd think the above would do that, but apparently not? */
+  monitor_power_on (si);
 }
 
 
 }
 
 
index e9891af746c849426db40907da6ea2a8abb03cbb..e6ca0bf53cae9ae0c6668c596e288e97107834dd 100644 (file)
@@ -30,7 +30,7 @@
 #endif /* HAVE_UNAME */
 
 #include <stdio.h>
 #endif /* HAVE_UNAME */
 
 #include <stdio.h>
-#include <X11/Xproto.h>                /* for CARD32 */
+/* #include <X11/Xproto.h>     / * for CARD32 */
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>         /* for XSetClassHint() */
 #include <X11/Xatom.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>         /* for XSetClassHint() */
 #include <X11/Xatom.h>
 #include <time.h>
 #include <sys/time.h>
 
 #include <time.h>
 #include <sys/time.h>
 
+/* You might think that to store an array of 32-bit quantities onto a
+   server-side property, you would pass an array of 32-bit data quantities
+   into XChangeProperty().  You would be wrong.  You have to use an array
+   of longs, even if long is 64 bits (using 32 of each 64.)
+ */
+typedef long PROP32;
+
 #ifdef HAVE_MIT_SAVER_EXTENSION
 # include <X11/extensions/scrnsaver.h>
 #endif /* HAVE_MIT_SAVER_EXTENSION */
 #ifdef HAVE_MIT_SAVER_EXTENSION
 # include <X11/extensions/scrnsaver.h>
 #endif /* HAVE_MIT_SAVER_EXTENSION */
@@ -966,16 +973,16 @@ store_saver_id (saver_screen_info *ssi)
 void
 store_saver_status (saver_info *si)
 {
 void
 store_saver_status (saver_info *si)
 {
-  CARD32 *status;
+  PROP32 *status;
   int size = si->nscreens + 2;
   int i;
 
   int size = si->nscreens + 2;
   int i;
 
-  status = (CARD32 *) calloc (size, sizeof(CARD32));
+  status = (PROP32 *) calloc (size, sizeof(PROP32));
 
 
-  status[0] = (CARD32) (si->screen_blanked_p
+  status[0] = (PROP32) (si->screen_blanked_p
                         ? (si->locked_p ? XA_LOCK : XA_BLANK)
                         : 0);
                         ? (si->locked_p ? XA_LOCK : XA_BLANK)
                         : 0);
-  status[1] = (CARD32) si->blank_time;
+  status[1] = (PROP32) si->blank_time;
 
   for (i = 0; i < si->nscreens; i++)
     {
 
   for (i = 0; i < si->nscreens; i++)
     {
index 6c039fb27d1c0173bdc2c91f40a4d1af5d6a9653..a74b0c1b86e37fab4431dce7ca8814267b641793 100644 (file)
@@ -23,7 +23,7 @@
 # include <unistd.h>
 #endif
 
 # include <unistd.h>
 #endif
 
-#include <X11/Xproto.h>                /* for CARD32 */
+/* #include <X11/Xproto.h>     / * for CARD32 */
 #include <X11/Xlib.h>
 #include <X11/Xatom.h>
 #include <X11/Xutil.h>         /* for XGetClassHint() */
 #include <X11/Xlib.h>
 #include <X11/Xatom.h>
 #include <X11/Xutil.h>         /* for XGetClassHint() */
 
 #include <X11/Intrinsic.h>     /* only needed to get through xscreensaver.h */
 
 
 #include <X11/Intrinsic.h>     /* only needed to get through xscreensaver.h */
 
+
+/* You might think that to read an array of 32-bit quantities out of a
+   server-side property, you would pass an array of 32-bit data quantities
+   into XGetWindowProperty().  You would be wrong.  You have to use an array
+   of longs, even if long is 64 bits (using 32 of each 64.)
+ */
+typedef long PROP32;
+
 #include "remote.h"
 #include "version.h"
 
 #include "remote.h"
 #include "version.h"
 
@@ -325,7 +333,7 @@ watch (Display *dpy)
   Window window = RootWindow (dpy, 0);
   XWindowAttributes xgwa;
   XEvent event;
   Window window = RootWindow (dpy, 0);
   XWindowAttributes xgwa;
   XEvent event;
-  CARD32 *last = 0;
+  PROP32 *last = 0;
 
   if (v) free (v);
   XGetWindowAttributes (dpy, window, &xgwa);
 
   if (v) free (v);
   XGetWindowAttributes (dpy, window, &xgwa);
@@ -357,7 +365,7 @@ watch (Display *dpy)
               char *s;
               Bool changed = False;
               Bool running = False;
               char *s;
               Bool changed = False;
               Bool running = False;
-              CARD32 *data = (CARD32 *) dataP;
+              PROP32 *data = (PROP32 *) dataP;
 
               if (type != XA_INTEGER || nitems < 3)
                 {
 
               if (type != XA_INTEGER || nitems < 3)
                 {
index 07861e586e53fdc92ee02d201e3ffb1382d8652b..92078445ec7e00fbb2b5c0ebbd7e9e8bb44d515d 100644 (file)
@@ -814,6 +814,48 @@ Installed</property>
                              <property name="type">tab</property>
                            </packing>
                          </child>
                              <property name="type">tab</property>
                            </packing>
                          </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="nothing_label">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">Very few (or no) screen savers appear to be available.
+
+This probably means that the &quot;xscreensaver-extras&quot; and
+&quot;xscreensaver-gl-extras&quot; packages are not installed.</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_CENTER</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                           </widget>
+                           <packing>
+                             <property name="tab_expand">False</property>
+                             <property name="tab_fill">True</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="nothing_tab">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">nothing</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_LEFT</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                           </widget>
+                           <packing>
+                             <property name="type">tab</property>
+                           </packing>
+                         </child>
                        </widget>
                      </child>
 
                        </widget>
                      </child>
 
index 40c6173cbc46a6c6a45b8e5891413c2642b5477a..158dea0996d276933f93a1677d1965be5ff768bc 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl -w
 #!/usr/bin/perl -w
-# Copyright Â© 2003 Jamie Zawinski <jwz@jwz.org>.
+# Copyright Â© 2003, 2005 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
 #
 # Permission to use, copy, modify, distribute, and sell this software and its
 # documentation for any purpose is hereby granted without fee, provided that
@@ -34,7 +34,7 @@ use diagnostics;
 use strict;
 
 my $progname = $0; $progname =~ s@.*/@@g;
 use strict;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.2 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.3 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 my @grabber   = ("screencapture", "-x");
 my @converter = ("pdf2jpeg");
 
 my @grabber   = ("screencapture", "-x");
 my @converter = ("pdf2jpeg");
@@ -101,22 +101,45 @@ sub grab_image {
     }
   }
 
     }
   }
 
-  # Convert the PDF to a JPEG
+  # On MacOS 10.3, "screencapture -x" always wrote a PDF.
+  # On 10.4.2, it writes a PNG by default, and the output format can be
+  # changed with the new "-t" argument.
+  #
+  # So, for maximal compatibility, we run it without "-t", but look at
+  # the first few bytes to see if it's a PDF, and if it is, convert it
+  # to a JPEG first.  Otherwise, we assume that whatever screencapture
+  # wrote is a file format that xscreensaver-getimage-file can already
+  # cope with (though it will have the extension ".pdf", regardless of
+  # what is actually in the file).
+  #
+  my $pdf_p = 0;
   {
   {
-    my $jpgfile = $tmpfile;
-    $jpgfile =~ s/\.[^.]+$//;
-    $jpgfile .= ".jpg";
-
-    @cmd = (@converter, $tmpfile, $jpgfile);
-    push @cmd, "--verbose" if ($verbose);
-
-    print STDERR "$progname: executing \"" . join(' ', @cmd) . "\"\n"
-      if ($verbose);
-    system (@cmd);
-    unlink $tmpfile;
-    $tmpfile = $jpgfile;
+    local *IN;
+    open (IN, "<$tmpfile") || error ("$tmpfile: $!");
+    my $buf = '';
+    read (IN, $buf, 10);
+    close IN;
+    $pdf_p = ($buf =~ m/^%PDF-/s);
   }
 
   }
 
+  # If it's a PDF, convert it to a JPEG.
+  #
+  if ($pdf_p)
+    {
+      my $jpgfile = $tmpfile;
+      $jpgfile =~ s/\.[^.]+$//;
+      $jpgfile .= ".jpg";
+
+      @cmd = (@converter, $tmpfile, $jpgfile);
+      push @cmd, "--verbose" if ($verbose);
+
+      print STDERR "$progname: executing \"" . join(' ', @cmd) . "\"\n"
+        if ($verbose);
+      system (@cmd);
+      unlink $tmpfile;
+      $tmpfile = $jpgfile;
+    }
+
   @st = stat($tmpfile);
   $size = (@st ? $st[7] : 0);
   if ($size <= 2048) {
   @st = stat($tmpfile);
   $size = (@st ? $st[7] : 0);
   if ($size <= 2048) {
index 174bfd97f9de8636060b59452a94ced2c8ee41e3..24c0246e262d2c1a1214f5e5d666121c5f2f8fd8 100644 (file)
@@ -136,6 +136,7 @@ ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
   return 0;
 }
 
   return 0;
 }
 
+#ifndef USE_EXTERNAL_SCREEN_GRABBER
 static int
 ignore_badmatch_ehandler (Display *dpy, XErrorEvent *error)
 {
 static int
 ignore_badmatch_ehandler (Display *dpy, XErrorEvent *error)
 {
@@ -144,6 +145,7 @@ ignore_badmatch_ehandler (Display *dpy, XErrorEvent *error)
   else
     return x_ehandler (dpy, error);
 }
   else
     return x_ehandler (dpy, error);
 }
+#endif /* ! USE_EXTERNAL_SCREEN_GRABBER */
 
 
 /* Returns True if the given Drawable is a Window; False if it's a Pixmap.
 
 
 /* Returns True if the given Drawable is a Window; False if it's a Pixmap.
@@ -295,6 +297,7 @@ compute_image_scaling (int src_w, int src_h,
    If out of memory, returns False, and the XImage will have been
    destroyed and freed.
  */
    If out of memory, returns False, and the XImage will have been
    destroyed and freed.
  */
+#ifndef USE_EXTERNAL_SCREEN_GRABBER
 static Bool
 scale_ximage (Screen *screen, Visual *visual,
               XImage *ximage, int new_width, int new_height)
 static Bool
 scale_ximage (Screen *screen, Visual *visual,
               XImage *ximage, int new_width, int new_height)
@@ -342,6 +345,7 @@ scale_ximage (Screen *screen, Visual *visual,
 
   return True;
 }
 
   return True;
 }
+#endif /* ! USE_EXTERNAL_SCREEN_GRABBER */
 
 
 #ifdef HAVE_GDK_PIXBUF
 
 
 #ifdef HAVE_GDK_PIXBUF
@@ -1197,7 +1201,8 @@ get_filename_1 (Screen *screen, const char *directory, grab_type type,
 
         close (out);  /* don't need this one */
         *buf = 0;
 
         close (out);  /* don't need this one */
         *buf = 0;
-        fgets (buf, sizeof(buf)-1, f);
+        if (! fgets (buf, sizeof(buf)-1, f))
+          *buf = 0;
         fclose (f);
 
         /* Wait for the child to die. */
         fclose (f);
 
         /* Wait for the child to die. */
index 52f9f577b16562a82321686b6ecee4197f3f11e2..4449f9c934b8db8ce85f559323ebe2313a0863db 100755 (executable)
@@ -24,7 +24,7 @@ use Text::Wrap qw(wrap);
 use bytes;
 
 my $progname = $0; $progname =~ s@.*/@@g;
 use bytes;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.5 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.6 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 my $verbose = 0;
 my $http_proxy = undef;
 
 my $verbose = 0;
 my $http_proxy = undef;
@@ -282,7 +282,8 @@ sub output() {
 
   } elsif ($text_mode eq 'program') {
 
 
   } elsif ($text_mode eq 'program') {
 
-    $text_program = which ($text_program);
+    my ($prog, $args) = ($text_program =~ m/^([^\s]+)(.*)$/);
+    $text_program = which ($prog) . $args;
     print STDERR "$progname: running $text_program\n" if ($verbose);
 
     if ($wrap_columns && $wrap_columns > 0) {
     print STDERR "$progname: running $text_program\n" if ($verbose);
 
     if ($wrap_columns && $wrap_columns > 0) {
index 058dd86c091b9c52b84387046785b4778cc9122e..cb41a4942f4351d059971b4562cf6b1871f3df15 100644 (file)
@@ -1598,10 +1598,12 @@ clientmessage_response (saver_info *si, Window w, Bool error,
 static void
 bogus_clientmessage_warning (saver_info *si, XEvent *event)
 {
 static void
 bogus_clientmessage_warning (saver_info *si, XEvent *event)
 {
+  saver_preferences *p = &si->prefs;
   char *str = XGetAtomName_safe (si->dpy, event->xclient.message_type);
   Window w = event->xclient.window;
   char wdesc[255];
   int screen = 0;
   char *str = XGetAtomName_safe (si->dpy, event->xclient.message_type);
   Window w = event->xclient.window;
   char wdesc[255];
   int screen = 0;
+  Bool root_p = False;
 
   *wdesc = 0;
   for (screen = 0; screen < si->nscreens; screen++)
 
   *wdesc = 0;
   for (screen = 0; screen < si->nscreens; screen++)
@@ -1613,9 +1615,19 @@ bogus_clientmessage_warning (saver_info *si, XEvent *event)
     else if (w == RootWindow (si->dpy, screen))
       {
         strcpy (wdesc, "root");
     else if (w == RootWindow (si->dpy, screen))
       {
         strcpy (wdesc, "root");
+        root_p = True;
         break;
       }
 
         break;
       }
 
+  /* If this ClientMessage was sent to the real root window instead of to the
+     xscreensaver window, then it might be intended for someone else who is
+     listening on the root window (e.g., the window manager).  So only print
+     the warning if: we are in debug mode; or if the bogus message was
+     actually sent to one of the xscreensaver-created windows.
+   */
+  if (root_p && !p->debug_p)
+    return;
+
   if (!*wdesc)
     {
       XErrorHandler old_handler;
   if (!*wdesc)
     {
       XErrorHandler old_handler;
index 26e9808a32fbe4cf7f653d918c95593d9c5acf82..9484831f505f3663cb3e4f57c8dd034ae86c8d48 100644 (file)
@@ -796,6 +796,14 @@ Name=XScreensaver
 Type=Application
 X-KDE-StartupNotify=false
 .EE
 Type=Application
 X-KDE-StartupNotify=false
 .EE
+.TP 3
+\fB4: Make the various "lock session" buttons call xscreensaver.\fP
+Replace the file \fI/usr/bin/kdesktop_lock\fP with these two lines:
+.EX
+#!/bin/sh
+xscreensaver-command -lock
+.EE
+Make sure the file is executable (chmod a+x).
 .RE
 .PP
 Now use xscreensaver normally, controlling it via the usual
 .RE
 .PP
 Now use xscreensaver normally, controlling it via the usual
index 18d031b4fe573985c452565418bb0871edefc316..0e5fde9522c6d861c7f2613874c761d0499bed41 100644 (file)
@@ -108,7 +108,7 @@ SRCS                = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
                  mismunch.c pacman.c pacman_ai.c pacman_level.c \
                  fuzzyflakes.c anemotaxis.c memscroller.c substrate.c \
                  intermomentary.c fireworkx.c fireworkx_mmx.S fiberlamp.c \
                  mismunch.c pacman.c pacman_ai.c pacman_level.c \
                  fuzzyflakes.c anemotaxis.c memscroller.c substrate.c \
                  intermomentary.c fireworkx.c fireworkx_mmx.S fiberlamp.c \
-                 boxfit.c interaggregate.c
+                 boxfit.c interaggregate.c celtic.c
 SCRIPTS                = vidwhacker webcollage ljlatest
 
 OBJS           = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
 SCRIPTS                = vidwhacker webcollage ljlatest
 
 OBJS           = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
@@ -138,7 +138,7 @@ OBJS                = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
                  mismunch.o pacman.o pacman_ai.o pacman_level.o \
                  fuzzyflakes.o anemotaxis.o memscroller.o substrate.o \
                  intermomentary.o fireworkx.o fiberlamp.o boxfit.o \
                  mismunch.o pacman.o pacman_ai.o pacman_level.o \
                  fuzzyflakes.o anemotaxis.o memscroller.o substrate.o \
                  intermomentary.o fireworkx.o fiberlamp.o boxfit.o \
-                 interaggregate.o
+                 interaggregate.o celtic.o
 
 NEXES          = attraction blitspin bouboule braid bubbles decayscreen deco \
                  drift flag flame forest vines galaxy grav greynetic halo \
 
 NEXES          = attraction blitspin bouboule braid bubbles decayscreen deco \
                  drift flag flame forest vines galaxy grav greynetic halo \
@@ -147,7 +147,7 @@ NEXES               = attraction blitspin bouboule braid bubbles decayscreen deco \
                  penrose pyro qix rocks rorschach sierpinski slidescreen \
                  slip sphere spiral strange swirl goop starfish munch \
                  fadeplot rd-bomb coral mountain triangle lissie worm rotor \
                  penrose pyro qix rocks rorschach sierpinski slidescreen \
                  slip sphere spiral strange swirl goop starfish munch \
                  fadeplot rd-bomb coral mountain triangle lissie worm rotor \
-                 ant xjack xlyap jigsaw cynosure moire2 flow epicycle \
+                 xjack xlyap jigsaw cynosure moire2 flow epicycle \
                  interference truchet bsod crystal discrete distort kumppa \
                  demon loop t3d penetrate deluxe compass squiral xflame \
                  wander spotlight critical phosphor xmatrix petri shadebobs \
                  interference truchet bsod crystal discrete distort kumppa \
                  demon loop t3d penetrate deluxe compass squiral xflame \
                  wander spotlight critical phosphor xmatrix petri shadebobs \
@@ -159,6 +159,7 @@ NEXES               = attraction blitspin bouboule braid bubbles decayscreen deco \
                  fontglide apple2 xanalogtv pong  wormhole mismunch \
                  pacman fuzzyflakes anemotaxis memscroller substrate \
                  intermomentary fireworkx fiberlamp boxfit interaggregate \
                  fontglide apple2 xanalogtv pong  wormhole mismunch \
                  pacman fuzzyflakes anemotaxis memscroller substrate \
                  intermomentary fireworkx fiberlamp boxfit interaggregate \
+                 celtic \
                  @JPEG_EXES@
 SEXES          = sonar
 JPEG_EXES      = webcollage-helper
                  @JPEG_EXES@
 SEXES          = sonar
 JPEG_EXES      = webcollage-helper
@@ -176,7 +177,7 @@ XDBE_OBJS   = $(UTILS_BIN)/xdbe.o
 HDRS           = bubbles.h screenhack.h xlockmore.h xlockmoreI.h automata.h \
                  bumps.h xpm-pixmap.h apple2.h analogtv.h \
                  pacman.h pacman_ai.h pacman_level.h
 HDRS           = bubbles.h screenhack.h xlockmore.h xlockmoreI.h automata.h \
                  bumps.h xpm-pixmap.h apple2.h analogtv.h \
                  pacman.h pacman_ai.h pacman_level.h
-MEN            = anemone.man ant.man apollonian.man attraction.man \
+MEN            = anemone.man apollonian.man attraction.man \
                  blaster.man blitspin.man bouboule.man braid.man bsod.man \
                  bubbles.man bumps.man ccurve.man compass.man coral.man \
                  critical.man crystal.man cynosure.man decayscreen.man \
                  blaster.man blitspin.man bouboule.man braid.man bsod.man \
                  bubbles.man bumps.man ccurve.man compass.man coral.man \
                  critical.man crystal.man cynosure.man decayscreen.man \
@@ -206,7 +207,7 @@ MEN         = anemone.man ant.man apollonian.man attraction.man \
                  wormhole.man mismunch.man pacman.man fuzzyflakes.man \
                  anemotaxis.man memscroller.man substrate.man \
                  intermomentary.man fireworkx.man fiberlamp.man boxfit.man \
                  wormhole.man mismunch.man pacman.man fuzzyflakes.man \
                  anemotaxis.man memscroller.man substrate.man \
                  intermomentary.man fireworkx.man fiberlamp.man boxfit.man \
-                 interaggregate.man
+                 interaggregate.man celtic.man
 STAR           = *
 EXTRAS         = README Makefile.in xlock_23.h xml2man.pl .gdbinit \
                  euler2d.tex \
 STAR           = *
 EXTRAS         = README Makefile.in xlock_23.h xml2man.pl .gdbinit \
                  euler2d.tex \
@@ -842,6 +843,9 @@ boxfit:             boxfit.o        $(HACK_OBJS) $(COL) $(GRAB)
 ifs:           ifs.o           $(HACK_OBJS) $(COL)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
 
 ifs:           ifs.o           $(HACK_OBJS) $(COL)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
 
+celtic:                celtic.o        $(HACK_OBJS) $(COL) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
 
 # The rules for those hacks which follow the `xlockmore' API.
 #
 
 # The rules for those hacks which follow the `xlockmore' API.
 #
@@ -1086,6 +1090,8 @@ bumps.o: ../config.h
 bumps.o: $(srcdir)/screenhack.h
 ccurve.o: ../config.h
 ccurve.o: $(srcdir)/screenhack.h
 bumps.o: $(srcdir)/screenhack.h
 ccurve.o: ../config.h
 ccurve.o: $(srcdir)/screenhack.h
+celtic.o: ../config.h
+celtic.o: $(srcdir)/screenhack.h
 cloudlife.o: ../config.h
 cloudlife.o: $(srcdir)/screenhack.h
 compass.o: ../config.h
 cloudlife.o: ../config.h
 cloudlife.o: $(srcdir)/screenhack.h
 compass.o: ../config.h
diff --git a/hacks/ant.man b/hacks/ant.man
deleted file mode 100644 (file)
index ed25576..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-ant - cellular automaton.
-.SH SYNOPSIS
-.B ant
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-install]
-[\-noinstall]
-[\-root]
-[\-eyes]
-[\-no-eyes]
-[\-truchet]
-[\-no-truchet]
-[\-sharpturn]
-[\-no-sharpturn]
-[\-delay \fInumber\fP]
-[\-cycles \fInumber\fP]
-[\-count \fInumber\fP]
-[\-size \fInumber\fP]
-[\-neighbors 3]
-[\-neighbors 4]
-[\-neighbors 6]
-[\-neighbors 9]
-[\-neighbors 12]
-[\-ncolors \fInumber\fP]
-.SH DESCRIPTION
-A cellular automaton that is really a two-dimensional Turing machine: as
-the heads ("ants") walk along the screen, they change pixel values in
-their path. Then, as they pass over changed pixels, their behavior is
-influenced.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-sharpturns | \-no-sharpturns
-Whether to do sharp turns.
-.TP 8
-.B \-truchet | \-no-truchet
-Whether to use truchet lines.
-.TP 8
-.B \-eyes | \-no-eyes
-Whether to draw eyes on the ants.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds.  Default: 1000 (0.0001 seconds.).
-.TP 8
-.B \-cycles \fInumber\fP
-How long to wait until resetting.  0 - 800000.  Default: 40000.
-.TP 8
-.B \-count \fInumber\fP
-Ants Count.  -20 - 20. Default: -3.
-.TP 8
-.B \-size \fInumber\fP
-Ant Size.  -18 - 18.  Default: -12.
-.TP 8
-.B \-neighbors \fIN\fP
-How many neighbors each cell has.  Legal values are 3, 4, 6, 9, and 12.
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of colors.  Default: 64.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by David Bagley.  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.
-.SH AUTHOR
-David Bagley.
index 12fe95f3db0553e07b8a9d24e72da3bf26b6a93f..3beeeeea62142ea7b9db5f59b755e494540999d6 100644 (file)
@@ -1507,17 +1507,17 @@ struct basic_controller_data {
  */
 static char *moire_program[]={
   "10 HGR2\n",
  */
 static char *moire_program[]={
   "10 HGR2\n",
-  "20 FOR Y = 0 TO 191 STEP 2\n",
+  "20 FOR Y = 0 TO 190 STEP 2\n",
   "30 HCOLOR=4 : REM BLACK\n",
   "30 HCOLOR=4 : REM BLACK\n",
-  "40 HLINE 0,191-Y TO 279,Y\n",
+  "40 HPLOT 0,191-Y TO 279,Y\n",
   "60 HCOLOR=7 : REM WHITE\n",
   "60 HCOLOR=7 : REM WHITE\n",
-  "80 HLINE 0,190-Y TO 279,Y+1\n",
+  "80 HPLOT 0,190-Y TO 279,Y+1\n",
   "90 NEXT Y\n",
   "90 NEXT Y\n",
-  "100 FOR X = 0 TO 279 STEP 3\n",
+  "100 FOR X = 0 TO 278 STEP 3\n",
   "110 HCOLOR=4\n",
   "110 HCOLOR=4\n",
-  "120 HLINE 279-X,0 TO X,192\n",
+  "120 HPLOT 279-X,0 TO X,191\n",
   "140 HCOLOR=7\n",
   "140 HCOLOR=7\n",
-  "150 HLINE 278-X,0 TO X+1,192\n",
+  "150 HPLOT 278-X,0 TO X+1,191\n",
   "160 NEXT X\n",
   NULL
 };
   "160 NEXT X\n",
   NULL
 };
@@ -1527,9 +1527,9 @@ static char *sinewave_program[] = {
   "25 K=0\n",
   "30 FOR X = 0 TO 279\n",
   "32 HCOLOR= 0\n",
   "25 K=0\n",
   "30 FOR X = 0 TO 279\n",
   "32 HCOLOR= 0\n",
-  "35 HLINE X,0 TO X,159\n",
+  "35 HPLOT X,0 TO X,159\n",
   "38 HCOLOR= 3\n",
   "38 HCOLOR= 3\n",
-  "40 Y = 80 + SIN(15*(X-K)/279)\n",
+  "40 Y = 80 + SIN(15*(X-K)/279) * 40\n",
   "50 HPLOT X,Y\n",
   "60 NEXT X\n",
   "70 K=K+4\n",
   "50 HPLOT X,Y\n",
   "60 NEXT X\n",
   "70 K=K+4\n",
@@ -1551,13 +1551,13 @@ static char *random_lores_program[]={
   "100 COLOR= RND(1)*16\n",
 
   "110 X=RND(1)*40\n",
   "100 COLOR= RND(1)*16\n",
 
   "110 X=RND(1)*40\n",
-  "120 Y1=RND(1)*48\n",
-  "130 Y2=RND(1)*48\n",
+  "120 Y1=RND(1)*40\n",
+  "130 Y2=RND(1)*40\n",
   "140 FOR Y = Y1 TO Y2\n",
   "150 PLOT X,Y\n",
   "160 NEXT Y\n",
 
   "140 FOR Y = Y1 TO Y2\n",
   "150 PLOT X,Y\n",
   "160 NEXT Y\n",
 
-  "210 Y=RND(1)*48\n",
+  "210 Y=RND(1)*40\n",
   "220 X1=RND(1)*40\n",
   "230 X2=RND(1)*40\n",
   "240 FOR X = X1 TO X2\n",
   "220 X1=RND(1)*40\n",
   "230 X2=RND(1)*40\n",
   "240 FOR X = X1 TO X2\n",
diff --git a/hacks/celtic.c b/hacks/celtic.c
new file mode 100644 (file)
index 0000000..deb3f33
--- /dev/null
@@ -0,0 +1,1032 @@
+/* celtic, Copyright (c) 2005 Max Froumentin <max@lapin-bleu.net>
+ *
+ * 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.
+ */
+
+#include <math.h>
+#include <assert.h>
+#include "screenhack.h"
+#include "erase.h"
+
+#define SQRT3_2 .86602540378443864676
+
+/*-----------------------------------------*/
+Display *dpy;
+Window window;
+int ncolors;
+XColor *colors;
+GC gc,shadow_gc,gc_graph;
+
+struct params {
+  unsigned long curve_width, shadow_width;
+  double shape1, shape2;
+  unsigned long margin;
+
+  enum graph_type { polar, grid, kennicott, triangle } type;
+  unsigned long edge_size;
+  unsigned long cluster_size; /* only used if type is kennicott */
+  unsigned long delay;        /* controls curve drawing speed (step delay 
+                              * in microsecs) */
+  unsigned long nb_orbits;          /* only used if type is polar */
+  unsigned long nb_nodes_per_orbit; /* only used if type is polar */
+
+  double angle; /* angle of rotation of the graph around the centre */
+} params;
+
+
+/*-----------------------------------------*/
+typedef enum direction {
+  CLOCKWISE=0, ANTICLOCKWISE=1
+} Direction;
+
+
+/*-----------------------------------------*/
+typedef struct array {
+  int nb_elements;
+  int nb_allocated_elements;
+  int increment;
+  void **elements;
+} *Array;
+
+static Array array_new(int increment)
+{
+  Array new;
+  assert(new=(Array)calloc(1,sizeof(struct array)));
+  new->nb_elements=0;
+  new->nb_allocated_elements=0;
+  new->increment=increment;
+  return new;
+}
+
+static void array_del(Array a, void (*free_element)(void*))
+{
+  int i;
+  if (free_element) 
+    for (i=0;i<a->nb_elements;i++) 
+      free_element(a->elements[i]);
+  free(a->elements);
+  free(a);
+}
+
+static void array_add_element(Array a, void *element)
+{
+  if (a->nb_elements == a->nb_allocated_elements) {
+    /* we must allocate more */
+    a->nb_allocated_elements+=a->increment;
+    a->elements=realloc(a->elements,a->nb_allocated_elements*sizeof(void *));
+  }
+  a->elements[a->nb_elements++]=element;
+}
+/*-----------------------------------------*/
+
+typedef struct node {
+  double x,y;
+  Array edges;
+} *Node;
+
+typedef struct edge {
+  Node node1, node2;
+  double angle1, angle2;
+} *Edge;
+
+/*-----------------------------------------*/
+/* Node functions */
+
+static Node node_new(double x, double y)
+{
+  Node new;
+  assert(new = (Node)calloc(1,sizeof(struct node)));
+  new->x=x;
+  new->y=y;
+  new->edges = array_new(10);
+  return new;
+}
+
+static void node_del(void *n) 
+{ /* not Node * because the function is passed to array_del */
+  array_del(((Node)n)->edges,NULL);
+  free(n);
+}
+
+#if 0
+static void node_to_s(Node n, FILE *f) 
+{
+  fprintf(f,"Node: %g %g\n",n->x,n->y);
+}
+#endif
+
+static void node_draw(Node n)
+{
+  XDrawArc(dpy,window,gc_graph,(int)rint(n->x)-5,(int)rint(n->y)-5,10,10,0,360*64);
+}
+  
+static void node_add_edge(Node n, Edge e)
+{
+  array_add_element(n->edges,e);
+}
+
+
+/*-----------------------------------------*/
+/* Edge functions */
+
+static Edge edge_new(Node n1, Node n2)
+{
+  Edge new; 
+  assert(new = (Edge)calloc(1,sizeof(struct edge)));
+  new->node1=n1;
+  new->node2=n2;
+  new->angle1=atan2(new->node2->y - new->node1->y, new->node2->x - new->node1->x);
+  if (new->angle1 < 0) new->angle1+=6.28;
+
+  new->angle2=atan2(new->node1->y - new->node2->y, new->node1->x - new->node2->x);
+  if (new->angle2 < 0) new->angle2+=6.28;
+  return new;
+}
+
+static void edge_del(void *e) /* not Edge * because the function is passed to array_del */
+{
+  free(e);
+}
+
+#if 0
+static void edge_to_s(Edge e, FILE *f)
+{
+  fprintf(f,"Edge: (%g, %g), (%g, %g) angles: %g, %g\n",
+         e->node1->x, e->node1->y, e->node2->x, e->node2->y,
+         e->angle1, e->angle2);
+}
+#endif
+
+static void edge_draw(Edge e)
+{
+  XDrawLine(dpy,window,gc_graph, e->node1->x, e->node1->y, e->node2->x, e->node2->y);
+}
+
+static double edge_angle(Edge e, Node n)
+{
+  /* returns the angle of the edge at Node n */
+  assert(n==e->node1 || n==e->node2);
+  if (n==e->node1) return e->angle1; else return e->angle2;
+}
+
+static Node edge_other_node(Edge e, Node n)
+{
+  assert(n==e->node1 || n==e->node2);
+  if (n==e->node1) return e->node2; else return e->node1;
+}
+
+static double edge_angle_to(Edge e, Edge e2, Node node, Direction direction)
+{
+  /* returns the absolute angle from this edge to "edge2" around
+     "node" following "direction" */
+  double a;
+
+  if (direction==CLOCKWISE)
+    a=edge_angle(e,node) - edge_angle(e2,node);
+  else
+    a=edge_angle(e2,node) - edge_angle(e,node);
+
+  if (a<0) return a+2*M_PI; else return a;
+}
+
+/*-----------------------------------------*/
+
+typedef struct graph {
+  Array nodes;
+  Array edges;
+} *Graph;
+
+static Graph graph_new(void)
+{
+  Graph new;
+  assert(new = (Graph)calloc(1,sizeof(struct graph)));
+  new->nodes = array_new(100);
+  new->edges = array_new(100);
+  return new;
+}
+
+static void graph_del(Graph g)
+{
+  array_del(g->nodes, &node_del);
+  array_del(g->edges, &edge_del);
+  free(g);
+}
+
+
+static void graph_add_node(Graph g, Node n)
+{
+  array_add_element(g->nodes, n);
+}
+
+static void graph_add_edge(Graph g, Edge e)
+{
+  array_add_element(g->edges, e);
+  
+  /* for each node n of e, add n to pointer e */
+  node_add_edge(e->node1, e);
+  node_add_edge(e->node2, e);
+}
+
+static Edge graph_next_edge_around(Graph g, Node n, Edge e, Direction direction)
+{
+  /* return the next edge after e around node n clockwise */
+  double angle, minangle=20;
+  Edge next_edge = e, edge;
+  int i;
+
+  for (i=0;i<n->edges->nb_elements;i++) {
+    edge=n->edges->elements[i];
+    if (edge != e) {
+      angle = edge_angle_to(e,edge,n,direction);
+      if (angle < minangle) {
+       next_edge=edge;
+       minangle=angle;
+      }
+    }
+  }
+  return next_edge;
+}
+  
+#if 0
+static void graph_to_s(Graph g, FILE *f)
+{
+  int i;
+  for (i=0;i<g->nodes->nb_elements;i++) 
+    node_to_s(g->nodes->elements[i],f);
+  for (i=0;i<g->edges->nb_elements;i++)
+    edge_to_s(g->edges->elements[i],f);
+}
+#endif
+
+static void graph_draw(Graph g)
+{
+  int i;
+  
+  for (i=0;i<g->nodes->nb_elements;i++) 
+    node_draw(g->nodes->elements[i]);
+  for (i=0;i<g->edges->nb_elements;i++)
+    edge_draw(g->edges->elements[i]);
+  XSync(dpy,False);
+}
+
+static void graph_rotate(Graph g, double angle, int cx, int cy)
+{
+  /* rotate all the nodes of the graph around the centre */
+  int i; 
+  float c=cos(angle),s=sin(angle),x,y;
+  Node n;
+  for (i=0;i<g->nodes->nb_elements;i++) {
+    n=g->nodes->elements[i];
+    x=n->x; y=n->y;
+    n->x = (x-cx)*c-(y-cy)*s + cx;
+    n->y = (x-cx)*s+(y-cy)*c + cy;
+  }
+}
+
+
+/*---------------------------*/
+
+static Graph make_polar_graph(int xmin, int ymin, int width, int height, 
+                      int nbp, /* number of points on each orbit */
+                      int nbo /* number of orbits */)
+     /* make a simple grid graph, with edges present or absent randomly */
+{
+  int cx = width/2+xmin, cy=height/2+ymin; /* centre */
+  int os = (width<height?width:height)/(2*nbo); /* orbit height */
+  Graph g;
+  Node *grid;
+  int o,p;
+
+  /* generate nodes */
+  assert(grid=(Node*)calloc(1+nbp*nbo,sizeof(Node)));
+  assert(g=graph_new());
+  
+  graph_add_node(g, grid[0]=node_new((double)cx,(double)cy));
+
+  for (o=0;o<nbo;o++)
+    for (p=0;p<nbp;p++)
+      graph_add_node(g,
+                    grid[1+o*nbp+p]=node_new(cx+(o+1)*os*sin(p*2*M_PI/nbp), 
+                                             cy+(o+1)*os*cos(p*2*M_PI/nbp)));
+
+
+  /* generate edges */
+  for (o=0;o<nbo;o++)
+    for (p=0;p<nbp;p++) {
+      if (o==0) /* link first orbit nodes with centre */
+       graph_add_edge(g,edge_new(grid[1+o*nbp+p],grid[0]));
+      else /* liink orbit nodes with lower orbit */
+       graph_add_edge(g,edge_new(grid[1+o*nbp+p],grid[1+(o-1)*nbp+p]));
+      /* link along orbit */
+      graph_add_edge(g,edge_new(grid[1+o*nbp+p],
+                               grid[1+o*nbp+(p+1)%nbp]));
+    }
+
+  free(grid);
+  return g;
+}
+
+
+static Graph make_grid_graph(int xmin, int ymin, int width, int height, int step)
+     /* make a simple grid graph */
+{
+  Graph g;
+  int row,col,x,y;
+  int size=(width<height?height:width);
+
+  /* empirically, it seems there are 2 curves only if both
+     nbcol and nbrow are even, so we round them to even */
+  int nbcol=(2+size/step)/2*2, nbrow=(2+size/step)/2*2;
+
+  Node *grid;
+  assert(grid=(Node*)calloc(nbrow*nbcol,sizeof(Node)));
+  assert(g=graph_new());
+
+
+  /* adjust xmin and xmax so that the grid is centered */
+  xmin+=(width-(nbcol-1)*step)/2; 
+  ymin+=(height-(nbrow-1)*step)/2;
+
+  /* create node grid */
+  for (row=0;row<nbrow;row++)
+    for (col=0;col<nbcol;col++) {
+      x=col*step+xmin;
+      y=row*step+ymin;
+      grid[row+col*nbrow]=node_new((double)x, (double)y);
+      graph_add_node(g, grid[row+col*nbrow]);
+    }
+
+  /* create edges */
+  for (row=0;row<nbrow;row++)
+    for (col=0;col<nbcol;col++) {
+      if (col!=nbcol-1)
+       graph_add_edge(g,edge_new(grid[row+col*nbrow],
+                                 grid[row+(col+1)*nbrow]));
+      if (row!=nbrow-1)
+       graph_add_edge(g,edge_new(grid[row+col*nbrow],grid[row+1+col*nbrow]));
+      if (col!=nbcol-1 && row!=nbrow-1) {
+         graph_add_edge(g,edge_new(grid[row+col*nbrow],
+                                   grid[row+1+(col+1)*nbrow]));
+         graph_add_edge(g,edge_new(grid[row+1+col*nbrow],
+                                   grid[row+(col+1)*nbrow]));
+      }
+    }
+
+  free(grid);
+  
+  return g;
+}
+
+
+
+static Graph make_triangle_graph(int xmin, int ymin, int width, int height, int step)
+     /* make a simple grid graph */
+{
+  Graph g;
+  int row,col,x,y;
+  int size=width<height?width:height;
+  int n=1+size/SQRT3_2/step;
+  Node *grid;
+
+  assert(grid=(Node*)calloc(n*n,sizeof(Node)));
+  assert(g=graph_new());
+
+  /* adjust xmin and xmax so that the grid is centered */
+  xmin+=(width-(n-1)*step)/2; 
+  ymin+=(height-SQRT3_2*(n-3)*step)/2;
+
+  /* create node grid */
+  for (row=0;row<n;row++)
+    for (col=0;col<n;col++) 
+      if (row+col<n) {
+       x=col*step+xmin + row*step/2;
+       y=SQRT3_2*row*step+ymin;
+       grid[row+col*n]=node_new((double)x, (double)y);
+       graph_add_node(g, grid[row+col*n]);
+      }
+
+  /* create edges */
+  for (row=0;row<n;row++)
+    for (col=0;col<n;col++)
+       if (row+col<n-1) { 
+         /* horizontal edges */
+         graph_add_edge(g,edge_new(grid[row+col*n],grid[row+(col+1)*n]));
+         /* vertical edges */
+         graph_add_edge(g,edge_new(grid[row+col*n],grid[row+1+col*n]));
+         /* diagonal edges */
+         graph_add_edge(g,edge_new(grid[row+1+col*n],grid[row+(col+1)*n]));
+      }
+
+  free(grid);
+  return g;
+}
+
+
+static Graph make_kennicott_graph(int xmin, int ymin, int width, int height, int step,
+                          int cluster_size)
+     /* make a graph inspired by one of the motifs from the Kennicott bible */
+     /* square grid of clusters of the shape  /|\
+      *                                       ---
+      *                                       \|/
+      * cluster_size is the length of an edge of a cluster
+      */
+{
+  Graph g;
+  int row,col,x,y;
+  int size=width<height?height:width;
+  int nbcol=(1+size/step)/2*2, nbrow=(1+size/step)/2*2;
+  Node *grid;
+
+  /* there are 5 nodes by for each cluster */
+  assert(grid=(Node*)calloc(5*nbrow*nbcol,sizeof(Node)));
+  assert(g=graph_new());
+
+  /* adjust xmin and xmax so that the grid is centered */
+  xmin+=(width-(nbcol-1)*step)/2; 
+  ymin+=(height-(nbrow-1)*step)/2;
+
+  /* create node grid */
+  for (row=0;row<nbrow;row++)
+    for (col=0;col<nbcol;col++) {
+      int ci=5*(row+col*nbrow);
+      x=col*step+xmin;
+      y=row*step+ymin;
+
+      /* create a cluster centred on x,y */
+      grid[ci  ]=node_new((double)x, (double)y);
+      grid[ci+1]=node_new((double)(x+cluster_size), (double)y);
+      grid[ci+2]=node_new((double)x, (double)(y-cluster_size));
+      grid[ci+3]=node_new((double)(x-cluster_size), (double)y);
+      grid[ci+4]=node_new((double)x, (double)(y+cluster_size));
+
+      graph_add_node(g, grid[ci]);
+      graph_add_node(g, grid[ci+1]);
+      graph_add_node(g, grid[ci+2]);
+      graph_add_node(g, grid[ci+3]);
+      graph_add_node(g, grid[ci+4]);
+
+      /* internal edges */
+      graph_add_edge(g,edge_new(grid[ci], grid[ci+1]));      
+      graph_add_edge(g,edge_new(grid[ci], grid[ci+2]));
+      graph_add_edge(g,edge_new(grid[ci], grid[ci+3]));
+      graph_add_edge(g,edge_new(grid[ci], grid[ci+4]));
+      graph_add_edge(g,edge_new(grid[ci+1], grid[ci+2]));      
+      graph_add_edge(g,edge_new(grid[ci+2], grid[ci+3]));
+      graph_add_edge(g,edge_new(grid[ci+3], grid[ci+4]));
+      graph_add_edge(g,edge_new(grid[ci+4], grid[ci+1]));
+
+    }
+
+  /* create inter-cluster edges */
+  for (row=0;row<nbrow;row++)
+    for (col=0;col<nbcol;col++) {
+      if (col!=nbcol-1)
+       /* horizontal edge from edge 1 of cluster (row, col) to edge 3
+        * of cluster (row,col+1) */
+       graph_add_edge(g,edge_new(grid[5*(row+col*nbrow)+1],grid[5*(row+(col+1)*nbrow)+3]));
+      if (row!=nbrow-1)
+       /* vertical edge from edge 4 of cluster (row, col) to edge 2
+        * of cluster (row+1,col) */
+       graph_add_edge(g,edge_new(grid[5*(row+col*nbrow)+4],
+                                 grid[5*(row+1+col*nbrow)+2]));
+    }
+  free(grid);
+  return g;
+}
+
+/*---------------------------*/
+typedef struct spline_segment {
+  double x1,y1,x2,y2,x3,y3,x4,y4;
+} *SplineSegment;
+
+typedef struct spline {
+  Array segments; /* array of SplineSegment */
+  int color;
+} *Spline;
+
+static Spline spline_new(int color)
+{
+  Spline new=(Spline)calloc(1,sizeof(struct spline));
+  new->segments=array_new(30);
+  new->color=color;
+  return new;
+}
+
+static void spline_del(void *s)
+{
+  array_del(((Spline)s)->segments,&free);
+  free(s);
+}
+
+static void spline_add_segment(Spline s,
+                       double x1, double y1, double x2, double y2, 
+                       double x3, double y3, double x4, double y4)
+{
+  SplineSegment ss=(SplineSegment)calloc(1,sizeof(struct spline_segment));
+  ss->x1=x1;  ss->x2=x2;  ss->x3=x3;  ss->x4=x4;
+  ss->y1=y1;  ss->y2=y2;  ss->y3=y3;  ss->y4=y4;
+  array_add_element(s->segments,ss);
+}
+
+#if 0
+static void spline_to_s(Spline s, FILE *f)
+{
+  int i;
+  SplineSegment ss;
+  fprintf(f,"Spline: \n");
+  for (i=0;i<s->segments->nb_elements;i++) {
+    ss=s->segments->elements[i];
+    fprintf(f," - segment %d: (%g, %g),(%g, %g),(%g, %g),(%g, %g)\n",
+           i,ss->x1,ss->y1,ss->x2,ss->y2,ss->x3,ss->y3,ss->x4,ss->y4);
+  }
+}
+#endif
+
+static void spline_value_at(Spline s, double *x, double *y, double t, int *segment)
+{
+  int si;
+  double tt;
+  SplineSegment ss;
+  si = floor(t*s->segments->nb_elements);
+  tt = t*s->segments->nb_elements - si;
+  assert(tt>=0 && tt<1);
+  ss=s->segments->elements[si];
+
+  *x = ss->x1*(1-tt)*(1-tt)*(1-tt)+3*ss->x2*tt*(1-tt)*(1-tt)+3*ss->x3*tt*tt*(1-tt)+ss->x4*tt*tt*tt;
+  *y = ss->y1*(1-tt)*(1-tt)*(1-tt)+3*ss->y2*tt*(1-tt)*(1-tt)+3*ss->y3*tt*tt*(1-tt)+ss->y4*tt*tt*tt;
+
+  *segment=si;
+}
+
+/*---------------------------*/
+typedef struct edge_couple {
+  int **array;
+  int size;
+} *EdgeCouple;
+
+static EdgeCouple edge_couple_new(int nb_edges) {
+  int i;
+  EdgeCouple new = (EdgeCouple)calloc(1,sizeof(struct edge_couple));
+  new->array = (int **)calloc(nb_edges, sizeof(int*));
+  new->size = nb_edges;
+
+  for (i=0;i<nb_edges;i++) {
+    new->array[i]=(int *)calloc(2,sizeof(int));
+    new->array[i][CLOCKWISE]=0;
+    new->array[i][ANTICLOCKWISE]=0;
+  }
+  return new;
+}
+
+static void edge_couple_del(EdgeCouple e)
+{
+  int i;
+  for (i=0;i<e->size;i++) free(e->array[i]);
+  free(e->array);
+  free(e);
+}
+    
+/*---------------------------*/
+
+typedef struct pattern {
+  double shape1, shape2;
+  EdgeCouple ec;
+  Graph graph;
+  Array splines;
+  int ncolors;
+} *Pattern;
+
+static Pattern pattern_new(Graph g, int ncolors, double shape1, double shape2)
+{
+  Pattern new;
+  assert(new=(Pattern)calloc(1,sizeof(struct pattern)));
+  new->shape1=shape1;
+  new->shape2=shape2;
+  new->graph=g;
+  new->ec=edge_couple_new(g->edges->nb_elements);
+  new->splines=array_new(10);
+  new->ncolors=ncolors;
+  return new;
+}
+
+static void pattern_del(Pattern p)
+{
+  edge_couple_del(p->ec);
+  array_del(p->splines,&spline_del);
+  free(p);
+}
+
+static void pattern_edge_couple_set(Pattern p, Edge e, Direction d, int value) 
+{
+  int i;
+  for (i=0;i<p->graph->edges->nb_elements;i++)
+    if (p->graph->edges->elements[i]==e) {
+      p->ec->array[i][d]=value;
+      return;
+    }
+}
+
+static void pattern_draw_spline_direction(Pattern p, Spline s,
+                                  Node node, Edge edge1, Edge edge2, 
+                                  Direction direction)
+{
+  double x1=(edge1->node1->x+edge1->node2->x)/2.0;
+  double y1=(edge1->node1->y+edge1->node2->y)/2.0;
+
+  /* P2 (x2,y2) is the middle point of edge1 */
+  double x4=(edge2->node1->x+edge2->node2->x)/2.0;
+  double y4=(edge2->node1->y+edge2->node2->y)/2.0;
+  
+  double alpha=edge_angle_to(edge1,edge2,node,direction)*p->shape1;
+  double beta=p->shape2;
+  
+  double i1x,i1y,i2x,i2y,x2,y2,x3,y3;
+  
+  if (direction == ANTICLOCKWISE) {
+    /* I1 must stick out to the left of NP1 and I2 to the right of NP4 */
+    i1x =  alpha*(node->y-y1)+x1;
+    i1y = -alpha*(node->x-x1)+y1;
+    i2x = -alpha*(node->y-y4)+x4;
+    i2y =  alpha*(node->x-x4)+y4;
+    x2 =  beta*(y1-i1y) + i1x;
+    y2 = -beta*(x1-i1x) + i1y;
+    x3 = -beta*(y4-i2y) + i2x;
+    y3 =  beta*(x4-i2x) + i2y;
+  }
+  else {
+    /* I1 must stick out to the left of NP1 and I2 to the right of NP4 */
+    i1x = -alpha*(node->y-y1)+x1;
+    i1y =  alpha*(node->x-x1)+y1;
+    i2x =  alpha*(node->y-y4)+x4;
+    i2y = -alpha*(node->x-x4)+y4;
+    x2 = -beta*(y1-i1y) + i1x;
+    y2 =  beta*(x1-i1x) + i1y;
+    x3 =  beta*(y4-i2y) + i2x;
+    y3 = -beta*(x4-i2x) + i2y;
+  }
+
+  spline_add_segment(s,x1,y1,x2,y2,x3,y3,x4,y4);
+}
+
+static int pattern_next_unfilled_couple(Pattern p, Edge *e, Direction *d)
+{
+  int i;
+  for (i=0;i<p->ec->size;i++) {
+    if (p->ec->array[i][CLOCKWISE]==0) {
+      *e=p->graph->edges->elements[i];
+      *d=CLOCKWISE;
+      return 1;
+    }
+    else if (p->ec->array[i][ANTICLOCKWISE]==0) {
+      *e=p->graph->edges->elements[i];
+      *d=ANTICLOCKWISE;
+      return 1;
+    }
+  }
+  return 0;
+}
+
+static void pattern_make_curves(Pattern p)
+{
+  int i;
+  Edge current_edge, first_edge, next_edge;
+  Node current_node, first_node;
+  Direction current_direction, first_direction;
+  Spline s;
+
+  i=0;
+  while (pattern_next_unfilled_couple(p, &first_edge, &first_direction)) {
+    /* start a new loop */
+    s=spline_new(random()%(p->ncolors-2)+2);
+    array_add_element(p->splines, s);
+
+    current_edge=first_edge;
+    current_node=first_node=current_edge->node1;
+    current_direction=first_direction;
+
+    do {
+      pattern_edge_couple_set(p, current_edge, current_direction, 1);
+      next_edge = graph_next_edge_around(p->graph,current_node,current_edge,current_direction);
+
+      /* add the spline segment to the spline */
+      pattern_draw_spline_direction(p,s,current_node,
+                                   current_edge,next_edge,current_direction);
+      
+      /* cross the edge */
+      current_edge = next_edge;
+      current_node = edge_other_node(next_edge, current_node);
+      current_direction=1-current_direction;
+
+    } while (current_node!=first_node || current_edge!=first_edge || current_direction!=first_direction);
+
+    if (s->segments->nb_elements==2) /* spline is just one point: remove it */
+      p->splines->elements[p->splines->nb_elements-1]=NULL;
+      
+  }
+}
+
+static void pattern_animate(Pattern p, unsigned long delay)
+{
+  double t,t2;
+  double x,y,x2,y2,x3,y3,x4,y4;
+  int i,segment,unused;
+  int ticks = 0;
+  double step=0.0001; /* TODO: set the step (or the delay) as a
+                       * function of the spline length, so that
+                       * drawing speed is constant
+                       */
+  Spline s;
+
+  XSetLineAttributes(dpy,gc,params.curve_width,LineSolid,CapRound,JoinRound);
+  XSetLineAttributes(dpy,shadow_gc,params.shadow_width,LineSolid,CapRound,JoinRound);
+
+  for (t=0.0;t<1;t+=step) {
+    for (i=0;i<p->splines->nb_elements;i++) 
+      if ((s=p->splines->elements[i])) { /* skip if one-point spline */
+       spline_value_at(s, &x, &y, fmod(t,1.0),&segment);
+       spline_value_at(s, &x2, &y2, fmod(t+step,1.0),&unused);
+       
+       /* look ahead for the shadow segment */
+       t2=t+step;
+       if (t2<=1.0) {
+         spline_value_at(s, &x3, &y3, fmod(t2,1.0),&unused);
+         while (t2+step<1.0 && (x3-x2)*(x3-x2)+(y3-y2)*(y3-y2) < params.shadow_width*params.shadow_width) {
+           t2+=step;
+           spline_value_at(s, &x3, &y3, fmod(t2,1.0),&unused);
+         }
+         
+         spline_value_at(s, &x4, &y4, fmod(t2+step,1.0),&unused);
+         
+         /* draw shadow line */
+         XDrawLine(dpy,window,shadow_gc, 
+                   (int)rint(x3),(int)rint(y3), 
+                   (int)rint(x4),(int)rint(y4));
+       } 
+       /* draw line segment */
+       if (p->splines->nb_elements==1)
+         XSetForeground(dpy, gc, colors[segment%(ncolors-3)+2].pixel);
+       else
+         XSetForeground(dpy, gc, colors[s->color].pixel);
+       XDrawLine(dpy,window,gc,
+                 (int)rint(x),(int)rint(y),
+                 (int)rint(x2),(int)rint(y2));
+      }
+
+    if (++ticks > 100) {
+      XSync(dpy,False);
+      usleep(delay);
+      screenhack_handle_events (dpy);
+      ticks = 0;
+    }
+  }
+
+  /* at the end we redraw back to remove shadow spillage */
+  for (i=0;i<p->splines->nb_elements;i++) {
+    if ((s=p->splines->elements[i])) {
+      double offset=step;
+      XSetForeground(dpy, gc, colors[s->color].pixel);
+      spline_value_at(s, &x, &y, fmod(t,1.0),&unused);
+      
+      spline_value_at(s, &x2, &y2, fmod(t-offset,1.0),&unused);
+      
+      while ((x2-x)*(x2-x)+(y2-y)*(y2-y) < params.shadow_width*params.shadow_width) {
+       offset+=step;
+       spline_value_at(s, &x2, &y2, fmod(t-offset,1.0),&unused);
+      }
+      
+      XDrawLine(dpy,window,gc, (int)rint(x),(int)rint(y), (int)rint(x2),(int)rint(y2));
+    }
+  }
+  XSync(dpy,False);
+}
+
+/*======================================================================*/
+
+char *progclass = "Celtic";
+
+char *defaults[] = {
+    ".background: black",
+    ".foreground: grey20",
+    "*ncolors: 20",
+    "*delay: 10000",
+    "*delay2: 5",
+    "*showGraph: False",
+    0
+};
+
+XrmOptionDescRec options[] = {
+    {"-background", ".background", XrmoptionSepArg, 0},
+    {"-foreground", ".foreground", XrmoptionSepArg, 0},
+    {"-ncolors", ".ncolors", XrmoptionSepArg, 0},
+    {"-delay", ".delay", XrmoptionSepArg, 0},
+    {"-delay2", ".delay2", XrmoptionSepArg, 0},
+    {"-graph", ".showGraph", XrmoptionNoArg, "True"},
+    {0, 0, 0, 0}
+};
+
+#if 0
+static void params_to_s(FILE *f)
+{
+  switch (params.type) {
+  case polar: fprintf(f,"type: polar\n"); 
+    fprintf(f,"nb_orbits: %ld\n",params.nb_orbits);
+    fprintf(f,"nb_nodes_per_orbit: %ld\n",params.nb_nodes_per_orbit);
+    break;
+  case grid: fprintf(f,"type: grid\n"); 
+    fprintf(f,"edge_size: %ld\n",params.edge_size);
+    break;
+  case triangle: fprintf(f,"type: triangle\n"); 
+    fprintf(f,"edge_size: %ld\n",params.edge_size);
+    break;
+  case kennicott: 
+    fprintf(f,"type: kennicott\n"); 
+    fprintf(f,"edge_size: %ld\n",params.edge_size);
+    fprintf(f,"cluster_size: %ld\n",params.cluster_size);
+    break;
+  }
+
+  fprintf(f,"curve width: %ld\n",params.curve_width);
+  fprintf(f,"shadow width: %ld\n",params.shadow_width);
+  fprintf(f,"shape1: %g\n",params.shape1);
+  fprintf(f,"shape2: %g\n",params.shape2);
+  fprintf(f,"margin: %ld\n",params.margin);
+  fprintf(f,"angle: %g\n",params.angle);
+  fprintf(f,"delay: %ld\n",params.delay);
+}
+#endif
+
+void screenhack(Display * d, Window w)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  Bool showGraph=get_boolean_resource ("showGraph", "Boolean");
+  Pattern p;
+  Graph g;
+
+  dpy=d; window=w;
+  ncolors = get_integer_resource ("ncolors", "Integer");
+
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  assert(colors = (XColor *) calloc (ncolors,sizeof(XColor)));
+
+  if (get_boolean_resource("mono", "Boolean"))
+    {
+    MONO:
+      ncolors = 1;
+      colors[0].pixel = get_pixel_resource("foreground", "Foreground",
+                                           dpy, xgwa.colormap);
+    }
+  else
+    {
+#if 0
+      make_random_colormap (dpy, xgwa.visual, xgwa.colormap,
+                            colors, &ncolors, True, True, 0, True);
+#else
+      make_smooth_colormap (dpy, xgwa.visual, xgwa.colormap,
+                            colors, &ncolors, True, 0, True);
+#endif
+      if (ncolors < 2)
+        goto MONO;
+      else {
+       colors[0].pixel = get_pixel_resource("foreground", "Foreground",
+                                            dpy, xgwa.colormap);
+       colors[1].pixel = get_pixel_resource("background", "Background",
+                                            dpy, xgwa.colormap);
+      }
+    }
+  
+  
+  /* graphic context for curves */
+  gcv.foreground = colors[0].pixel;
+  gcv.background = colors[1].pixel;
+  gcv.line_width = params.curve_width;
+  gcv.cap_style=CapRound;
+  gc = XCreateGC (dpy, window, GCForeground|GCBackground|GCLineWidth|GCCapStyle, &gcv);
+  
+  /* graphic context for graphs */
+  gcv.foreground = colors[0].pixel;
+  gcv.background = colors[1].pixel;
+  gc_graph = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv);
+  
+  /* graphic context for shadows */
+  gcv.foreground = colors[1].pixel;
+  gcv.line_width = params.shadow_width;
+  gcv.cap_style=CapRound;
+  shadow_gc = XCreateGC(dpy, window, GCForeground|GCLineWidth|GCCapStyle, &gcv);
+  
+  /*=======================================================*/
+
+  for (;;) {
+
+    params.curve_width=random()%5+4;
+    params.shadow_width=params.curve_width+4;
+    params.shape1=(random()%20)/10.0 -1.0;
+    params.shape2=(random()%20)/10.0 -1.0;
+    params.edge_size=10*(random()%5)+20;
+    params.delay=get_integer_resource("delay", "Delay");
+    params.angle=random()%360*2*M_PI/360;
+    
+    switch (random()%4) {
+    case 0:
+      params.type=grid;
+      params.margin=(random()%30)*10;
+      break;
+    case 1:
+      params.type=kennicott;
+      params.edge_size=10*(random()%3)+50;
+      params.cluster_size=params.edge_size/(2+random()%3)-1;
+      params.margin=(random()%30)*10;
+      break;
+    case 2:
+      params.type=triangle;
+      params.margin=(random()%10)*10;
+      break;
+    case 3:
+      params.type=polar;
+      params.nb_orbits=2+random()%20;
+      params.nb_nodes_per_orbit=4+random()%20;
+      params.margin=(random()%10)*20-50;
+      break;
+    }
+    
+/*     params_to_s(stdout); */
+    
+    /*=======================================================*/
+    
+    
+    switch (params.type) {
+    case grid:
+      g=make_grid_graph(params.margin,params.margin,
+                       xgwa.width-2*params.margin, 
+                       xgwa.height-2*params.margin, 
+                       params.edge_size);
+      break;
+    case kennicott:
+      g=make_kennicott_graph(params.margin,params.margin,
+                            xgwa.width-2*params.margin, 
+                            xgwa.height-2*params.margin, 
+                            params.edge_size,
+                            params.cluster_size);
+      break;
+    case triangle:
+      g=make_triangle_graph(params.margin,params.margin,
+                           xgwa.width-2*params.margin, 
+                           xgwa.height-2*params.margin, 
+                           params.edge_size);
+      break;
+    case polar:
+      g=make_polar_graph(params.margin,params.margin,
+                        xgwa.width-2*params.margin, 
+                        xgwa.height-2*params.margin, 
+                        params.nb_nodes_per_orbit, 
+                        params.nb_orbits);
+      break;
+    default:
+      g=make_grid_graph(params.margin,params.margin,
+                       xgwa.width-2*params.margin, 
+                       xgwa.height-2*params.margin, 
+                       params.edge_size);
+      break;
+    }
+
+    graph_rotate(g,params.angle,xgwa.width/2,xgwa.height/2);
+    
+    if (showGraph)
+      graph_draw(g);
+    
+    p=pattern_new(g,ncolors, params.shape1, params.shape2);
+    pattern_make_curves(p);
+    pattern_animate(p,params.delay);
+    
+    {
+      int d2 = get_integer_resource("delay2", "Delay2");
+      int i;
+      for (i = 0; i < d2; i++) {
+        XSync (dpy, False);
+        screenhack_handle_events (dpy);
+        sleep(1);
+      }
+    }
+
+    pattern_del(p);
+    graph_del(g);
+
+   erase_full_window(dpy,window);
+
+   /* recolor each time */
+   {
+     int ncolors = get_integer_resource ("ncolors", "Integer");
+     if (ncolors > 2)
+       make_smooth_colormap (dpy, xgwa.visual, xgwa.colormap,
+                             colors, &ncolors, True, 0, True);
+   }
+
+  }
+}
diff --git a/hacks/celtic.man b/hacks/celtic.man
new file mode 100644 (file)
index 0000000..7f564fa
--- /dev/null
@@ -0,0 +1,60 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+celtic - draws celtic cross-stich patterns
+.SH SYNOPSIS
+.B ifs
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-delay2 \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-graph \fImode\fP]
+.SH DESCRIPTION
+The \fIceltic\fP program repeatedly draws random cross-stitch patterns.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 10000.
+.TP 8
+.B \-delay2 \fInumber\fP
+Delay between patterns, in seconds.  Default: 5.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colours to use. Default: 20.
+.TP 8
+.B \-graph
+Whether to render the underlying graph.  Default: no.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Max Froumentin.  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.
+.SH AUTHOR
+Max Froumentin <max@lapin-bleu.net>
index 5c9cdb2ee4b6712e471b093a7b008511fae80a94..87ed98677cb16a3c12c19a5d05b1c4b0a7d19c1d 100644 (file)
@@ -17,6 +17,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUMPS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CCURVE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUMPS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CCURVE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CELTIC.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CLOUDLIFE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CLOUDLIFE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C
index 5c9cdb2ee4b6712e471b093a7b008511fae80a94..87ed98677cb16a3c12c19a5d05b1c4b0a7d19c1d 100644 (file)
@@ -17,6 +17,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUMPS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CCURVE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUMPS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CCURVE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CELTIC.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CLOUDLIFE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CLOUDLIFE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C
index ce3626ffec88bd96afb12234e90182dd367fa6b9..955f5c1a35e0ca51f1373315fbdc9a29c06654e4 100644 (file)
@@ -4,8 +4,8 @@
             a screen saver and locker for the X window system
                             by Jamie Zawinski
 
             a screen saver and locker for the X window system
                             by Jamie Zawinski
 
-                              version 4.22
-                               22-Jun-2005
+                              version 4.23
+                               21-Oct-2005
 
                      http://www.jwz.org/xscreensaver/
 
 
                      http://www.jwz.org/xscreensaver/
 
@@ -60,11 +60,11 @@ The tags and parameters used here are:
         into the command line (that's what makes it the default.)
         For example:
 
         into the command line (that's what makes it the default.)
         For example:
 
-           <boolean "foo" arg_set="-foo">
+           <boolean _label="foo" arg-set="-foo" />
 
         or if "foo" is the default, and must be explicity turned off,
 
 
         or if "foo" is the default, and must be explicity turned off,
 
-           <boolean "foo" arg_unset="-no-foo">
+           <boolean _label="foo" arg-unset="-no-foo" />
 
 -----------------------------------------------------------------------
 
 
 -----------------------------------------------------------------------
 
@@ -131,9 +131,9 @@ The tags and parameters used here are:
 
         This creates a selection popup menu.
 
 
         This creates a selection popup menu.
 
-        Options should have _arg-set (_arg-unset is not used here.)
+        Options should have arg-set (arg-unset is not used here.)
 
 
-        One of the menu items (the default) should have no _arg-set.
+        One of the menu items (the default) should have no arg-set.
 
 -----------------------------------------------------------------------
 
 
 -----------------------------------------------------------------------
 
@@ -154,6 +154,37 @@ The tags and parameters used here are:
         This creates a file entry field (a text field with a "Browse"
         button next to it.)
 
         This creates a file entry field (a text field with a "Browse"
         button next to it.)
 
+-----------------------------------------------------------------------
+
+  <hgroup>
+    [ ... <boolean>s ... ]
+    [ ... <number>s ... ]
+    [ ... <select>s ... ]
+    [ ... <string>s ... ]
+    [ ... <file>s ... ]
+    [ ... <vgroup>s ... ]
+  </hgroup>
+
+        A horizontal group of widgets/groups.  No more than 4 widgets 
+        or groups should be used in a row.
+
+-----------------------------------------------------------------------
+
+  <vgroup>
+    [ ... <boolean>s ... ]
+    [ ... <number>s ... ]
+    [ ... <select>s ... ]
+    [ ... <string>s ... ]
+    [ ... <file>s ... ]
+    [ ... <hgroup>s ... ]
+  </vgroup>
+
+        A vertical group of widgets/groups.  No more than 10 widgets 
+        or groups should be used in a column.
+        
+        Since the default alignment of widgets is a column, the 
+        <vgroup> element is only of use inside an <hgroup> element.
+
 -----------------------------------------------------------------------
 
   <_description>
 -----------------------------------------------------------------------
 
   <_description>
@@ -169,3 +200,8 @@ The tags and parameters used here are:
         entities are allowed; HTML (and other markup) is not.
 
 -----------------------------------------------------------------------
         entities are allowed; HTML (and other markup) is not.
 
 -----------------------------------------------------------------------
+
+If you are DTD-minded, you may also find the included files "xss.dtd"
+and "xss.xsd" useful.
+
+-----------------------------------------------------------------------
index 36499dfcf838ce91fa52f32a40b1fc9ed67666fb..86a38127f4826f9496824028bd6c5673d616692b 100644 (file)
 
   <select id="neighbors">
     <option id="rand" _label="Random Cell Shape"/>
 
   <select id="neighbors">
     <option id="rand" _label="Random Cell Shape"/>
-    <option id="three" _label="Three Sided Cells" 
+    <option id="three" _label="Three Sided Cells"
             arg-set="-neighbors 3"/>
     <option id="four" _label="Four Sided Cells"
             arg-set="-neighbors 4"/>
             arg-set="-neighbors 3"/>
     <option id="four" _label="Four Sided Cells"
             arg-set="-neighbors 4"/>
-    <option id="six" _label="Six Sided Cells" enable="sharpturn"
+    <option id="six" _label="Six Sided Cells"
             arg-set="-neighbors 6"/>
     <option id="nine" _label="Nine Sided Cells"
             arg-set="-neighbors 9"/>
             arg-set="-neighbors 6"/>
     <option id="nine" _label="Nine Sided Cells"
             arg-set="-neighbors 9"/>
-    <option id="twelve" _label="Twelve Sided Cells" enable="sharpturn"
+    <option id="twelve" _label="Twelve Sided Cells"
             arg-set="-neighbors 12"/>
   </select>
 
             arg-set="-neighbors 12"/>
   </select>
 
index f3eda0950fb84197a6e81da15f7867df5244a165..f4882e3aae3963f21d01cb61a55cfb9af2cf64a3 100644 (file)
           _label="Motion Speed" _low-label="Slow" _high-label="Fast"
           low="0.001" high="4.0" default="0.5"/>
 
           _label="Motion Speed" _low-label="Slow" _high-label="Fast"
           low="0.001" high="4.0" default="0.5"/>
 
+  <number id="balls" type="slider" arg="-balls %"
+          _label="Number of Balls" _low-label="Few" _high-label="Lots"
+          low="3" high="40" default="10"/>
+
+  <number id="ballsize" type="slider" arg="-ballsize %"
+          _label="Ball Size" _low-label="Tiny" _high-label="Huge"
+          low="1.0" high="5.0" default="3.0"/>
+
+  <number id="explosion" type="slider" arg="-explosion %"
+          _label="Explosion Force" _low-label="Popcorn" _high-label="Nuke"
+          low="1.0" high="50.0" default="25.0"/>
+
   <hgroup>
    <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
    <boolean id="wire"    _label="Wireframe" arg-set="-wireframe"/>
   <hgroup>
    <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
    <boolean id="wire"    _label="Wireframe" arg-set="-wireframe"/>
diff --git a/hacks/config/celtic.xml b/hacks/config/celtic.xml
new file mode 100644 (file)
index 0000000..7380d46
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="celtic" _label="Celtic">
+
+  <command arg="-root"/>
+
+  <number id="delay" type="slider" arg="-delay %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="50000" default="10000"
+          convert="invert"/>
+
+  <number id="delay" type="slider" arg="-delay2 %"
+          _label="Pause" _low-label="Short" _high-label="Long"
+          low="0" high="10" default="5"/>
+
+  <boolean id="graph" _label="Draw Graph" arg-set="-graph"/>
+
+  <_description>
+Repeatedly draws random Celtic cross-stitch patterns.
+By Max Froumentin.
+  </_description>
+</screensaver>
index 90954fc3b145203a8b09cc771bbc03e1971a172f..87a45bad569539f64cf90953dbbe61734173a392 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <screensaver name="cosmos" _label="Cosmos">
 
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <screensaver name="cosmos" _label="Cosmos">
 
-  <fullcommand arg="-root"/>
+  <command arg="-root"/>
 
   <_description>
 Draws fireworks and zooming, fading flares.  By Tom Campbell. 
 
   <_description>
 Draws fireworks and zooming, fading flares.  By Tom Campbell. 
diff --git a/hacks/config/cube21.xml b/hacks/config/cube21.xml
new file mode 100644 (file)
index 0000000..0e250f6
--- /dev/null
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cube21" _label="Cube 21">
+
+  <command arg="-root"/>
+
+  <number id="cubesize" type="slider" arg="-cubesize %"
+    _label="Cube size" _low-label="Small" _high-label="Large"
+    low="0.4" high="1.0" default="0.7"/>  
+
+  <number id="speed" type="slider" arg="-delay %"
+    _label="Global speed" _low-label="Slow" _high-label="Fast"
+    low="0" high="30000" default="20000" convert="invert"/>
+
+  <number id="rotspeed" type="slider" arg="-rotspeed %"
+    _label="Rotation" _low-label="Slow" _high-label="Fast"
+    low="1.0" high="10.0" default="3.0"/>
+
+  <number id="wanderspeed" type="slider" arg="-wanderspeed %"
+    _label="Wandering" _low-label="Slow" _high-label="Fast"
+    low="0.3" high="3.0" default="1.0"/>  
+
+  <number id="spinspeed" type="slider" arg="-spinspeed %"
+    _label="Spinning" _low-label="Slow" _high-label="Fast"
+    low="0.5" high="4.0" default="1.0"/>  
+
+  <number id="wait" type="slider" arg="-wait %"
+    _label="Delay in ending position" _low-label="Short" _high-label="Long"
+    low="10.0" high="100.0" default="40.0"/>
+
+  <select id="render">
+    <option id="solid" _label="Textured"/>
+    <option id="notex" _label="Untextured" arg-set="-no-texture"/>
+    <option id="wire"  _label="Wireframe" arg-set="-wireframe"/>
+  </select>
+
+  <select id="start">
+    <option id="cube"    _label="Start as cube" arg-set="-no-randomize"/>
+    <option id="shuffle" _label="Start as random shape"/>
+  </select>
+
+  <select id="colors">
+    <option id="white" _label="White"/>
+    <option id="one"   _label="Random color" arg-set="-colormode rnd"/>
+    <option id="se"    _label="Silver Edition" arg-set="-colormode se"/>
+    <option id="two"   _label="Two random colors" arg-set="-colormode two"/>
+    <option id="ce"    _label="Classic Edition" arg-set="-colormode ce"/>
+    <option id="six"   _label="Six random colors" arg-set="-colormode six"/>
+  </select>
+  
+  <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+
+  <boolean id="wander" _label="Wander on screen" arg-unset="-no-wander"/>
+
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+  <_description>
+Animates a Rubik-like puzzle known as Cube 21 or Square-1.
+The rotations are chosen randomly.  Requires OpenGL.
+
+Written by Vasek Potocek.
+  </_description>
+</screensaver>
diff --git a/hacks/config/glhanoi.xml b/hacks/config/glhanoi.xml
new file mode 100644 (file)
index 0000000..ec3bb83
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+                                                                                
+<screensaver name="glhanoi" _label="GLHanoi">
+
+       <command arg="-root"/>
+       
+       <number id="count" type="spinbutton" arg="-count %"
+         _label="Number of Disks" default="7" low="2" high="200"/>
+       
+       <boolean id="fog" _label="Enable fog" arg-set="-fog"/>
+
+       <boolean id="wire" _label="Wireframe" arg-set="-wire"/>
+
+       <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+       <boolean id="lighting" _label="Enable lighting" arg-unset="-no-light"/>
+
+       <number id="delay" type="slider" arg="-delay %"
+         _label="Frame Delay (us)" _low-label="Slow" _high-label="Fast"
+          low="0" high="80000" default="40000" convert="invert"/>
+       
+       <_description>
+Solves the Towers of Hanoi puzzle. Move N disks from one pole to another, one disk at a time, with no disk ever resting on a disk smaller than itself.
+Written by Dave Atkinson.
+       </_description>
+</screensaver>
index 4dfeb459215fa15c3d923ac4ff7e152eb8c49fae..fad730f9b579f29f787b16795ca649b9626d8bd7 100644 (file)
     <vgroup>
       <number id="xw" type="slider" arg="-xw %"
               _label="XW Rotation" _low-label="Low" _high-label="High"
     <vgroup>
       <number id="xw" type="slider" arg="-xw %"
               _label="XW Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="0"/>
+              low="0" high="20" default="0"/>
       <number id="xy" type="slider" arg="-xy %"
               _label="XY Rotation" _low-label="Low" _high-label="High"
       <number id="xy" type="slider" arg="-xy %"
               _label="XY Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="3"/>
+              low="0" high="20" default="3"/>
       <number id="xz" type="slider" arg="-xz %"
               _label="XZ Rotation" _low-label="Low" _high-label="High"
       <number id="xz" type="slider" arg="-xz %"
               _label="XZ Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="5"/>
+              low="0" high="20" default="5"/>
     </vgroup>
     <vgroup>
       <number id="yw" type="slider" arg="-yw %"
               _label="YW Rotation" _low-label="Low" _high-label="High"
     </vgroup>
     <vgroup>
       <number id="yw" type="slider" arg="-yw %"
               _label="YW Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="10"/>
+              low="0" high="20" default="10"/>
       <number id="yz" type="slider" arg="-yz %"
               _label="YZ Rotation" _low-label="Low" _high-label="High"
       <number id="yz" type="slider" arg="-yz %"
               _label="YZ Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="0"/>
+              low="0" high="20" default="0"/>
       <number id="zw" type="slider" arg="-zw %"
               _label="ZW Rotation" _low-label="Low" _high-label="High"
       <number id="zw" type="slider" arg="-zw %"
               _label="ZW Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="0"/>
+              low="0" high="20" default="0"/>
     </vgroup>
   </hgroup>
 
   <_description>
 Hyperball is to hypercube as dodecahedron is to cube: this displays
 a 2D projection of the sequence of 3D objects which are the projections
     </vgroup>
   </hgroup>
 
   <_description>
 Hyperball is to hypercube as dodecahedron is to cube: this displays
 a 2D projection of the sequence of 3D objects which are the projections
-of the 4D analog to the dodecahedron.  Technically, it is a "120 cell 
+of the 4D analog to the dodecahedron.  Technically, it is a "120 cell
 polytope."  Written by Joe Keane.
 
 See also the "polytopes" hack for a more general version of this
 polytope."  Written by Joe Keane.
 
 See also the "polytopes" hack for a more general version of this
index 3bed10940c59b7b3cb6458e25475d4b1573ca026..67a2f55800fec0fcbc384689400f72ab2a84e6d0 100644 (file)
     <vgroup>
       <number id="xw" type="slider" arg="-xw %"
               _label="XW Rotation" _low-label="Low" _high-label="High"
     <vgroup>
       <number id="xw" type="slider" arg="-xw %"
               _label="XW Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="0"/>
+              low="0" high="20" default="0"/>
       <number id="xy" type="slider" arg="-xy %"
               _label="XY Rotation" _low-label="Low" _high-label="High"
       <number id="xy" type="slider" arg="-xy %"
               _label="XY Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="3"/>
+              low="0" high="20" default="3"/>
       <number id="xz" type="slider" arg="-xz %"
               _label="XZ Rotation" _low-label="Low" _high-label="High"
       <number id="xz" type="slider" arg="-xz %"
               _label="XZ Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="5"/>
+              low="0" high="20" default="5"/>
     </vgroup>
     <vgroup>
       <number id="yw" type="slider" arg="-yw %"
               _label="YW Rotation" _low-label="Low" _high-label="High"
     </vgroup>
     <vgroup>
       <number id="yw" type="slider" arg="-yw %"
               _label="YW Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="10"/>
+              low="0" high="20" default="10"/>
       <number id="yz" type="slider" arg="-yz %"
               _label="YZ Rotation" _low-label="Low" _high-label="High"
       <number id="yz" type="slider" arg="-yz %"
               _label="YZ Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="0"/>
+              low="0" high="20" default="0"/>
       <number id="zw" type="slider" arg="-zw %"
               _label="ZW Rotation" _low-label="Low" _high-label="High"
       <number id="zw" type="slider" arg="-zw %"
               _label="ZW Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="0"/>
+              low="0" high="20" default="0"/>
     </vgroup>
   </hgroup>
 
     </vgroup>
   </hgroup>
 
index 1dff4d646d0d55588dbfd2d702a74a5575bee1ad..76789cbe79deb4ba5c28c826f53c31fdb2648fa3 100644 (file)
             arg-set="-solid"/>
     <option id="bands" _label="See-Through Bands"
             arg-set="-bands"/>
             arg-set="-solid"/>
     <option id="bands" _label="See-Through Bands"
             arg-set="-bands"/>
+    <option id="bands" _label="See-Through Spirals (1 Spiral)"
+            arg-set="-spirals-1"/>
+    <option id="bands" _label="See-Through Spirals (2 Spirals)"
+            arg-set="-spirals-2"/>
+    <option id="bands" _label="See-Through Spirals (4 Spirals)"
+            arg-set="-spirals-4"/>
+    <option id="bands" _label="See-Through Spirals (8 Spirals)"
+            arg-set="-spirals-8"/>
+    <option id="bands" _label="See-Through Spirals (16 Spirals)"
+            arg-set="-spirals-16"/>
   </select>
 
   <select id="colors">
   </select>
 
   <select id="colors">
index 71ace194d25125faf8258d7fa5f5a57e5d45c849..435de3d02bc2990ed5068746935f8c4835f063ff 100644 (file)
@@ -7,7 +7,7 @@
   <number id="init" type="spinbutton" arg="-num-discs %"
           _label="Number of Discs" low="50" high="400" default="85"/>
 
   <number id="init" type="spinbutton" arg="-num-discs %"
           _label="Number of Discs" low="50" high="400" default="85"/>
 
-  <number id="speed" type="slider" arg="-draw-delay %"
+  <number id="speed" type="slider" arg="-growth-delay %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
           low="0" high="60000" default="30000" convert="invert"/>
 
           _label="Speed" _low-label="Slow" _high-label="Fast"
           low="0" high="60000" default="30000" convert="invert"/>
 
index 9cbab3667e9046c12d8e4377464c59a94152a6e9..4e5a9c82725443f9200cc6094719cfc14004b615 100644 (file)
   <boolean id="wireframe" _label="Wireframe" arg-set="-wireframe"/>
 
   <select id="color">
   <boolean id="wireframe" _label="Wireframe" arg-set="-wireframe"/>
 
   <select id="color">
-   <option id="cycle"     _label="Cycle" arg-set=""/>
+   <option id="cycle"     _label="Cycle" />
    <option id="flowerbox" _label="Flower box" arg-set="-color flowerbox"/>
    <option id="clownbarf" _label="Clown barf" arg-set="-color clownbarf"/>
    <option id="chrome" _label="Chrome" arg-set="-color chrome"/>
   </select>
 
   <select id="start">
    <option id="flowerbox" _label="Flower box" arg-set="-color flowerbox"/>
    <option id="clownbarf" _label="Clown barf" arg-set="-color clownbarf"/>
    <option id="chrome" _label="Chrome" arg-set="-color chrome"/>
   </select>
 
   <select id="start">
-   <option id="sphere" _label="Sphere" arg-set=""/>
+   <option id="sphere" _label="Sphere" />
    <option id="tetrahedron" _label="Tetrahedron" arg-set="-tetra"/>
   </select>
 
    <option id="tetrahedron" _label="Tetrahedron" arg-set="-tetra"/>
   </select>
 
diff --git a/hacks/config/juggler3d.xml b/hacks/config/juggler3d.xml
new file mode 100644 (file)
index 0000000..b2822ba
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="juggler3d" _label="Juggler3D">
+  <command arg="-root"/>
+
+       <number id="speed" type="slider" arg="-speed %" _label="Juggling Speed"
+               _low-label="Slow" _high-label="Fast" low="0.5" high="5.0" default="2.2"/>
+                 
+       <number id="trans" type="slider" arg="-trans %" _label="Juggler Horizontal Speed"
+               _low-label="Slow" _high-label="Fast" low="0.05" high="2.0" default="0.1"/>
+
+       <number id="spin" type="slider" arg="-spin %" _label="Juggler Spin Speed"
+               _low-label="Slow" _high-label="Fast" low="3.0" high="50.0" default="20.0"/>
+
+       <number id="minobjs" type="spinbutton" arg="-minobjs %" _label="Min Objects"
+          low="3" high="35" default="8"/>
+
+       <number id="maxobjs" type="spinbutton" arg="-maxobjs %" _label="Max Objects"
+          low="3" high="35" default="8"/>                
+
+       <number id="minhinc" type="spinbutton" arg="-minhinc %" _label="Min Height"
+          low="1" high="31" default="2"/>
+                 
+       <number id="maxhinc" type="spinbutton" arg="-maxhinc %" _label="Max Height"
+          low="1" high="31" default="6"/>                
+
+       <boolean id="wire"   _label="Wireframe" arg-set="-wireframe"/>
+       <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+       <_description>
+3D simulation of a juggler performing with balls, clubs and rings.  Written
+by Brian Apps and partially based on his Win32 Juggle Saver program.
+       </_description>
+</screensaver>
index f6f84961256645fe2d171d75c8901c3d6f99b938..febe66a78c7749c5f3bc92912b6b691f040d96a1 100644 (file)
 
   <select id="object">
 <option id="random" _label="Display Random Polyhedron"/>
 
   <select id="object">
 <option id="random" _label="Display Random Polyhedron"/>
-<option id="" _label="Pentagonal Prism" arg-set="-which pentagonal_prism"/>
-<option id="" _label="Pentagonal Dipyramid" arg-set="-which pentagonal_dipyramid"/>
-<option id="" _label="Pentagonal Antiprism" arg-set="-which pentagonal_antiprism"/>
-<option id="" _label="Pentagonal Deltohedron" arg-set="-which pentagonal_deltohedron"/>
-<option id="" _label="Pentagrammic Prism" arg-set="-which pentagrammic_prism"/>
-<option id="" _label="Pentagrammic Dipyramid" arg-set="-which pentagrammic_dipyramid"/>
-<option id="" _label="Pentagrammic Antiprism" arg-set="-which pentagrammic_antiprism"/>
-<option id="" _label="Pentagrammic Deltohedron" arg-set="-which pentagrammic_deltohedron"/>
-<option id="" _label="Pentagrammic Crossed Antiprism" arg-set="-which pentagrammic_crossed_antiprism"/>
-<option id="" _label="Pentagrammic Concave Deltohedron" arg-set="-which pentagrammic_concave_deltohedron"/>
-<option id="" _label="Tetrahedron" arg-set="-which tetrahedron"/>
-<option id="" _label="Truncated Tetrahedron" arg-set="-which truncated_tetrahedron"/>
-<option id="" _label="Triakistetrahedron" arg-set="-which triakistetrahedron"/>
-<option id="" _label="Octahemioctahedron" arg-set="-which octahemioctahedron"/>
-<option id="" _label="Octahemioctacron" arg-set="-which octahemioctacron"/>
-<option id="" _label="Tetrahemihexahedron" arg-set="-which tetrahemihexahedron"/>
-<option id="" _label="Tetrahemihexacron" arg-set="-which tetrahemihexacron"/>
-<option id="" _label="Octahedron" arg-set="-which octahedron"/>
-<option id="" _label="Cube" arg-set="-which cube"/>
-<option id="" _label="Cuboctahedron" arg-set="-which cuboctahedron"/>
-<option id="" _label="Rhombic Dodecahedron" arg-set="-which rhombic_dodecahedron"/>
-<option id="" _label="Truncated Octahedron" arg-set="-which truncated_octahedron"/>
-<option id="" _label="Tetrakishexahedron" arg-set="-which tetrakishexahedron"/>
-<option id="" _label="Truncated Cube" arg-set="-which truncated_cube"/>
-<option id="" _label="Triakisoctahedron" arg-set="-which triakisoctahedron"/>
-<option id="" _label="Rhombicuboctahedron" arg-set="-which rhombicuboctahedron"/>
-<option id="" _label="Deltoidal Icositetrahedron" arg-set="-which deltoidal_icositetrahedron"/>
-<option id="" _label="Truncated Cuboctahedron" arg-set="-which truncated_cuboctahedron"/>
-<option id="" _label="Disdyakisdodecahedron" arg-set="-which disdyakisdodecahedron"/>
-<option id="" _label="Snub Cube" arg-set="-which snub_cube"/>
-<option id="" _label="Pentagonal Icositetrahedron" arg-set="-which pentagonal_icositetrahedron"/>
-<option id="" _label="Small Cubicuboctahedron" arg-set="-which small_cubicuboctahedron"/>
-<option id="" _label="Small Hexacronic Icositetrahedron" arg-set="-which small_hexacronic_icositetrahedron"/>
-<option id="" _label="Great Cubicuboctahedron" arg-set="-which great_cubicuboctahedron"/>
-<option id="" _label="Great Hexacronic Icositetrahedron" arg-set="-which great_hexacronic_icositetrahedron"/>
-<option id="" _label="Cubohemioctahedron" arg-set="-which cubohemioctahedron"/>
-<option id="" _label="Hexahemioctacron" arg-set="-which hexahemioctacron"/>
-<option id="" _label="Cubitruncated Cuboctahedron" arg-set="-which cubitruncated_cuboctahedron"/>
-<option id="" _label="Tetradyakishexahedron" arg-set="-which tetradyakishexahedron"/>
-<option id="" _label="Great Rhombicuboctahedron" arg-set="-which great_rhombicuboctahedron"/>
-<option id="" _label="Great Deltoidal Icositetrahedron" arg-set="-which great_deltoidal_icositetrahedron"/>
-<option id="" _label="Small Rhombihexahedron" arg-set="-which small_rhombihexahedron"/>
-<option id="" _label="Small Rhombihexacron" arg-set="-which small_rhombihexacron"/>
-<option id="" _label="Stellated Truncated Hexahedron" arg-set="-which stellated_truncated_hexahedron"/>
-<option id="" _label="Great Triakisoctahedron" arg-set="-which great_triakisoctahedron"/>
-<option id="" _label="Great Truncated Cuboctahedron" arg-set="-which great_truncated_cuboctahedron"/>
-<option id="" _label="Great Disdyakisdodecahedron" arg-set="-which great_disdyakisdodecahedron"/>
-<option id="" _label="Great Rhombihexahedron" arg-set="-which great_rhombihexahedron"/>
-<option id="" _label="Great Rhombihexacron" arg-set="-which great_rhombihexacron"/>
-<option id="" _label="Icosahedron" arg-set="-which icosahedron"/>
-<option id="" _label="Dodecahedron" arg-set="-which dodecahedron"/>
-<option id="" _label="Icosidodecahedron" arg-set="-which icosidodecahedron"/>
-<option id="" _label="Rhombic Triacontahedron" arg-set="-which rhombic_triacontahedron"/>
-<option id="" _label="Truncated Icosahedron" arg-set="-which truncated_icosahedron"/>
-<option id="" _label="Pentakisdodecahedron" arg-set="-which pentakisdodecahedron"/>
-<option id="" _label="Truncated Dodecahedron" arg-set="-which truncated_dodecahedron"/>
-<option id="" _label="Triakisicosahedron" arg-set="-which triakisicosahedron"/>
-<option id="" _label="Rhombicosidodecahedron" arg-set="-which rhombicosidodecahedron"/>
-<option id="" _label="Deltoidal Hexecontahedron" arg-set="-which deltoidal_hexecontahedron"/>
-<option id="" _label="Truncated Icosidodechedon" arg-set="-which truncated_icosidodechedon"/>
-<option id="" _label="Disdyakistriacontahedron" arg-set="-which disdyakistriacontahedron"/>
-<option id="" _label="Snub Dodecahedron" arg-set="-which snub_dodecahedron"/>
-<option id="" _label="Pentagonal Hexecontahedron" arg-set="-which pentagonal_hexecontahedron"/>
-<option id="" _label="Small Ditrigonal Icosidodecahedron" arg-set="-which small_ditrigonal_icosidodecahedron"/>
-<option id="" _label="Small Triambic Icosahedron" arg-set="-which small_triambic_icosahedron"/>
-<option id="" _label="Small Icosicosidodecahedron" arg-set="-which small_icosicosidodecahedron"/>
-<option id="" _label="Small Icosacronic Hexecontahedron" arg-set="-which small_icosacronic_hexecontahedron"/>
-<option id="" _label="Small Snub Icosicosidodecahedron" arg-set="-which small_snub_icosicosidodecahedron"/>
-<option id="" _label="Small Hexagonal Hexecontahedron" arg-set="-which small_hexagonal_hexecontahedron"/>
-<option id="" _label="Small Dodecicosidodecahedron" arg-set="-which small_dodecicosidodecahedron"/>
-<option id="" _label="Small Dodecacronic Hexecontahedron" arg-set="-which small_dodecacronic_hexecontahedron"/>
-<option id="" _label="Small Stellated Dodecahedron" arg-set="-which small_stellated_dodecahedron"/>
-<option id="" _label="Great Dodecahedron" arg-set="-which great_dodecahedron"/>
-<option id="" _label="Great Dodecadodecahedron" arg-set="-which great_dodecadodecahedron"/>
-<option id="" _label="Medial Rhombic Triacontahedron" arg-set="-which medial_rhombic_triacontahedron"/>
-<option id="" _label="Truncated Great Dodecahedron" arg-set="-which truncated_great_dodecahedron"/>
-<option id="" _label="Small Stellapentakisdodecahedron" arg-set="-which small_stellapentakisdodecahedron"/>
-<option id="" _label="Rhombidodecadodecahedron" arg-set="-which rhombidodecadodecahedron"/>
-<option id="" _label="Medial Deltoidal Hexecontahedron" arg-set="-which medial_deltoidal_hexecontahedron"/>
-<option id="" _label="Small Rhombidodecahedron" arg-set="-which small_rhombidodecahedron"/>
-<option id="" _label="Small Rhombidodecacron" arg-set="-which small_rhombidodecacron"/>
-<option id="" _label="Snub Dodecadodecahedron" arg-set="-which snub_dodecadodecahedron"/>
-<option id="" _label="Medial Pentagonal Hexecontahedron" arg-set="-which medial_pentagonal_hexecontahedron"/>
-<option id="" _label="Ditrigonal Dodecadodecahedron" arg-set="-which ditrigonal_dodecadodecahedron"/>
-<option id="" _label="Medial Triambic Icosahedron" arg-set="-which medial_triambic_icosahedron"/>
-<option id="" _label="Great Ditrigonal Dodecicosidodecahedron" arg-set="-which great_ditrigonal_dodecicosidodecahedron"/>
-<option id="" _label="Great Ditrigonal Dodecacronic Hexecontahedron" arg-set="-which great_ditrigonal_dodecacronic_hexecontahedron"/>
-<option id="" _label="Small Ditrigonal Dodecicosidodecahedron" arg-set="-which small_ditrigonal_dodecicosidodecahedron"/>
-<option id="" _label="Small Ditrigonal Dodecacronic Hexecontahedron" arg-set="-which small_ditrigonal_dodecacronic_hexecontahedron"/>
-<option id="" _label="Icosidodecadodecahedron" arg-set="-which icosidodecadodecahedron"/>
-<option id="" _label="Medial Icosacronic Hexecontahedron" arg-set="-which medial_icosacronic_hexecontahedron"/>
-<option id="" _label="Icositruncated Dodecadodecahedron" arg-set="-which icositruncated_dodecadodecahedron"/>
-<option id="" _label="Tridyakisicosahedron" arg-set="-which tridyakisicosahedron"/>
-<option id="" _label="Snub Icosidodecadodecahedron" arg-set="-which snub_icosidodecadodecahedron"/>
-<option id="" _label="Medial Hexagonal Hexecontahedron" arg-set="-which medial_hexagonal_hexecontahedron"/>
-<option id="" _label="Great Ditrigonal Icosidodecahedron" arg-set="-which great_ditrigonal_icosidodecahedron"/>
-<option id="" _label="Great Triambic Icosahedron" arg-set="-which great_triambic_icosahedron"/>
-<option id="" _label="Great Icosicosidodecahedron" arg-set="-which great_icosicosidodecahedron"/>
-<option id="" _label="Great Icosacronic Hexecontahedron" arg-set="-which great_icosacronic_hexecontahedron"/>
-<option id="" _label="Small Icosihemidodecahedron" arg-set="-which small_icosihemidodecahedron"/>
-<option id="" _label="Small Icosihemidodecacron" arg-set="-which small_icosihemidodecacron"/>
-<option id="" _label="Small Dodecicosahedron" arg-set="-which small_dodecicosahedron"/>
-<option id="" _label="Small Dodecicosacron" arg-set="-which small_dodecicosacron"/>
-<option id="" _label="Small Dodecahemidodecahedron" arg-set="-which small_dodecahemidodecahedron"/>
-<option id="" _label="Small Dodecahemidodecacron" arg-set="-which small_dodecahemidodecacron"/>
-<option id="" _label="Great Stellated Dodecahedron" arg-set="-which great_stellated_dodecahedron"/>
-<option id="" _label="Great Icosahedron" arg-set="-which great_icosahedron"/>
-<option id="" _label="Great Icosidodecahedron" arg-set="-which great_icosidodecahedron"/>
-<option id="" _label="Great Rhombic Triacontahedron" arg-set="-which great_rhombic_triacontahedron"/>
-<option id="" _label="Great Truncated Icosahedron" arg-set="-which great_truncated_icosahedron"/>
-<option id="" _label="Great Stellapentakisdodecahedron" arg-set="-which great_stellapentakisdodecahedron"/>
-<option id="" _label="Rhombicosahedron" arg-set="-which rhombicosahedron"/>
-<option id="" _label="Rhombicosacron" arg-set="-which rhombicosacron"/>
-<option id="" _label="Great Snub Icosidodecahedron" arg-set="-which great_snub_icosidodecahedron"/>
-<option id="" _label="Great Pentagonal Hexecontahedron" arg-set="-which great_pentagonal_hexecontahedron"/>
-<option id="" _label="Small Stellated Truncated Dodecahedron" arg-set="-which small_stellated_truncated_dodecahedron"/>
-<option id="" _label="Great Pentakisdodekahedron" arg-set="-which great_pentakisdodekahedron"/>
-<option id="" _label="Truncated Dodecadodecahedron" arg-set="-which truncated_dodecadodecahedron"/>
-<option id="" _label="Medial Disdyakistriacontahedron" arg-set="-which medial_disdyakistriacontahedron"/>
-<option id="" _label="Inverted Snub Dodecadodecahedron" arg-set="-which inverted_snub_dodecadodecahedron"/>
-<option id="" _label="Medial Inverted Pentagonal Hexecontahedron" arg-set="-which medial_inverted_pentagonal_hexecontahedron"/>
-<option id="" _label="Great Dodecicosidodecahedron" arg-set="-which great_dodecicosidodecahedron"/>
-<option id="" _label="Great Dodecacronic Hexecontahedron" arg-set="-which great_dodecacronic_hexecontahedron"/>
-<option id="" _label="Small Dodecahemicosahedron" arg-set="-which small_dodecahemicosahedron"/>
-<option id="" _label="Small Dodecahemicosacron" arg-set="-which small_dodecahemicosacron"/>
-<option id="" _label="Great Dodecicosahedron" arg-set="-which great_dodecicosahedron"/>
-<option id="" _label="Great Dodecicosacron" arg-set="-which great_dodecicosacron"/>
-<option id="" _label="Great Snub Dodecicosidodecahedron" arg-set="-which great_snub_dodecicosidodecahedron"/>
-<option id="" _label="Great Hexagonal Hexecontahedron" arg-set="-which great_hexagonal_hexecontahedron"/>
-<option id="" _label="Great Dodecahemicosahedron" arg-set="-which great_dodecahemicosahedron"/>
-<option id="" _label="Great Dodecahemicosacron" arg-set="-which great_dodecahemicosacron"/>
-<option id="" _label="Great Stellated Truncated Dodecahedron" arg-set="-which great_stellated_truncated_dodecahedron"/>
-<option id="" _label="Great Triakisicosahedron" arg-set="-which great_triakisicosahedron"/>
-<option id="" _label="Great Rhombicosidodecahedron" arg-set="-which great_rhombicosidodecahedron"/>
-<option id="" _label="Great Deltoidal Hexecontahedron" arg-set="-which great_deltoidal_hexecontahedron"/>
-<option id="" _label="Great Truncated Icosidodecahedron" arg-set="-which great_truncated_icosidodecahedron"/>
-<option id="" _label="Great Disdyakistriacontahedron" arg-set="-which great_disdyakistriacontahedron"/>
-<option id="" _label="Great Inverted Snub Icosidodecahedron" arg-set="-which great_inverted_snub_icosidodecahedron"/>
-<option id="" _label="Great Inverted Pentagonal Hexecontahedron" arg-set="-which great_inverted_pentagonal_hexecontahedron"/>
-<option id="" _label="Great Dodecahemidodecahedron" arg-set="-which great_dodecahemidodecahedron"/>
-<option id="" _label="Great Dodecahemidodecacron" arg-set="-which great_dodecahemidodecacron"/>
-<option id="" _label="Great Icosihemidodecahedron" arg-set="-which great_icosihemidodecahedron"/>
-<option id="" _label="Great Icosihemidodecacron" arg-set="-which great_icosihemidodecacron"/>
-<option id="" _label="Small Retrosnub Icosicosidodecahedron" arg-set="-which small_retrosnub_icosicosidodecahedron"/>
-<option id="" _label="Small Hexagrammic Hexecontahedron" arg-set="-which small_hexagrammic_hexecontahedron"/>
-<option id="" _label="Great Rhombidodecahedron" arg-set="-which great_rhombidodecahedron"/>
-<option id="" _label="Great Rhombidodecacron" arg-set="-which great_rhombidodecacron"/>
-<option id="" _label="Great Retrosnub Icosidodecahedron" arg-set="-which great_retrosnub_icosidodecahedron"/>
-<option id="" _label="Great Pentagrammic Hexecontahedron" arg-set="-which great_pentagrammic_hexecontahedron"/>
-<option id="" _label="Great Dirhombicosidodecahedron" arg-set="-which great_dirhombicosidodecahedron"/>
-<option id="" _label="Great Dirhombicosidodecacron" arg-set="-which great_dirhombicosidodecacron"/>
+<option _label="Pentagonal Prism" arg-set="-which pentagonal_prism"/>
+<option _label="Pentagonal Dipyramid" arg-set="-which pentagonal_dipyramid"/>
+<option _label="Pentagonal Antiprism" arg-set="-which pentagonal_antiprism"/>
+<option _label="Pentagonal Deltohedron" arg-set="-which pentagonal_deltohedron"/>
+<option _label="Pentagrammic Prism" arg-set="-which pentagrammic_prism"/>
+<option _label="Pentagrammic Dipyramid" arg-set="-which pentagrammic_dipyramid"/>
+<option _label="Pentagrammic Antiprism" arg-set="-which pentagrammic_antiprism"/>
+<option _label="Pentagrammic Deltohedron" arg-set="-which pentagrammic_deltohedron"/>
+<option _label="Pentagrammic Crossed Antiprism" arg-set="-which pentagrammic_crossed_antiprism"/>
+<option _label="Pentagrammic Concave Deltohedron" arg-set="-which pentagrammic_concave_deltohedron"/>
+<option _label="Tetrahedron" arg-set="-which tetrahedron"/>
+<option _label="Truncated Tetrahedron" arg-set="-which truncated_tetrahedron"/>
+<option _label="Triakistetrahedron" arg-set="-which triakistetrahedron"/>
+<option _label="Octahemioctahedron" arg-set="-which octahemioctahedron"/>
+<option _label="Octahemioctacron" arg-set="-which octahemioctacron"/>
+<option _label="Tetrahemihexahedron" arg-set="-which tetrahemihexahedron"/>
+<option _label="Tetrahemihexacron" arg-set="-which tetrahemihexacron"/>
+<option _label="Octahedron" arg-set="-which octahedron"/>
+<option _label="Cube" arg-set="-which cube"/>
+<option _label="Cuboctahedron" arg-set="-which cuboctahedron"/>
+<option _label="Rhombic Dodecahedron" arg-set="-which rhombic_dodecahedron"/>
+<option _label="Truncated Octahedron" arg-set="-which truncated_octahedron"/>
+<option _label="Tetrakishexahedron" arg-set="-which tetrakishexahedron"/>
+<option _label="Truncated Cube" arg-set="-which truncated_cube"/>
+<option _label="Triakisoctahedron" arg-set="-which triakisoctahedron"/>
+<option _label="Rhombicuboctahedron" arg-set="-which rhombicuboctahedron"/>
+<option _label="Deltoidal Icositetrahedron" arg-set="-which deltoidal_icositetrahedron"/>
+<option _label="Truncated Cuboctahedron" arg-set="-which truncated_cuboctahedron"/>
+<option _label="Disdyakisdodecahedron" arg-set="-which disdyakisdodecahedron"/>
+<option _label="Snub Cube" arg-set="-which snub_cube"/>
+<option _label="Pentagonal Icositetrahedron" arg-set="-which pentagonal_icositetrahedron"/>
+<option _label="Small Cubicuboctahedron" arg-set="-which small_cubicuboctahedron"/>
+<option _label="Small Hexacronic Icositetrahedron" arg-set="-which small_hexacronic_icositetrahedron"/>
+<option _label="Great Cubicuboctahedron" arg-set="-which great_cubicuboctahedron"/>
+<option _label="Great Hexacronic Icositetrahedron" arg-set="-which great_hexacronic_icositetrahedron"/>
+<option _label="Cubohemioctahedron" arg-set="-which cubohemioctahedron"/>
+<option _label="Hexahemioctacron" arg-set="-which hexahemioctacron"/>
+<option _label="Cubitruncated Cuboctahedron" arg-set="-which cubitruncated_cuboctahedron"/>
+<option _label="Tetradyakishexahedron" arg-set="-which tetradyakishexahedron"/>
+<option _label="Great Rhombicuboctahedron" arg-set="-which great_rhombicuboctahedron"/>
+<option _label="Great Deltoidal Icositetrahedron" arg-set="-which great_deltoidal_icositetrahedron"/>
+<option _label="Small Rhombihexahedron" arg-set="-which small_rhombihexahedron"/>
+<option _label="Small Rhombihexacron" arg-set="-which small_rhombihexacron"/>
+<option _label="Stellated Truncated Hexahedron" arg-set="-which stellated_truncated_hexahedron"/>
+<option _label="Great Triakisoctahedron" arg-set="-which great_triakisoctahedron"/>
+<option _label="Great Truncated Cuboctahedron" arg-set="-which great_truncated_cuboctahedron"/>
+<option _label="Great Disdyakisdodecahedron" arg-set="-which great_disdyakisdodecahedron"/>
+<option _label="Great Rhombihexahedron" arg-set="-which great_rhombihexahedron"/>
+<option _label="Great Rhombihexacron" arg-set="-which great_rhombihexacron"/>
+<option _label="Icosahedron" arg-set="-which icosahedron"/>
+<option _label="Dodecahedron" arg-set="-which dodecahedron"/>
+<option _label="Icosidodecahedron" arg-set="-which icosidodecahedron"/>
+<option _label="Rhombic Triacontahedron" arg-set="-which rhombic_triacontahedron"/>
+<option _label="Truncated Icosahedron" arg-set="-which truncated_icosahedron"/>
+<option _label="Pentakisdodecahedron" arg-set="-which pentakisdodecahedron"/>
+<option _label="Truncated Dodecahedron" arg-set="-which truncated_dodecahedron"/>
+<option _label="Triakisicosahedron" arg-set="-which triakisicosahedron"/>
+<option _label="Rhombicosidodecahedron" arg-set="-which rhombicosidodecahedron"/>
+<option _label="Deltoidal Hexecontahedron" arg-set="-which deltoidal_hexecontahedron"/>
+<option _label="Truncated Icosidodechedon" arg-set="-which truncated_icosidodechedon"/>
+<option _label="Disdyakistriacontahedron" arg-set="-which disdyakistriacontahedron"/>
+<option _label="Snub Dodecahedron" arg-set="-which snub_dodecahedron"/>
+<option _label="Pentagonal Hexecontahedron" arg-set="-which pentagonal_hexecontahedron"/>
+<option _label="Small Ditrigonal Icosidodecahedron" arg-set="-which small_ditrigonal_icosidodecahedron"/>
+<option _label="Small Triambic Icosahedron" arg-set="-which small_triambic_icosahedron"/>
+<option _label="Small Icosicosidodecahedron" arg-set="-which small_icosicosidodecahedron"/>
+<option _label="Small Icosacronic Hexecontahedron" arg-set="-which small_icosacronic_hexecontahedron"/>
+<option _label="Small Snub Icosicosidodecahedron" arg-set="-which small_snub_icosicosidodecahedron"/>
+<option _label="Small Hexagonal Hexecontahedron" arg-set="-which small_hexagonal_hexecontahedron"/>
+<option _label="Small Dodecicosidodecahedron" arg-set="-which small_dodecicosidodecahedron"/>
+<option _label="Small Dodecacronic Hexecontahedron" arg-set="-which small_dodecacronic_hexecontahedron"/>
+<option _label="Small Stellated Dodecahedron" arg-set="-which small_stellated_dodecahedron"/>
+<option _label="Great Dodecahedron" arg-set="-which great_dodecahedron"/>
+<option _label="Great Dodecadodecahedron" arg-set="-which great_dodecadodecahedron"/>
+<option _label="Medial Rhombic Triacontahedron" arg-set="-which medial_rhombic_triacontahedron"/>
+<option _label="Truncated Great Dodecahedron" arg-set="-which truncated_great_dodecahedron"/>
+<option _label="Small Stellapentakisdodecahedron" arg-set="-which small_stellapentakisdodecahedron"/>
+<option _label="Rhombidodecadodecahedron" arg-set="-which rhombidodecadodecahedron"/>
+<option _label="Medial Deltoidal Hexecontahedron" arg-set="-which medial_deltoidal_hexecontahedron"/>
+<option _label="Small Rhombidodecahedron" arg-set="-which small_rhombidodecahedron"/>
+<option _label="Small Rhombidodecacron" arg-set="-which small_rhombidodecacron"/>
+<option _label="Snub Dodecadodecahedron" arg-set="-which snub_dodecadodecahedron"/>
+<option _label="Medial Pentagonal Hexecontahedron" arg-set="-which medial_pentagonal_hexecontahedron"/>
+<option _label="Ditrigonal Dodecadodecahedron" arg-set="-which ditrigonal_dodecadodecahedron"/>
+<option _label="Medial Triambic Icosahedron" arg-set="-which medial_triambic_icosahedron"/>
+<option _label="Great Ditrigonal Dodecicosidodecahedron" arg-set="-which great_ditrigonal_dodecicosidodecahedron"/>
+<option _label="Great Ditrigonal Dodecacronic Hexecontahedron" arg-set="-which great_ditrigonal_dodecacronic_hexecontahedron"/>
+<option _label="Small Ditrigonal Dodecicosidodecahedron" arg-set="-which small_ditrigonal_dodecicosidodecahedron"/>
+<option _label="Small Ditrigonal Dodecacronic Hexecontahedron" arg-set="-which small_ditrigonal_dodecacronic_hexecontahedron"/>
+<option _label="Icosidodecadodecahedron" arg-set="-which icosidodecadodecahedron"/>
+<option _label="Medial Icosacronic Hexecontahedron" arg-set="-which medial_icosacronic_hexecontahedron"/>
+<option _label="Icositruncated Dodecadodecahedron" arg-set="-which icositruncated_dodecadodecahedron"/>
+<option _label="Tridyakisicosahedron" arg-set="-which tridyakisicosahedron"/>
+<option _label="Snub Icosidodecadodecahedron" arg-set="-which snub_icosidodecadodecahedron"/>
+<option _label="Medial Hexagonal Hexecontahedron" arg-set="-which medial_hexagonal_hexecontahedron"/>
+<option _label="Great Ditrigonal Icosidodecahedron" arg-set="-which great_ditrigonal_icosidodecahedron"/>
+<option _label="Great Triambic Icosahedron" arg-set="-which great_triambic_icosahedron"/>
+<option _label="Great Icosicosidodecahedron" arg-set="-which great_icosicosidodecahedron"/>
+<option _label="Great Icosacronic Hexecontahedron" arg-set="-which great_icosacronic_hexecontahedron"/>
+<option _label="Small Icosihemidodecahedron" arg-set="-which small_icosihemidodecahedron"/>
+<option _label="Small Icosihemidodecacron" arg-set="-which small_icosihemidodecacron"/>
+<option _label="Small Dodecicosahedron" arg-set="-which small_dodecicosahedron"/>
+<option _label="Small Dodecicosacron" arg-set="-which small_dodecicosacron"/>
+<option _label="Small Dodecahemidodecahedron" arg-set="-which small_dodecahemidodecahedron"/>
+<option _label="Small Dodecahemidodecacron" arg-set="-which small_dodecahemidodecacron"/>
+<option _label="Great Stellated Dodecahedron" arg-set="-which great_stellated_dodecahedron"/>
+<option _label="Great Icosahedron" arg-set="-which great_icosahedron"/>
+<option _label="Great Icosidodecahedron" arg-set="-which great_icosidodecahedron"/>
+<option _label="Great Rhombic Triacontahedron" arg-set="-which great_rhombic_triacontahedron"/>
+<option _label="Great Truncated Icosahedron" arg-set="-which great_truncated_icosahedron"/>
+<option _label="Great Stellapentakisdodecahedron" arg-set="-which great_stellapentakisdodecahedron"/>
+<option _label="Rhombicosahedron" arg-set="-which rhombicosahedron"/>
+<option _label="Rhombicosacron" arg-set="-which rhombicosacron"/>
+<option _label="Great Snub Icosidodecahedron" arg-set="-which great_snub_icosidodecahedron"/>
+<option _label="Great Pentagonal Hexecontahedron" arg-set="-which great_pentagonal_hexecontahedron"/>
+<option _label="Small Stellated Truncated Dodecahedron" arg-set="-which small_stellated_truncated_dodecahedron"/>
+<option _label="Great Pentakisdodekahedron" arg-set="-which great_pentakisdodekahedron"/>
+<option _label="Truncated Dodecadodecahedron" arg-set="-which truncated_dodecadodecahedron"/>
+<option _label="Medial Disdyakistriacontahedron" arg-set="-which medial_disdyakistriacontahedron"/>
+<option _label="Inverted Snub Dodecadodecahedron" arg-set="-which inverted_snub_dodecadodecahedron"/>
+<option _label="Medial Inverted Pentagonal Hexecontahedron" arg-set="-which medial_inverted_pentagonal_hexecontahedron"/>
+<option _label="Great Dodecicosidodecahedron" arg-set="-which great_dodecicosidodecahedron"/>
+<option _label="Great Dodecacronic Hexecontahedron" arg-set="-which great_dodecacronic_hexecontahedron"/>
+<option _label="Small Dodecahemicosahedron" arg-set="-which small_dodecahemicosahedron"/>
+<option _label="Small Dodecahemicosacron" arg-set="-which small_dodecahemicosacron"/>
+<option _label="Great Dodecicosahedron" arg-set="-which great_dodecicosahedron"/>
+<option _label="Great Dodecicosacron" arg-set="-which great_dodecicosacron"/>
+<option _label="Great Snub Dodecicosidodecahedron" arg-set="-which great_snub_dodecicosidodecahedron"/>
+<option _label="Great Hexagonal Hexecontahedron" arg-set="-which great_hexagonal_hexecontahedron"/>
+<option _label="Great Dodecahemicosahedron" arg-set="-which great_dodecahemicosahedron"/>
+<option _label="Great Dodecahemicosacron" arg-set="-which great_dodecahemicosacron"/>
+<option _label="Great Stellated Truncated Dodecahedron" arg-set="-which great_stellated_truncated_dodecahedron"/>
+<option _label="Great Triakisicosahedron" arg-set="-which great_triakisicosahedron"/>
+<option _label="Great Rhombicosidodecahedron" arg-set="-which great_rhombicosidodecahedron"/>
+<option _label="Great Deltoidal Hexecontahedron" arg-set="-which great_deltoidal_hexecontahedron"/>
+<option _label="Great Truncated Icosidodecahedron" arg-set="-which great_truncated_icosidodecahedron"/>
+<option _label="Great Disdyakistriacontahedron" arg-set="-which great_disdyakistriacontahedron"/>
+<option _label="Great Inverted Snub Icosidodecahedron" arg-set="-which great_inverted_snub_icosidodecahedron"/>
+<option _label="Great Inverted Pentagonal Hexecontahedron" arg-set="-which great_inverted_pentagonal_hexecontahedron"/>
+<option _label="Great Dodecahemidodecahedron" arg-set="-which great_dodecahemidodecahedron"/>
+<option _label="Great Dodecahemidodecacron" arg-set="-which great_dodecahemidodecacron"/>
+<option _label="Great Icosihemidodecahedron" arg-set="-which great_icosihemidodecahedron"/>
+<option _label="Great Icosihemidodecacron" arg-set="-which great_icosihemidodecacron"/>
+<option _label="Small Retrosnub Icosicosidodecahedron" arg-set="-which small_retrosnub_icosicosidodecahedron"/>
+<option _label="Small Hexagrammic Hexecontahedron" arg-set="-which small_hexagrammic_hexecontahedron"/>
+<option _label="Great Rhombidodecahedron" arg-set="-which great_rhombidodecahedron"/>
+<option _label="Great Rhombidodecacron" arg-set="-which great_rhombidodecacron"/>
+<option _label="Great Retrosnub Icosidodecahedron" arg-set="-which great_retrosnub_icosidodecahedron"/>
+<option _label="Great Pentagrammic Hexecontahedron" arg-set="-which great_pentagrammic_hexecontahedron"/>
+<option _label="Great Dirhombicosidodecahedron" arg-set="-which great_dirhombicosidodecahedron"/>
+<option _label="Great Dirhombicosidodecacron" arg-set="-which great_dirhombicosidodecacron"/>
   </select>
 
 
   </select>
 
 
 
   <_description>
 Displays different 3D solids and some information about each.
 
   <_description>
 Displays different 3D solids and some information about each.
-A new solid is chosen every few seconds.  There are 75 uniform 
-polyhedra, plus 5 inifite sets of prisms and antiprisms; 
+A new solid is chosen every few seconds.  There are 75 uniform
+polyhedra, plus 5 infinite sets of prisms and antiprisms;
 including their duals brings the total to 160.
 
 Written by Dr. Zvi Har'El and Jamie Zawinski.
 including their duals brings the total to 160.
 
 Written by Dr. Zvi Har'El and Jamie Zawinski.
index 9efe41e9c061e4d6f57549d6c22e46b1da985ce5..8b39b637f75d73f27bdeb7f475caf45cce82590b 100644 (file)
@@ -30,6 +30,8 @@
 
   <boolean id="oily" _label="Psychedelic Colors" arg-set="-oily"/>
 
 
   <boolean id="oily" _label="Psychedelic Colors" arg-set="-oily"/>
 
+  <boolean id="gray" _label="Grayscale" arg-set="-grayscale"/>
+
   <number id="ncolors" type="slider" arg="-colors %"
             _low-label="Colors    Two" _high-label="Many"
             low="1" high="255" default="200"/>
   <number id="ncolors" type="slider" arg="-colors %"
             _low-label="Colors    Two" _high-label="Many"
             low="1" high="255" default="200"/>
index a9fc9c3ad83b01924a44385cbda10ca6ba27fa10..58556fdc341e935a21dac8202e8e34e7f7403d85 100644 (file)
@@ -20,9 +20,9 @@
           _label="Handedness" _low-label="Left" _high-label="Right"
           low="0.0" high="1.0" default="0.5"/>
 
           _label="Handedness" _low-label="Left" _high-label="Right"
           low="0.0" high="1.0" default="0.5"/>
 
-  <number id="fill" type="slider" arg="-density %"
-          _label="Density" _low-label="Sparse" _high-label="Dense"
-          low="10" high="100" default="75"/>
+  <number id="fill" type="slider" arg="-fill %"
+           _label="Density" _low-label="Sparse" _high-label="Dense"
+          low="0" high="100" default="75"/>
 
   <number id="ncolors" type="slider" arg="-ncolors %"
             _label="Number of Colors" _low-label="Two" _high-label="Many"
 
   <number id="ncolors" type="slider" arg="-ncolors %"
             _label="Number of Colors" _low-label="Two" _high-label="Many"
index da9fc84a8c3ee2ac88647523ce6e0cf6b08e7559..1ff8b5470952ce150531db8f3b909399f6eaced8 100644 (file)
   <number id="viewing_time" type="spinbutton" arg="-viewing_time %"
           _label="Viewing Time" low="0" high="30" default="5" />
 
   <number id="viewing_time" type="spinbutton" arg="-viewing_time %"
           _label="Viewing Time" low="0" high="30" default="5" />
 
+  <number id="x_camera_rotate" type="slider" arg="-x_camera_rotate %"
+          _label="X Camera Rotate" _low-label="Slow" _high-label="Fast"
+          low="0" high="1" default="0.2" />
+
+  <number id="y_camera_rotate" type="slider" arg="-y_camera_rotate %"
+          _label="Y Camera Rotate" _low-label="Slow" _high-label="Fast"
+          low="0" high="1" default="0.5" />
+
+  <number id="z_camera_rotate" type="slider" arg="-z_camera_rotate %"
+          _label="Z Camera Rotate" _low-label="Slow" _high-label="Fast"
+          low="0" high="1" default="0" />
+
   <hgroup>
    <boolean id="wire"      _label="Wireframe"  arg-set="-wireframe"/>
   <hgroup>
    <boolean id="wire"      _label="Wireframe"  arg-set="-wireframe"/>
+   <boolean id="rotate"    _label="Don't Rotate"     arg-set="-no-rotate"/>
   </hgroup>
 
   <_description>
   </hgroup>
 
   <_description>
-Watch the computer solve Tangram puzzles.
+Lets you watch the computer solve Tangram puzzles
 Written by Jeremy English.
   </_description>
 </screensaver>
 Written by Jeremy English.
   </_description>
 </screensaver>
diff --git a/hacks/config/timetunnel.xml b/hacks/config/timetunnel.xml
new file mode 100644 (file)
index 0000000..6416567
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="timetunnel" _label="Timetunnel">
+
+  <command arg="-root"/>
+
+  <number id="start" type="slider" arg="-start %"
+          _label="Start sequence time" _low-label="0 sec" _high-label="30 sec"
+          low="0.00" high="30.00" default="0.00"/>
+
+  <number id="changetime" type="slider" arg="-changetime %"
+          _label="Color Change Time" _low-label="Short" _high-label="Long"
+          low="0.00" high="30.00" default="30.00"/>
+
+  <boolean id="tunonly" _label="Draw Logo" arg-unset="-tunonly"/>
+  <boolean id="reverse" _label="Run Backward" arg-set="-reverse"/>
+
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+  <_description>
+Draws an animation similar to the opening and closing effects on the
+Dr. Who television show.  Written by Sean P. Brennan.
+  </_description>
+</screensaver>
index 93e013a0b3596f43d8fb83d0c3ebf227c7c052e5..1d52e2bb86cdb3180fe47e3820a8ceb52f7c3874 100644 (file)
@@ -5,11 +5,11 @@
   <command arg="-root"/>
 
   <number id="points" type="slider" arg="-points %"
   <command arg="-root"/>
 
   <number id="points" type="slider" arg="-points %"
-          _label="Particles" _label-low="Few" _label-high="Many"
+          _label="Particles" _low-label="Few" _high-label="Many"
           low="10" high="1000" default="400"/>
 
   <number id="tails" type="slider" arg="-tails %"
           low="10" high="1000" default="400"/>
 
   <number id="tails" type="slider" arg="-tails %"
-          _label="Trail Size" _label-low="Short" _label-high="Long"
+          _label="Trail Size" _low-label="Short" _high-label="Long"
           low="1" high="200" default="10"/>
 
   <_description>
           low="1" high="200" default="10"/>
 
   <_description>
index c9af56d394c8075197c7ac5c2668beafd403215c..d67070ba02a98e27d3f9d3558fc16c81e3af63ff 100644 (file)
@@ -29,7 +29,7 @@
 
   <hgroup>
    <select id="xmode">
 
   <hgroup>
    <select id="xmode">
-    <option id="random" _label="Random" arg-set=""/>
+    <option id="random" _label="Random" />
     <option id="spin" _label="Spin" arg-set="-xmode spin"/>
     <option id="funky" _label="Funky" arg-set="-xmode funky"/>
     <option id="circle" _label="Circle" arg-set="-xmode circle"/>
     <option id="spin" _label="Spin" arg-set="-xmode spin"/>
     <option id="funky" _label="Funky" arg-set="-xmode funky"/>
     <option id="circle" _label="Circle" arg-set="-xmode circle"/>
    </select>
 
    <select id="ymode">
    </select>
 
    <select id="ymode">
-    <option id="random" _label="Random" arg-set=""/>
-    <option id="spin" _label="Spin" arg-set="-ymode spin"/>
-    <option id="funky" _label="Funky" arg-set="-ymode funky"/>
-    <option id="circle" _label="Circle" arg-set="-ymode circle"/>
-    <option id="linear" _label="Linear" arg-set="-ymode linear"/>
-    <option id="test" _label="Test" arg-set="-ymode test"/>
-    <option id="fun" _label="Fun" arg-set="-ymode fun"/>
-    <option id="innie" _label="Innie" arg-set="-ymode innie"/>
-    <option id="lissajous" _label="Lissajous" arg-set="-ymode lissajous"/>
+    <option id="randomy" _label="Random" />
+    <option id="spiny" _label="Spin" arg-set="-ymode spin"/>
+    <option id="funkyy" _label="Funky" arg-set="-ymode funky"/>
+    <option id="circley" _label="Circle" arg-set="-ymode circle"/>
+    <option id="lineary" _label="Linear" arg-set="-ymode linear"/>
+    <option id="testy" _label="Test" arg-set="-ymode test"/>
+    <option id="funy" _label="Fun" arg-set="-ymode fun"/>
+    <option id="inniey" _label="Innie" arg-set="-ymode innie"/>
+    <option id="lissajousy" _label="Lissajous" arg-set="-ymode lissajous"/>
    </select>
  </hgroup>
 
   <!-- #### -speed [1] -->
    </select>
  </hgroup>
 
   <!-- #### -speed [1] -->
-  <!-- #### -color_modifier [-1] --> 
+  <!-- #### -color_modifier [-1] -->
   <!-- #### -start_time [-1] -->
   <!-- #### -xoffset [1.0] -->
   <!-- #### -yoffset [1.0] -->
   <!-- #### -start_time [-1] -->
   <!-- #### -xoffset [1.0] -->
   <!-- #### -yoffset [1.0] -->
index 49b28d19a38422b7b6002e58c033459dbc4f86e7..54737c2ddfe6c2b3f0722cdde544eee9792d66ff 100644 (file)
@@ -11,7 +11,7 @@
       <option id="top"  _label="Top View" arg-set="-m"/>
     </select>
 
       <option id="top"  _label="Top View" arg-set="-m"/>
     </select>
 
-    <boolean id="reflections" _label="Reflections" arg-unset="+M"/>
+    <boolean id="reflections" _label="Reflections" arg-unset="-M"/>
   </hgroup>
 
   <number id="speed" type="slider" arg="-Z %"
   </hgroup>
 
   <number id="speed" type="slider" arg="-Z %"
@@ -36,7 +36,7 @@
   <number id="alight" type="slider" arg="-e %"
           _label="Light Level" _low-label="Ambient  Low" _high-label="High"
           low="0.0" high="1.0" default="0.3"/>
   <number id="alight" type="slider" arg="-e %"
           _label="Light Level" _low-label="Ambient  Low" _high-label="High"
           low="0.0" high="1.0" default="0.3"/>
-  <number id="vlight" type="slider" arg="-v %"
+  <number id="vlight2" type="slider" arg="-v %"
           _low-label="Vertical  Low" _high-label="High"
           low="0.0" high="1.0" default="0.6"/>
   <number id="contrast" type="slider" arg="-c %"
           _low-label="Vertical  Low" _high-label="High"
           low="0.0" high="1.0" default="0.6"/>
   <number id="contrast" type="slider" arg="-c %"
@@ -80,7 +80,7 @@
   <number id="recurs" type="slider" arg="-l %"
           _low-label="Recursion  0" _high-label="14"
           low="0" high="14" default="10"/>
   <number id="recurs" type="slider" arg="-l %"
           _low-label="Recursion  0" _high-label="14"
           low="0" high="14" default="10"/>
-  <number id="recurs" type="slider" arg="-t %"
+  <number id="iterate" type="slider" arg="-t %"
           _low-label="Iteration  0" _high-label="10"
           low="0" high="10" default="2"/>
 
           _low-label="Iteration  0" _high-label="10"
           low="0" high="10" default="2"/>
 
@@ -95,7 +95,7 @@
           _low-label="Yf  0.0" _high-label="1.0"
           low="0.0" high="1.0" default="0.0"/>
 
           _low-label="Yf  0.0" _high-label="1.0"
           low="0.0" high="1.0" default="0.0"/>
 
-  <boolean id="cross" _label="Cross Update" arg-unset="+x"/>
+  <boolean id="cross" _label="Cross Update" arg-unset="-x"/>
 
   <_description>
 XMountains generates realistic-looking fractal terrains of snow-capped
 
   <_description>
 XMountains generates realistic-looking fractal terrains of snow-capped
index ba30f691b7b1c4d47ba655ac64ba23d7e0ae763b..ba7fb51499389b25edb48e424b596fc05213a9c1 100644 (file)
@@ -101,7 +101,7 @@ SRCS                = xscreensaver-gl-helper.c normals.c glxfonts.c \
                  mirrorblob.c blinkbox.c noof.c polyhedra.c polyhedra-gl.c \
                  antinspect.c providence.c pinion.c boing.c texfont.c \
                  carousel.c fliptext.c antmaze.c tangram.c tangram_shapes.c \
                  mirrorblob.c blinkbox.c noof.c polyhedra.c polyhedra-gl.c \
                  antinspect.c providence.c pinion.c boing.c texfont.c \
                  carousel.c fliptext.c antmaze.c tangram.c tangram_shapes.c \
-                 crackberg.c
+                 crackberg.c glhanoi.c cube21.c timetunnel.c juggler3d.c
 
 OBJS           = xscreensaver-gl-helper.o normals.o glxfonts.o \
                  atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
 
 OBJS           = xscreensaver-gl-helper.o normals.o glxfonts.o \
                  atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
@@ -132,7 +132,7 @@ OBJS                = xscreensaver-gl-helper.o normals.o glxfonts.o \
                  mirrorblob.o blinkbox.o noof.o polyhedra.o polyhedra-gl.o \
                  antinspect.o providence.o pinion.o boing.o texfont.o \
                  carousel.o fliptext.o antmaze.o tangram.o tangram_shapes.o \
                  mirrorblob.o blinkbox.o noof.o polyhedra.o polyhedra-gl.o \
                  antinspect.o providence.o pinion.o boing.o texfont.o \
                  carousel.o fliptext.o antmaze.o tangram.o tangram_shapes.o \
-                 crackberg.o
+                 crackberg.o glhanoi.o cube21.o timetunnel.o juggler3d.o
 
 GL_EXES                = cage gears moebius pipes sproingies stairs superquadrics \
                  morph3d rubik atlantis lament bubble3d glplanet pulsar \
 
 GL_EXES                = cage gears moebius pipes sproingies stairs superquadrics \
                  morph3d rubik atlantis lament bubble3d glplanet pulsar \
@@ -144,7 +144,7 @@ GL_EXES             = cage gears moebius pipes sproingies stairs superquadrics \
                  glknots blocktube flipflop antspotlight polytopes \
                  gleidescope mirrorblob blinkbox noof polyhedra \
                  antinspect providence pinion boing carousel fliptext \
                  glknots blocktube flipflop antspotlight polytopes \
                  gleidescope mirrorblob blinkbox noof polyhedra \
                  antinspect providence pinion boing carousel fliptext \
-                 antmaze tangram crackberg
+                 antmaze tangram crackberg glhanoi cube21 timetunnel juggler3d
 GLE_EXES       = extrusion
 GL_UTIL_EXES   = xscreensaver-gl-helper
 HACK_EXES      = @GL_EXES@ @GLE_EXES@
 GLE_EXES       = extrusion
 GL_UTIL_EXES   = xscreensaver-gl-helper
 HACK_EXES      = @GL_EXES@ @GLE_EXES@
@@ -164,7 +164,7 @@ HDRS                = atlantis.h bubble3d.h buildlwo.h e_textures.h xpm-ximage.h \
                  glut_roman.h marching.h rotator.h trackball.h gltrackball.h \
                  chessmodels.h chessgames.h gllist.h flurry.h tunnel_draw.h \
                  ants.h polyhedra.h normals.h glxfonts.h texfont.h \
                  glut_roman.h marching.h rotator.h trackball.h gltrackball.h \
                  chessmodels.h chessgames.h gllist.h flurry.h tunnel_draw.h \
                  ants.h polyhedra.h normals.h glxfonts.h texfont.h \
-                 tangram_shapes.h
+                 tangram_shapes.h cube21-tex.h
 GL_MEN         = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  cubenetic.man dangerball.man engine.man extrusion.man \
                  flipscreen3d.man gears.man gflux.man glforestfire.man \
 GL_MEN         = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  cubenetic.man dangerball.man engine.man extrusion.man \
                  flipscreen3d.man gears.man gflux.man glforestfire.man \
@@ -181,7 +181,8 @@ GL_MEN              = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  mirrorblob.man blinkbox.man noof.man polyhedra.man \
                  antinspect.man providence.man pinion.man boing.man \
                  carousel.man fliptext.man antmaze.man tangram.man \
                  mirrorblob.man blinkbox.man noof.man polyhedra.man \
                  antinspect.man providence.man pinion.man boing.man \
                  carousel.man fliptext.man antmaze.man tangram.man \
-                 crackberg.man
+                 crackberg.man glhanoi.man cube21.man timetunnel.man \
+                 juggler3d.man
 MEN            = @GL_MEN@
 EXTRAS         = README Makefile.in dxf2gl.pl starwars.txt
 
 MEN            = @GL_MEN@
 EXTRAS         = README Makefile.in dxf2gl.pl starwars.txt
 
@@ -586,8 +587,8 @@ jigglypuff: jigglypuff.o    xpm-ximage.o $(HACK_TRACK_OBJS)
 klein:         klein.o         $(HACK_TRACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 klein:         klein.o         $(HACK_TRACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
-hypertorus:    hypertorus.o    $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+hypertorus:    hypertorus.o    $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 glmatrix:      glmatrix.o      xpm-ximage.o $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   xpm-ximage.o $(HACK_OBJS) $(XPM_LIBS)
 
 glmatrix:      glmatrix.o      xpm-ximage.o $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   xpm-ximage.o $(HACK_OBJS) $(XPM_LIBS)
@@ -607,8 +608,8 @@ flipflop:   flipflop.o      $(HACK_TRACK_OBJS)
 antspotlight:  antspotlight.o  $(HACK_TRACK_GRAB_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
 
 antspotlight:  antspotlight.o  $(HACK_TRACK_GRAB_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
 
-polytopes:     polytopes.o     $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+polytopes:     polytopes.o     $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 # This one works differently (it's not xlock-like.)
 #
 
 # This one works differently (it's not xlock-like.)
 #
@@ -669,12 +670,26 @@ fliptext: fliptext.o      texfont.o $(HACK_OBJS)
 antmaze:       antmaze.o       $(HACK_TRACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 antmaze:       antmaze.o       $(HACK_TRACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
-tangram:       tangram.o       tangram_shapes.o $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   tangram_shapes.o $(HACK_OBJS) $(HACK_LIBS)
+TANGRAM_OBJS=tangram_shapes.o glxfonts.o $(HACK_OBJS)
+tangram:       tangram.o       $(TANGRAM_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(TANGRAM_OBJS) $(HACK_LIBS)
 
 crackberg:     crackberg.o     $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
 
 crackberg:     crackberg.o     $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
+glhanoi:       glhanoi.o       $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+cube21:                cube21.o        $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+TIMETUNNEL_OBJS = xpm-ximage.o  $(HACK_TRACK_OBJS)
+timetunnel:    timetunnel.o    $(TIMETUNNEL_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(TIMETUNNEL_OBJS) $(XPM_LIBS)
+
+juggler3d:     juggler3d.o     $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
 dnalogo:       dnalogo.o      tube.o normals.o $(HACK_TRACK_OBJS)
        $(CC_HACK) -o $@ $@.o  tube.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 dnalogo:       dnalogo.o      tube.o normals.o $(HACK_TRACK_OBJS)
        $(CC_HACK) -o $@ $@.o  tube.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
@@ -746,6 +761,8 @@ cow_horns.o: $(srcdir)/gllist.h
 cow_tail.o: $(srcdir)/gllist.h
 cow_udder.o: $(srcdir)/gllist.h
 crackberg.o: ../../config.h
 cow_tail.o: $(srcdir)/gllist.h
 cow_udder.o: $(srcdir)/gllist.h
 crackberg.o: ../../config.h
+cube21.o: ../../config.h
+cube21.o: $(srcdir)/cube21-tex.h
 cubenetic.o: ../../config.h
 cubenetic.o: $(srcdir)/gltrackball.h
 cubenetic.o: $(srcdir)/rotator.h
 cubenetic.o: ../../config.h
 cubenetic.o: $(srcdir)/gltrackball.h
 cubenetic.o: $(srcdir)/rotator.h
@@ -828,6 +845,8 @@ glforestfire.o: ../../config.h
 glforestfire.o: $(HACK_SRC)/images/ground.xpm
 glforestfire.o: $(HACK_SRC)/images/tree.xpm
 glforestfire.o: $(srcdir)/xpm-ximage.h
 glforestfire.o: $(HACK_SRC)/images/ground.xpm
 glforestfire.o: $(HACK_SRC)/images/tree.xpm
 glforestfire.o: $(srcdir)/xpm-ximage.h
+glhanoi.o: ../../config.h
+glhanoi.o: $(srcdir)/rotator.h
 glknots.o: ../../config.h
 glknots.o: $(srcdir)/gltrackball.h
 glknots.o: $(srcdir)/rotator.h
 glknots.o: ../../config.h
 glknots.o: $(srcdir)/gltrackball.h
 glknots.o: $(srcdir)/rotator.h
@@ -865,10 +884,13 @@ glxfonts.o: ../../config.h
 glxfonts.o: $(srcdir)/glxfonts.h
 grab-ximage.o: ../../config.h
 hypertorus.o: ../../config.h
 glxfonts.o: $(srcdir)/glxfonts.h
 grab-ximage.o: ../../config.h
 hypertorus.o: ../../config.h
+hypertorus.o: $(srcdir)/gltrackball.h
 jigglypuff.o: ../../config.h
 jigglypuff.o: $(srcdir)/gltrackball.h
 jigglypuff.o: $(HACK_SRC)/images/jigglymap.xpm
 jigglypuff.o: $(srcdir)/xpm-ximage.h
 jigglypuff.o: ../../config.h
 jigglypuff.o: $(srcdir)/gltrackball.h
 jigglypuff.o: $(HACK_SRC)/images/jigglymap.xpm
 jigglypuff.o: $(srcdir)/xpm-ximage.h
+juggler3d.o: ../../config.h
+juggler3d.o: $(srcdir)/gltrackball.h
 klein.o: ../../config.h
 klein.o: $(srcdir)/gltrackball.h
 klein.o: $(srcdir)/rotator.h
 klein.o: ../../config.h
 klein.o: $(srcdir)/gltrackball.h
 klein.o: $(srcdir)/rotator.h
@@ -922,6 +944,7 @@ polyhedra-gl.o: $(srcdir)/rotator.h
 polyhedra.o: ../../config.h
 polyhedra.o: $(srcdir)/polyhedra.h
 polytopes.o: ../../config.h
 polyhedra.o: ../../config.h
 polyhedra.o: $(srcdir)/polyhedra.h
 polytopes.o: ../../config.h
+polytopes.o: $(srcdir)/gltrackball.h
 providence.o: ../../config.h
 providence.o: $(srcdir)/gltrackball.h
 pulsar.o: ../../config.h
 providence.o: ../../config.h
 providence.o: $(srcdir)/gltrackball.h
 pulsar.o: ../../config.h
@@ -975,9 +998,19 @@ superquadrics.o: ../../config.h
 swim.o: $(srcdir)/atlantis.h
 swim.o: ../../config.h
 tangram.o: ../../config.h
 swim.o: $(srcdir)/atlantis.h
 swim.o: ../../config.h
 tangram.o: ../../config.h
+tangram.o: $(srcdir)/glxfonts.h
 tangram.o: $(srcdir)/tangram_shapes.h
 texfont.o: ../../config.h
 texfont.o: $(srcdir)/texfont.h
 tangram.o: $(srcdir)/tangram_shapes.h
 texfont.o: ../../config.h
 texfont.o: $(srcdir)/texfont.h
+timetunnel.o: ../../config.h
+timetunnel.o: $(srcdir)/gltrackball.h
+timetunnel.o: $(HACK_SRC)/images/timetunnel0.xpm
+timetunnel.o: $(HACK_SRC)/images/timetunnel1.xpm
+timetunnel.o: $(HACK_SRC)/images/timetunnel2.xpm
+timetunnel.o: $(HACK_SRC)/images/tunnelstar.xpm
+timetunnel.o: $(srcdir)/rotator.h
+timetunnel.o: $(UTILS_SRC)/images/logo-180.xpm
+timetunnel.o: $(srcdir)/xpm-ximage.h
 toast2.o: $(srcdir)/gllist.h
 toaster_base.o: $(srcdir)/gllist.h
 toaster_handle2.o: $(srcdir)/gllist.h
 toast2.o: $(srcdir)/gllist.h
 toaster_base.o: $(srcdir)/gllist.h
 toaster_handle2.o: $(srcdir)/gllist.h
index 4ce50878ce0e6e0ad7fb7cc7c04287e115b4407b..8ab835d3f51fe00ab8029335b4a2846151da4993 100644 (file)
@@ -56,21 +56,21 @@ static int  noants;
 
 static XrmOptionDescRec opts[] =
 {
 
 static XrmOptionDescRec opts[] =
 {
-  {(char *) "-solidmoebius", (char *) ".moebius.solidmoebius", XrmoptionNoArg, (caddr_t) "on"},
-  {(char *) "+solidmoebius", (char *) ".moebius.solidmoebius", XrmoptionNoArg, (caddr_t) "off"},
-  {(char *) "-noants", (char *) ".moebius.noants", XrmoptionNoArg, (caddr_t) "on"},
-  {(char *) "+noants", (char *) ".moebius.noants", XrmoptionNoArg, (caddr_t) "off"}
+  {"-solidmoebius", ".moebius.solidmoebius", XrmoptionNoArg, "on"},
+  {"+solidmoebius", ".moebius.solidmoebius", XrmoptionNoArg, "off"},
+  {"-noants", ".moebius.noants", XrmoptionNoArg, "on"},
+  {"+noants", ".moebius.noants", XrmoptionNoArg, "off"}
 };
 static argtype vars[] =
 {
 };
 static argtype vars[] =
 {
-  {(caddr_t *) & solidmoebius, (char *) "solidmoebius", (char *) "Solidmoebius", (char *) DEF_SOLIDMOEBIUS, t_Bool},
-  {(caddr_t *) & noants, (char *) "noants", (char *) "Noants", (char *) DEF_NOANTS, t_Bool}
-
+  {&solidmoebius, "solidmoebius", "Solidmoebius", DEF_SOLIDMOEBIUS, t_Bool},
+  {&noants, "noants", "Noants", DEF_NOANTS, t_Bool}
 };
 };
+
 static OptionStruct desc[] =
 {
 static OptionStruct desc[] =
 {
-       {(char *) "-/+solidmoebius", (char *) "select between a SOLID or a NET Moebius Strip"},
-       {(char *) "-/+noants", (char *) "turn on/off walking ants"}
+       {"-/+solidmoebius", "select between a SOLID or a NET Moebius Strip"},
+       {"-/+noants", "turn on/off walking ants"}
 };
 
 ModeSpecOpt moebius_opts =
 };
 
 ModeSpecOpt moebius_opts =
@@ -79,7 +79,7 @@ ModeSpecOpt moebius_opts =
 #ifdef USE_MODULES
 ModStruct   moebius_description =
 {"moebius", "init_moebius", "draw_moebius", "release_moebius",
 #ifdef USE_MODULES
 ModStruct   moebius_description =
 {"moebius", "init_moebius", "draw_moebius", "release_moebius",
- "draw_moebius", "change_moebius", (char *) NULL, &moebius_opts,
+ "draw_moebius", "change_moebius", NULL, &moebius_opts,
  1000, 1, 1, 1, 4, 1.0, "",
  "draws some ants", 0, NULL};
 
  1000, 1, 1, 1, 4, 1.0, "",
  "draws some ants", 0, NULL};
 
@@ -113,7 +113,7 @@ typedef struct {
 #include "ants.h"
 
 static GLfloat MaterialRed[] = {0.6, 0.0, 0.0, 1.0};
 #include "ants.h"
 
 static GLfloat MaterialRed[] = {0.6, 0.0, 0.0, 1.0};
-static GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0};
+/*static GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0};*/
 static GLfloat MaterialGray8[] = {0.8, 0.8, 0.8, 1.0};
 static GLfloat MaterialGray35[] = {0.30, 0.30, 0.30, 1.0};
 static GLfloat MaterialGray4[] = {0.40, 0.40, 0.40, 1.0};
 static GLfloat MaterialGray8[] = {0.8, 0.8, 0.8, 1.0};
 static GLfloat MaterialGray35[] = {0.30, 0.30, 0.30, 1.0};
 static GLfloat MaterialGray4[] = {0.40, 0.40, 0.40, 1.0};
@@ -150,6 +150,7 @@ static Bool mySphere(float radius) {
   return True;
 }
 
   return True;
 }
 
+#if 0
 /* silhouette sphere */
 static Bool mySphere2(float radius) {
   GLUquadricObj *quadObj;
 /* silhouette sphere */
 static Bool mySphere2(float radius) {
   GLUquadricObj *quadObj;
@@ -162,6 +163,7 @@ static Bool mySphere2(float radius) {
 
   return True;
 }
 
   return True;
 }
+#endif
 
 /* textured sphere */
 static Bool mySphereTex(float radius) {
 
 /* textured sphere */
 static Bool mySphereTex(float radius) {
@@ -193,7 +195,7 @@ static Bool myCone(float radius) {
 /* no cone */
 static Bool myCone2(float radius) { return True; }
 
 /* no cone */
 static Bool myCone2(float radius) { return True; }
 
-#define ANTCOUNT 4
+#define ANTCOUNT 5
 #define PI 3.14157
 
 static int focus = 0;
 #define PI 3.14157
 
 static int focus = 0;
@@ -269,11 +271,11 @@ GLuint checktexture, brushedtexture;
 double elevator = 0.0;
 
 void makeCheckImage(void) {
 double elevator = 0.0;
 
 void makeCheckImage(void) {
-  int i, j, r, c, k;
+  int i, j;
   
   for (i = 0; i < checkImageWidth; i++) {
     for (j = 0; j < checkImageHeight; j++) {
   
   for (i = 0; i < checkImageWidth; i++) {
     for (j = 0; j < checkImageHeight; j++) {
-      if((((i&0x8)==0)^((j&0x8))==0)) {
+      if(((((i&0x8)==0)^((j&0x8)))==0)) {
        int c = 102 + random()%32;
        checkers[i][j][0] = c;
        checkers[i][j][1] = c;
        int c = 102 + random()%32;
        checkers[i][j][0] = c;
        checkers[i][j][1] = c;
@@ -302,7 +304,7 @@ void makeCheckImage(void) {
 }
 
 void makeBrushedImage(void) {
 }
 
 void makeBrushedImage(void) {
-  int i, j, r, c, k;
+  int i, j, c;
 
   for(i = 0; i < checkImageWidth; ++i)
     for(j = 0; j < checkImageHeight; ++j) {
 
   for(i = 0; i < checkImageWidth; ++i)
     for(j = 0; j < checkImageHeight; ++j) {
@@ -972,6 +974,9 @@ double fadeoutspeed = 0.0;
 
 void update_ants(void) {
   int i;
 
 void update_ants(void) {
   int i;
+  GLfloat df[4];
+  df[0] = df[1] = df[2] = 0.8*fadeout;
+  df[3] = 1.0;
 
   /* fade out */
   if(fadeoutspeed < -0.00001) {
 
   /* fade out */
   if(fadeoutspeed < -0.00001) {
@@ -985,7 +990,6 @@ void update_ants(void) {
     
     fadeout += fadeoutspeed;
 
     
     fadeout += fadeoutspeed;
 
-    GLfloat df[4] = {0.8*fadeout, 0.8*fadeout, 0.8*fadeout, 1.0};
     glLightfv(GL_LIGHT0, GL_DIFFUSE, df);
     glLightfv(GL_LIGHT1, GL_DIFFUSE, df);
   }
     glLightfv(GL_LIGHT0, GL_DIFFUSE, df);
     glLightfv(GL_LIGHT1, GL_DIFFUSE, df);
   }
@@ -998,7 +1002,6 @@ void update_ants(void) {
       fadeoutspeed = 0.0;
       entroducing = 12;
     }
       fadeoutspeed = 0.0;
       entroducing = 12;
     }
-    GLfloat df[4] = {0.8*fadeout, 0.8*fadeout, 0.8*fadeout, 1.0};
     glLightfv(GL_LIGHT0, GL_DIFFUSE, df);
     glLightfv(GL_LIGHT1, GL_DIFFUSE, df);    
   }
     glLightfv(GL_LIGHT0, GL_DIFFUSE, df);
     glLightfv(GL_LIGHT1, GL_DIFFUSE, df);    
   }
@@ -1171,10 +1174,12 @@ void update_ants(void) {
        ideal += Pi;
 
       /* compute correction */
        ideal += Pi;
 
       /* compute correction */
-      double dt = sign(ideal) * min(fabs(ideal), PI/90.0);
-      antdirection[i] += dt;
-      if(antdirection[i] > 2.0*PI)
-       antdirection[i] = 0.0;
+      {
+        double dt = sign(ideal) * min(fabs(ideal), PI/90.0);
+        antdirection[i] += dt;
+        if(antdirection[i] > 2.0*PI)
+          antdirection[i] = 0.0;
+      }
     }
     
     antposition[i][0] += antvelocity[i] * cos(antdirection[i]);
     }
     
     antposition[i][0] += antvelocity[i] * cos(antdirection[i]);
@@ -1183,7 +1188,6 @@ void update_ants(void) {
 }
 
 static void pinit(void) {
 }
 
 static void pinit(void) {
-  int status;
   glClearDepth(1.0);
   glClearColor(0.0, 0.0, 0.0, 1.0);
   
   glClearDepth(1.0);
   glClearColor(0.0, 0.0, 0.0, 1.0);
   
index e875f0fa2a3a43d07e29956ae1efa5137e2e3ba7..9f7706c6c9b03f86fa5b0061262fc94db7c877f7 100644 (file)
@@ -1,4 +1,4 @@
-/* thebox --- 3D bouncing balls that explode */
+/* boxed --- 3D bouncing balls that explode */
 
 #if 0
 static const char sccsid[] = "@(#)boxed.c      0.9 01/09/26 xlockmore";
 
 #if 0
 static const char sccsid[] = "@(#)boxed.c      0.9 01/09/26 xlockmore";
@@ -23,6 +23,9 @@ static const char sccsid[] = "@(#)boxed.c     0.9 01/09/26 xlockmore";
  *       as an OpenGL screensaver for the xscreensaver package.
  *       Lots of hardcoded values still in place. Also, there are some
  *       copy/paste leftovers from the gears hack. opts don't work.
  *       as an OpenGL screensaver for the xscreensaver package.
  *       Lots of hardcoded values still in place. Also, there are some
  *       copy/paste leftovers from the gears hack. opts don't work.
+ *
+ * 2005: opts work. added options -balls, -ballsize, -explosion
+ *
  */
 
 #include <X11/Intrinsic.h>
  */
 
 #include <X11/Intrinsic.h>
@@ -42,6 +45,9 @@ static const char sccsid[] = "@(#)boxed.c     0.9 01/09/26 xlockmore";
 # define boxed_opts    xlockmore_opts
 
 # define DEF_SPEED      "0.5"
 # define boxed_opts    xlockmore_opts
 
 # define DEF_SPEED      "0.5"
+# define DEF_BALLS     "25"
+# define DEF_BALLSIZE   "2.0"
+# define DEF_EXPLOSION "25.0f"
 # define DEFAULTS      "*delay:     20000   \n" \
                        "*showFPS:   False   \n" \
                        "*wireframe: False   \n"
 # define DEFAULTS      "*delay:     20000   \n" \
                        "*showFPS:   False   \n" \
                        "*wireframe: False   \n"
@@ -60,14 +66,23 @@ static const char sccsid[] = "@(#)boxed.c   0.9 01/09/26 xlockmore";
 #define rnd() (frand(1.0))
 
 GLfloat speed;  /* jwz -- overall speed factor applied to all motion */
 #define rnd() (frand(1.0))
 
 GLfloat speed;  /* jwz -- overall speed factor applied to all motion */
+int cfg_balls;
+GLfloat cfg_ballsize;
+GLfloat cfg_explosion;
 
 
 static XrmOptionDescRec opts[] = {
     {"-speed", ".boxed.speed", XrmoptionSepArg, 0},
 
 
 static XrmOptionDescRec opts[] = {
     {"-speed", ".boxed.speed", XrmoptionSepArg, 0},
+    {"-balls", ".boxed.balls", XrmoptionSepArg, 0},
+    {"-ballsize", ".boxed.ballsize", XrmoptionSepArg, 0},
+    {"-explosion", ".boxed.explosion", XrmoptionSepArg, 0},
 };
 
 static argtype vars[] = {
     {&speed, "speed", "Speed", DEF_SPEED, t_Float},
 };
 
 static argtype vars[] = {
     {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+    {&cfg_balls, "balls", "Balls", DEF_BALLS, t_Int},
+    {&cfg_ballsize, "ballsize", "Ball Size", DEF_BALLSIZE, t_Float},
+    {&cfg_explosion, "explosion", "Exlosion", DEF_BALLSIZE, t_Float},
 };
 
 ModeSpecOpt boxed_opts = {countof(opts), opts, countof(vars), vars, NULL};
 };
 
 ModeSpecOpt boxed_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -86,12 +101,6 @@ ModStruct   boxed_description = {
 #define TRUE 1
 #define FALSE 0
 
 #define TRUE 1
 #define FALSE 0
 
-/* rendering defines */
-
-
-/* box size */
-#define BOX_SIZE       20.0f
-
 /* camera */
 #define CAM_HEIGHT     100.0f
 #define CAMDISTANCE_MIN 20.0
 /* camera */
 #define CAM_HEIGHT     100.0f
 #define CAMDISTANCE_MIN 20.0
@@ -103,11 +112,6 @@ ModStruct   boxed_description = {
 #define SPHERE_VERTICES        (2+MESH_SIZE*MESH_SIZE*2)
 #define SPHERE_INDICES ((MESH_SIZE*4 + MESH_SIZE*4*(MESH_SIZE-1))*3)
 
 #define SPHERE_VERTICES        (2+MESH_SIZE*MESH_SIZE*2)
 #define SPHERE_INDICES ((MESH_SIZE*4 + MESH_SIZE*4*(MESH_SIZE-1))*3)
 
-#define EXPLOSION 10.0f
-#define MAXBALLS  50;
-#define NUMBALLS 12;
-#define BALLSIZE 3.0f;
-
 /*
 **-----------------------------------------------------------------------------
 **     Typedefs
 /*
 **-----------------------------------------------------------------------------
 **     Typedefs
@@ -169,6 +173,7 @@ typedef struct {
    float          cam_x_speed, cam_z_speed, cam_y_speed;
    boxed_config  config;
    float         tic;
    float          cam_x_speed, cam_z_speed, cam_y_speed;
    boxed_config  config;
    float         tic;
+   float          camtic;
    vectorf        spherev[SPHERE_VERTICES];
    GLint          spherei[SPHERE_INDICES];
    ballman        bman;
    vectorf        spherev[SPHERE_VERTICES];
    GLint          spherei[SPHERE_INDICES];
    ballman        bman;
@@ -352,8 +357,8 @@ void createball(ball *newball)
    newball->dir.z = (0.5-rnd())  * speed;
    newball->offside = 0;
    newball->bounced = FALSE;
    newball->dir.z = (0.5-rnd())  * speed;
    newball->offside = 0;
    newball->bounced = FALSE;
-   newball->radius = BALLSIZE;
-   while (r+g+b < 1.7f ) {
+   newball->radius = cfg_ballsize;
+   while (r+g+b < 1.8f ) {
       newball->color.x = r=rnd();
       newball->color.y = g=rnd();
       newball->color.z = b=rnd();
       newball->color.x = r=rnd();
       newball->color.y = g=rnd();
       newball->color.z = b=rnd();
@@ -371,7 +376,7 @@ void updateballs(ballman *bman)
 
    for (b=0;b<bman->num_balls;b++) {
 
 
    for (b=0;b<bman->num_balls;b++) {
 
-     GLfloat gravity = 0.15f * speed;
+     GLfloat gravity = 0.30f * speed;
 
       /* apply gravity */
       bman->balls[b].dir.y -= gravity;
 
       /* apply gravity */
       bman->balls[b].dir.y -= gravity;
@@ -379,10 +384,10 @@ void updateballs(ballman *bman)
       addvectors(&bman->balls[b].loc,&bman->balls[b].loc,&bman->balls[b].dir);
       /* boundary check */
       if (bman->balls[b].loc.y < bman->balls[b].radius) { /* ball onder bodem? (bodem @ y=0) */
       addvectors(&bman->balls[b].loc,&bman->balls[b].loc,&bman->balls[b].dir);
       /* boundary check */
       if (bman->balls[b].loc.y < bman->balls[b].radius) { /* ball onder bodem? (bodem @ y=0) */
-        if ((bman->balls[b].loc.x < -100.0) || 
-            (bman->balls[b].loc.x > 100.0) ||
-            (bman->balls[b].loc.z < -100.0) ||
-            (bman->balls[b].loc.z > 100.0)) {
+        if ((bman->balls[b].loc.x < -95.0) || 
+            (bman->balls[b].loc.x > 95.0) ||
+            (bman->balls[b].loc.z < -95.0) ||
+            (bman->balls[b].loc.z > 95.0)) {
            if (bman->balls[b].loc.y < -1000.0)
              createball(&bman->balls[b]);
         } else {
            if (bman->balls[b].loc.y < -1000.0)
              createball(&bman->balls[b]);
         } else {
@@ -513,6 +518,16 @@ void createtrisfromball(triman* tman, vectorf *spherev, GLint *spherei, int ind_
       scalevector(&tman->vertices[pos+1],&tman->vertices[pos+1],scale);
       scalevector(&tman->vertices[pos+2],&tman->vertices[pos+2],scale);
             
       scalevector(&tman->vertices[pos+1],&tman->vertices[pos+1],scale);
       scalevector(&tman->vertices[pos+2],&tman->vertices[pos+2],scale);
             
+      tman->vertices[pos+0].x += avgdir.x;
+      tman->vertices[pos+0].y += avgdir.y;
+      tman->vertices[pos+0].z += avgdir.z;
+      tman->vertices[pos+1].x += avgdir.x;
+      tman->vertices[pos+1].y += avgdir.y;
+      tman->vertices[pos+1].z += avgdir.z;
+      tman->vertices[pos+2].x += avgdir.x;
+      tman->vertices[pos+2].y += avgdir.y;
+      tman->vertices[pos+2].z += avgdir.z;
+
       /* bereken nieuwe richting */
       scalevector(&tman->tris[i].dir,&avgdir,explosion);
       dvect.x = (0.1f - 0.2f*rnd());
       /* bereken nieuwe richting */
       scalevector(&tman->tris[i].dir,&avgdir,explosion);
       dvect.x = (0.1f - 0.2f*rnd());
@@ -540,10 +555,10 @@ void updatetris(triman *t)
       /* boundary check */
       if (t->tris[b].far) continue;
       if (t->tris[b].loc.y < 0) { /* onder bodem ? */
       /* boundary check */
       if (t->tris[b].far) continue;
       if (t->tris[b].loc.y < 0) { /* onder bodem ? */
-        if ((t->tris[b].loc.x > -100.0f) &
-            (t->tris[b].loc.x < 100.0f) &
-            (t->tris[b].loc.z > -100.0f) &
-            (t->tris[b].loc.z < 100.0f)) {  /* in veld  */
+        if ((t->tris[b].loc.x > -95.0f) &
+            (t->tris[b].loc.x < 95.0f) &
+            (t->tris[b].loc.z > -95.0f) &
+            (t->tris[b].loc.z < 95.0f)) {  /* in veld  */
            t->tris[b].dir.y = -(t->tris[b].dir.y);
            t->tris[b].loc.y = -t->tris[b].loc.y;
            scalevector(&t->tris[b].dir,&t->tris[b].dir,0.80f); /* dampening */
            t->tris[b].dir.y = -(t->tris[b].dir.y);
            t->tris[b].loc.y = -t->tris[b].loc.y;
            scalevector(&t->tris[b].dir,&t->tris[b].dir,0.80f); /* dampening */
@@ -619,11 +634,14 @@ void freetris(triman *t)
  */
 void setdefaultconfig(boxed_config *config) 
 {
  */
 void setdefaultconfig(boxed_config *config) 
 {
-  config->numballs = NUMBALLS;
+  cfg_balls = MAX(3,MIN(40,cfg_balls));
+  cfg_ballsize = MAX(1.0f,MIN(5.0f,cfg_ballsize));
+  cfg_explosion = MAX(0.0f,MIN(50.0f,cfg_explosion));
+  config->numballs = cfg_balls;
   config->textures = TRUE;
   config->transparent = FALSE;
   config->textures = TRUE;
   config->transparent = FALSE;
-  config->explosion = 25.0f;
-  config->ballsize = BALLSIZE;
+  config->explosion = cfg_explosion;
+  config->ballsize = cfg_ballsize;
   config->camspeed = 35.0f;
 }
 
   config->camspeed = 35.0f;
 }
 
@@ -902,12 +920,13 @@ static void draw(ModeInfo * mi)
    glLoadIdentity();
    
    gp->tic += 0.01f;
    glLoadIdentity();
    
    gp->tic += 0.01f;
-
+   gp->camtic += 0.01f + 0.01f * sin(gp->tic * speed);
+   
    /* rotate camera around (0,0,0), looking at (0,0,0), up is (0,1,0) */
    /* rotate camera around (0,0,0), looking at (0,0,0), up is (0,1,0) */
-   dcam = CAMDISTANCE_MIN + (CAMDISTANCE_MAX - CAMDISTANCE_MIN) + (CAMDISTANCE_MAX - CAMDISTANCE_MIN)*cos((gp->tic/CAMDISTANCE_SPEED) * speed);
-   v1.x = dcam * sin((gp->tic/gp->cam_x_speed) * speed);
-   v1.z = dcam * cos((gp->tic/gp->cam_z_speed) * speed);
-   v1.y = CAM_HEIGHT * sin((gp->tic/gp->cam_y_speed) * speed) + 1.02 * CAM_HEIGHT;
+   dcam = CAMDISTANCE_MIN + (CAMDISTANCE_MAX - CAMDISTANCE_MIN) + (CAMDISTANCE_MAX - CAMDISTANCE_MIN)*cos((gp->camtic/CAMDISTANCE_SPEED) * speed);
+   v1.x = dcam * sin((gp->camtic/gp->cam_x_speed) * speed);
+   v1.z = dcam * cos((gp->camtic/gp->cam_z_speed) * speed);
+   v1.y = CAM_HEIGHT * sin((gp->camtic/gp->cam_y_speed) * speed) + 1.02 * CAM_HEIGHT;
    gluLookAt(v1.x,v1.y,v1.z,0.0,0.0,0.0,0.0,1.0,0.0); 
 
    if (!wire) {
    gluLookAt(v1.x,v1.y,v1.z,0.0,0.0,0.0,0.0,1.0,0.0); 
 
    if (!wire) {
@@ -1087,8 +1106,11 @@ pinit(ModeInfo * mi)
    gp->cam_y_speed = 1.0f/((float)gp->config.camspeed/250.0 + rnd()*((float)gp->config.camspeed/250.0));
    if (rnd() < 0.5f) gp->cam_x_speed = -gp->cam_x_speed;
    if (rnd() < 0.5f) gp->cam_z_speed = -gp->cam_z_speed;
    gp->cam_y_speed = 1.0f/((float)gp->config.camspeed/250.0 + rnd()*((float)gp->config.camspeed/250.0));
    if (rnd() < 0.5f) gp->cam_x_speed = -gp->cam_x_speed;
    if (rnd() < 0.5f) gp->cam_z_speed = -gp->cam_z_speed;
+
+   /* define initial cam position */
+   gp->tic = gp->camtic = rnd() * 100.0f;
    
    
-   
+   /* define tex1 (bottom plate) */
    gp->tex1 = (char *)malloc(3*width*height*sizeof(GLuint));
    texpixels = 256*256; /*width*height;*/
    texpixeldata = header_data;
    gp->tex1 = (char *)malloc(3*width*height*sizeof(GLuint));
    texpixels = 256*256; /*width*height;*/
    texpixeldata = header_data;
index 1e86dee5b21e636dcce473036102b0ccd2880cc4..d12f0b3043c2273921b98d362e959e422e38565b 100644 (file)
@@ -719,7 +719,7 @@ static void triles_set_visible(cberg_state *cberg, Trile **root, int x, int y)
 {
     Trile *parent = NULL, 
           *iter = *root;
 {
     Trile *parent = NULL, 
           *iter = *root;
-    int goleft;
+    int goleft=0;
 
     while (iter != NULL) {
         parent = iter;
 
     while (iter != NULL) {
         parent = iter;
@@ -999,7 +999,7 @@ static void find_bounds(double y, double *left, double *right, LS *ls,
 
 static void mark_visible(cberg_state *cberg)
 {
 
 static void mark_visible(cberg_state *cberg)
 {
-    double trough, peak, yval, left, right;
+    double trough, peak, yval, left=0, right=0;
     double x1,y1, x2,y2, x3,y3, x4,y4;
     int start, stop, x, y;
     LS ls[4];
     double x1,y1, x2,y2, x3,y3, x4,y4;
     int start, stop, x, y;
     LS ls[4];
diff --git a/hacks/glx/cube21-tex.h b/hacks/glx/cube21-tex.h
new file mode 100644 (file)
index 0000000..2d117d2
--- /dev/null
@@ -0,0 +1,4106 @@
+static const struct {
+  unsigned int          width;
+  unsigned int          height;
+  unsigned int          bytes_per_pixel;
+  unsigned char         pixel_data[128 * 256 * 3];
+} cubetex = {
+  128,256,3,
+  {
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,1,1,1,3,3,3,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,
+6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,
+5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,
+3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,3,3,3,
+5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,3,3,3,5,5,5,
+5,5,5,6,6,6,7,7,7,6,6,6,4,4,4,2,2,2,2,2,2,0,0,0,
+0,0,0,2,2,2,5,5,5,4,4,4,3,3,3,5,5,5,5,5,5,6,6,6,
+7,7,7,6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,
+6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,
+5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,
+3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,3,3,3,
+5,5,5,5,5,5,6,6,6,6,6,6,5,5,5,3,3,3,1,1,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,8,8,8,36,36,36,54,54,54,66,66,66,67,67,67,71,71,71,75,75,75,
+73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,
+65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,
+60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,60,60,60,
+67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,60,60,60,67,67,67,
+67,67,67,71,71,71,75,75,75,73,73,73,61,61,61,45,45,45,19,19,19,1,1,1,
+1,1,1,20,20,20,54,54,54,61,61,61,60,60,60,67,67,67,67,67,67,71,71,71,
+75,75,75,73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,
+73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,
+65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,
+60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,60,60,60,
+67,67,67,67,67,67,71,71,71,72,72,72,57,57,57,22,22,22,2,2,2,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,24,24,24,112,112,112,169,169,169,186,186,186,190,190,190,191,191,191,194,194,194,
+193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,
+187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,
+184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,184,184,184,
+187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,184,184,184,187,187,187,
+190,190,190,191,191,191,194,194,194,193,193,193,178,178,178,137,137,137,51,51,51,4,4,4,
+4,4,4,53,53,53,143,143,143,178,178,178,184,184,184,187,187,187,190,190,190,191,191,191,
+194,194,194,193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,
+193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,
+187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,
+184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,184,184,184,
+187,187,187,190,190,190,191,191,191,186,186,186,145,145,145,54,54,54,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+4,4,4,53,53,53,166,166,166,227,227,227,242,242,242,244,244,244,244,244,244,245,245,245,
+245,245,245,242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,
+242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242,
+243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242,243,243,243,
+242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242,243,243,243,242,242,242,
+244,244,244,244,244,244,245,245,245,245,245,245,233,233,233,181,181,181,62,62,62,4,4,4,
+4,4,4,63,63,63,183,183,183,233,233,233,243,243,243,242,242,242,244,244,244,244,244,244,
+245,245,245,245,245,245,242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,
+245,245,245,242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,
+242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242,
+243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242,243,243,243,
+242,242,242,244,244,244,244,244,244,236,236,236,187,187,187,71,71,71,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+6,6,6,77,77,77,196,196,196,247,247,247,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+20,20,20,120,120,120,216,216,216,250,250,250,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+35,35,35,153,153,153,231,231,231,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,
+58,58,58,180,180,180,242,242,242,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,
+96,96,96,203,203,203,248,248,248,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,23,23,
+136,136,136,225,225,225,253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,45,45,45,
+169,169,169,237,237,237,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,73,73,73,
+190,190,190,246,246,246,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,106,106,106,
+212,212,212,248,248,248,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,31,144,144,144,
+224,224,224,252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,56,56,56,175,175,175,
+240,240,240,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,80,80,80,199,199,199,
+247,247,247,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,18,18,120,120,120,219,219,219,
+252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,37,37,37,153,153,153,233,233,233,
+253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,49,49,49,168,168,168,237,237,237,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,4,4,4,64,64,64,184,184,184,243,243,243,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,112,112,112,208,208,208,249,249,249,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,38,38,38,155,155,155,231,231,231,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,5,5,5,60,60,60,181,181,181,241,241,241,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,10,10,10,90,90,90,198,198,198,248,248,248,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,18,18,18,126,126,126,220,220,220,251,251,251,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,1,1,42,42,42,162,162,162,232,232,232,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,5,5,5,72,72,72,191,191,191,247,247,247,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,16,16,16,112,112,112,216,216,216,250,250,250,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,31,31,31,151,151,151,231,231,231,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,3,3,3,55,55,55,177,177,177,242,242,242,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,6,6,6,77,77,77,196,196,196,246,246,246,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,13,13,13,106,106,106,214,214,214,250,250,250,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,32,32,32,144,144,144,227,227,227,252,252,252,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+4,4,4,56,56,56,173,173,173,239,239,239,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+7,7,7,84,84,84,201,201,201,247,247,247,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+23,23,23,129,129,129,219,219,219,252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+34,34,34,155,155,155,234,234,234,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,
+55,55,55,177,177,177,239,239,239,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,
+94,94,94,201,201,201,248,248,248,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,27,27,
+132,132,132,223,223,223,251,251,251,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,35,35,35,
+157,157,157,232,232,232,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,54,54,54,
+177,177,177,242,242,242,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,97,97,97,
+204,204,204,249,249,249,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,31,148,148,148,
+230,230,230,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,66,66,66,4,4,4,
+5,5,5,65,65,65,181,181,181,233,233,233,243,243,243,245,245,245,245,245,245,244,244,244,
+244,244,244,243,243,243,243,243,243,243,243,243,245,245,245,245,245,245,244,244,244,244,244,244,
+243,243,243,243,243,243,243,243,243,245,245,245,245,245,245,244,244,244,244,244,244,243,243,243,
+243,243,243,243,243,243,245,245,245,245,245,245,244,244,244,244,244,244,243,243,243,243,243,243,
+243,243,243,245,245,245,245,245,245,244,244,244,244,244,244,243,243,243,243,243,243,243,243,243,
+245,245,245,245,245,245,244,244,244,234,234,234,182,182,182,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,61,61,61,181,181,181,
+243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,253,253,253,248,248,248,231,231,231,169,169,169,57,57,57,4,4,4,
+4,4,4,51,51,51,138,138,138,177,177,177,187,187,187,193,193,193,194,194,194,191,191,191,
+190,190,190,187,187,187,184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,
+187,187,187,184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,
+184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,184,184,184,
+187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,184,184,184,187,187,187,
+193,193,193,194,194,194,191,191,191,181,181,181,140,140,140,50,50,50,4,4,4,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,76,76,76,194,194,194,
+246,246,246,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,252,252,252,248,248,248,
+246,246,246,237,237,237,225,225,225,202,202,202,173,173,173,111,111,111,27,27,27,1,1,1,
+1,1,1,17,17,17,50,50,50,58,58,58,65,65,65,73,73,73,75,75,75,71,71,71,
+67,67,67,67,67,67,60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,
+67,67,67,60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,
+60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,60,60,60,
+65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,60,60,60,65,65,65,
+73,73,73,75,75,75,71,71,71,65,65,65,50,50,50,17,17,17,2,2,2,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,11,11,102,102,102,210,210,210,
+248,248,248,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,253,253,253,252,252,252,245,245,245,236,236,236,221,221,221,210,210,210,
+190,190,190,170,170,170,134,134,134,86,86,86,55,55,55,24,24,24,4,4,4,0,0,0,
+0,0,0,1,1,1,4,4,4,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,
+5,5,5,5,5,5,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,
+5,5,5,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,
+3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,3,3,3,
+5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,3,3,3,5,5,5,
+6,6,6,7,7,7,6,6,6,5,5,5,4,4,4,1,1,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,36,36,36,146,146,146,224,224,224,
+252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,249,249,249,
+245,245,245,238,238,238,232,232,232,214,214,214,193,193,193,163,163,163,135,135,135,101,101,101,
+72,72,72,45,45,45,21,21,21,8,8,8,4,4,4,1,1,1,0,0,0,0,0,0,
+0,0,0,2,2,2,4,4,4,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,
+5,5,5,5,5,5,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,
+5,5,5,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,
+3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,3,3,3,
+5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,3,3,3,5,5,5,
+6,6,6,7,7,7,6,6,6,5,5,5,4,4,4,1,1,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,65,65,65,182,182,182,242,242,242,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,251,251,251,248,248,248,243,243,243,229,229,229,210,210,210,
+189,189,189,172,172,172,149,149,149,115,115,115,72,72,72,40,40,40,25,25,25,12,12,12,
+5,5,5,1,1,1,0,0,0,3,3,3,5,5,5,11,11,11,9,9,9,1,1,1,
+2,2,2,21,21,21,53,53,53,58,58,58,65,65,65,73,73,73,75,75,75,71,71,71,
+67,67,67,67,67,67,60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,
+67,67,67,60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,
+60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,60,60,60,
+65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,60,60,60,65,65,65,
+73,73,73,75,75,75,71,71,71,64,64,64,49,49,49,14,14,14,1,1,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,88,88,88,205,205,205,248,248,248,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,253,253,252,252,252,
+248,248,248,246,246,246,232,232,232,220,220,220,200,200,200,185,185,185,151,151,151,105,105,105,
+66,66,66,53,53,53,31,31,31,16,16,16,6,6,6,1,1,1,0,0,0,1,1,1,
+4,4,4,11,11,11,21,21,21,44,44,44,64,64,64,79,79,79,39,39,39,3,3,3,
+3,3,3,50,50,50,139,139,139,176,176,176,187,187,187,193,193,193,194,194,194,191,191,191,
+190,190,190,187,187,187,184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,
+187,187,187,184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,
+184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,184,184,184,
+187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,184,184,184,187,187,187,
+193,193,193,194,194,194,191,191,191,184,184,184,140,140,140,51,51,51,4,4,4,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,127,127,127,219,219,219,252,252,252,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,252,252,252,250,250,250,244,244,244,236,236,236,221,221,221,
+207,207,207,187,187,187,162,162,162,125,125,125,82,82,82,64,64,64,35,35,35,13,13,13,
+4,4,4,4,4,4,0,0,0,1,1,1,4,4,4,11,11,11,23,23,23,36,36,36,
+60,60,60,91,91,91,128,128,128,159,159,159,178,178,178,154,154,154,54,54,54,3,3,3,
+3,3,3,58,58,58,176,176,176,232,232,232,242,242,242,245,245,245,245,245,245,244,244,244,
+244,244,244,242,242,242,243,243,243,242,242,242,245,245,245,245,245,245,244,244,244,244,244,244,
+242,242,242,243,243,243,242,242,242,245,245,245,245,245,245,244,244,244,244,244,244,242,242,242,
+243,243,243,242,242,242,245,245,245,245,245,245,244,244,244,244,244,244,242,242,242,243,243,243,
+242,242,242,245,245,245,245,245,245,244,244,244,244,244,244,242,242,242,243,243,243,242,242,242,
+245,245,245,245,245,245,244,244,244,234,234,234,181,181,181,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,33,33,33,150,150,150,232,232,232,253,253,253,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,253,253,
+248,248,248,243,243,243,237,237,237,227,227,227,213,213,213,193,193,193,168,168,168,135,135,135,
+100,100,100,68,68,68,41,41,41,17,17,17,7,7,7,5,5,5,1,1,1,1,1,1,
+3,3,3,8,8,8,18,18,18,35,35,35,57,57,57,91,91,91,128,128,128,156,156,156,
+181,181,181,198,198,198,220,220,220,231,231,231,234,234,234,183,183,183,67,67,67,5,5,5,
+5,5,5,67,67,67,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,4,4,4,52,52,52,170,170,170,237,237,237,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,251,251,251,248,248,248,239,239,239,227,227,227,
+206,206,206,186,186,186,165,165,165,142,142,142,106,106,106,75,75,75,47,47,47,26,26,26,
+13,13,13,5,5,5,1,1,1,0,0,0,3,3,3,7,7,7,19,19,19,33,33,33,
+53,53,53,82,82,82,121,121,121,150,150,150,174,174,174,199,199,199,219,219,219,234,234,234,
+241,241,241,248,248,248,251,251,251,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,
+5,5,5,67,67,67,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,66,66,66,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,8,8,8,81,81,81,192,192,192,245,245,245,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,253,253,
+252,252,252,247,247,247,244,244,244,232,232,232,222,222,222,199,199,199,178,178,178,144,144,144,
+101,101,101,65,65,65,48,48,48,28,28,28,13,13,13,6,6,6,1,1,1,0,0,0,
+1,1,1,4,4,4,13,13,13,21,21,21,47,47,47,80,80,80,122,122,122,155,155,155,
+176,176,176,197,197,197,217,217,217,229,229,229,239,239,239,247,247,247,252,252,252,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,
+5,5,5,70,70,70,191,191,191,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,24,24,24,126,126,126,215,215,215,250,250,250,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,252,252,252,248,248,248,244,244,244,237,237,237,
+220,220,220,200,200,200,180,180,180,160,160,160,128,128,128,82,82,82,58,58,58,33,33,33,
+14,14,14,4,4,4,3,3,3,0,0,0,1,1,1,4,4,4,8,8,8,24,24,24,
+42,42,42,65,65,65,99,99,99,134,134,134,166,166,166,195,195,195,222,222,222,230,230,230,
+241,241,241,246,246,246,251,251,251,252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,
+7,7,7,75,75,75,194,194,194,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,1,1,42,42,42,159,159,159,232,232,232,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+251,251,251,248,248,248,241,241,241,236,236,236,222,222,222,208,208,208,191,191,191,171,171,171,
+135,135,135,93,93,93,59,59,59,39,39,39,20,20,20,7,7,7,4,4,4,1,1,1,
+1,1,1,4,4,4,8,8,8,20,20,20,33,33,33,52,52,52,81,81,81,126,126,126,
+159,159,159,186,186,186,204,204,204,224,224,224,235,235,235,248,248,248,251,251,251,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,
+6,6,6,73,73,73,193,193,193,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,4,4,4,65,65,65,186,186,186,243,243,243,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,250,250,250,247,247,247,234,234,234,
+223,223,223,200,200,200,184,184,184,161,161,161,135,135,135,100,100,100,74,74,74,52,52,52,
+28,28,28,11,11,11,3,3,3,1,1,1,0,0,0,4,4,4,6,6,6,13,13,13,
+33,33,33,59,59,59,85,85,85,126,126,126,150,150,150,170,170,170,192,192,192,215,215,215,
+232,232,232,243,243,243,248,248,248,253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,
+5,5,5,65,65,65,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,13,13,13,99,99,99,204,204,204,248,248,248,254,254,254,254,254,254,
+254,254,254,253,253,253,248,248,248,242,242,242,230,230,230,216,216,216,194,194,194,169,169,169,
+132,132,132,93,93,93,63,63,63,45,45,45,26,26,26,10,10,10,5,5,5,2,2,2,
+0,0,0,1,1,1,3,3,3,14,14,14,27,27,27,53,53,53,74,74,74,104,104,104,
+144,144,144,176,176,176,202,202,202,219,219,219,232,232,232,237,237,237,245,245,245,250,250,250,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,
+3,3,3,60,60,60,184,184,184,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,71,71,71,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,21,21,21,134,134,134,224,224,224,251,251,251,248,248,248,246,246,246,
+237,237,237,225,225,225,202,202,202,181,181,181,153,153,153,120,120,120,77,77,77,54,54,54,
+27,27,27,11,11,11,5,5,5,2,2,2,0,0,0,0,0,0,4,4,4,14,14,14,
+31,31,31,43,43,43,60,60,60,102,102,102,145,145,145,174,174,174,191,191,191,211,211,211,
+224,224,224,240,240,240,248,248,248,252,252,252,253,253,253,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,
+5,5,5,67,67,67,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,2,2,2,45,45,45,160,160,160,218,218,218,221,221,221,212,212,212,190,190,190,
+170,170,170,136,136,136,96,96,96,59,59,59,35,35,35,20,20,20,6,6,6,4,4,4,
+0,0,0,1,1,1,5,5,5,8,8,8,23,23,23,34,34,34,55,55,55,96,96,96,
+139,139,139,164,164,164,183,183,183,205,205,205,229,229,229,239,239,239,246,246,246,248,248,248,
+252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,
+5,5,5,67,67,67,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,66,66,66,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,6,6,6,64,64,64,142,142,142,156,156,156,137,137,137,103,103,103,73,73,73,
+45,45,45,23,23,23,12,12,12,4,4,4,1,1,1,0,0,0,3,3,3,7,7,7,
+12,12,12,34,34,34,67,67,67,91,91,91,133,133,133,154,154,154,176,176,176,201,201,201,
+224,224,224,233,233,233,243,243,243,248,248,248,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,
+5,5,5,70,70,70,191,191,191,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,8,8,8,47,47,47,56,56,56,40,40,40,26,26,26,13,13,13,5,5,5,
+1,1,1,0,0,0,1,1,1,4,4,4,15,15,15,31,31,31,57,57,57,80,80,80,
+109,109,109,149,149,149,182,182,182,210,210,210,222,222,222,234,234,234,239,239,239,248,248,248,
+251,251,251,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,
+7,7,7,75,75,75,194,194,194,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,3,3,3,7,7,7,3,3,3,1,1,1,0,0,0,1,1,1,5,5,5,
+11,11,11,21,21,21,39,39,39,66,66,66,108,108,108,150,150,150,179,179,179,196,196,196,
+214,214,214,227,227,227,242,242,242,248,248,248,252,252,252,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,
+6,6,6,73,73,73,193,193,193,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,11,11,11,25,25,25,43,43,43,
+74,74,74,112,112,112,148,148,148,180,180,180,209,209,209,228,228,228,241,241,241,246,246,246,
+250,250,250,252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,
+5,5,5,65,65,65,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,10,10,10,24,24,24,45,45,45,
+76,76,76,117,117,117,152,152,152,185,185,185,210,210,210,227,227,227,237,237,237,243,243,243,
+248,248,248,253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,
+3,3,3,60,60,60,184,184,184,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,71,71,71,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,4,4,4,
+13,13,13,25,25,25,47,47,47,75,75,75,106,106,106,142,142,142,165,165,165,187,187,187,
+206,206,206,227,227,227,237,237,237,248,248,248,251,251,251,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,
+5,5,5,67,67,67,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,1,1,6,6,6,13,13,13,28,28,28,49,49,49,67,67,67,
+104,104,104,143,143,143,173,173,173,199,199,199,223,223,223,232,232,232,242,242,242,249,249,249,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,
+5,5,5,67,67,67,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,66,66,66,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,5,5,5,
+15,15,15,30,30,30,54,54,54,84,84,84,130,130,130,157,157,157,179,179,179,204,204,204,
+229,229,229,239,239,239,246,246,246,248,248,248,252,252,252,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,
+5,5,5,70,70,70,191,191,191,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,0,0,0,4,4,4,8,8,8,24,24,24,35,35,35,57,57,57,100,100,100,
+144,144,144,174,174,174,191,191,191,210,210,210,221,221,221,236,236,236,245,245,245,252,252,252,
+253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,
+7,7,7,75,75,75,194,194,194,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,3,3,3,14,14,14,
+26,26,26,47,47,47,73,73,73,101,101,101,135,135,135,163,163,163,193,193,193,214,214,214,
+231,231,231,237,237,237,245,245,245,250,250,250,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,
+6,6,6,73,73,73,193,193,193,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,1,1,1,5,5,5,12,12,12,25,25,25,45,45,45,74,74,74,114,114,114,
+146,146,146,171,171,171,191,191,191,213,213,213,230,230,230,242,242,242,248,248,248,253,253,253,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,
+5,5,5,65,65,65,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,6,6,6,16,16,16,
+32,32,32,51,51,51,71,71,71,117,117,117,152,152,152,182,182,182,203,203,203,224,224,224,
+235,235,235,247,247,247,249,249,249,252,252,252,253,253,253,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,
+3,3,3,60,60,60,184,184,184,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,71,71,71,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,4,4,4,5,5,5,19,19,19,36,36,36,60,60,60,98,98,98,133,133,133,
+165,165,165,191,191,191,214,214,214,223,223,223,236,236,236,245,245,245,251,251,251,252,252,252,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,
+5,5,5,67,67,67,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,4,4,4,13,13,13,20,20,20,
+41,41,41,75,75,75,110,110,110,138,138,138,167,167,167,194,194,194,217,217,217,229,229,229,
+236,236,236,243,243,243,249,249,249,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,
+5,5,5,67,67,67,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,66,66,66,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,6,6,6,16,16,16,26,26,26,51,51,51,80,80,80,113,113,113,144,144,144,
+162,162,162,184,184,184,208,208,208,230,230,230,241,241,241,248,248,248,251,251,251,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,
+5,5,5,70,70,70,191,191,191,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,7,7,7,14,14,14,31,31,31,
+47,47,47,63,63,63,113,113,113,155,155,155,182,182,182,200,200,200,221,221,221,231,231,231,
+245,245,245,250,250,250,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,
+7,7,7,75,75,75,194,194,194,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+3,3,3,4,4,4,20,20,20,39,39,39,62,62,62,92,92,92,128,128,128,159,159,159,
+186,186,186,212,212,212,230,230,230,242,242,242,237,237,237,190,190,190,73,73,73,6,6,6,
+6,6,6,73,73,73,193,193,193,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,5,5,5,11,11,11,21,21,21,39,39,39,
+67,67,67,108,108,108,150,150,150,179,179,179,188,188,188,157,157,157,57,57,57,4,4,4,
+5,5,5,62,62,62,181,181,181,232,232,232,243,243,243,243,243,243,244,244,244,244,244,244,
+245,245,245,245,245,245,243,243,243,243,243,243,243,243,243,244,244,244,244,244,244,245,245,245,
+245,245,245,243,243,243,243,243,243,243,243,243,244,244,244,244,244,244,245,245,245,245,245,245,
+243,243,243,243,243,243,243,243,243,244,244,244,244,244,244,245,245,245,245,245,245,243,243,243,
+243,243,243,243,243,243,244,244,244,244,244,244,245,245,245,245,245,245,243,243,243,243,243,243,
+243,243,243,244,244,244,244,244,244,236,236,236,187,187,187,71,71,71,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+4,4,4,15,15,15,31,31,31,58,58,58,76,76,76,76,76,76,33,33,33,2,2,2,
+3,3,3,47,47,47,139,139,139,178,178,178,184,184,184,187,187,187,190,190,190,191,191,191,
+194,194,194,193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,
+193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,
+187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,
+184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,184,184,184,
+187,187,187,190,190,190,191,191,191,186,186,186,145,145,145,54,54,54,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,2,2,2,6,6,6,8,8,8,8,8,8,1,1,1,
+2,2,2,22,22,22,55,55,55,61,61,61,60,60,60,67,67,67,67,67,67,71,71,71,
+75,75,75,73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,
+73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,
+65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,
+60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,60,60,60,
+67,67,67,67,67,67,71,71,71,72,72,72,57,57,57,21,21,21,2,2,2,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,2,2,2,5,5,5,4,4,4,3,3,3,5,5,5,5,5,5,6,6,6,
+7,7,7,6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,
+6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,
+5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,
+3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,3,3,3,
+5,5,5,5,5,5,6,6,6,6,6,6,5,5,5,2,2,2,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,2,2,5,5,5,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,
+5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,
+5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,1,1,1,
+3,3,3,23,23,23,54,54,54,65,65,65,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,
+68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,
+69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,
+68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,
+69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,65,65,65,53,53,53,23,23,23,2,2,2,
+5,5,5,54,54,54,141,141,141,181,181,181,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,
+190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,
+190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,188,188,188,190,190,190,189,189,189,182,182,182,140,140,140,51,51,51,4,4,4,
+5,5,5,66,66,66,182,182,182,234,234,234,244,244,244,244,244,244,244,244,244,242,242,242,
+245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,
+242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,
+244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,
+244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,
+244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,
+244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,
+242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,
+245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,
+242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,
+244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,
+244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,
+244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,
+244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,
+242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,
+245,245,245,242,242,242,244,244,244,244,244,244,234,234,234,181,181,181,65,65,65,5,5,5,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,65,65,65,181,181,181,234,234,234,244,244,244,244,244,244,244,244,244,243,243,243,
+245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,
+243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,
+244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,
+244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,
+244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,
+244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,
+243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,
+245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,
+243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,242,242,242,
+242,242,242,242,242,242,243,243,243,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,
+244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,
+244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,
+244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,
+243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,
+245,245,245,243,243,243,244,244,244,244,244,244,234,234,234,182,182,182,65,65,65,5,5,5,
+3,3,3,50,50,50,139,139,139,183,183,183,189,189,189,189,189,189,190,190,190,188,188,188,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,
+188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,188,188,188,181,181,181,
+173,173,173,173,173,173,181,181,181,189,189,189,188,188,188,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,
+188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,
+189,189,189,189,189,189,189,189,189,189,189,189,181,181,181,141,141,141,51,51,51,4,4,4,
+2,2,2,17,17,17,50,50,50,64,64,64,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,
+68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,
+69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,61,61,61,56,56,56,
+46,46,46,46,46,46,54,54,54,64,64,64,69,69,69,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,
+69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,65,65,65,52,52,52,21,21,21,2,2,2,
+0,0,0,1,1,1,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,
+5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,
+1,1,1,1,1,1,3,3,3,4,4,4,5,5,5,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,4,4,4,2,2,2,0,0,0,
+0,0,0,1,1,1,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,
+5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,2,2,2,
+0,0,0,0,0,0,2,2,2,4,4,4,5,5,5,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,3,3,3,2,2,2,0,0,0,
+1,1,1,16,16,16,50,50,50,65,65,65,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,
+68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,
+69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,67,67,67,49,49,49,19,19,19,
+1,1,1,1,1,1,19,19,19,50,50,50,67,67,67,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,
+69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,65,65,65,51,51,51,21,21,21,2,2,2,
+4,4,4,50,50,50,138,138,138,183,183,183,189,189,189,189,189,189,190,190,190,188,188,188,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,
+188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,181,181,181,140,140,140,51,51,51,
+4,4,4,4,4,4,51,51,51,141,141,141,181,181,181,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,
+188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,
+189,189,189,189,189,189,189,189,189,189,189,189,182,182,182,142,142,142,50,50,50,4,4,4,
+5,5,5,65,65,65,181,181,181,234,234,234,244,244,244,244,244,244,244,244,244,242,242,242,
+245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,
+242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,
+244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,
+244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,
+244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,
+244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,
+242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,
+245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,
+242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,232,232,232,183,183,183,65,65,65,
+4,4,4,4,4,4,65,65,65,183,183,183,232,232,232,245,245,245,242,242,242,244,244,244,
+244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,
+244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,
+244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,
+242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,
+245,245,245,242,242,242,244,244,244,244,244,244,233,233,233,180,180,180,66,66,66,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,
+6,6,6,6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,
+4,4,4,4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,
+6,6,6,6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,
+5,5,5,5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,
+6,6,6,6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,
+4,4,4,4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,
+6,6,6,6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,
+5,5,5,5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,
+6,6,6,6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,
+4,4,4,4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,
+6,6,6,6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,
+5,5,5,5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,
+6,6,6,6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,
+4,4,4,4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,
+6,6,6,6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,
+5,5,5,5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,65,65,65,181,181,181,234,234,234,244,244,244,244,244,244,243,243,243,245,245,245,
+243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,
+244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,
+244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,
+244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,
+244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,
+243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,
+245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,
+243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,
+244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,235,235,235,181,181,181,65,65,65,
+5,5,5,5,5,5,65,65,65,182,182,182,234,234,234,244,244,244,243,243,243,245,245,245,
+243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,
+244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,
+244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,
+244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,
+244,244,244,243,243,243,245,245,245,243,243,243,234,234,234,181,181,181,65,65,65,4,4,4,
+4,4,4,51,51,51,140,140,140,182,182,182,189,189,189,190,190,190,188,188,188,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,
+188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,182,182,182,141,141,141,50,50,50,
+3,3,3,3,3,3,49,49,49,138,138,138,181,181,181,189,189,189,189,189,189,189,189,189,
+188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,
+190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,188,188,188,182,182,182,141,141,141,54,54,54,5,5,5,
+2,2,2,22,22,22,53,53,53,65,65,65,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,
+68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,
+69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,
+68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,62,62,62,52,52,52,19,19,19,
+2,2,2,2,2,2,17,17,17,48,48,48,64,64,64,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,
+68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,66,66,66,54,54,54,22,22,22,2,2,2,
+1,1,1,3,3,3,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,
+5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,
+5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,5,5,5,1,1,1,
+0,0,0,0,0,0,1,1,1,4,4,4,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,
+5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,3,3,3,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100
+}
+};
diff --git a/hacks/glx/cube21.c b/hacks/glx/cube21.c
new file mode 100644 (file)
index 0000000..79423e6
--- /dev/null
@@ -0,0 +1,788 @@
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Cube 21 - a Rubik-like puzzle.  It changes its shape and has more than
+ * 200 configurations.  It is known better as Square-1, but it is called
+ * Cube 21 in the Czech republic, where it was invented in 1992.
+ * 
+ * This file is derived from cage.c,
+ * "cage --- the Impossible Cage, an Escher like scene",
+ * by Marcelo F. Vienna,
+ * parts from gltext.c by Jamie Zawinski
+ *
+ * Vaclav (Vasek) Potocek
+ * vasek.potocek@post.cz
+ */
+
+/* TODO:
+ *  Future: some simple "solve mode"
+ *  Future: new light model, less ambient light
+ *  Maybe: use rotator and trackball
+ *  Maybe: display lists - seem impossible with colors
+ */
+
+/*-
+ * Texture mapping is only available on RGBA contexts, Mono and color index
+ * visuals DO NOT support texture mapping in OpenGL.
+ *
+ * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture
+ * mapping should work on PseudoColor, DirectColor, TrueColor using Mesa. Mono
+ * is not officially supported for both OpenGL and Mesa, but seems to not crash
+ * Mesa.
+ *
+ * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know).
+ */
+
+#define PROGCLASS     "Cube21"
+#define HACK_INIT     init_cube21
+#define HACK_DRAW     draw_cube21
+#define HACK_RESHAPE  reshape_cube21
+#define cube21_opts   xlockmore_opts
+
+#define DEF_XYSPEED   "1.0"
+#define DEF_TSPEED    "3.0"
+#define DEF_WSPEED    "1.0"
+#define DEF_TWAIT     "40.0"
+#define DEF_SIZE      "0.7"
+#define DEF_COLMODE   "(none)"
+
+#define DEFAULTS   "*delay:         20000         \n" \
+                   "*showFPS:       False         \n" \
+                   "*wireframe:     False         \n"
+
+#include "xlockmore.h"
+
+#ifdef USE_GL
+
+#include <GL/glu.h>
+#include "cube21-tex.h"
+
+#ifdef Pi
+#undef Pi
+#endif
+#define Pi      M_PI
+
+#define SHUFFLE 100
+
+#define COS15   0.9659258263
+#define SIN15   0.2588190451
+#define COS30   0.8660254038
+#define SIN30   0.5000000000
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define rnd01() (random()%2)
+#define rndcolor() (frand(0.5)+0.3)
+
+/*************************************************************************/
+
+static Bool wander, spin, wire, tex, rndstart, cmat;
+static float spinspeed, tspeed, wspeed, twait, size;
+static char *colmode_s;
+static int colmode;
+
+static argtype vars[] = {
+  { &spin,      "spin",        "Spin",        "True",      t_Bool},
+  { &wander,    "wander",      "Wander",      "True",      t_Bool},
+  { &rndstart,  "randomize",   "Randomize",   "True",      t_Bool},
+  { &tex,       "texture",     "Texture",     "True",      t_Bool},
+  { &spinspeed, "spinspeed",   "SpinSpeed",   DEF_XYSPEED, t_Float},
+  { &tspeed,    "rotspeed",    "RotSpeed",    DEF_TSPEED,  t_Float},
+  { &wspeed,    "wanderspeed", "WanderSpeed", DEF_WSPEED,  t_Float},
+  { &twait,     "wait",        "Wait",        DEF_TWAIT,   t_Float},
+  { &size,      "cubesize",    "CubeSize",    DEF_SIZE,    t_Float},
+  { &colmode_s, "colormode",   "ColorMode",   DEF_COLMODE, t_String}
+};
+
+static XrmOptionDescRec opts[] = {
+  { "-spin",        ".spin",        XrmoptionNoArg,  "True" },
+  { "+spin",        ".spin",        XrmoptionNoArg,  "False" },
+  { "-wander",      ".wander",      XrmoptionNoArg,  "True" },
+  { "+wander",      ".wander",      XrmoptionNoArg,  "False" },
+  { "-randomize",   ".randomize",   XrmoptionNoArg,  "True" },
+  { "+randomize",   ".randomize",   XrmoptionNoArg,  "False" },
+  { "-texture",     ".texture",     XrmoptionNoArg,  "True" },
+  { "+texture",     ".texture",     XrmoptionNoArg,  "False" },
+  { "-spinspeed",   ".spinspeed",   XrmoptionSepArg, 0 },
+  { "-wanderspeed", ".wanderspeed", XrmoptionSepArg, 0 },
+  { "-rotspeed",    ".rotspeed",    XrmoptionSepArg, 0 },
+  { "-wait",        ".wait",        XrmoptionSepArg, 0 },
+  { "-cubesize",    ".cubesize",    XrmoptionSepArg, 0 },
+  { "-colormode",   ".colormode",   XrmoptionSepArg, DEF_COLMODE }
+};
+
+ModeSpecOpt cube21_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct   cube21_description =
+{ "cube21", "init_cube21", "draw_cube21", "release_cube21",
+  "draw_cube21", "change_cube21", NULL, &cube21_opts,
+  25000, 1, 1, 1, 1.0, 4, "",
+  "Shows randomly shuffling Cube 21", 0, NULL
+};
+#endif
+
+typedef enum {
+  CUBE21_STATE_BASIC,
+  CUBE21_PAUSE1 = CUBE21_STATE_BASIC,
+  CUBE21_ROT_BASE,
+  CUBE21_ROT_TOP = CUBE21_ROT_BASE,
+  CUBE21_ROT_BOTTOM,
+  CUBE21_PAUSE2,
+  CUBE21_HALF_BASE,
+  CUBE21_HALF1 = CUBE21_HALF_BASE,
+  CUBE21_HALF2
+} cube21_state;
+
+typedef enum {
+  CUBE21_COLOR_WHITE,
+  CUBE21_COLOR_RANDOM,
+  CUBE21_COLOR_SILVER,
+  CUBE21_COLOR_TWORND,
+  CUBE21_COLOR_CLASSIC,
+  CUBE21_COLOR_SIXRND
+} cube21_cmode;
+
+typedef int pieces_t[2][13];
+typedef int cind_t[5][12];
+typedef GLfloat col_t[6][3];
+
+typedef struct {
+  GLXContext    *glx_context;
+  GLfloat       ratio;
+  cube21_state  state;          /* type of "rotation" - shuffling */
+  GLfloat       xrot, yrot;     /* "spin" - object rotation around axis */
+  GLfloat       posarg;         /* position argument (for sine function) */
+  GLfloat       t, tmax;        /* rotation clock */
+  int           hf[2], fr[2];   /* half flipped / face rotated flags */
+  int           rface, ramount; /* selected face and amount of rotation in multiplies of 30deg */
+  int           pieces[2][13];  /* locations of "narrow" and "wide" pieces */
+  int           cind[5][12];    /* color indices */
+  GLfloat       colors[6][3];   /* color map */
+} cube21_conf;
+
+static cube21_conf *cube21 = NULL;
+
+static GLfloat shininess = 20.0;
+static GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};
+static GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static GLfloat position0[] = {1.0, 1.0, 1.0, 0.0};
+static GLfloat position1[] = {-1.0, -1.0, 1.0, 0.0};
+static GLfloat lmodel_ambient[] = {0.1, 0.1, 0.1, 1.0};
+static GLfloat material_ambient[] = {0.7, 0.7, 0.7, 1.0};
+static GLfloat material_diffuse[] = {0.7, 0.7, 0.7, 1.0};
+static GLfloat material_specular[] = {0.2, 0.2, 0.2, 1.0};
+static GLfloat color_inner[] = {1.0, 1.0, 1.0};
+static GLfloat texc[8] = {0.0}, posc[6];
+static GLfloat zpos = -18.0;
+
+/*************************************************************************/
+
+static void find_matches(pieces_t pieces, int matches[12], int s) {
+  int i, j = 1;
+  for(i = 1; i<6; i++) {
+    if(pieces[s][i] && pieces[s][i+6]) {
+      matches[j++] = i;
+    }
+  }
+  matches[0] = j;
+  for(i = 1; i<matches[0]; i++) {
+    matches[j++] = matches[i]-6;
+  }
+  matches[j++] = 6;
+  matches[0] = j;
+}
+
+static void rot_face(pieces_t pieces, cind_t colors, int s, int o) {
+  int i;
+  int tmp[12], tmpc[2][12];
+  int c0 = 2*s, c1 = c0+1;
+  for(i = 0; i<12; i++) {
+    tmp[i] = pieces[s][i];
+    tmpc[0][i] = colors[c0][i];
+    tmpc[1][i] = colors[c1][i];
+  }
+  if(o<0) o += 12;
+  for(i = 0; i<12; i++, o++) {
+    if(o==12) o = 0;
+    pieces[s][i] = tmp[o];
+    colors[c0][i] = tmpc[0][o];
+    colors[c1][i] = tmpc[1][o];
+  }
+}
+
+static void rot_halves(pieces_t pieces, cind_t colors, int hf[2], int s) {
+  int ss = 6*s, i, j, k, t;
+  for(i = 0; i<6; i++) {
+    j = ss+i; k = ss+6-i;
+    t = pieces[0][j];
+    pieces[0][j] = pieces[1][k];
+    pieces[1][k] = t;
+    k--;
+    t = colors[0][j];
+    colors[0][j] = colors[2][k];
+    colors[2][k] = t;
+    t = colors[1][j];
+    colors[1][j] = colors[3][k];
+    colors[3][k] = t;
+  }
+  hf[s] ^= 1;
+}
+
+static void randomize(cube21_conf *cp) {
+  int i, j, s;
+  int matches[12];
+  for(i = 0; i<SHUFFLE; i++) {
+    s = rnd01();
+    find_matches(cp->pieces, matches, s);
+    j = matches[0]-1;
+    j = random()%j;
+    j = matches[j+1];
+    rot_face(cp->pieces, cp->cind, s, j);
+    s = rnd01();
+    rot_halves(cp->pieces, cp->cind, cp->hf, s);
+  }
+}
+
+static void finish(cube21_conf *cp) {
+  int j, s;
+  int matches[12];
+  switch(cp->state) {
+    case CUBE21_PAUSE1:
+      s = rnd01();
+      find_matches(cp->pieces, matches, s);
+      j = matches[0]-1;
+      j = random()%j;
+      j = matches[j+1];
+      if(j==6 && rnd01()) j = -6;
+      cp->state = CUBE21_ROT_BASE+s;
+      cp->tmax = 30.0*abs(j);
+      cp->fr[0] = cp->fr[1] = 0;
+      cp->rface = s;
+      cp->ramount = j;
+      break;
+    case CUBE21_ROT_TOP:
+    case CUBE21_ROT_BOTTOM:
+      rot_face(cp->pieces, cp->cind, s = cp->rface, cp->ramount);
+      cp->fr[s] = 1;
+      s ^= 1;
+      if(!cp->fr[s] && rnd01()) {
+        find_matches(cp->pieces, matches, s);
+        j = matches[0]-1;
+        j = random()%j;
+        j = matches[j+1];
+        if(j==6 && rnd01()) j = -6;
+        cp->state = CUBE21_ROT_BASE+s;
+        cp->tmax = 30.0*abs(j);
+        cp->rface = s;
+        cp->ramount = j;        
+        break;
+      } else {
+        cp->state = CUBE21_PAUSE2;
+        cp->tmax = twait;
+        break;
+      }
+    case CUBE21_PAUSE2:
+      s = rnd01();
+      cp->ramount = -rnd01();       /* 0 or -1, only sign is significant in this case */
+      cp->state = CUBE21_HALF_BASE+s;
+      cp->tmax = 180.0;
+      cp->rface = s;
+      break;
+    case CUBE21_HALF1:
+    case CUBE21_HALF2:
+      rot_halves(cp->pieces, cp->cind, cp->hf, cp->rface);
+      cp->state = CUBE21_PAUSE1;
+      cp->tmax = twait;
+      break;
+  }
+  cp->t = 0;
+}
+
+static void draw_narrow_piece(GLfloat s, int c1, int c2, col_t colors) {
+  GLfloat s1 = posc[0]*s;
+  glBegin(GL_TRIANGLES);
+  glNormal3f(0.0, 0.0, s);
+  if(cmat) glColor3fv(colors[c1]);
+  glTexCoord2f(0.0, 0.25);     glVertex3f(0.0, 0.0, s);
+  glTexCoord2f(0.5, texc[1]);  glVertex3f(posc[1], 0.0, s);
+  glTexCoord2f(0.5, texc[2]);  glVertex3f(posc[2], posc[3], s);
+  glNormal3f(0.0, 0.0, -s);
+  if(cmat) glColor3fv(color_inner);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(0.0, 0.0, s1);
+  glVertex3f(posc[1], 0.0, s1);
+  glVertex3f(posc[2], posc[3], s1);
+  glEnd();
+  glBegin(GL_QUADS);
+  glNormal3f(0.0, -1.0, 0.0);
+  if(cmat) glColor3fv(color_inner);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(0.0, 0.0, s);
+  glVertex3f(posc[1], 0.0, s);
+  glVertex3f(posc[1], 0.0, s1);
+  glVertex3f(0.0, 0.0, s1);
+  glNormal3f(COS15, SIN15, 0.0);
+  if(cmat) glColor3fv(colors[c2]);
+  glTexCoord2f(0.5, texc[1]);      glVertex3f(posc[1], 0.0, s);
+  glTexCoord2f(0.5, texc[2]);      glVertex3f(posc[2], posc[3], s);
+  glTexCoord2f(texc[4], texc[2]);  glVertex3f(posc[2], posc[3], s1);
+  glTexCoord2f(texc[4], texc[1]);  glVertex3f(posc[1], 0.0, s1);
+  glNormal3f(-SIN30, COS30, 0.0);
+  if(cmat) glColor3fv(color_inner);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(0.0, 0.0, s);
+  glVertex3f(posc[2], posc[3], s);
+  glVertex3f(posc[2], posc[3], s1);
+  glVertex3f(0.0, 0.0, s1);
+  glEnd();
+  glRotatef(30.0, 0.0, 0.0, 1.0);
+}
+
+static void draw_wide_piece(GLfloat s, int c1, int c2, int c3, col_t colors) {
+  GLfloat s1 = posc[0]*s;
+  glBegin(GL_TRIANGLES);
+  glNormal3f(0.0, 0.0, s);
+  if(cmat) glColor3fv(colors[c1]);
+  glTexCoord2f(0.0, 0.25);     glVertex3f(0.0, 0.0, s);
+  glTexCoord2f(0.5, texc[1]);  glVertex3f(posc[1], 0.0, s);
+  glTexCoord2f(0.5, 0.0);      glVertex3f(posc[4], posc[5], s);
+  glTexCoord2f(0.5, 0.0);      glVertex3f(posc[4], posc[5], s);
+  glTexCoord2f(texc[3], 0.0);  glVertex3f(posc[3], posc[2], s);
+  glTexCoord2f(0.0, 0.25);     glVertex3f(0.0, 0.0, s);
+  glNormal3f(0.0, 0.0, -s);
+  if(cmat) glColor3fv(color_inner);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(0.0, 0.0, s1);
+  glVertex3f(posc[1], 0.0, s1);
+  glVertex3f(posc[4], posc[5], s1);
+  glVertex3f(posc[4], posc[5], s1);
+  glVertex3f(posc[3], posc[2], s1);
+  glVertex3f(0.0, 0.0, s1);
+  glEnd();
+  glBegin(GL_QUADS);
+  glNormal3f(0.0, -1.0, 0);
+  if(cmat) glColor3fv(color_inner);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(0.0, 0.0, s);
+  glVertex3f(posc[1], 0.0, s);
+  glVertex3f(posc[1], 0.0, s1);
+  glVertex3f(0.0, 0.0, s1);
+  glNormal3f(COS15, -SIN15, 0.0);
+  if(cmat) glColor3fv(colors[c2]);
+  glTexCoord2f(0.5, texc[1]);      glVertex3f(posc[1], 0.0, s);
+  glTexCoord2f(0.5, 0.0);          glVertex3f(posc[4], posc[5], s);
+  glTexCoord2f(texc[4], 0.0);      glVertex3f(posc[4], posc[5], s1);
+  glTexCoord2f(texc[4], texc[1]);  glVertex3f(posc[1], 0.0, s1);
+  glNormal3f(SIN15, COS15, 0.0);
+  if(cmat) glColor3fv(colors[c3]);
+  glTexCoord2f(0.5, texc[1]);      glVertex3f(posc[4], posc[5], s);
+  glTexCoord2f(0.5, 0.0);          glVertex3f(posc[3], posc[2], s);
+  glTexCoord2f(texc[4], 0.0);      glVertex3f(posc[3], posc[2], s1);
+  glTexCoord2f(texc[4], texc[1]);  glVertex3f(posc[4], posc[5], s1);
+  glNormal3f(-COS30, SIN30, 0.0);
+  if(cmat) glColor3fv(color_inner);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(0.0, 0.0, s);
+  glVertex3f(posc[3], posc[2], s);
+  glVertex3f(posc[3], posc[2], s1);
+  glVertex3f(0.0, 0.0, s1);
+  glEnd();
+  glRotatef(60.0, 0.0, 0.0, 1.0);
+}
+
+static void draw_middle_piece(int s, cind_t cind, col_t colors) {
+  s *= 6;
+  glBegin(GL_QUADS);
+  if(cmat) glColor3fv(color_inner);
+  glNormal3f(0.0, 0.0, 1.0);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(posc[1], 0.0, posc[0]);
+  glVertex3f(posc[4], posc[5], posc[0]);
+  glVertex3f(-posc[5], posc[4], posc[0]);
+  glVertex3f(-posc[1], 0.0, posc[0]);
+  glNormal3f(0.0, 0.0, -1.0);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(posc[1], 0.0, -posc[0]);
+  glVertex3f(posc[4], posc[5], -posc[0]);
+  glVertex3f(-posc[5], posc[4], -posc[0]);
+  glVertex3f(-posc[1], 0.0, -posc[0]);
+  glNormal3f(0.0, -1.0, 0.0);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(-posc[1], 0.0, posc[0]);
+  glVertex3f(posc[1], 0.0, posc[0]);
+  glVertex3f(posc[1], 0.0, -posc[0]);
+  glVertex3f(-posc[1], 0.0, -posc[0]);
+  glNormal3f(COS15, -SIN15, 0.0);
+  if(cmat) glColor3fv(colors[cind[4][s]]);
+  glTexCoord2f(texc[5], 0.5);      glVertex3f(posc[1], 0.0, posc[0]);
+  glTexCoord2f(1.0, 0.5);          glVertex3f(posc[4], posc[5], posc[0]);
+  glTexCoord2f(1.0, texc[7]);      glVertex3f(posc[4], posc[5], -posc[0]);
+  glTexCoord2f(texc[5], texc[7]);  glVertex3f(posc[1], 0.0, -posc[0]);
+  glNormal3f(SIN15, COS15, 0.0);
+  if(cmat) glColor3fv(colors[cind[4][s+1]]);
+  glTexCoord2f(0.0, 0.5);      glVertex3f(posc[4], posc[5], posc[0]);
+  glTexCoord2f(1.0, 0.5);      glVertex3f(-posc[5], posc[4], posc[0]);
+  glTexCoord2f(1.0, texc[6]);  glVertex3f(-posc[5], posc[4], -posc[0]);
+  glTexCoord2f(0.0, texc[6]);  glVertex3f(posc[4], posc[5], -posc[0]);
+  glNormal3f(-COS15, SIN15, 0.0);
+  if(cmat) glColor3fv(colors[cind[4][s+4]]);
+  glTexCoord2f(0.0, 0.5);          glVertex3f(-posc[5], posc[4], posc[0]);
+  glTexCoord2f(texc[5], 0.5);      glVertex3f(-posc[1], 0.0, posc[0]);
+  glTexCoord2f(texc[5], texc[7]);  glVertex3f(-posc[1], 0.0, -posc[0]);
+  glTexCoord2f(0.0, texc[7]);      glVertex3f(-posc[5], posc[4], -posc[0]);
+  glEnd();
+}
+
+static void draw_middle(cube21_conf *cp) {
+  if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+  draw_middle_piece(0, cp->cind, cp->colors);
+  if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+  glRotatef(180.0, 0.0, 0.0, 1.0);
+  if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
+  draw_middle_piece(1, cp->cind, cp->colors);
+  if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
+}
+
+static void draw_half_face(cube21_conf *cp, int s, int o) {
+  int i, s1 = 1-s*2, s2 = s*2;
+  for(i = o; i<o+6; i++) {
+    if(cp->pieces[s][i+1])
+      draw_narrow_piece(s1, cp->cind[s2][i], cp->cind[s2+1][i], cp->colors);
+    else {
+      draw_wide_piece(s1, cp->cind[s2][i], cp->cind[s2+1][i], cp->cind[s2+1][i+1], cp->colors);
+      i++;
+    }
+  }
+}
+
+static void draw_top_face(cube21_conf *cp) {
+  draw_half_face(cp, 0, 0);
+  draw_half_face(cp, 0, 6);
+}
+
+static void draw_bottom_face(cube21_conf *cp) {
+  draw_half_face(cp, 1, 0);
+  draw_half_face(cp, 1, 6);
+}
+
+static Bool draw_main(cube21_conf *cp) {
+  GLfloat theta = cp->ramount<0?cp->t:-cp->t;
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+  glLoadIdentity();
+  if(wander)
+    glTranslatef(3.0*cp->ratio*sin(13.0*cp->posarg), 3.0*sin(17.0*cp->posarg), zpos);
+  else
+    glTranslatef(0, 0, zpos);
+  glScalef(size, size, size);
+  glRotatef(cp->xrot, 1.0, 0.0, 0.0);
+  glRotatef(cp->yrot, 0.0, 1.0, 0.0);
+  if(wire) glColor3f(0.7, 0.7, 0.7);
+  switch(cp->state) {
+    case CUBE21_PAUSE1:
+    case CUBE21_PAUSE2:
+      draw_top_face(cp);
+      draw_bottom_face(cp);
+      draw_middle(cp);
+      break;
+    case CUBE21_ROT_TOP:
+      glRotatef(theta, 0.0, 0.0, 1.0);
+      draw_top_face(cp);
+      glRotatef(-theta, 0.0, 0.0, 1.0);
+      draw_bottom_face(cp);
+      draw_middle(cp);
+      break;
+    case CUBE21_ROT_BOTTOM:
+      draw_top_face(cp);
+      glRotatef(theta, 0.0, 0.0, 1.0);
+      draw_bottom_face(cp);
+      glRotatef(-theta, 0.0, 0.0, 1.0);
+      draw_middle(cp);
+      break;
+    case CUBE21_HALF1:
+      glRotatef(theta, 0.0, 1.0, 0.0);
+    case CUBE21_HALF2:
+      draw_half_face(cp, 0, 0);
+      glRotatef(-180.0, 0.0, 0.0, 1.0);
+      draw_half_face(cp, 1, 0);
+      glRotatef(-180.0, 0.0, 0.0, 1.0);
+      if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+      draw_middle_piece(0, cp->cind, cp->colors);
+      if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+      if(cp->state==CUBE21_HALF1)
+        glRotatef(-theta, 0.0, 1.0, 0.0);
+      else
+        glRotatef(theta, 0.0, 1.0, 0.0);
+      glRotatef(180.0, 0.0, 0.0, 1.0);
+      draw_half_face(cp, 0, 6);
+      glRotatef(-180.0, 0.0, 0.0, 1.0);
+      draw_half_face(cp, 1, 6);
+      glRotatef(-180.0, 0.0, 0.0, 1.0);
+      if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
+      draw_middle_piece(1, cp->cind, cp->colors);
+      break;
+  }
+  if(spin) {
+    if((cp->xrot += spinspeed)>360.0) cp->xrot -= 360.0;
+    if((cp->yrot += spinspeed)>360.0) cp->yrot -= 360.0;
+  }
+  if(wander)
+    if((cp->posarg += wspeed/1000.0)>360.0) cp->posarg -= 360.0;
+  if((cp->t += tspeed)>cp->tmax) finish(cp);
+  return True;
+}
+
+void parse_colmode(void) {
+  if(!colmode_s) {
+    colmode = CUBE21_COLOR_WHITE;
+    return;
+  }
+  if(strstr(colmode_s, "se") || strstr(colmode_s, "sil")) colmode = CUBE21_COLOR_SILVER;
+  else if(strstr(colmode_s, "ce") || strstr(colmode_s, "cla")) colmode = CUBE21_COLOR_CLASSIC;
+  else if(strstr(colmode_s, "2") || strstr(colmode_s, "two")) colmode = CUBE21_COLOR_TWORND;
+  else if(strstr(colmode_s, "6") || strstr(colmode_s, "six")) colmode = CUBE21_COLOR_SIXRND;
+  else if(strstr(colmode_s, "1") || strstr(colmode_s, "ran") || strstr(colmode_s, "rnd")) colmode = CUBE21_COLOR_RANDOM;
+  else colmode = CUBE21_COLOR_WHITE;
+}
+
+static void init_texc(void) {
+  GLfloat p = tan(Pi/12);
+  if(texc[0]) return;
+  /* Some significant non-trivial coordinates of the texture... */
+  texc[0] = p;                     /* 0.268 */
+  texc[1] = (1.0-p)/4;             /* 0.183 */
+  texc[2] = (1.0+p)/4;             /* 0.317 */
+  texc[3] = p/2;                   /* 0.134 */
+  texc[4] = 1.0-p/2;               /* 0.866 = sqrt(3)/2 */
+  texc[5] = (1.0+p)/2;             /* 0.634 */
+  texc[6] = (1.0-p)/2;             /* 0.366 */
+  texc[7] = (1.0+p)/2;             /* = texc[5], but has different purpose */
+  /* ...and of the object. We need them exactly at GLfloat precision
+   * for the edges to line up perfectly. */
+  posc[0] = p;                     /* 0.268 */
+  posc[1] = 1.0/cos(Pi/12);        /* 1.035 */
+  posc[2] = cos(Pi/6)/cos(Pi/12);  /* 0.897 */
+  posc[3] = sin(Pi/6)/cos(Pi/12);  /* 0.518 */
+  posc[4] = sqrt(2)*cos(Pi/6);     /* 1.225 */
+  posc[5] = sqrt(2)*sin(Pi/6);     /* 0.707 = 1/sqrt(2) */
+}
+
+/* It doesn't look good */
+/*#define MIPMAP*/
+
+static void init_gl(ModeInfo *mi) {
+#ifdef MIPMAP
+  int status;
+#endif
+  parse_colmode();
+  wire = MI_IS_WIREFRAME(mi);
+  cmat = !wire && (colmode != CUBE21_COLOR_WHITE);
+  if(MI_IS_MONO(mi)) {
+    tex = False;
+    cmat = False;
+  }
+  if(wire) {
+    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+    return;
+  }
+  if(!tex) color_inner[0] = color_inner[1] = color_inner[2] = 0.4;
+  glClearDepth(1.0);
+  glClearColor(0.0, 0.0, 0.0, 1.0);
+  glDrawBuffer(GL_BACK);
+  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+  glShadeModel(GL_FLAT);
+  glDepthFunc(GL_LESS);
+  glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+  glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+  glLightfv(GL_LIGHT0, GL_POSITION, position0);
+  glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+  glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+  glLightfv(GL_LIGHT1, GL_POSITION, position1);
+  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+  glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
+  glEnable(GL_DEPTH_TEST);
+  glEnable(GL_LIGHT0);
+  glEnable(GL_LIGHT1);
+  glEnable(GL_LIGHTING);
+  glEnable(GL_NORMALIZE);
+  glEnable(GL_COLOR_MATERIAL);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material_ambient);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);
+  glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+  if(!tex) return;
+  glEnable(GL_TEXTURE_2D);
+#ifdef MIPMAP
+  clear_gl_error();
+  status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3, cubetex.width, cubetex.height,
+      GL_RGB, GL_UNSIGNED_BYTE, cubetex.pixel_data);
+  if (status) {
+    const char *s = gluErrorString(status);
+    fprintf (stderr, "%s: error mipmapping texture: %s\n", progname, (s?s:"(unknown)"));
+    exit (1);
+  }
+  check_gl_error("mipmapping");
+#else    
+  glTexImage2D(GL_TEXTURE_2D, 0, cubetex.bytes_per_pixel, cubetex.width, cubetex.height,
+      0, GL_RGB, GL_UNSIGNED_BYTE, cubetex.pixel_data);
+#endif  
+  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+#ifdef MIPMAP
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+#else
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+#endif
+}
+
+static void init_cp(cube21_conf *cp) {
+  int i, j;
+  GLfloat ce_colors[6][3] = {
+    {1.0, 1.0, 1.0},
+    {1.0, 0.5, 0.0},
+    {0.0, 0.9, 0.0},
+    {0.8, 0.0, 0.0},
+    {0.1, 0.1, 1.0},
+    {0.9, 0.9, 0.0}
+  };
+  cp->state = CUBE21_STATE_BASIC;
+  cp->xrot = -65.0; cp->yrot = 185.0;
+  cp->posarg = (wspeed?random()%360:0.0);
+  cp->t = 0.0; cp->tmax = twait;
+  cp->hf[0] = cp->hf[1] = 0;
+  cp->fr[0] = cp->fr[1] = 0;
+  for(i=0;i<13;i++)
+    cp->pieces[0][i] = cp->pieces[1][i] = (i%3==1?0:1);
+  switch(colmode) {
+    case CUBE21_COLOR_RANDOM:
+    case CUBE21_COLOR_TWORND:
+    case CUBE21_COLOR_SIXRND:
+      for(i=0; i<6; i++)
+        for(j=0; j<3; j++)
+          cp->colors[i][j] = rndcolor();
+      break;
+    case CUBE21_COLOR_SILVER:
+      cp->colors[0][0] = 1.0;
+      cp->colors[0][1] = 1.0;
+      cp->colors[0][2] = 1.0;
+      cp->colors[1][0] = rndcolor();
+      cp->colors[1][1] = rndcolor();
+      cp->colors[1][2] = rndcolor();
+      break;
+    case CUBE21_COLOR_CLASSIC:
+      for(i=0; i<6; i++)
+        for(j=0; j<3; j++)
+          cp->colors[i][j] = 0.2+0.7*ce_colors[i][j];
+      break;
+  }
+  switch(colmode) {
+    case CUBE21_COLOR_SILVER:
+    case CUBE21_COLOR_TWORND:
+      for(i=0; i<5; i++)
+        for(j=0; j<12; j++)
+          if(i==0) cp->cind[i][j] = 0;
+          else if(i==2) cp->cind[i][j] = 1;
+          else cp->cind[i][j] = ((j+5)%12)>=6?1:0;
+      break;
+    case CUBE21_COLOR_CLASSIC:
+    case CUBE21_COLOR_SIXRND:
+      for(i=0; i<5; i++)
+        for(j=0; j<12; j++)
+          if(i==0) cp->cind[i][j] = 4;
+          else if(i==2) cp->cind[i][j] = 5;
+          else cp->cind[i][j] = ((j+5)%12)/3;
+      break;
+    case CUBE21_COLOR_RANDOM:
+      for(i=0; i<5; i++)
+        for(j=0; j<12; j++)
+          cp->cind[i][j] = 0;
+      break;
+  }
+  if(rndstart) randomize(cp);
+}
+
+/*************************************************************************/
+
+void reshape_cube21(ModeInfo *mi, int width, int height) {
+  cube21_conf *cp = &cube21[MI_SCREEN(mi)];
+  if(!height) height = 1;
+  cp->ratio = (GLfloat)width/(GLfloat)height;
+  glViewport(0, 0, (GLint) width, (GLint) height);
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective(30.0, cp->ratio, 1.0, 100.0);
+  glMatrixMode(GL_MODELVIEW);
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+void release_cube21(ModeInfo *mi) {
+  if (cube21 != NULL) {
+    int screen;
+    for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+      cube21_conf *cp = &cube21[screen];
+      if (cp->glx_context) {
+        cp->glx_context = NULL;
+      }
+    }
+    free((void *)cube21);
+    cube21 = NULL;
+  }
+  FreeAllGL(mi);
+}
+
+void init_cube21(ModeInfo *mi) {
+  cube21_conf *cp;
+  if(!cube21) {
+    cube21 = (cube21_conf *)calloc(MI_NUM_SCREENS(mi), sizeof(cube21_conf));
+    if(!cube21) return;
+  }
+  init_texc();
+  cp = &cube21[MI_SCREEN(mi)];
+  if ((cp->glx_context = init_GL(mi)) != NULL) {
+    init_gl(mi);
+    init_cp(cp);
+    reshape_cube21(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+  } else {
+    MI_CLEARWINDOW(mi);
+  }
+}
+
+void draw_cube21(ModeInfo * mi) {
+  Display *display = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+  cube21_conf *cp;
+  if (!cube21) return;
+  cp = &cube21[MI_SCREEN(mi)];
+  MI_IS_DRAWN(mi) = True;
+  if (!cp->glx_context) return;
+  glXMakeCurrent(display, window, *(cp->glx_context));
+  if (!draw_main(cp)) {
+    release_cube21(mi);
+    return;
+  }
+  if (MI_IS_FPS(mi)) do_fps (mi);
+  glFlush();
+  glXSwapBuffers(display, window);
+}
+
+void change_cube21(ModeInfo * mi) {
+  cube21_conf *cp = &cube21[MI_SCREEN(mi)];
+  if (!cp->glx_context) return;
+  glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cp->glx_context));
+  init_gl(mi);
+}
+
+#endif
diff --git a/hacks/glx/cube21.man b/hacks/glx/cube21.man
new file mode 100644 (file)
index 0000000..4f93582
--- /dev/null
@@ -0,0 +1,149 @@
+.TH XScreenSaver 1 "30-Aug-05" "X Version 11"
+.SH NAME
+cube21 - animates the Cube 21 puzzle
+.SH SYNOPSIS
+.B cube21
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-install]
+[\-delay \fImicroseconds\fP]
+[\-texture] [\-no\-texture]
+[\-mono]
+[\-wireframe]
+[\-spin] [\-no\-spin]
+[\-wander] [\-no\-wander]
+[\-randomize] [\-no\-randomize]
+[\-spinspeed \fInumber\fP]
+[\-rotspeed \fInumber\fP]
+[\-wanderspeed \fInumber\fP]
+[\-wait \fInumber\fP]
+[\-cubesize \fInumber\fP]
+[\-colormode \fIarg\fP]
+[\-fps]
+.SH DESCRIPTION
+This program animates a puzzle known as Cube 21 or Square-1.
+Its moves are chosen randomly.
+.P
+Cube 21 is a Rubik-like puzzle invented in 1992.  Its specialities are that
+it can change its shape and even the number of possible moves.  It can have
+more than 200 different shapes and the total number of configurations
+(assuming colors) is several tens of billions.
+.SH OPTIONS
+.I cube21
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to pause between frames.  Default is 20000, or 0.02 second.
+.TP 8
+.B \-texture
+Use texture maps.  This is the default.
+.TP 8
+.B \-no\-texture
+Use solid colors.
+.TP 8
+.B \-mono
+Disable both texture maps and colors.
+.TP 8
+.B \-wireframe
+Only draw outlines.  Outlines of all pieces, not only the whole object, are drawn.
+.TP 8
+.B \-spin
+Spin the whole object around X, Y and Z axes.  This is the default.
+.TP 8
+.B \-no\-spin
+Do not spin, showing the same three faces all the time.
+.TP 8
+.B \-wander
+Move the object around the screen.  This is the default.
+.TP 8
+.B \-no\-wander
+Keep the object centered on the screen.
+.TP 8
+.B \-randomize
+Shuffle the puzzle randomly at startup.  This is the default.
+.TP 8
+.B \-no\-randomize
+Do not shuffle at startup, begin at the shape of cube.
+.TP 8
+.B \-spinspeed \fInumber\fP
+The relative speed of spinning.  Default is 1.0.
+.TP 8
+.B \-rotspeed \fInumber\fP
+The relative speed of the moves.  Default is 3.0.  Setting to \(<= 0.0
+makes the object stay at one configuration.
+.TP 8
+.B \-wanderspeed \fInumber\fP
+The relative speed of wandering around the screen.  Default is 1.0.
+.TP 8
+.B \-wait \fInumber\fP
+How long to stay at ending position after each move.  The meaning of
+the argument is again relative.  Default is 40.0.
+.TP 8
+.B \-cubesize \fInumber\fP
+Size of the object.  Value of 3.0 fills roughly all the screen (its height).  Default is 0.7.
+.TP 8
+.B \-colormode \fIargument\fP
+How many and which colors should the object have.  The colors are put on the piece
+faces so that the puzzle is solvable.  The inner faces are not influenced.
+.RS
+.TP 8
+.BR se " or " silver
+Simulate the "Silver Edition" \- white and one random color.
+.TP 8
+.BR 2 " or " two
+Two random colors.
+.TP 8
+.BR ce " or " classic
+Simulate the "Classic Edition" \- white, yellow, orange, red, green and blue.
+.TP 8
+.BR 6 " or " six
+Six random colors.
+.TP 8
+.BR 1 " or " random " or " rnd
+One random color.
+.TP 8
+Anything else
+All faces white.
+.RE
+.TP 8
+.B \-fps
+Display a running tally of how many frames per second are being rendered.
+In conjunction with \fB\-delay 0\fP, this can be a useful benchmark of 
+your GL performance.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Vaclav Potocek.  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.
+.SH AUTHOR
+Vaclav (Vasek) Potocek <vasek.potocek@post.cz>, 30-Aug-05.
index 2f27ba0c3fcc5e98a5201b418801313c33d6769d..bd055982f237508dd386f6ac326d9af44fcfe1f9 100644 (file)
@@ -61,16 +61,21 @@ static const char sccsid[] = "@(#)gears.c   4.07 97/11/24 xlockmore";
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #define DEF_PLANETARY "False"
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #define DEF_PLANETARY "False"
+#define DEF_SPIN "True"
 
 static int planetary;
 
 static int planetary;
+static int spin;
 
 static XrmOptionDescRec opts[] = {
   {"-planetary", ".gears.planetary", XrmoptionNoArg, "true" },
   {"+planetary", ".gears.planetary", XrmoptionNoArg, "false" },
 
 static XrmOptionDescRec opts[] = {
   {"-planetary", ".gears.planetary", XrmoptionNoArg, "true" },
   {"+planetary", ".gears.planetary", XrmoptionNoArg, "false" },
+  {"-spin", ".gears.spin", XrmoptionNoArg, "true" },
+  {"+spin", ".gears.spin", XrmoptionNoArg, "false" },
 };
 
 static argtype vars[] = {
   {&planetary, "planetary", "Planetary", DEF_PLANETARY, t_Bool},
 };
 
 static argtype vars[] = {
   {&planetary, "planetary", "Planetary", DEF_PLANETARY, t_Bool},
+  {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
 };
 
 ModeSpecOpt gears_opts = {countof(opts), opts, countof(vars), vars, NULL};
 };
 
 ModeSpecOpt gears_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -535,13 +540,14 @@ draw(ModeInfo * mi)
 
     gltrackball_rotate (gp->trackball);
 
 
     gltrackball_rotate (gp->trackball);
 
-    {
-      double x, y, z;
-      get_rotation (gp->rot, &x, &y, &z, !gp->button_down_p);
-      glRotatef (x * 360, 1.0, 0.0, 0.0);
-      glRotatef (y * 360, 0.0, 1.0, 0.0);
-      glRotatef (z * 360, 0.0, 0.0, 1.0);
-    }
+    if (spin)
+         {
+               double x, y, z;
+               get_rotation (gp->rot, &x, &y, &z, !gp->button_down_p);
+               glRotatef (x * 360, 1.0, 0.0, 0.0);
+               glRotatef (y * 360, 0.0, 1.0, 0.0);
+               glRotatef (z * 360, 0.0, 0.0, 1.0);
+         }
 
     if (!planetary) {
       glPushMatrix();
 
     if (!planetary) {
       glPushMatrix();
diff --git a/hacks/glx/glhanoi.c b/hacks/glx/glhanoi.c
new file mode 100644 (file)
index 0000000..b0f91ca
--- /dev/null
@@ -0,0 +1,1484 @@
+/* glhanoi, Copyright (c) 2005 Dave Atkinson <dave.atkinson@uwe.ac.uk>
+ * except noise function code Copyright (c) 2002 Ken Perlin
+ *
+ * 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.
+ */
+
+#include <assert.h>
+#include <X11/Intrinsic.h>
+
+#include <rotator.h>
+
+#define PROGCLASS         "glhanoi"
+#define HACK_INIT         init_glhanoi
+#define HACK_DRAW         draw_glhanoi
+#define HACK_RESHAPE      reshape_glhanoi
+#define HACK_HANDLE_EVENT glhanoi_handle_event
+#define EVENT_MASK        PointerMotionMask
+#define glh_opts          xlockmore_opts
+
+#define DEF_DELAY     "15000"
+#define DEF_DISKS     "7"
+#define DEF_WIRE      "False"
+#define DEF_LIGHT     "True"
+#define DEF_FPS       "False"
+#define DEF_FOG       "False"
+#define DEF_TEXTURE   "True"
+
+#define DEFAULTS "*delay:     " DEF_DELAY     "\n" \
+                                "*count:     " DEF_DISKS     "\n" \
+                                "*showFPS:   " DEF_FPS       "\n" \
+                                "*wireframe: " DEF_WIRE      "\n"
+
+#define NSLICE 32
+#define NLOOPS 1
+#define START_DURATION 1.0
+#define FINISH_DURATION 1.0
+#define BASE_LENGTH 30.0
+#define BOARD_SQUARES 8
+
+#define MAX_CAMERA_RADIUS 250.0
+#define MIN_CAMERA_RADIUS 75.0
+
+#define MARBLE_SCALE 1.01
+
+enum {
+       MARBLE_TEXURE,
+       N_TEXTURES
+};
+
+#define MARBLE_TEXTURE_SIZE 256
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include <math.h>
+#include "xlockmore.h"
+
+#ifdef USE_GL                                  /* whole file */
+
+#include <GL/glu.h>
+
+#ifdef HAVE_GETTIMEOFDAY
+#ifdef GETTIMEOFDAY_TWO_ARGS
+# include <sys/time.h>
+# include <time.h>
+typedef struct timeval glhtime;
+#else                                                  /* GETTIMEOFDAY_TWO_ARGS */
+# include <sys/time.h>
+# include <time.h>
+typedef struct timeval glhtime;
+#endif
+#else                                                  /* HAVE_GETTIMEOFDAY */
+#ifdef HAVE_FTIME
+# include <sys/timeb.h>
+typedef struct timeb glhtime;
+#endif                                                 /* HAVE_FTIME */
+#endif                                                 /* HAVE_GETTIMEOFDAY */
+
+double getTime(void)
+{
+#ifdef HAVE_GETTIMEOFDAY
+       struct timeval t;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+       gettimeofday(&t, NULL);
+#else                                                  /* !GETTIMEOFDAY_TWO_ARGS */
+       gettimeofday(&t);
+#endif                                                 /* !GETTIMEOFDAY_TWO_ARGS */
+#else                                                  /* !HAVE_GETTIMEOFDAY */
+#ifdef HAVE_FTIME
+       ftime(&t);
+#endif                                                 /* HAVE_FTIME */
+#endif                                                 /* !HAVE_GETTIMEOFDAY */
+       return t.tv_sec + t.tv_usec / 1000000.0;
+}
+
+typedef enum {
+       START,
+       MOVE_DISK,
+       MOVE_FINISHED,
+       FINISHED,
+       MONEY_SHOT,
+       INVALID = -1
+} State;
+
+typedef struct {
+       int id;
+       GLuint displayList;
+       GLfloat position[3];
+       GLfloat rotation[3];
+       GLfloat color[4];
+       GLfloat base0;
+       GLfloat base1;
+       GLfloat height;
+       GLfloat xmin, xmax, ymin;
+       GLfloat u1, u2;
+       GLfloat t1, t2;
+       GLfloat ucostheta, usintheta;
+       GLdouble rotAngle;
+} Disk;
+
+typedef struct {
+       Disk **data;
+       int count;
+       int size;
+} Stack;
+
+typedef struct {
+       GLXContext *glx_context;
+       State state;
+       Bool wire;
+       Bool fog;
+       Bool light;
+       double startTime;
+       double lastTime;
+       double duration;
+       int numberOfDisks;
+       int numberOfMoves;
+       int maxDiskIdx;
+       int magicNumber;
+       Disk *currentDisk;
+       int move;
+       int src;
+       int tmp;
+       int dst;
+       int oldsrc;
+       int oldtmp;
+       int olddst;
+       Stack pole[3];
+       float boardSize;
+       float baseLength;
+       float baseWidth;
+       float baseHeight;
+       float poleRadius;
+       float poleHeight;
+       float poleOffset;
+       float diskHeight;
+       float *diskPos;                         /* pre-computed disk positions on rods */
+       Disk *disk;
+       float speed;
+       GLint floorList;
+       GLint baseList;
+       GLint poleList;
+       GLfloat camera[3];
+       GLfloat centre[3];
+       rotator *the_rotator;
+       Bool button_down_p;
+       Bool texture;
+       GLuint textureNames[N_TEXTURES];
+       int drag_x;
+       int drag_y;
+} glhcfg;
+
+static glhcfg *glhanoi_cfg = NULL;
+static glhcfg *glhanoi = NULL;
+static Bool fog;
+static Bool light;
+static Bool texture;
+
+static XrmOptionDescRec opts[] = {
+       {"-light", ".glhanoi.light", XrmoptionNoArg, (caddr_t) "true"},
+       {"+light", ".glhanoi.light", XrmoptionNoArg, (caddr_t) "false"},
+       {"-fog", ".glhanoi.fog", XrmoptionNoArg, (caddr_t) "true"},
+       {"+fog", ".glhanoi.fog", XrmoptionNoArg, (caddr_t) "false"},
+       {"-texture", ".glhanoi.texture", XrmoptionNoArg, (caddr_t) "true"},
+       {"+texture", ".glhanoi.texture", XrmoptionNoArg, (caddr_t) "false"}
+};
+
+static argtype vars[] = {
+       {(caddr_t *) (void *)&light, "light", "Light", DEF_LIGHT, t_Bool},
+       {(caddr_t *) (void *)&fog, "fog", "Fog", DEF_FOG, t_Bool},
+       {(caddr_t *) (void *)&texture, "texture", "Texture", DEF_TEXTURE,
+        t_Bool}
+};
+
+static OptionStruct desc[] = {
+       {"+/-light", "whether to light the scene"},
+       {"+/-fog", "whether to apply fog to the scene"},
+       {"+/-texture", "whether to apply texture to the scene"}
+};
+
+ModeSpecOpt glh_opts = { countof(opts), opts, countof(vars), vars, desc };
+
+#ifdef USE_MODULES
+
+ModStruct glhanoi_description = {
+       "glhanoi", "init_glhanoi", "draw_glhanoi", "release_glhanoi",
+       "draw_glhanoi", "init_glhanoi", NULL, &glhanoi_opts,
+       1000, 1, 2, 1, 4, 1.0, "",
+       "Towers of Hanoi", 0, NULL
+};
+
+#endif
+
+static GLfloat cBlack[] = { 0.0, 0.0, 0.0, 1.0 };
+static GLfloat cWhite[] = { 1.0, 1.0, 1.0, 1.0 };
+static GLfloat poleColor[] = { 0.545, 0.137, 0.137 };
+static GLfloat baseColor[] = { 0.34, 0.34, 0.48 };
+static GLfloat fogcolor[] = { 0.5, 0.5, 0.5 };
+
+static float left[] = { 1.0, 0.0, 0.0 };
+static float up[] = { 0.0, 1.0, 0.0 };
+static float front[] = { 0.0, 0.0, 1.0 };
+static float right[] = { -1.0, 0.0, 0.0 };
+static float down[] = { 0.0, -1.0, 0.0 };
+static float back[] = { 0.0, 0.0, -1.0 };
+
+GLfloat pos0[4] = { 50.0, 50.0, 50.0, 0.0 };
+GLfloat amb0[4] = { 0.0, 0.0, 0.0, 1.0 };
+GLfloat dif0[4] = { 1.0, 1.0, 1.0, 1.0 };
+GLfloat spc0[4] = { 0.0, 1.0, 1.0, 1.0 };
+
+GLfloat pos1[4] = { -50.0, 50.0, -50.0, 0.0 };
+GLfloat amb1[4] = { 0.0, 0.0, 0.0, 1.0 };
+GLfloat dif1[4] = { 1.0, 1.0, 1.0, 1.0 };
+GLfloat spc1[4] = { 1.0, 1.0, 1.0, 1.0 };
+
+float g = 3.0 * 9.80665;               /* hmm, looks like we need more gravity, Scotty... */
+
+#define DOPUSH(X, Y)   (((X)->count) >= ((X)->size)) ? NULL : ((X)->data[(X)->count++] = (Y))
+#define DOPOP(X)       (X)->count <= 0 ? NULL : ((X)->data[--((X)->count)])
+
+Disk *push(int idx, Disk * d)
+{
+       return DOPUSH(&glhanoi->pole[idx], d);
+}
+
+Disk *pop(int idx)
+{
+       return DOPOP(&glhanoi->pole[idx]);
+}
+
+inline void swap(int *x, int *y)
+{
+       *x = *x ^ *y;
+       *y = *x ^ *y;
+       *x = *x ^ *y;
+}
+
+/*
+ * magic - it's magic...
+ */
+int magic(int i)
+{
+       int count = 0;
+       if(i <= 1)
+               return 0;
+       while((i & 0x01) == 0) {
+               i >>= 1;
+               count++;
+       }
+       return count % 2 == 0;
+}
+
+float distance(float *p0, float *p1)
+{
+       float x, y, z;
+       x = p1[0] - p0[0];
+       y = p1[1] - p0[1];
+       z = p1[2] - p0[2];
+       return (float)sqrt(x * x + y * y + z * z);
+}
+
+GLfloat A(GLfloat a, GLfloat b, GLfloat c)
+{
+       GLfloat sum = a + b;
+       return c / (a * b - 0.25 * sum * sum);
+}
+
+void moveSetup(Disk * disk)
+{
+       float h, ymax;
+       float u;
+       int src = glhanoi->src;
+       int dst = glhanoi->dst;
+       GLfloat theta;
+       GLfloat sintheta, costheta;
+
+       if(glhanoi->state != FINISHED && random() % 6 == 0) {
+               disk->rotAngle =
+                       -180.0 * (2 - 2 * random() % 2) * (random() % 3 + 1);
+       } else {
+               disk->rotAngle = -180.0;
+       }
+
+       disk->base0 = glhanoi->diskPos[glhanoi->pole[src].count];
+       disk->base1 =
+               glhanoi->state ==
+               FINISHED ? disk->base0 : glhanoi->diskPos[glhanoi->pole[dst].
+                                                                                                 count];
+
+       disk->xmin = glhanoi->poleOffset * (src - 1);
+       disk->xmax = glhanoi->poleOffset * (dst - 1);
+       disk->ymin = glhanoi->poleHeight;
+       ymax =
+               glhanoi->poleHeight + fabs(disk->xmax -
+                                                                  disk->xmin) * (glhanoi->state ==
+                                                                                                 FINISHED ? 1.0 +
+                                                                                                 (double)(glhanoi->
+                                                                                                                  numberOfDisks -
+                                                                                                                  disk->id) /
+                                                                                                 (double)glhanoi->
+                                                                                                 numberOfDisks : 1.0);
+
+       h = ymax - disk->ymin;
+       theta = atan((disk->xmin - disk->xmax) * A(disk->xmin, disk->xmax, h));
+       if(theta < 0.0)
+               theta += M_PI;
+       costheta = cos(theta);
+       sintheta = sin(theta);
+       u = (float)
+               sqrt(fabs
+                        (-g /
+                         (2.0 * A(disk->xmin, disk->xmax, h) * costheta * costheta)));
+       disk->usintheta = u * sintheta;
+       disk->ucostheta = u * costheta;
+       disk->t1 =
+               (-u + sqrt(u * u + 2.0 * g * fabs(disk->ymin - disk->base0))) / g;
+       disk->u1 = u + g * disk->t1;
+       disk->t2 = 2.0 * disk->usintheta / g;
+       disk->u2 = disk->usintheta - g * disk->t2;
+}
+
+void makeMove(void)
+{
+       int fudge = glhanoi->move + 2;
+       int magicNumber = magic(fudge);
+
+       glhanoi->currentDisk = pop(glhanoi->src);
+       moveSetup(glhanoi->currentDisk);
+       push(glhanoi->dst, glhanoi->currentDisk);
+       fudge = fudge % 2;
+
+       if(fudge == 1 || magicNumber) {
+               swap(&glhanoi->src, &glhanoi->tmp);
+       }
+       if(fudge == 0 || glhanoi->magicNumber) {
+               swap(&glhanoi->dst, &glhanoi->tmp);
+       }
+       glhanoi->magicNumber = magicNumber;
+}
+
+double lerp(double alpha, double start, double end)
+{
+       return start + alpha * (end - start);
+}
+
+void upfunc(GLdouble t, Disk * d)
+{
+       d->position[0] = d->xmin;
+       d->position[1] = d->base0 + (d->u1 - 0.5 * g * t) * t;
+
+       d->rotation[1] = 0.0;
+}
+
+void parafunc(GLdouble t, Disk * d)
+{
+       d->position[0] = d->xmin + d->ucostheta * t;
+       d->position[1] = d->ymin + (d->usintheta - 0.5 * g * t) * t;
+
+       d->rotation[1] =
+               d->rotAngle * (d->position[0] - d->xmin) / (d->xmax - d->xmin);
+}
+
+void downfunc(GLdouble t, Disk * d)
+{
+       d->position[0] = d->xmax;
+       d->position[1] = d->ymin + (d->u2 - 0.5 * g * t) * t;
+
+       d->rotation[1] = 0.0;
+}
+
+Bool computePosition(GLfloat t, Disk * d)
+{
+       Bool finished = FALSE;
+
+       if(t < d->t1) {
+               upfunc(t, d);
+       } else if(t < d->t1 + d->t2) {
+               parafunc(t - d->t1, d);
+       } else {
+               downfunc(t - d->t1 - d->t2, d);
+               if(d->position[1] <= d->base1) {
+                       d->position[1] = d->base1;
+                       finished = TRUE;
+               }
+       }
+       return finished;
+}
+
+void updateView(void)
+{
+       double longitude, latitude, radius;
+       double a, b, c, A, B;
+
+       get_position(glhanoi->the_rotator, NULL, NULL, &radius,
+                                !glhanoi->button_down_p);
+       get_rotation(glhanoi->the_rotator, &longitude, &latitude, NULL,
+                                !glhanoi->button_down_p);
+       longitude += glhanoi->camera[0];
+       latitude += glhanoi->camera[1];
+       radius += glhanoi->camera[2];
+       longitude = longitude - floor(longitude);
+       latitude = latitude - floor(latitude);
+       radius = radius - floor(radius);
+       if(latitude > 0.5) {
+               latitude = 1.0 - latitude;
+       }
+       if(radius > 0.5) {
+               radius = 1.0 - radius;
+       }
+
+       b = glhanoi->centre[1];
+       c = (MIN_CAMERA_RADIUS +
+                radius * (MAX_CAMERA_RADIUS - MIN_CAMERA_RADIUS));
+       A = M_PI / 4.0 * (1.0 - latitude);
+       a = sqrt(b * b + c * c - 2.0 * b * c * cos(A));
+       B = asin(sin(A) * b / a);
+       glRotatef(-B * 180 / M_PI, 1.0, 0.0, 0.0);
+
+       glTranslatef(0.0f, 0.0f,
+                                -(MIN_CAMERA_RADIUS +
+                                  radius * (MAX_CAMERA_RADIUS - MIN_CAMERA_RADIUS)));
+       glRotatef(longitude * 360.0, 0.0f, 1.0f, 0.0f);
+       glRotatef(latitude * 180.0, cos(longitude * 2.0 * M_PI), 0.0,
+                         sin(longitude * 2.0 * M_PI));
+}
+
+void changeState(State state)
+{
+       glhanoi->state = state;
+       glhanoi->startTime = getTime();
+}
+
+void update_glhanoi(void)
+{
+       double t = getTime() - glhanoi->startTime;
+       int i;
+       Bool done;
+
+       switch (glhanoi->state) {
+       case START:
+               if(t < glhanoi->duration) {
+                       break;
+               }
+               glhanoi->move = 0;
+               if(glhanoi->numberOfDisks % 2 == 0) {
+                       swap(&glhanoi->tmp, &glhanoi->dst);
+               }
+               glhanoi->magicNumber = 1;
+               makeMove();
+               changeState(MOVE_DISK);
+               break;
+
+       case MOVE_DISK:
+               if(computePosition(t, glhanoi->currentDisk)) {
+                       changeState(MOVE_FINISHED);
+               }
+               break;
+
+       case MOVE_FINISHED:
+               if(++glhanoi->move < glhanoi->numberOfMoves) {
+                       makeMove();
+                       changeState(MOVE_DISK);
+               } else {
+                       glhanoi->duration = FINISH_DURATION;
+                       changeState(FINISHED);
+               }
+               break;
+
+       case FINISHED:
+               while(t < glhanoi->duration) {
+                       break;
+               }
+               glhanoi->src = glhanoi->olddst;
+               glhanoi->dst = glhanoi->oldsrc;
+               for(i = 0; i < glhanoi->numberOfDisks; ++i) {
+                       Disk *disk = pop(glhanoi->src);
+                       assert(disk != NULL);
+                       moveSetup(disk);
+               }
+               for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
+                       push(glhanoi->dst, &glhanoi->disk[i]);
+               }
+               changeState(MONEY_SHOT);
+               break;
+
+       case MONEY_SHOT:
+               done = True;
+               for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
+                       double delay = 0.25 * i;
+                       int finished;
+
+                       if(t - delay < 0) {
+                               done = False;
+                               continue;
+                       }
+
+                       finished = computePosition(t - delay, &glhanoi->disk[i]);
+                       glhanoi->disk[i].rotation[1] = 0.0;
+
+                       if(!finished) {
+                               done = False;
+                       }
+               }
+               if(done) {
+                       glhanoi->src = glhanoi->oldsrc;
+                       glhanoi->tmp = glhanoi->oldtmp;
+                       glhanoi->dst = glhanoi->olddst;
+                       changeState(START);
+               }
+               break;
+
+       case INVALID:
+       default:
+               fprintf(stderr, "Invalid state\n");
+               break;
+       }
+}
+
+void HSVtoRGBf(GLfloat h, GLfloat s, GLfloat v,
+                          GLfloat * r, GLfloat * g, GLfloat * b)
+{
+       if(s == 0.0) {
+               *r = v;
+               *g = v;
+               *b = v;
+       } else {
+               GLfloat i, f, p, q, t;
+               if(h >= 360.0) {
+                       h = 0.0;
+               }
+               h /= 60.0;                              /* h now in [0,6). */
+               i = floor((double)h);   /* i now largest integer <= h */
+               f = h - i;                              /* f is no fractional part of h */
+               p = v * (1.0 - s);
+               q = v * (1.0 - (s * f));
+               t = v * (1.0 - (s * (1.0 - f)));
+               switch ((int)i) {
+               case 0:
+                       *r = v;
+                       *g = t;
+                       *b = p;
+                       break;
+               case 1:
+                       *r = q;
+                       *g = v;
+                       *b = p;
+                       break;
+               case 2:
+                       *r = p;
+                       *g = v;
+                       *b = t;
+                       break;
+               case 3:
+                       *r = p;
+                       *g = q;
+                       *b = v;
+                       break;
+               case 4:
+                       *r = t;
+                       *g = p;
+                       *b = v;
+                       break;
+               case 5:
+                       *r = v;
+                       *g = p;
+                       *b = q;
+                       break;
+               }
+       }
+}
+
+void HSVtoRGBv(GLfloat * hsv, GLfloat * rgb)
+{
+       HSVtoRGBf(hsv[0], hsv[1], hsv[2], &rgb[0], &rgb[1], &rgb[2]);
+}
+
+void setMaterial(GLfloat color[3], GLfloat hlite[3], int shininess)
+{
+       glColor3fv(color);
+       glMaterialfv(GL_FRONT, GL_SPECULAR, hlite);
+       glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+       glMateriali(GL_FRONT, GL_SHININESS, shininess); /* [0,128] */
+}
+
+/*
+ * drawTube: I know all this stuff is available in gluQuadrics
+ * but I'd originally intended to texture the poles with a 3D wood
+ * texture, but I was having difficulty getting wood... what? Why
+ * are all you Amercians laughing..? Anyway, I don't know if enough
+ * people's hardware supports 3D textures, so I didn't bother (xorg
+ * ATI server doesn't :-( )
+ */
+void drawTube(GLdouble bottomRadius, GLdouble topRadius,
+                         GLdouble bottomThickness, GLdouble topThickness,
+                         GLdouble height, GLuint nSlice, GLuint nLoop)
+{
+       GLfloat y;
+       GLfloat *cosCache = malloc(sizeof(GLfloat) * nSlice);
+       GLfloat *sinCache = malloc(sizeof(GLfloat) * nSlice);
+       GLint slice;
+       GLuint loop;
+       GLint lastSlice = nSlice - 1;
+       GLfloat radius;
+       GLfloat innerRadius;
+       GLfloat maxRadius;
+
+       if(bottomThickness > bottomRadius) {
+               bottomThickness = bottomRadius;
+       }
+       if(topThickness > topRadius) {
+               topThickness = topRadius;
+       }
+       if(bottomThickness < 0.0) {
+               bottomThickness = 0.0;
+       }
+       if(topThickness < 0.0) {
+               topThickness = 0.0;
+       }
+       if(topRadius >= bottomRadius) {
+               maxRadius = topRadius;
+       } else {
+               maxRadius = bottomRadius;
+       }
+
+       /* bottom */
+       y = 0.0;
+       radius = bottomRadius;
+       innerRadius = bottomRadius - bottomThickness;
+       /* innerTexCoordSize = texCoordSize * innerRadius / maxRadius; */
+       /* outerTexCoordSize = texCoordSize * radius / maxRadius; */
+       /* yTexCoord = minTexCoord; */
+
+       glBegin(GL_QUAD_STRIP);
+
+       glNormal3f(0.0, -1.0, 0.0);
+
+       /* glTexCoord3f(midTexCoord, yTexCoord, midTexCoord + innerTexCoordSize); */
+       glVertex3f(0.0, y, innerRadius);
+
+       /* glTexCoord3f(midTexCoord, yTexCoord, midTexCoord + outerTexCoordSize); */
+       glVertex3f(0.0, y, radius);
+
+       for(slice = lastSlice; slice >= 0; --slice) {
+               GLfloat theta = 2.0 * M_PI * (double)slice / nSlice;
+
+               cosCache[slice] = cos(theta);
+               sinCache[slice] = sin(theta);
+
+               /* glTexCoord3f(midTexCoord + sinCache[slice] * innerTexCoordSize, */
+               /* yTexCoord, */
+               /* midTexCoord + cosCache[slice] * innerTexCoordSize); */
+               glVertex3f(innerRadius * sinCache[slice], y,
+                                  innerRadius * cosCache[slice]);
+               /* glTexCoord3f(midTexCoord + sinCache[slice] * outerTexCoordSize, */
+               /* yTexCoord, */
+               /* midTexCoord + cosCache[slice] * outerTexCoordSize); */
+               glVertex3f(radius * sinCache[slice], y, radius * cosCache[slice]);
+       }
+       glEnd();
+
+       /* middle */
+       for(loop = 0; loop < nLoop; ++loop) {
+               GLfloat lowerRadius =
+                       bottomRadius + (topRadius -
+                                                       bottomRadius) * (float)loop / (nLoop);
+               GLfloat upperRadius =
+                       bottomRadius + (topRadius - bottomRadius) * (float)(loop +
+                                                                                                                               1) /
+                       (nLoop);
+               GLfloat lowerY = height * (float)loop / (nLoop);
+               GLfloat upperY = height * (float)(loop + 1) / (nLoop);
+               GLfloat factor = (topRadius - topThickness) -
+                       (bottomRadius - bottomThickness);
+
+               /* outside */
+               glBegin(GL_QUAD_STRIP);
+               for(slice = 0; slice < nSlice; ++slice) {
+                       glNormal3f(sinCache[slice], 0.0, cosCache[slice]);
+                       glVertex3f(upperRadius * sinCache[slice], upperY,
+                                          upperRadius * cosCache[slice]);
+                       glVertex3f(lowerRadius * sinCache[slice], lowerY,
+                                          lowerRadius * cosCache[slice]);
+               }
+               glNormal3f(0.0, 0.0, 1.0);
+               glVertex3f(0.0, upperY, upperRadius);
+               glVertex3f(0.0, lowerY, lowerRadius);
+               glEnd();
+
+               /* inside */
+               lowerRadius = bottomRadius - bottomThickness +
+                       factor * (float)loop / (nLoop);
+               upperRadius = bottomRadius - bottomThickness +
+                       factor * (float)(loop + 1) / (nLoop);
+
+               glBegin(GL_QUAD_STRIP);
+               glNormal3f(0.0, 0.0, -1.0);
+               glVertex3f(0.0, upperY, upperRadius);
+               glVertex3f(0.0, lowerY, lowerRadius);
+               for(slice = lastSlice; slice >= 0; --slice) {
+                       glNormal3f(-sinCache[slice], 0.0, -cosCache[slice]);
+                       glVertex3f(upperRadius * sinCache[slice], upperY,
+                                          upperRadius * cosCache[slice]);
+                       glVertex3f(lowerRadius * sinCache[slice], lowerY,
+                                          lowerRadius * cosCache[slice]);
+               }
+               glEnd();
+       }
+
+       /* top */
+       y = height;
+       radius = topRadius;
+       innerRadius = topRadius - topThickness;
+
+       glBegin(GL_QUAD_STRIP);
+       glNormal3f(0.0, 1.0, 0.0);
+       for(slice = 0; slice < nSlice; ++slice) {
+               glVertex3f(innerRadius * sinCache[slice], y,
+                                  innerRadius * cosCache[slice]);
+
+               glVertex3f(radius * sinCache[slice], y, radius * cosCache[slice]);
+       }
+       glVertex3f(0.0, y, innerRadius);
+       glVertex3f(0.0, y, radius);
+       glEnd();
+}
+
+void drawPole(GLfloat radius, GLfloat length)
+{
+       drawTube(radius, radius, radius, radius, length, NSLICE, NLOOPS);
+}
+
+void drawDisk3D(GLdouble inner_radius, GLdouble outer_radius,
+                               GLdouble height)
+{
+       drawTube(outer_radius, outer_radius, outer_radius - inner_radius,
+                        outer_radius - inner_radius, height, NSLICE, NLOOPS);
+}
+
+void drawCuboid(GLfloat length, GLfloat width, GLfloat height)
+{
+       GLfloat xmin = -length / 2.0f;
+       GLfloat xmax = length / 2.0f;
+       GLfloat zmin = -width / 2.0f;
+       GLfloat zmax = width / 2.0f;
+       GLfloat ymin = 0.0f;
+       GLfloat ymax = height;
+
+       glBegin(GL_QUADS);
+       /* front */
+       glNormal3fv(front);
+       glVertex3f(xmin, ymin, zmax);   /* 0 */
+       glVertex3f(xmax, ymin, zmax);   /* 1 */
+       glVertex3f(xmax, ymax, zmax);   /* 2 */
+       glVertex3f(xmin, ymax, zmax);   /* 3 */
+       /* right */
+       glNormal3fv(right);
+       glVertex3f(xmax, ymin, zmax);   /* 1 */
+       glVertex3f(xmax, ymin, zmin);   /* 5 */
+       glVertex3f(xmax, ymax, zmin);   /* 6 */
+       glVertex3f(xmax, ymax, zmax);   /* 2 */
+       /* back */
+       glNormal3fv(back);
+       glVertex3f(xmax, ymin, zmin);   /* 5 */
+       glVertex3f(xmin, ymin, zmin);   /* 4 */
+       glVertex3f(xmin, ymax, zmin);   /* 7 */
+       glVertex3f(xmax, ymax, zmin);   /* 6 */
+       /* left */
+       glNormal3fv(left);
+       glVertex3f(xmin, ymin, zmin);   /* 4 */
+       glVertex3f(xmin, ymin, zmax);   /* 0 */
+       glVertex3f(xmin, ymax, zmax);   /* 3 */
+       glVertex3f(xmin, ymax, zmin);   /* 7 */
+       /* top */
+       glNormal3fv(up);
+       glVertex3f(xmin, ymax, zmax);   /* 3 */
+       glVertex3f(xmax, ymax, zmax);   /* 2 */
+       glVertex3f(xmax, ymax, zmin);   /* 6 */
+       glVertex3f(xmin, ymax, zmin);   /* 7 */
+       /* bottom */
+       glNormal3fv(down);
+       glVertex3f(xmin, ymin, zmin);   /* 4 */
+       glVertex3f(xmax, ymin, zmin);   /* 5 */
+       glVertex3f(xmax, ymin, zmax);   /* 1 */
+       glVertex3f(xmin, ymin, zmax);   /* 0 */
+       glEnd();
+}
+
+void drawDisks(void)
+{
+       int i;
+
+       glPushMatrix();
+       glTranslatef(0.0f, glhanoi->baseHeight, 0.0f);
+       for(i = glhanoi->maxDiskIdx; i >= 0; i--) {
+               Disk *disk = &glhanoi->disk[i];
+               GLfloat *pos = disk->position;
+               GLfloat *rot = disk->rotation;
+
+               glPushMatrix();
+               glTranslatef(pos[0], pos[1], pos[2]);
+               if(rot[1] != 0.0) {
+                       glTranslatef(0.0, glhanoi->diskHeight / 2.0, 0.0);
+                       glRotatef(rot[1], 0.0, 0.0, 1.0);
+                       glTranslatef(0.0, -glhanoi->diskHeight / 2.0, 0.0);
+               }
+               glCallList(disk->displayList);
+               glPopMatrix();
+       }
+       glPopMatrix();
+}
+
+GLfloat getDiskRadius(int i)
+{
+       return ((GLfloat) i + 3.0) * glhanoi->poleRadius;
+}
+
+void initData(void)
+{
+       GLfloat maxDiskRadius;
+       int i;
+
+       glhanoi->baseLength = BASE_LENGTH;
+       glhanoi->poleRadius = glhanoi->baseLength /
+               (2.0 * (3 * glhanoi->numberOfDisks + 7.0));
+       maxDiskRadius = getDiskRadius(glhanoi->numberOfDisks);
+       glhanoi->baseWidth = 2.0 * maxDiskRadius;
+       glhanoi->poleOffset = 2.0 * getDiskRadius(glhanoi->maxDiskIdx);
+       glhanoi->diskHeight = 2.0 * glhanoi->poleRadius;
+       glhanoi->baseHeight = 2.0 * glhanoi->poleRadius;
+       glhanoi->poleHeight = glhanoi->numberOfDisks *
+               glhanoi->diskHeight + glhanoi->poleRadius;
+       glhanoi->numberOfMoves = (1 << glhanoi->numberOfDisks) - 1;
+       glhanoi->boardSize = glhanoi->baseLength * 0.5 * (1.0 + sqrt(5.0));
+
+       for(i = 0; i < 3; i++) {
+               if((glhanoi->pole[i].data =
+                       calloc(glhanoi->numberOfDisks, sizeof(Disk *))) == NULL) {
+                       fprintf(stderr, "%s: out of memory creating stack %d\n",
+                                       progname, i);
+                       exit(1);
+               }
+               glhanoi->pole[i].size = glhanoi->numberOfDisks;
+       }
+       if((glhanoi->diskPos =
+               calloc(glhanoi->numberOfDisks, sizeof(double))) == NULL) {
+               fprintf(stderr, "%s: out of memory creating diskPos\n", progname);
+               exit(1);
+       }
+
+       glhanoi->the_rotator = make_rotator(0.1, 0.025, 0, 1, 0.005, False);
+       glhanoi->button_down_p = False;
+
+       glhanoi->src = glhanoi->oldsrc = 0;
+       glhanoi->tmp = glhanoi->oldtmp = 1;
+       glhanoi->dst = glhanoi->olddst = 2;
+}
+
+void initView(void)
+{
+       glhanoi->camera[0] = 0.0;
+       glhanoi->camera[1] = 0.0;
+       glhanoi->camera[2] = 0.0;
+       glhanoi->centre[0] = 0.0;
+       glhanoi->centre[1] = glhanoi->poleHeight * 3.0;
+       glhanoi->centre[2] = 0.0;
+}
+
+/*
+ * noise_improved.c - based on ImprovedNoise.java
+ * JAVA REFERENCE IMPLEMENTATION OF IMPROVED NOISE - COPYRIGHT 2002 KEN PERLIN.
+ */
+static double fade(double t)
+{
+       return t * t * t * (t * (t * 6 - 15) + 10);
+}
+
+static double grad(int hash, double x, double y, double z)
+{
+       int h = hash & 15;                      /* CONVERT LO 4 BITS OF HASH CODE */
+       double u = h < 8 ? x : y,       /* INTO 12 GRADIENT DIRECTIONS. */
+               v = h < 4 ? y : h == 12 || h == 14 ? x : z;
+       return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
+}
+
+static int p[512], permutation[] = { 151, 160, 137, 91, 90, 15,
+       131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142,
+       8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26,
+       197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237,
+       149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
+       134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60,
+       211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143,
+       54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89,
+       18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198,
+       173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118,
+       126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189,
+       28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70,
+       221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108,
+       110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251,
+       34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145,
+       235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184,
+       84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205,
+       93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61,
+       156, 180
+};
+
+static void initNoise(void)
+{
+       int i;
+       for(i = 0; i < 256; i++)
+               p[256 + i] = p[i] = permutation[i];
+}
+
+double improved_noise(double x, double y, double z)
+{
+       double u, v, w;
+       int A, AA, AB, B, BA, BB;
+       int X = (int)floor(x) & 255,    /* FIND UNIT CUBE THAT */
+               Y = (int)floor(y) & 255,        /* CONTAINS POINT. */
+               Z = (int)floor(z) & 255;
+       static int start = 0;
+       if(start == 0) {
+               initNoise();
+               start = 1;
+       }
+       x -= floor(x);                          /* FIND RELATIVE X,Y,Z */
+       y -= floor(y);                          /* OF POINT IN CUBE. */
+       z -= floor(z);
+       u = fade(x),                            /* COMPUTE FADE CURVES */
+               v = fade(y),                    /* FOR EACH OF X,Y,Z. */
+               w = fade(z);
+       A = p[X] + Y, AA = p[A] + Z, AB = p[A + 1] + Z, /* HASH COORDINATES OF */
+               B = p[X + 1] + Y, BA = p[B] + Z, BB = p[B + 1] + Z;     /* THE 8 CUBE CORNERS, */
+       return lerp(w, lerp(v, lerp(u, grad(p[AA], x, y, z),    /* AND ADD */
+                                                               grad(p[BA], x - 1, y, z)),      /* BLENDED */
+                                               lerp(u, grad(p[AB], x, y - 1, z),       /* RESULTS */
+                                                        grad(p[BB], x - 1, y - 1, z))),        /* FROM 8 CORNERS */
+                               lerp(v, lerp(u, grad(p[AA + 1], x, y, z - 1), grad(p[BA + 1], x - 1, y, z - 1)),        /* OF CUBE */
+                                        lerp(u, grad(p[AB + 1], x, y - 1, z - 1),
+                                                 grad(p[BB + 1], x - 1, y - 1, z - 1))));
+}
+
+/*
+ * end noise_improved.c - based on ImprovedNoise.java
+ */
+
+struct tex_col_t {
+       GLuint *colours;
+       /* GLfloat *points; */
+       unsigned int ncols;
+};
+typedef struct tex_col_t tex_col_t;
+
+GLubyte *makeTexture(int x_size, int y_size, int z_size,
+                                        GLuint(*texFunc) (double, double, double,
+                                                                          tex_col_t *), tex_col_t * colours)
+{
+       int i, j, k;
+       GLubyte *textureData;
+       GLuint *texturePtr;
+       double x, y, z;
+       double xi, yi, zi;
+
+       if((textureData =
+               calloc(x_size * y_size * z_size, sizeof(GLuint))) == NULL) {
+               return NULL;
+       }
+
+       xi = 1.0 / x_size;
+       yi = 1.0 / y_size;
+       zi = 1.0 / z_size;
+
+       z = 0.0;
+       texturePtr = (void *)textureData;
+       for(k = 0; k < z_size; k++, z += zi) {
+               y = 0.0;
+               for(j = 0; j < y_size; j++, y += yi) {
+                       x = 0.0;
+                       for(i = 0; i < x_size; i++, x += xi) {
+                               *texturePtr = texFunc(x, y, z, colours);
+                               ++texturePtr;
+                       }
+               }
+       }
+       return textureData;
+}
+
+tex_col_t makeMarbleColours(void)
+{
+       tex_col_t marbleColours;
+       int ncols = 2;
+
+       marbleColours.colours = calloc(sizeof(GLuint), ncols);
+       marbleColours.ncols = ncols;
+
+       marbleColours.colours[0] = 0x3f3f3f3f;
+       marbleColours.colours[1] = 0xffffffff;
+
+       return marbleColours;
+}
+
+double turb(double x, double y, double z, int octaves)
+{
+       int oct, freq = 1;
+       double r = 0.0;
+
+       for(oct = 0; oct < octaves; ++oct) {
+               r += fabs(improved_noise(freq * x, freq * y, freq * z)) / freq;
+               freq <<= 1;
+       }
+       return r / 2.0;
+}
+
+void perturb(double *x, double *y, double *z, double scale)
+{
+       double t = scale * turb(*x, *y, *z, 4);
+       *x += t;
+       *y += t;
+       *z += t;
+}
+
+double f_m(double x, double y, double z)
+{
+       return sin(3.0 * M_PI * x);
+}
+
+GLuint C_m(double x, const tex_col_t * tex_cols)
+{
+       int r = tex_cols->colours[0] & 0xff;
+       int g = tex_cols->colours[0] >> 8 & 0xff;
+       int b = tex_cols->colours[0] >> 16 & 0xff;
+       double factor;
+       int r1, g1, b1;
+       x = x - floor(x);
+
+       factor = (1.0 + sin(2.0 * M_PI * x)) / 2.0;
+
+       r1 = (tex_cols->colours[1] & 0xff);
+       g1 = (tex_cols->colours[1] >> 8 & 0xff);
+       b1 = (tex_cols->colours[1] >> 16 & 0xff);
+
+       r += (int)(factor * (r1 - r));
+       g += (int)(factor * (g1 - g));
+       b += (int)(factor * (b1 - b));
+
+       return 0xff000000 | (b << 16) | (g << 8) | r;
+}
+
+
+GLuint makeMarbleTexture(double x, double y, double z, tex_col_t * colours)
+{
+       perturb(&x, &y, &z, MARBLE_SCALE);
+       return C_m(f_m(x, y, z), colours);
+}
+
+void setTexture(int n)
+{
+       glBindTexture(GL_TEXTURE_2D, glhanoi->textureNames[n]);
+}
+
+int makeTextures(void)
+{
+       GLubyte *marbleTexture;
+       tex_col_t marbleColours;
+
+       glGenTextures(N_TEXTURES, glhanoi->textureNames);
+
+       marbleColours = makeMarbleColours();
+       if((marbleTexture =
+               makeTexture(MARBLE_TEXTURE_SIZE, MARBLE_TEXTURE_SIZE, 1,
+                                       makeMarbleTexture, &marbleColours)) == NULL) {
+               return 1;
+       }
+
+       glBindTexture(GL_TEXTURE_2D, glhanoi->textureNames[0]);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+                                MARBLE_TEXTURE_SIZE, MARBLE_TEXTURE_SIZE, 0,
+                                GL_RGBA, GL_UNSIGNED_BYTE, marbleTexture);
+       free(marbleTexture);
+
+       return 0;
+}
+
+void initFloor(void)
+{
+       int i, j;
+       float tileSize = glhanoi->boardSize / BOARD_SQUARES;
+       float x0, x1, z0, z1;
+       float tx0, tx1, tz0, tz1;
+       float *col = cWhite;
+       float texIncr = 1.0 / BOARD_SQUARES;
+
+       if((glhanoi->floorList = glGenLists(1)) == 0) {
+               fprintf(stderr, "can't allocate memory for floor display list\n");
+               exit(EXIT_FAILURE);
+       }
+       glNewList(glhanoi->floorList, GL_COMPILE);
+       x0 = -glhanoi->boardSize / 2.0;
+       tx0 = 0.0f;
+       setMaterial(col, cWhite, 128);
+       setTexture(0);
+       glNormal3fv(up);
+       for(i = 0; i < BOARD_SQUARES; i++, x0 += tileSize, tx0 += texIncr) {
+               x1 = x0 + tileSize;
+               tx1 = tx0 + texIncr;
+               z0 = -glhanoi->boardSize / 2.0;
+               tz0 = 0.0f;
+               for(j = 0; j < BOARD_SQUARES; j++, z0 += tileSize, tz0 += texIncr) {
+                       int colIndex = (i + j) & 0x1;
+
+                       z1 = z0 + tileSize;
+                       tz1 = tz0 + texIncr;
+
+                       if(colIndex)
+                               col = cWhite;
+                       else
+                               col = cBlack;
+
+                       setMaterial(col, cWhite, 100);
+
+                       glBegin(GL_QUADS);
+
+                       glTexCoord2d(tx0, tz0);
+                       glVertex3f(x0, 0.0, z0);
+
+                       glTexCoord2d(tx0, tz1);
+                       glVertex3f(x0, 0.0, z1);
+
+                       glTexCoord2d(tx1, tz1);
+                       glVertex3f(x1, 0.0, z1);
+
+                       glTexCoord2d(tx1, tz0);
+                       glVertex3f(x1, 0.0, z0);
+                       glEnd();
+               }
+       }
+       glEndList();
+}
+
+void initTowers(void)
+{
+       if((glhanoi->baseList = glGenLists(1)) == 0) {
+               fprintf(stderr, "can't allocate memory for towers display list\n");
+               exit(EXIT_FAILURE);
+       }
+       glNewList(glhanoi->baseList, GL_COMPILE);
+       setMaterial(baseColor, cWhite, 50);
+       drawCuboid(glhanoi->baseLength, glhanoi->baseWidth,
+                          glhanoi->baseHeight);
+       glEndList();
+
+
+       if((glhanoi->poleList = glGenLists(1)) == 0) {
+               fprintf(stderr, "can't allocate memory for towers display list\n");
+               exit(EXIT_FAILURE);
+       }
+       glNewList(glhanoi->poleList, GL_COMPILE);
+       glPushMatrix();
+       glTranslatef(0.0f, glhanoi->baseHeight, 0.0f);
+       setMaterial(poleColor, cWhite, 50);
+       drawPole(glhanoi->poleRadius, glhanoi->poleHeight);
+       glPushMatrix();
+       glTranslatef(-glhanoi->poleOffset, 0.0, 0.0);
+       drawPole(glhanoi->poleRadius, glhanoi->poleHeight);
+       glPopMatrix();
+       glTranslatef(glhanoi->poleOffset, 0.0, 0.0);
+       drawPole(glhanoi->poleRadius, glhanoi->poleHeight);
+       glPopMatrix();
+       glEndList();
+}
+
+double cfunc(double x)
+{
+#define COMP <
+       if(x < 2.0 / 7.0) {
+               return (1.0 / 12.0) / (1.0 / 7.0) * x;
+       }
+       if(x < 3.0 / 7.0) {
+               return (1.0 + 1.0 / 6.0) * x - 1.0 / 6.0;
+       }
+       if(x < 4.0 / 7.0) {
+               return (2.0 + 1.0 / 3.0) * x - 2.0 / 3.0;
+       }
+       if(x < 5.0 / 7.0) {
+               return (1.0 / 12.0) / (1.0 / 7.0) * x + 1.0 / 3.0;
+       }
+       return (1.0 / 12.0) / (1.0 / 7.0) * x + 1.0 / 3.0;
+}
+
+void initDisks(void)
+{
+       int i;
+       if((glhanoi->disk =
+               (Disk *) calloc(glhanoi->numberOfDisks, sizeof(Disk))) == NULL) {
+               perror("initDisks");
+               exit(EXIT_FAILURE);
+       }
+
+       for(i = glhanoi->maxDiskIdx; i >= 0; i--) {
+               GLfloat height = (GLfloat) (glhanoi->maxDiskIdx - i);
+               double f = cfunc((GLfloat) i / (GLfloat) glhanoi->numberOfDisks);
+               GLfloat diskColor = f * 360.0;
+               GLfloat color[3];
+               Disk *disk = &glhanoi->disk[i];
+
+               disk->id = i;
+               disk->position[0] = -glhanoi->poleOffset;
+               disk->position[1] = glhanoi->diskHeight * height;
+               disk->position[2] = 0.0;
+               disk->rotation[0] = 0.0;
+               disk->rotation[1] = 0.0;
+               disk->rotation[2] = 0.0;
+
+               color[0] = diskColor;
+               color[1] = 1.0f;
+               color[2] = 1.0f;
+               HSVtoRGBv(color, color);
+
+               if((disk->displayList = glGenLists(1)) == 0) {
+                       fprintf(stderr,
+                                       "can't allocate memory for disk %d display list\n", i);
+                       exit(EXIT_FAILURE);
+               }
+               glNewList(disk->displayList, GL_COMPILE);
+               setMaterial(color, cWhite, 100.0);
+               drawDisk3D(glhanoi->poleRadius, getDiskRadius(i),
+                                  glhanoi->diskHeight);
+               glEndList();
+       }
+       for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
+               GLfloat height = (GLfloat) (glhanoi->maxDiskIdx - i);
+               int h = glhanoi->maxDiskIdx - i;
+               glhanoi->diskPos[h] = glhanoi->diskHeight * height;
+               push(glhanoi->src, &glhanoi->disk[i]);
+       }
+}
+
+void initLights(Bool state)
+{
+       if(state) {
+               glLightfv(GL_LIGHT0, GL_POSITION, pos0);
+               glLightfv(GL_LIGHT0, GL_AMBIENT, amb0);
+               glLightfv(GL_LIGHT0, GL_DIFFUSE, dif0);
+               glLightfv(GL_LIGHT0, GL_SPECULAR, spc0);
+
+               glLightfv(GL_LIGHT1, GL_POSITION, pos1);
+               glLightfv(GL_LIGHT1, GL_AMBIENT, amb1);
+               glLightfv(GL_LIGHT1, GL_DIFFUSE, dif1);
+               glLightfv(GL_LIGHT1, GL_SPECULAR, spc1);
+
+               glEnable(GL_LIGHTING);
+               glEnable(GL_LIGHT0);
+               glEnable(GL_LIGHT1);
+       } else {
+               glDisable(GL_LIGHTING);
+       }
+}
+
+void drawFloor(void)
+{
+       glCallList(glhanoi->floorList);
+}
+
+void drawTowers(void)
+{
+       glCallList(glhanoi->baseList);
+       glCallList(glhanoi->poleList);
+}
+
+/* Window management, etc
+ */
+void reshape_glhanoi(ModeInfo * mi, int width, int height)
+{
+       glViewport(0, 0, (GLint) width, (GLint) height);
+
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       gluPerspective(30.0, (GLdouble) width / (GLdouble) height, 1.0,
+                                  2 * MAX_CAMERA_RADIUS);
+
+       glMatrixMode(GL_MODELVIEW);
+       glLoadIdentity();
+
+       glClear(GL_COLOR_BUFFER_BIT);
+}
+
+void init_glhanoi(ModeInfo * mi)
+{
+       if(!glhanoi_cfg) {
+               glhanoi_cfg =
+                       (glhcfg *) calloc(MI_NUM_SCREENS(mi), sizeof(glhcfg));
+               if(!glhanoi_cfg) {
+                       fprintf(stderr, "%s: out of memory creating configs\n",
+                                       progname);
+                       exit(1);
+               }
+               glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+       }
+
+       glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+       glhanoi->glx_context = init_GL(mi);
+       glhanoi->numberOfDisks = MI_BATCHCOUNT(mi);
+       glhanoi->maxDiskIdx = glhanoi->numberOfDisks - 1;
+       glhanoi->wire = MI_IS_WIREFRAME(mi);
+       glhanoi->light = light;
+       glhanoi->fog = fog;
+       glhanoi->texture = texture;
+
+       reshape_glhanoi(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+       if(glhanoi->wire) {
+               glhanoi->light = FALSE;
+               glhanoi->fog = FALSE;
+               glhanoi->texture = FALSE;
+       }
+
+       initLights(!glhanoi->wire && glhanoi->light);
+       if(makeTextures() != 0) {
+               fprintf(stderr, "can't allocate memory for marble texture\n");
+               exit(EXIT_FAILURE);
+       }
+
+       initData();
+       initView();
+       initFloor();
+       initTowers();
+       initDisks();
+
+       glEnable(GL_DEPTH_TEST);
+       glEnable(GL_NORMALIZE);
+       glEnable(GL_CULL_FACE);
+       glShadeModel(GL_SMOOTH);
+       if(glhanoi->fog) {
+               glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], 1.0);
+               glFogi(GL_FOG_MODE, GL_LINEAR);
+               glFogfv(GL_FOG_COLOR, fogcolor);
+               glFogf(GL_FOG_DENSITY, 0.35f);
+               glHint(GL_FOG_HINT, GL_NICEST);
+               glFogf(GL_FOG_START, MIN_CAMERA_RADIUS);
+               glFogf(GL_FOG_END, MAX_CAMERA_RADIUS / 1.9);
+               glEnable(GL_FOG);
+       }
+
+
+       glhanoi->duration = START_DURATION;
+       changeState(START);
+}
+
+void draw_glhanoi(ModeInfo * mi)
+{
+       Display *dpy = MI_DISPLAY(mi);
+       Window window = MI_WINDOW(mi);
+
+       glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+
+       if(!glhanoi->glx_context)
+               return;
+       glPolygonMode(GL_FRONT, glhanoi->wire ? GL_LINE : GL_FILL);
+
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       glLoadIdentity();
+
+       update_glhanoi();
+       updateView();
+
+       if(!glhanoi->wire && glhanoi->texture) {
+               glEnable(GL_TEXTURE_2D);
+       }
+       drawFloor();
+       glDisable(GL_TEXTURE_2D);
+
+       drawTowers();
+       drawDisks();
+
+       if(mi->fps_p) {
+               do_fps(mi);
+       }
+       glFinish();
+
+       glXSwapBuffers(dpy, window);
+}
+
+Bool glhanoi_handle_event(ModeInfo * mi, XEvent * event)
+{
+       glhcfg *glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+
+       if(event->xany.type == ButtonPress && event->xbutton.button == Button1) {
+               glhanoi->button_down_p = True;
+               glhanoi->drag_x = event->xbutton.x;
+               glhanoi->drag_y = event->xbutton.y;
+               return True;
+       } else if(event->xany.type == ButtonRelease
+                         && event->xbutton.button == Button1) {
+               glhanoi->button_down_p = False;
+               return True;
+       } else if(event->xany.type == ButtonPress &&
+                         (event->xbutton.button == Button4
+                          || event->xbutton.button == Button5)) {
+               switch (event->xbutton.button) {
+               case Button4:
+                       glhanoi->camera[2] += 0.01;
+                       break;
+               case Button5:
+                       glhanoi->camera[2] -= 0.01;
+                       break;
+               default:
+                       fprintf(stderr,
+                                       "glhanoi: unknown button in mousewheel handler\n");
+               }
+               return True;
+       } else if(event->xany.type == MotionNotify
+                         && glhanoi_cfg->button_down_p) {
+               int x_diff, y_diff;
+
+               x_diff = event->xbutton.x - glhanoi->drag_x;
+               y_diff = event->xbutton.y - glhanoi->drag_y;
+
+               glhanoi->camera[0] = (float)x_diff / (float)MI_WIDTH(mi);
+               glhanoi->camera[1] = (float)y_diff / (float)MI_HEIGHT(mi);
+
+               return True;
+       }
+       return False;
+}
+
+void release_glhanoi(ModeInfo * mi)
+{
+       if(glhanoi_cfg != NULL) {
+               int screen;
+               for(screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       int i;
+                       int j;
+                       glhcfg *glh = &glhanoi_cfg[screen];
+                       glDeleteLists(glh->floorList, 1);
+                       glDeleteLists(glh->baseList, 1);
+                       glDeleteLists(glh->poleList, 1);
+                       for(j = 0; j < glh->numberOfDisks; ++j) {
+                               glDeleteLists(glh->disk[j].displayList, 1);
+                       }
+                       free(glh->disk);
+                       for(i = 0; i < 3; i++) {
+                               if(glh->pole[i].data != NULL) {
+                                       free(glh->pole[i].data);
+                               }
+                       }
+               }
+       }
+       free(glhanoi_cfg);
+       glhanoi_cfg = NULL;
+       glDeleteLists(glhanoi->textureNames[0], 2);
+}
+
+#endif                                                 /* USE_GL */
diff --git a/hacks/glx/glhanoi.man b/hacks/glx/glhanoi.man
new file mode 100644 (file)
index 0000000..789b03a
--- /dev/null
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glhanoi - OpenGL Towers of Hanoi
+.SH SYNOPSIS
+.B glhanoi
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-rotspeed \fInumber\fP]
+[\-wireframe]
+[\-light]
+[\-texture]
+[\-fog]
+[\-fps]
+.SH DESCRIPTION
+Implementation of Towers of Hanoi in OpenGL
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Speed of disk animation. Default: 12.0 er, units per second. Let's call them metres.
+.TP 8
+.B \-rotspeed \fInumber\fP
+Speed of disk animation. Default: 0.1 rads per second.
+.TP 8
+.B \-count \fInumber\fP
+Number of disks.  Default: 7.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fog | \-no-fog
+Render in fog.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.TP 8
+.B \-light | -no-light
+Whether the scene is lit.
+.TP 8
+.B \-texture | \-no-texture
+Render with textures instead of solid.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Dave Atkinson.  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.
+.SH AUTHOR
+Dave Atkinson.
index 42b4c296b213efbe10ff9171433048c6f29f4ee1..712288fc6eb7d250bd899e5fccfdfe96d636a527 100644 (file)
@@ -107,3 +107,11 @@ gltrackball_mousewheel (trackball_state *ts,
   else
     gltrackball_track (ts, 50, 50*move, 100, 100);
 }
   else
     gltrackball_track (ts, 50, 50*move, 100, 100);
 }
+
+void
+gltrackball_get_quaternion (trackball_state *ts, float q[4])
+{
+  int i;
+  for (i=0; i<4; i++)
+    q[i] = ts->q[i];
+}
index 3d8ef667bca1a3bd9948308f7ad7f5faafa43b24..966db04a688a8a8f469a2112b416119d76641351 100644 (file)
@@ -45,5 +45,9 @@ extern void gltrackball_rotate (trackball_state *);
 void gltrackball_mousewheel (trackball_state *ts,
                              int button, int percent, int horizontal_p);
 
 void gltrackball_mousewheel (trackball_state *ts,
                              int button, int percent, int horizontal_p);
 
+/* Return the quaternion encapsulated by the trackball state.
+ */
+extern void gltrackball_get_quaternion (trackball_state *ts, float q[4]);
+
 #endif /* __GLTRACKBALL_H__ */
 
 #endif /* __GLTRACKBALL_H__ */
 
index f7e44873266ef9ff37119ceae2af722b4f5786c5..b1c1cf45a6fdeb28ae691658659feb9874fbbad3 100644 (file)
@@ -141,6 +141,13 @@ convert_ximage_to_rgba32 (Screen *screen, XImage *image)
                              0);
   to->data = (char *) calloc (to->height, to->bytes_per_line);
 
                              0);
   to->data = (char *) calloc (to->height, to->bytes_per_line);
 
+  /* Set the bit order in the XImage structure to whatever the
+     local host's native bit order is.
+   */
+  to->bitmap_bit_order =
+    to->byte_order =
+    (bigendian() ? MSBFirst : LSBFirst);
+
   if (visual_class (screen, visual) == PseudoColor ||
       visual_class (screen, visual) == GrayScale)
     {
   if (visual_class (screen, visual) == PseudoColor ||
       visual_class (screen, visual) == GrayScale)
     {
index 931d24ccfa9e0610d007d216f91b6658f7a9138e..465b261f74e52f8bae46f57759ece98e027e0870 100644 (file)
@@ -1,10 +1,10 @@
 /* hypertorus --- Shows a hypertorus that rotates in 4d */
 
 #if 0
 /* hypertorus --- Shows a hypertorus that rotates in 4d */
 
 #if 0
-static const char sccsid[] = "@(#)hypertorus.c  1.1 03/05/18 xlockmore";
+static const char sccsid[] = "@(#)hypertorus.c  1.2 05/09/28 xlockmore";
 #endif
 
 #endif
 
-/* Copyright (c) 2003 Carsten Steger <carsten@mirsanmir.org>. */
+/* Copyright (c) 2003-2005 Carsten Steger <carsten@mirsanmir.org>. */
 
 /*
  * Permission to use, copy, modify, and distribute this software and its
 
 /*
  * Permission to use, copy, modify, and distribute this software and its
@@ -21,6 +21,8 @@ static const char sccsid[] = "@(#)hypertorus.c  1.1 03/05/18 xlockmore";
  *
  * REVISION HISTORY:
  * C. Steger - 03/05/18: Initial version
  *
  * REVISION HISTORY:
  * C. Steger - 03/05/18: Initial version
+ * C. Steger - 05/09/28: Added the spirals appearance mode
+ *                       and trackball support
  */
 
 /*
  */
 
 /*
@@ -33,83 +35,98 @@ static const char sccsid[] = "@(#)hypertorus.c  1.1 03/05/18 xlockmore";
  * projected 3d torus can then be projected to the screen either perspectively
  * or orthographically.  There are three display modes for the torus: mesh
  * (wireframe), solid, or transparent.  Furthermore, the appearance of the
  * projected 3d torus can then be projected to the screen either perspectively
  * or orthographically.  There are three display modes for the torus: mesh
  * (wireframe), solid, or transparent.  Furthermore, the appearance of the
- * torus can be as a solid object or as a set of see-through bands.  Finally,
- * the colors with with the torus is drawn can be set to either two-sided or
- * to colorwheel.  In the first case, the torus is drawn with red on the
- * outside and green on the inside.  This mode enables you to see that the
- * torus turns inside-out as it rotates in 4d.  The second mode draws the
- * torus in a fully saturated color wheel.  This gives a very nice effect
- * when combined with the see-through bands mode.  The rotation speed for
- * each of the six planes around which the torus rotates can be chosen.
- * This program is very much inspired by Thomas Banchoff's book "Beyond the
- * Third Dimension: Geometry, Computer Graphics, and Higher Dimensions",
- * Scientific American Library, 1990.
+ * torus can be as a solid object or as a set of see-through bands or
+ * see-through spirals.  Finally, the colors with with the torus is drawn can
+ * be set to either two-sided or to colorwheel.  In the first case, the torus
+ * is drawn with red on the outside and green on the inside.  This mode
+ * enables you to see that the torus turns inside-out as it rotates in 4d.
+ * The second mode draws the torus in a fully saturated color wheel.  This
+ * gives a very nice effect when combined with the see-through bands or
+ * see-through spirals mode.  The rotation speed for each of the six planes
+ * around which the torus rotates can be chosen.  This program is very much
+ * inspired by Thomas Banchoff's book "Beyond the Third Dimension: Geometry,
+ * Computer Graphics, and Higher Dimensions", Scientific American Library,
+ * 1990.
  */
 
 #ifndef M_PI
 #define M_PI 3.14159265358979323846
 #endif
 
  */
 
 #ifndef M_PI
 #define M_PI 3.14159265358979323846
 #endif
 
-#define DISP_WIREFRAME            0
-#define DISP_WIREFRAME_STR       "0"
-#define DISP_SURFACE              1
-#define DISP_SURFACE_STR         "1"
-#define DISP_TRANSPARENT          2
-#define DISP_TRANSPARENT_STR     "2"
-
-#define APPEARANCE_SOLID          0
-#define APPEARANCE_SOLID_STR     "0"
-#define APPEARANCE_BANDS          1
-#define APPEARANCE_BANDS_STR     "1"
-
-#define COLORS_TWOSIDED           0
-#define COLORS_TWOSIDED_STR      "0"
-#define COLORS_COLORWHEEL         1
-#define COLORS_COLORWHEEL_STR    "1"
-
-#define DISP_3D_PERSPECTIVE       0
-#define DISP_3D_PERSPECTIVE_STR  "0"
-#define DISP_3D_ORTHOGRAPHIC      1
-#define DISP_3D_ORTHOGRAPHIC_STR "1"
-
-#define DISP_4D_PERSPECTIVE       0
-#define DISP_4D_PERSPECTIVE_STR  "0"
-#define DISP_4D_ORTHOGRAPHIC      1
-#define DISP_4D_ORTHOGRAPHIC_STR "1"
-
-#define DALPHA                    1.1
-#define DALPHA_STR               "1.1"
-#define DBETA                     1.3
-#define DBETA_STR                "1.3"
-#define DDELTA                    1.5
-#define DDELTA_STR               "1.5"
-#define DZETA                     1.7
-#define DZETA_STR                "1.7"
-#define DETA                      1.9
-#define DETA_STR                 "1.9"
-#define DTHETA                    2.1
-#define DTHETA_STR               "2.1"
-
-#define DEF_DISPLAY_MODE          DISP_SURFACE_STR   
-#define DEF_APPEARANCE            APPEARANCE_BANDS_STR
-#define DEF_COLORS                COLORS_COLORWHEEL_STR
-#define DEF_3D_PROJECTION         DISP_3D_PERSPECTIVE_STR
-#define DEF_4D_PROJECTION         DISP_4D_PERSPECTIVE_STR
-#define DEF_DALPHA                DALPHA_STR
-#define DEF_DBETA                 DBETA_STR
-#define DEF_DDELTA                DDELTA_STR
-#define DEF_DZETA                 DZETA_STR
-#define DEF_DETA                  DETA_STR
-#define DEF_DTHETA                DTHETA_STR
+#define DISP_WIREFRAME             0
+#define DISP_WIREFRAME_STR        "0"
+#define DISP_SURFACE               1
+#define DISP_SURFACE_STR          "1"
+#define DISP_TRANSPARENT           2
+#define DISP_TRANSPARENT_STR      "2"
+
+#define APPEARANCE_SOLID           0
+#define APPEARANCE_SOLID_STR      "0"
+#define APPEARANCE_BANDS           1
+#define APPEARANCE_BANDS_STR      "1"
+#define APPEARANCE_SPIRALS         2
+#define APPEARANCE_SPIRALS_STR    "2"
+#define APPEARANCE_SPIRALS_1       3
+#define APPEARANCE_SPIRALS_1_STR  "3"
+#define APPEARANCE_SPIRALS_2       4
+#define APPEARANCE_SPIRALS_2_STR  "4"
+#define APPEARANCE_SPIRALS_4       5
+#define APPEARANCE_SPIRALS_4_STR  "5"
+#define APPEARANCE_SPIRALS_8       6
+#define APPEARANCE_SPIRALS_8_STR  "6"
+#define APPEARANCE_SPIRALS_16      7
+#define APPEARANCE_SPIRALS_16_STR "7"
+
+#define COLORS_TWOSIDED            0
+#define COLORS_TWOSIDED_STR       "0"
+#define COLORS_COLORWHEEL          1
+#define COLORS_COLORWHEEL_STR     "1"
+
+#define DISP_3D_PERSPECTIVE        0
+#define DISP_3D_PERSPECTIVE_STR   "0"
+#define DISP_3D_ORTHOGRAPHIC       1
+#define DISP_3D_ORTHOGRAPHIC_STR  "1"
+
+#define DISP_4D_PERSPECTIVE        0
+#define DISP_4D_PERSPECTIVE_STR   "0"
+#define DISP_4D_ORTHOGRAPHIC       1
+#define DISP_4D_ORTHOGRAPHIC_STR  "1"
+
+#define DALPHA                     1.1
+#define DALPHA_STR                "1.1"
+#define DBETA                      1.3
+#define DBETA_STR                 "1.3"
+#define DDELTA                     1.5
+#define DDELTA_STR                "1.5"
+#define DZETA                      1.7
+#define DZETA_STR                 "1.7"
+#define DETA                       1.9
+#define DETA_STR                  "1.9"
+#define DTHETA                     2.1
+#define DTHETA_STR                "2.1"
+
+#define DEF_DISPLAY_MODE           DISP_SURFACE_STR   
+#define DEF_APPEARANCE             APPEARANCE_BANDS_STR
+#define DEF_COLORS                 COLORS_COLORWHEEL_STR
+#define DEF_3D_PROJECTION          DISP_3D_PERSPECTIVE_STR
+#define DEF_4D_PROJECTION          DISP_4D_PERSPECTIVE_STR
+#define DEF_DALPHA                 DALPHA_STR
+#define DEF_DBETA                  DBETA_STR
+#define DEF_DDELTA                 DDELTA_STR
+#define DEF_DZETA                  DZETA_STR
+#define DEF_DETA                   DETA_STR
+#define DEF_DTHETA                 DTHETA_STR
 
 #ifdef STANDALONE
 
 #ifdef STANDALONE
-# define PROGCLASS       "Hypertorus"
-# define HACK_INIT       init_hypertorus
-# define HACK_DRAW       draw_hypertorus
-# define HACK_RESHAPE    reshape_hypertorus
-# define hypertorus_opts xlockmore_opts
-# define DEFAULTS        "*delay:      25000 \n" \
-                         "*showFPS:    False \n" \
+# define PROGCLASS          "Hypertorus"
+# define HACK_INIT          init_hypertorus
+# define HACK_DRAW          draw_hypertorus
+# define HACK_RESHAPE       reshape_hypertorus
+# define HACK_HANDLE_EVENT  hypertorus_handle_event
+# define EVENT_MASK         PointerMotionMask|KeyReleaseMask
+# define hypertorus_opts    xlockmore_opts
+# define DEFAULTS           "*delay:      25000 \n" \
+                            "*showFPS:    False \n" \
 
 # include "xlockmore.h"         /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
 
 # include "xlockmore.h"         /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
@@ -118,8 +135,10 @@ static const char sccsid[] = "@(#)hypertorus.c  1.1 03/05/18 xlockmore";
 
 #ifdef USE_GL
 
 
 #ifdef USE_GL
 
+#include <X11/keysym.h>
 #include <GL/gl.h>
 #include <GL/glu.h>
 #include <GL/gl.h>
 #include <GL/glu.h>
+#include "gltrackball.h"
 
 
 #ifdef USE_MODULES
 
 
 #ifdef USE_MODULES
@@ -134,6 +153,7 @@ ModStruct   hypertorus_description =
 
 static int display_mode;
 static int appearance;
 
 static int display_mode;
 static int appearance;
+static int num_spirals;
 static int colors;
 static int projection_3d;
 static int projection_4d;
 static int colors;
 static int projection_3d;
 static int projection_4d;
@@ -148,13 +168,13 @@ static float speed_yz;
 static float alpha, beta, delta, zeta, eta, theta;
 static float aspect;
 
 static float alpha, beta, delta, zeta, eta, theta;
 static float aspect;
 
-static const float offset4d[4] = {
-  0.0, 0.0, 0.0, 2.0
-};
+/* Trackball states */
+trackball_state *trackballs[2];
+int current_trackball;
+Bool button_pressed;
 
 
-static const float offset3d[4] = {
-  0.0, 0.0, -2.0, 0.0
-};
+static const float offset4d[4] = {  0.0,  0.0,  0.0,  2.0 };
+static const float offset3d[4] = {  0.0,  0.0, -2.0,  0.0 };
 
 
 static XrmOptionDescRec opts[] =
 
 
 static XrmOptionDescRec opts[] =
@@ -169,6 +189,16 @@ static XrmOptionDescRec opts[] =
                        APPEARANCE_SOLID_STR },
   {"-bands",           ".hypertorus.appearance",   XrmoptionNoArg,
                        APPEARANCE_BANDS_STR },
                        APPEARANCE_SOLID_STR },
   {"-bands",           ".hypertorus.appearance",   XrmoptionNoArg,
                        APPEARANCE_BANDS_STR },
+  {"-spirals-1",       ".hypertorus.appearance",   XrmoptionNoArg,
+                       APPEARANCE_SPIRALS_1_STR },
+  {"-spirals-2",       ".hypertorus.appearance",   XrmoptionNoArg,
+                       APPEARANCE_SPIRALS_2_STR },
+  {"-spirals-4",       ".hypertorus.appearance",   XrmoptionNoArg,
+                       APPEARANCE_SPIRALS_4_STR },
+  {"-spirals-8",       ".hypertorus.appearance",   XrmoptionNoArg,
+                       APPEARANCE_SPIRALS_8_STR },
+  {"-spirals-16",      ".hypertorus.appearance",   XrmoptionNoArg,
+                       APPEARANCE_SPIRALS_16_STR },
   {"-twosided",        ".hypertorus.colors",       XrmoptionNoArg,
                        COLORS_TWOSIDED_STR },
   {"-colorwheel",      ".hypertorus.colors",       XrmoptionNoArg,
   {"-twosided",        ".hypertorus.colors",       XrmoptionNoArg,
                        COLORS_TWOSIDED_STR },
   {"-colorwheel",      ".hypertorus.colors",       XrmoptionNoArg,
@@ -222,6 +252,7 @@ static OptionStruct desc[] =
   { "-transparent",     "display the torus as a transparent surface" },
   { "-solid",           "display the torus as a solid object" },
   { "-bands",           "display the torus as see-through bands" },
   { "-transparent",     "display the torus as a transparent surface" },
   { "-solid",           "display the torus as a solid object" },
   { "-bands",           "display the torus as see-through bands" },
+  { "-spirals-{1,2,4,8,16}", "display the torus as see-through spirals" },
   { "-twosided",        "display the torus with two colors" },
   { "-colorwheel",      "display the torus with a smooth color wheel" },
   { "-perspective-3d",  "project the torus perspectively from 3d to 2d" },
   { "-twosided",        "display the torus with two colors" },
   { "-colorwheel",      "display the torus with a smooth color wheel" },
   { "-perspective-3d",  "project the torus perspectively from 3d to 2d" },
@@ -362,6 +393,71 @@ static void rotateyz(float m[4][4], float phi)
 }
 
 
 }
 
 
+/* Compute the rotation matrix m from the rotation angles. */
+static void rotateall(float al, float be, float de, float ze, float et,
+                      float th, float m[4][4])
+{
+  int i, j;
+
+  for (i=0; i<4; i++)
+    for (j=0; j<4; j++)
+      m[i][j] = (i==j);
+  rotatewx(m,al);
+  rotatewy(m,be);
+  rotatewz(m,de);
+  rotatexy(m,ze);
+  rotatexz(m,et);
+  rotateyz(m,th);
+}
+
+
+/* Multiply two rotation matrices: o=m*n. */
+static void mult_rotmat(float m[4][4], float n[4][4], float o[4][4])
+{
+  int i, j, k;
+
+  for (i=0; i<4; i++)
+  {
+    for (j=0; j<4; j++)
+    {
+      o[i][j] = 0.0;
+      for (k=0; k<4; k++)
+        o[i][j] += m[i][k]*n[k][j];
+    }
+  }
+}
+
+
+/* Compute a 4D rotation matrix from two unit quaternions. */
+static void quats_to_rotmat(float p[4], float q[4], float m[4][4])
+{
+  double al, be, de, ze, et, th;
+  double r00, r01, r02, r12, r22;
+
+  r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]);
+  r01 = 2.0*(p[0]*p[1]+p[2]*p[3]);
+  r02 = 2.0*(p[2]*p[0]-p[1]*p[3]);
+  r12 = 2.0*(p[1]*p[2]+p[0]*p[3]);
+  r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]);
+
+  al = atan2(-r12,r22)*180.0/M_PI;
+  be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+  de = atan2(-r01,r00)*180.0/M_PI;
+
+  r00 = 1.0-2.0*(q[1]*q[1]+q[2]*q[2]);
+  r01 = 2.0*(q[0]*q[1]+q[2]*q[3]);
+  r02 = 2.0*(q[2]*q[0]-q[1]*q[3]);
+  r12 = 2.0*(q[1]*q[2]+q[0]*q[3]);
+  r22 = 1.0-2.0*(q[1]*q[1]+q[0]*q[0]);
+
+  ze = atan2(-r12,r22)*180.0/M_PI;
+  et = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+  th = atan2(-r01,r00)*180.0/M_PI;
+
+  rotateall(al,be,de,ze,et,th,m);
+}
+
+
 /* Compute a fully saturated and bright color based on an angle. */
 static void color(double angle)
 {
 /* Compute a fully saturated and bright color based on an angle. */
 static void color(double angle)
 {
@@ -414,7 +510,7 @@ static void color(double angle)
       break;
   }
   if (display_mode == DISP_TRANSPARENT)
       break;
   }
   if (display_mode == DISP_TRANSPARENT)
-    color[3] = 0.5;
+    color[3] = 0.7;
   else
     color[3] = 1.0;
   glColor3fv(color);
   else
     color[3] = 1.0;
   glColor3fv(color);
@@ -422,31 +518,32 @@ static void color(double angle)
 }
 
 
 }
 
 
-/* Draw a hyperturus projected into 3D. */
+/* Draw a hypertorus projected into 3D.  Note that the spirals appearance
+   will only work correctly if numu and numv are set to 64 or any higher
+   power of 2.  Similarly, the banded appearance will only work correctly
+   if numu and numv are divisible by 4. */
 static void hypertorus(double umin, double umax, double vmin, double vmax,
                        int numu, int numv)
 {
   static GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
   static GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
 static void hypertorus(double umin, double umax, double vmin, double vmax,
                        int numu, int numv)
 {
   static GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
   static GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
-  static GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.5 };
-  static GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.5 };
+  static GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+  static GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
   float p[3], pu[3], pv[3], n[3], mat[4][4];
   float p[3], pu[3], pv[3], n[3], mat[4][4];
-  int i, j, k, l, m;
+  int i, j, k, l, m, b, skew;
   double u, v, ur, vr;
   double cu, su, cv, sv;
   double xx[4], xxu[4], xxv[4], x[4], xu[4], xv[4];
   double r, s, t;
   double u, v, ur, vr;
   double cu, su, cv, sv;
   double xx[4], xxu[4], xxv[4], x[4], xu[4], xv[4];
   double r, s, t;
+  float q1[4], q2[4], r1[4][4], r2[4][4];
 
 
-  /* Compute the rotation that rotates the hypercube in 4D. */
-  for (i=0; i<4; i++)
-    for (j=0; j<4; j++)
-      mat[i][j] = (i==j);
-  rotatewx(mat,alpha);
-  rotatewy(mat,beta);
-  rotatewz(mat,delta);
-  rotatexy(mat,zeta);
-  rotatexz(mat,eta);
-  rotateyz(mat,theta);
+  rotateall(alpha,beta,delta,zeta,eta,theta,r1);
+
+  gltrackball_get_quaternion(trackballs[0],q1);
+  gltrackball_get_quaternion(trackballs[1],q2);
+  quats_to_rotmat(q1,q2,r2);
+
+  mult_rotmat(r2,r1,mat);
 
   if (colors != COLORS_COLORWHEEL)
   {
 
   if (colors != COLORS_COLORWHEEL)
   {
@@ -463,11 +560,13 @@ static void hypertorus(double umin, double umax, double vmin, double vmax,
     }
   }
 
     }
   }
 
+  skew = num_spirals;
   ur = umax-umin;
   vr = vmax-vmin;
   for (i=0; i<numu; i++)
   {
   ur = umax-umin;
   vr = vmax-vmin;
   for (i=0; i<numu; i++)
   {
-    if (appearance == APPEARANCE_BANDS && ((i & 3) >= 2))
+    if ((appearance == APPEARANCE_BANDS ||
+         appearance == APPEARANCE_SPIRALS) && ((i & 3) >= 2))
       continue;
     if (display_mode == DISP_WIREFRAME)
       glBegin(GL_QUAD_STRIP);
       continue;
     if (display_mode == DISP_WIREFRAME)
       glBegin(GL_QUAD_STRIP);
@@ -481,7 +580,16 @@ static void hypertorus(double umin, double umax, double vmin, double vmax,
         m = j;
         u = ur*l/numu+umin;
         v = vr*m/numv+vmin;
         m = j;
         u = ur*l/numu+umin;
         v = vr*m/numv+vmin;
-        color(u);
+        if (appearance == APPEARANCE_SPIRALS)
+        {
+          u += 4.0*skew/numv*v;
+          b = ((i/4)&(skew-1))*(numu/(4*skew));
+          color(ur*4*b/numu+umin);
+        }
+        else
+        {
+          color(u);
+        }
         cu = cos(u);
         su = sin(u);
         cv = cos(v);
         cu = cos(u);
         su = sin(u);
         cv = cos(v);
@@ -558,6 +666,16 @@ static void init(ModeInfo *mi)
   static GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
   static GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
 
   static GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
   static GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
 
+  if (appearance >= APPEARANCE_SPIRALS_1)
+  {
+    num_spirals = 1<<(appearance-APPEARANCE_SPIRALS_1);
+    appearance = APPEARANCE_SPIRALS;
+  }
+  else
+  {
+    num_spirals = 0;
+  }
+
   alpha = 0.0;
   beta = 0.0;
   delta = 0.0;
   alpha = 0.0;
   beta = 0.0;
   delta = 0.0;
@@ -634,24 +752,27 @@ static void init(ModeInfo *mi)
 /* Redisplay the hypertorus. */
 static void display_hypertorus(void)
 {
 /* Redisplay the hypertorus. */
 static void display_hypertorus(void)
 {
-  alpha += speed_wx;
-  if (alpha >= 360.0)
-    alpha -= 360.0;
-  beta += speed_wy;
-  if (beta >= 360.0)
-    beta -= 360.0;
-  delta += speed_wz;
-  if (delta >= 360.0)
-    delta -= 360.0;
-  zeta += speed_xy;
-  if (zeta >= 360.0)
-    zeta -= 360.0;
-  eta += speed_xz;
-  if (eta >= 360.0)
-    eta -= 360.0;
-  theta += speed_yz;
-  if (theta >= 360.0)
-    theta -= 360.0;
+  if (!button_pressed)
+  {
+    alpha += speed_wx;
+    if (alpha >= 360.0)
+      alpha -= 360.0;
+    beta += speed_wy;
+    if (beta >= 360.0)
+      beta -= 360.0;
+    delta += speed_wz;
+    if (delta >= 360.0)
+      delta -= 360.0;
+    zeta += speed_xy;
+    if (zeta >= 360.0)
+      zeta -= 360.0;
+    eta += speed_xz;
+    if (eta >= 360.0)
+      eta -= 360.0;
+    theta += speed_yz;
+    if (theta >= 360.0)
+      theta -= 360.0;
+  }
 
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
 
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
@@ -669,10 +790,7 @@ static void display_hypertorus(void)
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
 
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
 
-  if (display_mode == DISP_WIREFRAME)
-    hypertorus(0.0,2.0*M_PI,0.0,2.0*M_PI,40,40);
-  else
-    hypertorus(0.0,2.0*M_PI,0.0,2.0*M_PI,60,60);
+  hypertorus(0.0,2.0*M_PI,0.0,2.0*M_PI,64,64);
 }
 
 
 }
 
 
@@ -687,6 +805,64 @@ void reshape_hypertorus(ModeInfo * mi, int width, int height)
 }
 
 
 }
 
 
+Bool hypertorus_handle_event(ModeInfo *mi, XEvent *event)
+{
+  Display *display = MI_DISPLAY(mi);
+  KeySym  sym;
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button == Button1)
+  {
+    button_pressed = True;
+    gltrackball_start(trackballs[current_trackball],
+                      event->xbutton.x, event->xbutton.y,
+                      MI_WIDTH(mi), MI_HEIGHT(mi));
+    return True;
+  }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button == Button1)
+  {
+    button_pressed = False;
+    return True;
+  }
+  else if (event->xany.type == KeyPress)
+  {
+    sym = XKeycodeToKeysym(display,event->xkey.keycode,0);
+    if (sym == XK_Shift_L || sym == XK_Shift_R)
+    {
+      current_trackball = 1;
+      if (button_pressed)
+        gltrackball_start(trackballs[current_trackball],
+                          event->xbutton.x, event->xbutton.y,
+                          MI_WIDTH(mi), MI_HEIGHT(mi));
+      return True;
+    }
+  }
+  else if (event->xany.type == KeyRelease)
+  {
+    sym = XKeycodeToKeysym(display,event->xkey.keycode,0);
+    if (sym == XK_Shift_L || sym == XK_Shift_R)
+    {
+      current_trackball = 0;
+      if (button_pressed)
+        gltrackball_start(trackballs[current_trackball],
+                          event->xbutton.x, event->xbutton.y,
+                          MI_WIDTH(mi), MI_HEIGHT(mi));
+      return True;
+    }
+  }
+  else if (event->xany.type == MotionNotify && button_pressed)
+  {
+    gltrackball_track(trackballs[current_trackball],
+                      event->xmotion.x, event->xmotion.y,
+                      MI_WIDTH(mi), MI_HEIGHT(mi));
+    return True;
+  }
+
+  return False;
+}
+
+
 /*
  *-----------------------------------------------------------------------------
  *-----------------------------------------------------------------------------
 /*
  *-----------------------------------------------------------------------------
  *-----------------------------------------------------------------------------
@@ -714,6 +890,11 @@ void init_hypertorus(ModeInfo * mi)
   }
   hp = &hyper[MI_SCREEN(mi)];
 
   }
   hp = &hyper[MI_SCREEN(mi)];
 
+  trackballs[0] = gltrackball_init();
+  trackballs[1] = gltrackball_init();
+  current_trackball = 0;
+  button_pressed = False;
+
   if ((hp->glx_context = init_GL(mi)) != NULL)
   {
     reshape_hypertorus(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
   if ((hp->glx_context = init_GL(mi)) != NULL)
   {
     reshape_hypertorus(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
index 8342f6dcd90481f15076c43e96340508d00e9981..2d0b64703d6b9cde26f94098a53dc79d2f4fe91a 100644 (file)
@@ -15,6 +15,7 @@ hypertorus - Draws a hypertorus that rotates in 4d
 [\-transparent]
 [\-solid]
 [\-bands]
 [\-transparent]
 [\-solid]
 [\-bands]
+[\-spirals-{1,2,4,8,16}]
 [\-twosided]
 [\-colorwheel]
 [\-perspective-3d]
 [\-twosided]
 [\-colorwheel]
 [\-perspective-3d]
@@ -38,17 +39,18 @@ covered cylinder for some angles.  The projected 3d torus can then be
 projected to the screen either perspectively or orthographically.
 There are three display modes for the torus: mesh (wireframe), solid,
 or transparent.  Furthermore, the appearance of the torus can be as a
 projected to the screen either perspectively or orthographically.
 There are three display modes for the torus: mesh (wireframe), solid,
 or transparent.  Furthermore, the appearance of the torus can be as a
-solid object or as a set of see-through bands.  Finally, the colors
-with with the torus is drawn can be set to either two-sided or to a
-color wheel.  In the first case, the torus is drawn with red on the
-outside and green on the inside.  This mode enables you to see that
-the torus turns inside-out as it rotates in 4d.  The second mode draws
-the torus with a fully saturated color wheel.  This gives a very nice
-effect when combined with the see-through bands mode.  The rotation
-speed for each of the six planes around which the torus rotates can be
-chosen.  This program is very much inspired by Thomas Banchoff's book
-"Beyond the Third Dimension: Geometry, Computer Graphics, and Higher
-Dimensions", Scientific American Library, 1990.
+solid object or as a set of see-through bands or see-through spirals.
+Finally, the colors with with the torus is drawn can be set to either
+two-sided or to a color wheel.  In the first case, the torus is drawn
+with red on the outside and green on the inside.  This mode enables
+you to see that the torus turns inside-out as it rotates in 4d.  The
+second mode draws the torus with a fully saturated color wheel.  This
+gives a very nice effect when combined with the see-through bands or
+see-through spirals mode.  The rotation speed for each of the six
+planes around which the torus rotates can be chosen.  This program is
+very much inspired by Thomas Banchoff's book "Beyond the Third
+Dimension: Geometry, Computer Graphics, and Higher Dimensions",
+Scientific American Library, 1990.
 .SH OPTIONS
 .I hypertorus
 accepts the following options:
 .SH OPTIONS
 .I hypertorus
 accepts the following options:
@@ -82,7 +84,7 @@ Display the torus as a solid surface (default).
 .B \-transparent
 Display the torus as a transparent surface.
 .PP
 .B \-transparent
 Display the torus as a transparent surface.
 .PP
-The following two options are mutually exclusive.  They determine the
+The following seven options are mutually exclusive.  They determine the
 appearance of the torus.
 .TP 8
 .B \-solid
 appearance of the torus.
 .TP 8
 .B \-solid
@@ -90,6 +92,10 @@ Display the torus as a solid object.
 .TP 8
 .B \-bands
 Display the torus as see-through bands (default).
 .TP 8
 .B \-bands
 Display the torus as see-through bands (default).
+.TP 8
+.B \-spirals-1, \-spirals-2, \-spirals-4, \-spirals-8, \-spirals-16
+Display the torus as see-through spirals with the indicated number of
+spirals.
 .PP
 The following two options are mutually exclusive.  They determine how
 to color the torus.
 .PP
 The following two options are mutually exclusive.  They determine how
 to color the torus.
@@ -99,7 +105,10 @@ Display the torus with two colors: red on the outside and green on
 the inside.
 .TP 8
 .B \-colorwheel
 the inside.
 .TP 8
 .B \-colorwheel
-Display the torus with a fully saturated color wheel (default).
+Display the torus with a fully saturated color wheel (default).  If
+the torus is displayed as see-through bands each band will be
+displayed with a different color.  Likewise, if the torus is displayed
+as see-through spirals each spiral will receive a different color.
 .PP
 The following two options are mutually exclusive.  They determine how
 the torus is projected from 3d to 2d (i.e., to the screen).
 .PP
 The following two options are mutually exclusive.  They determine how
 the torus is projected from 3d to 2d (i.e., to the screen).
@@ -143,6 +152,15 @@ Rotation speed around the xz plane (default: 1.9).
 .TP 8
 .B \-speed-yz \fIfloat\fP
 Rotation speed around the yz plane (default: 2.1).
 .TP 8
 .B \-speed-yz \fIfloat\fP
 Rotation speed around the yz plane (default: 2.1).
+.SH INTERACTION
+If you run this program in standalone mode you can rotate the
+hypertorus by dragging the mouse while pressing the left mouse button.
+This rotates the hypertorus in 3D, i.e., around the wx, wy, and wz
+planes.  If you press the shift key while dragging the mouse with the
+left button pressed the hypertorus is rotated in 4D, i.e., around the
+xy, xz, and yz planes.  To examine the hypertorus at your leisure, it
+is best to set all speeds to 0.  Otherwise, the hypertorus will rotate
+while the left mouse button is not pressed.
 .SH ENVIRONMENT
 .PP
 .TP 8
 .SH ENVIRONMENT
 .PP
 .TP 8
@@ -156,7 +174,7 @@ stored in the RESOURCE_MANAGER property.
 .BR X (1),
 .BR xscreensaver (1)
 .SH COPYRIGHT
 .BR X (1),
 .BR xscreensaver (1)
 .SH COPYRIGHT
-Copyright \(co 2003 by Carsten Steger.  Permission to use, copy, modify, 
+Copyright \(co 2003-2005 by Carsten Steger.  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
 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
@@ -164,4 +182,4 @@ 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.
 .SH AUTHOR
 suitability of this software for any purpose.  It is provided "as is" without
 express or implied warranty.
 .SH AUTHOR
-Carsten Steger <carsten@mirsanmir.org>, 27-may-2003.
+Carsten Steger <carsten@mirsanmir.org>, 28-sep-2005.
diff --git a/hacks/glx/juggler3d.c b/hacks/glx/juggler3d.c
new file mode 100644 (file)
index 0000000..56e9707
--- /dev/null
@@ -0,0 +1,2143 @@
+/* Juggler3D, Copyright (c) 2005 Brian Apps <brian@jugglesaver.co.uk>
+ *
+ * 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. */
+
+#include <X11/Intrinsic.h>
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define PROGCLASS          "Juggler3D"
+#define HACK_INIT          Juggler3D_HackInitEvent
+#define HACK_DRAW          Juggler3D_HackDrawEvent
+#define HACK_RESHAPE       Juggler3D_HackReshapeEvent
+#define HACK_HANDLE_EVENT  Juggler3D_HackHandleEvent
+#define EVENT_MASK         PointerMotionMask
+#define SWITCH_OPTS        xlockmore_opts
+
+#define DEFAULTS    \
+    "*JuggleSpeed: 0.15\n*delay: 20000\n*showFPS: False\n*wireframe: False\n"
+
+#include "xlockmore.h"
+#include "gltrackball.h"
+
+#ifdef USE_GL /* whole file */
+#include <GL/glu.h>
+
+/* A selection of macros to make functions from math.h return single precision
+ * numbers.  Arguably it's better to work at a higher precision and cast it
+ * back but littering the code with casts makes it less readable -- without
+ * the casts you can get tons of warnings from the compiler (particularily
+ * MSVC which enables loss of precision warnings by default) */
+#define cosf(a) (float)(cos((a)))
+#define sinf(a) (float)(sin((a)))
+#define tanf(a) (float)(tan((a)))
+#define sqrtf(a) (float)(sqrt((a)))
+#define powf(a, b) (float)(pow((a), (b)))
+
+#undef max
+#undef min
+
+#define max(a, b) ((a) > (b) ? (a) : (b))
+#define min(a, b) ((a) < (b) ? (a) : (b))
+
+
+/******************************************************************************
+ *
+ * The code is broadly split into the following parts:
+ *
+ *  - Engine.  The process of determining the position of the juggler and 
+ *        objects being juggled at an arbitrary point in time.  This is
+ *        independent from any drawing code.
+ *  - Sites.  The process of creating a random site swap pattern or parsing
+ *        a Juggle Saver compatible siteswap for use by the engine.  For an
+ *        introduction to juggling site swaps check out
+ *         http://www.jugglingdb.com/
+ *  - Rendering.  OpenGL drawing code that animates the juggler.
+ *  - XScreenSaver.  Interface code to get thing working as a GLX hack.
+ *  
+ *****************************************************************************/
+
+
+/*****************************************************************************
+ *
+ * Data structures
+ *
+ *****************************************************************************/
+
+/* POS is used to represent the position of a hand when it catches or throws
+ * an object; as well as the orientation of the object.  The rotation and
+ * elevation are specified in degrees.  These angles are not normalised so that
+ * it is possible to specify how the object spins and rotates as it is thrown
+ * from the 'From' position to the 'To' position.
+ * 
+ * Because this is the position of the hand some translation is required with
+ * rings and clubs to get the centre of rotation position. */
+
+typedef struct
+{
+    float x;
+    float y;
+    float z;
+    float Rot;
+    float Elev;
+} POS;
+
+
+/* An array of THROW_INFOs are configured with each entry corresponding to the
+ * position in the site swap (In fact we double up odd length patterns to ensure
+ * there is left/right symmetry).  It allows us to quickly determine where an
+ * object and the hands are at a given time.  The information is specified in
+ * terms of throws, and positions where throws aren't present (0's and 2's) are
+ * simply ignored.
+ * 
+ * TotalTime - The count of beats before this object is thrown again.  Typically
+ *    this is the same as the weight of the throw but where an object is held it
+ *    is longer.  e.g. the first throw of the site 64242.7. will be 10, 6 for
+ *    throw and 4 (two 2's) for the carry.
+ * TimeInAir - The weight of the throw.
+ * PrevThrow - zero based index into array of THROW_INFOs of the previous throw.
+ *     e.g. for the throw '8' in the site 345678..... the PrevThrow is 1
+ *    (i.e. the 4)
+ * FromPos, FromVelocity, ToPos, ToVelocity - The position and speeds at the
+ *    start and end of the throw.  These are used to generate a spline while
+ *    carrying an object and while moving the hand from a throw to a catch.
+ * NextForHand - Number of beats before the hand that throws this object will
+ *    throw another object.  This is always going to be at least 2.  When there
+ *    are gaps in the pattern (0's) or holds (2's) NextForHand increases. */
+
+typedef struct
+{
+    int TotalTime;
+    int TimeInAir;
+    int PrevThrow;
+
+    POS FromPos;
+    POS FromVelocity;
+    POS ToPos;
+    POS ToVelocity;
+
+    int NextForHand;
+} THROW_INFO;
+
+
+/* OBJECT_POSITION works with the array of THROW_INFOs to allow us to determine
+ * exactly where an object or hand is.
+ *
+ * TimeOffset - The total number of beats expired when the object was thrown.
+ * ThrowIndex - The zero based index into the THROW_INFO array for the current
+ *     throw.
+ * ObjectType - One of the OBJECT_XX defines.
+ * TotalTwist - Only relevant for OBJECT_BALL, this is the total amount the ball
+ *     has twisted while in the air.  When segmented balls are drawn you see a 
+ *     spinning effect similar to what happens when you juggle beanbags.  */
+
+#define OBJECT_DEFAULT 0
+#define OBJECT_BALL 1
+#define OBJECT_CLUB 2
+#define OBJECT_RING 3
+
+typedef struct
+{
+    int TimeOffset;
+    int ThrowIndex;
+    float TotalTwist;
+    int ObjectType;
+} OBJECT_POSITION;
+
+
+/* PATTERN_INFO is the main structure that holds the information about a 
+ * juggling pattern. 
+ *
+ * pThrowInfo is an array of ThrowLen elements that describes each throw in the
+ *     pattern.
+ * pObjectInfo gives the current position of all objects at a given instant.
+ *     These values are updated as the pattern is animated.
+ * LeftHand and RightHand describe the current positions of each of the 
+ *     juggler's hands.
+ * MaxWeight is the maximum weight of the all throws in pThrowInfo.
+ * Height and Alpha are parameters that describe how objects fall under the
+ *     influence of gravity.  See SetHeightAndAlpha() for the gory details. */
+
+typedef struct
+{
+    THROW_INFO* pThrowInfo;
+    int ThrowLen;
+    
+    OBJECT_POSITION* pObjectInfo;
+    int Objects;
+
+    OBJECT_POSITION LeftHand;
+    OBJECT_POSITION RightHand;
+    
+    int MaxWeight;
+
+    float Height;
+    float Alpha;
+} PATTERN_INFO;
+
+
+/* EXT_SITE_INFO is used to initialise a PATTERN_INFO object using a Juggle
+ * Saver compatible site swap.  These contain additional information about the
+ * type of object thrown, the positions of throw and catch etc. */
+
+#define HAS_FROM_POS 1
+#define HAS_TO_POS 2
+#define HAS_SNATCH 4
+#define HAS_SPINS 8
+
+typedef struct
+{
+    unsigned Flags;
+    int Weight;
+    int ObjectType;
+    POS FromPos;
+    POS ToPos;
+    float SnatchX;
+    float SnatchY;
+    int Spins;
+} EXT_SITE_INFO;
+
+
+/* RENDER_STATE is used to co-ordinate the OpenGL rendering of the juggler and
+ * objects:
+ * pPattern - The pattern to be juggled
+ * CameraElev - The elevation angle (in degrees) that the camera is looking
+ *    along.  0 is horizontal and a +ve angle is looking down.  This value
+ *    should be between -90 and +90.
+ * AspectRatio - Window width to height ratio.
+ * DLStart - The number for the first display list created, any others directly
+ *    follow this.
+ * Time - Animation time (in beats)
+ * TranslateAngle - Cumulative translation (in degrees) for the juggling figure.
+ * SpinAngle- Cumulative spin (in degrees) for the juggling figure.
+ */
+
+typedef struct
+{
+    PATTERN_INFO* pPattern;
+    float CameraElev;
+    float AspectRatio;
+    int DLStart;
+    
+    float Time;
+    float TranslateAngle;
+    float SpinAngle;
+    
+    trackball_state *trackball;
+    Bool button_down_p;
+
+} RENDER_STATE;
+
+
+/*****************************************************************************
+ *
+ * Engine
+ *
+ ****************************************************************************
+ *
+ * The main purpose of the engine is to work out the exact position of all the
+ * juggling objects and the juggler's hands at any point in time.  The motion
+ * of the objects can be split into two parts: in the air and and being carried.
+ *
+ * While in the air, the motion is governed by a standard parabolic trajectory.
+ * The only minor complication is that the engine has no fixed concept of
+ * gravity, instead it using a term called Alpha that varies according to the
+ * pattern (see SetHeightAndAlpha). 
+ *
+ * The motion while an object is carried comes from fitting a spline through the
+ * catch and throw points and maintaining the catch and throw velocities at
+ * each end.  In the simplest case this boils down to cubic Bezier spline.  The
+ * only wrinkle occurs when a ball is being carried for a long time.  The simple 
+ * cubic spline maths produces a curve that goes miles away -- here we do a
+ * bit of reparameterisation so things stay within sensible bounds.
+ * (On a related note, this scheme is _much_ simpler than the Juggle Saver
+ * one.  Juggle Saver achieves 2nd order continuity and much care is taken
+ * to avoid spline ringing.)
+ * 
+ * The motion of the hands is identical to the ball carrying code. It uses two
+ * splines: one while an object is being carried; and another when it moves from
+ * the previous throw to the next catch.
+ */
+const float CARRY_TIME = 0.56f;
+const float PI = 3.14159265358979f;
+
+
+/* While a ball is thrown it twists slighty about an axis, this routine gives
+ * the total about of twist for a given ball throw. */
+static float GetBallTwistAmount(const THROW_INFO* pThrow)
+{
+    if (pThrow->FromPos.x > pThrow->ToPos.x)
+        return 18.0f * powf(pThrow->TimeInAir, 1.5);
+    else
+        return -18.0f * powf(pThrow->TimeInAir, 1.5);
+}
+
+
+float NormaliseAngle(float Ang)
+{
+    if (Ang >= 0.0f)
+    {
+        int i = (int) (Ang + 180.0f) / 360;
+        return Ang - 360.0f * i;
+    }
+    else
+    {
+        int i = (int)(180.0f - Ang) / 360;
+        return Ang + i * 360.0f;
+    }
+}
+
+
+/* The interpolate routine for ball carrying and hand motion.  We are given the
+ * start (P0) and end (P1) points and the velocities at these points, the task
+ * is to form a function P(t) such that:
+ *    P(0) = P0
+ *    P(TLen) = P1
+ *    P'(0) = V0
+ *    P'(TLen) = V1
+ */
+
+static POS InterpolatePosition(
+    const POS* pP0, const POS* pV0, const POS* pP1, const POS* pV1,
+    float TLen, float t)
+{
+    POS p;
+    float a, b, c, d, tt, tc;
+    
+    /* The interpolation is based on a simple cubic that achieves 1st order
+     * continuity at the end points.  However the spline can become too long if
+     * the TLen parameter is large.  In this case we cap the curve's length (fix
+     * the shape) and then reparameterise time to achieve the continuity
+     * conditions. */
+
+    tc = CARRY_TIME;
+    
+    if (TLen > tc)
+    {
+        /* The reparameterisation tt(t) gives:
+         *  tt(0) = 0, tt(TLen) = tc, tt'(0) = 1, tt'(TLen) = 1
+         * and means we can set t = tt(t), TLen = tc and then fall through
+         * to use the normal cubic spline fit.
+         *    
+         * The reparameterisation is based on two piecewise quadratics, one
+         * that goes from t = 0 to t = TLen / 2 and the other, mirrored in
+         * tt and t that goes from t = TLen / 2 to t = TLen.
+         * Because TLen > tc we can arrange for tt to be unique in the range if
+         * we specify the quadratic in tt.  i.e. t = A * tt ^ 2 + B * tt + C.
+         *
+         * Considering the first piece and applying initial conditions.
+         *   tt = 0 when t = 0   =>  C = 0
+         *   tt' = 1 when t = 0   =>  B = 1
+         *   tt = tc / 2 when t = TLen / 2  =>  A = 2 * (TLen - tc) / tc^2
+         *
+         * writing in terms of t
+         *   tt = (-B + (B ^ 2 + 4At) ^ 0.5) / 2A
+         * or
+         *   tt = ((1 + 4At) ^ 0.5 - 1) / 2A */
+        
+        float A = 2.0f * (TLen - tc) / (tc * tc);
+        
+        if (t > TLen / 2.0f)
+            t = tc - (sqrtf(1.0f + 4.0f * A * (TLen - t)) - 1.0f) / (2.0f * A);
+        else
+            t = (sqrtf(1.0f + 4.0f * A * t) - 1.0f) / (2.0f * A);
+        
+        TLen = tc;
+    }
+    
+    /* The cubic spline takes the form:
+     *   P(t) = p0 * a(t) + v0 * b(t) + p1 * c(t) + v1 * d(t)
+     * where p0 is the start point, v0 the start velocity, p1 the end point and
+     * v1 the end velocity.  a(t), b(t), c(t) and d(t) are cubics in t.
+     * We can show that:
+     *
+     *  a(t) = 2 * (t / TLen) ^ 3 - 3 * (t / TLen) ^ 2 + 1
+     *  b(t) = t ^ 3 / TLen ^ 2 - 2 * t ^ 2 / TLen + t
+     *  c(t) = -2 * (t / TLen) ^ 3 + 3 * (t / TLen) ^ 2
+     *  d(t) = t ^ 3 / TLen ^ 2 - t ^ 2 / TLen
+     *
+     * statisfy the boundary conditions:
+     *    P(0) = p0, P(TLen) = p1, P'(0) = v0 and P'(TLen) = v1  */
+    
+    tt = t / TLen;
+    
+    a = tt * tt * (2.0f * tt - 3.0f) + 1.0f;
+    b = t * tt * (tt - 2.0f) + t;
+    c = tt * tt * (3.0f - 2.0f * tt);
+    d = t * tt * (tt - 1.0f);
+
+    p.x = a * pP0->x + b * pV0->x + c * pP1->x + d * pV1->x;
+    p.y = a * pP0->y + b * pV0->y + c * pP1->y + d * pV1->y;
+    p.z = a * pP0->z + b * pV0->z + c * pP1->z + d * pV1->z;
+
+    p.Rot = a * NormaliseAngle(pP0->Rot) + b * pV0->Rot + 
+        c * NormaliseAngle(pP1->Rot) + d * pV1->Rot;
+    p.Elev = a * NormaliseAngle(pP0->Elev) + b * pV0->Elev + 
+        c * NormaliseAngle(pP1->Elev) + d * pV1->Elev;
+
+    return p;
+}
+
+
+static POS InterpolateCarry(
+    const THROW_INFO* pThrow, const THROW_INFO* pNext, float t)
+{
+    float CT = CARRY_TIME + pThrow->TotalTime - pThrow->TimeInAir;
+    return InterpolatePosition(&pThrow->ToPos, &pThrow->ToVelocity,
+        &pNext->FromPos, &pNext->FromVelocity, CT, t);
+}
+
+
+/* Determine the position of the hand at a point in time. */
+
+void GetHandPosition(
+    PATTERN_INFO* pPattern, int RightHand, float Time, POS* pPos)
+{
+    OBJECT_POSITION* pObj = 
+        RightHand == 0 ? &pPattern->LeftHand : &pPattern->RightHand;
+    THROW_INFO* pLastThrow;
+    
+    /* Upon entry, the throw information for the relevant hand may be out of
+     * sync.  Therefore we advance through the pattern if required. */
+
+    while (pPattern->pThrowInfo[pObj->ThrowIndex].NextForHand + pObj->TimeOffset 
+        <= (int) Time)
+    {
+        int w = pPattern->pThrowInfo[pObj->ThrowIndex].NextForHand;
+        pObj->TimeOffset += w;
+        pObj->ThrowIndex = (pObj->ThrowIndex + w) % pPattern->ThrowLen;
+    }
+
+    pLastThrow = &pPattern->pThrowInfo[pObj->ThrowIndex];
+
+    /* The TimeInAir will only ever be 2 or 0 if no object is ever thrown by
+     * this hand.  In normal circumstances, 2's in the site swap are coalesced
+     * and added to TotalTime of the previous throw.  0 is a hole and means that
+     * an object isn't there.  In this case we just hold the hand still. */
+    if (pLastThrow->TimeInAir == 2 || pLastThrow->TimeInAir == 0)
+    {
+        pPos->x = pLastThrow->FromPos.x;
+        pPos->y = pLastThrow->FromPos.y;
+    }
+    else
+    {
+        /* The hand is either moving to catch the next object or carrying the
+         * next object to its next throw position.  The way THROW_INFO is
+         * structured means the relevant information for the object we're going
+         * to catch is held at the point at which it was thrown 
+         * (pNextThrownFrom).  We can't go straight for it and instead have to
+         * look at the object we've about to throw next and work out where it
+         * came from. */
+        
+        THROW_INFO* pNextThrow = &pPattern->pThrowInfo[
+            (pObj->ThrowIndex + pLastThrow->NextForHand) % pPattern->ThrowLen];
+        
+        THROW_INFO* pNextThrownFrom = 
+            &pPattern->pThrowInfo[pNextThrow->PrevThrow];
+        
+        /* tc is a measure of how long the object we're due to catch is being
+         * carried for.  We use this to work out if we've actually caught it at
+         * this moment in time. */
+        
+        float tc = CARRY_TIME + 
+            pNextThrownFrom->TotalTime - pNextThrownFrom->TimeInAir;
+        
+        Time -= pObj->TimeOffset;
+
+        if (Time > pLastThrow->NextForHand - tc)
+        {
+            /* carrying this ball to it's new location */
+            *pPos = InterpolateCarry(pNextThrownFrom,
+                pNextThrow, (Time - (pLastThrow->NextForHand - tc)));
+        }
+        else
+        {
+            /* going for next catch */
+            *pPos = InterpolatePosition(
+                &pLastThrow->FromPos, &pLastThrow->FromVelocity, 
+                &pNextThrownFrom->ToPos, &pNextThrownFrom->ToVelocity,
+                pLastThrow->NextForHand - tc, Time);
+        }
+    }
+}
+
+
+static float SinDeg(float AngInDegrees)
+{
+    return sinf(AngInDegrees * PI / 180.0f);
+}
+
+
+static float CosDeg(float AngInDegrees)
+{
+    return cosf(AngInDegrees * PI / 180.0f);
+}
+
+
+/* Offset the specified position to get the centre of the object based on the
+ * the handle length and the current orientation */
+
+static void OffsetHandlePosition(const POS* pPos, float HandleLen, POS* pResult)
+{
+    pResult->x = pPos->x + HandleLen * SinDeg(pPos->Rot) * CosDeg(pPos->Elev);
+    pResult->y = pPos->y + HandleLen * SinDeg(pPos->Elev);
+    pResult->z = pPos->z + HandleLen * CosDeg(pPos->Rot) * CosDeg(pPos->Elev);
+    pResult->Elev = pPos->Elev;
+    pResult->Rot = pPos->Rot;
+}
+
+
+static void GetObjectPosition(
+    PATTERN_INFO* pPattern, int Obj, float Time, float HandleLen, POS* pPos)
+{
+    OBJECT_POSITION* pObj = &pPattern->pObjectInfo[Obj];
+    THROW_INFO* pThrow;
+    
+    /* Move through the pattern, if required, such that pThrow corresponds to
+     * the current throw for this object. */
+
+    while (pPattern->pThrowInfo[pObj->ThrowIndex].TotalTime + pObj->TimeOffset
+        <= (int) Time)
+    {
+        int w = pPattern->pThrowInfo[pObj->ThrowIndex].TotalTime;
+        pObj->TimeOffset += w;
+        pObj->TotalTwist = NormaliseAngle(pObj->TotalTwist + 
+            GetBallTwistAmount(&pPattern->pThrowInfo[pObj->ThrowIndex]));
+        
+        pObj->ThrowIndex = (pObj->ThrowIndex + w) % pPattern->ThrowLen;
+    }
+
+    pThrow = &pPattern->pThrowInfo[pObj->ThrowIndex];
+
+    if (pThrow->TimeInAir == 2 || pThrow->TimeInAir == 0)
+    {
+        *pPos = pThrow->FromPos;
+        OffsetHandlePosition(pPos, HandleLen, pPos);
+    }
+    else
+    {
+        float tc = pThrow->TimeInAir - CARRY_TIME;
+        float BallTwist = GetBallTwistAmount(pThrow);
+        Time -= pObj->TimeOffset;
+        if (Time < tc)
+        {
+            /* object in air */
+            POS From, To;
+            float t, b;
+
+            t = Time / tc;
+            
+            OffsetHandlePosition(&pThrow->FromPos, HandleLen, &From);
+            OffsetHandlePosition(&pThrow->ToPos, HandleLen, &To);
+
+            b = (To.y - From.y) / tc + pPattern->Alpha * tc;
+            
+            pPos->x = (1.0f - t) * From.x + t * To.x;
+            pPos->z = (1.0f - t) * From.z + t * To.z;
+            pPos->y = -pPattern->Alpha * Time * Time + b * Time + From.y;
+            
+            if (pObj->ObjectType == OBJECT_BALL)
+                pPos->Rot = pObj->TotalTwist + t * BallTwist;
+            else
+            {
+                /* We describe the rotation of a club (or ring) with an
+                 * elevation and rotation but don't include a twist.
+                 * If we ignore twist for the moment, the orientation at a
+                 * rotation of r and an elevation of e can be also be expressed
+                 * by rotating the object a further 180 degrees and sort of
+                 * mirroring the rotation, e.g.:
+                 *    rot = r + 180 and elev = 180 - e
+                 * We can easily show that the maths holds, consider the
+                 * x, y ,z position of the end of a unit length club.
+                 *    y = sin(180 - e) = sin(e)
+                 *    x = cos(180 - e) * sin(r + 180) = -cos(e) * - sin(r)
+                 *    z = cos(180 - e) * cos(r + 180) = -cos(e) * - cos(r)
+                 * When a club is thrown these two potential interpretations
+                 * can produce unexpected results.
+                 * The approach we adopt is that we try and minimise the amount
+                 * of rotation we give a club -- normally this is what happens
+                 * when juggling since it's much easier to spin the club.
+                 *
+                 * When we come to drawing the object the two interpretations
+                 * aren't identical, one causes the object to twist a further
+                 * 180 about its axis.  We avoid the issue by ensuring our
+                 * objects have rotational symmetry of order 2 (e.g. we make
+                 * sure clubs have an even number of stripes) this makes the two
+                 * interpretations appear identical. */
+
+                float RotAmt = NormaliseAngle(To.Rot - From.Rot);
+
+                if (RotAmt < -90.0f)
+                {
+                    To.Elev += 180  - 2 * NormaliseAngle(To.Elev);
+                    RotAmt += 180.0f;
+                }
+                else if (RotAmt > 90.0f)
+                {
+                    To.Elev += 180 - 2 * NormaliseAngle(To.Elev);
+                    RotAmt -= 180.0f;
+                }
+
+                pPos->Rot = From.Rot + t * RotAmt;
+            }
+
+            pPos->Elev = (1.0f - t) * From.Elev + t * To.Elev;
+
+        }
+        else
+        {
+            THROW_INFO* pNextThrow = &pPattern->pThrowInfo[
+                   (pObj->ThrowIndex + pThrow->TotalTime) % pPattern->ThrowLen];
+
+            *pPos = InterpolateCarry(pThrow, pNextThrow, Time - tc);
+
+            if (pObj->ObjectType == OBJECT_BALL)
+                pPos->Rot = pObj->TotalTwist + BallTwist;
+
+            OffsetHandlePosition(pPos, HandleLen, pPos);
+        }
+    }
+}
+
+
+/* Alpha is used to represent the acceleration due to gravity (in fact
+ * 2 * Alpha is the acceleration).  Alpha is adjusted according to the pattern
+ * being juggled.  My preference is to slow down patterns with lots of objects
+ * -- they move too fast in realtime.  Also I prefer to see a balance between
+ * the size of the figure and the height of objects thrown -- juggling patterns
+ * with large numbers of objects under real gravity can mean balls are lobbed
+ * severe heights.  Adjusting Alpha achieves both these goals.
+ *
+ * Basically we pick a height we'd like to see the biggest throw reach and then
+ * adjust Alpha to meet this. */
+
+static void SetHeightAndAlpha(PATTERN_INFO* pPattern, 
+    const int* Site, const EXT_SITE_INFO* pExtInfo, int Len)
+{
+    float H;
+    int MaxW = 5;
+    int i;
+    
+    if (Site != NULL)
+    {
+        for (i = 0; i < Len; i++)
+            MaxW = max(MaxW, Site[i]);
+    }
+    else
+    {
+        for (i = 0; i < Len; i++)
+            MaxW = max(MaxW, pExtInfo[i].Weight);
+    }
+    
+    /* H is the ideal max height we'd like our objects to reach.  The formula
+     * was developed by trial and error and was simply stolen from Juggle Saver.
+     * Alpha is then calculated from the classic displacement formula:
+     *   s = 0.5at^2 + ut  (where a = 2 * Alpha)
+     * We know u (the velocity) is zero at the peak, and the object should fall
+     * H units in half the time of biggest throw weight.
+     * Finally we determine the proper height the max throw reaches since this
+     * may not be H because capping may be applied (e.g. for max weights less
+     * than 5). */
+    
+    H = 8.0f * powf(MaxW / 2.0f, 0.8f) + 5.0f;
+    pPattern->Alpha = (2.0f * H) / powf(max(5, MaxW) - CARRY_TIME, 2.0f);
+    pPattern->Height = pPattern->Alpha * powf((MaxW - CARRY_TIME) * 0.5f, 2);
+}
+
+
+/* Where positions and spin info is not specified, generate suitable default
+ * values. */
+
+static int GetDefaultSpins(int Weight)
+{
+    if (Weight < 3)
+        return 0;
+    else if (Weight < 4)
+        return 1;
+    else if (Weight < 7)
+        return 2;
+    else
+        return 3;
+}
+
+
+static void GetDefaultFromPosition(unsigned char Side, int Weight, POS* pPos)
+{
+    if (Weight > 4 && Weight % 2 != 0)
+        pPos->x = Side ?  -0.06f : 0.06f;
+    else if (Weight == 0 || Weight == 2)
+        pPos->x = Side ? 1.6f :  -1.6f;
+    else
+        pPos->x = Side? 0.24f :  -0.24f;
+
+    pPos->y = (Weight == 2 || Weight == 0) ? -0.25f : 0.0f;
+
+    pPos->Rot = (Weight % 2 == 0 ? -23.5f : 27.0f) * (Side ? -1.0f : 1.0f);
+
+    pPos->Elev = Weight == 1 ? -30.0f : 0.0f;
+    pPos->z = 0.0f;
+}
+
+
+static void GetDefaultToPosition(unsigned char Side, int Weight, POS* pPos)
+{
+    if (Weight == 1)
+        pPos->x = Side ?  -1.0f : 1.0f;
+    else if (Weight % 2 == 0)
+        pPos->x = Side ? 2.8f :  -2.8f;
+    else
+        pPos->x = Side?  -3.1f : 3.1f;
+
+    pPos->y = -0.5f;
+
+    pPos->Rot = (Side ? -35.0f : 35.0f) * (Weight % 2 == 0 ? -1.0f : 1.0f);
+    
+    if (Weight < 2)
+        pPos->Elev = -30.0f;
+
+    else if (Weight < 4)
+        pPos->Elev = 360.0f - 50.0f;
+    else if (Weight < 7)
+        pPos->Elev = 720.0f - 50.0f;
+    else
+        pPos->Elev = 360.0f * GetDefaultSpins(Weight) - 50.0f;
+    pPos->z = 0.0f;
+}
+
+
+/* Update the members of PATTERN_INFO for a given juggling pattern.  The pattern
+ * can come from an ordinary siteswap (Site != NULL) or from a Juggle Saver
+ * compatible pattern that contains, position and object info etc. 
+ * We assume that patterns are valid and have at least one object (a site of
+ * zeros is invalid).  The ones we generate randomly are safe. */
+
+static void InitPatternInfo(PATTERN_INFO* pPattern,
+    const int* Site, const EXT_SITE_INFO* pExtInfo, int Len)
+{
+    /* Double up on the length of the site if it's of an odd length. 
+     * This way we can store position information: even indices are on one
+     * side and odds are on the other. */
+    int InfoLen = Len % 2 == 1 ? Len * 2 : Len;
+    int i;
+    THROW_INFO* pInfo = (THROW_INFO*) calloc(InfoLen, sizeof(THROW_INFO));
+    int Objects = 0;
+    unsigned char* pUsed;
+    
+    pPattern->MaxWeight = 0;
+    pPattern->ThrowLen = InfoLen;
+    pPattern->pThrowInfo = pInfo;
+    
+    SetHeightAndAlpha(pPattern, Site, pExtInfo, Len);
+
+    /* First pass through we assign the things we know about for sure just by
+     * looking at the throw weight at this position.  This includes TimeInAir;
+     * the throw and catch positions; and throw and catch velocities.
+     * Other information, like the total time for the throw (i.e. when the
+     * object is thrown again) relies on how the rest of the pattern is 
+     * structured and we defer this task for successive passes and just make
+     * guesses at this stage. */
+    
+    for (i = 0; i < InfoLen; i++)
+    {
+        float t1;
+        int w = pExtInfo != NULL ? pExtInfo[i % Len].Weight : Site[i % Len];
+
+        pInfo[i].TotalTime = pInfo[i].TimeInAir = w;
+        pInfo[(w + i) % Len].PrevThrow = i;
+
+        /* work out where we are throwing this object from and where it's going
+         * to land. */
+
+        if (pExtInfo == NULL || (pExtInfo[i % Len].Flags & HAS_FROM_POS) == 0)
+            GetDefaultFromPosition(i % 2, w, &pInfo[i].FromPos);
+        else
+            pInfo[i].FromPos = pExtInfo[i % Len].FromPos;
+
+        if (pExtInfo == NULL || (pExtInfo[i % Len].Flags & HAS_TO_POS) == 0)
+            GetDefaultToPosition(i % 2, w, &pInfo[i].ToPos);
+        else
+            pInfo[i].ToPos = pExtInfo[i % Len].ToPos;
+
+        /* calculate the velocity the object is moving at the start and end
+         * points -- this information is used to interpolate the hand position
+         * and to determine how the object is moved while it's carried to the 
+         * next throw position.
+         *
+         * The throw motion is governed by a parabola of the form:
+         *   y(t) = a * t ^ 2 + b * t + c
+         * Assuming at the start of the throw y(0) = y0; when it's caught
+         * y(t1) = y1; and the accelation is -2.0 * alpha the equation can be
+         * rewritten as:
+         *   y(t) = -alpha * t ^ 2 + (alpha * t1 + (y1 - y0) / t1) * t + y0
+         * making the velocity:
+         *   y'(t) = -2.0 * alpha * t + (alpha * t1 + (y1 - y0) / t1)
+         * To get the y component of velocity first we determine t1, which is
+         * the throw weight minus the time spent carrying the object.  Then
+         * perform the relevant substitutions into the above.
+         * (note: y'(t) = y'(0) - 2.0 * alpha * t)
+         * 
+         * The velocity in the x direction is constant and can be simply
+         * obtained from:
+         *   x' = (x1 - x0) / t1
+         * where x0 and x1 are the start and end x-positions respectively.
+         */
+
+        t1 = w - CARRY_TIME;
+
+        pInfo[i].FromVelocity.y = pPattern->Alpha * t1 + 
+            (pInfo[i].ToPos.y - pInfo[i].FromPos.y) / t1;
+        pInfo[i].ToVelocity.y = 
+            pInfo[i].FromVelocity.y - 2.0f * pPattern->Alpha * t1;
+        pInfo[i].FromVelocity.x = pInfo[i].ToVelocity.x = 
+            (pInfo[i].ToPos.x - pInfo[i].FromPos.x) / t1;
+        pInfo[i].FromVelocity.z = pInfo[i].ToVelocity.z = 
+            (pInfo[i].ToPos.z - pInfo[i].FromPos.z) / t1;
+        pInfo[i].FromVelocity.Rot = pInfo[i].ToVelocity.Rot =
+            (pInfo[i].ToPos.Rot - pInfo[i].FromPos.Rot) / t1;
+        pInfo[i].FromVelocity.Elev = pInfo[i].ToVelocity.Elev =
+            (pInfo[i].ToPos.Elev - pInfo[i].FromPos.Elev) / t1;
+
+
+        if (pExtInfo != NULL && (pExtInfo[i % Len].Flags & HAS_SNATCH) != 0)
+        {
+            pInfo[i].ToVelocity.x = pExtInfo[i % Len].SnatchX;
+            pInfo[i].ToVelocity.y = pExtInfo[i % Len].SnatchY;
+        }
+
+        if (pExtInfo != NULL && (pExtInfo[i % Len].Flags & HAS_SPINS) != 0)
+        {
+            pInfo[i].ToPos.Elev = 360.0f * pExtInfo[i % Len].Spins +
+                NormaliseAngle(pInfo[i].ToPos.Elev);
+        }
+
+        Objects += w;
+        if (w > pPattern->MaxWeight)
+            pPattern->MaxWeight = w;
+    }
+
+    Objects /= InfoLen;
+
+    /* Now we go through again and work out exactly how long it is before the
+     * object is thrown again (ie. the TotalTime) typically this is the same
+     * as the time in air, however when we have a throw weight of '2' it's
+     * treated as a hold and we increase the total time accordingly. */
+
+    for (i = 0; i < InfoLen; i++)
+    {
+        if (pInfo[i].TimeInAir != 2)
+        {
+            int Next = pInfo[i].TimeInAir + i;
+            while (pInfo[Next % InfoLen].TimeInAir == 2)
+            {
+                Next += 2;
+                pInfo[i].TotalTime += 2;
+            }
+
+            /* patch up the Prev index.  We don't bother to see if this
+             * is different from before since it's always safe to reassign it */
+            pInfo[Next % InfoLen].PrevThrow = i;
+        }
+    }
+
+    /* then we work our way through again figuring out where the hand goes to
+     * catch something as soon as it has thrown the current object. */
+
+    for (i = 0; i < InfoLen; i++)
+    {
+        if (pInfo[i].TimeInAir != 0 && pInfo[i].TimeInAir != 2)
+        {
+            /* what we're trying to calculate is how long the hand that threw
+             * the current object has to wait before it throws another.
+             * Typically this is two beats later.  However '0' in the site swap
+             * represents a gap in a catch, and '2' represents a hold.  We skip
+             * over these until we reach the point where a ball is actually
+             * thrown. */
+            int Wait = 2;
+            while (pInfo[(i + Wait) % InfoLen].TimeInAir == 2 || 
+                pInfo[(i + Wait) % InfoLen].TimeInAir == 0)
+            {
+                Wait += 2;
+            }
+            pInfo[i].NextForHand = Wait;
+        }
+        else
+        {
+            /* Be careful to ensure the current weight isn't one we're trying
+             * to step over; otherwise we could potentially end up in an 
+             * infinite loop.  The value we assign may end up being used
+             * in patterns with infinite gaps (e.g. 60) or infinite holds
+             * (e.g. 62) in both cases, setting a wait of 2 ensures things
+             * are well behaved. */
+            pInfo[i].NextForHand = 2;
+        }
+    }
+
+    /* Now work out the starting positions for the objects.  To do this we
+     * unweave the initial throws so we can pick out the individual threads. */
+
+    pUsed = (unsigned char*) 
+        malloc(sizeof(unsigned char) * pPattern->MaxWeight);
+    pPattern->Objects = Objects;
+    pPattern->pObjectInfo = (OBJECT_POSITION*) calloc(
+        Objects, sizeof(OBJECT_POSITION));
+
+    for (i = 0; i < pPattern->MaxWeight; i++)
+        pUsed[i] = 0;
+
+    for (i = 0; i < pPattern->MaxWeight; i++)
+    {
+        int w = pInfo[i % InfoLen].TimeInAir;
+        if (pUsed[i] == 0 &&  w != 0)
+        {
+            Objects--;
+            pPattern->pObjectInfo[Objects].TimeOffset = i;
+            pPattern->pObjectInfo[Objects].ThrowIndex = i % InfoLen;
+            pPattern->pObjectInfo[Objects].TotalTwist = 0.0f;
+
+            if (pExtInfo != NULL && 
+                pExtInfo[i % Len].ObjectType != OBJECT_DEFAULT)
+            {
+                pPattern->pObjectInfo[Objects].ObjectType =
+                    pExtInfo[i % Len].ObjectType;
+            }
+            else
+            {
+                pPattern->pObjectInfo[Objects].ObjectType = (1 + random() % 3);
+            }
+        }
+
+        if (w + i < pPattern->MaxWeight)
+            pUsed[w + i] = 1;
+        
+    }
+
+    pPattern->LeftHand.TimeOffset = pPattern->LeftHand.ThrowIndex = 0;
+    pPattern->RightHand.TimeOffset = pPattern->RightHand.ThrowIndex = 1;
+    
+    free(pUsed);
+}
+
+
+static void ReleasePatternInfo(PATTERN_INFO* pPattern)
+{
+    free(pPattern->pObjectInfo);
+    free(pPattern->pThrowInfo);
+}
+
+
+/*****************************************************************************
+ *
+ * Sites
+ *
+ ****************************************************************************/
+
+/* Generate a random site swap.  We assume that MaxWeight >= ObjCount and
+ * Len >= MaxWeight. */
+static int* Generate(int Len, int MaxWeight, int ObjCount)
+{
+    int* Weight = (int*) calloc(Len, sizeof(int));
+    int* Used = (int*) calloc(Len, sizeof(int));
+    int* Options = (int*) calloc(MaxWeight + 1, sizeof(int));
+    int nOpts;
+    int i, j;
+
+    for (i = 0; i < Len; i++)
+        Weight[i] = Used[i] = -1;
+    
+    /* Pick out a unique the starting position for each object.  -2 is put in
+     * the Used array to signify this is a starting position. */
+
+    while (ObjCount > 0)
+    {
+        nOpts = 0;
+        for (j = 0; j < MaxWeight; j++)
+        {
+            if (Used[j] == -1)
+                Options[nOpts++] = j;
+        }
+
+        Used[Options[random() % nOpts]] = -2;
+        ObjCount--;
+    }
+    
+    /* Now work our way through the pattern moving throws into an available
+     * landing positions. */
+    for (i = 0; i < Len; i++)
+    {
+        if (Used[i] == -1)
+        {
+            /* patch up holes in the pattern to zeros */
+            Used[i] = 1;
+            Weight[i] = 0;
+        }
+        else
+        {
+            /* Work out the possible places where a throw can land and pick a 
+             * weight at random. */
+            int w;
+            nOpts = 0;
+
+            for (j = 0 ; j <= MaxWeight; j++)
+            {
+                if (Used[(i + j) % Len] == -1)
+                    Options[nOpts++] = j;
+            }
+            
+            w = Options[random() % nOpts];
+            Weight[i] = w;
+            
+            /* For starting throws make position available for a throw to land.
+             * Because Len >= MaxWeight these positions will only be filled when
+             * a throw wraps around the end of the site swap and therefore we
+             * can guarantee the all the object threads will be tied up. */
+            if (Used[i] == -2)
+                Used[i] = -1;
+            
+            Used[(i + w) % Len] = 1;
+        }
+    }
+
+    free(Options);
+    free(Used);
+    return Weight;
+}
+
+
+/* Routines to parse the Juggle Saver patterns.  These routines are a bit yucky
+ * and make the big assumption that the patterns are well formed.  This is fine
+ * as it stands because only 'good' ones are used but if the code is ever
+ * extended to read arbitrary patterns (say from a file) then these routines
+ * need to be beefed up. */
+
+/* The position text looks something like (x,y,z[,rot[,elev]])
+ * where the stuff in square brackets is optional */
+
+static unsigned char ParsePositionText(const char** ppch, POS* pPos)
+{
+    const char* pch = *ppch;
+    unsigned char OK;
+    char szTemp[32];
+    char* pOut;
+    float* Nums[4];
+    int i;
+    
+    Nums[0] = &pPos->x;
+    Nums[1] = &pPos->y;
+    Nums[2] = &pPos->Rot;
+    Nums[3] = &pPos->Elev;
+
+
+    while (*pch == ' ')
+        pch++;
+    
+    OK = *pch == '(';
+    
+    if (OK)
+        pch++;
+
+    for (i = 0; OK && i < 4; i++)
+    {
+        pOut = szTemp;
+        while (*pch == ' ')
+            pch++;
+        while (*pch != ',' && *pch != '\0' && *pch != ')' && *pch != ' ')
+            *pOut++ = *pch++;
+        *pOut = '\0';
+
+        if (szTemp[0] != '\0')
+            *Nums[i] = (float) atof(szTemp);
+
+        while (*pch == ' ')
+            pch++;
+
+        if (i < 3)
+        {
+            if (*pch == ',')
+                pch++;
+            else if (*pch == ')')
+                break;
+            else
+                OK = 0;
+        }
+    }
+
+    if (OK)
+    {
+        while (*pch == ' ')
+            pch++;        
+        if (*pch == ')')
+            pch++;
+        else
+            OK = 0;
+    }
+
+    *ppch = pch;
+
+    return OK;
+}
+
+
+static EXT_SITE_INFO* ParsePattern(const char* Site, int* pLen)
+{
+    const char* pch = Site;
+    int Len = 0;
+    EXT_SITE_INFO* pInfo = NULL;
+    unsigned char OK = 1;
+
+    while (OK && *pch != 0)
+    {
+        EXT_SITE_INFO Info;
+        Info.Flags = 0;
+
+        while (*pch == ' ') pch++;
+
+        OK = *pch != '\0';
+
+        if (OK)
+            Info.Weight = *pch >= 'A' ? *pch + 10 - 'A' : *pch - '0';
+
+        /* parse object type */
+        if (OK)
+        {
+            pch++;
+            while (*pch == ' ') pch++;
+
+            if (*pch == 'b' || *pch == 'B')
+            {
+                Info.ObjectType = OBJECT_BALL;
+                pch++;
+            }
+            else if (*pch == 'c' || *pch == 'C')
+            {
+                Info.ObjectType = OBJECT_CLUB;
+                pch++;
+            }
+            else if (*pch == 'r' || *pch == 'R')
+            {
+                Info.ObjectType = OBJECT_RING;
+                pch++;
+            }
+            else if (*pch == 'd' || *pch == 'D')
+            {
+                Info.ObjectType = OBJECT_DEFAULT;
+                pch++;
+            }
+            else
+            {
+                Info.ObjectType = OBJECT_DEFAULT;
+            }
+        }
+
+        /* Parse from position */
+        if (OK)
+        {
+            while (*pch == ' ') pch++;
+            if (*pch == '@')
+            {
+                pch++;
+                GetDefaultFromPosition(Len % 2, Info.Weight, &Info.FromPos);
+                Info.Flags |= HAS_FROM_POS;
+                OK = ParsePositionText(&pch, &Info.FromPos);
+            }
+        }
+
+        /* Parse to position */
+        if (OK)
+        {
+            while (*pch == ' ') pch++;
+            if (*pch == '>')
+            {
+                pch++;
+                GetDefaultToPosition(Len % 2, Info.Weight, &Info.ToPos);
+                Info.Flags |= HAS_TO_POS;
+                OK = ParsePositionText(&pch, &Info.ToPos);
+            }
+        }
+
+        /* Parse snatch */
+        if (OK)
+        {
+            while (*pch == ' ') pch++;
+            if (*pch == '/')
+            {
+                POS Snatch;
+                pch++;
+                Info.Flags |= HAS_SNATCH;
+                OK = ParsePositionText(&pch, &Snatch);
+                Info.SnatchX = Snatch.x;
+                Info.SnatchY = Snatch.y;
+            }
+        }
+
+        /* Parse Spins */
+        if (OK)
+        {
+            while (*pch == ' ') pch++;
+            if (*pch == '*')
+            {
+                pch++;
+                OK = 0;
+                Info.Spins = 0;
+                while (*pch >= '0' && *pch <= '9')
+                {
+                    OK = 1;
+                    Info.Spins = Info.Spins * 10 + *pch - '0';
+                    pch++;
+                }
+            }
+            else
+                Info.Spins = GetDefaultSpins(Info.Weight);
+
+            Info.Flags |= HAS_SPINS;
+        }
+
+        if (OK)
+        {
+            if (pInfo == NULL)
+                pInfo = (EXT_SITE_INFO*) malloc(sizeof(EXT_SITE_INFO));
+            else
+                pInfo = (EXT_SITE_INFO*) realloc(pInfo, (Len + 1) * sizeof(EXT_SITE_INFO));
+
+            pInfo[Len] = Info;
+            Len++;
+        }
+    }
+
+    if (!OK && pInfo != NULL)
+    {
+        free(pInfo);
+        pInfo = NULL;
+    }
+
+    *pLen = Len;
+
+    return pInfo;
+}
+
+
+/*****************************************************************************
+ *
+ *  Juggle Saver Patterns
+ *
+ *****************************************************************************
+ *
+ * This is a selection of some of the more interesting patterns from taken
+ * from the Juggle Saver sites.txt file.  I've only used patterns that I
+ * originally created.
+ */
+
+const char* PatternText[] =
+{
+    "9b@(-2.5,0,-70,40)>(2.5,0,70)*2 1b@(1,0,10)>(-1,0,-10)",
+    
+    "3B@(1,-0.4)>(2,4.2)/(-2,1)3B@(-1.8,4.4)>(-2.1,0)",
+    
+    "7c@(-2,0,-20)>(1.2,0,-5)7c@(2,0,20)>(-1.2,0,5)",
+    
+    "3b@(-0.5,0)>(1.5,0) 3b@(0.5,0)>(-1.5,0) 3r@(-2.5,3,-90,80)>(2,1,90,30)"
+    "3b@(0.5,0)>(-1.5,0) 3b@(-0.5,0)>(1.5,0) 3r@(2.5,3,90,80)>(-2,1,-90,30)",
+    
+    "5c@(2,1.9,10)>(-1,1,10)5c@(2,1.8,10)>(-0.5,1.6,10)/(5,-1)"
+    "5c@(1.6,0.2,10)>(0,-1,10)/(9,-2)5c@(-2,1.9,-10)>(1,1,-10)"
+    "5c@(-2,1.8,-10)>(0.5,1.6,-10)/(-5,-1)5@(-1.6,0.2,-10)>(0,-1,-10)/(-9,-2)",
+    
+    "3c@(-1.5,0,0)>(-1.5,1,0)3c@(1.5,-0.2,0)>(1.5,-0.1,0)3c@(0,-0.5,0)>(0,1,0)"
+    "3@(-1.5,2,0)>(-1.5,-1,0)3@(1.5,0,0)>(1.5,1,0)3@(0,0,0)>(0,-0.5,0)",
+    
+    "9c@(-2.5,0,-70,40)>(2.5,0,70)*2 1c@(1,0,10)>(-1,0,-10)*0",
+    
+    "3c@(2,0.5,60,0)>(1.5,4,60,80)/(-6,-12)"
+    "3c@(-2,0.5,-60,0)>(-1.5,4,-60,80)/(6,-12)",
+    
+    "3c@(-0.2,0)>(1,0)3c@(0.2,0)>(-1,0)3c@(-2.5,2,-85,30)>(2.5,2,85,40)*2 "
+    "3@(0.2,0)>(-1,0) 3@(-0.2,0)>(1,0) 3@(2.5,2,85,30)>(-2.5,2,-85,40)*2",
+    
+    "3c@(-0.5,-0.5,20,-30)>(2.6,4.3,60,60)/(0,1)*1 "
+    "3c@(1.6,5.6,60,80)>(-2.6,0,-80)*0",
+    
+    "5c@(-0.3,0,10)>(1.2,0,10) 5c@(0.3,0,-10)>(-1.2,0,-10)"
+    "5c@(-0.3,0,10)>(1.2,0,10) 5c@(0.3,0,-10)>(-1.2,0,-10)"
+    "5c@(-3,3.5,-65,80)>(3,2.5,65) 5c@(0.3,0,-10)>(-1.2,0,-10)"
+    "5@(-0.3,0,10)>(1.2,0,10) 5@(0.3,0,-10)>(-1.2,0,-10)"
+    "5@(-0.3,0,10)>(1.2,0,10)5@(3,3.5,65,80)>(-3,2.5,-65)"
+};
+
+
+/*****************************************************************************
+ *
+ * Rendering
+ *
+ *****************************************************************************/
+
+static const float FOV = 70.0f;
+static const float BodyCol[] = {0.6f, 0.6f, 0.45f, 1.0f};
+static const float HandleCol[] = {0.45f, 0.45f, 0.45f, 1.0f};
+static const float LightPos[] = {0.0f, 200.0f, 400.0f, 1.0f};
+static const float LightDiff[] = {1.0f, 1.0f, 1.0f, 0.0f};
+static const float LightAmb[] = {0.02f, 0.02f, 0.02f, 0.0f};
+static const float ShoulderPos[3] = {0.95f, 2.1f, 1.7f};
+static const float DiffCol[] = {1.0f, 0.0f, 0.0f, 1.0f};
+static const float SpecCol[] = {1.0f, 1.0f, 1.0f, 1.0f};
+
+static const float BallRad = 0.34f;
+static const float UArmLen = 1.9f;
+static const float LArmLen = 2.3f;
+
+#define DL_BALL 0
+#define DL_CLUB 1
+#define DL_RING 2
+#define DL_TORSO 3
+#define DL_FOREARM 4
+#define DL_UPPERARM 5
+
+static const float AltCols[][4] =
+{
+    {0.0f, 0.7f, 0.0f, 1.0f},
+    {0.0f, 0.0f, 0.9f, 1.0f},
+    {0.0f, 0.9f, 0.9f, 1.0f},
+    {0.45f, 0.0f, 0.9f, 1.0f},
+    {0.9f, 0.45f, 0.0f, 1.0f},
+    {0.0f, 0.45f, 0.9f, 1.0f},
+    {0.9f, 0.0f, 0.9f, 1.0f},
+    {0.9f, 0.9f, 0.0f, 1.0f},
+    {0.9f, 0.0f, 0.45f, 1.0f},
+    {0.45f, 0.15f, 0.6f, 1.0f}, 
+    {0.9f, 0.0f, 0.0f, 1.0f},
+    {0.0f, 0.9f, 0.45f, 1.0f},
+};
+
+static const float Cols[][4] =
+{
+    {0.9f, 0.0f, 0.0f, 1.0f},  /*  0 */
+    {0.0f, 0.7f, 0.0f, 1.0f},  /*  1 */
+    {0.0f, 0.0f, 0.9f, 1.0f},  /*  2 */
+    {0.0f, 0.9f, 0.9f, 1.0f},  /*  3 */
+    {0.9f, 0.0f, 0.9f, 1.0f},  /*  4 */
+    {0.9f, 0.9f, 0.0f, 1.0f},  /*  5 */
+    {0.9f, 0.45f, 0.0f, 1.0f}, /*  6 */
+    {0.9f, 0.0f, 0.45f, 1.0f}, /*  7 */
+    {0.45f, 0.9f, 0.0f, 1.0f}, /*  8 */
+    {0.0f, 0.9f, 0.45f, 1.0f}, /*  9 */
+    {0.45f, 0.0f, 0.9f, 1.0f}, /* 10 */
+    {0.0f, 0.45f, 0.9f, 1.0f}, /* 11 */
+};
+
+static int InitGLDisplayLists(void);
+
+
+void InitGLSettings(RENDER_STATE* pState, int WireFrame)
+{
+    memset(pState, 0, sizeof(RENDER_STATE));
+    
+    pState->trackball = gltrackball_init ();
+
+    if (WireFrame)
+        glPolygonMode(GL_FRONT, GL_LINE);
+    
+    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+    glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
+    glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiff);
+    glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmb);
+    
+    glEnable(GL_SMOOTH);
+    glEnable(GL_LIGHTING);
+    glEnable(GL_LIGHT0);
+
+    glDepthFunc(GL_LESS);
+    glEnable(GL_DEPTH_TEST);
+
+    glCullFace(GL_BACK);
+    glEnable(GL_CULL_FACE);
+    
+    pState->DLStart = InitGLDisplayLists();
+}
+
+
+static void SetCamera(RENDER_STATE* pState)
+{
+    /* Try to work out a sensible place to put the camera so that more or less
+     * the whole juggling pattern fits into the screen. We assume that the
+        * pattern is height limited (i.e. if we get the height right then the width
+        * will be OK).  This is a pretty good assumption given that the screen
+        * tends to wider than high, and that a juggling pattern is normally much
+        * higher than wide.
+     *
+     * If I could draw a diagram here then it would be much easier to
+     * understand but my ASCII-art skills just aren't up to it.  
+     *
+     * Basically we estimate a bounding volume for the juggler and objects 
+     * throughout the pattern.  We don't fully account for the fact that the
+     * juggler moves across the stage in an epicyclic-like motion and instead
+     * use the near and far planes in x-y (with z = +/- w).  We also
+     * assume that the scene is centred at x=0, this reduces our task to finding
+     * a bounding rectangle.  Finally we need to make an estimate of the
+     * height - for this we work out the max height of a standard throw or max
+     * weight from the pattern; we then do a bit of adjustment to account for
+     * a throw occurring at non-zero y values.
+     *
+     * Next we work out the best way to fit this rectangle into the perspective
+     * transform.  Based on the angle of elevation (+ve angle looks down) and
+     * the FOV we can work out whether it's the near or far corners that are
+     * the extreme points.  And then trace back from them to find the eye
+     * point.
+     *
+     */
+     
+    float ElevRad = pState->CameraElev * PI / 180.0f;
+    float w = 3.0f;
+    float cy, cz;
+    float ey, ez;
+    float d;
+    float H = 0.0f;
+    int i;
+    float a;
+    
+    float tz, ty, ta;
+    float bz, by, ba;
+    const PATTERN_INFO* pPattern = pState->pPattern;
+
+    glMatrixMode(GL_PROJECTION);
+    glLoadIdentity();
+        
+    for (i = 0; i < pPattern->ThrowLen; i++)
+        H = max(H, pPattern->pThrowInfo[i].FromPos.y);
+        
+    H += pPattern->Height;
+    
+    ElevRad = pState->CameraElev * PI / 180.0f;
+    
+    /* ta is the angle from a point on the top of the bounding area to the eye
+     * similarly ba is the angle from a point on the bottom. */
+    ta = (pState->CameraElev  - (FOV - 10.0f) / 2.0f) * PI / 180.0f;
+    ba = (pState->CameraElev  + (FOV - 10.0f) / 2.0f) * PI / 180.0f;
+
+    /* tz and bz hold the z location of the top and bottom extreme points.
+     * For the top, if the angle to the eye location is positive then the
+     * extreme point is with far z corner (the camera looks in -ve z).
+     * The logic is reserved for the bottom. */
+    tz = ta >= 0.0f ? -w : w;
+    bz = ba >= 0.0f ? w : -w;
+    
+    ty = H;
+    by = -1.0f;
+    
+    /* Solve of the eye location by using a bit of geometry.
+     * We know the eye lies on intersection of two lines.  One comes from the
+     * top and other from the bottom. Giving two equations:
+     *   ez = tz + a * cos(ta) = bz + b * cos(ba)
+     *   ey = ty + a * sin(ta) = by + b * sin(ba)
+     * We don't bother to solve for b and use Crammer's rule to get
+     *         | bz-tz  -cos(ba) |
+     *         | by-ty  -sin(ba) |     
+     *   a =  ----------------------
+     *        | cos(ta)   -cos(ba) |
+     *        | sin(ta)   -sin(ba) |
+     */
+    d = cosf(ba) * sinf(ta) - cosf(ta) * sinf(ba);
+    a = (cosf(ba) * (by - ty) - sinf(ba) * (bz - tz)) / d;
+    
+    ey = ty + a * sinf(ta);
+    ez = tz + a * cosf(ta);
+    
+    /* now work back from the eye point to get the lookat location */
+    cz = 0.0;
+    cy = ey - ez * tanf(ElevRad);
+    
+    /* use the distance from the eye to the scene centre to get a measure
+     * of what the far clipping should be.  We then add on a bit more to be 
+     * comfortable */
+    d = sqrtf(ez * ez + (cy - ey) * (cy - ey));
+    
+    gluPerspective(FOV, pState->AspectRatio, 0.1f, d + 20.0f);
+    gluLookAt(0.0, ey, ez, 0.0, cy, cz, 0.0, 1.0, 0.0);
+
+    glMatrixMode(GL_MODELVIEW);
+}
+
+
+void ResizeGL(RENDER_STATE* pState, int w, int h)
+{
+    glViewport(0, 0, w, h);
+    pState->AspectRatio = (float) w / h;
+    SetCamera(pState);
+}
+
+
+/* Determine the angle at the vertex of a triangle given the length of the
+ * three sides. */
+
+static double CosineRule(double a, double b, double c)
+{
+    double cosang = (a * a + b * b - c * c) / (2 * a * b);
+    /* If lengths don't form a proper triangle return something sensible.
+     * This typically happens with patterns where the juggler reaches too 
+     * far to get hold of an object. */
+    if (cosang < -1.0 || cosang > 1.0)
+        return 0;
+    else
+        return 180.0 * acos(cosang) / PI;
+}
+
+
+/* Spheres for the balls are generated by subdividing each triangle face into
+ * four smaller triangles.  We start with an octahedron (8 sides) and repeat the
+ * process a number of times.  The result is a mesh that can be split into four
+ * panels (like beanbags) and is smoother than the normal stacks and slices
+ * approach. */
+
+static void InterpolateVertex(
+    const float* v1, const float* v2, float t, float* result)
+{
+    result[0] = v1[0] * (1.0f - t) + v2[0] * t;
+    result[1] = v1[1] * (1.0f - t) + v2[1] * t;
+    result[2] = v1[2] * (1.0f - t) + v2[2] * t;
+}
+
+
+static void SetGLVertex(const float* v, float rad)
+{
+    float Len = sqrtf(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+
+    if (Len >= 1.0e-10f)
+    {
+        glNormal3f(v[0] / Len, v[1] / Len, v[2] / Len);
+        glVertex3f(rad * v[0] / Len, rad * v[1] / Len, rad * v[2] / Len);
+    }
+    else
+        glVertex3fv(v);
+}
+
+
+static void SphereSegment(
+    const float* v1, const float* v2, const float* v3, float r, int Levels)
+{
+    int i, j;
+
+    for (i = 0; i < Levels; i++)
+    {
+        float A[3], B[3], C[3], D[3];
+        
+        InterpolateVertex(v3, v1, (float) i / Levels, D);
+        InterpolateVertex(v3, v1, (float)(i + 1) / Levels, A);
+        InterpolateVertex(v3, v2, (float)(i + 1) / Levels, B);
+        InterpolateVertex(v3, v2, (float) i / Levels, C);
+
+        glBegin(GL_TRIANGLE_STRIP);
+
+        SetGLVertex(B, r);
+        SetGLVertex(C, r);
+        
+        for (j = 1; j <= i; j++)
+        {
+            float v[3];
+
+            InterpolateVertex(B, A, (float) j / (i + 1), v);
+            SetGLVertex(v, r);
+
+            InterpolateVertex(C, D, (float) j / i, v);
+            SetGLVertex(v, r);
+        }
+
+        SetGLVertex(A, r);
+        
+        glEnd();
+    }
+}
+
+
+/* OK, this function is a bit of misnomer, it only draws half a sphere.  Indeed
+ * it draws two panels and allows us to colour this one way,  then draw the
+ * same shape again rotated 90 degrees in a different colour.  Resulting in what
+ * looks like a four-panel beanbag in two complementary colours. */
+static void DrawSphere(float rad)
+{
+    int Levels = 4;
+    float v1[3], v2[3], v3[3];
+    
+    v1[0] = 1.0f, v1[1] = 0.0f; v1[2] = 0.0f;
+    v2[0] = 0.0f, v2[1] = 1.0f; v2[2] = 0.0f;
+    v3[0] = 0.0f, v3[1] = 0.0f; v3[2] = 1.0f;
+    SphereSegment(v1, v2, v3, rad, Levels);
+    
+    v2[1] = -1.0f;
+    SphereSegment(v2, v1, v3, rad, Levels);
+    
+    v1[0] = v3[2] = -1.0f;
+    SphereSegment(v2, v1, v3, rad, Levels);
+
+    v2[1] = 1.0f;
+    SphereSegment(v1, v2, v3, rad, Levels);
+}
+
+
+static void DrawRing(void)
+{
+    const int Facets = 22;
+    const float w = 0.1f;
+    GLUquadric* pQuad = gluNewQuadric();
+    glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+    glTranslatef(0.0f, 0.0f, -w / 2.0f);
+
+    gluCylinder(pQuad, 1.0f, 1.0f, w, Facets, 1);
+    gluQuadricOrientation(pQuad, GLU_INSIDE);
+
+    gluCylinder(pQuad, 0.7f, 0.7f, w, Facets, 1);
+    gluQuadricOrientation(pQuad, GLU_OUTSIDE);
+
+    glTranslatef(0.0f, 0.0f, w);
+    gluDisk(pQuad, 0.7, 1.0f, Facets, 1);
+
+    glRotatef(180.0f, 0.0f, 1.0f, 0.0f);
+    glTranslatef(0.0f, 0.0f, w);
+    gluDisk(pQuad, 0.7, 1.0f, Facets, 1);
+
+    gluDeleteQuadric(pQuad);
+}
+
+
+/* The club follows a 'circus club' design i.e. it has stripes running down the
+ * body.  The club is draw such that the one stripe uses the current material
+ * and the second stripe the standard silver colour. */
+
+void DrawClub(void)
+{
+    const float r[4] = {0.06f, 0.1f, 0.34f, 0.34f / 2.0f};
+    const float z[4] = {-0.4f, 0.6f, 1.35f, 2.1f};
+    float na[4];
+    const int n = 18;
+    int i, j;
+    GLUquadric* pQuad;
+
+    na[0] = (float) atan((r[1] - r[0]) / (z[1] - z[0]));
+    na[1] = (float) atan((r[2] - r[1]) / (z[2] - z[1]));
+    na[2] = (float) atan((r[3] - r[1]) / (z[3] - z[1]));
+    na[3] = (float) atan((r[3] - r[2]) / (z[3] - z[2]));
+
+    for (i = 0; i < n; i += 2)
+    {
+        float a1 = i * PI * 2.0f / n;
+        float a2 = (i + 1) * PI * 2.0f / n;
+
+        glBegin(GL_TRIANGLE_STRIP);
+            for (j = 1; j < 4; j++)
+            {
+                glNormal3f(cosf(na[j]) * cosf(a1),
+                    cosf(na[j]) * sinf(a1), sinf(na[j]));
+
+                glVertex3f(r[j] * cosf(a1), r[j] * sinf(a1), z[j]);
+
+                glNormal3f(cosf(na[j]) * cosf(a2),
+                    cosf(na[j]) * sinf(a2),    sinf(na[j]));
+
+                glVertex3f(r[j] * cosf(a2), r[j] * sinf(a2), z[j]);
+            }
+        glEnd();
+    }
+
+    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, HandleCol);
+
+    for (i = 1; i < n; i += 2)
+    {
+        float a1 = i * PI * 2.0f / n;
+        float a2 = (i + 1) * PI * 2.0f / n;
+
+        glBegin(GL_TRIANGLE_STRIP);
+            for (j = 1; j < 4; j++)
+            {
+                glNormal3f(cosf(na[j]) * cosf(a1),
+                    cosf(na[j]) * sinf(a1),    sinf(na[j]));
+
+                glVertex3f(r[j] * cosf(a1), r[j] * sinf(a1), z[j]);
+
+                glNormal3f(cosf(na[j]) * cosf(a2),
+                    cosf(na[j]) * sinf(a2), sinf(na[j]));
+
+                glVertex3f(r[j] * cosf(a2), r[j] * sinf(a2), z[j]);
+            }
+        glEnd();
+    }
+
+    pQuad = gluNewQuadric();
+    glTranslatef(0.0f, 0.0f, z[0]);
+    gluCylinder(pQuad, r[0], r[1], z[1] - z[0], n, 1);
+
+    glTranslatef(0.0f, 0.0f, z[3] - z[0]);
+    gluDisk(pQuad, 0.0, r[3], n, 1);
+    glRotatef(180.0f, 0.0f, 1.0f, 0.0f);
+    glTranslatef(0.0f, 0.0f, z[3] - z[0]);
+    gluDisk(pQuad, 0.0, r[0], n, 1);
+    gluDeleteQuadric(pQuad);
+}
+
+
+/* In total 6 display lists are used.  There are created based on the DL_
+ * constants defined earlier.  The function returns the index of the first
+ * display list, all others can be calculated based on an offset from there. */
+
+static int InitGLDisplayLists(void)
+{
+    int s = glGenLists(6);
+    GLUquadric* pQuad;
+
+    glNewList(s + DL_BALL, GL_COMPILE);
+    DrawSphere(BallRad);
+    glEndList();
+
+    glNewList(s + DL_CLUB, GL_COMPILE);
+    DrawClub();
+    glEndList();
+
+    glNewList(s + DL_RING, GL_COMPILE);
+    DrawRing();
+    glEndList();
+    
+    pQuad =  gluNewQuadric();
+    gluQuadricNormals(pQuad, GLU_SMOOTH);    
+    
+    glNewList(s + DL_TORSO, GL_COMPILE);
+        glPushMatrix();
+            glTranslatef(ShoulderPos[0], ShoulderPos[1], -ShoulderPos[2]);
+            glRotatef(-90.0f, 0.0f, 1.0f, 0.0f);
+            gluCylinder(pQuad, 0.3, 0.3, ShoulderPos[0] * 2, 18, 1);
+        glPopMatrix();
+
+        glPushMatrix();
+            glTranslatef(0.0f, -1.0f, -ShoulderPos[2]);
+            glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
+            gluCylinder(pQuad, 0.3, 0.3, ShoulderPos[1] + 1.0f, 18, 1);
+            glRotatef(180.0f, 1.0f, 0.0f, 0.0f);
+            gluDisk(pQuad, 0.0, 0.3, 18, 1);
+        glPopMatrix();
+        
+        /* draw the head */
+        glPushMatrix();
+            glTranslatef(0.0f, ShoulderPos[1] + 1.0f, -ShoulderPos[2]);
+            glRotatef(-30.0f, 1.0f, 0.0f, 0.0f);
+            gluCylinder(pQuad, 0.5, 0.5, 0.3, 15, 1);
+            
+            glPushMatrix();
+                glRotatef(180.0f, 1.0f, 0.0f, 0.0f);
+                glRotatef(180.0f, 0.0f, 0.0f, 1.0f);
+                gluDisk(pQuad, 0.0, 0.5, 15, 1);
+            glPopMatrix(); 
+                
+            glTranslatef(0.0f, 0.0f, .3f);
+            gluDisk(pQuad, 0.0, 0.5, 15, 1);
+        glPopMatrix();        
+    glEndList();
+    
+    glNewList(s + DL_UPPERARM, GL_COMPILE);
+        gluQuadricNormals(pQuad, GLU_SMOOTH);
+        gluQuadricDrawStyle(pQuad, GLU_FILL);
+        gluSphere(pQuad, 0.3, 12, 8);
+
+        gluCylinder(pQuad, 0.3, 0.3, UArmLen, 12, 1); 
+        glTranslatef(0.0f, 0.0f, UArmLen);
+        gluSphere(pQuad, 0.3, 12, 8);
+    glEndList();
+
+    glNewList(s + DL_FOREARM, GL_COMPILE);
+        gluCylinder(pQuad, 0.3, 0.3 / 2.0f, LArmLen, 12, 1);
+        glTranslatef(0.0f, 0.0f, LArmLen);
+        gluDisk(pQuad, 0, 0.3 / 2.0f, 18, 1);
+    glEndList();
+
+    gluDeleteQuadric(pQuad);
+    return s;
+}
+
+
+/* Drawing the arm requires connecting the upper and fore arm between the
+ * shoulder and hand position.  Thinking about things kinematically by treating
+ * the shoulder and elbow as ball joints then, provided the arm can stretch far
+ * enough, there's a infnite number of ways to position the elbow.  Basically
+ * it's possible to fix and hand and shoulder and then rotate the elbow a full
+ * 360 degrees.  Clearly human anatomy isn't like this and picking a natural
+ * elbow position can be complex.  We chicken out and assume that poking the
+ * elbow out by 20 degrees from the lowest position gives a reasonably looking
+ * orientation. */
+
+void DrawArm(RENDER_STATE* pState, float TimePos, int Left)
+{
+    POS Pos;
+    float x, y, len, len2, ang, ang2;
+    
+    GetHandPosition(pState->pPattern, Left, TimePos, &Pos);
+
+    x = Pos.x + (Left ? -ShoulderPos[0] : ShoulderPos[0]);
+    y = Pos.y - ShoulderPos[1];
+
+
+    len = sqrtf(x * x + y * y + ShoulderPos[2] * ShoulderPos[2]);
+    len2 = sqrtf(x * x + ShoulderPos[2] * ShoulderPos[2]);
+
+    ang = (float) CosineRule(UArmLen, len, LArmLen);
+    ang2 = (float) CosineRule(UArmLen, LArmLen, len);
+
+    if (ang == 0.0 && ang2 == 0)
+        ang2 = 180.0;
+
+
+    glPushMatrix();
+        glTranslatef(Left ? ShoulderPos[0] : -ShoulderPos[0], ShoulderPos[1],
+            -ShoulderPos[2]);
+        glRotatef((float)(180.0f * asin(x / len2) / 3.14f), 0.0f, 1.0f, 0.0f);
+        glRotatef((float)(-180.f * asin(y / len) / 3.14), 1.0f, 0.0f, 0.0f);
+        glRotatef(Left ? 20.0f : -20.0f, 0.0f, 0.0f, 1.0f);
+        glRotatef((float) ang, 1.0f, 0.0f, 0.0f);
+        glCallList(DL_UPPERARM + pState->DLStart);
+
+        glRotatef((float)(ang2 - 180.0), 1.0f, 0.0f, 0.f);
+        glCallList(DL_FOREARM + pState->DLStart);
+    glPopMatrix();
+}
+
+
+void DrawGLScene(RENDER_STATE* pState)
+{
+    float Time = pState->Time;
+    int nCols = sizeof(Cols) / sizeof(Cols[0]);
+    int i;
+
+    PATTERN_INFO* pPattern = pState->pPattern;
+
+    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
+
+    glMatrixMode(GL_MODELVIEW);
+    glLoadIdentity();
+    glTranslatef(5.0f * sinf(pState->TranslateAngle), 0.0f, 0.0f);
+
+    gltrackball_rotate (pState->trackball);
+
+    glRotatef(pState->SpinAngle, 0.0f, 1.0f, 0.0f);
+    glTranslatef(0.0, 0.0, -1.0f);
+
+    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, DiffCol);
+    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, SpecCol);
+    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 60.0f);
+
+    for (i = 0; i < pPattern->Objects; i++)
+    {
+        POS ObjPos;
+        
+        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Cols[i % nCols]);
+        glPushMatrix();
+
+        switch (pPattern->pObjectInfo[i].ObjectType)
+        {
+            case OBJECT_CLUB:
+                GetObjectPosition(pPattern, i, Time, 1.0f, &ObjPos);
+                glTranslatef(ObjPos.x, ObjPos.y, ObjPos.z);
+                glRotatef(ObjPos.Rot, 0.0f, 1.0f, 0.0f);
+                glRotatef(ObjPos.Elev, -1.0f, 0.0f, 0.0f);
+                glTranslatef(0.0f, 0.0f, -1.0f);
+                glCallList(DL_CLUB + pState->DLStart);
+                break;
+
+            case OBJECT_RING:
+                GetObjectPosition(pPattern, i, Time, 1.0f, &ObjPos);
+                glTranslatef(ObjPos.x, ObjPos.y, ObjPos.z);
+                glRotatef(ObjPos.Rot, 0.0f, 1.0f, 0.0f);
+                glRotatef(ObjPos.Elev, -1.0f, 0.0f, 0.0f);
+                glCallList(DL_RING + pState->DLStart);
+                break;
+
+            default:
+                GetObjectPosition(pPattern, i, Time, 0.0f, &ObjPos);
+                glTranslatef(ObjPos.x, ObjPos.y, ObjPos.z);        
+                glRotatef(ObjPos.Rot, 0.6963f, 0.6963f, 0.1742f);
+                glCallList(DL_BALL + pState->DLStart);
+                glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+                glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, 
+                    AltCols[i % nCols]);
+                glCallList(DL_BALL + pState->DLStart);
+                break;
+        }
+
+        glPopMatrix();
+    }
+
+    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, BodyCol);
+    glCallList(DL_TORSO + pState->DLStart);
+    DrawArm(pState, Time, 1);
+    DrawArm(pState, Time, 0);
+}
+
+
+static int RandInRange(int Min, int Max)
+{
+    return Min + random() % (1 + Max - Min);
+}
+
+
+extern void UpdatePattern(
+    RENDER_STATE* pState, int MinBalls, int MaxBalls, 
+    int MinHeightInc, int MaxHeightInc)
+{
+    if (pState->pPattern != NULL)
+        ReleasePatternInfo(pState->pPattern);
+    
+    pState->pPattern = (PATTERN_INFO*) malloc(sizeof(PATTERN_INFO));
+    
+    if ((random() % 3) == 1)
+    {    
+        int ExtSiteLen;
+        int n = random() % (sizeof(PatternText) / sizeof(PatternText[0]));
+        EXT_SITE_INFO* pExtInfo = ParsePattern(PatternText[n], &ExtSiteLen);
+        InitPatternInfo(pState->pPattern, NULL, pExtInfo, ExtSiteLen);
+        free(pExtInfo);
+    }
+    else
+    {
+        int* pRand;
+        int ballcount, maxweight;
+        const int RandPatternLen = 1500;
+        
+        ballcount = RandInRange(MinBalls, MaxBalls);
+        maxweight = ballcount  + RandInRange(MinHeightInc, MaxHeightInc);
+        
+        pRand = Generate(RandPatternLen, maxweight, ballcount);
+        InitPatternInfo(pState->pPattern, pRand, NULL, RandPatternLen);
+        free(pRand);
+    }
+    
+    pState->CameraElev = 50.0f - random() % 90;
+    pState->TranslateAngle = random() % 360;
+    pState->SpinAngle = random() % 360;
+    pState->Time = 50.0f;
+    SetCamera(pState);
+}
+
+
+/*******************************************************************************
+ *
+ *  XScreenSaver Configuration
+ *
+ ******************************************************************************/
+
+extern XtAppContext app;
+
+typedef struct
+{
+    GLXContext* glxContext;
+    RENDER_STATE RenderState;
+    float CurrentFrameRate;
+    unsigned FramesSinceSync;
+    unsigned LastSyncTime;
+} JUGGLER3D_CONFIG;
+
+
+static JUGGLER3D_CONFIG* pConfigInfo = NULL;
+static int MaxObjects;
+static int MinObjects;
+static int MaxHeightInc;
+static int MinHeightInc;
+static float SpinSpeed;
+static float TranslateSpeed;
+static float JuggleSpeed;
+
+static XrmOptionDescRec Options[] =
+{
+    {"-spin", ".spin", XrmoptionSepArg, 0},
+    {"-trans", ".trans", XrmoptionSepArg, 0},
+    {"-speed", ".speed", XrmoptionSepArg, 0},
+    {"-maxobjs", ".maxobjs", XrmoptionSepArg, 0},
+    {"-minobjs", ".minobjs", XrmoptionSepArg, 0},
+    {"-maxhinc", ".maxhinc", XrmoptionSepArg, 0},
+    {"-minhinc", ".minhinc", XrmoptionSepArg, 0},
+};
+
+
+static argtype Vars[] = 
+{
+    {&MaxObjects, "maxobjs", "MaxObjs", "8", t_Int},
+    {&MinObjects, "minobjs", "MinObjs", "3", t_Int},
+    {&MaxHeightInc, "maxhinc", "MaxHInc", "6", t_Int},
+    {&MinHeightInc, "minhinc", "MaxHInc", "2", t_Int},
+    {&JuggleSpeed, "speed", "JuggleSpeed", "2.2", t_Float},
+    {&TranslateSpeed, "trans", "TranslateSpeed", "0.1", t_Float},
+    {&SpinSpeed, "spin", "SpinSpeed", "20.0", t_Float},
+};
+
+
+ModeSpecOpt SWITCH_OPTS = {countof(Options), Options, countof(Vars), Vars};
+
+
+void Juggler3D_HackReshapeEvent(ModeInfo *mi, int width, int height)
+{
+    JUGGLER3D_CONFIG* pConfig = &pConfigInfo[MI_SCREEN(mi)];
+    ResizeGL(&pConfig->RenderState, width, height);
+}
+
+
+void Juggler3D_HackInitEvent(ModeInfo* mi)
+{
+    JUGGLER3D_CONFIG* pConfig;
+    
+    if (pConfigInfo == NULL)
+    {
+        /* Apply suitable bounds checks to the input parameters */
+        MaxObjects = max(3, min(MaxObjects, 36));
+        MinObjects = max(3, min(MinObjects, MaxObjects));
+
+        MaxHeightInc = max(1, min(MaxHeightInc, 32));
+        MinHeightInc = max(1, min(MinHeightInc, MaxHeightInc));
+            
+        pConfigInfo = (JUGGLER3D_CONFIG*) calloc(
+            MI_NUM_SCREENS(mi), sizeof(JUGGLER3D_CONFIG));
+        if (pConfigInfo == NULL)
+        {
+            fprintf(stderr, "%s: out of memory\n", progname);
+            exit(1);
+        }
+    }
+    
+    pConfig = &pConfigInfo[MI_SCREEN(mi)];
+    pConfig->glxContext = init_GL(mi);
+    pConfig->CurrentFrameRate = 0.0f;
+    pConfig->FramesSinceSync = 0;
+    pConfig->LastSyncTime = 0;
+    InitGLSettings(&pConfig->RenderState, MI_IS_WIREFRAME(mi));
+
+    UpdatePattern(&pConfig->RenderState, MinObjects, MaxObjects, 
+        MinHeightInc, MaxHeightInc);
+    
+    Juggler3D_HackReshapeEvent(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+
+void Juggler3D_HackDrawEvent(ModeInfo* mi)
+{
+    JUGGLER3D_CONFIG* pConfig = &pConfigInfo[MI_SCREEN(mi)];
+    Display* pDisplay = MI_DISPLAY(mi);
+    Window hwnd = MI_WINDOW(mi);
+
+    if (pConfig->glxContext == NULL)
+        return;
+    
+    /* While drawing, keep track of the rendering speed so we can adjust the
+     * animation speed so things appear consistent.  The basis of the this
+     * code comes from the frame rate counter (fps.c) but has been modified
+     * so that it reports the initial frame rate earlier (after 0.02 secs
+     * instead of 1 sec). */
+    
+    if (pConfig->FramesSinceSync >=  1 * (int) pConfig->CurrentFrameRate)
+    {
+        struct timeval tvnow;
+        unsigned now;
+            
+        # ifdef GETTIMEOFDAY_TWO_ARGS
+            struct timezone tzp;
+            gettimeofday(&tvnow, &tzp);
+        # else
+            gettimeofday(&tvnow);
+        # endif
+        
+        now = (unsigned) (tvnow.tv_sec * 1000000 + tvnow.tv_usec);
+        if (pConfig->FramesSinceSync == 0)
+        {
+            pConfig->LastSyncTime = now;
+        }
+        else
+        {
+            unsigned Delta = now - pConfig->LastSyncTime;
+            if (Delta > 20000)
+            {
+                pConfig->LastSyncTime = now;
+                pConfig->CurrentFrameRate = 
+                    (pConfig->FramesSinceSync * 1.0e6f) / Delta;
+                pConfig->FramesSinceSync = 0;
+            }
+        }
+    }
+    
+    pConfig->FramesSinceSync++;
+    
+    if (pConfig->RenderState.Time > 150.0f)
+    {
+        UpdatePattern(&pConfig->RenderState, MinObjects, MaxObjects, 
+            MinHeightInc, MaxHeightInc);
+    }
+    DrawGLScene(&pConfig->RenderState);
+    
+    if (pConfig->CurrentFrameRate > 1.0e-6f)
+    {
+        pConfig->RenderState.Time += JuggleSpeed / pConfig->CurrentFrameRate;
+        pConfig->RenderState.SpinAngle += SpinSpeed / pConfig->CurrentFrameRate;
+        pConfig->RenderState.TranslateAngle += 
+            TranslateSpeed / pConfig->CurrentFrameRate;
+    }
+    
+    if (mi->fps_p)
+        do_fps(mi);
+  
+    glFinish();
+    glXSwapBuffers(pDisplay, hwnd);
+}
+
+
+Bool Juggler3D_HackHandleEvent(ModeInfo* mi, XEvent* pEvent)
+{
+  JUGGLER3D_CONFIG* pConfig = &pConfigInfo[MI_SCREEN(mi)];
+  RENDER_STATE* pState = &pConfig->RenderState;
+
+    if (pEvent->xany.type == ButtonPress &&
+        pEvent->xbutton.button == Button1)
+    {
+      pState->button_down_p = True;
+      gltrackball_start (pState->trackball,
+                         pEvent->xbutton.x, pEvent->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+    else if (pEvent->xany.type == ButtonRelease &&
+             pEvent->xbutton.button == Button1)
+    {
+      pState->button_down_p = False;
+      return True;
+    }
+    else if (pEvent->xany.type == ButtonPress &&
+             (pEvent->xbutton.button == Button4 ||
+              pEvent->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (pState->trackball, pEvent->xbutton.button, 2,
+                              !pEvent->xbutton.state);
+      return True;
+    }
+    else if (pEvent->xany.type == MotionNotify &&
+             pState->button_down_p)
+    {
+      gltrackball_track (pState->trackball,
+                         pEvent->xmotion.x, pEvent->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+    else if (pEvent->xany.type == KeyPress)
+    {
+        char str[20];
+        KeySym Key = 0;
+        int count = XLookupString(&pEvent->xkey, str, 20, &Key, 0);
+        str[count] = '\0';
+        if (*str == ' ')
+        {
+            UpdatePattern(&pConfig->RenderState, MinObjects, MaxObjects, 
+                MinHeightInc, MaxHeightInc);
+        }
+    }
+    
+    return False;
+}
+
+#endif
diff --git a/hacks/glx/juggler3d.man b/hacks/glx/juggler3d.man
new file mode 100644 (file)
index 0000000..a07d890
--- /dev/null
@@ -0,0 +1,88 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+Juggler3D - a 3D juggling simulation.
+.SH SYNOPSIS
+.B juggler3d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-trans \fInumber\fP]
+[\-spin \fInumber\fP]
+[\-maxobjs \fInumber\fP]
+[\-minobjs \fInumber\fP]
+[\-maxhinc \fInumber\fP]
+[\-minhinc \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Displays a 3D simulation of a juggler performing with balls, clubs and rings. 
+Juggling patterns are either created randomly using siteswaps or from a 
+small library of predefined patterns.  \fBjuggler3d\fP is partially based on the
+Win32 screensaver Juggle Saver (www.jugglesaver.co.uk) by the same author.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Speed of objects being juggled in beats per seconds.  Default: 2.2.
+.TP 8
+.B \-trans \fInumber\fP
+Speed of horizontal juggler movement (translational) across the screen in
+degrees/seconds.  Default: 0.1
+.TP 8
+.B \-spin \fInumber\fP
+Speed of juggler rotation in degrees/seconds.  Default: 20
+.TP 8
+.B \-maxobj \fInumber\fP
+Maximum number of objects used in a random juggling pattern. 3 - 36.
+.TP 8
+.B \-minobj \fInumber\fP
+Minimum number of objects used in a random juggling pattern. 3 - \fBmaxobj\fP.
+.TP 8
+.B \-minhinc \fInumber\fP | -maxhinc \fInumber\fP
+Used to determine maximum throw weight in random siteswap.  Options refer to
+minimum height increment and maximum height increment.  Maximum weight chosen
+will lie between \fBmaxobj\fP + \fBminhinc\fP and \fBmaxobj\fP + \fBmaxhinc\fP.
+Defaults: \fBminhinc\fP=1 and \fBmaxhinc\fP=6.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Brian Apps.  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.
+.SH AUTHOR
+Brian Apps <brian@jugglesaver.co.uk>
index a787b0117445be7debcd0d59ce67488246c9aef4..a68302860965508aa7908dcd5950db40cc792732 100644 (file)
@@ -665,6 +665,14 @@ push_bond (molecule *m, int from, int to)
 }
 
 
 }
 
 
+static void
+parse_error (const char *file, int lineno, const char *line)
+{
+  fprintf (stderr, "%s: %s: parse error, line %d: %s\n",
+           progname, file, lineno, line);
+  exit (1);
+}
+
 
 /* This function is crap.
  */
 
 /* This function is crap.
  */
@@ -749,7 +757,8 @@ parse_pdb_data (molecule *m, const char *data, const char *filename, int line)
           char *name = (char *) calloc (1, 4);
           GLfloat x = -999, y = -999, z = -999;
 
           char *name = (char *) calloc (1, 4);
           GLfloat x = -999, y = -999, z = -999;
 
-          sscanf (s+7, " %d ", &id);
+          if (1 != sscanf (s+7, " %d ", &id))
+            parse_error (filename, line, s);
 
           strncpy (name, s+12, 3);
           while (isspace(*name)) name++;
 
           strncpy (name, s+12, 3);
           while (isspace(*name)) name++;
@@ -762,7 +771,9 @@ parse_pdb_data (molecule *m, const char *data, const char *filename, int line)
            *ss = tolower(*ss);
             ss++;
           }
            *ss = tolower(*ss);
             ss++;
           }
-          sscanf (s + 32, " %f %f %f ", &x, &y, &z);
+          if (3 != sscanf (s + 32, " %f %f %f ", &x, &y, &z))
+            parse_error (filename, line, s);
+
 /*
           fprintf (stderr, "%s: %s: %d: atom: %d \"%s\" %9.4f %9.4f %9.4f\n",
                    progname, filename, line,
 /*
           fprintf (stderr, "%s: %s: %d: atom: %d \"%s\" %9.4f %9.4f %9.4f\n",
                    progname, filename, line,
@@ -776,14 +787,16 @@ parse_pdb_data (molecule *m, const char *data, const char *filename, int line)
           char *name = (char *) calloc (1, 4);
           GLfloat x = -999, y = -999, z = -999;
 
           char *name = (char *) calloc (1, 4);
           GLfloat x = -999, y = -999, z = -999;
 
-          sscanf (s+7, " %d ", &id);
+          if (1 != sscanf (s+7, " %d ", &id))
+            parse_error (filename, line, s);
 
           strncpy (name, s+12, 3);
           while (isspace(*name)) name++;
           ss = name + strlen(name)-1;
           while (isspace(*ss) && ss > name)
             *ss-- = 0;
 
           strncpy (name, s+12, 3);
           while (isspace(*name)) name++;
           ss = name + strlen(name)-1;
           while (isspace(*ss) && ss > name)
             *ss-- = 0;
-          sscanf (s + 30, " %f %f %f ", &x, &y, &z);
+          if (3 != sscanf (s + 30, " %f %f %f ", &x, &y, &z))
+            parse_error (filename, line, s);
 /*
           fprintf (stderr, "%s: %s: %d: atom: %d \"%s\" %9.4f %9.4f %9.4f\n",
                    progname, filename, line,
 /*
           fprintf (stderr, "%s: %s: %d: atom: %d \"%s\" %9.4f %9.4f %9.4f\n",
                    progname, filename, line,
index f4043dcaa78cef7e110f8025cc092082bb790a99..781cf5acd7de8d7008afe06ce932f93888ede3fd 100644 (file)
@@ -1,10 +1,10 @@
 /* polytopes --- Shows one of the six regular polytopes rotating in 4d */
 
 #if 0
 /* polytopes --- Shows one of the six regular polytopes rotating in 4d */
 
 #if 0
-static const char sccsid[] = "@(#)polytopes.c  1.1 03/05/18 xlockmore";
+static const char sccsid[] = "@(#)polytopes.c  1.2 05/09/28 xlockmore";
 #endif
 
 #endif
 
-/* Copyright (c) 2003 Carsten Steger <carsten@mirsanmir.org>. */
+/* Copyright (c) 2003-2005 Carsten Steger <carsten@mirsanmir.org>. */
 
 /*
  * Permission to use, copy, modify, and distribute this software and its
 
 /*
  * Permission to use, copy, modify, and distribute this software and its
@@ -21,6 +21,7 @@ static const char sccsid[] = "@(#)polytopes.c  1.1 03/05/18 xlockmore";
  *
  * REVISION HISTORY:
  * C. Steger - 03/08/10: Initial version
  *
  * REVISION HISTORY:
  * C. Steger - 03/08/10: Initial version
+ * C. Steger - 05/09/28: Added trackball support
  */
 
 /*
  */
 
 /*
@@ -113,13 +114,15 @@ static const char sccsid[] = "@(#)polytopes.c  1.1 03/05/18 xlockmore";
 #define DEF_DTHETA                DTHETA_STR
 
 #ifdef STANDALONE
 #define DEF_DTHETA                DTHETA_STR
 
 #ifdef STANDALONE
-# define PROGCLASS       "Polytopes"
-# define HACK_INIT       init_polytopes
-# define HACK_DRAW       draw_polytopes
-# define HACK_RESHAPE    reshape_polytopes
-# define polytopes_opts xlockmore_opts
-# define DEFAULTS        "*delay:      25000 \n" \
-                         "*showFPS:    False \n"
+# define PROGCLASS          "Polytopes"
+# define HACK_INIT          init_polytopes
+# define HACK_DRAW          draw_polytopes
+# define HACK_RESHAPE       reshape_polytopes
+# define HACK_HANDLE_EVENT  polytopes_handle_event
+# define EVENT_MASK         PointerMotionMask|KeyReleaseMask
+# define polytopes_opts     xlockmore_opts
+# define DEFAULTS           "*delay:      25000 \n" \
+                            "*showFPS:    False \n"
 
 # include "xlockmore.h"         /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
 
 # include "xlockmore.h"         /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
@@ -128,8 +131,10 @@ static const char sccsid[] = "@(#)polytopes.c  1.1 03/05/18 xlockmore";
 
 #ifdef USE_GL
 
 
 #ifdef USE_GL
 
+#include <X11/keysym.h>
 #include <GL/gl.h>
 #include <GL/glu.h>
 #include <GL/gl.h>
 #include <GL/glu.h>
+#include "gltrackball.h"
 
 
 #ifdef USE_MODULES
 
 
 #ifdef USE_MODULES
@@ -158,6 +163,11 @@ static float speed_yz;
 static float alpha, beta, delta, zeta, eta, theta;
 static float aspect;
 
 static float alpha, beta, delta, zeta, eta, theta;
 static float aspect;
 
+/* Trackball states */
+trackball_state *trackballs[2];
+int current_trackball;
+Bool button_pressed;
+
 static const float offset4d[4] = {  0.0,  0.0,  0.0,  3.0 };
 static const float offset3d[4] = {  0.0,  0.0, -2.0,  0.0 };
 
 static const float offset4d[4] = {  0.0,  0.0,  0.0,  3.0 };
 static const float offset3d[4] = {  0.0,  0.0, -2.0,  0.0 };
 
@@ -2382,19 +2392,67 @@ static void rotateyz(float m[4][4], float phi)
 
 
 /* Compute the rotation matrix m from the rotation angles. */
 
 
 /* Compute the rotation matrix m from the rotation angles. */
-static void rotateall(float m[4][4])
+static void rotateall(float al, float be, float de, float ze, float et,
+                      float th, float m[4][4])
 {
   int i, j;
 
   for (i=0; i<4; i++)
     for (j=0; j<4; j++)
       m[i][j] = (i==j);
 {
   int i, j;
 
   for (i=0; i<4; i++)
     for (j=0; j<4; j++)
       m[i][j] = (i==j);
-  rotatewx(m,alpha);
-  rotatewy(m,beta);
-  rotatewz(m,delta);
-  rotatexy(m,zeta);
-  rotatexz(m,eta);
-  rotateyz(m,theta);
+  rotatewx(m,al);
+  rotatewy(m,be);
+  rotatewz(m,de);
+  rotatexy(m,ze);
+  rotatexz(m,et);
+  rotateyz(m,th);
+}
+
+
+/* Multiply two rotation matrices: o=m*n. */
+static void mult_rotmat(float m[4][4], float n[4][4], float o[4][4])
+{
+  int i, j, k;
+
+  for (i=0; i<4; i++)
+  {
+    for (j=0; j<4; j++)
+    {
+      o[i][j] = 0.0;
+      for (k=0; k<4; k++)
+        o[i][j] += m[i][k]*n[k][j];
+    }
+  }
+}
+
+
+/* Compute a 4D rotation matrix from two unit quaternions. */
+static void quats_to_rotmat(float p[4], float q[4], float m[4][4])
+{
+  double al, be, de, ze, et, th;
+  double r00, r01, r02, r12, r22;
+
+  r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]);
+  r01 = 2.0*(p[0]*p[1]+p[2]*p[3]);
+  r02 = 2.0*(p[2]*p[0]-p[1]*p[3]);
+  r12 = 2.0*(p[1]*p[2]+p[0]*p[3]);
+  r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]);
+
+  al = atan2(-r12,r22)*180.0/M_PI;
+  be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+  de = atan2(-r01,r00)*180.0/M_PI;
+
+  r00 = 1.0-2.0*(q[1]*q[1]+q[2]*q[2]);
+  r01 = 2.0*(q[0]*q[1]+q[2]*q[3]);
+  r02 = 2.0*(q[2]*q[0]-q[1]*q[3]);
+  r12 = 2.0*(q[1]*q[2]+q[0]*q[3]);
+  r22 = 1.0-2.0*(q[1]*q[1]+q[0]*q[0]);
+
+  ze = atan2(-r12,r22)*180.0/M_PI;
+  et = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+  th = atan2(-r01,r00)*180.0/M_PI;
+
+  rotateall(al,be,de,ze,et,th,m);
 }
 
 
 }
 
 
@@ -2422,10 +2480,16 @@ static void normal(float *p, float *q, float *r, float *n)
 /* Project an array of vertices from 4d to 3d. */
 static void project(float vert[][4], float v[][4], int num)
 {
 /* Project an array of vertices from 4d to 3d. */
 static void project(float vert[][4], float v[][4], int num)
 {
-  float m[4][4], s;
+  float s, q1[4], q2[4], r1[4][4], r2[4][4], m[4][4];
   int i, j, k;
 
   int i, j, k;
 
-  rotateall(m);
+  rotateall(alpha,beta,delta,zeta,eta,theta,r1);
+
+  gltrackball_get_quaternion(trackballs[0],q1);
+  gltrackball_get_quaternion(trackballs[1],q2);
+  quats_to_rotmat(q1,q2,r2);
+
+  mult_rotmat(r2,r1,m);
 
   /* Project the vertices from 4d to 3d. */
   for (i=0; i<num; i++)
 
   /* Project the vertices from 4d to 3d. */
   for (i=0; i<num; i++)
@@ -2786,24 +2850,27 @@ static void init(ModeInfo *mi)
 /* Redisplay the polytopes. */
 static void display_polytopes(ModeInfo *mi)
 {
 /* Redisplay the polytopes. */
 static void display_polytopes(ModeInfo *mi)
 {
-  alpha += speed_wx;
-  if (alpha >= 360.0)
-    alpha -= 360.0;
-  beta += speed_wy;
-  if (beta >= 360.0)
-    beta -= 360.0;
-  delta += speed_wz;
-  if (delta >= 360.0)
-    delta -= 360.0;
-  zeta += speed_xy;
-  if (zeta >= 360.0)
-    zeta -= 360.0;
-  eta += speed_xz;
-  if (eta >= 360.0)
-    eta -= 360.0;
-  theta += speed_yz;
-  if (theta >= 360.0)
-    theta -= 360.0;
+  if (!button_pressed)
+  {
+    alpha += speed_wx;
+    if (alpha >= 360.0)
+      alpha -= 360.0;
+    beta += speed_wy;
+    if (beta >= 360.0)
+      beta -= 360.0;
+    delta += speed_wz;
+    if (delta >= 360.0)
+      delta -= 360.0;
+    zeta += speed_xy;
+    if (zeta >= 360.0)
+      zeta -= 360.0;
+    eta += speed_xz;
+    if (eta >= 360.0)
+      eta -= 360.0;
+    theta += speed_yz;
+    if (theta >= 360.0)
+      theta -= 360.0;
+  }
 
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
 
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
@@ -2863,6 +2930,64 @@ void reshape_polytopes(ModeInfo * mi, int width, int height)
 }
 
 
 }
 
 
+Bool polytopes_handle_event(ModeInfo *mi, XEvent *event)
+{
+  Display *display = MI_DISPLAY(mi);
+  KeySym  sym;
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button == Button1)
+  {
+    button_pressed = True;
+    gltrackball_start(trackballs[current_trackball],
+                      event->xbutton.x, event->xbutton.y,
+                      MI_WIDTH(mi), MI_HEIGHT(mi));
+    return True;
+  }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button == Button1)
+  {
+    button_pressed = False;
+    return True;
+  }
+  else if (event->xany.type == KeyPress)
+  {
+    sym = XKeycodeToKeysym(display,event->xkey.keycode,0);
+    if (sym == XK_Shift_L || sym == XK_Shift_R)
+    {
+      current_trackball = 1;
+      if (button_pressed)
+        gltrackball_start(trackballs[current_trackball],
+                          event->xbutton.x, event->xbutton.y,
+                          MI_WIDTH(mi), MI_HEIGHT(mi));
+      return True;
+    }
+  }
+  else if (event->xany.type == KeyRelease)
+  {
+    sym = XKeycodeToKeysym(display,event->xkey.keycode,0);
+    if (sym == XK_Shift_L || sym == XK_Shift_R)
+    {
+      current_trackball = 0;
+      if (button_pressed)
+        gltrackball_start(trackballs[current_trackball],
+                          event->xbutton.x, event->xbutton.y,
+                          MI_WIDTH(mi), MI_HEIGHT(mi));
+      return True;
+    }
+  }
+  else if (event->xany.type == MotionNotify && button_pressed)
+  {
+    gltrackball_track(trackballs[current_trackball],
+                      event->xmotion.x, event->xmotion.y,
+                      MI_WIDTH(mi), MI_HEIGHT(mi));
+    return True;
+  }
+
+  return False;
+}
+
+
 /*
  *-----------------------------------------------------------------------------
  *-----------------------------------------------------------------------------
 /*
  *-----------------------------------------------------------------------------
  *-----------------------------------------------------------------------------
@@ -2890,6 +3015,11 @@ void init_polytopes(ModeInfo * mi)
   }
   hp = &poly[MI_SCREEN(mi)];
 
   }
   hp = &poly[MI_SCREEN(mi)];
 
+  trackballs[0] = gltrackball_init();
+  trackballs[1] = gltrackball_init();
+  current_trackball = 0;
+  button_pressed = False;
+
   if ((hp->glx_context = init_GL(mi)) != NULL)
   {
     reshape_polytopes(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
   if ((hp->glx_context = init_GL(mi)) != NULL)
   {
     reshape_polytopes(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
index 8e423ab1ac2812b7aa861f10f8a3d25626e61b82..76bf983f89ce0983cb832cf71e71760d511343fb 100644 (file)
@@ -171,6 +171,15 @@ Rotation speed around the xz plane (default: 1.9).
 .TP 8
 .B \-speed-yz \fIfloat\fP
 Rotation speed around the yz plane (default: 2.1).
 .TP 8
 .B \-speed-yz \fIfloat\fP
 Rotation speed around the yz plane (default: 2.1).
+.SH INTERACTION
+If you run this program in standalone mode you can rotate the polytope
+by dragging the mouse while pressing the left mouse button.  This
+rotates the polytope in 3D, i.e., around the wx, wy, and wz planes.
+If you press the shift key while dragging the mouse with the left
+button pressed the polytope is rotated in 4D, i.e., around the xy, xz,
+and yz planes.  To examine the polytope at your leisure, it is best to
+set all speeds to 0.  Otherwise, the polytope will rotate while the
+left mouse button is not pressed.
 .SH ENVIRONMENT
 .PP
 .TP 8
 .SH ENVIRONMENT
 .PP
 .TP 8
@@ -184,7 +193,7 @@ stored in the RESOURCE_MANAGER property.
 .BR X (1),
 .BR xscreensaver (1)
 .SH COPYRIGHT
 .BR X (1),
 .BR xscreensaver (1)
 .SH COPYRIGHT
-Copyright \(co 2003 by Carsten Steger.  Permission to use, copy,
+Copyright \(co 2003-2005 by Carsten Steger.  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
 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
@@ -193,4 +202,4 @@ No representations are made about the suitability of this software for
 any purpose.  It is provided "as is" without express or implied
 warranty.
 .SH AUTHOR
 any purpose.  It is provided "as is" without express or implied
 warranty.
 .SH AUTHOR
-Carsten Steger <carsten@mirsanmir.org>, 10-aug-2003.
+Carsten Steger <carsten@mirsanmir.org>, 28-sep-2005.
index 2c4e4db5dbaaacbf4f2f92921f754d3aae2a26d4..a5aa8a9d3bba1656b5d32366338b77180f1243f9 100644 (file)
@@ -1,12 +1,18 @@
 /* tangram, Copyright (c) 2005 Jeremy English <jhe@jeremyenglish.org>
  *
 /* tangram, Copyright (c) 2005 Jeremy English <jhe@jeremyenglish.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.
+ * 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.
+ *
+ * Sun 10 July 2005 Changed the code that solves the puzzles.
+ *                  Also, limited the palette and added names. 
+ *
+ * Wed 13 July 2005 Added option to turn off rotation.
+ *                  Changed color and materials
  */
 
 
  */
 
 
 
 extern XtAppContext app;
 
 
 extern XtAppContext app;
 
-#define PROGCLASS        "TANGRAM"
+#define PROGCLASS        "Tangram"
 #define HACK_INIT        init_tangram
 #define HACK_DRAW        draw_tangram
 #define HACK_RESHAPE  reshape_tangram
 #define sws_opts         xlockmore_opts
 
 
 #define HACK_INIT        init_tangram
 #define HACK_DRAW        draw_tangram
 #define HACK_RESHAPE  reshape_tangram
 #define sws_opts         xlockmore_opts
 
 
-#define DEFAULTS       "*delay:        30000            \n" \
-                       "*wireframe:    False            \n" \
+#define DEFAULTS       "*delay:        10000            \n" \
+  "*wireframe: False            \n" \
 
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
@@ -39,11 +45,7 @@ extern XtAppContext app;
 #include <time.h>
 #include <math.h>
 #include "tangram_shapes.h"
 #include <time.h>
 #include <math.h>
 #include "tangram_shapes.h"
-
-typedef enum {
-    true = 1,
-    false = 0
-} bool;
+#include "glxfonts.h"
 
 typedef struct {
     GLubyte r;
 
 typedef struct {
     GLubyte r;
@@ -62,9 +64,17 @@ typedef struct {
     GLint r;                    /* rotation */
     GLint fr;                   /* flip Rotate. Used to keep track during animation */
     GLint dl;                   /* display List */
     GLint r;                    /* rotation */
     GLint fr;                   /* flip Rotate. Used to keep track during animation */
     GLint dl;                   /* display List */
-
+    GLfloat dz;                 /* velocity */
+    GLfloat ddz;                /* Acceleration */
+    GLfloat solved;             /* shapes state */
+    Bool up;                    /* Move up the z axis? */
 } tangram_shape;
 
 } tangram_shape;
 
+typedef struct {
+    char *name;
+    tangram_shape ts[7];
+} puzzle;
+
 typedef enum {
     no_shape = -1,
     small_triangle1 = 0,
 typedef enum {
     no_shape = -1,
     small_triangle1 = 0,
@@ -76,763 +86,545 @@ typedef enum {
     rhomboid = 6
 } shape_type;
 
     rhomboid = 6
 } shape_type;
 
-typedef enum {
-    state_exploding,
-    state_solving,
-    state_solved
-} tangram_state;
-
-tangram_shape solved[][7] = {
-    {
-     {{-1.664000, -1.552000, 0}, 135, 0, 0},
-     {{-1.696000, 0.944000, 0}, 315, 0, 0},
-     {{0.064000, -2.128000, 0}, 135, 0, 0},
-     {{-0.960000, -1.056000, 0}, 90, 0, 0},
-     {{1.104000, 0.960000, 0}, 270, 0, 0},
-     {{-1.376000, -0.800000, 0}, 180, 0, 0},
-     {{1.152000, 0.736000, 0}, 360, 0, 0},
-     },
-    {
-     {{-0.096000, 1.552000, 0}, 135, 180, 0},
-     {{-0.064000, 2.336000, 0}, 315, 0, 0},
-     {{-0.080000, -0.224000, 0}, 135, 180, 0},
-     {{-2.096000, 1.584000, 0}, 90, 180, 0},
-     {{1.920000, 1.584000, 0}, 270, 0, 0},
-     {{0.416000, -0.192000, 0}, 180, 0, 0},
-     {{-0.096000, -1.296000, 0}, 335, 0, 0},
-     },
-    {
-     {{-0.144000, -0.720000, 0}, 225, 0, 0},
-     {{0.608000, 0.032000, 0}, 135, 0, 0},
-     {{-1.584000, 0.720000, 0}, 0, 0, 0},
-     {{-0.112000, -0.720000, 0}, 315, 0, 0},
-     {{-0.096000, -0.704000, 0}, 45, 0, 0},
-     {{0.592000, 0.016000, 0}, 225, 0, 0},
-     {{-0.880000, -0.032000, 0}, 315, 0, 0},
-     },
-    {
-     {{1.472000, 2.176000, 0}, 225, 0, 0},
-     {{1.248000, 3.488000, 0}, 270, 0, 0},
-     {{-0.752000, -1.680000, 0}, 270, 0, 0},
-     {{0.704000, -1.552000, 0}, 135, 0, 0},
-     {{1.280000, -0.080000, 0}, 180, 0, 0},
-     {{-0.016000, -0.896000, 0}, 225, 0, 0},
-     {{-0.000000, -0.944000, 0}, 315, 0, 0},
-     },
-    {
-     {{0.320000, 1.360000, 0}, 90, 0, 0},
-     {{0.704000, 3.072000, 0}, 270, 0, 0},
-     {{-1.200000, -3.392000, 0}, 135, 0, 0},
-     {{0.688000, -1.184000, 0}, 135, 0, 0},
-     {{-0.768000, 0.192000, 0}, 315, 0, 0},
-     {{-1.168000, -2.304000, 0}, 180, 0, 0},
-     {{1.312000, 1.296000, 0}, 270, 0, 0},
-     },
-    {
-     {{-2.064000, 0.848000, 0}, 65, 0, 0},
-     {{0.096000, 1.424000, 0}, 99, 180, 0},
-     {{2.016000, -2.448000, 0}, 270, 180, 0},
-     {{-2.016000, 0.368000, 0}, 315, 0, 0},
-     {{-0.560000, -1.040000, 0}, 135, 0, 0},
-     {{1.312000, -1.696000, 0}, 225, 0, 0},
-     {{0.864000, 0.336000, 0}, 180, 180, 0},
-     },
-    {
-     {{0.560000, -0.208000, 0}, 135, 0, 0},
-     {{0.336000, -1.552000, 0}, 90, 180, 0},
-     {{-2.336000, 1.248000, 0}, 90, 180, 0},
-     {{1.296000, -1.504000, 0}, 180, 0, 0},
-     {{-0.896000, 1.200000, 0}, 135, 180, 0},
-     {{0.304000, -2.544000, 0}, 180, 0, 0},
-     {{1.248000, 0.544000, 0}, 225, 0, 0},
-     },
-    {
-     {{-0.480000, -2.832000, 0}, 45, 0, 0},
-     {{-0.544000, -2.832000, 0}, 225, 180, 0},
-     {{-0.064000, -0.880000, 0}, 225, 180, 0},
-     {{-2.528000, 2.656000, 0}, 0, 0, 0},
-     {{-2.512000, 0.640000, 0}, 45, 180, 0},
-     {{0.192000, -2.096000, 0}, 225, 0, 0},
-     {{-0.064000, -0.832000, 0}, 180, 0, 0},
-     },
-    {
-     {{0.880000, -1.456000, 0}, 45, 0, 0},
-     {{0.832000, 0.592000, 0}, 180, 180, 0},
-     {{-2.016000, 1.648000, 0}, 135, 180, 0},
-     {{0.448000, 2.064000, 0}, 315, 0, 0},
-     {{-0.992000, 0.688000, 0}, 315, 180, 0},
-     {{1.856000, -0.400000, 0}, 180, 0, 0},
-     {{-0.128000, -1.424000, 0}, 90, 0, 0},
-     },
-    {
-     {{2.208000, 2.000000, 0}, 180, 0, 0},
-     {{-0.640000, 3.072000, 0}, 180, 180, 0},
-     {{1.360000, -3.312000, 0}, 180, 0, 0},
-     {{-0.592000, 2.256000, 0}, 360, 0, 0},
-     {{-0.960000, -0.160000, 0}, 45, 180, 0},
-     {{0.288000, -2.896000, 0}, 135, 0, 0},
-     {{0.496000, -0.128000, 0}, 135, 0, 0},
-     },
-    {
-     {{-0.480000, 0.864000, 0}, 58, 180, 0},
-     {{0.624000, -0.752000, 0}, 90, 180, 0},
-     {{0.576000, -0.560000, 0}, 180, 180, 0},
-     {{-0.192000, -1.264000, 0}, 225, 0, 0},
-     {{-0.176000, -1.280000, 0}, 135, 180, 0},
-     {{-0.816000, -0.528000, 0}, 123, 0, 0},
-     {{-0.416000, -0.528000, 0}, 90, 0, 0},
-     },
-    {
-     {{0.688000, -0.144000, 0}, 45, 180, 0},
-     {{-0.080000, 0.592000, 0}, 225, 0, 0},
-     {{-0.048000, 0.592000, 0}, 315, 180, 0},
-     {{-1.488000, -0.848000, 0}, 45, 0, 0},
-     {{1.376000, -0.864000, 0}, 225, 180, 0},
-     {{0.688000, -0.128000, 0}, 135, 0, 0},
-     {{-1.504000, -0.832000, 0}, 135, 0, 0},
-     },
-    {
-     {{0.624000, -1.776000, 0}, 225, 180, 0},
-     {{-0.144000, 0.432000, 0}, 225, 0, 0},
-     {{-0.800000, -0.272000, 0}, 45, 180, 0},
-     {{-2.320000, -0.304000, 0}, 45, 0, 0},
-     {{2.048000, -0.320000, 0}, 225, 180, 0},
-     {{-0.112000, 0.480000, 0}, 135, 0, 0},
-     {{-0.832000, -0.320000, 0}, 135, 180, 0},
-     },
-    {
-     {{-1.744000, -0.400000, 0}, 45, 180, 0},
-     {{0.416000, 1.776000, 0}, 315, 0, 0},
-     {{-1.008000, 0.272000, 0}, 90, 180, 0},
-     {{0.800000, 1.488000, 0}, 135, 0, 0},
-     {{0.832000, 1.440000, 0}, 45, 180, 0},
-     {{-1.744000, -1.872000, 0}, 135, 0, 0},
-     {{-1.008000, 0.320000, 0}, 45, 180, 0},
-     },
-    {
-     {{-0.720000, 3.440000, 0}, 180, 180, 0},
-     {{0.912000, -1.072000, 0}, 225, 0, 0},
-     {{0.736000, 3.440000, 0}, 180, 180, 0},
-     {{0.720000, 1.984000, 0}, 225, 0, 0},
-     {{-0.672000, 0.544000, 0}, 45, 180, 0},
-     {{-0.192000, -3.840000, 0}, 135, 0, 0},
-     {{-0.528000, -2.480000, 0}, 135, 0, 0},
-     },
-    {
-     {{1.184000, 1.904000, 0}, 90, 180, 0},
-     {{-2.256000, 0.960000, 0}, 90, 0, 0},
-     {{-0.208000, -0.528000, 0}, 45, 180, 0},
-     {{-0.256000, -0.512000, 0}, 135, 0, 0},
-     {{0.144000, -0.944000, 0}, 135, 180, 0},
-     {{-0.608000, -3.648000, 0}, 105, 0, 0},
-     {{0.832000, -0.912000, 0}, 135, 0, 0},
-     },
-    {
-     {{-1.056000, -2.272000, 0}, 90, 0, 0},
-     {{0.960000, -1.264000, 0}, 180, 0, 0},
-     {{-0.000000, -2.288000, 0}, 135, 0, 0},
-     {{-1.088000, -2.256000, 0}, 180, 0, 0},
-     {{0.992000, 0.736000, 0}, 0, 0, 0},
-     {{0.960000, -0.256000, 0}, 180, 0, 0},
-     {{-0.064000, 0.752000, 0}, 180, 180, 0},
-     },
-    {
-     {{-1.360000, -0.224000, 0}, 0, 0, 0},
-     {{-0.336000, -0.176000, 0}, 90, 0, 0},
-     {{0.688000, -0.192000, 0}, 45, 0, 0},
-     {{-1.424000, -1.168000, 0}, 180, 0, 0},
-     {{1.744000, 0.816000, 0}, 0, 0, 0},
-     {{-0.384000, -0.176000, 0}, 180, 0, 0},
-     {{1.648000, -1.216000, 0}, 270, 180, 0},
-     },
-    {
-     {{2.112000, 1.504000, 0}, 0, 0, 0},
-     {{-1.040000, 1.472000, 0}, 180, 180, 0},
-     {{0.032000, -1.600000, 0}, 135, 0, 0},
-     {{1.056000, 1.504000, 0}, 270, 0, 0},
-     {{-0.992000, -0.528000, 0}, 0, 180, 0},
-     {{2.080000, 0.512000, 0}, 180, 0, 0},
-     {{-1.104000, 0.480000, 0}, 270, 180, 0},
-     },
-    {
-     {{0.608000, 1.184000, 0}, 135, 0, 0},
-     {{-2.928000, -1.584000, 0}, 135, 0, 0},
-     {{0.688000, 0.560000, 0}, 90, 180, 0},
-     {{0.640000, -0.832000, 0}, 180, 0, 0},
-     {{-0.752000, -2.304000, 0}, 315, 180, 0},
-     {{-2.192000, -0.912000, 0}, 315, 0, 0},
-     {{2.704000, 1.616000, 0}, 270, 0, 0},
-     },
-    {
-     {{0.880000, 0.960000, 0}, 45, 0, 0},
-     {{0.832000, -0.960000, 0}, 0, 0, 0},
-     {{1.536000, 1.712000, 0}, 225, 180, 0},
-     {{-0.992000, 2.096000, 0}, 315, 0, 0},
-     {{0.480000, 2.704000, 0}, 180, 180, 0},
-     {{0.816000, 0.912000, 0}, 315, 0, 0},
-     {{0.784000, -1.952000, 0}, 315, 180, 0},
-     },
-    {
-     {{0.176000, 3.584000, 0}, 270, 0, 0},
-     {{2.016000, -1.424000, 0}, 90, 0, 0},
-     {{2.496000, 0.608000, 0}, 180, 180, 0},
-     {{-0.304000, 0.496000, 0}, 270, 0, 0},
-     {{-0.256000, -0.144000, 0}, 0, 180, 0},
-     {{-1.600000, -0.368000, 0}, 303, 0, 0},
-     {{0.768000, 0.912000, 0}, 180, 0, 0},
-     },
-    {
-     {{-2.096000, 1.696000, 0}, 315, 0, 0},
-     {{-1.632000, -1.440000, 0}, 45, 0, 0},
-     {{-1.232000, -0.064000, 0}, 315, 180, 0},
-     {{0.304000, 2.416000, 0}, 315, 0, 0},
-     {{1.776000, -0.496000, 0}, 315, 180, 0},
-     {{1.168000, -0.240000, 0}, 332, 0, 0},
-     {{-0.880000, -1.216000, 0}, 135, 0, 0},
-     },
-    {
-     {{-0.432000, -0.496000, 0}, 259, 0, 0},
-     {{0.176000, -1.488000, 0}, 105, 0, 0},
-     {{1.184000, -1.168000, 0}, 300, 180, 0},
-     {{1.824000, 0.096000, 0}, 195, 0, 0},
-     {{-2.400000, -0.048000, 0}, 11, 180, 0},
-     {{-0.240000, -1.200000, 0}, 315, 0, 0},
-     {{-0.688000, -1.488000, 0}, 281, 180, 0},
-     },
-    {
-     {{0.096000, 2.000000, 0}, 315, 0, 0},
-     {{0.432000, 0.160000, 0}, 360, 0, 0},
-     {{0.208000, -1.504000, 0}, 220, 180, 0},
-     {{-1.104000, -0.336000, 0}, 50, 0, 0},
-     {{-1.136000, -0.288000, 0}, 310, 180, 0},
-     {{0.416000, 1.232000, 0}, 360, 0, 0},
-     {{0.048000, 2.016000, 0}, 225, 180, 0},
-     },
-    {
-     {{-2.128000, 2.112000, 0}, 45, 0, 0},
-     {{0.128000, 1.856000, 0}, 360, 0, 0},
-     {{2.128000, -0.720000, 0}, 180, 180, 0},
-     {{-1.376000, 2.816000, 0}, 360, 0, 0},
-     {{-1.360000, 0.768000, 0}, 45, 180, 0},
-     {{0.128000, 0.336000, 0}, 360, 0, 0},
-     {{0.432000, -2.944000, 0}, 149, 0, 0},
-     },
-    {
-     {{1.952000, -0.800000, 0}, 225, 0, 0},
-     {{2.064000, -0.816000, 0}, 45, 0, 0},
-     {{0.928000, 0.688000, 0}, 225, 0, 0},
-     {{-1.568000, 3.152000, 0}, 0, 0, 0},
-     {{-1.520000, 1.104000, 0}, 45, 0, 0},
-     {{2.720000, -0.064000, 0}, 225, 0, 0},
-     {{1.968000, 0.672000, 0}, 270, 0, 0},
-     },
-    {
-     {{2.480000, -0.912000, 0}, 225, 0, 0},
-     {{2.592000, -0.928000, 0}, 45, 0, 0},
-     {{0.352000, 1.280000, 0}, 315, 0, 0},
-     {{-0.688000, 0.336000, 0}, 135, 0, 0},
-     {{1.808000, -0.112000, 0}, 135, 0, 0},
-     {{3.248000, -0.176000, 0}, 225, 0, 0},
-     {{-1.472000, 1.024000, 0}, 225, 0, 0},
-     },
-    {
-     {{-0.400000, -1.232000, 0}, 270, 0, 0},
-     {{0.400000, -0.640000, 0}, 270, 0, 0},
-     {{1.904000, -3.232000, 0}, 180, 0, 0},
-     {{1.872000, -1.776000, 0}, 225, 0, 0},
-     {{1.552000, 0.656000, 0}, 270, 0, 0},
-     {{1.056000, 1.760000, 0}, 270, 0, 0},
-     {{-0.320000, -1.024000, 0}, 135, 180, 0},
-     },
-    {
-     {{0.896000, -0.480000, 0}, 0, 0, 0},
-     {{0.128000, -0.720000, 0}, 45, 0, 0},
-     {{0.960000, -1.728000, 0}, 270, 0, 0},
-     {{-1.040000, -1.648000, 0}, 90, 0, 0},
-     {{-0.848000, 2.304000, 0}, 0, 0, 0},
-     {{-0.096000, 0.944000, 0}, 315, 0, 0},
-     {{-1.568000, -1.728000, 0}, 90, 180, 0},
-     },
-    {
-     {{0.416000, 3.648000, 0}, 270, 0, 0},
-     {{-0.000000, -1.072000, 0}, 331, 0, 0},
-     {{1.360000, 0.528000, 0}, 180, 0, 0},
-     {{0.880000, 0.464000, 0}, 270, 0, 0},
-     {{0.576000, -3.184000, 0}, 151, 0, 0},
-     {{0.864000, 2.576000, 0}, 270, 0, 0},
-     {{-1.120000, 0.528000, 0}, 90, 0, 0},
-     },
-    {
-     {{-1.056000, -3.456000, 0}, 90, 0, 0},
-     {{0.736000, 2.000000, 0}, 135, 0, 0},
-     {{-1.488000, 1.760000, 0}, 45, 0, 0},
-     {{-0.432000, 0.016000, 0}, 0, 180, 0},
-     {{-0.432000, -0.064000, 0}, 0, 0, 0},
-     {{0.560000, -2.576000, 0}, 225, 0, 0},
-     {{0.032000, 2.656000, 0}, 0, 0, 0},
-     },
-    {
-     {{-2.800000, -2.304000, 0}, 101, 0, 0},
-     {{1.888000, 2.032000, 0}, 135, 180, 0},
-     {{-1.856000, 2.016000, 0}, 315, 0, 0},
-     {{0.352000, -0.144000, 0}, 315, 180, 0},
-     {{-2.848000, 0.976000, 0}, 0, 0, 0},
-     {{-1.424000, -1.104000, 0}, 236, 0, 0},
-     {{-1.792000, 2.016000, 0}, 45, 0, 0},
-     },
-    {
-     {{0.864000, 0.880000, 0}, 180, 0, 0},
-     {{0.912000, -2.288000, 0}, 180, 180, 0},
-     {{-1.136000, -0.144000, 0}, 45, 0, 0},
-     {{-1.136000, -3.312000, 0}, 360, 180, 0},
-     {{-1.168000, 1.920000, 0}, 0, 0, 0},
-     {{-1.184000, -1.248000, 0}, 180, 0, 0},
-     {{-1.136000, -0.224000, 0}, 0, 0, 0},
-     },
-    {
-     {{0.592000, 0.704000, 0}, 90, 0, 0},
-     {{0.576000, -2.496000, 0}, 90, 180, 0},
-     {{2.624000, -1.440000, 0}, 225, 0, 0},
-     {{2.640000, -3.504000, 0}, 270, 180, 0},
-     {{2.656000, 1.712000, 0}, 270, 0, 0},
-     {{0.544000, 0.704000, 0}, 180, 0, 0},
-     {{1.648000, 0.640000, 0}, 0, 0, 0},
-     },
-    {
-     {{0.448000, -3.344000, 0}, 90, 0, 0},
-     {{-1.616000, 1.984000, 0}, 90, 180, 0},
-     {{-1.584000, 0.928000, 0}, 45, 0, 0},
-     {{-1.600000, -2.288000, 0}, 0, 180, 0},
-     {{1.536000, -1.328000, 0}, 270, 0, 0},
-     {{2.592000, -3.328000, 0}, 180, 0, 0},
-     {{-1.600000, 0.832000, 0}, 0, 0, 0},
-     },
-    {
-     {{0.608000, 0.880000, 0}, 180, 0, 0},
-     {{0.576000, -2.304000, 0}, 180, 180, 0},
-     {{-1.456000, -0.176000, 0}, 45, 0, 0},
-     {{-1.472000, -3.344000, 0}, 0, 180, 0},
-     {{-1.472000, 1.888000, 0}, 0, 0, 0},
-     {{0.640000, -1.168000, 0}, 180, 0, 0},
-     {{-1.456000, -0.256000, 0}, 0, 0, 0},
-     },
-    {
-     {{-0.208000, -0.352000, 0}, 225, 0, 0},
-     {{0.528000, 1.856000, 0}, 225, 180, 0},
-     {{-0.176000, -3.904000, 0}, 135, 0, 0},
-     {{-0.880000, 0.384000, 0}, 45, 180, 0},
-     {{-0.192000, -0.384000, 0}, 315, 0, 0},
-     {{0.304000, -2.864000, 0}, 180, 0, 0},
-     {{-0.224000, 2.528000, 0}, 315, 0, 0},
-     },
-    {
-     {{-0.032000, 0.704000, 0}, 315, 0, 0},
-     {{2.208000, -1.504000, 0}, 225, 180, 0},
-     {{-0.720000, -0.064000, 0}, 0, 0, 0},
-     {{-0.720000, -1.536000, 0}, 45, 180, 0},
-     {{-0.016000, 1.744000, 0}, 315, 180, 0},
-     {{0.464000, 0.736000, 0}, 180, 0, 0},
-     {{1.456000, -0.816000, 0}, 315, 0, 0},
-     },
-    {
-     {{-0.944000, 1.040000, 0}, 360, 0, 0},
-     {{1.120000, 0.000000, 0}, 180, 180, 0},
-     {{0.080000, -0.048000, 0}, 315, 0, 0},
-     {{0.080000, -1.104000, 0}, 135, 180, 0},
-     {{0.080000, 1.120000, 0}, 315, 180, 0},
-     {{1.120000, 0.048000, 0}, 180, 0, 0},
-     {{0.064000, 0.992000, 0}, 180, 180, 0},
-     },
-    {
-     {{-0.688000, 0.784000, 0}, 135, 0, 0},
-     {{0.800000, 0.784000, 0}, 135, 0, 0},
-     {{0.512000, -2.512000, 0}, 315, 0, 0},
-     {{1.488000, 0.000000, 0}, 225, 0, 0},
-     {{-1.392000, 0.000000, 0}, 45, 0, 0},
-     {{0.496000, -2.432000, 0}, 180, 0, 0},
-     {{0.480000, -2.496000, 0}, 270, 0, 0},
-     },
-    {
-     {{-0.992000, -2.160000, 0}, 90, 0, 0},
-     {{-1.040000, -1.152000, 0}, 270, 0, 0},
-     {{0.064000, -2.144000, 0}, 135, 0, 0},
-     {{0.080000, -1.088000, 0}, 90, 0, 0},
-     {{0.032000, -1.072000, 0}, 180, 0, 0},
-     {{0.544000, -3.216000, 0}, 180, 0, 0},
-     {{2.160000, -1.136000, 0}, 270, 0, 0},
-     },
-    {
-     {{-2.896000, -0.128000, 0}, 45, 0, 0},
-     {{-0.800000, 0.992000, 0}, 135, 0, 0},
-     {{-1.152000, -0.416000, 0}, 225, 0, 0},
-     {{-0.016000, 0.656000, 0}, 315, 0, 0},
-     {{1.456000, -0.736000, 0}, 135, 0, 0},
-     {{2.864000, 0.736000, 0}, 180, 0, 0},
-     {{-0.048000, 1.664000, 0}, 180, 180, 0},
-     },
-    {
-     {{2.960000, -1.376000, 0}, 270, 0, 0},
-     {{1.952000, -1.312000, 0}, 90, 0, 0},
-     {{-0.096000, 0.720000, 0}, 315, 0, 0},
-     {{-2.112000, -0.320000, 0}, 90, 180, 0},
-     {{1.904000, -0.320000, 0}, 180, 180, 0},
-     {{-0.096000, -1.776000, 0}, 135, 0, 0},
-     {{-3.168000, -2.304000, 0}, 360, 180, 0},
-     },
-    {
-     {{-1.600000, -1.232000, 0}, 270, 0, 0},
-     {{-1.600000, -0.128000, 0}, 180, 0, 0},
-     {{2.272000, -0.128000, 0}, 225, 0, 0},
-     {{-0.160000, -3.648000, 0}, 315, 180, 0},
-     {{-0.176000, 2.336000, 0}, 135, 180, 0},
-     {{-2.608000, -1.184000, 0}, 90, 0, 0},
-     {{1.280000, -2.208000, 0}, 360, 180, 0}
-     }
+#define SPEED 0.03
+enum {
+    BOTTOM = 0,
+    DEF_WAIT = 500,
+    INIT_DZ = 2,
+    NUM_SHAPES = 7
 };
 
 };
 
+typedef struct {
+    GLXContext *glx_context;
+    tangram_shape tsm1, tsm2, tm, tlg1, tlg2, sq, rh;
+    tangram_shape n_tsm1, n_tsm2, n_tm, n_tlg1, n_tlg2, n_sq, n_rh;
+    char *puzzle_name;
+    int csi;
 
 
-/* Dream */
-color palette[] = {
-    {22, 26, 28},
-    {122, 142, 139},
-    {72, 82, 76},
-    {94, 115, 108},
-    {194, 202, 195},
-    {165, 175, 171},
-    {132, 117, 107},
-    {49, 54, 48},
-    {111, 84, 78},
-    {155, 144, 137},
-    {82, 99, 100},
-    {87, 57, 52},
-    {131, 132, 125},
-    {110, 130, 125},
-    {62, 70, 68},
-    {156, 160, 153},
-    {182, 190, 184},
-    {112, 116, 111},
-    {56, 37, 35},
-    {226, 230, 226},
-    {146, 158, 154},
-    {111, 101, 91},
-    {96, 99, 96},
-    {158, 130, 115},
-    {147, 117, 105},
-    {90, 85, 83},
-    {112, 124, 121},
-    {140, 144, 136},
-    {176, 162, 156},
-    {69, 56, 52},
-    {183, 177, 169},
-    {34, 38, 33},
-    {213, 219, 212},
-    {96, 108, 107},
-    {143, 132, 121},
-    {159, 166, 156},
-    {132, 124, 113},
-    {141, 151, 149},
-    {132, 100, 94},
-    {75, 73, 68},
-    {57, 62, 57},
-    {78, 90, 83},
-    {210, 205, 207},
-    {155, 152, 143},
-    {42, 47, 40},
-    {94, 70, 64},
-    {195, 193, 188},
-    {124, 116, 106},
-    {123, 124, 117},
-    {173, 182, 172},
-    {133, 138, 135},
-    {183, 185, 178},
-    {120, 130, 120},
-    {96, 100, 110},
-    {127, 88, 78},
-    {166, 161, 154},
-    {91, 92, 98},
-    {132, 124, 136},
-    {101, 122, 117},
-    {112, 108, 99},
-    {140, 144, 151},
-    {98, 109, 116},
-    {58, 58, 51},
-    {84, 84, 82},
-    {132, 132, 142},
-    {112, 116, 127},
-    {58, 48, 48},
-    {66, 66, 58},
-    {205, 210, 205},
-    {70, 78, 80},
-    {246, 246, 244},
-    {167, 168, 159},
-    {147, 152, 145},
-    {166, 154, 148},
-    {107, 73, 67},
-    {175, 177, 168},
-    {132, 117, 126},
-    {86, 106, 101},
-    {78, 78, 75},
-    {123, 138, 135},
-    {112, 92, 83},
-    {143, 138, 127},
-    {133, 109, 95},
-    {38, 34, 44},
-    {150, 134, 147},
-    {147, 123, 115},
-    {46, 48, 54},
-    {195, 198, 195},
-    {194, 186, 188},
-    {122, 110, 100},
-    {105, 116, 106},
-    {42, 42, 42},
-    {223, 221, 220},
-    {68, 71, 65},
-    {156, 160, 164},
-    {114, 124, 132},
-    {155, 152, 163},
-    {103, 94, 89},
-    {58, 63, 70},
-    {132, 143, 137},
-    {168, 143, 128},
-    {190, 198, 190},
-    {239, 237, 237},
-    {103, 101, 94},
-    {84, 90, 84},
-    {211, 213, 210},
-    {183, 185, 188},
-    {94, 94, 108},
-    {203, 204, 196},
-    {123, 125, 135},
-    {120, 132, 133},
-    {111, 110, 125},
-    {28, 32, 28},
-    {53, 56, 62},
-    {88, 63, 59},
-    {104, 108, 103},
-    {140, 124, 115},
-    {147, 126, 137},
-    {155, 144, 157},
-    {87, 98, 92},
-    {188, 192, 189},
-    {162, 133, 115},
-    {148, 144, 134},
-    {175, 169, 162},
-    {138, 131, 120},
-    {118, 124, 118},
-    {139, 125, 135},
-    {148, 144, 154},
-    {72, 47, 44},
-    {100, 72, 66},
-    {66, 42, 39},
-    {105, 84, 73},
-    {86, 78, 82},
-    {234, 238, 236},
-    {108, 78, 73},
-    {130, 110, 121},
-    {134, 150, 146},
-    {254, 254, 252},
-    {151, 138, 130},
-    {125, 99, 88},
-    {80, 56, 52},
-    {98, 63, 60},
-    {114, 138, 132},
-    {61, 42, 37},
-    {150, 166, 164},
-    {127, 94, 87},
-    {225, 226, 223},
-    {64, 47, 44},
-    {218, 226, 220},
-    {242, 242, 242},
-    {150, 138, 150},
-    {166, 138, 122},
-    {102, 78, 71},
-    {124, 118, 131},
-    {74, 65, 66},
-    {49, 33, 28},
-    {182, 170, 175},
-    {139, 117, 107},
-    {120, 84, 76},
-    {232, 232, 231},
-    {46, 50, 41},
-    {102, 102, 115},
-    {104, 108, 119},
-    {140, 118, 123},
-    {120, 92, 84},
-    {139, 108, 97},
-    {156, 125, 107},
-    {218, 214, 215},
-    {144, 133, 143},
-    {168, 161, 172},
-    {58, 58, 68},
-    {167, 169, 173},
-    {148, 152, 158},
-    {175, 177, 180},
-    {67, 73, 77},
-    {134, 143, 148},
-    {79, 50, 45},
-    {74, 83, 86},
-    {150, 134, 124},
-    {90, 86, 95},
-    {184, 176, 186},
-    {38, 39, 45},
-    {160, 168, 166},
-    {78, 73, 78},
-    {195, 193, 196},
-    {177, 184, 181},
-    {43, 41, 52},
-    {32, 33, 39},
-    {135, 138, 148},
-    {203, 198, 201},
-    {26, 26, 28},
-    {98, 116, 113},
-    {198, 202, 199},
-    {170, 176, 172},
-    {54, 57, 48},
-    {162, 146, 140},
-    {114, 131, 130},
-    {162, 160, 150},
-    {118, 116, 108},
-    {150, 159, 156},
-    {118, 99, 84},
-    {74, 54, 51},
-    {138, 102, 100},
-    {62, 64, 55},
-    {162, 154, 146},
-    {190, 185, 179},
-    {98, 94, 94},
-    {106, 124, 121},
-    {118, 110, 100},
-    {118, 117, 131},
-    {50, 50, 60},
-    {162, 152, 164},
-    {94, 63, 58},
-    {62, 70, 77},
-    {174, 162, 172},
-    {78, 91, 92},
-    {85, 85, 93},
-    {54, 50, 61},
-    {67, 66, 74},
-    {166, 154, 167},
-    {126, 109, 119},
-    {104, 116, 118},
-    {83, 92, 95},
-    {203, 205, 204},
-    {88, 100, 101},
-    {176, 169, 179},
-    {145, 138, 148},
-    {116, 78, 68},
-    {78, 78, 84},
-    {126, 142, 137},
-    {78, 83, 76},
-    {94, 58, 52},
-    {62, 38, 36},
-    {98, 86, 76},
-    {38, 42, 34},
-    {218, 220, 217},
-    {82, 70, 60},
-    {202, 194, 188},
-    {178, 183, 172},
-    {126, 131, 120},
-    {138, 132, 143},
-    {250, 250, 250},
-    {114, 74, 68},
-    {90, 108, 106},
-    {50, 38, 36},
-    {162, 161, 168},
-    {118, 124, 132},
-    {62, 65, 71},
-    {190, 185, 193},
-    {98, 94, 109},
-    {126, 132, 138},
-    {34, 34, 28},
-    {162, 146, 163},
-    {78, 85, 88},
-    {158, 134, 124},
-    {190, 178, 188}
-};
+    int ncolors;
+    XColor *colors;
+    int ccolor;
 
 
-static tangram_shape tsm1 = { {-0.144, -0.72, 0}, 225, false, 0 };
-static tangram_shape tsm2 = { {0.608, 0.032, 0}, 135, false, 0 };
-static tangram_shape tm = { {-1.584, 0.72, 0}, 0, false, 0 };
-static tangram_shape tlg1 = { {-0.112, -0.72, 0}, 315, false, 0 };
-static tangram_shape tlg2 = { {-0.096, -0.704, 0}, 45, false, 0 };
-static tangram_shape sq = { {0.592, 0.016, 0}, 225, false, 0 };
-static tangram_shape rh = { {-0.88, -0.032, 0}, 315, false, 0 };
+    XFontStruct *xfont1;
+    XFontStruct *xfont2;
+    XFontStruct *xfont3;
+    GLuint font1_dlist, font2_dlist, font3_dlist;
+    GLuint name_list;
+} tangram_configuration;
 
 
+static tangram_configuration *tps = NULL;
 
 #define DEF_VIEWING_TIME "5"
 
 #define DEF_VIEWING_TIME "5"
+#define DEF_ROTATE_CAMERA "True"
+#define DEF_X_CAMERA_ROTATE "0.2"
+#define DEF_Y_CAMERA_ROTATE "0.5"
+#define DEF_Z_CAMERA_ROTATE "0"
+
+
 static GLuint viewing_time = 0;
 static GLuint viewing_time = 0;
+static Bool do_rotate = True;
+static GLfloat x_camera_rotate = 0.3;
+static GLfloat y_camera_rotate = 0.75;
+static GLfloat z_camera_rotate = 0;
+static int wire;
 
 static XrmOptionDescRec opts[] = {
 
 static XrmOptionDescRec opts[] = {
-    {"-viewing_time", ".viewing_time", XrmoptionSepArg, 0}
+    {"-viewing_time", ".viewing_time", XrmoptionSepArg, 0},
+    {"-rotate", ".rotate", XrmoptionNoArg, "True"},
+    {"+rotate", ".rotate", XrmoptionNoArg, "False"},
+    {"-x_camera_rotate", ".x_camera_rotate", XrmoptionSepArg, 0},
+    {"-y_camera_rotate", ".y_camera_rotate", XrmoptionSepArg, 0},
+    {"-z_camera_rotate", ".z_camera_rotate", XrmoptionSepArg, 0}
 };
 
 static argtype vars[] = {
 };
 
 static argtype vars[] = {
-    {&viewing_time, "viewing_time", "Viewing Time", DEF_VIEWING_TIME, t_Int}
+    {&viewing_time, "viewing_time", "Viewing Time", DEF_VIEWING_TIME, t_Int},
+    {&do_rotate, "rotate", "Rotate", DEF_ROTATE_CAMERA, t_Bool},
+    {&x_camera_rotate, "x_camera_rotate", "X Camera Rotate", DEF_X_CAMERA_ROTATE, t_Float},
+    {&y_camera_rotate, "y_camera_rotate", "Y Camera Rotate", DEF_Y_CAMERA_ROTATE, t_Float},
+    {&z_camera_rotate, "z_camera_rotate", "Z Camera Rotate", DEF_Z_CAMERA_ROTATE, t_Float}
 };
 
 ModeSpecOpt sws_opts = { countof(opts), opts, countof(vars), vars, NULL };
 
 };
 
 ModeSpecOpt sws_opts = { countof(opts), opts, countof(vars), vars, NULL };
 
-static int wire;
-static int csi = -1;            /* Current Shape index */
+static puzzle solved[] = {
+  {"Teapot", {
+      {{-1.664000, -1.552000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.696000, 0.944000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0,  False},
+      {{0.064000, -2.128000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0,  True},
+      {{-0.960000, -1.056000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.104000, 0.960000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.376000, -0.800000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.152000, 0.736000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Candle", {
+      {{-0.016000, 2.176001, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.016000, 2.960001, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.000000, 0.400000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-2.015998, 2.208001, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.000001, 2.208001, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.496000, 0.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.016000, -0.672000, 0}, 335, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Square", {
+      {{-0.048000, -0.016000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.704000, 0.736000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.488000, 1.424001, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.016000, -0.016000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.000000, 0.000000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.688000, 0.720000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.784000, 0.672000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Crane", {
+      {{1.248001, 1.759999, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.024000, 3.071999, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.975999, -2.096001, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.480000, -1.968001, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.056000, -0.496000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.239999, -1.312001, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.223999, -1.360001, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Crane", {
+      {{0.320000, 1.360000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.704000, 3.072000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.200000, -3.392000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.688000, -1.184000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.768000, 0.192000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.168000, -2.304000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.312000, 1.296000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Duck", {
+      {{-1.391999, 1.424000, 0}, 65, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.768000, 2.000000, 0}, 99, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.688001, -1.872000, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.343999, 0.944000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.112000, -0.464000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.984001, -1.120000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.536001, 0.912000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Pelican", {
+      {{1.088000, 0.064001, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.864000, -1.279999, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.807999, 1.520000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.824001, -1.231998, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.368000, 1.472000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.832000, -2.271998, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.776001, 0.816000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Cat", {
+      {{0.416000, -2.432000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.352000, -2.432000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.832000, -0.480000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.632000, 3.056000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.616000, 1.040000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.088000, -1.696000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.832000, -0.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Coi", {
+      {{1.264000, -1.232000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.216000, 0.816000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.631999, 1.872000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.832000, 2.287999, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.608000, 0.912000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.240001, -0.176000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.256000, -1.200000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Man Skipping", {
+      {{1.727998, 2.303998, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.120000, 3.376001, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.879998, -3.008001, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.072000, 2.559999, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.440000, 0.144000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.192001, -2.592001, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.015999, 0.176000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Old Man", {
+      {{-0.400000, 1.744000, 0}, 58, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.704000, 0.128000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.656000, 0.320000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.112000, -0.384000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.096000, -0.399999, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.736000, 0.352000, 0}, 123, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.336000, 0.352000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Spear Head", {
+      {{0.688000, -0.144000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.080000, 0.592000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.048000, 0.592000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.488000, -0.848000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.376000, -0.864000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.688000, -0.128000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.504000, -0.832000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Diamond", {
+      {{0.624000, -1.776000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.144000, 0.432000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.800000, -0.272000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-2.320000, -0.304000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{2.048000, -0.320000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.112000, 0.480000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.832000, -0.320000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Arrow", {
+      {{-2.048001, -1.232000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.112000, 0.943999, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.312001, -0.560000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.496000, 0.656000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.528000, 0.608000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-2.048001, -2.704000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.312001, -0.512000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Lady", {
+      {{-0.720000, 3.440000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.912000, -1.072000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.736000, 3.440000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.720000, 1.984000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.672000, 0.544000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.192000, -3.840000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.528000, -2.480000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Running Man", {
+      {{1.136000, 2.720000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-2.304001, 1.776000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.256000, 0.288000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.304000, 0.304000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.096000, -0.128000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.656000, -2.832000, 0}, 105, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.784000, -0.096000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Parallelogram", {
+      {{-1.104000, -1.455999, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.912000, -0.447999, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.048000, -1.471999, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.136000, -1.439999, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.944000, 1.552000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.912000, 0.560000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.112000, 1.568000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"N", {
+      {{-1.615999, 0.064000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.592000, 0.112000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.432000, 0.096000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.679999, -0.880000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.488001, 1.103999, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.640000, 0.112000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.392001, -0.928000, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Farm House", {
+      {{2.112000, 1.504000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.040000, 1.472000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.032000, -1.600000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.056000, 1.504000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.992000, -0.528000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.080000, 0.512000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.104000, 0.480000, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Vulture", {
+      {{0.912000, 1.728000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-2.623998, -1.040000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.992000, 1.104000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.944000, -0.288000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.448000, -1.760000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.887998, -0.368000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{3.008002, 2.160000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Swan", {
+      {{0.720000, 0.352000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.672000, -1.568000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.376000, 1.104000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.151999, 1.488000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.320000, 2.096000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.656000, 0.304000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.624000, -2.559999, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"High Karate", {
+      {{-0.144000, 2.576000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.696001, -2.432000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.176001, -0.400000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.624000, -0.512000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.576000, -1.152000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.919999, -1.376000, 0}, 303, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.448000, -0.096001, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Lazy", {
+      {{-2.416000, 1.120000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.952000, -2.016000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.552000, -0.640000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.016000, 1.840000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.456000, -1.072000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.848000, -0.816000, 0}, 332, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.200000, -1.792000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Bat", {
+      {{-0.304000, -0.352000, 0}, 259, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.304000, -1.344000, 0}, 105, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.312000, -1.024000, 0}, 300, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.952000, 0.240000, 0}, 195, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-2.272000, 0.096000, 0}, 11, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.112000, -1.056000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.560000, -1.344000, 0}, 281, 180, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Sail Boat", {
+      {{0.544000, 2.000000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.880000, 0.160000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.656000, -1.503999, 0}, 220, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.656000, -0.336000, 0}, 50, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.688000, -0.288000, 0}, 310, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.864000, 1.232000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.496000, 2.016001, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Glenda", {
+      {{-2.016000, 2.080000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.240001, 1.824000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.239999, -0.752000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.264000, 2.784000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.248000, 0.736000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.240001, 0.304000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.544000, -2.976001, 0}, 149, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Cat", {
+      {{1.376000, -1.536001, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.488000, -1.552001, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.352000, -0.048000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-2.144000, 2.415999, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-2.096000, 0.368000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.144000, -0.800000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.392000, -0.064000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Lying Cat", {
+      {{2.480000, -0.912000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{2.592000, -0.928000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.352000, 1.280000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.688000, 0.336000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.808000, -0.112000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{3.248000, -0.176000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.472000, 1.024000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Witch", {
+      {{-0.943999, -0.304000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.144000, 0.288000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.360000, -2.304000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.328000, -0.848000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.008000, 1.584000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.512000, 2.688000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.863999, -0.096000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Laugh", {
+      {{0.703999, -0.160000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.064000, -0.400000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.767999, -1.408000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.232000, -1.328000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.040000, 2.624000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.288000, 1.264000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.760001, -1.408000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Standing Man", {
+      {{0.272000, 3.392000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.144000, -1.328000, 0}, 331, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.216001, 0.272000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.736000, 0.208000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.432000, -3.440000, 0}, 151, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.720000, 2.320000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.263998, 0.272000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Walking Man", {
+      {{-1.056000, -3.456000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.736000, 2.000000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.488000, 1.760000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.432000, 0.016000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.432000, -0.064000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.560000, -2.576000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.032000, 2.656000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Repose", {
+      {{-2.800000, -2.304000, 0}, 101, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.888000, 2.032000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.856000, 2.016000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.352000, -0.144000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-2.848000, 0.976000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.424000, -1.104000, 0}, 236, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.792000, 2.016000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Shape", {
+      {{1.263999, 1.600001, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.311999, -1.568000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.736000, 0.576000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.736000, -2.591999, 0}, 360, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.768000, 2.640001, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.784000, -0.528000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.736000, 0.496000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Shape", {
+      {{-0.816000, 1.392000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.832000, -1.807999, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.216000, -0.752000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.232000, -2.815999, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.248000, 2.400000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.864000, 1.392000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.240000, 1.328000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Lightning", {
+      {{0.176000, -2.448000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.888000, 2.880000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.856000, 1.824000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.872000, -1.392000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.264000, -0.432000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{2.320001, -2.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.872000, 1.728000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"E", {
+      {{0.928000, 1.664000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.896000, -1.519998, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.136000, 0.608000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.152000, -2.559998, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.152000, 2.672002, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.960000, -0.384000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.136000, 0.528000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Dagger", {
+      {{-0.096000, 0.448000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.640000, 2.656000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.064000, -3.104000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.767999, 1.184000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.080000, 0.416000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.416000, -2.064000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.112000, 3.328001, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Knight", {
+      {{-0.368000, 0.400000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.871998, -1.808000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.056000, -0.368000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.056000, -1.840000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.352000, 1.440000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.128000, 0.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.119999, -1.120000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Candy", {
+      {{-1.039999, 1.136000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.024000, 0.096000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.016000, 0.048000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.016000, -1.008000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.016000, 1.216000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.024000, 0.144000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.032000, 1.088000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"King", {
+      {{-0.688000, 1.904000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.800000, 1.904000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.512000, -1.392000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.488000, 1.120000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.392000, 1.120000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.496000, -1.312000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.480000, -1.376000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Top", {
+      {{-1.055999, -0.800000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.103999, 0.208000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.000000, -0.784000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.016000, 0.272000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.032000, 0.288000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.480000, -1.855999, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.096001, 0.224000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Dog", {
+      {{-2.896000, -0.128000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.800000, 0.992000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.152000, -0.416000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.016000, 0.656000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.456000, -0.736000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.864000, 0.736000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.048000, 1.664000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Moose Head", {
+      {{2.944000, -0.288000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.936000, -0.224000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.112000, 1.808000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-2.128000, 0.768000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.888000, 0.768000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.112000, -0.688000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-3.184000, -1.216000, 0}, 360, 180, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Negative Square", {
+      {{-1.520000, -0.624000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.520000, 0.480000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{2.352000, 0.480000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.080000, -3.040000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.096000, 2.944000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-2.528000, -0.576000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.360000, -1.600000, 0}, 360, 180, INIT_DZ, -SPEED, 0, True},
+    }}
+};
+\f
 
 
-static void get_solved_puzzle(tangram_shape * tsm1, tangram_shape * tsm2,
+static void get_solved_puzzle(ModeInfo * mi,
+                              tangram_shape * tsm1, tangram_shape * tsm2,
                               tangram_shape * tm, tangram_shape * tlg1,
                               tangram_shape * tlg2, tangram_shape * sq,
                               tangram_shape * rh)
 {
                               tangram_shape * tm, tangram_shape * tlg1,
                               tangram_shape * tlg2, tangram_shape * sq,
                               tangram_shape * rh)
 {
+    tangram_configuration *tp = &tps[MI_SCREEN(mi)];
     int sz = sizeof(solved) / sizeof(solved[0]);
     int r;
     int sz = sizeof(solved) / sizeof(solved[0]);
     int r;
-    GLuint t_dl;
 
 
+    /* we don't want to see the same puzzle twice */
     do {
         r = random() % sz;
     do {
         r = random() % sz;
-    } while (r == csi);
-    csi = r;
-
-    t_dl = tsm1->dl;
-    *tsm1 = solved[r][small_triangle1];
-    tsm1->dl = t_dl;
-
-    t_dl = tsm2->dl;
-    *tsm2 = solved[r][small_triangle2];
-    tsm2->dl = t_dl;
-
-    t_dl = tm->dl;
-    *tm = solved[r][medium_triangle];
-    tm->dl = t_dl;
-
-    t_dl = tlg1->dl;
-    *tlg1 = solved[r][large_triangle1];
-    tlg1->dl = t_dl;
-
-    t_dl = tlg2->dl;
-    *tlg2 = solved[r][large_triangle2];
-    tlg2->dl = t_dl;
-
-    t_dl = sq->dl;
-    *sq = solved[r][square];
-    sq->dl = t_dl;
-
-    t_dl = rh->dl;
-    *rh = solved[r][rhomboid];
-    rh->dl = t_dl;
-
-}
-
-static bool colors_match(color c1, color c2)
-{
-    bool res = false;
-    if (c1.r == c2.r && c1.g == c2.g && c1.b == c2.b)
-        res = true;
-    return res;
-}
-
-static color rand_palette(void)
-{
-    int l = sizeof(palette) / sizeof(color);
-    int r = random() % l;
-    return palette[r];
+    } while (r == tp->csi);
+    tp->csi = r;
+
+    *tsm1 = solved[r].ts[small_triangle1];
+    *tsm2 = solved[r].ts[small_triangle2];
+    *tm = solved[r].ts[medium_triangle];
+    *tlg1 = solved[r].ts[large_triangle1];
+    *tlg2 = solved[r].ts[large_triangle2];
+    *sq = solved[r].ts[square];
+    *rh = solved[r].ts[rhomboid];
+
+    tp->puzzle_name = solved[r].name;
 }
 
 static int approach_number(int goal, int current, int step)
 }
 
 static int approach_number(int goal, int current, int step)
@@ -860,64 +652,37 @@ static int approach_number(int goal, int current, int step)
 }
 
 /* gt - floating point greater than comparison */
 }
 
 /* gt - floating point greater than comparison */
-static bool gt(GLfloat x1, GLfloat x2, GLfloat per)
+static Bool gt(GLfloat x1, GLfloat x2, GLfloat per)
 {
     if ((x1 > x2) && (fabs(x1 - x2) > per))
 {
     if ((x1 > x2) && (fabs(x1 - x2) > per))
-        return true;
+        return True;
     else
     else
-        return false;
+        return False;
 }
 
 /* lt - floating point less than comparison */
 }
 
 /* lt - floating point less than comparison */
-static bool lt(GLfloat x1, GLfloat x2, GLfloat per)
+static Bool lt(GLfloat x1, GLfloat x2, GLfloat per)
 {
     if ((x1 < x2) && (fabs(x1 - x2) > per))
 {
     if ((x1 < x2) && (fabs(x1 - x2) > per))
-        return true;
+        return True;
     else
     else
-        return false;
+        return False;
 }
 
 }
 
-/* eq - Check the equality of a pair of floating point numbers to a certain perscision */
-static bool eq(GLfloat x1, GLfloat x2, GLfloat per)
-{
-    if (fabs(x1 - x2) < per)
-        return true;
-    else
-        return false;
-}
-
-
 static GLfloat approach_float(GLfloat goal, GLfloat current,
 static GLfloat approach_float(GLfloat goal, GLfloat current,
-                              bool * changed, GLfloat per)
+                              Bool * changed, GLfloat per)
 {
 {
-    *changed = false;
+    *changed = False;
     if (gt(goal, current, per)) {
         current += per;
     if (gt(goal, current, per)) {
         current += per;
-        *changed = true;
+        *changed = True;
     } else if (lt(goal, current, per)) {
         current -= per;
     } else if (lt(goal, current, per)) {
         current -= per;
-        *changed = true;
+        *changed = True;
     }
     return current;
 }
 
     }
     return current;
 }
 
-static bool coords_match(coord c1, coord c2, GLfloat per)
-{
-    if (eq(c1.x, c2.x, per) && eq(c1.y, c2.y, per) && eq(c1.z, c2.z, per))
-        return true;
-    else
-        return false;
-}
-
-static bool xy_coords_match(coord c1, coord c2, GLfloat per)
-{
-    if (eq(c1.x, c2.x, per) && eq(c1.y, c2.y, per))
-        return true;
-    else
-        return false;
-}
-
-
 #if 0
 static void print_shape(char *s, tangram_shape sh)
 {
 #if 0
 static void print_shape(char *s, tangram_shape sh)
 {
@@ -928,117 +693,38 @@ static void print_shape(char *s, tangram_shape sh)
     fprintf(stderr, "\n");
 }
 #endif
     fprintf(stderr, "\n");
 }
 #endif
+\f
 
 
-/* approach_shape - bring use on step closer to the new shape */
-static tangram_shape approach_shape(tangram_shape old, tangram_shape new,
-                                    bool * b, char *name)
+void reset_shape(tangram_shape * ts)
 {
 {
-
-    GLuint dl;
-    bool changed;
-    *b = false;
-
-    old.fr = approach_number(new.fr, old.fr, 2);
-    if (old.fr != new.fr) {
-        return old;
-    }
-
-    old.r = approach_number(new.r, old.r, 2);
-    if (old.r != new.r) {
-        return old;
-    }
-
-    old.crd.x = approach_float(new.crd.x, old.crd.x, &changed, 0.1);
-    if (!changed)
-        old.crd.x = approach_float(new.crd.x, old.crd.x, &changed, 0.01);
-    if (!changed)
-        old.crd.x = approach_float(new.crd.x, old.crd.x, &changed, 0.001);
-    if (!changed)
-        old.crd.x = approach_float(new.crd.x, old.crd.x, &changed, 0.0001);
-
-    old.crd.y = approach_float(new.crd.y, old.crd.y, &changed, 0.1);
-    if (!changed)
-        old.crd.y = approach_float(new.crd.y, old.crd.y, &changed, 0.01);
-    if (!changed)
-        old.crd.y = approach_float(new.crd.y, old.crd.y, &changed, 0.001);
-    if (!changed)
-        old.crd.y = approach_float(new.crd.y, old.crd.y, &changed, 0.0001);
-
-    if (xy_coords_match(new.crd, old.crd, 0.0001)) {
-        old.crd.z = approach_float(new.crd.z, old.crd.z, &changed, 0.1);
-        if (!changed)
-            old.crd.z =
-                approach_float(new.crd.z, old.crd.z, &changed, 0.01);
-        if (!changed)
-            old.crd.z =
-                approach_float(new.crd.z, old.crd.z, &changed, 0.001);
-        if (!changed)
-            old.crd.z =
-                approach_float(new.crd.z, old.crd.z, &changed, 0.0001);
-    }
-
-
-    if (coords_match(new.crd, old.crd, 0.0001)) {
-        dl = old.dl;
-#if 0
-        fprintf(stderr, "%s\n", name);
-        print_shape("old", old);
-        print_shape("new", new);
-#endif
-        old = new;              /* pick up the rest of the settings; */
-        old.dl = dl;
-        *b = true;
-    }
-
-    return old;
+    GLfloat r = random() % 10;
+    GLfloat f = r / 10;
+    ts->crd.z = BOTTOM;
+    ts->dz = INIT_DZ + f;
+    ts->ddz = -SPEED;
 }
 
 }
 
-static color get_color(void)
+void bounce(tangram_shape * ts)
 {
 {
-    static color new_color = { 100, 100, 100 };
-    static color old_color = { 100, 100, 100 };
-
-    if (colors_match(old_color, new_color)) {
-        old_color = new_color;
-        new_color = rand_palette();
+    ts->crd.z *= -1;            /* ignore this */
+    ts->dz += ts->ddz;
+    ts->crd.z += ts->dz * SPEED;
+    if (ts->crd.z < BOTTOM) {
+        reset_shape(ts);
     }
 
     }
 
-    if ((random() % 10) == 0) { /* slow down the cycle */
-        old_color.r = approach_number(new_color.r, old_color.r, 1);
-        old_color.g = approach_number(new_color.g, old_color.g, 1);
-        old_color.b = approach_number(new_color.b, old_color.b, 1);
-    }
-
-    return old_color;
-}
-
-static void explode(tangram_shape * tsm1, tangram_shape * tsm2,
-                    tangram_shape * tm, tangram_shape * tlg1,
-                    tangram_shape * tlg2, tangram_shape * sq,
-                    tangram_shape * rh)
-{
-    tsm1->crd.z = 1;
-    tsm1->r = 0;
-    tsm2->crd.z = -1;
-    tsm2->r = 0;
-    tm->crd.z = 2;
-    tm->r = 0;
-    tlg1->crd.z = -2;
-    tlg1->r = 0;
-    tlg2->crd.z = 3;
-    tlg2->r = 0;
-    sq->crd.z = -3;
-    sq->r = 0;
-    rh->crd.z = 4;
-    rh->r = 0;
+    ts->crd.z *= -1;            /* ignore this */
 }
 
 }
 
-
 static void draw_tangram_shape(tangram_shape ts)
 {
     glPushMatrix();
 
 static void draw_tangram_shape(tangram_shape ts)
 {
     glPushMatrix();
 
-    glTranslatef(ts.crd.x, ts.crd.y, ts.crd.z);
+    if (!do_rotate) {
+        ts.up = True;
+    }
+
+    glTranslatef(ts.crd.x, ts.crd.y, ts.up ? ts.crd.z : -ts.crd.z);
     glRotated(90, 1, 0, 0);
     glRotated(ts.fr, 1, 0, 0);
     glRotated(ts.r, 0, 1, 0);
     glRotated(90, 1, 0, 0);
     glRotated(ts.fr, 1, 0, 0);
     glRotated(ts.r, 0, 1, 0);
@@ -1046,25 +732,29 @@ static void draw_tangram_shape(tangram_shape ts)
     glPopMatrix();
 }
 
     glPopMatrix();
 }
 
-static void draw_shapes(void)
+static void load_fonts(ModeInfo * mi)
 {
 {
+    tangram_configuration *tp = &tps[MI_SCREEN(mi)];
+    load_font(mi->dpy, "titleFont", &tp->xfont1, &tp->font1_dlist);
+    load_font(mi->dpy, "titleFont2", &tp->xfont2, &tp->font2_dlist);
+    load_font(mi->dpy, "titleFont3", &tp->xfont3, &tp->font3_dlist);
+}
 
 
-    if (!wire) {
-        color c = get_color();
-        glColor3ub(c.r, c.g, c.b);
-    }
-
-    draw_tangram_shape(tsm1);
-
-    draw_tangram_shape(tsm2);
-    draw_tangram_shape(tm);
-    draw_tangram_shape(tlg1);
-    draw_tangram_shape(tlg2);
-    draw_tangram_shape(sq);
-    draw_tangram_shape(rh);
+static void draw_shapes(ModeInfo * mi)
+{
+    tangram_configuration *tp = &tps[MI_SCREEN(mi)];
 
 
+    draw_tangram_shape(tp->tsm1);
 
 
+    draw_tangram_shape(tp->tsm2);
+    draw_tangram_shape(tp->tm);
+    draw_tangram_shape(tp->tlg1);
+    draw_tangram_shape(tp->tlg2);
+    draw_tangram_shape(tp->sq);
+    draw_tangram_shape(tp->rh);
+    glCallList(tp->name_list);
 }
 }
+
 static void set_perspective(void)
 {
     glPushMatrix();
 static void set_perspective(void)
 {
     glPushMatrix();
@@ -1084,11 +774,10 @@ void reshape_tangram(ModeInfo * mi, int w, int h)
     glLoadIdentity();
 }
 
     glLoadIdentity();
 }
 
-static void rotate_camera(void)
+static void set_camera(void)
 {
     static GLfloat theta[3] = { 1, 1, 1 };
 {
     static GLfloat theta[3] = { 1, 1, 1 };
-    static bool going_down[3] = { false, false, false };
-
+    static Bool going_down[3] = { False, False, False };
 
     glPushMatrix();
     glMatrixMode(GL_PROJECTION);
 
     glPushMatrix();
     glMatrixMode(GL_PROJECTION);
@@ -1098,9 +787,11 @@ static void rotate_camera(void)
 
     gluLookAt(0, 5, -5, 0, 0, 0, 0, -1, 0);
 
 
     gluLookAt(0, 5, -5, 0, 0, 0, 0, -1, 0);
 
-    glRotatef(theta[0], 1, 0, 0);
-    glRotatef(theta[1], 0, 1, 0);
-    glRotatef(theta[2], 0, 0, 1);
+    if (do_rotate) {
+        glRotatef(theta[0], 1, 0, 0);
+        glRotatef(theta[1], 0, 1, 0);
+        glRotatef(theta[2], 0, 0, 1);
+    }
 
     glMatrixMode(GL_MODELVIEW);
     glPopMatrix();
 
     glMatrixMode(GL_MODELVIEW);
     glPopMatrix();
@@ -1108,138 +799,253 @@ static void rotate_camera(void)
 
     if (going_down[0] && theta[0] < 0) {
 
 
     if (going_down[0] && theta[0] < 0) {
 
-        going_down[0] = false;
+        going_down[0] = False;
     } else if ((!going_down[0]) && theta[0] > 90) {
 
     } else if ((!going_down[0]) && theta[0] > 90) {
 
-        going_down[0] = true;
+        going_down[0] = True;
     }
 
     if (theta[1] > 360.0)
         theta[1] -= 360.0;
 
     }
 
     if (theta[1] > 360.0)
         theta[1] -= 360.0;
 
+    if (theta[2] > 360.0)
+        theta[2] -= 360.0;
+
     if (going_down[0])
     if (going_down[0])
-        theta[0] -= 0.5;
+      theta[0] -= x_camera_rotate;
     else
     else
-        theta[0] += 0.5;
-    theta[1] += 1;
+      theta[0] += x_camera_rotate;
+
+    theta[1] += y_camera_rotate;
+    theta[2] += z_camera_rotate;
 }
 
 }
 
-static void init_shapes(void)
+static void init_shapes(ModeInfo * mi)
 {
 {
-    get_solved_puzzle(&tsm1, &tsm2, &tm, &tlg1, &tlg2, &sq, &rh);
-    tsm1.dl = get_sm_tri_dl(wire);
-    tsm2.dl = get_sm_tri_dl(wire);
-    tm.dl = get_md_tri_dl(wire);
-    tlg1.dl = get_lg_tri_dl(wire);
-    tlg2.dl = get_lg_tri_dl(wire);
-    sq.dl = get_square_dl(wire);
-    rh.dl = get_rhomboid_dl(wire);
+    int wire = MI_IS_WIREFRAME(mi);
+    tangram_configuration *tp = &tps[MI_SCREEN(mi)];
+    get_solved_puzzle(mi, &tp->tsm1, &tp->tsm2, &tp->tm, &tp->tlg1,
+                      &tp->tlg2, &tp->sq, &tp->rh);
+    get_solved_puzzle(mi, &tp->n_tsm1, &tp->n_tsm2, &tp->n_tm, &tp->n_tlg1,
+                      &tp->n_tlg2, &tp->n_sq, &tp->n_rh);
+    tp->tsm1.dl = get_sm_tri_dl(wire);
+    tp->tsm2.dl = get_sm_tri_dl(wire);
+    tp->tm.dl = get_md_tri_dl(wire);
+    tp->tlg1.dl = get_lg_tri_dl(wire);
+    tp->tlg2.dl = get_lg_tri_dl(wire);
+    tp->sq.dl = get_square_dl(wire);
+    tp->rh.dl = get_rhomboid_dl(wire);
 }
 
 }
 
-void init_tangram(ModeInfo * mi)
+static void gl_init(ModeInfo * mi)
 {
 {
-    GLfloat pos[4] = { 1, 1, -5, 1.00 };
-    GLfloat pos2[4] = { 1, 1, 5, 1.00 };
-    GLfloat lKa[4] = { 0, 0, 0, 1 };
-    GLfloat lKd[4] = { 1, 1, 1, 1 };
-    GLfloat lKs[4] = { 1, 1, 1, 1 };
 
 
-    wire = MI_IS_WIREFRAME(mi);
-    init_GL(mi);
+    int wire = MI_IS_WIREFRAME(mi);
 
 
-    if (!wire) {
-        glLightfv(GL_LIGHT0, GL_POSITION, pos);
-        glLightfv(GL_LIGHT0, GL_AMBIENT, lKa);
-        glLightfv(GL_LIGHT0, GL_DIFFUSE, lKd);
-        glLightfv(GL_LIGHT0, GL_SPECULAR, lKs);
+    GLfloat y = do_rotate ? -10 : 3;
+    GLfloat x = do_rotate ? 5 : 10;
+    GLfloat pos[4] = { 0, 0, -5, 1.00 };
+    GLfloat pos2[4] = { 0, 0, 5, 1.00 };
+    GLfloat dif2[4] = { 1, 1, 1, 1 };
 
 
-        glLightfv(GL_LIGHT1, GL_POSITION, pos2);
-        glLightfv(GL_LIGHT1, GL_AMBIENT, lKa);
-        glLightfv(GL_LIGHT1, GL_DIFFUSE, lKd);
-        glLightfv(GL_LIGHT1, GL_SPECULAR, lKs);
+    pos[0] = -x;
+    pos[1] = y;
 
 
-        glEnable(GL_DEPTH_TEST);
+    pos2[1] = x;
+    pos2[1] = y;
 
 
+    if (!wire) {
         glEnable(GL_LIGHTING);
         glEnable(GL_LIGHTING);
+        glLightfv(GL_LIGHT0, GL_POSITION, pos);
         glEnable(GL_LIGHT0);
         glEnable(GL_LIGHT0);
-        glEnable(GL_LIGHT1);
+        if (do_rotate) {
+            glLightfv(GL_LIGHT1, GL_POSITION, pos2);
+            glLightfv(GL_LIGHT1, GL_DIFFUSE, dif2);
+            glEnable(GL_LIGHT1);
+        }
+        glEnable(GL_DEPTH_TEST);
+    }
+
+}
+
+void init_tangram(ModeInfo * mi)
+{
+    tangram_configuration *tp;
+
+    if (!tps) {
+        tps = (tangram_configuration *)
+            calloc(MI_NUM_SCREENS(mi), sizeof(tangram_configuration));
+        if (!tps) {
+            fprintf(stderr, "%s: out of memory\n", progname);
+            exit(1);
+        }
 
 
-        glEnable(GL_COLOR_MATERIAL);
+        tp = &tps[MI_SCREEN(mi)];
     }
     }
-    init_shapes();
 
 
+    tp = &tps[MI_SCREEN(mi)];
+
+    if ((tp->glx_context = init_GL(mi)) != NULL) {
+        gl_init(mi);
+    }
+
+    wire = MI_IS_WIREFRAME(mi);
+
+    load_fonts(mi);
+    init_shapes(mi);
 }
 
 }
 
-static tangram_shape explode_step(tangram_shape old, tangram_shape new,
-                                  bool * b, GLfloat per)
+static Bool all_solved(tangram_shape * ls[])
 {
 {
-    old.crd.z = approach_float(new.crd.z, old.crd.z, b, per);
-    if (eq(new.crd.z, old.crd.z, per))
-        *b = true;
-    else
-        *b = false;
+    int i;
+    Bool b = True;
+    for (i = 0; i < NUM_SHAPES; i++) {
+        b = (b && ls[i]->solved);
+    }
+    return b;
+}
+
+static void solve(tangram_shape * new_s, tangram_shape * old_s)
+{
+    Bool moved_x, moved_y, moved_r, moved_fr, z_ok;
 
 
-    return old;
+    old_s->fr = approach_number(new_s->fr, old_s->fr, 2);
+    moved_fr = (old_s->fr != new_s->fr);
+
+    old_s->r = approach_number(new_s->r, old_s->r, 2);
+    moved_r = (old_s->r != new_s->r);
+
+    old_s->crd.x =
+        approach_float(new_s->crd.x, old_s->crd.x, &moved_x, 0.1);
+    if (!moved_x)
+        old_s->crd.x = new_s->crd.x;
+
+    old_s->crd.y =
+        approach_float(new_s->crd.y, old_s->crd.y, &moved_y, 0.1);
+    if (!moved_y)
+        old_s->crd.y = new_s->crd.y;
+
+    z_ok = (-old_s->crd.z <= BOTTOM);
+
+    old_s->solved = (moved_x == False && moved_y == False &&
+                     moved_r == False && moved_fr == False &&
+                     z_ok == True);
 }
 
 }
 
+static void set_not_solved(tangram_shape * ls[])
+{
+    int i;
+    for (i = 0; i < NUM_SHAPES; i++)
+        ls[i]->solved = False;
+}
+\f
+
 void draw_tangram(ModeInfo * mi)
 {
     Display *dpy = MI_DISPLAY(mi);
     Window window = MI_WINDOW(mi);
 void draw_tangram(ModeInfo * mi)
 {
     Display *dpy = MI_DISPLAY(mi);
     Window window = MI_WINDOW(mi);
-    static tangram_state state = state_solved;
-    static tangram_shape n_tsm1, n_tsm2, n_tm, n_tlg1, n_tlg2, n_sq, n_rh;
-    static bool b_tsm1, b_tsm2, b_tm, b_tlg1, b_tlg2, b_sq, b_rh;
-    static time_t s_tm = 0;
-    static time_t c_tm;
-    rotate_camera();
-
-    switch (state) {
-    case state_exploding:
-        tsm1 = explode_step(tsm1, n_tsm1, &b_tsm1, 0.1);
-        tsm2 = explode_step(tsm2, n_tsm2, &b_tsm2, 0.1);
-        tm = explode_step(tm, n_tm, &b_tm, 0.1);
-        tlg1 = explode_step(tlg1, n_tlg1, &b_tlg1, 0.1);
-        tlg2 = explode_step(tlg2, n_tlg2, &b_tlg2, 0.1);
-        sq = explode_step(sq, n_sq, &b_sq, 0.1);
-        rh = explode_step(rh, n_rh, &b_rh, 0.1);
-        if (b_tsm1 && b_tsm2 && b_tm && b_tlg1 && b_tlg2 && b_sq && b_rh) {
-            get_solved_puzzle(&n_tsm1, &n_tsm2, &n_tm, &n_tlg1, &n_tlg2,
-                              &n_sq, &n_rh);
-            state = state_solving;
+    tangram_configuration *tp = &tps[MI_SCREEN(mi)];
+
+    tangram_shape *ls[NUM_SHAPES];
+    tangram_shape *nls[NUM_SHAPES];
+
+
+    int i;
+    int MAX_DISPLAY;
+    static char *pn = "";
+    static int display_counter = 0;
+
+    static GLfloat color[4] = { 0.0, 0.0, 0.0, 1.0 };
+    static GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
+    MAX_DISPLAY = viewing_time * 100;
+
+    ls[small_triangle1] = &tp->tsm1;
+    ls[small_triangle2] = &tp->tsm2;
+    ls[medium_triangle] = &tp->tm;
+    ls[large_triangle1] = &tp->tlg1;
+    ls[large_triangle2] = &tp->tlg2;
+    ls[square] = &tp->sq;
+    ls[rhomboid] = &tp->rh;
+
+    nls[small_triangle1] = &tp->n_tsm1;
+    nls[small_triangle2] = &tp->n_tsm2;
+    nls[medium_triangle] = &tp->n_tm;
+    nls[large_triangle1] = &tp->n_tlg1;
+    nls[large_triangle2] = &tp->n_tlg2;
+    nls[square] = &tp->n_sq;
+    nls[rhomboid] = &tp->n_rh;
+
+    set_camera();
+
+    if (display_counter <= 0) {
+        for (i = 0; i < NUM_SHAPES; i++) {
+            if (ls[i]->solved) {
+                if (all_solved(ls)) {
+                    display_counter = MAX_DISPLAY;
+                    pn = tp->puzzle_name;
+                    get_solved_puzzle(mi, nls[small_triangle1],
+                                      nls[small_triangle2],
+                                      nls[medium_triangle],
+                                      nls[large_triangle1],
+                                      nls[large_triangle2], nls[square],
+                                      nls[rhomboid]);
+                    tp->ncolors = 128;
+                    tp->colors =
+                        (XColor *) calloc(tp->ncolors, sizeof(XColor));
+
+                    make_random_colormap(0, 0, 0,
+                                         tp->colors, &tp->ncolors,
+                                         True, False, 0, False);
+
+
+                    color[0] = tp->colors[0].red / 65536.0;
+                    color[1] = tp->colors[1].green / 65536.0;
+                    color[2] = tp->colors[2].blue / 65536.0;
+
+
+                    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,
+                                 color);
+
+                    set_not_solved(ls);
+                    break;
+                }
+            } else {
+                pn = "";
+                bounce(ls[i]);
+                solve(nls[i], ls[i]);
+            }
         }
         }
-
-        break;
-    case state_solving:
-
-        tsm1 = approach_shape(tsm1, n_tsm1, &b_tsm1, "small 1");
-        tsm2 = approach_shape(tsm2, n_tsm2, &b_tsm2, "small 2");
-        tm = approach_shape(tm, n_tm, &b_tm, "medium");
-        tlg1 = approach_shape(tlg1, n_tlg1, &b_tlg1, "large 1");
-        tlg2 = approach_shape(tlg2, n_tlg2, &b_tlg2, "large 2");
-        sq = approach_shape(sq, n_sq, &b_sq, "square");
-        rh = approach_shape(rh, n_rh, &b_rh, "rhomboid");
-        if (b_tsm1 && b_tsm2 && b_tm && b_tlg1 && b_tlg2 && b_sq && b_rh) {
-            state = state_solved;
-            s_tm = time(0);
-        }
-        break;
-    case state_solved:
-        c_tm = time(0);
-        if (floor(difftime(c_tm, s_tm)) >= viewing_time) {
-            /*if ((random() % 100) == 0) { */
-            explode(&n_tsm1, &n_tsm2, &n_tm, &n_tlg1, &n_tlg2, &n_sq,
-                    &n_rh);
-
-            state = state_exploding;
-
-        }
-        break;
+    } else {
+        display_counter--;
     }
     }
-    glPushMatrix();
+
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+    glPushMatrix();
+
     glLoadIdentity();
     glLoadIdentity();
+    glNewList(tp->name_list, GL_COMPILE);
+    {
+        XFontStruct *f;
+        GLuint fl;
+        if (MI_WIDTH(mi) >= 500 && MI_HEIGHT(mi) >= 375)
+            f = tp->xfont1, fl = tp->font1_dlist;
+        else if (MI_WIDTH(mi) >= 350 && MI_HEIGHT(mi) >= 260)
+            f = tp->xfont2, fl = tp->font2_dlist;
+        else
+            f = tp->xfont3, fl = tp->font3_dlist;
+
+        glColor3f(0.8, 0.8, 0);
+        print_gl_string(mi->dpy, f, fl,
+                        mi->xgwa.width, mi->xgwa.height,
+                        10, mi->xgwa.height - 10, pn);
+    }
+    glEndList();
+
+    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white);
+    glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 128);
+
+    draw_shapes(mi);
 
 
-    draw_shapes();
     glFlush();
     glPopMatrix();
     glXSwapBuffers(dpy, window);
     glFlush();
     glPopMatrix();
     glXSwapBuffers(dpy, window);
index 1c69306ec190308a76e6dc7842772fb4f91a0469..dcf5cd9b359e48081725bc82056c34ff543730b1 100644 (file)
@@ -10,6 +10,7 @@ tangram - watch the computer solve tangram puzzles.
 [\-delay \fInumber\fP]
 [\-wireframe]
 [\-viewing_time \fInumber\fP]
 [\-delay \fInumber\fP]
 [\-wireframe]
 [\-viewing_time \fInumber\fP]
+[\-rotate]
 .SH DESCRIPTION
 The \fItangram\fP program uses a view basic shapes to build silhouettes of recognizable objects.
 .SH OPTIONS
 .SH DESCRIPTION
 The \fItangram\fP program uses a view basic shapes to build silhouettes of recognizable objects.
 .SH OPTIONS
@@ -34,7 +35,9 @@ Render in wireframe instead of solid.
 .TP 8
 .B \-viewing_time \fInumber\fP 
 Specify the length of time, in seconds, that the finished puzzle
 .TP 8
 .B \-viewing_time \fInumber\fP 
 Specify the length of time, in seconds, that the finished puzzle
-should be displayed. Default: 5 
+.TP 8
+.B \-rotate | \-no-rotate
+Rotate the camera around the puzzle.
 .SH ENVIRONMENT
 .PP
 .TP 8
 .SH ENVIRONMENT
 .PP
 .TP 8
index 25dec5b21f5f3defd8b3ff8c09485988f0185adb..283c2ba40dda58b98a856d625d0c5ae9937bd314 100644 (file)
@@ -32,33 +32,46 @@ static void tri_45_90(int wire)
 
     glNormal3f(0, 1, 0);
     glVertex3fv(vertices[0]);
 
     glNormal3f(0, 1, 0);
     glVertex3fv(vertices[0]);
+    glNormal3f(0, 1, 0);
     glVertex3fv(vertices[2]);
     glVertex3fv(vertices[2]);
+    glNormal3f(0, 1, 0);
     glVertex3fv(vertices[1]);
 
     glNormal3f(0, -1, 0);
     glVertex3fv(vertices[3]);
     glVertex3fv(vertices[1]);
 
     glNormal3f(0, -1, 0);
     glVertex3fv(vertices[3]);
+    glNormal3f(0, -1, 0);
     glVertex3fv(vertices[4]);
     glVertex3fv(vertices[4]);
+    glNormal3f(0, -1, 0);
     glVertex3fv(vertices[5]);
     glEnd();
 
     glBegin((wire) ? GL_LINE_LOOP : GL_QUADS);
     glNormal3f(1, 0, 1);
     glVertex3fv(vertices[2]);
     glVertex3fv(vertices[5]);
     glEnd();
 
     glBegin((wire) ? GL_LINE_LOOP : GL_QUADS);
     glNormal3f(1, 0, 1);
     glVertex3fv(vertices[2]);
+    glNormal3f(1, 0, 1);
     glVertex3fv(vertices[5]);
     glVertex3fv(vertices[5]);
+    glNormal3f(1, 0, 1);
     glVertex3fv(vertices[4]);
     glVertex3fv(vertices[4]);
+    glNormal3f(1, 0, 1);
     glVertex3fv(vertices[1]);
 
     glNormal3f(-1, 0, 0);
     glVertex3fv(vertices[0]);
     glVertex3fv(vertices[1]);
 
     glNormal3f(-1, 0, 0);
     glVertex3fv(vertices[0]);
+    glNormal3f(-1, 0, 0);
     glVertex3fv(vertices[1]);
     glVertex3fv(vertices[1]);
+    glNormal3f(-1, 0, 0);
     glVertex3fv(vertices[4]);
     glVertex3fv(vertices[4]);
+    glNormal3f(-1, 0, 0);
     glVertex3fv(vertices[3]);
 
     glNormal3f(0, 0, -1);
     glVertex3fv(vertices[3]);
 
     glNormal3f(0, 0, -1);
-    glVertex3fv(vertices[2]);
-    glVertex3fv(vertices[5]);
-    glVertex3fv(vertices[3]);
     glVertex3fv(vertices[0]);
     glVertex3fv(vertices[0]);
+    glNormal3f(0, 0, -1);
+    glVertex3fv(vertices[3]);
+    glNormal3f(0, 0, -1);
+    glVertex3fv(vertices[5]);
+    glNormal3f(0, 0, -1);
+    glVertex3fv(vertices[2]);
     glEnd();
 }
 
     glEnd();
 }
 
@@ -66,11 +79,12 @@ void unit_cube(int wire)
 {
     glBegin((wire) ? GL_LINE_LOOP : GL_QUADS);
 
 {
     glBegin((wire) ? GL_LINE_LOOP : GL_QUADS);
 
-    glNormal3f(0.0f, -1.0f, 0.0f);
-    glVertex3f(0.0f, -alpha, 0.0f);
-    glVertex3f(1.0f, -alpha, 0.0f);
-    glVertex3f(1.0f, -alpha, 1.0f);
-    glVertex3f(0.0f, -alpha, 1.0f);
+
+    glNormal3f(0.0f, 1.0f, 0.0f);
+    glVertex3f(0.0f, alpha, 0.0f);
+    glVertex3f(0.0f, alpha, 1.0f);
+    glVertex3f(1.0f, alpha, 1.0f);
+    glVertex3f(1.0f, alpha, 0.0f);
 
     glNormal3f(0.0f, 0.0f, 1.0f);
     glVertex3f(0.0f, -alpha, 1.0f);
 
     glNormal3f(0.0f, 0.0f, 1.0f);
     glVertex3f(0.0f, -alpha, 1.0f);
@@ -96,11 +110,12 @@ void unit_cube(int wire)
     glVertex3f(0.0f, alpha, 1.0f);
     glVertex3f(0.0f, alpha, 0.0f);
 
     glVertex3f(0.0f, alpha, 1.0f);
     glVertex3f(0.0f, alpha, 0.0f);
 
-    glNormal3f(0.0f, 1.0f, 0.0f);
-    glVertex3f(0.0f, alpha, 0.0f);
-    glVertex3f(0.0f, alpha, 1.0f);
-    glVertex3f(1.0f, alpha, 1.0f);
-    glVertex3f(1.0f, alpha, 0.0f);
+    glNormal3f(0.0f, -1.0f, 0.0f);
+    glVertex3f(0.0f, -alpha, 0.0f);
+    glVertex3f(1.0f, -alpha, 0.0f);
+    glVertex3f(1.0f, -alpha, 1.0f);
+    glVertex3f(0.0f, -alpha, 1.0f);
+
     glEnd();
 }
 
     glEnd();
 }
 
diff --git a/hacks/glx/timetunnel.c b/hacks/glx/timetunnel.c
new file mode 100644 (file)
index 0000000..abf0e13
--- /dev/null
@@ -0,0 +1,1234 @@
+/* timetunnel. Based on dangerball.c, hack by Sean Brennan <zettix@yahoo.com>*/
+/* dangerball, Copyright (c) 2001-2004 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.
+ */
+
+#include <X11/Intrinsic.h>
+#include <math.h> /* for log2 */
+
+extern XtAppContext app;
+
+#define PROGCLASS      "TimeTunnel"
+#define HACK_INIT      init_tunnel
+#define HACK_DRAW      draw_tunnel
+#define HACK_RESHAPE   reshape_tunnel
+#define HACK_HANDLE_EVENT tunnel_handle_event
+#define EVENT_MASK      PointerMotionMask
+#define sws_opts       xlockmore_opts
+
+#define DEF_START      "0.00"
+#define DEF_DILATE     "1.00"
+#define DEF_END                "27.79"
+#define DEF_LOCKLOGO   "False"
+#define DEF_TUNONLY    "False"
+#define DEF_REVERSE    "False"
+#define DEF_FOG                "True"
+#define DEF_TEXTURE     "True"
+#define MAX_TEXTURE 10
+#define CYL_LEN                14.0
+#define DIAMOND_LEN    10.0
+
+#define DEFAULTS       "*delay:        30000       \n" \
+                       "*count:        30          \n" \
+                       "*showFPS:      False       \n" \
+                       "*timeStart:     0.0       \n" \
+                       "*timeEnd:       27.79       \n" \
+                       "*wireframe:    False       \n" \
+
+
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+#include <sys/time.h> /* for time based animations */
+
+static float start, end, dilate;
+static Bool do_texture, tunonly, wire, reverse, do_fog;
+#ifdef GET_SUED_BY_THE_BBC
+static Bool locklogo;
+#endif
+
+static XrmOptionDescRec opts[] = {
+  {"-texture"  , ".texture",   XrmoptionNoArg, "true" },
+  {"-start"    , ".start",     XrmoptionSepArg, 0 },
+  {"-end"      , ".end",       XrmoptionSepArg, 0 },
+  {"-dilate"   , ".dilate",   XrmoptionSepArg, 0 },
+#ifdef GET_SUED_BY_THE_BBC
+  {"-locklogo" , ".locklogo",  XrmoptionNoArg, "true" },
+#endif
+  {"-tunonly"  , ".tunonly",   XrmoptionNoArg, "true" },
+  {"-reverse"  , ".reverse",   XrmoptionNoArg, "true" },
+  {"-fog"      , ".fog",       XrmoptionNoArg, "false" },
+};
+
+static argtype vars[] = {
+  {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+  {&start, "start", "Start", DEF_START, t_Float},
+  {&end,     "end",   "End", DEF_END  , t_Float},
+  {&dilate,     "dilate",   "Dilate", DEF_DILATE  , t_Float},
+#ifdef GET_SUED_BY_THE_BBC
+  {&locklogo,     "locklogo",   "LockLogo", DEF_LOCKLOGO  , t_Bool},
+#endif
+  {&tunonly,     "tunonly",   "TunnelOnly", DEF_TUNONLY  , t_Bool},
+  {&reverse,     "reverse",   "Reverse", DEF_REVERSE  , t_Bool},
+  {&do_fog,     "fog",   "Fog", DEF_FOG  , t_Bool},
+};
+
+ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
+#include "xpm-ximage.h"
+#include "../../utils/images/logo-180.xpm"
+#include "../images/tunnelstar.xpm"
+#include "../images/timetunnel0.xpm"
+#include "../images/timetunnel1.xpm"
+#include "../images/timetunnel2.xpm"
+#ifdef GET_SUED_BY_THE_BBC
+# include "../images/tardis.xpm"
+# include "../images/whologo.xpm"
+# include "../images/whohead1.xpm"
+/* #include "../images/whohead_psy.xpm" */
+# endif /* GET_SUED_BY_THE_BBC */
+
+
+#ifdef USE_GL /* whole file */
+
+#include <GL/glu.h>
+
+/* ANIMATION CONTROLS */
+/* an effect is a collection of floating point variables that vary with time.
+A knot is a timestamp with an array of floats.  State is the current values of the floats.
+State is set by linearly interpolating between knots */
+typedef struct {
+       float *knots, *state;
+       int numknots, knotwidth;
+       float direction;
+} effect_t;
+
+typedef struct {
+  GLXContext *glx_context;
+  rotator *rot;
+  trackball_state *trackball;
+  Bool button_down_p;
+
+  int time_oldusec, time_oldsec;
+
+  int num_texshifts; /* animates tunnels. Not an effect. */
+  GLfloat pos, *texshift;
+
+  GLuint texture_binds[MAX_TEXTURE], cyllist, diamondlist;
+
+  float effect_time, effect_maxsecs; /* global time controls */
+  float start_time, end_time;
+
+  int num_effects;
+  effect_t *effects; /* array of all effects */
+
+} tunnel_configuration;
+
+static tunnel_configuration *tconf = NULL;
+
+/* allocate memory and populate effect with knot data */
+void init_effect(effect_t *e, int numk, int kwidth, 
+       float dir, float *data ) {
+       int i, j;
+
+       e->numknots = numk;     
+       e->knotwidth = kwidth;  
+       e->direction = dir;
+       e->knots = calloc(numk * kwidth, sizeof(float));
+       e->state = calloc(numk, sizeof(float));
+       for ( i = 0 ; i < e->numknots ; i++)
+               for ( j = 0 ; j < e->knotwidth; j++)
+                       e->knots[i * kwidth + j] = data[i * kwidth + j];
+}
+
+/* static knot data. each effect is listed and knot data is hard coded. 
+   Knots are linerally interpolated to yield float values, depending on
+   knot width.  knot format is [time, data, data, data...].
+   Data can be alpha, zvalue, etc. */
+void init_effects(effect_t *e, int effectnum)
+{
+       /* effect 1: wall tunnel. percent closed */
+       float e1d[6][2] = 
+               {{0.0, 0.055}, 
+                {2.77, 0.055}, 
+                {3.07,1.0}, 
+                {8.08, 1.0},
+                {8.08, 0.0}, 
+                {10.0, 0.0}};
+       /* effect 2: tardis. distance and alpha */
+       float e2d[8][3] = 
+       {       {0.0, 0.0 , 0.0}, 
+               {3.44, 0.0 , 0.0},
+               {3.36, 5.4 , 0.0},
+               {4.24, 3.66, 1.0},
+               {6.51, 2.4,  0.94},
+               {8.08, 0.75 , 0.0}, 
+               {8.08, 0.0 , 0.0},
+               {10.0, 0.0, 0.0}};
+       /* effect 3: cylender. alpha  */
+       float e3d[5][2] = 
+               {{0.0, 0.0}, 
+                {6.41, 0.00},
+                {8.08, 1.0}, 
+                {14.81, 1.0},
+                {15.65, 0.0}};
+
+       /* effect 4: fog. color, density,  start, end  */
+       float e4d[9][5] = 
+               {{0.0 , 1.0, 0.45, 3.0, 15.0},
+                {6.40, 1.0, 0.45, 3.0, 14.0},
+                {8.08, 1.0, 0.95, 1.0, 14.0},
+                {15.17, 1.0, 0.95, 1.0, 6.0},
+                {15.51, 1.0, 0.95, 3.0, 8.0},
+                {23.35, 1.0, 0.95, 3.0, 8.0},
+                {24.02, 0.0, 0.95, 2.3, 5.0},
+                {26.02, 0.0, 0.95, 2.3, 5.0},
+                {27.72, 0.0, 1.00, 0.3, 0.9}
+                };
+
+       /* effect 5: logo. dist, alpha  */
+       float e5d[7][3] = 
+               {{0.0, 0.0, 0.0}, 
+               {16.52, 0.00, 0.0}, 
+               {16.52, 0.80, 0.01}, 
+               {17.18, 1.15, 1.0}, 
+               {22.36, 5.3, 1.0}, 
+               {22.69, 5.7, 0.0},
+               {22.69, 0.0, 0.0}
+               };
+       /* effect 6: diamond tunnel. alpha */
+       float e6d[3][2] = 
+               {{0.0, 0.00}, 
+               {15.17, 0.00},
+               {15.51,1.0}};
+
+       /* effect 7: tardis cap draw . positive draws cap*/
+       float e7d[3][2] = 
+               {{0.0, -1.00}, 
+               {4.24, -1.00},
+               {4.24, 1.00}};
+
+       /* effect 8: star/asterisk: alpha */
+       float e8d[5][2] = 
+               {{0.0,    .00}, 
+               {10.77,   .00},
+               {11.48,  1.00},
+               {15.35,  1.00},
+               {16.12,  0.00}};
+
+       /* effect 9: whohead 1  alpha */
+       float e9d[5][2] = 
+               {{0.0,    .00}, 
+               {13.35,   .00},
+               {14.48,  1.00},
+               {15.17,  1.00},
+               {15.97,  0.00}};
+               /* {14.87,  1.00},
+               {15.17,  0.00}}; */
+
+       /* effect 10: whohead-brite  alpha */
+       float e10d[5][2] = 
+               {{0.0,    .00}, 
+               {11.34,   .00},
+               {12.34,   .20},
+               {13.35,  0.60},
+               {14.48,  0.00}}; 
+               /* {13.95,  0.00}}; */
+
+       /* effect 11: whohead-psy  alpha */
+       float e11d[5][2] = 
+               {{0.0,    .00}, 
+               {14.87,   .00},
+               {15.17,  1.00},
+               {15.91,  0.00},
+               {16.12,  0.00}};
+
+       /* effect 12: whohead-silhouette pos-z,  alpha */
+       float e12d[6][3] = 
+               {{0.0,   1.0,  .00}, 
+               {15.07,  1.0, 0.00},
+               {15.07,  1.0, 1.00},
+               {16.01,  1.0, 1.00},
+               {16.78,  0.5, 1.00},
+               {16.78,  0.1, 0.00} };
+
+       /* effect 1: wall tunnel */
+       if (effectnum == 1)
+               init_effect(e, 6, 2,  -0.2, (float *) e1d);
+
+       /* effect 2: tardisl */
+       if (effectnum == 2)
+               init_effect(e, 8, 3, 1.0,  (float *) e2d);
+
+       /* effect 3: cylender tunnel  */
+       if (effectnum == 3)
+               init_effect(e, 5, 2, 0.889  ,  (float *) e3d);
+
+       /* effect 4: fog color */
+       if (effectnum == 4)
+               init_effect(e, 9, 5, 1.0,  (float *) e4d);
+       /* effect 5: logo distance, alpha*/
+       if (effectnum == 5)
+               init_effect(e, 7, 3, 1.0,  (float *) e5d);
+       /* effect 6: diamond tunnel, alpha*/
+       if (effectnum == 6)
+               init_effect(e, 3, 2, 0.24 ,  (float *) e6d);
+
+       /* effect 7: cap wall tunnel*/
+       if (effectnum == 7)
+               init_effect(e, 3, 2, 1.0,  (float *) e7d);
+
+       /* effect 8: asterisk */
+       if (effectnum == 8)
+               init_effect(e, 5, 2, 1.0,  (float *) e8d);
+
+       /* effect 9, 10, 11, 12: whoheads */
+       if (effectnum == 9 )
+               init_effect(e, 5, 2, 1.0,  (float *) e9d);
+       if (effectnum == 10 )
+               init_effect(e, 5, 2, 1.0,  (float *) e10d);
+       if (effectnum == 11 )
+               init_effect(e, 5, 2, 1.0,  (float *) e11d);
+       if (effectnum == 12 )
+               init_effect(e, 6, 3, 1.0,  (float *) e12d);
+}
+
+
+/* set fog parameters, controlled by effect */
+void update_fog(float color, float density, float start, float end) {
+               GLfloat col[4];
+       
+               col[0] = col[1] = col[2] = color;
+               col[3] = 1.0;
+
+               glFogi(GL_FOG_MODE, GL_LINEAR);
+               glFogfv(GL_FOG_COLOR, col);
+               glFogf(GL_FOG_DENSITY, density);
+               glFogf(GL_FOG_START, start);
+               glFogf(GL_FOG_END, end);
+}
+
+/* set effect's floating point data values by linearally interpolating
+between two knots whose times bound the current time: eff_time */
+
+void update_knots(effect_t *e, float eff_time) {
+       int i, j;
+       float timedelta, lowknot, highknot, *curknot, *nextknot;
+
+       for ( i = 0 ; i < e->numknots ; i++)
+               if (e->knots[i * e->knotwidth] <= eff_time) {
+                       if ( i < e->numknots - 1) 
+                               nextknot = e->knots + (i + 1) * e->knotwidth;
+                       else
+                               /*repeat last knot to carry knot data forward*/
+                               nextknot = e->knots + (i) * e->knotwidth;
+                       curknot = e->knots + i * e->knotwidth;
+                       if (*nextknot - *curknot <= 0.0) timedelta = 1.0;
+                       else
+                               timedelta = (eff_time-*curknot)/(*nextknot-*curknot);
+                       if (timedelta > 1.0) timedelta = 1.0;
+                       for (j = 1 ; j < e->knotwidth ; j++) {
+                               highknot = (float) *(nextknot + j);
+                               lowknot  = (float) *(curknot  + j);
+                               e->state[j - 1 ] = lowknot+(highknot-lowknot)*timedelta;
+                       }
+               }
+       
+}
+
+
+/* Window management, etc
+ */
+void
+reshape_tunnel (ModeInfo *mi, int width, int height)
+{
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  glViewport (0, 0, (GLint) width, (GLint) height);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective (90.0, 1/h, 0.2, 50.0); 
+
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  gluLookAt( 0.0, 0.0, 0.3,
+             0.0, 0.0, 1.0,
+             0.0, 1.0, 0.0);
+
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+
+
+Bool
+tunnel_handle_event (ModeInfo *mi, XEvent *event)
+{
+  tunnel_configuration *tc = &tconf[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button == Button1)
+    {
+      tc->button_down_p = True;
+      gltrackball_start (tc->trackball,
+                         event->xbutton.x, event->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button == Button1)
+    {
+      tc->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (tc->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           tc->button_down_p)
+    {
+      gltrackball_track (tc->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+void setTexParams(void)
+{
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+}
+
+void update_animation(tunnel_configuration *tc) {
+
+       /* time based, of course*/
+       /* shift texture based on elapsed time since previous call*/
+       static struct timeval tv;
+       static struct timezone tz;
+       static int elapsed_usecs, elapsed_secs, i;
+       float computed_timeshift;
+
+       /* get new animation time */
+       gettimeofday(&tv, &tz);
+       elapsed_secs = tv.tv_sec - tc->time_oldsec;
+       elapsed_usecs = tv.tv_usec - tc->time_oldusec;
+       /* store current time */
+       tc->time_oldsec = tv.tv_sec ;
+       tc->time_oldusec = tv.tv_usec;
+       /* elaped time. computed timeshift is tenths of a second */
+       computed_timeshift = (float) (elapsed_secs * 1000000. + elapsed_usecs)/ 
+                                                     100000.0;
+
+       /* calibrate effect time to lie between start and end times */
+       /* loop if time exceeds end time */
+       if (reverse)
+               tc->effect_time -= computed_timeshift / 10.0 * dilate;
+       else
+               tc->effect_time += computed_timeshift / 10.0 * dilate;
+       if ( tc->effect_time >= tc->end_time)
+               tc->effect_time = tc->start_time;
+       if ( tc->effect_time < tc->start_time)
+               tc->effect_time = tc->end_time;;
+
+       /* move texture shifters in effect's direction, e.g. tardis
+          tunnel moves backward, effect 1's direction */
+        if (reverse) { 
+               tc->texshift[0] -= tc->effects[1].direction * computed_timeshift/ 10.0; 
+               tc->texshift[1] -= tc->effects[3].direction * computed_timeshift/ 10.0; 
+               tc->texshift[2] -= tc->effects[6].direction * computed_timeshift/ 10.0; 
+
+       } else {
+               tc->texshift[0] += tc->effects[1].direction * computed_timeshift/ 10.0; 
+               tc->texshift[1] += tc->effects[3].direction * computed_timeshift/ 10.0; 
+               tc->texshift[2] += tc->effects[6].direction * computed_timeshift/ 10.0; 
+       }
+
+       /* loop texture shifters if necessary */
+       for ( i = 0 ; i < tc->num_texshifts; i++) {
+               if (tc->texshift[i] > 1.0)
+                       tc->texshift[i] -= (int) tc->texshift[i];
+               if (tc->texshift[i]< -1.0)
+                       tc->texshift[i] -= (int) tc->texshift[i];
+       }
+
+       /* update effect data with current time. Uses linear interpolation */   
+       for ( i = 1 ; i <= tc->num_effects ; i++)
+               update_knots(&tc->effects[i], tc->effect_time);
+
+} /*update_animation*/
+
+/* draw a textured(tex) quad at a certain depth (z), and certain alpha (alpha), 
+with aspect ratio (aspect), and blending mode (blend_mode) of either adding
+or subtracting.  if alpha is zero or less, nothing happens */
+void draw_sign(ModeInfo *mi, tunnel_configuration *tc, float z,  float alpha, float aspect,
+               GLuint tex, int blend_mode)
+{
+
+       if (alpha > 0.0) {
+               mi->polygon_count ++;
+               /* glEnable(GL_BLEND); */
+               glBlendColor(0.0, 0.0, 0.0, alpha);
+               /*glBlendColor(0.0, 0.0, 0.0, 0.0); */
+               if (blend_mode == 1) {
+                       glBlendFunc(GL_CONSTANT_ALPHA,
+                                   GL_ONE);
+                       glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
+               } else if (blend_mode == 2) {
+                       glBlendFunc(GL_CONSTANT_ALPHA,
+                                   GL_ONE);
+                       glBlendEquation(GL_FUNC_ADD);
+               } else {
+                       glBlendFunc(GL_CONSTANT_ALPHA,
+                                   GL_ONE_MINUS_CONSTANT_ALPHA);
+                       glBlendEquation(GL_FUNC_ADD);
+               } /* blend mode switch */
+
+#ifdef HAVE_GLBINDTEXTURE
+               if (do_texture)
+                       glBindTexture(GL_TEXTURE_2D, tc->texture_binds[tex]);
+#endif
+               glBegin(GL_QUADS);
+               glTexCoord2f(1.0, 0.0);
+               glVertex3f(-1.0 , -1.0 * aspect , z);
+               glTexCoord2f(1.0, 1.0);
+               glVertex3f(-1.0 , 1.0 * aspect , z);
+               glTexCoord2f(0.0, 1.0);
+               glVertex3f(1.0 , 1.0 * aspect , z);
+               glTexCoord2f(0.0, 0.0);
+               glVertex3f(1.0 , -1.0 * aspect , z); 
+               glEnd();
+               if (blend_mode != 0) {
+                       glBlendFunc(GL_CONSTANT_ALPHA,
+                                   GL_ONE_MINUS_CONSTANT_ALPHA);
+                       glBlendEquation(GL_FUNC_ADD);
+               }
+               /* glDisable(GL_BLEND); */
+
+       }
+} /* draw sign */
+
+
+/* draw a time tunnel.  used for both cylender and diamond tunnels.
+   uses texture shifter (indexed by shiftnum) to simulate motion.
+   tunnel does not move, and is acutally a display list.  if alpha = 0, skip */
+void draw_cyl(ModeInfo *mi, tunnel_configuration *tc, float alpha, int texnum, int listnum, int shiftnum)
+{
+       if (alpha > 0.0) {
+               if (listnum  ==  tc->diamondlist)
+                       mi->polygon_count += 4;
+               if (listnum  ==  tc->cyllist)
+                       mi->polygon_count += 30;
+               glMatrixMode(GL_TEXTURE);
+               glLoadIdentity();
+               glTranslatef(tc->texshift[shiftnum], 0.0, 0.0);
+               glMatrixMode(GL_MODELVIEW);
+               /* glEnable(GL_BLEND); */
+               glBlendColor(0.0, 0.0, 0.0, alpha);
+               glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
+       
+#ifdef HAVE_GLBINDTEXTURE
+               if (do_texture)
+                       glBindTexture(GL_TEXTURE_2D, tc->texture_binds[texnum]);
+#endif
+               glCallList(listnum);
+
+               glMatrixMode(GL_TEXTURE);
+               glLoadIdentity();
+               glMatrixMode(GL_MODELVIEW); 
+               /* glDisable(GL_BLEND); */
+       }
+}
+
+
+/* make tardis type tunnel.  Starts as walls and then
+grows to outline of tardis.  percent is how complete
+tardis outline is.  cap is to draw cap for nice fog effects */
+
+void make_wall_tunnel(ModeInfo *mi, tunnel_configuration *tc, float percent, float cap)
+{
+       /* tardis is about 2x1, so wrap tex around, starting at the base*/
+       /* tex coords are:
+
+ _tl__tr_
+ |      |
+l|      |r
+ |      |
+ -bl__br_  
+       that's br=bottom right, etc. ttr is top-top-right */
+
+       float   half_floor= 0.08333333333333333,
+               full_wall = 0.33333333333333333;
+       float   br1,
+               r0 , r1 ,
+               tr0, tr1,
+               tl0, tl1,
+               l0 , l1 ,
+               bl0, depth=0.3, zdepth=15.0;
+       /* zdepth is how far back tunnel goes */
+       /* depth is tex coord scale.  low number = fast texture shifting */
+
+       float textop, texbot;   
+       float height;
+
+       br1 = half_floor;
+       r0 = br1 ;
+       r1 = r0 + full_wall;
+       tr0 = r1;
+       tr1 = r1 + half_floor;
+       tl0 = tr1;
+       tl1 = tl0 + half_floor;
+       l0 = tr1;
+       l1 = l0 + full_wall;
+       bl0 = l1;
+
+       glMatrixMode(GL_TEXTURE);
+       glLoadIdentity();
+       glRotatef(90.0, 0.0, 0.0, 1.0);
+       glTranslatef(tc->texshift[0], 0.0, 0.0);
+       glMatrixMode(GL_MODELVIEW);
+
+#ifdef HAVE_GLBINDTEXTURE
+       if (do_texture)
+               glBindTexture(GL_TEXTURE_2D, tc->texture_binds[0]);
+#endif
+       glColor3f(1.0, 1.0, 0.0);
+       if (cap > 0.0 && percent > 0.0 && ! tunonly && do_fog) {
+               mi->polygon_count += 6;
+               glBegin(GL_TRIANGLE_FAN);
+               glVertex3f(0.0, 0.0, zdepth);
+               glVertex3f(-1.0, -2.0, zdepth);
+               glVertex3f(1.0, -2.0, zdepth);
+               glVertex3f(1.0, 2.0, zdepth);
+               glVertex3f(0.2, 2.0, zdepth);
+               glVertex3f(0.2, 2.2, zdepth);
+               glVertex3f(-0.2, 2.2, zdepth);
+               glVertex3f(-0.2, 2.0, zdepth);
+               glVertex3f(-1.0, 2.0, zdepth);
+               glVertex3f(-1.0, -2.0, zdepth);
+               glEnd();
+       }
+       if (percent > ( full_wall * 2.0)) {
+               glBegin(GL_QUADS);
+
+               height = (percent  - full_wall * 2.0) /( 1.0 - full_wall * 2.0);
+               if (height > 1.0) height = 1.0;
+
+
+               if ( height > 0.8) {
+                       mi->polygon_count += 2;
+                       if ( height > 0.90) {
+                               mi->polygon_count += 2;
+                               /* TTTR */
+                               texbot = tr0;
+                               textop = tr0 + half_floor * height;
+                               glTexCoord2f(0.0, texbot);
+                               glVertex3f(0.2, 2.2, 0.0);
+               
+                               glTexCoord2f(0.0, textop);
+                               glVertex3f(2.0 - height * 2.0, 2.2, 0.0);
+               
+                               glTexCoord2f(depth, textop);
+                               glVertex3f(2.0 - height * 2.0, 2.2, zdepth);
+       
+                               glTexCoord2f(depth, texbot);
+                               glVertex3f(0.2, 2.2, zdepth);
+       
+                               /* TTTL */
+                               texbot = tl1 - half_floor * height;
+                               textop = tl1;
+                               glTexCoord2f(0.0, texbot);
+                               glVertex3f(-2.0 + height * 2.0, 2.2, 0.0);
+               
+                               glTexCoord2f(0.0, textop);
+                               glVertex3f(-0.2, 2.2, 0.0);
+               
+                               glTexCoord2f(depth, textop);
+                               glVertex3f(-0.2, 2.2, zdepth);
+               
+                               glTexCoord2f(depth, texbot);
+                               glVertex3f(-2.0 + height * 2.0, 2.2, zdepth);
+                       }
+                       if (height > 0.90) height = 0.90;
+
+                       /* TTR */
+                       texbot = tr0;
+                       textop = tr0 + half_floor * height;
+                       glTexCoord2f(0.0, texbot);
+                       glVertex3f(0.2, 2.0, 0.0);
+       
+                       glTexCoord2f(0.0, textop);
+                       glVertex3f(0.2, 0.4 + height * 2.0, 0.0);
+       
+                       glTexCoord2f(depth, textop);
+                       glVertex3f(0.2, 0.4 + height * 2.0, zdepth);
+       
+                       glTexCoord2f(depth, texbot);
+                       glVertex3f(0.2, 2.0, zdepth);
+
+                       /* TTL */
+                       texbot = tl1 - half_floor * height;
+                       textop = tl1;
+                       glTexCoord2f(0.0, texbot);
+                       /*glVertex3f(-.2, 2.0 + (0.9 - height) * 2.0, 0.0); */
+                       glVertex3f(-.2,  0.4 + height * 2.0, 0.0);
+       
+                       glTexCoord2f(0.0, textop);
+                       glVertex3f(-.2, 2.0, 0.0);
+       
+                       glTexCoord2f(depth, textop);
+                       glVertex3f(-.2, 2.0, zdepth);
+       
+                       glTexCoord2f(depth, texbot);
+                       glVertex3f(-.2, 0.4 + height * 2.0, zdepth);
+               }
+       
+               height = (percent  - full_wall * 2.0) /( 1.0 - full_wall * 2.0);
+               if (height > 0.8) height = 0.8;
+
+
+               mi->polygon_count += 2;
+               /* TR */
+               texbot = tr0;
+               textop = tr0 + half_floor * height;
+               glTexCoord2f(0.0, texbot);
+               glVertex3f(1.0, 2.0, 0.0);
+
+               glTexCoord2f(0.0, textop);
+               glVertex3f(1.0 - height, 2.0, 0.0);
+
+               glTexCoord2f(depth, textop);
+               glVertex3f(1.0 - height, 2.0, zdepth);
+
+               glTexCoord2f(depth, texbot);
+               glVertex3f(1.0, 2.0, zdepth);
+
+               /* TL */
+               texbot = tl1 - half_floor * height;
+               textop = tl1;
+               glTexCoord2f(0.0, texbot);
+               glVertex3f(-1.0 + height, 2.0, 0.0);
+
+               glTexCoord2f(0.0, textop);
+               glVertex3f(-1.0, 2.0, 0.0);
+
+               glTexCoord2f(depth, textop);
+               glVertex3f(-1.0, 2.0, zdepth);
+
+               glTexCoord2f(depth, texbot);
+               glVertex3f(-1.0 + height, 2.0, zdepth);
+
+               height = (percent  - full_wall * 2.0) /( 1.0 - full_wall * 2.0);
+
+               if (height > 1.0) height = 1.0;
+
+
+               mi->polygon_count += 2;
+               /* BR */
+               texbot = tr0;
+               textop = tr0 + half_floor * height;
+               glTexCoord2f(0.0, texbot);
+               glVertex3f(1.0, -2.0, 0.0);
+
+               glTexCoord2f(0.0, textop);
+               glVertex3f(1.0 - height, -2.0, 0.0);
+
+               glTexCoord2f(depth, textop);
+               glVertex3f(1.0 - height, -2.0, zdepth);
+
+               glTexCoord2f(depth, texbot);
+               glVertex3f(1.0, -2.0, zdepth);
+
+               /* BL */
+               texbot = tl1 - half_floor * height;
+               textop = tl1;
+               glTexCoord2f(0.0, texbot);
+               glVertex3f(-1.0 + height, -2.0, 0.0);
+
+               glTexCoord2f(0.0, textop);
+               glVertex3f(-1.0, -2.0, 0.0);
+
+               glTexCoord2f(depth, textop);
+               glVertex3f(-1.0, -2.0, zdepth);
+
+               glTexCoord2f(depth, texbot);
+               glVertex3f(-1.0 + height, -2.0, zdepth);
+
+               
+               glEnd();
+       }
+       
+       if (percent > 0.0) {
+               mi->polygon_count += 2;
+               glBegin(GL_QUADS);
+               height = percent / ( full_wall * 2.0);
+               if (height > 1.0) height = 1.0;
+               textop = (l0 + l1) / 2.0 - full_wall * 0.5 * height;
+               texbot = (l0 + l1) / 2.0 + full_wall * 0.5 * height;
+
+               glTexCoord2f(0.0, textop);
+               glVertex3f(-1.0, height * 2, 0.0);
+
+               glTexCoord2f(0.0, texbot);
+               glVertex3f(-1.0, -height * 2, 0.0);
+
+               glTexCoord2f(depth, texbot);
+               glVertex3f(-1.0, -height * 2, zdepth);
+
+               glTexCoord2f(depth, textop);
+               glVertex3f(-1.0, height * 2, zdepth);
+
+               textop = (r0 + r1) / 2.0 - full_wall * 0.5 * height;
+               texbot = (r0 + r1) / 2.0 + full_wall * 0.5 * height;
+
+               glTexCoord2f(0.0, texbot);
+               glVertex3f(1.0, height * 2, 0.0);
+
+               glTexCoord2f(0.0, textop);
+               glVertex3f(1.0, -height * 2, 0.0);
+
+               glTexCoord2f(depth, textop);
+               glVertex3f(1.0, -height * 2, zdepth);
+
+               glTexCoord2f(depth, texbot);
+               glVertex3f(1.0, height * 2, zdepth);
+               glEnd();
+       }
+
+
+       glMatrixMode(GL_TEXTURE);
+       glLoadIdentity();
+       glMatrixMode(GL_MODELVIEW);
+} /* make_wall_tunnel */
+
+/* wraps an int to between min and max.
+   Kind of like the remainder when devided by (max - min).
+   Used to create torus mapping on square array */
+int wrapVal(int val, int min, int max)
+{
+       int ret;
+
+       ret = val;
+       if (val >= max)
+               ret = min + (val - max ) % (max - min);
+       if (val < min)
+               ret = max - (min - val) % (max - min);
+       return(ret);
+}
+
+/*=================== Load Texture =========================================*/
+/* ripped from atunnel.c,  Copyright (c) E. Lassauge, 2003-2004. */
+/* modified like so by Sean Brennan:
+  take texture object for glbind
+  removed xlock stuff
+  Added filters:
+    blur color / alpha channel [3x3 box filter, done [blur] times
+    anegative : create b/w image from zero alpha. zero alpha gets bw_color,
+               nonzero alpha gets 1.0 - bwcolor, then alpha flipped to 1-alpha.
+
+*/
+
+float mylog2(float x) { return ( log(x) / log(2));}
+
+static void LoadTexture(ModeInfo * mi, char **fn, unsigned int texbind, int blur, float bw_color, Bool anegative, Bool onealpha)
+{
+       /* looping and temporary array index variables */
+       int ix, iy, bx, by, indx, indy, boxsize, cchan, tmpidx, dtaidx;
+
+       float boxdiv, tmpfa, blursum ;
+       unsigned char *tmpbuf, tmpa;
+       Bool rescale;
+
+
+        XImage *teximage;    /* Texture data */
+
+       rescale = FALSE;
+
+       boxsize = 2;
+       boxdiv = 1.0 / ( boxsize * 2.0 + 1.0) / ( boxsize * 2.0 + 1.0);
+
+        if ((teximage = xpm_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
+                         MI_COLORMAP(mi), fn)) == None) {
+            fprintf(stderr, "%s: error reading the texture.\n", progname);
+            glDeleteTextures(1, &texbind);
+            do_texture = False;
+            exit(0);
+        }
+
+       /* check if image is 2^kumquat, where kumquat is an integer between 1 and 10. Recale to
+          nearest power of 2. */
+       tmpfa = mylog2((float) teximage->width);
+       bx = 2 << (int) (tmpfa -1);
+       if (bx != teximage->width) {
+               rescale = TRUE;
+               if ((tmpfa - (int) tmpfa) >  0.5849)
+                       bx = bx * 2;
+       }
+       tmpfa = mylog2((float) teximage->height);
+       by = 2 << (int) (tmpfa - 1);
+       if (by != teximage->height) {
+               rescale = TRUE;
+               if ((tmpfa - (int) tmpfa) >  0.5849)
+                       by = by * 2;
+       }
+
+       if (rescale) {
+               tmpbuf = calloc(bx * by * 4, sizeof(unsigned char));
+               if (gluScaleImage(GL_RGBA, teximage->width, teximage->height, GL_UNSIGNED_BYTE, teximage->data,
+                               bx, by, GL_UNSIGNED_BYTE, tmpbuf))
+                       check_gl_error("scale image");
+               
+               free(teximage->data);
+               teximage->data = (char *) tmpbuf;
+               teximage->width = bx;
+               teximage->height= by;
+       }
+       /* end rescale code */
+               
+       if (anegative ) {
+               for (ix = 0 ; ix < teximage->height * teximage->width; ix++)
+                       {
+                               if (!teximage->data[ ix * 4 + 3]) {
+                                       teximage->data[ ix * 4 + 3]  = (unsigned char) 0xff;
+                                       tmpa = (unsigned char) (bw_color * 0xff);
+                               } else  {
+                                       if (onealpha)
+                                               teximage->data[ ix * 4 + 3]  = (unsigned char) 0xff;
+                                       else
+                                               teximage->data[ ix * 4 + 3]  = (unsigned char)  0xff - 
+                                                               teximage->data[ ix * 4 + 3];
+                                       tmpa = (unsigned char) ((1.0 - bw_color) * 0xff);
+                               }
+                               /* make texture uniform b/w color */
+                               teximage->data[ ix * 4 + 0]  =
+                                       (unsigned char) ( tmpa);
+                               teximage->data[ ix * 4 + 1]  =
+                                       (unsigned char) ( tmpa);
+                               teximage->data[ ix * 4 + 2]  =
+                                       (unsigned char) ( tmpa);
+                               /* negate alpha */
+                       }
+       }
+               
+       if (blur > 0) {
+               if (! anegative ) /* anegative alread b/w's the whole image */
+                       for (ix = 0 ; ix < teximage->height * teximage->width; ix++)
+                               if (!teximage->data[ ix * 4 + 3])
+                               {
+                                       teximage->data[ ix * 4 + 0]  =
+                                               (unsigned char) ( 255.0 * bw_color);
+                                       teximage->data[ ix * 4 + 1]  =
+                                               (unsigned char) ( 255.0 * bw_color);
+                                       teximage->data[ ix * 4 + 2]  =
+                                               (unsigned char) ( 255.0 * bw_color);
+                               }
+               ;
+               tmpbuf = calloc(teximage->height * teximage->width * 4, sizeof(unsigned char)  )        ;
+               while (blur--) {
+                       /* zero out tmp alpha buffer */
+                       for (iy = 0 ; iy <teximage->height * teximage->width * 4 ; iy++)
+                               tmpbuf[iy] = 0;
+                       for (cchan = 0; cchan < 4 ; cchan++) {
+                               for (iy = 0 ; iy < teximage->height ; iy++) {
+                                       for (ix = 0 ; ix < teximage->width ; ix++) {
+                                               dtaidx = (teximage->width * iy + ix) * 4;
+                                               tmpa =  teximage->data[dtaidx + cchan];
+                                               tmpfa = (float) tmpa * boxdiv;
+                                               /* box filter */
+                                               blursum = 0.0;
+                                               for (by = -boxsize ; by <= boxsize; by++) {
+                                                       for (bx = -boxsize ; bx <= boxsize; bx++) {
+                                                               indx = wrapVal(ix + bx, 0, teximage->width);
+                                                               indy = wrapVal(iy + by, 0, teximage->height);
+                                                               tmpidx = (teximage->width * indy + indx) * 4;
+                                                               blursum = tmpfa;
+                                                               tmpbuf[tmpidx + cchan] += (unsigned char) blursum;
+                                                       } /* for bx */
+                                               } /* for by  */
+                                       } /* for ix  */
+                               } /* for iy */
+                       } /* for cchan */
+                       /* copy back buffer */
+                       for (ix = 0 ; ix < teximage->height * teximage->width * 4; ix++)
+                               teximage->data[ix] = tmpbuf[ix];
+               } /*while blur */
+               free(tmpbuf); /*tidy*/
+       } /* if blur */
+
+                       
+       
+
+        clear_gl_error();
+#ifdef HAVE_GLBINDTEXTURE
+        glBindTexture(GL_TEXTURE_2D, texbind);
+#endif
+        glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, teximage->width, teximage->height,
+                        0, GL_RGBA, GL_UNSIGNED_BYTE, teximage->data);
+        check_gl_error("texture");
+       setTexParams(); 
+        XDestroyImage(teximage);
+}
+
+/* creates cylender for time tunnel. sides, zmin, zmax, rad(ius) obvious.
+   stretch scales texture coords; makes tunnel go slower the larger it is.
+   not drawn, but put into display list. */
+void makecyl(int sides, float zmin, float zmax, float rad, float stretch) {
+       int i;
+       float theta;
+
+       /* cap */
+       if (do_fog) {
+               glBegin(GL_TRIANGLE_FAN);
+               glTexCoord2f(1.0, 0.0);
+               glVertex3f(0.0 , 0.0 , zmax); 
+               for (i = 0 ; i <= sides; i++) {  
+                       theta = 2.0 * M_PI * ((float) i / (float) sides);
+                       glVertex3f(cos(theta) * rad, sin(theta) * rad, zmax);
+               }
+               glVertex3f(cos(0.0) * rad, sin(0.0) * rad, zmax);
+               glEnd(); 
+       }
+       
+       glBegin(GL_QUAD_STRIP);
+       for (i = 0 ; i <= sides; i++)
+       {
+               if ( i != sides) {
+                       theta = 2.0 * M_PI * ((float) i / (float) sides);
+                       glTexCoord2f(0.0, 1.0 * (float) i / (float) sides); 
+                       glVertex3f(cos(theta) * rad, sin(theta) * rad, zmin);
+                       glTexCoord2f(stretch, 1.0 * (float) i / (float) sides); 
+                       glVertex3f(cos(theta) * rad, sin(theta) * rad, zmax);
+               } else {
+                       theta = 0.0;
+                       glTexCoord2f(0.0, 1.0);
+                       glVertex3f(cos(theta) * rad, sin(theta) * rad, zmin);
+                       glTexCoord2f(stretch, 1.0);
+                       glVertex3f(cos(theta) * rad, sin(theta) * rad, zmax);
+               }
+       }
+       glEnd();
+}
+
+void 
+init_tunnel (ModeInfo *mi)
+{
+  int i;
+
+  tunnel_configuration *tc;
+  
+  wire = MI_IS_WIREFRAME(mi);
+
+  if (!tconf) {
+    tconf = (tunnel_configuration *)
+      calloc (MI_NUM_SCREENS(mi), sizeof (tunnel_configuration));
+    if (!tconf) {
+      fprintf(stderr, "%s: out of memory\n", progname);
+      exit(1);
+    }
+
+    tc = &tconf[MI_SCREEN(mi)];
+  }
+
+  tc = &tconf[MI_SCREEN(mi)];
+
+  tc->glx_context = init_GL(mi);
+
+  tc->cyllist = glGenLists(1);
+  tc->diamondlist = glGenLists(1);
+  tc->num_effects = 12;
+  tc->num_texshifts = 3;
+  tc->effect_time = 0.0;
+  tc->effect_maxsecs = 30.00;
+  /* check bounds on cmd line opts */
+  if (start > tc->effect_maxsecs) start = tc->effect_maxsecs;
+  if (end > tc->effect_maxsecs) end = tc->effect_maxsecs;
+  if (start < tc->effect_time) start = tc->effect_time;
+  if (end < tc->effect_time) end = tc->effect_time;
+
+  /* set loop times, in seconds */
+  tc->start_time = start;
+  tc->end_time = end;
+
+  /* reset animation knots, effect 0 not defined. */
+  tc->effects = malloc(sizeof(effect_t) * ( tc->num_effects + 1));
+  for ( i = 1; i <= tc->num_effects ; i++)
+       init_effects(&tc->effects[i], i);
+
+  if (wire) {
+       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+       do_texture = FALSE;
+  }
+
+  if (do_texture)
+  {
+          glGenTextures(MAX_TEXTURE, tc->texture_binds);
+         
+         /*LoadTexture(*mi, **fn, texbind, bluralpha, bw_color,  anegative, onealpha)*/
+          LoadTexture(mi, timetunnel0_xpm, tc->texture_binds[0], 0, 0.0, FALSE, FALSE);
+          LoadTexture(mi, timetunnel1_xpm, tc->texture_binds[2], 0, 0.0, FALSE, FALSE);
+          LoadTexture(mi, timetunnel2_xpm, tc->texture_binds[5], 0, 0.0, FALSE, FALSE);
+          LoadTexture(mi, tunnelstar_xpm, tc->texture_binds[4], 0, 0.0, FALSE, FALSE);
+# ifdef GET_SUED_BY_THE_BBC
+         if (locklogo) {
+# endif /* GET_SUED_BY_THE_BBC */
+               LoadTexture(mi, (char **) logo_180_xpm, tc->texture_binds[3],  0,0.0, FALSE, FALSE);
+               tc->texture_binds[1] = tc->texture_binds[3];
+               tc->texture_binds[6] = tc->texture_binds[3];
+               tc->texture_binds[8] = tc->texture_binds[3];
+               /* negative */
+               LoadTexture(mi, (char **) logo_180_xpm, tc->texture_binds[9],  2,1.0, TRUE, TRUE);
+# ifdef GET_SUED_BY_THE_BBC
+        } else {
+               LoadTexture(mi, whologo_xpm, tc->texture_binds[3],  0,0.0, FALSE, FALSE);
+               LoadTexture(mi, tardis_xpm, tc->texture_binds[1], 0, 0.0 ,FALSE, FALSE);
+               LoadTexture(mi, whohead1_xpm, tc->texture_binds[6], 0, 1.0, FALSE, FALSE);
+               /* LoadTexture(mi, whohead_psy_xpm, tc->texture_binds[8], 1, 0.7, FALSE, FALSE); */
+               /* negative */
+               LoadTexture(mi, whohead1_xpm, tc->texture_binds[9], 2, 1.0, TRUE, TRUE);
+         }
+# endif /* GET_SUED_BY_THE_BBC */
+          glEnable(GL_TEXTURE_2D);
+         check_gl_error("tex");
+  }
+
+  reshape_tunnel (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+  glDisable(GL_DEPTH_TEST);  /* who needs it? ;-) */
+
+  if (do_fog)
+       glEnable(GL_FOG);
+
+  if (!wire)
+    {
+      glEnable(GL_ALPHA_TEST);
+      glAlphaFunc(GL_GREATER, 0.5);
+    }
+
+    tc->trackball = gltrackball_init ();
+
+
+  tc->texshift = calloc(tc->num_texshifts, sizeof(GLfloat));
+  for ( i = 0 ; i < tc->num_texshifts; i++)
+       tc->texshift[i] = 0.0;
+
+  glNewList(tc->cyllist, GL_COMPILE);
+  makecyl(30, -0.1, CYL_LEN, 1., 10. / 40.0 * CYL_LEN);  
+  /*makecyl(30, -0.5, DIAMOND_LEN, 1., 4. / 40 * DIAMOND_LEN); */
+  glEndList();
+
+  glNewList(tc->diamondlist, GL_COMPILE);
+  makecyl(4, -0.5, DIAMOND_LEN, 1., 4. / 40 * DIAMOND_LEN);
+  glEndList();
+}
+
+
+void
+draw_tunnel (ModeInfo *mi)
+{
+  tunnel_configuration *tc = &tconf[MI_SCREEN(mi)];
+  Display *dpy = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+
+
+  if (!tc->glx_context)
+    return;
+
+  glShadeModel(GL_SMOOTH);
+
+  glEnable(GL_NORMALIZE);
+  /* glEnable(GL_CULL_FACE); */
+
+  glClear(GL_COLOR_BUFFER_BIT );
+
+  update_animation(tc);
+
+
+  glPushMatrix ();
+
+       glRotatef(180., 0., 1., 0.);
+    gltrackball_rotate (tc->trackball);
+       glRotatef(180., 0., 1., 0.);
+
+
+
+  mi->polygon_count = 0;
+
+  update_fog(tc->effects[4].state[0],  /*color*/
+            tc->effects[4].state[1],  /*density*/
+            tc->effects[4].state[2],  /*start*/
+            tc->effects[4].state[3]); /*end*/
+
+  /* --- begin composite image assembly --- */
+
+  /* head mask and draw diamond tunnel */
+
+  glEnable(GL_BLEND);
+  draw_cyl(mi, tc, tc->effects[6].state[0], 5, tc->diamondlist, 2); 
+  if (! tunonly)
+       draw_sign(mi, tc,tc->effects[12].state[0], tc->effects[12].state[1],  1.0 / 1.33, 9, 1); 
+  glDisable(GL_BLEND);
+  /* then tardis tunnel */
+  make_wall_tunnel(mi, tc, tc->effects[1].state[0], tc->effects[7].state[0]);
+
+  /* then cylender tunnel */
+  glEnable(GL_BLEND);
+  draw_cyl(mi, tc, tc->effects[3].state[0], 2, tc->cyllist, 1); 
+
+       /*void draw_sign(mi, tc,z,alpha,aspect,tex,blendmode)*/
+  /* tardis */
+  if (! tunonly)
+       draw_sign(mi, tc, tc->effects[2].state[0], tc->effects[2].state[1], 2.0, 1, 0);
+  /* logo */
+  if (! tunonly)
+       draw_sign(mi, tc, tc->effects[5].state[0], tc->effects[5].state[1], 1.0, 3, 0);
+  /*who head brite*/
+  if (! tunonly)
+       draw_sign(mi, tc,1.0, tc->effects[10].state[0],  1.0 / 1.33, 6, 2);
+  /*who head psychadelic REMOVED*/
+  /* draw_sign(mi, tc,1.0, tc->effects[11].state[0],  1.0 / 1.33, 8, 0); */
+
+  /* star */
+  /* draw_sign(mi, tc, tc->effects[8].state[0]tc->effects[8].state[0], 1.0 , 1.0, 4, 1); */
+  draw_sign(mi, tc,  tc->effects[8].state[0],  tc->effects[8].state[0],  1.0, 4, 1);
+  /* normal head */
+  if (! tunonly)
+       draw_sign(mi, tc,1.0, tc->effects[9].state[0], 1.0 /  1.33, 6, 0);
+
+  /* --- end composite image assembly --- */
+
+
+  glPopMatrix ();
+
+  if (mi->fps_p) do_fps (mi);
+  glFinish();
+
+  check_gl_error("drawing done, calling swap buffers");
+  glXSwapBuffers(dpy, window);
+}
+
+#endif /* USE_GL */
diff --git a/hacks/glx/timetunnel.man b/hacks/glx/timetunnel.man
new file mode 100644 (file)
index 0000000..76aaeea
--- /dev/null
@@ -0,0 +1,81 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+timetunnel - Plasma tunnels fade in and out
+.SH SYNOPSIS
+.B timetunnel
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-start \fInumber\fP]
+[\-end \fInumber\fP]
+[\-dialate \fInumber\fP]
+[\-tunonly]
+[\-reverse]
+[\-fog]
+[\-no-texture]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws an animation similar to the opening and closing effects on the
+Dr. Who television show.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-start \fInumber\fP
+Start time of loop, 0.0 - 30.00. Default 0.0.  May be identical to end time.
+.TP 8
+.B \-end \fInumber\fP
+End time of loop, 0.0 - 30.00. Default 27.79.  May be identical to start time.
+.TP 8
+.B \-dialate \fInumber\fP
+Scale time to speed or slow simulation.  Numbers less than one slow it down.
+.TP 8
+.B \-tunonly
+Show only tunnels, no logos, etc.
+.TP 8
+.B \-reverse
+Play in reverse, including tunnels.
+.TP 8
+.B \-fog
+Turn off fog.
+.TP 8
+.B \-no-texture
+Turn off textures.
+.TP 8
+.B \-wireframe
+Show as wire frame
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Sean Brennan.  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.
+.SH AUTHOR
+Sean Brennan <zettix@yahoo.com>
index 7d67728b117c5bad5b7d73a38d4f885ae528bc59..c32250a4b9d9af6a14b252844674803e716013ad 100644 (file)
 extern char *progname;
 
 
 extern char *progname;
 
 
+static Bool
+bigendian (void)
+{
+  union { int i; char c[sizeof(int)]; } u;
+  u.i = 1;
+  return !u.c[0];
+}
+
+
 #if defined(HAVE_GDK_PIXBUF)
 
 # include <gdk-pixbuf/gdk-pixbuf.h>
 #if defined(HAVE_GDK_PIXBUF)
 
 # include <gdk-pixbuf/gdk-pixbuf.h>
@@ -86,6 +95,15 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap,
 
       image = XCreateImage (dpy, visual, 32, ZPixmap, 0, 0, w, h, 32, 0);
       image->data = (char *) malloc(h * image->bytes_per_line);
 
       image = XCreateImage (dpy, visual, 32, ZPixmap, 0, 0, w, h, 32, 0);
       image->data = (char *) malloc(h * image->bytes_per_line);
+
+      /* Set the bit order in the XImage structure to whatever the
+         local host's native bit order is.
+       */
+      image->bitmap_bit_order =
+        image->byte_order =
+          (bigendian() ? MSBFirst : LSBFirst);
+
+
       if (!image->data)
         {
           fprintf (stderr, "%s: out of memory (%d x %d)\n", progname, w, h);
       if (!image->data)
         {
           fprintf (stderr, "%s: out of memory (%d x %d)\n", progname, w, h);
@@ -165,15 +183,6 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap,
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
-#if 0
-static Bool
-bigendian (void)
-{
-  union { int i; char c[sizeof(int)]; } u;
-  u.i = 1;
-  return !u.c[0];
-}
-#endif
 
 
 /* The libxpm version of this function...
 
 
 /* The libxpm version of this function...
@@ -269,6 +278,11 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap,
        things as necessary) OpenGL pretends everything is client-side, so
        we need to pack things in the right order for the client machine.
      */
        things as necessary) OpenGL pretends everything is client-side, so
        we need to pack things in the right order for the client machine.
      */
+
+    ximage->bitmap_bit_order =
+      ximage->byte_order =
+        (bigendian() ? MSBFirst : LSBFirst);
+
 #if 0
     /* #### Cherub says that the little-endian case must be taken on MacOSX,
             or else the colors/alpha are the wrong way around.  How can
 #if 0
     /* #### Cherub says that the little-endian case must be taken on MacOSX,
             or else the colors/alpha are the wrong way around.  How can
diff --git a/hacks/images/timetunnel0.xpm b/hacks/images/timetunnel0.xpm
new file mode 100644 (file)
index 0000000..65a6e8b
--- /dev/null
@@ -0,0 +1,343 @@
+/* XPM */
+static char * timetunnel0_xpm[] = {
+"256 256 84 1",
+"      c #5D699C",
+".     c #5A6EC7",
+"+     c #596FD1",
+"@     c #576FD7",
+"#     c #566FDE",
+"$     c #6172B3",
+"%     c #5670E6",
+"&     c #6477BF",
+"*     c #6076D2",
+"=     c #6377C6",
+"-     c #6277CC",
+";     c #5876F6",
+">     c #607AE7",
+",     c #5D7AF0",
+"'     c #627BDE",
+")     c #6982D1",
+"!     c #6582DE",
+"~     c #6882D8",
+"{     c #6D7FDC",
+"]     c #6284FD",
+"^     c #7088D1",
+"/     c #6886F6",
+"(     c #738ACC",
+"_     c #7185EF",
+":     c #6C89EC",
+"<     c #698AF4",
+"[     c #648DFD",
+"}     c #6C8EE7",
+"|     c #748BE7",
+"1     c #738FDE",
+"2     c #6D94FF",
+"3     c #6B9BFD",
+"4     c #7796FA",
+"5     c #709DF5",
+"6     c #7A9EDD",
+"7     c #7C9BEB",
+"8     c #8A99D1",
+"9     c #73A1E8",
+"0     c #8198F6",
+"a     c #8895F3",
+"b     c #819CE6",
+"c     c #7D9DF7",
+"d     c #89A0E3",
+"e     c #78A6FE",
+"f     c #76ACFD",
+"g     c #83AAE9",
+"h     c #72B3FF",
+"i     c #89ABFC",
+"j     c #80B6FD",
+"k     c #92AEF9",
+"l     c #7DBFFE",
+"m     c #8DBCEE",
+"n     c #9BB7EC",
+"o     c #8DBCFA",
+"p     c #9FB4F8",
+"q     c #97B8F9",
+"r     c #7AC7FF",
+"s     c #AEB7EF",
+"t     c #80D5FF",
+"u     c #8DD1FD",
+"v     c #99CCFD",
+"w     c #89DDFF",
+"x     c #B1CAFB",
+"y     c #A8D3FB",
+"z     c #82E6FF",
+"A     c #9AE1FE",
+"B     c #CCCCFA",
+"C     c #B3D9FC",
+"D     c #87F4FF",
+"E     c #93EFFF",
+"F     c #A8EAFE",
+"G     c #B6E6FD",
+"H     c #C5E0FC",
+"I     c #99FDFF",
+"J     c #AEFCFF",
+"K     c #BDF7FF",
+"L     c #E7E9FA",
+"M     c #E4F0FD",
+"N     c #D9F6FF",
+"O     c #C9FFFE",
+"P     c #D7FDF8",
+"Q     c #D5FFFF",
+"R     c #ECFFFE",
+"S     c #FCFFFD",
+";%%;,,,;,,,#,,,,,,/>++#@@#+.+++@+@@+@#++..++.+@+++':|1gAAFAv9e}32<::||01|44cc111e777iikc77ibGSSRRRRRRQOJIIIIIDIEEwwttwwzztj&   ^$     iJEIDDIIIJIIOOIOROJEEJKKOQQMSBqqddb(bb^b1^^^&=~~:!<'{!!!!~|{::<::|{:{'{'''''*'''*''+'*++.'++++@+++@@#@@@@#>@####%%%%,#@###",
+"%##%%%,,,>#>###,//#@+@@@@@@++@++.+#@+@+#+++++++....*}55jAAttvAvomf71}:~~|~!~~)1~))1117c|}c1dHSSSSROOJJJEIDDEztrllhjjrrjjju2=  $)=     GulEEwwEIIIIIJOJJORQJJFKKQNSSBndd(((((((^^&&====~~!{{:<'{!:::::':!{:{:{:''''''''{'''*'@@+++.+*++++@@@#%#>>>##%###%#%#%####",
+"%#%%%%%,##%#,,,/,,#@@++###@++++.+@++@.+@+..+.+++++..*!5ehturrhjlvvvvvvmmoobbb7^^^(((d8d88CHLLSSSNKKFFEEEEDDDztwtrljheeeffj/-  $)&$    AjflEttwzIIIIIJJOJIORRQKKGHLSssd(((^^((^(^&&&&)====~-'*''{<'{<<{!'''~'''<:{'*''''''>''''''>>@@+@@+#@#,;%%#,,%%%%%%%###%#%%",
+"%%%%,%%,%%,,]/,###,##++#@@@+++.+@@++.++++++.....++***-!}5erwljfhfffjhjjjjooommmomyCHNNRRRLLLSSSSSNKFFFFEEEEEwrllhrhhhffjef[-$$$)^$$   j32eEEEzwIEEIIIIIJOQJOPRRMMLSBs8(((^^(&$&$&&&&&=&&===--**_'_'_/_<_'''////__'''_'*'''''''''''>>>@@@####;%;%,>%%%;%%##%%#%%;",
+"%%#%#%%%%,,/#%%#####%@@+@@@@@+.++++++..+.......*.***-!}!:43jrleffe553c5e5b7igovvGKKQQQKCvmnCLSSSSSNFAutAwtwturjjhlfefeee33[-$$&=)$$$ $4342lzEEEIEwtwEIIIIJOQPQRRSSSB88(((^)&$&&&&&&&&=&&&====--*{'{'>>/_'_><'''<<<<<<<<<<<<<[<<_</__/>>#,###,%%,>,%%###%@##%##%%",
+"%#%,,##,,>###%%#######@@#@###@++.+@..++...+......**--!!!:::<elfe3e5335e57cikqqovAAAACmqqqqmCLSSSSSSNFtwtwuAturjjhhfeeefee2/-$$&=1&($ $<::43twwwEwwtutEIIIIIJKQRRSSSB8((((^&&)&&&&&&&&&=&=======-=-**''*'>>,>>>>''>''<:::__//////]]/242[//]>>,>,>,,###@####%##%;;",
+"#,,,/>>##@#####%%########@@##@+@+++.+.........-*****!!!!:_/<<2hh55efefjfeiiivvvvoii7pbbbdgnySSSSSSSSRKAuuuuurlhhfe55e3333[[-$$==1(($$$_{!!:fztzwhhoruAEIJIJJFGGNSSSLd88(((^^&&)&&&&&&&=&&=&====-==--****+@>>@>>_>>___'<<<</__//__>>__2</>,,,,,>,,],###,%##%,##%%",
+",,/>@#%%###%%%%###%###@#%@#@#@+##++.+++.+....+***'''|!!!</''/:|ojjfffjjovvovicccc7bbdb^^(dgxSLMMQQRSRRKturrrojhff55332322/[-$$&=)^$$$$''--=-mzDrhf9jlmAEJJJFFKQRSSSL88d((^(^^&&$)&)&&&&&=======-==---*..*+++@>>,>>>>/>>/////_'_'__/__/<2/>],,,],,,;>%,%,%,,,#,%,",
+",##%####%@#%#####%%#@##%%@@#@@@@@@@++@+.+..+***''*'!~!!|::<42cc3hrrtturje3:|~||~}177^^^^((8xCxMNNKKQROJJFrglo99f55}34322</[!&&&=)1$$$${---=)~rtlhffhjmtEJEJQQNNMSSSL8((((^^^(^^)========--=--==-==-******++.+@>>>,>//>/>'_>_'>_/'<_<__/<32/>,,>,,],,,,,%,#%,##,]",
+"%%%##%%@%#####@@###@@@###+@@#+@++#@.@++>+++****''*!|7eeie43ceie33fffee2<2<:|~~~~~|77)1^^(((sdnHHCGKJORJIJErlj9iee5}344<<<<[)&&===&&$$$!---===1oh5efjjvEzAAAJJKGNSSSB8(((^^^^^^)^&==----=----=--=-=-*-***+.++@'*'_>]]]/////////<//__<<2<_[<32/>,,,]]],],;%,,,],,#",
+"#####%%%%%%%####@##@#####@+@@@.+@>.*++'*+''*'*!!|cfjfi333233[/]_'':[22232<<4|~|||1c)~1^^((dd66xnvyAJIOOJIIIurjb55534:<<<<_/!&&=-=&&$$$-==---==1e551b9rtuuuwAAAKRSSSBs((((^^^^(^(&&&=----=---==&=--*--**''''>_'_<__>>///////_<<//////_</[</<22[]]]],]]]],>]],#%%%",
+"%#%;;;;;%%%%#@##@++##@@@@@@##+++@+**''''''{!}9ei33e5222/[//]/'=-&==!<<<2222:34|}17|~)1^(sxsddgxnoouAEIQOIIIIwof555332<:::_/~&$&~==$$$$=-====&&&~33177luuuvmuvyCNSSSB8d8((^^^^^^&&)&=======**--*-*--****''*'_''///'_/////,//2</////]//>>]///[<22[/]]]]]//];%%%%%%",
+";;%%%%%%%@#%%###@@##%%@@+@@@+++++**'''':}5e5e3::<[2<[[[//_>>*-==&===!<_<242444}c7c~)~^b(dxnddxLCymvvvFJQQOIEEu9b75344<'{__/!$&=)~=&$$$&-==&=&=&&~}1}5jommmvvmmvNSSSLss((((^^^)^^&&)=&==-*''___'**'!'*''_'''>_///_'__////[2[////]>>>],,,,,//<[[/[3[[]]];;];;;;;;;",
+";%%#%%%#%%#%###@@#@@###@@++++++''{'':4ce3342<<<'<</2[/__'{-*-==&=&&&=~<<[<224c17i}~~)^b7dddqxMHxvvyyyvAFQRKEEEvb1}|:::''_//{&)){)=&$$$$-====&=&=&)~}1hjogmmmmmyNHMSSB88((($(^^^^&)&&=*:<__'__'{*!-{'__''_''____'>__/[[2ce2///>>#,>>>,,,,,,//2[22]//]]];;;;;;;;;;",
+";;%%%%%##%%##%#@#%@@@@##@@@@+@@':|||44:4::<<//<//2[<<'{-{-{**=&&&&=&&=-:<_<24eck7:|~))1^^^^dyMHymvvvuAuuFQQOEEAo71}|:::{_//{)~~{{))&)&$=-=&&&&&$&&&~1f99ggoogmyCyCMSSs8(((^(^^^((^^)://'''{{*{!{{{-'''''''__'__'_/2[<35fc//>'_>>>>>>>>,,,,,,/3e2]];;;;]/]];;;;;;",
+";;;;%%;%%%%%########@@@@@@@+'''{044|::!:<<'>////[<<::!!-~-{--===&&&&&&==!:::4eij3::!~)))^^^(xxvyAuvrmlrlrEJOKwtAj771||:::_2{===-~)))^&$$-=&&$&$&&&$&^99966gggovvnxLLLSB8((^(^^&^&^&~!:{'{!~!~-!~{'''_''''{'''<<<<<222522[[/''_>>>>>>>>>,>,,,][//]//;;;;;;]/];;;;",
+";;;;;;;;;%;%#%########@@@@>>'':244:::<<<<<//]/>'::::'!!-=--===&&&&&$&&&&&)::4eqc2<:!!~~)))^ds86ovwEEulllruDIJKwwAmjiccccc42{===--=&&&$$$=-&&&&$$$&$$^969bbbbggmngnLBBLLL8(((^^^^&^)~~{!!!!~'{!{{!{{_<'!'::'<<<<<<242<<<<</____>>/_'_>>>,>>>/>,;,///;];;;;;;]]]]]",
+"]]]];;;;;;;;%%%%#@@###@@>>_/__<<<:<<<<<<///]>_!!!:!!{'~=--!====&=&=&&&&&&&)|0qc2<<::!!|!))^dd((66guAEEwrruEIIJAtwu77c7eieci~)&)--==&&&&&===&&$$$$$$$(b996bbb6goqqdBBBBBLBs8(^^^^^&)~~~!!~!~{{'{!!!{''':<<<<<<<<<<__<_<<_<<<_<___///_//_>'>,#,,>]]]//]]]];;;;;;;;",
+";;;;;]]];;;;;;;;%#%#%@+___/_</<<::<<<</>]]>_'*!!:|!!!!~~~{!~==&===&&&&&&&&&(de::3<:::|!~~}7bb^(bbb9jrtuuutAIIIOurwf}}55335511c|||~))&&&$&)=&)1^^^^^$(b666bbbbgo8gdssssBBBBsd(^^)))~)~~!~~)~!!!~!~!:{!::<<<:<<<<::<<:_<<::':'______/__///_,,,,,%,,;;]]]]]]];];;;;",
+"]];;;;;;;]//]]];;;;%;@____''_/<<<<///,]/>>''!!!:}}}::|~-!:~~)&&====&==&&&&(8():<<2<<:!}|}171b^^^^11b9jruljlzzDJFrtr7333533:}}11cicc1^^&$$&&&^^($(((((og66bbbbgonq8sssssssssspbb^))))~~~~~)~~!!!!~|4:::!'<<<cei4<<::::'::''''':_'''____>@>,,>,/>>,],]];;;;;;;;;;;",
+";;]]/]]];;;;]]////]]/3///_<<<<<<<<[///>'>+*''!!:}:::|!!!||~~=)=====&=&&&&(d(&&&!<<2[<!!}77c11177111755jrurrrrtwFhltwhe53354}111}}111b771^&^))&^($&$$$gvmog9bbgooqnsssssssssspkkb11)&))~))~~~|||}}||!::253344c4c::::::{::{:{::<'{<'___'>+.@@@#,/,,///]]]]];;;;;;;",
+";;;;;];]/][/];]]]][3e33222[[/<<//<///_>>>'*'*<44::!!!!:!~!~~))~)===&&&$(d8$$)&&$~<<222!|771771111177775hjllrutrJe35fljllj5~~==~~}~~)))^^^111^^&&^$$$$(og6666dgoqqqxssspsBBpppdkbb711)))~~~~||||||}c:2:4<<<:::{{:{::::<:::::{{{'::_''>@@@+@++@@@@>@>/<332[/]];;;;",
+";;;;;;;;;;;]//[[/[422223eff33232//[_/__''*>''<2:<:!~!|:{!~~~~~)))==&&^(n8$&&=&&&==:<<20acc111111111177555hhjjruAr552[<<<''!!!~~}}}!~~))^&&^^11^(&^($&$66g66666ggddxsppppssssdkbbbb7b1111||~bb7c4|c044::::4:::{{~!:{:'::{*:':{::{'**+++@+++++@+@@@##>@>,;,//2[//]",
+";;;;;;;;;;];;]]/[2e333333333eeee3324[//<'>@'<<<<<'!:!:{:!|!~~~~)~|11bkd(&&&&=&&&&&=!:4c4011111111111}1715efhlruEwf322<//>*--~~!|}}1~~))&&&$(^^^^^^(($$(6gg66(6g6dsBspppppssssdpdb7717cccc7oyxCi0|}||:<||:_:<::{!!!|:{::{!:{::{'-**'+'++++.@++@+@@@##%#%%;;;;;;;;",
+";%;;%;;;;;;]]]//2222233fhlhlfe33eehlfe532<>_/<<_'''::<'<:||!!|~~~)1171==&&===&&=&&&&7c04401111171111}}5115efhjrAte332[//***--!!!}}~~)))=)&&$$^)^^^((($(66gg666g6bnxppddppdpdpddpkiiecc7e77oi7bpcc||{|:||!:<{:::|{:{~{{::{::{*''**'*''.++++++@++@@@@#@###%;;;;;;;",
+";;;;;%%%;;;;//[222[23e3ehhfflhheeeeehfhhjl53<<_'''{'{<<<:::!~||~))17)==--====&&&&$$11^14244}71111}51}}}5}55ffhrEuee32<<'*****!!!:!!~~}~))&&&$$)))^&$^^(666gggjggbnppppdddpdpdkpkkqkii7cc77j77cp7c||!|:{{{::::{::!|{!!:{|!!**'****''''.+++@+++.+@@+@#####%%;%;%%;",
+";;;;;;;;;%,]]//<33333eef33eeeefefejjfjheejtuhh3::'!!'<:24:::!|||)11)---=-=-==&=&&&11^^^1c5e577751}}}}55}}}5ehhlEhfee32/'*+'**'!!!!~~~~====)=&&^&)&)&&&((oogjoogoggspppddddppppkkkppki7cc7ij7c1pkic1||:!|!::::{::::!!!::!*-*'{*-**'>'>++++++++++@@+@@#@#%%#%%;;%;",
+";;;;;;;;;]],/23flffeeee3223333e3e3ee5fjljjrumhhjje554|::::{!|||cc~---=----!~==))11ki77777efjfeeee55}555}}}3flhrIe333e3<''.''*!!!!!~~!-===&&=)&^^&=)))=))brvvoggoggnnpppddddpppiikpkkkkieiiji77kiiccc||||!{:::|{::!{!{!**-!'!*{{{**'''@+++++@+.+@@@@##%%%###%%%%;",
+";;%;;;;;/33efjhhfee33ee33322[[2233e3335efhrrmvjfffljjfe}|4:!:|0||!!---=---!!|}75c7eb7171117fffee7555eee533fljhzw33223[[<''***!!::!!~!~=~~====^^)1)~~154}~9momvmmmgnndddddddppp77kkkbkkk7i7k77dpkiccac0:|~||:|:{{{|~!'*''--!*'{'{{:::'@+++@@@+@+@@@@@###%%@#%%%;;",
+";%#,;,:jjrrhrllje333e3333322[2[[23e5333cefeeefvujheffjomjee10c~~!{------!-!}33ccc17b5bbb7bberttrof55fe533hlllrEr3333[[//>''**!!!!!!!!~!!|}}}15ehjjlhe}~~^^9mvvmmmmnnqdddddkkppbiikbiikkpkbkbiqqjkii77|||||44:|||!!!!<:'-*!*-{'{***|:+@@+@@+@++@@@@@@###%###%#%;%",
+";%,,}hrhfefhfhlhff33333[[22222[[22332[223jfeceeooojihifffomvj7}!!{!-!---!24c5cc3355ff99999hjjtEurlrrlfeehflllrJeehh3322/'''-.-'<!-!!!!!:}:}}555fe}~11)^&&$$9lmmmmCnnnqnppgqppqkikkkkikkdddpdbnqkb7b7777ca|||::~~!{:</:{!{-{!!{*-*{!-''+@@@@++@++@@##@#@@##%;%%%;",
+",/3fhffefefeefl33e3f33[///[//[[2[2332222ifiii3eeijofi5ifjjof9hh7}~!-!=!::3355535}}5jjrljh599jolrjhlrlltwuurlltAhll333322:<_!-!'<<'<:::::|}|~~~1}1~)))^^^)&&(9ommmmCxnnnngqqqqxqikiibbbdpddqqdqjkbbb7777777a0|{{{{:<__-!--{{!~{!!''*'-**.+@+++@@++#@@@########%%%",
+"5fehlfe33333et323[33333[//[//<//[23333223eeffecccciijieejoic757fefb1~!:433355cc55eojjfb11117717ejlhfflrjlwzwzEttr32333222[<:::<::<[<::!!!~!~)~)))~1^)))&$$$$(9ouvmvnnnnnnooooxokkibbkkddpqddqqkbb7bb777777a00|:::<<:{-*{*-{{!!!--*'***'-.+++@#+++@@@@@@###@@%#%,",
+"33rlf3323323hf[2[22[2[222[[/[////<22222e3344efie3ccijqooic3}~}5c5befjjf533e5}5555ee559111^1}}}1effjjlljjruttwJDwfee533333[[35333222<:::!!!!~)~))~)))))&&&&$&^^9mvmvvnnvvnxovvnoqkbbbkppdggddqgpdb7bbb77c1||||aa0|{::--!-!-!-!{********'.+..++@@++@@@###@####@#:3",
+"ful333[3333ee[/22222[3322[222[[/<22[223e3e424ciiecccioqjjc4|||}}}7efloomoe5}c5555e7}5e5511}}~5fe55rtllrwDDDtAElfefeffeff3325he3333322:::!:!~~~~)~~^)))))&)&&&$^guvyvooxyxvvovovqkbikkdbbdddgqdddddbb7711111||0c7a00~---{{{'!---.-*.*****..++++++@@@#@###@#%#>232",
+"th322[22233e2[//2//]//[[22////[//<<<<[3eie22cecijecciic0ccc4|||||}eifjjoAroh555551}~19h55155ejjjjurrrruEDzzDJwhhfhhfhlhjfe5235fff5332:::!!!!-!~=~~~=))))))=))=&^gAGuyuoyvvvvvvxxqkkdddddddgoqdddgkkb^77111c}|0a||ac|))~-!:{----*---*---**.++++@@+@+@@##@@@#<323f",
+"f3322[2/[2[2///////]][//[[[////<[2<<<<222ec4443ciooic33ceccc|}||ceeeeefolruvllf5}~~~~5ff5fefjhltwurruwEEzutDArlrrrlhhhlflfeee3333e33}}:!!!!!!!!!!}~~~=)))))=)&&&^GRNAAvvvCxvvyyxxpdddddgdggogddbbbdbb7717c11cc|||a1|1|a~~-----*'--****-'...+@@+.@@@+@###%>3223hu",
+"3[////[/222///[/,//]]]///[/////<<2<<<<22<234:444ciiie44c0c0cc00ciieeefjffhojmuwj1:!!}}jheehjhrAwtuutrtEEwzwwrhffhhllllfefhhff3333333333:!:!!!!!~!~)~)))~))))))~))nGQRJEAmmyxxCCyvvqgdddddggogbbbdbbbb77777c7c11ccc1)|aaa~-==--*-*-*****''....@@@+@@#+@@#<323frll",
+"/]/]]]/[[2/]]///]]]]]/],//[[////<<<<<3322434400cc0:4cicc40cc00ciiifefjhjjhffjofiff1}:3jlhlrrtAwtwwuruzwzEwuAhfe3353fhllllhhfhff33223::}2:}}::!}~!~)~))))))^~~~~~)oCyFQKEAvmHCyyGyvnggbkd6dgojkbbbbbbbb77777711cc71|||||a|{{-=--=--*--*******+@@@+@+@++@}233htle[",
+"]];]]///[[;]/]]],]]/,>],/],/////2<[<43332224ccc}::24|0eicccciiiiiiifolroffehfcc5eifj55flurwEwuwwurrrzzzwrrAtjeefe3e3efhlrllhhhefe332<:335535}}}}}~}}~~~}~~}}~}}}}oGxowKQFAAvGCyyCGvnqbddgdqo9bg6dbdbbbb7b7b111ci1||||~)||~~~===-*=------'*+>@@>++++.+#533hrlf32[",
+"2[[[/////]];]]]]]]/,,,/]/>,/////<:</2433433efc|!:|:4400ipki7ciqiicijovuvvjjf3443eefoorrzDEDwwwtrtrrwzDrlrtElffefffefhhfffhhllrhffef33333335555}}}}}}}}}:}}}}|:}}}oCqdgmFQKEFAKHCGGCxggggggooqbggkbddbb77bb^^1c7b11)|)~))~||{~~~~=---=-=--'+>'>>++@+@/lfhwzrhee33",
+"//233333[[/]]]]]/],]>,]>//]/>////:<234::44eof44!!{|:|00acikkiceiifvvoohf5hh444343fifotEJIIEDtrrrttDIElrlltujfhfeeffjlrfeffhfflllhjlhhffee3533}3}333}333}3}::::}1^6xndddguKOJEFQGGFGGymgggooogggg6gdddb777b1117o71)1~~~)~~~~|||~~=-------!'*'*_>+,,/3rhrwrhff3[22",
+"//[22[22/2[[[[//]//,,,/>,>>////>/_<4444444ie344|{:||||0cccckojiiiovurojhjf34:333ei5hrEJJOJEturtttDEurljfjAhffeehhhhhllhhlhfflrrrrrrrljrhheeee3535353333}::}}}1^^^(xndgdd8gFOKEFQKKKKGCmoomogqggggd68dbbb^b777gd111))~)~~||~||||1)~---!---{**'>.@/2errrrhf3e322[]",
+";]][//[[/];]]]///[[[[//////'_>>///<34::|434434|||||00||acciijovovuAFvjjlh33335eefhrwIIIJJJJEwtutDAlejlhhturtwwwzwwzwzDrrrrrwzzzzzzwtrrrhljfffeeeee3ee533c}1111^^((xndg66d66uKOJFOOKKKFyxmvooggggggggdddb^bbbbg^^1^11c11}1|11||c7||1~==-!!:':<>>[[errrhfee33[//];",
+"]]]]]/]][[]];],]],]//////////>>//<34224334444344||0|||10cciffjouFEFAAuAve3eeeeehrwIIIIIIIIJJEwwArhloAEEDOIDDDIIDDDzDDIDDDDDIIIIIDDzwwruurlrljhjhfeefe5555b7^^^^^^dxnd6666666mFOJKOOKOKKCCCngogggg86ggddbbbbbgb11711111111}}11}17c1c1|~~~!:<_/<[/3wwlfffee[/]]]/;",
+"]]/]/]]]]],]]]]]],,,],/]]////////222:c34:<44444400|||||ccejvvvvAEJJEFFAvvjjhfhltDIJJJJJJIIJEJEtruFJOJJJQOOJJIIIJJIJIJOJJJJJIIIIIDDzzztutttrurlllhhef55517999^^^^(6xndddd666666uFOOROOQOKFGvnogogonggggdbdbbgg^)^1111111)1111111111cc111}!:/4j3[2tzrlhffe3/]]]];]",
+"]]]//]];;;]]]/]]]],/]]],,>>>///[[e33344::::4404c||||||0ioGGCyuFOQOEJJJJKKKFEEEJOQOOOORJJIEzEFEJKJIIIIIIOIIJOOQRSRRRQNQNMNNGKKOOQOOOJJJIIIIIDEAzwtrhhh999999^^^(((6npddd66dd6d66gyKQRQOOQQKGCvmnggooggg6dbddvb^^11111111111111111}1177cc1c7ehl35wztlfee3e[]]]]];]",
+"]]//]]];;;,,]]]]]],]]]]/]>,>>///[335e2<<<<444cccc||00ciCGAvuurEJEwttAAFFJEJOOOOOOJJJJOIIEEEEJORJIIIIIIOOOOOQOKJEAzurrtlefe3eflrtrwwzDIDzwwtttwtutwtuwtrml69((^(66oyngg6gd(ddd6666mGQRROOROKKGymmmmmgg66bd6mgbbbb1^111111111111111111c77eovoujfwIIDzulle3/]]/]]]/",
+"]//]]];;;]],//,//],,],/]]]/,>///2232222244424333c400cjFFvvuuAAIwAtuuvlAFJOQQRRQOJIIIIIIIIEEIIOJJEEIEDIQIIJEwturrllhlltte332333hhffffhjlruurrrhh9h99jjllgjjgj9gg66oynggg6d6666d66666mNRRQRRQKKKGvnmgg6gggggC6bb77^bb7711^1111111111177cjvyvFtuFwhflrtzrf3/]]]]]//",
+"/[///,,;;],],,]]/]],]]///,,,///23322222<<<4223ieecccjEAvvAyuFEEEwuurjlwJOORSRRRQOJJIIIJJEEDIIEJJEIDIIOJzztrllfffflluuzDre33e5lrrllffeeehe5eehlhhh999999b999996696vGymmm66666d8666666nyMRQQRROKKGymgggooggymbbbbb7bbbb77b7)11)1111177iovvuAJEJEle2[2fuwuf/]]]]]//",
+"[/]/];,]],>/>]],>,]]]///>/]>/[/e332<4222<<<[23hooi4fJwvuFAFAEEDElrrrrwIJQRQQOQQQQOOJOKEzEEIIJIJKOOJJIJttrjjhefhfjlruzEDIttwzwEzwrljfefe323335}115f9997711999999((6Cxmggoogg66666ddd6gqmGRRQQRRKOKymogggomGndbdbb7bbbb7^771111111^b9ovooeiAJIJwlh3<[[<rzl3///]///",
+"[]//]]]]],]]>,,,>],]/,//>/////3e242<<22<<<2233eruhjJEtAJFAKFEJAllrtAJJQRJOJJJJOOOQRRJJJEIEIIIEEJROEEJwurjfefhflrrrwEDJOOOOOOQJDrlffe3333::}}}~}}~11151117^^^^^^^^6nnqg6g66b6gg6gg66666gxmGQQRRROJKCvmmvmCCgqggkbbb^bbbb1b^1779gjgfecc4cefjAJAuofi53</]hzhe/////]",
+"[[[]];,,,,],>,],>>,,/]>/////23i3[<<222[2<2233eeefrEIIJJIEFKFJFjlrAKJQRJIIIJJJIJJRROJOQJJEJIIIIJJOJEIEuullhhhjtIurzJJOJIDIIIIOQzrle5f23::::!!}}|~}~)~))^~^^^^^^^^^byqd66gg666666g6ggg66nnnnCGQQQOOOJFCvyyNxqggggdbbbdbkbbggoooq9i70|:4444ijFErooiiec52<[rwhe2[[[/",
+"/[]]]]]],,,]>,,>>,,>>/////223e3<[[<2223222323333etIDIIIIIEKKJvuAJJQQJIIIIIIIIIOQFEJOOROOOJJJJJJEKOIJwuurrrrttzwEKJEIIDDDDDIJQthhf325c334|:}:}}}}~}~~=))=&&&&^1^^^gngb66666ggggg666g6ggmoxxnxyGQRRROJKKGGMynnoooymqgggomomomoogia000cicccioAFmojfjjcic[22utfe[//2",
+"2[//_/]]]>/>>/>>>>>]>_/<2242e32<2<2222333243542elEEzEIIEJJJOKKKJQQJIIIDIDIIIJKEEAFFJOROOQQQOJEEEOQJJwzuttwEzEJJJIDDIDDEEJOQArffh523:c3}:44}:|}|}~)~=====)&)&&&&&^6ngbbbd6d66666gggggggonnCHCHGCKRRRROOKQRGCyyyxCHCGGCvnxnddb77ccccc0c00ijAvuAvooqvvqqqieiAtmf343",
+"iccccc4424422<<<::<_|a44442352:2422233efe33e322fzEzAAIIIIIORRRRQJIIIIIEEIIJKAutwFEEJOQOQRRQQOKEKRRJDEzzIIIJOJDDDEDDIEEJEFwrffe3e333:}c3}||}|}!!!~)))==~==&&&&&&&^^kd^((dd(dd((68666666gggnxnnnyyCGQRSRQRSNQQNNQRRRNMMMLLLLCxxssssppppppxyAvvGGyyxqxCxxxoqvKAvoji",
+"jiiiccc0c4c0cc4000iiiiiiiijjiceccciiiiiojfffeefuIzDtwEJJJQQRSROJIIIIIIIJOKurlrutwJJIJJJOOQQOQQQRSRJIIDDIOJJIDIEDDDDEwrurlllfe35e222:43c4|}}|!:!~}~~~)===)&&&&)))^^dd^((((((((66666666d666dnssdnnnmCGRRSSSSSSSSSSSSSSSMRSSMnppppqpppppppxCGvoyyyyyyxxxCxqxvyFFAyo",
+"iii44444222444ac0a0a0ciicckc0ccciiiiqqooovyvyyAKJKJKJJKRSSSSSRQJJIIJJJJFAvmomvuwwEEIIJJFEJJOQRSSSRJIIJOOIIIIIDEzDzwwrrrlhhfe3333<:::::::}}::|!!!~~}~~~==))&&^&))^bdd(((((((((666((((((((666nnnnnnvvvAKRSSSSSRSRRSSSSRMRRRMCvoqkkki7cccikoooqqqoqqxxppqxCHCxGGyyo",
+"kkkiccc00000c44442444444ce44:440cciiiiiijooovFOQOOJJORRSSSSSSSSOOOOOQKAAAvvyvyttAJJJJIEEIEEJQSSSSRRQROIIIEzzzDDzzttrlrrlfe332[2<'<:2:!::}}::|!!!~}!~)~~~~)=^))&)^bdg(^^((((((((((((((bd6666gnxvvvvvvvyCNRSSSRRMSMMMMRRRRRSGyvxvvoqjjieeijfiiiiiiiikkpkoxyxxyNGAy",
+"occccc00iciic0044404444cc3442:4cc43cc4ciiiijjvKQOJQRSSRRRSSSSSSRRQRQKGGGGKNNKKKQQROOJJJJJIKRRRSSSSSSRQJIEDEEzEzzwrrlhfhhf33223[///':::!::}||:!!!!|!!~)~=&==&&)&)^bdg(((((((((((((((^(9999jjjovxvmmnxnnnxCCNSSSSRNGCGHNRRRRMyvvmnvvyvoojjfiii5eeiic00ccqxqqxCCNKG",
+"Gxicc40cc4404440404ccccic34000ci00ccccciccijoAJJRRRSSRRRSSSSSSSSROKKOOOOQQQQQQQRRQQRQQQQRRSSRRSSSQRRRRRQJEzwzwwturhfffefee32[3///<::4::22::::}!!!:!~~~)&))^111^^^^d(b((((((((((((((99jf999966gnnn888psnssBLSSSSSRQKFGvNRRRQCvooooqnvCCuvjiie77iii0cceiiiiiiipCGG",
+"CGoccckii000c424244c444cc0c0ciiqkkpkpqqxxxyGKRSSSSSSSRRRRSSSSSSSSRRRQRRQRRRSSSSSSSSSSSSSSSSSSSSSRJJORROQRQKFAwtwrlfeee5333e332[[2<<[:3}}}}:!}|!!!~))~~~)^^&&&))^&^b(^(((^(((^^^9999e9969b^^(((888d888pssBSLLLHGNRRRRQNQQRRQGmoooqqvvoCAAmifee7eiiceeeiiiiiiickyG",
+"GGyqicc04cicicc44444c40cikpppxxxxxCHCyxxqxCNSSSSSRRRRRRRRRSSSSSSSSRQQOOORRRRQQRRRSRSSSSSSSSSSSSSQOOJOQKOOQQQKAtwuhffe33233e332[[[<22/<:!}!:!}}}}1}5}1~)&=)&=)))^^(bbb9b6^(99b77b9^^71^(($$$$$$(8d8dd88dsLLLLHxpqvFKQRRQRSSRSNGxoijjvvmFKuoee7eiceicikqckiicic0iC",
+"yCKyoqc0424c4ccciickqxxxxxxppkkkppppqppxHNRSSSSSRRRRRRRRRQQSSSSSSSSSRQQOOOOOOOOOORSSSSSSSSSSSSSSROKFwuuvyGKKQQKFuffee3ee3ff2222[[</////<}}}}cc1~)))~)))))^1~~1111b99b979bb1(9b1^^($$$$$$$$$$$$$(888d(((dBLBBBCqpkimGKOOORSRRNNNGxoqqooFGuljeejecccciieikkiiiaiik",
+"vyyGGxqqi0iiciiijcpHMHxxqkkiiiiiikpqpxHNSSSSSSSSRRRRRQKKOOQRRRRSSSSSSSSRROQOOOOQRSSSSSSSSSSSSSSSQKAAjjfjfoovGKNRNCoohf3e3e32<:[2<22[33<:332:}}}~}}}~1}111}}}}7111b9b177b571^^($$$$$$&$$$$$$$$$$$(8888(((sBsBsBxqicciovFJORRRNFGCvvxvCAuAAojfiecceeieeeeciipppkii",
+"kyvyGGxxxqiicciiicHLHkckpqkqpkqqqxvyGRRSSSSSSSSSSRQKKJFKOJOOOORRSSSSSSSRRRRRRRRSSSSSSSSSSSSSSSSRKGuvofiiieeiovFKKNQNyjff35333333323::<::223333}4}}}55}55}}})~1))1biff551^&$$$$$$$$$$&$$$$$$$$$$$$(888((^dBssBsnokccc7cboAKQQRKFAvvvvyAvAyjomjccceiieeecckpppppki",
+"pxCCyyyyxxvoicieccCMCqkpiiikqqqvvGNRSSSSRRRSSSRQKJJFFKKKOORRRRQRSSSSSSSRRRQRSSSSSSSSSSRRSSSSSSSSyyvoofefeeeeifjumvGNRNyvjhf33333222<<22223e3feh3535}}}~1)==~!}~}7vo9^&$$$$$$$$$$$$$$&$$$$$$$$$$$$$(ddb111sspBBxxqicaccc17oyQQKJFFAvvyGAFGmvAi7eiieijiikxHBBBxxsp",
+"xpHGKGGCCHxxvqi33ciCMqxqqqqpkovHNSSSSRRRRRSRQOOKKFAJJJJJORSRRRRRSSSSSSRROQRSSSSSSSSSRRRRRRSSSSSNvvvvvoffhe3e5eheefjvCNNNCoi533e3532333323ehrjjje3[:!!=~~~!:|}5f576$$$$$$$$$$$$$$$$$&&$$$$$&$$$$$$$$(77b77pBsBBBxoo717711|7bmGKFAFFKGFKGFKCKAoiikoooooxHpc2247psB",
+"ixGNNNQQGCHCxqqic44cHLHyxxxvyNRSSSRRRRRROOQJJJJKJJFEJJJOQRRRRQRRSSSSSSSSSSSSSSSSSSSSRRRRRSSSSSRCoooooojiiefffjrjfff5fovGNMGyrofeeeeeff5333}jvqi<<///>'!!!}5f91)$=&$$$$$$$$$$$$$$$$$$&&&&$$$$$$$$$$$&^k7bbbBsBBsxyvo7c11|17ikxHgmyAFFKKFKKQKGCqqqqqjvHn02<22[2224",
+"2ccvKRRRNHGCCCxxqiiiiBMHyGNRSSSSSSRQOJFEJOQJIIJEFJJJJQOQRRRRSRRRRSSSSSSSSSSSSSSSSSSRSRRSSSSSSNRyfiefffffhjojjolifhhfe5eovGQRNGAmjhf333:[<<<:1oc<''>>//2551~&=$$$=$$$$$$$&$$$$$$$$$$&&&$$$$$$$$$$&&))&^kkb7dBBBsspyvo771117kbnNd7iomwJJJQRNKKCkkkjoHH7<//<<22//2/",
+"2222ivHRSRQKNNHHxCypiiMSSSSSSSSQKJJFAuAAJOOJIJJJJJJJOORSRSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRSRMMHRvfeeeffffhfijloojfijhheeefjvGHMRNoi54<:''''''!~c!**:235}_>>-&&&&=$&&&$$$$$$$$$$$$$$$$&$$$$$$$$&$$$=)==)^pdbbsBspskkyvq77771i7kNp77c7jtFJOROOJCojovNvc2<<__<<<2[//",
+"e3322floGNRRHCHMSMHHKNRSSSSSRJJFKKAvlolwORJJIJJJIJQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQNRSNNRGHGe35e5533e55fhmlvflvlofie52<2<cixHRHqc|::{!!!'--!::{***''@>>,_-=$=$&&$$$$$$$$$$$ $$$$$&&&$$$$&&$&&=&===-=^pbbdLspsp7kCvk71^17bbyC7i7ceooAKOOJJKAAGK94:4c4:_//[[/24",
+"ee3323jljvvoxHMSMMRSSSSSSSROOOGGGyoojjvJRROOJJOQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRNNyojv533333efe35ehjljfficccc4<<:<::!:ciCMMCq}:::!!!!!-{!{***-*++*+>>*-&$$$&$$$$$$$$$$$$$$$&&&&&&&&$&=====&===&(pddsLssxk7jyvkxd1^i7gH7kioojjmruNOJJKKyjic444444_/_///2",
+"c433c43jhfejjiiyMSSSSSSSSRSRNKQNyxvxvCKRSSOOQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNQGCvffov55efeeeff5ee33323c_<<<44_4_2::||::|cxHMHqc|!:|!!!!{:--***'***+>>>@.&&$$&$$$$$$$$$$&$$&&&&&&&&&&====&&===&&^pddLBssp77jyvCGb1i77Gkkiijfmuj7jvHxm97ccicc044c42_///4",
+"2e3444ciffhevoHRSRSRRSSSSSSSSSSMHHHHNORSSSRQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSMNCyAujiffjove5ef533<<2[[<][[<>____<44::::::::::{{|pxMHxb|~|!|!!!---*********+>,+-=$& $$$$$$$$$&$$&==&&&&)=&=&&&=&&==&&&bpdsLspxk7ioCKQm177iCgi7jooug777fj!|0440444ci000044223",
+"e2222243fjuGRSRQQQQOJFGHMMSSSSSSSSSSRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSQNCqfhjuffffjfij2<2<<<<[/<<[[/[[>@*>@>>/<__/_:_:4:__|:{|7nHMCq7~~~!!!~-!*'**-*{**'++>@*=$$$$$$$$&&&$&&=&&&=&&&&&&&&=&&&&&&&&1kpLBsspii7vGNKg77kyoiijvto}}75j5~{{:444::440icciqooe",
+"i33e323jyMSRQOOQOJJAwvjjjppxLMSSMLRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRKGvrjffhuhe5c3340c<<_/>__//<<<22<_*''*@@@>/_>>_____4_a____|~|pxMMxd1~~!~!!-!***---***'**+>*-&$$$$$&$&$&&=&===&=&&&&&&&&&&&&&&=&bksBBspkk7bCGQGbijmyiilwu7}11bj1'*{{'_:::<<4eiijjoyv",
+"voiffvMSRQOOQRROEEAwlic44cjoqqxMMSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRSSSRNGAlolfe3je<<<<<::|:{<__'''>>//,//>@'*>+@>'+>>@+++_*_____4aaa__||bsHMHqb~!!~~~!!*----*****+++>'-=$$$$$&&&&&=====&&&&&&=&&=&&&&&&)&bdBBBsbi779AQQvjojHjjwwe7111f9:''''/>>'_4<<24ciivyy",
+"vvyHMSROJJQRQJIIDFufc4|4443iovvoxyHRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOQQNGvljjfii423f[_<<<::|0|:{'!'''>/////@+++++.+>@@'>#@++@+'>'''_{_|_aa_|{1pCMMyd~!!-----!-------'-*+''''=$$$&&&&===&==&&&&&$&&&&&&$&&&=&^bsBLBpk777vKQKojgGjuE971}579e''___/_>_'>>_2223ifvv",
+"NMSRQOJORROIIIIEIAicc0004cecijvyCCGRSSSSSSSSSSSSSSSSSSRRRRRSSSSSSRRQKFArof35333442<f<_:<::{|||4!'***''>////++..@*@++@@+@>>@++@@'>++@+''____aa_aaabnHMHq1~!~=---~---=---.'**'>>*-=&&&=====&&$&&&&&&$&&&&$&&&=&&^bBBLxkk779AQRGjoGjFo}57}}555{*_///>_>_'>'__4i5efj",
+"SQOJORRROJDIIAwuuueic004ciiiiijvFKRSSSSSSSSSSSSSSSSSROOJJJJJIJJOJFAvjjjee3222222</e4_<{{:{{|!||!!**'''_>>/'*.+*@@++@@@@@+@@>>>@+@@@+++.*''{__{{|aaa7dxMNnb1}~)===-!~!{---**-**'__*===&&=&&$&&&&&&&&&&&&&&&&=&)&^dBLLpik7ivQRQvgFmm1}77}}5e}'''>>'_>>>'>>>/23eyHM",
+"OJORRQOIDIEurtlhejfcccciiiiiiifjmKSSSSSSSSSSSSSSSSRRQOOJOJIIIIIEwrheeie332<//<<_/2e_<'!:{{{|{~!'*'''''''_+.+.+.++++++@@>@@@@@@@@+++++.+...**+*{{{||aaabsHNyk1~)))=---!||1---*'**_/>'*==&=&&&&&&&&&&&&&=&&==&)~~^bnBMBkki7oKSRGoKr7|}e55555~*+>>*'_/>>>>//3fyMSRR",
+"SSSSSOIEErjojovjeeoeiiijjifiifijAQSSSSSSSSSSSRRRQJJJOOOOJIEJEwtrre323e24[///_//_/i<<':{:{!!~--~!*''!''<''.*....+.+@@@++'>@@@>@@>@++@+.+@++..++**{'{|||aa7pxNHob})=~=-~-~~|~----*'///<:*===&&&&$&&&&=&&&=&&)))~)))bxLSsiqiiyRSMvFf5|c7fe55e!'>''_>_/<[33fyMSSSRRR",
+"RQOOOSJtliec4covofjofiifjjjiqjouQSSSSSSSSSSSSROJIIIIIJIJJJAtvjjfe32/2322[/__////c<_'{!!!{{!!={!--'!!''<'*.-..++.++++++@@@@@@@@@>>>@.++.@++.+....**-~{{|{)a7knHNyk1~~~~!!-))~---*''':<<//'==&&&&&&=&=&&&==&&&)~)))^psLLpqkioQRSGGjc}:5jh557'>_''_'<<25oHSSRROOORR",
+"KIDIORAlj3e44c5oojovyojjiiijjoAKSSSSSRRRSRRROJJIIIIIIAwtwvooojef54/[<2[[///___/5c{'{:{!~!-{!-!!--{-'''**..*+..@+@@@@@+++@#++#@#@>@>+++++..++++.....***--{|||7kpxMCq7}~~~~~))-!!!*{!:'__/>_--&&&===&&&&=&)&&))~~)))1sBSspxqoGRRNye7}}7ff5e:>>'_<<25jHRSROOJOJOQRO",
+"zEIIIGeiiiicccefmvmmuyoqqfjjvAKSSSSRQOJJKQRQOJJIIIIIwurlfeeiiiif42//_</</_>___<3:<!!-!!!--~-!~~!!-*!!'*--++++++@+@@@+@@+++++@++@@+@@>@+..++..+.........**-{{{aa7dxHHxg1}~~~~~!~!:!!{'{''_''_{-=&&=&&&&====)=)~~~)~~bBLMpyvoyRSSv7i}cefh5h<''<<3fyMRRQOJOOJJOQOKE",
+"IIDEw32<<44eecccoAuvmvvovvvvAFQSSSROJJEFFJORQKJEEzttulfe52<3cecc42//<<//___'_<5:!{-~!-!~{---~~-*!-'!!'*.*.+@@+'+@+++@@@#@+++@@+@@@@@@>@+.++.++.+........-.---{{|1bksCHHmb71}}~~|:!!!!{{'''''__'*=&&=&=======~)~~~~~)xBSxxCvyRSSm7e}ifjhjh<<:5qHNRQOJOJJJJOQOEzwD",
+"zrffe/:<[<2<4cefoAtrjrAAuvAFJQSSROOOJFAFFJJJKQQKAuullhe32<2444c42___<<__<<''_3}{~!-*!------~!~!!!'!!--**'**++++@++++++++#@++@@+@#@##@@@@++..++.+..........=-.-=-{{|1bsxHHyok71}}}}~~!!!'!!'{'____*==&&===)))~~~)~~~-^HLMqCvyNSSC7f5efljl5}qHNQOQOJJJIIORQJEEwDDI",
+"3e33[/<<<[<<[<3ejoAAmovwuAEJOSSROJJJJJJFJJJAAFNRQAvjjf2</_<422222<_<:_<<<<{'2c:!!~--*------~~-~~!!!!--****'*+++''+++++@@@@@#@+##@@@+@@@>#@+.....+..+.......-.*=----~|1bsBHNGvoi771}}}~!!!{!-!'<___/*-&&===~~|~)=~)~~-nxSCyCoCSRMefeejurAyMQJOQOJIIIJOROJwrjruzzr",
+"222[<<<<<<[/[2ee5eoAAruAFEEJRSRQQOKKFJJJOOJFAuvCRRKof3<__<422<22<<<<:<<:|:_<3:{!!!:{**------~-~~!!!!!!!*'*'***+@'+++@@@@++@@+@@##@@+@@@#>>>@...+.++++...-....---==-==~)17pBMNGGv9757}}|!!!!!!!'**''_<'-==)))|!~=~~-!!)HLMCxqxSSM7oouEFNQOJQQJIIIJOQQJEtlhhrutth3",
+"2[2<<<<[<[[<3332323ltrlvEIJQSROJJJKOKJJJOKFKGyvGGGMMC4<:<<:<<<<2<<<:::<:{!<3<:!!!!-{{*-===--=~)~115}}}5:'.'*+@@.+.++@@@@@@#@#@@#@@@+++@+#@@>++...+@...+...-.-..==-*----=)17dBHMGGvmf7c13}~!!:!!{{**'''/<~~))~!!~~~-~~~dBSxxqvRSMfFFNRRQOQOIIIIOQOJIErh5hhlffhre2",
+"[32/<'<[//23ee333333rhfjtIOSROJJJJJFKOQQOKGGNKQKyyyRRxa||:<<<<_<<<:<<<<<:_3<'{{{-{:!-----~==~}77}}~!15!:'**+.++.+@@@@@@@+@+@+@+@#@#@@@@@@@@#>@....++.......-.--===---.--===~17sLMCvvuo917~}}}:!!''{-'''<_<~~--~~!{{{!~~HLBxxoMSRGSRRRRRJIIIJQKIIDzlfefef32233233",
+"/2[><'</<[3ffee3[[[/3rulwIROIIEEFEJKJKQQQQNNMNNNNNSSSRMsppk00|:<<<::::<{_32<:-{****-*-!-||}}~~})~||}}}!!''++.+@+@+@+#@@@+#@@@@@##@#@@@#@++@@>@+@.+.+.........------*------=--=~akBMCoomvje71}}::<:!{{''{'</_{~~!!{:::::bHSCKGRSSRSSSSSQRSSKEDJEwj53ee3<2<<<[2223",
+"[2/_'<'/[3f3ee3[222[3hwzIQQJIDwuuuttwEKFAAyGGNHNMMMMNQNkiiiki044::::::4:23<:::{{{{*-!{!~|0|}1~!!}||!!!*'''+@+++@#@+@@@@@%%##@##@+@@@+@#@#@@@+@+@@..+.............-==.----=------=)dBMHxqjmmof73}}:!:!<<:<<<_/_{!~!{:::4}HMNRSSSSSSSSSSMHyuEIEu9153}::2<!<<[2223[",
+"[<>/<</[2eff333[223ehfzIOQJIEtrutttwzzEuurjfeeeie5c}7ovece44||444:::::4<e<:::!!!!||}|!||||~!|!!|:!!!'!'*'>'++.+@@@@++@@@######@#@@+@##+@@@@++#@+@@+..++.......*-----.----=-=.--=-==)|sLLCofjjhhhe5}}|:::<<<//[[:{{{::45jGSSSSSSSSSRSQvjrzEzrj5e5::<:2:!'<<<<2233",
+"[//[[[/2e3e322[233ffllEORJIzwwrrrtzzzEwjwwre33eee33:<:3cec44|:<<4:::<<<5<<'''*!!~||~~~|||~~~~~!!!!!''!*+.++++++@+@++++@@@@##+#@#@@@@@@@@@@@++@+++@@@+++..+....-*-=.--=-=---=--=---==-)^pHMHnjbfjhffe3334:::<<[2244ceftFEJRSSSSSSSRJOAuzEwr9555}!:{<2<!'<<<<[2[[3",
+"3[[[[[[f33ee323335hjtEIOOIDwwwturttwEEujuEh333e3353:<:4:cec444<<_<:<<<5<<':!-{{!|~|||}|!:|||~!!!!*-'*'+*++++..+..++@@@@#@##@#@#@#@@@@+@@+++@@@@@@@@@++.+..+.....*-.*--*.---=----!}}~---=)dHMMxjbbeee5e5334444ciijjuAEJKRSSSSRSSSSOQJzztr95}5}~!!{<!'''<<<<<<2[33",
+"3[////ef23e52223ehhfKJOOIIztrtzzwutwzwrlErfe5eee355:4432:44c42<<<<::<32<::!||!~!|~!~~~~:!}7}--*----*'+++**@++++++@#@@@@@@####@#@%@@@#@@@@##@@#@#@>@@@@++......*....--.**....--!!~!|}~-----)dBMMyoi755555efeifjjvAKJJQRNKOGMSRSSSSQREul97}}}~=-!'!!-{{<'<<<[[[/23",
+"[////[f33e353333eeerOQQIwuDtrrDDtrutEzljhjmhfhfee553}4332444c3:<:::4c4<:{|c|||~!|}!!~~~!|}}|---***-''+.++++++++.+@@@@++@@@##%##%#%#@@#####@@@@@+@@##@@@@+**+*.****...**....**!!!-*!~!-----=-)(nMMCofjfeeeifjlAFKKFwEFFKJumHSSSSSSSKm91}}~~---!!!!--!!'<<</<2[/2h",
+"[////2f5effe32[2eefAQRJzrhtEtwzEwzEIIJreeijujhf75eeb7cc54444434:42454<4|||||!}}!!~!!!!!!!!!!-----.*''*...+++..+.@#@@++@@#@%@+@%##@##@@#@@+@@@++@@@##>@@@>+..+.******..*-..-*!!-!-*--!--**-----~bnLRGyoiifjrFJFFtAAFFJJwtwwySSSSSSRm1~~-==---'{!-----''''''<2[2eh",
+"2[2[[2fehf32[[2eefrIRQItlhhAJuwAJJEAEEGyxnqvNGoojjfiec3c444<::4343i4440}||}}|||!!!{!!!}!!!-!*-**-.*.*..+.+@+..@@###@@@#@@###@####%###@@@@#@#+@#@+@+#@@+@+@+.+++'**++*+.-*'''!!-*-***!***''{{!~!~~^nMRNGyGKFArmmAFEJEwutEzEJMSSSSSC~~====---'------'''''{'<<22335",
+"233333je332[[23eflEJSOItlouvFJEJEEEwwEJOvyoqvFAvfieiee5c444::::4ce4:2:}}}|:|~!!:!!~!!!!!''!-_'''+**++++@##@>%%;;;;;;;;];,,,,%%#%%%@@##@###@@@@+@@@@@@@++++>_+.*'**'''>>_/<<<'<'''''*'**-**{{{~!~~-~^xMSRQAutuAEFKJAuwAEEIIOSSSSSS)-===-==*'*=---**'''<':<<223333",
+"3e3422fje2ceiiijvJORROJwuAvolKJEFEEAtwIRyvofjoAumjiffecc2232::4e54c44:}|}4!!:}!!}}:!:''''*-'>****++++++++#>,;%;;;;%%;;%;;,],;;;;;;;;;;,,;,,#+@+.@@@+@++.++++''@'_<<<<:<<<<2<<<<'/__<<<___'_:<:::!|7orvCMSRKNKJJJJwrrttAwAJRRSSSSH===-----------'*'>'<<42<<225333",
+"yxppccoyyovoqjjjFJQROJIEtmlrAuGJAzEzAwEOOAmhjfgtulrojhfe534:ceoe44c44}4::::::||}3}:!*****--***-**..+*+@#,;%;;;%##%%%%%%%;%;;;;;;;;%;;;,%,;;],,,>>>,@@#++++@+''.+..-**-!'!!'!'!!!<<<::{<<<:<444cejuurommuNSSSSROJJFEAAFFJJQNGMSSSd-----------******'<:cca|0cijovC",
+"qki77cqjovofoovAJJSOJIIErlurhhlFEztAEEJJJOwjjjf9ttrtwwrojefoule33cc33:::::!::!}}!:!-'*-*-*-**.*...++@>,;;;%#%##%#@#%###%%##%%%%%%%#;%%%%%;;%%,,,,,],,,,>>>@>@'''++++++.******-***********-*!!:5jj9b5eijmuFQSSRQQQKEAEJJJQGyxMSSSi:'**--!---'--*'*-!7xCHBLSMMHHHC",
+"oiij7ivojottvruJJQQJIIIEutujefjjAJzzDIQJOOOAumjjjutwEAuvvvvjec5544}!!|:!!|!::}!!!-'!-****-.**+*+*.+>>>,%###@############%%#%%%%;%%#%%##%@#%%%#%@##,,%,,,,,<//<//'>@+*.+**''''****..**'--.*-!}}}}~~11119orwuyMSRRSSQKJJQNyyvxMSSM3332<<''*--***-~}bovoojjoGGCvvyy",
+"ooojffrjhjluwwEJOROIIIIIIzrljrlhltJIIONKFKJKug99b9bjomoji71|}}}~~~~!!!!!|}}}!~!~!'*!********..*..+@>>>@##,,###@#@###%##@#%%%##%%%%%%#%%##%%%%%%%%%%%%,,,,>>>>>///</<>''@>*''+''**+*''*---'<:|!~~~~^1bjojj9996yRRRSRQRRyvoHHMRSSM33333<'<<<<':}7jfjojfhjjoojyyvvv",
+"olfbe9ljlllruIOORRJIIIJJDzwttrujhhjvAvrrrAAKKmbbb^^b^^^^^~)~)}|~~~!!~!~}}}!!!!!!**'!-**-.*...++*+>>>@@@#@,####@####@#######%%#%%%#%%%%%@##%%###%%#%%,,#,>>>>>>>>>/]//////<:/>+'*+''+'!!!:::!!!~~~~19holf5559fbmHRRQNHHGxqoxCxSSMnoe3332:}}7ijojluttullrrjejoCvmu",
+"wwrllltrruuruEOOROJIIIIJztutulje5b5bbb966oovKNn(bd(bb^^^^)~~})~~)~~!~}~~}!:~!!!-*!*-***..*.*'+*>>@@@@@@@+@@#@#@@@+@###@#@######%;%%%%%#%%%%%%%%%%#%,%>@#,>>>>>>@#>>>,>,,>>>],>@'''--:::!!!!!!!~~~59fhh577eee579jCSSGmvvGHyCxxMSMCGAytwAAFEEEzwEEEEzwzzAwtllfvwAE",
+"wujj9jjejjffjEJOOIIJIIIOvjhfe557717bb66(dggqnCMn(8dd(^^^^11)~~~-=~~}~~~~~!!-!!-!--**+'**.*.-'@>>>+*@@@+++@+@##@@@#@@###@####%%%%%%#%#%%%#%#@#%%##%#%,#>,>,,>>,>>,#>>#,,;,>>],@*''*!:!<!~~!!:}~^1eehfe555efeeefjvynHSMyooyNMGCNSRCAAAEJIIEDEzEDIEwtwwDDwtutwuuEDI",
+"j91^&^22433elIIRJJIEFFJEuljhjjf9999966666dggnxMLdddb^^^171)))~~~~)~}~~~~---!------*-*'*.*'*'_'+@@@++*@@#+@++##@@#@#####@##@#%#%%%%%@%#%#%%#%,;%##%%%,##>,#>>>@@@>,>@,>,]]>>,,'''''!:!!!~!!~=}}7ifff77}55eefjvvvoijqCSNGGAGRSRSSSROJJEEEIIDEzzEEzwuturjrrrllhflut",
+"1~)&&^<<2455tEJQIArrrlrrutulojoruuuvrmmmmnCCLLLBd(^^1b71^^1)^~=)~1~~-~~~---------=---**..'-'*+++@+@+@@@@+@@@##@@@@%%###%##%%%###%%%#%#%%#%;%#%%##%#>,,,,,###>####,@>,,>;],]>>*'!''!!-!-!!!!~}55eee7}}5c}}5hoCv7ijojjnMRRKFFGRSSQQOJJEEztututrjfhhfh95555555}~bfh",
+"!&$$$&<':<<3zEJJEujjhjjhhhjuwumgggmmogggggpsss8d((bbb111711~^11~~))~=--~~-=---!----*+-.-'-**..+@@@+@@*+@@@@@@#@+@#####%%%##%##@#%%;%;%%%%;%%%#%#@,,>##>;#>>>#,,###>>,]]]]/>>'''''!!!!!!-!~!}c3e5571}3c}3eioo7bikiiiekjHRRKAvCNSROJJJEFzwtwwEtrhhfhe}4<::'''*=&c3",
+"$$$  &<':2<fEEQIEtrlhhfee5hgormAumggggogggpnddddd9ibbbb111^~}1^)))~=-=----------**-**''******-*+++@@@++.@+@@@@@@@#@##%%%%####%#%%#%%%#%%%;%%%#;%#,,##>####,###@##>@>>,,///'*{-'*-*'*!!!!-~}}c35}}:}533ceii5}|1iki7cejeioNRQFFFRNKJEtrurltwtrrrjhje2:<<::<</'&$^1",
+"$    &<'<23lIIOIztrjfffhff99jggggvvymgg6dgnnod66g999971(117}})))~~~!==--*--*-*{!**-***'**'**.*++.+@@++@+++++@@@@+@@@@@##%%@#%#@#%%%%%%%%%%%%#%,,,%%%#######,,,,###,,;,2f/****''''*-!!!!:}4}3555c}235ciicc|}}e1ccii7cjeiejGQRQuNNyAEAtuutrhfjhhhe::<'--!-!->*  $(",
+"$    &<<<23tDIQIzrjjffhhfh99googgggmnnxxnxnnggggoo9bb117^111~~))==~--------****!'--**-'*..**--...+@@@@++++@+++@###@@+##@%#%##%%;%###%##%%%%%%%,,%%%%,,%#%#@#,,,,@>,,,2h<>*'****---*'!!::|}:3}5}}}2244ce3}4cie5cccikivjiiekvKOKNSNAAEJJDtrrlrhhe32:'{!--=---&  $(",
+"$$$  &[/<2hzIIQIwrljhhjhffffgoooooggggqxxBBddgggoggbbbbb1^^^)~~=--!~-==-----.---*!!*****-**......++++@@@++@+@#@+###@+@####%###%;%%%%###%%%;;%%;###%##,,#,,##,##,,,,,25''@'''-'--'''<{:<<442334}444c4c4333c777cccc4cqvoiiiikyCAQSSNJJAEIzwwurf35322<'!-=-==-=   (",
+"$$   &2[23jDIIRDwrllhjhjjjjjoooooggoooqnBxnnxyvgg6dbbbbb11^))~~~-{----=-!----!!!*{!-*-****+.+...+++++++@++@@@@#@#@##@####%%##%%%;%;;%%%%%%%,,#;,%>#,########%%,,,,/2}>@'>''*****''<<<22433eeec3343fc3<:!|))1)))))}}7poiiiikxvFNSSSOJEAAAAtrljhf3322{!!!!-*'-   $",
+"$$   $4325lIIIRIztrrljjhljojjhjjogooovxCxoqovGmoj9bbbbb^^7^))))==--------=-!!!---'-{-*-*.***+..+...@+@++@@@@++#@@+#######%%#%#%%%%%%#%%;;%%,,%;%,,%;,>#%%;;,;,,>/[2++@+.**++.-***-!!:|:<<<</<':<<[<:!!!!~~|))))))~1^1pqkkkpoovNSSSROJFwuutturuheee3<<<'{''>*   $",
+"$    $:e23rIIIQIEturrlllloggjjmojjooqoxCggggjoqii9b1111^^11)))))==--**--~|~~!{**{***'*-**.*.+....+.++++++@@#++#@++@####%##%###%%%%%#%#,;;%%;%,%####%,##%#,%,>,,/2:@++++.++++*-''--!!<:::!-!~}7|~!---))))))))))))~~}}1bxppnxokgMSSRQOJJJEzEzwzulhfe522<<!<_>*   $",
+"(     <h5ftIIIRJIEtrtutrrmmmojjooovonxHqgoo69bbb9bk711}^^1^)&)))==----!~--********-*******'*....++++@@+@++@##@####@%%%%%%;%%%##%#####%%#%%%#%#%#####@@#%##,,>>/2'@+@#@@++@@>'!-'':!!!!~}}1~~--=-===&&&))&)))))~~~)}~}cqxxyxqqqCMSSROJEEEDEEztwturjhee2<</>,*    ",
+"(     'eljuIIIOOIEztruuuurmmmogomonnxHx9jj996ljgjf7c111111)}~)~)-===)|---****-...*--..-.''***.+.++++@,@@@+#@@#@>####%#%###%%%%%%%#%%##%%######,%##@#@>####>,><:'+@@+@+#++@>_''''{'*-~c7~=--==&===&==&&&)==))))))))))11bxyxxdgdBMMSSRROJEEzDEEwuuurljf32[<[[!    ",
+"$     ~etEDIIIORJDzEtuuttuuvmoommxyyHHki77ijoug9ieb1111711~))=)=-~-~~=-***--**..-.*.+....-.'*..++++++@#@@+@++#@@@@@######%%%;%%%;%%%##%##%#######@####,%#>>/['@@@@+@@++++@>>/_''{*~71~----=-==&=&====)=&&&)))~))^))1c77dxMxpqnLLHQRQQQROJDDztwrrrrtuuhh3233!    ",
+"$     ~elwzDIIJOOIIDEwwwwwAuvmmmmmxnxpb7e7efeibbie777111|c}~~~~)-~!~~-=-----**'***.**.*....-'*-*++++.+@@@++++@@>@@@#@@#%%%%%;#%#;%%%%#%##%###@#######,,,>><<@@+++@@@@+++@@++_'''*{k|--{---=--====&)))&))~~))~~~~)~)1c17kqNHxqnMMGKOQOOJJOOOJEwtrrlhlrulh332{    ",
+"$     *hjwDIIIIJQOIIDzzwwwwAAAAGKNMLHdbbbbbee71771771111|}1|~~~~~~~)~~~-***--.*.**.*.-.......+*'@++++@+@@+++@+@#@@#@##%###%%%%%%;###%%%,#%####@#####>,>>>::++@+@+++@#+@+#@++_'{{-{p~{{---==^^(^^11777bb999bc<::||~|1117kpGKynnLMHGFKJJJIIIIIDEIFwtuljhurh22|    ",
+"$     =hutDIIIIJJROIIJEEEFAAAFKQQRSSxgd66bb17cc5}c1c}1}~}}~~c}|||!|~~~{-{---****'*.........*++.....@+@@#@@+@+@@@@+@@@#%###%#@%#%%#%%%%%,#%#@,#>,%@>,>>'</@++++@++++@+++++++.+'{{*-ds1~||a0ciiqqojjijmrjihe34223<2404|17bkgKNyxHNyCGFEJDDDIIDIzwtwwtAwwuwEfrm    ",
+"$     =5zwEIJJJJQJRQJIOJIJJFFKGKGMSMng69ddbb^^1~||4c||}~)}}|11}1::|~~!!!!!{*********.**.......+.++..+@++#@+@@+++@@@@@###,#%#@##%%%%%%,#,%,%,#@##,#>>>><<+@@++@+@@@+++.+..+.+..*''{{bxxk|~~~~}1cciiiic5c77c433<42444000cii7mGHxMNHyAKEJEIDIEDDEEttutttzDDJFt}    ",
+"      'uJIIIJJJOOQJORJIIIEJJKKKNNRSHqoggb(bbbb^)1|||{:::|~~~}~}|:::::::'*{{{'{'*''''*+.*+++++....+.+@@+.@#@++++@>@@######%%#%#%%%%##%##%%%,,,>#>@%>></@@@+++@##@+@@+++++++@..+@+*'{{7xGmg1)~1cc0444c0ccc0c}c50ccciii0cikk7bvNMMMHGGFKJJJIIIIIIDEDzwzzEDDIJw!    ",
+"     $qJJIIIIJIJIJOJJRQJEEEJKKONNMSxqqddb(bbbb1^^))~~{:{<'{!!!|||:::<<:{{{{'''''>'*'''*''+'*++.+++++@+++@##@@@@#>@#%##%%#%######%%%%;,,;;,%,,,,#;,>,@@@@@#@++@+@+#@+@@@++.++++@@.+'::1oFyAuoi5}422<::|0c|44cccccce7iiikkieijCSSSNQNQQQOJJIIIIIIEEzzwAzzEEwr!   $",
+"$    $GuuIEwEDIIIIIOOIOQRKJJFKKQMSSnpdd(^(((((^^&&===-~~:'!::'!!::::::{!{:':{'''*''''''''+*+>@**.*+*+++++@@##@##>@#%##%##,#%####%%#%%%,,,,,##,#>,/>@+@@@@@@.+@++.+#@@@+@++++++++.+.*|55jAEAAuvvjje}|::!~||||~)}1}111177a|cc7xSSSSRQQOJKJIIIDEztrljlhrrrrruf!   $",
+"$$   8AleAwttwEIIIIIJOOIJQRQOKKGMMLss8(((^(((^(^&&&====~~{-'*''!<'{<':!!''~:{'{{{''_''''''''+'''@++++>+@@@#%;,,#,,%%###%%%@%%##%%#%%%%%,##%,>,,//,,@@++###@++++.+@@++++@@..+.++.+...*}57hwtrrolmuvvvmoogg6b1)}~))^^)^^1((8nxHSSSNQKKFEEEIEDEEtwtrllhfeefhj3'  $&",
+"$$   8j33lJzzwAIEIIIJIJOOOJORRNNMLSB8((((^^(&&&$&&&&&&&====*-*'_<_'_<<<<'''///___**'''***'''''+''>>>>@@@##,#;%;%,>%;%%%%##%,#%%%%#%%%%%%#%%,,/,##%,%#@+#@@@+++.+@@++..+++++.....++****!}5frwrjffjfjoooovomomvmmomvyyHMMSSMLMSSSSSNKGEFFEzDDEEurrjrhjhffhef3'$$$&",
+"^$$  &3342FEEIEEEwzEIIIIJOQRQKRSSSSB8(((^)&&$&&&&&&&&=&&&===---'{''_>>//'__'''_<<<<<//<<<<<<<<<':_>>>>##,###,%%,>,%%#%##@##%@%%%;%#%#,%%%,>],#%#####,@@@@+@+@+..+@++++.++......*.***-!!~|35julfhfee5}55ee9bibqooyGKQNQOKyxnxLSSSSRNFAttAzwwttrljjlfehfeeee['$$&=",
+"1&$$ &_:24eAwwEEzAurwIIIIIJJKQRSSSSB8((($^&&&&&$&&&&&&=&&===-==---*+'''>>>,>/_>'''''{!::<////]//]/<42<///>>>,#,#,,,##########%;;%#%%,,#,,],##%%#######@@@#%#@@++.+@+.+............**-!~!::::eree5e533c57c17iqnvvAAAFKyogoooyLSSSSSSNGuwwAwAtrljhhjfeeeffe3/'$$&=",
+"1(&$$&_{!:4uwuztjjruAEEIJIJFFFKNSSSB88(((^^&&&)&&&&&&&=&=======-=---***'@>>>>>>_>></_<<<_____///_]>__2//>,],,,>,,],###%%%#%%#%%%%,,,,>/>>@######%#@#@@#@#@@##@@++++.+.........-*****{!!~:</<<3hf35e55efjiiiikjoyuoqikbbbbggCMSSSSSSSRKtuuuuuurjjffe5ee53322'$$==",
+"1^$$$&{!-~)1AzElffhgmmEIJJEFFKNMSSSBd8d((^(^^^&&)&&&&&&========-==---*.*'++@@>>>>>_>>>///____<_'<____<2</,],,]],,];#%%,,%%%,#%,;,,]/>@#%####%%%%######@#%@#@#@+##++.+++....-..*'****!!!!:_/>/_:jjjfjfjfjjoovvqkccc7bpdbbbd6nLMMSNQSSRRQuuururjjff55353332[[{$$&=",
+"))$$$$!!--=-9twlhf9jorAEJJJKQNSSSSSB8((((^^^(^&==========-=-===-==.****.*+.*+@>,,,>//>/>'>/'''__<____/_<3<,,,,,,]],,,,%;,##,#,,],>#%####%###%@%#%#%%@###%#@##@+@@@@++++.++.+*******'!!!|<<<444c3fvjvuruvjfc0|||}117bb1^1((8nHxLRNKKRROOKFrlll999e5cc34322[[:&$$=",
+"=)&$$$!---===9lfeefjjuzEEEFKKGGNSSSB8(((^^^^(^))&==--=-=-----=-=-=-*****'.++>''>>>]]]/////////</___<<<//[32/>,>,,],,],,;%,,,,>,#%%%##%%###########@#@@###@@##@@@+##.@++++++****''*{|}cc7c443eei3ehjlhf322<<||)|~~|77)1)^(((snnCMGGKJQRJIJErgo99fe5}}4322<<<|&&&=",
+"=&&$$$~=----==9e55b99rtuuuAFAGQMSSSB8(((^^^^^^^^&&=-----=---=-==-----**''++'>'{'__,]///////_<<//////<<<[</232/],]],/],,,,,,,#%%%######%##%%%%###@####@###@++@@+++>+.+++'+*'*'**!:|7iffeee23322//<':[23242<<4|~||||71)1^^(((d66nxxyFJJOOJIIIur99555c44<<<<</|&&=-",
+"&&$$$$=-====&&&}35179ruuumuuuyGRSSSB88(((^^^(^(&&&&=====--------*-*-'*'''*'>''//_'_/]///]//<<///////>///[//[[2[//,,]]]//],;%%%%%%##;;%;;%%%%####@@@@#@#@@@@@#@+++@+.++'''''!|15eccei33222[///>*-==-!</[2222<30|}||a~~)1(8xsdddxnnvuAJJOOIIIJwo9b57c32<:::_/:&&&~",
+")=&$$$=-==&=&=&&}}15bjlrmmuvmmyRSSSBs8((((^^^)^^&&)=&==--*'_'_**{'****'''''__///_'__////[2/////]>,>/>,,,///<[[[22//]]]];;;;;;%;;;;;;;%%%%###%###@+@%%%@@+@@#@+++@+*'''':|}c7e7}}2<22<[<///>>>-==&===!<<<24<444|17c})~)b(dsnddnHxmommvFJQQJIIEu9be5c442<::</:&&&)",
+")=&$$$&-=&==&&&&=~}1bjoogmmmmmyNHMSLs8(((((^&^^^&&&&&-'___>__'**--{'__>__'___>_'___/[/2232[//>>>,>>,,,,,,,/<2[[</[[]];;;;;;;;;;;;%%#%#%%%%#%####@#@@###@@++@@+.+''''::4cccc42<<'<<[2[///_'*'.==&&==&=-<[[<244c}ci7~~~)^kdpqqxHHyyvyCvvwFQRKEEEu711}:::'''_/:&)){",
+"~=&&&&$~==&&&=&&&&=~bh9ggogommGCyHSSL88(((^(^^((()&)<//'''''{'!{'-*'''''''____>'//2222ejc///>>>>>>>>>,,,,,,]2ce[];;;]]]];];;;];;;;%%%%%##%%###%@@##@@@###@@+@++'::{|44432::<<////<[[<<'{*-{*-=&&=&&&&=-:<_<22ecei:|~)^^1^^(dmNGymvvvAAyuFQOQEEwm71}|:::{_//:)|~|",
+"{|)^^&$&-=&&&&$&&&$&79996gggomyyxBLLSL8(((^(^^^&(^&~'_{''!~--!!!{{'*'''''{<''':<<2[23f22[//''_>@>_>>>>,,>,,]/[<[]/];;;;;][];;;;;;;;;%%;%%##%%#####%#@#@@@@@++>>{|044|:!:'<<'/////<<<:'{-{!{**-==&&==&&==!<<<4ceje:||~)^)^^^(nCvCAvvvmrrmmEJOQzwto71c||::://_=~&{",
+"-=&&$$$&==&&&&$$$$$&1999bb96gmvnnxLBLLLn((((^^^&^^)~|:!!!~~{!~{!'''_<''':{'<<<<_<232<<<<_</____>__>>/>>,>>>/>,]][//;];;;;;;/]]];;;;;;;;;;%%%##@%##@##@@@#@>>'':<44:::<:<<'//]]/<::::!!{-=---==&&&=&&&&&&&~:::5ji4<:!!~)))&^(pdgovwFwulllrrDJJKwtAoq77c00042:====",
+"===&&&&&=-&&$$$$$$$$^996bbbdggoggsBBBBLLB8(^^^^&&&))~!|!~~-{{!{{!:{_''{:<<<<<<<<<_[<<<<<<<<_<___//__//>>>>]>,%,]]]/]]]];;;;;;;;]]]];;;;;;;;;%%%##@@####@+>____<<4:<:<<<<///]>>'!~::!!'-==-{====&=&&$&&&&$&)|4ii4<<<:!~|~))^dd((66muEEAurrrzIIJFtAAb7cc7eecc|=&=~",
+"~~=&&&&&&==&)^(^$$&$(9966bbbdgogddssBBBBBxpd(^)^))~)~~!~)~~!!!!~!!!{'<<<_<:<<<<::_<<__<<:'{___'__//_/>_/_>,,,,%,,,]]];]]]];;;;;;;;;]]]]];;;;;;;%%#####@>___/<<<<<:<<<<///]/>_'!!|:!!!!~~~{!~~====&=&&&&&&&(^bq::3<<:!|!~~~1bb^(bbb9outwwttwIIIKwuwh7}c55c5ec1c|~",
+"c111^&&$$&)&)((&^^(((g666bbbbqnngssssssBsBspkb^^)~~)~~~~~=~~~!!!!|4:::!{__24c7<<<2<:'{::'_'''<<'''____>>>,,,],,>,;;]]];;;;;;;;;;;;;;;;;;]]]]];];;%;%;@____<'<//<2<<////,>>>''!!!}}}::|!~~!!!)=&&===&&&=&&&(8d):<<<<<:|}!~177b^^^^71b9lruljlEDIIGutr53535333~~11c",
+"c1777b1^&&)=)&(&$&$$(mvmggbbbqoqpnsssssssssspkb11)))))~~~~~~|!||}||!:::c333ci00:::<::':{:'{{:_'*{'___+>++@@@,,/,///,]]]];;;;;;;;;];]]];;;;];/]//]]]]]2<_/_<<<<<<<<[////>>>*''!!:}:::!|!!!:~~))=====&=&&&&(d8$))!<<2<<!~|17c11171111755jrrlrrrtzFrrtuf53333:}1117",
+"~~))))^^^^1)^&^($$&$$6m6gggdbqoqqnssssssBBpppdkbb11)))~)~~~||||||}4:<<42<<:4||:|:::::<::{::{:{'::'_>>@@+.@+@@@>>>>//[32[/]];;;;;;;;;]]]]]]]]];]]]//3c332[[[<<<<</[///>>>'>*'*':}:::!!|:!~{~~))~===&=&&&$(8($&&$$~<<222!|771771111177775jlrlrutuEo5fjuljjhf}~~)~~",
+"~}~)~))&&^^111^(^^$$&(gg66666gggpsxsppppsssdkkbdbb7^1))}:|~}10}||c00::::<4::::||{:{:::{{{:''{::{'+'+++@+.@++@@@@#>@@@>>]//[3]//;;;;;;;;;];]]//[///[223233fe3222[//[</_<@'*'''<<:::|~!|::|~~~~))))==&$&(8n(&&=&&&=~:<<2:ccc111111111177577hhjlrutu5532<35}:!!~~~!",
+"}}~~~))&&&(^^^^^^^((&$66gg66(6gdbsxspppdpsssddkdb77b7cccc7oCyxc||0||:<||:<:<:{!!!||:{:{{!{:::_'-***+'+++.++++++@@@##%#%%;;;;;;;;;;;;;;;;;;;;]]//[2e533233333eee32222/_/_'>@''<<<''::!:!:!|!~~~~))|1117kd$$&&==&&&&=!:<i401111111111111715eehlluwFf332<</>**!~~~}",
+"}}}})=)=&&&$&))^^^(($$(6ggg666g6bxxppddppdsspddpkciccc7e7eoi7gkcc||!|:||{<<{:::|{:{!{:::{:::{''**'*+++++.++@@+++#@##@###;;;;;;;;;%;;%;;;;;;]]]]/[322233effhhfe3efffjf332<'>'_<:_'''':<{<:!|!!|~~~)1^77^&&&===&&=&&&&)c044|1111171111}}51155hhlutFf333[//'*----!!",
+"!!~~~~~)&=&&$&))^^((^^(666gg69ogbxpppppddppdpdkkpqii7ecc7bi77cp7c||||::{'::::{:{!|{!!:!|||***''****''.+.+@+++.+@@@@###@#%%%;;%;;;;;;;%%;;;;;]/[/[3[[233ellhfllhe3e3fhjhjff3[<<<''''{!:<<::|!!||~~)171&=--&===&&&&$$(b^14440|c111115}}}}5155efhlwFfe32<</**-*-'!!",
+"!!~~=~==))=&&&^&)&&&&$(doggooggo6npppdpdddppdpqkkqpii7c77ii7ccpk71~~!:!|{::::::::|!!!::|--*''*-*'''''++++++++++#+@@@##%%%#%%;%%;;;;;;;%;;%;,]/]232333eeff3ffeeffffhjfffeemuuff2:''{!{::24:::!|||)}c)=--===-==&&=&&^b^^^}43c}15111}1}}}}}}}5efhlArfff3[<'**'**'!!",
+"!:~~!-===&=&^&^&&)))&&)1jvvoooooggnpppddpdpppkikkpkkkkieikj777k7iccc|:||!::::|:::~{!{{*{**'**{'{*''_+@++.++++.@@@@@###%%###%%;%;;;;%;;;;;;],]<23feefeef32[33e3e3e3effhllhflurhhhf53|::::<:{:||:cc1)---------===))1b777777ehjffee555}}55}5}3ejllEl33533<@'*''*-{!",
+"!!~~!======&)^)))~))~}}}1jmmvmgoognndddddddppp7ikkkkpkiiiik77pki7cc0c|:|~||:||::{|!!**'*!-{{'{{{''{'>@.++@@++++@@@@###%%#@%%%%%;;;;%%%%;][[23hfllff33ee333[2223333e3333fhjuumrhf9hljfe7}|4:|||0c}-!---=----!~|77c7ii7711115fffee55555fe5c:5hlhrEf32232[<'''**!!!",
+"!!!!!~~~}!~~115f9jghe}}})1omvmvmmmnngdddddkpppb7kkbiikkkbkkbbopki777c|||||4::~|!~!~!<'{-!{--{'{{{{a''@@+@@+@+@@+@@@#%######%#%;;;;%%;;,3hrrlrljhe3333e333322[[2223e52333eiiffjuujfefhooof75}|0c~!!------!--|43cccc7b51bb17bejtulh555eeec3ellllzA33332[/<_''**!!!",
+"'-!!!!!:}:}55e5he1111))^&&(grmmmvynnngqppdppppbikikikkkdddkbbxqdbbb777ac0||::|~~{{{</:{!*-*!{{***{!*>@++@@@++@++@@####@###%;%%%%%%%,>}rrffhhhhllff333332[2232[[[[23332422ffeceeovojffiifjooof7|!!!!-----!::3cccc3c7fiibbbb9jjuzurllljfe5fhllllzlefh32[[<_''-**'<",
+"'<!!:!::::}~~}117~)))^^^^&$(gmvmmxCnnnn8gqqpqqkikiibbbddddqgpojbbbb777777aa0:{{{{:<_<-!!*{{{!{-{'{-'**.++@+++@@++#@@@#######%%%%;,:efhfffeeee3reeeee322///[[/[[2[23322223ffiec3ifoofi5ifffoooje5}!!-!--!:44ce53c}}59jlmjj99hjruulhrrulrtrlrrlrFhhrf33222<<'!--''",
+"<<[:::!!!!!~)~)^1~1)))&&&($$(jmvmmxnnnnnnqooqxqkkibbbkddpdpqqgkbbbb7777777a0||:{{<<<{--{--{{!!!-*'*****..+++@@@++#@@@@#@#@@#%#%%<fefrfe353333rh22233333[//[//[//[23333223eefjcccceiijieiioj7755ffe51)~!43333555555hjjj9771^75bbehlhhfhrlltzwwwArre3233322[<{!:<<",
+"2[[::::!!~!~)))~~^^^&)&&&$$&^^jvvmvmnnvmmvovvxopk7bbkpddqgddqqkbb7bb7b771|||0a00|'::--!*---*{{--*****''-+..+@@@.+#@@#@#@####@#<333fuh5333323hl[2[[2222222[[//////<2232233343efeic3ciiqqjjic}}}5c5bff9fe5335e}5575eff5f111111}115fhjhlrlhlrttwJDEle5533333<[:5323",
+"233::::::!}~~~~~~)))^))^&&&=&(9muvyvooxyxvmomoxpbbikkdddgdgqggdkdbbb77111})||0cca0|~--!{{{{!!-**-*-***'*...++++++#@#@##@##%#@3322lrf3232333ee3/2223323322[322[[/[<2[22253e4245iicccciooojc4||~}}}7eeomomf553c5555e5}5e9511}~~}7fe5htlhruzzEtrIwhffeeeeee5323hf33",
+"f3334:::!!!!~~)~~~)=))))&)=)=&&^vACuvvvCvxxvvvvqpkbkddddddgogdd8dpkb1771101}|ac|0cc1)=-~!{{-------**---**+++++@@++@@###@#@#<333euue3222233ee3[//[[[]]/[2[2[/[/[//<2<223iee443ccejc0ciji0eic0:||||}efhjjjArje5555551~}bj551}55hjhflrrrlrwIDDEJEfeefffhrflf33233ff",
+"ee32}::!!<!!-!~~!!~)~=)))&=))&)&(KNCAwvvyyxvvyxxqpkddddgddgogddbbdd7b711cc11cc|||caa|a~~~~--*-**---**--*...+@+++#@@+######3323htl3333[2[[2[3///[[///]//][[[//////2<<_/222ec4443iiooiiccccicc|}||c5eeeiiorvvulh555!~)~1hhfeeejhjrwtrlrwzEDtrDJuruullhfhlhhfeee33e",
+"33323}:::!!!!!!!}~)~))))))))))))^yNQOFAvovyxxHCvxngpdddddggogbbbbbbbb7777cccc111cc)||aaa~==-=-*.*-***'''+..++@@@+@@@@@#%<323elrl33[///2/[22[////]//]]//////////<<2<<<<22<2e4:244cijoc44c0i000000eiii5ihjfhmlotAj~::!}}hhfefjhjtAAtrutuzDwwEwthffhlllhlheflhfe333",
+"3323:}3:}:}::|}~~~~~))~~)^^~~~~~^xCGQOJFumxHyyCCyxoggkpd6dgojkbbdbbbbb77777c111c71|||||||~--=--=--*-***'*++.+@@@+++@++@}223hule[/]/]]/][2[[]]][/]]]]/,]],/[[////<<<2<23222344400cc44cicc440c00ciiiiefhjfjhffjmjffi}}}:frffrrrwzttwtrrwzzzErAlfe5333fhlljhhhhjfe3",
+"323:::335}3}::}}}~~~)1~~~~}}~}~~}vGvvFQKAAvyGyyCCymogbdggdoojb6dbbbbbbb7b77111c71|||1)~||~{==-=------***'*++@@@++++.@>332flrh32/]];]],/[/2]]/]]],,]],,],////////[<2<<33322244ccc|:<440eicacciciieiifjoloffifjec57iff53erlruzzttwwrrrtzzztuuAlffee333efhjrllffhff",
+"fee2233333535c3}}~}}}}}}}}|}!}}}}vyogguQQJEAAGCCGGynggggggoo9bggbbbbbb77bb^1117b|}1|~~)~~|~{~~=----------'+>'>@@@@+@'fffrwlh3333[///////[]];]]]]]]]],,],/>,>////<2<[2343434ei7}||:|4400cpkic7kjiicefoouyvmfje4435efjoohtEzDztwwuurruzEwrruErhfeffeeffhffhlhllrff",
+"fhhffffe53533}3}}}}}}33}}}::::}11nxgd86mFQJEEGNGGFGCmngggmoogkggggdddb177bb117qb1))~~~)~~~|||~~~=------*''*''/@+#>>3llrwtlfe3222[[233333[//]]]]/]],]>,/]////>///<:<<34:4433fjc4!|{::|00ackqkiceiiijvoojh5ej544333eihjvAJIIEDzuurtuzIEtlrlrAlfhfeeffhllheeehfflll",
+"rrrllhlff5ee53355333333}:::}}1^^^dxqdddd6uKOJFGQGFKGCynoqmogqggggdddbbb7^b777qb11)))~)|~||)||||)~~=--!---'*-'>.@/[errrulfee322[///223233[22[[///]/],,,/>/>>////>/_<234:444ei544|{:{|||0acccjojiiijvvvojffj54:433eieelAJJJJDwuruttzIEtllhhArhffffhhhhllhhlhffhlll",
+"wtturllhlhef55e5ee5e5333}}}1^^(^$dxn6g6dd6mFOJEFOKKOFGvmmmoggdgggg66ddbb^bb7bg^^1^1111)}}||}||c1||~--=-!!:-<<@><[3rruhhf3e3[//];;]]/[/[[/]]]////[[[////>]//__/>////32:::43343<4||||00||acceijovoovvAujhjle4343eeffhrEIIJJJJzttutzEufflhflwhlrrrututttzrlllrrtwzz",
+"DDztwurrrlljhhjhf55ffe55551^1^^^^gxqg666g866uKOJKOOKOKGyCvgogg6gggggdddbbb7bgb1b71^11c111}111}17c1c}~~~~!<<_/</[3zwlffffe2]]]//;]]]]]/]]/[]];],,/]/[//[[///_>>>///222<4334444344||||||1acciiffovAAFAAvvvf335eeefjrzIIIIIIIJJEwtEwlhfrzwzKIDDDIIDDzDDDIDzEDDDDDII",
+"Dzwtwrrrrrhrlhhhffef55511999^^^^(gxgddd666666mFKOQQOOQOFGymgogogng6gg6dbdbbgg^^11111111111)111111cc11}~~!:_2i2<[wzrlhhee2/]]/;]]]]]]]]]]]]]]]]]]/,,,],/]////[/>//[2223334<4:44440|0||||00cijjoouAEJEFAFvofhfifhlzIJJJJJJIIIJJEArltFKQOOOROJIIIIIIIIIIIIIIIIIIIII",
+"OOOJJJJJIDDDwtwtrrhff999999^^((^(gnddd(66d66666mFORQOOOQKFGvmmngogogggddbdgv^^1111^111111111111a}1777c11}}cjl33wwtlfef3e[]]/]];]]]]]/]]];;;,]]]]]],]/]],,>>>]/[/[3334:4::::440400||||||7ivCKHCKOQQJJJJJFKFAAwwFJOOJJQQJJIIEwEEAFJIIIIIIOIIIOOQRSSRRSSSSSRRQOOOOQ",
+"AIDDIDDDwEwAFEzAzwuuurlgg69(^^(66mxq6666dd66d6666uKRRQOQROKGCmnmmmgg66bbb6ggbb^1111111111111}1)11111c7c7oojrhfwIIzwlhh32/]]]];]/]]][]]];;;,]]/]]]],]]]]//,>>>////3eee4<:<<442cccc|||00coGGuvrrwJJFtwAFFFKJKJJOOQOJJJJOJIDEEEEJROIIIIIIJOJOJQRQOKFEAwttthlhehhttA",
+"3effrutwttlrrjh9h9jllrrmojj9g966gmyggg66(d66666666gGRRQQRROKKGymmogg6g66ggydbb77^b111^1^111111111177ccjvvvFtrAAlrwtwtle2]]]/]]/]]]//]]];,]],]/,/],],],]]/,/,>///<223222224422333c400c7vKuvvAAwEzAwutrvuFJJOQRRROJJJIIJIIIJEIIOOJIEIDIIOJJJJEzwttrllhltue333333hh",
+"hlfeeefh5hfhllh9h999999999996669gvGvmmg66666dd666666yNRRQRRQKKKymngggogggymbbbbbbb^b7777111111111117iovyyAJEJAh32[5lwrr3/]]]]/////[]]];;;]]],,,,//,,,,///]>,>//[3232222<<24223eeeccceyFuvuAuAEEzwtrrlouFJORRSRRQOJIIIJIJEEEIIJJJJEIEIJOEEwullhfhfjhrrwEr33333fll",
+"ljhfefe33333515b9f9995777999999(6gCmmmoog66668668dddqnCNRRQRRQKOGmgggggomG6bbbbb7bbbb1b77111^111bbiovoofjFJJJwje2/[[ewth2/]]]///////];,]],>]>]]],]]]]]//>/]/>//333222222<<<2[3fjji35AEurwAFAFEIEurtuluEJORRRRQQQQOOJJOEEEEIIJIJJOJJJIJztullhhfhfhjrrtEDIrlrurwzw",
+"lffe5333::}}}}}}1117b5111b^^^^^^(6xngg6g669gg66666d66gnyCNRQRRRKKGvmmmxmCyggggbbbbbbbb11b1177b69qfi7e4eefrEJAroje32[]3ttf2////]][/]/]]]]],]]>]],>],]////>>////2e442<<22<:<<[23eluhitJttFEAFAFJEulrutFJJQQOOJJOOQOORROJEEEEIIIDEJQOJEEEuulhffhfhlrrtzEIJJOOOOOJIt",
+"heee34::::!!}}}}}))~~)1^1^^^^(^^(6ygdgggg666666ggggg66nnnxGQQQQOOJKCvmyyMnqggqgbbbdbbb7bbdgggjji7c|:4433flKFrvoiie33[[5zrf3[/[/]/[[]],],,],,>>],>>,,//>//>//[2ee2<<222<2<22333eejlwJIEKJJFKFJJvoluFJOQOJIIJJJJJJORQOOQJJJEIIIIJJQJEEJtujlhfhhrEwruEJOOIIIIIIJRDr",
+"e33e334:|:}:}}}}}~)~=~)=^^^^^1(^(gndb6666ggg66666666ggmnxnnyGNRRRQJKKGCGMmoqqonxodgddqoomovomgic0000ic0cevEFojjfjicc4[[eAlf3[/[2[//]],]],,,]>,,>>,,,>>/////22ee<2[<<223222322e333lEDIIIIIEFKJAmtFJOROJIIIIIIIIJQKJJOOROOJJIIIJJEKOJIFuurlrrrutzwEKKIIIDDIIIIOKll",
+"323}}3}:43}:}}|}~)~)====&))&&&^^bgng6d(b6d6666gggnggqgonxHHCHGGQRRROOKKRMCyxxmnyyyCCyvmmqggbb7acacccc0cjjAvFuvooovoqqicclArj3222[[]]>,,]],>>>>>>>,,,>_//<2243e3<2<22223332423323fADAEIIEIJJOKFKJOROIIIIIDIIIIOKEAFFJOROOQOOOJEEEKQJJzwuurrwzzIJJIDDDIDDzDJOKwhff",
+"333:cc3}:|}|~|~!~)))=~===&=&&$&&^^dd^bb(6d6d6d66666666gggnxnnCyCGNRRRRQRSNNQNNNQQNNMMLHBHxxxsppppkkkkkpvyAvyGyvoqqyxqqoqiyFuoiice4444022222_2________:<42442e22<442232eee53ee225uDwzwIJIIIJORRRROJIIIIEEIIJJFtAwFEFJORORQRRQOKEFQRJEEztEDDIJOJDDDEDIJIJJKFtlff35",
+"22::43c4}|c|!:!~}~~~)====&&&&)))^(d(^((^((((((66666666668gns88nnnyFNRSRSSSRRRSSSSSSSSSSSSMnnxpxxxspppppxGCovCCHCyxxxHCxqxvGFFFvookkkiiccc0c0cc0400cikiiiiiijiccc4ccceeeffeee3cehEEDwwEJJIOQRSSQJIIIIIIIIJOGtlrutAEJJJJJOOQQOQQOQRROIDDEIIJOIDDEIIIDDzuttrllfe35f",
+"::4::4}:}}:!!!!!!~}~~~=))&&&)))&^bd(((((((((6666(((((b((66gnnnnnnmvuFQSSSSSSSSSRSSSSMMRRRMxqkkeiiiccccjovoooooooxyxqqxCCCxxGyuvoicc424044222444000c00ciki0jicccciiiiqooovvCvvovFJFJFFEJQSRRSSRQJJIIIIIJJFtvomvuwwEEIIJJEEJJQQQRSSSJIIIIOOIIIIDDzDzzDrrrlhhff3233",
+"<<::::::}}||}!!~~}!==~)~~)&^^^)&^bdd((((((((((((((((6bd(666gxxmvmvyyvAGRSSSRRRMSMMRMSSSRRSCvyvvmqkkkicifjfiiiijikkkkpkxxCxyHKGAvqpkiccc40444044aa44444c3cce44440ciciikiqjooovFKQOOJJJQRRSSSSSSSOOOOOOOFwyvvvvvutAEJIJJEEEJEJORSSSSROOQJIIDzEEDEzzttrrrrrffe3322[",
+"/'<:::!:}}!!|!:!!}!~~~~===&&&^&^^dgo(((((((((((((((^(999699gvxyvvmmvmmnCHNRSSSSRNHCHGNRRRRHyvvvvvyvoojfjiiji5eiik400cioxqxxyHNGGoiiiic0cciiii044444440444c44<:44c4ccccciiifjjoKROJOQSRSRRSSSSSSRRQOQKGGGGGGGGKFGKOOJJJEEIIJQRRSSSRSSSOJIIDEzzDDzzuurjhlhe332222/",
+"/'<2::!2:}:}|}!!}!!~~~~&)))^1)^^1bddb(((((((((((((^99j999996gqnnn6d8qnnxnxHSSSSRQKFGCCNRRRNvvoqqoovvyymmjiee7eiie00cciikiikpxNGKGvic044000400000400000cci34044ccc04cc4eiicijovJJQRRSSRQRSSSSSSSSRROKOOOQQQQQOQQRRQQRRROQRQRSRRSSSRRRRRRQJJEzzzwwurlfffefef32[3[]",
+"2<<[23:}4}}|}}~!!!))~~)^1^))))&&^^b(^((^((((^^^99b9999999b^(((8888888psxBMLLMLNRRRQQKGQRQRQyoooooovovAAujiieceiiiceciiiiiiicioCGGGoicckii0440424244c04ccccc0ccciiikiikkqqpoyCQRRSSSSSRRRRSSSSSSSSRQQQQRQRRRRSSSSSSRSRRRRSSSSSSSSSJJORRQRRQKAAwtwtrffeeee33e323[[",
+"[<2['::}}::!}}}~1}5111))=&&))))^^(bbbbb(^(9977b9991b1^((($$$$$(8d8d88ddsLLLLHxqvGKORRRQRSSRMHyoqijoxvvFFvfee7ei7eieikkikicii00oGGGyqi0cc0iiiic0444444444cckkkpxxxxCHCyyxxxyGRSSSSRRRRRRRRRSSSSSSSSRROOOOQRRRRRRRSSSSSSSSSSSSSSSSRJOOOQOOOQQQKAtwtrhfe53233e332[[",
+"2<<///<:}!}35511^~~~))))^^)~)^1^1bb9991997b99b1^^(($^$$$$$$$$$$(8888((8sLLBBHxppkoCKOOOORSRSQQNyoqkqooKKvlfeejececciiiikiic00iioyGGCqpi0024c0ccciiccippqxxxqxpqpppppqppqyGNRSSSSSRRRRRRRRRQRSSSSSSSSRQQOOOOOJOOOQRSSSSSSSSSSSSSSROOJFAtAAFKKQQGFAhffe3e53ef32222",
+"<22<22<2352:}}~~}~~1}1^^1}}115511b9b11bb5711^^$$$$$$&$$$$$$$$$$$(888d((8BBsBBCxpiiejvFJOQRRRNGGyyvxvCyuAuoheiecceeiiiiiiiipkkkikvyCGGvqki4cicciiqecxMMHxxkkiiiiiikpkpkxGRSSSSSSSSRQRRRQQQQQRRRRSSSSSSSRRQOOOOOOORSSSSSSSSSSSSSSSRKFAvjfjjovyGKNRNyjhhf3ee332<:[2",
+"2332:<<<<23334|}}}55}555}3}^11))1iifee51^^$$$$$$$$$$&$$$$$$$$$($$(88((((sBsxxsxqiccci7gyKORQRKGyvvvvyAvFvoooi500ejiccecikppkppiikyvvGGyoxkiccciijcxHLpikqqqqpkpkkqxvyNRRSSSSSSSSSSRQOJFFOKOOOORRSSSSSSSSRRRRRRRSSSSSSSSSSSSSSSSSQKuvohffeeeivvFOKQNGvjeee3333223",
+"22<<<2222333fee3}57}}}11)==)~!~}5rof1^$$$$$$$$$$$$$$&$$$$$$$$$$$$$(d8(1^dBssBBxqk70cccccjuGORJJFCCvvvAAKClmye7ciceijieixBLBBpppppxyCyyyyxxxoiciie4xHHqkkkiciqqqxxyHNRSSSRRRSSSSRQJJFFKKKOOQRRRQRRSSSSSSRRRQRRSSSSSSSSSSRSSSSSSSSGAuvjjeieefeffjAvvGNQNvjffe33333",
+"3223233235lhhjjf53:!~=~~~!:!}}eeeg&$$$$$$$$$$$$$$$$&&$$$$$$$$$$$$$$(d7b7bsBsBBBxqjc17111akbGNKEFFFGAFFGKFyFyiiikjjjojxBBi2<0sxBxppHGGGGCCCxvvoi33iiCMxxqpkoqkqovGRSSSSRRRRRSRQOJKFFKFEJJOQSRRRRRSSSSSSRRQORSSSSSSSSSSRRRRSSSSSSRCvyvoofffe5eeefhehjvGNRNCoe33253",
+"eeefef33333ujje<<//_'!!!:}5ef5^$)&$$$$$$$$$$$$$$$$$&&&&&$&$$$$$$$$$$bkbb7dBsBBBxvvj771|||77kyCmtAFFKKKFKKKGGxqpovojnHxc222<<42_cpxHNNNQKGHCCxooic44cHLHCxxqqoyNRSSSSRRRRROROJJOJKJFFJJJOORRRRRRRSSSSSSSSRSSSSSSSSSSSRRRRRRSSSSSMoooooojifeefefljfhfejvyGRNComjh3",
+"jhf3e332<<::gq0{''>,]<:}551^&$$$)$$$$$$$&$$$$$$$$$$&&&$$$$$$$$$$&&&)&bkbbbsBBBspxyvkc1111ikkyH77ovuFJJOOQNKKxqkijjCGe</2<222/[2[24ixKRRNQHHCCyxqqicciHMHxCGNRSSSSSRRROKJIJQJIIJJFJJJJOOOQRRRSRRRRSSSSSSSSSSSSSSSSSSRSRRRSSSSSRQHjiijjjfffjjjjjrhifffe5eoyNRRNyuj",
+"fe52::<<'<''!1c!'''<353:<*=&&&$)$$&$$$$$$$$$$$$$$$$&&$$$$$$$$$$$&))==)dpbbbBBsspknyok77777k7qN7c7cimFEJOROOKvqjovNyc2<[__<<<[///[442fyGRRRQNHGHCxxxpccHSMRSSSSSRQOOJFAAAJOOJIJJJEJJJJORRSRSSSSSSSSSSSSSSSSSSSSSSSSSSRRRSSSRNRHNCje55fhhfhffjjlojffhhfee5fjyGNMQG",
+"Mvic|::'!'!'-!|:{{'!!'>>>>>*=&&=$&&$$$$$$$$$$$$$$$$$&&$$$$$&&$&&=====-&dpbbsBspsp7oAm77111kbdGo7ec7iovFOQOJJGvvGKq4243<:__</[222333[[ilvNNRQNHHMMMCCHCNSSSSSRQKEJJFurovuJQOJIIJJJJOOQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRMRRNMMHNo5ee3e335eeehovrjjmmloiee534ciqCM",
+"xMMCqc|:::!!!!!{{{'*****>>+>>'-=&$$$&$$$ $$$$$$$$$$&&&&&&$&&$&=====&===$dpbdBBpss77mCobnb117byy7iiqoojvwGQJIEKQCo704444:_//_///2ee3323jjouyyHHHMMMRRRSSSSSSQOOFGGGvojfoEOROJJJJOOQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRNRSNNNvove53355efe33ehjrojjjiiec42<<_<{{}i",
+"|bpHMHx7|:':!!!-!{:-****'*++>>>>.=$&$$$$$$$$$$$$$&$$&&&&$&&&&=====&&===&&bkdsLssxp77oymNn11i7dH7kkkojmu9bvGGGug7ceicc444c2__][/ee433c33jjhijjipyMSSSSSSSSRSRQQKQHvovvvFORSOOOQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQNGyoijve55e35effeef5e33352<:<44__22:::|:",
+":{{|kxHMCk|!!!!:!!!---*'*****''+>>.&$$$ $$$$$$$$$&$$===&&&&)=&=&&&&&&==&&&kkdBBssq77kvCQKd1k7kGi77jjjwj77ej9}}c04040ccc400022/<32333444ifffejfxNSSSSSSSSSSSSSSRMHCCyGKQSSSQORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRMHyFvjifjovfeehe3332222[/<2[/__<_<44:::2::::",
+"_::{{~7pCNHqc~|~~!!!--**********'@>>+=$$$$$$$$$&&&$&&==&&=&&=&&&&&=&&==&&&^kksBBpskii9CGQGb779Cbiilrto155ej7!{|4444::4ccic0iqif3c22222c3ihlvGMSRQORQJKNMSSSSSSSSSMRMRRSSSSSRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRNNyojhAfifjjjjo52242<<[//<[<<[[/@'>>>/_2____:__4",
+"4_a__{_{|kxMNxb1~!!!~!!-***----****++@@*&$$$$$$&$&$&=&&===&=&&&$&&&=&&&&&&&^bkBBBpkk77oGNOvbioymiirwv5}11fj~'*{{'<4::<<3iiijkvyoi3433223jHRSRQOOOOJEztmooqxHSSSSMLMSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNNGvjifhruffec5cce:</>>>_//<[<[2[<@@'*@>@>>/>>_::__",
+"___:a_a__:{7pHNHn1)|!~=~!-*--*-******+*@>*&&$$$&$&&&&&=====&&&&&&&&&=&&&=&&&^bsBLspki77vFQK9joqx9jAt55111he:''''>>':<44243effyyyvoii5iyMSRQOOQRQJEEtuji44ckokqCMSSSRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNAmorof5fl2<<<<::44:<_/>''>>//,///>'*>@+>>*>>+@@+_'_",
+">____{{|a_aa|~dxMNHd)~!!-~-!!-------*'.*''>*-&$$$&&&&======&&&&&&&$&=&&&&&&=&1dBBLsdi77byOQCojoyjuF97}}7597''___//>_>___<223fovvvvovHSSROIORRQJIEEtre4|0443ioovoxHHSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSROQRRNGrrmjff342h2_<<<::|0|:<_''''>>////>+@+*+++@@@@>#@++++>",
+">*+@''____|aaaa|7sHNHn7~~~==---~------**'**'>'=&&&&&=====&&$&&&&&&&&&&&&&&&=&)1dBLBsik77oFQQujmCjFj157}55e5**_//_>>>>>''<4ce5efvyHSSRQJJORROIIIJIJjcc0004ccciovyyCCNSSSSSSSSSSSSSSSSSSSRRRRSSSSSSSRRQKFCvjee5e3332<e3_<<{::||||!{---''_////@+*.*+@++@@@+>>>@+@+'",
+"@+@+++*'''___{aaaaadxMMyb1~~~~==--~--!--****'''_*-&==&&=&&$&&&&$&&&&&&&&&&&=&=&bnBMBbki7iFQRKjoFmm1}55}}55}''>,___>>>'>_>/4efmCMSRQOJORRRJIDIEEtwwfcicc4ceeiiejvGFQSSSSSSSSSSSSSSSSSSROOJJJOOOOOQKGCmoofi33222442<4e/<{{::{{~||!!**''>>>>>'+...@@+++@@@@@@@@@>@.",
+"+@++++.+..*''{_{||aaabsHMCq7~~~==---!!||)---*'*'_>>*-====&&&&&&&&&&&&&&&&==&)~)^bxLMsikiivQSRvoFo7}5e75}55!*'>>*'_>>>_>//3eoMSSROJJORRQOJIEAtwujijjccccciiiiiifjvFSSSSSSSSSSSSSSSSSRQOOJJJJJIIIIztlfeff3322</<<<_/e<<:!'{{{|:~|!!*'''''_>'.'-++++++++@@@@@@@@@@@",
+"@++@+.@+....++*'{_{|aaa7pxHGnb1~)=-=~~-~||=-*--*_///<{====&&&&$&&&&&&&=&&))))~))1pBMLpkkijGSSGvFic|cfe5557-'>''>>_//<225oMMSSRQRRRSSSQIIEwvvvovjeeoieiijiiiiiiijvKSSSSSSSSSSSSSRROJOOQOOJJIEIEAtuje43e332////_/</53<:{{:'{!{~-~!{''!'''''......+++@@@+@'>@@@@@@@",
+">@+++.+@.+.+....**{{{||||7bpHMCq1)~~~~~~-)~~!--*>'<:2__'-=&&&&&&&=&=&&&==&&))~)))bxBSBkqiiyRRSCyic}}ejf5e5'>_'_/'<<<3jyMSRRQQQRRSRRQQROzuhii3covoijjfiifjjiijjjvGRSSSSSSSSSSSRQOJIJIIJJJJJEAwlohfe3/2322<//_///_<c<:{{{{{{!!=!!~-'*!''<''...-++.++++*+@@@@@@@@@#",
+">@>+++.@..+++.....-**--{~||77pxHHni1~~~~=~))-!!**'::'_//_'-=&&&=&=&&&&=&)&&))~))))kBLLpqqjoQRSNv77}}efe5e!_>>_'<23fyMSSQOOOOOQRQOJDIJRKro3e340cmojovyojjiiijjovFRSSSSRRSSRRSROOIIIIIIEAAAAvvojiie3</22<[///___/<e<'':{!~{~!!~~{!-!-''''-*..*..+++@@+@+++@#@+@@#@",
+"@+@>>+...+++.+....-..**-*{{{~akppHNyg7})~))~~!-{!!!!'''__'''-=&=&==&&&===&=)~~~))~1sBMCqxvoGRSRo77}ceff5f'''<<25mHRSROJJOJJOQQOEzzDIJOlfjiiccceioooovCoqjiijoyFQSSSSRQOJKQRQOOJIIIIIEuurleiijiij32//<<<</_/___/3:_'!!!!!~-~-~!~-!!-!''*-.++'.++'@+@@++@++@++@+@@",
+"@@@@>>@..++.++...........---{||a1ppxMHn971~~~~~::!{!{*'''''___*==&&&====)===~~~~)~~^BBMxyyvGSSMj77cefjfhe<<::fCSRROJOJJJIOQQJAtEIIIIIl2<24ciecccfAwvmvvoovvvvwKSSSRQJKJEEJQRRJIIDEzwtrjee32cecci42</_<</____'<44'{-~!--!*---!~~{!--!!'***.+@>*+>@++++@+@@+++@@++",
+"#@@@@+@+.+.+++.+.....+.-..=.-=={||1bpsHNCok77}}~||!!!!{'!{{'__/_*-&=&&=&))=)~~~~~|~)sBMCoyxyRSSo7i5ejlhr::5yNQOQOJJOIIJQQOJDzDIIIzlfh[22[<2<4ccijAtromtAyvyFKORSRROOJFAFAEJJKRQJAtulrjfe22<443c32<<_<<<_<<_'_<e:~!-*-~!--=-~~~!-!!'!!--*'**.@+++*+++@+@+@@++@@@+",
+"@#@@@@@>#++..+.++.........-...=---{|a7pBHNGyqi7c1}~}!!!!!!!!'<____'-=&&===~~~~)=~)~~)BBMxHyoNSSyeieeorrumHROOQOJJIIIJQQJEtlrrzzuff333/{:<[[2<<4ijowtvovwutFEORSSOJJJJJFKEJJFFFNROAvljh52//<422244_/_<<<<<<{'_e<{!~--{------!!--!!'!!--*'**'*@++'@@++++@+@@@@@+@#",
+"#@+++@#@>#@+.+.+.+++....--..-.-=====~~17pBHMNGvjbc71}||!!{!!!{'*'___'-=&=)~~|~==~)~!!dHLHCvqHSSCcjjrwFQROJOOOIIIIJOQOJzrhlltwzhe3222/<<<<<[/[2eeeeoAwmrAAzEEOSSRQOJJEJJJJOJFAAvCRRGvhi2_/<:42<<2<<<<:<<:::<<3:{!!!!{*-----~-~~~)!-!!!-!-*'+*++@@>++@@@@+@+@@++##",
+"@@@+++@@>@>@.+...+@.......--...==------=117sHMNGCofb1c}}|~!!!!{{{**'__'{~~)~~{!~~~~~~~xBMxxqCSSCjAFQRRQJOQJIIIJOOOJDthehhllllr332[22<<[<[<2/2332333jwurvAIJKSRQOOKOKKKJJOOKKGyvyFNMGyc<<:<:<<<<2<<<<::<::!<24:{!!!!!!{-===-!--~~~1}}}}3:'.*'+@'++.+@@@@@@+#@#@@#",
+"#@@+++@@@@@>>+...+++.......----==-------==~|7pHMHCvuof771}}:|:!!'{{{''_<<!))~-!!!{!!~~dHLsxqxSSNGRRRRRQKIIIIOOJJIErh5feh5323e332223//'<[//[[5e333333rjhjtIJRRQOJIJJKKOOOOKGGGGKKyyyMRx0|:<:<<<<</<{<4<_<::22'{{{{{{{----=--=~)1717}}}7}}'*'+.*+.+++@@@@@@@@@@@+@",
+"#@#+#@@+@+@#>@++...+.........-------------=-=~1kBLHvmmmof7}1}}:::{!!'''{{<_{~~~~!{::::|xLLCGySSRRSRRSSOQRRQJJIIAl55ee322[<[2[[33/[2/<'<</[2efe35222[3lrhuIQRJIJEEEJFFKQROQNNNNQQNGMSSRHppci0||:<<<::::<:_<5/'-{{*{{-{-!-!!~}~~})~!}}}3:!!'++.+++++@+@@@@+@@@+@@@",
+"@@@@+@@@#@@@+@@@+..+...........---=---=--=-----~)7sHMyooomlj5}:|!:!:!:<:<<___:!!!!:::44bLSNRRSSSSSSSSRRMGtEIEtl15333}2<<<<2<223[/2<>'<</[2eeeee2222[2fttDJRJIIztuutAAJKKFKGNMMMRSRRRRRRxpkpkk044::::::::<3<<::''{{{-!{!~~0|}1}!!~:}|!!-'''*@+++@@@++@#@@#%#@@@##",
+"@@+@#@@@@+#+@@@@@+....+.......*-----.---==-=-.-=-=)1dLLCmjjojhf55}||!:<:<<<//[<{!!{:::}9MSSSSSSSSSSSNvolwEzul5e5}:<:2:!'/[<:2232[[/>/'<<23ff533[2233fftIIROIDwrrwutwzzEuuujhjfifiiibkvCiccc0||444::::<4:e:<:::{{!!!||!:~||~~||!|:!!!!!**'''++.++@@+@+@#@#%######",
+"@@@@@@@#@@+++@+++@@+.++......---=----------=--=--===-^dBMHxjibhjffe534::<::</[22<<:5evFFOSSSSSSSSQKOurwEzr9559}!:!<2<!'<<<<22[23[[/[<[//5eee32[[32efjhtJROIDzwrrutzzwzEruwrf33eie53::|ceee44||4<4::::<<33<<''!{!!||~|~|||!~~~!!!!!!''!*+.*+++++@+@@@+@+@+@##@#@@",
+"@@@++@@@@+@+@@@@+@@@+++...+....**-.---.----=----~}}-===)bBMMCjfb5eee55e4344<<2cijhrtEJJQSSSSRSSRROQJwEwrj5}5}!!!<:<''{<<<<<<[[3332[2[[/3e3ee333233ehvwIJRJDwwwwrruwtEDwjlEr333e5353:<:4:cic4442<<<:<<<34<':{*{{!||||||||:|||~!!!!--**-*+++++..+..+++@+@#@##@@@#@",
+"#@@@#@@@@@@@>#@#@>+++@.+.....-*.*..--***-...=.!!!!}}---=-~^xLMCofi775e537eeijjjouEJJQRRNQNSSRSSSRQREtlj153}~=-!'!!-!'<'<'<<[[[3332////2f32ee32333fjfAJJOIIDtutzzttuwzwtlAwjee3ee335:2432:40c42:<<<::<23<::{!!!!!|~~~|}~::!}1-!{-!--*'+++*@++++++++#@@@#@@#%##@@#",
+"#,@@@###%#@@@@@@@@@@#@@@+.+...***-.-*.*..*..*!!!!*!!------=)^nLRHofffeeeiffjjuAKOEFJKFFJwmMSSSSSSRKmg1}}!----!:!!--!'''</<[2//3h3//][]f52eee3333eeejFRQJEtIwrrzDzruuzzrjrjjfefiie55344:3444:33<<:<:<43<<{!}|||~!!}:|~~~!|}5}!--**-!*'+++++*@.+++++@@@++@@@##%##%",
+"@@##@@@#@++@@+@+@##,@+@@>***+.*-****.**-.-**!!!!-*-!*---!-----)nLRNyvfeeiflwFKFAwwFAJJAwuvHSSSSSSNm1}!-==---!!!----!'''<_'<[[2eh[////[h3eeee33[[eeerKROEultDttzDwwwEIErf3ioujhhf55771c3544444c444<233<44||||!~}~|!-!!!~|!:!:----.-.''*...++++++.+##@@+@@#@#@@@##",
+"####@@@@@#@#+@@#@@@#>@@@@@*.+.+'*++++*.-*'*!!!**.**--***{{{{{~!~)8LRNGvvyFKAurvuFEJJAuuAzEFSSSSSSm~~-===---'!-----''''<''<2[23e3[[[[[/h3hfe3[[[3eelEORJwrjfwJwtzEJEEEIKvqpkoHGjjjjjfic55}44<4:4432e34:4}|||}|}}|!!!!!!|!-!!!****-.+.**.+.+@@..++@@@@@@@#@@##@###",
+"#%@##@@##@#@@@@@++@#@@+++@>'+.*'**+''>>'_<<'''''*'*''***'*!{{-!~~~~8LRRROAtuvuFFKJAutwEEIIOSSSSSM1=-==-=-'**=-----''!<':<<22233322333[jfee2/[[4eifwIRQIwrjluFEEEJJEwwEJQHCxovFAvfiiie5534444:::44e5:24|}}|||~!::!!!!!!!!''!!''''*.*++*+@@#@@##%;;;;;;;,;%##%%##%",
+";;;,;;,%,#%@+@+++@@+@++++++''>+':<<<<<<<<<<<</<_/__<<_>_'''{::{|~|79myMSRNFGKJJJJtrutwwwEJRRSSSSx===-----*----***'''<:22<222533335532<ehe243cciioAJQRQJAuwvmmKJEAEEAttDQCvofjoAumjiffi5c4444:4:3e3c34:}}}3:!:||!}}:::''!'**'>'''*''++@+++##,;;;;;;%;;;;;;]/];;;;",
+";;%;;,,;,;,,,,%@#@#@@@+.++@+'@...**-!!:'!{:::{{'<<<:<{<<<<<:443cfruvlooGRSRSRQOJJAAwAAFEJRRNSSSM(-----------*'*'*''<:34::24efjoooqkkc0oyyqooqqjjuJOROJIEwvmoAwFEEAEzEtEOQAvfjfgwullojff5334::3ff34c43::::::::|||}3:!{**-**-*'*-**...+++@#;,;;;%%%%%%%%;%%;;;;;;;",
+"%%%;%%%%;;;%,,]],/],,,>@@@@@'''+++++*+**.****-****-*{*'*'*!|||emoofffjmvuKRSSRQOOJzAEJJJQKyxSSSMc'*----!---'-**'**'cnxHBLLMMGGGHxqki7aioovjfjoolJJRRJJIIulrrljlGEwwzEwEOJOwojjf9uuruwtljf55imrj33354c}::::!::!|}}::!''**.*-**.**.*.+@@#,;;%#,#%%###%%##%%#%%%%%%",
+"%##%%#%%##%%%###>,,,,,],]/<//<>'>>++**.'.''*'.***.*'**-..**!}}}}1}1111fluAAMSRRRSNKJJJQNCyxxSSSH233<'''*---*****~boyxokkvKNyvvyvvkii77oofouurrrEJOROIIIIrrwjffjlwJzwEDJOJOOtrmjjjutwAFwvvvvrje5544c|||::!|!:}4!~!!!{-*-*..--***+*..@>>,,%##@###%##@####%%%#%%%%;",
+"%%%%%%%##%%%%%%%%%%%#>,>,>>>>>////>_''*+'+>*+''**+*''*-**'<:}!~~~^11bfojlg96nMRRSSRQQNHvvGHMSSSC23332<'<<{'''!1iijoiffjomovCvvvvoooofivmjomtAuwJJROJIIIIDzrjfjjhjtJIIJROKQJOAoj9999mvulofe9}c}}}~!~~!|!~!}}}|!!!!'*!!**-*'.*..+...+>>#@#####@#@%@@%#%#@##%%%##%%",
+"%#%%%%%@##%%%###%%;,;#>,>>>>>>>>>/]//[///:<'*'**+*'+'-'!:::!!-~~~159jmlfb1b999ySRRORMNCoooyHHSSHie3333<:::}7fjjovuurojolfejvGvvuoofb57lhhjhjrDIJQROIIIIOIEwttutljhltKCuuuAFJKmbbb^^^^^b^^~)~~}||~~!|~!!|}}}!!!!!!{'-!-'-..**.++..>,>@@@##,,%#@@#@##@######%%%#%%",
+";%%%%##%%#%%%#%%%#%%%>@#,>>>>>>>#>#>,,,,>/,]/@@*''*'::!:!!!~!~~~~19fjh977eee759mMSRymvHNyxyxxSSMNGyvvuuuuAAAwtAEEzAwwAttujffvutAtwuoofwururuuzQORQJIIIIJDttwwulfeb59eb99gvoyKQndbb(^bb^^^)~)}~~~)~~!~~~~}!|!-!--*{*-***.-*-**++>>>>@>@@@+@@#@###@@@@####@#%####%",
+";%#%%%%%%%##%%,,#%%,,>>,>>>>>,##,#,>>,,;>>>],@***'!:::!~~!!}}~)15fhfe555ife55fhmGxSRGvovGMHCHRSMvvuuFJIIEIDEEDIDwtwtDDEwtuwlAJIDEwllofuhjljhlAJIRJIJIIIJAlhfe557577bb6(6d6ooxHMnd8dp(^)^^11~~)~~=~~~~~~~~!!~!!*---**'+**.**-*@>>>@*@@@@++@+@@#@@@@@###@###@###%%",
+"%%%#%%%%%%##,%##%######,,>>>#@>>,#>>,,;]]>>;>''''!!!!!~~!!~~}~7eff971}55eefjovyo7knMRNyyyKRMNSSRQOJJEEDIDEzzEIEzztwwtlurrrujltwwrlb^^^3<333ehEIOOIIIJJJJulhffe999b7b96666d6gqxLLddbd^^(^71)))~~~)=~}}~~~-=~!*--!--***'******>>@@@@+++@+@+@++##@@#@#@######@###%%",
+"%%%#%#%##;%%#;%##%#,,,,>#####>#@#,>>,>,],,]>'''''!!!!!~!!!!~15eeef71}555}efoCokijojoHSROJKQMSSSRQOJEEEzwttwtrljlhhlhe5fheff57foh71~)&&3<235erEDQIEwtrrruuwulljlmvummmgmgg6nnBBLLdd(^^b711^^})))~~11~~~~~=------------***.*'*'*+@++++@>+@+@@@#@@@@##%#######%%%##",
+"%%;%%%%#%;%%%%,##,,>#,,,#>>>##,##,>>,]];]/>>'''''!'!!!!!!~~}cc55771}3c3}efjoqiikiiiijxMRKFuvGRSQOJJJEEzttutwrjffeh5}::::'''-&)c4|=$$$$2'::<2uEJQItljjjjlhllrtrmgmmmmmoomooxxBBs8((bbb71^1^11^1^~~)~~---==~=--------.*-.-*--***++@@@+@@+@+@@@@#@+@#####%%%##%##@#",
+"%#%%%%%%%;%,%%;%#,,#>>####,#,#@##>>>>,]///'-'-''--'{!!!!-!}}335}}}}c3}ceiiec17kki7cijiqCRRKyFGSQOJEwuturwzwtrrjjlf:2<<!<<</*&&1}=$$  $<':<<3wzJODtrlhhhfeejjrvutumggggggggdnsddd(6bbbbb711^^~11)))~)-----!----*-****+*'*****..*++@@@@+++@@+@@@@@@#@#####%####%#%",
+"%%%%%%%%%%%%#%%,,;%,#>####,,,,>###,,,,23/'***''''-*{!!!|}3}5c55}}:55ceicc}}cc1cii7c7jeeivQQQKuRNAEEtrrrtrhhjjhje}:<!!!!!:'>-  $($$   $2'<22fEIOIEwrlhffhf999jggmmvuymggg6ggnnpd66j9bbb1^111}}1))~~)--------{--!!**-***'*''****++.++@++++++@+@@@@+@@@@@##%%@#%#@#",
+"%##%%%#%,;%%%%,%%%%%,,%#,@@#,,,#@>,,,3h<'*'*'*--*--'!!::}}}}c5}}}22c4ce4::c55ccccikioiiiioGQKGRSGyAEEEEurljlhh52<!''---=---&  $$$    $2<<<3lEDOIEtljfffhfh99jogggggmmxxnnnnnnqgggo9bbb11^111~~)))=~---------.*-!'--**-'***.*..*..+@@@@++++++@+@@@#@@+@#@##%##%#%",
+"%%%%###%%#;;%%%%##%#,,%#,,#####,>>,,2e'>'''*-*-*!{''!:<:::43}:}:<444c4333eeeeeecc0kqvoiiiioGGFRSRFJEEIEwwtulf5e32:{!!-=-==-&  $($$$  $2/<<etIIRIEujjffjjf9f99glggoggggqnBBB8dg6gog9bbb^7b111^~~)=-!!-==-----.**-!!!**-**-**..-...++++@@@++#+@@#@@#@@+@####%%##%;",
+";%;;%%%%%%%,%#;,##>,#,,#####%,#,,,/35@>>>''****-''<<<<2233eeee353ife3<:||1)})))~}|1ivoiiiijxAKRSSROEEAEEwullhfe322<!!!-!-**&  $$$$$$ $<[22hEIIRIzulhhhhjhjjjlllooogggoqnxBxnnxvgggddbbbb1^)))~~)={!---==!-----**!!!-*-****+.+...++.++++@+++@@##@@###@@###%%#@#%%",
+"%%;%#%%;;%;%,;%%,#,,,##%%;;,;,,>,/2'@@++*'+***-*'':::|:222</_':<<<<:!!!!~~|)&))&)~1^bqkikbkqoyRSSRQJJAuruwtrrrfee33<'''{'>>=   $$$   $:323hEIIRIztrrlljhjjjjjhjjogooooxxCqqoxGyoo99bbbbb^11))))~=--*-=-----*!!---''{-*.*.***+..+...@+@++@@@+@+@#@@###%##%%%#%#%%",
+"%%%%%%,;%%%;%%%#%#,%,#%%%;;,,,]/22@+++++++++-*'''-!!<:<<!'!!}}::{{!-~)))~)))~~~~~~})1pxppqvq9nSSSRQOJJEAAztzwrhffe32<<'!<_>=   $$     |e23hEIIQIEturrljjlogjjjlojjooqoxCnooojookibb1^b1^^^1))))))=---*---~~~!!!*{***''=****-*+...+.++++++@+#@+@@++@#####%#%#@%%%",
+"%####%##,%%#%######@#@###,,,@,/2'@+@##@++++''!*!!!:!!!!}~11}~-======))))&))))))~~)1|}7xxxxxqjqMSSSQOJEEEDEzzwwurjhf33<<<<_>=   $(     !ee5rDIIQJIEtrurtrrlmmojjojoovonCxgoog99bbb9k7c11^1^1^))))==)----~~!!*******-***'**.***......++@++++@##@###@@#%%;%%%%%##%%",
+"##%##%#,######,%###@#,####,>><:'+@@+@@#++>__''*'''*~~}71~-=-=====&=&&&))&)))))~)~)))17dxCxndgqHMSSSROJEEDEDEwwrtrrjhe32[<[/=   $(     !3hhrEIIJQIIzuurtuurrmmoggmoooxCHp9j969gf9jjb7111111)~~)))=====~!---*-*-.*.*-*..****'**++.@+++@#@+@+@@##@>####%%%#%#%%%%#%",
+";%%%#%###%#,###%#@#@##,%#>,/<<++@+@@@+@+@>>>//''{*~c7|----=-=====&=&=&=&&))))))^)))1c7bqCHndgnLLNRRQRQOJEEEztwurrutulfe2233~    $     =3rzzIIIJRJIzzwuuutuummooomvxxHMqiibb9juojiib7111111))))))-~--~~---*-***..----...-.-***..+++++@@#@@+@@+@@@@@@@##%###%%%%%%",
+";%%%#%%##%########>>#%#>#>/<'#+++@@@@.+++@+>_'*'{{k)-----==-=====&==)&=))))))~~))))1c1ikyNyqqxSMGKQQOOJOOJJEzwrlrllrurjf232-    $$    &5lwwDIIIOQIDDEtwtwtwummmmmmxnxxbbe7e9fj9bbe77711c}11~~~~~=~~~~~---*--**'.**.****.....**..++@+.+@#@++++@@#@@@##@#%%#%%;%%#",
+";#%%%%%,,%#,########>%>>>2:++@+@+++@@+@+#@++_'**-a7{{{---===&&)))^11}1117b1|:|!~|~1111bkqKKxoxMMHGKKJJIIIIIIIEEwtrlhhrrl322-    $$    =5jtDDIIIJOOIIDzzwwwAwAACGGGMLLpbbb5bie771777711}1|1c|~~~~~~~~~~----{--.*.**.**..-...-.+*'>++++++@@+++@+@@@@@@#@%###%%%#%%",
+"%@%%%%;,#,#@,#>,##>,>,></'++++@++++@@++++@.++_{{{{sd{~~||1cikojjjjijmrjfjec2222<:|0|117bkyKGxxLGyCFKEJIIIIIDDzwtzzAAwurwuel6          =5uuDIIIIJJROIIJEzAAwwwGGKQRSSLdb(6bb777c5c}c7}1})}}~~1}||~!|~~~!-{-*-****'*.....-...*++....+++@@@@@+++@@@@@@@@#%#@######;",
+"%%%%%%,%%;%#####%##>>>[<@#+++@+@@+++++...+.+..'*{{~sxpc||~|}1777ijiiee575c3344424440aa7ikbCNCCMGyyGKJJEIDIDDEEzturrttEEJJtt)    $     =}wwwIIIJIQJRQJJOOIJJJAFFKGMSSn666ddb^7111|||c||}~)}~|}111|||~!~!{-!!-*{*-'***.**-.+....+.++..++++##+@@+@+@@@@@@#@##%#@###",
+",%##%##;#,%,###>##>></@#@+++@#@@+@@++++++@+...+**{{!nHyb1)~~17c034cecccccc}5c444cccc00iki7gAMHMHHGGKFJIIIIEIIDDEDzzEzzDDJJr=          -5JIIIJJJOORJORIIIIIJKKKKKNNSLngggdbbb^1^)||||:::||~~~~}~~::::!::'*{!{'{{*'*''+...+.++.....+..+++.+@@+++++#@@##@####%###%%"};
diff --git a/hacks/images/timetunnel1.xpm b/hacks/images/timetunnel1.xpm
new file mode 100644 (file)
index 0000000..362cef8
--- /dev/null
@@ -0,0 +1,1111 @@
+/* XPM */
+static char * timetunnel1_xpm[] = {
+"256 1024 84 1",
+"      c #1D1918",
+".     c #262221",
+"+     c #2E2928",
+"@     c #352F2D",
+"#     c #3A3433",
+"$     c #403938",
+"%     c #443F3D",
+"&     c #483E3E",
+"*     c #4A4543",
+"=     c #4E4444",
+"-     c #4F4A49",
+";     c #564B4B",
+">     c #544F4E",
+",     c #5A5553",
+"'     c #5F5353",
+")     c #605B59",
+"!     c #655A59",
+"~     c #666160",
+"{     c #6A5F60",
+"]     c #6B635D",
+"^     c #6F615D",
+"/     c #6B6665",
+"(     c #706465",
+"_     c #756A6A",
+":     c #736C65",
+"<     c #716C6B",
+"[     c #786A66",
+"}     c #7B716B",
+"|     c #777271",
+"1     c #7C7071",
+"2     c #807771",
+"3     c #7D7877",
+"4     c #827677",
+"5     c #827D7C",
+"6     c #867D77",
+"7     c #877C7C",
+"8     c #8B837C",
+"9     c #898482",
+"0     c #8E8282",
+"a     c #90827D",
+"b     c #938983",
+"c     c #8F8A89",
+"d     c #948889",
+"e     c #978F89",
+"f     c #95908F",
+"g     c #9A8E8F",
+"h     c #9E908B",
+"i     c #9B9694",
+"j     c #9D968F",
+"k     c #A09495",
+"l     c #9F9A99",
+"m     c #A69A9A",
+"n     c #A49C95",
+"o     c #A39E9D",
+"p     c #A8A3A1",
+"q     c #ADA1A1",
+"r     c #ABA39C",
+"s     c #AFA7A1",
+"t     c #AEA9A8",
+"u     c #B4A7A8",
+"v     c #B9AAA5",
+"w     c #B4AFAD",
+"x     c #BAADAE",
+"y     c #B9B4B2",
+"z     c #C0B3B3",
+"A     c #BDB7B6",
+"B     c #C1BCBA",
+"C     c #C6BABA",
+"D     c #C4BCB5",
+"E     c #C6C0BF",
+"F     c #C9C1BA",
+"G     c #CCBFC0",
+"H     c #C9C4C2",
+"I     c #CDC7C6",
+"J     c #D2C5C6",
+"K     c #D2CCCB",
+"L     c #D7CBCB",
+"M     c #D6D0CF",
+"N     c #DAD4D3",
+"O     c #E0DAD9",
+"P     c #E6E0DF",
+"Q     c #ECE7E5",
+"R     c #F3EEEC",
+"S     c #F9F4F3",
+"li93::|9ic|{>-%%%$+.  .@%-*%*,),,>-%*>~3gquqmmikuupc3|3cg95coAIMMIKKKIEABEIIIKKKHEBEHIKMIEHEIMNMNNKKIHEEEHIKIEEEKKKIKNOOPQQPQQQRRQOOOOLLLKFFEzzxvvvssssmmmmmmmssssssssssvvvvvvzzzCFFILLLLOOOOPPPQPOOLLFFzvstqqllkgggddgdehquuuwyAAxzyyzAwwplf777225foolifffifcci",
+"fi953}<3fl9<,>%#$#+.   .#**%%-)),,>%$*,_0kqqqmkkqupi1(/|0c59itEKMKIIIHHEEIIIIHIIHBwwAAEIHEEEKNNNOOONMKHEBEIKIGEAAHEGHFKMMOOOPPQRRQOOOOLLKFIHBzzvvvvsrrrmmmmmmmrrrrrrrrrrrvvvvvzzzCDFHLLLMNNOOPPQQPONLLFDzvspmmjjkkggddddhehqquuyAyuxzwxywwpoi9576329ioliffffc99c",
+"b0c955|<5ff3~>*###@+....@%*%%%>,,,,-%%-)_cmquqmkkuuo9<)~|9550iwEKKIIIHHEEIIKIHEEEBwwAwABEBBEIKKMOOOOONKHEEHKMIBBAEEEGEFKMNOOPPPRRQPOONMLKKIHzzvvvvsssrrmmmmmmmmrrrrrrrrrrvvvvvzzzCDFHLLLNNNOPPPQQPONLHFCzvrrmmjjkkkggddddeejquuuAyuuxwwyAwwpof950059iooifcifd098",
+"799dc9|(/|99<,-%#@@#@+++@$**%%*>>,,,-%*>~3gmqumkkmuul3/!/35379iwEIIHEEEBBEHIHEEBBBAAAAyAAAAAABEHMNOOOONKIHIKNNKEHEIIIHKMNNOOOPPQRPPOONMMKKHEzzvvvsssssrmmmmmmmmmrrrrrrrrrrvvvvxxzDDFHLLMNNOOPPQQQPONLHFCzvrmmmedggkkkggddeeemquxxAxqutwwywwpolf00cdcciiiccffc988",
+"99ccc9|(!)|95/>*$@#$$##@#$*-*%%*->>,,>->)/0kmqqkgluuuf1!)_7||39lAHHEEAwwtyABEBAyAAAABBywyyAywAABEKNNNNMKIIIIMONMKKIKKIIMMNNOOOPPQPPOOMNNKLFEzzvvvsssssrmmmmmmmmmhrrrrrrrrrvvvvxxzDDFHLLMNNOPPPQQQPONLHFzzvrmmeeddggffkggddeemmuxyxwqqxtwwywwpoif99cd999cccfff995",
+"9955553_),~393)-%##%*--%%%->>-%%*->>)~)>,~|fmqumkkquxm7{)(3|<13ctBEEByppttwyyytolpwyAAwtppwwwyAAAEKKKKKHEEEEHKMKHHHIIEEHIKKMMNOPPPPOONNNMFFCzzvvssssssmmmmmhhmmmmmrrrrrrrrrvvvxxzDDFHLLNNOOPPQQQPPONLHFzzvrmmeeddddbhhkgggeeemqtAyutqqpwxzwwpoif9500d079cffiicc9",
+"92||333|/),~39|,-%%*>,>-**>)),-%%*->)/~,,)/7imuqkmmuxug<){|3<_19mAEEEypoptwtttpidfltyAwpoioppttwwAHIHHHBAAAyBEHEzyAAEBCCEEFIKLNOPPPPONNMKIFCzxvvssssmmmmmmmmmmmmmmmmrrrrrrrvvvxxzDFHLLMNNOPPPQQQPPONLHDzzvrmmeeddddbbbgkkgjeemmuzAuqmqupwxwwwpif9569d0779fillif9",
+"2|:::|||<~,,~35<,-->,>>-*%-,~~,-%%*->)~,>,~<cmquqmmuuuo7{~<4|_(1cwEECAtllptpppplg9fpyytpoilllomptxBHHEGByyyzAEEEzxuyzBzzzEFFILNOPPPPPONMKHHzzvvxsssmmmmmmmmmmmmmmmmmmmrrrrqvvvxxzDFHLLNNOOPPQQQQPPONLHDzzvrmmeedddd88bbgkkgjeemqwzxqtmquttwwwwofc645d07|5coppof9",
+"3}:_//<||<~',/33/,,,,-*%$#$*)(~,-%%*->),->)~3gquqmqqtuqc_~{|4<~/5lAEEByoilpppppoicclwAwtollloomrqqwBBABAwswwyAEEBxuwwyAzzzEFFLLOOOOPOONMKFFzzyvtussmmmmmmmmmmhmhmmmmmmmrrrrvvvxxzDFHLLNNOOPPQQQQPPNNLHDzzvrmmmeeddd888dggkkjjjmquzzuqsmqptuwywtlfaaa507479lttoi9",
+"221<<//<<|/~))/||/~~,*#@@@+#*)(~,*%%--,>**,)(9kuqmmqpuuo7/(<|1{{<5pBEBAtiiotpopppi9ftAAytoolooqqmqtyyyAAtpsttwABAyuqtxzzzzCEHILMOOOOOONMKHECzAyttsmmmmmmmmmmmkkkkkkhmmmmrrrrvvxxzDFHLLNOOPPQQQQQPONMLHDzzvrrmmeedddd88dddgknjjjquxxxuqmmqptuwwwpic8a634439iptof9",
+"59553<(//<<<~))/|33<)*#+....+*~//,-%*->,-*>)~|fqumopuuuuk3_/<|/){_fyBCBypfgoolopqoifowBAwppqppttppwAywwyupoooqtAAwxuqtwxwzADFFILONNOOONMLIGCzzztusmmmmmmmmmhmkkkkkkkkhmmrrrruvxvzDFHLLNOOPPQQQQQPONMLHDzzvrrmmeeddddddddddgjjjjquxuuuqmmquutxwwtpica666859cilof9",
+"9cff93|(~~/</~)~<353~-#.  ...@-~//,*%*-,>--,)(9kqqomquuuqc|((__~)<5oABCAwmcfigkooppllpyEAwwttuuwwyAywtwytlinllpxywxuqtxzwwzCBFFLLLNNOONMKFGCCzAttsmmmmmmhmmkeebbbkkkkkkmmrrrvvxxzDFHLMNOPPQQQQQQPONMLHDzzvrrmmeeeddddddddddjjjlouxuquuqmmqotuxwwtpfa6aa9cc99ciic",
+"ffiic731/))~~/~/<|59<-$@.  ...#>~<~,**->,,->,~|gmqmmquuuuk5<~/_({(5fpABAAtg9ccglmptpoouAABByyyyAEEAAwtwAwojjiiouwwsuqrtwxwxzABFILLNNOONMKIGCCAztutmmmmmmhmmeebbbbbbkkkkhmrrrvvxxzDFEJKMNPPPQQQQPPONMLHFCzvrrmmmeeddddddddddeejnopxuqquuqmmqptuxwttofc9ccc9575cff",
+"filic541<~),,)~<<<39|,%#@..  .+%,~/~--*>,,>>>!/9kqqmmtuuuqc|/~///(49iwAAAypc90dioppwpolpwEEEEEBEHEBAytwAyplliinuwxtpqqttyxxzzAFFILLNNNNMLFGCCzztttmmmmmeeeeeebbbbbbbkkkkkrrrvvvxzDEJJMMNPPPPQQQPPONMLHFzzvvrrmmeeeddddddddeeeejoptuqqqqqqmquutuwwttplie98655379c",
+"cilic5||</),->>)~~<3|~-%$#@...+#-)~),---,,,>,)~|gmqolquuuuk7_((///<7ftyAyyti059floqppogioyEHIHEEHEBAyttwypooihjpttwpqqqtuzxyzDzFFILMNNMKFIHCCAzuttmmmmeeeeeeebbbbbbbbkkkkkrrvvxxDDEJJMMNPPPPPPQPPONMLHFDzvvrrmmmeeeedddddeeeeejnptxuqmqqqqmquttutwwwtlf866444426",
+"3clic54<<<~'-**--,~||~,>--*$+++#*,)),,;-,,))))~{5kpmllquuuq0|<(((~/3gpyAywwpf70fiiiioplcfpyEIIEHHEBAwolptpookfeotttsommqtxxyxAzzFHKMLLMKKHHCzzAtttmmmmeeeeeeebbbbbbbbbhkkkrrvvxxDDEJJMNOOOPPPPPPPONMLHFDxvvrrrmmmeeeeeeeeeeeeeejotpuqqqqqqmmqutwwyBBypc662|11[}}",
+"<3fif93|</~)>*%%%-~||/))),>*%#+@%>)),>,>,,)//~~~<dmmlimuuuui3||_<{~<9ltyywwtoc9ckgccilofcipAHHHHHEEAtlflpooolffiptttpmmmrpwuxxzzzFIKMLLKKIHCzzvtttqmmmheeeeeebbbbbbbbbkkkkrrvvxxDDEJJMNOOOOPPPPPPONMLHFDzxvvrrmmmmmeeeeeeeeeeeejoppouqqqqqqmquxwxABAypf96221__[:",
+"(<5cf953</~),;%$#%,|3<~~~),--*$##*,),>,,>,)/<</~~7kmmgkquuuqc733|(!~|cpwywwtulffli96dioloiipwBEEEEEEtiflpoillheipttuplmmqrstuttvzzHIKLLKKIHCzAysstmmmmjeeeebeeddddbbbbbkhkrrsvxxDDEJKMNOOOOOPPPPPONNLLHDzxxvvrrmmmmmmeeeeeeeeeejnponqqqqqqqqqquzAzAwtppf8a21__[:",
+"/(<359953|/{),*$@#*~<///~~)),>-%%%>))>>,>,)~/</~~|domkfkuuupl9905|{'/9owAywtppllol979fiotoiilpwyABBAtiflppllmiffltttponmrruruqtsvzCHIILLKIHCCzvttsmmmmjeeeeebddddddbbbbkkkrrvvxxDDEJKMNOOOOOOPPPPONNKLHFDzxvvrrrmmmmmmmmmmmmmmmmqunjqqqqqqqqqquzAAwtppplfa6|_([[",
+"((/_<|5993<{))>%##$-))~//~/<|</)>*-)~,>>>,)~{/<(~(7kmmfgmquuqi9995<{)|fpyAyppqpppof059cittrififiopttpiiptpllljifisttqomljmmrnqmssvCCHILLIIHEzzyytsmmmmjeeeedbdddddddbbbkkkrrvvxxADEJMMNNOOOOOOPOPNMNLLHFDzxxvvvrrrmmmmmmmmmmmmmmquqmmmqqqquuquxABywurpppic6|1(][",
+"/~~(~~<5953<~),-$##%-->)~~<39c93/)>,),>->,~/<<||(~|gmmgckpquuog9997<~/5ityywpoppolic76acottpf9889fiiilouwtooleiiiottppjjhnmqrnmmstzCCIIKIIHGzzyxuvmmmmjeeeddddddadadbbbkkhrrvvxxADJJMMNNNOOOOOOOONMMMLLHFDAxxvvvrrrrmmmmmmmmmmmmquqmmmmqqloppppttttsqolpli86|_^[",
+"{~~{{))<|55|/~),*$#%*%%*>)<3cff93<~)),>-->~/|353<~<cmmkcdmquuqmc5597_~<5iwyytooolifd960bioptpi96659cilpyAwpliffjilppppmjhjnmmmjmmtwCCGJIHFIFAzyvussmmmhjhedddddddadabbbkkkrrwvvzDEIIMNNNNNOOOOOOONNMKLLHFFDzxxvvvvrrrrrrmmmmmmmmquqmmmmjjlopttpnopttqmlloic84<^]",
+"({){{,,,~<33|<~)>*%%*$##%>~|355955|</~,-=*,/|9dd3/(7imlg9gmquumg53993(/|5iwAypmmigc998a69fiptplf989cipwAAyoicccjiloppqnkhhjnmmjemqwzBCGHFHFFAzxxusvmmmhhhhbdddddddaddbbhkkrrsvxzDEJJMMMNNNNOOOOOONNMMILLHFDDzxxxvvvvrrrrrrrmmmmmquqmmmmmjnptwwpnjoptqmifiifc5|^]",
+"({!!!,'>>)/|3|/~)>**-%@+#*,///<39fc9|</,*$*)|9ii9|/|dmom00kqupql047d9|//<5oyAwolf905888668ciottpoiiipwyAAtlc9cccflpppolmhhhhjkgeeqqzzCCGJFFFCzzxvsvmmmmhhheddddddddadbbkkmrpvvxDDEJJMMMMNNNNOOOOOONMLKJLLHFFDzzxxxvvvvvrrrrrrrmmquqmmmmmjlptwtpnjjrqqqmififcc7|:",
+":/!!!';-->,~<|<~~),>>-$@@%>,,)/|9fiif93/>$$-/9ili5||0gmmg7dkquumg517c7</(|9tAAwogc00a88666a9fopwttptwyAyypg99ccceiopooojhhjhhhhdejquzzCGGEFFFzzxvsssmmmhhheeddddddddbbbhhhrrvxvDDGJIMMMMMMNNNOOOOONNMMKJLLHFFDDzzxxxvvvvvvrrrrruquqmmmmmjnpppppojgkmqqqjfifcc93}",
+"}</!!'>;--->,~///~~)),%#@$*--,~<359cili9/-%%,|ioli515gmqk75gmquqmd1|5c3/{/3iwAytlgf9566862259dflptwwwwywtpicbc999fnppooihdehehebdjnuxzBGGEEFFzzvvvssmmmmheeeeeddddddbbbkkmrpvxxDDEJIMMMMMMMNNNOOOONNMMMJJJLHFFFDDAzxxxxvvvvvrrqswyqmmmmmqnoolnppkggmquqqific953}",
+"3|1/{';-*--**;>)/////~>%#%***,~|||||3cooc/-*-~9lpoi59giqmg40mmppqi3<|00|{~19pyAytif9566762223099dimopppppolfcc988biooolihhhbgbabbgnrxzBCGGCBBzzvvvsrmmmmeeeeeeedddddbbbkmmrvvxxDDFIIIIMMMMMMNNNOONNNNMMMKJJLLFHFFDDDzzxxxxvvvvstwywmmmmquonjjjnmmkgkmqunjefd967}",
+"253|_{';**-*&%*-,~<<||~>%*-->)/<33|</|cll9/,>)3lppof9fkqpi77fmqpumc|<5d3_/<5itAAypid76266|}1|1|4509d9cdgklkiif9669flomligbhbbhb8bbkrszzzCCBBBBzvvvvrrmmkheeeeeeddddbbbemmrrvvxxDDIJJJJIIMMMMMMNNONNNNNMMMMJJLLLHHFFFDDDzxxxxvvvyyywummqquujeehjmmmkkkqppoieb963|",
+"}55531/)>--*=%&%*-~<35|~>>,,)~/|5995|/|9fc|~))|iptpidflqqmd7dkouuum9|7dc3<~|dowAAwoi9311||1__(__37777750ciillf9268cjlollihcabaa86ejmqxzzzCCBBDzvxvvrrrkkhheeeeeeddbbbbkmmqrvvvzDEJIJJJJJIMMMMMMNNNNNNNNNMMMMKLLLLKHHFFFDDzzxxxvyBAwtsqquuqheeedgmmmkkipppmiida31",
+"2359993<~,>-=***%*>)|99|~)~/<<|59fff9|<|59|~))<ftwtoiflqqqk99gmquuqi55dfd|/_7dpyAAtog0341_<__(((<1341144359fig6268bfilmlifcbaaa88bjnquwzzzCADBDzxvvvrrkkkhheeeeeeeebbemmmprvsxDDEJJJJJHJJIIMMMMMNNNNNNNNNNMMMMMLLLLLHHHFFDDzzxzyBEAtuwuuqjheeeddgmmmjjmpplllifc3",
+"1}|3595|/)>-=*&%%%%>)|c9|<|335cfc9cfic5|373~,>~3pwwtpllqqpmicgkquuuof0cif9</<5gtyAwpod731_((]:]]^[:__(___140f964269ciiilihb88a622aehnuxzzzzAADDzxxvvqrrkkkhheeeeeeeeehhmmrrvxxDDEJJJJJJHJJJMMMMMMNNNNNOOONNNNMMMNMLLLLLHHFFDDCzzCEBwwAuumheeeddddkmljimptpoooif0",
+"3::_|595|/)>=%$####%%,|95559cfllifffilf9355<,--)9ptwtppuutpmgilqquuulddiif5<_|0qwAytplf91^]^^^[::(]]!{!{{(159a2}26abfgiiigbaaa2226hhlruxzxzzADBDwuuvvrrrkkkhhhheeeeeehhhrrvvxxDDFJJJJJJJHJJIMMMMMMNNNOOOOOOONNNNNNNNMLLLLHHFFDCzCEEAAAuqmeeeeddddgklonoppppomif0",
+"d56359cfc9|<~,=%$####%>/||9flpttpoollllf5593/>*-~9opttuuxxwumikmmqqpplfioic3<<4ipyyytog92[{!!^^]::^]!!!{{(|462}}228cffiiifc9aa2}}68hnouxxyzzCADDAuuvvsrrrkkhhhhheeeekmmmrrvvvzDDEJJJJJHJJHJJIMMMMMMNOOOOOOOOOOOONNONNNNLLLLHFFFCCHIHEAqmmeeedddddgklooompppomiii",
+"pigfccfiifcc5|/)>*%%%$*,))/5lwyywttttpoid955|~>-,<9iotutxzywtmmmmmqqpploqof951|9lwyywoi93[^^!!!^](^]]^{{(_1||2}2268bffkgigc0082}}6ablnrtxzyzCABADxuuvvvrrrkkhhhhhmmmkmmrrrvxxDDEJHDEDEEHJJHJJMMMMMMNNOOOOOPOOOOOPPOOOONNNLLLHFFECIIIAwmmmeeeddddggkinonmptwwttpt",
+"tpllc99cccffc03<~))>>->,),,/9oyAAyyAywtpli953<)>,/39copqtxxzxuomqqmmqqopqplg9547fpwAytlc6}:^^!!!]]^]^(____||<}22270dfiiiifc9071}}28bhnqsxzxzzCADDyxuuvsrrrrkkhhhhmmmmmmrquvxxDDEEEEEEEEEJJJHJIMMMMMNOOOOOPPPPPPPOPPPPOOONNLKHFFFCJIHztmmmeeeddgggggeiopptABAAywt",
+"tolic57555555953</~))))~//)~|ftwABBBBAAwtpi953<~)/355fppquxyxuqmqqppqppppppid9730ipAAztlc641_{!^^^^]^::_<<<__}22669cfiiiifc9071_}2aahjpqpwxzzCABAyyxvuvvrrrrrrhhmmmmmmrprvuxxDDEEEEEEEEEEJJJHJKMMMMNOOOOPPPQQQQQQPPPPPOONNMLKHFFEGEBtsmmmeeedgggggghlpttwAEEAwpp",
+"poigc7311<<<|3|3||/~)),~<<<|3copwAAABBBAAwpifc5<~/|539oupuuxwupoquqpqttutxwpid0559lwAAAulc03|/{{]^]]]]](_(___}|7699cilliigc9741__268hinqqttxzzCBBDyxvuusvvrrrrrhmmmmmrrrvvxxzDDEEEDDDDEEEEJJJHIKMMMNOOOOPPQQQQQQQQQPPPPOONNKLHFFECCzwspmmmejgggggkknotwttwABAwtp",
+"lmkc95|__///~//<<<//),,,~/<|5foptwtptyBEEBytpof9|/|559iuutuxxxtqmqppqtutwwywpifc99fpABBApif97|/({^]{]]((_(<<_}3559ccfiliid9074___1aabhkrrquxxzCCBAAyxvuvsvvsrrrrvmmqrrrvvvvxABEEDDDDDDDDEEEJJJHKLMMNOOOPPPQQQQQQQQQQPPPPONNMKLIHHBzvvsrmmmjjggggkmqppptpppwAAyto",
+"iik987|/{{)))))))~~~~,,>,~~<3copttofflpABEEAywpi933999fpwuuyAAyuppqppqppuwyywoigfdflwEEEAwoic93<<:[::::<__11|23559ccfilifdc954_(_128bhgmrqsuxzzCGADAvxuuvvvvsvrvvvqqssvvwxxADDEDDDDDDDDDDDEJJJJKKLMMOOOPPPPQQQQQQQQQPPPPOONNLLIFFBzxvrrmmmjjggkmpppqnoooooptyyto",
+"ifgd52_~!!,,>;>--->,)),,,))~<5fqttogccfltAEEBAypic99fiiptwuwzAzxpqpuqqppppwywpiffifgpAHHEAwoif954}|}<<<|1_|__}|3659cfgiiffc951_({}47bhhjnruuwxACCAzADvwuvvvvvvvrvvvqsvvvvxzDDDDBDDDDDDDDDEDEJJJIKKMMOOOPPPPPQQQQQQPPPPPPPOONLLIFFFzzvvpmmqjjgkmpqpqmlnlollilpwwp",
+"lfdd961(!!';;=*&%&%*->>,,)~)~|clppofc99cfpwABBAytlfcfllltwwxzCzyuqpputpppptyywojfifcitBHHEAplfc953}:<<__<_<<}123559cfiiifgc95}_{{_47ahhjmnrpsxwACCzAAyvwuvuuvvvvvvvvvvvvvxzDDDDDDDDDDDDDDDEDJJJIKKMMOOOPPPPOOOOPPPPPPPPPPOONNLKIFFAzvvsuqqjjoqppqmmmmiiiiifhipwt",
+"oifdd94_{!'>;-*&$$$$$$%*-,~~/|ciopi953359fptwAAyytoilpolpwyyCGCzwtputppppoqwyywmmlifflwEHHBypiffc93|}:<_||||2355599cfiifgff92:^{{(120hhhjnrrstxvAzCAADyvvtvuxxvvvuuvvvvvvzDDEDADDDDDDDDDDDEEJJJJKKMMNOOOOOOOOOOOOOOOPPPPPPOONKLHFECzvvstqqqppqqqmmmmkeeehhebhltt",
+"tlgdd56_~!'';=**&$$$#####%>)/|clpoi5|<<<|9iptwwwtollottttyAABEHEAwtttupmqpptyAytoiiffipAEHHEAtoiikf953|1||4355555cccffiigfd52[^!![1700hejnnrrstvzAACAzADvywzxxxxvvuvvvxxzzBDEDDDDDzzDDDDDDDEEJJJKKMMNOOOONONNNNNNOOOPPPPPOOONNKLHFEzzytuqquttqqmmmkkggbbbfebbfot",
+"poid055_/!'';;*%&%$$##@@@@%->/5lppi9|/~)~<5ipwwwti9cipwwwyABEHIIGAywwwuopxwwyAAyumifilotBEHHEEypppolf905755599090cccfifffc96}[^!!(1400behjnrrstvyyzAAzAADADDAzxxxxwxxxxxADDEDDDzzzxzzyDDDDDDEJJJKKKMNONMMMNNMMMMMNNNOOOOOOOONNLLHFECzzvtwuxtpmmmmkggggdbbbhbbafo",
+"polfd071_{'';;%&%&$####@+@#$%><cpplf5|~,,)/5itwAxm5|9fotwwwAEGKKIGCAAAyptyAAABAAypliloptwBEHHHEAwwttplifccc9cc99999cdff9c952}[^!!^_270deejnnrrssvyyAzAAAADADAAzxxxxxxxzzBDFDDDzzzxwxxzyDDDDEEJJJIKKMMMMMLMMMMMMMMMMMNNOOOOOOONMLLHFFzyywyxxppomkkgggddddbbehbabi",
+"lpiicd74_/)';;=%$$$###@@+@##$%>|gifc93<),,)/3itzAtg3|5foppotyBJKKHEEAAzywACEEEBBBAtooppttyBEHHHEBAAwtppoliiffcc95559cd990962}[^!!^_1700eejjjrrssswyDzACCCAAADAAzyvxvxzADBFDDDzzxxxxxxxzDDDDDEJJJIMKMMMMMMLJJJJJJJIJKMMNOOOOOONOMLHFFBzAyAxxuookgggddeddddbbeehae",
+"flligd541({!';;%&$$####@@@@#$$*!59953|<~~~~~<5itxxtf430floiitxAEJEEBAAAAtwAEEEBBBAytpoopptABEEEEEBAwtpoolifffc9955550d050762}[^!!]_1700deejjnrrssvwyAAACGGACBDADAzzzzADBFDDDzzxxxxxxxxxyDDDDEIJJIKMMLMMKJJJJJJEEJIJJLLLNNLLNOOOMLKFFCCBEAAuunjjgddddeedddddbhhbb",
+"biiiid061/{!''-=%&%$$####@@@#$%'|95</)),)~~//|9owAAtf99ciiffmtwAGEBAywwwpopAABAAyywtoicfilpwyABBBAywpliifc9c99995999fd900532}:^!!]_17709eejjnnrqsvwvDAAzCGGGGBBDDADDDADFBDDzzzxxxxxxxxxzDDDDEIJJJKLMMKIJJJEEEDDDDEEHILLMNNLNNNNNLLIHFCEEAyuqqjjedddeeeeeddddgfeh",
+"hfligd095_({!'>;%&$$&$$$##@##$%;_57_!>-=-,)~/<3ftxBAuifiomigipwABGBzwtttmfimwyywtppoic5590cipwwwwywttoiifdc957590cfiifc9d95|[[]!!^^176adeejjnnrqsxwvyADACGGGGEEDDDDDDBDDDBzzzzvxxxxxxxxwDDDDEEIJJMKMIJJJEEDDDDDDDDFFFHLKLNNNNNNNKMIIIEGCyyqqmjheeeeeeeeeedddgkhe",
+"eciiid999|</{!,;*%&$$%%$#####&&=!351{-**->>,,)/3iwACAwptttpoiluyBECywtppmg0dipuupmomkc953459iutttttttpoliigc9009cffffcccc9531[^!!^^1470abeehhnhqqsxDvAAAzCGGHJEEBDDDDBDADzxxzzzxxxxxxxxxzDDDEEJIJMIJIIEEDDDDzzxyzAzDDEFHKKNNNNNNMMMKIIGCAxummmeeeeeeemmeeeedggkk",
+"kehffd99971({!'';&%&$$$%$###$&&&,|77(;*-,,;--;;)|fwABAwwyAywpmpxAEEAxwtpok05cimliiiiigc05337doutpptttttpppoifcccccc99599905531:]]]_177a0behhhhhmqsxDvyADzGGHHJHEEBDDDDDAAxxxxzvvvvuxxxxxzDDDEEJJIJJIJEEDDDzxxxvxxxvxzDFHHLLMNNNNOMMKKICCAtummmmeeeeemmmmmeeejgkk",
+"mhccffd5903_({!,;***$%&&$$$#$%**>/77<,;,{,*%%%%*>|iwAAtptyAAywtwCGJCzzwtpog59fkkkgikgfffc959cipttppppttpppplifd9995537535433||1}:}|45799aeehhhhmqvuyDyAACBHJHGGGEEEDDADzzxxxxvvvvvuvxxxxzDDDEFJJJJJJEDDDzxvxvsvvsvvvvzCDFHLLMNNOOLMMLIECyyusmmmmeeemmmmmmmhjhjnm",
+"mlfdgfd06873<{!',;**&%%&&$$$%%---)104),~_!*$$&$$*,|owAwlltyCBAwyACJJEzAwwtoc0dkmqmiiiffkifcccfmptwtpolooppolifcc955333|||1<__<<}}35509dbeehhhhhmqvuyDDyDCEHGHGGEEEBDDAzxxxxxvvvvvvvuxxxxzDDDDEJJJJFEDDDzvxvvvvvvvsvvxzzzDFHLKMOOONNNKIEzvvspmmmmmmmmmmmmmmqqqnno",
+"policfd02505|_{'';--*=%%&&&%%=;;-,<75()~<_'=%$$$%*{5pwxofityAAyzAAGHEAAAwtui75gquumkkfccffgcd0diopppliiilooliiffc95531_<</({{{{):}79ccffjjhhhhhmqvuxyDDBEEEGGBEEEAADDzxxxxxvvvvvvvvvuxxxxDDDDEIJJEEDDDxxxvvvrrrrrrrrvwwzzDFHKKNOOONNMIFzzvrrrmmmmmmmmmtwwqqssuup",
+"ppoicdf0659531(!';;*-;==%%&&=;;;>>{45<~~(||~>=&**%>{9pxtifowyyyyyABEEAyzwtum0|5gquqggd73570d0579fiilllilloolliifc995|1|<//~~!!,'':}59cfijjjjjmhmqvuxyADDEEBBBBBBDDAAzxxxxuuvvvvvvvvvuxxxwDDDDEEIEEDDDxxxvsrrrrrhmrrrrpwvzzDFHMMNOPNNKIFAzvvrrrmmmmmmqwwyyyuuuuuu",
+"pupiccigd9d9531(!';----;;%%**=;'>>!|7|/~~_33(),>-%=;/cuuiffotxwxxzBGGzwxwttti415iomdd051<14507770ddgfiilolollliiic953||<_{~)!'';'{:|0dcfjnlolnnqqvuxyDABDABBBDDAADAxwvuuvvuuvvvvvvvvvxxxxzDBDEEEFDDDxxvvvrrrkkhhmmmmrsswvzxDFIMMOOONKFFCzvvrrsmmmqqqxwyCAABAxuuu",
+"xupoffiikccgc541_)'-;--;>=%%*=;'>>,/44_~!{390|<{>;=*,|lpofciuwutwzABGBxttuutp9<<39c90901_(_|3777590099cfilllooooolif953|<(~~)';;;'^[400eejllqmruquuxyzBAAABDADDAADwuuvvvvvuuvvvvvvvvvuxxxzDDBDEDDDDzxxvvrrrmmkkhhmmmmmptvvzzFFIMNOOMMIFDzzvvspstqqqwwwwABEEBAAxx",
+"wtpooiiiliiiif997</!'>,,,>*%%&=;>>'{451~~/7mpi9|)>**>(9opkdfpwtutwyAEGAuppptuo5</1500993<(~_1|47500099580dgloooooollifc53|/~),';;'{[}0bbehjjnnquuuxxzzBDADDDAyDDxuvuuuvsvvvuuvvvvvvvvvxxxxADBDDDDDzxxsvrrrmmkkeeeeemmmmspwvzzFIKNNOMMIFFzzvvwstwwwwwuuyABEHBBAAx",
+"urmolfcilliiiiffc93_~~~!';*%%&&=->,!|7|/~|dqtpoc|!;->{3kppfciutttxwzAEBypooptug4{~_47007|_({(_1359000077670cfiiffffffffcc93|/),';!{_}70bbejnnnmqvxxzCCCBBBBADyywtuuuuvvvuvvrvvvssvvvvvxxxxDDDBDDDzxxvsvrrmmkeeeeeeeeemmmpsxwzAHKKNMMLIFFCzzvvuuwwwwwwuACHHIHEAAA",
+"qlkllicfkmiiiigccc95|</{''-*%&&=*-;'/34/~|coqpog0|!,>!<9ouodfotwwxxwyCEAwpommpqf|~/<3555|_{{!{<|35999d97243230995595555599995|/~){{<}20beejnjjmqvuuzCCCDBBDAyxtvuuuvvrvvurrrrvvqsvvvvvuxxzzDDBDDyxxxvvrrmmkeeeebdddeeemmmptyyzEIFKMKKHFFEzzzyzwutttwxABEIIHEECyw",
+"qqomloiffilkifgc9553|<//~)>-*&&%%*-'~|3<~<3dlf09d9|~!!~|dpukciptwxxwwzCCywpmioppc|<_|1353_]~)){_|359cdd06||2122|3||||<||||459553|||||60dejnnnmmmquuxzzzCDDAzxuvuuvrvvvvnnrqrrrvvssvvvvvxxxyDDDDzxxxvvrrhhmkeebbbbddddeeemmttyAEEHIIKLLHHFAzzzAyststwCEHJIJGCAzAw",
+"wqomolifffkifdfd0743|<////~)>;=%%*->!/4|~/<507||499|{!)(3mtpfdltwwxuwxzCAwtpiiopm91____471(~]))~/<159dgd967321|||<<<_((/(((<<|3359999d9dfhjnnnqqquwwzzAAADzxuuuurvqqqqnnnnmrrrvvvsqvvvvxxxzzDDzxxxvuvrrhhheedbbbbbddddeeemmstzCEEFFLLLHFFCzCzAvvwvzCEHHHGECzzzzA",
+"wqomlilfc9dggddfd0333|</////~''-**-;'~11(~/|7|13|155_~)~_dutmggptwwwuwyzAxupoimqqi01_/(174_{!'''!~]<79cgd9056332}|<<_((~~~))~{~~<39fiiiilljnnrqruuxxzxywyxxvvuuvsvrvnnnnnnnrrrrvvqqvvvvxxxxyDzxxxvvurrkhheeddbb88888dddeeemqxyBCCBDHHHHFFFCCzyxxyzBEHEGCEFBzzzvA",
+"Awunkefd990ddd09cc9533|_<<<<<(~,>-;'')<|/~/|4|7d03354<{~_5muukdiqutuutxyzwtpollqupf3<//_75<~!'''',']_39ccc006573|||<<((~~~)),,'>,~|5cflopppprrrqvuuxwxxxxuuvuvssssnnnnnnnnnmrrrvvvqvvvvvxxxzzxxxxvvqqrkhheeddd88888888ddeeqquyyAyzzFFHJHFEEzzxyvzBEHECCzCFFBzzzz",
+"Awqnkhb9aa3589575093|||||||||<<~~)',))/||~~|449mqf5573_/_4gtwpgflpututuxyxupomlqppoc|<<|75|/)'>>''''~_|0900765342||||<_/~~)),>;=->)<|5clopttttppqvxuxwxuuvvvvqvqrornnnnnnnnnrrrvvvqqvvvsxxvvxxxxvvvqqmkkeeddd8886666888ddhjquuywywxDFEEFHFEzzzvABEHEBCCzCFFFBzzC",
+"Axqqkhab9644307||774_//<_|||3||///({{{/|4</<79dqupld051__40luxodfmpuuttuxxupmiilppqm9||3707_{,,>>'>'!{_3a9006332}<<<_<<<</~)>>-==>'~_25dioptwwvwuutuuuuuvvqqqrrnnjlnnnnkkhhknrrrvvvqvvvsxxxvvxxssvrrqmmkeedd888666666688dgjnuusstwxxDDEHHFDCzzzGEHHGCCzCHFFFFCCC",
+"zzwqjkhb88634704|4751~~~~~/<|33||<</<<<|73<<49glpttod971117gpxpgcgmquuuttxwpmkdfipuql9779dd7_!';,,>>')/:77657633|}__<(<<<</~,>-*=>,](<|7cfiostywyxxwxxussqqqqnjnjjjjghhkkkkkkrqrqvvqvvvvsxxvvxxvsvrrmmmeeddd886666666668bggopwuqurvxzDEFEFDEAzCGHHHGCCBCFFFIFFBC",
+"CAwsnkie999535873|703_)),)))/_1333<//135093130dfptwtoc95447fmxwlddglqtttutwupmd99ippqld00dkg4{!''',,',!(14a732334|_</((~~~)),,>-->,)/<|35bginpswwyzxxztvuvqqjjjjjjhhghhhkkhmmmrrrrqvvvvvsxxxvvvvvrrrmmmeedd8886666666666bbgmppummpvvxzACFDDDCCCGHGGCCzCFFFKFFHEE",
+"GEAwxtqijfd0539d73799|~),,,,),{_|53</<|9fgc5509glpuutlc9770fmuxpg0dklquuqpttqmic59iqqqmf9gmmc1{!,''>,'!{_|22322|4|__//{),,>>>>>--'']/<|25dcfinnpttwxxzzxusvnnnjjjhhghgghkhhhmnrrqrrrvvvvvvuuxvvvvrrrmmmeedd886666666666a8bhmqpommhrvvzzzzzDFHHHGGCCzzCEFFFKKIFII",
+"NMMKIBzytpolgccfd97905<~,'>,,>'')<||<<<|0iic00dfiikmtpi9900imuxwpfcgkmptqqqqupoi539iqppoikmmk9_{',',,',{:|42732|1<_(]{~),>-;*=&%*>'~_<|279cfijjoppqsxxzzwwsnnjjghgghhgghkkmnnnutpsurvvvvuvvuvvvvrrrmmmeeedd886666666666688ilomnjmmppvzzzzzAFIIIECzzzBEIIIFKMMMMN",
+"POPPONIIHEAwtoillidcc93/~',>,,;;>>)/||<<3clkfgiif95cimoicddioptwtmfcfmppqooqqqold3|9fmppppmqmg9</,,'''!!(:}275221__(]]),,>;;=&&$$*;)(<3359ffginnoporvuxwtupppohgghgghghhhkhjknrputttutttvvvvvvvrrrrmmmeeddd886666666666688ellmgjemmstwwvxzzBIIIHBACBEIIILMNOOOOO",
+"PPQQOMIIIIEBAtooppliifd3<{'>,,,;--->)<1||5fliilol9459gmolmklmquxwulggippuqomqqoom91|0imqpppupof7|~~!)!]{][:}652641_(]]'>,>;==%$##%=,)]<35cfffilnoonmnrsrrspppmmkkggggggghghkhkrrqtuutwwvvvvvvvvrrrmmmmeedd88666666666666aafiifhgehmmtwvvvzzCHIIHECEEIIFMNOOPPPPP",
+"QPOOKEAzAAwttpiiloolilof5<~',,)''-*--)/|359fiiotpi9339fmppppommtwxtidfkoqqqmmmmomm0|40gmquttupi97|//~!!]]]:}473a71|:]]''>--=%%$##%=;,]/|29cijlloonnqqqqnqnnojmmmmmkkgggkkjkjkhrrrusuwywvvvuvvvqrrrmmmmeedd886666666}}}}68bfihebddejmmsvvvyzCGHHFFFFFFKMNOOPQQQQQ",
+"POMKEzAwuppligf9cfiiilptl9|/),)))'-**>)/|55cfiotwpf5459iptutqplqxwwqgdgmqqpmmmmlmmk5159imptuupmg77|<(({{{[_[}26672}:({]'>-*=%$$##%=->!~_170dijlororoqrrnmjjjgkkmmommmmmlmnmmmkrqrrptwyywxvuvvurrrrmmmeeedd886666666}}}}28biih8b8dgjmmrprvAACGCHFFFFFKMNNOOQQQQQP",
+"NNMIHEAwtpoifiid9cgiilptpi9|(~~~/{,;;->)/|5cfikpxwofc09cmtttqqolqwwui9dfopppmmmkkmmc||5cgoqputqic5311<_((_:[1a5a731<]{{''>-*&$#@#%=;,!~::479hfioprrrpqqnnjhhhggkkmmqpppoomqqmrrrrrpvxwwvvwvvvrrrrkmmmeeeddb8666666}}}22268iiba68bggjmmrptzCCCzAFFIIKNNNNOPQQQQPO",
+"NNNKIHBAxwtoooooliiopoppplc5||//<</!,;'!)/|0gkiltwwpifffmuwtpuqmqxxwqg0cimqpmlmmkklf5|7ddfmqqupoc77713111}_}}2777731_({)'>>-*&#@@$=;>!]_<435dbgilnnrprrnjjihhggggklmpppqpqpprrpqrrsuvwtvvvvvrrrrqmmmmeeeddbb666666}}}2226bccc8666bggemmstwyBAzzEFKMNNNOOOPPPPPOO",
+"OOONNMMKIHEEAywwwttttwtppof053|||33|{'')~/_3cillotutpommmuwtqptpqtxxumd9ckmpqqmligki91|7ddgkoppoi97733377742}2677a311_{!'>--*%$#$%==>'{/:4750cbginnnmnnniijggggggkkkklmqqutttrqprruvwutvvvvvrrrqmmmnmeeeddbbb666662}}226acc9666668egehmnwwyzyyzBFMMNNOOOOPPOOPPP",
+"QQPPOONMMKMKIHHEEAwtwyxtppl0533|3553|////(<<3flloptwwtpquwzxppuuttxwxqf90dkpqqmmkgggd7<|0dgglmolic077|335066aa65723|1<({)'>-*%$#$%=>>'~~_4790bbgginnihnnjihhggggggggggkmmptttprprpsvvsvvvuvrrrrrmmmmmeeeddbbb6666622}22aacc862}6a8hbdemqquwwvyzCIMMMNOPOPOOPQQQQ",
+"QQQPOONMKIKKIIIIIIEAABAywwtl53||3|33|<<<||</<5flmptwwwtttyAAxttxwuuxwtld750ipqommkddg0|<39fgikiffcc0731|470d8a6a7aa11_{~),;;**%#$==>,')]_1359dddfhjjkhjhhjgggkgggggggggkmqqtttttprxuvvvvvvrrqrrmmmmmeedddb888a6222}2}}}26cc662}2688bdgjquuwtsyCGIKMNOOOOOOPPQRQQ",
+"QQQQPOONKIIIIIIIKIIIHHHEAAAyo9333<</<<|||4<(~<5iopwywttuwAAzzyyyyywwxwuf535clqqookgdd03<_40fikgcc999997||47acb9a9074|_(~),>;;=%&&&->''{/_1457bhbggijikhjejdfgkgggggkkkgkkmpprtstswvvvuvvvrrrrqqmmmmeeggbb888222}}}[[[[}26bc62}[22866bgjnuuqstzBJHKNOOONOPPPQQQQQ",
+"PQQQQOONMKIIIHKMKKKKKKKIHEEEAtig9|/{~<|353</~{|9iptyytpptyBCAAAAAzyxuwwm9437gmqqmmkd005|<<39iiic975579033247dbccddaa|1_/~'>>==&&&*--']~(_1375abcfikjhhejefddgggggkkmkkkkkrrnrrrwwwvwxvvvrrrrrrkkkmeeddb88aa2}}}}}}_____16b96}}}}22666bkoouqmsyEEHKNOOOOPPPPQQQQQ",
+"PPQQPOONKIHEEEHIKMKMMKKMKIIIIEypi5</{~/|553</(_3clpwyytpotABBBEEEBzywxxug7439imqpmmkd7741<|5dfff9005579967276abccd9a4|<(/),>-*&$%*-;,)](<1357acdgfinhjhjgfddddggggkkkkkkkmooopstxwxyywxrrrrqqmkkkeeddb888222}}___(((((([79562[[}2226aekmooqquABEIKOOOOPPPPPPQQQQ",
+"PPPPPONKIIEBAAAAEIIIIIKKMKKKKIEApg5|/~{_|7974|<19gltyAyplltEEEHHHGEzyxywqc3379mqqqmmg05731147dcgfcc03790d05a7888ab07241_{~,;;*%$$%->,)(/1|350ddcgfinjjnnfgddddddddggkkkkoonnnssvvwvyywtttpprmmmmeedbb88a2222__(({^^^!^^(|774_[[}}2}28bimonqquAAEIMNNOPPPPOPQQQQQ",
+"QPPPOOMMIEAzwtppwwwtyEHIKKKKKMKHBpic3({!(<7907770diowBBwoipyHIIHHHHEzzyxum0445cmqqqmkd033113500diiic5750d998008a8aa722</({!,>*&&&&->,{(_11550cbbgfgjhnnqiigddddd0ddggkkooonovsvvuvvvttutttsmmmmmeeddb6622}}___^^^^^^^^^[}32|(_[}}}}26bflmniuwxAEKKMNOPPOOPQQQQQQ",
+"PPPONMKIHEAwwttpplikipwEHIKKKMMKIEwoc|(!!{_7999ccfiipAAypootBIIHHHHECAyzwug7345gqqqqmk0744|43570diif97570dcdcdc8bac0522_({!'>-*%%=-'']{_|450acbggghjhjlmllgggddd0dddggmonmnrvsssttvsussttqmmmmmghggb882}}}_((^^^''''''!]12}:{{_:}}}26bfimklpxwBIKKKOOOOOPQQQQQQP",
+"PPPOOMIIEBEyywwtpogc9flpwEIIIKKMMIEwl93/{)~<59cfilllowAwpoopwEIIIJHGEBAAAxqd3439mqqpqmg74414409779cfcc090dhcfegbb0a857}}({{'';*%%=;'!{{_<159abcggiijhhfiiilggdddddddgiljnlqvrsstusrsspummqmqqmmjegbb886}}_(^^]!!''','''{<||]^!(::_[269eeikmpwxBIKKMNNNOPQQQQPQPP",
+"PPPOONKIIHEAzywppolf09ccflyEIIKKKKHApi93<{{/<39ciopptyAAtollpwEHIHHEEAAAzAum0775cmqqqqld741347007359dgddddd9figgbbb8a53}:({!';;===;'!{{_<1789cfggggjhhggfiigggddddddikiljnrqrsvvrrrusmmmmmmmqqmjggb88622_(^^{'','''''''{_|_{]^^(:__26c9fimqtpzEIHKMMMNOPQQQPPPPP",
+"QPPPONMHHEAyxwttpllfd99999iwBHIKKIIEwplf92:::269ciptwAABypiiopwEHHHHECAAzAzumc075iqqqqpkc743479093379fffidbdhejkjhhbaa7|[[{]'';;;;''!{(_12a8a9ggiijjhgggfggigggdddgiilkinmmqvvsrrqrmmmmmmmmmmmjjggb88621_^^{!''';>;;>;'!<_/]'^^((__<69cfciqptBHIIKKIMNOPQPPPPPPP",
+"QPPONKFCCAuwttppollicdccdcfmtyEHIIIEAtpoic5}:}268clpwyABAukfiopwEEHJJECzAzAzukd57dmqqqqqm0333570d07359fgighgbejkkjehbaa74[[(!';;;;'!{(__22669dgggfjhhgggggffddddggkkmlnmnmmrrrnrqrmmmmmmmmmmmmjjgea8622_(^^!'';;--;;--,)<<('''^]({(1688chnqqwBHEIKIIMOPPPPPPPPPQ",
+"QPPOMLFBzwqqnmlloiiffcccfiilptwAEIIIEAywtpi9714370fltwyABymfflptyBEEHHEAzAAAxpfd00goqqqqqk055670dd95770gflkggeejkmjjhbaa74[[^'';;''{([[}2260cdfggjjhjgggffgfgfhhhiilloqnnnrrvnnokkmmmqmqmmmmmmjkkebba21_^]!!'''--===*;>)/</'''!]^{(_3a8ciioqyEHEIIIKNOOOOPPPPPQQ",
+"QOOONLFCzvsmjghbffccfffffilloptwyHIKIHBAyytof05770dfluyABApkgiptwyAEHIHCAzzAzwoddddkoqqqumgd90070dc0570dcimmkjjjjkmnjha884}[^^^!!^^^[[[}2799cffghejigggiiggggggffhilorrnnqqqnllhkkhmmmqqoqqqqqnmkjh8661_^{!''';-*****->,]<~';'){{!{[3389cnnqAEHHIHHMNONNOPPPPPQQ",
+"QPOOOLIFzvsmedgbab989cfiifiilptwwAEKMKIEBAAwoi9550dfimwAEEyqiiotwAAAEHIHEAyAAwtlcddgmppquumkcd999dggd00dggomnmjjjkmmjjjb864<_^^!!^^^:<13779cdgiheeehhggggffdhheijjjnrrqrvrrrnnhhkkmejnrprppqppqqmkidaa4[:{''';;--=&&&=;,/<~>;''!^^^_|388fllpAEEIEEIMOONMOPPPPPQQ",
+"QPPOOLHEzvsmmedb886868cfffiiilptwyAHKMMKHEAwtplfbbcffiqwBHEytppptyAAAEHHHBAAzzwuifgilqqquuupigd9dddgggddhhomqpnknkmmmljeb8621(({{((_|17790cfhhghheeheeehjjeheeheihjnonmrqppnnhkkkejjorpspppppppqoikfb05}_/!,>;--==%%%%;'{<{>;''!!^^:<158cfltBEHIGEKNNMMMNOPPPQPQ",
+"QPPONLHFzvssmed8a662a689bccfiilptyABIKMNMIBywwtpibdfiiipyEKEAwpppwAAzAEHHGBAAAzwuiiilopuuuuupkcddcdgggggjkmmmqnnnnmmmmnjea662__((__14479acefffhhfeehhhehhheehhehjjnnnmmqrrorkhkhhhjnqqqqppprpppmokjgcd06|<~!,--=%%%%$%*>{/);-;,''^^[:159cfltBEEHBHMNMIKMNNOPQPPQ",
+"QPPPNLLFzzvsmeeda666268b988fiiilpwyAEKMMMKHByyywplfffiiowAEIHBwpopyAAyAEEHGAAAACytolmmpuxtxxtuidddgggggjjloomnqnnnmmmmmjefa622}[[}2266a8cbffffhhhehhghehehehhhhjhjnnnmmnqnnhmmmjjknmqqmmmmpprppmmijcc0763|<~,>=*%%%&&%*>)()-->'''!^[[:40cciwBEEECINNKHIKNNOOPPPQ",
+"QPPPNMLHCzvsmmedbb66886a9668fppptwyAEIMMNNMIEAAytplifiilowAEHHBwttyAAyyAEEHBAAACBzwqlmqxxxwxxxpkgggiggkkgilljmmloommmnmmjhbba6}[[}22a6abcfffffhhheehhghhhehhehjjjhmnqnnnjnkhkjjkmmooollllmmnnlnmifea90221||<~'>*%&&&&&&-)~'-=-''''{:::40c9iyEEByBIMMHGIKMMOOPPPQ",
+"RQPPOMLFFzvsmmeddb6668abbbadiptwwyAABHKMMNNMIEAwtpoiiiijiptyEHHEAyAAAyyyAEHECAyABBAyuqquxzyxxzxumkkkijkkkjjjkkmjnommmmmmmhbbba2}}226a89bhffhffheeeehhhheeehhhjjjjnnrrmmmlnhheegklpolijhhjjkkknnkhhh8a3}1___(/{,>*&&&&&&-)~'-=;''''{_:1250clABEAwEKKKEGIKKLOOPPQQ",
+"RQQPONLIFzvssmeedbb6666a88bciopwyAAABEKNNNNNNKBytpillllifipwAEEEEEBAAywwyAEHHAAzABCAxpmpxAAzAzzxxqmmkjjkkkjjjhmmnnpmmnmmmmhha886688bbhfjieffhffeeehhhhheeehehjjjjhmmmnrlnhhbhdbiiolliieeehhkkkjkeb666|[_(({{~{~,>-&$$&&;)~!=*-'''){(_}250coyAAzyHKIIEGFFKMOOPPQQ",
+"RQQPONLIEzvssmmhddbbb666889jloopwyyAABIMNNNNONKEypoiopoiffipwyABEHEEAwtwwABGIHAAAzCCzwuquyzACzAzzxuqnmmllljnhhkmhnrmmmmmmmkkeb86688bbbejiffefhheeejhhhhhhhheehhjjmmqmrnnghhbdbbhiiffc9ahbbbeegggeb6661[{{!)!)!)),'-%$$&;)~);*=-;''{/(}437cpyAAwAIIIIEGGIILNOOPQR",
+"RQQPONLHFzvvsmmeeddb88bbbbhimmmmqttyAABHMNNNOONKEypplptoiffotwAAAABBAwttwABEIIGBAAAzzzxtwwyACAzzzAyuqpqoonkjkkhmjnnmmmmmmmkkggb88bbehhfhifhehfehehhfhhhhhehhhhhhhmqqmmnnhhba88bebcbd8aaa8bbbeghgebb62_[{!'''>,,,',>-*&%-'~);*=>''')//_227cpwywwBKIEHEGGFILNOOPQR",
+"RQQPONKIFzzvummhjgdddbbbbhgkmmkjnpptwyyyEMNNNOONMEytppttpigjowyyyyAAywtptyBEEIIHEBBAAAzAyyAABAAAzzzzxtppppmmnmmqqnnnmmmmmmkkjggddgggechfjihfhgeehehhhhhheehhjhhmmrqmnjjhhba888bc9098aa66aa8bbhkgebb62_^{!',>;--->>,,-**;'~);-;;'''!((<227ftwtttBKHEEEGEIILNOOPQR",
+"RQQPOOLIFBCAwwqqjjgggdddddgknnijjqptwwwuwBKMNNOONKHBwwwwwoifotwwwwwwwttttwABEEIKIEEBAAAAAzBBBCCzzzAAAytppmqqqqqqqnnnmmmmmmkkjjjedgggejeehihfhhheeehehhhhhhhjhhmmnmqnnjhgba8aa8aa8aa4316666a8cbekhba62[^{!'';;**==;>>>>->,~)>-;>'''!~/<126fpwttwEIEEEEGHIIMNOOPQR",
+"RQQPOOMKKHCByyuuornkkgggddfjnjmmmqpttwwwuxAHKMNNONMIEBABAwolmptAAAwttpttttyAEEHKKIHEBBBAAACCEGGEECAAAAwttpqpqqononnnonmmmkkkjjjeehggejeejhhhfeheeeghhhhehhhhhhmmmmmnjjgb0a68a8a86531_111266aabbheba62}^{!'>;-=%%&%*->>,'~/~'-->'''!{(<<26ittppwEHEEHEGGFILNOOPQR",
+"RQQQPONMKECAwyuuuppprmmnjjhjqqnmmqupwwwywtuABIKMNONMKIHEBAtolnpyAAwwtppttptyBBEHKKIHEEEBAAABEEHIIEECBAywuuptuprprnnnrmmmmkknjjjeehggejhehihhfefhehhhhhhhhhhhhjmmmmmnjhgb086266873}[[:[__112aa8bhebb861^^!'>;-=*&&&%%=>,)/</,-;>,''!{((|39ittptwHHEEHECEFIMNOOPQR",
+"RRQQPONKFCzzwwuuqnnnnnooonqqqqmmmmqppttwAwutyAEIMNNNMKKIEBAtoopyABAwtpooppptyABEHIIIEEEBAAAAEHIIKIHEEAAAxutuptttpprnrnmmmkknjjjedggghhbhehieffehehehhhhhhhhhjhkhhnnljhba8662aa53}:[]^^^^__12aa8bbhbaa1_^{!';-=*%&&$$%=;)(||)>;>'''!{(/|39iptppAIEAyBEGIFILNOOPQR",
+"RRQQPOLIFCzyzwyqqqjjjjnnouuquqtmmmqloppwxAyttwABHMNNMIHHEEByppptAAAywtpooppptwAEEHIIGEBAyAABEHIKKIIHEBEBywwttttttuqmmmmmmmknjjgddgbebbbhhehheheechhhhhhhhhhhkhkhhjnjhhba6622634}[:^]^^^^^(_12288bhba64_[{!'>-=*%&&&$$%*'~|3(,>>'''!{{(<39lppppAIEwxAEGIIILOOOPQR",
+"RRQQOOLIFFzyAyyqqmmmmmmmqquuyywqmmqnlotwwyywttwABIKMMIBABEEBwpoptyABAytpnoppptwBHHIIIEBAyyAEEHIKIIIIIEEAAAAwtttutuqqpqqmmmkkgggd8b88bbbhaabbbbcbbhhhdhhhhhhhhhhjjhjjhba8662244}[[{!]!]{^^^(_1228bbbaa41[{!';-=*%&$&##$&=,<3<~,,'''){((<49lppopAHAwxAEGIIILOOOPQR",
+"RRQPOOLLFFzzzwwqrnmmmmmmmmqtwyyuqqqqnpwyxyAyvtwABBEIKKHAAAAEAwpoppyABAytppoppptAEIIIKIHCAyyBEIIIKIIIIHHEECAywttutuqquupqqmmkkbb8668aa888aaa8bbbbbdddddddddddgghkjkjggb8662224}[[]]!!!!!!{^^(_122abba64|[{!'>-=%%$&&###&&>~|_/))!''!~((<39lpploAEAtxABGIIIMOOOPQR",
+"RQQPONLLFFEGCCAyqqqrqqqmmmpuuwyuuupupwyAAAAAAwwwABBEKKKEywwyBytpootyBEAytpqppptwAHKKKKIHEByABHHHIHIIKIIHHEBAxwttuqpopoppnoljhe8666a6aaaaaa880999dc9000aa0dddggggghhh8a862}221[[({,,',,'!!{]^__222ab8631:{!'>-=%%$&&###$%*)/</~~~',){(_|3coppooABytxACCHIKLNOPQQR",
+"QQPPOOLMKKIIEEBBAuxxupqmtpppwuwwuttwywyyAAAAAAywwAEEHKKIAwtwyywpomotABEAwppppttwyEIKMMMMIHEAABEEEEHIKKKIIHEBAzwtttppqljjjiiihba86222666a85667700000a6a6a8a0dddddhgdd86662211}[:{!'''''',!!!^^(_}26baa4|[{!',-=*%&&&###$&*>~/~{/(~'){(_|5coppooAAwtxyCCEIKMNOPQRR",
+"QQPPOOONMMKIEEAAAAzywuwttpqwvwttquwyABywyyyAABAwwyEEEIKKIytptttppoopxAAAAtpmpptwAABHKMNNMKIEBABEBGHHHIHIHEEEEBAyvwpponijjiffefb66222264434244226aaaaaaaaaaaaaaabddda066}}2}:::(]'''>;''','!^^(_}22aa6|1:{!',>-*%%$&###$&&>){)'~(/{~~(_|5coppooAywtxyCCCIKMNOPQRR",
+"QQQQQOPOMMLHHEEAAABBAAyywtxwvxptmqtyBEAwuttwAEEBwwBEHHIKKHytppopppopuwAAAytpoptwyyABHKMOONMKIEBBEEHHEEEEEEBBEEEBAywtppllijgeb8886626|14111}}}}222644477770aaaaab800a722}2}_[_<]!'>>>;;>''''!^^(_}26a24_[{!',>=*%&&$####$&-){)',{/((((/|5copplpwwptxuyABFKMOOPQQQ",
+"QQQQPPPONNMKKIIIEEEEBAAyyAAywwqttmqwAEEypolptwEEBAAEHHIKKKHAtppopporpuwzAAypprtwwwyAEHKMNOONMIHEEEHEBBAABAAABBEEEBAwwtpniec8662226434||::[}}}1|11111444377770008aa67a2}[}[[[:({'';;;;;;;;','^^^[}}2221:[{]!'--*%&&$$###$&=,)'->){{(___|3coppopttpsxuyABFIMOPQQQQ",
+"QQQPPPPOPOOOOOONMKKIHEBEBBACywpttmmuzEEyplfilpwBHEBBEIIKMMMIBwtptrpopqtwABzwsqppwwwyAEHKNOOONMMKHEEEBAzAAyyAAAABEEBBAtpoljca662}2|3||}}}}____<|:_1111}42277700067a622}}[_[:_:(!''-;;=-;;;;''!]^(_}2221_[{{''-=*%&&$$$##$&=>),>>''!(_11|39oppoptpoqxuyzzFIMOPQQQQ",
+"RRQQQPQPQQQQQQPPPOOONNKIEEBCAAytttqqwBBAtofcffowEHHEEHKKMNNMKEywttppputwAEEAyuqutwtwyEEIMNOOONNNKHEEEEAAAyyxywyyAEEEAywtolfc862<_((:[}21<:<((_______11144777776777a2}}[[[^[([{!,---===-;;;;''^^^[}2}21^[{!''-=*&%&$$$$#$$%>),>;>''!_34350ltppoppoqxuyzzFIMNPQRRR",
+"RRRQQQQQQQQQQPPPOOOPPOOMKIECCAAwwwwtwAAAwpjiccfltBHHBEIKMMNNNKEAwwtptuwwCEEBAwtuutwtwAEKMNOOOONMKKIHHHEEBAAwxwttwAAAAAywtpoib531_(^^[_<|<<___(((__::[1}1227777767342}[[[^][(({'>;;===**=;;;''^^^__}}}_^{!!,;>;*%&$$$$$$#&%-,)>;>'''{1459dotpppppppxuyAzFKNOQQRRR",
+"RRRRRRRRRQQPONMMKMMNNNNOONKHEAABAAAyyBAAwtpoifffltAEEAEIKMNNNMIBywtptwwwABEHHEzwvwyywyEKMNOOOONMMKKKIIHEHEEAAwtttwtwwwyyywtpic53::^(]{{/___<<__///____<1}}244734733}}[[(^^((^{'>-=====*=;;;;''^^][}}}[^{!'';;**&%$$$$$$#&%-,),;;'''!_|59iptpppttpuxuyAzFKNOQQRRR",
+"RRRRRSSRQQONMIGGGEHIIIKMNONMIEEEBBBAAEBAwtptpliffltAEBBEKMNNNMKEAwwtstwwyACEHHEAyAABBBBIKMMNNOONNMMMMKIIIIIHEBAwwtppppttwywtpic5|}_/(~{{{{(/<<<<((((__<:1}}24421144}1[^(^^]{]!,;===%=====;;;''^^{_}}}_^!!''>;**%%$$$####&&*,{);>,''!(_|9ipwtpptttttuyAzFKOOQQQQR",
+"RRRRSRRQQPNKIHBCCCCGGGHIKNOOMKHEEEEEBEEAtppttpoifiipAEEBEKNNNNKHAwywwwttxAEHIKHEEBEEEHEIMNNNNNOONNNNNNKKKKKMKKHEBytpooooptttpoif95|<_((~~)~~((_<<<(/<_<<<:111|}1}12|:[[{^^{({!';==*%%==*=;;;;'!^{[}}__^!''>-=**&%$$######&=>~)>>'''!{<|5ipywppttswtuyAzHFOOQQPQQ",
+"RRSSRRQPPONMKFFBCCCCCCGGIKNNNNMKIIIIHHHEAtptwwwplifipAEBBEKNNNMIBwyyyzutuyABEIIHHHEEEHIIMNONNNNOONONNONNNMNNONNMKIBytollilopppoolf933|__~~~~~~/</</(<__<<:}}}}_<:1|1::^{]{](]!'==**%%%&&=;;;;'!!^[[[_^^]'';-=*&%$$$######&%>))>>''''~/<3coyytptttwwuwzzFKOOPPPPQ",
+"QRSRRQQPOOOMMKKHEGGGGGGEHKKMMNOONNMKKIIIEwpwAEEAwoiiltBEEEIKMNNKEAAwAAwtuyyEEHHIHHEEEHHIMNOOONNNNNNNNNOOOOOOOONONNMHBwpiffiiloppplif953|<<<</{~{(((<</______<::___|<:](^^~](])';**%%%%&&**=;;>'!^{[[[^^!',;-=%&&$$$######&&-)),;;''')(<|9lwAwtwwwywxyAzFLOOPPPPQ",
+"QRRRQQPOOOOONNMMKIKIIIHHIILKKMOPPPOMKIIIIBwyBHEBAwpllpyEHHHIKMNMKEAyyyxtwyABEEEHHEEEHEHIMNOONNNNMMMMMMNNOQQPONMMNONKIBwoic9cffiiiillifc53||</{)]]~~//<<<//___<:](_:<]^{^^{^[/]';***%%%%&=*=;;>'!!^[[^^{''>;-*%&&$$########&*,));>'''!(/19ftyywAywywxyACIKMOPOOOP",
+"QRRQQPOOOOOOOOOOOOONNMKKIKIIKKNOPQPOMIEIMIBBEEBBEBAtppyEIKIIKMNNNKEAAAyyzAABEBEEEEEEEHIKKMNNNNNNMMMMMKMKNOPQPNMKKMMKKHBtlf63333359ciiiic953|/~)))))~{/<<<<<_<__](:::]]!!!!(_:{';**%%%%%&%==;;>'!!^{^^^''>;-=*%&$$#########&&>))'>'''!((|6cpwwwBAAAwxyACFKMONNNOP",
+"RRRQPPOOPPPQQQQQQQQPPOONMKKKKMMMNPPPOKIIMMHEEEEIKIHBwtyEIMMKIKNOONMEBAyyAAyACCCBEEEEGEHIKMMNNMMMNNNNMKKKIMNOOONMKIIKKIEAtlc6}/~~(<|59fffc953<~))!!!!!!{((<|<<(_(:::(]^!'!'{(:~'--**%%%%&&%=;;>'!!^^^^^'';;-=%&%$########$#$&-)~'>,''!(_}29ottwABBByxyCGFKNONNOPQ",
+"RRQQPOOOPQQRRQQQQQQQQPOOONNMMMMKKNOPOMIHIIHEEEHIKIIIEBBBHMMMIIMOPPONHBAyABABACzzEEEEEHEHKMMMMNMNOOOONNKKIKKMNNNONMKKIHEBAwof9<~)')~/|599c9953<//~~)!)'!{(___</::(<_(]]''!'!{]!'---**%%%&&*=;;;>!!{^{^^'';=*=%&&$#########$&&*)),;'',!//}29ltttyBHHAxyCGKKNONMOPQ",
+"QQQOOOPQQQRRRQQQQQQQQQPPOPOOONNMKKMNNOMHEHHEEEEHEBEHIIIEHKNNMIKNOQQPNHBABEEHEEBCBEEEEHHIKMMNNNNNPPPPOOMMKIKIIIKNNNNMIEAAABAti9<{',,))/|3599995|<///~)!)){{(__<<]((<_/{!'',!]~);***&&**%&===;;;>!!{^!!!';-=*%%&$$#########$&&*,))>''')~_}29lttpwBIIByACHKLNNNOOPQ",
+"QQONNNOQQRRQQQQQQQQQQQQQPPPPPOONMKIIKMMKHEHHEHHEAwwAHKMKKKNOOMKMOPPPONIEHHIIKIIHEEEEHIIKMNOOOOPPPPPPPOONNMMKEEEIIIMMKIBwwABByo9|/~))!)~(<|59cc953|</~~))!{{((_</(]//(/{!'''!{';**%&&%*%===;;;;'!!!!!!'>;;*&%$&$##########$$%*>))'>''){_}29ltwtwAEHBAAEGKKNNNOOOP",
+"PPNKKMOPQQQQQQQQPPPQQQPQQQQQPPOONKHEHHIMKIHEEHIHBwwAEKNNOOOOONKKMOPPPPOKKIKMNMKKIIHEHHIKMOOPPPPPPPPPPPPOOONMIEBAAAEEIKIAtptAAwpf5|/~~~!)~/|59ccc93|</~){~~~~(((/(((//{{!',!{]);**%&&%%%*=-;;>''!!!!!!';;=*&%$$#####@##@@@$$&%>)~'>'')![:}5iwwtwyEEBABEJKLMNNNNNO",
+"ONKKKNOPQQQQQQQQPPOOOOOOOPQQPPOONKHBBABIKKIHHHIIIEBBEKMNOOOOONMIINOPQQQPOKKNNONNMKKIIIIKNOOOOOOOONONOPPPOONMKHBywtwAAEEAwppptwywl9|/~~!)))~<39ccc953|</~~)~{{(]{//(/]~!,'!!//!;-%%%%%%%&*=;;>'']]!!!!';;=*&$$##@####@#@##@#&&-,~)'''!{::}0itywwwBBAzAEIKKKNNMKLN",
+"OMHCHMOPPOPQQQPQQOOOOOOOOOPPPPOONKIBAyBEHKMKIHIMMKIEHIKMOONNNMKIEINOPQQQQOOOPPPPOOONMMMNNNNONNONNNNNNOOPOONNMKHBywtttwwyyywtpptwwo9|/~)),,,)~<39ccc995|<//~~~~{{]](<:~!'',!{~{'-*%%%%%%&%&=;;''!^]]]!,;-=*%$$#@@@##@@@##@@#$$*'~~''''{^:[5fpywwwBBAyAEJKKLMKIHIN",
+"NKECGINPOOPQQPPPPPNNMMNNOOOOOOOONMKEBBBEEIKMMKKMNMKBAAEIMNMMKKKIEEHMNOOPPPPPQQQQQQPPOONNNNNNNNNNNNNNMMNNNNNNNNKIEAwttppptyAAwpllopl9|/~),'>->,~<|59ccc53|<//((({{]]]</{!',,)~~'>-**%%%%&%%=;;;'!!]^!'';-*&%$$#@###@@@@@@@@#$&%>~{)'''!]::4dpwwwwBEAzAEHKIIKKHEIM",
+"NKHEHMNPOOPQQPOONOOOMMMNNOOOOOONNNMKHHEHIIKMNMMKKIEwpptAEIKMKKKKKEBHKNOOOOPPPQQQRRRQQPOONNNNNMNNNNNNNMMMMMNNMMMKHEBwtolootwBEApfciolc3<~),,-;=-,)/|5999953|<<<<(]~]]/_/^''''!)'>---***&%%===;;''!!!',;;-*=*&%$###@@+@@@@#@#$$%;)~~'''!^[:39ltwwwBHBAyBGIHIKIEEIM",
+"MIEIKNOOOOPQPONMMNOONNNNNOOOOOOOONNNKKIIKMMMNNMIEAwpliotwAHKKKKKMKEEIMOOOOOPPPPQQQRRQQPPOONNONNNNNNMNNMKMMMKMKKKIHEBAwpooptAHIEtiilifc9|~)',-==;-,)<3599953|<<<_/~]{]//]!)!!)]'-*********=*;;;,',!'';;;=*&%&$$####@@@@#####$$%='~~!'']^^|39ipwwwBHEAACGGGHKIEEEK",
+"MKIHINOOOOPPONMMMMNNNNNNNOOOPPOOOOOOONMMMMMMMMMIEytpliklopwEIIIIKKKKKNOOPOOOOOOPPPPQQQQQQPPPOONONNNNNONMKKKKIKIKIIIHEEAAwptyEKMKHApf9cc9|(~)>-**=*>,~<3599971|<<<///]({{{!]]{~'-*%%%%%=**--;;;!!,';;;;=&%$$#######@@######$$&%*>)/{!!!^]|39ipwywAHHBACCCAEKIBAEI",
+"KKEHIKNNMMNNMKMMMMKMMMNNNOOOPPOOOOOOONNNMMKKIIKKIEwpoikiilpwEIIHIIIIKMNOPPOOOOOOOOOOOOOOPPPPPPPOOOOONOONMKKIIEHHIIIIIIIIEBABEHKOPOEl539c93</)>;==**->)~|359953||<]]]](/!!'!)~~)'-*%%%%&*=;;;;'!]!'';;=*%$$###@@@@+@@@##$$$%%&**;~</{{~][|39fowywAEHBACCzACEEEBAH",
+"NKEABKMNMIKIIIKMKMMMMMMNNNNOPPPONNNNONONMMKKEEIKMKHwploollopwEHHHHHHIKMNOOONNNNOOONNNNNNOOOOPPQQQPPPOPOOONMKIHEHEEEHHIIIIIHHEEBIOQNAi9555953<)>--****->)/|559553|//]](/{!'',)~),-**%%&%&%*=;''!]]'',;-*%&###@+++++++++@###%&%**;)<<_/([:|79fowAyAEHEBBBAwAEHzAEK",
+"OMEABHNNIHEGGHEHKKKKMKKMNNOOOOPONNNNOOONMMKIEBEIKMKEwpttppootAEHIIIHHHIKKKMMKMMNNONNMMNNNNOOOPQQQQQQPQPPOONNMKKHEEBEEEHHHHHEEAAAEKONEpf5|3599|~,>-****->,~<359905|<]{(/]!'''))!'-**%%&&%===-;',!'''';-=*&$#@@++++++++++@##$$%%*;,(<_//::179flwBAAEIHEAAyyAEBAAGM",
+"NKAwAEKKHAzCBGCCEIKMKMKMMNNOOOOONNNNNNNNMKIHEBBEIKMKEywwwwtppwAIIIIHEEEEEEEHEEEIKMMMNNONOOOPPPPPPQQQQQQQQQQPONMIIEEBBEEBEAAAAywyyBKNNHwi5||5cc5<),>----->,)<|599933<(//]{''')!)'>*%%&&**==;;>'''''>;;-=&%$$#@@@++++++++@@@##$%%=-)<_(~:[_|5cipwAABHIBBAyyxzzyzAI",
+"KIAwwAIIEAzABCzzCHIKMNNMMNOOOOOONNNNMMMNMKIHHEEBEIKMKBywwywtttwEIKIHBAAAAAAAAABBEIKKMNNOOOOPPPPQPQQQQQQQRRRRQPONKKIHEEEBBAABAywyABEHKMHwi5<|3cfc3/),>>>>>>,~<|599993<</(^,>',)),>-=*&&%%==;;;','';;;=*%&$#$#@@#@@@++@+@#@@##$%%=-,/_({]^_|38cltyyzEIBxuuuuyzrrwE",
+"IIBwwAEIAAyBBCCCGHIKNOOOOOOOOOOOONONMKKMMKKIIHHHHIKMMKEAwtwwtpwAHKKIEAwyyAyAABBBBEEIKNNOOOPPQQQQQQQRQQRRRRSSSRQPOOOMMKKKKKIIKIEEIKIEEKNKAo9|<|9ff5<~,,>>>>,)~/|599953||<],'>>,),,>--***%*==;-''';;;;=%$$###@+@@+++@@@###$#&&%%==-,{_</^^_<38bipywAEIExuuuuxtrouA",
+"EHByyAHHBAAAyCEEGHIKMNOPPPOOOOOOOOOOMKIIIKKKKIIKKKKMNNKEwppttoptyEIIIEAywyyAABBEBBBEHKMNOOPQQQQQQQQRRRRRRRSSSSRQQQQQOOOOPOOPQPPOPPOHAHOPOEtf5|3ciic|~,,>>>>,,)(|3599555|:),';',,,>>>;>---;;>;'''>;;=%&$$##@@++++++@@@@###$%==-->>)/11_::_1379fpyyAzEBtpruuttqmuA",
+"EEByAEHIAyxAAAHEEGGHKMNOPQPPOOOPPPPONMKHHIIKKKMMMKKKMMMIypoopoolotBEHHEAwtwwAAABBBEBEIKMNOOPPQPPPQQRRRRRRSSSSSRRRRRRQQQQQQQQQRRQQQOHAEOPPOKAti99fopi9|/~)),,!!~<|3555953|~,,>,,,>--->>>,;>>>'','>-==%&$$##@@++++@@@+++@###$&&*;>')(|33}::|35cfoyyAAAAtpprpttqqpy",
+"ABAwyEIIAxuyABEBEEHIKKMNPQQQQPPPPPPOOONIIEEIIKKMKKKIIKKKEtllloliiotABEEBwtptwyyAABEHHHIIKMNOOOPPPQQRRRRRRSSSSSSSRRRRRRRRQRRRRRRQQPOIBEIOPPOKBwl9cflppi9|</////<<1|5559955|~'>,,,>****->,,,,,'!!,;;;=%$$#@#@++++@##@+@++@##$&%*;-;,{<|72[[||59clwAAzAzwqqmpqtpnpw",
+"yBAwwBKKEwxwzEEEEIIIHKMNOOPQQQQQQPPPPONKHAyABHIIIIIIHHIKIApolooolopwABEBAtpptwwwwyEKKIIKKMNNOOOOPQQQQQRRRSSSSSSSSRRRRRRRRRSSSSSRQQQOMHHIOQQOHAti999iptoc5|<<<<||||33599995|/)))),>****->,,,){]]!'>;=&$$##@+++++@#@@+++@###%*->',,)/_3952}|159cityAAAywrqqqutpoot",
+"yBEAyAIMIBwAzAyEEEEECEIKMOPPPQQQQPPOOONKEAwtwyAEHIKKIHHIKIAtoopoooptyBEBAywttttttwAHIKKMMNNNNNNOOOPQQQQQRRRSSSSSSSSRSSRRSSSSSSSSRRRQQPNNOQQQMBwti955fotof5|<<<<||<|||355c95|<///~)>>-;;;'',))]]{),;-*%$###@++++++++++++##$%-,~)){/|35fc94335bcipyAAAytppppwwtrot",
+"yABAwyBIIByAAyzAEAyAABEIKNNOOPQQQPPPOOMKEBytttwyBIIKKIIIIIHAtpooooopwBEEBAwtttppopwyBEIKMNNNNMMMMNOOOOPPQQQRRSSSSSSSSSSSSSSSSSSSSRRQQQQQQQRQOHAAwof99fptpi93<<<<|<<<<1||555||<<//~,,>>>>'')!{{]))),>>-=$##@++++......+++@$&=>!)~/<|35ff953799fiowABBAwtpppwytppt",
+"tyBAwwAEEAAywyAzyywAACzEFKMOOPQQQQPPPPNMHBAwwwwwwBHIKKIIIIHEAtpooollpwAEEByttpolloptyABEIKMMMMMMMMNNNNNNOPPQQQQQRRRRRRRSSSSSSSSSSRQPOQQQQQQONEwAEyof99fpwwof53||11<</]//<|3||<<</~),,>,>'',){]])'',,'>-*=*%###@++....++++#$&*->,)/(_|5cc52459fiopyAAywtppptwwppp",
+"twBAwwABEBzyyyBAwuyyzyzAEKMMOPQQQQQQPPNKIBBAwtppptAEHIKIHHHEBypoopoilptABBAwpolffilptwyAABHIIKKKKMMMNMMMMNOOPPPPQPPPPPQRRRSRRRRRRQPOKMNPQPOIyoipBBti933cowwpf95|33||<(/~/<|||<<<</~,,'>;',,)!{]),',>--;*=**%%%$##@@+++@@+#$$$&*;;,'!/|7952|70filpwBBAAwpoptwwtop",
+"ptyAwtyABBAxzBEAzxwywyzzFKMNOPQQQQPPPOMIHAAywpoiilptBHIHHEEEBAtppttoiiopwAAytpliffilptwyyABEHIIIIMNNMNNMMNNOOOOOPOOOOOOPPQQQQQQQPPPOMKKMNNKAoc9iyHyi5<<|5fpplc53333|<(~))~/<<<<|||/),',''''',){)''>--*=%%%%$%%%%$$########$$%&*=;;''!{122}:457filtABBBAtolowwoop",
+"opwAwttyBEBAzAEAwxxuwwzBEKMNOOPPQQPPPOMIHAAwupokiilptAEHHEEEEBAwtwwtoiiloptwwtplifdgioptwyBEEHHIIMMNNNNOOOOOOOOOOOOOONNNNOOOPPQQQQPONMMMNNMIAoioAIAi9|/~/|9ili933||<<~)>;'))~~/<|||/)),,,'',,,,'',>-*&%%$####$$$$$$$$%$$%%&***---;'!!!{13}[_1|85cipwAywpiijopoll",
+"iopwwtptyABwtwzywtwuqwAAEKKNMOOPPPPPPONMIEAyutpolllootAHHHHHHEEBAAAytpliiilptttplifdfilotwABEEEHIKMMNOPPQPPOOOOOOOOONONMMMMKNOPQRQQPOMKMNNNNNHAwAAti93/~~~<9iiic53|</],;*;->>,)~/<</~),'''',,,',''>;*&$$$##@@@@@@@@#$$$$*=*->->,''!!{){<43:^_1|439iptppifccgiifi",
+"filpwpootyAtppwxptpuqwxABEIKMOOPPQPPPOOMKICAywtqpppppptBIKIIIIIIHEBAwtpoiiilptwtpolifiilmpwABEEHIKKKMNPQQQQPPPPPOONMMMMMMMNMKKMOPQQQOMIKMKIKNNHApof993</~)~<5fiic93</~,>**%**=->)////)),>;;;;>>';;>-*&%$##@+@@@++++@@@##$%*->>,)~{//~(/<|52:<<__|29looli9589cfcc",
+"cfiottllpwAtlltpqqpoqqwAyzEIKMNOOPPPOONMKKEBywttqpppoppwEIIHEHIIIIEAwwwtplilotwAAywwtppoopwyBEHHIHKKKMOQQQQPQQQQQPONMMMKMNNNNKIKMNOPPONMMHBBEHEypf953|||/~))/5iolc5|/~)>**%%*&*->)///~),>>-;;;>>;;--*&&$###@+++++++++++##$$%*->,'{{////||5832}:}269ioolic977cc99",
+"fiiowwpoopAwpopplmmlqqwuxzBFKKMNOPOOOONKKKHEyttpppooolotwBEEBBEEHHEBwtttpoiilowAEEEEAAyyyyABEHIIKKIIKKNPRQQPPQRRRRQQONMKKMMNNMMMMMMNOOOOOKEAyyAwtof5|<<|3<),~<9lpi9|</)>-*%%*&%*-,~//~~),,>>;;;>;;*=%%&$##@+++++++++++@###$&&*-;''''!!~~_|593321359fptpoic90dcfc",
+"illpwAwpotwywtpolikinuuwxzAEIKNNOOOOOONKKIEBytuoolololooptwBBAABBBAAwpllllifcflpwyAAAAABBABEEIIKMMMMKMNPQRQQPQQRSSSSRQPONNMMNMMMNNMKKKNOOONKEAwtttpi93|353/))/3cilf5|<~,-=*%%&%&*-,~///~)),,>;;;;;-*%%%$##@@+++++.++++@@##$&*=-;'';''''')/|3|<<<<|39ipppoic9cfif",
+"iilpyEBwttyEEywpiikgjquwtxzFIKMNOOONONMKHEBAytplkilllollloptyAywwwywwtoifiif999cilptttttwwwAABEIIKKMKKNOQQRQQQQRSSSSSSSRQPPONKKKMMMIIEEHINOPPNHyttwwpi9995|///|39ilf5|/)-*%%*%$$$%-,~~~)~)),,>>;;;-*%%%%$#@@@++++...++@###$&%=*;;;;;;;''''/<<~~!){/|5ioolifc9cff",
+"cciltAEAwtwEIHAyoiigjiqqtwzDEKKMMONNNNKIEBAxwtqplkllllliililpwwwtptttpplififc55599floooppppwyyAABEEEIIIMNOQQQQQQSSSSSSSSSSRQQONMKKIHHHBBABIMOPOIBAABAwoc53|<<<<|39ilc3<~,*%%%%$###%*,,)))))),'>--;-*=%&%%$$#@@+++++++@@###&%%*;;;;;;;;;;;')/({''''!{_5fifc95599c",
+"59cciwBBwptAIIEAtligdemmtwzAEIIMMMNNNNKIEAyuuppqollifeffiiiiiptwtppppppoliffc955555cilloppptwwyAyyAAAEEHIKMOPPPPQSSSSSSSSSSSRRQPOMKHHIEEBABEIMMMMIHHEBwoc5|<<<<|35fiic|/)>%$%*%####&=>>>,)))),,>>--*=%&%$$$##@+++..+@@####&%&*;;;;;;;;;;;;'!~{';;;''{<0cc953|359",
+"95359lyBypptBIEAtiebdemmquxAEHIMMMMMMMKIEAAuqomqpomiicccfffgilpttppopppooifffc9553359filooppptvwywyyyABEHHIMOPPPPQRRRSSSSSSSSSRRQPNKIIHIIEEEEEEHIKMMKIEyoc53|||5559fol9|/)-%%%%$#@@#%*-->,,))),,>>>-*%&$#####@+++..+++##@#&%&*;*;;;;;;;;;;;')),---->,~|9995||||5",
+"95259fpAypopyEBypicedeempvuAEHIKMMKMKMKIECAwuqmmoppoifccccffiilpttppoooooiifffc9533599fillopptwwwwwwxwyAAEEHKNOOOPQQQQQQQPPPPQQRRQPNIHEHHEEEEBAyAEIMNMMKApic5339c95cotl9|/,-%%*%#@@##%***-,)))),,>>-*%$########+++++++@#@$&%*******;=;;;;;;->),;===->,~39995||<3",
+"35359flwytolpwwppifeggjmpqvxDHIIKKKKKKKIECAysrnjoppuplfccccfilllppppooollliifffc9555559cilopttwwwwwwwxwwyyCEIIMNOOPQQQQPONMMMNNOPPPOMIIEBAwAAywwttyEKMNNNIAtlc9cfc9cltti5<)>*%%*%#@@#$%%%*-,))),,,;=*%%$###@###@+@+@+@###$%&***=*&%&**==;=*==',>-*%*=>)<5c905||3",
+"5559ccfowwoifooppofffgjmmrsuDFHIIIKKKIIICCAvurnkmnpppolfcccfloolloppplllliiifffcc9557550cfipptttwwwwwyywwyABBHIMNNPPQQQPOMKKKKKKNNNONNMKHAwwttttpoopwBIMNNNMHAtppoolotwo9|~,-***%$#@@#%%%%*>,,,,,,>=*%%$$###@##@@@@@@##@#$%&***%%%%%%&*=**&%%-,,>****->{3cc99953",
+"5555599fopofdilptpihhgjmmruuDDEEIIIIIIIHCByvqqmnmolilllifccfioooooooooliiiffffcc9955333599fiopppptttwwyyyyyAAEEIKMOPPPPPONMKKIHEHEHIMNOONKEAytpoliiffipBKMOOOOMIHEAywAytf5/)>>**%%##@#$%$$%*->,,,,>-*%&%$$$#@@@#@@@@+###$&%&****%%%%%%**%&%%&&;'>==&&->,<9ffffc5",
+"333||425fomgc9ipwtibegemmrtuxDBFEIIHHHIHEAyvuqqnmoifgiiifffffioppolooooliifffcc95595533335afilooooppppwwxwyAAAEHIKNOPPPPONNMKKHEBAAABHMOOONKIEwoifcc99cltBINOOONMKIHBBAyo9|~),-*%%$###$%$$$%*->,,,,>-*&%%$$#@@@@##@@####&&%%******%%%**&%%%&&=*>,,-;;->)<5iiiif9",
+"1<<|_<139ipld0fowwocfgjmmrsuuxDBEEEHHHIHHBDvtqropomfddgfifcccfiopololloliifcc9955555553337adfjilllllppptwwwwzzBBEIINOOOOOONMKIIIBAwwwyAIMNOOOMHwof999599flpwEKNMKIHHBBAyti5|/~)>-*%%$$%%%%$%*->,)),,>=*%%$#@@@@########$&%%****%******&%%&==***>)~),>,'!/|ciffc5",
+"_(<<<<122cloidcitypffhhmmrvvsuxDBEEEHHHIIEDyuusppmlfc0cdfffc99cioooolllliifc99553355557735a0behiikilooooputwAyAAEEJMNNNOOONMKIKICytqpptABHIKMMKEwof953599ccfowBEEAwwwwwwti953</)>-*%%%%**%%%*=->))),>-;*%$$####$##$$$$$$&%&****===*===**=;--**->)//)>>>,)/|9c995",
+"<((<</(_25foofcfowtihkjmmrnorquwDDEBEGHIIEEAwuutppolcb0ddffcc99cfilliiiiiifcc95533559957756d0c9hhiilionopupwAAyAECGIMMNNOOOMKIIEBuuomorpwwwyABEEBypf5||39999cipwytpoooooi9355|<~)>-%%%%***%%%=->,))),,>-*%&$$$%%%$$&&&$%%*=*--*=--=-;-*=;--*=**=-,)'-*-->,~|9995",
+"|_(__<(_}39loifciopifkljmmponrruuABBBBEHHHEBywxttpoofb99cffifc9059cffffififfc955333599990999ddcchgeiijonlrqptxxzECCHIMNNNNNOMKIHAuqjjkhinloooptyBBypf5||35559clpwwplifc99|<|3|/~~)>-*%****%%$&*=>>,,,,>>-*%%%%%%%$$&&&%%&*****=*==*=**&&*%%&&%%&%=>';%%**>)/3999",
+"5|_(<</_}}6foliccioiifkljmmkonvuuxABBBEEEEEEAwwwwppolfccdffffc9533399cfffiiiffc9955599c90ccccc9gdhggijomnrqqpxxABCCEIKNNMNNNNMKIByqmjggeebbcccipwyAytof5553335clpwwtof95|</<||~))))>*%%*-*=&%%%**->>>>---=&$$$$$$$#$$$$%&%&*%%&&&&&&%$$$$$#$&$###$*;;*&%%=;,<599",
+"93<_<<</}}29iplfccffcfilonqmmppssxwABABEEEEEzyywwwtpolfffcccdc99533359ccfiiiiffc995355999c988090cciiilnoorqqpxxAACCHFIKNNMMNNNMKHAuqjhgba663239flpttyAwoic5|||5citBBypf93|<<|<~',,,>-*%*---*&%%%**---;-***&$#######$###$$$%%%%$$$&&$$#@####$####@@#%=*%$#$&>)<55",
+"953:_<|<}}}5fooic9c9bcijmolqmmppuwxAABABEEEEAyywwwttpoieccdcc999997333599ffffffcc99535599ccc88a99cdhfilonorqpxxAACEHIKMMMNMMNNMMKEAuqjjg8664}||59fiopyBBytl93||39iwBBtlf953|3|/),,,>-*%%=>,>-*******--**=%%$############&%&%%%$$$$#$###@#######@@@@#%=&$#$&=>)|5",
+"5954||3|22239ipoicc9acfiooolqpqttwwyAABABEEEAyywwttpplkicccfc99999553|3559ccffiiiffc99cccjiiffcccdchiklooorqtxwyyBCEKKNNMMNMMNNMKIEAuqjg8a24:<<<|359ipyBEEAti93339ipwtplic533|</~)>>-**%*-,,>=*-*==**=***=%$$##########$$%&%&%$$$$###@@#####@@@+++@@$&=%$$&&->~|",
+"35553|3352226fotoifccciioooolpmmttwyAABEEEEEAyxtttqoooiiifcfc995999955559cffiloooooliiiiilloliiifiilloopppttwyxAABCHIKNNNNMNMMMNMKKEwuigaa21:_(///<|9ipwAEIHAof5535ciptpoic533|</)>>--*%&=>,,---*=***=*****%$##@@######$$%%%%%&$$####@@@####@+++..+@#$==&$$&*-'<",
+"|599955555559cittoieciilioomlnmopttwyABEEEEBAwtprrppoookggf9c999999cccfcciiiilppppppoollliiiiiiiiillooopttwyyAAEEEHIFMNNONMMNMMNMMMIExuke861[_(~////|9fowAEIHAtf95559ipttpif953||~)>-*****-,,,-*=&%%%=***--*%$$#@@#######$&=&%%$$###@@@#####@@++..+@@#%;*%%&*-'~",
+"<59ff99999599cfowtlfffiiilooonlomttpxwAAEBBBAytpqqpqplllgccdfcccffiiioliiiiilillloooolllliicddccfgiillloppswyAAEEIIKMNOOPPONNNMMNKMMIEymib64_[]{//(/||5iptyBEHBtic999cipttpiffc95|/)>**%%%*-,,>**%%%$&%**---**%$#######$#$&**=%&$###@@@@@##@@@@++++++#$=;-*==-')",
+"/39fifcc999599cipwplfifffilooolimmoouutwyADAAAywtrrmmmiiiggdgiiilpptpppliiiiiiifiilllllooolic9099cfigiiknopuwzzBEHIKMNOOPPPPOONNMKKMMKEwoia61[]/<||||||9fiopyBEBwoicccflppoiffffc95<)--***=-,),-*%%$$&%%**----*%$###$####$&%%**%$$#@@@@#@#####@+++++@#$*;,>>;>,)",
+"~|5fiifc9999559fottpliiffcilllkikkglnrpuuyAAAAywwpqrnliiiilikllmopwAywtplliifififiilllloooolic0899dffiijnlrutxxAEEGKMMNOPPPPPOOOONKMMKIBwof94}<_|33|</<|59cfipwAAytpicfilolfcccccc9|~,>>>>>>,~~>-=%%&$$%%*->->--*%$$&%$$$$$%****%&&####@###$$###@@@@@$$=>)))>,,)",
+")<3ciiiifccc999ciottoifc988fffgdhgggmlrquwAAABAwturpqomoploollllopwyyttptplliiffffffiiillliiifd99999fiijnloqtxwABEGILMNNOPPPPPOPOONMMMKIEtic62<_|33</~)~<|5999fotyAAtlilopoi95999553<)>>>,,>,)~)>-*%&%%%%-->>>>>-;**&**&&%%*;**=*&&%%$&$$$%%%%$######$%%=,~{),,,",
+"~/|0ioooiiffc95559iolfc986a9cfegfbggijmmquyAAAAwuqquuttttpoooiiiilopttttttpplic99999ccfiiifcfccdc800cffilloqtxxACBCIKKNOOPPPOPOOONMKKKMMKEtl92__<|3</~))~/<35599iotAAwtppttoc5555555|~>->,,,,,)~,-**&%%%%*->->>>>>------=*=--*****&%%&&$%$%**%%$#####$%&&-)//),)",
+"/<|5cioolic995|||19fic999626bcfgdbgggiinmqwyAyyytpquttwttuppllifffiloopttwttplf955599ccffffc9c9cc990dccfjjmqsuuyCEEHFMMOOPPQPOPOONMKJHHIKIEyoc3|/_|<</{~~~~/|5999cipwAAAyywti53555555|~,,)),,,)~)>-&&%%$$%**;->>>>>-----------***==%%&&$$$%***%%$$$$$%*=*-,/</~~",
+"/~(_|5cffc54|41_<||9cc95762aaccfghdggnlqqqpwwyyyywwututpppppolliiccfiilopttttpofc599ccfffccccc99cccccecfijoqrusyCCBFIMMOOOQQQPOPOOMKHEEEEEHEypf93|||</~~/////|5999ciotwBEEBwo9||333333|/~~~),,,~~)>-==%%%&&&*-->>>>>--->>>>>>-;--=*%%&$%$$%*---=%%%%%*--->,)<<</",
+")!!{{/|9c953||1____|7cc977626bcfgdfkkkmrrqqtwyyAAAywtuqpmmloooliifcccfffilopptttplfcccfffcccccc9ccddgfeiliqqpuyyBBGHILMOOOPQQPPONNMMHEBAwABBAwoi9343|<///|||<|359cciloptBIIBwl9||||||||</)~),>>,~~,>==*%%%%*-->>,,,,,>>>;,,>>>>>---***%*%%*-->--**&%%**=**->,~/~",
+")'''')/|9993|<<<((/(<7c9056266dcfghgkkooqrqtwyABBAAywtpommlkiiiiffcc99ccfiiiiopwyytlfccfccc99ccccccfiiiiloqppxAEEGFFIMMNOOPPPPOONMKKHEAywwwyAywoc53353|<|553|3359fflliiltBHHEyo933333||</)),,;*-,),>=&%%%%%%*-->>,,,,,,,>>>>>>>---**=*%%%$$%**%%%%####$&&%%&-,)~",
+"!!''>,){|553|<<<_({~(|9c90566689ffgfkknlqrqtyBEEBBAywwpolkkfggccfcfccc9cffffffipwAAwpiffc9999c9cccfgifilloqpxwBHHHIFILNNOPPPQPOOOLIFCBAxtpptwAAtl9533533599533359fiiliiopyAEEBApc99993||</),,;**>,,>&$######$%**-->-----;--*=-***&%%%&$$#####$$#$###@##$$$&&*;>!",
+"!!';-;''~|553|<<__{{{(|9cc0866889fgikklinnqtABEEEEAAywtrllidd90999cfiiifffcc9cffiotwwtoif9999c9ccccfiiilinmpuwAEIIKKMMONOPPPQPPOOLIFAAyurmmoptAytof5||||59fccc99cciiloopptABAABApifff53||<~),>**-,,>*$$#@@####%%**=------=*%**%%%&$##$###@@@#######@@#####&%%&*>",
+"'!!>;;;-,~|553|<__({]{_49cc066aa0fkifkglnrptyABEEBBBAAwpolif9999099ccffffffc99c9ccfiotttoi999c9dccffiiilnnmruuAEHIMMNMOOOPPQQPPOOLLFBvwqrmieiiptwwplc5|||39fiopppiiiloopppwBAAABAplii9533|/))>--;>>>-&#@#@@@@@#$%**-----;=&%%&%%%$######@++++@@##@@++@@#@#$$&%%-",
+";'!,';--;,~|5531<_</{](/38cc966a8fkkikkmrputwyyABBEEBAywpoiffc9c9995559cffiffcc99599cipwtpicc9ccccgiiiioooqpuuzBEGKMNOOOPPPQQQPOOMLFFzvqnmebb9ciotttoi953359itHMHwtpollollpAEBBEBwoif95595<~))>>-->>-&#@@+++++@#$$%*----*=&%$$&$##@@@@@@@.+++++@@@@+@@##@##$&%==",
+";;'),'-=->,~|553|<|<_(~][20cc969afgkimioptuuwwwyzAAAAAwwtpoifffc995573559cfiiifc955599flppoliccccgfiiiooopqppuyyBGFKNNOOPPPQQQPOOOLIFzvtqkeb96259iopoic99599ftINIAwwtpoollowBEHEEAtlf955993<//~),->>-*$#@@@++++@##$%******&&$$$####@+++++....+++@@@++@##@##$&%==",
+";;;,',>--=;,(|5353|1<_]/_}29cc98ccfiommpptuuwwwxwyxwxwwwttpolifcc9533333559ciilic953599cfloollicccfiiiiolpqqpuuyACHKNNOOPPQQQQPPOOMKFzzwqkij96}||5ciif93359cipEKEtooppttpoopwAEEEBwpif99cf93|<</),>>--&$#@@@++++@##%%*****=&$$#$$##@@++++++.+.++@@@@#@##@$#$%%=;",
+";;;;,,,>===;,(|35533|1_/(:}5cffccbfipppupsuuwwwywwwwtpptttppolifc99533333559cfilli955559cfiilooliiiiiiillloqrwuyCCEKMNOPQPQQQQPPOONMKCByumjjc9}<_|39cc9|<<39flAIBpc9cipwwtppttwyAAytoifffi93|<<//))>--*&##@@+++++@#$$%**%%%*&$$$$##@@++++.+++++++@@@#####$$&%==;",
+";;;=>>,,-==*-,~|35577|1</[:49fiffbcgouutppqqswwywwwwttppppqpolliifc953333355599fllifc979cdffiopppoiiiiiilloqpwuyAACIKNOOQQQQQQQPOOOOKHByxrljc921_/_|5993<//|5cpBEtc335cltwtttppoptwwtoiiff93|<////~,-***$##@+++++@##$%%**%%*&&$$$###@@+++.+++++++++@#####$$&%==;",
+";;==;->,';***-,~|555733||}:15ciilfffltutppqptvwwttttttpppoomoliiiifc955333355559fillif9909ccflottpoolnlmlloqqpuyyACFKMNOPQRQQQQPPOOOKHBAupojeb52<(/<<399|<~/|9iwEAl9599cilptwwtliiottpifc95||</~/</)-=***$#@++++++@#$%%**%%%=&%$#$##@@@++++++++++++@#$###$$&%=;;",
+";;===*->,'-***-,/|55557552}|38dfllikipqqppqpttttttttttppppollliiiiiffc953333353359filiic9009cflpttpppppppoooppxuyBCFLNNOOQQRQQQPQOONMICwurmjeb564|(]{<355|/~~3fpABtfcffiiilopwwtiffiptoic93<//(~)~/)>-****$#@++++++#$$%%%%%%&&%$$##@@@@++++++++++++#####&%$%==;;",
+";;===**->>>-***-,/|59599c96|458ciloooqmpoqqpsttttttttttpppooliiiffiiifcc955333333559fiilic909cloptwtwwwwtpppptwwABGHKMNOPQQQRQQQPOONMICzqlkfa85434_~{~<355|~~/5iwAwicfltwpolipwwtlffiptpof5|/~/~,,)~)>*&**%##@+++.+@#$$%%%%%%&&%$##@@@@+++++++++++@@@#$$&%&&=;;;",
+";;;===**=->>-***-,~|5599cfc556a8flpttpmooqqpppputttttttpppooomiffccfffiic995553335599cflolifcdiotwABEEEAwwtwwwAABEHIMMOPPQQQRRRQQOONMICAwqkbb67}<1|</~~/|33|//<9lttoffoyBAwtpopwywplilptwpi9<~~~),')~,-*&=*%#@+++..+#$$$%%%*%***%$###@@@++++++++++@@###$&%&*=;;;",
+";;;;==**=*->>--*-;,/|599cfid9a66cipwwwppopqqprpuuttttpttpppoollifcccccffiiffc955755999cfloppollotyBHIKIEAywwyAEBHIIIMNOPPQQQRRRQQPOONLEztqjhb64[_/(/</~~/|53|//|9iopifitABEEBwtwyywtolopwwti5<~~),,,)),**&=%$#@++..+@#$$$%%%%&&*%%###@##+++++++++@@@###$&%*;=;;;",
+";;;;==***==->>>-*;;,(|599cfifc66bfopwwtttuqmopppoppttptttppoooliiifcccfffiillfc99999cccfilppttpppwAEIIIHEAyyyAAEHHIKNNOOQQRRRRRRQQPOOMIBxqjhb62_[{{{~//~~/|53|<<|5cooiipyEIKIHAywywwtpllpttof3/~)),>,))>*%%*%#@++..+@#$$$$%***&**%$#@###@++.+++++@@@###&*=-;;;;;",
+";;;;;-=**&==->>>;;>>)/|55ccggf99ccimpwwywtpmmmponoppptpttpppoooiiiifffiiiiloolifcdf9ccffiiilpttttwwABEEEEEBAAyAEHHIKNNOOQQRRRRSSRQQPONMJAulkb861[({'!)~~~~<|33|<||5fiiilwBHHBAAAAAywwtplllopoc|/~/~,,'~)>*%%%&@++..++#$$#$%%*=&***%#@@##@@@+++++@@@####&%=-;';';",
+";;;;;-=***===->,';-;''(|59ccgffcfehklptywtppopmmnnoooppttpppppolliiiiiiilllooooliiiffcdcff9bfltwyyyyyAABBEEEECAEBHKKMNOOQQRRRRSSRRQPOONKHzrmf861[({!,,,)))~<3553|||5cfiltAAwppttyBAywwwplilptpf3|</{))~~)-*%%&$@++++@####$$%**=****&#@###@@++++@@@@##@#$%=*;''''",
+"';;;;;=;***===>',';-''!{|99cfefilifgjmqttwtppoomlnoopopppttppppoooooliiiiiiopppooolifc999d99ciotwAAywyAAAEEIIHEGBEIIIMNOPPQRRRSSSRQQOOOMKHAulia7}_({),,,,))~<3995|||39fopwyplillpwBAyyyypliowwtic53|//~/~,-&%&%#@++@@@####$%**=****%#@@##@@@+++@@@@##@#$%*;;''!!",
+"!'';;;=;;***===;',,',''{_26cifiopplkiimoppppololkinoopoppppttpppppoliifffffoptpopmlic97759a99cfiotyyyywwyABBEEHHEEHEHKMNOPPQQRRSSRRQQONMKIBysric0a|_~)',',,,)<3995|||3clptwtoiffiptwAyyAytllpwywpi953|<//~>*%&%%#@@@@@@##$$%*-*****&&####@@@@++@@@###@$%%*=;''^^",
+"^!'';;;;;****--;>,,!'''!{:29fiipptpojiiimmopooiiikiolooppppptttttpoliififfiottplifcc99079909099dioptwttttyAABEEIHHHEGKKNNOPQQRRRRRQQPONMKIEywpolfc93|(~))',),~<3999|||5fllopplc99foptwwyAytpopwwwtof99|<<<)-%$$%$#@@@++@##$$%*=-***=&$@##@@@@@@@@@####$%&*=;;'^^",
+"^^!,';;;;;;**----;,!{!!)^]16bflppwwplkifhfllmlliiggilloppppttwwwtpoiiiiiiilpwtlfc055999c05508888cfilpppptwAABEEIIKIIHKMMNOPQQQRRRRQPPOMLIIEAwtolffc953|<~))))){<59c93<|9fffillc559fioptwyAywwwwwwwwpic53||/,*%$$%$#@@++@##$$%==--=*=*$####@@@@@@@@####$%&*=;;'!]",
+"!^^!''';;;;;*----;>'{]{{^]_16cipptwtpokddccfililfffgfilmopttwwwttpoliiiiloottoic933375599009d909ccfflopttwyABEHHIKKMKKMMNOOPQQRRRRQQONMFGEEAwppigcdc9953</~~/~~/|5cc9||39c9cfif9539ciilptyAABBAywtttplfc5|<~,*&&%%%#+++@#$$%%&=---*&=%####@@@@@@@@####$$%*-;'>!!",
+"{!]^!'''';;;;;;;;;;'!~]:^(:228ioopptpplgcd09ciiiiffddfilmptwwwtttpolliilppptpic9553|433599ccccccccfcilptwyyAEHKIKKNNNMMNOOPPQRRRRRQQPONLEBAxtplfifcc99554|<</<//<|5cc93|39999fif53359fiilpwAEEEAywttppooi9|/)>%&%%%$@++@##$%%&*---*&=%$###@@@@@@@@@####$%&*=;;!!",
+"{!!^{{!!''';;;;;;;'',!{[::_}26biopppppolgd00a9fffiffddfilpttwwtttpooolopttttoic9554|}1|35dfcfffeffgilopwAEEEIMNOOOOPOOPOOPQQRQRRRRRQPONMHCAxtnied9999555543||||<</|5ccc533599cii93||59fffiotAEHEBAywtpppof3/~,-&%%%$#@+@##$%&&*;>--&&%%###@@@@@@@+@@####$%*=;;'!",
+"!{{!^^{!)''''';;'''''']^:11}26bbeiloooooifd0786ddgfffddiiopppptttppppopttttpofc95511<|13559cfilliloptwyBEKMNOPQQQQQRQQQQQQQQRRRSSRRQQPNMKECxsqib8967575555533333|<<|59fc53599ciof5|||5cfiffioyEEEEBywtpoli9</)>**%$$$#@@#$$&&**----=&%%$##@@@@++++@@@###$%&%=;;!",
+"!!{{{]^^!!!''''''''''!^^_162668abcfilllliic9776500dfifgillliopptttttpptppttplfc953|||3543559ilptttttwAAEIKNOPQQQQQQRRRRRRRQRRRRSSSRRQQOONIHBytpkb85633755555337553|<|3cc9559ccili93<|5cfili99itAEHIBAwtplic5|~,--%%$$$###$$&&**-;--=&%%&##@@@+++++++@@###$%&==;;",
+"'!!{{(^^^{!{{!)'''''^^^(_}2aaab888bffiiiiiic9725500cfiiiiifiiloppttwwwtppppoic9555333555559fiottwttwyBEHIKKNOPPPPOPPPPQQQQQQQRRRSSRRRQPONKIEAywplf9a4773334333335553||599559cfiiic3<<3ciilic59fowBEEAywtoic95<~,;*%$%%%%$$&$%%*----==%%%$#@@+++++++++@@#@#$%%=;;",
+";!!{{{({^^^^({{!!'!^^^^(_}}26cba8aa99cfjffffc9732357ciiiiifffiilpptwywtpptplf995555595999ffiiloptwwyAEHHEEEEIKMMMKMNOOPPQQQQQQRRSSRRQQQOONKHBAAwtoi995573||||33||3555359c95559fiif9|<3ciloif9559fpyBBAwtplc95|/~,>*%%***%&&$%%*=----=%%%$##++++++.++++@@#@#%&%=;",
+";;!!{{((({^^^[[[^^^{^{(_}}}28bb98aa868accffccc9743570ciifffffiiloppwwttttwpic953559999cfiiiffioptABBBBAywyyyAEHKKMKNOPPPQQRQQQRRSSRRQQQPONKKEAywytqlf9053<<_<<||||335359cc95359fiif9339ciolic54|39ltAAyytpi95|</~)>*%*->>*&%%***-->>==%%&#@++++....++++@##@#$&%=",
+"=;;!{{((_(((^^^^^[^_[(__}}2268ca698a6a6689cccfc976357ccccfffffiilptttpptwwpic95359cffiiifccciotwAAAywwwwtwyABEIMNOOPPQQQRRSSSRSSSSSSRRQQPOMMIBwwtttplc997|<<(//<<|||33359ffc5339ilif9559ciiif951<|9ityyywtpi93<//~)>**->>-*%%%***;>>;=%$$#++++.+.....+++@##@#$%=",
+"=;;'!{{(____(((__1111122}}}66866a6aa2}}}65999cc9d959999999cfffiilptpooptwwpic9559cfilifc99flpwyAywtppwyAAABEHIMNOPQQQQQQRSSSSSSSSSSSSSSRQPONKHAwpppoifd0554|_/(/~/<||33359fic535cilifc959cccfc9|<<|5fptywtplf93</~),>--;>>-****=*->>;=%#$#@++..+++....+++@#@@#$%",
+"%=;'!!{___}}__[___1122222266a22226662}[:[2355999cc99d95559ccffiioppollpttplifc9ccfiiic999ipwAytppppttyEHIIHEEEIKMOOPQQPQQRSSSSSSSSSSSSSSRQPONKHBwtpoifc9577553<<{//<||33|39iif959fiiffc99959cc93<</<3cottpplif93<~','>;-;>>>-;;***->>;%$#@@@...++++....++++@@#$&",
+"&%=;'!{___}}}}}}}}}2226a686a222222662}}:[:}225799cccd9955799cfilopplilpppliifffiillc535clwAAypllotwyyBEIIHEAAyBEKMNOPPPPQRRSSSSSSSSSSSSSRQQQPONKHEAyplifd5559553|<///<||||39iif999cfiiccc9559995|///<3clopoiiif9|~,>>>--;-->>>>*=*;>>;%$#@@+............+.++@@#$",
+"$&%=;'!(__}}}}2}}}}}}2268aa86622}22222}[:[[}}32399dff99555599cflppolilopliffffiopof5|3fpABBytooptyAAyAAyAABAAAEIMNOOPPPPPQQRSSSSSSSSRRRRRQQQQQQPPNKKEAwtlf95555953||<</|||||9flic99ciiffcc553555|<</<<|9iooliffc5<{,;>-->>>->,,>**->>;*$#@@@+..............+@@@#",
+"#$&=;>'!(}}}}2222222226866626662222}1}}}1::}}[}|300c9999955999fipolliiooiffffiiooi935cpAEAywtttwwyyytppptAEHIIMMNNNNNOPPPPQQRRSSSSSSRRQQQQQQQQQQQQPOOMIEypic53|33|33||<|3|||39ilfc9cfiiffc553553|<<<///|9iloifc995|~,>->>>>>>),,--->>-*&#@@+++..............+@+@",
+"@#$%=;'!^:}}22886666666666626662222}}}}:_:::__::|3795999c9999cfloliiilooiffifillf999coAEBwtwwwwwwwtoiiopAEKMNNNMKIIIKKNOOPPQQQRRRRRRRQQPPPPPPQQQQQQQPOOMIEwpic53|<<|33335955|39fifccfiliic93|333|<<//~~/|9iooi955993/),>,,'>,,),,--;>-*%#@@+++...............++@",
+"@@#$%=;']{_}}2866666666666}222222222}}::::<:}[::}|3335799999cciiiiifiioliiiiiiic559coAHEAttwwwttpliffotAHKMNNMMIHBEEEHKMNOPPPQQRRQQQQQPOONNNMNNOPPPPOOOOOMIEAwpi9|/<||3335993335cfccfiooli953|<|<//~~~~~/|9ioic535cc5<~)))),)!!)'>--;-=%#@+++.................++",
+"+@#$&*=;'^]_}}866666666666}}22222221}1[_::_:}}:_||11|439999cffiliiiffilliiilllf559ciwEHBwwwtttplfcciowBHIKKIHEHEBABAAEEIMNOPPQQQQQQQQQPNNMKKIHIKMMMKMKMOONNMKKIApc3<<<|||35555335cfccflopoic9|//~~~)))~//<39iif9335995|/~~{)){!)),>---*%$@++++.......... .. ...+",
+"++@#$&*;;'](_}266666666666}}222}22}}[:[::[[/}||:|}1<<||55999filliifffilifiloplc59fltAEAwtwtpptlc79itAHKHHEByyABABABAABEIKMOPPQQQQQQPPPONNMKIIHHHHIEBBABIMMMMNNNMEti93<///<<|333||5cfcfioppoic3/~)))))))/<<|39cfc93335995|<//({~{)),>;--%$#++++...... .  . .  ..+",
+"++@@#%*;;'!^(_}26666666666}}222}22}[::::]]]:<<||334_|||33559filliifcfiiifioppicciopAAyttptpttof50fpBIMKEEAwptwyyAACBABBHIKNOPQQQQPPOOOMMMKKIIHHEEHEAAwtwABBEIMNNMHyoc5|////<<||||59cfffloppoi93/!,,)),,)<<<<|59c953||5cc93|<</{~{)),'>-*$#++++......     . . ...",
+".+@@@$%*;;'^^(}}2666666662}}222}}2}[::^^]]]::::}363||||1|355cilliifffiiiilopiccipwAEytppppptpi99itBHKMKHAwpoppwwyAEEBEBEHHKNOPPQOOOONKKIIHEEBBCBAEBAAwttppptwBHKKIEwpi93|///<<|3359ffffiloppoi9|/))))),,)/(//<35995335cffc95|</{{{))',-*$$@+++..... .    .     .",
+"..+@@#$&*;;'^^_}}266666662}}222}22}[[::^^]::_<:<3331|311|3379iiliifffllilooofcclwBHEwppoloppiccitEHHKKHAwpoooutwyyECBEBEGCILMOOPOONNNKIHBByAwwwwwwwwwwwtpllllotAEHHBytoic5|<<<|||35fiiffiiopplf5|/~)))),>,)~~~/<|595559fiifc93</{{)))),-%$@@++....          .  .",
+"..++#@&%&=;',^{_}}26666a62}}222222}[[::^:::[<:::||1|}33|35359fiiifffioooppplfcitBHIBtpollpoid9kwEEEEEAwppoooptwwwwyABHEECCFIKNOPPONMKKIHBAxxtqpoolooooptpolliiiotABEEAywpoi93|<|||59iiliiiilllic5|<~))),>-',))))~<359999fllif93</~)''),>*%@@++...               ",
+" ..+@##&%=;''!^(_[}66666666226222a642}}}<<::_::}|1_<:|1|3557cfiiffffioopptplffoAHIHypollppi95fpEHBywtpolproppwywttuzEHIECCFFKNOOOONMHIIEBxxppmlhjffffgfloomlliffiotwAABAAwtpf53||350ciopifcfiiiic5|</~),>---,,),,)/|59555fioif93</~),),,-*#@++...               ",
+"....+###&%*;''^](_}26666666889886067222}}::::]]:}<(/:_<||3559fffccccioopptpiioyIKKEtoliotpf59lAIBytploloprpwyytpnquzEEHHEEFIKNOONNMIGEHEEyzsqmleebbc9909gfiiliiffiilopwABBAyplf9597559iolc99fiillf5|</~)>>-;->,,,,)~|55559fillf95_/!)),>>-$#++...             ..",
+" ....+#@#%=*;''^^_}}}6a6a99899889b99652|}1:_:]:<<_(//<_|||359fffcc99flopppliltEMMKApifipti95iwHIAtpopptwwwwAzwpnnquAEAEEJHIFKNNOMMMIHEEEAAAtqqlgeba87976809cgiifffiffilpwBEBAtplic95439cfc99cfioolc5|</~,>>>---,,,,)/|3559cfiolic5<{~),>--*$@+....              ",
+"  ...+@##&%=;;''^(_[26a688aa99cccfg99522|||<:<:||<__/__|<||59cfc9999floppoiioAKNMEwlfclto939oAIEwpppwBBBAABAwppnquwEBAABGKKKKLNMKIHHHHBBAAwtpooiica8774263779ccccfcffccfltAABAwtof9533|599ccciiopoi95|</),>>>>>',)),)/|399cfioooic5|<~,>--*%$@+++...            ",
+"  ..++@##$&%*;;'^^{[}}6689aaabbcfif9956333|||||4|||<|_<|<||79ccc9959flopoiilpEMNIApiffpti53fpAHEwppwEIIEBAytuprrtxAEACzCCKMMNMMKKICEHHBByAwwqroolfda573}24347759999cc989ciowyAAwplf957||359ciiloooic93||/),>>,>>>>,)))/<59cilooolic93<),>-**%$@++..             ",
+"  ..+@+@##$%=*;',^{_[26688a98999cif995532533}||||<|<1__|||359ccc9959flopoiiowHMIBtliflwwf90ltwBEAttAEEEAywtpqtttwyABAAAzBFLMNNKFFECBEEEAyywtupoooigca74}}1|14335355999999dgltwyAwpoif973359cffilooic9533<~!,>,,>-->,))~/|9cflllliiif9|/'>-*%%%#@+..             ",
+"  ...++#@##&%*;;,!](}}2aaa66809a9fic9966333}:1<|1:<___||||3599999559flopliotBIIBwoffipAtf9foptABAywwywttttptpttwuuAAEBCCGHKMOOMKIBCCCBEAAwwuupppplifc77}}211114|33369909999ciptyAywtoof95599999filif9533|</~,,,,>-->)///<39ciiiiifffc5<),>*%$$##@+..            ",
+"   ...++##$$&=-;'!^[_[266622aa86dcec9965334|1_<|}:<___|<||3399995559flopllpAEIEypifflwApcclooptyywtpojnoptttpspuuxyAEEGEIKMOOOONKCCBEBEBEAywwwtppoiie97322|1||1|||||7589999cfiotyAAAwtpic55555359ffc53||||<<~~),>>->)/<||359fiiffcccc9|<~,>%$#$###+...          ",
+"    ..+@@$%%=-;','^^(_}6662269989bb900077574|||||<|1__|<||1399995559fopplowBIIEwofcfowwlcflolloopligceiopptqttwxuAAEHIJIKMMOOOOOMIJEEEHEIHEAAAwwtpollc9722|1|11<||_<|2695099cfiopyABAytof953333|39c953||||||</),>>--,~/|35999cfcc9955553<~,-*%$#$$$#@@..        ",
+"   ..+@#$&&**=;-;>'!{[[26622a8888dd0076777734333341|<||<|14599995555flooiowEIIEwl99fpwti9fiiiififcc9cellopqqpzyzBBEEEHHKMMNOONOONMKKKKIKMMKIEEBAwtppplic96733|11<|_<<|||23350ccilpwyAAwpic53|33|||5553|<<<|||</),>->,)~<399999c99953||555|/,>*%$$$%%$@+.        ",
+" ..++@@###$&%=*-;;,!!([[226aa88d00d077424633333574||||||||4599955339flolipyEHHBti99fpwoc5cff999ccdccffijoomptAAABBEBCCILLMNOONNOOOOONMKKMMNMIEBAypppppolie0955|1|||||<<:<<|379dggilpwAAwpi933353|<|33||<//<||||/)>>>,)~<|59c99c99553||3595|/,>-%$####@+.        ",
+"....+++@@+##$%*=*;'!!([[286660dd000a666224233355531|3||3||3999975359flolipAEEBAoc59fpwoc59c03439cddchfiloqqpxwyBAEEGCEFFKNNNONOONOONKIHHIIMNKHAAypolloollfe9090334|||<<_<::|25ciiifiptyAytlc55995|<|||<<~~~<|33|/),>>,)/<|3599c995553|||555|/)-%$#@@@@+..     ..",
+".......+++@##$&*-;>'!([[286000ddbbca6622}}}43435311|||3|||3999995359flolltABAyti959itwl939c931409999cfiioqrpwwBEHEEHIKKMNOOOPOOONNNMHEAAABHKMKEBAwpoiliiifc999099953||<|<<|<}39fifffiptyAAyof9ccc9|</<</~))~/|33|/),,,)~<|||359955533|<<||33|/,*%$#@@@@@++++....",
+"    ....++@@##&%-;;'!{[[28a0a0dccceba60a6744444331||||||||3999995555flplltAAwtof539lwwi937905337675dfiimmopuxyEEIIKKMNNOOOPPPPONMMMMIHAyzyAEKMMKIEAtooilifc955709995533|||<|||59cc99cfipwAAAtlfcff5<~~//~),,)/|33|/~),,)/<||13675334||<<(//<|3<)-*%$$$$$$#@+..  ",
+"     ...++@@##&%&;;'!{[[26000abbchkgd00a64441114||||<||<||3599955335flployAytplc559oywi533553|1|246cilkjmmouxBEIIKKNNNNOOPPPPNMKIIIKKKEEBABEHMNNNMKEytppoiic9577790c99953|}}||35553755cfotyAAwoiiic|/~~{~,>>,,{<|||</~)!~/||466373|1|<<<//))<|33/)>-*%$$##@+.   ",
+"     ...+++@##$%&*;'^{[[260088bbggkkgd07744411355||<|||_<|3599995335flolpBEytoi955coAwf3|3|||<||279fiigikopxAEHIIHIKMMOOPPPONKIHCGEIIKIHHEEHIKMOOOONIBywttolfc909999cccc963||2|433||||359ipwABAwpoi9|{]~)'>,>>,~/|3||<//~/<|5632|}|1|<<|<<~)~<355|~>*%$#++++..  ",
+"     ....++@##$&&*;']{([28088bbkggkkgd07a46662553|||||<<_|3599995333clolwEEwpif535coAtc||31_<13769fffffjmpwAEBEBBEHIKNOOPPOONIFECGEHEIHIHEEEIIMOPPPPOMHEAwwtpliilifcccffcc86532||4|<_<<||3dotABBAtoic|~!)),,,,>,)/|33||</(_|5962|<333333||<~)))/|3|~>%$#@+..... ",
+".    ....++@##$&%*;;!{^[280b8ggkgggklifd98676265334||||_<|3599995333clllyIEwlfc5|3coyt9||3|</_4769fhbejmtwAyAAzzAEFIMNOOPOOONKKIHIIIEEEHHEEEIKNOQQQQQPONKEBAwtppttplifgffc999a5||||1_/(/<<|9ftAEBytoi9|/~))),,>--'/|3331|<||39c97|555553|<<~,>->)<||~>%$#@+.....",
+"........+++@##$&%==;!!([28abghggggmlligfd866533952||||1_||3599995333ciloyIEwlc9||3coyp93334</_|429cfjilpwAwywvzzDEHKMNPPPPPOONNNMMKIEHEIMKKKMMNOPQQQQQQPPONMIAywyywtpliifc999985|1||_(/<<|<15fpyAAwtpi9|/~~),,>-=;,/|35533559cgf953333||<//~,>-%*,~||/,*$#++....",
+".++.....+++@##$&%==;!!([280hhggglljmliffd9668a6952||||1|||35999953339ioowEEwic9||5cpyp93334|<<|769fillpxwwutwvxzDFIMNPPPPPOOONOONKIIHIMNOOOOONNNOPQQQQQQPPPPPNIHEBywtpollf99999553|1|_/_<|3|359ipwywtpic|/~~),>;-=-)<39c9c99cfffc72|<<<///~{)>;*%%-)/|<)-%#@+...",
+"..+++...+++@###&%*=;'!(:2a0ghhgllllmliffcd95607055|4|1||||3599c953339ioowBBtic9||5cpwo931|4555099filopttuqsrvxzDHILNPPPOOOONONOOKIIIKMNNOPPPONMKKMNOOOOPOPPQPPPOMKEBAtpoolif97565533|<<<<<|353|5citwwtpl93<//),>>>>,/|59ccccc9c99931</~~~~~~),>>-%%*>~<|/,*%#@+.",
+"+..++++++++@###&%*=;!!([280gghilllplmifdcd997868554|1|||||3599c953|39ioptAApfc5|39ftwo93||49filliiiottuommrtvxCFILMOPOOONOONOOONKKKNNNONOOOONMIEEEEEHHHIKMMOOPPPPONMIEwpppoic85555753|1<<<|5333|49iptwwtlc5|<~,,,>>>)~|359cc9999053|<_())!~~~),>>-*%%*,/||~>*$@+",
+"@+..+@##@+@####&%*;;!!(:2abkgjjjopqlmkfcd90870600541||||||35999953339ioopywoc95||5fpwoc53|4cioppoioptpmhmqrvxBEFKKNOOOONNOONONNMKMOPPOOOOONMKEAywwwwAAAABBEEHIKNONNOONIEywtoic9975355573|||33|33435cotwwtof9|/,>>>>->)~<359dcc999572_(/),',,!)),,>>-%$%-~<|<)-%#",
+"##@+@@#########&&*;;!!([28bknjjnrrrmlifcb90990850541||3|3|35999953|39foopwwi953||5fpwofc535copppoopwpmjmmrswzEHILKNOOOOOOOOOONMMNOPQPPPPONIHEAwwpppttAAAAAAABABEIIIKNNNMKEAtpiiif955559053|||||333339lpttoif5<)>>>>>-')/||7ccfcc99721<(~]!'>,')),,,>-%$$%>/||/>%",
+"-%$##@@@##$$$#$&&*;'!{[[26bknmjmrrrmllggc9009d09055533333|35999953335flopwti953<|5ftypic9|3clppootwpnkjmrpxzBHHLKNOOOOOOOOOOOMMNOPQPPPQPNKHBAAAwpooptyEHEEEEBBBBEHEEEHIKMMKEAtoolf995590953|||1437|||9ilpoli93/,>>>>;;,):<359iifcc964|</~)''>,',)),,>-*%$%-~|3|)",
+"~,*%$##@@#$%%$&%&;;'!{[[2abknlrmqrqmllkgc9089dddd055553333359ccc53335floptti553<<3ftytif9330lpplpwtlhghmrwyzFEILMNOOOOOOPOOOOMMOPQPPPQPOMIEAAABAwptttyEIKKKIIHHHIKKEBAAEHIKKIEytplf953335555||11273||35ciooif5|/)'>>';'']_|30fiigc95241<~!)',>;'',),,>--%$$*,/||",
+"|<~>*%%$$#$&%%=*=;;'!{[}20bkorqrqrrrlmifgc988cgfcd59555553559fff95559floptwl553/<3ftAwoif530lppotwpfggmmszzBFEIKNOOOOOOPPOOOONOPQQPPQQPOKHEABBEBAywwywAEKMMNMMKMNOONKEAAAyABHIEBwpic953||35553345993||35ciiif95|/)>;',,!]/|26bcfiff9631|</))',>;>,,,,,,>>=%$%-)/",
+"/||<~>-*%&&$%%*->;''!{[}60bkosrquusromliifc9cdggigc999955599ciiic9559foptwyo993/<3ftAytpi95cmoopwpihgemmtAzDEIIMNOPOOPPPPPPOOOOQQPPQQPNMIEEBBAEEEAywyyAEKNOPPPOOOPQQPNIBytpppwBEBytlf953|1|35555dfg9933359fifc95|/),,))]!(}269ccecfc9534|_(~!,>>>;>'>,,,,,>-**-,",
+">)<||/)>-=&%%=*;;''!^_[}a0bhutsuussuooolifd9dddfkigc99999599fiilic999fptwABpcc5||5iwAAAwofciooowtlhhgemqwzzBCHIMNPPPPPPPQPPOOOPQQPPQPNKHEABBAACEEAyyAAEKOPPPPPPOOOPQQQPMEypliiowABAtoic931||359ccfiic953339cfc953|/!))~]{([}0accbcc999053|<<~!',>>>--;''!),,>-**",
+";>)/|||(!'>-*=-;>'){]<}a6dkovtuuuusuroolifcccccdgiicc9995999filiic999fptwBEtic5||5iyBBBBwliopptwplehgjmqwyzDCHILOPPPPPPPQPPOOPQQPOOPOKHBEAzzwyAAyyABEHKNOOPPOONMMMNOQQQPNKBtlffiotyAwplf931||359dfiif9993||5ccc93||</~]^(_:}abcccb85090973|<//{!,,>>;;;-',,),,;;",
+"'',,~<1|</),'>>>,'!]_126adknvtxuuusqqqoiifgc900ddiifc9955559cfiif9959clptAEtic5||5iwByAByoopptwwolfegjqwwyzBEJIMOPPPPPPPQPPOPPQQPOONKHBBzwxptwxwwAEHKMNMMMMKIIHHIIIMNPPPPONKApiccfltyywoic73|359cgiliic953|35ccc5|||||:<_}}}6bbebc8a5269977||</{!,,,>-=*;->,)))'",
+"~~),,)/<|||(!)),'!!^_228bbknruuuuuuqpqpokgga90009iifc95555559cfff95359iptyBti95|<3ftytpppopppwwpolhhknuywzzDEJKMOPPPPPQPPPPOPQQPONMIHBBywuurpttutyEKNOMIIKIHEBBEEEEHMOPPPPOONIyoiccfltwwtlf055559dillifcc93|55ccc53333|1|21668bheca97424375541<<({),>>-==%*->,)!",
+"~~~~))~/<|3|<//~{{(]:226bhknvuvutqqqrmmlkfha80009cffc85535339cccc53339fotwBwi95</|cpwpliioolotpolihjmpwywyzDEIMNOOPPPPQPPPPOPQQPOMIHBEEzxuonpuupotAKOOMIKMIEBBBEEBABIOPQQPPOOOMEwpiccfowwwoic99559gioif99953|59cc9533537222a6dbbhba874111355553|<</~),--*=%%%;''",
+",{{(((__1||||||<__[[}2268ekoruuuuqqqomolkfd900099cccc955353359ccc53335cltAEwi93/~<9lpplillfiopoiiifjmpwwzyADEIMOOOOPPPPPPOPOQQQPNKIHEHBwurnnmuqmjpwHNNNMNNIBBEEEEEEBBIOPQQPPPOONMHyoffflpwwtlfc9990cilf555553359cfc955555669bddghbb8a7}}<<|45555||</~)>;=*=%&&=;",
+"->)~{(<|55||<|34||}|4268dbhnvuuttuqqqnlnkhdda0999ccc9995353359ccc93335citBHyi93/~<9iooooofcilifggeeknrtwwyyEEINOPOOPPPPPPPOPPQPOMKHEHEAxprnnmpmkiopAKNMMNMHAABHHHHEBABEKOPONOOOOOONHwoifiotwtoicc990ciid3|355335cffc909c99dchgggghb8877}2__<|35554|<((),--==&&&%",
+"*=>,)~/<|7|<<|14376786bbhhknquvtvvqqqqmmmkgd09b9cccc8995353359ccc953359itEHAi95/~<5floooicflifddfchkruqtwxzDEINOOOOOPPPOOPOPQQOOMIEHHHApprnkmqmhkjltEKKKKIByyAEHIHEAyyyBHKKIIMNOOOONMEtlffipttpifc9599fc9|<355559cfcfc9cccffkllkkeeb985321_<__|7555||_~)'>;==&&%",
+"*=>;','{/<<(_<|436509cffgjmnrvvtvwwtuqmmmkfdccbccccc9599553359ccc953359itEHAoc5<~/3fiopliiloicabbbhknqqptxzDILNNOOOOPPOOPOPPQPOONIIKKHtppnkkmqmkkjiotBHKKHBAyyAEHIEBAwwwAEEEBEHKMNNNONHwoicflppoifc955cfc3<<|3595cfiiiiffcfimppnmmffb953}}1_<(__|333|_</~)'-=&%%",
+"=-;>,,,,)~(/__|36709cfgiknnstssuwvvvttqmmmiifcbbcccc9999995599cffc9555citEHEpf5<//3cipttpttoiba8bbjmommpsuyDJIMNONNOPPOOOOOPQPOPNKMNNEtpqlkkkmqmkeihlpwEIIHEBBBEHIIEBAwwyBEAywyBHIKMNONIApf9dioplifc90cgf92_:|5999fillliiiiimopppmljfc954}}1<//(<_<|||1</~),;=**",
+";>>''',,'!{((<|589cfcfiloqttxtutvvwvwwuppoliifbcbccc9999cd999cfiiic999fltEKIwi9|<<5fipwABAtlcb88bcimlmprsuDDJIMMONNOOONONOOPQOOPNMMOMEvqqmkkkmmmmhefhiopyAAyyyAAEHIIEAwtwyAytpptwABEINNMIAof09cilliffc9cfc92||359ccilllliiiiloopppqiif9953}}<__/({(/(<_1<</~),--",
+"',,)!{!!!!!{/_125ddfeiimopswxxwwxyvtvwtttpplifcccbccccffgfc9ccillif959cipEKIwl93<<5cfitAEApifcbhhjomjmpsvtDBHKMMNNNNONNNNMNOPONOOMMNMEwtpmnkejmpmmhbheiioppolooopwBEBAwttttwtollooptwEIKKIypg009flollifcfic953|35ccfilloolommnqopppoiibb953}[:((({))))~_||<</))!",
+"/~)){~{{{)]{~:[[70cchilmopwyyyxyyywtswwtttpnifcc9cbcccccfddcccilolf9559ipEMIwi5|//309cfptpicc99bflpommquuxDEHKMMNNNOONNMMMNOOMMOONNMIAwwtolnijjqqmjbbbhehloiec9dciptwtttpppwwtoiiiiiotwBIIEypi959foppoiiilic95|||59cfioopoomnqqroppqolec9553}::(({{),,,'{_||</((",
+"<(/_/_((/{([[[:13669fhloptwyyyyAAAywsvwtttpolieeccbbc999dcdcccfiloic999ioEMIAl5<~~|95559dc89898ccnoonmrsuDDHHKMMNNNONMNMKKNNNKINPPNKEzwwtponljjnuuonebbehfiif9969fiopppoooopwytoiifcfilpwABBAtld99ipttpolllf9953|359cilppppqpuqmqmpqnlngd99531[[{!!',>;>''{<<11<",
+"1|44322}[[[[:_12|226bekopuwyyyyABBAyvwywtttrliffccccc8990999999fiifc99cioBMMEp9</~|753557957a8bbbmmimrsvtDEHIKMNNNNONNKMKKNNNKHKPPNKEwpttpnnllloutwplhjijejif98cfilpttpoliiipwwtoiiffffioptwAytofcfltwwwqolif9956269cfoppttppuuqrqopmollifc9741[:])''>;;->;'{_<|",
+"|35599652}[1142a6268abhiottwzyyyAABAyyAywwwpolifeccfcc990509999cffc9559ciyKMIwc|</|55599995688bbjlomknvuxDBGIKMNNNNONNKMIKKNOKHIOONMEtpppoinlnnpttwttponihflliiliiiloppoiiffiptwtoliif9cfiimtyAwpliipwyytpolifcc98259jilotttpuuuqmnmnmnlniieb53_[])'''-;;-->>,~<",
+"~|49cccdd0755766aa8abhhjmpuxxxxwyAAAAABBAAywpoiifffffcc90999999ccfc93335ftHMIwc3|<|9959fgb968bbcioomkoruyDGGIKMNNNNNMMKKIIKNOKCEMOONHtoioonilnoptuuptttpollpttpoffccfiolfcccfiotwtpooic99cffmtyAwtpoppwAytpooifcccc9cfjioptwtuuuqqqnnmmjiliifc0|[:!'';;------->,",
+"'!_49ciifdefc898abbbbgehmptxwxxxxyAAAABEEBBAwpolieffiffcc909999cffc95335coBKIyf|</_5550dgccb9bbelolmosvtyBEHIKMNNNONMKKIIEINOMBBINONHpjkloliinonmmmqrtwwwttwyytlc9909cfif9999ciptttppoic9999flpwyAAwtppwwyuopoifciifccfloptwzxyuuqqnonkjjiliifc5}:(!'';;*-=-==--",
+";'!/20filiiiiffcffcegjemqrutuuuuuwwyyzAEEEEEAwpliifffffcc99c9ccfiifc9555clAKIAi3//_33||5b9c9ffejmppmpsvwABGIKKMNOOOMMILIHBHMNMBwAHMKApjjloliionikkmmjoopppwtttpic97755cffc99999flptppolifcc9dfipyBEEytppwwxtoomiioolecfilqpwAyAwuuuqnokmjejfiffc52[{!',;;**-**-;",
+";'!^[|9giioollolinikjjmnpususuuvuuwwywyAAAAAAwtplliiiifgd9cc99cciifc9555clAKKBo5|<<73||36988bcikmpqtptuAAEEIKKNOOOOMMJKFEzGKMKEwtABBwpjiioolnlojkkkkkjijiloolliig973359fiifcc959ciopooollifc9cflwAEEBwtttwyttopoooppoiijloptAABAwuuuunnmjjhjcchd972}{~'';;;;;-;;",
+";''^(16acilppppooqoolqqppsuuuuussuwwwywyAAyAAwttpolllliifcccccffiiic9555clAKKEp9|||5553599899bikouptwxwDEEIKKMOOOONMMJLHFzAHKKHyttwtpolgfioonlpqmmkkhhbhcfgcccfiif95359iooifff9959ippolllolfccclptyABAAwtttwttpppopollmmloptyABAywuuuoommjehfc999573}/{!'';;==;;",
+";'^^_22abchilrtttpppuuwtwwwxuuuuuuxwxwxwyyyyywtpplllllliififffffilifc555clAMMIwc3|15990ccdcecjimppputuABHEIKMNNOOONNMJHFHzAAKMMEtoppppoieekllloptpqmmjh8ab07659foic059fippliffc999fopoiiiloofdfioptwyBEBytppwttpppoomppmmopwwyBBAyuuuuprmjjhe988857321_/)'';;;;;",
+";!!{_268aehfkmquwwwwxwwAyzzwxxxuuuutuwwwwyywywtpoliiillliiiifffiillic999ciyKNKyf3319cfgffiefhjorptwwwxABEHIKNNOOOOONMJHFFzyyHKNKApilopoibbeiljnottwtqnjeh95}}||9iic559fiillifc99559iooiffiloliilloptwEHHBwpppttupppoqqpppppwwwBBBAyuuurpmmjeee98aa3342||({!,';';",
+"!!!{}}28bggkknopswzzAAyAAzAyxxxuuuuquuuutwwwwwtpoliiiiiiififffffiiif95559fpHMKAi5339ciiiiifefkopwtwyzABEGIKMNNNOOOONMKHHECywAINOIynilrojhhheilnjmpwwwtplif7}<:<|9fc559cffilifc995559illfcfiloppoloptAEEEEAwutttttpppptttpruwwAAEBBAyuuuppmmihffaa6a|1|[|}[_{!'''",
+"^!{_}}88gjkjjnqqruuyABBBCCzAxwuuuuqqquuqquutwwtpoliiiiiigfffcfccfiif953359lBMKAi3|15diokifchekppwwwyyBEHIKKNNNOOPOONMKHHECAwxEMPOIwollolifhbeinjmmrsttwtpl82_(]_|09555999ciliicc9955ciolifcflpwpooptABEEEBAwtpttuwwttttttuuwxAAEEBBAuuuurrmmjhff8622|1<__:}}:[^^",
+"___}}28bgjmmmmqmttttyAAAEBAAzwxttuuqqqqqquuutttpoiifffigffffccc9cfff95||39iAKIyi3||39iliiefhgkrttwyAADEHIKNNOOOPPOONMKHHEGBwuAIOQPKypololifeehoommoprotttoc6__(_<455735335cillicc9959flppicciptwpoptyABBBBAAwtpttwxxwttxwuxwxAABEEBAAuuuurrmmiffb86222|1__[:[:[[",
+"436268abgmmmmpspppwwwxzABzAAywwwtttpqqqqqruuuttpoiifffiigfgfcccc9cfc953|39iwIIyi5||49gfkgcbbgjotwwyABDGHIKNNOOOPPOONNKHHECByuxAKOQPMBtoooolijinpqmnkjiilllf93|:_<159533|||5cillifc959ciptoifilpttpptwyBEEBBAAwttwwwwwwwwutxxAAACCEEBAAuuuprrmmhhbc8a2222____<1||",
+"a889cbhghmsqrprvttuxxxyDAyxzyxxwtttuqqppqqptuttpojifffiiiiffffccccff953||9itEIAl53479cgfcbabgiqttwyABEHKKKNNOOOPPPOONKIFECEyqqpyHNPPNHwpppproopuutmkjfbefdcd531|3339953|<<|5ciiifcc99ciptpiiiliottttwyAEEEEEEAywwywywwywttuxAAAEBBEEAAAuuuponmkjbcbbaa2}}}}__114",
+"2a89ehkkjmpxvtvvtuvuyDADAwuutuuuuttpppquppputtttpoliiikkliiiifffffffc933|5fpBIBp95509ccfdcahjjpttwxABHHIIKNNOOOPPPONNMIFGEEAuqnqtAKNOOMHBywtptttwwumjhaad099953353359953<<<|3cfffcccccipttpppoikopwwwwAEEBBEHEBAAyAByyyyxuuAAAEEECCEEAAAxuuurokkeebaa86222}}}}}2",
+"228bhimoqquvxxxxuwxyDDDDyxtuuqqqqqqqpppttqptuwwwtpoliiillliiifffccffc93||5coAEBtc579ccfbbhhkjptywwzBEHGIIKNNNOOPPOONNMKFHCEBwuomlotAHIKMKKHBywttutuoehaa5657555505555955|_<<|5ccccccccipwyyywoliiotyyAAEEEEEIHEEBBABEEAAAAAABBEEEGCBEEAAAxuuuonkkkeha8882222}}}}",
+"6aa8bknqqxAzzAzDDDDDDAADvwuqqqqqqmmmqpqtttptwwwwwpoliiiilliiiffccccfc95||39lwBEtc7379c900bhkjqtyzyAEEIHKKKNNNOOOPONMKKKFECBBywsqlilopwAEIKKIHEAzwtpoifa642a73555995345955|__<35ccc9999fowAEEAtollmpwzAABBBBEHIHHEEEBEEEEEBAABHHHHHGGEEEAAAAuuuonnkkkeha8a88662}6",
+"668agjjquwAzFEFBDDAAACAywwuqqqqqnnmmmomqpppptwwwwtpolliiliiiifffcccfc954139iwBEwf7509db8bagjmqwwwxEFEIIMKMNOOOOOOONKKKIHFzAyxxtpoollllopwyABEHHEBywpnfa73}4333355553355553<__|59cc9555cipyEHEwpoolptABBAEEEEHIIIIHEHEEEEEEEBBHHHHHJGGEEEEAAAuuuqnnnkkkebb8a66a66",
+"88ddeemmsvwzFHHEEHGGCCDywvtqqqqqmmnnmkkkmolopttwywpolliillliliifccccfc54|39ipAEyl550ddb8bbgjnpwywzDEEIIMMNOOOOOOOONKLKIHDzvwwxtqqollliillooptwACEEAywoi932||143555553559531<_|39cc95559cipAIHAwtppttAEEEEHHHHKKKKKIIIIEEEEEEHHHHIIHJGEEEEEAAyyuuqqnnljgggbbbb888",
+"dddeemhrrvxzEGIIJIHEECBAywvuqqmmmmhkkkkgkkkkmptwwwtpolllllollkiffcccfc95|35fpwBAo968cfcbbhgjmtwyxyAEEHIMMNOOOOONOOMKKIIFFzvvtqpmmoinlilllliinlqutwAAAwpld6||}|||33599559953<__159cc95599ciwEHBAwtptyAEHIKKKIIKKMKKKIIIIIIIIHHEHHIIIIHGEEEEEByyyyqqqqqjjjhggddddd",
+"eeemmmrrsxxDDJJILKIIHEEAAywtqqmmhmkkkggggkkgiopttwtppolloooolliiffccff95345cowBApc70ffhfekjmmtAyxyBEEHHKKMOOOOONNOMKHIHFFzzxtqnlmijiiiiilllijmmjnloppttplf93|<|||359c999995||__|5cfc99909ipBBAAAwwwyBEHIKMMKMKKKKKKKIIIIIIHHEEEHIIIKKIHGGGEBBCCywwwqqqqmmjheehee",
+"mmmmmrrvvxDDEJIKKIKIIEGAAAvvqrmmhkkkgggggggggiopptppoollooooolliiffcffc9335cotAAtf9ciffejjmmmtAzxAEEEHHKKMNOOOMMNMMIHFHFFCzytqqjgeebbceffiinnnjihhfifillooif53|<||55cffcfc94||<|49cfffc99foyAwAyywwAABEHIKMKKKKKIKIKKIIIIIHEEEGEHJIKKKKIHEGGGCAAAxwuttmmmmmmmmmm",
+"mmmsrrvvxzABJHKKKKKIIECBAywwtpqmmkkkgggdggggfilppppoomlllooooolliifffff9735cotABwicciiiiillmttAzyDFHEHHKKMNOOOMMMMMIFFEFEAzytqmjggb8889abbhijmifgef9b880ciiiic5|||359ffiiif53||||5cfiifccfowytwyywwAADEEHKKKKKKKIIIIIIIHHHHHEGGEGHKKKMKKKIHGGCCCAAAyvsuusssmmmmm",
+"ssssvvvxzDDEJIKMNMKIHHCCyvvwsuprmmlkggggdddfffloppppolkillopopoliffffiid055cotAEwoffiiijmnrqtyzAADEHHIJKKMMNOMMMKMKIFEFEECzyssmjggbba8888bhfkeebbbaaa854239ciiic53||59cilolc53||170ciifdciowwwtwywyyAAEEHKKKKKKKIIKIIIIHHHIIJGGGGHIKKMMMKKFKHEECCzzzzvvvvsssssss",
+"vvvvvvxzDFEIJKMMNMKIHEAzzwvtsppppoliifgddddfffjooppplmjklmoppooliigfffic955cotAEypiflolimnqqtAzzABEHKIHKKMMOONMKKMMKFDACCCzwvsmeedgbbb88bbbghebba68a6a4|}||35cfiic7|135ciopoc5|1||5cilidciowywttyAAyAABEHKKKMMMMKKIKKIIHHHIIIHEEHIKKMMMMKLKKIIIIEBBzzzzzwxwvvvvv",
+"vvvzzxzDFHIJKMMNNMMIHEBzzxtsspppppolkiffcddfggilopppomjmlmpppppolificfic9559otyEBtlglpomnmmsuACzDDFIKKIIKKMONNMILKKKHAzzCCzzvsmmeggbbbbeeehkeebaa66aaa1[}<<}|35cilf9|||5cipwpc5|1339fllifiowwtttwABBBAAEEIKKKMMNNKKIKKIHHHHIIIJHHIKKMMNMMMMMKKKKIFFEECzzzzzzzzvv",
+"zzzzzDDFHHJJMMMNNMMKHEEzzwwsrrprppoliiifcccgiiilopppolmimoopppppolfffiigd08bipyEEwojoppmmqqsyACzEEEIMKJIKKMNNMKJHIMKHCzzzzzzytmmjjggbehehkkkjehca866a31:}<<_<<<39fii93||5coyAo933355cllliiowwwttwABEBBEGEHHIKMOONMKHIIIKIIIIKKIIIKKKMMMOOONNMMKKKFFHEFDDEFCCzzzz",
+"FDDDDFFHHLIMMMNMMMMKHEEzzzussrrrponllgfffccgllijoopppomkmopppppppliiffifc86aipyBEyplotppoqutABCBEFFIMKIIKKMMNMJJHIKKHCzzvvyzAttqqjgkkkkkkkmnnjjifb98a73}1<(((_/<|79ffc9335fpAwl93350dioollpwywtwyABEEBBEEEHJKNOONMKIIIKMMKKKKKKMKKKMLMMOOONNNNNMMMIIHFFEFFFFFDDF",
+"FFFFFHHLLLMMMNMKKIKIHHEAzztsssrnooolijifcccdiiiilopppommoqpptpppooiiggffca9dfpwABApljpqmqmutzBCEEEHIMMKKMMMNMMJIHFKKIGzwxwvvvvuqqjjkkmmmmqqoonollijfcd76|<:_(~/<<<359fc9559itAwi0559dilpoopyAwxtwyBEEEBCCEEGIMNNNKKIIIIKMMMMMMMMKKKMLMOOOOOONNNMMLMLHHHHFIIIIFFF",
+"IHHHHKLLLMMNMMMKKIIIHHEBzzxtssroonoliifecc0dfgfiiooptpomoopptptppooiikkig99cfpwAEAwnlqpoqqpwzCADFFHIMMKKMMMMMKJEFEHIJEAyvvwvvvssmqjnmmptttwtpppliiififc953||<///(/_<35cfc99fowAti970dfiopptyAAywwAAEIHEGEGEGIIKKMMKKIIIKMMMMMMMMMKMMMMNOOPPOOOOOOMMLLLHHIIILKLHI",
+"LLLLLLKMNMNNMMMKKIIIHHEBAzxsssrponooijfc9900dffdfiopppoooppptwwtpponkiiigcdbjrwAEBwpnqpumprtzzADEFEKKKIIKKMMMJJEEEEIIEBzvvvvvvstqurrtwwwyttponfebcc0dd9c99053|<<//(<<|9cfc99fpyAti99dgilptwABAAyyABEIIKHCGHHHJHIIKIIIIIIMNNNMMNNNMMMMMNOOPPPOOOOOOLMMLLKKLLLLLLL",
+"MLLLMMNNMNNNMMMKKIIIHHEBCxxxtsrroooliigc90000cdddjlopppolqpuwwwttpollilllhebeowAEEypmpxuursuAADDDFEIKMIIKKLMKJIDDBCEHHEBzAvvyAAyuwywwwwwtqlief866643||233755553|<////<|5cifccitBBticciiipwAEEAAABBEHIKKIIIIHEGEEHIIHIIIFKMNNNNNNNMMMMNNNOPOPPPOOONNMLLLLLMLLLNNM",
+"ONNNNNNONNNMMMLIIIHHGHECCAxxupprrnlnigcc0008999ddciloppmlpppwwwwttpollmmlhebeowBEEAuopxuurvxzBDDEEGJKKKKKKKIJIEDDACEEHHEECAACBEBEABAwtsppmiba86222}1_[[(]__||3553|//~/<|5ciifflyEBpifiiiowAEEBAEEEHIKMMKKKIGGCCGEJJIIIIKKMNNNNNNNNMMMNNNOOOPPQPOOONNONMLMMLMNNNO",
+"OOOOOOONOONNMKKKIIHHGEEBBAxxpsprnnliigcc0070999ddcfilooomoqpwwywwtppmlmllihhjpwAEEEuruuwtwtxAEBDEEIIKMKKLKKIIJFDDAzAEEHHEBEEEHIIHBAyxxpomkebba6222}__^^{{{{((<|333|</~(_|39iiiipyBAtllilotAEEEEEIIIKKMMMMMIHCCECGGIKKKKKKKMNNNNNNNNMNNNNOOPPQPPPOONNNOOOOOOONNOO",
+"POOOOOOOONNMMKKKIIHHGEEBByxxsrronliigfcdd0009099d0cilloolpqpwwyyywppppnoolijjowBEHEyuuwyzvwvCFFDEIIIKMKKMKHIIEEEBzAACEHEEEHIIIIKEEyxxuunkeecb62221}_^^({{!!)))/(||3||/~~/<3cilllpABAtploppyEEHEHIMNNMKMNNMJHECCCCGIKKKKKKKMNNNNNNNNONNNNOOPPQPPPPOONNNOOOOOOOOOP",
+"PPPPPPPOONNMMKKKIIEECzzzzxxssrponljgfgddd0899989d0ciiloomoqptwyyywtppnppppnijnwBHHHAwuAAzwzAFHEEEJIIKMMMMMHIEEDDzxzzAEEEEEHKIIIHHBAxxuungbbbea2221::^^{{{!!,))){~/<|33<///<3ciloowBEAwopptyBIIIHIMNNNMMNNMIEEECCCGKKKKKKKKMNOOONNNOONNMOOOOPQPPPPPOOONNOOOOOOOPP",
+"QPPPPPPOONNMMKKIGGCCCzzzzxxpprronlggfdddd0999660c09filoomoppwwyAAwutpmnqppnjjosBEHHEwwABzzzAEFHGJJKKKMMMMIJIHDDDzxzyzBEEEEHIIHEEEAAAxxplgb8ba62211::^^{!!!!)))))))~/|33|<//<39ioptAHHAtptwyBIKKKKNNNNNNNNKIHGGBCCHIKKKLKLKMMNOOOOOOOONNONOOPPPPPPPOOOOOOOOOOPPPP",
+"RQQQQPPOONMMKIGGGEEDDyywtttprrnlliggddddd0885560dd9dfilpoopptwyAyyuuqrnoqpnnnnuAEHIExwyECzzCHHHJIIKKKNNNLJJEFEDBzxzyAAAEHEEHEEEEEBywuuokgb886222_1:^^{{!!!,,,,))))))~<||||_<|3ciotAHKHytptyBIKMMNNNNONNMMKIHGGBCGIIJIKKKKMMMMNOOOOOOOOOONNOOPPPPOPPPPOOOOOPPPPPQ",
+"RQQQQPOONNMMJJGGDADDyvvsssrrrooniigdddddd0665566c989filopmpptwyABywuuprppprnmmuAEIHEAwABBzzCHFHJJJLLMOONMJJHEDBzxzzAAAABBBAEBBACBBwwuungb8a822221_(^^{!!!!,)''')))))))/<|||<<|3cipwEKKEAwwyBHKMNNMNNNNNMIIIIHEGCCHHGIJILLMMMMNOOOOOOOPOOOONOOOPOOOPPPPPOOPPPPPQR",
+"RQQQQPONNMMJJJEBDDyvvvssrrrrnolkkigddddd00566255cd99cilopopptwzABzwwuuuuuuuqnmtAEHIHAzABEAzEEHEJJJKMMNONKJIEFDzxxzyABBBAAABCAAzACzzwqqjgb88262211__^^{!!!,,'',))))),)))~/||||||5clpyHKKEAwyAEIMNONNNNNNIIIIIIGGBGEEEGHJLKMMMMNNOOOOOOPOOOOONOOOOOOOPPPPPPPPPPQQR",
+"RQQQPPONMMJJEEDDDyxwtqqqmmmllmkkkigddd09007672600d979floppputwxBBCwwwuquuuuqrrsAEHKIEAzBEEAEHEEIJKMMMNONLJEFDBzxzxvzABBCBCAAAAzzzAwxqiggb88622211_^^{{!'!,',,,)))))!,),)~/<||||39fltAIKIEAAABHMOOOONNNKIIIIIIHECGEGCGJJIKMMNNNNOOOOOPPPPOOONNOOOOOOOPPPPPPPQQQQR",
+"RQQQPONMLJJEBDDAxuvuuqmmmmkkkkgggggddd089007666599809fioptpptwxBBAzwwttquuturrxAEKKIHAABEEEEFFGJJMMLMNONKIEDBzzzvvzAAABECCAAzyzzzAwqqjgb8a8622}___^^)!!',,,,,,)))))))))))~/|34||59ipwEIIIEBBEEKOOOOONNKIIIHHIIHEGEGGGGHIIKKMNNNNOOPPPPPOONONNOOOOOOOPPPPPQQQQQQR",
+"RQQPPNMMJIFEDDzxuuvrqrmhhjkggghhggfgdd9a9086775559090cioptpptwyCCAzzwttttwutrutABIKKHBABEGEEHFEJJMMMMNONKIFFDAzzyyAAAAAzAAvyxyyzAAwqjhgc8a2222_|__^({{!!)',,,,,)))))),))))~/|33|35citAHIHEEEEEINOOOOOKKKIHEEHIHHEGEGGJGIKKKKMNNNNNOPPPPPOONNNOOOOOOOOPOPPPQQQQQR",
+"RQPPONMKJJEDDxuuvvrvqqmhkkkhhhghhhhhd08a89967767880909inptpptxyCCCAAzztttwwxuuxzEHKKHCACEHEEEEEJJMMMNNOOMIHFFAzzzAzztttutvvvvyvAAummjgbb8822}21|}|}</_/~/{~~))',))))))!!))~{/|35337fowEHIHEEEEIMNOOOMKKKIHGGGHIIHEEGJGHIKKKKMMNNNNOPPPPPOONMNNOOOOOOOPOOPPPQQQQR",
+"QQPPOMMJJEDDzvuvvsvmnkjhhfcccdd09a0aaaa0a8905775895900flpptpuxyCBCAzzzzxxzzxxuuCEIKKICzCGHEHEEEJJMMNNNOOMKHEFAzzzyyutttttttvvyzAztmmjgb882222333322|1<<<</<///~~~~~)))!!!{~~/<|59779ipAEHIIIHIIMNNOOMKKIIIHEEEIKHHEJHHJIKKMKKKKMMMNOPPPPOONMMNNOOOOOOOOOOPPPPPPQ",
+"PPPOOMJJEDDDuvsvsnolljjhd00cbaa00a99058a7a895236905600cjpttttxyACBAzAzzxxzzzxzyAJIKMIGCCCHIIEEEIJMMMNNOONMHFFBzzzvvsssttttttxzAzwtmhggb886668095321|_(~{~~~/(////</(~~~)!~~~~(|39999coyEHKKKKIIKKMNMKKKIIHHEGGGKKHEHHHIKKMMMKKKMMMMNOPPPOONMMMMOOOOOOONNNOOPPPPP",
+"PPPOLMJJEDDxvvsvnnnggggdd000777777777a6aa6659656586700djptwwwxwAzCAEzzzzxzzzzzzBHIKMKGCCEGIIHEEEJKMMOOOONMHFEEAzyvvuustutuwwwwwwxqqjgb8868a99053}}/]{{),,',!))~(/<<<</~~~~~((<<|7dcccltAEIMMMKKKKKKMKKKIEEGGGECHKIIJIIIKKKMKMKKKMMMMOPPOOOONMMMNOOOONNMNNNOOOPPP",
+"OPPOLKJEDDzvussnnnkggggdd0007777777774657a3599559556a0ahotwwxxzAzACEBBzzxxBAAAACHKKMKGCACEIIHFFEJKMMOOOOOMIHHGAzvvwstssttwwwwwwwwqjggbbc9ccc954|[:{!,,,>>;;>>,,)~~/<<<<</(((<<|139cfgltyEEIKKKKKKHIKKKKHECGEHGEHIIIJJIIIFIKMKKKKMMLMNOPOOOONMMMMNOOOONMMMMNNOOOO",
+"OOONLIJEDDwvsvnnhkkggb88aaa222222222274132259999953700adoswywxzzzAAAEBAAAACBABCCHKMMKHCzCGIIHEFGJIMMOOOOONMIHEzzwwytsuuttwwwwwwtqmjghbfbccc05||<[{)!,>;>;;->->>,,)~/<|||||<<<11375cfiiowABHIKKMKIHHKKIHHECGEHGEHIIKIKIIIFIKKMMKKMLKKMOOOOOOMKKIIJKMMMKKMKNNNNNNO",
+"ONNNMIJEDzxvvnnnhggbbbaa7744411111112}411423599cc52200adiptwywzAzzzAEEBAABCBECCCGMMMMJCzCEEHEBFGIIMNNOOOONMKIEAzwwwttstttxwwwwttmhgghbiec8833|_[^{)!',>>;>>>>>>>,!!~/<|||33111|3779cioopwAEIKMMIHHIIIHHHEGEGGGGHHIKKKIIIFIIIKKKIKLLKKMNNNNNNMKKIJIKLMLLLLLLLMMNO",
+"LMNNLIEEDxxvvnnkhgbbb0a7774441}[[[}111}11134459cc5220dadjpwwzwywzzAAzEBBAAEEECCCHMNNMIGBBEEEEDFGIJMMNNOOONMKFFzxzvwvssssuwwwwtummegbcfb906|1_(^^^!!',;>;;>->->>>,'!~~/_||3373||376acglpttzEIKMKIIHHHGEEHHHGGCCHHIIKKMKIFFHFIFKKKIIKKKKMNNNNNMMKKIJJKMMLKLLLLLLLL",
+"LLLLLJEEDvuvrnkggaaba0aa222}}}}[[:}}[1_:1112239995345badiowwyzwwwzAAzBBEEEEHGGCGIMNNMKHCCGBEDDFEIJMMNNOOONMIFDzxzxwxsssstxwwussmedgebe8622_(((]]{'''>;>;-*-=---->>,))~/__1137337aa9dilptwzAHKKKKIHEEGEGHIHEECCHHIKIKMMKIHHHFFFKIHIIIIIKMMKKMKKIHHEEHIIIIHHHHLLLL",
+"ILLLLHDDzvvvrnghbab00a6a6}}[[[[[[::[[_1_:11211|441247adhhmtwyzwwwvzzAzBBEEEHHGEIIMNNMKIFCCEEEDEEIIKMMMNOOOMLHFDzzwwxssstwwwtsummegecba62}__({^^^'''>;--=**======->',)){(__<|4508600chkptyACEKKKKIECCEECHIIHEEEHHKKIKLMMKFHFFFFFHHHFFIIIKMKKLKKIFFFDFFHFHHFEFHHHI",
+"FFHHHHDDwvvvrkghba0066622}}[[[::[::[:[[__[11|1|111135a0henpwyxwwxwwzzzBBEEHJHHIFKMNONMIHFHEEDDDEEIIMMMNNOOMKHFDzxzvvvsstwwwtmmmeggccaa2}_({{!!^^'';-=*=***&=====->>,,!){_<_|4609ddhbflowyAzEHIKKIECCCBzBHIHEEGHHIKKKKMMKFFFFFFHHFFFHHHHIKKIKKKHEEDBBBFFFFDDDFFFF",
+"FDFFEFDDxvvrnkgbb00662222}}[[]]^]^^][[::__[1111111112a0hhjrwywxuwwwwzzBBEEGJIKFFKMOONNKHEHFEFBFEEIIMKKNNOOMKHEDDxzxvvsstwwwsmmmeghfb62}[(^{!!!^!';;-=*&%%&&&=====->',!){(<1}2269cfhehjruABAEBHIKIECzAzzAEHHHHIIIIKKIKMMKFFHEEEBEFEEEEEEEIIIIIIIFBCAAzzAACCCzDDDF",
+"CCDDDDDzxvvrnkgbb00a22222:[[[]^]^^]^^^:^[__:|111111124abhjqwyyxuuxwwyyzBEEJIKKKFKNOOONKIHHHFEFFEHJKKKIKMMMKKJHFDzzzvvwtwwwttmmegkbb62}[(({{!!!!'';;-**&%%%&&&====->','){(_}}2770bhfinjnqyCBBEEHIIHCAzyAzBEEHIKKIIKKIKIKKIIHECCCCCBBFEEEEHIIEHHEBzzzxxzzzzzzzzzzz",
+"zzxxxzzxxvvrhkgb006a2222[[:[:]]]^]]]^^^]^:_[:1111114277bhjnuwwxuuuwwwzzBBEJIKMKKMNOOONKIHEFHEFFEHKKKKIKMMMMKIEDDzzzvvvtwwwummmjkicb2}[(({{!!!!!'';-=*&&%%&&&&====->','){(_}}7559bchlmrqszCECAAEHIIEAAzAAzAEHIKKKKKKHJIKKIHCCCCCCCzAzBEEEBEECCECCzzzzxxwzyyvzzzzz",
+"vvvxxvxxxvrrhkbb00a2222}}:::]]^^^!^]]^{]]^:_[111[[124770hhnptwvuuuutwzzBBEGIKMMMMNOPONMIHFFHFEEEHKKKKKLMMMMKIJEFDzzzvwywwusmmjgkeb6}[[({{!!!!!'';;==*&%%&%&%%%===--;,'){(_}270aabhjnpqtxzEECAzzEHHEEAAAzzzAGIKKKKKIJJHIIHGCCGGCCCzzzzCCCCCGCCCCCAzyxwvwwyvwvvvvv",
+"vvxvvvvvvvrrhhbba66222}}[[[:]]{!!!!!^]^{^]]__:_[_:}}47a0hhnpuwwtuuuwwzyzBEEJKMNMMOOOOOMKHFHFEFDHHKKKHHHKKKIHHEFEFBzzvxzwwtsmejkjb82}[(({!!!!!''';;==*&%%&$%$%%===*-;,'){(_}27aaabjhnqqtxAEEBBxzCEEHEBAzAyAzEIKKIIKIJGEHHEGCGEEEBAzzzzCCCCCCGCACBCzyzwwwvsttsssvv",
+"srrrrrvvvvrrhkb0a6222}[}[[[:{{{!!!''!!^^^^]]_[[[[:}}26aahhhnttwtpuuuttzzBEEJLMLMNOOPOOOKIIHEEFEHHKHIHHHIKIFEFEFDFFzzzvAAttmmhkjcb2}[[({!!!!!''';;;==%&%%$&&$$%&==*-;,'!{(<}478bbhjjmmqxxABBBBCzzBEEEEEAzyyzEHIIIIKIIHEFECCCEEEEEAAzzxzBGCzCBBzCBCAAutusstuusssss",
+"srrrrrrrrrrkhbb0a6222[::[:(^]{!!!''''!!^^{^^:_}[:}}}466ahhjiputspuuuttxzBAEGKMMMOOOPPOONIIIFEFEHHHFHHFFFFIFDBDDCAzzzvvAwtmmejkhc82:[({!!!!!'''';;;=%%&%$$$$$$%&==*-;,'!{(_}45abhhjmmruxzAEBBBCCzBEHIIHBzyAAEEHIIIKIIHEECCCCBEEEEBBzxwwzBBABBBCAAyywtttsspmmmmmmm",
+"mmmmmmmkkkkkhbb08622[[[[:((^{{!!''',''!!^^^^[_1__}}4a666hheipputrrruutxzBAEGIMMNOOPPPPONMIIHHHEHIHFFHEEHIIHEBAACCzvvvtwtmmjjkic92}[[({!!!!''>'';;==%&&$$$$&$&%%&=*-;,'){(_}47abhjmmruuyzAEEBCCAAAEHIIIEBAAACEEHIKKIIHFEAzzzCBBEEEBBzwwyBEBCBBByyyywwtqmmmmmmmmmm",
+"mmmmmmmkkkhkkbb08222}[[:::(^{!!!''','''!^^^^^:111}}47666bghhlptpppquuttxxAEGIMMNOOPPPPONMLIHHGHHHHFHEEFHIIEAzzCCBzvvtwwqmjjgkjb82[[({!!!!'''''';==&%&&$$$$&$$$%&=*-;,'){(_}47abhjmruuwxzABEBCAAADBEHIIHEBAABCGEEIKKKHFEzzzzzAyAAABBBywzAEBBBAAyyyywqqqmmmmmmmmmm",
+"eeeeeeeeebbbbba08222[[[[__^]^^!!''',,','!^]]^]11}}}47a68bhghjppqpnppustxxAEGHKMLNOPPPPPNMKLLHHHIHIHHFEEHHECzzzCBAzvsuwqmmhggeca2}[[({!!!!;''''';=*&%&&$$#$&$$$&%&*-;>',{(_}47abhjmuuwwzzCABBAAAAADEHIHHEEBzBECEEHIIKHEECzzzywyyAAyBBzzyAEEAAAAyyyuuqqqqmmejjjeee",
+"eeeeeeeeebbbbb006222[[[[__({^^!!';;;'>,''!^]^^:1}}}78aa68bhgjnpppopqqqtxxAEGGKMLMOOPPPPOMKLLLLLLIIHFEDEEECCzzzzAAtstqqqmeeghcba2[[({!!!!';>'';;;==&%&&$$$$$&&&%%&*-;>',{{([4aahhmnuuxzzACzBBAAAAAABHHEEEEBAACECGGJIIHEGzAAzwwwyAAwyywytwAAAAAAAuuuuuqqjjjjjjjgdd",
+"dddddddddddaaa00822}}[[[_({^^^^',';;;''''!^^^]_}}}3666a6a88hhoppqoopqqtxxAAGGKMNNOOPPPPOOMKLLKLKIIHFEDAACCCyAzzywusmqqmjhggfba2}[[({!!!';;;;;;;;=*&%&&$$$#$$&%&&&*-;>'!{{_[4aahemnuxzzzAzAAAAAADAABEEEEEEEBACCEGGGHHHHBCAzAuwwyyAyywwuutwAAAAAxuuuuunnljjggggddd",
+"8888888888888888822}}[[(_((^]]!,'';;;;',,!!^^([}}2a66666aa8ahlpppnnpqqppxAACHIMMNOOPPPPOONMKLLKKIIHFFCAzCCCAzAzywumqqjjjggebb82[[((!!!!';;;;;;;;=*&%&&$$##$$$%&&%*;;>'!{]_:78ahjmnuxzCzzzCAzyzAAABBDEEEEEEBBBBGGGGGGEEBCAzwuxwyAAAAywwtttyAAAwxwuuuoonnkgggdbbb8",
+"8888888866666666622}[[[[[(^^^{!''>;;;;;,,'!^^^[[}26a6666aa8abhopqnnppqssxxAEGIMMNOPPPPPPOONMLLKKIIHEFCzzBBCAAyAysmmqnjjghecb82}[[({!!!';;;;;;;;;=*&%$&$#$#$$$&&%%*;>>,!{([[788hjmnuxzCCzzBAAyyAABEBDBEFBEEEBCCGGGGGCABzzAAwxwwyAAAAyywuutwyAxwxxuuonllkkggbbbbb8",
+"6666666666666666662}[[:[({]^^!!',>;;;>''!!!{^^[:}46aa226aaaabhoppoorrqssxxACGHKMNOOPPQPPOONMMMKKIIFEFBzzCBBAyyAuqmmjnjggbebc82[[[({!!!';>;;;;;;;=&&%$&$####$$&$%**=>''!{([1468hjmvqwzzzzzCzAyyyABEBAABEEEEEEEHGGGGGBADxzAAyywywAAAAAyywtttwuwxwxuroolkkkebba6666",
+"66666a666666622}}}}}[[[[((]^^!{!'',''''']{{^[[[}25a66a6668abbeottppprqupxwACCGKMNNOPPQPPOONNMMKKKIFEEAzzABCyyywtqmjnngdbebcb22[[((!!!!;;>;;;;;;;=%&%%&#$####$%%%*=;-',!{([1488ejnvwwAzzzzCCAyyyyAEEAABEEEEEJGJHJGGGADDxxyAAyywyyBBBAAywwttqutxxwupnokkkeeb888666",
+"66666a22222222222}}2}}}__:^^{]]!!''',,''!]^^^^[}44a6666666a0cemtwtpppuuuxwAGCGKLNNOPPQQPPOOOMMMKLIFFFAzzABByyytuqjjnggabbhca2}[[({!!!!;;>;;;;;;;=%&%%$&$$#$$$%%*=;-;,'!{_[168bbknvwAAAzzzABAyyyAADBBAAEHHEHJGGJIIHEAAxxxxzyyywyAABBBAyywttquuxxxppomkkhfa8888666",
+"}}}}22}2}}}}}}}}}}}}}}}__(]^{~{]'''''','']^^^^[[}2222222266abckpttqpruuuxxABEHKMNNOPPQQPPOOONLNLLIIFFBAzBEAywquuqjjkggb8ceb22[[[({!!!';;;;;;;;;==%&%%$$$$%$$%%%%==-;,'!{[[266bjhnqwAAAzzzAAAyyyADAADAABHIHHHGGIIKIEBxxuusptwywAAAAEEBAyywqquuxwxpppmkfheb888822}",
+"}}}2}}}}}}}}}}}}}}}}}}}_:]]]{{!!!'''',',!{]^^[[1122222622260abkotprrrqqtxxAAGJKMMNOPPQQPPOOONNLLLIKHECAABEAwtquujjkkgbb8cf62}[[(({!!!';;;;;;;;;==%&&%%&&$%%%%%&==-;'''{{[_468bjhnvwAAAzzzyAAAyyAAyyABBBHIIJIHJIIKKHByxurspstuuyAAAEEEBAAuuquuuxpprmmmjfbbaa8222}",
+"[[}}}[[}}}}}}[___[[[_}}::]^]({{{!'',,!!]]]:[_122aaa66aaaaaabfhlpttpppquuxxAzBGIMMNOPPQQQPPPOONLMLMKHEEzCBEAwqqunjjkkbbabfb62[[[(({!!!';;;;;;;;;==%&&%%&&&&%&&&&&**;>'!{{[1468benqvwAAAAwwzzCAyAAxuuAABCEJIIIIIHHIIIBzxxsspquqquAAAAEEEBAxuuuuuxpppmmijbccb8222}[",
+"[[[[[}}}}__[_:_:([(__[[___[:_//(({!!]{{((<1|1356988999a9cccfjiotyywttxuuzzAAEGHKMNOOPQQQQPPPPONNLMKFEHAAEEAwqqunikkkbb8bf62}[[[(({!!!';;;;;;;;;==%&&%%%&&&%&&&***;-',!{[[166bbknqsyAAAwwyAAAzAAwwuutACEEJKKIIJJHIIKEEAxwwuutquuyAAyABEEAyxuuuuxpspmmjjbbbb62}}}[",
+"[[[[[}}____(([((((((:_1:|1:}1____({{{{(((_1|}34688a8abda9ecchmptAAyyyAAACAEEHJIMMLNOPQQQQQPPOOOOMMMKIHBBEEAwqqunjjkeb88bc62}[[[(({!!!';;;;;;;;;==%%&&%*%%%&%%%**=;;''!{^_166bhknqsyyAwwwxAACAAzxutuuxBEEIKKIIKIKIKHHEAAywtttuuxyAAwwABEAyxxuuupppqomiicbb6a2}[[[",
+"[[[[[____((((^^^^:[:[[[1|}[[_<<__({{{{{((_<11|366a68899a8bbdflouwAAyyAAACCCEIIKNNOOPQQQQQQPPOOONONMKIHCCEEAxqqunjkkbb8acc62[[[[(({!!!';;;;;;;;;===%%&=%%%%%%%%==;;;''!{^_166aekvqwyyAwwwxzCBCBzxxuxxxAEHHKKKKMMMKIEEEAAwxtuuquuyAzxwyAyAyyxpprpppqqmjfbcba62}[[[",
+"[[[(___]]((^^^^[[[:[[[:[[1:[_<___{{!!{{(((_}_|266a6668668aa9filotyAyzzAACCCHIIKNOOOPQQQQQQPPOOONOMMKIIEEEHAyuuunjjkb88bb822[[[[(({!!!!;;;;;;;;;===&%*&&&&%%&&=*-=;;''!^^126bagjrtvyywwwxxzCEEAzxuuuxxCCHHKMMMMNNKIEBDyyxxuupqquwyAwtwuwyztprppprrqqlifbb6622}}[[",
+"((((__(](^^^^^^[(((((:[[:[:[}__<</~{{{{{((_|}}}22226aa66a8abhhiltwywwwyyzCAEIILMOOOPQQRRQQQPPOOOOOMMIIHEIHAyuuunnjhb88cc622[[[[(({!!!!';;;;;;;;;===%***&&&&&=***;;''!{^_126bhgjqtvyywwwxxzBEBAxxuuuxxzEHIMNONMMMKHBByxxuxtspqrquwyxtuuttwtqmmmommmmljfbb662}}}[(",
+"(((__(((^^^^^{{{{{{(((]([[[:}_<<__{{{{{{((:_[:[12222226aa6abbejlpyywtuwwzzzBHHJMNNOOQQRRQQQQPOOOOOMMIIHHIHEyuxxpnkkb8abb622[[[[(({!!!!';;;;;;;;;====***=******;;;'''!^^_266bhgjqtvvywwwxxzBEBzxuuuxxzzEHKNOOONMKIEBAwuuuspppmqruwwwuqqrpttpmiinlllmlifba6622}}((",
+"(((_(((^^^^^{{{{{{{((((((_:[:<<<<_]{!]]]^]]][[[[}}}2}222268a8bhipwwxuwwwzzBBEGJKMMOOPQRRQQQQPPPPPOONMKIIIHBwzwzppmkeabcc62}[[[[[({{!!!!;;;;;;;;;=======**%===;;;;>,'^^_122bbgjmstvvywwwxxzAEzxxxuxxzzzEIKMNOOMMKIECvvqqqronppoqtxywuqlnmptpoiiijjllliecba222}}((",
+"((((({^^^^^!{{{{{{{{]{{]{(([:_((:<]]!!!!]^{]:[^[:[:_2}2}266a8ahimpwxustwzxAAEEGIMMMOPQQQQQQQPPPPPPPOOMMMKIEyyxxppmmjbbhba2}[[[[[(({!!!!';;;;;;;;;===;=-=====;;;;'''^^(_2268hgjmvvvvywwwwyzABzxxxxxzzzBIIIMMNNMMKIGzvtqqqmnnnonquwyxuqnkklppoifiifiiifecb622}}_((",
+"(({(({^^^^{{{!!]!]]{^{{{{{(](_((__]]!!!!^^]^(^^_[[1[[}}2226668gelqwttupwxxAACBGGKMMNOPQQQQQQQPPPPPPPONNNNKHAAxwpomkiififa22}[[[[(({{!!!!;;;;;;;;;==*=;====;;;;;;,'^^^(_2288bgmmsvvvvwwxwyzzAxxxxxzzzCEHIIKKMMMKIEGCvsqqmnnnnnhmquwwuonkjiiooliiijiiiief86222}_((",
+"({{({^^^^{!{!!!!!!!!{{{{]{](]((](<(!!]!]^^^]]^^[[[[[[122226668bgkqtwsrtuuuyyBCGGILKMOPQQQQQQPPOOPPPPOOOOONKIEAyxokkhjhifb622}[[[[(({!!!!';;;;;;;;;;;;;;;;;;;;;','!^^(_}228bgjmvvvvvvywwwyzAAAxxxxzzCEEHHHIIKMMKKEEAwuqqmnjnnnjhmqtuunkkjfiloiffffccbife8622}}_((",
+"{{{({^^^^!!!!!!!!!!!{!!!{{{]]//(/_(]]!]!{^^]^[[[[[_[[222222888hghmwwsruuuuyxzACCHFIMNPPQQQQQPPOOOPPPOOOOONNMIIBAtpkkeffbb8622}}[[[(({!!!!';;;;;;;;;;;;;;;;;;;''!!!^(_}}2aabgjmvvvvvvywwwyzzAzxxxzzCEGHHHEIIIKMKIEEAvuqmmmjjjnhjjmuuonkheheiiifcfccc9bb98622}__((",
+"{{{({^^^{!!!!!!!!!!!{{!]!{^]{]:<:::]{]^]^^]]]][^[[[}2}2222668adghottsuuuuzyxzzACHIFKNOPQQQQQPPOOPPPPPOOOOOMMKIECwtqmiifbaa866a22}[(({{!!!';;;;;;;;;;;;;;;;;;>!!!!!{__}}28bdjmmvvvvvvyzwwwyAAzAxzzzCEEHHEHIIIJKKHEBAvuqmnmjjjjjjhmqunkkhbb8bfffbccc999988a62}__({",
+"{{{({^^^{!!!!!!'!!!'!!{]]!{^]]:::::(]]]]^^]^]^[^[}}}}}2}2666a0dhjotxxuuuuwxxAzzCEIFILNPQQPQPPPPOOPPPPOOOOOMKKIHBBywtponc888826a22}[(({!!!!';;;;;;;;;;;;;;;'!!!!!{{([[}2a8bdhmsvzzvvvvzzwwzAAzAzzABEEHHEEHHIIHHIHGEDvuqmnnjjjjjhhmquokfbbb888ffc9cc998866662}__({",
+"{{{(^^^^{!!!!!''!'''!!!!]]{{{(:_:::({]^]^^^]:[[[[}}}}}}266aaaaeejnuwxuuuwwwwzzACGIIKMNOPPPPPPPOOOOPPOOOOONMMKHHCAwwxwwplhba8a226222}_({!!!!';;;;;;;;;;;;;;'!!!!{{^([[26aabhmmsvzzzvvvzzzwzAAAAABEEHHEEEEHHHIHEIHHEDwuqmnnjjjjjhhmqomkjcb8a68bc99995555866222__({",
+"{{{({^^^{]!!!!'!]'!'!!!!{]]{{(:_:_<_]]]^{^^^[[[[[}}}}}226aaabbehmquywuuwwwwwzzzCGFHFKNOPPPPOPPPOOOOOOOOOOOOMKIEEAytwwxtpoheb888222222_{!!!!';;;;;;;;;;;;;;',!^^(([[[}266ademvvxzzzzvvzzzABzAACBEHHHEEEEHGHHIHEHEEBDwuqmnhjjjjjhkkmomjeh888a85095555335544222__({",
+"{{{({^^^{!!!!!'!'')!!]{!{{]{{(_<<<1_(]]^{^^^::_[[[}}2227aaa8bbhkmquxxvwwvwwzAzACGHHFKNOPPPPOOOPOPOOOOOPOOOOMKIEEzxxtwwtppplifba8222}2<(]^!!';;;;;;;;;;;;';'!,^(([[[[}668bhhhvuxzzzzzvvzzzCCzzBEHHHEEEEHHHHGHECBCEBAyuqnnnjjjjjhkkmomifea6aa475534224443||||2__({",
+"{{{({^^^{!!]!!!!'!!!]{{{{{{]](__|_1__]^]^^]::::[[[}2227778888hhkmquyAxwwwwxzzzACGHFFKNOOOOPOOOOPPOOOOOOOOOONIHHBBwxxwwuqqppolihha22}__(^^^^';;;;-;;;;;;;'''!,{([[[[}668abekrvuzDzzzzzzzzAABBABEHHEEEEHHHHHHHEEzBEBDyturnnjjjjhkkmnnmkjjc8a744432}22}}}}|1<_<<_((",
+"({{({^^^{!{]^!]!')!]!!]~{({((:[<}|11_]]]^^^:::_[[22277777888bgkkmpuyyyxxwDAzyACCGHHFKMOOOOOOOOOOPPOOOOOPOOOMIHEEAAxxttpqqqnopllih8a2__(^^]^!'';>;;;;;;>;'''!!{([[}}6668abkkqvxDDDzzzzzzzACBCCEHHIEEHHHHHJEHBEEzCGBDAxurmmjjjjkkkmmnmkhheba541}22}}22}}}::^(_((((",
+"{{{({^^^{{]!^!]!!]]!]!{]{/(((_1|}}111:::_([_::}222277777a888bghkqptyAywzyDAAyyCCGHFFFKMOOOONONOOOPOOOOOPOPONKGCByyuxyyppmmmmooplmfc61_{!^]^!!!!''>;;;;;;;;'!!{([[[2228abkhrvvxAADDzzzzzzzACABEEEHHHHHHHIHGHBCAAzAAAAxuqrnjjjmkkknmlmlfcfec74[}2221111_}:::]^]{{{",
+"!!{{(^^^^{{!!!!]!!]{{!{{(/(_<_143|||1<::__[[}22222777770a888bghmmrtzCBAzAAAAAzzCGHFFFKMNOOONNNNOOOOOOOPPPPPNKHCzzwwuxxupormmmmoolifc9|_^]!!^{~{{'';;;--;;;'!!{(:[222600bkknvuDBBBDDDzzzzzAzABEEEEGEEHHHIHGEBEACCAAAAxxsqmjmnkkkmmmlmlifiic04}}}1_<<<<<//(:]^]^!!",
+"!!!^^]^^^{{{{!]{!]{{{]{(/(/_||144|33411_:}1}}337a7788a00bbbbbbhmmptABCzAzzDAAzzCGHFFFKMNOOONMNNNOOPOOOPPQQPOMFBzzxtwuuuunorommmligffc03:^^^^^]^]!'';;;;;;;,'!{{[_22600bhhnvvxDEEBDDBzzyvzwAAEEEBBGEEHHHHHGEEzCCCAAAyxxuqnnnmkkhhmmjmlifiif07}}1||<<<<<//{~){^^!!",
+"'!!^^^^]^{{{{{{{]]{{{{((</__<|1143|2411_11}14347a78a99dbcbbhefjmmpsyBCzAzzAzzAzCHHHFFFMNNNONMLNNOOOOOOPPQQQPNKHzzvvtwwqqqquoppmefc0c00722|:(]^^^^''''>;-;;'''!{[[2260bagnnvuDDBECDBCzzyADzAAEEBAAAEEHHHHHEEECBBAADAyxxuummnmkkkkkmjmmifiic92}}_<|</////~~{)','''",
+";''!^^^^]({{{{{{{{~{{{]](____}11|4|221____1114446aaaa0adbeffehmmmqtwEECCAzzzzzzCEHIFFIMNNNNNMKLNOOOOOOPQQQQOMKFBzzwytusmmmqqurmfea8877759952:^^!!!,),,';>',''!{[[2260bhgmvutyCGEBDBzzzyDxyABBBAzAAAEEHHIHHHCBCAAADAAzzxupmnmmhkkkmjklifffd922}_<<<(((/{{{)),''>;",
+";;'''{^^^:{({{{{{{{{({]((__:__|114414}_____111226666aaaa9behjilqqqtyEECCCzCAzzzCEHEFFIKNNNNMMKLMOOOOOOPQQQQONKHFAzzyywprssmqqlife9aa7445cd95}<]^]!'''''';',''!{[:22a0ahnnvvvDBGBBDBzzwyzyDBEzxxAzAABHIIHHIHGCEABAAAAAAAzturmnhhkkkjkiidccd5221_<<__((({{{!'',;;;",
+";;;'''{^:[{]{{{{{{{{{{{^(__::<|11442|}[[[_[}}222aaaa0898abbbejlquuwyBEEEEEEEBBBEEHEEFIKNNNNMIKLKNOOOOOPQQQPONMIFDAzzzvvvrrsmhgfbe8a85375955743}:^]!''''''',''!]^[22608gnjvuvDAGBBDzzzwvwyABAzxxxzAABHIHHHHHEEBAAAAABAAAAwuqmnmhkkhkkiicccd963|<<<<_(~~~)),''';;;",
+"=;;;'']{:[(({]^]{{~{{{(((_::<1|4443332}[[}}1222000aa9c9aaaabejoquuuyBEECHFIHHEGEEHEEEHKMNNNMKLKLMOOOOOPQQQPPNMIHFDAzzzvvvvrmegbabaa777753}}}3437}_]!'''''!!!'!{^[2260agljqqwDADBBDzzzwywzAzzxxxxxABBEEEEBHHHBAAzyyAAAAAzwtqrqnmhhhkkiifcccc654|____~{~~))''>;;;=",
+"==;;'''{([[((]((]]{/(((((__<:11|4353552}}}42770ddabbdccccdhgiopptxwABEGEIHIFIFFFEHECEHIMNNNMKIKLMOOOOOPQQQPPOMKHHEEEAzxxvvrmedaa222|7572[<[:|1|742|[!)'''!]!!{]][22678gjjqqwDDDDDDxzwxvxzAzxuuuxxzBEEEEBEHHBAAwxyyyAAAAwttqrqqljkhkkkiiecdc954|___//{~)),>>>;-==",
+"%==;;''!](:((](((]]/(((((_<_<1|435575955775700ddihhggfffikimopptwwxABHEEHIKKKIFFEIEECEIMNNNMFILMMNPOOOPQQQQPONKLHHHEFzzxxxrmed862}}1774[[:[::[|4443|:{!''!!]^{([[}}6a8gjjqquDAADDDxzwwuwzwxuuuuxxxBEEEEEHHBAyyxxzyyyzAzwwtpqpooljjjkkiifcdc993|<__//)))),>>--*%%",
+"%%*;;;,!{{(_((:(((:(/<:__<_1|4377590990775000ddijifikfiiimmmmpqppwwABHHHHIKKKIIIHIHECEIKNNNMIIIMMOOOOOPQQQQPOOMLKHIFHDDzxvrmed862}}131_^]:^::_14|1233}({'!!!](__:}2778gjjrquDAADDDxxwwwwzxusuuuxxzzBBBEHHByyxxxxxywwyyAwwupuqnoomkkkmiieffc995|<__//~))),>;--*%%",
+"&&**-;'!]]([(__:_::/_<<<<|11|4355599900557909ciiiigggkfiikkkkmnnrtxxBHHHIKKLLKIIKKIEEEIKMNNKIFILMOOOOPPQQQPPPOOMKLKIHFDzxvrmed862}}1|_{^^]^_<_1111:}334<^]!!!{(:}22778dikmquwADDADxxwwwyyuuqvvuxzzzBzEEEAAwuuuuxxwwuxxxwwtrqooopmmmmmllffffc97||<//~~),,,>;-=%&&",
+"$&&=--'']{]_______<<<<||||3||47579999990099ccgiiiijgggcfghhgggijjquuyBEEEIKMKKKKKKIHEHIKNNNMIHIIMOOOOOPQQPPPPOONMLLMLHDzxvrmed862}2__{{{{{((__111<_[}323|:]!!{{[}62088djjmqtwAADAxxxxzwyuuqvvvuxzzzzBEEAywuuuuuupstpuxxtwuqqlnnmmmmmmoliffc9673|_//~~),,,>-**%$$",
+"$$%==-''!{((1<_<1<<|<||||||33347799ccffdccccfgjkkggddggcdbbdhheehmqqwAEECGIKFFLKKKKIHIKMNNNMKFIILOOOOPQQQPPPPOONNNMMLHDzxvrmed86222_({{!!{((_11311_[<:}2|11:({/:[220agdjmmqtvAADDyvxxywyuqqvvuuxxxzBEEAywutuxuspppsqutxuwtrnmlkmomliloonifc9663|1</~~),>>>-**%$$",
+"#$%%==>''{(_1<|<|111||||||33357709cccffcc99cghhhhjghddgdbbhbdgeehmmqwABBCBHIKIFIIKKIHIKMNNONKFFIMNOOPPQQQQQPPOOONLNMLHDzxvrmed8622}[(({{{{{{__2221__](:<11|||1_::220bghjmmquvyADDyuxwzyyvqqqqrruxxzGEAywxuxxtpprrppquuxtwtqqnjkjjillnilolif9a63||</~~),>>>-*&&##",
+"##$%*=>>'!{(__1_111||11||33355900ddccfgc99ddhehhhhhhddddbbbabheeemmmtyCBCCHIFIFIIKIHEHKMNNOOMKFKKOOOPPPQQQQPOOOOOONMLHFzxvrmed8a22}[(({{{{((([}}2|__^](::<||752}}2609gglmnqtvyADDxvxwAyxqqqqsrquxzBEBAyxxuuxtutsssppstxtwtummkhkehijiilolij9aa3|1</~~),>>>==&&##",
+"##$&**;>,!{(_|||||1||1|33335599990dccfffddhhhghhhhhghdddabbbhheeehmmqyABBCEHFKIIIKIEEHKMNNOONKKKMOOOPPQQQPPPOOPPOONMKHFzxvrmed88a}[[(((((({{[[[}}_1<<]^]^[_1459556678gglqqqtvyADyAvxxAwwqqqqvrruxzBEAywxwxxttwwyvvwwtxywyutpmmkheehhiiloilic9673|_<~~),>>;==&&##",
+"@@$&&*-;'){{(_|11|||11133555569990cccghfebhhhghkkhjfgdgggbbehhhjjhmqqyABCCEFIIFIIKKIHIKMNNOONMKMNOPOPQQQPPPPOOPPPONNKHFzxvrmedb8a2[[[(((((([:[[}[}<__]^^]^]_|3999990adgjqqquwAADDDwxwzwwmmqqunruzACyyywxwxwyAEEEEBAAAAAAAwwsomkhhbbbejliiiif9673|_</~),>;===%$@@",
+"@@#&%=*>>'!)(__1<1||43347555599999ddghfifghggklnjmmmiigghhfhghggjjqquyAEBCCHFKKIFKKIHIKNNOOONNMMNPPOPQQQQPQPOOPPPONNLLFDxvrmmhb88}[[[[((([[[::1}}}_|__]/](^<<1599cfdbggkqpqwyAAADDxxyAwtsmqqquoxzzywwxwyAABEHKMKIIHEEBAAAAAwpmmjjbbbfiiiiiifc953||</~),>-==%%$#@",
+"@@#$%%=;;,,!~(__|_|||33555550999cccdggiiijkjlooommmollkkkffghghkjjnquAAEBCEFIKKKKKKHHIKMNOOONNMNNOPOPQQQQQQPPOPPPPONLLFDxvrmmjga6}[[[[[[[[::}22}}}}_<_<_:/(__137ccfgfigimmqvyACADDzzzAztsmqqqquxAAvtwwABEEHIKMMIEEBAAywwyABytqnjjgbhhhgiiiifd99531</~),>;==%%$@@",
+"@@##$%%*;;,!{/_<<||1|145559709cccffiillllllopprpppppoommiiikkkkkknmuuAAEECEFIKKKKFKFHHKMNNOONNNNNOOOPQQQQQQPPPPPPPONLLHDxvrrmhgba6}[[[[[::[}22662}}(//<_<__<_}|580fiimomrqqwyAEADDAzAywusmqqqvxzAwtwxyBEHIKKKKEBAwwwxwtwyyAywqmoijijhfhfiijif8853|<<~)),;=%%%#@@",
+"@@##$&&**-')){/<_<<|||3755999dcfffiilooooooooppppqppppopllommmpmmpptwABEEGCIFKKKKLKIHIKMNNOONNMNNOOOOPQQQQQQPPPPPOONMLHFzxvrmjgb66}}[[[[[}}2288864}}({{(1||1_}|298fgiopprqqvvACADDDzzvvsssqqquxzzttwyAEIIMKIHBAywtttxwwwyyAywtpmlmihehcfiiiff9973||</)),-=%%$#@@",
+"+@##$&&==->'!~/_<<|||3355999ccdgfgiillllollnoorrpmoqoommoloompqpqttyyEHIHGHKKKKKLKKFFIKMNMNONNMNNOOOOPQQQQPPPPPOOOOONLHFzxvsmhdd666}}[[}}266ccff996}(({/<||1_|2269dfmotttutvyACEBBBBzxvvstqqqtwzxtwyAEHIKKIEBAyAAyyyyAyAAAAywtpmlnlgfhfeeifgfc8953|</~),-=%%$#@+",
+"+@###$&==;>,!~/<<<<||3335599ccggfiijllnnlloooopppqqpoomomlmmmopqqttyAEIKKIIMMMMMKKLKIKKMMMMNMMMNOOOOPPQQQQPPPPOOOPPOOKLFBxvsmmed8666}222a6bbfeifif92[((/_|<_}}2269dfmmpwwwwwyABEBDEEzxvvtutqqxwxxwyABHIIHHHEEEEEHEEEEEBBABAAytpoliiiighceffgcc8953|</~),>;%%$#@+",
+"+@@##$%%*;>,){//<<||||355599ccggfiijllonpppppttwwtxwttpttpppppputtwAAEIKKKKNOOONNMMKKKLNNNNNNMMNOOOOPPPQQQPPPOOOOPPPOMLIDzvssmed86666226bbbccjjefc6|[(((((/(::2669dckkptwwAAAACEGEHEAxxxwstuuxxxxwAEEIIHEHIKIKIIIHIIHIEEBEBAAwppojhfiffcddddc88653|</~),>;*%$#@+",
+"+@@#@#$%*->,,)//<<<||||35599ccfiiillooppttwwwwyyyyAAyywwywwwtxzzyyABCHIMKKMNOOOOOOOMMMMNNNNNNMMNOOOOPPPQQPPPPOOOOPPPOOMIFBzytmmed86688abcbccehgif86}}[(({{{^:[}659dekoouuwABEBEEEEHEEzxvvwswyDuxzBBEHIHHIKMMMKKIIEHIHIIIHHEBBAwponijijfcccccc98655||<~),>;*%$#@+",
+"++@@@#$$*--,,)~//<<||||35599ccfiiloppttwwywwwwyyywyyywwtwwtttwAAAAEEEIKMMMNNOOPPOOOOOOOOONNNNMNNOOOOPPPPPPPPPOOOPPPOOONNIHzztmmeddba88bbcciikggfc82}[:[{{^]^^::27dffkooptwABEHHGHIEEBAxzvvwwzyuxABBHHHHIKMKKKMKIIHHIHIIKIHHEEBAtpnjffefffcd9c996533|</)),;*%$#@+",
+"++@+@#$$%*->,)~///<|||335599cfiilopppttwwwwwwwwywwwwywwuppppptwwyzABEHMNNMOOOPPPPPPPOPPPPPOOONNOPPPPPPPPPPPOPOOOPPPOOOONMIEAzsmmeggbehchfilokkkf962}::::::[][:}2a0ckkmrpuwAAEJIIIKIEBCAzzyyAzyAzCEIHHIIKKKIIKMKIIEEHHIIKIHHEEBBypljfbeffcc9cc95333||</),,-=%$#@+",
+"++++##$%%*->,)~//<<||3355599cffillppptwwwwywwwyyyywyywwwutttttwwwyyABEIMMMNOOPPQPQQQPPQQQQPPOOOPPPOPOOOPPPPOOOOOPPPOOOONMMKGAwtqjjkkkhfhgkmmonkg6a6[::[:[[[:::2}60agkoupuwyABHIKMKIHBDDzzzACAyACEHIKHIIIIIHIIIIHHEBBAEEEEEHEEEBytoifbhcfdcccc9533|||</~),-=%$#@+",
+"+++@@#$%%*--,)~/(<||||355999ccfiilopptttwwwwwwyyyyyAAAyywwwyyyAAAAzEEIKMMMNNOOPPOPQQQPQQQQQQQPPPQPPPOOOPPPPOOOOOOPPOOOOONMKGEBwqqnokkkggggillqjg862[}[[:::[[[222788glouuuyAAEGGKNNKIEBBDzzBBAABEEIIKIIIKKIHHEHHEEAAyyAyyAAEEBEBAwpljeedcc9ccc953||||<<~),>;%$#@+",
+"+++@@##$%*-->)~/<<<|||355599ccffiiloptwwwwywwwyyAAAyyywwywyyAAAAACEHHKMNNNNOOOOOOOPPPPQQQQQQQQQQQQQPOOOPPPPOOOOOOOPOOOOOOMMKGEAAxuronljeejjjqmhd8666}:[:[::[[22608ggjppuwyAAEEEKMNMIIEBDEBEEBEEHIIKKKIIKKHEEBBBBBAzyywtwwwAEBBBAwpoijedd99cc9953|||<<<~),>;%%#@+",
+"+++@@@#$%*->,,~/<<<||||335599ccfiiloppwwwwyAyyyyyyywwwwwwwtwwxyyAEEEKKNOOOOOOPOOOOOOOOPQQQQQQQQRQQQQPOOOPPPOOOOOOOOOOOOOOONKHHHEEywuoljeemmqmmed8aaa}}[[:[:[422a08ggioqqwyAAEEHKMMMKKIEEEEEGGHIIKMKKKKMKIEBAAAAAAAAAywttpuwAABAAwtolifdda8c995531|<<<<~~,>;=%#@+",
+"+.+@+@#$%%->,)~//<<<|||3355999cfiilopptwwyyywwwyvwwuutttpstquuuxAAAEHIMOOOOPPPPPPOPPOOOPQQQQQQQQQQQQQPPOPPPOOOOOOOOOONOOONMMMJIIHHAyuqqmmqqqpmhdd8662}:[:[:2226788glinqqwAAEEEIKMMMMKKKHHHFHHFKKKMKIKMKIEBAABzAAABAAAwxupqtwyAAAwtpoljgd890999541<<<<//~,>;=%$@+",
+"+.+@+@#$%*->,))~//<<<||335599ccfiillopptwwwwwwwywwwvxxwwwwwwwwyAAACEGHKNOOOOOPPPPQPPPPPPQPPPOPPQQQQQQQQPPPPPOOOOOOONNNNOONNMNNMKKHHEwuuqqqwtpkked82222[:[:22}267agglrrqtwyAEEHKKMMMMMMKKKIIIHKMNNMKMMKIHGEABBAAyyDyyyyuupttwwyyAywtpoifd09999953|1<//~~~,>>=%$@+",
+"+.++@##$%*-->))~//<<|||355599ccffiilllpptwwyyyyAAABBAABBEBABBBBEEHGIIKMOOOOOOPOOPPPQQQQQQQPOOOOPQQQQQQQQQQQPOOOOOOOONNNOOOMNNNNNMKEEEBAyyywtpkmeda82222222222607aggkqrqvvAACEIKKMMMMMMMMMMKKKMNNNNMMMKEEEECAywwstsstzwuuutwwwwwyywtpplic98999953|<<//~~~),>=&$#+",
+"+.++@##$%*-->,)~~//<<<||35599cccgffiloptwwAABBBEEEEEEEEEHHHHGHHKKKMMNOOOPPPOPPPOPPPPPQQQQQQQPOOPQQPPQQQQQQQQPOOOOOOOONNOOOOMMMNNMKIEEEBBABzypmkb0082266689889909ggkjmquvvABBEIKMMMNMMMMNMMMMMMNNNNONKIHIBBzzzxssrrruuuuuputwwwwwywwtolifcb955553|<//~~))),>=&$#+",
+"+.++@##%%*-->,,~~/<<<|||335599ccfiiloppwyABBBBBEEEEHHHHHHEEHHHIKKMMNOOOPQQPQQQQPPPPPPPQQQQQQQPPQQQPPPPPQQQQQQPPPPPPOOOOOOOONMMMMKKKHHEHIIEAAtmme0088688cccfjiigfkglmnqtvwyBBIIKMMNNNNMNMNNONOONNNOONMIHEEAzxxuuuuuuqusuuttuwtwtwwwwtooiib9955553|<</~~))),>-&&#+",
+"++++@##%%*-->,,~~//<<|||333599ccfilopttwwyAABBEEEEEEEEIHEEEEEEHHIIKMNOOPQQQQQQQQQQQQPPQQQQQQQQQQQQPPPPPPQQQQQPQPQPPPOOOOOOOOMNMLKIJIKIIIIIHBwtmefd9ccffccfiilklqmporqqwvyCAEHIMMNNNNNNMNNOOOOOONOONNKKJEBzAxuuuuuvvqqqqtuspttttwwywwpoliec957533|<</~))),,>-&&#+",
+"+++@@##%%*-->,,~///<<<||335599cfilloppptwwyyAABBBBEBBEEEEAACCBCCEIKMNNOOPQPQPQQPPPQQQQQQQQQQQPQQQQQPPPPPPPOOPPPQQQQPPPPOOOOOONMKFIIIKMKIIIHECwmmigkilifccffkkllpptupqtvvyCBHHIMMNNNOONONNOOPPPPOPOMMMIHHGAzAxuvuuuvqqqsttqutttwwwyywppliec95733||</~{),,,,>-*&#+",
+"+++@@##%%*->>,))~//<<<||335599cfiloooppptwwwAAAAAAAAAADBBBAAAAEEHIKMMNNOPPPPPPPPPPPQPPQQQQQQPPQQQQQQQQQQQPOOOOOPQQQQPPPPPOOOOOMMKIIILMNNMKEEEAupnomoijfeccgggjomttxxuvyAyCBBHIKMMNNOOOOOOOOPPPPPPONMKIJGECzyxywvuvuqqvsuupuwwwwwwyywtplif9997731<<({~!),,>>-*&$@",
+"+++@@##%%*->>,)~~///<<||355599cfiloooppptwwwyAABBBBBBAAABEDBDEEHHIKMNNOOPPPPPPPPOOPPPPPQQQQQPPQQQQQQQQQQQPOONNOOPQQQQQPPPPPPPOOMMLIKKMNNNKHCBAxxttqoifbc9dddeekmpuwwyAAyAACBIIKMMMNOOPOOOOPPPPQQPONMKIJJECBzxwwwwwtttvstqstuwwwwwyywwtoifc9973||<//~)),,,>--**$@",
+"+++@@#$%%*->,,)~~~/<<|||355559cfiioooopptwyAAEEEBEEBEEEBEEEEEHFIKKMMMOOOPPPPOPPOOOOOOOPQQQQQPPPQQQQQQQQQQQPOONNOPPQQQQQQQQPPPPOOLMMMKKMMMKIGCAyBywpokgddd00bbggoostxAAADyABEEIIKMMNNOPPPOPPPPPQQPONMKKIGGGCzzzvvwttttsvsuvttttwywyyywtplicc053|||</~),,,>>-=**$@",
+"+++@@#$%%*->,,))~~/<<<|||35559cfiilooopptwyAABEEEEEEEEEEHEHHHIIKMMMNOOOPQQPPOPPOOOOOOOPPQQPPPPPQQQQQQQQQQQQPPOOOPQQQQQQQQQQPPPPOONMMMMMMKKHEEABABywmkgdd00bbgggmlpuwAAAADAAEHIIIKMNOOOPPPPQQPQPQPPONKKIIGGCCCzDytuutssvtvusuutvwwwwywttoicc973||<</~),,>>--;=*$@",
+"++@@##$%*-->,,))~//<<<<||35559ccfiillmopptwwyBBEEEEHIEHHHIIIIKKKMMNNNOOQQQPPPOPPOOOOOOOPPPPPPOPPQQQQQQQQQQQQPPPOPQQQQQQQQQRQQQQPPOOONLMLIIEEEEEAzwtpmgdd0bbbggllqruwAAAAAAAEHHIIIMMNOOOPPPQQQQQPPPOOMKLKIHGCCAAAxvvvvvvtwuusuttvvwwwwttplic973||<//~'',>--**=*%@",
+"@#@@##$%*-->,,)~~//<<<<||355559cffiikllopppwwAABBBEHHHIHEGJHJJIIMMNNOOPQQQPPPOOOOOOOOOOPPPPPOOOPQQPPPPQQQQQQPPQQQQQQQQQQQQQQQQQQPPOOOOOMIFECEEHAytpppligecbgggnmrqquwwADDAABHHHIKKMNOOOPPQQQQQPPPPOOONKKKIIGCBAAzvvvvvvtwxxvutwwwwwwwwtpoifc95||<</)),,>-;**%&%#",
+"@##@#$$%*-->,,)~~///<<<||335559cffiiiillooptwyAzAAzEEHHHIIJIIIMMMLNOOPPPQQPPOOOOOOOOOOOPPPPOOOOOPPOPPPQQQQPPPPPQQQQQQQQQQQQQQQQQQQPPPOOLIFBCEEEAywppppoljekggnlrvqttttxDABDEEHGIIKMNNOOPPQQQQQQPPPPOOONKKKIIHGGCCzzzzxwvxxxuuwwwyytwwwtpoifc95|1<</~!,,>--=*%&$#",
+"@##@#$$%**->,,)~~///<<<||3355599fffiiillopptwwyAAzABEHHIJIIIKKMMOOOPPPPQQQPPOOOOOOLNNOOPPPPPOOOOPPOOOPPQQPPPPPPPQQQRRRRRRQQQQQRRQQQQPPOMIHECBEAwwwpooppolmmkknnquutuutuwDDEEEHEHIKKNNOPPPQQQQQQPPPOOPOONNMKKKKHGCCCCzzzxxxxxvwvyyywtttwtoifc9531</({!,>--;=%%$$#",
+"@####$$%*-->,,)~~///<<|||3355599ffiffiiloppptwyyAAzBHHHIIKIKMMNOOOPPPPPPQQPOOOOOONMNNNOOPPOOOOOPPPNNOOPPPPPOPPPPQQQRRRRRRRRRRRRRRQQQQPOMKIHCCAwwuuuoooppuqmmqmrruttqqqutwDBEEBGEIIKNNOOPPQQQQQQQPPPPOPOOOOMMFIIHGCzzzAAzzxxxvwyyAAywwtttolfc9531<//{),>>-*=%&$$#",
+"@@#$#$%%*->>,))~~///<<<|||355599ffifgiiloooppwwyAAABEHHIIKKMMNNOOOOPPPPPQQPOOONNONMMMMNOOOOOOOOPPPNNNNOPPPOOOOPPPQQQRRRRRRRRRRSRRRRQQPONMKKCzytuqqtuoooutuqtqqvvutuuuqqquwBEEBGEEIIKNOOPPQQQQQQQQQPPOOPPOOOMKIIHFECzzzAAAzzyyyyAAAywwtttplfc953|<//~),>>-*%&&$##",
+"#@#$#$%%*->>,))~////<<<||335599cfffgfiiloloopwwyAAABEGEIIKMNNOOOOOPPPPPPQQPOOONNNNMMMMNOOOOONNOOPPONNNNOOOONOOOPPPQQQRRRRRRRRRSSRRRQQPPOOMKEAxutmqqutuuquuuwtxuuuuqquqqquwAEEBAECHIKMNOOPPQQQQQQQQQQPPPPPOOMLIFFHEEzAzzzABAAzAAABBAyywttpoic953|<//~),>--*%%&#@#",
+"#@#$$$%%*->>,,)~////<<|||335999cffifiiililopptyyAABEEEHIIKMNNOOOPPPPPPPPPQPOOONOONMMMLNNOONONNNOOONNNNNNNNNNNNNOPPQQQQRRRSSRRRSSSRRQQPPOONNHCyputmqquuutupwywyxxwuuqqqquuuyEEEBAEEIKKNOOPPPQQQQQQQQQQQPPOPNNMMKIHHEEDDDDABBBBABEEEBAywwtpoic9531<//~),>-**%%&#@@",
+"###$%$%**->>,,)~//<<<<||3335599cfffffiililooptyyAABEHHHIKMMNOOOOPPPOOOOPPQPOOONNONNNNMMNOONMMMNOOOMMNMMMNNNMKMMNOPPQQQQRRRSSSSSSSSRQQPPOOONKEAyttmmqquuuupwwAAyxwuuuuqqquuyAEEBBGEHIMNOOOPPPPQQQQQQQQQPOPOOONNMKIIIHEDAAABBEEEEEEEEBAAwwpoic953|<//~),>-**%%$#@@",
+"###&%$%**->>,,)~//<<<|||3335599ccfcffiiiilopppwyyAAEEEHIKMNNOOOOOOOOOOOPPPPOOONNONNNLMMNONNMMKNOOOMMMKKKKMMMMKKMNOOPQQQRRRRSSSSSSSSQQPPOPONKJEAttmmqmqquuwwwAAAzyxuuuqqqquxyDDEEBEHHKNNOOOPPPPPPQQQQQQQPPPPPPONMKKIHHEDAABBEEEEEBEEBBAwwtplf953|<//~),>-*%%%$##@",
+"#$$&%%%**->>,))~~/<<||||||3359cccfcffiiiloopptwAAAAEEEEIIKMNNOOOOOOOOOOOOPPOOONNOMMMMKKMNNMMKKKNOOMMMKIHHKKMKKKKMNNOOPQQRRRRSSSSSSSQQPPOOOMKIHEwutqqqmqqwwwwyAAAAyxxuuqquuwyyABEEEHIKNNNOOOOOPPPQQQQQQQQQPPPPOONMKKIHHBBACBDEIHBBABEBAywtpoic95|<</~),>-*%%%$##@",
+"@#$&%%%*-->,,)~~//<<||33333559cfffffiillloopttwyAAAEHEEEIIKMNOOOOPOONNOOOOPOOONNMMMLMIKMNNKKKKKMNMMMMKIEEJHIKKIKKNNNOOPQQRRRSSSSSSSRQQPOONMIIHHAwwwqqqqttwwAyzAABAxxxuuuuuwwwyABEEEIKMNNNNOOOOPPQQQQQQQQQQPPPPOONMMIIHEEBCCBEIHBAAAABBywwppif953|<//),>-**%$$##@",
+"@#$&&*%*->>,))~~//<|||3333559cffiffiiilllopptwxAABBCEHHHHIKKKMMNOOOOOOOOOPPOOONNMMMMKIKKMMKKKIFMNMKKKKIHEECGHHIIKMNNOOOPPQRRSSSSSSSRRQQOOMKKHHEEywwwyywtttwAAzzABAzxxuuuuuxwwyyAEEHIMNMMNNNOONOOPPQPQQQQQQQQQQQPOOMKIHHEGBAEEHEBAAAABAAywtplfc53|<//)),--*%$$##@",
+"@@$&&**-->>,))~~/<<|||3335599cffffffiiiillooptwyABBEEHHIIIIKKMMNNNNNNNNOOPPPONNNMLLMKIIKMMKKIFKMNMKKMKFHEECCCEGHIKMNNOOOPPQRRRSSSSSSRRQQPMKFEGCByywwwywtppzAAzzDEBAzxxuuuxxwwwyABEHIKNMMMNNNNNOOPQQQQQQQRRRRRQQQPPONMIHEEEEEEEEEAAyyAAyyywpoic95||//~),--*%$$##@",
+"@@$%%*--->>,,)~~/<<||333355599ccfccfgfiiiiloopptwAABEGHIIKKKKMMNMNNNNNNOOOPOOONNMKLMKKIKMMKKIIIMMKIKMKFEEEzzzzCGGIKMNNOOPPQPQRRSSSSSRRRQPOMMIGAzAyyywwwtuxwxzAAEDAAAzyxxxxywtuwDBEHIKMMMMMNNLNOOPQQQQQQRRRRRQQQQPPPONKIIIHHEEEGBBAyywwywwwtpif993|<//),>-*%%$##+",
+"@@#%&---->,,,)~~/<<||3|3335559ccc9ccffifiiiloopptwyABCEHHIKKMMMNNNNNONOOOPPPOOOONLMMKKKKMMKIIHFKMKIKKKFFFEzzzzzzEEHHKNNOOPPPPQQRRSRSRRRQQPONMICAAzyAywwtxtttzABEEEAAAAxxxzyxuttxBEIKKKKMMMMMNNOPQQQQQQRRRRRQQPPOOOOPONKIHIIIHHEEAAyytwwttttplfc953|</~),>**%$##+",
+"@#$&==--->,)))~~//<<||33333559ccccccdfffiiiilnrptwyyAEEHHHIKMMNNOOOOOOOOOOPPOOONNNMMKKKMMMKIHHFKMKIFKKIFHEzzzzzzCCCGGINNOOPPPPQQRRRRRRRRQPPONKHBzAzyAyzywttxxAEEEEEAAAAyzAyxutuxAEIMMKKKMMKKKNPPPPQQQRRRQQQQPPONNONOONMKIIKIIHEEBBAwttwttppplfc953|<</~),>--%$#@",
+"#$&&*-->>>,))~~~~//<<||3333599ccfdcffcfffiinnrpttwyAABEHHHHIIIKMMNNNNNNOOOOOOOOOOOOOMKKMNNKIIHIKKFFHIIIIHEBzzvxxzCCCCGHKNOOOPPPQQQQRRRRQQQPONMIEAzAzBBBzywxxuzBEHDEDAAzAAAAxuuxyABIMMKKKMKKKKMOOOOPQRRQQQQPPPPOONNNMNNNMKKKKKIHEEEBywtttpppolfc953|<//~)),>>-%%#",
+"$&**;>,,,,))))~~~//<<||335559ccfccfffffiilnlnpptwyyAABEEHHEEHHIIKKKMMMNNNNOONNNNOOOOONMNOOMIIEEHIIEEIIIHIIBzzzxwxyzzCCCEKMNOPQPPPPQQQRQQQQQPONKHEAzAABEBAzxxwDAEEHEDAAAAEBAxxuxxzEIMMMKKKKLKMMOOOPQQRQQPPPPPPPPOONMMKMNNMKIIKIIHHHBAytwtppoolic953|</~~),>>-*%%$",
+"##%=;>,)))))~~~~//<<|||355999cccccffffeiiiloppttwwwAAAABEEHGEGGJIIJIKKMNNNONMMKKMMNOOOOOOONKIEEHIHBEHIIHIICzzzwwvvvvyzzCCIKMOPQPPOPPQQQQQQPPPONKHEAAyAABBCAxwyAAEDEAAyzAEECzxxxzAEIMMMMKKIKKMNNOOPQQQQPPPPPQPQQPONMMKMNNNMIIIIEHEHEBAwwttpoolif953|</~),>>-*%%$#",
+"+@#%*-,,))))~~///<<||33559cccffccffcfeiiilloopppptwwwAABBEEEHJHHIIJIIKKMNNOOMKIIKKMNOOOOOONMKIIIKIGCGIIEIIEzzzxvvvvvvxyzCCELNOPPPOPPOOOPPPPPPPONMKHAzxzzBBCzzyADEDDBAyAzBEEAzxxzAEKMMMMKIIIKMNNOOQQQQPOOPQQQQQQPPONMKKNNNNKIIIEHEEBAyywtwppoolic933|<~))>--*%$#+",
+"+@#$%=->,,,,))~//<||335599ccfffcfffffiiiillllmmooqssvyADBEHIIHIIILIIKLKLMNNNNMKFIIIKMNOOPONKKIKKMKHGGHEEHIECzzvvwvvwwvxyAzCHMNOOPOOONNMNOOOPPPPOONMHAxxyzAACAzADDDEBAzAABCCBAzzzAEKMMNNKIIKKKMMOPQQPPPPPQQRRRRQQPPONMMMMNMMKIHHHHBAAywtttpooolif955||/~),>-*%#@+",
+"++#$%%;>>>,,,))~/<<||335559cccccffffiiiijliiiiillmqtwwDABEHIKKKIIMKKKKKKMMNNMMKKKIIKMMNOPPNKIIIKMIHEGHECEHECzzxxwvvwvvwzyyzCIMMNOOOOOMKIKNOOOOPPONNKBwxwxzABCzAABBAAAzAACEBBBAAzBHKMMNNMIIKKMMOOPQPOOPQQRRRRRRRQQPPOOMKKKMMKIHHHEBAAAywtpoolllifc9953|/~),>-%#@+",
+"++@#%&=;>'>,)))~/<<<||33555999ccfffiiiffffgfggkkmmqptwyDBEHIIIIIIIIIKKKKIKMNMMKKKLKKKMMNPPOMKHEIIIEEGJHHHHICCzwwvvrrrppwyzzCGHKKNNOONKIHIKMOOOOOOONMIBwxwwyACCCBBEAyzAzAEEAABBBBEIKKMNMMKIFKMNOPPPONOPQRRQRRRRRQQQQPONKIIKMKKIHIEEBBByywtpoiiiffc9553|</~),-*%@+",
+"+@#$%**;>'',){~~//<|||33355999ccfffffccfccccggkkmoqqutwyABBEEHHIHHHIIIKKKKMMKKKKKKKMMMMNOPONMIHIIHBCBEIJIIIECzxwvqrrrrrssxzzGGEIMNONKIHJEHIMONNOONNMKEAAxxwzACBCBBAzzAzBEEBAABEHIKMMMMMMKKKKMNOOOOMNOPQQQQQQQQQQQQQPPOMKIKMMKIIIHEBAAAyttpoiiifc9953|<</~),>-%#+",
+"@#$%%*->''){~{///<<||||3555999cfcccccccccccgggimmpquutuwyABBEHHIIIIIIKMKMMMMMKKIHIKKMMMNOPPOOMKKIHDzABEEIIIHGCyvvqrrrrrsssvzBCCEKMMMIIHEEEHKKNNNNNNNKHEAzwxwyCBCBBAAyABBEECAAAEIKNMMMMKIMMMMNNNOOMMNOPQQQQQQQPQPPQQPPONMKKMMMKKKIEBAAywttpoiiifc995|<</~),>*%$@+",
+"+@#$%*>>)!~{/(/(<<|||3355599ccfccccc9cccccgggkkmmqqqqutuwyBEEHIKKKKKKMMMNNNNNMKKIIIKMMMNOPPOOONNKIDzzzACEIHHHEAAussrrrrssstzBAzCEHIIIIHEEHHEHKNNNNNNKIEEAAwwwyACBCBBzCCGEBzACAEINONNNMIIKMNNNNOONKMOOPPQQQPPPPPPPPPPPOONMMNNNMMKIEAyywwtppoiiffc9953|<~),>*%$#+.",
+".+##$&*>,){~//<__|||335559ccfccccccccfcccfggilmoomqquuxwyAEHIKKMMMMMMMMMNNNONNMMMKKMNNNOOPPOOOOOOMEBAzAzBHEEGEEBwtsummmmssswCAvzCHHGCEHHHHEEEEIMNNNNMKIEBBzwwwyABCBBBCEHHBzzCEEIMOONNMIHKMNNNOOOMMNOOPQQPPPOPOOPPPPPPOOONMNNNNMKIEAywwwtppoliffc953||/~),-*%$#+.",
+"+@#$%&*>>,!)]~(((<|2335999ccfffffffffffffkilooooppptwxzACEEHIKMMMNNNNNNMMNNONNNNNMMNNOOOPPPPOOOOONIEABAABGEEEEEBwwummqqmmmtwwzvzCEECCBEEBBBEEEEHKNNNNMKIEBBAwwwyAACBEEHIIEAAAEHINOOOOMIFIMNNNOOONNOPPPPPOOOOOPOOPPPPPPOONNNNNMMKIHBywwwttpoliifc953|</~)>-*%$#@+",
+"+#%%=*=>>,!~{](/__<|335999cccfccffffffffiiloloppptwzAABEEEEEHIKKMNNNNNMMMMNNNNNMNMMMNNNOPQQPPPPOOOMHEBEEEHGCCEBzxxwuuuqqmmqwwtwvABBAzCABBAABBBBBEINNNNMKIHEEAwxwxzzzBEHIKHBBBEKMNOOOOMIIIMNNNOPOOOOOOPOONNOOOPOOPPPPOPOOOONMMMMKIHEAywwwwtpliffc933|</~,>-*%$#@+",
+"+@$%**->,'!!~]/<__135999ccccccccfccfccdfiilllopptwyAAAABEEEEHIKMMNNNNMMMKMMMMMKKKKMMNNNOPPQPPPPOOONKIHHHHHGCCBAwttquuuuqmmqquspvAAAzwwyABAAAABBBBEIMNNNMMKIEEAxwwwzzyBGHIHEEAEIMNOOOONKIKMNNOOPOOOONNNNNNNNNOPPPPPPPOOOOOONNMKMKIEEAywwwwwtplic9553|</),>-*%$@+.",
+".+@$&%=->,,']/<<<1|5cfffccccffffffffcdfiililoptwwyyAAAAAEEEHHIKMMNMMMMKIIKIIIIIHHHIKMMMNOPPPPPPPPOONMKHIIKIECBBwtuqquuuuqqqqqssuwwusuwyAABAAAAAAAAEIMNNNMMMKIEAzxwzzyyAEHEEEAzEKNOOOONMKKMMNOPONNOOMKKKMMMMNNOPPPPPOOOPOOONNMKKKIEEAywwtwwtpoifc993|</~),>*$#+. ",
+" .+#$%&->,')]]_1||79filiffffiiiiiiiiiiilllopttwwwyyyyyAEEEEEEEIKKMMKKKKIIHHHHHEEEEEHIKKKNOPOOPPOPPOONNKKKMKIHEEwtumqquuuuuuuqtswwwssstwyABBAAAAAABBEIMNNNNNMKIEAAyzAyyAEEEEECABHMNOOONMMMMMNOPONNONKIKKIKMMONOPPPPPOOOPOOONNMKMKIHEBAwtpttpoliffcc93|</~,-*$#+. ",
+" .+##&%*;>,')]_<1359dfifcfiilllliiiiiilloopwwwwwwwwyyAABBAAAABEIIKKKKKIIIHEHHGEBBACBEHEEIMNMNOOOOOOOOONNMNMKIHEAwtmqquuuutxxqmtwwwtssttwyAAAAAAAABBBEIMNNNNMMKHByzyAAAAEEEBBAACHKMNNNMMMNMMNOPOMNNMKIIKFKMNOOOPPPPOOOOOOOOONNMMMIHEBAwtpppplifcc99953|</~,-%$@. ",
+"..+#$&%*;>,')]_<|359900009dfiiiiiiiiiilooptwwwwwwwwwwyywwxxxzzAEEIKKKKIIIIHIIHEBAAzzCABEHKMKIKNNOOOOOOOOOONMKIIByuquuuomnpzyuqquuqmmmmstwyyyyABAAAAABEIMNNNMMKKHEywwwyyAABBBBBBHKMNNMKKNNMMOOOONNMKIKKKKMNOPPPPPPPPOOOOOOOONNNMMMIEAAwtpppplfc99553333|</~,>*$@.",
+"@@#$%&**-''')~(<}357527755799ccffffilloppttttwwttppttwtttutxxxABEEIIKIIIIIIKKIEEBAAAyAABHKMIHIIKMNNNOOOOPPONMKKEEzyyAtrnnrtzxuuuuqmmmmmmswwtwwAAAAAABEHKMNNNMKKKIEAwwyABAyyABEHIKMMMKKKMONNOOOONNMIJIKMMMNOPQQQPPQPPPONOOOOONNMMKIEAywtpppolif955||<<<</~~),>*%#",
+"#$%*;>>,,))!~](<|35772447777709cccfiiopptptttttptppppuwwwwwxwyyAEEEHHHIIHHIKKKHEEEEAABBBHMNMIIIIKMMMNOOOPPPPOMMIHEEGEytnlopxxuuxuqmmmmmmmsttuuwAAAAABEHHIKNNMMKKKIEAAABEBAyAEHIKMMKKKKKMNOOPOOOONKIIKMMNNNOPQQQQQPQPPOONNOOONNMMKIHAAwwpppplifc95||<</~),,>-*%$#",
+"+#%*>,,~~~~///<|2552243277777090ccgiloppopttttppppppptwyywwwwxxADBFFHHIIIHHIKKIEEEEABEEEHMONMKKIIKKKKNNNOPPPPOOMKEEHHEwprptxuuxzxqmmmmmmmssssstyAAABBEHHHIMNNMKIHHHEBABEEAAAEIKNMMMKKKMMMOPPOOOONKIIKMMNNNNOPQRQQQQPPOOMMNNONNNMKKIEAwwttppoifc953|</~),>-*%$#@+",
+".+@$=-,)~//<<11555575a7657509099cgfiooolopppppoloppptttwxttuuuuyAEEEEEHHHEEHIIIHEEEBEEEEHIMNMMKKKKIIIKKKNOPPPOOONIHEEEAtpptpuuxyxuqmmmmmmsssssswyABBABEHIIKNNNMKHEEEAwwAAywwAEMNONMKIKMNMNPQPOOPOKIIKMMMNMNOOPQQQQPPPONMKKMMONNNMMIHBywwttpolic953|</~),>-%$#+. ",
+" .@#$*->,!~]<149999909a888999ddcffilollloppooooopptttppprqpuuuuwDEFEEEEEEEGHIKIIIHHEHIIIIIMMMMMKKMKIIKKIKNPPPOOOOMKHEEBwtttpppptsuuqqmmmmpspssutwABEBAAEHIKMNNNMIEACAwwwwwwwyBINOONKIKMNNNOPPOOONMIIIIIKMMNNNOPQQQPPPONMMKKMNNNNMMKIEAywttpplic953|</~),>*%$#+. ",
+" .@#$%-->,)~/<|56596999cdccffggiilooliloppooloptttutpollqrqruquwAEBBDBDDABEIKMMKKKKIKKMMKMNNNMNNMMMKKKKMKMNOOOOOONNMIHAwwwwtpppppnuuqqmmmrssusttyABEEBAABHIKMNNNMHEEEBywwtttwAEMOOOKIIKMNOOPPPPONMKKIIHIMMNNOOPQQQPPOONMKKIKMNNNNMMKHEAwttppoif953|<//),>-%$#+. ",
+" +@#$%-;;'!](_||322565599gfffiiloppolllppplooptwwtpollllprprqquwABAAADDAABEIMNNNMMMKKMMNMNOONNNNNNNMKMMNNMOONMNNONOONMEwtwwwtpppnjnquuqmmsssupuwBCEEHHHAABHIKNNNMKIHHHEAwtuttwBINNMIIIIMNOOOPPPOMMMMIHGHIMNOOOPPPPPPOONMKIIIKMNNNMMKIEBywppooifc53|<//),>-%$#+. ",
+".+@#$*=;>,!](_<}}|346769099cfiiooppoilpttppoptwwtpplllooprrmqquyBADyDxxyAAEIMNNNNMMMKKMMKMNOONNNNNNMMMOOOOPPOMIIIMNONNKAwwwwupppnjhqqquqqssspuwACBBBEEHEAAEHKKNMMMKIIIIEypopptyEKKIEEHIINOOOOOPONMMMIGEEHKMOOOOOPPPPOONKKKIHIKNNNNMKKHEAwtpollic953<</~,>*%$#+. ",
+".+@#%=-;',](_<|:|||776599989fiilooliiotwtttptwwttpooooollqrqquuABADxtuxxzAEIMNNNNMKKKMMMIIMNNNNNNNNMNNNOOPPQPOKIEHKNNNMIEBwutwtqnhjjmqquwttpsvwzABAwwyABAABEIKMMMMKIHEHEBwtptwAEEEHEEEHIMNOONNPPNMMKIGCCEFKMNNOOOPPOONNMKKIIHKMNNMMKKIEAwtpollif993|</~)>-%$#@..",
+".+@#&=;>,)](_<1:}|4114700099filoolffiotttppttttppoopooolnqqvvuxABDxuuuxxxzGKMNNMNNMMKMMMHHKMKIIKKKMMKNNOOPQQQPNKGEEIKMMKKIBxuwxupjhemmqqwwwuvxwtwywtutxAAAABHKMKMMKKHEAABywptwAEHEEHHIIIKNOONNOONMKIHGCCBHIKKMNOOOOOOONMKKKIIIMNNNMMKKEAywpollifc953</~),-*%#@+.",
+".+@$&--')]((<<_1}|114770799cfilolfffiopttpppopoooopoolmllrvrruxEBzuxuutwwxBIMNMMMNNNMMMKEHKKKHEEHHIIIMNNOOPQQQOMHEEHHHIIKMKBywxxqnjhmmmqwwwwypsuwywtpqtwyAAAEIKKKMMMKEAAAtpptwAEEEEEIKMKMNOONNOONMKHEECCBGHIIKNNOOOOOONMMKKKIIKMNNMMMKHEAwtplliifc93|</~,>-%$#+.",
+".+#&%;;,]((<<:<||1114770770fioollffgkpppqppooigllooolikilrprruxEBwuxvstwwxzEKNNMKMMMNKIIEHKMKIHEHHHHEHKMNOPQQQPOKHHEEBAAHKMKGCAxuppnqqmmtwwwxtsmquuqmmmmwyyyAEIKKKMMMIEBxqoputyBBAABEKMMNOPONOPOONKIEEEBCGHHIIKMNNNOOOMMMKKKKKKMNNMMMKKEAywpoliifc953</~),-*$#+.",
+".@#&=;>,]((_::<|_114470770dflooiifcgmppppqpoiigglmolikjiimmnruwAAxussvvupptyHMNNMKKKKIIHHEIMMKIIIIHEABIKMOOPQPPONKEEEAtuwEIKKKHAutttxuquttxwqqqmquqqmmmmmwywwyEIMKMMMKIHAqmmuuAAAwxwAEIKNPPPOOPPONMIEGGECBHFFIIMNNNNNNMMKMKMMKKKNNNMMMKIEAytpliiifc93|/~),>*$#+.",
+"+@#&=->){((___<|__14770070cilpliggdflpppppplggggkoolikikjnmmqqwAAxsstunqqpptyEKNMMKIIIHEEEIMNMKIIIIEAAEIMOPPPPOOOMIHEAumotAEKMMHAwwyAAxwwuqqquuqlnnjmhmmmqwwwwyAIMMMMMKKEumlptABywttyAAHMOPPOOPPONKIJECCCEHIIIKKKKMMMMMMMMKKKMKKMONNMMKIHBywpoiiffc953|/),>*%#@.",
+"+#&&->'!{(((___|__1477770dgimoliiddglloppoigggggkkolikjkkmmnqqtwyzutvoonoppttyEIIKKKIIEEEBEKNMKKKKKIEABIMOPPPOOONMKKKHwolootAIMMHBAABAzAyqqqqnorooonjemmmqqwwwwuAIMMMMNMKApopwBEAwtttyyBINPOOOPPOMIIHGECCEGIIIKIKKKMMKMMMMKKKKKMMNONNMMKHEAytpoiffc953|<~),-%$@+",
+"+#&*->!{{(((__<_[_1}23246dklopmliddfiilllifc9agkkiollillknqpuuuwxxwunnoookkmqwABBAEHHIHIHHEIMMMKKIIIHEEIKOOPOOONNMKMMKEwpojipyIKKHEBCAyxuuunnlmmmmmkifjjqqpwywwquCIMKMNNMHytpwBIHAtttwyAEMOONNNONKHHHJGBBGEIIKIIIIIIIIMNNMMKKKMMMNOONMMKIHBAwpoiifc955|</),>*$#+",
+"+#%*>'!{{((::___[_1}34226bkmppoliddciiigifc9a8akmkkollllmprsuuuuxwzxrnnkkkkmmqtwywwyyEHHIIHKMMMMKIHHEEEIKMOOOOONMMMKMMKAwpiiipyGIIIHEAzxxrookkmmqqqmkgjjjqquAyywqwBIKMNONMHAwtBKMHytuwyyEINNKKMMMIJEEEGBCEHHHIIIIIIIIIKMNNNMMMNNNNOONNMMIHEAytplifc995|</),>*&#+",
+"@#%-''{{({](<:<__:<}3222adjouuqligd9fiddddd9aaakmkglolmomrqpuuuuuuyttqkkmmmmmmtwuqtutuAAEEEKMNMMKIHIHEEEIKKNOOONNMMMMMKIEApfhlpxzEIMICztppmkkfjiloppmkkjjquwAAAyuuyEHMNOONMIBAEMNKBttttwyHKKIKMMKJHEBEEECCEHHHHIIHHIIIKMNNNMNMOOOOOOONNMKIEBywpoifc9953|/~)>-%#+",
+"@$=;,){(~/]<:<:___:}422269iotwtmig9acgddgdd0788cmkgloooomqqqqsuvuswtwtmmmmkjmmuwuqmmppuwwyABIMMMMKIIHEEEIEIMNONNMMMNMMMKIIAoooopuyEMMJAwqqmjeecbcfopomkgjnwwwAAAuutABHMNOONKIHIMNNHwppptwEIIEHMMIHHEBCBCEEEEHEHIIHHHIIIKMNMMMNOOPOPOOONNKIEEAwtolicc953|<~),;*$@",
+"#&=>,!~(](/(:<::__<}211179iotxwpmg9a0ggggfd07a8cmkggoooooqrmqquurrtpwtuqmmmmhjuwwuqmmmutuwwxCIKKKKIIEEEEEEIIMKKKIKKMNNMKKKIAttpmmpwHIKHzuomiec9abbfiolkggluuuwyAAtuuyAHMOONMKKKKMMHypqptwEIEEEMNIEBEEAABEGEBEHHIHHHHIIIIIKMMMNNOPPPPOOONMIHEBywpolfc955|</),-*$@",
+"#%->))~(]//<</<(::}|111147fmtyywqkc90dgfgd0077ackkgglopppqqrqquuqvnrtqpupqijloptwwuqqqqwwwwyzEEEJHHHHBBEEBHKKIHHEBEKNNNMMMKIEBwummpwBHIEApmkifba88beinikglnqquwyAwuuutyEMNNNKKKMMMIBtomqtEIEEEMMIEABEBzAEHEBBHHIIHHIIFIHHIKMMMNOPPPPPOOOMKHEEBytpolfc953|<~)>;&#",
+"%*;,){/]/</_<<<(_:}1|11147dltwzAwnfd0dggca00009dfmkhnlppppurquuussopqmmquppppptyAwtxuuuuuAAAAEEBCBBEEEBBAABIIHEBAAAEKNNMMMMMKMHAtmpmuACHEwpmlgcaaa89fiokkkoqqqwyABwuqptzHMNNKKMNNNKHypmmtAIEEEKIECAABBAABHHEBEIFHIIIKIIFFHKMMMMMOPPPOPOOMKHEEBAwtplifc995|<~,>*%",
+"*;,)~((/::<<<<<_::11211147dipwAAztlgdddccca0008aemkklooputxussuuuuorpkmmqoppptwyAyttpuuuxxxxCEEEBBAABBBAAwAEHEywwwyAEKMMMMMMMNMIBwqmoptAEEyolifca668ciilmmonqqwyAAyxuoptzIKMMMMNONMKBwqotAIEEEHEEEBABBBADEIHEEIIIIIKKKKIIIKKMMKKMNOOOOPONKHEBBAwtpoifc9953|<~)>*",
+"-,)~/_|<||||1__<}|2|4411470gmtyCBypkgbdfgfdd008bbmmkkonpptywwttusuvookkmmlnoopptwwprolluutuuzEHEEEAzAwtwwwwBHEypppptwBHIIMKKMNNNKGzpooptAEBwpiif9a6aceiinqpnuuxAAAByxtopxEIKMMMNOONMIAwqtyHHEBEEEEEBABEEEHIIHEHKKIIKKMKKIIKKKMKKKMNNOOOOOMIEEAywwtoigc9953|</),-",
+";>)~/(_||||1||__}|14434}470dkpyzEAzulfhffffgdddabmmmkkorppwyyxwuustprmmmmiikillmptplnjinqqqquAEEBEAwwwptttwAIHAtlilptwyAEIKKMNOONKEwpoolpyEEyplifd866fiioqqpxzAEEEByxwppuAEIMNNNOOONKHAttyHHHBEEEEEByAAEHHIKIHHIIIIKKKKKFIIKKMKKKKKMNOOPONKIEAyywtplid995||/~)>-",
+"*-,)~/_<|}|||<__:<|2442}}470dlpwABAAtoifcffggdhbbkmmmkgoopuxyzywwuuppummmeefefgkopmkijhijijquyBAAywttuuuppowHIAwpliloppptBEIIMNONMIBwpiiiowEEAtliff98biilotwwAEIKIHEAywptyBEKNNNOOOOMKEywAIKIEHEEEEAAyAEEIIKKKIIIIIIFFKIIHIIIKMMKKKKMNOOPOMKEEyywtpoifc0531</!'*",
+"=-,!~/__|||___(__:_1442}}2770diqtyAzytplffcgggifkkmmmkklmoptwyAAAyxtttmmkkehbhgkmpplkgheehjjnpwwwwwqquppollpAEBytoliloliitABBIMNNMKIBtoifipyEEApliifeciijotwAEHIKKKIBAytwyBEIMNOOOOONNKHBEKKIEHIHHBAAyAAEHKKKMKIIHIHHIFIHHHHFIKMMLIKKMNOOOOMIHByywtplif9771<({'=",
+"=>,!~/<_|}|___<_<:_<1422}}2770cilpuxwwwtplifggikmmmmomkoloouuwAABAAAwtmkkkbbbcdgmtplggddeijjnpwwvttqmoollllltABAwpoiillfflttyBIKMMKIEAtoffipyEEypliiifiiilpwBIKKKKKKIECwwAEEHKNOOOONNNNKEHKMKEIIHEEBAyyAAEHIIKMIHEEEHIIFFHHHIIKMMKKIKMNOOOONKIHByytpolic054|(~';",
+"=;,)~/_<|}|<1<<__((<14222227770bhkmoptttupolkgjimmqqqqmkllmmppwAABBBwupkkkbbbbdglpumgddddgkknpxzwwwqlolnlifipyAAAwpolllifioopyBHIKKIEAwpicccmwBBxpllliillootBIMMKKKKHHEAyABEEHKOPPONNNNNIIKMMHEHHEEBAywwyAEIIIKKHFEFFEIIFHIIKKMNNMKIKMNNOOOOMKIHBAwtpolid571_/';",
+"=;,~/<<||||11<|__::_1}222227777abdgekloptttpqmlimmqpqqqknnnorppwyAABwtpkkkkbbb0glppmgdddggmmmuwAAywtolnllecclwAAAywpoopoiiiiltyABHHHEEAtof57dipyypoiiillllotzHMNKKKKKKEEABBBEEINPPPONONNMIKMKEBEEBBAwwtttwAHIIKKHBBEEEFIIIIIMMOONMMKIKMNOOOONMKHHBAytpoifc96}_!;",
+";'!~/<<|||21|1|__:___}}22227777880888bfioopputpoqmmmpqqmomnnrppuwyAzAtpmkgkhcb0dkoqmgdddgkmmmqtAAyywooooif98fotyywwtpopplifciowwtwBEEEByti0730gmutpiiiillilotCKMKIIIKIIEEBBAABEKOPPONMNNMIKKEEDAABAywttpptyEIIIKHEABAFGHIIIKKNOONNNMKKKMNOOOONMIHBAAytpoif952_!-",
+";')~/<|1||3114|<1:[_[1}12267000a0aaa66aadfloqutttppommmmprnoopqpwxwyywtpkkkfehddkmqmggggkkkkkmqtwwwpolollic89ilotwwwtqptpoiccippoptyBEBAxqf5347dltwoiiiiliifowEKKHEAEEHHEEAyyAAHMOPONKKIIIIIEBAAyABAwtuuqutAIIIKIHBAzACFHIIKKNNOOOOONKKMOOPOOONMIHBAywtpoif97:);",
+";'~/<1|1453442|11::___:[}227000bdaaaaaa6a8cfkmutwxtuqmmmqprnnopptwxxzzwtmmmmheedgmpmkbcfffbbbeipttopllillif99fcipyywtpopmpof9flpoilpwABAAuld3||7dlutoiiiififioyEIJAwwABEHEBywwwAINOPNIEHHHIIEAyAyABAwqprpptyEIIIIHECzAABEGHIKMNNOOOOOONNOPPPPOONKIHBAywttlif5}{'",
+"'!~<<|347555333311:___1:[}47770008a6aaa66a0adglowwyxuupmpppronpppwxxwywwtmmqjjedgmoojeeehbbbbhfoooooljfiiifccddcowywpilommplccilliilptAAAyuid7|47dmwtoiifffbilwAEEAtppxAEEEAwpwAHKOOOMHCBEIIIBAwwAEEwqmprptwEHHHJHHBzzzzABEEIKNOOOOOPPPONOOOOOONMKIEEAywtpol92[,",
+"!~(||355055957|211}}__1}[}447787066aaaa8668a0degmuwwxwwuttppqrqppwwwxxywwqqpllidgkmpjffhfb9bhbfiopooofccffcb50ccitAypiglllppiffiiifilptyAAytmf0770itzwpliiifcipwBEypolqtwBHEwppyEKNOONKBABHIIEyywxAEwumpqqtwAEHHEHHECzzzzzCCGKNOONNOPPQPONOOOOOONMKIEEAywtpof7}!",
+"~/1435990999577314}}1111}44247a76222666a6868ddbkkmquuwwwywttpprrqxxxzxwtwpqqqonggkmqljfeea8bbb8elponifccccc770dcfpywoffiiklpoliififiioqtyAAzwpmd77dmwAwmgiiiffotAAwtoiilpyEIBtotAIMOONMHyABEHHAtwwyBytqppruwAEHHHHHHECzzzzzCCGKNONNNNOOOONONOOOONNMKHEBAAwtpi93:",
+"~<|7599cddcc099544}22114244477776}22226a66a8ddekkkkmmquwAzywwupqqwwxzyxttwuutlliggmqoiiheb8ba88clpoolibcccc5750dfltwofdfifimpppliffiiimptwAAAyulc0dkuAAwoimoilotwwtplifcipAEIAtpyHKNOONKBwyzEEBxwwwAxwutrpptyEHIIHHHHECCACzCCBHMNNNMKKKMNOONOOONONNMKIEBAywplc|:",
+"]<|5559ccdfcc9a90772244444477776622222226268ddekkkkkkmmqwAAAywttpwwxzzzytwquuojigkmooljieb8a888ciopoli999cc95|399fowpf9cfdglotwticcfffgouwABEEBwpifipwAAwpppqppwyytpplffeioyHIAttBIMNONNIywAAEAzxtuwwwuwsrpuwBEIIHEEEEGBCCCAABEIMNNMIIHHIKNNNOOONNNMKKHEBywpid3]",
+":|35099dfdgbc0d9975224477777787a2222[}22622a00bkkkkkkkmmtwyAAAywtwwvxzzzwuwqtuljkkmmoliifb678889fopliic88c097||59clwwofcfccilqwwofcfiiiotAAEEHHEApliipwAAyttttpwAytpppliccipAIIytyHMNOONMEwyAEBAwwwzwxuytprptyBEHIEEEEEEBAAzAABHKMNKHHHEEGIMNNONNMNMMKKIEBypli5:",
+"}6599ccfffgfc0dd9706657777777776222}1}16666800bkkkkkkkmmpputAAAAyAwwxzzyytuquuoojkmmooiihc666888elpllic9999951|45clwywpif99cgipwwlfiopootyAABEHHEwpiiiowAAytututyytolopoiiiltHKHzwEKNOOONKAwAEEAyyAzwtuwwtrrpwABEEEEEEHEBAzAzABEEMOMIEEEBGGKMNONNMKKKKIHHEAwpic4",
+"|609cgiiiliiecdd0000675777708066266}2226a66800bkkkkkkkmmqpuqwwAAABAzzxywyttqquppoklmqoljheaa68aabjplllic99055|||5fotyAwoi9599glwBypopppoptwyyAEEEAtmifglwAAtpqptwAwlcfiooifflwIIEABKNOOOONIAABEEwyyAwuuwywpppswzAEEEBEEHEAzyzzAAEKNNKEFEBCCIKMNNNMMKKKHHEEAtoib5",
+"_}599fgiklliifgd9c006665500cb0aa6a4242228aa8dehkkkkkkkkprqrsstwyACBAAzzvxxttquxppmmoppojifb666aabfolloic99575|1|5iptyAtoic509clwEEypoppplotwwyAEEAwplf99itzypompwAwofcfqoliffoAIIEAHNOOOPOMHABHHBvxwuuutxwtppptwwAEEEBEHECyyvwwzBHMMMIEECCCHIKMMNNMMKIIIHBAwpi81",
+"_|290cggiiiiifdcdc90d0899bcfdgc9807a666a8a8bghemkkkkkkkrrrqpuuutwBEEEEAzvxtwquxttpmppppniee866a88elllllf997553115iptwAtliiccfilpAEAwpoppootwAAABEBAyulf99iwzwpllpyAtf9ioolkdfipAEByBKOOPPPOMHBHKHytwtuquttwtqqtwwyAEEBBEHEAytwwyAEIIKIEECCGIIKMMMMMMMMIIHEAwpj82",
+"}478dcggfiiiifdchd00d09cdfffggeff9b99999fccfhjmmmmmmkkkprrrpruptyAAGEHEzxwttquutttqqttpojfeb668a8ciillif885553335fpwABApoooliigipyAAtooppopyEEEEBEBAwpf979iuxulgipyti9ciolffcdipABAwENOOPPONMIHKKBwppuqqutuqmmpswwyBBEBEEHEwxwwwyzABHHEEEEHKMNNMMMMMKKKIEEAwpj9}",
+"[458ccfgiiiliifhfffdggcfffiigffffcc9dcccffhimnqqmmmmmmprqrrrrrqqwvzCGIIECzwttquupttttxwplfehb6a88bfllliic885557339lwABEAwwtoic9fotwwwpoppptAHIEBAAAzwpg5413guuogditwlc9cillfc0cipyAyAINOOPOONKIKKIAtppopttupqmmqqwyABDBBEHEzxxwyuxzAAEEEHHIKNOONMMMMKKIIHHBwpj8}",
+"[659cffiiilllikiiiigkkfffiiigc9cc8956aa9bfgimouuqqqqmmpprpprrrrrxxzzBIKHGAzttqqupptuwwwtnifhbb6a8aclloiic9959994}6ftwAEIHAticccfloppxwtpptwyEHEyxwwwwpk0|<_4gqpicfpwticcktttld9dltAAAEKNOOOONMKIKIEwttppppptqmmmquuyABABEEEByxxzuxyzzAABHHIIMNONNNNNMKKKHHBwulb}",
+"}6addfgiillolllmlilikikffffdd96622|2327689ahknqquuuuqttutrrrrprtvwxzAEIHHEAttuqquppuxAzypjfhbbb888bioollfc909954[3cpwAHKHyof9cccfilotAAtpwwwAEEAwwpppqmd4_/<9kqofcmyApifoAAAwof9iqwBAAHMOOOONMKIHKHAwuttttttpolmquuuwABAABEEAywsuxxyxwAAFEGHKMNNNOONNMKKKIEAtqc6",
+"669ddfiilmmpooollilffffg9bc0d056}}:}[}2}a68dhhmnmqpswwwwtttuprrvvxxAEDEEGGEBwtmqqopstABCyoifbbbb88bfllollfcfd95333cpAEIHBtlfccc9ciiopyAAwtttwBEEAwpoomif5|<_49mqkfiwytiipAAAAtlfcfpwBABKNOOONMKIHIIBwwwtutwwwtooouttuxBBABEEEAuuuuxzxuyyyCBGKKMNNOOONNMKIIEAtqh6",
+"6abfiikllmpqppomlmiigffgf9906622}}[[::[}66addbkmmmmtttxvwwwttuwvvxxzBFEEBCEEAwqmqqnotyEIEwmhbbbb888cipopoiff995756cpEHEytpliif959clpptAEAwttyEEEAwpmkmmg93<<<|9mmgfmwwoiotwttwplccfqyAyBKNOOONKHHHIHAwtpttwyywttppttuxAEEEEEEExxxxxzzxywwAzCEIKMNNNNNNMKIIHEzrk8",
+"6bhilllomppppppmllilgggig997a222}}}_[[:[22adbbkkkkrrquttwwwwvyxvxxyDBEFEBzCEAAwqqqooptBIICtlgbbaba8biooptofcb90799ftEEypopplifc55cloptyEHyttyBEywpoomlmld7|_((|dolcfqupllliilptpicfipyyyEMOOONKIEEHIEwtppptwwwwwwyywwyzEEEEEHBAzxxxzzyxywAAzCHIMMNMNNMMKKIHEzxk8",
+"8bjilooopppppppmloiifgkkica76222}}2}}[[[2280bkkkrrqrrrrpttwwzzzyzxzDDEFEEzzAEBAuqqqoppxEKHymkggbdb88fltttof990900flwBAtiiopoifc569iotwwEIEwtwyAtpooomopplc51_(/3goicippliiiflpttpfciowAyAIMOOOMIBABIIBwoilpttttyAEEBAACEIHHEHBBAxwyzzAyAyAzzCFIKMMKMMMMMMMIHBxnd",
+"dhinommppqppprrmloiigggkkf00a222}}22}}[22280bkkppprrrrvqrqvxzAACzAEEFEEFDzzzAAByuqqnprtAHIBtmgggbbb8cltwtpiccc90cipwywpfcippifc959fopwwAHKBwtwwplmllmoptpod7|</|9kmggoolllllpwwwtoiflpAAyEKNOONKEyyEIIApiiipppwABIKIIEHIIIHEHEEAzxwwyAADAAzCCEHLKMIKKKKMKKKHBAqe",
+"eklopopppqtppprmmoiiiggike006222}}}}[[[22280bkhrprppqvvvtvwvwwzzCEFHHHEDDzzwzwAByxuqoptwEIHzqkgggbhhbjtwtoieccc9ipttppof9copifd9999iptwwBKIBywytoiikikotttpg93147gmmklmklppopwwwwplfipwBBBKMOOONIywyEIHwlfflptwyBHKMMMMMMMKIIGGEAxuxxzzEBBCCCEHKLKIIKKKKKKKHEAqm",
+"enmpupptttutpprommokiggggc006222[}[:[[:22800bkrrrrrprtuvvvvvxvzzBHIHILHFBzxzzyxAAAxuqoptAHIExqkgggbejiptpoliccdflttpllic99lpoifcc95clpppwBEHEEEBwooliilptttpi000ddkoomikottpptwwwtoiiowBEEHKNOOOKBwtyEHAoffipwyyABEIIKMNNNONKIIHCAxxxwyBBACCzEFHKIHIIKIKKKKFGCwm",
+"mnmuttttuuuutppomoollgggg800a222[[[[[[[2260bbkrqrrrrvvvwxvvsvxxzDEHIMMKHFDyzwytxAAAxuuptwBIIEwpggggfjilppoolfdfiottofccc99ipplfff969ffiilpyEHHHEEyttpopttuttpiddkkkqpqoilptttpopttpiiowEEHEIMOOONIAwtyBBtlffltywtttwAEIKNOPOMMKKIEzxxxxxABECCFFJLHHHIKKKKKKKHBws",
+"sqquwwwtuxxwtsppqqrmllggg807a222:[[[[}222a0bkkrrrrrttvvvvsvxxxyADEHIMMMIHDzxvwxuwxAzzxupwAHIHAtnggkmlefllppoifiotwtoc99955clppiiic579cfcfiotABAABAywtwtwwxywuuoilpmmquupoqtttlfcippllpwBEHEEKNOOOMHyttyBypieipwwtoolpwCHINOPNMMMMKEzzwxwAAEEGFHHKHHHIKKKKKMMICzs",
+"squuxyyyxxxxtwtpqqrlmjggg8006222[[[}}}2268dbkkrrrrvvvvvwvvxxxxzDFEHKKMMKIFCxxxwttwxzzyxtxyBIIEypnjkmlebciopplilpwwtof965335fppliif929d9c99gipttptwwttttpwyyAzyxppupmquxtpptwwpf99fopptwyBEEBEKNOOOMEwttyAwpliotwpoiiitABEKOPOMMMMMIEEBAxDAEEHIKKKIIIIKKKKKKMKHCv",
+"vwuzyzAyzxzzxwssqrqjjjgggbb06222}}}}}26680dbkkqrpvvwvvvxxxxxxzDFFHLLLLKKIIHzzxxsutqxAzyxxyBHKKBtonmmlcc9flpppppttpolf9555439lplfff950cd9599fiopolottppoiltxzAAzywxwuquxxtpuwwwoc99itwwwtyEEBAEKNOOOKAtptwAytpptwtlliiptwyBKNNMKKKMMIHHEBEBHHIKMMKKKKKKKMMKKLKFCz",
+"vzzzCzCBAyAzAywuuqqjlngggab066222[[[[22280bbkrrrvvvvvzxxxxxzzDDFHLLKNMLKIIHBzxwxstuuxzzyxxzCIKIBtrmmibb8cippttpppoili95553|5folc9c9999c0735cfkloilpptplffipwzzAzyyywttxAwttwywtlfcityywttAEEyyBKNPONHwpopwAAwttwpliiioppuwEKMKIIKKMMIHHEHEHHIKMNNMMMMMMMMMMNLKFz",
+"zACBCCCCEBAACAvtqrqmnngggbb06a2222[}222280bkkrrvvvvvxxxxvzAzDDFHHLLMNMLKIFHECzwvsttwuxzAzxzAEIKHBtqmibc68foottpppliiic99993|9lof999550d0||2559ciiilptpplfcitxyyxwywyyyzBCAwyAywtolowAAywtyEEAtwEMOPOMEtoopwAywwtollinllopwAINKIIIKMMKIHHIHIIIKMNNNNNNMMMNNOONMFF",
+"FCCBEGEGHECBCAwtuvrnmlnggga00622226666a8ddhkkrvvvvvwxxvzzzADDFFHLLMNNNLLHFFFCCzwwsttwuxzAzzAEIKKJApmhbc68cioptppoifiiic999539iplfc963595}:(<437giilotwtpmccmtwxwwyyAAAACIIEABBAwtpwABBAAAAEEEtotHNOPOMBtoopwAAwwpooliiilmtAIMNKKKKMMKIEEIIHIIKMNOONNNNNNOOOOONKF",
+"FGGEGHHHHHEEGADwuvvnnnmgggb00a866688888bgghmpuvwxvvxxxzzzCDDFFHLLLLNNNKLHHFFBCzAtssstuwxAAAACIKKKEymhbb889flppppoicfilic9cc9cippoic65552}_~/137flpptwAywpiccotttwwwyywtyCGEAAEEBytyAEEEEEEEHHAolwINOONKwpoopwABAwtpliihilpBKMNNKIIIIIHEBBHEHHIMNNONNNNNNOOPPPOLI",
+"IFEIIIIIIIIGGDDxxsvnonnkkkbeddc9bbcbbchekjqqttzzyzyzzzzADDEFEHLLLNNONNMLKHFFzzAAwusmmmquABBEEKKMMHAqjbb9889iptpppiccioplifffilptwpf973}32<<<39cflppptttpoi95cmputppppplpxBCywyBBytwBEHIKKKIIIHwllwINOONIwpoptwyBBwtoiceenpAHMNOMHEABEEAzxAAEBGHKNNNNMMNMOOPPOONL",
+"LIIJLKKIKILHHDDxxturprrkknmhggfiffchcffkkjqqwzAzAACCBCBFFFFFHHLKMNNONNMLLHDzzyzwwwqmmmmquABBEHMNNKEwocb8987cotppplfcfotwtooollotwtlc9525553355999fiiiiiiif9539loplllolffotAwpotwtllwBEIMNNMMMKEploAKNOOMHwpppptwyywtlf8eeoxEKMNMHAzAEEAxuyyzACEIKMMMMMMMNOOPPOOL",
+"LLKKKKMKKLKJJDAyxuvpqqummqqlokkifbbbeeggjiqqtyyyAzCCBHFHHFFIILKLLNOOONNLLFDxzvstwuqqmmmqqyABBEKNNMEzpib9b830iopptpliiltABytpollpwywoifcc995|<||<<|7555559553||0klliikkc7cmtxtliii99fpAEKMNNNNNMEppwHKNONMHytpoppptwwplfifltAHKMNKBzABCAxqwwzACCIMNNMMMMMOOOPPPOO",
+"OLMMMMMMMLKIJBAyxtvqutuquutuomkhfebdbbgghmmppwwxyzzzEFFFIIKKMMLNNOOOONNLHFzxvvqtquuqqmmmqqyABEHMNMHAwof89875ciopptpooopyEAtppoopwAAypif553|/)))'))/|||||444|<<|dilmiiig79guxtpifc5|3cpAEIMNMMNNKBwtAIKNNNKHBwpppmlpwytpniopyBIKNMHBzABBxutwxACGIKNNMMMMMNNOOOPPO",
+"ONNMNMNNMMJIEDDzxvvtuwwuuuuunokkhebbbddehmmqwwvwzzzzEFFFFKKMMMOOOOPPONLKHDzxvrrsmqquqqmmmqwyABEIMMICyplc99575floppppoootwytpptttwyAypf93|_/),>>>->!<1<(_||||/~/4cilkggiddfoxAtpic7||3fpAEIKMMKMKIAwyHKMNMMKIBAywoilpwwwtpotAHKKNNKHBABBAxwuwACEIKKMMKKKMNNNOOPPO",
+"OOLNNNNNLKIIEDDzxxwtwwwuuqqqqnigggggggeemmrrvvvwxxzzDFFFIIMMMNOOOPPPONLHFDzvvprmmmqquuqmmmqwyAIIKKIBypof997735illooliiiloptpptttppwwof5|(~~),>>-=='!<_{)///~~,,{3gklkgiigfotyytpi95335fpwBIKIIKKIBwyEKMNMMKKIIHEyplloptwywyBKNNNNNKIEEEEzuwwzCGGKKKKIIIMLMNOOPPP",
+"POOOOOOMMJIJEEDzzwywwwwqqqmmmjhjhggggiijmmtsvvvvzzzDDFFHHLLMMOOOOQQQOOLIFCzvpsmmmmmjnuuqmmmtwAHHIHEEztpic99542cllopoiiiiilpppppollptof3<())))'>;=&*>~<~,)~~)),>,~5ilkiliiiopuyywpf95599kowEIIHHIIEwwAIKMNNMKIKMMIAtolllpwAyEKNNMNNMKKIKIEzAwwCBEHIKKKIILLLMNOPPP",
+"POOOOOONKLLHFFDzzyAwwttmmmmmmmeeedgghjjmmsswxyzzzzzEFHFIIKMMOOOOQQQPONLIEzzvppmmmmejjnruqmmtuyBHIEHEBwpofc95439iopttpolliiopolliffilli5|~),,'-*==%%;~11(~//~)~),)<floqommlmppxAAwic9cc9fipAIIIHIIHytwBIKMMMKIKMNNKEypllnptwEKNONMNMKKKMMKHEAyCCCEIKKKKKLMMMNOPPQ",
+"PPOOOONNLLLHFDFzzyzuutummmmmmmmehheeeemmmsuxwwyzzzBFFFIIMMMNOOOPQQQPOMMFHzwvsmmmmeeejjnruqmmtxAEIEEBBAtplfc5313clptwwtpolilllifffcffloc|/);-;*%=-*-,/|3</<<<<<<~)/5iopupomooquAAwpfccc959itEKKIIIIBtpwEIKIIKIIKNNNNKAtpllopAHMOONNNIHIKMNMIHEEEGCEIFKKKMMMLOOPQR",
+"QPPPOONNLLHFFFCzzAzssssmmmmmmmmmeeeeemmmssvvvwxzzzFFFIIMMMMOOOOPQQQPOMKKECAtummmjjjjhjjouuqquwAEIEBABBywplf00725fotwywtollliliffiifcfol9<)>;**=-,)),)~<<~~/<<<|<))<5fluqqoommuxAyticcf9335itEKIIKKIAttyHIHHHHHIKMNOOMBwoliowBHKOOOOMIHIIMNMKIHIIHHIKKKKMMMNOOPQR",
+"RQPPOONLLLIFFFECCyvtsrrmmmmmmrmmmmmmmmmpssvvvvvzzAEFFIILLLMOOOPPPPQOOLKFECAwwqqjjjjjjjjnpxuqqwyBHEEEEEEAtpic0975cipwwwtplililllllif99flf3~,>***-,),-*-)~~),)~~~~)>)<3clqqmmikmtyytlfffc5|39lAIIIIKKIAtwEIIHEEEEHKMOONMEwpoptABEMNOOOKHIHIMMIIHKMMKKMMMMNNNNOPPQR",
+"RQQOOONLLIFFFGCzyxvsrrrmmmmmmmrmmmmmmmmrrvvvwvzzzzFFFIKKKLOOOOPPQPPOOLIFCAzwuqqjjjggggjjnuuuqwyAEBCBBEEAytof009669ipttplifiioloolid3}5fi9/)>*&*-->*#@#*>,>-->,',,>>)/|dlqqmkggmtxuiccffc559itEIIIIKKHytyEIIHHHHEHKMNNMIEywwyBEEIKMNMKIHIIKMKIHHMMMMOOOOPPPPPQQQR",
+"RQPOOOMLLIFHFECzvvvssssmmmmmmmssmmmmmsssvvvvvxzzzCFFIILLLMOOOPPPQPPOMMFFzyzxuuljjggggggjjjuuuqwABEAAyABAwtpi0097269lppoifffiliilii93:<5ff|~,-=***%#+.+@%--*%-),,,---,{|foqqmkgkqtul959fif99fpEKKKKKKKEwwBEIIIKKIHHIKKMMKEBEBEIKIMKKKKIHEIIKKIHHKMMMNOOPQQQQQQQRR",
+"RQOOOOLLLKFFEzzxvvvssssmmmmmmmssssssssssvvvvvvzzzCFFILLLLOOOOPPPQPOOLLFFzvstqqllkgggddgdehquuuwyAAxzyyzAwwplf777225foolifffifccili93::|9ic|{>-%%%$+.  .@%-*%*,),,>-%*>~3gquqmmikuupc3|3cg95coAIMMIKKKIEABEIIIKKKHEBEHIKMIEHEIMNMNNKKIHEEEHIKIEEEKKKIKNOOPQQPQQQR",
+"RQOOOOLLKFIHBzzvvvvsrrrmmmmmmmrrrrrrrrrrrvvvvvzzzCDFHLLLMNNOOPPQQPONLLFDzvspmmjjkkggddddhehqquuyAyuxzwxywwpoi9576329ioliffffc99cfi953}<3fl9<,>%#$#+.   .#**%%-)),,>%$*,_0kqqqmkkqupi1(/|0c59itEKMKIIIHHEEIIIIHIIHBwwAAEIHEEEKNNNOOONMKHEBEIKIGEAAHEGHFKMMOOOPPQR",
+"RQPOONMLKKIHzzvvvvsssrrmmmmmmmmrrrrrrrrrrvvvvvzzzCDFHLLLNNNOPPPQQPONLHFCzvrrmmjjkkkggddddeejquuuAyuuxwwyAwwpof950059iooifcifd098b0c955|<5ff3~>*###@+....@%*%%%>,,,,-%%-)_cmquqmkkuuo9<)~|9550iwEKKIIIHHEEIIKIHEEEBwwAwABEBBEIKKMOOOOONKHEEHKMIBBAEEEGEFKMNOOPPPR",
+"RPPOONMMKKHEzzvvvsssssrmmmmmmmmmrrrrrrrrrrvvvvxxzDDFHLLMNNOOPPQQQPONLHFCzvrmmmedggkkkggddeeemquxxAxqutwwywwpolf00cdcciiiccffc988799dc9|(/|99<,-%#@@#@+++@$**%%*>>,,,-%*>~3gmqumkkmuul3/!/35379iwEIIHEEEBBEHIHEEBBBAAAAyAAAAAABEHMNOOOONKIHIKNNKEHEIIIHKMNNOOOPPQ",
+"QPPOOMNNKLFEzzvvvsssssrmmmmmmmmmhrrrrrrrrrvvvvxxzDDFHLLMNNOPPPQQQPONLHFzzvrmmeeddggffkggddeemmuxyxwqqxtwwywwpoif99cd999cccfff99599ccc9|(!)|95/>*$@#$$##@#$*-*%%*->>,,>->)/0kmqqkgluuuf1!)_7||39lAHHEEAwwtyABEBAyAAAABBywyyAywAABEKNNNNMKIIIIMONMKKIKKIIMMNNOOOPP",
+"PPPOONNNMFFCzzvvssssssmmmmmhhmmmmmrrrrrrrrrvvvxxzDDFHLLNNOOPPQQQPPONLHFzzvrmmeeddddbhhkgggeeemqtAyutqqpwxzwwpoif9500d079cffiicc99955553_),~393)-%##%*--%%%->>-%%*->>)~)>,~|fmqumkkquxm7{)(3|<13ctBEEByppttwyyytolpwyAAwtppwwwyAAAEKKKKKHEEEEHKMKHHHIIEEHIKKMMNOP",
+"PPPPONNMKIFCzxvvssssmmmmmmmmmmmmmmmmrrrrrrrvvvxxzDFHLLMNNOPPPQQQPPONLHDzzvrmmeeddddbbbgkkgjeemmuzAuqmqupwxwwwpif9569d0779fillif992||333|/),~39|,-%%*>,>-**>)),-%%*->)/~,,)/7imuqkmmuxug<){|3<_19mAEEEypoptwtttpidfltyAwpoioppttwwAHIHHHBAAAyBEHEzyAAEBCCEEFIKLNO",
+"PPPPPONMKHHzzvvxsssmmmmmmmmmmmmmmmmmmmrrrrqvvvxxzDFHLLNNOOPPQQQQPPONLHDzzvrmmeedddd88bbgkkgjeemqwzxqtmquttwwwwofc645d07|5coppof92|:::|||<~,,~35<,-->,>>-*%-,~~,-%%*->)~,>,~<cmquqmmuuuo7{~<4|_(1cwEECAtllptpppplg9fpyytpoilllomptxBHHEGByyyzAEEEzxuyzBzzzEFFILNO",
+"OOOPOONMKFFzzyvtussmmmmmmmmmmhmhmmmmmmmrrrrvvvxxzDFHLLNNOOPPQQQQPPNNLHDzzvrmmmeeddd888dggkkjjjmquzzuqsmqptuwywtlfaaa507479lttoi93}:_//<||<~',/33/,,,,-*%$#$*)(~,-%%*->),->)~3gquqmqqtuqc_~{|4<~/5lAEEByoilpppppoicclwAwtollloomrqqwBBABAwswwyAEEBxuwwyAzzzEFFLLO",
+"OOOOOONMKHECzAyttsmmmmmmmmmmmkkkkkkhmmmmrrrrvvxxzDFHLLNOOPPQQQQQPONMLHDzzvrrmmeedddd88dddgknjjjquxxxuqmmqptuwwwpic8a634439iptof9221<<//<<|/~))/||/~~,*#@@@+#*)(~,*%%--,>**,)(9kuqmmqpuuo7/(<|1{{<5pBEBAtiiotpopppi9ftAAytoolooqqmqtyyyAAtpsttwABAyuqtxzzzzCEHILM",
+"ONNOOONMLIGCzzztusmmmmmmmmmhmkkkkkkkkhmmrrrruvxvzDFHLLNOOPPQQQQQPONMLHDzzvrrmmeeddddddddddgjjjjquxuuuqmmquutxwwtpica666859cilof959553<(//<<<~))/|33<)*#+....+*~//,-%*->,-*>)~|fqumopuuuuk3_/<|/){_fyBCBypfgoolopqoifowBAwppqppttppwAywwyupoooqtAAwxuqtwxwzADFFIL",
+"LLNNOONMKFGCCzAttsmmmmmmhmmkeebbbkkkkkkmmrrrvvxxzDFHLMNOPPQQQQQQPONMLHDzzvrrmmeeeddddddddddjjjlouxuquuqmmqotuxwwtpfa6aa9cc99ciic9cff93|(~~/</~)~<353~-#.  ...@-~//,*%*-,>--,)(9kqqomquuuqc|((__~)<5oABCAwmcfigkooppllpyEAwwttuuwwyAywtwytlinllpxywxuqtxzwwzCBFFL",
+"LLNNOONMKIGCCAztutmmmmmmhmmeebbbbbbkkkkhmrrrvvxxzDFEJKMNPPPQQQQPPONMLHFCzvrrmmmeeddddddddddeejnopxuqquuqmmqptuxwttofc9ccc9575cffffiic731/))~~/~/<|59<-$@.  ...#>~<~,**->,,->,~|gmqmmquuuuk5<~/_({(5fpABAAtg9ccglmptpoouAABByyyyAEEAAwtwAwojjiiouwwsuqrtwxwxzABFI",
+"ILLNNNNMLFGCCzztttmmmmmeeeeeebbbbbbbkkkkkrrrvvvxzDEJJMMNPPPPQQQPPONMLHFzzvvrrmmeeeddddddddeeeejoptuqqqqqqmquutuwwttplie98655379cfilic541<~),,)~<<<39|,%#@..  .+%,~/~--*>,,>>>!/9kqqmmtuuuqc|/~///(49iwAAAypc90dioppwpolpwEEEEEBEHEBAytwAyplliinuwxtpqqttyxxzzAFF",
+"FILMNNMKFIHCCAzuttmmmmeeeeeeebbbbbbbbkkkkkrrvvxxDDEJJMMNPPPPPPQPPONMLHFDzvvrrmmmeeeedddddeeeeejnptxuqmqqqqmquttutwwwtlf866444426cilic5||</),->>)~~<3|~-%$#@...+#-)~),---,,,>,)~|gmqolquuuuk7_((///<7ftyAyyti059floqppogioyEHIHEEHEBAyttwypooihjpttwpqqqtuzxyzDzF",
+"FHKMLLMKKHHCzzAtttmmmmeeeeeeebbbbbbbbbhkkkrrvvxxDDEJJMNOOOPPPPPPPONMLHFDxvvrrrmmmeeeeeeeeeeeeeejotpuqqqqqqmmqutwwyBBypc662|11[}}3clic54<<<~'-**--,~||~,>--*$+++#*,)),,;-,,))))~{5kpmllquuuq0|<(((~/3gpyAywwpf70fiiiioplcfpyEIIEHHEBAwolptpookfeotttsommqtxxyxAzz",
+"zFIKMLLKKIHCzzvtttqmmmheeeeeebbbbbbbbbkkkkrrvvxxDDEJJMNOOOOPPPPPPONMLHFDzxvvrrmmmmmeeeeeeeeeeeejoppouqqqqqqmquxwxABAypf96221__[:<3fif93|</~)>*%%%-~||/))),>*%#+@%>)),>,>,,)//~~~<dmmlimuuuui3||_<{~<9ltyywwtoc9ckgccilofcipAHHHHHEEAtlflpooolffiptttpmmmrpwuxxzz",
+"zzHIKLLKKIHCzAysstmmmmjeeeebeeddddbbbbbkhkrrsvxxDDEJKMNOOOOOPPPPPONNLLHDzxxvvrrmmmmmmeeeeeeeeeejnponqqqqqqqqqquzAzAwtppf8a21__[:(<5cf953</~),;%$#%,|3<~~~),--*$##*,),>,,>,)/<</~~7kmmgkquuuqc733|(!~|cpwywwtulffli96dioloiipwBEEEEEEtiflpoillheipttuplmmqrstuttv",
+"vzCHIILLKIHCCzvttsmmmmjeeeeebddddddbbbbkkkrrvvxxDDEJKMNOOOOOOPPPPONNKLHFDzxvvrrrmmmmmmmmmmmmmmmmqunjqqqqqqqqqquzAAwtppplfa6|_([[/(<359953|/{),*$@#*~<///~~)),>-%%%>))>>,>,)~/</~~|domkfkuuupl9905|{'/9owAywtppllol979fiotoiilpwyABBAtiflppllmiffltttponmrruruqts",
+"svCCHILLIIHEzzyytsmmmmjeeeedbdddddddbbbkkkrrvvxxADEJMMNNOOOOOOPOPNMNLLHFDzxxvvvrrrmmmmmmmmmmmmmmquqmmmqqqquuquxABywurpppic6|1(][((/_<|5993<{))>%##$-))~//~/<|</)>*-)~,>>>,)~{/<(~(7kmmfgmquuqi9995<{)|fpyAyppqpppof059cittrififiopttpiiptpllljifisttqomljmmrnqms",
+"stzCCIIKIIHGzzyxuvmmmmjeeeddddddadadbbbkkhrrvvxxADJJMMNNNOOOOOOOONMMMLLHFDAxxvvvrrrrmmmmmmmmmmmmquqmmmmqqloppppttttsqolpli86|_^[/~~(~~<5953<~),-$##%-->)~~<39c93/)>,),>->,~/<<||(~|gmmgckpquuog9997<~/5ityywpoppolic76acottpf9889fiiilouwtooleiiiottppjjhnmqrnmm",
+"mtwCCGJIHFIFAzyvussmmmhjhedddddddadabbbkkkrrwvvzDEIIMNNNNNOOOOOOONNMKLLHFFDzxxvvvvrrrrrrmmmmmmmmquqmmmmjjlopttpnopttqmlloic84<^]{~~{{))<|55|/~),*$#%*%%*>)<3cff93<~)),>-->~/|353<~<cmmkcdmquuqmc5597_~<5iwyytooolifd960bioptpi96659cilpyAwpliffjilppppmjhjnmmmjm",
+"mqwzBCGHFHFFAzxxusvmmmhhhhbdddddddaddbbhkkrrsvxzDEJJMMMNNNNOOOOOONNMMILLHFDDzxxxvvvvrrrrrrrmmmmmquqmmmmmjnptwwpnjoptqmifiifc5|^]({){{,,,~<33|<~)>*%%*$##%>~|355955|</~,-=*,/|9dd3/(7imlg9gmquumg53993(/|5iwAypmmigc998a69fiptplf989cipwAAyoicccjiloppqnkhhjnmmje",
+"eqqzzCCGJFFFCzzxvsvmmmmhhheddddddddadbbkkmrpvvxDDEJJMMMMNNNNOOOOOONMLKJLLHFFDzzxxxvvvvvrrrrrrrmmquqmmmmmjlptwtpnjjrqqqmififcc7|:({!!!,'>>)/|3|/~)>**-%@+#*,///<39fc9|</,*$*)|9ii9|/|dmom00kqupql047d9|//<5oyAwolf905888668ciottpoiiipwyAAtlc9cccflpppolmhhhhjkge",
+"ejquzzCGGEFFFzzxvsssmmmhhheeddddddddbbbhhhrrvxvDDGJIMMMMMMNNNOOOOONNMMKJLLHFFDDzzxxxvvvvvvrrrrruquqmmmmmjnpppppojgkmqqqjfifcc93}:/!!!';-->,~<|<~~),>>-$@@%>,,)/|9fiif93/>$$-/9ili5||0gmmg7dkquumg517c7</(|9tAAwogc00a88666a9fopwttptwyAyypg99ccceiopooojhhjhhhhd",
+"djnuxzBGGEEFFzzvvvssmmmmheeeeeddddddbbbkkmrpvxxDDEJIMMMMMMMNNNOOOONNMMMJJJLHFFFDDAzxxxxvvvvvrrqswyqmmmmmqnoolnppkggmquqqific953}}</!!'>;--->,~///~~)),%#@$*--,~<359cili9/-%%,|ioli515gmqk75gmquqmd1|5c3/{/3iwAytlgf9566862259dflptwwwwywtpicbc999fnppooihdeheheb",
+"bgnrxzBCGGCBBzzvvvsrmmmmeeeeeeedddddbbbkmmrvvxxDDFIIIIMMMMMMNNNOONNNNMMMKJJLLFHFFDDDzzxxxxvvvvstwywmmmmquonjjjnmmkgkmqunjefd967}3|1/{';-*--**;>)/////~>%#%***,~|||||3cooc/-*-~9lpoi59giqmg40mmppqi3<|00|{~19pyAytif9566762223099dimopppppolfcc988biooolihhhbgbab",
+"bbkrszzzCCBBBBzvvvvrrmmkheeeeeeddddbbbemmrrvvxxDDIJJJJIIMMMMMMNNONNNNNMMMMJJLLLHHFFFDDDzxxxxvvvyyywummqquujeehjmmmkkkqppoieb963|253|_{';**-*&%*-,~<<||~>%*-->)/<33|</|cll9/,>)3lppof9fkqpi77fmqpumc|<5d3_/<5itAAypid76266|}1|1|4509d9cdgklkiif9669flomligbhbbhb8",
+"6ejmqxzzzCCBBDzvxvvrrrkkhheeeeeeddbbbbkmmqrvvvzDEJIJJJJJIMMMMMMNNNNNNNNNMMMMKLLLLKHHFFFDDzzxxxvyBAwtsqquuqheeedgmmmkkipppmiida31}55531/)>--*=%&%*-~<35|~>>,,)~/|5995|/|9fc|~))|iptpidflqqmd7dkouuum9|7dc3<~|dowAAwoi9311||1__(__37777750ciillf9268cjlollihcabaa8",
+"8bjnquwzzzCADBDzxvvvrrkkkhheeeeeeeebbemmmprvsxDDEJJJJJHJJIIMMMMMNNNNNNNNNNMMMMMLLLLLHHHFFDDzzxzyBEAtuwuuqjheeeddgmmmjjmpplllifc32359993<~,>-=***%*>)|99|~)~/<<|59fff9|<|59|~))<ftwtoiflqqqk99gmquuqi55dfd|/_7dpyAAtog0341_<__(((<1341144359fig6268bfilmlifcbaaa8",
+"2aehnuxzzzzAADDzxxvvqrrkkkhheeeeeeeeehhmmrrvxxDDEJJJJJJHJJJMMMMMMNNNNNOOONNNNMMMNMLLLLLHHFFDDCzzCEBwwAuumheeeddddkmljimptpoooif01}|3595|/)>-=*&%%%%>)|c9|<|335cfc9cfic5|373~,>~3pwwtpllqqpmicgkquuuof0cif9</<5gtyAwpod731_((]:]]^[:__(___140f964269ciiilihb88a62",
+"26hhlruxzxzzADBDwuuvvrrrkkkhhhheeeeeehhhrrvvxxDDFJJJJJJJHJJIMMMMMMNNNOOOOOOONNNNNNNNMLLLLHHFFDCzCEEAAAuqmeeeeddddgklonoppppomif03::_|595|/)>=%$####%%,|95559cfllifffilf9355<,--)9ptwtppuutpmgilqquuulddiif5<_|0qwAytplf91^]^^^[::(]]!{!{{(159a2}26abfgiiigbaaa22",
+"}68hnouxxyzzCADDAuuvvsrrrkkhhhhheeeekmmmrrvvvzDDEJJJJJHJJHJJIMMMMMMNOOOOOOOOOOOONNONNNNLLLLHFFFCCHIHEAqmmeeedddddgklooompppomiiid56359cfc9|<~,=%$####%>/||9flpttpoollllf5593/>*-~9opttuuxxwumikmmqqpplfioic3<<4ipyyytog92[{!!^^]::^]!!!{{(|462}}228cffiiifc9aa2}",
+"}6ablnrtxzyzCABADxuuvvvrrrkkhhhhhmmmkmmrrrvxxDDEJHDEDEEHJJHJJMMMMMMNNOOOOOPOOOOOPPOOOONNNLLLHFFECIIIAwmmmeeeddddggkinonmptwwttptpigfccfiifcc5|/)>*%%%$*,))/5lwyywttttpoid955|~>-,<9iotutxzywtmmmmmqqpploqof951|9lwyywoi93[^^!!!^](^]]^{{(_1||2}2268bffkgigc0082}",
+"}28bhnqsxzxzzCADDyxuuvsrrrrkkhhhhmmmmmmrquvxxDDEEEEEEEEEJJJHJIMMMMMNOOOOOPPPPPPPOPPPPOOONNLKHFFFCJIHztmmmeeeddgggggeiopptABAAywttpllc99cccffc03<~))>>->,),,/9oyAAyyAywtpli953<)>,/39copqtxxzxuomqqmmqqopqplg9547fpwAytlc6}:^^!!!]]^]^(____||<}22270dfiiiifc9071}",
+"}2aahjpqpwxzzCABAyyxvuvvrrrrrrhhmmmmmmrprvuxxDDEEEEEEEEEEJJJHJKMMMMNOOOOPPPQQQQQQPPPPPOONNMLKHFFEGEBtsmmmeeedgggggghlpttwAEEAwpptolic57555555953</~))))~//)~|ftwABBBBAAwtpi953<~)/355fppquxyxuqmqqppqppppppid9730ipAAztlc641_{!^^^^]^::_<<<__}22669cfiiiifc9071_",
+"_268hinqqttxzzCBBDyxvuusvvrrrrrhmmmmmrrrvvxxzDDEEEDDDDEEEEJJJHIKMMMNOOOOPPQQQQQQQQQPPPPOONNKLHFFECCzwspmmmejgggggkknotwttwABAwtppoigc7311<<<|3|3||/~)),~<<<|3copwAAABBBAAwpifc5<~/|539oupuuxwupoquqpqttutxwpid0559lwAAAulc03|/{{]^]]]]](_(___}|7699cilliigc9741_",
+"_1aabhkrrquxxzCCBAAyxvuvsvvsrrrrvmmqrrrvvvvxABEEDDDDDDDDEEEJJJHKLMMNOOOPPPQQQQQQQQQQPPPPONNMKLIHHBzvvsrmmmjjggggkmqppptpppwAAytolmkc95|__///~//<<<//),,,~/<|5foptwtptyBEEBytpof9|/|559iuutuxxxtqmqppqtutwwywpifc99fpABBApif97|/({^]{]]((_(<<_}3559ccfiliid9074__",
+"_128bhgmrqsuxzzCGADAvxuuvvvvsvrvvvqqssvvwxxADDEDDDDDDDDDDDEJJJJKKLMMOOOPPPPQQQQQQQQQPPPPOONNLLIFFBzxvrrmmmjjggkmpppqnoooooptyytoiik987|/{{)))))))~~~~,,>,~~<3copttofflpABEEAywpi933999fpwuuyAAyuppqppqppuwyywoigfdflwEEEAwoic93<<:[::::<__11|23559ccfilifdc954_(",
+"{}47bhhjnruuwxACCAzADvwuvvvvvvvrvvvqsvvvvxzDDDDBDDDDDDDDDEDEJJJIKKMMOOOPPPPPQQQQQQPPPPPPPOONLLIFFFzzvvpmmqjjgkmpqpqmlnlollilpwwpifgd52_~!!,,>;>--->,)),,,))~<5fqttogccfltAEEBAypic99fiiptwuwzAzxpqpuqqppppwywpiffifgpAHHEAwoif954}|}<<<|1_|__}|3659cfgiiffc951_(",
+"{_47ahhjmnrpsxwACCzAAyvwuvuuvvvvvvvvvvvvvxzDDDDDDDDDDDDDDDEDJJJIKKMMOOOPPPPOOOOPPPPPPPPPPOONNLKIFFAzvvsuqqjjoqppqmmmmiiiiifhipwtlfdd961(!!';;=*&%&%*->>,,)~)~|clppofc99cfpwABBAytlfcfllltwwxzCzyuqpputpppptyywojfifcitBHHEAplfc953}:<<__<_<<}123559cfiiifgc95}_{",
+"{(120hhhjnrrstxvAzCAADyvvtvuxxvvvuuvvvvvvzDDEDADDDDDDDDDDDEEJJJJKKMMNOOOOOOOOOOOOOOOPPPPPPOONKLHFECzvvstqqqppqqqmmmmkeeehhebhlttoifdd94_{!'>;-*&$$$$$$%*-,~~/|ciopi953359fptwAAyytoilpolpwyyCGCzwtputppppoqwyywmmlifflwEHHBypiffc93|}:<_||||2355599cfiifgff92:^{",
+"![1700hejnnrrstvzAACAzADvywzxxxxvvuvvvxxzzBDEDDDDDzzDDDDDDDEEJJJKKMMNOOOONONNNNNNOOOPPPPPOOONNKLHFEzzytuqquttqqmmmkkggbbbfebbfottlgdd56_~!'';=**&$$$#####%>)/|clpoi5|<<<|9iptwwwtollottttyAABEHEAwtttupmqpptyAytoiiffipAEHHEAtoiikf953|1||4355555cccffiigfd52[^!",
+"!(1400behjnrrstvyyzAAzAADADDAzxxxxwxxxxxADDEDDDzzzxzzyDDDDDDEJJJKKKMNONMMMNNMMMMMNNNOOOOOOOONNLLHFECzzvtwuxtpmmmmkggggdbbbhbbafopoid055_/!'';;*%&%$$##@@@@%->/5lppi9|/~)~<5ipwwwti9cipwwwyABEHIIGAywwwuopxwwyAAyumifilotBEHHEEypppolf905755599090cccfifffc96}[^!",
+"!^_270deejnnrrssvyyAzAAAADADAAzxxxxxxxzzBDFDDDzzzxwxxzyDDDDEEJJJIKKMMMMMLMMMMMMMMMMMNNOOOOOOONMLLHFFzyywyxxppomkkgggddddbbehbabipolfd071_{'';;%&%&$####@+@#$%><cpplf5|~,,)/5itwAxm5|9fotwwwAEGKKIGCAAAyptyAAABAAypliloptwBEHHHEAwwttplifccc9cc99999cdff9c952}[^!",
+"!^_1700eejjjrrssswyDzACCCAAADAAzyvxvxzADBFDDDzzxxxxxxxzDDDDDEJJJIMKMMMMMMLJJJJJJJIJKMMNOOOOOONOMLHFFBzAyAxxuookgggddeddddbbeehaelpiicd74_/)';;=%$$$###@@+@##$%>|gifc93<),,)/3itzAtg3|5foppotyBJKKHEEAAzywACEEEBBBAtooppttyBEHHHEBAAwtppoliiffcc95559cd990962}[^!",
+"!]_1700deejjnrrssvwyAAACGGACBDADAzzzzADBFDDDzzxxxxxxxxxyDDDDEIJJIKMMLMMKJJJJJJEEJIJJLLLNNLLNOOOMLKFFCCBEAAuunjjgddddeedddddbhhbbflligd541({!';;%&$$####@@@@#$$*!59953|<~~~~~<5itxxtf430floiitxAEJEEBAAAAtwAEEEBBBAytpoopptABEEEEEBAwtpoolifffc9955550d050762}[^!",
+"!]_17709eejjnnrqsvwvDAAzCGGGGBBDDADDDADFBDDzzzxxxxxxxxxzDDDDEIJJJKLMMKIJJJEEEDDDDEEHILLMNNLNNNNNLLIHFCEEAyuqqjjedddeeeeeddddgfehbiiiid061/{!''-=%&%$$####@@@#$%'|95</)),)~~//|9owAAtf99ciiffmtwAGEBAywwwpopAABAAyywtoicfilpwyABBBAywpliifc9c99995999fd900532}:^!",
+"!^^176adeejjnnrqsxwvyADACGGGGEEDDDDDDBDDDBzzzzvxxxxxxxxwDDDDEEIJJMKMIJJJEEDDDDDDDDFFFHLKLNNNNNNNKMIIIEGCyyqqmjheeeeeeeeeedddgkhehfligd095_({!'>;%&$$&$$$##@##$%;_57_!>-=-,)~/<3ftxBAuifiomigipwABGBzwtttmfimwyywtppoic5590cipwwwwywttoiifdc957590cfiifc9d95|[[]!",
+"!^^1470abeehhnhqqsxDvAAAzCGGHJEEBDDDDBDADzxxzzzxxxxxxxxxzDDDEEJIJMIJIIEEDDDDzzxyzAzDDEFHKKNNNNNNMMMKIIGCAxummmeeeeeeemmeeeedggkkeciiid999|</{!,;*%&$$%%$#####&&=!351{-**->>,,)/3iwACAwptttpoiluyBECywtppmg0dipuupmomkc953459iutttttttpoliigc9009cffffcccc9531[^!",
+"]]_177a0behhhhhmqsxDvyADzGGHHJHEEBDDDDDAAxxxxzvvvvuxxxxxzDDDEEJJIJJIJEEDDDzxxxvxxxvxzDFHHLLMNNNNOMMKKICCAtummmmeeeeemmmmmeeejgkkkehffd99971({!'';&%&$$$%$###$&&&,|77(;*-,,;--;;)|fwABAwwyAywpmpxAEEAxwtpok05cimliiiiigc05337doutpptttttpppoifcccccc99599905531:]",
+":}|45799aeehhhhmqvuyDyAACBHJHGGGEEEDDADzzxxxxvvvvvuvxxxxzDDDEFJJJJJJEDDDzxvxvsvvsvvvvzCDFHLLMNNOOLMMLIECyyusmmmmeeemmmmmmmhjhjnmmhccffd5903_({!,;***$%&&$$$#$%**>/77<,;,{,*%%%%*>|iwAAtptyAAywtwCGJCzzwtpog59fkkkgikgfffc959cipttppppttpppplifd9995537535433||1}",
+"}35509dbeehhhhhmqvuyDDyDCEHGHGGEEEBDDAzxxxxxvvvvvvvuxxxxzDDDDEJJJJFEDDDzvxvvvvvvvsvvxzzzDFHLKMOOONNNKIEzvvspmmmmmmmmmmmmmmqqqnnomlfdgfd06873<{!',;**&%%&&$$$%%---)104),~_!*$$&$$*,|owAwlltyCBAwyACJJEzAwwtoc0dkmqmiiiffkifcccfmptwtpolooppolifcc955333|||1<__<<}",
+":}79ccffjjhhhhhmqvuxyDDBEEEGGBEEEAADDzxxxxxvvvvvvvvvuxxxxDDDDEIJJEEDDDxxxvvvrrrrrrrrvwwzzDFHKKNOOONNMIFzzvrrrmmmmmmmmmtwwqqssuuppolicfd02505|_{'';--*=%%&&&%%=;;-,<75()~<_'=%$$$%*{5pwxofityAAyzAAGHEAAAwtui75gquumkkfccffgcd0diopppliiilooliiffc95531_<</({{{{)",
+"':}59cfijjjjjmhmqvuxyADDEEBBBBBBDDAAzxxxxuuvvvvvvvvvuxxxwDDDDEEIEEDDDxxxvsrrrrrhmrrrrpwvzzDFHMMNOPNNKIFAzvvrrrmmmmmmqwwyyyuuuuuuppoicdf0659531(!';;*-;==%%&&=;;;>>{45<~~(||~>=&**%>{9pxtifowyyyyyABEEAyzwtum0|5gquqggd73570d0579fiilllilloolliifc995|1|<//~~!!,'",
+"'{:|0dcfjnlolnnqqvuxyDABDABBBDDAADAxwvuuvvuuvvvvvvvvvxxxxzDBDEEEFDDDxxvvvrrrkkhhmmmmrsswvzxDFIMMOOONKFFCzvvrrsmmmqqqxwyCAABAxuuupupiccigd9d9531(!';----;;%%**=;'>>!|7|/~~_33(),>-%=;/cuuiffotxwxxzBGGzwxwttti415iomdd051<14507770ddgfiilolollliiic953||<_{~)!'';",
+";'^[400eejllqmruquuxyzBAAABDADDAADwuuvvvvvuuvvvvvvvvvuxxxzDDBDEDDDDzxxvvrrrmmkkhhmmmmmptvvzzFFIMNOOMMIFDzzvvspstqqqwwwwABEEBAAxxxupoffiikccgc541_)'-;--;>=%%*=;'>>,/44_~!{390|<{>;=*,|lpofciuwutwzABGBxttuutp9<<39c90901_(_|3777590099cfilllooooolif953|<(~~)';;",
+";'{[}0bbehjjnnquuuxxzzBDADDDAyDDxuvuuuvsvvvuuvvvvvvvvvxxxxADBDDDDDzxxsvrrrmmkkeeeeemmmmspwvzzFIKNNOMMIFFzzvvwstwwwwwuuyABEHBBAAxwtpooiiiliiiif997</!'>,,,>*%%&=;>>'{451~~/7mpi9|)>**>(9opkdfpwtutwyAEGAuppptuo5</1500993<(~_1|47500099580dgloooooollifc53|/~),';",
+";!{_}70bbejnnnmqvxxzCCCBBBBADyywtuuuuvvvuvvrvvvssvvvvvxxxxDDDBDDDzxxvsvrrmmkeeeeeeeeemmmpsxwzAHKKNMMLIFFCzzvvuuwwwwwwuACHHIHEAAAurmolfcilliiiiffc93_~~~!';*%%&&=->,!|7|/~|dqtpoc|!;->{3kppfciutttxwzAEBypooptug4{~_47007|_({(_1359000077670cfiiffffffffcc93|/),'",
+"){{<}20beejnjjmqvuuzCCCDBBDAyxtvuuuvvrvvurrrrvvqsvvvvvuxxzzDDBDDyxxxvvrrmmkeeeebdddeeemmmptyyzEIFKMKKHFFEzzzyzwutttwxABEIIHEECywqlkllicfkmiiiigccc95|</{''-*%&&=*-;'/34/~|coqpog0|!,>!<9ouodfotwwxxwyCEAwpommpqf|~/<3555|_{{!{<|35999d97243230995595555599995|/~",
+"|||||60dejnnnmmmquuxzzzCDDAzxuvuuvrvvvvnnrqrrrvvssvvvvvxxxyDDDDzxxxvvrrhhmkeebbbbddddeeemmttyAEEHIIKLLHHFAzzzAyststwCEHJIJGCAzAwqqomloiffilkifgc9553|<//~)>-*&&%%*-'~|3<~<3dlf09d9|~!!~|dpukciptwxxwwzCCywpmioppc|<_|1353_]~)){_|359cdd06||2122|3||||<||||459553",
+"59999d9dfhjnnnqqquwwzzAAADzxuuuurvqqqqnnnnmrrrvvvsqvvvvxxxzzDDzxxxvuvrrhhheedbbbbbddddeeemmstzCEEFFLLLHFFCzCzAvvwvzCEHHHGECzzzzAwqomolifffkifdfd0743|<////~)>;=%%*->!/4|~/<507||499|{!)(3mtpfdltwwxuwxzCAwtpiiopm91____471(~]))~/<159dgd967321|||<<<_((/(((<<|33",
+"<39fiiiilljnnrqruuxxzxywyxxvvuuvsvrvnnnnnnnrrrrvvqqvvvvxxxxyDzxxxvvurrkhheeddbb88888dddeeemqxyBCCBDHHHHFFFCCzyxxyzBEHEGCEFBzzzvAwqomlilfc9dggddfd0333|</////~''-**-;'~11(~/|7|13|155_~)~_dutmggptwwwuwyzAxupoimqqi01_/(174_{!'''!~]<79cgd9056332}|<<_((~~~))~{~~",
+",~|5cflopppprrrqvuuxwxxxxuuvuvssssnnnnnnnnnmrrrvvvqvvvvvxxxzzxxxxvvqqrkhheeddd88888888ddeeqquyyAyzzFFHJHFEEzzxyvzBEHECCzCFFBzzzzAwunkefd990ddd09cc9533|_<<<<<(~,>-;'')<|/~/|4|7d03354<{~_5muukdiqutuutxyzwtpollqupf3<//_75<~!'''',']_39ccc006573|||<<((~~~)),,'>",
+"->)<|5clopttttppqvxuxwxuuvvvvqvqrornnnnnnnnnrrrvvvqqvvvsxxvvxxxxvvvqqmkkeeddd8886666888ddhjquuywywxDFEEFHFEzzzvABEHEBCCzCFFFBzzCAwqnkhb9aa3589575093|||||||||<<~~)',))/||~~|449mqf5573_/_4gtwpgflpututuxyxupomlqppoc|<<|75|/)'>>''''~_|0900765342||||<_/~~)),>;=",
+"=>'~_25dioptwwvwuutuuuuuvvqqqrrnnjlnnnnkkhhknrrrvvvqvvvsxxxvvxxssvrrqmmkeedd888666666688dgjnuusstwxxDDEHHFDCzzzGEHHGCCzCHFFFFCCCAxqqkhab9644307||774_//<_|||3||///({{{/|4</<79dqupld051__40luxodfmpuuttuxxupmiilppqm9||3707_{,,>>'>'!{_3a9006332}<<<_<<<</~)>>-=",
+"=>,](<|7cfiostywyxxwxxussqqqqnjnjjjjghhkkkkkkrqrqvvqvvvvsxxvvxxvsvrrmmmeeddd886666666668bggopwuqurvxzDEFEFDEAzCGHHHGCCBCFFFIFFBCzzwqjkhb88634704|4751~~~~~/<|33||<</<<<|73<<49glpttod971117gpxpgcgmquuuttxwpmkdfipuql9779dd7_!';,,>>')/:77657633|}__<(<<<</~,>-*",
+"->,)/<|35bginpswwyzxxztvuvqqjjjjjjhhghhhkkhmmmrrrrqvvvvvsxxxvvvvvrrrmmmeedd8886666666666bbgmppummpvvxzACFDDDCCCGHGGCCzCFFFKFFHEECAwsnkie999535873|703_)),)))/_1333<//135093130dfptwtoc95447fmxwlddglqtttutwupmd99ippqld00dkg4{!''',,',!(14a732334|_</((~~~)),,>-",
+"-'']/<|25dcfinnpttwxxzzxusvnnnjjjhhghgghkhhhmnrrqrrrvvvvvvuuxvvvvrrrmmmeedd886666666666a8bhmqpommhrvvzzzzzDFHHHGGCCzzCEFFFKKIFIIGEAwxtqijfd0539d73799|~),,,,),{_|53</<|9fgc5509glpuutlc9770fmuxpg0dklquuqpttqmic59iqqqmf9gmmc1{!,''>,'!{_|22322|4|__//{),,>>>>>-",
+"*>'~_<|279cfijjoppqsxxzzwwsnnjjghgghhgghkkmnnnutpsurvvvvuvvuvvvvrrrmmmeeedd886666666666688ilomnjmmppvzzzzzAFIIIECzzzBEIIIFKMMMMNNMMKIBzytpolgccfd97905<~,'>,,>'')<||<<<|0iic00dfiikmtpi9900imuxwpfcgkmptqqqqupoi539iqppoikmmk9_{',',,',{:|42732|1<_(]{~),>-;*=&%",
+"$*;)(<3359ffginnoporvuxwtupppohgghgghghhhkhjknrputttutttvvvvvvvrrrrmmmeeddd886666666666688ellmgjemmstwwvxzzBIIIHBACBEIIILMNOOOOOPOPPONIIHEAwtoillidcc93/~',>,,;;>>)/||<<3clkfgiif95cimoicddioptwtmfcfmppqooqqqold3|9fmppppmqmg9</,,'''!!(:}275221__(]]),,>;;=&&$",
+"#%=,)]<35cfffilnoonmnrsrrspppmmkkggggggghghkhkrrqtuutwwvvvvvvvvrrrmmmmeedd88666666666666aafiifhgehmmtwvvvzzCHIIHECEEIIFMNOOPPPPPPPQQOMIIIIEBAtooppliifd3<{'>,,,;--->)<1||5fliilol9459gmolmklmquxwulggippuqomqqoom91|0imqpppupof7|~~!)!]{][:}652641_(]]'>,>;==%$#",
+"#%=;,]/|29cijlloonnqqqqnqnnojmmmmmkkgggkkjkjkhrrrusuwywvvvuvvvqrrrmmmmeedd886666666}}}}68bfihebddejmmsvvvyzCGHHFFFFFFKMNOOPQQQQQQPOOKEAzAAwttpiiloolilof5<~',,)''-*--)/|359fiiotpi9339fmppppommtwxtidfkoqqqmmmmomm0|40gmquttupi97|//~!!]]]:}473a71|:]]''>--=%%$#",
+"#%=->!~_170dijlororoqrrnmjjjgkkmmommmmmlmnmmmkrqrrptwyywxvuvvurrrrmmmeeedd886666666}}}}28biih8b8dgjmmrprvAACGCHFFFFFKMNNOOQQQQQPPOMKEzAwuppligf9cfiiilptl9|/),)))'-**>)/|55cfiotwpf5459iptutqplqxwwqgdgmqqpmmmmlmmk5159imptuupmg77|<(({{{[_[}26672}:({]'>-*=%$$#",
+"#%=;,!~::479hfioprrrpqqnnjhhhggkkmmqpppoomqqmrrrrrpvxwwvvwvvvrrrrkmmmeeeddb8666666}}}22268iiba68bggjmmrptzCCCzAFFIIKNNNNOPQQQQPONNMIHEAwtpoifiid9cgiilptpi9|(~~~/{,;;->)/|5cfikpxwofc09cmtttqqolqwwui9dfopppmmmkkmmc||5cgoqputqic5311<_((_:[1a5a731<]{{''>-*&$#@",
+"@$=;>!]_<435dbgilnnrprrnjjihhggggklmpppqpqpprrpqrrsuvwtvvvvvrrrrqmmmmeeeddbb666666}}}2226bccc8666bggemmstwyBAzzEFKMNNNOOOPPPPPOONNNKIHBAxwtoooooliiopoppplc5||//<</!,;'!)/|0gkiltwwpifffmuwtpuqmqxxwqg0cimqpmlmmkklf5|7ddfmqqupoc77713111}_}}2777731_({)'>>-*&#@",
+"$%==>'{/:4750cbginnnmnnniijggggggkkkklmqqutttrqprruvwutvvvvvrrrqmmmnmeeeddbbb666662}}226acc9666668egehmnwwyzyyzBFMMNNOOOOPPOOPPPOOONNMMKIHEEAywwwttttwtppof053|||33|{'')~/_3cillotutpommmuwtqptpqtxxumd9ckmpqqmligki91|7ddgkoppoi97733377742}2677a311_{!'>--*%$#",
+"$%=>>'~~_4790bbgginnihnnjihhggggggggggkmmptttprprpsvvsvvvuvrrrrrmmmmmeeeddbbb6666622}22aacc862}6a8hbdemqquwwvyzCIMMMNOPOPOOPQQQQQQPPOONMMKMKIHHEEAwtwyxtppl0533|3553|////(<<3flloptwwtpquwzxppuuttxwxqf90dkpqqmmkgggd7<|0dgglmolic077|335066aa65723|1<({)'>-*%$#",
+"$==>,')]_1359dddfhjjkhjhhjgggkgggggggggkmqqtttttprxuvvvvvvrrqrrmmmmmeedddb888a6222}2}}}26cc662}2688bdgjquuwtsyCGIKMNOOOOOOPPQRQQQQQPOONMKIKKIIIIIIEAABAywwtl53||3|33|<<<||</<5flmptwwwtttyAAxttxwuuxwtld750ipqommkddg0|<39fgikiffcc0731|470d8a6a7aa11_{~),;;**%#",
+"&&->''{/_1457bhbggijikhjejdfgkgggggkkkgkkmpprtstswvvvuvvvrrrrqqmmmmeeggbb888222}}}[[[[}26bc62}[22866bgjnuuqstzBJHKNOOONOPPPQQQQQQQQQPOONKIIIIIIIKIIIHHHEAAAyo9333<</<<|||4<(~<5iopwywttuwAAzzyyyyywwxwuf535clqqookgdd03<_40fikgcc999997||47acb9a9074|_(~),>;;=%&",
+"&*--']~(_1375abcfikjhhejefddgggggkkmkkkkkrrnrrrwwwvwxvvvrrrrrrkkkmeeddb88aa2}}}}}}_____16b96}}}}22666bkoouqmsyEEHKNOOOOPPPPQQQQQPQQQQOONMKIIIHKMKKKKKKKIHEEEAtig9|/{~<|353</~{|9iptyytpptyBCAAAAAzyxuwwm9437gmqqmmkd005|<<39iiic975579033247dbccddaa|1_/~'>>==&&",
+"%*-;,)](<1357acdgfinhjhjgfddddggggkkkkkkkmooopstxwxyywxrrrrqqmkkkeeddb888222}}___(((((([79562[[}2226aekmooqquABEIKOOOOPPPPPPQQQQPPQQPOONKIHEEEHIKMKMMKKMKIIIIEypi5</{~/|553</(_3clpwyytpotABBBEEEBzywxxug7439imqpmmkd7741<|5dfff9005579967276abccd9a4|<(/),>-*&$",
+"$%->,)(/1|350ddcgfinjjnnfgddddddddggkkkkoonnnssvvwvyywtttpprmmmmeedbb88a2222__(({^^^!^^(|774_[[}}2}28bimonqquAAEIMNNOPPPPOPQQQQQPPPPPONKIIEBAAAAEIIIIIKKMKKKKIEApg5|/~{_|7974|<19gltyAyplltEEEHHHGEzyxywqc3379mqqqmmg05731147dcgfcc03790d05a7888ab07241_{~,;;*%$",
+"&&->,{(_11550cbbgfgjhnnqiigddddd0ddggkkooonovsvvuvvvttutttsmmmmmeeddb6622}}___^^^^^^^^^[}32|(_[}}}}26bflmniuwxAEKKMNOPPOOPQQQQQQQPPPOOMMIEAzwtppwwwtyEHIKKKKKMKHBpic3({!(<7907770diowBBwoipyHIIHHHHEzzyxum0445cmqqqmkd033113500diiic5750d998008a8aa722</({!,>*&&",
+"%=-'']{_|450acbggghjhjlmllgggddd0dddggmonmnrvsssttvsussttqmmmmmghggb882}}}_((^^^''''''!]12}:{{_:}}}26bfimklpxwBIKKKOOOOOPQQQQQQPPPPONMKIHEAwwttpplikipwEHIKKKMMKIEwoc|(!!{_7999ccfiipAAypootBIIHHHHECAyzwug7345gqqqqmk0744|43570diif97570dcdcdc8bac0522_({!'>-*%",
+"%=;'!{{_<159abcggiijhhfiiilggdddddddgiljnlqvrsstusrsspummqmqqmmjegbb886}}_(^^]!!''','''{<||]^!(::_[269eeikmpwxBIKKMNNNOPQQQQPQPPPPPOOMIIEBEyywwtpogc9flpwEIIIKKMMIEwl93/{)~<59cfilllowAwpoopwEIIIJHGEBAAAxqd3439mqqpqmg74414409779cfcc090dhcfegbb0a857}}({{'';*%",
+"==;'!{{_<1789cfggggjhhggfiigggddddddikiljnrqrsvvrrrusmmmmmmmqqmjggb88622_(^^{'','''''''{_|_{]^^(:__26c9fimqtpzEIHKMMMNOPQQQPPPPPPPPOONKIIHEAzywppolf09ccflyEIIKKKKHApi93<{{/<39ciopptyAAtollpwEHIHHEEAAAzAum0775cmqqqqld741347007359dgddddd9figgbbb8a53}:({!';;=",
+";;''!{(_12a8a9ggiijjhgggfggigggdddgiilkinmmqvvsrrqrmmmmmmmmmmmjjggb88621_^^{!''';>;;>;'!<_/]'^^((__<69cfciqptBHIIKKIMNOPQPPPPPPPQPPPONMHHEAyxwttpllfd99999iwBHIKKIIEwplf92:::269ciptwAABypiiopwEHHHHECAAzAzumc075iqqqqpkc743479093379fffidbdhejkjhhbaa7|[[{]'';;",
+";;'!{(__22669dgggfjhhgggggffddddggkkmlnmnmmrrrnrqrmmmmmmmmmmmmjjgea8622_(^^!'';;--;;--,)<<('''^]({(1688chnqqwBHEIKIIMOPPPPPPPPPQQPPONKFCCAuwttppollicdccdcfmtyEHIIIEAtpoic5}:}268clpwyABAukfiopwEEHJJECzAzAzukd57dmqqqqqm0333570d07359fgighgbejkkjehbaa74[[(!';;",
+";''{([[}2260cdfggjjhjgggffgfgfhhhiilloqnnnrrvnnokkmmmqmqmmmmmmjkkebba21_^]!!'''--===*;>)/</'''!]^{(_3a8ciioqyEHEIIIKNOOOOPPPPPQQQPPOMLFBzwqqnmlloiiffcccfiilptwAEIIIEAywtpi9714370fltwyABymfflptyBEEHHEAzAAAxpfd00goqqqqqk055670dd95770gflkggeejkmjjhbaa74[[^'';",
+"!^^^[[[}2799cffghejigggiiggggggffhilorrnnqqqnllhkkhmmmqqoqqqqqnmkjh8661_^{!''';-*****->,]<~';'){{!{[3389cnnqAEHHIHHMNONNOPPPPPQQQOOONLFCzvsmjghbffccfffffilloptwyHIKIHBAyytof05770dfluyABApkgiptwyAEHIHCAzzAzwoddddkoqqqumgd90070dc0570dcimmkjjjjkmnjha884}[^^^!",
+"!^^^:<13779cdgiheeehhggggffdhheijjjnrrqrvrrrnnhhkkmejnrprppqppqqmkidaa4[:{''';;--=&&&=;,/<~>;''!^^^_|388fllpAEEIEEIMOONMOPPPPPQQQPOOOLIFzvsmedgbab989cfiifiilptwwAEKMKIEBAAwoi9550dfimwAEEyqiiotwAAAEHIHEAyAAwtlcddgmppquumkcd999dggd00dggomnmjjjkmmjjjb864<_^^!",
+"{((_|17790cfhhghheeheeehjjeheeheihjnonmrqppnnhkkkejjorpspppppppqoikfb05}_/!,>;--==%%%%;'{<{>;''!!^^:<158cfltBEHIGEKNNMMMNOPPPQPQQPPOOLHEzvsmmedb886868cfffiiilptwyAHKMMKHEAwtplfbbcffiqwBHEytppptyAAAEHHHBAAzzwuifgilqqquuupigd9dddgggddhhomqpnknkmmmljeb8621(({",
+"(__14479acefffhhfeehhhehhheehhehjjnnnmmqrrorkhkhhhjnqqqqppprpppmokjgcd06|<~!,--=%%%%$%*>{/);-;,''^^[:159cfltBEEHBHMNMIKMNNOPQPPQQPPONLHFzvssmed8a662a689bccfiilptyABIKMNMIBywwtpibdfiiipyEKEAwpppwAAzAEHHGBAAAzwuiiilopuuuuupkcddcdgggggjkmmmqnnnnmmmmnjea662__(",
+"[}2266a8cbffffhhhehhghehehehhhhjhjnnnmmnqnnhmmmjjknmqqmmmmpprppmmijcc0763|<~,>=*%%%&&%*>)()-->'''!^[[:40cciwBEEECINNKHIKNNOOPPPQQPPPNLLFzzvsmeeda666268b988fiiilpwyAEKMMMKHByyywplfffiiowAEIHBwpopyAAyAEEHGAAAACytolmmpuxtxxtuidddgggggjjloomnqnnnmmmmmjefa622}[",
+"[}22a6abcfffffhhheehhghhhehhehjjjhmnqnnnjnkhkjjkmmooollllmmnnlnmifea90221||<~'>*%&&&&&&-)~'-=-''''{:::40c9iyEEByBIMMHGIKMMOOPPPQQPPPNMLHCzvsmmedbb66886a9668fppptwyAEIMMNNMIEAAytplifiilowAEHHBwttyAAyyAEEHBAAACBzwqlmqxxxwxxxpkgggiggkkgilljmmloommmnmmjhbba6}[",
+"}226a89bhffhffheeeehhhheeehhhjjjjnnrrmmmlnhheegklpolijhhjjkkknnkhhh8a3}1___(/{,>*&&&&&&-)~'-=;''''{_:1250clABEAwEKKKEGIKKLOOPPQQRQPPOMLFFzvsmmeddb6668abbbadiptwwyAABHKMMNNMIEAwtpoiiiijiptyEHHEAyAAAyyyAEHECAyABBAyuqquxzyxxzxumkkkijkkkjjjkkmjnommmmmmmhbbba2}",
+"688bbhfjieffhffeeehhhhheeehehjjjjhmmmnrlnhhbhdbiiolliieeehhkkkjkeb666|[_(({{~{~,>-&$$&&;)~!=*-'''){(_}250coyAAzyHKIIEGFFKMOOPPQQRQQPONLIFzvssmeedbb6666a88bciopwyAAABEKNNNNNNKBytpillllifipwAEEEEEBAAywwyAEHHAAzABCAxpmpxAAzAzzxxqmmkjjkkkjjjhmmnnpmmnmmmmhha886",
+"688bbbejiffefhheeejhhhhhhhheehhjjmmqmrnnghhbdbbhiiffc9ahbbbeegggeb6661[{{!)!)!)),'-%$$&;)~);*=-;''{/(}437cpyAAwAIIIIEGGIILNOOPQRRQQPONLIEzvssmmhddbbb666889jloopwyyAABIMNNNNONKEypoiopoiffipwyABEHEEAwtwwABGIHAAAzCCzwuquyzACzAzzxuqnmmllljnhhkmhnrmmmmmmmkkeb86",
+"8bbehhfhifhehfehehhfhhhhhehhhhhhhmqqmmnnhhba88bebcbd8aaa8bbbeghgebb62_[{!'''>,,,',>-*&%-'~);*=>''')//_227cpwywwBKIEHEGGFILNOOPQRRQQPONLHFzvvsmmeeddb88bbbbhimmmmqttyAABHMNNNOONKEypplptoiffotwAAAABBAwttwABEIIGBAAAzzzxtwwyACAzzzAyuqpqoonkjkkhmjnnmmmmmmmkkggb8",
+"dgggechfjihfhgeehehhhhhheehhjhhmmrqmnjjhhba888bc9098aa66aa8bbhkgebb62_^{!',>;--->>,,-**;'~);-;;'''!((<227ftwtttBKHEEEGEIILNOOPQRRQQPONKIFzzvummhjgdddbbbbhgkmmkjnpptwyyyEMNNNOONMEytppttpigjowyyyyAAywtptyBEEIIHEBBAAAzAyyAABAAAzzzzxtppppmmnmmqqnnnmmmmmmkkjggd",
+"dgggejeehihfhhheeehehhhhhhhjhhmmnmqnnjhgba8aa8aa8aa4316666a8cbekhba62[^{!'';;**==;>>>>->,~)>-;>'''!~/<126fpwttwEIEEEEGHIIMNOOPQRRQQPOOLIFBCAwwqqjjgggdddddgknnijjqptwwwuwBKMNNOONKHBwwwwwoifotwwwwwwwttttwABEEIKIEEBAAAAAzBBBCCzzzAAAytppmqqqqqqqnnnmmmmmmkkjjje",
+"ehggejeejhhhfeheeeghhhhehhhhhhmmmmmnjjgb0a68a8a86531_111266aabbheba62}^{!'>;-=%%&%*->>,'~/~'-->'''!{(<<26ittppwEHEEHEGGFILNOOPQRRQQPOOMKKHCByyuuornkkgggddfjnjmmmqpttwwwuxAHKMNNONMIEBABAwolmptAAAwttpttttyAEEHKKIHEBBBAAACCEGGEECAAAAwttpqpqqononnnonmmmkkkjjje",
+"ehggejhehihhfefhehhhhhhhhhhhhjmmmmmnjhgb086266873}[[:[__112aa8bhebb861^^!'>;-=*&&&%%=>,)/</,-;>,''!{((|39ittptwHHEEHECEFIMNOOPQRRQQQPONMKECAwyuuuppprmmnjjhjqqnmmqupwwwywtuABIKMNONMKIHEBAtolnpyAAwwtppttptyBBEHKKIHEEEBAAABEEHIIEECBAywuuptuprprnnnrmmmmkknjjje",
+"dggghhbhehieffehehehhhhhhhhhjhkhhnnljhba8662aa53}:[]^^^^__12aa8bbhbaa1_^{!';-=*%&&$$%=;)(||)>;>'''!{(/|39iptppAIEAyBEGIFILNOOPQRRRQQPONKFCzzwwuuqnnnnnooonqqqqmmmmqppttwAwutyAEIMNNNMKKIEBAtoopyABAwtpooppptyABEHIIIEEEBAAAAEHIIKIHEEAAAxutuptttpprnrnmmmkknjjje",
+"dgbebbbhhehheheechhhhhhhhhhhkhkhhjnjhhba6622634}[:^]^^^^^(_12288bhba64_[{!'>-=*%&&&$$%*'~|3(,>>'''!{{(<39lppppAIEwxAEGIIILOOOPQRRRQQPOLIFCzyzwyqqqjjjjnnouuquqtmmmqloppwxAyttwABHMNNMIHHEEByppptAAAywtpooppptwAEEHIIGEBAyAABEHIKKIIHEBEBywwttttttuqmmmmmmmknjjgd",
+"8b88bbbhaabbbbcbbhhhdhhhhhhhhhhjjhjjhba8662244}[[{!]!]{^^^(_1228bbbaa41[{!';-=*%&$&##$&=,<3<~,,'''){((<49lppopAHAwxAEGIIILOOOPQRRRQQOOLIFFzyAyyqqmmmmmmmqquuyywqmmqnlotwwyywttwABIKMMIBABEEBwpoptyABAytpnoppptwBHHIIIEBAyyAEEHIKIIIIIEEAAAAwtttutuqqpqqmmmkkgggd",
+"668aa888aaa8bbbbbdddddddddddgghkjkjggb8662224}[[]]!!!!!!{^^(_122abba64|[{!'>-=%%$&&###&&>~|_/))!''!~((<39lpploAEAtxABGIIIMOOOPQRRRQPOOLLFFzzzwwqrnmmmmmmmmqtwyyuqqqqnpwyxyAyvtwABBEIKKHAAAAEAwpoppyABAytppoppptAEIIIKIHCAyyBEIIIKIIIIHHEECAywttutuqquupqqmmkkbb8",
+"66a6aaaaaa880999dc9000aa0dddggggghhh8a862}221[[({,,',,'!!{]^__222ab8631:{!'>-=%%$&&###$%*)/</~~~',){(_|3coppooABytxACCHIKLNOPQQRRQQPONLLFFEGCCAyqqqrqqqmmmpuuwyuuupupwyAAAAAAwwwABBEKKKEywwyBytpootyBEAytpqppptwAHKKKKIHEByABHHHIHIIKIIHHEBAxwttuqpopoppnoljhe86",
+"6222666a85667700000a6a6a8a0dddddhgdd86662211}[:{!'''''',!!!^^(_}26baa4|[{!',-=*%&&&###$&*>~/~{/(~'){(_|5coppooAAwtxyCCEIKMNOPQRRQQPPOOLMKKIIEEBBAuxxupqmtpppwuwwuttwywyyAAAAAAywwAEEHKKIAwtwyywpomotABEAwppppttwyEIKMMMMIHEAABEEEEHIKKKIIHEBAzwtttppqljjjiiihba8",
+"6222264434244226aaaaaaaaaaaaaaabddda066}}2}:::(]'''>;''','!^^(_}22aa6|1:{!',>-*%%$&###$&&>){)'~(/{~~(_|5coppooAywtxyCCCIKMNOPQRRQQPPOOONMMKIEEAAAAzywuwttpqwvwttquwyABywyyyAABAwwyEEEIKKIytptttppoopxAAAAtpmpptwAABHKMNNMKIEBABEBGHHHIHIHEEEEBAyvwpponijjiffefb6",
+"6626|14111}}}}222644477770aaaaab800a722}2}_[_<]!'>>>;;>''''!^^(_}26a24_[{!',>=*%&&$####$&-){)',{/((((/|5copplpwwptxuyABFKMOOPQQQQQQQQOPOMMLHHEEAAABBAAyywtxwvxptmqtyBEAwuttwAEEBwwBEHHIKKHytppopppopuwAAAytpoptwyyABHKMOONMKIEBBEEHHEEEEEEBBEEEBAywtppllijgeb888",
+"26434||::[}}}1|11111444377770008aa67a2}[}[[[:({'';;;;;;;;','^^^[}}2221:[{]!'--*%&&$$###$&=,)'->){{(___|3coppopttpsxuyABFIMOPQQQQQQQQPPPONNMKKIIIEEEEBAAyyAAywwqttmqwAEEypolptwEEBAAEHHIKKKHAtppopporpuwzAAypprtwwwyAEHKMNOONMIHEEEHEBBAABAAABBEEEBAwwtpniec86622",
+"2|3||}}}}____<|:_1111}42277700067a622}}[_[:_:(!''-;;=-;;;;''!]^(_}2221_[{{''-=*%&&$$$##$&=>),>>''!(_11|39oppoptpoqxuyzzFIMOPQQQQQQQPPPPOPOOOOOONMKKIHEBEBBACywpttmmuzEEyplfilpwBHEBBEIIKMMMIBwtptrpopqtwABzwsqppwwwyAEHKNOOONMMKHEEEBAzAAyyAAAABEEBBAtpoljca662}",
+"_((:[}21<:<((_______11144777776777a2}}[[[^[([{!,---===-;;;;''^^^[}2}21^[{!''-=*&%&$$$$#$$%>),>;>''!_34350ltppoppoqxuyzzFIMNPQRRRRRQQQPQPQQQQQQPPPOOONNKIEEBCAAytttqqwBBAtofcffowEHHEEHKKMNNMKEywttppputwAEEAyuqutwtwyEEIMNOOONNNKHEEEEAAAyyxywyyAEEEAywtolfc862<",
+"_(^^[_<|<<___(((__::[1}1227777767342}[[[^][(({'>;;===**=;;;''^^^__}}}_^{!!,;>;*%&$$$$$$#&%-,)>;>'''{1459dotpppppppxuyAzFKNOQQRRRRRRQQQQQQQQQQPPPOOOPPOOMKIECCAAwwwwtwAAAwpjiccfltBHHBEIKMMNNNKEAwwtptuwwCEEBAwtuutwtwAEKMNOOOONMKKIHHHEEBAAwxwttwAAAAAywtpoib531",
+"::^(]{{/___<<__///____<1}}244734733}}[[(^^((^{'>-=====*=;;;;''^^][}}}[^{!'';;**&%$$$$$$#&%-,),;;'''!_|59iptpppttpuxuyAzFKNOQQRRRRRRRRRRRRQQPONMMKMMNNNNOONKHEAABAAAyyBAAwtpoifffltAEEAEIKMNNNMIBywtptwwwABEHHEzwvwyywyEKMNOOOONMMKKKIIHEHEEAAwtttwtwwwyyywtpic53",
+"|}_/(~{{{{(/<<<<((((__<:1}}24421144}1[^(^^]{]!,;===%=====;;;''^^{_}}}_^!!''>;**%%$$$####&&*,{);>,''!(_|9ipwtpptttttuyAzFKOOQQQQRRRRRRSSRQQONMIGGGEHIIIKMNONMIEEEBBBAAEBAwtptpliffltAEBBEKMNNNMKEAwwtstwwyACEHHEAyAABBBBIKMMNNOONNMMMMKIIIIIHEBAwwtppppttwywtpic5",
+"95|<_((~~)~~((_<<<(/<_<<<:111|}1}12|:[[{^^{({!';==*%%==*=;;;;'!^{[}}__^!''>-=**&%$$######&=>~)>>'''!{<|5ipywppttswtuyAzHFOOQQPQQRRRRSRRQQPNKIHBCCCCGGGHIKNOOMKHEEEEEBEEAtppttpoifiipAEEBEKNNNNKHAwywwwttxAEHIKHEEBEEEHEIMNNNNNOONNNNNNKKKKKMKKHEBytpooooptttpoif",
+"lf933|__~~~~~~/</</(<__<<:}}}}_<:1|1::^{]{](]!'==**%%%&&=;;;;'!!^[[[_^^]'';-=*&%$$$######&%>))>>''''~/<3coyytptttwwuwzzFKOOPPPPQRRSSRRQPPONMKFFBCCCCCCGGIKNNNNMKIIIIHHHEAtptwwwplifipAEBBEKNNNMIBwyyyzutuyABEIIHHHEEEHIIMNONNNNOONONNONNNMNNONNMKIBytollilopppoo",
+"plif953|<<<</{~{(((<</______<::___|<:](^^~](])';**%%%%&&**=;;>'!^{[[[^^!',;-=%&&$$$######&&-)),;;''')(<|9lwAwtwwwywxyAzFLOOPPPPQQRSRRQQPOOOMMKKHEGGGGGGEHKKMMNOONNMKKIIIEwpwAEEAwoiiltBEEEIKMNNKEAAwAAwtuyyEEHHIHHEEEHHIMNOOONNNNNNNNNOOOOOOOONONNMHBwpiffiilopp",
+"iillifc53||</{)]]~~//<<<//___<:](_:<]^{^^{^[/]';***%%%%&=*=;;>'!!^[[^^{''>;-*%&&$$########&*,));>'''!(/19ftyywAywywxyACIKMOPOOOPQRRRQQPOOOOONNMMKIKIIIHHIILKKMOPPPOMKIIIIBwyBHEBAwpllpyEHHHIKMNMKEAyyyxtwyABEEEHHEEEHEHIMNOONNNNMMMMMMNNOQQPONMMNONKIBwoic9cffii",
+"59ciiiic953|/~)))))~{/<<<<<_<__](:::]]!!!!(_:{';**%%%%%&%==;;>'!!^{^^^''>;-=*%&$$#########&&>))'>'''!((|6cpwwwBAAAwxyACFKMONNNOPQRRQQPOOOOOOOOOOOOONNMKKIKIIKKNOPQPOMIEIMIBBEEBBEBAtppyEIKIIKMNNNKEAAAyyzAABEBEEEEEEEHIKKMNNNNNNMMMMMKMKNOPQPNMKKMMKKHBtlf633333",
+"(<|59fffc953<~))!!!!!!{((<|<<(_(:::(]^!'!'{(:~'--**%%%%&&%=;;>'!!^^^^^'';;-=%&%$########$#$&-)~'>,''!(_}29ottwABBByxyCGFKNONNOPQRRRQPPOOPPPQQQQQQQQPPOONMKKKKMMMNPPPOKIIMMHEEEEIKIHBwtyEIMMKIKNOONMEBAyyAAyACCCBEEEEGEHIKMMNNMMMNNNNMKKKIMNOOONMKIIKKIEAtlc6}/~~",
+"')~/|599c9953<//~~)!)'!{(___</::(<_(]]''!'!{]!'---**%%%&&*=;;;>!!{^{^^'';=*=%&&$#########$&&*)),;'',!//}29ltttyBHHAxyCGKKNONMOPQRRQQPOOOPQQRRQQQQQQQQPOOONNMMMMKKNOPOMIHIIHEEEHIKIIIEBBBHMMMIIMOPPONHBAyABABACzzEEEEEHEHKMMMMNMNOOOONNKKIKKMNNNONMKKIHEBAwof9<~)",
+"',,))/|3599995|<///~)!)){{(__<<]((<_/{!'',!]~);***&&**%&===;;;>!!{^!!!';-=*%%&$$#########$&&*,))>''')~_}29lttpwBIIByACHKLNNNOOPQQQQOOOPQQQRRRQQQQQQQQQPPOPOOONNMKKMNNOMHEHHEEEEHEBEHIIIEHKNNMIKNOQQPNHBABEEHEEBCBEEEEHHIKMMNNNNNPPPPOOMMKIKIIIKNNNNMIEAAABAti9<{",
+"/~))!)~(<|59cc953|</~~))!{{((_</(]//(/{!'''!{';**%&&%*%===;;;;'!!!!!!'>;;*&%$&$##########$$%*>))'>''){_}29ltwtwAEHBAAEGKKNNNOOOPQQONNNOQQRRQQQQQQQQQQQQQPPPPPOONMKIIKMMKHEHHEHHEAwwAHKMKKKNOOMKMOPPPONIEHHIIKIIHEEEEHIIKMNOOOOPPPPPPPOONNMMKEEEIIIMMKIBwwABByo9|",
+"5|/~~~!)~/|59ccc93|</~){~~~~(((/(((//{{!',!{]);**%&&%%%*=-;;>''!!!!!!';;=*&%$$#####@##@@@$$&%>)~'>'')![:}5iwwtwyEEBABEJKLMNNNNNOPPNKKMOPQQQQQQQQPPPQQQPQQQQQPPOONKHEHHIMKIHEEHIHBwwAEKNNOOOOONKKMOPPPPOKKIKMNMKKIIHEHHIKMOOPPPPPPPPPPPPOOONMIEBAAAEEIKIAtptAAwpf",
+"l9|/~~!)))~<39ccc953|</~~)~{{(]{//(/]~!,'!!//!;-%%%%%%%&*=;;>'']]!!!!';;=*&$$##@####@#@##@#&&-,~)'''!{::}0itywwwBBAzAEIKKKNNMKLNONKKKNOPQQQQQQQQPPOOOOOOOPQQPPOONKHBBABIKKIHHHIIIEBBEKMNOOOOONMIINOPQQQPOKKNNONNMKKIIIIKNOOOOOOOONONOPPPOONMKHBywtwAAEEAwppptwyw",
+"wo9|/~)),,,)~<39ccc995|<//~~~~{{]](<:~!'',!{~{'-*%%%%%%&%&=;;''!^]]]!,;-=*%$$#@@@##@@@##@@#$$*'~~''''{^:[5fpywwwBBAyAEJKKLMKIHINOMHCHMOPPOPQQQPQQOOOOOOOOOPPPPOONKIBAyBEHKMKIHIMMKIEHIKMOONNNMKIEINOPQQQQOOOPPPPOOONMMMNNNNONNONNNNNNOOPOONNMKHBywtttwwyyywtpptw",
+"opl9|/~),'>->,~<|59ccc53|<//((({{]]]</{!',,)~~'>-**%%%%&%%=;;;'!!]^!'';-*&%$$#@###@@@@@@@@#$&%>~{)'''!]::4dpwwwwBEAzAEHKIIKKHEIMNKECGINPOOPQQPPPPPNNMMNNOOOOOOOONMKEBBBEEIKMMKKMNMKBAAEIMNMMKKKIEEHMNOOPPPPPQQQQQQPPOONNNNNNNNNNNNNNMMNNNNNNNNKIEAwttppptyAAwpll",
+"ciolc3<~),,-;=-,)/|5999953|<<<<(]~]]/_/^''''!)'>---***&%%===;;''!!!',;;-*=*&%$###@@+@@@@#@#$$%;)~~'''!^[:39ltwwwBHBAyBGIHIKIEEIMNKHEHMNPOOPQQPOONOOOMMMNNOOOOOONNNMKHHEHIIKMNMMKKIEwpptAEIKMKKKKKEBHKNOOOOPPPQQQRRRQQPOONNNNNMNNNNNNNMMMMMNNMMMKHEBwtolootwBEApf",
+"iilifc9|~)',-==;-,)<3599953|<<<_/~]{]//]!)!!)]'-*********=*;;;,',!'';;;=*&%&$$####@@@@#####$$%='~~!'']^^|39ipwwwBHEAACGGGHKIEEEKMIEIKNOOOOPQPONMMNOONNNNNOOOOOOOONNNKKIIKMMMNNMIEAwpliotwAHKKKKKMKEEIMOOOOOPPPPQQQRRQQPPOONNONNNNNNMNNMKMMMKMKKKIHEBAwpooptAHIEt",
+"HApf9cc9|(~)>-**=*>,~<3599971|<<<///]({{{!]]{~'-*%%%%%=**--;;;!!,';;;;=&%$$#######@@######$$&%*>)/{!!!^]|39ipwywAHHBACCCAEKIBAEIMKIHINOOOOPPONMMMMNNNNNNNOOOPPOOOOOOONMMMMMMMMMIEytpliklopwEIIIIKKKKKNOOPOOOOOOPPPPQQQQQQPPPOONONNNNNONMKKKKIKIKIIIHEEAAwptyEKMK",
+"POEl539c93</)>;==**->)~|359953||<]]]](/!!'!)~~)'-*%%%%&*=;;;;'!]!'';;=*%$$###@@@@+@@@##$$$%%&**;~</{{~][|39fowywAEHBACCzACEEEBAHKKEHIKNNMMNNMKMMMMKMMMNNNOOOPPOOOOOOONNNMMKKIIKKIEwpoikiilpwEIIHIIIIKMNOPPOOOOOOOOOOOOOOPPPPPPPOOOOONOONMKKIIEHHIIIIIIIIEBABEHKO",
+"OQNAi9555953<)>--****->)/|559553|//]](/{!'',)~),-**%%&%&%*=;''!]]'',;-*%&###@+++++++++@###%&%**;)<<_/([:|79fowAyAEHEBBBAwAEHzAEKNKEABKMNMIKIIIKMKMMMMMMNNNNOPPPONNNNONONMMKKEEIKMKHwploollopwEHHHHHHIKMNOOONNNNOOONNNNNNOOOOPPQQQPPPOPOOONMKIHEHEEEHHIIIIIHHEEBI",
+"EKONEpf5|3599|~,>-****->,~<359905|<]{(/]!'''))!'-**%%&&%===-;',!'''';-=*&$#@@++++++++++@##$$%%*;,(<_//::179flwBAAEIHEAAyyAEBAAGMOMEABHNNIHEGGHEHKKKKMKKMNNOOOOPONNNNOOONMMKIEBEIKMKEwpttppootAEHIIIHHHIKKKMMKMMNNONNMMNNNNOOOPQQQQQQPQPPOONNMKKHEEBEEEHHHHHEEAAA",
+"yBKNNHwi5||5cc5<),>----->,)<|599933<(//]{''')!)'>*%%&&**==;;>'''''>;;-=&%$$#@@@++++++++@@@##$%%=-)<_(~:[_|5cipwAABHIBBAyyxzzyzAINKAwAEKKHAzCBGCCEIKMKMKMMNNOOOOONNNNNNNNMKIHEBBEIKMKEywwwwtppwAIIIIHEEEEEEEHEEEIKMMMNNONOOOPPPPPPQQQQQQQQQQPONMIIEEBBEEBEAAAAywy",
+"ABEHKMHwi5<|3cfc3/),>>>>>>,~<|599993<</(^,>',)),>-=*&&%%==;;;','';;;=*%&$#$#@@#@@@++@+@#@@##$%%=-,/_({]^_|38cltyyzEIBxuuuuyzrrwEKIAwwAIIEAzABCzzCHIKMNNMMNOOOOOONNNNMMMNMKIHHEEBEIKMKBywwywtttwEIKIHBAAAAAAAAABBEIKKMNNOOOOPPPPQPQQQQQQQRRRRQPONKKIHEEEBBAABAywy",
+"IKIEEKNKAo9|<|9ff5<~,,>>>>,)~/|599953||<],'>>,),,>--***%*==;-''';;;;=%$$###@+@@+++@@@###$#&&%%==-,{_</^^_<38bipywAEIExuuuuxtrouAIIBwwAEIAAyBBCCCGHIKNOOOOOOOOOOOONONMKKMMKKIIHHHHIKMMKEAwtwwtpwAHKKIEAwyyAyAABBBBEEIKNNOOOPPQQQQQQQRQQRRRRSSSRQPOOOMMKKKKKIIKIEE",
+"PPOHAHOPOEtf5|3ciic|~,,>>>>,,)(|3599555|:),';',,,>>>;>---;;>;'''>;;=%&$$##@@++++++@@@@###$%==-->>)/11_::_1379fpyyAzEBtpruuttqmuAEHByyAHHBAAAyCEEGHIKMNOPPPOOOOOOOOOOMKIIIKKKKIIKKKKMNNKEwppttoptyEIIIEAywyyAABBEBBBEHKMNOOPQQQQQQQQRRRRRRRSSSSRQQQQQOOOOPOOPQPPO",
+"QQOHAEOPPOKAti99fopi9|/~)),,!!~<|3555953|~,,>,,,>--->>>,;>>>'','>-==%&$$##@@++++@@@+++@###$&&*;>')(|33}::|35cfoyyAAAAtpprpttqqpyEEByAEHIAyxAAAHEEGGHKMNOPQPPOOOPPPPONMKHHIIKKKMMMKKKMMMIypoopoolotBEHHEAwtwwAAABBBEBEIKMNOOPPQPPPQQRRRRRRSSSSSRRRRRRQQQQQQQQQRRQ",
+"QPOIBEIOPPOKBwl9cflppi9|</////<<1|5559955|~'>,,,>****->,,,,,'!!,;;;=%$$#@#@++++@##@+@++@##$&%*;-;,{<|72[[||59clwAAzAzwqqmpqtpnpwABAwyEIIAxuyABEBEEHIKKMNPQQQQPPPPPPOOONIIEEIIKKMKKKIIKKKEtllloliiotABEEBwtptwyyAABEHHHIIKMNOOOPPPQQRRRRRRSSSSSSSRRRRRRRRQRRRRRRQ",
+"QQQOMHHIOQQOHAti999iptoc5|<<<<||||33599995|/)))),>****->,,,){]]!'>;=&$$##@+++++@#@@+++@###%*->',,)/_3952}|159cityAAAywrqqqutpootyBAwwBKKEwxwzEEEEIIIHKMNOOPQQQQQQPPPPONKHAyABHIIIIIIHHIKIApolooolopwABEBAtpptwwwwyEKKIIKKMNNOOOOPQQQQQRRRSSSSSSSSRRRRRRRRRSSSSSR",
+"RRRQQPNNOQQQMBwti955fotof5|<<<<||<|||355c95|<///~)>>-;;;'',))]]{),;-*%$###@++++++++++++##$%-,~)){/|35fc94335bcipyAAAytppppwwtrotyBEAyAIMIBwAzAyEEEEECEIKMOPPPQQQQPPOOONKEAwtwyAEHIKKIHHIKIAtoopoooptyBEBAywttttttwAHIKKMMNNNNNNOOOPQQQQQRRRSSSSSSSSRSSRRSSSSSSSS",
+"SRRQQQQQQQRQOHAAwof99fptpi93<<<<|<<<<1||555||<<//~,,>>>>'')!{{]))),>>-=$##@++++......+++@$&=>!)~/<|35ff953799fiowABBAwtpppwytpptyABAwyBIIByAAyzAEAyAABEIKNNOOPQQQPPPOOMKEBytttwyBIIKKIIIIIHAtpooooopwBEEBAwtttppopwyBEIKMNNNNMMMMNOOOOPPQQQRRSSSSSSSSSSSSSSSSSSS",
+"SRQPOQQQQQQONEwAEyof99fpwwof53||11<</]//<|3||<<</~),,>,>'',){]])'',,'>-*=*%###@++....++++#$&*->,)/(_|5cc52459fiopyAAywtppptwwppptyBAwwAEEAAywyAzyywAACzEFKMOOPQQQQPPPPNMHBAwwwwwwBHIKKIIIIHEAtpooollpwAEEByttpolloptyABEIKMMMMMMMMNNNNNNOPPQQQQQRRRRRRRSSSSSSSSS",
+"RQPOKMNPQPOIyoipBBti933cowwpf95|33||<(/~/<|||<<<</~,,'>;',,)!{]),',>--;*=**%%%$##@@+++@@+#$$$&*;;,'!/|7952|70filpwBBAAwpoptwwtoptwBAwwABEBzyyyBAwuyyzyzAEKMMOPQQQQQQPPNKIBBAwtppptAEHIKIHHHEBypoopoilptABBAwpolffilptwyAABHIIKKKKMMMNMMMMNOOPPPPQPPPPPQRRRSRRRRR",
+"PPPOMKKMNNKAoc9iyHyi5<<|5fpplc53333|<(~))~/<<<<|||/),',''''',){)''>--*=%%%%$%%%%$$########$$%&*=;;''!{122}:457filtABBBAtolowwoopptyAwtyABBAxzBEAzxwywyzzFKMNOPQQQQPPPOMIHAAywpoiilptBHIHHEEEBAtppttoiiopwAAytpliffilptwyyABEHIIIIMNNMNNMMNNOOOOOPOOOOOOPPQQQQQQQ",
+"QQPONMMMNNMIAoioAIAi9|/~/|9ili933||<<~)>;'))~~/<|||/)),,,'',,,,'',>-*&%%$####$$$$$$$$%$$%%&***---;'!!!{13}[_1|85cipwAywpiijopollopwAwttyBEBAzAEAwxxuwwzBEKMNOOPPQQPPPOMIHAAwupokiilptAEHHEEEEBAwtwwtoiiloptwwtplifdgioptwyBEEHHIIMMNNNNOOOOOOOOOOOOOONNNNOOOPPQQ",
+"RQQPOMKMNNNNNHAwAAti93/~~~<9iiic53|</],;*;->>,)~/<</~),'''',,,',''>;*&$$$##@@@@@@@@#$$$$*=*->->,''!!{){<43:^_1|439iptppifccgiifiiopwwtptyABwtwzywtwuqwAAEKKNMOOPPPPPPONMIEAyutpolllootAHHHHHHEEBAAAytpliiilptttplifdfilotwABEEEHIKMMNOPPQPPOOOOOOOOONONMMMMKNOPQ",
+"PQQQOMIKMKIKNNHApof993</~)~<5fiic93</~,>**%**=->)////)),>;;;;>>';;>-*&%$##@+@@@++++@@@##$%*->>,)~{//~(/<|52:<<__|29looli9589cfccfilpwpootyAtppwxptpuqwxABEIKMOOPPQPPPOOMKICAywtqpppppptBIKIIIIIIHEBAwtpoiiilptwtpolifiilmpwABEEHIKKKMNPQQQQPPPPPOONMMMMMMMNMKKMO",
+"MNOPPONMMHBBEHEypf953|||/~))/5iolc5|/~)>**%%*&*->)///~),>>-;;;>>;;--*&&$###@+++++++++++##$$%*->,'{{////||5832}:}269ioolic977cc99cfiottllpwAtlltpqqpoqqwAyzEIKMNOOPPPOONMKKEBywttqpppoppwEIIHEHIIIIEAwwwtplilotwAAywwtppoopwyBEHHIHKKKMOQQQQPQQQQQPONMMMKMNNNNKIK",
+"MMMNOOOOOKEAyyAwtof5|<<|3<),~<9lpi9|</)>-*%%*&%*-,~//~~),,>>;;;>;;*=%%&$##@+++++++++++@###$&&*-;''''!!~~_|593321359fptpoic90dcfcfiiowwpoopAwpopplmmlqqwuxzBFKKMNOPOOOONKKKHEyttpppooolotwBEEBBEEHHEBwtttpoiilowAEEEEAAyyyyABEHIIKKIIKKNPRQQPPQRRRRQQONMKKMMNNMMM",
+"NNMKKKNOOONKEAwtttpi93|353/))/3cilf5|<~,-=*%%&%&*-,~///~)),,>;;;;;-*%%%$##@@+++++.++++@@##$&*=-;'';''''')/|3|<<<<|39ipppoic9cfifillpwAwpotwywtpolikinuuwxzAEIKNNOOOOOONKKIEBytuoolololooptwBBAABBBAAwpllllifcflpwyAAAAABBABEEIIKMMMMKMNPQRQQPQQRSSSSRQPONNMMNMMM",
+"MMMIIEEHINOPPNHyttwwpi9995|///|39ilf5|/)-*%%*%$$$%-,~~~)~)),,>>;;;-*%%%%$#@@@++++...++@###$&%=*;;;;;;;''''/<<~~!){/|5ioolifc9cffiilpyEBwttyEEywpiikgjquwtxzFIKMNOOONONMKHEBAytplkilllollloptyAywwwywwtoifiif999cilptttttwwwAABEIIKKMKKNOQQRQQQQRSSSSSSSRQPPONKKK",
+"KKIHHHBBABIMOPOIBAABAwoc53|<<<<|39ilc3<~,*%%%%$###%*,,)))))),'>--;-*=%&%%$$#@@+++++++@@###&%%*;;;;;;;;;;;')/({''''!{_5fifc95599ccciltAEAwtwEIHAyoiigjiqqtwzDEKKMMONNNNKIEBAxwtqplkllllliililpwwwtptttpplififc55599floooppppwyyAABEEEIIIMNOQQQQQQSSSSSSSSSSRQQONM",
+"OMKHHIEEBABEIMMMMIHHEBwoc5|<<<<|35fiic|/)>%$%*%####&=>>>,)))),,>>--*=%&%$$$##@+++..+@@####&%&*;;;;;;;;;;;;'!~{';;;''{<0cc953|35959cciwBBwptAIIEAtligdemmtwzAEIIMMMNNNNKIEAyuuppqollifeffiiiiiptwtppppppoliffc955555cilloppptwwyAyyAAAEEHIKMOPPPPQSSSSSSSSSSSRRQP",
+"QPNKIIHIIEEEEEEHIKMMKIEyoc53|||5559fol9|/)-%%%%$#@@#%*-->,,))),,>>>-*%&$#####@+++..+++##@#&%&*;*;;;;;;;;;;;')),---->,~|9995||||595359lyBypptBIEAtiebdemmquxAEHIMMMMMMMKIEAAuqomqpomiicccfffgilpttppopppooifffc9553359filooppptvwywyyyABEHHIMOPPPPQRRRSSSSSSSSSRR",
+"RQPNIHEHHEEEEBAyAEIMNMMKApic5339c95cotl9|/,-%%*%#@@##%***-,)))),,>>-*%$########+++++++@#@$&%*******;=;;;;;;->),;===->,~39995||<395259fpAypopyEBypicedeempvuAEHIKMMKMKMKIECAwuqmmoppoifccccffiilpttppoooooiifffc9533599fillopptwwwwwwxwyAAEEHKNOOOPQQQQQQQPPPPQQR",
+"PPPOMIIEBAwAAywwttyEKMNNNIAtlc9cfc9cltti5<)>*%%*%#@@#$%%%*-,))),,,;=*%%$###@###@+@+@+@###$%&***=*&%&**==;=*==',>-*%*=>)<5c905||335359flwytolpwwppifeggjmpqvxDHIIKKKKKKKIECAysrnjoppuplfccccfilllppppooollliifffc9555559cilopttwwwwwwwxwwyyCEIIMNOOPQQQQPONMMMNNO",
+"NNNONNMKHAwwttttpoopwBIMNNNMHAtppoolotwo9|~,-***%$#@@#%%%%*>,,,,,,>=*%%$$###@##@@@@@@##@#$%&***%%%%%%&*=**&%%-,,>****->{3cc999535559ccfowwoifooppofffgjmmrsuDFHIIIKKKIIICCAvurnkmnpppolfcccfloolloppplllliiifffcc9557550cfipptttwwwwwyywwyABBHIMNNPPQQQPOMKKKKKK",
+"HEHIMNOONKEAytpoliiffipBKMOOOOMIHEAywAytf5/)>>**%%##@#$%$$%*->,,,,>-*%&%$$$#@@@#@@@@+###$&%&****%%%%%%**%&%%&&;'>==&&->,<9ffffc55555599fopofdilptpihhgjmmruuDDEEIIIIIIIHCByvqqmnmolilllifccfioooooooooliiiffffcc9955333599fiopppptttwwyyyyyAAEEIKMOPPPPPONMKKIHE",
+"BAAABHMOOONKIEwoifcc99cltBINOOONMKIHBBAyo9|~),-*%%$###$%$$$%*->,,,,>-*&%%$$#@@@@##@@####&&%%******%%%**&%%%&&=*>,,-;;->)<5iiiif9333||425fomgc9ipwtibegemmrtuxDBFEIIHHHIHEAyvuqqnmoifgiiifffffioppolooooliifffcc95595533335afilooooppppwwxwyAAAEHIKNOPPPPONNMKKHE",
+"BAwwwyAIMNOOOMHwof999599flpwEKNMKIHHBBAyti5|/~)>-*%%$$%%%%$%*->,)),,>=*%%$#@@@@########$&%%****%******&%%&==***>)~),>,'!/|ciffc51<<|_<139ipld0fowwocfgjmmrsuuxDBEEEHHHIHHBDvtqropomfddgfifcccfiopololloliifcc9955555553337adfjilllllppptwwwwzzBBEIINOOOOOONMKIII",
+"CytqpptABHIKMMKEwof953599ccfowBEEAwwwwwwti953</)>-*%%%%**%%%*=->))),>-;*%$$####$##$$$$$$&%&****===*===**=;--**->)//)>>>,)/|9c995_(<<<<122cloidcitypffhhmmrvvsuxDBEEEHHHIIEDyuusppmlfc0cdfffc99cioooolllliifc99553355557735a0behiikilooooputwAyAAEEJMNNNOOONMKIKI",
+"BuuomorpwwwyABEEBypf5||39999cipwytpoooooi9355|<~)>-%%%%***%%%=->,))),,>-*%&$$$%%%$$&&&$%%*=*--*=--=-;-*=;--*=**=-,)'-*-->,~|9995<((<</(_25foofcfowtihkjmmrnorquwDDEBEGHIIEEAwuutppolcb0ddffcc99cfilliiiiiifcc95533559957756d0c9hhiilionopupwAAyAECGIMMNNOOOMKIIE",
+"AuqjjkhinloooptyBBypf5||35559clpwwplifc99|<|3|/~~)>-*%****%%$&*=>>,,,,>>-*%%%%%%%$$&&&%%&*****=*==*=**&&*%%&&%%&%=>';%%**>)/3999|_(__<(_}39loifciopifkljmmponrruuABBBBEHHHEBywxttpoofb99cffifc9059cffffififfc955333599990999ddcchgeiijonlrqptxxzECCHIMNNNNNOMKIH",
+"ByqmjggeebbcccipwyAytof5553335clpwwtof95|</<||~))))>*%%*-*=&%%%**->>>>---=&$$$$$$$#$$$$%&%&*%%&&&&&&%$$$$$#$&$###$*;;*&%%=;,<5995|_(<</_}}6foliccioiifkljmmkonvuuxABBBEEEEEEAwwwwppolfccdffffc9533399cfffiiiffc9955599c90ccccc9gdhggijomnrqqpxxABCCEIKNNMNNNNMKI",
+"HAuqjhgba663239flpttyAwoic5|||5citBBypf93|<<|<~',,,>-*%*---*&%%%**---;-***&$#######$###$$$%%%%$$$&&$$#@####$####@@#%=*%$#$&>)<5593<_<<</}}29iplfccffcfilonqmmppssxwABABEEEEEzyywwwtpolfffcccdc99533359ccfiiiiffc995355999c988090cciiilnoorqqpxxAACCHFIKNNMMNNNMK",
+"KEAuqjjg8664}||59fiopyBBytl93||39iwBBtlf953|3|/),,,>-*%%=>,>-*******--**=%%$############&%&%%%$$$$#$###@#######@@@@#%=&$#$&=>)|5953:_<|<}}}5fooic9c9bcijmolqmmppuwxAABABEEEEAyywwwttpoieccdcc999997333599ffffffcc99535599ccc88a99cdhfilonorqpxxAACEHIKMMMNMMNNMM",
+"KIEAuqjg8a24:<<<|359ipyBEEAti93339ipwtplic533|</~)>>-**%*-,,>=*-*==**=***=%$$##########$$%&%&%$$$$###@@#####@@@+++@@$&=%$$&&->~|5954||3|22239ipoicc9acfiooolqpqttwwyAABABEEEAyywwttpplkicccfc99999553|3559ccffiiiffc99cccjiiffcccdchiklooorqtxwyyBCEKKNNMMNMMNNM",
+"MKKEwuigaa21:_(///<|9ipwAEIHAof5535ciptpoic533|</)>>--*%&=>,,---*=***=*****%$##@@######$$%%%%%&$$####@@@####@+++..+@#$==&$$&*-'<35553|3352226fotoifccciioooolpmmttwyAABEEEEEAyxtttqoooiiifcfc995999955559cffiloooooliiiiilloliiifiilloopppttwyxAABCHIKNNNNMNMMMN",
+"MMMIExuke861[_(~////|9fowAEIHAtf95559ipttpif953||~)>-*****-,,,-*=&%%%=***--*%$$#@@#######$&=&%%$$###@@@#####@@++..+@@#%;*%%&*-'~|599955555559cittoieciilioomlnmopttwyABEEEEBAwtprrppoookggf9c999999cccfcciiiilppppppoollliiiiiiiiillooopttwyyAAEEEHIFMNNONMMNMMN",
+"NKMMIEymib64_[]{//(/||5iptyBEHBtic999cipttpiffc95|/)>**%%%*-,,>**%%%$&%**---**%$#######$#$&**=%&$###@@@@@##@@@@++++++#$=;-*==-')<59ff99999599cfowtlfffiiilooonlomttpxwAAEBBBAytpqqpqplllgccdfcccffiiioliiiiilillloooolllliicddccfgiillloppswyAAEEIIKMNOOPPONNNMM",
+"MKKMMKEwoia61[]/<||||||9fiopyBEBwoicccflppoiffffc95<)--***=-,),-*%%$$&%%**----*%$###$####$&%%**%$$#@@@@#@#####@+++++@#$*;,>>;>,)/39fifcc999599cipwplfifffilooolimmoouutwyADAAAywtrrmmmiiiggdgiiilpptpppliiiiiiifiilllllooolic9099cfigiiknopuwzzBEHIKMNOOPPPPOONN",
+"ONKMMKIBwof94}<_|33|</<|59cfipwAAytpicfilolfcccccc9|~,>>>>>>,~~>-=%%&$$%%*->->--*%$$&%$$$$$%****%&&####@###$$###@@@@@$$=>)))>,,)~|5fiifc9999559fottpliiffcilllkikkglnrpuuyAAAAywwpqrnliiiilikllmopwAywtplliifififiilllloooolic0899dffiijnlrutxxAEEGKMMNOPPPPPOOO",
+"OONMMMKIEtic62<_|33</~)~<|5999fotyAAtlilopoi95999553<)>>>,,>,)~)>-*%&%%%%-->>>>>-;**&**&&%%*;**=*&&%%$&$$$%%%%$######$%%=,~{),,,)<3ciiiifccc999ciottoifc988fffgdhgggmlrquwAAABAwturpqomoploollllopwyyttptplliiffffffiiillliiifd99999fiijnloqtxwABEGILMNNOPPPPPOP",
+"ONMKKKMMKEtl92__<|3</~))~/<35599iotAAwtppttoc5555555|~>->,,,,,)~,-**&%%%%*->->>>>>------=*=--*****&%%&&$%$%**%%$#####$%&&-)//),)~/|0ioooiiffc95559iolfc986a9cfegfbggijmmquyAAAAwuqquuttttpoooiiiilopttttttpplic99999ccfiiifcfccdc800cffilloqtxxACBCIKKNOOPPPOPOO",
+"ONMKJHHIKIEyoc3|/_|<</{~~~~/|5999cipwAAAyywti53555555|~,,)),,,)~)>-&&%%$$%**;->>>>>-----------***==%%&&$$$%***%%$$$$$%*=*-,/</~~/<|5cioolic995|||19fic999626bcfgdbgggiinmqwyAyyytpquttwttuppllifffiloopttwttplf955599ccffffc9c9cc990dccfjjmqsuuyCEEHFMMOOPPQPOPO",
+"OOMKHEEEEEHEypf93|||</~~/////|5999ciotwBEEBwo9||333333|/~~~),,,~~)>-==%%%&&&*-->>>>>--->>>>>>-;--=*%%&$%$$%*---=%%%%%*--->,)<<<//~(_|5cffc54|41_<||9cc95762aaccfghdggnlqqqpwwyyyywwututpppppolliiccfiilopttttpofc599ccfffccccc99cccccecfijoqrusyCCBFIMMOOOQQQPOP",
+"NNMMHEBAwABBAwoi9343|<///|||<|359cciloptBIIBwl9||||||||</)~),>>,~~,>==*%%%%*-->>,,,,,>>>;,,>>>>>---***%*%%*-->--**&%%**=**->,~/~)!!{{/|9c953||1____|7cc977626bcfgdfkkkmrrqqtwyyAAAywtuqpmmloooliifcccfffilopptttplfcccfffcccccc9ccddgfeiliqqpuyyBBGHILMOOOPQQPPO",
+"NMKKHEAywwwyAywoc53353|<|553|3359fflliiltBHHEyo933333||</)),,;*-,),>=&%%%%%%*-->>,,,,,,,>>>>>>>---**=*%%%$$%**%%%%####$&&%%&-,)~)'''')/|9993|<<<((/(<7c9056266dcfghgkkooqrqtwyABBAAywtpommlkiiiiffcc99ccfiiiiopwyytlfccfccc99ccccccfiiiiloqppxAEEGFFIMMNOOPPPPOO",
+"OLIFCBAxtpptwAAtl9533533599533359fiiliiopyAEEBApc99993||</),,;**>,,>&$######$%**-->-----;--*=-***&%%%&$$#####$$#$###@##$$$&&*;>!!!''>,){|553|<<<_({~(|9c90566689ffgfkknlqrqtyBEEBBAywwpolkkfggccfcfccc9cffffffipwAAwpiffc9999c9cccfgifilloqpxwBHHHIFILNNOPPPQPOO",
+"OLIFAAyurmmoptAytof5||||59fccc99cciiloopptABAABApifff53||<~),>**-,,>*$$#@@####%%**=------=*%**%%%&$##$###@@@#######@@#####&%%&*>!!';-;''~|553|<<__{{{(|9cc0866889fgikklinnqtABEEEEAAywtrllidd90999cfiiifffcc9cffiotwwtoif9999c9ccccfiiilinmpuwAEIIKKMMONOPPPQPPO",
+"OLLFBvwqrmieiiptwwplc5|||39fiopppiiiloopppwBAAABAplii9533|/))>--;>>>-&#@#@@@@@#$%**-----;=&%%&%%%$######@++++@@##@@++@@#@#$$&%%-'!!>;;;-,~|553|<__({]{_49cc066aa0fkifkglnrptyABEEBBBAAwpolif9999099ccffffffc99c9ccfiotttoi999c9dccffiiilnnmruuAEHIMMNMOOOPPQQPPO",
+"OMLFFzvqnmebb9ciotttoi953359itHMHwtpollollpAEBBEBwoif95595<~))>>-->>-&#@@+++++@#$$%*----*=&%$$&$##@@@@@@@.+++++@@@@+@@##@##$&%==;'!,';--;,~|5531<_</{](/38cc966a8fkkikkmrputwyyABBEEBAywpoiffc9c9995559cffiffcc99599cipwtpicc9ccccgiiiioooqpuuzBEGKMNOOOPPPQQQPO",
+"OOLIFzvtqkeb96259iopoic99599ftINIAwwtpoollowBEHEEAtlf955993<//~),->>-*$#@@@++++@##$%******&&$$$####@+++++....+++@@@++@##@##$&%==;;'),'-=->,~|553|<|<_(~][20cc969afgkimioptuuwwwyzAAAAAwwtpoifffc995573559cfiiifc955599flppoliccccgfiiiooopqppuyyBGFKNNOOPPPQQQPO",
+"OOMKFzzwqkij96}||5ciif93359cipEKEtooppttpoopwAEEEBwpif99cf93|<</),>>--&$#@@@++++@##%%*****=&$$#$$##@@++++++.+.++@@@@#@##@$#$%%=;;;;,',>--=;,(|5353|1<_]/_}29cc98ccfiommpptuuwwwxwyxwxwwwttpolifcc9533333559ciilic953599cfloollicccfiiiiolpqqpuuyACHKNNOOPPQQQQPP",
+"OONMKCByumjjc9}<_|39cc9|<<39flAIBpc9cipwwtppttwyAAytoifffi93|<<//))>--*&##@@+++++@#$$%**%%%*&$$$$##@@++++.+++++++@@@#####$$&%==;;;;;,,,>===;,(|35533|1_/(:}5cffccbfipppupsuuwwwywwwwtpptttppolifc99533333559cfilli955559cfiilooliiiiiiillloqrwuyCCEKMNOPQPQQQQPP",
+"OOOOKHByxrljc921_/_|5993<//|5cpBEtc335cltwtttppoptwwtoiiff93|<////~,-***$##@+++++@##$%%**%%*&&$$$###@@+++.+++++++++@#####$$&%==;;;;=>>,,-==*-,~|35577|1</[:49fiffbcgouutppqqswwywwwwttppppqpolliifc953333355599fllifc979cdffiopppoiiiiiilloqpwuyAACIKNOOQQQQQQQP",
+"POOOKHBAupojeb52<(/<<399|<~/|9iwEAl9599cilptwwtliiottpifc95||</~/</)-=***$#@++++++@#$%%**%%%=&%$#$##@@@++++++++++++@#$###$$&%=;;;;==;->,';***-,~|555733||}:15ciilfffltutppqptvwwttttttpppoomoliiiifc955333355559fillif9909ccflottpoolnlmlloqqpuyyACFKMNOPQRQQQQP",
+"QOONMICwurmjeb564|(]{<355|/~~3fpABtfcffiiilopwwtiffiptoic93<//(~)~/)>-****$#@++++++#$$%%%%%%&&%$$##@@@@++++++++++++#####&%$%==;;;;===*->,'-***-,/|55557552}|38dfllikipqqppqpttttttttttppppollliiiiiffc953333353359filiic9009cflpttpppppppoooppxuyBCFLNNOOQQRQQQP",
+"POONMICzqlkfa85434_~{~<355|~~/5iwAwicfltwpolipwwtlffiptpof5|/~/~,,)~)>*&**%##@+++.+@#$$%%%%%%&&%$##@@@@+++++++++++@@@#$$&%&&=;;;;;===**->>>-***-,/|59599c96|458ciloooqmpoqqpsttttttttttpppooliiiffiiifcc955333333559fiilic909cloptwtwwwwtpppptwwABGHKMNOPQQQRQQQ",
+"QOONMICAwqkbb67}<1|</~~/|33|//<9lttoffoyBAwtpopwywplilptwpi9<~~~),')~,-*&=*%#@+++..+#$$$%%%*%***%$###@@@++++++++++@@###$&%&*=;;;;;;===**=->>-***-,~|5599cfc556a8flpttpmooqqpppputttttttpppooomiffccfffiic995553335599cflolifcdiotwABEEEAwwtwwwAABEHIMMOPPQQQRRRQ",
+"QPOONLEztqjhb64[_/(/</~~/|53|//|9iopifitABEEBwtwyywtolopwwti5<~~),,,)),**&=%$#@++..+@#$$$%%%%&&*%%###@##+++++++++@@@###$&%*;=;;;;;;;==**=*->>--*-;,/|599cfid9a66cipwwwppopqqprpuuttttpttpppoollifcccccffiiffc955755999cfloppollotyBHIKIEAywwyAEBHIIIMNOPPQQQRRRQ",
+"QQPOOMIBxqjhb62_[{{{~//~~/|53|<<|5cooiipyEIKIHAywywwtpllpttof3/~)),>,))>*%%*%#@++..+@#$$$$%***&**%$#@###@++.+++++@@@###&*=-;;;;;;;;;==***==->>>-*;;,(|599cfifc66bfopwwtttuqmopppoppttptttppoooliiifcccfffiillfc99999cccfilppttpppwAEIIIHEAyyyAAEHHIKNNOOQQRRRRRR",
+"RQQPONMJAulkb861[({'!)~~~~<|33|<||5fiiilwBHHBAAAAAywwtplllopoc|/~/~,,'~)>*%%%&@++..++#$$#$%%*=&***%#@@##@@@+++++@@@####&%=-;';';;;;;;-=**&==->>>;;>>)/|55ccggf99ccimpwwywtpmmmponoppptpttpppoooiiiifffiiiiloolifcdf9ccffiiilpttttwwABEEEEEBAAyAEHHIKNNOOQQRRRRSS",
+"RRQPOONKHzrmf861[({!,,,)))~<3553|||5cfiltAAwppttyBAywwwplilptpf3|</{))~~)-*%%&$@++++@####$$%**=****&#@###@@++++@@@@##@#$%=*;'''';;;;;-=***===->,';-;''(|59ccgffcfehklptywtppopmmnnoooppttpppppolliiiiiiilllooooliiiffcdcff9bfltwyyyyyAABBEEEECAEBHKKMNOOQQRRRRSS",
+"SRQQOOOMKHAulia7}_({),,,,))~<3995|||39fopwyplillpwBAyyyypliowwtic53|//~/~,-&%&%#@++@@@####$%**=****%#@@##@@@+++@@@@##@#$%*;;''!!';;;;;=;***===>',';-''!{|99cfefilifgjmqttwtppoomlnoopopppttppppoooooliiiiiiopppooolifc999d99ciotwAAywyAAAEEIIHEGBEIIIMNOPPQRRRSS",
+"SRRQQONMKIBysric0a|_~)',',,,)<3995|||3clptwtoiffiptwAyyAytllpwywpi953|<//~>*%&%%#@@@@@@##$$%*-*****&&####@@@@++@@@###@$%%*=;''^^!'';;;=;;***===;',,',''{_26cifiopplkiimoppppololkinoopoppppttpppppoliifffffoptpopmlic97759a99cfiotyyyywwyABBEEHHEEHEHKMNOPPQQRRS",
+"RRQQPONMKIEywpolfc93|(~))',),~<3999|||5fllopplc99foptwwyAytpopwwwtof99|<<<)-%$$%$#@@@++@##$$%*=-***=&$@##@@@@@@@@@####$%&*=;;'^^^!'';;;;;****--;>,,!'''!{:29fiipptpojiiimmopooiiikiolooppppptttttpoliififfiottplifcc99079909099dioptwttttyAABEEIHHHEGKKNNOPQQRRR",
+"RRQPPOMLIIEAwtolffc953|<~))))){<59c93<|9fffillc559fioptwyAywwwwwwwwpic53||/,*%$$%$#@@++@##$$%==--=*=*$####@@@@@@@@####$%&*=;;'!]^^!,';;;;;;**----;,!{!!)^]16bflppwwplkifhfllmlliiggilloppppttwwwtpoiiiiiiilpwtlfc055999c05508888cfilpppptwAABEEIIKIIHKMMNOPQQQRR",
+"RRQQONMFGEEAwppigcdc9953</~~/~~/|5cc9||39c9cfif9539ciilptyAABBAywtttplfc5|<~,*&&%%%#+++@#$$%%&=---*&=%####@@@@@@@@####$$%*-;'>!!!^^!''';;;;;*----;>'{]{{^]_16cipptwtpokddccfililfffgfilmopttwwwttpoliiiiloottoic933375599009d909ccfflopttwyABEHHIKKMKKMMNOOPQQRR",
+"RRQQPONLEBAxtplfifcc99554|<</<//<|5cc93|39999fif53359fiilpwAEEEAywttppooi9|/)>%&%%%$@++@##$%%&*---*&=%$###@@@@@@@@@####$%&*=;;!!{!]^!'''';;;;;;;;;;'!~]:^(:228ioopptpplgcd09ciiiiffddfilmptwwwtttpolliilppptpic9553|433599ccccccccfcilptwyyAEHKIKKNNNMMNOOPPQRRR",
+"RRRQPONMHCAxtnied9999555543||||<</|5ccc533599cii93||59fffiotAEHEBAywtpppof3/~,-&%%%$#@+@##$%&&*;>--&&%%###@@@@@@@+@@####$%*=;;'!{!!^{{!!''';;;;;;;'',!{[::_}26biopppppolgd00a9fffiffddfilpttwwtttpooolopttttoic9554|}1|35dfcfffeffgilopwAEEEIMNOOOOPOOPOOPQQRQRR",
+"SRRQQPNMKECxsqib8967575555533333|<<|59fc53599ciof5|||5cfiffioyEEEEBywtpoli9</)>**%$$$#@@#$$&&**----=&%%$##@@@@++++@@@###$%&%=;;!!{{!^^{!)''''';;'''''']^:11}26bbeiloooooifd0786ddgfffddiiopppptttppppopttttpofc95511<|13559cfilliloptwyBEKMNOPQQQQQRQQQQQQQQRRRS",
+"SSRRQQOONIHBytpkb85633755555337553|<|3cc9559ccili93<|5cfili99itAEHIBAwtplic5|~,--%%$$$###$$&&**-;--=&%%&##@@@+++++++@@###$%&==;;!!{{{]^^!!!''''''''''!^^_162668abcfilllliic9776500dfifgillliopptttttpptppttplfc953|||3543559ilptttttwAAEIKNOPQQQQQQRRRRRRRQRRRRS",
+"SSRRRQPONKIEAywplf9a4773334333335553||599559cfiiic3<<3ciilic59fowBEEAywtoic95<~,;*%$%%%%$$&$%%*----==%%%$#@@+++++++++@@#@#$%%=;;'!!{{(^^^{!{{!)'''''^^^(_}2aaab888bffiiiiiic9725500cfiiiiifiiloppttwwwtppppoic9555333555559fiottwttwyBEHIKKNOPPPPOPPPPQQQQQQQRRR",
+"SSRRQQQOONKHBAAwtoi995573||||33||3555359c95559fiif9|<3ciloif9559fpyBBAwtplc95|/~,>*%%***%&&$%%*=----=%%%$##++++++.++++@@#@#%&%=;;!!{{{({^^^^({{!!'!^^^^(_}}26cba8aa99cfjffffc9732357ciiiiifffiilpptwywtpptplf995555595999ffiiloptwwyAEHHEEEEIKMMMKMNOOPPQQQQQQRR",
+"SSRRQQQPONKKEAywytqlf9053<<_<<||||335359cc95359fiif9339ciolic54|39ltAAyytpi95|</~)>*%*->>*&%%***-->>==%%&#@++++....++++@##@#$&%=;;!!{{((({^^^[[[^^^{^{(_}}}28bb98aa868accffccc9743570ciifffffiiloppwwttttwpic953559999cfiiiffioptABBBBAywyyyAEHKKMKNOPPPQQRQQQRR",
+"SSSSRRQQPOMMIBwwtttplc997|<<(//<<|||33359ffc5339ilif9559ciiif951<|9ityyywtpi93<//~)>**->>-*%%%***;>>;=%$$#++++.+.....+++@##@#$%==;;!{{((_(((^^^^^[^_[(__}}2268ca698a6a6689cccfc976357ccccfffffiilptttpptwwpic95359cffiiifccciotwAAAywwwwtwyABEIMNOOPPQQQRRSSSRSS",
+"SSSSSSSRQPONKHAwpppoifd0554|_/(/~/<||33359fic535cilifc959cccfc9|<<|5fptywtplf93</~),>--;>>-****=*->>;=%#$#@++..+++....+++@#@@#$%=;;'!{{(____(((__1111122}}}66866a6aa2}}}65999cc9d959999999cfffiilptpooptwwpic9559cfilifc99flpwyAywtppwyAAABEHIMNOPQQQQQQRSSSSSSS",
+"SSSSSSSSRQPONKHBwtpoifc9577553<<{//<||33|39iif959fiiffc99959cc93<</<3cottpplif93<~','>;-;>>>-;;***->>;%$#@@@...++++....++++@@#$&%=;'!!{___}}__[___1122222266a22226662}[:[2355999cc99d95559ccffiioppollpttplifc9ccfiiic999ipwAytppppttyEHIIHEEEIKMOOPQQPQQRSSSSSS",
+"SSSSSSSSRQQQPONKHEAyplifd5559553|<///<||||39iif999cfiiccc9559995|///<3clopoiiif9|~,>>>--;-->>>>*=*;>>;%$#@@+............+.++@@#$&%=;'!{___}}}}}}}}}2226a686a222222662}}:[:}225799cccd9955799cfilopplilpppliifffiillc535clwAAypllotwyyBEIIHEAAyBEKMNOPPPPQRRSSSSS",
+"SSSSRRRRRQQQQQQPPNKKEAwtlf95555953||<</|||||9flic99ciiffcc553555|<</<<|9iooliffc5<{,;>-->>>->,,>**->>;*$#@@@+..............+@@@#$&%=;'!(__}}}}2}}}}}}2268aa86622}22222}[:[[}}32399dff99555599cflppolilopliffffiopof5|3fpABBytooptyAAyAAyAABAAAEIMNOOPPPPPQQRSSSS",
+"SSSSRRQQQQQQQQQQQQPOOMIEypic53|33|33||<|3|||39ilfc9cfiiffc553553|<<<///|9iloifc995|~,>->>>>>>),,--->>-*&#@@+++..............+@+@#$&=;>'!(}}}}2222222226866626662222}1}}}1::}}[}|300c9999955999fipolliiooiffffiiooi935cpAEAywtttwwyyytppptAEHIIMMNNNNNOPPPPQQRRSS",
+"RRRRRQQPPPPPPQQQQQQQPOOMIEwpic53|<<|33335955|39fifccfiliic93|333|<<//~~/|9iooi955993/),>,,'>,,),,--;>-*%#@@+++...............++@@#$%=;'!^:}}22886666666666626662222}}}}:_:::__::|3795999c9999cfloliiilooiffifillf999coAEBwtwwwwwwwtoiiopAEKMNNNMKIIIKKNOOPPQQQRR",
+"RQQQQQPOONNNMNNOPPPPOOOOOMIEAwpi9|/<||3335993335cfccfiooli953|<|<//~~~~~/|9ioic535cc5<~)))),)!!)'>--;-=%#@+++.................++@@#$%=;']{_}}2866666666666}222222222}}::::<:}[::}|3335799999cciiiiifiioliiiiiiic559coAHEAttwwwttpliffotAHKMNNMMIHBEEEHKMNOPPPQQR",
+"QQQQQQPNNMKKIHIKMMMKMKMOONNMKKIApc3<<<|||35555335cfccflopoic9|//~~~)))~//<39iif9335995|/~~{)){!)),>---*%$@++++.......... .. ...++@#$&*=;'^]_}}866666666666}}22222221}1[_::_:}}:_||11|439999cffiliiiffilliiilllf559ciwEHBwwwtttplfcciowBHIKKIHEHEBABAAEEIMNOPPQQQ",
+"QQQPPPONNMKIIHHHHIEBBABIMMMMNNNMEti93<///<<|333||5cfcfioppoic3/~)))))))/<<|39cfc93335995|<//({~{)),>;--%$#++++...... .  . .  ..+++@#$&*;;'](_}266666666666}}222}22}}[:[::[[/}||:|}1<<||55999filliifffilifiloplc59fltAEAwtwtpptlc79itAHKHHEByyABABABAABEIKMOPPQQQ",
+"QPPOOOMMMKKIIHHEEHEAAwtwABBEIMNNMHyoc5|////<<||||59cfffloppoi93/!,,)),,)<<<<|59c953||5cc93|<</{~{)),'>-*$#++++......     . . ...++@@#%*;;'!^(_}26666666666}}222}22}[::::]]]:<<||334_|||33559filliifcfiiifioppicciopAAyttptpttof50fpBIMKEEAwptwyyAACBABBHIKNOPQQQ",
+"OOOONKKIIHEEBBCBAEBAAwttppptwBHKKIEwpi93|///<<|3359ffffiloppoi9|/))))),,)/(//<35995335cffc95|</{{{))',-*$$@+++..... .    .     ..+@@@$%*;;'^^(}}2666666662}}222}}2}[::^^]]]::::}363||||1|355cilliifffiiiilopiccipwAEytppppptpi99itBHKMKHAwpoppwwyAEEBEBEHHKNOPPQ",
+"OONNNKIHBByAwwwwwwwwwwwtpllllotAEHHBytoic5|<<<|||35fiiffiiopplf5|/~)))),>,)~~~/<|595559fiifc93</{{)))),-%$@@++....          .  ...+@@#$&*;;'^^_}}266666662}}222}22}[[::^^]::_<:<3331|311|3379iiliifffllilooofcclwBHEwppoloppiccitEHHKKHAwpoooutwyyECBEBEGCILMOOP",
+"PONMKKIHBAxxtqpoolooooptpolliiiotABEEAywpoi93|<|||59iiliiiilllic5|<~))),>-',))))~<359999fllif93</~)''),>*%@@++...               ..++#@&%&=;',^{_}}26666a62}}222222}[[::^:::[<:::||1|}33|35359fiiifffioooppplfcitBHIBtpollpoid9kwEEEEEAwppoooptwwwwyABHEECCFIKNOP",
+"OONMHIIEBxxppmlhjffffgfloomlliffiotwAABAAwtpf53||350ciopifcfiiiic5|</~),>---,,),,)/|59555fioif93</~),),,-*#@++...                ..+@##&%=;''!^(_[}66666666226222a642}}}<<::_::}|1_<:|1|3557cfiiffffioopptplffoAHIHypollppi95fpEHBywtpolproppwywttuzEHIECCFFKNOO",
+"NNMIGEHEEyzsqmleebbc9909gfiiliiffiilopwABBAyplf9597559iolc99fiillf5|</~)>>-;->,,,,)~|55559fillf95_/!)),>>-$#++...             ......+###&%*;''^](_}26666666889886067222}}::::]]:}<(/:_<||3559fffccccioopptpiioyIKKEtoliotpf59lAIBytploloprpwyytpnquzEEHHEEFIKNOO",
+"MMMIHEEEAAAtqqlgeba87976809cgiifffiffilpwBEBAtplic95439cfc99cfioolc5|</~,>>>---,,,,)/|3559cfiolic5<{~),>--*$@+....               ....+#@#%=*;''^^_}}}6a6a99899889b99652|}1:_:]:<<_(//<_|||359fffcc99flopppliltEMMKApifipti95iwHIAtpopptwwwwAzwpnnquAEAEEJHIFKNNO",
+"KIHHHHBBAAwtpooiica8774263779ccccfcffccfltAABAwtof9533|599ccciiopoi95|</),>>>>>',)),)/|399cfioooic5|<~,>--*%$@+++...              ...+@##&%=;;''^(_[26a688aa99cccfg99522|||<:<:||<__/__|<||59cfc9999floppoiioAKNMEwlfclto939oAIEwpppwBBBAABAwppnquwEBAABGKKKKLNM",
+"KICEHHBByAwwqroolfda573}24347759999cc989ciowyAAwplf957||359ciiloooic93||/),>>,>>>>,)))/<59cilooolic93<),>-**%$@++..               ..++@##$&%*;;'^^{[}}6689aaabbcfif9956333|||||4|||<|_<|<||79ccc9959flopoiilpEMNIApiffpti53fpAHEwppwEIIEBAytuprrtxAEACzCCKMMNMMK",
+"FECBEEEAyywtupoooigca74}}1|14335355999999dgltwyAwpoif973359cffilooic9533<~!,>,,>-->,))~/|9cflllliiif9|/'>-*%%%#@+..               ..+@+@##$%=*;',^{_[26688a98999cif995532533}||||<|<1__|||359ccc9959flopoiiowHMIBtliflwwf90ltwBEAttAEEEAywtpqtttwyABAAAzBFLMNNKF",
+"IBCCCBEAAwwuupppplifc77}}211114|33369909999ciptyAywtoof95599999filif9533|</~,,,,>-->)///<39ciiiiifffc5<),>*%$$##@+..              ...++#@##&%*;;,!](}}2aaa66809a9fic9966333}:1<|1:<___||||3599999559flopliotBIIBwoffipAtf9foptABAywwywttttptpttwuuAAEBCCGHKMOOMK",
+"KCCBEBEBEAywwwtppoiie97322|1||1|||||7589999cfiotyAAAwtpic55555359ffc53||||<<~~),>>->)/<||359fiiffcccc9|<~,>%$#$###+...             ...++##$$&=-;'!^[_[266622aa86dcec9965334|1_<|}:<___|<||3399995559flopllpAEIEypifflwApcclooptyywtpojnoptttpspuuxyAEEGEIKMOOOON",
+"MIJEEEHEIHEAAAwwtpollc9722|1|11<||_<|2695099cfiopyABAytof953333|39c953||||||</),>>--,~/|35999cfcc9955553<~,-*%$#$$$#@@..            ..+@@$%%=-;','^^(_}6662269989bb900077574|||||<|1__|<||1399995559fopplowBIIEwofcfowwlcflolloopligceiopptqttwxuAAEHIJIKMMOOOOO",
+"NMKKKKIKMMKIEEBAwtppplic96733|11<|_<<|||23350ccilpwyAAwpic53|33|||5553|<<<|||</),>->,)~<399999c99953||555|/,>*%$$$%%$@+.           ..+@#$&&**=;-;>'!{[[26622a8888dd0076777734333341|<||<|14599995555flooiowEIIEwl99fpwti9fiiiififcc9cellopqqpzyzBBEEEHHKMMNOONOO",
+"OOOONMKKMMNMIEBAypppppolie0955|1|||||<<:<<|379dggilpwAAwpi933353|<|33||<//<||||/)>>>,)~<|59c99c99553||3595|/,>-%$####@+.         ..++@@###$&%=*-;;,!!([[226aa88d00d077424633333574||||||||4599955339flolipyEHHBti99fpwoc5cff999ccdccffijoomptAAABBEBCCILLMNOONNO",
+"NOONKIHHIIMNKHAAypolloollfe9090334|||<<_<::|25ciiifiptyAytlc55995|<|||<<~~~<|33|/),>>,)/<|3599c995553|||555|/)-%$#@@@@+..     ......+++@@+##$%*=*;'!!([[286660dd000a666224233355531|3||3||3999975359flolipAEEBAoc59fpwoc59c03439cddchfiloqqpxwyBAEEGCEFFKNNNONOO",
+"NNNMHEAAABHKMKEBAwpoiliiifc999099953||<|<<|<}39fifffiptyAAyof9ccc9|</<</~))~/|33|/),,,)~<|||359955533|<<||33|/,*%$#@@@@@++++...........+++@##$&*-;>'!([[286000ddbbca6622}}}43435311|||3|||3999995359flolltABAyti959itwl939c931409999cfiioqrpwwBEHEEHIKKMNOOOPOOO",
+"MMMMIHAyzyAEKMMKIEAtooilifc955709995533|||<|||59cc99cfipwAAAtlfcff5<~~//~),,)/|33|/~),,)/<||13675334||<<(//<|3<)-*%$$$$$$#@+..      ....++@@##&%-;;'!{[[28a0a0dccceba60a6744444331||||||||3999995555flplltAAwtof539lwwi937905337675dfiimmopuxyEEIIKKMNNOOOPPPPON",
+"IIIKKKEEBABEHMNNNMKEytppoiic9577790c99953|}}||35553755cfotyAAwoiiic|/~~{~,>>,,{<|||</~)!~/||466373|1|<<<//))<|33/)>-*%$$##@+.        ...++@@##&%&;;'!{[[26000abbchkgd00a64441114||||<||<||3599955335flployAytplc559oywi533553|1|246cilkjmmouxBEIIKKNNNNOOPPPPNMK",
+"CGEIIKIHHEEHIKMOOOONIBywttolfc909999cccc963||2|433||||359ipwABAwpoi9|{]~)'>,>>,~/|3||<//~/<|5632|}|1|<<|<<~)~<355|~>*%$#++++..       ...+++@##$%&*;'^{[[260088bbggkkgd07744411355||<|||_<|3599995335flolpBEytoi955coAwf3|3|||<||279fiigikopxAEHIIHIKMMOOPPPONKIH",
+"CGEHEIHIHEEEIIMOPPPPOMHEAwwtpliilifcccffcc86532||4|<_<<||3dotABBAtoic|~!)),,,,>,)/|33||</(_|5962|<333333||<~)))/|3|~>%$#@+.....      ....++@##$&&*;']{([28088bbkggkkgd07a46662553|||||<<_|3599995333clolwEEwpif535coAtc||31_<13769fffffjmpwAEBEBBEHIKNOOPPOONIFE",
+"HIIIEEEHHEEEIKNOQQQQQPONKEBAwtppttplifgffc999a5||||1_/(/<<|9ftAEBytoi9|/~))),,>--'/|3331|<||39c97|555553|<<~,>->)<||~>%$#@+......    ....++@##$&%*;;!{^[280b8ggkgggklifd98676265334||||_<|3599995333clllyIEwlfc5|3coyt9||3|</_4769fhbejmtwAyAAzzAEFIMNOOPOOONKKI",
+"MMKIEHEIMKKKMMNOPQQQQQQPPONMIAywyywtpliifc999985|1||_(/<<|<15fpyAAwtpi9|/~~),,>-=;,/|35533559cgf953333||<//~,>-%*,~||/,*$#++............+++@##$&%==;!!([28abghggggmlligfd866533952||||1_||3599995333ciloyIEwlc9||3coyp93334</_|429cfjilpwAwywvzzDEHKMNPPPPPOONNN",
+"NKIIHIMNOOOOONNNOPQQQQQQPPPPPNIHEBywtpollf99999553|1|_/_<|3|359ipwywtpic|/~~),>;-=-)<39c9c99cfffc72|<<<///~{)>;*%%-)/|<)-%#@+....++.....+++@##$&%==;!!([280hhggglljmliffd9668a6952||||1|||35999953339ioowEEwic9||5cpyp93334|<<|769fillpxwwutwvxzDFIMNPPPPPOOONOO",
+"KIIIKMNNOPPPONMKKMNOOOOPOPPQPPPOMKEBAtpoolif97565533|<<<<<|353|5citwwtpl93<//),>>>>,/|59ccccc9c99931</~~~~~~),>>-%%*>~<|/,*%#@+...+++...+++@###&%*=;'!(:2a0ghhgllllmliffcd95607055|4|1||||3599c953339ioowBBtic9||5cpwo931|4555099filopttuqsrvxzDHILNPPPOOOONONOO",
+"KKKNNNONOOOONMIEEEEEHHHIKMMOOPPPPONMIEwpppoic85555753|1<<<|5333|49iptwwtlc5|<~,,,>>>)~|359cc9999053|<_())!~~~),>>-*%%*,/||~>*$@++..++++++++@###&%*=;!!([280gghilllplmifdcd997868554|1|||||3599c953|39ioptAApfc5|39ftwo93||49filliiiottuommrtvxCFILMOPOOONOONOOON",
+"KMOPPOOOOONMKEAywwwwAAAABBEEHIKNONNOONIEywtoic9975355573|||33|33435cotwwtof9|/,>>>>->)~<359dcc999572_(/),',,!)),,>>-%$%-~<|<)-%#@+..+@##@+@####&%*;;!!(:2abkgjjjopqlmkfcd90870600541||||||35999953339ioopywoc95||5fpwoc53|4cioppoioptpmhmqrvxBEFKKNOOOONNOONONNM",
+"NOPQPPPPONIHEAwwpppttAAAAAAABABEIIIKNNNMKEAtpiiif955559053|||||333339lpttoif5<)>>>>>-')/||7ccfcc99721<(~]!'>,')),,,>-%$$%>/||/>%##@+@@#########&&*;;!!([28bknjjnrrrmlifcb90990850541||3|3|35999953|39foopwwi953||5fpwofc535copppoopwpmjmmrswzEHILKNOOOOOOOOOONMM",
+"OPQPPPQPNKHBAAAwpooptyEHEEEEBBBBEHEEEHIKMMKEAtoolf995590953|||1437|||9ilpoli93/,>>>>;;,):<359iifcc964|</~)''>,',)),,>-*%$%-~|3|)-%$##@@@##$$$#$&&*;'!{[[26bknmjmrrrmllggc9009d09055533333|35999953335flopwti953<|5ftypic9|3clppootwpnkjmrpxzBHHLKNOOOOOOOOOOOMMN",
+"PQPPPQPOMIEAAABAwptttyEIKKKIIHHHIKKEBAAEHIKKIEytplf953335555||11273||35ciooif5|/)'>>';'']_|30fiigc95241<~!)',>;'',),,>--%$$*,/||~,*%$##@@#$%%$&%&;;'!{[[2abknlrmqrqmllkgc9089dddd055553333359ccc53335floptti553<<3ftytif9330lpplpwtlhghmrwyzFEILMNOOOOOOPOOOOMMO",
+"QQPPQQPOKHEABBEBAywwywAEKMMNMMKMNOONKEAAAyABHIEBwpic953||35553345993||35ciiif95|/)>;',,!]/|26bcfiff9631|</))',>;>,,,,,,>>=%$%-)/|<~>*%%$$#$&%%=*=;;'!{[}20bkorqrqrrrlmifgc988cgfcd59555553559fff95559floptwl553/<3ftAwoif530lppotwpfggmmszzBFEIKNOOOOOOPPOOOONOP",
+"QPPQQPNMIEEBBAEEEAywyyAEKNOPPPOOOPQQPNIBytpppwBEBytlf953|1|35555dfg9933359fifc95|/),,))]!(}269ccecfc9534|_(~!,>>>;>'>,,,,,>-**-,/||<~>-*%&&$%%*->;''!{[}60bkosrquusromliifc9cdggigc999955599ciiic9559foptwyo993/<3ftAytpi95cmoopwpihgemmtAzDEIIMNOPOOPPPPPPOOOOQ",
+"QPPQPNKHEABBAACEEAyyAAEKOPPPPPPOOOPQQQPMEypliiowABAtoic931||359ccfiic953339cfc953|/!))~]{([}0accbcc999053|<<~!',>>>--;''!),,>-**>)<||/)>-=&%%=*;;''!^_[}a0bhutsuussuooolifd9dddfkigc99999599fiilic999fptwABpcc5||5iwAAAwofciooowtlhhgemqwzzBCHIMNPPPPPPPQPPOOOPQ",
+"POOPOKHBEAzzwyAAyyABEHKNOOPPOONMMMNOQQQPNKBtlffiotyAwplf931||359dfiif9993||5ccc93||</~]^(_:}abcccb85090973|<//{!,,>>;;;-',,),,;;;>)/|||(!'>-*=-;>'){]<}a6dkovtuuuusuroolifcccccdgiicc9995999filiic999fptwBEtic5||5iyBBBBwliopptwplehgjmqwyzDCHILOPPPPPPPQPPOOPQQ",
+"POONKHBBzwxptwxwwAEHKMNMMMMKIIHHIIIMNPPPPONKApiccfltyywoic73|359cgiliic953|35ccc5|||||:<_}}}6bbebc8a5269977||</{!,,,>-=*;->,)))''',,~<1|</),'>>>,'!]_126adknvtxuuusqqqoiifgc900ddiifc9955559cfiif9959clptAEtic5||5iwByAByoopptwwolfegjqwwyzBEJIMOPPPPPPPQPPOPPQQ",
+"ONMIHBBywuurpttutyEKNOMIIKIHEBBEEEEHMOPPPPOONIyoiccfltwwtlf055559dillifcc93|55ccc53333|1|21668bheca97424375541<<({),>>-==%*->,)!~~),,)/<|||(!)),'!!^_228bbknruuuuuuqpqpokgga90009iifc95555559cfff95359iptyBti95|<3ftytpppopppwwpolhhknuywzzDEJKMOPPPPPQPPPPOPQQP",
+"OMIHBEEzxuonpuupotAKOOMIKMIEBBBEEBABIOPQQPPOOOMEwpiccfowwwoic99559gioif99953|59cc9533537222a6dbbhba874111355553|<</~),--*=%%%;''~~~~))~/<|3|<//~{{(]:226bhknvuvutqqqrmmlkfha80009cffc85535339cccc53339fotwBwi95</|cpwpliioolotpolihjmpwywyzDEIMNOOPPPPQPPPPOPQQP",
+"NKIHEHBwurnnmuqmjpwHNNNMNNIBBEEEEEEBBIOPQQPPPOONMHyoffflpwwtlfc9990cilf555553359cfc955555669bddghbb8a7}}<<|45555||</~)>;=*=%&&=;,{{(((__1||||||<__[[}2268ekoruuuuqqqomolkfd900099cccc955353359ccc53335cltAEwi93/~<9lpplillfiopoiiifjmpwwzyADEIMOOOOPPPPPPOPOQQQP",
+"MKHEHEAxprnnmpmkiopAKNMMNMHAABHHHHEBABEKOPONOOOOOONHwoifiotwtoicc990ciid3|355335cffc909c99dchgggghb8877}2__<|35554|<((),--==&&&%->)~{(<|55||<|34||}|4268dbhnvuuttuqqqnlnkhdda0999ccc9995353359ccc93335citBHyi93/~<9iooooofcilifggeeknrtwwyyEEINOPOOPPPPPPPOPPQPO",
+"MIEHHHApprnkmqmhkjltEKKKKIByyAEHIHEAyyyBHKKIIMNOOOONMEtlffipttpifc9599fc9|<355559cfcfc9cccffkllkkeeb985321_<__|7555||_~)'>;==&&%*=>,)~/<|7|<<|14376786bbhhknquvtvvqqqqmmmkgd09b9cccc8995353359ccc953359itEHAi95/~<5floooicflifddfchkruqtwxzDEINOOOOOPPPOOPOPQQOO",
+"NIIKKHtppnkkmqmkkjiotBHKKHBAyyAEHIEBAwwwAEEEBEHKMNNNONHwoicflppoifc955cfc3<<|3595cfiiiiffcfimppnmmffb953}}1_<(__|333|_</~)'-=&%%*=>;','{/<<(_<|436509cffgjmnrvvtvwwtuqmmmkfdccbccccc9599553359ccc953359itEHAoc5<~/3fiopliiloicabbbhknqqptxzDILNNOOOOPPOOPOPPQPOO",
+"NKMNNEtpqlkkkmqmkeihlpwEIIHEBBBEHIIEBAwwyBEAywyBHIKMNONIApf9dioplifc90cgf92_:|5999fillliiiiimopppmljfc954}}1<//(<_<|||1</~),;=**=-;>,,,,)~(/__|36709cfgiknnstssuwvvvttqmmmiifcbbcccc9999995599cffc9555citEHEpf5<//3cipttpttoiba8bbjmommpsuyDJIMNONNOPPOOOOOPQPOP",
+"NMMOMEvqqmkkkmmmmhefhiopyAAyyyAAEHIIEAwtwyAytpptwABEINNMIAof09cilliffc9cfc92||359ccilllliiiiloopppqiif9953}}<__/({(/(<_1<</~),--;>>''',,'!{((<|589cfcfiloqttxtutvvwvwwuppoliifbcbccc9999cd999cfiiic999fltEKIwi9|<<5fipwABAtlcb88bcimlmprsuDDJIMMONNOOONONOOPQOOP",
+"OMMNMEwtpmnkejmpmmhbheiioppolooopwBEBAwttttwtollooptwEIKKIypg009flollifcfic953|35ccfilloolommnqopppoiibb953}[:((({))))~_||<</))!',,)!{!!!!!{/_125ddfeiimopswxxwwxyvtvwtttpplifcccbccccffgfc9ccillif959cipEKIwl93<<5cfitAEApifcbhhjomjmpsvtDBHKMMNNNNONNNNMNOPONO",
+"ONNMIAwwtolnijjqqmjbbbhehloiec9dciptwtttpppwwtoiiiiiotwBIIEypi959foppoiiilic95|||59cfioopoomnqqroppqolec9553}::(({{),,,'{_||</((/~)){~{{{)]{~:[[70cchilmopwyyyxyyywtswwtttpnifcc9cbcccccfddcccilolf9559ipEMIwi5|//309cfptpicc99bflpommquuxDEHKMMNNNOONNMMMNOOMMO",
+"PPNKEzwwtponljjnuuonebbehfiif9969fiopppoooopwytoiifcfilpwABBAtld99ipttpolllf9953|359cilppppqpuqmqmpqnlngd99531[[{!!',>;>''{<<11<<(/_/_((/{([[[:13669fhloptwyyyyAAAywsvwtttpolieeccbbc999dcdcccfiloic999ioEMIAl5<~~|95559dc89898ccnoonmrsuDDHHKMMNNNONMNMKKNNNKIN",
+"PPNKEwpttpnnllloutwplhjijejif98cfilpttpoliiipwwtoiiffffioptwAytofcfltwwwqolif9956269cfoppttppuuqrqopmollifc9741[:])''>;;->;'{_<|1|44322}[[[[:_12|226bekopuwyyyyABBAyvwywtttrliffccccc8990999999fiifc99cioBMMEp9</~|753557957a8bbbmmimrsvtDEHIKMNNNNONNKMKKNNNKHK",
+"OONMEtpppoinlnnpttwttponihflliiliiiloppoiiffiptwtoliif9cfiimtyAwpliipwyytpolifcc98259jilotttpuuuqmnmnmnlniieb53_[])'''-;;-->>,~<|35599652}[1142a6268abhiottwzyyyAABAyyAywwwpolifeccfcc990509999cffc9559ciyKMIwc|</|55599995688bbjlomknvuxDBGIKMNNNNONNKMIKKNOKHI",
+"MOONHtoioonilnoptuuptttpollpttpoffccfiolfcccfiotwtpooic99cffmtyAwtpoppwAytpooifcccc9cfjioptwtuuuqqqnnmmjiliifc0|[:!'';;------->,~|49cccdd0755766aa8abhhjmpuxxxxwyAAAAABBAAywpoiifffffcc90999999ccfc93335ftHMIwc3|<|9959fgb968bbcioomkoruyDGGIKMNNNNNMMKKIIKNOKCE",
+"INONHpjkloliinonmmmqrtwwwttwyytlc9909cfif9999ciptttppoic9999flpwyAAwtppwwyuopoifciifccfloptwzxyuuqqnonkjjiliifc5}:(!'';;*-=-==--'!_49ciifdefc898abbbbgehmptxwxxxxyAAAABEEBBAwpolieffiffcc909999cffc95335coBKIyf|</_5550dgccb9bbelolmosvtyBEHIKMNNNONMKKIIEINOMBB",
+"AHMKApjjloliionikkmmjoopppwtttpic97755cffc99999flptppolifcc9dfipyBEEytppwwxtoomiioolecfilqpwAyAwuuuqnokmjejfiffc52[{!',;;**-**-;;'!/20filiiiiffcffcegjemqrutuuuuuwwyyzAEEEEEAwpliifffffcc99c9ccfiifc9555clAKIAi3//_33||5b9c9ffejmppmpsvwABGIKKMNOOOMMILIHBHMNMBw",
+"tABBwpjiioolnlojkkkkkjijiloolliig973359fiifcc959ciopooollifc9cflwAEEBwtttwyttopoooppoiijloptAABAwuuuunnmjjhjcchd972}{~'';;;;;-;;;'!^[|9giioollolinikjjmnpususuuvuuwwywyAAAAAAwtplliiiifgd9cc99cciifc9555clAKKBo5|<<73||36988bcikmpqtptuAAEEIKKNOOOOMMJKFEzGKMKEw",
+"ttwtpolgfioonlpqmmkkhhbhcfgcccfiif95359iooifff9959ippolllolfccclptyABAAwtttwttpppopollmmloptyABAywuuuoommjehfc999573}/{!'';;==;;;''^(16acilppppooqoolqqppsuuuuussuwwwywyAAyAAwttpolllliifcccccffiiic9555clAKKEp9|||5553599899bikouptwxwDEEIKKMOOOONMMJLHFzAHKKHy",
+"toppppoieekllloptpqmmjh8ab07659foic059fippliffc999fopoiiiloofdfioptwyBEBytppwttpppoomppmmopwwyBBAyuuuuprmjjhe988857321_/)'';;;;;;'^^_22abchilrtttpppuuwtwwwxuuuuuuxwxwxwyyyyywtpplllllliififffffilifc555clAMMIwc3|15990ccdcecjimppputuABHEIKMNNOOONNMJHFHzAAKMME",
+"Apilopoibbeiljnottwtqnjeh95}}||9iic559fiillifc99559iooiffiloliilloptwEHHBwpppttupppoqqpppppwwwBBBAyuuurpmmjeee98aa3342||({!,';';;!!{_268aehfkmquwwwwxwwAyzzwxxxuuuutuwwwwyywywtpoliiillliiiifffiillic999ciyKNKyf3319cfgffiefhjorptwwwxABEHIKNNOOOOONMJHFFzyyHKNK",
+"Iynilrojhhheilnjmpwwwtplif7}<:<|9fc559cffilifc995559illfcfiloppoloptAEEEEAwutttttpppptttpruwwAAEBBAyuuuppmmihffaa6a|1|[|}[_{!'''!!!{}}28bggkknopswzzAAyAAzAyxxxuuuuquuuutwwwwwtpoliiiiiiififffffiiif95559fpHMKAi5339ciiiiifefkopwtwyzABEGIKMNNNOOOONMKHHECywAINO",
+"OIwollolifhbeinjmmrsttwtpl82_(]_|09555999ciliicc9955ciolifcflpwpooptABEEEBAwtpttuwwttttttuuwxAAEEBBAuuuurrmmjhff8622|1<__:}}:[^^^!{_}}88gjkjjnqqruuyABBBCCzAxwuuuuqqquuqquutwwtpoliiiiiigfffcfccfiif953359lBMKAi3|15diokifchekppwwwyyBEHIKKNNNOOPOONMKHHECAwxEMP",
+"QPKypololifeehoommoprotttoc6__(_<455735335cillicc9959flppicciptwpoptyABBBBAAwtpttwxxwttxwuxwxAABEEBAAuuuurrmmiffb86222|1__[:[:[[___}}28bgjmmmmqmttttyAAAEBAAzwxttuuqqqqqquuutttpoiifffigffffccc9cfff95||39iAKIyi3||39iliiefhgkrttwyAADEHIKNNOOOPPOONMKHHEGBwuAIO",
+"OQPMBtoooolijinpqmnkjiilllf93|:_<159533|||5cillifc959ciptoifilpttpptwyBEEBBAAwttwwwwwwwwutxxAAACCEEBAAuuuprrmmhhbc8a2222____<1||436268abgmmmmpspppwwwxzABzAAywwwtttpqqqqqruuuttpoiifffiigfgfcccc9cfc953|39iwIIyi5||49gfkgcbbgjotwwyABDGHIKNNOOOPPOONNKHHECByuxAK",
+"HNPPNHwpppproopuutmkjfbefdcd531|3339953|<<|5ciiifcc99ciptpiiiliottttwyAEEEEEEAywwywywwywttuxAAAEBBEEAAAuuuponmkjbcbbaa2}}}}__114a889cbhghmsqrprvttuxxxyDAyxzyxxwtttuqqppqqptuttpojifffiiiiffffccccff953||9itEIAl53479cgfcbabgiqttwyABEHKKKNNOOOPPPOONKIFECEyqqpy",
+"tAKNOOMHBywtptttwwumjhaad099953353359953<<<|3cfffcccccipttpppoikopwwwwAEEBBEHEBAAyAByyyyxuuAAAEEECCEEAAAxuuurokkeebaa86222}}}}}22a89ehkkjmpxvtvvtuvuyDADAwuutuuuuttpppquppputtttpoliiikkliiiifffffffc933|5fpBIBp95509ccfdcahjjpttwxABHHIIKNNOOOPPPONNMIFGEEAuqnq",
+"lotAHIKMKKHBywttutuoehaa5657555505555955|_<<|5ccccccccipwyyywoliiotyyAAEEEEEIHEEBBABEEAAAAAABBEEEGCBEEAAAxuuuonkkkeha8882222}}}}228bhimoqquvxxxxuwxyDDDDyxtuuqqqqqqqpppttqptuwwwtpoliiillliiifffccffc93||5coAEBtc579ccfbbhhkjptywwzBEHGIIKNNNOOPPOONNMKFHCEBwuom",
+"lilopwAEIKKIHEAzwtpoifa642a73555995345955|__<35ccc9999fowAEEAtollmpwzAABBBBEHIHHEEEBEEEEEBAABHHHHHGGEEEAAAAuuuonnkkkeha8a88662}66aa8bknqqxAzzAzDDDDDDAADvwuqqqqqqmmmqpqtttptwwwwwpoliiiilliiiffccccfc95||39lwBEtc7379c900bhkjqtyzyAEEIHKKKNNNOOOPONMKKKFECBBywsq",
+"oollllopwyABEHHEBywpnfa73}4333355553355553<__|59cc9555cipyEHEwpoolptABBAEEEEHIIIIHEHEEEEEEEBBHHHHHJGGEEEEAAAuuuqnnnkkkebb8a66a66668agjjquwAzFEFBDDAAACAywwuqqqqqnnmmmomqpppptwwwwtpolliiliiiifffcccfc954139iwBEwf7509db8bagjmqwwwxEFEIIMKMNOOOOOOONKKKIHFzAyxxtp",
+"qollliillooptwACEEAywoi932||143555553559531<_|39cc95559cipAIHAwtppttAEEEEHHHHKKKKKIIIIEEEEEEHHHHIIHJGEEEEEAAyyuuqqnnljgggbbbb88888ddeemmsvwzFHHEEHGGCCDywvtqqqqqmmnnmkkkmolopttwywpolliillliliifccccfc54|39ipAEyl550ddb8bbgjnpwywzDEEIIMMNOOOOOOOONKLKIHDzvwwxtq",
+"moinlilllliinlqutwAAAwpld6||}|||33599559953<__159cc95599ciwEHBAwtptyAEHIKKKIIKKMKKKIIIIIIIIHHEHHIIIIHGEEEEEByyyyqqqqqjjjhggddddddddeemhrrvxzEGIIJIHEECBAywvuqqmmmmhkkkkgkkkkmptwwwtpolllllollkiffcccfc95|35fpwBAo968cfcbbhgjmtwyxyAEEHIMMNOOOOONOOMKKIIFFzvvtqpm",
+"mijiiiiilllijmmjnloppttplf93|<|||359c999995||__|5cfc99909ipBBAAAwwwyBEHIKMMKMKKKKKKKIIIIIIHHEEEHIIIKKIHGGGEBBCCywwwqqqqmmjheeheeeeemmmrrsxxDDJJILKIIHEEAAywtqqmmhmkkkggggkkgiopttwtppolloooolliiffccff95345cowBApc70ffhfekjmmtAyxyBEEHHKKMOOOOONNOMKHIHFFzzxtqnl",
+"geebbceffiinnnjihhfifillooif53|<||55cffcfc94||<|49cfffc99foyAwAyywwAABEHIKMKKKKKIKIKKIIIIIHEEEGEHJIKKKKIHEGGGCAAAxwuttmmmmmmmmmmmmmmmrrvvxDDEJIKKIKIIEGAAAvvqrmmhkkkgggggggggiopptppoollooooolliiffcffc9335cotAAtf9ciffejjmmmtAzxAEEEHHKKMNOOOMMNMMIHFHFFCzytqqj",
+"ggb8889abbhijmifgef9b880ciiiic5|||359ffiiif53||||5cfiifccfowytwyywwAADEEHKKKKKKKIIIIIIIHHHHHEGGEGHKKKMKKKIHGGCCCAAAyvsuusssmmmmmmmmsrrvvxzABJHKKKKKIIECBAywwtpqmmkkkgggdggggfilppppoomlllooooolliifffff9735cotABwicciiiiillmttAzyDFHEHHKKMNOOOMMMMMIFFEFEAzytqmj",
+"ggbba8888bhfkeebbbaaa854239ciiic53||59cilolc53||170ciifdciowwwtwywyyAAEEHKKKKKKKIIKIIIIHHHIIJGGGGHIKKMMMKKFKHEECCzzzzvvvvsssssssssssvvvxzDDEJIKMNMKIHHCCyvvwsuprmmlkggggdddfffloppppolkillopopoliffffiid055cotAEwoffiiijmnrqtyzAADEHHIJKKMMNOMMMKMKIFEFEECzyssmj",
+"edgbbb88bbbghebba68a6a4|}||35cfiic7|135ciopoc5|1||5cilidciowywttyAAyAABEHKKKMMMMKKIKKIIHHHIIIHEEHIKKMMMMKLKKIIIIEBBzzzzzwxwvvvvvvvvvvvxzDFEIJKMMNMKIHEAzzwvtsppppoliifgddddfffjooppplmjklmoppooliigfffic955cotAEypiflolimnqqtAzzABEHKIHKKMMOONMKKMMKFDACCCzwvsme",
+"eggbbbbeeehkeebaa66aaa1[}<<}|35cilf9|||5cipwpc5|1339fllifiowwtttwABBBAAEEIKKKMMNNKKIKKIHHHHIIIJHHIKKMMNMMMMMKKKKIFFEECzzzzzzzzvvvvvzzxzDFHIJKMMNNMMIHEBzzxtsspppppolkiffcddfggilopppomjmlmpppppolificfic9559otyEBtlglpomnmmsuACzDDFIKKIIKKMONNMILKKKHAzzCCzzvsmm",
+"jjggbehehkkkjehca866a31:}<<_<<<39fii93||5coyAo933355cllliiowwwttwABEBBEGEHHIKMOONMKHIIIKIIIIKKIIIKKKMMMOOONNMMKKKFFHEFDDEFCCzzzzzzzzzDDFHHJJMMMNNMMKHEEzzwwsrrprppoliiifcccgiiilopppolmimoopppppolfffiigd08bipyEEwojoppmmqqsyACzEEEIMKJIKKMNNMKJHIMKHCzzzzzzytmm",
+"qjgkkkkkkkmnnjjifb98a73}1<(((_/<|79ffc9335fpAwl93350dioollpwywtwyABEEBBEEEHJKNOONMKIIIKMMKKKKKKMKKKMLMMOOONNNNNMMMIIHFFEFFFFFDDFFDDDDFFHHLIMMMNMMMMKHEEzzzussrrrponllgfffccgllijoopppomkmopppppppliiffifc86aipyBEyplotppoqutABCBEFFIMKIIKKMMNMJJHIKKHCzzvvyzAttq",
+"qjjkkmmmmqqoonollijfcd76|<:_(~/<<<359fc9559itAwi0559dilpoopyAwxtwyBEEEBCCEEGIMNNNKKIIIIKMMMMMMMMKKKMLMOOOOOONNNMMLMLHHHHFIIIIFFFFFFFFHHLLLMMMNMKKIKIHHEAzztsssrnooolijifcccdiiiilopppommoqpptpppooiiggffca9dfpwABApljpqmqmutzBCEEEHIMMKKMMMNMMJIHFKKIGzwxwvvvvuq",
+"mqjnmmptttwtpppliiififc953||<///(/_<35cfc99fowAti970dfiopptyAAywwAAEIHEGEGEGIIKKMMKKIIIKMMMMMMMMMKMMMMNOOPPOOOOOOMMLLLHHIIILKLHIIHHHHKLLLMMNMMMKKIIIHHEBzzxtssroonoliifecc0dfgfiiooptpomoopptptppooiikkig99cfpwAEAwnlqpoqqpwzCADFFHIMMKKMMMMMKJEFEHIJEAyvvwvvvss",
+"qurrtwwwyttponfebcc0dd9c99053|<<//(<<|9cfc99fpyAti99dgilptwABAAyyABEIIKHCGHHHJHIIKIIIIIIMNNNMMNNNMMMMMNOOPPPOOOOOOLMMLLKKLLLLLLLLLLLLLKMNMNNMMMKKIIIHHEBAzxsssrponooijfc9900dffdfiopppoooppptwwtpponkiiigcdbjrwAEBwpnqpumprtzzADEFEKKKIIKKMMMJJEEEEIIEBzvvvvvvst",
+"uwywwwwwtqlief866643||233755553|<////<|5cifccitBBticciiipwAEEAAABBEHIKKIIIIHEGEEHIIHIIIFKMNNNNNNNMMMMNNNOPOPPPOOONNMLLLLLMLLLNNMMLLLMMNNMNNNMMMKKIIIHHEBCxxxtsrroooliigc90000cdddjlopppolqpuwwwttpollilllhebeowAEEypmpxuursuAADDDFEIKMIIKKLMKJIDDBCEHHEBzAvvyAAy",
+"EABAwtsppmiba86222}1_[[(]__||3553|//~/<|5ciifflyEBpifiiiowAEEBAEEEHIKMMKKKIGGCCGEJJIIIIKKMNNNNNNNNMMMNNNOOOPPQPOOONNONMLMMLMNNNOONNNNNNONNNMMMLIIIHHGHECCAxxupprrnlnigcc0008999ddciloppmlpppwwwwttpollmmlhebeowBEEAuopxuurvxzBDDEEGJKKKKKKKIJIEDDACEEHHEECAACBEB",
+"HBAyxxpomkebba6222}__^^{{{{((<|333|</~(_|39iiiipyBAtllilotAEEEEEIIIKKMMMMMIHCCECGGIKKKKKKKMNNNNNNNNMNNNNOOPPQPPPOONNNOOOOOOONNOOOOOOOOONOONNMKKKIIHHGEEBBAxxpsprnnliigcc0070999ddcfilooomoqpwwywwtppmlmllihhjpwAEEEuruuwtwtxAEBDEEIIKMKKLKKIIJFDDAzAEEHHEBEEEHII",
+"EEyxxuunkeecb62221}_^^({{!!)))/(||3||/~~/<3cilllpABAtploppyEEHEHIMNNMKMNNMJHECCCCGIKKKKKKKMNNNNNNNNONNNNOOPPQPPPPOONNNOOOOOOOOOPPOOOOOOOONNMMKKKIIHHGEEBByxxsrronliigfcdd0009099d0cilloolpqpwwyyywppppnoolijjowBEHEyuuwyzvwvCFFDEIIIKMKKMKHIIEEEBzAACEHEEEHIIIIK",
+"HBAxxuungbbbea2221::^^{{{!!,))){~/<|33<///<3ciloowBEAwopptyBIIIHIMNNNMMNNMIEEECCCGKKKKKKKKMNOOONNNOONNMOOOOPQPPPPPOOONNOOOOOOOPPPPPPPPPOONNMMKKKIIEECzzzzxxssrponljgfgddd0899989d0ciiloomoqptwyyywtppnppppnijnwBHHHAwuAAzwzAFHEEEJIIKMMMMMHIEEDDzxzzAEEEEEHKIIIH",
+"EAAAxxplgb8ba62211::^^{!!!!)))))))~/|33|<//<39ioptAHHAtptwyBIKKKKNNNNNNNNKIHGGBCCHIKKKLKLKMMNOOOOOOOONNONOOPPPPPPPOOOOOOOOOOPPPPQPPPPPPOONNMMKKIGGCCCzzzzxxpprronlggfdddd0999660c09filoomoppwwyAAwutpmnqppnjjosBEHHEwwABzzzAEFHGJJKKKMMMMIJIHDDDzxzyzBEEEEHIIHEE",
+"EBywuuokgb886222_1:^^{{!!!,,,,))))))~<||||_<|3ciotAHKHytptyBIKMMNNNNONNMMKIHGGBCGIIJIKKKKMMMMNOOOOOOOOOONNOOPPPPOPPPPOOOOOPPPPPQRQQQQPPOONMMKIGGGEEDDyywtttprrnlliggddddd0885560dd9dfilpoopptwyAyyuuqrnoqpnnnnuAEHIExwyECzzCHHHJIIKKKNNNLJJEFEDBzxzyAAAEHEEHEEEE",
+"BBwwuungb8a822221_(^^{!!!!,)''')))))))/<|||<<|3cipwEKKEAwwyBHKMNNMNNNNNMIIIIHEGCCHHGIJILLMMMMNOOOOOOOPOOOONOOOPOOOPPPPPOOPPPPPQRRQQQQPOONNMMJJGGDADDyvvsssrrrooniigdddddd0665566c989filopmpptwyABywuuprppprnmmuAEIHEAwABBzzCHFHJJJLLMOONMJJHEDBzxzzAAAABBBAEBBAC",
+"Czzwqqjgb88262211__^^{!!!,,'',))))),)))~/||||||5clpyHKKEAwyAEIMNONNNNNNIIIIIIGGBGEEEGHJLKMMMMNNOOOOOOPOOOOONOOOOOOOPPPPPPPPPPQQRRQQQQPONNMMJJJEBDDyvvvssrrrrnolkkigddddd00566255cd99cilopopptwzABzwwuuuuuuuqnmtAEHIHAzABEAzEEHEJJJKMMNONKJIEFDzxxzyABBBAAABCAAzA",
+"zAwxqiggb88622211_^^{{!'!,',,,)))))!,),)~/<||||39fltAIKIEAAABHMOOOONNNKIIIIIIHECGEGCGJJIKMMNNNNOOOOOPPPPOOONNOOOOOOOPPPPPPPQQQQRRQQQPPONMMJJEEDDDyxwtqqqmmmllmkkkigddd09007672600d979floppputwxBBCwwwuquuuuqrrsAEHKIEAzBEEAEHEEIJKMMMNONLJEFDBzxzxvzABBCBCAAAAzz",
+"zAwqqjgb8a8622}___^^)!!',,,,,,)))))))))))~/|34||59ipwEIIIEBBEEKOOOOONNKIIIHHIIHEGEGGGGHIIKKMNNNNOOPPPPPOONONNOOOOOOOPPPPPQQQQQQRRQQQPONMLJJEBDDAxuvuuqmmmmkkkkgggggddd089007666599809fioptpptwxBBAzwwttquuturrxAEKKIHAABEEEEFFGJJMMLMNONKIEDBzzzvvzAAABECCAAzyzz",
+"AAwqjhgc8a2222_|__^({{!!)',,,,,)))))),))))~/|33|35citAHIHEEEEEINOOOOOKKKIHEEHIHHEGEGGJGIKKKKMNNNNNOPPPPPOONNNOOOOOOOOPOPPPQQQQQRRQQPPNMMJIFEDDzxuuvrqrmhhjkggghhggfgdd9a9086775559090cioptpptwyCCAzzwttttwutrutABIKKHBABEGEEHFEJJMMMMNONKIFFDAzzyyAAAAAzAAvyxyyz",
+"Aummjgbb8822}21|}|}</_/~/{~~))',))))))!!))~{/|35337fowEHIHEEEEIMNOOOMKKKIHGGGHIIHEEGJGHIKKKKMMNNNNOPPPPPOONMNNOOOOOOOPOOPPPQQQQRRQPPONMKJJEDDxuuvvrvqqmhkkkhhhghhhhhd08a89967767880909inptpptxyCCCAAzztttwwxuuxzEHKKHCACEHEEEEEJJMMMNNOOMIHFFAzzzAzztttutvvvvyvA",
+"ztmmjgb882222333322|1<<<</<///~~~~~)))!!!{~~/<|59779ipAEHIIIHIIMNNOOMKKIIIHEEEIKHHEJHHJIKKMKKKKMMMNOPPPPOONMMNNOOOOOOOOOOPPPPPPQQQPPOMMJJEDDzvuvvsvmnkjhhfcccdd09a0aaaa0a8905775895900flpptpuxyCBCAzzzzxxzzxxuuCEIKKICzCGHEHEEEJJMMNNNOOMKHEFAzzzyyutttttttvvyzA",
+"wtmhggb886668095321|_(~{~~~/(////</(~~~)!~~~~(|39999coyEHKKKKIIKKMNMKKKIIHHEGGGKKHEHHHIKKMMMKKKMMMMNOPPPOONMMMMOOOOOOONNNOOPPPPPPPPOOMJJEDDDuvsvsnolljjhd00cbaa00a99058a7a895236905600cjpttttxyACBAzAzzxxzzzxzyAJIKMIGCCCHIIEEEIJMMMNNOONMHFFBzzzvvsssttttttxzAz",
+"xqqjgb8868a99053}}/]{{),,',!))~(/<<<</~~~~~((<<|7dcccltAEIMMMKKKKKKMKKKIEEGGGECHKIIJIIIKKKMKMKKKMMMMOPPOOOONMMMNOOOONNMNNNOOOPPPPPPOLMJJEDDxvvsvnnnggggdd000777777777a6aa6659656586700djptwwwxwAzCAEzzzzxzzzzzzBHIKMKGCCEGIIHEEEJKMMOOOONMHFEEAzyvvuustutuwwwwww",
+"wqjggbbc9ccc954|[:{!,,,>>;;>>,,)~~/<<<<</(((<<|139cfgltyEEIKKKKKKHIKKKKHECGEHGEHIIIJJIIIFIKMKKKKMMLMNOPOOOONMMMMNOOOONMMMMNNOOOOOPPOLKJEDDzvussnnnkggggdd0007777777774657a3599559556a0ahotwwxxzAzACEBBzzxxBAAAACHKKMKGCACEIIHFFEJKMMOOOOOMIHHGAzvvwstssttwwwwwww",
+"qmjghbfbccc05||<[{)!,>;>;;->->>,,)~/<|||||<<<11375cfiiowABHIKKMKIHHKKIHHECGEHGEHIIKIKIIIFIKKMMKKMLKKMOOOOOOMKKIIJKMMMKKMKNNNNNNOOOONLIJEDDwvsvnnhkkggb88aaa222222222274132259999953700adoswywxzzzAAAEBAAAACBABCCHKMMKHCzCGIIHEFGJIMMOOOOONMIHEzzwwytsuuttwwwwwwt",
+"mhgghbiec8833|_[^{)!',>>;>>>>>>>,!!~/<|||33111|3779cioopwAEIKMMIHHIIIHHHEGEGGGGHHIKKKIIIFIIIKKKIKLLKKMNNNNNNMKKIJIKLMLLLLLLLMMNOONNNMIJEDzxvvnnnhggbbbaa7744411111112}411423599cc52200adiptwywzAzzzAEEBAABCBECCCGMMMMJCzCEEHEBFGIIMNNOOOONMKIEAzwwwttstttxwwwwtt",
+"megbcfb906|1_(^^^!!',;>;;>->->>>,'!~~/_||3373||376acglpttzEIKMKIIHHHGEEHHHGGCCHHIIKKMKIFFHFIFKKKIIKKKKMNNNNNMMKKIJJKMMLKLLLLLLLLLMNNLIEEDxxvvnnkhgbbb0a7774441}[[[}111}11134459cc5220dadjpwwzwywzzAAzEBBAAEEECCCHMNNMIGBBEEEEDFGIJMMNNOOONMKFFzxzvwvssssuwwwwtum",
+"edgebe8622_(((]]{'''>;>;-*-=---->>,))~/__1137337aa9dilptwzAHKKKKIHEEGEGHIHEECCHHIKIKMMKIHHHFFFKIHIIIIIKMMKKMKKIHHEEHIIIIHHHHLLLLLLLLLJEEDvuvrnkggaaba0aa222}}}}[[:}}[1_:1112239995345badiowwyzwwwzAAzBBEEEEHGGCGIMNNMKHCCGBEDDFEIJMMNNOOONMIFDzxzxwxsssstxwwussm",
+"egecba62}__({^^^'''>;--=**======->',)){(__<|4508600chkptyACEKKKKIECCEECHIIHEEEHHKKIKLMMKFHFFFFFHHHFFIIIKMKKLKKIFFFDFFHFHHFEFHHHIILLLLHDDzvvvrnghbab00a6a6}}[[[[[[::[[_1_:11211|441247adhhmtwyzwwwvzzAzBBEEEHHGEIIMNNMKIFCCEEEDEEIIKMMMNOOOMLHFDzzwwxssstwwwtsumm",
+"ggccaa2}_({{!!^^'';-=*=***&=====->>,,!){_<_|4609ddhbflowyAzEHIKKIECCCBzBHIHEEGHHIKKKKMMKFFFFFFHHFFFHHHHIKKIKKKHEEDBBBFFFFDDDFFFFFFHHHHDDwvvvrkghba0066622}}[[[::[::[:[[__[11|1|111135a0henpwyxwwxwwzzzBBEEHJHHIFKMNONMIHFHEEDDDEEIIMMMNNOOMKHFDzxzvvvsstwwwtmmme",
+"ghfb62}[(^{!!!^!';;-=*&%%&&&=====->',!){(<1}2269cfhehjruABAEBHIKIECzAzzAEHHHHIIIIKKIKMMKFFHEEEBEFEEEEEEEIIIIIIIFBCAAzzAACCCzDDDFFDFFEFDDxvvrnkgbb00662222}}[[]]^]^^][[::__[1111111112a0hhjrwywxuwwwwzzBBEEGJIKFFKMOONNKHEHFEFBFEEIIMKKNNOOMKHEDDxzxvvsstwwwsmmme",
+"kbb62}[(({{!!!!'';;-**&%%%&&&====->','){(_}}2770bhfinjnqyCBBEEHIIHCAzyAzBEEHIKKIIKKIKIKKIIHECCCCCBBFEEEEHIIEHHEBzzzxxzzzzzzzzzzzCCDDDDDzxvvrnkgbb00a22222:[[[]^]^^]^^^:^[__:|111111124abhjqwyyxuuxwwyyzBEEJIKKKFKNOOONKIHHHFEFFEHJKKKIKMMMKKJHFDzzzvvwtwwwttmmeg",
+"icb2}[(({{!!!!!'';-=*&&%%&&&&====->','){(_}}7559bchlmrqszCECAAEHIIEAAzAAzAEHIKKKKKKHJIKKIHCCCCCCCzAzBEEEBEECCECCzzzzxxwzyyvzzzzzzzxxxzzxxvvrhkgb006a2222[[:[:]]]^]]]^^^]^:_[:1111114277bhjnuwwxuuuwwwzzBBEJIKMKKMNOOONKIHEFHEFFEHKKKKIKMMMMKIEDDzzzvvvtwwwummmjk",
+"eb6}[[({{!!!!!'';;==*&%%&%&%%%===--;,'){(_}270aabhjnpqtxzEECAzzEHHEEAAAzzzAGIKKKKKIJJHIIHGCCGGCCCzzzzCCCCCGCCCCCAzyxwvwwyvwvvvvvvvvxxvxxxvrrhkbb00a2222}}:::]]^^^!^]]^{]]^:_[111[[124770hhnptwvuuuutwzzBBEGIKMMMMNOPONMIHFFHFEEEHKKKKKLMMMMKIJEFDzzzvwywwusmmjgk",
+"b82}[(({!!!!!''';;==*&%%&$%$%%===*-;,'){(_}27aaabjhnqqtxAEEBBxzCEEHEBAzAyAzEIKKIIKIJGEHHEGCGEEEBAzzzzCCCCCCGCACBCzyzwwwvsttsssvvvvxvvvvvvvrrhhbba66222}}[[[:]]{!!!!!^]^{^]]__:_[_:}}47a0hhnpuwwtuuuwwzyzBEEJKMNMMOOOOOMKHFHFEFDHHKKKHHHKKKIHHEFEFBzzvxzwwtsmejkj",
+"b2}[[({!!!!!''';;;==%&%%$&&$$%&==*-;,'!{(<}478bbhjjmmqxxABBBBCzzBEEEEEAzyyzEHIIIIKIIHEFECCCEEEEEAAzzxzBGCzCBBzCBCAAutusstuussssssrrrrrvvvvrrhkb0a6222}[}[[[:{{{!!!''!!^^^^]]_[[[[:}}26aahhhnttwtpuuuttzzBEEJLMLMNOOPOOOKIIHEEFEHHKHIHHHIKIFEFEFDFFzzzvAAttmmhkjc",
+"82:[({!!!!!'''';;;=%%&%$$$$$$%&==*-;,'!{(_}45abhhjmmruxzAEBBBCCzBEHIIHBzyAAEEHIIIKIIHEECCCCBEEEEBBzxwwzBBABBBCAAyywtttsspmmmmmmmsrrrrrrrrrrkhbb0a6222[::[:(^]{!!!''''!!^^{^^:_}[:}}}466ahhjiputspuuuttxzBAEGKMMMOOOPPOONIIIFEFEHHHFHHFFFFIFDBDDCAzzzvvAwtmmejkhc",
+"2}[[({!!!!''>'';;==%&&$$$$&$&%%&=*-;,'){(_}47abhjmmruuyzAEEBCCAAAEHIIIEBAAACEEHIKKIIHFEAzzzCBBEEEBBzwwyBEBCBBByyyywwtqmmmmmmmmmmmmmmmmmkkkkkhbb08622[[[[:((^{{!!''',''!!^^^^[_1__}}4a666hheipputrrruutxzBAEGIMMNOOPPPPONMIIHHHEHIHFFHEEHIIHEBAACCzvvvtwtmmjjkic9",
+"2[[({!!!!'''''';==&%&&$$$$&$$$%&=*-;,'){(_}47abhjmruuwxzABEBCAAADBEHIIHEBAABCGEEIKKKHFEzzzzzAyAAABBBywzAEBBBAAyyyywqqqmmmmmmmmmmmmmmmmmkkkhkkbb08222}[[:::(^{!!!''','''!^^^^^:111}}47666bghhlptpppquuttxxAEGIMMNOOPPPPONMLIHHGHHHHFHEEFHIIEAzzCCBzvvtwwqmjjgkjb8",
+"}[[({!!!!;''''';=*&%&&$$#$&$$$&%&*-;>',{(_}47abhjmuuwwzzCABBAAAAADEHIHHEEBzBECEEHIIKHEECzzzywyyAAyBBzzyAEEAAAAyyyuuqqqqmmejjjeeeeeeeeeeeebbbbba08222[[[[__^]^^!!''',,','!^]]^]11}}}47a68bhghjppqpnppustxxAEGHKMLNOPPPPPNMKLLHHHIHIHHFEEHHECzzzCBAzvsuwqmmhggeca2",
+"[[({!!!!';>'';;;==&%&&$$$$$&&&%%&*-;>',{{([4aahhmnuuxzzACzBBAAAAAABHHEEEEBAACECGGJIIHEGzAAzwwwyAAwyywytwAAAAAAAuuuuuqqjjjjjjjgddeeeeeeeeebbbbb006222[[[[__({^^!!';;;'>,''!^]^^:1}}}78aa68bhgjnpppopqqqtxxAEGGKMLMOOPPPPOMKLLLLLLIIHFEDEEECCzzzzAAtstqqqmeeghcba2",
+"[[({!!!';;;;;;;;=*&%&&$$$#$$&%&&&*-;>'!{{_[4aahemnuxzzzAzAAAAAADAABEEEEEEEBACCEGGGHHHHBCAzAuwwyyAyywwuutwAAAAAxuuuuunnljjggggddddddddddddddaaa00822}}[[[_({^^^^',';;;''''!^^^]_}}}3666a6a88hhoppqoopqqtxxAAGGKMNNOOPPPPOOMKLLKLKIIHFEDAACCCyAzzywusmqqmjhggfba2}",
+"[((!!!!';;;;;;;;=*&%&&$$##$$$%&&%*;;>'!{]_:78ahjmnuxzCzzzCAzyzAAABBDEEEEEEBBBBGGGGGGEEBCAzwuxwyAAAAywwtttyAAAwxwuuuoonnkgggdbbb88888888888888888822}}[[(_((^]]!,'';;;;',,!!^^([}}2a66666aa8ahlpppnnpqqppxAACHIMMNOOPPPPOONMKLLKKIIHFFCAzCCCAzAzywumqqjjjggebb82[",
+"[({!!!';;;;;;;;;=*&%$&$#$#$$$&&%%*;>>,!{([[788hjmnuxzCCzzBAAyyAABEBDBEFBEEEBCCGGGGGCABzzAAwxwwyAAAAyywuutwyAxwxxuuonllkkggbbbbb88888888866666666622}[[[[[(^^^{!''>;;;;;,,'!^^^[[}26a6666aa8abhopqnnppqssxxAEGIMMNOPPPPPPOONMLLKKIIHEFCzzBBCAAyAysmmqnjjghecb82}[",
+"[({!!!';>;;;;;;;=&&%$&$####$$&$%**=>''!{([1468hjmvqwzzzzzCzAyyyABEBAABEEEEEEEHGGGGGBADxzAAyywywAAAAAyywtttwuwxwxuroolkkkebba66666666666666666666662}[[:[({]^^!!',>;;;>''!!!{^^[:}46aa226aaaabhoppoorrqssxxACGHKMNOOPPQPPOONMMMKKIIFEFBzzCBBAyyAuqmmjnjggbebc82[[",
+"((!!!!;;>;;;;;;;=%&%%&#$####$%%%*=;-',!{([1488ejnvwwAzzzzCCAyyyyAEEAABEEEEEJGJHJGGGADDxxyAAyywyyBBBAAywwttqutxxwupnokkkeeb88866666666a666666622}}}}}[[[[((]^^!{!'',''''']{{^[[[}25a66a6668abbeottppprqupxwACCGKMNNOPPQPPOONNMMKKKIFEEAzzABCyyywtqmjnngdbebcb22[[",
+"({!!!!;;>;;;;;;;=%&%%$&$$#$$$%%*=;-;,'!{_[168bbknvwAAAzzzABAyyyAADBBAAEHHEHJGGJIIHEAAxxxxzyyywyAABBBAyywttquuxxxppomkkhfa888866666666a22222222222}}2}}}__:^^{]]!!''',,''!]^^^^[}44a6666666a0cemtwtpppuuuxwAGCGKLNNOPPQQPPOOOMMMKLIFFFAzzABByyytuqjjnggabbhca2}[[",
+"({!!!';;;;;;;;;==%&%%$$$$%$$%%%%==-;,'!{[[266bjhnqwAAAzzzAAAyyyADAADAABHIHHHGGIIKIEBxxuusptwywAAAAEEBAyywqquuxwxpppmkfheb888822}}}}}22}2}}}}}}}}}}}}}}}__(]^{~{]'''''','']^^^^[[}2222222266abckpttqpruuuxxABEHKMNNOPPQQPPOOONLNLLIIFFBAzBEAywquuqjjkggb8ceb22[[[",
+"({!!!';;;;;;;;;==%&&%%&&$%%%%%&==-;'''{{[_468bjhnvwAAAzzzyAAAyyAAyyABBBHIIJIHJIIKKHByxurspstuuyAAAEEEBAAuuquuuxpprmmmjfbbaa8222}}}}2}}}}}}}}}}}}}}}}}}}_:]]]{{!!!'''',',!{]^^[[1122222622260abkotprrrqqtxxAAGJKMMNOPPQQPPOOONNLLLIKHECAABEAwtquujjkkgbb8cf62}[[(",
+"({!!!';;;;;;;;;==%&&%%&&&&%&&&&&**;>'!{{[1468benqvwAAAAwwzzCAyAAxuuAABCEJIIIIIHHIIIBzxxsspquqquAAAAEEEBAxuuuuuxpppmmijbccb8222}[[[}}}[[}}}}}}[___[[[_}}::]^]({{{!'',,!!]]]:[_122aaa66aaaaaabfhlpttpppquuxxAzBGIMMNOPPQQQPPPOONLMLMKHEEzCBEAwqqunjjkkbbabfb62[[[(",
+"({!!!';;;;;;;;;==%&&%%%&&&%&&&***;-',!{[[166bbknqsyAAAwwyAAAzAAwwuutACEEJKKIIJJHIIKEEAxwwuutquuyAAyABEEAyxuuuuxpspmmjjbbbb62}}}[[[[[[}}}}__[_:_:([(__[[___[:_//(({!!]{{((<1|1356988999a9cccfjiotyywttxuuzzAAEGHKMNOOPQQQQPPPPONNLMKFEHAAEEAwqqunikkkbb8bf62}[[[(",
+"({!!!';;;;;;;;;==%%&&%*%%%&%%%**=;;''!{^_166bhknqsyyAwwwxAACAAzxutuuxBEEIKKIIKIKIKHHEAAywtttuuxyAAwwABEAyxxuuupppqomiicbb6a2}[[[[[[[[}}____(([((((((:_1:|1:}1____({{{{(((_1|}34688a8abda9ecchmptAAyyyAAACAEEHJIMMLNOPQQQQQPPOOOOMMMKIHBBEEAwqqunjjkeb88bc62}[[[(",
+"({!!!';;;;;;;;;===%%&=%%%%%%%%==;;;''!{^_166aekvqwyyAwwwxzCBCBzxxuxxxAEHHKKKKMMMKIEEEAAwxtuuquuyAzxwyAyAyyxpprpppqqmjfbcba62}[[[[[[[[____((((^^^^:[:[[[1|}[[_<<__({{{{{((_<11|366a68899a8bbdflouwAAyyAAACCCEIIKNNOOPQQQQQQPPOOONONMKIHCCEEAxqqunjkkbb8acc62[[[[(",
+"({!!!!;;;;;;;;;===&%*&&&&%%&&=*-=;;''!^^126bagjrtvyywwwxxzCEEAzxuuuxxCCHHKMMMMNNKIEBDyyxxuupqquwyAwtwuwyztprppprrqqlifbb6622}}[[[[[(___]]((^^^^[[[:[[[:[[1:[_<___{{!!{{(((_}_|266a6668668aa9filotyAyzzAACCCHIIKNOOOPQQQQQQPPOOONOMMKIIEEEHAyuuunjjkb88bb822[[[[(",
+"({!!!!';;;;;;;;;===%***&&&&&=***;;''!{^_126bhgjqtvyywwwxxzBEBAxxuuuxxzEHIMNONMMMKHBByxxuxtspqrquwyxtuuttwtqmmmommmmljfbb662}}}[(((((__(](^^^^^^[(((((:[[:[:[}__<</~{{{{{((_|}}}22226aa66a8abhhiltwywwwyyzCAEIILMOOOPQQRRQQQPPOOOOOMMIIHEIHAyuuunnjhb88cc622[[[[(",
+"({!!!!';;;;;;;;;====***=******;;;'''!^^_266bhgjqtvvywwwxxzBEBzxuuuxxzzEHKNOOONMKIEBAwuuuspppmqruwwwuqqrpttpmiinlllmlifba6622}}(((((__(((^^^^^{{{{{{(((]([[[:}_<<__{{{{{{((:_[:[12222226aa6abbejlpyywtuwwzzzBHHJMNNOOQQRRQQQQPOOOOOMMIIHHIHEyuxxpnkkb8abb622[[[[(",
+"({{!!!!;;;;;;;;;=======**%===;;;;>,'^^_122bbgjmstvvywwwxxzAEzxxxuxxzzzEIKMNOOMMKIECvvqqqronppoqtxywuqlnmptpoiiijjllliecba222}}(((((_(((^^^^^{{{{{{{((((((_:[:<<<<_]{!]]]^]]][[[[}}}2}222268a8bhipwwxuwwwzzBBEGJKMMOOPQRRQQQQPPPPPOONMKIIIHBwzwzppmkeabcc62}[[[[[",
+"(({!!!!';;;;;;;;;===;=-=====;;;;'''^^(_2268hgjmvvvvywwwwyzABzxxxxxzzzBIIIMMNNMMKIGzvtqqqmnnnonquwyxuqnkklppoifiifiiifecb622}}_((((((({^^^^^!{{{{{{{{]{{]{(([:_((:<]]!!!!]^{]:[^[:[:_2}2}266a8ahimpwxustwzxAAEEGIMMMOPQQQQQQQPPPPPPPOOMMMKIEyyxxppmmjbbhba2}[[[[[",
+"(({{!!!!;;;;;;;;;==*=;====;;;;;;,'^^^(_2288bgmmsvvvvwwxwyzzAxxxxxzzzCEHIIKKMMMKIEGCvsqqmnnnnnhmquwwuonkjiiooliiijiiiief86222}_(((({(({^^^^{{{!!]!]]{^{{{{{(](_((__]]!!!!^^]^(^^_[[1[[}}2226668gelqwttupwxxAACBGGKMMNOPQQQQQQQPPPPPPPONNNNKHAAxwpomkiififa22}[[[[",
+"[(({!!!!';;;;;;;;;;;;;;;;;;;;;','!^^(_}228bgjmvvvvvvywwwyzAAAxxxxzzCEEHHHIIKMMKKEEAwuqqmnjnnnjhmqtuunkkjfiloiffffccbife8622}}_((({{({^^^^{!{!!!!!!!!{{{{]{](]((](<(!!]!]^^^]]^^[[[[[[122226668bgkqtwsrtuuuyyBCGGILKMOPQQQQQQPPOOPPPPOOOOONKIEAyxokkhjhifb622}[[[",
+"[[(({!!!!';;;;;;;;;;;;;;;;;;;''!!!^(_}}2aabgjmvvvvvvywwwyzzAzxxxzzCEGHHHEIIIKMKIEEAvuqmmmjjjnhjjmuuonkheheiiifcfccc9bb98622}__(({{{({^^^^!!!!!!!!!!!{!!!{{{]]//(/_(]]!]!{^^]^[[[[[_[[222222888hghmwwsruuuuyxzACCHFIMNPPQQQQQPPOOOPPPOOOOONNMIIBAtpkkeffbb8622}}[",
+"}[(({{!!!';;;;;;;;;;;;;;;;;;>!!!!!{__}}28bdjmmvvvvvvyzwwwyAAzAxzzzCEEHHEHIIIJKKHEBAvuqmnmjjjjjjhmqunkkhbb8bfffbccc999988a62}__({{{{({^^^{!!!!!!!!!!!{{!]!{^]{]:<:::]{]^]^^]]]][^[[[}2}2222668adghottsuuuuzyxzzACHIFKNOPQQQQQPPOOPPPPPOOOOOMMKIECwtqmiifbaa866a22",
+"2}[(({!!!!';;;;;;;;;;;;;;;'!!!!!{{([[}2a8bdhmsvzzvvvvzzwwzAAzAzzABEEHHEEHHIIHHIHGEDvuqmnnjjjjjhhmquokfbbb888ffc9cc998866662}__({{{{({^^^{!!!!!!'!!!'!!{]]!{^]]:::::(]]]]^^]^]^[^[}}}}}2}2666a0dhjotxxuuuuwxxAzzCEIFILNPQQPQPPPPOOPPPPOOOOOMKKIHBBywtponc888826a2",
+"222}_({!!!!';;;;;;;;;;;;;;'!!!!{{^([[26aabhmmsvzzzvvvzzzwzAAAAABEEHHEEEEHHHIHEIHHEDwuqmnnjjjjjhhmqomkjcb8a68bc99995555866222__({{{{(^^^^{!!!!!''!'''!!!!]]{{{(:_:::({]^]^^^]:[[[[}}}}}}266aaaaeejnuwxuuuwwwwzzACGIIKMNOPPPPPPPOOOOPPOOOOONMMKHHCAwwxwwplhba8a226",
+"22222_{!!!!';;;;;;;;;;;;;;',!^^(([[[}266ademvvxzzzzvvzzzABzAACBEHHHEEEEHGHHIHEHEEBDwuqmnhjjjjjhkkmomjeh888a85095555335544222__({{{{({^^^{]!!!!'!]'!'!!!!{]]{{(:_:_<_]]]^{^^^[[[[[}}}}}226aaabbehmquywuuwwwwwzzzCGFHFKNOPPPPOPPPOOOOOOOOOOOOMKIEEAytwwxtpoheb8882",
+"222}2<(]^!!';;;;;;;;;;;;';'!,^(([[[[}668bhhhvuxzzzzzvvzzzCCzzBEHHHEEEEHHHHGHECBCEBAyuqnnnjjjjjhkkmomifea6aa475534224443||||2__({{{{({^^^{!!!!!'!'')!!]{!{{]{{(_<<<1_(]]^{^^^::_[[[}}2227aaa8bbhkmquxxvwwvwwzAzACGHHFKNOPPPPOOOPOPOOOOOPOOOOMKIEEzxxtwwtppplifba8",
+"a22}__(^^^^';;;;-;;;;;;;'''!,{([[[[}668abekrvuzDzzzzzzzzAABBABEHHEEEEHHHHHHHEEzBEBDyturnnjjjjhkkmnnmkjjc8a744432}22}}}}|1<_<<_(({{{({^^^{!!]!!!!'!!!]{{{{{{]](__|_1__]^]^^]::::[[[}2227778888hhkmquyAxwwwwxzzzACGHFFKNOOOOPOOOOPPOOOOOOOOOONIHHBBwxxwwuqqppolihh",
+"h8a2__(^^]^!'';>;;;;;;>;'''!!{([[}}6668abkkqvxDDDzzzzzzzACBCCEHHIEEHHHHHJEHBEEzCGBDAxurmmjjjjkkkmmnmkhheba541}22}}22}}}::^(_((((({{({^^^{!{]^!]!')!]!!]~{({((:[<}|11_]]]^^^:::_[[22277777888bgkkmpuyyyxxwDAzyACCGHHFKMOOOOOOOOOOPPOOOOOPOOOMIHEEAAxxttpqqqnoplli",
+"mfc61_{!^]^!!!!''>;;;;;;;;'!!{([[[2228abkhrvvxAADDzzzzzzzACABEEEHHHHHHHIHGHBCAAzAAAAxuqrnjjjmkkknmlmlfcfec74[}2221111_}:::]^]{{{{{{({^^^{{]!^!]!!]]!]!{]{/(((_1|}}111:::_([_::}222277777a888bghkqptyAywzyDAAyyCCGHFFFKMOOOONONOOOPOOOOOPOPONKGCByyuxyyppmmmmoopl",
+"lifc9|_^]!!^{~{{'';;;--;;;'!!{(:[222600bkknvuDBBBDDDzzzzzAzABEEEEGEEHHHIHGEBEACCAAAAxxsqmjmnkkkmmmlmlifiic04}}}1_<<<<<//(:]^]^!!!!{{(^^^^{{!!!!]!!]{{!{{(/(_<_143|||1<::__[[}22222777770a888bghmmrtzCBAzAAAAAzzCGHFFFKMNOOONNNNOOOOOOOPPPPPNKHCzzwwuxxupormmmmoo",
+"igffc03:^^^^^]^]!'';;;;;;;,'!{{[_22600bhhnvvxDEEBDDBzzyvzwAAEEEBBGEEHHHHHGEEzCCCAAAyxxuqnnnmkkhhmmjmlifiif07}}1||<<<<<//{~){^^!!!!!^^]^^^{{{{!]{!]{{{]{(/(/_||144|33411_:}1}}337a7788a00bbbbbbhmmptABCzAzzDAAzzCGHFFFKMNOOONMNNNOOPOOOPPQQPOMFBzzxtwuuuunorommml",
+"fc0c00722|:(]^^^^''''>;-;;'''!{[[2260bagnnvuDDBECDBCzzyADzAAEEBAAAEEHHHHHEEECBBAADAyxxuummnmkkkkkmjmmifiic92}}_<|</////~~{)',''''!!^^^^]^{{{{{{{]]{{{{((</__<|1143|2411_11}14347a78a99dbcbbhefjmmpsyBCzAzzAzzAzCHHHFFFMNNNONMLNNOOOOOOPPQQQPNKHzzvvtwwqqqquoppme",
+"ea8877759952:^^!!!,),,';>',''!{[[2260bhgmvutyCGEBDBzzzyDxyABBBAzAAAEEHHIHHHCBCAAADAAzzxupmnmmhkkkmjklifffd922}_<<<(((/{{{)),''>;;''!^^^^]({{{{{{{{~{{{]](____}11|4|221____1114446aaaa0adbeffehmmmqtwEECCAzzzzzzCEHIFFIMNNNNNMKLNOOOOOOPQQQQOMKFBzzwytusmmmqqurmf",
+"e9aa7445cd95}<]^]!'''''';',''!{[:22a0ahnnvvvDBGBBDBzzwyzyDBEzxxAzAABHIIHHIHGCEABAAAAAAAzturmnhhkkkjkiidccd5221_<<__((({{{!'',;;;;;'''{^^^:{({{{{{{{{({]((__:__|114414}_____111226666aaaa9behjilqqqtyEECCCzCAzzzCEHEFFIKNNNNMMKLMOOOOOOPQQQQONKHFAzzyywprssmqqlif",
+"e8a85375955743}:^]!''''''',''!]^[22608gnjvuvDAGBBDzzzwvwyABAzxxxzAABHIHHHHHEEBAAAAABAAAAwuqmnmhkkhkkiicccd963|<<<<_(~~~)),''';;;;;;'''{^:[{]{{{{{{{{{{{^(__::<|11442|}[[[_[}}222aaaa0898abbbejlquuwyBEEEEEEEBBBEEHEEFIKNNNNMIKLKNOOOOOPQQQPONMIFDAzzzvvvrrsmhgfb",
+"baa777753}}}3437}_]!'''''!!!'!{^[2260agljqqwDADBBDzzzwywzAzzxxxxxABBEEEEBHHHBAAzyyAAAAAzwtqrqnmhhhkkiifcccc654|____~{~~))''>;;;==;;;'']{:[(({]^]{{~{{{(((_::<1|4443332}[[}}1222000aa9c9aaaabejoquuuyBEECHFIHHEGEEHEEEHKMNNNMKLKLMOOOOOPQQQPPNMIHFDAzzzvvvvrmegba",
+"222|7572[<[:|1|742|[!)'''!]!!{]][22678gjjqqwDDDDDDxzwxvxzAzxuuuxxzBEEEEBEHHBAAwxyyyAAAAwttqrqqljkhkkkiiecdc954|___//{~)),>>>;-====;;'''{([[((]((]]{/(((((__<:11|4353552}}}42770ddabbdccccdhgiopptxwABEGEIHIFIFFFEHECEHIMNNNMKIKLMOOOOOPQQQPPOMKHHEEEAzxxvvrmedaa",
+"2}}1774[[:[::[|4443|:{!''!!]^{([[}}6a8gjjqquDAADDDxzwwuwzwxuuuuxxxBEEEEEHHBAyyxxzyyyzAzwwtpqpooljjjkkiifcdc993|<__//)))),>>--*%%%==;;''!](:((](((]]/(((((_<_<1|435575955775700ddihhggfffikimopptwwxABHEEHIKKKIFFEIEECEIMNNNMFILMMNPOOOPQQQQPONKLHHHEFzzxxxrmed86",
+"2}}131_^]:^::_14|1233}({'!!!](__:}2778gjjrquDAADDDxxwwwwzxusuuuxxzzBBBEHHByyxxxxxywwyyAwwupuqnoomkkkmiieffc995|<__//~))),>;--*%%%%*;;;,!{{(_((:(((:(/<:__<_1|4377590990775000ddijifikfiiimmmmpqppwwABHHHHIKKKIIIHIHECEIKNNNMIIIMMOOOOOPQQQQPOOMLKHIFHDDzxvrmed86",
+"2}}1|_{^^]^_<_1111:}334<^]!!!{(:}22778dikmquwADDADxxwwwyyuuqvvuxzzzBzEEEAAwuuuuxxwwuxxxwwtrqooopmmmmmllffffc97||<//~~),,,>;-=%&&&&**-;'!]]([(__:_::/_<<<<|11|4355599900557909ciiiigggkfiikkkkmnnrtxxBHHHIKKLLKIIKKIEEEIKMNNKIFILMOOOOPPQQQPPPOOMKLKIHFDzxvrmed86",
+"2}2__{{{{{((__111<_[}323|:]!!{{[}62088djjmqtwAADAxxxxzwyuuqvvvuxzzzzBEEAywuuuuuupstpuxxtwuqqlnnmmmmmmoliffc9673|_//~~),,,>-**%$$$&&=--'']{]_______<<<<||||3||47579999990099ccgiiiijgggcfghhgggijjquuyBEEEIKMKKKKKKIHEHIKNNNMIHIIMOOOOOPQQPPPPOONMLLMLHDzxvrmed86",
+"222_({{!!{((_11311_[<:}2|11:({/:[220agdjmmqtvAADDyvxxywyuqqvvuuxxxzBEEAywutuxuspppsqutxuwtrnmlkmomliloonifc9663|1</~~),>>>-**%$$$$%==-''!{((1<_<1<<|<||||||33347799ccffdccccfgjkkggddggcdbbdhheehmqqwAEECGIKFFLKKKKIHIKMNNNMKFIILOOOOPQQQPPPPOONNNMMLHDzxvrmed86",
+"22}[(({{{{{{__2221__](:<11|||1_::220bghjmmquvyADDyuxwzyyvqqqqrruxxzGEAywxuxxtpprrppquuxtwtqqnjkjjillnilolif9a63||</~~),>>>-*&&###$%%==>''{(_1<|<|111||||||33357709cccffcc99cghhhhjghddgdbbhbdgeehmmqwABBCBHIKIFIIKKIHIKMNNONKFFIMNOOPPQQQQQPPOOONLNMLHDzxvrmed86",
+"22}[(({{{{((([}}2|__^](::<||752}}2609gglmnqtvyADDxvxwAyxqqqqsrquxzBEBAyxxuuxtutsssppstxtwtummkhkehijiilolij9aa3|1</~~),>>>==&&####$%*=>>'!{(__1_111||11||33355900ddccfgc99ddhehhhhhhddddbbbabheeemmmtyCBCCHIFIFIIKIHEHKMNNOOMKFKKOOOPPPQQQQPOOOOOONMLHFzxvrmed8a",
+"a}[[(((((({{[[[}}_1<<]^]^[_1459556678gglqqqtvyADyAvxxAwwqqqqvrruxzBEAywxwxxttwwyvvwwtxywyutpmmkheehhiiloilic9673|_<~~),>>;==&&####$&**;>,!{(_|||||1||1|33335599990dccfffddhhhghhhhhghdddabbbhheeehmmqyABBCEHFKIIIKIEEHKMNNOONKKKMOOOPPQQQPPPOOPPOONMKHFzxvrmed88",
+"a2[[[(((((([:[[}[}<__]^^]^]_|3999990adgjqqquwAADDDwxwzwwmmqqunruzACyyywxwxwyAEEEEBAAAAAAAwwsomkhhbbbejliiiif9673|_</~),>;===%$@@@@$&&*-;'){{(_|11|||11133555569990cccghfebhhhghkkhjfgdgggbbehhhjjhmqqyABCCEFIIFIIKKIHIKMNNOONMKMNOPOPQQQPPPPOOPPPONNKHFzxvrmedb8",
+"8}[[[[((([[[::1}}}_|__]/](^<<1599cfdbggkqpqwyAAADDxxyAwtsmqqquoxzzywwxwyAABEHKMKIIHEEBAAAAAwpmmjjbbbfiiiiiifc953||</~),>-==%%$#@@@#&%=*>>'!)(__1<1||43347555599999ddghfifghggklnjmmmiigghhfhghggjjqquyAEBCCHFKKIFKKIHIKNNOOONNMMNPPOPQQQQPQPOOPPPONNLLFDxvrmmhb8",
+"6}[[[[[[[[::}22}}}}_<_<_:/(__137ccfgfigimmqvyACADDzzzAztsmqqqquxAAvtwwABEEHIKMMIEEBAAywwyABytqnjjgbhhhgiiiifd99531</~),>;==%%$@@@@#$%%=;;,,!~(__|_|||33555550999cccdggiiijkjlooommmollkkkffghghkjjnquAAEBCEFIKKKKKKHHIKMNOOONNMNNOPOPQQQQQQPPOPPPPONLLFDxvrmmjga",
+"a6}[[[[[::[}22662}}(//<_<__<_}|580fiimomrqqwyAEADDAzAywusmqqqvxzAwtwxyBEHIKKKKEBAwwwxwtwyyAywqmoijijhfhfiijif8853|<<~)),;=%%%#@@@@##$%%*;;,!{/_<<||1|145559709cccffiillllllopprpppppoommiiikkkkkknmuuAAEECEFIKKKKFKFHHKMNNOONNNNNOOOPQQQQQQPPPPPPPONLLHDxvrrmhgb",
+"66}}[[[[[}}2288864}}({{(1||1_}|298fgiopprqqvvACADDDzzvvsssqqquxzzttwyAEIIMKIHBAywtttxwwwyyAywtpmlmihehcfiiiff9973||</)),-=%%$#@@@@##$&&**-')){/<_<<|||3755999dcfffiilooooooooppppqppppopllommmpmmpptwABEEGCIFKKKKLKIHIKMNNOONNMNNOOOOPQQQQQQPPPPPOONMLHFzxvrmjgb",
+"666}}[[}}266ccff996}(({/<||1_|2269dfmotttutvyACEBBBBzxvvstqqqtwzxtwyAEHIKKIEBAyAAyyyyAyAAAAywtpmlnlgfhfeeifgfc8953|</~),-=%%$#@++@##$&&==->'!~/_<<|||3355999ccdgfgiillllollnoorrpmoqoommoloompqpqttyyEHIHGHKKKKKLKKFFIKMNMNONNMNNOOOOPQQQQPPPPPOOOOONLHFzxvsmhdd",
+"8666}222a6bbfeifif92[((/_|<_}}2269dfmmpwwwwwyABEBDEEzxvvtutqqxwxxwyABHIIHHHEEEEEHEEEEEBBABAAytpoliiiighceffgcc8953|</~),>;%%$#@++@###$&==;>,!~/<<<<||3335599ccggfiijllnnlloooopppqqpoomomlmmmopqqttyAEIKKIIMMMMMKKLKIKKMMMMNMMMNOOOOPPQQQQPPPPOOOPPOOKLFBxvsmmed",
+"86666226bbbccjjefc6|[(((((/(::2669dckkptwwAAAACEGEHEAxxxwstuuxxxxwAEEIIHEHIKIKIIIHIIHIEEBEBAAwppojhfiffcddddc88653|</~),>;*%$#@++@@##$%%*;>,){//<<||||355599ccggfiijllonpppppttwwtxwttpttpppppputtwAAEIKKKKNOOONNMMKKKLNNNNNNMMNOOOOPPPQQQPPPOOOOPPPOMLIDzvssmed",
+"d86688abcbccehgif86}}[(({{{^:[}659dekoouuwABEBEEEEHEEzxvvwswyDuxzBBEHIHHIKMMMKKIIEHIHIIIHHEBBAwponijijfcccccc98655||<~),>;*%$#@++@@#@#$%*->,,)//<<<||||35599ccfiiillooppttwwwwyyyyAAyywwywwwtxzzyyABCHIMKKMNOOOOOOOMMMMNNNNNNMMNOOOOPPPQQPPPPOOOOPPPOOMIFBzytmme",
+"ddba88bbcciikggfc82}[:[{{^]^^::27dffkooptwABEHHGHIEEBAxzvvwwzyuxABBHHHHIKMKKKMKIIHHIHIIKIHHEEBAtpnjffefffcd9c996533|</)),;*%$#@+++@@@#$$*--,,)~//<<||||35599ccfiiloppttwwywwwwyyywyyywwtwwtttwAAAAEEEIKMMMNNOOPPOOOOOOOOONNNNMNNOOOOPPPPPPPPPOOOPPPOOONNIHzztmme",
+"eggbehchfilokkkf962}::::::[][:}2a0ckkmrpuwAAEJIIIKIEBCAzzyyAzyAzCEIHHIIKKKIIKMKIIEEHHIIKIHHEEBBypljfbeffcc9cc95333||</),,-=%$#@+++@+@#$$%*->,)~///<|||335599cfiilopppttwwwwwwwwywwwwywwuppppptwwyzABEHMNNMOOOPPPPPPPOPPPPPOOONNOPPPPPPPPPPPOPOOOPPPOOOONMIEAzsmm",
+"jjkkkhfhgkmmonkg6a6[::[:[[[:::2}60agkoupuwyABHIKMKIHBDDzzzACAyACEHIKHIIIIIHIIIIHHEBBAEEEEEHEEEBytoifbhcfdcccc9533|||</~),-=%$#@+++++##$%%*->,)~//<<||3355599cffillppptwwwwywwwyyyywyywwwutttttwwwyyABEIMMMNOOPPQPQQQPPQQQQPPOOOPPPOPOOOPPPPOOOOOPPPOOOONMMKGAwtq",
+"qnokkkggggillqjg862[}[[:::[[[222788glouuuyAAEGGKNNKIEBBDzzBBAABEEIIKIIIKKIHHEHHEEAAyyAyyAAEEBEBAwpljeedcc9ccc953||||<<~),>;%$#@++++@@#$%%*--,)~/(<||||355999ccfiilopptttwwwwwwyyyyyAAAyywwwyyyAAAAzEEIKMMMNNOOPPOPQQQPQQQQQQQPPPQPPPOOOPPPPOOOOOOPPOOOOONMKGEBwq",
+"xuronljeejjjqmhd8666}:[:[::[[22608ggjppuwyAAEEEKMNMIIEBDEBEEBEEHIIKKKIIKKHEEBBBBBAzyywtwwwAEBBBAwpoijedd99cc9953|||<<<~),>;%%#@++++@@##$%*-->)~/<<<|||355599ccffiiloptwwwwywwwyyAAAyyywwywyyAAAAACEHHKMNNNNOOOOOOOPPPPQQQQQQQQQQQQQPOOOPPPPOOOOOOOPOOOOOOMMKGEAA",
+"Eywuoljeemmqmmed8aaa}}[[:[:[422a08ggioqqwyAAEEHKMMMKKIEEEEEGGHIIKMKKKKMKIEBAAAAAAAAAywttpuwAABAAwtolifdda8c995531|<<<<~~,>;=%#@++++@@@#$%*->,,~/<<<||||335599ccfiiloppwwwwyAyyyyyyywwwwwwwtwwxyyAEEEKKNOOOOOOPOOOOOOOOPQQQQQQQQRQQQQPOOOPPPOOOOOOOOOOOOOOONKHHHE",
+"HHAyuqqmmqqqpmhdd8662}:[:[:2226788glinqqwAAEEEIKMMMMKKKHHHFHHFKKKMKIKMKIEBAABzAAABAAAwxupqtwyAAAwtpoljgd890999541<<<<//~,>;=%$@++.+@+@#$%%->,)~//<<<|||3355999cfiilopptwwyyywwwyvwwuutttpstquuuxAAAEHIMOOOOPPPPPPOPPOOOPQQQQQQQQQQQQQPPOPPPOOOOOOOOOONOOONMMMJII",
+"KHHEwuuqqqwtpkked82222[:[:22}267agglrrqtwyAEEHKKMMMMMMKKKIIIHKMNNMKMMKIHGEABBAAyyDyyyyuupttwwyyAywtpoifd09999953|1<//~~~,>>=%$@++.+@+@#$%*->,))~//<<<||335599ccfiillopptwwwwwwwywwwvxxwwwwwwwwyAAACEGHKNOOOOOPPPPQPPPPPPQPPPOPPQQQQQQQQPPPPPOOOOOOONNNNOONNMNNMK",
+"MKEEEBAyyywtpkmeda82222222222607aggkqrqvvAACEIKKMMMMMMMMMMKKKMNNNNMMMKEEEECAywwstsstzwuuutwwwwwyywtpplic98999953|<<//~~~),>=&$#++.++@##$%*-->))~//<<|||355599ccffiilllpptwwyyyyAAABBAABBEBABBBBEEHGIIKMOOOOOOPOOPPPQQQQQQQPOOOOPQQQQQQQQQQQPOOOOOOOONNNOOOMNNNNN",
+"MKIEEEBBABzypmkb0082266689889909ggkjmquvvABBEIKMMMNMMMMNMMMMMMNNNNONKIHIBBzzzxssrrruuuuuputwwwwwywwtolifcb955553|<//~~))),>=&$#++.++@##$%*-->,)~~//<<<||35599cccgffiloptwwAABBBEEEEEEEEEHHHHGHHKKKMMNOOOPPPOPPPOPPPPPQQQQQQQPOOPQQPPQQQQQQQQPOOOOOOOONNOOOOMMMNN",
+"KKKHHEHIIEAAtmme0088688cccfjiigfkglmnqtvwyBBIIKMMNNNNMNMNNONOONNNOONMIHEEAzxxuuuuuuqusuuttuwtwtwwwwtooiib9955553|<</~~))),>-&&#++.++@##%%*-->,,~~/<<<|||335599ccfiiloppwyABBBBBEEEEHHHHHHEEHHHIKKMMNOOOPQQPQQQQPPPPPPPQQQQQQQPPQQQPPPPPQQQQQQPPPPPPOOOOOOOONMMMM",
+"KIJIKIIIIIHBwtmefd9ccffccfiilklqmporqqwvyCAEHIMMNNNNNNMNNOOOOOONOONNKKJEBzAxuuuuuvvqqqqtuspttttwwywwpoliec957533|<</~))),,>-&&#+++++@##%%*-->,,~~//<<|||333599ccfilopttwwyAABBEEEEEEEEIHEEEEEEHHIIKMNOOPQQQQQQQQQQQQPPQQQQQQQQQQQQPPPPPPQQQQQPQPQPPPOOOOOOOOMNML",
+"FIIIKMKIIIHECwmmigkilifccffkkllpptupqtvvyCBHHIMMNNNOONONNOOPPPPOPOMMMIHHGAzAxuvuuuvqqqsttqutttwwwyywppliec95733||</~{),,,,>-*&#++++@@##%%*-->,,~///<<<||335599cfilloppptwwyyAABBBBEBBEEEEAACCBCCEIKMNNOOPQPQPQQPPPQQQQQQQQQQQPQQQQQPPPPPPPOOPPPQQQQPPPPOOOOOONMK",
+"KIIILMNNMKEEEAupnomoijfeccgggjomttxxuvyAyCBBHIKMMNNOOOOOOOOPPPPPPONMKIJGECzyxywvuvuqqvsuupuwwwwwwyywtplif9997731<<({~!),,>>-*&$@+++@@##%%*->>,))~//<<<||335599cfiloooppptwwwAAAAAAAAAADBBBAAAAEEHIKMMNNOPPPPPPPPPPPQPPQQQQQQPPQQQQQQQQQQQPOOOOOPQQQQPPPPPOOOOOMM",
+"MLIKKMNNNKHCBAxxttqoifbc9dddeekmpuwwyAAyAACBIIKMMMNOOPOOOOPPPPQQPONMKIJJECBzxwwwwwtttvstqstuwwwwwyywwtoifc9973||<//~)),,,>--**$@+++@@##%%*->>,)~~///<<||355599cfiloooppptwwwyAABBBBBBAAABEDBDEEHHIKMNNOOPPPPPPPPOOPPPPPQQQQQPPQQQQQQQQQQQPOONNOOPQQQQQPPPPPPPOOM",
+"LMMMKKMMMKIGCAyBywpokgddd00bbggoostxAAADyABEEIIKMMNNOPPPOPPPPPQQPONMKKIGGGCzzzvvwttttsvsuvttttwywyyywtplicc053|||</~),,,>>-=**$@+++@@#$%%*->,,)~~~/<<|||355559cfiioooopptwyAAEEEBEEBEEEBEEEEEHFIKKMMMOOOPPPPOPPOOOOOOOPQQQQQPPPQQQQQQQQQQQPOONNOPPQQQQQQQQPPPPOO",
+"ONMMMMMMKKHEEABABywmkgdd00bbgggmlpuwAAAADAAEHIIIKMNOOOPPPPQQPQPQPPONKKIIGGCCCzDytuutssvtvusuutvwwwwywttoicc973||<</~),,>>--;=*$@+++@@#$%%*->,,))~~/<<<|||35559cfiilooopptwyAABEEEEEEEEEEHEHHHIIKMMMNOOOPQQPPOPPOOOOOOOPPQQPPPPPQQQQQQQQQQQQPPOOOPQQQQQQQQQQPPPPO",
+"POOONLMLIIEEEEEAzwtpmgdd0bbbggllqruwAAAAAAAEHHIIIMMNOOOPPPQQQQQPPPOOMKLKIHGCCAAAxvvvvvvtwuusuttvvwwwwttplic973||<//~'',>--**=*%@++@@##$%*-->,,))~//<<<<||35559ccfiillmopptwwyBBEEEEHIEHHHIIIIKKKMMNNNOOQQQPPPOPPOOOOOOOPPPPPPOPPQQQQQQQQQQQQPPPOPQQQQQQQQQRQQQQP",
+"PPOOOOOMIFECEEHAytpppligecbgggnmrqquwwADDAABHHHIKKMNOOOPPQQQQQPPPPOOONKKKIIGCBAAzvvvvvvtwxxvutwwwwwwwwtpoifc95||<</)),,>-;**%&%#@#@@##$%*-->,,)~~//<<<<||355559cffiikllopppwwAABBBEHHHIHEGJHJJIIMMNNOOPQQQPPPOOOOOOOOOOPPPPPOOOPQQPPPPQQQQQQPPQQQQQQQQQQQQQQQQQQ",
+"QQPPPOOLIFBCEEEAywppppoljekggnlrvqttttxDABDEEHGIIKMNNOOPPQQQQQQPPPPOOONKKKIIHGGCCzzzzxwvxxxuuwwwyytwwwtpoifc95|1<</~!,,>--=*%&$#@##@#$$%*-->,,)~~///<<<||335559cffiiiillooptwyAzAAzEEHHHIIJIIIMMMLNOOPPPQQPPOOOOOOOOOOOPPPPOOOOOPPOPPPQQQQPPPPPQQQQQQQQQQQQQQQQQ",
+"QQQQPPOMIHECBEAwwwpooppolmmkknnquutuutuwDDEEEHEHIKKNNOPPPQQQQQQPPPOOPOONNMKKKKHGCCCCzzzxxxxxvwvyyywtttwtoifc9531</({!,>--;=%%$$#@##@#$$%**->,,)~~///<<<||3355599fffiiillopptwwyAAzABEHHIJIIIKKMMOOOPPPPQQQPPOOOOOOLNNOOPPPPPOOOOPPOOOPPQQPPPPPPPQQQRRRRRRQQQQQRR",
+"RQQQQPOMKIHCCAwwuuuoooppuqmmqmrruttqqqutwDBEEBGEIIKNNOOPPQQQQQQQPPPPOPOOOOMMFIIHGCzzzAAzzxxxvwyyAAywwtttolfc9531<//{),>>-*=%&$$#@####$$%*-->,,)~~///<<|||3355599ffiffiiloppptwyyAAzBHHHIIKIKMMNOOOPPPPPPQQPOOOOOONMNNNOOPPOOOOOPPPNNOOPPPPPOPPPPQQQRRRRRRRRRRRRR",
+"RRRQQPONMKKCzytuqqtuoooutuqtqqvvutuuuqqquwBEEBGEEIIKNOOPPQQQQQQQQQPPOOPPOOOMKIIHFECzzzAAAzzyyyyAAAywwtttplfc953|<//~),>>-*%&&$##@@#$#$%%*->>,))~~///<<<|||355599ffifgiiloooppwwyAAABEHHIIKKMMNNOOOOPPPPPQQPOOONNONMMMMNOOOOOOOOPPPNNNNOPPPOOOOPPPQQQRRRRRRRRRRSR",
+"RRRQQPPOOMKEAxutmqqutuuquuuwtxuuuuqquqqquwAEEBAECHIKMNOOPPQQQQQQQQQQPPPPPOOMLIFFHEEzAzzzABAAzAAABBAyywttpoic953|<//~),>--*%%&#@##@#$#$%%*->>,))~////<<<||335599cfffgfiiloloopwwyAAABEGEIIKMNNOOOOOPPPPPPQQPOOONNNNMMMMNOOOOONNOOPPONNNNOOOONOOOPPPQQQRRRRRRRRRSS",
+"SRRQQPPOONNHCyputmqquuutupwywyxxwuuqqqquuuyEEEBAEEIKKNOOPPPQQQQQQQQQQQPPOPNNMMKIHHEEDDDDABBBBABEEEBAywwtpoic9531<//~),>-**%%&#@@#@#$$$%%*->>,,)~////<<|||335999cffifiiililopptyyAABEEEHIIKMNNOOOPPPPPPPPPQPOOONOONMMMLNNOONONNNOOONNNNNNNNNNNNNOPPQQQQRRRSSRRRSS",
+"SSRQQPPOOONKEAyttmmqquuuupwwAAyxwuuuuqqquuyAEEBBGEHIMNOOOPPPPQQQQQQQQQPOPOOONNMKIIIHEDAAABBEEEEEEEEBAAwwpoic953|<//~),>-**%%$#@@###$%$%**->>,,)~//<<<<||3335599cfffffiililooptyyAABEHHHIKMMNOOOOPPPOOOOPPQPOOONNONNNNMMNOONMMMNOOOMMNMMMNNNMKMMNOPPQQQQRRRSSSSSS",
+"SSSQQPPOPONKJEAttmmqmqquuwwwAAAzyxuuuqqqquxyDDEEBEHHKNNOOOPPPPPPQQQQQQQPPPPPPONMKKIHHEDAABBEEEEEBEEBBAwwtplf953|<//~),>-*%%%$##@###&%$%**->>,,)~//<<<|||3335599ccfcffiiiilopppwyyAAEEEHIKMNNOOOOOOOOOOOPPPPOOONNONNNLMMNONNMMKNOOOMMMKKKKMMMMKKMNOOPQQQRRRRSSSSS",
+"SSSQQPPOOOMKIHEwutqqqmqqwwwwyAAAAyxxuuqquuwyyABEEEHIKNNNOOOOOPPPQQQQQQQQQPPPPOONMKKIHHBBACBDEIHBBABEBAywtpoic95|<</~),>-*%%%$##@#$$&%%%**->>,))~~/<<||||||3359cccfcffiiiloopptwAAAAEEEEIIKMNNOOOOOOOOOOOOPPOOONNOMMMMKKMNNMMKKKNOOMMMKIHHKKMKKKKMNNOOPQQRRRRSSSS",
+"SSSRQQPOONMIIHHAwwwqqqqttwwAyzAABAxxxuuuuuwwwyABEEEIKMNNNNOOOOPPQQQQQQQQQQPPPPOONMMIIHEEBCCBEIHBAAAABBywwppif953|<//),>-**%$$##@@#$&%%%*-->,,)~~//<<||33333559cfffffiillloopttwyAAAEHEEEIIKMNOOOOPOONNOOOOPOOONNMMMLMIKMNNKKKKKMNMMMMKIEEJHIKKIKKNNNOOPQQRRRSSSS",
+"SSSRRQQOOMKKHHEEywwwyywtttwAAzzABAzxxuuuuuxwwyyAEEHIMNMMNNNOONOOPPQPQQQQQQQQQQQPOOMKIHHEGBAEEHEBAAAABAAywtplfc53|<//)),--*%$$##@@#$&&*%*->>,))~~//<|||3333559cffiffiiilllopptwxAABBCEHHHHIKKKMMNOOOOOOOOOPPOOONNMMMMKIKKMMKKKIFMNMKKKKIHEECGHHIIKMNNOOOPPQRRSSSS",
+"SSSSRRQQPMKFEGCByywwwywtppzAAzzDEBAzxxuuuxxwwwyABEHIKNMMMNNNNNOOPQQQQQQQRRRRRQQQPPONMIHEEEEEEEEEAAyyAAyyywpoic95||//~),--*%$$##@@@$&&**-->>,))~~/<<|||3335599cffffffiiiillooptwyABBEEHHIIIIKKMMNNNNNNNNOOPPPONNNMLLMKIIKMMKKIFKMNMKKMKFHEECCCEGHIKMNNOOOPPQRRRSS",
+"SSSSRRRQPOMMIGAzAyyywwwtuxwxzAAEDAAAzyxxxxywtuwDBEHIKMMMMMNNLNOOPQQQQQQRRRRRQQQQPPPONKIIIHHEEEGBBAyywwywwwtpif993|<//),>-*%%$##+@@$%%*--->>,,)~~/<<||333355599ccfccfgfiiiiloopptwAABEGHIIKKKKMMNMNNNNNNOOOPOOONNMKLMKKIKMMKKIIIMMKIKMKFEEEzzzzCGGIKMNNOOPPQPQRRS",
+"RSRSRRRQQPONMICAAzyAywwtxtttzABEEEAAAAxxxzyxuttxBEIKKKKMMMMMNNOPQQQQQQRRRRRQQPPOOOOPONKIHIIIHHEEAAyytwwttttplfc953|</~),>**%$##+@@#%&---->,,,)~~/<<||3|3335559ccc9ccffifiiiloopptwyABCEHHIKKMMMNNNNNONOOOPPPOOOONLMMKKKKMMKIIHFKMKIKKKFFFEzzzzzzEEHHKNNOOPPPPQQR",
+"RRRRRRRRQPPONKHBzAzyAyzywttxxAEEEEEAAAAyzAyxutuxAEIMMKKKMMKKKNPPPPQQQRRRQQQQPPONNONOONMKIIKIIHEEBBAwttwttppplfc953|<</~),>--%$#@@#$&==--->,)))~~//<<||33333559ccccccdfffiiiilnrptwyyAEEHHHIKMMNNOOOOOOOOOOPPOOONNNMMKKKMMMKIHHFKMKIFKKIFHEzzzzzzCCCGGINNOOPPPPQQ",
+"QQQRRRRQQQPONMIEAzAzBBBzywxxuzBEHDEDAAzAAAAxuuxyABIMMKKKMKKKKMOOOOPQRRQQQQPPPPOONNNMNNNMKKKKKIHEEEBywtttpppolfc953|<//~)),>>-%%##$&&*-->>>,))~~~~//<<||3333599ccfdcffcfffiinnrpttwyAABEHHHHIIIKMMNNNNNNOOOOOOOOOOOOOMKKMNNKIIHIKKFFHIIIIHEBzzvxxzCCCCGHKNOOOPPPQ",
+"PPQQQRQQQQQPONKHEAzAABEBAzxxwDAEEHEDAAAAEBAxxuxxzEIMMMKKKKLKMMOOOPQQRQQPPPPPPPPOONMMKMNNMKIIKIIHHHBAytwtppoolic953|</~~),>>-*%%$$&**;>,,,,))))~~~//<<||335559ccfccfffffiilnlnpptwyyAABEEHHEEHHIIKKKMMMNNNNOONNNNOOOOONMNOOMIIEEHIIEEIIIHIIBzzzxwxyzzCCCEKMNOPQPP",
+"POPPQQQQQQPPPONKHEAAyAABBCAxwyAAEDEAAyzAEECzxxxzAEIMMMMKKIKKMNNOOPQQQQPPPPPQPQQPONMMKMNNNMIIIIEHEHEBAwwttpoolif953|</~),>>-*%%$###%=;>,)))))~~~~//<<|||355999cccccffffeiiiloppttwwwAAAABEEHGEGGJIIJIKKMNNNONMMKKMMNOOOOOOONKIEEHIHBEHIIHIICzzzwwvvvvyzzCCIKMOPQP",
+"POPPOOOPPPPPPPONMKHAzxzzBBCzzyADEDDBAyAzBEEAzxxzAEKMMMMKIIIKMNNOOQQQQPOOPQQQQQQPPONMKKNNNNKIIIEHEEBAyywtwppoolic933|<~))>--*%$#++@#%*-,,))))~~///<<||33559cccffccffcfeiiilloopppptwwwAABBEEEHJHHIIJIIKKMNNOOMKIIKKMNOOOOOONMKIIIKIGCGIIEIIEzzzxvvvvvvxyzCCELNOPP",
+"POOONNMNOOOPPPPOONMHAxxyzAACAzADDDEBAzAABCCBAzzzAEKMMNNKIIKKKMMOPQQPPPPPQQRRRRQQPPONMMMMNMMKIHHHHBAAywtttpooolif955||/~),>-*%#@++@#$%=->,,,,))~//<||335599ccfffcfffffiiiillllmmooqssvyADBEHIIHIIILIIKLKLMNNNNMKFIIIKMNOOPONKKIKKMKHGGHEEHIECzzvvwvvwwvxyAzCHMNOO",
+"OOOOOMKIKNOOOOPPONNKBwxwxzABCzAABBAAAzAACEBBBAAzBHKMMNNMIIKKMMOOPQPOOPQQRRRRRRRQQPPOOMKKKMMKIHHHEBAAAywtpoolllifc9953|/~),>-%#@+++#$%%;>>>,,,))~/<<||335559cccccffffiiiijliiiiillmqtwwDABEHIKKKIIMKKKKKKMMNNMMKKKIIKMMNOPPNKIIIKMIHEGHECEHECzzxxwvvwvvwzyyzCIMMN",
+"NNOONKIHIKMOOOOOOONMIBwxwwyACCCBBEAyzAzAEEAABBBBEIKKMNMMKIFKMNOPPPONOPQRRQRRRRRQQQQPONKIIKMKKIHIEEBBByywtpoiiiffc9553|</~),-*%@+++@#%&=;>'>,)))~/<<<||33555999ccfffiiiffffgfggkkmmqptwyDBEHIIIIIIIIIKKKKIKMNMMKKKLKKKMMNPPOMKHEIIIEEGJHHHHICCzwwvvrrrppwyzzCGHKK",
+"MNONKIHJEHIMONNOONNMKEAAxxwzACBCBBAzzAzBEEBAABEHIKMMMMMMKKKKMNOOOOMNOPQQQQQQQQQQQQQPPOMKIKMMKIIIHEBAAAyttpoiiifc9953|<</~),>-%#++@#$%**;>'',){~~//<|||33355999ccfffffccfccccggkkmoqqutwyABBEEHHIHHHIIIKKKKMMKKKKKKKMMMMNOPONMIHIIHBCBEIJIIIECzxwvqrrrrrssxzzGGEI",
+"KMMMIIHEEEHKKNNNNNNNKHEAzwxwyCBCBBAAyABBEECAAAEIKNMMMMKIMMMMNNNOOMMNOPQQQQQQQPQPPQQPPONMKKMMMKKKIEBAAywttpoiiifc995|<</~),>*%$@+@#$%%*->''){~{///<<||||3555999cfcccccccccccgggimmpquutuwyABBEHHIIIIIIKMKMMMMMKKIHIKKMMMNOPPOOMKKIHDzABEEIIIHGCyvvqrrrrrsssvzBCCE",
+"EHIIIIHEEHHEHKNNNNNNKIEEAAwwwyACBCBBzCCGEBzACAEINONNNMIIKMNNNNOONKMOOPPQQQPPPPPPPPPPPOONMMNNNMMKIEAyywwtppoiiffc9953|<~),>*%$#+.+@#$%*>>)!~{/(/(<<|||3355599ccfccccc9cccccgggkkmmqqqqutuwyBEEHIKKKKKKMMMNNNNNMKKIIIKMMMNOPPOOONNKIDzzzACEIHHHEAAussrrrrssstzBAzC",
+"CHHGCEHHHHEEEEIMNNNNMKIEBBzwwwyABCBBBCEHHBzzCEEIMOONNMIHKMNNNOOOMMNOOPQQPPPOPOOPPPPPPOOONMNNNNMKIEAywwwtppoliffc953||/~),-*%$#+..+##$&*>,){~//<__|||335559ccfccccccccfcccfggilmoomqquuxwyAEHIKKMMMMMMMMMNNNONNMMMKKMNNNOOPPOOOOOOMEBAzAzBHEEGEEBwtsummmmssswCAvz",
+"CEECCBEEBBBEEEEHKNNNNMKIEBBAwwwyAACBEEHIIEAAAEHINOOOOMIFIMNNNOOONNOPPPPPOOOOOPOOPPPPPPOONNNNNMMKIHBywwwttpoliifc953|</~)>-*%$#@++@#$%&*>>,!)]~(((<|2335999ccfffffffffffffkilooooppptwxzACEEHIKMMMNNNNNNMMNNONNNNNMMNNOOOPPPPOOOOONIEABAABGEEEEEBwwummqqmmmtwwzvz",
+"ABBAzCABBAABBBBBEINNNNMKIHEEAwxwxzzzBEHIKHBBBEKMNOOOOMIIIMNNNOPOOOOOOPOONNOOOPOOPPPPOPOOOONMMMMKIHEAywwwwtpliffc933|</~,>-*%$#@++#%%=*=>>,!~{](/__<|335999cccfccffffffffiiloloppptwzAABEEEEEHIKKMNNNNNMMMMNNNNNMNMMMNNNOPQQPPPPOOOMHEBEEEHGCCEBzxxwuuuqqmmqwwtwv",
+"AAAzwwyABAAAABBBBEIMNNNMMKIEEAxwwwzzyBGHIHEEAEIMNOOOONKIKMNNOOPOOOONNNNNNNNNOPPPPPPPOOOOOONNMKMKIEEAywwwwwtplic9553|</),>-*%$@+.+@$%**->,'!!~]/<__135999ccccccccfccfccdfiilllopptwyAAAABEEEEHIKMMNNNNMMMKMMMMMKKKKMMNNNOPPQPPPPOOONKIHHHHHGCCBAwttquuuuqmmqquspv",
+"wwusuwyAABAAAAAAAAEIMNNNMMMKIEAzxwzzyyAEHEEEAzEKNOOOONMKKMMNOPONNOOMKKKMMMMNNOPPPPPOOOPOOONNMKKKIEEAywwtwwtpoifc993|</~),>*$#+. .+@$&%=->,,']/<<<1|5cfffccccffffffffcdfiililoptwwyyAAAAAEEEHHIKMMNMMMMKIIKIIIIIHHHIKMMMNOPPPPPPPPOONMKHIIKIECBBwtuqquuuuqqqqqssu",
+"wwssstwyABBAAAAAABBEIMNNNNNMKIEAAyzAyyAEEEEECABHMNOOONMMMMMNOPONNONKIKKIKMMONOPPPPPOOOPOOONNMKMKIHEBAwtpttpoliffcc93|</~,-*$#+.  .+#$%&->,')]]_1||79filiffffiiiiiiiiiiilllopttwwwyyyyyAEEEEEEEIKKMMKKKKIIHHHHHEEEEEHIKKKNOPOOPPOPPOONNKKKMKIHEEwtumqquuuuuuuqtsw",
+"wwtssttwyAAAAAAAABBBEIMNNNNMMKHByzyAAAAEEEBBAACHKMNNNMMMNMMNOPOMNNMKIIKFKMNOOOPPPPOOOOOOOOONNMMMIHEBAwtpppplifcc99953|</~,-%$@.  .+##&%*;>,')]_<1359dfifcfiilllliiiiiilloopwwwwwwwwyyAABBAAAABEIIKKKKKIIIHEHHGEBBACBEHEEIMNMNOOOOOOOOONNMNMKIHEAwtmqquuuutxxqmtw",
+"uqmmmmstwyyyyABAAAAABEIMNNNMMKKHEywwwyyAABBBBBBHKMNNMKKNNMMOOOONNMKIKKKKMNOPPPPPPPPOOOOOOOONNNMMMIEAAwtpppplfc99553333|</~,>*$@...+#$&%*;>,')]_<|359900009dfiiiiiiiiiilooptwwwwwwwwwwyywwxxxzzAEEIKKKKIIIIHIIHEBAAzzCABEHKMKIKNNOOOOOOOOOONMKIIByuquuuomnpzyuqqu",
+"uqmmmmmmswwtwwAAAAAABEHKMNNNMKKKIEAwwyABAyyABEHIKMMMKKKMONNOOOONNMIJIKMMMNOPQQQPPQPPPONOOOOONNMMKIEAywtpppolif955||<<<</~~),>*%#@@#$%&**-''')~(<}357527755799ccffffilloppttttwwttppttwtttutxxxABEEIIKIIIIIIKKIEEBAAAyAABHKMIHIIKMNNNOOOOPPONMKKEEzyyAtrnnrtzxuuu",
+"uqmmmmmmmsttuuwAAAAABEHHIKNNMMKKKIEAAABEBAyAEHIKMMKKKKKMNOOPOOOONKIIKMMNNNOPQQQQQPQPPOONNOOONNMMKIHAAwwpppplifc95||<</~),,>-*%$##$%*;>>,,))!~](<|35772447777709cccfiiopptptttttptppppuwwwwwxwyyAEEEHHHIIHHIKKKHEEEEAABBBHMNMIIIIKMMMNOOOPPPPOMMIHEEGEytnlopxxuux",
+"xqmmmmmmmssssstyAAABBEHHHIMNNMKIHHHEBABEEAAAEIKNMMMKKKMMMOPPOOOONKIIKMMNNNNOPQRQQQQPPOOMMNNONNNMKKIEAwwttppoifc953|</~),>-*%$#@++#%*>,,~~~~///<|2552243277777090ccgiloppopttttppppppptwyywwwwxxADBFFHHIIIHHIKKIEEEEABEEEHMONMKKIIKKKKNNNOPPPPOOMKEEHHEwprptxuuxz",
+"xuqmmmmmmsssssswyABBABEHIIKNNNMKHEEEAwwAAywwAEMNONMKIKMNMNPQPOOPOKIIKMMMNMNOOPQQQQPPPONMKKMMONNNMMIHBywwttpolic953|</~),>-%$#+. .+@$=-,)~//<<11555575a7657509099cgfiooolopppppoloppptttwxttuuuuyAEEEEEHHHEEHIIIHEEEBEEEEHIMNMMKKKKIIIKKKNOPPPOOONIHEEEAtpptpuuxy",
+"suuqqmmmmpspssutwABEBAAEHIKMNNNMIEACAwwwwwwwyBINOONKIKMNNNOPPOOONMIIIIIKMMNNNOPQQQPPPONMMKKMNNNNMMKIEAywttpplic953|</~),>*%$#+.  .@#$*->,!~]<149999909a888999ddcffilollloppooooopptttppprqpuuuuwDEFEEEEEEEGHIKIIIHHEHIIIIIMMMMMKKMKIIKKIKNPPPOOOOMKHEEBwtttppppt",
+"pnuuqqmmmrssusttyABEEBAABHIKMNNNMHEEEBywwtttwAEMOOOKIIKMNOOPPPPONMKKIIHIMMNNOOPQQQPPOONMKKIKMNNNNMMKHEAwttppoif953|<//),>-%$#+.  .@#$%-->,)~/<|56596999cdccffggiilooliloppooloptttutpollqrqruquwAEBBDBDDABEIKMMKKKKIKKMMKMNNNMNNMMMKKKKMKMNOOOOOONNMIHAwwwwtpppp",
+"njnquuqmmsssupuwBCEEHHHAABHIKNNNMKIHHHEAwtuttwBINNMIIIIMNOOOPPPOMMMMIHGHIMNOOOPPPPPPOONMKIIIKMNNNMMKIEBywppooifc53|<//),>-%$#+.  +@#$%-;;'!](_||322565599gfffiiloppolllppplooptwwtpollllprprqquwABAAADDAABEIMNNNMMMKKMMNMNOONNNNNNNMKMMNNMOONMNNONOONMEwtwwwtppp",
+"njhqqquqqssspuwACBBBEEHEAAEHKKNMMMKIIIIEypopptyEKKIEEHIINOOOOOPONMMMIGEEHKMOOOOOPPPPOONKKKIHIKNNNNMKKHEAwtpollic953<</~,>*%$#+. .+@#$*=;>,!](_<}}|346769099cfiiooppoilpttppoptwwtpplllooprrmqquyBADyDxxyAAEIMNNNNMMMKKMMKMNOONNNNNNMMMOOOOPPOMIIIMNONNKAwwwwuppp",
+"nhjjmqquwttpsvwzABAwwyABAABEIKMMMMKIHEHEBwtptwAEEEHEEEHIMNOONNPPNMMKIGCCEFKMNNOOOPPOONNMKKIIHKMNNMMKKIEAwtpollif993|</~)>-%$#@...+@#%=-;',](_<|:|||776599989fiilooliiotwtttptwwttpooooollqrqquuABADxtuxxzAEIMNNNNMKKKMMMIIMNNNNNNNNMNNNOOPPQPOKIEHKNNNMIEBwutwtq",
+"pjhemmqqwwwuvxwtwywtutxAAAABHKMKMMKKHEAABywptwAEHEEHHIIIKNOONNOONMKIHGCCBHIKKMNOOOOOOONMKKKIIIMNNNMMKKEAywpollifc953</~),-*%#@+..+@#&=;>,)](_<1:}|4114700099filoolffiotttppttttppoopooolnqqvvuxABDxuuuxxxzGKMNNMNNMMKMMMHHKMKIIKKKMMKNNOOPQQQPNKGEEIKMMKKIBxuwxu",
+"qnjhmmmqwwwwypsuwywtpqtwyAAAEIKKKMMMKEAAAtpptwAEEEEEIKMKMNOONNOONMKHEECCBGHIIKNNOOOOOONMMKKKIIKMNNMMMKHEAwtplliifc93|</~,>-%$#+..+@$&--')]((<<_1}|114770799cfilolfffiopttpppopoooopoolmllrvrruxEBzuxuutwwxBIMNMMMNNNMMMKEHKKKHEEHHIIIMNNOOPQQQOMHEEHHHIIKMKBywxx",
+"uppnqqmmtwwwxtsmquuqmmmmwyyyAEIKKKMMMIEBxqoputyBBAABEKMMNOPONOPOONKIEEEBCGHHIIKMNNNOOOMMMKKKKKKMNNMMMKKEAywpoliifc953</~),-*$#+..+#&%;;,]((<<:<||1114770770fioollffgkpppqppooigllooolikilrprruxEBwuxvstwwxzEKNNMKMMMNKIIEHKMKIHEHHHHEHKMNOPQQQPOKHHEEBAAHKMKGCAx",
+"utttxuquttxwqqqmquqqmmmmmwywwyEIMKMMMKIHAqmmuuAAAwxwAEIKNPPPOOPPONMIEGGECBHFFIIMNNNNNNMMKMKMMKKKNNNMMMKIEAytpliiifc93|/~),>*$#+..@#&=;>,]((_::<|_114470770dflooiifcgmppppqpoiigglmolikjiimmnruwAAxussvvupptyHMNNMKKKKIIHHEIMMKIIIIHEABIKMOOPQPPONKEEEAtuwEIKKKHA",
+"AwwyAAxwwuqqquuqlnnjmhmmmqwwwwyAIMMMMMKKEumlptABywttyAAHMOPPOOPPONKIJECCCEHIIIKKKKMMMMMMMMKKKMKKMONNMMKIHBywpoiiffc953|/),>*%#@.+@#&=->){((___<|__14770070cilpliggdflpppppplggggkoolikikjnmmqqwAAxsstunqqpptyEKNMMKIIIHEEEIMNMKIIIIEAAEIMOPPPPOOOMIHEAumotAEKMMH",
+"HBAABAzAyqqqqnorooonjemmmqqwwwwuAIMMMMNMKApopwBEAwtttyyBINPOOOPPOMIIHGECCEGIIIKIKKKMMKMMMMKKKKKMMNONNMMKHEAytpoiffc953|<~),-%$@++#&&->'!{(((___|__1477770dgimoliiddglloppoigggggkkolikjkkmmnqqtwyzutvoonoppttyEIIKKKIIEEEBEKNMKKKKKIEABIMOPPPOOONMKKKHwolootAIMM",
+"KHEBCAyxuuunnlmmmmmkifjjqqpwywwquCIMKMNNMHytpwBIHAtttwyAEMOONNNONKHHHJGBBGEIIKIIIIIIIIMNNMMKKKMMMNOONMMKIHBAwpoiifc955|</),>*$#++#&*->!{{(((__<_[_1}23246dklopmliddfiilllifc9agkkiollillknqpuuuwxxwunnoookkmqwABBAEHHIHIHHEIMMMKKIIIHEEIKOOPOOONNMKMMKEwpojipyIK",
+"IIIHEAzxxrookkmmqqqmkgjjjqquAyywqwBIKMNONMHAwtBKMHytuwyyEINNKKMMMIJEEEGBCEHHHIIIIIIIIIKMNNNMMMNNNNOONNMMIHEAytplifc995|</),>*&#++#%*>'!{{((::___[_1}34226bkmppoliddciiigifc9a8akmkkollllmprsuuuuxwzxrnnkkkkmmqtwywwyyEHHIIHKMMMMKIHHEEEIKMOOOOONMMMKMMKAwpiiipyG",
+"zEIMICztppmkkfjiloppmkkjjquwAAAyuuyEHMNOONMIBAEMNKBttttwyHKKIKMMKJHEBEEECCEHHHHIIHHIIIKMNNNMNMOOOOOOONNMKIEBywpoifc9953|/~)>-%#+@#%-''{{({](<:<__:<}3222adjouuqligd9fiddddd9aaakmkglolmomrqpuuuuuuyttqkkmmmmmmtwuqtutuAAEEEKMNMMKIHIHEEEIKKNOOONNMMMMMKIEApfhlpx",
+"uyEMMJAwqqmjeecbcfopomkgjnwwwAAAuutABHMNOONKIHIMNNHwppptwEIIEHMMIHHEBCBCEEEEHEHIIHHHIIIKMNMMMNOOPOPOOONNKIEEAwtolicc953|<~),;*$@@$=;,){(~/]<:<:___:}422269iotwtmig9acgddgdd0788cmkgloooomqqqqsuvuswtwtmmmmkjmmuwuqmmppuwwyABIMMMMKIIHEEEIEIMNONNMMMNMMMKIIAoooop",
+"mpwHIKHzuomiec9abbfiolkggluuuwyAAtuuyAHMOONMKKKKMMHypqptwEIEEEMNIEBEEAABEGEBEHHIHHHHIIIIIKMMMNNOPPPPOOONMIHEBywpolfc955|</),-*$@#&=>,!~(](/(:<::__<}211179iotxwpmg9a0ggggfd07a8cmkggoooooqrmqquurrtpwtuqmmmmhjuwwuqmmmutuwwxCIKKKKIIEEEEEEIIMKKKIKKMNNMKKKIAttpm",
+"mmpwBHIEApmkifba88beinikglnqquwyAwuuutyEMNNNKKKMMMIBtomqtEIEEEMMIEABEBzAEHEBBHHIIHHIIFIHHIKMMMNOPPPPPOOOMKHEEBytpolfc953|<~)>;&##%->))~(]//<</<(::}|111147fmtyywqkc90dgfgd0077ackkgglopppqqrqquuqvnrtqpupqijloptwwuqqqqwwwwyzEEEJHHHHBBEEBHKKIHHEBEKNNNMMMKIEBwu",
+"tmpmuACHEwpmlgcaaa89fiokkkoqqqwyABwuqptzHMNNKKMNNNKHypmmtAIEEEKIECAABBAABHHEBEIFHIIIKIIFFHKMMMMMOPPPOPOOMKHEEBAwtplifc995|<~,>*%%*;,){/]/</_<<<(_:}1|11147dltwzAwnfd0dggca00009dfmkhnlppppurquuussopqmmquppppptyAwtxuuuuuAAAAEEBCBBEEEBBAABIIHEBAAAEKNNMMMMMKMHA",
+"BwqmoptAEEyolifca668ciilmmonqqwyAAyxuoptzIKMMMMNONMKBwqotAIEEEHEEEBABBBADEIHEEIIIIIKKKKIIIKKMMKKMNOOOOPONKHEBBAwtpoifc9953|<~)>**;,)~((/::<<<<<_::11211147dipwAAztlgdddccca0008aemkklooputxussuuuuorpkmmqoppptwyAyttpuuuxxxxCEEEBBAABBBAAwAEHEywwwyAEKMMMMMMMNMI",
+"KGzpooptAEBwpiif9a6aceiinqpnuuxAAAByxtopxEIKMMMNOONMIAwqtyHHEBEEEEEBABEEEHIIHEHKKIIKKMKKIIKKKMKKKMNNOOOOOMIEEAywwtoigc9953|</),--,)~/_|<||||1__<}|2|4411470gmtyCBypkgbdfgfdd008bbmmkkonpptywwttusuvookkmmlnoopptwwprolluutuuzEHEEEAzAwtwwwwBHEypppptwBHIIMKKMNNN",
+"NKEwpoolpyEEyplifd866fiioqqpxzAEEEByxwppuAEIMNNNOOONKHAttyHHHBEEEEEByAAEHHIKIHHIIIIKKKKKFIIKKMKKKKKMNOOPONKIEAyywtplid995||/~)>-;>)~/(_||||1||__}|14434}470dkpyzEAzulfhffffgdddabmmmkkorppwyyxwuustprmmmmiikillmptplnjinqqqquAEEBEAwwwptttwAIHAtlilptwyAEIKKMNOO",
+"NMIBwpiiiowEEAtliff98biilotwwAEIKIHEAywptyBEKNNNOOOOMKEywAIKIEHEEEEAAyAEEIIKKKIIIIIIFFKIIHIIIKMMKKKKMNOOPOMKEEyywtpoifc0531</!'**-,)~/_<|}|||<__:<|2442}}470dlpwABAAtoifcffggdhbbkmmmkgoopuxyzywwuuppummmeefefgkopmkijhijijquyBAAywttuuuppowHIAwpliloppptBEIIMNO",
+"NMKIBtoifipyEEApliifeciijotwAEHIKKKIBAytwyBEIMNOOOOONNKHBEKKIEHIHHBAAyAAEHKKKMKIIHIHHIFIHHHHFIKMMLIKKMNOOOOMIHByywtplif9771<({'==-,!~/__|||___(__:_1442}}2770diqtyAzytplffcgggifkkmmmkklmoptwyAAAyxtttmmkkehbhgkmpplkgheehjjnpwwwwwqquppollpAEBytoliloliitABBIMN",
+"MMKIEAtoffipyEEypliiifiiilpwBIKKKKKKIECwwAEEHKNOOOONNNNKEHKMKEIIHEEBAyyAAEHIIKMIHEEEHIIFFHHHIIKMMKKIKMNOOOONKIHByytpolic054|(~';=>,!~/<_|}|___<_<:_<1422}}2770cilpuxwwwtplifggikmmmmomkoloouuwAABAAAwtmkkkbbbcdgmtplggddeijjnpwwvttqmoollllltABAwpoiillfflttyBIK",
+"IKKIEAwpicccmwBBxpllliillootBIMMKKKKHHEAyABEEHKOPPONNNNNIIKMMHEHHEEBAywwyAEIIIKKHFEFFEIIFHIIKKMNNMKIKMNNOOOOMKIHBAwtpolid571_/';=;,)~/_<|}|<1<<__((<14222227770bhkmoptttupolkgjimmqqqqmkllmmppwAABBBwupkkkbbbbdglpumgddddgkknpxzwwwqlolnlifipyAAAwpolllifioopyBH",
+"BHHHEEAtof57dipyypoiiillllotzHMNKKKKKKEEABBBEEINPPPONONNMIKMKEBEEBBAwwtttwAHIIKKHBBEEEFIIIIIMMOONMMKIKMNOOOONMKHHBAytpoifc96}_!;=;,~/<<||||11<|__::_1}222227777abdgekloptttpqmlimmqpqqqknnnorppwyAABwtpkkkkbbb0glppmgdddggmmmuwAAywtolnllecclwAAAywpoopoiiiiltyA",
+"twBEEEByti0730gmutpiiiillilotCKMKIIIKIIEEBBAABEKOPPONMNNMIKKEEDAABAywttpptyEIIIKHEABAFGHIIIKKNOONNNMKKKMNOOOONMIHBAAytpoif952_!-;'!~/<<|||21|1|__:___}}22227777880888bfioopputpoqmmmpqqmomnnrppuwyAzAtpmkgkhcb0dkoqmgdddgkmmmqtAAyywooooif98fotyywwtpopplifcioww",
+"optyBEBAxqf5347dltwoiiiiliifowEKKHEAEEHHEEAyyAAHMOPONKKIIIIIEBAAyABAwtuuqutAIIIKIHBAzACFHIIKKNNOOOOONKKMOOPOOONMIHBAywtpoif97:);;')~/<|1||3114|<1:[_[1}12267000a0aaa66aadfloqutttppommmmprnoopqpwxwyywtpkkkfehddkmqmggggkkkkkmqtwwwpolollic89ilotwwwtqptpoiccipp",
+"oilpwABAAuld3||7dlutoiiiififioyEIJAwwABEHEBywwwAINOPNIEHHHIIEAyAyABAwqprpptyEIIIIHECzAABEGHIKMNNOOOOOONNOPPPPOONKIHBAywttlif5}{';'~/<1|1453442|11::___:[}227000bdaaaaaa6a8cfkmutwxtuqmmmqprnnopptwxxzzwtmmmmheedgmpmkbcfffbbbeipttopllillif99fcipyywtpopmpof9flp",
+"liilptAAAyuid7|47dmwtoiifffbilwAEEAtppxAEEEAwpwAHKOOOMHCBEIIIBAwwAEEwqmprptwEHHHJHHBzzzzABEEIKNOOOOOPPPONOOOOOONMKIEEAywtpol92[,'!~<<|347555333311:___1:[}47770008a6aaa66a0adglowwyxuupmpppronpppwxxwywwtmmqjjedgmoojeeehbbbbhfoooooljfiiifccddcowywpilommplccil",
+"iifilptyAAytmf0770itzwpliiifcipwBEypolqtwBHEwppyEKNOONKBABHIIEyywxAEwumpqqtwAEHHEHHECzzzzzCCGKNOONNOPPQPONOOOOOONMKIEEAywtpof7}!!~(||355055957|211}}__1}[}447787066aaaa8668a0degmuwwxwwuttppqrqppwwwxxywwqqpllidgkmpjffhfb9bhbfiopooofccffcb50ccitAypiglllppiffi",
+"fifiioqtyAAzwpmd77dmwAwmgiiiffotAAwtoiilpyEIBtotAIMOONMHyABEHHAtwwyBytqppruwAEHHHHHHECzzzzzCCGKNONNNNOOOONONOOOONNMKHEBAAwtpi93:~/1435990999577314}}1111}44247a76222666a6868ddbkkmquuwwwywttpprrqxxxzxwtwpqqqonggkmqljfeea8bbb8elponifccccc770dcfpywoffiiklpolii",
+"iffiiimptwAAAyulc0dkuAAwoimoilotwwtplifcipAEIAtpyHKNOONKBwyzEEBxwwwAxwutrpptyEHIIHHHHECCACzCCBHMNNNMKKKMNOONOOONONNMKIEBAywplc|:~<|7599cddcc099544}22114244477776}22226a66a8ddekkkkmmquwAzywwupqqwwxzyxttwuutlliggmqoiiheb8ba88clpoolibcccc5750dfltwofdfifimpppl",
+"iccfffgouwABEEBwpifipwAAwpppqppwyytpplffeioyHIAttBIMNONNIywAAEAzxtuwwwuwsrpuwBEIIHEEEEGBCCCAABEIMNNMIIHHIKNNNOOONNNMKKHEBywpid3]]<|5559ccdfcc9a90772244444477776622222226268ddekkkkkkmmqwAAAywttpwwxzzzytwquuojigkmooljieb8a888ciopoli999cc95|399fowpf9cfdglotwt",
+"ofcfiiiotAAEEHHEApliipwAAyttttpwAytpppliccipAIIytyHMNOONMEwyAEBAwwwzwxuytprptyBEHIEEEEEEBAAzAABHKMNKHHHEEGIMNNONNMNMMKKIEBypli5::|35099dfdgbc0d9975224477777787a2222[}22622a00bkkkkkkkmmtwyAAAywtwwvxzzzwuwqtuljkkmmoliifb678889fopliic88c097||59clwwofcfccilqww",
+"wlfiopootyAABEHHEwpiiiowAAytututyytolopoiiiltHKHzwEKNOOONKAwAEEAyyAzwtuwwtrrpwABEEEEEEHEBAzAzABEEMOMIEEEBGGKMNONNMKKKKIHHEAwpic4}6599ccfffgfc0dd9706657777777776222}1}16666800bkkkkkkkmmpputAAAAyAwwxzzyytuquuoojkmmooiihc666888elpllic9999951|45clwywpif99cgipw",
+"BypopppoptwyyAEEEAtmifglwAAtpqptwAwlcfiooifflwIIEABKNOOOONIAABEEwyyAwuuwywpppswzAEEEBEEHEAzyzzAAEKNNKEFEBCCIKMNNNMMKKKHHEEAtoib5|609cgiiiliiecdd0000675777708066266}2226a66800bkkkkkkkmmqpuqwwAAABAzzxywyttqquppoklmqoljheaa68aabjplllic99055|||5fotyAwoi9599glw",
+"EEypoppplotwwyAEEAwplf99itzypompwAwofcfqoliffoAIIEAHNOOOPOMHABHHBvxwuuutxwtppptwwAEEEBEHECyyvwwzBHMMMIEECCCHIKMMNNMMKIIIHBAwpi81_}599fgiklliifgd9c006665500cb0aa6a4242228aa8dehkkkkkkkkprqrsstwyACBAAzzvxxttquxppmmoppojifb666aabfolloic99575|1|5iptyAtoic509clw",
+"AEAwpoppootwAAABEBAyulf99iwzwpllpyAtf9ioolkdfipAEByBKOOPPPOMHBHKHytwtuquttwtqqtwwyAEEBBEHEAytwwyAEIIKIEECCGIIKMMMMMMMMIIHEAwpj82_|290cggiiiiifdcdc90d0899bcfdgc9807a666a8a8bghemkkkkkkkrrrqpuuutwBEEEEAzvxtwquxttpmppppniee866a88elllllf997553115iptwAtliiccfilp",
+"pyAAtooppopyEEEEBEBAwpf979iuxulgipyti9ciolffcdipABAwENOOPPONMIHKKBwppuqqutuqmmpswwyBBEBEEHEwxwwwyzABHHEEEEHKMNNMMMMMKKKIEEAwpj9}}478dcggfiiiifdchd00d09cdfffggeff9b99999fccfhjmmmmmmkkkprrrpruptyAAGEHEzxwttquutttqqttpojfeb668a8ciillif885553335fpwABApoooliigi",
+"otwwwpoppptAHIEBAAAzwpg5413guuogditwlc9cillfc0cipyAyAINOOPOONKIKKIAtppopttupqmmqqwyABDBBEHEzxxwyuxzAAEEEHHIKNOONMMMMKKIIHHBwpj8}[458ccfgiiiliifhfffdggcfffiigffffcc9dcccffhimnqqmmmmmmprqrrrrrqqwvzCGIIECzwttquupttttxwplfehb6a88bfllliic885557339lwABEAwwtoic9f",
+"loppxwtpptwyEHEyxwwwwpk0|<_4gqpicfpwticcktttld9dltAAAEKNOOOONMKIKIEwttppppptqmmmquuyABABEEEByxxzuxyzzAABHHIIMNONNNNNMKKKHHBwulb}[659cffiiilllikiiiigkkfffiiigc9cc8956aa9bfgimouuqqqqmmpprpprrrrrxxzzBIKHGAzttqqupptuwwwtnifhbb6a8aclloiic9959994}6ftwAEIHAticccf",
+"filotAAtpwwwAEEAwwpppqmd4_/<9kqofcmyApifoAAAwof9iqwBAAHMOOOONMKIHKHAwuttttttpolmquuuwABAABEEAywsuxxyxwAAFEGHKMNNNOONNMKKKIEAtqc6}6addfgiillolllmlilikikffffdd96622|2327689ahknqquuuuqttutrrrrprtvwxzAEIHHEAttuqquppuxAzypjfhbbb888bioollfc909954[3cpwAHKHyof9ccc",
+"ciiopyAAwtttwBEEAwpoomif5|<_49mqkfiwytiipAAAAtlfcfpwBABKNOOONMKIHIIBwwwtutwwwtooouttuxBBABEEEAuuuuxzxuyyyCBGKKMNNOOONNMKIIEAtqh6669ddfiilmmpooollilffffg9bc0d056}}:}[}2}a68dhhmnmqpswwwwtttuprrvvxxAEDEEGGEBwtmqqopstABCyoifbbbb88bfllollfcfd95333cpAEIHBtlfccc9",
+"9clpptAEAwttyEEEAwpmkmmg93<<<|9mmgfmwwoiotwttwplccfqyAyBKNOOONKHHHIHAwtpttwyywttppttuxAEEEEEEExxxxxzzxywwAzCEIKMNNNNNNMKIIHEzrk86abfiikllmpqppomlmiigffgf9906622}}[[::[}66addbkmmmmtttxvwwwttuwvvxxzBFEEBCEEAwqmqqnotyEIEwmhbbbb888cipopoiff995756cpEHEytpliif95",
+"5cloptyEHyttyBEywpoomlmld7|_((|dolcfqupllliilptpicfipyyyEMOOONKIEEHIEwtppptwwwwwwyywwyzEEEEEHBAzxxxzzyxywAAzCHIMMNMNNMMKKIHEzxk86bhilllomppppppmllilgggig997a222}}}_[[:[22adbbkkkkrrquttwwwwvyxvxxyDBEFEBzCEAAwqqqooptBIICtlgbbaba8biooptofcb90799ftEEypopplifc5",
+"69iotwwEIEwtwyAtpooomopplc51_(/3goicippliiiflpttpfciowAyAIMOOOMIBABIIBwoilpttttyAEEBAACEIHHEHBBAxwyzzAyAyAzzCFIKMMKMMMMMMMIHBxnd8bjilooopppppppmloiifgkkica76222}}2}}[[[2280bkkkrrqrrrrpttwwzzzyzxzDDEFEEzzAEBAuqqqoppxEKHymkggbdb88fltttof990900flwBAtiiopoifc5",
+"59fopwwAHKBwtwwplmllmoptpod7|</|9kmggoolllllpwwwtoiflpAAyEKNOONKEyyEIIApiiipppwABIKIIEHIIIHEHEEAzxwwyAADAAzCCEHLKMIKKKKMKKKHBAqedhinommppqppprrmloiigggkkf00a222}}22}}[22280bkkppprrrrvqrqvxzAACzAEEFEEFDzzzAAByuqqnprtAHIBtmgggbbb8cltwtpiccc90cipwywpfcippifc9",
+"999iptwwBKIBywytoiikikotttpg93147gmmklmklppopwwwwplfipwBBBKMOOONIywyEIHwlfflptwyBHKMMMMMMMKIIGGEAxuxxzzEBBCCCEHKLKIIKKKKKKKHEAqmeklopopppqtppprmmoiiiggike006222}}}}[[[22280bkhrprppqvvvtvwvwwzzCEFHHHEDDzzwzwAByxuqoptwEIHzqkgggbhhbjtwtoieccc9ipttppof9copifd9",
+"c95clpppwBEHEEEBwooliilptttpi000ddkoomikottpptwwwtoiiowBEEHKNOOOKBwtyEHAoffipwyyABEIIKMNNNONKIIHCAxxxwyBBACCzEFHKIHIIKIKKKKFGCwmenmpupptttutpprommokiggggc006222[}[:[[:22800bkrrrrrprtuvvvvvxvzzBHIHILHFBzxzzyxAAAxuqoptAHIExqkgggbejiptpoliccdflttpllic99lpoifc",
+"f969ffiilpyEHHHEEyttpopttuttpiddkkkqpqoilptttpopttpiiowEEHEIMOOONIAwtyBBtlffltywtttwAEIKNOPOMMKKIEzxxxxxABECCFFJLHHHIKKKKKKKHBwsmnmuttttuuuutppomoollgggg800a222[[[[[[[2260bbkrqrrrrvvvwxvvsvxxzDEHIMMKHFDyzwytxAAAxuuptwBIIEwpggggfjilppoolfdfiottofccc99ipplff",
+"ic579cfcfiotABAABAywtwtwwxywuuoilpmmquupoqtttlfcippllpwBEHEEKNOOOMHyttyBypieipwwtoolpwCHINOPNMMMMKEzzwxwAAEEGFHHKHHHIKKKKKMMICzssqquwwwtuxxwtsppqqrmllggg807a222:[[[[}222a0bkkrrrrrttvvvvsvxxxyADEHIMMMIHDzxvwxuwxAzzxupwAHIHAtnggkmlefllppoifiotwtoc99955clppii",
+"if929d9c99gipttptwwttttpwyyAzyxppupmquxtpptwwpf99fopptwyBEEBEKNOOOMEwttyAwpliotwpoiiitABEKOPOMMMMMIEEBAxDAEEHIKKKIIIIKKKKKKMKHCvsquuxyyyxxxxtwtpqqrlmjggg8006222[[[}}}2268dbkkrrrrvvvvvwvvxxxxzDFEHKKMMKIFCxxxwttwxzzyxtxyBIIEypnjkmlebciopplilpwwtof965335fppli",
+"ff950cd9599fiopolottppoiltxzAAzywxwuquxxtpuwwwoc99itwwwtyEEBAEKNOOOKAtptwAytpptwtlliiptwyBKNNMKKKMMIHHEBEBHHIKMMKKKKKKKMMKKLKFCzvwuzyzAyzxzzxwssqrqjjjgggbb06222}}}}}26680dbkkqrpvvwvvvxxxxxxzDFFHLLLLKKIIHzzxxsutqxAzyxxyBHKKBtonmmlcc9flpppppttpolf9555439lplf",
+"9c9999c0735cfkloilpptplffipwzzAzyyywttxAwttwywtlfcityywttAEEyyBKNPONHwpopwAAwttwpliiioppuwEKMKIIKKMMIHHEHEHHIKMNNMMMMMMMMMMNLKFzvzzzCzCBAyAzAywuuqqjlngggab066222[[[[22280bbkrrrvvvvvzxxxxxzzDDFHLLKNMLKIIHBzxwxstuuxzzyxxzCIKIBtrmmibb8cippttpppoili95553|5folc",
+"999550d0||2559ciiilptpplfcitxyyxwywyyyzBCAwyAywtolowAAywtyEEAtwEMOPOMEtoopwAywwtollinllopwAINKIIIKMMKIHHIHIIIKMNNNNNNMMMNNOONMFFzACBCCCCEBAACAvtqrqmnngggbb06a2222[}222280bkkrrvvvvvxxxxvzAzDDFHHLLMNMLKIFHECzwvsttwuxzAzxzAEIKHBtqmibc68foottpppliiic99993|9lof",
+"fc963595}:(<437giilotwtpmccmtwxwwyyAAAACIIEABBAwtpwABBAAAAEEEtotHNOPOMBtoopwAAwwpooliiilmtAIMNKKKKMMKIEEIIHIIKMNOONNNNNNOOOOONKFFCCBEGEGHECBCAwtuvrnmlnggga00622226666a8ddhkkrvvvvvwxxvzzzADDFFHLLMNNNLLHFFFCCzwwsttwuxzAzzAEIKKJApmhbc68cioptppoifiiic999539ipl",
+"oic65552}_~/137flpptwAywpiccotttwwwyywtyCGEAAEEBytyAEEEEEEEHHAolwINOONKwpoopwABAwtpliihilpBKMNNKIIIIIHEBBHEHHIMNNONNNNNNOOPPPOLIFGGEGHHHHHEEGADwuvvnnnmgggb00a866688888bgghmpuvwxvvxxxzzzCDDFFHLLLLNNNKLHHFFBCzAtssstuwxAAAACIKKKEymhbb889flppppoicfilic9cc9cipp",
+"wpf973}32<<<39cflppptttpoi95cmputppppplpxBCywyBBytwBEHIKKKIIIHwllwINOONIwpoptwyBBwtoiceenpAHMNOMHEABEEAzxAAEBGHKNNNNMMNMOOPPOONLIFEIIIIIIIIGGDDxxsvnonnkkkbeddc9bbcbbchekjqqttzzyzyzzzzADDEFEHLLLNNONNMLKHFFzzAAwusmmmquABBEEKKMMHAqjbb9889iptpppiccioplifffilpt",
+"wtlc9525553355999fiiiiiiif9539loplllolffotAwpotwtllwBEIMNNMMMKEploAKNOOMHwpppptwyywtlf8eeoxEKMNMHAzAEEAxuyyzACEIKMMMMMMMNOOPPOOLLIIJLKKIKILHHDDxxturprrkknmhggfiffchcffkkjqqwzAzAACCBCBFFFFFHHLKMNNONNMLLHDzzyzwwwqmmmmquABBEHMNNKEwocb8987cotppplfcfotwtooollot",
+"wywoifcc995|<||<<|7555559553||0klliikkc7cmtxtliii99fpAEKMNNNNNMEppwHKNONMHytpoppptwwplfifltAHKMNKBzABCAxqwwzACCIMNNMMMMMOOOPPPOOLLKKKKMKKLKJJDAyxuvpqqummqqlokkifbbbeeggjiqqtyyyAzCCBHFHHFFIILKLLNOOONNLLFDxzvstwuqqmmmqqyABBEKNNMEzpib9b830iopptpliiltABytpollp",
+"wAAypif553|/)))'))/|||||444|<<|dilmiiig79guxtpifc5|3cpAEIMNMMNNKBwtAIKNNNKHBwpppmlpwytpniopyBIKNMHBzABBxutwxACGIKNNMMMMMNNOOOPPOOLMMMMMMMLKIJBAyxtvqutuquutuomkhfebdbbgghmmppwwxyzzzEFFFIIKKMMLNNOOOONNLHFzxvvqtquuqqmmmqqyABEHMNMHAwof89875ciopptpooopyEAtppoop",
+"wyAypf93|_/),>>>->!<1<(_||||/~/4cilkggiddfoxAtpic7||3fpAEIKMMKMKIAwyHKMNMMKIBAywoilpwwwtpotAHKKNNKHBABBAxwuwACEIKKMMKKKMNNNOOPPOONNMNMNNMMJIEDDzxvvtuwwuuuuunokkhebbbddehmmqwwvwzzzzEFFFFKKMMMOOOOPPONLKHDzxvrrsmqquqqmmmqwyABEIMMICyplc99575floppppoootwytppttt",
+"ppwwof5|(~~),>>-=='!<_{)///~~,,{3gklkgiigfotyytpi95335fpwBIKIIKKIBwyEKMNMMKKIIHEyplloptwywyBKNNNNNKIEEEEzuwwzCGGKKKKIIIMLMNOOPPPOOLNNNNNLKIIEDDzxxwtwwwuuqqqqnigggggggeemmrrvvvwxxzzDFFFIIMMMNOOOPPPONLHFDzvvprmmmqquuqmmmqwyAIIKKIBypof997735illooliiiloptppttt",
+"llptof3<())))'>;=&*>~<~,)~~)),>,~5ilkiliiiopuyywpf95599kowEIIHHIIEwwAIKMNNMKIKMMIAtolllpwAyEKNNMNNMKKIKIEzAwwCBEHIKKKIILLLMNOPPPPOOOOOOMMJIJEEDzzwywwwwqqqmmmjhjhggggiijmmtsvvvvzzzDDFFHHLLMMOOOOQQQOOLIFCzvpsmmmmmjnuuqmmmtwAHHIHEEztpic99542cllopoiiiiilpppppo",
+"ffilli5|~),,'-*==%%;~11(~//~)~),)<floqommlmppxAAwic9cc9fipAIIIHIIHytwBIKMMMKIKMNNKEypllnptwEKNONMNMKKKMMKHEAyCCCEIKKKKKLMMMNOPPQPOOOOOONKLLHFFDzzyAwwttmmmmmmmeeedgghjjmmsswxyzzzzzEFHFIIKMMOOOOQQQPONLIEzzvppmmmmejjnruqmmtuyBHIEHEBwpofc95439iopttpolliiopolli",
+"fcffloc|/);-;*%=-*-,/|3</<<<<<<~)/5iopupomooquAAwpfccc959itEKKIIIIBtpwEIKIIKIIKNNNNKAtpllopAHMOONNNIHIKMNMIHEEEGCEIFKKKMMMLOOPQRPPOOOONNLLLHFDFzzyzuutummmmmmmmehheeeemmmsuxwwyzzzBFFFIIMMMNOOOPQQQPOMMFHzwvsmmmmeeejjnruqmmtxAEIEEBBAtplfc5313clptwwtpolillliff",
+"iifcfol9<)>;**=-,)),)~<<~~/<<<|<))<5fluqqoommuxAyticcf9335itEKIIKKIAttyHIHHHHHIKMNOOMBwoliowBHKOOOOMIHIIMNMKIHIIHHIKKKKMMMNOOPQRQPPPOONNLLHFFFCzzAzssssmmmmmmmmmeeeeemmmssvvvwxzzzFFFIIMMMMOOOOPQQQPOMKKECAtummmjjjjhjjouuqquwAEIEBABBywplf00725fotwywtollliliff",
+"lif99flf3~,>***-,),-*-)~~),)~~~~)>)<3clqqmmikmtyytlfffc5|39lAIIIIKKIAtwEIIHEEEEHKMOONMEwpoptABEMNOOOKHIHIMMIIHKMMKKMMMMNNNNOPPQRRQPPOONLLLIFFFECCyvtsrrmmmmmmrmmmmmmmmmpssvvvvvzzAEFFIILLLMOOOPPPPQOOLKFECAwwqqjjjjjjjjnpxuqqwyBHEEEEEEAtpic0975cipwwwtplilillll",
+"lid3}5fi9/)>*&*-->*#@#*>,>-->,',,>>)/|dlqqmkggmtxuiccffc559itEIIIIKKHytyEIIHHHHEHKMNNMIEywwyBEEIKMNMKIHIIKMKIHHMMMMOOOOPPPPPQQQRRQQOOONLLIFFFGCzyxvsrrrmmmmmmmrmmmmmmmmrrvvvwvzzzzFFFIKKKLOOOOPPQPPOOLIFCAzwuqqjjjggggjjnuuuqwyAEBCBBEEAytof009669ipttplifiioloo",
+"ii93:<5ff|~,-=***%#+.+@%--*%-),,,---,{|foqqmkgkqtul959fif99fpEKKKKKKKEwwBEIIIKKIHHIKKMMKEBEBEIKIMKKKKIHEIIKKIHHKMMMNOOPQQQQQQQRRRQPOOOMLLIFHFECzvvvssssmmmmmmmssmmmmmsssvvvvvxzzzCFFIILLLMOOOPPPQPPOMMFFzyzxuuljjggggggjjjuuuqwABEAAyABAwtpi0097269lppoifffiliil"};
diff --git a/hacks/images/timetunnel2.xpm b/hacks/images/timetunnel2.xpm
new file mode 100644 (file)
index 0000000..f87144e
--- /dev/null
@@ -0,0 +1,599 @@
+/* XPM */
+static char * timetunnel2_xpm[] = {
+"256 512 84 1",
+"      c #100A08",
+".     c #120C13",
+"+     c #171021",
+"@     c #18112D",
+"#     c #1C150F",
+"$     c #18103A",
+"%     c #1A1049",
+"&     c #1B105D",
+"*     c #1B1076",
+"=     c #241492",
+"-     c #21149D",
+";     c #2012AC",
+">     c #2112C7",
+",     c #332A1C",
+"'     c #382A2F",
+")     c #36245C",
+"!     c #39274A",
+"~     c #331F8A",
+"{     c #372375",
+"]     c #2714F8",
+"^     c #2B15EE",
+"/     c #2E17E3",
+"(     c #4021D9",
+"_     c #441DFC",
+":     c #4B2AC6",
+"<     c #5031B4",
+"[     c #5728F7",
+"}     c #6822FD",
+"|     c #5A4382",
+"1     c #5B3CAE",
+"2     c #5E439A",
+"3     c #5E34ED",
+"4     c #60514F",
+"5     c #655D38",
+"6     c #7A2FFA",
+"7     c #665471",
+"8     c #9027FE",
+"9     c #7540F9",
+"0     c #8D38FB",
+"a     c #7748EC",
+"b     c #6E4FE4",
+"c     c #784ED8",
+"d     c #9447F8",
+"e     c #AB3BFD",
+"f     c #A340FC",
+"g     c #9559FA",
+"h     c #B052FC",
+"i     c #9A64E7",
+"j     c #9267F5",
+"k     c #8D72CE",
+"l     c #8E6EE3",
+"m     c #BF5AFC",
+"n     c #AC64FB",
+"o     c #907EBF",
+"p     c #9386A0",
+"q     c #999C57",
+"r     c #D066FD",
+"s     c #B978FB",
+"t     c #AD83F7",
+"u     c #CD72FC",
+"v     c #A19F91",
+"w     c #CF84FB",
+"x     c #B197F3",
+"y     c #C793F9",
+"z     c #B2A8C4",
+"A     c #B2A8E4",
+"B     c #DE8FFC",
+"C     c #CAACF7",
+"D     c #DAA7FB",
+"E     c #D1BEF8",
+"F     c #CDC7EB",
+"G     c #DFBCFB",
+"H     c #CED1C5",
+"I     c #CECEDA",
+"J     c #E5CBFA",
+"K     c #DBE2A4",
+"L     c #E6D7FB",
+"M     c #E4DEF9",
+"N     c #E6E9DF",
+"O     c #EAE7F6",
+"P     c #EDF1D0",
+"Q     c #F2F0FC",
+"R     c #F9F8FC",
+"S     c #F9FAF6",
+"_[[0nDJMOOOMMMMMOOQQQQQQOMJCysngggitCJLMMLLGDwumhff0000fhsyCCCtc<bclAMOQRQQQOOOQQQQRRRRRRRRRRRRRRRRQOMLLLMMMLLJDBuh03>~%$$$&=:agc).              ..+$%&**=-;>>/////>;=****=-;;>:blAFOOOOMMMOQRRRRRSSSSSSSSSRRRQMFCtjad9ddnniic2!'#     ..++@$%&&&&%$$$%&=>///^^^",
+"__}0gBGLLMMMLLMMOQQQQQQOMLGysngdggixELMMMLJGywmhdf006660hsyCCDtccclxFORRRRRQQQQQQQQRRRRRRRRRRRRRRRRQOMLLLLLLJJDBumf93(={%%&~:3dhg~+             ..+@%&*=-;>>//^^^^^/>;-==--;;;::lAFOQQOOMMMOQRRRRRSSSSSSSSSRRRQOLCtjg999dgggb1)+.#    ...+$&&**=**&%%$%&=;///^^^",
+"__[6dsyGJJJLLLMOOQQQQQOOLEDtngd9dgsxELMMMLJDyshd006}}}60hsyCCCxlllxFORRRRRRRQQQQQQRRRRRRRRRRRRRRRRRQOLLJJJJGGDBurhf63(-~{*~:(dhmd:)..          ...+$&*->>//^^^]]]]^^//>;;;;;>(blAMOQQQQOOMOQQRRRRRSSSSSSSSSRRRROMEyjg999999:<)+.#    ...@%*=;;>;;-*&&%&*=;>//^^^",
+"]__[0hsyDDGJJLMOOQQQQOMLGysnd9399gtCLMOOMLGDwnh006}}}}}0hsDGECCkkxEORRSSSRRRRRQRRRRRRRRRRRRRRRRRRRQQOLLJGGGDDBurhf063(:=~=:(0dmmh3~@+............+@&=;>//^^]]]]]__]^^//>>>>((bkFOQRRRQQOOOOQRRRRRRRSSSSSSSSRRRROMEyja93333(<)@+.     ..@%*;>////>>-=*&**=;>>////",
+"^]_}6dhuwyDGJLMOOOOOMLJCysg96[[39jyELOOOMLGysgd06}}___[6dsDEJEACCAMORSSSSRRRRRRRRRRRRRRRRRRRRRRRRRQQOLJGGDDBBurmef063(::::33dmrmh0:&@+++..++.+++@$&=;//^^]]_______^^^///(((alxFORRRRRQQQOOQQRRRRRRRRSSSSSSSRRRQOLCtj933((>=%@..     ..+%*;/^^^^^/>>-=**=--;;;>>>",
+"^^^^[6dhmuBDGJLLMMLLJCysg93[[[[3aixFOOOOMLGysh06}}____}6gtCELFEEEFORSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRQQOLJGDDBwurmef00633:::33dhrrrh0(=&%$@@@@@@@@$%*->/^^^_______[[[[[33333ackFMQRRRRRRRQQQQQRRRRRRRRRRSSSSSRRRRQMExja3(/>-*%+..     ..+$*;/^]]]]]^/>;-=========--",
+"//^^[}60dmuBDGGJJGGDysg96[[[[/(3btEMOQQOMLCynd06}_____[6gtGJMLFFFMORSSSSSSRRRRRRRRRQRRRRRRRRRRRRRRRQOLJGDBwurmeef00033::3adhmuurm03>-**&&&******-;//^^_____}[[669999aaaaclAFORRSRRRRRQQQQQRRRRRRRRRRRRRSSRRRRROLCla3((;=&$+..     ..+$*;/^]]]]]]^/>;-==***&&&&&&",
+";>/^^[}60dmuwyyyywsng96[[^^^//(3iCLOQQQOMLCtnd6[[_____[6gtGLMMFFMORRSSSSSSRRRRRRRRQQRRRRRRRRRRRRRRRQOLJGDBurmhee000093aaaddmruuume6/>>;;;;;;>>>>//^^^[[[}66660dgnjtjiiltCFORRSSSRRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMEtb3((-*%@+..     ..+$*;/^]]]]]]]^/>;-=**&&%$$$$%",
+"-;//^^_}}0dhmnnngd06[[[^^^^^//3bxJOQQQQOMJCtnd6[_____^[6gtELMMMMMQRSSSSSSSRRRRRRQQQQQRRRRRRRRRRRRRRQOLJGBwummeee00099aaaddhruwuume6[/////////////[[[[660000ddnsyDCCCxCAFMORSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQOFxj93(;=&$+...    ..+$*;/^]]]]]]]]^/>;=**&&$@@++@@",
+"*->/^^^__}6600066[[[^^___^^^/3atEMOQQQQOMJCwn06[_____^[3gyELMMMMOQRRSSSSSRRRRRRQQQQQQRRRRRRSSRRRRRRQOMJGBwrmeee00009daaddhmruuwume6[////////[33399aggnnnnnnswyGJLMLLFFMORRSSSSSRRRRRQQQRRRRRRRRRRRRRRRRRRRRRQMCta3((;~&@+..     .+@&;/^]]]]]]]]]^/>-=**&%$@++++@",
+"*->/^^]_____[[[_^________^^[39iCLOQRRQQOLJDwg06[[_^^^^[9nyEMMMMOQRRRSSSSRRRRRRQQQOQQQRRRRRSSSRRRRRRQOMJDBurmfe000099dddddhmruwurme6[[////[33ajitxxCCCCCCDDDCGJLMOOOOOORRSSSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMExj33((;=&$+..    ..@&->^]]]]]]]]]]^/>-=**&%$@++++@",
+"*-;>/^^]]_______]]]]]___^[[[9jxJOQRRQQQOLGysh06[^^^^^^[9sCLMMOOOQRRRSSSRRRRRRQQOOOOQQRRRRSSSSSRRRRRQOMJDBumhee000099aadddhmruuurme6[[//(3ajtxEFMMMMOMMMMLLLLLMOQQRRRRRSSSSSSSSSRRRQQQQRRRRRRRRRRRRRRRRRRRRROLCla3[//>-*$@+......+%*>/^]]]]]]]]]]^/>;-=**&%$@@@@@",
+"*->>/^^]]]]]]]]]]]]]___[[[39jyEMOQQQQQOMJDwnd0[[^^^^^^[gtEMOOOOQRRRSSRSRRRRRRQOMLLMOQRRRRSRRSSRRRRRQOLJDyumhff000099aaddhmruuuurhe6[[(3abtCFMQQQQRRRRRQQQOOOOQQQRRRRSSSSSSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMEtj93[//(;~%@+.....+$*;/^]]]]]]]]]]]^/>>;;-=*&%$@@@$",
+"=;>//^]]]]]]]]]]]]]]__[[39ajtALOQQQQQOMJGBsh06}^^^^^^[3nCLMOQQQQRRRSRSSSRRRRQQMLJLLOQRRRRRRRSRRRRRQQOLJDyumhf000009daaddhmruuurme06333bckEMORRRRRRRRRRRRRQQQQQQRRRRSSSSSSSSSSSRRRQQQQQRRRRRRRRRRRRRRRRRRQQMExia96[[//>-&$@+...+@&->/^]_]]]]]]__]^^//>>>;-*&$$$$$",
+";>>/^^]]]]]]]]]]]]]__[[39ajtCJMOQQQQOMLGDwnf6[_^^^^^^[9sEMOQQQQQRRRSRSSSRRRRQOLJGGLOQRRRRRRRSRRRRRQQOLJDBumff0000099adddhmrrurrhe033:<1kAIRSSSSSSSSRRRRRRRQQQQQQRRSSSSSSSSSSSRRRRQQQQQRRRRRRRRRRRRRRRRRQQMExsg936[[[/>;*%@+++@@&=>/^]]_]]]]]___]^^^^///>;=&%$$%%",
+">>/^^]]]]]]]]]]]]]]__[39gjtxEMOQQQQOMLGDwrf0}__^^^^^^[gtJMQQQQQQRRRSRSSSRRRRQOLGDCJMQRRRRRRRSRRRRRQOMLJDBsmff000099999ddhmrrrrme003:<1koINNSSSSSSSSSSSRRRRQOOMOQQRRSSSSSSSSSRRRRQQOOQQRRRRRRRRRRRRRRRRQOMExtgd966[[[/(;*%@@@@$&~;//^]]]]]]______]^^^^^^/>-*&%&&*",
+"/^^]]]]]]]]]]]]]]]__[39gitxELMOQQOOLJGDwrh06}__^^^^^^[gyLOQQQQQQRRRSRSSRRRRRQMJDyDGMQRRRRRRRSRRRRRQOMLEDBsmhff00099999ddhmmrmme003:<2||pINNSSSSSSSSSSRRRRQOMLJLMOQRRSSSSSSSRRRRQOOMOOQRRRRRRRRRRRRRRQQOLExiga93666[[/(;*%@@@$&~;(/^]_]]]]]______]]]]]^^/>-*&&*=-",
+"^^]]]]]]]]]]]]]]]__[[9gitxEFMOQQOOLLGDwuhf6}__]]^^]]^[gDLOQQQQQQRRRSRRSRRRRRQMGyByGLQRRRRRRRSRRRRRQOMLGDBsnhdf000099900dhhmmme063:<{||7pHNNSSSSSSSSSRRRRQQMJGCCGLMQRRSSSSSRRRQQOMLLMOQRRRRRRRRRRRRRRQOLExiga9900666[/(;*%@@$%*;>/^^_]]]]]________]]]]]^/>-***-;>",
+"]]]]]]]]]]^^]]]]]_^[9gjtxEFMOQQQOMLJDBumf0}___]]]]]__6gDLOQQQQQRRRRSRRSRRRRROLCywyCLQRRRRRRRRRRRRQQOLJGDBsnhdf000009900fhhhhe06[(:~{)!7pvNNSSSSSSSSRRRRRQMJCtsstDEMQRRRRRRRRQOMLJJJLOQQRRRRRRRRRRRRQOMExigd9999d006[/(-&%$$%&=>/^^]__]]]]_____^__]]]]]^/>-==->>/",
+"]]]]]]]]]^^^]]]]__[9gjtxEFMOQQQQOMJGyumd06}__]]]]]]__[dyJOQQQQQRRRRSRSSRRRRROLDwswDLORRRRRRRRRRRRQOOLJGDysnhdd000066660fffff06[[(-{)!!7pzHNSSSSSSSSRRRQOMEDwnggmsyGLOQRRRRRQOLJGDDGJMQQRRRRRRRRRRRRQMJCtja999ddddd6[/>-&%$%&*;>/^]]]]]]]______^^^^^^^^/>;--;>>/^",
+"]]]]]]]]^^^^]]]__[9gtxCELMQQRRQQOMJDBuh06[[__]^^]]]__[dwEMQQQRRRRRSRRSSRRRRROJDwswDLORRRRRRRRRRRRQOMLJGDwumhdd0006666600fff06}[/>=))!!77zIRSSSSSSRRRRQOLEDsnhdddhnwDJMQQQQQMLGDBBBDJMQQRRRRRRRRRRQQMJCtjg999dhgmhd06/>-&%%%*->/^^]]]]]]]____[[^^^^^^^//>;;;>>/^]",
+"]]]]]]]^^/^^^]]_[3gtxEFMMQRRRRRQOLGDsnd06[__]]^^^]]]_[9sGMQQRRRRRRRRSSSSSRRROJysnsDLOQRRRRRRRRRRRQOMLJGDwumhf00066[[[6000006}_^/;*%!!!77zIRSSSSSRRRQQOLGyshdd0000fhsyGLMOMLJDyuuuBDJOQRRRRRRRRRRQQMLGysgd99dhnnnnh06/(;*&&*=;>/^^]]]]]]]____}[^//////>>>;;>>/^]]",
+"____]]^^///^^^^[3gtCFMMOQRRRRRRQOLCtnd06[___]^^^^^]]_[9sGMQQRRRRRRRSSSSSSRRROJysssDLOQRRRRRRRRRRQQOMLJGDwumff0066[[[}}60006}__^/-&%$!!|ozIRSSSRRRRQOMJCyshd00000000dnwCJJJGDwumruwDLOQRRRRRRRRQQOMJCysga999dhnnnmd0[/(;=**=->/^^]]]]]]]_____[[//>>>>>>;;;>>/^^]]",
+"____]^^////^^^^[atELMOOQRRRRRRRQMEynd66[___]^^///^]]_[9sEMQRRRRRRRSSSSSSSRRROLCwwwDLOQRRRRRRRRRRQOOMLLEDBumff066[[[}}}}66}}__]^>=&$@!)|ozORRRRRRQQOLEDwnhd0000086660dmsyDDywummmuBGLOQRRRRRRRQQOMECtjgd9000ddhggd9[[/(>-=-->>/^^]]]]]]]_____^//>;;;;;---;>>/^^]]",
+"__[^^^//>>//^^[9lCLMOQQRRRRRRRQOLCsd0[}___]^^/>>>/^^^[9tEOQRRRRRRSSSSSSSSSRROLGyByGMQRRRRRRRRRRRQOOMMLJCysmf006}}}_}}}}}}}___]^>*%$@!)|oIORRRRRQQMLEDsndd00000886}660dmswwsrmhhmuyJMQRRRRRRRQQMLEDsng996666000096[[//>>;;;>>//^]]]]]]]]_____^/>;-----==-;;>//^^^",
+"[[[[//(>>>//^[3jxFMOQQRRRRRRRQQLGtg0[}____]^>;;;>>/^^[gyLORRRRSRSSSSSSSSSRRRQMECDDJMQRRRRRRRRRRQQOOOMLJCysnf006}}____}}}}___]^/;*%@@!|ozIQRRRRQOMJCysgd000008888}}}}60hnusumhhhmwDJOQRRRRRRRQOLEDsn9966[[[[[[[[[[////>>>>>>>/^^]]]]]]]______^/>;;--=====-;>>//^^",
+"[[[[/(>;;;>//3atEMOQQRRRRRRRRQMJyn96}____]^/;=*=->/^^3jCMQRRRRSRSSSSSSSSSRRRQMJGGGLOQRRRRRRRRRRRQOOOMLJGywnf06}}______}_____]^/-&$@@!|pzORRRRQOMJCtjgd0000088886}}}}60hnsuurmmmuBGMQRRRRRRRRQMLCtja9[[[[[[[[[^^^///>>>>>>>>/^^]]]]]________^^/>>;;--=***=--;>>//",
+"////(>-=~-;((3jxFMQQRRRRRRRRQOLCsd6[____]^/;=&&*=;//[atJORRRRSSSSSSSSSSSSRRRQOLJJJLOQRRRRRRRRRRQQOOOOMLGDwnd06}}___________]]^>-&$@@!|pIORRRQOMJCtng906600088886}}}60dnswBwwuuuyDJOQRRRRRRRQOLEyia93[[[[^^^_^^//>;;;;;>>>//^^]]]___________^^//>>>;-=******==;;>",
+"(((>;=*&&*->(atEMOQQRRRRRRRQQMGtg3[^__]]^/>=&%%&*;>/3jCMQRRRRSSSSSSSSSSSSRRRQOLLJLMOQRRRRRRRRRRQQQQQOMLJDwnd06}___________]]]/>=&$@!!7zIQRRRQOLCtja9666600088886}}66dmwDCGGDDDDGJMQRRRRRRRROMExlb93([//^^^^^^//;-==-;;>>//^^]]]_____}}}}____^^///>>;=**&&&&&&**=",
+"----~&%$%&=:3jxFMOQQRRRRRRQQMEyn3[/^^^^^/;=&%$%&*;>(ayJORRRRRSSSSSSSSSSSSRRRQOMLLLMQQRRRRRRRRRRQQQQQQOMJDwnd0}[___________]]^/;*%@@!!pzIQRRROMEyia96666600888886666dhsCJLLLLLJLLMOQRRRRRRRQIFxlc:((((////^^//>>-=*=-;>>//^^]]____}}66686}}__^^^^^/>>-**&&&%%%%%&",
+"&&&&%$@@@%*<btEMOQQQRRRRRQQMJxi:(>>>>>>>-*&$$$%&=;(3jCMQRRRRRSSSSSSSSSSSSRRRQOMMMMOQQRRRRRRRRRRRQQQQQOMJDwnd6[[__________]]]^/;*%$@!7pINRRROOFCtg93[666000888886660hsCLOOQQQOOOOQQRRRRRSSNIzok11<==--;>(////>>;-==-;>>/^^]]]___}60feeee06}}__^^^^^/>;=*&&%$$@@@@",
+"@@@@+++++$&1cxFOOQQRRRRRRQMJxi<~{&&&****&%$@@$%*->(atEOQRRRRRSSSSSSSSSSSSRRRQQOMMOOQRRRRRRRRRRRRQQQQQOMJDwnd6[___________]]^^>-&%$!!7zHNNNQOMExia96[6600088888060fhsDLOQRRRRRQQQRRRRRRSNNHp77))))%&&{~-;>(((>>;;;;>>//^^]]]___}0fhmmmmhe06}}_^^^^^/>;-**&%$@++++",
+"........+@)2kAMOQQQRRRRRQMExl1)$@@@@@$$$@@@@@%&=;((ayJORRRRRRSSSSSSSSSSSSRRRQQOOOOQQRRRRRRRRSRRRRQQQQOMJCwg96[[^________]]]^/>=&%$!7pHNNNNQOFAtja3666000eee88800dhuyJOQRRRRRRRRRRRRRSSNHvv4''!@@@@@$){~-:>((>>>>///^^^]]]____}0fmuuwwwumh06[[^^^^^/>>;=*&%@+++..",
+".........+!|AFOQQQQRRRQQMFxl2)@+....+++++++@$&*;>/3gyLOQRRRRRSSSSSSSSSSSSRRRRQQOOQQQRRRRRRSSSRRRRRQQQOMJDsg9[[[^_______]]]^^/;=&$$!7vHNNNNNOFAtja366600eeeee800fhnyGMQRRRSRRRRRRRRRRSNHv54'''++++++@!)~<<:(((////^^^]]]_____}0dmuwBDDDBwnh0[[[^^^//>>;=*&%@++...",
+"       ..''pzIQRRRRRRQQMFxk2)@+........++++@%*->//3gyLOQRRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRSRSSRQQRQQQOMJDsg9[[[^^^^^^^_]]]^/>;*&$!!pHNNNNNNOFAtca936000feeeeeefhnyGMQRSSSSSSSRRRRRSSNHv5,,##....++@!){21cba3(//^^^]_______}}0fmuwBDGGGGDwnd6[//////>>;=*&$@+....",
+"        #'4vHNNRRRRRQQMJxl2)!+..    ....++@$&=>/^[6gyJOQQRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRRSSRRQQOQQQOMJCsg9[[[^^^^^^^^]]^^/>-&%$!7vHNNNNNNIFAtca9900000ee0e0edmwDLORSSSSSSSSSSSSSSNHv5,,##....++@!)|2kkliga3[[^^_______}}}00hmuBDGJLLLJCtga33(///>>;;=*&$@+... ",
+"        #,5KHNSSRRRQQMJxl1{)+..      ...++@%*;>/^^6gyGMOQRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRSSSRQOOOQQQOMJDsg9[[^^^^^^^^^^^^^>;*&%$!7vHNNNNNNIFClca990000000000fhnDJORSSSSSSSSSSSSSSNHv5,,##...+++@))22kxxytia9[[[[_____}}}600fhmuyDJLMOMLExib33(((>>;;-*&%@+.... ",
+"       #,5qPNNSSRRRQOFClc1{$+..      ...++$&=>/^^[6hsCLOQQRRRRSSSSSSSSSSSRRRRRQQQQQRRRRRRRRRRQOIIOOQQOMExia3[[^^^^^^^^^^^^/>-*%$!!4HPPNPNPNIzxlba366600000000fmwGMQRSSSSSSSSSSSSSNHv5,,##..++@@$%{11lyDxytng96[[}}}}}}}66000ffmsyGLMOOOMLCtiaa3((>;;-=*&$@+...  ",
+"       #,5KHNSSRRRQOMAlb:~%@+..       ..++$&->/^^[6dsDJLOQRRRRSSSSSSSSSSSRRRRRQQQQQRRRRRRRRRRNIIIOOOOOMExja3[^^^^^^^^^^^^//;=&$$!7vHPPPPPPHIzklb9366666666660dsxJORSSSSSSSSSSSSSNHv44'#...+@@$%{~<<ctyyyysngd066}}}}}}880800fdhsyGLOQQQOMExlbaa3(:;-=*&$@+...   ",
+"      #,,vHNNSRRRQOMExb:=&$+..        ..++$&->/^^[6dnyCJMOQRRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRRRRIIIIIOOOMFAtb93[^^^^^^^^^^^^/>;*%$@!4vKPPPPPPHIAkia93[[[}}66666dgtGMQRSSSSSSSSSSSSRIvp4'#...+@@%&*=-:acittwssnhdd000666686886800fhwCLMQQQQOMExtiga::;-=*&$@++...   ",
+"      ##4vHNRRRQQOMFxja-{$+...        ..++$&->/^^[6dgsyGLMQRRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRRROFzzzIIIIMFxla3[^^^^^^^^//^//>>-&%$@!4vPPPPPPPHzAkca36[[[}}}}}60dnxFORSSSSSSSSSSSSNIzp4''...+@@%&*-;:(3agnissnnmhhdff00068886}6600hwGLOQQQQOMExtljba:;=*&%@++....   ",
+"      .'7pFOOQQQOMLCla:~%@..          ..+@%*->/^^[60hnsyGLORRRSSSSSSSSSSSRRRRRRQQQQRRRRRRRROIzppzIIIIIAxia3/^^^^^////////>;*&%$!!4vPPPPPPHHzolca3[[[[}}}}}69gtCMORSSSSSSSSSSSNHIp4''...+@$%&*=;;>((3agnnususurmhffe0066}}}}}6dnyJMQQQQOMLExytica:-~&%@@+......  ",
+"    ..+!2kAFOOOOMLExb:-&@+..          ..+@%*;>/^^[60dgnyCJORRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRQOFAoppvHHIIAkca(/^^^/////////>>-*%$@!7vHPPNNPPHIzxlcd3[[[____}[6diyJMQRSSSSSSSSSNNHHp4''...+@$%&=-;;>>((33dhnwByyywwumhf006}}}}}}0gwGLOQQQQOMJGCCxtib:=*%$@+........ ",
+"   ..+${<lCJMMMMLExja:~$+..           ..+@%*;>/^^[69dhnsDJOQRSSSSSSSSSSSSRRRRRRQQQQRRRRRRQOMAooopvHHIzAkc3(/^^////((////>;=&%$$!4vHNNNNNNNIAxlg93[[[____[[9gtEMORRRSSSSSNNNNHvp4'''+++@$&*=;;>>>>((30dmwDDGGGDDwumhf06}}}}}6dsDJMQQQQOMMJEECCxlc<~{$@++.........",
+" ...+@&-:bxCJLLLExia3-&@..            ..+$&=>//^/[660dhsyJORRSSSSSSSSSSSSRRRRRRRQQQRRRRRRQMJxkkopvIHIzAkc3(/^///(((((//>>-*&%$!7pHNNNNNNNIIAxlga3[[[___[[6aiCJMORRRRRNNNNNHHvp7'!'++@$%&=;>>>>>((((3dnwDGJLLLJGDwuhf06}}}[69nyJMOQQQQOMMLLLLECxl1~)$@+..........",
+"...+@&=>(alxEJEExta3(=%@..            ..+$&->///[[669dhsDJORRSSSSSSSSSSSSRRRRRRRRRRRRRRRQOMExkkozzHIIFAkca(///(/(((((>>>;-*&%$!7vHNNSSNNOIFExtja9[[[__[[[9jxEMOOQRRQNOIIHHvp77!!!@@$%&~->>////////39hsDGLMOOMLJDysmd06[}}[6gtEMQQQQQQOMMMMMMLJCl1{)!@+..........",
+"..+@%*;/(9ixCEExtg3(:*$+..            ..+$*->///[339ddgsDLORSSSSSSSSSSSSSRRRRRRRRRRRRRRRQOMCklkozIIIIFAkca3///(((::(>>>>;=&%$$!pHNNSSRRQOMFECysgd6[[[[[[9jtCFMOOOOOIIFzzzpp7|)))))%&~-;>////////[3dnwDJLMOOOOLJGysgd6[[[[[9sCMOQRRRQQOOOOOOOOMAk2{)!@++.........",
+".+@%*;>/[9ixCECyja3(-&@+.             .+@%*;>///[39dddnwCMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRRQOFAxkkozIIIIFAkca3//(((:::>>>>;-*&%$!7pHNNRRROOMMFECytjgd6[[[[9gtxEFMMMMIFFAAooo|22{{{{~~~=;>(///[[[[[39gsyGJLOOOOOMLJCysh0[[[[[9gxLOQRRRRRQQQQQQQQOMFo2{)$@+++........",
+"+@%*;>//[atCEECtj3(;~%@..            ..+$&=>///[39ddddnyGMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRRQMFCxkkAzIIIIFAtb33//(((::::>>;-*&%$@@7vHNRRROOMMLJJECDtsg99669ajxCEFMFFFAAokkkl11<<<----:::((([[[[[[39gsyCJLMOOOOOMLJCysg96[[[[[9tEMQRRRRRRRRRRRRRRQOFo2{)$$@++........",
+"$%*;//^[6gtCEECta3(-&@+..            ..+$*;>///39ddddgsyEORRSSSSSSSSSSSSSRRRRRRRRRRRRRRQQMJCkkoAzIIIFFxlb33//(((::::;;;=*%$@@+4vHNNQOOMLLJJJJECDtng9999gtxCEEFEACxkkllicc::((((((::a33333[639gsyCJLMOOOOOMLLECysg9[[[^^[[atFOQRRRRRRRRRRRRRRROFk2{{)$@++........",
+"&~;(/^^[9nxEEExla(;*%@..             ..@%=>///[6ddggdgsyGMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRQOMExkkoAFIIMFAxja33[/((:::;;;;-*&%@@++'vHHOOMLJJEJJJJEGCysgd999gjxCCCCCxxklllicba333(333aaaaa993339gntCJLMOOOOOMLLGCysnd6[[^^^^^3gxLOQRRRRRRRRRRRRRRQOAk1~{%$@++........",
+"=;(/[[[[9jyCECxja:=&@+..             .+@&->//[39dddddgsyJMQRSSSSSSSSSSSSSSRRRRRRRRRRRRRQOLCxlkoAFIMFFCtb33[//(((:;;;;-=*&$@++''4vIILLJGCCGEEJEGDysg9999ajttxxxxxtktttliga933339abbjbba9999gntCJMOOOOOMLJGDtsgd9[[[^^^^^^3jxLOQRRRRRRRRRRRRRROMAl1~{)$@+........+",
+":(([[[[6djtyxtia(;*%@...             .+$*;(/330ddddddgsyJMQRSSSSSSSSSSSSSSRRRRRRRRRRRRQOMExlllkAFFFFAxia3[///(((:;;;;-*&%$@+++'4pzJJGDDyDDCGGGDywnd96[39ajitttxxxCCCxytjga999abjjiijbaa9dgnsDGLMOOOOMLECysgd96[[^__]]^^^3jxLOQRRRRRRRRRRRRRQOFxl<~{$@+........+@",
+"(([[[[[69gjssja3>=&@+..             ..+%~:(330dddddddgsDJOQRSSSSSSSSSSSSSSSRRRRRRRRRRQQMJCtjclkCEFFECtb33[^^///(>;;;;-*&%$@+++'7pAADywwwwyDDDDDBshd6[[[39abiltxCAEEECCytjgaagjjillijbaaaggnwDELMOOOMLGDwnh06[[[____]]]^[[gyJOQQRRRRRRRRRRRQOFAlc<{)@+...   ..+@$",
+"(([[[[[[69dga93(-*$+..              .+@)<:339ddd9399dgtCLORRSSSSSSSSSSSSNNNRRRRRRRQQQQOLExibbilxAEECxia3[^^^^//(>;;;;-*&%$@+++'77oyysiinswwyyDywnh06[[[[39ajitxEEFFJECxtijjjjltllljjbbjgjnsyDGJLLLLECyshd06[[[_____]]__[6gyEMOQQQQQQRRRRRRQMEkc<~{$@+..    ..@%{",
+"[[[[[[[[[[66[[(;~%@+..              .+!{<:aaddda3339dnyGMQRRSSSSSSSSSSNNHHIINRRQQQQQOOMExlbabblxCCCxtj93[^^^^//(>>>;;-=&%$@+++'!|2linggdgnswBywsnd0[[[[[[39gitxEEFFJECyttiillttllliiilltstwyyDGGGGDysnh0066[[[_________[6hwGLOOQQQQQRRRRQQMExib<~%@+..    ..+$*-",
+"[^^^^^[__[[[[/>=&@+...             .+@)21ccgdaa33339gsDJOQRRSSSSSSSSSNHHzppzIOOQQOOOMLECtjaaabltxCxtig9[[^^^^^//>>>>;-=&%$@++++!)21caa39dhnswwwsnd0[[[[[[[9ajtxCEEEECxyttiitttlllllltxxxyyyyyyyyywsnhd066[[[[__________}6hsDJMOQQQQRRRQQQOLClb:<~%@+..   ..+@&->",
+"^^^^^_____^^//;&$+...             ..+!22lligaa:::(39gtCLORRSSSSSSSSSNHvp777pzIOOOOMMLECtja99agitxxytna3[[^^^^^///>>>;-=&%$+++.+@){1<::(33dhnuwwsnh96[[[[[[69gjttxxxxtttiiiiiliiilltxCAECCDyywsssnhdd0666[[[[[__________}0hsDELOOQQQRRQQQOLEyib:-*%@+... ..+@&=>/",
+"^^^________^/>*%@...             ..+$)2kkktic::::(3aiyEMQRRSSSSSSSSNHzp7777ozIOOOMMLECtjg999ajityytig9[[[^^^^^////>>;-=&%$+++.+@!{~<:::((3dhswywsgd6[[[[[[[39gjjjiiijjjjjjjjjjjilxCEFFFJECyysnnhd0066}[}[[[[[[________}0fmwDGLOQQQRRRQQOMJCtb::-*%@+.....+@%=>//",
+"__________]^/-&@+..             ..+@)2koACxtic<<::abtCLORRRSSSSSSSRIzp7!!!|ozFOOMMLECysg9999ajittttig9[[[^^^^^^///>>>-=&%$++..++!{~==--;:(9giwywsnd0[[[[[[[669dggggaaaaaggggjjjlxCEFMMMLJCywshd0066}}}}[[[[[[[______}}0dmuyDJLOQQRRRRQQOMJxib::-~&$@+...+@%=>//[",
+"_^________^/>*%@....            ..@%~1kAFFAxlc<<::aixEMQRRSSSSSSSNIzp|!!!!)|AFMMMLECtjg99399ajitttsnd6[[[^^_^^^////>>;=&%@++..++@%{*~===-::anwwwsnd96[[[[[[6699999999999aaaabjitCEMOOOMLJCysnd066}}}___[[[[[[[____}}60hnwyDGJMOQRRRRRRQOMExlc::-~&$@++++!{=:(/[[",
+"[[[}}}____^/;*$+...            ..+${<lAFMMFAk1<<:abtCLOQRSSSSSSSRNIo|!!@@!)|oFFMFECtjg933339gjtttsjg96[[[^__^^^^///>>;=&%@++...+@$%&&&**~=:aisttsng906[[[[[6669999999999999aajtCEMOOOOOLECysg966[}____}[[[[[[[}}}}}60huBDCGJLMOQRRRRRRQOMGxlc:<=*&%@@+!){1:3366[",
+"6666[}}}__^/-&@+...           ..+@%~<kAMOOIAk1<<:ajxEMORRSSSSSSSRIz7!!@@@!)|oAFFECtjg93[[339gjitsjgd6[[[_^__^^^^///>>;=&%@++...++@$%%%%&&~<:ciwtsngd96666666999993366663339aglxEFMOOOOMLCysnd06[______}[[666[[}}}}60hsyDGJJLLMQQRRRRRRQOLEkl<<=~{%$$!!)21cgddd00",
+"000066}}__/>=%@...            ..+$&=cxFOOOIAk1<bablxEMQRRRSSSSSNIzp|!@++@@)|oAAACxia93[[[33aajiijgg9[[[_____^^^^^//>>;=*%@+.....+@@$%%%%%{~<cittsngdd000000099999336[[[[399ajtCEMOOOOMLEytnd96[[______[[666666}}660huyDGJJJLLMOQRRRRRRQOLCkc<<~{&%))!||kytsnhdd0",
+"0000066}_^/>*$+...            ..+$&<lAIOOOIAk1baablxJMQRRRSSSSRNIp|!!++++@)|koAAxlg9[[[[[339agjjgg96[[_______^^^^//>>;=*%$+.....++@$$$%%%&{1clttsingdddddddddd99936[[[[399ajtxCJMMOOMFExtng9[[[______[[6666666}}60fnwDGJJJJLLMOQRRRRRRQMFCl1<~~{&)))|ooCCDysnhdd",
+"dfff06}}_^/;&@+..            ...+${<kAIOQOIAkc:aaaixEMQRRRSSSSQIzo|!@+++@@)|ooAxtja3[[[[[339aagaa96[[________]^^^//>>;-*&$+.....++@$%%%%%%{11kxyttinggggghhgddd993[[[[699gjstyCELMMLJCxsgd0[[[______[[669000666660dnBDGJJJJLLOQQRRRRRQOMAkl1~~{{{{{2oAEJJCywnhdd",
+"fff006}__^/-&@...            ...+${1kFOQQNIAlb:39aiyEMQRRRRRRRIzo|)!@+++@!)|oAAxtj93[[[[3339aaaa93[[[________]]^^^//>>-*&$++....++$%&&&%%%{2kkxxytsssssnnnnngad93[[[[69agjttyDCCEEEGDyig96[[_______[[660ddd000000fhsyGJJJLLLMOQRRRRRRQOFok11~~~*~~1kAFMLLGysnhfd",
+"ff006}}__^>=%@..             ...@${1oINRQIFola333ajyEMQRRRRRRIFpo|)!@+++@!)|oAAAtj93[[[[339aaaa99[[[[_________]^^^///>;-*%@+....+@%&***&&%{2koCCxxttttssssinga933[[[[9ajjttyyyyyDDytsgd96[[[______[[[69dddddd000ffnwDGJLLLMOQQRRRRRRRQIAk2~~~~~=<1kAFOOMLEDsnhdf",
+"ff00}}__^/>*$+..             ..+@%{2AINNNIFkca3339jtGMOQRRRROIAo|))@@@+@@!|oAFFAtj93([[339aaaa993[[[[_________^^^^^^//>;=&$+++++@%*=--=*&&)|2oAACCyytttwtsngga33[[[[39gstyyyyywwssngd96[[[^_______[[69ddgnhhfdfdhnsyGJLLMOOQQRRRRRSSSNIo|{{~~==-<lxFOOOOLEDsnhdd",
+"ff06}___^/;&@+..             ..+@%~kAINNOIAlb3[[[9gtCLOQQRQOIAo||)!@@@@@@!|ozFFAxj93((339aaaaaa93[[[[_____^^^^^^^^^^^^/>;*&$@++@%*-;;;-*&&){2oAEECDyyywtsngaa33(/[[[9gjtyyyyyssnggd93[[^^_______^[[69ddgnnnhhhhmnsyDJLMMOQQRRRRRSSSSNHp7|){{~-::cxFMQQQOLEDwshhh",
+"ff0}}__^/>*%+..              ..+${1kzIOOIFxia3[[[6gsCLMQQOOIAo||))$@@@@@!)|zIIFFxia3((33aabbba996[[[[___[[[^^^^^^^^]]^^/>;*%$$$%*->>>>;=&&%{2oAEEECDyttsnga33(((//[[9gstyyyysnghd06[[[^^________[[[99gnnnsnnnnuwBDCJLMOOQQRRRRRRSSSSNHp7)){~=::cxFOQQQQOLJCysunm",
+"hf0}__^^/;&$+...             .+@%~1kzIIIFAkb33[[[6dsyJMOOOIzo|))!@@@@@@@!)7zIIMExia3(33aajjjgad966[[}}}[[[[[^^^^^]]]]]]^/>-*&&&*;>///>>=*&%{2kAFFECDytigaa3((>>(//[39gsyyyysnhd06[[[^^^]]]]]___[[[69ggnnssssswyDGEJLMOQQRRRRRSSSSSSNNv7!)){~<blxFOQRRQQOMLGDywwu",
+"hf0}_^^/>=%@+..             ..+$&~1kAFIFAxla3[[[[6dnyELMMFzp|!!@@@+@+@@@!|pzIIIFxlb:33abjjjjgad000666}}}[[[[^^^^^____]]^^/>-==-;>/^^^/>-*&%{2kAFFJECysga33((>>>>(((3djstytsngd06[[/^^^^]]]]]___[[69dgnsssswwyDCELLMOOQQRRRRRSSSSSSSNHv7!){~<<lAFORRRRRQOMLECDyyB",
+"hf0[^^/>;*%@...            ..+@%*=<lAFFFAkia93[[60dsxEFFFzp7!!++++++++@@)|pIIIIFxlc::abjltiingddd000000006[[[^^^_______]^//>;;>//^^^^/>=&%%)2kAFFJECtia3((>>;;;;>((3ajsttssgdd6[[/^^^^^]]]]]]__[[69gnjsttyyyDGJLMOOOQQQRRRRRSSSSSSSNHp7|{~<<lAMORRRRRRQOMLJGCDDB",
+"h06[^//>=&$+....          ...+$&=-:lkAAAxklja9000dhsyGJFzp7!'++++++++@@$)|pFIIFAxlcbbbittttsnghhffeeeeeee066[[[[_______]^^/>>>//^^^^//;=&%$){2oEFJCxiba::>;;;;;;;>(3ajsttsngd96[[//^^^^^^]]]]_^[[99gjstyDDCCGELLMOOOQQQRRRRSSSSSSSNNHp|211ckAMORRRRRRRQOMLJEGCDy",
+"d0[[//>;*&@+....         ...+$&*;>:blkxxxxttigdddhnwDGEFzp7''.+...+++@@)||AFIFFAklcccitxxxytsnmhhhheeeehff06[[[[}}}}____]^//////^^^//>-*%$$!)|oAEACtcb::;;;;;;---;::acittingd33[/////^^^^^]]]^^[[9gjttDCGGGEJJLLMMOOOQQRRRRRSSSSSSNNIpk11lkAMORRRRRRRQQOMLLJGCDB",
+"0[[//>>-*%@+...         ...+$&*;>((:clkxxCCCytnmmnsyDGEzp74''....+++@@$)2oAFFFExklccitxCCCxytsnmmmmhhmmmmmff06[}}}}}____]^//////////>-*%$@@+!!|oAokl<<===--;;;--==-:bcitlingd33/////////^^^^^^^[39jtyCEJLLLLLLLLLLLLMMOQRRRRSSSSSSNNzokllkAFORRRRRRRRQOMLLJEGDBw",
+"[[//>>-*&$++...        ...+$&=;>///(ablxAEJJGDywsswDCGEzp4''.....++@@$){2oAFFFAxllcilxCCCCDywsurmmmmmmrrrrmhff0066}}}___^^//(3333((>-*%$++++''77oo22{{{**=-----====<<ciiliiga33(///////////^^^^[3aiyCJMMMMMMLLJJGGGEJLMOQRRRRSSSSSNIzoklkAFORRRRRRRRQQOMLJEGCDwu",
+"[[/>>-*&%@+....       ...+@&*;>////(3alxEMMMLJCDyyDDGGzzp4''#....++@$){2koAFFEAxliiltxCEECDywuurrrrrrrruuurrmhhfe00}}___^^/39ajga3:={)@++.##''4477|)))%%&*=---=***~~<cilliiba3(((>>>>>>>>>>////[9jtCFMOQQQQOMLJCDyyxCEMOQRRRRRSSSSQIAokxAFORRRRRRRRRQOMLJJEGDysn",
+"[/(>-**&$++...        ..+@%*;>/^^^//3alAMOOOOLJGDDDGGEzp44''#...++@@$)22kAAFEACtliilxCCEECDywwuurrrrrruuwuuwuumhffe0}}__^[[9gtytlc<{)!+.###,,,,447!!@@@$%&*===*****~~1cilicba:(>>>>>>;;;;;;>>/(3atCFMQQRRRQQOLEDttttCEMOQRRRRSSSSROFAoxAFORRRRRRRRRQQOLLJEGDywnh",
+"//>-=*&%@++...       ...+$&->//^^^^/3atEMQQQQOLJGGGGJJzp44''#...++@$){2koAEEEAxliiltxCEEECDyBwuurrrrrruwwBBBBwwurhf06}}_[[9gtxDxtl2)!''###,,,,,44'''++@@$%&******&&*~<1ccccb:::;;;;;;-==**=-;>(3ixJMQRRRRRRQOLEDtttxELOQRRRRRSSRRROFAAAFOQRRSRRRRRRQQMLJEGCDysh9",
+"/>;=*&&%@+....       ..+@%*;>/^^^^^/3bxLOQRQQOMLJGGJJJzp4'''#..+++!))22koAAAAxtliiltxCEEEGDyywuurrrrruuwBBDDDDDBwrmf06}}[6dntDCxk2|!'''##,,,,5544'''+++@$%&&***&&&&{{~<<ccc::---=====**&&&**-:(btEMQRRRRRRRRQMECytxEMOQRRRRSSRRRROMFEEFOQRRSSRRRRRRQOMLEGCDysnd6",
+"/>;=*&&%@+....       ..+@&=>//^^^^/[9iCMQRRRQQOLJJGJJFzp4,''#..++!!)||oooCACxtijjjlxCEEJEGCDywuuurrruuwBBDDGJJGGDBumd06669ditxxtk2|!'''',',,555544''+++@@$%&&&&&&&&&{~<<<<<<==~*****&&&%%%&*=:blCMORRRRRRRRRQMECxCEMOQRRRSSSRRRRQOMFFMOQRRSSRRRRRRQQOLJGCDysnd0[",
+"/>-**&%$@+....       ..+$&->//^^///3atFORRRRQQOLJJJJJFzp44,,''''!!77ooooCCCxtljbjitxCEJJJEGDDBBuuuuuuuwBBDGJLLLJGDyumd0009gnstll2|)!!+''''445vvv477!++@@@$%%&&%%%%%%&*~=<--=~*&%%%%%%%$$$$%*-:cxEMQRRRRRRRRQOMJEEFMOQRRSSSSSRRRQOMMMMOQRRSSSSRRRRRQQMLECDysnd9[[",
+">>-**&%$@+...        ..+$*->//////(3jCMQRRRRRQOMLJJJFFzv44,,,''477ppzzAAACxxtijbjlyCELLLLJGGDDBwuuuuuwBBDGJLMOOMLJDBuhdd9ddgnic12))!!!!!)77ppvvzpp7!!!@@$$$%%%%%$%%%%&*~==~*&%$$@@@$$$$@$%&~:biCJOQQRRRRRRQOMLJJLMOQRSSSSSSSSRRQOMMOOQRRRSSSSSRRRRQOMLGCywsg96[[",
+">;=*&&%$@+...        ..+%*;>////>((btFORRRRRRQOMLLJLLIIvv555555vvHHIIIFFAAxtljjjitCELLLMLLJGDDBwuuuuuwBBDGLMOQQOMLGDwsghdddaab12)))))){22|ozzIIIzpo|))$$$$$$$$$$$$$$%%&*~**&%$@@+++@@@@@$%*-:aiCJMOQQRRRQQOMMLLLMOQRSSSSSSSSRRRQOOOQRRRRSSSSSRRRRRQOMLGCysnd9[[^",
+";=*&&%%$++...       ..+@&=;>//(>>::iAIRRSSRRRQOMLLLLMIIHvqqqqqKPPNNNNNIFEAxtljjitxELLMMMMMLJGDDBwuuuuwBBDJLOQQQQOMLGDwngddda:<2)))){21<clkAFIIIIFAo2{))$$$@@@@@@@@@@$%%&&&&%@@++++++++@@$&=;(aixGLMOOQQQOOMLLLMMOQRRSSSSSSSSRRRQOOQRRRRRSSSSRRRRRRQOMLECywnd6[^^",
+"**&%%%$@+...        ..+%*;>///>;;<1kFQSSSSSRRROMLLLMOOHHKKKKKPPPNNSSSROMJAxtljjiyCJLMOOOOMMLJDDBBwuuuwBBDJLOQQRQQOMJGywngaaa<2{)!||21cclxAFMOOOOMFAk2{)$$@@@++++++++@@$%%%$@@+++.+++++@@%&->3ajtDGLLMOOMMLLLLMOQQRRSSSSSSSSSRRQQQQRRRRRRRSSRRRRRRRQOOLLGDtnd[[^/",
+"%%$$$$$@+...       ..+@&=>>//(>;-12oINSSSSSSRROMLLMMONNNPPPPPPNSSSSSSSRMFExtljitxGLMOOOOOOMLJGDDBwuuuwBBGJMQQRRRQQOLJGDtigbc12|777okktxxEFMOOQOOOIzo2{)$@@++++++..++++@@@@@+++....++++@@%*-(3djsyCGJLLLLLLLLMOQRRRSSSSSSSSSRRRQQQRRRRRRRSSRRRRRRRRQQOMLEDtg9[///",
+"@@@@@@@@+...      ..+@%*;>//((:;=12zISSSSSSSRROMMLMOQRNNNNNNNSSSSSSSSSROFCxtiistCELMOOQQQOMLJGDBwwuuuwBBGJMQRRRRRRQOMLECyti1277ppzzAACCELMOQQQQQOOIAo|!@@++..........+++++++......++++@@%*;(3ajsyDCGEJJJJLLMOQRRRSSSSSSSSSSRRRQQRRRRRRRRRRRRRRRRRQQQOMLGysa3[//;",
+"+++++@@++...     ..+@%*;>///((:;<1kzNSSSSSSSRROMLLMORRSSSSSSSSSSSSSSSSROFCttiisyCJLMOQQQQOOLJGDBwuuuuuBBGJMQRRRRRRRQOOMJGCxopvvHHIIFFJFLMOQQQRRRROIzp|!+++........................++++@$&=>(3antyDCGEEJJLLMOQRRRSSSSSSSSSSRRRQQQRRRRRRRRRRRRRRRRRQQOOLJCtg9[//>=",
+"++++++++...     ..+@%*;>////((>:<<kFQSSSSSSSRQOMLLMORSSSSSSSSSSSSSSSSRQMJCtiiityCJLMOQQQQOMLGDBBuuuuuuBBGJMQRRRRRRRRQQOMLFzzHHHNNROOMMMMOQQQRRRRRROIp7!++.........................+++@@%&->3djsyDCCGEJJLLMOQRRRSSSSSSSSSSSRRQQQRRRRRRRRRRRRRRRRRQQOOMJCtn9[[/>;*",
+"....+++....    ..+@%*;>//////(>::<lFOSSSSSSSRQOLJLMORSSSSSSSSSSSSSSSRRQMExsinstyCJLMOQQQOOLJGDBwuuruuuBBDJMQRRRRRRRRRRQOOIIHNNNNSRQOMMMMOQQQRRRRRRRIz7!'+.........................++@@$%*;(agsyDCGGJJLLLMOQRRRSSSSSSSSSSSRRQQQQQRRRRRRRRRRRRRRRQQOMLJCyj9[[^/>=&",
+"...........   ..+@%*;//^^/[[/((>(:lFORSSSSSSRQOMLLMRSSSSSSSSSSSSSSSRRRQMCtsinssyDJLMOQQQOMLGDywurrrruuBBDJMQRRRRRRRRRRRRQONNNNSSSRRQOMMOOQQQQRRRRRRNIp7''+............         ...++@$%&=:3gsyCGGEJLLLMOOQRRRSSSSSSSSSSSRRQQQQRRRRRRRRRRRRRRRRQOMMLECynd6[^^>-&%",
+"..........   ..+@%*;//^^^[[[//(((3iEORSSSSSSRQOMLMORSSSSSSSSSSSSSSSRRROLCtsnnswyDJLMOQQOOMJGDBwurrrruuBBDJMQRRRRRRRRRRRRRNNNSSSSSRRQOMMOOQQQQQRRRRRNIz4''++.++.........         ...+@$%*-:bixCGEJLLLMOOQQRRRRSSSSSSSSSSRRQQQQRRRRRRRRRRRRRRRQQOMMLJCysg9[^^/;*%@",
+".......... ....@%*;/^^^__[[[/((((3bCMRSSSSSSROOMLMORSSSSSSSSSSSSSRRRRROLCytssswyDGLMOOOOOLJCywwurrruuuBBDJMQRRRRRRRRRRRRNSNSSSSSSRRQMMMOOQQQQQQRRRRRIzp7!+++@@++++.....         ...+@@%*<ciyCEJJLLMMOQQQRRRRSSSSSSSSSSSRRQQQRRRRRRRRRRRRRRRRQQOMLJGDwnd6[^/>=&@+",
+"..............+$&->/^^__}}[[/(((/3bxMQRSSSSRROMLLMORSSSSSSSSSSSSSRRRRROLGCytwwByDJLMOOOOMLGDywwurrruuuBBDJMQRRRRRRRRRRRRSSSSSSSSRRQOMMMMOOQQQQQRRRRROIp7!!@@@$$$@@++....         ...+@%{<ctxCEJLLMOOQQRRRRRSSSSSSSSSSSSRQQQRRRRRRRRRRRRRRRRRQQOOMLGDwn9[[/>=&@+.",
+".............+@&=>/^^__}}[[(((>(/(axLQRRSSSRROMLMMORSSSSSSSSSSSSSRRRRROMLGCDyyyDGJLMOOOOMJGDywwuuruuuwBBDJMQRRRRRRRRRRRRSSSSSSSSRRQMMLLLMMOOOQQQRRRROFo|!$$$%%%%%$@+....         ...+@){1ctDCEJLMMOQQRRRRRRSSSSSSSSSSSSRRRRRRRRRRRRRRRRRRRRRRQQOOLJDwn9[/>-&$+..",
+" ...........+@%*;/^^__}}6663((>//(9tEORRSSRROMLLMMORSSSSSSSSSSSSRRRRRRQOMLLEGCDGJLMOOQOOMLGDywwuuuuuwBBDGJMQRRRRRRRRRRRSSSSSSSSRRROMJEEJLLMMMOQQQRRQOzo|)$$%%&&&%$@++...          ..+@${1clxCGJLMOQQRRRRRRRSSSSSSSSSNSRRRRRRRRRRRRRRRRRRRRRRRRQQOMLGyn93(-&$+...",
+"  .........+@$*->/^^_}}60003(((//[9lEMQRRRRQOMJJLMQRRSSSSSSSSSSSRRRRRRQQOOMLLJJJLMOOQQOOMLGDywwuuuuuwBBDGJMQQRRRRRQQQRRSSSSSSSRRRQOLEGGGEJLLLMOQQQQOFA2{)$$%%&&&%$@+....          ...+${<bitCGJMMOQRRRRRRSSSSSSSSSSNNNRRRRSRSRRRRRRRRRRRRRRRRRQQQOLGyg9(:*$@... ",
+"  ........+@$&->/^^_}}60fd03(((//[3jxMOQRRQOMFEGJMORSSSSSSSSSSSSRRRRRRRRQQQOMMLMMOOQQQQOMLGDywuuuuuwBBBDGLMQQRRRRQQQQRRSSSSSSSRRRQMLEGCCGGGJLMOQQQQOFo2{)$$$%%%$$@++....          ...+$&<:bixCJMOQRRRRRRRSSSSSSSSSNNNNRRSSSSSRSRRRRRRRRRRRRRRRQQQMLCwg3(-&@+..  ",
+"  .......++$&=>/^^__}}0ddd03((////3atEMOOOOMFGCCGLORRSSSSSSSSSSRRRRRRRRRRRQQQOOOOQQQQQQOMLGDywuuruuwBBDDGLMQQRRRQQQQQRRSSSSSSSRRRQMLEGDDDDCGJLOQQQQMEk2)$$@$$$$@+++......         ...+$&-(ajtCJMOQRRRRRRRSSSSSSSSNNNNNNSSSSSRSSRRRRRRRRRRRRRRQQQOLJDsa3>~%@..   ",
+"  ......++$&=>/^^]__}60ffd03(///^^[3iCFMOMMJCDyDGLORRSSSSSSSSSSRRRRRRRRRRRRRQQQQQQRRRQQOMJCywurrruuBBBDGJLMQQQQQQOOOQRRRSSSSSSRRRQMLEGDDDDDCELOQQQOMAk2)$@@@@@+++........        ....@$&-(3gtCLMQQRRRRRRRSSSSSSSNNNNINNSSSSSSSSRRRRRRRRRRRRRQQQOMJCwg9(;*$+..   ",
+"  ....+++@%*;/^^]___}60ef03((//^^^/3axAFMFFAxywyDJORRSSSSSSSSSRRRRRRRRRRRRRRRRQQRRRRRRQOMGDwurrrruwBBDGGJLOOQQQOOMMOQRRSSSSSSRRRQOMLEGDyyyyDGLOOQQOFCl{)$@@++++..........        ...+@$*;(3bxEMOQRRRRRRRRSSSSSSNNNHHINSSSSSSSSSRRRRRRRRRRRRQQQOMJGynd3(-&@..    ",
+"  ....++@%*->/^]]__}}60e003(//^^^^^[9lxEEEAxtsswDJOQRRSSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRRQOLGysrmmmruwBDDGJLLMOOOOMLLLMOQRRSSSSRRRRQMLJGDyywwwyGLMOQOMFx1{)$@+++.............       ...+@%*;(3jxFMQQRRRRRRRRRSSSNNNNHHINNSSSSSSRSSRRRRRRRRRRRRQQOMLGysg93:*$+.     ",
+"   ...+@$&->/^]]]__}}800063///^^^^^[3btCAAxysissDJOQRRSRRSSSRRRRRRRRRRRRRRRRRRRRRRRRRRQOLCwummmrrwBDDGJJLLMOOMLLJJJLOQRRRRSRRRRQOMJGCDywuuwyGLMOQOMAk1{)@@++...............    .....+@%*;(bxFMOQRRRRRRRRRRSSSNNHHHIINNSSSSSSRSSRRRRRRRRRRRRQQOLJDwnd3(=%@..     ",
+"   ..++@%*;/^]]]___}}66666[//^^^^^^^3alxxxxtinnsDJORRRSRRRRRRRRRRRRRRRRRRRRRRRRRRRSSRRROJDwnmmmruBDDGJJLLLMMMLJGGGGJMQRRRRRRRRQOMJGCDywuuusyGLMOOMFAl1{%@++........................++@%~:alEMQQRRRRRRRRRRRRRNNHHzzIHNNSSSSSSRSSRRRRRRRRRRRRQQOLGysg9(-{@+.      ",
+"   ..++$&->/^]]]____}}}6[[[//^^^]]^^39jtxxtijnnwDLORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSRRMJDwrmmmrwBGGJLLLLMMMLJGCCDGJMORRRRRRRQOMJCDyywwurrsyGLMOOMExl<{%@+.......................+++@$&=:lAMQRRRRRRRRRRRRRROIzzpppzHNNSSSSSSSSRRRRRRRRRRRRRQOMJDtna3:~$+.       ",
+"   ..+@%*;>^]]]]]___}}}}[[[/^^^]]]^^[3bltttinnsyGLQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSQMJDwnmmruBDGJLLMMMLLJJGDDDDCELOQRRRRRQQMJCyyywwuumrsyGLMOMLAkc<~%@+...    .....+++....+++++@@$&*<cxMQRRRRRRRRRRRRQQOFAoo77pzHNNSSSSSSSSRSSSRRRRRRRRRQOLGyiga:=)@..       ",
+"   ..+@%*;/^]]]]]____}}}[[/^^^^]]]]^[3ajltiiiswDJMQRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSQMGywumruwDGJLMMMMMLJJGDDDDDCELOQQRRRQQMExtsswwwuuruwDELMMMFClb:~%@+...    ....++++++++@@$$$%%&*-:lFORRRRRRRRRRRRQOMAok|||7pIHNNSSSSSSSSSSSSRRRRRRRRQOMJDtga3:{$+.        ",
+"   ..+@%*;/^]]]]]______^^^^^^]]]]]]^^[9gjiiiswyGLOQRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSQLGywuruwBDJLMOOOMLLJGDyyDDDGELMOQQQQQMJxtsssuwwuuuswDJLMMMExj::=%@+..     ...+++@@@$$%%&&****~-:bxFORRRRRRRRRRRQOFAk22))|7pHNNSSSSSSSSSSSSSRRRRRRRRQOLGyia3:=&@+.        ",
+"   ..+@%*;/^]]]]]______^^^^^]]]]]]]_^[3ajiistyDJLORRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSOLGywuuuBDGLMOOOMMLJGDyyyDCGEJLMOQQQQMJCtsnnsuwwwuuwyCJLMMJClb3:-&@+...   ....++@$$%&&*=------;>:jAMQRRRRRRRRRRQOFAk12{))!7vHNNSSSSSSSSSSSSSRRRRRRRRQOJCtg93:~)+.         ",
+"   ..+@%*;>^]]]]______^^^^^]]]]]]]]_^[[9gnistDGJMQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSNNOLGywuwwBDJLMOOOMLJGDBwwyDGJJLLMMOOOMLGysnnruwBwwwuwyGJLLLExj3(>-&@+...  .....+@$%&*=-;>>>>>>>>(alAMOQRRRRRRRQQOLAkl1{)))|pvHNNSSSSSSSSSSSSRRRRRRRRQOMEDsa9(-{@+.         ",
+"   ...+$&->/^]]_____}[^^^^]]]]]]]]]__[[9dgntyCELOQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSNSNROLGywwwBDGLMOOOMLJGDwsstDGJLLLLLMMMMLEDtnnnuwBBBBwwBDGJLLExia3/(;&$+.........++$%&*-;>>////>>>/(atEMOQQRRRQQQOMLExl<1{{))7pHPNSSSSSSSSSSSRRRRRRRRRRQOLGyia3:~)+.          ",
+"    ..+$&->/^]]___[[[[^^^^]]]]]]]]]__[[69gntDCJLOQRRRRRRRRRRRRRRRRRRRRRRRRRQQQRRSNNNSQMLGDBBBBGJLMOOMMJGDwunsyCJLMMMMLLLLLECtsnnswBDDDBBBBDGJJECtb3///;*$+.........+@%&*-;>//////////(atCLMOOQQOOOMLJExlc<<~{{|7vHNNSSSSSSSSSRRRRRRRRRRRRQMJCtga3<{@+#          ",
+"    ..+@&=>/^^]_[[[[[[[^^^]]]]]]]]]___[60dntDGJMOQQRRRRRRRRRRRRRRRRRRRRRRRQOOMOORNNNQOMJGDyBBDGJLMMMMJGDwumnsyELMOOMMLLLJECyssnswBDDDDDBByDGGGCtj93^//;*$+........++$&*=;>>//////>>>/(aixELMMMMMMLJECxlca:<~{{|pHNNNSSSSSSSSSRRRRRRRRRRRQOLGysga:~!+.           ",
+"    ..+@&=>/^^^^[6666[[^^^^]]]]]]]]____}0dntCELMOQQRRRRRRRRRRRRRRRRRRRRRRQOMLFFMOOQQOMLECDBBDDGLLMMMLJDwughgsCJMOQOOMLJEGDysnnnuwyDGGDDByDDCCDtj93^^//;*$+........+@%&*-;>>/////>>>>//3btxCEEEEEECCxtlba::<~~2ozHNNSSSSSSSSSSSRRRRRRRRRRQMJCwna:<)@+# #         ",
+"    ..+$&->/^^^[[6666[[^^^^]]]]]]]]____[0dntCELMOQQQRRRRRRRRRRRRRRRRRRRRQOMJGCCEFMOOMLJGDDBBDGJLLMMLJDysngggtCLOQQQOMLECytsnghnsBDGGJGDDDDDDDyja3[^^^/;*%+.......++$&**-;>>>>>>>>;;>>((9jityxxxxxxttiba3(:<<12pIHNNSSSSSSSSSSSSRRRRRRRRQQLGDsna<{!+.            ",
+"    ..+%=>/^^^[[6666[[[^^^]]]]]]]]]]___[6dntCELMOQQQRRRRRRRRRRRRRRRRRRRRQMJCytyxCEFFJEGDDBBBDGJLLLLJGDwngdgiyEMOQQQOMJCysngddhnuBGJJJJGDDDDyysg9[^^^^/>*%+.......+@%&*==-;>>>>;;---;;>((3aggjiiiiiibaa3((:<<2ozHNNNSSSSSSSSSSSSSRRRRRRRQOLGysb:~)+.# ##         ",
+"    .+$*;>^^^^[[666[[[^^^^]]]]]]]]]]___}60ntDGJLOOQQQRRRRRRRRRRRRRRRRRRQOLCysiistDCCCCDyBBBBDGGJLLJJDBshddgixJMQQQQOLEDtngdddhuBGJLLLLJGDDywsg9[[^^^^/>=&@+.....++$%&**=---;;--=***==;>((333aaabccba:(((>:<12oINNNSSSSSSSSSSSSSSSRRRRRRQOLCyic1{!+## #          ",
+"   ..@&->/^^__}[[[[[[^^^^]]]]]]_]]]_____69gsyCJLMOQQQQRRRRRRRRRRRRRRRRQOMGDwngggiswyyywwwwwBDDGJJJGDyundaaaiCFOQQQQOLEDsndddhuBDJMOOOMLJDDBsgd6[^_]]^/>-&$+.....+@%&***======***&&&&**=;>>((::::::::((((>::1ozINNNSSSSSSSSSSSSSSSRRRRRRQOLCyic2)+.####          ",
+"  ..+%*>/^]]__}}}[[[^^^]]]]]]]]]_]______[0dntDGJLMOQQQQRRRRRRRRRRRRRRRQOLCysndddgnnsssuuuuuBBDGGGGDywnd93abiCFOOQQOOLGDsnghhrwDJMOQQQOMJGysnd6[[__]]^^/;*$++...+@$&**======***&&%$$$%%&*=----=<<<::((((((:blAINNNSSSSSSSSSSSSSSSSSRRRRRQOLGyl1)!'####           ",
+" ..+$*;/^^]____}}[[^^^^]]]]]]]___]_____}[9dnsyCGJLMOQQQRRRRRRRRRRRRRRQOMEDsnddddddhgmnrrruuwBDDDGDBwmd93::bixFOOQQOMLEDwsnnswDJMQQQQQQMLGysg9[[^__]]]^/>=&@++++@$&*=---===***&%$$@@@@@$%&&***~~=<::((((((:ckAIQNSSSSSSRRSRSSSSSSSSRRRRRQOJCk2|!'#####           ",
+"..+$&;>^^]________^^^^]]]]____________[[69dgswyCEJLMOOQQRRRRRRRRRRRRRQOLCyuhd00660ddhhmmrruwBBDDDBwrd03::::ixJMOOQOOLJGDBwwBDJMOQRRRQQOLGynd6[[^___]]^^>-&%@@@@$&*=;;;;--=**&%$@+++++++@@$%%&{*~=-:((((33alxFORRSSSRRRRRRRSSSSSSSSRRRRRQMJCk|!'####             ",
+"++$&->^^]]_____________]_____________[[69ddgnsyDDGJLMOOQQRRRRRRRRRRRQQLEDsmdd0666600ffhmmruuwBBBBwrh03(:-<<cxEMOOOOOMLJGDDDGJMOQRRRRRQOLCyn96[[[^___]^^/;*&$$$%&*-;>>>;;;-**&$@++......++@$%%&{~~<::(333aixEMOQRRRRRRRRRRRRSSSSSSSSRRRQOMAk2!'### #             ",
+"@%*;>^^]]___________________________[[6dggnnsswyyDGGJLOOQRRRRRRRRRRRQOLDBrhd0666[660ffhmmrruuuwwumh03(:-==<ckELMOOOOMMLJJJJLMOQRRRRRRQOLCwn93[[[[[^__]^/>=*&%&&*-;>>>>>;;-*&$@+..........+@$)){{~<<:aaagitCJMOQRRRRRQRRRRRRSSSSSSRRRRRQMJxk|!'##                ",
+"&=;/^^]]___________________________[[9gnsssssswwByDDGJMOQQRRRRRRRRRQOLGysmhe066[[[60ffhmmmmrrrmmhf03(>;===<cyGLMOOOOOMMMMMMMOQRRRRRRRQOLCtna936[[[[[^^^/>-*&&&*-;>>>>>>;;=&%@+.....    ..++@$)){211cccityCJMOQQRQQQQQQRRRRRRSSSSRRRRRQOFCl2!'##               ..",
+"->//^^________^____________________[9gsyDDDyywwwwwBDDJLMOQQRRRRRRRRQOLDBuhfe06}}}[60fhhhmmmhhhff033((;-===<cyGLMOOOOOOOOOOOQQQRRRRRRRQOLCyjggadd996[[^^/>;****=;>>>>>>>;=*%@+....       ..+@!!))|2kkkkxDGFMOOQQQQQQQQQQRRRRRRRRRRRRRQOLEt1|!'#               .+@",
+"(((/^^[[}}[^^^^___________________[6gsCEJEGCDywwsuwBDGJLMOQQRRRRRRQOLGDwrhee066}[[60dhhhhfff0063(((>>;===-:cyGLMMOOOOQQQQQQQQRRRRRRRRROLGytsjjnnng96[[//>;**&*=;>>>>>>;=*&$+....        .+++!!!!||ooCAEFMMOQQQQQQQQQQQRRRRRRRRRRRRRQOMExl1)@.               .+@)",
+"ba93[[[6[[[[[^^^__________________[dsCJLMMLJGDywsswwBDGJLMMOQQRRQQOMLDBumhee066}}660dhhhdd0633(((>>;-=~==-:ixGJMMMOOQQQQRQRRRRRRRRRRRRQMJCyyyyyttng96[//>-*&&*=-;>>>;-=*&$++...         ..++!!!77ppzzFMOOOQQRQQQQQQQQQRRRRRRSRRRRRQOMLCtc1)+.              .+@)~",
+"xtingdddd066[[^^_________________[0gyEMOOOMLJGDBwsswBDDGGEJLMOQQQOOLJDwumhee866}6600dddd0663((>>;;-=***=-:bixELLMMOOQQRRRRRRRRRRRRRRRRQMLECCCCCDysgd6[//;=*&&&*=;;;;-*&%$@+...         ...+@@!!77pzzFIOOOQQQQRQQQQQQQRRRRRRSRRRRRQOOLExi:~)+.             ..@)21",
+"JECyttsnngd96[[^________________}[9sCLOQQQOMLEDywsuswwBBByDCJMMOOOMLGywrmhee066666099d9033((>>;;-==****=;:btCELLMMOOQRRRRRRRRRRRRRRRRRQOLJEGGEGCysg9[[/>;*&%%%&*=--=*&%$@+....         ..+@@!!!77pzFIOOOOQQQQQQQQQQQRRRRRRSSRRRRQQOMJCtb:~$+.             .+!|2o",
+"OMLLECDytsgd3[[[________________[6dtEMOQQQQOLJCywsuuuuunnnntxELMMLLEDywrmhee006666699333(((>;;-==*****=;:3gtCELLLMOOQRRRRRRRRRRRRSSRRQOMLJJEGGCDtn9[[//>=&%$$$%&***&&%$@++....        ..+@@$))||opzFIOOOQQQQQQQOOOQQRRRRRRSRRRRRQOMLExja<&@+.            ..+)|oF",
+"RQQOOLJGDtna96[[_______________[[6gtEMOQQQOOLJCywsrnmhhd999ajtCELLJGDywrmmee80666[66333/(>>;-===***==-;>(3iyCJJLLMMQQRRRRRRRRRRSRSRRROMLJGGGCDysn9[[^/>-*%@@+@$$%&&%$$@++....       ....+@%&*~22kAEFMOOOOQQQOOOOOOQQRRRRRSRSRRRQQOMFCtb:~$+..            .+!|oFI",
+"RRRRQOMJGxig93[[[}__________^^[[[6dsCJMOOOOMLGDwsnmhhd06[[[39jtCEEGCDywummhee0066[[[[//(>>;-======-;;>>(3asyGJLLLLMQQRRRRRRRRRSSSSSROMJECDDyttjg9[[^//;*%@+++++@@$$$@@+++....     .....+@%*=-:<ckCEFLMOOOOOOOOMMOOQRRRRRRSRRRRRQOMLExlc~)@+.            .++!pINN",
+"SSSSRROMFxtgd96[}}}______[///////33glxEFLLLJGywsghdd06[[[^^/[9jtCCCDDywurmhff0066[[[///>>;-=====-;>>(//[3gtCEJLLLLOQQRRRRRSRRSSSSRROFEDytsnngg9[[^^^/>=&@++....+++++++++..... .. .....++$&=;>(actCEJLLMMMOMMMLLLMOQRRRRRSRRRRRQOMMFClc<{@+..            .+!7INSS",
+"SSSSSSQOFCtja9066}}}}}_[/////((>>((:bilkxxxytigdd0066[[/^^^^/3ajtyDDDyBwurmhhd006[[////>;;-===-;;>////[6dsDGJLLLLLOQRRRRRRSRSSSSSQIExljggdd96[[[^^^^>-&$++.......+++++++......  ......+@%*;>((ajtCCEJLLLLLLLJJJLMOQRRRRRRRRRRQOMMFAtc<~$+..           ..+!7zNSSS",
+"SSSSSRROFAxigd9066}}}[[//(>;;;------<<<<1cccaa33333[[[/^^^^^^[9gttyyyyBywwummhd06[[////>;;----;>>//[[[3dnyCJLLLLLMOQRRRRRSRSSSSSQFAlba336[[[[[__]^^>-&$++.........++++@++.............+@%*;(/39jtDCGGEJJJEGGCCELMOQRRRRRRRRRQOMFECxib<{$+..           .+!7pHSSSS",
+"SSSSRROOFAxtjgdd066}[[/(>;=********~~~~~~~<<::(((///////^^^^^/3ajsyyyDDDyywurnd96[[////>>;;;;;>(/([39dgntCELLLLLMOQQRRRRRRSSSSRQIClb3([[[[[^__]]^^>;*$++..........++@!!!@++...........+@%=;//3aitDCCCCCDCDDyyyCJMQRRRRRRRRRQOMJExtjb:=&$+..         ..+@!pINSSSS",
+"SSRRRQOMMJECysnhd06[[/>;=*&%%%&&&&&****{{**~=-;>>((//////^^^^^[9gstyyDDDDDyBsng93[[////>>>>>>>((33agjstDCELLLLLMMOQRRRRRRSSSSSOIxla((/^^^____]]^^>;*$@+.........++@!)))))!@++.........+@%*;(/3aiyDDDDyyBwwtstyCLOQRRRRRRRRQMLECxtjb::=&@+....     ...+!|oINSSSSS",
+"RRRQQOOOMMLJECyshd93(>-*&%%$%%%&&&&*&*&&&&&**==-;>>>>////^^^^^[9gjtyDDCGGGDywsg96[///////(>>(((39gitxCGELLLLLMMMOQRRRRRRSSSSSOFCla((/^^^]]]]]]^^>;*%@+.........+@$){22222{)$@++.......+@%*;>/3gsyDDDywwunnnisyELOQRRRRRRRQMFECxtjba(:=&$@+.........+@!|ozNSSSSSS",
+"RQQOOOOQQQOOMLGysh93:-*&%$$$%%&&&********&*****=-;>>>///^^^^^^[3gjtyDCGGEGGDysg9[[///////////[39gtCEJLLMMMMMMMMOQRRRRRSSSSSSQMAla3(/^^^]]]]]]^^/;*%@+........+@$&~1<1lcc<<~{%@+........@%*;>(3gsyDDywsnmhhgntxEMQRRRRRRRQOLECxtiba3(:=&$@++.....++@$)2kzIRSSSSSS",
+"OOOOOQQRRRQQOMLCyia:;~*&%%%%%&&**=====********==-;>>>//^^^]]]^[3antyDCGEEGGDysd9[[[[[[[[///[[69gtCJMOOOQOOOOMOOQRRRRRSSSSSSRIAkb3(/^^^^]]]]]^^/>=&$+.......+@$%*=::bbbcb::-~&$@+.......@%*->(3gsyyyBsnhdddgiyELOQRRRRRRRQMJCxtljba3(:-*%$@+++++@@%&~1kAIRSSSSSRR",
+"MMMOQQRRRRRRQOMExia:-~*&&&&&&**=--;;;;;---====--;;>>/^^^]]]]]_^[9nsyDGGEEEGDwnd6[[[[[[[[[[[669gsDEMOQQRQQQQOOOQQRRRRSSSSSNNIzkc33/^^^^^]]]]]^/>-*%@+......+@$&~->((33aa3(:-=*%@+.......+$&=;(3gsyywsnhd09djtCJMOQRRRRRRROMExtiija33(>-~&%%$$$$%&*=-:lAIRRSSSRRRQ",
+"FLMOQQRRRRRRQQMExib:-=**&***==-;;>>>>>>>>>>;;;;>>>//^^]]]]]]]_^[9nsyCGGEEGCysg9[[[[[[6660600dgsyELOQRRRRRQQQQQQRRRRSSSSSPPHzo1:((//^^^^^]]^^^/>-*%@+......+$&=;>(((333((>;-=&%@+.......+$&*->3aitssnhd069diyELOQRRRRRRRQOLExtija93((>;-=*&&&**=-;>(cxFORRRRRRQQO",
+"EFMOQRRRRRRRQOFCtc::-=~****=--;>>>>///////////////^^]]]]]]]]]__[9gsyCGGEGCytnd6[[[[60dfdhhdhmsyGLOQRRRRRRRQQQQRRRRRSSSNPKKv7|1:((/////^^^^^^//>-*%@+.....+@%~;>(/////((;-=~*&%@+.......+@%*-:(aninnd06669gtCJMOQRRRRRRRQOLCytjga33(/(>>;;--;;>>//3bxFOQRRRRQQOMF",
+"CELOQQRRRRROMFAklc:-=~*****=-;>>>///^^^^^^^^^^^^^^]]]]]]]]]]]]^[9gsyCCGGCDtsd96[[[60dhmrrmmruwDJOQRRRRRRRRQQQQRRRRSSSNPKq54'!{=;>(//////[[[[(/(;=&%@+...+@%*->((/[///(;-**&&%$@+.......+@%*=;:agggd06[[39gtCLMOQRRRRRRQOMEDtiga33(/////>>>>/////3bxEMOQRRQQOMFEC",
+"xEFMOQQOOOIFAolc<<<~~*&&&**=-;>>//^^^]]]]]]]]]]]]]]]]]]]]]]]]]^[3gsyDCCCDtsgd06[660dmuwwwuwwBDGLOQRRRRRRRQQQQRRRRSSNPKqq5,,'@){=;>(((33aabbbaa3::~&$@+++@$&=:(333[[/(>-*&%%%$$@++......+@%*=;(aagdd3[[[39gtCLMOQQRRRRRQOLCyiga33[////////^^^^^[3btEFOQQQQOMFAxtl",
+"tCEFMMMIFAokk211~~~{&%%%%&**-;>/^^^^___]]]]]]_________]]]]]]]]^^[ajtyDyytsgd906600dnuwBBBBwByDJMQRRRRRRRRQQQQQRRRSNNHq5,,##.+@%*-::abblxCCACxtib:<{%$@@@%*=:33aad333(:=&%$$$$$@@++.....+@%*=;:3ada33(/(39jtCJMMOQQRRQQOLGysga93[///^^^^^^^]^^[3btCFMOOOOMFAxijba",
+"ltxCAAAoo||22{{{{{&%%$$$%&*=;>//^^______]]]]]__[[[[[^^_]]]]]^^^^[9gjtttsngd99000dhnuBDDDDBBBDGLOQRRRRRRQQQOOQQQRRNHv5,,### ..@${~<cltCFMMOOMMExic1{)$$%&~-:abnjijga3(:~&%$$$%%$$@+++..+@$%*=;::aaa3((((39jtCEJLMOQQQQOLEDsg93[[/^^^^^^^]]]]^[3gtCEMMMMMFExlja999",
+"jjllll22|{))))))))%$$$$%%&~;>//^_______]]]]]__[39999[[^_]]^^^^^^[3dgnnggd990090dhnsBDDDDDDBDDJMOQRRRRRQQOOMMOOQOOIv4,###   ..+${1clxEMOQQRRQOMEyi1{))%{=::aityxxttja::={%%%%&&&&%$@++++@%&*=-:::a:3((((39gsyDGJLMOOOOLEDsg9[[^^^^^^^]]]]]_^[3gtCELMMFFECxja99339",
+"9aaab<1{{))))))))))%%%%&*=;>//^_________]]]__[9ajjjg93[^^^^^^^^^/[39dd99666609dhnswBDGGGDDDDGJMOQQRRRQOMLLLLMMMMzp4'##     ..+${1lkAMOQRRRRRROJx22{)&*=:agtxCCECCxtja:=~&&&&*****&%$@@@$%&*~=<<:::((((33dgityDGJLLLLLGDsg9[[^^^^^^^]]]]]_^[9gtCEJFFFECxtja9936[6",
+"333(::=~~{{{{{{{{{{{{*~=;>(//____}______]]__[6ajttttj9[[^^^^^^^^/[[6366[[[[660dgnsBDDGGGDDDDGLMQQQQQQOMLEGCCCECoo7'##      ..+${<cxEMQRRRSSRROzo||){{=:agtCEJLLJECxlb::==~~=--;;;-=*&&%&&*~~~<<<:::(((33dgnstyyCGEEGCynd6[[^^^^]]]]]]]__^[3gtxEEEEACxtjga999666[",
+"[[(/(>>;;---<<<::<:-:::((/[[}}}}}}_____]_]__[9nsyyytja3[^^^^^^^^/[[[[[[[[[[60dhnuwBBDGGGDDDCGLMOQQQQOLECyttttll2)!'.       ..@%~:ctEMQRRSSSRRIzo2{{{~::gtCELMMMLLECtb::;--;;;>>>>>>;-=~~~~~~~~1<<::((333dggnnswyDDDysnd6[[___]]]]]]]___[[3aitCAACxtljbaa99999936",
+"[[///////((333aa93333333[[}}}}}}}}_____]]__[[djtyyysnd6[^^^^^^^^^[[[[[[[[[[60dhnuuwBDDDDDDDGJLMOQQOMLGDsjgaac1{)++..      ...@%~:aiAMQRRRRRRIzo22{{~::btCJLMMMMMLECtb:::>>>>>////^//>>;;--=~~~11<::33339dghggnsswwsng96[____]]]]_____[[[3ajtxxCxklcbaa9dddddd996",
+"[[^^^^^[[[69dddhddd00066666}}}}}}}____]]]__[6dnswwsnh9[[^^^^^^^^[[[[[[[[[[[60dhmuuwBBBDDDDDGJLMOOOMLGyja93(:~{!@+..       ..+@&=>3bxFOQRRRROIAk2~~<::btCJMMOOMMMMEClc:(>>>////^^^^^^///>>;-=~~11<::33399dddhhgnnsnng96[[^___]]___^[[[[69agittkkllcbaaaddhhhhhd06",
+"[[[[_[}[660dhmmmmhhfee0008888}}}}____]]]]__[6dgnnngd06[__]^^^^^^[[[[[[[[[[60dhmrruuuwwBByyDGJLMMMMLGyja3((-*%$++..        ..+@&->(atEMOQQOOFAk1<<::abtCJMOOOOOMMLExlb:(((////^^^]]]^^^///>:-<111cba3999ddddhhhnnngg96[[________[[[699dgggjiiliccc:aadddhmmnmhd06",
+"[____[}60dhmmuuurmhfeee8888888}}____]]]]]__[60dhhdd06[___]]]^^^[[66[[[[[[[60dhmrrrruuuuuwwyCELLMLJGysa3((-*%@+....        ..+$*;((3jxJMMMMExlc::((3aiCJMOOOOOOMMFExia:(((///^^^^]]]__^^//((:<<<cbaaddddddhhhgnnnngd96[[______[[69dnnjjiijjcccc<<::addhmmrrrmhd06",
+"____}}60ffmuuuuurmheeee888888}}}___]]]]]]__}60000066}____]]]^^[[600666[[[60fhmrrrrrrmmmmrsyCELLLLGDsg9[/;~%@+...         ...@&=>//3aixEEAxtca3((33diyEMOQQQOOOMMJCtb:(((////^^^]]]]___^^//((:<ccbggggggnnnsssssssnd06[[[___}[60gntyyyttijcbc<:::a9ddhmrrrrmhf066",
+"__}}}600dhmuuwuurmheee888888}}}____]]]]]____}66066}}____]]]]^^[60ddd066600fhmuuurrmmhhfhhswCELLLEDtg93/(-&$@+..         ...@%*;///[3ajltiba33(/[39gyGLOQQQQQOMMLExib:(((////^^^]]]_____^^/((::bbcnnsssstyyyDDDyysngd006}}}}}0dgsyCCCCxticb<::::30dhhmrrrrmhf06}}",
+"___}}60fhmuuwwurmhfee088888}}}____]]]]]]____}}}}}}}____]]]]]^[60dhhdd0000dhrswwurmheee0ddntDGJJECyja3[/>-&$@+...      ...+@%*;///^[[[999933[/[[[6dsDLOQQRQQQOMLJCtja3((/////^^^]]]_____^^[(((:abnitwyyDCGEJJJJGDysnhdf006600dmsyCGEECylcc:::::300fhmrrrrmhe06}}_",
+"___}}60fhmuuwuurmfee00086}}}}}___]]]]]]]____}}}}}}_____]]]]_^[0dhmmhdd0ddhnwBBwwrmhe0000dntCGJJEDtj93[/>-&$@+..... .....+@&=>///[^^[[[[[[[^^^[[6dnyJMQQRRRQQOMLExlba3((////^^^^]]]]]]__^^[/(33agisyyDGEJLLMMMMLGDwsnhhfffefhmsyCGEECxlcb:::(3300femmrrmmhe06}}__",
+"____}60fhmuuuurmhf000666}}}}}____]]]]]]]____}}}}}______]]]__[60hmmmmhdddhuwyDyBumhe06660dntCEJEGytg93[//;*&@++........+@$*->//[[[[^^^[[[_^^___}0hBGMQQRRRRQQOMLExib33(////^^^^]]]]]]]__^^[/(3aansyDCGJLLMOOOOOMJCywurrmmhhhhnsyDCCCxlca::(33660eemmmrmmhe06}____",
+"____}}0dhmuuuurhd00666}}}}}}____]]]]]]]]___}}}}}_______]___[[6dhmmmmhhhmuwyDDDBumf06}}60dsyGEJECytg93[//>;*%$@+++++++@@%*;>/[[[[[[[^^^_______}6duDLOQRRRRRQQOMJCtja3(////^^^^]]]_]]]]___^//(3agsyDCGJLLMOOQQQOMLGDBwwwurrmmmnswyyytiba33336660eemmrrrmme06}}____",
+"____}}0fhmuuuumhf0066}}}}}}____]]]]]]]]____}}}}____________[}0fhmmmmmmnuwDCGGDBrh06}}[69gtCEJJECytg93[[//>;*&%$@@@@@@$&*;>//[666[[[/^^______}6fmBJOQRRRRRRQOMLGxia3((///^^^^^_____]]]___^^/(3aitDGJJJLLMOOQQQOMLGDDyyBwwuurmniiiicba:33336660eemmrrrrmhf06}____]",
+"____}}00hhnrrnhd006}}}}}}}_____]]]]]]]_____}}}}__________[[[60fhmmmmmnsyDGJJGDwnd6}}_[69jyCEJJECytja9[[^^/>;=&&%$@@$$&*;>//[[6663////^___}}}60hwGLQRRRRRRRQOLECtg93(///^^^^^_____]]]]]]]^^/(3atDGJJLLLLMOOQQQOMLGGCDDDDBwunnggaaa::(((3[[660eemruuwuumhf06}____]",
+"___}}60dhhnnnhd0066}}}}}}}____]]]]]]]]____}}}}}_______^[[[[600fhmmmmrswDELLLJDwh06}_[[6atxEEJEECytjg9[[^^//>-*&%%$$$%*=>///[6633(((/[[}}}}60fmuDLOQRRRRRRQOLECtg93(///^^^^^______]]]]]]]^^/(3btCJLLLLLLMOOQQQOMJJGGGGGDDBwngaa::::((([[[660efmrwBBBBwrh06[[____]",
+"___}}60dhhnnhhd0666}}}}}}}____]]]]]]]____}}}}}}}____[[[[[6600fhhmmruswDELMMLJCsh0[[^[[3gtCEEEEGCxttga9[[^//>;*&%$$$%&*;>/^/[333((((//[[600dhuwDJOQRRRRRRQOMJDtg93(/////^^^]______]]]]]]]^^//3cxGJLLLLLLLMOOOOMLJJGGJJGGDysic:::::((([[[660ehmuwBDDDywnh06[[____]",
+"___}[60ddhhhhd0066}}}}}}}_____]]]]]]____}}}}}}}}}_}[[[6999ddhhhmruuwBDELMOOMLGwg0[[^[[9jtCEEEEECCxtjg9[[///;=*%$$$$%&=>//^[[[3((>>(([66dhnwyDJLOQRRRRRRRQOLCtn93(//////^^^]_____]]]]]]]]^///3bxGJLLLLLLLMOOOOMJJGGGJJGGDBic<<:::((([[[60efhruBDGGGDysnd6[[[_____",
+"___}}60ddhhhdd0666}}}}}}}____]]]]]]____}}}}}}}}}}}6699ggnnnsssswwwyyDELOOQQOMEyn9[[[[39jtxCCCCCCCxtsg93[(/>-*%$@@@$&*->/^^^[///(>>(/[6dnwDGLMOQQRRRRRRRRQMJDjd3[///////^^^]]____]]]]]]]^^//((bxGJLLLLLLLMMOMMLJGCCGGGGDysic<:::((/[[660fhmuwDDGJJGDysg9[[[______",
+"___}}00ddhhdd006666}}}}}}____]]]]]____}}}}}}}}}}6609gnstyyDDDCDDDCGEJLOQQQQQOLDsd3[[[3ajtxxCCCCCCxyig93((>-*%$@@@$%&=>/^^^^^^///////6dnyGLOQQRRRRRRRRRRRQMEyg93(/((/////^^]_____]]]]]]]^^//((cxELLLLLLLMMOOMLJGDDDDDDDytic<::>(//[[60fhmuwBDGJJJJGysg9[[[______]",
+"__}}600dhhhdd00066666}}}}____]]]]____}}}}}}}}}}609dnstDCEJJLLLLLLLLMMOQQRRRQOMGtg93339ajittxxxCCCxtib33(;=*%$@@@@$&=;>/^^^^^^^/////[0myJMQRRRRRRRRRRRRRRQLGtg3(/(>>////^^^]_____]]]]]]^^//>>:lxJLMMMMMMMOOOMJGDwssswtttic<::((/[[[6dhmuwBDGJJLLJGDwn9[[[______]_",
+"__}}60ffhhfdf00006666}}}_____]]]]____}}}}}}}}6600dnsyCELMMOOOOOOOOOOQQRRRRRRQMJyia93399gjjiltxxCxysja::-~&%$@@@@$&*;>/^^^^^^^^^^^^[6hwJMQRRRRRRRRRRRRRRQQMCta3(((>(////^^]_______]]]]]^^/>>>:lCLMOOMOOOOOOOLGDtingniiiicc::((/[[60dhuwBDGGJJLLJGCynd6[[_____]]__",
+"_}}60fdhhhfff00000088}}}_____]]]____}}}}}}}66600dnsyCJMMOQQQRQQQQQQQQRRRRRRRQMJxia999999aaajityyytib:<~{%%@@@@@$&*;>/^^^^^^^^^^^^^[dsGMQRRRRRRRRRRRRRRRQOLCta3((((///^^^__________]]]]^//>;:bkEMOOOOOOQQQOMJCticaaacciccb:3([[[60hnwyDGJJLLLLJGDysd6[[______]___",
+"}}}60ffhhhfffe0000086}}______]]______}}}}}6000dhnsyCJMOQQRRRRRRRRRRRRRRRRRRRQMExja933333339ajistiib<<~{%$@@@@@$&*;>/^^^^^^^^^]]]_[9nCMQRRRRRRRRRRRRRRRRQOLCtb93((((//^^____________]]]^/>;;-ckFMOOOQQQQQQOMExl1<:::ccccba336[60dhsyCJJLLLLLLJGDysg9[[___________",
+"}}60efhhhhffee008086}}_____]]]_______}}}6600dhnstyCJMOQQRRRRRRRRRRRRRRRRRRRQOLCta93333[[3333abjjbb<1{)$@@@@@@$&*->/^^^^^^^^^^]]]^[gCLQRRRRRRRSSSSRRRRRRQMExtga99333[[[[____}}______]]^^/>;-<1kFMOOOQQQQQOOFAk21<<::acccgad9099hnwDGLMOOOMMLJGDBwnd0[[___________",
+"}800ehhhhhfeee0806}}}}__^^^]]]]______}}600dhnssyDEJMOQQRRRRRRRRRRRRRRRRRRRROMEtb933(///////3333a:<~{!@@+++@@$&*->/^^^^^^//^^^]]^[atLQRRRRRRSSSSSSRRRRRQOLExtjbggggad966[}}}}}}_____]]^^/;-==1kEMMOOOOQQOOMzo211<:::aagggggddhnsyCJMOOQQOOMLJGDwuhd6[[___________",
+"880ehhhhhefee0066}}}[^^^^^^^^^]]____}[60dhgnsyDGJLMOQQRRRRRRRRRRRRRRRRRRRQOMEtj93((/(//////((((:<~)!@++++@@$%*->//^^^^/////^^]^^3sEORRRSRRSSSSSRRRSRRRQMJCytiiitstsjndd0066}}}______]^//;-==<kCFLMMOOOOMLEok21<<:::adgnnnggnstDGLMOQQQQQOOLJDBunhd06[[________}}",
+"88eeehhheee006}}}[[/////>////^^^^^[[[60dgnstyCELMOQQRRRRRSRSRRRRRRQQQQQOOMFCtba3((((>>(//////(:={)@++..++@$%*->>/^^^//>>>//^^]^[axMQRRSRRSSSSRRRRSRRRQOLExttittyyDDytsnhdd006}_____]]^//>-==<lxGJLLLMMMLEok11<<::(3ddhnnnnswyDELMOQQRRQQOOLJDywnnd066[}_____}}}}",
+"88eeeeefe066[[[[////>>>;;>>///^^^[[[9dgnstyDCELMOQRRRSSSSSSSRRRRRRQQOMMLJCxlba::::::;>>(////(>-*%@++..++@$%*->>//^///>>>>>/^^]^[jEORRRSRSSSRRRRRRRRRQOMExttistyDCCCCCyyssnhd06}____]^^//>;-<<itDGGEJJJECxk11<-::(330dhhnuswyDGLMOQQRRRRQQOLJDysnndd066[[[}}}}}}}",
+"88eeeee066[[[////>>>;;-;;;>///^^[[[9gnsyDCCGJLMOQRRSSSSSSSSSSRRRRQQOMLGCylccc:<<<<<-;;>/////>;~&$++...+@@%*->>//^//>>;--;>/^^]^3tLQRRSRRRRRRRRRRRRRQOMExtjnnistyDCGGGCDyywshd6[___^^^///>;-<<clyDDCCCCxyl11<=;:((360ddhmnsyDGJLOQQRRRRRQQOLGDysnngd9066[[}}}}}}}",
+"8800066[[[////>>>;;----;;>(///^^[[9gstDCGGJLMOQRRSSSSSSSSSSSSRRRRQOMLGDtic<1111111<-->>/////>-*%@++..+@@%*->>/^^//>>-===;>/^]][9yMQRRRRRRRRRRRRRRRQOLEDsnggdgnswyDGGGGGGCDysg06[^^^^^///(>:::cityyDDyytic1<=-;>(/36660dhnsyDGLMOQQRRRRRQQOLGywsnggd9966666}}}}}}",
+"}}}}}[[////(>>;;;-----;>>/////[[[6dntyCGJLLMOQRSSSSSSSSSSSSSSRRRRQOMJCyic<1222|221<<:>//////>-*%@++++@$%*->>/^^^//>-***=;>^]]_[axMQRRRRRRRRRRRRRRQOMJDtndd0ddhnuwyDCGGGGGCDynd6[^^^^/////(((abittyyyttic<<~=-;>(/[[6600dhnwyGJLMOQRRRRRQOMEDwnnggdd99666666}}}}}",
+"___[[///>>>>;;;-----;>>/////^/[[[6dnsyCEJLMOQRSSSSSSSSSSSSSSSRRRRQOMJDtic122|oook1<:(///////>-*&$@@@@$%*=>>/^^^//>;=***=;/^]]_[gxMQRRRRRRRRRRRRRQQOLGyshd0000ddmmuwyDGGGJECysg9[[^^^/////((3agistwwssic<<~~=->(//[[}}660dhswDGJLOQQRRRQQMLCtngdddd999666666}}}__",
+"^^^//(>>;;;;;;----;;>///^^^^^^[[[0dgsyDGLMOQRSSSNNNSSSSSSSSSSRRRRQOMJDti112|ooooklb((/^^^^//>;-*&%$$%&*->>/^^^^//>-****=>/^]__[gxLOQRRRRRRRRRRRQQOMJCwnd0000000fhmrwBDGGJJGDtnd6[[[[[[[[[339agissssincc<~~~=;>(/[[}}}}660dgswyGJMOQRRQQOLCtnd9909999966666[}____",
+"^//>>;------;;;;;>>>//^^^^^^^^[[[60hntyCLMORSSNNNNNSSSSSSSSSRRRRRQOLExli1122kokklca3/^^^^^^//>;-=*&&*=->//^^^^//>;-***=;>/]]__[gyLMOQQRRRRRRRRRQQOLEDtnh00000000fhmuwBDGJJGDynd9[[[[[[66639agiisssinga:<~**=;>//[}}}}}}660dnstDGLMQQQQOLCtg96[[[66366[[[[[[____]",
+">>;;-=***=-;;>>>>///^^^]]]__^_}}}60dgsyGLOQSSNNNNNNSSSSSSSSRRRRRRQOLCxlcc<1lllllba3[^^^_^^^^///>;;---;>//^^^^^//>;-==-;>/^]]__6gyELOOQQQQQQQRRQQQOLECtsgdd000000ffhmuwDGGJGDysg99660999ddagjisttsinga:<~{{*-;(/[[}}}}}}}60dhnsyCJMOOOOLCtg9[[[[[[[[[[[[[[[^_^^^^",
+"-==******=;;>>///^^^^]]]_____}}}}60dgsyEMOSNNNNNNNSSSSSSSRRRRRRRQOLExlibbbbbccbb93[[^___]^^^^^////>>>//^^^^[[[//>;;;;>>/^]]___6dtGLLMMMMOOQQQRQQQOLECysngddddddddfhmuwDDGGGDysngdgggnnnnniistyytsngaa:~{&{~->//}}}}}}}}}00dhnwyCELMMMFAtb3((////[[[[[[[[/^^^^//>",
+"**&&&&**=;>///^^^^^]]_____}[[}}6600hsyCLOQSNNNNNNSSSSSSSRRRRRRQOMLECticbaaaaaa933[[[^____]]^^^^^^^///^^^[[[[[[/(>>>>>//^]]]___6dsDGJJJJLLOOQQQQQQOLJGDtsnngnnnnnnnmuuwyDGGGDyssnnsswttttttyxCCCxtiga:<{%%&~;(/[}}}}}}}}60fhnswyCELLMFAxl::>>>>>(((((((/////>>>;;",
+"&&&&&**->>//^^^^]]]___^[[[6600000dhnyCLMORSNNNNNSSSSSRRRRRRRQOOLJGxxtijgaa99933[[[[[____________]]^^^^[[60dd063(((>//^^]]]____6dnyDGGGGJLMOQQQQQOMLJGCytsssstyyywwwwwyDDGGCDyywwyyDDCDCDDCCEEEECxtcb<{)%%&~;(/}}}}}}}}800fmuBDCEJLLLFAk1<--------;:::::::;;;--=*",
+"****=-;>//^^_________[[[09dhhhhhhnsyGLMORSSSSNSSSSSRRRRQQQOOMLECDxytttsigga993[[[[[_________________[[0dgusnnd3((///^^]]]_____60nuBDDDDGJLOOQQQOOMLJGCytstyDGGGGCDyyyyDDGGCDDyyDDGEEEEGGGGELLMLJCxic~))$%&=>/[}}}}}88880ehuBDGJLMMMMFAk11=========<<<<--======~*",
+"--;;>(//^^__________[[9answtwwwwwyDGLMOQRRSSSSSSSRRQQQOOMLLECDytttyxDDxytijgd93[[[[[_______________[60hsByDysnd3(//^^]]_______}0huwBBBDDGLMOOOOMLLJEGCyttyCELLLLJEGDDDDDCCDDDDDCGJLLLJEGGEJLMMMMJCk1{)!$%{->/[}}}8888880fmwDGLLMOOOOMAok1<======<<<<<<111<<=----",
+"((////^__}}_______[[[9ntDCGEEEGGGJLLOOQQRRRRSRRRRQOMMLJGCDytsiiisyDGEEGCCytjga996[[[[___[[[[[[}}_}}6dmwDGJGCysg33/^^]_________}0hmuwBBDDGJLLMLLLJEGCDyttyCELMOOMLLJGCDDDCDDDDDGGJLLLLJEGGGJMMOOOLAk2|!!!%*;(/[}}6688880efuyGLMOQQQQOOFAkc<<::::::<c111l111<::>>>",
+"[[[[}}}}}}}______[[6ajxGLLMOOOMMMOOOQQQQQQRRQQQOMMFECxtsnnggagjiyCELLMLLECytsngd99[[[[[[[[66666}}}6dmwDJLLLECtg93[^^__________}0dmuuwBBDDGJJJGGCCDDyysssyCJMOOOOMLJGCDDCDGGGGGGJLLLLLJGCCCELMOOOMFo|!!!!)~;([[}}68888800hsDJMOQQRRRROOFCtca3333aacitkxCCxkiba333",
+"[}}}}}}}}}}}____[[3ajxEMOQQQQQQQQQQQQQQQQQQQOMMLECxtiga993399gixGFMOOOOMLJGCytjng9966[6660dddd0000fhuDJLMMLJCtg93[^^__________}6fhrruwBBDDDDDDBBwwwssnnstCLMOOOOMLEGCDDCGGGGGGJJLLLLJGDyyDCLMOQOOFA77!!!&=>([[}688866660hwCLOQQRRRRRROMJCwngdddgitxCEFFFECxigd66",
+"6}}}}}}}}}}}}__[[3aixEMOQRRRRRRRRRRRRQQQQOOMLLGCytjg93[[[[[3aixEMOQQQQOOMLJECytsjgd9999ddgnnnmhdfdhuyGLOOOMJDla3[^^____________60hmruuwBBBBBwwuuumnnhhhnwCJMOOMMLEGCDDDCGGGGGJJJLLLJGDywttCEMOOOOIzp7!!){<((66600086}}60hyGLOQRRRRRRRROMJDysnnnswyGJLMMMLECtnd00",
+"666}}}}}}}}}}}}66ajtAFOQRRRRRRRRRRRRRQQQOOMLJCytjg93[[[//[3aiCFOQRRRRQQOOMLJECytsjggdggnswByBwummmuBGLMOOOLExia3[^^____________}0fhrruwwBBBwuummhhhhddhnsyGLLLLJECyyyyDDGGGGGJJJJJJGDyssnsyEMOOOOIzp77!)~:(360000006}66dnyJMQQRRRRRRRRQOLGDBwsswyDGLLMMLLGDsgd00",
+"666}}}}}}}}}}}60dgtxEMORSSSRRRRRRRRRRQQQOMLJGysnd9[[////((alCMORRRRRRRQQOMMLJECysjnggnswyDCGDDBwwwBDJMOQQOLGtg33^^_________]]__[6fhmruwByyBBurmhfff000ddnsyCGGCxytssswyDGGGGGGGJJJJDywnggntCFOOOOIIpp7|21:addhhhhf00660hwCLOQQRRRRRRRRQOLJDBwwuwBDCJLLLJGDwnd006",
+"8888}}}}}}}}6600gjxCFINNSSSSRRRRRRRRRQQOOMLGDynd93(/(>>::blAIRSSSSRRRRQOOMMFJECytsnnnstDCEJJJJGDDDGJMOQQQOLCta3[^^______]]]]]^^[6fhmuByDGGDDwumhd0006600dgnstssnnggnswyDGGGGGGGGGGDDwngddgtCJMOOOIIvpp721innssuurmhd00hsDJOQQRRRRRRRRRQOLJDBwuuuuwyDGEEGDwnh0000",
+"66888888888800dhntxEFINNNSSSSRRRRRRRQQQOOMLGDsgd3((:--=<<kAINSSSSSRRRRQOOMFFJECxtsnnswyCELLLLLJJGJLMOQQRQOLCia3[^^______]]]^^^^[6dmsyDGJLLJGDwnhd066[[[[6699999999dgnsyDGGGDDDDDDDywuhd99aixEMOOIIIzppookyyDDDDDyysnnnsyEMQQRRRRRRRRRRQOLGDwurmmmuwyDDDDysnd0000",
+"088888888800edhnsxCEIINNNNNRRRRRRRQQQQQOOLJGysg3(:-=~{~2|AINSSSSSSRRRROOIFFFFECysjnnsyDGLLMMMMMLLLMOQRRRQOMCia3/^^____]]]^^////[0hsyGLMOOMLJCyuhd06[[[[[[[[[[[[[[69dnsyDDDDDBBBBBBurhd0669gtAFIIIIIzzzAAEEJJLLLLJGCyyyDEMOQQRRRRRRRRRQOMJCyumhhfhmnwyDDywsndd000",
+"008880008eeffhnsyDCFMINNNNOOOOOOQQQQQQOOMLJCtia::=~{{{|ozHNSSSSSSSRRRQOMFFFFEECysjnnsyCELLMMOMMMMMOQRRRRRQMAla3/^^^^]]]^^/>>>>(3dsDJMOQQQOMLGysh06[[^^^^______[[[69dnsBDDDBBwuuuuumh06[[[3alCFFIIzzzzzFFLMOOOQQQOMLJEELMOQRRRRRRRRRRQQOLGDwuhffffhnwyDDDywsnddf0",
+"66686000effhmuwyDCJLMOOOOOMLLLLLMMOOOOMMLJCyib::<~{{||pzHNNSSSSSSSRRROMFAzAFEECxtsnswyCJLLMMMMMMMOQQRRRRRQOEtb3(//^^^^^//>;==;(aiDJMQQRRQQOLGysh06[[^^^^_______[[60dnswyBBwurmmhhd006[[^/(3btCAzzzzAAzFMOORRRRRRRQOMMMMOQRRRRRRRRRRRQOMJDBumhfffdhsyCGGGCDtsnhdd",
+"[[[[[6660fhmuwyCGJLMMOOOMFJGCCCGJJLLLLLLECxiba:<~~{||pzHNSSSSSSSSSRRQOFAAAAAEECCtssstyGEJLLLMMMMMOQQRRRRRRQMCia3(//////>;=*&*=:cxJOQRRRRRQOLGysh06[^^^^^_^[[[[[[600hnuuwwwumhff0066}___^//(aikooooooAEFOQRRRRRRRRRQQOOQQQRRRRRRRRRQQQOMJDBumhffdhnyCEJJJGCysngd0",
+"////((336ddmsyCGJLMMMOMMFECxywwyyDCGGGGCxtja::<<~22ozINNSSSSSSSSSRRRQMFAooAFFFECytssyDCGJJJJLLLLLOQQRRRRRRQOFxc::((>>>;-*&%%&~<kEMQRRRRRRQMJDwnd0[[^^^^^[[3999990dhhmuuuurmhf006}}____]^//(:<1lkookkAFFORRRRSRRRRRRQQQQQRRRRRRRQRRQQQOLGDwumhdffmsyGJLLJECysna93",
+";;;;;::((3aiwDELLMMOMMLLEDywsnnnstwyyyttjaa3::<<12ozIONSSSSSSSSSSSRROFAoooAFFFJExtttyDDGGGGGGGGJLMOQRRRRRRRQMAk1<::>;;=&%$@@%{1CMQRRRRRRQOLGysh06[[[[/[39gjjjjnnnnnmmrrmmhff06}}_____]]^/>>:<11222kkxEMORRRSRSSRRRRRQQQRRRRRRQQQQQQQQOLJDwumhddhnsDGJJEECxlca:::",
+"**&***~=<:ciDELMOOOOMMLJCywsnhdddgggggga33(:--<11kAINSSSSSSSSSSSRRRQOEoooozFMMMJCyttyyDDDDDDDDDGJLOQRRRRRRRROFAk1<:--~&%$@@@${kEOQRRRRRQOMGysg96[[[//[3btxCEECDywwuurrmmhee0}}_____]]]]^/>;--<1111llxAMORRRSSSSRRRRRRRRRRRRRQQQQQQQQQOLJDwumhfddgsyDCCDxlcc<<-=~",
+"%%%%%&{~<<iyELMOOOOOMLJGDysmdd903399933((>;--=<1kAIORSSSSSSSSSSSRRRQMAooopzIOOMLECyyyyyyBBwwwwBBDJMQRRRRRRRRROFok1<==*&$@++@!|kEMOQRRRQOLCtng96[[[//(3bxELMMMLJGDywuummhe00}}____]]]]]]^/>;--=<111clkAFOQRRSRSSRRRRRRRRRRRRRQQQQQQQQOOLGDwnhdddddgistiicb<<~~*&&",
+"%%&&&*~~<1kALOOQQQOMLLGDBumhd0333((((((>;--==<1kAIORSSSSSSSSSRRSRRROFoo7pzIIOOOMJCyytyBBwwuuruuwBGLORRRRRRRRROMAk1<~*&%@@++@!{kCFMOOOOFExig96[[[///(3btFMQQQQOMLGDBwurhee0}}_____]]]]]^//>;;--<<<<cclCFOQRRRRRRRRRRRRRRRRRRQQQOOOQQQOMJCyshd06669aaaaa:::-=~**&&",
+"***==-;:clCLOQQQQQOMLJCysnhd633((/(((>>;-===<1kAIORRSSSSSSSSSRRSSRROzp77pvINRQOMLEyttssuurmmmmrrwDJOQRRRRRRRROLCk11{&%$@+++@${1kxGEEACklba3(//^^///(3lEMQRRRRQOLJDBwrmhe0}}_____]]]]]]^//>;;::<<::bclxEMQRRRRRRRRRRQQQQQRRQQQQOOOOOOMLGysgd063[((3333((>>;---==*",
+">>>>((3alCLOQQQQQOMLJCysnhd66[///(((>;-=~~~11kAIORRRSSSSSSRSSRSSSSRIzpppvHNNRQQMLCyssnnnmhheeehmrBGMQRRRRRRRQMJCk1{)!@+++.++${1cittlicb::((////////(axFQRRRRRQOLJDBurme06}_____]]]]]]^^/>>::::::::bbjtAFOQRRRRRRRRQQQQQQQQQQOOMMMMLLJCysh96[[//(((((/////>>>>>>>",
+"^^^^/[9iCLOQQQQQOMLEDBsmd06[[///((((:-=~~~1koFOQRRRSSSSSSSSSSSSSSSSIzppvHHNRRQOMFCtjgdddffeeeeeehuDLOQRRRRRQOLGk22)@++....++${~<bgaa::::>>(////////(axMQRRRRRQOLGDwumhe0}}_____]]]]]]^//>:::bbbb:::bblxEMOQRRRRRQQQOOQQQQQOOMLLJGGCCxtia93[///(((///////////^^^^",
+"]__^[9nyJMOQQQQOMLGDwnh006[[[//((((::<1122oAIORRSSSSSSSSSSSSSSSSSSSNHvvvHNSRRQOMExjg990000088880fmyJOQRRRRQOLCy12)@+.......+${~<baa:((>>>(//^^^^^^/[gxMQRRRRRQOLGBwrmee6}_____]]]]]]^^/>::ccllccb:::bclCFOQQRRRQQQOOOOOOOOMLJGCyttsijga3[/////((///^^^^^^^^^__]]",
+"___[6gtGLOQQQOOLJCysg006[[[[[/((3abc112oozIIRSSSSSSSSSSSSSSSSSSSSSNNHHHHNNSRRQOLCtg96[[[}}}}}}660hBGMOQQQOMJDtc1)@+.......+@${1ccba3((((//^^^^^^^^^[gyMQRRRRRQMJDBurme86}______]]]]]^/(>:clkkklc<<:::bixEMOQQRQQQOMMMMMMMLJGDtiggdd9933//////>>///^^____________",
+"__[[9sCJMOOOOMLGysgd06[[[[^^[[3abclkoAzIIINSSSSSSSSSSSSSSSSSSSSSSSNNHHHNNSSRRQMEyj93[[[______}}}6dsCLMOOMJCtib<~)@+......++@)22lliba3(///^^^]]]]__[6gyLOQRRRQOLJDwumhe06}______]]]]]^/>:<koAAxkl<<<<::blCFOQQQQQOMLJJJJJJGCtigd96[[[[[///////////^______________",
+"__[9gtGLMOOMLJDwnd6[[[_[^^^[333blkAAIINNNNSSSSSSSSSSSSSSSSSSSSSSSSNNHNNNSSSRROMCta3[[^^_________}0nyGJLJGDsg::=*%$@++..++@$){2oCxxib93[[^^^_______}6dwEMQQQQQMLGBwrmhe06}______]]]]^//:<lozFFAkl11~~<:bjxEMOQQQOMLECCCCCDysgd0[[[[[[[[[^^^^/////^^______________",
+"__[9jyELMMLJGysd0[[____^^^[[33blxAFIQNSSSSSSSSSSSSSSSSSSSSSSSSSSSSQNNNNSSSRRQOFxj9[[^^^^^_______}0hsyCCDtna::;-=*&$@@++@@$){2oEFFCxja3[[^^________}6dsDLOQQOOLJDBurmhe06}_______]]]^/>:1kzIIIzo22{{~=<:clALOOOOMLGxtttsssng96[[[[_^^_^^^^^^^///^^______________]",
+"_[6gtCELLLEDwnd6[_____^^^[[33blxFMORSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRONNNSSSSRRQMEta3[^^^^^^^^]]]___[0gsssiga::;;;;-=*&%$$$%&~1oFMMMECta93[[[[[[[___}}6fnyGLMOMLJDBwurmee06}}______]]^//:<2ozIIIzoo|)){~<:bjxEMMMMLEytjngggd90[[[___________]^^^^^^^_____________]]",
+"_[9jyCEJJGDwnd6[^^^^^^^^^[33ajxAMORSSSSSSSSSSSSSSSSSSSSSSSSSSSSRROOOQSSSSRRRQMCl9[^^^//////^^^]]_[[9daaa::;;;>>>>>;-**&&&~1kAMOOMFCtb93[[[[[[[}}}}}6fhuDJJLJGDBBurmmhe06}}______]^^/>:1ozIIHHIp7|)){~-::blxEFLECxtja999066[[[_____________]^^^^^]___________]]]]",
+"[9gtCEEEGCynd0[^^^^^^^^^[339blCFORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSROOOORRSSRRRQOFxj3[^^//>>>>>//^^^^^/[3(::---;>>/////>;=**~=1kFOOOMFCla3[[[[[[[[[}}}}60hrBDGGGDBwurrmhe006}}}}____^^/>:<2oIHNNHHv77!){~-((3aixCCCtjg99666[[[}}}}}}__________]^^^^]]__________]]]]]",
+"6atxEJJJCDsg96[/////////[33ajxEORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOOMOQRRRRRRQMEta[[^^/>;;--;>>//////>;;-==~=;>/^^^^//>-=*~~1oFOOOMExja3[[[[[[6666}}600fmuBDDBBwurrmhee0066}}}}___^//>:1kzINNNNHv47!){=;(((3ajlttja96[[[[[}}}}}}}6}[}_______^^^^^^]_________]]]]]]",
+"gtxEJLJECyia3(((>>>>(//((3abtAMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQOOOOQRRRRRQMJxj9[^^//>;=**=-;>>>>>;-=*****-;>/^]]]^/>-***~2AFIMMExla3[[[[[66666666600emruwwuurrmmeee0066666}}__^^/(>:lAINNNNNHvv7!{~->//^[39aga99[[[}_[_[_}[6660666[[____^^^^^^^]]]_______]]]]__",
+"txELLLLExtja::-====-;>((3ablCFORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQOOOOQQRRQQOLxj9[[_^^/>-=***=-;>>;-**&&&**=;>/^]]]]^/>-*&{{2ozFFExla3[[[[[399900666000ehmruurrmmheee006666666}}_^^//(bkFNNSNNNPHv7){=>//^^[[[366[[[[_____[[[660ddd906[[[^^^^^^^^^^]]_______]]]__[",
+"xEJLMLJCxic<<~{{&{{~=<::bckAFORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRQQOOOOQQQOMLCsa6[__^^/>;=***-;;;;-**&&&&*=->/^]]]]]^/>=*&&{|oAAAxla3[/^[[[9dddd000000eehmrrrrmmheee0066666666}}_^^//3cCMRSSSNNPHv7){->/^^^^[[[[[[[_______[[69ddnnngd0[[[[//////^^^^]___________[[",
+"EFLMLJCxlc11{)!!!!)){~11koAIORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRQQOOOOOOOMJCtg9[[___]^/>;---;;;;-=*&&&&**-;>/^]]]]]^/>=&%%)||ookcb((///[[9dgggdd0000eeemrrurrmmeee8088666686}}___^/(alFORSSSNNPHv7)~;(/^^____[__________[[[69gnsssng96[[////////^^^^^^^^______[39",
+"EEFJECkl12{)!!!+'+!!!||ozIINSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQQQOMMLLLEDsg9[____]]]^//>>>>>>;-**&&&**-;>/^]]]]]]^/;*&%$))||21<::>>///39dggghd0000eehruuuuurheee0006666866}}___^/3bxFORSSSSNPKv7|~:(/^^______________[[[39gjsttssga3[(/////////^^^^^[[[____[[9g",
+"CCCxxkl22{)!!++''''''4pvHPPNNSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRQQQOLLEGCyjg6[____]]_]^^/////(>;-*&&&**-;>/^]]]]]]]^>-*%$$@!)){{{*~=;>(/3dhhhhdf000eeemuwBBBwrmfee8000666066}}__^^[9lAORSSSSSNPKv72<((/[[____________[[[[39ajjstttsga33(((>>>(////^^^[[[[[___[[9g",
+"tllic11{{)!!!+''''',45qKKPPPNSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRQOMLGDysn96[[___]]]__^^[[3993(:=*&&**-;>//^]]]]]]^/>=&$@@@@$)))%%%&~;>(6dhhhdfe000eemrwBDDDBumhffee80800006}}__^[3bxFORSSSSSNPHvo2<33[[[[[_^_______^[[[399gjtttttiga33((>>>>>(////^[333[[[__[[39",
+"aaa:<~{{%)$!@+++'',5qqKKKPPPNSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRRQOLEDwnd9[[___]]]____[[9gistib:=*&&*=;>>/^]]]__]]^/-&$@+++@@@@@@@$%&=>(0fffffe0088eemuBDGGDywuhhfeeee800806}}_[[3alAORRSSSSSNNHzolba36[[[[[^^^___^^[[[339aajjtttija93((>:>>>>>(///[33993[[^^^[[3",
+"(((;=~{&%%$$@++'',5qqKKKKPPPSSSSSSSSSSSSSSSSSSSSSRRRRQQQRRRRRRRRQOLGynd9[[___]]]____[9gsxGEEClc<~**=-;>/^^]]___]^/>*%@+++++++++++@$&=(30fffee8008eemrBDGJJGDwrhffeeeee80806}}[[39jxFORSSSSSSSNHzolca9996[[[^^^^^^^^[[3333aabjjijjba3(::::;;>>>>(/(3aaaa3[[^^^^^[",
+"/>>-=*&&&%%$@++',5qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQQQQRRRRRRRRQOJCsg9[[[___]_____69nyELMMLJxl1~~=-;>//^^]___]]^>=&@++.....+++++@$&;(600eee80888eemuBGJJJGDwnhdfeeee88008}}}[[3bxFORSSSSSSSSNIFAkiggd996[[^^//^^^^^//(3333aaaabaa:::---;;::>>>>((abjjja3[^^^^^/",
+">>;-=**&&%%$@@',5qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOQRRRRRRRRQMJDsd9[[^_______}6dsDJMOOOOLCk11=-;>//^^]____]^/;&$++.........++@%~:(6608e88888eehrwDGJJJCyshdf0000008086}}}[3alAORRSSSSSSSSROFAxljgg996[[///////^////(((33333:::<=~~~==-;;;;:::aclxtlb93//////",
+">>;-=**&&%%$!!45qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOQQRRRRRRRRQMEysg9[[[______[6dsDJMOQQQOLGlc<-;>(/^^^_____]^>=%@+..........++$&-([668888888eeemuBDGJJGDwnd00000000686}}}[[3jxFQRSSSSRSRRRROFAxtjgd96[[[//>>>//////((((((((:;=~{&&{{~~<<<<-::<lkCCCxib33(////",
+"(>;-=~*&&%)!!45qKKKKPPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOOQRRRRRRRRRQMJDwnd0[[[[_[[60gwCJMOQQQOMJxib::>(//^^______^/;&$+...........+@%=>/[68888888eeehmuBDGJGDysh0066}}}}}}}}}}}[6atEORSSSSSSRRRRROLCyigd96[[[//>---;>>>>>>;;;;;;;-~&%$$$$){~11<<<11koAFFFAxia3((((/",
+"((>;-=~{{))74vKKKKKPPPPSSSSSSSSSSSSSSSSSSSSSRRRRQOMMOQRRRRRRRRRRQMLGywnh906660dgsyGLMOOQQOMLCtga(((///^^_____^^>=%@+..........+@%*;/[}6888888eeeehruBDGGDysh066}}}}}}}}}}__[[3jCMQRRSSSRRRRRRROFCtja96[[[^/>-*&**-;;;;-======*&%$@@++@!)|222222oAIIOOOFAtib:((((",
+"//(>;=~{{|7vvKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRQMLLMOQRRRRRRRRRRQOMLECywsnggnswDGLMOOQQOOMLGynd3((///[^______^/;&$+.........++@$&;(/}}88888eeeeehmrwBDDDysnd06}}}}}}}}}}___[[atFORRSRSRRRRRRROMExia96[[[^^/>*&%%&&*===**&&&&&%%@@+++++!77ooooopzHNNRROOFClcb:333",
+"[//(:-~2|pvHKKKKPPPPPSSSSSSSSSSSSSSSSSSSSRRRRQQMLLLOQRRRRRRRRRRRQQOMLLJGCDyyDGJLMOOQQQOOMLGynd6[/////[[_}___^/>*%@+....++++++@$&=>/[}68888eeeeeemmuwyDDysnd06}}}____}}_____[3jCMQRRRSRRRRRRRQOJCtg93[[[__^/-&%$$$%&&&&&%%$$$$$@+++..+''7pppppzHHNNSSRROFAklca333",
+"[[((:<2|pvKKKPPPPPPPSSSSSSSSSSSSSSSSSSSSSRRRRQOLJJLOQRRRRSSRRRRRRQQQQOOMLLLLLMOQQQQQQOOLJCBnd6[//////[}}____^/-&@+...++@@@@$$%&=;/[[60888eeeeehhmruwyyBsnh06[}_____}}}}___[[9tEORRRRRRRRRRQQOLExia3[[[__^^>=&$@@@$%%%%$@@@@@@+++....''4vvzzzvHHNNSSSSROMExlcaa36",
+"[[((:1opvKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRRQOLJJJMORRRRRSSRRRRRRRRRQQQQQQQQQQQRRRQQQOLJDwnd6[^^//////[}___^/>*%@+.+++!))%%%&&~;(/660eeeeeehhmmmmruwwwsnh066}_____}}}}}}__[3gxMQRRRRRRRRQQQOMJDib3[[[[^_^/>*%$@@@@$$$$@+++++++......'44vvIIHHHPNSSSSSRQMFxlca996",
+"[[(3ckpHKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLJGJMQRRRRRSSRRRRRRRRRRRRRRRRRRRRRRRQQOLJDwnd0[[^//>>>///___^^>=&@+++''!||{~***~->(6dhhhfeefhmmmmmmussssnhd06}}____}}}66}}}[[9tEMQRRRRRRRQOOMMJCtja3[[^^_^^/>*%$@@@@@$@@++...........''4vvIIIHHNNNSSSSSROMAxiaa6[[",
+"^[3bkzHPKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSSRRRRRQMLGGJLORRRSSSRRRRRRRRRRRRRRRRRRRRRRRRQQMJDBuh0}_^^/>;;;;(//^^^/;*$@++''47po21~~~=:(dgussurmmmmmrrrmnnnsnngd06}}____}}}60006669jxLQRRRRRRRQOOMLJGDsb3(/^^^_^^/;*&$@@@@@@+++...........+'7pzIIIIIHNNSSSSSRROFCtca3[[[",
+"^3alAIHPPPPPPPPSSSSSSSSSSSSSSSSSSSSSSSSRRRRQOMJGCGLMQRRSSSSSSRRRRRRRRRRRRRRRRRRRRQQOLGBuhf6}_^^>;****->>//>;*%@@+''4vpzok1<==-:anyDCDDywuuuruurnnnnghd066}}}___}}}60df0069gtEOQRRRRRRQOMLLJJCxia3(/^^^^^^/>~&$@@@@+++............+'77pzIIIIIHNNSSSSRRQMExia3[[[_",
+"^3bxFNPPPPPPPSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLJCDDEMORRSSSSSRRRRRRRRRRRRRRRRRRRRQQOLGDwrh0}}_^/;*&%$%&**==*&%@@++'4vvIIAkl<<<::ctGLLLJDywuuuurnhhddd0066}}____}}}600dddd0djCMQRRRRRRQQMLLLJECyia3(/^^^^^//>=&$@@++++....    ....''77ozFFFFIIINSSSSRRQOLClg9[[^__",
+"^3lFINNNPPNSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQOLGDyyxGFORSSSSSSSRRRSRRRRRRRRRRRRRQQOMJDBumf0}_^/>=&$@++@@$%%$@@@+@@7pzIIIAkl1<<:biDJMMLLGDwsunnhhdd0066[}}______}}}600dddddnyJOQRRRRRRQOMLLJJGCtib((//^^^[[(:=&$@@+++....     ###''77zzFMMFFIINNSSSSRRQMEyja3[^^__",
+"[axMRSSSNSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQOLGysiitCFIRSSSSSRRRRSSSRSSSRRRRRRQQOLJGDwume0}[//;*%@+....+++++++@@)|ozIIFAkc<::::ixJMMLLGysnnhdd00666[}}________}}}}6000ddntEMQRRRRRRQOMLLJJJGCtc<:>(///[33a:<{$@+++....     ###'44pzFMMMMMFIIRSSSSRRROLCtg33/^^__",
+"3jAORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLCyigbclkAFIQSSSRSRSSSSSSSSRRRRRQOMLJGDBwumf0}[/>-&@+...........+@${2oAFFAkcb:::(3btCJLJGDtngd00666}}______________}}}6600hsCLORRRRRRRQMLLJJJGCxic<-;>//33bjll2|)!++....     ##,,5vvIIIOOMMMMOORSSSRRRQOLCtb33[[^__",
+"axMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLCwna:<122opzIIQRRSSSSSSSSSRRRQQMLGDDDBBBurhf6[(>=%@+...    ....+@%~<lxxxlcb::>>((3jtCCCysnd9666[}}__________________}}}60gtEMQRRRRRRQOMLJEEGCDtic<=->/(3btCAAAo7!''.#     ##,,55vHHNOOOOOOMOORRSSSSRRQOLCtja33[[[[",
+"tEORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRQOJDsb::=~{{)||opzIORSSSSSSSRRRQOLGDyyBBBBBwumd63(:~%@+...     ....@%=:bbbba:(>>>///[9gsssjnd9666}}}}___________________}}6dsCMQRRRRRRQOMLJGGGCDysc<<=->(3atAMMOIzp7'''#######,55qKPNNRRQOOOOOOORRSSSRRRQOMExlcba3399",
+"EMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRQMJyia::=*&%))))||ozIQSSSSSSRRQMJCtsuuwBBBBBund03(:=&$+...      ...+%=:(((((>>>>//^^[[9gnnngdd9666}}}}__________________}}6dtJOQRRRRRQQOLJGGCDDyysg:<-;>(3jCLOQQOIIp44'#####,,5qqKPNNSRRQQOOOOOQRRRRRRRRQOLExkklcbjit",
+"MORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOJCsb:(;=*&%%$$)){2koFIRSSSRRQMFxsnhhnuwBBBBsnhd93:-~%$+...     ...+$*;>>>>;;>>//^^^[[9dgnnnnngd00066}}}}__}}}}}}}}}_}}}}60nCLQRRRRRQQOLJGGCDDDywsg::;:((atEMQQRROIzp74'',,,5qqKKPPSSSRRQQOMMOQQRRRRRRRQOMFAoookkkxCE",
+"OQRRSSSSSSSSSSNNNNNNSSSSSSSSSSSSSSNNNNNNNOMJxib3((>-=*&%%%%{~<1loFIRRRRQOMExjgddhhuwwBwsngdda3:<~%$+..     ...+@&=;;;--;;>/^^_^[60hnswyyyysnhff0066}}}66006}}}}}}}}}0dwEMQRRRRQQOMLGGDDDDDyytna::>(3atJOQRRQQOMzpp7445qqKKKPNSSSSRRQOMMMOQQRRRRRRRQOLEAoo7oooAFM",
+"QQRSSSNNPPPPPKKKKKKPPNNNNNHHIIIIHHHPKKKHIAxlba3(((>;-=~***~=-::ixFIRRRRRQMLCtjgddhgnsssssngggga:<~%@+..     ..+@%&*====-;>^^]_[[0hnsBDGJJGGDwumhee00fffffee0066}}}60dnDLOQRRRQQOMJGDDDyyyDDyyib:(((3bxJMQQQQQOMFFAzpvvKKPPNSSSSSSRRQOMMMOQQRRRRRQQMLGxko777ooEMO",
+"QQRNPPKKKKKqqqqqqqqvvvpppooo||||||7744447|1<(((//>>>>;;;;::::actAMORSSRRRQOMExjgdddgnnsssssssiig:~)@+.     ....+$%&&&&*=;/^^^[[6dgnwDGJMMMLJDBwrmmmmmuuuurmhff000000hsCLOQQQQQOLJGDByBBBBDDDDtia:((3axEMOQQQOOMMMLLIINNNSSSSSSSSSRRQOMMMOQQRRRRQQMJCtl2|!!77oAMO",
+"QONKqqqqqq5555,,,,''!!)){){{{{{{{))!!'+'!){=;>>>>>((((3333adnsDJMRRSSSSSRRRQMJxjgd9ddgnnsswyyytic~)@..    .....+@$$%%%&=;/^^^[[9dhnwDJLOOOOLJDBwwuwwBDDDDBwumhff00fhnyELOQQQOMLJDBwwuuuwBDDGGDic:((3bxEMOOOOOOOOOOOORRSSSSSSSSSSSRRQOMMMOQQRRRQQOLCyic1)!!!)2xFO",
+"QIvq555,,,,,######.+@$%%&&&&&&&&&&%$$@+@@$&*-;>>>((:abjinnnwyGLORRSSSSSSSRRRQMJxtga9ddgnssyyDxti1{!+.     ....++@$$$$%&*;/^^^[[09dgsDJMOQQOMLJGDDDDGJJLJJGDyumhfddhnsDJMOOOOMLGDwurmmmmuwBCGGCtc::(3jxJMOOOOOOOOOQQQRRRSSSSSSSSRRRRROMMMOQQQQQQOLGynd:~)!@@)2lEO",
+"Oz5,,,########    .+@$%&&&&***====*&%$@@$%&*-;>>>(ajtxCCyDDGJMQRRRSSSSSSSSSRRQMExjga9ddgnstyyyl12!+.     ...+++@$$$$$$%*;>/^^[[[60dnBGLOQQOOLJJJJJJLMOOMMJGDwunhhhgsyCJMOOMLJGywumhhffhmsyCGECkc:::blAMOOQOOOOOOQQQQRRRRSSSSSSSRRRRQOMMMMOQQQQOLJDsh3:~)$@@)~cDM",
+"Jo'######        ..+@%&&**==-;>>>>;-*&&%&&*=-;;>:bkAFLLLJGJLOQRRRRSSSSSSSSRSRRQMEyjgaddggnsssi1|!+.     ..++@$$%%%%$$$%*->/^^^[[[[0dsDLMOOOMMLLLLMOOOOOOMLGDwsnhhgntDELMMMLJGywumhfe00ffnwDGGCkc<:biCFOQQQQOOOOQQQQRRRRRRRSSSSSRRRRQOMLLMMOOOMLJDwmd3:~%$$$&~btJ",
+"y1!#            ..+@$&*=-;>>>//^^//>;-=**==-;;>:lxFMOOOMLLMOQRRRRRRSSSSSSSSRRRQMFCtjg99dagggc1|!'#    ...+@%&&***&&%%%%*->//^^^^[[[0nyGLMMMLLLLMOOOQQQQOMLGysnhddgiyCLMMMLLGDwumff00000fhsyCCCtccccxFORRRRRQQOQQQQQRRRRRRRSSSRRRRRRQOMLLLLLLLJGDwrh03(={%%&~:anD",
+"n:)+.          ...+$&*-;>>//^^]]]]^^/>>;;;;;>(blAMOQQQQOMMOOQRRRRRRSSSSSSSSRRRQOMEyig999999a<)@.#    ...+$&=-;;;;-*&&%&*=;>//^^^__[6dsDGJLJLLLMOOQQQQQOMLGDsngd9dgsxELMMMLJDysmdf066}}60hsDCCCxlllxFORRRRRRRQQQQQQRRRRRRRRRRRRRRRRRQOLLJJJJJGDBwrhf63(-~{*~:3drB",
+"m3~$+............+@&=;>//^^^]]]]__]^^//>>>>>(bkFOQRRRQQOOOOQRRRRRRRSSSSSSSSRRRQOMEyja93333(<)@+      ..@%*;>////>>-=*&**=;>>//^^^__[0hsyDDGJJLMOOQQQQOMLGysgd9399gtCLMOOMLEDwnhd06}}}}}0hsDGEECkkxEORRSSSRRRRRQRRRRRRRRRRRRRRRRRRRQQOLLJGGGDDBurhf063(:=~=:(0huw",
+"h0:&@+++..++.+++@$&=;//^^]]_______^^^///(((alxFORRRRRQQQOOQQRRRRRRRRSSSSSSSRRRQOLCtj933((>=%@..     ..+%*;/^^^^^/>>-=**=--;;>>//^^^}6dhuwyDGJLMOOOOOMLJCysg96[[39jyELOOOMLGysgd06}}___[6dsDEJEACCAMORSSSSRRRRRRRRRRRRRRRRRRRRRRRRRQQOLJGGDDBBurmff063(::::33dmuB",
+"h0(=&%$@@@@@@@@$%*->/^^^_______[[[[[33333ackFMQRRRRRRRQQQQQRRRRRRRRRRSSSSSRRRRQMExja3(/>-*%+..     ..+$*;/^]]]]]^/>;-=========;>/^^^[6dhmuBDGJLLMMLLJCysg93[[[[3aixFOOOOMLGysh06}}____}6gtCELFEEEFORSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRQQOLJGDDBwurmef00633:::33dhruB",
+"h0(>-**&&&******-;//^^_____}[[669999aaaaclAFORRSRRRRRQQQQQRRRRRRRRRRRRRSSRRRRROLCla3((;=&$+..     ..+$*;/^]]]]]]^/>;-==***&&&&*=>/^^[}60dmuBDGGJJGGDysg96[[[[/(3btEMOQQOMLCynd06}_____[6gtGJMLFFFMORSSSSSSRRRRRRRRRQRRRRRRRRRRRRRRRQOLJGDBwurmeef00033::3adhmuwB",
+"he6/>>;;;;;;>>>>//^^^[[[}66660dgnjtjiiltCFORRSSSRRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMEtb3((-*%@+..     ..+$*;/^]]]]]]]^/>;-=**&&%$$$%&=>/^^[}60dmuwyyyywsng96[[^^^//(3iCLOQQQOMLCtnd6[[_____[6gtGLMMFFMORRSSSSSSRRRRRRRRQQRRRRRRRRRRRRRRRQOLJGDBurmhee000093aaaddmruBB",
+"he6[/////////////[[[[660000ddnsyDCCCxCAFMORSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQOFxj93(;=&$+...    ..+$*;/^]]]]]]]]^/>;=**&&$@@+@@%*;>/^^_}}0dhmnnngd06[[[^^^^^//3bxJOQQQQOMJCtnd6[_____^[6gtELMMMMMQRSSSSSSSRRRRRRQQQQQRRRRRRRRRRRRRRQOLJGBwummeee00099aaaddhruwBB",
+"he6[////////[33399aggnnnnnnswyGJLMLLFFMORRSSSSSRRRRRQQQRRRRRRRRRRRRRRRRRRRRRQMCta3((;~&@+..     .+@&;/^]]]]]]]]]^/>-=**&%$@+++@$&=>/^^^__}6600066[[[^^___^^^/3atEMOQQQQOMJCwn06[_____^[3gyELMMMMOQRRSSSSSRRRRRRQQQQQQRRRRRRSSRRRRRRQOMJGBwrmeee00009daaddhmruwBB",
+"ee6[[////[33ajitxxCCCCCCDDDCGJLMOOOOOORRSSSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMExj33((;=&$+..    ..@&->^]]]]]]]]]]^/>-=**&%$@+++@$&=;/^^]_____[[[_^________^^[39iCLOQRRQQOLJDwg06[[_^^^^[9nyEMMMMOQRRRSSSSRRRRRRQQQOQQQRRRRRSSSRRRRRRQOMJDBurmfe000099dddddhmruwBw",
+"ee6[[//(3ajtxEFMMMMOMMMMLLLLLMOQQRRRRRSSSSSSSSSRRRQQQQRRRRRRRRRRRRRRRRRRRRROLCla3[//>-*$@+......+%*>/^]]]]]]]]]]^/>;-=**&%$@@@@$&=;>/^^]]_______]]]]]___^[[[9jxJOQRRQQQOLGysh06[^^^^^^[9sCLMMOOOQRRRSSSRRRRRRQQOOOOQQRRRRSSSSSRRRRRQOMJDBumhee000099aadddhmruwwu",
+"e06[[(3abtCFMQQQQRRRRRQQQOOOOQQQRRRRSSSSSSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMEtj93[//(;~%@+.....+$*;/^]]]]]]]]]]]^/>>;;-=*&%$@@$%&=;>/^^]]]]]]]]]]]]]___[[[39jyEMOQQQQQOMJDwnd0[[^^^^^^[gtEMOOOOQRRRSSRSRRRRRRQOMLLMOQRRRRSRRSSRRRRRQOLJDyumhff000099aaddhmruuwuu",
+"e66333bckEMORRRRRRRRRRRRRQQQQQQRRRRSSSSSSSSSSSRRRQQQQQRRRRRRRRRRRRRRRRRRQQMExia96[[//>-&$@+...+@&->/^]_]]]]]]__]^^//>>>;-*&$$$$&*->//^]]]]]]]]]]]]]]__[[39ajtALOQQQQQOMJGBsh06}^^^^^^[3nCLMOQQQQRRRSRSSSRRRRQQMLJLLOQRRRRRRRSRRRRRQQOLJDyumhf000009daaddhmruuuur",
+"0633:<1kAIRSSSSSSSSRRRRRRRQQQQQQRRSSSSSSSSSSSRRRRQQQQQRRRRRRRRRRRRRRRRRQQMExsg936[[[/>;*%@+++@@&=>/^]]_]]]]]___]^^^^///>;=&%%%%&=;>/^^]]]]]]]]]]]]]__[[39ajtCJMOQQQQOMLGDwnf6[_^^^^^^[9sEMOQQQQQRRRSRSSSRRRRQOLJGGLOQRRRRRRRSRRRRRQQOLJDBumff0000099adddhmrruurr",
+"63(:<1koINNSSSSSSSSSSSRRRRQOOMOQQRRSSSSSSSSSRRRRQQOOQQRRRRRRRRRRRRRRRRQOMExtgd966[[[/(;*%@@@@$&~;//^]]]]]]______]^^^^^^/>-*&%&*=;>/^^]]]]]]]]]]]]]]__[39gjtxEMOQQQQOMLGDwrf0}__^^^^^^[gtJMQQQQQQRRRSRSSSRRRRQOLGDCJMQRRRRRRRSRRRRRQOMLJDBsmff000099999ddhmrrrrmm",
+"3(:<2||pINNSSSSSSSSSSRRRRQOMLJLMOQRRSSSSSSSRRRRQOOMOOQRRRRRRRRRRRRRRQQOLExiga93666[[/(;*%@@@$&~;(/^]_]]]]]______]]]]]^^/>-*&&*=;>/^^]]]]]]]]]]]]]]__[39gitxELMOQQOOLJGDwrh06}__^^^^^^[gyLOQQQQQQRRRSRSSRRRRRQMJDyDGMQRRRRRRRSRRRRRQOMLEDBsmhff00099999ddhmmrmmee",
+"(:<{||7pHNNSSSSSSSSSRRRRQQMJGCCGLMQRRSSSSSRRRQQOMLLMOQRRRRRRRRRRRRRRQOLExiga9900666[/(;*%@@$%*;>/^^_]]]]]________]]]]]^/>-***->>/^]]]]]]]]]]]]]]]__[[9gitxEFMOQQOOLLGDwuhf6}__]]^^]]^[gDLOQQQQQQRRRSRRSRRRRRQMGyByGLQRRRRRRRSRRRRRQOMLGDBsnhdf000099900dhhmmmee0",
+":-~{)!7pvNNSSSSSSSSRRRRRQMJCtsstDEMQRRRRRRRRQOMLJJJLOQQRRRRRRRRRRRRQOMExigd9999d006[/(-&%$$%&=>/^^]__]]]]_____^__]]]]]^/>-==->/^^]]]]]]]]]^^]]]]]_^[9gjtxEFMOQQQOMLJDBumf0}___]]]]]__6gDLOQQQQQRRRRSRRSRRRRROLCywyCLQRRRRRRRRRRRRQQOLJGDBsnhdf000009900fhhhhee6}",
+"-~{)!!7pzHNSSSSSSSSRRRQOMEDwnggmsyGLOQRRRRRQOLJGDDGJMQQRRRRRRRRRRRRQMJCtja999ddddd6[/>-&%$%&*;>/^]]]]]]]______^^^^^^^^/>;--;>/^^]]]]]]]]]^^^]]]]__[9gjtxEFMOQQQQOMJGyumd06}__]]]]]]__[dyJOQQQQQRRRRSRSSRRRRROLDwswDLORRRRRRRRRRRRQOOLJGDysnhdd000066660fffff06}}",
+"=*%)!!77zIRSSSSSSRRRRQOLEDsnhdddhnwDJMQQQQQMLGDBBBDJMQQRRRRRRRRRRQQMJCtjg999dhgmhd06/>-&%%%*->/^^]]]]]]]____[[^^^^^^^//>;;;>>^^]]]]]]]]]^^^^]]]__[9gtxCELMQQRRQQOMJDBuh06[[__]^^]]]__[dwEMQQQRRRRRSRRSSRRRRROJDwswDLORRRRRRRRRRRRQOMLJGDwumhdd0006666600fff06}}^",
+"*&%!!!77zIRSSSSSRRRQQOLGyshdd0000fhsyGLMOMLJDyuuuBDJOQRRRRRRRRRRQQMLGysgd99dhnnnnh06/(;*&&*=;>/^^]]]]]]]____}[^//////>>>;;>>/^]]]]]]]]]^^/^^^]]_[3gtxEFMMQRRRRRQOLGDsnd06[__]]^^^]]]_[9sGMQQRRRRRRRRSSSSSRRROJysnsDLOQRRRRRRRRRRRQOMLJGDwumhf00066[[[6000006}__^",
+"&%$$!!|ozIRSSSRRRRQOMJCyshd00000000dnwCJJJGDwumruwDLOQRRRRRRRRQQOMJCysga999dhnnnmd0[/(;=**=->/^^]]]]]]]_____[[//>>>>>>;;;>>/^^]]]___]]^^///^^^^[3gtCFMMOQRRRRRRQOLCtnd06[___]^^^^^]]_[9sGMQQRRRRRRRSSSSSSRRROJysssDLOQRRRRRRRRRRQQOMLJGDwumff0066[[[}}60006}__]^",
+"%$$@!)|ozORRRRRRQQOLEDwnhd0000086660dmsyDDywummmuBGLOQRRRRRRRQQOMECtjgd9000ddhggd9[[/(>-=-->>/^^]]]]]]]_____^//>;;;;;---;>>/^^]]____]^^////^^^^[atELMOOQRRRRRRRQMEynd66[___]^^///^]]_[9sEMQRRRRRRRSSSSSSSRRROLCwwwDLOQRRRRRRRRRRQOOMLLEDBumff066[[[}}}}66}}__]^^",
+"%$@@!)|oIORRRRRQQMLEDsndd00000886}660dmswwsrmhhmuyJMQRRRRRRRQQMLEDsng996666000096[[//>>;;;>>//^]]]]]]]]_____^/>;-----==-;;>//^^^^^^^^^//>>//^^[9lCLMOQQRRRRRRRQOLCsd0[}___]^^/>>>/^^^[9tEOQRRRRRRSSSSSSSSSRROLGyByGMQRRRRRRRRRRRQOOMMLJCysmf006}}}_}}}}}}}___]^/",
+"$@@@!|ozIQRRRRQOMJCysgd000008888}}}}60hnusumhhhmwDJOQRRRRRRRQOLEDsn9966[[[[[[[[[[////>>>>>>>/^^]]]]]]]______^/>;;--=====-;>>//^^^[[^//(>>>//^[3jxFMOQQRRRRRRRQQLGtg0[}____]^>;;;>>/^^[gyLORRRRSRSSSSSSSSSRRRQMECDDJMQRRRRRRRRRRQQOOOMLJCysnf006}}____}}}}___]]^/",
+"@@@@!|pzORRRRQOMJCtjgd0000088886}}}}60hnsuurmmmuBGMQRRRRRRRRQMLCtja9[[[[[[[[[^^^///>>>>>>>>/^^]]]]]________^^/>>;;--=***=--;>>///[[[/(>;;;>//3atEMOQQRRRRRRRRQMJyn96}____]^/;=*=->/^^3jCMQRRRRSRSSSSSSSSSRRRQMJGGGLOQRRRRRRRRRRRQOOOMLJGywnf06}}______}_____]^/>",
+"@@@@!|pIORRRQOMJCtng906600088886}}}60dnswBwwuuuyDJOQRRRRRRRQOLEyia93[[[[^^^_^^//>;;;;;>>>//^^]]]___________^^//>>>;-=******=-;>(////(>-=~-;((3jxFMQQRRRRRRRRQOLCsd6[____]^/;=&&*=;//[atJORRRRSSSSSSSSSSSSRRRQOLJJJLOQRRRRRRRRRRQQOOOOMLGDwnd06}}___________]]^/>",
+"@@@@!7zIQRRRQOLCtja9666600088886}}66dmwDCGGDDDDGJMQRRRRRRRROMExlb93([//^^^^^^//;-==-;;>>//^^]]]_____}}}}____^^///>>;=**&&&&&&*=;>((>;=*&&*->(atEMOQQRRRRRRRQQMGtg3[^__]]^/>=&%%&*;>/3jCMQRRRRSSSSSSSSSSSSRRRQOLLJLMOQRRRRRRRRRRQQQQQOMLJDwnd06}___________]]]^>;",
+"@@@!!pzIQRRROMEyia96666600888886666dhsCJLLLLLJLLMOQRRRRRRRQIFxlc:((((////^^//>>-=*=-;>>//^^]]____}}66686}}__^^^^^/>>-**&&&%%%%&*=--=*&%$%&=:3jxFMOQQRRRRRRQQMEyn3[/^^^^^/;=&%$%&*;>(ayJORRRRRSSSSSSSSSSSSRRRQOMLLLMQQRRRRRRRRRRQQQQQQOMJDwnd0}[___________]]^/>;",
+"@@@!7pINRRROOFCtg93[666000888886660hsCLOOQQQOOOOQQRRRRRSSNIzok11<==--;>(////>>;-==-;>>/^^]]]___}60feeee06}}__^^^^^/>;=*&&%$$@@@$%&&&%$@@@%*<btEMOQQQRRRRRQQMJxi:(>>>>>>>-*&$$$%&=;(3jCMQRRRRRSSSSSSSSSSSSRRRQOMMMMOQQRRRRRRRRRRRQQQQQOMJDwnd6[[__________]]]^/>=",
+"@@@!7zHNNNQOMExia96[6600088888060fhsDLOQRRRRRQQQRRRRRRSNNHp77))))%&&{~-;>(((>>;;;;>>//^^]]]___}0fhmmmmhe06}}_^^^^^/>;-**&%$@+++++@@@+++++$&1cxFOOQQRRRRRRQMJxi<~{&&&****&%$@@$%*->(atEOQRRRRRSSSSSSSSSSSSRRRQQOMMOOQRRRRRRRRRRRRQQQQQOMJDwnd6[___________]]]^>;=",
+"@@!7pHNNNNQOFAtja3666000eee88800dhuyJOQRRRRRRRRRRRRRSSNHvv4''!@@@@@$){~-:>((>>>>///^^^]]]____}0fmuuwwwumh06[[^^^^^/>>;=*&%@+++..........+@)2kAMOQQQRRRRRQMExl1)$@@@@@$$$@@@@@%&=;((ayJORRRRRRSSSSSSSSSSSSRRRQQOOOOQQRRRRRRRRSRRRRQQQQOMJCwg96[[^________]]]^/>-*",
+"@@!7vHNNNNNOFAtja366600eeeee800fhnyGMQRRRSRRRRRRRRRRSNHv54'''++++++@!)~<<:(((////^^^]]]_____}0dmuwBDDDBwnh0[[[^^^//>>;=*&%@++............+!|AFOQQQQRRRQQMFxl2)@+....+++++++@$&*;>/3gyLOQRRRRRSSSSSSSSSSSSRRRRQQOOQQQRRRRRRSSSRRRRRQQQOMJDsg9[[[^_______]]]^^/>=&",
+"@!7pHNNNNNNOFAtca936000feeeeeefhnyGMQRSSSSSSSRRRRRSSNHv5,,##....++@!){21cba3(//^^^]_______}}0fmuwBDGGGGDwnd6[//////>>;=*&$@+....       ..''pzIQRRRRRRQQMFxk2)@+........++++@%*->//3gyLOQRRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRSRSSRQQRQQQOMJDsg9[[[^^^^^^^_]]]^/>;*&",
+"@!7vHNNNNNNIFAtca9900000ee0e0edmwDLORSSSSSSSSSSSSSSNHv5,,##....++@!)|2kkliga3[[^^_______}}}00hmuBDGJLLLJCtga33(///>>;;=*&$@+...         #'4vHNNRRRRRQQMJxl2)!+..    ....++@$&=>/^[6gyJOQQRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRRSSRRQQOQQQOMJCsg9[[[^^^^^^^^]]^^/>-&%",
+"@!7vHNNNNNNIFClca990000000000fhnDJORSSSSSSSSSSSSSSNHv5,,##...+++@))22kxxytia9[[[[_____}}}600fhmuyDJLMOMLExib33(((>>;;-*&%@+...          #,5KHNSSRRRQQMJxl1{)+..      ...++@%*;>/^^6gyGMOQRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRSSSRQOOOQQQOMJDsg9[[^^^^^^^^^^^^^>;*&$",
+"!74HPPNPNPNIzxlba366600000000fmwGMQRSSSSSSSSSSSSSNHv5,,##..++@@$%{11lyDxytng96[[}}}}}}}66000ffmsyGLMOOOMLCtiaa3((>;;-=*&$@+...         #,5qPNNSSRRRQOFClc1{$+..      ...++$&=>/^^[6hsCLOQQRRRRSSSSSSSSSSSRRRRRQQQQQRRRRRRRRRRQOIIOOQQOMExia3[[^^^^^^^^^^^^/>-*%$",
+"!4vHPPPPPPHIzklb9366666666660dsxJORSSSSSSSSSSSSSNHv44'#...+@@$%{~<<ctyyyysngd066}}}}}}880800fdhsyGLOQQQOMExlbaa3(:;-=*&$@+...          #,5KHNSSRRRQOMAlb:~%@+..       ..++$&->/^^[6dsDJLOQRRRRSSSSSSSSSSSRRRRRQQQQQRRRRRRRRRRNIIIOOOOOMExja3[^^^^^^^^^^^^//;=&$@",
+"'4vKPPPPPPHIAkia93[[[}}66666dgtGMQRSSSSSSSSSSSSRIvp4'#...+@@%&*=-:acittwssnhdd000666686886800fhwCLMQQQQOMExtiga::;-=*&$@++...         #,,vHNNSRRRQOMExb:=&$+..        ..++$&->/^^[6dnyCJMOQRRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRRRRIIIIIOOOMFAtb93[^^^^^^^^^^^^/>;*&$@",
+"44vPPPPPPPHzAkca36[[[}}}}}60dnxFORSSSSSSSSSSSSNIzp4''...+@@%&*-;:(3agnissnnmhhdff00068886}6600hwGLOQQQQOMExtljba:;=*&%@++....         ##4vHNRRRQQOMFxja-{$+...        ..++$&->/^^[6dgsyGLMQRRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRRROFzzzIIIIMFxla3[^^^^^^^^//^//>>-&%@@",
+"4vHPPPPPPHHzolca3[[[[}}}}}69gtCMORSSSSSSSSSSSNHIp4''...+@$%&*=;;>((3agnnususurmhffe0066}}}}}6dnyJMQQQQOMLExytica:-~&%@@+......        .'7pFOOQQQOMLCla:~%@..          ..+@%*->/^^[60hnsyGLORRRSSSSSSSSSSSRRRRRRQQQQRRRRRRRROIzppzIIIIIAxia3/^^^^^////////>;*&$@@",
+"vvPPPNNPPHIzxlcd3[[[____}[6diyJMQRSSSSSSSSSNNHHp4''...+@$%&=-;;>>((33dhnwByyywwumhf006}}}}}}0gwGLOQQQQOMJGCCxtib:=*%$@+.......      ..+!2kAFOOOOMLExb:-&@+..          ..+@%*;>/^^[60dgnyCJORRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRQOFAoppvHHIIAkca(/^^^/////////>>-*%$@@",
+"vHHNNNNNNNIAxlg93[[[____[[9gtEMORRRSSSSSNNNNHvp4'''+++@$&*=;;>>>>((30dmwDDGGGDDwumhf06}}}}}6dsDJMQQQQOMMJEECCxlc<~{$@++.........   ..+${<lCJMMMMLExja:~$+..           ..+@%*;>/^^[69dhnsDJOQRSSSSSSSSSSSSRRRRRRQQQQRRRRRRQOMAooopvHHIzAkc3(/^^////((////>;=&%$@@",
+"HHNNNNNNNIIAxlga3[[[___[[6aiCJMORRRRRNNNNNHHvp7'!'++@$%&=;>>>>>((((3dnwDGJLLLJGDwuhf06}}}[69nyJMOQQQQOMMLLLLECxl1~)$@+..............+@&-:bxCJLLLExia3-&@..            ..+$&=>//^/[660dhsyJORRSSSSSSSSSSSSRRRRRRRQQQRRRRRRQMJxkkopvIHIzAkc3(/^///(((((//>>-*&%$@!",
+"HNNNSSNNOIFExtja9[[[__[[[9jxEMOOQRRQNOIIHHvp77!!!@@$%&~->>////////39hsDGLMOOMLJDysmd06[}}[6gtEMQQQQQQOMMMMMMLJCl1{)!@+.............+@&=>(alxEJEExta3(=%@..            ..+$&->///[[669dhsDJORRSSSSSSSSSSSSRRRRRRRRRRRRRRRQOMExkkozzHIIFAkca(///(/(((((>>>;-*&%$!!",
+"NNNSSRRQOMFECysgd6[[[[[[9jtCFMOOOOOIIFzzzpp7|)))))%&~-;>////////[3dnwDJLMOOOOLJGysgd6[[[[[9sCMOQRRRQQOOOOOOOOMAk2{)!@++...........+@%*;/(9ixCEExtg3(:*$+..            ..+$*->///[339ddgsDLORSSSSSSSSSSSSSRRRRRRRRRRRRRRRQOMCklkozIIIIFAkca3///(((::(>>>>;=&%$$!7",
+"NNSRRROOMMFECytjgd6[[[[9gtxEFMMMMIFFAAooo|22{{{{~~~=;>(///[[[[[39gsyGJLOOOOOMLJCysh0[[[[[9gxLOQRRRRRQQQQQQQQOMFo2{)$@+++.........+@%*;>/[9ixCECyja3(-&@+.             .+@%*;>///[39dddnwCMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRRQOFAxkkozIIIIFAkca3//(((:::>>>>;-*&%$!!4",
+"NNRRROOMMLJJECDtsg99669ajxCEFMFFFAAokkkl11<<<----:::((([[[[[[39gsyCJLMOOOOOMLJCysg96[[[[[9tEMQRRRRRRRRRRRRRRQOFo2{)$$@++........+@%*;>//[atCEECtj3(;~%@..            ..+$&=>///[39ddddnyGMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRRQMFCxkkAzIIIIFAtb33//(((::::>>;-*&%$@@'4",
+"NNNQOOMLLJJJJECDtng9999gtxCEEFEACxkkllicc::((((((::a33333[639gsyCJLMOOOOOMLLECysg9[[[^^[[atFOQRRRRRRRRRRRRRRROFk2{{)$@++.......+@%*;//^[6gtCEECta3(-&@+..            ..+$*;>///39ddddgsyEORRSSSSSSSSSSSSSRRRRRRRRRRRRRRQQMJCkkoAzIIIFFxlb33//(((::::;;;=*%$@@+'4",
+"NNOOMLJJEJJJJEGCysgd999gjxCCCCCxxklllicba333(333aaaaa993339gntCJLMOOOOOMLLGCysnd6[[^^^^^3gxLOQRRRRRRRRRRRRRRQOAk1~{%$@++.......+$*;(/^^[9nxEEExla(;*%@..             ..@%=>///[6ddggdgsyGMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRQOMExkkoAFIIMFAxja33[/((:::;;;;-*&%@@+''4",
+"HIMLLJGCCGEEJEGDysg9999ajttxxxxxtktttliga933339abbjbba9999gntCJMOOOOOMLJGDtsgd9[[[^^^^^^3jxLOQRRRRRRRRRRRRRROMAl1~{)$@+.......+@&-(/[[[[9jyCECxja:=&@+..             .+@&->//[39dddddgsyJMQRSSSSSSSSSSSSSSRRRRRRRRRRRRRQOLCxlkoAFIMFFCtb33[//(((:;;;;-=*&$@+++'4",
+"IIFJGDDyDDCGGGDywnd96[39ajitttxxxCCCxytjga999abjjiijbaa9dgnsDGLMOOOOMLECysgd96[[^__]]^^^3jxLOQRRRRRRRRRRRRRQOFxl<~{$@+........+%~:([[[[6djtyxtia(;*%@...             .+$*;(/330ddddddgsyJMQRSSSSSSSSSSSSSSRRRRRRRRRRRRQOMExlllkAFFFFAxia3[///(((:;;;;-*&%$@+++'4",
+"zzGCywwwwyDDDDDBshd6[[[39abiltxCAEEECCytjgaagjjillijbaaaggnwDELMOOOMLGDwnh06[[[____]]]^[[gyJOQQRRRRRRRRRRRQOFAlc<{)@+...   ..+${;([[[[[69gjssja3>=&@+..             ..+%~:(330dddddddgsDJOQRSSSSSSSSSSSSSSSRRRRRRRRRRQQMJCtjclkCEFFECtb33[^^///(>;;;;-*&%$@+++''",
+"ooytsiinswwyyDywnh06[[[[39ajitxEEFFJECxtijjjjltllljjbbjgjnsyDGJLLLLECyshd06[[[_____]]__[6gyEMOQQQQQQRRRRRRQMEkc<~{$@+..    ..@%=(([[[[[[69dga93(-*$+..              .+@)<:339ddd9399dgtCLORRSSSSSSSSSSSSNNNRRRRRRRQQQQOLExibbilxAEECxia3[^^^^//(>;;;;-*&%$@+++''",
+"oklinggdgnswBywsnd0[[[[[[39gitxEEFFJECyttiillttllliiilltstwyyDGGGGDysnh0066[[[_________[6hwGLOOQQQQQRRRRQQMExib<~%@+..    ..+$~>//[[[[[[[[66[[(;~%@+..              .+!{<:aaddda3339dnyGMQRRSSSSSSSSSSNNHHIINRRQQQQQOOMExlbabblxCCCxtj93[^^^^//(>>>;;-=&%$@++++'",
+"|2ccaa39dhnswwwsnd0[[[[[[[9ajtxCEEEECxyttiitttlllllltxxxyyyyyyyyywsnhd066[[[[__________}6hsDJMOQQQQRRRQQQOLClb:<~%@+..   ..+$&;(//^^^^[__[[[[/>=&@+...             .+@)21ccgdaa33339gsDJOQRRSSSSSSSSSNHHzppzIOOQQOOOMLECtjaaabltxCxtig9[[^^^^^//>>>>;-=&%$@++.+'",
+"22<:::(33dhnuwwsnh96[[[[[[69gjttxxxxtttiiiiiliiilltxCAECCDyywsssnhdd0666[[[[[__________}0hsDELOOQQQRRQQQOLEyib:-*%@+... ..+@&->/^^^^^_____^^//;&$+...             ..+!22lligaa:::(39gtCLORRSSSSSSSSSNHvp777pzIOOOOMMLECtja99agitxxytna3[[^^^^^///>>>;-=&%$++..++",
+"){~<:::((3dhswywsgd6[[[[[[[39gjjjiiijjjjjjjjjjjilxCEFFFJECyysnnhd0066}[}[[[[[[________}0fmwDGLOQQQRRRQQOMJCtb::-*%@+.....+@%=>/^^^^________^/>*%@...             ..+$)2kkktic::::(3aiyEMQRRSSSSSSSSNHzp7777ozIOOOMMLECtjg999ajityytig9[[[^^^^^////>>;-=&%$++...+",
+"){~~=--;:(9giwywsnd0[[[[[[[669dggggaaaaaggggjjjlxCEFMMMLJCywshd0066}}}}[[[[[[[______}}0dmuyDJLOQQRRRRQQOMJxib::-~&$@+...+@%=>//^^^________]^/-&@+..             ..+@)2koACxtic<<::abtCLORRRSSSSSSSRIzp7!!!|ozFOOMMLECysg9999ajittttig9[[[^^^^^^///>>>-=&%$++....",
+"%%{*~===-::anwwwsnd96[[[[[[6699999999999aaaabjitCEMOOOMLJCysnd066}}}___[[[[[[[____}}60hnwyDGJMOQRRRRRRQOMExlc::-~&$@++++!{=:(/[[[^________^/>*%@....            ..@%~1kAFFAxlc<<::aixEMQRRSSSSSSSNIzp|!!!!)|AFMMMLECtjg99399ajitttsnd6[[[^^_^^^////>>;=&%@++....",
+"$%%&&&**~=:aisttsng906[[[[[6669999999999999aajtCEMOOOOOLECysg966[}____}[[[[[[[}}}}}60huBDCGJLMOQRRRRRRQOMGxlc:<=*&%@@+!){1:336[[[[[}}}____^/;*$+...            ..+${<lAFMMFAk1<<:abtCLOQRSSSSSSSRNIo|!!@@!)|oFFMFECtjg933339gjtttsjg96[[[^__^^^^///>>;=&%@++....",
+"@@$%%%%&&~<:ciwtsngd96666666999993366663339aglxEFMOOOOMLCysnd06[______}[[666[[}}}}60hsyDGJJLLMQQRRRRRRQOLEkl<<=~{%$$!!)21cgdd0066666[}}}__^/-&@+...           ..+@%~<kAMOOIAk1<<:ajxEMORRSSSSSSSRIz7!!@@@!)|oAFFECtjg93[[339gjitsjgd6[[[_^__^^^^///>>;=&%@++....",
+"@@@$%%%%%{~<cittsngdd000000099999336[[[[399ajtCEMOOOOMLEytnd96[[______[[666666}}660huyDGJJJLLMOQRRRRRRQOLCkc<<~{&%))!||kytsnhdd0000066}}__/>=%@...            ..+$&=cxFOOOIAk1<bablxEMQRRRSSSSSNIzp|!@++@@)|oAAACxia93[[[33aajiijgg9[[[_____^^^^^//>>;=*%@+.....",
+"+@@$$$%%%&{1clttsingdddddddddd99936[[[[399ajtxCJMMOOMFExtng9[[[______[[6666666}}60fnwDGJJJJLLMOQRRRRRRQMFCl1<~~{&)))|ooCCDysnhddd000066}_^/>*$+...            ..+$&<lAIOOOIAk1baablxJMQRRRSSSSRNIp|!!++++@)|koAAxlg9[[[[[339agjjgg96[[_______^^^^//>>;=*%$+.....",
+"++@$%%%%%%{11kxyttinggggghhgddd993[[[[699gjstyCELMMLJCxsgd0[[[______[[669000666660dnBDGJJJJLLOQQRRRRRQOMAkl1~~{{{{{2oAEJJCywnhdfdfff06}}_^/;&@+..            ...+${<kAIOQOIAkc:aaaixEMQRRRSSSSQIzo|!@+++@@)|ooAxtja3[[[[[339aagaa96[[________]^^^//>>;-*&$+.....",
+"+@$%&&&%%%{2kkxxytsssssnnnnngad93[[[[69agjttyDCCEEEGDyig96[[_______[[660ddd000000fhsyGJJJLLLMOQRRRRRRQOFok11~~~*~~1kAFMLLGysnhdffff006}__^/-&@...            ...+${1kFOQQNIAlb:39aiyEMQRRRRRRRIzo|)!@+++@!)|oAAxtj93[[[[3339aaaa93[[[________]]^^^//>>-*&$++....",
+"@$%&***&&%{2koCCxxttttssssinga933[[[[9ajjttyyyyyDDytsgd96[[[______[[[69dddddd000ffnwDGJLLLMOQQRRRRRRRQIAk2~~~~~=<1kAFOOMLEDsnhdfff006}}__^>=%@..             ...@${1oINRQIFola333ajyEMQRRRRRRIFpo|)!@+++@!)|oAAAtj93[[[[339aaaa99[[[[_________]^^^///>;-*%@+....",
+"$%*=--=*&&)|2oAACCyytttwtsngga33[[[[39gstyyyyywwssngd96[[[^_______[[69ddgnhhfdfdhnsyGJLLMOOQQRRRRRSSSNIo|{{~~==-<lxFOOOOLEDsnhdfff00}}__^/>*$+..             ..+@%{2AINNNIFkca3339jtGMOQRRRROIAo|))@@@+@@!|oAFFAtj93([[339aaaa993[[[[_________^^^^^^//>;=&$++...",
+"&*-;;;-*&&){2oAEECDyyywtsngaa33(/[[[9gjtyyyyyssnggd93[[^^_______^[[69ddgnnnhhhhmnsyDJLMMOQQRRRRRSSSSNHp7|){{~-::cxFMQQQOLEDwshhfff06}___^/;&@+..             ..+@%~kAINNOIAlb3[[[9gtCLOQQRQOIAo||)!@@@@@@!|ozFFAxj93((339aaaaaa93[[[[_____^^^^^^^^^^^^/>;*&$++++",
+"=;>>>>;=&&%{2oAEEECDyttsnga33(((//[[9gstyyyysnghd06[[[^^________[[[99gnnnsnnnnuwBDCJLMOOQQRRRRRRSSSSNHp7)){~=::cxFOQQQQOLJCyssnhff06}__^/>*%+..              ..+${1kzIOOIFxia3[[[6gsCLMQQOOIAo||))$@@@@@!)|zIIFFxia3((33aabbba996[[[[___[[[^^^^^^^^]]^^/>;*%$@@$",
+">>///>>=*&%{2kAFFECDytigaa3((>>(//[39gsyyyysnhd06[[[^^^]]]]]___[[[69ggnnssssswyDGEJLMOQQRRRRRSSSSSSNNv7!)){~<blxFOQRRQQOMLGDywumhd0}__^^/;&$+...             .+@%~1kzIIIFAkb33[[[6dsyJMOOOIzo|))!@@@@@@@!)7zIIMExia3(33aajjjgad966[[}}}[[[[[^^^^^]]]]]]^/>-*&&&&",
+"//^^^/>-*&%{2kAFFJECysga33((>>>>(((3djstytsngd06[[/^^^^]]]]]___[[69dgnsssswwyDCELLMOOQQRRRRRSSSSSSSNHv7!){~<<lAFORRRRRQOMLECDywumf0}_^^/>=%@+..             ..+$&~1kAFIFAxla3[[[[6dnyELMMFzp|!!@@@+@+@@@!|pzIIIFxlb:33abjjjjgad000666}}}[[[[^^^^^____]]^^/>-===-",
+"^^^^^/>=&%%)2kAFFJECtia3((>>;;;;>((3ajsttssgdd6[[/^^^^^]]]]]]__[[69gnjsttyyyDGJLMOOOQQQRRRRRSSSSSSSNHp7|{~<<lAMORRRRRRQOMLJGCDywmd0[^^/>;*%@...            ..+@%*=<lAFFFAkia93[[60dsxEFFFzp7!!++++++++@@)|pIIIIFxlc::abjltiingddd000000006[[[^^^_______]^//>;;>>",
+"^^^^//;=&%$){2oEFJCxiba::>;;;;;;;>(3ajsttsngd96[[//^^^^^^]]]]_^[[99gjstyDDCCGELLMOOOQQQRRRRSSSSSSSNNHp|211ckAMORRRRRRRQOMLJEGDywmf6[^//>=&$+....          ...+$&=-:lkAAAxklja9000dhsyGJFzp7!'++++++++@@$)|pFIIFAxlcbbbittttsnghhffeeeeeee066[[[[_______]^^/>>>//",
+"^^^//>-*%$$!)|oAEACtcb::;;;;;;---;::acittingd33[/////^^^^^]]]^^[[9gjttDCGGGEJJLLMMOOOQQRRRRRSSSSSSNNIpk11lkAMORRRRRRRQQOMLLJGDysh0[[//>;*&@+....         ...+$&*;>:blkxxxxttigdddhnwDGEFzp7''.+...+++@@)||AFIFFAklcccitxxxytsnmhhhheeeehff06[[[[}}}}____]^//////",
+"^///>-*%$@@+!!|oAokl<<===--;;;--==-:bcitlingd33/////////^^^^^^^[39jtyCEJLLLLLLLLLLLLMMOQRRRRSSSSSSNNzokllkAFORRRRRRRRQOMLLJEGDBrd6[//>>-*%@+...         ...+$&*;>((:clkxxCCCytnmmnsyDGEzp74''....+++@@$)2oAFFFExklccitxCCCxytsnmmmmhhmmmmmff06[}}}}}____]^/////[",
+"(((>-*%$++++''77oo22{{{**=-----====<<ciiliiga33(///////////^^^^[3aiyCJMMMMMMLLJJGGGEJLMOQRRRRSSSSSNIzoklkAFORRRRRRRRQQOMLJEGCysh0[[//>-*&$++...        ...+$&=;>///(ablxAEJJGDywsswDCGEzp4''.....++@@$){2oAFFFAxllcilxCCCCDywsurmmmmmmrrrrmhff0066}}}___^^//(339",
+"a3:={)@++.##''4477|)))%%&*=---=***~~<cilliiba3(((>>>>>>>>>>////[9jtCFMOQQQQOMLJCDyyxCEMOQRRRRRSSSSQIAokxAFORRRRRRRRRQOMLJJEGDBnd6[//>-*&%@+....       ...+@&*;>////(3alxEMMMLJCDyyDDGGzzp4''#....++@$){2koAFFEAxliiltxCEECDywuurrrrrrrruuurrmhhfe00}}___^^/39gii",
+"ic<{)!+.###,,,,447!!@@@$%&*===*****~~1cilicba:(>>>>>>;;;;;;>>/(3atCFMQQRRRQQOLEDttttCEMOQRRRRSSSSROFAoxAFORRRRRRRRRQQOLLJEGDysg9[//>-**&$++...        ..+@%*;>/^^^//3alAMOOOOLJGDDDGGEzp44''#...++@@$)22kAAFEACtliilxCCEECDywwuurrrrrruuwuuwuumhffe0}}__^[[9jtxC",
+"l12)!''###,,,,,44'''++@@$%&******&&*~<1ccccb:::;;;;;;-==**=-;>(3ixJMQRRRRRRQOLEDtttxELOQRRRRRSSRRROFAAAFOQRRSRRRRRRQQMLJEGCDynd6[/>-=*&%@++...       ...+$&->//^^^^/3atEMQQQQOLJGGGGJJzp44''#...++@$){2koAEEEAxliiltxCEEECDyBwuurrrrrruwwBBBBwwurhf06}}_[[9gsxCG",
+"k2|!'''##,,,,5544'''+++@$%&&***&&&&{{~<<ccc::---=====**&&&**-:(btEMQRRRRRRRRQMECytxEMOQRRRRSSRRRROMFEEFOQRRSSRRRRRRQOMLEGCDysg9[//;=*&&%@+....       ..+@%*;>/^^^^^/3bxLOQRQQOMLJGGJJJzp4'''#..+++!))22koAAAAxtliiltxCEEEGDyywuurrrrruuwBBDDDDDBwrmf06}}[6dntCGG",
+"22)!'''',',,555544''+++@@$%&&&&&&&&&{~<<<<<<==~*****&&&%%%&*=:blCMORRRRRRRRRQMECxCEMOQRRRSSSRRRRQOMFFMOQRRSSRRRRRRQQOLJGCDysnd6[/(;=*&&%@+....       ..+@&=>//^^^^/[9iCMQRRRQQOLJJGJJFzp4,''#..++!!)||oooCACxtijjjlxCEEJEGCDywuuurrruuwBBDDGJJGGDBumd06669ditxDx",
+"2))!!+''''445vvv477!++@@@$%%&&%%%%%%&*~=<--=~*&%%%%%%%$$$$%*-:cxEMQRRRRRRRRQOMJEEFMOQRRSSSSSRRRQOMMMMOQRRSSSSRRRRRQQMLECDysnd9[[/>;=*&%$@+....       ..+$&->//^^///3atFORRRRQQOLJJJJJFzp44,,''''!!77ooooCCCxtljbjitxCEJJJEGDDBBuuuuuuuwBBDGJLLLJGDyumd0009gnsttt",
+"))!!!!!!)77ppvvzpp7!!!@@$$$%%%%%$%%%%&*~==~*&%$$@@@$$$$@$%&~:biCJOQQRRRRRRQOMLJJLMOQRSSSSSSSSRRQOMMOOQRRRSSSSSRRRRQOMLGCywsg96[^/>-**&%$@+...        ..+$*->//////(3jCMQRRRRRQOMLJJJFFzv44,,,''477ppzzAAACxxtijbjlyCELLLLJGGDDBwuuuuuwBBDGJLMOOMLJDBuhdd9ddgnii1",
+")!!))){22|ozzIIIzpo|))$$$$$$$$$$$$$$%%&*~**&%$@@+++@@@@@$%*-:aiCJMOQQRRRQQOMMLLLMOQRSSSSSSSSRRRQOOOQRRRRSSSSSRRRRRQOMLGCysnd9[[^/>-*&&%$@+...        ..+%*;>////>((btFORRRRRRQOMLLJLLIIvv555555vvHHIIIFFAAxtljjjitCELLLMLLJGDDBwuuuuuwBBDGLMOQQOMLGDwsghdddaab<1",
+"!)){21<clkAFIIIIFAo2{))$$$@@@@@@@@@@$%%&&&&%@@++++++++@@$&=;(aixGLMOOQQQOOMLLLMMOQRRSSSSSSSSRRRQOOQRRRRRSSSSRRRRRRQOMLECywnd6[^/>;*&&%%$++...       ..+@&=;>//(>>::iAIRRSSRRRQOMLLLLMIIHvqqqqqKPPNNNNNIFEAxtljjitxELLMMMMMLJGDDBwuuuuwBBDJLOQQQQOMLGDwngddda:<~{",
+"7||21cclxAFMOOOOMFAk2{)$$@@@++++++++@@$%%%$@@+++.+++++@@%&->3ajtDGLLMOOMMLLLLMOQQRRSSSSSSSSSRRQQQQRRRRRRRSSRRRRRRRQOOLLGDtnd[[//;*&%%%$@+...        ..+%*;>///>;;<1kFQSSSSSRRROMLLLMOOHHKKKKKPPPNNSSSROMJAxtljjiyCJLMOOOOMMLJDDBBwuuuwBBDJLOQQRQQOMJGywngaa:<~{)",
+"ppokktxxEFMOOQOOOIzo2{)$@@++++++..++++@@@@@+++....++++@@%*-(3djsyCGJLLLLLLLLMOQRRRSSSSSSSSSRRRQQQRRRRRRRSSRRRRRRRRQQOMLEDtg9[//>*&%$$$$@+...       ..+@&=>>//(>;-12oINSSSSSSRROMLLMMONNNPPPPPPNSSSSSSSRMFExtljitxGLMOOOOOOMLJGDDBwuuuwBBGJMQQRRRQQOLJGDtigbc1||7",
+"vzzAACCELMOQQQQQOOIAo|!@@++..........+++++++......++++@@%*;(3ajsyDCGEJJJJLLMOQRRRSSSSSSSSSSRRRQQRRRRRRRRRRRRRRRRRQQQOMLGysa3[/>=&$@@@@@@+...      ..+@%*;>//((:;=12zISSSSSSSRROMMLMOQRNNNNNNNSSSSSSSSSROFCxtiistCELMOOQQQOMLJGDBwwuuuwBBGJMQRRRRRRQOMLECyti12|74",
+"NIIMFJFLMOQQQRRRROIzp|!+++........................++++@$&=>(3antyDCGEEJJLLMOQRRRSSSSSSSSSSRRRQQQRRRRRRRRRRRRRRRRRQQOOLJCtg9[//;*$@+++@@++...     ..+@%*;>///((:;<1kzNSSSSSSSRROMLLMORRSSSSSSSSSSSSSSSSROFCttiisyCJLMOQQQQOOLJGDBwuuuuuBBGJMQRRRRRRRQOOMJGCxoppvv",
+"NROOMMMMOQQQRRRRRROIp7!++.........................+++@@%&->3djsyDCCGEJJLLMOQRRRSSSSSSSSSSSRRQQQRRRRRRRRRRRRRRRRRQQOOMJCtn9[[/>=&@+++++++...     ..+@%*;>////((>:<<kFQSSSSSSSRQOMLLMORSSSSSSSSSSSSSSSSRQMJCtiiityCJLMOQQQQOMLGDBBuuuuuuBBGJMQRRRRRRRRQQOMLFzzHHPP",
+"SRQOMMMMOQQQRRRRRRRIz7!'+.........................++@@$%*;(agsyDCGGJJLLLMOQRRRSSSSSSSSSSSRRQQQQQRRRRRRRRRRRRRRRQQOMLJCyj9[[^/;*$@+..+++....    ..+@%*;>//////(>::<lFOSSSSSSSRQOLJLMORSSSSSSSSSSSSSSSRRQMExsinstyCJLMOQQQOOLJGDBwuuruuuBBDJMQRRRRRRRRRRQOOIIHNPNN",
+"SRRQOMMOOQQQQRRRRRRNIp7''+............         ...++@$%&=:3gsyCGGEJLLLMOOQRRRSSSSSSSSSSSRRQQQQRRRRRRRRRRRRRRRRQOMMLECynd6[^^>-&@+..........   ..+@%*;//^^/[[/((>(:lFORSSSSSSRQOMLLMRSSSSSSSSSSSSSSSRRRQMCtsinssyDJLMOQQQOMLGDywurrrruuBBDJMQRRRRRRRRRRRRQONNNNSS",
+"RRRQOMMOOQQQQQRRRRRNIz4''++.++.........         ...+@$%*-:bixCGEJLLLMOOQQRRRRSSSSSSSSSSRRQQQQRRRRRRRRRRRRRRRQQOMMLJCysg9[^^/;*$@+.........   ..+@%*;//^^^[[[//(((3iEORSSSSSSRQOMLMORSSSSSSSSSSSSSSSRRROLCtsnnswyDJLMOQQOOMJGDBwurrrruuBBDJMQRRRRRRRRRRRRRNNNSSSS",
+"RRRQMMMOOQQQQQQRRRRRIzp7!+++@@++++.....         ...+@@%*<ciyCEJJLLMMOQQQRRRRSSSSSSSSSSSRRQQQRRRRRRRRRRRRRRRRQQOMLJGDwnd6[^/>=%@+.......... ....@%*;/^^^__[[[/((((3bCMRSSSSSSROOMLMORSSSSSSSSSSSSSRRRRROLCytssswyDGLMOOOOOLJCywwurrruuuBBDJMQRRRRRRRRRRRRNSNSSSSS",
+"RRQOMMMMOOQQQQQRRRRROIp7!!@@@$$$@@++....         ...+@%{<ctxCEJLLMOOQQRRRRRSSSSSSSSSSSSRQQQRRRRRRRRRRRRRRRRRQQOOMLGDwn9[[/>=&@+...............+$&->/^^__}}[[/(((/3bxMQRSSSSRROMLLMORSSSSSSSSSSSSSRRRRROLGCytwwByDJLMOOOOMLGDywwurrruuuBBDJMQRRRRRRRRRRRRSSSSSSSS",
+"RRQMMLLLMMOOOQQQRRRROFo|!$$$%%%%%$@+....         ...+@){1ctDCEJLMMOQQRRRRRRSSSSSSSSSSSSRRRRRRRRRRRRRRRRRRRRRRQQOOLJDwn9[/>-&$+...............+@&=>/^^__}}[[(((>(/(axLQRRSSSRROMLMMORSSSSSSSSSSSSSRRRRROMLGCDyyyDGJLMOOOOMJGDywwuuruuuwBBDJMQRRRRRRRRRRRRSSSSSSSS",
+"RQOMJEEJLLMMMOQQQRRQOzo|)$$%%&&&%$@++...          ..+@${1clxCGJLMOQQRRRRRRRSSSSSSSSSNSRRRRRRRRRRRRRRRRRRRRRRRRQQOMLGyn93(-&$+...............+@%*;/^^__}}6663((>//(9tEORRSSRROMLLMMORSSSSSSSSSSSSRRRRRRQOMLLEGCDGJLMOOQOOMLGDywwuuuuuwBBDGJMQRRRRRRRRRRRSSSSSSSSS",
+"QQMLEGGGEJLLLMOQQQQOFA2{)$$%%&&&%$@+....          ...+${<bitCGJMMOQRRRRRRSSSSSSSSSSNNNRRRRSRSRRRRRRRRRRRRRRRRRQQQOLGyg9(:*$@...   .........+@$*->/^^_}}60003(((//[9lEMQRRRRQOMJJLMQRRSSSSSSSSSSSRRRRRRQQOOMLLJJJLMOOQQOOMLGDywwuuuuuwBBDGJMQQRRRRRQQQRRSSSSSSSSS",
+"QQMLEGCCGGGJLMOQQQQOFo2{)$$$%%%$$@++....          ...+$&<:bixCJMOQRRRRRRRSSSSSSSSSNNNNRRSSSSSRSRRRRRRRRRRRRRRRQQQMLCwg3(-&@+..    ........+@$&->/^^_}}60fd03(((//[3jxMOQRRQOMFEGJMORSSSSSSSSSSSSRRRRRRRRQQQOMMLMMOOQQQQOMLGDywuuuuuwBBBDGLMQQRRRRQQQQRRSSSSSSSSS",
+"QQMLEGDDDDCGJLOQQQQMEk2)$$@$$$$@+++......         ...+$&-(ajtCJMOQRRRRRRRSSSSSSSSNNNNNNSSSSSRSSRRRRRRRRRRRRRRQQQOLJDsa3>~%@..    ........++$&=>/^^__}}0ddd03((////3atEMOOOOMFGCCGLORRSSSSSSSSSSRRRRRRRRRRRQQQOOOOQQQQQQOMLGDywuuruuwBBDDGLMQQRRRQQQQQRRSSSSSSSSR",
+"QOMLEGDDDDDCELOQQQOMAk2)$@@@@@+++........        ....@$&-(3gtCLMQQRRRRRRRSSSSSSSNNNNINNSSSSSSSSRRRRRRRRRRRRRQQQOMJCwg9(;*$+..     ......++$&=>/^^]__}60ffd03(///^^[3iCFMOMMJCDyDGLORRSSSSSSSSSSRRRRRRRRRRRRRQQQQQQRRRQQOMJCywurrruuBBBDGJLMQQQQQQOOOQRRRSSSSSSRR",
+"OMMJEGDyyyyDGLOOQQOFCl{)$@@++++..........        ...+@$*;(3bxEMOQRRRRRRRRSSSSSSNNNHHINSSSSSSSSSRRRRRRRRRRRRQQQOMJGynd3(-&@..      ....+++@%*;/^^]___}60ef03((//^^^/3axAFMFFAxywyDJORRSSSSSSSSSRRRRRRRRRRRRRRRRQQRRRRRRQOMGDwurrrruwBBDGGJLOOQQQOOMMOQRRSSSSSSRRR",
+"MMLEGDyywwwyGLMOQOMFx1{)$@+++.............       ...+@%*;(3jxFMQQRRRRRRRRRSSSNNNNHHINNSSSSSSRSSRRRRRRRRRRRRQQOMLGysg93:*$+.       ....++@%*->/^]]__}}60e003(//^^^^^[9lxEEEAxtsswDJOQRRSSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRRQOLGysrmmmruwBDDGJLLMOOOOMLLLMOQRRSSSSRRRR",
+"MLEGCDywuuwyGLMOQOMAk1{)@@++...............    .....+@%*;(bxFMOQRRRRRRRRRRSSSNNHHHIINNSSSSSSRSSRRRRRRRRRRRRQQOLJDwnd3(=%@..        ...+@$&->/^]]]__}}800063///^^^^^[3btCAAxysissDJOQRRSRRSSSRRRRRRRRRRRRRRRRRRRRRRRRRRQOLCwummmrrwBDDGJJLLMOOMLLJJJLOQRRRRSRRRRQ",
+"EGCCDywuuusyGLMOOMFAl1{%@++........................++@%~:alEMQQRRRRRRRRRRRRRNNHHzzIHNNSSSSSSRSSRRRRRRRRRRRRQQOLGysg9(-{@+.         ..++@%*;/^]]]___}}66666[//^^^^^^^3alxxxxtinnsDJORRRSRRRRRRRRRRRRRRRRRRRRRRRRRRRSSRRROJDwnmmmruBDDGJJLLLMMMLJGGGGJMQRRRRRRRRQQ",
+"CDyyywwurrsyGLMOOMExl<{%@+.......................+++@$&=:lAMQRRRRRRRRRRRRRROIzzpppzHNNSSSSSSSSRRRRRRRRRRRRRQOMJDtna3:~$+.          ..++$&->/^]]]____}}}6[[[//^^^]]^^39jtxxtijnnwDLORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSRRMJDwrmmmrwBGGJLLLLMMMLJGCCDGJMORRRRRRRQQM",
+"ttwwwwuumrsyGLMOMLAkc<~%@+...    .....+++....+++++@@$&*<cxMQRRRRRRRRRRRRQQOFAoo77pzHNNSSSSSSSSRSSSRRRRRRRRRQOLGyiga:=)@..          ..+@%*;>^]]]]]___}}}}[[[/^^^]]]^^[3bltttinnsyGLQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSQMJDwnmmruBDGJLLMMMLLJJGDDDDCELOQRRRRRQQML",
+"ssswwwuuruwDELMMMFClb:~%@+...    ....++++++++@@$$$%%&*-:lFORRRRRRRRRRRRQOMAok|||7pIHNNSSSSSSSSSSSSRRRRRRRRQOMJDtga3:{$+.           ..+@%*;/^]]]]]____}}}[[/^^^^]]]]^[3ajltiiiswDJMQRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSQMGywumruwDGJLMMMMMLJJGDDDDDCELOQQRRRQQMJC",
+"nnsuwwuuuswDJLMMMExj::=%@+..     ...+++@@@$$%%&&****~-:bxFORRRRRRRRRRRQOFAk22))|7pHNNSSSSSSSSSSSSSRRRRRRRRQOLGyia3:=&@+.           ..+@%*;/^]]]]]______^^^^^^]]]]]]^^[9gjiiiswyGLOQRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSQLGywuruwBDJLMOOOMLLJGDyyDDDGELMOQQQQQMJCt",
+"nnsuwwwuuwyCJLMMJClb3:-&@+...   ....++@$$%&&*=------;>:jAMQRRRRRRRRRRQOFAk12{))!7vHNNSSSSSSSSSSSSSRRRRRRRRQOJCtg93:~)+.            ..+@%*;/^]]]]]______^^^^^]]]]]]]_^[3ajiistyDJLORRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSOLGywuuuBDGLMOOOMMLJGDyyyDCGEJLMOQQQQMJCtn",
+"nruwBwwwuwyGJLLLExj3(>-&@+...  .....+@$%&*=-;>>>>>>>>(alAMOQRRRRRRRQQOLAkl1{)))|pvHNNSSSSSSSSSSSSRRRRRRRRQOMEDsa9(-{@+.            ..+@%*;>^]]]]______^^^^^]]]]]]]]_^[[9gnistDGJMQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSNNOLGywuwwBDJLMOOOMLJGDBwwyDGJJLLMMOOOMLGysn",
+"ruwBBBBwwBDGJLLExia3/(;&$+.........++$%&*-;>>////>>>/(atEMOQQRRRQQQOMLExl<1{{))7pHPNSSSSSSSSSSSRRRRRRRRRRQOLGyia3:~)+.             ...+$&->/^]]_____}[^^^^]]]]]]]]]__[[9dgntyCELOQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSNSNROLGywwwBDGLMOOOMLJGDwsstDGJLLLLLMMMMLEDsng",
+"uwBDDDBBBBDGJJECtb3///;*$+.........+@%&*-;>//////////(atCLMOOQQOOOMLJExlc<<~{{|7vHNNSSSSSSSSSRRRRRRRRRRRRQMJCtga3<{@+#              ..+$&->/^]]___[[[[^^^^]]]]]]]]]__[[69gntDCJLOQRRRRRRRRRRRRRRRRRRRRRRRRRQQQRRSNNNSQMLGDBBBBGJLMOOMMJGDwunsyCJLMMMMLLLLLECtsng",
+"wBDDDDDBByDGGGCtj93^//;*$+........++$&*=;>>//////>>>/(aixELMMMMMMLJECxlca:<~{{|pHNNNSSSSSSSSSRRRRRRRRRRRQOLGysga:~!+.               ..+@&=>/^^]_[[[[[[[^^^]]]]]]]]]___[60dntDGJMOQQRRRRRRRRRRRRRRRRRRRRRRRQOOMOORNNNQOMJGDyBBDGJLMMMMJGDwumnsyELMOOMMLLLJECysnnn",
+"BDDGGDDByDDCCDtj93^^//;*$+........+@%&*-;>>/////>>>>//3btxCEEEEEECCxtlba::<~~2ozHNNSSSSSSSSSSSRRRRRRRRRRQMJCwna:<)@+# #             ..+@&=>/^^^^[6666[[^^^^]]]]]]]]____}0dntCELMOQQRRRRRRRRRRRRRRRRRRRRRRQOMLFFMOOQQOMLECDBBDDGLLMMMLJDwughgsCJMOQOOMLJEGDysnnnh",
+"DDGGJGDDDDDDDyja3[^^^/;*%+.......++$&**-;>>>>>>>>;;>>((9jityxxxxxxttiba3(:<<12pIHNNSSSSSSSSSSSSRRRRRRRRQQLGDsna<{!+.                ..+$&->/^^^[[6666[[^^^^]]]]]]]]____[0dntCELMOQQQRRRRRRRRRRRRRRRRRRRRQOMJGCCEFMOOMLJGDDBBDGJLLMMLJDysngggtCLOQQQOMLECytsngghm",
+"DGJJJJGDDDDyysg9[^^^^/>*%+.......+@%&*==-;>>>>;;---;;>((3aggjiiiiiibaa3((:<<2ozHNNNSSSSSSSSSSSSSRRRRRRRQOLGysb:~)+.# ##             ..+%=>/^^^[[6666[[[^^^]]]]]]]]]]___[6dntCELMOQQQRRRRRRRRRRRRRRRRRRRRQMJCytyxCEFFJEGDDBBBDGJLLLLJGDwngdgiyEMOQQQOMJCysngddhhm",
+"JJLLLLJGDDywsg9[[^^^^/>=&@+.....++$%&**=---;;--=***==;>((333aaabccba:(((>:<12oINNNSSSSSSSSSSSSSSSRRRRRRQOLCyic1{!+## #              .+$*;>^^^^[[666[[[^^^^]]]]]]]]]]___}60ntDGJLOOQQQRRRRRRRRRRRRRRRRRRQOLCysiistDCCCCDyBBBBDGGJLLJJDBshddgixJMQQQQOLEDtngdddhmu",
+"MMOOOMLJDDBsgd6[^_]]^/>-&$+.....+@%&***======***&&&&**=;>>((::::::::((((>::1ozINNNSSSSSSSSSSSSSSSRRRRRRQOLCyic2)+.####             ..@&->/^^__}[[[[[[^^^^]]]]]]_]]]_____69gsyCJLMOQQQQRRRRRRRRRRRRRRRRQOMGDwngggiswyyywwwwwBDDGJJJGDyundaaaiCFOQQQQOLEDsndddhrwB",
+"OQQQQOMJGysnd6[[__]]^^/;*$++...+@$&**======***&&%$$$%%&*=----=<<<::((((((:blAINNNSSSSSSSSSSSSSSSSSRRRRRQOLGyl1)!'####             ..+%*>/^]]__}}}[[[^^^]]]]]]]]]_]______[0dntDGJLMOQQQQRRRRRRRRRRRRRRRQOLCysndddgnnsssuuuuuBBDGGGGDywnd93abiCFOOQQOOLGDsnghhrwDG",
+"QQQQQQMLGysg9[[^__]]]^/>=&@++++@$&*=---===***&%$$@@@@@$%&&***~~=<::((((((:ckAIQNSSSSSSRRSRSSSSSSSSRRRRRQOJCk2|!'#####             .+$*;/^^]____}}[[^^^^]]]]]]]___]_____}[9dnsyCGJLMOQQQRRRRRRRRRRRRRRQOMEDsnddddddhgmnrrruuwBDDDGDBwmd93::bixFOOQQOMLEDwsnnswDGL",
+"RRRRQQOLGynd6[[^___]]^^>-&%@@@@$&*=;;;;--=**&%$@+++++++@@$%%&{*~=-:((((33alxFORRSSSRRRRRRRSSSSSSSSRRRRRQMJCk|!'####             ..+$&;>^^]________^^^^]]]]____________[[69dgswyCEJLMOOQQRRRRRRRRRRRRRQOLCyuhd00660ddhhmmrruwBBDDDBwrd03::::ixJMOOQOOLJGDBwwBDJLO",
+"RRRRRQOLCyn96[[[^___]^^/;*&$$$%&*-;>>>;;;-**&$@++......++@$%%&{~~<::(333aixEMOQRRRRRRRRRRRRSSSSSSSSRRRQOMAk2!'### #             .+$&->^^]]_____________]_____________[[69ddgnsyDDGJLMOOQQRRRRRRRRRRRQQLEDsmdd0666600ffhmmruuwBBBBwrh03(:-<<cxEMOOOOOMLJGDDDGJLOQ",
+"RRRRRQOLCwn93[[[[[^__]^/>=*&%&&*-;>>>>>;;-*&$@+..........+@$)){{~<<:aaagitCJMOQRRRRRQRRRRRRSSSSSSRRRRRQMJxk|!'##               .+$*;>^^]]___________________________[[6dggnnsswyyDGGJLOOQRRRRRRRRRRRQOLDBrhd0666[660ffhmmrruuuwwumh03(:-==<ckELMOOOOMMLJJJJLMOQQ",
+"RRRRRQOLCtna936[[[[[^^^/>-*&&&*-;>>>>>>;;=&%@+.....    ..++@$)){211cccityCJMOQQRQQQQQQRRRRRRSSSSRRRRRQOFCl2!'##               .+$*;/^^]]___________________________[[9gnsssssswwByDDGJMOQQRRRRRRRRRQOLGysmhe066[[[60ffhmmmmrrrmmhf03(>;===<cyGLMOOOOOMMMMMMMOQQR",
+"RRRRRQOLCyjggadd996[[^^/>;****=;>>>>>>>;=*%@+....       ..+@!!))|2kkkkxDGFMOOQQQQQQQQQQRRRRRRRRRRRRRQOLEt1|!'#               .+$*;(/^^________^____________________[9gsyDDDyywwwwwBDDJLMOQQRRRRRRRRQOLDBuhfe06}}}[60fhhhmmmhhhff033((;-===<cyGLMOOOOOOOOOOOQQQRR",
+"RRRRRROLGytsjjnnng96[[//>;**&*=;>>>>>>;=*&$+....        .+++!!!!||ooCAEFMMOQQQQQQQQQQQRRRRRRRRRRRRRQOMExl1)@.               .+${:((/^^[[}}[^^^^___________________[6gsCEJEGCDywwsuwBDGJLMOQQRRRRRRQOLGDwrhee066}[[60dhhhhfff0063(((>>;===-:cyGLMMOOOOQQQQQQQQRRR",
+"RRRRRRQMJCyyyyyttng96[//>-*&&*=-;>>>;-=*&$++...         ..++!!!77ppzzFMOOOQQRQQQQQQQQQRRRRRRSRRRRRQOMLCtc1)+.              .+!{<aa93[[[6[[[[[^^^__________________[dsCJLMMLJGDywsswwBDGJLMMOQQRRQQOMLDBumhee066}}660dhhhdd0633(((>>;-=~==-:ixGJMMMOOQQQQRQRRRRRR",
+"RRRRRRQMLECCCCCDysgd6[//;=*&&&*=;;;;-*&%$@+...         ...+@@!!77pzzFIOOOQQQQRQQQQQQQRRRRRRSRRRRRQOOLExi:~)+.             ..@)1lllijgdddd066[[^^_________________[0gyEMOOOMLJGDBwsswBDDGGEJLMOQQQOOLJDwumhee866}6600dddd0663((>>;;-=***=-:bixELLMMOOQQRRRRRRRRRR",
+"RRRRRRQOLJEGGEGCysg9[[/>;*&%%%&*=--=*&%$@+....         ..+@@!!!77pzFIOOOOQQQQQQQQQQQRRRRRRSSRRRRQQOMJCtb:~$+.             .+!2kxCCCyttsnngd96[[^________________}[9sCLOQQQOMLEDywsuswwBBByDCJMMOOOMLGywrmhee066666099d9033((>>;;-==****=;:btCELLMMOOQRRRRRRRRRRR",
+"SSSRRQOMLJJEGGCDtn9[[//>=&%$$$%&***&&%$@++....        ..+@@$))||opzFIOOOQQQQQQQOOOQQRRRRRRSRRRRRQOMLExja<&@+.            ..+!2oFMMLLECDytsgd3[[[________________[6dtEMOQQQQOLJCywsuuuuunnnntxELMMLLEDywrmhee006666699333(((>;;-==*****=;:3gtCELLLMOOQRRRRRRRRRRR",
+"SSSRROMLJGGGCDysn9[[^/>-*%@@+@$$%&&%$$@++....       ....+@%&*~22kAEFMOOOOQQQOOOOOOQQRRRRRSRSRRRQQOMFCtb:~$+..            .+!|oFOOQOOMLJGDtna96[[_______________[[6gtEMOQQQOOLJCywsrnmhhd999ajtCELLJGDywrmmee80666[66333/(>>;-===***==-;>(3iyCJJLLMMQQRRRRRRRRRRR",
+"SSRROMJECDDyttjg9[[^//;*%@+++++@@$$$@@+++....     .....+@%*=-:<ckCEFLMOOOOOOOOMMOOQRRRRRRSRRRRRQOMLExlc~)@+.            .++!pIOSRRRRQOMJGxig93[[[}__________^^[[[6dsCJMOOOOMLGDwsnmhhd06[[[39jtCEEGCDywummhee0066[[[[//(>>;-======-;;>>(3asyGJLLLLMQQRRRRRRRRRSS",
+"SRQOFEDytsnngg9[[^^^/>=&@++....+++++++++..... .. .....++$&=;>(actCEJLLMMMOMMMLLLMOQRRRRRSRRRRRQOMMFClc<{@+..            .+!7INSSSSSRRROMFxtgd96[}}}______[///////33glxEFLLLJGywsghdd06[[[^^/[9jtCCCDDywurmhff0066[[[///>>;-=====-;>>(//[3gtCEJLLLLOQQRRRRRSRRSSS",
+"ROIExljggdd96[[[^^^^>-&$++.......+++++++......  ......+@%*;>((ajtCCEJLLLLLLLJJJLMOQRRRRRRRRRRQOMMFAtc<~$+..           ..+!7zNSSSSSSSSSQOFCtja9066}}}}}_[/////((>>((:bilkxxxytigdd0066[[/^^^^/3ajtyDDDyBwurmhhd006[[////>;;-===-;;>////[6dsDGJLLLLLOQRRRRRRSRSSSS",
+"IFClba336[[[[[__]^^>-&$++.........++++@++.............+@%*;(/39jtDCGGEJJJEGGCCELMOQRRRRRRRRRQOMFECxib<{$+..           .+!7pHSSSSSSSSSRROFAxigd9066}}}[[//(>;;;------<<<<1cccaa33333[[[/^^^^^^[9gttyyyyBywwummhd06[[////>;;----;>>//[[[3dnyCJLLLLLMOQRRRRRSRSSSSS",
+"Akla3([[[[[^__]]^^>;*$++..........++@!!!@++...........+@%=;//3aitDCCCCCDCDDyyyCJMQRRRRRRRRRQOMJExtjb:=&$+..         ..+@!pINSSSSSSSSRROOFAxtjgdd066}[[/(>;=********~~~~~~~<<::(((///////^^^^^/3ajsyyyDDDyywurnd96[[////>>;;;;;>(/([39dgntCELLLLLMOQQRRRRRRSSSSSR",
+"lca((/^^^____]]^^>;*$@+.........++@!)))))!@++.........+@%*;(/3aiyDDDDyyBwwtstyCLOQRRRRRRRRQMLECxtjb::=&@+....     ...+!|oINSSSSSSSRRRQOMMJECysnhd06[[/>;=*&%%%&&&&&****{{**~=-;>>((//////^^^^^[9gstyyDDDDDyBsng93[[////>>>>>>>((33agjstDCELLLLLMMOQRRRRRRSSSSRQO",
+"a3(//^^^]]]]]]^^>;*%@+.........+@$){22222{)$@++.......+@%*;>/3gsyDDDywwunnnisyELOQRRRRRRRQMFECxtjba(:=&$@+.........+@!|ozNSSSSSSRRRQQOOOMMLJECyshd93(>-*&%%$%%%&&&&*&*&&&&&**==-;>>>>////^^^^^[9gjtyDDCGGGDywsg96[///////(>>(((39gitxCGELLLLLMMMOQRRRRRRSSSSSOMF",
+"3((/^^^]]]]]]^^/;*%@+........+@$&~1<1lcc<<~{%@+........@%*;>(3gsyDDywsnmhhgntxEMQRRRRRRRQOLECxtiba3(:=&$@++.....++@$)2kzIRSSSSRRRRQOOOOQQQOOMLGysh93:-*&%$$$%%&&&********&*****=-;>>>///^^^^^^[3gjtyDCGGEGGDysg9[[///////////[39gtCEJLLMMMMMMMMOQRRRRRSSSSSSQMAx",
+"(//^^^^]]]]]^^/>=&$+.......+@$%*=::bbbcb::-~&$@+.......@%*->(3gsyyyBsnhdddgiyELOQRRRRRRRQMJCxtljba3(:-*%$@+++++@@%&~1kAIRSSSSSRRQQOOOQQRRRQQOMLCyia:;~*&%%%%%&&**=====********==-;>>>//^^^]]]^[3antyDCGEEGGDysd9[[[[[[[[///[[69gtCJMOOOQOOOOMOOQRRRRRSSSSSSRIAki",
+"//^^^^^]]]]]^/>-*%@+......+@$&~->((33aa3(:-=*%@+.......+$&=;(3gsyywsnhd09djtCJMOQRRRRRRROMExtiija33(>-~&%%$$$$%&*=-:lAIRRSSSRRRQOMMOQQRRRRRRQOMExia:-~*&&&&&&**=--;;;;;---====--;;>>/^^^]]]]]_^[9nsyDGGEEEGDwnd6[[[[[[[[[[[669gsDEMOQQRQQQQOOOQQRRRRSSSSSNNIzkca",
+"///^^^^^]]^^^/>-*%@+......+$&=;>(((333((>;-=&%@+.......+$&*->3aitssnhd069diyELOQRRRRRRRQOLExtija93((>;-=*&&&**=-;>(cxFORRRRRRQOOMMMOQQRRRRRRQQMExib:-=**&***==-;;>>>>>>>>>>;;;;>>>//^^]]]]]]]_^[9nsyCGGEEGCysg9[[[[[[6660600dgsyELOQRRRRRQQQQQQRRRRSSSSSPPHzo1b3",
+"//////^^^^^^//>-*%@+.....+@%~;>(/////((;-=~*&%@+.......+@%*-:(aninnd06669gtCJMOQRRRRRRRQOLCytjga33(/(>>;;--;;>>//3bxFOQRRRRQQOMFFFMOQRRRRRRRQOFCtc::-=~****=--;>>>>///////////////^^]]]]]]]]]__[9gsyCGGEGCytnd6[[[[60dfdhhdhmsyGLOQRRRRRRRQQQQRRRRRSSSNPKKv7|1::",
+"(///////[[[[(/(;=&%@+...+@%*->((/[///(;-**&&%$@+.......+@%*=;:agggd06[[39gtCLMOQRRRRRRQOMEDtiga33(/////>>>>/////3bxEMOQRRQQOMFECEFLOQQRRRRROMFAklc:-=~*****=-;>>>///^^^^^^^^^^^^^^]]]]]]]]]]]]^[9gsyCCGGCDtsd96[[[60dhmrrmmruwDJOQRRRRRRRRQQQQRRRRSSSNPKq54'!{~-",
+">((((33aabbbaa3::~&$@+++@$&=:(333[[/(>-*&%%%$$@++......+@%*=;(aagdd3[[[39gtCLMOQQRRRRRQOLCyiga33[////////^^^^^[3btEFOQQQQOMFAxttxCFMOQQOOOIFAolc<<<~~*&&&**=-;>>//^^^]]]]]]]]]]]]]]]]]]]]]]]]]^[3gsyDCCCDtsgd06[660dmuwwwuwwBDGLOQRRRRRRRQQQQRRRRSSNPKqq5,,'+$&~",
+":::abblxCCACxtib:<{%$@@@%*=:33aad333(:=&%$$$$$@@++.....+@%*=;:3ada33(/(39jtCJMMOQQRRQQOLGysga93[///^^^^^^^]^^[3btCFMOOOOMFAxijjjtxEFMMMIFAokk211~~~{&%%%%&**-;>/^^^^___]]]]]]_________]]]]]]]]^^[ajtyDyytsgd906600dnuwBBBBwByDJMQRRRRRRRRQQQQQRRRSNNHq5,,##.+@%&",
+"<ccltCFMMOOMMExic1{)$$%&~-:abnjijga3(:~&%$$$%%$$@+++..+@$%*=;::aaa3((((39jtCEJLMOQQQQOLEDsg93[[/^^^^^^^]]]]^[3gtCEMMMMMFExlja99ajtxCAAAoo||22{{{{{&%%$$$%&*=;>//^^______]]]]]__[[[[[^^_]]]]]^^^^[9gjtttsngd99000dhnuBDDDDBBBDGLOQRRRRRRQQQOOQQQRRNHv5,,### ..+$%",
+"<clxEMOQQRRQOMEyi1{))%{=::aityxxttja::={%%%%&&&&%$@++++@%&*=-:::a:3((((39gsyDGJLMOOOOLEDsg9[[^^^^^^^]]]]]_^[3gtCELMMFFECxja99999ajjlll22|{))))))))%$$$$%%&~;>//^_______]]]]]__[39999[[^_]]^^^^^^[3dgnnggd990090dhnsBDDDDDDBDDJMOQRRRRRQQOOMMOOQOOIv4,###   ..+$%",
+"clxEMOQRRRRRROJx22{)&*=:agtxCCECCxtja:=~&&&&*****&%$@@@$%&*~=<<:::((((33dgityDGJLLLLLGDsg9[[^^^^^^^]]]]]_^[9gtCEJFFFECxtja9936639aaab<1{{))))))))))%%%%&*=;>//^_________]]]__[9ajjjg93[^^^^^^^^^/[39dd99666609dhnswBDGGGDDDDGJMOQQRRRQOMLLLLMMMMzp4'##     ..+$%",
+"clxEMQRRRSSRROzo||){{=:agtCEJLLJECxlb::==~~=--;;;-=*&&%&&*~~~<<<:::(((33dgnstyyCGEEGCynd6[[^^^^]]]]]]]__^[3gtxEEEEACxtjga9996663333(::=~~{{{{{{{{{{{{*~=;>(//____}______]]__[6ajttttj9[[^^^^^^^^/[[6366[[[[660dgnsBDDGGGDDDDGLMQQQQQQOMLEGCCCECoo7'##      ..+$%",
+"ackEMQRRSSSRRIzo2{{{~::gtCELMMMLLECtb::;--;;;>>>>>>;-=~~~~~~~~1<<::((333dggnnswyDDDysnd6[[___]]]]]]]___[[3aitCAACxtljbaa9999996[[[(/(>>;;---<<<::<:-:::((/[[}}}}}}_____]_]__[9nsyyytja3[^^^^^^^^/[[[[[[[[[[60dhnuwBBDGGGDDDCGLMOQQQQOLECyttttll2)!'.       ..@$&",
+"3alAMQRRRRRRIzo22{{~::btCJLMMMMMLECtb:::>>>>>////^//>>;;--=~~~11<::33339dghggnsswwsng96[____]]]]_____[[[3ajtxxCxklcbaa9dddddd006[[///////((333aa93333333[[}}}}}}}}_____]]__[[djtyyysnd6[^^^^^^^^^[[[[[[[[[[60dhnuuwBDDDDDDDGJLMOQQOMLGDsjgaac1{)++..      ...@%&",
+"(3jxFOQRRRROIAk2~~<::btCJMMOOMMMMEClc:(>>>////^^^^^^///>>;-=~~11<::33399dddhhgnnsnng96[[^___]]___^[[[[69agittkkllcbaaaddhhhhhd06[[^^^^^[[[69dddhddd00066666}}}}}}}____]]]__[6dnswwsnh9[[^^^^^^^^[[[[[[[[[[[60dhmuuwBBBDDDDDGJLMOOOMLGyja93(:~{!@+..       ..+@%*",
+"/3atEMOQQOOFAk1<<::abtCJMOOOOOMMLExlb:(((////^^^]]]^^^///>:-<111cba3999ddddhhhnnngg96[[________[[[699dgggjiiliccc:aadddhmmnmhd0[[[[[_[}[660dhmmmmhhfee0008888}}}}____]]]]__[6dgnnngd06[__]^^^^^^[[[[[[[[[[60dhmrruuuwwBByyDGJLMMMMLGyja3((-*%$++..        ..+@&=",
+"/(3jxJMMMMExlc::((3aiCJMOOOOOOMMFExia:(((///^^^^]]]__^^//((:<<<cbaaddddddhhhgnnnngd96[[______[[69dnnjjiijjcccc<<::addhmmrrrmhd0[[}___[}60dhmmuuurmhfeee8888888}}____]]]]]__[60dhhdd06[___]]]^^^[[66[[[[[[[60dhmrrrruuuuuwwyCELLMLJGysa3((-*%@+....        ..+$&-",
+"//39ixEEAxtca3((33diyEMOQQQOOOMMJCtb:(((////^^^]]]]___^^//((:<ccbggggggnnnsssssssnd06[[[___}[60gntyyyttijcbc<:::a9ddhmrrrrmhf06}}}__}}60ffmuuuuurmheeee888888}}}___]]]]]]__}60000066}____]]]^^[[600666[[[60fhmrrrrrrmmmmrsyCELLLLGDsg9[/;~%@+...         ...@&=;",
+"^/[3ajltiba33(/[39gyGLOQQQQQOMMLExib:(((////^^^]]]_____^^/((::bbcnnsssstyyyDDDyysngd006}}}}}0dgsyCCCCxticb<::::30dhhmrrrrmhf06}}__}}}600dhmuuwuurmheee888888}}}____]]]]]____}66066}}____]]]]^^[60ddd066600fhmuuurrmmhhfhhswCELLLEDtg93/(-&$@+..         ...@%*;>",
+"^^[[[999933[/[[[6dsDLOQQRQQQOMLJCtja3((/////^^^]]]_____^^[(((:abnitwyyDCGEJJJJGDysnhdf006600dmsyCGEECylcc:::::300fhmrrrrmhe06}}___}}}60fhmuuwwurmhfee088888}}}____]]]]]]____}}}}}}}____]]]]]^[60dhhdd0000dhrswwurmheee0ddntDGJJECyja3[/>-&$@+...      ...+@%*;(/",
+"^^^[[[[[[[^^^[[6dnyJMQQRRRQQOMLExlba3((////^^^^]]]]]]__^^[/(33agisyyDGEJLLMMMMLGDwsnhhfffefhmsyCGEECxlcb:::(3300femmrrmmhe06}}_____}}60fhmuuwuurmfee00086}}}}}___]]]]]]]____}}}}}}_____]]]]_^[0dhmmhdd0ddhnwBBwwrmhe0000dntCGJJEDtj93[/>-&$@+..... .....+@&=>//[",
+"[^^^^[[[_^^___}0hBGMQQRRRRQQOMLExib33(////^^^^]]]]]]]__^^[/(3aansyDCGJLLMOOOOOMJCywurrmmhhhhnsyDCCCxlca::(33660eemmmrmmhe06}_______}}60fhmuuuurmhf000666}}}}}____]]]]]]]____}}}}}______]]]__[60hmmmmhdddhuwyDyBumhe06660dntCEJEGytg93[//;*&@++........+@$*->/[[[",
+"[[[^^^_______}6duDLOQRRRRRQQOMJCtja3(////^^^^]]]_]]]]___^//(3agsyDCGJLLMOOQQQOMLGDBwwwurrmmmnswyyytiba33336660eemmrrrmme06}}________}}0dhmuuuurhd00666}}}}}}____]]]]]]]]___}}}}}_______]___[[6dhmmmmhhhmuwyDDDBumf06}}60dsyGEJECytg93[//>;*%$@+++++++@@%*;(/[[66",
+"[[[/^^______}6fmBJOQRRRRRRQOMLGxia3((///^^^^^_____]]]___^^/(3aitDGJJJLLMOOQQQOMLGDDyyBwwuurmniiiicba:33336660eemmrrrrmhf06}_________}}0fhmuuuumhf0066}}}}}}____]]]]]]]]____}}}}____________[}0fhmmmmmmnuwDCGGDBrh06}}[69gtCEJJECytg93[[//>;*&%$@@@@@@$&*;>/[[666",
+"(////^___}}}60hwGLQRRRRRRRQOLECtg93(///^^^^^_____]]]]]]]^^/(3atDGJJLLLLMOOQQQOMLGGCDDDDBwunnggaaa::(((3[[660eemruuwuumhf06}_________}}00hhnrrnhd006}}}}}}}_____]]]]]]]_____}}}}__________[[[60fhmmmmmnsyDGJJGDwnd6}}_[69jyCEJJECytja9[[^^/>;=&&%$@@$$&*;>//[6666",
+"(((/[[}}}}60fmuDLOQRRRRRRQOLECtg93(///^^^^^______]]]]]]]^^/(3btCJLLLLLLMOOQQQOMJJGGGGGDDBwngaa::::((([[[660efmrwBBBBwrh06[[________}}60dhhnnnhd0066}}}}}}}____]]]]]]]]____}}}}}_______^[[[[600fhmmmmrswDELLLJDwh06}_[[6atxEEJEECytjg9[[^^//>-*&%%$$$%*=>///[6663",
+":>((/[[600dhuwDJOQRRRRRRQOMJDtg93(/////^^^]______]]]]]]]^^//3cxGJLLLLLLLMOOOOMLJJGGJJGGDysic:::::((([[[660ehmuwBDDDywnh06[[________}}60dhhnnhhd0666}}}}}}}____]]]]]]]____}}}}}}}____[[[[[6600fhhmmruswDELMMLJCsh0[[^[[3gtCEEEEGCxttga9[[^//>;*&%$$$%&*;>/^/[[333",
+";;>([66dhnwyDJLOQRRRRRRRQOLCtn93(//////^^^]_____]]]]]]]]^///3bxGJLLLLLLLMOOOOMJJGGGJJGGDBic<<:::((([[[60efhruBDGGGDysnd6[[[________}[60ddhhhhd0066}}}}}}}_____]]]]]]____}}}}}}}}}_}[[[6999ddhhhmruuwBDELMOOMLGwg0[[^[[9jtCEEEEECCxtjg9[[///;=*%$$$$%&=>//^[[[[((",
+";>(/[6dnwDGLMOQQRRRRRRRRQMJDjd3[///////^^^]]____]]]]]]]^^//((bxGJLLLLLLLMMOMMLJGCCGGGGDysic<:::((/[[660fhmuwDDGJJGDysg9[[[_________}}60ddhhhdd0666}}}}}}}____]]]]]]____}}}}}}}}}}}6699ggnnnsssswwwyyDELOOQQOMEyn9[[[[39jtxCCCCCCCxtsg93[(/>-*%$@@@$&*->/^^^[///(",
+">///6dnyGLOQQRRRRRRRRRRRQMEyg93(/((/////^^]_____]]]]]]]^^//((cxELLLLLLLMMOOMLJGDDDDDDDytic<::>(//[[60fhmuwBDGJJJJGysg9[[[__________}}00ddhhdd006666}}}}}}____]]]]]____}}}}}}}}}}6609gnstyyDDDCDDDCGEJLOQQQQQOLDsd3[[[3ajtxxCCCCCCxyig93((>-*%$@@@$%&=>/^^^^^^///",
+"///[0myJMQRRRRRRRRRRRRRRQLGtg3(/(>>////^^^]_____]]]]]]^^//>>:lxJLMMMMMMMOOOMJGDwssswtttic<::((/[[[6dhmuwBDGJJLLJGDwn9[[[__________}}600dhhhdd00066666}}}}____]]]]____}}}}}}}}}}609dnstDCEJJLLLLLLLLMMOQQRRRQOMGtg93339ajittxxxCCCxtib33(;=*%$@@@@$&=;>/^^^^^^^//",
+"^^[6hwJMQRRRRRRRRRRRRRRQQMCta3(((>(////^^]_______]]]]]^^/>>>:lCLMOOMOOOOOOOLGDtingniiiicc::((/[[60dhuwBDGGJJLLJGCynd6[[___________}}60ffhhfdf00006666}}}_____]]]]____}}}}}}}}6600dnsyCELMMOOOOOOOOOOQQRRRRRRQMJyia93399gjjiltxxCxysja::-~&%$@@@@$&*;>/^^^^^^^^^^",
+"^^[dsGMQRRRRRRRRRRRRRRRQOLCta3((((///^^^__________]]]]^//>;:bkEMOOOOOOQQQOMJCticaaacciccb:3([[[60hnwyDGJJLLLLJGDysd6[[______]____}}60fdhhhfff00000088}}}_____]]]____}}}}}}}66600dnsyCJMMOQQQRQQQQQQQQRRRRRRRQMJxia999999aaajityyytib:<~{%%@@@@@$&*;>/^^^^^^^^^^^",
+"_[6nCMQRRRRRRRRRRRRRRRRQOLCtb93((((//^^____________]]]^/>;;-ckFMOOOQQQQQQOMExl1<:::ccccba336[60dhsyCJJLLLLLLJGDysg9[[____________}}60ffhhhfffe0000086}}______]]______}}}}}6000dhnsyCJMOQQRRRRRRRRRRRRRRRRRRRQMExja933333339ajistiib<<~{%$@@@@@$&*;>/^^^^^^^^^]]]",
+"[[gCLQRRRRRRRSSSSRRRRRRQMExtga99333[[[[____}}______]]^^/>;-<1kFMOOOQQQQQOOFAk21<<::acccgad9099hnwDGLMOOOMMLJGDBwnd0[[___________}}60efhhhhffee008086}}_____]]]_______}}}6600dhnstyCJMOQQRRRRRRRRRRRRRRRRRRRQOLCta93333[[3333abjjbb<1{)$@@@@@@$&*->/^^^^^^^^^^]]]",
+"[gyLQRRRRRRSSSSSSRRRRRQOLExtjbggggad966[}}}}}}_____]]^^/;-==1kEMMOOOOQQOOMzo211<:::aagggggddhnsyCJMOOQQOOMLJGDwuhd6[[__________}}}00ehhhhhfeee0806}}}}__^^^]]]]______}}600dhnssyDEJMOQQRRRRRRRRRRRRRRRRRRRROMEtb933(///////3333a:<~{!@@+++@@$&*->/^^^^^^//^^^]]]",
+"atEORRRSRRSSSSSRRRSRRRQMJCytiiitstsjndd0066}}}______]^//;-==<kCFLMMOOOOMLEok21<<:::adgnnnggnstDGLMOQQQQQOOLJDBunhd06[[________}}}88ehhhhhefee0066}}}[^^^^^^^^^]]____}[60dhgnsyDGJLMOQQRRRRRRRRRRRRRRRRRRRQOMEtj93((/(//////((((:<~)!@++++@@$%*->//^^^^/////^^]]]",
+"jCMQRRSRRSSSSRRRRSRRRQOLExttittyyDDytsnhdd006}_____]]^//>-==<lxGJLLLMMMLEok11<<::(3ddhnnnnswyDELMOQQRRQQOOLJDywnnd066[}_____}}}}88eeehhheee006}}}[[/////>////^^^^^[[[60dgnstyCELMOQQRRRRRSRSRRRRRRQQQQQOOMFCtba3((((>>(//////(:={)@++..++@$%*->>/^^^//>>>//^^]]]",
+"xJORRRSRSSSRRRRRRRRRQOMExttistyDCCCCCyyssnhd06}____]^^//>;-<<itDGGEJJJECxk11<-::(330dhhnuswyDGLMOQQRRRRQQOLJDysnndd066[[[}}}}}}}88eeeeefe066[[[[////>>>;;>>///^^^[[[9dgnstyDCELMOQRRRSSSSSSSRRRRRRQQOMMLJCxlba::::::;>>(////(>-*%@++..++@$%*->>//^///>>>>>/^]]]^",
+"CMQRRSRRRRRRRRRRRRRQOMExtjnnistyDCGGGCDyywshd6[___^^^///>;-<<clyDDCCCCxyl11<=;:((360ddhmnsyDGJLOQQRRRRRQQOLGDysnngd9066[[}}}}}}8888eeee066[[[////>>>;;-;;;>///^^[[[9gnsyDCCGJLMOQRRSSSSSSSSSSRRRRQQOMLGCylccc:<<<<<-;;>/////>;~&$++...+@@%*->>//^//>>;--;>/^^]__",
+"EMQRRRRRRRRRRRRRRRQOLEDsnggdgnswyDGGGGGGCDysg06[^^^^^///(>:::cityyDDyytic1<=-;>(/36660dhnsyDGLMOQQRRRRRQQOLGywsnggd9966666}}}}}}8800066[[[////>>>;;----;;>(///^^[[9gstDCGGJLMOQRRSSSSSSSSSSSSRRRRQOMLGDtic<1111111<-->>/////>-*%@++..+@@%*->>/^^//>>-===;>/^]]_[",
+"JMQRRRRRRRRRRRRRRQOMJDtndd0ddhnuwyDCGGGGGCDynd6[^^^^/////(((abittyyyttic<<~=-;>(/[[6600dhnwyGJLMOQRRRRRQOMEDwnnggdd99666666}}}}}}}}}}[[////(>>;;;-----;>>/////[[[6dntyCGJLLMOQRSSSSSSSSSSSSSSRRRRQOMJCyic<1222|221<<:>//////>-*%@++++@$%*->>/^^^//>-***=;>^]]__[",
+"JMQRRRRRRRRRRRRRQQOLGyshd0000ddmmuwyDGGGJECysg9[[^^^/////((3agistwwssic<<~~=->(//[[}}660dhswDGJLOQQRRRQQMLCtngdddd999666666}}}_____[[///>>>>;;;-----;>>/////^/[[[6dnsyCEJLMOQRSSSSSSSSSSSSSSSRRRRQOMJDtic122|oook1<:(///////>-*&$@@@@$%*=>>/^^^//>;=***=;/^]]_^[",
+"JMOQRRRRRRRRRRRQQOMJCwnd0000000fhmrwBDGGJJGDtnd6[[[[[[[[[339agissssincc<~~~=;>(/[[}}}}660dgswyGJMOQRRQQOLCtnd9909999966666[}_____^^//(>>;;;;;;----;;>///^^^^^^[[[0dgsyDGLMOQRSSSNNNSSSSSSSSSSRRRRQOMJDti112|ooooklb((/^^^^//>;-*&%$$%&*->>/^^^^//>-****=>/^]]_[[",
+"ELOQQQRRRRRRRRRQQOLEDtnh00000000fhmuwBDGJJGDynd9[[[[[[66639agiisssinga:<~**=;>//[}}}}}}660dnstDGLMQQQQOLCtg96[[[66366[[[[[[___]^^//>>;------;;;;;>>>//^^^^^^^^[[[60hntyCLMORSSNNNNNSSSSSSSSSRRRRRQOLExli1122kokklca3/^^^^^^//>;-=*&&*=->//^^^^//>;-***=;>/]]__[[",
+"ELMOOQQQQQQQRRQQQOLECtsgdd000000ffhmuwDGGJGDysg99660999ddagjisttsinga:<~{{*-;(/[[}}}}}}}60dhnsyCJMOOOOLCtg9[[[[[[[[[[[[[[[^_^^^^/>;;-=***=-;;>>>>///^^^]]]__^_}}}60dgsyGLOQSSNNNNNNSSSSSSSSRRRRRRQOLCxlcc<1lllllba3[^^^_^^^^///>;;---;>//^^^^^//>;-==-;>/^]]__[6",
+"CELLMMMMOOQQQRQQQOLECysngddddddddfhmuwDDGGGDysngdgggnnnnniistyytsngaa:~{&{~->//}}}}}}}}}00dhnwyCELMMMFAtb3((////[[[[[[[[/^^^///>;-=******=;;>>///^^^^]]]_____}}}}60dgsyEMOSNNNNNNNSSSSSSSRRRRRRRQOLExlibbbbbccbb93[[^___]^^^^^////>>>//^^^^[[[//>;;;;>>/^]]___[6",
+"DGJJJJJLLOOQQQQQQOLJGDtsnngnnnnnnnmuuwyDGGGDyssnnsswttttttyxCCCxtiga:<{%%&~;(/[}}}}}}}}60fhnswyCELLMFAxl::>>>>>(((((((/////>>>;-=*&&&&**=;>///^^^^^]]_____}[[}}6600hsyCLOQSNNNNNNSSSSSSSRRRRRRQOMLECticbaaaaaa933[[[^____]]^^^^^^^///^^^[[[[[[/(>>>>>//^]]]___}6",
+"yDDGGGGJLMOQQQQQOMLJGCytsssstyyywwwwwyDDGGCDyywwyyDDCDCDDCCEEEECxtcb<{)%%&~;(/}}}}}}}}800fmuBDCEJLLLFAk1<--------;:::::::;;;-==**&&&&**->>//^^^^]]]___^[[[6600000dhnyCLMORSNNNNNSSSSSRRRRRRRQOOLJGxxtijgaa99933[[[[[____________]]^^^^[[60dd063(((>//^^]]]____}6",
+"wByDDDDGJLOOQQQOOMLJGCytstyDGGGGCDyyyyDDGGCDDyyDDGEEEEGGGGELLMLJCxic~))$%&=>/[}}}}}88880ehuBDGJLMMMMFAk11=========<<<<--======******=-;>//^^_________[[[09dhhhhhhnsyGLMORSSSSNSSSSSRRRRQQQOOMLECDxytttsigga993[[[[[_________________[[0dgusnnd3((///^^]]]_____}6",
+"uwwBBBDDGLMOOOOMLLJEGCyttyCELLLLJEGDDDDDCCDDDDDCGJLLLJEGGEJLMMMMJCk1{)!$%{->/[}}}8888880fmwDGLLMOOOOMAok1<======<<<<<<111<<=------;;>(//^^__________[[9answtwwwwwyDGLMOQRRSSSSSSSRRQQQOOMLLECDytttyxDDxytijgd93[[[[[_______________[60hsByDysnd3(//^^]]_______}6",
+"muwwBBDDGJLLMLLLJEGCDyttyCELMOOMLLJGCDDDCDDDDDGGJLLLLJEGGGJMMOOOLAk2|!!!%*;(/[}}6688880efuyGLMOQQQQOOFAkc<<::::::<c111l111<::>>>((////^__}}_______[[[9ntDCGEEEGGGJLLOOQQRRRRSRRRRQOMMLJGCDytsiiisyDGEEGCCytjga996[[[[___[[[[[[}}_}}6dmwDGJGCysg33/^^]_________}}",
+"mruuwBBDDGJJJGGCCDDyysssyCJMOOOOMLJGCDDCDGGGGGGJLLLLLJGCCCELMOOOMFo|!!!!)~;([[}}68888800hsDJMOQQRRRROOFCtca3333aacitkxCCxkiba33[[[[[}}}}}}}______[[6ajxGLLMOOOMMMOOOQQQQQQRRQQQOMMFECxtsnnggagjiyCELLMLLECytsngd99[[[[[[[[66666}}}6dmwDJLLLECtg93[^^__________}}",
+"hmruuwBBDDDDDDBBwwwssnnstCLMOOOOMLEGCDDCGGGGGGJJLLLLJGDyyDCLMOQOOFA77!!!&=>([[}688866660hwCLOQQRRRRRROMJCwngdddgitxCEFFFECxig966[[}}}}}}}}}}____[[3ajxEMOQQQQQQQQQQQQQQQQQQQOMMLECxtiga993399gixGFMOOOOMLJGCytjng9966[6660dddd0000fhuDJLMMLJCtg93[^^___________}",
+"fhrruuwBBBBBwwuuumnnhhhnwCJMOOMMLEGCDDDCGGGGGJJJLLLJGDywttCEMOOOOIzp7!!){<((66600086}}60hyGLOQRRRRRRRROMJDysnnnswyGJLMMMLECtnd0066}}}}}}}}}}}__[[3aixEMOQRRRRRRRRRRRRQQQQOOMLLGCytjg93[[[[[3aixEMOQQQQOOMLJECytsjgd9999ddgnnnmhdfdhuyGLOOOMJDla3[^^____________}",
+"fhmrruwwBBBwuummhhhhddhnsyGLLLLJECyyyyDDGGGGGJJJJJJGDyssnsyEMOOOOIzp77!)~:(360000006}66dnyJMQQRRRRRRRRQOLGDBwsswyDGLLMMLLGDsgd06666}}}}}}}}}}}}66ajtAFOQRRRRRRRRRRRRRQQQOOMLJCytjg93[[[//[3aiCFOQRRRRQQOOMLJECytsjggdggnswByBwummmuBGLMOOOLExia3[^^_____________",
+"fdhmruwByyBBurmhfff000ddnsyCGGCxytssswyDGGGGGGGJJJJDywnggntCFOOOOIIpp7|21:addhhhhf00660hwCLOQQRRRRRRRRQOLJDBwwuwBDCJLLLJGDwnd006666}}}}}}}}}}}60dgtxEMORSSSRRRRRRRRRRQQQOMLJGysnd9[[////((alCMORRRRRRRQQOMMLJECysjnggnswyDCGDDBwwwBDJMOQQOLGtg33^^_________]]___",
+"0fhruByDGGDDwumhd0006600dgnstssnnggnswyDGGGGGGGGGGDDwngddgtCJMOOOIIvpp721innssuurmhd00hsDJOQQRRRRRRRRRQOLJDBwuuuuwyDGEEGDwnh00066888}}}}}}}}6600gjxCFINNSSSSRRRRRRRRRQQOOMLGDynd93(/(>>::blAIRSSSSRRRRQOOMMFJECytsnnnstDCEJJJJGDDDGJMOQQQOLCta3[^^______]]]]]^^^",
+"fhmuyDGJLLJGDwnhd066[[[[6699999999dgnsyDGGGDDDDDDDywuhd99aixEMOOIIIzppookyyDDDDDyysnnnsyEMQQRRRRRRRRRRQOLGDwurmmmuwyDDDDysnd000066888888888800dhntxEFINNNSSSSRRRRRRRQQQOOMLGDsgd3((:--=<<kAINSSSSSRRRRQOOMFFJECxtsnnswyCELLLLLJJGJLMOQQRQOLCia3[^^______]]]^^^//",
+"hnwDGLMOOMLJCyuhd06[[[[[[[[[[[[[[69dnsyDDDDDBBBBBBurhd0669gtAFIIIIIzzzAAEEJJLLLLJGCyyyDEMOQQRRRRRRRRRQOMJCyumhhfhmnwyDDywsndd000008888888800edhnsxCEIINNNNNRRRRRRRQQQQQOOLJGysg3(:-=~{~2|AINSSSSSSRRRROOIFFFFECysjnnsyDGLLMMMMMLLLMOQRRRQOMCia3/^^____]]]^^/////",
+"nwDJLOQQQOMLGysh06[[^^^^______[[[69dnsBDDDBBwuuuuumh06[[[3alCFFIIzzzzzFFLMOOOQQQOMLJEELMOQRRRRRRRRRRQQOLGDwuhffffhnwyDDDywshddf0000880008eeffhnsyDCFMINNNNOOOOOOQQQQQQOOMLJCtia::=~{{{|ozHNSSSSSSSRRRQOMFFFFEECysjnnsyCELLMMOMMMMMOQRRRRRQMAla3/^^^^]]]^^/>>;>>(",
+"yCJMQQRRQQOLGysh06[[^^^^_______[[60dnswyBBwurmmhhd006[[^/(3btCAzzzzAAzFMOORRRRRRRQOMMMMOQRRRRRRRRRRRQOMJDBumhfffdhsyCGGGCDtsnhd006686000effhmuwyDCJLMOOOOOMLLLLLMMOOOOMMLJCyib::<~{{||pzHNNSSSSSSSRRROMFAzAFEECxtsnswyCJLLMMMMMMMOQQRRRRRQOEtb3(//^^^^^//>;==-:(",
+"GLOQRRRRRQOLGysh06[^^^^^_^[[[[[[600hnuuwwwumhff0066}___^//(aikooooooAEFOQRRRRRRRRRQQOOQQQRRRRRRRRRQQQOMJDBumhffdhnyCEJJJGCysndd066[[[6660fhmuwyCGJLMMOOOMFJGCCCGJJLLLLLLECxiba:<~~{||pzHNSSSSSSSSSRRQOFAAAAAEECCtssstyGEJLLLMMMMMOQQRRRRRRQMCia3(//////>;=*&*=::",
+"MOQRRRRRRQMJDwnd0[[^^^^^[[3999990dhhmuuuurmhf006}}____]^//(:<1lkookkAFFORRRRSRRRRRRQQQQQRRRRRRRQRRQQQOLGDwumhdffmsyGJLLJECysgd333(//((336ddmsyCGJLMMMOMMFECxywwyyDCGGGGCxtja::<<~22ozINNSSSSSSSSSRRRQMFAooAFFFECytssyDCGJJJJLLLLLOQQRRRRRRQOFxc::((>>>;-*&%%%~<c",
+"OQRRRRRRQOLGysh06[[[[/[39gjjjjnnnnnmmrrmmhff06}}_____]]^/>>:<11222kkxEMORRRSRSSRRRRRQQQRRRRRRQQQQQQQQOLJDwumhddhnsDGJJEECxlca::::;;;;::((3aiwDELLMMOMMLLEDywsnnnstwyyyttjaa3::<<12ozIONSSSSSSSSSSSRROFAoooAFFFJExtttyDDGGGGGGGGJLMOQRRRRRRRQMAk1<::>;;=&%$@@${1k",
+"QRRRRRRQOMGysg96[[[//[3btxCEECDywwuurrmmhee0}}_____]]]]^/>;--<1111llxAMORRRSSSSRRRRRRRRRRRRRQQQQQQQQQOLJDwumhfddgsyDCCDxlcc<<==~******~=<:ciDELMOOOOMMLJCywsnhdddgggggga33(:--<11kAINSSSSSSSSSSSRRRQOEoooozFMMMJCyttyyDDDDDDDDDGJLOQRRRRRRRROFAk1<:--~&%$@@@${2o",
+"OQQRRRQOLCtng96[[[//(3bxELMMMLJGDywuummhe00}}____]]]]]]^/>;--=<111clkAFOQRRSRSSRRRRRRRRRRRRRQQQQQQQQOOLGDwnhdddddgistiicb<<~~*&&&%%%%&{~<<iyELMOOOOOMLJGDysmdd903399933((>;--=<1kAIORSSSSSSSSSSSRRRQMAooopzIOOMLECyyyyyyBBwwwwBBDJMQRRRRRRRRROFok1<==*&$@++@!{2o",
+"MOOOOOFExig96[[[///(3btFMQQQQOMLGDBwurhee0}}_____]]]]]^//>;;--<<<<cclCFOQRRRRRRRRRRRRRRRRRRQQQOOOQQQOMJCyshd06669aaaaa:::-=~**&&&&&&&*~~<1kALOOQQQOMLLGDBumhd0333((((((>;--==<1kAIORSSSSSSSSSRRSRRROFoo7pzIIOOOMJCyytyBBwwuuruuwBGLORRRRRRRRROMAk1<~*&%@@++@!{2k",
+"JEEEACklba3(//^^///(3lEMQRRRRQOLJDBwrmhe0}}_____]]]]]]^//>;;::<<::bclxEMQRRRRRRRRRRQQQQQRRQQQQOOOOOOMLGysgd063[((3333((>>;---==****==-;:clCLOQQQQQOMLJCysnhd633((/(((>>;-===<1kAIORRSSSSSSSSSRRSSRROzp77pvINRQOMLEyttssuurmmmmrrwDJOQRRRRRRRROLCk11{&%$@+++@${1l",
+"tttlicb::((////////(axFQRRRRRQOLJDBurme06}_____]]]]]]^^/>>::::::::bbjtAFOQRRRRRRRRQQQQQQQQQQOOMMMMLLJCysh96[[//(((((/////>>>>>>>>>>>((3alCLOQQQQQOMLJCysnhd66[///(((>;-=~~~11kAIORRRSSSSSSRSSRSSSSRIzpppvHNNRQQMLCyssnnnmhheeehmrBGMQRRRRRRRQMJCk1{)!@+++.++${1c",
+"icga::::>>(////////(axMQRRRRRQOLGDwumhe0}}_____]]]]]]^//>:::bbbb:::bblxEMOQRRRRRQQQOOQQQQQOOMLLJGGCCxtia93[///(((///////////^^^^^^^^/[9iCLOQQQQQOMLEDBsmd06[[///((((:-=~~~1koFOQRRRSSSSSSSSSSSSSSSSIzppvHHNRRQOMFCtjgdddffeeeeeehuDLOQRRRRRQOLGk22)@++....++$)~<",
+"caa:((>>>(//^^^^^^/[gxMQRRRRRQOLGBwrmee6}_____]]]]]]^^/>::ccllccb:::bclCFOQQRRRQQQOOOOOOOOMLJGCyttsijga3[/////((///^^^^^^^^^__]]]__^[9nyJMOQQQQOMLGDwnh006[[[//((((::<1122oAIORRSSSSSSSSSSSSSSSSSSSNHvvvHNSRRQOMExjg990000088880fmyJOQRRRRQOLCy12)@+.......+$)~<",
+"ica3((((//^^^^^^^^^[gyMQRRRRRQMJDBurme86}______]]]]]^/(>:clkkklc<<:::bixEMOQQRQQQOMMMMMMMLJGDtiggdd9933//////>>///^^_______________[6gtGLOQQQOOLJCysg006[[[[[/((3abc112oozIIRSSSSSSSSSSSSSSSSSSSSSNNHHHHNNSRRQOLCtg96[[[}}}}}}660hBGMOQQQOMJDtc1)@+.......++${11",
+"tiga3(///^^^]]]]__[6gyLOQRRRQOLJDwumhe06}______]]]]]^/>:<koAAxkl<<<<::blCFOQQQQQOMLJJJJJJGCtigd96[[[[[///////////^________________[[9sCJMOOOOMLGysgd06[[[[^^[[3abclkoAzIIINSSSSSSSSSSSSSSSSSSSSSSSNNHHHNNSSRRQMEyj93[[[______}}}6dsCLMOOMJCtib<~)@+......++@)22k",
+"Cxlb93[[^^^_______}6dwEMQQQQQMLGBwrmhe06}______]]]]^//:<lozFFAkl11~~<:bjxEMOQQQOMLECCCCCDysgd0[[[[[[[[[^^^^/////^^________________[9ntGLMOOMLJDwnd6[[[_[^^^[333blkAAIINNNNSSSSSSSSSSSSSSSSSSSSSSSSNNHNNNSSSRROMCta3[[^^_________}0nyGJLJGDsg::=*%$@++..++@$){2oA",
+"JAxja3[[^^________}6dsDLOQQOOLJDBurmhe06}_______]]]^/>:1kzIIIzo22{{~=<:clALOOOOMLGxtttsssng96[[[[_^^_^^^^^^^///^^_________________[9jyELMMLJGysd0[[____^^^[[33blxAFIQNSSSSSSSSSSSSSSSSSSSSSSSSSSSSQNNNNSSSRRQOFxj9[[^^^^^_______}0hsyCCDtna::;-=*&$@@++@@$){2oFM",
+"MExta93[[[[[[[___}}6fnyGLMOMLJDBwurmee06}}______]]^//:<2ozIIIzoo|)){~<:bjxEMMMMLEytjngggd90[[[___________]^^^^^^^_____________]__[6gtCELLLEDwnd6[_____^^^[[33blxFMORSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRONNNSSSSRRQMEta3[^^^^^^^^]]]___[0gsssiga::;;;;-=*&%$$$%&~2oFIO",
+"MFCtb93[[[[[[[}}}}}6fhuDJJLJGDBBurmmhe06}}______]^^/>:1ozIIHHIp7|)){~-::blxEFLECxtja999066[[[_____________]^^^^^]___________]]]__[9jyCEJJGDwnd6[^^^^^^^^^[33ajxAMORSSSSSSSSSSSSSSSSSSSSSSSSSSSSRROOOQSSSSRRRQMCl9[^^^//////^^^]]_[[9daaa::;;;>>>>>;-**&&&~1kAIOQ",
+"MECla3[[[[[[[[[}}}}60hrBDGGGDBwurrmhe006}}}}____^^/>:<2oIHNNHHv77!){~-((3aixCCCtjg99666[[[}}}}}}__________]^^^^]]__________]]]]_[3gtCEEEGCynd0[^^^^^^^^^[339blCFORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSROOOORRSSRRRQOFxj3[^^//>>>>>//^^^^^/[3(::---;>>/////>;=**~=1kFOOQ",
+"FEtja3[[[[[[6666}}600fmuBDDBBwurrmhee0066}}}}___^//>:1kzINNNNHv47!){=;(((3ajlttja96[[[[[}}}}}}}6}[}_______^^^^^^]_________]]]]__[9jxEJJJCDsg96[/////////[33ajxEORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOOMOQRRRRRRQMEta[[^^/>;;--;>>//////>;;-==~=;>/^^^^//>-=*~~1oFOOO",
+"Axja3[[[[[66666666600emruwwuurrmmeee0066666}}__^^/(>:lAINNNNNHvv7!{~->//^[39aga99[[[}_[_[_}[6660666[[____^^^^^^^]]]_______]]]__[9jyEJLJECyia3(((>>>>(//((3abtAMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQOOOOQRRRRRQMJxj9[^^//>;=**=-;>>>>>;-=*****-;>/^]]]^/>-***~2AFIOO",
+"tja3[[[[[399900666000ehmruurrmmheee006666666}}_^^//(bkFNNSNNNPHv7){=>//^^[[[366[[[[_____[[[660ddd906[[[^^^^^^^^^^]]_______]]__[3gtEJLLLExtja::-====-;>((3ablCFORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQOOOOQQRRQQOLxj9[[_^^/>-=***=-;>>;-**&&&**=;>/^]]]]^/>-*&{{2ozFFF",
+"ba3[/^[[[9dddd000000eehmrrrrmmheee0066666666}}_^^//3cCMRSSSNNPHv7){->/^^^^[[[[[[[_______[[69ddnnngd0[[[[//////^^^^]___________[atCFLMLJCxic<<~{{&{{~=<::bckAFORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRQQOOOOQQQOMLCsa6[__^^/>;=***-;;;;-**&&&&*=->/^]]]]]^/>=*&&{|oAAAA",
+":(////[[9dgggdd0000eeemrrurrmmeee8088666686}}___^/(alFORSSSNNPHv7)~;(/^^____[__________[[[69gnsssng96[[////////^^^^^^^^______[9jxEFLLJCxlc11{)!!!!)){~11koAIORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRQQOOOOOOOMJCtg9[[___]^/>;---;;;;-=*&&&&**-;>/^]]]]]^/>=&%%)||ookk",
+";;>>///39dggghd0000eehruuuuurheee0006666866}}___^/3bxFORSSSSNPKv7|~:(/^^______________[[[39gjsttssga3[(/////////^^^^^[[[____[[alxEEFECkl12{)!!!+'+!!!||ozIINSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQQQOMMLLLEDsg9[____]]]^//>>>>>>;-**&&&**-;>/^]]]]]]^/;*&%$))||221",
+"*~=;>(/3dhhhhdf000eeemuwBBBwrmfee8000666066}}__^^[9lAORSSSSSNPKv72<((/[[____________[[[[39ajjstttsga33(((>>>(////^^^[[[[[___[[ajtxCxxkl22{)!!++''''''4pvHPPNNSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRQQQOLLEGCyjg6[____]]_]^^/////(>;-*&&&**-;>/^]]]]]]]^>-*%$$@!)){{{",
+"$%&~;>(6dhhhdfe000eemrwBDDDBumhffee80800006}}__^[3bxFORSSSSSNPHvo2<33[[[[[_^_______^[[[399gjtttttiga33((>>>>>(////^[333[[[__[[9ajiiic11{{)!!!+''''',45qKKPPPNSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRQOMLGDysn96[[___]]]__^^[[3993(:=*&&**-;>//^]]]]]]^/>=&$@@@@$))$$",
+"@@%&=>(0fffffe0088eemuBDGGDywuhhfeeee800806}}_[[3alAORRSSSSSNNHzolba36[[[[[^^^___^^[[[339aajjtttija93((>:>>>>>(///[33993[[^^^[[33a3:<~{{%)$!@+++'',5qqKKKPPPNSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRRQOLEDwnd9[[___]]]____[[9gistib:=*&&*=;>>/^]]]__]]^/-&$@+++@@@@@@",
+"+@$&=(30fffee8008eemrBDGJJGDwrhffeeeee80806}}[[39jxFORSSSSSSSNHzolca9996[[[^^^^^^^^[[3333aabjjijjba3(::::;;>>>>(/(3aaaa3[[^^^^//(((;-~{&%%$$@++'',5qqKKKKPPPSSSSSSSSSSSSSSSSSSSSSRRRRQQQRRRRRRRRQOLGynd9[[___]]]____[9gsxGEEClc<~**=-;>/^^]]___]^/>*%@++++++++++",
+"+@$&;(600eee80888eemuBGJJJGDwnhdfeeee88008}}}[[3bxFORSSSSSSSSNIFAkiggd996[[^^//^^^^^//(3333aaaabaa:::---;;::>>>>((abjjja3[^^^^^//>>-=*&&&%%$@++',5qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQQQQRRRRRRRRQOJCsg9[[[___]_____69nyELMMLJxl1~~=-;>//^^]___]]^>=&@++.....++..",
+"+@%~:(6608e88888eehrwDGJJJCyshdf0000008086}}}[3alAORRSSSSSSSSROFAxljgg996[[///////^////(((33333:::<=~~~==-;;;;:::aclxtlb93//////(>;-=**&&%%$@@',5qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOQRRRRRRRRQMJDsd9[[^_______}6dsDJMOOOOLCk11=-;>//^^]____]^/;&$++..........",
+"@$&;([668888888eeemuBDGJJGDwnd00000000686}}}[[3jxFQRSSSSRSRRRROFAxtjgd96[[[//>>>//////((((((((:;=~{&&{{~~<<<<-::<lkCCCxib33(////>>;-=**&&%%$!!45qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOQQRRRRRRRRQMEysg9[[[______[6dsDJMOQQQOLGlc<-;>(/^^^_____]^>=%@+...........",
+"$&=>/[68888888eeehmuBDGJGDysh0066}}}}}}}}}}}[6atEORSSSSSSRRRRROLCyigd96[[[//>---;>>>>>>;;;;;;;-~&%$$$$){~11<<<11koAFFFAxia3(((((>>;-=~*&&%)!!45qKKKKPPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOOQRRRRRRRRRQMJDwnd0[[[[_[[60gwCJMOQQQOMJxib::>(//^^______^/;&$+............",
+"&*;/[}6888888eeeehruBDGGDysh066}}}}}}}}}}__[[3jCMQRRSSSRRRRRRROFCtja96[[[^/>-*&**-;;;;-======*&%$@@++@!)|222222oAIIOOOFAtib:((((((>;-=~{{))74vKKKKKPPPPSSSSSSSSSSSSSSSSSSSSSRRRRQOMMOQRRRRRRRRRRQMLGywnh906660dgsyGLMOOQQOMLCtga(((///^^_____^^>=%@+..........++",
+"=;(/}}88888eeeeehmrwBDDDysnd06}}}}}}}}}}___[[atFORRSRSRRRRRRROMExia96[[[^^/>*&%%&&*===**&&&&&%%@@+++++!77ooooopzHNNRROOFClcb:33((((>;=~{{|7vvKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRQMLLMOQRRRRRRRRRRQOMLECywsnggnswDGLMOOQQOOMLGynd3((///[^______^/;&$+.........+++@",
+";(/[}68888eeeeeemmuwyDDysnd06}}}____}}_____[3jCMQRRRSRRRRRRRQOJCtg93[[[__^/-&%$$$%&&&&&%%$$$$$@+++..+''7pppppzHHNNSSRROFAklca333[//(:-~2|pvHKKKKPPPPPSSSSSSSSSSSSSSSSSSSSRRRRQQMLLLOQRRRRRRRRRRRQQOMLLJGCDyyDGJLMOOQQQOOMLGynd6[/////[[_}___^/>*%@+....++++++@@$",
+"(/[[60888eeeeehhmruwyyBsnh06[}_____}}}}___[[9tEORRRRRRRRRRQQOLExia3[[[__^^>=&$@@@$%%%%$@@@@@@+++....''4vvzzzvHHNNSSSSROMExlcaa36[[((:<2|pvKKKPPPPPPPSSSSSSSSSSSSSSSSSSSSSRRRRQOLJJLOQRRRRSSRRRRRRQQQQOOMLLLLLMOQQQQQQOOLJCBnd6[//////[}}____^/-&@+...++@@@@$$$%&",
+"/[660eeeeeehhmmmmruwwwsnh066}_____}}}}}}__[3gxMQRRRRRRRRQQQOMJDib3[[[[^_^/>*%$@@@@$$$$@+++++++......'44vvIIHHHPNSSSSSRQMFxlca96[[[((:1opvKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRRQOLJJJMORRRRRSSRRRRRRRRRQQQQQQQQQQQRRRQQQOLJDwnd6[^^//////[}___^/>*%@+.+++!))%%%&&*=",
+"30dhhhfeefhmmmmmmussssnhd06}}____}}}66}}}[[9tEMQRRRRRRRQOOMMJCtja3[[^^_^^/>*%$@@@@@$@@++...........''4vvIIIHHNNNSSSSSROMAxia93[[[[(3ckpHKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLJGJMQRRRRRSSRRRRRRRRRRRRRRRRRRRRRRRQQOLJDwnd0[[^//>>>///___^^>=&@+++''!||{~***~=;",
+"gnsssurmmmmmrrrmnnnsnngd06}}____}}}60006669jxLQRRRRRRRQOOMLJGDsb3(/^^^_^^/;*&$@@@@@@+++...........+'7pzIIIIIHNNSSSSSRROFCtca3[[[[[3bkzHPKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSSRRRRRQMLGGJLORRRSSSRRRRRRRRRRRRRRRRRRRRRRRRQQMJDBuh0}_^^/>;;;;(//^^^/;*$@++''47po21~~~=-:",
+"wyCCDDywuuuruurnnnnghd066}}}___}}}60df0069gtEOQRRRRRRQOMLLJJCxia3(/^^^^^^/>~&$@@@@+++............+'77pzIIIIIHNNSSSSRRQMExia3[[[[[[alAIHPPPPPPPPSSSSSSSSSSSSSSSSSSSSSSSSRRRRQOMJGCGLMQRRSSSSSSRRRRRRRRRRRRRRRRRRRRQQOLGBuhf6}_^^>;****->>//>;*%@@+''4vpzok1<==-::",
+"CJLLLJDywuuuurnhhddd0066}}____}}}600dddd0djCMQRRRRRRQQMLLLJECyia3(/^^^^^//>=&$@@++++....    ....''77ozFFFFIIINSSSSRRQOLClg9[[^^^[3bxFNPPPPPPPSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLJCDDEMORRSSSSSRRRRRRRRRRRRRRRRRRRRQQOLGDwrh0}}_^/;*&%$%&**==*&%@@++'4vvIIAkl<<<<::",
+"JLMMMLGDwsunnhhdd0066[}}______}}}600dddddnyJOQRRRRRRQOMLLJJGCtib((//^^^[[(:=&$@@+++....     ###''77zzFMMFFIINNSSSSRRQMEyja3[^^_^[9lFINNNPPNSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQOLGDyyxGFORSSSSSSSRRRSRRRRRRRRRRRRRQQOMJDBumf0}_^/>=&$@++@@$%%$@@@+@@7pzIIIAkl1<<:::",
+"JLMMLLGysnnhdd00666[}}________}}}}6000ddntEMQRRRRRRQOMLLJJJGCtc<:>(///[33a:<{$@+++....     ###'44pzFMMMMMFIIRSSSSRRROLCtg33/^^_^[axMRSSSNSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQOLGysiitCFIRSSSSSRRRRSSSRSSSRRRRRRQQOLJGDwume0}[//;*%@+....+++++++@@)|ozIIFAkc<<-:::",
+"CELLJGDtngd00666}}______________}}}6600hsCLORRRRRRRQMLLJJJGCxic<-;>//33bjll2|)!++....     ##,,5vvIIIOOMMMMOORSSSRRRQOLCtb33[[^^[3jAORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLCyigbclkAFIQSSSRSRSSSSSSSSRRRRRQOMLJGDBwumf0}[/>-&@+...........+@${2oAFFAkcb:::>(3",
+"txCCCysnd9666[}}__________________}}}60gtEMQRRRRRRQOMLJEEGCDtic<=->/(3btCAAAo7!''.#     ##,,55vHHNOOOOOOMOORRSSSSRRQOLCtja33[[[3axMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLCwna:<122opzIIQRRSSSSSSSSSRRRQQMLGDDDBBBurhf6[(>=%@+...    ....+@%~<lxxxlcb::>>(/(",
+"gjsssjnd9666}}}}___________________}}6dsCMQRRRRRRQOMLJGGGCDysc<<=->(3atAMMOIzp7'''#######,55qKPNNRRQOOOOOOORRSSSRRRQOMExlcba339jtEORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRQOJDsb::=~{{)||opzIORSSSSSSSRRRQOLGDyyBBBBBwumd63(:~%@+...     ....@%=:bbbba:(>>>////",
+"9ggnnngdd9666}}}}__________________}}6dtJOQRRRRRQQOLJGGCDDyysg:<-;>(3jCLOQQOIIp44'#####,,5qqKPNNSRRQQOOOOOQRRRRRRRRQOLExkklcbjtxEMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRQMJyia::=*&%))))||ozIQSSSSSSRRQMJCtsuuwBBBBBund03(:=&$+...      ...+%=:(((((>>>>//^^^",
+"9dhgnnnnngd00066}}}}__}}}}}}}}}_}}}}60nCLQRRRRRQQOLJGGCDDDywsg::;:((atEMQQRROIzp74'',,,5qqKKPPSSSRRQQOMMOQQRRRRRRRQOMFAoookkkxCFMQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOJCsb:(;=*&%%$$)){2koFIRSSSRRQMFxsnhhnuwBBBBsnhd93:-~%$+...     ...+$*;>>>>;;>>//^^^^",
+"0dhnswyyyysnhff0066}}}66006}}}}}}}}}0dwEMQRRRRQQOMLGGDDDDDyytna::>(3atJOQRRQQOMzpp7445qqKKKPNSSSSRRQOMMMOQQRRRRRRRQOLEAoo7oooAFMOQRRSSSSSSSSSSNNNNNNSSSSSSSSSSSSSSNNNNNNNOMJxib3((>-=*&%%%%{~~1loFIRRRRQOMExjgddhhuwwBwsngdda3:<~%$+..     ...+@&=;;;--;;>/^^__[",
+"hhnsBDGJJGGDwumhee00fffffee00686}660dnyLOQRRRQQOMJGDDDyyyDDyyib:(((3bxJMQQQQQOMFFAzpvvKKPPNSSSSSSRRQOMMMOQQRRRRRQQMLGxko777ooEMOQRRSSSNNPPPPPKKKKKKPPNNNNNHHIIIIHHHPKKKHIAxlba3(((>;-=~***~=-::ixFIQRRRRQMLCtjgddhgnsssssngggga:<~%@+..     ..+@%&*====-;>^^]_[[",
+"gnuwDGLMMMLJDBurmhhmmuuuurmhfe000000hsCLOQQQQQOLJGDByBByBDDCDtia:((3bxEMOQQQOOMMLLLMINNNSSSSSSSSSRRQOMMMOQQRRRRQQMJCyl2|!!77oALOQRRNNPKKKKKqqqqqqqqvvvppppo||||||77444447|1<(((/(>>>>;;;;::::actAMQRSSRRRQOMEyjgddddnnssssssssig:<)@+.      ...+@%&&&&*=;/^^_[[[",
+"gnswDJMOOOOLJDBwuuuwBDDDDBwumhff00fhnyELOQQQOMLJDBwwuuuwBDCGGDlc:((3btEMOOOOOOOOOOOORRSSSSSSSSSSSRRQOMMMOQQRRRRQOLCyic1)!!!)|oFOOQNKqqqqqq5555,,,,,'!!)))))){{{{))!!'''+@){=;>>>>>>((((3333dgsyEMQRSSSSSRRRQMExjgd9ddgnnsstyyytic1)@..     ....+@$$%%%&=>/^^^[[9",
+"hhnsDJMOQQOMLJDDBBDDGJJJJGDBumhhfdhnsDJMOOOOMLGDBwurrrruwDGEECkc::(3btEMMOOOMMOOOQQQRRRSSSSSSSSSRRRRQOMMOQQRRRQQMJysa:~)@@@!|kEOOHqq555,,,,,######.++@$%%%%%%%%&%%$@+++++@%*=;>>>>((3abgggnnyCJOQRSSSSSSSSRRQMEtja999dgnswyDCDxsc2!+.      ....++@$$$%&*;/^^^[69",
+"ddgsDJMQQQQOMJGDDDGJLMMMMJGDBsmhhhhnwCJMOOOMLGDBurmmhhmmuyGJJGkc<:::bxELMMMMMMOOQQQQRRRRSSSSSSSSRRRRQOMMOQQRRQQOLGwn9:{$@++@)2AINKq5,,#########   ..+@$$$%%%%%&&&%%$@+++@@%*=-;>>>(:bitttwwyGLOQRRSSSSSSSSRRROLxtg999ddnswDCGCDt1)!.       ....++@@@$$&*;/^^[[69"};
diff --git a/hacks/images/tunnelstar.xpm b/hacks/images/tunnelstar.xpm
new file mode 100644 (file)
index 0000000..e87d452
--- /dev/null
@@ -0,0 +1,323 @@
+/* XPM */
+static char * tunnelstar_xpm[] = {
+"256 256 64 1",
+"      c #020202",
+".     c #040404",
+"+     c #070707",
+"@     c #0B0B0B",
+"#     c #0E0E0E",
+"$     c #121212",
+"%     c #161616",
+"&     c #1A1A1A",
+"*     c #1D1D1D",
+"=     c #202020",
+"-     c #252525",
+";     c #282828",
+">     c #2C2C2C",
+",     c #2F2F2F",
+"'     c #333333",
+")     c #363636",
+"!     c #3A3A3A",
+"~     c #3C3C3C",
+"{     c #3E3E3E",
+"]     c #414141",
+"^     c #454545",
+"/     c #494949",
+"(     c #4C4C4C",
+"_     c #505050",
+":     c #535353",
+"<     c #575757",
+"[     c #5A5A5A",
+"}     c #5F5F5F",
+"|     c #626262",
+"1     c #666666",
+"2     c #696969",
+"3     c #6D6D6D",
+"4     c #707070",
+"5     c #747474",
+"6     c #767676",
+"7     c #797979",
+"8     c #7B7B7B",
+"9     c #7F7F7F",
+"0     c #838383",
+"a     c #878787",
+"b     c #8A8A8A",
+"c     c #8E8E8E",
+"d     c #929292",
+"e     c #969696",
+"f     c #999999",
+"g     c #9D9D9D",
+"h     c #A0A0A0",
+"i     c #A4A4A4",
+"j     c #ACACAC",
+"k     c #AFAFAF",
+"l     c #B3B3B3",
+"m     c #B6B6B6",
+"n     c #BABABA",
+"o     c #BEBEBE",
+"p     c #C2C2C2",
+"q     c #C5C5C5",
+"r     c #C8C8C8",
+"s     c #CCCCCC",
+"t     c #CFCFCF",
+"u     c #D1D1D1",
+"v     c #D6D6D6",
+"w     c #E2E2E2",
+"x     c #E6E6E6",
+"y     c #EAEAEA",
+"wqljjjkkkllkkkjjjjjjjjkllmmmmmllkkkjkkklllllllkkkklmnnnnmlkkkkkklmmmlkkkkklmnonmmlkkklmmmlkjjjjjkkkkkjjjjjjjjjjjjjjkkkkkkkkklmnmmlkkjkkklllkkklmnonmllklmopponmlkkklllllkkklmnnonnmmlklmmnnnnmmlllmnoooonmllllmoqstsrqponmmmoqsuutsrponmmmmmnoqrrrqpponnmmlmnpvy",
+"qc1<<[}}|11||}[[<<<<[[}|234443221|}}}}||122221||}}|2577531|}[[}|23332||}}}14687531|}}13442|[[[[[}}}}}[[<<[[[[[[[[[[}}|||}}}|245431|}[}||111|||24787421|248009642|||22221|||1357875421|13577654211247909753221250cfgfdb0864459cfiihec0864323580cddcba087542236bjv",
+"l1,*&*=-;>,>>;-==****=-;,)~~~!)),>;---;>,'''',,>;;>'{^/^{)>;---;,)!!',>;-;,!^((^~'>;;,!]{)>-=*==-;;--==**==--======-;;;;;;;>){]{),;---;,,,,>>,)]((/{),,']_[<_^!'>>,'))',>;>,!^((/^~),>'!^//^]!),,)](:<_/]!'''~(}47752}:(^{]/[380073}:(]~!!{/:}1221}[:(^{!)!]_2es",
+"j<*+.+@#$%&&&%$#@@+++@#$&=;>>;;-=*%$##$%&=====*&%%%*;')),;*%$##$&-;;-*&%$$&-,!!)>-&%$&->,-&$@@@##$$$##@+++@###@@@@#$$%%%%$$&->,,-*%$#$%&***&&&-'~~)>=&&-']/^~';*%%*=-=*&%%&=>)~~),;=&&=>)!)'>;=*=;']^^~'>-==-'^[232|:/{),,)^[26741</{)>;;>'](<[[<:(^~),;;;,~(2es",
+"j:&.  .+@#$%%%$#@++...+@$%=-;;;-=*%$####$&****&&%$$%*;')';=%##@#$*=--*%$##$*;'!)>-&$#$*;>-&#++++@#$##@+..++@@@++++@#$$$$$##%=;,>-&$#@#$%&&&%%%-,!!';*%&-']^])>=%$%&==*&%$$%=,)!)';=&%&-,))'>;=*&=;)]]{)>-=*=;!_|22|<(]),>,~_|4641</{'>--;,~/:[[<_/]!'>;-->!/[5gt",
+"j:&.   .+@#$%%%$#@++...+@$%=-;;--=&%$#@#$%&****&%$$$%=>'),-&$#@#$%=--=&%###%-,)),;*%$$&-;;*$@+++@#$##@+...+@@@+++++##$$$$##%=;,>-&$#@#$%&&&%%&-'!!,-*%&-)]^{);=%$%*==&%$$$&-,!!),-*%%*;')),;-*&*-,~]]!,-=**-'^[221[(]),>,!(}4652[(])>;--,!^_<[<_/]~'>;-->!/[29iu",
+"j<&.    .+@#$%%%$#@++..++@$&=-;;-=*&%##@#$%&****&%$$$&-,)'>=%$#@#$*=-=*%$##$*>))'>=%$#%=;;=%@+++@##$#@++..++@@+++++@#$$$$##%=;,>-&$#@#$%&&&%%&-'!),-&%&;!^^~'-*%$%*=*&%$$%*;)!!'>-&%&=>))'>;=*&=>)]]~';-**=>{:|21}:^~'>>)^[3652}_]),;-->)^_<[<_/]~),;-->!/[250iu",
+"j<&.     .+@#$%%%$#@+...++#$&=;;;-=*%$##@#$%****&&%$$%=;'),-*$#@#$%=--=&%##$&-')),-&$#$*-;-&#++++@###@++..++@@+++++@#$$$$##%*;,>-&$#@#%&&&&%%&;'!)>=&%*>~^^!,-&$%&*=*&%$$%=,)!),;=&%*;,)),;-*&*-'~]{),-=*=;)(}22|</{)>>']:2563|:^!,;-->)]_<[<:(^~),;-->!/[2469ht",
+"j<*+      .+@#$%%%$#@+...++#%*-;;;-=*%$#@##%&****&%$$$&-,''>=%$#@#$&=-=*%$##$=>)),;*%$$&-;;*$@+++@#$##@+..++@@+++++@#$$$$##$*;,>-&$#@#%&&&%%%*;)!)>=&%=,{^])>=%$%&=*&%$$$&-'!!'>-*%&=>')'>;=*&=>)]]!';=**-,^[121[(]),>,~_|464|:^!';--;'](:[<:(^~),;-->)/[24557fs",
+"j[=+       .+@#$%%%$#++...++#%*-;;--=&%$#@#$%&****&%$$%*;'),;*%#@@#%=--=&$##$&;')'>=&$#%=;;=%@+++@#$##@+..++@@+++++@#$$$$##$*;,>-&$#@#%&&&%%%*>)!';=&&-']^]);=%%%*=*&%$$%=>)!)';=&%*-,)),;-*&*-'~]{)>-=*=>~:|21}_^!,>>)/}4641</{'>--;'{(:<<:(^{),;-->)/[245434dr",
+"j[=@.       .+@#$%%$$#++...+@#%=-;;-=*&%##@#$%&***&%%$$%=>''>-&$#@#$&=-=*%$##%=,)),-*$#$*-;-%#+++@####@++..+@@+++++@#$$$$##$*;,>-&$###%&&&%%%=>)!';*%&-)]^{';*%%&*=*&%$$%-,)!),-*%%=>')'>;=*&=>!]]!,;=**-)/}22|</{'>>'^[2552[(])>--;,{/:[<:(^{),;-->)/[24542|2bq",
+"k}-#+.       .+@$$%%$#@++...+@$%=-;;-=*&$####$&****&%$$$&-,)';*%####%=--=&$##$*;))';=%$$&-;-*$++++@###@++..+@@@++++@#$$$$##$*;,>-&$###%&&&%%%=,)),-*%&;!^^~,-&%%&*=*&%$%*;'!!'>-&%&-,)),;-*&*;'{]{'>-**=,]<121[(]),>']:1553}_]),;-;,~/:[<:(^{),;-->!/[24542}<}0p",
+"k}-#@+.       .+@$%%%$#@++...+@$&=-;;-=*%$###$%&****&%$$%=;'',-&$#@#$&=-=*%$##%-,))>-&$#%=;;=$@+++@#$##@+..+@@@++++@#$$$$##$*;,>=&$##$%&&&%%%=,!),-&%*>~^]!>=%$%*==*%$$%=>)!),;=&%=;')'>;=**=,!]]!,-=*=;!_|21}_^!,>,!_|454|:^!,;--,!^:<<:(^{),;-->)/[24542}:(<9o",
+"j[-#@++.       .+#$%%%$#@++..++#$&=-;--=&%$#@#$%&***&%$$$&-,'';=%####%=--=&$##$*>)),;*%$$*-;-%#+++@#$##@++.++@@++++@#$$$$##$*;>>=&$##$%&&&%%&-,!)>=&%=,{^]);=%%%*=*&%$$&-,)!'>-*%&-,)),;-*&*;){]~';-**-'/[12|:/~'>,)/}3541</!,;-->!^_<[:_^]),;-->)/[24541}:/^(7n",
+"j[=#@@@+.       .+#$%%%$#@++..++#%*-;;--=&%##@#$%&***&%$$$*;,',-*$#@#$&=-=*%$#$&-')'>=%$$&-;-*$+++@####@++.++@@+++++##$$$$#$*;,>=&$##$%&&&%%&-'!)>=&&-']^{';*%%&*=*&%$%*;'!)';=&%*;')',;=**-,!]]),-=*=>]:12|[(]),>'^[2552[({'>-->)^_<[:_/]!,;-->)/[24541}:/]~^5m",
+"j[=#@@@@++.      .+#$$%%$#@++..+@#%*-;;-=*&$####$&***&&%$$%=>''>=%$###%=--=%$##%=,)),-&$$%=;;=$@+++####@++.++@@+++++@#$$$$#$*;,>=&$##$%&&&%%&;')';=&&-)]^~,-&$%&==*%%$%=>)!),-*&&=>'),;-*&=;){]~';=*=;)(}21}_^!,>,{:1552}(])>;->)](<[<_/]!,;-->)/[24541}:/])'{3m",
+"j<*@@@@@@++.      .+@$$%%$#@++..+@#%=-;;-=*%$#@#$%&***&%$$$&-,',;*$###$*=-=*%$#$&;')';=%$$*-;=%#+++@#$##@+.++@@+++++@#$$$$#$*;>>=&$##$%&&&%%*;')';*&&;!^]!>=%$%*=*&%%%&-,))'>-&%*;,)',;=&*-,~]{)>-=*-,^[12|:/~'>,!(|453}_]),;-;'](<[<_/]!'>-->)/[24431[:/{),>!3m",
+"j<*+++@@@@++.      .+#$$%%$#@++.++@$&=-;--=&%$#@#$%&***&%$$%=;'',-&$###%=--*%$##%=,)'>=&$$%-;-&#+++@#$$#@++++@@@++++@#$$$$#$*;>>=&$##$%&&&%%*;)),-*&*>!^]);*%%&*=*&%$%*;'!),;=&&=>'),>-*&=;){]!,;=*=>{:|2|<({),,)/}354|:^!,;-;'{(:<<_/]!'>-->)/[24431[:/{),;;~4m",
+"j<*+.++@@@@++.      .+#$%%$$#@+++++#$&=-;--=&%####$%&**&&%$$&-,'';*%###$&=-=&%$#$*;'),-*$$%=;;=$@++@#$$#@++++@@@++++@#$$$$#$*;,>=%$##$%&&&%%=>)),-&&=,{^{';*%%&==*%%$%=,)!)>-*%*-,)',;=**-,~]{)>-==-)(}11[_]),>']<2541</!,;-;,~/:<<:/]!'>-->)/[24431[_^{),;;,^7o",
+"j[*+..++@@@@++.      .+#$%%$$#@+++++#$*=-;-=*&$####%&***&%$$%*;'',-&$##$%=--*%$##%-,)';=%$$*-;=%#++@#$$#@++++@@@++++@#$$$$#$&;>>=%$##$&&&&%%=>)),=&&-']]~,-&%%*==&%%%&-'!)';=&&=>')'>-*&=;)]]!,-=*=,]<|1}:^!'>,{:1442[({'>-;,!/:<<_/]!'>-->)/[2443|[_^~'>;;>!:aq",
+"j[=@...++@@@@++.      ++#$$%$##@+++++#%*-;;-=*%$###$%&***&%$$%=>''>=%###$*--=&%$#$=>)),-&$$&-;-&#+++@#$##@+++@@@++++@#$$$$#$&;>;=%$##%&*&%%%=,))>=&&-)]]!>=%%%*=*&%$%*;)!),-*&*-,)',;=**-,~]~';=*=;!_}1|</{'>,!(|442}(])>-->!^:<<:(]!'>-->)/[2443|[_^~'>;;,!/1ds",
+"k}=@+...+++@@@++.      ++#$$%$##@++++@#%*-;--=&%$###$%&***&%$$&-,',-&$##$%=--*%$#$&;'),;*%$%=;;*$@++@#$$#@++++@@@+++@#$$$$#$&->>=%###%&*&%%&-,)';=&*;!]]);*%%&*=*&%$%=,))'>-&&=;')'>-*&=>)]]),-==-'/[1|[(]),>)^[353|_])>;->)^_<<:(^~'>;->)/[2442|<(^!'>;;,!(}6ht",
+"k}-#++...+++@@@++.      ++#$$%$#@+++++@$%=-;--=&%####%&***&%$$%*;''>=%$##$*--=&$##%=,)'>=%$$*-;=%#++@#$$#@++++@@@+++@#$$$$#$&->>=%$##%&*&%%&-,)';*&*>!]{';*%%&==*%%%&-')),;=&&-,)',;=**-'~]~';=*=>{:||}_^!,>']<244|:^!,;->)^_<<:(^~'>;->)^[1442|<(^!'>;;,{(}39iu",
+"k|;$@++...+++@@@++.      ++#$$%$#@+++++@$&=---=*%$###$%&***&%$$&-,',;*$##$%=--*%$#$&;'),-&$$&-;-&#@+@#$$##@+++@@@+++@#$$$$#$&->>=%$#$%&*&%%&-,),;*&=,~]~,-&%%*=*&%$%*>)!)>-*&=;')'>-**=>!]{)>-==;)(}|}:/~'>,~_1441</!,;-;)]_<[:(^~'>;->)^[1442|<(]!,>;;'{_}360it",
+"k|;%#@@+...+++@@@++.      +@#$$$$#@+++++@$&=---=*%$###$%&***&%$%*;,'>-%$##$*--=&$##%-,)';=%$%=;;*$@++#$$$#@+++@#@+++@#$$$$#$&->>=%$#$%**&%%&;'),-*&='{]!>=%%&*=*&%%&-,))';=&&-,'',;=**-'{]!,-=*-,^<||<(]),,!(}342[({';;;'](<[:(^~'>;->)^[1342}<(]),;;>']:|3568gs",
+"l1>%$##@++...++@@@+++.     ++#$$$$#@+++++#$&=---=&%$###$&***&%$$%=>',;*%##$%=--*%$#$*>'),-&$%*;;=%#++@#$$#@+++@#@++++#$$$$$$&->;=%##$%**&%%*;''>-&&-)]]);*%%&==*%%%*;'!),-*&*;')'>-**=>!]{)>-*=>~_}|[_]),>)^[243}_])>;;,{(<[<_^{)>;->)^<1332}:/]),;;>)^:|45435dr",
+"l1,&%$##@++...++@@@@++.     ++#$$$$#@+++++#%*=--=*&$###$%&***&%$$&-,',-&$##$*--=&$#$%-,),;*%$&-;-&#@+@#$$##+++@#@@+++#$$$$$$&->;=%##$&**&%%*;''>=&*;)]{';*%%*==&%$%=>))'>=&&=>'),;=**;'{]!,-==-)/[|}:^!,>']<243|:])>;;,~/:[<_^{)>;-;)^<1332}:/]),;;>)^<14542|1bp",
+"l2'*%%$##@++...++@@@@++.    .+@#$$$$#@++++@#%*=--=*%$###$%&***&%$%*;,';=%##$%=--=%$#%=>''>=%$%=;;*$@@@#$$$#@++@##@+++#$$$$$$&->;=%##$&**&%%=>'';=&*;!]~,-&%%*=*&%%&-,)),;=&*;,)'>-=*=,!]~';===,]:}}</{',,~_|441:^!,;;,!/:[<_/{)>;-;)^<1331}:/{),;;,!/[24541[:[0o",
+"l2'=&%%$$#@++...++@@@@++.    .+@#$$$$#@++++@#%*---=*%$###$%&**&%$$%-,',-&$##$*--=&$$$&;'',-&%%*;;=%#@@#$$$#@++@##@+++#$$$$$$&->;=%##%&=*&%%=>',;=&=,~]!>=%%&==*%%%*;'))>-*&=>'),;=**;){]!,-==;!([}[(]),,)(}342[/!,;;,!/:[<_/]),;-;)^<1331}:/{)>;;,~(}24531[_/_7n",
+"l1,=*&&%$$#@@++..++@@@@++..   .+@#$$$##@++++@$&=--==&%####$&***&%$%*;,'>=%##$%=--=%$$%=,'';=%$&-;-&$@@#$%$$#++@##@@++@#$$$$$&->;=%##%*=*&%%=>',-*&=,{]);*%%*==*%%%=>))';=&*-,)'>-=*-,~]~';==-'^<}[_^!,>'^[242[({'>;>!^:<<:/]),;-;)^<|221[_^~'>;;'{_}3553|<(]~^5n",
+"k|,*&*&&%%$##@++.+++@@@@++..   .++#$$$##@++++#$&=--=*%$###$%&**&%%$%=>',;*$##%*-;-&$$$*;''>-&%%=;;*$#@#$$%$#@+@###@++@#$$$$$&->;=%##%*=*&%%=>',-*&-)]{'-&%%*=*&%$&-,)),-*&=>'),;=*=;)]])>-==>~_[[:/~'>,]:243}_]'>;>)^:[[:/]),;-;)^<|22|[_^~'>;;']:|3542}:/])'{4m",
+"k};&%&*&&%%$##@++.+++@@@@+++..  .++##$$#@@++++#$&=-==*%$#@#$%&**&%$$&-,'>=%##$&=;-=%$$%-,',;*%%*;;=%#@@#$%$#@+@###@++@#$$$$$&->;=%#$%===&%&=>,>=&*;)]~,-&%&==*&%%*;')'>=**-,)'>-=*-,~]~';==-)/<[<({',,!_|43|:])>;>)]_[[:(]),;-;'^<|22|[_^!'>;>)^:|3442}:^{),>!2m",
+"k}-$$%&&&&%%$##@++.+++@@@@@++... .++##$$#@@+++@#%&===*&%$#@#$%&**&%$%*;',;*$##%*-;-&$$$*>''>=%%&-;-&$@@#$%%$#@@###@++@#$%$$$%->;=%#$%===&%&-,,;=&*>!]!>=%%&==*%%%=,)),;=*=;'),;=*=;)]{)>-==,]:[<(]),,)/}341<^!,;>']_<[:(]),;-;'^:|22|<(]!,>;>)^<14431[_^!'>;;)3m",
+"j[-$#$%&&*&&%$$#@+++.++@@@@@+++.. .++##$##@++++@#%*===*&$#@@#$%&*&&%%&-,',-%$#$&-;;=%$$&-,',-&%%=;;*$#@#$%%$#@@####@+@#$%$$$%->;=%#$&=-=&%&-,,;=&=,~{);*%%*==&%%&-'))>-**-,)'>-=*-'{]!,-==;!(<[_^!,>'^[242[/!,;;'](<[<(]!,;-;'^:|22|<(]!,>;,!/[2443|[(]!,>--;{5n",
+"k}-#@#$%%&&&&%$$#@++++++@@@@@+++....++@####@++++@#%*===*%$#@#$%&**&%%%*;,';=%##%=;;-*%$%=>',;*%%*;;=%#@#$%%$#@@####@+@#$%$$$%->;=%$$&=-=&%*-,,;*&=,{{'-&%%*=*&%%*;))';=*=;'),;=*=>!]{);==-'^:<:/~',,{:142}({'>;,{(<[<(^!,;-;']:|21}<(]),;;,~([2442|</]),;--;'(9p",
+"k}-#@@#$$%&*&&%%$#@@+++++@@#@@@++....++@####@++++@$%*==*&%$#@#$%&**&%$%=>',-&$#$&-;;=%$$&;,'>=&%&-;-&$##$%%%$#@##$#@+@#$%$$$%=;;=%$$*--=&%*;,>-**-'{~,=%%&==*%%%=,)),-**-,)'>-=*-'{]!,-==>~(<:({),,!_|33|_])>;,~(<[<_^!,;-;']:|11}:/]),;;,{(}2442}:/~)>;-->)^}cr",
+"k|;$#@@##$%&&&&%%$##@+++++@@#@@@+++...++@####@++++#$&*==*%$#@@#$%&&&%%$&-,'>=%##%=;;-&$$%=>',-*%&=;;=%###%%%$#@##$#@+@#$%$$$%=>;=%$$*--=&%*;,>-**;){!>=%%*==*%%&;')'>=*=;')';=*=>!]{';==-)^::(]),,)/}33|:^)>;,!/<[<_^!,;-;']:}1|}:/{),;>']_|3431[_^!'>---,!^<4fs",
+"k|>%##@@@#$%&&&&%%$##@+++++@@##@@+++...++@####@+++@#$&*==&%$#@##$%&&&%%%*;,,;&$#$&-;;=%$$*;,,;=&%=;;-%###$%%%#@##$#@@@#$%$$$%=;;=%$%=--=&%*;>;=&*>!{);*%%*==&%%=>)),;=*-,)',-=*-'{])>-=-,]_:_^!,>'][231<^!,;,!/:[<_^!,;-;']:}1|[:/{'>;>']:|343|[(]!,;--;,{([28ht",
+"l1,&$$#@@@#$%%&&&%%$##@+++++@@##@@+++...++@###@@+++@#$&*=*&%$#@#$%&&*&%%%=>'>=%##%=;;-*%$%-,'>-&%*->-*$##$%&%$###$$#@@#$%%$$%=;;*%$%=;-=&%=;>;=&=,!~'-&%&==*&%&-,))>-*=;')';=*=,!]~';==;!/:_/~'>,{:132[/~,>>)^:[[_^!,;-;,]:}||[_^~'>;>)^<1342|</]),;-->)]:}248gt",
+"l1,*%$$##@@##$%&&&%%$$#@++++++@##@@@++...++@###@@+++@#%&*=*&$#@@#$%&&&%%%&;,,;*$#$&->;=%$%*;,,;*%&-;;=%##$%&%$###$$#@@#$%%$$%=;;*%$%=;-=%%=;>-**=,~!,=%%&==*%%*;')';=*->)),-==;)]])>==-,](_/]),,!(|32}({'>>)^:[[:/~';-;,]:}||[_^!'>;>)^<1442}:/~'>;-;,!/<|3446er",
+"l2'=&%%$##@@##$%&&&&%$$#@++++++@###@@+++..++@@##@@@++@#%&**&%$#@@#$%&*&%%%=>,,-%$#%=;>-*%$&-,,>=&&=;;-&$#$%&&%###$$#@@#$%%$$%=;;*%$%-;-*%%=;>-**-'{!>*%%*==&%%=>)),-==;,)'>=*-,~]~,-==>!/_(]),>)/}23|:])>>)]_[[:/~';-;,]_}|}<(^!'>;,!/[2431[_^!'>--;,{([134212cq",
+"l2'=*&%%$$#@@@#$%%&&&%%$##@+++++@###@@+++..++@@##@@@+@@$%&**&%$#@@#$%&&&%%&-,,;*$#$&->;=%$%=>,,-*%*->-*$#$%&&%$##$$#@@#$%%$$%=;;*$$&-;-*%&=;;-**;)~);&%&===&%&-,)'>=*=>'),-==;)]]);==;)^((^!,>']<23|:^),>']_[[:/{';-;,]_[|}<(]!,>>,~(}233|[(]),;-->)]:}2332}<}0p",
+"l2'=**&&%%$##@@##$%&&&%%$##@+++++@####@@++..++@@@@@@@+@#$%&**&$#@@#$%&&&%%%*;,,-&$#%=;>-*%$&;,,;=&&->;=%##%&*%$##$$$#@@$%%$$%=;;*$$&-;-*%&=;;=*=>!~'-&%&==*&%*;'),;==;,)'>-=-,~]!,-=-,{/(^~'>,~:131</!,>'{_[[:/{';-;,]_[|}<(]),;>'{_}232|</{),;-;,!/<|332|[_(:8o",
+"l1'=****&%%$$#@@##$%&&&%%$##@+++++@####@@++..++@@@@@@@@@#$%**&%$#@@#$%&&&%%%=>,>=%#$*;>;=%$%=>,>-*&=;>-&$#$&*&%##$%$#@@$%%$$%=;;*$$&->-*%&-;;=*=,!!,=%%*==*%%=>))>-==>'),;==;)]{);==;)^(/{),,!(|32[(~,>,{(<[<({';-;,{_[}}:(]),;>']:|232}:^~'>;-;'{([1332}<(^{/6n",
+"k|,******&&%$$##@##$%%&&%%$$#@+++++@#####@++..++@@@@@@@@@#$&**&%$#@@#$%&&&%%*;,,-&$$%=>>-*%%*;,,;=&*;>;*$#$&**%$#$%$#@@$%%$$%=;;*$$*;>-*%&-;-=*=,!!>*%%=-=&%&-,)';==-,)'>-=-'{]!,-=-,]//]),>)^[22}({'>,~(<[<(]'>-;,{_[}[:/{)>;>)^:|231[_^!,;-->)]:}2321[:/]))]4m",
+"k};&&&****&&%%$##@@#$$%&&&%$$#@+++++@#####@+++..++@@@@@@@@#$&*&&$#@@@#%&&&%%%=>,>=%$$*;>;=%$&->,>=&*->;=%$$%**%$#$%%#@@$%%%$%=;;*$$*;>-*%*-;-**-'~);&%&=-=&%*;'),-==>'),;==>!]{';==>!^/]!,>']<12|:]),,!/<[<(])>-;,{([}[:/{'>;>)^<132|[(]),;-;,!/<|232|<(^~),>~3m",
+"k}-$$%&&****&%%$$##@##$%%&&%%$#@@++++@#####@@++..++@@@@@@@@#%&&&%$#@@#$%&&&%%&-,,;*$$%=>>-*%%=;,,-*&=;>-&$$%**&$$$%%$@@#%%%$%=;-*$$=;>-&%*-;-**;)!'-&%*=-*&&=,)'>==-,)'>-=-'{])>-=-']^^~'>,~_|21<^),,!/<[[_])>--,{(<[[_^~'>;>)/[132|</{)>;-;'{([1321}:/]!'>;;~4m",
+"j[=##$%%&****&&%%$##@##$%%&&%%$##@++++@#####@@++..++@@@@@@@##%&&&%$#@@#$%&&&%%*;,>-%$$*;,;=%%&-,,;=&=;>;*$$%***%$$%%$#@#%%%$%=;;*$%=>>-&%*--=*=>)!,=%%*-=*%&-'),;==;'),;==>!]~'-=->!^^{),>)(}21[/!,,)^:[[_])>--,~(<[<_^!'>;,!([122}:^~'>;;>)^:}222|[_^~),;;;,^7o",
+"j[=#@##$%&*****&&%$$#@@#$$%%&%%$##@++++@######@++..++@@@@@@@#$%&&%%##@@#$%&&%%&=>,;*$$%=>>-*%%=>,>-**->;=%$$&=*%$$%%$###%%%$%=;-*$%=>>-&%*--=*=>!)>*%&=-=&%*>))>-=-,)'>-=-'{]);==;)]^]),>'^[22}(~',)^:[[_^)>--,~(<[<(^!,>>,~(}221[_^!,;-;,!/<|221}:/]!'>;;;,~:aq",
+"j[=@+@@#$%%&*****&%$$##@##$%%&%%$##@++++@######@++..++@@@@@@@#$%&&%$#@@@#%%&&%%*;,,-&$$*;,;=%%*;,,;=*=;>-&$$&==&$$%%$###%%%$%=;-*$%-,,-&%*--=*=,!);&%&=-*&&=,)';==;'),;==>!]~,-=-,~]]!,>,]:12}_{',)]:[[:^)>-;,~(<[:(]!,>>']_}22|[(]),;-;'{([122|[_^~),;;;>)]_2es",
+"j[=@+++@##$%&*****&%%$##@##$%%%%%$$#@++++@##$$##@++.+++@@@@@@@#$%&&%$#@@#$%&&&%%=>,>=%$%->>-&%%=>,>=*=;>;=%$%==*%$%%%###$%%$%=;-&$%-,,-&%*--**-'!'-&%*-=*%&-'),-=-,)'>-=;)]]);==>)]]~'>,!_|2|:]),']_[[:^)>--,~(<[:(]),>>']:|22|:/{'>;;>)^:}121}:(]!'>;;;,~/<|7ht",
+"j[=@++++@@#$%%&****&&%$$####$$%%%%$$#@++++@##$$##@@+++++@@@@@@##$%&%%$#@@#$%&&%%&-,,-&$$*;,;=%%*;,>-**->>=%$%*=*%$%&%$##$%%%%=;-&$%-,,-&%=-=**;)!,=%&=-=&&=>''>-=;'),;=-,~]!,-=-'~]~),>)/}21<^),'{([[:^!,;-,~(:<:/]),;>)^<|21}:^!';;;,!/<|21|[_^{),;;;,)]_}249ht",
+"j[=@++++++@##$%&*****&%%$#####$%%%%$$#@++++@##$$$##@++.++@@@@@@##$%&%$#@@@#$&&&%%*;,>=%$%->>-&%&->,;=*->>-&%%*==&$%&%$##$%%%%*;-&$%;',=&&=-=*=;))>*%&=-=&&-,),;=->)'>-=;)]{';=->!]{),>'^[11[/!,'~(<[:/!,;-,~/:<:/{)>;>)/<|21[_]),;;;'{([|11}<(]!'>;;>'{(<|3448fs",
+"j[=@+++++++@@#$%%&****&&%$#####$%%%%%$#@@+++@##$$$##@+++++@@@@@@#$%%&%$#@@#$%&&&%&=>,;*$$*;,;=%%=;,>-*=;,;=%%&==&%%&&$##$%%%%*--&$&;',=&&===*=>));&%*--*&*;''>-=;,),;=-,~]!>-=;'~{!,>,{:|1}(~''!/<[:/!,;-,!/:<_/~'>;,!/[12|<(])>;;>)]_}11|[_^{),>;;,!^:}244324dr",
+"j[*@+++++++++@##$%&****&&%$$##@#$$%%%%$##@+++@@#$$$##@+++++@@@####$%%%%$#@@#$%&&%%*-,>=%$%->>-&%&->,;==;,>=&%&==*%%%&$##$%%%%*--&$&;',=&&===*=,)'-&%=-=*&=>'';-->''>-=;)]{'-=-,!{!'>,!(}1}_{''!/:[</~,;->!/::_^~'>;,~([11|</~'>;;,!^:}1|}<(]!'>;;>']([13432}[|ap",
+"j<*++++++++++++@#$%%&****&%%$##@##$%%%%$##@+++@##$$$$#@+++++@@#####$%%%%$#@@#$%&&%%=;,;*$$*;,;=%%=>,;==->,-*%&==*%%%&%##$%%%%*--&$&;'>=%&==**-,),=%&=-=&&-,',-=;,),;=-,{])>==;)~!),>)/[1|:])')^:[<(~,;;>!/::(^!,>;,{(}11}:^!,;;;,{([|||[_^{),>;>,!^:|2432|[_(:8o",
+"j<*+..++++++++++@##$%&****&&%$$####$$%%%$##@+++@##$$$$#@+++++@@#####$%%%$#@@#$%&&&%&->>-&$%->>-&%*;,>-==;,;=%&=-=&%%&%$#$%%%%*--&%&;'>=%&==**;')>*%*--*&*;'';-->''>-=;)]~,-=-,!~),>']<1|<^)')^:[<({,;;>!/_:(^!,>>']_}1|[_]),;;>']_[||}<(]!'>;;>)]_[13431}:(]~/5n",
+"j<*+....++++++++++@#$$%&****&%%$#####$%%%$$#@+++@##$$$$#@+++++@@#####$%%%$#@@#$%&&%%*;,;*%$*;,;=%&=>,;==;,>-&%*-=&%%&%$#$%&%%*--&%*;'>*%*==*=;'';&%*--*&=>',;-;,),;=-,{{);=->)!),>,~:|1[/!')]_[<({';;>!^__(]),>>)]:}1|<({'>;;>)^:[}}[_^{),>;>'~/<|2331}<(^~',~3m",
+"j[*+.....++++++++++@@#$%&*****&%$##@##$%%%$$#@+++@@#$$$$#@+++++@#####$$%%%$#@@#$&&&%&=>>-&$%->>-&%*;,>-=->,-*%*=-*%%&&$#$%&%%*--&%*>';*%&==*=>),-&&=-=&&-,'>--;'',-->!]!,-=;'!!'>>)(}|[(~')]_[[_]';;>!^__/]),;>)^<||}:/~';;;,~/:}}[:(]!'>;;,)^:}2332|[_^{),;;)2l",
+"j[=@+......+++++++++@@#$$%&****&%%$####$$%%$$#@++++@#$$$$##++++@@#####$%%%$##@@#%&&&%*->>=%$*;,;=%&->>-=->,;=&*=-=&%&&$#$%&%%*--&%*>,;*%&==*=,),=&&--=&*;',;--,)';--'{{';=-,)!),>'^[|}_{)'{([[_]';;>!^(_/]),;>)/<||[_^!,;;;'](<}}<_^{),>;>'{([1332|[:/]),;-=-)2m",
+"j[=@+++.....++++++++++@@#$%&*****&%$#####$$%$$##@+++@#$$$$##++++@@#####$%%%$#@@#$%&&&&=;,;&%%->>-&%=;>;==;,>-&&=-=&%&&%#$%&%%*--&%*>,;&%*=**-,'>*%*--*&=>',--;'',-->!{!>--;'!),>,]:|}:]))~(<[_]';;>!^((/{)>;,!/[||[(])>;;>)]_<[[:(]!'>;>,!^:|2331}<(]!'>-===;{5n",
+"j[=@+++++....+++++++++++@#$%%&****&%%$####$$$$$##@+++@#$$%$$#@+++@@#####$%%%$#@@#$&&&&*->>=%%*;>;*%*->>-=-,,-*&=--*%&&%$$%&%%*--&%=>,-&%*=**-,';&&=-=**-,,;--,'';-;'{~'-=-,))'>,~_}}:^)'!/<[:^)>;>!^((^{'>;,~([|}<({'>;;,!^_<[<_^{),>;>)]([1332|<_^~'>;-==->)(9o",
+"k[=#++++++....+++++++++++@@#$%&*****&%$#####$$$$##@+++@#$$%$$#@+++@######$%%%$#@@#%&*&&=;,;*%%=>>-&&=;>;=->,;=&*--*%&&%$#%&%%*--&%=>,-&%*=*=;',-&&=-=&*;,,;-;'',-->!{)>-->))',>)/[}</!'!^:[:^)>;>)^((^~'>>,{([|}:^!,;;;,~/:<<:/]!'>;>,~/<|232|[_/{),;-==-;,!^[ap",
+"k}-#@@++++++++++++++++++++@@#$$%&****&%$$####$$$$$#@+++@#$%%$$#@+++@#####$$%%%$#@#$%&&&&=>>-&%*;>;*&*;>;--;,>=&*--=&&*&$$%&&%&--&%=,,-&&*=*=>',=&*--**=>,>-->'';-;'{!,-=;')),>'^<}[(~))^:<:^)>;>)^((^!'>>']_[}[_^),;;>'](:<:(^~),;;,)]_}1321}:/]),;-==-;,)]^_|bq",
+"k}-#@@@@++++++++++++++++++++@@#$%&*****&%$####$$$$$#@+++@#$%%$$#@++@######$%%%$##@#$&*&&*->;=%%=;;=&&->>-=;,,-**--=&&*&$$%&&%&--*&=,,-&&*=*=>'>=&=--**-,,;-;,',-->!~);=-,)),>,{:}[({))]_<:^)>;>)^((^!,>>']:}}<(])>;;,)](::_/]!'>;>'~(<|222}<(]!'>-==-;,)]^(_:|bq",
+"k};$##@@@@+++++++++++++++++++@@##$%&****&%$#####$$$$#@@++@#$%%%$#@++@##$$#$$%%%$#@#$%&*&&=;>-&%*->-*&=;>;-->,;=*=--*&&&$$%&&%&--*&-,,=&&*=*-,';*&=-=*=;,>-->'';-;)~!,-->')'>,!([}:]))]_<:/!>;>)]//]!,>>)^:}}</~';;;,!^(:_(^~),;;,)^:}122|[_^~'>;-=-;,){^(____[0p",
+"k};$####@@@@+++++++++++++++++++@@#$%&*****&%$####$$$$##@++@#$%%%$#@+@@##$$$$$%%%$###$%**&*->>=%%=;;=&*->>--;,>=*=--*&&&%$%&&%&=-*&-,>=&&**=-,,-**--=*=>,;-;,',--,!~';-;,)',>)^<[:^!)](<:/!,;>)]//]),>,)^:}[:^!,;;>'{/__(/])'>;>'{([|22|[:/{),;-=-;,){^(___(//:9o",
+"k};$$#####@@@++++++++++++++@@@+++@##$%&*=**&%$####$$$$##@++@#$%%%$#@@@@#$$$$$$%%%$###%&**&=;>;*%*-;-*&=;>;-;,,-*=--*&&&%$$&&%&=-*&-,>=%&**=;',=&=--**-,,;->'';-;)~)>--,)),>']:[</!){(<:(!,;>)]//]),>,!/<[[_])>;;>)]/((/]!',>>,!^:}121}:(]),;-=-->'~^((__(/^]{(7n",
+"k};$$$######@@@@+++++++++++++@@@++@@#$%&**=**%$#####$$$##@++@#$%%%$#@@@##$$$$$%%&%$##$%****->>=&%=;;=&*->;-->,;==--=&&&%$$%&%&=-*&-,>=%&**=>'>=&=-=*=;,>--,',;-,!!,;-;')',,~_[</~)~/::(~,;>)]/^]),>,~(<[<({'>;;,)]/((^{),>;>)]([|21}<(]!'>-=-->'~^/(__(/^]!))]4m",
+"k}-$##########@@@@+++++++++++@@@@@@@@##$%&*=**&%$####$$$$#@@+@#$%%%$#@@@#$$$$$$%&&%$##$&***=->;*%&-;-&&=;>-->,>-*--=*&*%$$%&%&=-*&-,>*%&**->';**--=*->,;-;,'>-;)!);-;,)',,)/<<({)!^::(~,;>)]/^{),>,{(<[:/!,;;;,!^/(/]!'>;>,~/<|11|[_^~'>---->'!]/(__(/^]!)'>>!3m",
+"j[-#############@@@@+++++++++@@@@@@@@@@#$%&**=*&%$####$$$$#@@+@#$%%%$##@##$$$$$%%&&%###%&***=;>-&%=--*&=;>;-;,,-==--*&&%$$%&%&=-**-,;*&***-,,-*=--=*->>-;>',;;,!!,-->'',,'^:<_])!^_:({,>>)]^^{',>'](<<_^),;;>'~^//^{),>;,)]_}11|}:/{),;---;,!]/(_((/^]!),>;-;)3m",
+"k[-#@@############@@@@++++++++@@@@@@@@@@##$%&*==*&%$####$$$##@+@#$%%%$$###$$%%$$%&&&$##$%****->;=%&-;=&*->;-;,,;==--*&&&$$%&&&=-**->;*&*==-,,-*=--*=;>;-;,,>->)!';-;')',,{_<_^!!](:({'>,)]^^~'>>)]_<<(])>;;>){^^^]!'>;>'~(<|11}<(]),;---;,)]^((((/^{!),>;---;~4m",
+"k}-#@@@@####$$$#####@@@@+++++++@@@@@@@@@@@#$%&*==*&%$####$$$##@@@#$$%%%$###$%%%$$%&&%$##$&***=;>-&%*--*&=;>;->,>-=--=&&&%$%&&&=-**->-*&**=;,>=*=-=*->>;->,,;;,!)>-;,)',,!(::^!!](:(]'>,)]^^~'>,)^_<:/~';;;,)]^^]~),>>,)^:}11|<(]!,;---;,){^/(((/]{!),>;----;,^7n",
+"k|;$##@@@@####$$$$####@@@@+++++@@@@@##@@@@@##$%**==*&$####$$$##@@@#$%%%%$###$%%%%%%&&%$#$%*=**-;;=&&=-=&*->;->,,-=--=&&&%$%&&&=-**-;-&&*==>,;==--==->;-;,,>;>)!';->'),,)^::/~!](:(]'>,)]^]!'>,)^_:_^!,;;;,!]^]{)'>;>'{([|1|[_^~'>---;>)~^/((/^]{!',>;---;;,){:0p",
+"l1,&$$##@@@@####$$$$#####@@@+++++@@@####@@@@@#$%&*==*&%$####$$##@@@#$$%%%$##$%%%%%%%&&%$$$&*=*=;>-*&*-=*&=;;;;,,;=--=*&&%$%&&*=-**-;=&&*=->,;==--==;>;->,,;;,))>-;')',']_:({!{/_(])>,)]^]!,>,!^_:(])>;;>'!]]]!',>>,!^:}||[:/{)>;--->'~]/((/^]~!',>;---;>,){]/[ap",
+"m2)=&%$$##@@@@###$$$$$$####@@@+++@@@@######@@@##$%**=**%$####$$$##@@#$%%%%$##$%&&%%%&**%$$%*===-;;=&&=-*&*;;;;,'>--;-*&&%$%&&*=-**-;=&&*=->>-=--==-;;-;>,>;>)),;;,)',,~(:(]!~/__]),,)]^]!,>,!/::({'>;;,)~]]~),>;>)]_[||}<(]),;--->'!]^///^]~)',;;---;>'!{^/(_}ap",
+"m4~;=*&%%$###@@@###$$$$$$$###@@@@@@@@@#######@@@#$%&*==*&%$###$$$##@@@#$%%%$$$$%&&%%%&*&%$$%*===-;;*&*==&&-;;;>,,----=&&%%%&&*=-**--=%&*=->>-=--==->;-;,,;;,)'>;>'),,)^_(]!!^_(^),,)]^]),>,~/__/~,;;;,)~]{!',>>,!/<}|}<(]),;---;,){^///^]~)',;;---;,'!]^/(((([0p",
+"n6^,>;-=*&%$$##@@@###$$$$$$$###@@@@@@@@########@@##%&*===*%$###$$$##@@##$%%%$$$%&*&&%&**&%$%&====;;-&&==*&=;;;;,,;---=&&%%%&**=-**--*&&*=;,;==--==;;-->,>;>)),;;,)',)]((^!!]((^),,)]^]),>'~/_(^),;;>'!~{~),>>,)]_[||[_^!,;---;,)~]^/^]{!)'>;---;>,)~]^/(((/^^:9o",
+"n7/)',>;-=*&%$$##@@###$$$$$$$$$##@@@@@@@#########@##$%&*==*&$$###$$$#@@##$%%%$$$%&**&%&**&%$%*===-;;=&*=*&*-;;;,'>---=&&&%%&&*=-**--*&*==;,;=---=-;;-;,>;;,),;;,)','{/(^~!]/(^),,)]]{),,'{/(/])>;;>'!~~!',>>'~/<}|[:/~'>---;>'!]^^^]{!),>;---;>'){]/(((/^^]{~(7n",
+"n6^))'',,;--=&%%$#######$$$%%%$$$##@@@@@@####$$###@@##$&*==*&%$###$$$##@@#$%%%$$$&***&&&**&%%&====;;-*&*=&&=;;;>',;-;-*&%%%&&*=-**=-*&*=-;>-=--==-;;;>,>;>''>;>'),,!^(^~!{/(^!,,)]]{),,)]/(^~,;;;,)!~!),>>,)^_[}}<(])>;--->'!]]^^]~!',>;---;>'!{^/(((/^]]~!))]5m",
+"m4{,,'')'',>;-=*&%$$######$$%%%%%$$###@@@@@###$$$$#####$%&*==*%$###$$$##@##$%%%%$%&*=*&&*=*&%%*===-;;=&&**&*-;;;,,;-;-*&&%%&&*==**==*&*=->>-=--==;;-;>>;;,',;>')',)](/{!{^(^!,,)]]{),,)]//]!,;;>,)!!)',>>'{(<}}<(]),;---;,){]]]{~)',;;--;;,)!]^/((//^]{!)',>>~4m",
+"l2)-;;,,'''',>;-=*&%$$#####$$%%%%%%$$$##@@@@###$$$$$####$%&*==*&%$##$$$#####$%%%%$%&==*&&*=*&%&=-==-;-*&**&&=;;;,'>;;-=&&%%&&*=-**==&&*=->>--;-=-;;-;>>;>''>;,)),'{//]!~^(^!',)]]{),,)]//])>;;>'!!!),>>,!^:[}[_^!,;-=-;,)!{]]{!)'>;;--;>,)~]^/(//^]]~)),,>;;;~4m",
+"l1,**=-;>,,''',,>;-=&%%$#####$$%%&&&%%$$##@@@###$$$$$$####$%*===&%$##$$$$####$%%%%%%*===**==*&%&=---;;=&&*&&=;;;>',;;-=&&%%&**==**==&&*=;>;--;-=-;-;>>;;,',;>')''!^/]!~^/^~'')]]~',,)]^^~'>;;,)!!)'>>>)](<[[:/~';-=-;>'!~{{~!),>;---;>,){]^/(//^]{!)',>;;;;;,^6n",
+"l1,*&&**=-;>,'''',>;-=*&%$$####$%%&&&&&%%$###@###$$$$$$$###$%&*==*%$$#$$$$####$%%%%%&*===**==*&&*----;;=&&&&*-;;>,,;;;=&&%%&&*===*==&&==;>;---==-;-;>>;>',>>')'')]^]!!]/^~''!]]~',,)]^]!,;;>,)!!),>>,!^:[[:({'>-=-->')!~~!)',>;---;>'!{^////^]{~)',>>;;;;>,){:0p",
+"l2'=&&&&&*==-;,,''',,;-=*&%$$###$$%%&***&%%$###@###$$$$$$####$%*==*&%$#$$$$####$%%%%%&=--=*===*&&=---;;-*&&&&=;;;,'>;;-*&%%&**==**=*&&=-;>;-;-=-;-->>;;,',>,))'){^]~!]^^~''!]]~','!]]{)>;;>')!)',>,)](<[<(])>--=-;,)!!!!)',;;---;,'!]^///^^]~!)',>;;;;>,)!]/_|cq",
+"m3!-=**&&&&&*=-;>,,'',,>;-=&%%$$##$$%&**=*&%%$######$$$%$$$###$%&*==*%$$$$$$$###$%%%%%&=--=====*&*----;;=&&&&*-;;,',;;-*&%%&**===*=*&*=->>--;-=---;>>;>,,>,')''~]]~!{^^{)'!]]!','!]]~'>;;,'))',>>'~/:<<_^!,;-=-;,')!!)',>;----;,)!]^^//^]{~)',>>;;;>,'!]^(:<[2dr",
+"m4~;--==**&&&&*==-;>,,,,,>;-=*&%$$#$$$%&*===*&%$######$$%%%$$##$$%*==*&%$$$$$$###$%%%%%*=--===-=**=---;;-*&&%&=;;>',>;-=&%%%**===**&&*=->;---==---;>;;,,>>')''!]]{!{^^{)'!]]!','!]]!,;;>,)))',>,)](:<_/~';-=-;>'))))',>;---->,)~]^^^^^]~!)',>;;;>,'!{^(_:<[[[1bq",
+"n5],;;;--==**&&&&*==-;>,,,,>;-=*&%$$$$$%%&*===*&%$$####$$%%%$$$##$%&*=*&%$$$$$$$##$%%%%&*-;-===-=**=---;;=&%%%*-;>,'>;;=&%%%**===**&&*=;>;-;-=---;>;;>,,>,))'){]{!~]^{))!]]!','!{~),;;>'))),>,'{/:::/{'>-=-->,'))',>;;---;>,)~]^^^^]{!)',>;;;;,'){^(_:<[<<:__[0o",
+"n5],>>>;;;--==**&&&&*=-;;>,,,>;--=&%%$$$$%&*==-==&%$$####$$%%%%$$$$%&*==*%$$$$$$$##$%%&%&=-;-==--=*=---;;-*%%%&=;;,',;;=&%%%**===**&&*=;>;-;-=---;>;;,,>,')')!]{!!]^{))!]{!','!~!'>;;,'))',>,!](::(])>----;,'''',>;----;>'){]^^^]]~)',>>;;;>,)~]/_:<<<<:_(^]](7n",
+"m4{,>>>>>>;;;--==**&&&**=-;>>,,>>;-=*%%$$$$%&*=---=*&%$###$$$%%%$$$$$%&*=*&%$$$%$$$$$%&&&&=-;;----===-;;;;=&%%%=-;>',>;-*&%%&*=-=**&&*-;;;;;-=---;;;>,,,'))'!{{!!{]{!)!]{)','!!),;;>,))),,,'{/_:(^!,;-=-;>,'',,;;----;>'!{]^^^]{!)',>;;;>,)!]/(:<<<<:_(^]~!)']4m",
+"l2);;;>>>>>>>;;;--==**&&&**=-;>>>>;;-=*&%$$$$%&*=---=*&%$###$$%%%%$$$$%&*==&%$$$%%$$$$%%&&*=;;;----==-;;;;-=%%%&-;>,',;-*&%%&*=-=*&&&=-;;;;-=---;;;;,,>,))')~{!!{]{!)~]{),,'!!'>;;,'))',,'!^(__^~';-=-;>,,,,>;--==-;,'!{]^^]{!)',>;;;>,'!]^(_:<<::_/^]~)',>;>!3m",
+"k|,**=--;;>>>>>>;;;--==**&&&*==-;;>>;;-=*&%%$$%%&==---=*&%$###$$%%%%$$$%%*==*&%$$%%$$$$%%&&*-;>;----==-;;;;-&%%%=;;,',;-=&%%&*=-=*&&*=-;;;;-=---;;;>,,,')))!{~!{]]!)~]{),,'))'>;>,)))',,){/__/{'>-=--;,,,>>;--=--;,)!{]]]]~!),,>;;;>'){^/_::<::(/^]~)',>;;--;!3m",
+"k};%$%&*==-;;>>>>>>>;;--==*&&&&*==-;;;;;--=*&%$$%%&=--;-=*&%$##$$$%%%%$$$%&==*&%$$%%%$$$%%&&*-;>;----=-;;;;;=%%%*-;,',>;=&%%&*=-=&&&*=->;;;-=--;;;>,,,')))!~~!{]]!!~]{),,')),;;>'))',,'!^((/])>----;>,,>;;-==-->,)!{]]]{!)',>;;;>,)~]/(::::_(/^]!)',>;;----->{5n",
+"k};$##$$%%&*=--;>>>>>>;;;--==*&&&&*==-;;;;--=*&%%$%%&=--;--*&%$##$$%%%%%$$%&*==*%%%%%%$$$%%&&=->>;;-----;;;;-&%$%=;>,',;=&%%&*=-=&%&*=;;;;-==--;;;>,,'))))!!!~]]~!~{~),,')'>;;,'))',,)]/(/]!,;---;>>>>;--==-;>,)~{]]{~)',>;;;>,'!]^(_:::_(/^{!)',>;;----;>,'!(8o",
+"k|>%$$####$$%&*==-;>>>>>>>;;--=**&&&&*==--;;--=*&%%%%%&=-;;;-=&%$$$$$%%%%$$%%*==*&%%%%%%$$%&&*=;>,;;;---;;;;;=%%%*->,',;-*&%&*=-=&%%*-;;;;-==--;;>,,,))))!!!!]]~!~{~),,'',>;>,)))','!^//^~';---;;>>;;-===-;>')~{{{~!),,>;;;>'){^/(_:__(^]{!),>;;----;;>,)!{^(}bq",
+"l2'*&%%$$###$$$%%&==-;;>>,,>>;;-==*&&&&&*==-----=*&%%%%%&=-;;;-=&%$$$$%%%%%%%%&*==&%%%%%%$$%&&*=;,,;;;;--;;;;-*%$&=;,',>-=&%&*=-=&%%*-;;;;-=--;;;>,,'))))!!!{{~!~{~),,',,;;>'))',')]^/^{)>---;;>>;;-===-;>')~{{~!)',>;;;>,)~]/(___(/^]~)',>;;---;;>,')~]^(_:[2cr",
+"m4~;==*&%%$$$$$$$$%%&*=-;>>,,,>>;;-==*&&&&&*==----=**&%%%%&=-;;;-=&%$$$$%%%%%%%&*==*&%%%%%%%%%&*=;,,>;;;;;;;;;=%$%*->,,,;=&%%*=-=&%%*-;;;--=--;;;>,'))))!!!~{~!~{!',,,,>;>,)))'')~]^^]),;---;;;;--===-;,')!~~!)',>;;;>,'!]^/((((/^]~)',>;;---;;,')!]^(_::<<[[2cr",
+"n6^'>;;-==*&%%$$$$$$$$%&*=-;>>,,,,>;;-==*&&&&&*===--==*&%%%%&=-;;;-=&%$$$$%%%%%%%*==*&%%%%%%%%%&*=;,,>>;;;;;>;-*%$&-;,',;=&%%*--=&%%*-;>;-==-;;;>,,)))))!!!~~!~~!',,,,>;>,)))''!{^^]!,;---;;;;--===-;,)!!~!!)',>;;;>')~]/(((/^]{!)',>;;--;;>,)!{^/(_:<<[[<<:<|bq",
+"n7(!)',,>;;-==*&%%$$$$$$%%&*=-;>>,,,,>>;-==*&&&&&*======*&&%%%&=--;--*&%$$$$%%%%%%&*==*&%%%%%%%%&*-;,,>>;;;;>;;=%$%=;,',;=&%&=--=&%&=-;;;-=--;;>>,'))))!!~~~!~~!',,,>>>,'))'')~]^]!'>;--;;;;-====->,)!!!!)',>;;;>,)!]^/((/^]~!',>;;;-;;>,')~]^(_:<<<<<<::_((([0o",
+"n7/!)))))',,>;;-==*&%%%$$$$%%&*=-;>,,,,,,>;-==*&&&&&**====**&%%%&=--;--*&%$$$$%%%%%&*==*&%%%%%%%%&*->,,>;;;;>>;-*%%&->,,>-*&&=--=&%&=-;;;---;;;>,')))))!~~~!~~!',>>>;>,)))')!{]]~)>;-;;;;;--==-;>,))!!)',>;;;>,'!{]^//^^]~)',>;;--;;>,)!]^/(::<<<<<::_((/^]]{(7n",
+"m4],,''))))))',,>;;-==*&&%%$$$%%&*=-;>,,,,,,>;-==*&&&&&**===**&&%&&*=---=*&%$$$$%%%%%&*==*&%%%%%%%&*->,,>;;;;>>;=&$%=;,',;=&*=--=&&*-;;;-==-;;>>,'))))!~{~~~~)',>>;;>')))))!]]{),;;;;;;;-===-;>,))!)),,>;;;>,)~]^^^^]{!)',>;---;>,')~]/(_::<<<:::_((/^]{~!)')^5n",
+"l2'---;>,,'))))))'',>;;-==*&&%%%%%%&*=-;>,,'',,>;-=*&&%%&&**==**&&&&&*=---=*%$$$$$%%%%&*==*&&&&%%%%&=->,,>>;;>>;-*%%*-,',;=&&==-=&&*-;>;-=--;;>,')))))!~~~~!)',>>;>,'))))!~]{!'>;;;;;;-===-;,'))))',>;;;>,)!{]^^^]~!),>;;--;;>,)!]^/(:::<<::__(/^]]{!))',,>>,]4m",
+"k|>&&&*==-;;>,'')))))'',,>;--=**&%%%%&&*=-;>,'''',>;-=*&&%&&&**=***&&&&*==--=*%$$$$$%%%&*===*&&%%%%&&=->,,>>;;>>;-&%%=>,,;=&&*===&&*-;>;----;>,')))))!~~~~!),,>>;>,)))))!{{!'>;;;;;;--=--;,')))',>;;;;,')~]]]]{!)',>;---;>,')~]/(_::::::_((/^]{~!)'',,,,,,,')/7o",
+"k|>%%%%%%&**=--;>,,'))))))',,>;;-==*&&&&&&*=-;>,'''',>;-=*&&&&&******&&&&*==-==&%$$$$$%%%&*==*&&&%%%&*=->,,,>>>>>;*%%*;,,>-&&&==*&&*-;;--=-;;>,')))))!~~!!),>;;>,'))))!~~!),>;;;;;--=-;>,'))',,>;;;>,)!{]]]{!)',>;;-;;>,)!]^/(_::::__(/^^]{!))',,,,,,,')!~]^(}bq",
+"l1,*&%%%%%%%%%&*==-;>>,''))))))',,>;--=**&&&*==-;>,'''',>;-=*&&&&&******&&&*====*&%$$$$$%%&*==**&&&&&&*=->,,,>>>>;-&%&->,,;*&&*=*&&=-;;----;>,')))))!~~!!',>;;>,'))))!~!),>;;;;;----;>,'''',>;;;>,')!{{{~)),>;;-;;>,'){]/(__::__((/^]]~!))',,,,,,')!~]^/(:<[|4es",
+"m3!-==**&&%%%%%%%%&&*=--;>,'')))))))',>;;-==****==-;>,'''',,;-=*&&&&&******&***===*&%$$$$$%%&*==*&&&&&&*=;>,,,>>>>;=%%=;,,;=%%*=*%&=;;;----;>,'))))!!~!!',;;;>,))))!!!)'>>;;;;----;>,''',>;;;>,')!~~~!)',>;;;;;>,)!]^/(_____(/^^]{!))'',,,,,')!~]^/(:<[}|12237fs",
+"n5],>;;--==**&&%%%%%%%%&*==-;>,'')!!!!))'',>;--======-;>,'''',,;-=**&&&**********==**&%$$$$%%&*==**&&&&&*=;,,,,>>>;-*%&->,;=&%*=&%&-;>;---;>,'))))!!~!)',;;>,'))))!!)',>>;;;----;>,',,>>;;;>,')!!!)),,>;;;;>,')~]^(((_(((/^]]~!))',,,,,')!~]^/_:<[}|1122222114er",
+"o8(~))',,>>;;--==**&&%%%%%%&*==-;>,'))!!!!!))',>;;-====--;>,'''',,;-=**&&***********=*&%%$$$$%%&*==*&&&&&*=;>,,,>>>;=&%=;,>=&&*=&%&-;;----;>,)))))!!!)'>;;>,)))))!)',>>;;;---;;>,,,,>;;;>,'))!))',>>;;;;>')!]^/(((((/^^]{~!))'''''')!{]^(_:<[}|1111111||}}[<<|bq",
+"o9:]{{~~!!))',,>;;--==**&&%%%%&&&*=-;>,'))!!~~!!)',,>;------;>,,''',,;-==***************&%%$$$%%&**=**&&&&*=;,,,,>>>-*%*;,>;**==&%*=;;---;>,'))))!!!)'>;;>,))))))),,>;;;---;>>,,,>;;;>>,'))))',>;;;;>,')~]^//((//^]]~!))'''''))!{]^(_:<[}||1111|||}[[<:__(/^^:9o",
+"n7(~~~{{{{~~~!!)))',,>;;-==**&&&%&&&&*=-;;,'))!~~~!!))',>;-----;>,,''',,;-==*****==*******&%$$$$%%&*=***&&&*=;,,,,>>;=&&->,;=*==&&=--;--;;,'')))!!!),>;>,'))))))',>>;;;--;>>,>>;;;;>,,'))'',>>;;>,')!{]^////^^]{~!))'''))!~]]/(_:[[}||||||||}[[<:_(//^]]{!!))^6n",
+"m4{,,,')))!!~~~~~~!!!))',,>;;--==*&&&&&&&*==-;>,')!~~~!!))',>;;---;;>,,'',>;-==***=====****&&%$$$$%&*****&&&*=;,',,>>-*&=;,;===*%&=;;---;>,)))!!~!),>;>,')))))',>>;;;-;;;>>>>;;;>>,'''',,>>>>,,)!~]^^^^^^]]~!!))))))!~]^/(:<[[}||||||}}[<::_(/^^]{~!))''',,,,]4m",
+"l1'====-;;>,,''))!!!~~!!!!))',,>;;--=**&&&&&&**=-;>,'))!~!!!)),,>;;--;;>,,,,,>;--=========***&%%$$$$%&****&&&*=;,'',,;-**->;===&%%->;--;;,'))!~~!),>>>,)))))',,>;;;;;;;>>>;;;;>,,,,,,,>>>>,')!{]^^^^]]{~!)))))!!{]^/(:<[[}}||}}}[[<:_((/^]]~!!))'',,,,,,,,,,'^6n",
+"k|>%%%%%&&**==--;>>,''))))!!!))))',,>;;--=***&&&&**==-;>,'))!!!))',>;;;-;;>>,,,,>;--========**&&%%$$$%%&****&&*=>,'',>;=*=;>;-*%$%=;;;-;>,'))!!)',>>,'))))',,>>;;;;;;>;;;;;>>,,,,,>>>,,')!~]]]]]]{~!!))))!!{]^/(:<[[}}}}}[[<::_(/^]]{!!))'',,,,,,,,'''))!~]]/[ap",
+"k|>%$$$$$$$%%%%&&**==--;;>,,''')))))'',,,>;;--==**&&&**==-;;,,'')))'',>;;;;-;;>>,,>>;---======**&&%$$$$%&*****&*=;,,,>;-**;,>=&$#$&=--;;,''))!)'>>>,')))',,>>;;;;;;;;;;;;>>,,,,,,,,'))!{]]]]{{~!)))!!!{]^/(_:<[}}[[[[<:_(/^]]~!!))'',,,,,,'''')!!{]^^/(_:<[}|5fs",
+"l1,*&%%%%%%%$$$$$%%%%%%&&*===--;;>,,,,'''',,,>>;;-==****&&**==-;>>,,'',,,>;;---;;;>>>>>;;--======*&&%$$$%%&***&&*-;>,>>;=*->;*$##$&=--;>'''))),>;>,'))'',>>;;;;;;;;;;;>>>,,,,,,'')!~{{{{{~!)))!!!~]^/(_:<<[[<<<:_(/^]]~!!))'',,,,,'''))!~{]^//(_:<[}|122344560iu",
+"m3!;-===****&&&%%%%%%$$$%%%%%%%&**===--;;;>>>,,,>>>;;;--==******===-;;;>>>>;;;;-----;;>>>;;;---====*&%%$$$%&*****=-;>,,>-==--*$#$&=---;,'))))',>>,')'',,>;;;;;;;;;;;>>>,,,,,'))!!~~~~!!))))!~]^^/(_::::::__(/^]{!!)'',,,,,,'''))~{]^//(_:[}||12234455666666670iu",
+"n5^',>>>;;;----===***&&&%%%%%%%%%%%%%%%&&**==---;;;;>>;;;;---===****====-----;----------;;;;;;-----==*&%%$$%%&****==;>,>;==--=%$%=-;-->'))))',,,,''',,>>;;;;;;;;;;>>>,,,''))!!!!!))))))!~]]^/(___((((/^]{~!))',,,,,,''))!~]]^/(_:[}}|1123445555555555444332225fs",
+"o8(~)))))''',,,,>>;;;;---===***&&&%%%%%%%%%%%%%&&*===----;;;;;;-----======================---;;;;----==**&%%%%%&***==;>,>-=-;-*%&=---;,)!)),,,''''',,>;;;;;;;;;>>,,,'''))))))))))))!~{]]^////^^^]{~!))',,,,,'''))!{]^/(_:<[}}|122344444444444332211||}}}[[<:<|bq",
+"o8(~!!!!!!!!!))))))))'',,,,>>;;;;--===***&&%%%%%%%%%%%%&**====---;;;-------=========*********==--;;;----==*&%%%%&&***=-;>;----*&&=--;,)!!)',,,''',>>;;;;;;;;;>,,,'''))))))''''))!!~]]]]]]]]~!)))'',''''')!~]]^/(_:<[[}||122222222222211|||}}[[<<::__((//^^^]^:9o",
+"n5^)''''')))))))!!!!!!!!!)))))))))'',,,>>;;--===***&&%%%%%%%&&&**====--;;;;------====***&&&&&&&&*==-------==*&%%%%&***=----=--=**=-;>'!!)',,,'',,>;;;;;;;;>>,,,'''''''',,'')))!!!!~~~!)))))'''''))!{]^//((_:<[}}}||||||||||}}}[[[<<:::_(((//^^]]]{~~!!!))))')^6n",
+"m3!;--;;;;;>>>,,,,''''))))))!!!~~~~~~~!!!!!)))'',,>>;;--====**&&&&&***==-----;;;;;;;;---==**&&&%%%&***=-----==**&%&&&*****=---===-;>>,)',,'',,,>;;;;;;;>,,,,'',,,,,,,,,'''))))))))))))))))!{]]^^^/(_:<<<<<<<[[[[[<<:::__(((//^^^]]]]{{~~!!!)))''''',,,,,,,,,'^5n",
+"l2'=****======------;;;;;>>,,,'')))))!!!~~{{]]{{{~~!!!))))'',>>;---===========--;;;;;;;;;;---==*&&&%%%&***======**&&&**&%&=----==->,,,,,>,'',>;;;;;;>>>,,,,,,,>>>>,,,,''''''))))))!~~{]]]^/((___________((///^^^]]]]{{~~!!!)))))''''')'''''''''''')))))!!!!~]_9o",
+"l2'=************===========----;;;;>>,,,,'')))!!!!~~~{{]]]]{~!!)))'''',,>;;---------;;;;;>>>>;;----=*&&&&&***======****&%&=--===*->',,,,>,,,>>;;>>>>>,>>>>;;>,,,,,,,''''))))!!!~{]]^^^^^^^^//^^^]]]]{{{~~!!)))))))))))))))))))))))!!~~{{]]]]^^^^^///(((__:::<1cr",
+"m3!;----------==================---------;;;;;>>,,,,'')))!!!!)))!!!!!~~!))'',,,,>>>>;;;;;;;;;;;>>,>;--====*&&&**======*&&&*====**->',,,,>>>>>>>;>>>>>>>>>>;>>,'''''')))!!~~~{{{{]]]]]]{~~~!!!!!))))))))))))!!!!!!~~{]]]]^^^^///(((__::<<<[[[}}}}|||||111222237gt",
+"n6^',,,,,,,,,>>>>>>>>>>;;;;;;;;;;;;;;;;;;;;;;;;;;;;>>>>>,,,,,,,,,,'')))))))'''',,,,,,,,>>>>>;;>>,,,>;;;;>;-=====-==**=***&&&**=*=->,>;;;>>>;>,,>;;>>>>,,,,>,,'))!))))!!!!!!!!!!!!!!!!!!!!!!!!!!~~{]]]^^///((((___:::<<[[[[}}}}}|||1112222333334444444444444459ht",
+"o9:]{{{{{~~~~~~!!!!!!!!!!!)))))))))))))'''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>>>>>>>>,>>;;--;;>>;;;;;>;-=&*====&&&&*==-;'',;--;>;;>')',>>>,,''',,,,'))))))))))))))!!!~~{{{]]]]]]^^^//(((_:::<<[[}}}}}}}||||||||||11111111122222222222222222111111125fs",
+"pa}_((((((/////////////^^^^^^^^^^^^^^^]]]]]]]]]]]]]{{{{{~~~~!!!!!!)))))))'''',,,,,,,,,,>>>>>>>>>;;;----;;;;>>>,,>-=**-;;-=*====-;,')'>;-;>>>'!~!)',,,,'',,>>,,,''''))))))!!!~{]]]]]^^^^^^////((((____::::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<::::::::::|bq",
+"qb|:_____((((((((((((((((((((///////////^^^^^^^^^^^^^]]]]]]]]]{{{{~~~!!!!)))))'''',,,,,,,>>>>>;;;;;----;;;>>>>>;;-==-;>>>;;;;--;>,')),>;>,,)~]]{!)'',,,,,>>>>>>,,,,,'''')))))!!!!!!!!!!!~~~~~~~~~~{{{{{{{{]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]:9o",
+"p0<^^^^^]]]]]]]]]]]]]]]]]]]]]{{{{{{{{~~~~~~!!!!!!!!!))))))))))))))))))''''''''',,,,,,,,,,,,,,>>>>>;;;;>>,,'',,>;---;,''',,;;;;;>,,,'',,,,'){^^]!'',,',,,,>>>>>>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,''''''''''''''''''''''''')^6n",
+"n6^),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>>>;;;;>>>>>>>>>,,,,,,,,,,,,,,,''''''''''))))'''',,,,'))!!!!)'>--;>')'',;;;;;>>>>>,,,,,,,){/^~'>>,')))',,,>,,,''''''''''',,,,,,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>>>>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>,]4m",
+"m3!;------------------------------------;;;;;;;;;;;;;;>>>>>,,,,,'''''')))))))!!!!!!!!!!!!!!!!!!!!!))'')!~!!))!),;-->,,,>;----;>;;;;>>;;;>>,)]{'>>,))!!!)',,,'')))))'''''',,,,,,,,,,,'''''''))))))))))))))))))!!!!!~~~~~{{{{{{{{{]]]]]]]]]]]]]{{{{~~~~!!!!!))!/7n",
+"m2)-=========-------------;;;;;;;;>>>>>>,,,,,''''')))))))!!!!~~{{{~~~~~~~~~~~~~!!!!!!!!!!!!!!~~{{~!)'')))',>>,,>;--;>;;;---;;;>;--;;;----;;,)'>>,)!!)!!!)',')!!)))'''',,,,,,,,,,>>>>,,,,,,,'''''))))))!!!~~{{]]]^^///(((((_____::::::<<<<<<<<<<<<::::::____(_}ap",
+"m3!;;;;;;;;;;>>>>>>,,,,,,,,'''))))))!!!!~~~{{{]]]]]]]]]]]]]]]]]]]{~!!))))))))))))))))!!!!~!!!!!!!!)'>>>>>;;-;;;;;;-;;;-----;-;>>;;;;;------;>;;>,'''))!!!)))!~!))))))))''''',,,,>>>>>;;;;;;;;;;>>>,,,,,'''))!!~~{]]^^///((___::<<<[[[}}}|||1111111111111||||14er",
+"n5^'''''''))))))!!!!~~~~{{{]]]]]]^^^^^^^^^^^^^^^^^]]]{{~!!))))))))'',,,,''')))))!!~~~~~~~~!))',,,>;;-=---;;;;>>;;;-----;--;;-------;;;;;-==----;>>>,,,'))))!~~!!)))!))))))))))))'',,,,,,>>;;------------;;;;>>,,,'''))!!~{{]]^^//((__::<<[[}}}|||||11111122237gs",
+"o8_]{{{]]]]]]]^^^^^^^^^/////////^^^^^^]]]]{{~!!!)))''',,,,>>>>,,,,,''''))!~{{{{{{{{~!!))',,>;;--=====--;;>,>>>;---===-;>>;;;--==**=-;>,,;=====---;;;>>>,,,')!!!!!~{{~~!!!))))))))))))))))'',,,,>>>;;;---------------;;;;>>,,,,'')))!~~{]]^^^//(((__:::<<[[[[}3dr",
+"p0[(/////((((((////////^^^^]]]]{~~!!))''',,,,>>;;;;;;;>>>>>,,''))!~~{]]]]]]]]{!!))',,>;;--========-;;>,,>>>;;--=====-->,>;--;-=*&&=--;,,;-==**==---;;;;;>>>,''')!!!~{{]]]{{~~!!))))')))))))))))))))''',,,,,>>;;;;----------------;;;;>>>,,,''')))!!~~{]]]^^^([ap",
+"pa}_((((////^^^^]]]{{~!!))''',,,,>>;;;;--;;;;;;;;>>,,''))!!~{]]^^^^^^^]{~!))',>>;;---====**===-;;>,,,,>>;;;--==**==-;;,>;==-;;-*&*=---;;;--==****=--;;;;;;;>>>,''''))!~{]]]^^^]]]{~!)))))'))))))!!!!!!!!!~!!!))))''',,,>>>;;;------------------;;;;;>>>,,,'')/7n",
+"p0<^]]]{{~!!)))'',,,>>>;;;------------;;;>>,,''))!~{]]^^^^^^^^^^]{~!!)',>>;;---=====****==--;>,,,,,,>;;;;---=***=--;>>>;=*=->>-==*=--===-----=**&**=-------;;;;>>,,''')))!~{]]^^///^^^]]~!))))'''))))!!!~{{{]]]]]]]]]]{{~~!!)))'',,,>>;;------=========-----;!3m",
+"n7/)',,,>>>;;;;--------------;;;;>>,,''))!~{]]^^////////^^]{~!)),,>;;;-----======**===--;>>,,,,,,>>;;-----=****=--;>>>;-=*=->;---==--==*==-----=*&&**==---;-----;;;>,,'''')))!!{]^^//((((/^^^]!))))''''')))!!~{]]]^^^^^///////^^^^^]]{~!))'',,>>;;-----=====-)2l",
+"m4!;-----------------;;;>>,,,'))!!~{]]^^/((((((((/^^]{~!)',>>;;;--------===========-;;>,,,,,,,>;;;---;;-=*&&*=---;>>>>-=**=-;;;;;-=---=***=--;-==*&&&&*==-;;;------;;>>,,''')))))!!~]^//((_::_(//^]{!)))'''''')))!!~{]]^^//((((___:::__(((///^]]{!!))',,,>;;;!3m",
+"m2)-====-----;;;>>,,''))!!{]]^^//(((_____((//^]]~!)',>>;;;------------========--;;>,,,,,,,>>>;;----;;-=*&&*=-----;>,>;==*=-;;;>>>-=-;;-=***=----==*&&&&&*==-----------;;;>,,''))))))))!~{]^((_::<<:_((/^]{!))''',,''')))!~{]]^^/((__:::::<<<<<:::__((//^]]{!~/7n",
+"m3!;;;;;>>,,''))!~{]]^^//((_________((/^]]~!)',>;;;;----------------======--;;>,,,,,,,>>>;;;;---;;;-=*&%&*=-----;>,>;=**=->,,,,,>-==;;-==**=-------=*&&&&&*==-------------;;;>,'')))))))))!!{]^/(_::<[[<::_(/^]~!)''',,,,,''))!!~{]^^//((_::<<<<[[[[[[[<<::_:}ap",
+"n5^)''))!!{]]^^//((__::::::::_((/^]{!))',>;;;;-----;;;;;;;;;;;---=====---;>,,,,,,,>>>;;;;;;--;;;;-=*&%%&=-----;;>,,;-***=;>,,,',;=&&-;;-=**=--------=*&&&&&&*==--------------;;;>,''))))))))'))!~{]^(_:<[[[[[<::_(/^]~))'',,,,,,,''))!!~]]^^/((__::<<[[[[[[[}3dr",
+"o9_]]^^//((__::::::<:::_((/^]{!))',>;;;;----;;;;;>>>>>>>;;;---====--;;>,,,,,,,>>;;;;;;;;;;;;;;;;=*&%%&*=-----;;>,,>;=**=-;>;;>,,;*%&-;;;-=**=---------=*&&&&&&**==---------------;;>,,')!!!!!))'''))!~]^/(:<[[}}}}[[<:_/^]{!)'',,,,>,,,,''))!!~{]]^//((_:::<[2dr",
+"pa}:_:::<<<<<<<::_((/^]{!))',>;;;;----;;;>>>,,,,,,,>>>;;---===--;;>>,,,,,,>>;;;;;;>>;;;;;;;>;;-*%%$%&=------;>>,,,;-*&*=;>,;-->,;*%%=;;;-==**=---------=*&&%%&&&**==-----==----------;;>,')!~~~!!))''''))!{]^(_:[[}}|||}[[<:(/^]{!)',,,,>>>,,,,'')))!~{]]^^/(}aq",
+"rc2[<<<<::__(//^]~!)',,>;;;;;--;;;;>>,,,''''''',,>>;;---==---;>>,,''',,>;----;;>>>>;;;;;>>>;-*%%$%&*-;;----;>,,,,;-*&*=-;>,>;->>;*%%*->;;-=***=---------==*&&%%&&&&**==----====--;;------;>,')!~{{~!!))''''')!~]^/(:<[}}|||||}[[<_(/^]~!)',,,>>>>>>,,,'')))!{_9o",
+"rc1<__(/^]]~!)',,>;;;-----;;;>>,,''))))))))'',>>;;------;;>>,,''',,>;;-----;>>,,>;;;;>>,>;-*&%$$%*=-;-----;>,,,>;-*&&*=;>,,>;-;>;=&%&->>;--=*&*=----------=*&&%%%&&&&**==----====--;;;------;;,')!~{]]{~!))',,,'')!{]^(_:[}}||111||}[[:_(^]{!)',,,>>>;>>>>>,'^6n",
+"p0<^{~))',>>;;;-----;;;>>,,')))!!!!!!!)))',>;;-------;>>,'''''',>;--===-;>,,,,>>;;;>,,>;-*%%$$%&=-;;--=--;>,,,>;-=&&&*-;>,>;;;;>;=*&&->>;;-==*&*=----------=*&&&%%%&&&&**==---======--;;;;------;>,)!~{]]]{~!))',,,,'))~]^/(:<[}||11111||}[<:_/^]{!)',,>>>;;>{4m",
+"n6^'>;;-------;;;>>,,''))!!~~{{{{~!!)',,>;;-----;;>>,'')))'',>;-====-;>,''',>>;;;>,,>;-*%%$$$%*-;;--==--;>,,,>;-=*&&*=->,,>;;;;>;==&&=;>>;--=*&&*=----------==*&&&%%%&&&&&**==--==***==-;;;;;--===-;;,')!{]]]]]~!)',,,,,,')!{]^(_:<[}|1122221||}[<:(/^]~!)',,]4m",
+"m3!;-----;;;>,,''))!!~{{]]]]]{{!!)',>;;------;>>,'))))))',>;-=**==-;,'))',>>;;>,,,>;-*&%$$$%&=-;--===--;>,,,,>;=*&&&*-;>,,>;-;>>;-=&%*->>;;-==*&&=------------=**&&%%%%&&&&&**==--==****=--;;;;;--===--;>')!{]]^^]]~!)',,>,,,,')~]^/(:<[}||12222221|}}[:_(^]](8n",
+"m3!;;;>>,,''))!~{]]]^^^]]]]~!)',>;;------;>>,'))!!!))',>;-=***=-;,')))',>;;;>,,,>;-*&%$$$$%*--;--====-;>,,,,>;-*&&&*=-;>,,>;-;>>;-=%%&->,>;--=*&&&=------------=**&&&%%%%&&*&&&**=====**&**=-;;;>;;--====-;>,)!{]^^^^]]~!)',,>>>,,')!{]^(_:<[}|1222233221|}[[|bq",
+"m4]',''))!~{]]]^^^^^^]]{!)',>;;------;;>,'))!!!!!)',>;-=***=-;,')!!)',>;;>>,,,>;=*&%$$$$%&=-;--=====-;>,,,,>;-=&&&&*=;>>,>;--;>,;-=&%&=>,>;;-==*&&*=-------------=*&&&&%%%%&**&&&&*=====*&&&**=-;;>>;;--====--;,')~]^^/^^^]~!)',>>>>>,,))~]^/(_:[[}|1223333336fs",
+"n7(~!~{]]]^^^^^^^^]{~)',>;;------;;>,'))!~{{~!!),>;-=***=-;,')!~!)',>;;>,,',>;=*&%$$$$$%*-;;-=====-;>,,,,,>;-=*&&&*=-;>>>>;--;>,;-=&%%=;,,;;--==*&&*=-------------=*&&&&%%%%%&**&&&&**====*&&&&*=--;>>>>;--====--;>')!]]^///^^]~!)',>>>>>,,')!{]^/(:<[}||22348gt",
+"o9:^^^^^//^^^^]{!)),>;;------;;>,'))!~{]]{~!),>;-=***=-;>')~{~!)',>;;>,'',>;=*%%$$$$$%&=-;-======-;>,,,,,>;-=*&&&&*=;>>,,>;-;>,,>--*%%*-,,>;;--=**&&*--------------=**&*&&%%%%&&***&&&&*====*&&%&&*=-;>>>>>;--=====-;>,)!{]^////^^]~!),,>;;;>>,'))~{]^(_:<[}|5fs",
+"p0[(///^^]]{!)',>;;--=----;>,'))!{]]]]]{!)'>;-=***=-;>')~]]{!),>;;>>,'',>;=*%%$$$$$$%*----======-;>,,,,,>;-=*&&&&&=-;>>,,>;;;>,,>;-=&%&->,,;;--==*&&&=---------------=*&***&%%%%&&***&&&&*====*&&%%&&*=-;>>>>>;--=====-;>,'!~]^/(((//^]~)',,>;;;;>,,')!~]^/(:|cr",
+"p0[/^]]~!)',>;;--===--;>,,')!{]]^^^]]~)',;-=***==;>')~]]]{!',>;;>,,'',>;=*&%%$$$$$%&=-;-=**====-;,,,,,,>;;=*&&&&&*=->>>>>>;;;>>,>;-=&%&=;,,>;---==*&&&=-------=-------=*&&***&%$%%&****&%%&&*===**&%%%&&=--;>,,,>;--==*===-;,')~]^/(((((/^]~)',,>;;;;;>,'))!]:0p",
+"o9:]!)',>;--====--;;>,')!~]]^^^^^]{!',;-=***=-;>')~]]]]~),>;;;>,''',>;=*%%%%$$$$$%*---==***===->,,,,,,>;;-=*&&&&&*-;>>>>>;--;>>,>;-=&%%=;,,>;-;--==*&%&=-------=-------=*&&***&%%$%%&****&&%&&*====*&%%%%&*=-;>,,,,>;--==*===-;>,)!{^^/(((((/^]~)',>;;;;;;>,'^7n",
+"n6^,>;--====--;;>,')!~]]^////^]{!',;-==*==-;>,)~]^^]]!',;;;;>,''',>-=*&%%%$$$$$%&=---=******=->,,,,,>;;;-=*&%%&&*=-;>>>,>;--;;>>>;-=&%%*;,,,;;;;-==*&%%*=;;-----=--------=*&&***&%%$%%&*==*&%%%&**===*&%%%%%&*=-;>,,,,>;--==**==-;>,'!{]^/((((((/^]~)',>;;;;;~4m",
+"m3!-=====--;>,'))~{]^//(//^^{!),;-=====-;>')~]^^^]~),>;;;;,,''',>-=*%%%%%$$$$$%*=--=*******=->,,,,,>;;;-=*&&%&&&*=;>>>>,>;--;;;>>;-=&%%*->,,>;-;;-==*&%&*-;;-----=---=----=*&&**=*&%$$$%*===*&%%%&&*===*&&%%$%%&*=-;>,,,,>;--==**==--;,')~]^/((___((/^]!)',>>~4m",
+"l2)-=--;>,,')!{]^^/(((//^]!),;-=====-;>,)~]^^^^]!',;;;;>,'')',>-=*&%%%%%$$$$%&=--==*&*****=->>>,,,>;;;-=*&&%&&&*=-;>>>>>>;--;;;>>;-=*&%*-;,',;;;;-===*&%&=-;-----===--==----=&&&*==*%%$$%%*===*&%%%&&*====*&%%$$%%&==-;>,,,,>;--==***=--;>,)!{]^/(____((/^{!!^5n",
+"m3!>;>,')!~]]^/(((((/^]!),;-=====-;>,)~]^///^{),>;--;>,'))',>-=&&%%%%%$$$$$%*=--=*&&*****=;>>>>,,>;-;-=**&%%%%&*=;>>>>>>;--;;;;>>-===&%&=;,',>;-;;-==*&%%&=-;---;-===---==---=*&&*===&%$$$%&*===*&%%%%&*====*&%%$$$%&*=-;>,,,,,>;--=****==-;>,')~]^/(_____((/<9o",
+"n5^)))!{]^/((((((/^]!',;-=====-;>,)~]^/(/^]!',;--;;>,'))',>-=&&%%%%%%$$$$%&==-=*&&&***&*=;>>>>,,>;-;--=*&%%%%&&=-;>;;>>>;--;;;;>>;-==*&&=;,',>;-;;-===*&%%&=-;---;-===---==---=*&&&*==*&%$$$%&*===*&%%%%&*====*&%%$$$$%&*=-;>,''',>;-==****==-;>,')!{]^((__::|bq",
+"o8(]]^^/((((((/]{!',;-=====-;>,)!]^/((/^{),>;--;;>,'))',>-=&&%%%%%%$$$$$%*===*&&&&***&*=;>>>>,,>;----=**&%%%%&*=->>;>>>>;--;;;;>>;--=*&&=->,',;;-;;-===&&%%&=-;---;-===---==----*&%&*===*&$$#$%&==-=*&%%%%&*====**&%$$$$%%&*=-;,,''',>;-==*****=--;>,)!{]^/(:|bq",
+"o0[((((__((/]{!'>;-=====-;>,)!]^/(((/]!',;---;>,')))',;-=&&%&&&&%%$$$$%&====*&%&&**&&*-;,>>>,,,;----=**&%%%%%&*=;>;;>>,>;--;>;;>>;---*&&*-;,',>;-;;;===*&&%&*=;;---;;-==---===---=&%%&*===*%$##$%*=--=*&&%%%&*=====*&%%$$$$%%*=-;>,,''',>;-==*****==-;>,')!{^<0p",
+"qb}:__(/^]~)'>;-=====-;>,)!]^/(((/^{),>----;>,')))',;-=&&%&&&&&%$$#$$%*===*&%%&**&&&*->,>;>,,,;----=**&%%&%%%*=->>;;;>,>;--;>;>>>;---*&&*-;,''>;--;;-===*&%%&*-;;--;;;-==---===---=*&%&*=--=&%$##$%*=--==*&%%%&*=====*&%%$$$$$%&*=-;>,'''',>;-==*****==-;;,')(8o",
+"qb}_/^]~),>;-=====-;>,)!{^/(_((/]!',;----;>,')))',;-=&&%&&&&&%%$$$$%&*===&%%%&**&&&*->,>;;,,,;----=***&%%%%%&*=;>;;;;>,;---;>;>,>;---*&&*=;>'',;;-;;;====&&%%&*-;;--;>;-==---=*==---*&%%&*=-=*&$###$&*=--==*&%%%&*======*&%$$$$$$%&*=-;>,'''',>;-==**&&**=-->]5n",
+"p0<]~),>;-=====-;>,'!{^/(__((^{),>-----;>,')))',;-=&&&&&**&&%$$#$%%*===*&%%%&**&%&*->,>;;,',;----=***&%%%%%%&*->>;;;;>,;---;>;>,>;;--=***=;>,',>;;-;>-===*&%%%&=;>;--;>;-===--=**=---=&%%%*=--=*%$##$%&=----=*&%%%&*===-==*&%$$$$$$%%&*=-;,,'''',>;-==*&&&**-)3m",
+"n7^';-======-;>,'!{]/(___(/]!'>;-==-;>,'))))',;-=&&&&&***&%$$#$$%&*==*&%%%&&*&&%&*;>,>;;,',;-=--=****&%%%%%&*=;>;;;;;,>;--;;;;>,>>;--=***=->,'',;;-;>;-===*&%&%&=;>;--;>;-===--=**==--=*%%%&*=--=&%$##$%*=-;--=*&%%&&*===-==*&%%$$$$$$%%*=-;>,''''',>;-==*&&*,1l",
+"m3!-==*==--;,')~]^(____(^{),;-==--;>,'))))',;-=&&&&*****&%$##$%%*==*&%%%%&&*&%%&=;,,>;;,',;==--=**=*&%%&%%%&*-;>;-;;>,>;--;;;;>,>>;--=***=->,'',>;;-;>;====&&&&&&=;>;--;>>-===---=**=---=&%%%*=---*&$###$%*--;;-=*&%%&&*==---==*&%$$$#$$$%&*=-;>,'')'',>;-===,1l",
+"l2'===--;,')~]^(__:_(/]!'>;-===-;>,'))))',;-=&&&&**==*&%$$#$$%&*==*&%%%%&*&&%%%=;,,>;;,',;===-=****&%%&%%%%&=->;--;;>,>;--;>;;,,,>;--=**==-;>,)'>;;-;>>-====&%&&%&=;;---;,>-=*=---=**=---=&%%%&*---=*%$###$&=-;;;-=*&%%&&*==---==*&%%$$##$$%%&*=-;,,')))',>;;)2l",
+"l2)--;>,)!]^/(_::_(^{),;-===--;>,')!!)',;-=&&&**====*&%$##$%%**=*&%%%%%&&&%%%&=;,,;-;,',;===-=***=*%%%%%$%&*=;>;--;;,,;;--;>;;,,,>;--=====-;>,'',>;;-;,;====*&%&&%*-;;--->,>-=*=---=&&*=--=*%$$%*=---=&%####$&=-;;;-=*&%%&&*==----=*&&%$$###$$%%&=-;>,'')))'']4m",
+"m4{,,)!{^/(_:::(/]!'>;-===-;;,'))!!)',;-=*&&**====*&%$$##$%&*=**%%$%%&&&&%%%&=;,,;-;>'';=*===***=*&%%%%$$%&*->>----;,,;;;-;>;;,,,,>---====-;>,'),>;;-;,,-====&%&&&%*->;--->,>-=*=---=&&*=---=&%$%&*=---*%$####%*=;;;;-=*&%%&&*==----==*&%$$###$$$%&*=-;>,'))!/7n",
+"n6/~{]/(_:::_(^{),;-====-;>,'))!!)',;-=*&&*======*&%$##$%&****&%$$%%&&&&%$%&->,,;-;>'';=**===**==&%%%%%$%%&=;>;---->,,;;;-;>;;,,,,>---===-=;>,,)'>;;;->,>=*=-*&%&&%&*->;--->,>-=*=---=*&&*=--=*%$$%&=---=*%$###$%*-;>>;-=*&%%&**==-----=*&%$$####$$$%&*=-;>,)/7n",
+"o9:/(_::::_/]!'>;-===--;>,'))!!)',;-=*&&*==---==&%$##$$%&*=**&%$$%%&&&%%$%&->,,;-->''>=**===&*==*%%%%%$$%&*->>----->,>;;--;>;;,',,>---==---;>,,)),;;;-;,,;====*%%&&%&=;>;--;,,,-=**---=*&&*=--=*&$$%%*=---=&$####$&=-;>>;-=*&&&&**==-----=*&%%$$####$$%%&==->]5n",
+"pa|::::_(^{),;-====--;>,')!!!)',;-=*&**==----=*%$$#$$%&**=*&%$$$%%&&&%$$%*-,,,;-->''>=**===&&*==&%%%%$$$%&=;>;----;,,;;;;->>;;,',,,;--==---->,,'),;;;-->,>-*=-=&%&&&%&=;>;--;,',;=**=---*%%&=---=&%$$%&=---=*%$#@##$&=;>>>;-=*&%&&**=------==*&%$$#####$$%&*-)3m",
+"qc1<:_/]!'>;=====-;>,'))!!!)'>;-=*&**==----=*&%$##$%%**==*&%$$%%&&&%%$$%*-,,,;-->''>=&&*==*&*==&%%%%%$$%%&->>-=---;,,;;;-->>;;,',',;--==-;-->,,,)'>;>;-;,,;=*=-*%%&*&%&=;>;--;,',;=&*=-;-*%%&*=--=*%$$$%*=---=&%##@#$%*=;>,>;-=*&%&&*==------==*&%$$#####$$%&,1l",
+"qb|_^{),;-=====-;>,'))!!!)'>;-=****=------=*%$##$$%&*==*&%$$$%%&&&%$$$%*;,,>-=->''>-&&*==*&*==*%%%%%$$$%&*;>;-=--->,,;;;-->>;;,','';--==-;--;,,,)),;;>-->',-*=-=*%%&*&%&->>;--;,',;=&*=-;-*&%%&=--=*&$$$%&*----*&$#@@#$%*-;,,>;-=*&&&&*==-------=*&&%$$#####%;|k",
+"p0:~'>;-====--;>,')!!!!)'>;-=****=--;;;-=*&$$##$%&*===*&%$$$%%&&&%$$$%*;,,>-=->,'>-&%&==*&&=-=&%%%%$$$$%&=>>;==--->,>;;;-->>-;'',''>--=*=;;-;,,,'),;;>;-;,';=*=-=&%&**&%*->>;--;,',;=&&=---=&%%&*=--=&%$$$%*=---=*%$#@@#$&=->,,,;-=*&%&&*==-------==*&%$$###$-}k",
+"n6]>-=====-;;,,')!!!!)'>;-=***==--;;;;-=&%$##$$%&*==*&%$$$$%&&&%%$$$%=;,,;-=-;,'>-&%&*=*&&*-=&%$%&%$#$%%*->>-=--=;,,>;;;-->>-;'',''>--===;;-;,,,,)'>;>>-->',-**--*%%&**%%*->>;--;,',;=&&=-;-=&%%%*=--=*%$$$%&*----=&$#@@@#$&=;>,,,;-=*&%&&*==-------==*&%%$$$-}k",
+"m3)-====-;>,,')!!!!)'>;-=***==-;;;;;-=*%$###$%&*===*&%$$$%%&&&%%$#$%=;,,;-=-;,'>-&%&*=*&%*=-*%$%%%$##$%&=;>;==-==;,,;;;;-->>-;'',))>---==;>;;,',,)),;;>;-;,'>=*=--*%%&*&%%*;>>;-->')';=&&*-;-=&%%%&==-=*%$$$$%*=---=*%$#@@##%*-;,,,,>-=*&%&&*==--------=*&&%%;}k",
+"l2'==--;>,'))!!!!)'>;==***==-;;;>;;-=&%$##$$%*====*%%$$$%%&&&%$$#$%=>,,;===;,'>-&%%***&%*=-=&$$%%%##$$%&->>-==-=->',;;>;-->;->'',)),---==;,;->',,')';;>>-->'';**=-=&%%**&%%*;,>;-->')';=&&*-;;-*%$%%*===*&%$#$%&*=---=&%##@@#$%*->,'',;-=*&%&&*==--------==**,|k",
+"l2);;;>,'))!!!!),>;==***==-;;>>>;-=*%$###$%&*====&%$$$$%&&&&%$##$&=>,,;=*=;,',-&%%&**&%&=--*%$%%%$##$%%=;,;=====-,'>;;>;-;>;->)',)),---==;,>;;'','))>;>,;--,),=**--*%%&**&%%=;,>--->')';=&&*=-;-*%$$%&====&%$##$%&=---=*%$#@@@#$%=->,'',;-=*&%&&**==-------=-'2l",
+"m4~,>,'))!!!!),>;==***==-;;>>>>;-*&$###$%&*=--=*&%$$$%%&&&%%$##$&->,,;=*=;,',-&%%&**&%&=--*%$$%%$###$%&->>-*====;,'>;>>--;,;->)),)),---==;,>;;,',,)),;;>>-->'';*&=--&%%&=*%%&=>,>-=->')';=&&*=-;-*%$$%&*===*%$$#$$%*=---=&%$#@@@#$&=;,''',;-=*&%&&**==------;)2m",
+"n5])')!!!!)),>-=****==-;;>>>>;-=&%$###$%&==--=*%$$$$%%&&&%%$##$&-,,,-**=;,',-&$$%**&%%*--=&$$%%%$##$$%*;,;=*====;',;;>>--;,>;,)),)),---==-,,;;,),,')';;>,;--,),-&*--=%%%*=*%%&->,>-=->))'>=&%&=-;-=%$$$%*===*&%$##$%&==--=*&$#@@@##%&=;,')',;-=&&%%&**==----;!3m",
+"n7/!!!~!!),>-=****==-;>>,,>>;=*%$###$%&*=--=*&%$$$$%&&&&%$$##$*-,',-**=;,',-&$$%&*&%%&-;-*$$%%%$###$%&=>,-=*==*=>',;;>>-->,>;,)),)!,---=*-,'>;,)','))>-;,>--;))>=&=--*%$%*=&%%&->,;-=->)))>=&%&=-;-=&$$$%&*===&%$##$$%*=---=&%$#@@@#$%*->,')',>-=&&%%&**==--;!3m",
+"o8({~!)),>-=****==-;>>,,,>;-*&$###$$%*=---=*%$$#$$%&&&&%$###%*;,,>-*&=;,',-&$$%&*&%%&=--=%$$%%%#@#$$%*;,>=*===*-,'>;;,;==>,;-,!),)!,-=-=*-,),;>'),,)),;;>,;=-,)'-&&=--&%%&==&%%&->,;-=-,)!)>=&%&=-;-=&$$$$%*===*%$###$%&*=--=*&$##@@@#$%*->,))',;-=&&%%&**==-!3m",
+"o9_{!),>-=****==-;;>,,,>;-=&%$###$%&=----=&%$##$%%&&&&%$###%*;,,>-*&=;,',;*$$$&*&%%%=-;=%$$%%%$#@#$$%=>,;=*==*=;,'>;>,;=->,;-,!),)!'-=-=*=,),;;'),,')';->,>-->))>=&*--=%$%*==&$%*;,,;-=;,)!)>=&%&*-;;=&%$$$%&*==*&$$##$$%&==--=*%$#@@@@#$&=->'))',;-=&&%%&&*-)2m",
+"o8(),;-=**&*==-;>>,,,,>;=*%$###$%&*=-;--=&$$#$$%%&&&%%$###%=;,,>=*&=;,',;*$$$%&&%$%*-;-&$$$%%$#@##$%&-,>-**==*=;',;;>,;=->,;-,!),)!'-=--==>)';;,)',,))>-;,,;--,)'-&&=--*%$%*=*%$%*;,>;==;,)!)>=&%%*=-;-*%$#$%&**=*&%$###$%&*=--==&%##@@@@#$&=;,'))',;-=&%%%&*'2l",
+"n6]>-=**&*==-;>>,,,,>;-*%$####$%*=-;;-=*%$##$$%&&&&%$$##$%=;,,;=&&*-,',;*$$$%&&%$%&-;-*%$$%%%$@@#$$%=;,;=**=**=>',;;,,;=->>--'!),)!);---==;))>;,)),,)),;->,>-->)),=&&=-=&$$&==*%$%=;,>;==;,)!)>=&%%*=-;-*%$#$$%&***&%$####$%&*=--=*%$#@@@@##%*=;,'))',;-=&%%&,1l",
+"m3!-**&*==-;>>,,,,,;-=&%$###$%&*-;;;-=&%$##$%%&*&&%$###$%=;,,;=&&*-,',;*$#$%&&&%%&=;;=%$$$%%$#@@#$$&-,,-**==**-,'>-;,,-=->>--'~),)~);---==;)!,;>)),>'!);-;,,;=-,));&%*--=%$%&==&%$%=;,>-==;,)!),=&%%&=---=%$##$%&&**&%$####$%%*==-==&%$#@@@@#$%*->,)))',;-=&*,|k",
+"l2'=&*==-;;>,,,,,>;=*%$####$%*=-;;;-*%$###$%%&**&%$###$%=;,,;=&&*-,'';*%##$&&&%$%=-;-&$#$%%%#@@##$%*;,>=**==**;'';-;,>-=-,>--'~),)~)>---=*-'!';>)!'>,)),-;,'>-=;)!,=&&=--*%$%*-=&$$&->,>-==;,)!),=&%%&=---=&$##$$%&**&%%$####$%&*====*&$#@@@@@#$%*->')))',;-=,1l",
+"l1,=*=-;;>,,,,,>;-*%$####$%&=-;;;;=*%$##$$%&&**&%$###$&=;,>-*&&*-,''>=%##$%&&%$%*-;;*%#$%%%$@@@#$$&->,;*&*=*&=>',;->,>==;,>--'~),)~!>---=*-'!)>;'!),,)!';->',;=-,!);*%*-;-&$$%=-=%$$&->,>-==;,)!),=&%%&*---=&$###$%&&**&%$####$%%*=====&%$#@@@@@#$&=->')))',>!2l",
+"l2'--;;>,,,,,,;-=&$####$$&*=;;>;-=&$###$$%&**&%%$#@#$&=>,>-*%%*->''>=%##$%&&%$$&-;;=%##$%%$#@@##$%*;,>-&*==*&-,',-->,;==;,>--){),){~,---=*-,!)>;,!),>'!)>-;,'>-=;)!'-&&=--=%$$&=-*%$$&->,;-==;,)!),=&$%%*---=&$###$$%&&&&%$#####$%&*====*&%$#@@@@##%&=;,'))))^5m",
+"m3!;;>,,,',,>;=*%$####$%&=-;>>;-*%$###$%&&**&%$##@#$&->,>-*%%*->''>=%##$%&&%$$%=;;-&$#$%%%#@+@#$$%=>,;=&*==**-,'>-;,,;*=;,>-;){),){~,---=*=,!!,;>)!'>,)!,-->',;=-,!)>*%&=;-*%$%*--*%$%*;>,;-==;,)!),=&$$%*=--=*%####$%&&&&%$#####$$%&*====*%$#@@@@@#$%*=;,')!(7n",
+"m4{,,,,'',>;-*%$####$%&*-;>>>;=&$####$%&***&%$##@#$&->,>-&%%*->''>=%###%&&%$$%*-;-*$##$%%$#++@#$$*;,,-*&==*&*;'';-;,,;*=>,;=-){),)]{,---=*=>!~';>)!'>,)!';-;,'>-=;)!'-&%*-;=&$$%=-=&$$%*;,>;===;,)!),-&$$%*=--=*%$###$$%&&&%$$##@##$%&*====*&%$#@@+@@#$%*-;,)(8o",
+"n5]','',,;-=&$#####$%*=-;>>;-*%$####$%&***&%$#@@#$&->>;=&%%*->''>=%###$%&%$$%*-;;=%##$%%$#@+@#$$%=>,>=&&==*&=>',;-;,,-*=>,;=;){),)]]'----*=;!{);;'!),>'!)>--,)';=-,!!>*%&=--=%$$&=-=&$$%=;,>;===;,)!),-&$$%&=---*%$###$$%%&&%%$##@@#$$%&*====*&%##@++@@#$%*->^6n",
+"n5^)',,>;=&%$####$%&=-;>,>;=&%####$$%**=*&%$#@@#$*-;>;=&%%*->,'>=%###$%&%$$$&=;;-&$##$%%$@++@#$$&-,,;*&*==*&-,',-->,,-*=>,;=;){),)]]'----**;){)>;,!!,>,!!,--;''>-=;)~)-&%*-;-*%$$*--=%$$%=;,>-===;,)!),-&$$%&=---*%$#@##$$%%%%%$##@@##$%&*=====*%$#@@++@##$&=!4m",
+"n6^),>;=*%$####$$%*=;>,,>-=&$####$%&*==*&$##@@#%*-;>;=&%%*->,'>=%###$%&%$$$%=;;-*$##$%%$#++@#$$%=;,>-&&==*&*-,'>-->,>=&=>,-=;)~),']]'-=--**-'{!,;,)~'>>)!);-;,)';=-,!!,=%%*-;-&$$%*--*%$$&=>,>-===;,)!),-&$$%&*=--=&$####$$%%%%%$##@@@#$$%&*====*&%$#@+++@##%,1l",
+"n6^,;-*%$#####$%&=-;>,>;-*%$###$$%&*==*%$#@@@#%*-;;-*%%%*->,'>-%###$%&&%$$%*-;;=%##$$%$#@++@#$$&-,,;*&*==*&*;'';--,';*&->,-=;)~)>'{]'-=--=*-'{{';>)~)>>'!!,-->))>-=;)~);&%&=;-=%$$%=--*$#$&->,>-=*=;,)!),-&$$$%*=--=&$##@##$$%%%%$$#@@@##$%%&*====*&$##@++@@$;|k",
+"n5{;=&%#####$%%*=;>,,>;=&$####$$%*==*&%$#@@@#%*-;;-*%$%*->,'>-&#@##%%&%$$$&-;;-%###$%%$@++@##$%*;,,-&&*==*&=>',;=;,,;**->>-=;)~'>'{]'-=--=*=,{]);;'~!,;,!!';=;')';=-,!!,=%%*-;-*$$$&-;=&$#$&->,;-**=;,)!),-&$$$%*=--=&%#@@@##$%%%%$$#@@@@#$$%&*=====&%$#@@++#-}k",
+"m3)=%$#####$%&=->,,,;-*%$####$%&*==*&%$#@@@#%*-;;-*%$%&=;,,>-&$###$%&%$$$&=;>-*$##$%%$#+++@#$$&->,>=&&=-=&&-,',-=;,,-**-,>=*;)~'>'{])-=--=*=>~])>;,!~';>)!)>--,))>==;)~);&%%=-;=&$$%*--=%$#$*->>;=**=;,)!),-&$$$%&==-=&%#@@@##$$%%%$$##@@@##$%%&*====*&%$#@+@=[j",
+"l1>%##@##$%&*-;>,,>;=&$##@##$%&====&$#@@@@#%*-;;=&%$%&=;,,>-&$#@#$%&%$#$%=;>;=$###$%$#@++@##$$*;,,;*&*=-*&*;,'>-=;,,-&*;,;=*;)~'>,{])-=---*=;!]!>;,!~)>;'!!,-->))'-=-,!!,=%$&=;-=%$$%=--=%##%*->>;=**=;,)!),-&$$$%&*===*%$#@@###$$%%%$##@@@@#$$%&*=====*%$###=[j",
+"k};$###$$%*=->,,,>-=%$####$$%*===*&$#@@@@#%*-;-=&%$%&=;,,>-&$@@#$%&%$#$%*-;;=%#@#$$%$#+++@#$$%=>',-&&=-=*&*;'';=->,,=&*;,;=*;)!'>,~]);=-;-**;)]{,;>){)>;,!!';=-,))>==;'!);&$%*-;-*$$$&=;-*$#$%=;>>;=**=;,))),-&$$$%&*===*%$#@@@##$$%%%$$#@@@@##$%%&*====*&%$$-[j",
+"k}-###$%&=-;>,,,;=&%##@##$%&*===*%$#@@@@$%*-;-=&$$%&=;,,>-&$@@#$%&%$##$&-;>-&$@##$%$#@++@##$$&-,';=&&=-=&&=>',-=->,>=&*;,;**;)!'>,~]!;=-;-**-)]]';;'~!,;>)!)>=->)!,-=-,)!'-%$%=;;=&$#$*-;-&$#$%=;>>-=**=;,)))>-&$$$%&*===*%$#@@@###$$%%$$##@@@@#$$%&**====*&%;}k",
+"k}-$$$%*=;>,,,>-=%$#@@##$%&====*%$#@+@@$%*---*%$$%&=;,,>-&$@@#$%%%$##$&=;;;*$#@#$$$#@+++##$$%=>',-&&*--=&&-,',-=-,,;*&=;,;**;)!,;,~]!;=-;-=*-']]);;,!~';;'!!,-=;'!)>==;'!)>*$%&-;;=%$$%=;;=&$#$&=;>>-*&*=;,)))>-&$$$$%*===*%$#@@@@##$$$$$$##@@@@##$%%&*======,|k",
+"k};%%&=-;,,,,;-*%$#@@##$%*=--=&%#@@+@#$%*--=*%$$%&=;>,>-&$@@##%%%%$#$%*-;;=%#@##$$$#+++@#$$$&-,'>=&&=--*&*;,'>==;,,;*&=>,-**;)!,;,~]!>=---=*=,{^!>->!{)>;,)!';=-,)!,-=-,)!'-%$%*-;-*$$$&=;;=%$#$&-;>;-*&*=;,')'>-&$$$$%&*==*&$#@@@@###$$$$$##@@@@@#$$%&&*===-)2l",
+"k|>**=;>,,,>-=&$##@##$%&*=-==&$#@@+@#$%*=-=*%$$%&=;>,>-*$#@@#$%&%$##%*-;;-&#@@#$$$#@+++##$$%=;'';*&*---*&=;'';==;,,-&&=>,-**;)!,;,!]~>==--=*=>~^~,->){!,;>)~!,-=;)!)>==;'!)>*$$&=;;=&$#$&-;-*%##$*->>;=*&*=;,')'>-&$#$$%&*==*&%#@@@@@##$$$$$$##@@@@##$%%&*==-)3m",
+"l1'--;,,,,;-*%$#@@##$%&=--=*%$#@++@#$%*===&%$$%&=;>,>-*$#@@#$%&%$##$&=;;-*$@@##$$#@+++@#$$$&-,',-&&=-;=&&=>',-*=;,,-&&=>>-&*;)!,;>!]~>==-;=*=;!^]';;'~~,;;'!!'-=-,!!,-=->)!'-%$%*-;-=%$$%*-;-&$##%*->>;=&&*=;,')'>=&$##$%&*==*&%#@@+@@###$$$$$##@@@@@#$$%&&*-)3m",
+"l2!>>,',>;=&$##@@##$%*=--=*%$#@++@#$%*==*&%$$%&=->,>-*$#@@#$%%%$##$%=-;;=%#@@#$$$#++++##$$%*;,'>=&&=;-=&&-,',-*->,>=&&->>=&*;)!,;>!]{,==-;-**;)]]);;,!{);;,)~);=->)~);==;'!!>*$$%=;;-*$$$%=;;=&$#$%*->>-=&&*=;,')'>=&$##$%&**=*&%$@@++@@###$$$$##@@@@@##$%%&='2m",
+"m4]',,,;-*%$#@@##$%&*=--=*%#@+++@#$%*==*%$$$%&=->,>-*$#@@#$%%%$###%*-;;=%#@@##$$#@+.+@#$$$%=>',-*&*-;-*&*-,';=*->,;=&&->;=&*;)),;>!]{,==-;-**-']^);->!{)>->)~!,-=;'~!,-=->)!'-&$$&=;;=&$#$&=;;=%$#$%=->;-*&&*=;>'',>=&$##$%%&*=*&%$#@++@@###$$$$$##@@@@##$$%*,2l",
+"n5^',>;=&$##@@##$%&=---=&%#@+++@#$%*==*%$$$%&=->,>-*$#@@#$%%%$###%*-;;-&$@@@#$$#@+..+##$$$*;,',=&&=;;-&&=;,,;=*->,;*%*->;=&*>)),->)]],==-;-=*=,]^~>-;){!,-;,!~';=-,!~);==;'!!,=%$%*-;-*%$$%*-;;=%##$%=;>;-*&%*=;>,',>=&$##$$%&***&%$#@+++@@###$$$$##@@@@@##$%>1l",
+"n6^'>-*%$#@@@##$%*=---=&$#@+++@#$%*=*&%$$$%&=->,>;*%#@@#$%%%%$##$&=;;-*$@@@##$##++.+@#$$$%=>'';*%&-;;=&&=>',-**-,,-&%*->;*&*>))>-;)]],==-;-=*=,{^{,-;'~~';-,)~)>==;)~!,-=->)!);&$$%=;;-&$$$%=;;-*$##$&=;>;-*%%&=->,',;=&$##$$%&***&%$#@+++@@###$$$$###@@@@@#$;|k",
+"n5]>=&$##@@##$%&*=--=*%$#@+++@#$%***&%$$$%&=->,>;*%#@@##$%%%$##$%*-;;=%#@@@#$$#@+..+#$$$$&-,),-&%*->;=&&->'>=*=;,,-&%*->-*%*>))>-;)]]'==-;;=*=>~^]';-,!{);->)~!,-=-,!{);==;'!),=%$$&-;;=%$#$&=;;-&$##$&=;>;=&%%&=->,',;=&$##$$%&&**&%$#@+++@@@###$$$$##@@@@@$-}k",
+"m4!=%$#@@@##$%&=---=*%$@@+++@#$%&**&%$#$%&=-;>>;*%#@@##$%%%$###%*-;;-&#@+@##$#@++.+@#$$$%=;''>=%&=;>-*%*-,,;=*=;,>=%%*;>-*%*>))>-;)]]'-*-;;-*=;!^^);->){!>-;,!~);=->){!,-=->)!);&$$%*-;-*%$$%*-;;=%$##$&-;;;=&%%&=->,,,;=&$##$$%%&**&%$#@++++@@###$$$$##@@@@#-}k",
+"l2,%##@@##$$%*=---=&%#@++++@#$%&*&%$##$%&=-;>>-*%#@@@#$%&%$###$&=-;-*$@+@#####++..+#$$$$&-,)';*%*->>-&%*;,,;*&=;,>=%%=;;-&%=>))>-;)]]'-*=;;-**;)^^!>-;){~,-->)~!,-=;'~{);==;,)),=%$$&=;;-&$$$%*-;;=%###%*-;;-=&%%&=-;,,,;=&$##$$%%&***&%#@@+++@@###$$$$$##@@#=[j",
+"k|;$@@@##$%&*----=&$#@++++@#$%&&&%$##$%&=-;>>;=%#@@@#$%%%$###$&=-;-=%#++@####@+..+@#$$$%*;'),=&&=;>;=&&=>,,-*&=>,;*%%=;;=&%=>))>-;)]^)-*=;;-**-']^{,-;'~{';-;'~~'-=-,!{!,-=->'!);&$$%*-;;=%$#$&=;;-*$##$%*-;;-*%%%&=-;,,,;=&$###$%%&**&&%$#@+++@@@###$$$$##@#=[j",
+"k}-#@@##$%*=----*%$#@++++@#$%&&&%$##$%&*-;>>-=%#@@@#$%&%%###$%*-;;=%#++@@###@+...+#$$#$&->)';*%&->,;*%&->,>=&*->,;*%&=;;=%%=>));-;']^)-*=;;-=*=,{^],--,!{);-;,!~);==;){{);==;,)),=%$$%=;;-*%$$$&-;;-&$##$%*-;;-*%%%&=-;>,>;=&$###$%%&&**&%$#@++++@@###$$$$###-[j",
+"k[-#@#$$%*=-;-=*%#@+++++@#$%&&%%$##$%&*-;>>-=%#@@@#$%%&%$###%&=;;-&$@++@###@++..+@#$$$%*;')'-&%*-,,-*%*-,,;=&*->,-&%&=;;=%%=>)';=-']^)-*=;;;=&=>~^]'-->){!,-->)~!,-=-,!]~,-=->')';*$#$&=;;-&$#$%*-;;=&$##$%=-;;=*%$%&*-;>,>;=&$###$$%&&*&&%$#@++++@@###$$$$$$-}k",
+"j[-$#$%&*----=&%#@+++++@#$%%%%$$##$%&*-;;;-=%#@@@#$%%&%$#@#$&=-;-*$@++@@###@+...@#$$#$%=>')>=%&=;,>-&%*;,,;*&*;>>-&%&-;-*%%=>)';=-']^!;*=-;;=*=>!^^);-;){~'-=;'~~';=->)]]);==;,)),-%$$%*-;;=%$$$%=;>;=%###$&=-;;=&%$%&*-;>>>;=&$###$$%%&&&&%$#@++++@@@###$$$$;}k",
+"k}-$$%&=----=&$#@+++++@#$%%%%$###$%&*=;;;-=%#@@@#$%%&%$#@#$%*-;-=%#+++@###@+...+@$$$$$&-,)';*%&->,>=%%=;,,-&&=;>>=%%*-;-*%%=>)';=-,{^!;*=-;;-**;)^^!>-;'~{);=-,!~)>==;'~]~,-=->')';*$#$%=;;-*%$$$&=;;-*%###$&=-;-=&%$%&*=;;>>-=&$###$$%%&&&&%$#@@++++@@###$$%;}k",
+"k};%%*=-;--*%$#@+++++@#$%%%%$###$%&*=;;;-=%#@@@#$$%%%$#@@#%*=--=&#@++@@##@++..+@#$$#$%=>'),-&%=;,,;*%&=>,>=&&=;>;=%%*-;-*%%=>)';=-,{^!;*=-;;-**-']^{,--,!]!>=->)~!,-=-,!]]);==;,)),-%$#$&-;;-&$$$%*-;;-&$##$%&=-;-*%$$%&*=-;>;-=&$###$$%%&&&&%$#@@++++@@###$%;|k",
+"k|>*=--;-=*%$@++++++@#$%%%$$###$%&*=;;;-=%#@@@#$$%%%$#@@#$&=---*$@+++@##@@+. .+#$$$#$&-,))>*%&=>',-&%*-,,;=%&=;>;*%%*-;-&%%=,)';=-,~^!;=*-;;-**-,]/],-->){~,-=;'~~);==;){]!,==->')';*$#$%=-;;=%$$$%=-;;=&$##$%*=;;-*%$$$&*=-;>;-=&$###$$%%&&&&%$$#@++++@@###$;|k",
+"l1'---;-=&%#@+++++@@#$%%%$$###$%&*=-;;-=%$@@@##$%%%%#@@#$&=---*%#+++@@##@+.  +@#$$#$%=;')'-&%*-,',=%%*;,,;*%&-;>-&%%*-;=&$%=,)';=-,~]~>=*-;>-=*=,{^^)--;){{'-=-,!~!>-=;,~]]);==;,)),-%$#$&=;;-*%$$$&=;;;=%###$%*=--=*%$$$%*=-;;;-=%$###$$$%%&&&%%$#@++++@@@#$;}k",
+"l2);;;-=&$#@+++++@@#$$%%$$###$%&*=-;;-=%$@@@##$%%%%$#@#$%*---=%#+++@@##@++. .+#$$$#$&-,)),=%&=;''>*%%=;,>-&%*->>-&%&=--=%$%=,),-==>~]~>=*-;>;=*=>!^^!;=;'~{);=->)~~'-=->)]]!>==->')';*$#$%*-;;=&$$$%*-;>-*%###$%*---=&%$$$%*=-;;;-*%$####$$%%&&&&%$#@+++++@@$-}k",
+"m3~>;-*%$#@+++++@@#$$%$$####$%&*=-;;-=%$@@@##$%%%%$#@@#%&=--=&$@+++@@@@++. .+@#$$$$%*;'));*%&->'';&%&=>,>=%%*->;=&%&=--=%$%=,),-==>!]~>=*=;>;=*=;!^/~>--,!{!>==;'!~)>==;'{^]';==;,'),-&$#$%=;;;=%$$$%*->;-*$###$%*---=&$$$$%*=-;;;-*%$####$$%%&&&&%$#@@++++@#-}k",
+"m4~;=*%$#++++++@##$$%$$####$$%*=-;;-=%#@+@@#$%%%%$#@@#$&=---*$@+++@@@@@+.  .+#$$$#$%=>)),-&%*;,),-%%&->,;*%%*->;=%%&=--*%$%=,),-*=>!]~>=*=;>;=**;)^/{,-->){~,-=-,!~!,-=-,!]^!>==->,)'>=%##$&=;;-*%$$$&=;>;=&$###$%*---=&$##$%*=-;;--*%$####$$%%&&&&%$#@@++++#=[k",
+"m4!-&%#@++++++@##$$$$$####$$%*=-;;-=%$@@@@#$%%&%$#@@#$%*---=%#++++@@@@++. .+@#$$##$*-,))>=%&=>')>=%%*-,,;*%&=;>;*%%&=--*%$%-,',-*=>!]{,=&=;>>-**-']/]'-=;'~{);==>)~~';==>)]^]'-==;,'',-&$##%*-;;=&$$$%*-;>;=%$###$&=---*%$##$%&=--;-=*%$####$$%%&&&&%$$#@+++@=[j",
+"m2'*$#@++++++@##$$$$$####$$%*=--;-=%$@@@@#$%%&%$#@@@$%*=--=&$@++++@@@++.  .+#$$$#$%=>)!';&%&-,));*%%=;,>-&%&=;>-*%%*=--*%$&-,',-*=;!]{,=&=;>>-**-,{/^);=;'~{);==;'!{)>==;,~^^!>==->,''>=%##$%=;;;=%$$$%*-;>;*%####$&=---*%$##$%&=--;-=*%$####$$%%%&&&%%$#@++@=[j",
+"l1>%#@++++++@##$$$$#####$$%&=--;-=&$@@@@#$$%&%%$@@@#%&=---*$@++++@@@++.. .+@$$$##$&-,)),=&%*;')'-&%&=>,>=%%&=;;-&%%*=-=&$$&-,',-*=;)]],=&=->>;=*=,~//!;=-,!{~,==-,)~!,-=->)]^]'-==;,'',-&$##$&-;;-*%$$$&=;>;-*$####%&=--=*%$##$%&==---=*%$####$$%%%&&&&%$#@+@=[j",
+"k|;#@++++++@##$$$$#####$%%*=----=&$#@@@#$$%&%%$#@@#$&*=--*%#+++++@@++..  .+#$$$#$%=;'!);*%&=>)),=%%&->,;*%%&-;;-&%%*=-=&$$&-,',-*=;)]]'=&*->>;=*=>!^/{>-->){{'-*=>)~~);==;'{^]!>==-;,''>=%##$%*-;;=&$$$%*=;>;-&$###$%&=--=&%###$%&*=---=*%$####$$%%%&&&&%$#@#=[j",
+"k}=@++++++@##$$$$##@##$%%*=----=&$#@@@#$$%%&%$#@@#$%*=--=%#+++++@@+++.  .+@$$$##$&-,)!'-&%*-,))>*%%*-,,;*%%*-;;=%%%*=-=%$$&-,',-**;)]]'-**->>;=&*;)^/],-=;'~{);==;'!{!>==-,!]^{'-==;>'',-&$##$&=;;-=%$$$%*-;>;=%$###$%*=--=&$###$%&*=---=*%$####$$$%%&&&&%$#$=[j",
+"j[=@+++++@##$$$$##@##$%%*=----=&$#@@@#$$%%&%$#@@#$%&=--=&$@+++++@+++.   +@#$$$#$%*;'!)>=%%=;)!);&%%=;,>-&%%*-;;=%$%*--*%$$&-,',-**;)]])-**->>;=**-']/]'-=;,!]!>=*-,)~~'-==;)]^^!;==-;,''>=%###%*-;;-&$$$$&=->>;=%$###$%*=--=&$###$%&*=---=*%$####$$$%%&&&&%%%-}j",
+"j[=@++++@##$$$$##@##$%%*==---=&$#@@@##$%%&%$#@@@#%&==-=*$@+++++++++..  .+#$$$##$&=>)!';&%&=,)!,-%%&=;,>=%%&=-;-*%$&=-=*%$$&-,'>=&*;)]])-**-;>>-**-,]/^);=-,!{~,-*=>)~{);==-,!^^{,-==;>,',;*$##$%=;;;=%$#$%&=;>>-*%####$%*=--*%$###$%&*==--=*%$#####$$%%&&&&%&;}k",
+"j[=@++@@##$$$###@##$%%&==---=&$#@@@##$%%&%%#@@@#$&*=--=%#++++++++++.   .@#$$$##%*;,!!,=%%*-'!!>=%%&->,;*%%&=;;-&%%&=-=*%$$&-,'>=&*;)]^)-**=;,>-**-,{//!;=->){{)-*=;'!{!,-==>)]^]);==-;,''>=%###$&-;;-*%$#$%*-;>;-&$####$&*=-=*%$###$%&*==-==*%$#####$$%%&&&&*>|k",
+"j[=@+@@#$$$$###@##$%%&==---=&$#@+@##$%%&%%$#@@#$%*=--=&$@+.+++++++.   .+#$$$$#$%=>)!);*%%=>)~);&$%*->,;*%%&=;;-&$%&=-=*%$$&-,'>=&*-']^!;**=;,>-**=>!//{>==;'~]);=*-,){~';==;'~^^{,-==;>,',;*$##$%*-;;-&$$$$&=-;>;=&$###$%&=--=*%$###$%&*==-==*%$#####$$%%&&&*,1k",
+"j[=@@##$$$$##@@##$%%&*=---=&$#@+@##$%%%%%$#@@#$%&==-=*$@+.+++++++.    .@#$$$##$*-,!!'-&%&-,!~'-%$%=;,>-&$%&-;;=&$%*=-=&$$$&-,'>=&*-']^!;*&=;>>;*&=;)^(],-=;,!]~,=*=>)~{)>==-,!]^]);==-;,''>-%###$&=;;;=%$#$%&=;>>;=%$###$%&=--=*%####$%&*==-==*%$#####$$%%%&*,1l",
+"j[=###$$$$##@@##$%%&*=---=&$#@+@##$$%%%%$#@@@#%&*=--*%#+..+++++++.   .+@$$$##$%=;'!)>=%%*;'!!,=%$&=;,>=%$%*-;;=%$%*===&$$$*-,'>=&*-']^!;*&=;>,;=&*;)^(^'-=-,!]{'-*=;'!{!,-==;){^^{,-*=;>,',;*$###%*-;;-*%$#$%*=;>>-*%####$%&=--=&%#@@#$%&*=====*%$#####$$%%%*,1l",
+"j[-$#$$$$##@@##$%%&*=---=&$#@+@@#$$%%&%$#@+@#$%*=--=%#++.+++++++.    .@#$$$##$&-,)!';&%&=>)~);*%%&->,;*%$%*-;;=%$%*=-=&$$$*;,'>=&*-']^!;*&=;>,;=&*-']/^);=->){]);**-,){{);==-,!^/]);==-;,',>-&$##$%=-;;-&$$$$%*-;>;-&$####$%&=--=&$#@@#$%&*=====*%$#####$$%%&,1l",
+"k}-$$$$$##@@##$%%&*=---=&%#@+@@#$$%%&%$#@+@#$%*=--=&$@+.+++++++.    .+#$$$##$%*;'!!,=%%&-,!~)-&$%*-,,;*%$%=-;-*%$%*=-=&$$%*;,'>=&*-']^~;*&=->,;=**-,{//~>==;'~]!>=*=>)~{!,=*->)]^^~,-*=;>,',;=%###$&=;>;=%$#$%&=-;>;=&$####$%*=--=&$#@@#$%&*=====*%$#####$$$&,1l",
+"k};%$$$##@@##$%%&*=---=&%#@+@@#$$%%&%%$#@@#$%&=--=*%#+..+++++++.    +@#$$$##$&=>)!);*%%*;'~~,=%$%=;,,-&$$&=;;-&%$&====%$$%*;,'>=&*-,{^~>*&*->,>-**=,~/(],==;,!]~,-*=;'!{~'-==;'~^/]);==-;,''>-&$##$%*-;;-*%$#$%&=;>>;=%$####$%*=-=*%$#@##$%&*=====*%$#####$$%>|k",
+"k|;%$$##@@##$%%&*=---=*%#@++@##$%%&&%$#@@@#%&*=--=%#++.+++++++.    .+#$$$###%*;,!!'-&%&=>){!>*$$&=>,>=%$%&=;;-&$$&===*%$#%*;,'>=&&-,{^~>*&*->,>-*&=>!^(]'-=-,){{);**-,){{);=*-,)]/^~,=*=;>,',;=%###$%=;;;=&$#$$%*-;>>-*%##@#$$&*=-=*%$#@##$%&*=====*%$#####$%>|k",
+"k|;%$##@@##$%%&*=---=*%#@++@##$%%&%%$#@@@#$%*=--=&$@+.+++++++..    +@#$$$##$&=>)~!>=%%*-,!{);&$%&->,;=%$%*-;;=%$%&===*%$#%*;,'>=&&-,{^{,*&*-;,>-*&=;)^(^)-=->){]!>=*=>)~{!,-*=;'{^/]';==-;,,',-&$###%&-;>;=%$#$%&=-;>;-*$####$%&*=-=*%$#@##$%&*=====&%$#####$;|k",
+"k|;%##@@##$%%&*=---=*%#@++@##$%%&&%$#@+@#$%&==-=*$#+..+++++++.    .+#$$$###%*-,!~);*%%=;)~~'=%$%*-,,;*$$%*-;;=%$%&===*%##%*;,'>=&&-,{^{,=&*-;,,;=&*;'](/!;==;'~]~,=*=;'!{~';==-,!^/^!>=*=;>,',;=%###$%*-;;-*%$#$%&=-;>;=&$####$%&==-=*%##@##$%&*=====&%$####$;}k",
+"k};$#@@##$%%&*=---=*%#@++@##$$%%&%$#@+@#$%&*=--*%#+..+++++++..    +@#$$$##$%=;)~!,-%%&=,!{!>*$$%=;,,-&$$%=-;;=%$%*===&$##%*;,'>=&&-,~^],=&&=;,,;=&*-'](/~>==;,!]{'-**-,){{)>=*=>)]^/]'-*=-;,,,,-*$###$&=;>;-&$#$$%*=;>>;=%$####$%&=--=*%#@@##$%&**====*%$###$-}k",
+"k}-#@@##$%%&*=---=*%$@++@##$$%%&%%$@@@@#%&*=--=&$@+..++++++..    .+#$$$###$&-,)~)>*%%*-'~{);&$$&=>,>=%$$&=-;-*%$%*===&$##%=;,'>=&&-,~^],=&&=;,,;=&*-,~/(],==-,){]);*&=>)~{~,-*=;'~^/^!>=*=->,',>=%###$%*-;>;=%$#$$%*-;>>-=%$####$%&=--=&%#@@##$%&**====*%$##$-}k",
+"k}-#@##$%%&*=---=*%$@+++@#$$%%&%%$#@+@#$%*=--=*$@+..+++++++.     +@#$$$##$%=;'!~'-&%%=;){{'-%$%*->,;=%$%&=;;-*$$%*===&$##%=;,'>=&&=,~^]'=&&=;>,;=&&=>!/(^'-=->){]!>=&=;,!{{);=*->)]//]'-*=-;,,,,;*$###$%=;>;-*%$#$%&=-;>;-*%##@##$%*=--=&$#@@##$%&**====*%$#$-}k",
+"k}-###$%%&*=---=*%$@+++@#$$%%&&%$#@+@#$%&=--=*%#+..+++++++..    .+#$$$$##$&->)~!,=%%&-,!{!,=%$%*;,,;*%$%*-;;-&$$%*===&$#$%=;''>=&&=,~^]'-&&=;>,>-*&=>)^(^);==;'~]~,-&*-,){{!>=*=;'~^/^!>=*=->,',>-&$###$&=;>;=&$#$$%*=;>>;-&$####$$%*=--=&$#@@##$%&**====*%$$-}k",
+"j[-$#$%%&*=---=*%$@+++@##$%%&&%$#@+@#$%&*=--=&$@+..+++++++.     +@#$$$##$%*;'!~);*%%*-'~{);&$$&=;,,-&$$%*-;;=&$$&*===&$#$%=;,';=&&=>!^])-&&=->,>-*&=;)](/!;==;,!]{);*&=>'~]~'-**-,!]//{,-*=-;,,',;*%###$%*-;>;=%$#$$%*-;>>;=&$####$%&*=--=&$#@@##$%&**====*%%;}k",
+"k}-$$%%&*=---=*%$#+++@##$%%&&%$#@++@#$&*=--=&$@+..+++++++..    .+#$$$$##$&=>)~!,=%%%=;){{'-%$%&->,>-&$$%=-;;=%$$&===*%$#$%=>'';=&&=>!^^)-&&*->,,-*&*;'](({>==-,){]!>=&=;,!{{);=*=>){^/^);=*=->,',>-&$###$&=;>;-*%$#$%&=-;>>-=%$#@##$%&*=-=*%$#@@##$%&**====**>|k",
+"k};%%%&*=----*&$#+++@##$$%%&%%$@@+@#$%*=--=*%#+..++++++++.     +@#$$$##$%*-,!~)>*%%&-,!]~,=%$%*->,>=%$$&=-;;=%$%&===*%$#$%=>'';=&&=>!^^)-&&*->,,;=&*-,{/(],=*->)~]~,=&*-,){]!,-*=;,!^//{,-**-;,,',;=%####%*-;>;=&$##$%&=-;>;-*%##@##$%&=--=*%$#@@##$%&**=====,|k",
+"k|;&&&*=----=&$#@++@##$$%%&%%$#@+@#$%&==--=%$@+..+++++++.     .+#$$$###$&=>)~~'-&%%*;'~]);&$$%=;,,;*%$%&=;;-*%$%&===*%$#$&=>'';=&&=>!^^!;&%*->,,;=&*-,~/(^)-==;'~]{'-&&=>'~]~';**->)]//^);=*=->,',>-&$###$%=->>;=%$#$$%*=;>>;-&$#@@##$%&=--=*%$#@@#$$%&**===-'1l",
+"k|>***=----=&$#@++@##$$%%&&%$#@+@#$%&*=--=&$@+..+++++++..     +@#$$$###%*-,!~!,=%%&=>){{)-%$$&=;,,;&$$%*=;;-*%$%*===*%$#$&=>'';=&&=>!^^!;&%*-;,,;=&&=>!^(/);==;,!]]);*&=;,!{{)>=*=;'~^//~,=**-;,,',;=%####$&=;>;-*%$#$%&*-;>>;=&$#@###$%*=--=*%$#@@#$$%&**==-)2l",
+"l1'-=-;;;;-*%$#@@##$%%&&**&%$#@##$%*=-;;-=&$@+++@@@@@@++++..++@$%%%$$$%*->){{)>=%&=;'~]{'-&%%*-,',;*%%&=;>>;*%%&=---=&$$%*-,)'>=**-,~//{>*&=->'',-**->!^_({,-=;,!]^{,-*=;,!]]{';==;,!^((^!>==-;,')',;=%$#$%&=;>,>-*%$$%&*=;>,,;-&%$##$$%*=-;;-=&$###$%%&*==-;!3m",
+"n5^)))!!!)'>;-===--;;>,,,,>;-===-;,'))!!),;=****======**&&&&&*-;>>;;-;>,)]/_(^!,>>'~^_:(]'>;>'!]^]),;;,'!{{),;;,')))'>;-;,)]^^{),,){(<[_{,,,)~]^])',)~/:}}:])')]/_:_^),')]/_:_/~'')]/_[[<(])''!{]^^^{)>;---;,)~]]!'>;-;;>,)~]]{!'>;----;>,')!!),>--=--;>,,')!(7n",
+"sf632333321|}[[[[}}}||111||}[[[}}|1223332|}[<<<[[[[[[[<<<<<<<[}}||}}}}|23589852|||24799741|||245542|||1234421||122221|}}|13465421124800841|1245543112469aa95222468996311246899742124680a095312345565431}}[}}|2344421}}}||123454421}}[}}}||123332|}}[[}}||11237gt",
+"xsnmmmmmmlkkjjjjjkkkkklllkkkjjjkkklllmmmlkjjjjjjjjjjjjjjjjjjjjjkkkkkkkklmnoonmlkkllmnoonmlkkklmnnmlkkkllmmmlkkkkllmllkkkklmmnnmlkllmoppomlkllmnnmmlllmnopponmlmmnooonmlllmnooonmlllmnoopponmlllmmnnnnmlkkjkkklmmmmmlkkkkkklmmnnmllkkjjkkkkllmmmlkkjjjjkkkkllmnsx"};
index 2517792df6b6c6a21f61984662ce385a72ce2ab1..08cbbe0948de48fed26d8ed5d8b0f4ee6d15e2b1 100644 (file)
@@ -321,8 +321,8 @@ inline unsigned long trans_point(int x1, int y1, unsigned long myc, double a,
     } 
     else 
     {
     } 
     else 
     {
-       int or, og, ob;
-       int r, g, b;
+       int or=0, og=0, ob=0;
+       int r=0, g=0, b=0;
        int nr, ng, nb;
        unsigned long c;
 
        int nr, ng, nb;
        unsigned long c;
 
index 205d273f234088c0d966310fdb919bd0507fc9c8..594d7462e3d3b961e5a1713a6fcceafe9fef4b89 100644 (file)
@@ -532,7 +532,7 @@ char *progclass = "Noseguy";
 char *defaults [] = {
   ".background:         black",
   ".foreground:         gray80",
 char *defaults [] = {
   ".background:         black",
   ".foreground:         gray80",
-  "*program:    xscreensaver-text --cols 40 | head -15",
+  "*program:    xscreensaver-text --cols 40 | head -n15",
   "noseguy.font: -*-new century schoolbook-*-r-*-*-*-180-*-*-*-*-*-*",
   0
 };
   "noseguy.font: -*-new century schoolbook-*-r-*-*-*-180-*-*-*-*-*-*",
   0
 };
index cc1d724337ea0daa8094da6b36219a1d0d4837dc..43962ebf4b3016b3fca68e89cc0a6a17046bb506 100644 (file)
@@ -45,7 +45,7 @@ The font used for the messages.
 This program will be run periodically, and its output will be the text
 of the messages.  Default:
 
 This program will be run periodically, and its output will be the text
 of the messages.  Default:
 
-    xscreensaver-text --cols 40 | head -15
+    xscreensaver-text --cols 40 | head -n15
 
 You can configure the text printed through the "Advanced" tab of
 .BR xscreensaver\-demo (1),
 
 You can configure the text printed through the "Advanced" tab of
 .BR xscreensaver\-demo (1),
index 0b6dc273064ab03cdb2e8dded9ae440329e65701..c30e2adf2dc904829d9f67eabc1737ba4b11f44a 100644 (file)
@@ -99,6 +99,9 @@ static void (*draw_transparent)(short *src);
                              - (((x)>>3)&0x11111111))
 
 
                              - (((x)>>3)&0x11111111))
 
 
+static Bool grayscale_p;
+static unsigned long grayscale(unsigned long color);
+
 /*      -------------------------------------------             */
 
 
 /*      -------------------------------------------             */
 
 
@@ -197,13 +200,13 @@ draw_transparent_vanilla(short *src)
 
       if (dirty[pixel] > 0) {
         XPutPixel(buffer_map, (across<<1),  (down<<1),
 
       if (dirty[pixel] > 0) {
         XPutPixel(buffer_map, (across<<1),  (down<<1),
-                  XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady));
+                  grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady)));
         XPutPixel(buffer_map, (across<<1)+1,(down<<1),
         XPutPixel(buffer_map, (across<<1)+1,(down<<1),
-                  XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady));
+                  grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady)));
         XPutPixel(buffer_map, (across<<1),  (down<<1)+1,
         XPutPixel(buffer_map, (across<<1),  (down<<1)+1,
-                  XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1));
+                  grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1)));
         XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1,
         XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1,
-                  XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1));
+                  grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1)));
       }
     }
 }
       }
     }
 }
@@ -257,6 +260,52 @@ bright(int dx, unsigned long color)
 }
 
 
 }
 
 
+static unsigned long
+grayscale(unsigned long color)
+{
+  int red;
+  int green;
+  int blue;
+  int total;
+  int gray_r;
+  int gray_g;
+  int gray_b;
+
+  if (!grayscale_p)
+    return color;
+  if (!transparent)
+    return color;
+  if ((rmask == 0) || (gmask == 0) || (bmask == 0))
+    return color;
+
+  red = ((color >> rshift) & rmask);
+  green =  ((color >> gshift) & gmask);
+  blue =  ((color >> bshift) & bmask);
+  total = red * gmask * bmask + green * rmask * bmask + blue * rmask * gmask;
+
+  gray_r = total / (3 * gmask * bmask);
+  if (gray_r < 0)
+    gray_r = 0;
+  if (gray_r > rmask)
+    gray_r = rmask;
+  
+  gray_g = total / (3 * rmask * bmask);
+  if (gray_g < 0)
+    gray_g = 0;
+  if (gray_g > gmask)
+    gray_g = gmask;
+
+  gray_b = total / (3 * rmask * gmask);
+  if (gray_b < 0)
+    gray_b = 0;
+  if (gray_b > bmask)
+    gray_b = bmask;
+
+  return ((unsigned long)
+          ((gray_r << rshift) | (gray_g << gshift) | (gray_b << bshift)));
+}
+
+
 static void
 draw_transparent_light(short *src)
 {
 static void
 draw_transparent_light(short *src)
 {
@@ -310,23 +359,23 @@ draw_transparent_light(short *src)
 
         if (dx != 0) {
           XPutPixel(buffer_map, (across<<1),  (down<<1),
 
         if (dx != 0) {
           XPutPixel(buffer_map, (across<<1),  (down<<1),
-                    bright(dx, XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady)));
+                    bright(dx, grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady))));
           XPutPixel(buffer_map, (across<<1)+1,(down<<1),
           XPutPixel(buffer_map, (across<<1)+1,(down<<1),
-                    bright(dx, XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady)));
+                    bright(dx, grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady))));
           XPutPixel(buffer_map, (across<<1),  (down<<1)+1,
           XPutPixel(buffer_map, (across<<1),  (down<<1)+1,
-                    bright(dx, XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1)));
+                    bright(dx, grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1))));
           XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1,
           XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1,
-                    bright(dx, XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1)));
+                    bright(dx, grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1))));
         } else {
           /* Could use XCopyArea, but XPutPixel is faster */
           XPutPixel(buffer_map, (across<<1),  (down<<1),
         } else {
           /* Could use XCopyArea, but XPutPixel is faster */
           XPutPixel(buffer_map, (across<<1),  (down<<1),
-                    XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady));
+                    grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady)));
           XPutPixel(buffer_map, (across<<1)+1,(down<<1),
           XPutPixel(buffer_map, (across<<1)+1,(down<<1),
-                    XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady));
+                    grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady)));
           XPutPixel(buffer_map, (across<<1),  (down<<1)+1,
           XPutPixel(buffer_map, (across<<1),  (down<<1)+1,
-                    XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1));
+                    grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1)));
           XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1,
           XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1,
-                    XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1));
+                    grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1)));
         }
       }
     }
         }
       }
     }
@@ -757,9 +806,20 @@ init_ripples(int ndrops, int splash)
     add_drop(ripple_blob, splash);
 
   if (transparent) {
     add_drop(ripple_blob, splash);
 
   if (transparent) {
+    if (grayscale_p)
+    {
+      int across, down;
+      for (down = 0; down < bigheight; down++)
+        for (across = 0; across < bigwidth; across++)
+          XPutPixel(buffer_map, across, down,
+                    grayscale(XGetPixel(orig_map, across, down)));
+    }
+    else
+    {  
     /* There's got to be a better way of doing this  XCopyArea? */
     memcpy(buffer_map->data, orig_map->data,
            bigheight * buffer_map->bytes_per_line);
     /* There's got to be a better way of doing this  XCopyArea? */
     memcpy(buffer_map->data, orig_map->data,
            bigheight * buffer_map->bytes_per_line);
+    }
   } else {
     int across, down, color;
 
   } else {
     int across, down, color;
 
@@ -892,6 +952,7 @@ char *defaults[] =
   "*stir:              False",
   "*fluidity:          6",
   "*light:             0",
   "*stir:              False",
   "*fluidity:          6",
   "*light:             0",
+  "*grayscale:                 False",
 #ifdef HAVE_XSHM_EXTENSION
   "*useSHM: True",
 #endif                         /* HAVE_XSHM_EXTENSION */
 #ifdef HAVE_XSHM_EXTENSION
   "*useSHM: True",
 #endif                         /* HAVE_XSHM_EXTENSION */
@@ -910,6 +971,7 @@ XrmOptionDescRec options[] =
   {"-stir",    ".stir",        XrmoptionNoArg, "True"},
   {"-fluidity",        ".fluidity",    XrmoptionSepArg, 0},
   {"-light",   ".light",       XrmoptionSepArg, 0},
   {"-stir",    ".stir",        XrmoptionNoArg, "True"},
   {"-fluidity",        ".fluidity",    XrmoptionSepArg, 0},
   {"-light",   ".light",       XrmoptionSepArg, 0},
+  {"-grayscale",       ".grayscale",   XrmoptionNoArg, "True"},
 #ifdef HAVE_XSHM_EXTENSION
   {"-shm",     ".useSHM",      XrmoptionNoArg, "True"},
   {"-no-shm",  ".useSHM",      XrmoptionNoArg, "False"},
 #ifdef HAVE_XSHM_EXTENSION
   {"-shm",     ".useSHM",      XrmoptionNoArg, "True"},
   {"-no-shm",  ".useSHM",      XrmoptionNoArg, "False"},
@@ -928,6 +990,7 @@ void screenhack(Display *disp, Window win)
   int stir = get_boolean_resource("stir", "Boolean");
   int fluidity = get_integer_resource("fluidity", "Integer");
   transparent = get_boolean_resource("water", "Boolean");
   int stir = get_boolean_resource("stir", "Boolean");
   int fluidity = get_integer_resource("fluidity", "Integer");
   transparent = get_boolean_resource("water", "Boolean");
+  grayscale_p = get_boolean_resource("grayscale", "Boolean");
 #ifdef HAVE_XSHM_EXTENSION
   use_shm = get_boolean_resource("useSHM", "Boolean");
 #endif /* HAVE_XSHM_EXTENSION */
 #ifdef HAVE_XSHM_EXTENSION
   use_shm = get_boolean_resource("useSHM", "Boolean");
 #endif /* HAVE_XSHM_EXTENSION */
@@ -964,9 +1027,16 @@ void screenhack(Display *disp, Window win)
     maxbits = MIN(MIN(BITCOUNT(rmask), BITCOUNT(gmask)), BITCOUNT(bmask));
     light -= 8-maxbits;
     if (light < 0) light = 0;
     maxbits = MIN(MIN(BITCOUNT(rmask), BITCOUNT(gmask)), BITCOUNT(bmask));
     light -= 8-maxbits;
     if (light < 0) light = 0;
-  } else
+  } else {
+    if (grayscale_p)
+    { 
+      set_mask(visual->red_mask,   &rmask, &rshift);
+      set_mask(visual->green_mask, &gmask, &gshift);
+      set_mask(visual->blue_mask,  &bmask, &bshift);
+    }
     draw_transparent = draw_transparent_vanilla;
     draw_transparent = draw_transparent_vanilla;
-
+  }
+  
   init_ripples(0, -SPLASH); /* Start off without any drops */
 
   /* Main drawing loop */
   init_ripples(0, -SPLASH); /* Start off without any drops */
 
   /* Main drawing loop */
index caa2686327e806fec806e563be79210344cc9ec2..55160029b3dcccf54d83fa6d6d9ff0927c07497d 100644 (file)
@@ -14,6 +14,7 @@ ripples - interference patterns.
 [\-water]
 [\-stir]
 [\-oily]
 [\-water]
 [\-stir]
 [\-oily]
+[\-grayscale]
 [\-colors \fInumber\fP]
 [\-no-shm]
 .SH DESCRIPTION
 [\-colors \fInumber\fP]
 [\-no-shm]
 .SH DESCRIPTION
@@ -53,6 +54,11 @@ Moving Splashes.  Boolean.
 .B \-oily | \-no-oily
 Psychedelic Colors.  Boolean.
 .TP 8
 .B \-oily | \-no-oily
 Psychedelic Colors.  Boolean.
 .TP 8
+.B \-grayscale
+Convert the screen image to grayscale.
+Ignored if we don't grab the screen image or if our screen doesn't have
+enough color depth.
+.TP 8
 .B \-colors \fInumber\fP
 Colors Two.  Default: 200.
 .TP 8
 .B \-colors \fInumber\fP
 Colors Two.  Default: 200.
 .TP 8
index e2ebf15472978a2523f9d17aba599c6ee2fc2b7b..b3f3cb6a1f1211b589de785f48ede253bc2e0edc 100644 (file)
@@ -38,7 +38,7 @@
  * software for any purpose.  It is provided "as is" without express or 
  * implied warranty.
  *
  * software for any purpose.  It is provided "as is" without express or 
  * implied warranty.
  *
- * $Revision: 1.38 $
+ * $Revision: 1.39 $
  *
  * Version 1.0 April 27, 1998.
  * - Initial version
  *
  * Version 1.0 April 27, 1998.
  * - Initial version
@@ -537,8 +537,9 @@ lookupHost(ping_target *target)
       hent = gethostbyname (target->name);
       if (!hent)
         {
       hent = gethostbyname (target->name);
       if (!hent)
         {
-          fprintf (stderr, "%s: could not resolve host:  %s\n",
-                   progname, target->name);
+          if (debug_p)
+            fprintf (stderr, "%s: could not resolve host:  %s\n",
+                     progname, target->name);
           return 0;
         }
 
           return 0;
         }
 
@@ -608,7 +609,7 @@ newHost(char *name)
       struct sockaddr_in *iaddr = (struct sockaddr_in *) &(target->address);
       unsigned long ip = iaddr->sin_addr.s_addr;
 
       struct sockaddr_in *iaddr = (struct sockaddr_in *) &(target->address);
       unsigned long ip = iaddr->sin_addr.s_addr;
 
-      if ((ntohl (ip) & 0xFFFFFF00L) == 0x7f000000L)  /* 127.0.0 */
+      if ((ntohl (ip) & 0xFFFFFF00L) == 0x7f000000L)  /* 127.0.0.x */
         {
           if (debug_p)
             fprintf (stderr, "%s:   ignoring loopback host %s\n",
         {
           if (debug_p)
             fprintf (stderr, "%s:   ignoring loopback host %s\n",
@@ -617,6 +618,19 @@ newHost(char *name)
         }
     }
 
         }
     }
 
+    /* Don't ever use broadcast (255.x.x.x) hosts */
+    {
+      struct sockaddr_in *iaddr = (struct sockaddr_in *) &(target->address);
+      unsigned long ip = iaddr->sin_addr.s_addr;
+      if ((ntohl (ip) & 0xFF000000L) == 0xFF000000L)  /* 255.x.x.x */
+        {
+          if (debug_p)
+            fprintf (stderr, "%s:   ignoring broadcast host %s\n",
+                     progname, target->name);
+          goto target_init_error;
+        }
+    }
+
     /* Done */
 
     if (debug_p)
     /* Done */
 
     if (debug_p)
index b98d54b68fcb2901946ac714db624d9c5d673e11..7137d6614f11ce68e03f85fcb5a213311eb6af64 100644 (file)
@@ -181,9 +181,9 @@ onestep (Display *dpy, Window window, Bool first_p)
     now = currentTimeInMs() + off;
 
     /* find new x,y */
     now = currentTimeInMs() + off;
 
     /* find new x,y */
-    x = ((1 + sin(((float)now) / X_PERIOD * 2. * M_PI))/2.0) 
+    x = ((1 + sin(((double)now) / X_PERIOD * 2. * M_PI))/2.0) 
       * (sizex - s/2) -s/4  + MINX;
       * (sizex - s/2) -s/4  + MINX;
-    y = ((1 + sin(((float)now) / Y_PERIOD * 2. * M_PI))/2.0) 
+    y = ((1 + sin(((double)now) / Y_PERIOD * 2. * M_PI))/2.0) 
       * (sizey - s/2) -s/4  + MINY;
     
     if (!first_p)
       * (sizey - s/2) -s/4  + MINY;
     
     if (!first_p)
index 4ed61c7b434dfc7866d323bb397d3d421f74b131..3a8ea8c93b30bf7e666f3d1958eae68a9c6403dc 100755 (executable)
@@ -60,20 +60,21 @@ use bytes;  # Larry can take Unicode and shove it up his ass sideways.
 
 
 my $progname = $0; $progname =~ s@.*/@@g;
 
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.127 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.129 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 my $copyright = "WebCollage $version, Copyright (c) 1999-2005" .
     " Jamie Zawinski <jwz\@jwz.org>\n" .
     "            http://www.jwz.org/webcollage/\n";
 
 
 
 my $copyright = "WebCollage $version, Copyright (c) 1999-2005" .
     " Jamie Zawinski <jwz\@jwz.org>\n" .
     "            http://www.jwz.org/webcollage/\n";
 
 
 
-my @search_methods = (  58, "altavista",    \&pick_from_alta_vista_random_link,
+my @search_methods = (  56, "altavista",    \&pick_from_alta_vista_random_link,
                         11, "livejournal",  \&pick_from_livejournal_images,
                         11, "livejournal",  \&pick_from_livejournal_images,
-                         7, "yahoorand",    \&pick_from_yahoo_random_link,
+                         5, "yahoorand",    \&pick_from_yahoo_random_link,
                         10, "googlephotos", \&pick_from_google_image_photos,
                         10, "googlephotos", \&pick_from_google_image_photos,
-                         6, "googleimgs",   \&pick_from_google_images,
+                         5, "googleimgs",   \&pick_from_google_images,
                          3, "googlenums",   \&pick_from_google_image_numbers,
                          3, "googlenums",   \&pick_from_google_image_numbers,
-                         5, "flickr",       \&pick_from_flickr,
+                         2, "flickr_recent", \&pick_from_flickr_recent,
+                         8, "flickr_random", \&pick_from_flickr_random,
 
                      # In Apr 2002, Google asked me to stop searching them.
                      # I asked them to add a "random link" url.  They said
 
                      # In Apr 2002, Google asked me to stop searching them.
                      # I asked them to add a "random link" url.  They said
@@ -803,6 +804,29 @@ sub pick_image_from_body($$) {
   return $url;
 }
 
   return $url;
 }
 
+# Given a URL and the RSS feed from that URL, pick a random image from
+# the feed.  This is a lot simpler than extracting images out of a page:
+# we already know we have reasonable images, so we just pick one.
+# Returns: the real URL of the page (preferably not the RSS version),
+# and the image.
+
+sub pick_image_from_rss($$) {
+  my ( $url, $body ) = @_;
+  my @suitable = ($body =~ m/<enclosure url="(.*?)"/g);
+
+  my ($base) = ($body =~ m@<link>([^<>]+)</link>@i);
+  $base = $url unless $base;
+
+  # pick a random element of the table
+  if (@suitable) {
+    my $i = int(rand(scalar @suitable));
+    my $url = $suitable[$i];
+    LOG ($verbose_load, "picked image " .($i+1) . "/" . 
+                        ($#suitable+1) . ": $url");
+    return ($base, $url);
+  }
+  return;
+}
 
 \f
 ############################################################################
 
 \f
 ############################################################################
@@ -1763,8 +1787,8 @@ my @flickr_cache = (); # fifo, for ordering by age
 my %flickr_cache = (); # hash, for detecting dups
 
 
 my %flickr_cache = (); # hash, for detecting dups
 
 
-# flickr
-sub pick_from_flickr($) {
+# flickr_recent
+sub pick_from_flickr_recent($) {
   my ($timeout) = @_;
 
   my $start = 16 * int(rand(100));
   my ($timeout) = @_;
 
   my $start = 16 * int(rand(100));
@@ -1831,6 +1855,47 @@ sub pick_from_flickr($) {
   return ($page, $img);
 }
 
   return ($page, $img);
 }
 
+\f
+############################################################################
+#
+# Pick images from a random RSS feed on Flickr.
+#
+############################################################################
+
+my $flickr_rss_base = ("http://www.flickr.com/services/feeds/photos_public.gne" .
+                       "?format=rss_200_enc&tags=");
+
+# Picks a random RSS feed; picks a random image from that feed;
+# returns 2 URLs: the page containing the image, and the image.
+# Mostly by Joe Mcmahon <mcmahon@yahoo-inc.com>
+#
+# flickr_random
+sub pick_from_flickr_random($) {
+  my $timeout = shift;
+
+  my $rss = $flickr_rss_base . random_word();
+  $last_search = $rss;
+
+  print STDERR "\n\n" if ($verbose_load);
+  LOG ($verbose_load, "URL: $last_search");
+
+  $suppress_audit = 1;
+
+  my ( $base, $body ) = get_document ($last_search, undef, $timeout);
+  if (!$base || !$body) {
+    $body = undef;
+    return;
+  }
+
+  my $img;
+  ($base, $img) = pick_image_from_rss ($base, $body);
+  $body = undef;
+  return () unless defined ($img);
+
+  LOG ($verbose_load, "redirected to: $base");
+  return ($base, $img);
+}
+
 \f
 ############################################################################
 #
 \f
 ############################################################################
 #
@@ -3362,6 +3427,10 @@ sub main() {
     pick_dictionary();
   }
 
     pick_dictionary();
   }
 
+  if ($imagemap_base && !($img_width && $img_height)) {
+    error ("-size WxH is required with -imagemap");
+  }
+
   init_signals();
 
   spawn_driftnet ($driftnet_cmd) if ($driftnet_cmd);
   init_signals();
 
   spawn_driftnet ($driftnet_cmd) if ($driftnet_cmd);
index 8ba09d73733cd5e4a0d06337ae7c1a686a3f963c..3f9a0747e786646eba6b83859cf0f2e32540bc79 100644 (file)
@@ -24,6 +24,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 
 #include <sys/types.h>
 #include <sys/stat.h>
 
+#undef HAVE_STDLIB_H /* stupid jconfig.h! */
 #include <jpeglib.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
 
 #include <jpeglib.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
 
index df8c0eedef5a0a0dba77c9866f5b40ceb1f29434..4c38e3777b90fd3d7af20f0811f621a048d933e6 100644 (file)
@@ -11,7 +11,7 @@ whirlygig -- zooming chains of sinusoidal spots
 [\-wrap 1|0] [\-db] [\-no-db] 
 
 .SH DESCRIPTION
 [\-wrap 1|0] [\-db] [\-no-db] 
 
 .SH DESCRIPTION
-The \flwhirlygig\fP program draws a series of circles on your screen.
+The \fIwhirlygig\fP program draws a series of circles on your screen.
 They then move about in a cyclic pattern
 .SH OPTIONS
 .I whirlygig
 They then move about in a cyclic pattern
 .SH OPTIONS
 .I whirlygig
@@ -27,33 +27,33 @@ Draw on the root window.
 Specify which visual to use.  Legal values are the name of a visual class,
 or the id number (decimal or hex) of a specific visual.
 .TP 8
 Specify which visual to use.  Legal values are the name of a visual class,
 or the id number (decimal or hex) of a specific visual.
 .TP 8
-.B \-xspeed \flspeed\fP
+.B \-xspeed \fIspeed\fP
 Specify how fast the dots should cycle horizontally.
 Try out values from .01 to 4000. Random by default.
 .TP 8
 Specify how fast the dots should cycle horizontally.
 Try out values from .01 to 4000. Random by default.
 .TP 8
-.B \-yspeed \flspeed\fP
+.B \-yspeed \fIspeed\fP
 Specify how fast the dots should cycle vertically.
 Try out values from .01 to 4000. Random by default.
 .TP 8
 Specify how fast the dots should cycle vertically.
 Try out values from .01 to 4000. Random by default.
 .TP 8
-.B \-xamplitude \flfactor\fP
+.B \-xamplitude \fIfactor\fP
 Specify the horizontal amplitude.
 Try out values from .01 to 10. Defaults to 1.0.
 .TP 8
 Specify the horizontal amplitude.
 Try out values from .01 to 10. Defaults to 1.0.
 .TP 8
-.B \-yamplitude \flfactor\fP
+.B \-yamplitude \fIfactor\fP
 Specify the horizontal amplitude.
 Try out values from .01 to 10. Defaults to 1.0.
 .TP 8
 Specify the horizontal amplitude.
 Try out values from .01 to 10. Defaults to 1.0.
 .TP 8
-.B \-whirlies \fla number\fP
+.B \-whirlies \fIa number\fP
 Specify how many whirlies you want (per line). Defaults
 to a random number.
 .TP 8
 Specify how many whirlies you want (per line). Defaults
 to a random number.
 .TP 8
-.B \-nlines \flnumber of lines\fP
+.B \-nlines \fInumber of lines\fP
 Specify how many lines of whirlies you want. Defaults to a 
 random number.
 .TP 8
 Specify how many lines of whirlies you want. Defaults to a 
 random number.
 .TP 8
-.B \-xmode \flmode\fP
+.B \-xmode \fImode\fP
 .TP 8 
 .TP 8 
-.B \-ymode \flmode\fP
+.B \-ymode \fImode\fP
 Specify which mode to use for calculating the x and y positions of the
 whirlies. Can be any of spin, funky, circle, linear, test, fun, innie
 or lissajous. Defaults to 'change' mode, which randomly selects a new
 Specify which mode to use for calculating the x and y positions of the
 whirlies. Can be any of spin, funky, circle, linear, test, fun, innie
 or lissajous. Defaults to 'change' mode, which randomly selects a new
@@ -63,37 +63,37 @@ mode for x and y every now an then. Unrecognized options default to spin.
 Prints some strings to the window explaining what the initially
 selected modes are, before displaying the whirlies. Off by default.
 .TP 8
 Prints some strings to the window explaining what the initially
 selected modes are, before displaying the whirlies. Off by default.
 .TP 8
-.B \-trail \fl1 or 0\fP
+.B \-trail \fI1 or 0\fP
 Trail mode fails to erase the whirlies as they move, so they leave a
 multicoloured trail behind. Doesn't work if the doubled buffered mode
 is using the X server's double buffer extension, and the useDBEclear 
 resource is true (which it is by default).
 .TP 8
 Trail mode fails to erase the whirlies as they move, so they leave a
 multicoloured trail behind. Doesn't work if the doubled buffered mode
 is using the X server's double buffer extension, and the useDBEclear 
 resource is true (which it is by default).
 .TP 8
-.B \-speed \flint\fP
+.B \-speed \fIint\fP
 Specifies how fast to cycle through the internal time. Values 1,2 and
 3 look ok, up to 10 is not too bad, but beyond ends up
 flickery. Adjust xspeed and yspeed instead.
 .TP 8
 Specifies how fast to cycle through the internal time. Values 1,2 and
 3 look ok, up to 10 is not too bad, but beyond ends up
 flickery. Adjust xspeed and yspeed instead.
 .TP 8
-.B \-start_time \flint\fP
+.B \-start_time \fIint\fP
 Where in the internal time cycle to start. Ranges from 1 to 429496729,
 Defaults to a random value.
 .TP 8
 Where in the internal time cycle to start. Ranges from 1 to 429496729,
 Defaults to a random value.
 .TP 8
-.B \-xoffset \flfactor\fP
+.B \-xoffset \fIfactor\fP
 Tell the whirlies to be offset by this factor of a sin.
 Defaults to 1.0
 .TP 8
 Tell the whirlies to be offset by this factor of a sin.
 Defaults to 1.0
 .TP 8
-.B \-yoffset \flfactor\fP
+.B \-yoffset \fIfactor\fP
 Tell the whirlies to be offset by this factor of a cos.
 Defaults to 1.0
 .TP 8
 Tell the whirlies to be offset by this factor of a cos.
 Defaults to 1.0
 .TP 8
-.B \-offset_period \flfactor\fP
+.B \-offset_period \fIfactor\fP
 Change the period of an offset cycle
 Defaults to 1
 .TP 8
 Change the period of an offset cycle
 Defaults to 1
 .TP 8
-.B \-color_modifier \flint\fP
+.B \-color_modifier \fIint\fP
 How many colors away from the current should the next whirly be?
 .TP 8
 How many colors away from the current should the next whirly be?
 .TP 8
-.B \-wrap \fl1|0\fP
+.B \-wrap \fI1|0\fP
 Causes whirlies that fall off the edge of the screen to wrap over to
 the other end of the screen. Otherwise they disappear and new ones
 to materialize on the other side of the screen. The difference is
 Causes whirlies that fall off the edge of the screen to wrap over to
 the other end of the screen. Otherwise they disappear and new ones
 to materialize on the other side of the screen. The difference is
index 683c21baa610b7aae8573b3af77bb9d9bddd669d..3af8850725c2fa655225f6d943fd857461aa2f08 100644 (file)
@@ -217,7 +217,7 @@ static double  minexp, maxexp, prob=0.5;
 static int     expind[MAXFRAMES]={0}, resized[MAXFRAMES]={0};
 static int     numwheels=MAXWHEELS, force=0, Force=0, negative=1;
 static int     rgb_max=65000, nostart=1, stripe_interval=7;
 static int     expind[MAXFRAMES]={0}, resized[MAXFRAMES]={0};
 static int     numwheels=MAXWHEELS, force=0, Force=0, negative=1;
 static int     rgb_max=65000, nostart=1, stripe_interval=7;
-static int     save=1, show=0, useprod=1, spinlength=256, savefile=0;
+static int     save=1, show=0, useprod=1, spinlength=256/*, savefile=0*/;
 static int     maxframe=0, frame=0, dorecalc=0, mapindex=0, run=1;
 static char    *outname="lyap.out";
 
 static int     maxframe=0, frame=0, dorecalc=0, mapindex=0, run=1;
 static char    *outname="lyap.out";
 
@@ -246,7 +246,7 @@ static void main_event(void);
 static int complyap(void);
 static void Getkey(XKeyEvent *event);
 static int sendpoint(double expo);
 static int complyap(void);
 static void Getkey(XKeyEvent *event);
 static int sendpoint(double expo);
-static void save_to_file(void);
+/*static void save_to_file(void);*/
 static void setforcing(void);
 static void check_params(int mapnum, int parnum);
 static void usage(void);
 static void setforcing(void);
 static void check_params(int mapnum, int parnum);
 static void usage(void);
@@ -605,15 +605,15 @@ complyap(void)
       return FALSE;
     else {
       FlushBuffer();
       return FALSE;
     else {
       FlushBuffer();
-      if (savefile)
-       save_to_file();
+/*      if (savefile)
+       save_to_file(); */
       return TRUE;
     }
   }
   if (b >= max_b) {
     FlushBuffer();
       return TRUE;
     }
   }
   if (b >= max_b) {
     FlushBuffer();
-    if (savefile)
-      save_to_file();
+/*    if (savefile)
+      save_to_file();*/
     return TRUE;
   }
   prod = 1.0;
     return TRUE;
   }
   prod = 1.0;
@@ -705,8 +705,8 @@ complyap(void)
     return FALSE;
   else {
     FlushBuffer();
     return FALSE;
   else {
     FlushBuffer();
-    if (savefile)
-      save_to_file();
+/*    if (savefile)
+      save_to_file();*/
     return TRUE;
   }
 }
     return TRUE;
   }
 }
@@ -1316,7 +1316,7 @@ Getkey(XKeyEvent *event)
       redraw(exponents[frame], expind[frame], 1);
       break;
   case 'f':
       redraw(exponents[frame], expind[frame], 1);
       break;
   case 'f':
-  case 'F': save_to_file(); break;
+/*  case 'F': save_to_file(); break;*/
   case 'i': if (stripe_interval > 0) {
       stripe_interval--;
        if (displayplanes > 1) {
   case 'i': if (stripe_interval > 0) {
       stripe_interval--;
        if (displayplanes > 1) {
@@ -1568,6 +1568,7 @@ Redraw(void)
   resized[frame] = 0;
 }
 
   resized[frame] = 0;
 }
 
+#if 0
 /* Store color pics in PPM format and monochrome in PGM */
 static void
 save_to_file(void)
 /* Store color pics in PPM format and monochrome in PGM */
 static void
 save_to_file(void)
@@ -1643,6 +1644,7 @@ save_to_file(void)
       }
   fclose(outfile);
 }
       }
   fclose(outfile);
 }
+#endif
 
 static void
 recalc(void)
 
 static void
 recalc(void)
index 15d465a4c8137ff17338e63255ff01c1f78ab7ef..7073ce09a7e71fc574cd4d599c087873e897c873 100644 (file)
@@ -1,4 +1,4 @@
-# Auto-generated: Wed Jun 22 18:02:31 PDT 2005
+# Auto-generated: Fri Oct 21 23:44:10 PDT 2005
 driver/demo-Gtk-conf.c
 driver/demo-Gtk-support.c
 driver/demo-Gtk-widgets.c
 driver/demo-Gtk-conf.c
 driver/demo-Gtk-support.c
 driver/demo-Gtk-widgets.c
@@ -34,6 +34,7 @@ hacks/config/bumps.xml
 hacks/config/cage.xml
 hacks/config/carousel.xml
 hacks/config/ccurve.xml
 hacks/config/cage.xml
 hacks/config/carousel.xml
 hacks/config/ccurve.xml
+hacks/config/celtic.xml
 hacks/config/circuit.xml
 hacks/config/cloudlife.xml
 hacks/config/compass.xml
 hacks/config/circuit.xml
 hacks/config/cloudlife.xml
 hacks/config/compass.xml
@@ -42,6 +43,7 @@ hacks/config/cosmos.xml
 hacks/config/crackberg.xml
 hacks/config/critical.xml
 hacks/config/crystal.xml
 hacks/config/crackberg.xml
 hacks/config/critical.xml
 hacks/config/crystal.xml
+hacks/config/cube21.xml
 hacks/config/cubenetic.xml
 hacks/config/cubestorm.xml
 hacks/config/cynosure.xml
 hacks/config/cubenetic.xml
 hacks/config/cubestorm.xml
 hacks/config/cynosure.xml
@@ -82,6 +84,7 @@ hacks/config/gflux.xml
 hacks/config/glblur.xml
 hacks/config/gleidescope.xml
 hacks/config/glforestfire.xml
 hacks/config/glblur.xml
 hacks/config/gleidescope.xml
 hacks/config/glforestfire.xml
+hacks/config/glhanoi.xml
 hacks/config/glknots.xml
 hacks/config/glmatrix.xml
 hacks/config/glplanet.xml
 hacks/config/glknots.xml
 hacks/config/glmatrix.xml
 hacks/config/glplanet.xml
@@ -107,6 +110,7 @@ hacks/config/intermomentary.xml
 hacks/config/jigglypuff.xml
 hacks/config/jigsaw.xml
 hacks/config/juggle.xml
 hacks/config/jigglypuff.xml
 hacks/config/jigsaw.xml
 hacks/config/juggle.xml
+hacks/config/juggler3d.xml
 hacks/config/julia.xml
 hacks/config/kaleidescope.xml
 hacks/config/klein.xml
 hacks/config/julia.xml
 hacks/config/kaleidescope.xml
 hacks/config/klein.xml
@@ -188,6 +192,7 @@ hacks/config/swirl.xml
 hacks/config/t3d.xml
 hacks/config/tangram.xml
 hacks/config/thornbird.xml
 hacks/config/t3d.xml
 hacks/config/tangram.xml
 hacks/config/thornbird.xml
+hacks/config/timetunnel.xml
 hacks/config/triangle.xml
 hacks/config/truchet.xml
 hacks/config/twang.xml
 hacks/config/triangle.xml
 hacks/config/truchet.xml
 hacks/config/twang.xml
index b15b962a1ca0e43bfee9d3587fef0e0dfaa4d67c..96b598429ce962d63b76d9e0f13006cb8a8b6318 100644 (file)
--- a/setup.com
+++ b/setup.com
@@ -5,7 +5,6 @@ $ mydisk = f$trnlmn("SYS$DISK")
 $ mydir  = mydisk+f$directory()
 $ anemone      :== $'mydir'anemone
 $ anemotaxis   :== $'mydir'anemotaxis
 $ mydir  = mydisk+f$directory()
 $ anemone      :== $'mydir'anemone
 $ anemotaxis   :== $'mydir'anemotaxis
-$ ant          :== $'mydir'ant
 $ apollonian   :== $'mydir'apollonian
 $ apple2       :== $'mydir'apple2
 $ attraction   :== $'mydir'attraction
 $ apollonian   :== $'mydir'apollonian
 $ apple2       :== $'mydir'apple2
 $ attraction   :== $'mydir'attraction
@@ -19,6 +18,7 @@ $ bsod                :== $'mydir'bsod
 $ bubbles      :== $'mydir'bubbles
 $ bumps                :== $'mydir'bumps
 $ ccurve       :== $'mydir'ccurve
 $ bubbles      :== $'mydir'bubbles
 $ bumps                :== $'mydir'bumps
 $ ccurve       :== $'mydir'ccurve
+$ celtic       :== $'mydir'celtic
 $ cloudlife    :== $'mydir'cloudlife
 $ compass      :== $'mydir'compass
 $ coral                :== $'mydir'coral
 $ cloudlife    :== $'mydir'cloudlife
 $ compass      :== $'mydir'compass
 $ coral                :== $'mydir'coral
index 716a2d7cc6223445a237fe5a71eaadf88aed9eee..7b105c9e275bb1c6079c736fef54bd9f73f181dd 100644 (file)
@@ -1,2 +1,2 @@
 static const char screensaver_id[] =
 static const char screensaver_id[] =
-       "@(#)xscreensaver 4.22 (22-Jun-2005), by Jamie Zawinski (jwz@jwz.org)";
+       "@(#)xscreensaver 4.23 (21-Oct-2005), by Jamie Zawinski (jwz@jwz.org)";
index 12c529b181d1e14a187078705649b420541c8ade..9ebb6643bcda39c78f5ad0534871c1c83492bc60 100644 (file)
@@ -1,5 +1,5 @@
 %define        name xscreensaver
 %define        name xscreensaver
-%define        version 4.22
+%define        version 4.23
 
 Summary:       X screen saver and locker
 Name:          %{name}
 
 Summary:       X screen saver and locker
 Name:          %{name}
@@ -48,7 +48,7 @@ Obsoletes: xscreensaver-gl
 
 %description
 A modular screen saver and locker for the X Window System.
 
 %description
 A modular screen saver and locker for the X Window System.
-More than 190 display modes are included in this package.
+More than 200 display modes are included in this package.
 
 %description base
 A modular screen saver and locker for the X Window System.
 
 %description base
 A modular screen saver and locker for the X Window System.