Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Apr 2012 02:17:58 +0000 (UTC)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r234082 - in user/marcel/vtc.sys/dev/vtc: . vtout vtout/gmch vtout/vga
Message-ID:  <201204100217.q3A2HwiC097109@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marcel
Date: Tue Apr 10 02:17:58 2012
New Revision: 234082
URL: http://svn.freebsd.org/changeset/base/234082

Log:
  Add the vtc(4) driver. A driver for standard VGA is provided for
  the low-level console. A logo of beastie (4.4BSD daemon without
  the Sun) is displayed when vtc(4) is not the console and the vga
  driver attaches.

Added:
  user/marcel/vtc.sys/dev/vtc/
  user/marcel/vtc.sys/dev/vtc/vtc.h
  user/marcel/vtc.sys/dev/vtc/vtc_con.c
  user/marcel/vtc.sys/dev/vtc/vtc_con.h
  user/marcel/vtc.sys/dev/vtc/vtc_core.c
  user/marcel/vtc.sys/dev/vtc/vtc_font.c
  user/marcel/vtc.sys/dev/vtc/vtc_logo.c
  user/marcel/vtc.sys/dev/vtc/vtc_te.c
  user/marcel/vtc.sys/dev/vtc/vtc_te.h
  user/marcel/vtc.sys/dev/vtc/vtc_te_if.m
  user/marcel/vtc.sys/dev/vtc/vtc_te_vt102.c
  user/marcel/vtc.sys/dev/vtc/vtc_vtout.h
  user/marcel/vtc.sys/dev/vtc/vtc_vtout_if.m
  user/marcel/vtc.sys/dev/vtc/vtout/
  user/marcel/vtc.sys/dev/vtc/vtout/gmch/
  user/marcel/vtc.sys/dev/vtc/vtout/gmch/gmch.c
  user/marcel/vtc.sys/dev/vtc/vtout/gmch/gmch.h
  user/marcel/vtc.sys/dev/vtc/vtout/gmch/gmch_bus_pci.c
  user/marcel/vtc.sys/dev/vtc/vtout/vga/
  user/marcel/vtc.sys/dev/vtc/vtout/vga/vga.c
  user/marcel/vtc.sys/dev/vtc/vtout/vga/vga.h
  user/marcel/vtc.sys/dev/vtc/vtout/vga/vga_bus_isa.c
  user/marcel/vtc.sys/dev/vtc/vtout/vga/vga_bus_pci.c
  user/marcel/vtc.sys/dev/vtc/vtout/vga/vga_con.c
  user/marcel/vtc.sys/dev/vtc/vtout/vga/vga_cpu_ia64.c
  user/marcel/vtc.sys/dev/vtc/vtout/vga/vga_cpu_sparc64.c
  user/marcel/vtc.sys/dev/vtc/vtout/vga/vga_cpu_x86.c

Added: user/marcel/vtc.sys/dev/vtc/vtc.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/marcel/vtc.sys/dev/vtc/vtc.h	Tue Apr 10 02:17:58 2012	(r234082)
@@ -0,0 +1,55 @@
+/*-
+ * Copyright (c) 2005 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _DEV_VTC_H_
+#define	_DEV_VTC_H_
+
+#define	SI_SUB_VTC	(SI_SUB_SMP + 0xf00000)
+
+/* BitBlt operations. */
+#define	BITBLT_CTOFB		0x0001
+#define	BITBLT_H1TOFB		0x0002
+#define	BITBLT_H4TOFB		0x0003
+#define	BITBLT_H8TOFB		0x0004
+#define	BITBLT_H16TOFB		0x0005
+#define	BITBLT_H24TOFB		0x0006
+#define	BITBLT_H32TOFB		0x0007
+#define	BITBLT_FBTOFB		0x0008
+
+/* Beastie logos. */
+extern int vtc_logo4_width;
+extern int vtc_logo4_height;
+extern unsigned char vtc_logo4_image[];
+
+/* Built-in fonts. */
+extern unsigned char vtc_font_8x16[];
+
+/* Miscellaneous. */
+extern char vtc_device_name[];
+
+#endif /* !_DEV_VTC_H_ */

