[Glibc-bsd-commits] r5450 - in trunk/kfreebsd-10/debian: . arch/amd64 arch/i386 patches
rmh at alioth.debian.org
rmh at alioth.debian.org
Mon Mar 10 12:32:04 UTC 2014
Author: rmh
Date: 2014-03-10 12:32:04 +0000 (Mon, 10 Mar 2014)
New Revision: 5450
Added:
trunk/kfreebsd-10/debian/patches/newcons.diff
Modified:
trunk/kfreebsd-10/debian/arch/amd64/amd64.config
trunk/kfreebsd-10/debian/arch/i386/486.config
trunk/kfreebsd-10/debian/arch/i386/686.config
trunk/kfreebsd-10/debian/changelog
trunk/kfreebsd-10/debian/patches/series
Log:
Merge Newcons / VT from stable/10 branch.
Modified: trunk/kfreebsd-10/debian/arch/amd64/amd64.config
===================================================================
--- trunk/kfreebsd-10/debian/arch/amd64/amd64.config 2014-03-04 05:12:17 UTC (rev 5449)
+++ trunk/kfreebsd-10/debian/arch/amd64/amd64.config 2014-03-10 12:32:04 UTC (rev 5450)
@@ -7,15 +7,16 @@
options COMPAT_LINUX32
-# UTF-8 console support
-options VESA
-options SC_PIXEL_MODE # add support for the raster text mode
-options TEKEN_UTF8 # UTF-8 output handling
-
# Needed for D-I, see #596577
options NKPT=240
include GENERIC
+# Switch default console to Newcons (see https://wiki.freebsd.org/Newcons)
+nodevice vga
+nodevice sc
+device vt
+device vt_vga
+
# Options used by all Debian kernels
include DEBIAN
Modified: trunk/kfreebsd-10/debian/arch/i386/486.config
===================================================================
--- trunk/kfreebsd-10/debian/arch/i386/486.config 2014-03-04 05:12:17 UTC (rev 5449)
+++ trunk/kfreebsd-10/debian/arch/i386/486.config 2014-03-10 12:32:04 UTC (rev 5450)
@@ -10,17 +10,17 @@
options COMPAT_LINUX
-# UTF-8 console support
-options VESA
-options SC_PIXEL_MODE # add support for the raster text mode
-options TEKEN_UTF8 # UTF-8 output handling
-
# Xbox support
options XBOX
-device xboxfb
-device fb
include GENERIC
+# Switch default console to Newcons (see https://wiki.freebsd.org/Newcons)
+nodevice vga
+nodevice sc
+device vt
+device vt_vga
+device vt_xboxfb
+
# Options used by all Debian kernels
include DEBIAN
Modified: trunk/kfreebsd-10/debian/arch/i386/686.config
===================================================================
--- trunk/kfreebsd-10/debian/arch/i386/686.config 2014-03-04 05:12:17 UTC (rev 5449)
+++ trunk/kfreebsd-10/debian/arch/i386/686.config 2014-03-10 12:32:04 UTC (rev 5450)
@@ -8,17 +8,17 @@
options COMPAT_LINUX
-# UTF-8 console support
-options VESA
-options SC_PIXEL_MODE # add support for the raster text mode
-options TEKEN_UTF8 # UTF-8 output handling
-
# Xbox support
options XBOX
-device xboxfb
-device fb
include GENERIC
+# Switch default console to Newcons (see https://wiki.freebsd.org/Newcons)
+nodevice vga
+nodevice sc
+device vt
+device vt_vga
+device vt_xboxfb
+
# Options used by all Debian kernels
include DEBIAN
Modified: trunk/kfreebsd-10/debian/changelog
===================================================================
--- trunk/kfreebsd-10/debian/changelog 2014-03-04 05:12:17 UTC (rev 5449)
+++ trunk/kfreebsd-10/debian/changelog 2014-03-10 12:32:04 UTC (rev 5450)
@@ -5,6 +5,7 @@
[ Robert Millan ]
* B-D on freebsd-buildutils with reliable kldxref.
+ * Merge Newcons / VT from stable/10 branch.
-- Steven Chamberlain <steven at pyro.eu.org> Sat, 15 Feb 2014 01:07:03 +0000
Added: trunk/kfreebsd-10/debian/patches/newcons.diff
===================================================================
--- trunk/kfreebsd-10/debian/patches/newcons.diff (rev 0)
+++ trunk/kfreebsd-10/debian/patches/newcons.diff 2014-03-10 12:32:04 UTC (rev 5450)
@@ -0,0 +1,11406 @@
+
+------------------------------------------------------------------------
+r262861 | jhb | 2014-03-06 19:30:56 +0100 (dj, 06 mar 2014) | 8 lines
+
+MFC 259016,259019,259049,259071,259102,259110,259129,259130,259178,259179,
+259203,259221,259261,259532,259615,259650,259651,259667,259680,259727,
+259761,259772,259776,259777,259830,259882,259915,260160,260449,260450,
+260688,260888,260953,261269,261547,261551,261552,261553,261585:
+Merge the vt(4) driver (newcons) to stable/10.
+
+Approved by: ray
+
+--- /dev/null
++++ b/sys/amd64/conf/VT
+@@ -0,0 +1,14 @@
++# VT -- kernel config using the vt(9) system console instead of legacy syscons
++#
++# For more information see https://wiki.freebsd.org/Newcons
++#
++# $FreeBSD$
++
++include GENERIC
++ident VT
++
++nodevice sc
++nodevice vga
++
++device vt
++device vt_vga
+--- a/sys/conf/files
++++ b/sys/conf/files
+@@ -87,7 +87,7 @@
+ compile-with "${AWK} -f $S/tools/pccarddevs2h.awk $S/dev/pccard/pccarddevs" \
+ no-obj no-implicit-rule before-depend \
+ clean "pccarddevs.h"
+-teken_state.h optional sc \
++teken_state.h optional sc | vt \
+ dependency "$S/teken/gensequences $S/teken/sequences" \
+ compile-with "${AWK} -f $S/teken/gensequences $S/teken/sequences > teken_state.h" \
+ no-obj no-implicit-rule before-depend \
+@@ -1398,7 +1398,9 @@
+ dev/ex/if_ex_pccard.c optional ex pccard
+ dev/exca/exca.c optional cbb
+ dev/fatm/if_fatm.c optional fatm pci
+-dev/fb/splash.c optional splash
++dev/fb/fbd.c optional fbd | vt
++dev/fb/fb_if.m standard
++dev/fb/splash.c optional sc splash
+ dev/fdt/fdt_common.c optional fdt
+ dev/fdt/fdt_ic_if.m optional fdt
+ dev/fdt/fdt_pci.c optional fdt pci
+@@ -2457,6 +2459,17 @@
+
+ dev/vkbd/vkbd.c optional vkbd
+ dev/vr/if_vr.c optional vr pci
++dev/vt/colors/vt_termcolors.c optional vt
++dev/vt/font/vt_font_default.c optional vt
++dev/vt/font/vt_mouse_cursor.c optional vt
++dev/vt/hw/fb/vt_fb.c optional vt
++dev/vt/hw/vga/vga.c optional vt vt_vga
++dev/vt/logo/logo_freebsd.c optional vt splash
++dev/vt/vt_buf.c optional vt
++dev/vt/vt_consolectl.c optional vt
++dev/vt/vt_core.c optional vt
++dev/vt/vt_font.c optional vt
++dev/vt/vt_sysmouse.c optional vt
+ dev/vte/if_vte.c optional vte pci
+ dev/vx/if_vx.c optional vx
+ dev/vx/if_vx_eisa.c optional vx eisa
+@@ -2893,6 +2906,7 @@
+ kern/subr_smp.c standard
+ kern/subr_stack.c optional ddb | stack | ktr
+ kern/subr_taskqueue.c standard
++kern/subr_terminal.c optional vt
+ kern/subr_trap.c standard
+ kern/subr_turnstile.c standard
+ kern/subr_uio.c standard
+@@ -3793,7 +3807,7 @@
+ security/mac_seeotheruids/mac_seeotheruids.c optional mac_seeotheruids
+ security/mac_stub/mac_stub.c optional mac_stub
+ security/mac_test/mac_test.c optional mac_test
+-teken/teken.c optional sc
++teken/teken.c optional sc | vt
+ ufs/ffs/ffs_alloc.c optional ffs
+ ufs/ffs/ffs_balloc.c optional ffs
+ ufs/ffs/ffs_inode.c optional ffs
+--- a/sys/conf/files.amd64
++++ b/sys/conf/files.amd64
+@@ -241,7 +241,7 @@
+ dev/hyperv/vmbus/hv_hv.c optional hyperv
+ dev/hyperv/vmbus/hv_ring_buffer.c optional hyperv
+ dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c optional hyperv
+-dev/kbd/kbd.c optional atkbd | sc | ukbd
++dev/kbd/kbd.c optional atkbd | sc | ukbd | vt
+ dev/lindev/full.c optional lindev
+ dev/lindev/lindev.c optional lindev
+ dev/nfe/if_nfe.c optional nfe pci
+--- a/sys/conf/files.arm
++++ b/sys/conf/files.arm
+@@ -61,7 +61,7 @@
+ crypto/des/des_enc.c optional crypto | ipsec | netsmb
+ dev/fb/fb.c optional sc
+ dev/hwpmc/hwpmc_arm.c optional hwpmc
+-dev/kbd/kbd.c optional sc
++dev/kbd/kbd.c optional sc | vt
+ dev/syscons/scgfbrndr.c optional sc
+ dev/syscons/scterm-teken.c optional sc
+ dev/syscons/scvtb.c optional sc
+--- a/sys/conf/files.i386
++++ b/sys/conf/files.i386
+@@ -249,7 +249,7 @@
+ dev/ipmi/ipmi_ssif.c optional ipmi smbus
+ dev/ipmi/ipmi_pci.c optional ipmi pci
+ dev/ipmi/ipmi_linux.c optional ipmi compat_linux
+-dev/kbd/kbd.c optional atkbd | sc | ukbd
++dev/kbd/kbd.c optional atkbd | sc | ukbd | vt
+ dev/le/if_le_isa.c optional le isa
+ dev/lindev/full.c optional lindev
+ dev/lindev/lindev.c optional lindev
+@@ -293,6 +293,7 @@
+ dev/vmware/vmxnet3/if_vmx.c optional vmx
+ dev/acpica/acpi_if.m standard
+ dev/acpi_support/acpi_wmi_if.m standard
++dev/vt/hw/xboxfb/xboxfb.c optional vt_xboxfb
+ dev/wbwd/wbwd.c optional wbwd
+ dev/wpi/if_wpi.c optional wpi
+ dev/isci/isci.c optional isci
+--- a/sys/conf/files.powerpc
++++ b/sys/conf/files.powerpc
+@@ -35,7 +35,7 @@
+ dev/iicbus/ds1631.c optional ds1631 powermac
+ dev/iicbus/ds1775.c optional ds1775 powermac
+ dev/iicbus/max6690.c optional max6690 powermac
+-dev/kbd/kbd.c optional sc
++dev/kbd/kbd.c optional sc | vt
+ dev/nand/nfc_fsl.c optional nand mpc85xx
+ # ofw can be either aim or fdt: fdt case handled in files. aim only powerpc specific.
+ dev/ofw/openfirm.c optional aim
+@@ -65,6 +65,7 @@
+ dev/uart/uart_cpu_fdt.c optional uart fdt
+ dev/uart/uart_cpu_powerpc.c optional uart aim
+ dev/usb/controller/ehci_fsl.c optional ehci mpc85xx
++dev/vt/hw/ofwfb/ofwfb.c optional vt aim
+ kern/kern_clocksource.c standard
+ kern/subr_dummy_vdso_tc.c standard
+ kern/syscalls.c optional ktr
+--- a/sys/conf/files.sparc64
++++ b/sys/conf/files.sparc64
+@@ -39,7 +39,7 @@
+ dev/fb/gallant12x22.c optional sc
+ dev/fb/machfb.c optional machfb sc
+ dev/hwpmc/hwpmc_sparc64.c optional hwpmc
+-dev/kbd/kbd.c optional atkbd | sc | ukbd
++dev/kbd/kbd.c optional atkbd | sc | ukbd | vt
+ dev/le/if_le_lebuffer.c optional le sbus
+ dev/le/if_le_ledma.c optional le sbus
+ dev/le/lebuffer_sbus.c optional le sbus
+@@ -59,7 +59,8 @@
+ dev/syscons/scterm-teken.c optional sc
+ dev/syscons/scvtb.c optional sc
+ dev/uart/uart_cpu_sparc64.c optional uart
+-dev/uart/uart_kbd_sun.c optional uart sc
++dev/uart/uart_kbd_sun.c optional uart sc | vt
++dev/vt/hw/ofwfb/ofwfb.c optional vt
+ kern/kern_clocksource.c standard
+ kern/subr_dummy_vdso_tc.c standard
+ kern/syscalls.c optional ktr
+--- a/sys/conf/kmod.mk
++++ b/sys/conf/kmod.mk
+@@ -340,7 +340,7 @@
+
+ MFILES?= dev/acpica/acpi_if.m dev/acpi_support/acpi_wmi_if.m \
+ dev/agp/agp_if.m dev/ata/ata_if.m dev/eisa/eisa_if.m \
+- dev/gpio/gpio_if.m dev/gpio/gpiobus_if.m \
++ dev/fb/fb_if.m dev/gpio/gpio_if.m dev/gpio/gpiobus_if.m \
+ dev/iicbus/iicbb_if.m dev/iicbus/iicbus_if.m \
+ dev/mmc/mmcbr_if.m dev/mmc/mmcbus_if.m \
+ dev/mii/miibus_if.m dev/mvs/mvs_if.m dev/ofw/ofw_bus_if.m \
+--- a/sys/conf/options
++++ b/sys/conf/options
+@@ -730,8 +730,10 @@
+ SAFE_NO_RNG opt_safe.h
+ SAFE_RNDTEST opt_safe.h
+
+-# syscons options
++# syscons/vt options
+ MAXCONS opt_syscons.h
++VT_FB_DEFAULT_WIDTH opt_syscons.h
++VT_FB_DEFAULT_HEIGHT opt_syscons.h
+ SC_ALT_MOUSE_IMAGE opt_syscons.h
+ SC_CUT_SPACES2TABS opt_syscons.h
+ SC_CUT_SEPCHARS opt_syscons.h
+@@ -754,6 +756,9 @@
+ SC_PIXEL_MODE opt_syscons.h
+ SC_RENDER_DEBUG opt_syscons.h
+ SC_TWOBUTTON_MOUSE opt_syscons.h
++DEV_SC opt_syscons.h
++DEV_VT opt_syscons.h
++
+
+ # teken terminal emulator options
+ TEKEN_CONS25 opt_teken.h
+--- a/sys/dev/drm2/drmP.h
++++ b/sys/dev/drm2/drmP.h
+@@ -113,6 +113,7 @@
+
+ #include "opt_compat.h"
+ #include "opt_drm.h"
++#include "opt_syscons.h"
+ #ifdef DRM_DEBUG
+ #undef DRM_DEBUG
+ #define DRM_DEBUG_DEFAULT_ON 1
+--- a/sys/dev/drm2/drm_fb_helper.c
++++ b/sys/dev/drm2/drm_fb_helper.c
+@@ -36,6 +36,41 @@
+ #include <dev/drm2/drm_fb_helper.h>
+ #include <dev/drm2/drm_crtc_helper.h>
+
++#if defined(__FreeBSD__)
++struct vt_kms_softc {
++ struct drm_fb_helper *fb_helper;
++ struct task fb_mode_task;
++};
++
++static fb_enter_t vt_kms_postswitch;
++static void vt_restore_fbdev_mode(void *, int);
++
++/* Call restore out of vt(9) locks. */
++static void
++vt_restore_fbdev_mode(void *arg, int pending)
++{
++ struct drm_fb_helper *fb_helper;
++ struct vt_kms_softc *sc;
++
++ sc = (struct vt_kms_softc *)arg;
++ fb_helper = sc->fb_helper;
++ sx_xlock(&fb_helper->dev->mode_config.mutex);
++ drm_fb_helper_restore_fbdev_mode(fb_helper);
++ sx_xunlock(&fb_helper->dev->mode_config.mutex);
++}
++
++static int
++vt_kms_postswitch(void *arg)
++{
++ struct vt_kms_softc *sc;
++
++ sc = (struct vt_kms_softc *)arg;
++ taskqueue_enqueue_fast(taskqueue_thread, &sc->fb_mode_task);
++
++ return (0);
++}
++#endif
++
+ static DRM_LIST_HEAD(kernel_fb_helper_list);
+
+ /* simple single crtc case helper function */
+@@ -216,6 +251,10 @@
+ fb_get_options(const char *connector_name, char **option)
+ {
+
++ /*
++ * TODO: store mode options pointer in ${option} for connector with
++ * name ${connector_name}
++ */
+ return (1);
+ }
+
+@@ -892,11 +931,13 @@
+ int new_fb = 0;
+ int crtc_count = 0;
+ int i;
+-#if 0
+ struct fb_info *info;
+-#endif
+ struct drm_fb_helper_surface_size sizes;
+ int gamma_size = 0;
++#if defined(__FreeBSD__)
++ struct vt_kms_softc *sc;
++ device_t kdev;
++#endif
+
+ memset(&sizes, 0, sizeof(struct drm_fb_helper_surface_size));
+ sizes.surface_depth = 24;
+@@ -973,8 +1014,21 @@
+ if (new_fb < 0)
+ return new_fb;
+
+-#if 0
++#if defined(__FreeBSD__)
++ sc = malloc(sizeof(struct vt_kms_softc), DRM_MEM_KMS,
++ M_WAITOK | M_ZERO);
++ sc->fb_helper = fb_helper;
++ TASK_INIT(&sc->fb_mode_task, 0, vt_restore_fbdev_mode, sc);
++
+ info = fb_helper->fbdev;
++
++ info->fb_name = device_get_nameunit(fb_helper->dev->device);
++ info->fb_depth = fb_helper->fb->bits_per_pixel;
++ info->fb_height = fb_helper->fb->height;
++ info->fb_width = fb_helper->fb->width;
++ info->fb_stride = fb_helper->fb->pitches[0];
++ info->fb_priv = sc;
++ info->enter = &vt_kms_postswitch;
+ #endif
+
+ /* set the fb pointer */
+@@ -982,7 +1036,23 @@
+ fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb;
+ }
+
+-#if 0
++#if defined(__FreeBSD__)
++ if (new_fb) {
++ device_t fbd;
++ int ret;
++
++ kdev = fb_helper->dev->device;
++ fbd = device_add_child(kdev, "fbd", device_get_unit(kdev));
++ if (fbd != NULL)
++ ret = device_probe_and_attach(fbd);
++ else
++ ret = ENODEV;
++#ifdef DEV_VT
++ if (ret != 0)
++ DRM_ERROR("Failed to attach fbd device: %d\n", ret);
++#endif
++ }
++#else
+ if (new_fb) {
+ info->var.pixclock = 0;
+ if (register_framebuffer(info) < 0) {
+@@ -1006,7 +1076,6 @@
+ if (new_fb)
+ list_add(&fb_helper->kernel_fb_list, &kernel_fb_helper_list);
+ #endif
+-
+ return 0;
+ }
+
+--- a/sys/dev/drm2/drm_os_freebsd.h
++++ b/sys/dev/drm2/drm_os_freebsd.h
+@@ -6,6 +6,8 @@
+ #include <sys/cdefs.h>
+ __FBSDID("$FreeBSD$");
+
++#include <sys/fbio.h>
++
+ #if _BYTE_ORDER == _BIG_ENDIAN
+ #define __BIG_ENDIAN 4321
+ #else
+--- a/sys/dev/drm2/i915/i915_drv.c
++++ b/sys/dev/drm2/i915/i915_drv.c
+@@ -40,6 +40,8 @@
+ #include <dev/drm2/drm_pciids.h>
+ #include <dev/drm2/i915/intel_drv.h>
+
++#include "fb_if.h"
++
+ /* drv_PCI_IDs comes from drm_pciids.h, generated from drm_pciids.txt. */
+ static drm_pci_id_list_t i915_pciidlist[] = {
+ i915_PCI_IDS
+@@ -380,6 +382,25 @@
+ return (drm_attach(kdev, i915_pciidlist));
+ }
+
++static struct fb_info *
++i915_fb_helper_getinfo(device_t kdev)
++{
++ struct intel_fbdev *ifbdev;
++ drm_i915_private_t *dev_priv;
++ struct drm_device *dev;
++ struct fb_info *info;
++
++ dev = device_get_softc(kdev);
++ dev_priv = dev->dev_private;
++ ifbdev = dev_priv->fbdev;
++ if (ifbdev == NULL)
++ return (NULL);
++
++ info = ifbdev->helper.fbdev;
++
++ return (info);
++}
++
+ const struct intel_device_info *
+ i915_get_device_id(int device)
+ {
+@@ -400,6 +421,10 @@
+ DEVMETHOD(device_suspend, i915_suspend),
+ DEVMETHOD(device_resume, i915_resume),
+ DEVMETHOD(device_detach, drm_detach),
++
++ /* Framebuffer service methods */
++ DEVMETHOD(fb_getinfo, i915_fb_helper_getinfo),
++
+ DEVMETHOD_END
+ };
+
+--- a/sys/dev/drm2/i915/intel_fb.c
++++ b/sys/dev/drm2/i915/intel_fb.c
+@@ -41,8 +41,8 @@
+ struct drm_device *dev = ifbdev->helper.dev;
+ #if 0
+ struct drm_i915_private *dev_priv = dev->dev_private;
+- struct fb_info *info;
+ #endif
++ struct fb_info *info;
+ struct drm_framebuffer *fb;
+ struct drm_mode_fb_cmd2 mode_cmd;
+ struct drm_i915_gem_object *obj;
+@@ -86,6 +86,16 @@
+ }
+
+ info->par = ifbdev;
++#else
++ info = malloc(sizeof(struct fb_info), DRM_MEM_KMS, M_WAITOK | M_ZERO);
++ info->fb_size = size;
++ info->fb_bpp = sizes->surface_bpp;
++ info->fb_width = sizes->fb_width;
++ info->fb_height = sizes->fb_height;
++ info->fb_pbase = dev->agp->base + obj->gtt_offset;
++ info->fb_vbase = (vm_offset_t)pmap_mapdev_attr(info->fb_pbase, size,
++ PAT_WRITE_COMBINING);
++
+ #endif
+
+ ret = intel_framebuffer_init(dev, &ifbdev->ifb, &mode_cmd, obj);
+@@ -95,8 +105,8 @@
+ fb = &ifbdev->ifb.base;
+
+ ifbdev->helper.fb = fb;
+-#if 0
+ ifbdev->helper.fbdev = info;
++#if 0
+
+ strcpy(info->fix.id, "inteldrmfb");
+
+@@ -135,9 +145,8 @@
+
+ /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
+ #endif
+-
+- DRM_DEBUG_KMS("allocated %dx%d fb: 0x%08x, bo %p\n",
+- fb->width, fb->height,
++ DRM_DEBUG_KMS("allocated %dx%d (s %dbits) fb: 0x%08x, bo %p\n",
++ fb->width, fb->height, fb->depth,
+ obj->gtt_offset, obj);
+
+ DRM_UNLOCK(dev);
+--- a/sys/dev/drm2/radeon/radeon.h
++++ b/sys/dev/drm2/radeon/radeon.h
+@@ -2041,6 +2041,9 @@
+ int radeon_ttm_init(struct radeon_device *rdev);
+ void radeon_ttm_fini(struct radeon_device *rdev);
+
++/* radeon_fb.c */
++struct fb_info * radeon_fb_helper_getinfo(device_t kdev);
++
+ /* r600.c */
+ int r600_ih_ring_alloc(struct radeon_device *rdev);
+ void r600_ih_ring_fini(struct radeon_device *rdev);
+--- a/sys/dev/drm2/radeon/radeon_drv.c
++++ b/sys/dev/drm2/radeon/radeon_drv.c
+@@ -41,6 +41,7 @@
+
+ #include <dev/drm2/drm_pciids.h>
+
++#include "fb_if.h"
+
+ /*
+ * KMS wrapper.
+@@ -495,6 +496,8 @@
+ return (-ret);
+ }
+
++extern struct fb_info * radeon_fb_helper_getinfo(device_t kdev);
++
+ static device_method_t radeon_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, radeon_probe),
+@@ -502,6 +505,10 @@
+ DEVMETHOD(device_suspend, radeon_suspend),
+ DEVMETHOD(device_resume, radeon_resume),
+ DEVMETHOD(device_detach, drm_detach),
++
++ /* Framebuffer service methods */
++ DEVMETHOD(fb_getinfo, radeon_fb_helper_getinfo),
++
+ DEVMETHOD_END
+ };
+
+--- a/sys/dev/drm2/radeon/radeon_fb.c
++++ b/sys/dev/drm2/radeon/radeon_fb.c
+@@ -27,6 +27,8 @@
+ #include <sys/cdefs.h>
+ __FBSDID("$FreeBSD$");
+
++#include <machine/_inttypes.h>
++
+ #include <dev/drm2/drmP.h>
+ #include <dev/drm2/drm_crtc.h>
+ #include <dev/drm2/drm_crtc_helper.h>
+@@ -46,7 +48,7 @@
+ struct radeon_device *rdev;
+ };
+
+-#ifdef DUMBBELL_WIP
++#if defined(__linux__)
+ static struct fb_ops radeonfb_ops = {
+ .owner = THIS_MODULE,
+ .fb_check_var = drm_fb_helper_check_var,
+@@ -60,7 +62,7 @@
+ .fb_debug_enter = drm_fb_helper_debug_enter,
+ .fb_debug_leave = drm_fb_helper_debug_leave,
+ };
+-#endif /* DUMBBELL_WIP */
++#endif
+
+
+ int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bool tiled)
+@@ -191,20 +193,13 @@
+ struct drm_fb_helper_surface_size *sizes)
+ {
+ struct radeon_device *rdev = rfbdev->rdev;
+-#ifdef DUMBBELL_WIP
+ struct fb_info *info;
+-#endif /* DUMBBELL_WIP */
+ struct drm_framebuffer *fb = NULL;
+ struct drm_mode_fb_cmd2 mode_cmd;
+ struct drm_gem_object *gobj = NULL;
+ struct radeon_bo *rbo = NULL;
+-#ifdef DUMBBELL_WIP
+- device_t device = rdev->dev;
+-#endif /* DUMBBELL_WIP */
+ int ret;
+-#ifdef DUMBBELL_WIP
+ unsigned long tmp;
+-#endif /* DUMBBELL_WIP */
+
+ mode_cmd.width = sizes->surface_width;
+ mode_cmd.height = sizes->surface_height;
+@@ -224,16 +219,7 @@
+
+ rbo = gem_to_radeon_bo(gobj);
+
+-#ifdef DUMBBELL_WIP
+- /* okay we have an object now allocate the framebuffer */
+- info = framebuffer_alloc(0, device);
+- if (info == NULL) {
+- ret = -ENOMEM;
+- goto out_unref;
+- }
+-
+- info->par = rfbdev;
+-#endif /* DUMBBELL_WIP */
++ info = malloc(sizeof(*info), DRM_MEM_KMS, M_WAITOK | M_ZERO);
+
+ ret = radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj);
+ if (ret) {
+@@ -245,61 +231,29 @@
+
+ /* setup helper */
+ rfbdev->helper.fb = fb;
+-#ifdef DUMBBELL_WIP
+ rfbdev->helper.fbdev = info;
+
+- memset_io(rbo->kptr, 0x0, radeon_bo_size(rbo));
+-
+- strcpy(info->fix.id, "radeondrmfb");
+-
+- drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth);
+-
+- info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT;
+- info->fbops = &radeonfb_ops;
++ memset(rbo->kptr, 0x0, radeon_bo_size(rbo));
+
+ tmp = radeon_bo_gpu_offset(rbo) - rdev->mc.vram_start;
+- info->fix.smem_start = rdev->mc.aper_base + tmp;
+- info->fix.smem_len = radeon_bo_size(rbo);
+- info->screen_base = rbo->kptr;
+- info->screen_size = radeon_bo_size(rbo);
+-
+- drm_fb_helper_fill_var(info, &rfbdev->helper, sizes->fb_width, sizes->fb_height);
+-
+- /* setup aperture base/size for vesafb takeover */
+- info->apertures = alloc_apertures(1);
+- if (!info->apertures) {
+- ret = -ENOMEM;
+- goto out_unref;
+- }
+- info->apertures->ranges[0].base = rdev->ddev->mode_config.fb_base;
+- info->apertures->ranges[0].size = rdev->mc.aper_size;
++ info->fb_size = radeon_bo_size(rbo);
++ info->fb_bpp = sizes->surface_bpp;
++ info->fb_width = sizes->surface_width;
++ info->fb_height = sizes->surface_height;
++ info->fb_pbase = rdev->mc.aper_base + tmp;
++ info->fb_vbase = (vm_offset_t)rbo->kptr;
+
+- /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
+-
+- if (info->screen_base == NULL) {
+- ret = -ENOSPC;
+- goto out_unref;
+- }
+-
+- ret = fb_alloc_cmap(&info->cmap, 256, 0);
+- if (ret) {
+- ret = -ENOMEM;
+- goto out_unref;
+- }
+-
+- DRM_INFO("fb mappable at 0x%lX\n", info->fix.smem_start);
++ DRM_INFO("fb mappable at 0x%" PRIXPTR "\n", info->fb_pbase);
+ DRM_INFO("vram apper at 0x%lX\n", (unsigned long)rdev->mc.aper_base);
+ DRM_INFO("size %lu\n", (unsigned long)radeon_bo_size(rbo));
+ DRM_INFO("fb depth is %d\n", fb->depth);
+ DRM_INFO(" pitch is %d\n", fb->pitches[0]);
+
+- vga_switcheroo_client_fb_set(rdev->ddev->pdev, info);
+-#endif /* DUMBBELL_WIP */
+ return 0;
+
+ out_unref:
+ if (rbo) {
+-
++ /* TODO? dumbbell@ */
+ }
+ if (fb && ret) {
+ drm_gem_object_unreference(gobj);
+@@ -332,21 +286,13 @@
+
+ static int radeon_fbdev_destroy(struct drm_device *dev, struct radeon_fbdev *rfbdev)
+ {
+-#ifdef DUMBBELL_WIP
+ struct fb_info *info;
+-#endif /* DUMBBELL_WIP */
+ struct radeon_framebuffer *rfb = &rfbdev->rfb;
+
+-#ifdef DUMBBELL_WIP
+ if (rfbdev->helper.fbdev) {
+ info = rfbdev->helper.fbdev;
+-
+- unregister_framebuffer(info);
+- if (info->cmap.len)
+- fb_dealloc_cmap(&info->cmap);
+- framebuffer_release(info);
++ free(info, DRM_MEM_KMS);
+ }
+-#endif /* DUMBBELL_WIP */
+
+ if (rfb->obj) {
+ DRM_UNLOCK(dev); /* Work around lock recursion. dumbbell@ */
+@@ -431,3 +377,22 @@
+ return true;
+ return false;
+ }
++
++struct fb_info *
++radeon_fb_helper_getinfo(device_t kdev)
++{
++ struct drm_device *dev;
++ struct radeon_device *rdev;
++ struct radeon_fbdev *rfbdev;
++ struct fb_info *info;
++
++ dev = device_get_softc(kdev);
++ rdev = dev->dev_private;
++ rfbdev = rdev->mode_info.rfbdev;
++ if (rfbdev == NULL)
++ return (NULL);
++
++ info = rfbdev->helper.fbdev;
++
++ return (info);
++}
+--- a/sys/dev/drm2/radeon/radeon_pm.c
++++ b/sys/dev/drm2/radeon/radeon_pm.c
+@@ -248,7 +248,7 @@
+ (rdev->pm.requested_power_state_index == rdev->pm.current_power_state_index))
+ return;
+
+- DRM_LOCK(rdev->ddev);
++ //DRM_LOCK(rdev->ddev); XXX Recursion, already locked in drm_attach/drm_load -- dumbbell@
+ sx_xlock(&rdev->pm.mclk_lock);
+ sx_xlock(&rdev->ring_lock);
+
+@@ -263,7 +263,7 @@
+ /* needs a GPU reset dont reset here */
+ sx_xunlock(&rdev->ring_lock);
+ sx_xunlock(&rdev->pm.mclk_lock);
+- DRM_UNLOCK(rdev->ddev);
++ //DRM_UNLOCK(rdev->ddev); XXX Recursion, already locked in drm_attach/drm_load -- dumbbell@
+ return;
+ }
+ }
+@@ -299,7 +299,7 @@
+
+ sx_xunlock(&rdev->ring_lock);
+ sx_xunlock(&rdev->pm.mclk_lock);
+- DRM_UNLOCK(rdev->ddev);
++ //DRM_UNLOCK(rdev->ddev); XXX Recursion, already locked in drm_attach/drm_load -- dumbbell@
+ }
+
+ static void radeon_pm_print_states(struct radeon_device *rdev)
+--- /dev/null
++++ b/sys/dev/fb/fb_if.m
+@@ -0,0 +1,13 @@
++#include <sys/bus.h>
++#include <sys/fbio.h>
++
++INTERFACE fb;
++
++METHOD int pin_max {
++ device_t dev;
++ int *npins;
++};
++
++METHOD struct fb_info * getinfo {
++ device_t dev;
++};
+--- /dev/null
++++ b/sys/dev/fb/fbd.c
+@@ -0,0 +1,476 @@
++/*-
++ * Copyright (c) 2013 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Aleksandr Rybalko under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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$
++ */
++
++/* Generic framebuffer */
++/* TODO unlink from VT(9) */
++/* TODO done normal /dev/fb methods */
++
++#include <sys/cdefs.h>
++__FBSDID("$FreeBSD$");
++
++#include <sys/param.h>
++#include <sys/systm.h>
++#include <sys/bus.h>
++#include <sys/conf.h>
++#include <sys/kernel.h>
++#include <sys/malloc.h>
++#include <sys/module.h>
++#include <sys/queue.h>
++#include <sys/fbio.h>
++
++#include <machine/bus.h>
++
++#include <dev/vt/vt.h>
++#include <dev/vt/hw/fb/vt_fb.h>
++
++#include "fb_if.h"
++
++LIST_HEAD(fb_list_head_t, fb_list_entry) fb_list_head =
++ LIST_HEAD_INITIALIZER(fb_list_head);
++struct fb_list_entry {
++ struct fb_info *fb_info;
++ struct cdev *fb_si;
++ LIST_ENTRY(fb_list_entry) fb_list;
++};
++
++struct fbd_softc {
++ device_t sc_dev;
++ struct fb_info *sc_info;
++};
++
++static void fbd_evh_init(void *);
++/* SI_ORDER_SECOND, just after EVENTHANDLERs initialized. */
++SYSINIT(fbd_evh_init, SI_SUB_CONFIGURE, SI_ORDER_SECOND, fbd_evh_init, NULL);
++
++static d_open_t fb_open;
++static d_close_t fb_close;
++static d_read_t fb_read;
++static d_write_t fb_write;
++static d_ioctl_t fb_ioctl;
++static d_mmap_t fb_mmap;
++
++static struct cdevsw fb_cdevsw = {
++ .d_version = D_VERSION,
++ .d_flags = D_NEEDGIANT,
++ .d_open = fb_open,
++ .d_close = fb_close,
++ .d_read = fb_read,
++ .d_write = fb_write,
++ .d_ioctl = fb_ioctl,
++ .d_mmap = fb_mmap,
++ .d_name = "fb",
++};
++
++static int framebuffer_dev_unit = 0;
++
++static int
++fb_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
++{
++
++ return (0);
++}
++
++static int
++fb_close(struct cdev *dev, int fflag, int devtype, struct thread *td)
++{
++
++ return (0);
++}
++
++static int
++fb_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
++ struct thread *td)
++{
++ struct fb_info *info;
++ int error;
++
++ error = 0;
++ info = dev->si_drv1;
++
++ switch (cmd) {
++ case FBIOGTYPE:
++ bcopy(info, (struct fbtype *)data, sizeof(struct fbtype));
++ break;
++
++ case FBIO_GETWINORG: /* get frame buffer window origin */
++ *(u_int *)data = 0;
++ break;
++
++ case FBIO_GETDISPSTART: /* get display start address */
++ ((video_display_start_t *)data)->x = 0;
++ ((video_display_start_t *)data)->y = 0;
++ break;
++
++ case FBIO_GETLINEWIDTH: /* get scan line width in bytes */
++ *(u_int *)data = info->fb_stride;
++ break;
++
++ case FBIO_BLANK: /* blank display */
++ error = 0; /* TODO */
++ break;
++
++ default:
++ error = ENOIOCTL;
++ break;
++ }
++ return (error);
++}
++
++static int
++fb_read(struct cdev *dev, struct uio *uio, int ioflag)
++{
++
++ return (0); /* XXX nothing to read, yet */
++}
++
++static int
++fb_write(struct cdev *dev, struct uio *uio, int ioflag)
++{
++
++ return (0); /* XXX nothing written */
++}
++
++static int
++fb_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, int nprot,
++ vm_memattr_t *memattr)
++{
++ struct fb_info *info;
++
++ info = dev->si_drv1;
++ if (offset < info->fb_size) {
++ *paddr = info->fb_pbase + offset;
++ return (0);
++ }
++ return (EINVAL);
++}
++
++
++static void
++vt_fb_mem_wr1(struct fb_info *sc, uint32_t o, uint8_t v)
++{
++
++ KASSERT((o < sc->fb_size), ("Offset %#08x out of fb size", o));
++ *(uint8_t *)(sc->fb_vbase + o) = v;
++}
++
++static void
++vt_fb_mem_wr2(struct fb_info *sc, uint32_t o, uint16_t v)
++{
++
++ KASSERT((o < sc->fb_size), ("Offset %#08x out of fb size", o));
++ *(uint16_t *)(sc->fb_vbase + o) = v;
++}
++
++static void
++vt_fb_mem_wr4(struct fb_info *sc, uint32_t o, uint32_t v)
++{
++
++ KASSERT((o < sc->fb_size), ("Offset %#08x out of fb size", o));
++ *(uint32_t *)(sc->fb_vbase + o) = v;
++}
++
++static void
++vt_fb_mem_copy(struct fb_info *sc, uint32_t offset_to, uint32_t offset_from,
++ uint32_t size)
++{
++
++ memmove((void *)(sc->fb_vbase + offset_to), (void *)(sc->fb_vbase +
++ offset_from), size);
++}
++
++static void
++vt_fb_indir_wr1(struct fb_info *sc, uint32_t o, uint8_t v)
++{
++
++ KASSERT((o < sc->fb_size), ("Offset %#08x out of fb size", o));
++ sc->fb_write(sc->fb_priv, o, &v, 1);
++}
++
++static void
++vt_fb_indir_wr2(struct fb_info *sc, uint32_t o, uint16_t v)
++{
++
++ KASSERT((o < sc->fb_size), ("Offset %#08x out of fb size", o));
++ sc->fb_write(sc->fb_priv, o, &v, 2);
++}
++
++static void
++vt_fb_indir_wr4(struct fb_info *sc, uint32_t o, uint32_t v)
++{
++
++ KASSERT((o < sc->fb_size), ("Offset %#08x out of fb size", o));
++ sc->fb_write(sc->fb_priv, o, &v, 4);
++}
++
++static void
++vt_fb_indir_copy(struct fb_info *sc, uint32_t offset_to, uint32_t offset_from,
++ uint32_t size)
++{
++
++ sc->copy(sc->fb_priv, offset_to, offset_from, size);
++}
++
++int
++fb_probe(struct fb_info *info)
++{
++
++ if (info->fb_size == 0)
++ return (ENXIO);
++
++ if (info->fb_write != NULL) {
++ if (info->fb_write == NULL) {
++ return (EINVAL);
++ }
++ info->fb_flags |= FB_FLAG_NOMMAP;
++ info->wr1 = &vt_fb_indir_wr1;
++ info->wr2 = &vt_fb_indir_wr2;
++ info->wr4 = &vt_fb_indir_wr4;
++ info->copy = &vt_fb_indir_copy;
++ } else if (info->fb_vbase != 0) {
++ if (info->fb_pbase == 0) {
++ info->fb_flags |= FB_FLAG_NOMMAP;
++ } else {
++ if (info->fb_mmap == NULL)
++ info->fb_mmap = &fb_mmap;
++ }
++ info->wr1 = &vt_fb_mem_wr1;
++ info->wr2 = &vt_fb_mem_wr2;
++ info->wr4 = &vt_fb_mem_wr4;
++ info->copy = &vt_fb_mem_copy;
++ } else
++ return (ENXIO);
++
++ if (info->fb_ioctl == NULL)
++ info->fb_ioctl = &fb_ioctl;
++
++
++ return (0);
++}
++
++
++static int
++fb_init(struct fb_list_entry *entry, int unit)
++{
++ struct fb_info *info;
++
++ info = entry->fb_info;
++ entry->fb_si = make_dev(&fb_cdevsw, unit, UID_ROOT, GID_WHEEL,
++ 0600, "fb%d", unit);
++ entry->fb_si->si_drv1 = info;
++ info->fb_cdev = entry->fb_si;
++
++ return (0);
++}
++
++int
++fbd_list()
++{
++ struct fb_list_entry *entry;
++
++ if (LIST_EMPTY(&fb_list_head))
++ return (ENOENT);
++
++ LIST_FOREACH(entry, &fb_list_head, fb_list) {
++ printf("FB %s @%p\n", entry->fb_info->fb_name,
++ (void *)entry->fb_info->fb_pbase);
++ }
++
++ return (0);
++}
++
++static struct fb_list_entry *
++fbd_find(struct fb_info* info)
++{
++ struct fb_list_entry *entry, *tmp;
++
++ LIST_FOREACH_SAFE(entry, &fb_list_head, fb_list, tmp) {
++ if (entry->fb_info == info) {
++ return (entry);
++ }
++ }
++
++ return (NULL);
++}
++
++int
++fbd_register(struct fb_info* info)
++{
++ struct fb_list_entry *entry;
++ int err, first;
++
++ first = 0;
++ if (LIST_EMPTY(&fb_list_head))
++ first++;
++
++ entry = fbd_find(info);
++ if (entry != NULL) {
++ /* XXX Update framebuffer params */
++ return (0);
++ }
++
++ err = fb_probe(info);
++ if (err)
++ return (err);
++
++ entry = malloc(sizeof(struct fb_list_entry), M_DEVBUF, M_WAITOK|M_ZERO);
++ entry->fb_info = info;
++
++ LIST_INSERT_HEAD(&fb_list_head, entry, fb_list);
++
++ err = fb_init(entry, framebuffer_dev_unit++);
++ if (err)
++ return (err);
++
++ if (first)
++ vt_fb_attach(info);
++
++ return (0);
++}
++
++int
++fbd_unregister(struct fb_info* info)
++{
++ struct fb_list_entry *entry, *tmp;
++
++ LIST_FOREACH_SAFE(entry, &fb_list_head, fb_list, tmp) {
++ if (entry->fb_info == info) {
++ LIST_REMOVE(entry, fb_list);
++ free(entry, M_DEVBUF);
++ return (0);
++ }
++ }
++
++ return (ENOENT);
++}
++
++static void
++register_fb_wrap(void *arg, void *ptr)
++{
++
++ fbd_register((struct fb_info *)ptr);
++}
++
++static void
++unregister_fb_wrap(void *arg, void *ptr)
++{
++
++ fbd_unregister((struct fb_info *)ptr);
++}
++
++static void
++fbd_evh_init(void *ctx)
++{
++
++ EVENTHANDLER_REGISTER(register_framebuffer, register_fb_wrap, NULL,
++ EVENTHANDLER_PRI_ANY);
++ EVENTHANDLER_REGISTER(unregister_framebuffer, unregister_fb_wrap, NULL,
++ EVENTHANDLER_PRI_ANY);
++}
++
++/* Newbus methods. */
++static int
++fbd_probe(device_t dev)
++{
++
++ return (BUS_PROBE_NOWILDCARD);
++}
++
++static int
++fbd_attach(device_t dev)
++{
++ struct fbd_softc *sc;
++ int err;
++
++ sc = device_get_softc(dev);
++
++ sc->sc_dev = dev;
++ sc->sc_info = FB_GETINFO(device_get_parent(dev));
++ if (sc->sc_info == NULL)
++ return (ENXIO);
++ err = fbd_register(sc->sc_info);
++
++ return (err);
++}
++
++static int
++fbd_detach(device_t dev)
++{
++ struct fbd_softc *sc;
++ int err;
++
++ sc = device_get_softc(dev);
++
++ err = fbd_unregister(sc->sc_info);
++
++ return (err);
++}
++
++static int
++fbd_suspend(device_t dev)
++{
++
++ vt_fb_suspend();
++ return (bus_generic_suspend(dev));
++}
++
++static int
++fbd_resume(device_t dev)
++{
++
++ vt_fb_resume();
++ return (bus_generic_resume(dev));
++}
++
++static device_method_t fbd_methods[] = {
++ /* Device interface */
++ DEVMETHOD(device_probe, fbd_probe),
++ DEVMETHOD(device_attach, fbd_attach),
++ DEVMETHOD(device_detach, fbd_detach),
++
++ DEVMETHOD(device_shutdown, bus_generic_shutdown),
++ DEVMETHOD(device_suspend, fbd_suspend),
++ DEVMETHOD(device_resume, fbd_resume),
++
++ { 0, 0 }
++};
++
++driver_t fbd_driver = {
++ "fbd",
++ fbd_methods,
++ sizeof(struct fbd_softc)
++};
++
++devclass_t fbd_devclass;
++
++DRIVER_MODULE(fbd, fb, fbd_driver, fbd_devclass, 0, 0);
++DRIVER_MODULE(fbd, drmn, fbd_driver, fbd_devclass, 0, 0);
++MODULE_VERSION(fbd, 1);
++
+--- a/sys/dev/syscons/scterm-teken.c
++++ b/sys/dev/syscons/scterm-teken.c
+@@ -553,7 +553,14 @@
+ vm_offset_t p;
+ int cursor, attr;
+
++ /*
++ * No support for printing right hand sides for CJK fullwidth
++ * characters. Simply print a space and assume that the left
++ * hand side describes the entire character.
++ */
+ attr = scteken_attr(a) << 8;
++ if (a->ta_format & TF_CJK_RIGHT)
++ c = ' ';
+ #ifdef TEKEN_UTF8
+ scteken_get_cp437(&c, &attr);
+ #endif /* TEKEN_UTF8 */
+--- /dev/null
++++ b/sys/dev/vt/colors/vt_termcolors.c
+@@ -0,0 +1,80 @@
++/*-
++ * Copyright (c) 2013 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Aleksandr Rybalko under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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$
++ */
++
++#include <sys/param.h>
++
++#include <dev/vt/colors/vt_termcolors.h>
++
++static struct {
++ unsigned char r; /* Red percentage value. */
++ unsigned char g; /* Green percentage value. */
++ unsigned char b; /* Blue percentage value. */
++} color_def[16] = {
++ {0, 0, 0}, /* black */
++ {0, 0, 50}, /* dark blue */
++ {0, 50, 0}, /* dark green */
++ {0, 50, 50}, /* dark cyan */
++ {50, 0, 0}, /* dark red */
++ {50, 0, 50}, /* dark magenta */
++ {50, 50, 0}, /* brown */
++ {75, 75, 75}, /* light gray */
++ {50, 50, 50}, /* dark gray */
++ {0, 0, 100}, /* light blue */
++ {0, 100, 0}, /* light green */
++ {0, 100, 100}, /* light cyan */
++ {100, 0, 0}, /* light red */
++ {100, 0, 100}, /* light magenta */
++ {100, 100, 0}, /* yellow */
++ {100, 100, 100}, /* white */
++};
++
++int
++vt_generate_vga_palette(uint32_t *palette, int format, uint32_t rmax, int roffset,
++ uint32_t gmax, int goffset, uint32_t bmax, int boffset)
++{
++ int i;
++
++#define CF(_f, _i) ((_f ## max * color_def[(_i)]._f / 100) << _f ## offset)
++ for (i = 0; i < 16; i++) {
++ switch (format) {
++ case COLOR_FORMAT_VGA:
++ palette[i] = i;
++ break;
++ case COLOR_FORMAT_RGB:
++ palette[i] = CF(r, i) | CF(g, i) | CF(b, i);
++ break;
++ default:
++ return (ENODEV);
++ }
++ }
++#undef CF
++ return (0);
++}
+--- /dev/null
++++ b/sys/dev/vt/colors/vt_termcolors.h
+@@ -0,0 +1,50 @@
++/*-
++ * Copyright (c) 2013 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Aleksandr Rybalko under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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$
++ */
++
++enum vt_color_format {
++ COLOR_FORMAT_BW = 0,
++ COLOR_FORMAT_GRAY,
++ COLOR_FORMAT_VGA, /* Color Index. */
++ COLOR_FORMAT_RGB,
++ COLOR_FORMAT_ARGB,
++ COLOR_FORMAT_CMYK,
++ COLOR_FORMAT_HSL,
++ COLOR_FORMAT_YUV,
++ COLOR_FORMAT_YCbCr,
++ COLOR_FORMAT_YPbPr,
++
++ COLOR_FORMAT_MAX = 15,
++};
++
++/* Helper to fill color map used by driver */
++int vt_generate_vga_palette(uint32_t *palette, int format, uint32_t rmax,
++ int roffset, uint32_t gmax, int goffset, uint32_t bmax, int boffset);
++
+--- /dev/null
++++ b/sys/dev/vt/font/vt_font_default.c
+@@ -0,0 +1,2205 @@
++/*-
++ * Copyright (c) 2011 Dimitar Toshkov Zhekov <jimmy at is-vn.bg>
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
++ *
++ * Please contribute any changes back to <jimmy at is-vn.bg>.
++ */
++
++#include <sys/cdefs.h>
++__FBSDID("$FreeBSD$");
++
++#include <dev/vt/vt.h>
++
++static uint8_t font_bytes[1422 * 16] = {
++ 0x00, 0x00, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x24, 0x7e, 0x24, 0x24,
++ 0x7e, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7c,
++ 0x92, 0x90, 0x90, 0x7c, 0x12, 0x12, 0x92, 0x7c, 0x10, 0x10, 0x00, 0x00,
++ 0x00, 0x00, 0x64, 0x94, 0x68, 0x08, 0x10, 0x10, 0x20, 0x2c, 0x52, 0x4c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x24, 0x18, 0x30, 0x4a,
++ 0x44, 0x44, 0x44, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x08, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x08,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08, 0x08, 0x08, 0x08,
++ 0x08, 0x08, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x24, 0x18, 0x7e, 0x18, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10,
++ 0x20, 0x20, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42,
++ 0x42, 0x46, 0x4a, 0x52, 0x62, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x08, 0x18, 0x28, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42, 0x02, 0x04, 0x08,
++ 0x10, 0x20, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42,
++ 0x42, 0x02, 0x1c, 0x02, 0x02, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x02, 0x06, 0x0a, 0x12, 0x22, 0x42, 0x7e, 0x02, 0x02, 0x02,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x7c, 0x02,
++ 0x02, 0x02, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x20,
++ 0x40, 0x40, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7e, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x3c, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42,
++ 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x04, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,
++ 0x00, 0x00, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
++ 0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x04,
++ 0x08, 0x10, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42,
++ 0x42, 0x42, 0x04, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7c, 0x82, 0x9e, 0xa2, 0xa2, 0xa2, 0xa6, 0x9a, 0x80, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x7e,
++ 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42,
++ 0x42, 0x42, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x3c, 0x42, 0x42, 0x40, 0x40, 0x40, 0x40, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x44, 0x42, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x44, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x40,
++ 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x40, 0x40,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42, 0x40, 0x40, 0x4e,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42,
++ 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x04, 0x04, 0x04, 0x04, 0x04,
++ 0x04, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x44,
++ 0x48, 0x50, 0x60, 0x60, 0x50, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xc6, 0xaa, 0x92, 0x92, 0x82,
++ 0x82, 0x82, 0x82, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42,
++ 0x42, 0x62, 0x52, 0x4a, 0x46, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x7c,
++ 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42,
++ 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x4a, 0x3c, 0x02, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x7c, 0x50, 0x48, 0x44, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x40, 0x40, 0x3c, 0x02,
++ 0x02, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24,
++ 0x24, 0x24, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82,
++ 0x82, 0x82, 0x82, 0x92, 0x92, 0xaa, 0xc6, 0x82, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x42, 0x42, 0x24, 0x24, 0x18, 0x18, 0x24, 0x24, 0x42, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x44, 0x44, 0x28, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x02,
++ 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10,
++ 0x08, 0x08, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x08,
++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x10, 0x28, 0x44, 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, 0x7e, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x02, 0x3e, 0x42, 0x42, 0x42, 0x3e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7c, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x3c, 0x42, 0x40, 0x40, 0x40, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x02, 0x02, 0x02, 0x3e, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42,
++ 0x7e, 0x40, 0x40, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x10,
++ 0x10, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x02, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7c, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,
++ 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x04, 0x04, 0x00, 0x0c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
++ 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x42, 0x44, 0x48,
++ 0x70, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7c,
++ 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x5e, 0x60, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x40, 0x40, 0x3c, 0x02, 0x02, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x7c, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x24, 0x24, 0x18, 0x18,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x92,
++ 0x92, 0x92, 0x92, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x42, 0x42, 0x24, 0x18, 0x24, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x02, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x04, 0x08,
++ 0x10, 0x20, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x10,
++ 0x10, 0x10, 0x20, 0x10, 0x10, 0x10, 0x10, 0x0c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x08, 0x08, 0x04, 0x08,
++ 0x08, 0x08, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x92, 0x8c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7c, 0x92, 0x90,
++ 0x90, 0x90, 0x92, 0x7c, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24,
++ 0x20, 0x20, 0x78, 0x20, 0x20, 0x20, 0x22, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x44, 0x38, 0x44, 0x44, 0x44, 0x38, 0x44, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x44, 0x28, 0x10, 0x7c,
++ 0x10, 0x7c, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,
++ 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x38, 0x44, 0x40, 0x30, 0x48, 0x44, 0x44, 0x24, 0x18, 0x04, 0x44,
++ 0x38, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e,
++ 0x81, 0x99, 0xa5, 0xa1, 0xa5, 0x99, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x38, 0x04, 0x3c, 0x44, 0x3c, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x24, 0x48,
++ 0x90, 0x48, 0x24, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7e, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xb9, 0xa5, 0xb9,
++ 0xa9, 0xa5, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x18, 0x24, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7c,
++ 0x10, 0x10, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x08,
++ 0x10, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x38, 0x04, 0x18, 0x04, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x46, 0x7a, 0x40, 0x40, 0x40, 0x00,
++ 0x00, 0x00, 0x7e, 0x92, 0x92, 0x92, 0x92, 0x72, 0x12, 0x12, 0x12, 0x12,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
++ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x20, 0x00,
++ 0x00, 0x10, 0x30, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x90, 0x48, 0x24, 0x12, 0x24, 0x48, 0x90, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x20, 0x60, 0x20, 0x22, 0x24, 0x08, 0x10, 0x22, 0x46, 0x8a, 0x1e,
++ 0x02, 0x02, 0x00, 0x00, 0x00, 0x20, 0x60, 0x20, 0x22, 0x24, 0x08, 0x10,
++ 0x20, 0x4c, 0x92, 0x04, 0x08, 0x1e, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x60,
++ 0x12, 0xe4, 0x08, 0x10, 0x22, 0x46, 0x8a, 0x1e, 0x02, 0x02, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x20, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x7e,
++ 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3c,
++ 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x24, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x32, 0x4c, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x7e,
++ 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x3c,
++ 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x24, 0x18, 0x3c, 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x90, 0x90, 0x90, 0xfc, 0x90,
++ 0x90, 0x90, 0x90, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42,
++ 0x42, 0x40, 0x40, 0x40, 0x40, 0x42, 0x42, 0x3c, 0x10, 0x10, 0x20, 0x00,
++ 0x10, 0x08, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x78,
++ 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x7e,
++ 0x40, 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x24, 0x24, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x38, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x38,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x24, 0x00, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x00, 0x38, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x44,
++ 0x42, 0x42, 0xf2, 0x42, 0x42, 0x42, 0x44, 0x78, 0x00, 0x00, 0x00, 0x00,
++ 0x32, 0x4c, 0x00, 0x42, 0x42, 0x62, 0x52, 0x4a, 0x46, 0x42, 0x42, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3c,
++ 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x24, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x32, 0x4c, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x3c,
++ 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x43, 0x42, 0x46, 0x4a, 0x52,
++ 0x62, 0x42, 0xc2, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x08, 0x10, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x42,
++ 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x08, 0x10, 0x82, 0x82, 0x44, 0x44, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x7c, 0x42, 0x42, 0x42,
++ 0x42, 0x7c, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44,
++ 0x44, 0x48, 0x7c, 0x42, 0x42, 0x42, 0x62, 0x5c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x08, 0x00, 0x3c, 0x02, 0x3e, 0x42, 0x42, 0x42, 0x3e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3c, 0x02, 0x3e,
++ 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24,
++ 0x00, 0x3c, 0x02, 0x3e, 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x32, 0x4c, 0x00, 0x3c, 0x02, 0x3e, 0x42, 0x42, 0x42, 0x3e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x3c, 0x02, 0x3e,
++ 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24,
++ 0x18, 0x3c, 0x02, 0x3e, 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x12, 0x72, 0x9e, 0x90, 0x90, 0x6c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x40,
++ 0x40, 0x40, 0x42, 0x3c, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x10, 0x08,
++ 0x00, 0x3c, 0x42, 0x42, 0x7e, 0x40, 0x40, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x08, 0x10, 0x00, 0x3c, 0x42, 0x42, 0x7e, 0x40, 0x40, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x3c, 0x42, 0x42,
++ 0x7e, 0x40, 0x40, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24,
++ 0x00, 0x3c, 0x42, 0x42, 0x7e, 0x40, 0x40, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x20, 0x10, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x30, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x48,
++ 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x48, 0x48, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, 0x28, 0x3c, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4c,
++ 0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x08, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3c, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24,
++ 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x32, 0x4c, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x3c, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x10, 0x10, 0x00, 0x7c, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x02, 0x3c, 0x46, 0x4a, 0x52, 0x62, 0x42, 0xbc,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10,
++ 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x18, 0x24, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10,
++ 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x3c, 0x00,
++ 0x00, 0x00, 0x40, 0x40, 0x40, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7c,
++ 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x3c, 0x00, 0x3c, 0x00, 0x3c, 0x42,
++ 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x02, 0x3e, 0x42, 0x42, 0x42, 0x3e,
++ 0x00, 0x00, 0x00, 0x00, 0x24, 0x18, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x7e,
++ 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x18,
++ 0x00, 0x3c, 0x02, 0x3e, 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42,
++ 0x02, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x02, 0x3e,
++ 0x42, 0x42, 0x42, 0x3e, 0x02, 0x04, 0x03, 0x00, 0x08, 0x10, 0x00, 0x3c,
++ 0x42, 0x42, 0x40, 0x40, 0x40, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x08, 0x10, 0x00, 0x3c, 0x42, 0x40, 0x40, 0x40, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x3c, 0x42, 0x42, 0x40, 0x40,
++ 0x40, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24,
++ 0x00, 0x3c, 0x42, 0x40, 0x40, 0x40, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x10, 0x10, 0x00, 0x3c, 0x42, 0x42, 0x40, 0x40, 0x40, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x3c, 0x42, 0x40,
++ 0x40, 0x40, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x24, 0x18, 0x00, 0x3c,
++ 0x42, 0x42, 0x40, 0x40, 0x40, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x24, 0x18, 0x00, 0x3c, 0x42, 0x40, 0x40, 0x40, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x24, 0x18, 0x00, 0x78, 0x44, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x44, 0x78, 0x00, 0x00, 0x00, 0x00, 0x24, 0x18, 0x02, 0x02,
++ 0x02, 0x3e, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x02, 0x0f, 0x02, 0x3e, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x78, 0x40,
++ 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
++ 0x00, 0x3c, 0x42, 0x42, 0x7e, 0x40, 0x40, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x24, 0x18, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x18, 0x00, 0x3c, 0x42, 0x42,
++ 0x7e, 0x40, 0x40, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x7e,
++ 0x40, 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x10, 0x00, 0x3c, 0x42, 0x42, 0x7e, 0x40, 0x40, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x78, 0x40,
++ 0x40, 0x40, 0x40, 0x7e, 0x02, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x3c, 0x42, 0x42, 0x7e, 0x40, 0x40, 0x3c, 0x08, 0x10, 0x0c, 0x00,
++ 0x18, 0x24, 0x00, 0x3c, 0x42, 0x42, 0x40, 0x4e, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x3e, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x3c, 0x00, 0x24, 0x18, 0x00, 0x3c,
++ 0x42, 0x42, 0x40, 0x4e, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x24, 0x18, 0x00, 0x3e, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x02, 0x02, 0x3c, 0x00, 0x10, 0x10, 0x00, 0x3c, 0x42, 0x42, 0x40, 0x4e,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08,
++ 0x00, 0x3e, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x3c, 0x00,
++ 0x00, 0x00, 0x3c, 0x42, 0x42, 0x40, 0x40, 0x4e, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x10, 0x10, 0x20, 0x00, 0x04, 0x08, 0x08, 0x00, 0x3e, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x3c, 0x00, 0x18, 0x24, 0x00, 0x42,
++ 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x0c, 0x12, 0x40, 0x40, 0x40, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xff, 0x42, 0x42, 0x7e, 0x42,
++ 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xf8,
++ 0x40, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x32, 0x4c, 0x00, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x58, 0x00, 0x30, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x38, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x78, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x24, 0x18, 0x00, 0x38, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x30,
++ 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38,
++ 0x10, 0x20, 0x18, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x38, 0x10, 0x20, 0x18, 0x00, 0x10, 0x10, 0x00, 0x38,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x42, 0x42, 0x42, 0x42, 0x42,
++ 0x42, 0x52, 0x52, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42,
++ 0x00, 0xc6, 0x42, 0x42, 0x42, 0x42, 0x42, 0xe2, 0x12, 0x12, 0x0c, 0x00,
++ 0x0c, 0x12, 0x00, 0x0e, 0x04, 0x04, 0x04, 0x04, 0x04, 0x44, 0x44, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x12, 0x00, 0x0c, 0x04, 0x04,
++ 0x04, 0x04, 0x04, 0x04, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x42, 0x44,
++ 0x48, 0x50, 0x60, 0x60, 0x50, 0x48, 0x44, 0x42, 0x00, 0x10, 0x10, 0x20,
++ 0x00, 0x00, 0x40, 0x40, 0x40, 0x42, 0x44, 0x48, 0x70, 0x48, 0x44, 0x42,
++ 0x00, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x44, 0x48,
++ 0x70, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x40,
++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x08, 0x10, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
++ 0x40, 0x40, 0x40, 0x7e, 0x00, 0x10, 0x10, 0x20, 0x00, 0x00, 0x30, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x10, 0x10, 0x20,
++ 0x24, 0x18, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x48, 0x30, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40,
++ 0x40, 0x40, 0x44, 0x44, 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x30, 0x10, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x10, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x60, 0xc0,
++ 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x10,
++ 0x10, 0x10, 0x18, 0x30, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x08, 0x10, 0x42, 0x42, 0x42, 0x62, 0x52, 0x4a, 0x46, 0x42, 0x42, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x7c, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42,
++ 0x42, 0x62, 0x52, 0x4a, 0x46, 0x42, 0x42, 0x42, 0x00, 0x10, 0x10, 0x20,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42,
++ 0x00, 0x10, 0x10, 0x20, 0x24, 0x18, 0x42, 0x42, 0x42, 0x62, 0x52, 0x4a,
++ 0x46, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x18,
++ 0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x40, 0x40, 0x80, 0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x62, 0x52, 0x4a,
++ 0x46, 0x42, 0x42, 0x42, 0x02, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x02, 0x02, 0x0c, 0x00,
++ 0x3c, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x24, 0x18, 0x00, 0x3c,
++ 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x24, 0x18, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x12, 0x24, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x24,
++ 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7e, 0x90, 0x90, 0x90, 0x9c, 0x90, 0x90, 0x90, 0x90, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x92, 0x92,
++ 0x9e, 0x90, 0x90, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x7c,
++ 0x42, 0x42, 0x42, 0x7c, 0x50, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x08, 0x10, 0x00, 0x5e, 0x60, 0x40, 0x40, 0x40, 0x40, 0x40,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x7c,
++ 0x50, 0x48, 0x44, 0x42, 0x00, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x5e, 0x60, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, 0x40, 0x80,
++ 0x24, 0x18, 0x00, 0x7c, 0x42, 0x42, 0x42, 0x7c, 0x50, 0x48, 0x44, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x18, 0x00, 0x5e, 0x60, 0x40,
++ 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3c,
++ 0x42, 0x40, 0x40, 0x3c, 0x02, 0x02, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x04, 0x08, 0x00, 0x3e, 0x40, 0x40, 0x3c, 0x02, 0x02, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x3c, 0x42, 0x40, 0x40, 0x3c,
++ 0x02, 0x02, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24,
++ 0x00, 0x3e, 0x40, 0x40, 0x3c, 0x02, 0x02, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x3c, 0x42, 0x40, 0x40, 0x3c, 0x02, 0x02, 0x42, 0x42, 0x3c,
++ 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x40, 0x40,
++ 0x3c, 0x02, 0x02, 0x7c, 0x10, 0x10, 0x20, 0x00, 0x24, 0x18, 0x00, 0x3c,
++ 0x42, 0x40, 0x40, 0x3c, 0x02, 0x02, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x24, 0x18, 0x00, 0x3e, 0x40, 0x40, 0x3c, 0x02, 0x02, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10,
++ 0x10, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0e, 0x04, 0x04, 0x08, 0x00,
++ 0x24, 0x18, 0x00, 0xfe, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x24, 0x18, 0x00, 0x10, 0x10, 0x7c, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x10,
++ 0x10, 0x10, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x10, 0x10, 0x7c, 0x10, 0x38, 0x10, 0x10, 0x10, 0x0e,
++ 0x00, 0x00, 0x00, 0x00, 0x32, 0x4c, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4c,
++ 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00,
++ 0x3c, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x24, 0x18, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x24, 0x18, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x18, 0x42, 0x42, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24,
++ 0x18, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00,
++ 0x12, 0x24, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x24, 0x00, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x08, 0x10, 0x0c, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x02, 0x04, 0x03, 0x00, 0x18, 0x24, 0x00, 0x82, 0x82, 0x82, 0x82, 0x92,
++ 0x92, 0xaa, 0xc6, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24,
++ 0x00, 0x82, 0x82, 0x92, 0x92, 0x92, 0x92, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x44, 0x44, 0x00, 0x82, 0x82, 0x44, 0x44, 0x28, 0x10, 0x10, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x7e, 0x02, 0x04, 0x08, 0x10,
++ 0x20, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10,
++ 0x00, 0x7e, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x10, 0x10, 0x00, 0x7e, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x40, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x7e, 0x04, 0x08,
++ 0x10, 0x20, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x24, 0x18, 0x00, 0x7e,
++ 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x24, 0x18, 0x00, 0x7e, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42,
++ 0x42, 0x02, 0x02, 0x02, 0x02, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7e, 0x02, 0x02, 0x02, 0x1e, 0x02, 0x02, 0x02, 0x02, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x02, 0x02, 0x7e, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42,
++ 0x42, 0x40, 0x38, 0x40, 0x40, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x0c, 0x12, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x90, 0x60, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x62, 0x52, 0x4a,
++ 0x46, 0x42, 0x42, 0x42, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x02, 0x02, 0x02, 0x00,
++ 0x00, 0x00, 0x7e, 0x02, 0x04, 0x08, 0x1c, 0x02, 0x02, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x40, 0x40, 0x3c, 0x02,
++ 0x02, 0x42, 0x42, 0x3c, 0x00, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x3e, 0x40, 0x40, 0x3c, 0x02, 0x02, 0x7c, 0x00, 0x10, 0x10, 0x20,
++ 0x00, 0x00, 0xfe, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x00, 0x10, 0x10, 0x20, 0x00, 0x00, 0x10, 0x10, 0x10, 0x7c, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x0e, 0x00, 0x04, 0x04, 0x08, 0x7c, 0x00, 0x82, 0x82,
++ 0x44, 0x44, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x02, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x04,
++ 0x04, 0x04, 0x04, 0x04, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x3c, 0x42, 0x02, 0x02, 0x02, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42, 0x7e, 0x02, 0x02, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x02, 0x02,
++ 0x7e, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x3c, 0x42, 0x40, 0x38, 0x40, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42,
++ 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x02, 0x04,
++ 0x08, 0x1c, 0x02, 0x02, 0x42, 0x42, 0x3c, 0x00, 0x08, 0x10, 0x10, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x08, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 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, 0x00, 0x02, 0x04, 0x03, 0x00,
++ 0x32, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x12, 0x24, 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, 0x00, 0x00, 0x10, 0x10, 0x00,
++ 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x3c, 0x42,
++ 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x7e, 0x40, 0x40, 0x40, 0x78, 0x40,
++ 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x42, 0x42,
++ 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x40, 0x80, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x82,
++ 0x82, 0x44, 0x44, 0x28, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x40, 0x80, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x24, 0x66,
++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x48, 0x48, 0x00, 0x30, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x40,
++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x10, 0x28, 0x28, 0x44, 0x44, 0x44, 0x82, 0x82, 0xfe,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x5a, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,
++ 0x28, 0x28, 0x44, 0x44, 0x44, 0x82, 0x82, 0x82, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x40,
++ 0x20, 0x10, 0x08, 0x08, 0x10, 0x20, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x7c, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x7c, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
++ 0x92, 0x7c, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42,
++ 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x24, 0x66, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x08, 0x10, 0x00, 0x3a, 0x46, 0x44, 0x44, 0x44, 0x46, 0x3a,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3c, 0x42, 0x40,
++ 0x38, 0x40, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10,
++ 0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x02, 0x02, 0x02, 0x00,
++ 0x00, 0x00, 0x08, 0x10, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0c,
++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x24, 0x00, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x3a, 0x46, 0x44, 0x44, 0x44, 0x46, 0x3a, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x38, 0x44, 0x44, 0x48, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x7c,
++ 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x44,
++ 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x3e, 0x10,
++ 0x08, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7e, 0x04, 0x08, 0x10, 0x20, 0x40, 0x40, 0x40, 0x40, 0x3c,
++ 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x44, 0x7c, 0x44,
++ 0x44, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x20, 0x20, 0x10, 0x10, 0x28, 0x28, 0x44, 0x44, 0x82, 0x82,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x40, 0x40, 0x40, 0x3c, 0x40,
++ 0x40, 0x40, 0x40, 0x3c, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7c,
++ 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x40,
++ 0x40, 0x40, 0x40, 0x3c, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x3e, 0x44, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x4c, 0x92, 0x92, 0x92, 0x92, 0x92, 0x7c, 0x10, 0x10, 0x10, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x24, 0x24, 0x18, 0x18, 0x24,
++ 0x24, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x92, 0x92,
++ 0x92, 0x92, 0x92, 0x7c, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x44, 0x82, 0x92, 0x92, 0x92, 0x92, 0x6c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x48, 0x48, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10,
++ 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x08, 0x10, 0x00, 0x44, 0x82, 0x92, 0x92, 0x92, 0x92, 0x6c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x7e, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x20,
++ 0x20, 0x3c, 0x22, 0x22, 0x22, 0x22, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00,
++ 0x08, 0x10, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x40, 0x40, 0x78, 0x40,
++ 0x40, 0x40, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x50,
++ 0x90, 0x9c, 0x92, 0x92, 0x92, 0x92, 0x92, 0x9c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x90, 0x90, 0x90, 0x9c, 0xf2, 0x92, 0x92, 0x92, 0x92, 0x9c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x20, 0x20, 0x3c, 0x22, 0x22,
++ 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x42, 0x44,
++ 0x48, 0x50, 0x60, 0x60, 0x50, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x10, 0x08, 0x42, 0x42, 0x42, 0x46, 0x4a, 0x52, 0x62, 0x42, 0x42, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x24, 0x18, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x02, 0x02, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7e, 0x18, 0x18, 0x00, 0x00,
++ 0x00, 0x00, 0x7c, 0x40, 0x40, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x44, 0x44, 0x44, 0x44, 0x44,
++ 0x44, 0x44, 0x44, 0xfe, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x92,
++ 0x92, 0x54, 0x38, 0x54, 0x92, 0x92, 0x92, 0x92, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x42, 0x42, 0x42, 0x46, 0x4a, 0x52, 0x62, 0x42, 0x42, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x24, 0x18, 0x42, 0x42, 0x42, 0x46, 0x4a, 0x52,
++ 0x62, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x12,
++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x02, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7c, 0x92, 0x92, 0x92, 0x92, 0x92,
++ 0x92, 0x92, 0x92, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3f, 0x01, 0x01, 0x00, 0x00,
++ 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x02, 0x02,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
++ 0x92, 0x92, 0x92, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x92,
++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x7f, 0x01, 0x01, 0x00, 0x00,
++ 0x00, 0x00, 0xc0, 0x40, 0x40, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0xf2, 0x8a, 0x8a,
++ 0x8a, 0x8a, 0x8a, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42,
++ 0x02, 0x02, 0x1e, 0x02, 0x02, 0x02, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x8c, 0x92, 0x92, 0x92, 0x92, 0xf2, 0x92, 0x92, 0x92, 0x8c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x0a, 0x12, 0x22, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x40,
++ 0x40, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x38, 0x44, 0x44, 0x48, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x40, 0x40,
++ 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x92, 0x92, 0x54, 0x38, 0x54, 0x92, 0x92, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x02, 0x1c, 0x02, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x22, 0x22,
++ 0x22, 0x22, 0x22, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x82, 0xc6, 0xaa, 0x92, 0x82, 0x82, 0x82, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x10, 0x7c, 0x92, 0x92, 0x92, 0x92, 0x92, 0x7c, 0x10, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3f,
++ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42,
++ 0x3e, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x7f,
++ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x3c,
++ 0x22, 0x22, 0x22, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x82, 0x82, 0xf2, 0x8a, 0x8a, 0x8a, 0xf2, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x78, 0x44, 0x44, 0x44, 0x78,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x02,
++ 0x1e, 0x02, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x8c, 0x92, 0x92, 0xf2, 0x92, 0x92, 0x8c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x42, 0x42, 0x3e, 0x12, 0x22, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xf8, 0x40, 0x7c, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x42, 0x02, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x10,
++ 0x00, 0x7e, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x40, 0x78, 0x40, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x90, 0x9c,
++ 0x92, 0x92, 0x92, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x90, 0x90, 0x9c, 0xf2, 0x92, 0x92, 0x9c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x08, 0x10, 0x00, 0x42, 0x44, 0x48, 0x70, 0x48, 0x44, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x18, 0x00, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7e, 0x18, 0x18, 0x00, 0x00,
++ 0x02, 0x02, 0x7e, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x7e, 0x40, 0x40,
++ 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x40,
++ 0x40, 0x40, 0xf8, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x40, 0x40, 0xf8, 0x40, 0x40, 0x40,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x40, 0x7c,
++ 0x42, 0x42, 0x42, 0x42, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7e, 0x40, 0x40, 0x78, 0x44, 0x44, 0x44, 0x04, 0x08, 0x00, 0x00,
++ 0x00, 0x00, 0x92, 0x92, 0x92, 0x54, 0x38, 0x54, 0x92, 0x92, 0x92, 0x93,
++ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x92, 0x54,
++ 0x38, 0x54, 0x92, 0x93, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42,
++ 0x42, 0x02, 0x1c, 0x02, 0x02, 0x42, 0x42, 0x3c, 0x10, 0x10, 0x10, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x02, 0x1c, 0x02, 0x42, 0x3c,
++ 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x42, 0x44, 0x48, 0x50, 0x60, 0x60,
++ 0x50, 0x48, 0x44, 0x43, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x42, 0x44, 0x48, 0x70, 0x48, 0x44, 0x43, 0x01, 0x01, 0x00, 0x00,
++ 0x00, 0x00, 0x42, 0x42, 0x54, 0x58, 0x70, 0x70, 0x58, 0x54, 0x42, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x54, 0x58,
++ 0x70, 0x58, 0x54, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x44,
++ 0x48, 0x50, 0x60, 0x60, 0x50, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x44, 0x48, 0x70, 0x48, 0x44, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x7e, 0x42,
++ 0x42, 0x42, 0x42, 0x43, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x43, 0x01, 0x01, 0x00, 0x00,
++ 0x00, 0x00, 0x47, 0x44, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x44, 0x44, 0x44,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x44, 0x44,
++ 0x7c, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42,
++ 0x42, 0x40, 0x40, 0x40, 0x40, 0x42, 0x42, 0x3c, 0x10, 0x10, 0x10, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x40, 0x40, 0x40, 0x42, 0x3c,
++ 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x82, 0x82, 0x44, 0x44, 0x28, 0x10,
++ 0x7c, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x82, 0x82, 0x44, 0x44, 0x28, 0x28, 0x10, 0x7c, 0x10, 0x10, 0x00,
++ 0x00, 0x00, 0x42, 0x42, 0x24, 0x24, 0x18, 0x18, 0x24, 0x24, 0x42, 0x43,
++ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x24,
++ 0x18, 0x24, 0x42, 0x43, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x02, 0x03, 0x01, 0x01, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x03,
++ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x4a, 0x4a, 0x3e,
++ 0x0a, 0x0a, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x42, 0x4a, 0x4a, 0x3e, 0x0a, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x7c,
++ 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x3c,
++ 0x42, 0x02, 0x02, 0x7e, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x24, 0x24, 0x00, 0x3c, 0x02, 0x02, 0x7e, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x00, 0x92, 0x92, 0x92, 0x54, 0x38,
++ 0x54, 0x92, 0x92, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44,
++ 0x00, 0x92, 0x92, 0x54, 0x38, 0x54, 0x92, 0x92, 0x00, 0x00, 0x00, 0x00,
++ 0x24, 0x24, 0x00, 0x3c, 0x42, 0x42, 0x02, 0x1c, 0x02, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x3c, 0x42, 0x02,
++ 0x1c, 0x02, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x42,
++ 0x42, 0x46, 0x4a, 0x52, 0x62, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x24, 0x24, 0x00, 0x42, 0x42, 0x42, 0x46, 0x4a, 0x52, 0x62, 0x42, 0x42,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42,
++ 0x7e, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x3c,
++ 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x24, 0x24, 0x00, 0x3c, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x3c, 0x42, 0x02, 0x02, 0x1e,
++ 0x02, 0x02, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24,
++ 0x00, 0x3c, 0x42, 0x02, 0x1e, 0x02, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x3c, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x02, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x02, 0x02, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x12, 0x24, 0x00, 0x42,
++ 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x12, 0x24, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x02, 0x02, 0x3c, 0x00, 0x24, 0x24, 0x00, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24,
++ 0x00, 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
++ 0x48, 0x48, 0x00, 0x82, 0x82, 0x82, 0xf2, 0x8a, 0x8a, 0x8a, 0x8a, 0xf2,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x48, 0x00, 0x82, 0x82, 0xf2,
++ 0x8a, 0x8a, 0x8a, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x44,
++ 0x48, 0x50, 0x60, 0x60, 0x50, 0x48, 0x44, 0x42, 0x00, 0x3c, 0x00, 0x00,
++ 0x00, 0x00, 0x40, 0x40, 0x40, 0x42, 0x44, 0x48, 0x70, 0x48, 0x44, 0x42,
++ 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x78, 0x40,
++ 0x40, 0x40, 0x40, 0x7e, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x3c, 0x42, 0x42, 0x7e, 0x40, 0x40, 0x3c, 0x00, 0x10, 0x10, 0x00,
++ 0x32, 0x4c, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4c, 0x00, 0x3c, 0x42, 0x42,
++ 0x7e, 0x40, 0x40, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x10, 0x10, 0x00,
++ 0x00, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38,
++ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3c, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x10, 0x10, 0x00,
++ 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x3e, 0x00, 0x08, 0x08, 0x00, 0x64, 0x98, 0x00, 0x82,
++ 0x82, 0x44, 0x44, 0x28, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x32, 0x4c, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e,
++ 0x02, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x08, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08,
++ 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x24, 0x24,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x12, 0x12, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x24, 0x24, 0x48, 0x00, 0x00, 0x00, 0x00, 0x48, 0x48, 0x24,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x10,
++ 0x10, 0x7c, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x92,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xa8, 0x50, 0x10, 0x20, 0x20,
++ 0x40, 0x54, 0xaa, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10,
++ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x10,
++ 0x20, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x20, 0x10, 0x08, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x24, 0x24,
++ 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x24, 0x24,
++ 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xf0, 0x88, 0x88, 0x88, 0xf4, 0x84, 0x8e, 0x84, 0x84, 0x82,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x22, 0x40, 0xf8, 0x40,
++ 0xf8, 0x40, 0x22, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x10,
++ 0x10, 0x1c, 0x70, 0x1c, 0x70, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x96, 0x96, 0x96, 0xd0, 0xf0, 0xf0, 0xb0, 0x96, 0x90, 0x96,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x55, 0x55, 0x51, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x20, 0x40, 0xfe, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x38, 0x54, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0xfe,
++ 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x54, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x42, 0xff, 0x42, 0x24, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x54, 0x10, 0x10, 0x10,
++ 0x10, 0x54, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
++ 0x54, 0x10, 0x10, 0x10, 0x54, 0x38, 0x10, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x22, 0x42, 0xfe, 0x40, 0x20,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0xc0,
++ 0x7e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
++ 0x6c, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfc, 0x06, 0xfc, 0x08, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
++ 0x28, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x24, 0x7e, 0xc3, 0x7e, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x38, 0x6c, 0x28, 0x28, 0x28, 0x28, 0x6c, 0x38, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x02, 0x02, 0x02, 0x7e,
++ 0x02, 0x02, 0x02, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04,
++ 0x7c, 0x8a, 0x92, 0x92, 0xa2, 0x7c, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x1e, 0x20, 0x40, 0x40, 0x7e, 0x40, 0x40, 0x20, 0x1e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x20, 0x40, 0x7e,
++ 0x40, 0x20, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x06, 0x04, 0x04, 0x04, 0x04, 0x44, 0x44, 0x44, 0x24, 0x14, 0x0c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x92, 0x92,
++ 0x92, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x28, 0x28, 0x44, 0x44, 0x82, 0x82,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x44, 0x44,
++ 0x28, 0x28, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4c, 0x00,
++ 0x32, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x02, 0x7e, 0x08, 0x10, 0x7e, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x10, 0x20, 0x10,
++ 0x08, 0x04, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
++ 0x10, 0x08, 0x04, 0x08, 0x10, 0x20, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x28, 0x44, 0x82, 0x82, 0x82, 0x82, 0xfe,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x40, 0x40,
++ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x12,
++ 0x12, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x90, 0x90, 0x60,
++ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x88, 0x88, 0xf8,
++ 0x88, 0x88, 0x88, 0x00, 0x1f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00,
++ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0xf8, 0x00, 0x1f, 0x10, 0x1c, 0x10,
++ 0x10, 0x10, 0x00, 0x00, 0x00, 0x88, 0x88, 0x50, 0x50, 0x20, 0x20, 0x00,
++ 0x1f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0xf8, 0x80, 0xe0,
++ 0x80, 0x80, 0x80, 0x00, 0x1f, 0x10, 0x1c, 0x10, 0x10, 0x10, 0x00, 0x00,
++ 0x00, 0x70, 0x88, 0x80, 0x80, 0x88, 0x70, 0x00, 0x1e, 0x11, 0x11, 0x1e,
++ 0x12, 0x11, 0x00, 0x00, 0x00, 0x88, 0xc8, 0xa8, 0x98, 0x88, 0x88, 0x00,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa,
++ 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x00,
++ 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x00,
++ 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00,
++ 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
++ 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0xf0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0xf8, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f,
++ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf0,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
++ 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x1f, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f,
++ 0x1f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x1f, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf0,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0xf0, 0xf0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf8,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf8,
++ 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0xf8, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
++ 0xf0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0xff, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0xff, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x1f, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
++ 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xff, 0xf0, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xff,
++ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
++ 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xff,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0xff, 0xf0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xff, 0x1f, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xff,
++ 0xff, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0xff, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xff, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0xff, 0xf0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x1f, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xff,
++ 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0xff, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xff,
++ 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0xff, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x1f, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
++ 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x10,
++ 0x1f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x3f, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x2f, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x10,
++ 0xf0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0xf8, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x08, 0xe8, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x10,
++ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x2f, 0x20, 0x3f, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf0, 0x10,
++ 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0xe8, 0x08, 0xf8, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x10,
++ 0x1f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x28, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0x2f, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x2f, 0x20, 0x2f, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf0, 0x10,
++ 0xf0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x28, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0xe8, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0xe8, 0x08, 0xe8, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
++ 0xff, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0xff, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xef, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xff, 0x00,
++ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0xef, 0x00, 0xff, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xff, 0x10,
++ 0xff, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x28, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0xff, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0xef, 0x00, 0xef, 0x28, 0x28, 0x28,
++ 0x28, 0x28, 0x28, 0x28, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
++ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f,
++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
++ 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22,
++ 0x88, 0x22, 0x88, 0x22, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55,
++ 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xee, 0xbb, 0xee, 0xbb,
++ 0xee, 0xbb, 0xee, 0xbb, 0xee, 0xbb, 0xee, 0xbb, 0xee, 0xbb, 0xee, 0xbb,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0,
++ 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0,
++ 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f,
++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
++ 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x3c,
++ 0x3c, 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x38, 0x38,
++ 0x7c, 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0xc0, 0xf0, 0xfc, 0xff, 0xfc, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x3f, 0xff,
++ 0x3f, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x28, 0x44, 0x82, 0x44, 0x28, 0x10, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24,
++ 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xdb, 0xdb, 0xe7, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x7c, 0x82, 0xaa, 0x82, 0x82, 0xba,
++ 0x92, 0x82, 0x82, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xfe,
++ 0xd6, 0xfe, 0xfe, 0xc6, 0xee, 0xfe, 0xfe, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x10, 0x92, 0x54, 0x38, 0xee, 0x38, 0x54, 0x92, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x44, 0x44, 0x38,
++ 0x10, 0x7c, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x06,
++ 0x0a, 0x12, 0x38, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x10, 0x38, 0x7c, 0xfe, 0xfe, 0x7c, 0x10, 0x10, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x10, 0x54, 0xfe,
++ 0xfe, 0x54, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x3e, 0x22, 0x3e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xc0,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x42, 0x7e, 0x42, 0x42, 0x42,
++ 0x42, 0x42, 0x42, 0x44, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c,
++ 0xfe, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7c,
++ 0xd6, 0xd0, 0xd0, 0x7c, 0x16, 0x16, 0xd6, 0x7c, 0x10, 0x10, 0x00, 0x00,
++ 0x00, 0x00, 0x66, 0xd6, 0x6c, 0x0c, 0x18, 0x18, 0x30, 0x36, 0x6b, 0x66,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc,
++ 0xcc, 0xcc, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18,
++ 0x00, 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, 0x6c, 0x38, 0xfe, 0x38, 0x6c, 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, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x06, 0x06, 0x0c, 0x0c, 0x18, 0x18, 0x30, 0x30, 0x60, 0x60,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6,
++ 0xe6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38,
++ 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xfe,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x06, 0x3c, 0x06,
++ 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0e,
++ 0x1e, 0x36, 0x66, 0xc6, 0xfe, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x60, 0xc0, 0xc0, 0xfc, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06,
++ 0x06, 0x0c, 0x0c, 0x18, 0x18, 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, 0xc6, 0x7e,
++ 0x06, 0x06, 0x0c, 0x78, 0x00, 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, 0x06, 0x0c, 0x18, 0x30, 0x60,
++ 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xfe, 0x00, 0x00, 0xfe, 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, 0xc6, 0x0c, 0x18,
++ 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
++ 0xce, 0xd6, 0xd6, 0xd6, 0xd6, 0xce, 0xc0, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xfc, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
++ 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xf8, 0xcc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xcc, 0xf8,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0,
++ 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
++ 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0xc6, 0x7c,
++ 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, 0x0c, 0xcc, 0xcc, 0x78,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xcc, 0xd8, 0xf0, 0xf0,
++ 0xd8, 0xcc, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
++ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x82, 0xc6, 0xee, 0xfe, 0xd6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xe6, 0xf6, 0xde,
++ 0xce, 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, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xde, 0x7c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xfc, 0xf0, 0xd8, 0xcc, 0xc6, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0x7c, 0x06, 0x06, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 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, 0x6c, 0x6c, 0x6c, 0x38, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6,
++ 0xfe, 0xee, 0xc6, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6,
++ 0x6c, 0x6c, 0x38, 0x38, 0x6c, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x0c, 0x18, 0x30,
++ 0x60, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30,
++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0c, 0x0c, 0x06, 0x06,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
++ 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66,
++ 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, 0xfe, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7c, 0x06, 0x7e, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0,
++ 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06,
++ 0x06, 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc0, 0xc0, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x30, 0xfc, 0x30, 0x30,
++ 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x7c, 0x00,
++ 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 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, 0xc0, 0xc0, 0xc0, 0xc6, 0xcc, 0xd8, 0xf0, 0xd8, 0xcc, 0xc6,
++ 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, 0xfc, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 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, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0xc0, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xf0, 0xe0,
++ 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7e, 0xc0, 0xc0, 0x7c, 0x06, 0x06, 0xfc, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x30, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xd6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x6c,
++ 0x38, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x7c, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xfe,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x30, 0x30, 0x60, 0x30,
++ 0x30, 0x30, 0x30, 0x1c, 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, 0x0c, 0x18, 0x18, 0x18, 0x18, 0x70,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xdb, 0xce, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
++ 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x10, 0x10, 0x7c, 0xd6, 0xd0, 0xd0, 0xd0, 0xd6, 0x7c,
++ 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x60, 0x60, 0xf8, 0x60,
++ 0x60, 0x60, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x66, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x7e, 0x18, 0x18,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60,
++ 0x38, 0x6c, 0x66, 0x66, 0x36, 0x1c, 0x06, 0x66, 0x3c, 0x00, 0x00, 0x00,
++ 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x06, 0x3e, 0x66, 0x3e, 0x00, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x1b, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x1b, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
++ 0x18, 0x18, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x18,
++ 0x30, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x78, 0x0c, 0x38, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xce, 0xf6, 0xc0, 0xc0, 0xc0, 0x00,
++ 0x00, 0x00, 0x7e, 0xd6, 0xd6, 0xd6, 0xd6, 0x76, 0x16, 0x16, 0x16, 0x16,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x60, 0x00, 0x00, 0x18, 0x38, 0x18,
++ 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
++ 0x1b, 0x36, 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe0, 0x62,
++ 0x66, 0x6c, 0x18, 0x30, 0x66, 0xce, 0x9a, 0x3e, 0x06, 0x06, 0x00, 0x00,
++ 0x00, 0x60, 0xe0, 0x62, 0x66, 0x6c, 0x18, 0x30, 0x60, 0xdc, 0xb6, 0x0c,
++ 0x18, 0x3e, 0x00, 0x00, 0x00, 0xe0, 0x30, 0x62, 0x36, 0xec, 0x18, 0x30,
++ 0x66, 0xce, 0x9a, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30,
++ 0x00, 0x30, 0x30, 0x60, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xfe,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x00, 0x7c,
++ 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
++ 0x76, 0xdc, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xfe,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x7c,
++ 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0xfe, 0xd8, 0xd8, 0xd8, 0xd8, 0xde,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0,
++ 0xc0, 0xc6, 0xc6, 0x7c, 0x30, 0x30, 0x60, 0x00, 0x30, 0x18, 0x00, 0xfe,
++ 0xc0, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x30, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0, 0xfe,
++ 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xf8,
++ 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0xfe,
++ 0xc0, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00,
++ 0x30, 0x18, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x00, 0x3c,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x66, 0x66, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x6c, 0x66, 0x66, 0xf6, 0x66,
++ 0x66, 0x66, 0x6c, 0x78, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0xc6,
++ 0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
++ 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x00, 0x7c,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x76, 0xdc, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7c, 0xc7, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x38, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0xc3, 0xc3,
++ 0x66, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xc8, 0xfc, 0xc6,
++ 0xc6, 0xc6, 0xe6, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
++ 0x00, 0x7c, 0x06, 0x7e, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x18, 0x30, 0x00, 0x7c, 0x06, 0x7e, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x00, 0x7c, 0x06, 0x7e,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc,
++ 0x00, 0x7c, 0x06, 0x7e, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c, 0x06, 0x7e, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x7c, 0x06, 0x7e,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x6c, 0x16, 0x16, 0x7e, 0xd0, 0xd0, 0x6c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
++ 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6,
++ 0xfe, 0xc0, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30,
++ 0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc0, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc0, 0xc0, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c, 0xc6, 0xc6,
++ 0xfe, 0xc0, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
++ 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x0c, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x00, 0x38, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c,
++ 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x68, 0x30, 0x58, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0xfc, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
++ 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc,
++ 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e,
++ 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x3d, 0x67, 0x6e, 0x7e, 0x76, 0xe6, 0xbc, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x30, 0x18, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
++ 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x6c, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x7c, 0x00, 0x00, 0x00, 0xc0, 0xc0,
++ 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0xc0, 0x00,
++ 0x00, 0x00, 0x6c, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x06, 0x06, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
++ 0x00, 0x7c, 0x06, 0x7e, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x6c, 0x38, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38, 0x00, 0x7c, 0x06, 0x7e,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x06, 0x0c, 0x07, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x06, 0x7e, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x06, 0x0c, 0x07, 0x00, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xc6, 0xc0, 0xc0,
++ 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30,
++ 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc0,
++ 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7c,
++ 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x18, 0x18, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38, 0x00, 0x7c, 0xc6, 0xc6, 0xc0, 0xc0,
++ 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38,
++ 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x6c, 0x38, 0x00, 0xf8, 0xcc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xcc, 0xf8,
++ 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38, 0x06, 0x06, 0x06, 0x7e, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1f,
++ 0x06, 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x7c, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x7c, 0xc6, 0xc6,
++ 0xfe, 0xc0, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38, 0x00, 0xfe,
++ 0xc0, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x6c, 0x38, 0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc0, 0xc0, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xf8,
++ 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
++ 0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc0, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe,
++ 0x06, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
++ 0xfe, 0xc0, 0xc0, 0x7c, 0x18, 0x30, 0x1c, 0x00, 0x38, 0x6c, 0x00, 0x7c,
++ 0xc6, 0xc6, 0xc0, 0xde, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x38, 0x6c, 0x00, 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x06, 0x06, 0x7c, 0x00, 0x6c, 0x38, 0x00, 0x7c, 0xc6, 0xc6, 0xc0, 0xde,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38,
++ 0x00, 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x7c, 0x00,
++ 0x18, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc0, 0xde, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x7c, 0x00, 0x00, 0x00, 0x7c, 0xc6,
++ 0xc6, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x30, 0x30, 0x60,
++ 0x00, 0x0c, 0x18, 0x18, 0x00, 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x06, 0x06, 0x7c, 0x00, 0x38, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x36, 0xc0, 0xc0,
++ 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x66, 0xff, 0x66, 0x66, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x66,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xf8, 0x60, 0x7c, 0x66, 0x66,
++ 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x3c,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x76, 0xdc, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
++ 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x6c, 0x38, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38, 0x00, 0x38, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x18, 0x30, 0x1c, 0x00,
++ 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
++ 0x18, 0x30, 0x1c, 0x00, 0x18, 0x18, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xcf, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xf6, 0xf6, 0xdc,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x36, 0x36, 0x1c, 0x00, 0x1c, 0x36, 0x00, 0x1e,
++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x0e, 0x1b, 0x00, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
++ 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xcc, 0xd8, 0xf0, 0xf0,
++ 0xd8, 0xcc, 0xc6, 0xc6, 0x00, 0x30, 0x30, 0x60, 0x00, 0x00, 0xc0, 0xc0,
++ 0xc0, 0xc6, 0xcc, 0xd8, 0xf0, 0xd8, 0xcc, 0xc6, 0x00, 0x30, 0x30, 0x60,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xcc, 0xd8, 0xf0, 0xd8, 0xcc, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
++ 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x38,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe,
++ 0x00, 0x30, 0x30, 0x60, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x3c, 0x00, 0x18, 0x18, 0x30, 0x6c, 0x38, 0xc0, 0xc0,
++ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00,
++ 0x6c, 0x38, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xcc, 0xcc,
++ 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18,
++ 0x18, 0x18, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x70, 0xe0, 0x60, 0x60, 0x60, 0x7f,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x1c, 0x38,
++ 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0xc6, 0xc6,
++ 0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x18, 0x30, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xe6, 0xf6, 0xde,
++ 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x30, 0x30, 0x60,
++ 0x6c, 0x38, 0xc6, 0xc6, 0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38, 0x00, 0xfc, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0xc0,
++ 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0xc6,
++ 0x06, 0x06, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x06, 0x06, 0x1c, 0x00, 0x7c, 0x00, 0x7c, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x7c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38,
++ 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x36, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0x00, 0x7c, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8,
++ 0xd8, 0xd8, 0xde, 0xd8, 0xd8, 0xd8, 0xd8, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xd6, 0xd6, 0xde, 0xd0, 0xd0, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xfc,
++ 0xf0, 0xd8, 0xcc, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30,
++ 0x00, 0xde, 0xf0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0xf0, 0xd8, 0xcc, 0xc6,
++ 0x00, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x78, 0x70,
++ 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x60, 0xc0, 0x6c, 0x38, 0x00, 0xfc,
++ 0xc6, 0xc6, 0xc6, 0xfc, 0xf0, 0xd8, 0xcc, 0xc6, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x6c, 0x38, 0x00, 0xde, 0xf0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0x7c,
++ 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18,
++ 0x00, 0x7e, 0xc0, 0xc0, 0x7c, 0x06, 0x06, 0xfc, 0x00, 0x00, 0x00, 0x00,
++ 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0x7c, 0x06, 0x06, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x00, 0x7e, 0xc0, 0xc0,
++ 0x7c, 0x06, 0x06, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
++ 0xc0, 0xc0, 0x7c, 0x06, 0x06, 0xc6, 0xc6, 0x7c, 0x30, 0x30, 0x60, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xc0, 0xc0, 0x7c, 0x06, 0x06, 0xfc,
++ 0x30, 0x30, 0x60, 0x00, 0x6c, 0x38, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0x7c,
++ 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38,
++ 0x00, 0x7e, 0xc0, 0xc0, 0x7c, 0x06, 0x06, 0xfc, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x0c, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0xfc, 0x30, 0x30,
++ 0x30, 0x30, 0x30, 0x1e, 0x0c, 0x0c, 0x18, 0x00, 0x6c, 0x38, 0x00, 0xff,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x6c, 0x38, 0x00, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x7e, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30,
++ 0x30, 0xfc, 0x30, 0x78, 0x30, 0x30, 0x30, 0x1e, 0x00, 0x00, 0x00, 0x00,
++ 0x76, 0xdc, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x7c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38,
++ 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x38, 0x6c, 0x38, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0x00, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x36, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x18, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x07, 0x00,
++ 0x38, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x82,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x00, 0xc6, 0xc6, 0xd6,
++ 0xd6, 0xd6, 0xd6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0xc3,
++ 0xc3, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x30, 0x00, 0xfe, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc0, 0xfe,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0xfe, 0x0c, 0x18,
++ 0x30, 0x60, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0xfe,
++ 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x18, 0x18, 0x00, 0xfe, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xfe,
++ 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38, 0x00, 0xfe, 0x06, 0x0c, 0x18, 0x30,
++ 0x60, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38,
++ 0x00, 0xfe, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x1e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x06, 0x06, 0x06,
++ 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06,
++ 0x06, 0x06, 0x3e, 0x06, 0x06, 0x06, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc0, 0x78, 0xc0,
++ 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b,
++ 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0x70, 0x00,
++ 0x00, 0x00, 0x66, 0x66, 0x66, 0x76, 0x7e, 0x6e, 0x66, 0x66, 0x66, 0x66,
++ 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0xfe, 0x06,
++ 0x0c, 0x18, 0x3c, 0x06, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0x7c, 0x06, 0x06, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xc0, 0xc0,
++ 0x7c, 0x06, 0x06, 0xfc, 0x00, 0x30, 0x30, 0x60, 0x00, 0x00, 0xff, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x30,
++ 0x00, 0x00, 0x30, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1e,
++ 0x00, 0x0c, 0x0c, 0x18, 0x7e, 0x00, 0xc3, 0xc3, 0x66, 0x66, 0x3c, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
++ 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x7c, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
++ 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x06,
++ 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0x06, 0x06, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x06, 0x06, 0xfe, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0,
++ 0x78, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x60, 0x60, 0xc0, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x0c, 0x18, 0x3c, 0x06, 0x06,
++ 0xc6, 0xc6, 0x7c, 0x00, 0x18, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x18, 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, 0x00, 0x06, 0x0c, 0x07, 0x00, 0x76, 0xdc, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x36, 0x6c, 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, 0x00, 0x00, 0x18, 0x18, 0x00, 0x60, 0xc0, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x30, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x60, 0xc0, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0, 0xfe,
++ 0x00, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x3c, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x60, 0xc0, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x00, 0xc3, 0xc3, 0x66, 0x66, 0x3c,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x7c, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x30, 0xd8, 0xd8, 0x00, 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
++ 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,
++ 0x38, 0x38, 0x6c, 0x6c, 0x6c, 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x38, 0x38, 0x6c, 0x6c,
++ 0x6c, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00,
++ 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0x60, 0x30, 0x18, 0x18,
++ 0x30, 0x60, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7c,
++ 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0x7c, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0x7c, 0x10, 0x10,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30,
++ 0x00, 0x7a, 0xce, 0xcc, 0xcc, 0xcc, 0xce, 0x7a, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xc0, 0x78, 0xc0, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0xfc, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x18, 0x30,
++ 0x00, 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x30, 0x00, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0xce, 0xcc,
++ 0xcc, 0xcc, 0xce, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xcc,
++ 0xcc, 0xc8, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0xc0, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18,
++ 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x7e, 0x30, 0x18, 0x7c, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x0c,
++ 0x18, 0x30, 0x60, 0xc0, 0xc0, 0xc0, 0xc0, 0x7c, 0x06, 0x06, 0x0c, 0x00,
++ 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x30, 0x30,
++ 0x30, 0x30, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30,
++ 0x18, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7e, 0xc0, 0xc0, 0xc0, 0x7c, 0xc0, 0xc0, 0xc0, 0xc0, 0x7c,
++ 0x06, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0xc0, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0x7c,
++ 0x06, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x66, 0x66,
++ 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xd6, 0xd6,
++ 0xd6, 0xd6, 0xd6, 0x7c, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xc6, 0xc6, 0x6c, 0x6c, 0x38, 0x38, 0x6c, 0x6c, 0xc6, 0xc6, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0x7c,
++ 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xc6, 0xd6,
++ 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0xd8,
++ 0x00, 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x6c, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30,
++ 0x00, 0x44, 0xc6, 0xd6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x7c, 0x66, 0x66,
++ 0x66, 0x66, 0x66, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0xfe,
++ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xd0, 0xdc, 0xd6, 0xd6,
++ 0xd6, 0xd6, 0xd6, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xd0,
++ 0xd0, 0xdc, 0xf6, 0xd6, 0xd6, 0xd6, 0xd6, 0xdc, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xf0, 0x60, 0x60, 0x7c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0xc6, 0xc6, 0xcc, 0xd8, 0xf0, 0xf0,
++ 0xd8, 0xcc, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0xc6, 0xc6,
++ 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
++ 0x6c, 0x38, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xfe, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc0,
++ 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x3e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xff,
++ 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xd6, 0xd6, 0x7c, 0x38, 0x7c,
++ 0xd6, 0xd6, 0xd6, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6,
++ 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
++ 0x6c, 0x38, 0xc6, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x36, 0x66, 0x66, 0x66, 0x66,
++ 0x66, 0x66, 0x66, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x10, 0x7c, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0x7c,
++ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6,
++ 0xd6, 0xd6, 0xd6, 0x7f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60,
++ 0x60, 0x7c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xe6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xe6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x7c, 0x66, 0x66,
++ 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
++ 0x06, 0x06, 0x3e, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xcc, 0xd6, 0xd6, 0xd6, 0xd6, 0xf6, 0xd6, 0xd6, 0xd6, 0xcc,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x1e, 0x36, 0x66, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc0,
++ 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xc8, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0,
++ 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xd6, 0xd6, 0x7c, 0x38, 0x7c, 0xd6, 0xd6, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x3c, 0x06, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x66, 0x66,
++ 0x66, 0x66, 0x66, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xc6, 0xee, 0xfe, 0xd6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x10, 0x7c, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0x7c, 0x10, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7f,
++ 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
++ 0x7e, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0x7f,
++ 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60, 0x7c,
++ 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xc6, 0xc6, 0xe6, 0xd6, 0xd6, 0xd6, 0xe6, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x7c, 0x66, 0x66, 0x66, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x06,
++ 0x3e, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xcc, 0xd6, 0xd6, 0xf6, 0xd6, 0xd6, 0xcc, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xc6, 0xc6, 0x7e, 0x36, 0x66, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xf8, 0x60, 0x7c, 0x66, 0x66,
++ 0x66, 0x66, 0x66, 0x66, 0x06, 0x06, 0x1c, 0x00, 0x00, 0x00, 0x18, 0x30,
++ 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xf8, 0xc0, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xd0, 0xdc,
++ 0xd6, 0xd6, 0xd6, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xd0, 0xd0, 0xdc, 0xf6, 0xd6, 0xd6, 0xdc, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x18, 0x30, 0x00, 0xc6, 0xcc, 0xd8, 0xf0, 0xd8, 0xcc, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38, 0x00, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0x38, 0x38, 0x00, 0x00,
++ 0x06, 0x06, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0xfe, 0xc0, 0xc0,
++ 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x60,
++ 0x60, 0x60, 0xfc, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x60, 0x60, 0xfc, 0x60, 0x60, 0x60,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xfe, 0xc0, 0xc0, 0xf8, 0xcc, 0xcc, 0xcc, 0x0c, 0x18, 0x00, 0x00,
++ 0x00, 0x00, 0xd6, 0xd6, 0xd6, 0x7c, 0x38, 0x7c, 0xd6, 0xd6, 0xd6, 0xd7,
++ 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xd6, 0x7c,
++ 0x38, 0x7c, 0xd6, 0xd7, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
++ 0xc6, 0x06, 0x3c, 0x06, 0x06, 0xc6, 0xc6, 0x7c, 0x30, 0x30, 0x30, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x3c, 0x06, 0xc6, 0x7c,
++ 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xcc, 0xd8, 0xf0, 0xf0,
++ 0xd8, 0xcc, 0xc6, 0xc7, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xc6, 0xcc, 0xd8, 0xf0, 0xd8, 0xcc, 0xc7, 0x03, 0x03, 0x00, 0x00,
++ 0x00, 0x00, 0xc6, 0xc6, 0xd6, 0xdc, 0xf8, 0xf8, 0xdc, 0xd6, 0xc6, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xd6, 0xdc,
++ 0xf8, 0xdc, 0xd6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3, 0xe3,
++ 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x63, 0x63, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0x63,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xc7, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc7, 0x03, 0x03, 0x00, 0x00,
++ 0x00, 0x00, 0xcf, 0xcc, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xcc, 0xcc,
++ 0xfc, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
++ 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc6, 0xc6, 0x7c, 0x30, 0x30, 0x30, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
++ 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x66, 0x3c, 0x18,
++ 0x7e, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xc3, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x7e, 0x18, 0x18, 0x00,
++ 0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x6c, 0x38, 0x38, 0x6c, 0x6c, 0xc6, 0xc7,
++ 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x6c,
++ 0x38, 0x6c, 0xc6, 0xc7, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x07, 0x03, 0x03, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x07,
++ 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 0x7e,
++ 0x16, 0x16, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xc6, 0xd6, 0xd6, 0x7e, 0x16, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xfc,
++ 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c,
++ 0xc6, 0x06, 0x06, 0xfe, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c, 0x06, 0x06, 0xfe, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0xd6, 0xd6, 0xd6, 0x7c, 0x38,
++ 0x7c, 0xd6, 0xd6, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c,
++ 0x00, 0xd6, 0xd6, 0x7c, 0x38, 0x7c, 0xd6, 0xd6, 0x00, 0x00, 0x00, 0x00,
++ 0x6c, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0x06, 0x3c, 0x06, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c, 0xc6, 0x06,
++ 0x3c, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0xc6, 0xc6,
++ 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
++ 0x6c, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
++ 0xfe, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c,
++ 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3e,
++ 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c,
++ 0x00, 0x7c, 0xc6, 0x06, 0x3e, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x7c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x7c,
++ 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x06, 0x06, 0x06, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0x00, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x7c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x36, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x06, 0x06, 0x7c, 0x00, 0x6c, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c,
++ 0x00, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00,
++ 0x6c, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xe6, 0xd6, 0xd6, 0xd6, 0xd6, 0xe6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0xc6, 0xc6, 0xe6,
++ 0xd6, 0xd6, 0xd6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6,
++ 0xcc, 0xd8, 0xf0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc6, 0x00, 0x7c, 0x00, 0x00,
++ 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc6, 0xcc, 0xd8, 0xf0, 0xd8, 0xcc, 0xc6,
++ 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0,
++ 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc0, 0xc0, 0x7c, 0x00, 0x18, 0x18, 0x00,
++ 0x76, 0xdc, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0, 0xfe,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x7c, 0xc6, 0xc6,
++ 0xfe, 0xc0, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x18, 0x18, 0x00,
++ 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
++ 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x18, 0x18, 0x00,
++ 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
++ 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x18, 0x18, 0x00, 0x76, 0xdc, 0x00, 0xc3,
++ 0xc3, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x76, 0xdc, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e,
++ 0x06, 0x06, 0x7c, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0xfe,
++ 0x00, 0x18, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x18,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x66, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x66, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0xcc, 0x00, 0x00, 0x00,
++ 0x00, 0xcc, 0xcc, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
++ 0x7e, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0xdb,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xac, 0xf8, 0x18, 0x30, 0x30,
++ 0x60, 0x7f, 0xd5, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18,
++ 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
++ 0x60, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66,
++ 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x6c, 0x6c,
++ 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0xfa, 0xc6, 0xcf, 0xc6, 0xc6, 0xc3,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x33, 0x60, 0xfc, 0x60,
++ 0xfc, 0x60, 0x33, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18,
++ 0x18, 0x1e, 0x78, 0x1e, 0x78, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, 0xfe, 0xfe, 0x60, 0x20, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x08, 0x0c, 0xfe, 0xfe, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xff,
++ 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
++ 0x7e, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x26, 0x66,
++ 0xfe, 0xfe, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x10, 0x3e, 0x7e, 0xe0, 0x7e, 0x3e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x10, 0x38, 0x7c, 0xee, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf8, 0xfc, 0x0e,
++ 0xfc, 0xf8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c,
++ 0x6c, 0x6c, 0x6c, 0x6c, 0xee, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x24, 0x7e, 0xff, 0xc3, 0xff, 0x7e, 0x24, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xee, 0x6c, 0x6c,
++ 0xee, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
++ 0x06, 0x06, 0x06, 0xfe, 0x06, 0x06, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x06, 0x0c, 0x7c, 0xce, 0xde, 0xf6, 0xe6, 0x7c, 0x60, 0xc0,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x60, 0xc0, 0xc0, 0xfe,
++ 0xc0, 0xc0, 0x60, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x3e, 0x60, 0xc0, 0xfe, 0xc0, 0x60, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc,
++ 0xcc, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7c, 0xd6, 0xd6, 0xd6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x38, 0x38,
++ 0x6c, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0xc6, 0xc6, 0x6c, 0x6c, 0x38, 0x38, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x06, 0xfe, 0x18, 0x30, 0xfe, 0xc0, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe,
++ 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
++ 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
++ 0xc6, 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xfc,
++ 0xcc, 0xcc, 0xcc, 0x00, 0x3f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00,
++ 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf8, 0x00, 0x3f, 0x30, 0x3c, 0x30,
++ 0x30, 0x30, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00,
++ 0x3f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0xfc, 0xc0, 0xf0,
++ 0xc0, 0xc0, 0xc0, 0x00, 0x3f, 0x30, 0x3c, 0x30, 0x30, 0x30, 0x00, 0x00,
++ 0x00, 0x78, 0xcc, 0xc0, 0xc0, 0xcc, 0x78, 0x00, 0x3e, 0x33, 0x33, 0x3e,
++ 0x36, 0x33, 0x00, 0x00, 0x00, 0xcc, 0xec, 0xfc, 0xdc, 0xcc, 0xcc, 0x00,
++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa,
++ 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x00,
++ 0x38, 0x38, 0x38, 0x00, 0x38, 0x38, 0x38, 0x00, 0x38, 0x38, 0x38, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
++ 0x3f, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0xf8, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
++ 0xf8, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xf8, 0xf8, 0xf8, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x3f,
++ 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0xf8, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xf8,
++ 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0xf8, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x1f, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x3f,
++ 0x3f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x3f, 0x3f, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x3f, 0x3f, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x3f, 0x3f,
++ 0x3f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x3f, 0x3f, 0x3f, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x3f, 0x3f, 0x3f, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8,
++ 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x38, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0xf8, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xf8,
++ 0xf8, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0xf8, 0xf8, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0xf8, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xf8, 0xf8,
++ 0xf8, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xf8, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
++ 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0xff, 0xff, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff,
++ 0xff, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0xff, 0xff, 0xff, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0xff,
++ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xff, 0xff, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xf8, 0xff,
++ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x3f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xff,
++ 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x1f, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0xff, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xff,
++ 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0xff, 0xff, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xff, 0xff, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xf8, 0xff,
++ 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x38, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x3f, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xff, 0xff, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0xff,
++ 0xff, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0xff, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0xff, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xf8, 0xff,
++ 0xff, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x3f, 0xff, 0xff, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xff, 0xff, 0xff, 0x38, 0x38, 0x38,
++ 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
++ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x18, 0x1f, 0x1f, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,
++ 0x7f, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7f, 0x7f, 0x60, 0x6f, 0x6f, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0x18, 0xf8, 0xf8, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
++ 0xfc, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xfc, 0xfc, 0x0c, 0xec, 0xec, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x18, 0x1f, 0x1f, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x7f,
++ 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x6c, 0x6f, 0x6f, 0x60, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0x18, 0xf8, 0xf8, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0xfc,
++ 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x6c, 0xec, 0xec, 0x0c, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x18, 0x1f, 0x1f, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6f,
++ 0x6f, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x6c, 0x6f, 0x6f, 0x60, 0x6f, 0x6f, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0x18, 0xf8, 0xf8, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0xec,
++ 0xec, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x6c, 0xec, 0xec, 0x0c, 0xec, 0xec, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
++ 0xff, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xff, 0xff, 0x00, 0xef, 0xef, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0xff,
++ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x6c, 0xef, 0xef, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0x18, 0xff, 0xff, 0x18, 0x18,
++ 0x18, 0x18, 0x18, 0x18, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0xff,
++ 0xff, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x6c, 0xef, 0xef, 0x00, 0xef, 0xef, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe,
++ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x3c, 0x3c, 0x7e, 0x7e, 0xff, 0xff,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xfc, 0xff,
++ 0xff, 0xfc, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0xff, 0xff, 0x7e, 0x7e, 0x3c, 0x3c, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x3f, 0xff, 0xff, 0x3f, 0x0f, 0x03,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff,
++ 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x18, 0x3c, 0x66, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
++ 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x18,
++ 0xdb, 0x7e, 0x3c, 0xe7, 0x3c, 0x7e, 0xdb, 0x18, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x0e, 0x1a, 0x32, 0x78, 0xcc,
++ 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
++ 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x5a, 0xff, 0xff, 0x5a, 0x18, 0x3c,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x66, 0x7e, 0x60, 0x60, 0x60,
++ 0x60, 0x60, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x66,
++ 0x7e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6e, 0xec, 0xc0, 0x00, 0x00, 0x00,
++};
++
++static struct vt_font_map font_mapping_normal[248] = {
++ { 0x0020, 0x0001, 0x5e }, { 0x00a0, 0x0001, 0x00 },
++ { 0x00a1, 0x0060, 0x6e }, { 0x0110, 0x008f, 0x00 },
++ { 0x0111, 0x00cf, 0x08 }, { 0x011a, 0x00d2, 0x01 },
++ { 0x011c, 0x00d8, 0x59 }, { 0x0178, 0x0132, 0x07 },
++ { 0x0186, 0x013a, 0x00 }, { 0x018e, 0x013b, 0x02 },
++ { 0x0192, 0x013e, 0x00 }, { 0x019d, 0x013f, 0x01 },
++ { 0x01b7, 0x0141, 0x00 }, { 0x0218, 0x0142, 0x03 },
++ { 0x0232, 0x0146, 0x01 }, { 0x0237, 0x0148, 0x00 },
++ { 0x0254, 0x0149, 0x00 }, { 0x0258, 0x014a, 0x01 },
++ { 0x025b, 0x014c, 0x00 }, { 0x0272, 0x014d, 0x00 },
++ { 0x0292, 0x014e, 0x00 }, { 0x02bb, 0x014f, 0x02 },
++ { 0x02c6, 0x0152, 0x01 }, { 0x02d8, 0x0153, 0x01 },
++ { 0x02db, 0x0155, 0x02 }, { 0x0300, 0x0041, 0x00 },
++ { 0x0301, 0x0073, 0x00 }, { 0x0302, 0x0152, 0x00 },
++ { 0x0303, 0x0156, 0x00 }, { 0x0306, 0x0153, 0x00 },
++ { 0x030c, 0x0153, 0x00 }, { 0x0329, 0x0158, 0x00 },
++ { 0x0384, 0x0159, 0x06 }, { 0x038c, 0x0160, 0x00 },
++ { 0x038e, 0x0161, 0x02 }, { 0x0391, 0x0022, 0x01 },
++ { 0x0393, 0x0164, 0x01 }, { 0x0395, 0x0026, 0x00 },
++ { 0x0396, 0x003b, 0x00 }, { 0x0397, 0x0029, 0x00 },
++ { 0x0398, 0x0166, 0x00 }, { 0x0399, 0x002a, 0x00 },
++ { 0x039a, 0x002c, 0x00 }, { 0x039b, 0x0167, 0x00 },
++ { 0x039c, 0x002e, 0x01 }, { 0x039e, 0x0168, 0x00 },
++ { 0x039f, 0x0030, 0x00 }, { 0x03a0, 0x0169, 0x00 },
++ { 0x03a1, 0x0031, 0x00 }, { 0x03a3, 0x016a, 0x00 },
++ { 0x03a4, 0x0035, 0x00 }, { 0x03a5, 0x003a, 0x00 },
++ { 0x03a6, 0x016b, 0x00 }, { 0x03a7, 0x0039, 0x00 },
++ { 0x03a8, 0x016c, 0x01 }, { 0x03aa, 0x008e, 0x00 },
++ { 0x03ab, 0x0132, 0x00 }, { 0x03ac, 0x016e, 0x08 },
++ { 0x03b5, 0x014c, 0x00 }, { 0x03b6, 0x0177, 0x00 },
++ { 0x03b7, 0x0140, 0x00 }, { 0x03b8, 0x0178, 0x01 },
++ { 0x03ba, 0x00f4, 0x00 }, { 0x03bb, 0x017a, 0x00 },
++ { 0x03bc, 0x0074, 0x00 }, { 0x03bd, 0x0057, 0x00 },
++ { 0x03be, 0x017b, 0x00 }, { 0x03bf, 0x0050, 0x00 },
++ { 0x03c0, 0x017c, 0x0b }, { 0x03cc, 0x00b2, 0x00 },
++ { 0x03cd, 0x0188, 0x01 }, { 0x03f3, 0x004b, 0x00 },
++ { 0x03f4, 0x018a, 0x00 }, { 0x0400, 0x0087, 0x00 },
++ { 0x0401, 0x008a, 0x00 }, { 0x0402, 0x018b, 0x02 },
++ { 0x0405, 0x0034, 0x00 }, { 0x0406, 0x002a, 0x00 },
++ { 0x0407, 0x008e, 0x00 }, { 0x0408, 0x002b, 0x00 },
++ { 0x0409, 0x018e, 0x06 }, { 0x0410, 0x0022, 0x00 },
++ { 0x0411, 0x0195, 0x00 }, { 0x0412, 0x0023, 0x00 },
++ { 0x0413, 0x0164, 0x00 }, { 0x0414, 0x0196, 0x00 },
++ { 0x0415, 0x0026, 0x00 }, { 0x0416, 0x0197, 0x00 },
++ { 0x0417, 0x0014, 0x00 }, { 0x0418, 0x0198, 0x01 },
++ { 0x041a, 0x002c, 0x00 }, { 0x041b, 0x019a, 0x00 },
++ { 0x041c, 0x002e, 0x00 }, { 0x041d, 0x0029, 0x00 },
++ { 0x041e, 0x0030, 0x00 }, { 0x041f, 0x0169, 0x00 },
++ { 0x0420, 0x0031, 0x00 }, { 0x0421, 0x0024, 0x00 },
++ { 0x0422, 0x0035, 0x00 }, { 0x0423, 0x019b, 0x01 },
++ { 0x0425, 0x0039, 0x00 }, { 0x0426, 0x019d, 0x05 },
++ { 0x042c, 0x0043, 0x00 }, { 0x042d, 0x01a3, 0x02 },
++ { 0x0430, 0x0042, 0x00 }, { 0x0431, 0x01a6, 0x02 },
++ { 0x0434, 0x0048, 0x00 }, { 0x0435, 0x0046, 0x00 },
++ { 0x0436, 0x01a9, 0x01 }, { 0x0438, 0x0056, 0x00 },
++ { 0x0439, 0x0129, 0x00 }, { 0x043a, 0x00f4, 0x00 },
++ { 0x043b, 0x01ab, 0x02 }, { 0x043e, 0x0050, 0x00 },
++ { 0x043f, 0x017c, 0x00 }, { 0x0440, 0x0051, 0x00 },
++ { 0x0441, 0x0044, 0x00 }, { 0x0442, 0x01ae, 0x00 },
++ { 0x0443, 0x005a, 0x00 }, { 0x0444, 0x01af, 0x00 },
++ { 0x0445, 0x0059, 0x00 }, { 0x0446, 0x01b0, 0x09 },
++ { 0x0450, 0x00a7, 0x00 }, { 0x0451, 0x00aa, 0x00 },
++ { 0x0452, 0x01ba, 0x02 }, { 0x0455, 0x0054, 0x00 },
++ { 0x0456, 0x004a, 0x00 }, { 0x0457, 0x00ae, 0x00 },
++ { 0x0458, 0x004b, 0x00 }, { 0x0459, 0x01bd, 0x01 },
++ { 0x045b, 0x00e3, 0x00 }, { 0x045c, 0x01bf, 0x00 },
++ { 0x045d, 0x00b8, 0x00 }, { 0x045e, 0x01c0, 0x01 },
++ { 0x0490, 0x01c2, 0x0d }, { 0x04a0, 0x01d0, 0x05 },
++ { 0x04aa, 0x01d6, 0x01 }, { 0x04ae, 0x003a, 0x00 },
++ { 0x04af, 0x0175, 0x00 }, { 0x04b0, 0x01d8, 0x03 },
++ { 0x04b6, 0x01dc, 0x05 }, { 0x04d0, 0x00c1, 0x01 },
++ { 0x04d2, 0x0083, 0x00 }, { 0x04d3, 0x00a3, 0x00 },
++ { 0x04d4, 0x0085, 0x00 }, { 0x04d5, 0x00a5, 0x00 },
++ { 0x04d6, 0x00d2, 0x01 }, { 0x04d8, 0x013c, 0x00 },
++ { 0x04d9, 0x014b, 0x00 }, { 0x04da, 0x01e2, 0x05 },
++ { 0x04e2, 0x01e8, 0x00 }, { 0x04e3, 0x0127, 0x00 },
++ { 0x04e4, 0x01e9, 0x00 }, { 0x04e5, 0x00bb, 0x00 },
++ { 0x04e6, 0x0095, 0x00 }, { 0x04e7, 0x00b5, 0x00 },
++ { 0x04e8, 0x018a, 0x00 }, { 0x04e9, 0x01ea, 0x05 },
++ { 0x04ef, 0x0147, 0x00 }, { 0x04f0, 0x01f0, 0x00 },
++ { 0x04f1, 0x00be, 0x00 }, { 0x04f2, 0x01f1, 0x03 },
++ { 0x04f8, 0x01f5, 0x01 }, { 0x1e34, 0x01f7, 0x01 },
++ { 0x1eb8, 0x01f9, 0x01 }, { 0x1ebc, 0x01fb, 0x01 },
++ { 0x1eca, 0x01fd, 0x03 }, { 0x1ee4, 0x0201, 0x01 },
++ { 0x1ef8, 0x0203, 0x01 }, { 0x2000, 0x0001, 0x00 },
++ { 0x2001, 0x0001, 0x00 }, { 0x2002, 0x0001, 0x00 },
++ { 0x2003, 0x0001, 0x00 }, { 0x2004, 0x0001, 0x00 },
++ { 0x2005, 0x0001, 0x00 }, { 0x2006, 0x0001, 0x00 },
++ { 0x2007, 0x0001, 0x00 }, { 0x2008, 0x0001, 0x00 },
++ { 0x2009, 0x0001, 0x00 }, { 0x200a, 0x0001, 0x00 },
++ { 0x2010, 0x006c, 0x00 }, { 0x2011, 0x006c, 0x00 },
++ { 0x2012, 0x000e, 0x00 }, { 0x2013, 0x000e, 0x00 },
++ { 0x2014, 0x0205, 0x00 }, { 0x2015, 0x0205, 0x0d },
++ { 0x2026, 0x0213, 0x00 }, { 0x2030, 0x0214, 0x00 },
++ { 0x2032, 0x0215, 0x01 }, { 0x2039, 0x0217, 0x01 },
++ { 0x203c, 0x0219, 0x00 }, { 0x203e, 0x021a, 0x00 },
++ { 0x207f, 0x021b, 0x00 }, { 0x20a7, 0x021c, 0x00 },
++ { 0x20ac, 0x021d, 0x00 }, { 0x20ae, 0x021e, 0x00 },
++ { 0x210e, 0x0049, 0x00 }, { 0x210f, 0x00e3, 0x00 },
++ { 0x2116, 0x021f, 0x00 }, { 0x2122, 0x0220, 0x00 },
++ { 0x2126, 0x016d, 0x00 }, { 0x2190, 0x0221, 0x05 },
++ { 0x21a8, 0x0227, 0x00 }, { 0x21b5, 0x0228, 0x00 },
++ { 0x21d0, 0x0229, 0x05 }, { 0x2203, 0x022f, 0x00 },
++ { 0x2205, 0x0230, 0x00 }, { 0x2206, 0x0165, 0x00 },
++ { 0x2208, 0x0231, 0x00 }, { 0x220a, 0x0232, 0x00 },
++ { 0x2212, 0x000e, 0x00 }, { 0x2219, 0x0233, 0x01 },
++ { 0x221e, 0x0235, 0x01 }, { 0x2227, 0x0237, 0x03 },
++ { 0x2248, 0x023b, 0x00 }, { 0x2260, 0x023c, 0x01 },
++ { 0x2264, 0x023e, 0x01 }, { 0x2302, 0x0240, 0x00 },
++ { 0x2310, 0x0241, 0x00 }, { 0x2320, 0x0242, 0x01 },
++ { 0x23ba, 0x0244, 0x03 }, { 0x2409, 0x0248, 0x04 },
++ { 0x2424, 0x024d, 0x00 }, { 0x2500, 0x024e, 0x03 },
++ { 0x2508, 0x0252, 0x43 }, { 0x2550, 0x0296, 0x1c },
++ { 0x2580, 0x02b3, 0x08 }, { 0x258c, 0x02bc, 0x00 },
++ { 0x2590, 0x02bd, 0x03 }, { 0x2596, 0x02c1, 0x0a },
++ { 0x25ac, 0x02cc, 0x00 }, { 0x25ae, 0x02cd, 0x00 },
++ { 0x25b2, 0x02ce, 0x00 }, { 0x25b6, 0x02cf, 0x00 },
++ { 0x25bc, 0x02d0, 0x00 }, { 0x25c0, 0x02d1, 0x00 },
++ { 0x25c6, 0x02d2, 0x00 }, { 0x25ca, 0x02d3, 0x01 },
++ { 0x25d8, 0x02d5, 0x01 }, { 0x263a, 0x02d7, 0x02 },
++ { 0x2640, 0x02da, 0x00 }, { 0x2642, 0x02db, 0x00 },
++ { 0x2660, 0x02dc, 0x00 }, { 0x2663, 0x02dd, 0x00 },
++ { 0x2665, 0x02de, 0x00 }, { 0x2666, 0x02d2, 0x00 },
++ { 0x266a, 0x02df, 0x01 }, { 0xf6be, 0x0148, 0x00 },
++};
++
++static struct vt_font_map font_mapping_bold[260] = {
++ { 0x0021, 0x02e1, 0x0b }, { 0x002d, 0x0205, 0x00 },
++ { 0x002e, 0x02ed, 0x50 }, { 0x00a1, 0x033e, 0x07 },
++ { 0x00aa, 0x0346, 0x03 }, { 0x00af, 0x034a, 0x07 },
++ { 0x00b7, 0x0233, 0x00 }, { 0x00b8, 0x0352, 0x57 },
++ { 0x0110, 0x036a, 0x00 }, { 0x0111, 0x03aa, 0x08 },
++ { 0x011a, 0x03ad, 0x01 }, { 0x011c, 0x03b3, 0x59 },
++ { 0x0178, 0x040d, 0x07 }, { 0x0186, 0x0415, 0x00 },
++ { 0x018e, 0x0416, 0x02 }, { 0x0192, 0x0419, 0x00 },
++ { 0x019d, 0x041a, 0x01 }, { 0x01b7, 0x041c, 0x00 },
++ { 0x0218, 0x041d, 0x03 }, { 0x0232, 0x0421, 0x01 },
++ { 0x0237, 0x0423, 0x00 }, { 0x0254, 0x0424, 0x00 },
++ { 0x0258, 0x0425, 0x01 }, { 0x025b, 0x0427, 0x00 },
++ { 0x0272, 0x0428, 0x00 }, { 0x0292, 0x0429, 0x00 },
++ { 0x02bb, 0x042a, 0x02 }, { 0x02c6, 0x042d, 0x01 },
++ { 0x02d8, 0x042e, 0x01 }, { 0x02db, 0x0430, 0x02 },
++ { 0x0300, 0x031f, 0x00 }, { 0x0301, 0x034f, 0x00 },
++ { 0x0302, 0x042d, 0x00 }, { 0x0303, 0x0431, 0x00 },
++ { 0x0306, 0x042e, 0x00 }, { 0x030c, 0x042e, 0x00 },
++ { 0x0329, 0x0433, 0x00 }, { 0x0384, 0x0434, 0x06 },
++ { 0x038c, 0x043b, 0x00 }, { 0x038e, 0x043c, 0x02 },
++ { 0x0391, 0x0300, 0x01 }, { 0x0393, 0x043f, 0x01 },
++ { 0x0395, 0x0304, 0x00 }, { 0x0396, 0x0319, 0x00 },
++ { 0x0397, 0x0307, 0x00 }, { 0x0398, 0x0441, 0x00 },
++ { 0x0399, 0x0308, 0x00 }, { 0x039a, 0x030a, 0x00 },
++ { 0x039b, 0x0442, 0x00 }, { 0x039c, 0x030c, 0x01 },
++ { 0x039e, 0x0443, 0x00 }, { 0x039f, 0x030e, 0x00 },
++ { 0x03a0, 0x0444, 0x00 }, { 0x03a1, 0x030f, 0x00 },
++ { 0x03a3, 0x0445, 0x00 }, { 0x03a4, 0x0313, 0x00 },
++ { 0x03a5, 0x0318, 0x00 }, { 0x03a6, 0x0446, 0x00 },
++ { 0x03a7, 0x0317, 0x00 }, { 0x03a8, 0x0447, 0x01 },
++ { 0x03aa, 0x0369, 0x00 }, { 0x03ab, 0x040d, 0x00 },
++ { 0x03ac, 0x0449, 0x08 }, { 0x03b5, 0x0427, 0x00 },
++ { 0x03b6, 0x0452, 0x00 }, { 0x03b7, 0x041b, 0x00 },
++ { 0x03b8, 0x0453, 0x01 }, { 0x03ba, 0x03cf, 0x00 },
++ { 0x03bb, 0x0455, 0x00 }, { 0x03bc, 0x0350, 0x00 },
++ { 0x03bd, 0x0335, 0x00 }, { 0x03be, 0x0456, 0x00 },
++ { 0x03bf, 0x032e, 0x00 }, { 0x03c0, 0x0457, 0x0b },
++ { 0x03cc, 0x038d, 0x00 }, { 0x03cd, 0x0463, 0x01 },
++ { 0x03f3, 0x0329, 0x00 }, { 0x03f4, 0x0465, 0x00 },
++ { 0x0400, 0x0362, 0x00 }, { 0x0401, 0x0365, 0x00 },
++ { 0x0402, 0x0466, 0x02 }, { 0x0405, 0x0312, 0x00 },
++ { 0x0406, 0x0308, 0x00 }, { 0x0407, 0x0369, 0x00 },
++ { 0x0408, 0x0309, 0x00 }, { 0x0409, 0x0469, 0x06 },
++ { 0x0410, 0x0300, 0x00 }, { 0x0411, 0x0470, 0x00 },
++ { 0x0412, 0x0301, 0x00 }, { 0x0413, 0x043f, 0x00 },
++ { 0x0414, 0x0471, 0x00 }, { 0x0415, 0x0304, 0x00 },
++ { 0x0416, 0x0472, 0x00 }, { 0x0417, 0x02f2, 0x00 },
++ { 0x0418, 0x0473, 0x01 }, { 0x041a, 0x030a, 0x00 },
++ { 0x041b, 0x0475, 0x00 }, { 0x041c, 0x030c, 0x00 },
++ { 0x041d, 0x0307, 0x00 }, { 0x041e, 0x030e, 0x00 },
++ { 0x041f, 0x0444, 0x00 }, { 0x0420, 0x030f, 0x00 },
++ { 0x0421, 0x0302, 0x00 }, { 0x0422, 0x0313, 0x00 },
++ { 0x0423, 0x0476, 0x01 }, { 0x0425, 0x0317, 0x00 },
++ { 0x0426, 0x0478, 0x09 }, { 0x0430, 0x0320, 0x00 },
++ { 0x0431, 0x0482, 0x02 }, { 0x0434, 0x0326, 0x00 },
++ { 0x0435, 0x0324, 0x00 }, { 0x0436, 0x0485, 0x01 },
++ { 0x0438, 0x0334, 0x00 }, { 0x0439, 0x0404, 0x00 },
++ { 0x043a, 0x03cf, 0x00 }, { 0x043b, 0x0487, 0x02 },
++ { 0x043e, 0x032e, 0x00 }, { 0x043f, 0x0457, 0x00 },
++ { 0x0440, 0x032f, 0x00 }, { 0x0441, 0x0322, 0x00 },
++ { 0x0442, 0x048a, 0x00 }, { 0x0443, 0x0338, 0x00 },
++ { 0x0444, 0x048b, 0x00 }, { 0x0445, 0x0337, 0x00 },
++ { 0x0446, 0x048c, 0x09 }, { 0x0450, 0x0382, 0x00 },
++ { 0x0451, 0x0385, 0x00 }, { 0x0452, 0x0496, 0x02 },
++ { 0x0455, 0x0332, 0x00 }, { 0x0456, 0x0328, 0x00 },
++ { 0x0457, 0x0389, 0x00 }, { 0x0458, 0x0329, 0x00 },
++ { 0x0459, 0x0499, 0x01 }, { 0x045b, 0x03be, 0x00 },
++ { 0x045c, 0x049b, 0x00 }, { 0x045d, 0x0393, 0x00 },
++ { 0x045e, 0x049c, 0x01 }, { 0x0490, 0x049e, 0x0d },
++ { 0x04a0, 0x04ac, 0x05 }, { 0x04aa, 0x04b2, 0x01 },
++ { 0x04ae, 0x0318, 0x00 }, { 0x04af, 0x0450, 0x00 },
++ { 0x04b0, 0x04b4, 0x03 }, { 0x04b6, 0x04b8, 0x05 },
++ { 0x04d0, 0x039c, 0x01 }, { 0x04d2, 0x035e, 0x00 },
++ { 0x04d3, 0x037e, 0x00 }, { 0x04d4, 0x0360, 0x00 },
++ { 0x04d5, 0x0380, 0x00 }, { 0x04d6, 0x03ad, 0x01 },
++ { 0x04d8, 0x0417, 0x00 }, { 0x04d9, 0x0426, 0x00 },
++ { 0x04da, 0x04be, 0x05 }, { 0x04e2, 0x04c4, 0x00 },
++ { 0x04e3, 0x0402, 0x00 }, { 0x04e4, 0x04c5, 0x00 },
++ { 0x04e5, 0x0396, 0x00 }, { 0x04e6, 0x0370, 0x00 },
++ { 0x04e7, 0x0390, 0x00 }, { 0x04e8, 0x0465, 0x00 },
++ { 0x04e9, 0x04c6, 0x05 }, { 0x04ef, 0x0422, 0x00 },
++ { 0x04f0, 0x04cc, 0x00 }, { 0x04f1, 0x0399, 0x00 },
++ { 0x04f2, 0x04cd, 0x03 }, { 0x04f8, 0x04d1, 0x01 },
++ { 0x1e34, 0x04d3, 0x01 }, { 0x1eb8, 0x04d5, 0x01 },
++ { 0x1ebc, 0x04d7, 0x01 }, { 0x1eca, 0x04d9, 0x03 },
++ { 0x1ee4, 0x04dd, 0x01 }, { 0x1ef8, 0x04df, 0x01 },
++ { 0x2010, 0x0349, 0x00 }, { 0x2011, 0x0349, 0x00 },
++ { 0x2012, 0x0205, 0x00 }, { 0x2013, 0x0205, 0x00 },
++ { 0x2016, 0x04e1, 0x03 }, { 0x201a, 0x02ec, 0x00 },
++ { 0x201b, 0x04e5, 0x06 }, { 0x2026, 0x04ec, 0x00 },
++ { 0x2030, 0x04ed, 0x00 }, { 0x2032, 0x04ee, 0x01 },
++ { 0x2039, 0x04f0, 0x01 }, { 0x203c, 0x04f2, 0x00 },
++ { 0x203e, 0x04f3, 0x00 }, { 0x207f, 0x04f4, 0x00 },
++ { 0x20a7, 0x04f5, 0x00 }, { 0x20ac, 0x04f6, 0x00 },
++ { 0x20ae, 0x04f7, 0x00 }, { 0x210e, 0x0327, 0x00 },
++ { 0x210f, 0x03be, 0x00 }, { 0x2126, 0x0448, 0x00 },
++ { 0x2190, 0x04f8, 0x05 }, { 0x21a8, 0x04fe, 0x00 },
++ { 0x21b5, 0x04ff, 0x00 }, { 0x21d0, 0x0500, 0x05 },
++ { 0x2203, 0x0506, 0x00 }, { 0x2205, 0x0507, 0x00 },
++ { 0x2206, 0x0440, 0x00 }, { 0x2208, 0x0508, 0x00 },
++ { 0x220a, 0x0509, 0x00 }, { 0x2212, 0x0205, 0x00 },
++ { 0x2219, 0x050a, 0x01 }, { 0x221e, 0x050c, 0x01 },
++ { 0x2227, 0x050e, 0x03 }, { 0x2248, 0x0512, 0x00 },
++ { 0x2260, 0x0513, 0x01 }, { 0x2264, 0x0515, 0x01 },
++ { 0x2302, 0x0517, 0x00 }, { 0x2310, 0x0518, 0x00 },
++ { 0x2320, 0x0519, 0x01 }, { 0x23ba, 0x051b, 0x02 },
++ { 0x23bd, 0x02b4, 0x00 }, { 0x2409, 0x051e, 0x04 },
++ { 0x2424, 0x0523, 0x00 }, { 0x2500, 0x024f, 0x00 },
++ { 0x2501, 0x0524, 0x00 }, { 0x2502, 0x0251, 0x00 },
++ { 0x2503, 0x0525, 0x00 }, { 0x2508, 0x0253, 0x00 },
++ { 0x2509, 0x0526, 0x00 }, { 0x250a, 0x0255, 0x00 },
++ { 0x250b, 0x0527, 0x00 }, { 0x250c, 0x0259, 0x00 },
++ { 0x250d, 0x0528, 0x02 }, { 0x2510, 0x025d, 0x00 },
++ { 0x2511, 0x052b, 0x02 }, { 0x2514, 0x0261, 0x00 },
++ { 0x2515, 0x052e, 0x02 }, { 0x2518, 0x0265, 0x00 },
++ { 0x2519, 0x0531, 0x02 }, { 0x251c, 0x026d, 0x00 },
++ { 0x251d, 0x0534, 0x06 }, { 0x2524, 0x0275, 0x00 },
++ { 0x2525, 0x053b, 0x06 }, { 0x252c, 0x027d, 0x00 },
++ { 0x252d, 0x0542, 0x06 }, { 0x2534, 0x0285, 0x00 },
++ { 0x2535, 0x0549, 0x06 }, { 0x253c, 0x0295, 0x00 },
++ { 0x253d, 0x0550, 0x0e }, { 0x2550, 0x055f, 0x1c },
++ { 0x25a0, 0x057c, 0x00 }, { 0x25ac, 0x057d, 0x00 },
++ { 0x25ae, 0x057e, 0x00 }, { 0x25b2, 0x057f, 0x00 },
++ { 0x25b6, 0x0580, 0x00 }, { 0x25bc, 0x0581, 0x00 },
++ { 0x25c0, 0x0582, 0x00 }, { 0x25c6, 0x0583, 0x00 },
++ { 0x25ca, 0x0584, 0x01 }, { 0x25d9, 0x0586, 0x00 },
++ { 0x263c, 0x0587, 0x00 }, { 0x2640, 0x0588, 0x00 },
++ { 0x2642, 0x0589, 0x00 }, { 0x2660, 0x058a, 0x00 },
++ { 0x2663, 0x058b, 0x00 }, { 0x2666, 0x0583, 0x00 },
++ { 0x266a, 0x058c, 0x01 }, { 0xf6be, 0x0423, 0x00 },
++};
++
++struct vt_font vt_font_default = {
++ .vf_width = 8,
++ .vf_height = 16,
++ .vf_bytes = font_bytes,
++ .vf_map = {
++ font_mapping_normal,
++ NULL,
++ font_mapping_bold,
++ NULL,
++ },
++ .vf_map_count = { 248, 0, 260, 0 },
++ .vf_refcount = 1,
++};
+--- /dev/null
++++ b/sys/dev/vt/font/vt_mouse_cursor.c
+@@ -0,0 +1,70 @@
++/*-
++ * Copyright (c) 2013 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Aleksandr Rybalko under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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 <dev/vt/vt.h>
++
++#ifndef SC_NO_CUTPASTE
++struct mouse_cursor vt_default_mouse_pointer = {
++ .map = {
++ 0x00, /* "__ " */
++ 0x40, /* "_*_ " */
++ 0x60, /* "_**_ " */
++ 0x70, /* "_***_ " */
++ 0x78, /* "_****_ " */
++ 0x7c, /* "_*****_ " */
++ 0x7e, /* "_******_" */
++ 0x68, /* "_**_****" */
++ 0x4c, /* "_*__**__" */
++ 0x0c, /* " _ _**_ " */
++ 0x06, /* " _**_" */
++ 0x06, /* " _**_" */
++ 0x00, /* " ____" */
++ },
++ .mask = {
++ 0xc0, /* "__ " */
++ 0xe0, /* "___ " */
++ 0xf0, /* "____ " */
++ 0xf8, /* "_____ " */
++ 0xfc, /* "______ " */
++ 0xfe, /* "_______ " */
++ 0xff, /* "________" */
++ 0xff, /* "________" */
++ 0xff, /* "________" */
++ 0x1e, /* " ____ " */
++ 0x0f, /* " ____" */
++ 0x0f, /* " ____" */
++ 0x0f, /* " ____" */
++ },
++ .w = 8,
++ .h = 13,
++};
++#endif
+--- /dev/null
++++ b/sys/dev/vt/hw/fb/vt_early_fb.c
+@@ -0,0 +1,278 @@
++/*-
++ * Copyright (c) 2013 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Aleksandr Rybalko under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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$
++ */
++
++#include <sys/cdefs.h>
++__FBSDID("$FreeBSD$");
++
++#include <sys/param.h>
++#include <sys/systm.h>
++#include <sys/kernel.h>
++#include <sys/fbio.h>
++
++#include "opt_platform.h"
++
++#ifdef FDT
++#include <dev/fdt/fdt_common.h>
++#include <dev/ofw/ofw_bus.h>
++#include <dev/ofw/ofw_bus_subr.h>
++#include <dev/ofw/ofw_pci.h>
++#endif
++
++#include <dev/vt/vt.h>
++#include <dev/vt/hw/fb/vt_fb.h>
++#include <dev/vt/colors/vt_termcolors.h>
++
++static vd_init_t vt_efb_init;
++
++static struct vt_driver vt_fb_early_driver = {
++ .vd_init = vt_efb_init,
++ .vd_blank = vt_fb_blank,
++ .vd_bitbltchr = vt_fb_bitbltchr,
++ .vd_priority = VD_PRIORITY_GENERIC,
++};
++
++static struct fb_info info;
++VT_CONSDEV_DECLARE(vt_fb_early_driver,
++ MAX(80, PIXEL_WIDTH(VT_FB_DEFAULT_WIDTH)),
++ MAX(25, PIXEL_HEIGHT(VT_FB_DEFAULT_HEIGHT)), &info);
++
++static void
++#ifdef FDT
++vt_efb_initialize(struct fb_info *info, phandle_t node)
++#else
++vt_efb_initialize(struct fb_info *info)
++#endif
++{
++#ifdef FDT
++ char name[64];
++ cell_t retval;
++ ihandle_t ih;
++ int i;
++
++ /* Open display device, thereby initializing it */
++ memset(name, 0, sizeof(name));
++ OF_package_to_path(node, name, sizeof(name));
++ ih = OF_open(name);
++#endif
++
++ /*
++ * Set up the color map
++ */
++ switch (info->fb_depth) {
++ case 8:
++ vt_generate_vga_palette(info->fb_cmap, COLOR_FORMAT_RGB,
++ 0x7, 5, 0x7, 2, 0x3, 0);
++ break;
++ case 15:
++ vt_generate_vga_palette(info->fb_cmap, COLOR_FORMAT_RGB,
++ 0x1f, 10, 0x1f, 5, 0x1f, 0);
++ break;
++ case 16:
++ vt_generate_vga_palette(info->fb_cmap, COLOR_FORMAT_RGB,
++ 0x1f, 11, 0x3f, 5, 0x1f, 0);
++ break;
++ case 24:
++ case 32:
++#if BYTE_ORDER == BIG_ENDIAN
++ vt_generate_vga_palette(info->fb_cmap,
++ COLOR_FORMAT_RGB, 255, 16, 255, 8, 255, 0);
++#else
++ vt_generate_vga_palette(info->fb_cmap,
++ COLOR_FORMAT_RGB, 255, 0, 255, 8, 255, 16);
++#endif
++#ifdef FDT
++ for (i = 0; i < 16; i++) {
++ OF_call_method("color!", ih, 4, 1,
++ (cell_t)((info->fb_cmap[i] >> 16) & 0xff),
++ (cell_t)((info->fb_cmap[i] >> 8) & 0xff),
++ (cell_t)((info->fb_cmap[i] >> 0) & 0xff),
++ (cell_t)i, &retval);
++ }
++#endif
++ break;
++
++ default:
++ panic("Unknown color space fb_depth %d", info->fb_depth);
++ break;
++ }
++}
++
++static int
++vt_efb_init(struct vt_device *vd)
++{
++ struct ofw_pci_register pciaddrs[8];
++ struct fb_info *info;
++ int i, len, n_pciaddrs;
++ phandle_t chosen, node;
++ ihandle_t stdout;
++ char type[64];
++
++ info = vd->vd_softc;
++
++ chosen = OF_finddevice("/chosen");
++ OF_getprop(chosen, "stdout", &stdout, sizeof(stdout));
++ node = OF_instance_to_package(stdout);
++ if (node == -1) {
++ /*
++ * The "/chosen/stdout" does not exist try
++ * using "screen" directly.
++ */
++ node = OF_finddevice("screen");
++ }
++ OF_getprop(node, "device_type", type, sizeof(type));
++ if (strcmp(type, "display") != 0)
++ return (CN_DEAD);
++
++#define GET(name, var) \
++ if (OF_getproplen(node, (name)) != sizeof(info->fb_##var)) \
++ return (CN_DEAD); \
++ OF_getencprop(node, (name), &info->fb_##var, sizeof(info->fb_##var)); \
++ if (info->fb_##var == 0) \
++ return (CN_DEAD);
++
++ GET("height", height)
++ GET("width", width)
++ GET("depth", depth)
++ GET("linebytes", stride)
++#undef GET
++
++ info->fb_size = info->fb_height * info->fb_stride;
++
++ /*
++ * Get the PCI addresses of the adapter, if present. The node may be the
++ * child of the PCI device: in that case, try the parent for
++ * the assigned-addresses property.
++ */
++ len = OF_getprop(node, "assigned-addresses", pciaddrs,
++ sizeof(pciaddrs));
++ if (len == -1) {
++ len = OF_getprop(OF_parent(node), "assigned-addresses",
++ pciaddrs, sizeof(pciaddrs));
++ }
++ if (len == -1)
++ len = 0;
++ n_pciaddrs = len / sizeof(struct ofw_pci_register);
++
++ /*
++ * Grab the physical address of the framebuffer, and then map it
++ * into our memory space. If the MMU is not yet up, it will be
++ * remapped for us when relocation turns on.
++ */
++ if (OF_getproplen(node, "address") == sizeof(info->fb_pbase)) {
++ /* XXX We assume #address-cells is 1 at this point. */
++ OF_getencprop(node, "address", &info->fb_pbase,
++ sizeof(info->fb_pbase));
++
++ #if defined(__powerpc__)
++ sc->sc_memt = &bs_be_tag;
++ bus_space_map(sc->sc_memt, info->fb_pbase, info->fb_size,
++ BUS_SPACE_MAP_PREFETCHABLE, &info->fb_vbase);
++ #elif defined(__sparc64__)
++ OF_decode_addr(node, 0, &space, &phys);
++ sc->sc_memt = &vt_efb_memt[0];
++ info->addr = sparc64_fake_bustag(space, fb_phys, sc->sc_memt);
++ #else
++ bus_space_map(fdtbus_bs_tag, info->fb_pbase, info->fb_size,
++ BUS_SPACE_MAP_PREFETCHABLE,
++ (bus_space_handle_t *)&info->fb_vbase);
++ #endif
++ } else {
++ /*
++ * Some IBM systems don't have an address property. Try to
++ * guess the framebuffer region from the assigned addresses.
++ * This is ugly, but there doesn't seem to be an alternative.
++ * Linux does the same thing.
++ */
++
++ info->fb_pbase = n_pciaddrs;
++ for (i = 0; i < n_pciaddrs; i++) {
++ /* If it is too small, not the framebuffer */
++ if (pciaddrs[i].size_lo < info->fb_size)
++ continue;
++ /* If it is not memory, it isn't either */
++ if (!(pciaddrs[i].phys_hi &
++ OFW_PCI_PHYS_HI_SPACE_MEM32))
++ continue;
++
++ /* This could be the framebuffer */
++ info->fb_pbase = i;
++
++ /* If it is prefetchable, it certainly is */
++ if (pciaddrs[i].phys_hi & OFW_PCI_PHYS_HI_PREFETCHABLE)
++ break;
++ }
++
++ if (info->fb_pbase == n_pciaddrs) /* No candidates found */
++ return (CN_DEAD);
++
++ #if defined(__powerpc__)
++ OF_decode_addr(node, info->fb_pbase, &sc->sc_memt,
++ &info->fb_vbase);
++ #elif defined(__sparc64__)
++ OF_decode_addr(node, info->fb_pbase, &space, &info->fb_pbase);
++ sc->sc_memt = &vt_efb_memt[0];
++ info->fb_vbase = sparc64_fake_bustag(space, info->fb_pbase,
++ sc->sc_memt);
++ #else
++ bus_space_map(fdtbus_bs_tag, info->fb_pbase, info->fb_size,
++ BUS_SPACE_MAP_PREFETCHABLE,
++ (bus_space_handle_t *)&info->fb_vbase);
++ #endif
++ }
++
++
++ /* blank full size */
++ len = info->fb_size / 4;
++ for (i = 0; i < len; i++) {
++ ((uint32_t *)info->fb_vbase)[i] = 0;
++ }
++
++ /* Get pixel storage size. */
++ info->fb_bpp = info->fb_stride / info->fb_width * 8;
++
++ /*
++ * Early FB driver work with static window buffer 80x25, so reduce
++ * size to 640x480.
++ */
++ info->fb_width = VT_FB_DEFAULT_WIDTH;
++ info->fb_height = VT_FB_DEFAULT_HEIGHT;
++
++#ifdef FDT
++ vt_efb_initialize(info, node);
++#else
++ vt_efb_initialize(info);
++#endif
++ fb_probe(info);
++ vt_fb_init(vd);
++
++
++ return (CN_INTERNAL);
++}
+--- /dev/null
++++ b/sys/dev/vt/hw/fb/vt_fb.c
+@@ -0,0 +1,335 @@
++/*-
++ * Copyright (c) 2013 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Aleksandr Rybalko under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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$
++ */
++
++#include <sys/cdefs.h>
++__FBSDID("$FreeBSD$");
++
++#include <sys/param.h>
++#include <sys/systm.h>
++#include <sys/malloc.h>
++#include <sys/queue.h>
++#include <sys/fbio.h>
++#include <dev/vt/vt.h>
++#include <dev/vt/hw/fb/vt_fb.h>
++#include <dev/vt/colors/vt_termcolors.h>
++
++static int vt_fb_ioctl(struct vt_device *vd, u_long cmd, caddr_t data,
++ struct thread *td);
++static int vt_fb_mmap(struct vt_device *vd, vm_ooffset_t offset,
++ vm_paddr_t *paddr, int prot, vm_memattr_t *memattr);
++void vt_fb_drawrect(struct vt_device *vd, int x1, int y1, int x2, int y2,
++ int fill, term_color_t color);
++void vt_fb_setpixel(struct vt_device *vd, int x, int y, term_color_t color);
++
++static struct vt_driver vt_fb_driver = {
++ .vd_init = vt_fb_init,
++ .vd_blank = vt_fb_blank,
++ .vd_bitbltchr = vt_fb_bitbltchr,
++ .vd_drawrect = vt_fb_drawrect,
++ .vd_setpixel = vt_fb_setpixel,
++ .vd_postswitch = vt_fb_postswitch,
++ .vd_priority = VD_PRIORITY_GENERIC+10,
++ .vd_fb_ioctl = vt_fb_ioctl,
++ .vd_fb_mmap = vt_fb_mmap,
++};
++
++static int
++vt_fb_ioctl(struct vt_device *vd, u_long cmd, caddr_t data, struct thread *td)
++{
++ struct fb_info *info;
++
++ info = vd->vd_softc;
++
++ if (info->fb_ioctl == NULL)
++ return (-1);
++
++ return (info->fb_ioctl(info->fb_cdev, cmd, data, 0, td));
++}
++
++static int
++vt_fb_mmap(struct vt_device *vd, vm_ooffset_t offset, vm_paddr_t *paddr,
++ int prot, vm_memattr_t *memattr)
++{
++ struct fb_info *info;
++
++ info = vd->vd_softc;
++
++ if (info->fb_ioctl == NULL)
++ return (ENXIO);
++
++ return (info->fb_mmap(info->fb_cdev, offset, paddr, prot, memattr));
++}
++
++void
++vt_fb_setpixel(struct vt_device *vd, int x, int y, term_color_t color)
++{
++ struct fb_info *info;
++ uint32_t c;
++ u_int o;
++
++ info = vd->vd_softc;
++ c = info->fb_cmap[color];
++ o = info->fb_stride * y + x * FBTYPE_GET_BYTESPP(info);
++
++ switch (FBTYPE_GET_BYTESPP(info)) {
++ case 1:
++ info->wr1(info, o, c);
++ break;
++ case 2:
++ info->wr2(info, o, c);
++ break;
++ case 3:
++ info->wr1(info, o, (c >> 16) & 0xff);
++ info->wr1(info, o + 1, (c >> 8) & 0xff);
++ info->wr1(info, o + 2, c & 0xff);
++ break;
++ case 4:
++ info->wr4(info, o, c);
++ break;
++ default:
++ /* panic? */
++ return;
++ }
++
++}
++
++void
++vt_fb_drawrect(struct vt_device *vd, int x1, int y1, int x2, int y2, int fill,
++ term_color_t color)
++{
++ int x, y;
++
++ for (y = y1; y <= y2; y++) {
++ if (fill || (y == y1) || (y == y2)) {
++ for (x = x1; x <= x2; x++)
++ vt_fb_setpixel(vd, x, y, color);
++ } else {
++ vt_fb_setpixel(vd, x1, y, color);
++ vt_fb_setpixel(vd, x2, y, color);
++ }
++ }
++}
++
++void
++vt_fb_blank(struct vt_device *vd, term_color_t color)
++{
++ struct fb_info *info;
++ uint32_t c;
++ u_int o;
++
++ info = vd->vd_softc;
++ c = info->fb_cmap[color];
++
++ switch (FBTYPE_GET_BYTESPP(info)) {
++ case 1:
++ for (o = 0; o < info->fb_stride; o++)
++ info->wr1(info, o, c);
++ break;
++ case 2:
++ for (o = 0; o < info->fb_stride; o += 2)
++ info->wr2(info, o, c);
++ break;
++ case 3:
++ /* line 0 */
++ for (o = 0; o < info->fb_stride; o += 3) {
++ info->wr1(info, o, (c >> 16) & 0xff);
++ info->wr1(info, o + 1, (c >> 8) & 0xff);
++ info->wr1(info, o + 2, c & 0xff);
++ }
++ break;
++ case 4:
++ for (o = 0; o < info->fb_stride; o += 4)
++ info->wr4(info, o, c);
++ break;
++ default:
++ /* panic? */
++ return;
++ }
++ /* Copy line0 to all other lines. */
++ /* XXX will copy with borders. */
++ for (o = info->fb_stride; o < info->fb_size; o += info->fb_stride) {
++ info->copy(info, o, 0, info->fb_stride);
++ }
++}
++
++void
++vt_fb_bitbltchr(struct vt_device *vd, const uint8_t *src, const uint8_t *mask,
++ int bpl, vt_axis_t top, vt_axis_t left, unsigned int width,
++ unsigned int height, term_color_t fg, term_color_t bg)
++{
++ struct fb_info *info;
++ uint32_t fgc, bgc, cc, o;
++ int c, l, bpp;
++ u_long line;
++ uint8_t b, m;
++ const uint8_t *ch;
++
++ info = vd->vd_softc;
++ bpp = FBTYPE_GET_BYTESPP(info);
++ fgc = info->fb_cmap[fg];
++ bgc = info->fb_cmap[bg];
++ b = m = 0;
++ if (bpl == 0)
++ bpl = (width + 7) >> 3; /* Bytes per sorce line. */
++
++ /* Don't try to put off screen pixels */
++ if (((left + width) > info->fb_width) || ((top + height) >
++ info->fb_height))
++ return;
++
++ line = (info->fb_stride * top) + (left * bpp);
++ for (l = 0; l < height; l++) {
++ ch = src;
++ for (c = 0; c < width; c++) {
++ if (c % 8 == 0)
++ b = *ch++;
++ else
++ b <<= 1;
++ if (mask != NULL) {
++ if (c % 8 == 0)
++ m = *mask++;
++ else
++ m <<= 1;
++ /* Skip pixel write, if mask has no bit set. */
++ if ((m & 0x80) == 0)
++ continue;
++ }
++ o = line + (c * bpp);
++ cc = b & 0x80 ? fgc : bgc;
++
++ switch(bpp) {
++ case 1:
++ info->wr1(info, o, cc);
++ break;
++ case 2:
++ info->wr2(info, o, cc);
++ break;
++ case 3:
++ /* Packed mode, so unaligned. Byte access. */
++ info->wr1(info, o, (cc >> 16) & 0xff);
++ info->wr1(info, o + 1, (cc >> 8) & 0xff);
++ info->wr1(info, o + 2, cc & 0xff);
++ break;
++ case 4:
++ info->wr4(info, o, cc);
++ break;
++ default:
++ /* panic? */
++ break;
++ }
++ }
++ line += info->fb_stride;
++ src += bpl;
++ }
++}
++
++void
++vt_fb_postswitch(struct vt_device *vd)
++{
++ struct fb_info *info;
++
++ info = vd->vd_softc;
++
++ if (info->enter != NULL)
++ info->enter(info->fb_priv);
++}
++
++static int
++vt_fb_init_cmap(uint32_t *cmap, int depth)
++{
++
++ switch (depth) {
++ case 8:
++ return (vt_generate_vga_palette(cmap, COLOR_FORMAT_RGB,
++ 0x7, 5, 0x7, 2, 0x3, 0));
++ case 15:
++ return (vt_generate_vga_palette(cmap, COLOR_FORMAT_RGB,
++ 0x1f, 10, 0x1f, 5, 0x1f, 0));
++ case 16:
++ return (vt_generate_vga_palette(cmap, COLOR_FORMAT_RGB,
++ 0x1f, 11, 0x3f, 5, 0x1f, 0));
++ case 24:
++ case 32: /* Ignore alpha. */
++ return (vt_generate_vga_palette(cmap, COLOR_FORMAT_RGB,
++ 0xff, 0, 0xff, 8, 0xff, 16));
++ default:
++ return (1);
++ }
++}
++
++int
++vt_fb_init(struct vt_device *vd)
++{
++ struct fb_info *info;
++ int err;
++
++ info = vd->vd_softc;
++ vd->vd_height = info->fb_height;
++ vd->vd_width = info->fb_width;
++
++ if (info->fb_cmsize <= 0) {
++ err = vt_fb_init_cmap(info->fb_cmap, FBTYPE_GET_BPP(info));
++ if (err)
++ return (CN_DEAD);
++ info->fb_cmsize = 16;
++ }
++
++ /* Clear the screen. */
++ vt_fb_blank(vd, TC_BLACK);
++
++ /* Wakeup screen. KMS need this. */
++ vt_fb_postswitch(vd);
++
++ return (CN_INTERNAL);
++}
++
++int
++vt_fb_attach(struct fb_info *info)
++{
++
++ vt_allocate(&vt_fb_driver, info);
++
++ return (0);
++}
++
++void
++vt_fb_resume(void)
++{
++
++ vt_resume();
++}
++
++void
++vt_fb_suspend(void)
++{
++
++ vt_suspend();
++}
+--- /dev/null
++++ b/sys/dev/vt/hw/fb/vt_fb.h
+@@ -0,0 +1,47 @@
++/*-
++ * Copyright (c) 2013 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Aleksandr Rybalko under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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_VT_HW_FB_VT_FB_H_
++#define _DEV_VT_HW_FB_VT_FB_H_
++/* Generic framebuffer interface call vt_fb_attach to init VT(9) */
++int vt_fb_attach(struct fb_info *info);
++void vt_fb_resume(void);
++void vt_fb_suspend(void);
++
++int fb_probe(struct fb_info *info);
++
++vd_init_t vt_fb_init;
++vd_blank_t vt_fb_blank;
++vd_bitbltchr_t vt_fb_bitbltchr;
++vd_postswitch_t vt_fb_postswitch;
++
++
++#endif /* _DEV_VT_HW_FB_VT_FB_H_ */
+--- /dev/null
++++ b/sys/dev/vt/hw/ofwfb/ofwfb.c
+@@ -0,0 +1,350 @@
++/*-
++ * Copyright (c) 2011 Nathan Whitehorn
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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/kernel.h>
++#include <sys/systm.h>
++
++#include <dev/vt/vt.h>
++#include <dev/vt/colors/vt_termcolors.h>
++
++#include <vm/vm.h>
++#include <vm/pmap.h>
++
++#include <machine/bus.h>
++#ifdef __sparc64__
++#include <machine/bus_private.h>
++#endif
++
++#include <dev/ofw/openfirm.h>
++#include <dev/ofw/ofw_bus.h>
++#include <dev/ofw/ofw_pci.h>
++
++struct ofwfb_softc {
++ phandle_t sc_node;
++
++ intptr_t sc_addr;
++ int sc_depth;
++ int sc_stride;
++
++ bus_space_tag_t sc_memt;
++
++ uint32_t sc_colormap[16];
++};
++
++static vd_init_t ofwfb_init;
++static vd_blank_t ofwfb_blank;
++static vd_bitbltchr_t ofwfb_bitbltchr;
++
++static const struct vt_driver vt_ofwfb_driver = {
++ .vd_init = ofwfb_init,
++ .vd_blank = ofwfb_blank,
++ .vd_bitbltchr = ofwfb_bitbltchr,
++ .vd_priority = VD_PRIORITY_GENERIC+1,
++};
++
++static struct ofwfb_softc ofwfb_conssoftc;
++VT_CONSDEV_DECLARE(vt_ofwfb_driver, PIXEL_WIDTH(1920), PIXEL_HEIGHT(1200),
++ &ofwfb_conssoftc);
++/* XXX: hardcoded max size */
++
++static void
++ofwfb_blank(struct vt_device *vd, term_color_t color)
++{
++ struct ofwfb_softc *sc = vd->vd_softc;
++ u_int ofs, size;
++ uint32_t c;
++
++ size = sc->sc_stride * vd->vd_height;
++ switch (sc->sc_depth) {
++ case 8:
++ c = (color << 24) | (color << 16) | (color << 8) | color;
++ for (ofs = 0; ofs < size/4; ofs++)
++ *(uint32_t *)(sc->sc_addr + 4*ofs) = c;
++ break;
++ case 32:
++ c = sc->sc_colormap[color];
++ for (ofs = 0; ofs < size; ofs++)
++ *(uint32_t *)(sc->sc_addr + 4*ofs) = c;
++ break;
++ default:
++ /* panic? */
++ break;
++ }
++}
++
++static void
++ofwfb_bitbltchr(struct vt_device *vd, const uint8_t *src, const uint8_t *mask,
++ int bpl, vt_axis_t top, vt_axis_t left, unsigned int width,
++ unsigned int height, term_color_t fg, term_color_t bg)
++{
++ struct ofwfb_softc *sc = vd->vd_softc;
++ u_long line;
++ uint32_t fgc, bgc;
++ int c;
++ uint8_t b, m;
++
++ fgc = sc->sc_colormap[fg];
++ bgc = sc->sc_colormap[bg];
++ b = m = 0;
++
++ /* Don't try to put off screen pixels */
++ if (((left + width) > vd->vd_width) || ((top + height) >
++ vd->vd_height))
++ return;
++
++ line = (sc->sc_stride * top) + left * sc->sc_depth/8;
++ for (; height > 0; height--) {
++ for (c = 0; c < width; c++) {
++ if (c % 8 == 0)
++ b = *src++;
++ else
++ b <<= 1;
++ if (mask != NULL) {
++ if (c % 8 == 0)
++ m = *mask++;
++ else
++ m <<= 1;
++ /* Skip pixel write, if mask has no bit set. */
++ if ((m & 0x80) == 0)
++ continue;
++ }
++ switch(sc->sc_depth) {
++ case 8:
++ *(uint8_t *)(sc->sc_addr + line + c) =
++ b & 0x80 ? fg : bg;
++ break;
++ case 32:
++ *(uint32_t *)(sc->sc_addr + line + 4*c) =
++ (b & 0x80) ? fgc : bgc;
++ break;
++ default:
++ /* panic? */
++ break;
++ }
++ }
++ line += sc->sc_stride;
++ }
++}
++
++static void
++ofwfb_initialize(struct vt_device *vd)
++{
++ struct ofwfb_softc *sc = vd->vd_softc;
++ char name[64];
++ ihandle_t ih;
++ int i;
++ cell_t retval;
++ uint32_t oldpix;
++
++ /* Open display device, thereby initializing it */
++ memset(name, 0, sizeof(name));
++ OF_package_to_path(sc->sc_node, name, sizeof(name));
++ ih = OF_open(name);
++
++ /*
++ * Set up the color map
++ */
++
++ switch (sc->sc_depth) {
++ case 8:
++ vt_generate_vga_palette(sc->sc_colormap, COLOR_FORMAT_RGB, 255,
++ 0, 255, 8, 255, 16);
++
++ for (i = 0; i < 16; i++) {
++ OF_call_method("color!", ih, 4, 1,
++ (cell_t)((sc->sc_colormap[i] >> 16) & 0xff),
++ (cell_t)((sc->sc_colormap[i] >> 8) & 0xff),
++ (cell_t)((sc->sc_colormap[i] >> 0) & 0xff),
++ (cell_t)i, &retval);
++ }
++ break;
++
++ case 32:
++ /*
++ * We bypass the usual bus_space_() accessors here, mostly
++ * for performance reasons. In particular, we don't want
++ * any barrier operations that may be performed and handle
++ * endianness slightly different. Figure out the host-view
++ * endianness of the frame buffer.
++ */
++ oldpix = bus_space_read_4(sc->sc_memt, sc->sc_addr, 0);
++ bus_space_write_4(sc->sc_memt, sc->sc_addr, 0, 0xff000000);
++ if (*(uint8_t *)(sc->sc_addr) == 0xff)
++ vt_generate_vga_palette(sc->sc_colormap,
++ COLOR_FORMAT_RGB, 255, 16, 255, 8, 255, 0);
++ else
++ vt_generate_vga_palette(sc->sc_colormap,
++ COLOR_FORMAT_RGB, 255, 0, 255, 8, 255, 16);
++ bus_space_write_4(sc->sc_memt, sc->sc_addr, 0, oldpix);
++ break;
++
++ default:
++ panic("Unknown color space depth %d", sc->sc_depth);
++ break;
++ }
++
++ /* Clear the screen. */
++ ofwfb_blank(vd, TC_BLACK);
++}
++
++static int
++ofwfb_init(struct vt_device *vd)
++{
++ struct ofwfb_softc *sc = vd->vd_softc;
++ char type[64];
++ phandle_t chosen;
++ ihandle_t stdout;
++ phandle_t node;
++ uint32_t depth, height, width;
++ struct ofw_pci_register pciaddrs[8];
++ int n_pciaddrs;
++ uint32_t fb_phys;
++ int i, len;
++#ifdef __sparc64__
++ static struct bus_space_tag ofwfb_memt[1];
++ bus_addr_t phys;
++ int space;
++#endif
++
++ chosen = OF_finddevice("/chosen");
++ OF_getprop(chosen, "stdout", &stdout, sizeof(stdout));
++ node = OF_instance_to_package(stdout);
++ if (node == -1) {
++ /*
++ * The "/chosen/stdout" does not exist try
++ * using "screen" directly.
++ */
++ node = OF_finddevice("screen");
++ }
++ OF_getprop(node, "device_type", type, sizeof(type));
++ if (strcmp(type, "display") != 0)
++ return (CN_DEAD);
++
++ /* Keep track of the OF node */
++ sc->sc_node = node;
++
++ /* Make sure we have needed properties */
++ if (OF_getproplen(node, "height") != sizeof(height) ||
++ OF_getproplen(node, "width") != sizeof(width) ||
++ OF_getproplen(node, "depth") != sizeof(depth) ||
++ OF_getproplen(node, "linebytes") != sizeof(sc->sc_stride))
++ return (CN_DEAD);
++
++ /* Only support 8 and 32-bit framebuffers */
++ OF_getprop(node, "depth", &depth, sizeof(depth));
++ if (depth != 8 && depth != 32)
++ return (CN_DEAD);
++ sc->sc_depth = depth;
++
++ OF_getprop(node, "height", &height, sizeof(height));
++ OF_getprop(node, "width", &width, sizeof(width));
++ OF_getprop(node, "linebytes", &sc->sc_stride, sizeof(sc->sc_stride));
++
++ vd->vd_height = height;
++ vd->vd_width = width;
++
++ /*
++ * Get the PCI addresses of the adapter, if present. The node may be the
++ * child of the PCI device: in that case, try the parent for
++ * the assigned-addresses property.
++ */
++ len = OF_getprop(node, "assigned-addresses", pciaddrs,
++ sizeof(pciaddrs));
++ if (len == -1) {
++ len = OF_getprop(OF_parent(node), "assigned-addresses",
++ pciaddrs, sizeof(pciaddrs));
++ }
++ if (len == -1)
++ len = 0;
++ n_pciaddrs = len / sizeof(struct ofw_pci_register);
++
++ /*
++ * Grab the physical address of the framebuffer, and then map it
++ * into our memory space. If the MMU is not yet up, it will be
++ * remapped for us when relocation turns on.
++ */
++ if (OF_getproplen(node, "address") == sizeof(fb_phys)) {
++ /* XXX We assume #address-cells is 1 at this point. */
++ OF_getprop(node, "address", &fb_phys, sizeof(fb_phys));
++
++ #if defined(__powerpc__)
++ sc->sc_memt = &bs_be_tag;
++ bus_space_map(sc->sc_memt, fb_phys, height * sc->sc_stride,
++ BUS_SPACE_MAP_PREFETCHABLE, &sc->sc_addr);
++ #elif defined(__sparc64__)
++ OF_decode_addr(node, 0, &space, &phys);
++ sc->sc_memt = &ofwfb_memt[0];
++ sc->sc_addr = sparc64_fake_bustag(space, fb_phys, sc->sc_memt);
++ #else
++ #error Unsupported platform!
++ #endif
++ } else {
++ /*
++ * Some IBM systems don't have an address property. Try to
++ * guess the framebuffer region from the assigned addresses.
++ * This is ugly, but there doesn't seem to be an alternative.
++ * Linux does the same thing.
++ */
++
++ fb_phys = n_pciaddrs;
++ for (i = 0; i < n_pciaddrs; i++) {
++ /* If it is too small, not the framebuffer */
++ if (pciaddrs[i].size_lo < sc->sc_stride*height)
++ continue;
++ /* If it is not memory, it isn't either */
++ if (!(pciaddrs[i].phys_hi &
++ OFW_PCI_PHYS_HI_SPACE_MEM32))
++ continue;
++
++ /* This could be the framebuffer */
++ fb_phys = i;
++
++ /* If it is prefetchable, it certainly is */
++ if (pciaddrs[i].phys_hi & OFW_PCI_PHYS_HI_PREFETCHABLE)
++ break;
++ }
++
++ if (fb_phys == n_pciaddrs) /* No candidates found */
++ return (CN_DEAD);
++
++ #if defined(__powerpc__)
++ OF_decode_addr(node, fb_phys, &sc->sc_memt, &sc->sc_addr);
++ #elif defined(__sparc64__)
++ OF_decode_addr(node, fb_phys, &space, &phys);
++ sc->sc_memt = &ofwfb_memt[0];
++ sc->sc_addr = sparc64_fake_bustag(space, phys, sc->sc_memt);
++ #endif
++ }
++
++ ofwfb_initialize(vd);
++
++ return (CN_INTERNAL);
++}
++
+--- /dev/null
++++ b/sys/dev/vt/hw/vga/vga.c
+@@ -0,0 +1,645 @@
++/*-
++ * Copyright (c) 2005 Marcel Moolenaar
++ * All rights reserved.
++ *
++ * Copyright (c) 2009 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * Portions of this software were developed by Ed Schouten
++ * under sponsorship from the FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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/kernel.h>
++#include <sys/systm.h>
++
++#include <dev/vt/vt.h>
++#include <dev/vt/hw/vga/vga_reg.h>
++
++#include <machine/bus.h>
++
++#if defined(__amd64__) || defined(__i386__)
++#include <vm/vm.h>
++#include <vm/pmap.h>
++#include <machine/pmap.h>
++#include <machine/vmparam.h>
++#endif /* __amd64__ || __i386__ */
++
++struct vga_softc {
++ bus_space_tag_t vga_fb_tag;
++ bus_space_handle_t vga_fb_handle;
++ bus_space_tag_t vga_reg_tag;
++ bus_space_handle_t vga_reg_handle;
++ int vga_curcolor;
++};
++
++/* Convenience macros. */
++#define MEM_READ1(sc, ofs) \
++ bus_space_read_1(sc->vga_fb_tag, sc->vga_fb_handle, ofs)
++#define MEM_WRITE1(sc, ofs, val) \
++ bus_space_write_1(sc->vga_fb_tag, sc->vga_fb_handle, ofs, val)
++#define REG_READ1(sc, reg) \
++ bus_space_read_1(sc->vga_reg_tag, sc->vga_reg_handle, reg)
++#define REG_WRITE1(sc, reg, val) \
++ bus_space_write_1(sc->vga_reg_tag, sc->vga_reg_handle, reg, val)
++
++#define VT_VGA_WIDTH 640
++#define VT_VGA_HEIGHT 480
++#define VT_VGA_MEMSIZE (VT_VGA_WIDTH * VT_VGA_HEIGHT / 8)
++
++static vd_init_t vga_init;
++static vd_blank_t vga_blank;
++static vd_bitbltchr_t vga_bitbltchr;
++static vd_drawrect_t vga_drawrect;
++static vd_setpixel_t vga_setpixel;
++static vd_putchar_t vga_putchar;
++static vd_postswitch_t vga_postswitch;
++
++static const struct vt_driver vt_vga_driver = {
++ .vd_init = vga_init,
++ .vd_blank = vga_blank,
++ .vd_bitbltchr = vga_bitbltchr,
++ .vd_drawrect = vga_drawrect,
++ .vd_setpixel = vga_setpixel,
++ .vd_putchar = vga_putchar,
++ .vd_postswitch = vga_postswitch,
++ .vd_priority = VD_PRIORITY_GENERIC,
++};
++
++/*
++ * Driver supports both text mode and graphics mode. Make sure the
++ * buffer is always big enough to support both.
++ */
++static struct vga_softc vga_conssoftc;
++VT_CONSDEV_DECLARE(vt_vga_driver, MAX(80, PIXEL_WIDTH(VT_VGA_WIDTH)),
++ MAX(25, PIXEL_HEIGHT(VT_VGA_HEIGHT)), &vga_conssoftc);
++
++static inline void
++vga_setcolor(struct vt_device *vd, term_color_t color)
++{
++ struct vga_softc *sc = vd->vd_softc;
++
++ if (sc->vga_curcolor != color) {
++ REG_WRITE1(sc, VGA_GC_ADDRESS, VGA_GC_SET_RESET);
++ REG_WRITE1(sc, VGA_GC_DATA, color);
++ sc->vga_curcolor = color;
++ }
++}
++
++static void
++vga_blank(struct vt_device *vd, term_color_t color)
++{
++ struct vga_softc *sc = vd->vd_softc;
++ u_int ofs;
++
++ vga_setcolor(vd, color);
++ for (ofs = 0; ofs < VT_VGA_MEMSIZE; ofs++)
++ MEM_WRITE1(sc, ofs, 0xff);
++}
++
++static inline void
++vga_bitblt_put(struct vt_device *vd, u_long dst, term_color_t color,
++ uint8_t v)
++{
++ struct vga_softc *sc = vd->vd_softc;
++
++ /* Skip empty writes, in order to avoid palette changes. */
++ if (v != 0x00) {
++ vga_setcolor(vd, color);
++ /*
++ * When this MEM_READ1() gets disabled, all sorts of
++ * artifacts occur. This is because this read loads the
++ * set of 8 pixels that are about to be changed. There
++ * is one scenario where we can avoid the read, namely
++ * if all pixels are about to be overwritten anyway.
++ */
++ if (v != 0xff)
++ MEM_READ1(sc, dst);
++ MEM_WRITE1(sc, dst, v);
++ }
++}
++
++static void
++vga_setpixel(struct vt_device *vd, int x, int y, term_color_t color)
++{
++
++ vga_bitblt_put(vd, (y * VT_VGA_WIDTH / 8) + (x / 8), color,
++ 0x80 >> (x % 8));
++}
++
++static void
++vga_drawrect(struct vt_device *vd, int x1, int y1, int x2, int y2, int fill,
++ term_color_t color)
++{
++ int x, y;
++
++ for (y = y1; y <= y2; y++) {
++ if (fill || (y == y1) || (y == y2)) {
++ for (x = x1; x <= x2; x++)
++ vga_setpixel(vd, x, y, color);
++ } else {
++ vga_setpixel(vd, x1, y, color);
++ vga_setpixel(vd, x2, y, color);
++ }
++ }
++}
++
++static inline void
++vga_bitblt_draw(struct vt_device *vd, const uint8_t *src,
++ u_long ldst, uint8_t shift, unsigned int width, unsigned int height,
++ term_color_t color, int negate)
++{
++ u_long dst;
++ int w;
++ uint8_t b, r, out;
++
++ for (; height > 0; height--) {
++ dst = ldst;
++ ldst += VT_VGA_WIDTH / 8;
++ r = 0;
++ for (w = width; w > 0; w -= 8) {
++ b = *src++;
++ if (negate) {
++ b = ~b;
++ /* Don't go too far. */
++ if (w < 8)
++ b &= 0xff << (8 - w);
++ }
++ /* Reintroduce bits from previous column. */
++ out = (b >> shift) | r;
++ r = b << (8 - shift);
++ vga_bitblt_put(vd, dst++, color, out);
++ }
++ /* Print the remainder. */
++ vga_bitblt_put(vd, dst, color, r);
++ }
++}
++
++static void
++vga_bitbltchr(struct vt_device *vd, const uint8_t *src, const uint8_t *mask,
++ int bpl, vt_axis_t top, vt_axis_t left, unsigned int width,
++ unsigned int height, term_color_t fg, term_color_t bg)
++{
++ struct vga_softc *sc = vd->vd_softc;
++ u_long dst;
++ uint8_t shift;
++
++ dst = (VT_VGA_WIDTH * top + left) / 8;
++ shift = left % 8;
++
++ /* Don't try to put off screen pixels */
++ if (((left + width) > VT_VGA_WIDTH) || ((top + height) >
++ VT_VGA_HEIGHT))
++ return;
++
++ if (sc->vga_curcolor == fg) {
++ vga_bitblt_draw(vd, src, dst, shift, width, height, fg, 0);
++ vga_bitblt_draw(vd, src, dst, shift, width, height, bg, 1);
++ } else {
++ vga_bitblt_draw(vd, src, dst, shift, width, height, bg, 1);
++ vga_bitblt_draw(vd, src, dst, shift, width, height, fg, 0);
++ }
++}
++
++/*
++ * Binary searchable table for Unicode to CP437 conversion.
++ */
++
++struct unicp437 {
++ uint16_t unicode_base;
++ uint8_t cp437_base;
++ uint8_t length;
++};
++
++static const struct unicp437 cp437table[] = {
++ { 0x0020, 0x20, 0x5e }, { 0x00a0, 0x20, 0x00 },
++ { 0x00a1, 0xad, 0x00 }, { 0x00a2, 0x9b, 0x00 },
++ { 0x00a3, 0x9c, 0x00 }, { 0x00a5, 0x9d, 0x00 },
++ { 0x00a7, 0x15, 0x00 }, { 0x00aa, 0xa6, 0x00 },
++ { 0x00ab, 0xae, 0x00 }, { 0x00ac, 0xaa, 0x00 },
++ { 0x00b0, 0xf8, 0x00 }, { 0x00b1, 0xf1, 0x00 },
++ { 0x00b2, 0xfd, 0x00 }, { 0x00b5, 0xe6, 0x00 },
++ { 0x00b6, 0x14, 0x00 }, { 0x00b7, 0xfa, 0x00 },
++ { 0x00ba, 0xa7, 0x00 }, { 0x00bb, 0xaf, 0x00 },
++ { 0x00bc, 0xac, 0x00 }, { 0x00bd, 0xab, 0x00 },
++ { 0x00bf, 0xa8, 0x00 }, { 0x00c4, 0x8e, 0x01 },
++ { 0x00c6, 0x92, 0x00 }, { 0x00c7, 0x80, 0x00 },
++ { 0x00c9, 0x90, 0x00 }, { 0x00d1, 0xa5, 0x00 },
++ { 0x00d6, 0x99, 0x00 }, { 0x00dc, 0x9a, 0x00 },
++ { 0x00df, 0xe1, 0x00 }, { 0x00e0, 0x85, 0x00 },
++ { 0x00e1, 0xa0, 0x00 }, { 0x00e2, 0x83, 0x00 },
++ { 0x00e4, 0x84, 0x00 }, { 0x00e5, 0x86, 0x00 },
++ { 0x00e6, 0x91, 0x00 }, { 0x00e7, 0x87, 0x00 },
++ { 0x00e8, 0x8a, 0x00 }, { 0x00e9, 0x82, 0x00 },
++ { 0x00ea, 0x88, 0x01 }, { 0x00ec, 0x8d, 0x00 },
++ { 0x00ed, 0xa1, 0x00 }, { 0x00ee, 0x8c, 0x00 },
++ { 0x00ef, 0x8b, 0x00 }, { 0x00f0, 0xeb, 0x00 },
++ { 0x00f1, 0xa4, 0x00 }, { 0x00f2, 0x95, 0x00 },
++ { 0x00f3, 0xa2, 0x00 }, { 0x00f4, 0x93, 0x00 },
++ { 0x00f6, 0x94, 0x00 }, { 0x00f7, 0xf6, 0x00 },
++ { 0x00f8, 0xed, 0x00 }, { 0x00f9, 0x97, 0x00 },
++ { 0x00fa, 0xa3, 0x00 }, { 0x00fb, 0x96, 0x00 },
++ { 0x00fc, 0x81, 0x00 }, { 0x00ff, 0x98, 0x00 },
++ { 0x0192, 0x9f, 0x00 }, { 0x0393, 0xe2, 0x00 },
++ { 0x0398, 0xe9, 0x00 }, { 0x03a3, 0xe4, 0x00 },
++ { 0x03a6, 0xe8, 0x00 }, { 0x03a9, 0xea, 0x00 },
++ { 0x03b1, 0xe0, 0x01 }, { 0x03b4, 0xeb, 0x00 },
++ { 0x03b5, 0xee, 0x00 }, { 0x03bc, 0xe6, 0x00 },
++ { 0x03c0, 0xe3, 0x00 }, { 0x03c3, 0xe5, 0x00 },
++ { 0x03c4, 0xe7, 0x00 }, { 0x03c6, 0xed, 0x00 },
++ { 0x03d5, 0xed, 0x00 }, { 0x2010, 0x2d, 0x00 },
++ { 0x2014, 0x2d, 0x00 }, { 0x2018, 0x60, 0x00 },
++ { 0x2019, 0x27, 0x00 }, { 0x201c, 0x22, 0x00 },
++ { 0x201d, 0x22, 0x00 }, { 0x2022, 0x07, 0x00 },
++ { 0x203c, 0x13, 0x00 }, { 0x207f, 0xfc, 0x00 },
++ { 0x20a7, 0x9e, 0x00 }, { 0x20ac, 0xee, 0x00 },
++ { 0x2126, 0xea, 0x00 }, { 0x2190, 0x1b, 0x00 },
++ { 0x2191, 0x18, 0x00 }, { 0x2192, 0x1a, 0x00 },
++ { 0x2193, 0x19, 0x00 }, { 0x2194, 0x1d, 0x00 },
++ { 0x2195, 0x12, 0x00 }, { 0x21a8, 0x17, 0x00 },
++ { 0x2202, 0xeb, 0x00 }, { 0x2208, 0xee, 0x00 },
++ { 0x2211, 0xe4, 0x00 }, { 0x2212, 0x2d, 0x00 },
++ { 0x2219, 0xf9, 0x00 }, { 0x221a, 0xfb, 0x00 },
++ { 0x221e, 0xec, 0x00 }, { 0x221f, 0x1c, 0x00 },
++ { 0x2229, 0xef, 0x00 }, { 0x2248, 0xf7, 0x00 },
++ { 0x2261, 0xf0, 0x00 }, { 0x2264, 0xf3, 0x00 },
++ { 0x2265, 0xf2, 0x00 }, { 0x2302, 0x7f, 0x00 },
++ { 0x2310, 0xa9, 0x00 }, { 0x2320, 0xf4, 0x00 },
++ { 0x2321, 0xf5, 0x00 }, { 0x2500, 0xc4, 0x00 },
++ { 0x2502, 0xb3, 0x00 }, { 0x250c, 0xda, 0x00 },
++ { 0x2510, 0xbf, 0x00 }, { 0x2514, 0xc0, 0x00 },
++ { 0x2518, 0xd9, 0x00 }, { 0x251c, 0xc3, 0x00 },
++ { 0x2524, 0xb4, 0x00 }, { 0x252c, 0xc2, 0x00 },
++ { 0x2534, 0xc1, 0x00 }, { 0x253c, 0xc5, 0x00 },
++ { 0x2550, 0xcd, 0x00 }, { 0x2551, 0xba, 0x00 },
++ { 0x2552, 0xd5, 0x00 }, { 0x2553, 0xd6, 0x00 },
++ { 0x2554, 0xc9, 0x00 }, { 0x2555, 0xb8, 0x00 },
++ { 0x2556, 0xb7, 0x00 }, { 0x2557, 0xbb, 0x00 },
++ { 0x2558, 0xd4, 0x00 }, { 0x2559, 0xd3, 0x00 },
++ { 0x255a, 0xc8, 0x00 }, { 0x255b, 0xbe, 0x00 },
++ { 0x255c, 0xbd, 0x00 }, { 0x255d, 0xbc, 0x00 },
++ { 0x255e, 0xc6, 0x01 }, { 0x2560, 0xcc, 0x00 },
++ { 0x2561, 0xb5, 0x00 }, { 0x2562, 0xb6, 0x00 },
++ { 0x2563, 0xb9, 0x00 }, { 0x2564, 0xd1, 0x01 },
++ { 0x2566, 0xcb, 0x00 }, { 0x2567, 0xcf, 0x00 },
++ { 0x2568, 0xd0, 0x00 }, { 0x2569, 0xca, 0x00 },
++ { 0x256a, 0xd8, 0x00 }, { 0x256b, 0xd7, 0x00 },
++ { 0x256c, 0xce, 0x00 }, { 0x2580, 0xdf, 0x00 },
++ { 0x2584, 0xdc, 0x00 }, { 0x2588, 0xdb, 0x00 },
++ { 0x258c, 0xdd, 0x00 }, { 0x2590, 0xde, 0x00 },
++ { 0x2591, 0xb0, 0x02 }, { 0x25a0, 0xfe, 0x00 },
++ { 0x25ac, 0x16, 0x00 }, { 0x25b2, 0x1e, 0x00 },
++ { 0x25ba, 0x10, 0x00 }, { 0x25bc, 0x1f, 0x00 },
++ { 0x25c4, 0x11, 0x00 }, { 0x25cb, 0x09, 0x00 },
++ { 0x25d8, 0x08, 0x00 }, { 0x25d9, 0x0a, 0x00 },
++ { 0x263a, 0x01, 0x01 }, { 0x263c, 0x0f, 0x00 },
++ { 0x2640, 0x0c, 0x00 }, { 0x2642, 0x0b, 0x00 },
++ { 0x2660, 0x06, 0x00 }, { 0x2663, 0x05, 0x00 },
++ { 0x2665, 0x03, 0x01 }, { 0x266a, 0x0d, 0x01 },
++};
++
++static uint8_t
++vga_get_cp437(term_char_t c)
++{
++ int min, mid, max;
++
++ min = 0;
++ max = (sizeof(cp437table) / sizeof(struct unicp437)) - 1;
++
++ if (c < cp437table[0].unicode_base ||
++ c > cp437table[max].unicode_base + cp437table[max].length)
++ return '?';
++
++ while (max >= min) {
++ mid = (min + max) / 2;
++ if (c < cp437table[mid].unicode_base)
++ max = mid - 1;
++ else if (c > cp437table[mid].unicode_base +
++ cp437table[mid].length)
++ min = mid + 1;
++ else
++ return (c - cp437table[mid].unicode_base +
++ cp437table[mid].cp437_base);
++ }
++
++ return '?';
++}
++
++static void
++vga_putchar(struct vt_device *vd, term_char_t c,
++ vt_axis_t top, vt_axis_t left, term_color_t fg, term_color_t bg)
++{
++ struct vga_softc *sc = vd->vd_softc;
++ uint8_t ch, attr;
++
++ /*
++ * Convert character to CP437, which is the character set used
++ * by the VGA hardware by default.
++ */
++ ch = vga_get_cp437(c);
++
++ /*
++ * Convert colors to VGA attributes.
++ */
++ attr = bg << 4 | fg;
++
++ MEM_WRITE1(sc, 0x18000 + (top * 80 + left) * 2 + 0, ch);
++ MEM_WRITE1(sc, 0x18000 + (top * 80 + left) * 2 + 1, attr);
++}
++
++static void
++vga_initialize_graphics(struct vt_device *vd)
++{
++ struct vga_softc *sc = vd->vd_softc;
++
++ /* Clock select. */
++ REG_WRITE1(sc, VGA_GEN_MISC_OUTPUT_W, VGA_GEN_MO_VSP | VGA_GEN_MO_HSP |
++ VGA_GEN_MO_PB | VGA_GEN_MO_ER | VGA_GEN_MO_IOA);
++ /* Set sequencer clocking and memory mode. */
++ REG_WRITE1(sc, VGA_SEQ_ADDRESS, VGA_SEQ_CLOCKING_MODE);
++ REG_WRITE1(sc, VGA_SEQ_DATA, VGA_SEQ_CM_89);
++ REG_WRITE1(sc, VGA_SEQ_ADDRESS, VGA_SEQ_MEMORY_MODE);
++ REG_WRITE1(sc, VGA_SEQ_DATA, VGA_SEQ_MM_OE | VGA_SEQ_MM_EM);
++
++ /* Set the graphics controller in graphics mode. */
++ REG_WRITE1(sc, VGA_GC_ADDRESS, VGA_GC_MISCELLANEOUS);
++ REG_WRITE1(sc, VGA_GC_DATA, 0x04 + VGA_GC_MISC_GA);
++ /* Program the CRT controller. */
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_HORIZ_TOTAL);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0x5f); /* 760 */
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_HORIZ_DISP_END);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0x4f); /* 640 - 8 */
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_START_HORIZ_BLANK);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0x50); /* 640 */
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_END_HORIZ_BLANK);
++ REG_WRITE1(sc, VGA_CRTC_DATA, VGA_CRTC_EHB_CR + 2);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_START_HORIZ_RETRACE);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0x54); /* 672 */
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_END_HORIZ_RETRACE);
++ REG_WRITE1(sc, VGA_CRTC_DATA, VGA_CRTC_EHR_EHB + 0);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_VERT_TOTAL);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0x0b); /* 523 */
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_OVERFLOW);
++ REG_WRITE1(sc, VGA_CRTC_DATA, VGA_CRTC_OF_VT9 | VGA_CRTC_OF_LC8 |
++ VGA_CRTC_OF_VBS8 | VGA_CRTC_OF_VRS8 | VGA_CRTC_OF_VDE8);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_MAX_SCAN_LINE);
++ REG_WRITE1(sc, VGA_CRTC_DATA, VGA_CRTC_MSL_LC9);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_VERT_RETRACE_START);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0xea); /* 480 + 10 */
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_VERT_RETRACE_END);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0x0c);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_VERT_DISPLAY_END);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0xdf); /* 480 - 1*/
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_OFFSET);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0x28);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_START_VERT_BLANK);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0xe7); /* 480 + 7 */
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_END_VERT_BLANK);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0x04);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_MODE_CONTROL);
++ REG_WRITE1(sc, VGA_CRTC_DATA, VGA_CRTC_MC_WB | VGA_CRTC_MC_AW |
++ VGA_CRTC_MC_SRS | VGA_CRTC_MC_CMS);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_LINE_COMPARE);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0xff); /* 480 + 31 */
++
++ REG_WRITE1(sc, VGA_GEN_FEATURE_CTRL_W, 0);
++
++ REG_WRITE1(sc, VGA_SEQ_ADDRESS, VGA_SEQ_MAP_MASK);
++ REG_WRITE1(sc, VGA_SEQ_DATA, VGA_SEQ_MM_EM3 | VGA_SEQ_MM_EM2 |
++ VGA_SEQ_MM_EM1 | VGA_SEQ_MM_EM0);
++ REG_WRITE1(sc, VGA_SEQ_ADDRESS, VGA_SEQ_CHAR_MAP_SELECT);
++ REG_WRITE1(sc, VGA_SEQ_DATA, 0);
++
++ REG_WRITE1(sc, VGA_GC_ADDRESS, VGA_GC_SET_RESET);
++ REG_WRITE1(sc, VGA_GC_DATA, 0);
++ REG_WRITE1(sc, VGA_GC_ADDRESS, VGA_GC_ENABLE_SET_RESET);
++ REG_WRITE1(sc, VGA_GC_DATA, 0x0f);
++ REG_WRITE1(sc, VGA_GC_ADDRESS, VGA_GC_COLOR_COMPARE);
++ REG_WRITE1(sc, VGA_GC_DATA, 0);
++ REG_WRITE1(sc, VGA_GC_ADDRESS, VGA_GC_DATA_ROTATE);
++ REG_WRITE1(sc, VGA_GC_DATA, 0);
++ REG_WRITE1(sc, VGA_GC_ADDRESS, VGA_GC_READ_MAP_SELECT);
++ REG_WRITE1(sc, VGA_GC_DATA, 0);
++ REG_WRITE1(sc, VGA_GC_ADDRESS, VGA_GC_MODE);
++ REG_WRITE1(sc, VGA_GC_DATA, 0);
++ REG_WRITE1(sc, VGA_GC_ADDRESS, VGA_GC_COLOR_DONT_CARE);
++ REG_WRITE1(sc, VGA_GC_DATA, 0x0f);
++ REG_WRITE1(sc, VGA_GC_ADDRESS, VGA_GC_BIT_MASK);
++ REG_WRITE1(sc, VGA_GC_DATA, 0xff);
++}
++
++static void
++vga_initialize(struct vt_device *vd, int textmode)
++{
++ struct vga_softc *sc = vd->vd_softc;
++ uint8_t x;
++
++ /* Make sure the VGA adapter is not in monochrome emulation mode. */
++ x = REG_READ1(sc, VGA_GEN_MISC_OUTPUT_R);
++ REG_WRITE1(sc, VGA_GEN_MISC_OUTPUT_W, x | VGA_GEN_MO_IOA);
++
++ /* Unprotect CRTC registers 0-7. */
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_VERT_RETRACE_END);
++ x = REG_READ1(sc, VGA_CRTC_DATA);
++ REG_WRITE1(sc, VGA_CRTC_DATA, x & ~VGA_CRTC_VRE_PR);
++
++ /*
++ * Wait for the vertical retrace.
++ * NOTE: this code reads the VGA_GEN_INPUT_STAT_1 register, which has
++ * the side-effect of clearing the internal flip-flip of the attribute
++ * controller's write register. This means that because this code is
++ * here, we know for sure that the first write to the attribute
++ * controller will be a write to the address register. Removing this
++ * code therefore also removes that guarantee and appropriate measures
++ * need to be taken.
++ */
++ do {
++ x = REG_READ1(sc, VGA_GEN_INPUT_STAT_1);
++ x &= VGA_GEN_IS1_VR | VGA_GEN_IS1_DE;
++ } while (x != (VGA_GEN_IS1_VR | VGA_GEN_IS1_DE));
++
++ /* Now, disable the sync. signals. */
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_MODE_CONTROL);
++ x = REG_READ1(sc, VGA_CRTC_DATA);
++ REG_WRITE1(sc, VGA_CRTC_DATA, x & ~VGA_CRTC_MC_HR);
++
++ /* Asynchronous sequencer reset. */
++ REG_WRITE1(sc, VGA_SEQ_ADDRESS, VGA_SEQ_RESET);
++ REG_WRITE1(sc, VGA_SEQ_DATA, VGA_SEQ_RST_SR);
++
++ if (!textmode)
++ vga_initialize_graphics(vd);
++
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_PRESET_ROW_SCAN);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_CURSOR_START);
++ REG_WRITE1(sc, VGA_CRTC_DATA, VGA_CRTC_CS_COO);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_CURSOR_END);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_START_ADDR_HIGH);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_START_ADDR_LOW);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_CURSOR_LOC_HIGH);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_CURSOR_LOC_LOW);
++ REG_WRITE1(sc, VGA_CRTC_DATA, 0x59);
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_UNDERLINE_LOC);
++ REG_WRITE1(sc, VGA_CRTC_DATA, VGA_CRTC_UL_UL);
++
++ if (textmode) {
++ /* Set the attribute controller to blink disable. */
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_MODE_CONTROL);
++ REG_WRITE1(sc, VGA_AC_WRITE, 0);
++ } else {
++ /* Set the attribute controller in graphics mode. */
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_MODE_CONTROL);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_MC_GA);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_HORIZ_PIXEL_PANNING);
++ REG_WRITE1(sc, VGA_AC_WRITE, 0);
++ }
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(0));
++ REG_WRITE1(sc, VGA_AC_WRITE, 0);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(1));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_R);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(2));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_G);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(3));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_SG | VGA_AC_PAL_R);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(4));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_B);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(5));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_R | VGA_AC_PAL_B);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(6));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_G | VGA_AC_PAL_B);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(7));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_R | VGA_AC_PAL_G | VGA_AC_PAL_B);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(8));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_SR | VGA_AC_PAL_SG |
++ VGA_AC_PAL_SB);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(9));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_SR | VGA_AC_PAL_SG |
++ VGA_AC_PAL_SB | VGA_AC_PAL_R);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(10));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_SR | VGA_AC_PAL_SG |
++ VGA_AC_PAL_SB | VGA_AC_PAL_G);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(11));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_SR | VGA_AC_PAL_SG |
++ VGA_AC_PAL_SB | VGA_AC_PAL_R | VGA_AC_PAL_G);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(12));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_SR | VGA_AC_PAL_SG |
++ VGA_AC_PAL_SB | VGA_AC_PAL_B);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(13));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_SR | VGA_AC_PAL_SG |
++ VGA_AC_PAL_SB | VGA_AC_PAL_R | VGA_AC_PAL_B);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(14));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_SR | VGA_AC_PAL_SG |
++ VGA_AC_PAL_SB | VGA_AC_PAL_G | VGA_AC_PAL_B);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PALETTE(15));
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_PAL_SR | VGA_AC_PAL_SG |
++ VGA_AC_PAL_SB | VGA_AC_PAL_R | VGA_AC_PAL_G | VGA_AC_PAL_B);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_OVERSCAN_COLOR);
++ REG_WRITE1(sc, VGA_AC_WRITE, 0);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_COLOR_PLANE_ENABLE);
++ REG_WRITE1(sc, VGA_AC_WRITE, 0x0f);
++ REG_WRITE1(sc, VGA_AC_WRITE, VGA_AC_COLOR_SELECT);
++ REG_WRITE1(sc, VGA_AC_WRITE, 0);
++
++ if (!textmode) {
++ u_int ofs;
++
++ /*
++ * Done. Clear the frame buffer. All bit planes are
++ * enabled, so a single-paged loop should clear all
++ * planes.
++ */
++ for (ofs = 0; ofs < VT_VGA_MEMSIZE; ofs++) {
++ MEM_READ1(sc, ofs);
++ MEM_WRITE1(sc, ofs, 0);
++ }
++ }
++
++ /* Re-enable the sequencer. */
++ REG_WRITE1(sc, VGA_SEQ_ADDRESS, VGA_SEQ_RESET);
++ REG_WRITE1(sc, VGA_SEQ_DATA, VGA_SEQ_RST_SR | VGA_SEQ_RST_NAR);
++ /* Re-enable the sync signals. */
++ REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_MODE_CONTROL);
++ x = REG_READ1(sc, VGA_CRTC_DATA);
++ REG_WRITE1(sc, VGA_CRTC_DATA, x | VGA_CRTC_MC_HR);
++
++ if (!textmode) {
++ /* Switch to write mode 3, because we'll mainly do bitblt. */
++ REG_WRITE1(sc, VGA_GC_ADDRESS, VGA_GC_MODE);
++ REG_WRITE1(sc, VGA_GC_DATA, 3);
++ REG_WRITE1(sc, VGA_GC_ADDRESS, VGA_GC_ENABLE_SET_RESET);
++ REG_WRITE1(sc, VGA_GC_DATA, 0x0f);
++ }
++}
++
++static int
++vga_init(struct vt_device *vd)
++{
++ struct vga_softc *sc = vd->vd_softc;
++ int textmode = 0;
++
++#if defined(__amd64__) || defined(__i386__)
++ sc->vga_fb_tag = X86_BUS_SPACE_MEM;
++ sc->vga_fb_handle = KERNBASE + VGA_MEM_BASE;
++ sc->vga_reg_tag = X86_BUS_SPACE_IO;
++ sc->vga_reg_handle = VGA_REG_BASE;
++#elif defined(__ia64__)
++ sc->vga_fb_tag = IA64_BUS_SPACE_MEM;
++ sc->vga_fb_handle = IA64_PHYS_TO_RR6(VGA_MEM_BASE);
++ sc->vga_reg_tag = IA64_BUS_SPACE_IO;
++ sc->vga_reg_handle = VGA_REG_BASE;
++#else
++# error "Architecture not yet supported!"
++#endif
++
++ TUNABLE_INT_FETCH("hw.vga.textmode", &textmode);
++ if (textmode) {
++ vd->vd_flags |= VDF_TEXTMODE;
++ vd->vd_width = 80;
++ vd->vd_height = 25;
++ } else {
++ vd->vd_width = VT_VGA_WIDTH;
++ vd->vd_height = VT_VGA_HEIGHT;
++ }
++ vga_initialize(vd, textmode);
++
++ return (CN_INTERNAL);
++}
++
++static void
++vga_postswitch(struct vt_device *vd)
++{
++
++ /* Reinit VGA mode, to restore view after app which change mode. */
++ vga_initialize(vd, (vd->vd_flags & VDF_TEXTMODE));
++ /* Ask vt(9) to update chars on visible area. */
++ vd->vd_flags |= VDF_INVALID;
++}
+--- /dev/null
++++ b/sys/dev/vt/hw/vga/vga_reg.h
+@@ -0,0 +1,220 @@
++/*-
++ * 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_VT_HW_VGA_VGA_REG_H_
++#define _DEV_VT_HW_VGA_VGA_REG_H_
++
++/*
++ * The VGA adapter uses two I/O port blocks. One of these blocks, the CRT
++ * controller registers, can be located either at 0x3B0 or at 0x3D0 in I/O
++ * port space. This allows compatibility with the monochrome adapter, which
++ * has the CRT controller registers at 0x3B0.
++ *
++ * It is assumed that compatibility with the monochrome adapter is not of
++ * interest anymore. As such, the CRT controller can be located at 0x3D0 in
++ * I/O port space unconditionally. This means that the 2 I/O blocks are
++ * always adjacent and can therefore be treated as a single logical I/O port
++ * range. In practical terms: there only has to be a single tag and handle
++ * to access all registers.
++ *
++ * The following definitions are taken from or inspired by:
++ * Programmer's Guide to the EGA, VGA, and Super VGA Cards -- 3rd ed.,
++ * Richard F. Ferraro, Addison-Wesley, ISBN 0-201-62490-7
++ */
++
++#define VGA_MEM_BASE 0xA0000
++#define VGA_MEM_SIZE 0x10000
++#define VGA_REG_BASE 0x3c0
++#define VGA_REG_SIZE 0x10+0x0c
++
++/* Attribute controller registers. */
++#define VGA_AC_WRITE 0x00
++#define VGA_AC_READ 0x01
++#define VGA_AC_PALETTE(x) (x) /* 0 <= x <= 15 */
++#define VGA_AC_PAL_SR 0x20 /* Secondary red */
++#define VGA_AC_PAL_SG 0x10 /* Secondary green */
++#define VGA_AC_PAL_SB 0x08 /* Secondary blue */
++#define VGA_AC_PAL_R 0x04 /* Red */
++#define VGA_AC_PAL_G 0x02 /* Green */
++#define VGA_AC_PAL_B 0x01 /* Blue */
++#define VGA_AC_MODE_CONTROL (32+16)
++#define VGA_AC_MC_IPS 0x80 /* Internal palette size */
++#define VGA_AC_MC_PCS 0x40 /* Pixel clock select */
++#define VGA_AC_MC_PPC 0x20 /* Pixel panning compat. */
++#define VGA_AC_MC_BI 0x08 /* Blink/intensity */
++#define VGA_AC_MC_ELG 0x04 /* Enable line graphics cc. */
++#define VGA_AC_MC_DT 0x02 /* Display type */
++#define VGA_AC_MC_GA 0x01 /* Graphics/alphanumeric */
++#define VGA_AC_OVERSCAN_COLOR (32+17)
++#define VGA_AC_COLOR_PLANE_ENABLE (32+18)
++#define VGA_AC_HORIZ_PIXEL_PANNING (32+19)
++#define VGA_AC_COLOR_SELECT (32+20)
++#define VGA_AC_CS_C67 0x0C /* Color reg. addr. bits 6+7 */
++#define VGA_AC_CS_C45 0x03 /* Color reg. addr. bits 4+5 */
++
++/* General registers. */
++#define VGA_GEN_MISC_OUTPUT_W 0x02 /* Write only. */
++#define VGA_GEN_MISC_OUTPUT_R 0x0c /* Read only. */
++#define VGA_GEN_MO_VSP 0x80 /* Vertical sync. polarity */
++#define VGA_GEN_MO_HSP 0x40 /* Horiz. sync. polarity */
++#define VGA_GEN_MO_PB 0x20 /* Page bit for odd/even */
++#define VGA_GEN_MO_CS 0x0C /* Clock select */
++#define VGA_GEN_MO_ER 0x02 /* Enable RAM */
++#define VGA_GEN_MO_IOA 0x01 /* Input/output address */
++#define VGA_GEN_INPUT_STAT_0 0x02 /* Read only. */
++#define VGA_GEN_FEATURE_CTRL_W 0x1a /* Write only. */
++#define VGA_GEN_FEATURE_CTRL_R 0x0a /* Read only. */
++#define VGA_GEN_INPUT_STAT_1 0x1a /* Read only. */
++#define VGA_GEN_IS1_VR 0x08 /* Vertical retrace */
++#define VGA_GEN_IS1_DE 0x01 /* Display enable not */
++
++/* Sequencer registers. */
++#define VGA_SEQ_ADDRESS 0x04
++#define VGA_SEQ_RESET 0
++#define VGA_SEQ_RST_SR 0x02 /* Synchronous reset */
++#define VGA_SEQ_RST_NAR 0x01 /* No async. reset */
++#define VGA_SEQ_CLOCKING_MODE 1
++#define VGA_SEQ_CM_SO 0x20 /* Screen off */
++#define VGA_SEQ_CM_S4 0x10 /* Shift four */
++#define VGA_SEQ_CM_DC 0x08 /* Dot clock */
++#define VGA_SEQ_CM_SL 0x04 /* Shift load */
++#define VGA_SEQ_CM_89 0x01 /* 8/9 Dot clocks */
++#define VGA_SEQ_MAP_MASK 2
++#define VGA_SEQ_MM_EM3 0x08 /* Enable memory plane 3 */
++#define VGA_SEQ_MM_EM2 0x04 /* Enable memory plane 2 */
++#define VGA_SEQ_MM_EM1 0x02 /* Enable memory plane 1 */
++#define VGA_SEQ_MM_EM0 0x01 /* Enable memory plane 0 */
++#define VGA_SEQ_CHAR_MAP_SELECT 3
++#define VGA_SEQ_CMS_SAH 0x20 /* Char. A (bit 2) */
++#define VGA_SEQ_CMS_SBH 0x10 /* Char. B (bit 2) */
++#define VGA_SEQ_CMS_SA 0x0C /* Char. A (bit 0+1) */
++#define VGA_SEQ_CMS_SB 0x03 /* Char. B (bit 0+1) */
++#define VGA_SEQ_MEMORY_MODE 4
++#define VGA_SEQ_MM_C4 0x08 /* Chain four */
++#define VGA_SEQ_MM_OE 0x04 /* Odd/even */
++#define VGA_SEQ_MM_EM 0x02 /* Extended memory */
++#define VGA_SEQ_DATA 0x05
++
++/* Color registers. */
++#define VGA_PEL_MASK 0x06
++#define VGA_PEL_ADDR_RD_MODE 0x07 /* Write only. */
++#define VGA_DAC_STATE 0x07 /* Read only. */
++#define VGA_PEL_ADDR_WR_MODE 0x08
++#define VGA_PEL_DATA 0x09
++
++/* Graphics controller registers. */
++#define VGA_GC_ADDRESS 0x0e
++#define VGA_GC_SET_RESET 0
++#define VGA_GC_ENABLE_SET_RESET 1
++#define VGA_GC_COLOR_COMPARE 2
++#define VGA_GC_DATA_ROTATE 3
++#define VGA_GC_DR_FS_XOR 0x18 /* Function select - XOR */
++#define VGA_GC_DR_FS_OR 0x10 /* Function select - OR */
++#define VGA_GC_DR_FS_AND 0x08 /* Function select - AND */
++#define VGA_GC_DR_RC 0x07 /* Rotate count */
++#define VGA_GC_READ_MAP_SELECT 4
++#define VGA_GC_MODE 5
++#define VGA_GC_MODE_SR 0x60 /* Shift register */
++#define VGA_GC_MODE_OE 0x10 /* Odd/even */
++#define VGA_GC_MODE_RM 0x08 /* Read mode */
++#define VGA_GC_MODE_WM 0x03 /* Write mode */
++#define VGA_GC_MISCELLANEOUS 6
++#define VGA_GC_MISC_MM 0x0C /* memory map */
++#define VGA_GC_MISC_COE 0x02 /* Chain odd/even */
++#define VGA_GC_MISC_GA 0x01 /* Graphics/text mode */
++#define VGA_GC_COLOR_DONT_CARE 7
++#define VGA_GC_BIT_MASK 8
++#define VGA_GC_DATA 0x0f
++
++/* CRT controller registers. */
++#define VGA_CRTC_ADDRESS 0x14
++#define VGA_CRTC_HORIZ_TOTAL 0
++#define VGA_CRTC_HORIZ_DISP_END 1
++#define VGA_CRTC_START_HORIZ_BLANK 2
++#define VGA_CRTC_END_HORIZ_BLANK 3
++#define VGA_CRTC_EHB_CR 0x80 /* Compatible read */
++#define VGA_CRTC_EHB_DES 0x60 /* Display enable skew */
++#define VGA_CRTC_EHB_EHB 0x1F /* End horizontal blank */
++#define VGA_CRTC_START_HORIZ_RETRACE 4
++#define VGA_CRTC_END_HORIZ_RETRACE 5
++#define VGA_CRTC_EHR_EHB 0x80 /* End horizontal blanking */
++#define VGA_CRTC_EHR_HRD 0x60 /* Horizontal retrace delay */
++#define VGA_CRTC_EHR_EHR 0x1F /* End horizontal retrace */
++#define VGA_CRTC_VERT_TOTAL 6
++#define VGA_CRTC_OVERFLOW 7
++#define VGA_CRTC_OF_VRS9 0x80 /* Vertical retrace start */
++#define VGA_CRTC_OF_VDE9 0x40 /* Vertical disp. enable end */
++#define VGA_CRTC_OF_VT9 0x20 /* Vertical total (bit 9) */
++#define VGA_CRTC_OF_LC8 0x10 /* Line compare */
++#define VGA_CRTC_OF_VBS8 0x08 /* Start vertical blanking */
++#define VGA_CRTC_OF_VRS8 0x04 /* Vertical retrace start */
++#define VGA_CRTC_OF_VDE8 0x02 /* Vertical disp. enable end */
++#define VGA_CRTC_OF_VT8 0x01 /* Vertical total (bit 8) */
++#define VGA_CRTC_PRESET_ROW_SCAN 8
++#define VGA_CRTC_PRS_BP 0x60 /* Byte panning */
++#define VGA_CRTC_PRS_PRS 0x1F /* Preset row scan */
++#define VGA_CRTC_MAX_SCAN_LINE 9
++#define VGA_CRTC_MSL_2T4 0x80 /* 200-to-400 line conversion */
++#define VGA_CRTC_MSL_LC9 0x40 /* Line compare (bit 9) */
++#define VGA_CRTC_MSL_VBS9 0x20 /* Start vertical blanking */
++#define VGA_CRTC_MSL_MSL 0x1F /* Maximum scan line */
++#define VGA_CRTC_CURSOR_START 10
++#define VGA_CRTC_CS_COO 0x20 /* Cursor on/off */
++#define VGA_CRTC_CS_CS 0x1F /* Cursor start */
++#define VGA_CRTC_CURSOR_END 11
++#define VGA_CRTC_CE_CSK 0x60 /* Cursor skew */
++#define VGA_CRTC_CE_CE 0x1F /* Cursor end */
++#define VGA_CRTC_START_ADDR_HIGH 12
++#define VGA_CRTC_START_ADDR_LOW 13
++#define VGA_CRTC_CURSOR_LOC_HIGH 14
++#define VGA_CRTC_CURSOR_LOC_LOW 15
++#define VGA_CRTC_VERT_RETRACE_START 16
++#define VGA_CRTC_VERT_RETRACE_END 17
++#define VGA_CRTC_VRE_PR 0x80 /* Protect register 0-7 */
++#define VGA_CRTC_VRE_BW 0x40 /* Bandwidth */
++#define VGA_CRTC_VRE_VRE 0x1F /* Vertical retrace end */
++#define VGA_CRTC_VERT_DISPLAY_END 18
++#define VGA_CRTC_OFFSET 19
++#define VGA_CRTC_UNDERLINE_LOC 20
++#define VGA_CRTC_UL_DW 0x40 /* Double word mode */
++#define VGA_CRTC_UL_CB4 0x20 /* Count by four */
++#define VGA_CRTC_UL_UL 0x1F /* Underline location */
++#define VGA_CRTC_START_VERT_BLANK 21
++#define VGA_CRTC_END_VERT_BLANK 22
++#define VGA_CRTC_MODE_CONTROL 23
++#define VGA_CRTC_MC_HR 0x80 /* hardware reset */
++#define VGA_CRTC_MC_WB 0x40 /* Word/byte mode */
++#define VGA_CRTC_MC_AW 0x20 /* Address wrap */
++#define VGA_CRTC_MC_CBT 0x08 /* Count by two */
++#define VGA_CRTC_MC_HRS 0x04 /* Horizontal retrace select */
++#define VGA_CRTC_MC_SRS 0x02 /* Select row scan counter */
++#define VGA_CRTC_MC_CMS 0x01 /* Compatibility mode support */
++#define VGA_CRTC_LINE_COMPARE 24
++#define VGA_CRTC_DATA 0x15
++
++#endif /* !_DEV_VT_HW_VGA_VGA_REG_H_ */
+--- /dev/null
++++ b/sys/dev/vt/hw/xboxfb/xboxfb.c
+@@ -0,0 +1,141 @@
++/*-
++ * Copyright (c) 2013 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Aleksandr Rybalko under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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$
++ */
++
++#include <sys/cdefs.h>
++__FBSDID("$FreeBSD$");
++
++#include <sys/param.h>
++#include <sys/systm.h>
++#include <sys/kernel.h>
++#include <sys/fbio.h>
++
++#include "opt_platform.h"
++
++#include <dev/vt/vt.h>
++#include <dev/vt/hw/fb/vt_fb.h>
++#include <dev/vt/colors/vt_termcolors.h>
++
++#include <vm/vm.h>
++#include <vm/pmap.h>
++
++#include <machine/bus.h>
++#include <machine/pmap.h>
++#include <machine/vmparam.h>
++#include <machine/xbox.h>
++
++#define VT_XBOX_WIDTH 640
++#define VT_XBOX_HEIGHT 480
++
++static vd_init_t xboxfb_init;
++
++static struct vt_driver xboxfb_driver = {
++ .vd_init = xboxfb_init,
++ .vd_blank = vt_fb_blank,
++ .vd_bitbltchr = vt_fb_bitbltchr,
++ .vd_priority = VD_PRIORITY_GENERIC,
++};
++
++static struct fb_info xboxfb_info;
++VT_CONSDEV_DECLARE(xboxfb_driver, PIXEL_WIDTH(VT_XBOX_WIDTH),
++ PIXEL_HEIGHT(VT_XBOX_HEIGHT), &xboxfb_info);
++
++static int
++xboxfb_init(struct vt_device *vd)
++{
++ struct fb_info *info;
++ int i;
++
++ if (!arch_i386_is_xbox)
++ return (CN_DEAD);
++
++ info = &xboxfb_info;
++ /*
++ * We must make a mapping from video framebuffer memory
++ * to real. This is very crude: we map the entire
++ * videomemory to PAGE_SIZE! Since our kernel lives at
++ * it's relocated address range (0xc0xxxxxx), it won't
++ * care.
++ *
++ * We use address PAGE_SIZE and up so we can still trap
++ * NULL pointers. Once the real init is called, the
++ * mapping will be done via the OS and stored in a more
++ * sensible location ... but since we're not fully
++ * initialized, this is our only way to go :-(
++ */
++ for (i = 0; i < (XBOX_FB_SIZE / PAGE_SIZE); i++) {
++ pmap_kenter(((i + 1) * PAGE_SIZE),
++ XBOX_FB_START + (i * PAGE_SIZE));
++ }
++ pmap_kenter((i + 1) * PAGE_SIZE,
++ XBOX_FB_START_PTR - XBOX_FB_START_PTR % PAGE_SIZE);
++
++ /* Ensure the framebuffer is where we want it to be. */
++ *(uint32_t *)((i + 1) * PAGE_SIZE + XBOX_FB_START_PTR % PAGE_SIZE) =
++ XBOX_FB_START;
++
++ /* Initialize fb_info. */
++ info = vd->vd_softc;
++
++ info->fb_width = VT_XBOX_WIDTH;
++ info->fb_height = VT_XBOX_HEIGHT;
++
++ info->fb_size = XBOX_FB_SIZE;
++ info->fb_stride = VT_XBOX_WIDTH * 4; /* 32bits per pixel. */
++
++ info->fb_vbase = PAGE_SIZE;
++ info->fb_pbase = XBOX_FB_START_PTR;
++
++ /* Get pixel storage size. */
++ info->fb_bpp = 32;
++ /* Get color depth. */
++ info->fb_depth = 24;
++
++ vt_generate_vga_palette(info->fb_cmap, COLOR_FORMAT_RGB, 255, 0, 255,
++ 8, 255, 16);
++ fb_probe(info);
++ vt_fb_init(vd);
++
++ return (CN_INTERNAL);
++}
++
++static void
++xbox_remap(void *unused)
++{
++ struct fb_info *info;
++
++ if (!arch_i386_is_xbox)
++ return;
++
++ info = &xboxfb_info;
++ info->fb_vbase = (intptr_t)pmap_mapdev(info->fb_pbase, info->fb_size);
++}
++
++SYSINIT(xboxfb, SI_SUB_DRIVERS, SI_ORDER_ANY, xbox_remap, NULL);
+--- /dev/null
++++ b/sys/dev/vt/logo/logo_freebsd.c
+@@ -0,0 +1,641 @@
++/*-
++ * Copyright (c) 2009 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Ed Schouten under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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$");
++
++unsigned int vt_logo_width = 257;
++unsigned int vt_logo_height = 219;
++unsigned int vt_logo_depth = 1;
++
++unsigned char vt_logo_image[] = {
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 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, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xc0, 0x00, 0x00,
++ 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff,
++ 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff,
++ 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x3f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff,
++ 0xf0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff,
++ 0xff, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00,
++ 0x01, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00,
++ 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x07, 0xff, 0xff,
++ 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x0f, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x3f, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xfe, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff,
++ 0xff, 0xfe, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80,
++ 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xfc, 0x07,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff,
++ 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff,
++ 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7f,
++ 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x81, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x01, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x0f, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xf0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff,
++ 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf0, 0x7f, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xe0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x03, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff,
++ 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0x07, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x01, 0xff, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x01, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8,
++ 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x7f, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7f, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff,
++ 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x83, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff,
++ 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x1f, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x1f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0f,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff,
++ 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1f, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x04, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xc7, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff,
++ 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xfc,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xf1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f,
++ 0xff, 0xff, 0xf3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xe3,
++ 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xc7, 0xc0, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xc7, 0xff, 0xff, 0xc7, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1,
++ 0xff, 0xff, 0x8f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0x0f,
++ 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0x07, 0xf0, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xfc, 0x0f, 0xfe, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0x01, 0xf8, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x07,
++ 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x07, 0xfc, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xf0, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xfc, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f,
++ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xfe, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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,
++ 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 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, 0x07, 0xff, 0xff,
++ 0xff, 0xff, 0xff, 0xff, 0xe0, 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, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
++ 0xff, 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, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 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, 0x00,
++ 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 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, 0x00, 0x00, 0x00, 0x0f,
++ 0xff, 0xff, 0xf8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf0, 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,
++ 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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,
++ 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, 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, 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, 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, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xc0, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff,
++ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00,
++ 0x01, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xc0, 0x00, 0x07,
++ 0xff, 0xf0, 0x00, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff,
++ 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xfe, 0x00,
++ 0x07, 0xff, 0xff, 0x80, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf0, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x07, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, 0x80, 0x0f, 0xff, 0xff,
++ 0xe0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x1f,
++ 0xf8, 0x00, 0x7f, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x00,
++ 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x03, 0xfc, 0x00, 0xff,
++ 0xe0, 0xff, 0xc0, 0x1f, 0x80, 0x0f, 0xfc, 0x00, 0x00, 0x3f, 0x80, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x1f, 0xc0,
++ 0x1f, 0x00, 0x01, 0xff, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x3f, 0x00, 0x00, 0x7e, 0x01, 0xfc, 0x00, 0x07, 0x80, 0x3e, 0x00, 0x00,
++ 0x7f, 0x80, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
++ 0x3f, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x1f, 0xc0, 0x00,
++ 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x3f, 0x03, 0xf0,
++ 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x7c, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x1f, 0x03, 0xe0, 0x00, 0x00, 0x00,
++ 0x3e, 0x00, 0x00, 0x07, 0xf0, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0xfc, 0x00, 0x00, 0x1f, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00,
++ 0x03, 0xf0, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00,
++ 0x1f, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x01, 0xf8, 0x00,
++ 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x1f, 0x03, 0xe0,
++ 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x00,
++ 0x00, 0x07, 0xfc, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7f,
++ 0xc0, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x1f, 0x03, 0xe0, 0x00, 0x00, 0x00,
++ 0x3e, 0x00, 0x00, 0x00, 0x7c, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff,
++ 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xff, 0xf8, 0x00, 0x00,
++ 0xf8, 0x00, 0x00, 0x1f, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00,
++ 0x00, 0x7e, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x7f,
++ 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xfe, 0x00, 0x00, 0xf8, 0x00, 0x00,
++ 0x3f, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x00,
++ 0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0xfc, 0x00,
++ 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0xf8, 0x00, 0x00, 0x3f, 0x03, 0xf8,
++ 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xfc, 0x00, 0x00,
++ 0x01, 0xff, 0xff, 0xf0, 0x03, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff,
++ 0xff, 0xc0, 0x00, 0xf8, 0x00, 0x00, 0x7e, 0x01, 0xfc, 0x00, 0x00, 0x00,
++ 0x3e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xfc, 0x00, 0x00, 0x03, 0xfc, 0x07,
++ 0xf8, 0x07, 0xfe, 0x03, 0xff, 0x00, 0x00, 0xff, 0xc0, 0x3f, 0xe0, 0x00,
++ 0xfc, 0x00, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00,
++ 0x00, 0x1f, 0x00, 0xfc, 0x00, 0x00, 0x07, 0xf0, 0x01, 0xf8, 0x0f, 0xf0,
++ 0x00, 0x7f, 0x80, 0x01, 0xfe, 0x00, 0x0f, 0xf0, 0x00, 0xfc, 0x00, 0x01,
++ 0xfc, 0x00, 0xff, 0x80, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x1f, 0x00,
++ 0xfc, 0x00, 0x00, 0x07, 0xe0, 0x00, 0xf8, 0x1f, 0xc0, 0x00, 0x3f, 0xc0,
++ 0x03, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0xfe, 0x00, 0x0f, 0xfc, 0x00, 0x7f,
++ 0xe0, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xfe, 0x00, 0x00,
++ 0x0f, 0xc0, 0x00, 0x78, 0x1f, 0x80, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00,
++ 0x01, 0xfc, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xf0, 0x00, 0x00,
++ 0x3e, 0x00, 0x00, 0x00, 0x0f, 0x80, 0xff, 0x00, 0x00, 0x0f, 0x80, 0x00,
++ 0x00, 0x3f, 0x00, 0x00, 0x07, 0xe0, 0x07, 0xe0, 0x00, 0x00, 0xfc, 0x00,
++ 0xff, 0xff, 0xff, 0xfc, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x3e, 0x00, 0x00,
++ 0x00, 0x0f, 0x80, 0xff, 0xff, 0xfc, 0x0f, 0x80, 0x00, 0x00, 0x7e, 0x00,
++ 0x00, 0x03, 0xf0, 0x07, 0xe0, 0x00, 0x00, 0x7e, 0x00, 0xff, 0xff, 0xff,
++ 0xff, 0x00, 0x07, 0xff, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x0f, 0x80,
++ 0xff, 0xff, 0xfc, 0x1f, 0x80, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x03, 0xf0,
++ 0x0f, 0xc0, 0x00, 0x00, 0x7e, 0x00, 0xff, 0xff, 0xff, 0xff, 0x80, 0x01,
++ 0xff, 0xc0, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x0f, 0x80, 0xff, 0xff, 0xfe,
++ 0x1f, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x01, 0xf0, 0x0f, 0x80, 0x00,
++ 0x00, 0x3e, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xf0, 0x00,
++ 0x3e, 0x00, 0x00, 0x00, 0x0f, 0x80, 0xff, 0xff, 0xfc, 0x1f, 0x00, 0x00,
++ 0x00, 0xfc, 0x00, 0x00, 0x01, 0xf8, 0x1f, 0x80, 0x00, 0x00, 0x1f, 0x00,
++ 0xfc, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x1f, 0xfc, 0x00, 0x3e, 0x00, 0x00,
++ 0x00, 0x0f, 0x80, 0xff, 0xff, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0xf8, 0x00,
++ 0x00, 0x00, 0xf8, 0x1f, 0x80, 0x00, 0x00, 0x1f, 0x00, 0xfc, 0x00, 0x00,
++ 0x07, 0xf0, 0x00, 0x07, 0xff, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x0f, 0x80,
++ 0xfe, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xf8,
++ 0x1f, 0x80, 0x00, 0x00, 0x1f, 0x00, 0xf8, 0x00, 0x00, 0x03, 0xf8, 0x00,
++ 0x01, 0xff, 0x80, 0x3e, 0x00, 0x00, 0x00, 0x0f, 0x80, 0xfc, 0x00, 0x00,
++ 0x1f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff,
++ 0xff, 0xff, 0x80, 0xf8, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x7f, 0xc0,
++ 0x3e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00,
++ 0x01, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x80,
++ 0xf8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x1f, 0xe0, 0x3e, 0x00, 0x00,
++ 0x00, 0x1f, 0x00, 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x01, 0xff, 0xff,
++ 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf8, 0x00, 0x00,
++ 0x00, 0xfc, 0x00, 0x00, 0x0f, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x1f, 0x00,
++ 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xf8,
++ 0x1f, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf8, 0x00, 0x00, 0x00, 0x7c, 0x00,
++ 0x00, 0x03, 0xf8, 0x3e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xfc, 0x00, 0x00,
++ 0x1f, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff,
++ 0xff, 0xff, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x01, 0xf8,
++ 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00,
++ 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x00,
++ 0xf8, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0xfc, 0x3e, 0x00, 0x00,
++ 0x00, 0x3e, 0x00, 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0xfc, 0x00,
++ 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00,
++ 0x00, 0x7e, 0x00, 0x00, 0x00, 0xfc, 0x3e, 0x00, 0x00, 0x00, 0x7c, 0x00,
++ 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00,
++ 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x7e, 0x00,
++ 0x00, 0x00, 0xfc, 0x3e, 0x00, 0x00, 0x00, 0x7c, 0x00, 0xfc, 0x00, 0x00,
++ 0x1f, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00,
++ 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0xfc,
++ 0x3e, 0x00, 0x00, 0x00, 0xf8, 0x00, 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00,
++ 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00,
++ 0xf8, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0xfc, 0x3e, 0x00, 0x00,
++ 0x01, 0xf8, 0x00, 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x7e, 0x00,
++ 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00,
++ 0x00, 0x7c, 0x00, 0x00, 0x00, 0xfc, 0x3e, 0x00, 0x00, 0x03, 0xf0, 0x00,
++ 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
++ 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xfc, 0x00,
++ 0x00, 0x00, 0xfc, 0x3e, 0x00, 0x00, 0x07, 0xe0, 0x00, 0xfc, 0x00, 0x00,
++ 0x1f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00,
++ 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xfc,
++ 0x3e, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00,
++ 0x00, 0x1f, 0x80, 0x00, 0x0c, 0x00, 0x03, 0xf0, 0x00, 0x01, 0x80, 0x00,
++ 0xf8, 0x00, 0x00, 0x01, 0xf8, 0x70, 0x00, 0x03, 0xf8, 0x3e, 0x00, 0x00,
++ 0x1f, 0xc0, 0x00, 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0xc0,
++ 0x00, 0x3e, 0x00, 0x03, 0xfc, 0x00, 0x03, 0xc0, 0x00, 0xf8, 0x00, 0x00,
++ 0x03, 0xf8, 0xfc, 0x00, 0x07, 0xf8, 0x3f, 0x00, 0x00, 0x7f, 0x80, 0x00,
++ 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x7e, 0x00,
++ 0x01, 0xfe, 0x00, 0x0f, 0xe0, 0x00, 0xf8, 0x00, 0x00, 0x07, 0xf0, 0xff,
++ 0x80, 0x0f, 0xf0, 0x3f, 0x00, 0x01, 0xff, 0x00, 0x00, 0xfc, 0x00, 0x00,
++ 0x1f, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x03, 0xfe, 0x00, 0x00, 0xff, 0xc0,
++ 0x3f, 0xc0, 0x00, 0xf8, 0x00, 0x00, 0x3f, 0xe0, 0xff, 0xf8, 0x7f, 0xe0,
++ 0x3f, 0x80, 0x1f, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00,
++ 0x00, 0x03, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xc0, 0x00,
++ 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff,
++ 0xf8, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x01, 0xff,
++ 0xff, 0xfc, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff,
++ 0xff, 0x80, 0x7f, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xff, 0xe0, 0x00, 0x00,
++ 0xfc, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00,
++ 0x00, 0x0f, 0xff, 0xfe, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f,
++ 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00,
++ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xff,
++ 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfc, 0x00, 0x03, 0xff, 0xfc, 0x00,
++ 0x1f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0e, 0x00, 0x00,
++ 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00,
++ 0x3f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00,
++};
+--- /dev/null
++++ b/sys/dev/vt/vt.h
+@@ -0,0 +1,438 @@
++/*-
++ * Copyright (c) 2009, 2013 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Ed Schouten under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * Portions of this software were developed by Oleksandr Rybalko
++ * under sponsorship from the FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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_VT_VT_H_
++#define _DEV_VT_VT_H_
++
++#include <sys/param.h>
++#include <sys/_lock.h>
++#include <sys/_mutex.h>
++#include <sys/callout.h>
++#include <sys/condvar.h>
++#include <sys/conf.h>
++#include <sys/consio.h>
++#include <sys/kbio.h>
++#include <sys/mouse.h>
++#include <sys/terminal.h>
++#include <sys/sysctl.h>
++
++#include "opt_syscons.h"
++#include "opt_splash.h"
++
++#ifdef DEV_SC
++#error "Build with both syscons and vt is not supported. Please enable only \
++one 'device sc' or 'device vt'"
++#endif
++
++#ifndef VT_MAXWINDOWS
++#ifdef MAXCONS
++#define VT_MAXWINDOWS MAXCONS
++#else
++#define VT_MAXWINDOWS 12
++#endif
++#endif
++
++#ifndef VT_ALT_TO_ESC_HACK
++#define VT_ALT_TO_ESC_HACK 1
++#endif
++
++#define VT_CONSWINDOW 0
++
++#if defined(SC_TWOBUTTON_MOUSE) || defined(VT_TWOBUTTON_MOUSE)
++#define VT_MOUSE_PASTEBUTTON MOUSE_BUTTON3DOWN /* right button */
++#define VT_MOUSE_EXTENDBUTTON MOUSE_BUTTON2DOWN /* not really used */
++#else
++#define VT_MOUSE_PASTEBUTTON MOUSE_BUTTON2DOWN /* middle button */
++#define VT_MOUSE_EXTENDBUTTON MOUSE_BUTTON3DOWN /* right button */
++#endif /* defined(SC_TWOBUTTON_MOUSE) || defined(VT_TWOBUTTON_MOUSE) */
++
++#define SC_DRIVER_NAME "vt"
++#define DPRINTF(_l, ...) if (vt_debug > (_l)) printf( __VA_ARGS__ )
++#define ISSIGVALID(sig) ((sig) > 0 && (sig) < NSIG)
++
++#define VT_SYSCTL_INT(_name, _default, _descr) \
++static int vt_##_name = _default; \
++SYSCTL_INT(_kern_vt, OID_AUTO, _name, CTLFLAG_RW, &vt_##_name, _default,\
++ _descr); \
++TUNABLE_INT("kern.vt." #_name, &vt_##_name);
++
++struct vt_driver;
++
++void vt_allocate(struct vt_driver *, void *);
++void vt_resume(void);
++void vt_suspend(void);
++
++typedef unsigned int vt_axis_t;
++
++/*
++ * List of locks
++ * (d) locked by vd_lock
++ * (b) locked by vb_lock
++ * (G) locked by Giant
++ * (u) unlocked, locked by higher levels
++ * (c) const until freeing
++ * (?) yet to be determined
++ */
++
++/*
++ * Per-device datastructure.
++ */
++
++struct vt_device {
++ struct vt_window *vd_windows[VT_MAXWINDOWS]; /* (c) Windows. */
++ struct vt_window *vd_curwindow; /* (d) Current window. */
++ struct vt_window *vd_savedwindow;/* (?) Saved for suspend. */
++ struct vt_window *vd_markedwin; /* (?) Copy/paste buf owner. */
++ const struct vt_driver *vd_driver; /* (c) Graphics driver. */
++ void *vd_softc; /* (u) Driver data. */
++ uint16_t vd_mx; /* (?) Mouse X. */
++ uint16_t vd_my; /* (?) Mouse Y. */
++ vt_axis_t vd_mdirtyx; /* (?) Screen width. */
++ vt_axis_t vd_mdirtyy; /* (?) Screen height. */
++ uint32_t vd_mstate; /* (?) Mouse state. */
++ term_pos_t vd_offset; /* (?) Pixel offset. */
++ vt_axis_t vd_width; /* (?) Screen width. */
++ vt_axis_t vd_height; /* (?) Screen height. */
++ struct mtx vd_lock; /* Per-device lock. */
++ struct cv vd_winswitch; /* (d) Window switch notify. */
++ struct callout vd_timer; /* (d) Display timer. */
++ int vd_flags; /* (d) Device flags. */
++#define VDF_TEXTMODE 0x01 /* Do text mode rendering. */
++#define VDF_SPLASH 0x02 /* Splash screen active. */
++#define VDF_ASYNC 0x04 /* vt_timer() running. */
++#define VDF_INVALID 0x08 /* Entire screen should be re-rendered. */
++#define VDF_DEAD 0x10 /* Early probing found nothing. */
++#define VDF_INITIALIZED 0x20 /* vtterm_cnprobe already done. */
++#define VDF_MOUSECURSOR 0x40 /* Mouse cursor visible. */
++#define VDF_QUIET_BELL 0x80 /* Disable bell. */
++ int vd_keyboard; /* (G) Keyboard index. */
++ unsigned int vd_kbstate; /* (?) Device unit. */
++ unsigned int vd_unit; /* (c) Device unit. */
++};
++
++/*
++ * Per-window terminal screen buffer.
++ *
++ * Because redrawing is performed asynchronously, the buffer keeps track
++ * of a rectangle that needs to be redrawn (vb_dirtyrect). Because this
++ * approach seemed to cause suboptimal performance (when the top left
++ * and the bottom right of the screen are modified), it also uses a set
++ * of bitmasks to keep track of the rows and columns (mod 64) that have
++ * been modified.
++ */
++
++struct vt_bufmask {
++ uint64_t vbm_row, vbm_col;
++#define VBM_DIRTY UINT64_MAX
++};
++
++struct vt_buf {
++ struct mtx vb_lock; /* Buffer lock. */
++ term_pos_t vb_scr_size; /* (b) Screen dimensions. */
++ int vb_flags; /* (b) Flags. */
++#define VBF_CURSOR 0x1 /* Cursor visible. */
++#define VBF_STATIC 0x2 /* Buffer is statically allocated. */
++#define VBF_MTX_INIT 0x4 /* Mutex initialized. */
++#define VBF_SCROLL 0x8 /* scroll locked mode. */
++#define VBF_HISTORY_FULL 0x10 /* All rows filled. */
++ int vb_history_size;
++#define VBF_DEFAULT_HISTORY_SIZE 500
++ int vb_roffset; /* (b) History rows offset. */
++ int vb_curroffset; /* (b) Saved rows offset. */
++ term_pos_t vb_cursor; /* (u) Cursor position. */
++ term_pos_t vb_mark_start; /* (b) Copy region start. */
++ term_pos_t vb_mark_end; /* (b) Copy region end. */
++ int vb_mark_last; /* Last mouse event. */
++ term_rect_t vb_dirtyrect; /* (b) Dirty rectangle. */
++ struct vt_bufmask vb_dirtymask; /* (b) Dirty bitmasks. */
++ term_char_t *vb_buffer; /* (u) Data buffer. */
++ term_char_t **vb_rows; /* (u) Array of rows */
++};
++
++void vtbuf_copy(struct vt_buf *, const term_rect_t *, const term_pos_t *);
++void vtbuf_fill_locked(struct vt_buf *, const term_rect_t *, term_char_t);
++void vtbuf_init_early(struct vt_buf *);
++void vtbuf_init(struct vt_buf *, const term_pos_t *);
++void vtbuf_grow(struct vt_buf *, const term_pos_t *, int);
++void vtbuf_putchar(struct vt_buf *, const term_pos_t *, term_char_t);
++void vtbuf_cursor_position(struct vt_buf *, const term_pos_t *);
++void vtbuf_scroll_mode(struct vt_buf *vb, int yes);
++void vtbuf_undirty(struct vt_buf *, term_rect_t *, struct vt_bufmask *);
++void vtbuf_sethistory_size(struct vt_buf *, int);
++int vtbuf_iscursor(struct vt_buf *vb, int row, int col);
++void vtbuf_cursor_visibility(struct vt_buf *, int);
++#ifndef SC_NO_CUTPASTE
++void vtbuf_mouse_cursor_position(struct vt_buf *vb, int col, int row);
++int vtbuf_set_mark(struct vt_buf *vb, int type, int col, int row);
++int vtbuf_get_marked_len(struct vt_buf *vb);
++void vtbuf_extract_marked(struct vt_buf *vb, term_char_t *buf, int sz);
++#endif
++
++#define VTB_MARK_NONE 0
++#define VTB_MARK_END 1
++#define VTB_MARK_START 2
++#define VTB_MARK_WORD 3
++#define VTB_MARK_ROW 4
++#define VTB_MARK_EXTEND 5
++#define VTB_MARK_MOVE 6
++
++#define VTBUF_SLCK_ENABLE(vb) vtbuf_scroll_mode((vb), 1)
++#define VTBUF_SLCK_DISABLE(vb) vtbuf_scroll_mode((vb), 0)
++
++#define VTBUF_MAX_HEIGHT(vb) \
++ ((vb)->vb_history_size)
++#define VTBUF_GET_ROW(vb, r) \
++ ((vb)->vb_rows[((vb)->vb_roffset + (r)) % VTBUF_MAX_HEIGHT(vb)])
++#define VTBUF_GET_FIELD(vb, r, c) \
++ ((vb)->vb_rows[((vb)->vb_roffset + (r)) % VTBUF_MAX_HEIGHT(vb)][(c)])
++#define VTBUF_FIELD(vb, r, c) \
++ ((vb)->vb_rows[((vb)->vb_curroffset + (r)) % VTBUF_MAX_HEIGHT(vb)][(c)])
++#define VTBUF_ISCURSOR(vb, r, c) \
++ vtbuf_iscursor((vb), (r), (c))
++#define VTBUF_DIRTYROW(mask, row) \
++ ((mask)->vbm_row & ((uint64_t)1 << ((row) % 64)))
++#define VTBUF_DIRTYCOL(mask, col) \
++ ((mask)->vbm_col & ((uint64_t)1 << ((col) % 64)))
++#define VTBUF_SPACE_CHAR (' ' | TC_WHITE << 26 | TC_BLACK << 29)
++
++#define VHS_SET 0
++#define VHS_CUR 1
++#define VHS_END 2
++int vthistory_seek(struct vt_buf *, int offset, int whence);
++void vthistory_addlines(struct vt_buf *vb, int offset);
++void vthistory_getpos(const struct vt_buf *, unsigned int *offset);
++
++/*
++ * Per-window datastructure.
++ */
++
++struct vt_window {
++ struct vt_device *vw_device; /* (c) Device. */
++ struct terminal *vw_terminal; /* (c) Terminal. */
++ struct vt_buf vw_buf; /* (u) Screen buffer. */
++ struct vt_font *vw_font; /* (d) Graphical font. */
++ unsigned int vw_number; /* (c) Window number. */
++ int vw_kbdmode; /* (?) Keyboard mode. */
++ char *vw_kbdsq; /* Escape sequence queue*/
++ unsigned int vw_flags; /* (d) Per-window flags. */
++ int vw_mouse_level;/* Mouse op mode. */
++#define VWF_BUSY 0x1 /* Busy reconfiguring device. */
++#define VWF_OPENED 0x2 /* TTY in use. */
++#define VWF_SCROLL 0x4 /* Keys influence scrollback. */
++#define VWF_CONSOLE 0x8 /* Kernel message console window. */
++#define VWF_VTYLOCK 0x10 /* Prevent window switch. */
++#define VWF_MOUSE_HIDE 0x20 /* Disable mouse events processing. */
++#define VWF_SWWAIT_REL 0x10000 /* Program wait for VT acquire is done. */
++#define VWF_SWWAIT_ACQ 0x20000 /* Program wait for VT release is done. */
++ pid_t vw_pid; /* Terminal holding process */
++ struct proc *vw_proc;
++ struct vt_mode vw_smode; /* switch mode */
++ struct callout vw_proc_dead_timer;
++ struct vt_window *vw_switch_to;
++};
++
++#define VT_AUTO 0 /* switching is automatic */
++#define VT_PROCESS 1 /* switching controlled by prog */
++#define VT_KERNEL 255 /* switching controlled in kernel */
++
++#define IS_VT_PROC_MODE(vw) ((vw)->vw_smode.mode == VT_PROCESS)
++
++/*
++ * Per-device driver routines.
++ *
++ * vd_bitbltchr is used when the driver operates in graphics mode, while
++ * vd_putchar is used when the driver operates in text mode
++ * (VDF_TEXTMODE).
++ */
++
++typedef int vd_init_t(struct vt_device *vd);
++typedef void vd_postswitch_t(struct vt_device *vd);
++typedef void vd_blank_t(struct vt_device *vd, term_color_t color);
++typedef void vd_bitbltchr_t(struct vt_device *vd, const uint8_t *src,
++ const uint8_t *mask, int bpl, vt_axis_t top, vt_axis_t left,
++ unsigned int width, unsigned int height, term_color_t fg, term_color_t bg);
++typedef void vd_putchar_t(struct vt_device *vd, term_char_t,
++ vt_axis_t top, vt_axis_t left, term_color_t fg, term_color_t bg);
++typedef int vd_fb_ioctl_t(struct vt_device *, u_long, caddr_t, struct thread *);
++typedef int vd_fb_mmap_t(struct vt_device *, vm_ooffset_t, vm_paddr_t *, int,
++ vm_memattr_t *);
++typedef void vd_drawrect_t(struct vt_device *, int, int, int, int, int,
++ term_color_t);
++typedef void vd_setpixel_t(struct vt_device *, int, int, term_color_t);
++
++struct vt_driver {
++ /* Console attachment. */
++ vd_init_t *vd_init;
++
++ /* Drawing. */
++ vd_blank_t *vd_blank;
++ vd_bitbltchr_t *vd_bitbltchr;
++ vd_drawrect_t *vd_drawrect;
++ vd_setpixel_t *vd_setpixel;
++
++ /* Framebuffer ioctls, if present. */
++ vd_fb_ioctl_t *vd_fb_ioctl;
++
++ /* Framebuffer mmap, if present. */
++ vd_fb_mmap_t *vd_fb_mmap;
++
++ /* Text mode operation. */
++ vd_putchar_t *vd_putchar;
++
++ /* Update display setting on vt switch. */
++ vd_postswitch_t *vd_postswitch;
++
++ /* Priority to know which one can override */
++ int vd_priority;
++#define VD_PRIORITY_DUMB 10
++#define VD_PRIORITY_GENERIC 100
++#define VD_PRIORITY_SPECIFIC 1000
++};
++
++/*
++ * Console device madness.
++ *
++ * Utility macro to make early vt(4) instances work.
++ */
++
++extern const struct terminal_class vt_termclass;
++void vt_upgrade(struct vt_device *vd);
++
++#define PIXEL_WIDTH(w) ((w) / 8)
++#define PIXEL_HEIGHT(h) ((h) / 16)
++
++#ifndef VT_FB_DEFAULT_WIDTH
++#define VT_FB_DEFAULT_WIDTH 640
++#endif
++#ifndef VT_FB_DEFAULT_HEIGHT
++#define VT_FB_DEFAULT_HEIGHT 480
++#endif
++
++#define VT_CONSDEV_DECLARE(driver, width, height, softc) \
++static struct terminal driver ## _consterm; \
++static struct vt_window driver ## _conswindow; \
++static struct vt_device driver ## _consdev = { \
++ .vd_driver = &driver, \
++ .vd_softc = (softc), \
++ .vd_flags = VDF_INVALID, \
++ .vd_windows = { [VT_CONSWINDOW] = &driver ## _conswindow, }, \
++ .vd_curwindow = &driver ## _conswindow, \
++ .vd_markedwin = NULL, \
++ .vd_kbstate = 0, \
++}; \
++static term_char_t driver ## _constextbuf[(width) * \
++ (VBF_DEFAULT_HISTORY_SIZE)]; \
++static term_char_t *driver ## _constextbufrows[ \
++ VBF_DEFAULT_HISTORY_SIZE]; \
++static struct vt_window driver ## _conswindow = { \
++ .vw_number = VT_CONSWINDOW, \
++ .vw_flags = VWF_CONSOLE, \
++ .vw_buf = { \
++ .vb_buffer = driver ## _constextbuf, \
++ .vb_rows = driver ## _constextbufrows, \
++ .vb_history_size = VBF_DEFAULT_HISTORY_SIZE, \
++ .vb_curroffset = 0, \
++ .vb_roffset = 0, \
++ .vb_flags = VBF_STATIC, \
++ .vb_mark_start = { \
++ .tp_row = 0, \
++ .tp_col = 0, \
++ }, \
++ .vb_mark_end = { \
++ .tp_row = 0, \
++ .tp_col = 0, \
++ }, \
++ .vb_scr_size = { \
++ .tp_row = height, \
++ .tp_col = width, \
++ }, \
++ }, \
++ .vw_device = &driver ## _consdev, \
++ .vw_terminal = &driver ## _consterm, \
++ .vw_kbdmode = K_XLATE, \
++}; \
++TERMINAL_DECLARE_EARLY(driver ## _consterm, vt_termclass, \
++ &driver ## _conswindow); \
++SYSINIT(vt_early_cons, SI_SUB_INT_CONFIG_HOOKS, SI_ORDER_ANY, \
++ vt_upgrade, &driver ## _consdev)
++
++/*
++ * Fonts.
++ *
++ * Remapping tables are used to map Unicode points to glyphs. They need
++ * to be sorted, because vtfont_lookup() performs a binary search. Each
++ * font has two remapping tables, for normal and bold. When a character
++ * is not present in bold, it uses a normal glyph. When no glyph is
++ * available, it uses glyph 0, which is normally equal to U+FFFD.
++ */
++
++struct vt_font_map {
++ uint32_t vfm_src;
++ uint16_t vfm_dst;
++ uint16_t vfm_len;
++};
++
++struct vt_font {
++ struct vt_font_map *vf_map[VFNT_MAPS];
++ uint8_t *vf_bytes;
++ unsigned int vf_height, vf_width;
++ unsigned int vf_map_count[VFNT_MAPS];
++ unsigned int vf_refcount;
++};
++
++#ifndef SC_NO_CUTPASTE
++struct mouse_cursor {
++ uint8_t map[64 * 64 / 8];
++ uint8_t mask[64 * 64 / 8];
++ uint8_t w;
++ uint8_t h;
++};
++#endif
++
++const uint8_t *vtfont_lookup(const struct vt_font *vf, term_char_t c);
++struct vt_font *vtfont_ref(struct vt_font *vf);
++void vtfont_unref(struct vt_font *vf);
++int vtfont_load(vfnt_t *f, struct vt_font **ret);
++
++/* Sysmouse. */
++void sysmouse_process_event(mouse_info_t *mi);
++#ifndef SC_NO_CUTPASTE
++void vt_mouse_event(int type, int x, int y, int event, int cnt, int mlevel);
++void vt_mouse_state(int show);
++#endif
++#define VT_MOUSE_SHOW 1
++#define VT_MOUSE_HIDE 0
++
++#endif /* !_DEV_VT_VT_H_ */
++
+--- /dev/null
++++ b/sys/dev/vt/vt_buf.c
+@@ -0,0 +1,734 @@
++/*-
++ * Copyright (c) 2009, 2013 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Ed Schouten under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * Portions of this software were developed by Oleksandr Rybalko
++ * under sponsorship from the FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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/kernel.h>
++#include <sys/lock.h>
++#include <sys/malloc.h>
++#include <sys/mutex.h>
++#include <sys/systm.h>
++
++#include <dev/vt/vt.h>
++
++static MALLOC_DEFINE(M_VTBUF, "vtbuf", "vt buffer");
++
++#define VTBUF_LOCK(vb) mtx_lock_spin(&(vb)->vb_lock)
++#define VTBUF_UNLOCK(vb) mtx_unlock_spin(&(vb)->vb_lock)
++
++#define POS_INDEX(c, r) (((r) << 12) + (c))
++#define POS_COPY(d, s) do { \
++ (d).tp_col = (s).tp_col; \
++ (d).tp_row = (s).tp_row; \
++} while (0)
++
++
++/*
++ * line4
++ * line5 <--- curroffset (terminal output to that line)
++ * line0
++ * line1 <--- roffset (history display from that point)
++ * line2
++ * line3
++ */
++int
++vthistory_seek(struct vt_buf *vb, int offset, int whence)
++{
++ int diff, top, bottom, roffset;
++
++ /* No scrolling if not enabled. */
++ if ((vb->vb_flags & VBF_SCROLL) == 0) {
++ if (vb->vb_roffset != vb->vb_curroffset) {
++ vb->vb_roffset = vb->vb_curroffset;
++ return (0xffff);
++ }
++ return (0); /* No changes */
++ }
++ top = (vb->vb_flags & VBF_HISTORY_FULL)?
++ (vb->vb_curroffset + vb->vb_scr_size.tp_row):vb->vb_history_size;
++ bottom = vb->vb_curroffset + vb->vb_history_size;
++
++ /*
++ * Operate on copy of offset value, since it temporary can be bigger
++ * than amount of rows in buffer.
++ */
++ roffset = vb->vb_roffset + vb->vb_history_size;
++ switch (whence) {
++ case VHS_SET:
++ roffset = offset + vb->vb_history_size;
++ break;
++ case VHS_CUR:
++ roffset += offset;
++ break;
++ case VHS_END:
++ /* Go to current offset. */
++ roffset = vb->vb_curroffset + vb->vb_history_size;
++ break;
++ }
++
++ roffset = (roffset < top)?top:roffset;
++ roffset = (roffset > bottom)?bottom:roffset;
++
++ roffset %= vb->vb_history_size;
++
++ if (vb->vb_roffset != roffset) {
++ diff = vb->vb_roffset - roffset;
++ vb->vb_roffset = roffset;
++ /*
++ * Offset changed, please update Nth lines on sceen.
++ * +N - Nth lines at top;
++ * -N - Nth lines at bottom.
++ */
++ return (diff);
++ }
++ return (0); /* No changes */
++}
++
++void
++vthistory_addlines(struct vt_buf *vb, int offset)
++{
++
++ vb->vb_curroffset += offset;
++ if (vb->vb_curroffset < 0)
++ vb->vb_curroffset = 0;
++ vb->vb_curroffset %= vb->vb_history_size;
++ if ((vb->vb_flags & VBF_SCROLL) == 0) {
++ vb->vb_roffset = vb->vb_curroffset;
++ }
++}
++
++void
++vthistory_getpos(const struct vt_buf *vb, unsigned int *offset)
++{
++
++ *offset = vb->vb_roffset;
++}
++
++#ifndef SC_NO_CUTPASTE /* Only mouse support use it now. */
++/* Translate current view row number to history row. */
++static int
++vtbuf_wth(struct vt_buf *vb, int row)
++{
++
++ return ((vb->vb_roffset + row) % vb->vb_history_size);
++}
++#endif
++
++/* Translate history row to current view row number. */
++static int
++vtbuf_htw(struct vt_buf *vb, int row)
++{
++
++ /*
++ * total 1000 rows.
++ * History offset roffset winrow
++ * 205 200 ((205 - 200 + 1000) % 1000) = 5
++ * 90 990 ((90 - 990 + 1000) % 1000) = 100
++ */
++ return ((row - vb->vb_roffset + vb->vb_history_size) %
++ vb->vb_history_size);
++}
++
++int
++vtbuf_iscursor(struct vt_buf *vb, int row, int col)
++{
++ int sc, sr, ec, er, tmp;
++
++ if ((vb->vb_flags & (VBF_CURSOR|VBF_SCROLL)) == VBF_CURSOR &&
++ (vb->vb_cursor.tp_row == row) && (vb->vb_cursor.tp_col == col))
++ return (1);
++
++ /* Mark cut/paste region. */
++
++ /*
++ * Luckily screen view is not like circular buffer, so we will
++ * calculate in screen coordinates. Translate first.
++ */
++ sc = vb->vb_mark_start.tp_col;
++ sr = vtbuf_htw(vb, vb->vb_mark_start.tp_row);
++ ec = vb->vb_mark_end.tp_col;
++ er = vtbuf_htw(vb, vb->vb_mark_end.tp_row);
++
++
++ /* Swap start and end if start > end. */
++ if (POS_INDEX(sc, sr) > POS_INDEX(ec, er)) {
++ tmp = sc; sc = ec; ec = tmp;
++ tmp = sr; sr = er; er = tmp;
++ }
++
++ if ((POS_INDEX(sc, sr) <= POS_INDEX(col, row)) &&
++ (POS_INDEX(col, row) < POS_INDEX(ec, er)))
++ return (1);
++
++ return (0);
++}
++
++static inline uint64_t
++vtbuf_dirty_axis(unsigned int begin, unsigned int end)
++{
++ uint64_t left, right, mask;
++
++ /*
++ * Mark all bits between begin % 64 and end % 64 dirty.
++ * This code is functionally equivalent to:
++ *
++ * for (i = begin; i < end; i++)
++ * mask |= (uint64_t)1 << (i % 64);
++ */
++
++ /* Obvious case. Mark everything dirty. */
++ if (end - begin >= 64)
++ return (VBM_DIRTY);
++
++ /* 1....0; used bits on the left. */
++ left = VBM_DIRTY << begin % 64;
++ /* 0....1; used bits on the right. */
++ right = VBM_DIRTY >> -end % 64;
++
++ /*
++ * Only take the intersection. If the result of that is 0, it
++ * means that the selection crossed a 64 bit boundary along the
++ * way, which means we have to take the complement.
++ */
++ mask = left & right;
++ if (mask == 0)
++ mask = left | right;
++ return (mask);
++}
++
++static inline void
++vtbuf_dirty(struct vt_buf *vb, const term_rect_t *area)
++{
++
++ VTBUF_LOCK(vb);
++ if (vb->vb_dirtyrect.tr_begin.tp_row > area->tr_begin.tp_row)
++ vb->vb_dirtyrect.tr_begin.tp_row = area->tr_begin.tp_row;
++ if (vb->vb_dirtyrect.tr_begin.tp_col > area->tr_begin.tp_col)
++ vb->vb_dirtyrect.tr_begin.tp_col = area->tr_begin.tp_col;
++ if (vb->vb_dirtyrect.tr_end.tp_row < area->tr_end.tp_row)
++ vb->vb_dirtyrect.tr_end.tp_row = area->tr_end.tp_row;
++ if (vb->vb_dirtyrect.tr_end.tp_col < area->tr_end.tp_col)
++ vb->vb_dirtyrect.tr_end.tp_col = area->tr_end.tp_col;
++ vb->vb_dirtymask.vbm_row |=
++ vtbuf_dirty_axis(area->tr_begin.tp_row, area->tr_end.tp_row);
++ vb->vb_dirtymask.vbm_col |=
++ vtbuf_dirty_axis(area->tr_begin.tp_col, area->tr_end.tp_col);
++ VTBUF_UNLOCK(vb);
++}
++
++static inline void
++vtbuf_dirty_cell(struct vt_buf *vb, const term_pos_t *p)
++{
++ term_rect_t area;
++
++ area.tr_begin = *p;
++ area.tr_end.tp_row = p->tp_row + 1;
++ area.tr_end.tp_col = p->tp_col + 1;
++ vtbuf_dirty(vb, &area);
++}
++
++static void
++vtbuf_make_undirty(struct vt_buf *vb)
++{
++
++ vb->vb_dirtyrect.tr_begin = vb->vb_scr_size;
++ vb->vb_dirtyrect.tr_end.tp_row = vb->vb_dirtyrect.tr_end.tp_col = 0;
++ vb->vb_dirtymask.vbm_row = vb->vb_dirtymask.vbm_col = 0;
++}
++
++void
++vtbuf_undirty(struct vt_buf *vb, term_rect_t *r, struct vt_bufmask *m)
++{
++
++ VTBUF_LOCK(vb);
++ *r = vb->vb_dirtyrect;
++ *m = vb->vb_dirtymask;
++ vtbuf_make_undirty(vb);
++ VTBUF_UNLOCK(vb);
++}
++
++void
++vtbuf_copy(struct vt_buf *vb, const term_rect_t *r, const term_pos_t *p2)
++{
++ const term_pos_t *p1 = &r->tr_begin;
++ term_rect_t area;
++ unsigned int rows, cols;
++ int pr, rdiff;
++
++ KASSERT(r->tr_begin.tp_row < vb->vb_scr_size.tp_row,
++ ("vtbuf_copy begin.tp_row %d must be less than screen width %d",
++ r->tr_begin.tp_row, vb->vb_scr_size.tp_row));
++ KASSERT(r->tr_begin.tp_col < vb->vb_scr_size.tp_col,
++ ("vtbuf_copy begin.tp_col %d must be less than screen height %d",
++ r->tr_begin.tp_col, vb->vb_scr_size.tp_col));
++
++ KASSERT(r->tr_end.tp_row <= vb->vb_scr_size.tp_row,
++ ("vtbuf_copy end.tp_row %d must be less than screen width %d",
++ r->tr_end.tp_row, vb->vb_scr_size.tp_row));
++ KASSERT(r->tr_end.tp_col <= vb->vb_scr_size.tp_col,
++ ("vtbuf_copy end.tp_col %d must be less than screen height %d",
++ r->tr_end.tp_col, vb->vb_scr_size.tp_col));
++
++ KASSERT(p2->tp_row < vb->vb_scr_size.tp_row,
++ ("vtbuf_copy tp_row %d must be less than screen width %d",
++ p2->tp_row, vb->vb_scr_size.tp_row));
++ KASSERT(p2->tp_col < vb->vb_scr_size.tp_col,
++ ("vtbuf_copy tp_col %d must be less than screen height %d",
++ p2->tp_col, vb->vb_scr_size.tp_col));
++
++ rows = r->tr_end.tp_row - r->tr_begin.tp_row;
++ rdiff = r->tr_begin.tp_row - p2->tp_row;
++ cols = r->tr_end.tp_col - r->tr_begin.tp_col;
++ if (r->tr_begin.tp_row > p2->tp_row && r->tr_begin.tp_col == 0 &&
++ r->tr_end.tp_col == vb->vb_scr_size.tp_col && /* Full row. */
++ (rows + rdiff) == vb->vb_scr_size.tp_row && /* Whole screen. */
++ rdiff > 0) { /* Only forward dirrection. Do not eat history. */
++ vthistory_addlines(vb, rdiff);
++ } else if (p2->tp_row < p1->tp_row) {
++ /* Handle overlapping copies of line segments. */
++ /* Move data up. */
++ for (pr = 0; pr < rows; pr++)
++ memmove(
++ &VTBUF_FIELD(vb, p2->tp_row + pr, p2->tp_col),
++ &VTBUF_FIELD(vb, p1->tp_row + pr, p1->tp_col),
++ cols * sizeof(term_char_t));
++ } else {
++ /* Move data down. */
++ for (pr = rows - 1; pr >= 0; pr--)
++ memmove(
++ &VTBUF_FIELD(vb, p2->tp_row + pr, p2->tp_col),
++ &VTBUF_FIELD(vb, p1->tp_row + pr, p1->tp_col),
++ cols * sizeof(term_char_t));
++ }
++
++ area.tr_begin = *p2;
++ area.tr_end.tp_row = MIN(p2->tp_row + rows, vb->vb_scr_size.tp_row);
++ area.tr_end.tp_col = MIN(p2->tp_col + cols, vb->vb_scr_size.tp_col);
++ vtbuf_dirty(vb, &area);
++}
++
++static void
++vtbuf_fill(struct vt_buf *vb, const term_rect_t *r, term_char_t c)
++{
++ unsigned int pr, pc;
++ term_char_t *row;
++
++ for (pr = r->tr_begin.tp_row; pr < r->tr_end.tp_row; pr++) {
++ row = vb->vb_rows[(vb->vb_curroffset + pr) %
++ VTBUF_MAX_HEIGHT(vb)];
++ for (pc = r->tr_begin.tp_col; pc < r->tr_end.tp_col; pc++) {
++ row[pc] = c;
++ }
++ }
++}
++
++void
++vtbuf_fill_locked(struct vt_buf *vb, const term_rect_t *r, term_char_t c)
++{
++ KASSERT(r->tr_begin.tp_row < vb->vb_scr_size.tp_row,
++ ("vtbuf_fill_locked begin.tp_row %d must be < screen width %d",
++ r->tr_begin.tp_row, vb->vb_scr_size.tp_row));
++ KASSERT(r->tr_begin.tp_col < vb->vb_scr_size.tp_col,
++ ("vtbuf_fill_locked begin.tp_col %d must be < screen height %d",
++ r->tr_begin.tp_col, vb->vb_scr_size.tp_col));
++
++ KASSERT(r->tr_end.tp_row <= vb->vb_scr_size.tp_row,
++ ("vtbuf_fill_locked end.tp_row %d must be <= screen width %d",
++ r->tr_end.tp_row, vb->vb_scr_size.tp_row));
++ KASSERT(r->tr_end.tp_col <= vb->vb_scr_size.tp_col,
++ ("vtbuf_fill_locked end.tp_col %d must be <= screen height %d",
++ r->tr_end.tp_col, vb->vb_scr_size.tp_col));
++
++ VTBUF_LOCK(vb);
++ vtbuf_fill(vb, r, c);
++ VTBUF_UNLOCK(vb);
++
++ vtbuf_dirty(vb, r);
++}
++
++static void
++vtbuf_init_rows(struct vt_buf *vb)
++{
++ int r;
++
++ vb->vb_history_size = MAX(vb->vb_history_size, vb->vb_scr_size.tp_row);
++
++ for (r = 0; r < vb->vb_history_size; r++)
++ vb->vb_rows[r] = &vb->vb_buffer[r *
++ vb->vb_scr_size.tp_col];
++}
++
++void
++vtbuf_init_early(struct vt_buf *vb)
++{
++
++ vb->vb_flags |= VBF_CURSOR;
++ vb->vb_roffset = 0;
++ vb->vb_curroffset = 0;
++ vb->vb_mark_start.tp_row = 0;
++ vb->vb_mark_start.tp_col = 0;
++ vb->vb_mark_end.tp_row = 0;
++ vb->vb_mark_end.tp_col = 0;
++
++ vtbuf_init_rows(vb);
++ vtbuf_make_undirty(vb);
++ if ((vb->vb_flags & VBF_MTX_INIT) == 0) {
++ mtx_init(&vb->vb_lock, "vtbuf", NULL, MTX_SPIN);
++ vb->vb_flags |= VBF_MTX_INIT;
++ }
++}
++
++void
++vtbuf_init(struct vt_buf *vb, const term_pos_t *p)
++{
++ int sz;
++
++ vb->vb_scr_size = *p;
++ vb->vb_history_size = VBF_DEFAULT_HISTORY_SIZE;
++
++ if ((vb->vb_flags & VBF_STATIC) == 0) {
++ sz = vb->vb_history_size * p->tp_col * sizeof(term_char_t);
++ vb->vb_buffer = malloc(sz, M_VTBUF, M_WAITOK | M_ZERO);
++
++ sz = vb->vb_history_size * sizeof(term_char_t *);
++ vb->vb_rows = malloc(sz, M_VTBUF, M_WAITOK | M_ZERO);
++ }
++
++ vtbuf_init_early(vb);
++}
++
++void
++vtbuf_sethistory_size(struct vt_buf *vb, int size)
++{
++ term_pos_t p;
++
++ /* With same size */
++ p.tp_row = vb->vb_scr_size.tp_row;
++ p.tp_col = vb->vb_scr_size.tp_col;
++ vtbuf_grow(vb, &p, size);
++}
++
++void
++vtbuf_grow(struct vt_buf *vb, const term_pos_t *p, int history_size)
++{
++ term_char_t *old, *new, **rows, **oldrows, **copyrows, *row;
++ int bufsize, rowssize, w, h, c, r;
++ term_rect_t rect;
++
++ history_size = MAX(history_size, p->tp_row);
++
++ if (history_size > vb->vb_history_size || p->tp_col >
++ vb->vb_scr_size.tp_col) {
++ /* Allocate new buffer. */
++ bufsize = history_size * p->tp_col * sizeof(term_char_t);
++ new = malloc(bufsize, M_VTBUF, M_WAITOK | M_ZERO);
++ rowssize = history_size * sizeof(term_pos_t *);
++ rows = malloc(rowssize, M_VTBUF, M_WAITOK | M_ZERO);
++
++ /* Toggle it. */
++ VTBUF_LOCK(vb);
++ old = vb->vb_flags & VBF_STATIC ? NULL : vb->vb_buffer;
++ oldrows = vb->vb_flags & VBF_STATIC ? NULL : vb->vb_rows;
++ copyrows = vb->vb_rows;
++ w = vb->vb_scr_size.tp_col;
++ h = vb->vb_history_size;
++
++ vb->vb_history_size = history_size;
++ vb->vb_buffer = new;
++ vb->vb_rows = rows;
++ vb->vb_flags &= ~VBF_STATIC;
++ vb->vb_scr_size = *p;
++ vtbuf_init_rows(vb);
++
++ /* Copy history and fill extra space. */
++ for (r = 0; r < history_size; r ++) {
++ row = rows[r];
++ if (r < h) { /* Copy. */
++ memmove(rows[r], copyrows[r],
++ MIN(p->tp_col, w) * sizeof(term_char_t));
++ for (c = MIN(p->tp_col, w); c < p->tp_col;
++ c++) {
++ row[c] = VTBUF_SPACE_CHAR;
++ }
++ } else { /* Just fill. */
++ rect.tr_begin.tp_col = 0;
++ rect.tr_begin.tp_row = r;
++ rect.tr_end.tp_col = p->tp_col;
++ rect.tr_end.tp_row = p->tp_row;
++ vtbuf_fill(vb, &rect, VTBUF_SPACE_CHAR);
++ break;
++ }
++ }
++ vtbuf_make_undirty(vb);
++ VTBUF_UNLOCK(vb);
++ /* Deallocate old buffer. */
++ free(old, M_VTBUF);
++ free(oldrows, M_VTBUF);
++ }
++}
++
++void
++vtbuf_putchar(struct vt_buf *vb, const term_pos_t *p, term_char_t c)
++{
++ term_char_t *row;
++
++ KASSERT(p->tp_row < vb->vb_scr_size.tp_row,
++ ("vtbuf_putchar tp_row %d must be less than screen width %d",
++ p->tp_row, vb->vb_scr_size.tp_row));
++ KASSERT(p->tp_col < vb->vb_scr_size.tp_col,
++ ("vtbuf_putchar tp_col %d must be less than screen height %d",
++ p->tp_col, vb->vb_scr_size.tp_col));
++
++ row = vb->vb_rows[(vb->vb_curroffset + p->tp_row) %
++ VTBUF_MAX_HEIGHT(vb)];
++ if (row[p->tp_col] != c) {
++ VTBUF_LOCK(vb);
++ row[p->tp_col] = c;
++ VTBUF_UNLOCK(vb);
++ vtbuf_dirty_cell(vb, p);
++ }
++}
++
++void
++vtbuf_cursor_position(struct vt_buf *vb, const term_pos_t *p)
++{
++
++ if (vb->vb_flags & VBF_CURSOR) {
++ vtbuf_dirty_cell(vb, &vb->vb_cursor);
++ vb->vb_cursor = *p;
++ vtbuf_dirty_cell(vb, &vb->vb_cursor);
++ } else {
++ vb->vb_cursor = *p;
++ }
++}
++
++#ifndef SC_NO_CUTPASTE
++void
++vtbuf_mouse_cursor_position(struct vt_buf *vb, int col, int row)
++{
++ term_rect_t area;
++
++ area.tr_begin.tp_row = MAX(row - 1, 0);
++ area.tr_begin.tp_col = MAX(col - 1, 0);
++ area.tr_end.tp_row = MIN(row + 2, vb->vb_scr_size.tp_row);
++ area.tr_end.tp_col = MIN(col + 2, vb->vb_scr_size.tp_col);
++ vtbuf_dirty(vb, &area);
++}
++
++static void
++vtbuf_flush_mark(struct vt_buf *vb)
++{
++ term_rect_t area;
++ int s, e;
++
++ /* Notify renderer to update marked region. */
++ if (vb->vb_mark_start.tp_col || vb->vb_mark_end.tp_col ||
++ vb->vb_mark_start.tp_row || vb->vb_mark_end.tp_row) {
++
++ s = vtbuf_htw(vb, vb->vb_mark_start.tp_row);
++ e = vtbuf_htw(vb, vb->vb_mark_end.tp_row);
++
++ area.tr_begin.tp_col = 0;
++ area.tr_begin.tp_row = MIN(s, e);
++
++ area.tr_end.tp_col = vb->vb_scr_size.tp_col;
++ area.tr_end.tp_row = MAX(s, e) + 1;
++
++ vtbuf_dirty(vb, &area);
++ }
++}
++
++int
++vtbuf_get_marked_len(struct vt_buf *vb)
++{
++ int ei, si, sz;
++ term_pos_t s, e;
++
++ /* Swap according to window coordinates. */
++ if (POS_INDEX(vtbuf_htw(vb, vb->vb_mark_start.tp_row),
++ vb->vb_mark_start.tp_col) >
++ POS_INDEX(vtbuf_htw(vb, vb->vb_mark_end.tp_row),
++ vb->vb_mark_end.tp_col)) {
++ POS_COPY(e, vb->vb_mark_start);
++ POS_COPY(s, vb->vb_mark_end);
++ } else {
++ POS_COPY(s, vb->vb_mark_start);
++ POS_COPY(e, vb->vb_mark_end);
++ }
++
++ si = s.tp_row * vb->vb_scr_size.tp_col + s.tp_col;
++ ei = e.tp_row * vb->vb_scr_size.tp_col + e.tp_col;
++
++ /* Number symbols and number of rows to inject \n */
++ sz = ei - si + ((e.tp_row - s.tp_row) * 2) + 1;
++
++ return (sz * sizeof(term_char_t));
++}
++
++void
++vtbuf_extract_marked(struct vt_buf *vb, term_char_t *buf, int sz)
++{
++ int i, r, c, cs, ce;
++ term_pos_t s, e;
++
++ /* Swap according to window coordinates. */
++ if (POS_INDEX(vtbuf_htw(vb, vb->vb_mark_start.tp_row),
++ vb->vb_mark_start.tp_col) >
++ POS_INDEX(vtbuf_htw(vb, vb->vb_mark_end.tp_row),
++ vb->vb_mark_end.tp_col)) {
++ POS_COPY(e, vb->vb_mark_start);
++ POS_COPY(s, vb->vb_mark_end);
++ } else {
++ POS_COPY(s, vb->vb_mark_start);
++ POS_COPY(e, vb->vb_mark_end);
++ }
++
++ i = 0;
++ for (r = s.tp_row; r <= e.tp_row; r ++) {
++ cs = (r == s.tp_row)?s.tp_col:0;
++ ce = (r == e.tp_row)?e.tp_col:vb->vb_scr_size.tp_col;
++ for (c = cs; c < ce; c ++) {
++ buf[i++] = vb->vb_rows[r][c];
++ }
++ /* Add new line for all rows, but not for last one. */
++ if (r != e.tp_row) {
++ buf[i++] = '\r';
++ buf[i++] = '\n';
++ }
++ }
++}
++
++int
++vtbuf_set_mark(struct vt_buf *vb, int type, int col, int row)
++{
++ term_char_t *r;
++ int i;
++
++ switch (type) {
++ case VTB_MARK_END: /* B1 UP */
++ if (vb->vb_mark_last != VTB_MARK_MOVE)
++ return (0);
++ /* FALLTHROUGH */
++ case VTB_MARK_MOVE:
++ case VTB_MARK_EXTEND:
++ vtbuf_flush_mark(vb); /* Clean old mark. */
++ vb->vb_mark_end.tp_col = col;
++ vb->vb_mark_end.tp_row = vtbuf_wth(vb, row);
++ break;
++ case VTB_MARK_START:
++ vtbuf_flush_mark(vb); /* Clean old mark. */
++ vb->vb_mark_start.tp_col = col;
++ vb->vb_mark_start.tp_row = vtbuf_wth(vb, row);
++ /* Start again, so clear end point. */
++ vb->vb_mark_end.tp_col = col;
++ vb->vb_mark_end.tp_row = vtbuf_wth(vb, row);
++ break;
++ case VTB_MARK_WORD:
++ vtbuf_flush_mark(vb); /* Clean old mark. */
++ vb->vb_mark_start.tp_row = vb->vb_mark_end.tp_row =
++ vtbuf_wth(vb, row);
++ r = vb->vb_rows[vb->vb_mark_start.tp_row];
++ for (i = col; i >= 0; i --) {
++ if (TCHAR_CHARACTER(r[i]) == ' ') {
++ vb->vb_mark_start.tp_col = i + 1;
++ break;
++ }
++ }
++ for (i = col; i < vb->vb_scr_size.tp_col; i ++) {
++ if (TCHAR_CHARACTER(r[i]) == ' ') {
++ vb->vb_mark_end.tp_col = i;
++ break;
++ }
++ }
++ if (vb->vb_mark_start.tp_col > vb->vb_mark_end.tp_col)
++ vb->vb_mark_start.tp_col = vb->vb_mark_end.tp_col;
++ break;
++ case VTB_MARK_ROW:
++ vtbuf_flush_mark(vb); /* Clean old mark. */
++ vb->vb_mark_start.tp_col = 0;
++ vb->vb_mark_end.tp_col = vb->vb_scr_size.tp_col;
++ vb->vb_mark_start.tp_row = vb->vb_mark_end.tp_row =
++ vtbuf_wth(vb, row);
++ break;
++ case VTB_MARK_NONE:
++ vb->vb_mark_last = type;
++ /* FALLTHROUGH */
++ default:
++ /* panic? */
++ return (0);
++ }
++
++ vb->vb_mark_last = type;
++ /* Draw new marked region. */
++ vtbuf_flush_mark(vb);
++ return (1);
++}
++#endif
++
++void
++vtbuf_cursor_visibility(struct vt_buf *vb, int yes)
++{
++ int oflags, nflags;
++
++ VTBUF_LOCK(vb);
++ oflags = vb->vb_flags;
++ if (yes)
++ vb->vb_flags |= VBF_CURSOR;
++ else
++ vb->vb_flags &= ~VBF_CURSOR;
++ nflags = vb->vb_flags;
++ VTBUF_UNLOCK(vb);
++
++ if (oflags != nflags)
++ vtbuf_dirty_cell(vb, &vb->vb_cursor);
++}
++
++void
++vtbuf_scroll_mode(struct vt_buf *vb, int yes)
++{
++ int oflags, nflags;
++
++ VTBUF_LOCK(vb);
++ oflags = vb->vb_flags;
++ if (yes)
++ vb->vb_flags |= VBF_SCROLL;
++ else
++ vb->vb_flags &= ~VBF_SCROLL;
++ nflags = vb->vb_flags;
++ VTBUF_UNLOCK(vb);
++
++ if (oflags != nflags)
++ vtbuf_dirty_cell(vb, &vb->vb_cursor);
++}
++
+--- /dev/null
++++ b/sys/dev/vt/vt_consolectl.c
+@@ -0,0 +1,78 @@
++/*-
++ * Copyright (c) 2009 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Ed Schouten under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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/consio.h>
++#include <sys/kernel.h>
++#include <sys/systm.h>
++
++#include <dev/vt/vt.h>
++
++static d_ioctl_t consolectl_ioctl;
++
++static struct cdevsw consolectl_cdevsw = {
++ .d_version = D_VERSION,
++ .d_ioctl = consolectl_ioctl,
++ .d_name = "consolectl",
++};
++
++static int
++consolectl_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag,
++ struct thread *td)
++{
++
++ switch (cmd) {
++ case CONS_GETVERS:
++ *(int*)data = 0x200;
++ return 0;
++ case CONS_MOUSECTL: {
++ mouse_info_t *mi = (mouse_info_t*)data;
++
++ sysmouse_process_event(mi);
++ return (0);
++ }
++ default:
++ printf("consolectl: unknown ioctl: %c:%lx\n",
++ (char)IOCGROUP(cmd), IOCBASECMD(cmd));
++ return (ENOIOCTL);
++ }
++}
++
++static void
++consolectl_drvinit(void *unused)
++{
++
++ make_dev(&consolectl_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600,
++ "consolectl");
++}
++
++SYSINIT(consolectl, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, consolectl_drvinit, NULL);
+--- /dev/null
++++ b/sys/dev/vt/vt_core.c
+@@ -0,0 +1,1981 @@
++/*-
++ * Copyright (c) 2009, 2013 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Ed Schouten under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * Portions of this software were developed by Oleksandr Rybalko
++ * under sponsorship from the FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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 "opt_compat.h"
++
++#include <sys/param.h>
++#include <sys/consio.h>
++#include <sys/eventhandler.h>
++#include <sys/fbio.h>
++#include <sys/kbio.h>
++#include <sys/kdb.h>
++#include <sys/kernel.h>
++#include <sys/lock.h>
++#include <sys/malloc.h>
++#include <sys/mutex.h>
++#include <sys/priv.h>
++#include <sys/proc.h>
++#include <sys/reboot.h>
++#include <sys/systm.h>
++#include <sys/terminal.h>
++
++#include <dev/kbd/kbdreg.h>
++#include <dev/vt/vt.h>
++
++#if defined(__i386__) || defined(__amd64__)
++#include <machine/psl.h>
++#include <machine/frame.h>
++#endif
++
++static tc_bell_t vtterm_bell;
++static tc_cursor_t vtterm_cursor;
++static tc_putchar_t vtterm_putchar;
++static tc_fill_t vtterm_fill;
++static tc_copy_t vtterm_copy;
++static tc_param_t vtterm_param;
++static tc_done_t vtterm_done;
++
++static tc_cnprobe_t vtterm_cnprobe;
++static tc_cngetc_t vtterm_cngetc;
++
++static tc_opened_t vtterm_opened;
++static tc_ioctl_t vtterm_ioctl;
++static tc_mmap_t vtterm_mmap;
++
++const struct terminal_class vt_termclass = {
++ .tc_bell = vtterm_bell,
++ .tc_cursor = vtterm_cursor,
++ .tc_putchar = vtterm_putchar,
++ .tc_fill = vtterm_fill,
++ .tc_copy = vtterm_copy,
++ .tc_param = vtterm_param,
++ .tc_done = vtterm_done,
++
++ .tc_cnprobe = vtterm_cnprobe,
++ .tc_cngetc = vtterm_cngetc,
++
++ .tc_opened = vtterm_opened,
++ .tc_ioctl = vtterm_ioctl,
++ .tc_mmap = vtterm_mmap,
++};
++
++/*
++ * Use a constant timer of 25 Hz to redraw the screen.
++ *
++ * XXX: In theory we should only fire up the timer when there is really
++ * activity. Unfortunately we cannot always start timers. We really
++ * don't want to process kernel messages synchronously, because it
++ * really slows down the system.
++ */
++#define VT_TIMERFREQ 25
++
++/* Bell pitch/duration. */
++#define VT_BELLDURATION ((5 * hz + 99) / 100)
++#define VT_BELLPITCH 800
++
++#define VT_LOCK(vd) mtx_lock(&(vd)->vd_lock)
++#define VT_UNLOCK(vd) mtx_unlock(&(vd)->vd_lock)
++
++#define VT_UNIT(vw) ((vw)->vw_device->vd_unit * VT_MAXWINDOWS + \
++ (vw)->vw_number)
++
++/* XXX while syscons is here. */
++int sc_txtmouse_no_retrace_wait;
++
++static SYSCTL_NODE(_kern, OID_AUTO, vt, CTLFLAG_RD, 0, "vt(9) parameters");
++VT_SYSCTL_INT(enable_altgr, 1, "Enable AltGr key (Do not assume R.Alt as Alt)");
++VT_SYSCTL_INT(debug, 0, "vt(9) debug level");
++VT_SYSCTL_INT(deadtimer, 15, "Time to wait busy process in VT_PROCESS mode");
++VT_SYSCTL_INT(suspendswitch, 1, "Switch to VT0 before suspend");
++
++static unsigned int vt_unit = 0;
++static MALLOC_DEFINE(M_VT, "vt", "vt device");
++struct vt_device *main_vd = NULL;
++
++/* Boot logo. */
++extern unsigned int vt_logo_width;
++extern unsigned int vt_logo_height;
++extern unsigned int vt_logo_depth;
++extern unsigned char vt_logo_image[];
++
++/* Font. */
++extern struct vt_font vt_font_default;
++#ifndef SC_NO_CUTPASTE
++extern struct mouse_cursor vt_default_mouse_pointer;
++#endif
++
++static int signal_vt_rel(struct vt_window *);
++static int signal_vt_acq(struct vt_window *);
++static int finish_vt_rel(struct vt_window *, int, int *);
++static int finish_vt_acq(struct vt_window *);
++static int vt_window_switch(struct vt_window *);
++static int vt_late_window_switch(struct vt_window *);
++static int vt_proc_alive(struct vt_window *);
++static void vt_resize(struct vt_device *);
++
++static void
++vt_switch_timer(void *arg)
++{
++
++ vt_late_window_switch((struct vt_window *)arg);
++}
++
++static int
++vt_window_preswitch(struct vt_window *vw, struct vt_window *curvw)
++{
++
++ DPRINTF(40, "%s\n", __func__);
++ curvw->vw_switch_to = vw;
++ /* Set timer to allow switch in case when process hang. */
++ callout_reset(&vw->vw_proc_dead_timer, hz * vt_deadtimer,
++ vt_switch_timer, (void *)vw);
++ /* Notify process about vt switch attempt. */
++ DPRINTF(30, "%s: Notify process.\n", __func__);
++ signal_vt_rel(curvw);
++
++ return (0);
++}
++
++static int
++vt_window_postswitch(struct vt_window *vw)
++{
++
++ signal_vt_acq(vw);
++ return (0);
++}
++
++/* vt_late_window_switch will done VT switching for regular case. */
++static int
++vt_late_window_switch(struct vt_window *vw)
++{
++ int ret;
++
++ callout_stop(&vw->vw_proc_dead_timer);
++
++ ret = vt_window_switch(vw);
++ if (ret)
++ return (ret);
++
++ /* Notify owner process about terminal availability. */
++ if (vw->vw_smode.mode == VT_PROCESS) {
++ ret = vt_window_postswitch(vw);
++ }
++ return (ret);
++}
++
++/* Switch window. */
++static int
++vt_proc_window_switch(struct vt_window *vw)
++{
++ struct vt_window *curvw;
++ struct vt_device *vd;
++ int ret;
++
++ if (vw->vw_flags & VWF_VTYLOCK)
++ return (EBUSY);
++
++ vd = vw->vw_device;
++ curvw = vd->vd_curwindow;
++
++ /* Ask current process permitions to switch away. */
++ if (curvw->vw_smode.mode == VT_PROCESS) {
++ DPRINTF(30, "%s: VT_PROCESS ", __func__);
++ if (vt_proc_alive(curvw) == FALSE) {
++ DPRINTF(30, "Dead. Cleaning.");
++ /* Dead */
++ } else {
++ DPRINTF(30, "%s: Signaling process.\n", __func__);
++ /* Alive, try to ask him. */
++ ret = vt_window_preswitch(vw, curvw);
++ /* Wait for process answer or timeout. */
++ return (ret);
++ }
++ DPRINTF(30, "\n");
++ }
++
++ ret = vt_late_window_switch(vw);
++ return (ret);
++}
++
++/* Switch window ignoring process locking. */
++static int
++vt_window_switch(struct vt_window *vw)
++{
++ struct vt_device *vd = vw->vw_device;
++ struct vt_window *curvw = vd->vd_curwindow;
++ keyboard_t *kbd;
++
++ VT_LOCK(vd);
++ if (curvw == vw) {
++ /* Nothing to do. */
++ VT_UNLOCK(vd);
++ return (0);
++ }
++ if (!(vw->vw_flags & (VWF_OPENED|VWF_CONSOLE))) {
++ VT_UNLOCK(vd);
++ return (EINVAL);
++ }
++
++ vd->vd_curwindow = vw;
++ vd->vd_flags |= VDF_INVALID;
++ cv_broadcast(&vd->vd_winswitch);
++ VT_UNLOCK(vd);
++
++ if (vd->vd_driver->vd_postswitch)
++ vd->vd_driver->vd_postswitch(vd);
++
++ /* Restore per-window keyboard mode. */
++ mtx_lock(&Giant);
++ kbd = kbd_get_keyboard(vd->vd_keyboard);
++ if (kbd != NULL) {
++ kbdd_ioctl(kbd, KDSKBMODE, (void *)&vw->vw_kbdmode);
++ }
++ mtx_unlock(&Giant);
++ DPRINTF(10, "%s(ttyv%d) done\n", __func__, vw->vw_number);
++
++ return (0);
++}
++
++static inline void
++vt_termsize(struct vt_device *vd, struct vt_font *vf, term_pos_t *size)
++{
++
++ size->tp_row = vd->vd_height;
++ size->tp_col = vd->vd_width;
++ if (vf != NULL) {
++ size->tp_row /= vf->vf_height;
++ size->tp_col /= vf->vf_width;
++ }
++}
++
++static inline void
++vt_winsize(struct vt_device *vd, struct vt_font *vf, struct winsize *size)
++{
++
++ size->ws_row = size->ws_ypixel = vd->vd_height;
++ size->ws_col = size->ws_xpixel = vd->vd_width;
++ if (vf != NULL) {
++ size->ws_row /= vf->vf_height;
++ size->ws_col /= vf->vf_width;
++ }
++}
++
++static void
++vt_scroll(struct vt_window *vw, int offset, int whence)
++{
++ int diff;
++ term_pos_t size;
++
++ if ((vw->vw_flags & VWF_SCROLL) == 0)
++ return;
++
++ vt_termsize(vw->vw_device, vw->vw_font, &size);
++
++ diff = vthistory_seek(&vw->vw_buf, offset, whence);
++ /*
++ * Offset changed, please update Nth lines on sceen.
++ * +N - Nth lines at top;
++ * -N - Nth lines at bottom.
++ */
++
++ if (diff < -size.tp_row || diff > size.tp_row) {
++ vw->vw_device->vd_flags |= VDF_INVALID;
++ return;
++ }
++ vw->vw_device->vd_flags |= VDF_INVALID; /*XXX*/
++}
++
++static int
++vt_machine_kbdevent(int c)
++{
++
++ switch (c) {
++ case SPCLKEY | DBG:
++ kdb_enter(KDB_WHY_BREAK, "manual escape to debugger");
++ return (1);
++ case SPCLKEY | RBT:
++ /* XXX: Make this configurable! */
++ shutdown_nice(0);
++ return (1);
++ case SPCLKEY | HALT:
++ shutdown_nice(RB_HALT);
++ return (1);
++ case SPCLKEY | PDWN:
++ shutdown_nice(RB_HALT|RB_POWEROFF);
++ return (1);
++ };
++
++ return (0);
++}
++
++static void
++vt_scrollmode_kbdevent(struct vt_window *vw, int c, int console)
++{
++ struct vt_device *vd;
++ term_pos_t size;
++
++ vd = vw->vw_device;
++ /* Only special keys handled in ScrollLock mode */
++ if ((c & SPCLKEY) == 0)
++ return;
++
++ c &= ~SPCLKEY;
++
++ if (console == 0) {
++ if (c >= F_SCR && c <= MIN(L_SCR, F_SCR + VT_MAXWINDOWS - 1)) {
++ vw = vd->vd_windows[c - F_SCR];
++ if (vw != NULL)
++ vt_proc_window_switch(vw);
++ return;
++ }
++ VT_LOCK(vd);
++ }
++
++ switch (c) {
++ case SLK: {
++ /* Turn scrolling off. */
++ vt_scroll(vw, 0, VHS_END);
++ VTBUF_SLCK_DISABLE(&vw->vw_buf);
++ vw->vw_flags &= ~VWF_SCROLL;
++ break;
++ }
++ case FKEY | F(49): /* Home key. */
++ vt_scroll(vw, 0, VHS_SET);
++ break;
++ case FKEY | F(50): /* Arrow up. */
++ vt_scroll(vw, -1, VHS_CUR);
++ break;
++ case FKEY | F(51): /* Page up. */
++ vt_termsize(vd, vw->vw_font, &size);
++ vt_scroll(vw, -size.tp_row, VHS_CUR);
++ break;
++ case FKEY | F(57): /* End key. */
++ vt_scroll(vw, 0, VHS_END);
++ break;
++ case FKEY | F(58): /* Arrow down. */
++ vt_scroll(vw, 1, VHS_CUR);
++ break;
++ case FKEY | F(59): /* Page down. */
++ vt_termsize(vd, vw->vw_font, &size);
++ vt_scroll(vw, size.tp_row, VHS_CUR);
++ break;
++ }
++
++ if (console == 0)
++ VT_UNLOCK(vd);
++}
++
++static int
++vt_processkey(keyboard_t *kbd, struct vt_device *vd, int c)
++{
++ struct vt_window *vw = vd->vd_curwindow;
++ int state = 0;
++
++#if VT_ALT_TO_ESC_HACK
++ if (c & RELKEY) {
++ switch (c & ~RELKEY) {
++ case (SPCLKEY | RALT):
++ if (vt_enable_altgr != 0)
++ break;
++ case (SPCLKEY | LALT):
++ vd->vd_kbstate &= ~ALKED;
++ }
++ /* Other keys ignored for RELKEY event. */
++ return (0);
++ } else {
++ switch (c & ~RELKEY) {
++ case (SPCLKEY | RALT):
++ if (vt_enable_altgr != 0)
++ break;
++ case (SPCLKEY | LALT):
++ vd->vd_kbstate |= ALKED;
++ }
++ }
++#else
++ if (c & RELKEY)
++ /* Other keys ignored for RELKEY event. */
++ return (0);
++#endif
++
++ if (vt_machine_kbdevent(c))
++ return (0);
++
++ if (vw->vw_flags & VWF_SCROLL) {
++ vt_scrollmode_kbdevent(vw, c, 0/* Not a console */);
++ /* Scroll mode keys handled, nothing to do more. */
++ return (0);
++ }
++
++ if (c & SPCLKEY) {
++ c &= ~SPCLKEY;
++
++ if (c >= F_SCR && c <= MIN(L_SCR, F_SCR + VT_MAXWINDOWS - 1)) {
++ vw = vd->vd_windows[c - F_SCR];
++ if (vw != NULL)
++ vt_proc_window_switch(vw);
++ return (0);
++ }
++
++ switch (c) {
++ case SLK: {
++
++ kbdd_ioctl(kbd, KDGKBSTATE, (caddr_t)&state);
++ VT_LOCK(vd);
++ if (state & SLKED) {
++ /* Turn scrolling on. */
++ vw->vw_flags |= VWF_SCROLL;
++ VTBUF_SLCK_ENABLE(&vw->vw_buf);
++ } else {
++ /* Turn scrolling off. */
++ vw->vw_flags &= ~VWF_SCROLL;
++ VTBUF_SLCK_DISABLE(&vw->vw_buf);
++ vt_scroll(vw, 0, VHS_END);
++ }
++ VT_UNLOCK(vd);
++ break;
++ }
++ case FKEY | F(1): case FKEY | F(2): case FKEY | F(3):
++ case FKEY | F(4): case FKEY | F(5): case FKEY | F(6):
++ case FKEY | F(7): case FKEY | F(8): case FKEY | F(9):
++ case FKEY | F(10): case FKEY | F(11): case FKEY | F(12):
++ /* F1 through F12 keys. */
++ terminal_input_special(vw->vw_terminal,
++ TKEY_F1 + c - (FKEY | F(1)));
++ break;
++ case FKEY | F(49): /* Home key. */
++ terminal_input_special(vw->vw_terminal, TKEY_HOME);
++ break;
++ case FKEY | F(50): /* Arrow up. */
++ terminal_input_special(vw->vw_terminal, TKEY_UP);
++ break;
++ case FKEY | F(51): /* Page up. */
++ terminal_input_special(vw->vw_terminal, TKEY_PAGE_UP);
++ break;
++ case FKEY | F(53): /* Arrow left. */
++ terminal_input_special(vw->vw_terminal, TKEY_LEFT);
++ break;
++ case FKEY | F(55): /* Arrow right. */
++ terminal_input_special(vw->vw_terminal, TKEY_RIGHT);
++ break;
++ case FKEY | F(57): /* End key. */
++ terminal_input_special(vw->vw_terminal, TKEY_END);
++ break;
++ case FKEY | F(58): /* Arrow down. */
++ terminal_input_special(vw->vw_terminal, TKEY_DOWN);
++ break;
++ case FKEY | F(59): /* Page down. */
++ terminal_input_special(vw->vw_terminal, TKEY_PAGE_DOWN);
++ break;
++ case FKEY | F(60): /* Insert key. */
++ terminal_input_special(vw->vw_terminal, TKEY_INSERT);
++ break;
++ case FKEY | F(61): /* Delete key. */
++ terminal_input_special(vw->vw_terminal, TKEY_DELETE);
++ break;
++ }
++ } else if (KEYFLAGS(c) == 0) {
++ /* Don't do UTF-8 conversion when doing raw mode. */
++ if (vw->vw_kbdmode == K_XLATE) {
++#if VT_ALT_TO_ESC_HACK
++ if (vd->vd_kbstate & ALKED) {
++ /*
++ * Prepend ESC sequence if one of ALT keys down.
++ */
++ terminal_input_char(vw->vw_terminal, 0x1b);
++ }
++#endif
++
++ terminal_input_char(vw->vw_terminal, KEYCHAR(c));
++ } else
++ terminal_input_raw(vw->vw_terminal, c);
++ }
++ return (0);
++}
++
++static int
++vt_kbdevent(keyboard_t *kbd, int event, void *arg)
++{
++ struct vt_device *vd = arg;
++ int c;
++
++ switch (event) {
++ case KBDIO_KEYINPUT:
++ break;
++ case KBDIO_UNLOADING:
++ mtx_lock(&Giant);
++ vd->vd_keyboard = -1;
++ kbd_release(kbd, (void *)&vd->vd_keyboard);
++ mtx_unlock(&Giant);
++ return (0);
++ default:
++ return (EINVAL);
++ }
++
++ while ((c = kbdd_read_char(kbd, 0)) != NOKEY)
++ vt_processkey(kbd, vd, c);
++
++ return (0);
++}
++
++static int
++vt_allocate_keyboard(struct vt_device *vd)
++{
++ int idx0, idx;
++ keyboard_t *k0, *k;
++ keyboard_info_t ki;
++
++ idx0 = kbd_allocate("kbdmux", -1, (void *)&vd->vd_keyboard,
++ vt_kbdevent, vd);
++ /* XXX: kb_token lost */
++ vd->vd_keyboard = idx0;
++ if (idx0 != -1) {
++ DPRINTF(20, "%s: kbdmux allocated, idx = %d\n", __func__, idx0);
++ k0 = kbd_get_keyboard(idx0);
++
++ for (idx = kbd_find_keyboard2("*", -1, 0);
++ idx != -1;
++ idx = kbd_find_keyboard2("*", -1, idx + 1)) {
++ k = kbd_get_keyboard(idx);
++
++ if (idx == idx0 || KBD_IS_BUSY(k))
++ continue;
++
++ bzero(&ki, sizeof(ki));
++ strcpy(ki.kb_name, k->kb_name);
++ ki.kb_unit = k->kb_unit;
++
++ kbdd_ioctl(k0, KBADDKBD, (caddr_t) &ki);
++ }
++ } else {
++ DPRINTF(20, "%s: no kbdmux allocated\n", __func__);
++ idx0 = kbd_allocate("*", -1, (void *)&vd->vd_keyboard,
++ vt_kbdevent, vd);
++ }
++ DPRINTF(20, "%s: vd_keyboard = %d\n", __func__, vd->vd_keyboard);
++
++ return (idx0);
++}
++
++static void
++vtterm_bell(struct terminal *tm)
++{
++ struct vt_window *vw = tm->tm_softc;
++ struct vt_device *vd = vw->vw_device;
++
++ if (vd->vd_flags & VDF_QUIET_BELL)
++ return;
++
++ sysbeep(1193182 / VT_BELLPITCH, VT_BELLDURATION);
++}
++
++static void
++vtterm_cursor(struct terminal *tm, const term_pos_t *p)
++{
++ struct vt_window *vw = tm->tm_softc;
++
++ vtbuf_cursor_position(&vw->vw_buf, p);
++}
++
++static void
++vtterm_putchar(struct terminal *tm, const term_pos_t *p, term_char_t c)
++{
++ struct vt_window *vw = tm->tm_softc;
++
++ vtbuf_putchar(&vw->vw_buf, p, c);
++}
++
++static void
++vtterm_fill(struct terminal *tm, const term_rect_t *r, term_char_t c)
++{
++ struct vt_window *vw = tm->tm_softc;
++
++ vtbuf_fill_locked(&vw->vw_buf, r, c);
++}
++
++static void
++vtterm_copy(struct terminal *tm, const term_rect_t *r,
++ const term_pos_t *p)
++{
++ struct vt_window *vw = tm->tm_softc;
++
++ vtbuf_copy(&vw->vw_buf, r, p);
++}
++
++static void
++vtterm_param(struct terminal *tm, int cmd, unsigned int arg)
++{
++ struct vt_window *vw = tm->tm_softc;
++
++ switch (cmd) {
++ case TP_SHOWCURSOR:
++ vtbuf_cursor_visibility(&vw->vw_buf, arg);
++ break;
++ case TP_MOUSE:
++ vw->vw_mouse_level = arg;
++ break;
++ }
++}
++
++static inline void
++vt_determine_colors(term_char_t c, int cursor,
++ term_color_t *fg, term_color_t *bg)
++{
++
++ *fg = TCHAR_FGCOLOR(c);
++ if (TCHAR_FORMAT(c) & TF_BOLD)
++ *fg = TCOLOR_LIGHT(*fg);
++ *bg = TCHAR_BGCOLOR(c);
++
++ if (TCHAR_FORMAT(c) & TF_REVERSE) {
++ term_color_t tmp;
++
++ tmp = *fg;
++ *fg = *bg;
++ *bg = tmp;
++ }
++
++ if (cursor) {
++ *fg = *bg;
++ *bg = TC_WHITE;
++ }
++}
++
++static void
++vt_bitblt_char(struct vt_device *vd, struct vt_font *vf, term_char_t c,
++ int iscursor, unsigned int row, unsigned int col)
++{
++ term_color_t fg, bg;
++
++ vt_determine_colors(c, iscursor, &fg, &bg);
++
++ if (vf != NULL) {
++ const uint8_t *src;
++ vt_axis_t top, left;
++
++ src = vtfont_lookup(vf, c);
++
++ /*
++ * Align the terminal to the centre of the screen.
++ * Fonts may not always be able to fill the entire
++ * screen.
++ */
++ top = row * vf->vf_height + vd->vd_offset.tp_row;
++ left = col * vf->vf_width + vd->vd_offset.tp_col;
++
++ vd->vd_driver->vd_bitbltchr(vd, src, NULL, 0, top, left,
++ vf->vf_width, vf->vf_height, fg, bg);
++ } else {
++ vd->vd_driver->vd_putchar(vd, TCHAR_CHARACTER(c),
++ row, col, fg, bg);
++ }
++}
++
++static void
++vt_flush(struct vt_device *vd)
++{
++ struct vt_window *vw = vd->vd_curwindow;
++ struct vt_font *vf = vw->vw_font;
++ struct vt_bufmask tmask;
++ unsigned int row, col;
++ term_rect_t tarea;
++ term_pos_t size;
++ term_char_t *r;
++#ifndef SC_NO_CUTPASTE
++ struct mouse_cursor *m;
++ int bpl, h, w;
++#endif
++
++ if (vd->vd_flags & VDF_SPLASH || vw->vw_flags & VWF_BUSY)
++ return;
++
++ vtbuf_undirty(&vw->vw_buf, &tarea, &tmask);
++ vt_termsize(vd, vf, &size);
++
++ /* Force a full redraw when the screen contents are invalid. */
++ if (vd->vd_flags & VDF_INVALID) {
++ tarea.tr_begin.tp_row = tarea.tr_begin.tp_col = 0;
++ tarea.tr_end = size;
++ tmask.vbm_row = tmask.vbm_col = VBM_DIRTY;
++
++ vd->vd_flags &= ~VDF_INVALID;
++ }
++
++#ifndef SC_NO_CUTPASTE
++ if ((vw->vw_flags & VWF_MOUSE_HIDE) == 0) {
++ /* Mark last mouse position as dirty to erase. */
++ vtbuf_mouse_cursor_position(&vw->vw_buf, vd->vd_mdirtyx,
++ vd->vd_mdirtyy);
++ }
++#endif
++
++ for (row = tarea.tr_begin.tp_row; row < tarea.tr_end.tp_row; row++) {
++ if (!VTBUF_DIRTYROW(&tmask, row))
++ continue;
++ r = VTBUF_GET_ROW(&vw->vw_buf, row);
++ for (col = tarea.tr_begin.tp_col;
++ col < tarea.tr_end.tp_col; col++) {
++ if (!VTBUF_DIRTYCOL(&tmask, col))
++ continue;
++
++ vt_bitblt_char(vd, vf, r[col],
++ VTBUF_ISCURSOR(&vw->vw_buf, row, col), row, col);
++ }
++ }
++
++#ifndef SC_NO_CUTPASTE
++ /* Mouse disabled. */
++ if (vw->vw_flags & VWF_MOUSE_HIDE)
++ return;
++
++ /* No mouse for DDB. */
++ if (kdb_active || panicstr != NULL)
++ return;
++
++ if ((vd->vd_flags & (VDF_MOUSECURSOR|VDF_TEXTMODE)) ==
++ VDF_MOUSECURSOR) {
++ m = &vt_default_mouse_pointer;
++ bpl = (m->w + 7) >> 3; /* Bytes per sorce line. */
++ w = m->w;
++ h = m->h;
++
++ if ((vd->vd_mx + m->w) > (size.tp_col * vf->vf_width))
++ w = (size.tp_col * vf->vf_width) - vd->vd_mx - 1;
++ if ((vd->vd_my + m->h) > (size.tp_row * vf->vf_height))
++ h = (size.tp_row * vf->vf_height) - vd->vd_my - 1;
++
++ vd->vd_driver->vd_bitbltchr(vd, m->map, m->mask, bpl,
++ vd->vd_offset.tp_row + vd->vd_my,
++ vd->vd_offset.tp_col + vd->vd_mx,
++ w, h, TC_WHITE, TC_BLACK);
++ /* Save point of last mouse cursor to erase it later. */
++ vd->vd_mdirtyx = vd->vd_mx / vf->vf_width;
++ vd->vd_mdirtyy = vd->vd_my / vf->vf_height;
++ }
++#endif
++}
++
++static void
++vt_timer(void *arg)
++{
++ struct vt_device *vd;
++
++ vd = arg;
++ /* Update screen if required. */
++ vt_flush(vd);
++ /* Schedule for next update. */
++ callout_schedule(&vd->vd_timer, hz / VT_TIMERFREQ);
++}
++
++static void
++vtterm_done(struct terminal *tm)
++{
++ struct vt_window *vw = tm->tm_softc;
++ struct vt_device *vd = vw->vw_device;
++
++ if (kdb_active || panicstr != NULL) {
++ /* Switch to the debugger. */
++ if (vd->vd_curwindow != vw) {
++ vd->vd_curwindow = vw;
++ vd->vd_flags |= VDF_INVALID;
++ if (vd->vd_driver->vd_postswitch)
++ vd->vd_driver->vd_postswitch(vd);
++ }
++ vd->vd_flags &= ~VDF_SPLASH;
++ vt_flush(vd);
++ } else if (!(vd->vd_flags & VDF_ASYNC)) {
++ vt_flush(vd);
++ }
++}
++
++#ifdef DEV_SPLASH
++static void
++vtterm_splash(struct vt_device *vd)
++{
++ vt_axis_t top, left;
++
++ /* Display a nice boot splash. */
++ if (!(vd->vd_flags & VDF_TEXTMODE) && (boothowto & RB_MUTE)) {
++
++ top = (vd->vd_height - vt_logo_height) / 2;
++ left = (vd->vd_width - vt_logo_width) / 2;
++ switch (vt_logo_depth) {
++ case 1:
++ /* XXX: Unhardcode colors! */
++ vd->vd_driver->vd_bitbltchr(vd, vt_logo_image, NULL, 0,
++ top, left, vt_logo_width, vt_logo_height, 0xf, 0x0);
++ }
++ vd->vd_flags |= VDF_SPLASH;
++ }
++}
++#endif
++
++static void
++vtterm_cnprobe(struct terminal *tm, struct consdev *cp)
++{
++ struct vt_window *vw = tm->tm_softc;
++ struct vt_device *vd = vw->vw_device;
++ struct winsize wsz;
++
++ if (vd->vd_flags & VDF_INITIALIZED)
++ /* Initialization already done. */
++ return;
++
++ cp->cn_pri = vd->vd_driver->vd_init(vd);
++ if (cp->cn_pri == CN_DEAD) {
++ vd->vd_flags |= VDF_DEAD;
++ return;
++ }
++
++ /* Initialize any early-boot keyboard drivers */
++ kbd_configure(KB_CONF_PROBE_ONLY);
++
++ vd->vd_unit = atomic_fetchadd_int(&vt_unit, 1);
++ vd->vd_windows[VT_CONSWINDOW] = vw;
++ sprintf(cp->cn_name, "ttyv%r", VT_UNIT(vw));
++
++ if (!(vd->vd_flags & VDF_TEXTMODE))
++ vw->vw_font = vtfont_ref(&vt_font_default);
++
++ vtbuf_init_early(&vw->vw_buf);
++ vt_winsize(vd, vw->vw_font, &wsz);
++ terminal_set_winsize(tm, &wsz);
++
++#ifdef DEV_SPLASH
++ vtterm_splash(vd);
++#endif
++
++ vd->vd_flags |= VDF_INITIALIZED;
++ main_vd = vd;
++}
++
++static int
++vtterm_cngetc(struct terminal *tm)
++{
++ struct vt_window *vw = tm->tm_softc;
++ struct vt_device *vd = vw->vw_device;
++ keyboard_t *kbd;
++ int state;
++ u_int c;
++
++ if (vw->vw_kbdsq && *vw->vw_kbdsq)
++ return (*vw->vw_kbdsq++);
++
++ state = 0;
++ /* Make sure the splash screen is not there. */
++ if (vd->vd_flags & VDF_SPLASH) {
++ /* Remove splash */
++ vd->vd_flags &= ~VDF_SPLASH;
++ /* Mark screen as invalid to force update */
++ vd->vd_flags |= VDF_INVALID;
++ vt_flush(vd);
++ }
++
++ /* Stripped down keyboard handler. */
++ kbd = kbd_get_keyboard(vd->vd_keyboard);
++ if (kbd == NULL)
++ return (-1);
++
++ /* Force keyboard input mode to K_XLATE */
++ c = K_XLATE;
++ kbdd_ioctl(kbd, KDSKBMODE, (void *)&c);
++
++ /* Switch the keyboard to polling to make it work here. */
++ kbdd_poll(kbd, TRUE);
++ c = kbdd_read_char(kbd, 0);
++ kbdd_poll(kbd, FALSE);
++ if (c & RELKEY)
++ return (-1);
++
++ if (vw->vw_flags & VWF_SCROLL) {
++ vt_scrollmode_kbdevent(vw, c, 1/* Console mode */);
++ vt_flush(vd);
++ return (-1);
++ }
++
++ /* Stripped down handling of vt_kbdevent(), without locking, etc. */
++ if (c & SPCLKEY) {
++ switch (c) {
++ case SPCLKEY | SLK:
++ kbdd_ioctl(kbd, KDGKBSTATE, (caddr_t)&state);
++ if (state & SLKED) {
++ /* Turn scrolling on. */
++ vw->vw_flags |= VWF_SCROLL;
++ VTBUF_SLCK_ENABLE(&vw->vw_buf);
++ } else {
++ /* Turn scrolling off. */
++ vt_scroll(vw, 0, VHS_END);
++ vw->vw_flags &= ~VWF_SCROLL;
++ VTBUF_SLCK_DISABLE(&vw->vw_buf);
++ }
++ break;
++ /* XXX: KDB can handle history. */
++ case SPCLKEY | FKEY | F(50): /* Arrow up. */
++ vw->vw_kbdsq = "\x1b[A";
++ break;
++ case SPCLKEY | FKEY | F(58): /* Arrow down. */
++ vw->vw_kbdsq = "\x1b[B";
++ break;
++ case SPCLKEY | FKEY | F(55): /* Arrow right. */
++ vw->vw_kbdsq = "\x1b[C";
++ break;
++ case SPCLKEY | FKEY | F(53): /* Arrow left. */
++ vw->vw_kbdsq = "\x1b[D";
++ break;
++ }
++
++ /* Force refresh to make scrollback work. */
++ vt_flush(vd);
++ } else if (KEYFLAGS(c) == 0) {
++ return (KEYCHAR(c));
++ }
++
++ if (vw->vw_kbdsq && *vw->vw_kbdsq)
++ return (*vw->vw_kbdsq++);
++
++ return (-1);
++}
++
++static void
++vtterm_opened(struct terminal *tm, int opened)
++{
++ struct vt_window *vw = tm->tm_softc;
++ struct vt_device *vd = vw->vw_device;
++
++ VT_LOCK(vd);
++ vd->vd_flags &= ~VDF_SPLASH;
++ if (opened)
++ vw->vw_flags |= VWF_OPENED;
++ else {
++ vw->vw_flags &= ~VWF_OPENED;
++ /* TODO: finish ACQ/REL */
++ }
++ VT_UNLOCK(vd);
++}
++
++static int
++vt_change_font(struct vt_window *vw, struct vt_font *vf)
++{
++ struct vt_device *vd = vw->vw_device;
++ struct terminal *tm = vw->vw_terminal;
++ term_pos_t size;
++ struct winsize wsz;
++
++ /*
++ * Changing fonts.
++ *
++ * Changing fonts is a little tricky. We must prevent
++ * simultaneous access to the device, so we must stop
++ * the display timer and the terminal from accessing.
++ * We need to switch fonts and grow our screen buffer.
++ *
++ * XXX: Right now the code uses terminal_mute() to
++ * prevent data from reaching the console driver while
++ * resizing the screen buffer. This isn't elegant...
++ */
++
++ VT_LOCK(vd);
++ if (vw->vw_flags & VWF_BUSY) {
++ /* Another process is changing the font. */
++ VT_UNLOCK(vd);
++ return (EBUSY);
++ }
++ if (vw->vw_font == NULL) {
++ /* Our device doesn't need fonts. */
++ VT_UNLOCK(vd);
++ return (ENOTTY);
++ }
++ vw->vw_flags |= VWF_BUSY;
++ VT_UNLOCK(vd);
++
++ vt_termsize(vd, vf, &size);
++ vt_winsize(vd, vf, &wsz);
++ /* Save offset to font aligned area. */
++ vd->vd_offset.tp_col = (vd->vd_width % vf->vf_width) / 2;
++ vd->vd_offset.tp_row = (vd->vd_height % vf->vf_height) / 2;
++
++ /* Grow the screen buffer and terminal. */
++ terminal_mute(tm, 1);
++ vtbuf_grow(&vw->vw_buf, &size, vw->vw_buf.vb_history_size);
++ terminal_set_winsize_blank(tm, &wsz, 0);
++ terminal_mute(tm, 0);
++
++ /* Actually apply the font to the current window. */
++ VT_LOCK(vd);
++ vtfont_unref(vw->vw_font);
++ vw->vw_font = vtfont_ref(vf);
++
++ /* Force a full redraw the next timer tick. */
++ if (vd->vd_curwindow == vw)
++ vd->vd_flags |= VDF_INVALID;
++ vw->vw_flags &= ~VWF_BUSY;
++ VT_UNLOCK(vd);
++ return (0);
++}
++
++static int
++vt_set_border(struct vt_window *vw, struct vt_font *vf, term_color_t c)
++{
++ struct vt_device *vd = vw->vw_device;
++ int l, r, t, b, w, h;
++
++ if (vd->vd_driver->vd_drawrect == NULL)
++ return (ENOTSUP);
++
++ w = vd->vd_width - 1;
++ h = vd->vd_height - 1;
++ l = vd->vd_offset.tp_col - 1;
++ r = w - l;
++ t = vd->vd_offset.tp_row - 1;
++ b = h - t;
++
++ vd->vd_driver->vd_drawrect(vd, 0, 0, w, t, 1, c); /* Top bar. */
++ vd->vd_driver->vd_drawrect(vd, 0, t, l, b, 1, c); /* Left bar. */
++ vd->vd_driver->vd_drawrect(vd, r, t, w, b, 1, c); /* Right bar. */
++ vd->vd_driver->vd_drawrect(vd, 0, b, w, h, 1, c); /* Bottom bar. */
++
++ return (0);
++}
++
++static int
++vt_proc_alive(struct vt_window *vw)
++{
++ struct proc *p;
++
++ if (vw->vw_smode.mode != VT_PROCESS)
++ return (FALSE);
++
++ if (vw->vw_proc) {
++ if ((p = pfind(vw->vw_pid)) != NULL)
++ PROC_UNLOCK(p);
++ if (vw->vw_proc == p)
++ return (TRUE);
++ vw->vw_proc = NULL;
++ vw->vw_smode.mode = VT_AUTO;
++ DPRINTF(1, "vt controlling process %d died\n", vw->vw_pid);
++ vw->vw_pid = 0;
++ }
++ return (FALSE);
++}
++
++static int
++signal_vt_rel(struct vt_window *vw)
++{
++
++ if (vw->vw_smode.mode != VT_PROCESS)
++ return (FALSE);
++ if (vw->vw_proc == NULL || vt_proc_alive(vw) == FALSE) {
++ vw->vw_proc = NULL;
++ vw->vw_pid = 0;
++ return (TRUE);
++ }
++ vw->vw_flags |= VWF_SWWAIT_REL;
++ PROC_LOCK(vw->vw_proc);
++ kern_psignal(vw->vw_proc, vw->vw_smode.relsig);
++ PROC_UNLOCK(vw->vw_proc);
++ DPRINTF(1, "sending relsig to %d\n", vw->vw_pid);
++ return (TRUE);
++}
++
++static int
++signal_vt_acq(struct vt_window *vw)
++{
++
++ if (vw->vw_smode.mode != VT_PROCESS)
++ return (FALSE);
++ if (vw == vw->vw_device->vd_windows[VT_CONSWINDOW])
++ cnavailable(vw->vw_terminal->consdev, FALSE);
++ if (vw->vw_proc == NULL || vt_proc_alive(vw) == FALSE) {
++ vw->vw_proc = NULL;
++ vw->vw_pid = 0;
++ return (TRUE);
++ }
++ vw->vw_flags |= VWF_SWWAIT_ACQ;
++ PROC_LOCK(vw->vw_proc);
++ kern_psignal(vw->vw_proc, vw->vw_smode.acqsig);
++ PROC_UNLOCK(vw->vw_proc);
++ DPRINTF(1, "sending acqsig to %d\n", vw->vw_pid);
++ return (TRUE);
++}
++
++static int
++finish_vt_rel(struct vt_window *vw, int release, int *s)
++{
++
++ if (vw->vw_flags & VWF_SWWAIT_REL) {
++ vw->vw_flags &= ~VWF_SWWAIT_REL;
++ if (release) {
++ callout_drain(&vw->vw_proc_dead_timer);
++ vt_late_window_switch(vw->vw_switch_to);
++ }
++ return (0);
++ }
++ return (EINVAL);
++}
++
++static int
++finish_vt_acq(struct vt_window *vw)
++{
++
++ if (vw->vw_flags & VWF_SWWAIT_ACQ) {
++ vw->vw_flags &= ~VWF_SWWAIT_ACQ;
++ return (0);
++ }
++ return (EINVAL);
++}
++
++#ifndef SC_NO_CUTPASTE
++static void
++vt_mouse_terminput_button(struct vt_device *vd, int button)
++{
++ struct vt_window *vw;
++ struct vt_font *vf;
++ char mouseb[6] = "\x1B[M";
++ int i, x, y;
++
++ vw = vd->vd_curwindow;
++ vf = vw->vw_font;
++
++ /* Translate to char position. */
++ x = vd->vd_mx / vf->vf_width;
++ y = vd->vd_my / vf->vf_height;
++ /* Avoid overflow. */
++ x = MIN(x, 255 - '!');
++ y = MIN(y, 255 - '!');
++
++ mouseb[3] = ' ' + button;
++ mouseb[4] = '!' + x;
++ mouseb[5] = '!' + y;
++
++ for (i = 0; i < sizeof(mouseb); i++ )
++ terminal_input_char(vw->vw_terminal, mouseb[i]);
++}
++
++static void
++vt_mouse_terminput(struct vt_device *vd, int type, int x, int y, int event,
++ int cnt)
++{
++
++ switch (type) {
++ case MOUSE_BUTTON_EVENT:
++ if (cnt > 0) {
++ /* Mouse button pressed. */
++ if (event & MOUSE_BUTTON1DOWN)
++ vt_mouse_terminput_button(vd, 0);
++ if (event & MOUSE_BUTTON2DOWN)
++ vt_mouse_terminput_button(vd, 1);
++ if (event & MOUSE_BUTTON3DOWN)
++ vt_mouse_terminput_button(vd, 2);
++ } else {
++ /* Mouse button released. */
++ vt_mouse_terminput_button(vd, 3);
++ }
++ break;
++#ifdef notyet
++ case MOUSE_MOTION_EVENT:
++ if (mouse->u.data.z < 0) {
++ /* Scroll up. */
++ sc_mouse_input_button(vd, 64);
++ } else if (mouse->u.data.z > 0) {
++ /* Scroll down. */
++ sc_mouse_input_button(vd, 65);
++ }
++ break;
++#endif
++ }
++}
++
++void
++vt_mouse_event(int type, int x, int y, int event, int cnt, int mlevel)
++{
++ struct vt_device *vd;
++ struct vt_window *vw;
++ struct vt_font *vf;
++ term_pos_t size;
++ term_char_t *buf;
++ int i, len, mark;
++
++ vd = main_vd;
++ vw = vd->vd_curwindow;
++ vf = vw->vw_font;
++ mark = 0;
++
++ if (vw->vw_flags & VWF_MOUSE_HIDE)
++ return; /* Mouse disabled. */
++
++ if (vf == NULL) /* Text mode. */
++ return;
++
++ /*
++ * TODO: add flag about pointer position changed, to not redraw chars
++ * under mouse pointer when nothing changed.
++ */
++
++ if (vw->vw_mouse_level > 0)
++ vt_mouse_terminput(vd, type, x, y, event, cnt);
++
++ switch (type) {
++ case MOUSE_ACTION:
++ case MOUSE_MOTION_EVENT:
++ /* Movement */
++ x += vd->vd_mx;
++ y += vd->vd_my;
++
++ vt_termsize(vd, vf, &size);
++
++ /* Apply limits. */
++ x = MAX(x, 0);
++ y = MAX(y, 0);
++ x = MIN(x, (size.tp_col * vf->vf_width) - 1);
++ y = MIN(y, (size.tp_row * vf->vf_height) - 1);
++
++ vd->vd_mx = x;
++ vd->vd_my = y;
++ if ((vd->vd_mstate & MOUSE_BUTTON1DOWN) &&
++ (vtbuf_set_mark(&vw->vw_buf, VTB_MARK_MOVE,
++ vd->vd_mx / vf->vf_width,
++ vd->vd_my / vf->vf_height) == 1)) {
++
++ /*
++ * We have something marked to copy, so update pointer
++ * to window with selection.
++ */
++ vd->vd_markedwin = vw;
++ }
++ return; /* Done */
++ case MOUSE_BUTTON_EVENT:
++ /* Buttons */
++ break;
++ default:
++ return; /* Done */
++ }
++
++ switch (event) {
++ case MOUSE_BUTTON1DOWN:
++ switch (cnt % 4) {
++ case 0: /* up */
++ mark = VTB_MARK_END;
++ break;
++ case 1: /* single click: start cut operation */
++ mark = VTB_MARK_START;
++ break;
++ case 2: /* double click: cut a word */
++ mark = VTB_MARK_WORD;
++ break;
++ case 3: /* triple click: cut a line */
++ mark = VTB_MARK_ROW;
++ break;
++ }
++ break;
++ case VT_MOUSE_PASTEBUTTON:
++ switch (cnt) {
++ case 0: /* up */
++ break;
++ default:
++ if (vd->vd_markedwin == NULL)
++ return;
++ /* Get current selecton size in bytes. */
++ len = vtbuf_get_marked_len(&vd->vd_markedwin->vw_buf);
++ if (len <= 0)
++ return;
++
++ buf = malloc(len, M_VT, M_WAITOK | M_ZERO);
++ /* Request cupy/paste buffer data, no more than `len' */
++ vtbuf_extract_marked(&vd->vd_markedwin->vw_buf, buf,
++ len);
++
++ len /= sizeof(term_char_t);
++ for (i = 0; i < len; i++ ) {
++ if (buf[i] == '\0')
++ continue;
++ terminal_input_char(vw->vw_terminal, buf[i]);
++ }
++
++ /* Done, so cleanup. */
++ free(buf, M_VT);
++ break;
++ }
++ return; /* Done */
++ case VT_MOUSE_EXTENDBUTTON:
++ switch (cnt) {
++ case 0: /* up */
++ if (!(vd->vd_mstate & MOUSE_BUTTON1DOWN))
++ mark = VTB_MARK_EXTEND;
++ else
++ mark = 0;
++ break;
++ default:
++ mark = VTB_MARK_EXTEND;
++ break;
++ }
++ break;
++ default:
++ return; /* Done */
++ }
++
++ /* Save buttons state. */
++ if (cnt > 0)
++ vd->vd_mstate |= event;
++ else
++ vd->vd_mstate &= ~event;
++
++ if (vtbuf_set_mark(&vw->vw_buf, mark, vd->vd_mx / vf->vf_width,
++ vd->vd_my / vf->vf_height) == 1) {
++ /*
++ * We have something marked to copy, so update pointer to
++ * window with selection.
++ */
++ vd->vd_markedwin = vw;
++ }
++}
++
++void
++vt_mouse_state(int show)
++{
++ struct vt_device *vd;
++ struct vt_window *vw;
++
++ vd = main_vd;
++ vw = vd->vd_curwindow;
++
++ switch (show) {
++ case VT_MOUSE_HIDE:
++ vw->vw_flags |= VWF_MOUSE_HIDE;
++ break;
++ case VT_MOUSE_SHOW:
++ vw->vw_flags &= ~VWF_MOUSE_HIDE;
++ break;
++ }
++}
++#endif
++
++static int
++vtterm_mmap(struct terminal *tm, vm_ooffset_t offset, vm_paddr_t * paddr,
++ int nprot, vm_memattr_t *memattr)
++{
++ struct vt_window *vw = tm->tm_softc;
++ struct vt_device *vd = vw->vw_device;
++
++ if (vd->vd_driver->vd_fb_mmap)
++ return (vd->vd_driver->vd_fb_mmap(vd, offset, paddr, nprot,
++ memattr));
++
++ return (ENXIO);
++}
++
++static int
++vtterm_ioctl(struct terminal *tm, u_long cmd, caddr_t data,
++ struct thread *td)
++{
++ struct vt_window *vw = tm->tm_softc;
++ struct vt_device *vd = vw->vw_device;
++ keyboard_t *kbd;
++ int error, i, s;
++#if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
++ defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
++ int ival;
++
++ switch (cmd) {
++ case _IO('v', 4):
++ cmd = VT_RELDISP;
++ break;
++ case _IO('v', 5):
++ cmd = VT_ACTIVATE;
++ break;
++ case _IO('v', 6):
++ cmd = VT_WAITACTIVE;
++ break;
++ case _IO('K', 20):
++ cmd = KDSKBSTATE;
++ break;
++ case _IO('K', 67):
++ cmd = KDSETRAD;
++ break;
++ case _IO('K', 7):
++ cmd = KDSKBMODE;
++ break;
++ case _IO('K', 8):
++ cmd = KDMKTONE;
++ break;
++ case _IO('K', 63):
++ cmd = KIOCSOUND;
++ break;
++ case _IO('K', 66):
++ cmd = KDSETLED;
++ break;
++ case _IO('c', 110):
++ cmd = CONS_SETKBD;
++ break;
++ default:
++ goto skip_thunk;
++ }
++ ival = IOCPARM_IVAL(data);
++ data = (caddr_t)&ival;
++skip_thunk:
++#endif
++
++ switch (cmd) {
++ case KDSETRAD: /* set keyboard repeat & delay rates (old) */
++ if (*(int *)data & ~0x7f)
++ return (EINVAL);
++ case GIO_KEYMAP:
++ case PIO_KEYMAP:
++ case GIO_DEADKEYMAP:
++ case PIO_DEADKEYMAP:
++ case GETFKEY:
++ case SETFKEY:
++ case KDGKBINFO:
++ case KDGKBTYPE:
++ case KDSKBSTATE: /* set keyboard state (locks) */
++ case KDGKBSTATE: /* get keyboard state (locks) */
++ case KDGETREPEAT: /* get keyboard repeat & delay rates */
++ case KDSETREPEAT: /* set keyboard repeat & delay rates (new) */
++ case KDSETLED: /* set keyboard LED status */
++ case KDGETLED: /* get keyboard LED status */
++ case KBADDKBD: /* add/remove keyboard to/from mux */
++ case KBRELKBD: {
++ error = 0;
++
++ mtx_lock(&Giant);
++ kbd = kbd_get_keyboard(vd->vd_keyboard);
++ if (kbd != NULL)
++ error = kbdd_ioctl(kbd, cmd, data);
++ mtx_unlock(&Giant);
++ if (error == ENOIOCTL) {
++ if (cmd == KDGKBTYPE) {
++ /* always return something? XXX */
++ *(int *)data = 0;
++ } else {
++ return (ENODEV);
++ }
++ }
++ return (error);
++ }
++ case KDGKBMODE: {
++ int mode = -1;
++
++ mtx_lock(&Giant);
++ kbd = kbd_get_keyboard(vd->vd_keyboard);
++ if (kbd != NULL) {
++ kbdd_ioctl(kbd, KDGKBMODE, (void *)&mode);
++ }
++ mtx_unlock(&Giant);
++ DPRINTF(20, "mode %d, vw_kbdmode %d\n", mode, vw->vw_kbdmode);
++ *(int *)data = mode;
++ return (0);
++ }
++ case KDSKBMODE: {
++ int mode;
++
++ mode = *(int *)data;
++ switch (mode) {
++ case K_XLATE:
++ case K_RAW:
++ case K_CODE:
++ vw->vw_kbdmode = mode;
++ if (vw == vd->vd_curwindow) {
++ keyboard_t *kbd;
++ error = 0;
++
++ mtx_lock(&Giant);
++ kbd = kbd_get_keyboard(vd->vd_keyboard);
++ if (kbd != NULL) {
++ error = kbdd_ioctl(kbd, KDSKBMODE,
++ (void *)&mode);
++ }
++ mtx_unlock(&Giant);
++ }
++ return (0);
++ default:
++ return (EINVAL);
++ }
++ }
++ case FBIOGTYPE:
++ case FBIO_GETWINORG: /* get frame buffer window origin */
++ case FBIO_GETDISPSTART: /* get display start address */
++ case FBIO_GETLINEWIDTH: /* get scan line width in bytes */
++ case FBIO_BLANK: /* blank display */
++ if (vd->vd_driver->vd_fb_ioctl)
++ return (vd->vd_driver->vd_fb_ioctl(vd, cmd, data, td));
++ break;
++ case CONS_BLANKTIME:
++ /* XXX */
++ return (0);
++ case CONS_GET:
++ /* XXX */
++ *(int *)data = M_CG640x480;
++ return (0);
++ case CONS_BELLTYPE: /* set bell type sound */
++ if ((*(int *)data) & CONS_QUIET_BELL)
++ vd->vd_flags |= VDF_QUIET_BELL;
++ else
++ vd->vd_flags &= ~VDF_QUIET_BELL;
++ return (0);
++ case CONS_GETINFO: {
++ vid_info_t *vi = (vid_info_t *)data;
++
++ vi->m_num = vd->vd_curwindow->vw_number + 1;
++ /* XXX: other fields! */
++ return (0);
++ }
++ case CONS_GETVERS:
++ *(int *)data = 0x200;
++ return (0);
++ case CONS_MODEINFO:
++ /* XXX */
++ return (0);
++ case CONS_MOUSECTL: {
++ mouse_info_t *mouse = (mouse_info_t*)data;
++
++ /*
++ * This has no effect on vt(4). We don't draw any mouse
++ * cursor. Just ignore MOUSE_HIDE and MOUSE_SHOW to
++ * prevent excessive errors. All the other commands
++ * should not be applied to individual TTYs, but only to
++ * consolectl.
++ */
++ switch (mouse->operation) {
++ case MOUSE_HIDE:
++ vd->vd_flags &= ~VDF_MOUSECURSOR;
++ return (0);
++ case MOUSE_SHOW:
++ vd->vd_mx = vd->vd_width / 2;
++ vd->vd_my = vd->vd_height / 2;
++ vd->vd_flags |= VDF_MOUSECURSOR;
++ return (0);
++ default:
++ return (EINVAL);
++ }
++ }
++ case PIO_VFONT: {
++ struct vt_font *vf;
++
++ error = vtfont_load((void *)data, &vf);
++ if (error != 0)
++ return (error);
++
++ error = vt_change_font(vw, vf);
++ if (error == 0) {
++ /* XXX: replace 0 with current bg color. */
++ vt_set_border(vw, vf, 0);
++ }
++ vtfont_unref(vf);
++ return (error);
++ }
++ case GIO_SCRNMAP: {
++ scrmap_t *sm = (scrmap_t *)data;
++ int i;
++
++ /* We don't have screen maps, so return a handcrafted one. */
++ for (i = 0; i < 256; i++)
++ sm->scrmap[i] = i;
++ return (0);
++ }
++ case KDSETMODE:
++ /* XXX */
++ return (0);
++ case KDENABIO: /* allow io operations */
++ error = priv_check(td, PRIV_IO);
++ if (error != 0)
++ return (error);
++ error = securelevel_gt(td->td_ucred, 0);
++ if (error != 0)
++ return (error);
++#if defined(__i386__)
++ td->td_frame->tf_eflags |= PSL_IOPL;
++#elif defined(__amd64__)
++ td->td_frame->tf_rflags |= PSL_IOPL;
++#endif
++ return (0);
++ case KDDISABIO: /* disallow io operations (default) */
++#if defined(__i386__)
++ td->td_frame->tf_eflags &= ~PSL_IOPL;
++#elif defined(__amd64__)
++ td->td_frame->tf_rflags &= ~PSL_IOPL;
++#endif
++ return (0);
++ case KDMKTONE: /* sound the bell */
++ /* TODO */
++ return (0);
++ case KIOCSOUND: /* make tone (*data) hz */
++ /* TODO */
++ return (0);
++ case CONS_SETKBD: /* set the new keyboard */
++ mtx_lock(&Giant);
++ error = 0;
++ if (vd->vd_keyboard != *(int *)data) {
++ kbd = kbd_get_keyboard(*(int *)data);
++ if (kbd == NULL) {
++ mtx_unlock(&Giant);
++ return (EINVAL);
++ }
++ i = kbd_allocate(kbd->kb_name, kbd->kb_unit,
++ (void *)&vd->vd_keyboard, vt_kbdevent, vd);
++ if (i >= 0) {
++ if (vd->vd_keyboard != -1) {
++ kbd_release(kbd,
++ (void *)&vd->vd_keyboard);
++ }
++ kbd = kbd_get_keyboard(i);
++ vd->vd_keyboard = i;
++
++ (void)kbdd_ioctl(kbd, KDSKBMODE,
++ (caddr_t)&vd->vd_curwindow->vw_kbdmode);
++ } else {
++ error = EPERM; /* XXX */
++ }
++ }
++ mtx_unlock(&Giant);
++ return (error);
++ case CONS_RELKBD: /* release the current keyboard */
++ mtx_lock(&Giant);
++ error = 0;
++ if (vd->vd_keyboard != -1) {
++ kbd = kbd_get_keyboard(vd->vd_keyboard);
++ if (kbd == NULL) {
++ mtx_unlock(&Giant);
++ return (EINVAL);
++ }
++ error = kbd_release(kbd, (void *)&vd->vd_keyboard);
++ if (error == 0) {
++ vd->vd_keyboard = -1;
++ }
++ }
++ mtx_unlock(&Giant);
++ return (error);
++ case VT_ACTIVATE: {
++ int win;
++ win = *(int *)data - 1;
++ DPRINTF(5, "%s%d: VT_ACTIVATE ttyv%d ", SC_DRIVER_NAME,
++ VT_UNIT(vw), win);
++ if ((win > VT_MAXWINDOWS) || (win < 0))
++ return (EINVAL);
++ return (vt_proc_window_switch(vd->vd_windows[win]));
++ }
++ case VT_GETACTIVE:
++ *(int *)data = vd->vd_curwindow->vw_number + 1;
++ return (0);
++ case VT_GETINDEX:
++ *(int *)data = vw->vw_number + 1;
++ return (0);
++ case VT_LOCKSWITCH:
++ /* TODO: Check current state, switching can be in progress. */
++ if ((*(int *)data) & 0x01)
++ vw->vw_flags |= VWF_VTYLOCK;
++ else
++ vw->vw_flags &= ~VWF_VTYLOCK;
++ case VT_OPENQRY:
++ VT_LOCK(vd);
++ for (i = 0; i < VT_MAXWINDOWS; i++) {
++ vw = vd->vd_windows[i];
++ if (vw == NULL)
++ continue;
++ if (!(vw->vw_flags & VWF_OPENED)) {
++ *(int *)data = vw->vw_number + 1;
++ VT_UNLOCK(vd);
++ return (0);
++ }
++ }
++ VT_UNLOCK(vd);
++ return (EINVAL);
++ case VT_WAITACTIVE:
++ error = 0;
++
++ i = *(unsigned int *)data;
++ if (i > VT_MAXWINDOWS)
++ return (EINVAL);
++ if (i != 0)
++ vw = vd->vd_windows[i - 1];
++
++ VT_LOCK(vd);
++ while (vd->vd_curwindow != vw && error == 0)
++ error = cv_wait_sig(&vd->vd_winswitch, &vd->vd_lock);
++ VT_UNLOCK(vd);
++ return (error);
++ case VT_SETMODE: { /* set screen switcher mode */
++ struct vt_mode *mode;
++ struct proc *p1;
++
++ mode = (struct vt_mode *)data;
++ DPRINTF(5, "%s%d: VT_SETMODE ", SC_DRIVER_NAME, VT_UNIT(vw));
++ if (vw->vw_smode.mode == VT_PROCESS) {
++ p1 = pfind(vw->vw_pid);
++ if (vw->vw_proc == p1 && vw->vw_proc != td->td_proc) {
++ if (p1)
++ PROC_UNLOCK(p1);
++ DPRINTF(5, "error EPERM\n");
++ return (EPERM);
++ }
++ if (p1)
++ PROC_UNLOCK(p1);
++ }
++ if (mode->mode == VT_AUTO) {
++ vw->vw_smode.mode = VT_AUTO;
++ vw->vw_proc = NULL;
++ vw->vw_pid = 0;
++ DPRINTF(5, "VT_AUTO, ");
++ if (vw == vw->vw_device->vd_windows[VT_CONSWINDOW])
++ cnavailable(vw->vw_terminal->consdev, TRUE);
++ /* were we in the middle of the vty switching process? */
++ if (finish_vt_rel(vw, TRUE, &s) == 0)
++ DPRINTF(5, "reset WAIT_REL, ");
++ if (finish_vt_acq(vw) == 0)
++ DPRINTF(5, "reset WAIT_ACQ, ");
++ return (0);
++ } else if (mode->mode == VT_PROCESS) {
++ if (!ISSIGVALID(mode->relsig) ||
++ !ISSIGVALID(mode->acqsig) ||
++ !ISSIGVALID(mode->frsig)) {
++ DPRINTF(5, "error EINVAL\n");
++ return (EINVAL);
++ }
++ DPRINTF(5, "VT_PROCESS %d, ", td->td_proc->p_pid);
++ bcopy(data, &vw->vw_smode, sizeof(struct vt_mode));
++ vw->vw_proc = td->td_proc;
++ vw->vw_pid = vw->vw_proc->p_pid;
++ if (vw == vw->vw_device->vd_windows[VT_CONSWINDOW])
++ cnavailable(vw->vw_terminal->consdev, FALSE);
++ } else {
++ DPRINTF(5, "VT_SETMODE failed, unknown mode %d\n",
++ mode->mode);
++ return (EINVAL);
++ }
++ DPRINTF(5, "\n");
++ return (0);
++ }
++ case VT_GETMODE: /* get screen switcher mode */
++ bcopy(&vw->vw_smode, data, sizeof(struct vt_mode));
++ return (0);
++
++ case VT_RELDISP: /* screen switcher ioctl */
++ /*
++ * This must be the current vty which is in the VT_PROCESS
++ * switching mode...
++ */
++ if ((vw != vd->vd_curwindow) || (vw->vw_smode.mode !=
++ VT_PROCESS)) {
++ return (EINVAL);
++ }
++ /* ...and this process is controlling it. */
++ if (vw->vw_proc != td->td_proc) {
++ return (EPERM);
++ }
++ error = EINVAL;
++ switch(*(int *)data) {
++ case VT_FALSE: /* user refuses to release screen, abort */
++ if ((error = finish_vt_rel(vw, FALSE, &s)) == 0)
++ DPRINTF(5, "%s%d: VT_RELDISP: VT_FALSE\n",
++ SC_DRIVER_NAME, VT_UNIT(vw));
++ break;
++ case VT_TRUE: /* user has released screen, go on */
++ /* finish_vt_rel(..., TRUE, ...) should not be locked */
++ if (vw->vw_flags & VWF_SWWAIT_REL) {
++ if ((error = finish_vt_rel(vw, TRUE, &s)) == 0)
++ DPRINTF(5, "%s%d: VT_RELDISP: VT_TRUE\n",
++ SC_DRIVER_NAME, VT_UNIT(vw));
++ } else {
++ error = EINVAL;
++ }
++ return (error);
++ case VT_ACKACQ: /* acquire acknowledged, switch completed */
++ if ((error = finish_vt_acq(vw)) == 0)
++ DPRINTF(5, "%s%d: VT_RELDISP: VT_ACKACQ\n",
++ SC_DRIVER_NAME, VT_UNIT(vw));
++ break;
++ default:
++ break;
++ }
++ return (error);
++ }
++
++ return (ENOIOCTL);
++}
++
++static struct vt_window *
++vt_allocate_window(struct vt_device *vd, unsigned int window)
++{
++ struct vt_window *vw;
++ struct terminal *tm;
++ term_pos_t size;
++ struct winsize wsz;
++
++ vw = malloc(sizeof *vw, M_VT, M_WAITOK|M_ZERO);
++ vw->vw_device = vd;
++ vw->vw_number = window;
++ vw->vw_kbdmode = K_XLATE;
++
++ if (!(vd->vd_flags & VDF_TEXTMODE))
++ vw->vw_font = vtfont_ref(&vt_font_default);
++
++ vt_termsize(vd, vw->vw_font, &size);
++ vt_winsize(vd, vw->vw_font, &wsz);
++ vtbuf_init(&vw->vw_buf, &size);
++
++ tm = vw->vw_terminal = terminal_alloc(&vt_termclass, vw);
++ terminal_set_winsize(tm, &wsz);
++ vd->vd_windows[window] = vw;
++ callout_init(&vw->vw_proc_dead_timer, 0);
++
++ return (vw);
++}
++
++void
++vt_upgrade(struct vt_device *vd)
++{
++ struct vt_window *vw;
++ unsigned int i;
++
++ /* Device didn't pass vd_init() or already upgraded. */
++ if (vd->vd_flags & (VDF_ASYNC|VDF_DEAD))
++ return;
++ vd->vd_flags |= VDF_ASYNC;
++
++ mtx_init(&vd->vd_lock, "vtdev", NULL, MTX_DEF);
++ cv_init(&vd->vd_winswitch, "vtwswt");
++
++ /* Init 25 Hz timer. */
++ callout_init_mtx(&vd->vd_timer, &vd->vd_lock, 0);
++
++ for (i = 0; i < VT_MAXWINDOWS; i++) {
++ vw = vd->vd_windows[i];
++ if (vw == NULL) {
++ /* New window. */
++ vw = vt_allocate_window(vd, i);
++ }
++ if (i == VT_CONSWINDOW) {
++ /* Console window. */
++ EVENTHANDLER_REGISTER(shutdown_pre_sync,
++ vt_window_switch, vw, SHUTDOWN_PRI_DEFAULT);
++ }
++ terminal_maketty(vw->vw_terminal, "v%r", VT_UNIT(vw));
++ }
++ if (vd->vd_curwindow == NULL)
++ vd->vd_curwindow = vd->vd_windows[VT_CONSWINDOW];
++
++ /* Attach keyboard. */
++ vt_allocate_keyboard(vd);
++ DPRINTF(20, "%s: vd_keyboard = %d\n", __func__, vd->vd_keyboard);
++
++ /* Start timer when everything ready. */
++ callout_reset(&vd->vd_timer, hz / VT_TIMERFREQ, vt_timer, vd);
++}
++
++static void
++vt_resize(struct vt_device *vd)
++{
++ struct vt_window *vw;
++ int i;
++
++ for (i = 0; i < VT_MAXWINDOWS; i++) {
++ vw = vd->vd_windows[i];
++ /* Resize terminal windows */
++ vt_change_font(vw, vw->vw_font);
++ }
++}
++
++void
++vt_allocate(struct vt_driver *drv, void *softc)
++{
++ struct vt_device *vd;
++ struct winsize wsz;
++
++ if (main_vd == NULL) {
++ main_vd = malloc(sizeof *vd, M_VT, M_WAITOK|M_ZERO);
++ printf("%s: VT initialize with new VT driver.\n", __func__);
++ } else {
++ /*
++ * Check if have rights to replace current driver. For example:
++ * it is bad idea to replace KMS driver with generic VGA one.
++ */
++ if (drv->vd_priority <= main_vd->vd_driver->vd_priority) {
++ printf("%s: Driver priority %d too low. Current %d\n ",
++ __func__, drv->vd_priority,
++ main_vd->vd_driver->vd_priority);
++ return;
++ }
++ printf("%s: Replace existing VT driver.\n", __func__);
++ }
++ vd = main_vd;
++
++ /* Stop vt_flush periodic task. */
++ if (vd->vd_curwindow != NULL)
++ callout_drain(&vd->vd_timer);
++
++ vd->vd_driver = drv;
++ vd->vd_softc = softc;
++ vd->vd_driver->vd_init(vd);
++
++ vt_upgrade(vd);
++
++ /* Refill settings with new sizes. */
++ vt_resize(vd);
++
++#ifdef DEV_SPLASH
++ if (vd->vd_flags & VDF_SPLASH)
++ vtterm_splash(vd);
++#endif
++
++ if (vd->vd_curwindow != NULL)
++ callout_schedule(&vd->vd_timer, hz / VT_TIMERFREQ);
++
++ termcn_cnregister(vd->vd_windows[VT_CONSWINDOW]->vw_terminal);
++
++ /* Update console window sizes to actual. */
++ vt_winsize(vd, vd->vd_windows[VT_CONSWINDOW]->vw_font, &wsz);
++ terminal_set_winsize(vd->vd_windows[VT_CONSWINDOW]->vw_terminal, &wsz);
++}
++
++void
++vt_suspend()
++{
++
++ if (vt_suspendswitch == 0)
++ return;
++ /* Save current window. */
++ main_vd->vd_savedwindow = main_vd->vd_curwindow;
++ /* Ask holding process to free window and switch to console window */
++ vt_proc_window_switch(main_vd->vd_windows[VT_CONSWINDOW]);
++}
++
++void
++vt_resume()
++{
++
++ if (vt_suspendswitch == 0)
++ return;
++ /* Switch back to saved window */
++ if (main_vd->vd_savedwindow != NULL)
++ vt_proc_window_switch(main_vd->vd_savedwindow);
++ main_vd->vd_savedwindow = NULL;
++}
+--- /dev/null
++++ b/sys/dev/vt/vt_font.c
+@@ -0,0 +1,224 @@
++/*-
++ * Copyright (c) 2009 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Ed Schouten under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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/kernel.h>
++#include <sys/malloc.h>
++#include <sys/refcount.h>
++#include <sys/systm.h>
++
++#include <dev/vt/vt.h>
++
++static MALLOC_DEFINE(M_VTFONT, "vtfont", "vt font");
++
++/* Some limits to prevent abnormal fonts from being loaded. */
++#define VTFONT_MAXMAPPINGS 8192
++#define VTFONT_MAXGLYPHSIZE 1048576
++#define VTFONT_MAXDIMENSION 128
++
++static uint16_t
++vtfont_bisearch(const struct vt_font_map *map, unsigned int len, uint32_t src)
++{
++ int min, mid, max;
++
++ min = 0;
++ max = len - 1;
++
++ /* Empty font map. */
++ if (len == 0)
++ return (0);
++ /* Character below minimal entry. */
++ if (src < map[0].vfm_src)
++ return (0);
++ /* Optimization: ASCII characters occur very often. */
++ if (src <= map[0].vfm_src + map[0].vfm_len)
++ return (src - map[0].vfm_src + map[0].vfm_dst);
++ /* Character above maximum entry. */
++ if (src > map[max].vfm_src + map[max].vfm_len)
++ return (0);
++
++ /* Binary search. */
++ while (max >= min) {
++ mid = (min + max) / 2;
++ if (src < map[mid].vfm_src)
++ max = mid - 1;
++ else if (src > map[mid].vfm_src + map[mid].vfm_len)
++ min = mid + 1;
++ else
++ return (src - map[mid].vfm_src + map[mid].vfm_dst);
++ }
++
++ return (0);
++}
++
++const uint8_t *
++vtfont_lookup(const struct vt_font *vf, term_char_t c)
++{
++ uint32_t src;
++ uint16_t dst;
++ size_t stride;
++ unsigned int normal_map;
++ unsigned int bold_map;
++
++ /*
++ * No support for printing right hand sides for CJK fullwidth
++ * characters. Simply print a space and assume that the left
++ * hand side describes the entire character.
++ */
++ src = TCHAR_CHARACTER(c);
++ if (TCHAR_FORMAT(c) & TF_CJK_RIGHT) {
++ normal_map = VFNT_MAP_NORMAL_RIGHT;
++ bold_map = VFNT_MAP_BOLD_RIGHT;
++ } else {
++ normal_map = VFNT_MAP_NORMAL;
++ bold_map = VFNT_MAP_BOLD;
++ }
++
++ if (TCHAR_FORMAT(c) & TF_BOLD) {
++ dst = vtfont_bisearch(vf->vf_map[bold_map],
++ vf->vf_map_count[bold_map], src);
++ if (dst != 0)
++ goto found;
++ }
++ dst = vtfont_bisearch(vf->vf_map[normal_map],
++ vf->vf_map_count[normal_map], src);
++
++found:
++ stride = howmany(vf->vf_width, 8) * vf->vf_height;
++ return (&vf->vf_bytes[dst * stride]);
++}
++
++struct vt_font *
++vtfont_ref(struct vt_font *vf)
++{
++
++ refcount_acquire(&vf->vf_refcount);
++ return (vf);
++}
++
++void
++vtfont_unref(struct vt_font *vf)
++{
++ unsigned int i;
++
++ if (refcount_release(&vf->vf_refcount)) {
++ for (i = 0; i < VFNT_MAPS; i++)
++ free(vf->vf_map[i], M_VTFONT);
++ free(vf->vf_bytes, M_VTFONT);
++ free(vf, M_VTFONT);
++ }
++}
++
++static int
++vtfont_validate_map(struct vt_font_map *vfm, unsigned int length,
++ unsigned int glyph_count)
++{
++ unsigned int i, last = 0;
++
++ for (i = 0; i < length; i++) {
++ /* Not ordered. */
++ if (i > 0 && vfm[i].vfm_src <= last)
++ return (EINVAL);
++ /*
++ * Destination extends amount of glyphs.
++ */
++ if (vfm[i].vfm_dst >= glyph_count ||
++ vfm[i].vfm_dst + vfm[i].vfm_len >= glyph_count)
++ return (EINVAL);
++ last = vfm[i].vfm_src + vfm[i].vfm_len;
++ }
++
++ return (0);
++}
++
++int
++vtfont_load(vfnt_t *f, struct vt_font **ret)
++{
++ size_t glyphsize, mapsize;
++ struct vt_font *vf;
++ int error;
++ unsigned int i;
++
++ /* Make sure the dimensions are valid. */
++ if (f->width < 1 || f->height < 1)
++ return (EINVAL);
++ if (f->width > VTFONT_MAXDIMENSION || f->height > VTFONT_MAXDIMENSION)
++ return (E2BIG);
++
++ /* Not too many mappings. */
++ for (i = 0; i < VFNT_MAPS; i++)
++ if (f->map_count[i] > VTFONT_MAXMAPPINGS)
++ return (E2BIG);
++
++ /* Character 0 must always be present. */
++ if (f->glyph_count < 1)
++ return (EINVAL);
++
++ glyphsize = howmany(f->width, 8) * f->height * f->glyph_count;
++ if (glyphsize > VTFONT_MAXGLYPHSIZE)
++ return (E2BIG);
++
++ /* Allocate new font structure. */
++ vf = malloc(sizeof *vf, M_VTFONT, M_WAITOK | M_ZERO);
++ vf->vf_bytes = malloc(glyphsize, M_VTFONT, M_WAITOK);
++ vf->vf_height = f->height;
++ vf->vf_width = f->width;
++ vf->vf_refcount = 1;
++
++ /* Allocate, copy in, and validate mappings. */
++ for (i = 0; i < VFNT_MAPS; i++) {
++ vf->vf_map_count[i] = f->map_count[i];
++ if (f->map_count[i] == 0)
++ continue;
++ mapsize = f->map_count[i] * sizeof(struct vt_font_map);
++ vf->vf_map[i] = malloc(mapsize, M_VTFONT, M_WAITOK);
++ error = copyin(f->map[i], vf->vf_map[i], mapsize);
++ if (error)
++ goto bad;
++ error = vtfont_validate_map(vf->vf_map[i], vf->vf_map_count[i],
++ f->glyph_count);
++ if (error)
++ goto bad;
++ }
++
++ /* Copy in glyph data. */
++ error = copyin(f->glyphs, vf->vf_bytes, glyphsize);
++ if (error)
++ goto bad;
++
++ /* Success. */
++ *ret = vf;
++ return (0);
++
++bad: vtfont_unref(vf);
++ return (error);
++}
+--- /dev/null
++++ b/sys/dev/vt/vt_sysmouse.c
+@@ -0,0 +1,412 @@
++/*-
++ * Copyright (c) 1999 Kazutaka YOKOTA <yokota at zodiac.mech.utsunomiya-u.ac.jp>
++ * All rights reserved.
++ *
++ * Copyright (c) 2009 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Ed Schouten under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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/condvar.h>
++#include <sys/consio.h>
++#include <sys/fcntl.h>
++#include <sys/filio.h>
++#include <sys/kernel.h>
++#include <sys/malloc.h>
++#include <sys/poll.h>
++#include <sys/random.h>
++#include <sys/selinfo.h>
++#include <sys/sigio.h>
++#include <sys/signalvar.h>
++#include <sys/systm.h>
++#include <sys/uio.h>
++
++#include <dev/vt/vt.h>
++
++static d_open_t sysmouse_open;
++static d_close_t sysmouse_close;
++static d_read_t sysmouse_read;
++static d_ioctl_t sysmouse_ioctl;
++static d_poll_t sysmouse_poll;
++
++static struct cdevsw sysmouse_cdevsw = {
++ .d_version = D_VERSION,
++ .d_open = sysmouse_open,
++ .d_close = sysmouse_close,
++ .d_read = sysmouse_read,
++ .d_ioctl = sysmouse_ioctl,
++ .d_poll = sysmouse_poll,
++ .d_name = "sysmouse",
++};
++
++static struct mtx sysmouse_lock;
++static struct cv sysmouse_sleep;
++static struct selinfo sysmouse_bufpoll;
++
++static int sysmouse_level;
++static mousestatus_t sysmouse_status;
++static int sysmouse_flags;
++#define SM_ASYNC 0x1
++static struct sigio *sysmouse_sigio;
++
++#define SYSMOUSE_MAXFRAMES 250 /* 2 KB */
++static MALLOC_DEFINE(M_SYSMOUSE, "sysmouse", "sysmouse device");
++static unsigned char *sysmouse_buffer;
++static unsigned int sysmouse_start, sysmouse_length;
++
++static int
++sysmouse_buf_read(struct uio *uio, unsigned int length)
++{
++ unsigned char buf[MOUSE_SYS_PACKETSIZE];
++ int error;
++
++ if (sysmouse_buffer == NULL)
++ return (ENXIO);
++ else if (sysmouse_length == 0)
++ return (EWOULDBLOCK);
++
++ memcpy(buf, sysmouse_buffer +
++ sysmouse_start * MOUSE_SYS_PACKETSIZE, MOUSE_SYS_PACKETSIZE);
++ sysmouse_start = (sysmouse_start + 1) % SYSMOUSE_MAXFRAMES;
++ sysmouse_length--;
++
++ mtx_unlock(&sysmouse_lock);
++ error = uiomove(buf, length, uio);
++ mtx_lock(&sysmouse_lock);
++
++ return (error);
++}
++
++static void
++sysmouse_buf_store(const unsigned char buf[MOUSE_SYS_PACKETSIZE])
++{
++ unsigned int idx;
++
++ if (sysmouse_buffer == NULL || sysmouse_length == SYSMOUSE_MAXFRAMES)
++ return;
++
++ idx = (sysmouse_start + sysmouse_length) % SYSMOUSE_MAXFRAMES;
++ memcpy(sysmouse_buffer + idx * MOUSE_SYS_PACKETSIZE, buf,
++ MOUSE_SYS_PACKETSIZE);
++ sysmouse_length++;
++ cv_broadcast(&sysmouse_sleep);
++ selwakeup(&sysmouse_bufpoll);
++ if (sysmouse_flags & SM_ASYNC && sysmouse_sigio != NULL)
++ pgsigio(&sysmouse_sigio, SIGIO, 0);
++}
++
++void
++sysmouse_process_event(mouse_info_t *mi)
++{
++ /* MOUSE_BUTTON?DOWN -> MOUSE_MSC_BUTTON?UP */
++ static const int buttonmap[8] = {
++ MOUSE_MSC_BUTTON1UP | MOUSE_MSC_BUTTON2UP | MOUSE_MSC_BUTTON3UP,
++ MOUSE_MSC_BUTTON2UP | MOUSE_MSC_BUTTON3UP,
++ MOUSE_MSC_BUTTON1UP | MOUSE_MSC_BUTTON3UP,
++ MOUSE_MSC_BUTTON3UP,
++ MOUSE_MSC_BUTTON1UP | MOUSE_MSC_BUTTON2UP,
++ MOUSE_MSC_BUTTON2UP,
++ MOUSE_MSC_BUTTON1UP,
++ 0,
++ };
++ unsigned char buf[MOUSE_SYS_PACKETSIZE];
++ int x, y, iy, z;
++
++ random_harvest(mi, sizeof *mi, 2, RANDOM_MOUSE);
++
++ mtx_lock(&sysmouse_lock);
++ switch (mi->operation) {
++ case MOUSE_ACTION:
++ sysmouse_status.button = mi->u.data.buttons;
++ /* FALLTHROUGH */
++ case MOUSE_MOTION_EVENT:
++ x = mi->u.data.x;
++ y = mi->u.data.y;
++ z = mi->u.data.z;
++ break;
++ case MOUSE_BUTTON_EVENT:
++ x = y = z = 0;
++ if (mi->u.event.value > 0)
++ sysmouse_status.button |= mi->u.event.id;
++ else
++ sysmouse_status.button &= ~mi->u.event.id;
++ break;
++ default:
++ goto done;
++ }
++
++ sysmouse_status.dx += x;
++ sysmouse_status.dy += y;
++ sysmouse_status.dz += z;
++ sysmouse_status.flags |= ((x || y || z) ? MOUSE_POSCHANGED : 0) |
++ (sysmouse_status.obutton ^ sysmouse_status.button);
++ if (sysmouse_status.flags == 0)
++ goto done;
++
++
++ /* The first five bytes are compatible with MouseSystems. */
++ buf[0] = MOUSE_MSC_SYNC |
++ buttonmap[sysmouse_status.button & MOUSE_STDBUTTONS];
++ x = imax(imin(x, 255), -256);
++ buf[1] = x >> 1;
++ buf[3] = x - buf[1];
++ iy = -imax(imin(y, 255), -256);
++ buf[2] = iy >> 1;
++ buf[4] = iy - buf[2];
++ /* Extended part. */
++ z = imax(imin(z, 127), -128);
++ buf[5] = (z >> 1) & 0x7f;
++ buf[6] = (z - (z >> 1)) & 0x7f;
++ /* Buttons 4-10. */
++ buf[7] = (~sysmouse_status.button >> 3) & 0x7f;
++
++ sysmouse_buf_store(buf);
++
++#ifndef SC_NO_CUTPASTE
++ mtx_unlock(&sysmouse_lock);
++ vt_mouse_event(mi->operation, x, y, mi->u.event.id, mi->u.event.value,
++ sysmouse_level);
++ return;
++#endif
++
++done: mtx_unlock(&sysmouse_lock);
++}
++
++static int
++sysmouse_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
++{
++ void *buf;
++
++ buf = malloc(MOUSE_SYS_PACKETSIZE * SYSMOUSE_MAXFRAMES,
++ M_SYSMOUSE, M_WAITOK);
++ mtx_lock(&sysmouse_lock);
++ if (sysmouse_buffer == NULL) {
++ sysmouse_buffer = buf;
++ sysmouse_start = sysmouse_length = 0;
++ sysmouse_level = 0;
++ } else {
++ free(buf, M_SYSMOUSE);
++ }
++ mtx_unlock(&sysmouse_lock);
++
++ return (0);
++}
++
++static int
++sysmouse_close(struct cdev *dev, int fflag, int devtype, struct thread *td)
++{
++
++ mtx_lock(&sysmouse_lock);
++ free(sysmouse_buffer, M_SYSMOUSE);
++ sysmouse_buffer = NULL;
++ sysmouse_level = 0;
++ mtx_unlock(&sysmouse_lock);
++
++ return (0);
++}
++
++static int
++sysmouse_read(struct cdev *dev, struct uio *uio, int ioflag)
++{
++ unsigned int length;
++ ssize_t oresid;
++ int error = 0;
++
++ oresid = uio->uio_resid;
++
++ mtx_lock(&sysmouse_lock);
++ length = sysmouse_level >= 1 ? MOUSE_SYS_PACKETSIZE :
++ MOUSE_MSC_PACKETSIZE;
++
++ while (uio->uio_resid >= length) {
++ error = sysmouse_buf_read(uio, length);
++ if (error == 0) {
++ /* Process the next frame. */
++ continue;
++ } else if (error != EWOULDBLOCK) {
++ /* Error (e.g. EFAULT). */
++ break;
++ } else {
++ /* Block. */
++ if (oresid != uio->uio_resid || ioflag & O_NONBLOCK)
++ break;
++ error = cv_wait_sig(&sysmouse_sleep, &sysmouse_lock);
++ if (error != 0)
++ break;
++ }
++ }
++ mtx_unlock(&sysmouse_lock);
++
++ return (error);
++}
++
++static int
++sysmouse_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag,
++ struct thread *td)
++{
++
++ switch (cmd) {
++ case FIOASYNC:
++ mtx_lock(&sysmouse_lock);
++ if (*(int *)data)
++ sysmouse_flags |= SM_ASYNC;
++ else
++ sysmouse_flags &= ~SM_ASYNC;
++ mtx_unlock(&sysmouse_lock);
++ return (0);
++ case FIONBIO:
++ return (0);
++ case FIOGETOWN:
++ *(int *)data = fgetown(&sysmouse_sigio);
++ return (0);
++ case FIOSETOWN:
++ return (fsetown(*(int *)data, &sysmouse_sigio));
++ case MOUSE_GETHWINFO: {
++ mousehw_t *hw = (mousehw_t *)data;
++
++ hw->buttons = 10;
++ hw->iftype = MOUSE_IF_SYSMOUSE;
++ hw->type = MOUSE_MOUSE;
++ hw->model = MOUSE_MODEL_GENERIC;
++ hw->hwid = 0;
++
++ return (0);
++ }
++ case MOUSE_GETLEVEL:
++ *(int *)data = sysmouse_level;
++ return (0);
++ case MOUSE_GETMODE: {
++ mousemode_t *mode = (mousemode_t *)data;
++
++ mode->rate = -1;
++ mode->resolution = -1;
++ mode->accelfactor = 0;
++ mode->level = sysmouse_level;
++
++ switch (mode->level) {
++ case 0:
++ mode->protocol = MOUSE_PROTO_MSC;
++ mode->packetsize = MOUSE_MSC_PACKETSIZE;
++ mode->syncmask[0] = MOUSE_MSC_SYNCMASK;
++ mode->syncmask[1] = MOUSE_MSC_SYNC;
++ break;
++ case 1:
++ mode->protocol = MOUSE_PROTO_SYSMOUSE;
++ mode->packetsize = MOUSE_SYS_PACKETSIZE;
++ mode->syncmask[0] = MOUSE_SYS_SYNCMASK;
++ mode->syncmask[1] = MOUSE_SYS_SYNC;
++ break;
++ }
++
++ return (0);
++ }
++ case MOUSE_GETSTATUS:
++ mtx_lock(&sysmouse_lock);
++ *(mousestatus_t *)data = sysmouse_status;
++
++ sysmouse_status.flags = 0;
++ sysmouse_status.obutton = sysmouse_status.button;
++ sysmouse_status.dx = 0;
++ sysmouse_status.dy = 0;
++ sysmouse_status.dz = 0;
++ mtx_unlock(&sysmouse_lock);
++
++ return (0);
++ case MOUSE_SETLEVEL: {
++ int level;
++
++ level = *(int *)data;
++ if (level != 0 && level != 1)
++ return (EINVAL);
++
++ sysmouse_level = level;
++#ifndef SC_NO_CUTPASTE
++ vt_mouse_state((level == 0)?VT_MOUSE_SHOW:VT_MOUSE_HIDE);
++#endif
++ return (0);
++ }
++ case MOUSE_SETMODE: {
++ mousemode_t *mode = (mousemode_t *)data;
++
++ switch (mode->level) {
++ case -1:
++ /* Do nothing. */
++ break;
++ case 0:
++ case 1:
++ sysmouse_level = mode->level;
++#ifndef SC_NO_CUTPASTE
++ vt_mouse_state((mode->level == 0)?VT_MOUSE_SHOW:
++ VT_MOUSE_HIDE);
++#endif
++ break;
++ default:
++ return (EINVAL);
++ }
++
++ return (0);
++ }
++ case MOUSE_MOUSECHAR:
++ return (0);
++ default:
++ printf("sysmouse: unknown ioctl: %c:%lx\n",
++ (char)IOCGROUP(cmd), IOCBASECMD(cmd));
++ return (ENOIOCTL);
++ }
++}
++
++static int
++sysmouse_poll(struct cdev *dev, int events, struct thread *td)
++{
++ int revents = 0;
++
++ mtx_lock(&sysmouse_lock);
++ if (events & (POLLIN|POLLRDNORM)) {
++ if (sysmouse_length > 0)
++ revents = events & (POLLIN|POLLRDNORM);
++ else
++ selrecord(td, &sysmouse_bufpoll);
++ }
++ mtx_unlock(&sysmouse_lock);
++
++ return (revents);
++}
++
++static void
++sysmouse_drvinit(void *unused)
++{
++
++ mtx_init(&sysmouse_lock, "sysmouse", NULL, MTX_DEF);
++ cv_init(&sysmouse_sleep, "sysmrd");
++ make_dev(&sysmouse_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600,
++ "sysmouse");
++}
++
++SYSINIT(sysmouse, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, sysmouse_drvinit, NULL);
+--- /dev/null
++++ b/sys/i386/conf/VT
+@@ -0,0 +1,14 @@
++# VT -- kernel config using the vt(9) system console instead of legacy syscons
++#
++# For more information see https://wiki.freebsd.org/Newcons
++#
++# $FreeBSD$
++
++include GENERIC
++ident VT
++
++nodevice sc
++nodevice vga
++
++device vt
++device vt_vga
+--- /dev/null
++++ b/sys/kern/subr_terminal.c
+@@ -0,0 +1,619 @@
++/*-
++ * Copyright (c) 2009 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Ed Schouten under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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/cons.h>
++#include <sys/consio.h>
++#include <sys/kernel.h>
++#include <sys/lock.h>
++#include <sys/malloc.h>
++#include <sys/mutex.h>
++#include <sys/systm.h>
++#include <sys/terminal.h>
++#include <sys/tty.h>
++
++#include <machine/stdarg.h>
++
++static MALLOC_DEFINE(M_TERMINAL, "terminal", "terminal device");
++
++/*
++ * Locking.
++ *
++ * Normally we don't need to lock down the terminal emulator, because
++ * the TTY lock is already held when calling teken_input().
++ * Unfortunately this is not the case when the terminal acts as a
++ * console device, because cnputc() can be called at the same time.
++ * This means terminals may need to be locked down using a spin lock.
++ */
++#define TERMINAL_LOCK(tm) do { \
++ if ((tm)->tm_flags & TF_CONS) \
++ mtx_lock_spin(&(tm)->tm_mtx); \
++ else if ((tm)->tm_tty != NULL) \
++ tty_lock((tm)->tm_tty); \
++} while (0)
++#define TERMINAL_UNLOCK(tm) do { \
++ if ((tm)->tm_flags & TF_CONS) \
++ mtx_unlock_spin(&(tm)->tm_mtx); \
++ else if ((tm)->tm_tty != NULL) \
++ tty_unlock((tm)->tm_tty); \
++} while (0)
++#define TERMINAL_LOCK_TTY(tm) do { \
++ if ((tm)->tm_flags & TF_CONS) \
++ mtx_lock_spin(&(tm)->tm_mtx); \
++} while (0)
++#define TERMINAL_UNLOCK_TTY(tm) do { \
++ if ((tm)->tm_flags & TF_CONS) \
++ mtx_unlock_spin(&(tm)->tm_mtx); \
++} while (0)
++#define TERMINAL_LOCK_CONS(tm) mtx_lock_spin(&(tm)->tm_mtx)
++#define TERMINAL_UNLOCK_CONS(tm) mtx_unlock_spin(&(tm)->tm_mtx)
++
++/*
++ * TTY routines.
++ */
++
++static tsw_open_t termtty_open;
++static tsw_close_t termtty_close;
++static tsw_outwakeup_t termtty_outwakeup;
++static tsw_ioctl_t termtty_ioctl;
++static tsw_mmap_t termtty_mmap;
++
++static struct ttydevsw terminal_tty_class = {
++ .tsw_open = termtty_open,
++ .tsw_close = termtty_close,
++ .tsw_outwakeup = termtty_outwakeup,
++ .tsw_ioctl = termtty_ioctl,
++ .tsw_mmap = termtty_mmap,
++};
++
++/*
++ * Terminal emulator routines.
++ */
++
++static tf_bell_t termteken_bell;
++static tf_cursor_t termteken_cursor;
++static tf_putchar_t termteken_putchar;
++static tf_fill_t termteken_fill;
++static tf_copy_t termteken_copy;
++static tf_param_t termteken_param;
++static tf_respond_t termteken_respond;
++
++static teken_funcs_t terminal_drawmethods = {
++ .tf_bell = termteken_bell,
++ .tf_cursor = termteken_cursor,
++ .tf_putchar = termteken_putchar,
++ .tf_fill = termteken_fill,
++ .tf_copy = termteken_copy,
++ .tf_param = termteken_param,
++ .tf_respond = termteken_respond,
++};
++
++/* Kernel message formatting. */
++static const teken_attr_t kernel_message = {
++ .ta_fgcolor = TC_WHITE,
++ .ta_bgcolor = TC_BLACK,
++ .ta_format = TF_BOLD,
++};
++
++static const teken_attr_t default_message = {
++ .ta_fgcolor = TC_WHITE,
++ .ta_bgcolor = TC_BLACK,
++};
++
++#define TCHAR_CREATE(c, a) ((c) | \
++ (a)->ta_format << 21 | \
++ teken_256to8((a)->ta_fgcolor) << 26 | \
++ teken_256to8((a)->ta_bgcolor) << 29)
++
++static void
++terminal_init(struct terminal *tm)
++{
++
++ if (tm->tm_flags & TF_CONS)
++ mtx_init(&tm->tm_mtx, "trmlck", NULL, MTX_SPIN);
++ teken_init(&tm->tm_emulator, &terminal_drawmethods, tm);
++ teken_set_defattr(&tm->tm_emulator, &default_message);
++}
++
++struct terminal *
++terminal_alloc(const struct terminal_class *tc, void *softc)
++{
++ struct terminal *tm;
++
++ tm = malloc(sizeof(struct terminal), M_TERMINAL, M_WAITOK|M_ZERO);
++ terminal_init(tm);
++
++ tm->tm_class = tc;
++ tm->tm_softc = softc;
++
++ return (tm);
++}
++
++static void
++terminal_sync_ttysize(struct terminal *tm)
++{
++ struct tty *tp;
++
++ tp = tm->tm_tty;
++ if (tp == NULL)
++ return;
++
++ tty_lock(tp);
++ tty_set_winsize(tp, &tm->tm_winsize);
++ tty_unlock(tp);
++}
++
++void
++terminal_maketty(struct terminal *tm, const char *fmt, ...)
++{
++ struct tty *tp;
++ char name[8];
++ va_list ap;
++
++ va_start(ap, fmt);
++ vsnrprintf(name, sizeof name, 32, fmt, ap);
++ va_end(ap);
++
++ tp = tty_alloc(&terminal_tty_class, tm);
++ tty_makedev(tp, NULL, "%s", name);
++ tm->tm_tty = tp;
++ terminal_sync_ttysize(tm);
++}
++
++void
++terminal_set_winsize_blank(struct terminal *tm, const struct winsize *size,
++ int blank)
++{
++ term_rect_t r;
++
++ tm->tm_winsize = *size;
++
++ r.tr_begin.tp_row = r.tr_begin.tp_col = 0;
++ r.tr_end.tp_row = size->ws_row;
++ r.tr_end.tp_col = size->ws_col;
++
++ TERMINAL_LOCK(tm);
++ if (blank == 0)
++ teken_set_winsize_noreset(&tm->tm_emulator, &r.tr_end);
++ else
++ teken_set_winsize(&tm->tm_emulator, &r.tr_end);
++ TERMINAL_UNLOCK(tm);
++
++ if (blank != 0)
++ tm->tm_class->tc_fill(tm, &r, TCHAR_CREATE((teken_char_t)' ',
++ &default_message));
++
++ terminal_sync_ttysize(tm);
++}
++
++void
++terminal_set_winsize(struct terminal *tm, const struct winsize *size)
++{
++
++ terminal_set_winsize_blank(tm, size, 1);
++}
++
++/*
++ * XXX: This function is a kludge. Drivers like vt(4) need to
++ * temporarily stop input when resizing, etc. This should ideally be
++ * handled within the driver.
++ */
++
++void
++terminal_mute(struct terminal *tm, int yes)
++{
++
++ TERMINAL_LOCK(tm);
++ if (yes)
++ tm->tm_flags |= TF_MUTE;
++ else
++ tm->tm_flags &= ~TF_MUTE;
++ TERMINAL_UNLOCK(tm);
++}
++
++void
++terminal_input_char(struct terminal *tm, term_char_t c)
++{
++ struct tty *tp;
++
++ tp = tm->tm_tty;
++ if (tp == NULL)
++ return;
++
++ /*
++ * Strip off any attributes. Also ignore input of second part of
++ * CJK fullwidth characters, as we don't want to return these
++ * characters twice.
++ */
++ if (TCHAR_FORMAT(c) & TF_CJK_RIGHT)
++ return;
++ c = TCHAR_CHARACTER(c);
++
++ tty_lock(tp);
++ /*
++ * Conversion to UTF-8.
++ */
++ if (c < 0x80) {
++ ttydisc_rint(tp, c, 0);
++ } else if (c < 0x800) {
++ char str[2] = {
++ 0xc0 | (c >> 6),
++ 0x80 | (c & 0x3f)
++ };
++
++ ttydisc_rint_simple(tp, str, sizeof str);
++ } else if (c < 0x10000) {
++ char str[3] = {
++ 0xe0 | (c >> 12),
++ 0x80 | ((c >> 6) & 0x3f),
++ 0x80 | (c & 0x3f)
++ };
++
++ ttydisc_rint_simple(tp, str, sizeof str);
++ } else {
++ char str[4] = {
++ 0xf0 | (c >> 18),
++ 0x80 | ((c >> 12) & 0x3f),
++ 0x80 | ((c >> 6) & 0x3f),
++ 0x80 | (c & 0x3f)
++ };
++
++ ttydisc_rint_simple(tp, str, sizeof str);
++ }
++ ttydisc_rint_done(tp);
++ tty_unlock(tp);
++}
++
++void
++terminal_input_raw(struct terminal *tm, char c)
++{
++ struct tty *tp;
++
++ tp = tm->tm_tty;
++ if (tp == NULL)
++ return;
++
++ tty_lock(tp);
++ ttydisc_rint(tp, c, 0);
++ ttydisc_rint_done(tp);
++ tty_unlock(tp);
++}
++
++void
++terminal_input_special(struct terminal *tm, unsigned int k)
++{
++ struct tty *tp;
++ const char *str;
++
++ tp = tm->tm_tty;
++ if (tp == NULL)
++ return;
++
++ str = teken_get_sequence(&tm->tm_emulator, k);
++ if (str == NULL)
++ return;
++
++ tty_lock(tp);
++ ttydisc_rint_simple(tp, str, strlen(str));
++ ttydisc_rint_done(tp);
++ tty_unlock(tp);
++}
++
++/*
++ * Binding with the TTY layer.
++ */
++
++static int
++termtty_open(struct tty *tp)
++{
++ struct terminal *tm = tty_softc(tp);
++
++ tm->tm_class->tc_opened(tm, 1);
++ return (0);
++}
++
++static void
++termtty_close(struct tty *tp)
++{
++ struct terminal *tm = tty_softc(tp);
++
++ tm->tm_class->tc_opened(tm, 0);
++}
++
++static void
++termtty_outwakeup(struct tty *tp)
++{
++ struct terminal *tm = tty_softc(tp);
++ char obuf[128];
++ size_t olen;
++ unsigned int flags = 0;
++
++ while ((olen = ttydisc_getc(tp, obuf, sizeof obuf)) > 0) {
++ TERMINAL_LOCK_TTY(tm);
++ if (!(tm->tm_flags & TF_MUTE)) {
++ tm->tm_flags &= ~TF_BELL;
++ teken_input(&tm->tm_emulator, obuf, olen);
++ flags |= tm->tm_flags;
++ }
++ TERMINAL_UNLOCK_TTY(tm);
++ }
++
++ tm->tm_class->tc_done(tm);
++ if (flags & TF_BELL)
++ tm->tm_class->tc_bell(tm);
++}
++
++static int
++termtty_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
++{
++ struct terminal *tm = tty_softc(tp);
++ int error;
++
++ switch (cmd) {
++ case CONS_GETINFO: {
++ vid_info_t *vi = (vid_info_t *)data;
++ const teken_pos_t *p;
++ int fg, bg;
++
++ if (vi->size != sizeof(vid_info_t))
++ return (EINVAL);
++
++ /* Already help the console driver by filling in some data. */
++ p = teken_get_cursor(&tm->tm_emulator);
++ vi->mv_row = p->tp_row;
++ vi->mv_col = p->tp_col;
++
++ p = teken_get_winsize(&tm->tm_emulator);
++ vi->mv_rsz = p->tp_row;
++ vi->mv_csz = p->tp_col;
++
++ teken_get_defattr_cons25(&tm->tm_emulator, &fg, &bg);
++ vi->mv_norm.fore = fg;
++ vi->mv_norm.back = bg;
++ /* XXX: keep vidcontrol happy; bold backgrounds. */
++ vi->mv_rev.fore = bg;
++ vi->mv_rev.back = fg & 0x7;
++ break;
++ }
++ }
++
++ /*
++ * Unlike various other drivers, this driver will never
++ * deallocate TTYs. This means it's safe to temporarily unlock
++ * the TTY when handling ioctls.
++ */
++ tty_unlock(tp);
++ error = tm->tm_class->tc_ioctl(tm, cmd, data, td);
++ tty_lock(tp);
++ return (error);
++}
++
++static int
++termtty_mmap(struct tty *tp, vm_ooffset_t offset, vm_paddr_t * paddr,
++ int nprot, vm_memattr_t *memattr)
++{
++ struct terminal *tm = tty_softc(tp);
++
++ return (tm->tm_class->tc_mmap(tm, offset, paddr, nprot, memattr));
++}
++
++/*
++ * Binding with the kernel and debug console.
++ */
++
++static cn_probe_t termcn_cnprobe;
++static cn_init_t termcn_cninit;
++static cn_term_t termcn_cnterm;
++static cn_getc_t termcn_cngetc;
++static cn_putc_t termcn_cnputc;
++static cn_grab_t termcn_cngrab;
++static cn_ungrab_t termcn_cnungrab;
++
++const struct consdev_ops termcn_cnops = {
++ .cn_probe = termcn_cnprobe,
++ .cn_init = termcn_cninit,
++ .cn_term = termcn_cnterm,
++ .cn_getc = termcn_cngetc,
++ .cn_putc = termcn_cnputc,
++ .cn_grab = termcn_cngrab,
++ .cn_ungrab = termcn_cnungrab,
++};
++
++void
++termcn_cnregister(struct terminal *tm)
++{
++ struct consdev *cp;
++
++ cp = tm->consdev;
++ if (cp == NULL) {
++ cp = malloc(sizeof(struct consdev), M_TERMINAL,
++ M_WAITOK|M_ZERO);
++ cp->cn_ops = &termcn_cnops;
++ cp->cn_arg = tm;
++ cp->cn_pri = CN_INTERNAL;
++ sprintf(cp->cn_name, "ttyv0");
++
++ tm->tm_flags = TF_CONS;
++ tm->consdev = cp;
++
++ terminal_init(tm);
++ }
++
++ /* Attach terminal as console. */
++ cnadd(cp);
++}
++
++static void
++termcn_cngrab(struct consdev *cp)
++{
++
++}
++
++static void
++termcn_cnungrab(struct consdev *cp)
++{
++
++}
++
++static void
++termcn_cnprobe(struct consdev *cp)
++{
++ struct terminal *tm = cp->cn_arg;
++
++ if (tm == NULL) {
++ cp->cn_pri = CN_DEAD;
++ return;
++ }
++
++ tm->consdev = cp;
++ terminal_init(tm);
++
++ tm->tm_class->tc_cnprobe(tm, cp);
++}
++
++static void
++termcn_cninit(struct consdev *cp)
++{
++
++}
++
++static void
++termcn_cnterm(struct consdev *cp)
++{
++
++}
++
++static int
++termcn_cngetc(struct consdev *cp)
++{
++ struct terminal *tm = cp->cn_arg;
++
++ return (tm->tm_class->tc_cngetc(tm));
++}
++
++static void
++termcn_cnputc(struct consdev *cp, int c)
++{
++ struct terminal *tm = cp->cn_arg;
++ teken_attr_t backup;
++ char cv = c;
++
++ TERMINAL_LOCK_CONS(tm);
++ if (!(tm->tm_flags & TF_MUTE)) {
++ backup = *teken_get_curattr(&tm->tm_emulator);
++ teken_set_curattr(&tm->tm_emulator, &kernel_message);
++ teken_input(&tm->tm_emulator, &cv, 1);
++ teken_set_curattr(&tm->tm_emulator, &backup);
++ }
++ TERMINAL_UNLOCK_CONS(tm);
++
++ tm->tm_class->tc_done(tm);
++}
++
++/*
++ * Binding with the terminal emulator.
++ */
++
++static void
++termteken_bell(void *softc)
++{
++ struct terminal *tm = softc;
++
++ tm->tm_flags |= TF_BELL;
++}
++
++static void
++termteken_cursor(void *softc, const teken_pos_t *p)
++{
++ struct terminal *tm = softc;
++
++ tm->tm_class->tc_cursor(tm, p);
++}
++
++static void
++termteken_putchar(void *softc, const teken_pos_t *p, teken_char_t c,
++ const teken_attr_t *a)
++{
++ struct terminal *tm = softc;
++
++ tm->tm_class->tc_putchar(tm, p, TCHAR_CREATE(c, a));
++}
++
++static void
++termteken_fill(void *softc, const teken_rect_t *r, teken_char_t c,
++ const teken_attr_t *a)
++{
++ struct terminal *tm = softc;
++
++ tm->tm_class->tc_fill(tm, r, TCHAR_CREATE(c, a));
++}
++
++static void
++termteken_copy(void *softc, const teken_rect_t *r, const teken_pos_t *p)
++{
++ struct terminal *tm = softc;
++
++ tm->tm_class->tc_copy(tm, r, p);
++}
++
++static void
++termteken_param(void *softc, int cmd, unsigned int arg)
++{
++ struct terminal *tm = softc;
++
++ tm->tm_class->tc_param(tm, cmd, arg);
++}
++
++static void
++termteken_respond(void *softc, const void *buf, size_t len)
++{
++#if 0
++ struct terminal *tm = softc;
++ struct tty *tp;
++
++ /*
++ * Only inject a response into the TTY if the data actually
++ * originated from the TTY.
++ *
++ * XXX: This cannot be done right now. The TTY could pick up
++ * other locks. It could also in theory cause loops, when the
++ * TTY performs echoing of a command that generates even more
++ * input.
++ */
++ tp = tm->tm_tty;
++ if (tp == NULL)
++ return;
++
++ ttydisc_rint_simple(tp, buf, len);
++ ttydisc_rint_done(tp);
++#endif
++}
+--- a/sys/modules/drm2/drm2/Makefile
++++ b/sys/modules/drm2/drm2/Makefile
+@@ -54,6 +54,6 @@
+ .endif
+
+ SRCS +=device_if.h bus_if.h pci_if.h device_if.h iicbus_if.h opt_drm.h \
+- opt_vm.h opt_compat.h
++ opt_vm.h opt_compat.h opt_syscons.h
+
+ .include <bsd.kmod.mk>
+--- a/sys/modules/drm2/i915kms/Makefile
++++ b/sys/modules/drm2/i915kms/Makefile
+@@ -34,7 +34,7 @@
+ SRCS += i915_ioc32.c
+ .endif
+
+-SRCS += device_if.h bus_if.h pci_if.h iicbus_if.h iicbb_if.h opt_drm.h \
+- opt_compat.h
++SRCS += device_if.h fb_if.h bus_if.h pci_if.h iicbus_if.h iicbb_if.h \
++ opt_drm.h opt_compat.h opt_syscons.h
+
+ .include <bsd.kmod.mk>
+--- a/sys/modules/drm2/radeonkms/Makefile
++++ b/sys/modules/drm2/radeonkms/Makefile
+@@ -94,8 +94,10 @@
+ opt_acpi.h \
+ opt_compat.h \
+ opt_drm.h \
++ opt_syscons.h \
+ acpi_if.h \
+ bus_if.h \
++ fb_if.h \
+ device_if.h \
+ iicbb_if.h \
+ iicbus_if.h \
+--- a/sys/sparc64/sparc64/machdep.c
++++ b/sys/sparc64/sparc64/machdep.c
+@@ -553,17 +553,15 @@
+ * trigger a fatal reset error or worse things further down the road.
+ * XXX it should be possible to use this solely instead of writing
+ * %tba in cpu_setregs(). Doing so causes a hang however.
+- */
+- sun4u_set_traptable(tl0_base);
+-
+- /*
+- * Initialize the console.
++ *
+ * NB: the low-level console drivers require a working DELAY() and
+ * some compiler optimizations may cause the curthread accesses of
+ * mutex(9) to be factored out even if the latter aren't actually
+- * called, both requiring PCPU_REG to be set.
++ * called. Both of these require PCPU_REG to be set. However, we
++ * can't set PCPU_REG without also taking over the trap table or the
++ * firmware will overwrite it.
+ */
+- cninit();
++ sun4u_set_traptable(tl0_base);
+
+ /*
+ * Initialize the dynamic per-CPU area for the BSP and the message
+@@ -578,6 +576,12 @@
+ mutex_init();
+
+ /*
++ * Initialize console now that we have a reasonable set of system
++ * services.
++ */
++ cninit();
++
++ /*
+ * Finish the interrupt initialization now that mutexes work and
+ * enable them.
+ */
+--- a/sys/sys/consio.h
++++ b/sys/sys/consio.h
+@@ -209,12 +209,36 @@
+ };
+ typedef struct fnt16 fnt16_t;
+
++struct vfnt_map {
++ uint32_t src;
++ uint16_t dst;
++ uint16_t len;
++};
++typedef struct vfnt_map vfnt_map_t;
++
++#define VFNT_MAP_NORMAL 0
++#define VFNT_MAP_NORMAL_RIGHT 1
++#define VFNT_MAP_BOLD 2
++#define VFNT_MAP_BOLD_RIGHT 3
++#define VFNT_MAPS 4
++struct vfnt {
++ vfnt_map_t *map[VFNT_MAPS];
++ uint8_t *glyphs;
++ unsigned int map_count[VFNT_MAPS];
++ unsigned int glyph_count;
++ unsigned int width;
++ unsigned int height;
++};
++typedef struct vfnt vfnt_t;
++
+ #define PIO_FONT8x8 _IOW('c', 64, fnt8_t)
+ #define GIO_FONT8x8 _IOR('c', 65, fnt8_t)
+ #define PIO_FONT8x14 _IOW('c', 66, fnt14_t)
+ #define GIO_FONT8x14 _IOR('c', 67, fnt14_t)
+ #define PIO_FONT8x16 _IOW('c', 68, fnt16_t)
+ #define GIO_FONT8x16 _IOR('c', 69, fnt16_t)
++#define PIO_VFONT _IOW('c', 70, vfnt_t)
++#define GIO_VFONT _IOR('c', 71, vfnt_t)
+
+ /* get video mode information */
+ struct colors {
+--- a/sys/sys/eventhandler.h
++++ b/sys/sys/eventhandler.h
+@@ -275,4 +275,11 @@
+ EVENTHANDLER_DECLARE(kld_unload, kld_unload_fn);
+ EVENTHANDLER_DECLARE(kld_unload_try, kld_unload_try_fn);
+
++/* Generic graphics framebuffer interface */
++struct fb_info;
++typedef void (*register_framebuffer_fn)(void *, struct fb_info *);
++typedef void (*unregister_framebuffer_fn)(void *, struct fb_info *);
++EVENTHANDLER_DECLARE(register_framebuffer, register_framebuffer_fn);
++EVENTHANDLER_DECLARE(unregister_framebuffer, unregister_framebuffer_fn);
++
+ #endif /* SYS_EVENTHANDLER_H */
+--- a/sys/sys/fbio.h
++++ b/sys/sys/fbio.h
+@@ -40,6 +40,10 @@
+
+ #ifndef _KERNEL
+ #include <sys/types.h>
++#else
++#include <sys/param.h>
++#include <sys/systm.h>
++#include <sys/eventhandler.h>
+ #endif
+ #include <sys/ioccom.h>
+
+@@ -101,6 +105,86 @@
+ };
+ #define FBIOGTYPE _IOR('F', 0, struct fbtype)
+
++#define FBTYPE_GET_STRIDE(_fb) ((_fb)->fb_size / (_fb)->fb_height)
++#define FBTYPE_GET_BPP(_fb) ((_fb)->fb_bpp)
++#define FBTYPE_GET_BYTESPP(_fb) ((_fb)->fb_bpp / 8)
++
++#ifdef _KERNEL
++
++struct fb_info;
++
++typedef int fb_enter_t(void *priv);
++typedef int fb_leave_t(void *priv);
++typedef int fb_write_t(void *priv, int offset, void *data, int size);
++typedef int fb_read_t(void *priv, int offset, void *data, int size);
++
++/* XXX: should use priv instead of fb_info too. */
++typedef void fb_copy_t(struct fb_info *sc, uint32_t offset_to, uint32_t offset_from,
++ uint32_t size);
++typedef void fb_wr1_t(struct fb_info *sc, uint32_t offset, uint8_t value);
++typedef void fb_wr2_t(struct fb_info *sc, uint32_t offset, uint16_t value);
++typedef void fb_wr4_t(struct fb_info *sc, uint32_t offset, uint32_t value);
++
++typedef int fb_ioctl_t(struct cdev *, u_long, caddr_t, int, struct thread *);
++typedef int fb_mmap_t(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr,
++ int prot, vm_memattr_t *memattr);
++
++struct fb_info {
++ /* Raw copy of fbtype. Do not change. */
++ int fb_type; /* as defined above */
++ int fb_height; /* in pixels */
++ int fb_width; /* in pixels */
++ int fb_depth; /* bits to define color */
++ int fb_cmsize; /* size of color map (entries) */
++ int fb_size; /* total size in bytes */
++
++ /* Methods. */
++ fb_write_t *fb_write; /* if NULL, direct mem write. */
++ fb_read_t *fb_read; /* if NULL, direct mem read. */
++ fb_ioctl_t *fb_ioctl; /* Can be NULL. */
++ fb_mmap_t *fb_mmap; /* Can be NULL. */
++
++ struct cdev *fb_cdev;
++
++ fb_wr1_t *wr1;
++ fb_wr2_t *wr2;
++ fb_wr4_t *wr4;
++ fb_copy_t *copy;
++ fb_enter_t *enter;
++ fb_leave_t *leave;
++
++ intptr_t fb_pbase; /* For FB mmap. */
++ intptr_t fb_vbase; /* if NULL, use fb_write/fb_read. */
++ void *fb_priv; /* First argument for read/write. */
++ const char *fb_name;
++ uint32_t fb_flags;
++ int fb_stride;
++ int fb_bpp; /* bits per pixel */
++#define FB_FLAG_NOMMAP 1 /* mmap unsupported. */
++ uint32_t fb_cmap[16];
++};
++
++int fbd_list(void);
++int fbd_register(struct fb_info *);
++int fbd_unregister(struct fb_info *);
++
++static inline int
++register_framebuffer(struct fb_info *info)
++{
++
++ EVENTHANDLER_INVOKE(register_framebuffer, info);
++ return (0);
++}
++
++static inline int
++unregister_framebuffer(struct fb_info *info)
++{
++
++ EVENTHANDLER_INVOKE(unregister_framebuffer, info);
++ return (0);
++}
++#endif
++
+ #ifdef notdef
+ /*
+ * General purpose structure for passing info in and out of frame buffers
+--- /dev/null
++++ b/sys/sys/terminal.h
+@@ -0,0 +1,163 @@
++/*-
++ * Copyright (c) 2009 The FreeBSD Foundation
++ * All rights reserved.
++ *
++ * This software was developed by Ed Schouten under sponsorship from the
++ * FreeBSD Foundation.
++ *
++ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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 _SYS_TERMINAL_H_
++#define _SYS_TERMINAL_H_
++
++#include <sys/param.h>
++#include <sys/_lock.h>
++#include <sys/_mutex.h>
++#include <sys/cons.h>
++#include <sys/linker_set.h>
++#include <sys/ttycom.h>
++
++#include <teken/teken.h>
++
++struct terminal;
++struct thread;
++struct tty;
++
++/*
++ * The terminal layer is an abstraction on top of the TTY layer and the
++ * console interface. It can be used by system console drivers to
++ * easily interact with the kernel console and TTYs.
++ *
++ * Terminals contain terminal emulators, which means console drivers
++ * don't need to implement their own terminal emulator. The terminal
++ * emulator deals with UTF-8 exclusively. This means that term_char_t,
++ * the data type used to store input/output characters will always
++ * contain Unicode codepoints.
++ *
++ * To save memory usage, the top bits of term_char_t will contain other
++ * attributes, like colors. Right now term_char_t is composed as
++ * follows:
++ *
++ * Bits Meaning
++ * 0-20: Character value
++ * 21-25: Bold, underline, blink, reverse, right part of CJK fullwidth character
++ * 26-28: Foreground color
++ * 29-31: Background color
++ */
++
++typedef uint32_t term_char_t;
++#define TCHAR_CHARACTER(c) ((c) & 0x1fffff)
++#define TCHAR_FORMAT(c) (((c) >> 21) & 0x1f)
++#define TCHAR_FGCOLOR(c) (((c) >> 26) & 0x7)
++#define TCHAR_BGCOLOR(c) ((c) >> 29)
++
++typedef teken_color_t term_color_t;
++#define TCOLOR_LIGHT(c) ((c) | 0x8)
++#define TCOLOR_DARK(c) ((c) & ~0x8)
++typedef teken_pos_t term_pos_t;
++typedef teken_rect_t term_rect_t;
++
++typedef void tc_cursor_t(struct terminal *tm, const term_pos_t *p);
++typedef void tc_putchar_t(struct terminal *tm, const term_pos_t *p,
++ term_char_t c);
++typedef void tc_fill_t(struct terminal *tm, const term_rect_t *r,
++ term_char_t c);
++typedef void tc_copy_t(struct terminal *tm, const term_rect_t *r,
++ const term_pos_t *p);
++typedef void tc_param_t(struct terminal *tm, int cmd, unsigned int arg);
++typedef void tc_done_t(struct terminal *tm);
++
++typedef void tc_cnprobe_t(struct terminal *tm, struct consdev *cd);
++typedef int tc_cngetc_t(struct terminal *tm);
++
++typedef void tc_opened_t(struct terminal *tm, int opened);
++typedef int tc_ioctl_t(struct terminal *tm, u_long cmd, caddr_t data,
++ struct thread *td);
++typedef int tc_mmap_t(struct terminal *tm, vm_ooffset_t offset,
++ vm_paddr_t * paddr, int nprot, vm_memattr_t *memattr);
++typedef void tc_bell_t(struct terminal *tm);
++
++struct terminal_class {
++ /* Terminal emulator. */
++ tc_cursor_t *tc_cursor;
++ tc_putchar_t *tc_putchar;
++ tc_fill_t *tc_fill;
++ tc_copy_t *tc_copy;
++ tc_param_t *tc_param;
++ tc_done_t *tc_done;
++
++ /* Low-level console interface. */
++ tc_cnprobe_t *tc_cnprobe;
++ tc_cngetc_t *tc_cngetc;
++
++ /* Misc. */
++ tc_opened_t *tc_opened;
++ tc_ioctl_t *tc_ioctl;
++ tc_mmap_t *tc_mmap;
++ tc_bell_t *tc_bell;
++};
++
++struct terminal {
++ const struct terminal_class *tm_class;
++ void *tm_softc;
++ struct mtx tm_mtx;
++ struct tty *tm_tty;
++ teken_t tm_emulator;
++ struct winsize tm_winsize;
++ unsigned int tm_flags;
++#define TF_MUTE 0x1 /* Drop incoming data. */
++#define TF_BELL 0x2 /* Bell needs to be sent. */
++#define TF_CONS 0x4 /* Console device (needs spinlock). */
++ struct consdev *consdev;
++};
++
++#ifdef _KERNEL
++
++struct terminal *terminal_alloc(const struct terminal_class *tc, void *softc);
++void terminal_maketty(struct terminal *tm, const char *fmt, ...);
++void terminal_set_winsize_blank(struct terminal *tm,
++ const struct winsize *size, int blank);
++void terminal_set_winsize(struct terminal *tm, const struct winsize *size);
++void terminal_mute(struct terminal *tm, int yes);
++void terminal_input_char(struct terminal *tm, term_char_t c);
++void terminal_input_raw(struct terminal *tm, char c);
++void terminal_input_special(struct terminal *tm, unsigned int k);
++
++void termcn_cnregister(struct terminal *tm);
++
++/* Kernel console helper interface. */
++extern const struct consdev_ops termcn_cnops;
++
++#define TERMINAL_DECLARE_EARLY(name, class, softc) \
++ static struct terminal name = { \
++ .tm_class = &class, \
++ .tm_softc = softc, \
++ .tm_flags = TF_CONS, \
++ }; \
++ CONSOLE_DEVICE(name ## _consdev, termcn_cnops, &name)
++
++#endif /* _KERNEL */
++
++#endif /* !_SYS_TERMINAL_H_ */
+--- a/sys/sys/tty.h
++++ b/sys/sys/tty.h
+@@ -166,6 +166,7 @@
+
+ #define tty_lock(tp) mtx_lock((tp)->t_mtx)
+ #define tty_unlock(tp) mtx_unlock((tp)->t_mtx)
++#define tty_lock_owned(tp) mtx_owned((tp)->t_mtx)
+ #define tty_lock_assert(tp,ma) mtx_assert((tp)->t_mtx, (ma))
+ #define tty_getlock(tp) ((tp)->t_mtx)
+
+--- a/sys/teken/demo/teken_demo.c
++++ b/sys/teken/demo/teken_demo.c
+@@ -86,9 +86,10 @@
+ assert(p->tp_row < NROWS);
+ assert(p->tp_col < NCOLS);
+
+- getyx(stdscr, y, x);
+-
+ px = &buffer[p->tp_col][p->tp_row];
++ /* No need to print right hand side of CJK character manually. */
++ if (px->a.ta_format & TF_CJK_RIGHT)
++ return;
+
+ /* Convert Unicode to UTF-8. */
+ if (px->c < 0x80) {
+@@ -118,8 +119,8 @@
+
+ bkgdset(attr | COLOR_PAIR(teken_256to8(px->a.ta_fgcolor) +
+ 8 * teken_256to8(px->a.ta_bgcolor)));
++ getyx(stdscr, y, x);
+ mvaddstr(p->tp_row, p->tp_col, str);
+-
+ move(y, x);
+ }
+
+--- a/sys/teken/teken.c
++++ b/sys/teken/teken.c
+@@ -338,15 +338,40 @@
+ return (&t->t_winsize);
+ }
+
++static void
++teken_trim_cursor_pos(teken_t *t, const teken_pos_t *new)
++{
++ const teken_pos_t *cur;
++
++ cur = &t->t_winsize;
++
++ if (cur->tp_row < new->tp_row || cur->tp_col < new->tp_col)
++ return;
++ if (t->t_cursor.tp_row >= new->tp_row)
++ t->t_cursor.tp_row = new->tp_row - 1;
++ if (t->t_cursor.tp_col >= new->tp_col)
++ t->t_cursor.tp_col = new->tp_col - 1;
++}
++
+ void
+ teken_set_winsize(teken_t *t, const teken_pos_t *p)
+ {
+
++ teken_trim_cursor_pos(t, p);
+ t->t_winsize = *p;
+ teken_subr_do_reset(t);
+ }
+
+ void
++teken_set_winsize_noreset(teken_t *t, const teken_pos_t *p)
++{
++
++ teken_trim_cursor_pos(t, p);
++ t->t_winsize = *p;
++ teken_subr_do_resize(t);
++}
++
++void
+ teken_set_8bit(teken_t *t)
+ {
+
+--- a/sys/teken/teken.h
++++ b/sys/teken/teken.h
+@@ -41,10 +41,11 @@
+ typedef uint32_t teken_char_t;
+ typedef unsigned short teken_unit_t;
+ typedef unsigned char teken_format_t;
+-#define TF_BOLD 0x01
+-#define TF_UNDERLINE 0x02
+-#define TF_BLINK 0x04
+-#define TF_REVERSE 0x08
++#define TF_BOLD 0x01 /* Bold character. */
++#define TF_UNDERLINE 0x02 /* Underline character. */
++#define TF_BLINK 0x04 /* Blinking character. */
++#define TF_REVERSE 0x08 /* Reverse rendered character. */
++#define TF_CJK_RIGHT 0x10 /* Right-hand side of CJK character. */
+ typedef unsigned char teken_color_t;
+ #define TC_BLACK 0
+ #define TC_RED 1
+@@ -168,6 +169,7 @@
+ void teken_set_curattr(teken_t *, const teken_attr_t *);
+ void teken_set_defattr(teken_t *, const teken_attr_t *);
+ void teken_set_winsize(teken_t *, const teken_pos_t *);
++void teken_set_winsize_noreset(teken_t *, const teken_pos_t *);
+
+ /* Key input escape sequences. */
+ #define TKEY_UP 0x00
+--- a/sys/teken/teken_subr.h
++++ b/sys/teken/teken_subr.h
+@@ -791,21 +791,19 @@
+ teken_funcs_copy(t, &ctr, &ctp);
+ }
+
++ teken_funcs_putchar(t, tp, c, &t->t_curattr);
++
+ if (width == 2 && tp->tp_col + 1 < t->t_winsize.tp_col) {
+ teken_pos_t tp2;
++ teken_attr_t attr;
+
+- /*
+- * Store a space behind double width characters before
+- * actually printing them. This prevents artifacts when
+- * the consumer doesn't render it using double width
+- * glyphs.
+- */
++ /* Print second half of CJK fullwidth character. */
+ tp2.tp_row = tp->tp_row;
+ tp2.tp_col = tp->tp_col + 1;
+- teken_funcs_putchar(t, &tp2, BLANK, &t->t_curattr);
++ attr = t->t_curattr;
++ attr.ta_format |= TF_CJK_RIGHT;
++ teken_funcs_putchar(t, &tp2, c, &attr);
+ }
+-
+- teken_funcs_putchar(t, tp, c, &t->t_curattr);
+ }
+
+ static void
+@@ -842,13 +840,18 @@
+ }
+ t->t_cursor.tp_col = 0;
+ }
+- } else if (t->t_cursor.tp_col == t->t_winsize.tp_col - 1 &&
+- (t->t_stateflags & (TS_WRAPPED|TS_AUTOWRAP)) ==
+- (TS_WRAPPED|TS_AUTOWRAP)) {
++ } else if (t->t_stateflags & TS_AUTOWRAP &&
++ ((t->t_stateflags & TS_WRAPPED &&
++ t->t_cursor.tp_col + 1 == t->t_winsize.tp_col) ||
++ t->t_cursor.tp_col + width > t->t_winsize.tp_col)) {
+ teken_pos_t tp;
+
+- /* Perform line wrapping. */
+-
++ /*
++ * Perform line wrapping, if:
++ * - Autowrapping is enabled, and
++ * - We're in the wrapped state at the last column, or
++ * - The character to be printed does not fit anymore.
++ */
+ if (t->t_cursor.tp_row == t->t_scrollreg.ts_end - 1) {
+ /* Perform scrolling. */
+ teken_subr_do_scroll(t, 1);
+@@ -956,6 +959,15 @@
+ }
+
+ static void
++teken_subr_do_resize(teken_t *t)
++{
++
++ t->t_scrollreg.ts_begin = 0;
++ t->t_scrollreg.ts_end = t->t_winsize.tp_row;
++ t->t_originreg = t->t_scrollreg;
++}
++
++static void
+ teken_subr_do_reset(teken_t *t)
+ {
+
Modified: trunk/kfreebsd-10/debian/patches/series
===================================================================
--- trunk/kfreebsd-10/debian/patches/series 2014-03-04 05:12:17 UTC (rev 5449)
+++ trunk/kfreebsd-10/debian/patches/series 2014-03-10 12:32:04 UTC (rev 5450)
@@ -2,6 +2,7 @@
si_status_wait6.diff
accept_O_CLOEXEC_in_shm_open.diff
radeonkms_abort_nofw.diff
+newcons.diff
# Patches that are in good shape for merging upstream
mount_remount.diff
More information about the Glibc-bsd-commits
mailing list