[Pkg-wmaker-commits] [wmbubble] 13/207: Half-merge in TAIL from my maintained version. Massive changes: remove gtk1, replace with wmxp library I wrote for this dockapp and resize it to 58x58 instead of 56x56.

Doug Torrance dtorrance-guest at moszumanska.debian.org
Mon Aug 24 04:17:51 UTC 2015


This is an automated email from the git hooks/post-receive script.

dtorrance-guest pushed a commit to branch master
in repository wmbubble.

commit cdd98616fabdd74f6eab0fd50e048b0b522ef656
Author: Robert Jacobs <rnjacobs at mit.edu>
Date:   Tue Aug 30 00:37:01 2011 -0700

    Half-merge in TAIL from my maintained version. Massive changes: remove
    gtk1, replace with wmxp library I wrote for this dockapp and resize it
    to 58x58 instead of 56x56.
---
 Makefile             |  21 +-
 bubblemon.c          | 833 ++++++++++++++++++++-------------------------------
 clockfont.txt        |  36 +++
 debian/README.Debian |   7 +
 debian/changelog     | 125 ++++++++
 debian/compat        |   1 +
 debian/control       |  19 ++
 debian/copyright     |  15 +
 debian/dirs          |   2 +
 debian/docs          |   2 +
 debian/menu          |   2 +
 debian/rules         |  64 ++++
 debian/wmbubble.1x   |  77 +++++
 include/bubblemon.h  |  30 +-
 include/clockfont.h  |  19 ++
 include/frame.xbm    |  42 +++
 include/numbers-2.h  |   3 +
 misc/digits.xpm      |  15 +
 misc/load_58.c       | 370 +++++++++++++++++++++++
 misc/load_58.xcf     | Bin 0 -> 5358 bytes
 misc/load_58.xpm     |  66 ++++
 misc/mem_58.c        | 371 +++++++++++++++++++++++
 misc/mem_58.xcf      | Bin 0 -> 5572 bytes
 misc/mem_58.xpm      |  66 ++++
 misc/numbers.xcf     | Bin 0 -> 1237 bytes
 misc/numbers.xpm     |  14 +
 wmx11pixmap.c        | 139 +++++++++
 wmx11pixmap.h        |  20 ++
 28 files changed, 1834 insertions(+), 525 deletions(-)

diff --git a/Makefile b/Makefile
index ee9ad52..b1c0ac0 100644
--- a/Makefile
+++ b/Makefile
@@ -16,33 +16,33 @@ USER_CFLAGS = -O3 -ansi -Wall
 # USER_CFLAGS = -ansi -Wall -pg -O3 -DPRO
 # test coverage cflags
 # USER_CFLAGS = -fprofile-arcs -ftest-coverage -Wall -ansi -g -DPRO
-BUILD_CFLAGS = `gtk-config --cflags`
+BUILD_CFLAGS = 
 CFLAGS = $(USER_CFLAGS) $(BUILD_CFLAGS) ${EXTRA}
 
 BINARY=bubblemon
 SHELL=sh
 OS = $(shell uname -s)
-OBJS = bubblemon.o
+OBJS = bubblemon.o wmx11pixmap.o
 CC = gcc
 
 # special things for Linux
 ifeq ($(OS), Linux)
     OBJS += sys_linux.o
-    LIBS = `gtk-config --libs | sed "s/-lgtk//g"`
+    LIBS = -lX11
     INSTALL = -m 755
 endif
 
 # special things for FreeBSD
 ifeq ($(OS), FreeBSD)
     OBJS += sys_freebsd.o
-    LIBS = `gtk-config --libs | sed "s/-lgtk//g"` -lkvm
+    LIBS = -lX11 -lkvm
     INSTALL = -c -g kmem -m 2755 -o root
 endif
 
 # special things for OpenBSD
 ifeq ($(OS), OpenBSD)
     OBJS += sys_openbsd.o
-    LIBS = `gtk-config --libs | sed "s/-lgtk//g"`
+    LIBS = -lX11
 endif
 
 #special things for SunOS
@@ -65,7 +65,7 @@ ifeq ($(OS), SunOS)
     endif
     CFLAGS = $(USER_CFLAGS) $(BUILD_CFLAGS) ${EXTRA}
     OBJS += sys_sunos.o
-    LIBS = `gtk-config --libs` -lkstat -lm
+    LIBS = -lX11 -lkstat -lm
     INSTALL = -m 755
 endif
 
@@ -76,6 +76,15 @@ all: $(BINARY)
 $(BINARY): $(OBJS)
 	$(CC) $(CFLAGS) -o $(BINARY) $(OBJS) $(LIBS)
 
+bubblemon.o: bubblemon.c wmx11pixmap.h include/bubblemon.h			\
+ include/sys_include.h include/clockfont.h include/numbers-2.h	\
+ include/ducks.h include/digits.h misc/load_58.c misc/mem_58.c	\
+ misc/numbers.xpm
+
+wmx11pixmap.o: wmx11pixmap.c wmx11pixmap.h
+
+sys_%.o: sys_%.c include/bubblemon.h include/sys_include.h
+
 clean:
 	rm -f $(BINARY) *.o *.bb* *.gcov gmon.* *.da *~
 
diff --git a/bubblemon.c b/bubblemon.c
index 46bade6..197d9d0 100644
--- a/bubblemon.c
+++ b/bubblemon.c
@@ -1,6 +1,11 @@
-/*  BubbleMon dockapp 1.46r
+/*  BubbleMon dockapp 1.50r
+ *
+ * Todo: merge in wmfishtime/bubblefishymon, reduce number of
+ * compilation-time settings, make more things configurable via xresources.
  *
  *  - dockapp for Window Maker/Blackbox/E/Afterstep/SawBabble
+ *  - Code from Robert Jacobs <rjacobs at eamp.org>, 2010-2011
+ *  - Code from the debian maintainers, 2005-2009
  *  - Code outside of bubblemon_update copyright 2000, 2001
  *    timecop at japan.co.jp
  *  - oleg dashevskii <od at iclub.nsu.ru> made changes to collect memory
@@ -13,11 +18,6 @@
  *  - Phil Lu <wplu13 at netscape.net> Dan Price <dp at rampant.org> - Solaris/SunOS
  *    port
  *  - Everything else copyright one of the guys below
- *
- *  TODO: Anything else? Add fish?
- *
- *  *************************************************************************
- * 
  *  Bubbling Load Monitoring Applet
  *  - A GNOME panel applet that displays the CPU + memory load as a
  *    bubbling liquid.
@@ -44,7 +44,7 @@
  */
 #define _GNU_SOURCE
 
-#define VERSION "1.46r"
+#define VERSION "1.50r"
 
 /* general includes */
 #include <stdio.h>
@@ -55,11 +55,9 @@
 #include <string.h>
 
 /* x11 includes */
-#include <gdk/gdk.h>
-#include <gdk/gdkx.h>
+#include "wmx11pixmap.h"
 #include <X11/Xresource.h>
 
-#include "include/master.xpm"
 #include "include/bubblemon.h"
 #include "include/sys_include.h"
 
@@ -73,19 +71,19 @@
 #include "include/digits.h"
 #endif
 #if defined(ENABLE_MEMSCREEN)
-#include "include/load_screen.h"
-#include "include/mem_screen.h"
+#include "misc/load_58.c"
+#include "misc/mem_58.c"
+#include "misc/numbers.xpm"
 #endif
 
 /* #define DEBUG_DUCK 1 */
 
 #ifndef NAME
-#define NAME "bubblemon"
+#define NAME "wmbubble"
 #endif
 
 /* local prototypes *INDENT-OFF* */
 static void bubblemon_setup_samples(void);
-static void bubblemon_setup_colors(void);
 static void bubblemon_allocate_buffers(void);
 static void bubblemon_update(int proximity);
 static void make_new_bubblemon_dockapp(void);
@@ -94,14 +92,12 @@ static void bubblemon_session_defaults(void);
 static int get_screen_selection(void);
 #if defined(ENABLE_CPU) || defined(ENABLE_MEMSCREEN)
 /* draw functions for load average / memory screens */
-static void draw_pixel(unsigned int x, unsigned int y, unsigned char *buf,
-		       unsigned char *c);
+static void draw_pixel(unsigned int x, unsigned int y, unsigned char *buf, char *c);
 static void draw_history(int num, int size, unsigned int *history,
 			 unsigned char *buf);
-static void draw_digit(int srcx, int srcy, int destx, int desty);
+static void draw_digit(int num, unsigned char * whither, unsigned char red, unsigned char grn, unsigned char blu);
 static void draw_string(char *string, int x, int y, int color);
-static void draw_cpudigit(const int what, const int where,
-			  unsigned char *kit);
+static void draw_cpudigit(int what, unsigned char *whither);
 
 static void render_secondary(void);
 static void realtime_alpha_blend_of_cpu_usage(int cpu, int proximity);
@@ -146,6 +142,8 @@ int memscreen_megabytes = 0;
 
 int shifttime = 0;
 
+int pale = 0;
+
 #define INT_VAL 0
 #define DOUBLE_VAL 1
 #define COLOR_VAL 2
@@ -295,20 +293,12 @@ int main(int argc, char **argv)
 #ifdef PRO
     int cnt = 25000;
 #endif
-    GdkEvent *event;
+    XEvent event;
 
 #ifdef FPS
     o = f = y = 0;
 #endif
 
-    /* initialize GDK */
-    if (!gdk_init_check(&argc, &argv)) {
-	fprintf(stderr,
-		"GDK init failed, bye bye.  Check \"DISPLAY\" variable.\n");
-	exit(-1);
-    }
-    gdk_rgb_init();
-
     /* dynamically generate getopt string depending on compile options
      * we are going to borrow 256 char string from exec function, and
      * also build up the "compiled features" string */
@@ -356,36 +346,13 @@ int main(int argc, char **argv)
 	    memscreen_enabled = 0;
 	    break;
 	case 'p':
-	    {
+		/* p stands for PALE changes the colors from BLUE and RED to PERIWINKLE and CYAN */
 		/* no sense having -p if memscreen isn't compiled in, right?
 		 * what we are going to do is to change the colors as follows:
 		 * 
-		 * (48,140,240) replaced with (158,196,237) - more pale blue
-		 * (237,23,23) replaced with (0,255,233) */
-		unsigned char *p = mem_screen;
-
-		while (p < mem_screen + sizeof(mem_screen))
-		    if (*p == 48) {	/* hopefully no other colors beginning with 48 */
-			*p++ = 158;
-			*p++ = 196;
-			*p++ = 237;
-		    } else if (*p == 237) {	/* hopefully no other colors beginning with 237 */
-			*p++ = 0;
-			*p++ = 255;
-			*p++ = 233;
-		    } else
-			p += 3;
-
-		p = load_screen;
-
-		while (p < load_screen + sizeof(load_screen))
-		    if (*p == 48) {	/* hopefully no other colors beginning with 48 */
-			*p++ = 158;
-			*p++ = 196;
-			*p++ = 237;
-		    } else
-			p += 3;
-	    }
+		 * normal numbers- (48,140,240) replaced with (158,196,237) - more pale blue
+		 * was red, now cyan? (237,23,23) replaced with (0,255,233) */
+		pale = 1;
 	    break;
 	case 'k':
 	    memscreen_megabytes = 1;
@@ -401,12 +368,22 @@ int main(int argc, char **argv)
 	}
     }
 
-    argc -= optind;
-    argv += optind;
+    if (mem_screen.width != mem_screen.height || mem_screen.width != BOX_SIZE ||
+        load_screen.width != load_screen.height || load_screen.width != BOX_SIZE) {
+	    fprintf(stderr, "mem_screen (%dx%d) or load_screen (%dx%d) dimensions don't match applet dimensions (%dx%d)",
+	            mem_screen.width,mem_screen.height,load_screen.width,load_screen.height,BOX_SIZE,BOX_SIZE);
+	    return 1;
+    }
 
     /* zero data structure */
     memset(&bm, 0, sizeof(bm));
 
+    /* initialize Ximage */
+    bm.xim = initwmX11pixmap(NAME,argc,argv);
+
+    argc -= optind;
+    argv += optind;
+
 #if defined(__FreeBSD__) || defined(__linux__)
     if (init_stuff())
 	exit(-1);