Added: user/marcel/vtc.sys/dev/vtc/vtc_con.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/marcel/vtc.sys/dev/vtc/vtc_con.c	Tue Apr 10 02:17:58 2012	(r234082)
@@ -0,0 +1,181 @@
+/*-
+ * Copyright (c) 2005 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <machine/bus.h>
+#include <sys/bus.h>
+#include <sys/cons.h>
+#include <sys/kdb.h>
+#include <sys/rman.h>
+#include <sys/tty.h>
+
+#include <dev/vtc/vtc.h>
+#include <dev/vtc/vtc_con.h>
+
+static cn_getc_t vtc_cngetc;
+static cn_grab_t vtc_cngrab;
+static cn_init_t vtc_cninit;
+static cn_probe_t vtc_cnprobe;
+static cn_putc_t vtc_cnputc;
+static cn_term_t vtc_cnterm;
+static cn_ungrab_t vtc_cnungrab;
+
+static int vtc_cncol = 0;
+static int vtc_cnrow = 0;
+static int vtc_cnmute = 0;
+
+CONSOLE_DRIVER(vtc);
+
+static void
+vtc_cnprobe(struct consdev *cp)
+{
+	struct vtc_conout *cur_vc, *vc, **iter;
+	int cur_pri, pri;
+
+	cur_pri = -1;
+	cur_vc = NULL;
+	SET_FOREACH(iter, vtc_conout_set) {
+		vc = *iter;
+		pri = (vc->vtc_con_probe != NULL) ? vc->vtc_con_probe(vc) : -1;
+		if (pri > cur_pri) {
+			cur_pri = pri;
+			cur_vc = vc;
+		}
+	}
+	strlcpy(cp->cn_name, vtc_device_name, sizeof(cp->cn_name));
+	cp->cn_arg = cur_vc;
+	cp->cn_pri = (cur_vc != NULL) ? CN_INTERNAL : CN_DEAD;
+}
+
+static void
+vtc_cninit(struct consdev *cp)
+{
+	struct vtc_conout *vc = cp->cn_arg;
+
+	vc->vtc_consdev = cp;
+	vc->vtc_con_init(vc);
+}
+
+static void
+vtc_cnterm(struct consdev *cp)
+{
+}
+
+static void
+vtc_cnputc(struct consdev *cp, int c)
+{
+	struct vtc_conout *vc = cp->cn_arg;
+	int ch, width;
+	u_char *glyph;
+
+	/* Sanity check. */
+	if (c <= 0 || c >= 0x7f)
+		return;
+
+	/* Allow low-level console output to be surpressed. */
+	if (vtc_cnmute && !kdb_active)
+		return;
+
+	width = vc->vtc_con_width;
+	switch (c) {
+	case 8:		/* BS */
+		if (vtc_cncol > 0)
+			vtc_cncol--;
+		ch = ' ';
+		break;
+	case 9:		/* HT */
+		vtc_cncol = (vtc_cncol + 7) & 7;
+		if (vtc_cncol >= 80)
+			vtc_cncol = 79;
+		ch = 0;
+		break;
+	case 10:	/* LF */
+	case 11:	/* VT (processed as LF) */
+	case 12:	/* FF (processed as LF) */
+		vtc_cncol = 0;
+		vtc_cnrow++;
+		ch = 0;
+		break;
+	case 13:	/* CR */
+		vtc_cncol = 0;
+		ch = 0;
+		break;
+	default:
+		ch = (c >= ' ') ? c : 0;
+		break;
+	}
+
+	if (ch != 0) {
+		glyph = vtc_font_8x16 + ((ch - ' ') * 16);
+		vc->vtc_con_bitblt(vc, BITBLT_H1TOFB, (uintptr_t)glyph,
+		    width * vtc_cnrow * 16 + vtc_cncol * 8, 8, 16, 0, 7);
+		if (c != 8)
+			vtc_cncol++;
+	}
+
+	if (vtc_cncol >= 80) {
+		vtc_cncol = 0;
+		vtc_cnrow++;
+	}
+	if (vtc_cnrow >= 30) {
+		vc->vtc_con_bitblt(vc, BITBLT_FBTOFB, width * 16, 0, width,
+		    29 * 16);
+		vc->vtc_con_bitblt(vc, BITBLT_CTOFB, 0, width * 29 * 16, width,
+		    16);
+		vtc_cnrow = 29;
+	}
+}
+
+static int
+vtc_cngetc(struct consdev *cp)
+{
+
+	return (-1);
+}
+
+static void
+vtc_cngrab(struct consdev *cp)
+{
+}
+
+static void
+vtc_cnungrab(struct consdev *cp)
+{
+}
+
+static void
+vtc_cnfinalize(void *data __unused)
+{
+
+	/* Shut the low-level console up. */
+	vtc_cnmute = 1;
+}
+SYSINIT(cnfinalize, SI_SUB_VTC, SI_ORDER_ANY, vtc_cnfinalize, NULL);

