[Pkg-wmaker-commits] [wmacpi] 39/105: Imported Upstream version 1.33

Doug Torrance dtorrance-guest at moszumanska.debian.org
Tue Aug 18 01:13:43 UTC 2015


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

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

commit 92c8932b9d48fb4180ed659bd3bc15d7e854ee29
Author: Doug Torrance <dtorrance at monmouthcollege.edu>
Date:   Mon Nov 24 05:55:06 2014 -0600

    Imported Upstream version 1.33
---
 AUTHORS        |  15 ++
 COPYING        |   2 +
 ChangeLog      |  80 ++++++++
 INSTALL        |  10 +
 Makefile       |  25 +++
 README         |  63 ++++++
 libacpi.c      | 213 +++++++++++++++++++
 libapm.c       |  91 +++++++++
 master.xpm     | 207 +++++++++++++++++++
 master_low.xpm | 111 ++++++++++
 wmacpi.c       | 634 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 wmacpi.h       |  52 +++++
 12 files changed, 1503 insertions(+)

diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..ed910da
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,15 @@
+ timecop
+ timecop at japan.co.jp
+ all the code
+
+ Daniel Pittman <daniel at rimspace.net>
+ sent some suggestions and a patch for a broken APM implementations.
+ version 1.1 includes his patch in a modified form
+
+ Michael G. Henderson <mghenderson at lanl.gov>
+ some weird dude who generated a lot of random noise about my dockapp and
+ forced me to change the name to wmacpi.  general asshole.
+
+ portions of master.xpm that i was too lazy to draw (the plug and battery
+ icons) came from wmapm-2 by jedgar.  the numbers were copied off some other
+ dockapp, too.  the button was drawn by ME. PHEAR YES PHEAR IT.
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..f4f3ea5
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,2 @@
+#include <GNU_GPL_v2>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             [...]
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..5bb8f42
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,80 @@
+2001 Apr 29 1.33
+    Little fix to ACPI version check so that I don't have to make a new
+    version each time a new kernel comes out
+
+2001 Mar 24 1.32
+    Split ACPI and APM portions in different source files
+    Added power_init() function - handles checking subsystem presence,
+    version, etc.  Enumerates batteries in ACPI implementation
+    ACPI: Beginnings of multiple battery support - not fully implemented
+    ACPI: Get the battery ID from /proc/acpi/battery instead of hard-coding
+          it in - also helps with multi battery stuff
+    Added some stupid command line help
+    Added -c option to set critical battery alarm level.  Defaults to
+    10 percent, and added -b option to make noise when this critical level
+    is reached
+    APM: Updated for critical alarm stuff
+    Made a 20 color "low" quality pixmap for machines running 8bit displays
+    Updated README with some stuff, made separate INSTALL file
+
+2001 Mar 13 1.31
+    Update for intel ACPI release version 20010313
+    Minor updates for new /proc layout
+
+2001 Mar 07 1.3
+    Update for intel ACPI release verion 20010302
+    Proc format changed a little bit, so updates were necessary.
+    Added a check for specific acpi subsystem version - since each
+    new version seems to have a new interface, better be safe than
+    sorry :)
+    As usual, please test and report to me.
+
+    This ONLY works with linux acpica 20010302.  Download this version from
+    http://developer.intel.com/technology/iapc/acpi/downloads.htm - it's a
+    patch against 2.4.2
+
+2001 Feb 28 1.21
+    Finally read through the ACPI specification.  Hah, they had all my
+    questions answered :)  Thus,
+
+    Confirmed remaining percentage formula (correct)
+
+    Now calculate "time remaining" according to the spec formula
+
+    Removed "battery load" hack since we now have "time remaining"
+
+    Fixed bug in display_percentage (10% didn't display right)
+
+    Released version 1.21
+
+2001 Feb 23 1.2
+    Added support for ACPI.  This is very untested, and not very clean.
+    This has been tested on machines with only ONE battery, and only
+    with kernel 2.4.2 (that's where ACPI started to work for me)
+
+    Added some hackery to do with ACPI.  Check README.
+
+    Released 1.2
+
+2001 Jan 16 1.1
+    Fixed all the stuff so that wmapm works as advertised:
+    	Fixed dumb bug where after charging was done new message didn't scroll.
+
+    	Added support for fucked APM bioses that display stuff wrong. (See
+	README to learn how to enable it. Obviously, it's disabled by default)
+	
+    	Reorganized apminfo structure and got rid of redundancy.
+	
+    	Reorganized acquire_apm_info.  All APM data is processed there.
+	
+    	Fixed display_state to do the Right Thing.
+	
+    	Fixed red blinking button to actually blink on critical battery, and
+    	to stop when it isn't critical anymore.  I don't think it ever worked
+	right in 1.0.
+
+    Created ChangeLog.
+
+    Updated README.
+
+    Released 1.1.
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..01b1e42
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,10 @@
+to install:
+
+* vi Makefile
+* change what you want, according to instructions, save Makefile
+* make
+* copy wmacpi somewhere useful
+* dance
+* <somewhere useful>/wmacpi &
+* phear
+(if it doesn't work, skip the phear step)
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..79f379c
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,25 @@
+# set options.  pick one, acpi or apm.  comment out the other one.  don't
+# uncomment both, bad things will happen :)
+
+OPT	= -O3 -DACPI
+#OPT	= -O3 -DAPM
+
+# uncomment this to make wmacpi use less system colors (looks uglier too)
+#OPT	+= -DLOW_COLOR
+
+# debugging options (don't bother with these)
+#OPT	= -pg -g -DPRO -DACPI
+
+CC	= gcc
+CFLAGS	= $(OPT) -Wall -ansi -I/usr/X11R6/include
+LDFLAGS = $(OPT) -L/usr/X11R6/lib -lX11 -lXpm -lXext
+
+SRCS	= wmacpi.c libapm.c libacpi.c
+OBJS	= wmacpi.o libapm.o libacpi.o
+
+all:	wmacpi
+
+wmacpi:	$(OBJS)
+
+clean:
+	rm -f *.o *~ wmacpi trace *.out *.bb *.bbg
diff --git a/README b/README
new file mode 100644
index 0000000..91e454d
--- /dev/null
+++ b/README
@@ -0,0 +1,63 @@
+For install instructions, see "INSTALL" file.
+
+Usage:
+
++-------------+
+|battery graph| <- visual percentage battery remaining
+|[:][=] [100%]| <- [:] - on AC (blink when charging) [=] - on battery
+|[00:00] [///]| <- [00:00] time remaining   [///] timer mode switch
+|status   area| <- messages scroll here
++-------------+
+
+see wmacpi -h for some command line switches
+
+Timer mode, available only when "on-battery", keeps track how long your laptop
+has been away from AC power.  Clicking the button toggles between timer and
+standard "time remaining" mode.
+
+******************************************************************************
+
+Implementation of "ACPI" mode:
+
+As far as I know, there aren't any tools available right now to process battery
+statistics provided in /proc/power by ACPI stuff in 2.4.x kernels.  This is my
+attempt to have a usable dockapp battery monitor for ACPI laptop systems.
+Since version 1.32 I've added some code to detect multiple batteries.  However
+it's not fully implemented yet, and while it will detect and enumerate
+batteries, the statistics reported are for the first found battery.
+  * Your battery is "Control Method" type
+  * Your ACPI BIOS is supported by current version of ACPI in kernel
+    2.4.2 + patches
+  * You applied acpi subsystem patch version 20010313 (from intel.com)
+
+If you are still using plain 2.4.2 kernel, keep using wmacpi 1.21.
+To use ACPI support, just follow "INSTALL" instructions.  Makefile has been
+updated to include -DACPI.  If you don't have ACPI, you don't need this version
+of wmapm.  Information below only applies to APM systems, without ACPI support.
+
+Implementation of "APM" mode
+
+This works on all machines that have a standard non-borked APM implementation.
+For people with broken APM implementations, I added some stuff, which was
+sent to me by Daniel Pittman <daniel at rimspace.net>, to compensate for some
+of the stupidity.  If you see dumb behaviour from wmapm, consider editing
+wmapm.c and uncomment one, or both, of these lines (on lines 19 and 20):
+
+#define RETARDED_APM if your bios thinks the battery is charging all the time
+when it's on AC power.  What this will do is stop "charging" process as soon
+as the battery reaches 100%.
+
+#define STUPID_APM if your bios shows -1 minutes remaining when AC is plugged
+in, or when battery is charging.
+
+If your bios is even dumber than this, and you come up with another special
+case that needs to be handled, feel free to #ifdef it under <badword>_APM and
+send me a diff -u.  I will include it in the next version.  Any of these
+changes would have to go into acquire_apm_info.  Note, I changed format of
+apminfo structure to get rid of redundancy - now there is only one power state
+variable, which keeps track whether we are on AC, charging, battery, etc.
+
+Note, all the *_APM stuff is untested - my laptop has a working BIOS :)  If you
+test this and it doesn't work as advertised, go ahead and send me a fix.
+
+ -timecop
diff --git a/libacpi.c b/libacpi.c
new file mode 100644
index 0000000..0d04c92
--- /dev/null
+++ b/libacpi.c
@@ -0,0 +1,213 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+#include "wmacpi.h"
+
+#define MAXBATT 8
+
+#ifdef ACPI
+#ifdef PRO
+extern char *state[];
+#endif
+extern APMInfo *apminfo;
+static char batteries[MAXBATT][128];
+static char battinfo[MAXBATT][128];
+int batt_count;
+/* temp buffer */
+char buf[512];
+
+/* local proto */
+int acpi_get_design_cap(int battery);
+
+/* see if we have ACPI support and check version */
+int power_init(void)
+{
+    FILE *acpi;
+    char buf[4096];
+    DIR *battdir;
+    struct dirent *batt;
+    char *name;
+    char *tmp;
+
+    if (!(acpi = fopen("/proc/acpi/info", "r"))) {
+	fprintf(stderr, "This system does not support ACPI\n");
+	return 1;
+    }
+
+    /* okay, now see if we got the right version */
+    fread(buf, 4096, 1, acpi);
+    tmp = strstr(buf, "ersion:");
+    if (tmp) {
+	tmp += 16;
+	if (atoi(tmp) < 20010313) {
+	    fprintf(stderr, "This version requires ACPI subsystem version 20010313\n");
+	    fclose(acpi);
+	    return 1;
+	}
+    } else {
+	fprintf(stderr, "Perhaps old ACPI subsystem - consider upgrading to\n"
+		"at least version 20010313\n");
+	fclose(acpi);
+	return 1;
+    }
+
+    /* yep, all good */
+    fclose(acpi);
+
+    /* now enumerate batteries */
+    batt_count = 0;
+    battdir = opendir("/proc/acpi/battery");
+    if (battdir == NULL) {
+	fprintf(stderr, "No batteries or ACPI not supported\n");
+	return 1;
+    }
+    while ((batt = readdir(battdir))) {
+	name = batt->d_name;
+	
+	/* skip . and .. */
+	if (!strncmp(".", name, 1) || !strncmp("..", name, 2))
+	    continue;
+
+	sprintf(batteries[batt_count], "/proc/acpi/battery/%s/status", name);
+	sprintf(battinfo[batt_count], "/proc/acpi/battery/%s/info", name);
+	eprint(1, "battery detected at %s\n", batteries[batt_count]);
+	batt_count++;
+    }
+    closedir(battdir);
+
+    /* tell user some info */
+    eprint(1, "%d batteries detected\n", batt_count);
+    fprintf(stderr, "wmacpi: found %d batter%s\n", batt_count,
+	    (batt_count == 1) ? "y" : "ies");
+    
+    return 0;
+}
+
+int acpi_get_design_cap(int battery)
+{
+    FILE *acpi;
+    char *ptr;
+    int design_cap;
+
+    if (battery > MAXBATT)
+	return -1;
+
+    if (!(acpi = fopen(battinfo[battery], "r")))
+	return -1;
+    
+    fread(buf, 512, 1, acpi);
+    fclose(acpi);
+
+    if ((ptr = strstr(buf, "Last Full Capacity"))) {
+	ptr += 25;
+	sscanf(ptr, "%d", &design_cap);
+	eprint(1, "last full capacity: %d\n", design_cap);
+    } else {
+	/* hack.  if there isnt any info on last capacity, we are
+	 * screwed, but let's not come back here again */
+	design_cap = -1;
+	eprint(1, "Cannot retrieve design capacity!");
+    }
+    
+    return design_cap;
+}
+
+void acquire_info(void)
+{
+    FILE *acpi;
+    char *ptr;
+    char stat;
+
+    static int dcap = 0xdeadbeef;
+
+    int percent = 100;		/* battery percentage */
+    int ptemp, rate, rtime = 0;
+
+    if (dcap == 0xdeadbeef) {
+	/* get from first battery for now */
+	dcap = acpi_get_design_cap(0);
+    }
+
+    if (!(acpi = fopen(batteries[0], "r")))
+	return;
+
+    eprint(1, "opened acpi file successfully");
+    fread(buf, 512, 1, acpi);
+    fclose(acpi);
+
+    /* This section of the code will calculate "percentage remaining"
+     * using battery capacity, and the following formula (acpi spec 3.9.2):
+     * percentage = (current_capacity / last_full_capacity) * 100; */
+    if ((ptr = strstr(buf, "Remaining Capacity"))) {
+	ptr += 25;
+	sscanf(ptr, "%d", &ptemp);
+	eprint(1, "capacity: %d\n", ptemp);
+	percent = (float)((float)ptemp / (float)dcap) * 100;
+	eprint(1, "percent: %d\n", percent);
+    }
+    apminfo->percentage = percent;
+
+    /* this section of code will calculate "time remaining"
+     * using battery remaining capacity, and battery "rate" (3.9.3) */
+    if ((ptr = strstr(buf, "Present Rate"))) {
+	ptr += 25;
+	sscanf(ptr, "%d", &rate);
+	eprint(1, "rate: %d\n", rate);
+	if (rate <= 0)
+	    rate = 0;
+	/* time remaining in minutes */
+	rtime = ((float)((float)ptemp / (float)rate)) * 60;
+	if (rtime <= 0)
+	    rtime = 0;
+	eprint(1, "time rem: %d\n", rtime);
+    }
+    apminfo->rtime = rtime;
+
+    if ((ptr = strstr(buf, "State:"))) {
+	/* found battery discharging.  This is used to determine if
+	 * we are on AC power or not. Notice check for "ch" later on */
+	stat = *(ptr + 25);
+	if (stat == 'o')	/* "ok" : charged, on ac power */		
+	    apminfo->power = POWER;
+	else
+	    /* we set this, and later on use percentage
+	     * value to determine high/med/low */
+	    apminfo->power = HIGH;
+
+	/* but if we are on power, we might be charging too.  Check. */
+	if ((ptr = strstr(buf, "State:"))) {
+	    /* found battery charging line.  We will change power state
+	     * if we are on power, and charging. */
+	    stat = *(ptr + 25);
+	    /* this is seriously stupid - but we catch "critical" */
+	    if (stat == 'c' && (*(ptr + 26) == 'h'))
+		apminfo->power = CHARGING;
+	}
+    }
+
+    /* we are not on power, and not charging.  So, it would make sense
+     * to check if battery is "critical low", and calculate interesting
+     * things like battery HIGH/LOW, and maybe battery usage LOAD
+     * This will be replaced with some code to allow setting user-specified
+     * low / critical alarms */
+    if ((apminfo->power != POWER) && (apminfo->power != CHARGING)) {
+	eprint(1, "entering battery status check");
+	if ((ptr = strstr(buf, "State:"))) {
+	    stat = *(ptr + 25);
+	    /* only check "c" here because we already caught "CHarging" earlier
+	     * and also look into crit_level */
+	    if (stat == 'c' || (apminfo->percentage <= apminfo->crit_level)) {
+		/* nothing else to do here - critical battery. get out */
+		eprint(1, "Received critical battery status");
+		apminfo->power = CRIT;
+	    }
+	}
+    }
+    process_plugin_timer();
+
+    eprint(1, "current state: %s (%d)", state[apminfo->power], apminfo->power);
+}
+#endif /* ACPI */
diff --git a/libapm.c b/libapm.c
new file mode 100644
index 0000000..684da76
--- /dev/null
+++ b/libapm.c
@@ -0,0 +1,91 @@
+#include <stdio.h>
+#include "wmacpi.h"
+
+#ifdef APM
+#ifdef PRO
+extern char *state[];
+#endif
+extern APMInfo *apminfo;
+extern int crit_level;
+
+int power_init(void)
+{
+    FILE *apm;
+
+    if (!(apm = fopen("/proc/apm", "r"))) {
+	fprintf(stderr, "This system does not support APM\n");
+	return 1;
+    }
+    fclose(apm);
+
+    return 0;
+}
+
+void acquire_info(void)
+{
+    FILE *apm;
+    char buf[256];
+    char min[10];
+
+    int ac_line, batt, percent, rtime;
+
+#ifdef PRO
+    /* testing */
+    if (!(apm = fopen("apm", "r")))
+	return;
+#else
+    if (!(apm = fopen("/proc/apm", "r")))
+	return;
+#endif
+
+    fgets(buf, 255, apm);
+    sscanf(buf, "%*s %*s %*s %x %x %*s %d%% %d %s",
+	   &ac_line, &batt, &percent, &rtime, min);
+
+    eprint(0, "%02x %02x, %03d%%, %d", ac_line, batt, percent, rtime);
+    apminfo->percentage = percent;
+    apminfo->rtime = rtime;
+
+    switch (ac_line) {
+    case 0:	/* on battery.  calculate status. handle charging under AC */
+	switch (batt) {
+	case 0:
+	    apminfo->power = HIGH;
+	    break;
+	case 1:
+	    apminfo->power = LOW;
+	    break;
+	case 2:
+	    apminfo->power = CRIT;
+	    break;
+	}
+
+	/* check user-defined critical alarm */
+	if (apminfo->percentage <= apminfo->crit_level)
+	    apminfo->power = CRIT;
+
+	break;
+    case 1:	/* on AC power.  Check if battery is being charged */
+#ifdef RETARDED_APM
+	/* this is incase your battery is "charging" all the fucking time,
+	 * even when it's actually done charging */
+	if ((batt == 3) && (percent != 100))
+#else
+	if (batt == 3)
+#endif
+	    apminfo->power = CHARGING;
+	else
+	    apminfo->power = POWER;
+	break;
+#ifdef STUPID_APM
+	/* treatment for GAY apm bioses that show wrong time
+	 * remaining when AC is plugged in */
+	apminfo->rtime = 0;
+#endif
+    }
+    fclose(apm);
+    process_plugin_timer();
+
+    eprint(1, "current state: %s (%d)", state[apminfo->power], apminfo->power);
+}
+#endif /* APM */
diff --git a/master.xpm b/master.xpm
new file mode 100644
index 0000000..30c5d58
--- /dev/null
+++ b/master.xpm
@@ -0,0 +1,207 @@
+/* XPM */
+static char * master_xpm[] = {
+"157 88 116 2",
+"  	c None",
+". 	c #000000",
+"+ 	c #FF0000",
+"@ 	c #FF0900",
+"# 	c #FF1200",
+"$ 	c #FF1C00",
+"% 	c #202020",
+"& 	c #FF2F00",
+"* 	c #FF3800",
+"= 	c #FF4200",
+"- 	c #FF4B00",
+"; 	c #FF5E00",
+"> 	c #FF6700",
+", 	c #FF7100",
+"' 	c #FF7A00",
+") 	c #FF8D00",
+"! 	c #FF9700",
+"~ 	c #FFA000",
+"{ 	c #FFA900",
+"] 	c #FFBC00",
+"^ 	c #FFC600",
+"/ 	c #FFCF00",
+"( 	c #FFD900",
+"_ 	c #FFEC00",
+": 	c #FFF500",
+"< 	c #FFFF00",
+"[ 	c #F5FF00",
+"} 	c #E2FF00",
+"| 	c #D9FF00",
+"1 	c #CFFF00",
+"2 	c #C6FF00",
+"3 	c #B3FF00",
+"4 	c #AAFF00",
+"5 	c #A0FF00",
+"6 	c #97FF00",
+"7 	c #84FF00",
+"8 	c #7AFF00",
+"9 	c #71FF00",
+"0 	c #67FF00",
+"a 	c #54FF00",
+"b 	c #4BFF00",
+"c 	c #42FF00",
+"d 	c #38FF00",
+"e 	c #25FF00",
+"f 	c #1CFF00",
+"g 	c #12FF00",
+"h 	c #09FF00",
+"i 	c #400000",
+"j 	c #400300",
+"k 	c #400500",
+"l 	c #400700",
+"m 	c #400C00",
+"n 	c #400E00",
+"o 	c #401100",
+"p 	c #401300",
+"q 	c #401800",
+"r 	c #401A00",
+"s 	c #401D00",
+"t 	c #401F00",
+"u 	c #402400",
+"v 	c #402600",
+"w 	c #402800",
+"x 	c #402B00",
+"y 	c #402F00",
+"z 	c #403200",
+"A 	c #403400",
+"B 	c #403700",
+"C 	c #403B00",
+"D 	c #403E00",
+"E 	c #404000",
+"F 	c #3E4000",
+"G 	c #394000",
+"H 	c #374000",
+"I 	c #344000",
+"J 	c #324000",
+"K 	c #2D4000",
+"L 	c #2B4000",
+"M 	c #284000",
+"N 	c #264000",
+"O 	c #214000",
+"P 	c #1F4000",
+"Q 	c #1D4000",
+"R 	c #1A4000",
+"S 	c #154000",
+"T 	c #134000",
+"U 	c #114000",
+"V 	c #0E4000",
+"W 	c #0A4000",
+"X 	c #074000",
+"Y 	c #054000",
+"Z 	c #034000",
+"` 	c #C7C7C7",
+" .	c #303030",
+"..	c #20B2AE",
+"+.	c #004941",
+"@.	c #188A86",
+"#.	c #DAF5B2",
+"$.	c #355600",
+"%.	c #FEFFFF",
+"&.	c #AAAFA9",
+"*.	c #315900",
+"=.	c #D0D2D1",
+"-.	c #FDFEF6",
+";.	c #FF2D00",
+">.	c #DA0710",
+",.	c #F3FFF9",
+"'.	c #A5F812",
+").	c #A7ACB2",
+"!.	c #4F5354",
+"~.	c #87F91F",
+"{.	c #94F625",
+"].	c #C0C6BC",
+"^.	c #22B2AE",
+"/.	c #027E72",
+"(.	c #034A40",
+"_.	c #107D79",
+"                                                                                                                                .   + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % a b c d % e f g h                                                                           ",
+"                                                                                                                                .   + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % a b c d % e f g h                                                                           ",
+"                                                                                                                                .   + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % a b c d % e f g h                                                                           ",
+"                                                                                                                                .   + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % a b c d % e f g h                                                                           ",
+"        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .         .   + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % a b c d % e f g h                                                                           ",
+"        . i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z `         .   + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % a b c d % e f g h                                                                           ",
+"        . i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z `         .   + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % a b c d % e f g h                                                                           ",
+"        . i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z `         .   + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % a b c d % e f g h                                                                           ",
+"        . i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z `         .                                                                                                                                                                                         ",
+"        . i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z `         .   % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %                                                                           ",
+"        . i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z `         .   % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %                                                                           ",
+"        . i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z `         .   % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %                                                                           ",
+"        . i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z `         .   % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %                                                                           ",
+"        ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `         .   % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %                                                                           ",
+"                                                                                                                                .   % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %                                                                           ",
+"        . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     . . . . . . . . . . . . . . . . . . . . . . . . .         .   % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %                                                                           ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % `     . % % % % % % % % % % % % % % % % % % % % % % % `         .    . . . .%  . . . .%  . . . .%  . . . .%  . . . .%  . . . .%  . . . .%  . . . .%  . . . .%  . . . .%  . . . .                                                                          ",
+"        . % % % % % % ..........% % % % ....................% % `     . % % % % % +.+.+.% % % +.+.+.% % % ..% % % % % `         .                                                                                                                                                                                         ",
+"        . % % % % % ..% % % % ......% % ..% % % % % % % % ..% % `     . % % +.% +.% % % +.% +.% % % +.% ..% ..% ..% % `         .   i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z                                                                           ",
+"        . % % % % % ..% % % % ..% % % % ..% % % % % % % % ....% `     . % % +.% +.% % % +.% +.% % % +.% % ..% ..% % % `         .   i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z                                                                           ",
+"        . % % % ......% % % % ..% % % % ..% % % % % % % % ....% `     . % % % % % +.+.+.% % % +.+.+.% % % % ..% % % % `         .   i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z                                                                           ",
+"        . % % ..% % ..% % % % ......% % ..% % % % % % % % ....% `     . % % +.% +.% % % +.% +.% % % +.% % ..% ..% % % `         .   i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z                                                                           ",
+"        . % ..% % % % ..........% % % % ..% % % % % % % % ..% % `     . % % +.% +.% % % +.% +.% % % +.% ..% ..% ..% % `         .   i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z                                                                           ",
+"        . % ..% % % % % % % % % % % % % ....................% % `     . % % % % % +.+.+.% % % +.+.+.% % % % % ..% % % `         .   i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z                                                                           ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % `     . % % % % % % % % % % % % % % % % % % % % % % % `         .   i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z                                                                           ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % `     . % % % % % % % % % % % % % % % % % % % % % % % `         .   i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z                                                                           ",
+"        ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `     ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `         .                                                                                                                                                                                         ",
+"                                                                                                                                .   % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %                                           ",
+"                                                                                                                                .   % % ......% % % +.+.+. at .% @....... at .% @....... at .% @.+.+.+. at .% @....... at .% @....... at .% @....... at .% @....... at .% @....... at .% % ..% % % % % % %                                           ",
+"        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     . . . . . . . . . . . . . . . . `         .   % ..% % % ..% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% ..% % % +.% ..% % % +.% +.% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % ..%                                           ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % `     . #.$.$.. %.%.%.%.%.%.%.%.%.&.% `         .   % ..% % % ..% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% ..% % % +.% ..% % % +.% +.% % % ..% ..% % % ..% ..% % % ..% % ..% ..% % % @.%                                           ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % `     . $.*.*.. %.=.=.=.=.=.=.=.=.&.% `         .   % @.+.+.+. at .% % +.+.+. at .% @....... at .% % ...... at .% @....... at .% @....... at .% @....... at .% % +.+.+. at .% @....... at .% @....... at .% % % ..% % % % % %                                           ",
+"        . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % `     . $.*.*.. %.=.=.=.=.=.=.=.=.&.% `         .   % ..% % % ..% +.% % % ..% ..% % % +.% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% % ..% ..% % % % %                                           ",
+"        . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % `     . . . . . %.=.=.=.=.=.=.=.=.&.% `         .   % ..% % % ..% +.% % % ..% ..% % % +.% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% ..% ..% % ..%   -.;.;.                                  ",
+"        . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % `     . %.%.%.%.%.=.=.=.=.=.=.=.=.&.% `         .   % % ......% % % +.+.+. at .% @....... at .% @....... at .% % +.+.+. at .% @....... at .% @....... at .% % +.+.+. at .% @....... at .% @....... at .% % % % ..% % % @.%   ;.;.;.                                  ",
+"        . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % `     . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `         .   % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %   ;.;.>.                                  ",
+"        . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % `     . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `         .                                                                                                                                                                                         ",
+"        . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % `     . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `         .   % % % % % % % % % % % % % %   % % % % % % % % % % % % %   % % % % % % % % % % % % % % % % % % % % %   . . . . . . . . . . . . . . . . `   . . . . . . . . . . . . . . . . `           ",
+"        . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % `     . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `         .   % % % % % % ..........% % %   % ....................% %   % @.% % ......% % % ......% % % ..% % % %   . ,.'.'.. ).).).).).).).).).!.% `   . #.$.$.. %.%.%.%.%.%.%.%.%.&.% `           ",
+"        . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % `     . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `         .   % % % % % ..% % % % ......%   % ..% % % % % % % % ..% %   % ..% ..% % % ..% ..% % % ..% ..% ..% ..%   . '.~.{.. ).].].].].].].].].!.% `   . $.*.*.. %.=.=.=.=.=.=.=.=.&.% `           ",
+"        . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % `     . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `         .   % % % % % ..% % % % ..% % %   % ..% % % % % % % % ....%   % ..% ..% % % ..% ..% % % ..% % ..% ..% %   . '.{.{.. ).].].].].].].].].!.% `   . $.*.*.. %.=.=.=.=.=.=.=.=.&.% `           ",
+"        . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % `     . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `         .   % % % ......% % % % ..% % %   % ..% % % % % % % % ....%   % @.% @.+.+.+. at .% @.+.+.+. at .% % % ..% % %   . . . . . ).].].].].].].].].!.% `   . . . . . %.=.=.=.=.=.=.=.=.&.% `           ",
+"        . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % `     . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `         .   % % ..% % ..% % % % ......%   % ..% % % % % % % % ....%   % ..% ..% % % ..% ..% % % ..% % ..% ..% %   . ).).).).).].].].].].].].].!.% `   . %.%.%.%.%.=.=.=.=.=.=.=.=.&.% `           ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % `     . %.&.&.&.&.&.&.&.&.&.&.&.&.&.% `         .   % ..% % % % ..........% % %   % ..% % % % % % % % ..% %   % ..% ..% % % ..% ..% % % ..% ..% ..% ..%   . ).].].].].].].].].].].].].!.% `   . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `           ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % `     . . . . . . . . . . . . . . . % `         .   % ..% % % % % % % % % % % %   % ....................% %   % @.% % ......% % % ......% % % % % ..% %   . ).].].].].].].].].].].].].!.% `   . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `           ",
+"        ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `     ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `         .   % % % % % % % % % % % % % %   % % % % % % % % % % % % %   % % % % % % % % % % % % % % % % % % % % %   . ).].].].].].].].].].].].].!.% `   . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `           ",
+"                                                                                                                                .                                                                                                         . ).].].].].].].].].].].].].!.% `   . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `           ",
+"                                                                                                                                .   % % % % % % % % % % % % % %   % % % % % % % % % % % % %   % % % % % % % % % % % % % % % % % % % % %   . ).].].].].].].].].].].].].!.% `   . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `           ",
+"        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .         .   % % % % % % +.+.+.+.+.% % %   % +.+.+.+.+.+.+.+.+.+.% %   % % % % +.+.+.% % % +.+.+.% % % +.% % % %   . ).].].].].].].].].].].].].!.% `   . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `           ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % `         .   % % % % % +.% % % % +.+.+.%   % +.% % % % % % % % +.% %   % +.% +.% % % +.% +.% % % +.% +.% +.% +.%   . ).].].].].].].].].].].].].!.% `   . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `           ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % `         .   % % % % % +.% % % % +.% % %   % +.% % % % % % % % +.+.%   % +.% +.% % % +.% +.% % % +.% % +.% +.% %   . ).].].].].].].].].].].].].!.% `   . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% `           ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % `         .   % % % +.+.+.% % % % +.% % %   % +.% % % % % % % % +.+.%   % % % % +.+.+.% % % +.+.+.% % % % +.% % %   . ).!.!.!.!.!.!.!.!.!.!.!.!.!.% `   . %.&.&.&.&.&.&.&.&.&.&.&.&.&.% `           ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % `         .   % % +.% % +.% % % % +.+.+.%   % +.% % % % % % % % +.+.%   % +.% +.% % % +.% +.% % % +.% % +.% +.% %   . . . . . . . . . . . . . . . % `   . . . . . . . . . . . . . . . % `           ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % `         .   % +.% % % % +.+.+.+.+.% % %   % +.% % % % % % % % +.% %   % +.% +.% % % +.% +.% % % +.% +.% +.% +.%   ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `   ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `           ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % `         .   % +.% % % % % % % % % % % %   % +.+.+.+.+.+.+.+.+.+.% %   % % % % +.+.+.% % % +.+.+.% % % % % +.% %                                                                                   ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % `         .   % % % % % % % % % % % % % %   % % % % % % % % % % % % %   % % % % % % % % % % % % % % % % % % % % %                                                                                   ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % `         .                                                                                                                                                                                         ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % `         .   % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %   % % % % % %                       ",
+"        . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % `         .   % % ^.^.^.% % % % % % /.% /.^.^.^./.% /.^.^.^./.% /.% % % /.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% % % % % % % % % % % % %   % % % % % %                       ",
+"        ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `         .   % ^.% % % ^.% % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % % % % % % % ^.% ^.% % % ^.% ^.% % % ^.% % % % % % % % % % % % %   % % % % % %                       ",
+"                                                                                                                                .   % ^.% % % ^.% % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % % % % % % % ^.% ^.% % % ^.% ^.% % % ^.% % % % % % % % % % % % %   % % % % % %                       ",
+"                                                                                                                                .   % /.% % % /.% % % % % /.% /.^.^.^./.% % ^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% % % % % /.% (.^.^.^.(.% /.^.^.^./.% /.^.^.^./.% % % % % % %   % % % % % %                       ",
+"                                                                                                                                .   % ^.% % % ^.% % % % % ^.% ^.% % % % % % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% % % % % % % % % % % % %   % % % % % %                       ",
+"                                                                                                                                .   % ^.% % % ^.% % % % % ^.% ^.% % % % % % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% % % % % % % % % % % % %   % % % % % %                       ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   % % ^.^.^.% % % % % % ^.% /.^.^.^./.% /.^.^.^./.% % % % % /.% /.^.^.^./.% /.^.^.^./.% % % % % /.% /.^.^.^./.% /.^.^.^./.% % % % % % % % % % % % %   % % % % ^.%                       ",
+"                                                                                                                                    % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %                                     ",
+"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
+"% (.^.^.^.(.% /.^.^.^.% % /.^.^.^./.% /.^.^.^.% % /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.% % % /.% % % /.% % % % % % % /.% /.% % % /.% /.% % % % % ^.% % % ^.% /.^.^.^.% % /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.% % % /.% /.% % % /.% /.% % % /.% /.% % % /.% /.% % % /.% /.^.^.^./.% ",
+"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % % % ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % % ^.% ^.% % % % % ^.^.% ^.^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% % % % % ^.% ",
+"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % % % ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % ^.(.% ^.% % % % % ^.% ^.% ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% (.^.% ^.(.% ^.% % % ^.% % % % ^.(.% ",
+"% /.^.^.^./.% /.^.^.^.% % /.% % % % % /.% % % /.% /.^.^.^.% % /.^.^.^.% % /.(.^.^./.% /.^.^.^./.% % % /.% % % % % % % /.% /.^.^.(.% % /.% % % % % /.% % % /.% /.% % % /.% /.% % % /.% /.^.^.^./.% /.^.% % /.% /.^.^.^.% % /.^.^.^./.% % % /.% % % /.% % % /.% /.% % % /.% /.% % % /.% % (.^.(.% % /.^.^.^./.% % (.^.(.% % ",
+"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % ^.% ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % ^.(.% ^.% % % % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% ^.% ^.% ^.% % % ^.% % % % % ^.% % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.% ^.% ^.% (.^.% ^.(.% % % % % ^.% (.^.% % % % ",
+"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % ^.% ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % ^.^.% ^.% % % ^.% % % % % ^.% % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.^.% ^.^.% ^.% % % ^.% % % % % ^.% ^.% % % % % ",
+"% /.% % % /.% /.^.^.^.% % /.^.^.^./.% ^.^.^.^.% % /.^.^.^./.% ^.% % % % % /.^.^.^./.% /.% % % /.% % % ^.% % % /.^.^.^./.% /.% % % /.% /.^.^.^.(.% /.% % % /.% ^.% % % ^.% /.^.^.^./.% /.% % % % % /.^.^.^./.% /.% % % /.% /.^.^.^./.% % % /.% % % (.^.^.^.^.% % ^.^.^.% % ^.% % % ^.% /.% % % ^.% /.^.^.^./.% /.^.^.^./.% ",
+"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
+"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %         % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %   % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %       % % % % % % % % ",
+"% % ........% % % +.+.+.+._.% _......... at .% _........._.% _.+.+.+.+._.% _........._.% _......... at .% _........._.% _......... at .% _......... at .% % % % %         % % ........% % % ........% % % % % % % ........% % % ........% %   % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% %       % % ^.+.+.+.^.% ",
+"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % ..% %         % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..%   % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.%       % ^.% ^.% ^.+.% ",
+"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % ..% %         % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..%   % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.%       % +.^.% ^.% +.% ",
+"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % % % %         % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..%   % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.%       % +.% ^.% ^.+.% ",
+"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % % % %         % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..%   % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.%       % +.^.% ^.% ^.% ",
+"% _.+.+.+.+._.% % +.+.+.+._.% _........._.% _........._.% _........._.% _........._.% _........._.% % +.+.+.+._.% _........._.% _........._.% % % % %         % _.+.+.+.+._.% _.+.+.+.+._.% % % % % _.+.+.+.+._.% _.+.+.+.+._.%   % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% %       % ^.+.+.+.^.% % ",
+"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % % % %         % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..%   % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.%       % +.% % % % +.% ",
+"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % % % %         % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..%   % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.%       % ^.^.^.^.^.+.% ",
+"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % ..% %         % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..%   % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.%       % ^.% % % ^.^.% ",
+"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % ..% %         % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..%   % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.%       % ^.% % % ^.^.% ",
+"% % ........% % % +.+.+.+._.% _........._.% _........._.% % +.+.+.+._.% _........._.% _........._.% % +.+.+.+._.% _........._.% _........._.% % % % %         % % ........% % % ........% % % % % % % ........% % % ........% %   % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% %       % ^.^.^.^.^.% % ",
+"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %         % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %   % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %       % % % % % % % % "};
diff --git a/master_low.xpm b/master_low.xpm
new file mode 100644
index 0000000..2156b41
--- /dev/null
+++ b/master_low.xpm
@@ -0,0 +1,111 @@
+/* XPM */
+static char * master_xpm[] = {
+"157 88 20 1",
+" 	c None",
+".	c #000000",
+"+	c #FF0000",
+"@	c #202020",
+"#	c #FFF500",
+"$	c #09FF00",
+"%	c #400000",
+"&	c #403B00",
+"*	c #034000",
+"=	c #AAAFA9",
+"-	c #20B2AE",
+";	c #004941",
+">	c #188A86",
+",	c #D0D2D1",
+"'	c #FEFFFF",
+")	c #4F5354",
+"!	c #22B2AE",
+"~	c #027E72",
+"{	c #034A40",
+"]	c #107D79",
+"                                                                . ++++ at ++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$                                     ",
+"                                                                . ++++ at ++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$                                     ",
+"                                                                . ++++ at ++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$                                     ",
+"                                                                . ++++ at ++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$                                     ",
+"    ........................................................    . ++++ at ++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$                                     ",
+"    .%%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****=    . ++++ at ++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$                                     ",
+"    .%%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****=    . ++++ at ++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$                                     ",
+"    .%%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****=    . ++++ at ++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$                                     ",
+"    .%%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****=    .                                                                                            ",
+"    .%%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****=    . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                     ",
+"    .%%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****=    . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                     ",
+"    .%%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****=    . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                     ",
+"    .%%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****=    . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                     ",
+"    ========================================================    . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                     ",
+"                                                                . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                     ",
+"    .............................  .........................    . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                     ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@=  .@@@@@@@@@@@@@@@@@@@@@@@=    . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                     ",
+"    .@@@@@@-----@@@@----------@@=  .@@@@@;;;@@@;;;@@@-@@@@@=    .                                                                                            ",
+"    .@@@@@-@@@@---@@-@@@@@@@@-@@=  .@@;@;@@@;@;@@@;@- at -@-@@=    . %%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****                                     ",
+"    .@@@@@-@@@@-@@@@-@@@@@@@@--@=  .@@;@;@@@;@;@@@;@@- at -@@@=    . %%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****                                     ",
+"    .@@@---@@@@-@@@@-@@@@@@@@--@=  .@@@@@;;;@@@;;;@@@@-@@@@=    . %%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****                                     ",
+"    .@@-@@-@@@@---@@-@@@@@@@@--@=  .@@;@;@@@;@;@@@;@@- at -@@@=    . %%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****                                     ",
+"    . at -@@@@-----@@@@-@@@@@@@@-@@=  .@@;@;@@@;@;@@@;@- at -@-@@=    . %%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****                                     ",
+"    . at -@@@@@@@@@@@@@----------@@=  .@@@@@;;;@@@;;;@@@@@-@@@=    . %%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****                                     ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@=  .@@@@@@@@@@@@@@@@@@@@@@@=    . %%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****                                     ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@=  .@@@@@@@@@@@@@@@@@@@@@@@=    . %%%%@%%%%@%%%%@&&&&@&&&&@&&&&@&&&&@****@****@****@****                                     ",
+"    =============================  =========================    .                                                                                            ",
+"                                                                . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                     ",
+"                                                                . @@---@@@;;;>@>--->@>--->@>;;;>@>--->@>--->@>--->@>--->@>--->@@-@@@@@@@                     ",
+"    .....................................  ................=    . @-@@@-@;@@@-@;@@@-@;@@@- at -@@@- at -@@@;@-@@@;@;@@@- at -@@@- at -@@@- at -@- at -@@-@                     ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=  .,**.'''''''''=@=    . @-@@@-@;@@@-@;@@@-@;@@@- at -@@@- at -@@@;@-@@@;@;@@@- at -@@@- at -@@@-@@- at -@@@>@                     ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=  .***.',,,,,,,,=@=    . @>;;;>@@;;;>@>--->@@--->@>--->@>--->@>--->@@;;;>@>--->@>--->@@@-@@@@@@                     ",
+"    .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@=  .***.',,,,,,,,=@=    . @-@@@-@;@@@- at -@@@;@;@@@-@;@@@-@;@@@- at -@@@-@;@@@- at -@@@-@;@@@-@@- at -@@@@@                     ",
+"    .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@=  .....',,,,,,,,=@=    . @-@@@-@;@@@- at -@@@;@;@@@-@;@@@-@;@@@- at -@@@-@;@@@- at -@@@-@;@@@- at -@- at -@@-@ ,++                 ",
+"    .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@=  .''''',,,,,,,,=@=    . @@---@@@;;;>@>--->@>--->@@;;;>@>--->@>--->@@;;;>@>--->@>--->@@@@-@@@>@ +++                 ",
+"    .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@=  .',,,,,,,,,,,,=@=    . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +++                 ",
+"    .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@=  .',,,,,,,,,,,,=@=    .                                                                                            ",
+"    .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@=  .',,,,,,,,,,,,=@=    . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ................= ................=     ",
+"    .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@=  .',,,,,,,,,,,,=@=    . @@@@@@-----@@@ @----------@@ @>@@---@@@---@@@-@@@@ .,$$.))))))))))@= .,**.'''''''''=@=     ",
+"    .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@=  .',,,,,,,,,,,,=@=    . @@@@@-@@@@---@ @-@@@@@@@@-@@ @- at -@@@- at -@@@- at -@- at -@ .$$$.),,,,,,,,=@= .***.',,,,,,,,=@=     ",
+"    .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@=  .',,,,,,,,,,,,=@=    . @@@@@-@@@@-@@@ @-@@@@@@@@--@ @- at -@@@- at -@@@-@@- at -@@ .$$$.),,,,,,,,=@= .***.',,,,,,,,=@=     ",
+"    .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@=  .',,,,,,,,,,,,=@=    . @@@---@@@@-@@@ @-@@@@@@@@--@ @>@>;;;>@>;;;>@@@-@@@ .....),,,,,,,,=@= .....',,,,,,,,=@=     ",
+"    .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@=  .',,,,,,,,,,,,=@=    . @@-@@-@@@@---@ @-@@@@@@@@--@ @- at -@@@- at -@@@-@@- at -@@ .))))),,,,,,,,=@= .''''',,,,,,,,=@=     ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=  .'=============@=    . @-@@@@-----@@@ @-@@@@@@@@-@@ @- at -@@@- at -@@@- at -@- at -@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@=     ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=  ...............@=    . @-@@@@@@@@@@@@ @----------@@ @>@@---@@@---@@@@@-@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@=     ",
+"    =====================================  =================    . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@=     ",
+"                                                                .                                                    .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@=     ",
+"                                                                . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@=     ",
+"    ........................................................    . @@@@@@;;;;;@@@ @;;;;;;;;;;@@ @@@@;;;@@@;;;@@@;@@@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@=     ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=    . @@@@@;@@@@;;;@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@=     ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=    . @@@@@;@@@@;@@@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@=     ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=    . @@@;;;@@@@;@@@ @;@@@@@@@@;;@ @@@@;;;@@@;;;@@@@;@@@ .)=============@= .'=============@=     ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=    . @@;@@;@@@@;;;@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ ...............@= ...............@=     ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=    . @;@@@@;;;;;@@@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ ================= =================     ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=    . @;@@@@@@@@@@@@ @;;;;;;;;;;@@ @@@@;;;@@@;;;@@@@@;@@                                         ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=    . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@                                         ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=    .                                                                                            ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=    . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@           ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=    . @@!!!@@@@@@~@~!!!~@~!!!~@~@@@~@~!!!~@~!!!~@~!!!~@~!!!~@~!!!~@@@@@@@@@@@@@ @@@@@@           ",
+"    ========================================================    . @!@@@!@@@@@!@@@@@!@@@@@!@!@@@!@!@@@@@!@@@@@@@@@!@!@@@!@!@@@!@@@@@@@@@@@@@ @@@@@@           ",
+"                                                                . @!@@@!@@@@@!@@@@@!@@@@@!@!@@@!@!@@@@@!@@@@@@@@@!@!@@@!@!@@@!@@@@@@@@@@@@@ @@@@@@           ",
+"                                                                . @~@@@~@@@@@~@~!!!~@@!!!~@~!!!~@~!!!~@~!!!~@@@@@~@{!!!{@~!!!~@~!!!~@@@@@@@ @@@@@@           ",
+"                                                                . @!@@@!@@@@@!@!@@@@@@@@@!@@@@@!@@@@@!@!@@@!@@@@@!@!@@@!@@@@@!@@@@@@@@@@@@@ @@@@@@           ",
+"                                                                . @!@@@!@@@@@!@!@@@@@@@@@!@@@@@!@@@@@!@!@@@!@@@@@!@!@@@!@@@@@!@@@@@@@@@@@@@ @@@@@@           ",
+"................................................................. @@!!!@@@@@@!@~!!!~@~!!!~@@@@@~@~!!!~@~!!!~@@@@@~@~!!!~@~!!!~@@@@@@@@@@@@@ @@@@!@           ",
+"                                                                  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                  ",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@{!!!{@~!!!@@~!!!~@~!!!@@~!!!~@~!!!~@~!!!~@~@@@~@@@~@@@@@@@~@~@@@~@~@@@@@!@@@!@~!!!@@~!!!~@~!!!~@~!!!~@~!!!~@~!!!~@~!!!~@~@@@~@~@@@~@~@@@~@~@@@~@~@@@~@~!!!~@",
+"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@@@!@@@!@@@!@@@@@@@!@!@@@!@!@@@@@!!@!!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@@@@@!@@@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@@@@@!@",
+"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@@@!@@@!@@@!@@@@@@@!@!@@!{@!@@@@@!@!@!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@@@@@!@@@!@@@!@!@@@!@!@@@!@{!@!{@!@@@!@@@@!{@",
+"@~!!!~@~!!!@@~@@@@@~@@@~@~!!!@@~!!!@@~{!!~@~!!!~@@@~@@@@@@@~@~!!{@@~@@@@@~@@@~@~@@@~@~@@@~@~!!!~@~!@@~@~!!!@@~!!!~@@@~@@@~@@@~@~@@@~@~@@@~@@{!{@@~!!!~@@{!{@@",
+"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@!@!@@@!@@@!@@@@@@@!@!@@!{@!@@@@@!@@@!@!@@@!@!@@@!@!@@@@@!@!@!@!@@@!@@@@@!@@@!@@@!@@@!@!@@@!@!@!@!@{!@!{@@@@@!@{!@@@@",
+"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@!@!@@@!@@@!@@@@@@@!@!@@@!@!@@@@@!@@@!@!@@@!@!@@@!@!@@@@@!@@!!@!@@@!@@@@@!@@@!@@@!@@@!@!@@@!@!!@!!@!@@@!@@@@@!@!@@@@@",
+"@~@@@~@~!!!@@~!!!~@!!!!@@~!!!~@!@@@@@~!!!~@~@@@~@@@!@@@~!!!~@~@@@~@~!!!{@~@@@~@!@@@!@~!!!~@~@@@@@~!!!~@~@@@~@~!!!~@@@~@@@{!!!!@@!!!@@!@@@!@~@@@!@~!!!~@~!!!~@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   @@@@@@@@",
+"@@----@@@;;;;]@]---->@]----]@];;;;]@]----]@]---->@]----]@]---->@]---->@@@@@    @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@   @@!;;;!@",
+"@-@@@@-@;@@@@-@;@@@@-@;@@@@- at -@@@@- at -@@@@;@-@@@@;@;@@@@- at -@@@@- at -@@@@-@@-@@    @-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@   @!@!@!;@",
+"@-@@@@-@;@@@@-@;@@@@-@;@@@@- at -@@@@- at -@@@@;@-@@@@;@;@@@@- at -@@@@- at -@@@@-@@-@@    @-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@   @;!@!@;@",
+"@-@@@@-@;@@@@-@;@@@@-@;@@@@- at -@@@@- at -@@@@;@-@@@@;@;@@@@- at -@@@@- at -@@@@-@@@@@    @-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@   @;@!@!;@",
+"@-@@@@-@;@@@@-@;@@@@-@;@@@@- at -@@@@- at -@@@@;@-@@@@;@;@@@@- at -@@@@- at -@@@@-@@@@@    @-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@   @;!@!@!@",
+"@];;;;]@@;;;;]@]----]@]----]@]----]@]----]@]----]@@;;;;]@]----]@]----]@@@@@    @];;;;]@];;;;]@@@@@];;;;]@];;;;]@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@   @!;;;!@@",
+"@-@@@@-@;@@@@- at -@@@@;@;@@@@-@;@@@@-@;@@@@- at -@@@@-@;@@@@- at -@@@@-@;@@@@-@@@@@    @-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@   @;@@@@;@",
+"@-@@@@-@;@@@@- at -@@@@;@;@@@@-@;@@@@-@;@@@@- at -@@@@-@;@@@@- at -@@@@-@;@@@@-@@@@@    @-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@   @!!!!!;@",
+"@-@@@@-@;@@@@- at -@@@@;@;@@@@-@;@@@@-@;@@@@- at -@@@@-@;@@@@- at -@@@@-@;@@@@-@@-@@    @-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@   @!@@@!!@",
+"@-@@@@-@;@@@@- at -@@@@;@;@@@@-@;@@@@-@;@@@@- at -@@@@-@;@@@@- at -@@@@-@;@@@@-@@-@@    @-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@   @!@@@!!@",
+"@@----@@@;;;;]@]----]@]----]@@;;;;]@]----]@]----]@@;;;;]@]----]@]----]@@@@@    @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@   @!!!!!@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   @@@@@@@@"};
diff --git a/wmacpi.c b/wmacpi.c
new file mode 100644
index 0000000..c5c48e5
--- /dev/null
+++ b/wmacpi.c
@@ -0,0 +1,634 @@
+/* apm/acpi dockapp - phear it 1.3
+ * Copyright (C) 2000, 2001 timecop at japan.co.jp
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/* #define RETARDED_APM */
+/* #define STUPID_APM */
+/* see README if you need to #define these or not. No user serviceable
+ * parts below */
+
+#define _GNU_SOURCE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <time.h>
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/extensions/shape.h>
+#include <X11/xpm.h>
+
+#include "wmacpi.h"
+
+#if defined(ACPI) && defined(APM)
+# error Cannot compile with ACPI and APM compiled in.  Please select only one.
+#endif
+
+/* main pixmap */
+#ifdef LOW_COLOR
+#include "master_low.xpm"
+#else
+#include "master.xpm"
+#endif
+
+typedef struct {
+    Display *display;		/* X11 display struct */
+    int screen;			/* current screen */
+    Window root;		/* root window */
+    Window win;			/* one window */
+    Window iconwin;		/* another one */
+    Pixmap pixmap;		/* UI pixmap, window pixmap */
+    Pixmap mask;		/* mask pixmap for shape */
+    GC gc;			/* main drawing GC */
+    Pixmap text;		/* pixmap for text scroller */
+    int tw;			/* text width inside text pixmap */
+    int update;			/* need to redraw? */
+    int pressed;		/* is the button pressed? */
+    DspMode dspmode;		/* time remaining or battery timer */
+    Mode blink;			/* should we blink the LED? (critical battery) */
+} Dockapp;
+
+/* for debug printing */
+#ifdef PRO
+char *state[] = { "AC", "Charging", "High", "Low", "Crit" };
+#endif
+
+/* globals */
+Dockapp *dockapp;
+APMInfo *apminfo;
+int count = 0;			/* global timer variable */
+int noisy_critical = 0;		/* ring xbell annoyingly if critical? */
+
+/* proto for local stuff */
+static void new_window(char *name);
+static int open_display(char *display);
+static void redraw_window(void);
+static void render_text(char *string);
+static void scroll_text(int x, int y, int width, int tw, int reset);
+static void display_percentage(int percent);
+static void display_state(void);
+static void display_time(int minutes);
+static void blink_button(Mode mode);
+
+#define copy_xpm_area(x, y, w, h, dx, dy)				\
+{									\
+    XCopyArea(dockapp->display, dockapp->pixmap, dockapp->pixmap,	\
+	    dockapp->gc, x, y, w, h, dx, dy);				\
+    dockapp->update = 1;						\
+}
+
+static void redraw_window(void)
+{
+    if (dockapp->update) {
+	eprint(1, "redrawing window");
+	XCopyArea(dockapp->display, dockapp->pixmap, dockapp->iconwin,
+		  dockapp->gc, 0, 0, 64, 64, 0, 0);
+	XCopyArea(dockapp->display, dockapp->pixmap, dockapp->win,
+		  dockapp->gc, 0, 0, 64, 64, 0, 0);
+	dockapp->update = 0;
+    }
+}
+
+static void new_window(char *name)
+{
+    XpmAttributes attr;
+    Pixel fg, bg;
+    XGCValues gcval;
+    XSizeHints sizehints;
+    XClassHint classhint;
+    XWMHints wmhints;
+
+    dockapp->screen = DefaultScreen(dockapp->display);
+    dockapp->root = DefaultRootWindow(dockapp->display);
+
+    sizehints.flags = USSize;
+    sizehints.width = 64;
+    sizehints.height = 64;
+
+    fg = BlackPixel(dockapp->display, dockapp->screen);
+    bg = WhitePixel(dockapp->display, dockapp->screen);
+
+    dockapp->win = XCreateSimpleWindow(dockapp->display, dockapp->root,
+				       0, 0, sizehints.width,
+				       sizehints.height, 1, fg, bg);
+    dockapp->iconwin =
+	XCreateSimpleWindow(dockapp->display, dockapp->win, 0, 0,
+			    sizehints.width, sizehints.height, 1, fg, bg);
+
+    XSetWMNormalHints(dockapp->display, dockapp->win, &sizehints);
+    classhint.res_name = name;
+    classhint.res_class = name;
+    XSetClassHint(dockapp->display, dockapp->win, &classhint);
+
+    XSelectInput(dockapp->display, dockapp->win,
+		 ExposureMask | ButtonPressMask | ButtonReleaseMask |
+		 StructureNotifyMask);
+    XSelectInput(dockapp->display, dockapp->iconwin,
+		 ExposureMask | ButtonPressMask | ButtonReleaseMask |
+		 StructureNotifyMask);
+
+    XStoreName(dockapp->display, dockapp->win, name);
+    XSetIconName(dockapp->display, dockapp->win, name);
+
+    gcval.foreground = fg;
+    gcval.background = bg;
+    gcval.graphics_exposures = False;
+
+    dockapp->gc =
+	XCreateGC(dockapp->display, dockapp->win,
+		  GCForeground | GCBackground | GCGraphicsExposures,
+		  &gcval);
+
+    attr.exactColors = 0;
+    attr.alloc_close_colors = 1;
+    attr.closeness = 1L << 15;
+    attr.valuemask = XpmExactColors | XpmAllocCloseColors | XpmCloseness;
+    if (XpmCreatePixmapFromData(dockapp->display, dockapp->win,
+				master_xpm, &dockapp->pixmap,
+				&dockapp->mask, &attr) != XpmSuccess) {
+	fprintf(stderr, "FATAL: Not enough colors for main pixmap!\n");
+	exit(1);
+    }
+
+    /* text area is 318x7, or 53 characters long */
+    dockapp->text = XCreatePixmap(dockapp->display, dockapp->win, 318, 7,
+				  DefaultDepth(dockapp->display,
+					       dockapp->screen));
+    if (!dockapp->text) {
+	fprintf(stderr, "FATAL: Cannot create text scroll pixmap!\n");
+	exit(1);
+    }
+
+    XShapeCombineMask(dockapp->display, dockapp->win, ShapeBounding, 0, 0,
+		      dockapp->mask, ShapeSet);
+    XShapeCombineMask(dockapp->display, dockapp->iconwin, ShapeBounding, 0,
+		      0, dockapp->mask, ShapeSet);
+
+    wmhints.initial_state = WithdrawnState;
+    wmhints.flags = StateHint;
+    wmhints.icon_window = dockapp->iconwin;
+    wmhints.icon_x = sizehints.x;
+    wmhints.icon_y = sizehints.y;
+    wmhints.window_group = dockapp->win;
+    wmhints.flags =
+	StateHint | IconWindowHint | IconPositionHint | WindowGroupHint;
+    XSetWMHints(dockapp->display, dockapp->win, &wmhints);
+
+    XMapWindow(dockapp->display, dockapp->win);
+}
+
+static void render_text(char *string)
+{
+    int i, c, k;
+
+    if (strlen(string) > 53)
+	return;
+
+    eprint(1, "rendering: %s", string);
+
+    /* prepare the text area by clearing it */
+    for (i = 0; i < 54; i++) {
+	XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
+		  dockapp->gc, 133, 57, 6, 8, i * 6, 0);
+    }
+    k = 0;
+
+    for (i = 0; string[i]; i++) {
+	c = toupper(string[i]);
+	if (c >= 'A' && c <= 'Z') {	/* letter */
+	    c = c - 'A';
+	    XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
+		      dockapp->gc, c * 6, 67, 6, 7, k, 0);
+	} else if (c >= '0' && c <= '9') {	/* number */
+	    c = c - '0';
+	    XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
+		      dockapp->gc, c * 6 + 66, 58, 6, 7, k, 0);
+	} else if (c == '.') {
+	    XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
+		      dockapp->gc, 140, 58, 6, 7, k, 0);
+	} else if (c == '-') {
+	    XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
+		      dockapp->gc, 126, 58, 6, 7, k, 0);
+	}
+	k += 6;
+    }
+    dockapp->tw = k;		/* length of text segment */
+    /* re-scroll the message */
+    scroll_text(6, 50, 52, dockapp->tw, 1);
+    /* reset the scroll repeat counter */
+    count = 0;
+}
+
+static int open_display(char *display)
+{
+    dockapp->display = XOpenDisplay(display);
+    if (!dockapp->display) {
+	fprintf(stderr, "Unable to open display '%s'\n", display);
+	return 1;
+    }
+    return 0;
+}
+
+static void scroll_text(int x, int y, int width, int tw, int reset)
+{
+    static int pos, first, stop;
+
+    if (reset) {
+	pos = 0;
+	first = 0;
+	stop = 0;
+	XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
+		  dockapp->gc, 0, 0, width, 7, x, y);
+    }
+
+    if (stop) {
+	return;
+    }
+
+    if ((first == 0) && pos == 0) {
+	pos = width;
+	first = 1;
+    }
+
+    if (pos == (0 - tw - 2)) {
+	first = 1;
+	pos = width;
+	stop = 1;
+	return;
+    }
+    pos -= 2;
+
+    eprint(0, "scrolling");
+
+    if (pos > 0) {
+	copy_xpm_area(66, 9, pos, 7, x, y);	/* clear */
+	XCopyArea(dockapp->display, dockapp->text, dockapp->pixmap,
+		  dockapp->gc, 0, 0, width - pos, 7, x + pos, y);
+    } else {			/* don't need to clear, already in text */
+	XCopyArea(dockapp->display, dockapp->text, dockapp->pixmap,
+		  dockapp->gc, abs(pos), 0, width, 7, x, y);
+    }
+    dockapp->update = 1;
+}
+
+static void display_percentage(int percent)
+{
+    static int op = -1, obar;
+    unsigned int bar;
+
+    eprint(1, "received: %d\n", percent);
+
+    if (op == percent)
+	return;
+
+    if (percent < 0)
+	percent = 0;
+    if (percent > 100)
+	percent = 100;
+
+    if (percent < 100) {	/* 0 - 99 */
+	copy_xpm_area(95, 48, 8, 7, 37, 17);
+	if (percent >= 10)
+	    copy_xpm_area((percent / 10) * 6 + 67, 28, 5, 7, 40, 17);
+	copy_xpm_area((percent % 10) * 6 + 67, 28, 5, 7, 46, 17);
+    } else
+	copy_xpm_area(95, 37, 21, 9, 37, 16);	/* 100% */
+    op = percent;
+
+    bar = percent / 1.8518;
+
+    if (bar == obar)
+	return;
+
+    copy_xpm_area(66, 0, bar, 8, 5, 5);
+    if (bar < 54)
+	copy_xpm_area(66 + bar, 18, 54 - bar, 8, bar + 5, 5);
+    obar = bar;
+}
+
+static void display_time(int minutes)
+{
+    static int ohour = -1, omin = -1;
+    static int counter;
+    int hour, min, tmp;
+
+    if (minutes == -1) {	/* error - blink 00:00 */
+	counter++;
+	if (counter == 5) {
+	    copy_xpm_area(80, 76, 31, 11, 7, 32);
+	} else if (counter == 10) {
+	    copy_xpm_area(114, 76, 31, 11, 7, 32);
+	}
+	if (counter > 10)
+	    counter = 0;
+	ohour = omin = -1;
+	return;
+    }
+
+    /* render time on the display */
+    hour = minutes / 60;
+    min = minutes % 60;
+
+    if (hour == ohour && min == omin)
+	return;
+
+    eprint(0, "redrawing time");
+    tmp = hour / 10;
+    copy_xpm_area(tmp * 7 + 1, 76, 6, 11, 7, 32);
+    tmp = hour % 10;
+    copy_xpm_area(tmp * 7 + 1, 76, 6, 11, 14, 32);
+    tmp = min / 10;
+    copy_xpm_area(tmp * 7 + 1, 76, 6, 11, 25, 32);
+    tmp = min % 10;
+    copy_xpm_area(tmp * 7 + 1, 76, 6, 11, 32, 32);
+    copy_xpm_area(71, 76, 3, 11, 21, 32);
+    ohour = hour;
+    omin = min;
+}
+
+static void display_state(void)
+{
+    static int dopower;
+    static int docharging;
+    static int dobattery;
+    static int docritical;
+    static int counter;
+    
+    switch (apminfo->power) {
+    case POWER:
+	eprint(0, "selected ac power case");
+	if (!dopower) {
+	    dopower = 1;
+	    docharging = 0;
+	    dobattery = 0;
+	    dockapp->blink = OFF;
+	    copy_xpm_area(67, 38, 12, 7, 6, 17);
+	    copy_xpm_area(82, 48, 11, 7, 20, 17);
+	    render_text("On AC power");
+	}
+	break;
+    case CHARGING:
+	eprint(0, "selected charging case");
+	counter++;
+	if (counter == 10) {
+	    copy_xpm_area(67, 38, 12, 7, 6, 17);
+	} else if (counter == 20) {
+	    copy_xpm_area(67, 48, 12, 7, 6, 17);
+	}
+	if (counter > 20)
+	    counter = 0;
+	if (!docharging) {
+	    render_text("Battery is charging");
+	    /* get rid of battery symbol */
+	    copy_xpm_area(82, 48, 12, 7, 20, 17);
+	    /* housekeeping */
+	    dockapp->blink = OFF;
+	    docharging = 1;
+	    dopower = 0;
+	    dobattery = 0;
+	}
+	break;
+    case HIGH:
+    case LOW:
+    case CRIT:
+	eprint(0, "selected battery case");
+	if (!dobattery) {
+	    render_text("On Battery");
+	    /* display battery symbol */
+	    copy_xpm_area(82, 38, 12, 7, 20, 17);
+	    /* get rid of AC power symbol */
+	    copy_xpm_area(67, 48, 12, 7, 6, 17);
+	    dobattery = 1;
+	    dopower = 0;
+	    docharging = 0;
+	}
+	if (apminfo->power == CRIT) {
+	    dockapp->blink = BLINK;
+	    if (!docritical) {
+		render_text("Battery Critical Low");
+		docritical = 1;
+	    }
+	} else {
+	    if (docritical) {
+		render_text("On Battery");
+		docritical = 0;
+	    }
+	    dockapp->blink = OFF;
+	}
+	break;
+    }
+}
+
+static void blink_button(Mode mode)
+{
+    static int counter;
+    static int clear;
+
+    if ((mode == OFF) && !clear) {
+	eprint(0, "we are off");
+	copy_xpm_area(136, 38, 3, 3, 44, 30);
+	clear = 1;
+	return;
+    }
+    if (mode != BLINK)
+	return;
+
+    counter++;
+
+    if (counter == 5) {
+	copy_xpm_area(137, 33, 3, 3, 44, 30);
+	clear = 0;
+    } else if (counter == 10) {
+	copy_xpm_area(136, 38, 3, 3, 44, 30);
+	clear = 0;
+	/* make some noise */
+	if (noisy_critical)
+	    XBell(dockapp->display, 100);
+    }
+    if (counter > 10)
+	counter = 0;
+}
+
+int main(int argc, char **argv)
+{
+    char *display = NULL;
+    char ch;
+    int update = 0;
+
+    dockapp = calloc(1, sizeof(Dockapp));
+    apminfo = calloc(1, sizeof(APMInfo));
+
+    dockapp->blink = OFF;
+    apminfo->crit_level = 10;
+
+    /* see if whatever we want to use is supported */
+    if (power_init()) {
+	/* power_init functions handle printing error messages */
+	exit(1);
+    }
+
+    /* parse command-line options */
+    while ((ch = getopt(argc, argv, "bd:c:h")) != EOF) {
+	switch (ch) {
+	case 'b':
+	    noisy_critical = 1;
+	    break;
+	case 'c':
+	    if (optarg) {
+		apminfo->crit_level = atoi(optarg);
+		if ((apminfo->crit_level < 0) || (apminfo->crit_level > 100)) {
+		    fprintf(stderr, "Please use values between 0 and 100%%\n");
+		    apminfo->crit_level = 10;
+		    fprintf(stderr, "Using default value of 10%%\n");
+		}
+	    }
+	    break;
+	case 'd':
+	    if (optarg)
+		display = strdup(optarg);
+	    break;
+	case 'h':
+	    printf("wmacpi - help\t\t[timecop at japan.co.jp]\n\n"
+		   "-d display\t\tdisplay on remote display <display>\n"
+		   "-b\t\t\tmake noise when battery is critical low (beep)\n"
+		   "-c value\t\tset critical low alarm at <value> percent\n"
+		   "\t\t\t(default: 10 percent)\n"
+		   "-h\t\t\tdisplay this help\n");
+	    return 0;
+	    break;
+	}
+	
+    }
+
+    /* open local or command-line specified display */
+    if (open_display(display))
+	exit(1);
+
+    /* make new dockapp window */
+    new_window("apm");
+
+    /* get initial statistics */
+    acquire_info();
+
+    dockapp->dspmode = REMAIN;
+
+    /* main loop */
+    while (1) {
+	XEvent event;
+	while (XPending(dockapp->display)) {
+	    eprint(0, "X11 activity");
+	    XNextEvent(dockapp->display, &event);
+	    switch (event.type) {
+	    case Expose:
+		/* update */
+		dockapp->update = 1;
+		while (XCheckTypedEvent(dockapp->display, Expose, &event));
+		redraw_window();
+		break;
+	    case DestroyNotify:
+		XCloseDisplay(dockapp->display);
+		exit(0);
+		break;
+	    case ButtonPress:
+		/* press event */
+		if (event.xbutton.x >= 44 && event.xbutton.x <= 57 &&
+		    event.xbutton.y >= 30 && event.xbutton.y <= 43) {
+		    eprint(0, "inside button!");
+		    dockapp->pressed = 1;
+		    copy_xpm_area(118, 38, 15, 15, 44, 30);
+		}
+		break;
+	    case ButtonRelease:
+		/* release event */
+		if (event.xbutton.x >= 44 && event.xbutton.x <= 57 &&
+		    event.xbutton.y >= 30 && event.xbutton.y <= 43 &&
+		    dockapp->pressed) {
+		    /* handle button press */
+		    eprint(0, "release still inside button!");
+		    dockapp->pressed = 0;
+		    copy_xpm_area(136, 38, 15, 15, 44, 30);
+		    if ((apminfo->power != POWER) && (apminfo->power != CHARGING)) {
+			dockapp->dspmode = !dockapp->dspmode;
+			eprint(1, "Mode: %d", dockapp->dspmode);
+		    }
+		    /* end button press handler */
+		}
+		if (dockapp->pressed) {
+		    copy_xpm_area(136, 38, 15, 15, 44, 30);
+		    dockapp->pressed = 0;
+		}
+		break;
+	    }
+	}
+
+	if (update++ == 30) {
+	    eprint(1, "polling apm");
+	    acquire_info();
+	    update = 0;
+	}
+
+	if (count++ == 256) {
+	    scroll_text(6, 50, 52, dockapp->tw, 1);
+	    count = 0;
+	}
+
+	/* it's okay to test here because display_time will not draw anything
+	 * unless there is a change.  Also if we switched power states from
+	 * battery to charging/etc, we need to exit from "timer" mode */
+	if (dockapp->dspmode == REMAIN || apminfo->power == POWER || apminfo->power == CHARGING) {
+	    display_time(apminfo->rtime);
+	} else {
+	    display_time((time(NULL) - apminfo->timer) / 60);
+	}
+
+	display_state();
+	blink_button(dockapp->blink);
+	display_percentage(apminfo->percentage);
+	scroll_text(6, 50, 52, dockapp->tw, 0);
+
+	/* redraw_window, if anything changed - determined inside 
+	 * redraw_window. */
+	redraw_window();
+	usleep(100000);
+    }
+    return 0;
+}
+
+/* this handles enabling "on-battery" timer.  It only needs to happen once
+ * for each unplug event.  Functions from libapm and libacpi call this to
+ * start the timer */
+void process_plugin_timer(void)
+{
+    static int timer;
+
+    if ((apminfo->power != POWER) && (apminfo->power != CHARGING) && !timer) {
+	eprint(1, "not AC and not charging, and timer is not started");
+	eprint(1, "starting battery timer");
+	apminfo->timer = time(NULL);
+	timer = 1;
+    }
+    if (((apminfo->power == POWER) || (apminfo->power == CHARGING)) && timer) {
+	eprint(1, "disabling battery timer");
+	timer = 0;
+    }
+
+}
diff --git a/wmacpi.h b/wmacpi.h
new file mode 100644
index 0000000..e9c15a5
--- /dev/null
+++ b/wmacpi.h
@@ -0,0 +1,52 @@
+#ifndef _WMACPI_H_
+#define _WMACPI_H_
+
+#ifdef PRO
+#define eprint(level, fmt, arg...)					\
+	switch (level) {						\
+	case 0:								\
+	    break;							\
+	case 1:								\
+	    fprintf(stderr, __FUNCTION__": " fmt, ##arg);		\
+	    fprintf(stderr, "\n");					\
+	    break;							\
+	}
+#else
+#define eprint(level, fmt, arg...) \
+	do { } while (0)
+#endif
+
+typedef enum {
+    REMAIN,
+    TIMER
+} DspMode;
+
+typedef enum {
+    BLINK,
+    OFF
+} Mode;
+
+typedef enum {
+    POWER,			/* on AC, Battery charged */
+    CHARGING,			/* on AC, Charging */
+    HIGH,			/* on Battery, HIGH */
+    LOW,			/* on Battery, LOW */
+    CRIT			/* on Battery, CRIT */
+} State;
+
+typedef struct {
+    State power;		/* power state: Battery levels or AC */
+    int percentage;		/* battery percentage (-1 if no battery) */
+    int rtime;			/* remaining time */
+    int timer;			/* how long been on battery? */
+    int crit_level;		/* anything below this is critical low */
+} APMInfo;
+
+/* detect plugin events */
+void process_plugin_timer(void);
+/* check if apm/acpi is enabled, etc */
+int power_init(void);
+/* fill APMInfo with data */
+void acquire_info(void);
+
+#endif /* _WMACPI_H_ */

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



More information about the Pkg-wmaker-commits mailing list