@@ -423,27 +400,22 @@ int main(int argc, char **argv)
 #else
     while (1) {
 #endif
-	while (gdk_events_pending()) {
-	    event = gdk_event_get();
-	    if (event) {
-		switch (event->type) {
-		case GDK_DESTROY:
-		    gdk_exit(0);
-		    exit(0);
-		    break;
-		case GDK_BUTTON_PRESS:
-		    if (event->button.button == 3) {
+	    while (XPending(wmxp_display)) {
+		XNextEvent(wmxp_display,&event);
+		switch (event.type) {
+		case ButtonPress:
+		    if (event.xbutton.button == 3) {
 			bm.picture_lock = bm.picture_lock ? 0 : 1;
 			break;
 		    }
-		    if (event->button.button <= argc) {
+		    if (event.xbutton.button <= argc) {
 			snprintf(execute, 250, "%s &",
-				 argv[event->button.button - 1]);
+				 argv[event.xbutton.button - 1]);
 			system(execute);
 		    }
 		    break;
 #if defined(ENABLE_CPU) || defined(ENABLE_MEMSCREEN)
-		case GDK_ENTER_NOTIFY:
+		case EnterNotify:
 		    /* mouse in: make it darker, and eventually bring up
 		     * meminfo */
 		    proximity = 1;
@@ -451,7 +423,7 @@ int main(int argc, char **argv)
 		    if (!bm.picture_lock)
 			bm.screen_type = get_screen_selection();
 		    break;
-		case GDK_LEAVE_NOTIFY:
+		    case LeaveNotify:
 		    /* mouse out: back to light */
 		    proximity = 0;
 		    break;
@@ -460,7 +432,6 @@ int main(int argc, char **argv)
 		    break;
 		}
 	    }
-	}
 #ifndef PRO
 	usleep(100000);
 #else
@@ -487,12 +458,26 @@ int main(int argc, char **argv)
 /* *INDENT-ON* */
 
 	/* actually draw the screen */
-#ifndef BLACKBOX
-	gdk_draw_rgb_image(bm.win, bm.gc, 4, 4, 56, 56,
-			   GDK_RGB_DITHER_NONE, bm.rgb_buf, 56 * 3);
-#endif
-	gdk_draw_rgb_image(bm.iconwin, bm.gc, 4, 4, 56, 56,
-			   GDK_RGB_DITHER_NONE, bm.rgb_buf, 56 * 3);
+	int xx,yy;
+	unsigned char * from=bm.rgb_buf;
+
+	for (xx=0;xx<BOX_SIZE*3;xx++) {
+		from[xx]/=4;
+		from[xx+BOX_SIZE*(BOX_SIZE-1)*3]=(255+from[xx+BOX_SIZE*(BOX_SIZE-1)*3])/2;
+	}
+
+	for (yy=0;yy<BOX_SIZE*BOX_SIZE*3;yy+=BOX_SIZE*3) {
+		from[yy  ]/=4; from[yy+1]/=4; from[yy+2]/=4;
+		from[yy+(BOX_SIZE-1)*3  ]=(255+from[yy+(BOX_SIZE-1)*3]  )/2;
+		from[yy+(BOX_SIZE-1)*3+1]=(255+from[yy+(BOX_SIZE-1)*3]+1)/2;
+		from[yy+(BOX_SIZE-1)*3+2]=(255+from[yy+(BOX_SIZE-1)*3]+2)/2;
+	}
+
+	for (yy=0;yy<BOX_SIZE;yy++)
+		for (xx=0;xx<BOX_SIZE;xx++,from+=3)
+			wmPutPixel(bm.xim,xx,yy,from[0],from[1],from[2]);
+
+	RedrawWindow(bm.xim);
 #ifdef ENABLE_MEMSCREEN
 	/* update graph histories */
 	if (memscreen_enabled)
@@ -513,13 +498,13 @@ static int get_screen_selection(void)
 
     if (first_time) {
 	first_time = 0;
-	lshift_code = XKeysymToKeycode(GDK_WINDOW_XDISPLAY(bm.win),
+	lshift_code = XKeysymToKeycode(wmxp_display,
 				       XStringToKeysym("Shift_L"));
-	rshift_code = XKeysymToKeycode(GDK_WINDOW_XDISPLAY(bm.win),
+	rshift_code = XKeysymToKeycode(wmxp_display,
 				       XStringToKeysym("Shift_R"));
     }
 
-    XQueryKeymap(GDK_WINDOW_XDISPLAY(bm.win), keys);
+    XQueryKeymap(wmxp_display, keys);
 
 #if 0
     if (0) {			/* debug */
@@ -549,83 +534,6 @@ static int get_screen_selection(void)
 /* This is the function that actually creates the display widgets */
 static void make_new_bubblemon_dockapp(void)
 {
-#define MASK GDK_BUTTON_PRESS_MASK | \
-    GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK
-
-    GdkWindowAttr attr;
-    GdkWindowAttr attri;
-    Window win;
-    Window iconwin;
-
-    XSizeHints sizehints;
-    XWMHints wmhints;
-
-    attr.width = 64;
-    attr.height = 64;
-    attr.title = NAME;
-    attr.event_mask = MASK;
-    attr.wclass = GDK_INPUT_OUTPUT;
-    attr.visual = gdk_visual_get_system();
-    attr.colormap = gdk_colormap_get_system();
-    attr.wmclass_name = NAME;
-    attr.wmclass_class = NAME;
-    attr.window_type = GDK_WINDOW_TOPLEVEL;
-
-    sizehints.flags = USSize;
-    sizehints.width = 64;
-    sizehints.height = 64;
-
-    bm.win = gdk_window_new(NULL, &attr,
-			    GDK_WA_TITLE | GDK_WA_WMCLASS |
-			    GDK_WA_VISUAL | GDK_WA_COLORMAP);
-    if (!bm.win)
-	fprintf(stderr, "Cannot make toplevel window\n");
-
-    attri.width = 64;
-    attri.height = 64;
-    attri.title = NAME;
-    attri.event_mask = MASK;
-    attri.wclass = GDK_INPUT_OUTPUT;
-    attri.visual = gdk_visual_get_system();
-    attri.colormap = gdk_colormap_get_system();
-    attri.wmclass_name = NAME;
-    attri.wmclass_class = NAME;
-    attri.window_type = GDK_WINDOW_TOPLEVEL;
-
-    bm.iconwin = gdk_window_new(bm.win, &attri,
-				GDK_WA_TITLE | GDK_WA_WMCLASS);
-    if (!bm.iconwin)
-	fprintf(stderr, "Cannot make icon window\n");
-
-    win = GDK_WINDOW_XWINDOW(bm.win);
-    iconwin = GDK_WINDOW_XWINDOW(bm.iconwin);
-    XSetWMNormalHints(GDK_WINDOW_XDISPLAY(bm.win), win, &sizehints);
-
-    wmhints.initial_state = WithdrawnState;
-    wmhints.icon_window = iconwin;
-    wmhints.icon_x = 0;
-    wmhints.icon_y = 0;
-    wmhints.window_group = win;
-    wmhints.flags =
-	StateHint | IconWindowHint | IconPositionHint | WindowGroupHint;
-    XSetWMHints(GDK_WINDOW_XDISPLAY(bm.win), win, &wmhints);
-
-    bm.gc = gdk_gc_new(bm.win);
-
-    bm.pixmap =
-	gdk_pixmap_create_from_xpm_d(bm.win, &(bm.mask), NULL, master_xpm);
-    gdk_window_shape_combine_mask(bm.win, bm.mask, 0, 0);
-    gdk_window_shape_combine_mask(bm.iconwin, bm.mask, 0, 0);
-
-    gdk_window_set_back_pixmap(bm.win, bm.pixmap, False);
-    gdk_window_set_back_pixmap(bm.iconwin, bm.pixmap, False);
-
-    gdk_window_show(bm.win);
-#ifdef KDE_DOCKAPP
-    /* makes the dockapp visible inside KDE wm */
-    gdk_window_show(bm.iconwin);
-#endif
-
     /* We begin with zero bubbles */
     bm.n_bubbles = 0;
 
@@ -633,8 +541,6 @@ static void make_new_bubblemon_dockapp(void)
     bubblemon_allocate_buffers();
 
     bubblemon_setup_samples();
-
-    bubblemon_setup_colors();
 #undef MASK
 }				/* make_new_bubblemon_dockapp */
 
@@ -642,14 +548,13 @@ static void make_new_bubblemon_dockapp(void)
  * This function, bubblemon_update, gets the CPU usage and updates
  * the bubble array and main rgb buffer.
  */
-static void bubblemon_update(int proximity)
-{
+static void bubblemon_update(int proximity) {
     Bubble *bubbles = bm.bubbles;
-    unsigned int i, loadPercentage, *col, x, y;
-    unsigned char *ptr, *buf, *buf_ptr;
-    unsigned int aircolor, watercolor, aliascolor;
+    unsigned int i, loadPercentage, x, y;
+    unsigned char reds[3], grns[3], blus[3];
+    unsigned char *ptr, *bubblebuf_ptr;
+    enum bubblebuf_values { watercolor, antialiascolor, aircolor };
     unsigned int waterlevels_goal;
-    /*int current_waterlevel_goal; */
 
     /* These values are for keeping track of where we have to start
        drawing water. */
@@ -657,7 +562,7 @@ static void bubblemon_update(int proximity)
     unsigned int real_waterlevel_min, real_waterlevel_max;
 
     /* These values are for keeping track how deep the duck is inside water */
-    unsigned int action_min = 56;
+    unsigned int action_min = BOX_SIZE;
     static unsigned int last_action_min = 0;
 
     /* Find out the CPU load */
@@ -670,35 +575,31 @@ static void bubblemon_update(int proximity)
 #endif				/* ENABLE_MEMSCREEN */
 
     /*
-       The buf is made up of ints (0-(NUM_COLORS-1)), each pointing out
-       an entry in the color table.  A pixel in the buf is accessed
-       using the formula buf[row * w + column].
-     */
-
+      The bubblebuf is made up of int8s (0..2), correspodning to the enum. A
+      pixel in the bubblebuf is accessed using the formula bubblebuf[row * w
+      + column].
+    */
 
     /* y coordinates are counted from here multiplied by 256 */
     /* to get actual screen coordinate, divide by 256 */
-    buf = bm.bubblebuf;
-    col = bm.colors;
 
     waterlevel_max = 0;
-    waterlevel_min = MAKEY(56);
+    waterlevel_min = MAKEY(BOX_SIZE);
 
     /* Move the water level with the current memory usage. */
-    waterlevels_goal = MAKEY(56) - ((bm.mem_percent * MAKEY(56)) / 100);
+    waterlevels_goal = MAKEY(BOX_SIZE) - ((bm.mem_percent * MAKEY(BOX_SIZE)) / 100);
 
     /* Guard against boundary errors */
     waterlevels_goal -= (1 << (POWER2 - 1));
 
     bm.waterlevels[0] = waterlevels_goal;
-    bm.waterlevels[55] = waterlevels_goal;
+    bm.waterlevels[BOX_SIZE-1] = waterlevels_goal;
 
-    for (x = 1; x < 55; x++) {
+    for (x = 1; x < BOX_SIZE-1; x++) {
 	/* Accelerate the current waterlevel towards its correct value */
 	bm.waterlevels_dy[x] +=
 	    (((bm.waterlevels[x - 1] + bm.waterlevels[x + 1] -
-	       2 * bm.waterlevels[x]) * bm.volatility_int) >> (POWER2 +
-							       1));
+	       2 * bm.waterlevels[x]) * bm.volatility_int) >> (POWER2 + 1));
 
 	bm.waterlevels_dy[x] *= bm.viscosity_int;
 	bm.waterlevels_dy[x] >>= POWER2;
@@ -709,13 +610,13 @@ static void bubblemon_update(int proximity)
 	    bm.waterlevels_dy[x] = -bm.speed_limit_int;
     }
 
-    for (x = 1; x < 55; x++) {
+    for (x = 1; x < BOX_SIZE-1; x++) {
 	/* Move the current water level */
 	bm.waterlevels[x] = bm.waterlevels[x] + bm.waterlevels_dy[x];
 
-	if (bm.waterlevels[x] > MAKEY(56)) {
+	if (bm.waterlevels[x] > MAKEY(BOX_SIZE)) {
 	    /* Stop the wave if it hits the floor... */
-	    bm.waterlevels[x] = MAKEY(56);
+	    bm.waterlevels[x] = MAKEY(BOX_SIZE);
 	    bm.waterlevels_dy[x] = 0;
 	} else if (bm.waterlevels[x] < 0) {
 	    /* ... or the ceiling. */
@@ -736,16 +637,6 @@ static void bubblemon_update(int proximity)
 	action_min = real_waterlevel_min;
 
     /*
-       Vary the colors of air and water with how many
-       percent of the available swap space that is in use.
-       32 = (99_numcolors / 3) - 1
-     */
-
-    watercolor = ((32 * bm.swap_percent) / 100) * 3;
-    aliascolor = watercolor + 1;
-    aircolor = watercolor + 2;
-
-    /*
        Draw the air-and-water background
 
        The waterlevel_max is the HIGHEST VALUE for the water level, which is
@@ -760,35 +651,30 @@ static void bubblemon_update(int proximity)
      */
 
     /* Air only */
-    memset(buf, aircolor, real_waterlevel_min * 56);
+    memset(bm.bubblebuf, aircolor, real_waterlevel_min * BOX_SIZE);
 
     /* Air and water */
-    for (x = 0; x < 56; x++) {
+    for (x = 0; x < BOX_SIZE; x++) {
 	/* Air... */
 	for (y = real_waterlevel_min;
-	     (signed) y < REALY(bm.waterlevels[x]); y++)
-	    buf[y * 56 + x] = aircolor;
-
+	     (signed) y < REALY(bm.waterlevels[x]); y++) /* why the (signed) ? */
+	    bm.bubblebuf[y * BOX_SIZE + x] = aircolor;
+	
 	/* ... and water */
 	for (; y < real_waterlevel_max; y++)
-	    buf[y * 56 + x] = watercolor;
+	    bm.bubblebuf[y * BOX_SIZE + x] = watercolor;
     }
 
     /* Water only */
-    memset(buf + real_waterlevel_max * 56, watercolor,
-	   (56 - real_waterlevel_max) * 56);
-
-    /*
-       Here comes the bubble magic.  Pixels are drawn by setting values in
-       buf to 0-NUM_COLORS.
-     */
+    memset(bm.bubblebuf + real_waterlevel_max * BOX_SIZE, watercolor,
+           (BOX_SIZE - real_waterlevel_max) * BOX_SIZE);
 
     /* Create a new bubble if the planets are correctly aligned... */
     if ((bm.n_bubbles < bm.maxbubbles)
 	&& ((rand() % 101) <= loadPercentage)) {
 	/* We don't allow bubbles on the edges 'cause we'd have to clip them */
-	bubbles[bm.n_bubbles].x = (rand() % 54) + 1;
-	bubbles[bm.n_bubbles].y = MAKEY(56) - 256;
+	bubbles[bm.n_bubbles].x = (rand() % (BOX_SIZE-2)) + 1;
+	bubbles[bm.n_bubbles].y = MAKEY(BOX_SIZE) - 256;
 	bubbles[bm.n_bubbles].dy = 0;
 #ifdef DEBUG_DUCK
 	fprintf (stderr, "new bubble:  bubbles[bm.n_bubbles].x = %i\n",
@@ -803,7 +689,7 @@ static void bubblemon_update(int proximity)
 	    bm.waterlevels[bubbles[bm.n_bubbles].x - 1] -= bm.ripples_int;
 	    bm.waterlevels[bubbles[bm.n_bubbles].x] -= bm.ripples_int;
 	    bm.waterlevels[bubbles[bm.n_bubbles].x + 1] -= bm.ripples_int;
-	    if (bubbles[bm.n_bubbles].x < 53)
+	    if (bubbles[bm.n_bubbles].x < (BOX_SIZE-3))
 		bm.waterlevels[bubbles[bm.n_bubbles].x + 2] -=
 		    bm.ripples_int;
 	}
@@ -821,8 +707,8 @@ static void bubblemon_update(int proximity)
 	bubbles[i].y += bubbles[i].dy;
 
 	/* is the bubble grossly out of bounds? */
-	if (bubbles[i].x < 1 || bubbles[i].x > 54 ||
-			bubbles[i].y > MAKEY(56)) {
+	if (bubbles[i].x < 1 || bubbles[i].x > (BOX_SIZE-2) ||
+	    bubbles[i].y > MAKEY(BOX_SIZE)) {
 #ifdef DEBUG_DUCK
 		fprintf (stderr, "bubble out of bounds "
 				"bubbles[%i].x=%i, bubbles[%i].y=%i\n", 
@@ -872,71 +758,98 @@ static void bubblemon_update(int proximity)
 	y = bubbles[i].y;
 
 	/*
-	   Clipping is not necessary for x, but it *is* for y.
-	   To prevent ugliness, we draw aliascolor only on top of
-	   watercolor, and aircolor on top of aliascolor.
-	 */
+	  Clipping is not necessary for x, but it *is* for y.
+	  To prevent ugliness, we draw antialiascolor only on top of
+	  watercolor, and aircolor on top of antialiascolor.
+	*/
 
 	/* Top row */
-	buf_ptr = &(buf[(((REALY(y) - 1) * 56) + 56) + x - 1]);
-	if (y > bm.waterlevels[x]) {
-	    if (*buf_ptr != aircolor) {
-		(*buf_ptr)++;
-	    }
-	    buf_ptr++;
-
-	    *buf_ptr = aircolor;
-	    buf_ptr++;
-
-	    if (*buf_ptr != aircolor) {
-		(*buf_ptr)++;
-	    }
-	    buf_ptr += 54;
+	bubblebuf_ptr = &(bm.bubblebuf[(((REALY(y) - 1) * BOX_SIZE) + BOX_SIZE) + x - 1]);
+	if (y >= bm.waterlevels[x]) {
+	    if (*bubblebuf_ptr < aircolor) 
+		(*bubblebuf_ptr)++; /* water becomes antialias; antialias becomes air for outside corners */
+	    bubblebuf_ptr++;
+	    
+	    *bubblebuf_ptr = aircolor;
+	    bubblebuf_ptr++;
+	    
+	    if (*bubblebuf_ptr < aircolor) 
+		(*bubblebuf_ptr)++;
+	    bubblebuf_ptr += BOX_SIZE-2;
 	} else {
-	    buf_ptr += 56;
+	    bubblebuf_ptr += BOX_SIZE;
 	}
-
-	/* Middle row - no clipping necessary */
-	*buf_ptr = aircolor;
-	buf_ptr++;
-	*buf_ptr = aircolor;
-	buf_ptr++;
-	*buf_ptr = aircolor;
-	buf_ptr += 54;
+	
+	/* Middle row - no color clipping necessary */
+	*bubblebuf_ptr = aircolor;
+	bubblebuf_ptr++;
+	*bubblebuf_ptr = aircolor;
+	bubblebuf_ptr++;
+	*bubblebuf_ptr = aircolor;
+	bubblebuf_ptr += BOX_SIZE-2;
 
 	/* Bottom row */
-	if (y < (MAKEY(56) - 256)) {
-	    if (*buf_ptr != aircolor) {
-		(*buf_ptr)++;
+	if (y < (MAKEY(BOX_SIZE) - 256)) {
+	    if (*bubblebuf_ptr < aircolor) {
+		(*bubblebuf_ptr)++;
 	    }
-	    buf_ptr++;
-
-	    *buf_ptr = aircolor;
-	    buf_ptr++;
-
-	    if (*buf_ptr != aircolor) {
-		(*buf_ptr)++;
+	    bubblebuf_ptr++;
+	    
+	    *bubblebuf_ptr = aircolor;
+	    bubblebuf_ptr++;
+	    
+	    if (*bubblebuf_ptr < aircolor) {
+		(*bubblebuf_ptr)++;
 	    }
 	}
     }
 
-    /* Drawing magic resides below this point */
-    ptr = bm.rgb_buf;
-    buf_ptr = buf;
-    i = 56 * 56;
-
-    while (i--) {
-	unsigned char *rgb = (unsigned char *) &col[*buf_ptr++];
-#if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || defined(_LITTLE_ENDIAN) || (BYTE_ORDER == LITTLE_ENDIAN)
-	*ptr++ = rgb[2];
-	*ptr++ = rgb[1];
-	*ptr++ = rgb[0];
-#else				/* big-endian. */
-	*ptr++ = rgb[1];
-	*ptr++ = rgb[2];
-	*ptr++ = rgb[3];
-#endif
-    }
+    /*
+      Vary the colors of air and water with how many percent of the available
+      swap space that is in use.
+    */
+#define GET_RED(x) (((x)>>16)&255)
+#define GET_GRN(x) (((x)>> 8)&255)
+#define GET_BLU(x) (((x)    )&255)
+
+	reds[watercolor] = 
+		(GET_RED(bm.liquid_maxswap) * bm.swap_percent +
+		 GET_RED(bm.liquid_noswap) * (100 - bm.swap_percent)) / 100;
+	reds[aircolor] = 
+		(GET_RED(bm.air_maxswap) * bm.swap_percent +
+		 GET_RED(bm.air_noswap) * (100 - bm.swap_percent)) / 100;
+	reds[antialiascolor] = ((int)reds[watercolor] + reds[aircolor])/2;
+
+	grns[watercolor] = 
+		(GET_GRN(bm.liquid_maxswap) * bm.swap_percent +
+		 GET_GRN(bm.liquid_noswap) * (100 - bm.swap_percent)) / 100;
+	grns[aircolor] = 
+		(GET_GRN(bm.air_maxswap) * bm.swap_percent +
+		 GET_GRN(bm.air_noswap) * (100 - bm.swap_percent)) / 100;
+	grns[antialiascolor] = ((int)grns[watercolor] + grns[aircolor])/2;
+
+	blus[watercolor] = 
+		(GET_BLU(bm.liquid_maxswap) * bm.swap_percent +
+		 GET_BLU(bm.liquid_noswap) * (100 - bm.swap_percent)) / 100;
+	blus[aircolor] = 
+		(GET_BLU(bm.air_maxswap) * bm.swap_percent +
+		 GET_BLU(bm.air_noswap) * (100 - bm.swap_percent)) / 100;
+	blus[antialiascolor] = ((int)blus[watercolor] + blus[aircolor])/2;
+
+#undef GET_RED
+#undef GET_GRN
+#undef GET_BLU
+
+	ptr = bm.rgb_buf;
+	bubblebuf_ptr = bm.bubblebuf;
+	i = BOX_SIZE * BOX_SIZE;
+
+	while (i--) {
+		*ptr++ = reds[*bubblebuf_ptr];
+		*ptr++ = grns[*bubblebuf_ptr];
+		*ptr++ = blus[*bubblebuf_ptr];
+		bubblebuf_ptr++;
+	}
 #ifdef ENABLE_DUCK
     if (duck_enabled) {
 	duck_swimmer((last_action_min <
@@ -945,20 +858,18 @@ static void bubblemon_update(int proximity)
     }
 #endif
 
-    /* damn, thats ugly. Of course, the first solution that comes to mind
-     * about this isn't the right one :) */
+#if defined(ENABLE_CPU) || defined(ENABLE_MEMSCREEN)
+	if (
+#ifdef ENABLE_CPU
+	    cpu_enabled
+#endif
 #if defined(ENABLE_CPU) && defined(ENABLE_MEMSCREEN)
-    if (cpu_enabled || memscreen_enabled) {
-	realtime_alpha_blend_of_cpu_usage(loadPercentage, proximity);
-    }
+	    ||
 #endif
-#if defined(ENABLE_CPU) && !defined(ENABLE_MEMSCREEN)
-    if (cpu_enabled) {
-	realtime_alpha_blend_of_cpu_usage(loadPercentage, proximity);
-    }
+#ifdef ENABLE_MEMSCREEN
+	    memscreen_enabled
 #endif
-#if !defined(ENABLE_CPU) && defined(ENABLE_MEMSCREEN)
-    if (memscreen_enabled) {
+	    ) {
 	realtime_alpha_blend_of_cpu_usage(loadPercentage, proximity);
     }
 #endif
@@ -969,45 +880,53 @@ static void bubblemon_update(int proximity)
 
 #ifdef ENABLE_MEMSCREEN
 /* draws 4x8 digits for the memory/swap panel */
-static void draw_digit(int srcx, int srcy, int destx, int desty)
+static void draw_digit(int num, unsigned char * whither, unsigned char red, unsigned char grn, unsigned char blu)
 {
-    int i, j;
-    char *from, *to;
-
-    for (j = 0; j < 8; j++) {
-	from = mem_screen + 56 * 3 * (srcy + j) + srcx * 3;
-	to = bm.mem_buf + 56 * 3 * (desty + j) + destx * 3;
-	i = 12;
-	while (i--)
-	    *to++ = *from++;
-    }
+	int xx, yy;
+	char *from;
+	unsigned char *to;
+    
+	num *= 4;
+
+	for (yy = 0; yy < 8; yy++) {
+		to = whither + BOX_SIZE*3*yy;
+		from = &numbers_xpm[3+yy][num];
+		for (xx = 0; xx < 4; xx++, from++, to+=3 ) {
+			if (*from==' ') { 
+				to[0] = red; to[1] = grn; to[2] = blu;
+			}
+		}
+	}
 }
 
 /* draws a string using previous function. non-digits and non-K/M = space */
 static void draw_string(char *string, int x, int y, int color)
 {
-    unsigned char c;
-
-    while ((c = *string++)) {
-	if (c == 'K') {
-	    draw_digit(40, (color) ? 69 : 60, x, y);
-	} else if (c == 'M') {
-	    draw_digit(44, (color) ? 69 : 60, x, y);
-	} else if (c == ' ') {
-	    draw_digit(50, 60, x, y);	/* blank space */
-	} else {
-	    c -= '0';
-	    draw_digit(c * 4, (color) ? 69 : 60, x, y);
+	unsigned char c;
+	const unsigned char reds[4]={ 48,237,158,  0};
+	const unsigned char grns[4]={140, 23,196,255};
+	const unsigned char blus[4]={240, 23,237,233};
+
+	if (pale) color += 2;
+
+	/* bluish rgb:48,140,240  pale rgb:158,196,237
+	   reddish rgb:237,23,23  pale(cyan) rgb:0,255,233 */
+
+	while ((c = *string++)) {
+		if (c == 'K') c = 10;
+		else if (c == 'M') c = 11;
+		else if (c >= '0' && c <= '9') c -= '0';
+
+		if (c <= 11)
+			draw_digit(c, &bm.mem_buf[3*(y*BOX_SIZE+x)], reds[color], grns[color], blus[color]);
+		x += 4;
 	}
-	x += 4;
-    }
 }
 
-static void draw_pixel(unsigned int x, unsigned int y, unsigned char *buf,
-		       unsigned char *c)
+static void draw_pixel(unsigned int x, unsigned int y, unsigned char *buf, char *c)
 {
     unsigned char *ptr;
-    ptr = buf + y * 56 * 3 + x * 3 + 6;	/* +6 = x + 2 */
+    ptr = buf + y * BOX_SIZE * 3 + x * 3 + 6;	/* +6 = x + 2 */
     *ptr++ = *c++;
     *ptr++ = *c++;
     *ptr++ = *c++;
@@ -1015,41 +934,34 @@ static void draw_pixel(unsigned int x, unsigned int y, unsigned char *buf,
 
 /* draw graph num x size, data taken from history, into rgb buffer buf.
  * this is called not very often: only 1 time out of 250 */
-static void draw_history(int num, int size, unsigned int *history,
-			 unsigned char *buf)
+static void draw_history(int num, int size, unsigned int *history, unsigned char *buf)
 {
     int pixels_per_byte;
     int j, k;
-    int *p;
     int d;
 
     pixels_per_byte = 100;
-    p = history;
 
     for (j = 0; j < num; j++) {
-	if (p[0] > pixels_per_byte)
+		while (history[j] > pixels_per_byte) /* autoscaling */
 	    pixels_per_byte += 100;
-	p++;
-    }
-
-    p = history;
+	}
 
     for (k = 0; k < num; k++) {
-	d = (1.0 * p[0] / pixels_per_byte) * size;
+	d = size * history[k] / pixels_per_byte;
 
 	for (j = 0; j < size; j++) {
 	    if (j < d - 2)
-		draw_pixel(k, size - j - 1, buf, "\x00\x7d\x71");
+		draw_pixel(k, size - j - 1, buf, "\x00\x7d\x71"); /* dark cyan for lower part of bar graph */
 	    else if (j < d)
-		draw_pixel(k, size - j - 1, buf, "\x20\xb6\xae");
+		draw_pixel(k, size - j - 1, buf, "\x20\xb6\xae"); /* seagreen for top two pixels */
 	}
-	p++;
     }
 
-    for (j = pixels_per_byte - 100; j > 0; j -= 100) {
+    for (j = pixels_per_byte - 100; j > 0; j -= 100) { /* draw lines for each 100s */
 	for (k = 0; k < num; k++) {
-	    d = ((float) size / pixels_per_byte) * j;
-	    draw_pixel(k, size - d - 1, buf, "\x71\xe3\x71");
+	    d = size * j / pixels_per_byte;
+	    draw_pixel(k, size - d - 1, buf, "\x71\xe3\x71"); /* spring green */
 	}
     }
 }
@@ -1067,18 +979,18 @@ static void render_secondary(void)
      * digits: 0, 60 and 0, 69 */
 
     /* make a clean buffer with blank spaces. */
-    memcpy(bm.mem_buf, bm.screen_type ? load_screen : mem_screen,
-	   56 * 56 * 3);
+    memcpy(bm.mem_buf, bm.screen_type ? load_screen.pixel_data : mem_screen.pixel_data,
+           BOX_SIZE * BOX_SIZE * 3);
 
     if (bm.screen_type) {
 	for (i = 0; i < 3; i++) {
 	    sprintf(number, "%2d", bm.loadavg[i].i);
-	    draw_string(number, 19 * i, 8, 0);
+	    draw_string(number, 1+(4*4+2+1)*i, 9, 0);
 	    sprintf(number, "%02d", bm.loadavg[i].f);
-	    draw_string(number, 19 * i + 10, 8, 0);
+	    draw_string(number, 1+(4*4+2+1)*i + 4*2 + 2, 9, 0);
 	}
 	/* copy history graph from previous rollover */
-	memcpy(bm.mem_buf + 19 * 56 * 3, bm.his_bufb, 56 * 33 * 3);
+	memcpy(bm.mem_buf + 19 * BOX_SIZE * 3, bm.his_bufb, BOX_SIZE * 33 * 3);
     } else {
 	/* draw memory */
 	if (memscreen_megabytes)
@@ -1086,8 +998,8 @@ static void render_secondary(void)
 	else
 	    snprintf(number, 8, "%6lluK", bm.mem_used >> 10);
 	snprintf(percent, 4, "%03d", bm.mem_percent);
-	draw_string(number, 2, 1, (bm.mem_percent > 90) ? 1 : 0);
-	draw_string(percent, 38, 1, (bm.mem_percent > 90) ? 1 : 0);
+	draw_string(number, 3, 2, (bm.mem_percent > 90) ? 1 : 0);
+	draw_string(percent, 39, 2, (bm.mem_percent > 90) ? 1 : 0);
 
 	/* draw swap */
 	if (memscreen_megabytes)
@@ -1095,16 +1007,15 @@ static void render_secondary(void)
 	else
 	    snprintf(number, 8, "%6lluK", bm.swap_used >> 10);
 	snprintf(percent, 4, "%03d", bm.swap_percent);
-	draw_string(number, 2, 10, (bm.swap_percent > 90) ? 1 : 0);
-	draw_string(percent, 38, 10, (bm.swap_percent > 90) ? 1 : 0);
+	draw_string(number, 3, 11, (bm.swap_percent > 90) ? 1 : 0);
+	draw_string(percent, 39, 11, (bm.swap_percent > 90) ? 1 : 0);
 
 	/* copy history graph from previous rollover */
-	memcpy(bm.mem_buf + 21 * 56 * 3, bm.his_bufa, 56 * 31 * 3);
+	memcpy(bm.mem_buf + 21 * BOX_SIZE * 3, bm.his_bufa, BOX_SIZE * 31 * 3);
     }
 }
 
-static void roll_membuffer(void)
-{
+static void roll_membuffer(void) {
     static int delay;
 
     if (++delay < 30)
@@ -1114,69 +1025,62 @@ static void roll_membuffer(void)
     render_secondary();
 }
 
-static void roll_history(void)
-{
-    unsigned int yep, j;
+static void roll_history(void)  {
     static int update, doit;
 
-    if (doit-- <= 0) {
-	doit = ROLLVALUE;
-	if (update-- <= 0) {
+    if (--doit <= 0) {
+	doit = ROLLVALUE; /* how many redraws before we sample new data */
+	if (--update <= 0) {
+	    /* reset counter; 5 = the number of samples to average into one point on 
+	       the bar graph. Probably should be configurable. */
+
 
 	    /* roll history buffers, averaging last 5 samples */
-	    if (bm.history[52])
-		bm.history[52] /= bm.hisadd;
+	    if (bm.hisadd)
+		bm.history[BOX_SIZE-4] /= bm.hisadd;
+	    if (bm.memadd)
+		bm.memhist[BOX_SIZE-4] /= bm.memadd;
 
-	    if (bm.memhist[52])
-		bm.memhist[52] /= bm.memadd;
+	    memmove(&bm.history[0], &bm.history[1], sizeof(bm.history));
+	    memmove(&bm.memhist[0], &bm.memhist[1], sizeof(bm.memhist));
 
-	    for (j = 1; j < 53; j++) {
-		bm.history[j - 1] = bm.history[j];
-		bm.memhist[j - 1] = bm.memhist[j];
-	    }
-	    bm.history[52] = 0;
+	    bm.history[BOX_SIZE-4] = 0;
 	    bm.hisadd = 0;
-	    bm.memhist[52] = 0;
+	    bm.memhist[BOX_SIZE-4] = 0;
 	    bm.memadd = 0;
 
 	    /* refresh backgrounds */
-	    memcpy(bm.his_bufa, mem_screen + 21 * 56 * 3, 31 * 56 * 3);
-	    memcpy(bm.his_bufb, load_screen + 19 * 56 * 3, 33 * 56 * 3);
+	    memcpy(bm.his_bufa, mem_screen.pixel_data + 21 * BOX_SIZE * 3, 31 * BOX_SIZE * 3);
+	    memcpy(bm.his_bufb, load_screen.pixel_data + 19 * BOX_SIZE * 3, 33 * BOX_SIZE * 3);
 
 	    /* render memory graph */
-	    draw_history(52, 31, bm.memhist, bm.his_bufa);
+	    draw_history(BOX_SIZE-4, 31, bm.memhist, bm.his_bufa);
 	    /* render load average graph */
-	    draw_history(52, 33, bm.history, bm.his_bufb);
+	    draw_history(BOX_SIZE-4, 33, bm.history, bm.his_bufb);
 
 	    /* reset counter */
 	    update = 5;
 	}
 
 	/* do load average history update */
-	yep = bm.loadavg[0].f + (bm.loadavg[0].i * 100);
-	bm.history[52] += yep;
+	bm.history[BOX_SIZE-4] += bm.loadavg[0].f + (bm.loadavg[0].i * 100);
 	bm.hisadd++;
 
 	/* do memory history update */
-	yep = bm.mem_percent;
-	bm.memhist[52] += yep;
+	bm.memhist[BOX_SIZE-4] += bm.mem_percent;
 	bm.memadd++;
     }
 }
 #endif				/* ENABLE_MEMSCREEN */
 
 #ifdef ENABLE_CPU
-/* draws digits for the CPU meter. This function is very specific
- * to the meter.  Arguments it takes are not what they seem initially */
-static void draw_cpudigit(const int what, const int where,
-			  unsigned char *kit)
-{
+static void draw_cpudigit(int what, unsigned char *whither) {
     unsigned int len, y;
     unsigned char *to, *from;
-    for (y = 0; y < 9; y++) {
-	len = 21;
-	to = kit + y * 75 + where;
-	from = digits + y * 285 + what;
+    for (y = 0; y < 9; y++) { /* magic numbers suck. */
+	len = 7*3;
+	to = whither + y * 3*25;
+	from = digits + y * 3*95 + what*3*6;
 	while (len--)
 	    *to++ = *from++;
     }
@@ -1190,25 +1094,25 @@ static void draw_dtchr(const char letter, unsigned char * rgbbuf) {
     for (y=0;y<7;y++)
       for (x=0;x<5;x++) 
 	if (clockdigit[x+(y*10+(letter-'0'))*6]=='M') {
-	  rgbbuf[(x+y*56)*3  ]>>=1;
- 	  rgbbuf[(x+y*56)*3+1]>>=1;
- 	  rgbbuf[(x+y*56)*3+2]>>=1;
+	  rgbbuf[(x+y*BOX_SIZE)*3  ]>>=1;
+ 	  rgbbuf[(x+y*BOX_SIZE)*3+1]>>=1;
+ 	  rgbbuf[(x+y*BOX_SIZE)*3+2]>>=1;
 	}
   } else if (letter>='@' && letter<='~') {
     for (y=0;y<7;y++)
       for (x=0;x<4;x++) 
 	if (clockalpha[x+(y*63+(letter-'@'))*5]=='M') {
-	  rgbbuf[(x+y*56)*3  ]>>=1;
- 	  rgbbuf[(x+y*56)*3+1]>>=1;
- 	  rgbbuf[(x+y*56)*3+2]>>=1;
+	  rgbbuf[(x+y*BOX_SIZE)*3  ]>>=1;
+ 	  rgbbuf[(x+y*BOX_SIZE)*3+1]>>=1;
+ 	  rgbbuf[(x+y*BOX_SIZE)*3+2]>>=1;
 	}
   } else if (letter==':') {
-    rgbbuf[3*56*3  ]>>=1;
-    rgbbuf[3*56*3+1]>>=1;
-    rgbbuf[3*56*3+2]>>=1;
-    rgbbuf[5*56*3  ]>>=1;
-    rgbbuf[5*56*3+1]>>=1;
-    rgbbuf[5*56*3+2]>>=1;
+    rgbbuf[3*BOX_SIZE*3  ]>>=1;
+    rgbbuf[3*BOX_SIZE*3+1]>>=1;
+    rgbbuf[3*BOX_SIZE*3+2]>>=1;
+    rgbbuf[5*BOX_SIZE*3  ]>>=1;
+    rgbbuf[5*BOX_SIZE*3+1]>>=1;
+    rgbbuf[5*BOX_SIZE*3+2]>>=1;
   }
 }
 
@@ -1220,10 +1124,10 @@ static void draw_largedigit(char number, unsigned char * rgbbuf) {
   if (number>=0 && number<=9) {
     for (y=0;y<32;y++)
       for (x=0;x<13;x++) {
-	v=bigdigits[number*13+x+y*130]>>2;
-        t=rgbbuf[(x+y*56)*3  ]+v; if (t>255) t=255; rgbbuf[(x+y*56)*3  ]=t;
-        t=rgbbuf[(x+y*56)*3+1]+v; if (t>255) t=255; rgbbuf[(x+y*56)*3+1]=t;
-        t=rgbbuf[(x+y*56)*3+2]+v; if (t>255) t=255; rgbbuf[(x+y*56)*3+2]=t;
+	      v=bigdigits[number*13+x+y*130]>>2;
+        t=rgbbuf[(x+y*BOX_SIZE)*3  ]+v; if (t>255) t=255; rgbbuf[(x+y*BOX_SIZE)*3  ]=t;
+        t=rgbbuf[(x+y*BOX_SIZE)*3+1]+v; if (t>255) t=255; rgbbuf[(x+y*BOX_SIZE)*3+1]=t;
+        t=rgbbuf[(x+y*BOX_SIZE)*3+2]+v; if (t>255) t=255; rgbbuf[(x+y*BOX_SIZE)*3+2]=t;
       }
   }
 }
@@ -1250,9 +1154,9 @@ static void draw_datetime(unsigned char * rgbbuf) {
 
   /* Sat Jan 04 */
 
-#define DOWx  6
-#define MONx 22
-#define DOMx 38
+#define DOWx  9
+#define MONx 25
+#define DOMx 41
   /* draw day-of-week (14 px)*/
   draw_dtchr(days[mytime->tm_wday][0],rgbbuf+(DOWx   )*3+56*3);
   draw_dtchr(days[mytime->tm_wday][1],rgbbuf+(DOWx+ 5)*3+56*3);
@@ -1265,18 +1169,18 @@ static void draw_datetime(unsigned char * rgbbuf) {
   draw_dtchr((mytime->tm_mday)/10+'0',rgbbuf+(DOMx   )*3+56*3);
   draw_dtchr((mytime->tm_mday)%10+'0',rgbbuf+(DOMx+ 6)*3+56*3);
 
-  draw_largedigit(mytime->tm_hour/10,rgbbuf+1*3+56*3*13);
-  draw_largedigit(mytime->tm_hour%10,rgbbuf+14*3+56*3*13);
-  draw_largedigit(mytime->tm_min/10,rgbbuf+27*3+56*3*13);
-  draw_largedigit(mytime->tm_min%10,rgbbuf+40*3+56*3*13);
+  draw_largedigit(mytime->tm_hour/10,rgbbuf+3*(3+BOX_SIZE*13));
+  draw_largedigit(mytime->tm_hour%10,rgbbuf+3*(16+BOX_SIZE*13));
+  draw_largedigit(mytime->tm_min/10,rgbbuf+3*(30+BOX_SIZE*13));
+  draw_largedigit(mytime->tm_min%10,rgbbuf+3*(43+BOX_SIZE*13));
 }
 
 #if defined(ENABLE_CPU) || defined(ENABLE_MEMSCREEN)
 static void realtime_alpha_blend_of_cpu_usage(int cpu, int proximity)
 {
     /* where is the text going to be (now, bottom-center) */
-#define POSX 16
-#define POSY 46
+#define POSX (BOX_SIZE/2-12)
+#define POSY (BOX_SIZE-10)
     int bob;
 
     /* memory window */
@@ -1291,31 +1195,33 @@ static void realtime_alpha_blend_of_cpu_usage(int cpu, int proximity)
     int hibyte, y, pos;
 
     /* CPU load buffer */
-    static unsigned char kit[25 * 3 * 9 + 1];
+    static unsigned char kit[25 * 3 * 9 + 1]; /* 9 high, 25 wide, 3bpp */
     unsigned char *kitptr;
 
     /* the plan is simple.  we don't want to redraw the digits every update
      * because that doesn't look so good.  so we average it, and draw only
-     * once every 10 updates. We alpha blend the static buffer so we still
-     * get cool transparency effects. */
+     * once every N updates. 
+
+     * We alpha blend the static buffer so we still get cool transparency
+     * effects. */
     avg += cpu;
 
-    while (++yoh > 10) {
-	cpu = avg / 10;
-	avg ^= avg;		/* zero.  Haha, I guess these are not */
-	yoh ^= yoh;		/* register vars, optimizer just zeros them */
-	hibyte = cpu / 10;	/* but it's cool to know it understands xor a, a */
+    /* 2 here is adjusted to mean 100ms*2=5Hz. Originally it was 15ms*10 meaning 7Hz */
+    while (++yoh > 2) {
+	cpu = avg / 2;
+	avg = yoh = 0;
+	hibyte = cpu / 10;
 	if (hibyte == 10) {
-	    draw_cpudigit(18, 0, kit);
-	    draw_cpudigit(0, 18, kit);
-	    draw_cpudigit(0, 36, kit);
+	    draw_cpudigit(1, kit);
+	    draw_cpudigit(0, &kit[3*6]);
+	    draw_cpudigit(0, &kit[3*12]);
 	} else {
-	    draw_cpudigit(216, 0, kit);
-	    draw_cpudigit(hibyte * 18, 18, kit);
-	    draw_cpudigit((cpu % 10) * 18, 36, kit);
+	    draw_cpudigit(12, kit);
+	    draw_cpudigit(hibyte, &kit[3*6]);
+	    draw_cpudigit(cpu % 10, &kit[3*12]);
 	}
 	/* percent sign is always there */
-	draw_cpudigit(180, 54, kit);
+	draw_cpudigit(10, &kit[3*18]);
     }
 #endif				/* ENABLE_CPU */
 
@@ -1368,7 +1274,7 @@ static void realtime_alpha_blend_of_cpu_usage(int cpu, int proximity)
 	kitptr = kit;
 	for (y = 0; y < 9; y++) {
 	    unsigned char src;
-	    pos = (y + POSY) * 56 * 3 + (POSX * 3);
+	    pos = (y + POSY) * BOX_SIZE * 3 + (POSX * 3);
 	    bob = 75;		/* 25 * 3 */
 	    while (bob--) {
 		src = bm.rgb_buf[pos];
@@ -1392,7 +1298,7 @@ static void realtime_alpha_blend_of_cpu_usage(int cpu, int proximity)
 	unsigned char *ptr, *ptr2, src;
 	ptr = bm.mem_buf;
 	ptr2 = bm.rgb_buf;
-	bob = 9408;		/* 56 * 56 * 3 */
+	bob = BOX_SIZE * BOX_SIZE * 3;
 	while (bob--) {
 	    src = *ptr2;
 	    *ptr2++ = (memblend * src + (256 - memblend) * *ptr++) >> 8;
@@ -1423,17 +1329,17 @@ static void duck_set(int x, int y, int nr, int rev, int upsidedown)
     if (y < 0)
 	ds = -(y);
     dh = 17;
-    if ((y + 17) > 56)
-	dh = 56 - y;
+    if ((y + 17) > BOX_SIZE)
+	dh = BOX_SIZE - y;
     dw = 18;
-    if (x > 38)
-	dw = 18 - (x - 38);
+    if (x > BOX_SIZE-18)
+	dw = 18 - (x - (BOX_SIZE-18));
     di = 0;
     if (x < 0)
 	di = -(x);
     for (h = ds; h < dh; h++) {
 	/* calculate this only once */
-	int ypos = (h + y) * 56;
+	int ypos = (h + y) * BOX_SIZE;
 #ifdef UPSIDE_DOWN_DUCK
 	rh = (upsidedown && upside_down_duck_enabled) ? 16 - h : h;
 #endif
@@ -1483,14 +1389,12 @@ static int animate_correctly(void)
        instead of 0,1,2,0,1,2 <- this way the duck looks really ugly
        instead of keeping 2 counters we just made it longer */
 
-    static int outp[48] =
-	{ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0,
-	1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2,
-	2, 2, 1, 1, 1, 1
-    };
+    const int outp[16] =
+	{ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1
+	};
     static int totalcounter = -1;
 
-    if (++totalcounter > 47)
+    if (++totalcounter > 15)
 	totalcounter = 0;
 
     return outp[totalcounter];
@@ -1527,8 +1431,8 @@ static void duck_swimmer(int posy)
 	    rev = 1;
 	}
     } else {
-	if (tx++ > 57) {
-	    tx = 57;
+	if (tx++ > BOX_SIZE+1) {
+	    tx = BOX_SIZE+1;
 	    rev = 0;
 	}
     }
@@ -1560,83 +1464,6 @@ static void bubblemon_setup_samples(void)
     }
 }
 
-static void bubblemon_setup_colors(void)
-{
-#define NUM_COLORS 99
-    int i, j, *col;
-    int r_air_noswap, g_air_noswap, b_air_noswap;
-    int r_liquid_noswap, g_liquid_noswap, b_liquid_noswap;
-    int r_air_maxswap, g_air_maxswap, b_air_maxswap;
-    int r_liquid_maxswap, g_liquid_maxswap, b_liquid_maxswap;
-    int actual_colors = NUM_COLORS / 3;
-
-    if (!bm.colors)
-	bm.colors = malloc(NUM_COLORS * sizeof(int));
-
-    col = bm.colors;
-
-    r_air_noswap = (bm.air_noswap >> 16) & 0xff;
-    g_air_noswap = (bm.air_noswap >> 8) & 0xff;
-    b_air_noswap = (bm.air_noswap) & 0xff;
-
-    r_liquid_noswap = (bm.liquid_noswap >> 16) & 0xff;
-    g_liquid_noswap = (bm.liquid_noswap >> 8) & 0xff;
-    b_liquid_noswap = (bm.liquid_noswap) & 0xff;
-
-    r_air_maxswap = (bm.air_maxswap >> 16) & 0xff;
-    g_air_maxswap = (bm.air_maxswap >> 8) & 0xff;
-    b_air_maxswap = (bm.air_maxswap) & 0xff;
-
-    r_liquid_maxswap = (bm.liquid_maxswap >> 16) & 0xff;
-    g_liquid_maxswap = (bm.liquid_maxswap >> 8) & 0xff;
-    b_liquid_maxswap = (bm.liquid_maxswap) & 0xff;
-
-    for (i = 0; i < actual_colors; i++) {
-	int r, g, b;
-	int r_composite, g_composite, b_composite;
-
-	j = i >> 1;
-
-	/* Liquid */
-	r = (r_liquid_maxswap * j +
-	     r_liquid_noswap * ((actual_colors - 1) -
-				j)) / (actual_colors - 1);
-	g = (g_liquid_maxswap * j +
-	     g_liquid_noswap * ((actual_colors - 1) -
-				j)) / (actual_colors - 1);
-	b = (b_liquid_maxswap * j +
-	     b_liquid_noswap * ((actual_colors - 1) -
-				j)) / (actual_colors - 1);
-
-	r_composite = r;
-	g_composite = g;
-	b_composite = b;
-	col[(i * 3)] = (r << 16) | (g << 8) | b;
-
-	/* Air */
-	r = (r_air_maxswap * j +
-	     r_air_noswap * ((actual_colors - 1) - j)) / (actual_colors -
-							  1);
-	g = (g_air_maxswap * j +
-	     g_air_noswap * ((actual_colors - 1) - j)) / (actual_colors -
-							  1);
-	b = (b_air_maxswap * j +
-	     b_air_noswap * ((actual_colors - 1) - j)) / (actual_colors -
-							  1);
-	r_composite += r;
-	g_composite += g;
-	b_composite += b;
-	col[(i * 3) + 2] = (r << 16) | (g << 8) | b;
-
-	/* Anti-alias */
-	r = r_composite >> 1;
-	g = g_composite >> 1;
-	b = b_composite >> 1;
-	col[(i * 3) + 1] = (r << 16) | (g << 8) | b;
-    }
-#undef NUM_COLORS
-}
-
 static void bubblemon_allocate_buffers(void)
 {
     int i;
@@ -1648,22 +1475,22 @@ static void bubblemon_allocate_buffers(void)
     if (bm.bubblebuf)
 	free(bm.bubblebuf);
 
-    bm.bubblebuf = calloc(56 * 60, sizeof(char));
+	bm.bubblebuf = calloc(BOX_SIZE * (BOX_SIZE+4), sizeof(char));
 
     /* Allocate water level memory */
     if (bm.waterlevels)
 	free(bm.waterlevels);
 
-    bm.waterlevels = malloc(56 * sizeof(int));
-    for (i = 0; i < 56; i++) {
-	bm.waterlevels[i] = MAKEY(56);
-    }
+	bm.waterlevels = malloc(BOX_SIZE * sizeof(int));
+	for (i = 0; i < BOX_SIZE; i++) {
+		bm.waterlevels[i] = MAKEY(BOX_SIZE);
+	}
 
     /* Allocate water level velocity memory */
     if (bm.waterlevels_dy)
 	free(bm.waterlevels_dy);
 
-    bm.waterlevels_dy = calloc(56, sizeof(int));
+	bm.waterlevels_dy = calloc(BOX_SIZE, sizeof(int));
 }
 
 static void get_memory_load_percentage(void)
diff --git a/clockfont.txt b/clockfont.txt
new file mode 100644
index 0000000..0641b31
--- /dev/null
+++ b/clockfont.txt
@@ -0,0 +1,36 @@
+0123456789
+
+5x7
+
+-###----#----###---###-----##-#####--###--#####--###---###-
+#---#--##---#---#-#---#---#-#-#-----#---#-----#-#---#-#---#
+#---#---#-------#-----#--#--#-####--#---------#-#---#-#---#
+#---#---#------#----##--#####-#---#-####-----#---###---####
+#---#---#-----#-------#-----#-----#-#---#---#---#---#-----#
+#---#---#----#----#---#-----#-#---#-#---#---#---#---#-#---#
+-###---###--#####--###------#--###---###----#----###---###-
+
+ABCDEFGJLMNOPRSTUY
+Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
+ADFJMNO
+abceglnoruy
+
+4#7
+
+-##---##--###---##--###--####-####--##--#--#-###--####-#--#-#----#--#-#--#--##--###---##--###---##--###--#--#-#--#-#--#-#--#-#--#-####--###-#----###---##--------#--------#------------#--------#-------#--------------#-----#---------------------------------------#------------------------------------#--#---#-----#-#
+#--#-#--#-#--#-#--#-#--#-#----#----#--#-#--#--#------#-#--#-#----####-##-#-#--#-#--#-#--#-#--#-#--#--#---#--#-#--#-#--#-#--#-#--#----#--#---#------#--#--#--------#-------#------------#-------#-#------#-----#--------#-----#---------------------------------------#-----------------------------------#---#----#---#-#
+#-##-#--#-#--#-#----#--#-#----#----#----#--#--#------#-#-#--#----#--#-##-#-#--#-#--#-#--#-#--#-#-----#---#--#-#--#-#--#--##--#-#----#---#----#-----#------------------##--###---##---###--##---#----###-###------------#--#--#--------###---##--###---###-###---sss-####-#--#-#--#-#--#-#--#-#--#-####---#---#----#
+#-##-####-###--#----#--#-###--###--#-##-####--#------#-##---#----#--#-#-##-#--#-###--#--#-###---##---#---#--#-#--#-#--#--##---#----#----#-----#----#--------------------#-#--#-#--#-#--#-#--#-####-#--#-#--#--#--------#-#---#--------#--#-#--#-#--#-#--#-#--#-s-----#---#--#-#--#-#--#-#--#-#--#----#--#----#-----#
+#-##-#--#-#--#-#----#--#-#----#----#--#-#--#--#------#-#-#--#----#--#-#-##-#--#-#----#--#-#--#----#--#---#--#-#--#-#--#-#--#--#---#-----#-----#----#------------------###-#--#-#----#--#-####--#----###-#--#--#--------##----#--------#--#-#--#-#--#-#--#-#-----ss---#---#--#-#--#-#--#--##---###--##----#---#----#
+#----#--#-#--#-#--#-#--#-#----#----#--#-#--#--#---#--#-#--#-#----#--#-#--#-#--#-#----#-##-#--#-#--#--#---#--#--#-#-####-#--#--#---#-----#------#---#-----------------#--#-#--#-#--#-#--#-#-----#------#-#--#--#--------#-#---#--------#--#-#--#-###---###-#-------s--#-#-#--#--#-#-####-#--#----#-#------#---#----#
+-###-#--#-###---##--###--####-#-----##--#--#-###---##--#--#-####-#--#-#--#--##--#-----###-#--#--##---#----##----#--#--#-#--#--#---####--###----#-###-------####-------###-###---##---###--###--#---###--#--#--#---jjjj-#--#--##--mmmm-#--#--##--#-------#-#----sss----#---###---#--#--#-#--#-###--####----#--#---#
+
+
+
+
+
+
+
+
+
+
diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644
index 0000000..81e223f
--- /dev/null
+++ b/debian/README.Debian
@@ -0,0 +1,7 @@
+wmbubble for Debian
+----------------------
+
+Changed the name from bubblemon to wmbubble.
+There is a GNOME app called bubblemon, but this one is better.
+
+ -- John H. Robinson, IV <jaqque at debian.org>, Thu,  1 Feb 2001 22:06:04 -0800
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..5bbe178
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,125 @@
+wmbubble (1.46-2.1) unstable; urgency=low
+
+  * debian/control
+    - (Build-Depends): Add libx11-dev due to KDE_DOCKAPP.
+    - (Standards-Version): Update to 3.9.1.
+  * debian/patches
+    - (Number 04): Refresh. Enable KDE_DOCKAPP to make duck appear
+      on WindowMaker (grave; Closes: #549014).
+    - (Number 12): Refresh. Update to Gtk 2.x by using --cflags. Add
+      -lX11 due to KDE_DOCKAPP.
+  * debian/rules
+    - (clean): Delete binary manually. Fixes repetitive builds.
+
+ -- Jari Aalto <jari.aalto at cante.net>  Thu, 21 Oct 2010 08:59:31 +0300
+
+wmbubble (1.46-2) unstable; urgency=low
+
+  * Updated debhelper to compatibility level 7
+  * Updated Standards Version
+
+ -- John H. Robinson, IV <jaqque at debian.org>  Tue,  8 Jul 2008 13:49:13 -0700
+
+wmbubble (1.46-1.1) unstable; urgency=low
+
+  * Non-maintainer upload.
+  * Updated to debhelper compatibility level 5.
+  * Cleaned up and updated debian/rules:
+    + Added sane CFLAGS as mandated by policy
+    + Changed to using dh_install instead of cp
+    + Changed to using $(CURDIR) instead of `pwd`
+    + Removed unused rules.
+  * Added dpatch support.
+  * Splitted the .diff.gz into seven small patches.
+  * Added three extra patches:
+    + 08-makefile-cflags: modify Makefile so that it accepts external CFLAGS
+      correctly
+    + 09-upsidedown-offlimits.dpatch: fix an off-by-one mistake when
+      displaying the upsidedown duck that could trigger a SIGSEGV in certain
+      cases.  (Closes: #437157)
+    + 10-gtk2-migration: migrate wmbubble to GTK2.  Thanks to Julien BLACHE
+      for the patch.  (Closes: #437425)
+  * Added build-dependency on libgtk-2.0-dev, for the GTK2 migration.
+  * Removed the upsidedown comment from the README.Debian, since it wasn't
+    true.
+  * Updated menu file to the new menu structure.
+  * Updated to Standards-Version 3.7.2.  No changes needed
+
+ -- Margarita Manterola <marga at debian.org>  Sat, 01 Sep 2007 19:25:15 -0300
+
+wmbubble (1.46-1) unstable; urgency=low
+
+  * New upstream release (Closes: #261281)
+  * Fixed attribution in man page
+  * Updated menu to actually launch useful(?) programs
+  * Fixed clumsy wording in the package description
+  * Many thanks to Romain Francoise for his NMU's
+
+ -- John H. Robinson, IV <jaqque at debian.org>  Mon, 16 Aug 2004 20:56:46 -0700
+
+wmbubble (1.41-0.2) unstable; urgency=low
+
+  * NMU
+  * Change logic of the runtime kernel detection patch: default to Linux
+    2.4 format if the version doesn't match anything we know; needed for
+    people who still run 2.2 and earlier (closes: #250228).
+
+ -- Romain Francoise <rfrancoise at debian.org>  Sat, 14 Aug 2004 22:05:44 +0200
+
+wmbubble (1.41-0.1) unstable; urgency=low
+
+  * NMU
+  * New upstream release (closes: #220643):
+    - Upstream support for Linux 2.6 (closes: #207377)
+    - Apply patch from Romain Francoise <rfrancoise at debian.org> to add
+      runtime detection of the running kernel (upstream added support 
+      as a compile-time option which doesn't suit Debian at all).
+  * Apply patch from Romain Francoise <rfrancoise at debian.org> to require a
+    second mouse click to unfreeze the load display (closes: #217455).
+
+ -- Romain Francoise <rfrancoise at debian.org>  Sun, 28 Mar 2004 12:30:00 +0200
+
+wmbubble (1.4-1) unstable; urgency=low
+
+  * New upstream release
+
+ -- John H. Robinson, IV <jaqque at debian.org>  Wed,  3 Oct 2001 17:16:26 -0700
+
+wmbubble (1.3-1.1) unstable; urgency=low
+  * Non-maintainer upload.
+  * Fix printf-is-a-macro issue (gcc 3.0).  Closes: #103159
+
+ -- LaMont Jones <lamont at debian.org>  Mon,  9 Jul 2001 21:39:34 -0600
+
+wmbubble (1.3-1) unstable; urgency=low
+
+  * New upstream release
+  * Initial upload. (closes: Bug#84441)
+
+ -- John H. Robinson, IV <jaqque at debian.org>  Fri, 16 Mar 2001 09:04:53 -0800
+
+wmbubble (1.2.2-1) unstable; urgency=low
+
+  * New upstream release
+  * Fixed a bug that caused a segfault under high load/high memory usage
+  * Restored -u to original meaning
+
+ -- John H. Robinson, IV <jaqque at debian.org>  Thu, 15 Mar 2001 21:00:15 -0800
+
+wmbubble (1.1-2) unstable; urgency=low
+
+  * Fixed a bug that caused a segfault when you ran out of physical RAM
+
+ -- John H. Robinson, IV <jaqque at ucsd.edu>  Fri,  2 Feb 2001 13:38:50 -0800
+
+wmbubble (1.1-1) unstable; urgency=low
+
+  * Initial Release.
+  * Modified Makefile to comply with Debian
+  * Changed meaning of -u flag
+
+ -- John H. Robinson, IV <jaqque at ucsd.edu>  Thu,  1 Feb 2001 22:06:04 -0800
+
+Local variables:
+mode: debian-changelog
+End:
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..7f8f011
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+7
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..89e66ad
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,19 @@
+Source: wmbubble
+Section: x11
+Priority: optional
+Maintainer: John H. Robinson, IV <jaqque at debian.org>
+Build-Depends: debhelper (>= 5.0), dpatch, libx11-dev
+Standards-Version: 3.8.0.1
+
+Package: wmbubble
+Architecture: any
+Depends: ${shlibs:Depends}
+Suggests: sox, x-terminal-emulator
+Description:  A system-load meter for Window Maker that features a duck
+ A Window Maker dockapp (though it does not specifically require the Window
+ Maker window manager) that indicates the system load.
+ .
+ The more profuse the bubbles, the higher the CPU usage. The higher the water,
+ the more memory being used.
+ .
+ Up to two user-specified programs may be launched from this dockapp.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..ba989d7
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,15 @@
+This is Debian GNU/Linux's prepackaged version of timecop's bubblemon.
+
+This package was debianized by John H. Robinson, IV <jaqque at debian.org>. The
+name was changed to wmbubble to prevent confusion between this package, and the
+GNOME applet of the name bubblemon.
+
+It was downloaded from http://www.ne.jp/asahi/linux/timecop/
+
+Upstream Author: timecop at japan.co.jp
+
+Copyright (C) 2001 Tim Copperfield <timecop at japan.co.jp>
+
+You are free to distribute this software under the terms of the GNU General
+Public License.  On Debian systems, the complete text of the GNU General Public
+License can be found in /usr/share/common-licenses/GPL file.
diff --git a/debian/dirs b/debian/dirs
new file mode 100644
index 0000000..d7aeca6
--- /dev/null
+++ b/debian/dirs
@@ -0,0 +1,2 @@
+usr/bin
+usr/share/wmbubble
diff --git a/debian/docs b/debian/docs
new file mode 100644
index 0000000..e43d3cb
--- /dev/null
+++ b/debian/docs
@@ -0,0 +1,2 @@
+README
+doc/Xdefaults.sample
diff --git a/debian/menu b/debian/menu
new file mode 100644
index 0000000..ed4656d
--- /dev/null
+++ b/debian/menu
@@ -0,0 +1,2 @@
+?package(wmbubble):needs="x11" section="Applications/System/Monitoring"\
+  title="wmbubble" command="wmbubble 'x-terminal-emulator -e top' '/usr/share/wmbubble/wakwak.sh'"
diff --git a/debian/rules b/debian/rules
new file mode 100644
index 0000000..a2c55c3
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,64 @@
+#!/usr/bin/make -f
+# Sample debian/rules that uses debhelper.
+# GNU copyright 1997 to 1999 by Joey Hess.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# This package uses dpatch
+include /usr/share/dpatch/dpatch.make
+
+CFLAGS = -Wall -g
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+    CFLAGS += -O0
+else
+    CFLAGS += -O2
+endif
+
+build: build-stamp
+build-stamp: patch-stamp
+	dh_testdir
+	$(MAKE) BINARY="wmbubble" USER_CFLAGS="$(CFLAGS)"
+	touch build-stamp
+
+clean: unpatch
+	dh_testdir
+	dh_testroot
+	rm -f build-stamp
+	$(MAKE) clean
+	rm -f wmbubble
+	dh_clean
+
+install: build
+	dh_testdir
+	dh_testroot
+	dh_clean -k
+	dh_installdirs
+	
+	$(MAKE) install PREFIX=$(CURDIR)/debian/wmbubble/usr BINARY=wmbubble
+	dh_install misc/wak.wav misc/wakwak.sh usr/share/wmbubble/
+	chmod +x $(CURDIR)/debian/wmbubble/usr/share/wmbubble/wakwak.sh
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+	dh_testdir
+	dh_testroot
+	dh_installdocs
+	dh_installmenu
+	dh_installman debian/wmbubble.1x
+	dh_installchangelogs ChangeLog
+	dh_strip
+	dh_compress
+	dh_fixperms
+	dh_installdeb
+	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install patch-stamp unpatch
diff --git a/debian/wmbubble.1x b/debian/wmbubble.1x
new file mode 100644
index 0000000..da97fc4
--- /dev/null
+++ b/debian/wmbubble.1x
@@ -0,0 +1,77 @@
+.TH WMBUBBLE 1x "March 28, 2004"
+.\" Please adjust this date whenever revising the manpage.
+.\"
+.\" Some roff macros, for reference:
+.\" .nh        disable hyphenation
+.\" .hy        enable hyphenation
+.\" .ad l      left justify
+.\" .ad b      justify to both left and right margins
+.\" .nf        disable filling
+.\" .fi        enable filling
+.\" .br        insert line break
+.\" .sp <n>    insert n+1 empty lines
+.\" for manpage-specific macros, see man(7)
+.SH NAME
+wmbubble \- system load monitor
+.SH SYNOPSIS
+.B wmbubble
+.RI [ options ] " " [ program1 ] " " [ program2 ]
+.br
+.SH DESCRIPTION
+This manual page documents briefly the
+.B wmbubble
+command.
+This manual page was written for the Debian GNU/Linux distribution
+because the original program does not have a manual page.
+.PP
+.\" TeX users may be more comfortable with the \fB<whatever>\fP and
+.\" \fI<whatever>\fP escape sequences to invode bold face and italics, 
+.\" respectively.
+.B wmbubble
+is a dockapp-style CPU, memory, swap and load average monitor.  Based on the
+GNOME BubbleMon applet, this program has been considerably improved.
+.PP
+The higher the water level, the more memory is in use. The more profuse the
+bubbles, the higher the CPU usage. There is also a real-time CPU percentage
+display.
+.PP
+When the mouse is moved into the window, the display will change to show
+the load history, or, if the right shift is held, the current memory
+usage. If you press the right mouse button, the window will freeze in
+that state. You can unfreeze the display by pressing the right mouse
+button again.
+.PP
+.B program1
+and
+.B program2
+are the programs to spawn when either the left or middle mouse button
+is pressed, respectively.
+.\"
+.SH OPTIONS
+.TP
+.B \-d
+disable swimming duck
+.TP
+.B \-u
+disable upside-down duck
+.TP
+.B \-c
+disable CPU meter
+.TP
+.B \-m
+disable memory screen
+.TP
+.B \-p
+use alternative color scheme in memory info screen
+.TP
+.B \-k
+display memory and swap statistics in megabytes
+.TP
+.B \-h
+display help
+.SH AUTHOR
+wmbubble was written by timecop <timecop at japan.co.jp>
+
+This manual page was written by John H. Robinson, IV <jaqque at debian.org>,
+for the Debian GNU/Linux system (but may be used by others).
+.\" vim:syn=nroff
diff --git a/include/bubblemon.h b/include/bubblemon.h
index 1c25016..2306ce6 100644
--- a/include/bubblemon.h
+++ b/include/bubblemon.h
@@ -19,14 +19,14 @@
 #ifndef _BUBBLEMON_H_
 #define _BUBBLEMON_H_
 
-#include <gdk/gdk.h>
-#include <gdk/gdkx.h>
+/* Terrible place for it, but must be the same as in other include file */
+#define BOX_SIZE 58
 
 /* CPU load alpha-blending: smaller values = ligher text
  * minblend = mouseout
  * maxblend = mousein 
  * min = 0
- * max = 128 */
+ * max = 256 */
 #if defined(ENABLE_CPU) || defined(ENABLE_MEMSCREEN)
 # define MINBLEND 80
 # define MAXBLEND 190
@@ -41,7 +41,9 @@
 #define REALY(y) ((y) >> POWER2)
 #define MAKEY(y) ((y) << POWER2)
 #define MAKE_INTEGER(x) ((int)((x)*MULTIPLIER+0.5))
-#define ROLLVALUE 100		/* frequency of history rollover */
+#define ROLLVALUE 1		/* frequency of history rollover */
+
+#include <X11/Xlib.h>
 
 #ifdef sun
 #include <sys/types.h>
@@ -66,22 +68,18 @@ typedef struct {
 typedef struct {
     /* X11 stuff */
     Display *display;
-    GdkWindow *win;		/* main window */
-    GdkWindow *iconwin;		/* icon window */
-    GdkGC *gc;			/* drawing GC */
-    GdkPixmap *pixmap;		/* main dockapp pixmap */
-    GdkBitmap *mask;		/* dockapp mask */
+    XImage * xim;
 
     /* main image buffer */
-    unsigned char rgb_buf[56 * 56 * 3 + 1];
+    unsigned char rgb_buf[BOX_SIZE * BOX_SIZE * 3 + 1];
 
 #ifdef ENABLE_MEMSCREEN
     /* memory / swap screen buffer */
-    unsigned char mem_buf[56 * 56 * 3 + 1];
+    unsigned char mem_buf[BOX_SIZE * BOX_SIZE * 3 + 1];
     /* memory screen graph buffer */
-    unsigned char his_bufa[56 * 31 * 3 + 1];
+    unsigned char his_bufa[BOX_SIZE * 31 * 3 + 1];
     /* loadavg screen graph buffer */
-    unsigned char his_bufb[56 * 33 * 3 + 1];
+    unsigned char his_bufb[BOX_SIZE * 33 * 3 + 1];
 
     int screen_type;		/* 0 - memory, 1 - cpu */
     int picture_lock;		/* blend coeff not changed when this is not 0 */
@@ -90,7 +88,7 @@ typedef struct {
     /* bubble stuff */
     int samples;
     unsigned char *bubblebuf;
-    int *colors;
+
     int *waterlevels;
     int *waterlevels_dy;
     Bubble *bubbles;
@@ -127,13 +125,13 @@ typedef struct {
     unsigned int swap_percent;	/* swap used, in percent */
     unsigned int mem_percent;	/* memory used, in percent */
     /* history of memory use */
-    unsigned int memhist[53];
+    unsigned int memhist[BOX_SIZE-3];
     unsigned int memadd;
 
     /* loadavg stuff */
     LoadAvg loadavg[3];
     /* history of loadavgs */
-    unsigned int history[53];
+    unsigned int history[BOX_SIZE-3];
     unsigned int hisadd;
 } BubbleMonData;
 #endif				/* _BUBBLEMON_H_ */
diff --git a/include/clockfont.h b/include/clockfont.h
new file mode 100644
index 0000000..59946f3
--- /dev/null
+++ b/include/clockfont.h
@@ -0,0 +1,19 @@
+const char clockdigit[]={
+"-MMM----M----MMM---MMM-----MM-MMMMM--MMM--MMMMM--MMM---MMM--"
+"M---M--MM---M---M-M---M---M-M-M-----M---M-----M-M---M-M---M-"
+"M---M---M-------M-----M--M--M-MMMM--M---------M-M---M-M---M-"
+"M---M---M------M----MM--MMMMM-M---M-MMMM-----M---MMM---MMMM-"
+"M---M---M-----M-------M-----M-----M-M---M---M---M---M-----M-"
+"M---M---M----M----M---M-----M-M---M-M---M---M---M---M-M---M-"
+"-MMM---MMM--MMMMM--MMM------M--MMM---MMM----M----MMM---MMM--"
+};
+/* PLEASE NOTE: THIS FONT HAS NO LOWERCASE M */
+const char clockalpha[]={
+".MM...MM..MMM...MM..MMM..MMMM.MMMM..MM..M..M.MMM..MMMM.M..M.M....M..M.M..M..MM..MMM...MM..MMM...MM..MMM..M..M.M..M.M..M.M..M.M..M.MMMM..MMM.M....MMM...MM........M........M............M........M.......M..............M.....M.......................................M....................................M..M...M.....M.M."
+"M..M.M..M.M..M.M..M.M..M.M....M....M..M.M..M..M......M.M..M.M....MMMM.MM.M.M..M.M..M.M..M.M..M.M..M..M...M..M.M..M.M..M.M..M.M..M....M..M...M......M..M..M........M.......M............M.......M.M......M.....M......M.M.....M.......................................M...................................M...M....M...M.M.."
+"M.MM.M..M.M..M.M....M..M.M....M....M....M..M..M......M.M.M..M....M..M.MM.M.M..M.M..M.M..M.M..M.M.....M...M..M.M..M.M..M..MM..M.M....M...M....M.....M..................MM..MMM...MM...MMM..MM...M....MMM.MMM............M..M..M........MMM...MM..MMM...MMM.MMM...MMM.MMMM.M..M.M..M.M..M.M..M.M..M.MMMM...M...M....M........"
+"M.MM.MMMM.MMM..M....M..M.MMM..MMM..M.MM.MMMM..M......M.MM...M....M..M.M.MM.M..M.MMM..M..M.MMM...MM...M...M..M.M..M.M..M..MM...M....M....M.....M....M....................M.M..M.M..M.M..M.M..M.MMMM.M..M.M..M..M......M.M.M...M........M..M.M..M.M..M.M..M.M..M.M.....M...M..M.M..M.M..M.M..M.M..M....M..M....M.....M......."
+"M.MM.M..M.M..M.M....M..M.M....M....M..M.M..M..M......M.M.M..M....M..M.M.MM.M..M.M....M..M.M..M....M..M...M..M.M..M.M..M.M..M..M...M.....M.....M....M..................MMM.M..M.M....M..M.MMMM..M....MMM.M..M..M......M.MM....M........M..M.M..M.M..M.M..M.M.....MM...M...M..M.M..M.M..M..MM...MMM..MM....M...M....M........"
+"M....M..M.M..M.M..M.M..M.M....M....M..M.M..M..M...M..M.M..M.M....M..M.M..M.M..M.M....M.MM.M..M.M..M..M...M..M..M.M.MMMM.M..M..M...M.....M......M...M.................M..M.M..M.M..M.M..M.M.....M......M.M..M..M...M..M.M.M...M........M..M.M..M.MMM...MMM.M.......M..M.M.M..M..M.M.MMMM.M..M....M.M......M...M....M........"
+".MMM.M..M.MMM...MM..MMM..MMMM.M.....MM..M..M.MMM...MM..M..M.MMMM.M..M.M..M..MM..M.....MMM.M..M..MM...M....MM....M..M..M.M..M..M...MMMM..MMM....M.MMM.......MMMM.......MMM.MMM...MM...MMM..MMM..M...MMM..M..M..M....MM..M..M..MM..mmmm.M..M..MM..M.......M.M....MMM....M...MMM...M..M..M.M..M.MMM..MMMM....M..M...M........."
+};
diff --git a/include/frame.xbm b/include/frame.xbm
new file mode 100644
index 0000000..1848b9d
--- /dev/null
+++ b/include/frame.xbm
@@ -0,0 +1,42 @@
+#define master_width 58
+#define master_height 58
+static unsigned char master_bits[] = {
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
diff --git a/include/numbers-2.h b/include/numbers-2.h
new file mode 100644
index 0000000..49b9b86
--- /dev/null
+++ b/include/numbers-2.h
@@ -0,0 +1,3 @@
+unsigned char bigdigits[130*32]={
+0,0,0,2,85,155,156,87,2,0,0,0,0,0,0,0,0,50,169,169,169,5,0,0,0,0,0,6,89,173,228,252,241,185,70,0,0,0,0,0,0,5,68,130,162,161,119,29,0,0,0,0,0,0,0,0,0,0,122,169,169,169,14,0,0,0,21,83,83,83,83,83,83,83,83,64,0,0,0,0,0,0,31,160,233,250,214,134,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,172,236,252,226,150,24,0,0,0,0,0,0,10,104,160,156,91,4,0,0,0,0,0,0,6,174,255,255,255,255,177,7,0,0,0,0,0,0,23,224,255,255,255,7,0,0,0,0,0,216,255,255,255,255,255,255,253,117,0,0,0,0,102,227,254,255,255,255,255 [...]
+};
diff --git a/misc/digits.xpm b/misc/digits.xpm
new file mode 100644
index 0000000..d995095
--- /dev/null
+++ b/misc/digits.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char * digits_xpm[] = {
+"66 7 5 1",
+" 	c None",
+".	c #000000",
+"+	c #004941",
+"@	c #007D71",
+"#	c #20B0AC",
+"..###..... at ..@###@.@###@. at ...@.@###@.@###@.@###@.@###@.@###@......",
+".#...#....#......#.....#.#...#.#.....#.........#.#...#.#...#.#...#",
+".#...#....#......#.....#.#...#.#.....#.........#.#...#.#...#....#.",
+". at ...@.... at ..@###@..###@.@###@.@###@.@###@..... at .+###+.@###@...#..",
+".#...#....#..#.........#.....#.....#.#...#.....#.#...#.....#..#...",
+".#...#....#..#.........#.....#.....#.#...#.....#.#...#.....#.#...#",
+"..###.....#..@###@.@###@..... at .@###@.@###@..... at .@###@.@###@......"};
diff --git a/misc/load_58.c b/misc/load_58.c
new file mode 100644
index 0000000..f7b0591
--- /dev/null
+++ b/misc/load_58.c
@@ -0,0 +1,370 @@
+/* GIMP RGB C-Source image dump (load_58.c) */
+
+static const struct {
+  unsigned int 	 width;
+  unsigned int 	 height;
+  unsigned int 	 bytes_per_pixel; /* 3:RGB, 4:RGBA */ 
+  unsigned char	 pixel_data[58 * 58 * 3 + 1];
+} load_screen = {
+  58, 58, 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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301"
+  "\304\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\0\0\0\301\304\0"
+  "\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\301\304\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\301\304\0"
+  "\0\0\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\301\304\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301"
+  "\304\0\0\0\0\301\304\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\301\304\0\0\0\0\0\0\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\301\304\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\301\304\0\0\0\0\301\304\0\301\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236"
+  "\304\355\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236"
+  "\304\355\236\304\355\236\304\355\0\0\0\0\0\0\236\304\355\236\304\355\236"
+  "\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\0\0\0\0\0\0\236"
+  "\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355"
+  "\0\0\0\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304"
+  "\355\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355\236\304\355\0"
+  "\0\0\236\304\355\236\304\355\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0"
+  "\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236"
+  "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0"
+  "\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0"
+  "\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236"
+  "\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0"
+  "\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236"
+  "\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0"
+  "\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0"
+  "\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+  "\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304"
+  "\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0"
+  "\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304"
+  "\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0"
+  "\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304"
+  "\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0"
+  "\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0"
+  "\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236"
+  "\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304"
+  "\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0"
+  "\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304"
+  "\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0"
+  "\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236"
+  "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0"
+  "\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304"
+  "\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0"
+  "\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304"
+  "\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0"
+  "\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236"
+  "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236"
+  "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0"
+  "\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0"
+  "\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0"
+  "\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\236\304"
+  "\355\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304"
+  "\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304"
+  "\355\236\304\355\0\0\0\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236"
+  "\304\355\236\304\355\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\236"
+  "\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\0\0"
+  "\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236"
+  "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0"
+  "\0\236\304\355\236\304\355\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355"
+  "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+  "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+  "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+  "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+  "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+  "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+  "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+  "\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355"
+  "\236\304\355\236\304\355\236\304\355\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+  "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\6*\0\6*\0\6"
+  "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+  "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+  "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+  "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*"
+  "\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+  "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+  "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+  "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+  "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+  "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+  "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\0\0\0\0\0\0\0\0\0\0\0\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+  "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+  "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+  "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+  "*\0\6*\0\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+  "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+  "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+  "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+  "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+  "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+  "\6*\0\6*\0\6*\0\6*\0\6*\0\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+  "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304"
+  "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+  "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+  "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+  "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+  "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+  "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+  "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+  "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304"
+  "\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",
+};
+
diff --git a/misc/load_58.xcf b/misc/load_58.xcf
new file mode 100644
index 0000000..71d2624
Binary files /dev/null and b/misc/load_58.xcf differ
diff --git a/misc/load_58.xpm b/misc/load_58.xpm
new file mode 100644
index 0000000..0cbafcf
--- /dev/null
+++ b/misc/load_58.xpm
@@ -0,0 +1,66 @@
+/* XPM */
+static char * load_58_xpm[] = {
+"58 58 5 1",
+" 	c #000000",
+".	c #062A00",
+"+	c #202020",
+"@	c #308CF0",
+"#	c #C1C400",
+"                                                          ",
+"                                                          ",
+"         #                 ##                 # ##        ",
+"        ##                 #                 ## #         ",
+"         #                 ##                 # ##        ",
+"         #                  #                 #  #        ",
+"         #                 ##                 # ##        ",
+"                                                          ",
+"                                                          ",
+" @@@ @@@   @@@ @@@  @@@ @@@   @@@ @@@  @@@ @@@   @@@ @@@  ",
+" @ @ @ @   @ @ @ @  @ @ @ @   @ @ @ @  @ @ @ @   @ @ @ @  ",
+" @ @ @ @   @ @ @ @  @ @ @ @   @ @ @ @  @ @ @ @   @ @ @ @  ",
+" @ @ @ @   @ @ @ @  @ @ @ @   @ @ @ @  @ @ @ @   @ @ @ @  ",
+" @ @ @ @   @ @ @ @  @ @ @ @   @ @ @ @  @ @ @ @   @ @ @ @  ",
+" @ @ @ @   @ @ @ @  @ @ @ @   @ @ @ @  @ @ @ @   @ @ @ @  ",
+" @ @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ @  ",
+" @@@ @@@ @ @@@ @@@  @@@ @@@ @ @@@ @@@  @@@ @@@ @ @@@ @@@  ",
+"                                                          ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+"                                                          ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  ......................................................  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  ......................................................  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  ......................................................  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  ......................................................  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"                                                          ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+"                                                          ",
+"                                                          "};
diff --git a/misc/mem_58.c b/misc/mem_58.c
new file mode 100644
index 0000000..f4962ec
--- /dev/null
+++ b/misc/mem_58.c
@@ -0,0 +1,371 @@
+/* GIMP RGB C-Source image dump (mem_58.c) */
+
+static const struct {
+  unsigned int 	 width;
+  unsigned int 	 height;
+  unsigned int 	 bytes_per_pixel; /* 3:RGB, 4:RGBA */ 
+  unsigned char	 pixel_data[58 * 58 * 3 + 1];
+} mem_screen = {
+  58, 58, 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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304"
+  "\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0"
+  "\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236"
+  "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236"
+  "\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+  "\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+  "\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0"
+  "\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+  "\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+  "\0\0\0\301\304\0\301\304\0\301\304\0\301\304\0\0\0\0\0\0\0\0\0\0\236\304"
+  "\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0"
+  "\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0"
+  "\0\0\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\0\0\0\0\0\0\236\304"
+  "\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304"
+  "\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\301\304\0\0\0\0\301"
+  "\304\0\0\0\0\301\304\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0"
+  "\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0"
+  "\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0"
+  "\0\0\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304"
+  "\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\236"
+  "\304\355\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\236\304\355\0\0\0\0\0\0\0\0\0\301\304\0\0\0\0\301\304\0\0\0\0\301\304\0"
+  "\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355\236\304"
+  "\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0"
+  "\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236"
+  "\304\355\236\304\355\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0"
+  "\0\0\0\0\301\304\0\0\0\0\301\304\0\0\0\0\301\304\0\0\0\0\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+  "\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0"
+  "\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304"
+  "\355\0\0\0\236\304\355\0\0\0\0\0\0\301\304\0\0\0\0\301\304\0\0\0\0\301\304"
+  "\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304"
+  "\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236"
+  "\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355"
+  "\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355"
+  "\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\0\0\0\236\304"
+  "\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\236"
+  "\304\355\236\304\355\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\236"
+  "\304\355\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355"
+  "\236\304\355\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355\236\304"
+  "\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\236\304"
+  "\355\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236"
+  "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0"
+  "\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\301\304"
+  "\0\301\304\0\301\304\0\301\304\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304"
+  "\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\301\304\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0"
+  "\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304"
+  "\355\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\301\304\0\301\304\0\0"
+  "\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236"
+  "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0"
+  "\0\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\304\0\0\0\0\0\0\0"
+  "\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0"
+  "\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355"
+  "\0\0\0\0\0\0\301\304\0\301\304\0\301\304\0\301\304\0\0\0\0\0\0\0\0\0\0\236"
+  "\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236\304\355\0\0\0\236"
+  "\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304\355\0\0\0\236\304\355\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\0\0\0\236"
+  "\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\304\355"
+  "\236\304\355\236\304\355\0\0\0\236\304\355\236\304\355\236\304\355\0\0\0"
+  "\236\304\355\236\304\355\236\304\355\0\0\0\236\304\355\0\0\0\0\0\0\236\304"
+  "\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+  "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+  "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+  "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+  "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+  "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*"
+  "\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+  "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+  "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+  "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+  "\6*\0\6*\0\6*\0\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+  "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\6*\0\6*\0\6*\0\6*"
+  "\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+  "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+  "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+  "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+  "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+  "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0"
+  "\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6"
+  "*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\6*\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6"
+  "*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\40\40\40\40\40\6*\0\40\40\40\40\40\40\40\40\40\40\40\40\40\40\40"
+  "\40\40\40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236\304\355\236"
+  "\304\355\236\304\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0",
+};
+
diff --git a/misc/mem_58.xcf b/misc/mem_58.xcf
new file mode 100644
index 0000000..a8be8ea
Binary files /dev/null and b/misc/mem_58.xcf differ
diff --git a/misc/mem_58.xpm b/misc/mem_58.xpm
new file mode 100644
index 0000000..2dbad8e
--- /dev/null
+++ b/misc/mem_58.xpm
@@ -0,0 +1,66 @@
+/* XPM */
+static char * mem_58_xpm[] = {
+"58 58 5 1",
+" 	c #000000",
+".	c #062A00",
+"+	c #202020",
+"@	c #308CF0",
+"#	c #C1C400",
+"                                                          ",
+"                                                          ",
+"     @ @@@ @@@ @@@ @@@ @@@ @ @         @@@ @@@ @@@ @  @   ",
+"   @ @ @ @ @ @ @ @ @ @ @ @ @ @         @ @ @ @ @ @ @ @    ",
+"   @ @ @   @     @ @ @ @ @ @ @  ####   @ @   @ @ @   @    ",
+"   @ @ @   @@@   @ @ @ @ @ @ @  # # #  @ @   @ @ @   @    ",
+"   @ @ @@@ @ @   @ @@@ @ @ @@   # # #  @ @   @ @@@  @     ",
+"   @@@   @ @ @   @ @ @ @@@ @ @  # # #  @ @   @ @ @  @     ",
+"     @ @ @ @ @   @ @ @   @ @ @  # # #  @ @   @ @ @  @ @   ",
+"     @ @@@ @@@   @ @@@ @@@ @ @         @@@   @ @@@ @  @   ",
+"                                                          ",
+"                       @@@ @ @         @@@ @@@ @@@ @  @   ",
+"                       @ @ @ @         @ @ @ @ @ @ @ @    ",
+"                       @ @ @ @   ####  @ @ @ @ @ @   @    ",
+"                       @ @ @ @  #      @ @ @ @ @ @   @    ",
+"                       @ @ @@    ###   @ @ @ @ @ @  @     ",
+"                       @ @ @ @      #  @ @ @ @ @ @  @     ",
+"                       @ @ @ @  ####   @ @ @ @ @ @  @ @   ",
+"                       @@@ @ @         @@@ @@@ @@@ @  @   ",
+"                                                          ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+"                                                          ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  ......................................................  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  ......................................................  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  ......................................................  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  ......................................................  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"  +++++++.+++++++.+++++++.+++++++.+++++++.+++++++.++++++  ",
+"                                                          ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+"                                                          ",
+"                                                          "};
diff --git a/misc/numbers.xcf b/misc/numbers.xcf
new file mode 100644
index 0000000..402338c
Binary files /dev/null and b/misc/numbers.xcf differ
diff --git a/misc/numbers.xpm b/misc/numbers.xpm
new file mode 100644
index 0000000..2ba11d9
--- /dev/null
+++ b/misc/numbers.xpm
@@ -0,0 +1,14 @@
+/* XPM */
+static char * numbers_xpm[] = {
+"48 9 2 1",
+" 	g #FFFFFF",
+".	g #000000",
+"   ... .   .   ... .   .   .   .   .   . . . . .",
+" . ... . . . . . . . . . . . . . . . . . . .   .",
+" . ... ... ... . . . ... ..... . . . . . . .   .",
+" . ... ... ... . . . ...   ... . . . . . . . . .",
+" . ... .   ..  . . .   . . ... .   . . .  .. . .",
+" . ... . ..... .   ... . . ... . . .   . . . . .",
+" . ... . . . . ... . . . . ... . . ... . . . . .",
+"   ... .   .   ... .   .   ... .   .   . . . . .",
+"................................................"};
diff --git a/wmx11pixmap.c b/wmx11pixmap.c
new file mode 100644
index 0000000..c2bed3a
--- /dev/null
+++ b/wmx11pixmap.c
@@ -0,0 +1,139 @@
+/*
+ * wmX11pixmap derived from wmtunlo, from wmgeneral, from wmppp
+ *
+ *	Authors: 
+ *	Martijn Pieterse (pieterse at xs4all.nl) (wmgeneral)
+ *  Tomasz Maka <pasp at ll.pl> (wmtunlo)
+ *  Mike Henderson <mghenderson at lanl.gov> (wmMand)
+ *	Robert Jacobs (rnjacobs at mit.edu)
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "wmx11pixmap.h"
+
+/* Private variables */
+GC      NormalGC;
+Pixmap  wmgen;
+
+/* flush_expose
+   removes all expose events off the event stack */
+static int flush_expose(Window w) {
+	XEvent 		dummy;
+	int			i=0;
+
+	while (XCheckTypedWindowEvent(wmxp_display, w, Expose, &dummy))
+		i++;
+
+	return i;
+}
+
+/* RedrawWindow
+   redraws both windows from the contents of the passed Ximage */
+void RedrawWindow(XImage * xim) {
+	XPutImage(wmxp_display, wmgen, NormalGC, xim, 0, 0, 0, 0, BOX_SIZE, BOX_SIZE);
+	flush_expose(wmxp_iconwin);
+	XCopyArea(wmxp_display, wmgen, wmxp_iconwin, NormalGC, 0,0, BOX_SIZE, BOX_SIZE, 0,0);
+	flush_expose(wmxp_win);
+	XCopyArea(wmxp_display, wmgen,     wmxp_win, NormalGC, 0,0, BOX_SIZE, BOX_SIZE, 0,0);
+}
+
+/* initX11pixmap */
+
+XImage * initwmX11pixmap(char * cwname, int argc, char *argv[]) {
+	unsigned long	gcm;
+	XTextProperty	name;
+	XClassHint classHint;
+	XGCValues gcv;
+	XWMHints mywmhints;
+	Window Root;
+	Visual * visual;
+	long InterestingEvents = NoEventMask;
+	int screen;
+	unsigned int depth;
+	XImage * xim;
+
+	if (!(wmxp_display = XOpenDisplay(NULL))) {
+		fprintf(stderr, "%s: can't open display %s\n", cwname, XDisplayName(NULL));
+		exit(1);
+	}
+	screen  = DefaultScreen(wmxp_display);
+	Root    = RootWindow(wmxp_display, screen);
+	/*x_fd    = XConnectionNumber(wmxp_display);*/
+	visual  = DefaultVisual(wmxp_display, screen);
+	depth   = DefaultDepth(wmxp_display, screen);
+
+	if (visual->red_mask == 0 ||
+	    visual->green_mask == 0 ||
+	    visual->blue_mask == 0 ||
+	    (visual->class != TrueColor && visual->class != DirectColor)) {
+		fprintf(stderr, "We require a true- or direct- color display, and yours isn't.\n");
+		exit(2);
+	}
+
+	wmgen = XCreatePixmap(wmxp_display,Root,BOX_SIZE,BOX_SIZE,depth);
+	/* Create an XImage without data. Then allocate space for same. */
+	xim = XCreateImage(wmxp_display, visual, depth, ZPixmap, 0, NULL, BOX_SIZE, BOX_SIZE, 32, 0);
+	xim->data = (char *)malloc(xim->bytes_per_line * BOX_SIZE );
+
+	/* Create a window to hold the stuff */
+	wmxp_win = XCreateSimpleWindow
+		(wmxp_display, Root,  0,0,  BOX_SIZE, BOX_SIZE,  0,
+		 BlackPixel(wmxp_display,screen), WhitePixel(wmxp_display,screen));
+	wmxp_iconwin = XCreateSimpleWindow
+		(wmxp_display, wmxp_win,  0,0,  BOX_SIZE, BOX_SIZE,  0,
+		 BlackPixel(wmxp_display,screen), WhitePixel(wmxp_display,screen));
+
+	XStoreName(wmxp_display, wmxp_win, cwname);
+	XStoreName(wmxp_display, wmxp_iconwin, cwname);
+
+	/* Activate hints */
+	classHint.res_name = cwname;
+	classHint.res_class = cwname;
+	XSetClassHint(wmxp_display, wmxp_win, &classHint);
+
+	/* Select acceptable input events */
+	InterestingEvents |= KeyPressMask | KeyReleaseMask |
+		ButtonPressMask | ButtonReleaseMask |
+		EnterWindowMask | LeaveWindowMask | ExposureMask;
+	
+	XSelectInput(wmxp_display, wmxp_win, InterestingEvents);
+	XSelectInput(wmxp_display, wmxp_iconwin, InterestingEvents);
+
+	if (XStringListToTextProperty(&cwname, 1, &name) == 0) {
+		fprintf(stderr, "%s: can't allocate window name\n", cwname);
+		exit(3);
+	}
+
+	/* Create GC for drawing */
+	gcm = GCGraphicsExposures;
+	gcv.graphics_exposures = 0;
+	NormalGC = XCreateGC(wmxp_display, Root, gcm, &gcv);
+
+	/* Act like a dockapp */
+	mywmhints.input = True;
+	mywmhints.initial_state = WithdrawnState;
+	mywmhints.icon_window = wmxp_iconwin;
+	mywmhints.icon_x = 0;
+	mywmhints.icon_y = 0;
+	mywmhints.window_group = wmxp_win;
+	mywmhints.flags = InputHint | StateHint | IconWindowHint | IconPositionHint | WindowGroupHint;
+	XSetWMHints(wmxp_display, wmxp_win, &mywmhints);
+
+	XSetCommand(wmxp_display, wmxp_win, argv, argc);
+
+	XMapWindow(wmxp_display, wmxp_win);
+
+
+	return xim;
+}
+
+void wmPutPixel(XImage * xim, int x, int y, unsigned char r, unsigned char g, unsigned char b) {
+	unsigned long pxl;
+
+	pxl = ((r*xim->red_mask/255)&xim->red_mask) |
+		((g*xim->green_mask/255)&xim->green_mask) |
+		((b*xim->blue_mask/255)&xim->blue_mask);
+
+	XPutPixel(xim, x, y, pxl);
+};
diff --git a/wmx11pixmap.h b/wmx11pixmap.h
new file mode 100644
index 0000000..6ee50b6
--- /dev/null
+++ b/wmx11pixmap.h
@@ -0,0 +1,20 @@
+#ifndef WMX11PIXMAP_H_INCLUDED
+#define WMX11PIXMAP_H_INCLUDED
+
+#include <X11/Xutil.h>
+
+/* Defines */
+
+#define BOX_SIZE 58
+
+/* Function Prototypes */
+
+XImage * initwmX11pixmap(char * cwname, int argc, char *argv[]);
+void RedrawWindow(XImage * xim);
+void wmPutPixel(XImage *, int x, int y, unsigned char r, unsigned char g, unsigned char b);
+
+/* Global variables necessary for the event handlers */
+Display *wmxp_display;
+Window  wmxp_iconwin, wmxp_win;
+
+#endif

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-wmaker/wmbubble.git



More information about the Pkg-wmaker-commits mailing list