Added: user/marcel/vtc.sys/dev/vtc/vtc_con.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/marcel/vtc.sys/dev/vtc/vtc_con.h	Tue Apr 10 02:17:58 2012	(r234082)
@@ -0,0 +1,63 @@
+/*-
+ * Copyright (c) 2005 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _DEV_VTC_CON_H_
+#define	_DEV_VTC_CON_H_
+
+struct vtc_conout;
+
+typedef void vtc_con_bitblt_f(struct vtc_conout *, int, uintptr_t, uintptr_t,
+    int, int, ...);
+typedef void vtc_con_init_f(struct vtc_conout *);
+typedef int  vtc_con_probe_f(struct vtc_conout *);
+
+struct vtc_conout {
+	struct consdev	*vtc_consdev;
+	device_t	vtc_busdev;
+	const char	*vtc_con_name;
+	vtc_con_probe_f	*vtc_con_probe;
+	vtc_con_init_f	*vtc_con_init;
+	vtc_con_bitblt_f *vtc_con_bitblt;
+	void		*vtc_con_cookie;
+	int		vtc_con_width;
+	int		vtc_con_height;
+	int		vtc_con_depth;
+};
+
+#define	VTC_CONOUT(name, probe, init, bitblt)			\
+	static struct vtc_conout name##_vtc_conout = {		\
+		.vtc_con_name = #name,				\
+		.vtc_con_probe = probe,				\
+		.vtc_con_init = init,				\
+		.vtc_con_bitblt = bitblt,			\
+	};							\
+	DATA_SET(vtc_conout_set, name##_vtc_conout)
+
+SET_DECLARE(vtc_conout_set, struct vtc_conout);
+
+#endif /* !_DEV_VTC_CON_H_ */

