diff --git a/Makefile.am b/Makefile.am
index 5f5c6a8..0e897ab 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -18,12 +18,17 @@
 #  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 #  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-AUTOMAKE_OPTIONS = foreign
 SUBDIRS = src man tools
+MAINTAINERCLEANFILES = ChangeLog INSTALL
 
-EXTRA_DIST = COPYING NEWS README
+EXTRA_DIST = COPYING NEWS README OldChangeLog
+
+.PHONY: ChangeLog INSTALL
+
+INSTALL:
+	$(INSTALL_CMD)
 
 ChangeLog:
 	$(CHANGELOG_CMD)
 
-dist-hook: ChangeLog
+dist-hook: ChangeLog INSTALL
diff --git a/ChangeLog b/OldChangeLog
similarity index 100%
rename from ChangeLog
rename to OldChangeLog
diff --git a/configure.ac b/configure.ac
index b751558..b2497ef 100644
--- a/configure.ac
+++ b/configure.ac
@@ -21,9 +21,9 @@
 # Process this file with autoconf to produce a configure script
 
 # Initialize Autoconf
-AC_PREREQ(2.57)
+AC_PREREQ([2.60])
 AC_INIT([xf86-video-openchrome],
-        [0.6.0],
+        [0.6.225],
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/openchrome],
         [xf86-video-openchrome])
 
@@ -42,7 +42,12 @@ AC_CONFIG_HEADERS([config.h])
 AC_CONFIG_AUX_DIR(.)
 
 AM_INIT_AUTOMAKE([foreign dist-bzip2])
-AM_MAINTAINER_MODE
+
+# Require xorg-macros: XORG_DEFAULT_OPTIONS
+m4_ifndef([XORG_MACROS_VERSION], 
+          [m4_fatal([must install xorg-macros 1.3 or later before running autoconf/autogen])])
+XORG_MACROS_VERSION(1.3)
+XORG_DEFAULT_OPTIONS
 
 # Initialize libtool
 AC_DISABLE_STATIC
@@ -52,22 +57,22 @@ AC_SYS_LARGEFILE
 AH_TOP([#include "xorg-server.h"])
 
 AC_ARG_WITH(xorg-module-dir,
-            AC_HELP_STRING([--with-xorg-module-dir=DIR],
+            AS_HELP_STRING([--with-xorg-module-dir=DIR],
                            [Default xorg module directory [[default=$libdir/xorg/modules]]]),
             [moduledir="$withval"],
             [moduledir="$libdir/xorg/modules"])
 
-AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug],
+AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug],
 				    [Enable debugging support [[default=no]]]),
               [DEBUG="$enableval"],
               [DEBUG=no])
 
-AC_ARG_ENABLE(xv-debug, AC_HELP_STRING([--enable-xv-debug],
+AC_ARG_ENABLE(xv-debug, AS_HELP_STRING([--enable-xv-debug],
 				    [Enable XVideo debugging support [[default=no]]]),
               [XV_DEBUG="$enableval"],
               [XV_DEBUG=no])
 
-AC_ARG_ENABLE(viaregtool, AC_HELP_STRING([--enable-viaregtool],
+AC_ARG_ENABLE(viaregtool, AS_HELP_STRING([--enable-viaregtool],
 				    [Enable build of registers dumper tool [[default=no]]]),
               [TOOLS="$enableval"],
               [TOOLS=no])
@@ -88,8 +93,6 @@ AM_CONDITIONAL(HAVE_XEXTPROTO_71, [ test "$HAVE_XEXTPROTO_71" = "yes" ])
 
 # Checks for libraries.
 
-# Checks for header files.
-AC_HEADER_STDC
 
 save_CPPFLAGS="$CPPFLAGS"
 CPPFLAGS="$XORG_CFLAGS $CPPFLAGS"
@@ -158,28 +161,20 @@ if test "$TOOLS" = yes; then
         AC_DEFINE(TOOLS,1,[Enable build of registers dumper tool])
 fi
 
+AC_DEFINE(X_USE_REGION_NULL, 1, [Compatibility define for older Xen])
+AC_DEFINE(X_NEED_I2CSTART, 1, [Compatibility define for older Xen])
+
 AC_SUBST([DRI_CFLAGS])
-AC_SUBST([XORG_CFLAGS])
 AC_SUBST([moduledir])
 
 DRIVER_NAME=openchrome
 AC_SUBST([DRIVER_NAME])
 
-AC_DEFINE(X_USE_LINEARFB,1,[Compatibility define for older Xen])
-AC_DEFINE(X_USE_REGION_NULL,1,[Compatibility define for older Xen])
-AC_DEFINE(X_HAVE_XAAGETROP,1,[Compatibility define for older Xen])
-AC_DEFINE(X_NEED_I2CSTART,1,[Compatibility define for older Xen])
-
-DRIVER_MAN_SUFFIX="4"
-AC_SUBST([DRIVER_MAN_SUFFIX])
-
-XORG_MANPAGE_SECTIONS
-XORG_RELEASE_VERSION
-
-AC_OUTPUT([
-	Makefile
-	src/xvmc/Makefile
-	src/Makefile
-	man/Makefile
-	tools/Makefile
+AC_CONFIG_FILES([
+                Makefile
+                src/xvmc/Makefile
+                src/Makefile
+                man/Makefile
+                tools/Makefile
 ])
+AC_OUTPUT
diff --git a/man/Makefile.am b/man/Makefile.am
index a16c387..31906f2 100644
--- a/man/Makefile.am
+++ b/man/Makefile.am
@@ -1,35 +1,31 @@
-# $Id: Makefile.am,v 1.4 2005/10/18 00:01:55 alanc Exp $
 #
 # Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
-# 
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation.
-# 
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-# 
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-# IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-# 
-# Except as contained in this notice, the name of the copyright holders shall
-# not be used in advertising or otherwise to promote the sale, use or
-# other dealings in this Software without prior written authorization
-# from the copyright holders.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice (including the next
+# paragraph) shall be included in all copies or substantial portions of the
+# Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
 # 
 
-drivermandir = $(mandir)/man$(DRIVER_MAN_SUFFIX)
+drivermandir = $(DRIVER_MAN_DIR)
 
-driverman_MANFILES = @DRIVER_NAME@.man
+driverman_PRE = @DRIVER_NAME@.man
 
-driverman_DATA = $(driverman_MANFILES:man=@DRIVER_MAN_SUFFIX@)
+driverman_DATA = $(driverman_PRE:man=@DRIVER_MAN_SUFFIX@)
 
 EXTRA_DIST = @DRIVER_NAME@.man
 
diff --git a/src/Makefile.am b/src/Makefile.am
index 68d75c7..553b9ab 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -29,7 +29,7 @@ SUBDIRS = xvmc
 BUILT_SOURCES = version.h
 EXTRA_DIST = version.h
 CONFIG_CLEAN_FILES= version.h
-AM_CFLAGS = @XORG_CFLAGS@ @LIBUDEV_CFLAGS@ @DRI_CFLAGS@
+AM_CFLAGS = @XORG_CFLAGS@ $(CWARNFLAGS) @LIBUDEV_CFLAGS@ @DRI_CFLAGS@
 openchrome_drv_la_LTLIBRARIES = openchrome_drv.la
 openchrome_drv_la_LDFLAGS = -module -avoid-version @LIBUDEV_LIBS@
 openchrome_drv_ladir = @moduledir@/drivers
@@ -53,13 +53,13 @@ openchrome_drv_la_SOURCES = \
          via_driver.c \
          via_driver.h \
          via_i2c.c \
-         via_id.c \
          via_fp.c \
+         via_fp.h \
          via_memcpy.c \
          via_memmgr.h \
          via_memmgr.c \
+         via_options.c \
          via_outputs.c \
-         via_mode.h \
          via_priv.h \
          via_regs.h \
          via_sii164.c \
diff --git a/src/via_analog.c b/src/via_analog.c
index 682ae20..473b7aa 100644
--- a/src/via_analog.c
+++ b/src/via_analog.c
@@ -42,62 +42,85 @@
 
 
 /*
- * Enables or disables analog VGA output by controlling DAC
- * (Digital to Analog Converter) output state.
+ * Enables or disables analog (VGA) output.
  */
 static void
-viaAnalogOutput(ScrnInfoPtr pScrn, Bool outputState)
+viaAnalogPower(ScrnInfoPtr pScrn, Bool outputState)
 {
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaAnalogOutput.\n"));
+                        "Entered viaAnalogPower.\n"));
 
-    /* This register controls analog VGA DAC output state. */
-    /* 3X5.47[2] - DACOFF Backdoor Register
-     *             0: DAC on
-     *             1: DAC off */
-    ViaCrtcMask(hwp, 0x47, outputState ? 0x00 : 0x04, 0x04);
+    viaAnalogSetPower(pScrn, outputState);
     xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "Analog VGA Output: %s\n",
+                "Analog (VGA) Power: %s\n",
                 outputState ? "On" : "Off");
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaAnalogOutput.\n"));
+                        "Exiting viaAnalogPower.\n"));
+}
+
+/*
+ * Set analog (VGA) sync polarity.
+ */
+static void
+viaAnalogSyncPolarity(ScrnInfoPtr pScrn, unsigned int flags)
+{
+    CARD8 syncPolarity = 0x00;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaAnalogSyncPolarity.\n"));
+
+    if (flags & V_NHSYNC) {
+        syncPolarity |= BIT(0);
+    }
+
+    if (flags & V_NVSYNC) {
+        syncPolarity |= BIT(1);
+    }
+
+    viaAnalogSetSyncPolarity(pScrn, syncPolarity);
+    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                "Analog (VGA) Horizontal Sync Polarity: %s\n",
+                (syncPolarity & BIT(0)) ? "-" : "+");
+    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                "Analog (VGA) Vertical Sync Polarity: %s\n",
+                (syncPolarity & BIT(1)) ? "-" : "+");
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaAnalogSyncPolarity.\n"));
 }
 
 /*
  * Specifies IGA1 or IGA2 for analog VGA DAC source.
  */
 static void
-viaAnalogSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
+viaAnalogDisplaySource(ScrnInfoPtr pScrn, int index)
 {
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    CARD8 value = displaySource;
+    CARD8 displaySource = index;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaAnalogSetDisplaySource.\n"));
+                        "Entered viaAnalogDisplaySource.\n"));
 
-    ViaSeqMask(hwp, 0x16, value << 6, 0x40);
+    viaAnalogSetDisplaySource(pScrn, displaySource & 0x01);
     xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "Analog VGA Display Output Source: IGA%d\n",
-                (value & 0x01) + 1);
+                "Analog (VGA) Display Source: IGA%d\n",
+                (displaySource & 0x01) + 1);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaAnalogSetDisplaySource.\n"));
+                        "Exiting viaAnalogDisplaySource.\n"));
 }
 
 /*
  * Intializes analog VGA related registers.
  */
 static void
-viaAnalogInit(ScrnInfoPtr pScrn)
+viaAnalogInitReg(ScrnInfoPtr pScrn)
 {
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaAnalogInit.\n"));
+                        "Entered viaAnalogInitReg.\n"));
 
     /* 3X5.37[7]   - DAC Power Save Control 1
      *               0: Depend on Rx3X5.37[5:4] setting
@@ -120,50 +143,109 @@ viaAnalogInit(ScrnInfoPtr pScrn)
     case VIA_VX800:
     case VIA_VX855:
     case VIA_VX900:
-        /* 3C5.5E[0] - CRT DACOFF Setting
-         *             1: CRT DACOFF controlled by 3C5.01[5] */
-        ViaSeqMask(hwp, 0x5E, 0x01, 0x01);
+        /* Make sure 3C5.01[5] does not turn off analog (VGA) DAC. */
+        viaAnalogSetDACOff(pScrn, FALSE);
+
         break;
     default:
         break;
     }
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaAnalogInit.\n"));
+                        "Exiting viaAnalogInitReg.\n"));
 }
 
 /*
- * Sets the polarity of horizontal synchronization and vertical
- * synchronization.
+ * Detect a VGA connector.
+ *
+ * The code here was borrowed from VIA Technologies X.Org X Server
+ * DDX code. (In particular, from viaDetectCRTVsync function
+ * inside via_output.c.)
  */
-static void
-viaAnalogSetSyncPolarity(ScrnInfoPtr pScrn, DisplayModePtr mode)
+static Bool
+viaAnalogDetectConnector(ScrnInfoPtr pScrn)
 {
     vgaHWPtr hwp = VGAHWPTR(pScrn);
-    CARD8 miscRegister;
+    VIAPtr pVia = VIAPTR(pScrn);
+    Bool connectorDetected = FALSE;
+    CARD8 sr40, cr36, cr37, cr43, cr44, cr47;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaAnalogSetSyncPolarity.\n"));
+                        "Entered viaAnalogDetectConnector.\n"));
+
+    sr40 = hwp->readSeq(hwp, 0x40);
+    cr36 = hwp->readCrtc(hwp, 0x36);
+    cr37 = hwp->readCrtc(hwp, 0x37);
+    cr43 = hwp->readCrtc(hwp, 0x43);
+    cr44 = hwp->readCrtc(hwp, 0x44);
+    cr47 = hwp->readCrtc(hwp, 0x47);
+
+    if ((pVia->Chipset == VIA_CX700)
+        || (pVia->Chipset == VIA_VX800)
+        || (pVia->Chipset == VIA_VX855)
+        || (pVia->Chipset == VIA_VX900)) {
+        ViaCrtcMask(hwp, 0x43, 0x90, BIT(7) | BIT(6) | BIT(5) | BIT(4));
+        hwp->writeCrtc(hwp, 0x44, 0x00);
+    }
 
-/* Set certain bits of miscellaneous output register
- * meant for IGA1. */
-    miscRegister = hwp->readMiscOut(hwp);
-    if (mode->Flags & V_NHSYNC) {
-        miscRegister |= 0x40;
-    } else {
-        miscRegister &= (~0x40);
+    /* Turn on DAC. */
+    ViaCrtcMask(hwp, 0x37, 0x04, 0xff);
+    ViaCrtcMask(hwp, 0x47, 0x00, BIT(2));
+
+    /* Power On DPMS. */
+    ViaCrtcMask(hwp, 0x36, 0x00, BIT(7) | BIT(6) | BIT(5) | BIT(4));
+
+    /* Wait for vblank. */
+    usleep(16);
+
+    /* Enable CRT Sense. */
+    ViaSeqMask(hwp, 0x40, BIT(7), BIT(7));
+
+    if ((pVia->Chipset == VIA_CX700)
+        || (pVia->Chipset == VIA_VX800)
+        || (pVia->Chipset == VIA_VX855)
+        || (pVia->Chipset == VIA_VX900)) {
+        ViaSeqMask(hwp, 0x40, 0x00, BIT(7));
     }
 
-    if (mode->Flags & V_NVSYNC) {
-        miscRegister |= 0x80;
+    /*
+    VT3324, VT3353: SR40[7]=1 --> SR40[7] = 0 --> check 3C2[4]
+    other: SR40[7]=1 --> check 3C2[4] --> SR40[7]=0
+    */
+    if (ViaVgahwIn(hwp, 0x3C2) & BIT(4)) {
+        connectorDetected = TRUE;
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                            "VGA connector detected.\n"));
     } else {
-        miscRegister &= (~0x80);
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                            "VGA connector not detected.\n"));
+    }
+
+    if ((pVia->Chipset != VIA_CX700)
+        && (pVia->Chipset != VIA_VX800)
+        && (pVia->Chipset != VIA_VX855)
+        && (pVia->Chipset != VIA_VX900)) {
+        ViaSeqMask(hwp, 0x40, 0x00, BIT(7));
+    }
+
+    /* Restore */
+    hwp->writeCrtc(hwp, 0x47, cr47);
+
+    if ((pVia->Chipset == VIA_CX700)
+        || (pVia->Chipset == VIA_VX800)
+        || (pVia->Chipset == VIA_VX855)
+        || (pVia->Chipset == VIA_VX900)) {
+        hwp->writeCrtc(hwp, 0x44, cr44);
+        hwp->writeCrtc(hwp, 0x43, cr43);
     }
 
-    hwp->writeMiscOut(hwp, miscRegister);
+    hwp->writeCrtc(hwp, 0x37, cr37);
+    hwp->writeCrtc(hwp, 0x36, cr36);
+    hwp->writeSeq(hwp, 0x40, sr40);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaAnalogSetSyncPolarity.\n"));
+                        "Exiting viaAnalogDetectConnector.\n"));
+    return connectorDetected;
 }
 
 
@@ -182,14 +264,25 @@ via_analog_dpms(xf86OutputPtr output, int mode)
 
     switch (mode) {
     case DPMSModeOn:
-        viaAnalogOutput(pScrn, TRUE);
+        viaAnalogSetDPMSControl(pScrn, VIA_ANALOG_DPMS_ON);
+        viaAnalogPower(pScrn, TRUE);
         break;
     case DPMSModeStandby:
+        viaAnalogSetDPMSControl(pScrn, VIA_ANALOG_DPMS_STANDBY);
+        viaAnalogPower(pScrn, TRUE);
+        break;
     case DPMSModeSuspend:
+        viaAnalogSetDPMSControl(pScrn, VIA_ANALOG_DPMS_SUSPEND);
+        viaAnalogPower(pScrn, TRUE);
+        break;
     case DPMSModeOff:
-        viaAnalogOutput(pScrn, FALSE);
+        viaAnalogSetDPMSControl(pScrn, VIA_ANALOG_DPMS_OFF);
+        viaAnalogPower(pScrn, FALSE);
         break;
     default:
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                    "Invalid DPMS Mode: %d\n",
+                    mode);
         break;
     }
 
@@ -227,13 +320,31 @@ via_analog_mode_fixup(xf86OutputPtr output, DisplayModePtr mode,
 static void
 via_analog_prepare(xf86OutputPtr output)
 {
-    via_analog_dpms(output, DPMSModeOff);
+    ScrnInfoPtr pScrn = output->scrn;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered via_analog_prepare.\n"));
+
+    viaAnalogSetDPMSControl(pScrn, VIA_ANALOG_DPMS_OFF);
+    viaAnalogPower(pScrn, FALSE);
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting via_analog_prepare.\n"));
 }
 
 static void
 via_analog_commit(xf86OutputPtr output)
 {
-    via_analog_dpms(output, DPMSModeOn);
+    ScrnInfoPtr pScrn = output->scrn;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered via_analog_commit.\n"));
+
+    viaAnalogSetDPMSControl(pScrn, VIA_ANALOG_DPMS_ON);
+    viaAnalogPower(pScrn, TRUE);
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting via_analog_commit.\n"));
 }
 
 static void
@@ -247,9 +358,9 @@ via_analog_mode_set(xf86OutputPtr output, DisplayModePtr mode,
                         "Entered via_analog_mode_set.\n"));
 
     if (output->crtc) {
-        viaAnalogInit(pScrn);
-        viaAnalogSetSyncPolarity(pScrn, adjusted_mode);
-        viaAnalogSetDisplaySource(pScrn, iga->index ? 0x01 : 0x00);
+        viaAnalogInitReg(pScrn);
+        viaAnalogSyncPolarity(pScrn, adjusted_mode->Flags);
+        viaAnalogDisplaySource(pScrn, iga->index);
     }
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -259,84 +370,84 @@ via_analog_mode_set(xf86OutputPtr output, DisplayModePtr mode,
 static xf86OutputStatus
 via_analog_detect(xf86OutputPtr output)
 {
-    xf86OutputStatus status = XF86OutputStatusDisconnected;
     ScrnInfoPtr pScrn = output->scrn;
-    VIAPtr pVia = VIAPTR(pScrn);
-    xf86MonPtr mon;
+    xf86OutputStatus status = XF86OutputStatusDisconnected;
+    Bool connectorDetected;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered via_analog_detect.\n"));
 
-    /* Probe I2C Bus 1 to see if a VGA monitor is connected. */
     xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                "Probing for a VGA monitor on I2C Bus 1.\n");
-    mon = xf86OutputGetEDID(output, pVia->pI2CBus1);
-    if (mon && (!mon->features.input_type)) {
-        xf86OutputSetEDID(output, mon);
-        status = XF86OutputStatusConnected;
+                "Probing for a VGA connector . . .\n");
+
+    connectorDetected = viaAnalogDetectConnector(pScrn);
+    if (!connectorDetected) {
         xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                    "Detected a VGA monitor on I2C Bus 1.\n");
+                    "VGA connector not detected.\n");
+        goto exit;
+    }
+
+    status = XF86OutputStatusConnected;
+    xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                "VGA connector detected.\n");
+exit:
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting via_analog_detect.\n"));
+    return status;
+}
+
+static DisplayModePtr
+via_analog_get_modes(xf86OutputPtr output)
+{
+    ScrnInfoPtr pScrn = output->scrn;
+    xf86MonPtr pMon;
+    DisplayModePtr pDisplay_Mode = NULL;
+    I2CBusPtr pI2CBus;
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    VIAAnalogPtr pVIAAnalog = (VIAAnalogPtr) output->driver_private;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered via_analog_get_modes.\n"));
+
+    if (pVIAAnalog->i2cBus & VIA_I2C_BUS1) {
+        pI2CBus = pVIADisplay->pI2CBus1;
     } else {
-        xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                    "Did not detect a VGA monitor on I2C Bus 1.\n");
+        pI2CBus = NULL;
+    }
 
-        /* Probe I2C Bus 2 to see if a VGA monitor is connected. */
-        xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                    "Probing for a VGA monitor on I2C Bus 2.\n");
-        mon = xf86OutputGetEDID(output, pVia->pI2CBus2);
-        if (mon && (!mon->features.input_type)) {
-            xf86OutputSetEDID(output, mon);
-            status = XF86OutputStatusConnected;
-            xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                        "Detected a VGA monitor on I2C Bus 2.\n");
-        } else {
+    if (pI2CBus) {
+        pMon = xf86OutputGetEDID(output, pI2CBus);
+        if (pMon && (!pMon->features.input_type)) {
+            xf86OutputSetEDID(output, pMon);
+            pDisplay_Mode = xf86OutputGetEDIDModes(output);
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                        "Did not detect a VGA monitor on I2C Bus 2.\n");
+                        "Detected a monitor connected to VGA.\n");
+            goto exit;
+        }
+    }
+
+    if (pVIAAnalog->i2cBus & VIA_I2C_BUS2) {
+        pI2CBus = pVIADisplay->pI2CBus2;
+    } else {
+        pI2CBus = NULL;
+    }
 
-            /* Perform manual detection of a VGA monitor since */
-            /* it was not detected via I2C buses. */
+    if (pI2CBus) {
+        pMon = xf86OutputGetEDID(output, pI2CBus);
+        if (pMon && (!pMon->features.input_type)) {
+            xf86OutputSetEDID(output, pMon);
+            pDisplay_Mode = xf86OutputGetEDIDModes(output);
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                        "Now perform manual detection of a VGA "
-                        "monitor.\n");
-            vgaHWPtr hwp = VGAHWPTR(pScrn);
-            CARD8 SR01 = hwp->readSeq(hwp, 0x01);
-            CARD8 SR40 = hwp->readSeq(hwp, 0x40);
-            CARD8 CR36 = hwp->readCrtc(hwp, 0x36);
-
-            /* We have to power on the display to detect it */
-            ViaSeqMask(hwp, 0x01, 0x00, 0x20);
-            ViaCrtcMask(hwp, 0x36, 0x00, 0xF0);
-
-            /* Wait for vblank */
-            usleep(16);
-
-            /* Detect the load on pins */
-            ViaSeqMask(hwp, 0x40, 0x80, 0x80);
-
-            if ((VIA_CX700 == pVia->Chipset) ||
-                (VIA_VX800 == pVia->Chipset) ||
-                (VIA_VX855 == pVia->Chipset) ||
-                (VIA_VX900 == pVia->Chipset))
-                ViaSeqMask(hwp, 0x40, 0x00, 0x80);
-
-            if (ViaVgahwIn(hwp, 0x3C2) & 0x20) {
-                status = XF86OutputStatusConnected;
-                xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                            "Detected a VGA monitor using manual "
-                            "detection method.\n");
-            }
-
-            if ((VIA_CX700 == pVia->Chipset) ||
-                (VIA_VX800 == pVia->Chipset) ||
-                (VIA_VX855 == pVia->Chipset) ||
-                (VIA_VX900 == pVia->Chipset))
-                ViaSeqMask(hwp, 0x40, 0x00, 0x80);
-
-            /* Restore previous state */
-            hwp->writeSeq(hwp, 0x40, SR40);
-            hwp->writeSeq(hwp, 0x01, SR01);
-            hwp->writeCrtc(hwp, 0x36, CR36);
+                        "Detected a monitor connected to VGA.\n");
+            goto exit;
         }
     }
 
-    return status;
+exit:
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting via_analog_get_modes.\n"));
+    return pDisplay_Mode;
 }
 
 #ifdef RANDR_12_INTERFACE
@@ -372,7 +483,7 @@ static const xf86OutputFuncsRec via_analog_funcs = {
     .commit             = via_analog_commit,
     .mode_set           = via_analog_mode_set,
     .detect             = via_analog_detect,
-    .get_modes          = xf86OutputGetEDIDModes,
+    .get_modes          = via_analog_get_modes,
 #ifdef RANDR_12_INTERFACE
     .set_property       = via_analog_set_property,
 #endif
@@ -383,28 +494,102 @@ static const xf86OutputFuncsRec via_analog_funcs = {
 };
 
 void
-via_analog_init(ScrnInfoPtr pScrn)
+viaAnalogProbe(ScrnInfoPtr pScrn)
 {
+    vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
-    xf86OutputPtr output = NULL;
-    char outputNameBuffer[32];
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    CARD8 sr13, sr5a;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered via_analog_init.\n"));
+                        "Entered viaAnalogProbe.\n"));
 
-    if (!pVia->pI2CBus1 || !pVia->pI2CBus2) {
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "I2C Bus 1 or I2C Bus 2 does not exist.\n");
+    /* Detect the presence of VGA. */
+    switch (pVia->Chipset) {
+    case VIA_CX700:
+    case VIA_VX800:
+    case VIA_VX855:
+    case VIA_VX900:
+        sr5a = hwp->readSeq(hwp, 0x5A);
+
+        /* Setting SR5A[0] to 1.
+         * This allows the reading out the alternative
+         * pin strapping information from SR12 and SR13. */
+        ViaSeqMask(hwp, 0x5A, BIT(0), BIT(0));
+
+        sr13 = hwp->readSeq(hwp, 0x13);
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                            "SR13: 0x%02X\n", sr13));
+        if (!(sr13 & BIT(2))) {
+            pVIADisplay->analogPresence = TRUE;
+            pVIADisplay->analogI2CBus = VIA_I2C_BUS2 | VIA_I2C_BUS1;
+            pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2 | VIA_I2C_BUS1;
+            DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                                "Detected the presence of VGA.\n"));
+        } else {
+            pVIADisplay->analogPresence = FALSE;
+            pVIADisplay->analogI2CBus = VIA_I2C_NONE;
+        }
+
+        hwp->writeSeq(hwp, 0x5A, sr5a);
+        break;
+    default:
+        /* For all other devices, assume VGA presence. */
+        pVIADisplay->analogPresence = TRUE;
+        pVIADisplay->analogI2CBus = VIA_I2C_BUS2 | VIA_I2C_BUS1;
+        pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2 | VIA_I2C_BUS1;
         DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "Exiting via_analog_init.\n"));
-        return;
+                            "Detected the presence of VGA.\n"));
+        break;
+    }
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaAnalogProbe.\n"));
+}
+
+void
+viaAnalogInit(ScrnInfoPtr pScrn)
+{
+    xf86OutputPtr output;
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    VIAAnalogPtr pVIAAnalog;
+    char outputNameBuffer[32];
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaAnalogInit.\n"));
+
+    if (!pVIADisplay->analogPresence) {
+        goto exit;
     }
 
+    pVIAAnalog = (VIAAnalogPtr) xnfcalloc(1, sizeof(VIAAnalogRec));
+    if (!pVIAAnalog) {
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                            "Failed to allocate storage for "
+                            "analog (VGA).\n"));
+        goto exit;
+     }
+
     /* The code to dynamically designate the output name for
      * xrandr was borrowed from xf86-video-r128 DDX. */
-    sprintf(outputNameBuffer, "VGA-%d", (pVia->numberVGA + 1));
+    sprintf(outputNameBuffer, "VGA-%d", (pVIADisplay->numberVGA + 1));
     output = xf86OutputCreate(pScrn, &via_analog_funcs, outputNameBuffer);
+    if (!output) {
+        free(pVIAAnalog);
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                    "Failed to allocate X Server display output "
+                    "record for analog (VGA).\n");
+        goto exit;
+    }
+
+    /* Increment the number of analog VGA connectors. */
+    pVIADisplay->numberVGA++;
+
+    /* Hint about which I2C bus to access for obtaining EDID. */
+    pVIAAnalog->i2cBus = pVIADisplay->analogI2CBus;
+
+    output->driver_private = pVIAAnalog;
 
     /* While there are two (2) display controllers registered with the
      * X.Org Server, it is often desirable to fix the analog VGA output
@@ -414,16 +599,13 @@ via_analog_init(ScrnInfoPtr pScrn)
      * With this arrangement, DVI should end up getting assigned to IGA2
      * since DVI can go to either display controller without limitations.
      * This should be the case for TV as well. */
-    output->possible_crtcs = (1 << 0);
+    output->possible_crtcs = BIT(1) | BIT(0);
 
     output->possible_clones = 0;
-    output->interlaceAllowed = TRUE;
+    output->interlaceAllowed = FALSE;
     output->doubleScanAllowed = FALSE;
-    pBIOSInfo->analog = output;
-
-    /* Increment the number of analog VGA connectors. */
-    pVia->numberVGA++;
 
+exit:
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting via_analog_init.\n"));
+                        "Exiting viaAnalogInit.\n"));
 }
diff --git a/src/via_ch7xxx.c b/src/via_ch7xxx.c
index 48689a6..20c15b9 100644
--- a/src/via_ch7xxx.c
+++ b/src/via_ch7xxx.c
@@ -40,14 +40,14 @@
 static void
 CH7xxxPrintRegs(ScrnInfoPtr pScrn)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     CARD8 i, buf;
 
     xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Printing registers for %s\n",
-	       pBIOSInfo->TVI2CDev->DevName);
+	       pVIADisplay->TVI2CDev->DevName);
 
-    for (i = 0; i < pBIOSInfo->TVNumRegs; i++) {
-	xf86I2CReadByte(pBIOSInfo->TVI2CDev, i, &buf);
+    for (i = 0; i < pVIADisplay->TVNumRegs; i++) {
+	xf86I2CReadByte(pVIADisplay->TVI2CDev, i, &buf);
 	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV%02X: 0x%02X\n", i, buf);
     }
 
@@ -61,7 +61,7 @@ CH7xxxPrintRegs(ScrnInfoPtr pScrn)
 I2CDevPtr
 ViaCH7xxxDetect(ScrnInfoPtr pScrn, I2CBusPtr pBus, CARD8 Address)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     I2CDevPtr pDev = xf86CreateI2CDevRec();
     CARD8 buf;
 
@@ -86,40 +86,40 @@ ViaCH7xxxDetect(ScrnInfoPtr pScrn, I2CBusPtr pBus, CARD8 Address)
     switch (buf) {
         case 0x17:
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7011 TV Encoder\n");
-            pBIOSInfo->TVEncoder = VIA_CH7011;
+            pVIADisplay->TVEncoder = VIA_CH7011;
             pDev->DevName="CH7011";
             break;
         case 0x19:
             xf86I2CReadByte(pDev, 0x4A, &buf);
             if (buf == 0x81) {
                 xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7019A LVDS Transmitter/TV Encoder\n");
-                pBIOSInfo->TVEncoder = VIA_CH7019A;
+                pVIADisplay->TVEncoder = VIA_CH7019A;
                 pDev->DevName="CH7019A";
             } else {
                 xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7019B LVDS Transmitter/TV Encoder\n");
-                pBIOSInfo->TVEncoder = VIA_CH7019B;
+                pVIADisplay->TVEncoder = VIA_CH7019B;
                 pDev->DevName="CH7019B";
             }
             break;
         case 0x1B:
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7017 LVDS Transmitter\n");
-            pBIOSInfo->TVEncoder = VIA_CH7017;
+            pVIADisplay->TVEncoder = VIA_CH7017;
             pDev->DevName="CH7017";
             break;
         case 0x3A:
             /* single init table --> single channel LVDS transmitter ? */
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7304 LVDS Transmitter\n");
-            pBIOSInfo->TVEncoder = VIA_CH7304;
+            pVIADisplay->TVEncoder = VIA_CH7304;
             pDev->DevName="CH7304";
             break;
         case 0x3B:
             /* dual init table --> dual channel LVDS transmitter ? */
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7305 LVDS Transmitter\n");
-            pBIOSInfo->TVEncoder = VIA_CH7305;
+            pVIADisplay->TVEncoder = VIA_CH7305;
             pDev->DevName="CH7305";
             break;
         default:
-            pBIOSInfo->TVEncoder = VIA_NONETV;
+            pVIADisplay->TVEncoder = VIA_NONETV;
             xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unknown CH7xxx"
                        " device found. [%x:0x1B contains %x]\n",
                        Address, buf);
@@ -140,12 +140,12 @@ static void
 CH7xxxSave(ScrnInfoPtr pScrn)
 {
     int i;
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxSave\n"));
 
-    for (i = 0; i < pBIOSInfo->TVNumRegs; i++)
-        xf86I2CReadByte(pBIOSInfo->TVI2CDev, i, &(pBIOSInfo->TVRegs[i]));
+    for (i = 0; i < pVIADisplay->TVNumRegs; i++)
+        xf86I2CReadByte(pVIADisplay->TVI2CDev, i, &(pVIADisplay->TVRegs[i]));
 }
 
 
@@ -153,12 +153,12 @@ static void
 CH7xxxRestore(ScrnInfoPtr pScrn)
 {
     int i;
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxRestore\n"));
 
-    for (i = 0; i < pBIOSInfo->TVNumRegs; i++)
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, pBIOSInfo->TVRegs[i]);
+    for (i = 0; i < pVIADisplay->TVNumRegs; i++)
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, pVIADisplay->TVRegs[i]);
 }
 
 static CARD8
@@ -201,17 +201,17 @@ CH7xxxDACSenseI2C(I2CDevPtr pDev)
 static Bool
 CH7xxxDACSense(ScrnInfoPtr pScrn)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     CARD8 sense;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxDACDetect\n"));
 
 	/* is this needed? IH */
-    if (!pBIOSInfo->TVI2CDev ||
-        !pBIOSInfo->TVEncoder)
+    if (!pVIADisplay->TVI2CDev ||
+        !pVIADisplay->TVEncoder)
 	    return FALSE;
 
-    sense = CH7xxxDACSenseI2C(pBIOSInfo->TVI2CDev);
+    sense = CH7xxxDACSenseI2C(pVIADisplay->TVI2CDev);
 
     /* I'm sure these case values are correct,
      * but we should get something in any case.
@@ -220,27 +220,27 @@ CH7xxxDACSense(ScrnInfoPtr pScrn)
      */
 	switch (sense) {
 	    case 0x10:
-		pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE;
+		pVIADisplay->TVOutput = TVOUTPUT_COMPOSITE;
 		xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CH7xxx: Composite connected.\n");
 		return TRUE;
 	    case 0x0C:
-		pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO;
+		pVIADisplay->TVOutput = TVOUTPUT_SVIDEO;
 		xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CH7xxx: S-Video connected.\n");
 		return TRUE;
 	    case 0x02:
-		pBIOSInfo->TVOutput = TVOUTPUT_SC;
+		pVIADisplay->TVOutput = TVOUTPUT_SC;
 		xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CHxxx: Composite+S-Video connected.\n");
 		return TRUE;
 	    case 0x04:
-		pBIOSInfo->TVOutput = TVOUTPUT_YCBCR;
+		pVIADisplay->TVOutput = TVOUTPUT_YCBCR;
 		xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CHxxx: YcBcR Connected.\n");
 		return TRUE;
 	    case 0x00:
-		pBIOSInfo->TVOutput = TVOUTPUT_NONE;
+		pVIADisplay->TVOutput = TVOUTPUT_NONE;
 		xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CH7xxx: Nothing connected.\n");
 		return FALSE;
 	    default:
-		pBIOSInfo->TVOutput = TVOUTPUT_NONE;
+		pVIADisplay->TVOutput = TVOUTPUT_NONE;
 		xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "CH7xxx: Unknown cable combination: 0x0%2X.\n",sense);
 		return FALSE;
 	}
@@ -249,14 +249,14 @@ CH7xxxDACSense(ScrnInfoPtr pScrn)
 static CARD8
 CH7011ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     int i;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7011ModeIndex\n"));
     for (i = 0; CH7011Table[i].Width; i++) {
         if ((CH7011Table[i].Width == mode->CrtcHDisplay) &&
             (CH7011Table[i].Height == mode->CrtcVDisplay) &&
-            (CH7011Table[i].Standard == pBIOSInfo->TVType) &&
+            (CH7011Table[i].Standard == pVIADisplay->TVType) &&
             !(strcmp(CH7011Table[i].name, mode->name)))
             return i;
     }
@@ -268,14 +268,14 @@ CH7011ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
 static CARD8
 CH7019ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     int i;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7019ModeIndex\n"));
     for (i = 0; CH7019Table[i].Width; i++) {
         if ((CH7019Table[i].Width == mode->CrtcHDisplay) &&
             (CH7019Table[i].Height == mode->CrtcVDisplay) &&
-            (CH7019Table[i].Standard == pBIOSInfo->TVType) &&
+            (CH7019Table[i].Standard == pVIADisplay->TVType) &&
             !(strcmp(CH7019Table[i].name, mode->name)))
             return i;
     }
@@ -290,7 +290,7 @@ CH7019ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
 static ModeStatus
 CH7xxxModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxModeValid\n"));
 
@@ -301,17 +301,17 @@ CH7xxxModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode)
         return MODE_BAD;
     }
 
-    if ((pBIOSInfo->TVType == TVTYPE_NTSC) &&
+    if ((pVIADisplay->TVType == TVTYPE_NTSC) &&
         (mode->Private != (void *) &CH7xxxModePrivateNTSC)) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is NTSC. This is a PAL mode.\n");
         return MODE_BAD;
-    } else if ((pBIOSInfo->TVType == TVTYPE_PAL) &&
+    } else if ((pVIADisplay->TVType == TVTYPE_PAL) &&
                (mode->Private != (void *) &CH7xxxModePrivatePAL)) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is PAL. This is a NTSC mode.\n");
         return MODE_BAD;
     }
 
-    if (pBIOSInfo->TVEncoder == VIA_CH7011)
+    if (pVIADisplay->TVEncoder == VIA_CH7011)
     {
         if (CH7011ModeIndex(pScrn, mode) != 0xFF)
             return MODE_OK;
@@ -328,14 +328,14 @@ static void
 CH7xxxModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode)
 {
     VIAPtr pVia = VIAPTR(pScrn);
-    VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
 
     CARD8   i, j;
 
     VIABIOSTVMASKTableRec Mask;
     struct CH7xxxTableRec Table;
 
-    if (pBIOSInfo->TVEncoder == VIA_CH7011)
+    if (pVIADisplay->TVEncoder == VIA_CH7011)
     {
         Table = CH7011Table[CH7011ModeIndex(pScrn, mode)];
         Mask = ch7011MaskTable;
@@ -348,19 +348,19 @@ CH7xxxModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode)
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7011ModeI2C\n"));
 
-    xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x3E);
-    xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1E, 0xD0);
+    xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x49, 0x3E);
+    xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1E, 0xD0);
 
     for (i = 0,j = 0; (j < Mask.numTV) && (i < VIA_BIOS_TABLE_NUM_TV_REG); i++) {
         if (Mask.TV[i] == 0xFF) {
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, Table.TV[i]);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, Table.TV[i]);
             j++;
         } else {
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, pBIOSInfo->TVRegs[i]);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, pVIADisplay->TVRegs[i]);
         }
     }
 
-    if ((pBIOSInfo->TVType == TVTYPE_NTSC) && pBIOSInfo->TVDotCrawl) {
+    if ((pVIADisplay->TVType == TVTYPE_NTSC) && pVIADisplay->TVDotCrawl) {
         CARD16 *DotCrawl = Table.DotCrawlNTSC;
         CARD8 address, save;
 
@@ -368,25 +368,25 @@ CH7xxxModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode)
             address = (CARD8)(DotCrawl[i] & 0xFF);
 
             save = (CARD8)(DotCrawl[i] >> 8);
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, address, save);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, address, save);
         }
     }
 
     /*
      * Only Composite and SVideo have been tested.
      */
-    switch(pBIOSInfo->TVOutput){
+    switch(pVIADisplay->TVOutput){
         case TVOUTPUT_COMPOSITE:
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x2E);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x49, 0x2E);
             break;
         case TVOUTPUT_SVIDEO:
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x32);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x49, 0x32);
             break;
         case TVOUTPUT_SC:
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x3C);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x49, 0x3C);
             break;
         case TVOUTPUT_YCBCR:
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x3A);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x49, 0x3A);
             break;
         default:
             break;
@@ -395,7 +395,7 @@ CH7xxxModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode)
     if (pVia->IsSecondary) { /* Patch as setting 2nd path */
         j = (CARD8)(Mask.misc2 >> 5);
         for (i = 0; i < j; i++)
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, Table.Patch2[i] & 0xFF, Table.Patch2[i] >> 8);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, Table.Patch2[i] & 0xFF, Table.Patch2[i] >> 8);
     }
 }
 
@@ -405,14 +405,14 @@ CH7xxxModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode)
 	ScrnInfoPtr pScrn = crtc->scrn;
 	vgaHWPtr hwp = VGAHWPTR(pScrn);
 	VIAPtr pVia =  VIAPTR(pScrn);
-	VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+	VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
 	CARD8  *CRTC, *Misc;
 	int  i, j;
 
     VIABIOSTVMASKTableRec Mask;
     struct CH7xxxTableRec Table;
 
-    if (pBIOSInfo->TVEncoder == VIA_CH7011)
+    if (pVIADisplay->TVEncoder == VIA_CH7011)
     {
         Table = CH7011Table[CH7011ModeIndex(pScrn, mode)];
         Mask = ch7011MaskTable;
@@ -449,7 +449,7 @@ CH7xxxModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode)
         }
 
         if (Mask.misc2 & 0x18) {
-            pBIOSInfo->Clock = (Misc[3] << 8) & Misc[4];
+            pVIADisplay->Clock = (Misc[3] << 8) & Misc[4];
             /* VIASetUseExternalClock(hwp); */
         }
 
@@ -488,9 +488,9 @@ CH7xxxModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode)
             /* CLE266Ax use 2x XCLK */
             if ((pVia->Chipset == VIA_CLE266) &&
                 CLE266_REV_IS_AX(pVia->ChipRev))
-                pBIOSInfo->Clock = 0x471C;
+                pVIADisplay->Clock = 0x471C;
             else
-                pBIOSInfo->Clock = (Misc[4] << 8) | Misc[5];
+                pVIADisplay->Clock = (Misc[4] << 8) | Misc[5];
         }
 
         ViaCrtcMask(hwp, 0x6A, 0x40, 0x40);
@@ -508,22 +508,22 @@ CH7xxxModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode)
 static void
 CH7xxxTVPower(ScrnInfoPtr pScrn, Bool On)
 {
-	VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+	VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
 	if (On){
 		DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxTVPower: On\n"));
-		xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x20);
+		xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x49, 0x20);
 	}else{
 		DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxTVPower: Off\n"));
-		xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x3E);
-		xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1E, 0xD0);
+		xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x49, 0x3E);
+		xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1E, 0xD0);
     }
 }
 
 static void
 CH7019LCDPower(ScrnInfoPtr pScrn, Bool On)
 {
-	VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+	VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 	CARD8 W_Buffer[2], R_Buffer[1];
 	int i;
 
@@ -531,45 +531,45 @@ CH7019LCDPower(ScrnInfoPtr pScrn, Bool On)
 		DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxLCDPower: On\n"));
 		W_Buffer[0] = 0x63;
 		W_Buffer[1] = 0x4B;
-		xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+		xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0);
 		W_Buffer[0] = 0x66;
 		W_Buffer[1] = 0x20;
-		xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+		xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0);
 
 		for (i = 0; i < 10; i++) {
 			W_Buffer[0] = 0x63;
-			xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, R_Buffer,1);
+			xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,1, R_Buffer,1);
 			usleep(100);
 			W_Buffer[0] = 0x63;
 			W_Buffer[1] = (R_Buffer[0] | 0x40);
-			xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+			xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0);
 			DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                              "CH7xxxLCDPower: [%d]write 0x63 = %X!\n", i+1, W_Buffer[1]));
 			usleep(1);
 			W_Buffer[0] = 0x63;
 			W_Buffer[1] &= ~0x40;
-			xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+			xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0);
 			DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                              "CH7xxxLCDPower: [%d]write 0x63 = %X!\n", i+1, W_Buffer[1]));
 			usleep(100);
 			W_Buffer[0] = 0x66;
-			xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, R_Buffer,1);
+			xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,1, R_Buffer,1);
 
 			if (((R_Buffer[0] & 0x44) == 0x44) || (i >= 9)) {
 				/* PLL lock OK, Turn on VDD */
 				usleep(500);
 				W_Buffer[1] = R_Buffer[0] | 0x01;
-				xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+				xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0);
 				DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
 						 "CH7xxxLCDPower: CH7019 PLL lock ok!\n"));
 				/* reset data path */
 				W_Buffer[0] = 0x48;
-				xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, R_Buffer,1);
+				xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,1, R_Buffer,1);
 				W_Buffer[1] = R_Buffer[0] & ~0x08;
-				xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+				xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0);
 				usleep(1);
 				W_Buffer[1] = R_Buffer[0];
-				xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+				xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0);
 				break;
 			}
 
@@ -582,15 +582,15 @@ CH7019LCDPower(ScrnInfoPtr pScrn, Bool On)
 		DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxLCDPower: Off\n"));
 		/* Turn off VDD (Turn off backlignt only) */
 		W_Buffer[0] = 0x66;
-		xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, R_Buffer,1);
+		xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,1, R_Buffer,1);
 		W_Buffer[1] &= ~0x01;
-		xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+		xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0);
 		usleep(100);
 		/* Turn off LVDS path */
 		W_Buffer[0] = 0x63;
-		xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, R_Buffer,1);
+		xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,1, R_Buffer,1);
 		W_Buffer[1] = (R_Buffer[0] | 0x40);
-		xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+		xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0);
 	}
 }
 
@@ -600,42 +600,42 @@ CH7019LCDPower(ScrnInfoPtr pScrn, Bool On)
 void
 ViaCH7xxxInit(ScrnInfoPtr pScrn)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaCH7xxxInit\n"));
 
-    switch (pBIOSInfo->TVEncoder) {
+    switch (pVIADisplay->TVEncoder) {
         case VIA_CH7011:
-            pBIOSInfo->TVSave = CH7xxxSave;
-            pBIOSInfo->TVRestore = CH7xxxRestore;
-            pBIOSInfo->TVDACSense = CH7xxxDACSense;
-            pBIOSInfo->TVModeValid = CH7xxxModeValid;
-            pBIOSInfo->TVModeI2C = CH7xxxModeI2C;
-            pBIOSInfo->TVModeCrtc = CH7xxxModeCrtc;
-            pBIOSInfo->TVPower = CH7xxxTVPower;
-            pBIOSInfo->TVModes = CH7011Modes;
-            pBIOSInfo->TVNumModes = sizeof(CH7011Modes) / sizeof(DisplayModeRec);
-            pBIOSInfo->LCDPower = NULL;
-            pBIOSInfo->TVNumRegs = CH_7011_MAX_NUM_REG;
+            pVIADisplay->TVSave = CH7xxxSave;
+            pVIADisplay->TVRestore = CH7xxxRestore;
+            pVIADisplay->TVDACSense = CH7xxxDACSense;
+            pVIADisplay->TVModeValid = CH7xxxModeValid;
+            pVIADisplay->TVModeI2C = CH7xxxModeI2C;
+            pVIADisplay->TVModeCrtc = CH7xxxModeCrtc;
+            pVIADisplay->TVPower = CH7xxxTVPower;
+            pVIADisplay->TVModes = CH7011Modes;
+            pVIADisplay->TVNumModes = sizeof(CH7011Modes) / sizeof(DisplayModeRec);
+            pVIADisplay->LCDPower = NULL;
+            pVIADisplay->TVNumRegs = CH_7011_MAX_NUM_REG;
 #ifdef HAVE_DEBUG
-            pBIOSInfo->TVPrintRegs = CH7xxxPrintRegs;
+            pVIADisplay->TVPrintRegs = CH7xxxPrintRegs;
 #endif
             break;
         case VIA_CH7019A:
         case VIA_CH7019B:
-            pBIOSInfo->TVDACSense = CH7xxxDACSense;
-            pBIOSInfo->TVSave = CH7xxxSave;
-            pBIOSInfo->TVRestore = CH7xxxRestore;
-            pBIOSInfo->TVModeValid = CH7xxxModeValid;
-            pBIOSInfo->TVModeI2C = CH7xxxModeI2C;
-            pBIOSInfo->TVModeCrtc = CH7xxxModeCrtc;
-            pBIOSInfo->TVPower = CH7xxxTVPower;
-            pBIOSInfo->TVModes = CH7019Modes;
-            pBIOSInfo->TVNumModes = sizeof(CH7019Modes) / sizeof(DisplayModeRec);
-            pBIOSInfo->LCDPower = CH7019LCDPower;
-            pBIOSInfo->TVNumRegs = CH_7019_MAX_NUM_REG;
+            pVIADisplay->TVDACSense = CH7xxxDACSense;
+            pVIADisplay->TVSave = CH7xxxSave;
+            pVIADisplay->TVRestore = CH7xxxRestore;
+            pVIADisplay->TVModeValid = CH7xxxModeValid;
+            pVIADisplay->TVModeI2C = CH7xxxModeI2C;
+            pVIADisplay->TVModeCrtc = CH7xxxModeCrtc;
+            pVIADisplay->TVPower = CH7xxxTVPower;
+            pVIADisplay->TVModes = CH7019Modes;
+            pVIADisplay->TVNumModes = sizeof(CH7019Modes) / sizeof(DisplayModeRec);
+            pVIADisplay->LCDPower = CH7019LCDPower;
+            pVIADisplay->TVNumRegs = CH_7019_MAX_NUM_REG;
 #ifdef HAVE_DEBUG
-            pBIOSInfo->TVPrintRegs = CH7xxxPrintRegs;
+            pVIADisplay->TVPrintRegs = CH7xxxPrintRegs;
 #endif
             break;
         default:
@@ -644,6 +644,6 @@ ViaCH7xxxInit(ScrnInfoPtr pScrn)
     }
 
     /* Save before continuing */
-    if (pBIOSInfo->TVSave)
-        pBIOSInfo->TVSave(pScrn);
+    if (pVIADisplay->TVSave)
+        pVIADisplay->TVSave(pScrn);
 }
diff --git a/src/via_ch7xxx.h b/src/via_ch7xxx.h
index f54ac5e..11da93d 100644
--- a/src/via_ch7xxx.h
+++ b/src/via_ch7xxx.h
@@ -116,7 +116,7 @@ typedef struct _VIATVMASKTABLE {
 } VIABIOSTVMASKTableRec, *VIABIOSTVMASKTablePtr;
 
 struct CH7xxxTableRec {
-    char*   name;
+    const char* name;
     CARD16  Width;
     CARD16  Height;
     int     Standard;
diff --git a/src/via_display.c b/src/via_display.c
index 141ce03..696251f 100644
--- a/src/via_display.c
+++ b/src/via_display.c
@@ -86,73 +86,6 @@ ViaPrintMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
 
 }
 
-/*
- * Sets IGA1 or IGA2 for palette LUT access.
- * This function should be called before changing the
- * contents of the palette.
- */
-static void
-viaSetPaletteLUTAccess(ScrnInfoPtr pScrn, CARD8 displaySource)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaSetPaletteLUTAccess.\n"));
-
-    ViaSeqMask(hwp, 0x1A, displaySource, 0x01);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "Palette LUT Access: IGA%d\n",
-                (displaySource & 0x01) + 1);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaSetPaletteLUTAccess.\n"));
-}
-
-/*
- * Resets IGA1 hardware.
- */
-static void
-viaIGA1HWReset(ScrnInfoPtr pScrn, CARD8 resetState)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaIGA1HWReset.\n"));
-
-    /* 3X5.17[7] - IGA1 HW Reset
-     *             0: Reset
-     *             1: Normal Operation */
-    ViaCrtcMask(hwp, 0x17, resetState << 7, 0x80);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "IGA1 HW Reset: %s\n",
-                (resetState & 0x01) ? "Off" : "On");
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaIGA1HWReset.\n"));
-}
-
-/*
- * Controls IGA1 DPMS State.
- */
-static void
-viaIGA1DPMSControl(ScrnInfoPtr pScrn, CARD8 dpmsControl)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaIGA1DPMSControl.\n"));
-
-    /* 3X5.36[5:4] - DPMS Control
-     *               00: On
-     *               01: Stand-by
-     *               10: Suspend
-     *               11: Off */
-    ViaCrtcMask(hwp, 0x36, dpmsControl << 4, 0x30);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaIGA1DPMSControl.\n"));
-}
-
 /*
  * Sets IGA1 color depth.
  */
@@ -206,30 +139,6 @@ viaIGA1SetColorDepth(ScrnInfoPtr pScrn, CARD8 bitsPerPixel)
                         "Exiting viaIGA1SetColorDepth.\n"));
 }
 
-/*
- * Sets IGA1 palette LUT resolution. (6-bit or 8-bit)
- */
-static void
-viaIGA1SetPaletteLUTResolution(ScrnInfoPtr pScrn, CARD8 paletteLUT)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaIGA1SetPaletteLUTResolution.\n"));
-
-    /* Set the palette LUT resolution for IGA1. */
-    /* 3C5.15[7] - IGA1 6 / 8 Bit LUT
-     *             0: 6-bit
-     *             1: 8-bit */
-    ViaSeqMask(hwp, 0x15, paletteLUT << 7, 0x80);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "IGA1 Palette LUT Resolution: %s bit\n",
-                (paletteLUT & 0x01) ? "8" : "6");
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaIGA1SetPaletteLUTResolution.\n"));
-}
-
 /*
  * Controls IGA1 gamma correction state.
  */
@@ -272,7 +181,6 @@ viaIGA1InitHI(ScrnInfoPtr pScrn)
     VIAPtr pVia = VIAPTR(pScrn);
 
     switch(pVia->Chipset) {
-    case VIA_PM800:
     case VIA_CX700:
     case VIA_P4M890:
     case VIA_P4M900:
@@ -307,7 +215,6 @@ viaIGA1SetHIStartingAddress(xf86CrtcPtr crtc)
     VIAPtr pVia = VIAPTR(pScrn);
 
     switch(pVia->Chipset) {
-    case VIA_PM800:
     case VIA_CX700:
     case VIA_P4M890:
     case VIA_P4M900:
@@ -333,7 +240,6 @@ viaIGA1DisplayHI(ScrnInfoPtr pScrn, Bool HI_Status)
     CARD32 temp;
 
     switch(pVia->Chipset) {
-    case VIA_PM800:
     case VIA_CX700:
     case VIA_P4M890:
     case VIA_P4M900:
@@ -366,7 +272,6 @@ viaIGA1SetHIDisplayLocation(ScrnInfoPtr pScrn,
     VIAPtr pVia = VIAPTR(pScrn);
 
     switch(pVia->Chipset) {
-    case VIA_PM800:
     case VIA_CX700:
     case VIA_P4M890:
     case VIA_P4M900:
@@ -406,29 +311,6 @@ viaIGA2HWReset(ScrnInfoPtr pScrn, CARD8 resetState)
                         "Exiting viaIGA2HWReset.\n"));
 }
 
-/*
- * Controls IGA2 display output on or off state.
- */
-static void
-viaIGA2DisplayOutput(ScrnInfoPtr pScrn, Bool outputState)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaIGA2DisplayOutput.\n"));
-
-    /* 3X5.6B[2] - IGA2 Screen Off
-     *             0: Screen on
-     *             1: Screen off */
-    ViaCrtcMask(hwp, 0x6B, outputState ? 0x00 : 0x04, 0x04);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "IGA2 Display Output: %s\n",
-                outputState ? "On" : "Off");
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaIGA2DisplayOutput.\n"));
-}
-
 /*
  * Controls IGA2 display channel state.
  */
@@ -501,30 +383,6 @@ viaIGA2SetColorDepth(ScrnInfoPtr pScrn, CARD8 bitsPerPixel)
                         "Exiting viaIGA2SetColorDepth.\n"));
 }
 
-/*
- * Sets IGA2 palette LUT resolution. (6-bit or 8-bit)
- */
-static void
-viaIGA2SetPaletteLUTResolution(ScrnInfoPtr pScrn, CARD8 paletteLUT)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaIGA2SetPaletteLUTResolution.\n"));
-
-    /* Set the palette LUT resolution for IGA2. */
-    /* 3X5.6A[5] - IGA2 6 / 8 Bit LUT
-     *             0: 6-bit
-     *             1: 8-bit */
-    ViaCrtcMask(hwp, 0x6A, paletteLUT << 5, 0x20);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "IGA2 Palette LUT Resolution: %s bit\n",
-                (paletteLUT & 0x01) ? "8" : "6");
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaIGA2SetPaletteLUTResolution.\n"));
-}
-
 /*
  * Controls IGA2 gamma correction state.
  */
@@ -554,7 +412,6 @@ viaIGA2InitHI(ScrnInfoPtr pScrn)
     VIAPtr pVia = VIAPTR(pScrn);
 
     switch(pVia->Chipset) {
-    case VIA_PM800:
     case VIA_CX700:
     case VIA_P4M890:
     case VIA_P4M900:
@@ -597,7 +454,6 @@ viaIGA2DisplayHI(ScrnInfoPtr pScrn, Bool HI_Status)
     CARD32 temp;
 
     switch(pVia->Chipset) {
-    case VIA_PM800:
     case VIA_CX700:
     case VIA_P4M890:
     case VIA_P4M900:
@@ -630,7 +486,6 @@ viaIGA2SetHIDisplayLocation(ScrnInfoPtr pScrn,
     VIAPtr pVia = VIAPTR(pScrn);
 
     switch(pVia->Chipset) {
-    case VIA_PM800:
     case VIA_CX700:
     case VIA_P4M890:
     case VIA_P4M900:
@@ -647,48 +502,7 @@ viaIGA2SetHIDisplayLocation(ScrnInfoPtr pScrn,
     }
 }
 
-/*
- * Initial settings for displays.
- */
-void
-viaDisplayInit(ScrnInfoPtr pScrn)
-{
-    VIAPtr pVia = VIAPTR(pScrn);
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDisplayInit.\n"));
-
-    ViaCrtcMask(hwp, 0x6A, 0x00, 0x3D);
-    hwp->writeCrtc(hwp, 0x6B, 0x00);
-    hwp->writeCrtc(hwp, 0x6C, 0x00);
-    hwp->writeCrtc(hwp, 0x79, 0x00);
-
-    /* (IGA1 Timing Plus 2, added in VT3259 A3 or later) */
-    if (pVia->Chipset != VIA_CLE266 && pVia->Chipset != VIA_KM400)
-        ViaCrtcMask(hwp, 0x47, 0x00, 0xC8);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDisplayInit.\n"));
-}
-
-/*
- * Sets the primary or secondary display stream on internal TMDS.
- */
-void
-ViaDisplaySetStreamOnDFP(ScrnInfoPtr pScrn, Bool primary)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDisplaySetStreamOnDFP\n"));
-
-    if (primary)
-        ViaCrtcMask(hwp, 0x99, 0x00, 0x10);
-    else
-        ViaCrtcMask(hwp, 0x99, 0x10, 0x10);
-}
-
-void
+static void
 VIALoadRgbLut(ScrnInfoPtr pScrn, int start, int numColors, LOCO *colors)
 {
     vgaHWPtr hwp = VGAHWPTR(pScrn);
@@ -773,10 +587,9 @@ viaIGAInitCommon(ScrnInfoPtr pScrn)
 {
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    CARD8 i;
-#ifdef HAVE_DEBUG
-    CARD8 temp;
-#endif
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    VIARegPtr Regs = &pVIADisplay->SavedReg;
+    CARD8 i, temp;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaIGAInitCommon.\n"));
@@ -789,7 +602,7 @@ viaIGAInitCommon(ScrnInfoPtr pScrn)
     temp = hwp->readMiscOut(hwp);
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Misc. Register: 0x%02X\n", temp));
-    hwp->writeMiscOut(hwp, temp | 0x22);
+    hwp->writeMiscOut(hwp, temp | 0x23);
 
     temp = hwp->readEnable(hwp);
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -922,6 +735,13 @@ viaIGAInitCommon(ScrnInfoPtr pScrn)
     temp = hwp->readCrtc(hwp, 0x3F);
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "CR3F: 0x%02X\n", temp));
+
+    if (pVia->Chipset == VIA_VX900) {
+        temp = hwp->readCrtc(hwp, 0x45);
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                            "CR45: 0x%02X\n", temp));
+    }
+
     temp = hwp->readCrtc(hwp, 0x47);
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "CR47: 0x%02X\n", temp));
@@ -1089,6 +909,25 @@ viaIGAInitCommon(ScrnInfoPtr pScrn)
      *               11: Clock on/off according to each engine IDLE status */
     ViaSeqMask(hwp, 0x3F, 0xFF, 0xFF);
 
+    /*
+     * Initialize frame buffer size and GTI for VX800, VX855, and
+     * VX900 chipsets. This code is really necessary for standby
+     * resume to work properly on VIA Embedded EPIA-M830 mainboard.
+     */
+    if ((pVia->Chipset == VIA_VX800) ||
+        (pVia->Chipset == VIA_VX855) ||
+        (pVia->Chipset == VIA_VX900)) {
+        hwp->writeSeq(hwp, 0x14, Regs->SR[0x14]);
+        hwp->writeSeq(hwp, 0x68, Regs->SR[0x68]);
+        hwp->writeSeq(hwp, 0x69, Regs->SR[0x69]);
+        hwp->writeSeq(hwp, 0x6A, Regs->SR[0x6A]);
+        hwp->writeSeq(hwp, 0x6B, Regs->SR[0x6B]);
+        hwp->writeSeq(hwp, 0x6C, Regs->SR[0x6C]);
+        hwp->writeSeq(hwp, 0x6D, Regs->SR[0x6D]);
+        hwp->writeSeq(hwp, 0x6E, Regs->SR[0x6E]);
+        hwp->writeSeq(hwp, 0x6F, Regs->SR[0x6F]);
+    }
+
     /* 3X5.36[7]   - DPMS VSYNC Output
      * 3X5.36[6]   - DPMS HSYNC Output
      * 3X5.36[5:4] - DPMS Control
@@ -1105,12 +944,16 @@ viaIGAInitCommon(ScrnInfoPtr pScrn)
      *               1: Enable */
     ViaCrtcMask(hwp, 0x36, 0x01, 0x01);
 
+    if (pVia->Chipset == VIA_VX900) {
+        ViaCrtcMask(hwp, 0x45, 0x00, 0x01);
+    }
+
     /* 3X5.3B through 3X5.3F are scratch pad registers. */
-    ViaCrtcMask(hwp, 0x3B, pVia->originalCR3B, 0xFF);
-    ViaCrtcMask(hwp, 0x3C, pVia->originalCR3C, 0xFF);
-    ViaCrtcMask(hwp, 0x3D, pVia->originalCR3D, 0xFF);
-    ViaCrtcMask(hwp, 0x3E, pVia->originalCR3E, 0xFF);
-    ViaCrtcMask(hwp, 0x3F, pVia->originalCR3F, 0xFF);
+    ViaCrtcMask(hwp, 0x3B, Regs->CR[0x3B], 0xFF);
+    ViaCrtcMask(hwp, 0x3C, Regs->CR[0x3C], 0xFF);
+    ViaCrtcMask(hwp, 0x3D, Regs->CR[0x3D], 0xFF);
+    ViaCrtcMask(hwp, 0x3E, Regs->CR[0x3E], 0xFF);
+    ViaCrtcMask(hwp, 0x3F, Regs->CR[0x3F], 0xFF);
 
     /* 3X5.47[5] - Peep at the PCI-bus
      *             0: Disable
@@ -1146,6 +989,9 @@ viaIGAInitCommon(ScrnInfoPtr pScrn)
         ViaCrtcMask(hwp, 0x6C, 0x00, 0x01);
     }
 
+    /* Disable display scaling. */
+    viaSetDisplayScaling(pScrn, FALSE);
+
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting viaIGAInitCommon.\n"));
 }
@@ -1343,8 +1189,10 @@ viaIGA1SetFBStartingAddress(xf86CrtcPtr crtc, int x, int y)
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
     drmmode_ptr drmmode = drmmode_crtc->drmmode;
-    CARD32 Base;
+    unsigned long Base;
+#ifdef HAVE_DEBUG
     CARD8 cr0c, cr0d, cr34, cr48;
+#endif
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaIGA1SetFBStartingAddress.\n"));
@@ -1370,23 +1218,19 @@ viaIGA1SetFBStartingAddress(xf86CrtcPtr crtc, int x, int y)
 
 #ifdef HAVE_DEBUG
     cr0d = hwp->readCrtc(hwp, 0x0D);
-    cr0c = hwp->readCrtc(hwp, 0x0C);
-    cr34 = hwp->readCrtc(hwp, 0x34);
-    if (!(pVia->Chipset == VIA_CLE266 && CLE266_REV_IS_AX(pVia->ChipRev))) {
-        cr48 = hwp->readCrtc(hwp, 0x48);
-    }
-
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "CR0D: 0x%02X\n", cr0d));
+    cr0c = hwp->readCrtc(hwp, 0x0C);
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "CR0C: 0x%02X\n", cr0c));
+    cr34 = hwp->readCrtc(hwp, 0x34);
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "CR34: 0x%02X\n", cr34));
     if (!(pVia->Chipset == VIA_CLE266 && CLE266_REV_IS_AX(pVia->ChipRev))) {
+        cr48 = hwp->readCrtc(hwp, 0x48);
         DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                             "CR48: 0x%02X\n", cr48));
     }
-
 #endif
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -1996,288 +1840,45 @@ ViaSetPrimaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode)
             hwp->writeSeq(hwp, 0x16, 0x90); /* 320/4   = 80   = 0x50 */
             /* Formula for {SR18,0,5},{SR18,7,7} is: (0x50 & 0x3F) | ((0x50 & 0x40) << 1) = 0x90 */
             hwp->writeSeq(hwp, 0x18, 0x90); /* 320/4   = 80   = 0x50 */
-            hwp->writeSeq(hwp, 0x22, 0x28); /* 160/4   = 40   = 0x28 */
-            break;
-        case VIA_VX900:
-            hwp->writeSeq(hwp, 0x17, 0xC7); /* 400/2-1 = 199  = 0xC7 */
-            /* Formula for {SR16,0,5},{SR16,7,7} is: (0x50 & 0x3F) | ((0x50 & 0x40) << 1) = 0x90 */
-            hwp->writeSeq(hwp, 0x16, 0x90); /* 320/4   = 80   = 0x50 */
-            /* Formula for {SR18,0,5},{SR18,7,7} is: (0x50 & 0x3F) | ((0x50 & 0x40) << 1) = 0x90 */
-            hwp->writeSeq(hwp, 0x18, 0x90); /* 320/4   = 80   = 0x50 */
-            hwp->writeSeq(hwp, 0x22, 0x28); /* 160/4   = 40   = 0x28 */
-            break;
-        default:
-            xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaSetPrimaryFIFO: "
-                       "Chipset %d not implemented\n", pVia->Chipset);
-            break;
-    }
-}
-
-/*
- * Turn off the primary FIFO only for CLE266A.
- */
-static void
-ViaDisablePrimaryFIFO(ScrnInfoPtr pScrn)
-{
-    VIAPtr pVia = VIAPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDisablePrimaryFIFO\n"));
-
-    /* Needed because exiting from X-Window will dump back register values.
-     * Other chipsets have no need to set extended FIFO values. */
-    if ((pVia->Chipset == VIA_CLE266) && CLE266_REV_IS_AX(pVia->ChipRev) &&
-        ((pScrn->currentMode->HDisplay > 1024) || pVia->HasSecondary))
-        ViaSetCLE266APrimaryFIFO(pScrn, FALSE);
-}
-
-void
-viaIGA1Save(ScrnInfoPtr pScrn)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    VIAPtr pVia = VIAPTR(pScrn);
-    VIARegPtr Regs = &pVia->SavedReg;
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaIGA1Save.\n"));
-
-    vgaHWProtect(pScrn, TRUE);
-
-    vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_ALL);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Saving sequencer registers.\n"));
-
-    /* Unlock extended registers. */
-    hwp->writeSeq(hwp, 0x10, 0x01);
-
-    Regs->SR[0x14] = hwp->readSeq(hwp, 0x14);
-    Regs->SR[0x15] = hwp->readSeq(hwp, 0x15);
-    Regs->SR[0x16] = hwp->readSeq(hwp, 0x16);
-    Regs->SR[0x17] = hwp->readSeq(hwp, 0x17);
-    Regs->SR[0x18] = hwp->readSeq(hwp, 0x18);
-    Regs->SR[0x19] = hwp->readSeq(hwp, 0x19);
-
-    /* PCI Bus Control */
-    Regs->SR[0x1A] = hwp->readSeq(hwp, 0x1A);
-
-    Regs->SR[0x1B] = hwp->readSeq(hwp, 0x1B);
-    Regs->SR[0x1C] = hwp->readSeq(hwp, 0x1C);
-    Regs->SR[0x1D] = hwp->readSeq(hwp, 0x1D);
-    Regs->SR[0x1E] = hwp->readSeq(hwp, 0x1E);
-    Regs->SR[0x1F] = hwp->readSeq(hwp, 0x1F);
-
-    Regs->SR[0x20] = hwp->readSeq(hwp, 0x20);
-    Regs->SR[0x21] = hwp->readSeq(hwp, 0x21);
-    Regs->SR[0x22] = hwp->readSeq(hwp, 0x22);
-
-    /* Registers 3C5.23 through 3C5.25 are not used by Chrome9.
-     * Registers 3C5.27 through 3C5.29 are not used by Chrome9. */
-    switch (pVia->Chipset) {
-    case VIA_CLE266:
-    case VIA_KM400:
-    case VIA_PM800:
-    case VIA_K8M800:
-    case VIA_P4M800PRO:
-    case VIA_CX700:
-    case VIA_P4M890:
-        Regs->SR[0x23] = hwp->readSeq(hwp, 0x23);
-        Regs->SR[0x24] = hwp->readSeq(hwp, 0x24);
-        Regs->SR[0x25] = hwp->readSeq(hwp, 0x25);
-
-        Regs->SR[0x27] = hwp->readSeq(hwp, 0x27);
-        Regs->SR[0x28] = hwp->readSeq(hwp, 0x28);
-        Regs->SR[0x29] = hwp->readSeq(hwp, 0x29);
-        break;
-    default:
-        break;
-    }
-
-    Regs->SR[0x26] = hwp->readSeq(hwp, 0x26);
-
-    Regs->SR[0x2A] = hwp->readSeq(hwp, 0x2A);
-    Regs->SR[0x2B] = hwp->readSeq(hwp, 0x2B);
-    Regs->SR[0x2D] = hwp->readSeq(hwp, 0x2D);
-    Regs->SR[0x2E] = hwp->readSeq(hwp, 0x2E);
-
-    /* Save PCI Configuration Memory Base Shadow 0 and 1.
-     * These registers are available only in UniChrome, UniChrome Pro,
-     * and UniChrome Pro II. */
-    switch (pVia->Chipset) {
-    case VIA_CLE266:
-    case VIA_KM400:
-    case VIA_PM800:
-    case VIA_K8M800:
-    case VIA_P4M800PRO:
-    case VIA_CX700:
-    case VIA_P4M890:
-        Regs->SR[0x2F] = hwp->readSeq(hwp, 0x2F);
-        Regs->SR[0x30] = hwp->readSeq(hwp, 0x30);
-        break;
-    default:
-        break;
-    }
-
-    /* Save PLL settings and several miscellaneous registers.
-     * For UniChrome, register 3C5.44 through 3C5.4B are saved.
-     * For UniChrome Pro and Chrome9, register 3C5.44 through 3C5.4C
-     * are saved. */
-    Regs->SR[0x44] = hwp->readSeq(hwp, 0x44);
-    Regs->SR[0x45] = hwp->readSeq(hwp, 0x45);
-    Regs->SR[0x46] = hwp->readSeq(hwp, 0x46);
-    Regs->SR[0x47] = hwp->readSeq(hwp, 0x47);
-    Regs->SR[0x48] = hwp->readSeq(hwp, 0x48);
-    Regs->SR[0x49] = hwp->readSeq(hwp, 0x49);
-    Regs->SR[0x4A] = hwp->readSeq(hwp, 0x4A);
-    Regs->SR[0x4B] = hwp->readSeq(hwp, 0x4B);
-
-    switch (pVia->Chipset) {
-    case VIA_PM800:
-    case VIA_K8M800:
-    case VIA_P4M800PRO:
-    case VIA_CX700:
-    case VIA_P4M890:
-    case VIA_K8M890:
-    case VIA_P4M900:
-    case VIA_VX800:
-    case VIA_VX855:
-    case VIA_VX900:
-        Regs->SR[0x4C] = hwp->readSeq(hwp, 0x4C);
-
-        /* Save register 3C5.4D.
-         * According to CX700 / VX700 (UniChrome Pro II) Open Graphics
-         * Programming Manual Part I: Graphics Core / 2D,
-         * this register is called Dual Channel Memory Control.
-         * According to VX800 / VX855 / VX900 (Chrome9 HC3 / HCM / HD)
-         * Open Graphics Programming Manual Part I: Graphics Core / 2D,
-         * this register is called Preemptive Arbiter Control.
-         * It is likely that this register is also supported in UniChrome Pro. */
-        Regs->SR[0x4D] = hwp->readSeq(hwp, 0x4D);
-
-        Regs->SR[0x4E] = hwp->readSeq(hwp, 0x4E);
-        Regs->SR[0x4F] = hwp->readSeq(hwp, 0x4F);
-        break;
-    default:
-        break;
-    }
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Finished saving sequencer registers.\n"));
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Saving IGA1 registers.\n"));
-
-    /* UniChrome Pro or later */
-    switch (pVia->Chipset) {
-    case VIA_PM800:
-    case VIA_K8M800:
-    case VIA_P4M800PRO:
-    case VIA_CX700:
-    case VIA_P4M890:
-    case VIA_K8M890:
-    case VIA_P4M900:
-    case VIA_VX800:
-    case VIA_VX855:
-    case VIA_VX900:
-        /* Display Fetch Blocking Control */
-        Regs->CR[0x30] = hwp->readCrtc(hwp, 0x30);
-
-        /* Half Line Position */
-        Regs->CR[0x31] = hwp->readCrtc(hwp, 0x31);
-        break;
-    default:
-        break;
-    }
-
-    Regs->CR[0x32] = hwp->readCrtc(hwp, 0x32);
-    Regs->CR[0x33] = hwp->readCrtc(hwp, 0x33);
-    Regs->CR[0x35] = hwp->readCrtc(hwp, 0x35);
-    Regs->CR[0x36] = hwp->readCrtc(hwp, 0x36);
-
-    /* UniChrome Pro or later */
-    switch (pVia->Chipset) {
-    case VIA_PM800:
-    case VIA_K8M800:
-    case VIA_P4M800PRO:
-    case VIA_CX700:
-    case VIA_P4M890:
-    case VIA_K8M890:
-    case VIA_P4M900:
-    case VIA_VX800:
-    case VIA_VX855:
-    case VIA_VX900:
-        /* DAC Control Register */
-        Regs->CR[0x37] = hwp->readCrtc(hwp, 0x37);
-        break;
-    default:
-        break;
-    }
-
-    Regs->CR[0x38] = hwp->readCrtc(hwp, 0x38);
-    Regs->CR[0x39] = hwp->readCrtc(hwp, 0x39);
-    Regs->CR[0x3A] = hwp->readCrtc(hwp, 0x3A);
-    Regs->CR[0x3B] = hwp->readCrtc(hwp, 0x3B);
-    Regs->CR[0x3C] = hwp->readCrtc(hwp, 0x3C);
-    Regs->CR[0x3D] = hwp->readCrtc(hwp, 0x3D);
-    Regs->CR[0x3E] = hwp->readCrtc(hwp, 0x3E);
-    Regs->CR[0x3F] = hwp->readCrtc(hwp, 0x3F);
-
-    Regs->CR[0x40] = hwp->readCrtc(hwp, 0x40);
-
-    /* UniChrome Pro or later */
-    switch (pVia->Chipset) {
-    case VIA_PM800:
-    case VIA_K8M800:
-    case VIA_P4M800PRO:
-    case VIA_CX700:
-    case VIA_P4M890:
-    case VIA_K8M890:
-    case VIA_P4M900:
-    case VIA_VX800:
-    case VIA_VX855:
-    case VIA_VX900:
-        Regs->CR[0x43] = hwp->readCrtc(hwp, 0x43);
-        Regs->CR[0x45] = hwp->readCrtc(hwp, 0x45);
-        break;
-    default:
-        break;
-    }
-
-    Regs->CR[0x46] = hwp->readCrtc(hwp, 0x46);
-    Regs->CR[0x47] = hwp->readCrtc(hwp, 0x47);
-
-    /* Starting Address */
-    /* Start Address High */
-    Regs->CR[0x0C] = hwp->readCrtc(hwp, 0x0C);
-
-    /* Start Address Low */
-    Regs->CR[0x0D] = hwp->readCrtc(hwp, 0x0D);
-
-    /* UniChrome Pro or later */
-    switch (pVia->Chipset) {
-    case VIA_PM800:
-    case VIA_K8M800:
-    case VIA_P4M800PRO:
-    case VIA_CX700:
-    case VIA_P4M890:
-    case VIA_K8M890:
-    case VIA_P4M900:
-    case VIA_VX800:
-    case VIA_VX855:
-    case VIA_VX900:
-        /* Starting Address Overflow[28:24] */
-        Regs->CR[0x48] = hwp->readCrtc(hwp, 0x48);
-        break;
-    default:
-        break;
+            hwp->writeSeq(hwp, 0x22, 0x28); /* 160/4   = 40   = 0x28 */
+            break;
+        case VIA_VX900:
+            hwp->writeSeq(hwp, 0x17, 0xC7); /* 400/2-1 = 199  = 0xC7 */
+            /* Formula for {SR16,0,5},{SR16,7,7} is: (0x50 & 0x3F) | ((0x50 & 0x40) << 1) = 0x90 */
+            hwp->writeSeq(hwp, 0x16, 0x90); /* 320/4   = 80   = 0x50 */
+            /* Formula for {SR18,0,5},{SR18,7,7} is: (0x50 & 0x3F) | ((0x50 & 0x40) << 1) = 0x90 */
+            hwp->writeSeq(hwp, 0x18, 0x90); /* 320/4   = 80   = 0x50 */
+            hwp->writeSeq(hwp, 0x22, 0x28); /* 160/4   = 40   = 0x28 */
+            break;
+        default:
+            xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaSetPrimaryFIFO: "
+                       "Chipset %d not implemented\n", pVia->Chipset);
+            break;
     }
+}
+
+/*
+ * Turn off the primary FIFO only for CLE266A.
+ */
+static void
+ViaDisablePrimaryFIFO(ScrnInfoPtr pScrn)
+{
+    VIAPtr pVia = VIAPTR(pScrn);
 
-    /* Starting Address Overflow[23:16] */
-    Regs->CR[0x34] = hwp->readCrtc(hwp, 0x34);
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDisablePrimaryFIFO\n"));
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Finished saving IGA1 registers.\n"));
+    /* Needed because exiting from X-Window will dump back register values.
+     * Other chipsets have no need to set extended FIFO values. */
+    if ((pVia->Chipset == VIA_CLE266) && CLE266_REV_IS_AX(pVia->ChipRev) &&
+        ((pScrn->currentMode->HDisplay > 1024) || pVia->HasSecondary))
+        ViaSetCLE266APrimaryFIFO(pScrn, FALSE);
+}
 
-    vgaHWProtect(pScrn, FALSE);
+void
+viaIGA1Save(ScrnInfoPtr pScrn)
+{
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaIGA1Save.\n"));
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting viaIGA1Save.\n"));
@@ -2288,7 +1889,8 @@ viaIGA1Restore(ScrnInfoPtr pScrn)
 {
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    VIARegPtr Regs = &pVia->SavedReg;
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    VIARegPtr Regs = &pVIADisplay->SavedReg;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaIGA1Restore.\n"));
@@ -2332,7 +1934,6 @@ viaIGA1Restore(ScrnInfoPtr pScrn)
     case VIA_P4M890:
         hwp->writeSeq(hwp, 0x23, Regs->SR[0x23]);
         hwp->writeSeq(hwp, 0x24, Regs->SR[0x24]);
-        hwp->writeSeq(hwp, 0x25, Regs->SR[0x25]);
 
         hwp->writeSeq(hwp, 0x27, Regs->SR[0x27]);
         hwp->writeSeq(hwp, 0x28, Regs->SR[0x28]);
@@ -2342,11 +1943,13 @@ viaIGA1Restore(ScrnInfoPtr pScrn)
         break;
     }
 
-    hwp->writeSeq(hwp, 0x26, Regs->SR[0x26]);
-
     hwp->writeSeq(hwp, 0x2A, Regs->SR[0x2A]);
     hwp->writeSeq(hwp, 0x2B, Regs->SR[0x2B]);
 
+    hwp->writeSeq(hwp, 0x2C,
+                    (hwp->readSeq(hwp, 0x2C) & (~0x01)) |
+                    (Regs->SR[0x2C] & 0x01));
+
     hwp->writeSeq(hwp, 0x2D, Regs->SR[0x2D]);
     hwp->writeSeq(hwp, 0x2E, Regs->SR[0x2E]);
 
@@ -2368,6 +1971,10 @@ viaIGA1Restore(ScrnInfoPtr pScrn)
         break;
     }
 
+    hwp->writeSeq(hwp, 0x3D,
+                    (hwp->readSeq(hwp, 0x3D) & (~0x01)) |
+                    (Regs->SR[0x3D] & 0x01));
+
     /* Restore PLL settings and several miscellaneous registers.
      * For UniChrome, register 3C5.44 through 3C5.4B are restored.
      * For UniChrome Pro and Chrome 9, register 3C5.44 through 3C5.4C
@@ -2734,8 +2341,11 @@ viaIGA2SetFBStartingAddress(xf86CrtcPtr crtc, int x, int y)
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
     drmmode_ptr drmmode = drmmode_crtc->drmmode;
-    CARD32 Base, tmp;
+    unsigned long Base;
+    unsigned long tmp;
+#ifdef HAVE_DEBUG
     CARD8 cr62, cr63, cr64, cra3;
+#endif
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaIGA2SetFBStartingAddress.\n"));
@@ -3309,131 +2919,9 @@ ViaSetSecondaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode)
 void
 viaIGA2Save(ScrnInfoPtr pScrn)
 {
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    VIAPtr pVia = VIAPTR(pScrn);
-    VIARegPtr Regs = &pVia->SavedReg;
-    int i;
-
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaIGA2Save.\n"));
 
-    vgaHWProtect(pScrn, TRUE);
-
-    vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_ALL);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Saving IGA2 registers.\n"));
-
-    /* Unlock extended registers. */
-    hwp->writeSeq(hwp, 0x10, 0x01);
-
-    for (i = 0; i < (0x88 - 0x50 + 1); i++) {
-        Regs->CR[i + 0x50] = hwp->readCrtc(hwp, i + 0x50);
-    }
-
-    for (i = 0; i < (0x92 - 0x8A + 1); i++) {
-        Regs->CR[i + 0x8A] = hwp->readCrtc(hwp, i + 0x8A);
-    }
-
-    for (i = 0; i < (0xA3 - 0x94 + 1); i++) {
-        Regs->CR[i + 0x94] = hwp->readCrtc(hwp, i + 0x94);
-    }
-
-    Regs->CR[0xA4] = hwp->readCrtc(hwp, 0xA4);
-
-    for (i = 0; i < (0xAC - 0xA5 + 1); i++) {
-        Regs->CR[i + 0xA5] = hwp->readCrtc(hwp, i + 0xA5);
-    }
-
-    /* Chrome 9 */
-    switch (pVia->Chipset) {
-    case VIA_K8M890:
-    case VIA_P4M900:
-    case VIA_VX800:
-    case VIA_VX855:
-    case VIA_VX900:
-        Regs->CR[0xAF] = hwp->readCrtc(hwp, 0xAF);
-        break;
-    default:
-        break;
-    }
-
-    /* Chrome 9, Chrome 9 HC, and Chrome 9 HC3 */
-    switch (pVia->Chipset) {
-    case VIA_K8M890:
-    case VIA_P4M900:
-    case VIA_VX800:
-        for (i = 0; i < (0xCD - 0xB0 + 1); i++) {
-            Regs->CR[i + 0xB0] = hwp->readCrtc(hwp, i + 0xB0);
-        }
-
-        break;
-    default:
-        break;
-    }
-
-    switch (pVia->Chipset) {
-
-    /* UniChrome Pro and UniChrome Pro II */
-    case VIA_PM800:
-    case VIA_K8M800:
-    case VIA_P4M800PRO:
-    case VIA_CX700:
-    case VIA_P4M890:
-        for (i = 0; i < (0xD7 - 0xD0 + 1); i++) {
-            Regs->CR[i + 0xD0] = hwp->readCrtc(hwp, i + 0xD0);
-        }
-
-        break;
-
-    /* Chrome 9 */
-    case VIA_K8M890:
-    case VIA_P4M900:
-    case VIA_VX800:
-    case VIA_VX855:
-    case VIA_VX900:
-        for (i = 0; i < (0xEC - 0xD0 + 1); i++) {
-            Regs->CR[i + 0xD0] = hwp->readCrtc(hwp, i + 0xD0);
-        }
-
-        break;
-    default:
-        break;
-    }
-
-    /* Chrome 9 */
-    switch (pVia->Chipset) {
-    case VIA_K8M890:
-    case VIA_P4M900:
-    case VIA_VX800:
-    case VIA_VX855:
-    case VIA_VX900:
-        for (i = 0; i < (0xF5 - 0xF0 + 1); i++) {
-            Regs->CR[i + 0xF0] = hwp->readCrtc(hwp, i + 0xF0);
-        }
-
-        break;
-    default:
-        break;
-    }
-
-    /* Chrome 9 HCM and Chrome 9 HD */
-    if ((pVia->Chipset == VIA_VX855) || (pVia->Chipset == VIA_VX900)) {
-        for (i = 0; i < (0xFC - 0xF6 + 1); i++) {
-            Regs->CR[i + 0xF6] = hwp->readCrtc(hwp, i + 0xF6);
-        }
-    }
-
-    /* Chrome 9 HD */
-    if (pVia->Chipset == VIA_VX900) {
-        Regs->CR[0xFD] = hwp->readCrtc(hwp, 0xFD);
-    }
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Finished saving IGA2 registers.\n"));
-
-    vgaHWProtect(pScrn, FALSE);
-
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting viaIGA2Save.\n"));
 }
@@ -3443,7 +2931,8 @@ viaIGA2Restore(ScrnInfoPtr pScrn)
 {
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    VIARegPtr Regs = &pVia->SavedReg;
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    VIARegPtr Regs = &pVIADisplay->SavedReg;
     int i;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -3598,11 +3087,11 @@ viaIGA2Restore(ScrnInfoPtr pScrn)
 void
 ViaShadowCRTCSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
 {
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaShadowCRTCSetMode\n"));
-
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     CARD16 temp;
 
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaShadowCRTCSetMode\n"));
+
     temp = (mode->CrtcHTotal >> 3) - 5;
     hwp->writeCrtc(hwp, 0x6D, temp & 0xFF);
     ViaCrtcMask(hwp, 0x71, temp >> 5, 0x08);
@@ -3643,27 +3132,16 @@ iga1_crtc_dpms(xf86CrtcPtr crtc, int mode)
 
     switch (mode) {
     case DPMSModeOn:
-        viaIGA1DPMSControl(pScrn, 0x00);
-        break;
-
     case DPMSModeStandby:
-        viaIGA1DPMSControl(pScrn, 0x01);
-        break;
-
     case DPMSModeSuspend:
-        viaIGA1DPMSControl(pScrn, 0x02);
+        viaIGA1SetDisplayOutput(pScrn, TRUE);
         break;
-
     case DPMSModeOff:
-        viaIGA1DPMSControl(pScrn, 0x03);
+        viaIGA1SetDisplayOutput(pScrn, FALSE);
         break;
-
     default:
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Invalid DPMS Mode: %d\n",
-                    mode);
         break;
     }
-    //vgaHWSaveScreen(pScrn->pScreen, mode);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting iga1_crtc_dpms.\n"));
@@ -3723,10 +3201,10 @@ iga1_crtc_mode_fixup(xf86CrtcPtr crtc, DisplayModePtr mode,
 
     temp = mode->CrtcHDisplay * mode->CrtcVDisplay * mode->VRefresh *
             (pScrn->bitsPerPixel >> 3);
-    if (pVia->pBIOSInfo->Bandwidth < temp) {
+    if (pVia->pVIADisplay->Bandwidth < temp) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                     "Required bandwidth is not available. (%u > %u)\n",
-                    (unsigned)temp, (unsigned)pVia->pBIOSInfo->Bandwidth);
+                    (unsigned)temp, (unsigned)pVia->pVIADisplay->Bandwidth);
         return FALSE;
     }
 
@@ -3756,7 +3234,7 @@ iga1_crtc_prepare(xf86CrtcPtr crtc)
                         "Entered iga1_crtc_prepare.\n"));
 
     /* Turn off IGA1. */
-    viaIGA1DPMSControl(pScrn, 0x03);
+    viaIGA1SetDisplayOutput(pScrn, FALSE);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting iga1_crtc_prepare.\n"));
@@ -3785,13 +3263,13 @@ iga1_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode,
     ScrnInfoPtr pScrn = crtc->scrn;
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered iga1_crtc_mode_set.\n"));
 
     /* Put IGA1 into a reset state. */
-    viaIGA1HWReset(pScrn, 0x00);
+    viaIGA1HWReset(pScrn, TRUE);
 
     if (!vgaHWInit(pScrn, adjusted_mode)) {
         DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -3802,9 +3280,6 @@ iga1_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode,
     viaIGAInitCommon(pScrn);
     viaIGA1Init(pScrn);
 
-    /* Disable IGA1 */
-    ViaSeqMask(hwp, 0x59, 0x00, 0x80);
-
     ViaPrintMode(pScrn, adjusted_mode);
 
     /* Set color depth. */
@@ -3815,21 +3290,18 @@ iga1_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode,
 
     ViaSetPrimaryFIFO(pScrn, adjusted_mode);
 
-    pBIOSInfo->Clock = ViaModeDotClockTranslate(pScrn, adjusted_mode);
-    pBIOSInfo->ClockExternal = FALSE;
-    ViaSetPrimaryDotclock(pScrn, pBIOSInfo->Clock);
+    pVIADisplay->Clock = ViaModeDotClockTranslate(pScrn, adjusted_mode);
+    pVIADisplay->ClockExternal = FALSE;
+    ViaSetPrimaryDotclock(pScrn, pVIADisplay->Clock);
     ViaSetUseExternalClock(hwp);
     ViaCrtcMask(hwp, 0x6B, 0x00, 0x01);
 
-    /* Enable IGA1 */
-    ViaSeqMask(hwp, 0x59, 0x80, 0x80);
-
     viaIGA1SetFBStartingAddress(crtc, x, y);
     VIAVidAdjustFrame(pScrn, x, y);
 
 exit:
     /* Put IGA1 back into a normal operating state. */
-    viaIGA1HWReset(pScrn, 0x01);
+    viaIGA1HWReset(pScrn, FALSE);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting iga1_crtc_mode_set.\n"));
@@ -3839,16 +3311,12 @@ static void
 iga1_crtc_commit(xf86CrtcPtr crtc)
 {
     ScrnInfoPtr pScrn = crtc->scrn;
-    VIAPtr pVia = VIAPTR(pScrn);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entering iga1_crtc_commit.\n"));
 
-    if (crtc->scrn->pScreen != NULL && pVia->drmmode.hwcursor)
-        xf86_reload_cursors(crtc->scrn->pScreen);
-
     /* Turn on IGA1. */
-    viaIGA1DPMSControl(pScrn, 0x00);
+    viaIGA1SetDisplayOutput(pScrn, TRUE);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting iga1_crtc_commit.\n"));
@@ -3872,7 +3340,7 @@ iga1_crtc_gamma_set(xf86CrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue,
     }
 
     /* Set palette LUT to 8-bit mode. */
-    viaIGA1SetPaletteLUTResolution(pScrn, 0x01);
+    viaIGA1SetPaletteLUTResolution(pScrn, TRUE);
 
     switch (pScrn->bitsPerPixel) {
     case 8:
@@ -3938,28 +3406,38 @@ iga1_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data)
     and in all other bpps the fg and bg are in 8-8-8 RGB format.
 */
 static void
-iga1_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg)
+iga_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg)
 {
     ScrnInfoPtr pScrn = crtc->scrn;
+    drmmode_crtc_private_ptr iga = crtc->driver_private;
     xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
 
     if (xf86_config->cursor_fg)
         return;
 
-    /* Don't recolour the image if we don't have to. */
-    if (fg == xf86_config->cursor_fg && bg == xf86_config->cursor_bg)
+    /*
+     * Don't recolour the image if we don't have to.
+     */
+    if ((fg == xf86_config->cursor_fg) &&
+        (bg == xf86_config->cursor_bg)) {
         return;
+    }
 
-    viaIGA1DisplayHI(pScrn, FALSE);
+    if (!iga->index) {
+        viaIGA1DisplayHI(pScrn, FALSE);
+    } else {
+        viaIGA2DisplayHI(pScrn, FALSE);
+    }
 
     xf86_config->cursor_fg = fg;
     xf86_config->cursor_bg = bg;
 }
 
 static void
-iga1_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
+iga_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
 {
     ScrnInfoPtr pScrn = crtc->scrn;
+    drmmode_crtc_private_ptr iga = crtc->driver_private;
     unsigned xoff, yoff;
 
     if (x < 0) {
@@ -3976,30 +3454,44 @@ iga1_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
         yoff = 0;
     }
 
-    viaIGA1SetHIDisplayLocation(pScrn, x, xoff, y, yoff);
+    if (!iga->index) {
+        viaIGA1SetHIDisplayLocation(pScrn, x, xoff, y, yoff);
+    } else {
+        viaIGA2SetHIDisplayLocation(pScrn, x, xoff, y, yoff);
+    }
 }
 
 static void
-iga1_crtc_show_cursor(xf86CrtcPtr crtc)
+iga_crtc_show_cursor(xf86CrtcPtr crtc)
 {
     ScrnInfoPtr pScrn = crtc->scrn;
+    drmmode_crtc_private_ptr iga = crtc->driver_private;
 
-    viaIGA1DisplayHI(pScrn, TRUE);
+    if (!iga->index) {
+        viaIGA1DisplayHI(pScrn, TRUE);
+    } else {
+        viaIGA2DisplayHI(pScrn, TRUE);
+    }
 }
 
 static void
-iga1_crtc_hide_cursor(xf86CrtcPtr crtc)
+iga_crtc_hide_cursor(xf86CrtcPtr crtc)
 {
     ScrnInfoPtr pScrn = crtc->scrn;
+    drmmode_crtc_private_ptr iga = crtc->driver_private;
 
-    viaIGA1DisplayHI(pScrn, FALSE);
+    if (!iga->index) {
+        viaIGA1DisplayHI(pScrn, FALSE);
+    } else {
+        viaIGA2DisplayHI(pScrn, FALSE);
+    }
 }
 
 static void
-iga1_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
+iga_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
 {
-    drmmode_crtc_private_ptr iga = crtc->driver_private;
     ScrnInfoPtr pScrn = crtc->scrn;
+    drmmode_crtc_private_ptr iga = crtc->driver_private;
     void *dst;
 
     dst = drm_bo_map(pScrn, iga->cursor_bo);
@@ -4007,8 +3499,13 @@ iga1_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
     memcpy(dst, image, iga->cursor_bo->size);
     drm_bo_unmap(pScrn, iga->cursor_bo);
 
-    viaIGA1InitHI(pScrn);
-    viaIGA1SetHIStartingAddress(crtc);
+    if (!iga->index) {
+        viaIGA1InitHI(pScrn);
+        viaIGA1SetHIStartingAddress(crtc);
+    } else {
+        viaIGA2InitHI(pScrn);
+        viaIGA2SetHIStartingAddress(crtc);
+    }
 }
 
 static void
@@ -4032,11 +3529,11 @@ const xf86CrtcFuncsRec iga1_crtc_funcs = {
     .shadow_create          = iga1_crtc_shadow_create,
     .shadow_allocate        = iga1_crtc_shadow_allocate,
     .shadow_destroy         = iga1_crtc_shadow_destroy,
-    .set_cursor_colors      = iga1_crtc_set_cursor_colors,
-    .set_cursor_position    = iga1_crtc_set_cursor_position,
-    .show_cursor            = iga1_crtc_show_cursor,
-    .hide_cursor            = iga1_crtc_hide_cursor,
-    .load_cursor_argb       = iga1_crtc_load_cursor_argb,
+    .set_cursor_colors      = iga_crtc_set_cursor_colors,
+    .set_cursor_position    = iga_crtc_set_cursor_position,
+    .show_cursor            = iga_crtc_show_cursor,
+    .hide_cursor            = iga_crtc_hide_cursor,
+    .load_cursor_argb       = iga_crtc_load_cursor_argb,
 #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) > 2
     .set_origin             = iga1_crtc_set_origin,
 #endif
@@ -4053,15 +3550,13 @@ iga2_crtc_dpms(xf86CrtcPtr crtc, int mode)
 
     switch (mode) {
     case DPMSModeOn:
-        viaIGA2DisplayOutput(pScrn, TRUE);
+        viaIGA2SetDisplayOutput(pScrn, TRUE);
         break;
-
     case DPMSModeStandby:
     case DPMSModeSuspend:
     case DPMSModeOff:
-        viaIGA2DisplayOutput(pScrn, FALSE);
+        viaIGA2SetDisplayOutput(pScrn, FALSE);
         break;
-
     default:
         xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Invalid DPMS mode: %d\n",
                     mode);
@@ -4139,10 +3634,10 @@ iga2_crtc_mode_fixup(xf86CrtcPtr crtc, DisplayModePtr mode,
 
     temp = mode->CrtcHDisplay * mode->CrtcVDisplay * mode->VRefresh *
             (pScrn->bitsPerPixel >> 3);
-    if (pVia->pBIOSInfo->Bandwidth < temp) {
+    if (pVia->pVIADisplay->Bandwidth < temp) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                     "Required bandwidth is not available. (%u > %u)\n",
-                    (unsigned)temp, (unsigned)pVia->pBIOSInfo->Bandwidth);
+                    (unsigned)temp, (unsigned)pVia->pVIADisplay->Bandwidth);
         return FALSE;
     }
 
@@ -4172,7 +3667,7 @@ iga2_crtc_prepare(xf86CrtcPtr crtc)
                         "Entered iga2_crtc_prepare.\n"));
 
     /* Turn off IGA2. */
-    viaIGA2DisplayOutput(pScrn, FALSE);
+    viaIGA2SetDisplayOutput(pScrn, FALSE);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting iga2_crtc_prepare.\n"));
@@ -4200,7 +3695,7 @@ iga2_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode,
     ScrnInfoPtr pScrn = crtc->scrn;
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered iga2_crtc_mode_set.\n"));
@@ -4223,9 +3718,9 @@ iga2_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode,
     viaIGA2SetDisplayRegister(pScrn, adjusted_mode);
 
     ViaSetSecondaryFIFO(pScrn, adjusted_mode);
-    pBIOSInfo->Clock = ViaModeDotClockTranslate(pScrn, adjusted_mode);
-    pBIOSInfo->ClockExternal = FALSE;
-    ViaSetSecondaryDotclock(pScrn, pBIOSInfo->Clock);
+    pVIADisplay->Clock = ViaModeDotClockTranslate(pScrn, adjusted_mode);
+    pVIADisplay->ClockExternal = FALSE;
+    ViaSetSecondaryDotclock(pScrn, pVIADisplay->Clock);
     ViaSetUseExternalClock(hwp);
 
     viaIGA2SetFBStartingAddress(crtc, x, y);
@@ -4245,16 +3740,12 @@ static void
 iga2_crtc_commit(xf86CrtcPtr crtc)
 {
     ScrnInfoPtr pScrn = crtc->scrn;
-    VIAPtr pVia = VIAPTR(pScrn);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entering iga2_crtc_commit.\n"));
 
-    if (crtc->scrn->pScreen != NULL && pVia->drmmode.hwcursor)
-        xf86_reload_cursors(crtc->scrn->pScreen);
-
     /* Turn on IGA2. */
-    viaIGA2DisplayOutput(pScrn, TRUE);
+    viaIGA2SetDisplayOutput(pScrn, TRUE);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting iga2_crtc_commit.\n"));
@@ -4337,98 +3828,6 @@ iga2_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data)
 {
 }
 
-/*
-    Set the cursor foreground and background colors.  In 8bpp, fg and
-    bg are indices into the current colormap unless the
-    HARDWARE_CURSOR_TRUECOLOR_AT_8BPP flag is set.  In that case
-    and in all other bpps the fg and bg are in 8-8-8 RGB format.
-*/
-static void
-iga2_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg)
-{
-    drmmode_crtc_private_ptr iga = crtc->driver_private;
-    ScrnInfoPtr pScrn = crtc->scrn;
-    xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-    int height = 64, width = 64, i;
-    CARD32 pixel, *dst;
-
-    if (xf86_config->cursor_fg)
-        return;
-
-    fg |= 0xff000000;
-    bg |= 0xff000000;
-
-    /* Don't recolour the image if we don't have to. */
-    if (fg == xf86_config->cursor_fg && bg == xf86_config->cursor_bg)
-        return;
-
-    viaIGA2DisplayHI(pScrn, FALSE);
-
-    dst = drm_bo_map(pScrn, iga->cursor_bo);
-    for (i = 0; i < width * height; i++, dst++)
-        if ((pixel = *dst))
-            *dst = (pixel == xf86_config->cursor_fg) ? fg : bg;
-    drm_bo_unmap(pScrn, iga->cursor_bo);
-
-    xf86_config->cursor_fg = fg;
-    xf86_config->cursor_bg = bg;
-}
-
-static void
-iga2_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
-{
-    ScrnInfoPtr pScrn = crtc->scrn;
-    unsigned xoff, yoff;
-
-    if (x < 0) {
-        xoff = ((-x) & 0xFE);
-        x = 0;
-    } else {
-        xoff = 0;
-    }
-
-    if (y < 0) {
-        yoff = ((-y) & 0xFE);
-        y = 0;
-    } else {
-        yoff = 0;
-    }
-
-    viaIGA2SetHIDisplayLocation(pScrn, x, xoff, y, yoff);
-}
-
-static void
-iga2_crtc_show_cursor(xf86CrtcPtr crtc)
-{
-    ScrnInfoPtr pScrn = crtc->scrn;
-
-    viaIGA2DisplayHI(pScrn, TRUE);
-}
-
-static void
-iga2_crtc_hide_cursor(xf86CrtcPtr crtc)
-{
-    ScrnInfoPtr pScrn = crtc->scrn;
-
-    viaIGA2DisplayHI(pScrn, FALSE);
-}
-
-static void
-iga2_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
-{
-    drmmode_crtc_private_ptr iga = crtc->driver_private;
-    ScrnInfoPtr pScrn = crtc->scrn;
-    void *dst;
-
-    dst = drm_bo_map(pScrn, iga->cursor_bo);
-    memset(dst, 0x00, iga->cursor_bo->size);
-    memcpy(dst, image, iga->cursor_bo->size);
-    drm_bo_unmap(pScrn, iga->cursor_bo);
-
-    viaIGA2InitHI(pScrn);
-    viaIGA2SetHIStartingAddress(crtc);
-}
-
 const xf86CrtcFuncsRec iga2_crtc_funcs = {
     .dpms                   = iga2_crtc_dpms,
     .save                   = iga2_crtc_save,
@@ -4443,11 +3842,11 @@ const xf86CrtcFuncsRec iga2_crtc_funcs = {
     .shadow_create          = iga2_crtc_shadow_create,
     .shadow_allocate        = iga2_crtc_shadow_allocate,
     .shadow_destroy         = iga2_crtc_shadow_destroy,
-    .set_cursor_colors      = iga2_crtc_set_cursor_colors,
-    .set_cursor_position    = iga2_crtc_set_cursor_position,
-    .show_cursor            = iga2_crtc_show_cursor,
-    .hide_cursor            = iga2_crtc_hide_cursor,
-    .load_cursor_argb       = iga2_crtc_load_cursor_argb,
+    .set_cursor_colors      = iga_crtc_set_cursor_colors,
+    .set_cursor_position    = iga_crtc_set_cursor_position,
+    .show_cursor            = iga_crtc_show_cursor,
+    .hide_cursor            = iga_crtc_hide_cursor,
+    .load_cursor_argb       = iga_crtc_load_cursor_argb,
 #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) > 2
     .set_origin             = iga2_crtc_set_origin,
 #endif
diff --git a/src/via_dri.c b/src/via_dri.c
index b42ae11..ec46fa0 100644
--- a/src/via_dri.c
+++ b/src/via_dri.c
@@ -76,8 +76,8 @@ typedef struct
 
 static char VIAKernelDriverName[] = "via";
 static char VIAClientDriverName[] = "unichrome";
-static const ViaDRMVersion drmExpected = { 1, 3, 0 };
-static const ViaDRMVersion drmCompat = { 2, 0, 0 };
+
+static char SWRastClientDriverName[] = "swrast";
 
 static Bool VIAInitVisualConfigs(ScreenPtr pScreen);
 static Bool VIADRIMapInit(ScreenPtr pScreen, VIAPtr pVia);
@@ -548,7 +548,7 @@ VIADRI1ScreenInit(ScreenPtr pScreen)
         case VIA_VX800:
         case VIA_VX855:
         case VIA_VX900:
-            pDRIInfo->clientDriverName = "swrast";
+            pDRIInfo->clientDriverName = SWRastClientDriverName;
             break;
         default:
             pDRIInfo->clientDriverName = VIAClientDriverName;
@@ -618,6 +618,13 @@ VIADRI1ScreenInit(ScreenPtr pScreen)
         return FALSE;
     }
 
+    if ((pVia->driSize > (pVia->maxDriSize * 1024)) &&
+        (pVia->maxDriSize > 0)) {
+        pVia->driSize = pVia->maxDriSize * 1024;
+    } else {
+        pVia->driSize = (pVia->FBFreeEnd - pVia->FBFreeStart) >> 2;
+    }
+
     if (!(VIAInitVisualConfigs(pScreen))) {
         VIADRICloseScreen(pScreen);
         return FALSE;
diff --git a/src/via_driver.c b/src/via_driver.c
index 439313c..3289e74 100644
--- a/src/via_driver.c
+++ b/src/via_driver.c
@@ -65,8 +65,9 @@ typedef struct
 	int patchlevel;
 } ViaDRMVersion;
 
-static const ViaDRMVersion drmExpected = { 1, 3, 0 };
-static const ViaDRMVersion drmCompat = { 3, 1, 0 };
+static const ViaDRMVersion drmVIADRMExpected = { 1, 3, 0 };
+static const ViaDRMVersion drmVIADRMCompat = { 3, 0, 0 };
+static const ViaDRMVersion drmOpenChromeDRMVersion = { 3, 0, 0 };
 
 /* Prototypes. */
 static void VIAIdentify(int flags);
@@ -78,10 +79,11 @@ static Bool via_pci_probe(DriverPtr drv, int entity_num,
 static Bool VIAProbe(DriverPtr drv, int flags);
 #endif
 
-static Bool VIASetupDefaultOptions(ScrnInfoPtr pScrn);
-static Bool viaPreInit(ScrnInfoPtr pScrn, int flags);
+static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags);
 static Bool VIAScreenInit(SCREEN_INIT_ARGS_DECL);
-static const OptionInfoRec *VIAAvailableOptions(int chipid, int busid);
+
+
+int gVIAEntityIndex = -1;
 
 #ifdef HAVE_PCIACCESS
 
@@ -128,7 +130,7 @@ _X_EXPORT DriverRec VIA = {
 /* Supported chipsets */
 static SymTabRec VIAChipsets[] = {
     {VIA_CLE266,        "CLE266"},
-    {VIA_KM400,         "KM400 / KM400A / KN400 / P4M800"},
+    {VIA_KM400,         "KM400(A) / KN400(A) / P4M800"},
     {VIA_K8M800,        "K8M800 / K8N800"},
     {VIA_PM800,         "PM800 / PN800 / PM880 / CN333 / CN400"},
     {VIA_P4M800PRO,     "P4M800 Pro / VN800 / CN700"},
@@ -159,66 +161,8 @@ static PciChipsets VIAPciChipsets[] = {
     {-1,                -1,                 VIA_RES_UNDEF}
 };
 
-typedef enum
-{
-#ifdef HAVE_DEBUG
-    OPTION_PRINTVGAREGS,
-    OPTION_PRINTTVREGS,
-    OPTION_I2CSCAN,
-#endif
-    OPTION_NOACCEL,
-    OPTION_EXA_NOCOMPOSITE,
-    OPTION_EXA_SCRATCH_SIZE,
-    OPTION_SWCURSOR,
-    OPTION_SHADOW_FB,
-    OPTION_ROTATION_TYPE,
-    OPTION_ROTATE,
-    OPTION_VIDEORAM,
-    OPTION_I2CDEVICES,
-    OPTION_CENTER,
-    OPTION_TVDOTCRAWL,
-    OPTION_TVTYPE,
-    OPTION_TVOUTPUT,
-    OPTION_DISABLEVQ,
-    OPTION_DISABLEIRQ,
-    OPTION_TVDEFLICKER,
-    OPTION_AGP_DMA,
-    OPTION_2D_DMA,
-    OPTION_XV_DMA,
-    OPTION_MAX_DRIMEM,
-    OPTION_AGPMEM,
-    OPTION_DISABLE_XV_BW_CHECK
-} VIAOpts;
-
-static OptionInfoRec VIAOptions[] = {
-#ifdef HAVE_DEBUG /* Don't document these three. */
-    {OPTION_PRINTVGAREGS,        "PrintVGARegs",     OPTV_BOOLEAN, {0}, FALSE},
-    {OPTION_PRINTTVREGS,         "PrintTVRegs",      OPTV_BOOLEAN, {0}, FALSE},
-    {OPTION_I2CSCAN,             "I2CScan",          OPTV_BOOLEAN, {0}, FALSE},
-#endif
-    {OPTION_NOACCEL,             "NoAccel",          OPTV_BOOLEAN, {0}, FALSE},
-    {OPTION_EXA_NOCOMPOSITE,     "ExaNoComposite",   OPTV_BOOLEAN, {0}, FALSE},
-    {OPTION_EXA_SCRATCH_SIZE,    "ExaScratchSize",   OPTV_INTEGER, {0}, FALSE},
-    {OPTION_SWCURSOR,            "SWCursor",         OPTV_BOOLEAN, {0}, FALSE},
-    {OPTION_SHADOW_FB,           "ShadowFB",         OPTV_BOOLEAN, {0}, FALSE},
-    {OPTION_ROTATION_TYPE,       "RotationType",     OPTV_ANYSTR,  {0}, FALSE},
-    {OPTION_ROTATE,              "Rotate",           OPTV_ANYSTR,  {0}, FALSE},
-    {OPTION_VIDEORAM,            "VideoRAM",         OPTV_INTEGER, {0}, FALSE},
-    {OPTION_TVDOTCRAWL,          "TVDotCrawl",       OPTV_BOOLEAN, {0}, FALSE},
-    {OPTION_TVDEFLICKER,         "TVDeflicker",      OPTV_INTEGER, {0}, FALSE},
-    {OPTION_TVTYPE,              "TVType",           OPTV_ANYSTR,  {0}, FALSE},
-    {OPTION_TVOUTPUT,            "TVOutput",         OPTV_ANYSTR,  {0}, FALSE},
-    {OPTION_DISABLEVQ,           "DisableVQ",        OPTV_BOOLEAN, {0}, FALSE},
-    {OPTION_DISABLEIRQ,          "DisableIRQ",       OPTV_BOOLEAN, {0}, FALSE},
-    {OPTION_AGP_DMA,             "EnableAGPDMA",     OPTV_BOOLEAN, {0}, FALSE},
-    {OPTION_2D_DMA,              "NoAGPFor2D",       OPTV_BOOLEAN, {0}, FALSE},
-    {OPTION_XV_DMA,              "NoXVDMA",          OPTV_BOOLEAN, {0}, FALSE},
-    {OPTION_DISABLE_XV_BW_CHECK, "DisableXvBWCheck", OPTV_BOOLEAN, {0}, FALSE},
-    {OPTION_MAX_DRIMEM,          "MaxDRIMem",        OPTV_INTEGER, {0}, FALSE},
-    {OPTION_AGPMEM,              "AGPMem",           OPTV_INTEGER, {0}, FALSE},
-    {OPTION_I2CDEVICES,          "I2CDevices",       OPTV_ANYSTR,  {0}, FALSE},
-    {-1,                         NULL,               OPTV_NONE,    {0}, FALSE}
-};
+static char strEXAOptionName[] = "MigrationHeuristic";
+static char strEXAValue[] = "greedy";
 
 #ifdef XFree86LOADER
 static MODULESETUPPROTO(VIASetup);
@@ -269,12 +213,6 @@ VIASetup(pointer module, pointer opts, int *errmaj, int *errmin)
 
 #endif /* XFree86LOADER */
 
-static const OptionInfoRec *
-VIAAvailableOptions(int chipid, int busid)
-{
-    return VIAOptions;
-}
-
 static Bool
 VIASwitchMode(SWITCH_MODE_ARGS_DECL)
 {
@@ -306,29 +244,36 @@ VIAEnterVT_internal(ScrnInfoPtr pScrn, int flags)
     VIAPtr pVia = VIAPTR(pScrn);
     int i;
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAEnterVT\n"));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
 
     for (i = 0; i < xf86_config->num_crtc; i++) {
         xf86CrtcPtr crtc = xf86_config->crtc[i];
 
-        if (crtc->funcs->save)
+        if (crtc->funcs->save) {
             crtc->funcs->save(crtc);
+        }
     }
 
     for (i = 0; i < xf86_config->num_output; i++) {
         xf86OutputPtr output = xf86_config->output[i];
 
-        if (output->funcs->save)
+        if (output->funcs->save) {
             output->funcs->save(output);
+        }
     }
 
-    if (!xf86SetDesiredModes(pScrn))
+    if (!xf86SetDesiredModes(pScrn)) {
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                            "Exiting %s.\n", __func__));
         return FALSE;
+    }
 
     if (!flags) {
         /* Restore video status. */
-        if (!pVia->IsSecondary)
+        if ((!pVia->IsSecondary) && (!pVia->KMS)) {
             viaRestoreVideo(pScrn);
+        }
 
 #ifdef HAVE_DRI
         if (pVia->directRenderingType == DRI_1) {
@@ -339,6 +284,9 @@ VIAEnterVT_internal(ScrnInfoPtr pScrn, int flags)
         }
 #endif
     }
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
     return TRUE;
 }
 
@@ -350,69 +298,87 @@ VIAEnterVT(VT_FUNC_ARGS_DECL)
 }
 
 static void
-VIALeaveVT(VT_FUNC_ARGS_DECL)
+VIALeaveVT_internal(ScrnInfoPtr pScrn, int flags)
 {
-    SCRN_INFO_PTR(arg);
     xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
     int i;
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIALeaveVT\n"));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
 
+    if (!flags) {
 #ifdef HAVE_DRI
-    if (pVia->directRenderingType == DRI_1) {
-        volatile drm_via_sarea_t *saPriv = (drm_via_sarea_t *) DRIGetSAREAPrivate(pScrn->pScreen);
+        if (pVia->directRenderingType == DRI_1) {
+            volatile drm_via_sarea_t *saPriv = (drm_via_sarea_t *) DRIGetSAREAPrivate(pScrn->pScreen);
 
-        DRILock(xf86ScrnToScreen(pScrn), 0);
-        saPriv->ctxOwner = ~0;
+            DRILock(xf86ScrnToScreen(pScrn), 0);
+            saPriv->ctxOwner = ~0;
 
-        viaAccelSync(pScrn);
+            viaAccelSync(pScrn);
 
-        VIADRIRingBufferCleanup(pScrn);
-        viaDRIOffscreenSave(pScrn);
+            VIADRIRingBufferCleanup(pScrn);
+            viaDRIOffscreenSave(pScrn);
 
-        if (pVia->VQEnable)
-            viaDisableVQ(pScrn);
-    }
+            if ((pVia->VQEnable) && (!pVia->KMS)) {
+                viaDisableVQ(pScrn);
+            }
+        }
 #endif
 
-    /* Save video status and turn off all video activities. */
-    if (!pVia->IsSecondary)
-        viaSaveVideo(pScrn);
+        /* Save video status and turn off all video activities. */
+        if ((!pVia->IsSecondary) && (!pVia->KMS)){
+            viaSaveVideo(pScrn);
+        }
+    }
 
     for (i = 0; i < xf86_config->num_output; i++) {
         xf86OutputPtr output = xf86_config->output[i];
 
-        if (output->funcs->restore)
+        if (output->funcs->restore) {
             output->funcs->restore(output);
+        }
     }
 
     for (i = 0; i < xf86_config->num_crtc; i++) {
         xf86CrtcPtr crtc = xf86_config->crtc[i];
 
-        if (crtc->funcs->restore)
+        if (crtc->funcs->restore) {
             crtc->funcs->restore(crtc);
+        }
     }
+
     pScrn->vtSema = FALSE;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
+}
+
+static void
+VIALeaveVT(VT_FUNC_ARGS_DECL)
+{
+    SCRN_INFO_PTR(arg);
+    VIALeaveVT_internal(pScrn, 0);
 }
 
 static void
 VIAFreeRec(ScrnInfoPtr pScrn)
 {
     VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAFreeRec\n"));
     if (!pScrn->driverPrivate)
         return;
 
-    VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+    pVIADisplay = pVia->pVIADisplay;
 
-    if (pBIOSInfo) {
-        if (pBIOSInfo->TVI2CDev)
-            xf86DestroyI2CDevRec(pBIOSInfo->TVI2CDev, TRUE);
+    if (pVIADisplay) {
+        if (pVIADisplay->TVI2CDev)
+            xf86DestroyI2CDevRec(pVIADisplay->TVI2CDev, TRUE);
 
-        pVia->pBIOSInfo = NULL;
-        free(pBIOSInfo);
+        pVia->pVIADisplay = NULL;
+        free(pVIADisplay);
     }
 
     if (pVia->VideoRegs)
@@ -430,6 +396,7 @@ static void
 VIAFreeScreen(FREE_SCREEN_ARGS_DECL)
 {
     SCRN_INFO_PTR(arg);
+    VIAPtr pVia = VIAPTR(pScrn);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAFreeScreen\n"));
 
@@ -437,6 +404,10 @@ VIAFreeScreen(FREE_SCREEN_ARGS_DECL)
         vgaHWFreeHWRec(pScrn);
     }
 
+    if (!pVia->KMS) {
+        viaUMSDestroy(pScrn);
+    }
+
     VIAFreeRec(pScrn);
 }
 
@@ -453,7 +424,6 @@ via_pci_probe(DriverPtr driver, int entity_num,
               struct pci_device *device, intptr_t match_data)
 {
     ScrnInfoPtr scrn = NULL;
-    EntityInfoPtr entity;
 
     scrn = xf86ConfigPciEntity(scrn, 0, entity_num, VIAPciChipsets,
                                NULL, NULL, NULL, NULL, NULL);
@@ -464,9 +434,7 @@ via_pci_probe(DriverPtr driver, int entity_num,
         scrn->name = "CHROME";
         scrn->Probe = NULL;
 
-        entity = xf86GetEntityInfo(entity_num);
-
-        scrn->PreInit = viaPreInit;
+        scrn->PreInit = VIAPreInit;
         scrn->ScreenInit = VIAScreenInit;
         scrn->SwitchMode = VIASwitchMode;
         scrn->AdjustFrame = VIAAdjustFrame;
@@ -538,7 +506,7 @@ VIAProbe(DriverPtr drv, int flags)
 				pScrn->driverName = DRIVER_NAME;
 				pScrn->name = "CHROME";
 				pScrn->Probe = VIAProbe;
-				pScrn->PreInit = viaPreInit;
+				pScrn->PreInit = VIAPreInit;
 				pScrn->ScreenInit = VIAScreenInit;
 				pScrn->SwitchMode = VIASwitchMode;
 				pScrn->AdjustFrame = VIAAdjustFrame;
@@ -624,92 +592,11 @@ LookupChipID(PciChipsets *pset, int ChipID)
 }
 
 static Bool
-VIASetupDefaultOptions(ScrnInfoPtr pScrn)
-{
-    VIAPtr pVia = VIAPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIASetupDefaultOptions - Setting up default chipset options.\n"));
-
-    pVia->shadowFB = FALSE;
-    pVia->NoAccel = FALSE;
-    pVia->noComposite = FALSE;
-    pVia->useEXA = TRUE;
-    pVia->exaScratchSize = VIA_SCRATCH_SIZE / 1024;
-    pVia->drmmode.hwcursor = TRUE;
-    pVia->VQEnable = TRUE;
-    pVia->DRIIrqEnable = TRUE;
-    pVia->agpEnable = TRUE;
-    pVia->dma2d = TRUE;
-    pVia->dmaXV = TRUE;
-#ifdef HAVE_DEBUG
-    pVia->disableXvBWCheck = FALSE;
-#endif
-    pVia->maxDriSize = 0;
-    pVia->agpMem = AGP_SIZE / 1024;
-    pVia->I2CDevices = VIA_I2C_BUS1 | VIA_I2C_BUS2 | VIA_I2C_BUS3;
-    pVia->VideoEngine = VIDEO_ENGINE_CLE;
-#ifdef HAVE_DEBUG
-    pVia->PrintVGARegs = FALSE;
-#endif
-
-    /* Disable vertical interpolation because the size of */
-    /* line buffer (limited to 800) is too small to do interpolation. */
-    pVia->swov.maxWInterp = 800;
-    pVia->swov.maxHInterp = 600;
-
-    switch (pVia->Chipset) {
-        case VIA_CLE266:
-            break;
-        case VIA_KM400:
-            /* IRQ is not broken on KM400A, but testing (pVia->ChipRev < 0x80)
-             * is not enough to make sure we have an older, broken KM400. */
-            pVia->DRIIrqEnable = FALSE;
-            break;
-        case VIA_K8M800:
-            pVia->DRIIrqEnable = FALSE;
-            break;
-        case VIA_PM800:
-            pVia->VideoEngine = VIDEO_ENGINE_CME;
-            break;
-        case VIA_P4M800PRO:
-            break;
-        case VIA_CX700:
-            pVia->VideoEngine = VIDEO_ENGINE_CME;
-            pVia->swov.maxWInterp = 1920;
-            pVia->swov.maxHInterp = 1080;
-            break;
-        case VIA_P4M890:
-            pVia->VideoEngine = VIDEO_ENGINE_CME;
-            pVia->dmaXV = FALSE;
-            break;
-        case VIA_K8M890:
-            pVia->VideoEngine = VIDEO_ENGINE_CME;
-            pVia->agpEnable = FALSE;
-            pVia->dmaXV = FALSE;
-            break;
-        case VIA_P4M900:
-            pVia->VideoEngine = VIDEO_ENGINE_CME;
-            pVia->agpEnable = FALSE;
-            /* FIXME: this needs to be tested */
-            pVia->dmaXV = FALSE;
-            break;
-        case VIA_VX800:
-        case VIA_VX855:
-        case VIA_VX900:
-            pVia->VideoEngine = VIDEO_ENGINE_CME;
-            pVia->agpEnable = FALSE;
-            pVia->dmaXV = FALSE;
-            break;
-    }
-
-    return TRUE;
-}
-
-Bool
 VIAGetRec(ScrnInfoPtr pScrn)
 {
     Bool ret = FALSE;
     VIAPtr pVia;
+    VIADisplayPtr pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAGetRec\n"));
 
@@ -719,15 +606,15 @@ VIAGetRec(ScrnInfoPtr pScrn)
     /* allocate VIARec */
     pVia = (VIARec *) xnfcalloc(sizeof(VIARec), 1);
     if (pVia) {
-        pVia->pBIOSInfo = xnfcalloc(sizeof(VIABIOSInfoRec), 1);
-        VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+        pVia->pVIADisplay = xnfcalloc(sizeof(VIADisplayRec), 1);
+        pVIADisplay = pVia->pVIADisplay;
 
-        if (pBIOSInfo) {
-            pBIOSInfo->TVI2CDev = NULL;
+        if (pVIADisplay) {
+            pVIADisplay->TVI2CDev = NULL;
 
             pVia->VideoRegs = (video_via_regs *) xnfcalloc(sizeof(video_via_regs), 1);
             if (!pVia->VideoRegs) {
-                free(pBIOSInfo);
+                free(pVIADisplay);
                 free(pVia);
             } else {
                 pScrn->driverPrivate = pVia;
@@ -738,86 +625,123 @@ VIAGetRec(ScrnInfoPtr pScrn)
     return ret;
 } /* VIAGetRec */
 
-static int
-map_legacy_formats(int bpp, int depth)
+static unsigned int
+viaConvertDepthToBpp(int bpp, int depth)
 {
-	int fmt = DRM_FORMAT_XRGB8888;
-
-	switch (bpp) {
-	case 8:
-		fmt = DRM_FORMAT_C8;
-		break;
-	case 16:
-		if (depth == 15)
-			fmt = DRM_FORMAT_XRGB1555;
-		else
-			fmt = DRM_FORMAT_RGB565;
-		break;
-	case 24:
-		fmt = DRM_FORMAT_RGB888;
-		break;
-	case 32:
-		if (depth == 24)
-			fmt = DRM_FORMAT_XRGB8888;
-		else if (depth == 30)
-			fmt = DRM_FORMAT_XRGB2101010;
-	default:
-		break;
-	}
-	return fmt;
+    unsigned int format = DRM_FORMAT_XRGB8888;
+    unsigned int bppSize;
+
+    switch (bpp) {
+    case 8:
+        format = DRM_FORMAT_C8;
+        break;
+    case 16:
+        if (depth == 15)
+            format = DRM_FORMAT_XRGB1555;
+        else
+            format = DRM_FORMAT_RGB565;
+        break;
+    case 24:
+        format = DRM_FORMAT_RGB888;
+        break;
+    case 32:
+        if (depth == 24)
+            format = DRM_FORMAT_XRGB8888;
+        else if (depth == 30)
+            format = DRM_FORMAT_XRGB2101010;
+        break;
+    default:
+        break;
+    }
+
+    switch (format) {
+    case DRM_FORMAT_C8:
+        bppSize = 1;
+        break;
+    case DRM_FORMAT_XRGB1555:
+    case DRM_FORMAT_RGB565:
+        bppSize = 2;
+        break;
+    case DRM_FORMAT_RGB888:
+        bppSize = 3;
+        break;
+    case DRM_FORMAT_XRGB2101010:
+    case DRM_FORMAT_XRGB8888:
+        bppSize = 4;
+        break;
+    default:
+        bppSize = 0;
+        break;
+    }
+
+    return bppSize;
 }
 
 static Bool
 via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
 {
     xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    xf86CrtcPtr crtc = NULL;
-    ScreenPtr screen = scrn->pScreen;
-    VIAPtr pVia = VIAPTR(scrn);
     drmmode_crtc_private_ptr drmmode_crtc
                                     = xf86_config->crtc[0]->driver_private;
     drmmode_ptr drmmode = drmmode_crtc->drmmode;
     struct buffer_object *old_front = NULL;
-    void *new_pixels = NULL;
-    PixmapPtr ppix;
-    int old_width, old_height, old_displayWidth, old_fd;
+    Bool ret;
+    ScreenPtr screen;
     uint32_t old_fb_id;
-    int format, i;
-    Bool ret = FALSE;
+    int i;
+    int old_width, old_height, old_displayWidth;
+    int cpp = (scrn->bitsPerPixel + 7) / 8;
+    PixmapPtr ppix;
+    void *new_pixels;
+    VIAPtr pVia = VIAPTR(scrn);
+    xf86CrtcPtr crtc = NULL;
+    unsigned int bppSize, alignedPitch;
 
     DEBUG(xf86DrvMsg(scrn->scrnIndex, X_INFO,
-                        "Entered via_xf86crtc_resize.\n"));
-    xf86DrvMsg(scrn->scrnIndex, X_INFO,
-                "Now attempting to resize the screen . . .\n");
+                        "Entered %s.\n", __func__));
+
+    screen = xf86ScrnToScreen(scrn);
+    ppix = screen->GetScreenPixmap(screen);
 
     if ((scrn->virtualX == width) && (scrn->virtualY == height)) {
-        xf86DrvMsg(scrn->scrnIndex, X_INFO,
-                    "It was determined that there is no need to resize the "
-                    "screen.\n");
         DEBUG(xf86DrvMsg(scrn->scrnIndex, X_INFO,
-                            "Exiting via_xf86crtc_resize.\n"));
+                            "Exiting %s.\n", __func__));
         return TRUE;
     }
 
-    /* Preserve the old screen information just in case they need to
+    /* Preserve the old screen information just in case it needs to
      * be restored. */
     old_width = scrn->virtualX;
     old_height = scrn->virtualY;
     old_displayWidth = scrn->displayWidth;
-    old_fd = drmmode->fd;
     old_fb_id = drmmode->fb_id;
     old_front = drmmode->front_bo;
 
-    format = map_legacy_formats(scrn->bitsPerPixel, scrn->depth);
-    drmmode->front_bo = drm_bo_alloc_surface(scrn, width, height, format,
-                                            16, TTM_PL_FLAG_VRAM);
+    bppSize = viaConvertDepthToBpp(scrn->bitsPerPixel,
+                                        scrn->depth);
+    alignedPitch = width * bppSize;
+    alignedPitch = ALIGN_TO(alignedPitch, 16);
+    drmmode->front_bo = drm_bo_alloc(scrn,
+                                        alignedPitch * height,
+                                        16, TTM_PL_FLAG_VRAM);
     if (!drmmode->front_bo) {
         goto fail;
     }
+    scrn->virtualX = width;
+    scrn->virtualY = height;
+    scrn->displayWidth = width;
 
-    xf86DrvMsg(scrn->scrnIndex, X_INFO,
-                "Allocated a new frame buffer: %dx%d\n",
-                width, height);
+#ifdef HAVE_DRI
+    if (pVia->KMS) {
+        ret = drmModeAddFB(drmmode->fd, width, height, scrn->depth,
+                            scrn->bitsPerPixel, width * cpp,
+                            drmmode->front_bo->handle,
+                            &drmmode->fb_id);
+        if (ret) {
+            goto fail;
+        }
+    }
+#endif
 
     new_pixels = drm_bo_map(scrn, drmmode->front_bo);
     if (!new_pixels) {
@@ -825,7 +749,8 @@ via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
     }
 
     if (pVia->shadowFB) {
-        new_pixels = malloc(height * drmmode->front_bo->pitch);
+        new_pixels = malloc(scrn->displayWidth * scrn->virtualY *
+                            ((scrn->bitsPerPixel + 7) >> 3));
         if (!new_pixels) {
             goto fail;
         }
@@ -834,17 +759,13 @@ via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
         pVia->ShadowPtr = new_pixels;
     }
 
-    scrn->virtualX = width;
-    scrn->virtualY = height;
-    scrn->displayWidth = (drmmode->front_bo->pitch)
-                            / ((scrn->bitsPerPixel + 7) >> 3);
+    screen->ModifyPixmapHeader(ppix, width, height, -1, -1,
+                                width * cpp, new_pixels);
+
+    xf86DrvMsg(scrn->scrnIndex, X_INFO,
+                "Allocated a new frame buffer: %dx%d\n",
+                width, height);
 
-    ppix = screen->GetScreenPixmap(screen);
-    if (!screen->ModifyPixmapHeader(ppix, width, height, -1, -1,
-                                    drmmode->front_bo->pitch,
-                                    new_pixels)) {
-        goto fail;
-    }
 
 #if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,9,99,1,0)
     scrn->pixmapPrivate.ptr = ppix->devPrivate.ptr;
@@ -871,11 +792,11 @@ via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
 
 #ifdef HAVE_DRI
     if (pVia->KMS && old_fb_id) {
-        drmModeRmFB(old_fd, old_fb_id);
+        drmModeRmFB(drmmode->fd, old_fb_id);
     }
 #endif
 
-    if (old_front) {
+    if (old_fb_id) {
         drm_bo_unmap(scrn, old_front);
         drm_bo_free(scrn, old_front);
     }
@@ -883,7 +804,7 @@ via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
     xf86DrvMsg(scrn->scrnIndex, X_INFO,
                 "Screen resize successful.\n");
     DEBUG(xf86DrvMsg(scrn->scrnIndex, X_INFO,
-                        "Exiting via_xf86crtc_resize.\n"));
+                        "Exiting %s.\n", __func__));
     return TRUE;
 
 fail:
@@ -895,21 +816,13 @@ fail:
     scrn->virtualX = old_width;
     scrn->virtualY = old_height;
     scrn->displayWidth = old_displayWidth;
-
-#ifdef HAVE_DRI
-    if (pVia->KMS && (old_fb_id != drmmode->fb_id)) {
-        drmModeRmFB(old_fd, old_fb_id);
-    }
-#endif
-
-    drmmode->fd = old_fd;
     drmmode->fb_id = old_fb_id;
     drmmode->front_bo = old_front;
 
-    xf86DrvMsg(scrn->scrnIndex, X_INFO,
+    xf86DrvMsg(scrn->scrnIndex, X_ERROR,
                 "An error occurred during screen resize.\n");
     DEBUG(xf86DrvMsg(scrn->scrnIndex, X_INFO,
-                        "Exiting via_xf86crtc_resize.\n"));
+                        "Exiting %s.\n", __func__));
     return FALSE;
 }
 
@@ -919,29 +832,88 @@ xf86CrtcConfigFuncsRec via_xf86crtc_config_funcs = {
 };
 
 static Bool
-viaPreInit(ScrnInfoPtr pScrn, int flags)
+VIAPreInit(ScrnInfoPtr pScrn, int flags)
 {
-    XF86OptionPtr option = xf86NewOption("MigrationHeuristic", "greedy");
     EntityInfoPtr pEnt;
     VIAPtr pVia;
-    VIABIOSInfoPtr pBIOSInfo;
     MessageType from = X_DEFAULT;
-    const char *s = NULL;
 #ifdef HAVE_DRI
     char *busId = NULL;
     drmVersionPtr drmVer;
 #endif
+    rgb defaultWeight = {0, 0, 0};
+    rgb defaultMask = {0, 0, 0};
+    Gamma defaultGamma = {0.0, 0.0, 0.0};
+    XF86OptionPtr option;
+    Bool status = FALSE;
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "viaPreInit\n"));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
 
-    if (pScrn->numEntities > 1)
-        return FALSE;
+    pScrn->monitor = pScrn->confScreen->monitor;
 
-    if (flags & PROBE_DETECT)
-        return FALSE;
+    /*
+     * We support depths of 8, 16 and 24.
+     * We support bpp of 8, 16, and 32.
+     */
+    if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support32bppFb)) {
+        goto exit;
+    } else {
+        switch (pScrn->depth) {
+        case 8:
+        case 16:
+        case 24:
+            break;
+        default:
+            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                        "Given depth (%d) is not supported by this driver!\n",
+                        pScrn->depth);
+            goto exit;
+            break;
+        }
+    }
+
+    pScrn->rgbBits = 8;
+
+    /* Print out the depth / bpp that was set. */
+    xf86PrintDepthBpp(pScrn);
+
+    if (pScrn->depth > 8) {
+        if (!xf86SetWeight(pScrn, defaultWeight, defaultMask)) {
+            goto exit;
+        } else {
+            /* TODO check weight returned is supported. */
+        }
+    }
+
+    if (!xf86SetDefaultVisual(pScrn, -1)) {
+        goto exit;
+    } else {
+        /* We don't currently support DirectColor at > 8bpp. */
+        if (pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) {
+            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                        "Given default visual (%s) is not supported "
+                        "at depth %d.\n",
+                        xf86GetVisualName(pScrn->defaultVisual),
+                                            pScrn->depth);
+            goto exit;
+        }
+    }
+
+    /* If the driver supports gamma correction, set the gamma. */
+    if (!xf86SetGamma(pScrn, defaultGamma)) {
+        goto exit;
+    }
+
+    /* This driver uses a programmable clock. */
+    pScrn->progClock = TRUE;
+
+    if (pScrn->numEntities > 1) {
+        goto exit;
+    }
 
     if (!VIAGetRec(pScrn)) {
-        return FALSE;
+        goto exit;
     }
 
     pVia = VIAPTR(pScrn);
@@ -950,8 +922,7 @@ viaPreInit(ScrnInfoPtr pScrn, int flags)
 #ifndef HAVE_PCIACCESS
     if (pEnt->resources) {
         free(pEnt);
-        VIAFreeRec(pScrn);
-        return FALSE;
+        goto free_rec;
     }
 #endif
 
@@ -968,9 +939,9 @@ viaPreInit(ScrnInfoPtr pScrn, int flags)
             pVIAEnt = pPriv->ptr;
             if (pVIAEnt->BypassSecondary) {
                 free(pEnt);
-                VIAFreeRec(pScrn);
-                return FALSE;
+                goto free_rec;
             }
+
             pVIAEnt->pSecondaryScrn = pScrn;
             pVIAEnt->HasSecondary = TRUE;
             pVia1 = VIAPTR(pVIAEnt->pPrimaryScrn);
@@ -1039,468 +1010,143 @@ viaPreInit(ScrnInfoPtr pScrn, int flags)
 
     if (pEnt)
         free(pEnt);
+
     xf86DrvMsg(pScrn->scrnIndex, from, "Chipset revision: %d\n", pVia->ChipRev);
 
     pVia->directRenderingType = DRI_NONE;
     pVia->KMS = FALSE;
 #ifdef HAVE_DRI
     busId = DRICreatePCIBusID(pVia->PciInfo);
-    pVia->drmmode.fd = drmOpen("via", busId);
-    if (pVia->drmmode.fd != -1) {
-        if (!drmCheckModesettingSupported(busId)) {
-            xf86DrvMsg(-1, X_INFO, "[drm] KMS supported\n");
-            pVia->KMS = TRUE;
-        } else
-            xf86DrvMsg(-1, X_INFO, "[drm] KMS not enabled\n");
 
+    /* Look for OpenChrome DRM first. */
+    /* KMS supports needs to be present for OpenChrome DRM to
+     * function properly.*/
+    pVia->drmmode.fd = drmOpen("openchrome", busId);
+    if (pVia->drmmode.fd != -1) {
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "OpenChrome DRM detected.\n");
         drmVer = drmGetVersion(pVia->drmmode.fd);
         if (drmVer) {
             pVia->drmVerMajor = drmVer->version_major;
             pVia->drmVerMinor = drmVer->version_minor;
-            pVia->drmVerPL = drmVer->version_patchlevel;
+            pVia->drmVerPatchLevel = drmVer->version_patchlevel;
             drmFreeVersion(drmVer);
-
             xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "[drm] via interface version: %d.%d.%d\n",
-                        pVia->drmVerMajor, pVia->drmVerMinor, pVia->drmVerPL);
-
-            /* DRI2 or DRI1 support */
-            if ((pVia->drmVerMajor < drmExpected.major) ||
-                (pVia->drmVerMajor > drmCompat.major) ||
-               ((pVia->drmVerMajor == drmExpected.major) &&
-                (pVia->drmVerMinor < drmExpected.minor))) {
-                xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
-                            "[drm] Kernel drm is not compatible with this driver.\n"
-                            "[drm] Kernel drm version is %d.%d.%d, "
-                            "and I can work with versions %d.%d.x - %d.x.x.\n"
-                            "[drm] Update either this 2D driver or your kernel DRM. "
-                            "Disabling DRI.\n", pVia->drmVerMajor, pVia->drmVerMinor,
-                            pVia->drmVerPL, drmExpected.major, drmExpected.minor,
-                            drmCompat.major);
-            } else {
-                /* DRI2 or DRI1 support */
-                if (pVia->drmVerMajor < drmCompat.major) {
-                    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DRI 1 api supported\n");
-                    pVia->directRenderingType = DRI_1;
-                } else {
-                    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DRI 2 api not supported yet\n");
+                        "OpenChrome DRM Version: %d.%d.%d\n",
+                        pVia->drmVerMajor, pVia->drmVerMinor,
+                        pVia->drmVerPatchLevel);
+
+            if ((pVia->drmVerMajor > drmOpenChromeDRMVersion.major) ||
+                ((pVia->drmVerMajor == drmOpenChromeDRMVersion.major) &&
+                (pVia->drmVerMinor >= drmOpenChromeDRMVersion.minor))) {
+                if (!drmCheckModesettingSupported(busId)) {
+                    pVia->KMS = TRUE;
                     pVia->directRenderingType = DRI_2;
                     pVia->NoAccel = TRUE;
+                    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                                "KMS is supported by "
+                                "OpenChrome DRM.\n");
+                } else {
+                    xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                                "KMS is not available.\n");
+                    xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                                "Disabling OpenChrome DRM support.\n");
                 }
+            } else {
+                xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                            "Unsupported version of OpenChrome DRM "
+                            "detected.\n");
+                xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                            "Only OpenChrome DRM Version %d.%d or "
+                            "later is supported.\n",
+                            drmOpenChromeDRMVersion.major,
+                            drmOpenChromeDRMVersion.minor);
+                xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                            "Disabling OpenChrome DRM support.\n");
             }
         } else {
-            xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Could not get DRM driver version\n");
-        }
-    } else {
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "[drm] Failed to open DRM device for %s: %s\n",
-                    busId, strerror(errno));
-    }
-    free(busId);
-#endif
-
-    /* After umsPreInit function succeeds, PCI hardware resources are
-     * memory mapped. If there is an error from this point on, they will
-     * need to be explicitly relinquished. */
-    if (!umsPreInit(pScrn)) {
-        VIAFreeRec(pScrn);
-        return FALSE;
-    }
-
-	/* Now handle the Display */
-    if (flags & PROBE_DETECT)
-        return TRUE;
-
-    pScrn->monitor = pScrn->confScreen->monitor;
-
-    /*
-     * We support depths of 8, 16 and 24.
-     * We support bpp of 8, 16, and 32.
-     */
-
-    if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support32bppFb)) {
-        goto fail;
-    } else {
-        switch (pScrn->depth) {
-            case 8:
-            case 16:
-            case 24:
-            case 32:
-                /* OK */
-                break;
-            default:
-                xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                           "Given depth (%d) is not supported by this driver\n",
-                           pScrn->depth);
-                goto fail;
-        }
-    }
-
-    xf86PrintDepthBpp(pScrn);
-
-    if (pScrn->depth == 32) {
-        pScrn->depth = 24;
-    }
-
-    if (pScrn->depth > 8) {
-        rgb zeros = { 0, 0, 0 };
-
-        if (!xf86SetWeight(pScrn, zeros, zeros)) {
-            goto fail;
-        } else {
-            /* TODO check weight returned is supported */
-        }
-    }
-
-    if (!xf86SetDefaultVisual(pScrn, -1)) {
-        goto fail;
-    } else {
-        /* We don't currently support DirectColor at > 8bpp */
-        if (pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) {
-            xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Given default visual"
-                       " (%s) is not supported at depth %d.\n",
-                       xf86GetVisualName(pScrn->defaultVisual), pScrn->depth);
-            goto fail;
+            xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                        "Not able to obtain OpenChrome DRM version.\n");
+            xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                        "Disabling OpenChrome DRM support.\n");
         }
     }
 
-    /* We use a programmable clock */
-    pScrn->progClock = TRUE;
-
-    xf86CollectOptions(pScrn, option);
-
-    /* Set the bits per RGB for 8bpp mode */
-    if (pScrn->depth == 8)
-        pScrn->rgbBits = 6;
-
-    if (!VIASetupDefaultOptions(pScrn)) {
-        goto fail;
-    }
+    free(busId);
 
-    xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, VIAOptions);
-
-    if (xf86GetOptValInteger(VIAOptions, OPTION_VIDEORAM, &pScrn->videoRam))
-        xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
-                   "Setting amount of VideoRAM to %d kB\n", pScrn->videoRam);
-
-    /* When rotating, switch shadow framebuffer on and acceleration off. */
-    if ((s = xf86GetOptValString(VIAOptions, OPTION_ROTATION_TYPE))) {
-        if (!xf86NameCmp(s, "SWRandR")) {
-            pVia->shadowFB = TRUE;
-            pVia->NoAccel = TRUE;
-            pVia->RandRRotation = TRUE;
-            pVia->rotate = RR_Rotate_0;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rotating screen "
-                       "RandR enabled, acceleration disabled\n");
-        } else if (!xf86NameCmp(s, "HWRandR")) {
-            pVia->shadowFB = TRUE;
-            pVia->NoAccel = TRUE;
-            pVia->RandRRotation = TRUE;
-            pVia->rotate = RR_Rotate_0;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Hardware accelerated "
-                       "rotating screen is not implemented. Using SW RandR.\n");
-        } else {
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "\"%s\" is not a valid"
-                       "value for Option \"RotationType\".\n", s);
+    /* Now, check for "legacy" DRI1 VIA DRM. */
+    if (!pVia->KMS) {
+        busId = DRICreatePCIBusID(pVia->PciInfo);
+        pVia->drmmode.fd = drmOpen("via", busId);
+        if (pVia->drmmode.fd != -1) {
             xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                       "Valid options are \"SWRandR\" and \"HWRandR\".\n");
-        }
-    }
-
-    /* When rotating, switch shadow framebuffer on and acceleration off. */
-    if ((s = xf86GetOptValString(VIAOptions, OPTION_ROTATE))) {
-        if (!xf86NameCmp(s, "CW")) {
-            pVia->shadowFB = TRUE;
-            pVia->NoAccel = TRUE;
-            pVia->RandRRotation = TRUE;
-            pVia->rotate = RR_Rotate_270;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rotating screen "
-                       "clockwise -- acceleration is disabled.\n");
-        } else if (!xf86NameCmp(s, "CCW")) {
-            pVia->shadowFB = TRUE;
-            pVia->NoAccel = TRUE;
-            pVia->RandRRotation = TRUE;
-            pVia->rotate = RR_Rotate_90;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rotating screen "
-                       "counterclockwise -- acceleration is disabled.\n");
-        } else if (!xf86NameCmp(s, "UD")) {
-            pVia->shadowFB = TRUE;
-            pVia->NoAccel = TRUE;
-            pVia->RandRRotation = TRUE;
-            pVia->rotate = RR_Rotate_180;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rotating screen "
-                       "upside-down -- acceleration is disabled.\n");
+                        "VIA DRM detected.\n");
+            drmVer = drmGetVersion(pVia->drmmode.fd);
+            if (drmVer) {
+                pVia->drmVerMajor = drmVer->version_major;
+                pVia->drmVerMinor = drmVer->version_minor;
+                pVia->drmVerPatchLevel = drmVer->version_patchlevel;
+                drmFreeVersion(drmVer);
+
+                xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                            "VIA DRM Version: %d.%d.%d\n",
+                            pVia->drmVerMajor, pVia->drmVerMinor,
+                            pVia->drmVerPatchLevel);
+
+                if (((pVia->drmVerMajor > drmVIADRMExpected.major) &&
+                    (pVia->drmVerMajor < drmVIADRMCompat.major)) ||
+                    ((pVia->drmVerMajor == drmVIADRMExpected.major) &&
+                    (pVia->drmVerMinor >= drmVIADRMExpected.minor) &&
+                    (pVia->drmVerMajor < drmVIADRMCompat.major))) {
+                    pVia->directRenderingType = DRI_1;
+                    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                                "This version of VIA DRM is "
+                                "compatible with OpenChrome DDX.\n");
+                } else {
+                    xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                                "This version of VIA DRM is not "
+                                "compatible with OpenChrome DDX.\n"
+                                "OpenChrome DDX can work with "
+                                "VIA DRM Version %d.%d to %d.%d.\n",
+                                drmVIADRMExpected.major,
+                                drmVIADRMExpected.minor,
+                                drmVIADRMCompat.major,
+                                drmVIADRMCompat.minor);
+                    xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                                "Disabling VIA DRM support.\n");
+                }
+            } else {
+                xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                            "Not able to obtain VIA DRM version.\n");
+            }
         } else {
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "\"%s\" is not a valid"
-                       "value for Option \"Rotate\".\n", s);
             xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                       "Valid options are \"CW\", \"CCW\" or  \"UD\".\n");
-        }
-    }
-
-    from = (xf86GetOptValBool(VIAOptions, OPTION_SHADOW_FB, &pVia->shadowFB)
-            ? X_CONFIG : X_DEFAULT);
-    xf86DrvMsg(pScrn->scrnIndex, from, "Shadow framebuffer is %s.\n",
-               pVia->shadowFB ? "enabled" : "disabled");
-
-    /* Use hardware acceleration, unless on shadow framebuffer. */
-    from = (xf86GetOptValBool(VIAOptions, OPTION_NOACCEL, &pVia->NoAccel)
-            ? X_CONFIG : X_DEFAULT);
-    if (!pVia->NoAccel && pVia->shadowFB) {
-        xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Acceleration is "
-                   "not supported when using shadow framebuffer.\n");
-        pVia->NoAccel = TRUE;
-        from = X_DEFAULT;
-    }
-
-    /* Disable EXA for KMS case */
-    if (pVia->KMS)
-        pVia->NoAccel = TRUE;
-
-    xf86DrvMsg(pScrn->scrnIndex, from, "Hardware acceleration is %s.\n",
-               !pVia->NoAccel ? "enabled" : "disabled");
-
-    if (!pVia->NoAccel) {
-        from = X_DEFAULT;
-        xf86DrvMsg(pScrn->scrnIndex, from,
-                   "Using EXA acceleration architecture.\n");
-
-        //pVia->noComposite = FALSE;
-        if (pVia->useEXA) {
-            from = xf86GetOptValBool(VIAOptions, OPTION_EXA_NOCOMPOSITE,
-                                     &pVia->noComposite) ? X_CONFIG : X_DEFAULT;
-            xf86DrvMsg(pScrn->scrnIndex, from,
-                       "EXA composite acceleration %s.\n",
-                       !pVia->noComposite ? "enabled" : "disabled");
-
-            //pVia->exaScratchSize = VIA_SCRATCH_SIZE / 1024;
-            from = xf86GetOptValInteger(VIAOptions, OPTION_EXA_SCRATCH_SIZE,
-                                        &pVia->exaScratchSize)
-                    ? X_CONFIG : X_DEFAULT;
-            xf86DrvMsg(pScrn->scrnIndex, from,
-                       "EXA scratch area size is %d kB.\n",
-                       pVia->exaScratchSize);
+                        "OpenChrome DDX will now operate "
+                        "without DRM.\n");
         }
-    }
-
-    /* Use a hardware cursor, unless on secondary or on shadow framebuffer. */
-    from = X_DEFAULT;
-    if (pVia->IsSecondary || pVia->shadowFB)
-        pVia->drmmode.hwcursor = FALSE;
-    else if (xf86GetOptValBool(VIAOptions, OPTION_SWCURSOR,
-                               &pVia->drmmode.hwcursor)) {
-        pVia->drmmode.hwcursor = !pVia->drmmode.hwcursor;
-        from = X_CONFIG;
-    }
-    if (pVia->drmmode.hwcursor)
-        xf86DrvMsg(pScrn->scrnIndex, from, "Using hardware two-color "
-                   "cursors and software full-color cursors.\n");
-    else
-        xf86DrvMsg(pScrn->scrnIndex, from, "Using software cursors.\n");
-
-    //pVia->VQEnable = TRUE;
-    from = xf86GetOptValBool(VIAOptions, OPTION_DISABLEVQ, &pVia->VQEnable)
-            ? X_CONFIG : X_DEFAULT;
-    if (from == X_CONFIG)
-        pVia->VQEnable = !pVia->VQEnable;
-    xf86DrvMsg(pScrn->scrnIndex, from,
-               "GPU virtual command queue will be %s.\n",
-               (pVia->VQEnable) ? "enabled" : "disabled");
-
-    //pVia->DRIIrqEnable = TRUE;
-    from = xf86GetOptValBool(VIAOptions, OPTION_DISABLEIRQ, &pVia->DRIIrqEnable)
-            ? X_CONFIG : X_DEFAULT;
-    if (from == X_CONFIG)
-        pVia->DRIIrqEnable = !pVia->DRIIrqEnable;
-    xf86DrvMsg(pScrn->scrnIndex, from,
-               "DRI IRQ will be %s if DRI is enabled.\n",
-               (pVia->DRIIrqEnable) ? "enabled" : "disabled");
-
-    //pVia->agpEnable = FALSE;
-    from = xf86GetOptValBool(VIAOptions, OPTION_AGP_DMA, &pVia->agpEnable)
-            ? X_CONFIG : X_DEFAULT;
-    xf86DrvMsg(pScrn->scrnIndex, from,
-               "AGP DMA will be %s if DRI is enabled.\n",
-               (pVia->agpEnable) ? "enabled" : "disabled");
-
-    //pVia->dma2d = TRUE;
-    if (pVia->agpEnable) {
-        from = xf86GetOptValBool(VIAOptions, OPTION_2D_DMA, &pVia->dma2d)
-                ? X_CONFIG : X_DEFAULT;
-        if (from == X_CONFIG)
-            pVia->dma2d = !pVia->dma2d;
-        xf86DrvMsg(pScrn->scrnIndex, from, "AGP DMA will %sbe used for "
-                   "2D acceleration.\n", (pVia->dma2d) ? "" : "not ");
-    }
-    //pVia->dmaXV = TRUE;
-    from = xf86GetOptValBool(VIAOptions, OPTION_XV_DMA, &pVia->dmaXV)
-            ? X_CONFIG : X_DEFAULT;
-    if (from == X_CONFIG)
-        pVia->dmaXV = !pVia->dmaXV;
-    xf86DrvMsg(pScrn->scrnIndex, from, "PCI DMA will %sbe used for XV "
-               "image transfer if DRI is enabled.\n",
-               (pVia->dmaXV) ? "" : "not ");
 
-#ifdef HAVE_DEBUG
-    //pVia->disableXvBWCheck = FALSE;
-    from = xf86GetOptValBool(VIAOptions, OPTION_DISABLE_XV_BW_CHECK,
-                             &pVia->disableXvBWCheck)
-            ? X_CONFIG : X_DEFAULT;
-    xf86DrvMsg(pScrn->scrnIndex, from, "Xv Bandwidth check is %s.\n",
-               pVia->disableXvBWCheck ? "disabled" : "enabled");
-    if (pVia->disableXvBWCheck) {
-        xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
-                   "You may get a \"snowy\" screen"
-                   " when using the Xv overlay.\n");
+        free(busId);
     }
 #endif
 
-    //pVia->maxDriSize = 0;
-    from = xf86GetOptValInteger(VIAOptions, OPTION_MAX_DRIMEM,
-                                &pVia->maxDriSize)
-            ? X_CONFIG : X_DEFAULT;
-    if (pVia->maxDriSize > 0)
-        xf86DrvMsg(pScrn->scrnIndex, from,
-                   "Will impose a %d kB limit on video RAM reserved for DRI.\n",
-                   pVia->maxDriSize);
-    else
-        xf86DrvMsg(pScrn->scrnIndex, from,
-                   "Will not impose a limit on video RAM reserved for DRI.\n");
-
-    //pVia->agpMem = AGP_SIZE / 1024;
-    from = xf86GetOptValInteger(VIAOptions, OPTION_AGPMEM, &pVia->agpMem)
-            ? X_CONFIG : X_DEFAULT;
-    xf86DrvMsg(pScrn->scrnIndex, from,
-               "Will try to allocate %d kB of AGP memory.\n", pVia->agpMem);
-
-    pBIOSInfo = pVia->pBIOSInfo;
-    pBIOSInfo->TVDotCrawl = FALSE;
-    from = xf86GetOptValBool(VIAOptions, OPTION_TVDOTCRAWL,
-                             &pBIOSInfo->TVDotCrawl)
-            ? X_CONFIG : X_DEFAULT;
-    xf86DrvMsg(pScrn->scrnIndex, from, "TV dotCrawl is %s.\n",
-               pBIOSInfo->TVDotCrawl ? "enabled" : "disabled");
-
-    /* TV Deflicker */
-    pBIOSInfo->TVDeflicker = 0;
-    from = xf86GetOptValInteger(VIAOptions, OPTION_TVDEFLICKER,
-                                &pBIOSInfo->TVDeflicker)
-            ? X_CONFIG : X_DEFAULT;
-    xf86DrvMsg(pScrn->scrnIndex, from, "TV deflicker is set to %d.\n",
-               pBIOSInfo->TVDeflicker);
-
-    pBIOSInfo->TVType = TVTYPE_NONE;
-    if ((s = xf86GetOptValString(VIAOptions, OPTION_TVTYPE))) {
-        if (!xf86NameCmp(s, "NTSC")) {
-            pBIOSInfo->TVType = TVTYPE_NTSC;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Type is NTSC.\n");
-        } else if (!xf86NameCmp(s, "PAL")) {
-            pBIOSInfo->TVType = TVTYPE_PAL;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Type is PAL.\n");
-        } else if (!xf86NameCmp(s, "480P")) {
-            pBIOSInfo->TVType = TVTYPE_480P;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Type is SDTV 480P.\n");
-        } else if (!xf86NameCmp(s, "576P")) {
-            pBIOSInfo->TVType = TVTYPE_576P;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Type is SDTV 576P.\n");
-        } else if (!xf86NameCmp(s, "720P")) {
-            pBIOSInfo->TVType = TVTYPE_720P;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Type is HDTV 720P.\n");
-        } else if (!xf86NameCmp(s, "1080I")) {
-            pBIOSInfo->TVType = TVTYPE_1080I;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Type is HDTV 1080i.\n");
-        }
-    } else {
-        xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, "No default TV type is set.\n");
-    }
-
-    /* TV output signal Option */
-    pBIOSInfo->TVOutput = TVOUTPUT_NONE;
-    if ((s = xf86GetOptValString(VIAOptions, OPTION_TVOUTPUT))) {
-        if (!xf86NameCmp(s, "S-Video")) {
-            pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
-                       "TV Output Signal is S-Video.\n");
-        } else if (!xf86NameCmp(s, "Composite")) {
-            pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
-                       "TV Output Signal is Composite.\n");
-        } else if (!xf86NameCmp(s, "SC")) {
-            pBIOSInfo->TVOutput = TVOUTPUT_SC;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is SC.\n");
-        } else if (!xf86NameCmp(s, "RGB")) {
-            pBIOSInfo->TVOutput = TVOUTPUT_RGB;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
-                       "TV Output Signal is RGB.\n");
-        } else if (!xf86NameCmp(s, "YCbCr")) {
-            pBIOSInfo->TVOutput = TVOUTPUT_YCBCR;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
-                       "TV Output Signal is YCbCr.\n");
-        }
-    } else {
-        xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT,
-                   "No default TV output signal type is set.\n");
-    }
-
-    VIAVidHWDiffInit(pScrn);
-
-#ifdef HAVE_DEBUG
-    //pVia->PrintVGARegs = FALSE;
-    from = xf86GetOptValBool(VIAOptions, OPTION_PRINTVGAREGS,
-                             &pVia->PrintVGARegs)
-            ? X_CONFIG : X_DEFAULT;
-    xf86DrvMsg(pScrn->scrnIndex, from, "Will %sprint VGA registers.\n",
-               pVia->PrintVGARegs ? "" : "not ");
-    if (pVia->PrintVGARegs)
-        ViaVgahwPrint(VGAHWPTR(pScrn)); /* Do this as early as possible */
-
-    pVia->I2CScan = FALSE;
-    from = xf86GetOptValBool(VIAOptions, OPTION_I2CSCAN, &pVia->I2CScan)
-            ? X_CONFIG : X_DEFAULT;
-    xf86DrvMsg(pScrn->scrnIndex, from, "Will %sscan I2C buses.\n",
-               pVia->I2CScan ? "" : "not ");
-#endif /* HAVE_DEBUG */
-
-    /* Checking for VIA Technologies NanoBook reference design.
-       Examples include Everex CloudBook and Sylvania g netbook.
-       It is also called FIC CE260 and CE261 by its ODM (Original 
-       Design Manufacturer) name.
-       This device has its strapping resistors set to a wrong 
-       setting to handle DVI. As a result, we need to make special 
-       accommodations to handle DVI properly. */
-    if ((pVia->Chipset == VIA_CX700) &&
-        (SUBVENDOR_ID(pVia->PciInfo) == 0x1509) &&
-        (SUBSYS_ID(pVia->PciInfo) == 0x2D30)) {
-
-        pVia->isVIANanoBook      = TRUE;
-    } else {
-        pVia->isVIANanoBook      = FALSE;
-    }
-
+    option = xf86NewOption(strEXAOptionName, strEXAValue);
+    xf86CollectOptions(pScrn, option);
 
-    /* Checking for OLPC XO-1.5. */
-    if ((pVia->Chipset == VIA_VX855) &&
-        (SUBVENDOR_ID(pVia->PciInfo) == 0x152D) &&
-        (SUBSYS_ID(pVia->PciInfo) == 0x0833)) {
+    viaSetupDefaultOptions(pScrn);
 
-        pVia->IsOLPCXO15      = TRUE;
-    } else {
-        pVia->IsOLPCXO15      = FALSE;
-    }
+    viaProcessOptions(pScrn);
 
-    /* I2CDevices Option for I2C Initialization */
-    if ((s = xf86GetOptValString(VIAOptions, OPTION_I2CDEVICES))) {
-        pVia->I2CDevices = 0;
-        if (strstr(s, "Bus1"))
-            pVia->I2CDevices |= VIA_I2C_BUS1;
-        if (strstr(s, "Bus2"))
-            pVia->I2CDevices |= VIA_I2C_BUS2;
-        if (strstr(s, "Bus3"))
-            pVia->I2CDevices |= VIA_I2C_BUS3;
-    }
+    VIAVidHWDiffInit(pScrn);
 
-    if (pVia->IsOLPCXO15) {
-        pVia->I2CDevices &= ~VIA_I2C_BUS2;
+    /*
+     * After viaUMSPreInit() succeeds, MMIO PCI hardware resources
+     * are memory mapped.  If there is an error from this point on,
+     * they will need to be explicitly relinquished.
+     */
+    if (!pVia->KMS) {
+        if (!viaUMSPreInit(pScrn)) {
+            goto free_rec;
+        }
     }
 
     /* CRTC handling */
@@ -1511,7 +1157,7 @@ viaPreInit(ScrnInfoPtr pScrn, int flags)
             goto fail;
         }
     } else {
-        if (!umsCrtcInit(pScrn)) {
+        if (!viaUMSCrtcInit(pScrn)) {
             goto fail;
         }
     }
@@ -1526,16 +1172,6 @@ viaPreInit(ScrnInfoPtr pScrn, int flags)
         goto fail;
     }
 
-    /* Initialize the colormap */
-    Gamma zeros = { 0.0, 0.0, 0.0 };
-    if (!xf86SetGamma(pScrn, zeros)) {
-        goto fail;
-    }
-
-    /* Set up screen parameters. */
-    pVia->Bpp = pScrn->bitsPerPixel >> 3;
-    pVia->Bpl = pScrn->virtualX * pVia->Bpp;
-
     /* Set the current mode to the first in the list */
     pScrn->currentMode = pScrn->modes;
 
@@ -1566,12 +1202,28 @@ viaPreInit(ScrnInfoPtr pScrn, int flags)
         }
     }
 
-    return TRUE;
+    /*
+     * Set up screen parameters.
+     */
+    pVia->Bpl = pScrn->virtualX * (pScrn->bitsPerPixel / 8);
 
+    if (!pVia->KMS) {
+        viaUMSPreInitExit(pScrn);
+    }
+
+    status = TRUE;
+    goto exit;
 fail:
-    viaUnmapMMIO(pScrn);
+    if (!pVia->KMS) {
+        viaUMSPreInitExit(pScrn);
+    }
+
+free_rec:
     VIAFreeRec(pScrn);
-    return FALSE;
+exit:
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
+    return status;
 }
 
 static void
@@ -1630,6 +1282,12 @@ LoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices,
     }
 }
 
+static void
+viaUpdatePacked(ScreenPtr pScreen, shadowBufPtr pBuf)
+{
+    shadowUpdatePacked(pScreen, pBuf);
+}
+
 static void *
 viaShadowWindow(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode,
 				CARD32 *size, void *closure)
@@ -1668,14 +1326,12 @@ VIACreateScreenResources(ScreenPtr pScreen)
     if (pVia->shadowFB)
         surface = pVia->ShadowPtr;
 
-    if (!pScreen->ModifyPixmapHeader(rootPixmap, pScrn->virtualX,
-                                        pScrn->virtualY, -1, -1,
-                                        pVia->drmmode.front_bo->pitch,
+    if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1,
                                         surface))
         return FALSE;
 
     if (pVia->shadowFB) {
-        if (!shadowAdd(pScreen, rootPixmap, shadowUpdatePackedWeak(),
+        if (!shadowAdd(pScreen, rootPixmap, viaUpdatePacked,
                         viaShadowWindow, 0, NULL))
             return FALSE;
     }
@@ -1695,7 +1351,9 @@ VIACloseScreen(CLOSE_SCREEN_ARGS_DECL)
     if (pVia->directRenderingType != DRI_2)
         viaExitVideo(pScrn);
 
-    viaExitAccel(pScreen);
+    if (!pVia->NoAccel) {
+        viaExitAccel(pScreen);
+    }
 
     if (pVia->ShadowPtr) {
         shadowRemove(pScreen, pScreen->GetScreenPixmap(pScreen));
@@ -1712,14 +1370,6 @@ VIACloseScreen(CLOSE_SCREEN_ARGS_DECL)
 #endif
     xf86_cursors_fini(pScreen);
 
-    for (i = 0; i < xf86_config->num_crtc; i++) {
-        xf86CrtcPtr crtc = xf86_config->crtc[i];
-        drmmode_crtc_private_ptr iga = crtc->driver_private;
-
-        if (iga->cursor_bo)
-            drm_bo_free(pScrn, iga->cursor_bo);
-    }
-
     if (pVia->drmmode.front_bo) {
 #ifdef HAVE_DRI
         if (pVia->KMS && pVia->drmmode.fb_id)
@@ -1727,9 +1377,18 @@ VIACloseScreen(CLOSE_SCREEN_ARGS_DECL)
 #endif
         pVia->drmmode.fb_id = 0;
 
+        drm_bo_unmap(pScrn, pVia->drmmode.front_bo);
         drm_bo_free(pScrn, pVia->drmmode.front_bo);
     }
 
+    for (i = 0; i < xf86_config->num_crtc; i++) {
+        xf86CrtcPtr crtc = xf86_config->crtc[i];
+        drmmode_crtc_private_ptr iga = crtc->driver_private;
+
+        if (iga->cursor_bo)
+            drm_bo_free(pScrn, iga->cursor_bo);
+    }
+
 #ifdef HAVE_DRI
     if (pVia->directRenderingType == DRI_1)
         VIADRICloseScreen(pScreen);
@@ -1744,6 +1403,10 @@ VIACloseScreen(CLOSE_SCREEN_ARGS_DECL)
     }
 #endif
 
+    if (!pVia->KMS) {
+        viaUMSDestroy(pScrn);
+    }
+
     pScrn->vtSema = FALSE;
     pScreen->CloseScreen = pVia->CloseScreen;
     return (*pScreen->CloseScreen) (CLOSE_SCREEN_ARGS);
@@ -1754,66 +1417,34 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL)
 {
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
     VIAPtr pVia = VIAPTR(pScrn);
-    int format;
+    unsigned int bppSize, alignedPitch;
+    unsigned long alignment;
+    xf86CrtcConfigPtr xf86_config;
+    struct buffer_object *bo;
+    int cursorWidth, cursorHeight, flags;
+    int cursorSize;
+    int i;
 
-    pScrn->pScreen = pScreen;
     pScrn->displayWidth = pScrn->virtualX;
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAScreenInit\n"));
-
-#ifdef HAVE_DRI
-    if (pVia->KMS) {
-        if (drmSetMaster(pVia->drmmode.fd)) {
-            xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
-                        "drmSetMaster failed: %s\n",
-                        strerror(errno));
-        }
-    }
 
-    if (pVia->drmmode.fd != -1) {
-        if (pVia->directRenderingType == DRI_1) {
-            /* DRI2 or DRI1 support */
-            if (VIADRI1ScreenInit(pScreen))
-                DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DRI1 ScreenInit commplete\n"));
-            else
-                pVia->directRenderingType = DRI_NONE;
-        }
-    }
-#endif
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
 
-    if (!drm_bo_manager_init(pScrn))
-        return FALSE;
+    pScrn->pScreen = pScreen;
 
-    format = map_legacy_formats(pScrn->bitsPerPixel, pScrn->depth);
-    pVia->drmmode.front_bo = drm_bo_alloc_surface(pScrn, pScrn->virtualX, pScrn->virtualY,
-                                                    format, 16, TTM_PL_FLAG_VRAM);
-    if (!pVia->drmmode.front_bo)
-        return FALSE;
+    miClearVisualTypes();
 
-    if (!drm_bo_map(pScrn, pVia->drmmode.front_bo))
+    if (!miSetVisualTypes(pScrn->depth,
+            (pScrn->bitsPerPixel > 8) && (!pVia->IsSecondary) ?
+                TrueColorMask : miGetDefaultVisualMask(pScrn->depth),
+            pScrn->rgbBits, pScrn->defaultVisual)) {
         return FALSE;
+    }
 
-    if (!pVia->NoAccel && !umsAccelInit(pScrn->pScreen))
+    if (!miSetPixmapDepths()) {
         return FALSE;
-
-    miClearVisualTypes();
-
-    if (pScrn->bitsPerPixel > 8 && !pVia->IsSecondary) {
-        if (!miSetVisualTypes(pScrn->depth, TrueColorMask,
-                              pScrn->rgbBits, pScrn->defaultVisual))
-            return FALSE;
-        if (!miSetPixmapDepths())
-            return FALSE;
-    } else {
-        if (!miSetVisualTypes(pScrn->depth,
-                              miGetDefaultVisualMask(pScrn->depth),
-                              pScrn->rgbBits, pScrn->defaultVisual))
-            return FALSE;
-        if (!miSetPixmapDepths())
-            return FALSE;
     }
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Visuals set up\n"));
-
     if (pVia->shadowFB) {
         int pitch = BitmapBytePad(pScrn->bitsPerPixel * pScrn->virtualX);
 
@@ -1830,9 +1461,6 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL)
                         pScrn->bitsPerPixel))
         return FALSE;
 
-    xf86SetBlackWhitePixels(pScreen);
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- B & W\n"));
-
     if (pScrn->bitsPerPixel > 8) {
         VisualPtr visual;
 
@@ -1852,54 +1480,123 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL)
     /* Must be after RGB ordering is fixed. */
     fbPictureInit(pScreen, NULL, 0);
 
-    if (!pVia->NoAccel && !viaInitExa(pScreen))
-        return FALSE;
+    if (!pVia->KMS) {
+        if (!viaUMSMapIOResources(pScrn)) {
+            return FALSE;
+        }
+    }
+
+#ifdef HAVE_DRI
+    if (pVia->KMS) {
+        if (drmSetMaster(pVia->drmmode.fd)) {
+            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                        "drmSetMaster failed: %s\n",
+                        strerror(errno));
+            return FALSE;
+        }
+    }
+
+    if (pVia->drmmode.fd != -1) {
+        if (pVia->directRenderingType == DRI_1) {
+            /* DRI2 or DRI1 support */
+            if (VIADRI1ScreenInit(pScreen))
+                DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                                    "DRI1 ScreenInit complete.\n"));
+            else
+                pVia->directRenderingType = DRI_NONE;
+        }
+    }
+#endif
+
+#ifdef HAVE_DRI
+    if (pVia->directRenderingType != DRI_2)
+#endif /* HAVE_DRI */
+    {
+        if (!viaUMSScreenInit(pScrn)) {
+            return FALSE;
+        }
+    }
+
+    if ((!pVia->NoAccel) &&
+        ((pVia->directRenderingType == DRI_NONE)
+#ifdef HAVE_DRI
+        || (pVia->directRenderingType == DRI_1)
+#endif /* HAVE_DRI */
+        )) {
+        if (!viaUMSAccelInit(pScrn)) {
+            return FALSE;
+        }
+    }
 
     xf86SetBackingStore(pScreen);
-#if 0
+
     xf86SetSilkenMouse(pScreen);
-#endif
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Backing store set up\n"));
+
+    xf86SetBlackWhitePixels(pScreen);
 
     miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- SW cursor set up\n"));
 
     if (pVia->drmmode.hwcursor) {
-        xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-        int flags = (HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
-                     HARDWARE_CURSOR_TRUECOLOR_AT_8BPP);
-        int cursorSize, size, i = 0;
+        xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
 
+        cursorWidth = cursorHeight = 64;
         switch (pVia->Chipset) {
         case VIA_CLE266:
         case VIA_KM400:
-            flags |= HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1;
-            size = 32;
-            cursorSize = ((size * size) >> 3) * 2;
+            flags = 0;
             break;
         default:
-            DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "HWCursor ARGB enabled\n"));
-            flags |= (HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 | HARDWARE_CURSOR_ARGB);
-            size = 64;
-            cursorSize = (size * size) << 2;
+            flags = HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
+                    HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
+                    HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
+                    HARDWARE_CURSOR_ARGB;
             break;
         }
 
+        cursorSize = (cursorWidth * cursorHeight) * (32 / 8);
+        alignment = 1024;
+
+        /*
+         * Set cursor location in frame buffer.
+         */
+        bo = drm_bo_alloc(pScrn, cursorSize, alignment,
+                            TTM_PL_FLAG_VRAM);
+        if (!bo) {
+            return FALSE;
+        }
+
         for (i = 0; i < xf86_config->num_crtc; i++) {
             xf86CrtcPtr crtc = xf86_config->crtc[i];
             drmmode_crtc_private_ptr iga = crtc->driver_private;
 
-            /* Set cursor location in frame buffer. */
-            iga->cursor_bo = drm_bo_alloc(pScrn, cursorSize, 16, TTM_PL_FLAG_VRAM);
+            /*
+             * Set cursor location in frame buffer.
+             */
+            iga->cursor_bo = bo;
         }
 
-        if (!xf86_cursors_init(pScreen, size, size, flags)) {
+        if (!xf86_cursors_init(pScreen,
+                                cursorWidth, cursorHeight, flags)) {
             pVia->drmmode.hwcursor = FALSE;
             xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                        "Hardware cursor initialization failed\n");
+                        "Hardware cursor initialization failed.\n");
         }
     }
 
+    bppSize = viaConvertDepthToBpp(pScrn->bitsPerPixel,
+                                        pScrn->depth);
+    alignedPitch = pScrn->virtualX * bppSize;
+    alignedPitch = ALIGN_TO(alignedPitch, 16);
+    pVia->drmmode.front_bo = drm_bo_alloc(pScrn,
+                                            alignedPitch *
+                                            pScrn->virtualY,
+                                            16, TTM_PL_FLAG_VRAM);
+    if (!pVia->drmmode.front_bo)
+        return FALSE;
+
+    if (!drm_bo_map(pScrn, pVia->drmmode.front_bo))
+        return FALSE;
+
     pScrn->vtSema = TRUE;
     pScreen->SaveScreen = xf86SaveScreen;
     pVia->CloseScreen = pScreen->CloseScreen;
@@ -1912,18 +1609,13 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL)
 
     if (!miCreateDefColormap(pScreen))
         return FALSE;
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Def Color map set up\n"));
 
     if (!xf86HandleColormaps(pScreen, 256, 8, LoadPalette, NULL,
                              CMAP_RELOAD_ON_MODE_SWITCH
                              | CMAP_PALETTED_TRUECOLOR))
         return FALSE;
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Palette loaded\n"));
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Color maps etc. set up\n"));
-
     xf86DPMSInit(pScreen, xf86DPMSSet, 0);
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- DPMS set up\n"));
 
     if (!VIAEnterVT_internal(pScrn, 1))
         return FALSE;
@@ -1932,10 +1624,12 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL)
 #ifdef HAVE_DRI
         if (pVia->directRenderingType == DRI_1) {
             if (!VIADRIFinishScreenInit(pScreen)) {
-                xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering disabled\n");
+                xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                            "Direct rendering disabled.\n");
                 pVia->directRenderingType = DRI_NONE;
             } else
-                xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering enabled\n");
+                xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                            "Direct rendering enabled.\n");
         }
 #endif
         if (!pVia->NoAccel)
@@ -1950,17 +1644,18 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL)
 #ifdef HAVE_DEBUG
     if (pVia->PrintVGARegs) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                   "VIAScreenInit: Printing VGA registers.\n");
+                    "Printing VGA registers.\n");
         ViaVgahwPrint(VGAHWPTR(pScrn));
     }
 
     if (pVia->PrintTVRegs) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                   "VIAScreenInit: Printing TV registers.\n");
+                    "Printing TV registers.\n");
         ViaTVPrintRegs(pScrn);
     }
 #endif
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Done\n"));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
     return TRUE;
 }
diff --git a/src/via_driver.h b/src/via_driver.h
index a1ad2f5..011ede7 100644
--- a/src/via_driver.h
+++ b/src/via_driver.h
@@ -27,7 +27,6 @@
 #define _VIA_DRIVER_H_ 1
 
 //#define VIA_DEBUG_COMPOSITE 1
-#define HAVE_DEBUG 1
 
 #ifdef HAVE_DEBUG
 #define DEBUG(x) x
@@ -124,12 +123,7 @@
 #define VIDEO_ENGINE_CLE    1   /* CLE First generation video engine */
 #define VIDEO_ENGINE_CME    2   /* CME Second generation video engine */
 
-static int gVIAEntityIndex = -1;
-
-typedef struct {
-    CARD8   SR[256];
-    CARD8   CR[256];
-} VIARegRec, *VIARegPtr;
+extern int gVIAEntityIndex;
 
 /*
  * variables that need to be shared among different screens.
@@ -195,8 +189,7 @@ typedef struct _twodContext {
 } ViaTwodContext;
 
 typedef struct _VIA {
-    VIARegRec           SavedReg;
-    int                 Bpp, Bpl;
+    int                 Bpl;
 
     Bool                KMS;
     Bool                FirstInit;
@@ -218,7 +211,7 @@ typedef struct _VIA {
     unsigned char*      MpegMapBase;
     unsigned char*      BltBase;
     unsigned char*      MapBaseDense;
-    unsigned char*      FBBase;
+    uint8_t*            FBBase;
     CARD8               MemClk;
 
     /* Here are all the Options */
@@ -281,22 +274,8 @@ typedef struct _VIA {
     /* Rotation */
     Bool    RandRRotation;
 
-    /* BIOS Info Ptr */
-    VIABIOSInfoPtr      pBIOSInfo;
-
-    /* VIA Technologies NanoBook reference design.
-       Examples include Everex CloudBook and Sylvania g netbook.
-       It is also called FIC CE260 and CE261 by its ODM (Original 
-       Design Manufacturer) name. */
-    Bool                isVIANanoBook;
-
-    /* OLPC XO-1.5 */
-    Bool                IsOLPCXO15;
-
-    /* I2C & DDC */
-    I2CBusPtr           pI2CBus1;
-    I2CBusPtr           pI2CBus2;
-    I2CBusPtr           pI2CBus3;
+    /* Display Record Pointer */
+    VIADisplayPtr      pVIADisplay;
 
     /* MHS */
     Bool                IsSecondary;
@@ -321,7 +300,7 @@ typedef struct _VIA {
     ViaXvMC             xvmc;
     int                 drmVerMajor;
     int                 drmVerMinor;
-    int                 drmVerPL;
+    int                 drmVerPatchLevel;
     struct buffer_object *driOffScreenMem;
     void *              driOffScreenSave;
 #endif
@@ -349,30 +328,14 @@ typedef struct _VIA {
     void                *displayMap;
     CARD32              displayOffset;
 
-    CARD8               I2CDevices;	/* Option */
-
 #ifdef HAVE_DEBUG
     Bool                disableXvBWCheck;
     Bool                DumpVGAROM;
     Bool                PrintVGARegs;
     Bool                PrintTVRegs;
-    Bool                I2CScan;
 #endif /* HAVE_DEBUG */
 
     video_via_regs*     VideoRegs;
-
-    /* Keeping track of the number of analog VGA connectors. */
-    unsigned int        numberVGA;
-
-    /* Keeping track of the number of DVI connectors. */
-    unsigned int        numberDVI;
-
-    /* Keeping track of the number of FP (Flat Panel) connectors. */
-    unsigned int        numberFP;
-
-    /* Shadow copy of CR3B through CR3F. */
-    CARD8       originalCR3B, originalCR3C, originalCR3D,
-                originalCR3E, originalCR3F;
 } VIARec, *VIAPtr;
 
 #define VIAPTR(p) ((VIAPtr)((p)->driverPrivate))
@@ -393,13 +356,21 @@ typedef struct
 } VIAEntRec, *VIAEntPtr;
 
 
-/* In via_display.c. */
-const xf86CrtcFuncsRec iga1_crtc_funcs;
-const xf86CrtcFuncsRec iga2_crtc_funcs;
+const OptionInfoRec *VIAAvailableOptions(int chipid, int busid);
+void viaSetupDefaultOptions(ScrnInfoPtr pScrn);
+void viaProcessOptions(ScrnInfoPtr pScrn);
 
 /* In via_exa.c. */
+int viaEXAOffscreenAlloc(ScrnInfoPtr pScrn,
+                            struct buffer_object *obj,
+                            unsigned long size,
+                            unsigned long alignment);
+Bool viaIsAGP(VIAPtr pVia, PixmapPtr pPix, unsigned long *offset);
+Bool viaExaIsOffscreen(PixmapPtr pPix);
 Bool viaInitExa(ScreenPtr pScreen);
 Bool viaAccelSetMode(int bpp, ViaTwodContext * tdc);
+void viaSetClippingRectangle(ScrnInfoPtr pScrn,
+                                int x1, int y1, int x2, int y2);
 void viaAccelSync(ScrnInfoPtr);
 void viaExitAccel(ScreenPtr);
 void viaFinishInitAccel(ScreenPtr);
@@ -463,23 +434,17 @@ void viaInitVideo(ScreenPtr pScreen);
 void viaExitVideo(ScrnInfoPtr pScrn);
 void viaSaveVideo(ScrnInfoPtr pScrn);
 void viaRestoreVideo(ScrnInfoPtr pScrn);
-void viaSetColorSpace(VIAPtr pVia, int hue, int saturation, int brightness, int contrast,
-		      Bool reset);
+void VIAVidAdjustFrame(ScrnInfoPtr pScrn, int x, int y);
 
 
-/* In via_xv.c */
-void viaInitVideo(ScreenPtr pScreen);
-void viaExitVideo(ScrnInfoPtr pScrn);
-void viaSaveVideo(ScrnInfoPtr pScrn);
-void viaRestoreVideo(ScrnInfoPtr pScrn);
-void viaSetColorSpace(VIAPtr pVia, int hue, int saturation, int brightness, int contrast,
-		      Bool reset);
-void VIAVidAdjustFrame(ScrnInfoPtr pScrn, int x, int y);
+/* In via_xv_overlay.c */
+void viaSetColorSpace(VIAPtr pVia, int hue, int saturation,
+                        int brightness, int contrast, Bool reset);
 
 /* In via_memcpy.c */
 typedef void (*vidCopyFunc)(unsigned char *, const unsigned char *,
                             int, int, int, int);
-extern vidCopyFunc viaVidCopyInit( char *copyType, ScreenPtr pScreen );
+extern vidCopyFunc viaVidCopyInit(const char *copyType, ScreenPtr pScreen );
 
 /* In via_xwmc.c */
 
@@ -493,11 +458,6 @@ int viaXvMCInitXv(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr XvAdapt);
 unsigned long viaXvMCPutImageSize(ScrnInfoPtr pScrn);
 #endif
 
-/* via_i2c.c */
-void ViaI2CInit(ScrnInfoPtr pScrn);
-Bool xf86I2CMaskByte(I2CDevPtr d, I2CByte subaddr,
-                        I2CByte value, I2CByte mask);
-
 #ifdef HAVE_DRI
 Bool VIADRI1ScreenInit(ScreenPtr pScreen);
 void VIADRICloseScreen(ScreenPtr pScreen);
@@ -510,11 +470,4 @@ Bool VIADRIBufferInit(ScrnInfoPtr pScrn);
 
 #endif /* HAVE_DRI */
 
-int viaOffScreenLinear(struct buffer_object *obj, ScrnInfoPtr pScrn, unsigned long size);
-void viaShowCursor(ScrnInfoPtr pScrn);
-void viaHideCursor(ScrnInfoPtr pScrn);
-Bool viaHWCursorInit(ScreenPtr pScreen);
-void ViaDisplaySetStreamOnCRT(ScrnInfoPtr pScrn, Bool primary);
-void ViaDisplaySetStreamOnDFP(ScrnInfoPtr pScrn, Bool primary);
-
 #endif /* _VIA_DRIVER_H_ */
diff --git a/src/via_exa.c b/src/via_exa.c
index 0e464ea..d2c5762 100644
--- a/src/via_exa.c
+++ b/src/via_exa.c
@@ -42,7 +42,6 @@
 #include "via_driver.h"
 #include "via_regs.h"
 #include "via_dmabuffer.h"
-#include "via_rop.h"
 
 /*
  * Use PCI MMIO to flush the command buffer when AGP DMA is not available.
@@ -62,7 +61,7 @@ viaDumpDMA(ViaCommandBuffer *cb)
     ErrorF("\n");
 }
 
-void
+static void
 viaFlushPCI(ViaCommandBuffer *cb)
 {
     register CARD32 *bp = cb->buf;
@@ -789,13 +788,73 @@ viaExaTexUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, char *src,
 
 #endif /* HAVE_DRI */
 
-#define EXAOPT_MIGRATION_HEURISTIC  0
+int
+viaEXAOffscreenAlloc(ScrnInfoPtr pScrn, struct buffer_object *obj,
+                        unsigned long size, unsigned long alignment)
+{
+    ExaOffscreenArea *pArea;
+    int newSize = size;
+    int newAlignment;
+    int ret = 0;
+
+    newAlignment = alignment;
+    pArea = exaOffscreenAlloc(pScrn->pScreen, newSize,
+                                newAlignment, TRUE, NULL, NULL);
+    if (!pArea) {
+        ret = -ENOMEM;
+        goto exit;
+    }
+
+    obj->offset = pArea->offset;
+    obj->handle = (unsigned long) pArea;
+    obj->domain = TTM_PL_FLAG_VRAM;
+    obj->size = newSize;
+
+exit:
+    return ret;
+}
+
+Bool
+viaIsAGP(VIAPtr pVia, PixmapPtr pPix, unsigned long *offset)
+{
+#ifdef HAVE_DRI
+    unsigned long offs;
+
+    if (pVia->directRenderingType && !pVia->IsPCI) {
+        offs = ((unsigned long)pPix->devPrivate.ptr
+                - (unsigned long)pVia->agpMappedAddr);
+
+        if ((offs - pVia->scratchOffset) < pVia->agpSize) {
+            *offset = offs + pVia->agpAddr;
+            return TRUE;
+        }
+    }
+#endif
+    return FALSE;
+}
+
+Bool
+viaExaIsOffscreen(PixmapPtr pPix)
+{
+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pPix->drawable.pScreen);
+    VIAPtr pVia = VIAPTR(pScrn);
+    uint8_t* addr_size;
+    uint8_t* front_bo;
+    Bool ret;
+
+    front_bo = drm_bo_map(pScrn, pVia->drmmode.front_bo);
+    addr_size = (uint8_t*)pPix->devPrivate.ptr -
+                                            (unsigned long)front_bo;
+    ret = (addr_size < (uint8_t*)pVia->drmmode.front_bo->size) ?
+                                                        TRUE : FALSE;
+    return ret;
+}
 
 Bool
 viaInitExa(ScreenPtr pScreen)
 {
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
-    ExaDriverPtr pExa = exaDriverAlloc();
+    ExaDriverPtr pExa;
     Bool nPOTSupported = TRUE;
     VIAPtr pVia = VIAPTR(pScrn);
 
@@ -817,10 +876,10 @@ viaInitExa(ScreenPtr pScreen)
         return FALSE;
     }
 
-    if (!pExa)
+    pExa = exaDriverAlloc();
+    if (!pExa) {
         return FALSE;
-
-    memset(pExa, 0, sizeof(*pExa));
+    }
 
     pExa->exa_major = EXA_VERSION_MAJOR;
     pExa->exa_minor = EXA_VERSION_MINOR;
diff --git a/src/via_exa_h2.c b/src/via_exa_h2.c
index 8ecde2b..05f0d46 100644
--- a/src/via_exa_h2.c
+++ b/src/via_exa_h2.c
@@ -41,31 +41,6 @@
 #include "via_dmabuffer.h"
 #include "via_rop.h"
 
-/*
- * Emit clipping borders to the command buffer and update the 2D context
- * current command with clipping info.
- */
-static int
-viaAccelClippingHelper_H2(VIAPtr pVia, int refY)
-{
-    ViaTwodContext *tdc = &pVia->td;
-
-    RING_VARS;
-
-    if (tdc->clipping) {
-        refY = (refY < tdc->clipY1) ? refY : tdc->clipY1;
-        tdc->cmd |= VIA_GEC_CLIP_ENABLE;
-        BEGIN_RING(4);
-        OUT_RING_H1(VIA_REG_CLIPTL,
-                    ((tdc->clipY1 - refY) << 16) | tdc->clipX1);
-        OUT_RING_H1(VIA_REG_CLIPBR,
-		    ((tdc->clipY2 - refY) << 16) | tdc->clipX2);
-    } else {
-        tdc->cmd &= ~VIA_GEC_CLIP_ENABLE;
-    }
-    return refY;
-}
-
 /*
  * Check if we can use a planeMask and update the 2D context accordingly.
  */
@@ -262,6 +237,8 @@ viaExaCopy_H2(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY,
     VIAPtr pVia = VIAPTR(pScrn);
     ViaTwodContext *tdc = &pVia->td;
 
+    RING_VARS;
+
     if (!width || !height)
         return;
 
@@ -276,8 +253,6 @@ viaExaCopy_H2(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY,
     }
     val = VIA_PITCH_ENABLE | (dstPitch >> 3) << 16 | (tdc->srcPitch >> 3);
 
-    RING_VARS;
-
     BEGIN_RING(16);
     OUT_RING_H1(VIA_REG_GEMODE, tdc->mode);
     OUT_RING_H1(VIA_REG_SRCBASE, tdc->srcOffset >> 3);
@@ -362,35 +337,6 @@ viaExaCheckComposite_H2(int op, PicturePtr pSrcPicture,
     return FALSE;
 }
 
-static Bool
-viaIsAGP(VIAPtr pVia, PixmapPtr pPix, unsigned long *offset)
-{
-#ifdef HAVE_DRI
-    unsigned long offs;
-
-    if (pVia->directRenderingType && !pVia->IsPCI) {
-        offs = ((unsigned long)pPix->devPrivate.ptr
-                - (unsigned long)pVia->agpMappedAddr);
-
-        if ((offs - pVia->scratchOffset) < pVia->agpSize) {
-            *offset = offs + pVia->agpAddr;
-            return TRUE;
-        }
-    }
-#endif
-    return FALSE;
-}
-
-static Bool
-viaExaIsOffscreen(PixmapPtr pPix)
-{
-    ScrnInfoPtr pScrn = xf86ScreenToScrn(pPix->drawable.pScreen);
-    VIAPtr pVia = VIAPTR(pScrn);
-
-    return ((unsigned long)pPix->devPrivate.ptr -
-            (unsigned long) drm_bo_map(pScrn, pVia->drmmode.front_bo)) < pVia->drmmode.front_bo->size;
-}
-
 Bool
 viaExaPrepareComposite_H2(int op, PicturePtr pSrcPicture,
                             PicturePtr pMaskPicture, PicturePtr pDstPicture,
diff --git a/src/via_exa_h6.c b/src/via_exa_h6.c
index 3e593a9..daf5c58 100644
--- a/src/via_exa_h6.c
+++ b/src/via_exa_h6.c
@@ -41,31 +41,6 @@
 #include "via_dmabuffer.h"
 #include "via_rop.h"
 
-/*
- * Emit clipping borders to the command buffer and update the 2D context
- * current command with clipping info.
- */
-static int
-viaAccelClippingHelper_H6(VIAPtr pVia, int refY)
-{
-    ViaTwodContext *tdc = &pVia->td;
-
-    RING_VARS;
-
-    if (tdc->clipping) {
-        refY = (refY < tdc->clipY1) ? refY : tdc->clipY1;
-        tdc->cmd |= VIA_GEC_CLIP_ENABLE;
-        BEGIN_RING(4);
-        OUT_RING_H1(VIA_REG_CLIPTL_M1,
-                    ((tdc->clipY1 - refY) << 16) | tdc->clipX1);
-        OUT_RING_H1(VIA_REG_CLIPBR_M1,
-		    ((tdc->clipY2 - refY) << 16) | tdc->clipX2);
-    } else {
-        tdc->cmd &= ~VIA_GEC_CLIP_ENABLE;
-    }
-    return refY;
-}
-
 /*
  * Check if we can use a planeMask and update the 2D context accordingly.
  */
@@ -263,11 +238,11 @@ viaExaCopy_H6(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY,
     VIAPtr pVia = VIAPTR(pScrn);
     ViaTwodContext *tdc = &pVia->td;
 
+    RING_VARS;
+
     if (!width || !height)
         return;
 
-    RING_VARS;
-
     if (tdc->cmd & VIA_GEC_DECY) {
         srcY += height - 1;
         dstY += height - 1;
@@ -375,35 +350,6 @@ viaExaCheckComposite_H6(int op, PicturePtr pSrcPicture,
     return FALSE;
 }
 
-static Bool
-viaIsAGP(VIAPtr pVia, PixmapPtr pPix, unsigned long *offset)
-{
-#ifdef HAVE_DRI
-    unsigned long offs;
-
-    if (pVia->directRenderingType && !pVia->IsPCI) {
-        offs = ((unsigned long)pPix->devPrivate.ptr
-                - (unsigned long)pVia->agpMappedAddr);
-
-        if ((offs - pVia->scratchOffset) < pVia->agpSize) {
-            *offset = offs + pVia->agpAddr;
-            return TRUE;
-        }
-    }
-#endif
-    return FALSE;
-}
-
-static Bool
-viaExaIsOffscreen(PixmapPtr pPix)
-{
-    ScrnInfoPtr pScrn = xf86ScreenToScrn(pPix->drawable.pScreen);
-    VIAPtr pVia = VIAPTR(pScrn);
-
-    return ((unsigned long)pPix->devPrivate.ptr -
-            (unsigned long) drm_bo_map(pScrn, pVia->drmmode.front_bo)) < pVia->drmmode.front_bo->size;
-}
-
 Bool
 viaExaPrepareComposite_H6(int op, PicturePtr pSrcPicture,
                             PicturePtr pMaskPicture, PicturePtr pDstPicture,
diff --git a/src/via_fp.c b/src/via_fp.c
index dea6ec9..91ef73d 100644
--- a/src/via_fp.c
+++ b/src/via_fp.c
@@ -1,8 +1,9 @@
 /*
- * Copyright 2007-2015 The Openchrome Project
+ * Copyright 2017-2018 Kevin Brace. All Rights Reserved.
+ * Copyright 2007-2015 The OpenChrome Project
  *                     [https://www.freedesktop.org/wiki/Openchrome]
- * Copyright 1998-2007 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2007 S3 Graphics, Inc. All Rights Reserved.
+ * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
+ * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -33,21 +34,8 @@
 #endif
 
 #include "via_driver.h"
-#include "via_mode.h"
 #include <unistd.h>
-
-/*
- * Option handling.
- */
-enum ViaPanelOpts {
-    OPTION_CENTER
-};
-
-static OptionInfoRec ViaPanelOptions[] =
-{
-    {OPTION_CENTER,     "Center",       OPTV_BOOLEAN,   {0},    FALSE},
-    {-1,                NULL,           OPTV_NONE,      {0},    FALSE}
-};
+#include "via_fp.h"
 
 /* These table values were copied from lcd.c of VIA Frame 
  * Buffer device driver. */
@@ -63,7 +51,7 @@ static ViaPanelModeRec ViaPanelNativeModes[] = {
     {1280,  800, FALSE,  TRUE},
     { 800,  480, FALSE,  TRUE},
     {1024,  768,  TRUE,  TRUE},
-    {1024,  768, FALSE, FALSE},
+    {1366,  768, FALSE, FALSE},
     {1024,  768,  TRUE, FALSE},
     {1280,  768, FALSE, FALSE},
     {1280, 1024,  TRUE, FALSE},
@@ -106,726 +94,557 @@ static DisplayModeRec OLPCMode = {
 #define TD3 25
 
 /*
- * Sets CX700 or later single chipset's LVDS1 I/O pad state.
+ * This software controlled FP power on / off sequence code is
+ * for CLE266's IGP which was codenamed Castle Rock. The code is
+ * untested. The turn on sequence and register access likely
+ * originated from the code VIA Technologies made open source around
+ * Year 2004.
  */
-void
-viaLVDS1SetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState)
+static void
+viaFPCastleRockSoftPowerSeq(ScrnInfoPtr pScrn, Bool powerState)
 {
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaLVDS1SetIOPadSetting.\n"));
+                        "Entered viaFPCastleRockSoftPowerSeq.\n"));
 
-    /* Set LVDS1 I/O pad state. */
-    /* 3C5.2A[1:0] - LVDS1 I/O Pad Control */
-    ViaSeqMask(hwp, 0x2A, ioPadState, 0x03);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "LVDS1 I/O Pad State: %d\n",
-                (ioPadState & 0x03));
+    if (powerState) {
+        /* Wait for 25 ms. */
+        usleep(25);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaLVDS1SetIOPadSetting.\n"));
-}
+        /* Turn on FP VDD rail. */
+        viaFPSetPrimarySoftVDD(pScrn, TRUE);
 
-/*
- * Sets IGA1 or IGA2 as the display output source for VIA Technologies
- * Chrome IGP LVDS1 integrated LVDS transmitter.
- */
-static void
-viaLVDS1SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    CARD8 temp = displaySource;
+        /* Wait for 510 ms. */
+        usleep(510);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaLVDS1SetDisplaySource.\n"));
+        /* Turn on FP data transmission. */
+        viaFPSetPrimarySoftData(pScrn, TRUE);
 
-    /* Set LVDS1 integrated LVDS transmitter display output source. */
-    /* 3X5.99[4] - LVDS Channel 1 Data Source Selection
-     *             0: Primary Display
-     *             1: Secondary Display */
-    ViaCrtcMask(hwp, 0x99, temp << 4, 0x10);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "LVDS1 Integrated LVDS Transmitter Display Output "
-                "Source: IGA%d\n",
-                (temp & 0x01) + 1);
+        /* Wait for 1 ms. */
+        usleep(1);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaLVDS1SetDisplaySource.\n"));
-}
+        /* Turn on FP VEE rail. */
+        viaFPSetPrimarySoftVEE(pScrn, TRUE);
 
-/*
- * Sets LVDS1 (LVDS Channel 1) integrated LVDS transmitter format.
- */
-static void
-viaLVDS1SetFormat(ScrnInfoPtr pScrn, CARD8 format)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
+        /* Turn on FP back light. */
+        viaFPSetPrimarySoftBackLight(pScrn, TRUE);
+    } else {
+        /* Wait for 1 ms. */
+        usleep(1);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaLVDS1SetFormat.\n"));
+        /* Turn off FP back light. */
+        viaFPSetPrimarySoftBackLight(pScrn, FALSE);
 
-    /* Set LVDS1 format. */
-    /* 3X5.D2[1] - LVDS Channel 1 Format Selection
-     *             0: SPWG Mode
-     *             1: OPENLDI Mode */
-    ViaCrtcMask(hwp, 0xD2, format << 1, 0x02);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "LVDS1 Format: %s\n",
-                (format & 0x01) ? "OPENLDI" : "SPWG");
+        /* Turn off FP VEE rail. */
+        viaFPSetPrimarySoftVEE(pScrn, FALSE);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaLVDS1SetFormat.\n"));
-}
+        /* Wait for 510 ms. */
+        usleep(510);
 
-/*
- * Sets CX700 or later single chipset's LVDS2 I/O pad state.
- */
-static void
-viaLVDS2SetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
+        /* Turn off FP data transmission. */
+        viaFPSetPrimarySoftData(pScrn, FALSE);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaLVDS2SetIOPadSetting.\n"));
+        /* Wait for 25 ms. */
+        usleep(25);
 
-    /* Set LVDS2 I/O pad state. */
-    /* 3C5.2A[3:2] - LVDS2 I/O Pad Control */
-    ViaSeqMask(hwp, 0x2A, ioPadState << 2, 0x0C);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "LVDS2 I/O Pad State: %d\n",
-                (ioPadState & 0x03));
+        /* Turn off FP VDD rail. */
+        viaFPSetPrimarySoftVDD(pScrn, FALSE);
+    }
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaLVDS2SetIOPadSetting.\n"));
+                        "Exiting viaFPCastleRockSoftPowerSeq.\n"));
 }
 
-/*
- * Sets IGA1 or IGA2 as the display output source for VIA Technologies
- * Chrome IGP LVDS2 integrated LVDS transmitter.
- */
 static void
-viaLVDS2SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
+viaFPPrimarySoftPowerSeq(ScrnInfoPtr pScrn, Bool powerState)
 {
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    CARD8 temp = displaySource;
-
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaLVDS2SetDisplaySource.\n"));
+                        "Entered viaFPPrimarySoftPowerSeq.\n"));
 
-    /* Set LVDS2 integrated LVDS transmitter display output source. */
-    /* 3X5.97[4] - LVDS Channel 2 Data Source Selection
-     *             0: Primary Display
-     *             1: Secondary Display */
-    ViaCrtcMask(hwp, 0x97, temp << 4, 0x10);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "LVDS2 Integrated LVDS Transmitter Display Output "
-                "Source: IGA%d\n",
-                (temp & 0x01) + 1);
+    /* Turn off FP hardware power sequence. */
+    viaFPSetPrimaryHardPower(pScrn, FALSE);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaLVDS2SetDisplaySource.\n"));
-}
+    /* Use software FP power sequence control. */
+    viaFPSetPrimaryPowerSeqType(pScrn, FALSE);
 
-/*
- * Sets LVDS2 (LVDS Channel 2) integrated LVDS transmitter delay tap.
- */
-static void
-viaLVDS2SetDelayTap(ScrnInfoPtr pScrn, CARD8 delayTap)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
+    if (powerState) {
+        /* Turn on FP Display Period. */
+        viaFPSetPrimaryDirectDisplayPeriod(pScrn, TRUE);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaLVDS2SetDelayTap.\n"));
+        /* Wait for TD0 ms. */
+        usleep(TD0);
 
-    /* Set LVDS2 delay tap. */
-    /* 3X5.97[3:0] - LVDS2 Delay Tap */
-    ViaCrtcMask(hwp, 0x97, delayTap, 0x0F);
+        /* Turn on FP VDD rail. */
+        viaFPSetPrimarySoftVDD(pScrn, TRUE);
 
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "LVDS2 Delay Tap: %d\n",
-                (delayTap & 0x0F));
+        /* Wait for TD1 ms. */
+        usleep(TD1);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaLVDS2SetDelayTap.\n"));
-}
+        /* Turn on FP data transmission. */
+        viaFPSetPrimarySoftData(pScrn, TRUE);
 
-/*
- * Sets LVDS2 (LVDS Channel 2) integrated LVDS transmitter format.
- */
-static void
-viaLVDS2SetFormat(ScrnInfoPtr pScrn, CARD8 format)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
+        /* Wait for TD2 ms. */
+        usleep(TD2);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaLVDS2SetFormat.\n"));
+        /* Turn on FP VEE rail. */
+        viaFPSetPrimarySoftVEE(pScrn, TRUE);
 
-    /* Set LVDS2 format. */
-    /* 3X5.D2[0] - LVDS Channel 2 Format Selection
-     *             0: SPWG Mode
-     *             1: OPENLDI Mode */
-    ViaCrtcMask(hwp, 0xD2, format, 0x01);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "LVDS2 Format: %s\n",
-                (format & 0x01) ? "OPENLDI" : "SPWG");
+        /* Wait for TD3 ms. */
+        usleep(TD3);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaLVDS2SetFormat.\n"));
-}
+        /* Turn on FP back light. */
+        viaFPSetPrimarySoftBackLight(pScrn, TRUE);
+    } else {
+        /* Turn off FP back light. */
+        viaFPSetPrimarySoftBackLight(pScrn, FALSE);
 
-/*
- * Sets IGA1 or IGA2 as the display output source for VIA Technologies
- * Chrome IGP DFP (Digital Flat Panel) High interface.
- */
-static void
-viaDFPHighSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    CARD8 temp = displaySource;
+        /* Wait for TD3 ms. */
+        usleep(TD3);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDFPHighSetDisplaySource.\n"));
+        /* Turn off FP VEE rail. */
+        viaFPSetPrimarySoftVEE(pScrn, FALSE);
 
-    /* Set DFP High display output source. */
-    /* 3X5.97[4] - DFP High Data Source Selection
-     *             0: Primary Display
-     *             1: Secondary Display */
-    ViaCrtcMask(hwp, 0x97, temp << 4, 0x10);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DFP High Display Output Source: IGA%d\n",
-                (temp & 0x01) + 1);
+        /* Wait for TD2 ms. */
+        usleep(TD2);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDFPHighSetDisplaySource.\n"));
-}
+        /* Turn off FP data transmission. */
+        viaFPSetPrimarySoftData(pScrn, FALSE);
 
-/*
- * Sets DFP (Digital Flat Panel) Low interface delay tap.
- */
-static void
-viaDFPLowSetDelayTap(ScrnInfoPtr pScrn, CARD8 delayTap)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
+        /* Wait for TD1 ms. */
+        usleep(TD1);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDFPLowSetDelayTap.\n"));
+        /* Turn off FP VDD rail. */
+        viaFPSetPrimarySoftVDD(pScrn, FALSE);
 
-    /* Set DFP Low interface delay tap. */
-    /* 3X5.99[3:0] - DFP Low Delay Tap */
-    ViaCrtcMask(hwp, 0x99, delayTap, 0x0F);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DFP Low Delay Tap: %d\n",
-                (delayTap & 0x0F));
+        /* Turn off FP Display Period. */
+        viaFPSetPrimaryDirectDisplayPeriod(pScrn, FALSE);
+    }
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDFPLowSetDelayTap.\n"));
+                        "Exiting viaFPPrimarySoftPowerSeq.\n"));
 }
 
-/*
- * Sets DFP (Digital Flat Panel) High interface delay tap.
- */
 static void
-viaDFPHighSetDelayTap(ScrnInfoPtr pScrn, CARD8 delayTap)
+viaFPSecondarySoftPowerSeq(ScrnInfoPtr pScrn, Bool powerState)
 {
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDFPHighSetDelayTap.\n"));
+                        "Entered viaFPSecondarySoftPowerSeq.\n"));
 
-    /* Set DFP High interface delay tap. */
-    /* 3X5.97[3:0] - DFP High Delay Tap */
-    ViaCrtcMask(hwp, 0x97, delayTap, 0x0F);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DFP High Delay Tap: %d\n",
-                (delayTap & 0x0F));
+    /* Turn off hardware power sequence. */
+    viaFPSetSecondaryHardPower(pScrn, FALSE);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDFPHighSetDelayTap.\n"));
-}
+    /* Use software FP power sequence control. */
+    viaFPSetSecondaryPowerSeqType(pScrn, FALSE);
 
-/*
- * Turns LVDS2 output color dithering on or off. (18-bit color display vs.
- * 24-bit color display)
- */
-static void
-viaLVDS2SetDithering(ScrnInfoPtr pScrn, CARD8 ditheringStatus)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
+    if (powerState) {
+        /* Turn on FP display period. */
+        viaFPSetSecondaryDirectDisplayPeriod(pScrn, TRUE);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaLVDS2SetDithering.\n"));
+        /* Wait for TD0 ms. */
+        usleep(TD0);
 
-    /* Set LVDS2 output color dithering bit. */
-    /* 3X5.D4[6] - LVDS Channel 2 Output Bits
-     *             0: 24 bits (dithering off)
-     *             1: 18 bits (dithering on) */
-    ViaCrtcMask(hwp, 0xD4, ditheringStatus ? 0x40 : 0x00, 0x40);
+        /* Turn on FP VDD rail. */
+        viaFPSetSecondarySoftVDD(pScrn, TRUE);
 
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "LVDS2 Output Color Dithering: %s\n",
-                ditheringStatus ? "On (18 bit)" : "Off (24 bit)");
+        /* Wait for TD1 ms. */
+        usleep(TD1);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaLVDS2SetDithering.\n"));
-}
+        /* Turn on FP data transmission. */
+        viaFPSetSecondarySoftData(pScrn, TRUE);
 
-/*
- * Sets output format of LVDS2 to rotation or sequential mode.
- */
-static void
-viaLVDS2SetOutputFormat(ScrnInfoPtr pScrn, CARD8 outputFormat)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
+        /* Wait for TD2 ms. */
+        usleep(TD2);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaLVDS2SetOutputFormat.\n"));
+        /* Turn on FP VEE rail. */
+        viaFPSetSecondarySoftVEE(pScrn, TRUE);
 
-    /* Set LVDS2 output format. */
-    /* 3X5.D4[7] - LVDS Channel 2 Output Format
-     *             0: Rotation
-     *             1: Sequential */
-    ViaCrtcMask(hwp, 0xD4, outputFormat ? 0x80 : 0x00, 0x80);
+        /* Wait for TD3 ms. */
+        usleep(TD3);
 
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "LVDS2 Output Format: %s\n",
-                outputFormat ? "Sequential" : "Rotation");
+        /* Turn on FP back light. */
+        viaFPSetSecondarySoftBackLight(pScrn, TRUE);
+    } else {
+        /* Turn off FP back light. */
+        viaFPSetSecondarySoftBackLight(pScrn, FALSE);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaLVDS2SetOutputFormat.\n"));
-}
+        /* Wait for TD3 ms. */
+        usleep(TD3);
 
-/*
- * Sets PCIe based 2 chip chipset's pin multiplexed DVP0 I/O pad state.
- */
-static void
-viaDVP0PCIeSetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
+        /* Turn off FP VEE rail. */
+        viaFPSetSecondarySoftVEE(pScrn, FALSE);
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDVP0PCIeSetIOPadSetting.\n"));
+        /* Wait for TD2 ms. */
+        usleep(TD2);
 
-    /* Set pin multiplexed DVP1 I/O pad state. */
-    /* 3C5.2A[3:2] - DVP0 I/O Pad Control */
-    ViaSeqMask(hwp, 0x2A, ioPadState << 2, 0x0C);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DVP0 I/O Pad State: %d\n",
-                (ioPadState & 0x03));
+        /* Turn off FP data transmission. */
+        viaFPSetSecondarySoftData(pScrn, FALSE);
+
+        /* Wait for TD1 ms. */
+        usleep(TD1);
+
+        /* Turn off FP VDD rail. */
+        viaFPSetSecondarySoftVDD(pScrn, FALSE);
+
+        /* Turn off FP display period. */
+        viaFPSetSecondaryDirectDisplayPeriod(pScrn, FALSE);
+    }
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDVP0PCIeSetIOPadSetting.\n"));
+                        "Exiting viaFPSecondarySoftPowerSeq.\n"));
 }
 
-/*
- * Sets PCIe based 2 chip chipset's pin multiplexed DVP1 I/O pad state.
- */
 static void
-viaDVP1PCIeSetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState)
+viaFPPrimaryHardPowerSeq(ScrnInfoPtr pScrn, Bool powerState)
 {
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDVP1PCIeSetIOPadSetting.\n"));
+                        "Entered viaFPPrimaryHardPowerSeq.\n"));
 
-    /* Set pin multiplexed DVP0 I/O pad state. */
-    /* 3C5.2A[1:0] - DVP1 I/O Pad Control */
-    ViaSeqMask(hwp, 0x2A, ioPadState, 0x03);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DVP1 I/O Pad State: %d\n",
-                (ioPadState & 0x03));
+    /* Use hardware FP power sequence control. */
+    viaFPSetPrimaryPowerSeqType(pScrn, TRUE);
+
+    if (powerState) {
+        /* Turn on FP display period. */
+        viaFPSetPrimaryDirectDisplayPeriod(pScrn, TRUE);
+
+        /* Turn on FP hardware power sequence. */
+        viaFPSetPrimaryHardPower(pScrn, TRUE);
+
+        /* Turn on FP back light. */
+        viaFPSetPrimaryDirectBackLightCtrl(pScrn, TRUE);
+
+    } else {
+        /* Turn off FP back light. */
+        viaFPSetPrimaryDirectBackLightCtrl(pScrn, FALSE);
+
+        /* Turn off FP hardware power sequence. */
+        viaFPSetPrimaryHardPower(pScrn, FALSE);
+
+        /* Turn on FP display period. */
+        viaFPSetPrimaryDirectDisplayPeriod(pScrn, FALSE);
+    }
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDVP1PCIeSetIOPadSetting.\n"));
+                        "Entered viaFPPrimaryHardPowerSeq.\n"));
 }
 
 static void
-viaFPIOPadSetting(ScrnInfoPtr pScrn, Bool ioPadOn)
+viaFPSecondaryHardPowerSeq(ScrnInfoPtr pScrn, Bool powerState)
 {
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    VIAPtr pVia = VIAPTR(pScrn);
-    CARD8 sr12, sr13, sr5a;
-
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaFPIOPadSetting.\n"));
+                        "Entered viaFPSecondaryHardPowerSeq.\n"));
 
-    if ((pVia->Chipset == VIA_CX700)
-        || (pVia->Chipset == VIA_VX800)
-        || (pVia->Chipset == VIA_VX855)
-        || (pVia->Chipset == VIA_VX900)) {
+    /* Use hardware FP power sequence control. */
+    viaFPSetSecondaryPowerSeqType(pScrn, TRUE);
 
-        sr5a = hwp->readSeq(hwp, 0x5A);
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "SR5A: 0x%02X\n", sr5a));
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "Setting 3C5.5A[0] to 0.\n"));
-        ViaSeqMask(hwp, 0x5A, sr5a & 0xFE, 0x01);
+    if (powerState) {
+        /* Turn on FP display period. */
+        viaFPSetSecondaryDirectDisplayPeriod(pScrn, TRUE);
+
+        /* Turn on FP hardware power sequence. */
+        viaFPSetSecondaryHardPower(pScrn, TRUE);
+
+        /* Turn on FP back light. */
+        viaFPSetSecondaryDirectBackLightCtrl(pScrn, TRUE);
+    } else {
+        /* Turn off FP back light. */
+        viaFPSetSecondaryDirectBackLightCtrl(pScrn, FALSE);
+
+        /* Turn off FP hardware power sequence. */
+        viaFPSetSecondaryHardPower(pScrn, FALSE);
+
+        /* Turn off FP display period. */
+        viaFPSetSecondaryDirectDisplayPeriod(pScrn, FALSE);
     }
 
-    sr12 = hwp->readSeq(hwp, 0x12);
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "SR12: 0x%02X\n", sr12));
-    sr13 = hwp->readSeq(hwp, 0x13);
+                        "Exiting viaFPSecondaryHardPowerSeq.\n"));
+}
+
+static void
+viaFPPower(ScrnInfoPtr pScrn, int Chipset, uint32_t diPort,
+            Bool powerState)
+{
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "SR13: 0x%02X\n", sr13));
+                        "Entered viaFPPower.\n"));
 
-    switch (pVia->Chipset) {
+    switch (Chipset) {
     case VIA_CLE266:
+        viaFPCastleRockSoftPowerSeq(pScrn, powerState);
         break;
     case VIA_KM400:
-    case VIA_K8M800:
-    case VIA_PM800:
     case VIA_P4M800PRO:
-        break;
+    case VIA_PM800:
+    case VIA_K8M800:
     case VIA_P4M890:
     case VIA_K8M890:
     case VIA_P4M900:
-        /* The tricky thing about VIA Technologies PCI Express based
-         * north bridge / south bridge 2 chip chipset is that
-         * it pin multiplexes DVP0 / DVP1 with north bridge's PCI
-         * Express x16 link. In particular, HP 2133 Mini-Note's WLAN
-         * is connected to north bridge's PCI Express Lane 0, but the
-         * Lane 0 is also pin multiplexed with DVP0. What this means is
-         * turning on DVP0 without probing the relevant strapping pin
-         * to determine the connected panel interface type will lead to
-         * the PCIe based WLAN to getting disabled by OpenChrome DDX
-         * when X.Org Server starts.
-         *     The current remedy for this will be to turn on DVP0
-         * only when an 18-bit / 24-bit interface flat panel is 
-         * connected. */
-        /* 3C5.12[4] - DVP0D4 pin strapping
-         *             0: Use DVP1 only for a flat panel.
-         *             1: Use DVP0 and DVP1 for a flat panel */
-        if (sr12 & 0x10) {
-            /* Since an 18-bit / 24-bit flat panel is being used, actively
-             * control DVP0. */
-            viaDVP0PCIeSetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00);
-        } else {
-            /* Keep DVP0 powered down. Otherwise, it will interfere with
-             * PCIe Lane 0 through 7. */
-            viaDVP0PCIeSetIOPadSetting(pScrn, 0x00);
-        }
-
-        /* Control DVP1 for a flat panel. */
-        viaDVP1PCIeSetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00);
+        viaFPPrimaryHardPowerSeq(pScrn, powerState);
         break;
     case VIA_CX700:
     case VIA_VX800:
-    case VIA_VX855:
-    case VIA_VX900:
-        /* 3C5.13[7:6] - DVP1D15 and DVP1D14 pin strappings
-         *               00: LVDS1 + LVDS2
-         *               01: DVI + LVDS2
-         *               10: Dual LVDS (LVDS1 + LVDS2 used 
-         *                   simultaneously)
-         *               11: DVI only */
-        if ((((~(sr13 & 0x80)) && (~(sr13 & 0x40)))
-             || ((sr13 & 0x80) && (~(sr13 & 0x40))))
-           && (!pVia->isVIANanoBook)) {
-
-            viaLVDS1SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00);
+        /*
+         * VX800, CX700 have HW issue, so we'd better use SW power sequence.
+         * Fix Ticket #308.
+         */
+        if (diPort & VIA_DI_PORT_LVDS1) {
+            viaFPPrimarySoftPowerSeq(pScrn, powerState);
+            viaLVDS1SetPower(pScrn, powerState);
         }
 
-        if (((~(sr13 & 0x80)) || (~(sr13 & 0x40))) 
-           || (pVia->isVIANanoBook)) {
-
-            viaLVDS2SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00);
+        if (diPort & VIA_DI_PORT_LVDS2) {
+            viaFPSecondarySoftPowerSeq(pScrn, powerState);
+            viaLVDS2SetPower(pScrn, powerState);
         }
+
+        break;
+    case VIA_VX855:
+    case VIA_VX900:
+        viaFPPrimaryHardPowerSeq(pScrn, powerState);
+        viaLVDS1SetPower(pScrn, powerState);
         break;
     default:
         break;
     }
 
-    if ((pVia->Chipset == VIA_CX700)
-        || (pVia->Chipset == VIA_VX800)
-        || (pVia->Chipset == VIA_VX855)
-        || (pVia->Chipset == VIA_VX900)) {
-
-        hwp->writeSeq(hwp, 0x5A, sr5a);
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "Restoring 3C5.5A[0].\n"));
-    }
-
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaFPIOPadSetting.\n"));
+                        "Exiting viaFPPower.\n"));
 }
 
 static void
-ViaLVDSSoftwarePowerFirstSequence(ScrnInfoPtr pScrn, Bool on)
+viaFPIOPadState(ScrnInfoPtr pScrn, uint32_t diPort, Bool ioPadOn)
 {
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaLVDSSoftwarePowerFirstSequence: %d\n", on));
-    if (on) {
-
-        /* Software control power sequence ON*/
-        hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0x7F);
-        hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) | 0x01);
-        usleep(TD0);
-
-        /* VDD ON*/
-        hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) | 0x10);
-        usleep(TD1);
-
-        /* DATA ON */
-        hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) | 0x08);
-        usleep(TD2);
-
-        /* VEE ON (unused on vt3353)*/
-        hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) | 0x04);
-        usleep(TD3);
-
-        /* Back-Light ON */
-        hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) | 0x02);
-    } else {
-        /* Back-Light OFF */
-        hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0xFD);
-        usleep(TD3);
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaFPIOPadState.\n"));
 
-        /* VEE OFF (unused on vt3353)*/
-        hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0xFB);
-        usleep(TD2);
+    switch(diPort) {
+    case VIA_DI_PORT_DVP0:
+        viaDVP0SetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    case VIA_DI_PORT_DVP1:
+        viaDVP1SetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    case VIA_DI_PORT_FPDPLOW:
+        viaFPDPLowSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    case VIA_DI_PORT_FPDPHIGH:
+        viaFPDPHighSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    case (VIA_DI_PORT_FPDPLOW |
+          VIA_DI_PORT_FPDPHIGH):
+        viaFPDPLowSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00);
+        viaFPDPHighSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    case VIA_DI_PORT_LVDS1:
+        viaLVDS1SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    case VIA_DI_PORT_LVDS2:
+        viaLVDS2SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    case (VIA_DI_PORT_LVDS1 |
+          VIA_DI_PORT_LVDS2):
+        viaLVDS1SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00);
+        viaLVDS2SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    default:
+        break;
+    }
 
-        /* DATA OFF */
-        hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0xF7);
-        usleep(TD1);
+    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                "FP I/O Pad: %s\n",
+                ioPadOn ? "On": "Off");
 
-        /* VDD OFF */
-        hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0xEF);
-    }
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaFPIOPadState.\n"));
 }
 
 static void
-ViaLVDSSoftwarePowerSecondSequence(ScrnInfoPtr pScrn, Bool on)
+viaFPFormat(ScrnInfoPtr pScrn, uint32_t diPort, CARD8 format)
 {
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaLVDSSoftwarePowerSecondSequence: %d\n", on));
-    if (on) {
-        /* Secondary power hardware power sequence enable 0:off 1: on */
-        hwp->writeCrtc(hwp, 0xD4, hwp->readCrtc(hwp, 0xD4) & 0xFD);
-
-        /* Software control power sequence ON */
-        hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) | 0x01);
-        usleep(TD0);
-
-        /* VDD ON*/
-        hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) | 0x10);
-        usleep(TD1);
-
-        /* DATA ON */
-        hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) | 0x08);
-        usleep(TD2);
-
-        /* VEE ON (unused on vt3353)*/
-        hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) | 0x04);
-        usleep(TD3);
-
-        /* Back-Light ON */
-        hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) | 0x02);
-    } else {
-        /* Back-Light OFF */
-        hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) & 0xFD);
-        usleep(TD3);
-
-        /* VEE OFF */
-        hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) & 0xFB);
-        /* Delay TD2 msec. */
-        usleep(TD2);
+    CARD8 temp = format & 0x01;
 
-        /* DATA OFF */
-        hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) & 0xF7);
-        /* Delay TD1 msec. */
-        usleep(TD1);
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaFPFormat.\n"));
 
-        /* VDD OFF */
-        hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) & 0xEF);
+    switch(diPort) {
+    case VIA_DI_PORT_LVDS1:
+        viaLVDS1SetFormat(pScrn, temp);
+        break;
+    case VIA_DI_PORT_LVDS2:
+        viaLVDS2SetFormat(pScrn, temp);
+        break;
+    case (VIA_DI_PORT_LVDS1 |
+          VIA_DI_PORT_LVDS2):
+        viaLVDS1SetFormat(pScrn, temp);
+        viaLVDS2SetFormat(pScrn, temp);
+        break;
+    default:
+        break;
     }
-}
-
 
-static void
-ViaLVDSHardwarePowerFirstSequence(ScrnInfoPtr pScrn, Bool on)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    if (on) {
-        /* Use hardware control power sequence. */
-        hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0xFE);
-        /* Turn on back light. */
-        hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0x3F);
-        /* Turn on hardware power sequence. */
-        hwp->writeCrtc(hwp, 0x6A, hwp->readCrtc(hwp, 0x6A) | 0x08);
-    } else {
-        /* Turn off power sequence. */
-        hwp->writeCrtc(hwp, 0x6A, hwp->readCrtc(hwp, 0x6A) & 0xF7);
-        usleep(1);
-        /* Turn off back light. */
-        hwp->writeCrtc(hwp, 0x91, 0xC0);
-    }
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaFPFormat.\n"));
 }
 
 static void
-ViaLVDSHardwarePowerSecondSequence(ScrnInfoPtr pScrn, Bool on)
+viaFPOutputFormat(ScrnInfoPtr pScrn, uint32_t diPort, CARD8 outputFormat)
 {
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    if (on) {
-        /* Use hardware control power sequence. */
-        hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) & 0xFE);
-        /* Turn on back light. */
-        hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) & 0x3F);
-        /* Turn on hardware power sequence. */
-        hwp->writeCrtc(hwp, 0xD4, hwp->readCrtc(hwp, 0xD4) | 0x02);
-    } else {
-        /* Turn off power sequence. */
-        hwp->writeCrtc(hwp, 0xD4, hwp->readCrtc(hwp, 0xD4) & 0xFD);
-        usleep(1);
-        /* Turn off back light. */
-        hwp->writeCrtc(hwp, 0xD3, 0xC0);
-    }
-}
+    CARD8 temp = outputFormat & 0x01;
 
-static void
-ViaLVDSPowerChannel(ScrnInfoPtr pScrn, Bool on)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    CARD8 lvdsMask;
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaFPOutputFormat.\n"));
 
-    if (on) {
-        /* LVDS0: 0x7F, LVDS1: 0xBF */
-        lvdsMask = 0x7F & 0xBF;
-        hwp->writeCrtc(hwp, 0xD2, hwp->readCrtc(hwp, 0xD2) & lvdsMask);
-    } else {
-        /* LVDS0: 0x80, LVDS1: 0x40 */
-        lvdsMask = 0x80 | 0x40;
-        hwp->writeCrtc(hwp, 0xD2, hwp->readCrtc(hwp, 0xD2) | lvdsMask);
+    switch(diPort) {
+    case VIA_DI_PORT_LVDS1:
+        viaLVDS1SetOutputFormat(pScrn, temp);
+        break;
+    case VIA_DI_PORT_LVDS2:
+        viaLVDS2SetOutputFormat(pScrn, temp);
+        break;
+    case (VIA_DI_PORT_LVDS1 |
+          VIA_DI_PORT_LVDS2):
+        viaLVDS1SetOutputFormat(pScrn, temp);
+        viaLVDS2SetOutputFormat(pScrn, temp);
+        break;
+    default:
+        break;
     }
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaFPOutputFormat.\n"));
 }
 
 static void
-ViaLVDSPower(ScrnInfoPtr pScrn, Bool Power_On)
+viaFPDithering(ScrnInfoPtr pScrn, uint32_t diPort, Bool dithering)
 {
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    VIAPtr pVia = VIAPTR(pScrn);
-    CARD8 crd2;
-
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered ViaLVDSPower.\n"));
+                        "Entered viaFPDithering.\n"));
 
-    /*
-     * VX800, CX700 have HW issue, so we'd better use SW power sequence
-     * Fix Ticket #308
-     */
-    switch (pVia->Chipset) {
-    case VIA_CX700:
-    case VIA_VX800:
-
-        /* Is the integrated TMDS transmitter (DVI) not in use? */
-        crd2 = hwp->readCrtc(hwp, 0xD2);
-        if (((pVia->Chipset == VIA_CX700)
-                || (pVia->Chipset == VIA_VX800)
-                || (pVia->Chipset == VIA_VX855)
-                || (pVia->Chipset == VIA_VX900))
-            && (!(crd2 & 0x10))) {
-            ViaLVDSSoftwarePowerFirstSequence(pScrn, Power_On);
-        }
-
-        ViaLVDSSoftwarePowerSecondSequence(pScrn, Power_On);
+    switch(diPort) {
+    case VIA_DI_PORT_LVDS1:
+        viaLVDS1SetDithering(pScrn, dithering);
         break;
-
-    case VIA_VX855:
-    case VIA_VX900:
-        /* Is the integrated TMDS transmitter (DVI) not in use? */
-        crd2 = hwp->readCrtc(hwp, 0xD2);
-        if (((pVia->Chipset == VIA_CX700)
-                || (pVia->Chipset == VIA_VX800)
-                || (pVia->Chipset == VIA_VX855)
-                || (pVia->Chipset == VIA_VX900))
-            && (!(crd2 & 0x10))) {
-            ViaLVDSHardwarePowerFirstSequence(pScrn, Power_On);
-        }
-
-        ViaLVDSHardwarePowerSecondSequence(pScrn, Power_On);
+    case VIA_DI_PORT_LVDS2:
+        viaLVDS2SetDithering(pScrn, dithering);
+        break;
+    case (VIA_DI_PORT_LVDS1 |
+          VIA_DI_PORT_LVDS2):
+        viaLVDS1SetDithering(pScrn, dithering);
+        viaLVDS2SetDithering(pScrn, dithering);
         break;
     default:
-        ViaLVDSHardwarePowerFirstSequence(pScrn, Power_On);
-        ViaLVDSHardwarePowerSecondSequence(pScrn, Power_On);
         break;
     }
 
-    ViaLVDSPowerChannel(pScrn, Power_On);
-
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "Integrated LVDS Flat Panel Power: %s\n",
-                Power_On ? "On" : "Off");
-
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting ViaLVDSPower.\n"));
+                        "Exiting viaFPDithering.\n"));
 }
 
+/*
+ * Set FP sync polarity.
+ */
 static void
-ViaLCDPowerSequence(vgaHWPtr hwp, VIALCDPowerSeqRec Sequence)
+viaFPSyncPolarity(ScrnInfoPtr pScrn, uint32_t diPort, unsigned int flags)
 {
-    int i;
+    CARD8 syncPolarity = 0x00;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaFPSyncPolarity.\n"));
 
-    for (i = 0; i < Sequence.numEntry; i++) {
-        ViaVgahwMask(hwp, 0x300 + Sequence.port[i], Sequence.offset[i],
-                     0x301 + Sequence.port[i], Sequence.data[i],
-                     Sequence.mask[i]);
-        usleep(Sequence.delay[i]);
+    if (flags & V_NHSYNC) {
+        syncPolarity |= BIT(0);
+    }
+
+    if (flags & V_NVSYNC) {
+        syncPolarity |= BIT(1);
+    }
+
+    switch(diPort) {
+    case VIA_DI_PORT_DVP0:
+        viaDVP0SetSyncPolarity(pScrn, syncPolarity);
+        break;
+    case VIA_DI_PORT_DVP1:
+        viaDVP1SetSyncPolarity(pScrn, syncPolarity);
+        break;
+    case VIA_DI_PORT_FPDPLOW:
+        break;
+    case VIA_DI_PORT_FPDPHIGH:
+        break;
+    case (VIA_DI_PORT_FPDPLOW |
+          VIA_DI_PORT_FPDPHIGH):
+        break;
+    case VIA_DI_PORT_LVDS1:
+        viaLVDS1SetSyncPolarity(pScrn, syncPolarity);
+        break;
+    case VIA_DI_PORT_LVDS2:
+        viaLVDS2SetSyncPolarity(pScrn, syncPolarity);
+        break;
+    case (VIA_DI_PORT_LVDS1 |
+          VIA_DI_PORT_LVDS2):
+        viaLVDS1SetSyncPolarity(pScrn, syncPolarity);
+        viaLVDS2SetSyncPolarity(pScrn, syncPolarity);
+        break;
+    default:
+        break;
     }
+
+    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                "FP Horizontal Sync Polarity: %s\n",
+                (syncPolarity & BIT(0)) ? "-" : "+");
+    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                "FP Vertical Sync Polarity: %s\n",
+                (syncPolarity & BIT(1)) ? "-" : "+");
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaFPSyncPolarity.\n"));
 }
 
 static void
-ViaLCDPower(xf86OutputPtr output, Bool Power_On)
+viaFPDisplaySource(ScrnInfoPtr pScrn, uint32_t diPort, int index)
 {
-    ViaPanelInfoPtr Panel = output->driver_private;
-    ScrnInfoPtr pScrn = output->scrn;
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    VIAPtr pVia = VIAPTR(pScrn);
-    VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
-    int i;
+    CARD8 displaySource = index & 0x01;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered ViaLCDPower.\n"));
-
-    /* Enable LCD */
-    if (Power_On)
-        ViaCrtcMask(hwp, 0x6A, 0x08, 0x08);
-    else
-        ViaCrtcMask(hwp, 0x6A, 0x00, 0x08);
-
-    if (pBIOSInfo->LCDPower)
-        pBIOSInfo->LCDPower(pScrn, Power_On);
-
-    /* Find Panel Size Index for PowerSeq Table */
-    if (pVia->Chipset == VIA_CLE266) {
-        if (Panel->NativeModeIndex != VIA_PANEL_INVALID) {
-            for (i = 0; i < NumPowerOn; i++) {
-                if (lcdTable[Panel->PanelIndex].powerSeq
-                    == powerOn[i].powerSeq)
-                    break;
-            }
-        } else
-            i = 0;
-    } else
-        /* KM and K8M use PowerSeq Table index 2. */
-        i = 2;
-
-    usleep(1);
-    if (Power_On)
-        ViaLCDPowerSequence(hwp, powerOn[i]);
-    else
-        ViaLCDPowerSequence(hwp, powerOff[i]);
-    usleep(1);
+                        "Entered viaFPDisplaySource.\n"));
 
+    switch(diPort) {
+    case VIA_DI_PORT_DVP0:
+        viaDVP0SetDisplaySource(pScrn, displaySource);
+        break;
+    case VIA_DI_PORT_DVP1:
+        viaDVP1SetDisplaySource(pScrn, displaySource);
+        break;
+    case VIA_DI_PORT_FPDPLOW:
+        viaFPDPLowSetDisplaySource(pScrn, displaySource);
+        viaDVP1SetDisplaySource(pScrn, displaySource);
+        break;
+    case VIA_DI_PORT_FPDPHIGH:
+        viaFPDPHighSetDisplaySource(pScrn, displaySource);
+        viaDVP0SetDisplaySource(pScrn, displaySource);
+        break;
+    case (VIA_DI_PORT_FPDPLOW |
+          VIA_DI_PORT_FPDPHIGH):
+        viaFPDPLowSetDisplaySource(pScrn, displaySource);
+        viaFPDPHighSetDisplaySource(pScrn, displaySource);
+        break;
+    case VIA_DI_PORT_LVDS1:
+        viaLVDS1SetDisplaySource(pScrn, displaySource);
+        break;
+    case VIA_DI_PORT_LVDS2:
+        viaLVDS2SetDisplaySource(pScrn, displaySource);
+        break;
+    case (VIA_DI_PORT_LVDS1 |
+          VIA_DI_PORT_LVDS2):
+        viaLVDS1SetDisplaySource(pScrn, displaySource);
+        viaLVDS2SetDisplaySource(pScrn, displaySource);
+        break;
+    default:
+        break;
+    }
     xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "Integrated LVDS Flat Panel Power: %s\n",
-                Power_On ? "On" : "Off");
+                "FP Display Source: IGA%d\n",
+                displaySource + 1);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting ViaLCDPower.\n"));
+                        "Exiting viaFPDisplaySource.\n"));
 }
 
 /*
@@ -879,103 +698,40 @@ ViaPanelGetSizeFromEDID(ScrnInfoPtr pScrn, xf86MonPtr pMon,
     return FALSE;
 }
 
-static Bool
-ViaPanelGetSizeFromDDCv1(xf86OutputPtr output, int *width, int *height)
-{
-    ScrnInfoPtr pScrn = output->scrn;
-    VIAPtr pVia = VIAPTR(pScrn);
-    xf86MonPtr pMon;
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered VIAGetPanelSizeFromDDCv1.\n"));
-
-    if (!pVia->pI2CBus2) {
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "I2C Bus 2 does not exist.\n");
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "Exiting VIAGetPanelSizeFromDDCv1.\n"));
-        return FALSE;
-    }
-
-    if (!xf86I2CProbeAddress(pVia->pI2CBus2, 0xA0)) {
-        xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                    "I2C device on I2C Bus 2 does not support EDID.\n");
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "Exiting VIAGetPanelSizeFromDDCv1.\n"));
-        return FALSE;
-    }
-
-    /* Probe I2C Bus 2 to see if a flat panel is connected. */
-    xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                "Probing for a flat panel on I2C Bus 2.\n");
-    pMon = xf86OutputGetEDID(output, pVia->pI2CBus2);
-    if (pMon && DIGITAL(pMon->features.input_type)) {
-        xf86OutputSetEDID(output, pMon);
-        xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                    "Detected a flat panel on I2C Bus 2.\n");
-    } else {
-        xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                    "Did not detect a flat panel on I2C Bus 2.\n");
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "Exiting VIAGetPanelSizeFromDDCv1.\n"));
-        return FALSE;
-
-    }
-
-    if (!ViaPanelGetSizeFromEDID(pScrn, pMon, width, height)) {
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "Unable to obtain panel size from EDID information.\n");
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "Exiting VIAGetPanelSizeFromDDCv1.\n"));
-        return FALSE;
-    }
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "VIAGetPanelSizeFromDDCv1: (%d X %d)\n",
-                        *width, *height));
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting VIAGetPanelSizeFromDDCv1.\n"));
-    return TRUE;
-}
-
 /*
  * Gets the native panel resolution from scratch pad registers.
  */
 static void
-viaLVDSGetFPInfoFromScratchPad(xf86OutputPtr output)
+viaFPGetFPInfoScratchPad(xf86OutputPtr output)
 {
     ScrnInfoPtr pScrn = output->scrn;
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    ViaPanelInfoPtr panel = output->driver_private;
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private;
+    VIARegPtr Regs = &pVIADisplay->SavedReg;
     CARD8 index;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                     "Entered viaLVDSGetFPInfoFromScratchPad.\n"));
+                        "Entered %s.\n", __func__));
 
-    index = hwp->readCrtc(hwp, 0x3F) & 0x0F;
+    index = Regs->CR[0x3F] & 0x0F;
 
-    panel->NativeModeIndex = index;
-    panel->NativeWidth = ViaPanelNativeModes[index].Width;
-    panel->NativeHeight = ViaPanelNativeModes[index].Height;
-    panel->useDualEdge = ViaPanelNativeModes[index].useDualEdge;
-    panel->useDithering = ViaPanelNativeModes[index].useDithering;
+    pVIAFP->NativeModeIndex = index;
+    pVIAFP->NativeWidth = ViaPanelNativeModes[index].Width;
+    pVIAFP->NativeHeight = ViaPanelNativeModes[index].Height;
+    pVIAFP->useDualEdge = ViaPanelNativeModes[index].useDualEdge;
+    pVIAFP->useDithering = ViaPanelNativeModes[index].useDithering;
 
     xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                "VIA Technologies VGA BIOS Scratch Pad Register "
                "Flat Panel Index: %d\n",
-               panel->NativeModeIndex);
+               pVIAFP->NativeModeIndex);
     xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                "Flat Panel Native Resolution: %dx%d\n",
-               panel->NativeWidth, panel->NativeHeight);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-               "Flat Panel Dual Edge Transfer: %s\n",
-               panel->useDualEdge ? "On" : "Off");
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-               "Flat Panel Output Color Dithering: %s\n",
-               panel->useDithering ? "On (18 bit)" : "Off (24 bit)");
+               pVIAFP->NativeWidth, pVIAFP->NativeHeight);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                     "Exiting viaLVDSGetFPInfoFromScratchPad.\n"));
+                        "Exiting %s.\n", __func__));
 }
 
 static void
@@ -1111,87 +867,158 @@ ViaPanelScaleDisable(ScrnInfoPtr pScrn)
         ViaCrtcMask(hwp, 0xA2, 0x00, 0xC8);
 }
 
+static int
+viaGetClockRangeIndex(int Clock)
+{
+    if (Clock < VIA_DPA_CLK_30M) {
+        return VIA_DPA_CLK_RANGE_30M;
+    } else if ((Clock >= VIA_DPA_CLK_30M) && (Clock < VIA_DPA_CLK_50M)) {
+        return VIA_DPA_CLK_RANGE_30M_50M;
+    } else if ((Clock >= VIA_DPA_CLK_50M) && (Clock < VIA_DPA_CLK_70M)) {
+        return VIA_DPA_CLK_RANGE_50M_70M;
+    } else if ((Clock >= VIA_DPA_CLK_70M) && (Clock < VIA_DPA_CLK_100M)) {
+        return VIA_DPA_CLK_RANGE_70M_100M;
+    } else if ((Clock >= VIA_DPA_CLK_100M) && (Clock < VIA_DPA_CLK_150M)) {
+        return VIA_DPA_CLK_RANGE_100M_150M;
+    } else {
+        return VIA_DPA_CLK_RANGE_150M;
+    }
+}
+
+static void
+viaLoadDPA(ScrnInfoPtr pScrn, uint32_t diPort, VIADPAPtr pVIADPA)
+{
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaLoadDPA.\n"));
+
+    if (!pVIADPA) {
+        goto exit;
+    }
+
+    switch (diPort) {
+    case VIA_DI_PORT_DVP0:
+        viaDVP0SetAdjustment(pScrn, pVIADPA->dvp0Adjustment);
+        viaDVP0SetClockDriveStrength(pScrn, pVIADPA->dvp0ClockDriveStrength);
+        viaDVP0SetDataDriveStrength(pScrn, pVIADPA->dvp0DataDriveStrength);
+        break;
+    case VIA_DI_PORT_DVP1:
+        viaDVP1SetAdjustment(pScrn, pVIADPA->dvp1Adjustment);
+        viaDVP1SetClockDriveStrength(pScrn, pVIADPA->dvp1ClockDriveStrength);
+        viaDVP1SetDataDriveStrength(pScrn, pVIADPA->dvp1DataDriveStrength);
+        break;
+    case VIA_DI_PORT_FPDPLOW:
+        viaFPDPLowSetAdjustment(pScrn, pVIADPA->fpdpLowAdjustment);
+        break;
+    case VIA_DI_PORT_FPDPHIGH:
+        viaFPDPHighSetAdjustment(pScrn, pVIADPA->fpdpHighAdjustment);
+        break;
+    case (VIA_DI_PORT_FPDPHIGH |
+            VIA_DI_PORT_FPDPLOW):
+        viaFPDPLowSetAdjustment(pScrn, pVIADPA->fpdpLowAdjustment);
+        viaFPDPHighSetAdjustment(pScrn, pVIADPA->fpdpHighAdjustment);
+        break;
+    default:
+        break;
+    }
+
+exit:
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaLoadDPA.\n"));
+}
+
+static void
+viaFPIOAdjustment(ScrnInfoPtr pScrn,
+                int Chipset, uint32_t diPort, int Clock)
+{
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADPAInfoTablePtr pVIADPAInfoTable;
+    VIADPAPtr pVIADPA;
+    Bool isDPATableExist = FALSE;
+    int clockRangeIndex = 0;
+    int i = 0;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaFPIOAdjustment.\n"));
+
+    for (i = 0; i < NUMBER_VIA_DPA_TABLE; i++) {
+        if (pVia->Chipset == viaDPAIndexTable[i].Chipset) {
+            isDPATableExist = TRUE;
+            break;
+        }
+    }
+
+    if (isDPATableExist) {
+        if (viaDPAIndexTable[i].pFPDPATable) {
+            pVIADPAInfoTable = viaDPAIndexTable[i].pFPDPATable;
+        }
+
+        clockRangeIndex = viaGetClockRangeIndex(Clock);
+
+        /* Write the value to the register. */
+        pVIADPA = pVIADPAInfoTable[clockRangeIndex].pDPASetting;
+        viaLoadDPA(pScrn, diPort, pVIADPA);
+    }
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaFPIOAdjustment.\n"));
+}
+
 static void
-via_lvds_create_resources(xf86OutputPtr output)
+via_fp_create_resources(xf86OutputPtr output)
 {
 }
 
 static void
-via_lvds_dpms(xf86OutputPtr output, int mode)
+via_fp_dpms(xf86OutputPtr output, int mode)
 {
     ScrnInfoPtr pScrn = output->scrn;
     VIAPtr pVia = VIAPTR(pScrn);
+    VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered via_fp_dpms.\n"));
 
     switch (mode) {
     case DPMSModeOn:
-        switch (pVia->Chipset) {
-        case VIA_PM800:
-        case VIA_P4M800PRO:
-        case VIA_P4M890:
-        case VIA_K8M890:
-        case VIA_P4M900:
-        case VIA_CX700:
-        case VIA_VX800:
-        case VIA_VX855:
-        case VIA_VX900:
-            ViaLVDSPower(pScrn, TRUE);
-            break;
-        default:
-            ViaLCDPower(output, TRUE);
-            break;
-        }
-
-        viaFPIOPadSetting(pScrn, TRUE);
+        viaFPPower(pScrn, pVia->Chipset, pVIAFP->diPort, TRUE);
+        viaFPIOPadState(pScrn, pVIAFP->diPort, TRUE);
         break;
-
     case DPMSModeStandby:
     case DPMSModeSuspend:
     case DPMSModeOff:
-        switch (pVia->Chipset) {
-        case VIA_PM800:
-        case VIA_P4M800PRO:
-        case VIA_P4M890:
-        case VIA_K8M890:
-        case VIA_P4M900:
-        case VIA_CX700:
-        case VIA_VX800:
-        case VIA_VX855:
-        case VIA_VX900:
-            ViaLVDSPower(pScrn, FALSE);
-            break;
-        default:
-            ViaLCDPower(output, FALSE);
-            break;
-        }
-
-        viaFPIOPadSetting(pScrn, FALSE);
+        viaFPPower(pScrn, pVia->Chipset, pVIAFP->diPort, FALSE);
+        viaFPIOPadState(pScrn, pVIAFP->diPort, FALSE);
+        break;
+    default:
         break;
     }
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting via_fp_dpms.\n"));
 }
 
 static void
-via_lvds_save(xf86OutputPtr output)
+via_fp_save(xf86OutputPtr output)
 {
 }
 
 static void
-via_lvds_restore(xf86OutputPtr output)
+via_fp_restore(xf86OutputPtr output)
 {
-    ViaLCDPower(output, TRUE);
 }
 
 static int
-via_lvds_mode_valid(xf86OutputPtr output, DisplayModePtr pMode)
+via_fp_mode_valid(xf86OutputPtr output, DisplayModePtr pMode)
 {
     ScrnInfoPtr pScrn = output->scrn;
-    ViaPanelInfoPtr Panel = output->driver_private;
+    VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private;
 
-    if (Panel->NativeWidth < pMode->HDisplay ||
-        Panel->NativeHeight < pMode->VDisplay)
+    if (pVIAFP->NativeWidth < pMode->HDisplay ||
+        pVIAFP->NativeHeight < pMode->VDisplay)
         return MODE_PANEL;
 
-    if (!Panel->Scale && Panel->NativeHeight != pMode->VDisplay &&
-         Panel->NativeWidth != pMode->HDisplay)
+    if (!pVIAFP->Scale && pVIAFP->NativeHeight != pMode->VDisplay &&
+         pVIAFP->NativeWidth != pMode->HDisplay)
         return MODE_PANEL;
 
     if (!ViaModeDotClockTranslate(pScrn, pMode))
@@ -1201,149 +1028,182 @@ via_lvds_mode_valid(xf86OutputPtr output, DisplayModePtr pMode)
 }
 
 static Bool
-via_lvds_mode_fixup(xf86OutputPtr output, DisplayModePtr mode,
+via_fp_mode_fixup(xf86OutputPtr output, DisplayModePtr mode,
                     DisplayModePtr adjusted_mode)
 {
-    ViaPanelInfoPtr Panel = output->driver_private;
+    VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private;
 
     xf86SetModeCrtc(adjusted_mode, 0);
-    if (!Panel->Center && (mode->HDisplay < Panel->NativeWidth ||
-        mode->VDisplay < Panel->NativeHeight)) {
-        Panel->Scale = TRUE;
+    if (!pVIAFP->Center && (mode->HDisplay < pVIAFP->NativeWidth ||
+        mode->VDisplay < pVIAFP->NativeHeight)) {
+        pVIAFP->Scale = TRUE;
     } else {
-        Panel->Scale = FALSE;
+        pVIAFP->Scale = FALSE;
         ViaPanelCenterMode(mode, adjusted_mode);
     }
     return TRUE;
 }
 
 static void
-via_lvds_prepare(xf86OutputPtr output)
+via_fp_prepare(xf86OutputPtr output)
 {
     ScrnInfoPtr pScrn = output->scrn;
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered via_fp_prepare.\n"));
 
-    via_lvds_dpms(output, DPMSModeOff);
-    viaFPIOPadSetting(pScrn, FALSE);
+    viaFPPower(pScrn, pVia->Chipset, pVIAFP->diPort, FALSE);
+    viaFPIOPadState(pScrn, pVIAFP->diPort, FALSE);
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting via_fp_prepare.\n"));
 }
 
 static void
-via_lvds_commit(xf86OutputPtr output)
+via_fp_commit(xf86OutputPtr output)
 {
     ScrnInfoPtr pScrn = output->scrn;
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered via_fp_commit.\n"));
+
+    viaFPPower(pScrn, pVia->Chipset, pVIAFP->diPort, TRUE);
+    viaFPIOPadState(pScrn, pVIAFP->diPort, TRUE);
 
-    via_lvds_dpms(output, DPMSModeOn);
-    viaFPIOPadSetting(pScrn, TRUE);
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting via_fp_commit.\n"));
 }
 
 static void
-via_lvds_mode_set(xf86OutputPtr output, DisplayModePtr mode,
+via_fp_mode_set(xf86OutputPtr output, DisplayModePtr mode,
                     DisplayModePtr adjusted_mode)
 {
-    ViaPanelInfoPtr Panel = output->driver_private;
     ScrnInfoPtr pScrn = output->scrn;
     drmmode_crtc_private_ptr iga = output->crtc->driver_private;
     VIAPtr pVia = VIAPTR(pScrn);
+    VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private;
 
     if (output->crtc) {
-        if (Panel->Scale) {
+        if (pVIAFP->Scale) {
             ViaPanelScale(pScrn, mode->HDisplay, mode->VDisplay,
-                            Panel->NativeWidth,
-                            Panel->NativeHeight);
+                            pVIAFP->NativeWidth,
+                            pVIAFP->NativeHeight);
         } else {
             ViaPanelScaleDisable(pScrn);
         }
 
-        switch (pVia->Chipset) {
-        case VIA_P4M900:
-            viaDFPLowSetDelayTap(pScrn, 0x08);
-            break;
-        case VIA_CX700:
-            viaLVDS2SetDelayTap(pScrn, 0x01);
-            break;
-        default:
-            break;
-        }
-
+        viaFPIOAdjustment(pScrn,
+                        pVia->Chipset, pVIAFP->diPort,
+                        adjusted_mode->Clock);
 
         switch (pVia->Chipset) {
-        case VIA_KM400:
-        case VIA_K8M800:
-        case VIA_PM800:
-        case VIA_P4M800PRO:
-            viaDFPLowSetDisplaySource(pScrn, iga->index ? 0x01 : 0x00);
-            viaDFPHighSetDisplaySource(pScrn, iga->index ? 0x01 : 0x00);
-            break;
-        case VIA_P4M890:
-        case VIA_K8M890:
-        case VIA_P4M900:
-            viaDFPLowSetDisplaySource(pScrn, iga->index ? 0x01 : 0x00);
-            viaDVP1SetDisplaySource(pScrn, iga->index ? 0x01 : 0x00);
-            break;
         case VIA_CX700:
         case VIA_VX800:
         case VIA_VX855:
         case VIA_VX900:
-            viaLVDS2SetDisplaySource(pScrn, iga->index ? 0x01 : 0x00);
-
-            /* Set LVDS2 output color dithering. */
-            viaLVDS2SetDithering(pScrn, Panel->useDithering ? TRUE : FALSE);
+            /* OPENLDI Mode */
+            viaFPFormat(pScrn, pVIAFP->diPort, 0x01);
 
-            /* Set LVDS2 output format to sequential mode. */
-            viaLVDS2SetOutputFormat(pScrn, 0x01);
+            /* Sequential Mode */
+            viaFPOutputFormat(pScrn, pVIAFP->diPort, 0x01);
 
-            /* Set LVDS2 output to OPENLDI mode. */
-            viaLVDS2SetFormat(pScrn, 0x01);
+            viaFPDithering(pScrn, pVIAFP->diPort, pVIAFP->useDithering);
             break;
         default:
             break;
         }
+
+        viaFPSyncPolarity(pScrn, pVIAFP->diPort, adjusted_mode->Flags);
+        viaFPDisplaySource(pScrn, pVIAFP->diPort, iga->index);
     }
 }
 
 static xf86OutputStatus
-via_lvds_detect(xf86OutputPtr output)
+via_fp_detect(xf86OutputPtr output)
 {
-    xf86OutputStatus status = XF86OutputStatusDisconnected;
     ScrnInfoPtr pScrn = output->scrn;
+    xf86MonPtr pMon;
+    xf86OutputStatus status = XF86OutputStatusDisconnected;
+    I2CBusPtr pI2CBus;
     VIAPtr pVia = VIAPTR(pScrn);
-    ViaPanelInfoPtr panel = output->driver_private;
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered via_lvds_detect.\n"));
+                        "Entered via_fp_detect.\n"));
 
     /* Hardcode panel size for the OLPC XO-1.5. */
-    if (pVia->IsOLPCXO15) {
+    if (pVIADisplay->isOLPCXO15) {
         xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                     "Setting up OLPC XO-1.5 flat panel.\n");
-        panel->NativeWidth = 1200;
-        panel->NativeHeight = 900;
+        pVIAFP->NativeWidth = 1200;
+        pVIAFP->NativeHeight = 900;
         status = XF86OutputStatusConnected;
         goto exit;
     }
 
-    /* For now, FP detection code will not scan the I2C bus
-     * in order to obtain EDID since it is often used by DVI
-     * as well. Hence, reading off the CRTC scratch pad register
-     * supplied by the VGA BIOS is the only method available
-     * to figure out the FP native screen resolution. */
-    viaLVDSGetFPInfoFromScratchPad(output);
-    status = XF86OutputStatusConnected;
+    if (pVIAFP->i2cBus & VIA_I2C_BUS2) {
+        pI2CBus = pVIADisplay->pI2CBus2;
+    } else if (pVIAFP->i2cBus & VIA_I2C_BUS3) {
+        pI2CBus = pVIADisplay->pI2CBus3;
+    } else {
+        pI2CBus = NULL;
+    }
+
+    if (pI2CBus) {
+        pMon = xf86OutputGetEDID(output, pI2CBus);
+        if (pMon && DIGITAL(pMon->features.input_type)) {
+            xf86OutputSetEDID(output, pMon);
+            xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                        "Detected a flat panel.\n");
+            if (!ViaPanelGetSizeFromEDID(pScrn, pMon, &pVIAFP->NativeWidth, &pVIAFP->NativeHeight)) {
+                xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                            "Unable to obtain panel size from EDID.\n");
+                goto exit;
+            }
+
+            status = XF86OutputStatusConnected;
+        } else {
+            xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                        "Could not obtain EDID from a flat "
+                        "panel, but will obtain flat panel "
+                        "information from scratch pad register.\n");
+
+            /* For FP without I2C bus connection, CRTC scratch pad
+             * register supplied by the VGA BIOS is the only method
+             * available to figure out the FP native screen resolution. */
+            viaFPGetFPInfoScratchPad(output);
+            status = XF86OutputStatusConnected;
+        }
+    } else {
+        /* For FP without I2C bus connection, CRTC scratch pad
+         * register supplied by the VGA BIOS is the only method
+         * available to figure out the FP native screen resolution. */
+        viaFPGetFPInfoScratchPad(output);
+        status = XF86OutputStatusConnected;
+    }
 
 exit:
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting via_lvds_detect.\n"));
+                        "Exiting via_fp_detect.\n"));
     return status;
 }
 
 static DisplayModePtr
-via_lvds_get_modes(xf86OutputPtr output)
+via_fp_get_modes(xf86OutputPtr output)
 {
-    ViaPanelInfoPtr pPanel = output->driver_private;
     ScrnInfoPtr pScrn = output->scrn;
     DisplayModePtr pDisplay_Mode = NULL;
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered via_lvds_get_modes.\n"));
+                        "Entered via_fp_get_modes.\n"));
 
     if (output->status == XF86OutputStatusConnected) {
         if (!output->MonInfo) {
@@ -1351,13 +1211,11 @@ via_lvds_get_modes(xf86OutputPtr output)
              * Generates a display mode for the native panel resolution,
              * using CVT.
              */
-            if (pPanel->NativeWidth && pPanel->NativeHeight) {
-                VIAPtr pVia = VIAPTR(pScrn);
-
-                if (pVia->IsOLPCXO15) {
+            if (pVIAFP->NativeWidth && pVIAFP->NativeHeight) {
+                if (pVIADisplay->isOLPCXO15) {
                     pDisplay_Mode = xf86DuplicateMode(&OLPCMode);
                 } else {
-                    pDisplay_Mode = xf86CVTMode(pPanel->NativeWidth, pPanel->NativeHeight,
+                    pDisplay_Mode = xf86CVTMode(pVIAFP->NativeWidth, pVIAFP->NativeHeight,
                                     60.0f, FALSE, FALSE);
                 }
 
@@ -1385,131 +1243,340 @@ via_lvds_get_modes(xf86OutputPtr output)
                 xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                             "Invalid Flat Panel Screen Resolution: "
                             "%dx%d\n",
-                            pPanel->NativeWidth, pPanel->NativeHeight);
+                            pVIAFP->NativeWidth, pVIAFP->NativeHeight);
             }
         } else {
             pDisplay_Mode = xf86OutputGetEDIDModes(output);
         }
     }
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting via_lvds_get_modes.\n"));
+                        "Exiting via_fp_get_modes.\n"));
     return pDisplay_Mode;
 }
 
 #ifdef RANDR_12_INTERFACE
 static Bool
-via_lvds_set_property(xf86OutputPtr output, Atom property,
+via_fp_set_property(xf86OutputPtr output, Atom property,
                         RRPropertyValuePtr value)
 {
     return FALSE;
 }
 
 static Bool
-via_lvds_get_property(xf86OutputPtr output, Atom property)
+via_fp_get_property(xf86OutputPtr output, Atom property)
 {
     return FALSE;
 }
 #endif
 
 static void
-via_lvds_destroy(xf86OutputPtr output)
+via_fp_destroy(xf86OutputPtr output)
 {
     if (output->driver_private)
         free(output->driver_private);
     output->driver_private = NULL;
 }
 
-static const xf86OutputFuncsRec via_lvds_funcs = {
-    .create_resources   = via_lvds_create_resources,
-    .dpms               = via_lvds_dpms,
-    .save               = via_lvds_save,
-    .restore            = via_lvds_restore,
-    .mode_valid         = via_lvds_mode_valid,
-    .mode_fixup         = via_lvds_mode_fixup,
-    .prepare            = via_lvds_prepare,
-    .commit             = via_lvds_commit,
-    .mode_set           = via_lvds_mode_set,
-    .detect             = via_lvds_detect,
-    .get_modes          = via_lvds_get_modes,
+static const xf86OutputFuncsRec via_fp_funcs = {
+    .create_resources   = via_fp_create_resources,
+    .dpms               = via_fp_dpms,
+    .save               = via_fp_save,
+    .restore            = via_fp_restore,
+    .mode_valid         = via_fp_mode_valid,
+    .mode_fixup         = via_fp_mode_fixup,
+    .prepare            = via_fp_prepare,
+    .commit             = via_fp_commit,
+    .mode_set           = via_fp_mode_set,
+    .detect             = via_fp_detect,
+    .get_modes          = via_fp_get_modes,
 #ifdef RANDR_12_INTERFACE
-    .set_property       = via_lvds_set_property,
+    .set_property       = via_fp_set_property,
 #endif
 #ifdef RANDR_13_INTERFACE
-    .get_property       = via_lvds_get_property,
+    .get_property       = via_fp_get_property,
 #endif
-    .destroy            = via_lvds_destroy
+    .destroy            = via_fp_destroy
 };
 
-
 void
-via_lvds_init(ScrnInfoPtr pScrn)
+viaFPProbe(ScrnInfoPtr pScrn)
 {
-    ViaPanelInfoPtr Panel = (ViaPanelInfoPtr) xnfcalloc(sizeof(ViaPanelInfoRec), 1);
-    OptionInfoPtr  Options = xnfalloc(sizeof(ViaPanelOptions));
-    MessageType from = X_DEFAULT;
-    VIAPtr pVia = VIAPTR(pScrn);
-    xf86OutputPtr output = NULL;
     vgaHWPtr hwp = VGAHWPTR(pScrn);
-    CARD8 cr3b = 0x00;
-    CARD8 cr3b_mask = 0x00;
-    char outputNameBuffer[32];
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    CARD8 sr12, sr13, sr5a;
+    CARD8 cr3b;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
 
-    if (!Panel)
-        return;
+    sr12 = hwp->readSeq(hwp, 0x12);
+    sr13 = hwp->readSeq(hwp, 0x13);
+    cr3b = hwp->readCrtc(hwp, 0x3B);
 
-    /* Apparently this is the way VIA Technologies passes */
-    /* the presence of a flat panel to the device driver */
-    /* via BIOS setup. */
-    if (pVia->Chipset == VIA_CLE266) {
-        cr3b_mask = 0x08;
-    } else {
-        cr3b_mask = 0x02;
-    }            
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "SR12: 0x%02X\n", sr12));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "SR13: 0x%02X\n", sr13));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "CR3B: 0x%02X\n", sr13));
+
+    /* Detect the presence of FPs. */
+    switch (pVia->Chipset) {
+    case VIA_CLE266:
+        if ((sr12 & BIT(4)) || (cr3b & BIT(3))) {
+            pVIADisplay->intFP1Presence = TRUE;
+            pVIADisplay->intFP1DIPort = VIA_DI_PORT_DIP0;
+        } else {
+            pVIADisplay->intFP1Presence = FALSE;
+            pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+        }
+
+        pVIADisplay->intFP2Presence = FALSE;
+        pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+        break;
+    case VIA_KM400:
+    case VIA_K8M800:
+    case VIA_P4M800PRO:
+    case VIA_PM800:
+        /* 3C5.13[3] - DVP0D8 pin strapping
+         *             0: AGP pins are used for AGP
+         *             1: AGP pins are used by FPDP
+         *             (Flat Panel Display Port) */
+        if ((sr13 & BIT(3)) && (cr3b & BIT(1))) {
+            pVIADisplay->intFP1Presence = TRUE;
+            pVIADisplay->intFP1DIPort = VIA_DI_PORT_FPDPHIGH
+                                            | VIA_DI_PORT_FPDPLOW;
+        } else {
+            pVIADisplay->intFP1Presence = FALSE;
+            pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+        }
+
+        pVIADisplay->intFP2Presence = FALSE;
+        pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+        break;
+    case VIA_P4M890:
+    case VIA_K8M890:
+    case VIA_P4M900:
+        if (cr3b & BIT(1)) {
+
+            /* 3C5.12[4] - DVP0D4 pin strapping
+             *             0: 12-bit FPDP (Flat Panel Display Port)
+             *             1: 24-bit FPDP (Flat Panel Display Port) */
+            if (sr12 & BIT(4)) {
+                pVIADisplay->intFP1Presence = TRUE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_FPDPLOW |
+                                            VIA_DI_PORT_FPDPHIGH;
+            } else {
+                pVIADisplay->intFP1Presence = TRUE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_FPDPLOW;
+            }
+        } else {
+            pVIADisplay->intFP1Presence = FALSE;
+            pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+
+        }
+
+        pVIADisplay->intFP2Presence = FALSE;
+        pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+        break;
+    case VIA_CX700:
+    case VIA_VX800:
+    case VIA_VX855:
+    case VIA_VX900:
+        sr5a = hwp->readSeq(hwp, 0x5A);
+
+        /* Setting SR5A[0] to 1.
+         * This allows the reading out the alternative
+         * pin strapping information from SR12 and SR13. */
+        ViaSeqMask(hwp, 0x5A, BIT(0), BIT(0));
 
-    cr3b = hwp->readCrtc(hwp, 0x3B) & cr3b_mask;
+        sr13 = hwp->readSeq(hwp, 0x13);
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                            "SR13: 0x%02X\n", sr13));
+
+        if (cr3b & BIT(1)) {
+            if (pVIADisplay->isVIANanoBook) {
+                pVIADisplay->intFP1Presence = FALSE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+                pVIADisplay->intFP2Presence = TRUE;
+                pVIADisplay->intFP2DIPort = VIA_DI_PORT_LVDS2;
+
+            } else if (pVIADisplay->isQuantaIL1) {
+                /* From the Quanta IL1 schematic. */
+                pVIADisplay->intFP1Presence = TRUE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_DVP1;
+                pVIADisplay->intFP2Presence = FALSE;
+                pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+
+            } else if (pVIADisplay->isSamsungNC20) {
+                pVIADisplay->intFP1Presence = FALSE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+                pVIADisplay->intFP2Presence = TRUE;
+                pVIADisplay->intFP2DIPort = VIA_DI_PORT_LVDS2;
+
+            /* 3C5.13[7:6] - Integrated LVDS / DVI Mode Select
+             *               (DVP1D15-14 pin strapping)
+             *               00: LVDS1 + LVDS2
+             *               01: DVI + LVDS2
+             *               10: Dual LVDS Channel (High Resolution Panel)
+             *               11: One DVI only (decrease the clock jitter) */
+            } else if ((!(sr13 & BIT(7))) && (!(sr13 & BIT(6)))) {
+                pVIADisplay->intFP1Presence = TRUE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_LVDS1;
+
+                /*
+                 * For now, don't support the second FP.
+                 */
+                pVIADisplay->intFP2Presence = FALSE;
+                pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+            } else if ((!(sr13 & BIT(7))) && (sr13 & BIT(6))) {
+                pVIADisplay->intFP1Presence = FALSE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+                pVIADisplay->intFP2Presence = TRUE;
+                pVIADisplay->intFP2DIPort = VIA_DI_PORT_LVDS2;
+            } else if ((sr13 & BIT(7)) && (!(sr13 & BIT(6)))) {
+                pVIADisplay->intFP1Presence = TRUE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_LVDS1
+                                                | VIA_DI_PORT_LVDS2;
+                pVIADisplay->intFP2Presence = FALSE;
+                pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+            } else {
+                pVIADisplay->intFP1Presence = FALSE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+                pVIADisplay->intFP2Presence = FALSE;
+                pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+            }
+        } else {
+            pVIADisplay->intFP1Presence = FALSE;
+            pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+            pVIADisplay->intFP2Presence = FALSE;
+            pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+        }
+
+        hwp->writeSeq(hwp, 0x5A, sr5a);
+        break;
+    default:
+        pVIADisplay->intFP1Presence = FALSE;
+        pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+        pVIADisplay->intFP2Presence = FALSE;
+        pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+        break;
+    }
+
+    pVIADisplay->intFP1I2CBus = VIA_I2C_NONE;
+    pVIADisplay->intFP2I2CBus = VIA_I2C_NONE;
 
-    if (!cr3b) {
-        return;
+    if ((pVIADisplay->intFP1Presence)
+        && (!(pVIADisplay->mappedI2CBus & VIA_I2C_BUS2))) {
+        pVIADisplay->intFP1I2CBus = VIA_I2C_BUS2;
+        pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2;
     }
 
-    memcpy(Options, ViaPanelOptions, sizeof(ViaPanelOptions));
-    xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, Options);
+    if ((pVIADisplay->intFP2Presence)
+        && (!(pVIADisplay->mappedI2CBus & VIA_I2C_BUS2))) {
+        pVIADisplay->intFP2I2CBus = VIA_I2C_BUS2;
+        pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2;
+    }
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
+}
+
+void
+viaFPInit(ScrnInfoPtr pScrn)
+{
+    xf86OutputPtr output;
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    VIAFPPtr pVIAFP;
+    char outputNameBuffer[32];
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entering viaFPInit.\n"));
+
+    if (pVIADisplay->intFP1Presence) {
+        pVIAFP = (VIAFPPtr) xnfcalloc(1, sizeof(VIAFPRec));
+        if (!pVIAFP) {
+            DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                                "Failed to allocate private storage for "
+                                "FP.\n"));
+            goto exit;
+        }
+
+        /* The code to dynamically designate a particular FP (i.e., FP-1,
+         * FP-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */
+        sprintf(outputNameBuffer, "FP-%d", (pVIADisplay->numberFP + 1));
+        output = xf86OutputCreate(pScrn, &via_fp_funcs, outputNameBuffer);
+        if (!output) {
+            free(pVIAFP);
+            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                        "Failed to allocate X Server display output record for "
+                        "FP.\n");
+            goto exit;
+        }
 
-    Panel->NativeModeIndex = VIA_PANEL_INVALID;
+        /* Increment the number of FP connectors. */
+        pVIADisplay->numberFP++;
 
-    /* LCD Center/Expend Option */
-    Panel->Center = FALSE;
-    from = xf86GetOptValBool(Options, OPTION_CENTER, &Panel->Center)
-            ? X_CONFIG : X_DEFAULT;
-    xf86DrvMsg(pScrn->scrnIndex, from, "LVDS-0 : DVI Center is %s.\n",
-               Panel->Center ? "enabled" : "disabled");
+        pVIAFP->diPort = pVIADisplay->intFP1DIPort;
 
-    /* The code to dynamically designate a particular FP (i.e., FP-1,
-     * FP-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */
-    sprintf(outputNameBuffer, "FP-%d", (pVia->numberFP + 1));
-    output = xf86OutputCreate(pScrn, &via_lvds_funcs, outputNameBuffer);
+        /* Hint about which I2C bus to access for obtaining EDID. */
+        pVIAFP->i2cBus = pVIADisplay->intFP1I2CBus;
 
-    if (output)  {
-        output->driver_private = Panel;
+        output->driver_private = pVIAFP;
 
-        /* While there are two (2) display controllers registered with the
-         * X.Org Server, it is often desirable to fix FP (Flat Panel) to
-         * IGA2 since only IGA2 contains panel resolution scaling
-         * functionality. IGA1 does not have this. */
-        output->possible_crtcs = 1 << 1;
+        output->possible_crtcs = BIT(1) | BIT(0);
 
         output->possible_clones = 0;
         output->interlaceAllowed = FALSE;
         output->doubleScanAllowed = FALSE;
 
-        /* Increment the number of FP connectors. */
-        pVia->numberFP++;
-
-        if (pVia->IsOLPCXO15) {
+        if (pVIADisplay->isOLPCXO15) {
             output->mm_height = 152;
             output->mm_width = 114;
         }
-    } else {
-        free(Panel);
     }
+
+    if (pVIADisplay->intFP2Presence) {
+        pVIAFP = (VIAFPPtr) xnfcalloc(1, sizeof(VIAFPRec));
+        if (!pVIAFP) {
+            DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                                "Failed to allocate private storage for "
+                                "FP.\n"));
+            goto exit;
+        }
+
+        /* The code to dynamically designate a particular FP (i.e., FP-1,
+         * FP-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */
+        sprintf(outputNameBuffer, "FP-%d", (pVIADisplay->numberFP + 1));
+        output = xf86OutputCreate(pScrn, &via_fp_funcs, outputNameBuffer);
+        if (!output) {
+            free(pVIAFP);
+            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                        "Failed to allocate X Server display output record for "
+                        "FP.\n");
+            goto exit;
+        }
+
+        /* Increment the number of FP connectors. */
+        pVIADisplay->numberFP++;
+
+        pVIAFP->diPort = pVIADisplay->intFP2DIPort;
+
+        /* Hint about which I2C bus to access for obtaining EDID. */
+        pVIAFP->i2cBus = pVIADisplay->intFP2I2CBus;
+
+        output->driver_private = pVIAFP;
+
+        output->possible_crtcs = BIT(1) | BIT(0);
+
+        output->possible_clones = 0;
+        output->interlaceAllowed = FALSE;
+        output->doubleScanAllowed = FALSE;
+    }
+
+exit:
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaFPInit.\n"));
 }
diff --git a/src/via_fp.h b/src/via_fp.h
new file mode 100644
index 0000000..afce38b
--- /dev/null
+++ b/src/via_fp.h
@@ -0,0 +1,254 @@
+/*
+ * Copyright 2017-2018 Kevin Brace. All Rights Reserved.
+ * Copyright 2007-2015 OpenChrome Project
+ *                     [https://www.freedesktop.org/wiki/Openchrome]
+ * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
+ * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * via_fp.h
+ *
+ * Header file for via_fp.c.
+ */
+
+#ifndef _VIA_FP_H_
+#define _VIA_FP_H_ 1
+
+
+/*
+ * These FP DPA parameters were copied from VIA Technologies
+ * xf86-video-via v83-44398 source code.
+ */
+
+
+/*
+ * P4M890 chipset FP DPA parameters default setting.
+ */
+static VIADPARec viaDPAP4M890ClockDefault[] = {
+    /*      DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive,
+     *      DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive,
+     *  FPDP Low Adjustment,              FPDP High Adjustment */
+    {                  0x07,             0x00,            0x00,
+                       0x03,             0x00,            0x00,
+                       0x04,                              0x08}
+};
+
+/*
+ * P4M890 chipset FP DPA parameters for dot clock at or above 50 MHz
+ * but below 70 MHz.
+ */
+static VIADPARec viaDPAP4M890Clock50M70M[] = {
+    /*      DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive,
+     *      DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive,
+     *  FPDP Low Adjustment,              FPDP High Adjustment */
+    {                  0x06,             0x00,            0x00,
+                       0x03,             0x00,            0x00,
+                       0x04,                              0x08}
+};
+
+/*
+ * P4M890 chipset FP DPA parameters for dot clock at or above 70 MHz
+ * but below 100 MHz.
+ */
+static VIADPARec viaDPAP4M890Clock70M100M[] = {
+    /*      DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive,
+     *      DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive,
+     *  FPDP Low Adjustment,              FPDP High Adjustment */
+    {                  0x03,             0x00,            0x00,
+                       0x03,             0x00,            0x00,
+                       0x04,                              0x08}
+};
+
+/*
+ * P4M890 chipset FP DPA parameters for dot clock at or above 100 MHz
+ * but below 150 MHz.
+ */
+static VIADPARec viaDPAP4M890Clock100M150M[] = {
+    /*      DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive,
+     *      DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive,
+     *  FPDP Low Adjustment,              FPDP High Adjustment */
+    {                  0x03,             0x00,            0x00,
+                       0x03,             0x00,            0x00,
+                       0x04,                              0x01}
+};
+
+/*
+ * P4M890 chipset FP DPA parameters for dot clock at or above 150 MHz.
+ */
+static VIADPARec viaDPAP4M890Clock150M[] = {
+    /*      DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive,
+     *      DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive,
+     *  FPDP Low Adjustment,              FPDP High Adjustment */
+    {                  0x01,             0x02,            0x02,
+                       0x03,             0x00,            0x00,
+                       0x04,                              0x0D}
+};
+
+/*
+ * P4M890 Chipset FP DPA (Digital Panel Adjustment?) Table
+ */
+static VIADPAInfoTableRec viaDPAFPP4M890[] = {
+    {         VIA_DPA_CLK_RANGE_30M,      viaDPAP4M890ClockDefault},
+    {     VIA_DPA_CLK_RANGE_30M_50M,      viaDPAP4M890ClockDefault},
+    {     VIA_DPA_CLK_RANGE_50M_70M,       viaDPAP4M890Clock50M70M},
+    {    VIA_DPA_CLK_RANGE_70M_100M,      viaDPAP4M890Clock70M100M},
+    {   VIA_DPA_CLK_RANGE_100M_150M,     viaDPAP4M890Clock100M150M},
+    {        VIA_DPA_CLK_RANGE_150M,         viaDPAP4M890Clock150M}
+};
+
+
+/*
+ * K8M890 chipset FP DPA parameters default setting.
+ */
+static VIADPARec viaDPAK8M890ClockDefault[] = {
+    /*      DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive,
+     *      DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive,
+     *  FPDP Low Adjustment,              FPDP High Adjustment */
+    {                  0x04,             0x00,            0x00,
+                       0x03,             0x00,            0x00,
+                       0x04,                              0x04}
+};
+
+/*
+ * K8M890 chipset FP DPA parameters for dot clock at or above 50 MHz
+ * but below 70 MHz.
+ */
+static VIADPARec viaDPAK8M890Clock50M70M[] = {
+    /*      DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive,
+     *      DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive,
+     *  FPDP Low Adjustment,              FPDP High Adjustment */
+    {                  0x06,             0x00,            0x00,
+                       0x03,             0x00,            0x00,
+                       0x04,                              0x02}
+};
+
+/*
+ * K8M890 chipset FP DPA parameters for dot clock at or above 70 MHz
+ * but below 100 MHz.
+ */
+static VIADPARec viaDPAK8M890Clock70M100M[] = {
+    /*      DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive,
+     *      DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive,
+     *  FPDP Low Adjustment,              FPDP High Adjustment */
+    {                  0x02,             0x00,            0x00,
+                       0x03,             0x00,            0x00,
+                       0x02,                              0x02}
+};
+
+/*
+ * K8M890 chipset FP DPA parameters for dot clock at or above 100 MHz
+ * but below 150 MHz.
+ */
+static VIADPARec viaDPAK8M890Clock100M150M[] = {
+    /*      DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive,
+     *      DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive,
+     *  FPDP Low Adjustment,              FPDP High Adjustment */
+    {                  0x02,             0x00,            0x00,
+                       0x03,             0x00,            0x00,
+                       0x02,                              0x02}
+};
+
+/*
+ * K8M890 chipset FP DPA parameters for dot clock at or above 150 MHz.
+ */
+static VIADPARec viaDPAK8M890Clock150M[] = {
+    /*      DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive,
+     *      DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive,
+     *  FPDP Low Adjustment,              FPDP High Adjustment */
+    {                  0x03,             0x00,            0x00,
+                       0x03,             0x00,            0x00,
+                       0x02,                              0x02}
+};
+
+/*
+ * K8M890 Chipset FP DPA (Digital Panel Adjustment?) Table
+ */
+static VIADPAInfoTableRec viaDPAFPK8M890[] = {
+    {         VIA_DPA_CLK_RANGE_30M,      viaDPAK8M890ClockDefault},
+    {     VIA_DPA_CLK_RANGE_30M_50M,      viaDPAK8M890ClockDefault},
+    {     VIA_DPA_CLK_RANGE_50M_70M,       viaDPAK8M890Clock50M70M},
+    {    VIA_DPA_CLK_RANGE_70M_100M,      viaDPAK8M890Clock70M100M},
+    {   VIA_DPA_CLK_RANGE_100M_150M,     viaDPAK8M890Clock100M150M},
+    {        VIA_DPA_CLK_RANGE_150M,         viaDPAK8M890Clock150M}
+};
+
+
+/*
+ * P4M900 chipset FP DPA parameters default setting.
+ */
+static VIADPARec viaDPAP4M900ClockDefault[] = {
+    /*      DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive,
+     *      DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive,
+     *  FPDP Low Adjustment,              FPDP High Adjustment */
+    {                  0x07,             0x00,            0x00,
+                       0x03,             0x00,            0x00,
+                       0x08,                              0x00}
+};
+
+/*
+ * P4M900 chipset FP DPA parameters for dot clock at or above 100 MHz
+ * but below 150 MHz.
+ */
+static VIADPARec viaDPAP4M900Clock100M150M[] = {
+    /*      DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive,
+     *      DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive,
+     *  FPDP Low Adjustment,              FPDP High Adjustment */
+    {                  0x03,             0x00,            0x01,
+                       0x03,             0x00,            0x00,
+                       0x08,                              0x00}
+};
+
+/*
+ * P4M900 chipset FP DPA parameters for dot clock at or above 150 MHz.
+ */
+static VIADPARec viaDPAP4M900Clock150M[] = {
+    /*      DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive,
+     *      DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive,
+     *  FPDP Low Adjustment,              FPDP High Adjustment */
+    {                  0x01,             0x02,            0x01,
+                       0x03,             0x00,            0x00,
+                       0x08,                              0x00}
+};
+
+/*
+ * P4M900 Chipset FP DPA (Digital Panel Adjustment?) Table
+ */
+static VIADPAInfoTableRec viaDPAFPP4M900[] = {
+    {         VIA_DPA_CLK_RANGE_30M,      viaDPAP4M900ClockDefault},
+    {     VIA_DPA_CLK_RANGE_30M_50M,      viaDPAP4M900ClockDefault},
+    {     VIA_DPA_CLK_RANGE_50M_70M,      viaDPAP4M900ClockDefault},
+    {    VIA_DPA_CLK_RANGE_70M_100M,      viaDPAP4M900ClockDefault},
+    {   VIA_DPA_CLK_RANGE_100M_150M,     viaDPAP4M900Clock100M150M},
+    {        VIA_DPA_CLK_RANGE_150M,         viaDPAP4M900Clock150M}
+};
+
+
+static VIA_DPA_INDEX_TABLE viaDPAIndexTable[] = {
+//  {VIA_CX700,     NULL,   NULL},
+    {VIA_P4M890,    NULL,   viaDPAFPP4M890},
+    {VIA_K8M890,    NULL,   viaDPAFPK8M890},
+    {VIA_P4M900,    NULL,   viaDPAFPP4M900},
+//  {VIA_VX800,     NULL,   NULL}
+};
+
+#endif /* _VIA_FP_H_ */
diff --git a/src/via_i2c.c b/src/via_i2c.c
index c985dc2..91e1add 100644
--- a/src/via_i2c.c
+++ b/src/via_i2c.c
@@ -39,6 +39,12 @@
 #define SDA_WRITE 0x10
 #define SCL_WRITE 0x20
 
+
+static char strI2CBus1[] = "I2C Bus 1";
+static char strI2CBus2[] = "I2C Bus 2";
+static char strI2CBus3[] = "I2C Bus 3";
+
+
 /*
  * First I2C Bus: Typically used for detecting a VGA monitor.
  */
@@ -61,7 +67,10 @@ static void
 ViaI2C1GetBits(I2CBusPtr Bus, int *clock, int *data)
 {
     vgaHWPtr hwp = Bus->DriverPrivate.ptr;
-    CARD8 value = hwp->readSeq(hwp, 0x26);
+    CARD8 value;
+
+    ViaSeqMask(hwp, 0x26, 0x01, 0x01);
+    value = hwp->readSeq(hwp, 0x26);
 
     *clock = (value & SCL_READ) != 0;
     *data = (value & SDA_READ) != 0;
@@ -70,12 +79,13 @@ ViaI2C1GetBits(I2CBusPtr Bus, int *clock, int *data)
 static I2CBusPtr
 ViaI2CBus1Init(ScrnInfoPtr pScrn)
 {
+    vgaHWPtr hwp = VGAHWPTR(pScrn);
+    I2CBusPtr pI2CBus;
+
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered ViaI2CBus1Init.\n"));
 
-    I2CBusPtr pI2CBus = xf86CreateI2CBusRec();
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
+    pI2CBus = xf86CreateI2CBusRec();
     if (!pI2CBus) {
         DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                             "xf86CreateI2CBusRec failed.\n"));
@@ -86,15 +96,21 @@ ViaI2CBus1Init(ScrnInfoPtr pScrn)
         return NULL;
     }
 
-    pI2CBus->BusName = "I2C Bus 1";
+    pI2CBus->BusName = strI2CBus1;
     pI2CBus->scrnIndex = pScrn->scrnIndex;
+
     pI2CBus->I2CPutBits = ViaI2C1PutBits;
     pI2CBus->I2CGetBits = ViaI2C1GetBits;
+
     pI2CBus->DriverPrivate.ptr = hwp;
-    pI2CBus->ByteTimeout = 2200;
-    pI2CBus->StartTimeout = 550;
+
     pI2CBus->HoldTime = 40;
+
     pI2CBus->BitTimeout = 40;
+    pI2CBus->ByteTimeout = 2200;
+    pI2CBus->AcknTimeout = 40;
+    pI2CBus->StartTimeout = 550;
+    pI2CBus->RiseFallTime = 20;
 
     if (!xf86I2CBusInit(pI2CBus)) {
         DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
@@ -135,7 +151,10 @@ static void
 ViaI2C2GetBits(I2CBusPtr Bus, int *clock, int *data)
 {
     vgaHWPtr hwp = Bus->DriverPrivate.ptr;
-    CARD8 value = hwp->readSeq(hwp, 0x31);
+    CARD8 value;
+
+    ViaSeqMask(hwp, 0x31, 0x01, 0x01);
+    value = hwp->readSeq(hwp, 0x31);
 
     *clock = (value & SCL_READ) != 0;
     *data = (value & SDA_READ) != 0;
@@ -144,12 +163,13 @@ ViaI2C2GetBits(I2CBusPtr Bus, int *clock, int *data)
 static I2CBusPtr
 ViaI2CBus2Init(ScrnInfoPtr pScrn)
 {
+    vgaHWPtr hwp = VGAHWPTR(pScrn);
+    I2CBusPtr pI2CBus;
+
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered ViaI2CBus2Init.\n"));
 
-    I2CBusPtr pI2CBus = xf86CreateI2CBusRec();
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
+    pI2CBus = xf86CreateI2CBusRec();
     if (!pI2CBus) {
         DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                             "xf86CreateI2CBusRec failed.\n"));
@@ -160,12 +180,22 @@ ViaI2CBus2Init(ScrnInfoPtr pScrn)
         return NULL;
     }
 
-    pI2CBus->BusName = "I2C Bus 2";
+    pI2CBus->BusName = strI2CBus2;
     pI2CBus->scrnIndex = pScrn->scrnIndex;
+
     pI2CBus->I2CPutBits = ViaI2C2PutBits;
     pI2CBus->I2CGetBits = ViaI2C2GetBits;
+
     pI2CBus->DriverPrivate.ptr = hwp;
 
+    pI2CBus->HoldTime = 40;
+
+    pI2CBus->BitTimeout = 40;
+    pI2CBus->ByteTimeout = 2200;
+    pI2CBus->AcknTimeout = 40;
+    pI2CBus->StartTimeout = 550;
+    pI2CBus->RiseFallTime = 20;
+
     if (!xf86I2CBusInit(pI2CBus)) {
         DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                             "xf86I2CBusInit failed.\n"));
@@ -369,13 +399,13 @@ ViaI2C3SimpleGetBits(I2CBusPtr Bus, int *clock, int *data)
 static I2CBusPtr
 ViaI2CBus3Init(ScrnInfoPtr pScrn)
 {
+    vgaHWPtr hwp = VGAHWPTR(pScrn);
+    I2CBusPtr pI2CBus;
+
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered ViaI2CBus3Init.\n"));
 
-    I2CBusPtr pI2CBus = xf86CreateI2CBusRec();
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    VIAPtr pVia = VIAPTR(pScrn);
-
+    pI2CBus = xf86CreateI2CBusRec();
     if (!pI2CBus) {
         DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                             "xf86CreateI2CBusRec failed.\n"));
@@ -386,33 +416,29 @@ ViaI2CBus3Init(ScrnInfoPtr pScrn)
         return NULL;
     }
 
-    pI2CBus->BusName = "I2C Bus 3";
+    pI2CBus->BusName = strI2CBus3;
     pI2CBus->scrnIndex = pScrn->scrnIndex;
-    pI2CBus->DriverPrivate.ptr = hwp;
 
-    switch (pVia->Chipset) {
-        case VIA_P4M800PRO:
-            DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                                "using alternative PutBits/GetBits functions for I2C Bus 3\n"));
-            pI2CBus->I2CPutBits = ViaI2C3SimplePutBits;
-            pI2CBus->I2CGetBits = ViaI2C3SimpleGetBits;
-            break;
-        default:
-            pI2CBus->I2CAddress = ViaI2C3Address;
+    pI2CBus->I2CPutBits = ViaI2C3SimplePutBits;
+    pI2CBus->I2CGetBits = ViaI2C3SimpleGetBits;
+
 #ifdef X_NEED_I2CSTART
-            pI2CBus->I2CStart = ViaI2C3Start;
+    pI2CBus->I2CStart = ViaI2C3Start;
 #endif
-            pI2CBus->I2CStop = ViaI2C3Stop;
-            pI2CBus->I2CPutByte = ViaI2C3PutByte;
-            pI2CBus->I2CGetByte = ViaI2C3GetByte;
-            pI2CBus->DriverPrivate.ptr = hwp;
-
-            pI2CBus->BitTimeout = 10;
-            pI2CBus->ByteTimeout = 10;
-            pI2CBus->HoldTime = 10;
-            pI2CBus->StartTimeout = 10;
-            break;
-    }
+    pI2CBus->I2CAddress = ViaI2C3Address;
+    pI2CBus->I2CStop = ViaI2C3Stop;
+    pI2CBus->I2CPutByte = ViaI2C3PutByte;
+    pI2CBus->I2CGetByte = ViaI2C3GetByte;
+
+    pI2CBus->DriverPrivate.ptr = hwp;
+
+    pI2CBus->HoldTime = 40;
+
+    pI2CBus->BitTimeout = 40;
+    pI2CBus->ByteTimeout = 2200;
+    pI2CBus->AcknTimeout = 40;
+    pI2CBus->StartTimeout = 550;
+    pI2CBus->RiseFallTime = 20;
 
     if (!xf86I2CBusInit(pI2CBus)) {
         DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
@@ -456,24 +482,25 @@ void
 ViaI2CInit(ScrnInfoPtr pScrn)
 {
     VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
                         "Entered ViaI2CInit.\n"));
 
-    if (pVia->I2CDevices & VIA_I2C_BUS1)
-        pVia->pI2CBus1 = ViaI2CBus1Init(pScrn);
-    if (pVia->I2CDevices & VIA_I2C_BUS2)
-        pVia->pI2CBus2 = ViaI2CBus2Init(pScrn);
-    if (pVia->I2CDevices & VIA_I2C_BUS3)
-        pVia->pI2CBus3 = ViaI2CBus3Init(pScrn);
+    if (pVIADisplay->I2CDevices & VIA_I2C_BUS1)
+        pVIADisplay->pI2CBus1 = ViaI2CBus1Init(pScrn);
+    if (pVIADisplay->I2CDevices & VIA_I2C_BUS2)
+        pVIADisplay->pI2CBus2 = ViaI2CBus2Init(pScrn);
+    if (pVIADisplay->I2CDevices & VIA_I2C_BUS3)
+        pVIADisplay->pI2CBus3 = ViaI2CBus3Init(pScrn);
 
 #ifdef HAVE_DEBUG
-    if (pVia->I2CScan) {
-        if (pVia->pI2CBus2)
-            ViaI2CScan(pVia->pI2CBus2);
-        if (pVia->pI2CBus3)
-            ViaI2CScan(pVia->pI2CBus3);
-    }
+    if (pVIADisplay->pI2CBus1)
+        ViaI2CScan(pVIADisplay->pI2CBus1);
+    if (pVIADisplay->pI2CBus2)
+        ViaI2CScan(pVIADisplay->pI2CBus2);
+    if (pVIADisplay->pI2CBus3)
+        ViaI2CScan(pVIADisplay->pI2CBus3);
 #endif
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
diff --git a/src/via_id.c b/src/via_id.c
deleted file mode 100644
index 00c8720..0000000
--- a/src/via_id.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2005-2015 The Openchrome Project
- *                     [https://www.freedesktop.org/wiki/Openchrome]
- * Copyright 2004-2005 The Unichrome Project  [unichrome.sf.net]
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * A big structure with card-ID information, plus some checking functions.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "via_driver.h"
-
-static void
-ViaDoubleCheckCLE266Revision(ScrnInfoPtr pScrn)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    VIAPtr pVia = VIAPTR(pScrn);
-    /* Crtc 0x4F is only defined in CLE266Cx */
-    CARD8 tmp = hwp->readCrtc(hwp, 0x4F);
-
-    hwp->writeCrtc(hwp, 0x4F, 0x55);
-    if (hwp->readCrtc(hwp, 0x4F) == 0x55) {
-        if (CLE266_REV_IS_AX(pVia->ChipRev))
-            xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "CLE266 Revision seems"
-                       " to be Cx, yet %d was detected previously.\n",
-                       pVia->ChipRev);
-    } else {
-        if (CLE266_REV_IS_CX(pVia->ChipRev))
-            xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "CLE266 Revision seems"
-                       " to be Ax, yet %d was detected previously.\n",
-                       pVia->ChipRev);
-    }
-    hwp->writeCrtc(hwp, 0x4F, tmp);
-}
diff --git a/src/via_kms.c b/src/via_kms.c
index 2bb0a86..f414656 100644
--- a/src/via_kms.c
+++ b/src/via_kms.c
@@ -192,7 +192,8 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
     if (drmmode->fb_id == 0) {
         ret = drmModeAddFB(drmmode->fd, pScrn->virtualX, pScrn->virtualY,
                             pScrn->depth, pScrn->bitsPerPixel,
-                            drmmode->front_bo->pitch,
+                            pScrn->virtualX *
+                            ((pScrn->bitsPerPixel + 7) >> 3),
                             drmmode->front_bo->handle,
                             &drmmode->fb_id);
         if (ret < 0) {
@@ -227,8 +228,6 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
                            crtc->gamma_blue, crtc->gamma_size);
 #endif
 
-    if (pScrn->pScreen && drmmode->hwcursor)
-        xf86_reload_cursors(pScrn->pScreen);
 done:
     free(output_ids);
     return (ret < 0 ? FALSE : TRUE);
@@ -400,7 +399,7 @@ drmmode_output_create_resources(xf86OutputPtr output)
         drmmode_prop = p->mode_prop;
 
         if (drmmode_prop->flags & DRM_MODE_PROP_RANGE) {
-            INT32 range[2];
+            INT32 prop_range[2];
             INT32 value = p->value;
 
             p->num_atoms = 1;
@@ -408,12 +407,12 @@ drmmode_output_create_resources(xf86OutputPtr output)
             if (!p->atoms)
                 continue;
             p->atoms[0] = MakeAtom(drmmode_prop->name, strlen(drmmode_prop->name), TRUE);
-            range[0] = drmmode_prop->values[0];
-            range[1] = drmmode_prop->values[1];
+            prop_range[0] = drmmode_prop->values[0];
+            prop_range[1] = drmmode_prop->values[1];
             err = RRConfigureOutputProperty(output->randr_output, p->atoms[0],
                                             FALSE, TRUE,
                                             drmmode_prop->flags & DRM_MODE_PROP_IMMUTABLE ? TRUE : FALSE,
-                                            2, range);
+                                            2, prop_range);
             if (err != 0) {
                 xf86DrvMsg(output->scrn->scrnIndex, X_ERROR,
                             "RRConfigureOutputProperty error, %d\n", err);
@@ -739,7 +738,8 @@ out_free_encoders:
     drmModeFreeConnector(koutput);
 }
 
-uint32_t find_clones(ScrnInfoPtr scrn, xf86OutputPtr output)
+static uint32_t
+find_clones(ScrnInfoPtr scrn, xf86OutputPtr output)
 {
     drmmode_output_private_ptr drmmode_output = output->driver_private, clone_drmout;
     xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
diff --git a/src/via_memcpy.c b/src/via_memcpy.c
index 85db0ef..d2f1d94 100644
--- a/src/via_memcpy.c
+++ b/src/via_memcpy.c
@@ -459,15 +459,15 @@ enum
 typedef struct
 {
     vidCopyFunc mFunc;
-    char *mName, **cpuFlag;
+    const char *mName, **cpuFlag;
 } McFuncData;
 
-static char *libc_cpuflags[] = { " ", 0 };
-static char *kernel_cpuflags[] = { " ", 0 };
-static char *sse_cpuflags[] = { " sse ", 0 };
-static char *mmx_cpuflags[] = { " mmx ", 0 };
-static char *now_cpuflags[] = { " 3dnow ", 0 };
-static char *mmx2_cpuflags[] = { " mmxext ", " sse ", 0 };
+static const char *libc_cpuflags[] = { " ", 0 };
+static const char *kernel_cpuflags[] = { " ", 0 };
+static const char *sse_cpuflags[] = { " sse ", 0 };
+static const char *mmx_cpuflags[] = { " mmx ", 0 };
+static const char *now_cpuflags[] = { " 3dnow ", 0 };
+static const char *mmx2_cpuflags[] = { " mmxext ", " sse ", 0 };
 
 static McFuncData mcFunctions[totNum] = {
 {libc_YUV42X, "libc", libc_cpuflags},
@@ -480,7 +480,7 @@ static McFuncData mcFunctions[totNum] = {
 
 
 static int
-flagValid(const char *cpuinfo, char *flag)
+flagValid(const char *cpuinfo, const char *flag)
 {
     const char *flagLoc, *nextProc;
     int located = 0;
@@ -502,7 +502,7 @@ flagValid(const char *cpuinfo, char *flag)
 
 
 static int
-cpuValid(const char *cpuinfo, char **flags)
+cpuValid(const char *cpuinfo, const char **flags)
 {
     for (; *flags != 0; flags++) {
         if (flagValid(cpuinfo, *flags))
@@ -515,7 +515,7 @@ cpuValid(const char *cpuinfo, char **flags)
  * Benchmark the video copy routines and choose the fastest.
  */
 vidCopyFunc
-viaVidCopyInit(char *copyType, ScreenPtr pScreen)
+viaVidCopyInit(const char *copyType, ScreenPtr pScreen)
 {
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
 
@@ -638,7 +638,7 @@ viaVidCopyInit(char *copyType, ScreenPtr pScreen)
 #else
 
 vidCopyFunc
-viaVidCopyInit(char *copyType, ScreenPtr pScreen)
+viaVidCopyInit(const char *copyType, ScreenPtr pScreen)
 {
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
 
diff --git a/src/via_memmgr.c b/src/via_memmgr.c
index d87d075..70cf6ad 100644
--- a/src/via_memmgr.c
+++ b/src/via_memmgr.c
@@ -42,146 +42,155 @@
 #include "drm_fourcc.h"
 #endif
 
-/*
- *	Isolate the wonders of X memory allocation and DRI memory allocation
- *	and 4.3 or 4.4 differences in one abstraction.
- *
- *	The pool code indicates who provided the memory:
- *	0  -  nobody
- *	1  -  xf86 linear
- *	2  -  DRM
- */
-int
-viaOffScreenLinear(struct buffer_object *obj, ScrnInfoPtr pScrn,
-                   unsigned long size)
+static int
+viaOffScreenLinear(ScrnInfoPtr pScrn, struct buffer_object *obj,
+                    unsigned long size, unsigned long alignment)
 {
-    int depth = pScrn->bitsPerPixel >> 3;
     FBLinearPtr linear;
+    int depth = pScrn->bitsPerPixel / 8;
+    int newAlignment;
+    int ret = 0;
 
+    newAlignment = alignment;
     linear = xf86AllocateOffscreenLinear(pScrn->pScreen,
-                                        (size + depth - 1) / depth,
-                                        32, NULL, NULL, NULL);
-    if (!linear)
-        return BadAlloc;
+                                            (size + depth - 1) / depth,
+                                            newAlignment,
+                                            NULL, NULL, NULL);
+    if (!linear) {
+        ret = -ENOMEM;
+        goto exit;
+    }
+
     obj->offset = linear->offset * depth;
     obj->handle = (unsigned long) linear;
     obj->domain = TTM_PL_FLAG_VRAM;
     obj->size = size;
-    return Success;
-}
-
-struct buffer_object *
-drm_bo_alloc_surface(ScrnInfoPtr pScrn, unsigned int width, unsigned int height,
-                    int format, unsigned int alignment, int domain)
-{
-    struct buffer_object *obj = NULL;
-    int pitch;
-
-    switch (format) {
-    case DRM_FORMAT_C8:
-        pitch = width;
-        break;
-
-    case DRM_FORMAT_XRGB1555:
-    case DRM_FORMAT_RGB565:
-        pitch = width * 2;
-        break;
-
-    case DRM_FORMAT_RGB888:
-        pitch = width * 3;
-        break;
 
-    case DRM_FORMAT_XRGB2101010:
-    case DRM_FORMAT_XRGB8888:
-        pitch = width * 4;
-        break;
-    }
-
-    pitch = ALIGN_TO(pitch, alignment);
-    obj = drm_bo_alloc(pScrn, pitch * height, alignment, domain);
-    if (!obj->pitch)
-        obj->pitch = pitch;
-    return obj;
+exit:
+    return ret;
 }
 
 struct buffer_object *
-drm_bo_alloc(ScrnInfoPtr pScrn, unsigned int size, unsigned int alignment, int domain)
+drm_bo_alloc(ScrnInfoPtr pScrn, unsigned long size,
+                unsigned long alignment, int domain)
 {
     struct buffer_object *obj = NULL;
     VIAPtr pVia = VIAPTR(pScrn);
     int ret = 0;
 
     obj = xnfcalloc(1, sizeof(*obj));
-    if (obj) {
-        switch (domain) {
-        case TTM_PL_FLAG_TT:
-        case TTM_PL_FLAG_VRAM:
-            if (pVia->directRenderingType == DRI_NONE) {
-                if (Success != viaOffScreenLinear(obj, pScrn, size)) {
-                    ErrorF("Linear memory allocation failed\n");
-                    ret = -ENOMEM;
-                } else
-                    DEBUG(ErrorF("%lu bytes of Linear memory allocated at %lx, handle %lu\n", obj->size, obj->offset, obj->handle));
-#ifdef HAVE_DRI
-            } else if (pVia->directRenderingType == DRI_1) {
-                drm_via_mem_t drm;
+    if (!obj) {
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                            "Allocation of a buffer object used for "
+                            "memory allocation failed.\n"));
+        goto exit;
+    }
 
-                size = ALIGN_TO(size, alignment);
-                drm.context = DRIGetContext(pScrn->pScreen);
-                drm.size = size;
-                drm.type = (domain == TTM_PL_FLAG_TT ? VIA_MEM_AGP : VIA_MEM_VIDEO);
-                ret = drmCommandWriteRead(pVia->drmmode.fd, DRM_VIA_ALLOCMEM,
-                                            &drm, sizeof(drm_via_mem_t));
-                if (!ret && (size == drm.size)) {
-                    if (domain == TTM_PL_FLAG_VRAM)
-                        drm.offset -= pVia->FBFreeStart;
-                    obj->offset = ALIGN_TO(drm.offset, alignment);
-                    obj->handle = drm.index;
-                    obj->domain = domain;
-                    obj->size = drm.size;
-                    DEBUG(ErrorF("%lu bytes of DRI memory allocated at %lx, handle %lu\n",
-                                obj->size, obj->offset, obj->handle));
+    switch (domain) {
+    case TTM_PL_FLAG_TT:
+    case TTM_PL_FLAG_VRAM:
+        if (pVia->directRenderingType == DRI_NONE) {
+            if (!pVia->useEXA) {
+                ret = viaOffScreenLinear(pScrn, obj,
+                                            size, alignment);
+                if (ret) {
+                    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                                        "Linear memory allocation "
+                                        "failed.\n"));
+                } else {
+                    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                                        "%lu bytes of linear memory "
+                                        "allocated at 0x%lx, handle "
+                                        "0x%lx.\n",
+                                        obj->size, obj->offset,
+                                        obj->handle));
                 }
-            } else if (pVia->directRenderingType == DRI_2) {
-                struct drm_via_gem_object args;
-
-                /* Some day this will be moved to libdrm. */
-                args.domains = domain;
-                args.alignment = alignment;
-                args.pitch = 0;
-                args.size = size;
-                ret = drmCommandWriteRead(pVia->drmmode.fd, DRM_VIA_GEM_CREATE,
-                                        &args, sizeof(struct drm_via_gem_object));
-                if (!ret) {
-                    /* Okay the X server expects to know the offset because
-                     * of non-KMS. Once we have KMS working the offset
-                     * will not be valid. */
-                    obj->map_offset = args.map_handle;
-                    obj->offset = args.offset;
-                    obj->handle = args.handle;
-                    obj->pitch = args.pitch;
-                    obj->size = args.size;
-                    obj->domain = domain;
-                    DEBUG(ErrorF("%lu bytes of DRI2 memory allocated at %lx, handle %lu\n",
-                                obj->size, obj->offset, obj->handle));
+            } else {
+                ret = viaEXAOffscreenAlloc(pScrn, obj,
+                                            size, alignment);
+                if (ret) {
+                    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                                        "EXA offscreen memory "
+                                        "allocation failed.\n"));
+                } else {
+                    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                                        "%lu bytes of EXA offscreen "
+                                        "memory allocated at 0x%lx, "
+                                        "handle 0x%lx.\n",
+                                        obj->size, obj->offset,
+                                        obj->handle));
                 }
-#endif
             }
-            break;
+#ifdef HAVE_DRI
+        } else if (pVia->directRenderingType == DRI_1) {
+            drm_via_mem_t drm;
 
-        case TTM_PL_FLAG_SYSTEM:
-        default:
-            ret = -ENXIO;
-            break;
+            size = ALIGN_TO(size, alignment);
+            drm.context = DRIGetContext(pScrn->pScreen);
+            drm.size = size;
+            drm.type = (domain == TTM_PL_FLAG_TT ? VIA_MEM_AGP : VIA_MEM_VIDEO);
+            ret = drmCommandWriteRead(pVia->drmmode.fd, DRM_VIA_ALLOCMEM,
+                                        &drm, sizeof(drm_via_mem_t));
+            if (!ret && (size == drm.size)) {
+                if (domain == TTM_PL_FLAG_VRAM)
+                    drm.offset -= pVia->FBFreeStart;
+                obj->offset = ALIGN_TO(drm.offset, alignment);
+                obj->handle = drm.index;
+                obj->domain = domain;
+                obj->size = drm.size;
+                DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                                    "%lu bytes of DRI memory "
+                                    "allocated at 0x%lx, "
+                                    "handle 0x%lx.\n",
+                                    obj->size, obj->offset,
+                                    obj->handle));
+            }
+        } else if (pVia->directRenderingType == DRI_2) {
+            struct drm_via_gem_object args;
+
+            /* Some day this will be moved to libdrm. */
+            args.domains = domain;
+            args.alignment = alignment;
+            args.size = size;
+            ret = drmCommandWriteRead(pVia->drmmode.fd, DRM_VIA_GEM_CREATE,
+                                    &args, sizeof(struct drm_via_gem_object));
+            if (!ret) {
+                /* Okay the X server expects to know the offset because
+                 * of non-KMS. Once we have KMS working the offset
+                 * will not be valid. */
+                obj->map_offset = args.map_handle;
+                obj->offset = args.offset;
+                obj->handle = args.handle;
+                obj->size = args.size;
+                obj->domain = domain;
+                DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                                    "%lu bytes of DRI2 memory "
+                                    "allocated at 0x%lx, "
+                                    "handle 0x%lx.\n",
+                                    obj->size, obj->offset,
+                                    obj->handle));
+            }
+#endif
         }
+        break;
 
-        if (ret) {
-            DEBUG(ErrorF("DRM memory allocation failed %d\n", ret));
-            free(obj);
-            obj = NULL;
-        };
+    case TTM_PL_FLAG_SYSTEM:
+    default:
+        ret = -ENXIO;
+        break;
     }
-    return obj;
+
+    if (ret) {
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                            "DRM memory allocation failed.\n"
+                            "Error Code: %d\n", ret));
+        free(obj);
+        obj = NULL;
+        goto exit;
+    }
+
+exit:
+     return obj;
 }
 
 void*
@@ -200,11 +209,11 @@ drm_bo_map(ScrnInfoPtr pScrn, struct buffer_object *obj)
         switch (obj->domain) {
 #ifdef HAVE_DRI
         case TTM_PL_FLAG_TT:
-            obj->ptr = (pVia->agpMappedAddr + obj->offset);
+            obj->ptr = (uint8_t*)pVia->agpMappedAddr + obj->offset;
             break;
 #endif
         case TTM_PL_FLAG_VRAM:
-            obj->ptr = (pVia->FBBase + obj->offset);
+            obj->ptr = pVia->FBBase + obj->offset;
             break;
         default:
             obj->ptr = NULL;
@@ -237,9 +246,16 @@ drm_bo_free(ScrnInfoPtr pScrn, struct buffer_object *obj)
         case TTM_PL_FLAG_VRAM:
         case TTM_PL_FLAG_TT:
             if (pVia->directRenderingType == DRI_NONE) {
-                FBLinearPtr linear = (FBLinearPtr) obj->handle;
+                if (!pVia->useEXA) {
+                    FBLinearPtr linear = (FBLinearPtr) obj->handle;
+
+                    xf86FreeOffscreenLinear(linear);
+                } else {
+                    ExaOffscreenArea *pArea =
+                                    (ExaOffscreenArea *)obj->handle;
 
-                xf86FreeOffscreenLinear(linear);
+                    exaOffscreenFree(pScrn->pScreen, pArea);
+                }
 #ifdef HAVE_DRI
             } else if (pVia->directRenderingType == DRI_1) {
                 drm_via_mem_t drm;
@@ -264,19 +280,3 @@ drm_bo_free(ScrnInfoPtr pScrn, struct buffer_object *obj)
         free(obj);
     }
 }
-
-Bool
-drm_bo_manager_init(ScrnInfoPtr pScrn)
-{
-    VIAPtr pVia = VIAPTR(pScrn);
-    Bool ret = TRUE;
-
-    if (pVia->directRenderingType == DRI_2)
-        return ret;
-    ret = umsCreate(pScrn);
-#ifdef HAVE_DRI
-    if (pVia->directRenderingType == DRI_1)
-        ret = VIADRIKernelInit(pScrn);
-#endif
-    return ret;
-}
diff --git a/src/via_memmgr.h b/src/via_memmgr.h
index e80cb84..54199f5 100644
--- a/src/via_memmgr.h
+++ b/src/via_memmgr.h
@@ -23,7 +23,6 @@
 #ifndef _VIA_MEMMGR_H_
 #define _VIA_MEMMGR_H_
 
-#include <sys/mman.h>
 #include "xf86.h"
 
 #define TTM_PL_FLAG_SYSTEM	1
@@ -34,21 +33,16 @@ struct buffer_object {
     off_t           map_offset;
     unsigned long   handle;
     unsigned long   offset;             /* Offset into fb */
-    unsigned long   pitch;
+    unsigned long   pitch;              /* No longer used. */
     unsigned long   size;
     void            *ptr;
     int             domain;
 };
 
-/* In via_memory.c */
-Bool drm_bo_manager_init(ScrnInfoPtr pScrn);
 
 struct buffer_object *
-drm_bo_alloc_surface(ScrnInfoPtr pScrn, unsigned int width, unsigned int height,
-                    int format, unsigned int alignment, int domain);
-struct buffer_object *
-drm_bo_alloc(ScrnInfoPtr pScrn, unsigned int size, unsigned int alignment,
-                int domain);
+drm_bo_alloc(ScrnInfoPtr pScrn, unsigned long size,
+                unsigned long alignment, int domain);
 void *drm_bo_map(ScrnInfoPtr pScrn, struct buffer_object *obj);
 void drm_bo_unmap(ScrnInfoPtr pScrn, struct buffer_object *obj);
 void drm_bo_free(ScrnInfoPtr pScrn, struct buffer_object *);
diff --git a/src/via_mode.h b/src/via_mode.h
deleted file mode 100644
index 5e18266..0000000
--- a/src/via_mode.h
+++ /dev/null
@@ -1,812 +0,0 @@
-/*
- * Copyright 2004-2005 The Unichrome Project  [unichrome.sf.net]
- * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef _VIA_MODE_H_
-#define _VIA_MODE_H_ 1
-
-/*
- * Bandwidth
- *
- */
-#define VIA_BW_MIN       74000000 /* > 640x480@60Hz@32bpp */
-#define VIA_BW_DDR200   394000000
-#define VIA_BW_DDR400   553000000 /* > 1920x1200@60Hz@32bpp */
-#define VIA_BW_DDR667   922000000
-#define VIA_BW_DDR1066  922000000
-
-union pllparams {
-    struct {
-        CARD32 dtz : 2;
-        CARD32 dr  : 3;
-        CARD32 dn  : 7;
-        CARD32 dm  :10;
-    } params;
-    CARD32 packed;
-};
-
-/*
- * simple lookup table for dotclocks
- *
- */
-static struct ViaDotClock {
-    int DotClock;
-    CARD16 UniChrome;
-    union pllparams UniChromePro;
-} ViaDotClocks[] = {
-    {  25200, 0x513C, /* 0xa79004 */ { { 1, 4, 6, 169 } } },
-    {  25312, 0xC763, /* 0xc49005 */ { { 1, 4, 7, 198 } } },
-    {  26591, 0x471A, /* 0xce9005 */ { { 1, 4, 7, 208 } } },
-    {  31500, 0xC558, /* 0xae9003 */ { { 1, 4, 5, 176 } } },
-    {  31704, 0x471F, /* 0xaf9002 */ { { 1, 4, 4, 177 } } },
-    {  32663, 0xC449, /* 0x479000 */ { { 1, 4, 2,  73 } } },
-    {  33750, 0x4721, /* 0x959002 */ { { 1, 4, 4, 151 } } },
-    {  35500, 0x5877, /* 0x759001 */ { { 1, 4, 3, 119 } } },
-    {  36000, 0x5879, /* 0x9f9002 */ { { 1, 4, 4, 161 } } },
-    {  39822, 0xC459, /* 0x578c02 */ { { 1, 3, 4,  89 } } },
-    {  40000, 0x515F, /* 0x848c04 */ { { 1, 3, 6, 134 } } },
-    {  41164, 0x4417, /* 0x2c8c00 */ { { 1, 3, 2,  46 } } },
-    {  46981, 0x5069, /* 0x678c02 */ { { 1, 3, 4, 105 } } },
-    {  49500, 0xC353, /* 0xa48c04 */ { { 3, 3, 5, 138 } } },
-    {  50000, 0xC354, /* 0x368c00 */ { { 1, 3, 2,  56 } } },
-    {  56300, 0x4F76, /* 0x3d8c00 */ { { 1, 3, 2,  63 } } },
-    {  57275,      0, /* 0x3e8c00 */ { { 1, 3, 5, 157 } } }, /* For XO 1.5 no need for a unichrome clock */
-    {  57284, 0x4E70, /* 0x3e8c00 */ { { 1, 3, 2,  64 } } },
-    {  64995, 0x0D3B, /* 0x6b8c01 */ { { 1, 3, 3, 109 } } },
-    {  65000, 0x0D3B, /* 0x6b8c01 */ { { 1, 3, 3, 109 } } }, /* Slightly unstable on PM800 */
-    {  65028, 0x866D, /* 0x6b8c01 */ { { 1, 3, 3, 109 } } },
-    {  74480, 0x156E, /* 0x288800 */ { { 1, 2, 2,  42 } } },
-    {  75000, 0x156E, /* 0x288800 */ { { 1, 2, 2,  42 } } },
-    {  78800, 0x442C, /* 0x2a8800 */ { { 1, 2, 2,  44 } } },
-    {  81135, 0x0622, /* 0x428801 */ { { 1, 2, 3,  68 } } },
-    {  81613, 0x4539, /* 0x708803 */ { { 1, 2, 5, 114 } } },
-    {  94500, 0x4542, /* 0x4d8801 */ { { 1, 2, 3,  79 } } },
-    { 108000, 0x0B53, /* 0x778802 */ { { 1, 2, 4, 121 } } },
-    { 108280, 0x4879, /* 0x778802 */ { { 1, 2, 4, 121 } } },
-    { 122000, 0x0D6F, /* 0x428800 */ { { 1, 2, 2,  68 } } },
-    { 122726, 0x073C, /* 0x878802 */ { { 1, 2, 4, 137 } } },
-    { 135000, 0x0742, /* 0x6f8801 */ { { 1, 2, 3, 113 } } },
-    { 148500, 0x0853, /* 0x518800 */ { { 1, 2, 2,  83 } } },
-    { 155800, 0x0857, /* 0x558402 */ { { 1, 1, 4,  87 } } },
-    { 157500, 0x422C, /* 0x2a8400 */ { { 1, 1, 2,  44 } } },
-    { 161793, 0x4571, /* 0x6f8403 */ { { 1, 1, 5, 113 } } },
-    { 162000, 0x0A71, /* 0x6f8403 */ { { 1, 1, 5, 113 } } },
-    { 175500, 0x4231, /* 0x2f8400 */ { { 1, 1, 2,  49 } } },
-    { 189000, 0x0542, /* 0x4d8401 */ { { 1, 1, 3,  79 } } },
-    { 202500, 0x0763, /* 0x6F8402 */ { { 1, 1, 4, 113 } } },
-    { 204800, 0x0764, /* 0x548401 */ { { 1, 1, 3,  86 } } },
-    { 218300, 0x043D, /* 0x3b8400 */ { { 1, 1, 2,  61 } } },
-    { 229500, 0x0660, /* 0x3e8400 */ { { 1, 1, 2,  64 } } }, /* Not tested on Pro } */
-    {      0,      0,                { { 0, 0, 0,   0 } } }
-};
-
-/*
- *
- * Panel
- *
- */
-
-#define VIA_RES_640X480     0
-#define VIA_RES_800X600     1
-#define VIA_RES_1024X768    2
-#define VIA_RES_1152X864    3
-#define VIA_RES_1280X1024   4
-#define VIA_RES_1600X1200   5
-#define VIA_RES_1440X1050   6
-#define VIA_RES_1280X768    7
-#define VIA_RES_1280X960    8
-#define VIA_RES_1920X1440   9
-#define VIA_RES_848X480    10
-#define VIA_RES_1400X1050  11
-#define VIA_RES_720X480    12
-#define VIA_RES_720X576    13
-#define VIA_RES_1024X512   14
-#define VIA_RES_856X480    15
-#define VIA_RES_1024X576   16
-#define VIA_RES_800X480    17
-#define VIA_RES_1280X800   18
-#define VIA_RES_1280X720   19
-#define VIA_RES_1920X1080  20
-#define VIA_RES_1366X768   22
-#define VIA_RES_1200X900   23
-#define VIA_RES_INVALID  0xFF
-
-#define     VIA_BIOS_REG_LCD_MAX_NUM        48
-#define     VIA_BIOS_NUM_LCD_SUPPORT_MASK   8
-#define     VIA_BIOS_NUM_PANEL              7
-#define     VIA_BIOS_MAX_NUM_MPATCH2        18
-#define     VIA_BIOS_MAX_NUM_MPATCH1        9
-#define     VIA_BIOS_MAX_NUM_CTREXP         5
-
-typedef struct _VIALCDMODEENTRY {
-    CARD16  LCDClk;
-    CARD16  VClk;
-    CARD16  LCDClk_12Bit;
-    CARD16  VClk_12Bit;
-    CARD8   port[VIA_BIOS_REG_LCD_MAX_NUM];
-    CARD8   offset[VIA_BIOS_REG_LCD_MAX_NUM];
-    CARD8   data[VIA_BIOS_REG_LCD_MAX_NUM];
-    int     numEntry;
-} VIALCDModeEntry, *VIALCDModeEntryPtr;
-
-
-typedef struct _VIALCDMPATCHENTRY {
-    CARD8   Mode;
-    CARD16  LCDClk;
-    CARD16  VClk;
-    CARD16  LCDClk_12Bit;
-    CARD16  VClk_12Bit;
-    CARD8   port[VIA_BIOS_REG_LCD_MAX_NUM];
-    CARD8   offset[VIA_BIOS_REG_LCD_MAX_NUM];
-    CARD8   data[VIA_BIOS_REG_LCD_MAX_NUM];
-    int     numEntry;
-} VIALCDMPatchEntry, *VIALCDMPatchEntryPtr;
-
-
-typedef struct _VIALCDMODETABLE {
-    CARD8                   fpIndex;
-    CARD8                   fpSize;
-    CARD8                   powerSeq;
-    int                     numMPatchDP2Ctr;
-    int                     numMPatchDP2Exp;
-    int                     numMPatchDP1Ctr;
-    int                     numMPatchDP1Exp;
-    CARD16                  SuptMode[VIA_BIOS_NUM_LCD_SUPPORT_MASK];
-    VIALCDModeEntry         FPconfigTb;
-    VIALCDModeEntry         InitTb;
-    VIALCDMPatchEntry       MPatchDP2Ctr[VIA_BIOS_MAX_NUM_MPATCH2];
-    VIALCDMPatchEntry       MPatchDP2Exp[VIA_BIOS_MAX_NUM_MPATCH2];
-    VIALCDMPatchEntry       MPatchDP1Ctr[VIA_BIOS_MAX_NUM_MPATCH1];
-    VIALCDMPatchEntry       MPatchDP1Exp[VIA_BIOS_MAX_NUM_MPATCH1];
-    VIALCDModeEntry         LowResCtr;
-    VIALCDModeEntry         LowResExp;
-    VIALCDModeEntry         MCtr[VIA_BIOS_MAX_NUM_CTREXP];
-    VIALCDModeEntry         MExp[VIA_BIOS_MAX_NUM_CTREXP];
-} VIALCDModeTableRec, *VIALCDModePtr;
-
-static const VIALCDModeTableRec lcdTable[] = {
-    { 0, 0, 0X1, 13, 13, 5, 5,
-        { 0XE0FF, 0XF, 0XC0FC, 0X1B, 0, 0X7000, 0, 0X7000 },
-        { 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7A, 0X7B, 0X7C, 0X7D, 0X7E, 0X7F, 0X80, 0X81, 0X82, 0X83, 0X84, 0X85, 0X86, 0X87, 0X88, 0X89, 0X8A, 0X8B, 0X8C, 0X8D, 0X8E, 0X8F, 0X90, 0X68, 0X69, 0X92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X2, 0X3, 0X4, 0X7, 0XA, 0XD, 0X13, 0X16, 0X19, 0X1C, 0X1D, 0X1E, 0X1F, 0, 0, 0X88, 0XD, 0X5D, 0X79, 0XFF, 0X10, 0XB, 0X67, 0, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 26 },
-        { 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X7F, 0X7F, 0X1F, 0X9A, 0X23, 0X87, 0XE7, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE1, 0X23, 0XA0, 0X50, 0, 0X5F, 0X63, 0XB, 0XDF, 0X12, 0XDF, 0XC, 0X12, 0XE2, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 },
-        {
-            { 0, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 },
-            { 0X2, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X6, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0XD, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 },
-            { 0XE, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0XF, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X9E, 0XCB, 0X9, 0XA0, 0X22, 0X5D, 0X5D, 0XA1, 0X13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X10, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X9E, 0XCB, 0X9, 0XA0, 0X22, 0X5D, 0X5D, 0XA1, 0X13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X13, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X30, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X5C, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XDF, 0X7F, 0X51, 0X13, 0XE7, 0X47, 0XC7, 0X53, 0X80, 0X9, 0X2, 0X55, 0X37, 0X50, 0XC7, 0X2, 0XC7, 0X2, 0X56, 0X18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0X7C, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XDF, 0X7F, 0X51, 0X13, 0XE7, 0X47, 0XEF, 0X67, 0X94, 0X9, 0X2, 0X69, 0X2B, 0X50, 0XEF, 0X2, 0XEF, 0X2, 0X6A, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0X22, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X7, 0XA7, 0X92, 0X13, 0XF, 0X6F, 0X2B, 0X85, 0XB2, 0X9, 0XA, 0X87, 0X29, 0X64, 0X2B, 0X2B, 0X88, 0X1A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 19 },
-            { 0X25, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X3F, 0XDF, 0X92, 0X13, 0X47, 0XA7, 0X7F, 0XAF, 0XDC, 0X9, 0XA, 0XB1, 0X34, 0X80, 0X7F, 0X7F, 0XB2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 },
-            { 0X2, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X6, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0XD, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 },
-            { 0XE, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0XF, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X9E, 0XCB, 0X9, 0XA0, 0X22, 0X5D, 0X5D, 0XA1, 0X13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X10, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X9E, 0XCB, 0X9, 0XA0, 0X22, 0X5D, 0X5D, 0XA1, 0X13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X13, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X30, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X5C, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XDF, 0X7F, 0X51, 0X13, 0XE7, 0X47, 0XC7, 0X53, 0X80, 0X9, 0X2, 0X55, 0X37, 0X50, 0XC7, 0X2, 0XC7, 0X2, 0X56, 0X18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0X7C, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XDF, 0X7F, 0X51, 0X13, 0XE7, 0X47, 0XEF, 0X67, 0X94, 0X9, 0X2, 0X69, 0X2B, 0X50, 0XEF, 0X2, 0XEF, 0X2, 0X6A, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0X22, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X7, 0XA7, 0X92, 0X13, 0XF, 0X6F, 0X2B, 0X85, 0XB2, 0X9, 0XA, 0X87, 0X29, 0X64, 0X2B, 0X2B, 0X88, 0X1A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 19 },
-            { 0X25, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X3F, 0XDF, 0X92, 0X13, 0X47, 0XA7, 0X7F, 0XAF, 0XDC, 0X9, 0XA, 0XB1, 0X34, 0X80, 0X7F, 0X7F, 0XB2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2, 0, 0, 0, 0, { 0XC4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X11, 0X4, 0X5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X6E, 0X52, 0X9E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4 },
-            { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X3D, 0X89, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X3D, 0X89, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2, 0, 0, 0, 0, { 0XC4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X11, 0X4, 0X5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X6E, 0X52, 0X9E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4 },
-            { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X3D, 0X89, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X3D, 0X89, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        { 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 },
-        { 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 },
-        {
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        }
-    },
-    { 0X1, 0X1, 0X1, 14, 13, 4, 4,
-        { 0XE0FF, 0XF, 0XC1FC, 0X37B, 0, 0X7000, 0, 0X7000 },
-        { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-        { 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X1F, 0X1F, 0X1F, 0XE3, 0X34, 0X47, 0XC7, 0X73, 0X57, 0X57, 0X73, 0X52, 0X12, 0X58, 0X5C, 0XC8, 0X6E, 0, 0X7F, 0X83, 0X72, 0X57, 0X22, 0X57, 0X73, 0X22, 0X59, 0X2D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 },
-        {
-            { 0, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X65, 0X66, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X25, 0XCF, 0XF7, 0XF7, 0XDA, 0X1F, 0X9F, 0XB4, 0X6E, 0X36, 0X3A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 },
-            { 0X2, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0XA2, 0X7F, 0X83, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 13 }, 
-            { 0X6, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0XD, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0XE, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0XF, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XDA, 0XF6, 0X49, 0XDB, 0X3F, 0X5D, 0X5D, 0XDC, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X10, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XDA, 0XF6, 0X49, 0XDB, 0X3F, 0XA2, 0X5D, 0X5D, 0XDC, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, 
-            { 0X13, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0XA2, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, 
-            { 0X28, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1C, 0XCF, 0XF7, 0XF7, 0XDA, 0X1F, 0X9F, 0XB4, 0X70, 0X74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X30, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X5C, 0XC459, 0XC459, 0XC259, 0XC259, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X2F, 0X2F, 0X14, 0X57, 0XD7, 0XC7, 0X8F, 0XAB, 0X9, 0X2, 0X90, 0X34, 0X50, 0XC7, 0X2, 0XC7, 0X2, 0X91, 0X15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 20 },
-            { 0X7C, 0XC459, 0XC459, 0XC259, 0XC259, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X2F, 0X2F, 0X14, 0X57, 0XD7, 0XEF, 0XA3, 0XBF, 0X9, 0X2, 0XA4, 0X28, 0X50, 0XEF, 0X2, 0XEF, 0X2, 0XA5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 20 },
-            { 0X22, 0XC459, 0XC459, 0XC259, 0XC259, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X57, 0X57, 0X14, 0X7F, 0XFF, 0X2B, 0XC1, 0XDD, 0X9, 0XC2, 0X26, 0X64, 0X2B, 0X2B, 0XC3, 0X17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 },
-            { 0X25, 0XC459, 0XC459, 0XC259, 0XC259, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X8F, 0X8F, 0X14, 0XB7, 0X37, 0X7F, 0XEB, 0X7, 0X51, 0XEC, 0X30, 0X80, 0X7F, 0X7F, 0XED, 0X11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0, 0X8643, 0X86B9, 0X4643, 0X46B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X21, 0X21, 0XB4, 0X66, 0X98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 },
-            { 0X2, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X66, 0X6D, 0X6E, 0X6F, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X2F, 0X2F, 0X73, 0X61, 0X65, 0X72, 0X33, 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X6, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0XE, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0XF, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0X10, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0X13, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0X28, 0X8643, 0X86B9, 0X4643, 0X46B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X21, 0X21, 0XB4, 0X72, 0X98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 },
-            { 0X30, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0X5C, 0XC459, 0XC7BB, 0XC259, 0XC776, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X1F, 0X50, 0X5A, 0X2D, 0X31, 0X98, 0X54, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X7C, 0XC459, 0XC7BB, 0XC259, 0XC776, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X1F, 0X50, 0X55, 0X2D, 0X31, 0X98, 0X98, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X22, 0XC459, 0XC643, 0XC259, 0X8643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1B, 0X1B, 0X64, 0X5A, 0X3D, 0X41, 0, 0, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X25, 0XC459, 0X4511, 0XC259, 0X8544, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X23, 0X23, 0X80, 0X61, 0X4C, 0X50, 0X8E, 0X8E, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X4B, 0X9B, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X4B, 0X9B, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        { 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XCF, 0XCF, 0X9A, 0X24, 0XF7, 0X77, 0X8F, 0XF3, 0XF, 0X51, 0XA, 0XF4, 0X38, 0XA0, 0X68, 0X3D, 0X41, 0X8F, 0X12, 0X8F, 0X12, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 24 },
-        { 0X8643, 0X86B2, 0X4643, 0X46B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X2F, 0X2F, 0XA0, 0X5F, 0X2D, 0X31, 0X32, 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-        {
-            { 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XCF, 0XCF, 0X9A, 0X24, 0XF7, 0X77, 0XDF, 0X1B, 0X37, 0XA, 0X1C, 0X40, 0XA0, 0XDF, 0X12, 0XDF, 0X12, 0X1D, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 20 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1A, 0X1A, 0XA0, 0X5F, 0X63, 0X33, 0X32, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        }
-    },
-    { 0X2, 0X2, 0X1, 13, 14, 4, 4,
-        { 0XE0FF, 0XF, 0XC1FC, 0X6F7B, 0, 0X7000, 0, 0X7000 },
-        { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-        { 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XFF, 0XFF, 0X3F, 0X2B, 0X35, 0X17, 0X9F, 0X25, 0XFF, 0XFF, 0X25, 0X9A, 0X13, 0, 0X62, 0, 0X96, 0X4, 0XA3, 0XA7, 0X24, 0XFF, 0X23, 0XFF, 0X25, 0X23, 0X3, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 },
-        {
-            { 0, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X5C, 0X65, 0X66, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X45, 0XCF, 0X67, 0XA7, 0XE3, 0X7F, 0X7, 0X12, 0XB4, 0X87, 0X46, 0X4A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 },
-            { 0X2, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X66, 0X70, 0X72, 0X73, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X84, 0XD4, 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0XA2, 0XA0, 0X8E, 0X8E, 0X6E, 0X12, 0X4A, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 15 }, 
-            { 0X6, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0XE, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0XF, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X2E, 0X54, 0X31, 0X57, 0X5D, 0X5D, 0X32, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X10, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X2E, 0X54, 0X31, 0X57, 0XA2, 0X5D, 0X5D, 0X32, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, 
-            { 0X13, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0XA2, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, 
-            { 0X28, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X56, 0X57, 0X5C, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X45, 0XCF, 0X67, 0XA7, 0X7F, 0X7, 0X12, 0XB4, 0X91, 0X95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X30, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X5C, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X9F, 0XDF, 0X9A, 0X15, 0XB7, 0X3F, 0XC7, 0XE3, 0X9, 0X51, 0X3, 0XE6, 0X2C, 0X50, 0XC7, 0X3, 0XC7, 0X3, 0XE7, 0X1D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0X7C, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X9F, 0XDF, 0X9A, 0X15, 0XB7, 0X3F, 0XEF, 0XF7, 0X1D, 0X51, 0X3, 0XFA, 0X20, 0X50, 0XEF, 0X3, 0XEF, 0X3, 0XFB, 0X11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0X22, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0X7, 0XA2, 0X15, 0XDF, 0X67, 0X2B, 0X15, 0X3B, 0X18, 0X5E, 0X64, 0X2B, 0X2B, 0X19, 0X2F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 },
-            { 0X25, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0XFF, 0X3F, 0XE2, 0X15, 0X17, 0X9F, 0X7F, 0X3F, 0X65, 0X42, 0X48, 0X80, 0X7F, 0X7F, 0X43, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0, 0X86ED, 0X875A, 0X46ED, 0X475A, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X43, 0X43, 0XB4, 0X82, 0X30, 0X34, 0XD0, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 },
-            { 0X2, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X73, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X62, 0XA2, 0XFE, 0XFE, 0X24, 0X80, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, 
-            { 0X6, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0XD, 0X86ED, 0XC5ED, 0X46ED, 0X85ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X66, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X4F, 0X4F, 0X82, 0X2E, 0X32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 },
-            { 0XE, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0XF, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0XD2, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 },
-            { 0X10, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X80, 0XD2, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4 }, 
-            { 0X13, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X80, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 }, 
-            { 0X28, 0X86ED, 0X472B, 0X46ED, 0X72B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X3F, 0XB4, 0X87, 0XD0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 },
-            { 0X30, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0X86ED, 0XC5B5, 0X46ED, 0X85B5, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X3F, 0X50, 0X78, 0X2C, 0X30, 0X40, 0XA, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X7C, 0X86ED, 0XC5B5, 0X46ED, 0X85B5, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X3F, 0X50, 0X7C, 0X2C, 0X30, 0X40, 0X40, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X22, 0X86ED, 0XC4B9, 0X46ED, 0X84B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X41, 0X41, 0X64, 0X73, 0X3D, 0X41, 0X90, 0X90, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X25, 0X86ED, 0XC447, 0X46ED, 0X8447, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3E, 0X3E, 0X80, 0X8E, 0X4D, 0X51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X57, 0X88, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X57, 0X88, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        { 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X3F, 0X7F, 0XE3, 0X25, 0X57, 0XDF, 0X8F, 0X47, 0X6D, 0X52, 0XB, 0X4A, 0X50, 0XA0, 0, 0X4F, 0X53, 0X8F, 0X13, 0X8F, 0X13, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 24 },
-        { 0X86ED, 0X842B, 0X46ED, 0X442B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X47, 0X47, 0XA0, 0X7D, 0, 0X2D, 0X31, 0X80, 0X10, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-        {
-            { 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X3F, 0X7F, 0XE3, 0X25, 0X57, 0XDF, 0XDF, 0X6F, 0X95, 0X52, 0XB, 0X72, 0X58, 0XA0, 0, 0XDF, 0X13, 0XDF, 0X13, 0X73, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 },
-            { 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X8F, 0XCF, 0XE3, 0XA7, 0X2F, 0X57, 0XAB, 0XD1, 0X12, 0XAE, 0X54, 0XC8, 0, 0X57, 0X57, 0XAF, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X47, 0X47, 0XA0, 0X8C, 0, 0X60, 0X64, 0X81, 0X80, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X86ED, 0X84B9, 0X46ED, 0X44B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X37, 0X37, 0XC8, 0X8C, 0, 0X7E, 0X82, 0X21, 0X20, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        }
-    },
-    { 0X3, 0X3, 0X1, 12, 13, 8, 4,
-        { 0XE0FF, 0XF, 0XC0FC, 0X6F7B, 0, 0X70D0, 0, 0X7000 },
-        { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-        { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X97, 0XFF, 0XFF, 0X97, 0X74, 0X46, 0X2F, 0X9F, 0X25, 0XFF, 0XFF, 0X25, 0XDA, 0X13, 0X2, 0X68, 0X40, 0XBE, 0X4, 0XCE, 0XD2, 0X24, 0XFF, 0X23, 0XFF, 0X25, 0X23, 0X3, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 },
-        {
-            { 0, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X5C, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9B, 0XCF, 0XE7, 0X7F, 0X2B, 0X17, 0X87, 0X92, 0XB4, 0X59, 0X5D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 },
-            { 0X2, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X52, 0X53, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0X4F, 0X8F, 0X47, 0X6D, 0X4A, 0X4B, 0XA2, 0XCD, 0XD1, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 15 }, 
-            { 0X6, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0XE, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0XF, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X2E, 0X54, 0X31, 0X57, 0X5D, 0X5D, 0X32, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X10, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X2E, 0X54, 0X31, 0X57, 0XA2, 0X5D, 0X5D, 0X32, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, 
-            { 0X13, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0XA2, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, 
-            { 0X30, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X5C, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X1F, 0XB7, 0XE3, 0X16, 0X4F, 0XBF, 0XC7, 0XE3, 0X9, 0X51, 0X3, 0XE6, 0X2C, 0X50, 0XC7, 0X3, 0XC7, 0X3, 0XE7, 0X1D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0X7C, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X1F, 0XB7, 0XE3, 0X16, 0X4F, 0XBF, 0XEF, 0XF7, 0X1D, 0X51, 0X3, 0XFA, 0X20, 0X50, 0XEF, 0X3, 0XEF, 0X3, 0XFB, 0X11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0X22, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0XDF, 0XE3, 0X16, 0X77, 0XE7, 0X2B, 0X15, 0X3B, 0X52, 0X18, 0X5E, 0X64, 0X2B, 0X2B, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 },
-            { 0X25, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X7F, 0X17, 0X16, 0X1F, 0X1F, 0X7F, 0X3F, 0X65, 0X42, 0X48, 0X80, 0X7F, 0X7F, 0X43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 15 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0, 0X45B9, 0X853D, 0X5B9, 0X453D, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X91, 0XFF, 0XFF, 0X91, 0X74, 0X46, 0X2F, 0X9F, 0XFF, 0XFF, 0X25, 0XDA, 0X13, 0X2, 0X68, 0XB4, 0XA0, 0X2D, 0X31, 0XFF, 0X23, 0XFF, 0X23, 0X3, 0X39, 0X40, 0X14, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 28 },
-            { 0X2, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA9, 0XA9, 0XA2, 0XB8, 0X60, 0X64, 0X1, 0X14, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, 
-            { 0X6, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X55, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X26, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0XD, 0X45B9, 0XC5ED, 0X5B9, 0X85ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X66, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XFF, 0XFF, 0XAA, 0X74, 0X46, 0X2F, 0X9F, 0XFF, 0XFF, 0X25, 0XDA, 0X13, 0X2, 0X68, 0XA0, 0X2E, 0X32, 0XFF, 0X23, 0XFF, 0X23, 0X3, 0X39, 0X10, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 26 },
-            { 0XE, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X75, 0X76, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X4, 0X49, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 },
-            { 0XF, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XD2, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0X10, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X1, 0XD2, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4 }, 
-            { 0X13, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X67, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0, 0X1, 0X14, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 }, 
-            { 0X30, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0X45B9, 0X851B, 0X5B9, 0X85B6, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X8C, 0X2D, 0X31, 0XA, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 },
-            { 0X7C, 0X45B9, 0X851B, 0X5B9, 0X85B6, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X8C, 0X2D, 0X31, 0X40, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 },
-            { 0X22, 0X45B9, 0XC4B9, 0X5B9, 0X84B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X99, 0X99, 0X64, 0XB0, 0X3D, 0X41, 0X40, 0X90, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X25, 0X45B9, 0X471F, 0X5B9, 0X877C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0X4D, 0X51, 0X98, 0, 0X97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X29, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2A, 0, 0, 0, 0, { 0XD4, 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XC7, 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0X2B, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2C, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X6A, 0X98, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X6A, 0X98, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9F, 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0X8F, 0X47, 0X6D, 0X12, 0XB, 0X4A, 0X50, 0XA0, 0, 0X65, 0X69, 0X8F, 0X13, 0X8F, 0X13, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 25 },
-        { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9F, 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0X8F, 0X47, 0X6D, 0X12, 0XB, 0X4A, 0X50, 0XA0, 0, 0X65, 0X69, 0X8F, 0X13, 0X8F, 0X13, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 25 },
-        {
-            { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0XDF, 0X6F, 0X95, 0X12, 0XB, 0X72, 0X58, 0XA0, 0, 0XDF, 0X13, 0XDF, 0X13, 0X73, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 },
-            { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0XF, 0XA7, 0X2C, 0X36, 0X3F, 0XAF, 0X57, 0XAB, 0XD1, 0X92, 0XAE, 0X54, 0XC8, 0, 0X57, 0X57, 0XAF, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 19 },
-            { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X17, 0X34, 0X36, 0XAF, 0X1F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA9, 0XA9, 0XA0, 0XB8, 0, 0X60, 0X64, 0, 0X80, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, 
-            { 0X45B9, 0X84B9, 0X5B9, 0X44B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XBF, 0XC8, 0XBB, 0, 0X82, 0X86, 0X80, 0X20, 0XE7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, 
-            { 0X45B9, 0X8448, 0X5B9, 0X4448, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X65, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X74, 0X46, 0X2F, 0X9F, 0, 0, 0, 0XC3, 0X1B, 0, 0XA0, 0XA4, 0, 0X33, 0, 0X33, 0X34, 0XFF, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 23 }, 
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        }
-    },
-    { 0X4, 0X4, 0X1, 14, 15, 8, 4,
-        { 0XE0FF, 0XF, 0XC0FC, 0X6F7B, 0X1B0, 0X7DD0, 0, 0X7000 },
-        { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-        { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X97, 0XFF, 0XFF, 0X97, 0X74, 0X46, 0X2F, 0X9F, 0X29, 0XFF, 0XFF, 0X29, 0XE3, 0X1C, 0, 0X83, 0X40, 0XBE, 0X4, 0XCE, 0XD2, 0X28, 0XFF, 0X34, 0XFF, 0X29, 0X34, 0X1, 0X44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 },
-        {
-            { 0, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X5C, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9B, 0XCF, 0XE7, 0X7F, 0X2B, 0X17, 0X87, 0X92, 0XB4, 0X59, 0X5D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 },
-            { 0X2, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0XA2, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, 
-            { 0X6, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0XE, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0XF, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XAE, 0XD8, 0X12, 0XAF, 0X52, 0X5D, 0X5D, 0XB0, 0X23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X10, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XAE, 0XD8, 0X12, 0XAF, 0X52, 0XA2, 0X5D, 0X5D, 0XB0, 0X23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, 
-            { 0X13, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0XA2, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, 
-            { 0X30, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X54, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XA9, 0XDB, 0X14, 0X80, 0X63, 0X24, 0X24, 0X81, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X58, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XDF, 0X9, 0XE0, 0X63, 0XBF, 0XBF, 0XE1, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X5C, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X1F, 0XB7, 0XE3, 0X16, 0X4F, 0XBF, 0XC7, 0X63, 0X8D, 0X52, 0X4, 0X64, 0X47, 0X50, 0XC7, 0X4, 0XC7, 0X4, 0X65, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0X7C, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X1F, 0XB7, 0XE3, 0X16, 0X4F, 0XBF, 0XEF, 0X77, 0XA1, 0X52, 0X4, 0X78, 0X5B, 0X50, 0XEF, 0X4, 0XEF, 0X4, 0X79, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0X22, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0XDF, 0XE3, 0X16, 0X77, 0XE7, 0X2B, 0X95, 0XBF, 0X52, 0X96, 0X59, 0X64, 0X2B, 0X2B, 0X97, 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X25, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X7F, 0X17, 0X16, 0XAF, 0X1F, 0X7F, 0XBF, 0XE9, 0X12, 0XC0, 0X43, 0X80, 0X7F, 0X7F, 0XC1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 16 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0, 0X8479, 0X8663, 0X4479, 0X4441, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X92, 0X92, 0XB4, 0XA8, 0X2E, 0X32, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 },
-            { 0X2, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XBF, 0XA2, 0XB5, 0X61, 0X65, 0X1, 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, 
-            { 0X6, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0XD, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0XE, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0XF, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X10, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X5E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, 
-            { 0X13, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, 
-            { 0X30, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0X54, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XA9, 0XDB, 0X14, 0X80, 0X63, 0X24, 0X24, 0X81, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X58, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XDF, 0X9, 0XE0, 0X63, 0XBF, 0XBF, 0XE1, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X5C, 0X8479, 0X4719, 0X4479, 0X87E4, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X82, 0X2D, 0X31, 0XC8, 0X17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 },
-            { 0X7C, 0X8479, 0X4719, 0X4479, 0X87E4, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X82, 0X2D, 0X31, 0XF0, 0X17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 },
-            { 0X22, 0X8479, 0X4721, 0X4479, 0X4742, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X64, 0X3D, 0X41, 0X40, 0X2C, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 },
-            { 0X25, 0X8479, 0X4729, 0X4479, 0X4752, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0X4D, 0X51, 0X98, 0X7F, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X29, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2A, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2B, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2C, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X6A, 0X98, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X6A, 0X98, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9F, 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0X8F, 0XC7, 0XF1, 0X12, 0XC, 0XC8, 0X4B, 0XA0, 0, 0X65, 0X69, 0X8F, 0X14, 0X8F, 0X14, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 25 },
-        { 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XA0, 0X91, 0, 0X2D, 0X31, 0X90, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-        {
-            { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0XDF, 0XEF, 0X19, 0X1A, 0XC, 0XF0, 0X53, 0XA0, 0, 0XDF, 0X14, 0XDF, 0X14, 0XF1, 0X24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 },
-            { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0XF, 0XA7, 0X2C, 0X36, 0X3F, 0XAF, 0X57, 0X2B, 0X55, 0X9B, 0X14, 0X2C, 0X6F, 0XC8, 0, 0X57, 0X24, 0X57, 0X24, 0X2D, 0X30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 },
-            { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X17, 0X34, 0X36, 0XAF, 0X1F, 0X7F, 0XA9, 0XDB, 0X14, 0X80, 0X63, 0, 0X24, 0X24, 0X81, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XA0, 0XAA, 0, 0X5F, 0X63, 0XE0, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X8479, 0X721, 0X4479, 0X742, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XC8, 0, 0X7F, 0X83, 0X81, 0X58, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X8479, 0X51E, 0X4479, 0X53C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X6D, 0X6E, 0X77, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0, 0XA3, 0XA7, 0X34, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        }
-    },
-    { 0X5, 0X5, 0X1, 14, 14, 8, 10,
-        { 0XE0FF, 0XF, 0XC0FC, 0X6F7B, 0X1B0, 0X7DD0, 0X1C0, 0X7000 },
-        { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-        { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X97, 0X77, 0X77, 0X97, 0X75, 0X56, 0XA7, 0X17, 0X29, 0X19, 0X19, 0X29, 0XA4, 0X24, 0X1A, 0X9D, 0X5E, 0XBE, 0X4, 0XCE, 0XD2, 0X28, 0X19, 0X44, 0X19, 0X29, 0X44, 0X1B, 0X4E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 },
-        {
-            { 0, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9B, 0XCF, 0X23, 0X43, 0X2C, 0X53, 0XC3, 0XB4, 0X59, 0X5D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X2, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0XA2, 0XCD, 0XD1, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 14 }, 
-            { 0X6, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X66, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0XC3, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 },
-            { 0XE, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0XF, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XBB, 0XCB, 0X92, 0XBC, 0X5F, 0X5D, 0X5D, 0XBD, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X10, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XBB, 0XCB, 0X92, 0XBC, 0X5F, 0XA2, 0X5D, 0X5D, 0XBD, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, 
-            { 0X13, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0XA2, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, 
-            { 0X30, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X54, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8C, 0X9C, 0XDB, 0X14, 0X8D, 0X70, 0X24, 0X24, 0X8E, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X58, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XEC, 0XFC, 0XDB, 0XED, 0X70, 0XBF, 0XBF, 0XEE, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X5C, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X5B, 0X7B, 0XE3, 0X16, 0X8B, 0XFB, 0XC7, 0X70, 0X80, 0X52, 0X4, 0X71, 0X54, 0X50, 0XC7, 0X4, 0XC7, 0X4, 0X72, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0X7C, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X5B, 0X7B, 0XE3, 0X16, 0X8B, 0XFB, 0XEF, 0X84, 0X94, 0X52, 0X4, 0X85, 0X48, 0X50, 0XEF, 0X4, 0XEF, 0X4, 0X86, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0X22, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X83, 0XA3, 0XE3, 0X16, 0XB3, 0X23, 0X2B, 0XA2, 0XB2, 0X12, 0XA3, 0X46, 0X64, 0X2B, 0X2B, 0XA4, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X25, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0XBB, 0XDB, 0XE3, 0X16, 0XEB, 0X5B, 0X7F, 0XCC, 0XDC, 0X12, 0XCD, 0X50, 0X80, 0X7F, 0X7F, 0XCE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, 
-            { 0X6, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0XE, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0XF, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X10, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, 
-            { 0X13, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, 
-            { 0X30, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X54, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XCA, 0XEC, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 },
-            { 0X58, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XCA, 0XA8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0X5C, 0X8479, 0X4719, 0X4479, 0X87E4, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X8C, 0X2D, 0X31, 0XEA, 0XC2, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 },
-            { 0X7C, 0X8479, 0X4719, 0X4479, 0X87E4, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X8C, 0X2D, 0X31, 0XEA, 0XEA, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 },
-            { 0X22, 0X8479, 0X4721, 0X4479, 0X4742, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X64, 0XAA, 0X3D, 0X41, 0X24, 0X24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 },
-            { 0X25, 0X8479, 0X4729, 0X4479, 0X4752, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0XAA, 0X4D, 0X51, 0X76, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X29, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2A, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2B, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2C, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X71, 0X9F, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X71, 0X9F, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X28, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X29, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2A, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2B, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X2C, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }
-        },
-        { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9F, 0X7F, 0XFB, 0X1B, 0X2B, 0X26, 0X2B, 0X9B, 0X8F, 0XD4, 0XE4, 0X92, 0XC, 0XD5, 0X58, 0XA0, 0, 0X65, 0X69, 0X8F, 0X14, 0X8F, 0X14, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 25 },
-        { 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XA0, 0XA0, 0, 0X2D, 0X31, 0XD4, 0X86, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-        {
-            { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XFB, 0X1B, 0X2B, 0X26, 0X2B, 0X9B, 0XDF, 0XFC, 0XC, 0X9A, 0XC, 0XFD, 0X40, 0XA0, 0, 0XDF, 0X14, 0XDF, 0X14, 0XFE, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 },
-            { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X4B, 0X6B, 0X2C, 0X36, 0X7B, 0XEB, 0X57, 0X38, 0X48, 0X9B, 0X14, 0X39, 0X7C, 0XC8, 0, 0X57, 0X24, 0X57, 0X29, 0X24, 0X3A, 0X3D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 23 },
-            { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0XBB, 0XDB, 0X2C, 0X36, 0XEB, 0X5B, 0XFF, 0X8C, 0X9C, 0XDB, 0X14, 0X8D, 0X70, 0, 0XFF, 0X24, 0XFF, 0X24, 0X8E, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X3B, 0X5B, 0X46, 0X6B, 0XDB, 0XFF, 0XC, 0X1C, 0XE4, 0X1C, 0XD, 0X90, 0X40, 0XFF, 0X34, 0XFF, 0X34, 0XE, 0X41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 20 }
-        },
-        {
-            { 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XA0, 0, 0X5F, 0X63, 0XD4, 0XD4, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X8479, 0X721, 0X4479, 0X742, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XC8, 0, 0X7F, 0X83, 0X48, 0X48, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X8479, 0X51E, 0X4479, 0X53C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0, 0XC3, 0XA3, 0XA7, 0XEC, 0XEC, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0XC9, 0XA8, 0XE6, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 }
-        }
-    },
-    { 0X6, 0X6, 0X1, 15, 15, 4, 4,
-        { 0XE0FF, 0XF, 0XC0FC, 0X6F7B, 0X37B0, 0X7DDD, 0X1C0, 0X7000 },
-        { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-        { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6F, 0X3F, 0X3F, 0, 0X86, 0X68, 0X7F, 0X3F, 0XE1, 0XAF, 0XAF, 0XE1, 0XE4, 0X24, 0XB0, 0X93, 0X90, 0XFA, 0X4, 0X9, 0XD, 0XE0, 0XAF, 0X4C, 0XAF, 0XE1, 0X44, 0XB1, 0X44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 },
-        {
-            { 0, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XCF, 0X87, 0XB7, 0X34, 0XC7, 0X87, 0XB4, 0X73, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X2, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X55, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA8, 0X8F, 0X1F, 0X51, 0X20, 0X73, 0XA2, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, 
-            { 0X6, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X1F, 0X51, 0X20, 0X63, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0XE, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X1F, 0X51, 0X20, 0X63, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0XF, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X6, 0X38, 0X7, 0X6A, 0X5D, 0X5D, 0X8, 0X3B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X10, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X6, 0X38, 0X7, 0X6A, 0XA2, 0X5D, 0X5D, 0X8, 0X3B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, 
-            { 0X13, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X1F, 0X51, 0X20, 0X63, 0XA2, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, 
-            { 0X30, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X1F, 0X51, 0X20, 0X63, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0X54, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XD7, 0X9, 0XA3, 0X14, 0XD8, 0X7B, 0X2C, 0X24, 0XD9, 0X3C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X58, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0X37, 0X69, 0X38, 0XBF, 0XBF, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 },
-            { 0X5C, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XBF, 0XEF, 0XEB, 0X18, 0XFF, 0XBF, 0XC7, 0XBB, 0XED, 0X12, 0X4, 0XBC, 0X5F, 0X50, 0XC7, 0XC, 0XC7, 0X4, 0XBD, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0X7C, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XBF, 0XEF, 0XEB, 0X18, 0XFF, 0XBF, 0XEF, 0XCF, 0X1, 0X1A, 0X4, 0XD0, 0X53, 0X50, 0XEF, 0XC, 0XEF, 0X4, 0XD1, 0X24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0X22, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XE7, 0X17, 0X33, 0X18, 0X27, 0XE7, 0X2B, 0XED, 0X1F, 0X9A, 0XC, 0XEE, 0X51, 0X64, 0X2B, 0X2B, 0XEF, 0X22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 19 },
-            { 0X25, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X1F, 0X4F, 0X18, 0X5F, 0X1F, 0X7F, 0X17, 0X49, 0X18, 0X7B, 0X80, 0X7F, 0X7F, 0X19, 0X3C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 16 },
-            { 0X66, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0XDB, 0XFF, 0XBD, 0X58, 0X1B, 0XDB, 0X19, 0X64, 0X96, 0XA4, 0X65, 0X88, 0X5E, 0X19, 0X19, 0X66, 0X49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0, 0X4571, 0X8671, 0X571, 0X4671, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X3F, 0, 0X86, 0X68, 0X7F, 0X3F, 0XAF, 0XAF, 0XE1, 0XE4, 0X24, 0XB0, 0X93, 0XB4, 0XBE, 0X2D, 0X31, 0XAF, 0X44, 0XAF, 0X44, 0XB1, 0X44, 0XCC, 0X54, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 27 },
-            { 0X2, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X9A, 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 }, 
-            { 0X6, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0XE, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0XF, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X10, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, 
-            { 0X13, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, 
-            { 0X30, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X54, 0X4571, 0X477C, 0X571, 0X77C, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8E, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 },
-            { 0X58, 0X4571, 0X477C, 0X571, 0X77C, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0X4571, 0X873D, 0X571, 0X877A, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6D, 0X50, 0XC8, 0X2F, 0X33, 0XCC, 0XAA, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 },
-            { 0X7C, 0X4571, 0X873D, 0X571, 0X877A, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6D, 0X50, 0XC8, 0X2F, 0X33, 0XCC, 0XCC, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 },
-            { 0X22, 0X4571, 0XC56F, 0X571, 0X856F, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X64, 0XBE, 0X3D, 0X41, 0, 0, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 },
-            { 0X25, 0X4571, 0X8760, 0X571, 0X4760, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X71, 0X80, 0XC8, 0X4D, 0X51, 0X46, 0X46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 },
-            { 0X66, 0X4571, 0X45E5, 0X571, 0X5E5, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X6D, 0X6E, 0X71, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X75, 0X5E, 0XED, 0XF1, 0X44, 0X80, 0X80, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X7C, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        {
-            { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X5C, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X7C, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }
-        },
-        { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X5F, 0X8F, 0X34, 0X28, 0X9F, 0X5F, 0X8F, 0X1F, 0X51, 0XDB, 0XC, 0X20, 0X63, 0XA0, 0, 0X82, 0X86, 0X8F, 0X14, 0X8F, 0X14, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 24 },
-        { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X5F, 0X8F, 0X34, 0X28, 0X9F, 0X5F, 0X8F, 0X1F, 0X51, 0XDB, 0XC, 0X20, 0X63, 0XA0, 0, 0X82, 0X86, 0X8F, 0X14, 0X8F, 0X14, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 24 },
-        {
-            { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X5F, 0X8F, 0X34, 0X28, 0X9F, 0X5F, 0XDF, 0X47, 0X79, 0XDB, 0XC, 0X48, 0X6B, 0XA0, 0, 0XDF, 0X1C, 0XDF, 0X14, 0X49, 0X3C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 },
-            { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0XAF, 0XDF, 0X34, 0X38, 0XEF, 0XAF, 0X57, 0X83, 0XB5, 0XDB, 0X14, 0X84, 0X67, 0XC8, 0, 0X57, 0X2C, 0X57, 0X24, 0X85, 0X38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 },
-            { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X1F, 0X4F, 0X7D, 0X38, 0X5F, 0X1F, 0XFF, 0XD7, 0X9, 0XA3, 0X14, 0XD8, 0X7B, 0, 0XFF, 0X2C, 0XFF, 0X24, 0XD9, 0X3C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X9F, 0XCF, 0X7D, 0X48, 0XDF, 0X9F, 0XFF, 0X57, 0X89, 0XA4, 0X1C, 0X58, 0X9B, 0X40, 0XFF, 0X3C, 0XFF, 0X34, 0X59, 0X4C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }
-        },
-        {
-            { 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X71, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X73, 0XA0, 0XD8, 0, 0X5A, 0X5E, 0X44, 0X98, 0X98, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 },
-            { 0X4571, 0X856F, 0X571, 0X456F, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X71, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0XC8, 0XE1, 0, 0X7F, 0X83, 0X44, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 },
-            { 0X4571, 0X454A, 0X571, 0X54A, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X71, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0, 0XF0, 0XAB, 0XAF, 0X44, 0X8E, 0X8E, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 },
-            { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 },
-            { 0X4571, 0X477C, 0X571, 0X77C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X6D, 0X6E, 0X71, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7D, 0X40, 0XD0, 0XD4, 0X44, 0X32, 0X68, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }
-        }
-    }
-};
-
-static const int NumPowerOn = 2;
-
-static const int NumPowerOff = 2;
-
-typedef struct _VIALCDPOWERSEQUENCE {
-    CARD8   powerSeq;
-    CARD8   port[4];
-    CARD8   offset[4];
-    CARD8   mask[4];
-    CARD8   data[4];
-    CARD16  delay[4];
-    int     numEntry;
-} VIALCDPowerSeqRec, *VIALCDPowerSeqRecPtr;
-
-#define     VIA_BIOS_NUM_LCD_POWER_SEQ      4
-
-static const VIALCDPowerSeqRec powerOn[] = {
-    { 0, { 0XD4, 0XD4, 0, 0 }, { 0X91, 0X91, 0, 0 }, { 0X10, 0X8, 0, 0 }, { 0X10, 0X8, 0, 0 }, { 0X19, 0X64, 0, 0 }, 2 },
-    { 1, { 0XD4, 0XD4, 0XD4, 0 }, { 0X91, 0X91, 0X91, 0 }, { 0X10, 0X8, 0X6, 0 }, { 0X10, 0X8, 0X6, 0 }, { 0X19, 0X1FE, 0X1, 0 }, 3 },
-    { 2, { 0XC4, 0XD4, 0XC4, 0 }, { 0X3D, 0X91, 0X3D, 0 }, { 0X10, 0X8, 0X20, 0 }, { 0X10, 0X8, 0X20, 0 }, { 0X19, 0X1FE, 0X1, 0 }, 3 },
-    { 0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, 0 }
-};
-
-static const VIALCDPowerSeqRec powerOff[] = {
-    { 0, { 0XD4, 0, 0, 0 }, { 0X91, 0, 0, 0 }, { 0X18, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0X1, 0, 0, 0 }, 1 },
-    { 1, { 0XD4, 0XD4, 0XD4, 0 }, { 0X91, 0X91, 0X91, 0 }, { 0X6, 0X8, 0X10, 0 }, { 0, 0, 0, 0 }, { 0XD2, 0X19, 0X1, 0 }, 3 },
-    { 2, { 0XC4, 0XD4, 0XC4, 0 }, { 0X3D, 0X91, 0X3D, 0 }, { 0X20, 0X8, 0X10, 0 }, { 0, 0, 0, 0 }, { 0XD2, 0X19, 0X1, 0 }, 3 },
-    { 0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, 0 }
-};
-
-typedef struct _VIALCDMODEFIX {
-    CARD8   reqMode[32];
-    CARD8   fixMode[32];
-    int     numEntry;
-} VIALCDModeFixRec, *VIALCDModeFixRecPtr;
-
-static const VIALCDModeFixRec modeFix = {
-    { 0X1, 0X3, 0X7, 0X5, 0X2E, 0X2F, 0X52, 0X53, 0X56, 0X57, 0X5A, 0X5B, 0X67, 0X68, 0X5D, 0X5E, 0X7D, 0X7E, 0X23, 0X24, 0X26, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X2, 0X2, 0X4, 0X30, 0X30, 0X50, 0X50, 0X54, 0X54, 0X58, 0X58, 0X66, 0X66, 0X5C, 0X5C, 0X7C, 0X7C, 0X22, 0X22, 0X25, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }; 
-
-
-#endif /* _VIA_MODE_H_ */
diff --git a/src/via_options.c b/src/via_options.c
new file mode 100644
index 0000000..755b776
--- /dev/null
+++ b/src/via_options.c
@@ -0,0 +1,582 @@
+/*
+ * Copyright 2005-2019 OpenChrome Project
+ *                     [https://www.freedesktop.org/wiki/Openchrome]
+ * Copyright 2004-2006 Luc Verhaegen.
+ * Copyright 2004-2005 The Unichrome Project  [unichrome.sf.net]
+ * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
+ * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sub license, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including
+ * the next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "via_driver.h"
+
+
+typedef enum
+{
+#ifdef HAVE_DEBUG
+    OPTION_PRINTVGAREGS,
+    OPTION_PRINTTVREGS,
+#endif
+    OPTION_NOACCEL,
+    OPTION_EXA_NOCOMPOSITE,
+    OPTION_EXA_SCRATCH_SIZE,
+    OPTION_SWCURSOR,
+    OPTION_SHADOW_FB,
+    OPTION_ROTATION_TYPE,
+    OPTION_ROTATE,
+    OPTION_CENTER,
+    OPTION_TVDOTCRAWL,
+    OPTION_TVTYPE,
+    OPTION_TVOUTPUT,
+    OPTION_DISABLEVQ,
+    OPTION_DISABLEIRQ,
+    OPTION_TVDEFLICKER,
+    OPTION_AGP_DMA,
+    OPTION_2D_DMA,
+    OPTION_XV_DMA,
+    OPTION_MAX_DRIMEM,
+    OPTION_AGPMEM,
+    OPTION_DISABLE_XV_BW_CHECK
+} VIAOpts;
+
+static OptionInfoRec VIAOptions[] = {
+#ifdef HAVE_DEBUG /* Don't document these three. */
+    {OPTION_PRINTVGAREGS,        "PrintVGARegs",     OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_PRINTTVREGS,         "PrintTVRegs",      OPTV_BOOLEAN, {0}, FALSE},
+#endif
+    {OPTION_NOACCEL,             "NoAccel",          OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_EXA_NOCOMPOSITE,     "ExaNoComposite",   OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_EXA_SCRATCH_SIZE,    "ExaScratchSize",   OPTV_INTEGER, {0}, FALSE},
+    {OPTION_SWCURSOR,            "SWCursor",         OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_SHADOW_FB,           "ShadowFB",         OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_ROTATION_TYPE,       "RotationType",     OPTV_ANYSTR,  {0}, FALSE},
+    {OPTION_ROTATE,              "Rotate",           OPTV_ANYSTR,  {0}, FALSE},
+    {OPTION_TVDOTCRAWL,          "TVDotCrawl",       OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_TVDEFLICKER,         "TVDeflicker",      OPTV_INTEGER, {0}, FALSE},
+    {OPTION_TVTYPE,              "TVType",           OPTV_ANYSTR,  {0}, FALSE},
+    {OPTION_TVOUTPUT,            "TVOutput",         OPTV_ANYSTR,  {0}, FALSE},
+    {OPTION_DISABLEVQ,           "DisableVQ",        OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_DISABLEIRQ,          "DisableIRQ",       OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_AGP_DMA,             "EnableAGPDMA",     OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_2D_DMA,              "NoAGPFor2D",       OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_XV_DMA,              "NoXVDMA",          OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_DISABLE_XV_BW_CHECK, "DisableXvBWCheck", OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_MAX_DRIMEM,          "MaxDRIMem",        OPTV_INTEGER, {0}, FALSE},
+    {OPTION_AGPMEM,              "AGPMem",           OPTV_INTEGER, {0}, FALSE},
+    {-1,                         NULL,               OPTV_NONE,    {0}, FALSE}
+};
+
+const OptionInfoRec *
+VIAAvailableOptions(int chipid, int busid)
+{
+    return VIAOptions;
+}
+
+
+void
+viaSetupDefaultOptions(ScrnInfoPtr pScrn)
+{
+    VIAPtr pVia = VIAPTR(pScrn);
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+    pVia->shadowFB = FALSE;
+    pVia->NoAccel = FALSE;
+    pVia->noComposite = FALSE;
+    pVia->useEXA = TRUE;
+    pVia->exaScratchSize = VIA_SCRATCH_SIZE / 1024;
+    pVia->drmmode.hwcursor = TRUE;
+    pVia->VQEnable = TRUE;
+    pVia->DRIIrqEnable = TRUE;
+    pVia->agpEnable = TRUE;
+    pVia->dma2d = TRUE;
+    pVia->dmaXV = TRUE;
+#ifdef HAVE_DEBUG
+    pVia->disableXvBWCheck = FALSE;
+#endif
+    pVia->maxDriSize = 0;
+    pVia->agpMem = AGP_SIZE / 1024;
+    pVia->VideoEngine = VIDEO_ENGINE_CLE;
+#ifdef HAVE_DEBUG
+    pVia->PrintVGARegs = FALSE;
+#endif
+
+    /*
+     * Disable vertical interpolation because the size of
+     * line buffer (limited to 800) is too small to do interpolation.
+     */
+    pVia->swov.maxWInterp = 800;
+    pVia->swov.maxHInterp = 600;
+
+    switch (pVia->Chipset) {
+    case VIA_CLE266:
+        break;
+    case VIA_KM400:
+        /*
+         * IRQ is not broken on KM400A, but testing
+         * (pVia->ChipRev < 0x80) is not enough to make sure we
+         * have an older, broken KM400.
+         */
+        pVia->DRIIrqEnable = FALSE;
+        break;
+    case VIA_K8M800:
+        pVia->DRIIrqEnable = FALSE;
+        break;
+    case VIA_PM800:
+        pVia->VideoEngine = VIDEO_ENGINE_CME;
+        break;
+    case VIA_P4M800PRO:
+        break;
+    case VIA_CX700:
+        pVia->VideoEngine = VIDEO_ENGINE_CME;
+        pVia->swov.maxWInterp = 1920;
+        pVia->swov.maxHInterp = 1080;
+        break;
+    case VIA_P4M890:
+        pVia->VideoEngine = VIDEO_ENGINE_CME;
+        pVia->dmaXV = FALSE;
+        break;
+    case VIA_K8M890:
+        pVia->VideoEngine = VIDEO_ENGINE_CME;
+        pVia->agpEnable = FALSE;
+        pVia->dmaXV = FALSE;
+        break;
+    case VIA_P4M900:
+        pVia->VideoEngine = VIDEO_ENGINE_CME;
+        pVia->agpEnable = FALSE;
+        /* FIXME: this needs to be tested */
+        pVia->dmaXV = FALSE;
+        break;
+    case VIA_VX800:
+    case VIA_VX855:
+    case VIA_VX900:
+        pVia->VideoEngine = VIDEO_ENGINE_CME;
+        pVia->agpEnable = FALSE;
+        pVia->dmaXV = FALSE;
+        break;
+    }
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
+}
+
+static void
+viaProcessUMSOptions(ScrnInfoPtr pScrn)
+{
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    MessageType from = X_DEFAULT;
+    const char *s = NULL;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+/*
+    pVia->VQEnable = TRUE;
+*/
+    from = xf86GetOptValBool(VIAOptions,
+                                OPTION_DISABLEVQ, &pVia->VQEnable) ?
+            X_CONFIG : X_DEFAULT;
+    if (from == X_CONFIG)
+        pVia->VQEnable = !pVia->VQEnable;
+    xf86DrvMsg(pScrn->scrnIndex, from,
+                "GPU virtual command queue will be %s.\n",
+                (pVia->VQEnable) ? "enabled" : "disabled");
+
+/*
+    pVia->DRIIrqEnable = TRUE;
+*/
+    from = xf86GetOptValBool(VIAOptions,
+                                OPTION_DISABLEIRQ,
+                                &pVia->DRIIrqEnable) ?
+            X_CONFIG : X_DEFAULT;
+    if (from == X_CONFIG)
+        pVia->DRIIrqEnable = !pVia->DRIIrqEnable;
+    xf86DrvMsg(pScrn->scrnIndex, from,
+                "DRI IRQ will be %s if DRI is enabled.\n",
+                (pVia->DRIIrqEnable) ? "enabled" : "disabled");
+
+/*
+    pVia->agpEnable = FALSE;
+*/
+    from = xf86GetOptValBool(VIAOptions,
+                                OPTION_AGP_DMA, &pVia->agpEnable) ?
+            X_CONFIG : X_DEFAULT;
+    xf86DrvMsg(pScrn->scrnIndex, from,
+                "AGP DMA will be %s if DRI is enabled.\n",
+                (pVia->agpEnable) ? "enabled" : "disabled");
+
+/*
+    pVia->dma2d = TRUE;
+*/
+    if (pVia->agpEnable) {
+        from = xf86GetOptValBool(VIAOptions,
+                                    OPTION_2D_DMA, &pVia->dma2d) ?
+                X_CONFIG : X_DEFAULT;
+        if (from == X_CONFIG)
+            pVia->dma2d = !pVia->dma2d;
+        xf86DrvMsg(pScrn->scrnIndex, from,
+                    "AGP DMA will %sbe used for 2D acceleration.\n",
+                    (pVia->dma2d) ? "" : "not ");
+    }
+
+/*
+    pVia->dmaXV = TRUE;
+*/
+    from = xf86GetOptValBool(VIAOptions,
+                                OPTION_XV_DMA, &pVia->dmaXV) ?
+            X_CONFIG : X_DEFAULT;
+    if (from == X_CONFIG)
+        pVia->dmaXV = !pVia->dmaXV;
+    xf86DrvMsg(pScrn->scrnIndex, from, "PCI DMA will %sbe used for XV "
+               "image transfer if DRI is enabled.\n",
+               (pVia->dmaXV) ? "" : "not ");
+
+#ifdef HAVE_DEBUG
+/*
+    pVia->disableXvBWCheck = FALSE;
+*/
+    from = xf86GetOptValBool(VIAOptions,
+                                OPTION_DISABLE_XV_BW_CHECK,
+                                &pVia->disableXvBWCheck) ?
+            X_CONFIG : X_DEFAULT;
+    xf86DrvMsg(pScrn->scrnIndex, from,
+                "Xv Bandwidth check is %s.\n",
+                pVia->disableXvBWCheck ? "disabled" : "enabled");
+    if (pVia->disableXvBWCheck) {
+        xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                    "You may get a \"snowy\" screen when using the Xv "
+                    "overlay.\n");
+    }
+#endif
+
+/*
+    pVia->maxDriSize = 0;
+*/
+    from = xf86GetOptValInteger(VIAOptions,
+                                OPTION_MAX_DRIMEM,
+                                &pVia->maxDriSize) ?
+            X_CONFIG : X_DEFAULT;
+    if (pVia->maxDriSize > 0)
+        xf86DrvMsg(pScrn->scrnIndex, from,
+                    "Will impose a %d kB limit on video RAM reserved "
+                    "for DRI.\n",
+                    pVia->maxDriSize);
+    else
+        xf86DrvMsg(pScrn->scrnIndex, from,
+                    "Will not impose a limit on video RAM reserved "
+                    "for DRI.\n");
+
+/*
+    pVia->agpMem = AGP_SIZE / 1024;
+*/
+    from = xf86GetOptValInteger(VIAOptions,
+                                OPTION_AGPMEM, &pVia->agpMem) ?
+            X_CONFIG : X_DEFAULT;
+    xf86DrvMsg(pScrn->scrnIndex, from,
+                "Will try to allocate %d KB of AGP memory.\n",
+                pVia->agpMem);
+
+#ifdef HAVE_DEBUG
+/*
+    pVia->PrintVGARegs = FALSE;
+*/
+    from = xf86GetOptValBool(VIAOptions,
+                                OPTION_PRINTVGAREGS,
+                                &pVia->PrintVGARegs) ?
+            X_CONFIG : X_DEFAULT;
+    xf86DrvMsg(pScrn->scrnIndex, from,
+                "Will %sprint VGA registers.\n",
+                pVia->PrintVGARegs ? "" : "not ");
+    if (pVia->PrintVGARegs)
+        /*
+         * Do this as early as possible.
+         */
+        ViaVgahwPrint(VGAHWPTR(pScrn));
+#endif /* HAVE_DEBUG */
+
+    pVIADisplay->TVDotCrawl = FALSE;
+    from = xf86GetOptValBool(VIAOptions,
+                                OPTION_TVDOTCRAWL,
+                                &pVIADisplay->TVDotCrawl) ?
+            X_CONFIG : X_DEFAULT;
+    xf86DrvMsg(pScrn->scrnIndex, from,
+                "TV dotCrawl is %s.\n",
+                pVIADisplay->TVDotCrawl ? "enabled" : "disabled");
+
+    /*
+     * TV Deflicker
+     */
+    pVIADisplay->TVDeflicker = 0;
+    from = xf86GetOptValInteger(VIAOptions, OPTION_TVDEFLICKER,
+                                &pVIADisplay->TVDeflicker) ?
+            X_CONFIG : X_DEFAULT;
+    xf86DrvMsg(pScrn->scrnIndex, from,
+                "TV deflicker is set to %d.\n",
+                pVIADisplay->TVDeflicker);
+
+    pVIADisplay->TVType = TVTYPE_NONE;
+    if ((s = xf86GetOptValString(VIAOptions, OPTION_TVTYPE))) {
+        if (!xf86NameCmp(s, "NTSC")) {
+            pVIADisplay->TVType = TVTYPE_NTSC;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "TV Type is NTSC.\n");
+        } else if (!xf86NameCmp(s, "PAL")) {
+            pVIADisplay->TVType = TVTYPE_PAL;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "TV Type is PAL.\n");
+        } else if (!xf86NameCmp(s, "480P")) {
+            pVIADisplay->TVType = TVTYPE_480P;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "TV Type is SDTV 480P.\n");
+        } else if (!xf86NameCmp(s, "576P")) {
+            pVIADisplay->TVType = TVTYPE_576P;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "TV Type is SDTV 576P.\n");
+        } else if (!xf86NameCmp(s, "720P")) {
+            pVIADisplay->TVType = TVTYPE_720P;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "TV Type is HDTV 720P.\n");
+        } else if (!xf86NameCmp(s, "1080I")) {
+            pVIADisplay->TVType = TVTYPE_1080I;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "TV Type is HDTV 1080i.\n");
+        }
+    } else {
+        xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT,
+                    "No default TV type is set.\n");
+    }
+
+    /*
+     * TV output signal option
+     */
+    pVIADisplay->TVOutput = TVOUTPUT_NONE;
+    if ((s = xf86GetOptValString(VIAOptions, OPTION_TVOUTPUT))) {
+        if (!xf86NameCmp(s, "S-Video")) {
+            pVIADisplay->TVOutput = TVOUTPUT_SVIDEO;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "TV Output Signal is S-Video.\n");
+        } else if (!xf86NameCmp(s, "Composite")) {
+            pVIADisplay->TVOutput = TVOUTPUT_COMPOSITE;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "TV Output Signal is Composite.\n");
+        } else if (!xf86NameCmp(s, "SC")) {
+            pVIADisplay->TVOutput = TVOUTPUT_SC;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "TV Output Signal is SC.\n");
+        } else if (!xf86NameCmp(s, "RGB")) {
+            pVIADisplay->TVOutput = TVOUTPUT_RGB;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "TV Output Signal is RGB.\n");
+        } else if (!xf86NameCmp(s, "YCbCr")) {
+            pVIADisplay->TVOutput = TVOUTPUT_YCBCR;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "TV Output Signal is YCbCr.\n");
+        }
+    } else {
+        xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT,
+                    "No default TV output signal type is set.\n");
+    }
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
+}
+
+void
+viaProcessOptions(ScrnInfoPtr pScrn)
+{
+    VIAPtr pVia = VIAPTR(pScrn);
+    MessageType from = X_DEFAULT;
+    const char *s = NULL;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                "Processing DDX options . . .\n");
+
+    xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, VIAOptions);
+
+    /*
+     * When rotating, switch shadow frame buffer on and acceleration
+     * off.
+     */
+    if ((s = xf86GetOptValString(VIAOptions, OPTION_ROTATION_TYPE))) {
+        if (!xf86NameCmp(s, "SWRandR")) {
+            pVia->shadowFB = TRUE;
+            pVia->NoAccel = TRUE;
+            pVia->RandRRotation = TRUE;
+            pVia->rotate = RR_Rotate_0;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "Rotating screen RandR enabled, "
+                        "acceleration disabled\n");
+        } else if (!xf86NameCmp(s, "HWRandR")) {
+            pVia->shadowFB = TRUE;
+            pVia->NoAccel = TRUE;
+            pVia->RandRRotation = TRUE;
+            pVia->rotate = RR_Rotate_0;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "Hardware accelerated rotating screen is not "
+                        "implemented. Using SW RandR.\n");
+        } else {
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "\"%s\" is not a valid"
+                        "value for Option \"RotationType\".\n", s);
+            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Valid options are \"SWRandR\" and "
+                        "\"HWRandR\".\n");
+        }
+    }
+
+    /*
+     * When rotating, switch shadow frame buffer on and acceleration
+     * off.
+     */
+    if ((s = xf86GetOptValString(VIAOptions, OPTION_ROTATE))) {
+        if (!xf86NameCmp(s, "CW")) {
+            pVia->shadowFB = TRUE;
+            pVia->NoAccel = TRUE;
+            pVia->RandRRotation = TRUE;
+            pVia->rotate = RR_Rotate_270;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "Rotating screen clockwise -- "
+                        "acceleration is disabled.\n");
+        } else if (!xf86NameCmp(s, "CCW")) {
+            pVia->shadowFB = TRUE;
+            pVia->NoAccel = TRUE;
+            pVia->RandRRotation = TRUE;
+            pVia->rotate = RR_Rotate_90;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "Rotating screen counterclockwise -- "
+                        "acceleration is disabled.\n");
+        } else if (!xf86NameCmp(s, "UD")) {
+            pVia->shadowFB = TRUE;
+            pVia->NoAccel = TRUE;
+            pVia->RandRRotation = TRUE;
+            pVia->rotate = RR_Rotate_180;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "Rotating screen upside-down -- "
+                        "acceleration is disabled.\n");
+        } else {
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                        "\"%s\" is not a valid value for "
+                        "Option \"Rotate\".\n", s);
+            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Valid options are \"CW\", \"CCW\" "
+                        "or \"UD\".\n");
+        }
+    }
+
+    from = (xf86GetOptValBool(VIAOptions,
+                                OPTION_SHADOW_FB, &pVia->shadowFB)
+            ? X_CONFIG : X_DEFAULT);
+    xf86DrvMsg(pScrn->scrnIndex, from,
+                "Shadow framebuffer is %s.\n",
+                pVia->shadowFB ? "enabled" : "disabled");
+
+    /*
+     * Use hardware acceleration, unless on shadow frame buffer.
+     */
+    from = (xf86GetOptValBool(VIAOptions,
+                                OPTION_NOACCEL, &pVia->NoAccel) ?
+            X_CONFIG : X_DEFAULT);
+    if (!pVia->NoAccel && pVia->shadowFB) {
+        xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                    "Acceleration is not supported when using shadow "
+                    "frame buffer.\n");
+        pVia->NoAccel = TRUE;
+        from = X_DEFAULT;
+    }
+
+    /*
+     * Disable EXA for KMS case
+     */
+    if (pVia->KMS)
+        pVia->NoAccel = TRUE;
+
+    xf86DrvMsg(pScrn->scrnIndex, from,
+                "Hardware acceleration is %s.\n",
+                !pVia->NoAccel ? "enabled" : "disabled");
+
+    if (!pVia->NoAccel) {
+        from = X_DEFAULT;
+        xf86DrvMsg(pScrn->scrnIndex, from,
+                    "Using EXA acceleration architecture.\n");
+/*
+        pVia->noComposite = FALSE;
+*/
+        if (pVia->useEXA) {
+            from = xf86GetOptValBool(VIAOptions,
+                                        OPTION_EXA_NOCOMPOSITE,
+                                        &pVia->noComposite) ?
+                    X_CONFIG : X_DEFAULT;
+            xf86DrvMsg(pScrn->scrnIndex, from,
+                        "EXA composite acceleration %s.\n",
+                        !pVia->noComposite ? "enabled" : "disabled");
+
+/*
+            pVia->exaScratchSize = VIA_SCRATCH_SIZE / 1024;
+*/
+            from = xf86GetOptValInteger(VIAOptions,
+                                            OPTION_EXA_SCRATCH_SIZE,
+                                            &pVia->exaScratchSize) ?
+                    X_CONFIG : X_DEFAULT;
+            xf86DrvMsg(pScrn->scrnIndex, from,
+                        "EXA scratch area size is %d KB.\n",
+                        pVia->exaScratchSize);
+        }
+    }
+
+    /*
+     * Use a hardware cursor, unless on secondary or on shadow
+     * frame buffer.
+     */
+    from = X_DEFAULT;
+    if (pVia->IsSecondary || pVia->shadowFB)
+        pVia->drmmode.hwcursor = FALSE;
+    else if (xf86GetOptValBool(VIAOptions, OPTION_SWCURSOR,
+                                &pVia->drmmode.hwcursor)) {
+        pVia->drmmode.hwcursor = !pVia->drmmode.hwcursor;
+        from = X_CONFIG;
+    }
+
+    if (pVia->drmmode.hwcursor)
+        xf86DrvMsg(pScrn->scrnIndex, from,
+                    "Using hardware two-color cursors and software "
+                    "full-color cursors.\n");
+    else
+        xf86DrvMsg(pScrn->scrnIndex, from,
+                    "Using software cursors.\n");
+
+    if (!pVia->KMS) {
+        viaProcessUMSOptions(pScrn);
+    }
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
+}
diff --git a/src/via_outputs.c b/src/via_outputs.c
index fa0e946..6641b7d 100644
--- a/src/via_outputs.c
+++ b/src/via_outputs.c
@@ -40,655 +40,47 @@
 #include "via_driver.h"
 #include <unistd.h>
 
-/*
- * Modetable nonsense.
- *
- */
-#include "via_mode.h"
-
-/*
- * Sets IGA1 or IGA2 as the display output source for DIP0
- * (Digital Interface Port 0) interface for CLE266 only.
- */
-void
-viaDIP0SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    CARD8 temp = displaySource;
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDIP0SetDisplaySource.\n"));
-
-    /* Set DIP0 display output source. */
-    /* 3X5.6C[7] - DIP0 (Digital Interface Port 0) Data Source Selection
-     *             0: Primary Display (IGA1)
-     *             1: Secondary Display (IGA2) */
-    ViaCrtcMask(hwp, 0x6C, temp << 7, 0x80);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DIP0 Display Output Source: IGA%d\n",
-                (temp & 0x01) + 1);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDIP0SetDisplaySource.\n"));
-}
-
-/*
- * Sets DIP0 (Digital Interface Port 0) I/O pad state.
- * This function is for CLE266 chipset only.
- */
-void
-viaDIP0EnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDIP0EnableIOPads.\n"));
-
-    /* Set DIP0 I/O pad state. */
-    /* 3C5.1E[7:6] - DIP0 Power Control
-     *               0x: Pad always off
-     *               10: Depend on the other control signal
-     *               11: Pad on/off according to the
-     *                   Power Management Status (PMS) */
-    ViaSeqMask(hwp, 0x1E, ioPadState << 6, 0xC0);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DIP0 I/O Pad State: %s\n",
-                (ioPadState & 0x02) ?
-                    (ioPadState & 0x01) ? "Automatic On / Off" : "Conditional"
-                : "Off");
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDIP0EnableIOPads.\n"));
-}
-
-/*
- * Sets DIP0 (Digital Interface Port 0) clock I/O pad drive strength
- * for CLE266 chipset only.
- */
-void
-viaDIP0SetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDIP0SetClockDriveStrength.\n"));
-
-    /* 3C5.1E[2] - DIP0 Clock Drive Strength Bit [0] */
-    ViaSeqMask(hwp, 0x1E, clockDriveStrength << 2, 0x04);
-
-    /* 3C5.2A[4] - DIP0 Clock Drive Strength Bit [1] */
-    ViaSeqMask(hwp, 0x2A, clockDriveStrength << 3, 0x10);
-
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DIP0 Clock I/O Pad Drive Strength: %u\n",
-                clockDriveStrength & 0x03);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDIP0SetClockDriveStrength.\n"));
-}
-
-/*
- * Sets DIP0 (Digital Interface Port 0) data I/O pads drive strength
- * for CLE266 chipset only.
- */
-void
-viaDIP0SetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDIP0SetDataDriveStrength.\n"));
-
-    /* 3C5.1B[1] - DIP0 Data Drive Strength Bit [0] */
-    ViaSeqMask(hwp, 0x1B, dataDriveStrength << 1, 0x02);
-
-    /* 3C5.2A[5] - DIP0 Data Drive Strength Bit [1] */
-    ViaSeqMask(hwp, 0x2A, dataDriveStrength << 4, 0x20);
-
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DIP0 Data I/O Pads Drive Strength: %u\n",
-                dataDriveStrength);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDIP0SetDataDriveStrength.\n"));
-}
-
-/*
- * Sets IGA1 or IGA2 as the display output source for DVP0
- * (Digital Video Port) interface.
- */
-void
-viaDVP0SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    CARD8 temp = displaySource;
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDVP0SetDisplaySource.\n"));
-
-    /* Set DVP0 display output source. */
-    /* 3X5.96[4] - DVP0 Data Source Selection
-     *             0: Primary Display
-     *             1: Secondary Display */
-    ViaCrtcMask(hwp, 0x96, temp << 4, 0x10);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DVP0 Display Output Source: IGA%d\n",
-                (temp & 0x01) + 1);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDVP0SetDisplaySource.\n"));
-}
-
-/*
- * Sets DVP0 (Digital Video Port 0) I/O pad state.
- */
-void
-viaDVP0EnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDVP0EnableIOPads.\n"));
-
-    /* Set DVP0 I/O pad state. */
-    /* 3C5.1E[7:6] - DVP0 Power Control
-     *               0x: Pad always off
-     *               10: Depend on the other control signal
-     *               11: Pad on/off according to the
-     *                   Power Management Status (PMS) */
-    ViaSeqMask(hwp, 0x1E, ioPadState << 6, 0xC0);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DVP0 I/O Pad State: %s\n",
-                (ioPadState & 0x02) ?
-                    (ioPadState & 0x01) ? "Automatic On / Off" : "Conditional"
-                : "Off");
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDVP0EnableIOPads.\n"));
-}
-
-/*
- * Sets DVP0 (Digital Video Port 0) clock I/O pad drive strength.
- */
-void
-viaDVP0SetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDVP0SetClockDriveStrength.\n"));
-
-    /* 3C5.1E[2] - DVP0 Clock Drive Strength Bit [0] */
-    ViaSeqMask(hwp, 0x1E, clockDriveStrength << 2, 0x04);
-
-    /* 3C5.2A[4] - DVP0 Clock Drive Strength Bit [1] */
-    ViaSeqMask(hwp, 0x2A, clockDriveStrength << 3, 0x10);
-
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DVP0 Clock I/O Pad Drive Strength: %u\n",
-                clockDriveStrength & 0x03);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDVP0SetClockDriveStrength.\n"));
-}
-
-/*
- * Sets DVP0 (Digital Video Port 0) data I/O pads drive strength.
- */
-void
-viaDVP0SetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDVP0SetDataDriveStrength.\n"));
-
-    /* 3C5.1B[1] - DVP0 Data Drive Strength Bit [0] */
-    ViaSeqMask(hwp, 0x1B, dataDriveStrength << 1, 0x02);
-
-    /* 3C5.2A[5] - DVP0 Data Drive Strength Bit [1] */
-    ViaSeqMask(hwp, 0x2A, dataDriveStrength << 4, 0x20);
-
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DVP0 Data I/O Pads Drive Strength: %u\n",
-                dataDriveStrength);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDVP0SetDataDriveStrength.\n"));
-}
-
-/*
- * Sets IGA1 or IGA2 as the display output source for DVP1
- * (Digital Video Port) interface.
- */
-void
-viaDVP1SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    CARD8 temp = displaySource;
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDVP1SetDisplaySource.\n"));
-
-    /* Set DVP1 display output source. */
-    /* 3X5.9B[4] - DVP1 Data Source Selection
-     *             0: Primary Display
-     *             1: Secondary Display */
-    ViaCrtcMask(hwp, 0x9B, temp << 4, 0x10);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DVP1 Display Output Source: IGA%d\n",
-                (temp & 0x01) + 1);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDVP1SetDisplaySource.\n"));
-}
-
-/*
- * Sets DVP1 (Digital Video Port 1) I/O pad state.
- */
-void
-viaDVP1EnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDVP1EnableIOPads.\n"));
-
-    /* Set DVP1 I/O pad state. */
-    /* 3C5.1E[5:4] - DVP1 Power Control
-     *               0x: Pad always off
-     *               10: Depend on the other control signal
-     *               11: Pad on/off according to the
-     *                   Power Management Status (PMS) */
-    ViaSeqMask(hwp, 0x1E, ioPadState << 4, 0x30);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DVP1 I/O Pad State: %s\n",
-                (ioPadState & 0x02) ?
-                    (ioPadState & 0x01) ? "Automatic On / Off": "Conditional"
-                : "Off");
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDVP1EnableIOPads.\n"));
-}
-
-/*
- * Sets DVP1 (Digital Video Port 1) clock I/O pad drive strength.
- */
-void
-viaDVP1SetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDVP1SetClockDriveStrength.\n"));
-
-    /* 3C5.65[3:2] - DVP1 Clock Pads Driving Select
-     *               00: lowest
-     *               01: low
-     *               10: high
-     *               11: highest */
-    ViaSeqMask(hwp, 0x65, clockDriveStrength << 2, 0x0C);
-
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DVP1 Clock I/O Pad Drive Strength: %u\n",
-                clockDriveStrength & 0x03);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDVP1SetClockDriveStrength.\n"));
-}
-
-/*
- * Sets DVP1 (Digital Video Port 1) data I/O pads drive strength.
- */
-void
-viaDVP1SetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDVP1SetDataDriveStrength.\n"));
-
-    /* 3C5.65[1:0] - DVP1 Data Pads Driving Select
-     *               00: lowest
-     *               01: low
-     *               10: high
-     *               11: highest */
-    ViaSeqMask(hwp, 0x65, dataDriveStrength, 0x03);
-
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DVP1 Data I/O Pads Drive Strength: %u\n",
-                dataDriveStrength & 0x03);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDVP1SetDataDriveStrength.\n"));
-}
-
-/*
- * Sets IGA1 or IGA2 as the display output source for VIA Technologies
- * Chrome IGP DFP (Digital Flat Panel) Low interface.
- */
-void
-viaDFPLowSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    CARD8 temp = displaySource;
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDFPLowSetDisplaySource.\n"));
-
-    /* Set DFP Low display output source. */
-    /* 3X5.99[4] - DFP Low Data Source Selection
-     *             0: Primary Display
-     *             1: Secondary Display */
-    ViaCrtcMask(hwp, 0x99, temp << 4, 0x10);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DFP Low Display Output Source: IGA%d\n",
-                (temp & 0x01) + 1);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDFPLowSetDisplaySource.\n"));
-}
-
-/*
- * Sets DFP (Digital Flat Panel) Low I/O pad state.
- */
-void
-viaDFPLowEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaDFPLowEnableIOPads.\n"));
-
-    /* Set DFP Low I/O pad state. */
-    /* 3C5.2A[1:0] - DFP Low Power Control
-     *               0x: Pad always off
-     *               10: Depend on the other control signal
-     *               11: Pad on/off according to the
-     *                   Power Management Status (PMS) */
-    ViaSeqMask(hwp, 0x2A, ioPadState, 0x03);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "DFP Low I/O Pad State: %s\n",
-                (ioPadState & 0x02) ?
-                    (ioPadState & 0x01) ? "Automatic On / Off": "Conditional"
-                : "Off");
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaDFPLowEnableIOPads.\n"));
-}
-
-/*
- * Reads off the VIA Technologies IGP pin strapping for
- * display detection purposes.
- */
-void
-viaProbePinStrapping(ScrnInfoPtr pScrn)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    VIAPtr pVia = VIAPTR(pScrn);
-    CARD8 sr12, sr13, sr5a;
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaProbePinStrapping.\n"));
-
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "Probing VIA Technologies IGP pin strapping . . .\n");
-
-    if ((pVia->Chipset == VIA_CX700)
-        || (pVia->Chipset == VIA_VX800)
-        || (pVia->Chipset == VIA_VX855)
-        || (pVia->Chipset == VIA_VX900)) {
-
-        sr5a = hwp->readSeq(hwp, 0x5A);
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "SR5A: 0x%02X\n", sr5a));
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                    "Setting 3C5.5A[0] to 0.\n");
-        ViaSeqMask(hwp, 0x5A, sr5a & 0xFE, 0x01);
-    }
-
-    sr12 = hwp->readSeq(hwp, 0x12);
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "SR12: 0x%02X\n", sr12));
-    sr13 = hwp->readSeq(hwp, 0x13);
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "SR13: 0x%02X\n", sr13));
-
-    switch (pVia->Chipset) {
-    case VIA_CLE266:
-
-        /* 3C5.12[4] - FPD17 pin strapping
-         *             0: TMDS transmitter (DVI) / capture device
-         *             1: Flat panel */
-        if (sr12 & 0x10) {
-            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "A flat panel is connected to "
-                        "flat panel interface.\n");
-
-            /* 3C5.12[3:0] - FPD16-13 pin strapping
-             *               0 ~ 15: Flat panel code defined
-             *                       by VIA Technologies */
-            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Detected Flat Panel Type from "
-                        "Strapping Pins: %d\n", sr12 & 0x0F);
-        } else {
-            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "A TMDS transmitter (DVI) / capture device is "
-                        "connected to DIP0.\n");
-        }
-
-        /* 3C5.12[5] - FPD18 pin strapping
-         *             0: TMDS transmitter (DVI)
-         *             1: TV encoder */
-        if (sr12 & 0x20) {
-            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "A TV encoder is connected to "
-                        "DIP0.\n");
-
-            /* 3C5.13[4:3] - FPD21-20 pin strapping
-             *               00: PAL
-             *               01: NTSC
-             *               10: PAL-N
-             *               11: PAL-NC */
-            if ((!(sr13 & 0x08)) && (sr13 & 0x04)) {
-                xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "NTSC for the TV encoder.\n");
-            } else {
-                if (!(sr13 & 0x08)) {
-                    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                                "PAL for the TV encoder.\n");
-                } else {
-                    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                                "PAL%s for the TV encoder.\n",
-                                (sr13 & 0x04) ? "-NC" : "-N");
-                }
-            }
-
-            /* 3C5.12[6] - FPD19 pin strapping
-             *             0: 525 lines (NTSC)
-             *             1: 625 lines (PAL) */
-            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "%s lines for the TV encoder.\n",
-                        (sr12 & 0x40) ? "625" : "525");
-        } else {
-            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "A TMDS transmitter (DVI) is connected to "
-                        "DIP0.\n");
-        }
-
-        break;
-
-    case VIA_KM400:
-    case VIA_K8M800:
-    case VIA_PM800:
-    case VIA_P4M800PRO:
-
-        /* 3C5.12[6] - DVP0D6 pin strapping
-         *             0: Disable DVP0 (Digital Video Port 0) for
-         *                DVI or TV out use
-         *             1: Enable DVP0 (Digital Video Port 0) for
-         *                DVI or TV out use */
-        if (sr12 & 0x40) {
-
-            /* 3C5.12[5] - DVP0D5 pin strapping
-             *             0: TMDS transmitter (DVI)
-             *             1: TV encoder */
-            if (sr12 & 0x20) {
-                xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "A TV encoder is detected on "
-                            "DVP0 (Digital Video Port 0).\n");
-            } else {
-                xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "A TMDS transmitter (DVI) is detected on "
-                            "DVP0 (Digital Video Port 0).\n");
-            }
-        }
-
-
-        /* 3C5.13[3] - DVP0D8 pin strapping
-         *             0: AGP pins are used for AGP
-         *             1: AGP pins are used by FPDP
-         *             (Flat Panel Display Port) */
-        if (sr13 & 0x08) {
-
-            /* 3C5.12[4] - DVP0D4 pin strapping
-             *             0: Dual 12-bit FPDP (Flat Panel Display Port)
-             *             1: 24-bit FPDP (Flat Panel Display Port) */
-            if (sr12 & 0x10) {
-                xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "24-bit FPDP (Flat Panel Display Port) "
-                            "detected.\n");
-
-                /* 3C5.12[3:0] - DVP0D3-0 pin strapping
-                 *               0 ~ 15: Flat panel code defined
-                 *                       by VIA Technologies */
-                xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "Detected Flat Panel Type from "
-                            "Strapping Pins: %d\n", sr12 & 0x0F);
-            } else {
-
-                /* 3C5.12[6] - DVP0D6 pin strapping
-                 *             0: Disable DVP0 (Digital Video Port 0) for
-                 *                DVI or TV out use
-                 *             1: Enable DVP0 (Digital Video Port 0) for
-                 *                DVI or TV out use
-                 * 3C5.12[5] - DVP0D5 pin strapping
-                 *             0: TMDS transmitter (DVI)
-                 *             1: TV encoder */
-                if ((!(sr12 & 0x40)) && (!(sr12 & 0x20))) {
-                    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                                "A TV encoder is connected to "
-                                "FPDP (Flat Panel Display Port).\n");
-                } else {
-                    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                                "Dual 12-bit FPDP (Flat Panel Display Port) "
-                                "detected.\n");
-
-                    /* 3C5.12[3:0] - DVP0D3-0 pin strapping
-                     *               0 ~ 15: Flat panel code defined
-                     *                       by VIA Technologies */
-                    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                                "Detected Flat Panel Type from "
-                                "Strapping Pins: %d\n", sr12 & 0x0F);
-                }
-            }
-        }
-
-        break;
-
-    default:
-        break;
-    }
-
-    if ((pVia->Chipset == VIA_CX700)
-        || (pVia->Chipset == VIA_VX800)
-        || (pVia->Chipset == VIA_VX855)
-        || (pVia->Chipset == VIA_VX900)) {
-
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                    "Setting 3C5.5A[0] to 1.\n");
-        ViaSeqMask(hwp, 0x5A, sr5a | 0x01, 0x01);
-
-        sr12 = hwp->readSeq(hwp, 0x12);
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "SR12: 0x%02X\n", sr12));
-        sr13 = hwp->readSeq(hwp, 0x13);
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "SR13: 0x%02X\n", sr13));
-
-        /* 3C5.13[7:6] - Integrated LVDS / DVI Mode Select
-         *               (DVP1D15-14 pin strapping)
-         *               00: LVDS1 + LVDS2
-         *               01: DVI + LVDS2
-         *               10: Dual LVDS Channel (High Resolution Panel)
-         *               11: One DVI only (decrease the clock jitter) */
-        switch (sr13 & 0xC0) {
-        case 0x00:
-            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "LVDS1 + LVDS2 detected.\n");
-            break;
-        case 0x40:
-            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Single Link DVI + LVDS2 detected.\n");
-            break;
-        case 0x80:
-            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Dual Channel LVDS detected.\n");
-            break;
-        case 0xC0:
-            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Single Link DVI detected.\n");
-            break;
-        default:
-            break;
-        }
-
-        hwp->writeSeq(hwp, 0x5A, sr5a);
-
-    }
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaProbePinStrapping.\n"));
-}
-
 void
-viaOutputDetect(ScrnInfoPtr pScrn)
+viaInitDisplay(ScrnInfoPtr pScrn)
 {
     VIAPtr pVia = VIAPTR(pScrn);
-    VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaOutputDetect.\n"));
-
-    pBIOSInfo->analog = NULL;
+                        "Entered viaInitDisplay.\n"));
 
     /* Initialize the number of VGA connectors. */
-    pVia->numberVGA = 0;
+    pVIADisplay->numberVGA = 0;
 
     /* Initialize the number of DVI connectors. */
-    pVia->numberDVI = 0;
+    pVIADisplay->numberDVI = 0;
 
     /* Initialize the number of FP connectors. */
-    pVia->numberFP = 0;
+    pVIADisplay->numberFP = 0;
 
-    /* Read off the VIA Technologies IGP pin strapping for
-       display detection purposes. */
-    viaProbePinStrapping(pScrn);
+    viaExtTMDSProbe(pScrn);
+    viaTMDSProbe(pScrn);
+
+    viaFPProbe(pScrn);
+
+    viaAnalogProbe(pScrn);
 
-    /* VGA */
-    via_analog_init(pScrn);
 
     /* TV */
     via_tv_init(pScrn);
 
     /* DVI */
-    via_dvi_init(pScrn);
+    viaExtTMDSInit(pScrn);
+    viaTMDSInit(pScrn);
 
-    /* LVDS */
-    via_lvds_init(pScrn);
+    /* VGA */
+    viaAnalogInit(pScrn);
+
+    /* FP (Flat Panel) */
+    viaFPInit(pScrn);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaOutputDetect.\n"));
+                        "Exiting viaInitDisplay.\n"));
 }
 
 #ifdef HAVE_DEBUG
@@ -933,38 +325,14 @@ ViaComputeProDotClock(unsigned clock)
     return bestClock.packed;
 }
 
-/*
- *
- */
 CARD32
 ViaModeDotClockTranslate(ScrnInfoPtr pScrn, DisplayModePtr mode)
 {
     VIAPtr pVia = VIAPTR(pScrn);
-    int i;
 
     if ((pVia->Chipset == VIA_CLE266) || (pVia->Chipset == VIA_KM400)) {
-        CARD32 best1 = 0, best2;
-
-        for (i = 0; ViaDotClocks[i].DotClock; i++)
-            if (ViaDotClocks[i].DotClock == mode->Clock) {
-                best1 = ViaDotClocks[i].UniChrome;
-                break;
-            }
-
-        best2 = ViaComputeDotClock(mode->Clock);
-
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                         "ViaComputeDotClock %d : %04x : %04x\n",
-                         mode->Clock, (unsigned int)best1,
-                         (unsigned int)best2));
-
-        return best2;
+        return ViaComputeDotClock(mode->Clock);
     } else {
-        for (i = 0; ViaDotClocks[i].DotClock; i++)
-            if (ViaDotClocks[i].DotClock == mode->Clock)
-                return ViaDotClocks[i].UniChromePro.packed;
         return ViaComputeProDotClock(mode->Clock);
     }
-
-    return 0;
 }
diff --git a/src/via_regs.h b/src/via_regs.h
index 64a628a..467a88d 100644
--- a/src/via_regs.h
+++ b/src/via_regs.h
@@ -1,330 +1,345 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHOR(S) OR COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-/*************************************************************************
- *
- *  File:       via_regs.c
- *  Content:    The defines of Via registers
- *
- ************************************************************************/
-
-#ifndef _VIA_REGS_H_
-#define _VIA_REGS_H_ 1
-
-#include "via_driver.h"
-
-/*#define VIA_SERIES(chip)  (chip == VIA_CLE266)*/
-
-
-/* Chip tags.  These are used to group the adapters into
- * related families.
- */
-
-enum VIACHIPTAGS {
-    VIA_UNKNOWN = 0,
-    VIA_CLE266,
-    VIA_KM400,
-    VIA_K8M800,
-    VIA_PM800,
-    VIA_P4M800PRO,  /* VT3314 */
-    VIA_CX700,      /* VT3324 */
-#ifdef VIA_VT3293_SUPPORT
-    VIA_CN750,      /* VT3293 */
-#endif
-    VIA_P4M890,     /* VT3327 */
-    VIA_K8M890,     /* VT3336 */
-    VIA_P4M900,     /* VT3364 */
-    VIA_VX800,      /* VT3353 */
-    VIA_VX855,      /* VT3409*/
-    VIA_VX900,      /* VT3410*/
-    VIA_LAST
-};
-
-
-#define PCI_VIA_VENDOR_ID       0x1106
-
-#define PCI_CHIP_CLE3122        0x3122	/* CLE266 */
-#define PCI_CHIP_VT3205         0x7205	/* KM400 */
-#define PCI_CHIP_VT3204         0x3108	/* K8M800 */
-#define PCI_CHIP_VT3259         0x3118	/* PM800 */
-#define PCI_CHIP_VT3314         0x3344	/* P4M800 Pro */
-#define PCI_CHIP_VT3324         0x3157	/* CX700 */
-#ifdef VIA_VT3293_SUPPORT
-#define PCI_CHIP_VT3293         0x3225  /* CN750 */
-#endif
-#define PCI_CHIP_VT3327         0x3343	/* P4M890 */
-#define PCI_CHIP_VT3336         0x3230  /* K8M890 */
-#define PCI_CHIP_VT3364         0x3371	/* P4M900 */
-#define PCI_CHIP_VT3353         0x1122	/* VX800 */
-#define PCI_CHIP_VT3409         0x5122	/* VX855/VX875 */
-#define PCI_CHIP_VT3410         0x7122	/* VX900 */
-
-/* There is some conflicting information about the two major revisions of
- * the CLE266, often labelled Ax and Cx.  The dividing line seems to be
- * either 0x0f or 0x10. */
-#define CLE266_REV_IS_AX(x) ((x) < 0x10)
-#define CLE266_REV_IS_CX(x) ((x) >= 0x10)
-
-#define BIOS_BSIZE              1024
-#define BIOS_BASE               0xc0000
-
-
-#define VIA_MMIO_REGSIZE        0xD000    /* DisplayPort: 0xC610~0xC7D4 */
-#define VIA_MMIO_REGBASE        0x0
-#define VIA_MMIO_VGABASE        0x8000
-#define VIA_MMIO_BLTBASE        0x200000
-#define VIA_MMIO_BLTSIZE        0x200000
-
-#define VIA_MMIO_INTEGRATED_TV_BASE     0xC000
-#define VIA_MMIO_INTEGRATED_TV_SIZE     256
-
-/* defines for VIA 2D registers */
-#define VIA_REG_GECMD           0x000
-#define VIA_REG_GEMODE          0x004
-#define VIA_REG_GESTATUS        0x004       /* as same as VIA_REG_GEMODE */
-#define VIA_REG_SRCPOS          0x008
-#define VIA_REG_DSTPOS          0x00C
-#define VIA_REG_LINE_K1K2       0x008
-#define VIA_REG_LINE_XY         0x00C
-#define VIA_REG_DIMENSION       0x010       /* width and height */
-#define VIA_REG_PATADDR         0x014
-#define VIA_REG_FGCOLOR         0x018
-#define VIA_REG_DSTCOLORKEY     0x018       /* as same as VIA_REG_FG */
-#define VIA_REG_BGCOLOR         0x01C
-#define VIA_REG_SRCCOLORKEY     0x01C       /* as same as VIA_REG_BG */
-#define VIA_REG_CLIPTL          0x020       /* top and left of clipping */
-#define VIA_REG_CLIPBR          0x024       /* bottom and right of clipping */
-#define VIA_REG_OFFSET          0x028
-#define VIA_REG_LINE_ERROR      0x028
-#define VIA_REG_KEYCONTROL      0x02C       /* color key control */
-#define VIA_REG_SRCBASE         0x030
-#define VIA_REG_DSTBASE         0x034
-#define VIA_REG_PITCH           0x038       /* pitch of src and dst */
-#define VIA_REG_MONOPAT0        0x03C
-#define VIA_REG_MONOPAT1        0x040
-#define VIA_REG_ROT_TMP_ADDR    0x044       /* Rotation Temporary Base Address */
-#define VIA_REG_ROTSRC          0x048       /* Resolution X,Y of Rotation Source */
-#define VIA_REG_ROT_TMP_PITCH   0x04C       /* Pitch of Rotation Temporary Memory */
-#define VIA_REG_ROTDST          0x050       /* Resolution X,Y of Rotation Destination*/
-#define VIA_REG_COLORPAT        0x100       /* from 0x100 to 0x1ff */
-
-/* defines for VIA 2D registers for vt3353 (M1 engine)*/
-#define VIA_REG_GECMD_M1            0x000
-#define VIA_REG_GEMODE_M1           0x004
-#define VIA_REG_GESTATUS_M1         0x004       /* as same as VIA_REG_GEMODE + rotate 410*/
-#define VIA_REG_PITCH_M1            0x008       /* pitch of src and dst */
-#define VIA_REG_DIMENSION_M1        0x00C       /* width and height */
-#define VIA_REG_DSTPOS_M1           0x010
-#define VIA_REG_LINE_XY_M1          0x010
-#define VIA_REG_DSTBASE_M1          0x014
-#define VIA_REG_SRCPOS_M1           0x018
-#define VIA_REG_LINE_K1K2_M1        0x018
-#define VIA_REG_SRCBASE_M1          0x01C
-#define VIA_REG_PATADDR_M1          0x020
-#define VIA_REG_MONOPAT0_M1         0x024
-#define VIA_REG_MONOPAT1_M1         0x028
-#define VIA_REG_OFFSET_M1           0x02C
-#define VIA_REG_LINE_ERROR_M1       0x02C
-#define VIA_REG_CLIPTL_M1           0x040       /* top and left of clipping */
-#define VIA_REG_CLIPBR_M1           0x044       /* bottom and right of clipping */
-#define VIA_REG_KEYCONTROL_M1       0x048       /* color key control */
-#define VIA_REG_FGCOLOR_M1          0x04C
-#define VIA_REG_DSTCOLORKEY_M1      0x04C       /* as same as VIA_REG_FG */
-#define VIA_REG_BGCOLOR_M1          0x050
-#define VIA_REG_SRCCOLORKEY_M1      0x050       /* as same as VIA_REG_BG */
-#define VIA_REG_MONOPATFGC_M1       0x058       /* VT3353 Add Backgroung color of Pattern. */
-#define VIA_REG_MONOPATBGC_M1       0x05C       /* VT3353 Add Foregroung color of Pattern. */
-#define VIA_REG_COLORPAT_M1         0x100       /* from 0x100 to 0x1ff */
-
-/*410*/
-#define VIA_REG_CFC                 0x030
-#define VIA_REG_SCALEFACTOR         0x034
-#define VIA_REG_SCALINGMODE         0x038
-#define VIA_REG_23DIDCLT            0x060
-#define VIA_REG_23DWAITCLT          0x06C
-/* defines for VIA video registers */
-#define VIA_REG_INTERRUPT       0x200
-#define VIA_REG_CRTCSTART       0x214
-
-
-/* defines for VIA HW cursor registers */
-#define VIA_REG_CURSOR_MODE     0x2D0
-#define VIA_REG_CURSOR_POS      0x2D4
-#define VIA_REG_CURSOR_ORG      0x2D8
-#define VIA_REG_CURSOR_BG       0x2DC
-#define VIA_REG_CURSOR_FG       0x2E0
-
-
-/* defines for VIA 3D registers */
-#define VIA_REG_STATUS          0x400
-#define VIA_REG_TRANSET         0x43C
-#define VIA_REG_TRANSPACE       0x440
-
-/* VIA_REG_STATUS(0x400): Engine Status */
-#define VIA_CMD_RGTR_BUSY       0x00000080  /* Command Regulator is busy */
-#define VIA_2D_ENG_BUSY         0x00000002  /* 2D Engine is busy */
-#define VIA_3D_ENG_BUSY         0x00000001  /* 3D Engine is busy */
-#define VIA_VR_QUEUE_EMPTY  0x00020000 /* Virtual Queue is empty */
-
-/* VIA_REG_STATUS(0x400): Engine Status for H5 */
-#define VIA_CMD_RGTR_BUSY_H5   0x00000010  /* Command Regulator is busy */
-#define VIA_2D_ENG_BUSY_H5     0x00000002  /* 2D Engine is busy */
-#define VIA_3D_ENG_BUSY_H5     0x00001FE1  /* 3D Engine is busy */
-#define VIA_VR_QUEUE_BUSY_H5   0x00000004  /* Virtual Queue is busy */
-
-/* VIA_REG_STATUS(0x400): Engine Status for VT3353 */
-#define VIA_CMD_RGTR_BUSY_M1   0x00000010  /* Command Regulator is busy */
-#define VIA_2D_ENG_BUSY_M1     0x00000002  /* 2D Engine is busy */
-#define VIA_3D_ENG_BUSY_M1     0x00001FE1  /* 3D Engine is busy */
-#define VIA_VR_QUEUE_BUSY_M1   0x00000004  /* Virtual Queue is busy */
-
-/* VIA_REG_GECMD(0x00): 2D Engine Command  */
-#define VIA_GEC_NOOP            0x00000000
-#define VIA_GEC_BLT             0x00000001
-#define VIA_GEC_LINE            0x00000005
-/*410 GECMD*/
-#define VIA_GEC_ALPHA               0x00000003
-#define VIA_GEC_BLT_ROT             0x00000009
-#define VIA_GEC_MONOTEX             0x00000002
-#define VIA_GEC_ALPHA_ROT_MONOTEX   0x0000000a
-
-#define VIA_GEC_ROT             0x00000008  /* Rotate Command */
-
-#define VIA_GEC_SRC_XY          0x00000000
-#define VIA_GEC_SRC_LINEAR      0x00000010
-#define VIA_GEC_DST_XY          0x00000000
-#define VIA_GEC_DST_LINRAT      0x00000020
-
-#define VIA_GEC_SRC_FB          0x00000000
-#define VIA_GEC_SRC_SYS         0x00000040
-#define VIA_GEC_DST_FB          0x00000000
-#define VIA_GEC_DST_SYS         0x00000080
-
-#define VIA_GEC_SRC_MONO        0x00000100  /* source is mono */
-#define VIA_GEC_PAT_MONO        0x00000200  /* pattern is mono */
-
-#define VIA_GEC_MSRC_OPAQUE     0x00000000  /* mono src is opaque */
-#define VIA_GEC_MSRC_TRANS      0x00000400  /* mono src is transparent */
-
-#define VIA_GEC_PAT_FB          0x00000000  /* pattern is in frame buffer */
-#define VIA_GEC_PAT_REG         0x00000800  /* pattern is from reg setting */
-
-#define VIA_GEC_CLIP_DISABLE    0x00000000
-#define VIA_GEC_CLIP_ENABLE     0x00001000
-
-#define VIA_GEC_FIXCOLOR_PAT    0x00002000
-
-#define VIA_GEC_INCX            0x00000000
-#define VIA_GEC_DECY            0x00004000
-#define VIA_GEC_INCY            0x00000000
-#define VIA_GEC_DECX            0x00008000
-
-#define VIA_GEC_MPAT_OPAQUE     0x00000000  /* mono pattern is opaque */
-#define VIA_GEC_MPAT_TRANS      0x00010000  /* mono pattern is transparent */
-
-#define VIA_GEC_MONO_UNPACK     0x00000000
-#define VIA_GEC_MONO_PACK       0x00020000
-#define VIA_GEC_MONO_DWORD      0x00000000
-#define VIA_GEC_MONO_WORD       0x00040000
-#define VIA_GEC_MONO_BYTE       0x00080000
-
-#define VIA_GEC_LASTPIXEL_ON    0x00000000
-#define VIA_GEC_LASTPIXEL_OFF   0x00100000
-#define VIA_GEC_X_MAJOR         0x00000000
-#define VIA_GEC_Y_MAJOR         0x00200000
-#define VIA_GEC_QUICK_START     0x00800000
-
-
-/* VIA_REG_GEMODE(0x04): GE mode */
-#define VIA_GEM_8bpp            0x00000000
-#define VIA_GEM_16bpp           0x00000100
-#define VIA_GEM_32bpp           0x00000300
-/*410 GEM*/
-#define VIA_GEM_ALPHA           0x00100000
-#define VIA_GEM_degree90        0x00000001
-#define VIA_GEM_degree180       0x00000002
-#define VIA_GEM_degree270       0x00000303
-#define VIA_GEM_ALPHA_CNT_EN    0x00100000
-#define VIA_GEM_SETALPHA8(cnst) (cnst>>24)<<12
-/*410 SCALE*/
-#define VIA_SCALEF_VFactor8(cnst)     cnst<<20
-#define VIA_SCALEF_HFactor8(cnst)     cnst<<4
-#define VIA_SCALEM_En                 0x80000000
-#define VIA_SCALEM_Shrink             0x40000000
-#define VIA_SCALEM_BW                 0x00000000
-#define VIA_SCALEM_WB                 0x10000000
-#define VIA_SCALEM_CC                 0x20000000
-#define VIA_SCALEM_Half               0x30000000
-#define VIA_SCALEM_SrcDimenH12(cnst)        (cnst-1)<<16
-#define VIA_SCALEM_SrcDimenW12(cnst)        (cnst-1)<<0
-/*410 CFC new 2D pipline must set ??*/
-#define VIA_CFC_en                       0x80000000
-#define VIA_CFC_EXT_en                   0x40000000
-#define VIA_CFC_DITH_en                  0x20000000
-#define VIA_CFC_DesCF16_555              0x00000000
-#define VIA_CFC_DesCF16_565              0x00000100
-#define VIA_CFC_DesCF32_888              0x00000000
-#define VIA_CFC_DesCF32_000              0x00000100
-#define VIA_CFC_SrcDep8                  0x00000000
-#define VIA_CFC_SrcDep16                 0x00000050
-#define VIA_CFC_SrcDep32                 0x000000c0
-#define VIA_CFC_SrcCF16_555              0x00000000
-#define VIA_CFC_SrcCF16_565              0x00000001
-#define VIA_CFC_SrcCF32_888              0x00000000
-#define VIA_CFC_SrcCF32_000              0x00000001
-
-#define VIA_GEM_640             0x00000000   /* 640*480 */
-#define VIA_GEM_800             0x00000400   /* 800*600 */
-#define VIA_GEM_1024            0x00000800   /* 1024*768 */
-#define VIA_GEM_1280            0x00000C00   /* 1280*1024 */
-#define VIA_GEM_1600            0x00001000   /* 1600*1200 */
-#define VIA_GEM_2048            0x00001400   /* 2048*1536 */
-
-#define VIA_GEM_ROTATE_90       0x00000001   /* Rotate anticlockwise 90 degree  */
-#define VIA_GEM_ROTATE_180      0x00000002   /* Rotate anticlockwise 180 degree */
-#define VIA_GEM_ROTATE_270      0x00000003   /* Rotate anticlockwise 270 degree */
-
-/* VIA_REG_PITCH(0x38): Pitch Setting */
-#define VIA_PITCH_ENABLE        0x80000000
-
-
-#define MAXLOOP                 0xffffff
-
-
-#define VerticalRetraceWait() \
-{ \
-    VGAOUT8(vgaCRIndex, 0x17); \
-    if (VGAIN8(vgaCRReg) & 0x80) { \
-        while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x00) ; \
-        while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x08) ; \
-        while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x00) ; \
-    } \
-}
-
-
-#define VIASETREG(addr, data)   *(volatile unsigned int *)(pVia->MapBase + (addr)) = (data)
-#define VIAGETREG(addr)         *(volatile unsigned int *)(pVia->MapBase + (addr))
-
-
-#endif  /* _VIA_REGS_H_ */
+/*
+ * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
+ * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) OR COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/*************************************************************************
+ *
+ *  File:       via_regs.c
+ *  Content:    The defines of Via registers
+ *
+ ************************************************************************/
+
+#ifndef _VIA_REGS_H_
+#define _VIA_REGS_H_ 1
+
+#include "via_driver.h"
+
+/*#define VIA_SERIES(chip)  (chip == VIA_CLE266)*/
+
+
+/* Chip tags.  These are used to group the adapters into
+ * related families.
+ */
+
+enum VIACHIPTAGS {
+    VIA_UNKNOWN = 0,
+    VIA_CLE266,
+    VIA_KM400,
+    VIA_K8M800,
+    VIA_PM800,
+    VIA_P4M800PRO,  /* VT3314 */
+    VIA_CX700,      /* VT3324 */
+#ifdef VIA_VT3293_SUPPORT
+    VIA_CN750,      /* VT3293 */
+#endif
+    VIA_P4M890,     /* VT3327 */
+    VIA_K8M890,     /* VT3336 */
+    VIA_P4M900,     /* VT3364 */
+    VIA_VX800,      /* VT3353 */
+    VIA_VX855,      /* VT3409*/
+    VIA_VX900,      /* VT3410*/
+    VIA_LAST
+};
+
+
+#define PCI_VIA_VENDOR_ID       0x1106
+
+#define PCI_CHIP_CLE3122        0x3122	/* CLE266 */
+#define PCI_CHIP_VT3205         0x7205	/* KM400 */
+#define PCI_CHIP_VT3204         0x3108	/* K8M800 */
+#define PCI_CHIP_VT3259         0x3118	/* PM800 */
+#define PCI_CHIP_VT3314         0x3344	/* P4M800 Pro */
+#define PCI_CHIP_VT3324         0x3157	/* CX700 */
+#ifdef VIA_VT3293_SUPPORT
+#define PCI_CHIP_VT3293         0x3225  /* CN750 */
+#endif
+#define PCI_CHIP_VT3327         0x3343	/* P4M890 */
+#define PCI_CHIP_VT3336         0x3230  /* K8M890 */
+#define PCI_CHIP_VT3364         0x3371	/* P4M900 */
+#define PCI_CHIP_VT3353         0x1122	/* VX800 */
+#define PCI_CHIP_VT3409         0x5122	/* VX855/VX875 */
+#define PCI_CHIP_VT3410         0x7122	/* VX900 */
+
+#define PCI_DEVICE_ID_VIA_CLE266_HB         0x3123
+#define PCI_DEVICE_ID_VIA_KM400_HB          0x3205
+#define PCI_DEVICE_ID_VIA_P4M800_AGP        0x0296
+#define PCI_DEVICE_ID_VIA_P4M800_PRO_AGP    0x0314
+#define PCI_DEVICE_ID_VIA_PM800_AGP         0x0259
+#define PCI_DEVICE_ID_VIA_K8M800_AGP        0x0204
+#define PCI_DEVICE_ID_VIA_CX700_AGP         0x0324
+#define PCI_DEVICE_ID_VIA_P4M890_AGP        0x0327
+#define PCI_DEVICE_ID_VIA_K8M890_AGP        0x0336
+#define PCI_DEVICE_ID_VIA_P4M900_AGP        0x0364
+#define PCI_DEVICE_ID_VIA_VX800_HC          0x0353
+#define PCI_DEVICE_ID_VIA_VX855_HC          0x0409
+#define PCI_DEVICE_ID_VIA_VX900_HC          0x0410
+
+/* There is some conflicting information about the two major revisions of
+ * the CLE266, often labelled Ax and Cx.  The dividing line seems to be
+ * either 0x0f or 0x10. */
+#define CLE266_REV_IS_AX(x) ((x) < 0x10)
+#define CLE266_REV_IS_CX(x) ((x) >= 0x10)
+
+#define BIOS_BSIZE              1024
+#define BIOS_BASE               0xc0000
+
+
+#define VIA_MMIO_REGSIZE        0xD000    /* DisplayPort: 0xC610~0xC7D4 */
+#define VIA_MMIO_REGBASE        0x0
+#define VIA_MMIO_VGABASE        0x8000
+#define VIA_MMIO_BLTBASE        0x200000
+#define VIA_MMIO_BLTSIZE        0x200000
+
+#define VIA_MMIO_INTEGRATED_TV_BASE     0xC000
+#define VIA_MMIO_INTEGRATED_TV_SIZE     256
+
+/* defines for VIA 2D registers */
+#define VIA_REG_GECMD           0x000
+#define VIA_REG_GEMODE          0x004
+#define VIA_REG_GESTATUS        0x004       /* as same as VIA_REG_GEMODE */
+#define VIA_REG_SRCPOS          0x008
+#define VIA_REG_DSTPOS          0x00C
+#define VIA_REG_LINE_K1K2       0x008
+#define VIA_REG_LINE_XY         0x00C
+#define VIA_REG_DIMENSION       0x010       /* width and height */
+#define VIA_REG_PATADDR         0x014
+#define VIA_REG_FGCOLOR         0x018
+#define VIA_REG_DSTCOLORKEY     0x018       /* as same as VIA_REG_FG */
+#define VIA_REG_BGCOLOR         0x01C
+#define VIA_REG_SRCCOLORKEY     0x01C       /* as same as VIA_REG_BG */
+#define VIA_REG_CLIPTL          0x020       /* top and left of clipping */
+#define VIA_REG_CLIPBR          0x024       /* bottom and right of clipping */
+#define VIA_REG_OFFSET          0x028
+#define VIA_REG_LINE_ERROR      0x028
+#define VIA_REG_KEYCONTROL      0x02C       /* color key control */
+#define VIA_REG_SRCBASE         0x030
+#define VIA_REG_DSTBASE         0x034
+#define VIA_REG_PITCH           0x038       /* pitch of src and dst */
+#define VIA_REG_MONOPAT0        0x03C
+#define VIA_REG_MONOPAT1        0x040
+#define VIA_REG_ROT_TMP_ADDR    0x044       /* Rotation Temporary Base Address */
+#define VIA_REG_ROTSRC          0x048       /* Resolution X,Y of Rotation Source */
+#define VIA_REG_ROT_TMP_PITCH   0x04C       /* Pitch of Rotation Temporary Memory */
+#define VIA_REG_ROTDST          0x050       /* Resolution X,Y of Rotation Destination*/
+#define VIA_REG_COLORPAT        0x100       /* from 0x100 to 0x1ff */
+
+/* defines for VIA 2D registers for vt3353 (M1 engine)*/
+#define VIA_REG_GECMD_M1            0x000
+#define VIA_REG_GEMODE_M1           0x004
+#define VIA_REG_GESTATUS_M1         0x004       /* as same as VIA_REG_GEMODE + rotate 410*/
+#define VIA_REG_PITCH_M1            0x008       /* pitch of src and dst */
+#define VIA_REG_DIMENSION_M1        0x00C       /* width and height */
+#define VIA_REG_DSTPOS_M1           0x010
+#define VIA_REG_LINE_XY_M1          0x010
+#define VIA_REG_DSTBASE_M1          0x014
+#define VIA_REG_SRCPOS_M1           0x018
+#define VIA_REG_LINE_K1K2_M1        0x018
+#define VIA_REG_SRCBASE_M1          0x01C
+#define VIA_REG_PATADDR_M1          0x020
+#define VIA_REG_MONOPAT0_M1         0x024
+#define VIA_REG_MONOPAT1_M1         0x028
+#define VIA_REG_OFFSET_M1           0x02C
+#define VIA_REG_LINE_ERROR_M1       0x02C
+#define VIA_REG_CLIPTL_M1           0x040       /* top and left of clipping */
+#define VIA_REG_CLIPBR_M1           0x044       /* bottom and right of clipping */
+#define VIA_REG_KEYCONTROL_M1       0x048       /* color key control */
+#define VIA_REG_FGCOLOR_M1          0x04C
+#define VIA_REG_DSTCOLORKEY_M1      0x04C       /* as same as VIA_REG_FG */
+#define VIA_REG_BGCOLOR_M1          0x050
+#define VIA_REG_SRCCOLORKEY_M1      0x050       /* as same as VIA_REG_BG */
+#define VIA_REG_MONOPATFGC_M1       0x058       /* VT3353 Add Backgroung color of Pattern. */
+#define VIA_REG_MONOPATBGC_M1       0x05C       /* VT3353 Add Foregroung color of Pattern. */
+#define VIA_REG_COLORPAT_M1         0x100       /* from 0x100 to 0x1ff */
+
+/*410*/
+#define VIA_REG_CFC                 0x030
+#define VIA_REG_SCALEFACTOR         0x034
+#define VIA_REG_SCALINGMODE         0x038
+#define VIA_REG_23DIDCLT            0x060
+#define VIA_REG_23DWAITCLT          0x06C
+/* defines for VIA video registers */
+#define VIA_REG_INTERRUPT       0x200
+#define VIA_REG_CRTCSTART       0x214
+
+
+/* defines for VIA HW cursor registers */
+#define VIA_REG_CURSOR_MODE     0x2D0
+#define VIA_REG_CURSOR_POS      0x2D4
+#define VIA_REG_CURSOR_ORG      0x2D8
+#define VIA_REG_CURSOR_BG       0x2DC
+#define VIA_REG_CURSOR_FG       0x2E0
+
+
+/* defines for VIA 3D registers */
+#define VIA_REG_STATUS          0x400
+#define VIA_REG_TRANSET         0x43C
+#define VIA_REG_TRANSPACE       0x440
+
+/* VIA_REG_STATUS(0x400): Engine Status */
+#define VIA_CMD_RGTR_BUSY       0x00000080  /* Command Regulator is busy */
+#define VIA_2D_ENG_BUSY         0x00000002  /* 2D Engine is busy */
+#define VIA_3D_ENG_BUSY         0x00000001  /* 3D Engine is busy */
+#define VIA_VR_QUEUE_EMPTY  0x00020000 /* Virtual Queue is empty */
+
+/* VIA_REG_STATUS(0x400): Engine Status for H5 */
+#define VIA_CMD_RGTR_BUSY_H5   0x00000010  /* Command Regulator is busy */
+#define VIA_2D_ENG_BUSY_H5     0x00000002  /* 2D Engine is busy */
+#define VIA_3D_ENG_BUSY_H5     0x00001FE1  /* 3D Engine is busy */
+#define VIA_VR_QUEUE_BUSY_H5   0x00000004  /* Virtual Queue is busy */
+
+/* VIA_REG_STATUS(0x400): Engine Status for VT3353 */
+#define VIA_CMD_RGTR_BUSY_M1   0x00000010  /* Command Regulator is busy */
+#define VIA_2D_ENG_BUSY_M1     0x00000002  /* 2D Engine is busy */
+#define VIA_3D_ENG_BUSY_M1     0x00001FE1  /* 3D Engine is busy */
+#define VIA_VR_QUEUE_BUSY_M1   0x00000004  /* Virtual Queue is busy */
+
+/* VIA_REG_GECMD(0x00): 2D Engine Command  */
+#define VIA_GEC_NOOP            0x00000000
+#define VIA_GEC_BLT             0x00000001
+#define VIA_GEC_LINE            0x00000005
+/*410 GECMD*/
+#define VIA_GEC_ALPHA               0x00000003
+#define VIA_GEC_BLT_ROT             0x00000009
+#define VIA_GEC_MONOTEX             0x00000002
+#define VIA_GEC_ALPHA_ROT_MONOTEX   0x0000000a
+
+#define VIA_GEC_ROT             0x00000008  /* Rotate Command */
+
+#define VIA_GEC_SRC_XY          0x00000000
+#define VIA_GEC_SRC_LINEAR      0x00000010
+#define VIA_GEC_DST_XY          0x00000000
+#define VIA_GEC_DST_LINRAT      0x00000020
+
+#define VIA_GEC_SRC_FB          0x00000000
+#define VIA_GEC_SRC_SYS         0x00000040
+#define VIA_GEC_DST_FB          0x00000000
+#define VIA_GEC_DST_SYS         0x00000080
+
+#define VIA_GEC_SRC_MONO        0x00000100  /* source is mono */
+#define VIA_GEC_PAT_MONO        0x00000200  /* pattern is mono */
+
+#define VIA_GEC_MSRC_OPAQUE     0x00000000  /* mono src is opaque */
+#define VIA_GEC_MSRC_TRANS      0x00000400  /* mono src is transparent */
+
+#define VIA_GEC_PAT_FB          0x00000000  /* pattern is in frame buffer */
+#define VIA_GEC_PAT_REG         0x00000800  /* pattern is from reg setting */
+
+#define VIA_GEC_CLIP_DISABLE    0x00000000
+#define VIA_GEC_CLIP_ENABLE     0x00001000
+
+#define VIA_GEC_FIXCOLOR_PAT    0x00002000
+
+#define VIA_GEC_INCX            0x00000000
+#define VIA_GEC_DECY            0x00004000
+#define VIA_GEC_INCY            0x00000000
+#define VIA_GEC_DECX            0x00008000
+
+#define VIA_GEC_MPAT_OPAQUE     0x00000000  /* mono pattern is opaque */
+#define VIA_GEC_MPAT_TRANS      0x00010000  /* mono pattern is transparent */
+
+#define VIA_GEC_MONO_UNPACK     0x00000000
+#define VIA_GEC_MONO_PACK       0x00020000
+#define VIA_GEC_MONO_DWORD      0x00000000
+#define VIA_GEC_MONO_WORD       0x00040000
+#define VIA_GEC_MONO_BYTE       0x00080000
+
+#define VIA_GEC_LASTPIXEL_ON    0x00000000
+#define VIA_GEC_LASTPIXEL_OFF   0x00100000
+#define VIA_GEC_X_MAJOR         0x00000000
+#define VIA_GEC_Y_MAJOR         0x00200000
+#define VIA_GEC_QUICK_START     0x00800000
+
+
+/* VIA_REG_GEMODE(0x04): GE mode */
+#define VIA_GEM_8bpp            0x00000000
+#define VIA_GEM_16bpp           0x00000100
+#define VIA_GEM_32bpp           0x00000300
+/*410 GEM*/
+#define VIA_GEM_ALPHA           0x00100000
+#define VIA_GEM_degree90        0x00000001
+#define VIA_GEM_degree180       0x00000002
+#define VIA_GEM_degree270       0x00000303
+#define VIA_GEM_ALPHA_CNT_EN    0x00100000
+#define VIA_GEM_SETALPHA8(cnst) (cnst>>24)<<12
+/*410 SCALE*/
+#define VIA_SCALEF_VFactor8(cnst)     cnst<<20
+#define VIA_SCALEF_HFactor8(cnst)     cnst<<4
+#define VIA_SCALEM_En                 0x80000000
+#define VIA_SCALEM_Shrink             0x40000000
+#define VIA_SCALEM_BW                 0x00000000
+#define VIA_SCALEM_WB                 0x10000000
+#define VIA_SCALEM_CC                 0x20000000
+#define VIA_SCALEM_Half               0x30000000
+#define VIA_SCALEM_SrcDimenH12(cnst)        (cnst-1)<<16
+#define VIA_SCALEM_SrcDimenW12(cnst)        (cnst-1)<<0
+/*410 CFC new 2D pipline must set ??*/
+#define VIA_CFC_en                       0x80000000
+#define VIA_CFC_EXT_en                   0x40000000
+#define VIA_CFC_DITH_en                  0x20000000
+#define VIA_CFC_DesCF16_555              0x00000000
+#define VIA_CFC_DesCF16_565              0x00000100
+#define VIA_CFC_DesCF32_888              0x00000000
+#define VIA_CFC_DesCF32_000              0x00000100
+#define VIA_CFC_SrcDep8                  0x00000000
+#define VIA_CFC_SrcDep16                 0x00000050
+#define VIA_CFC_SrcDep32                 0x000000c0
+#define VIA_CFC_SrcCF16_555              0x00000000
+#define VIA_CFC_SrcCF16_565              0x00000001
+#define VIA_CFC_SrcCF32_888              0x00000000
+#define VIA_CFC_SrcCF32_000              0x00000001
+
+#define VIA_GEM_640             0x00000000   /* 640*480 */
+#define VIA_GEM_800             0x00000400   /* 800*600 */
+#define VIA_GEM_1024            0x00000800   /* 1024*768 */
+#define VIA_GEM_1280            0x00000C00   /* 1280*1024 */
+#define VIA_GEM_1600            0x00001000   /* 1600*1200 */
+#define VIA_GEM_2048            0x00001400   /* 2048*1536 */
+
+#define VIA_GEM_ROTATE_90       0x00000001   /* Rotate anticlockwise 90 degree  */
+#define VIA_GEM_ROTATE_180      0x00000002   /* Rotate anticlockwise 180 degree */
+#define VIA_GEM_ROTATE_270      0x00000003   /* Rotate anticlockwise 270 degree */
+
+/* VIA_REG_PITCH(0x38): Pitch Setting */
+#define VIA_PITCH_ENABLE        0x80000000
+
+
+#define MAXLOOP                 0xffffff
+
+
+#define VerticalRetraceWait() \
+{ \
+    VGAOUT8(vgaCRIndex, 0x17); \
+    if (VGAIN8(vgaCRReg) & 0x80) { \
+        while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x00) ; \
+        while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x08) ; \
+        while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x00) ; \
+    } \
+}
+
+
+#define VIASETREG(addr, data)   *(volatile unsigned int *)(pVia->MapBase + (addr)) = (data)
+#define VIAGETREG(addr)         *(volatile unsigned int *)(pVia->MapBase + (addr))
+#define VIASETREGMASK(addr, data, mask) \
+        VIASETREG(addr, (data & mask) | (VIAGETREG(addr) & ~mask))
+
+#endif  /* _VIA_REGS_H_ */
diff --git a/src/via_sii164.c b/src/via_sii164.c
index 5900e06..701b812 100644
--- a/src/via_sii164.c
+++ b/src/via_sii164.c
@@ -30,6 +30,7 @@
 #endif
 
 #include "via_driver.h"
+#include "via_ums.h"
 #include "via_sii164.h"
 
 static void
@@ -41,10 +42,10 @@ viaSiI164DumpRegisters(ScrnInfoPtr pScrn, I2CDevPtr pDev)
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaSiI164DumpRegisters.\n"));
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "SiI 164: dumping registers:\n"));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Dumping SiI 164 registers.\n"));
     for (i = 0; i <= 0x0f; i++) {
         xf86I2CReadByte(pDev, i, &tmp);
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "SiI 164: 0x%02x: 0x%02x\n", i, tmp));
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "0x%02x: 0x%02x\n", i, tmp));
     }
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -153,13 +154,9 @@ viaSiI164RestoreRegisters(ScrnInfoPtr pScrn, I2CDevPtr pDev,
 static int
 viaSiI164CheckModeValidity(xf86OutputPtr output, DisplayModePtr pMode)
 {
-    ScrnInfoPtr pScrn = output->scrn;
     viaSiI164RecPtr pSiI164Rec = output->driver_private;
     int status = MODE_OK;
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
-                        "Entered viaSiI164CheckModeValidity.\n"));
-
     if (pMode->Clock < pSiI164Rec->DotclockMin) {
         status = MODE_CLOCK_LOW;
         goto exit;
@@ -170,8 +167,6 @@ viaSiI164CheckModeValidity(xf86OutputPtr output, DisplayModePtr pMode)
     }
 
 exit:
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaSiI164CheckModeValidity.\n"));
     return status;
 }
 
@@ -191,12 +186,14 @@ via_sii164_dpms(xf86OutputPtr output, int mode)
 
     switch (mode) {
     case DPMSModeOn:
-        viaSiI164Power(pScrn, pSiI164Rec->SiI164I2CDev, TRUE);
+        viaSiI164Power(pScrn, pSiI164Rec->pSiI164I2CDev, TRUE);
+        viaExtTMDSIOPadState(pScrn, pSiI164Rec->diPort, TRUE);
         break;
     case DPMSModeStandby:
     case DPMSModeSuspend:
     case DPMSModeOff:
-        viaSiI164Power(pScrn, pSiI164Rec->SiI164I2CDev, FALSE);
+        viaSiI164Power(pScrn, pSiI164Rec->pSiI164I2CDev, FALSE);
+        viaExtTMDSIOPadState(pScrn, pSiI164Rec->diPort, FALSE);
         break;
     default:
         break;
@@ -215,7 +212,7 @@ via_sii164_save(xf86OutputPtr output)
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered via_sii164_save.\n"));
 
-    viaSiI164SaveRegisters(pScrn, pSiI164Rec->SiI164I2CDev, pSiI164Rec);
+    viaSiI164SaveRegisters(pScrn, pSiI164Rec->pSiI164I2CDev, pSiI164Rec);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting via_sii164_save.\n"));
@@ -230,7 +227,7 @@ via_sii164_restore(xf86OutputPtr output)
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered via_sii164_restore.\n"));
 
-    viaSiI164RestoreRegisters(pScrn, pSiI164Rec->SiI164I2CDev,
+    viaSiI164RestoreRegisters(pScrn, pSiI164Rec->pSiI164I2CDev,
                                 pSiI164Rec);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -253,11 +250,33 @@ via_sii164_mode_fixup(xf86OutputPtr output, DisplayModePtr mode,
 static void
 via_sii164_prepare(xf86OutputPtr output)
 {
+    ScrnInfoPtr pScrn = output->scrn;
+    viaSiI164RecPtr pSiI164Rec = output->driver_private;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+    viaSiI164Power(pScrn, pSiI164Rec->pSiI164I2CDev, FALSE);
+    viaExtTMDSIOPadState(pScrn, pSiI164Rec->diPort, FALSE);
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
 }
 
 static void
 via_sii164_commit(xf86OutputPtr output)
 {
+    ScrnInfoPtr pScrn = output->scrn;
+    viaSiI164RecPtr pSiI164Rec = output->driver_private;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+    viaSiI164Power(pScrn, pSiI164Rec->pSiI164I2CDev, TRUE);
+    viaExtTMDSIOPadState(pScrn, pSiI164Rec->diPort, TRUE);
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
 }
 
 static void
@@ -276,9 +295,9 @@ via_sii164_mode_set(xf86OutputPtr output, DisplayModePtr mode,
         viaExtTMDSSetDataDriveStrength(pScrn, 0x03);
         viaExtTMDSEnableIOPads(pScrn, 0x03);
 
-        viaSiI164DumpRegisters(pScrn, pSiI164Rec->SiI164I2CDev);
-        viaSiI164InitRegisters(pScrn, pSiI164Rec->SiI164I2CDev);
-        viaSiI164DumpRegisters(pScrn, pSiI164Rec->SiI164I2CDev);
+        viaSiI164DumpRegisters(pScrn, pSiI164Rec->pSiI164I2CDev);
+        viaSiI164InitRegisters(pScrn, pSiI164Rec->pSiI164I2CDev);
+        viaSiI164DumpRegisters(pScrn, pSiI164Rec->pSiI164I2CDev);
 
         viaExtTMDSSetDisplaySource(pScrn, iga->index ? 0x01 : 0x00);
     }
@@ -290,25 +309,63 @@ via_sii164_mode_set(xf86OutputPtr output, DisplayModePtr mode,
 static xf86OutputStatus
 via_sii164_detect(xf86OutputPtr output)
 {
-    xf86MonPtr mon;
+    ScrnInfoPtr pScrn = output->scrn;
     xf86OutputStatus status = XF86OutputStatusDisconnected;
+    viaSiI164RecPtr pSiI164Rec = (viaSiI164RecPtr) output->driver_private;
+    Bool connectorDetected;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered via_sii_164_detect.\n"));
+
+    xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                "Probing for a DVI connector . . .\n");
+
+    connectorDetected = viaSiI164Sense(pScrn, pSiI164Rec->pSiI164I2CDev);
+    if (!connectorDetected) {
+        xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                    "DVI connector not detected.\n");
+        goto exit;
+    }
+
+    status = XF86OutputStatusConnected;
+    xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                "DVI connector detected.\n");
+
+exit:
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting via_sii_164_detect.\n"));
+    return status;
+}
+
+static DisplayModePtr
+via_sii164_get_modes(xf86OutputPtr output)
+{
     ScrnInfoPtr pScrn = output->scrn;
-    viaSiI164RecPtr pSiI164Rec = output->driver_private;
+    xf86MonPtr pMon;
+    DisplayModePtr pDisplay_Mode = NULL;
+    I2CBusPtr pI2CBus;
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    viaSiI164RecPtr pSiI164Rec = (viaSiI164RecPtr) output->driver_private;
 
-    /* Check for the DVI presence via SiI 164 first before accessing
-     * I2C bus. */
-    if (viaSiI164Sense(pScrn, pSiI164Rec->SiI164I2CDev)) {
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+    if (pSiI164Rec->i2cBus & VIA_I2C_BUS2) {
+        pI2CBus = pVIADisplay->pI2CBus2;
+    } else if (pSiI164Rec->i2cBus & VIA_I2C_BUS3) {
+        pI2CBus = pVIADisplay->pI2CBus3;
+    } else {
+        pI2CBus = NULL;
+    }
 
-        /* Since DVI presence was established, access the I2C bus
-         * assigned to DVI. */
-        mon = xf86OutputGetEDID(output, pSiI164Rec->SiI164I2CDev->pI2CBus);
+    if (pI2CBus) {
+        pMon = xf86OutputGetEDID(output, pI2CBus);
 
         /* Is the interface type digital? */
-        if (mon && DIGITAL(mon->features.input_type)) {
-            status = XF86OutputStatusConnected;
-            xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                        "Detected a monitor connected to DVI.\n");
-            xf86OutputSetEDID(output, mon);
+        if (pMon && DIGITAL(pMon->features.input_type)) {
+            xf86OutputSetEDID(output, pMon);
+            pDisplay_Mode = xf86OutputGetEDIDModes(output);
         } else {
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                         "Could not obtain EDID from a monitor "
@@ -316,7 +373,9 @@ via_sii164_detect(xf86OutputPtr output)
         }
     }
 
-    return status;
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
+    return pDisplay_Mode;
 }
 
 #ifdef RANDR_12_INTERFACE
@@ -352,7 +411,7 @@ const xf86OutputFuncsRec via_sii164_funcs = {
     .commit             = via_sii164_commit,
     .mode_set           = via_sii164_mode_set,
     .detect             = via_sii164_detect,
-    .get_modes          = xf86OutputGetEDIDModes,
+    .get_modes          = via_sii164_get_modes,
 #ifdef RANDR_12_INTERFACE
     .set_property       = via_sii164_set_property,
 #endif
@@ -363,31 +422,34 @@ const xf86OutputFuncsRec via_sii164_funcs = {
 };
 
 Bool
-viaSiI164Init(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus)
+viaSiI164Probe(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus)
 {
-    xf86OutputPtr output;
-    VIAPtr pVia = VIAPTR(pScrn);
-    viaSiI164RecPtr pSiI164Rec = NULL;
     I2CDevPtr pI2CDevice = NULL;
     I2CSlaveAddr i2cAddr = 0x70;
-    CARD8 buf;
+    CARD8 i2cData;
     CARD16 vendorID, deviceID;
     Bool status = FALSE;
-    char outputNameBuffer[32];
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaSiI164Init.\n"));
+                        "Entered viaSiI164Probe.\n"));
+
+    if (!pI2CBus) {
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                            "Invalid I2C bus.\n"));
+        goto exit;
+    }
 
     if (!xf86I2CProbeAddress(pI2CBus, i2cAddr)) {
-        xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                    "I2C device not found.\n");
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                            "I2C bus device not found.\n"));
         goto exit;
     }
 
     pI2CDevice = xf86CreateI2CDevRec();
     if (!pI2CDevice) {
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "Failed to create an I2C bus device record.\n");
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                            "Failed to create an I2C bus device "
+                            "record.\n"));
         goto exit;
     }
 
@@ -396,88 +458,155 @@ viaSiI164Init(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus)
     pI2CDevice->pI2CBus = pI2CBus;
     if (!xf86I2CDevInit(pI2CDevice)) {
         xf86DestroyI2CDevRec(pI2CDevice, TRUE);
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "Failed to initialize a device on I2C bus.\n");
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                            "Failed to initialize a device on "
+                            "I2C bus.\n"));
         goto exit;
     }
 
-    xf86I2CReadByte(pI2CDevice, 0, &buf);
-    vendorID = buf;
-    xf86I2CReadByte(pI2CDevice, 1, &buf);
-    vendorID |= buf << 8;
+    xf86I2CReadByte(pI2CDevice, 0, &i2cData);
+    vendorID = i2cData;
+    xf86I2CReadByte(pI2CDevice, 1, &i2cData);
+    vendorID |= i2cData << 8;
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Vendor ID: 0x%04x\n", vendorID));
 
-    xf86I2CReadByte(pI2CDevice, 2, &buf);
-    deviceID = buf;
-    xf86I2CReadByte(pI2CDevice, 3, &buf);
-    deviceID |= buf << 8;
+    xf86I2CReadByte(pI2CDevice, 2, &i2cData);
+    deviceID = i2cData;
+    xf86I2CReadByte(pI2CDevice, 3, &i2cData);
+    deviceID |= i2cData << 8;
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Device ID: 0x%04x\n", deviceID));
 
     if ((vendorID != 0x0001) || (deviceID != 0x0006)) {
         xf86DestroyI2CDevRec(pI2CDevice, TRUE);
-        xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                    "SiI 164 external TMDS transmitter not detected.\n");
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                            "SiI 164 external TMDS transmitter not "
+                            "detected.\n"));
         goto exit;
     }
 
+    status = TRUE;
     xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                 "SiI 164 external TMDS transmitter detected.\n");
+    xf86DestroyI2CDevRec(pI2CDevice, TRUE);
+exit:
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaSiI164Probe.\n"));
+    return status;
+}
 
-    pSiI164Rec = xnfcalloc(1, sizeof(viaSiI164Rec));
-    if (!pSiI164Rec) {
-        xf86DestroyI2CDevRec(pI2CDevice, TRUE);
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "Failed to allocate working storage for SiI 164.\n");
+void
+viaSiI164Init(ScrnInfoPtr pScrn)
+{
+    xf86OutputPtr output;
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    viaSiI164RecPtr pVIASiI164;
+    I2CBusPtr pI2CBus;
+    I2CDevPtr pI2CDevice;
+    I2CSlaveAddr i2cAddr = 0x70;
+    CARD8 i2cData;
+    char outputNameBuffer[32];
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaSiI164Init.\n"));
+
+    if ((!(pVIADisplay->extTMDSPresence)) ||
+        (pVIADisplay->extTMDSTransmitter != VIA_TMDS_SII164)) {
         goto exit;
     }
 
-    // Remembering which I2C bus is used for SiI 164.
-    pSiI164Rec->SiI164I2CDev = pI2CDevice;
+    if (pVIADisplay->extTMDSI2CBus & VIA_I2C_BUS2) {
+        pI2CBus = pVIADisplay->pI2CBus2;
+    } else if (pVIADisplay->extTMDSI2CBus & VIA_I2C_BUS3) {
+        pI2CBus = pVIADisplay->pI2CBus3;
+    } else {
+        goto exit;
+    }
 
-    xf86I2CReadByte(pI2CDevice, 0x06, &buf);
-    pSiI164Rec->DotclockMin = buf * 1000;
+    if (!xf86I2CProbeAddress(pI2CBus, i2cAddr)) {
+        xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                    "I2C device not found.\n");
+        goto exit;
+    }
 
-    xf86I2CReadByte(pI2CDevice, 0x07, &buf);
-    pSiI164Rec->DotclockMax = (buf + 65) * 1000;
+    pI2CDevice = xf86CreateI2CDevRec();
+    if (!pI2CDevice) {
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                    "Failed to create an I2C bus device record.\n");
+        goto exit;
+    }
 
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Supported SiI 164 Dot Clock Range: "
-                "%d to %d MHz\n",
-                pSiI164Rec->DotclockMin / 1000,
-                pSiI164Rec->DotclockMax / 1000);
+    pI2CDevice->DevName = "SiI 164";
+    pI2CDevice->SlaveAddr = i2cAddr;
+    pI2CDevice->pI2CBus = pI2CBus;
+    if (!xf86I2CDevInit(pI2CDevice)) {
+        xf86DestroyI2CDevRec(pI2CDevice, TRUE);
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                    "Failed to initialize a device on I2C bus.\n");
+        goto exit;
+    }
+
+    pVIASiI164 = (viaSiI164RecPtr) xnfcalloc(1, sizeof(viaSiI164Rec));
+    if (!pVIASiI164) {
+        xf86DestroyI2CDevRec(pI2CDevice, TRUE);
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                            "Failed to allocate storage for "
+                            "SiI 164.\n"));
+        goto exit;
+    }
 
-    /* The code to dynamically designate the particular DVI (i.e., DVI-1,
+    /* The code to dynamically designate a particular DVI (i.e., DVI-1,
      * DVI-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */
-    sprintf(outputNameBuffer, "DVI-%d", (pVia->numberDVI + 1));
+    sprintf(outputNameBuffer, "DVI-%d", (pVIADisplay->numberDVI + 1));
     output = xf86OutputCreate(pScrn, &via_sii164_funcs, outputNameBuffer);
     if (!output) {
-        free(pSiI164Rec);
+        free(pVIASiI164);
         xf86DestroyI2CDevRec(pI2CDevice, TRUE);
         xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "Failed to allocate X Server display output record for "
-                    "SiI 164.\n");
+                    "Failed to create X Server display output "
+                    "for SiI 164.\n");
         goto exit;
     }
 
-    output->driver_private = pSiI164Rec;
+    /* Increment the number of DVI connectors. */
+    pVIADisplay->numberDVI++;
+
+    // Remembering which I2C bus is used for SiI 164.
+    pVIASiI164->pSiI164I2CDev = pI2CDevice;
+
+    pVIASiI164->diPort = pVIADisplay->extTMDSDIPort;
+
+    /* Hint about which I2C bus to access for obtaining EDID. */
+    pVIASiI164->i2cBus = pVIADisplay->extTMDSI2CBus;
+
+    pVIASiI164->transmitter = pVIADisplay->extTMDSTransmitter;
+
+    xf86I2CReadByte(pI2CDevice, 0x06, &i2cData);
+    pVIASiI164->DotclockMin = i2cData * 1000;
+
+    xf86I2CReadByte(pI2CDevice, 0x07, &i2cData);
+    pVIASiI164->DotclockMax = (i2cData + 65) * 1000;
+
+    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Supported SiI 164 Dot Clock Range: "
+                "%d to %d MHz\n",
+                pVIASiI164->DotclockMin / 1000,
+                pVIASiI164->DotclockMax / 1000);
+
+    output->driver_private = pVIASiI164;
 
     /* Since there are two (2) display controllers registered with the
      * X.Org Server and both IGA1 and IGA2 can handle DVI without any
      * limitations, possible_crtcs should be set to 0x3 (0b11) so that
      * either display controller can get assigned to handle DVI. */
-    output->possible_crtcs = (1 << 1) | (1 << 0);
+    output->possible_crtcs = BIT(1) | BIT(0);
 
     output->possible_clones = 0;
     output->interlaceAllowed = FALSE;
     output->doubleScanAllowed = FALSE;
 
-    viaSiI164DumpRegisters(pScrn, pI2CDevice);
-
-    pVia->numberDVI++;
-    status = TRUE;
 exit:
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting viaSiI164Init.\n"));
-    return status;
 }
diff --git a/src/via_sii164.h b/src/via_sii164.h
index 10077a3..250ac75 100644
--- a/src/via_sii164.h
+++ b/src/via_sii164.h
@@ -36,7 +36,11 @@
 #define VIA_SII164_PDB  0x01
 
 typedef struct _viaSiI164 {
-	I2CDevPtr SiI164I2CDev;
+    I2CDevPtr pSiI164I2CDev;
+
+    uint32_t diPort;
+    uint8_t i2cBus;
+    uint8_t transmitter;
 
 	int DotclockMin;
 	int DotclockMax;
@@ -47,8 +51,9 @@ typedef struct _viaSiI164 {
 } viaSiI164Rec, *viaSiI164RecPtr;
 
 
-const xf86OutputFuncsRec via_sii164_funcs;
+extern const xf86OutputFuncsRec via_sii164_funcs;
 
-Bool viaSiI164Init(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus);
+Bool viaSiI164Probe(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus);
+void viaSiI164Init(ScrnInfoPtr pScrn);
 
 #endif /* _VIA_SII164_H_ */
diff --git a/src/via_tmds.c b/src/via_tmds.c
index 9543665..752dcbb 100644
--- a/src/via_tmds.c
+++ b/src/via_tmds.c
@@ -44,33 +44,85 @@
 
 
 /*
-	1. Formula:
-		2^13 X 0.0698uSec [1/14.318MHz] = 8192 X 0.0698uSec =572.1uSec
-		Timer = Counter x 572 uSec
-	2. Note:
-		0.0698 uSec is too small to compute for hardware. So we multiply a
-		reference value(2^13) to make it big enough to compute for hardware.
-	3. Note:
-		The meaning of the TD0~TD3 are count of the clock.
-		TD(sec) = (sec)/(per clock) x (count of clocks)
-*/
-#define TD0 200
-#define TD1 25
-#define TD2 0
-#define TD3 25
+ * Sets the polarity of horizontal synchronization and vertical
+ * synchronization.
+ */
+static void
+viaTMDSSyncPolarity(ScrnInfoPtr pScrn, unsigned int flags)
+{
+    CARD8 syncPolarity = 0x00;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaTMDSSyncPolarity.\n"));
+
+    if (flags & V_NHSYNC) {
+        syncPolarity |= BIT(0);
+    }
 
+    if (flags & V_NVSYNC) {
+        syncPolarity |= BIT(1);
+    }
+
+    viaTMDSSetSyncPolarity(pScrn, syncPolarity);
+    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                "TMDS (DVI) Horizontal Sync Polarity: %s\n",
+                (syncPolarity & BIT(0)) ? "-" : "+");
+    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                "TMDS (DVI) Vertical Sync Polarity: %s\n",
+                (syncPolarity & BIT(1)) ? "-" : "+");
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaTMDSSyncPolarity.\n"));
+}
+
+/*
+ * Sets TMDS (DVI) display source.
+ */
+static void
+viaTMDSDisplaySource(ScrnInfoPtr pScrn, int index)
+{
+    CARD8 displaySource = index;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaTMDSDisplaySource.\n"));
+
+    viaTMDSSetDisplaySource(pScrn, displaySource & 0x01);
+    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                "TMDS (DVI) Display Source: IGA%d\n",
+                (displaySource & 0x01) + 1);
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaTMDSDisplaySource.\n"));
+}
 
 /*
  * Initializes most registers related to VIA Technologies IGP
  * integrated TMDS transmitter. Synchronization polarity and
  * display output source need to be set separately. */
 static void
-viaTMDSInitRegisters(ScrnInfoPtr pScrn)
+viaTMDSInitReg(ScrnInfoPtr pScrn)
 {
     vgaHWPtr hwp = VGAHWPTR(pScrn);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaTMDSInitRegisters.\n"));
+                        "Entered viaTMDSInitReg.\n"));
+
+    /* Turn off hardware controlled FP power on / off circuit. */
+    viaFPSetPrimaryHardPower(pScrn, FALSE);
+
+    /* Use software FP power sequence control. */
+    viaFPSetPrimaryPowerSeqType(pScrn, FALSE);
+
+    /* Turn off software controlled primary FP power rails. */
+    viaFPSetPrimarySoftVDD(pScrn, FALSE);
+    viaFPSetPrimarySoftVEE(pScrn, FALSE);
+
+    /* Turn off software controlled primary FP back light
+     * control. */
+    viaFPSetPrimarySoftBackLight(pScrn, FALSE);
+
+    /* Turn off direct control of FP back light. */
+    viaFPSetPrimaryDirectBackLightCtrl(pScrn, FALSE);
 
     /* Activate DVI + LVDS2 mode. */
     /* 3X5.D2[5:4] - Display Channel Select
@@ -115,150 +167,36 @@ viaTMDSInitRegisters(ScrnInfoPtr pScrn)
     ViaSeqMask(hwp, 0x2B, 0x40, 0x40);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaTMDSInitRegisters.\n"));
+                        "Exiting viaTMDSInitReg.\n"));
 }
 
 /*
- * Sets the polarity of horizontal synchronization and vertical
- * synchronization.
+ * Sets integrated TMDS (DVI) monitor power state.
  */
-static void
-viaTMDSSetSyncPolarity(ScrnInfoPtr pScrn, DisplayModePtr mode)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    CARD8 cr97;
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaTMDSSetSyncPolarity.\n"));
-
-    /* 3X5.97[6] - DVI (TMDS) VSYNC Polarity
-     *             0: Positive
-     *             1: Negative
-     * 3X5.97[5] - DVI (TMDS) HSYNC Polarity
-     *             0: Positive
-     *             1: Negative */
-    cr97 = hwp->readCrtc(hwp, 0x97);
-    if (mode->Flags & V_NHSYNC) {
-        cr97 |= 0x20;
-    } else {
-        cr97 &= (~0x20);
-    }
-
-    if (mode->Flags & V_NVSYNC) {
-        cr97 |= 0x40;
-    } else {
-        cr97 &= (~0x40);
-    }
-
-    ViaCrtcMask(hwp, 0x97, cr97, 0x60);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaTMDSSetSyncPolarity.\n"));
-}
-
-/*
- * Sets IGA1 or IGA2 as the display output source for VIA Technologies IGP
- * integrated TMDS transmitter.
- */
-static void
-viaTMDSSetSource(ScrnInfoPtr pScrn, CARD8 displaySource)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    CARD8 temp = displaySource;
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaTMDSSetSource.\n"));
-
-    /* Set integrated TMDS transmitter display output source.
-     * The integrated TMDS transmitter appears to utilize LVDS1's data
-     * source selection bit (3X5.99[4]). */
-    /* 3X5.99[4] - LVDS Channel1 Data Source Selection
-     *             0: Primary Display
-     *             1: Secondary Display */
-    ViaCrtcMask(hwp, 0x99, temp << 4, 0x10);
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "Integrated TMDS Transmitter Display Output Source: IGA%d\n",
-                (temp & 0x01) + 1);
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaTMDSSetSource.\n"));
-}
-
-/*
- * Returns TMDS receiver detection state for VIA Technologies IGP
- * integrated TMDS transmitter.
- */
-static Bool
-viaTMDSSense(ScrnInfoPtr pScrn)
-{
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    VIAPtr pVia = VIAPTR(pScrn);
-    CARD8 tmdsReceiverDetected = 0x00;
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaTMDSSense.\n"));
-
-    /* For now, faking DVI detection.*/
-    tmdsReceiverDetected = 0x01;
-
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "Integrated TMDS transmitter %s a TMDS receiver.\n",
-                (tmdsReceiverDetected & 0x01) ? "detected" : "did not detect");
-
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaTMDSSense.\n"));
-    return tmdsReceiverDetected;
-}
-
 static void
 viaTMDSPower(ScrnInfoPtr pScrn, Bool powerState)
 {
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaTMDSPower.\n"));
 
     if (powerState) {
-        /* 3X5.91[7] - Software Direct On / Off Display Period
-                       in the Panel Path
-                       0: On
-                       1: Off */
-        ViaCrtcMask(hwp, 0x91, 0x00, 0x80);
-
-        /* 3X5.91[0] - Hardware or Software Control Power Sequence
-                       1: Software Control */
-        ViaCrtcMask(hwp, 0x91, 0x01, 0x01);
-
-        usleep(TD0);
-
-        /* 3X5.91[4] - Software VDD On
-                       0: Off
-                       1: On */
-        ViaCrtcMask(hwp, 0x91, 0x10, 0x10);
-
-        usleep(TD1);
-
-        /* 3X5.91[3] - Software Data On
-                       0: Off
-                       1: On */
-        ViaCrtcMask(hwp, 0x91, 0x08, 0x08);
-
-        /* 3X5.D2[3] - Power Down (Active High) for DVI
-         *             0: TMDS power on
-         *             1: TMDS power down */
-        ViaCrtcMask(hwp, 0xD2, 0x00, 0x08);
-    } else {
-        ViaCrtcMask(hwp, 0xD2, 0x08, 0x08);
+        viaFPSetPrimaryDirectDisplayPeriod(pScrn, TRUE);
 
-        ViaCrtcMask(hwp, 0x91, 0x00, 0x08);
+        /* Turn on software controlled primary FP data transmission. */
+        viaFPSetPrimarySoftData(pScrn, TRUE);
 
-        usleep(TD1);
+        viaTMDSSetPower(pScrn, TRUE);
+    } else {
+        viaTMDSSetPower(pScrn, FALSE);
 
-        ViaCrtcMask(hwp, 0x91, 0x00, 0x10);
+        /* Turn off software controlled primary FP data transmission. */
+        viaFPSetPrimarySoftData(pScrn, TRUE);
+
+        viaFPSetPrimaryDirectDisplayPeriod(pScrn, FALSE);
     }
 
     xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "Integrated TMDS (DVI) Power: %s\n",
+                "DVI Power: %s\n",
                 powerState ? "On" : "Off");
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -270,23 +208,18 @@ viaTMDSIOPadSetting(ScrnInfoPtr pScrn, Bool ioPadOn)
 {
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
     CARD8 sr12, sr13, sr5a;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaTMDSIOPadSetting.\n"));
 
-    if ((pVia->Chipset == VIA_CX700)
-        || (pVia->Chipset == VIA_VX800)
-        || (pVia->Chipset == VIA_VX855)
-        || (pVia->Chipset == VIA_VX900)) {
-
-        sr5a = hwp->readSeq(hwp, 0x5A);
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "SR5A: 0x%02X\n", sr5a));
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "Setting 3C5.5A[0] to 0.\n"));
-        ViaSeqMask(hwp, 0x5A, sr5a & 0xFE, 0x01);
-    }
+    sr5a = hwp->readSeq(hwp, 0x5A);
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "SR5A: 0x%02X\n", sr5a));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Setting 3C5.5A[0] to 0.\n"));
+    ViaSeqMask(hwp, 0x5A, sr5a & 0xFE, 0x01);
 
     sr12 = hwp->readSeq(hwp, 0x12);
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -295,41 +228,73 @@ viaTMDSIOPadSetting(ScrnInfoPtr pScrn, Bool ioPadOn)
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "SR13: 0x%02X\n", sr13));
 
-    switch (pVia->Chipset) {
-    case VIA_CX700:
-    case VIA_VX800:
-    case VIA_VX855:
-    case VIA_VX900:
-        /* 3C5.13[7:6] - DVP1D15 and DVP1D14 pin strappings
-         *               00: LVDS1 + LVDS2
-         *               01: DVI + LVDS2
-         *               10: Dual LVDS (LVDS1 + LVDS2 used 
-         *                   simultaneously)
-         *               11: DVI only */
-        if ((((~(sr13 & 0x80)) && (sr13 & 0x40))
-             || ((sr13 & 0x80) && (sr13 & 0x40)))
-           || (pVia->isVIANanoBook)) {
-
-            viaLVDS1SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00);
-        }
+    /*
+     * 3C5.13[7:6] - DVP1D15 and DVP1D14 pin strappings
+     *               00: LVDS1 + LVDS2
+     *               01: DVI + LVDS2
+     *               10: Dual LVDS (LVDS1 + LVDS2 used
+     *                   simultaneously)
+     *               11: DVI only
+     */
+    if ((((~(sr13 & BIT(7))) && (sr13 & BIT(6))) ||
+        ((sr13 & BIT(7)) && (sr13 & BIT(6)))) ||
+        (pVIADisplay->isVIANanoBook)) {
+        viaLVDS1SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00);
+    }
+
+    hwp->writeSeq(hwp, 0x5A, sr5a);
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Restoring 3C5.5A[0].\n"));
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaTMDSIOPadSetting.\n"));
+}
+
+void
+viaExtTMDSIOPadState(ScrnInfoPtr pScrn, uint32_t diPort, Bool ioPadOn)
+{
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
 
+    switch(diPort) {
+    case VIA_DI_PORT_DVP0:
+        viaDVP0SetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    case VIA_DI_PORT_DVP1:
+        viaDVP1SetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    case VIA_DI_PORT_FPDPLOW:
+        viaFPDPLowSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    case VIA_DI_PORT_FPDPHIGH:
+        viaFPDPHighSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    case (VIA_DI_PORT_FPDPLOW |
+          VIA_DI_PORT_FPDPHIGH):
+        viaFPDPLowSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00);
+        viaFPDPHighSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    case VIA_DI_PORT_LVDS1:
+        viaLVDS1SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    case VIA_DI_PORT_LVDS2:
+        viaLVDS2SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00);
+        break;
+    case (VIA_DI_PORT_LVDS1 |
+          VIA_DI_PORT_LVDS2):
+        viaLVDS1SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00);
+        viaLVDS2SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00);
         break;
     default:
         break;
     }
 
-    if ((pVia->Chipset == VIA_CX700)
-        || (pVia->Chipset == VIA_VX800)
-        || (pVia->Chipset == VIA_VX855)
-        || (pVia->Chipset == VIA_VX900)) {
-
-        hwp->writeSeq(hwp, 0x5A, sr5a);
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                            "Restoring 3C5.5A[0].\n"));
-    }
+    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                "DVI I/O Pad: %s\n",
+                ioPadOn ? "On": "Off");
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaTMDSIOPadSetting.\n"));
+                        "Exiting %s.\n", __func__));
 }
 
 void
@@ -337,7 +302,8 @@ viaExtTMDSSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
 {
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    CARD8 sr12, sr13, sr5a;
+    CARD8 sr12, sr13;
+    CARD8 sr5a = 0x00;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaExtTMDSSetDisplaySource.\n"));
@@ -397,7 +363,7 @@ viaExtTMDSSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
         if ((sr12 & 0x40) && (!(sr12 & 0x20))) {
             viaDVP0SetDisplaySource(pScrn, displaySource);
         } else if ((sr13 & 0x08) && (!(sr12 & 0x10))) {
-            viaDFPLowSetDisplaySource(pScrn, displaySource);
+            viaFPDPLowSetDisplaySource(pScrn, displaySource);
         } else {
             xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                         "None of the external ports were set up for "
@@ -417,7 +383,7 @@ viaExtTMDSSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
         if ((sr12 & 0x40) && (!(sr12 & 0x20))) {
             viaDVP0SetDisplaySource(pScrn, displaySource);
         } else if (!(sr12 & 0x10)) {
-            viaDFPLowSetDisplaySource(pScrn, displaySource);
+            viaFPDPLowSetDisplaySource(pScrn, displaySource);
         } else {
             xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                         "None of the external ports were set up for "
@@ -469,7 +435,8 @@ viaExtTMDSEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState)
 
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    CARD8 sr12, sr13, sr5a;
+    CARD8 sr12, sr13;
+    CARD8 sr5a = 0x00;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaExtTMDSEnableIOPads.\n"));
@@ -501,7 +468,7 @@ viaExtTMDSEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState)
          *             1: DIP0 (Digital Interface Port 0) is used by
          *                a TV encoder */
         if (!(sr12 & 0x20)) {
-            viaDIP0EnableIOPads(pScrn, ioPadState);
+            viaDIP0SetIOPadState(pScrn, ioPadState);
         } else {
             xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                         "DIP0 was not set up for "
@@ -527,9 +494,9 @@ viaExtTMDSEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState)
          *             0: Dual 12-bit FPDP (Flat Panel Display Port)
          *             1: 24-bit FPDP (Flat Panel Display Port) */
         if ((sr12 & 0x40) && (!(sr12 & 0x20))) {
-            viaDVP0EnableIOPads(pScrn, ioPadState);
+            viaDVP0SetIOPadState(pScrn, ioPadState);
         } else if ((sr13 & 0x08) && (!(sr12 & 0x10))) {
-            viaDFPLowEnableIOPads(pScrn, ioPadState);
+            viaFPDPLowSetIOPadState(pScrn, ioPadState);
         } else {
             xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                         "None of the external ports were set up for "
@@ -547,9 +514,9 @@ viaExtTMDSEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState)
          *             0: DVP0 is used by a TMDS transmitter (DVI)
          *             1: DVP0 is used by a TV encoder */
         if ((sr12 & 0x40) && (!(sr12 & 0x20))) {
-            viaDVP0EnableIOPads(pScrn, ioPadState);
+            viaDVP0SetIOPadState(pScrn, ioPadState);
         } else if (!(sr12 & 0x10)) {
-            viaDFPLowEnableIOPads(pScrn, ioPadState);
+            viaFPDPLowSetIOPadState(pScrn, ioPadState);
         } else {
             xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                         "None of the external ports were set up for "
@@ -566,7 +533,7 @@ viaExtTMDSEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState)
          *             1: DVP1 is used as a capture port
          */
         if (!(sr13 & 0x40)) {
-            viaDVP1EnableIOPads(pScrn, ioPadState);
+            viaDVP1SetIOPadState(pScrn, ioPadState);
         } else {
             xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                         "DVP1 is not set up for TMDS "
@@ -600,7 +567,8 @@ viaExtTMDSSetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength)
 {
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    CARD8 sr12, sr13, sr5a;
+    CARD8 sr12, sr13;
+    CARD8 sr5a = 0x00;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaExtTMDSSetClockDriveStrength.\n"));
@@ -626,15 +594,6 @@ viaExtTMDSSetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength)
                         "SR13: 0x%02X\n", sr13));
     switch (pVia->Chipset) {
     case VIA_CLE266:
-        /* 3C5.12[5] - FPD18 pin strapping
-         *             0: DIP0 (Digital Interface Port 0) is used by
-         *                a TMDS transmitter (DVI)
-         *             1: DIP0 (Digital Interface Port 0) is used by
-         *                a TV encoder */
-        if (!(sr12 & 0x20)) {
-            viaDIP0SetClockDriveStrength(pScrn, clockDriveStrength);
-        }
-
         break;
     case VIA_KM400:
     case VIA_K8M800:
@@ -700,7 +659,8 @@ viaExtTMDSSetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength)
 {
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    CARD8 sr12, sr13, sr5a;
+    CARD8 sr12, sr13;
+    CARD8 sr5a = 0x00;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaExtTMDSSetDataDriveStrength.\n"));
@@ -726,15 +686,6 @@ viaExtTMDSSetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength)
                         "SR13: 0x%02X\n", sr13));
     switch (pVia->Chipset) {
     case VIA_CLE266:
-        /* 3C5.12[5] - FPD18 pin strapping
-         *             0: DIP0 (Digital Interface Port 0) is used by
-         *                a TMDS transmitter (DVI)
-         *             1: DIP0 (Digital Interface Port 0) is used by
-         *                a TV encoder */
-        if (!(sr12 & 0x20)) {
-            viaDIP0SetDataDriveStrength(pScrn, dataDriveStrength);
-        }
-
         break;
     case VIA_KM400:
     case VIA_K8M800:
@@ -932,15 +883,14 @@ via_tmds_mode_set(xf86OutputPtr output, DisplayModePtr mode,
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered via_tmds_mode_set.\n"));
 
-    /* Initialize VIA IGP integrated TMDS transmitter registers. */
-    viaTMDSInitRegisters(pScrn);
+    if (output->crtc) {
+        /* Initialize VIA IGP integrated TMDS transmitter registers. */
+        viaTMDSInitReg(pScrn);
 
-    /* Set integrated TMDS transmitter synchronization polarity for
-     * both horizontal synchronization and vertical synchronization. */
-    viaTMDSSetSyncPolarity(pScrn, adjusted_mode);
+        /* Set integrated TMDS transmitter sync polarity. */
+        viaTMDSSyncPolarity(pScrn, adjusted_mode->Flags);
 
-    if (output->crtc) {
-        viaTMDSSetSource(pScrn, iga->index ? 0x01 : 0x00);
+        viaTMDSDisplaySource(pScrn, iga->index);
     }
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -950,43 +900,32 @@ via_tmds_mode_set(xf86OutputPtr output, DisplayModePtr mode,
 static xf86OutputStatus
 via_tmds_detect(xf86OutputPtr output)
 {
-    xf86MonPtr mon;
-    xf86OutputStatus status = XF86OutputStatusDisconnected;
     ScrnInfoPtr pScrn = output->scrn;
+    xf86MonPtr pMon;
+    xf86OutputStatus status = XF86OutputStatusDisconnected;
+    I2CBusPtr pI2CBus;
     VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    VIATMDSPtr pVIATMDS = (VIATMDSPtr) output->driver_private;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered via_tmds_detect.\n"));
 
-    /* Check for DVI presence by sensing the TMDS receiver connected
-     * to the integrated TMDS transmitter. */
-    if (viaTMDSSense(pScrn)) {
-
-        if (!pVia->pI2CBus2) {
-            goto exit;
-        }
-
-        /* Assume that only I2C bus 2 is used for the DVI connected to the
-         * integrated TMDS transmitter. */
-        if (!xf86I2CProbeAddress(pVia->pI2CBus2, 0xA0)) {
-            xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                        "I2C device on I2C Bus 2 does not support EDID.\n");
-            goto exit;
-        }
-
-        xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                    "Obtaining EDID for DVI.\n");
-
-        /* Since DVI presence was established, access the I2C bus,
-         * in order to obtain EDID from the monitor. */
-        mon = xf86OutputGetEDID(output, pVia->pI2CBus2);
+    if (pVIATMDS->i2cBus & VIA_I2C_BUS2) {
+        pI2CBus = pVIADisplay->pI2CBus2;
+    } else if (pVIATMDS->i2cBus & VIA_I2C_BUS3) {
+        pI2CBus = pVIADisplay->pI2CBus3;
+    } else {
+        pI2CBus = NULL;
+    }
 
-        /* Is the interface type digital? */
-        if (mon && DIGITAL(mon->features.input_type)) {
+    if (pI2CBus) {
+        pMon = xf86OutputGetEDID(output, pI2CBus);
+        if (pMon && DIGITAL(pMon->features.input_type)) {
             status = XF86OutputStatusConnected;
+            xf86OutputSetEDID(output, pMon);
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                         "Detected a monitor connected to DVI.\n");
-            xf86OutputSetEDID(output, mon);
         } else {
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                         "Could not obtain EDID from a monitor "
@@ -994,7 +933,6 @@ via_tmds_detect(xf86OutputPtr output)
         }
     }
 
-exit:
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting via_tmds_detect.\n"));
     return status;
@@ -1073,166 +1011,279 @@ static const xf86OutputFuncsRec via_tmds_funcs = {
     .destroy            = via_tmds_destroy,
 };
 
-
-Bool
-viaTMDSInit(ScrnInfoPtr pScrn)
+void
+viaTMDSProbe(ScrnInfoPtr pScrn)
 {
-    xf86OutputPtr output;
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    VIATMDSRecPtr pVIATMDSRec = NULL;
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
     CARD8 sr13, sr5a;
-    Bool status = FALSE;
-    char outputNameBuffer[32];
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaTMDSInit.\n"));
+                        "Entered viaTMDSProbe.\n"));
 
-    sr5a = hwp->readSeq(hwp, 0x5A);
-    ViaSeqMask(hwp, 0x5A, sr5a | 0x01, 0x01);
+    /* Detect the presence of integrated TMDS transmitter. */
+    switch (pVia->Chipset) {
+    case VIA_CX700:
+    case VIA_VX800:
+        sr5a = hwp->readSeq(hwp, 0x5A);
+
+        /* Setting SR5A[0] to 1.
+         * This allows the reading out the alternative
+         * pin strapping information from SR12 and SR13. */
+        ViaSeqMask(hwp, 0x5A, BIT(0), BIT(0));
+
+        sr13 = hwp->readSeq(hwp, 0x13);
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                            "SR13: 0x%02X\n", sr13));
+
+        /* 3C5.13[7:6] - Integrated LVDS / DVI Mode Select
+         *               (DVP1D15-14 pin strapping)
+         *               00: LVDS1 + LVDS2
+         *               01: DVI + LVDS2
+         *               10: Dual LVDS Channel (High Resolution Panel)
+         *               11: One DVI only (decrease the clock jitter) */
+        /* Check for DVI presence using pin strappings.
+         * VIA Technologies NanoBook reference design based products
+         * have their pin strappings set to a wrong setting to communicate
+         * the presence of DVI, so it requires special handling here. */
+        if (pVIADisplay->isVIANanoBook) {
+                    pVIADisplay->intTMDSPresence = TRUE;
+                    pVIADisplay->intTMDSDIPort = VIA_DI_PORT_TMDS;
+                    pVIADisplay->intTMDSI2CBus = VIA_I2C_BUS2;
+                    pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2;
+                    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                                "Integrated TMDS (DVI) transmitter detected.\n");
+        } else if (((!(sr13 & BIT(7))) && (sr13 & BIT(6)))
+                    || ((sr13 & BIT(7)) && (sr13 & BIT(6)))) {
+            pVIADisplay->intTMDSPresence = TRUE;
+            pVIADisplay->intTMDSDIPort = VIA_DI_PORT_TMDS;
+            pVIADisplay->intTMDSI2CBus = VIA_I2C_BUS2;
+            pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2;
+            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Integrated TMDS (DVI) transmitter detected via pin strapping.\n");
+        } else {
+            pVIADisplay->intTMDSPresence = FALSE;
+            pVIADisplay->intTMDSDIPort = VIA_DI_PORT_NONE;
+            pVIADisplay->intTMDSI2CBus = VIA_I2C_NONE;
+        }
+
+        hwp->writeSeq(hwp, 0x5A, sr5a);
+        break;
+    default:
+        pVIADisplay->intTMDSPresence = FALSE;
+        pVIADisplay->intTMDSDIPort = VIA_DI_PORT_NONE;
+        pVIADisplay->intTMDSI2CBus = VIA_I2C_NONE;
+        break;
+    }
+
+     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaTMDSProbe.\n"));
+}
+
+/*
+ * Probe (pre-initialization detection) of external TMDS transmitters.
+ */
+void
+viaExtTMDSProbe(ScrnInfoPtr pScrn)
+{
+    vgaHWPtr hwp = VGAHWPTR(pScrn);
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    CARD8 sr12, sr13;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaExtTMDSProbe.\n"));
+
+    pVIADisplay->extTMDSPresence = FALSE;
+    pVIADisplay->extTMDSI2CBus = VIA_I2C_NONE;
+    pVIADisplay->extTMDSTransmitter = VIA_TMDS_NONE;
+
+    if ((!(pVIADisplay->extTMDSPresence)) &&
+        ((pVIADisplay->pI2CBus2) &&
+        (~(pVIADisplay->mappedI2CBus & VIA_I2C_BUS2)))) {
+        if (viaVT1632Probe(pScrn, pVIADisplay->pI2CBus2)) {
+            pVIADisplay->extTMDSPresence = TRUE;
+            pVIADisplay->extTMDSI2CBus = VIA_I2C_BUS2;
+            pVIADisplay->extTMDSTransmitter = VIA_TMDS_VT1632;
+            pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2;
+        } else if (viaSiI164Probe(pScrn, pVIADisplay->pI2CBus2)) {
+            pVIADisplay->extTMDSPresence = TRUE;
+            pVIADisplay->extTMDSI2CBus = VIA_I2C_BUS2;
+            pVIADisplay->extTMDSTransmitter = VIA_TMDS_SII164;
+            pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2;
+        }
+    }
+
+    if ((!(pVIADisplay->extTMDSPresence)) &&
+        ((pVIADisplay->pI2CBus3) &&
+            (~(pVIADisplay->mappedI2CBus & VIA_I2C_BUS3)))) {
+        if (viaVT1632Probe(pScrn, pVIADisplay->pI2CBus3)) {
+            pVIADisplay->extTMDSPresence = TRUE;
+            pVIADisplay->extTMDSI2CBus = VIA_I2C_BUS3;
+            pVIADisplay->extTMDSTransmitter = VIA_TMDS_VT1632;
+            pVIADisplay->mappedI2CBus |= VIA_I2C_BUS3;
+        } else if (viaSiI164Probe(pScrn, pVIADisplay->pI2CBus3)) {
+            pVIADisplay->extTMDSPresence = TRUE;
+            pVIADisplay->extTMDSI2CBus = VIA_I2C_BUS3;
+            pVIADisplay->extTMDSTransmitter = VIA_TMDS_SII164;
+            pVIADisplay->mappedI2CBus |= VIA_I2C_BUS3;
+        }
+    }
+
+    sr12 = hwp->readSeq(hwp, 0x12);
     sr13 = hwp->readSeq(hwp, 0x13);
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "SR12: 0x%02X\n", sr12));
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "SR13: 0x%02X\n", sr13));
-    hwp->writeSeq(hwp, 0x5A, sr5a);
+    if (pVIADisplay->extTMDSPresence) {
+        switch (pVia->Chipset) {
+        case VIA_CLE266:
+
+            /* 3C5.12[4] - FPD17 pin strapping
+             *             0: TMDS transmitter (DVI) / capture device
+             *             1: Flat panel */
+            if (!(sr12 & BIT(4))) {
+                pVIADisplay->extTMDSDIPort = VIA_DI_PORT_DIP0;
+
+            /* 3C5.12[5] - FPD18 pin strapping
+             *             0: TMDS transmitter (DVI)
+             *             1: TV encoder */
+            } else if (!(sr12 & BIT(5))) {
+                pVIADisplay->extTMDSDIPort = VIA_DI_PORT_DIP1;
+            } else {
+                pVIADisplay->extTMDSDIPort = VIA_DI_PORT_NONE;
+            }
+
+            break;
+        case VIA_KM400:
+        case VIA_P4M800PRO:
+        case VIA_PM800:
+        case VIA_K8M800:
+            /* 3C5.12[6] - DVP0D6 pin strapping
+             *             0: Disable DVP0 (Digital Video Port 0) for
+             *                DVI or TV out use
+             *             1: Enable DVP0 (Digital Video Port 0) for
+             *                DVI or TV out use
+             * 3C5.12[5] - DVP0D5 pin strapping
+             *             0: TMDS transmitter (DVI)
+             *             1: TV encoder */
+            if ((sr12 & BIT(6)) && (!(sr12 & BIT(5)))) {
+                pVIADisplay->extTMDSDIPort = VIA_DI_PORT_DVP0;
+            } else {
+                pVIADisplay->extTMDSDIPort = VIA_DI_PORT_DVP1;
+            }
+
+            break;
+        case VIA_P4M890:
+        case VIA_K8M890:
+        case VIA_P4M900:
+            /* Assume DVP2 as DVP0. Hence, VIA_DI_PORT_DVP0
+             * is used. */
+            /* 3C5.12[6] - DVP2D6 pin strapping
+             *             0: Disable DVP2 (Digital Video Port 2)
+             *             1: Enable DVP2 (Digital Video Port 2)
+             * 3C5.12[5] - DVP2D5 pin strapping
+             *             0: TMDS transmitter (DVI)
+             *             1: TV encoder */
+            if ((sr12 & BIT(6)) && (!(sr12 & BIT(5)))) {
+                pVIADisplay->extTMDSDIPort = VIA_DI_PORT_DVP0;
+            } else {
+                pVIADisplay->extTMDSDIPort = VIA_DI_PORT_NONE;
+            }
+
+            break;
+        case VIA_CX700:
+        case VIA_VX800:
+        case VIA_VX855:
+        case VIA_VX900:
+            pVIADisplay->extTMDSDIPort = VIA_DI_PORT_DVP1;
+            break;
+        default:
+            pVIADisplay->extTMDSDIPort = VIA_DI_PORT_NONE;
+            break;
+        }
+    }
 
-    /* 3C5.13[7:6] - Integrated LVDS / DVI Mode Select
-     *               (DVP1D15-14 pin strapping)
-     *               00: LVDS1 + LVDS2
-     *               01: DVI + LVDS2
-     *               10: Dual LVDS Channel (High Resolution Panel)
-     *               11: One DVI only (decrease the clock jitter) */
-    /* Check for DVI presence using pin strappings.
-     * VIA Technologies NanoBook reference design based products
-     * have their pin strappings set to a wrong setting to communicate
-     * the presence of DVI, so it requires special handling here. */
-    if ((((~(sr13 & 0x80)) && (sr13 & 0x40))
-         || ((sr13 & 0x80) && (sr13 & 0x40)))
-       || (pVia->isVIANanoBook)) {
-
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                    "Integrated TMDS transmitter found via pin strapping.\n");
-    } else {
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                    "Integrated TMDS transmitter not found.\n");
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaExtTMDSProbe.\n"));
+}
+
+void
+viaTMDSInit(ScrnInfoPtr pScrn)
+{
+    xf86OutputPtr output;
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    VIATMDSPtr pVIATMDS;
+    char outputNameBuffer[32];
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaTMDSInit.\n"));
+
+    if (!pVIADisplay->intTMDSPresence) {
         goto exit;
     }
 
-    pVIATMDSRec = xnfcalloc(1, sizeof(VIATMDSRec));
-    if (!pVIATMDSRec) {
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "Failed to allocate working storage for integrated "
-                    "TMDS transmitter.\n");
+    pVIATMDS = (VIATMDSPtr) xnfcalloc(1, sizeof(VIATMDSRec));
+    if (!pVIATMDS) {
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                            "Failed to allocate storage for "
+                            "integrated TMDS (DVI) transmitter.\n"));
         goto exit;
     }
 
-    /* The code to dynamically designate the particular DVI (i.e., DVI-1,
+    /* The code to dynamically designate a particular DVI (i.e., DVI-1,
      * DVI-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */
-    sprintf(outputNameBuffer, "DVI-%d", (pVia->numberDVI + 1));
+    sprintf(outputNameBuffer, "DVI-%d", (pVIADisplay->numberDVI + 1));
     output = xf86OutputCreate(pScrn, &via_tmds_funcs, outputNameBuffer);
     if (!output) {
-        free(pVIATMDSRec);
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "Failed to allocate X Server display output record for "
-                    "integrated TMDS transmitter.\n");
+        free(pVIATMDS);
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                            "Failed to create X Server display output "
+                            "for integrated TMDS (DVI) "
+                            "transmitter.\n"));
         goto exit;
     }
 
-    output->driver_private = pVIATMDSRec;
+    /* Increment the number of DVI connectors. */
+    pVIADisplay->numberDVI++;
+
+    /* Leaving a hint for mode setting and DPMS to know which port
+     * to access. For CX700 / VX700 and VX800 chipsets' integrated TMDS
+     * transmitter, it is fixed to LVDS1 (TMDS uses LVDS1 pins). */
+    pVIATMDS->diPort = pVIADisplay->intTMDSDIPort;
+
+    /* Hint about which I2C bus to access for obtaining EDID. */
+    pVIATMDS->i2cBus = pVIADisplay->intTMDSI2CBus;
+
+    output->driver_private = pVIATMDS;
 
     /* Since there are two (2) display controllers registered with the
      * X.Org Server and both IGA1 and IGA2 can handle DVI without any
      * limitations, possible_crtcs should be set to 0x3 (0b11) so that
      * either display controller can get assigned to handle DVI. */
-    output->possible_crtcs = (1 << 1) | (1 << 0);
+    output->possible_crtcs = BIT(1) | BIT(0);
 
     output->possible_clones = 0;
     output->interlaceAllowed = FALSE;
     output->doubleScanAllowed = FALSE;
 
-    pVia->numberDVI++;
-    status = TRUE;
 exit:
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting viaTMDSInit.\n"));
-    return status;
 }
 
 void
-via_dvi_init(ScrnInfoPtr pScrn)
+viaExtTMDSInit(ScrnInfoPtr pScrn)
 {
-    VIAPtr pVia = VIAPTR(pScrn);
-
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered via_dvi_init.\n"));
-
-    if (!pVia->pI2CBus2 || !pVia->pI2CBus3) {
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "I2C Bus 2 or I2C Bus 3 does not exist.\n");
-        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                    "Exiting via_dvi_init.\n"));
-        return;
-    }
-
-    /* Check to see if we are dealing with the latest VIA chipsets. */
-    if ((pVia->Chipset == VIA_CX700)
-        || (pVia->Chipset == VIA_VX800)
-        || (pVia->Chipset == VIA_VX855)
-        || (pVia->Chipset == VIA_VX900)) {
-
-        if (!viaTMDSInit(pScrn)) {
-            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Integrated TMDS transmitter for DVI not found.\n");
-        } else {
-            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Integrated TMDS transmitter for DVI was "
-                        "initialized successfully.\n");
-        }
-    }
+                        "Entered viaExtTMDSInit.\n"));
 
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "Probing I2C Bus 2 for VT1632.\n");
-    if (!viaVT1632Init(pScrn, pVia->pI2CBus2)) {
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                    "I2C Bus 2 was not initialized for DVI use.\n");
-    } else {
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                    "VT1632 attached to I2C Bus 2 was initialized "
-                    "successfully for DVI use.\n");
-    }
-
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "Probing I2C Bus 3 for VT1632.\n");
-    if (!viaVT1632Init(pScrn, pVia->pI2CBus3)) {
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                    "I2C Bus 3 was not initialized for DVI use.\n");
-    } else {
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                    "VT1632 attached to I2C Bus 3 was initialized "
-                    "successfully for DVI use.\n");
-    }
-
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "Probing I2C Bus 2 for SiI 164.\n");
-    if (!viaSiI164Init(pScrn, pVia->pI2CBus2)) {
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                    "I2C Bus 2 was not initialized for DVI use.\n");
-    } else {
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                    "SiI 164 attached to I2C Bus 2 was initialized "
-                    "successfully for DVI use.\n");
-    }
-
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                "Probing I2C Bus 3 for SiI 164.\n");
-    if (!viaSiI164Init(pScrn, pVia->pI2CBus3)) {
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                    "I2C Bus 3 was not initialized for DVI use.\n");
-    } else {
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                    "SiI 164 attached to I2C Bus 3 was initialized "
-                    "successfully for DVI use.\n");
-    }
+    viaVT1632Init(pScrn);
+    viaSiI164Init(pScrn);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting via_dvi_init.\n"));
+                        "Exiting viaExtTMDSInit.\n"));
 }
diff --git a/src/via_tv.c b/src/via_tv.c
index 2492a65..d70b810 100644
--- a/src/via_tv.c
+++ b/src/via_tv.c
@@ -46,7 +46,8 @@ viaTVSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
 
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    CARD8 sr12, sr13, sr5a;
+    CARD8 sr12, sr13;
+    CARD8 sr5a = 0x00;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaTVSetDisplaySource.\n"));
@@ -106,7 +107,7 @@ viaTVSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
         if ((sr12 & 0x40) && (sr12 & 0x20)) {
             viaDVP0SetDisplaySource(pScrn, displaySource);
         } else if ((sr13 & 0x08) && (!(sr12 & 0x10))) {
-            viaDFPLowSetDisplaySource(pScrn, displaySource);
+            viaFPDPLowSetDisplaySource(pScrn, displaySource);
         } else if (sr13 & 0x08) {
             viaDVP1SetDisplaySource(pScrn, displaySource);
         } else {
@@ -180,7 +181,8 @@ viaTVEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState)
 {
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    CARD8 sr12, sr13, sr5a;
+    CARD8 sr12, sr13;
+    CARD8 sr5a = 0x00;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaTVEnableIOPads.\n"));
@@ -212,7 +214,7 @@ viaTVEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState)
          *             1: DIP0 (Digital Interface Port 0) is used by
          *                a TV encoder */
         if (sr12 & 0x20) {
-            viaDIP0EnableIOPads(pScrn, ioPadState);
+            viaDIP0SetIOPadState(pScrn, ioPadState);
         } else {
             xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                         "DIP0 is not set up for "
@@ -238,11 +240,11 @@ viaTVEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState)
          *             0: Dual 12-bit FPDP (Flat Panel Display Port)
          *             1: 24-bit FPDP (Flat Panel Display Port) */
         if ((sr12 & 0x40) && (sr12 & 0x20)) {
-            viaDVP0EnableIOPads(pScrn, ioPadState);
+            viaDVP0SetIOPadState(pScrn, ioPadState);
         } else if ((sr13 & 0x08) && (!(sr12 & 0x10))) {
-            viaDFPLowEnableIOPads(pScrn, ioPadState);
+            viaFPDPLowSetIOPadState(pScrn, ioPadState);
         } else if (sr13 & 0x08) {
-            viaDVP1EnableIOPads(pScrn, ioPadState);
+            viaDVP1SetIOPadState(pScrn, ioPadState);
         } else {
             xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                         "None of the external ports were set up for "
@@ -263,7 +265,7 @@ viaTVEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState)
          *             0: Dual 12-bit FPDP (Flat Panel Display Port)
          *             1: 24-bit FPDP (Flat Panel Display Port) */
         if ((sr12 & 0x40) && (sr12 & 0x20) && (!(sr12 & 0x10))) {
-            viaDVP0EnableIOPads(pScrn, ioPadState);
+            viaDVP0SetIOPadState(pScrn, ioPadState);
         } else {
             xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                         "Unrecognized external TV encoder use.\n"
@@ -280,7 +282,7 @@ viaTVEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState)
          *             1: DVP1 is used as a capture port
          */
         if (!(sr13 & 0x40)) {
-            viaDVP1EnableIOPads(pScrn, ioPadState);
+            viaDVP1SetIOPadState(pScrn, ioPadState);
         } else {
             xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                         "DVP1 is not set up for external TV "
@@ -314,7 +316,8 @@ viaTVSetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength)
 {
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    CARD8 sr12, sr13, sr5a;
+    CARD8 sr12, sr13;
+    CARD8 sr5a = 0x00;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaTVSetClockDriveStrength.\n"));
@@ -340,15 +343,6 @@ viaTVSetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength)
                         "SR13: 0x%02X\n", sr13));
     switch (pVia->Chipset) {
     case VIA_CLE266:
-        /* 3C5.12[5] - FPD18 pin strapping
-         *             0: DIP0 (Digital Interface Port 0) is used by
-         *                a TMDS transmitter (DVI)
-         *             1: DIP0 (Digital Interface Port 0) is used by
-         *                a TV encoder */
-        if (sr12 & 0x20) {
-            viaDIP0SetClockDriveStrength(pScrn, clockDriveStrength);
-        }
-
         break;
     case VIA_KM400:
     case VIA_K8M800:
@@ -427,7 +421,8 @@ viaTVSetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength)
 {
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-    CARD8 sr12, sr13, sr5a;
+    CARD8 sr12, sr13;
+    CARD8 sr5a = 0x00;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaTVSetDataDriveStrength.\n"));
@@ -453,15 +448,6 @@ viaTVSetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength)
                         "SR13: 0x%02X\n", sr13));
     switch (pVia->Chipset) {
     case VIA_CLE266:
-        /* 3C5.12[5] - FPD18 pin strapping
-         *             0: DIP0 (Digital Interface Port 0) is used by
-         *                a TMDS transmitter (DVI)
-         *             1: DIP0 (Digital Interface Port 0) is used by
-         *                a TV encoder */
-        if (sr12 & 0x20) {
-            viaDIP0SetDataDriveStrength(pScrn, dataDriveStrength);
-        }
-
         break;
     case VIA_KM400:
     case VIA_K8M800:
@@ -538,28 +524,28 @@ viaTVSetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength)
 static void
 ViaTVSave(ScrnInfoPtr pScrn)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
-    if (pBIOSInfo->TVSave)
-        pBIOSInfo->TVSave(pScrn);
+    if (pVIADisplay->TVSave)
+        pVIADisplay->TVSave(pScrn);
 }
 
 static void
 ViaTVRestore(ScrnInfoPtr pScrn)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
-    if (pBIOSInfo->TVRestore)
-        pBIOSInfo->TVRestore(pScrn);
+    if (pVIADisplay->TVRestore)
+        pVIADisplay->TVRestore(pScrn);
 }
 
 static Bool
 ViaTVDACSense(ScrnInfoPtr pScrn)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
-    if (pBIOSInfo->TVDACSense)
-        return pBIOSInfo->TVDACSense(pScrn);
+    if (pVIADisplay->TVDACSense)
+        return pVIADisplay->TVDACSense(pScrn);
     return FALSE;
 }
 
@@ -568,23 +554,23 @@ ViaTVSetMode(xf86CrtcPtr crtc, DisplayModePtr mode)
 {
     ScrnInfoPtr pScrn = crtc->scrn;
     VIAPtr pVia = VIAPTR(pScrn);
-    VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
 
-    if (pBIOSInfo->TVModeI2C)
-        pBIOSInfo->TVModeI2C(pScrn, mode);
+    if (pVIADisplay->TVModeI2C)
+        pVIADisplay->TVModeI2C(pScrn, mode);
 
-    if (pBIOSInfo->TVModeCrtc)
-        pBIOSInfo->TVModeCrtc(crtc, mode);
+    if (pVIADisplay->TVModeCrtc)
+        pVIADisplay->TVModeCrtc(crtc, mode);
 
     /* TV reset. */
-    xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1D, 0x00);
-    xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1D, 0x80);
+    xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1D, 0x00);
+    xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1D, 0x80);
 }
 
 static void
 ViaTVPower(ScrnInfoPtr pScrn, Bool On)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
 #ifdef HAVE_DEBUG
     if (On)
@@ -593,18 +579,18 @@ ViaTVPower(ScrnInfoPtr pScrn, Bool On)
         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaTVPower: Off.\n");
 #endif
 
-    if (pBIOSInfo->TVPower)
-        pBIOSInfo->TVPower(pScrn, On);
+    if (pVIADisplay->TVPower)
+        pVIADisplay->TVPower(pScrn, On);
 }
 
 #ifdef HAVE_DEBUG
 void
 ViaTVPrintRegs(ScrnInfoPtr pScrn)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
-    if (pBIOSInfo->TVPrintRegs)
-        pBIOSInfo->TVPrintRegs(pScrn);
+    if (pVIADisplay->TVPrintRegs)
+        pVIADisplay->TVPrintRegs(pScrn);
 }
 #endif /* HAVE_DEBUG */
 
@@ -736,8 +722,8 @@ via_tv_get_modes(xf86OutputPtr output)
     VIAPtr pVia = VIAPTR(pScrn);
     int i;
 
-    for (i = 0; i < pVia->pBIOSInfo->TVNumModes; i++) {
-        mode = xf86DuplicateMode(&pVia->pBIOSInfo->TVModes[i]);
+    for (i = 0; i < pVia->pVIADisplay->TVNumModes; i++) {
+        mode = xf86DuplicateMode(&pVia->pVIADisplay->TVModes[i]);
         modes = xf86ModesAdd(modes, mode);
     }
     return modes;
@@ -776,43 +762,43 @@ Bool
 via_tv_init(ScrnInfoPtr pScrn)
 {
     VIAPtr pVia = VIAPTR(pScrn);
-    VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
     xf86OutputPtr output = NULL;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered via_tv_init.\n"));
 
-    /* preset some pBIOSInfo TV related values -- move up */
-    pBIOSInfo->TVEncoder = VIA_NONETV;
-    pBIOSInfo->TVI2CDev = NULL;
-    pBIOSInfo->TVSave = NULL;
-    pBIOSInfo->TVRestore = NULL;
-    pBIOSInfo->TVDACSense = NULL;
-    pBIOSInfo->TVModeValid = NULL;
-    pBIOSInfo->TVModeI2C = NULL;
-    pBIOSInfo->TVModeCrtc = NULL;
-    pBIOSInfo->TVPower = NULL;
-    pBIOSInfo->TVModes = NULL;
-    pBIOSInfo->TVPrintRegs = NULL;
-    pBIOSInfo->LCDPower = NULL;
-    pBIOSInfo->TVNumRegs = 0;
+    /* preset some pVIADisplay TV related values -- move up */
+    pVIADisplay->TVEncoder = VIA_NONETV;
+    pVIADisplay->TVI2CDev = NULL;
+    pVIADisplay->TVSave = NULL;
+    pVIADisplay->TVRestore = NULL;
+    pVIADisplay->TVDACSense = NULL;
+    pVIADisplay->TVModeValid = NULL;
+    pVIADisplay->TVModeI2C = NULL;
+    pVIADisplay->TVModeCrtc = NULL;
+    pVIADisplay->TVPower = NULL;
+    pVIADisplay->TVModes = NULL;
+    pVIADisplay->TVPrintRegs = NULL;
+    pVIADisplay->LCDPower = NULL;
+    pVIADisplay->TVNumRegs = 0;
 
     /*
      * On an SK43G (KM400/Ch7011), false positive detections at a VT162x
      * chip were observed, so try to detect the Ch7011 first.
      */
-    if (pVia->pI2CBus2 && xf86I2CProbeAddress(pVia->pI2CBus2, 0xEC))
-        pBIOSInfo->TVI2CDev = ViaCH7xxxDetect(pScrn, pVia->pI2CBus2, 0xEC);
-    else if (pVia->pI2CBus2 && xf86I2CProbeAddress(pVia->pI2CBus2, 0x40))
-        pBIOSInfo->TVI2CDev = ViaVT162xDetect(pScrn, pVia->pI2CBus2, 0x40);
-    else if (pVia->pI2CBus3 && xf86I2CProbeAddress(pVia->pI2CBus3, 0x40))
-        pBIOSInfo->TVI2CDev = ViaVT162xDetect(pScrn, pVia->pI2CBus3, 0x40);
-    else if (pVia->pI2CBus2 && xf86I2CProbeAddress(pVia->pI2CBus2, 0xEA))
-        pBIOSInfo->TVI2CDev = ViaCH7xxxDetect(pScrn, pVia->pI2CBus2, 0xEA);
-    else if (pVia->pI2CBus3 && xf86I2CProbeAddress(pVia->pI2CBus3, 0xEA))
-        pBIOSInfo->TVI2CDev = ViaCH7xxxDetect(pScrn, pVia->pI2CBus3, 0xEA);
-
-    if (!pBIOSInfo->TVI2CDev) {
+    if (pVIADisplay->pI2CBus2 && xf86I2CProbeAddress(pVIADisplay->pI2CBus2, 0xEC))
+        pVIADisplay->TVI2CDev = ViaCH7xxxDetect(pScrn, pVIADisplay->pI2CBus2, 0xEC);
+    else if (pVIADisplay->pI2CBus2 && xf86I2CProbeAddress(pVIADisplay->pI2CBus2, 0x40))
+        pVIADisplay->TVI2CDev = ViaVT162xDetect(pScrn, pVIADisplay->pI2CBus2, 0x40);
+    else if (pVIADisplay->pI2CBus3 && xf86I2CProbeAddress(pVIADisplay->pI2CBus3, 0x40))
+        pVIADisplay->TVI2CDev = ViaVT162xDetect(pScrn, pVIADisplay->pI2CBus3, 0x40);
+    else if (pVIADisplay->pI2CBus2 && xf86I2CProbeAddress(pVIADisplay->pI2CBus2, 0xEA))
+        pVIADisplay->TVI2CDev = ViaCH7xxxDetect(pScrn, pVIADisplay->pI2CBus2, 0xEA);
+    else if (pVIADisplay->pI2CBus3 && xf86I2CProbeAddress(pVIADisplay->pI2CBus3, 0xEA))
+        pVIADisplay->TVI2CDev = ViaCH7xxxDetect(pScrn, pVIADisplay->pI2CBus3, 0xEA);
+
+    if (!pVIADisplay->TVI2CDev) {
         xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                     "Did not detect a TV encoder.\n");
         DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -821,7 +807,7 @@ via_tv_init(ScrnInfoPtr pScrn)
         return FALSE;
     }
 
-    switch (pBIOSInfo->TVEncoder) {
+    switch (pVIADisplay->TVEncoder) {
         case VIA_VT1621:
         case VIA_VT1622:
         case VIA_VT1623:
@@ -842,28 +828,28 @@ via_tv_init(ScrnInfoPtr pScrn)
             break;
     }
 
-    if (!pBIOSInfo->TVSave || !pBIOSInfo->TVRestore
-        || !pBIOSInfo->TVDACSense || !pBIOSInfo->TVModeValid
-        || !pBIOSInfo->TVModeI2C || !pBIOSInfo->TVModeCrtc
-        || !pBIOSInfo->TVPower || !pBIOSInfo->TVModes
-        || !pBIOSInfo->TVPrintRegs) {
-
-        xf86DestroyI2CDevRec(pBIOSInfo->TVI2CDev, TRUE);
-
-        pBIOSInfo->TVI2CDev = NULL;
-        pBIOSInfo->TVOutput = TVOUTPUT_NONE;
-        pBIOSInfo->TVEncoder = VIA_NONETV;
-        pBIOSInfo->TVI2CDev = NULL;
-        pBIOSInfo->TVSave = NULL;
-        pBIOSInfo->TVRestore = NULL;
-        pBIOSInfo->TVDACSense = NULL;
-        pBIOSInfo->TVModeValid = NULL;
-        pBIOSInfo->TVModeI2C = NULL;
-        pBIOSInfo->TVModeCrtc = NULL;
-        pBIOSInfo->TVPower = NULL;
-        pBIOSInfo->TVModes = NULL;
-        pBIOSInfo->TVPrintRegs = NULL;
-        pBIOSInfo->TVNumRegs = 0;
+    if (!pVIADisplay->TVSave || !pVIADisplay->TVRestore
+        || !pVIADisplay->TVDACSense || !pVIADisplay->TVModeValid
+        || !pVIADisplay->TVModeI2C || !pVIADisplay->TVModeCrtc
+        || !pVIADisplay->TVPower || !pVIADisplay->TVModes
+        || !pVIADisplay->TVPrintRegs) {
+
+        xf86DestroyI2CDevRec(pVIADisplay->TVI2CDev, TRUE);
+
+        pVIADisplay->TVI2CDev = NULL;
+        pVIADisplay->TVOutput = TVOUTPUT_NONE;
+        pVIADisplay->TVEncoder = VIA_NONETV;
+        pVIADisplay->TVI2CDev = NULL;
+        pVIADisplay->TVSave = NULL;
+        pVIADisplay->TVRestore = NULL;
+        pVIADisplay->TVDACSense = NULL;
+        pVIADisplay->TVModeValid = NULL;
+        pVIADisplay->TVModeI2C = NULL;
+        pVIADisplay->TVModeCrtc = NULL;
+        pVIADisplay->TVPower = NULL;
+        pVIADisplay->TVModes = NULL;
+        pVIADisplay->TVPrintRegs = NULL;
+        pVIADisplay->TVNumRegs = 0;
 
         xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                    "TV encoder was not properly initialized.\n");
@@ -883,13 +869,13 @@ via_tv_init(ScrnInfoPtr pScrn)
                    "Failed to register TV-1.\n");
     }
 
-    pBIOSInfo->tv = output;
+    pVIADisplay->tv = output;
     /* Save now */
-    pBIOSInfo->TVSave(pScrn);
+    pVIADisplay->TVSave(pScrn);
 
 #ifdef HAVE_DEBUG
     if (VIAPTR(pScrn)->PrintTVRegs)
-        pBIOSInfo->TVPrintRegs(pScrn);
+        pVIADisplay->TVPrintRegs(pScrn);
 #endif
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
diff --git a/src/via_ums.c b/src/via_ums.c
index 7933e0b..309d1c3 100644
--- a/src/via_ums.c
+++ b/src/via_ums.c
@@ -108,7 +108,7 @@ viaMapMMIO(ScrnInfoPtr pScrn)
 #endif
 
     xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                "Mapping MMIO at address 0x%lX with "
+                "Mapping MMIO at address 0x%lx with "
                 "size %u KB.\n",
                 pVia->MmioBase, VIA_MMIO_REGSIZE / 1024);
 
@@ -137,7 +137,7 @@ viaMapMMIO(ScrnInfoPtr pScrn)
 #endif
 
     xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-               "Mapping 2D Host BitBLT space at address 0x%lX with "
+               "Mapping 2D Host BitBLT space at address 0x%lx with "
                "size %u KB.\n",
                pVia->MmioBase + VIA_MMIO_BLTBASE, VIA_MMIO_BLTSIZE / 1024);
 
@@ -166,100 +166,6 @@ viaMapMMIO(ScrnInfoPtr pScrn)
     }
 #endif
 
-    if (!(pVia->videoRambytes)) {
-        goto fail;
-    }
-
-#ifdef HAVE_PCIACCESS
-    if (pVia->Chipset == VIA_VX900) {
-        pVia->FrameBufferBase = pVia->PciInfo->regions[2].base_addr;
-    } else {
-        pVia->FrameBufferBase = pVia->PciInfo->regions[0].base_addr;
-    }
-#else
-    if (pVia->Chipset == VIA_VX900) {
-        pVia->FrameBufferBase = pVia->PciInfo->memBase[2];
-    } else {
-        pVia->FrameBufferBase = pVia->PciInfo->memBase[0];
-    }
-#endif
-
-    xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-               "Mapping the frame buffer at address 0x%lX with "
-               "size %lu KB.\n",
-               pVia->FrameBufferBase, pVia->videoRambytes / 1024);
-
-#ifdef HAVE_PCIACCESS
-    err = pci_device_map_range(pVia->PciInfo, pVia->FrameBufferBase,
-                               pVia->videoRambytes,
-                               (PCI_DEV_MAP_FLAG_WRITABLE |
-                                PCI_DEV_MAP_FLAG_WRITE_COMBINE),
-                               (void **)&pVia->FBBase);
-    if (err) {
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "Unable to map the frame buffer.\n"
-                    "Error: %s (%u)\n",
-                    strerror(err), err);
-        goto fail;
-    }
-#else
-    /*
-     * FIXME: This is a hack to get rid of offending wrongly sized
-     * MTRR regions set up by the VIA BIOS. Should be taken care of
-     * in the OS support layer.
-     */
-    tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag,
-                        pVia->FrameBufferBase, pVia->videoRambytes);
-    xf86UnMapVidMem(pScrn->scrnIndex, (pointer) tmp, pVia->videoRambytes);
-
-    /*
-     * And, as if this wasn't enough, 2.6 series kernels don't
-     * remove MTRR regions on the first attempt. So try again.
-     */
-    tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag,
-                        pVia->FrameBufferBase, pVia->videoRambytes);
-    xf86UnMapVidMem(pScrn->scrnIndex, (pointer) tmp, pVia->videoRambytes);
-    /*
-     * End of hack.
-     */
-
-    pVia->FBBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER,
-                                 pVia->PciTag, pVia->FrameBufferBase,
-                                 pVia->videoRambytes);
-
-    if (!pVia->FBBase) {
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                   "Unable to map the frame buffer.\n");
-        goto fail;
-    }
-#endif
-
-    pVia->FBFreeStart = 0;
-    pVia->FBFreeEnd = pVia->videoRambytes;
-
-    xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-               "Frame buffer start address: %p, free start: 0x%X end: 0x%X\n",
-               pVia->FBBase, pVia->FBFreeStart, pVia->FBFreeEnd);
-
-#ifdef HAVE_PCIACCESS
-    if (pVia->Chipset == VIA_VX900) {
-        pScrn->memPhysBase = pVia->PciInfo->regions[2].base_addr;
-    } else {
-        pScrn->memPhysBase = pVia->PciInfo->regions[0].base_addr;
-    }
-#else
-    if (pVia->Chipset == VIA_VX900) {
-        pScrn->memPhysBase = pVia->PciInfo->memBase[2];
-    } else {
-        pScrn->memPhysBase = pVia->PciInfo->memBase[0];
-    }
-#endif
-
-    pScrn->fbOffset = 0;
-    if (pVia->IsSecondary) {
-        pScrn->fbOffset = pScrn->videoRam << 10;
-    }
-
     /* MMIO for MPEG engine. */
     pVia->MpegMapBase = pVia->MapBase + 0xc00;
 
@@ -286,11 +192,6 @@ viaMapMMIO(ScrnInfoPtr pScrn)
 fail:
 
 #ifdef HAVE_PCIACCESS
-    if (pVia->FBBase) {
-        pci_device_unmap_range(pVia->PciInfo, (pointer) pVia->FBBase,
-                                pVia->videoRambytes);
-    }
-
     if (pVia->BltBase) {
         pci_device_unmap_range(pVia->PciInfo, (pointer) pVia->BltBase,
                                VIA_MMIO_BLTSIZE);
@@ -301,11 +202,6 @@ fail:
                                VIA_MMIO_REGSIZE);
     }
 #else
-    if (pVia->FBBase) {
-        xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->FBBase,
-                        pVia->videoRambytes);
-    }
-
     if (pVia->BltBase) {
         xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->BltBase,
                         VIA_MMIO_BLTSIZE);
@@ -317,7 +213,6 @@ fail:
     }
 #endif
 
-    pVia->FBBase = NULL;
     pVia->BltBase = NULL;
     pVia->MapBase = NULL;
 
@@ -326,7 +221,7 @@ fail:
     return FALSE;
 }
 
-void
+static void
 viaUnmapMMIO(ScrnInfoPtr pScrn)
 {
     VIAPtr pVia = VIAPTR(pScrn);
@@ -337,11 +232,6 @@ viaUnmapMMIO(ScrnInfoPtr pScrn)
     viaMMIODisable(pScrn);
 
 #ifdef HAVE_PCIACCESS
-    if (pVia->FBBase) {
-        pci_device_unmap_range(pVia->PciInfo, (pointer) pVia->FBBase,
-                               pVia->videoRambytes);
-    }
-
     if (pVia->BltBase) {
         pci_device_unmap_range(pVia->PciInfo, (pointer) pVia->BltBase,
                                VIA_MMIO_BLTSIZE);
@@ -352,11 +242,6 @@ viaUnmapMMIO(ScrnInfoPtr pScrn)
                                VIA_MMIO_REGSIZE);
     }
 #else
-    if (pVia->FBBase) {
-        xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->FBBase,
-                        pVia->videoRambytes);
-    }
-
     if (pVia->BltBase) {
         xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->BltBase,
                         VIA_MMIO_BLTSIZE);
@@ -368,7 +253,6 @@ viaUnmapMMIO(ScrnInfoPtr pScrn)
     }
 #endif
 
-    pVia->FBBase = NULL;
     pVia->BltBase = NULL;
     pVia->MapBase = NULL;
 
@@ -376,6 +260,139 @@ viaUnmapMMIO(ScrnInfoPtr pScrn)
                         "Exiting viaUnmapMMIO.\n"));
 }
 
+static Bool
+viaMapFB(ScrnInfoPtr pScrn)
+{
+    VIAPtr pVia = VIAPTR(pScrn);
+#ifdef HAVE_PCIACCESS
+    int err;
+#else
+    unsigned char *tmp;
+#endif
+    Bool ret = FALSE;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+    if (!pVia->videoRambytes) {
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                    "Unable to map the frame buffer!\n");
+        goto exit;
+    }
+
+#ifdef HAVE_PCIACCESS
+    if (pVia->Chipset == VIA_VX900) {
+        pVia->FrameBufferBase = pVia->PciInfo->regions[2].base_addr;
+    } else {
+        pVia->FrameBufferBase = pVia->PciInfo->regions[0].base_addr;
+    }
+#else
+    if (pVia->Chipset == VIA_VX900) {
+        pVia->FrameBufferBase = pVia->PciInfo->memBase[2];
+    } else {
+        pVia->FrameBufferBase = pVia->PciInfo->memBase[0];
+    }
+#endif
+
+#ifdef HAVE_PCIACCESS
+    err = pci_device_map_range(pVia->PciInfo, pVia->FrameBufferBase,
+                                pVia->videoRambytes,
+                                PCI_DEV_MAP_FLAG_WRITABLE |
+                                PCI_DEV_MAP_FLAG_WRITE_COMBINE,
+                                (void **)&pVia->FBBase);
+    if (err) {
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                    "Unable to map the frame buffer!\n"
+                    "Error: %s (%u)\n",
+                    strerror(err), err);
+        goto exit;
+    }
+#else
+    /*
+     * FIXME: This is a hack to get rid of offending wrongly sized
+     * MTRR regions set up by the VIA BIOS. Should be taken care of
+     * in the OS support layer.
+     */
+    tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag,
+                        pVia->FrameBufferBase, pVia->videoRambytes);
+    if (!tmp) {
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                    "Unable to map the frame buffer!\n");
+        goto exit;
+    }
+
+    xf86UnMapVidMem(pScrn->scrnIndex,
+                    (pointer) tmp, pVia->videoRambytes);
+
+    /*
+     * And, as if this wasn't enough, 2.6 series kernels don't
+     * remove MTRR regions on the first attempt. So try again.
+     */
+    tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag,
+                        pVia->FrameBufferBase, pVia->videoRambytes);
+    if (!tmp) {
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                    "Unable to map the frame buffer!\n");
+        goto exit;
+    }
+
+    xf86UnMapVidMem(pScrn->scrnIndex,
+                    (pointer) tmp, pVia->videoRambytes);
+    /*
+     * End of hack.
+     */
+
+    pVia->FBBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER,
+                                 pVia->PciTag, pVia->FrameBufferBase,
+                                 pVia->videoRambytes);
+    if (!pVia->FBBase) {
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                    "Unable to map the frame buffer!\n");
+        goto exit;
+    }
+#endif
+
+    xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                "Mapping the frame buffer at address 0x%lx with "
+                "size %lu KB.\n",
+                pVia->FrameBufferBase, pVia->videoRambytes / 1024);
+
+    pVia->FBFreeStart = 0;
+    pVia->FBFreeEnd = pVia->videoRambytes;
+
+    ret = TRUE;
+exit:
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
+    return ret;
+}
+
+static void
+viaUnmapFB(ScrnInfoPtr pScrn)
+{
+    VIAPtr pVia = VIAPTR(pScrn);
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+#ifdef HAVE_PCIACCESS
+    if (pVia->FBBase) {
+        pci_device_unmap_range(pVia->PciInfo, (pointer) pVia->FBBase,
+                               pVia->videoRambytes);
+    }
+#else
+    if (pVia->FBBase) {
+        xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->FBBase,
+                        pVia->videoRambytes);
+    }
+#endif
+
+    pVia->FBBase = NULL;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
+}
+
 /*
  * Leftover from VIA's code.
  */
@@ -631,14 +648,13 @@ viaInitialize3DEngine(ScrnInfoPtr pScrn)
  * and initializes engines and acceleration method.
  */
 Bool
-umsAccelInit(ScreenPtr pScreen)
+viaUMSAccelInit(ScrnInfoPtr pScrn)
 {
-    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
     VIAPtr pVia = VIAPTR(pScrn);
     Bool ret = FALSE;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered umsAccelInit.\n"));
+                        "Entered %s.\n", __func__));
 
     pVia->VQStart = 0;
     pVia->vq_bo = drm_bo_alloc(pScrn, VIA_VQ_SIZE, 16, TTM_PL_FLAG_VRAM);
@@ -656,10 +672,6 @@ umsAccelInit(ScreenPtr pScreen)
                         "Initializing the 3D engine.\n"));
     viaInitialize3DEngine(pScrn);
 
-    pVia->exa_sync_bo = drm_bo_alloc(pScrn, 32, 32, TTM_PL_FLAG_VRAM);
-    if (!pVia->exa_sync_bo)
-        goto err;
-
     /* Sync marker space. */
     pVia->exa_sync_bo = drm_bo_alloc(pScrn, 32, 32, TTM_PL_FLAG_VRAM);
     if (!pVia->exa_sync_bo)
@@ -690,38 +702,27 @@ err:
     }
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting umsAccelInit.\n"));
+                        "Exiting %s.\n", __func__));
     return ret;
 }
 
-Bool
-umsCreate(ScrnInfoPtr pScrn)
+static Bool
+viaInitFB(ScrnInfoPtr pScrn)
 {
-    ScreenPtr pScreen = pScrn->pScreen;
     VIAPtr pVia = VIAPTR(pScrn);
-    unsigned long offset;
     BoxRec AvailFBArea;
-    Bool ret = TRUE;
-    long size;
+    int offset, size;
     int maxY;
+    Bool ret = TRUE;
 
-#ifdef HAVE_DRI
-    if (pVia->directRenderingType == DRI_1) {
-        pVia->driSize = (pVia->FBFreeEnd - pVia->FBFreeStart) >> 2;
-        if ((pVia->driSize > (pVia->maxDriSize * 1024)) && pVia->maxDriSize > 0)
-            pVia->driSize = pVia->maxDriSize * 1024;
-
-        /* In the case of DRI we handle all VRAM by the DRI ioctls */
-        if (pVia->useEXA)
-            return TRUE;
-
-        /* XAA has to use FBManager so we have to split the space with DRI */
-        maxY = pScrn->virtualY + (pVia->driSize / pVia->Bpl);
-    } else
-#endif
-        maxY = pVia->FBFreeEnd / pVia->Bpl;
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+    maxY = pVia->FBFreeEnd / pVia->Bpl;
 
-    /* FBManager can't handle more than 32767 scan lines */
+    /*
+     * FBManager can't handle more than 32767 scan lines.
+     */
     if (maxY > 32767)
         maxY = 32767;
 
@@ -732,145 +733,427 @@ umsCreate(ScrnInfoPtr pScrn)
     pVia->FBFreeStart = (AvailFBArea.y2 + 1) * pVia->Bpl;
 
     /*
-     *   Initialization of the XFree86 framebuffer manager is done via
-     *   Bool xf86InitFBManager(ScreenPtr pScreen, BoxPtr FullBox)
-     *   FullBox represents the area of the framebuffer that the manager
-     *   is allowed to manage. This is typically a box with a width
-     *   of pScrn->displayWidth and a height of as many lines as can be fit
-     *   within the total video memory
+     * Initialization of the XFree86 framebuffer manager is done via
+     * Bool xf86InitFBManager(ScreenPtr pScreen, BoxPtr FullBox).
+     * FullBox represents the area of the frame buffer that the
+     * manager is allowed to manage.  This is typically a box with a
+     * width of pScrn->displayWidth and a height of as many lines as
+     * can be fit within the total video memory.
      */
-    ret = xf86InitFBManager(pScreen, &AvailFBArea);
-    if (ret != TRUE)
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86InitFBManager init failed\n");
+    ret = xf86InitFBManager(pScrn->pScreen, &AvailFBArea);
+    if (!ret) {
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                    "xf86InitFBManager initialization failed.\n");
+        goto exit;
+    }
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-            "Frame Buffer From (%d,%d) To (%d,%d)\n",
-            AvailFBArea.x1, AvailFBArea.y1, AvailFBArea.x2, AvailFBArea.y2));
+                        "Frame buffer from (%d,%d) to (%d,%d).\n",
+                        AvailFBArea.x1, AvailFBArea.y1,
+                        AvailFBArea.x2, AvailFBArea.y2));
+
+    offset = (pVia->FBFreeStart +
+                ((pScrn->bitsPerPixel >> 3) - 1)) /
+                (pScrn->bitsPerPixel >> 3);
+    size = (pVia->FBFreeEnd / (pScrn->bitsPerPixel >> 3)) - offset;
+
+    if (size > 0) {
+        ret = xf86InitFBManagerLinear(pScrn->pScreen, offset, size);
+        if (!ret) {
+            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                        "xf86InitFBManagerLinear initialization "
+                        "failed.\n");
+            goto exit;
+        }
+    }
 
-    offset = (pVia->FBFreeStart + pVia->Bpp - 1) / pVia->Bpp;
-    size = pVia->FBFreeEnd / pVia->Bpp - offset;
-    if (size > 0)
-        xf86InitFBManagerLinear(pScreen, offset, size);
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Using %d lines for off screen memory.\n",
+                        AvailFBArea.y2 - pScrn->virtualY));
 
+exit:
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-            "Using %d lines for offscreen memory.\n",
-            AvailFBArea.y2 - pScrn->virtualY));
-    return TRUE;
+                        "Exiting %s.\n", __func__));
+    return ret;
+}
+
+Bool
+viaUMSMapIOResources(ScrnInfoPtr pScrn)
+{
+    VIAPtr pVia = VIAPTR(pScrn);
+    Bool ret = TRUE;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+    pScrn->fbOffset = 0;
+     if (pVia->IsSecondary) {
+        pScrn->fbOffset = pScrn->videoRam << 10;
+    }
+
+#ifdef HAVE_PCIACCESS
+    if (pVia->Chipset == VIA_VX900) {
+        pScrn->memPhysBase = pVia->PciInfo->regions[2].base_addr;
+    } else {
+        pScrn->memPhysBase = pVia->PciInfo->regions[0].base_addr;
+    }
+#else
+    if (pVia->Chipset == VIA_VX900) {
+        pScrn->memPhysBase = pVia->PciInfo->memBase[2];
+    } else {
+        pScrn->memPhysBase = pVia->PciInfo->memBase[0];
+    }
+#endif
+
+    /*
+     * Map MMIO PCI hardware resources to the memory map.
+     */
+    if (!viaMapMMIO(pScrn)) {
+        ret = FALSE;
+        goto exit;
+    }
+
+    /*
+     * Map FB PCI hardware resource to the memory map.
+     */
+    if (!viaMapFB(pScrn)) {
+        viaUnmapMMIO(pScrn);
+        ret = FALSE;
+        goto exit;
+    }
+
+exit:
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
+    return ret;
+}
+
+void
+viaUMSDestroy(ScrnInfoPtr pScrn)
+{
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+    viaUnmapFB(pScrn);
+    viaUnmapMMIO(pScrn);
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
 }
 
 Bool
-umsPreInit(ScrnInfoPtr pScrn)
+viaUMSScreenInit(ScrnInfoPtr pScrn)
 {
-    MessageType from = X_PROBED;
     VIAPtr pVia = VIAPTR(pScrn);
-    CARD8 videoRam;
-    vgaHWPtr hwp;
+    Bool ret = TRUE;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+    if (pVia->directRenderingType == DRI_NONE) {
+        if (!pVia->useEXA) {
+            if (!viaInitFB(pScrn)) {
+                ret = FALSE;
+            }
+        } else {
+            if (!viaInitExa(pScrn->pScreen)) {
+                ret = FALSE;
+            }
+        }
+#ifdef HAVE_DRI
+    } else if (pVia->directRenderingType == DRI_1) {
+        if (!VIADRIKernelInit(pScrn)) {
+            ret = FALSE;
+            goto exit;
+        }
+
+        if ((!pVia->NoAccel) && (pVia->useEXA)) {
+            if (!viaInitExa(pScrn->pScreen)) {
+                ret = FALSE;
+                goto exit;
+            }
+        }
+#endif
+    }
+
+exit:
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
+    return ret;
+}
+
+static Bool
+viaProbeVRAM(ScrnInfoPtr pScrn)
+{
 #ifdef HAVE_PCIACCESS
-    struct pci_device *vgaDevice = pci_device_find_by_slot(0, 0, 0, 3);
-    struct pci_device *bridge = pci_device_find_by_slot(0, 0, 0, 0);
+    struct pci_device *hostBridge = NULL;
+    struct pci_device *dramController = NULL;
 #endif
-    int bMemSize = 0;
+    uint8_t videoRAM;
+    int     detectedVideoRAM;
+    CARD16 hostBridgeVendorID, hostBridgeDeviceID;
+    CARD16 dramControllerVendorID;
+    Bool status = TRUE;
 
-    if (!xf86LoadSubModule(pScrn, "vgahw"))
-        return FALSE;
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaProbeVRAM.\n"));
 
-    if (!vgaHWGetHWRec(pScrn))
-        return FALSE;
+#ifdef HAVE_PCIACCESS
+    hostBridge = pci_device_find_by_slot(0, 0, 0, 0);
+    hostBridgeVendorID = VENDOR_ID(hostBridge);
+#else
+    hostBridgeVendorID = pciReadWord(pciTag(0, 0, 0), 0x00);
+#endif
 
-#if 0
-    /* Here we can alter the number of registers saved and restored by the
-     * standard vgaHWSave and Restore routines.
-     */
-    vgaHWSetRegCounts(pScrn, VGA_NUM_CRTC, VGA_NUM_SEQ, VGA_NUM_GFX,
-                      VGA_NUM_ATTR);
+    if (hostBridgeVendorID != PCI_VIA_VENDOR_ID) {
+        status = FALSE;
+        goto exit;
+    }
+
+#ifdef HAVE_PCIACCESS
+    hostBridgeDeviceID = DEVICE_ID(hostBridge);
+#else
+    hostBridgeDeviceID = pciReadWord(pciTag(0, 0, 0), 0x02);
 #endif
-    hwp = VGAHWPTR(pScrn);
 
-    switch (pVia->Chipset) {
-        case VIA_CLE266:
+    if ((hostBridgeDeviceID != PCI_DEVICE_ID_VIA_CLE266_HB) &&
+        (hostBridgeDeviceID != PCI_DEVICE_ID_VIA_KM400_HB)) {
 #ifdef HAVE_PCIACCESS
-            pci_device_cfg_read_u8(bridge, &videoRam, 0xE1);
+        dramController = pci_device_find_by_slot(0, 0, 0, 3);
+        dramControllerVendorID = VENDOR_ID(dramController);
 #else
-            videoRam = pciReadByte(pciTag(0, 0, 0), 0xE1) & 0x70;
+        dramControllerVendorID = pciReadWord(pciTag(0, 0, 3), 0x00);
+
 #endif
-            pScrn->videoRam = (1 << ((videoRam & 0x70) >> 4)) << 10;
-            break;
-        case VIA_KM400:
+        if (dramControllerVendorID != PCI_VIA_VENDOR_ID) {
+            status = FALSE;
+            goto exit;
+        }
+    }
+    switch (hostBridgeDeviceID) {
+    case PCI_DEVICE_ID_VIA_CLE266_HB:
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "CLE266 chipset host bridge detected.\n");
 #ifdef HAVE_PCIACCESS
-            /* P4M800 Host Bridge PCI Device ID */
-            if (DEVICE_ID(bridge) == 0x0296) {
-                pci_device_cfg_read_u8(vgaDevice, &videoRam, 0xA1);
-            } else {
-                pci_device_cfg_read_u8(bridge, &videoRam, 0xE1);
-            }
+        pci_device_cfg_read_u8(hostBridge, &videoRAM, 0xE1);
 #else
-            /* P4M800 Host Bridge PCI Device ID */
-            if (pciReadWord(pciTag(0, 0, 0), 0x02) == 0x0296) {
-                videoRam = pciReadByte(pciTag(0, 0, 3), 0xA1) & 0x70;
-            } else {
-                videoRam = pciReadByte(pciTag(0, 0, 0), 0xE1) & 0x70;
-            }
+        videoRAM = pciReadByte(pciTag(0, 0, 0), 0xE1);
 #endif
-            pScrn->videoRam = (1 << ((videoRam & 0x70) >> 4)) << 10;
-            break;
-        case VIA_PM800:
-        case VIA_P4M800PRO:
-        case VIA_K8M800:
+        detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 10;
+        break;
+    case PCI_DEVICE_ID_VIA_KM400_HB:
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "KM400 chipset host bridge detected.\n");
 #ifdef HAVE_PCIACCESS
-            pci_device_cfg_read_u8(vgaDevice, &videoRam, 0xA1);
+        pci_device_cfg_read_u8(hostBridge, &videoRAM, 0xE1);
 #else
-            videoRam = pciReadByte(pciTag(0, 0, 3), 0xA1) & 0x70;
+        videoRAM = pciReadByte(pciTag(0, 0, 0), 0xE1);
 #endif
-            pScrn->videoRam = (1 << ((videoRam & 0x70) >> 4)) << 10;
-            break;
-        case VIA_P4M890:
-        case VIA_K8M890:
-        case VIA_P4M900:
-        case VIA_CX700:
-        case VIA_VX800:
-        case VIA_VX855:
-        case VIA_VX900:
+        detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 10;
+        break;
+    case PCI_DEVICE_ID_VIA_P4M800_AGP:
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "P4M800 chipset AGP bridge detected.\n");
 #ifdef HAVE_PCIACCESS
-            pci_device_cfg_read_u8(vgaDevice, &videoRam, 0xA1);
+        pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1);
 #else
-            videoRam = pciReadByte(pciTag(0, 0, 3), 0xA1) & 0x70;
+        videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1);
 #endif
-            pScrn->videoRam = (1 << ((videoRam & 0x70) >> 4)) << 12;
-            break;
-        default:
-            if (pScrn->videoRam < 16384 || pScrn->videoRam > 65536) {
-                xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
-                           "Using old memory-detection method.\n");
-                bMemSize = hwp->readSeq(hwp, 0x39);
-                if (bMemSize > 16 && bMemSize <= 128)
-                    pScrn->videoRam = (bMemSize + 1) << 9;
-                else if (bMemSize > 0 && bMemSize < 31)
-                    pScrn->videoRam = bMemSize << 12;
-                else {
-                    from = X_DEFAULT;
-                    xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
-                               "Memory size detection failed: using 16 MB.\n");
-                    pScrn->videoRam = 16 << 10;
-                }
-            } else {
-                from = X_DEFAULT;
-                xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
-                           "No memory-detection done. Use VideoRAM option.\n");
-            }
+        detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 10;
+        break;
+    case PCI_DEVICE_ID_VIA_P4M800_PRO_AGP:
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "P4M800 Pro chipset AGP bridge detected.\n");
+#ifdef HAVE_PCIACCESS
+        pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1);
+#else
+        videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1);
+#endif
+        detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 10;
+        break;
+    case PCI_DEVICE_ID_VIA_PM800_AGP:
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "PM800 chipset AGP bridge detected.\n");
+#ifdef HAVE_PCIACCESS
+        pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1);
+#else
+        videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1);
+#endif
+        detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 10;
+        break;
+    case PCI_DEVICE_ID_VIA_K8M800_AGP:
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "K8M800 chipset AGP bridge detected.\n");
+#ifdef HAVE_PCIACCESS
+        pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1);
+#else
+        videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1);
+#endif
+        detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 10;
+        break;
+    case PCI_DEVICE_ID_VIA_CX700_AGP:
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "CX700 chipset AGP bridge detected.\n");
+#ifdef HAVE_PCIACCESS
+        pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1);
+#else
+        videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1);
+#endif
+        detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 12;
+        break;
+    case PCI_DEVICE_ID_VIA_P4M890_AGP:
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "P4M890 chipset AGP bridge detected.\n");
+#ifdef HAVE_PCIACCESS
+        pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1);
+#else
+        videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1);
+#endif
+        detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 12;
+        break;
+    case PCI_DEVICE_ID_VIA_K8M890_AGP:
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "K8M890 chipset AGP bridge detected.\n");
+#ifdef HAVE_PCIACCESS
+        pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1);
+#else
+        videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1);
+#endif
+        detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 12;
+        break;
+    case PCI_DEVICE_ID_VIA_P4M900_AGP:
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "P4M900 chipset AGP bridge detected.\n");
+#ifdef HAVE_PCIACCESS
+        pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1);
+#else
+        videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1);
+#endif
+        detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 12;
+        break;
+    case PCI_DEVICE_ID_VIA_VX800_HC:
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "VX800 chipset host controller detected.\n");
+#ifdef HAVE_PCIACCESS
+        pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1);
+#else
+        videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1);
+#endif
+        detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 12;
+        break;
+    case PCI_DEVICE_ID_VIA_VX855_HC:
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "VX855 chipset host controller detected.\n");
+#ifdef HAVE_PCIACCESS
+        pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1);
+#else
+        videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1);
+#endif
+        detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 12;
+        break;
+    case PCI_DEVICE_ID_VIA_VX900_HC:
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "VX900 chipset host controller detected.\n");
+#ifdef HAVE_PCIACCESS
+        pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1);
+#else
+        videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1);
+#endif
+        detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 12;
+        break;
+    default:
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "Could not detect available video RAM.\n");
+        detectedVideoRAM = 0;
+        status = FALSE;
+        break;
     }
 
-    /*
-     * PCI BAR are limited to 256 MB.
-     */
-    if (pScrn->videoRam > (256 << 10)) {
-        xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
-                    "Cannot use more than 256 MB of VRAM.\n");
-                    pScrn->videoRam = (256 << 10);
+    pScrn->videoRam = detectedVideoRAM;
+    if (status) {
+        xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                   "Detected Video RAM Size: %d KB\n", pScrn->videoRam);
     }
 
-    if (from == X_PROBED) {
-        xf86DrvMsg(pScrn->scrnIndex, from,
-                   "Probed amount of VideoRAM = %d kB\n", pScrn->videoRam);
+exit:
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaProbeVRAM.\n"));
+    return status;
+}
+
+Bool
+viaUMSPreInit(ScrnInfoPtr pScrn)
+{
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+
+    /* Checking for VIA Technologies NanoBook reference design.
+       Examples include Everex CloudBook and Sylvania g netbook.
+       It is also called FIC CE260 and CE261 by its ODM (Original
+       Design Manufacturer) name.
+       This device has its strapping resistors set to a wrong
+       setting to handle DVI. As a result, we need to make special
+       accommodations to handle DVI properly. */
+    if ((pVia->Chipset == VIA_CX700) &&
+        (SUBVENDOR_ID(pVia->PciInfo) == 0x1509) &&
+        (SUBSYS_ID(pVia->PciInfo) == 0x2D30)) {
+
+        pVIADisplay->isVIANanoBook      = TRUE;
+    } else {
+        pVIADisplay->isVIANanoBook      = FALSE;
+    }
+
+    /* Checking for Quanta IL1 netbook. This is necessary
+     * due to its flat panel connected to DVP1 (Digital
+     * Video Port 1) rather than its LVDS channel. */
+    if ((pVia->Chipset == VIA_VX800) &&
+        (SUBVENDOR_ID(pVia->PciInfo) == 0x152D) &&
+        (SUBSYS_ID(pVia->PciInfo) == 0x0771)) {
+
+        pVIADisplay->isQuantaIL1      = TRUE;
+    } else {
+        pVIADisplay->isQuantaIL1      = FALSE;
+    }
+
+    /* Samsung NC20 netbook has its FP connected to LVDS2
+     * rather than the more logical LVDS1, hence, a special
+     * flag register is needed for properly controlling its
+     * FP. */
+    if ((pVia->Chipset == VIA_VX800) &&
+        (SUBVENDOR_ID(pVia->PciInfo) == 0x144d) &&
+        (SUBSYS_ID(pVia->PciInfo) == 0xc04e)) {
+
+        pVIADisplay->isSamsungNC20      = TRUE;
+    } else {
+        pVIADisplay->isSamsungNC20      = FALSE;
+    }
+
+    /* Checking for OLPC XO-1.5. */
+    if ((pVia->Chipset == VIA_VX855) &&
+        (SUBVENDOR_ID(pVia->PciInfo) == 0x152D) &&
+        (SUBSYS_ID(pVia->PciInfo) == 0x0833)) {
+
+        pVIADisplay->isOLPCXO15      = TRUE;
+    } else {
+        pVIADisplay->isOLPCXO15      = FALSE;
+    }
+
+    if (!xf86LoadSubModule(pScrn, "vgahw"))
+        return FALSE;
+
+    if (!vgaHWGetHWRec(pScrn))
+        return FALSE;
+
+#if 0
+    /* Here we can alter the number of registers saved and restored by the
+     * standard vgaHWSave and Restore routines.
+     */
+    vgaHWSetRegCounts(pScrn, VGA_NUM_CRTC, VGA_NUM_SEQ, VGA_NUM_GFX,
+                      VGA_NUM_ATTR);
+#endif
+
+    if (!viaProbeVRAM(pScrn)) {
+        return FALSE;
     }
 
     /* Split the FB for SAMM. */
@@ -906,27 +1189,180 @@ umsPreInit(ScrnInfoPtr pScrn)
     return TRUE;
 }
 
+void
+viaUMSPreInitExit(ScrnInfoPtr pScrn)
+{
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+    viaUnmapMMIO(pScrn);
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
+}
+
 Bool
-umsCrtcInit(ScrnInfoPtr pScrn)
+viaUMSCrtcInit(ScrnInfoPtr pScrn)
 {
     drmmode_crtc_private_ptr iga1_rec = NULL, iga2_rec = NULL;
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
-#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,8,0,0,0)
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    VIARegPtr Regs = &pVIADisplay->SavedReg;
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,7,99,3,0)
     ClockRangePtr clockRanges;
 #else
     ClockRangesPtr clockRanges;
 #endif
     int max_pitch, max_height;
-    VIABIOSInfoPtr pBIOSInfo;
     xf86CrtcPtr iga1, iga2;
+    uint32_t i;
+
+    vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_ALL);
+
+    /* Unlock extended registers. */
+    hwp->writeSeq(hwp, 0x10, 0x01);
+
+    Regs->SR[0x14] = hwp->readSeq(hwp, 0x14);
+    Regs->SR[0x15] = hwp->readSeq(hwp, 0x15);
+    Regs->SR[0x16] = hwp->readSeq(hwp, 0x16);
+    Regs->SR[0x17] = hwp->readSeq(hwp, 0x17);
+    Regs->SR[0x18] = hwp->readSeq(hwp, 0x18);
+    Regs->SR[0x19] = hwp->readSeq(hwp, 0x19);
+    Regs->SR[0x1A] = hwp->readSeq(hwp, 0x1A);
+    Regs->SR[0x1B] = hwp->readSeq(hwp, 0x1B);
+    Regs->SR[0x1C] = hwp->readSeq(hwp, 0x1C);
+    Regs->SR[0x1D] = hwp->readSeq(hwp, 0x1D);
+    Regs->SR[0x1E] = hwp->readSeq(hwp, 0x1E);
+    Regs->SR[0x1F] = hwp->readSeq(hwp, 0x1F);
+    Regs->SR[0x20] = hwp->readSeq(hwp, 0x20);
+    Regs->SR[0x21] = hwp->readSeq(hwp, 0x21);
+    Regs->SR[0x22] = hwp->readSeq(hwp, 0x22);
+    Regs->SR[0x23] = hwp->readSeq(hwp, 0x23);
+    Regs->SR[0x24] = hwp->readSeq(hwp, 0x24);
+
+    Regs->SR[0x27] = hwp->readSeq(hwp, 0x27);
+    Regs->SR[0x28] = hwp->readSeq(hwp, 0x28);
+    Regs->SR[0x29] = hwp->readSeq(hwp, 0x29);
+    Regs->SR[0x2A] = hwp->readSeq(hwp, 0x2A);
+    Regs->SR[0x2B] = hwp->readSeq(hwp, 0x2B);
+
+    Regs->SR[0x2C] = hwp->readSeq(hwp, 0x2C);
+
+    Regs->SR[0x2D] = hwp->readSeq(hwp, 0x2D);
+    Regs->SR[0x2E] = hwp->readSeq(hwp, 0x2E);
+    Regs->SR[0x2F] = hwp->readSeq(hwp, 0x2F);
+    Regs->SR[0x30] = hwp->readSeq(hwp, 0x30);
+
+    Regs->SR[0x3D] = hwp->readSeq(hwp, 0x3D);
+
+    Regs->SR[0x44] = hwp->readSeq(hwp, 0x44);
+    Regs->SR[0x45] = hwp->readSeq(hwp, 0x45);
+    Regs->SR[0x46] = hwp->readSeq(hwp, 0x46);
+    Regs->SR[0x47] = hwp->readSeq(hwp, 0x47);
+    Regs->SR[0x48] = hwp->readSeq(hwp, 0x48);
+    Regs->SR[0x49] = hwp->readSeq(hwp, 0x49);
+    Regs->SR[0x4A] = hwp->readSeq(hwp, 0x4A);
+    Regs->SR[0x4B] = hwp->readSeq(hwp, 0x4B);
 
-    /* 3X5.3B through 3X5.3F are scratch pad registers. */
-    pVia->originalCR3B = hwp->readCrtc(hwp, 0x3B);
-    pVia->originalCR3C = hwp->readCrtc(hwp, 0x3C);
-    pVia->originalCR3D = hwp->readCrtc(hwp, 0x3D);
-    pVia->originalCR3E = hwp->readCrtc(hwp, 0x3E);
-    pVia->originalCR3F = hwp->readCrtc(hwp, 0x3F);
+    switch (pVia->Chipset) {
+    case VIA_K8M800:
+    case VIA_P4M800PRO:
+    case VIA_PM800:
+    case VIA_CX700:
+    case VIA_P4M890:
+    case VIA_K8M890:
+    case VIA_P4M900:
+    case VIA_VX800:
+    case VIA_VX855:
+    case VIA_VX900:
+        Regs->SR[0x4C] = hwp->readSeq(hwp, 0x4C);
+        Regs->SR[0x4D] = hwp->readSeq(hwp, 0x4D);
+        Regs->SR[0x4E] = hwp->readSeq(hwp, 0x4E);
+        Regs->SR[0x4F] = hwp->readSeq(hwp, 0x4F);
+        break;
+    default:
+        break;
+    }
+
+    if ((pVia->Chipset == VIA_VX800) ||
+        (pVia->Chipset == VIA_VX855) ||
+        (pVia->Chipset == VIA_VX900)) {
+        Regs->SR[0x14] = hwp->readSeq(hwp, 0x14);
+        Regs->SR[0x68] = hwp->readSeq(hwp, 0x68);
+        Regs->SR[0x69] = hwp->readSeq(hwp, 0x69);
+        Regs->SR[0x6A] = hwp->readSeq(hwp, 0x6A);
+        Regs->SR[0x6B] = hwp->readSeq(hwp, 0x6B);
+        Regs->SR[0x6C] = hwp->readSeq(hwp, 0x6C);
+        Regs->SR[0x6D] = hwp->readSeq(hwp, 0x6D);
+        Regs->SR[0x6E] = hwp->readSeq(hwp, 0x6E);
+        Regs->SR[0x6F] = hwp->readSeq(hwp, 0x6F);
+    }
+
+    Regs->CR[0x0C] = hwp->readCrtc(hwp, 0x0C);
+    Regs->CR[0x0D] = hwp->readCrtc(hwp, 0x0D);
+
+    Regs->CR[0x30] = hwp->readCrtc(hwp, 0x30);
+    Regs->CR[0x31] = hwp->readCrtc(hwp, 0x31);
+    Regs->CR[0x32] = hwp->readCrtc(hwp, 0x32);
+    Regs->CR[0x33] = hwp->readCrtc(hwp, 0x33);
+    Regs->CR[0x34] = hwp->readCrtc(hwp, 0x34);
+    Regs->CR[0x35] = hwp->readCrtc(hwp, 0x35);
+    Regs->CR[0x36] = hwp->readCrtc(hwp, 0x36);
+    Regs->CR[0x37] = hwp->readCrtc(hwp, 0x37);
+    Regs->CR[0x38] = hwp->readCrtc(hwp, 0x38);
+    Regs->CR[0x39] = hwp->readCrtc(hwp, 0x39);
+    Regs->CR[0x3A] = hwp->readCrtc(hwp, 0x3A);
+    Regs->CR[0x3B] = hwp->readCrtc(hwp, 0x3B);
+    Regs->CR[0x3C] = hwp->readCrtc(hwp, 0x3C);
+    Regs->CR[0x3D] = hwp->readCrtc(hwp, 0x3D);
+    Regs->CR[0x3E] = hwp->readCrtc(hwp, 0x3E);
+    Regs->CR[0x3F] = hwp->readCrtc(hwp, 0x3F);
+    Regs->CR[0x40] = hwp->readCrtc(hwp, 0x40);
+    Regs->CR[0x43] = hwp->readCrtc(hwp, 0x43);
+    Regs->CR[0x45] = hwp->readCrtc(hwp, 0x45);
+    Regs->CR[0x46] = hwp->readCrtc(hwp, 0x46);
+    Regs->CR[0x47] = hwp->readCrtc(hwp, 0x47);
+    Regs->CR[0x48] = hwp->readCrtc(hwp, 0x48);
+
+    for (i = 0; i < (0xA8 - 0x50 + 1); i++) {
+        Regs->CR[i + 0x50] = hwp->readCrtc(hwp, i + 0x50);
+    }
+
+    switch (pVia->Chipset) {
+    case VIA_CX700:
+    case VIA_VX800:
+    case VIA_VX855:
+    case VIA_VX900:
+        for (i = 0; i < (0xEF - 0xA9 + 1); i++) {
+            Regs->CR[i + 0xA9] = hwp->readCrtc(hwp, i + 0xA9);
+        }
+
+        break;
+    default:
+        break;
+    }
+
+    if ((pVia->Chipset == VIA_VX800) ||
+        (pVia->Chipset == VIA_VX855) ||
+        (pVia->Chipset == VIA_VX900)) {
+        for (i = 0; i < (0xF5 - 0xF0 + 1); i++) {
+            Regs->CR[i + 0xF0] = hwp->readCrtc(hwp, i + 0xF0);
+        }
+    }
+
+    if ((pVia->Chipset == VIA_VX855) ||
+        (pVia->Chipset == VIA_VX900)) {
+        for (i = 0; i < (0xFC - 0xF6 + 1); i++) {
+            Regs->CR[i + 0xF6] = hwp->readCrtc(hwp, i + 0xF6);
+        }
+    }
+
+    if (pVia->Chipset == VIA_VX900) {
+        for (i = 0; i < (0xFF - 0xF7 + 1); i++) {
+            Regs->CR[i + 0xF7] = hwp->readCrtc(hwp, i + 0xF7);
+        }
+    }
 
     /* Read memory bandwidth from registers. */
     pVia->MemClk = hwp->readCrtc(hwp, 0x3D) >> 4;
@@ -937,22 +1373,28 @@ umsCrtcInit(ScrnInfoPtr pScrn)
                    "Unknown Memory clock: %d\n", pVia->MemClk);
         pVia->MemClk = VIA_MEM_END - 1;
     }
-    pBIOSInfo = pVia->pBIOSInfo;
-    pBIOSInfo->Bandwidth = ViaGetMemoryBandwidth(pScrn);
 
-    if (pBIOSInfo->TVType == TVTYPE_NONE) {
+    pVIADisplay->Bandwidth = ViaGetMemoryBandwidth(pScrn);
+
+    if (pVIADisplay->TVType == TVTYPE_NONE) {
         /* Use jumper to determine TV type. */
         if (hwp->readCrtc(hwp, 0x3B) & 0x02) {
-            pBIOSInfo->TVType = TVTYPE_PAL;
+            pVIADisplay->TVType = TVTYPE_PAL;
             DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                              "Detected TV standard: PAL.\n"));
         } else {
-            pBIOSInfo->TVType = TVTYPE_NTSC;
+            pVIADisplay->TVType = TVTYPE_NTSC;
             DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                              "Detected TV standard: NTSC.\n"));
         }
     }
 
+    pVIADisplay->I2CDevices = VIA_I2C_BUS1 | VIA_I2C_BUS2 | VIA_I2C_BUS3;
+
+    if (pVIADisplay->isOLPCXO15) {
+        pVIADisplay->I2CDevices &= ~VIA_I2C_BUS2;
+    }
+
     if (pVia->drmmode.hwcursor) {
         if (!xf86LoadSubModule(pScrn, "ramdac"))
             return FALSE;
@@ -971,7 +1413,7 @@ umsCrtcInit(ScrnInfoPtr pScrn)
      * available, and what sort of modes they can be used for.
      */
 
-#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,8,0,0,0)
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,7,99,3,0)
     clockRanges = xnfalloc(sizeof(ClockRange));
 #else
     clockRanges = xnfalloc(sizeof(ClockRanges));
@@ -1047,7 +1489,7 @@ umsCrtcInit(ScrnInfoPtr pScrn)
 
     xf86CrtcSetSizeRange(pScrn, 320, 200, max_pitch, max_height);
 
-    viaOutputDetect(pScrn);
+    viaInitDisplay(pScrn);
 
     return TRUE;
 }
diff --git a/src/via_ums.h b/src/via_ums.h
index ec2204c..e937217 100644
--- a/src/via_ums.h
+++ b/src/via_ums.h
@@ -26,8 +26,8 @@
  * DEALINGS IN THE SOFTWARE.
  */
 
-#ifndef _VIA_BIOS_H_
-#define _VIA_BIOS_H_ 1
+#ifndef _VIA_UMS_H_
+#define _VIA_UMS_H_ 1
 
 #include "via_vgahw.h"
 
@@ -107,24 +107,62 @@
 #define VIA_MEM_END     0x0B
 #define VIA_MEM_NONE    0xFF
 
+#define VIA_BW_MIN       74000000 /* > 640x480@60Hz@32bpp */
+#define VIA_BW_DDR200   394000000
+#define VIA_BW_DDR400   553000000 /* > 1920x1200@60Hz@32bpp */
+#define VIA_BW_DDR667   922000000
+#define VIA_BW_DDR1066  922000000
+
 /* Digital Output Bus Width */
 #define	    VIA_DI_12BIT		    0x00
 #define	    VIA_DI_24BIT		    0x01
 
 /* Digital Port */
 #define     VIA_DI_PORT_NONE        0x0
-#define     VIA_DI_PORT_DVP0        0x1
-#define     VIA_DI_PORT_DVP1        0x2
-#define     VIA_DI_PORT_DFPLOW      0x4
-#define     VIA_DI_PORT_LVDS1       0x4
-#define     VIA_DI_PORT_TMDS        0x4
-#define     VIA_DI_PORT_DFPHIGH     0x8
-#define     VIA_DI_PORT_LVDS2       0x8
+#define     VIA_DI_PORT_DIP0        0x1
+#define     VIA_DI_PORT_DIP1        0x2
+#define     VIA_DI_PORT_DVP0        0x4
+#define     VIA_DI_PORT_DVP1        0x8
+#define     VIA_DI_PORT_FPDPLOW     0x10
+#define     VIA_DI_PORT_FPDPHIGH    0x20
+#define     VIA_DI_PORT_LVDS1       0x40
+#define     VIA_DI_PORT_TMDS        0x40
+#define     VIA_DI_PORT_LVDS2       0x80
 
 /* External TMDS (DVI) Transmitter Type */
 #define     VIA_TMDS_NONE           0x0
 #define     VIA_TMDS_VT1632         0x1
+#define     VIA_TMDS_SII164         0x2
+
+/* To be used with via_analog_set_dpms_control inline function. */
+#define VIA_ANALOG_DPMS_ON          0x00
+#define VIA_ANALOG_DPMS_STANDBY     0x01
+#define VIA_ANALOG_DPMS_SUSPEND     0x02
+#define VIA_ANALOG_DPMS_OFF         0x03
+
+#define VIA_DPA_CLK_30M       30000000
+#define VIA_DPA_CLK_50M       50000000
+#define VIA_DPA_CLK_70M       70000000
+#define VIA_DPA_CLK_100M      100000000
+#define VIA_DPA_CLK_150M      150000000
+
+
+#define BIT(x) (1 << x)
+
 
+enum {
+    VIA_DPA_CLK_RANGE_30M,
+    VIA_DPA_CLK_RANGE_30M_50M,
+    VIA_DPA_CLK_RANGE_50M_70M,
+    VIA_DPA_CLK_RANGE_70M_100M,
+    VIA_DPA_CLK_RANGE_100M_150M,
+    VIA_DPA_CLK_RANGE_150M,
+};
+
+typedef struct {
+    CARD8   SR[256];
+    CARD8   CR[256];
+} VIARegRec, *VIARegPtr;
 
 typedef struct ViaPanelMode {
     int Width;
@@ -133,35 +171,66 @@ typedef struct ViaPanelMode {
     Bool useDithering;
 } ViaPanelModeRec, *ViaPanelModePtr ;
 
-typedef struct ViaPanelInfo {
-    Bool IsActive ;
-    /* Native physical resolution */
-    int NativeHeight;
-    int NativeWidth;
-    Bool useDualEdge;
-    Bool useDithering;
+typedef struct _VIADISPLAY {
+    Bool        analogPresence;
+    CARD8       analogI2CBus;
 
-    /* Native resolution index, see via_panel.c */
-    CARD8 NativeModeIndex;
-    /* Determine if we must use the hardware scaler
-     * It might be false even if the "Center" option
-     * was specified
-     */
-    Bool            Scale;
+    Bool        intTMDSPresence;
+    CARD8       intTMDSDIPort;
+    CARD8       intTMDSI2CBus;
 
-    /* Panel/LCD entries */
-    CARD16      ResolutionIndex;
-    int         PanelIndex;
-    Bool        Center;
-    Bool        SetDVI;
-    /* LCD Simultaneous Expand Mode HWCursor Y Scale */
-    Bool        scaleY;
-    int         resY;
-} ViaPanelInfoRec, *ViaPanelInfoPtr ;
+    Bool        extTMDSPresence;
+    CARD8       extTMDSDIPort;
+    CARD8       extTMDSI2CBus;
+    CARD8       extTMDSTransmitter;
+
+    Bool        intFP1Presence;
+    CARD8       intFP1DIPort;
+    CARD8       intFP1I2CBus;
+
+    Bool        intFP2Presence;
+    CARD8       intFP2DIPort;
+    CARD8       intFP2I2CBus;
+
+    /* Keeping track of the number of analog VGA connectors. */
+    unsigned int        numberVGA;
+
+    /* Keeping track of the number of DVI connectors. */
+    unsigned int        numberDVI;
+
+    /* Keeping track of the number of FP (Flat Panel) connectors. */
+    unsigned int        numberFP;
 
-typedef struct _VIABIOSINFO {
-	xf86OutputPtr analog;
-	xf86OutputPtr tv;
+    CARD8       I2CDevices;
+    CARD8       mappedI2CBus;
+
+    I2CBusPtr       pI2CBus1;
+    I2CBusPtr       pI2CBus2;
+    I2CBusPtr       pI2CBus3;
+
+    /* VIA Technologies NanoBook reference design.
+     * Examples include Everex CloudBook and Sylvania g netbook.
+     * It is also called FIC CE260 and CE261 by its ODM (Original
+     * Design Manufacturer) name. */
+    Bool                isVIANanoBook;
+
+    /* Quanta IL1 netbook has its FP connected to DVP1
+     * rather than LVDS, hence, a special flag register
+     * is needed for properly controlling its FP. */
+    Bool                isQuantaIL1;
+
+    /* Samsung NC20 netbook has its FP connected to LVDS2
+     * rather than the more logical LVDS1, hence, a special
+     * flag register is needed for properly controlling its
+     * FP. */
+    Bool                isSamsungNC20;
+
+    /* OLPC XO-1.5 */
+    Bool                isOLPCXO15;
+
+    VIARegRec           SavedReg;
+
+    xf86OutputPtr tv;
 
     CARD32      Clock; /* register value for the dotclock */
     Bool        ClockExternal;
@@ -190,12 +259,48 @@ typedef struct _VIABIOSINFO {
     int            TVNumModes;
     void (*TVPrintRegs) (ScrnInfoPtr pScrn);
 
-} VIABIOSInfoRec, *VIABIOSInfoPtr;
+} VIADisplayRec, *VIADisplayPtr;
+
+typedef struct _VIAANALOG {
+    CARD8       i2cBus;
+} VIAAnalogRec, *VIAAnalogPtr;
+
+/*
+ * Record for storing FP (Flat Panel) specific information.
+ */
+typedef struct _VIAFP {
+    Bool IsActive ;
+    /* Native physical resolution */
+    int NativeHeight;
+    int NativeWidth;
+    Bool useDualEdge;
+    Bool useDithering;
+
+    /* Native resolution index, see via_panel.c */
+    CARD8 NativeModeIndex;
+    /* Determine if we must use the hardware scaler
+     * It might be false even if the "Center" option
+     * was specified
+     */
+    Bool            Scale;
+
+    /* Panel/LCD entries */
+    CARD16      ResolutionIndex;
+    int         PanelIndex;
+    Bool        Center;
+    Bool        SetDVI;
+    /* LCD Simultaneous Expand Mode HWCursor Y Scale */
+    Bool        scaleY;
+    int         resY;
 
+    uint32_t    diPort;
+    CARD8       i2cBus;
+} VIAFPRec, *VIAFPPtr;
 
-typedef struct _VIATMDSRec {
-    I2CBusPtr pVIATMDSI2CBus;
-} VIATMDSRec, *VIATMDSRecPtr;
+typedef struct _VIATMDS {
+    uint32_t    diPort;
+    CARD8       i2cBus;
+} VIATMDSRec, *VIATMDSPtr;
 
 typedef struct
 {
@@ -206,47 +311,1275 @@ typedef struct
     CARD8 bTuningValue;
 } ViaExpireNumberTable;
 
+union pllparams {
+    struct {
+        CARD32 dtz : 2;
+        CARD32 dr  : 3;
+        CARD32 dn  : 7;
+        CARD32 dm  :10;
+    } params;
+    CARD32 packed;
+};
+
+/*
+ * DPA Setting Structure.
+ */
+typedef struct _VIADPA {
+    CARD8   dvp0Adjustment;
+    CARD8   dvp0ClockDriveStrength;
+    CARD8   dvp0DataDriveStrength;
+    CARD8   dvp1Adjustment;
+    CARD8   dvp1ClockDriveStrength;
+    CARD8   dvp1DataDriveStrength;
+    CARD8   fpdpLowAdjustment;
+    CARD8   fpdpHighAdjustment;
+} VIADPARec, *VIADPAPtr;
+
+typedef struct _VIADPAINFOTABLE {
+    CARD32          ClockRangeIndex;
+    VIADPAPtr       pDPASetting;
+} VIADPAInfoTableRec, *VIADPAInfoTablePtr;
+
+typedef struct _VIADPAINDEXTABLE {
+    int      Chipset;
+
+    VIADPAInfoTablePtr      pExtTMDSDPATable;
+    VIADPAInfoTablePtr      pFPDPATable;
+} VIA_DPA_INDEX_TABLE;
+
+
+#define NUMBER_VIA_DPA_TABLE    (sizeof(viaDPAIndexTable) / sizeof(*(viaDPAIndexTable)))
+
+/*
+ * Sets IGA1 or IGA2 for palette LUT access.
+ * This function should be called before changing the
+ * contents of the palette.
+ */
+static inline void
+viaSetPaletteLUTAccess(ScrnInfoPtr pScrn, CARD8 displaySource)
+{
+    ViaSeqMask(VGAHWPTR(pScrn), 0x1A,
+                displaySource, BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Palette LUT Access: IGA%d\n",
+                        (displaySource & BIT(0)) + 1));
+}
+
+/*
+ * Resets IGA1 hardware.
+ */
+static inline void
+viaIGA1HWReset(ScrnInfoPtr pScrn, Bool resetState)
+{
+    /* 3X5.17[7] - IGA1 HW Reset
+     *             0: Reset
+     *             1: Normal Operation */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x17, resetState ? 0x00 : BIT(7),
+                BIT(7));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "IGA1 HW Reset: %s\n",
+                        resetState ? "On" : "Off"));
+}
+
+/*
+ * Sets IGA1 palette LUT resolution. (6-bit or 8-bit)
+ */
+static inline void
+viaIGA1SetPaletteLUTResolution(ScrnInfoPtr pScrn, Bool paletteLUT)
+{
+    /* 3C5.15[7] - IGA1 6 / 8 Bit LUT
+     *             0: 6-bit
+     *             1: 8-bit */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x15,
+                paletteLUT ? BIT(7) : 0x00, BIT(7));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "IGA1 Palette LUT Resolution: %s bit\n",
+                        paletteLUT ? "8" : "6"));
+}
+
+/*
+ * Sets IGA2 palette LUT resolution. (6-bit or 8-bit)
+ */
+static inline void
+viaIGA2SetPaletteLUTResolution(ScrnInfoPtr pScrn, Bool paletteLUT)
+{
+    /* Set the palette LUT resolution for IGA2. */
+    /* 3X5.6A[5] - IGA2 6 / 8 Bit LUT
+     *             0: 6-bit
+     *             1: 8-bit */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x6A,
+                paletteLUT ? BIT(5) : 0x00, BIT(5));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "IGA2 Palette LUT Resolution: %s bit\n",
+                        paletteLUT ? "8" : "6"));
+}
+
+/*
+ * Sets IGA1 display output state.
+ */
+static inline void
+viaIGA1SetDisplayOutput(ScrnInfoPtr pScrn, Bool outputState)
+{
+    /* 3C5.01[5] - IGA1 Screen Off
+     *             0: Screen on
+     *             1: Screen off */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x01, outputState ? 0x00 : BIT(5), BIT(5));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "IGA1 Display Output: %s\n",
+                        outputState ? "On" : "Off"));
+}
+
+/*
+ * Sets IGA2 display output state.
+ */
+static inline void
+viaIGA2SetDisplayOutput(ScrnInfoPtr pScrn, Bool outputState)
+{
+    /* 3X5.6B[2] - IGA2 Screen Off
+     *             0: Screen on
+     *             1: Screen off */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x6B,
+                outputState ? 0x00 : BIT(2), BIT(2));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "IGA2 Display Output: %s\n",
+                        outputState ? "On" : "Off"));
+}
+
+/*
+ * Sets DIP0 (Digital Interface Port 0) I/O pad state.
+ * CLE266 chipset only.
+ */
+static inline void
+viaDIP0SetIOPadState(ScrnInfoPtr pScrn, CARD8 ioPadState)
+{
+    /* 3C5.1E[7:6] - DIP0 Power Control
+     *               0x: Pad always off
+     *               10: Depend on the other control signal
+     *               11: Pad on/off according to the
+     *                   Power Management Status (PMS) */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x1E,
+                ioPadState << 6, BIT(7) | BIT(6));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DIP0 I/O Pad State: %s\n",
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x03) ?
+                            "On" :
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x02) ?
+                            "Conditional" :
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x01) ?
+                            "Off" :
+                            "Off"));
+}
+
+/*
+ * Sets the display source of DIP0 (Digital Interface Port 0)
+ * interface. CLE266 chipset only.
+ */
+static inline void
+viaDIP0SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
+{
+    /* 3X5.6C[7] - DIP0 Data Source Selection
+     *             0: Primary Display
+     *             1: Secondary Display */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x6C,
+                displaySource << 7, BIT(7));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DIP0 Display Source: IGA%d\n",
+                        (displaySource & 0x01) + 1));
+}
+
+
+/*
+ * Sets DVP0 (Digital Video Port 0) I/O pad state.
+ */
+static inline void
+viaDVP0SetIOPadState(ScrnInfoPtr pScrn, CARD8 ioPadState)
+{
+    /* 3C5.1E[7:6] - DVP0 Power Control
+     *               0x: Pad always off
+     *               10: Depend on the other control signal
+     *               11: Pad on/off according to the
+     *                   Power Management Status (PMS) */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x1E, ioPadState << 6, BIT(7) | BIT(6));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DVP0 I/O Pad State: %s\n",
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x03) ? "On" :
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x02) ? "Conditional" :
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x01) ? "Off" :
+                                                                     "Off"));
+}
+
+/*
+ * Sets DVP0 (Digital Video Port 0) clock I/O pad drive strength.
+ */
+static inline void
+viaDVP0SetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength)
+{
+    /* 3C5.1E[2] - DVP0 Clock Drive Strength Bit [0] */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x1E, clockDriveStrength << 2,
+                BIT(2));
+
+    /* 3C5.2A[4] - DVP0 Clock Drive Strength Bit [1] */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x2A, clockDriveStrength << 3,
+                BIT(4));
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DVP0 Clock I/O Pad Drive Strength: %u\n",
+                        clockDriveStrength & (BIT(1) | BIT(0))));
+}
+
+/*
+ * Sets DVP0 (Digital Video Port 0) data I/O pads drive strength.
+ */
+static inline void
+viaDVP0SetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength)
+{
+    /* 3C5.1B[1] - DVP0 Data Drive Strength Bit [0] */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x1B, dataDriveStrength << 1, BIT(1));
+
+    /* 3C5.2A[5] - DVP0 Data Drive Strength Bit [1] */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x2A, dataDriveStrength << 4, BIT(5));
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DVP0 Data I/O Pads Drive Strength: %u\n",
+                        dataDriveStrength & (BIT(1) | BIT(0))));
+}
+
+/*
+ * Sets DVP0 (Digital Video Port 0) adjustment register.
+ */
+static inline void
+viaDVP0SetAdjustment(ScrnInfoPtr pScrn, CARD8 adjustment)
+{
+    /* 3X5.96[3:0] - DVP0 Adjustment */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x96,
+                adjustment, BIT(3) | BIT(2) | BIT(1) | BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DVP0 Adjustment: %d\n",
+                        (adjustment & (BIT(3) | BIT(2) |
+                                     BIT(1) | BIT(0)))));
+}
+
+/*
+ * Sets DVP0 (Digital Video Port 0) sync polarity.
+ */
+static inline void
+viaDVP0SetSyncPolarity(ScrnInfoPtr pScrn, CARD8 syncPolarity)
+{
+    /* 3X5.96[6] - DVP0 VSYNC Polarity
+     *             0: Positive
+     *             1: Negative
+     * 3X5.96[5] - DVP0 HSYNC Polarity
+     *             0: Positive
+     *             1: Negative */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x96,
+                syncPolarity << 5, BIT(6) | BIT(5));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DVP0 Horizontal Sync Polarity: %s\n",
+                        (syncPolarity & BIT(0)) ? "-" : "+"));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DVP0 Vertical Sync Polarity: %s\n",
+                        (syncPolarity & BIT(1)) ? "-" : "+"));
+}
+
+/*
+ * Sets the display source of DVP0 (Digital Video Port 0) interface.
+ */
+static inline void
+viaDVP0SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
+{
+    /* 3X5.96[4] - DVP0 Data Source Selection
+     *             0: Primary Display
+     *             1: Secondary Display */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x96, displaySource << 4, BIT(4));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DVP0 Display Source: IGA%d\n",
+                        (displaySource & 0x01) + 1));
+}
+
+/*
+ * Sets DVP1 (Digital Video Port 1) I/O pad state.
+ */
+static inline void
+viaDVP1SetIOPadState(ScrnInfoPtr pScrn, CARD8 ioPadState)
+{
+    /* 3C5.1E[5:4] - DVP1 Power Control
+     *               0x: Pad always off
+     *               10: Depend on the other control signal
+     *               11: Pad on/off according to the
+     *                   Power Management Status (PMS) */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x1E, ioPadState << 4, BIT(5) | BIT(4));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DVP1 I/O Pad State: %s\n",
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x03) ? "On" :
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x02) ? "Conditional" :
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x01) ? "Off" :
+                                                                     "Off"));
+}
+
+/*
+ * Sets DVP1 (Digital Video Port 1) clock I/O pad drive strength.
+ */
+static inline void
+viaDVP1SetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength)
+{
+    /* 3C5.65[3:2] - DVP1 Clock Pads Driving Select [1:0]
+     *               00: lowest
+     *               01: low
+     *               10: high
+     *               11: highest */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x65, clockDriveStrength << 2, BIT(3) | BIT(2));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DVP1 Clock I/O Pad Drive Strength: %u\n",
+                        clockDriveStrength & (BIT(1) | BIT(0))));
+}
+
+/*
+ * Sets DVP1 (Digital Video Port 1) data I/O pads drive strength.
+ */
+static inline void
+viaDVP1SetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength)
+{
+    /* 3C5.65[1:0] - DVP1 Data Pads Driving Select [1:0}
+     *               00: lowest
+     *               01: low
+     *               10: high
+     *               11: highest */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x65, dataDriveStrength, BIT(1) | BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DVP1 Data I/O Pads Drive Strength: %u\n",
+                        dataDriveStrength & (BIT(1) | BIT(0))));
+}
+
+/*
+ * Sets DVP1 (Digital Video Port 1) adjustment register.
+ */
+static inline void
+viaDVP1SetAdjustment(ScrnInfoPtr pScrn, CARD8 adjustment)
+{
+    /* 3X5.9B[3:0] - DVP1 Adjustment */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x9B,
+                adjustment, BIT(3) | BIT(2) | BIT(1) | BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DVP1 Adjustment: %d\n",
+                        (adjustment & (BIT(3) | BIT(2) |
+                                     BIT(1) | BIT(0)))));
+}
+
+/*
+ * Sets DVP1 (Digital Video Port 1) sync polarity.
+ */
+static inline void
+viaDVP1SetSyncPolarity(ScrnInfoPtr pScrn, CARD8 syncPolarity)
+{
+    /* 3X5.9B[6] - DVP1 VSYNC Polarity
+     *             0: Positive
+     *             1: Negative
+     * 3X5.9B[5] - DVP1 HSYNC Polarity
+     *             0: Positive
+     *             1: Negative */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x9B,
+                syncPolarity << 5, BIT(6) | BIT(5));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DVP1 Horizontal Sync Polarity: %s\n",
+                        (syncPolarity & BIT(0)) ? "-" : "+"));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DVP1 Vertical Sync Polarity: %s\n",
+                        (syncPolarity & BIT(1)) ? "-" : "+"));
+}
+
+/*
+ * Sets the display source of DVP1 (Digital Video Port 1) interface.
+ */
+static inline void
+viaDVP1SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
+{
+    /* 3X5.9B[4] - DVP1 Data Source Selection
+     *             0: Primary Display
+     *             1: Secondary Display */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x9B, displaySource << 4, BIT(4));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "DVP1 Display Source: IGA%d\n",
+                        (displaySource & 0x01) + 1));
+}
+
+/*
+ * Sets analog (VGA) DAC power.
+ */
+static inline void
+viaAnalogSetPower(ScrnInfoPtr pScrn, Bool outputState)
+{
+    /* 3X5.47[2] - DACOFF Backdoor Register
+     *             0: DAC on
+     *             1: DAC off */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x47,
+                outputState ? 0x00 : BIT(2), BIT(2));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Analog (VGA) Power: %s\n",
+                        outputState ? "On" : "Off"));
+}
+
+/*
+ * Sets analog (VGA) DAC off setting.
+ * Only available in CX700 / VX700, VX800, VX855, and VX900 chipsets.
+ */
+static inline void
+viaAnalogSetDACOff(ScrnInfoPtr pScrn, Bool dacOff)
+{
+    /* 3C5.5E[0] - CRT DACOFF Setting
+     *             0: Disabled
+     *             1: DAC is controlled by 3C5.01[5] */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x5E,
+                dacOff ? BIT(0) : 0x00, BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Analog (VGA) DAC Off Setting: %s\n",
+                        dacOff ? "On" : "Off"));
+}
+
+/*
+ * Sets analog (VGA) DPMS State.
+ */
+static inline void
+viaAnalogSetDPMSControl(ScrnInfoPtr pScrn, CARD8 dpmsControl)
+{
+    /* 3X5.36[5:4] - DPMS Control
+     *               00: On
+     *               01: Stand-by
+     *               10: Suspend
+     *               11: Off */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x36,
+                    dpmsControl << 4, BIT(5) | BIT(4));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Analog (VGA) DPMS: %s\n",
+                        ((dpmsControl & (BIT(1) | BIT(0))) == 0x03) ?
+                            "Off" :
+                        ((dpmsControl & (BIT(1) | BIT(0))) == 0x02) ?
+                            "Suspend" :
+                        ((dpmsControl & (BIT(1) | BIT(0))) == 0x01) ?
+                            "Standby" :
+                            "On"));
+}
+
+/*
+ * Sets analog (VGA) sync polarity.
+ */
+static inline void
+viaAnalogSetSyncPolarity(ScrnInfoPtr pScrn, CARD8 syncPolarity)
+{
+    /* 3C2[7] - Analog Vertical Sync Polarity
+     *          0: Positive
+     *          1: Negative
+     * 3C2[6] - Analog Horizontal Sync Polarity
+     *          0: Positive
+     *          1: Negative */
+    VGAHWPTR(pScrn)->writeMiscOut(VGAHWPTR(pScrn),
+            ((VGAHWPTR(pScrn)->readMiscOut(VGAHWPTR(pScrn)))
+                & ~((BIT(1) | BIT(0)) << 6))
+            | ((syncPolarity & (BIT(1) | BIT(0))) << 6));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Analog (VGA) Horizontal Sync Polarity: %s\n",
+                        (syncPolarity & BIT(0)) ? "-" : "+"));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Analog (VGA) Vertical Sync Polarity: %s\n",
+                        (syncPolarity & BIT(1)) ? "-" : "+"));
+}
+
+/*
+ * Sets analog (VGA) display source.
+ */
+static inline void
+viaAnalogSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
+{
+    /* 3C5.16[6] - CRT Display Source
+     *             0: Primary Display Stream (IGA1)
+     *             1: Secondary Display Stream (IGA2) */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x16,
+                displaySource << 6, BIT(6));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Analog (VGA) Display Source: IGA%d\n",
+                        (displaySource & 0x01) + 1));
+}
+
+/*
+ * Sets KM400 or later chipset's FP primary power sequence control
+ * type.
+ */
+static inline void
+viaFPSetPrimaryPowerSeqType(ScrnInfoPtr pScrn, Bool ctrlType)
+{
+    /* Set FP primary power sequence control type. */
+    /* 3X5.91[0] - FP Primary Power Sequence Control Type
+     *             0: Hardware Control
+     *             1: Software Control */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x91, ctrlType ? 0x00 : BIT(0),
+                BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Primary Power Sequence Control Type: "
+                        "%s Control\n",
+                        ctrlType ? "Hardware" : "Software"));
+}
+
+/*
+ * Sets KM400 or later chipset's FP primary software controlled
+ * back light.
+ */
+static inline void
+viaFPSetPrimarySoftBackLight(ScrnInfoPtr pScrn, Bool softOn)
+{
+    /* 3X5.91[1] - FP Primary Software Back Light On
+     *             0: Off
+     *             1: On */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x91,
+                softOn ? BIT(1) : 0x00, BIT(1));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Primary Software Controlled Back Light: "
+                        "%s\n",
+                        softOn ? "On" : "Off"));
+}
+
+/*
+ * Sets KM400 or later chipset's FP primary software controlled
+ * VEE.
+ */
+static inline void
+viaFPSetPrimarySoftVEE(ScrnInfoPtr pScrn, Bool softOn)
+{
+    /* 3X5.91[2] - FP Primary Software VEE On
+     *             0: Off
+     *             1: On */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x91,
+                softOn ? BIT(2) : 0x00, BIT(2));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Primary Software Controlled VEE: "
+                        "%s\n",
+                        softOn ? "On" : "Off"));
+}
+
+/*
+ * Sets KM400 or later chipset's FP primary software controlled
+ * data.
+ */
+static inline void
+viaFPSetPrimarySoftData(ScrnInfoPtr pScrn, Bool softOn)
+{
+    /* 3X5.91[3] - FP Primary Software Data On
+     *             0: Off
+     *             1: On */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x91,
+                softOn ? BIT(3) : 0x00, BIT(3));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Primary Software Controlled Data: "
+                        "%s\n",
+                        softOn ? "On" : "Off"));
+}
+
+/*
+ * Sets KM400 or later chipset's FP primary software controlled
+ * VDD.
+ */
+static inline void
+viaFPSetPrimarySoftVDD(ScrnInfoPtr pScrn, Bool softOn)
+{
+    /* 3X5.91[4] - FP Primary Software VDD On
+     *             0: Off
+     *             1: On */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x91,
+                softOn ? BIT(4) : 0x00, BIT(4));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Primary Software Controlled VDD: "
+                        "%s\n",
+                        softOn ? "On" : "Off"));
+}
+
+/*
+ * Sets KM400 or later chipset's FP primary direct back light control
+ * bit.
+ */
+static inline void
+viaFPSetPrimaryDirectBackLightCtrl(ScrnInfoPtr pScrn, Bool directOn)
+{
+    /* Set FP primary direct back light control bit. */
+    /* 3X5.91[6] - FP Primary Direct Back Light Control
+     *             0: On
+     *             1: Off */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x91, directOn ? 0x00 : BIT(6),
+                BIT(6));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Primary Direct Back Light Control: %s\n",
+                        directOn ? "On" : "Off"));
+}
+
+/*
+ * Sets KM400 or later chipset's FP primary direct display period
+ * control bit.
+ */
+static inline void
+viaFPSetPrimaryDirectDisplayPeriod(ScrnInfoPtr pScrn, Bool directOn)
+{
+    /* Set FP primary direct display period bit. */
+    /* 3X5.91[7] - FP Primary Direct Display Period Control
+     *             0: On
+     *             1: Off */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x91, directOn ? 0x00 : BIT(7),
+                BIT(7));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Primary Direct Display Period Control: %s\n",
+                        directOn ? "On" : "Off"));
+}
+
+/*
+ * Sets KM400 or later chipset's FP primary hardware controlled
+ * power sequence bit.
+ */
+static inline void
+viaFPSetPrimaryHardPower(ScrnInfoPtr pScrn, Bool powerState)
+{
+    /* Set FP primary hardware controlled power sequence bit. */
+    /* 3X5.6A[3] - FP Primary Hardware Controlled Power Sequence
+     *             0: Hardware Controlled Power Off
+     *             1: Hardware Controlled Power On */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x6A, powerState ? BIT(3) : 0x00,
+                BIT(3));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Primary Hardware Controlled Power "
+                        "Sequence: %s\n",
+                        powerState ? "On" : "Off"));
+}
+
+/*
+ * Sets FP secondary power sequence control type.
+ */
+static inline void
+viaFPSetSecondaryPowerSeqType(ScrnInfoPtr pScrn, Bool ctrlType)
+{
+    /* 3X5.D3[0] - FP Secondary Power Sequence Control Type
+     *             0: Hardware Control
+     *             1: Software Control */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD3, ctrlType ? 0x00 : BIT(0),
+                BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Secondary Power Sequence Control Type: "
+                        "%s Control\n",
+                        ctrlType ? "Hardware" : "Software"));
+}
+
+/*
+ * Sets CX700 / VX700 or later chipset's FP secondary
+ * software controlled back light.
+ */
+static inline void
+viaFPSetSecondarySoftBackLight(ScrnInfoPtr pScrn, Bool softOn)
+{
+    /* 3X5.D3[1] - FP Secondary Software Back Light On
+     *             0: Off
+     *             1: On */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD3,
+                softOn ? BIT(1) : 0x00, BIT(1));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Secondary Software Controlled "
+                        "Back Light: %s\n", softOn ? "On" : "Off"));
+}
+
+/*
+ * Sets CX700 / VX700 or later chipset's FP secondary software
+ * controlled VEE.
+ */
+static inline void
+viaFPSetSecondarySoftVEE(ScrnInfoPtr pScrn, Bool softOn)
+{
+    /* 3X5.D3[2] - FP Secondary Software VEE On
+     *             0: Off
+     *             1: On */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD3,
+                softOn ? BIT(2) : 0x00, BIT(2));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Secondary Software Controlled VEE: %s\n",
+                        softOn ? "On" : "Off"));
+}
+
+/*
+ * Sets CX700 / VX700 or later chipset's FP secondary software
+ * controlled data.
+ */
+static inline void
+viaFPSetSecondarySoftData(ScrnInfoPtr pScrn, Bool softOn)
+{
+    /* 3X5.D3[3] - FP Secondary Software Data On
+     *             0: Off
+     *             1: On */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD3,
+                softOn ? BIT(3) : 0x00, BIT(3));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Secondary Software Controlled Data: %s\n",
+                        softOn ? "On" : "Off"));
+}
+
+/*
+ * Sets CX700 / VX700 or later chipset's FP secondary software
+ * controlled VDD.
+ */
+static inline void
+viaFPSetSecondarySoftVDD(ScrnInfoPtr pScrn, Bool softOn)
+{
+    /* 3X5.D3[4] - FP Secondary Software VDD On
+     *             0: Off
+     *             1: On */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD3,
+                softOn ? BIT(4) : 0x00, BIT(4));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Secondary Software Controlled VDD: %s\n",
+                        softOn ? "On" : "Off"));
+}
+
+/*
+ * Sets CX700 / VX700 or later chipset's FP secondary direct back
+ * light control.
+ */
+static inline void
+viaFPSetSecondaryDirectBackLightCtrl(ScrnInfoPtr pScrn, Bool directOn)
+{
+    /* 3X5.D3[6] - FP Secondary Direct Back Light Control
+     *             0: On
+     *             1: Off */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD3,
+                directOn ? 0x00 : BIT(6), BIT(6));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Secondary Direct Back Light "
+                        "Control: %s\n", directOn ? "On" : "Off"));
+}
+
+/*
+ * Sets CX700 / VX700 or later chipset's FP secondary direct
+ * display period control.
+ */
+static inline void
+viaFPSetSecondaryDirectDisplayPeriod(ScrnInfoPtr pScrn, Bool directOn)
+{
+    /* 3X5.D3[7] - FP Secondary Direct Display Period Control
+     *             0: On
+     *             1: Off */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD3,
+                directOn ? 0x00 : BIT(7), BIT(7));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Secondary Direct Display Period "
+                        "Control: %s\n", directOn ? "On" : "Off"));
+}
+
+/*
+ * Sets FP secondary hardware controlled power sequence enable bit.
+ */
+static inline void
+viaFPSetSecondaryHardPower(ScrnInfoPtr pScrn, Bool powerState)
+{
+    /* 3X5.D4[1] - Secondary Power Hardware Power Sequence Enable
+     *             0: Off
+     *             1: On */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD4,
+                powerState ? BIT(1) : 0x00, BIT(1));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FP Secondary Hardware Controlled Power "
+                        "Sequence: %s\n",
+                        powerState ? "On" : "Off"));
+}
+
+/*
+ * Sets FPDP (Flat Panel Display Port) Low I/O pad state.
+ */
+static inline void
+viaFPDPLowSetIOPadState(ScrnInfoPtr pScrn, CARD8 ioPadState)
+{
+    /* 3C5.2A[1:0] - FPDP Low Power Control
+     *               0x: Pad always off
+     *               10: Depend on the other control signal
+     *               11: Pad on/off according to the
+     *                   Power Management Status (PMS) */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x2A,
+                ioPadState, BIT(1) | BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FPDP Low I/O Pad State: %s\n",
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x03) ?
+                            "On" :
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x02) ?
+                            "Conditional" :
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x01) ?
+                            "Off" :
+                            "Off"));
+}
+
+/*
+ * Sets FPDP (Flat Panel Display Port) Low adjustment register.
+ */
+static inline void
+viaFPDPLowSetAdjustment(ScrnInfoPtr pScrn, CARD8 adjustment)
+{
+    /* 3X5.99[3:0] - FPDP Low Adjustment */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x99,
+            adjustment, BIT(3) | BIT(2) | BIT(1) | BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FPDP Low Adjustment: %d\n",
+                        (adjustment & (BIT(3) | BIT(2) |
+                                     BIT(1) | BIT(0)))));
+}
+
+/*
+ * Sets FPDP (Flat Panel Display Port) Low interface display source.
+ */
+static inline void
+viaFPDPLowSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
+{
+    /* 3X5.99[4] - FPDP Low Data Source Selection
+     *             0: Primary Display
+     *             1: Secondary Display */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x99,
+                displaySource << 4, BIT(4));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FPDP Low Display Source: IGA%d\n",
+                        (displaySource & 0x01) + 1));
+}
+
+/*
+ * Sets FPDP (Flat Panel Display Port) High I/O pad state.
+ */
+static inline void
+viaFPDPHighSetIOPadState(ScrnInfoPtr pScrn, CARD8 ioPadState)
+{
+    /* 3C5.2A[3:2] - FPDP High Power Control
+     *               0x: Pad always off
+     *               10: Depend on the other control signal
+     *               11: Pad on/off according to the
+     *                   Power Management Status (PMS) */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x2A,
+                ioPadState << 2, BIT(3) | BIT(2));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FPDP High I/O Pad State: %s\n",
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x03) ?
+                            "On" :
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x02) ?
+                            "Conditional" :
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x01) ?
+                            "Off" :
+                            "Off"));
+}
+
+/*
+ * Sets FPDP (Flat Panel Display Port) High adjustment register.
+ */
+static inline void
+viaFPDPHighSetAdjustment(ScrnInfoPtr pScrn, CARD8 adjustment)
+{
+    /* 3X5.97[3:0] - FPDP High Adjustment */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x97, adjustment,
+                BIT(3) | BIT(2) | BIT(1) | BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FPDP High Adjustment: %d\n",
+                        (adjustment & (BIT(3) | BIT(2) |
+                                     BIT(1) | BIT(0)))));
+}
+
+/*
+ * Sets FPDP (Flat Panel Display Port) High interface display source.
+ */
+static inline void
+viaFPDPHighSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
+{
+    /* 3X5.97[4] - FPDP High Data Source Selection
+     *             0: Primary Display
+     *             1: Secondary Display */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x97,
+                displaySource << 4, BIT(4));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "FPDP High Display Source: IGA%d\n",
+                        (displaySource & 0x01) + 1));
+}
+
+/*
+ * Sets LVDS1 power state.
+ */
+static inline void
+viaLVDS1SetPower(ScrnInfoPtr pScrn, Bool powerState)
+{
+    /* 3X5.D2[7] - Power Down (Active High) for Channel 1 LVDS
+     *             0: LVDS1 power on
+     *             1: LVDS1 power down */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD2,
+                powerState ? 0x00 : BIT(7), BIT(7));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS1 Power State: %s\n",
+                        powerState ? "On" : "Off"));
+}
+
+/*
+ * Sets CX700 or later single chipset's LVDS1 power sequence type.
+ */
+static inline void
+viaLVDS1SetPowerSeq(ScrnInfoPtr pScrn, Bool ctrlType)
+{
+    /* Set LVDS1 power sequence type. */
+    /* 3X5.91[0] - LVDS1 Hardware or Software Control Power Sequence
+     *             0: Hardware Control
+     *             1: Software Control */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x91, ctrlType ? BIT(0) : 0x00,
+                BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS1 Power Sequence: %s Control\n",
+                        ctrlType ? "Software" : "Hardware"));
+}
+
+/*
+ * Sets CX700 or later single chipset's LVDS1 software controlled Vdd.
+ */
+static inline void
+viaLVDS1SetSoftVdd(ScrnInfoPtr pScrn, Bool softOn)
+{
+    /* Set LVDS1 software controlled Vdd. */
+    /* 3X5.91[4] - Software VDD On
+     *             0: Off
+     *             1: On */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x91, softOn ? BIT(4) : 0,
+                BIT(4));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS1 Software Controlled Vdd: %s\n",
+                        softOn ? "On" : "Off"));
+}
+
+/*
+ * Sets LVDS1 I/O pad state.
+ */
+static inline void
+viaLVDS1SetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState)
+{
+    /* 3C5.2A[1:0] - LVDS1 I/O Pad Control
+     *               0x: Pad always off
+     *               10: Depend on the other control signal
+     *               11: Pad on/off according to the
+     *                   Power Management Status (PMS) */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x2A,
+                ioPadState, BIT(1) | BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS1 I/O Pad State: %s\n",
+            ((ioPadState & (BIT(1) | BIT(0))) == 0x03) ?
+                "On" :
+            ((ioPadState & (BIT(1) | BIT(0))) == 0x02) ?
+                "Conditional" :
+            ((ioPadState & (BIT(1) | BIT(0))) == 0x01) ?
+                "Off" :
+                "Off"));
+}
+
+/*
+ * Sets LVDS1 format.
+ */
+static inline void
+viaLVDS1SetFormat(ScrnInfoPtr pScrn, CARD8 format)
+{
+    /* 3X5.D2[1] - LVDS Channel 1 Format Selection
+     *             0: SPWG Mode
+     *             1: OPENLDI Mode */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD2,
+                format << 1, BIT(1));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS1 Format: %s\n",
+                        (format & BIT(0)) ? "OPENLDI" : "SPWG"));
+}
+
+/*
+ * Sets LVDS1 output format (rotation or sequential mode).
+ */
+static inline void
+viaLVDS1SetOutputFormat(ScrnInfoPtr pScrn, CARD8 outputFormat)
+{
+    /* 3X5.88[6] - LVDS Channel 1 Output Format
+     *             0: Rotation
+     *             1: Sequential */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x88,
+                outputFormat << 6, BIT(6));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS1 Output Format: %s\n",
+                        (outputFormat & BIT(0)) ?
+                        "Sequential" : "Rotation"));
+}
+
+/*
+ * Sets LVDS1 output color dithering (18-bit color display vs.
+ * 24-bit color display).
+ */
+static inline void
+viaLVDS1SetDithering(ScrnInfoPtr pScrn, Bool dithering)
+{
+    /* 3X5.88[0] - LVDS Channel 1 Output Bits
+     *             0: 24 bits (dithering off)
+     *             1: 18 bits (dithering on) */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x88,
+                dithering ? BIT(0) : 0x00, BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS1 Color Dithering: %s\n",
+                        dithering ?
+                        "On (18 bit color)" : "Off (24 bit color)"));
+}
+
+/*
+ * Sets LVDS1 sync polarity.
+ */
+static inline void
+viaLVDS1SetSyncPolarity(ScrnInfoPtr pScrn, CARD8 syncPolarity)
+{
+    /* 3X5.99[6] - LVDS1 VSYNC Polarity
+     *             0: Positive
+     *             1: Negative
+     * 3X5.99[5] - LVDS1 HSYNC Polarity
+     *             0: Positive
+     *             1: Negative */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x99,
+                syncPolarity << 5, BIT(6) | BIT(5));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS1 Horizontal Sync Polarity: %s\n",
+                        (syncPolarity & BIT(0)) ? "-" : "+"));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS1 Vertical Sync Polarity: %s\n",
+                        (syncPolarity & BIT(1)) ? "-" : "+"));
+}
+
+/*
+ * Sets LVDS1 display source.
+ */
+static inline void
+viaLVDS1SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
+{
+    /* 3X5.99[4] - LVDS Channel 1 Data Source Selection
+     *             0: Primary Display
+     *             1: Secondary Display */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x99,
+                displaySource << 4, BIT(4));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS1 Display Source: IGA%d\n",
+                        (displaySource & 0x01) + 1));
+}
+
+/*
+ * Sets LVDS2 power state.
+ */
+static inline void
+viaLVDS2SetPower(ScrnInfoPtr pScrn, Bool powerState)
+{
+    /* 3X5.D2[6] - Power Down (Active High) for Channel 2 LVDS
+     *             0: LVDS2 power on
+     *             1: LVDS2 power down */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD2,
+                powerState ? 0x00 : BIT(6), BIT(6));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS2 Power State: %s\n",
+                        powerState ? "On" : "Off"));
+}
+
+/*
+ * Sets LVDS2 I/O pad state.
+ */
+static inline void
+viaLVDS2SetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState)
+{
+    /* 3C5.2A[3:2] - LVDS2 I/O Pad Control
+     *               0x: Pad always off
+     *               10: Depend on the other control signal
+     *               11: Pad on/off according to the
+     *                   Power Management Status (PMS) */
+    ViaSeqMask(VGAHWPTR(pScrn), 0x2A,
+                ioPadState << 2, BIT(3) | BIT(2));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS2 I/O Pad State: %s\n",
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x03) ?
+                            "On" :
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x02) ?
+                            "Conditional" :
+                        ((ioPadState & (BIT(1) | BIT(0))) == 0x01) ?
+                            "Off" :
+                            "Off"));
+}
+
+/*
+ * Sets LVDS2 format.
+ */
+static inline void
+viaLVDS2SetFormat(ScrnInfoPtr pScrn, CARD8 format)
+{
+    /* 3X5.D2[0] - LVDS Channel 2 Format Selection
+     *             0: SPWG Mode
+     *             1: OPENLDI Mode */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD2, format, BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS2 Format: %s\n",
+                        (format & BIT(0)) ? "OPENLDI" : "SPWG"));
+}
+
+/*
+ * Sets LVDS2 output format (rotation or sequential mode).
+ */
+static inline void
+viaLVDS2SetOutputFormat(ScrnInfoPtr pScrn, CARD8 outputFormat)
+{
+    /* 3X5.D4[7] - LVDS Channel 2 Output Format
+     *             0: Rotation
+     *             1: Sequential */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD4, outputFormat << 7, BIT(7));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS2 Output Format: %s\n",
+                        (outputFormat & BIT(0)) ? "Sequential" : "Rotation"));
+}
+
+/*
+ * Sets LVDS2 output color dithering (18-bit color display vs.
+ * 24-bit color display).
+ */
+static inline void
+viaLVDS2SetDithering(ScrnInfoPtr pScrn, Bool dithering)
+{
+    /* 3X5.D4[6] - LVDS Channel 2 Output Bits
+     *             0: 24 bits (dithering off)
+     *             1: 18 bits (dithering on) */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD4, dithering ? BIT(6) : 0x00, BIT(6));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS2 Color Dithering: %s\n",
+                        dithering ? "On (18 bit color)" : "Off (24 bit color)"));
+}
+
+/*
+ * Sets LVDS2 sync polarity.
+ */
+static inline void
+viaLVDS2SetSyncPolarity(ScrnInfoPtr pScrn, CARD8 syncPolarity)
+{
+    /* 3X5.97[6] - LVDS2 VSYNC Polarity
+     *             0: Positive
+     *             1: Negative
+     * 3X5.97[5] - LVDS2 HSYNC Polarity
+     *             0: Positive
+     *             1: Negative */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x97,
+                syncPolarity << 5, BIT(6) | BIT(5));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS2 Horizontal Sync Polarity: %s\n",
+                        (syncPolarity & BIT(0)) ? "-" : "+"));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS2 Vertical Sync Polarity: %s\n",
+                        (syncPolarity & BIT(1)) ? "-" : "+"));
+}
+
+/*
+ * Sets LVDS2 display source.
+ */
+static inline void
+viaLVDS2SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
+{
+    /* 3X5.97[4] - LVDS Channel 2 Data Source Selection
+     *             0: Primary Display
+     *             1: Secondary Display */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x97,
+                displaySource << 4, BIT(4));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "LVDS2 Display Source: IGA%d\n",
+                        (displaySource & 0x01) + 1));
+}
+
+/*
+ * Sets CX700 / VX700 and VX800 chipsets' TMDS (DVI) power state.
+ */
+static inline void
+viaTMDSSetPower(ScrnInfoPtr pScrn, Bool powerState)
+{
+    /* 3X5.D2[3] - Power Down (Active High) for DVI
+     *             0: TMDS power on
+     *             1: TMDS power down */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0xD2,
+                powerState ? 0x00 : BIT(3), BIT(3));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "TMDS (DVI) Power State: %s\n",
+                        powerState ? "On" : "Off"));
+}
+
+/*
+ * Sets CX700 / VX700 and VX800 chipsets' TMDS (DVI) sync polarity.
+ */
+static inline void
+viaTMDSSetSyncPolarity(ScrnInfoPtr pScrn, CARD8 syncPolarity)
+{
+    /* Set TMDS (DVI) sync polarity. */
+    /* 3X5.97[6] - DVI (TMDS) VSYNC Polarity
+     *             0: Positive
+     *             1: Negative
+     * 3X5.97[5] - DVI (TMDS) HSYNC Polarity
+     *             0: Positive
+     *             1: Negative */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x97,
+                syncPolarity << 5, BIT(6) | BIT(5));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "TMDS (DVI) Horizontal Sync Polarity: %s\n",
+                        (syncPolarity & BIT(0)) ? "-" : "+"));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "TMDS (DVI) Vertical Sync Polarity: %s\n",
+                        (syncPolarity & BIT(1)) ? "-" : "+"));
+}
+
+/*
+ * Sets TMDS (DVI) display source.
+ */
+static inline void
+viaTMDSSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource)
+{
+    /* Set integrated TMDS transmitter display output source.
+     * The integrated TMDS transmitter appears to utilize LVDS1's data
+     * source selection bit (3X5.99[4]). */
+    /* 3X5.99[4] - LVDS Channel1 Data Source Selection
+     *             0: Primary Display
+     *             1: Secondary Display */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x99,
+                displaySource << 4, BIT(4));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "TMDS (DVI) Display Source: IGA%d\n",
+                        (displaySource & 0x01) + 1));
+}
+
+/*
+ * Turn on / off display scaling engine.
+ */
+static inline void
+viaSetDisplayScaling(ScrnInfoPtr pScrn, Bool scalingState)
+{
+    /*
+     * 3X5.79[0] - LCD Scaling Enable
+     *             0: Disable
+     *             1: Enable
+     */
+    ViaCrtcMask(VGAHWPTR(pScrn), 0x79,
+                scalingState, BIT(0));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Display Scaling: %s\n",
+                        scalingState ? "On" : "Off"));
+}
+
 
 /* via_ums.c */
-void viaUnmapMMIO(ScrnInfoPtr pScrn);
 void viaDisableVQ(ScrnInfoPtr pScrn);
-Bool umsAccelInit(ScreenPtr pScreen);
-Bool umsCreate(ScrnInfoPtr pScrn);
-Bool umsPreInit(ScrnInfoPtr pScrn);
-Bool umsCrtcInit(ScrnInfoPtr pScrn);
+Bool viaUMSAccelInit(ScrnInfoPtr pScrn);
+Bool viaUMSMapIOResources(ScrnInfoPtr pScrn);
+void viaUMSDestroy(ScrnInfoPtr pScrn);
+Bool viaUMSScreenInit(ScrnInfoPtr pScrn);
+Bool viaUMSPreInit(ScrnInfoPtr pScrn);
+void viaUMSPreInitExit(ScrnInfoPtr pScrn);
+Bool viaUMSCrtcInit(ScrnInfoPtr pScrn);
+
+/* via_i2c.c */
+void ViaI2CInit(ScrnInfoPtr pScrn);
+Bool xf86I2CMaskByte(I2CDevPtr d, I2CByte subaddr,
+                        I2CByte value, I2CByte mask);
 
 /* via_output.c */
-void viaDIP0SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource);
-void viaDIP0EnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState);
-void viaDIP0SetClockDriveStrength(ScrnInfoPtr pScrn,
-                                    CARD8 clockDriveStrength);
-void viaDIP0SetDataDriveStrength(ScrnInfoPtr pScrn,
-                                    CARD8 dataDriveStrength);
-void viaDVP0SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource);
-void viaDVP0EnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState);
-void viaDVP0SetClockDriveStrength(ScrnInfoPtr pScrn,
-                                    CARD8 clockDriveStrength);
-void viaDVP0SetDataDriveStrength(ScrnInfoPtr pScrn,
-                                    CARD8 dataDriveStrength);
-void viaDVP1SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource);
-void viaDVP1EnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState);
-void viaDVP1SetClockDriveStrength(ScrnInfoPtr pScrn,
-                                    CARD8 clockDriveStrength);
-void viaDVP1SetDataDriveStrength(ScrnInfoPtr pScrn,
-                                    CARD8 dataDriveStrength);
-void viaDFPLowSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource);
-void viaDFPLowEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState);
-void viaOutputDetect(ScrnInfoPtr pScrn);
+void viaInitDisplay(ScrnInfoPtr pScrn);
 CARD32 ViaGetMemoryBandwidth(ScrnInfoPtr pScrn);
 CARD32 ViaModeDotClockTranslate(ScrnInfoPtr pScrn, DisplayModePtr mode);
-void viaProbePinStrapping(ScrnInfoPtr pScrn);
 void ViaSetPrimaryDotclock(ScrnInfoPtr pScrn, CARD32 clock);
 void ViaSetSecondaryDotclock(ScrnInfoPtr pScrn, CARD32 clock);
 void ViaSetUseExternalClock(vgaHWPtr hwp);
 
 /* via_display.c */
 void viaIGA2DisplayChannel(ScrnInfoPtr pScrn, Bool channelState);
-void viaDisplayInit(ScrnInfoPtr pScrn);
 void ViaGammaDisable(ScrnInfoPtr pScrn);
 void viaIGAInitCommon(ScrnInfoPtr pScrn);
 void viaIGA1Init(ScrnInfoPtr pScrn);
@@ -260,22 +1593,30 @@ void viaIGA2SetDisplayRegister(ScrnInfoPtr pScrn, DisplayModePtr mode);
 void viaIGA2Save(ScrnInfoPtr pScrn);
 void viaIGA2Restore(ScrnInfoPtr pScrn);
 void ViaShadowCRTCSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode);
+extern const xf86CrtcFuncsRec iga1_crtc_funcs;
+extern const xf86CrtcFuncsRec iga2_crtc_funcs;
 
 /* via_analog.c */
-void via_analog_init(ScrnInfoPtr pScrn);
+void viaAnalogProbe(ScrnInfoPtr pScrn);
+void viaAnalogInit(ScrnInfoPtr pScrn);
 
-/* via_lvds.c */
-void viaLVDS1SetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState);
-void via_lvds_init(ScrnInfoPtr pScrn);
+/* via_fp.c */
+void viaFPProbe(ScrnInfoPtr pScrn);
+void viaFPInit(ScrnInfoPtr pScrn);
 
 /* via_tmds.c */
+void viaExtTMDSIOPadState(ScrnInfoPtr pScrn, uint32_t diPort,
+                            Bool ioPadOn);
 void viaExtTMDSSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource);
 void viaExtTMDSEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState);
 void viaExtTMDSSetClockDriveStrength(ScrnInfoPtr pScrn,
                                         CARD8 clockDriveStrength);
 void viaExtTMDSSetDataDriveStrength(ScrnInfoPtr pScrn,
                                         CARD8 dataDriveStrength);
-void via_dvi_init(ScrnInfoPtr pScrn);
+void viaTMDSProbe(ScrnInfoPtr pScrn);
+void viaExtTMDSProbe(ScrnInfoPtr pScrn);
+void viaTMDSInit(ScrnInfoPtr pScrn);
+void viaExtTMDSInit(ScrnInfoPtr pScrn);
 
 /*via_tv.c */
 #ifdef HAVE_DEBUG
@@ -291,4 +1632,4 @@ void ViaVT162xInit(ScrnInfoPtr pScrn);
 I2CDevPtr ViaCH7xxxDetect(ScrnInfoPtr pScrn, I2CBusPtr pBus, CARD8 Address);
 void ViaCH7xxxInit(ScrnInfoPtr pScrn);
 
-#endif /* _VIA_BIOS_H_ */
+#endif /* _VIA_UMS_H_ */
diff --git a/src/via_vt162x.c b/src/via_vt162x.c
index 3bcfe18..41f7d78 100644
--- a/src/via_vt162x.c
+++ b/src/via_vt162x.c
@@ -36,12 +36,12 @@ ViaSetTVClockSource(xf86CrtcPtr crtc)
 	drmmode_crtc_private_ptr iga = crtc->driver_private;
 	ScrnInfoPtr pScrn = crtc->scrn;
 	VIAPtr pVia = VIAPTR(pScrn);
-	VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+	VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
 	vgaHWPtr hwp = VGAHWPTR(pScrn);
 
 	DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaSetTVClockSource\n"));
 
-    switch(pBIOSInfo->TVEncoder) {
+    switch(pVIADisplay->TVEncoder) {
         case VIA_VT1625:
             /* External TV: */
             switch(pVia->Chipset) {
@@ -80,15 +80,15 @@ ViaSetTVClockSource(xf86CrtcPtr crtc)
 static void
 VT162xPrintRegs(ScrnInfoPtr pScrn)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     CARD8 i, buf;
 
 
     xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Printing registers for %s\n",
-               pBIOSInfo->TVI2CDev->DevName);
+               pVIADisplay->TVI2CDev->DevName);
 
-    for (i = 0; i < pBIOSInfo->TVNumRegs; i++) {
-        xf86I2CReadByte(pBIOSInfo->TVI2CDev, i, &buf);
+    for (i = 0; i < pVIADisplay->TVNumRegs; i++) {
+        xf86I2CReadByte(pVIADisplay->TVI2CDev, i, &buf);
         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV%02X: 0x%02X\n", i, buf);
     }
 
@@ -99,7 +99,7 @@ VT162xPrintRegs(ScrnInfoPtr pScrn)
 I2CDevPtr
 ViaVT162xDetect(ScrnInfoPtr pScrn, I2CBusPtr pBus, CARD8 Address)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     I2CDevPtr pDev = xf86CreateI2CDevRec();
     CARD8 buf;
 
@@ -126,29 +126,29 @@ ViaVT162xDetect(ScrnInfoPtr pScrn, I2CBusPtr pBus, CARD8 Address)
         case 0x02:
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "Detected VIA Technologies VT1621 TV Encoder\n");
-            pBIOSInfo->TVEncoder = VIA_VT1621;
+            pVIADisplay->TVEncoder = VIA_VT1621;
             pDev->DevName = "VT1621";
             break;
         case 0x03:
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "Detected VIA Technologies VT1622 TV Encoder\n");
-            pBIOSInfo->TVEncoder = VIA_VT1622;
+            pVIADisplay->TVEncoder = VIA_VT1622;
             pDev->DevName = "VT1622";
             break;
         case 0x10:
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "Detected VIA Technologies VT1622A/VT1623 TV Encoder\n");
-            pBIOSInfo->TVEncoder = VIA_VT1623;
+            pVIADisplay->TVEncoder = VIA_VT1623;
             pDev->DevName = "VT1623";
             break;
         case 0x50:
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "Detected VIA Technologies VT1625 TV Encoder\n");
-            pBIOSInfo->TVEncoder = VIA_VT1625;
+            pVIADisplay->TVEncoder = VIA_VT1625;
             pDev->DevName = "VT1625";
             break;
         default:
-            pBIOSInfo->TVEncoder = VIA_NONETV;
+            pVIADisplay->TVEncoder = VIA_NONETV;
             xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                        "Unknown TV Encoder found at %s %X.\n",
                        pBus->BusName, Address);
@@ -165,25 +165,25 @@ static void
 VT162xSave(ScrnInfoPtr pScrn)
 {
     int i;
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT162xSave\n"));
 
-    for (i = 0; i < pBIOSInfo->TVNumRegs; i++)
-        xf86I2CReadByte(pBIOSInfo->TVI2CDev, i, &(pBIOSInfo->TVRegs[i]));
+    for (i = 0; i < pVIADisplay->TVNumRegs; i++)
+        xf86I2CReadByte(pVIADisplay->TVI2CDev, i, &(pVIADisplay->TVRegs[i]));
 
 }
 
 static void
 VT162xRestore(ScrnInfoPtr pScrn)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     int i;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT162xRestore\n"));
 
-    for (i = 0; i < pBIOSInfo->TVNumRegs; i++)
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, pBIOSInfo->TVRegs[i]);
+    for (i = 0; i < pVIADisplay->TVNumRegs; i++)
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, pVIADisplay->TVRegs[i]);
 }
 
 
@@ -252,35 +252,35 @@ VT1625DACSenseI2C(I2CDevPtr pDev)
 static Bool
 VT1621DACSense(ScrnInfoPtr pScrn)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     CARD8 sense;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621DACSense\n"));
 
-    sense = VT162xDACSenseI2C(pBIOSInfo->TVI2CDev);
+    sense = VT162xDACSenseI2C(pVIADisplay->TVI2CDev);
     switch (sense) {
         case 0x00:
-            pBIOSInfo->TVOutput = TVOUTPUT_SC;
+            pVIADisplay->TVOutput = TVOUTPUT_SC;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT1621: S-Video & Composite connected.\n");
             return TRUE;
         case 0x01:
-            pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE;
+            pVIADisplay->TVOutput = TVOUTPUT_COMPOSITE;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT1621: Composite connected.\n");
             return TRUE;
         case 0x02:
-            pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO;
+            pVIADisplay->TVOutput = TVOUTPUT_SVIDEO;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT1621: S-Video connected.\n");
             return TRUE;
         case 0x03:
-            pBIOSInfo->TVOutput = TVOUTPUT_NONE;
+            pVIADisplay->TVOutput = TVOUTPUT_NONE;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT1621: Nothing connected.\n");
             return FALSE;
         default:
-            pBIOSInfo->TVOutput = TVOUTPUT_NONE;
+            pVIADisplay->TVOutput = TVOUTPUT_NONE;
             xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                        "VT1621: Unknown cable combination: 0x0%2X.\n", sense);
             return FALSE;
@@ -293,45 +293,45 @@ VT1621DACSense(ScrnInfoPtr pScrn)
 static Bool
 VT1622DACSense(ScrnInfoPtr pScrn)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     CARD8 sense;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622DACSense\n"));
 
-    sense = VT162xDACSenseI2C(pBIOSInfo->TVI2CDev);
+    sense = VT162xDACSenseI2C(pVIADisplay->TVI2CDev);
     switch (sense) {
         case 0x00:  /* DAC A,B,C,D */
-            pBIOSInfo->TVOutput = TVOUTPUT_RGB;
+            pVIADisplay->TVOutput = TVOUTPUT_RGB;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT162x: RGB connected.\n");
             return TRUE;
         case 0x01:  /* DAC A,B,C */
-            pBIOSInfo->TVOutput = TVOUTPUT_SC;
+            pVIADisplay->TVOutput = TVOUTPUT_SC;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT162x: S-Video & Composite connected.\n");
             return TRUE;
         case 0x07:  /* DAC A */
-            pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE;
+            pVIADisplay->TVOutput = TVOUTPUT_COMPOSITE;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT162x: Composite connected.\n");
             return TRUE;
         case 0x08:  /* DAC B,C,D */
-            pBIOSInfo->TVOutput = TVOUTPUT_YCBCR;
+            pVIADisplay->TVOutput = TVOUTPUT_YCBCR;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT162x: YcBcR connected.\n");
             return TRUE;
         case 0x09:  /* DAC B,C */
-            pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO;
+            pVIADisplay->TVOutput = TVOUTPUT_SVIDEO;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT162x: S-Video connected.\n");
             return TRUE;
         case 0x0F:
-            pBIOSInfo->TVOutput = TVOUTPUT_NONE;
+            pVIADisplay->TVOutput = TVOUTPUT_NONE;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT162x: Nothing connected.\n");
             return FALSE;
         default:
-            pBIOSInfo->TVOutput = TVOUTPUT_NONE;
+            pVIADisplay->TVOutput = TVOUTPUT_NONE;
             xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                        "VT162x: Unknown cable combination: 0x0%2X.\n", sense);
             return FALSE;
@@ -344,45 +344,45 @@ VT1622DACSense(ScrnInfoPtr pScrn)
 static Bool
 VT1625DACSense(ScrnInfoPtr pScrn)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     CARD8 sense;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1625DACSense\n"));
 
-    sense = VT1625DACSenseI2C(pBIOSInfo->TVI2CDev);
+    sense = VT1625DACSenseI2C(pVIADisplay->TVI2CDev);
     switch (sense) {
         case 0x00:  /* DAC A,B,C,D,E,F */
-            pBIOSInfo->TVOutput = TVOUTPUT_RGB;
+            pVIADisplay->TVOutput = TVOUTPUT_RGB;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT1625: RGB connected.\n");
             return TRUE;
         case 0x07:  /* DAC A,B,C */
-            pBIOSInfo->TVOutput = TVOUTPUT_SC;
+            pVIADisplay->TVOutput = TVOUTPUT_SC;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT1625: S-Video & Composite connected.\n");
             return TRUE;
         case 0x37:  /* DAC C */
-            pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE;
+            pVIADisplay->TVOutput = TVOUTPUT_COMPOSITE;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT1625: Composite connected.\n");
             return TRUE;
         case 0x38:  /* DAC D,E,F */
-            pBIOSInfo->TVOutput = TVOUTPUT_YCBCR;
+            pVIADisplay->TVOutput = TVOUTPUT_YCBCR;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT1625: YCbCr connected.\n");
             return TRUE;
         case 0x0F:  /* DAC A,B */
-            pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO;
+            pVIADisplay->TVOutput = TVOUTPUT_SVIDEO;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT1625: S-Video connected.\n");
             return TRUE;
         case 0x3F:
-            pBIOSInfo->TVOutput = TVOUTPUT_NONE;
+            pVIADisplay->TVOutput = TVOUTPUT_NONE;
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                        "VT1625: Nothing connected.\n");
             return FALSE;
         default:
-            pBIOSInfo->TVOutput = TVOUTPUT_NONE;
+            pVIADisplay->TVOutput = TVOUTPUT_NONE;
             xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                        "VT1625: Unknown cable combination: 0x0%2X.\n", sense);
             return FALSE;
@@ -392,7 +392,7 @@ VT1625DACSense(ScrnInfoPtr pScrn)
 static CARD8
 VT1621ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     int i;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621ModeIndex\n"));
@@ -400,7 +400,7 @@ VT1621ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
     for (i = 0; VT1621Table[i].Width; i++) {
         if ((VT1621Table[i].Width == mode->CrtcHDisplay) &&
             (VT1621Table[i].Height == mode->CrtcVDisplay) &&
-            (VT1621Table[i].Standard == pBIOSInfo->TVType) &&
+            (VT1621Table[i].Standard == pVIADisplay->TVType) &&
             !(strcmp(VT1621Table[i].name, mode->name)))
             return i;
     }
@@ -412,7 +412,7 @@ VT1621ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
 static ModeStatus
 VT1621ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621ModeValid\n"));
 
@@ -424,12 +424,12 @@ VT1621ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode)
         return MODE_BAD;
     }
 
-    if ((pBIOSInfo->TVType == TVTYPE_NTSC) &&
+    if ((pVIADisplay->TVType == TVTYPE_NTSC) &&
         (mode->Private != (void *)&VT162xModePrivateNTSC)) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                    "TV standard is NTSC. This is a PAL mode.\n");
         return MODE_BAD;
-    } else if ((pBIOSInfo->TVType == TVTYPE_PAL) &&
+    } else if ((pVIADisplay->TVType == TVTYPE_PAL) &&
                (mode->Private != (void *)&VT162xModePrivatePAL)) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                    "TV standard is PAL. This is a NTSC mode.\n");
@@ -444,15 +444,15 @@ VT1621ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode)
 static CARD8
 VT1622ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     struct VT162XTableRec *Table;
     int i;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622ModeIndex\n"));
 
-    if (pBIOSInfo->TVEncoder == VIA_VT1622)
+    if (pVIADisplay->TVEncoder == VIA_VT1622)
         Table = VT1622Table;
-    else if (pBIOSInfo->TVEncoder == VIA_VT1625)
+    else if (pVIADisplay->TVEncoder == VIA_VT1625)
         Table = VT1625Table;
     else
         Table = VT1623Table;
@@ -462,12 +462,12 @@ VT1622ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
                    "width=%d:%d, height=%d:%d, std=%d:%d, name=%s:%s.\n",
                    Table[i].Width, mode->CrtcHDisplay,
                    Table[i].Height, mode->CrtcVDisplay,
-                   Table[i].Standard, pBIOSInfo->TVType,
+                   Table[i].Standard, pVIADisplay->TVType,
                    Table[i].name, mode->name);
 
         if ((Table[i].Width == mode->CrtcHDisplay) &&
             (Table[i].Height == mode->CrtcVDisplay) &&
-            (Table[i].Standard == pBIOSInfo->TVType) &&
+            (Table[i].Standard == pVIADisplay->TVType) &&
             !strcmp(Table[i].name, mode->name))
             return i;
     }
@@ -479,7 +479,7 @@ VT1622ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
 static ModeStatus
 VT1622ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622ModeValid\n"));
 
@@ -491,12 +491,12 @@ VT1622ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode)
         return MODE_BAD;
     }
 
-    if ((pBIOSInfo->TVType == TVTYPE_NTSC) &&
+    if ((pVIADisplay->TVType == TVTYPE_NTSC) &&
         (mode->Private != (void *)&VT162xModePrivateNTSC)) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                    "TV standard is NTSC. This is a PAL mode.\n");
         return MODE_BAD;
-    } else if ((pBIOSInfo->TVType == TVTYPE_PAL) &&
+    } else if ((pVIADisplay->TVType == TVTYPE_PAL) &&
                (mode->Private != (void *)&VT162xModePrivatePAL)) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                    "TV standard is PAL. This is a NTSC mode.\n");
@@ -511,7 +511,7 @@ VT1622ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode)
 static ModeStatus
 VT1625ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1625ModeValid\n"));
 
@@ -527,32 +527,32 @@ VT1625ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode)
         return MODE_BAD;
     }
 
-    if ((pBIOSInfo->TVType == TVTYPE_NTSC) &&
+    if ((pVIADisplay->TVType == TVTYPE_NTSC) &&
         (mode->Private != (void *)&VT162xModePrivateNTSC)) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                    "TV standard is NTSC. This is an incompatible mode.\n");
         return MODE_BAD;
-    } else if ((pBIOSInfo->TVType == TVTYPE_PAL) &&
+    } else if ((pVIADisplay->TVType == TVTYPE_PAL) &&
                (mode->Private != (void *)&VT162xModePrivatePAL)) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                    "TV standard is PAL. This is an incompatible mode.\n");
         return MODE_BAD;
-    } else if ((pBIOSInfo->TVType == TVTYPE_480P) &&
+    } else if ((pVIADisplay->TVType == TVTYPE_480P) &&
                (mode->Private != (void *)&VT162xModePrivate480P)) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                    "TV standard is 480P. This is an incompatible mode.\n");
         return MODE_BAD;
-    } else if ((pBIOSInfo->TVType == TVTYPE_576P) &&
+    } else if ((pVIADisplay->TVType == TVTYPE_576P) &&
                (mode->Private != (void *)&VT162xModePrivate576P)) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                    "TV standard is 576P. This is an incompatible mode.\n");
         return MODE_BAD;
-    } else if ((pBIOSInfo->TVType == TVTYPE_720P) &&
+    } else if ((pVIADisplay->TVType == TVTYPE_720P) &&
                (mode->Private != (void *)&VT162xModePrivate720P)) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                    "TV standard is 720P. This is an incompatible mode.\n");
         return MODE_BAD;
-    } else if ((pBIOSInfo->TVType == TVTYPE_1080I) &&
+    } else if ((pVIADisplay->TVType == TVTYPE_1080I) &&
                (mode->Private != (void *)&VT162xModePrivate1080I)) {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                    "TV standard is 1080I. This is an incompatible mode.\n");
@@ -577,45 +577,45 @@ VT162xSetSubCarrier(I2CDevPtr pDev, CARD32 SubCarrier)
 static void
 VT1621ModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     struct VT1621TableRec Table = VT1621Table[VT1621ModeIndex(pScrn, mode)];
     CARD8 i;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621ModeI2C\n"));
 
     for (i = 0; i < 0x16; i++)
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, Table.TV[i]);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, Table.TV[i]);
 
-    VT162xSetSubCarrier(pBIOSInfo->TVI2CDev, Table.SubCarrier);
+    VT162xSetSubCarrier(pVIADisplay->TVI2CDev, Table.SubCarrier);
 
     /* Skip reserved (1A) and version ID (1B). */
-    xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1C, Table.TV[0x1C]);
+    xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1C, Table.TV[0x1C]);
 
     /* Skip software reset (1D). */
     for (i = 0x1E; i < 0x24; i++)
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, Table.TV[i]);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, Table.TV[i]);
 
     /* Write some zeroes? */
-    xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x24, 0x00);
+    xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x24, 0x00);
     for (i = 0; i < 0x08; i++)
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4A + i, 0x00);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4A + i, 0x00);
 
-    if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE)
+    if (pVIADisplay->TVOutput == TVOUTPUT_COMPOSITE)
         for (i = 0; i < 0x10; i++)
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x52 + i, Table.TVC[i]);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x52 + i, Table.TVC[i]);
     else
         for (i = 0; i < 0x10; i++)
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x52 + i, Table.TVS[i]);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x52 + i, Table.TVS[i]);
 
     /* Turn on all Composite and S-Video output. */
-    xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00);
+    xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x00);
 
-    if (pBIOSInfo->TVDotCrawl) {
+    if (pVIADisplay->TVDotCrawl) {
         if (Table.DotCrawlSubCarrier) {
-            xf86I2CReadByte(pBIOSInfo->TVI2CDev, 0x11, &i);
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x11, i | 0x08);
+            xf86I2CReadByte(pVIADisplay->TVI2CDev, 0x11, &i);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x11, i | 0x08);
 
-            VT162xSetSubCarrier(pBIOSInfo->TVI2CDev, Table.DotCrawlSubCarrier);
+            VT162xSetSubCarrier(pVIADisplay->TVI2CDev, Table.DotCrawlSubCarrier);
         } else
             xf86DrvMsg(pScrn->scrnIndex, X_INFO, "This mode does not currently "
                        "support DotCrawl suppression.\n");
@@ -628,7 +628,7 @@ VT1621ModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode)
 	ScrnInfoPtr pScrn = crtc->scrn;
 	vgaHWPtr hwp = VGAHWPTR(pScrn);
 	VIAPtr pVia = VIAPTR(pScrn);
-	VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+	VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
 	struct VT1621TableRec Table = VT1621Table[VT1621ModeIndex(pScrn, mode)];
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621ModeCrtc\n"));
@@ -647,7 +647,7 @@ VT1621ModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode)
         hwp->writeCrtc(hwp, 0x6B, 0x80);
         hwp->writeCrtc(hwp, 0x6C, Table.PrimaryCR6C);
     }
-    pBIOSInfo->ClockExternal = TRUE;
+    pVIADisplay->ClockExternal = TRUE;
     ViaCrtcMask(hwp, 0x6A, 0x40, 0x40);
     ViaCrtcMask(hwp, 0x6C, 0x01, 0x01);
 }
@@ -658,99 +658,99 @@ VT1621ModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode)
 static void
 VT1622ModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
     struct VT162XTableRec Table;
     CARD8 save, i;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622ModeI2C\n"));
 
-    if (pBIOSInfo->TVEncoder == VIA_VT1622)
+    if (pVIADisplay->TVEncoder == VIA_VT1622)
         Table = VT1622Table[VT1622ModeIndex(pScrn, mode)];
-    else if (pBIOSInfo->TVEncoder == VIA_VT1625)
+    else if (pVIADisplay->TVEncoder == VIA_VT1625)
         Table = VT1625Table[VT1622ModeIndex(pScrn, mode)];
     else        /* VT1622A/VT1623 */
         Table = VT1623Table[VT1622ModeIndex(pScrn, mode)];
 
     /* TV reset. */
-    xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1D, 0x00);
-    xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1D, 0x80);
+    xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1D, 0x00);
+    xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1D, 0x80);
 
     for (i = 0; i < 0x16; i++)
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, Table.TV1[i]);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, Table.TV1[i]);
 
-    VT162xSetSubCarrier(pBIOSInfo->TVI2CDev, Table.SubCarrier);
+    VT162xSetSubCarrier(pVIADisplay->TVI2CDev, Table.SubCarrier);
 
-    xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1A, Table.TV1[0x1A]);
+    xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1A, Table.TV1[0x1A]);
 
     /* Skip version ID. */
-    xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1C, Table.TV1[0x1C]);
+    xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1C, Table.TV1[0x1C]);
 
     /* Skip software reset. */
     for (i = 0x1E; i < 0x30; i++)
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, Table.TV1[i]);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, Table.TV1[i]);
 
     for (i = 0; i < 0x1B; i++)
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4A + i, Table.TV2[i]);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4A + i, Table.TV2[i]);
 
     /* Turn on all Composite and S-Video output. */
-    xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00);
+    xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x00);
 
-    if (pBIOSInfo->TVDotCrawl) {
+    if (pVIADisplay->TVDotCrawl) {
         if (Table.DotCrawlSubCarrier) {
-            xf86I2CReadByte(pBIOSInfo->TVI2CDev, 0x11, &save);
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x11, save | 0x08);
+            xf86I2CReadByte(pVIADisplay->TVI2CDev, 0x11, &save);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x11, save | 0x08);
 
-            VT162xSetSubCarrier(pBIOSInfo->TVI2CDev, Table.DotCrawlSubCarrier);
+            VT162xSetSubCarrier(pVIADisplay->TVI2CDev, Table.DotCrawlSubCarrier);
         } else
             xf86DrvMsg(pScrn->scrnIndex, X_INFO, "This mode does not currently "
                        "support DotCrawl suppression.\n");
     }
 
-    if (pBIOSInfo->TVOutput == TVOUTPUT_RGB) {
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x02, 0x2A);
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x65, Table.RGB[0]);
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x66, Table.RGB[1]);
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x67, Table.RGB[2]);
+    if (pVIADisplay->TVOutput == TVOUTPUT_RGB) {
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x02, 0x2A);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x65, Table.RGB[0]);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x66, Table.RGB[1]);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x67, Table.RGB[2]);
         if (Table.RGB[3])
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x27, Table.RGB[3]);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x27, Table.RGB[3]);
         if (Table.RGB[4])
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x2B, Table.RGB[4]);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x2B, Table.RGB[4]);
         if (Table.RGB[5])
-            xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x2C, Table.RGB[5]);
-        if (pBIOSInfo->TVEncoder == VIA_VT1625) {
-            if (pBIOSInfo->TVType < TVTYPE_480P) {
-                xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x02, 0x12);
-                xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x23, 0x7E);
-                xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4A, 0x85);
-                xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4B, 0x0A);
-                xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4E, 0x00);
+            xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x2C, Table.RGB[5]);
+        if (pVIADisplay->TVEncoder == VIA_VT1625) {
+            if (pVIADisplay->TVType < TVTYPE_480P) {
+                xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x02, 0x12);
+                xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x23, 0x7E);
+                xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4A, 0x85);
+                xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4B, 0x0A);
+                xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4E, 0x00);
             } else {
-                xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x02, 0x12);
-                xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4A, 0x85);
-                xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4B, 0x0A);
+                xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x02, 0x12);
+                xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4A, 0x85);
+                xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4B, 0x0A);
             }
         }
-    } else if (pBIOSInfo->TVOutput == TVOUTPUT_YCBCR) {
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x02, 0x03);
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x65, Table.YCbCr[0]);
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x66, Table.YCbCr[1]);
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x67, Table.YCbCr[2]);
-        if (pBIOSInfo->TVEncoder == VIA_VT1625) {
-            if (pBIOSInfo->TVType < TVTYPE_480P) {
-                xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x23, 0x7E);
-                xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4E, 0x00);
+    } else if (pVIADisplay->TVOutput == TVOUTPUT_YCBCR) {
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x02, 0x03);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x65, Table.YCbCr[0]);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x66, Table.YCbCr[1]);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x67, Table.YCbCr[2]);
+        if (pVIADisplay->TVEncoder == VIA_VT1625) {
+            if (pVIADisplay->TVType < TVTYPE_480P) {
+                xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x23, 0x7E);
+                xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4E, 0x00);
             }
         }
     }
 
     /* Configure flicker filter. */
-    xf86I2CReadByte(pBIOSInfo->TVI2CDev, 0x03, &save);
+    xf86I2CReadByte(pVIADisplay->TVI2CDev, 0x03, &save);
     save &= 0xFC;
-    if (pBIOSInfo->TVDeflicker == 1)
+    if (pVIADisplay->TVDeflicker == 1)
         save |= 0x01;
-    else if (pBIOSInfo->TVDeflicker == 2)
+    else if (pVIADisplay->TVDeflicker == 2)
         save |= 0x02;
-    xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x03, save);
+    xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x03, save);
 }
 
 /*
@@ -762,14 +762,14 @@ VT1622ModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode)
 	ScrnInfoPtr pScrn = crtc->scrn;
 	vgaHWPtr hwp = VGAHWPTR(pScrn);
 	VIAPtr pVia = VIAPTR(pScrn);
-	VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+	VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
 	struct VT162XTableRec Table;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622ModeCrtc\n"));
 
-    if (pBIOSInfo->TVEncoder == VIA_VT1622)
+    if (pVIADisplay->TVEncoder == VIA_VT1622)
         Table = VT1622Table[VT1622ModeIndex(pScrn, mode)];
-    else if (pBIOSInfo->TVEncoder == VIA_VT1625)
+    else if (pVIADisplay->TVEncoder == VIA_VT1625)
         Table = VT1625Table[VT1622ModeIndex(pScrn, mode)];
     else        /* VT1622A/VT1623 */
         Table = VT1623Table[VT1622ModeIndex(pScrn, mode)];
@@ -806,7 +806,7 @@ VT1622ModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode)
                 hwp->writeCrtc(hwp, 0x6C, Table.PrimaryCR6C);
         }
     }
-    pBIOSInfo->ClockExternal = TRUE;
+    pVIADisplay->ClockExternal = TRUE;
     ViaCrtcMask(hwp, 0x6A, 0x40, 0x40);
     ViaSetTVClockSource(crtc);
 }
@@ -815,102 +815,102 @@ VT1622ModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode)
 static void
 VT1621Power(ScrnInfoPtr pScrn, Bool On)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621Power\n"));
 
     if (On)
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x00);
     else
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x03);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x03);
 }
 
 static void
 VT1622Power(ScrnInfoPtr pScrn, Bool On)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622Power\n"));
 
     if (On)
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x00);
     else
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x0F);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x0F);
 }
 
 static void
 VT1625Power(ScrnInfoPtr pScrn, Bool On)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1625Power\n"));
 
     if (On)
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x00);
     else
-        xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x3F);
+        xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x3F);
 }
 
 
 void
 ViaVT162xInit(ScrnInfoPtr pScrn)
 {
-    VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
+    VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVT162xInit\n"));
 
-    switch (pBIOSInfo->TVEncoder) {
+    switch (pVIADisplay->TVEncoder) {
         case VIA_VT1621:
-            pBIOSInfo->TVSave = VT162xSave;
-            pBIOSInfo->TVRestore = VT162xRestore;
-            pBIOSInfo->TVDACSense = VT1621DACSense;
-            pBIOSInfo->TVModeValid = VT1621ModeValid;
-            pBIOSInfo->TVModeI2C = VT1621ModeI2C;
-            pBIOSInfo->TVModeCrtc = VT1621ModeCrtc;
-            pBIOSInfo->TVPower = VT1621Power;
-            pBIOSInfo->TVModes = VT1621Modes;
-            pBIOSInfo->TVNumModes = sizeof(VT1621Modes) / sizeof(DisplayModeRec);
-            pBIOSInfo->TVPrintRegs = VT162xPrintRegs;
-            pBIOSInfo->TVNumRegs = 0x68;
+            pVIADisplay->TVSave = VT162xSave;
+            pVIADisplay->TVRestore = VT162xRestore;
+            pVIADisplay->TVDACSense = VT1621DACSense;
+            pVIADisplay->TVModeValid = VT1621ModeValid;
+            pVIADisplay->TVModeI2C = VT1621ModeI2C;
+            pVIADisplay->TVModeCrtc = VT1621ModeCrtc;
+            pVIADisplay->TVPower = VT1621Power;
+            pVIADisplay->TVModes = VT1621Modes;
+            pVIADisplay->TVNumModes = sizeof(VT1621Modes) / sizeof(DisplayModeRec);
+            pVIADisplay->TVPrintRegs = VT162xPrintRegs;
+            pVIADisplay->TVNumRegs = 0x68;
             break;
         case VIA_VT1622:
-            pBIOSInfo->TVSave = VT162xSave;
-            pBIOSInfo->TVRestore = VT162xRestore;
-            pBIOSInfo->TVDACSense = VT1622DACSense;
-            pBIOSInfo->TVModeValid = VT1622ModeValid;
-            pBIOSInfo->TVModeI2C = VT1622ModeI2C;
-            pBIOSInfo->TVModeCrtc = VT1622ModeCrtc;
-            pBIOSInfo->TVPower = VT1622Power;
-            pBIOSInfo->TVModes = VT1622Modes;
-            pBIOSInfo->TVNumModes = sizeof(VT1622Modes) / sizeof(DisplayModeRec);
-            pBIOSInfo->TVPrintRegs = VT162xPrintRegs;
-            pBIOSInfo->TVNumRegs = 0x68;
+            pVIADisplay->TVSave = VT162xSave;
+            pVIADisplay->TVRestore = VT162xRestore;
+            pVIADisplay->TVDACSense = VT1622DACSense;
+            pVIADisplay->TVModeValid = VT1622ModeValid;
+            pVIADisplay->TVModeI2C = VT1622ModeI2C;
+            pVIADisplay->TVModeCrtc = VT1622ModeCrtc;
+            pVIADisplay->TVPower = VT1622Power;
+            pVIADisplay->TVModes = VT1622Modes;
+            pVIADisplay->TVNumModes = sizeof(VT1622Modes) / sizeof(DisplayModeRec);
+            pVIADisplay->TVPrintRegs = VT162xPrintRegs;
+            pVIADisplay->TVNumRegs = 0x68;
             break;
         case VIA_VT1623:
-            pBIOSInfo->TVSave = VT162xSave;
-            pBIOSInfo->TVRestore = VT162xRestore;
-            pBIOSInfo->TVDACSense = VT1622DACSense;
-            pBIOSInfo->TVModeValid = VT1622ModeValid;
-            pBIOSInfo->TVModeI2C = VT1622ModeI2C;
-            pBIOSInfo->TVModeCrtc = VT1622ModeCrtc;
-            pBIOSInfo->TVPower = VT1622Power;
-            pBIOSInfo->TVModes = VT1623Modes;
-            pBIOSInfo->TVNumModes = sizeof(VT1623Modes) / sizeof(DisplayModeRec);
-            pBIOSInfo->TVPrintRegs = VT162xPrintRegs;
-            pBIOSInfo->TVNumRegs = 0x6C;
+            pVIADisplay->TVSave = VT162xSave;
+            pVIADisplay->TVRestore = VT162xRestore;
+            pVIADisplay->TVDACSense = VT1622DACSense;
+            pVIADisplay->TVModeValid = VT1622ModeValid;
+            pVIADisplay->TVModeI2C = VT1622ModeI2C;
+            pVIADisplay->TVModeCrtc = VT1622ModeCrtc;
+            pVIADisplay->TVPower = VT1622Power;
+            pVIADisplay->TVModes = VT1623Modes;
+            pVIADisplay->TVNumModes = sizeof(VT1623Modes) / sizeof(DisplayModeRec);
+            pVIADisplay->TVPrintRegs = VT162xPrintRegs;
+            pVIADisplay->TVNumRegs = 0x6C;
             break;
         case VIA_VT1625:
-            pBIOSInfo->TVSave = VT162xSave;
-            pBIOSInfo->TVRestore = VT162xRestore;
-            pBIOSInfo->TVDACSense = VT1625DACSense;
-            pBIOSInfo->TVModeValid = VT1625ModeValid;
-            pBIOSInfo->TVModeI2C = VT1622ModeI2C;
-            pBIOSInfo->TVModeCrtc = VT1622ModeCrtc;
-            pBIOSInfo->TVPower = VT1625Power;
-            pBIOSInfo->TVModes = VT1625Modes;
-            pBIOSInfo->TVNumModes = sizeof(VT1625Modes) / sizeof(DisplayModeRec);
-            pBIOSInfo->TVPrintRegs = VT162xPrintRegs;
-            pBIOSInfo->TVNumRegs = 0x82;
+            pVIADisplay->TVSave = VT162xSave;
+            pVIADisplay->TVRestore = VT162xRestore;
+            pVIADisplay->TVDACSense = VT1625DACSense;
+            pVIADisplay->TVModeValid = VT1625ModeValid;
+            pVIADisplay->TVModeI2C = VT1622ModeI2C;
+            pVIADisplay->TVModeCrtc = VT1622ModeCrtc;
+            pVIADisplay->TVPower = VT1625Power;
+            pVIADisplay->TVModes = VT1625Modes;
+            pVIADisplay->TVNumModes = sizeof(VT1625Modes) / sizeof(DisplayModeRec);
+            pVIADisplay->TVPrintRegs = VT162xPrintRegs;
+            pVIADisplay->TVNumRegs = 0x82;
             break;
         default:
             break;
diff --git a/src/via_vt162x.h b/src/via_vt162x.h
index f5ae92e..9a1e277 100644
--- a/src/via_vt162x.h
+++ b/src/via_vt162x.h
@@ -68,7 +68,7 @@ static DisplayModeRec VT1621Modes[] = {
 };
 
 struct VT1621TableRec {
-    char *  name;
+    const char* name;
     CARD16  Width;
     CARD16  Height;
     int     Standard;
@@ -187,7 +187,7 @@ static DisplayModeRec VT1622Modes[] = {
 };
 
 struct VT162XTableRec {
-    char *  name;
+    const char* name;
     CARD16  Width;
     CARD16  Height;
     int     Standard;
diff --git a/src/via_vt1632.c b/src/via_vt1632.c
index 1fe58aa..bc1b810 100644
--- a/src/via_vt1632.c
+++ b/src/via_vt1632.c
@@ -30,6 +30,7 @@
 #endif
 
 #include "via_driver.h"
+#include "via_ums.h"
 #include "via_vt1632.h"
 
 static void
@@ -130,17 +131,17 @@ viaVT1632Power(ScrnInfoPtr pScrn, I2CDevPtr pDev, Bool powerState)
 
 static void
 viaVT1632SaveRegisters(ScrnInfoPtr pScrn, I2CDevPtr pDev,
-                        viaVT1632RecPtr pVIAVT1632Rec)
+                        viaVT1632RecPtr pVIAVT1632)
 {
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaVT1632SaveRegisters.\n"));
 
     xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                 "Saving VT1632 registers.\n");
-    xf86I2CReadByte(pDev, 0x08, &pVIAVT1632Rec->Register08);
-    xf86I2CReadByte(pDev, 0x09, &pVIAVT1632Rec->Register09);
-    xf86I2CReadByte(pDev, 0x0A, &pVIAVT1632Rec->Register0A);
-    xf86I2CReadByte(pDev, 0x0C, &pVIAVT1632Rec->Register0C);
+    xf86I2CReadByte(pDev, 0x08, &pVIAVT1632->Register08);
+    xf86I2CReadByte(pDev, 0x09, &pVIAVT1632->Register09);
+    xf86I2CReadByte(pDev, 0x0A, &pVIAVT1632->Register0A);
+    xf86I2CReadByte(pDev, 0x0C, &pVIAVT1632->Register0C);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting viaVT1632SaveRegisters.\n"));
@@ -148,17 +149,17 @@ viaVT1632SaveRegisters(ScrnInfoPtr pScrn, I2CDevPtr pDev,
 
 static void
 viaVT1632RestoreRegisters(ScrnInfoPtr pScrn, I2CDevPtr pDev,
-                            viaVT1632RecPtr pVIAVT1632Rec)
+                            viaVT1632RecPtr pVIAVT1632)
 {
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered viaVT1632RestoreRegisters.\n"));
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Restoring VT1632 registers.\n"));
-    xf86I2CWriteByte(pDev, 0x08, pVIAVT1632Rec->Register08);
-    xf86I2CWriteByte(pDev, 0x09, pVIAVT1632Rec->Register09);
-    xf86I2CWriteByte(pDev, 0x0A, pVIAVT1632Rec->Register0A);
-    xf86I2CWriteByte(pDev, 0x0C, pVIAVT1632Rec->Register0C);
+    xf86I2CWriteByte(pDev, 0x08, pVIAVT1632->Register08);
+    xf86I2CWriteByte(pDev, 0x09, pVIAVT1632->Register09);
+    xf86I2CWriteByte(pDev, 0x0A, pVIAVT1632->Register0A);
+    xf86I2CWriteByte(pDev, 0x0C, pVIAVT1632->Register0C);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting viaVT1632RestoreRegisters.\n"));
@@ -167,25 +168,19 @@ viaVT1632RestoreRegisters(ScrnInfoPtr pScrn, I2CDevPtr pDev,
 static int
 viaVT1632CheckModeValidity(xf86OutputPtr output, DisplayModePtr pMode)
 {
-    ScrnInfoPtr pScrn = output->scrn;
-    viaVT1632RecPtr pVIAVT1632Rec = output->driver_private;
+    viaVT1632RecPtr pVIAVT1632 = output->driver_private;
     int status = MODE_OK;
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
-                        "Entered viaVT1632CheckModeValidity.\n"));
-
-    if (pMode->Clock < pVIAVT1632Rec->DotclockMin) {
+    if (pMode->Clock < pVIAVT1632->DotclockMin) {
         status = MODE_CLOCK_LOW;
         goto exit;
     }
 
-    if (pMode->Clock > pVIAVT1632Rec->DotclockMax) {
+    if (pMode->Clock > pVIAVT1632->DotclockMax) {
         status = MODE_CLOCK_HIGH;
     }
 
 exit:
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Exiting viaVT1632CheckModeValidity.\n"));
     return status;
 }
 
@@ -198,19 +193,21 @@ static void
 via_vt1632_dpms(xf86OutputPtr output, int mode)
 {
     ScrnInfoPtr pScrn = output->scrn;
-    viaVT1632RecPtr pVIAVT1632Rec = output->driver_private;
+    viaVT1632RecPtr pVIAVT1632 = output->driver_private;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered via_vt1632_dpms.\n"));
 
     switch (mode) {
     case DPMSModeOn:
-        viaVT1632Power(pScrn, pVIAVT1632Rec->VT1632I2CDev, TRUE);
+        viaVT1632Power(pScrn, pVIAVT1632->VT1632I2CDev, TRUE);
+        viaExtTMDSIOPadState(pScrn, pVIAVT1632->diPort, TRUE);
         break;
     case DPMSModeStandby:
     case DPMSModeSuspend:
     case DPMSModeOff:
-        viaVT1632Power(pScrn, pVIAVT1632Rec->VT1632I2CDev, FALSE);
+        viaVT1632Power(pScrn, pVIAVT1632->VT1632I2CDev, FALSE);
+        viaExtTMDSIOPadState(pScrn, pVIAVT1632->diPort, FALSE);
         break;
     default:
         break;
@@ -224,12 +221,12 @@ static void
 via_vt1632_save(xf86OutputPtr output)
 {
     ScrnInfoPtr pScrn = output->scrn;
-    viaVT1632RecPtr pVIAVT1632Rec = output->driver_private;
+    viaVT1632RecPtr pVIAVT1632 = output->driver_private;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered via_vt1632_save.\n"));
 
-    viaVT1632SaveRegisters(pScrn, pVIAVT1632Rec->VT1632I2CDev, pVIAVT1632Rec);
+    viaVT1632SaveRegisters(pScrn, pVIAVT1632->VT1632I2CDev, pVIAVT1632);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting via_vt1632_save.\n"));
@@ -239,13 +236,13 @@ static void
 via_vt1632_restore(xf86OutputPtr output)
 {
     ScrnInfoPtr pScrn = output->scrn;
-    viaVT1632RecPtr pVIAVT1632Rec = output->driver_private;
+    viaVT1632RecPtr pVIAVT1632 = output->driver_private;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered via_vt1632_restore.\n"));
 
-    viaVT1632RestoreRegisters(pScrn, pVIAVT1632Rec->VT1632I2CDev,
-                                pVIAVT1632Rec);
+    viaVT1632RestoreRegisters(pScrn, pVIAVT1632->VT1632I2CDev,
+                                pVIAVT1632);
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting via_vt1632_restore.\n"));
@@ -267,11 +264,33 @@ via_vt1632_mode_fixup(xf86OutputPtr output, DisplayModePtr mode,
 static void
 via_vt1632_prepare(xf86OutputPtr output)
 {
+    ScrnInfoPtr pScrn = output->scrn;
+    viaVT1632RecPtr pVIAVT1632 = output->driver_private;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+    viaVT1632Power(pScrn, pVIAVT1632->VT1632I2CDev, FALSE);
+    viaExtTMDSIOPadState(pScrn, pVIAVT1632->diPort, FALSE);
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
 }
 
 static void
 via_vt1632_commit(xf86OutputPtr output)
 {
+    ScrnInfoPtr pScrn = output->scrn;
+    viaVT1632RecPtr pVIAVT1632 = output->driver_private;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+    viaVT1632Power(pScrn, pVIAVT1632->VT1632I2CDev, TRUE);
+    viaExtTMDSIOPadState(pScrn, pVIAVT1632->diPort, TRUE);
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
 }
 
 static void
@@ -280,7 +299,7 @@ via_vt1632_mode_set(xf86OutputPtr output, DisplayModePtr mode,
 {
     ScrnInfoPtr pScrn = output->scrn;
     drmmode_crtc_private_ptr iga = output->crtc->driver_private;
-    viaVT1632RecPtr pVIAVT1632Rec = output->driver_private;
+    viaVT1632RecPtr pVIAVT1632 = output->driver_private;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Entered via_vt1632_mode_set.\n"));
@@ -290,9 +309,9 @@ via_vt1632_mode_set(xf86OutputPtr output, DisplayModePtr mode,
         viaExtTMDSSetDataDriveStrength(pScrn, 0x03);
         viaExtTMDSEnableIOPads(pScrn, 0x03);
 
-        viaVT1632DumpRegisters(pScrn, pVIAVT1632Rec->VT1632I2CDev);
-        viaVT1632InitRegisters(pScrn, pVIAVT1632Rec->VT1632I2CDev);
-        viaVT1632DumpRegisters(pScrn, pVIAVT1632Rec->VT1632I2CDev);
+        viaVT1632DumpRegisters(pScrn, pVIAVT1632->VT1632I2CDev);
+        viaVT1632InitRegisters(pScrn, pVIAVT1632->VT1632I2CDev);
+        viaVT1632DumpRegisters(pScrn, pVIAVT1632->VT1632I2CDev);
 
         viaExtTMDSSetDisplaySource(pScrn, iga->index ? 0x01 : 0x00);
     }
@@ -304,25 +323,63 @@ via_vt1632_mode_set(xf86OutputPtr output, DisplayModePtr mode,
 static xf86OutputStatus
 via_vt1632_detect(xf86OutputPtr output)
 {
-    xf86MonPtr mon;
+    ScrnInfoPtr pScrn = output->scrn;
     xf86OutputStatus status = XF86OutputStatusDisconnected;
+    viaVT1632RecPtr pVIAVT1632 = (viaVT1632RecPtr) output->driver_private;
+    Bool connectorDetected;
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered via_vt1632_detect.\n"));
+
+    xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                "Probing for a DVI connector . . .\n");
+
+    connectorDetected = viaVT1632Sense(pScrn, pVIAVT1632->VT1632I2CDev);
+    if (!connectorDetected) {
+        xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                    "DVI connector not detected.\n");
+        goto exit;
+    }
+
+    status = XF86OutputStatusConnected;
+    xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                "DVI connector detected.\n");
+
+exit:
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting via_vt1632_detect.\n"));
+    return status;
+}
+
+static DisplayModePtr
+via_vt1632_get_modes(xf86OutputPtr output)
+{
     ScrnInfoPtr pScrn = output->scrn;
-    viaVT1632RecPtr pVIAVT1632Rec = output->driver_private;
+    xf86MonPtr pMon;
+    DisplayModePtr pDisplay_Mode = NULL;
+    I2CBusPtr pI2CBus;
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    viaVT1632RecPtr pVIAVT1632 = (viaVT1632RecPtr) output->driver_private;
 
-    /* Check for the DVI presence via VT1632 first before accessing
-     * I2C bus. */
-    if (viaVT1632Sense(pScrn, pVIAVT1632Rec->VT1632I2CDev)) {
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered %s.\n", __func__));
+
+    if (pVIAVT1632->i2cBus & VIA_I2C_BUS2) {
+        pI2CBus = pVIADisplay->pI2CBus2;
+    } else if (pVIAVT1632->i2cBus & VIA_I2C_BUS3) {
+        pI2CBus = pVIADisplay->pI2CBus3;
+    } else {
+        pI2CBus = NULL;
+    }
 
-        /* Since DVI presence was established, access the I2C bus
-         * assigned to DVI. */
-        mon = xf86OutputGetEDID(output, pVIAVT1632Rec->VT1632I2CDev->pI2CBus);
+    if (pI2CBus) {
+        pMon = xf86OutputGetEDID(output, pI2CBus);
 
         /* Is the interface type digital? */
-        if (mon && DIGITAL(mon->features.input_type)) {
-            status = XF86OutputStatusConnected;
-            xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                        "Detected a monitor connected to DVI.\n");
-            xf86OutputSetEDID(output, mon);
+        if (pMon && DIGITAL(pMon->features.input_type)) {
+            xf86OutputSetEDID(output, pMon);
+            pDisplay_Mode = xf86OutputGetEDIDModes(output);
         } else {
             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                         "Could not obtain EDID from a monitor "
@@ -330,7 +387,9 @@ via_vt1632_detect(xf86OutputPtr output)
         }
     }
 
-    return status;
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting %s.\n", __func__));
+    return pDisplay_Mode;
 }
 
 #ifdef RANDR_12_INTERFACE
@@ -364,7 +423,7 @@ const xf86OutputFuncsRec via_vt1632_funcs = {
     .commit             = via_vt1632_commit,
     .mode_set           = via_vt1632_mode_set,
     .detect             = via_vt1632_detect,
-    .get_modes          = xf86OutputGetEDIDModes,
+    .get_modes          = via_vt1632_get_modes,
 #ifdef RANDR_12_INTERFACE
     .set_property       = via_vt1632_set_property,
 #endif
@@ -375,31 +434,34 @@ const xf86OutputFuncsRec via_vt1632_funcs = {
 };
 
 Bool
-viaVT1632Init(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus)
+viaVT1632Probe(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus)
 {
-    xf86OutputPtr output;
-    VIAPtr pVia = VIAPTR(pScrn);
-    viaVT1632RecPtr pVIAVT1632Rec = NULL;
     I2CDevPtr pI2CDevice = NULL;
-    I2CSlaveAddr i2cAddr = 0x10;
-    CARD8 buf;
+    I2CSlaveAddr i2cAddr = VIA_VT1632_I2C_ADDR;
+    CARD8 i2cData;
     CARD16 vendorID, deviceID;
     Bool status = FALSE;
-    char outputNameBuffer[32];
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                        "Entered viaVT1632Init.\n"));
+                        "Entered viaVT1632Probe.\n"));
+
+    if (!pI2CBus) {
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                            "Invalid I2C bus.\n"));
+        goto exit;
+    }
 
     if (!xf86I2CProbeAddress(pI2CBus, i2cAddr)) {
-        xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                    "I2C device not found.\n");
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                            "I2C bus device not found.\n"));
         goto exit;
     }
 
     pI2CDevice = xf86CreateI2CDevRec();
     if (!pI2CDevice) {
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "Failed to create an I2C bus device record.\n");
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                            "Failed to create an I2C bus device "
+                            "record.\n"));
         goto exit;
     }
 
@@ -407,89 +469,148 @@ viaVT1632Init(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus)
     pI2CDevice->SlaveAddr = i2cAddr;
     pI2CDevice->pI2CBus = pI2CBus;
     if (!xf86I2CDevInit(pI2CDevice)) {
-        xf86DestroyI2CDevRec(pI2CDevice, TRUE);
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "Failed to initialize a device on I2C bus.\n");
-        goto exit;
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                            "Failed to initialize a device on "
+                            "I2C bus.\n"));
+        goto free_dev_rec;
     }
 
-    xf86I2CReadByte(pI2CDevice, 0, &buf);
-    vendorID = buf;
-    xf86I2CReadByte(pI2CDevice, 1, &buf);
-    vendorID |= buf << 8;
+    xf86I2CReadByte(pI2CDevice, 0, &i2cData);
+    vendorID = i2cData;
+    xf86I2CReadByte(pI2CDevice, 1, &i2cData);
+    vendorID |= i2cData << 8;
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Vendor ID: 0x%04x\n", vendorID));
 
-    xf86I2CReadByte(pI2CDevice, 2, &buf);
-    deviceID = buf;
-    xf86I2CReadByte(pI2CDevice, 3, &buf);
-    deviceID |= buf << 8;
+    xf86I2CReadByte(pI2CDevice, 2, &i2cData);
+    deviceID = i2cData;
+    xf86I2CReadByte(pI2CDevice, 3, &i2cData);
+    deviceID |= i2cData << 8;
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Device ID: 0x%04x\n", deviceID));
 
     if ((vendorID != 0x1106) || (deviceID != 0x3192)) {
-        xf86DestroyI2CDevRec(pI2CDevice, TRUE);
-        xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
-                    "VT1632 external TMDS transmitter not detected.\n");
-        goto exit;
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+                            "VT1632 external TMDS transmitter not "
+                            "detected.\n"));
+        goto free_dev_rec;
     }
 
+    status = TRUE;
     xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
                 "VT1632 external TMDS transmitter detected.\n");
+free_dev_rec:
+    xf86DestroyI2CDevRec(pI2CDevice, TRUE);
+exit:
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaVT1632Probe.\n"));
+    return status;
+}
 
-    pVIAVT1632Rec = xnfcalloc(1, sizeof(viaVT1632Rec));
-    if (!pVIAVT1632Rec) {
-        xf86DestroyI2CDevRec(pI2CDevice, TRUE);
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "Failed to allocate working storage for VT1632.\n");
+void
+viaVT1632Init(ScrnInfoPtr pScrn)
+{
+    xf86OutputPtr output;
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    viaVT1632RecPtr pVIAVT1632;
+    I2CBusPtr pI2CBus;
+    I2CDevPtr pI2CDevice;
+    I2CSlaveAddr i2cAddr = VIA_VT1632_I2C_ADDR;
+    CARD8 i2cData;
+    char outputNameBuffer[32];
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaVT1632Init.\n"));
+
+    if ((!(pVIADisplay->extTMDSPresence)) || (pVIADisplay->extTMDSTransmitter != VIA_TMDS_VT1632)) {
         goto exit;
     }
 
-    // Remembering which I2C bus is used for VT1632.
-    pVIAVT1632Rec->VT1632I2CDev = pI2CDevice;
+    if (pVIADisplay->extTMDSI2CBus & VIA_I2C_BUS2) {
+        pI2CBus = pVIADisplay->pI2CBus2;
+    } else if (pVIADisplay->extTMDSI2CBus & VIA_I2C_BUS3) {
+        pI2CBus = pVIADisplay->pI2CBus3;
+    } else {
+        goto exit;
+    }
 
-    xf86I2CReadByte(pI2CDevice, 0x06, &buf);
-    pVIAVT1632Rec->DotclockMin = buf * 1000;
+    pI2CDevice = xf86CreateI2CDevRec();
+    if (!pI2CDevice) {
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                    "Failed to create an I2C bus device record.\n");
+        goto exit;
+    }
 
-    xf86I2CReadByte(pI2CDevice, 0x07, &buf);
-    pVIAVT1632Rec->DotclockMax = (buf + 65) * 1000;
+    pI2CDevice->DevName = "VT1632";
+    pI2CDevice->SlaveAddr = i2cAddr;
+    pI2CDevice->pI2CBus = pI2CBus;
+    if (!xf86I2CDevInit(pI2CDevice)) {
+        xf86DestroyI2CDevRec(pI2CDevice, TRUE);
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                    "Failed to initialize a device on I2C bus.\n");
+        goto exit;
+    }
 
-    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Supported VT1632 Dot Clock Range: "
-                "%d to %d MHz\n",
-                pVIAVT1632Rec->DotclockMin / 1000,
-                pVIAVT1632Rec->DotclockMax / 1000);
+    pVIAVT1632 = (viaVT1632RecPtr) xnfcalloc(1, sizeof(viaVT1632Rec));
+    if (!pVIAVT1632) {
+        xf86DestroyI2CDevRec(pI2CDevice, TRUE);
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                            "Failed to allocate storage for "
+                            "VT1632.\n"));
+        goto exit;
+    }
 
-    /* The code to dynamically designate the particular DVI (i.e., DVI-1,
+    /* The code to dynamically designate a particular DVI (i.e., DVI-1,
      * DVI-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */
-    sprintf(outputNameBuffer, "DVI-%d", (pVia->numberDVI + 1));
+    sprintf(outputNameBuffer, "DVI-%d", (pVIADisplay->numberDVI + 1));
     output = xf86OutputCreate(pScrn, &via_vt1632_funcs, outputNameBuffer);
     if (!output) {
-        free(pVIAVT1632Rec);
+        free(pVIAVT1632);
         xf86DestroyI2CDevRec(pI2CDevice, TRUE);
         xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                    "Failed to allocate X Server display output record for "
-                    "VT1632.\n");
+                    "Failed to create X Server display output "
+                    "for VT1632.\n");
         goto exit;
     }
 
-    output->driver_private = pVIAVT1632Rec;
+    /* Increment the number of DVI connectors. */
+    pVIADisplay->numberDVI++;
+
+    // Remembering which I2C bus is used for VT1632.
+    pVIAVT1632->VT1632I2CDev = pI2CDevice;
+
+    pVIAVT1632->diPort = pVIADisplay->extTMDSDIPort;
+
+    /* Hint about which I2C bus to access for obtaining EDID. */
+    pVIAVT1632->i2cBus = pVIADisplay->extTMDSI2CBus;
+
+    pVIAVT1632->transmitter = pVIADisplay->extTMDSTransmitter;
+
+    xf86I2CReadByte(pI2CDevice, 0x06, &i2cData);
+    pVIAVT1632->DotclockMin = i2cData * 1000;
+
+    xf86I2CReadByte(pI2CDevice, 0x07, &i2cData);
+    pVIAVT1632->DotclockMax = (i2cData + 65) * 1000;
+
+    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Supported VT1632 Dot Clock Range: "
+                "%d to %d MHz\n",
+                pVIAVT1632->DotclockMin / 1000,
+                pVIAVT1632->DotclockMax / 1000);
+
+    output->driver_private = pVIAVT1632;
 
     /* Since there are two (2) display controllers registered with the
      * X.Org Server and both IGA1 and IGA2 can handle DVI without any
      * limitations, possible_crtcs should be set to 0x3 (0b11) so that
      * either display controller can get assigned to handle DVI. */
-    output->possible_crtcs = (1 << 1) | (1 << 0);
+    output->possible_crtcs = BIT(1) | BIT(0);
 
     output->possible_clones = 0;
     output->interlaceAllowed = FALSE;
     output->doubleScanAllowed = FALSE;
 
-    viaVT1632DumpRegisters(pScrn, pI2CDevice);
-
-    pVia->numberDVI++;
-    status = TRUE;
 exit:
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting viaVT1632Init.\n"));
-    return status;
 }
diff --git a/src/via_vt1632.h b/src/via_vt1632.h
index 41df77f..61dada1 100644
--- a/src/via_vt1632.h
+++ b/src/via_vt1632.h
@@ -25,6 +25,8 @@
 #ifndef _VIA_VT1632_H_
 #define _VIA_VT1632_H_ 1
 
+#define VIA_VT1632_I2C_ADDR 0x10
+
 #define VIA_VT1632_VEN  0x20
 #define VIA_VT1632_HEN  0x10
 #define VIA_VT1632_DSEL 0x08
@@ -32,20 +34,26 @@
 #define VIA_VT1632_EDGE 0x02
 #define VIA_VT1632_PDB  0x01
 
-typedef struct _viaVT1632Rec {
-	I2CDevPtr VT1632I2CDev;
+typedef struct _VIAVT1632 {
+    I2CDevPtr   VT1632I2CDev;
+
+    uint32_t    diPort;
+    CARD8       i2cBus;
+    CARD8       transmitter;
+
+    int DotclockMin;
+    int DotclockMax;
 
-	int DotclockMin;
-	int DotclockMax;
-	CARD8 Register08;
-	CARD8 Register09;
-	CARD8 Register0A;
-	CARD8 Register0C;
+    CARD8   Register08;
+    CARD8   Register09;
+    CARD8   Register0A;
+    CARD8   Register0C;
 } viaVT1632Rec, *viaVT1632RecPtr;
 
 
-const xf86OutputFuncsRec via_vt1632_funcs;
+extern const xf86OutputFuncsRec via_vt1632_funcs;
 
-Bool viaVT1632Init(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus);
+Bool viaVT1632Probe(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus);
+void viaVT1632Init(ScrnInfoPtr pScrn);
 
 #endif /* _VIA_VT1632_H_ */
diff --git a/src/via_xv.c b/src/via_xv.c
index adc9af2..8d2823a 100644
--- a/src/via_xv.c
+++ b/src/via_xv.c
@@ -107,10 +107,6 @@ static int viaSetPortAttribute(ScrnInfoPtr, Atom, INT32, pointer);
 static int viaPutImage(ScrnInfoPtr, short, short, short, short, short, short,
     short, short, int, unsigned char *, short, short, Bool,
     RegionPtr, pointer, DrawablePtr);
-static void UVBlit(unsigned char *dest,
-    const unsigned char *uBuffer,
-    const unsigned char *vBuffer,
-    unsigned width, unsigned srcPitch, unsigned dstPitch, unsigned lines);
 static void nv12Blit(unsigned char *nv12Chroma,
     const unsigned char *uBuffer,
     const unsigned char *vBuffer,
@@ -143,13 +139,21 @@ static XF86VideoFormatRec FormatsG[NUM_FORMATS_G] = {
 
 #define NUM_ATTRIBUTES_G 6
 
+static char attributeXvColorkey[] = { "XV_COLORKEY" };
+static char attributeXvBrightness[] = { "XV_BRIGHTNESS" };
+static char attributeXvContrast[] = { "XV_CONTRAST" };
+static char attributeXvSaturation[] = { "XV_SATURATION" };
+static char attributeXvHue[] = { "XV_HUE" };
+static char attributeXvAutopaintColorkey[] =
+                                        { "XV_AUTOPAINT_COLORKEY" };
+
 static XF86AttributeRec AttributesG[NUM_ATTRIBUTES_G] = {
-    {XvSettable | XvGettable, 0, (1 << 24) - 1, "XV_COLORKEY"},
-    {XvSettable | XvGettable, 0, 10000, "XV_BRIGHTNESS"},
-    {XvSettable | XvGettable, 0, 20000, "XV_CONTRAST"},
-    {XvSettable | XvGettable, 0, 20000, "XV_SATURATION"},
-    {XvSettable | XvGettable, -180, 180, "XV_HUE"},
-    {XvSettable | XvGettable, 0, 1, "XV_AUTOPAINT_COLORKEY"}
+    {XvSettable | XvGettable,      0,  (1 << 24) - 1,          attributeXvColorkey},
+    {XvSettable | XvGettable,      0,          10000,          attributeXvBrightness},
+    {XvSettable | XvGettable,      0,          20000,          attributeXvContrast},
+    {XvSettable | XvGettable,      0,          20000,          attributeXvSaturation},
+    {XvSettable | XvGettable,   -180,            180,                 attributeXvHue},
+    {XvSettable | XvGettable,      0,              1,   attributeXvAutopaintColorkey}
 };
 
 #define NUM_IMAGES_G 7
@@ -239,7 +243,7 @@ static XF86ImageRec ImagesG[NUM_IMAGES_G] = {
 
 };
 
-static char *XvAdaptorName[XV_ADAPT_NUM] = {
+static const char *XvAdaptorName[XV_ADAPT_NUM] = {
     "XV_SWOV"
 };
 
@@ -678,7 +682,7 @@ viaSetupAdaptors(ScreenPtr pScreen, XF86VideoAdaptorPtr ** adaptors)
 {
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
     int i, j, usedPorts, numPorts;
-    viaPortPrivRec *viaPortPriv;
+    viaPortPrivPtr pPriv;
     DevUnion *pdevUnion;
 
     DBG_DD(ErrorF(" via_xv.c : viaSetupAdaptors (viaSetupImageVideo): \n"));
@@ -698,7 +702,7 @@ viaSetupAdaptors(ScreenPtr pScreen, XF86VideoAdaptorPtr ** adaptors)
             return 0;
         numPorts = numAdaptPort[i];
 
-        viaPortPriv =
+        pPriv =
             (viaPortPrivPtr) xnfcalloc(numPorts, sizeof(viaPortPrivRec));
         pdevUnion = (DevUnion *) xnfcalloc(numPorts, sizeof(DevUnion));
 
@@ -721,7 +725,7 @@ viaSetupAdaptors(ScreenPtr pScreen, XF86VideoAdaptorPtr ** adaptors)
         /* The adapter can handle 1 port simultaneously */
         viaAdaptPtr[i]->nPorts = numPorts;
         viaAdaptPtr[i]->pPortPrivates = pdevUnion;
-        viaAdaptPtr[i]->pPortPrivates->ptr = (pointer) viaPortPriv;
+        viaAdaptPtr[i]->pPortPrivates->ptr = (pointer) pPriv;
         viaAdaptPtr[i]->nAttributes = NUM_ATTRIBUTES_G;
         viaAdaptPtr[i]->pAttributes = AttributesG;
 
@@ -736,23 +740,23 @@ viaSetupAdaptors(ScreenPtr pScreen, XF86VideoAdaptorPtr ** adaptors)
         viaAdaptPtr[i]->ReputImage = NULL;
         viaAdaptPtr[i]->QueryImageAttributes = viaQueryImageAttributes;
         for (j = 0; j < numPorts; ++j) {
-            viaPortPriv[j].dmaBounceBuffer = NULL;
-            viaPortPriv[j].dmaBounceStride = 0;
-            viaPortPriv[j].dmaBounceLines = 0;
-            viaPortPriv[j].colorKey = 0x0821;
-            viaPortPriv[j].autoPaint = TRUE;
-            viaPortPriv[j].brightness = 5000.;
-            viaPortPriv[j].saturation = 10000;
-            viaPortPriv[j].contrast = 10000;
-            viaPortPriv[j].hue = 0;
-            viaPortPriv[j].FourCC = 0;
-            viaPortPriv[j].xv_portnum = j + usedPorts;
-            viaPortPriv[j].xvErr = xve_none;
+            pPriv[j].dmaBounceBuffer = NULL;
+            pPriv[j].dmaBounceStride = 0;
+            pPriv[j].dmaBounceLines = 0;
+            pPriv[j].colorKey = 0x0821;
+            pPriv[j].autoPaint = TRUE;
+            pPriv[j].brightness = 5000.;
+            pPriv[j].saturation = 10000;
+            pPriv[j].contrast = 10000;
+            pPriv[j].hue = 0;
+            pPriv[j].FourCC = 0;
+            pPriv[j].xv_portnum = j + usedPorts;
+            pPriv[j].xvErr = xve_none;
 
 #ifdef X_USE_REGION_NULL
-            REGION_NULL(pScreen, &viaPortPriv[j].clip);
+            REGION_NULL(pScreen, &pPriv[j].clip);
 #else
-            REGION_INIT(pScreen, &viaPortPriv[j].clip, NullBox, 1);
+            REGION_INIT(pScreen, &pPriv[j].clip, NullBox, 1);
 #endif
         }
         usedPorts += j;
@@ -959,28 +963,6 @@ Flip(VIAPtr pVia, viaPortPrivPtr pPriv, int fourcc,
     }
 }
 
-static void
-planar420cp(unsigned char *dst, const unsigned char *src, int dstPitch,
-            int w, int h, int i420)
-{
-    unsigned long srcUOffset, srcVOffset;
-
-    /*
-     * Blit luma component as a fake YUY2 assembler blit.
-     */
-    if (i420) {
-        srcVOffset  = w * h + (w >> 1) * (h >> 1);
-        srcUOffset = w * h;
-    } else {
-        srcUOffset  = w * h + (w >> 1) * (h >> 1);
-        srcVOffset = w * h;
-    }
-
-    (*viaFastVidCpy) (dst, src, dstPitch, w >> 1, h, 1);
-    UVBlit(dst + dstPitch * h, src + srcUOffset,
-            src + srcVOffset, w >> 1, w >> 1, dstPitch, h >> 1);
-}
-
 /*
  * Slow and dirty. NV12 blit.
  */
@@ -1017,7 +999,6 @@ viaDmaBlitImage(VIAPtr pVia,
     Bool bounceBuffer;
     drm_via_dmablit_t blit;
     drm_via_blitsync_t *chromaSync = &blit.sync;
-    drm_via_blitsync_t lumaSync;
     unsigned char *base;
     unsigned char *bounceBase;
     unsigned bounceStride;
@@ -1097,8 +1078,6 @@ viaDmaBlitImage(VIAPtr pVia,
     if (err < 0)
         return -1;
 
-    lumaSync = blit.sync;
-
     if (id == FOURCC_YV12 || id == FOURCC_I420) {
         unsigned tmp = ALIGN_TO(width >> 1, 16);
 
@@ -1496,35 +1475,6 @@ VIAVidAdjustFrame(ScrnInfoPtr pScrn, int x, int y)
     pVia->swov.panning_y = y;
 }
 
-/*
- * Blit the U and V Fields. Used to Flip the U V for I420.
- */
-
-static void
-UVBlit(unsigned char *dst,
-        const unsigned char *uBuffer,
-        const unsigned char *vBuffer,
-        unsigned width, unsigned srcPitch, unsigned dstPitch, unsigned lines)
-{
-    int i, j;
-
-    dstPitch >>= 1;
-
-    for(j = 0; j < lines; j++)
-    {
-        for(i = 0; i < width; i++)
-        {
-            dst[i] = (uBuffer[i] << 8) | (vBuffer[i] << 16);
-        }
-
-        dst += dstPitch;
-        uBuffer += srcPitch;
-        vBuffer += srcPitch;
-    }
-
-}
-
-
 /*
  * Blit the chroma field from one buffer to another while at the same time converting from
  * YV12 to NV12.
diff --git a/src/via_xv_overlay.c b/src/via_xv_overlay.c
index b65a688..776a79e 100644
--- a/src/via_xv_overlay.c
+++ b/src/via_xv_overlay.c
@@ -123,10 +123,10 @@ viaWaitHQVFlip(VIAPtr pVia)
 static void
 viaWaitHQVFlipClear(VIAPtr pVia, unsigned long dwData)
 {
+    unsigned count = 50000;
     CARD32 volatile *pdwState =
             (CARD32 volatile *)(pVia->MapBase + HQV_CONTROL);
     *pdwState = dwData;
-    unsigned count = 50000;
 
     while (--count && (*pdwState & HQV_FLIP_STATUS)) {
         VIASETREG(HQV_CONTROL, *pdwState | HQV_FLIP_STATUS);
@@ -683,7 +683,7 @@ viaOverlayHQVCalcZoomHeight(VIAPtr pVia,
                             HQV_V_TAP8_12221, HQV_V_TAP8_12221 };
     /* CARD32 HQVmini[5] = { 0, 0x0c000000, 0x0a000000, 0x09000000, 0x08800000 }; */
 
-    /*if (pVia->pBIOSInfo->scaleY)
+    /*if (pVia->pVIADisplay->scaleY)
      * {
      * dstHeight = dstHeight + 1;
      * } */
@@ -1126,7 +1126,7 @@ ViaYUVFillBlack(VIAPtr pVia, void *buf, int num)
 static long
 AddHQVSurface(ScrnInfoPtr pScrn, unsigned int numbuf, CARD32 fourcc)
 {
-    unsigned int i, width, height, pitch, fbsize, addr;
+    unsigned int i, height, pitch, fbsize, addr;
     BOOL isplanar;
     void *buf;
 
@@ -1142,7 +1142,6 @@ AddHQVSurface(ScrnInfoPtr pScrn, unsigned int numbuf, CARD32 fourcc)
     isplanar = ((fourcc == FOURCC_YV12) || (fourcc == FOURCC_I420) ||
                 (fourcc == FOURCC_XVMC));
 
-    width = pVia->swov.SWDevice.gdwSWSrcWidth;
     height = pVia->swov.SWDevice.gdwSWSrcHeight;
     pitch = pVia->swov.SWDevice.dwPitch;
     fbsize = pitch * height * (isplanar ? 2 : 1);
@@ -1211,7 +1210,8 @@ CreateSurface(ScrnInfoPtr pScrn, CARD32 FourCC, CARD16 Width,
         pVia->swov.SWDevice.dwSWPhysicalAddr[0] = addr;
         pVia->swov.SWDevice.dwSWPhysicalAddr[1] = addr + fbsize;
         pVia->swov.SWDevice.lpSWOverlaySurface[0] = buf;
-        pVia->swov.SWDevice.lpSWOverlaySurface[1] = buf + fbsize;
+        pVia->swov.SWDevice.lpSWOverlaySurface[1] =
+                                        (unsigned char*)buf + fbsize;
 
         if (isplanar) {
             pVia->swov.SWDevice.dwSWCrPhysicalAddr[0] =
@@ -1751,10 +1751,10 @@ SetVideoWindow(ScrnInfoPtr pScrn, unsigned long videoFlag,
      * So, we need to adjust the Y top and bottom position.
      *
     if (videoFlag & VIDEO_1_INUSE) {
-        if (pBIOSInfo->SetDVI && pBIOSInfo->scaleY) {
-            top = (pUpdate->DstTop * pBIOSInfo->Panel->NativeMode->Height
+        if (pVIADisplay->SetDVI && pVIADisplay->scaleY) {
+            top = (pUpdate->DstTop * pVIADisplay->Panel->NativeMode->Height
                    / pScrn->currentMode->VDisplay);
-            bottom = (pUpdate->DstBottom * pBIOSInfo->Panel->NativeMode->Height
+            bottom = (pUpdate->DstBottom * pVIADisplay->Panel->NativeMode->Height
                       / pScrn->currentMode->VDisplay);
         }
     }*/
@@ -1830,10 +1830,10 @@ Upd_Video(xf86CrtcPtr crtc, unsigned long videoFlag,
                   pUpdate->DstTop, pUpdate->DstBottom));
 
     dstWidth = pUpdate->DstRight - pUpdate->DstLeft;
-	/*if (pBIOSInfo->lvds && pBIOSInfo->lvds->status == XF86OutputStatusConnected &&
-		pBIOSInfo->Panel->Scale) {
+	/*if (pVIADisplay->lvds && pVIADisplay->lvds->status == XF86OutputStatusConnected &&
+		pVIADisplay->Panel->Scale) {
         * FIXME: We need to determine if the panel is using V1 or V3 *
-        float hfactor = (float)pBIOSInfo->Panel->NativeMode->Width
+        float hfactor = (float)pVIADisplay->Panel->NativeMode->Width
                         / pScrn->currentMode->HDisplay;
         dstWidth *= hfactor;
     }*/
diff --git a/src/via_xvmc.c b/src/via_xvmc.c
index 8882947..56b2602 100644
--- a/src/via_xvmc.c
+++ b/src/via_xvmc.c
@@ -69,7 +69,8 @@
  * to be added here to be supported also by XvMC.
  * Currently, only colorkey seems to be supported by Xv for Putimage.
  */
-static char *attrXvMC[VIA_NUM_XVMC_ATTRIBUTES] = { "XV_COLORKEY",
+static const char *attrXvMC[VIA_NUM_XVMC_ATTRIBUTES] = {
+    "XV_COLORKEY",
     "XV_AUTOPAINT_COLORKEY",
     "XV_BRIGHTNESS",
     "XV_CONTRAST",
@@ -342,7 +343,8 @@ ViaInitXVMC(ScreenPtr pScreen)
         xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                    "[XvMC] Kernel drm version is %d.%d.%d; "
                    "at least version 2.4.0 is needed.\n",
-                   pVia->drmVerMajor, pVia->drmVerMinor, pVia->drmVerPL);
+                   pVia->drmVerMajor, pVia->drmVerMinor,
+                   pVia->drmVerPatchLevel);
         xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                    "[XvMC] Please update. Disabling XvMC.\n");
         return;
@@ -502,7 +504,7 @@ ViaXvMCCreateContext(ScrnInfoPtr pScrn, XvMCContextPtr pContext,
     contextRec->chipId = pVia->ChipId;
     contextRec->screen = pScrn->scrnIndex;
     contextRec->depth = pScrn->bitsPerPixel;
-    contextRec->stride = pVia->Bpp * pScrn->virtualX;
+    contextRec->stride = pScrn->virtualX * (pScrn->bitsPerPixel >> 3);
 
     vXvMC->nContexts++;
     vXvMC->contexts[ctxNo] = pContext->context_id;
@@ -602,8 +604,8 @@ ViaXvMCCreateSurface(ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf,
     yBufSize = stride(ctx->width) * ctx->height;
     for (i = 0; i < numBuffers; ++i) {
         memset(buf, 0, yBufSize);
-        memset(buf + yBufSize, 0x80, yBufSize >> 1);
-        buf += bufSize;
+        memset((unsigned char*)buf + yBufSize, 0x80, yBufSize >> 1);
+        buf = (unsigned char*)buf + bufSize;
     }
     drm_bo_unmap(pScrn, sPriv->memory_ref);
 
@@ -683,7 +685,6 @@ ViaXvMCDestroyContext(ScrnInfoPtr pScrn, XvMCContextPtr pContext)
     VIAPtr pVia = VIAPTR(pScrn);
     ViaXvMCPtr vXvMC = &(pVia->xvmc);
     int i;
-    volatile ViaXvMCSAreaPriv *sAPriv;
     viaPortPrivPtr pPriv;
     XvPortRecPrivatePtr portPriv;
     ViaXvMCXVPriv *vx;
@@ -691,7 +692,6 @@ ViaXvMCDestroyContext(ScrnInfoPtr pScrn, XvMCContextPtr pContext)
     for (i = 0; i < VIA_XVMC_MAX_CONTEXTS; i++) {
         if (vXvMC->contexts[i] == pContext->context_id) {
 
-            sAPriv = (ViaXvMCSAreaPriv *) DRIGetSAREAPrivate(pScrn->pScreen);
             portPriv = (XvPortRecPrivatePtr) pContext->port_priv;
             pPriv = (viaPortPrivPtr) portPriv->DevPriv.ptr;
             vx = (ViaXvMCXVPriv *) pPriv->xvmc_priv;
diff --git a/src/via_xvpriv.h b/src/via_xvpriv.h
index b6c796b..8f0c9a0 100644
--- a/src/via_xvpriv.h
+++ b/src/via_xvpriv.h
@@ -84,7 +84,6 @@ typedef struct
 
 } viaPortPrivRec, *viaPortPrivPtr;
 
-extern viaPortPrivPtr viaPortPriv[];
 extern unsigned viaNumXvPorts;
 
 #endif /* _VIA_XVPRIV_H_ */
diff --git a/src/xvmc/viaXvMC.c b/src/xvmc/viaXvMC.c
index edd2c6f..931591c 100644
--- a/src/xvmc/viaXvMC.c
+++ b/src/xvmc/viaXvMC.c
@@ -1086,7 +1086,6 @@ XvMCSyncSurface(Display * display, XvMCSurface * surface)
     ppthread_mutex_lock(&pViaXvMC->ctxMutex);
 
     if (pViaSurface->needsSync) {
-	CARD32 timeStamp = pViaSurface->timeStamp;
 	int syncMode = pViaSurface->syncMode;
 
 	if (pViaXvMC->useAGP) {
@@ -1094,9 +1093,6 @@ XvMCSyncSurface(Display * display, XvMCSurface * surface)
 	    syncMode = (pViaSurface->syncMode == LL_MODE_2D ||
 		pViaSurface->timeStamp < pViaXvMC->timeStamp) ?
 		LL_MODE_2D : LL_MODE_DECODER_IDLE;
-	    if (pViaSurface->syncMode != LL_MODE_2D)
-		timeStamp = pViaXvMC->timeStamp;
-
 	} else if (syncMode != LL_MODE_2D &&
 	    pViaXvMC->rendSurf[0] != (pViaSurface->srfNo | VIA_XVMC_VALID)) {
 
diff --git a/src/xvmc/xf86dristr.h b/src/xvmc/xf86dristr.h
index 3b43438..c466564 100644
--- a/src/xvmc/xf86dristr.h
+++ b/src/xvmc/xf86dristr.h
@@ -59,7 +59,7 @@ typedef struct _XF86DRIQueryVersion
 {
     CARD8 reqType;		       /* always DRIReqCode */
     CARD8 driReqType;		       /* always X_DRIQueryVersion */
-    CARD16 length B16;
+    CARD16 length;
 } xXF86DRIQueryVersionReq;
 
 #define sz_xXF86DRIQueryVersionReq	4
@@ -68,15 +68,15 @@ typedef struct
 {
     BYTE type;			       /* X_Reply */
     BOOL pad1;
-    CARD16 sequenceNumber B16;
-    CARD32 length B32;
-    CARD16 majorVersion B16;	       /* major version of DRI protocol */
-    CARD16 minorVersion B16;	       /* minor version of DRI protocol */
-    CARD32 patchVersion B32;	       /* patch version of DRI protocol */
-    CARD32 pad3 B32;
-    CARD32 pad4 B32;
-    CARD32 pad5 B32;
-    CARD32 pad6 B32;
+    CARD16 sequenceNumber;
+    CARD32 length;
+    CARD16 majorVersion;	       /* major version of DRI protocol */
+    CARD16 minorVersion;	       /* minor version of DRI protocol */
+    CARD32 patchVersion;	       /* patch version of DRI protocol */
+    CARD32 pad3;
+    CARD32 pad4;
+    CARD32 pad5;
+    CARD32 pad6;
 } xXF86DRIQueryVersionReply;
 
 #define sz_xXF86DRIQueryVersionReply	32
@@ -85,8 +85,8 @@ typedef struct _XF86DRIQueryDirectRenderingCapable
 {
     CARD8 reqType;		       /* always DRIReqCode */
     CARD8 driReqType;		       /* X_DRIQueryDirectRenderingCapable */
-    CARD16 length B16;
-    CARD32 screen B32;
+    CARD16 length;
+    CARD32 screen;
 } xXF86DRIQueryDirectRenderingCapableReq;
 
 #define sz_xXF86DRIQueryDirectRenderingCapableReq	8
@@ -95,17 +95,17 @@ typedef struct
 {
     BYTE type;			       /* X_Reply */
     BOOL pad1;
-    CARD16 sequenceNumber B16;
-    CARD32 length B32;
+    CARD16 sequenceNumber;
+    CARD32 length;
     BOOL isCapable;
     BOOL pad2;
     BOOL pad3;
     BOOL pad4;
-    CARD32 pad5 B32;
-    CARD32 pad6 B32;
-    CARD32 pad7 B32;
-    CARD32 pad8 B32;
-    CARD32 pad9 B32;
+    CARD32 pad5;
+    CARD32 pad6;
+    CARD32 pad7;
+    CARD32 pad8;
+    CARD32 pad9;
 } xXF86DRIQueryDirectRenderingCapableReply;
 
 #define sz_xXF86DRIQueryDirectRenderingCapableReply	32
@@ -114,8 +114,8 @@ typedef struct _XF86DRIOpenConnection
 {
     CARD8 reqType;		       /* always DRIReqCode */
     CARD8 driReqType;		       /* always X_DRIOpenConnection */
-    CARD16 length B16;
-    CARD32 screen B32;
+    CARD16 length;
+    CARD32 screen;
 } xXF86DRIOpenConnectionReq;
 
 #define sz_xXF86DRIOpenConnectionReq	8
@@ -124,14 +124,14 @@ typedef struct
 {
     BYTE type;			       /* X_Reply */
     BOOL pad1;
-    CARD16 sequenceNumber B16;
-    CARD32 length B32;
-    CARD32 hSAREALow B32;
-    CARD32 hSAREAHigh B32;
-    CARD32 busIdStringLength B32;
-    CARD32 pad6 B32;
-    CARD32 pad7 B32;
-    CARD32 pad8 B32;
+    CARD16 sequenceNumber;
+    CARD32 length;
+    CARD32 hSAREALow;
+    CARD32 hSAREAHigh;
+    CARD32 busIdStringLength;
+    CARD32 pad6;
+    CARD32 pad7;
+    CARD32 pad8;
 } xXF86DRIOpenConnectionReply;
 
 #define sz_xXF86DRIOpenConnectionReply	32
@@ -140,9 +140,9 @@ typedef struct _XF86DRIAuthConnection
 {
     CARD8 reqType;		       /* always DRIReqCode */
     CARD8 driReqType;		       /* always X_DRICloseConnection */
-    CARD16 length B16;
-    CARD32 screen B32;
-    CARD32 magic B32;
+    CARD16 length;
+    CARD32 screen;
+    CARD32 magic;
 } xXF86DRIAuthConnectionReq;
 
 #define sz_xXF86DRIAuthConnectionReq	12
@@ -151,14 +151,14 @@ typedef struct
 {
     BYTE type;
     BOOL pad1;
-    CARD16 sequenceNumber B16;
-    CARD32 length B32;
-    CARD32 authenticated B32;
-    CARD32 pad2 B32;
-    CARD32 pad3 B32;
-    CARD32 pad4 B32;
-    CARD32 pad5 B32;
-    CARD32 pad6 B32;
+    CARD16 sequenceNumber;
+    CARD32 length;
+    CARD32 authenticated;
+    CARD32 pad2;
+    CARD32 pad3;
+    CARD32 pad4;
+    CARD32 pad5;
+    CARD32 pad6;
 } xXF86DRIAuthConnectionReply;
 
 #define zx_xXF86DRIAuthConnectionReply  32
@@ -167,8 +167,8 @@ typedef struct _XF86DRICloseConnection
 {
     CARD8 reqType;		       /* always DRIReqCode */
     CARD8 driReqType;		       /* always X_DRICloseConnection */
-    CARD16 length B16;
-    CARD32 screen B32;
+    CARD16 length;
+    CARD32 screen;
 } xXF86DRICloseConnectionReq;
 
 #define sz_xXF86DRICloseConnectionReq	8
@@ -177,8 +177,8 @@ typedef struct _XF86DRIGetClientDriverName
 {
     CARD8 reqType;		       /* always DRIReqCode */
     CARD8 driReqType;		       /* always X_DRIGetClientDriverName */
-    CARD16 length B16;
-    CARD32 screen B32;
+    CARD16 length;
+    CARD32 screen;
 } xXF86DRIGetClientDriverNameReq;
 
 #define sz_xXF86DRIGetClientDriverNameReq	8
@@ -187,14 +187,14 @@ typedef struct
 {
     BYTE type;			       /* X_Reply */
     BOOL pad1;
-    CARD16 sequenceNumber B16;
-    CARD32 length B32;
-    CARD32 ddxDriverMajorVersion B32;
-    CARD32 ddxDriverMinorVersion B32;
-    CARD32 ddxDriverPatchVersion B32;
-    CARD32 clientDriverNameLength B32;
-    CARD32 pad5 B32;
-    CARD32 pad6 B32;
+    CARD16 sequenceNumber;
+    CARD32 length;
+    CARD32 ddxDriverMajorVersion;
+    CARD32 ddxDriverMinorVersion;
+    CARD32 ddxDriverPatchVersion;
+    CARD32 clientDriverNameLength;
+    CARD32 pad5;
+    CARD32 pad6;
 } xXF86DRIGetClientDriverNameReply;
 
 #define sz_xXF86DRIGetClientDriverNameReply	32
@@ -203,10 +203,10 @@ typedef struct _XF86DRICreateContext
 {
     CARD8 reqType;		       /* always DRIReqCode */
     CARD8 driReqType;		       /* always X_DRICreateContext */
-    CARD16 length B16;
-    CARD32 screen B32;
-    CARD32 visual B32;
-    CARD32 context B32;
+    CARD16 length;
+    CARD32 screen;
+    CARD32 visual;
+    CARD32 context;
 } xXF86DRICreateContextReq;
 
 #define sz_xXF86DRICreateContextReq	16
@@ -215,14 +215,14 @@ typedef struct
 {
     BYTE type;			       /* X_Reply */
     BOOL pad1;
-    CARD16 sequenceNumber B16;
-    CARD32 length B32;
-    CARD32 hHWContext B32;
-    CARD32 pad2 B32;
-    CARD32 pad3 B32;
-    CARD32 pad4 B32;
-    CARD32 pad5 B32;
-    CARD32 pad6 B32;
+    CARD16 sequenceNumber;
+    CARD32 length;
+    CARD32 hHWContext;
+    CARD32 pad2;
+    CARD32 pad3;
+    CARD32 pad4;
+    CARD32 pad5;
+    CARD32 pad6;
 } xXF86DRICreateContextReply;
 
 #define sz_xXF86DRICreateContextReply	32
@@ -231,9 +231,9 @@ typedef struct _XF86DRIDestroyContext
 {
     CARD8 reqType;		       /* always DRIReqCode */
     CARD8 driReqType;		       /* always X_DRIDestroyContext */
-    CARD16 length B16;
-    CARD32 screen B32;
-    CARD32 context B32;
+    CARD16 length;
+    CARD32 screen;
+    CARD32 context;
 } xXF86DRIDestroyContextReq;
 
 #define sz_xXF86DRIDestroyContextReq	12
@@ -242,9 +242,9 @@ typedef struct _XF86DRICreateDrawable
 {
     CARD8 reqType;		       /* always DRIReqCode */
     CARD8 driReqType;		       /* always X_DRICreateDrawable */
-    CARD16 length B16;
-    CARD32 screen B32;
-    CARD32 drawable B32;
+    CARD16 length;
+    CARD32 screen;
+    CARD32 drawable;
 } xXF86DRICreateDrawableReq;
 
 #define sz_xXF86DRICreateDrawableReq	12
@@ -253,14 +253,14 @@ typedef struct
 {
     BYTE type;			       /* X_Reply */
     BOOL pad1;
-    CARD16 sequenceNumber B16;
-    CARD32 length B32;
-    CARD32 hHWDrawable B32;
-    CARD32 pad2 B32;
-    CARD32 pad3 B32;
-    CARD32 pad4 B32;
-    CARD32 pad5 B32;
-    CARD32 pad6 B32;
+    CARD16 sequenceNumber;
+    CARD32 length;
+    CARD32 hHWDrawable;
+    CARD32 pad2;
+    CARD32 pad3;
+    CARD32 pad4;
+    CARD32 pad5;
+    CARD32 pad6;
 } xXF86DRICreateDrawableReply;
 
 #define sz_xXF86DRICreateDrawableReply	32
@@ -269,9 +269,9 @@ typedef struct _XF86DRIDestroyDrawable
 {
     CARD8 reqType;		       /* always DRIReqCode */
     CARD8 driReqType;		       /* always X_DRIDestroyDrawable */
-    CARD16 length B16;
-    CARD32 screen B32;
-    CARD32 drawable B32;
+    CARD16 length;
+    CARD32 screen;
+    CARD32 drawable;
 } xXF86DRIDestroyDrawableReq;
 
 #define sz_xXF86DRIDestroyDrawableReq	12
@@ -280,9 +280,9 @@ typedef struct _XF86DRIGetDrawableInfo
 {
     CARD8 reqType;		       /* always DRIReqCode */
     CARD8 driReqType;		       /* always X_DRIGetDrawableInfo */
-    CARD16 length B16;
-    CARD32 screen B32;
-    CARD32 drawable B32;
+    CARD16 length;
+    CARD32 screen;
+    CARD32 drawable;
 } xXF86DRIGetDrawableInfoReq;
 
 #define sz_xXF86DRIGetDrawableInfoReq	12
@@ -291,18 +291,18 @@ typedef struct
 {
     BYTE type;			       /* X_Reply */
     BOOL pad1;
-    CARD16 sequenceNumber B16;
-    CARD32 length B32;
-    CARD32 drawableTableIndex B32;
-    CARD32 drawableTableStamp B32;
-    INT16 drawableX B16;
-    INT16 drawableY B16;
-    INT16 drawableWidth B16;
-    INT16 drawableHeight B16;
-    CARD32 numClipRects B32;
-    INT16 backX B16;
-    INT16 backY B16;
-    CARD32 numBackClipRects B32;
+    CARD16 sequenceNumber;
+    CARD32 length;
+    CARD32 drawableTableIndex;
+    CARD32 drawableTableStamp;
+    INT16 drawableX;
+    INT16 drawableY;
+    INT16 drawableWidth;
+    INT16 drawableHeight;
+    CARD32 numClipRects;
+    INT16 backX;
+    INT16 backY;
+    CARD32 numBackClipRects;
 } xXF86DRIGetDrawableInfoReply;
 
 #define sz_xXF86DRIGetDrawableInfoReply	36
@@ -311,8 +311,8 @@ typedef struct _XF86DRIGetDeviceInfo
 {
     CARD8 reqType;		       /* always DRIReqCode */
     CARD8 driReqType;		       /* always X_DRIGetDeviceInfo */
-    CARD16 length B16;
-    CARD32 screen B32;
+    CARD16 length;
+    CARD32 screen;
 } xXF86DRIGetDeviceInfoReq;
 
 #define sz_xXF86DRIGetDeviceInfoReq	8
@@ -321,14 +321,14 @@ typedef struct
 {
     BYTE type;			       /* X_Reply */
     BOOL pad1;
-    CARD16 sequenceNumber B16;
-    CARD32 length B32;
-    CARD32 hFrameBufferLow B32;
-    CARD32 hFrameBufferHigh B32;
-    CARD32 framebufferOrigin B32;
-    CARD32 framebufferSize B32;
-    CARD32 framebufferStride B32;
-    CARD32 devPrivateSize B32;
+    CARD16 sequenceNumber;
+    CARD32 length;
+    CARD32 hFrameBufferLow;
+    CARD32 hFrameBufferHigh;
+    CARD32 framebufferOrigin;
+    CARD32 framebufferSize;
+    CARD32 framebufferStride;
+    CARD32 devPrivateSize;
 } xXF86DRIGetDeviceInfoReply;
 
 #define sz_xXF86DRIGetDeviceInfoReply	32
@@ -337,9 +337,9 @@ typedef struct _XF86DRIOpenFullScreen
 {
     CARD8 reqType;		       /* always DRIReqCode */
     CARD8 driReqType;		       /* always X_DRIOpenFullScreen */
-    CARD16 length B16;
-    CARD32 screen B32;
-    CARD32 drawable B32;
+    CARD16 length;
+    CARD32 screen;
+    CARD32 drawable;
 } xXF86DRIOpenFullScreenReq;
 
 #define sz_xXF86DRIOpenFullScreenReq    12
@@ -348,14 +348,14 @@ typedef struct
 {
     BYTE type;
     BOOL pad1;
-    CARD16 sequenceNumber B16;
-    CARD32 length B32;
-    CARD32 isFullScreen B32;
-    CARD32 pad2 B32;
-    CARD32 pad3 B32;
-    CARD32 pad4 B32;
-    CARD32 pad5 B32;
-    CARD32 pad6 B32;
+    CARD16 sequenceNumber;
+    CARD32 length;
+    CARD32 isFullScreen;
+    CARD32 pad2;
+    CARD32 pad3;
+    CARD32 pad4;
+    CARD32 pad5;
+    CARD32 pad6;
 } xXF86DRIOpenFullScreenReply;
 
 #define sz_xXF86DRIOpenFullScreenReply  32
@@ -364,9 +364,9 @@ typedef struct _XF86DRICloseFullScreen
 {
     CARD8 reqType;		       /* always DRIReqCode */
     CARD8 driReqType;		       /* always X_DRICloseFullScreen */
-    CARD16 length B16;
-    CARD32 screen B32;
-    CARD32 drawable B32;
+    CARD16 length;
+    CARD32 screen;
+    CARD32 drawable;
 } xXF86DRICloseFullScreenReq;
 
 #define sz_xXF86DRICloseFullScreenReq   12
@@ -375,14 +375,14 @@ typedef struct
 {
     BYTE type;
     BOOL pad1;
-    CARD16 sequenceNumber B16;
-    CARD32 length B32;
-    CARD32 pad2 B32;
-    CARD32 pad3 B32;
-    CARD32 pad4 B32;
-    CARD32 pad5 B32;
-    CARD32 pad6 B32;
-    CARD32 pad7 B32;
+    CARD16 sequenceNumber;
+    CARD32 length;
+    CARD32 pad2;
+    CARD32 pad3;
+    CARD32 pad4;
+    CARD32 pad5;
+    CARD32 pad6;
+    CARD32 pad7;
 } xXF86DRICloseFullScreenReply;
 
 #define sz_xXF86DRICloseFullScreenReply  32