Added: user/marcel/vtc.sys/dev/vtc/vtc_core.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/marcel/vtc.sys/dev/vtc/vtc_core.c	Tue Apr 10 02:17:58 2012	(r234082)
@@ -0,0 +1,303 @@
+/*-
+ * Copyright (c) 2003-2005 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/conf.h>
+#include <sys/cons.h>
+#include <sys/kernel.h>
+#include <sys/kobj.h>
+#include <sys/malloc.h>
+#include <sys/module.h>
+#include <sys/tty.h>
+
+#include <dev/vtc/vtc.h>
+#include <dev/vtc/vtc_con.h>
+#include <dev/vtc/vtc_te.h>
+#include <dev/vtc/vtc_vtout.h>
+
+#include "vtc_te_if.h"
+
+char vtc_device_name[] = "vtc";
+
+TAILQ_HEAD(, vtc_te_softc) vtc_te_devs =
+    TAILQ_HEAD_INITIALIZER(vtc_te_devs);
+TAILQ_HEAD(, vtc_vtout_softc) vtc_vtout_devs =
+    TAILQ_HEAD_INITIALIZER(vtc_vtout_devs);
+
+MALLOC_DEFINE(M_VTC, "VTC", "VTC driver");
+
+extern struct vtc_te_class vt102_class;
+
+static int
+vtc_tty_open(struct tty *tp)
+{
+	struct vtc_te_softc *te;
+
+	te = tty_softc(tp);
+	if (te == NULL)
+		return (ENXIO);
+
+	/* XXX notify the TE that we're opened? */
+	return (0);
+}
+
+static void
+vtc_tty_close(struct tty *tp)
+{
+	struct vtc_te_softc *te;
+
+	te = tty_softc(tp);
+	if (te == NULL)
+		return;
+
+	wakeup(te);
+}
+
+static void
+vtc_tty_outwakeup(struct tty *tp)
+{
+	char txbuf[4];
+	struct vtc_te_softc *te;
+	__wchar_t utf32;
+	size_t nchars, bufidx;
+	int c, utfbytes;
+
+	te = tty_softc(tp);
+	if (te == NULL)
+		return;
+
+	bufidx = 0;
+	nchars = ttydisc_getc(tp, txbuf, sizeof(txbuf));
+	utf32 = te->te_utf32;
+	utfbytes = te->te_utfbytes;
+	while (bufidx < nchars) {
+		c = txbuf[bufidx++];
+		/*
+		 * Conditionalize on the two major character types:
+		 * initial and followup characters.
+		 */
+		if ((c & 0xc0) != 0x80) {
+			/* Initial characters. */
+			if (utfbytes != 0)
+				VTC_TE_WRITE(te, -1);
+			if ((c & 0xf8) == 0xf0) {
+				utf32 = c & 0x07;
+				utfbytes = 3;
+			} else if ((c & 0xf0) == 0xe0) {
+				utf32 = c & 0x0f;
+				utfbytes = 2;
+			} else if ((c & 0xe0) == 0xc0) {
+				utf32 = c & 0x1f;
+				utfbytes = 1;
+			} else {
+				KASSERT((c & 0x80) == 0x00, ("oops"));
+				utf32 = c & 0x7f;
+				utfbytes = 0;
+			}
+		} else {
+			/* Followup characters. */
+			KASSERT((c & 0xc0) == 0x80, ("oops"));
+			if (utfbytes > 0) {
+				utf32 = (utf32 << 6) + (c & 0x3f);
+				utfbytes--;
+			}
+			else if (utfbytes == 0)
+				utfbytes = -1;
+		}
+		if (utfbytes == 0)
+			VTC_TE_WRITE(te, utf32);
+	}
+	te->te_utf32 = utf32;
+	te->te_utfbytes = utfbytes;
+}
+
+static void
+vtc_tty_inwakeup(struct tty *tp)
+{
+	struct vtc_te_softc *te;
+
+	te = tty_softc(tp);
+	if (te == NULL)
+		return;
+}
+
+static int
+vtc_tty_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
+{
+	struct vtc_te_softc *te;
+
+	te = tty_softc(tp);
+	if (te == NULL)
+		return (ENXIO);
+
+	return (ENOTTY);
+}
+
+static int
+vtc_tty_param(struct tty *tp, struct termios *t)
+{
+	struct vtc_te_softc *te;
+
+	te = tty_softc(tp);
+	if (te == NULL)
+		return (ENODEV);
+
+	return (0);
+}
+
+static int
+vtc_tty_modem(struct tty *tp, int biton, int bitoff)
+{
+
+	return (0);
+}
+
+static void
+vtc_tty_free(void *arg)
+{
+}
+
+static struct ttydevsw vtc_tty_class = {
+	.tsw_flags	= TF_INITLOCK|TF_CALLOUT,
+	.tsw_open	= vtc_tty_open,
+	.tsw_close	= vtc_tty_close,
+	.tsw_outwakeup	= vtc_tty_outwakeup,
+	.tsw_inwakeup	= vtc_tty_inwakeup,
+	.tsw_ioctl	= vtc_tty_ioctl,
+	.tsw_param	= vtc_tty_param,
+	.tsw_modem	= vtc_tty_modem,
+	.tsw_free	= vtc_tty_free,
+};
+
+int
+vtc_vtout_attach(device_t dev, vtout_init_f init, vtout_bitblt_f bitblt,
+    int width, int height)
+{
+	struct vtc_vtout_softc *vo;
+
+	vo = malloc(sizeof(*vo), M_VTC, M_WAITOK|M_ZERO);
+	TAILQ_INSERT_TAIL(&vtc_vtout_devs, vo, vo_alldevs);
+	vo->vo_dev = dev;
+	vo->vo_init = init;
+	vo->vo_bitblt = bitblt;
+	vo->vo_width = width;
+	vo->vo_height = height;
+	return (0);
+}
+
+int
+vtc_vtout_console(device_t dev)
+{
+	struct vtc_conout *vc, **iter;
+
+	SET_FOREACH(iter, vtc_conout_set) {
+		vc = *iter;
+		if (vc->vtc_busdev == dev)
+			return (1);
+	}
+	return (0);
+}
+
+/*
+ * Create the initial VT.
+ */
+static void
+vtc_initial(void *data __unused)
+{
+	struct tty *tp;
+	struct vtc_conout *vc, **iter;
+	struct vtc_te_softc *te;
+
+	printf("%s: create initial VT\n", vtc_device_name);
+
+	if (TAILQ_EMPTY(&vtc_vtout_devs))
+		return;
+
+	te = malloc(vt102_class.size, M_VTC, M_WAITOK|M_ZERO);
+	kobj_init((kobj_t)te, (kobj_class_t)&vt102_class);
+	TAILQ_INSERT_TAIL(&vtc_te_devs, te, te_alldevs);
+	TAILQ_INIT(&te->te_vodevs);
+
+	VTC_TE_RESET(te);
+
+	te->te_tty = tp = tty_alloc(&vtc_tty_class, te);
+	tty_makedev(tp, NULL, "V%r", 0);
+	SET_FOREACH(iter, vtc_conout_set) {
+		vc = *iter;
+		if (vc->vtc_consdev != NULL) {
+			strcpy(vc->vtc_consdev->cn_name, "ttyV0");
+			tty_init_console(tp, 0);
+		}
+	}
+}
+SYSINIT(vtc_initial, SI_SUB_INT_CONFIG_HOOKS, SI_ORDER_ANY, vtc_initial, NULL);
+
+/*
+ * Preempt the low-level console driver with the accelerated driver.
+ */
+static void
+vtc_finalize(void *data __unused)
+{
+	struct vtc_te_softc *te;
+	struct vtc_vtout_softc *vo;
+
+	printf("%s: finalize initial VT\n", vtc_device_name);
+
+	te = TAILQ_FIRST(&vtc_te_devs);
+	if (te == NULL)
+		return;
+
+	TAILQ_FOREACH(vo, &vtc_vtout_devs, vo_alldevs) {
+		if (vo->vo_init == NULL || (*vo->vo_init)(vo->vo_dev) == 0)
+			TAILQ_INSERT_TAIL(&te->te_vodevs, vo, vo_tedevs);
+	}
+}
+SYSINIT(vtc_finalize, SI_SUB_VTC, SI_ORDER_FIRST, vtc_finalize, NULL);
+
+static int
+vtc_modevent(module_t mod, int type, void *data)
+{
+
+	switch (type) {
+	case MOD_LOAD:
+		printf("%s: <console, video terminal>\n", vtc_device_name);
+		return (0);
+
+	case MOD_UNLOAD:
+		return (0);
+
+	case MOD_SHUTDOWN:
+		return (0);
+	}
+
+	return (EOPNOTSUPP);
+}
+DEV_MODULE(vtc, vtc_modevent, NULL);

Added: user/marcel/vtc.sys/dev/vtc/vtc_font.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/marcel/vtc.sys/dev/vtc/vtc_font.c	Tue Apr 10 02:17:58 2012	(r234082)
@@ -0,0 +1,130 @@
+/*-
+ * Copyright (c) 2005 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+
+#include <dev/vtc/vtc.h>
+
+unsigned char vtc_font_8x16[95 * 16] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x18,0x3c,0x3c,0x3c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
+0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x6c,0x6c,0xfe,0x6c,0x6c,0x6c,0xfe,0x6c,0x6c,0x00,0x00,0x00,0x00,
+0x18,0x18,0x7c,0xc6,0xc2,0xc0,0x7c,0x06,0x06,0x86,0xc6,0x7c,0x18,0x18,0x00,0x00,
+0x00,0x00,0x00,0x00,0xc2,0xc6,0x0c,0x18,0x30,0x60,0xc6,0x86,0x00,0x00,0x00,0x00,
+0x00,0x00,0x38,0x6c,0x6c,0x38,0x76,0xdc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x0c,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x30,0x18,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x18,0x30,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x66,0x3c,0xff,0x3c,0x66,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x02,0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,0x00,0x00,0x00,0x00,
+0x00,0x00,0x38,0x6c,0xc6,0xc6,0xd6,0xd6,0xc6,0xc6,0x6c,0x38,0x00,0x00,0x00,0x00,
+0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7e,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0x06,0x0c,0x18,0x30,0x60,0xc0,0xc6,0xfe,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0x06,0x06,0x3c,0x06,0x06,0x06,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x0c,0x1c,0x3c,0x6c,0xcc,0xfe,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00,
+0x00,0x00,0xfe,0xc0,0xc0,0xc0,0xfc,0x06,0x06,0x06,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x38,0x60,0xc0,0xc0,0xfc,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xfe,0xc6,0x06,0x06,0x0c,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7c,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7e,0x06,0x06,0x06,0x0c,0x78,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x06,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x06,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x60,0x30,0x18,0x0c,0x06,0x0c,0x18,0x30,0x60,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0xc6,0x0c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x7c,0xc6,0xc6,0xde,0xde,0xde,0xdc,0xc0,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
+0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x66,0x66,0x66,0x66,0xfc,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xc0,0xc0,0xc2,0x66,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xf8,0x6c,0x66,0x66,0x66,0x66,0x66,0x66,0x6c,0xf8,0x00,0x00,0x00,0x00,
+0x00,0x00,0xfe,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xfe,0x00,0x00,0x00,0x00,
+0x00,0x00,0xfe,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xde,0xc6,0xc6,0x66,0x3a,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3c,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00,0x00,
+0x00,0x00,0xe6,0x66,0x66,0x6c,0x78,0x78,0x6c,0x66,0x66,0xe6,0x00,0x00,0x00,0x00,
+0x00,0x00,0xf0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xfe,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc6,0xee,0xfe,0xfe,0xd6,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc6,0xe6,0xf6,0xfe,0xde,0xce,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xd6,0xde,0x7c,0x0c,0x0e,0x00,0x00,
+0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x6c,0x66,0x66,0x66,0xe6,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0xc6,0x60,0x38,0x0c,0x06,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7e,0x7e,0x5a,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x6c,0x38,0x10,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xd6,0xd6,0xd6,0xfe,0xee,0x6c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc6,0xc6,0x6c,0x7c,0x38,0x38,0x7c,0x6c,0xc6,0xc6,0x00,0x00,0x00,0x00,
+0x00,0x00,0x66,0x66,0x66,0x66,0x3c,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xfe,0xc6,0x86,0x0c,0x18,0x30,0x60,0xc2,0xc6,0xfe,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3c,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x80,0xc0,0xe0,0x70,0x38,0x1c,0x0e,0x06,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3c,0x00,0x00,0x00,0x00,
+0x10,0x38,0x6c,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
+0x00,0x30,0x18,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x00,0xe0,0x60,0x60,0x78,0x6c,0x66,0x66,0x66,0x66,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc0,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x1c,0x0c,0x0c,0x3c,0x6c,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x1c,0x36,0x32,0x30,0x78,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x76,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0xcc,0x78,0x00,
+0x00,0x00,0xe0,0x60,0x60,0x6c,0x76,0x66,0x66,0x66,0x66,0xe6,0x00,0x00,0x00,0x00,
+0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x06,0x06,0x00,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c,0x00,
+0x00,0x00,0xe0,0x60,0x60,0x66,0x6c,0x78,0x78,0x6c,0x66,0xe6,0x00,0x00,0x00,0x00,
+0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xec,0xfe,0xd6,0xd6,0xd6,0xd6,0xc6,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x7c,0x60,0x60,0xf0,0x00,
+0x00,0x00,0x00,0x00,0x00,0x76,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x1e,0x00,
+0x00,0x00,0x00,0x00,0x00,0xdc,0x76,0x66,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0x60,0x38,0x0c,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x10,0x30,0x30,0xfc,0x30,0x30,0x30,0x30,0x36,0x1c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0x6c,0x38,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0xd6,0xd6,0xd6,0xfe,0x6c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xc6,0x6c,0x38,0x38,0x38,0x6c,0xc6,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7e,0x06,0x0c,0xf8,0x00,
+0x00,0x00,0x00,0x00,0x00,0xfe,0xcc,0x18,0x30,0x60,0xc6,0xfe,0x00,0x00,0x00,0x00,
+0x00,0x00,0x0e,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0e,0x00,0x00,0x00,0x00,
+0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
+0x00,0x00,0x70,0x18,0x18,0x18,0x0e,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00,
+0x00,0x76,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};

Added: user/marcel/vtc.sys/dev/vtc/vtc_logo.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/marcel/vtc.sys/dev/vtc/vtc_logo.c	Tue Apr 10 02:17:58 2012	(r234082)
@@ -0,0 +1,746 @@
+/*-
+ * Copyright (c) 2005 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+
+#include <dev/vtc/vtc.h>
+
+#define	__	0
+#define	BR	4
+#define	BW	15
+#define	RB	64
+#define	RR	68
+#define	RW	79
+#define	WB	240
+#define	WR	244
+#define	WW	255
+
+int vtc_logo4_width = 232;
+int vtc_logo4_height = 140;
+unsigned char vtc_logo4_image[] = {
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+RR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,BR,BR,
+__,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,RB,RR,
+RR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,RB,BR,BR,BR,RR,RR,
+RR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,BR,RR,RR,RR,RR,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,RB,RR,BR,RR,RR,RR,RB,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,RR,BR,RR,RR,RR,BR,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,BR,RR,RR,RR,RB,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,RR,RR,RR,RR,RR,RB,RB,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,RB,RR,RR,RR,RB,RR,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,BR,BR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,RB,RR,RR,RR,RR,BR,RB,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,BR,RB,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,RR,RR,RR,RR,__,RB,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,RR,RR,RR,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,RR,RR,RR,RR,RB,RB,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,BR,RB,RR,RR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,BR,RR,RR,RR,RR,RB,RB,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,BR,BR,RR,RB,BR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,RR,RR,RR,RR,RR,RR,BR,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,RR,RR,RR,RR,RR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,RB,RR,RR,RR,RR,RB,RB,RB,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,RR,RR,RR,RB,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,RR,RR,RR,RR,RR,BR,BR,BR,__,__,__,__,
+__,__,__,__,__,__,__,__,BR,RR,RR,RR,RR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,BR,RR,RR,RR,RR,RB,RB,RB,RR,RR,RR,RR,
+__,__,__,__,__,__,__,__,BR,RR,RR,RR,RR,BR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,RR,RR,RR,RR,RR,RR,BR,BR,RR,RR,RR,RR,
+BR,BR,__,__,__,__,RB,RR,RR,RR,RR,RR,RB,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,
+RR,RR,__,RB,BR,RR,BR,RR,RR,RR,RR,RR,BR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,RR,RR,RR,BR,RR,RR,RR,RR,RR,RR,RR,RR,
+RR,RR,RR,RB,RR,RR,RR,RR,RR,RR,RR,__,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,RR,RR,RR,BR,RR,RR,RR,RR,RR,RR,RR,
+RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,BR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,RR,RR,RR,RB,RR,RR,RR,RR,RR,RR,RB,RR,
+RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RB,RB,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,
+RR,RR,RR,RR,RR,RR,RR,RR,RR,RB,BR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,
+RR,RR,RR,RR,RR,RR,RR,RR,RR,RB,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,
+BR,RR,RR,RR,RR,RR,RR,RR,BR,BR,BR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,
+RB,RR,RR,RR,RR,RR,RR,RB,RB,RB,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,RB,BR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,
+RB,RR,RR,RR,RR,RR,RR,RR,__,BR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,RB,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,RR,
+BR,RR,RR,RR,RR,RR,RB,RB,BR,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,BR,BR,RR,WW,WW,RR,RR,RB,RR,WR,RB,RR,RR,RR,RR,
+RB,RR,RR,RR,RR,RB,RB,BR,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,RR,RB,RW,WW,WW,RB,RR,RW,WW,WW,WR,BR,RR,RR,RR,
+BR,RR,RR,RR,RB,BR,BR,RB,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,BR,RR,RR,WW,WW,WW,WR,BW,WW,WW,WW,WW,RB,RR,RR,RR,
+RB,RR,RR,RB,BR,__,RB,BR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,RR,RW,WW,WW,WR,BR,WW,WW,WW,WW,WW,WR,RR,RR,RR,
+BR,RR,RR,RB,RB,RB,RB,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,BR,RR,WW,WW,WR,BR,WW,WW,WW,WW,WW,WW,WR,BR,RR,RR,
+RR,RR,RR,RR,RB,RB,BR,BR,RR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,RW,WW,WW,WB,RR,WW,WW,WW,WW,WW,WW,WW,RR,RR,RR,
+RR,RR,RR,RR,RR,BR,RB,RB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,BR,WW,WW,WW,RB,RW,WW,WW,WW,WW,WW,WW,WW,BR,RR,RR,
+RR,RR,RR,RR,RR,RB,BR,BR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,BR,WW,WW,WR,BW,WW,WW,WW,WW,WW,WW,WW,WR,RR,RR,RR,
+RR,RR,RR,RR,RB,RB,RB,RB,RR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,BR,WW,WW,WB,RW,WW,WW,WW,WW,WW,WW,WW,WR,RR,RR,RR,
+RR,RR,RR,RR,RR,BR,BR,BR,BR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,RW,WW,WW,BW,WW,WW,WW,WW,WW,WW,WW,WW,WR,RR,RR,RR,
+RR,RR,RR,RR,RB,RB,RB,RB,RR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,BR,WW,WW,WW,RW,WW,WW,WW,WW,WW,WW,WW,WW,WR,BR,RR,RR,
+RR,RR,RR,RR,BR,BR,BR,__,BR,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,
+__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204100217.q3A2HwiC097109>